From 6346fc04aebaf1756f09c49c18b186d94d7794ed Mon Sep 17 00:00:00 2001 From: pokamest Date: Fri, 9 Feb 2024 13:02:24 -0800 Subject: [PATCH] Cleanup/3rd cleanup (#570) --- .gitmodules | 12 - client/3rd/CocoaAsyncSocket | 1 - client/3rd/CocoaLumberjack | 1 - .../PacketProcessor.xcodeproj/project.pbxproj | 1640 --- .../contents.xcworkspacedata | 7 - .../xcshareddata/IDEWorkspaceChecks.plist | 8 - .../UserInterfaceState.xcuserstate | Bin 50828 -> 0 bytes .../xcschemes/xcschememanagement.plist | 14 - .../CocoaAsyncSocket | Bin 776832 -> 0 bytes .../Headers/CocoaAsyncSocket.h | 18 - .../Headers/GCDAsyncSocket.h | 1226 -- .../Headers/GCDAsyncUdpSocket.h | 1036 -- .../CocoaAsyncSocket.framework/Info.plist | Bin 756 -> 0 bytes .../Modules/module.modulemap | 6 - .../_CodeSignature/CodeResources | 162 - .../PacketProcessor/Info.plist | 8 - .../PacketProcessor/PacketProcessor.h | 19 - .../PacketProcessor/TunnelInterface.h | 23 - .../PacketProcessor/TunnelInterface.m | 239 - .../PacketProcessor/tun2socks-iOS/base/BLog.h | 400 - .../PacketProcessor/tun2socks-iOS/base/BLog.m | 75 - .../tun2socks-iOS/base/BLog_syslog.c | 150 - .../tun2socks-iOS/base/BLog_syslog.h | 42 - .../tun2socks-iOS/base/BMutex.h | 101 - .../tun2socks-iOS/base/BPending.c | 205 - .../tun2socks-iOS/base/BPending.h | 250 - .../tun2socks-iOS/base/BPending_list.h | 4 - .../tun2socks-iOS/base/DebugObject.c | 39 - .../tun2socks-iOS/base/DebugObject.h | 147 - .../tun2socks-iOS/flow/BufferWriter.c | 112 - .../tun2socks-iOS/flow/BufferWriter.h | 107 - .../tun2socks-iOS/flow/PacketBuffer.c | 131 - .../tun2socks-iOS/flow/PacketBuffer.h | 77 - .../tun2socks-iOS/flow/PacketPassConnector.c | 125 - .../tun2socks-iOS/flow/PacketPassConnector.h | 102 - .../tun2socks-iOS/flow/PacketPassFairQueue.c | 405 - .../tun2socks-iOS/flow/PacketPassFairQueue.h | 204 - .../flow/PacketPassFairQueue_tree.h | 7 - .../tun2socks-iOS/flow/PacketPassInterface.c | 68 - .../tun2socks-iOS/flow/PacketPassInterface.h | 236 - .../tun2socks-iOS/flow/PacketProtoDecoder.c | 182 - .../tun2socks-iOS/flow/PacketProtoDecoder.h | 96 - .../tun2socks-iOS/flow/PacketProtoEncoder.c | 101 - .../tun2socks-iOS/flow/PacketProtoEncoder.h | 80 - .../tun2socks-iOS/flow/PacketProtoFlow.c | 82 - .../tun2socks-iOS/flow/PacketProtoFlow.h | 83 - .../tun2socks-iOS/flow/PacketRecvInterface.c | 56 - .../tun2socks-iOS/flow/PacketRecvInterface.h | 170 - .../tun2socks-iOS/flow/PacketStreamSender.c | 111 - .../tun2socks-iOS/flow/PacketStreamSender.h | 83 - .../tun2socks-iOS/flow/SinglePacketBuffer.c | 87 - .../tun2socks-iOS/flow/SinglePacketBuffer.h | 75 - .../tun2socks-iOS/flow/StreamPassInterface.c | 56 - .../tun2socks-iOS/flow/StreamPassInterface.h | 165 - .../tun2socks-iOS/flow/StreamRecvInterface.c | 56 - .../tun2socks-iOS/flow/StreamRecvInterface.h | 165 - .../flowextra/PacketPassInactivityMonitor.c | 131 - .../flowextra/PacketPassInactivityMonitor.h | 124 - .../generated/blog_channel_BArpProbe.h | 4 - .../generated/blog_channel_BConnection.h | 4 - .../generated/blog_channel_BDHCPClient.h | 4 - .../generated/blog_channel_BDHCPClientCore.h | 4 - .../generated/blog_channel_BDatagram.h | 4 - .../generated/blog_channel_BEncryption.h | 4 - .../generated/blog_channel_BInputProcess.h | 4 - .../generated/blog_channel_BLockReactor.h | 4 - .../generated/blog_channel_BNetwork.h | 4 - .../generated/blog_channel_BPredicate.h | 4 - .../generated/blog_channel_BProcess.h | 4 - .../generated/blog_channel_BReactor.h | 4 - .../generated/blog_channel_BSSLConnection.h | 4 - .../generated/blog_channel_BSignal.h | 4 - .../generated/blog_channel_BSocksClient.h | 4 - .../generated/blog_channel_BTap.h | 4 - .../generated/blog_channel_BThreadSignal.h | 4 - .../generated/blog_channel_BThreadWork.h | 4 - .../generated/blog_channel_BTime.h | 4 - .../generated/blog_channel_BUnixSignal.h | 4 - .../generated/blog_channel_DPReceive.h | 4 - .../generated/blog_channel_DPRelay.h | 4 - .../generated/blog_channel_DataProto.h | 4 - .../generated/blog_channel_DatagramPeerIO.h | 4 - .../blog_channel_FragmentProtoAssembler.h | 4 - .../generated/blog_channel_FrameDecider.h | 4 - .../generated/blog_channel_LineBuffer.h | 4 - .../generated/blog_channel_Listener.h | 4 - .../generated/blog_channel_NCDBuildProgram.h | 4 - .../generated/blog_channel_NCDConfigParser.h | 4 - .../blog_channel_NCDConfigTokenizer.h | 4 - .../generated/blog_channel_NCDIfConfig.h | 4 - .../blog_channel_NCDInterfaceMonitor.h | 4 - .../generated/blog_channel_NCDModuleIndex.h | 4 - .../generated/blog_channel_NCDModuleProcess.h | 4 - .../generated/blog_channel_NCDPlaceholderDb.h | 4 - .../generated/blog_channel_NCDRequest.h | 4 - .../generated/blog_channel_NCDRequestClient.h | 4 - .../generated/blog_channel_NCDRfkillMonitor.h | 4 - .../generated/blog_channel_NCDUdevCache.h | 4 - .../generated/blog_channel_NCDUdevManager.h | 4 - .../generated/blog_channel_NCDUdevMonitor.h | 4 - .../blog_channel_NCDUdevMonitorParser.h | 4 - .../generated/blog_channel_NCDVal.h | 4 - .../generated/blog_channel_NCDValGenerator.h | 4 - .../generated/blog_channel_NCDValParser.h | 4 - .../generated/blog_channel_PRStreamSink.h | 4 - .../generated/blog_channel_PRStreamSource.h | 4 - .../blog_channel_PacketProtoDecoder.h | 4 - .../generated/blog_channel_PasswordListener.h | 4 - .../generated/blog_channel_PeerChat.h | 4 - .../generated/blog_channel_SPProtoDecoder.h | 4 - .../generated/blog_channel_ServerConnection.h | 4 - .../generated/blog_channel_SocksUdpGwClient.h | 4 - .../generated/blog_channel_StreamPeerIO.h | 4 - .../generated/blog_channel_UdpGwClient.h | 4 - .../generated/blog_channel_addr.h | 4 - .../generated/blog_channel_client.h | 4 - .../generated/blog_channel_dostest_attacker.h | 4 - .../generated/blog_channel_dostest_server.h | 4 - .../generated/blog_channel_flooder.h | 4 - .../generated/blog_channel_lwip.h | 4 - .../generated/blog_channel_ncd.h | 4 - .../generated/blog_channel_ncd_alias.h | 4 - .../generated/blog_channel_ncd_arithmetic.h | 4 - .../generated/blog_channel_ncd_assert.h | 4 - .../generated/blog_channel_ncd_backtrack.h | 4 - .../blog_channel_ncd_basic_functions.h | 4 - .../generated/blog_channel_ncd_blocker.h | 4 - .../generated/blog_channel_ncd_buffer.h | 4 - .../generated/blog_channel_ncd_call2.h | 4 - .../generated/blog_channel_ncd_choose.h | 4 - .../generated/blog_channel_ncd_concat.h | 4 - .../generated/blog_channel_ncd_daemon.h | 4 - .../generated/blog_channel_ncd_depend.h | 4 - .../generated/blog_channel_ncd_depend_scope.h | 4 - .../blog_channel_ncd_dynamic_depend.h | 4 - .../generated/blog_channel_ncd_exit.h | 4 - .../generated/blog_channel_ncd_explode.h | 4 - .../generated/blog_channel_ncd_file.h | 4 - .../generated/blog_channel_ncd_file_open.h | 4 - .../generated/blog_channel_ncd_foreach.h | 4 - .../generated/blog_channel_ncd_from_string.h | 4 - .../generated/blog_channel_ncd_getargs.h | 4 - .../generated/blog_channel_ncd_getenv.h | 4 - .../generated/blog_channel_ncd_if.h | 4 - .../generated/blog_channel_ncd_imperative.h | 4 - .../generated/blog_channel_ncd_implode.h | 4 - .../generated/blog_channel_ncd_index.h | 4 - .../generated/blog_channel_ncd_list.h | 4 - .../generated/blog_channel_ncd_load_module.h | 4 - .../generated/blog_channel_ncd_log.h | 4 - .../generated/blog_channel_ncd_log_msg.h | 4 - .../generated/blog_channel_ncd_logical.h | 4 - .../generated/blog_channel_ncd_multidepend.h | 4 - .../blog_channel_ncd_net_backend_badvpn.h | 4 - .../blog_channel_ncd_net_backend_rfkill.h | 4 - .../blog_channel_ncd_net_backend_waitdevice.h | 4 - .../blog_channel_ncd_net_backend_waitlink.h | 4 - ...g_channel_ncd_net_backend_wpa_supplicant.h | 4 - .../generated/blog_channel_ncd_net_dns.h | 4 - .../generated/blog_channel_ncd_net_iptables.h | 4 - .../blog_channel_ncd_net_ipv4_addr.h | 4 - ...log_channel_ncd_net_ipv4_addr_in_network.h | 4 - .../blog_channel_ncd_net_ipv4_arp_probe.h | 4 - .../blog_channel_ncd_net_ipv4_dhcp.h | 4 - .../blog_channel_ncd_net_ipv4_route.h | 4 - .../blog_channel_ncd_net_ipv6_addr.h | 4 - ...log_channel_ncd_net_ipv6_addr_in_network.h | 4 - .../blog_channel_ncd_net_ipv6_route.h | 4 - ...g_channel_ncd_net_ipv6_wait_dynamic_addr.h | 4 - .../generated/blog_channel_ncd_net_up.h | 4 - .../blog_channel_ncd_net_watch_interfaces.h | 4 - .../generated/blog_channel_ncd_netmask.h | 4 - .../generated/blog_channel_ncd_objref.h | 4 - .../generated/blog_channel_ncd_ondemand.h | 4 - .../generated/blog_channel_ncd_parse.h | 4 - .../generated/blog_channel_ncd_print.h | 4 - .../blog_channel_ncd_process_manager.h | 4 - .../generated/blog_channel_ncd_reboot.h | 4 - .../generated/blog_channel_ncd_ref.h | 4 - .../generated/blog_channel_ncd_regex_match.h | 4 - .../generated/blog_channel_ncd_request.h | 4 - .../generated/blog_channel_ncd_run.h | 4 - .../generated/blog_channel_ncd_runonce.h | 4 - .../generated/blog_channel_ncd_sleep.h | 4 - .../generated/blog_channel_ncd_socket.h | 4 - .../generated/blog_channel_ncd_spawn.h | 4 - .../generated/blog_channel_ncd_strcmp.h | 4 - .../generated/blog_channel_ncd_substr.h | 4 - .../generated/blog_channel_ncd_sys_evdev.h | 4 - .../blog_channel_ncd_sys_request_client.h | 4 - .../blog_channel_ncd_sys_request_server.h | 4 - .../blog_channel_ncd_sys_start_process.h | 4 - .../blog_channel_ncd_sys_watch_directory.h | 4 - .../blog_channel_ncd_sys_watch_input.h | 4 - .../blog_channel_ncd_sys_watch_usb.h | 4 - .../generated/blog_channel_ncd_timer.h | 4 - .../generated/blog_channel_ncd_to_string.h | 4 - .../generated/blog_channel_ncd_try.h | 4 - .../generated/blog_channel_ncd_value.h | 4 - .../generated/blog_channel_ncd_valuemetic.h | 4 - .../generated/blog_channel_ncd_var.h | 4 - .../generated/blog_channel_nsskey.h | 4 - .../generated/blog_channel_server.h | 4 - .../generated/blog_channel_tun2socks.h | 4 - .../generated/blog_channel_udpgw.h | 4 - .../generated/blog_channels_defines.h | 148 - .../generated/blog_channels_list.h | 147 - .../tun2socks-iOS/generated/bproto_addr.h | 675 - .../generated/bproto_bproto_test.h | 1029 -- .../tun2socks-iOS/generated/bproto_msgproto.h | 2122 ---- .../tun2socks-iOS/lwip/custom/arch/cc.h | 92 - .../tun2socks-iOS/lwip/custom/arch/perf.h | 36 - .../tun2socks-iOS/lwip/custom/lwipopts.h | 98 - .../tun2socks-iOS/lwip/custom/sys.c | 37 - .../tun2socks-iOS/lwip/src/core/def.c | 108 - .../tun2socks-iOS/lwip/src/core/inet_chksum.c | 545 - .../tun2socks-iOS/lwip/src/core/init.c | 345 - .../tun2socks-iOS/lwip/src/core/ipv4/icmp.c | 338 - .../tun2socks-iOS/lwip/src/core/ipv4/ip4.c | 924 -- .../lwip/src/core/ipv4/ip4_addr.c | 312 - .../lwip/src/core/ipv4/ip_frag.c | 863 -- .../tun2socks-iOS/lwip/src/core/ipv6/icmp6.c | 337 - .../tun2socks-iOS/lwip/src/core/ipv6/ip6.c | 1034 -- .../lwip/src/core/ipv6/ip6_addr.c | 251 - .../lwip/src/core/ipv6/ip6_frag.c | 697 - .../tun2socks-iOS/lwip/src/core/ipv6/nd6.c | 1790 --- .../tun2socks-iOS/lwip/src/core/mem.c | 659 - .../tun2socks-iOS/lwip/src/core/memp.c | 485 - .../tun2socks-iOS/lwip/src/core/netif.c | 913 -- .../tun2socks-iOS/lwip/src/core/pbuf.c | 1179 -- .../tun2socks-iOS/lwip/src/core/stats.c | 181 - .../tun2socks-iOS/lwip/src/core/tcp.c | 1852 --- .../tun2socks-iOS/lwip/src/core/tcp_in.c | 1666 --- .../tun2socks-iOS/lwip/src/core/tcp_out.c | 1499 --- .../tun2socks-iOS/lwip/src/core/timers.c | 545 - .../tun2socks-iOS/lwip/src/core/udp.c | 1151 -- .../lwip/src/include/ipv4/lwip/autoip.h | 118 - .../lwip/src/include/ipv4/lwip/icmp.h | 125 - .../lwip/src/include/ipv4/lwip/igmp.h | 106 - .../lwip/src/include/ipv4/lwip/inet.h | 107 - .../lwip/src/include/ipv4/lwip/ip4.h | 146 - .../lwip/src/include/ipv4/lwip/ip4_addr.h | 244 - .../lwip/src/include/ipv4/lwip/ip_frag.h | 91 - .../lwip/src/include/ipv6/lwip/dhcp6.h | 58 - .../lwip/src/include/ipv6/lwip/ethip6.h | 68 - .../lwip/src/include/ipv6/lwip/icmp6.h | 152 - .../lwip/src/include/ipv6/lwip/inet6.h | 92 - .../lwip/src/include/ipv6/lwip/ip6.h | 197 - .../lwip/src/include/ipv6/lwip/ip6_addr.h | 286 - .../lwip/src/include/ipv6/lwip/ip6_frag.h | 102 - .../lwip/src/include/ipv6/lwip/mld6.h | 118 - .../lwip/src/include/ipv6/lwip/nd6.h | 369 - .../tun2socks-iOS/lwip/src/include/lwip/api.h | 338 - .../lwip/src/include/lwip/api_msg.h | 177 - .../lwip/src/include/lwip/arch.h | 209 - .../lwip/src/include/lwip/debug.h | 99 - .../tun2socks-iOS/lwip/src/include/lwip/def.h | 123 - .../lwip/src/include/lwip/dhcp.h | 242 - .../tun2socks-iOS/lwip/src/include/lwip/dns.h | 124 - .../tun2socks-iOS/lwip/src/include/lwip/err.h | 85 - .../lwip/src/include/lwip/inet_chksum.h | 112 - .../lwip/src/include/lwip/init.h | 72 - .../tun2socks-iOS/lwip/src/include/lwip/ip.h | 254 - .../lwip/src/include/lwip/ip_addr.h | 130 - .../tun2socks-iOS/lwip/src/include/lwip/mem.h | 123 - .../lwip/src/include/lwip/memp.h | 116 - .../lwip/src/include/lwip/memp_std.h | 135 - .../lwip/src/include/lwip/netbuf.h | 112 - .../lwip/src/include/lwip/netdb.h | 124 - .../lwip/src/include/lwip/netif.h | 393 - .../lwip/src/include/lwip/netifapi.h | 108 - .../tun2socks-iOS/lwip/src/include/lwip/opt.h | 2417 ---- .../lwip/src/include/lwip/pbuf.h | 185 - .../tun2socks-iOS/lwip/src/include/lwip/raw.h | 131 - .../tun2socks-iOS/lwip/src/include/lwip/sio.h | 141 - .../lwip/src/include/lwip/snmp.h | 367 - .../lwip/src/include/lwip/snmp_asn1.h | 101 - .../lwip/src/include/lwip/snmp_msg.h | 315 - .../lwip/src/include/lwip/snmp_structs.h | 268 - .../lwip/src/include/lwip/sockets.h | 411 - .../lwip/src/include/lwip/stats.h | 347 - .../tun2socks-iOS/lwip/src/include/lwip/sys.h | 336 - .../tun2socks-iOS/lwip/src/include/lwip/tcp.h | 400 - .../lwip/src/include/lwip/tcp_impl.h | 508 - .../lwip/src/include/lwip/tcpip.h | 179 - .../lwip/src/include/lwip/timers.h | 100 - .../tun2socks-iOS/lwip/src/include/lwip/udp.h | 215 - .../lwip/src/include/netif/etharp.h | 223 - .../lwip/src/include/netif/ppp_oe.h | 190 - .../lwip/src/include/netif/slipif.h | 81 - .../lwip/src/include/posix/netdb.h | 33 - .../lwip/src/include/posix/sys/socket.h | 33 - .../tun2socks-iOS/misc/BRefTarget.h | 114 - .../tun2socks-iOS/misc/Utf16Decoder.h | 113 - .../tun2socks-iOS/misc/Utf16Encoder.h | 67 - .../tun2socks-iOS/misc/Utf8Decoder.h | 143 - .../tun2socks-iOS/misc/Utf8Encoder.h | 81 - .../tun2socks-iOS/misc/arp_proto.h | 60 - .../tun2socks-iOS/misc/array_length.h | 35 - .../tun2socks-iOS/misc/ascii_utils.h | 43 - .../tun2socks-iOS/misc/balign.h | 76 - .../tun2socks-iOS/misc/balloc.h | 248 - .../tun2socks-iOS/misc/blimits.h | 60 - .../tun2socks-iOS/misc/bsize.h | 117 - .../tun2socks-iOS/misc/bsort.h | 69 - .../tun2socks-iOS/misc/bstring.h | 140 - .../tun2socks-iOS/misc/byteorder.h | 196 - .../tun2socks-iOS/misc/cmdline.h | 168 - .../tun2socks-iOS/misc/compare.h | 37 - .../tun2socks-iOS/misc/concat_strings.h | 85 - .../PacketProcessor/tun2socks-iOS/misc/dead.h | 134 - .../tun2socks-iOS/misc/debug.h | 141 - .../tun2socks-iOS/misc/debugcounter.h | 118 - .../tun2socks-iOS/misc/debugerror.h | 90 - .../tun2socks-iOS/misc/dhcp_proto.h | 131 - .../tun2socks-iOS/misc/ethernet_proto.h | 52 - .../tun2socks-iOS/misc/exparray.h | 101 - .../tun2socks-iOS/misc/expstring.h | 174 - .../tun2socks-iOS/misc/find_char.h | 58 - .../tun2socks-iOS/misc/find_program.h | 103 - .../tun2socks-iOS/misc/get_iface_info.h | 110 - .../tun2socks-iOS/misc/grow_array.h | 139 - .../tun2socks-iOS/misc/hashfun.h | 60 - .../tun2socks-iOS/misc/igmp_proto.h | 97 - .../tun2socks-iOS/misc/ipaddr.h | 201 - .../tun2socks-iOS/misc/ipaddr6.h | 383 - .../tun2socks-iOS/misc/ipv4_proto.h | 145 - .../tun2socks-iOS/misc/ipv6_proto.h | 86 - .../tun2socks-iOS/misc/loggers_string.h | 43 - .../tun2socks-iOS/misc/loglevel.h | 80 - .../tun2socks-iOS/misc/maxalign.h | 53 - .../tun2socks-iOS/misc/memref.h | 175 - .../tun2socks-iOS/misc/merge.h | 36 - .../tun2socks-iOS/misc/minmax.h | 56 - .../tun2socks-iOS/misc/modadd.h | 59 - .../tun2socks-iOS/misc/mswsock.h | 229 - .../tun2socks-iOS/misc/nonblocking.h | 51 - .../tun2socks-iOS/misc/nsskey.h | 118 - .../tun2socks-iOS/misc/offset.h | 51 - .../misc/open_standard_streams.h | 54 - .../tun2socks-iOS/misc/overflow.h | 66 - .../tun2socks-iOS/misc/packed.h | 51 - .../tun2socks-iOS/misc/parse_number.h | 234 - .../tun2socks-iOS/misc/print_macros.h | 98 - .../tun2socks-iOS/misc/read_file.h | 98 - .../tun2socks-iOS/misc/read_write_int.h | 181 - .../tun2socks-iOS/misc/socks_proto.h | 118 - .../tun2socks-iOS/misc/sslsocket.h | 48 - .../tun2socks-iOS/misc/stdbuf_cmdline.h | 92 - .../tun2socks-iOS/misc/strdup.h | 86 - .../tun2socks-iOS/misc/string_begins_with.h | 96 - .../tun2socks-iOS/misc/substring.h | 82 - .../tun2socks-iOS/misc/udp_proto.h | 170 - .../tun2socks-iOS/misc/unicode_funcs.h | 232 - .../tun2socks-iOS/misc/version.h | 41 - .../tun2socks-iOS/misc/write_file.h | 70 - .../tun2socks-iOS/protocol/addr.bproto | 11 - .../tun2socks-iOS/protocol/addr.h | 207 - .../tun2socks-iOS/protocol/dataproto.h | 91 - .../tun2socks-iOS/protocol/fragmentproto.h | 100 - .../tun2socks-iOS/protocol/msgproto.bproto | 43 - .../tun2socks-iOS/protocol/msgproto.h | 76 - .../tun2socks-iOS/protocol/packetproto.h | 68 - .../tun2socks-iOS/protocol/requestproto.h | 50 - .../tun2socks-iOS/protocol/scproto.h | 266 - .../tun2socks-iOS/protocol/spproto.h | 195 - .../tun2socks-iOS/protocol/udpgw_proto.h | 98 - .../tun2socks-iOS/socksclient/BSocksClient.c | 626 - .../tun2socks-iOS/socksclient/BSocksClient.h | 147 - .../tun2socks-iOS/structure/BAVL.h | 797 -- .../tun2socks-iOS/structure/CAvl.h | 36 - .../tun2socks-iOS/structure/CAvl_decl.h | 77 - .../tun2socks-iOS/structure/CAvl_footer.h | 113 - .../tun2socks-iOS/structure/CAvl_header.h | 141 - .../tun2socks-iOS/structure/CAvl_impl.h | 949 -- .../tun2socks-iOS/structure/CHash.h | 39 - .../tun2socks-iOS/structure/CHash_decl.h | 59 - .../tun2socks-iOS/structure/CHash_footer.h | 74 - .../tun2socks-iOS/structure/CHash_header.h | 78 - .../tun2socks-iOS/structure/CHash_impl.h | 312 - .../tun2socks-iOS/structure/ChunkBuffer2.h | 317 - .../tun2socks-iOS/structure/IndexedList.h | 225 - .../structure/IndexedList_tree.h | 15 - .../tun2socks-iOS/structure/LinkedList0.h | 202 - .../tun2socks-iOS/structure/LinkedList1.h | 275 - .../tun2socks-iOS/structure/LinkedList3.h | 362 - .../tun2socks-iOS/structure/SAvl.h | 40 - .../tun2socks-iOS/structure/SAvl_decl.h | 73 - .../tun2socks-iOS/structure/SAvl_footer.h | 89 - .../tun2socks-iOS/structure/SAvl_header.h | 93 - .../tun2socks-iOS/structure/SAvl_impl.h | 164 - .../tun2socks-iOS/structure/SAvl_tree.h | 18 - .../tun2socks-iOS/structure/SLinkedList.h | 38 - .../structure/SLinkedList_decl.h | 67 - .../structure/SLinkedList_footer.h | 57 - .../structure/SLinkedList_header.h | 62 - .../structure/SLinkedList_impl.h | 182 - .../tun2socks-iOS/structure/Vector.h | 36 - .../tun2socks-iOS/structure/Vector_decl.h | 46 - .../tun2socks-iOS/structure/Vector_footer.h | 41 - .../tun2socks-iOS/structure/Vector_header.h | 42 - .../tun2socks-iOS/structure/Vector_impl.h | 117 - .../tun2socks-iOS/system/BAddr.h | 808 -- .../tun2socks-iOS/system/BConnection.h | 424 - .../tun2socks-iOS/system/BConnection_common.c | 58 - .../tun2socks-iOS/system/BConnection_unix.c | 968 -- .../tun2socks-iOS/system/BConnection_unix.h | 87 - .../tun2socks-iOS/system/BDatagram.h | 209 - .../tun2socks-iOS/system/BDatagram_unix.c | 881 -- .../tun2socks-iOS/system/BDatagram_unix.h | 71 - .../tun2socks-iOS/system/BNetwork.c | 99 - .../tun2socks-iOS/system/BNetwork.h | 36 - .../tun2socks-iOS/system/BReactor.h | 11 - .../tun2socks-iOS/system/BReactor_badvpn.c | 1430 --- .../tun2socks-iOS/system/BReactor_badvpn.h | 572 - .../system/BReactor_badvpn_timerstree.h | 13 - .../tun2socks-iOS/system/BSignal.c | 188 - .../tun2socks-iOS/system/BSignal.h | 64 - .../tun2socks-iOS/system/BTime.c | 55 - .../tun2socks-iOS/system/BTime.h | 168 - .../tun2socks-iOS/system/BUnixSignal.c | 406 - .../tun2socks-iOS/system/BUnixSignal.h | 132 - .../tun2socks/SocksUdpGwClient.c | 606 - .../tun2socks/SocksUdpGwClient.h | 105 - .../tun2socks-iOS/tun2socks/tun2socks.c | 1955 --- .../tun2socks-iOS/tun2socks/tun2socks.h | 50 - .../tun2socks-iOS/tuntap/BTap.h | 196 - .../tun2socks-iOS/tuntap/BTap.m | 511 - .../tun2socks-iOS/udpgw/udpgw.c | 1473 --- .../tun2socks-iOS/udpgw/udpgw.h | 54 - .../tun2socks-iOS/udpgw_client/UdpGwClient.c | 597 - .../tun2socks-iOS/udpgw_client/UdpGwClient.h | 118 - client/3rd/ShadowPath | 1 - .../ShadowSocks.xcodeproj/project.pbxproj | 1796 --- .../contents.xcworkspacedata | 7 - .../xcshareddata/IDEWorkspaceChecks.plist | 8 - .../xcshareddata/WorkspaceSettings.xcsettings | 8 - .../UserInterfaceState.xcuserstate | Bin 207529 -> 0 bytes .../WorkspaceSettings.xcsettings | 18 - .../xcschemes/ShadowSocks.xcscheme | 67 - .../xcschemes/xcschememanagement.plist | 22 - client/3rd/ShadowSocks/ShadowSocks/Info.plist | 26 - .../3rd/ShadowSocks/ShadowSocks/ShadowSocks.h | 11 - .../ShadowSocks/libcares/include/ares.h | 755 -- .../ShadowSocks/libcares/include/ares_build.h | 104 - .../ShadowSocks/libcares/include/ares_dns.h | 112 - .../ShadowSocks/libcares/include/ares_rules.h | 125 - .../libcares/include/ares_version.h | 24 - .../ShadowSocks/libcares/lib/arm64/libcares.a | Bin 124704 -> 0 bytes .../ShadowSocks/libcares/lib/armv7/libcares.a | Bin 94384 -> 0 bytes .../libcares/lib/armv7s/libcares.a | Bin 94456 -> 0 bytes .../ShadowSocks/libev/arm64/include/ev++.h | 818 -- .../ShadowSocks/libev/arm64/include/ev.h | 860 -- .../ShadowSocks/libev/arm64/include/event.h | 177 - .../ShadowSocks/libev/arm64/lib/libev.a | Bin 52648 -> 0 bytes .../ShadowSocks/libev/arm64/lib/libev.la | 41 - .../libev/arm64/share/man/man3/ev.3 | 5819 --------- .../ShadowSocks/libev/armv7/include/ev++.h | 818 -- .../ShadowSocks/libev/armv7/include/ev.h | 860 -- .../ShadowSocks/libev/armv7/include/event.h | 177 - .../ShadowSocks/libev/armv7/lib/libev.a | Bin 37192 -> 0 bytes .../ShadowSocks/libev/armv7/lib/libev.la | 41 - .../libev/armv7/share/man/man3/ev.3 | 5819 --------- .../ShadowSocks/libev/armv7s/include/ev++.h | 818 -- .../ShadowSocks/libev/armv7s/include/ev.h | 860 -- .../ShadowSocks/libev/armv7s/include/event.h | 177 - .../ShadowSocks/libev/armv7s/lib/libev.a | Bin 37280 -> 0 bytes .../ShadowSocks/libev/armv7s/lib/libev.la | 41 - .../libev/armv7s/share/man/man3/ev.3 | 5819 --------- .../libsodium/include/module.modulemap | 4 - .../ShadowSocks/libsodium/include/sodium.h | 73 - .../libsodium/include/sodium/core.h | 28 - .../include/sodium/crypto_aead_aegis128l.h | 96 - .../include/sodium/crypto_aead_aegis256.h | 96 - .../include/sodium/crypto_aead_aes256gcm.h | 179 - .../sodium/crypto_aead_chacha20poly1305.h | 180 - .../sodium/crypto_aead_xchacha20poly1305.h | 100 - .../libsodium/include/sodium/crypto_auth.h | 46 - .../include/sodium/crypto_auth_hmacsha256.h | 70 - .../include/sodium/crypto_auth_hmacsha512.h | 68 - .../sodium/crypto_auth_hmacsha512256.h | 65 - .../libsodium/include/sodium/crypto_box.h | 177 - .../crypto_box_curve25519xchacha20poly1305.h | 164 - .../crypto_box_curve25519xsalsa20poly1305.h | 113 - .../include/sodium/crypto_core_ed25519.h | 115 - .../include/sodium/crypto_core_hchacha20.h | 36 - .../include/sodium/crypto_core_hsalsa20.h | 36 - .../include/sodium/crypto_core_ristretto255.h | 121 - .../include/sodium/crypto_core_salsa20.h | 36 - .../include/sodium/crypto_core_salsa2012.h | 36 - .../include/sodium/crypto_core_salsa208.h | 40 - .../include/sodium/crypto_generichash.h | 84 - .../sodium/crypto_generichash_blake2b.h | 122 - .../libsodium/include/sodium/crypto_hash.h | 40 - .../include/sodium/crypto_hash_sha256.h | 60 - .../include/sodium/crypto_hash_sha512.h | 60 - .../libsodium/include/sodium/crypto_kdf.h | 53 - .../include/sodium/crypto_kdf_blake2b.h | 44 - .../include/sodium/crypto_kdf_hkdf_sha256.h | 48 - .../include/sodium/crypto_kdf_hkdf_sha512.h | 51 - .../libsodium/include/sodium/crypto_kx.h | 66 - .../include/sodium/crypto_onetimeauth.h | 65 - .../sodium/crypto_onetimeauth_poly1305.h | 72 - .../libsodium/include/sodium/crypto_pwhash.h | 147 - .../include/sodium/crypto_pwhash_argon2i.h | 122 - .../include/sodium/crypto_pwhash_argon2id.h | 122 - .../crypto_pwhash_scryptsalsa208sha256.h | 120 - .../include/sodium/crypto_scalarmult.h | 46 - .../sodium/crypto_scalarmult_curve25519.h | 42 - .../sodium/crypto_scalarmult_ed25519.h | 51 - .../sodium/crypto_scalarmult_ristretto255.h | 43 - .../include/sodium/crypto_secretbox.h | 94 - .../crypto_secretbox_xchacha20poly1305.h | 70 - .../crypto_secretbox_xsalsa20poly1305.h | 71 - .../crypto_secretstream_xchacha20poly1305.h | 108 - .../include/sodium/crypto_shorthash.h | 41 - .../sodium/crypto_shorthash_siphash24.h | 50 - .../libsodium/include/sodium/crypto_sign.h | 107 - .../include/sodium/crypto_sign_ed25519.h | 124 - .../libsodium/include/sodium/crypto_stream.h | 59 - .../include/sodium/crypto_stream_chacha20.h | 106 - .../include/sodium/crypto_stream_salsa20.h | 61 - .../include/sodium/crypto_stream_salsa2012.h | 53 - .../include/sodium/crypto_stream_salsa208.h | 56 - .../include/sodium/crypto_stream_xchacha20.h | 61 - .../include/sodium/crypto_stream_xsalsa20.h | 61 - .../include/sodium/crypto_verify_16.h | 23 - .../include/sodium/crypto_verify_32.h | 23 - .../include/sodium/crypto_verify_64.h | 23 - .../libsodium/include/sodium/export.h | 57 - .../libsodium/include/sodium/randombytes.h | 72 - .../sodium/randombytes_internal_random.h | 22 - .../include/sodium/randombytes_sysrandom.h | 19 - .../libsodium/include/sodium/runtime.h | 55 - .../libsodium/include/sodium/utils.h | 179 - .../libsodium/include/sodium/version.h | 33 - .../libsodium/ios/include/module.modulemap | 4 - .../libsodium/ios/include/sodium.h | 73 - .../libsodium/ios/include/sodium/core.h | 28 - .../include/sodium/crypto_aead_aegis128l.h | 96 - .../ios/include/sodium/crypto_aead_aegis256.h | 96 - .../include/sodium/crypto_aead_aes256gcm.h | 179 - .../sodium/crypto_aead_chacha20poly1305.h | 180 - .../sodium/crypto_aead_xchacha20poly1305.h | 100 - .../ios/include/sodium/crypto_auth.h | 46 - .../include/sodium/crypto_auth_hmacsha256.h | 70 - .../include/sodium/crypto_auth_hmacsha512.h | 68 - .../sodium/crypto_auth_hmacsha512256.h | 65 - .../libsodium/ios/include/sodium/crypto_box.h | 177 - .../crypto_box_curve25519xchacha20poly1305.h | 164 - .../crypto_box_curve25519xsalsa20poly1305.h | 113 - .../ios/include/sodium/crypto_core_ed25519.h | 115 - .../include/sodium/crypto_core_hchacha20.h | 36 - .../ios/include/sodium/crypto_core_hsalsa20.h | 36 - .../include/sodium/crypto_core_ristretto255.h | 121 - .../ios/include/sodium/crypto_core_salsa20.h | 36 - .../include/sodium/crypto_core_salsa2012.h | 36 - .../ios/include/sodium/crypto_core_salsa208.h | 40 - .../ios/include/sodium/crypto_generichash.h | 84 - .../sodium/crypto_generichash_blake2b.h | 122 - .../ios/include/sodium/crypto_hash.h | 40 - .../ios/include/sodium/crypto_hash_sha256.h | 60 - .../ios/include/sodium/crypto_hash_sha512.h | 60 - .../libsodium/ios/include/sodium/crypto_kdf.h | 53 - .../ios/include/sodium/crypto_kdf_blake2b.h | 44 - .../include/sodium/crypto_kdf_hkdf_sha256.h | 48 - .../include/sodium/crypto_kdf_hkdf_sha512.h | 51 - .../libsodium/ios/include/sodium/crypto_kx.h | 66 - .../ios/include/sodium/crypto_onetimeauth.h | 65 - .../sodium/crypto_onetimeauth_poly1305.h | 72 - .../ios/include/sodium/crypto_pwhash.h | 147 - .../include/sodium/crypto_pwhash_argon2i.h | 122 - .../include/sodium/crypto_pwhash_argon2id.h | 122 - .../crypto_pwhash_scryptsalsa208sha256.h | 120 - .../ios/include/sodium/crypto_scalarmult.h | 46 - .../sodium/crypto_scalarmult_curve25519.h | 42 - .../sodium/crypto_scalarmult_ed25519.h | 51 - .../sodium/crypto_scalarmult_ristretto255.h | 43 - .../ios/include/sodium/crypto_secretbox.h | 94 - .../crypto_secretbox_xchacha20poly1305.h | 70 - .../crypto_secretbox_xsalsa20poly1305.h | 71 - .../crypto_secretstream_xchacha20poly1305.h | 108 - .../ios/include/sodium/crypto_shorthash.h | 41 - .../sodium/crypto_shorthash_siphash24.h | 50 - .../ios/include/sodium/crypto_sign.h | 107 - .../ios/include/sodium/crypto_sign_ed25519.h | 124 - .../ios/include/sodium/crypto_stream.h | 59 - .../include/sodium/crypto_stream_chacha20.h | 106 - .../include/sodium/crypto_stream_salsa20.h | 61 - .../include/sodium/crypto_stream_salsa2012.h | 53 - .../include/sodium/crypto_stream_salsa208.h | 56 - .../include/sodium/crypto_stream_xchacha20.h | 61 - .../include/sodium/crypto_stream_xsalsa20.h | 61 - .../ios/include/sodium/crypto_verify_16.h | 23 - .../ios/include/sodium/crypto_verify_32.h | 23 - .../ios/include/sodium/crypto_verify_64.h | 23 - .../libsodium/ios/include/sodium/export.h | 57 - .../ios/include/sodium/randombytes.h | 72 - .../sodium/randombytes_internal_random.h | 22 - .../include/sodium/randombytes_sysrandom.h | 19 - .../libsodium/ios/include/sodium/runtime.h | 55 - .../libsodium/ios/include/sodium/utils.h | 179 - .../libsodium/ios/include/sodium/version.h | 33 - .../libsodium/ios/lib/libsodium.27.dylib | Bin 437400 -> 0 bytes .../ShadowSocks/libsodium/ios/lib/libsodium.a | Bin 1359128 -> 0 bytes .../libsodium/ios/lib/libsodium.dylib | 1 - .../libsodium/ios/lib/libsodium.la | 41 - .../libsodium/ios/lib/pkgconfig/libsodium.pc | 12 - .../libsodium/ios64/include/module.modulemap | 4 - .../libsodium/ios64/include/sodium.h | 73 - .../libsodium/ios64/include/sodium/core.h | 28 - .../include/sodium/crypto_aead_aegis128l.h | 96 - .../include/sodium/crypto_aead_aegis256.h | 96 - .../include/sodium/crypto_aead_aes256gcm.h | 179 - .../sodium/crypto_aead_chacha20poly1305.h | 180 - .../sodium/crypto_aead_xchacha20poly1305.h | 100 - .../ios64/include/sodium/crypto_auth.h | 46 - .../include/sodium/crypto_auth_hmacsha256.h | 70 - .../include/sodium/crypto_auth_hmacsha512.h | 68 - .../sodium/crypto_auth_hmacsha512256.h | 65 - .../ios64/include/sodium/crypto_box.h | 177 - .../crypto_box_curve25519xchacha20poly1305.h | 164 - .../crypto_box_curve25519xsalsa20poly1305.h | 113 - .../include/sodium/crypto_core_ed25519.h | 115 - .../include/sodium/crypto_core_hchacha20.h | 36 - .../include/sodium/crypto_core_hsalsa20.h | 36 - .../include/sodium/crypto_core_ristretto255.h | 121 - .../include/sodium/crypto_core_salsa20.h | 36 - .../include/sodium/crypto_core_salsa2012.h | 36 - .../include/sodium/crypto_core_salsa208.h | 40 - .../ios64/include/sodium/crypto_generichash.h | 84 - .../sodium/crypto_generichash_blake2b.h | 122 - .../ios64/include/sodium/crypto_hash.h | 40 - .../ios64/include/sodium/crypto_hash_sha256.h | 60 - .../ios64/include/sodium/crypto_hash_sha512.h | 60 - .../ios64/include/sodium/crypto_kdf.h | 53 - .../ios64/include/sodium/crypto_kdf_blake2b.h | 44 - .../include/sodium/crypto_kdf_hkdf_sha256.h | 48 - .../include/sodium/crypto_kdf_hkdf_sha512.h | 51 - .../ios64/include/sodium/crypto_kx.h | 66 - .../ios64/include/sodium/crypto_onetimeauth.h | 65 - .../sodium/crypto_onetimeauth_poly1305.h | 72 - .../ios64/include/sodium/crypto_pwhash.h | 147 - .../include/sodium/crypto_pwhash_argon2i.h | 122 - .../include/sodium/crypto_pwhash_argon2id.h | 122 - .../crypto_pwhash_scryptsalsa208sha256.h | 120 - .../ios64/include/sodium/crypto_scalarmult.h | 46 - .../sodium/crypto_scalarmult_curve25519.h | 42 - .../sodium/crypto_scalarmult_ed25519.h | 51 - .../sodium/crypto_scalarmult_ristretto255.h | 43 - .../ios64/include/sodium/crypto_secretbox.h | 94 - .../crypto_secretbox_xchacha20poly1305.h | 70 - .../crypto_secretbox_xsalsa20poly1305.h | 71 - .../crypto_secretstream_xchacha20poly1305.h | 108 - .../ios64/include/sodium/crypto_shorthash.h | 41 - .../sodium/crypto_shorthash_siphash24.h | 50 - .../ios64/include/sodium/crypto_sign.h | 107 - .../include/sodium/crypto_sign_ed25519.h | 124 - .../ios64/include/sodium/crypto_stream.h | 59 - .../include/sodium/crypto_stream_chacha20.h | 106 - .../include/sodium/crypto_stream_salsa20.h | 61 - .../include/sodium/crypto_stream_salsa2012.h | 53 - .../include/sodium/crypto_stream_salsa208.h | 56 - .../include/sodium/crypto_stream_xchacha20.h | 61 - .../include/sodium/crypto_stream_xsalsa20.h | 61 - .../ios64/include/sodium/crypto_verify_16.h | 23 - .../ios64/include/sodium/crypto_verify_32.h | 23 - .../ios64/include/sodium/crypto_verify_64.h | 23 - .../libsodium/ios64/include/sodium/export.h | 57 - .../ios64/include/sodium/randombytes.h | 72 - .../sodium/randombytes_internal_random.h | 22 - .../include/sodium/randombytes_sysrandom.h | 19 - .../libsodium/ios64/include/sodium/runtime.h | 55 - .../libsodium/ios64/include/sodium/utils.h | 179 - .../libsodium/ios64/include/sodium/version.h | 33 - .../libsodium/ios64/lib/libsodium.27.dylib | Bin 437400 -> 0 bytes .../libsodium/ios64/lib/libsodium.a | Bin 1359128 -> 0 bytes .../libsodium/ios64/lib/libsodium.dylib | 1 - .../libsodium/ios64/lib/libsodium.la | 41 - .../ios64/lib/pkgconfig/libsodium.pc | 12 - .../lib/Clibsodium.xcframework/Info.plist | 27 - .../ios-arm64/Headers/module.modulemap | 4 - .../ios-arm64/Headers/sodium.h | 73 - .../ios-arm64/Headers/sodium/core.h | 28 - .../Headers/sodium/crypto_aead_aegis128l.h | 96 - .../Headers/sodium/crypto_aead_aegis256.h | 96 - .../Headers/sodium/crypto_aead_aes256gcm.h | 179 - .../sodium/crypto_aead_chacha20poly1305.h | 180 - .../sodium/crypto_aead_xchacha20poly1305.h | 100 - .../ios-arm64/Headers/sodium/crypto_auth.h | 46 - .../Headers/sodium/crypto_auth_hmacsha256.h | 70 - .../Headers/sodium/crypto_auth_hmacsha512.h | 68 - .../sodium/crypto_auth_hmacsha512256.h | 65 - .../ios-arm64/Headers/sodium/crypto_box.h | 177 - .../crypto_box_curve25519xchacha20poly1305.h | 164 - .../crypto_box_curve25519xsalsa20poly1305.h | 113 - .../Headers/sodium/crypto_core_ed25519.h | 115 - .../Headers/sodium/crypto_core_hchacha20.h | 36 - .../Headers/sodium/crypto_core_hsalsa20.h | 36 - .../Headers/sodium/crypto_core_ristretto255.h | 121 - .../Headers/sodium/crypto_core_salsa20.h | 36 - .../Headers/sodium/crypto_core_salsa2012.h | 36 - .../Headers/sodium/crypto_core_salsa208.h | 40 - .../Headers/sodium/crypto_generichash.h | 84 - .../sodium/crypto_generichash_blake2b.h | 122 - .../ios-arm64/Headers/sodium/crypto_hash.h | 40 - .../Headers/sodium/crypto_hash_sha256.h | 60 - .../Headers/sodium/crypto_hash_sha512.h | 60 - .../ios-arm64/Headers/sodium/crypto_kdf.h | 53 - .../Headers/sodium/crypto_kdf_blake2b.h | 44 - .../Headers/sodium/crypto_kdf_hkdf_sha256.h | 48 - .../Headers/sodium/crypto_kdf_hkdf_sha512.h | 51 - .../ios-arm64/Headers/sodium/crypto_kx.h | 66 - .../Headers/sodium/crypto_onetimeauth.h | 65 - .../sodium/crypto_onetimeauth_poly1305.h | 72 - .../ios-arm64/Headers/sodium/crypto_pwhash.h | 147 - .../Headers/sodium/crypto_pwhash_argon2i.h | 122 - .../Headers/sodium/crypto_pwhash_argon2id.h | 122 - .../crypto_pwhash_scryptsalsa208sha256.h | 120 - .../Headers/sodium/crypto_scalarmult.h | 46 - .../sodium/crypto_scalarmult_curve25519.h | 42 - .../sodium/crypto_scalarmult_ed25519.h | 51 - .../sodium/crypto_scalarmult_ristretto255.h | 43 - .../Headers/sodium/crypto_secretbox.h | 94 - .../crypto_secretbox_xchacha20poly1305.h | 70 - .../crypto_secretbox_xsalsa20poly1305.h | 71 - .../crypto_secretstream_xchacha20poly1305.h | 108 - .../Headers/sodium/crypto_shorthash.h | 41 - .../sodium/crypto_shorthash_siphash24.h | 50 - .../ios-arm64/Headers/sodium/crypto_sign.h | 107 - .../Headers/sodium/crypto_sign_ed25519.h | 124 - .../ios-arm64/Headers/sodium/crypto_stream.h | 59 - .../Headers/sodium/crypto_stream_chacha20.h | 106 - .../Headers/sodium/crypto_stream_salsa20.h | 61 - .../Headers/sodium/crypto_stream_salsa2012.h | 53 - .../Headers/sodium/crypto_stream_salsa208.h | 56 - .../Headers/sodium/crypto_stream_xchacha20.h | 61 - .../Headers/sodium/crypto_stream_xsalsa20.h | 61 - .../Headers/sodium/crypto_verify_16.h | 23 - .../Headers/sodium/crypto_verify_32.h | 23 - .../Headers/sodium/crypto_verify_64.h | 23 - .../ios-arm64/Headers/sodium/export.h | 57 - .../ios-arm64/Headers/sodium/randombytes.h | 72 - .../sodium/randombytes_internal_random.h | 22 - .../Headers/sodium/randombytes_sysrandom.h | 19 - .../ios-arm64/Headers/sodium/runtime.h | 55 - .../ios-arm64/Headers/sodium/utils.h | 179 - .../ios-arm64/Headers/sodium/version.h | 33 - .../ios-arm64/libsodium.a | Bin 1359128 -> 0 bytes .../libsodium/lib/libsodium.27.dylib | Bin 437400 -> 0 bytes .../ShadowSocks/libsodium/lib/libsodium.a | Bin 1359128 -> 0 bytes .../ShadowSocks/libsodium/lib/libsodium.dylib | 1 - .../ShadowSocks/libsodium/lib/libsodium.la | 41 - .../libsodium/lib/pkgconfig/libsodium.pc | 12 - .../mbedtls/bin/libmbedcrypto-arm64.a | Bin 522912 -> 0 bytes .../mbedtls/bin/libmbedcrypto-armv7.a | Bin 406936 -> 0 bytes .../mbedtls/bin/libmbedcrypto-armv7s.a | Bin 415056 -> 0 bytes .../mbedtls/bin/libmbedcrypto-i386.a | Bin 529672 -> 0 bytes .../mbedtls/bin/libmbedcrypto-x86_64.a | Bin 546720 -> 0 bytes .../mbedtls/bin/libmbedtls-arm64.a | Bin 266360 -> 0 bytes .../mbedtls/bin/libmbedtls-armv7.a | Bin 228672 -> 0 bytes .../mbedtls/bin/libmbedtls-armv7s.a | Bin 229280 -> 0 bytes .../ShadowSocks/mbedtls/bin/libmbedtls-i386.a | Bin 272112 -> 0 bytes .../mbedtls/bin/libmbedtls-x86_64.a | Bin 262448 -> 0 bytes .../mbedtls/bin/libmbedx509-arm64.a | Bin 105240 -> 0 bytes .../mbedtls/bin/libmbedx509-armv7.a | Bin 81040 -> 0 bytes .../mbedtls/bin/libmbedx509-armv7s.a | Bin 81048 -> 0 bytes .../mbedtls/bin/libmbedx509-i386.a | Bin 107336 -> 0 bytes .../mbedtls/bin/libmbedx509-x86_64.a | Bin 110080 -> 0 bytes .../ShadowSocks/mbedtls/include/.gitignore | 4 - .../mbedtls/include/CMakeLists.txt | 11 - .../ShadowSocks/mbedtls/include/LICENSE | 2 - .../ShadowSocks/mbedtls/include/aes.h | 297 - .../ShadowSocks/mbedtls/include/aesni.h | 111 - .../ShadowSocks/mbedtls/include/arc4.h | 113 - .../ShadowSocks/mbedtls/include/asn1.h | 342 - .../ShadowSocks/mbedtls/include/asn1write.h | 239 - .../ShadowSocks/mbedtls/include/base64.h | 88 - .../ShadowSocks/mbedtls/include/bignum.h | 716 -- .../ShadowSocks/mbedtls/include/blowfish.h | 203 - .../ShadowSocks/mbedtls/include/bn_mul.h | 875 -- .../ShadowSocks/mbedtls/include/camellia.h | 235 - .../ShadowSocks/mbedtls/include/ccm.h | 141 - .../ShadowSocks/mbedtls/include/certs.h | 99 - .../mbedtls/include/check_config.h | 529 - .../ShadowSocks/mbedtls/include/cipher.h | 698 - .../mbedtls/include/cipher_internal.h | 109 - .../ShadowSocks/mbedtls/include/compat-1.3.h | 2633 ---- .../ShadowSocks/mbedtls/include/config.h | 2462 ---- .../ShadowSocks/mbedtls/include/ctr_drbg.h | 290 - .../ShadowSocks/mbedtls/include/debug.h | 125 - .../ShadowSocks/mbedtls/include/des.h | 306 - .../ShadowSocks/mbedtls/include/dhm.h | 305 - .../ShadowSocks/mbedtls/include/ecdh.h | 214 - .../ShadowSocks/mbedtls/include/ecdsa.h | 248 - .../ShadowSocks/mbedtls/include/ecp.h | 631 - .../ShadowSocks/mbedtls/include/entropy.h | 252 - .../mbedtls/include/entropy_poll.h | 89 - .../ShadowSocks/mbedtls/include/error.h | 107 - .../ShadowSocks/mbedtls/include/gcm.h | 220 - .../ShadowSocks/mbedtls/include/havege.h | 74 - .../ShadowSocks/mbedtls/include/hmac_drbg.h | 299 - .../mbedtls/include/mbedtls/LICENSE | 2 - .../ShadowSocks/mbedtls/include/mbedtls/aes.h | 297 - .../mbedtls/include/mbedtls/aesni.h | 111 - .../mbedtls/include/mbedtls/arc4.h | 113 - .../mbedtls/include/mbedtls/asn1.h | 342 - .../mbedtls/include/mbedtls/asn1write.h | 239 - .../mbedtls/include/mbedtls/base64.h | 88 - .../mbedtls/include/mbedtls/bignum.h | 716 -- .../mbedtls/include/mbedtls/blowfish.h | 203 - .../mbedtls/include/mbedtls/bn_mul.h | 875 -- .../mbedtls/include/mbedtls/camellia.h | 235 - .../ShadowSocks/mbedtls/include/mbedtls/ccm.h | 141 - .../mbedtls/include/mbedtls/certs.h | 99 - .../mbedtls/include/mbedtls/check_config.h | 529 - .../mbedtls/include/mbedtls/cipher.h | 698 - .../mbedtls/include/mbedtls/cipher_internal.h | 109 - .../mbedtls/include/mbedtls/compat-1.3.h | 2633 ---- .../mbedtls/include/mbedtls/config.h | 2462 ---- .../mbedtls/include/mbedtls/ctr_drbg.h | 290 - .../mbedtls/include/mbedtls/debug.h | 125 - .../ShadowSocks/mbedtls/include/mbedtls/des.h | 306 - .../ShadowSocks/mbedtls/include/mbedtls/dhm.h | 305 - .../mbedtls/include/mbedtls/ecdh.h | 214 - .../mbedtls/include/mbedtls/ecdsa.h | 248 - .../ShadowSocks/mbedtls/include/mbedtls/ecp.h | 631 - .../mbedtls/include/mbedtls/entropy.h | 252 - .../mbedtls/include/mbedtls/entropy_poll.h | 89 - .../mbedtls/include/mbedtls/error.h | 107 - .../ShadowSocks/mbedtls/include/mbedtls/gcm.h | 220 - .../mbedtls/include/mbedtls/havege.h | 74 - .../mbedtls/include/mbedtls/hmac_drbg.h | 299 - .../ShadowSocks/mbedtls/include/mbedtls/md.h | 353 - .../ShadowSocks/mbedtls/include/mbedtls/md2.h | 136 - .../ShadowSocks/mbedtls/include/mbedtls/md4.h | 136 - .../ShadowSocks/mbedtls/include/mbedtls/md5.h | 136 - .../mbedtls/include/mbedtls/md_internal.h | 114 - .../include/mbedtls/memory_buffer_alloc.h | 146 - .../ShadowSocks/mbedtls/include/mbedtls/net.h | 225 - .../ShadowSocks/mbedtls/include/mbedtls/oid.h | 570 - .../mbedtls/include/mbedtls/padlock.h | 107 - .../ShadowSocks/mbedtls/include/mbedtls/pem.h | 129 - .../ShadowSocks/mbedtls/include/mbedtls/pk.h | 615 - .../mbedtls/include/mbedtls/pk_internal.h | 114 - .../mbedtls/include/mbedtls/pkcs11.h | 173 - .../mbedtls/include/mbedtls/pkcs12.h | 119 - .../mbedtls/include/mbedtls/pkcs5.h | 94 - .../mbedtls/include/mbedtls/platform.h | 214 - .../mbedtls/include/mbedtls/ripemd160.h | 138 - .../ShadowSocks/mbedtls/include/mbedtls/rsa.h | 652 - .../mbedtls/include/mbedtls/sha1.h | 136 - .../mbedtls/include/mbedtls/sha256.h | 141 - .../mbedtls/include/mbedtls/sha512.h | 141 - .../ShadowSocks/mbedtls/include/mbedtls/ssl.h | 2290 ---- .../mbedtls/include/mbedtls/ssl_cache.h | 143 - .../include/mbedtls/ssl_ciphersuites.h | 303 - .../mbedtls/include/mbedtls/ssl_cookie.h | 108 - .../mbedtls/include/mbedtls/ssl_internal.h | 482 - .../mbedtls/include/mbedtls/ssl_ticket.h | 135 - .../mbedtls/include/mbedtls/threading.h | 104 - .../mbedtls/include/mbedtls/timing.h | 141 - .../mbedtls/include/mbedtls/version.h | 111 - .../mbedtls/include/mbedtls/x509.h | 331 - .../mbedtls/include/mbedtls/x509_crl.h | 172 - .../mbedtls/include/mbedtls/x509_crt.h | 645 - .../mbedtls/include/mbedtls/x509_csr.h | 292 - .../mbedtls/include/mbedtls/xtea.h | 139 - .../ShadowSocks/mbedtls/include/md.h | 353 - .../ShadowSocks/mbedtls/include/md2.h | 136 - .../ShadowSocks/mbedtls/include/md4.h | 136 - .../ShadowSocks/mbedtls/include/md5.h | 136 - .../ShadowSocks/mbedtls/include/md_internal.h | 114 - .../mbedtls/include/memory_buffer_alloc.h | 146 - .../ShadowSocks/mbedtls/include/net.h | 225 - .../ShadowSocks/mbedtls/include/oid.h | 570 - .../ShadowSocks/mbedtls/include/padlock.h | 107 - .../ShadowSocks/mbedtls/include/pem.h | 129 - .../ShadowSocks/mbedtls/include/pk.h | 615 - .../ShadowSocks/mbedtls/include/pk_internal.h | 114 - .../ShadowSocks/mbedtls/include/pkcs11.h | 173 - .../ShadowSocks/mbedtls/include/pkcs12.h | 119 - .../ShadowSocks/mbedtls/include/pkcs5.h | 94 - .../ShadowSocks/mbedtls/include/platform.h | 214 - .../ShadowSocks/mbedtls/include/ripemd160.h | 138 - .../ShadowSocks/mbedtls/include/rsa.h | 652 - .../ShadowSocks/mbedtls/include/sha1.h | 136 - .../ShadowSocks/mbedtls/include/sha256.h | 141 - .../ShadowSocks/mbedtls/include/sha512.h | 141 - .../ShadowSocks/mbedtls/include/ssl.h | 2290 ---- .../ShadowSocks/mbedtls/include/ssl_cache.h | 143 - .../mbedtls/include/ssl_ciphersuites.h | 303 - .../ShadowSocks/mbedtls/include/ssl_cookie.h | 108 - .../mbedtls/include/ssl_internal.h | 482 - .../ShadowSocks/mbedtls/include/ssl_ticket.h | 135 - .../ShadowSocks/mbedtls/include/threading.h | 104 - .../ShadowSocks/mbedtls/include/timing.h | 141 - .../ShadowSocks/mbedtls/include/version.h | 111 - .../ShadowSocks/mbedtls/include/x509.h | 331 - .../ShadowSocks/mbedtls/include/x509_crl.h | 172 - .../ShadowSocks/mbedtls/include/x509_crt.h | 645 - .../ShadowSocks/mbedtls/include/x509_csr.h | 292 - .../ShadowSocks/mbedtls/include/xtea.h | 139 - .../ShadowSocks/mbedtls/lib/libmbedcrypto.a | Bin 1344976 -> 0 bytes .../ShadowSocks/mbedtls/lib/libmbedtls.a | Bin 724384 -> 0 bytes .../ShadowSocks/mbedtls/lib/libmbedx509.a | Bin 267400 -> 0 bytes .../ShadowSocks/pcre/arm64/bin/pcre-config | 133 - .../ShadowSocks/pcre/arm64/bin/pcregrep | Bin 271128 -> 0 bytes .../ShadowSocks/pcre/arm64/bin/pcretest | Bin 320384 -> 0 bytes .../pcre/arm64/share/doc/pcre/AUTHORS | 45 - .../pcre/arm64/share/doc/pcre/COPYING | 5 - .../pcre/arm64/share/doc/pcre/ChangeLog | 6104 --------- .../pcre/arm64/share/doc/pcre/LICENCE | 93 - .../pcre/arm64/share/doc/pcre/NEWS | 737 -- .../pcre/arm64/share/doc/pcre/README | 1002 -- .../doc/pcre/html/NON-AUTOTOOLS-BUILD.txt | 772 -- .../pcre/arm64/share/doc/pcre/html/README.txt | 1002 -- .../pcre/arm64/share/doc/pcre/html/index.html | 185 - .../share/doc/pcre/html/pcre-config.html | 109 - .../pcre/arm64/share/doc/pcre/html/pcre.html | 224 - .../arm64/share/doc/pcre/html/pcre16.html | 384 - .../arm64/share/doc/pcre/html/pcre32.html | 382 - .../doc/pcre/html/pcre_assign_jit_stack.html | 76 - .../share/doc/pcre/html/pcre_compile.html | 111 - .../share/doc/pcre/html/pcre_compile2.html | 115 - .../share/doc/pcre/html/pcre_config.html | 94 - .../pcre/html/pcre_copy_named_substring.html | 65 - .../doc/pcre/html/pcre_copy_substring.html | 61 - .../share/doc/pcre/html/pcre_dfa_exec.html | 129 - .../arm64/share/doc/pcre/html/pcre_exec.html | 111 - .../share/doc/pcre/html/pcre_free_study.html | 46 - .../doc/pcre/html/pcre_free_substring.html | 46 - .../pcre/html/pcre_free_substring_list.html | 46 - .../share/doc/pcre/html/pcre_fullinfo.html | 118 - .../pcre/html/pcre_get_named_substring.html | 68 - .../doc/pcre/html/pcre_get_stringnumber.html | 57 - .../html/pcre_get_stringtable_entries.html | 60 - .../doc/pcre/html/pcre_get_substring.html | 64 - .../pcre/html/pcre_get_substring_list.html | 61 - .../share/doc/pcre/html/pcre_jit_exec.html | 108 - .../doc/pcre/html/pcre_jit_stack_alloc.html | 55 - .../doc/pcre/html/pcre_jit_stack_free.html | 48 - .../share/doc/pcre/html/pcre_maketables.html | 48 - .../html/pcre_pattern_to_host_byte_order.html | 58 - .../share/doc/pcre/html/pcre_refcount.html | 51 - .../arm64/share/doc/pcre/html/pcre_study.html | 68 - .../html/pcre_utf16_to_host_byte_order.html | 57 - .../html/pcre_utf32_to_host_byte_order.html | 57 - .../share/doc/pcre/html/pcre_version.html | 46 - .../arm64/share/doc/pcre/html/pcreapi.html | 2921 ----- .../arm64/share/doc/pcre/html/pcrebuild.html | 534 - .../share/doc/pcre/html/pcrecallout.html | 286 - .../arm64/share/doc/pcre/html/pcrecompat.html | 235 - .../arm64/share/doc/pcre/html/pcrecpp.html | 368 - .../arm64/share/doc/pcre/html/pcredemo.html | 426 - .../arm64/share/doc/pcre/html/pcregrep.html | 759 -- .../arm64/share/doc/pcre/html/pcrejit.html | 499 - .../arm64/share/doc/pcre/html/pcrelimits.html | 90 - .../share/doc/pcre/html/pcrematching.html | 242 - .../share/doc/pcre/html/pcrepartial.html | 509 - .../share/doc/pcre/html/pcrepattern.html | 3276 ----- .../share/doc/pcre/html/pcreperform.html | 195 - .../arm64/share/doc/pcre/html/pcreposix.html | 290 - .../share/doc/pcre/html/pcreprecompile.html | 163 - .../arm64/share/doc/pcre/html/pcresample.html | 110 - .../arm64/share/doc/pcre/html/pcrestack.html | 225 - .../arm64/share/doc/pcre/html/pcresyntax.html | 561 - .../arm64/share/doc/pcre/html/pcretest.html | 1163 -- .../share/doc/pcre/html/pcreunicode.html | 262 - .../pcre/arm64/share/doc/pcre/pcre-config.txt | 86 - .../pcre/arm64/share/doc/pcre/pcre.txt | 10502 ---------------- .../pcre/arm64/share/doc/pcre/pcregrep.txt | 741 -- .../pcre/arm64/share/doc/pcre/pcretest.txt | 1091 -- .../pcre/arm64/share/man/man1/pcre-config.1 | 92 - .../pcre/arm64/share/man/man1/pcregrep.1 | 683 - .../pcre/arm64/share/man/man1/pcretest.1 | 1160 -- .../pcre/arm64/share/man/man3/pcre.3 | 230 - .../pcre/arm64/share/man/man3/pcre16.3 | 371 - .../share/man/man3/pcre16_assign_jit_stack.3 | 1 - .../arm64/share/man/man3/pcre16_compile.3 | 1 - .../arm64/share/man/man3/pcre16_compile2.3 | 1 - .../pcre/arm64/share/man/man3/pcre16_config.3 | 1 - .../man/man3/pcre16_copy_named_substring.3 | 1 - .../share/man/man3/pcre16_copy_substring.3 | 1 - .../arm64/share/man/man3/pcre16_dfa_exec.3 | 1 - .../pcre/arm64/share/man/man3/pcre16_exec.3 | 1 - .../arm64/share/man/man3/pcre16_free_study.3 | 1 - .../share/man/man3/pcre16_free_substring.3 | 1 - .../man/man3/pcre16_free_substring_list.3 | 1 - .../arm64/share/man/man3/pcre16_fullinfo.3 | 1 - .../man/man3/pcre16_get_named_substring.3 | 1 - .../share/man/man3/pcre16_get_stringnumber.3 | 1 - .../man/man3/pcre16_get_stringtable_entries.3 | 1 - .../share/man/man3/pcre16_get_substring.3 | 1 - .../man/man3/pcre16_get_substring_list.3 | 1 - .../arm64/share/man/man3/pcre16_jit_exec.3 | 1 - .../share/man/man3/pcre16_jit_stack_alloc.3 | 1 - .../share/man/man3/pcre16_jit_stack_free.3 | 1 - .../arm64/share/man/man3/pcre16_maketables.3 | 1 - .../man3/pcre16_pattern_to_host_byte_order.3 | 1 - .../arm64/share/man/man3/pcre16_refcount.3 | 1 - .../pcre/arm64/share/man/man3/pcre16_study.3 | 1 - .../man3/pcre16_utf16_to_host_byte_order.3 | 1 - .../arm64/share/man/man3/pcre16_version.3 | 1 - .../pcre/arm64/share/man/man3/pcre32.3 | 369 - .../share/man/man3/pcre32_assign_jit_stack.3 | 1 - .../arm64/share/man/man3/pcre32_compile.3 | 1 - .../arm64/share/man/man3/pcre32_compile2.3 | 1 - .../pcre/arm64/share/man/man3/pcre32_config.3 | 1 - .../man/man3/pcre32_copy_named_substring.3 | 1 - .../share/man/man3/pcre32_copy_substring.3 | 1 - .../arm64/share/man/man3/pcre32_dfa_exec.3 | 1 - .../pcre/arm64/share/man/man3/pcre32_exec.3 | 1 - .../arm64/share/man/man3/pcre32_free_study.3 | 1 - .../share/man/man3/pcre32_free_substring.3 | 1 - .../man/man3/pcre32_free_substring_list.3 | 1 - .../arm64/share/man/man3/pcre32_fullinfo.3 | 1 - .../man/man3/pcre32_get_named_substring.3 | 1 - .../share/man/man3/pcre32_get_stringnumber.3 | 1 - .../man/man3/pcre32_get_stringtable_entries.3 | 1 - .../share/man/man3/pcre32_get_substring.3 | 1 - .../man/man3/pcre32_get_substring_list.3 | 1 - .../arm64/share/man/man3/pcre32_jit_exec.3 | 1 - .../share/man/man3/pcre32_jit_stack_alloc.3 | 1 - .../share/man/man3/pcre32_jit_stack_free.3 | 1 - .../arm64/share/man/man3/pcre32_maketables.3 | 1 - .../man3/pcre32_pattern_to_host_byte_order.3 | 1 - .../arm64/share/man/man3/pcre32_refcount.3 | 1 - .../pcre/arm64/share/man/man3/pcre32_study.3 | 1 - .../man3/pcre32_utf32_to_host_byte_order.3 | 1 - .../arm64/share/man/man3/pcre32_version.3 | 1 - .../share/man/man3/pcre_assign_jit_stack.3 | 59 - .../pcre/arm64/share/man/man3/pcre_compile.3 | 96 - .../pcre/arm64/share/man/man3/pcre_compile2.3 | 101 - .../pcre/arm64/share/man/man3/pcre_config.3 | 79 - .../man/man3/pcre_copy_named_substring.3 | 51 - .../share/man/man3/pcre_copy_substring.3 | 47 - .../pcre/arm64/share/man/man3/pcre_dfa_exec.3 | 118 - .../pcre/arm64/share/man/man3/pcre_exec.3 | 99 - .../arm64/share/man/man3/pcre_free_study.3 | 31 - .../share/man/man3/pcre_free_substring.3 | 31 - .../share/man/man3/pcre_free_substring_list.3 | 31 - .../pcre/arm64/share/man/man3/pcre_fullinfo.3 | 103 - .../share/man/man3/pcre_get_named_substring.3 | 54 - .../share/man/man3/pcre_get_stringnumber.3 | 43 - .../man/man3/pcre_get_stringtable_entries.3 | 46 - .../arm64/share/man/man3/pcre_get_substring.3 | 50 - .../share/man/man3/pcre_get_substring_list.3 | 47 - .../pcre/arm64/share/man/man3/pcre_jit_exec.3 | 96 - .../share/man/man3/pcre_jit_stack_alloc.3 | 43 - .../share/man/man3/pcre_jit_stack_free.3 | 35 - .../arm64/share/man/man3/pcre_maketables.3 | 33 - .../man3/pcre_pattern_to_host_byte_order.3 | 44 - .../pcre/arm64/share/man/man3/pcre_refcount.3 | 36 - .../pcre/arm64/share/man/man3/pcre_study.3 | 54 - .../man/man3/pcre_utf16_to_host_byte_order.3 | 45 - .../man/man3/pcre_utf32_to_host_byte_order.3 | 45 - .../pcre/arm64/share/man/man3/pcre_version.3 | 31 - .../pcre/arm64/share/man/man3/pcreapi.3 | 2918 ----- .../pcre/arm64/share/man/man3/pcrebuild.3 | 550 - .../pcre/arm64/share/man/man3/pcrecallout.3 | 255 - .../pcre/arm64/share/man/man3/pcrecompat.3 | 200 - .../pcre/arm64/share/man/man3/pcrecpp.3 | 348 - .../pcre/arm64/share/man/man3/pcredemo.3 | 424 - .../pcre/arm64/share/man/man3/pcrejit.3 | 473 - .../pcre/arm64/share/man/man3/pcrelimits.3 | 71 - .../pcre/arm64/share/man/man3/pcrematching.3 | 214 - .../pcre/arm64/share/man/man3/pcrepartial.3 | 476 - .../pcre/arm64/share/man/man3/pcrepattern.3 | 3304 ----- .../pcre/arm64/share/man/man3/pcreperform.3 | 177 - .../pcre/arm64/share/man/man3/pcreposix.3 | 267 - .../arm64/share/man/man3/pcreprecompile.3 | 155 - .../pcre/arm64/share/man/man3/pcresample.3 | 99 - .../pcre/arm64/share/man/man3/pcrestack.3 | 215 - .../pcre/arm64/share/man/man3/pcresyntax.3 | 540 - .../pcre/arm64/share/man/man3/pcreunicode.3 | 249 - .../ShadowSocks/pcre/armv7/bin/pcre-config | 133 - .../ShadowSocks/pcre/armv7/bin/pcregrep | Bin 237852 -> 0 bytes .../ShadowSocks/pcre/armv7/bin/pcretest | Bin 287384 -> 0 bytes .../ShadowSocks/pcre/armv7/include/pcre.h | 677 - .../pcre/armv7/include/pcre_scanner.h | 172 - .../pcre/armv7/include/pcre_stringpiece.h | 180 - .../ShadowSocks/pcre/armv7/include/pcrecpp.h | 710 -- .../pcre/armv7/include/pcrecpparg.h | 174 - .../pcre/armv7/include/pcreposix.h | 146 - .../ShadowSocks/pcre/armv7/lib/libpcre.a | Bin 228016 -> 0 bytes .../ShadowSocks/pcre/armv7/lib/libpcre.la | 41 - .../ShadowSocks/pcre/armv7/lib/libpcrecpp.a | Bin 34272 -> 0 bytes .../ShadowSocks/pcre/armv7/lib/libpcrecpp.la | 41 - .../ShadowSocks/pcre/armv7/lib/libpcreposix.a | Bin 3208 -> 0 bytes .../pcre/armv7/lib/libpcreposix.la | 41 - .../pcre/armv7/lib/pkgconfig/libpcre.pc | 13 - .../pcre/armv7/lib/pkgconfig/libpcrecpp.pc | 12 - .../pcre/armv7/lib/pkgconfig/libpcreposix.pc | 13 - .../pcre/armv7/share/doc/pcre/AUTHORS | 45 - .../pcre/armv7/share/doc/pcre/COPYING | 5 - .../pcre/armv7/share/doc/pcre/ChangeLog | 6104 --------- .../pcre/armv7/share/doc/pcre/LICENCE | 93 - .../pcre/armv7/share/doc/pcre/NEWS | 737 -- .../pcre/armv7/share/doc/pcre/README | 1002 -- .../doc/pcre/html/NON-AUTOTOOLS-BUILD.txt | 772 -- .../pcre/armv7/share/doc/pcre/html/README.txt | 1002 -- .../pcre/armv7/share/doc/pcre/html/index.html | 185 - .../share/doc/pcre/html/pcre-config.html | 109 - .../pcre/armv7/share/doc/pcre/html/pcre.html | 224 - .../armv7/share/doc/pcre/html/pcre16.html | 384 - .../armv7/share/doc/pcre/html/pcre32.html | 382 - .../doc/pcre/html/pcre_assign_jit_stack.html | 76 - .../share/doc/pcre/html/pcre_compile.html | 111 - .../share/doc/pcre/html/pcre_compile2.html | 115 - .../share/doc/pcre/html/pcre_config.html | 94 - .../pcre/html/pcre_copy_named_substring.html | 65 - .../doc/pcre/html/pcre_copy_substring.html | 61 - .../share/doc/pcre/html/pcre_dfa_exec.html | 129 - .../armv7/share/doc/pcre/html/pcre_exec.html | 111 - .../share/doc/pcre/html/pcre_free_study.html | 46 - .../doc/pcre/html/pcre_free_substring.html | 46 - .../pcre/html/pcre_free_substring_list.html | 46 - .../share/doc/pcre/html/pcre_fullinfo.html | 118 - .../pcre/html/pcre_get_named_substring.html | 68 - .../doc/pcre/html/pcre_get_stringnumber.html | 57 - .../html/pcre_get_stringtable_entries.html | 60 - .../doc/pcre/html/pcre_get_substring.html | 64 - .../pcre/html/pcre_get_substring_list.html | 61 - .../share/doc/pcre/html/pcre_jit_exec.html | 108 - .../doc/pcre/html/pcre_jit_stack_alloc.html | 55 - .../doc/pcre/html/pcre_jit_stack_free.html | 48 - .../share/doc/pcre/html/pcre_maketables.html | 48 - .../html/pcre_pattern_to_host_byte_order.html | 58 - .../share/doc/pcre/html/pcre_refcount.html | 51 - .../armv7/share/doc/pcre/html/pcre_study.html | 68 - .../html/pcre_utf16_to_host_byte_order.html | 57 - .../html/pcre_utf32_to_host_byte_order.html | 57 - .../share/doc/pcre/html/pcre_version.html | 46 - .../armv7/share/doc/pcre/html/pcreapi.html | 2921 ----- .../armv7/share/doc/pcre/html/pcrebuild.html | 534 - .../share/doc/pcre/html/pcrecallout.html | 286 - .../armv7/share/doc/pcre/html/pcrecompat.html | 235 - .../armv7/share/doc/pcre/html/pcrecpp.html | 368 - .../armv7/share/doc/pcre/html/pcredemo.html | 426 - .../armv7/share/doc/pcre/html/pcregrep.html | 759 -- .../armv7/share/doc/pcre/html/pcrejit.html | 499 - .../armv7/share/doc/pcre/html/pcrelimits.html | 90 - .../share/doc/pcre/html/pcrematching.html | 242 - .../share/doc/pcre/html/pcrepartial.html | 509 - .../share/doc/pcre/html/pcrepattern.html | 3276 ----- .../share/doc/pcre/html/pcreperform.html | 195 - .../armv7/share/doc/pcre/html/pcreposix.html | 290 - .../share/doc/pcre/html/pcreprecompile.html | 163 - .../armv7/share/doc/pcre/html/pcresample.html | 110 - .../armv7/share/doc/pcre/html/pcrestack.html | 225 - .../armv7/share/doc/pcre/html/pcresyntax.html | 561 - .../armv7/share/doc/pcre/html/pcretest.html | 1163 -- .../share/doc/pcre/html/pcreunicode.html | 262 - .../pcre/armv7/share/doc/pcre/pcre-config.txt | 86 - .../pcre/armv7/share/doc/pcre/pcre.txt | 10502 ---------------- .../pcre/armv7/share/doc/pcre/pcregrep.txt | 741 -- .../pcre/armv7/share/doc/pcre/pcretest.txt | 1091 -- .../pcre/armv7/share/man/man1/pcre-config.1 | 92 - .../pcre/armv7/share/man/man1/pcregrep.1 | 683 - .../pcre/armv7/share/man/man1/pcretest.1 | 1160 -- .../pcre/armv7/share/man/man3/pcre.3 | 230 - .../pcre/armv7/share/man/man3/pcre16.3 | 371 - .../share/man/man3/pcre16_assign_jit_stack.3 | 1 - .../armv7/share/man/man3/pcre16_compile.3 | 1 - .../armv7/share/man/man3/pcre16_compile2.3 | 1 - .../pcre/armv7/share/man/man3/pcre16_config.3 | 1 - .../man/man3/pcre16_copy_named_substring.3 | 1 - .../share/man/man3/pcre16_copy_substring.3 | 1 - .../armv7/share/man/man3/pcre16_dfa_exec.3 | 1 - .../pcre/armv7/share/man/man3/pcre16_exec.3 | 1 - .../armv7/share/man/man3/pcre16_free_study.3 | 1 - .../share/man/man3/pcre16_free_substring.3 | 1 - .../man/man3/pcre16_free_substring_list.3 | 1 - .../armv7/share/man/man3/pcre16_fullinfo.3 | 1 - .../man/man3/pcre16_get_named_substring.3 | 1 - .../share/man/man3/pcre16_get_stringnumber.3 | 1 - .../man/man3/pcre16_get_stringtable_entries.3 | 1 - .../share/man/man3/pcre16_get_substring.3 | 1 - .../man/man3/pcre16_get_substring_list.3 | 1 - .../armv7/share/man/man3/pcre16_jit_exec.3 | 1 - .../share/man/man3/pcre16_jit_stack_alloc.3 | 1 - .../share/man/man3/pcre16_jit_stack_free.3 | 1 - .../armv7/share/man/man3/pcre16_maketables.3 | 1 - .../man3/pcre16_pattern_to_host_byte_order.3 | 1 - .../armv7/share/man/man3/pcre16_refcount.3 | 1 - .../pcre/armv7/share/man/man3/pcre16_study.3 | 1 - .../man3/pcre16_utf16_to_host_byte_order.3 | 1 - .../armv7/share/man/man3/pcre16_version.3 | 1 - .../pcre/armv7/share/man/man3/pcre32.3 | 369 - .../share/man/man3/pcre32_assign_jit_stack.3 | 1 - .../armv7/share/man/man3/pcre32_compile.3 | 1 - .../armv7/share/man/man3/pcre32_compile2.3 | 1 - .../pcre/armv7/share/man/man3/pcre32_config.3 | 1 - .../man/man3/pcre32_copy_named_substring.3 | 1 - .../share/man/man3/pcre32_copy_substring.3 | 1 - .../armv7/share/man/man3/pcre32_dfa_exec.3 | 1 - .../pcre/armv7/share/man/man3/pcre32_exec.3 | 1 - .../armv7/share/man/man3/pcre32_free_study.3 | 1 - .../share/man/man3/pcre32_free_substring.3 | 1 - .../man/man3/pcre32_free_substring_list.3 | 1 - .../armv7/share/man/man3/pcre32_fullinfo.3 | 1 - .../man/man3/pcre32_get_named_substring.3 | 1 - .../share/man/man3/pcre32_get_stringnumber.3 | 1 - .../man/man3/pcre32_get_stringtable_entries.3 | 1 - .../share/man/man3/pcre32_get_substring.3 | 1 - .../man/man3/pcre32_get_substring_list.3 | 1 - .../armv7/share/man/man3/pcre32_jit_exec.3 | 1 - .../share/man/man3/pcre32_jit_stack_alloc.3 | 1 - .../share/man/man3/pcre32_jit_stack_free.3 | 1 - .../armv7/share/man/man3/pcre32_maketables.3 | 1 - .../man3/pcre32_pattern_to_host_byte_order.3 | 1 - .../armv7/share/man/man3/pcre32_refcount.3 | 1 - .../pcre/armv7/share/man/man3/pcre32_study.3 | 1 - .../man3/pcre32_utf32_to_host_byte_order.3 | 1 - .../armv7/share/man/man3/pcre32_version.3 | 1 - .../share/man/man3/pcre_assign_jit_stack.3 | 59 - .../pcre/armv7/share/man/man3/pcre_compile.3 | 96 - .../pcre/armv7/share/man/man3/pcre_compile2.3 | 101 - .../pcre/armv7/share/man/man3/pcre_config.3 | 79 - .../man/man3/pcre_copy_named_substring.3 | 51 - .../share/man/man3/pcre_copy_substring.3 | 47 - .../pcre/armv7/share/man/man3/pcre_dfa_exec.3 | 118 - .../pcre/armv7/share/man/man3/pcre_exec.3 | 99 - .../armv7/share/man/man3/pcre_free_study.3 | 31 - .../share/man/man3/pcre_free_substring.3 | 31 - .../share/man/man3/pcre_free_substring_list.3 | 31 - .../pcre/armv7/share/man/man3/pcre_fullinfo.3 | 103 - .../share/man/man3/pcre_get_named_substring.3 | 54 - .../share/man/man3/pcre_get_stringnumber.3 | 43 - .../man/man3/pcre_get_stringtable_entries.3 | 46 - .../armv7/share/man/man3/pcre_get_substring.3 | 50 - .../share/man/man3/pcre_get_substring_list.3 | 47 - .../pcre/armv7/share/man/man3/pcre_jit_exec.3 | 96 - .../share/man/man3/pcre_jit_stack_alloc.3 | 43 - .../share/man/man3/pcre_jit_stack_free.3 | 35 - .../armv7/share/man/man3/pcre_maketables.3 | 33 - .../man3/pcre_pattern_to_host_byte_order.3 | 44 - .../pcre/armv7/share/man/man3/pcre_refcount.3 | 36 - .../pcre/armv7/share/man/man3/pcre_study.3 | 54 - .../man/man3/pcre_utf16_to_host_byte_order.3 | 45 - .../man/man3/pcre_utf32_to_host_byte_order.3 | 45 - .../pcre/armv7/share/man/man3/pcre_version.3 | 31 - .../pcre/armv7/share/man/man3/pcreapi.3 | 2918 ----- .../pcre/armv7/share/man/man3/pcrebuild.3 | 550 - .../pcre/armv7/share/man/man3/pcrecallout.3 | 255 - .../pcre/armv7/share/man/man3/pcrecompat.3 | 200 - .../pcre/armv7/share/man/man3/pcrecpp.3 | 348 - .../pcre/armv7/share/man/man3/pcredemo.3 | 424 - .../pcre/armv7/share/man/man3/pcrejit.3 | 473 - .../pcre/armv7/share/man/man3/pcrelimits.3 | 71 - .../pcre/armv7/share/man/man3/pcrematching.3 | 214 - .../pcre/armv7/share/man/man3/pcrepartial.3 | 476 - .../pcre/armv7/share/man/man3/pcrepattern.3 | 3304 ----- .../pcre/armv7/share/man/man3/pcreperform.3 | 177 - .../pcre/armv7/share/man/man3/pcreposix.3 | 267 - .../armv7/share/man/man3/pcreprecompile.3 | 155 - .../pcre/armv7/share/man/man3/pcresample.3 | 99 - .../pcre/armv7/share/man/man3/pcrestack.3 | 215 - .../pcre/armv7/share/man/man3/pcresyntax.3 | 540 - .../pcre/armv7/share/man/man3/pcreunicode.3 | 249 - .../ShadowSocks/pcre/armv7s/bin/pcre-config | 133 - .../ShadowSocks/pcre/armv7s/bin/pcregrep | Bin 237852 -> 0 bytes .../ShadowSocks/pcre/armv7s/bin/pcretest | Bin 287384 -> 0 bytes .../ShadowSocks/pcre/armv7s/include/pcre.h | 677 - .../pcre/armv7s/include/pcre_scanner.h | 172 - .../pcre/armv7s/include/pcre_stringpiece.h | 180 - .../ShadowSocks/pcre/armv7s/include/pcrecpp.h | 710 -- .../pcre/armv7s/include/pcrecpparg.h | 174 - .../pcre/armv7s/include/pcreposix.h | 146 - .../ShadowSocks/pcre/armv7s/lib/libpcre.a | Bin 228032 -> 0 bytes .../ShadowSocks/pcre/armv7s/lib/libpcre.la | 41 - .../ShadowSocks/pcre/armv7s/lib/libpcrecpp.a | Bin 34248 -> 0 bytes .../ShadowSocks/pcre/armv7s/lib/libpcrecpp.la | 41 - .../pcre/armv7s/lib/libpcreposix.a | Bin 3208 -> 0 bytes .../pcre/armv7s/lib/libpcreposix.la | 41 - .../pcre/armv7s/lib/pkgconfig/libpcre.pc | 13 - .../pcre/armv7s/lib/pkgconfig/libpcrecpp.pc | 12 - .../pcre/armv7s/lib/pkgconfig/libpcreposix.pc | 13 - .../pcre/armv7s/share/doc/pcre/AUTHORS | 45 - .../pcre/armv7s/share/doc/pcre/COPYING | 5 - .../pcre/armv7s/share/doc/pcre/ChangeLog | 6104 --------- .../pcre/armv7s/share/doc/pcre/LICENCE | 93 - .../pcre/armv7s/share/doc/pcre/NEWS | 737 -- .../pcre/armv7s/share/doc/pcre/README | 1002 -- .../doc/pcre/html/NON-AUTOTOOLS-BUILD.txt | 772 -- .../armv7s/share/doc/pcre/html/README.txt | 1002 -- .../armv7s/share/doc/pcre/html/index.html | 185 - .../share/doc/pcre/html/pcre-config.html | 109 - .../pcre/armv7s/share/doc/pcre/html/pcre.html | 224 - .../armv7s/share/doc/pcre/html/pcre16.html | 384 - .../armv7s/share/doc/pcre/html/pcre32.html | 382 - .../doc/pcre/html/pcre_assign_jit_stack.html | 76 - .../share/doc/pcre/html/pcre_compile.html | 111 - .../share/doc/pcre/html/pcre_compile2.html | 115 - .../share/doc/pcre/html/pcre_config.html | 94 - .../pcre/html/pcre_copy_named_substring.html | 65 - .../doc/pcre/html/pcre_copy_substring.html | 61 - .../share/doc/pcre/html/pcre_dfa_exec.html | 129 - .../armv7s/share/doc/pcre/html/pcre_exec.html | 111 - .../share/doc/pcre/html/pcre_free_study.html | 46 - .../doc/pcre/html/pcre_free_substring.html | 46 - .../pcre/html/pcre_free_substring_list.html | 46 - .../share/doc/pcre/html/pcre_fullinfo.html | 118 - .../pcre/html/pcre_get_named_substring.html | 68 - .../doc/pcre/html/pcre_get_stringnumber.html | 57 - .../html/pcre_get_stringtable_entries.html | 60 - .../doc/pcre/html/pcre_get_substring.html | 64 - .../pcre/html/pcre_get_substring_list.html | 61 - .../share/doc/pcre/html/pcre_jit_exec.html | 108 - .../doc/pcre/html/pcre_jit_stack_alloc.html | 55 - .../doc/pcre/html/pcre_jit_stack_free.html | 48 - .../share/doc/pcre/html/pcre_maketables.html | 48 - .../html/pcre_pattern_to_host_byte_order.html | 58 - .../share/doc/pcre/html/pcre_refcount.html | 51 - .../share/doc/pcre/html/pcre_study.html | 68 - .../html/pcre_utf16_to_host_byte_order.html | 57 - .../html/pcre_utf32_to_host_byte_order.html | 57 - .../share/doc/pcre/html/pcre_version.html | 46 - .../armv7s/share/doc/pcre/html/pcreapi.html | 2921 ----- .../armv7s/share/doc/pcre/html/pcrebuild.html | 534 - .../share/doc/pcre/html/pcrecallout.html | 286 - .../share/doc/pcre/html/pcrecompat.html | 235 - .../armv7s/share/doc/pcre/html/pcrecpp.html | 368 - .../armv7s/share/doc/pcre/html/pcredemo.html | 426 - .../armv7s/share/doc/pcre/html/pcregrep.html | 759 -- .../armv7s/share/doc/pcre/html/pcrejit.html | 499 - .../share/doc/pcre/html/pcrelimits.html | 90 - .../share/doc/pcre/html/pcrematching.html | 242 - .../share/doc/pcre/html/pcrepartial.html | 509 - .../share/doc/pcre/html/pcrepattern.html | 3276 ----- .../share/doc/pcre/html/pcreperform.html | 195 - .../armv7s/share/doc/pcre/html/pcreposix.html | 290 - .../share/doc/pcre/html/pcreprecompile.html | 163 - .../share/doc/pcre/html/pcresample.html | 110 - .../armv7s/share/doc/pcre/html/pcrestack.html | 225 - .../share/doc/pcre/html/pcresyntax.html | 561 - .../armv7s/share/doc/pcre/html/pcretest.html | 1163 -- .../share/doc/pcre/html/pcreunicode.html | 262 - .../armv7s/share/doc/pcre/pcre-config.txt | 86 - .../pcre/armv7s/share/doc/pcre/pcre.txt | 10502 ---------------- .../pcre/armv7s/share/doc/pcre/pcregrep.txt | 741 -- .../pcre/armv7s/share/doc/pcre/pcretest.txt | 1091 -- .../pcre/armv7s/share/man/man1/pcre-config.1 | 92 - .../pcre/armv7s/share/man/man1/pcregrep.1 | 683 - .../pcre/armv7s/share/man/man1/pcretest.1 | 1160 -- .../pcre/armv7s/share/man/man3/pcre.3 | 230 - .../pcre/armv7s/share/man/man3/pcre16.3 | 371 - .../share/man/man3/pcre16_assign_jit_stack.3 | 1 - .../armv7s/share/man/man3/pcre16_compile.3 | 1 - .../armv7s/share/man/man3/pcre16_compile2.3 | 1 - .../armv7s/share/man/man3/pcre16_config.3 | 1 - .../man/man3/pcre16_copy_named_substring.3 | 1 - .../share/man/man3/pcre16_copy_substring.3 | 1 - .../armv7s/share/man/man3/pcre16_dfa_exec.3 | 1 - .../pcre/armv7s/share/man/man3/pcre16_exec.3 | 1 - .../armv7s/share/man/man3/pcre16_free_study.3 | 1 - .../share/man/man3/pcre16_free_substring.3 | 1 - .../man/man3/pcre16_free_substring_list.3 | 1 - .../armv7s/share/man/man3/pcre16_fullinfo.3 | 1 - .../man/man3/pcre16_get_named_substring.3 | 1 - .../share/man/man3/pcre16_get_stringnumber.3 | 1 - .../man/man3/pcre16_get_stringtable_entries.3 | 1 - .../share/man/man3/pcre16_get_substring.3 | 1 - .../man/man3/pcre16_get_substring_list.3 | 1 - .../armv7s/share/man/man3/pcre16_jit_exec.3 | 1 - .../share/man/man3/pcre16_jit_stack_alloc.3 | 1 - .../share/man/man3/pcre16_jit_stack_free.3 | 1 - .../armv7s/share/man/man3/pcre16_maketables.3 | 1 - .../man3/pcre16_pattern_to_host_byte_order.3 | 1 - .../armv7s/share/man/man3/pcre16_refcount.3 | 1 - .../pcre/armv7s/share/man/man3/pcre16_study.3 | 1 - .../man3/pcre16_utf16_to_host_byte_order.3 | 1 - .../armv7s/share/man/man3/pcre16_version.3 | 1 - .../pcre/armv7s/share/man/man3/pcre32.3 | 369 - .../share/man/man3/pcre32_assign_jit_stack.3 | 1 - .../armv7s/share/man/man3/pcre32_compile.3 | 1 - .../armv7s/share/man/man3/pcre32_compile2.3 | 1 - .../armv7s/share/man/man3/pcre32_config.3 | 1 - .../man/man3/pcre32_copy_named_substring.3 | 1 - .../share/man/man3/pcre32_copy_substring.3 | 1 - .../armv7s/share/man/man3/pcre32_dfa_exec.3 | 1 - .../pcre/armv7s/share/man/man3/pcre32_exec.3 | 1 - .../armv7s/share/man/man3/pcre32_free_study.3 | 1 - .../share/man/man3/pcre32_free_substring.3 | 1 - .../man/man3/pcre32_free_substring_list.3 | 1 - .../armv7s/share/man/man3/pcre32_fullinfo.3 | 1 - .../man/man3/pcre32_get_named_substring.3 | 1 - .../share/man/man3/pcre32_get_stringnumber.3 | 1 - .../man/man3/pcre32_get_stringtable_entries.3 | 1 - .../share/man/man3/pcre32_get_substring.3 | 1 - .../man/man3/pcre32_get_substring_list.3 | 1 - .../armv7s/share/man/man3/pcre32_jit_exec.3 | 1 - .../share/man/man3/pcre32_jit_stack_alloc.3 | 1 - .../share/man/man3/pcre32_jit_stack_free.3 | 1 - .../armv7s/share/man/man3/pcre32_maketables.3 | 1 - .../man3/pcre32_pattern_to_host_byte_order.3 | 1 - .../armv7s/share/man/man3/pcre32_refcount.3 | 1 - .../pcre/armv7s/share/man/man3/pcre32_study.3 | 1 - .../man3/pcre32_utf32_to_host_byte_order.3 | 1 - .../armv7s/share/man/man3/pcre32_version.3 | 1 - .../share/man/man3/pcre_assign_jit_stack.3 | 59 - .../pcre/armv7s/share/man/man3/pcre_compile.3 | 96 - .../armv7s/share/man/man3/pcre_compile2.3 | 101 - .../pcre/armv7s/share/man/man3/pcre_config.3 | 79 - .../man/man3/pcre_copy_named_substring.3 | 51 - .../share/man/man3/pcre_copy_substring.3 | 47 - .../armv7s/share/man/man3/pcre_dfa_exec.3 | 118 - .../pcre/armv7s/share/man/man3/pcre_exec.3 | 99 - .../armv7s/share/man/man3/pcre_free_study.3 | 31 - .../share/man/man3/pcre_free_substring.3 | 31 - .../share/man/man3/pcre_free_substring_list.3 | 31 - .../armv7s/share/man/man3/pcre_fullinfo.3 | 103 - .../share/man/man3/pcre_get_named_substring.3 | 54 - .../share/man/man3/pcre_get_stringnumber.3 | 43 - .../man/man3/pcre_get_stringtable_entries.3 | 46 - .../share/man/man3/pcre_get_substring.3 | 50 - .../share/man/man3/pcre_get_substring_list.3 | 47 - .../armv7s/share/man/man3/pcre_jit_exec.3 | 96 - .../share/man/man3/pcre_jit_stack_alloc.3 | 43 - .../share/man/man3/pcre_jit_stack_free.3 | 35 - .../armv7s/share/man/man3/pcre_maketables.3 | 33 - .../man3/pcre_pattern_to_host_byte_order.3 | 44 - .../armv7s/share/man/man3/pcre_refcount.3 | 36 - .../pcre/armv7s/share/man/man3/pcre_study.3 | 54 - .../man/man3/pcre_utf16_to_host_byte_order.3 | 45 - .../man/man3/pcre_utf32_to_host_byte_order.3 | 45 - .../pcre/armv7s/share/man/man3/pcre_version.3 | 31 - .../pcre/armv7s/share/man/man3/pcreapi.3 | 2918 ----- .../pcre/armv7s/share/man/man3/pcrebuild.3 | 550 - .../pcre/armv7s/share/man/man3/pcrecallout.3 | 255 - .../pcre/armv7s/share/man/man3/pcrecompat.3 | 200 - .../pcre/armv7s/share/man/man3/pcrecpp.3 | 348 - .../pcre/armv7s/share/man/man3/pcredemo.3 | 424 - .../pcre/armv7s/share/man/man3/pcrejit.3 | 473 - .../pcre/armv7s/share/man/man3/pcrelimits.3 | 71 - .../pcre/armv7s/share/man/man3/pcrematching.3 | 214 - .../pcre/armv7s/share/man/man3/pcrepartial.3 | 476 - .../pcre/armv7s/share/man/man3/pcrepattern.3 | 3304 ----- .../pcre/armv7s/share/man/man3/pcreperform.3 | 177 - .../pcre/armv7s/share/man/man3/pcreposix.3 | 267 - .../armv7s/share/man/man3/pcreprecompile.3 | 155 - .../pcre/armv7s/share/man/man3/pcresample.3 | 99 - .../pcre/armv7s/share/man/man3/pcrestack.3 | 215 - .../pcre/armv7s/share/man/man3/pcresyntax.3 | 540 - .../pcre/armv7s/share/man/man3/pcreunicode.3 | 249 - .../ShadowSocks/pcre/include/pcre.h | 677 - .../ShadowSocks/pcre/include/pcre_scanner.h | 172 - .../pcre/include/pcre_stringpiece.h | 180 - .../ShadowSocks/pcre/include/pcrecpp.h | 710 -- .../ShadowSocks/pcre/include/pcrecpparg.h | 174 - .../ShadowSocks/pcre/include/pcreposix.h | 146 - .../ShadowSocks/pcre/lib/libpcre.a | Bin 265400 -> 0 bytes .../ShadowSocks/pcre/lib/libpcre.la | 41 - .../ShadowSocks/pcre/lib/libpcrecpp.a | Bin 41952 -> 0 bytes .../ShadowSocks/pcre/lib/libpcrecpp.la | 41 - .../ShadowSocks/pcre/lib/libpcreposix.a | Bin 4464 -> 0 bytes .../ShadowSocks/pcre/lib/libpcreposix.la | 41 - .../ShadowSocks/pcre/lib/pkgconfig/libpcre.pc | 13 - .../pcre/lib/pkgconfig/libpcrecpp.pc | 12 - .../pcre/lib/pkgconfig/libpcreposix.pc | 13 - .../ShadowSocks/shadowsocks-libev/config.h | 421 - .../shadowsocks-libev/include/shadowsocks.h | 101 - .../lib/libshadowsocks-libev.a | Bin 689576 -> 0 bytes .../shadowsocks-libev/libbloom/.gitignore | 1 - .../shadowsocks-libev/libbloom/LICENSE | 26 - .../shadowsocks-libev/libbloom/README | 45 - .../shadowsocks-libev/libbloom/bloom.c | 167 - .../shadowsocks-libev/libbloom/bloom.h | 172 - .../libbloom/misc/.gitignore | 2 - .../libbloom/misc/1.0/linux.10000.1 | 10 - .../libbloom/misc/1.0/linux.100000.1 | 10 - .../libbloom/misc/1.0/linux.10000000.001 | 10 - .../libbloom/misc/1.0/linux.10000000.01 | 10 - .../libbloom/misc/1.0/linux.10000000.1 | 10 - .../libbloom/misc/1.0/solaris.10000.1 | 10 - .../libbloom/misc/1.0/solaris.100000.1 | 10 - .../libbloom/misc/1.0/solaris.10000000.001 | 10 - .../libbloom/misc/1.0/solaris.10000000.01 | 10 - .../libbloom/misc/1.0/solaris.10000000.1 | 10 - .../libbloom/misc/1.1/linux.10000.1 | 10 - .../libbloom/misc/1.1/linux.100000.1 | 10 - .../libbloom/misc/1.1/linux.10000000.001 | 10 - .../libbloom/misc/1.1/linux.10000000.01 | 10 - .../libbloom/misc/1.1/linux.10000000.1 | 10 - .../libbloom/misc/1.1/solaris.10000.1 | 10 - .../libbloom/misc/1.1/solaris.100000.1 | 10 - .../libbloom/misc/1.1/solaris.10000000.001 | 10 - .../libbloom/misc/1.1/solaris.10000000.01 | 10 - .../libbloom/misc/1.1/solaris.10000000.1 | 10 - .../shadowsocks-libev/libbloom/misc/colcmp | 99 - .../shadowsocks-libev/libbloom/misc/colgraph | 58 - .../misc/collisions/collision_data_v1.2.gz | Bin 644637 -> 0 bytes .../collisions/collision_data_v1.2.gz.png | Bin 1697 -> 0 bytes .../misc/collisions/collision_data_v1.3.gz | Bin 806762 -> 0 bytes .../collisions/collision_data_v1.3.gz.png | Bin 1751 -> 0 bytes .../libbloom/misc/collisions/dograph | 14 - .../libbloom/misc/test/basic.c | 58 - .../libbloom/misc/test/test.c | 289 - .../libbloom/murmur2/MurmurHash2.c | 64 - .../shadowsocks-libev/libbloom/murmur2/README | 9 - .../libbloom/murmur2/murmurhash2.h | 7 - .../libcork/.buzzy/links.yaml | 2 - .../libcork/.buzzy/package.yaml | 5 - .../shadowsocks-libev/libcork/.gitignore | 15 - .../shadowsocks-libev/libcork/.travis.yml | 20 - .../shadowsocks-libev/libcork/.travis/install | 15 - .../shadowsocks-libev/libcork/.travis/test | 27 - .../shadowsocks-libev/libcork/CMakeLists.txt | 128 - .../shadowsocks-libev/libcork/COPYING | 30 - .../shadowsocks-libev/libcork/INSTALL | 57 - .../shadowsocks-libev/libcork/README.markdown | 67 - .../libcork/cmake/FindCTargets.cmake | 215 - .../libcork/cmake/FindParseArguments.cmake | 51 - .../libcork/cmake/FindPrereqs.cmake | 76 - .../libcork/docs/.gitattributes | 2 - .../libcork/docs/CMakeLists.txt | 101 - .../libcork/docs/old/CMakeLists.txt | 87 - .../libcork/docs/old/_static/.keep | 0 .../libcork/docs/old/_static/docco-sphinx.css | 305 - .../libcork/docs/old/_static/pygments.css | 61 - .../libcork/docs/old/_templates/.keep | 0 .../libcork/docs/old/allocation.rst | 344 - .../libcork/docs/old/array.rst | 148 - .../libcork/docs/old/attributes.rst | 119 - .../libcork/docs/old/basic-types.rst | 120 - .../libcork/docs/old/bitset.rst | 67 - .../libcork/docs/old/buffer.rst | 261 - .../libcork/docs/old/byte-order.rst | 144 - .../libcork/docs/old/cli.rst | 342 - .../libcork/docs/old/conf.py | 80 - .../libcork/docs/old/config.rst | 176 - .../libcork/docs/old/dllist.rst | 296 - .../shadowsocks-libev/libcork/docs/old/ds.rst | 26 - .../libcork/docs/old/errors.rst | 479 - .../libcork/docs/old/files.rst | 414 - .../shadowsocks-libev/libcork/docs/old/gc.rst | 422 - .../libcork/docs/old/hash-table.rst | 398 - .../libcork/docs/old/hash-values.rst | 111 - .../libcork/docs/old/index.rst | 59 - .../libcork/docs/old/int128.rst | 145 - .../libcork/docs/old/managed-buffer.rst | 125 - .../libcork/docs/old/mempool.rst | 197 - .../libcork/docs/old/net-addresses.rst | 134 - .../libcork/docs/old/process.rst | 193 - .../libcork/docs/old/ring-buffer.rst | 73 - .../libcork/docs/old/slice.rst | 254 - .../libcork/docs/old/stream.rst | 228 - .../libcork/docs/old/subprocess.rst | 204 - .../libcork/docs/old/threads.rst | 329 - .../libcork/docs/old/timestamps.rst | 97 - .../libcork/docs/old/unique-ids.rst | 90 - .../libcork/docs/old/versions.rst | 74 - .../libcork/docs/old/visibility.rst | 121 - .../libcork/extras/hashstring.py | 78 - .../libcork/include/CMakeLists.txt | 20 - .../libcork/include/libcork/cli.h | 18 - .../libcork/include/libcork/cli/commands.h | 61 - .../libcork/include/libcork/config.h | 18 - .../libcork/include/libcork/config/arch.h | 45 - .../libcork/include/libcork/config/bsd.h | 34 - .../libcork/include/libcork/config/config.h | 82 - .../libcork/include/libcork/config/gcc.h | 91 - .../libcork/include/libcork/config/linux.h | 38 - .../libcork/include/libcork/config/macosx.h | 34 - .../libcork/include/libcork/config/mingw32.h | 52 - .../libcork/include/libcork/config/solaris.h | 34 - .../libcork/include/libcork/config/version.h | 25 - .../include/libcork/config/version.h.in | 25 - .../libcork/include/libcork/core.h | 29 - .../libcork/include/libcork/core/allocator.h | 409 - .../libcork/include/libcork/core/api.h | 56 - .../libcork/include/libcork/core/attributes.h | 172 - .../libcork/include/libcork/core/byte-order.h | 186 - .../libcork/include/libcork/core/callbacks.h | 46 - .../libcork/include/libcork/core/error.h | 139 - .../libcork/include/libcork/core/gc.h | 67 - .../libcork/include/libcork/core/hash.h | 388 - .../libcork/include/libcork/core/id.h | 35 - .../libcork/include/libcork/core/mempool.h | 71 - .../include/libcork/core/net-addresses.h | 147 - .../libcork/include/libcork/core/timestamp.h | 87 - .../libcork/include/libcork/core/types.h | 82 - .../libcork/include/libcork/core/u128.h | 227 - .../libcork/include/libcork/ds.h | 26 - .../libcork/include/libcork/ds/array.h | 161 - .../libcork/include/libcork/ds/bitset.h | 70 - .../libcork/include/libcork/ds/buffer.h | 163 - .../libcork/include/libcork/ds/dllist.h | 151 - .../libcork/include/libcork/ds/hash-table.h | 159 - .../include/libcork/ds/managed-buffer.h | 76 - .../libcork/include/libcork/ds/ring-buffer.h | 60 - .../libcork/include/libcork/ds/slice.h | 151 - .../libcork/include/libcork/ds/stream.h | 64 - .../libcork/include/libcork/helpers/errors.h | 142 - .../libcork/include/libcork/helpers/gc.h | 51 - .../libcork/include/libcork/helpers/mingw.h | 21 - .../libcork/include/libcork/helpers/posix.h | 87 - .../libcork/include/libcork/os.h | 20 - .../libcork/include/libcork/os/files.h | 271 - .../libcork/include/libcork/os/process.h | 28 - .../libcork/include/libcork/os/subprocess.h | 197 - .../libcork/include/libcork/threads.h | 19 - .../libcork/include/libcork/threads/atomics.h | 50 - .../libcork/include/libcork/threads/basics.h | 221 - .../shadowsocks-libev/libcork/make-dist.sh | 12 - .../shadowsocks-libev/libcork/run.sh | 46 - .../libcork/share/CMakeLists.txt | 12 - .../libcork/share/valgrind/libcork.supp | 8 - .../libcork/src/APPNAME.pc.in | 13 - .../libcork/src/CMakeLists.txt | 115 - .../libcork/src/cork-hash/cork-hash.c | 122 - .../libcork/src/cork-initializer/init1.c | 18 - .../libcork/src/cork-initializer/init2.c | 18 - .../libcork/src/cork-initializer/main.c | 16 - .../libcork/src/cork-test/cork-test.c | 677 - .../libcork/src/libcork.pc.in | 14 - .../libcork/src/libcork/cli/commands.c | 225 - .../libcork/src/libcork/core/allocator.c | 421 - .../libcork/src/libcork/core/error.c | 246 - .../libcork/src/libcork/core/gc.c | 406 - .../libcork/src/libcork/core/hash.c | 20 - .../libcork/src/libcork/core/ip-address.c | 536 - .../libcork/src/libcork/core/mempool.c | 198 - .../libcork/src/libcork/core/timestamp.c | 163 - .../libcork/src/libcork/core/u128.c | 85 - .../libcork/src/libcork/core/version.c | 28 - .../libcork/src/libcork/ds/array.c | 378 - .../libcork/src/libcork/ds/bitset.c | 62 - .../libcork/src/libcork/ds/buffer.c | 471 - .../libcork/src/libcork/ds/dllist.c | 63 - .../libcork/src/libcork/ds/file-stream.c | 214 - .../libcork/src/libcork/ds/hash-table.c | 689 - .../libcork/src/libcork/ds/managed-buffer.c | 240 - .../libcork/src/libcork/ds/ring-buffer.c | 87 - .../libcork/src/libcork/ds/slice.c | 296 - .../src/libcork/posix/directory-walker.c | 122 - .../libcork/src/libcork/posix/env.c | 212 - .../libcork/src/libcork/posix/exec.c | 189 - .../libcork/src/libcork/posix/files.c | 892 -- .../libcork/src/libcork/posix/mingw.c | 270 - .../libcork/src/libcork/posix/process.c | 116 - .../libcork/src/libcork/posix/subprocess.c | 674 - .../libcork/src/libcork/pthreads/thread.c | 223 - .../libcork/tests/.gitattributes | 2 - .../libcork/tests/.gitignore | 1 - .../libcork/tests/CMakeLists.txt | 82 - .../libcork/tests/COPYING.cram.txt | 340 - .../shadowsocks-libev/libcork/tests/ccram | 31 - .../libcork/tests/cork-hash.t | 10 - .../libcork/tests/cork-initializer.t | 6 - .../libcork/tests/cork-test/cleanup.t | 7 - .../tests/cork-test/directory-watcher.t | 59 - .../libcork/tests/cork-test/help1-c1-s1.t | 4 - .../libcork/tests/cork-test/help1-c1-s2.t | 4 - .../libcork/tests/cork-test/help1-c1.t | 6 - .../libcork/tests/cork-test/help1-c2.t | 4 - .../libcork/tests/cork-test/help1-root.t | 14 - .../libcork/tests/cork-test/help2-c1-s1.t | 4 - .../libcork/tests/cork-test/help2-c1-s2.t | 4 - .../libcork/tests/cork-test/help2-c1.t | 6 - .../libcork/tests/cork-test/help2-c2.t | 4 - .../libcork/tests/cork-test/help2-root.t | 14 - .../libcork/tests/cork-test/help3-c1-s1.t | 4 - .../libcork/tests/cork-test/help3-c1-s2.t | 4 - .../libcork/tests/cork-test/help3-c1.t | 6 - .../libcork/tests/cork-test/help3-c2.t | 4 - .../libcork/tests/cork-test/help3-root.t | 14 - .../libcork/tests/cork-test/no-command-c1.t | 8 - .../libcork/tests/cork-test/no-command-root.t | 16 - .../libcork/tests/cork-test/run-c1-s1-f-t.t | 4 - .../libcork/tests/cork-test/run-c1-s1-f.t | 3 - .../libcork/tests/cork-test/run-c1-s1-t.t | 3 - .../libcork/tests/cork-test/run-c1-s1-test.t | 3 - .../libcork/tests/cork-test/run-c1-s1.t | 2 - .../libcork/tests/cork-test/run-c1-s2-f.t | 6 - .../libcork/tests/cork-test/run-c1-s2-file.t | 6 - .../libcork/tests/cork-test/run-c1-s2.t | 2 - .../libcork/tests/cork-test/run-c2.t | 2 - .../libcork/tests/cork-test/run-find-01.t | 23 - .../libcork/tests/cork-test/run-find-all-01.t | 19 - .../libcork/tests/cork-test/run-mkdir-01.t | 40 - .../libcork/tests/cork-test/run-paths-01.t | 47 - .../libcork/tests/cork-test/run-pwd-01.t | 3 - .../libcork/tests/cork-test/run-rm-01.t | 29 - .../libcork/tests/cork-test/run-sub-01.t | 3 - .../libcork/tests/cork-test/run-sub-02.t | 2 - .../libcork/tests/cork-test/run-sub-03.t | 3 - .../libcork/tests/cork-test/run-sub-04.t | 3 - .../libcork/tests/cork-test/run-sub-05.t | 3 - .../libcork/tests/cork-test/run-sub-06.t | 3 - .../shadowsocks-libev/libcork/tests/cram.py | 516 - .../shadowsocks-libev/libcork/tests/helpers.h | 96 - .../libcork/tests/test-array.c | 318 - .../libcork/tests/test-bitset.c | 115 - .../libcork/tests/test-buffer.c | 348 - .../libcork/tests/test-core.c | 1158 -- .../libcork/tests/test-dllist.c | 196 - .../libcork/tests/test-files.c | 420 - .../shadowsocks-libev/libcork/tests/test-gc.c | 159 - .../libcork/tests/test-hash-table.c | 366 - .../libcork/tests/test-input.txt | 2 - .../libcork/tests/test-managed-buffer.c | 339 - .../libcork/tests/test-mempool.c | 172 - .../libcork/tests/test-ring-buffer.c | 148 - .../libcork/tests/test-slice.c | 137 - .../libcork/tests/test-subprocess.c | 279 - .../libcork/tests/test-threads.c | 332 - .../shadowsocks-libev/libcork/tests/tile-test | 35 - .../shadowsocks-libev/libcork/version.sh | 33 - .../libipset/.buzzy/links.yaml | 4 - .../libipset/.buzzy/package.yaml | 7 - .../shadowsocks-libev/libipset/.gitignore | 14 - .../shadowsocks-libev/libipset/.travis.yml | 18 - .../shadowsocks-libev/libipset/CMakeLists.txt | 100 - .../shadowsocks-libev/libipset/INSTALL | 34 - .../shadowsocks-libev/libipset/LICENSE.txt | 30 - .../libipset/README.markdown | 12 - .../libipset/docs/CMakeLists.txt | 102 - .../libipset/docs/commands.rst | 173 - .../libipset/docs/file-format.rst | 162 - .../shadowsocks-libev/libipset/docs/maps.rst | 153 - .../shadowsocks-libev/libipset/docs/sets.rst | 234 - .../libipset/examples/.gitignore | 1 - .../libipset/examples/CMakeLists.txt | 16 - .../libipset/examples/ipv4-set-size.c | 90 - .../libipset/include/CMakeLists.txt | 12 - .../libipset/include/ipset/bdd/nodes.h | 536 - .../libipset/include/ipset/bits.h | 58 - .../libipset/include/ipset/errors.h | 31 - .../libipset/include/ipset/ipset.h | 265 - .../libipset/include/ipset/logging.h | 31 - .../libipset/python/.gitignore | 4 - .../libipset/python/MANIFEST.in | 1 - .../libipset/python/setup.cfg | 2 - .../libipset/python/setup.py | 23 - .../libipset/python/src/.gitignore | 1 - .../libipset/python/src/ipset/__init__.py | 320 - .../libipset/python/src/ipset/c.py | 111 - .../python/src/ipset/tests/__init__.py | 27 - .../libipset/python/src/ipset/tests/c.py | 95 - .../libipset/python/src/ipset/tests/obj.py | 116 - .../libipset/python/tests/empty.map | 14 - .../libipset/python/tests/empty.set | 13 - .../libipset/python/tests/just1-v4.map | 47 - .../libipset/python/tests/just1-v4.set | 45 - .../libipset/python/tests/just1-v6.map | 143 - .../libipset/python/tests/just1-v6.set | 141 - .../libipset/python/version.py | 102 - .../shadowsocks-libev/libipset/run.sh | 46 - .../libipset/share/CMakeLists.txt | 12 - .../libipset/src/CMakeLists.txt | 108 - .../libipset/src/ipset.pc.in | 14 - .../libipset/src/ipsetbuild/ipsetbuild.c | 512 - .../libipset/src/ipsetcat/ipsetcat.c | 229 - .../libipset/src/ipsetdot/ipsetdot.c | 184 - .../libipset/src/libipset/bdd/assignments.c | 134 - .../libipset/src/libipset/bdd/basics.c | 467 - .../libipset/src/libipset/bdd/bdd-iterator.c | 129 - .../libipset/src/libipset/bdd/expanded.c | 138 - .../libipset/src/libipset/bdd/reachable.c | 83 - .../libipset/src/libipset/bdd/read.c | 350 - .../libipset/src/libipset/bdd/write.c | 556 - .../libipset/src/libipset/general.c | 21 - .../libipset/src/libipset/map/allocation.c | 50 - .../src/libipset/map/inspection-template.c.in | 88 - .../libipset/src/libipset/map/inspection.c | 69 - .../libipset/src/libipset/map/ipv4_map.c | 37 - .../libipset/src/libipset/map/ipv6_map.c | 37 - .../libipset/src/libipset/map/storage.c | 101 - .../libipset/src/libipset/set/allocation.c | 49 - .../src/libipset/set/inspection-template.c.in | 130 - .../libipset/src/libipset/set/inspection.c | 91 - .../libipset/src/libipset/set/ipv4_set.c | 37 - .../libipset/src/libipset/set/ipv6_set.c | 38 - .../libipset/src/libipset/set/iterator.c | 342 - .../libipset/src/libipset/set/storage.c | 107 - .../libipset/tests/.gitattributes | 1 - .../libipset/tests/.gitignore | 2 - .../libipset/tests/CMakeLists.txt | 65 - .../shadowsocks-libev/libipset/tests/ccram | 20 - .../libipset/tests/dot/10.0.5.64-30/command | 1 - .../libipset/tests/dot/10.0.5.64-30/err | 0 .../libipset/tests/dot/10.0.5.64-30/in | 3 - .../libipset/tests/dot/10.0.5.64-30/out | 134 - .../libipset/tests/dot/command | 1 - .../libipset/tests/dot/empty/command | 1 - .../libipset/tests/dot/empty/err | 0 .../libipset/tests/dot/empty/in | 0 .../libipset/tests/dot/empty/out | 2 - .../libipset/tests/dot/universe/command | 1 - .../libipset/tests/dot/universe/err | 0 .../libipset/tests/dot/universe/in | 2 - .../libipset/tests/dot/universe/out | 3 - .../libipset/tests/errors/empty-cidr/command | 1 - .../libipset/tests/errors/empty-cidr/err | 2 - .../libipset/tests/errors/empty-cidr/in | 1 - .../libipset/tests/errors/empty-cidr/out | 0 .../tests/errors/ipsetcat-empty-input/command | 1 - .../tests/errors/ipsetcat-empty-input/err | 2 - .../tests/errors/ipsetcat-empty-input/in | 0 .../tests/errors/ipsetcat-empty-input/out | 0 .../errors/ipsetcat-file-not-found/command | 1 - .../tests/errors/ipsetcat-file-not-found/err | 2 - .../tests/errors/ipsetcat-file-not-found/in | 0 .../tests/errors/ipsetcat-file-not-found/out | 0 .../tests/errors/ipsetcat-no-input/command | 1 - .../tests/errors/ipsetcat-no-input/err | 2 - .../tests/errors/ipsetcat-no-input/in | 0 .../tests/errors/ipsetcat-no-input/out | 0 .../tests/errors/ipsetdot-empty-input/command | 1 - .../tests/errors/ipsetdot-empty-input/err | 2 - .../tests/errors/ipsetdot-empty-input/in | 0 .../tests/errors/ipsetdot-empty-input/out | 0 .../errors/ipsetdot-file-not-found/command | 1 - .../tests/errors/ipsetdot-file-not-found/err | 2 - .../tests/errors/ipsetdot-file-not-found/in | 0 .../tests/errors/ipsetdot-file-not-found/out | 0 .../tests/errors/ipsetdot-no-input/command | 1 - .../tests/errors/ipsetdot-no-input/err | 2 - .../tests/errors/ipsetdot-no-input/in | 0 .../tests/errors/ipsetdot-no-input/out | 0 .../tests/errors/nonnumeric-cidr/command | 1 - .../libipset/tests/errors/nonnumeric-cidr/err | 2 - .../libipset/tests/errors/nonnumeric-cidr/in | 1 - .../libipset/tests/errors/nonnumeric-cidr/out | 0 .../tests/round-trip/10.0.5.64-30/command | 1 - .../tests/round-trip/10.0.5.64-30/err | 0 .../libipset/tests/round-trip/10.0.5.64-30/in | 3 - .../tests/round-trip/10.0.5.64-30/out | 2 - .../libipset/tests/round-trip/command | 1 - .../libipset/tests/round-trip/empty/command | 1 - .../libipset/tests/round-trip/empty/err | 0 .../libipset/tests/round-trip/empty/in | 0 .../libipset/tests/round-trip/empty/out | 0 .../tests/round-trip/idempotent-01a/command | 1 - .../tests/round-trip/idempotent-01a/err | 0 .../tests/round-trip/idempotent-01a/in | 2 - .../tests/round-trip/idempotent-01a/out | 1 - .../tests/round-trip/idempotent-01b/command | 1 - .../tests/round-trip/idempotent-01b/err | 0 .../tests/round-trip/idempotent-01b/in | 2 - .../tests/round-trip/idempotent-01b/out | 1 - .../tests/round-trip/idempotent-02a/command | 1 - .../tests/round-trip/idempotent-02a/err | 0 .../tests/round-trip/idempotent-02a/in | 2 - .../tests/round-trip/idempotent-02a/out | 1 - .../tests/round-trip/idempotent-02b/command | 1 - .../tests/round-trip/idempotent-02b/err | 0 .../tests/round-trip/idempotent-02b/in | 2 - .../tests/round-trip/idempotent-02b/out | 1 - .../tests/round-trip/universe/command | 1 - .../libipset/tests/round-trip/universe/err | 0 .../libipset/tests/round-trip/universe/in | 2 - .../libipset/tests/round-trip/universe/out | 2 - .../libipset/tests/test-assignment.c | 269 - .../libipset/tests/test-bdd.c | 909 -- .../libipset/tests/test-ipmap.c | 847 -- .../libipset/tests/test-ipset.c | 847 -- .../libipset/tests/test-iterator.c | 464 - .../libipset/tests/tile-test | 35 - .../shadowsocks-libev/libipset/version.sh | 33 - .../shadowsocks-libev/src/CMakeLists.txt | 275 - .../ShadowSocks/shadowsocks-libev/src/acl.c | 355 - .../ShadowSocks/shadowsocks-libev/src/acl.h | 40 - .../ShadowSocks/shadowsocks-libev/src/aead.c | 773 -- .../ShadowSocks/shadowsocks-libev/src/aead.h | 47 - .../shadowsocks-libev/src/android.c | 138 - .../shadowsocks-libev/src/base64.c | 106 - .../shadowsocks-libev/src/base64.h | 54 - .../ShadowSocks/shadowsocks-libev/src/cache.c | 306 - .../ShadowSocks/shadowsocks-libev/src/cache.h | 67 - .../shadowsocks-libev/src/common.h | 76 - .../shadowsocks-libev/src/crypto.c | 393 - .../shadowsocks-libev/src/crypto.h | 160 - .../ShadowSocks/shadowsocks-libev/src/jconf.c | 363 - .../ShadowSocks/shadowsocks-libev/src/jconf.h | 95 - .../ShadowSocks/shadowsocks-libev/src/json.c | 1017 -- .../ShadowSocks/shadowsocks-libev/src/json.h | 283 - .../ShadowSocks/shadowsocks-libev/src/local.c | 2111 ---- .../ShadowSocks/shadowsocks-libev/src/local.h | 104 - .../shadowsocks-libev/src/manager.c | 1285 -- .../shadowsocks-libev/src/manager.h | 80 - .../shadowsocks-libev/src/netutils.c | 315 - .../shadowsocks-libev/src/netutils.h | 120 - .../shadowsocks-libev/src/plugin.c | 351 - .../shadowsocks-libev/src/plugin.h | 80 - .../shadowsocks-libev/src/ppbloom.c | 102 - .../shadowsocks-libev/src/ppbloom.h | 31 - .../ShadowSocks/shadowsocks-libev/src/redir.c | 1308 -- .../ShadowSocks/shadowsocks-libev/src/redir.h | 82 - .../shadowsocks-libev/src/resolv.c | 497 - .../shadowsocks-libev/src/resolv.h | 46 - .../ShadowSocks/shadowsocks-libev/src/rule.c | 133 - .../ShadowSocks/shadowsocks-libev/src/rule.h | 59 - .../shadowsocks-libev/src/server.c | 2134 ---- .../shadowsocks-libev/src/server.h | 121 - .../shadowsocks-libev/src/shadowsocks.h | 101 - .../shadowsocks-libev/src/socks5.h | 75 - .../ShadowSocks/shadowsocks-libev/src/ss-nat | 246 - .../shadowsocks-libev/src/stream.c | 697 - .../shadowsocks-libev/src/stream.h | 54 - .../shadowsocks-libev/src/tunnel.c | 1370 -- .../shadowsocks-libev/src/tunnel.h | 91 - .../shadowsocks-libev/src/udprelay.c | 1458 --- .../shadowsocks-libev/src/udprelay.h | 93 - .../shadowsocks-libev/src/uthash.h | 1074 -- .../ShadowSocks/shadowsocks-libev/src/utils.c | 568 - .../ShadowSocks/shadowsocks-libev/src/utils.h | 254 - .../shadowsocks-libev/src/winsock.c | 246 - .../shadowsocks-libev/src/winsock.h | 123 - client/3rd/outline-go-tun2socks | 1 - 1912 files changed, 392130 deletions(-) delete mode 160000 client/3rd/CocoaAsyncSocket delete mode 160000 client/3rd/CocoaLumberjack delete mode 100644 client/3rd/PacketProcessor/PacketProcessor.xcodeproj/project.pbxproj delete mode 100644 client/3rd/PacketProcessor/PacketProcessor.xcodeproj/project.xcworkspace/contents.xcworkspacedata delete mode 100644 client/3rd/PacketProcessor/PacketProcessor.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist delete mode 100644 client/3rd/PacketProcessor/PacketProcessor.xcodeproj/project.xcworkspace/xcuserdata/sanchez.xcuserdatad/UserInterfaceState.xcuserstate delete mode 100644 client/3rd/PacketProcessor/PacketProcessor.xcodeproj/xcuserdata/sanchez.xcuserdatad/xcschemes/xcschememanagement.plist delete mode 100755 client/3rd/PacketProcessor/PacketProcessor/CocoaAsyncSocket/CocoaAsyncSocket.framework/CocoaAsyncSocket delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/CocoaAsyncSocket/CocoaAsyncSocket.framework/Headers/CocoaAsyncSocket.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/CocoaAsyncSocket/CocoaAsyncSocket.framework/Headers/GCDAsyncSocket.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/CocoaAsyncSocket/CocoaAsyncSocket.framework/Headers/GCDAsyncUdpSocket.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/CocoaAsyncSocket/CocoaAsyncSocket.framework/Info.plist delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/CocoaAsyncSocket/CocoaAsyncSocket.framework/Modules/module.modulemap delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/CocoaAsyncSocket/CocoaAsyncSocket.framework/_CodeSignature/CodeResources delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/Info.plist delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/PacketProcessor.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/TunnelInterface.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/TunnelInterface.m delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/base/BLog.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/base/BLog.m delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/base/BLog_syslog.c delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/base/BLog_syslog.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/base/BMutex.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/base/BPending.c delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/base/BPending.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/base/BPending_list.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/base/DebugObject.c delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/base/DebugObject.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/flow/BufferWriter.c delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/flow/BufferWriter.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/flow/PacketBuffer.c delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/flow/PacketBuffer.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/flow/PacketPassConnector.c delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/flow/PacketPassConnector.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/flow/PacketPassFairQueue.c delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/flow/PacketPassFairQueue.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/flow/PacketPassFairQueue_tree.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/flow/PacketPassInterface.c delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/flow/PacketPassInterface.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/flow/PacketProtoDecoder.c delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/flow/PacketProtoDecoder.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/flow/PacketProtoEncoder.c delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/flow/PacketProtoEncoder.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/flow/PacketProtoFlow.c delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/flow/PacketProtoFlow.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/flow/PacketRecvInterface.c delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/flow/PacketRecvInterface.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/flow/PacketStreamSender.c delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/flow/PacketStreamSender.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/flow/SinglePacketBuffer.c delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/flow/SinglePacketBuffer.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/flow/StreamPassInterface.c delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/flow/StreamPassInterface.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/flow/StreamRecvInterface.c delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/flow/StreamRecvInterface.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/flowextra/PacketPassInactivityMonitor.c delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/flowextra/PacketPassInactivityMonitor.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_BArpProbe.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_BConnection.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_BDHCPClient.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_BDHCPClientCore.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_BDatagram.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_BEncryption.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_BInputProcess.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_BLockReactor.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_BNetwork.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_BPredicate.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_BProcess.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_BReactor.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_BSSLConnection.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_BSignal.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_BSocksClient.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_BTap.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_BThreadSignal.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_BThreadWork.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_BTime.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_BUnixSignal.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_DPReceive.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_DPRelay.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_DataProto.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_DatagramPeerIO.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_FragmentProtoAssembler.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_FrameDecider.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_LineBuffer.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_Listener.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_NCDBuildProgram.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_NCDConfigParser.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_NCDConfigTokenizer.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_NCDIfConfig.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_NCDInterfaceMonitor.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_NCDModuleIndex.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_NCDModuleProcess.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_NCDPlaceholderDb.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_NCDRequest.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_NCDRequestClient.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_NCDRfkillMonitor.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_NCDUdevCache.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_NCDUdevManager.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_NCDUdevMonitor.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_NCDUdevMonitorParser.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_NCDVal.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_NCDValGenerator.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_NCDValParser.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_PRStreamSink.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_PRStreamSource.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_PacketProtoDecoder.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_PasswordListener.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_PeerChat.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_SPProtoDecoder.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ServerConnection.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_SocksUdpGwClient.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_StreamPeerIO.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_UdpGwClient.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_addr.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_client.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_dostest_attacker.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_dostest_server.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_flooder.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_lwip.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_alias.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_arithmetic.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_assert.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_backtrack.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_basic_functions.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_blocker.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_buffer.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_call2.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_choose.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_concat.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_daemon.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_depend.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_depend_scope.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_dynamic_depend.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_exit.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_explode.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_file.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_file_open.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_foreach.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_from_string.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_getargs.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_getenv.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_if.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_imperative.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_implode.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_index.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_list.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_load_module.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_log.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_log_msg.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_logical.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_multidepend.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_net_backend_badvpn.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_net_backend_rfkill.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_net_backend_waitdevice.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_net_backend_waitlink.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_net_backend_wpa_supplicant.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_net_dns.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_net_iptables.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_net_ipv4_addr.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_net_ipv4_addr_in_network.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_net_ipv4_arp_probe.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_net_ipv4_dhcp.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_net_ipv4_route.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_net_ipv6_addr.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_net_ipv6_addr_in_network.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_net_ipv6_route.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_net_ipv6_wait_dynamic_addr.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_net_up.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_net_watch_interfaces.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_netmask.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_objref.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_ondemand.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_parse.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_print.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_process_manager.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_reboot.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_ref.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_regex_match.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_request.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_run.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_runonce.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_sleep.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_socket.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_spawn.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_strcmp.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_substr.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_sys_evdev.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_sys_request_client.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_sys_request_server.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_sys_start_process.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_sys_watch_directory.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_sys_watch_input.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_sys_watch_usb.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_timer.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_to_string.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_try.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_value.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_valuemetic.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_var.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_nsskey.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_server.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_tun2socks.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_udpgw.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channels_defines.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channels_list.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/bproto_addr.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/bproto_bproto_test.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/bproto_msgproto.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/custom/arch/cc.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/custom/arch/perf.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/custom/lwipopts.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/custom/sys.c delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/core/def.c delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/core/inet_chksum.c delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/core/init.c delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/core/ipv4/icmp.c delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/core/ipv4/ip4.c delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/core/ipv4/ip4_addr.c delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/core/ipv4/ip_frag.c delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/core/ipv6/icmp6.c delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/core/ipv6/ip6.c delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/core/ipv6/ip6_addr.c delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/core/ipv6/ip6_frag.c delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/core/ipv6/nd6.c delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/core/mem.c delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/core/memp.c delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/core/netif.c delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/core/pbuf.c delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/core/stats.c delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/core/tcp.c delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/core/tcp_in.c delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/core/tcp_out.c delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/core/timers.c delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/core/udp.c delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/ipv4/lwip/autoip.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/ipv4/lwip/icmp.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/ipv4/lwip/igmp.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/ipv4/lwip/inet.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/ipv4/lwip/ip4.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/ipv4/lwip/ip4_addr.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/ipv4/lwip/ip_frag.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/ipv6/lwip/dhcp6.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/ipv6/lwip/ethip6.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/ipv6/lwip/icmp6.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/ipv6/lwip/inet6.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/ipv6/lwip/ip6.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/ipv6/lwip/ip6_addr.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/ipv6/lwip/ip6_frag.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/ipv6/lwip/mld6.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/ipv6/lwip/nd6.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/lwip/api.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/lwip/api_msg.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/lwip/arch.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/lwip/debug.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/lwip/def.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/lwip/dhcp.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/lwip/dns.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/lwip/err.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/lwip/inet_chksum.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/lwip/init.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/lwip/ip.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/lwip/ip_addr.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/lwip/mem.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/lwip/memp.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/lwip/memp_std.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/lwip/netbuf.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/lwip/netdb.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/lwip/netif.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/lwip/netifapi.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/lwip/opt.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/lwip/pbuf.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/lwip/raw.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/lwip/sio.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/lwip/snmp.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/lwip/snmp_asn1.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/lwip/snmp_msg.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/lwip/snmp_structs.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/lwip/sockets.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/lwip/stats.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/lwip/sys.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/lwip/tcp.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/lwip/tcp_impl.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/lwip/tcpip.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/lwip/timers.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/lwip/udp.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/netif/etharp.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/netif/ppp_oe.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/netif/slipif.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/posix/netdb.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/posix/sys/socket.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/BRefTarget.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/Utf16Decoder.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/Utf16Encoder.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/Utf8Decoder.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/Utf8Encoder.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/arp_proto.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/array_length.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/ascii_utils.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/balign.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/balloc.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/blimits.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/bsize.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/bsort.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/bstring.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/byteorder.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/cmdline.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/compare.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/concat_strings.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/dead.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/debug.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/debugcounter.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/debugerror.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/dhcp_proto.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/ethernet_proto.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/exparray.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/expstring.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/find_char.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/find_program.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/get_iface_info.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/grow_array.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/hashfun.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/igmp_proto.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/ipaddr.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/ipaddr6.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/ipv4_proto.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/ipv6_proto.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/loggers_string.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/loglevel.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/maxalign.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/memref.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/merge.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/minmax.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/modadd.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/mswsock.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/nonblocking.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/nsskey.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/offset.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/open_standard_streams.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/overflow.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/packed.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/parse_number.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/print_macros.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/read_file.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/read_write_int.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/socks_proto.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/sslsocket.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/stdbuf_cmdline.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/strdup.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/string_begins_with.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/substring.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/udp_proto.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/unicode_funcs.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/version.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/write_file.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/protocol/addr.bproto delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/protocol/addr.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/protocol/dataproto.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/protocol/fragmentproto.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/protocol/msgproto.bproto delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/protocol/msgproto.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/protocol/packetproto.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/protocol/requestproto.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/protocol/scproto.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/protocol/spproto.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/protocol/udpgw_proto.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/socksclient/BSocksClient.c delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/socksclient/BSocksClient.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/structure/BAVL.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/structure/CAvl.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/structure/CAvl_decl.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/structure/CAvl_footer.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/structure/CAvl_header.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/structure/CAvl_impl.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/structure/CHash.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/structure/CHash_decl.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/structure/CHash_footer.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/structure/CHash_header.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/structure/CHash_impl.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/structure/ChunkBuffer2.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/structure/IndexedList.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/structure/IndexedList_tree.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/structure/LinkedList0.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/structure/LinkedList1.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/structure/LinkedList3.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/structure/SAvl.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/structure/SAvl_decl.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/structure/SAvl_footer.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/structure/SAvl_header.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/structure/SAvl_impl.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/structure/SAvl_tree.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/structure/SLinkedList.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/structure/SLinkedList_decl.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/structure/SLinkedList_footer.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/structure/SLinkedList_header.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/structure/SLinkedList_impl.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/structure/Vector.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/structure/Vector_decl.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/structure/Vector_footer.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/structure/Vector_header.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/structure/Vector_impl.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/system/BAddr.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/system/BConnection.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/system/BConnection_common.c delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/system/BConnection_unix.c delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/system/BConnection_unix.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/system/BDatagram.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/system/BDatagram_unix.c delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/system/BDatagram_unix.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/system/BNetwork.c delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/system/BNetwork.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/system/BReactor.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/system/BReactor_badvpn.c delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/system/BReactor_badvpn.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/system/BReactor_badvpn_timerstree.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/system/BSignal.c delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/system/BSignal.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/system/BTime.c delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/system/BTime.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/system/BUnixSignal.c delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/system/BUnixSignal.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/tun2socks/SocksUdpGwClient.c delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/tun2socks/SocksUdpGwClient.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/tun2socks/tun2socks.c delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/tun2socks/tun2socks.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/tuntap/BTap.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/tuntap/BTap.m delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/udpgw/udpgw.c delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/udpgw/udpgw.h delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/udpgw_client/UdpGwClient.c delete mode 100644 client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/udpgw_client/UdpGwClient.h delete mode 160000 client/3rd/ShadowPath delete mode 100644 client/3rd/ShadowSocks/ShadowSocks.xcodeproj/project.pbxproj delete mode 100644 client/3rd/ShadowSocks/ShadowSocks.xcodeproj/project.xcworkspace/contents.xcworkspacedata delete mode 100644 client/3rd/ShadowSocks/ShadowSocks.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist delete mode 100644 client/3rd/ShadowSocks/ShadowSocks.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings delete mode 100644 client/3rd/ShadowSocks/ShadowSocks.xcodeproj/project.xcworkspace/xcuserdata/sanchez.xcuserdatad/UserInterfaceState.xcuserstate delete mode 100644 client/3rd/ShadowSocks/ShadowSocks.xcodeproj/project.xcworkspace/xcuserdata/sanchez.xcuserdatad/WorkspaceSettings.xcsettings delete mode 100644 client/3rd/ShadowSocks/ShadowSocks.xcodeproj/xcshareddata/xcschemes/ShadowSocks.xcscheme delete mode 100644 client/3rd/ShadowSocks/ShadowSocks.xcodeproj/xcuserdata/sanchez.xcuserdatad/xcschemes/xcschememanagement.plist delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/Info.plist delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/ShadowSocks.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libcares/include/ares.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libcares/include/ares_build.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libcares/include/ares_dns.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libcares/include/ares_rules.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libcares/include/ares_version.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libcares/lib/arm64/libcares.a delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libcares/lib/armv7/libcares.a delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libcares/lib/armv7s/libcares.a delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libev/arm64/include/ev++.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libev/arm64/include/ev.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libev/arm64/include/event.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libev/arm64/lib/libev.a delete mode 100755 client/3rd/ShadowSocks/ShadowSocks/libev/arm64/lib/libev.la delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libev/arm64/share/man/man3/ev.3 delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libev/armv7/include/ev++.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libev/armv7/include/ev.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libev/armv7/include/event.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libev/armv7/lib/libev.a delete mode 100755 client/3rd/ShadowSocks/ShadowSocks/libev/armv7/lib/libev.la delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libev/armv7/share/man/man3/ev.3 delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libev/armv7s/include/ev++.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libev/armv7s/include/ev.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libev/armv7s/include/event.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libev/armv7s/lib/libev.a delete mode 100755 client/3rd/ShadowSocks/ShadowSocks/libev/armv7s/lib/libev.la delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libev/armv7s/share/man/man3/ev.3 delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/include/module.modulemap delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/core.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_aead_aegis128l.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_aead_aegis256.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_aead_aes256gcm.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_aead_chacha20poly1305.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_aead_xchacha20poly1305.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_auth.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_auth_hmacsha256.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_auth_hmacsha512.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_auth_hmacsha512256.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_box.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_box_curve25519xchacha20poly1305.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_box_curve25519xsalsa20poly1305.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_core_ed25519.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_core_hchacha20.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_core_hsalsa20.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_core_ristretto255.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_core_salsa20.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_core_salsa2012.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_core_salsa208.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_generichash.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_generichash_blake2b.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_hash.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_hash_sha256.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_hash_sha512.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_kdf.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_kdf_blake2b.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_kdf_hkdf_sha256.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_kdf_hkdf_sha512.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_kx.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_onetimeauth.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_onetimeauth_poly1305.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_pwhash.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_pwhash_argon2i.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_pwhash_argon2id.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_pwhash_scryptsalsa208sha256.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_scalarmult.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_scalarmult_curve25519.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_scalarmult_ed25519.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_scalarmult_ristretto255.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_secretbox.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_secretbox_xchacha20poly1305.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_secretbox_xsalsa20poly1305.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_secretstream_xchacha20poly1305.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_shorthash.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_shorthash_siphash24.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_sign.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_sign_ed25519.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_stream.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_stream_chacha20.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_stream_salsa20.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_stream_salsa2012.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_stream_salsa208.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_stream_xchacha20.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_stream_xsalsa20.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_verify_16.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_verify_32.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_verify_64.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/export.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/randombytes.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/randombytes_internal_random.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/randombytes_sysrandom.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/runtime.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/utils.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/version.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/module.modulemap delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/core.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_aead_aegis128l.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_aead_aegis256.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_aead_aes256gcm.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_aead_chacha20poly1305.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_aead_xchacha20poly1305.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_auth.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_auth_hmacsha256.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_auth_hmacsha512.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_auth_hmacsha512256.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_box.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_box_curve25519xchacha20poly1305.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_box_curve25519xsalsa20poly1305.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_core_ed25519.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_core_hchacha20.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_core_hsalsa20.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_core_ristretto255.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_core_salsa20.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_core_salsa2012.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_core_salsa208.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_generichash.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_generichash_blake2b.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_hash.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_hash_sha256.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_hash_sha512.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_kdf.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_kdf_blake2b.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_kdf_hkdf_sha256.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_kdf_hkdf_sha512.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_kx.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_onetimeauth.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_onetimeauth_poly1305.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_pwhash.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_pwhash_argon2i.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_pwhash_argon2id.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_pwhash_scryptsalsa208sha256.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_scalarmult.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_scalarmult_curve25519.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_scalarmult_ed25519.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_scalarmult_ristretto255.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_secretbox.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_secretbox_xchacha20poly1305.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_secretbox_xsalsa20poly1305.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_secretstream_xchacha20poly1305.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_shorthash.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_shorthash_siphash24.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_sign.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_sign_ed25519.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_stream.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_stream_chacha20.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_stream_salsa20.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_stream_salsa2012.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_stream_salsa208.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_stream_xchacha20.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_stream_xsalsa20.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_verify_16.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_verify_32.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_verify_64.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/export.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/randombytes.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/randombytes_internal_random.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/randombytes_sysrandom.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/runtime.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/utils.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/version.h delete mode 100755 client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/lib/libsodium.27.dylib delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/lib/libsodium.a delete mode 120000 client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/lib/libsodium.dylib delete mode 100755 client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/lib/libsodium.la delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/lib/pkgconfig/libsodium.pc delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/module.modulemap delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/core.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_aead_aegis128l.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_aead_aegis256.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_aead_aes256gcm.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_aead_chacha20poly1305.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_aead_xchacha20poly1305.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_auth.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_auth_hmacsha256.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_auth_hmacsha512.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_auth_hmacsha512256.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_box.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_box_curve25519xchacha20poly1305.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_box_curve25519xsalsa20poly1305.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_core_ed25519.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_core_hchacha20.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_core_hsalsa20.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_core_ristretto255.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_core_salsa20.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_core_salsa2012.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_core_salsa208.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_generichash.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_generichash_blake2b.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_hash.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_hash_sha256.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_hash_sha512.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_kdf.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_kdf_blake2b.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_kdf_hkdf_sha256.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_kdf_hkdf_sha512.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_kx.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_onetimeauth.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_onetimeauth_poly1305.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_pwhash.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_pwhash_argon2i.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_pwhash_argon2id.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_pwhash_scryptsalsa208sha256.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_scalarmult.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_scalarmult_curve25519.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_scalarmult_ed25519.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_scalarmult_ristretto255.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_secretbox.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_secretbox_xchacha20poly1305.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_secretbox_xsalsa20poly1305.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_secretstream_xchacha20poly1305.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_shorthash.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_shorthash_siphash24.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_sign.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_sign_ed25519.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_stream.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_stream_chacha20.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_stream_salsa20.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_stream_salsa2012.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_stream_salsa208.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_stream_xchacha20.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_stream_xsalsa20.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_verify_16.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_verify_32.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_verify_64.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/export.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/randombytes.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/randombytes_internal_random.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/randombytes_sysrandom.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/runtime.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/utils.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/version.h delete mode 100755 client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/lib/libsodium.27.dylib delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/lib/libsodium.a delete mode 120000 client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/lib/libsodium.dylib delete mode 100755 client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/lib/libsodium.la delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/lib/pkgconfig/libsodium.pc delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/Info.plist delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/module.modulemap delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/core.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_aead_aegis128l.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_aead_aegis256.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_aead_aes256gcm.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_aead_chacha20poly1305.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_aead_xchacha20poly1305.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_auth.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_auth_hmacsha256.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_auth_hmacsha512.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_auth_hmacsha512256.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_box.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_box_curve25519xchacha20poly1305.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_box_curve25519xsalsa20poly1305.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_core_ed25519.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_core_hchacha20.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_core_hsalsa20.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_core_ristretto255.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_core_salsa20.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_core_salsa2012.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_core_salsa208.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_generichash.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_generichash_blake2b.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_hash.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_hash_sha256.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_hash_sha512.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_kdf.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_kdf_blake2b.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_kdf_hkdf_sha256.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_kdf_hkdf_sha512.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_kx.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_onetimeauth.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_onetimeauth_poly1305.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_pwhash.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_pwhash_argon2i.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_pwhash_argon2id.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_pwhash_scryptsalsa208sha256.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_scalarmult.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_scalarmult_curve25519.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_scalarmult_ed25519.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_scalarmult_ristretto255.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_secretbox.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_secretbox_xchacha20poly1305.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_secretbox_xsalsa20poly1305.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_secretstream_xchacha20poly1305.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_shorthash.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_shorthash_siphash24.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_sign.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_sign_ed25519.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_stream.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_stream_chacha20.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_stream_salsa20.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_stream_salsa2012.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_stream_salsa208.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_stream_xchacha20.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_stream_xsalsa20.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_verify_16.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_verify_32.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_verify_64.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/export.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/randombytes.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/randombytes_internal_random.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/randombytes_sysrandom.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/runtime.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/utils.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/version.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/libsodium.a delete mode 100755 client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/libsodium.27.dylib delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/libsodium.a delete mode 120000 client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/libsodium.dylib delete mode 100755 client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/libsodium.la delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/pkgconfig/libsodium.pc delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/mbedtls/bin/libmbedcrypto-arm64.a delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/mbedtls/bin/libmbedcrypto-armv7.a delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/mbedtls/bin/libmbedcrypto-armv7s.a delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/mbedtls/bin/libmbedcrypto-i386.a delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/mbedtls/bin/libmbedcrypto-x86_64.a delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/mbedtls/bin/libmbedtls-arm64.a delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/mbedtls/bin/libmbedtls-armv7.a delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/mbedtls/bin/libmbedtls-armv7s.a delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/mbedtls/bin/libmbedtls-i386.a delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/mbedtls/bin/libmbedtls-x86_64.a delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/mbedtls/bin/libmbedx509-arm64.a delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/mbedtls/bin/libmbedx509-armv7.a delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/mbedtls/bin/libmbedx509-armv7s.a delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/mbedtls/bin/libmbedx509-i386.a delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/mbedtls/bin/libmbedx509-x86_64.a delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/.gitignore delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/CMakeLists.txt delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/LICENSE delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/aes.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/aesni.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/arc4.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/asn1.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/asn1write.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/base64.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/bignum.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/blowfish.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/bn_mul.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/camellia.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/ccm.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/certs.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/check_config.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/cipher.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/cipher_internal.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/compat-1.3.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/config.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/ctr_drbg.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/debug.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/des.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/dhm.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/ecdh.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/ecdsa.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/ecp.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/entropy.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/entropy_poll.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/error.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/gcm.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/havege.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/hmac_drbg.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/LICENSE delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/aes.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/aesni.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/arc4.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/asn1.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/asn1write.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/base64.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/bignum.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/blowfish.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/bn_mul.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/camellia.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/ccm.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/certs.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/check_config.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/cipher.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/cipher_internal.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/compat-1.3.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/config.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/ctr_drbg.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/debug.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/des.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/dhm.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/ecdh.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/ecdsa.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/ecp.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/entropy.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/entropy_poll.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/error.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/gcm.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/havege.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/hmac_drbg.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/md.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/md2.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/md4.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/md5.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/md_internal.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/memory_buffer_alloc.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/net.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/oid.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/padlock.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/pem.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/pk.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/pk_internal.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/pkcs11.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/pkcs12.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/pkcs5.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/platform.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/ripemd160.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/rsa.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/sha1.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/sha256.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/sha512.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/ssl.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/ssl_cache.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/ssl_ciphersuites.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/ssl_cookie.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/ssl_internal.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/ssl_ticket.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/threading.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/timing.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/version.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/x509.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/x509_crl.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/x509_crt.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/x509_csr.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/xtea.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/md.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/md2.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/md4.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/md5.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/md_internal.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/memory_buffer_alloc.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/net.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/oid.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/padlock.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/pem.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/pk.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/pk_internal.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/pkcs11.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/pkcs12.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/pkcs5.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/platform.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/ripemd160.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/rsa.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/sha1.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/sha256.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/sha512.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/ssl.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/ssl_cache.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/ssl_ciphersuites.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/ssl_cookie.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/ssl_internal.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/ssl_ticket.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/threading.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/timing.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/version.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/x509.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/x509_crl.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/x509_crt.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/x509_csr.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/xtea.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/mbedtls/lib/libmbedcrypto.a delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/mbedtls/lib/libmbedtls.a delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/mbedtls/lib/libmbedx509.a delete mode 100755 client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/bin/pcre-config delete mode 100755 client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/bin/pcregrep delete mode 100755 client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/bin/pcretest delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/AUTHORS delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/COPYING delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/ChangeLog delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/LICENCE delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/NEWS delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/README delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/NON-AUTOTOOLS-BUILD.txt delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/README.txt delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/index.html delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcre-config.html delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcre.html delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcre16.html delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcre32.html delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcre_assign_jit_stack.html delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcre_compile.html delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcre_compile2.html delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcre_config.html delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcre_copy_named_substring.html delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcre_copy_substring.html delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcre_dfa_exec.html delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcre_exec.html delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcre_free_study.html delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcre_free_substring.html delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcre_free_substring_list.html delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcre_fullinfo.html delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcre_get_named_substring.html delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcre_get_stringnumber.html delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcre_get_stringtable_entries.html delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcre_get_substring.html delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcre_get_substring_list.html delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcre_jit_exec.html delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcre_jit_stack_alloc.html delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcre_jit_stack_free.html delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcre_maketables.html delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcre_pattern_to_host_byte_order.html delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcre_refcount.html delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcre_study.html delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcre_utf16_to_host_byte_order.html delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcre_utf32_to_host_byte_order.html delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcre_version.html delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcreapi.html delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcrebuild.html delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcrecallout.html delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcrecompat.html delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcrecpp.html delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcredemo.html delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcregrep.html delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcrejit.html delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcrelimits.html delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcrematching.html delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcrepartial.html delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcrepattern.html delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcreperform.html delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcreposix.html delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcreprecompile.html delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcresample.html delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcrestack.html delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcresyntax.html delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcretest.html delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcreunicode.html delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/pcre-config.txt delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/pcre.txt delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/pcregrep.txt delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/pcretest.txt delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man1/pcre-config.1 delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man1/pcregrep.1 delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man1/pcretest.1 delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre.3 delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre16.3 delete mode 120000 client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre16_assign_jit_stack.3 delete mode 120000 client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre16_compile.3 delete mode 120000 client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre16_compile2.3 delete mode 120000 client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre16_config.3 delete mode 120000 client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre16_copy_named_substring.3 delete mode 120000 client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre16_copy_substring.3 delete mode 120000 client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre16_dfa_exec.3 delete mode 120000 client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre16_exec.3 delete mode 120000 client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre16_free_study.3 delete mode 120000 client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre16_free_substring.3 delete mode 120000 client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre16_free_substring_list.3 delete mode 120000 client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre16_fullinfo.3 delete mode 120000 client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre16_get_named_substring.3 delete mode 120000 client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre16_get_stringnumber.3 delete mode 120000 client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre16_get_stringtable_entries.3 delete mode 120000 client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre16_get_substring.3 delete mode 120000 client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre16_get_substring_list.3 delete mode 120000 client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre16_jit_exec.3 delete mode 120000 client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre16_jit_stack_alloc.3 delete mode 120000 client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre16_jit_stack_free.3 delete mode 120000 client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre16_maketables.3 delete mode 120000 client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre16_pattern_to_host_byte_order.3 delete mode 120000 client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre16_refcount.3 delete mode 120000 client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre16_study.3 delete mode 120000 client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre16_utf16_to_host_byte_order.3 delete mode 120000 client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre16_version.3 delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre32.3 delete mode 120000 client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre32_assign_jit_stack.3 delete mode 120000 client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre32_compile.3 delete mode 120000 client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre32_compile2.3 delete mode 120000 client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre32_config.3 delete mode 120000 client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre32_copy_named_substring.3 delete mode 120000 client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre32_copy_substring.3 delete mode 120000 client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre32_dfa_exec.3 delete mode 120000 client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre32_exec.3 delete mode 120000 client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre32_free_study.3 delete mode 120000 client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre32_free_substring.3 delete mode 120000 client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre32_free_substring_list.3 delete mode 120000 client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre32_fullinfo.3 delete mode 120000 client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre32_get_named_substring.3 delete mode 120000 client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre32_get_stringnumber.3 delete mode 120000 client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre32_get_stringtable_entries.3 delete mode 120000 client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre32_get_substring.3 delete mode 120000 client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre32_get_substring_list.3 delete mode 120000 client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre32_jit_exec.3 delete mode 120000 client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre32_jit_stack_alloc.3 delete mode 120000 client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre32_jit_stack_free.3 delete mode 120000 client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre32_maketables.3 delete mode 120000 client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre32_pattern_to_host_byte_order.3 delete mode 120000 client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre32_refcount.3 delete mode 120000 client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre32_study.3 delete mode 120000 client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre32_utf32_to_host_byte_order.3 delete mode 120000 client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre32_version.3 delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre_assign_jit_stack.3 delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre_compile.3 delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre_compile2.3 delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre_config.3 delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre_copy_named_substring.3 delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre_copy_substring.3 delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre_dfa_exec.3 delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre_exec.3 delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre_free_study.3 delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre_free_substring.3 delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre_free_substring_list.3 delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre_fullinfo.3 delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre_get_named_substring.3 delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre_get_stringnumber.3 delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre_get_stringtable_entries.3 delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre_get_substring.3 delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre_get_substring_list.3 delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre_jit_exec.3 delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre_jit_stack_alloc.3 delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre_jit_stack_free.3 delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre_maketables.3 delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre_pattern_to_host_byte_order.3 delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre_refcount.3 delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre_study.3 delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre_utf16_to_host_byte_order.3 delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre_utf32_to_host_byte_order.3 delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre_version.3 delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcreapi.3 delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcrebuild.3 delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcrecallout.3 delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcrecompat.3 delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcrecpp.3 delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcredemo.3 delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcrejit.3 delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcrelimits.3 delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcrematching.3 delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcrepartial.3 delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcrepattern.3 delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcreperform.3 delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcreposix.3 delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcreprecompile.3 delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcresample.3 delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcrestack.3 delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcresyntax.3 delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcreunicode.3 delete mode 100755 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/bin/pcre-config delete mode 100755 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/bin/pcregrep delete mode 100755 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/bin/pcretest delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/include/pcre.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/include/pcre_scanner.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/include/pcre_stringpiece.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/include/pcrecpp.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/include/pcrecpparg.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/include/pcreposix.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/lib/libpcre.a delete mode 100755 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/lib/libpcre.la delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/lib/libpcrecpp.a delete mode 100755 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/lib/libpcrecpp.la delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/lib/libpcreposix.a delete mode 100755 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/lib/libpcreposix.la delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/lib/pkgconfig/libpcre.pc delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/lib/pkgconfig/libpcrecpp.pc delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/lib/pkgconfig/libpcreposix.pc delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/AUTHORS delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/COPYING delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/ChangeLog delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/LICENCE delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/NEWS delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/README delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/NON-AUTOTOOLS-BUILD.txt delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/README.txt delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/index.html delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcre-config.html delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcre.html delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcre16.html delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcre32.html delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcre_assign_jit_stack.html delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcre_compile.html delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcre_compile2.html delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcre_config.html delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcre_copy_named_substring.html delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcre_copy_substring.html delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcre_dfa_exec.html delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcre_exec.html delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcre_free_study.html delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcre_free_substring.html delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcre_free_substring_list.html delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcre_fullinfo.html delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcre_get_named_substring.html delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcre_get_stringnumber.html delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcre_get_stringtable_entries.html delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcre_get_substring.html delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcre_get_substring_list.html delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcre_jit_exec.html delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcre_jit_stack_alloc.html delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcre_jit_stack_free.html delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcre_maketables.html delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcre_pattern_to_host_byte_order.html delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcre_refcount.html delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcre_study.html delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcre_utf16_to_host_byte_order.html delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcre_utf32_to_host_byte_order.html delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcre_version.html delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcreapi.html delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcrebuild.html delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcrecallout.html delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcrecompat.html delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcrecpp.html delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcredemo.html delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcregrep.html delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcrejit.html delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcrelimits.html delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcrematching.html delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcrepartial.html delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcrepattern.html delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcreperform.html delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcreposix.html delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcreprecompile.html delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcresample.html delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcrestack.html delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcresyntax.html delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcretest.html delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcreunicode.html delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/pcre-config.txt delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/pcre.txt delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/pcregrep.txt delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/pcretest.txt delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man1/pcre-config.1 delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man1/pcregrep.1 delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man1/pcretest.1 delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre.3 delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre16.3 delete mode 120000 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre16_assign_jit_stack.3 delete mode 120000 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre16_compile.3 delete mode 120000 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre16_compile2.3 delete mode 120000 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre16_config.3 delete mode 120000 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre16_copy_named_substring.3 delete mode 120000 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre16_copy_substring.3 delete mode 120000 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre16_dfa_exec.3 delete mode 120000 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre16_exec.3 delete mode 120000 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre16_free_study.3 delete mode 120000 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre16_free_substring.3 delete mode 120000 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre16_free_substring_list.3 delete mode 120000 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre16_fullinfo.3 delete mode 120000 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre16_get_named_substring.3 delete mode 120000 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre16_get_stringnumber.3 delete mode 120000 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre16_get_stringtable_entries.3 delete mode 120000 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre16_get_substring.3 delete mode 120000 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre16_get_substring_list.3 delete mode 120000 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre16_jit_exec.3 delete mode 120000 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre16_jit_stack_alloc.3 delete mode 120000 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre16_jit_stack_free.3 delete mode 120000 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre16_maketables.3 delete mode 120000 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre16_pattern_to_host_byte_order.3 delete mode 120000 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre16_refcount.3 delete mode 120000 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre16_study.3 delete mode 120000 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre16_utf16_to_host_byte_order.3 delete mode 120000 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre16_version.3 delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre32.3 delete mode 120000 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre32_assign_jit_stack.3 delete mode 120000 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre32_compile.3 delete mode 120000 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre32_compile2.3 delete mode 120000 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre32_config.3 delete mode 120000 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre32_copy_named_substring.3 delete mode 120000 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre32_copy_substring.3 delete mode 120000 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre32_dfa_exec.3 delete mode 120000 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre32_exec.3 delete mode 120000 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre32_free_study.3 delete mode 120000 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre32_free_substring.3 delete mode 120000 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre32_free_substring_list.3 delete mode 120000 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre32_fullinfo.3 delete mode 120000 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre32_get_named_substring.3 delete mode 120000 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre32_get_stringnumber.3 delete mode 120000 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre32_get_stringtable_entries.3 delete mode 120000 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre32_get_substring.3 delete mode 120000 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre32_get_substring_list.3 delete mode 120000 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre32_jit_exec.3 delete mode 120000 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre32_jit_stack_alloc.3 delete mode 120000 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre32_jit_stack_free.3 delete mode 120000 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre32_maketables.3 delete mode 120000 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre32_pattern_to_host_byte_order.3 delete mode 120000 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre32_refcount.3 delete mode 120000 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre32_study.3 delete mode 120000 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre32_utf32_to_host_byte_order.3 delete mode 120000 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre32_version.3 delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre_assign_jit_stack.3 delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre_compile.3 delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre_compile2.3 delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre_config.3 delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre_copy_named_substring.3 delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre_copy_substring.3 delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre_dfa_exec.3 delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre_exec.3 delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre_free_study.3 delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre_free_substring.3 delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre_free_substring_list.3 delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre_fullinfo.3 delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre_get_named_substring.3 delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre_get_stringnumber.3 delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre_get_stringtable_entries.3 delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre_get_substring.3 delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre_get_substring_list.3 delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre_jit_exec.3 delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre_jit_stack_alloc.3 delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre_jit_stack_free.3 delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre_maketables.3 delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre_pattern_to_host_byte_order.3 delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre_refcount.3 delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre_study.3 delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre_utf16_to_host_byte_order.3 delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre_utf32_to_host_byte_order.3 delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre_version.3 delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcreapi.3 delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcrebuild.3 delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcrecallout.3 delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcrecompat.3 delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcrecpp.3 delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcredemo.3 delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcrejit.3 delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcrelimits.3 delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcrematching.3 delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcrepartial.3 delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcrepattern.3 delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcreperform.3 delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcreposix.3 delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcreprecompile.3 delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcresample.3 delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcrestack.3 delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcresyntax.3 delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcreunicode.3 delete mode 100755 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/bin/pcre-config delete mode 100755 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/bin/pcregrep delete mode 100755 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/bin/pcretest delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/include/pcre.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/include/pcre_scanner.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/include/pcre_stringpiece.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/include/pcrecpp.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/include/pcrecpparg.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/include/pcreposix.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/lib/libpcre.a delete mode 100755 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/lib/libpcre.la delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/lib/libpcrecpp.a delete mode 100755 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/lib/libpcrecpp.la delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/lib/libpcreposix.a delete mode 100755 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/lib/libpcreposix.la delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/lib/pkgconfig/libpcre.pc delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/lib/pkgconfig/libpcrecpp.pc delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/lib/pkgconfig/libpcreposix.pc delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/AUTHORS delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/COPYING delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/ChangeLog delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/LICENCE delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/NEWS delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/README delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/NON-AUTOTOOLS-BUILD.txt delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/README.txt delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/index.html delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcre-config.html delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcre.html delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcre16.html delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcre32.html delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcre_assign_jit_stack.html delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcre_compile.html delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcre_compile2.html delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcre_config.html delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcre_copy_named_substring.html delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcre_copy_substring.html delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcre_dfa_exec.html delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcre_exec.html delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcre_free_study.html delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcre_free_substring.html delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcre_free_substring_list.html delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcre_fullinfo.html delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcre_get_named_substring.html delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcre_get_stringnumber.html delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcre_get_stringtable_entries.html delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcre_get_substring.html delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcre_get_substring_list.html delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcre_jit_exec.html delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcre_jit_stack_alloc.html delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcre_jit_stack_free.html delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcre_maketables.html delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcre_pattern_to_host_byte_order.html delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcre_refcount.html delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcre_study.html delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcre_utf16_to_host_byte_order.html delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcre_utf32_to_host_byte_order.html delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcre_version.html delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcreapi.html delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcrebuild.html delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcrecallout.html delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcrecompat.html delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcrecpp.html delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcredemo.html delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcregrep.html delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcrejit.html delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcrelimits.html delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcrematching.html delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcrepartial.html delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcrepattern.html delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcreperform.html delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcreposix.html delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcreprecompile.html delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcresample.html delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcrestack.html delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcresyntax.html delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcretest.html delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcreunicode.html delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/pcre-config.txt delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/pcre.txt delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/pcregrep.txt delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/pcretest.txt delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man1/pcre-config.1 delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man1/pcregrep.1 delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man1/pcretest.1 delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre.3 delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre16.3 delete mode 120000 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre16_assign_jit_stack.3 delete mode 120000 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre16_compile.3 delete mode 120000 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre16_compile2.3 delete mode 120000 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre16_config.3 delete mode 120000 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre16_copy_named_substring.3 delete mode 120000 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre16_copy_substring.3 delete mode 120000 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre16_dfa_exec.3 delete mode 120000 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre16_exec.3 delete mode 120000 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre16_free_study.3 delete mode 120000 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre16_free_substring.3 delete mode 120000 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre16_free_substring_list.3 delete mode 120000 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre16_fullinfo.3 delete mode 120000 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre16_get_named_substring.3 delete mode 120000 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre16_get_stringnumber.3 delete mode 120000 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre16_get_stringtable_entries.3 delete mode 120000 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre16_get_substring.3 delete mode 120000 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre16_get_substring_list.3 delete mode 120000 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre16_jit_exec.3 delete mode 120000 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre16_jit_stack_alloc.3 delete mode 120000 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre16_jit_stack_free.3 delete mode 120000 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre16_maketables.3 delete mode 120000 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre16_pattern_to_host_byte_order.3 delete mode 120000 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre16_refcount.3 delete mode 120000 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre16_study.3 delete mode 120000 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre16_utf16_to_host_byte_order.3 delete mode 120000 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre16_version.3 delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre32.3 delete mode 120000 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre32_assign_jit_stack.3 delete mode 120000 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre32_compile.3 delete mode 120000 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre32_compile2.3 delete mode 120000 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre32_config.3 delete mode 120000 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre32_copy_named_substring.3 delete mode 120000 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre32_copy_substring.3 delete mode 120000 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre32_dfa_exec.3 delete mode 120000 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre32_exec.3 delete mode 120000 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre32_free_study.3 delete mode 120000 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre32_free_substring.3 delete mode 120000 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre32_free_substring_list.3 delete mode 120000 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre32_fullinfo.3 delete mode 120000 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre32_get_named_substring.3 delete mode 120000 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre32_get_stringnumber.3 delete mode 120000 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre32_get_stringtable_entries.3 delete mode 120000 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre32_get_substring.3 delete mode 120000 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre32_get_substring_list.3 delete mode 120000 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre32_jit_exec.3 delete mode 120000 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre32_jit_stack_alloc.3 delete mode 120000 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre32_jit_stack_free.3 delete mode 120000 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre32_maketables.3 delete mode 120000 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre32_pattern_to_host_byte_order.3 delete mode 120000 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre32_refcount.3 delete mode 120000 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre32_study.3 delete mode 120000 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre32_utf32_to_host_byte_order.3 delete mode 120000 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre32_version.3 delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre_assign_jit_stack.3 delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre_compile.3 delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre_compile2.3 delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre_config.3 delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre_copy_named_substring.3 delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre_copy_substring.3 delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre_dfa_exec.3 delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre_exec.3 delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre_free_study.3 delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre_free_substring.3 delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre_free_substring_list.3 delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre_fullinfo.3 delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre_get_named_substring.3 delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre_get_stringnumber.3 delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre_get_stringtable_entries.3 delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre_get_substring.3 delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre_get_substring_list.3 delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre_jit_exec.3 delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre_jit_stack_alloc.3 delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre_jit_stack_free.3 delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre_maketables.3 delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre_pattern_to_host_byte_order.3 delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre_refcount.3 delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre_study.3 delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre_utf16_to_host_byte_order.3 delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre_utf32_to_host_byte_order.3 delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre_version.3 delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcreapi.3 delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcrebuild.3 delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcrecallout.3 delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcrecompat.3 delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcrecpp.3 delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcredemo.3 delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcrejit.3 delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcrelimits.3 delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcrematching.3 delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcrepartial.3 delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcrepattern.3 delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcreperform.3 delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcreposix.3 delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcreprecompile.3 delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcresample.3 delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcrestack.3 delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcresyntax.3 delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcreunicode.3 delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/include/pcre.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/include/pcre_scanner.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/include/pcre_stringpiece.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/include/pcrecpp.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/include/pcrecpparg.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/include/pcreposix.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/lib/libpcre.a delete mode 100755 client/3rd/ShadowSocks/ShadowSocks/pcre/lib/libpcre.la delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/lib/libpcrecpp.a delete mode 100755 client/3rd/ShadowSocks/ShadowSocks/pcre/lib/libpcrecpp.la delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/lib/libpcreposix.a delete mode 100755 client/3rd/ShadowSocks/ShadowSocks/pcre/lib/libpcreposix.la delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/lib/pkgconfig/libpcre.pc delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/lib/pkgconfig/libpcrecpp.pc delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/pcre/lib/pkgconfig/libpcreposix.pc delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/config.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/include/shadowsocks.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/lib/libshadowsocks-libev.a delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libbloom/.gitignore delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libbloom/LICENSE delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libbloom/README delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libbloom/bloom.c delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libbloom/bloom.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libbloom/misc/.gitignore delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libbloom/misc/1.0/linux.10000.1 delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libbloom/misc/1.0/linux.100000.1 delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libbloom/misc/1.0/linux.10000000.001 delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libbloom/misc/1.0/linux.10000000.01 delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libbloom/misc/1.0/linux.10000000.1 delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libbloom/misc/1.0/solaris.10000.1 delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libbloom/misc/1.0/solaris.100000.1 delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libbloom/misc/1.0/solaris.10000000.001 delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libbloom/misc/1.0/solaris.10000000.01 delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libbloom/misc/1.0/solaris.10000000.1 delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libbloom/misc/1.1/linux.10000.1 delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libbloom/misc/1.1/linux.100000.1 delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libbloom/misc/1.1/linux.10000000.001 delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libbloom/misc/1.1/linux.10000000.01 delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libbloom/misc/1.1/linux.10000000.1 delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libbloom/misc/1.1/solaris.10000.1 delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libbloom/misc/1.1/solaris.100000.1 delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libbloom/misc/1.1/solaris.10000000.001 delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libbloom/misc/1.1/solaris.10000000.01 delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libbloom/misc/1.1/solaris.10000000.1 delete mode 100755 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libbloom/misc/colcmp delete mode 100755 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libbloom/misc/colgraph delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libbloom/misc/collisions/collision_data_v1.2.gz delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libbloom/misc/collisions/collision_data_v1.2.gz.png delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libbloom/misc/collisions/collision_data_v1.3.gz delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libbloom/misc/collisions/collision_data_v1.3.gz.png delete mode 100755 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libbloom/misc/collisions/dograph delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libbloom/misc/test/basic.c delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libbloom/misc/test/test.c delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libbloom/murmur2/MurmurHash2.c delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libbloom/murmur2/README delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libbloom/murmur2/murmurhash2.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/.buzzy/links.yaml delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/.buzzy/package.yaml delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/.gitignore delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/.travis.yml delete mode 100755 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/.travis/install delete mode 100755 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/.travis/test delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/CMakeLists.txt delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/COPYING delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/INSTALL delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/README.markdown delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/cmake/FindCTargets.cmake delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/cmake/FindParseArguments.cmake delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/cmake/FindPrereqs.cmake delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/docs/.gitattributes delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/docs/CMakeLists.txt delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/docs/old/CMakeLists.txt delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/docs/old/_static/.keep delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/docs/old/_static/docco-sphinx.css delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/docs/old/_static/pygments.css delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/docs/old/_templates/.keep delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/docs/old/allocation.rst delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/docs/old/array.rst delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/docs/old/attributes.rst delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/docs/old/basic-types.rst delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/docs/old/bitset.rst delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/docs/old/buffer.rst delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/docs/old/byte-order.rst delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/docs/old/cli.rst delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/docs/old/conf.py delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/docs/old/config.rst delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/docs/old/dllist.rst delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/docs/old/ds.rst delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/docs/old/errors.rst delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/docs/old/files.rst delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/docs/old/gc.rst delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/docs/old/hash-table.rst delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/docs/old/hash-values.rst delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/docs/old/index.rst delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/docs/old/int128.rst delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/docs/old/managed-buffer.rst delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/docs/old/mempool.rst delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/docs/old/net-addresses.rst delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/docs/old/process.rst delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/docs/old/ring-buffer.rst delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/docs/old/slice.rst delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/docs/old/stream.rst delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/docs/old/subprocess.rst delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/docs/old/threads.rst delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/docs/old/timestamps.rst delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/docs/old/unique-ids.rst delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/docs/old/versions.rst delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/docs/old/visibility.rst delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/extras/hashstring.py delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/include/CMakeLists.txt delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/include/libcork/cli.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/include/libcork/cli/commands.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/include/libcork/config.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/include/libcork/config/arch.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/include/libcork/config/bsd.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/include/libcork/config/config.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/include/libcork/config/gcc.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/include/libcork/config/linux.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/include/libcork/config/macosx.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/include/libcork/config/mingw32.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/include/libcork/config/solaris.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/include/libcork/config/version.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/include/libcork/config/version.h.in delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/include/libcork/core.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/include/libcork/core/allocator.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/include/libcork/core/api.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/include/libcork/core/attributes.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/include/libcork/core/byte-order.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/include/libcork/core/callbacks.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/include/libcork/core/error.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/include/libcork/core/gc.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/include/libcork/core/hash.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/include/libcork/core/id.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/include/libcork/core/mempool.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/include/libcork/core/net-addresses.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/include/libcork/core/timestamp.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/include/libcork/core/types.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/include/libcork/core/u128.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/include/libcork/ds.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/include/libcork/ds/array.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/include/libcork/ds/bitset.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/include/libcork/ds/buffer.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/include/libcork/ds/dllist.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/include/libcork/ds/hash-table.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/include/libcork/ds/managed-buffer.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/include/libcork/ds/ring-buffer.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/include/libcork/ds/slice.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/include/libcork/ds/stream.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/include/libcork/helpers/errors.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/include/libcork/helpers/gc.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/include/libcork/helpers/mingw.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/include/libcork/helpers/posix.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/include/libcork/os.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/include/libcork/os/files.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/include/libcork/os/process.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/include/libcork/os/subprocess.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/include/libcork/threads.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/include/libcork/threads/atomics.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/include/libcork/threads/basics.h delete mode 100755 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/make-dist.sh delete mode 100755 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/run.sh delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/share/CMakeLists.txt delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/share/valgrind/libcork.supp delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/src/APPNAME.pc.in delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/src/CMakeLists.txt delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/src/cork-hash/cork-hash.c delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/src/cork-initializer/init1.c delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/src/cork-initializer/init2.c delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/src/cork-initializer/main.c delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/src/cork-test/cork-test.c delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/src/libcork.pc.in delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/src/libcork/cli/commands.c delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/src/libcork/core/allocator.c delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/src/libcork/core/error.c delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/src/libcork/core/gc.c delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/src/libcork/core/hash.c delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/src/libcork/core/ip-address.c delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/src/libcork/core/mempool.c delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/src/libcork/core/timestamp.c delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/src/libcork/core/u128.c delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/src/libcork/core/version.c delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/src/libcork/ds/array.c delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/src/libcork/ds/bitset.c delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/src/libcork/ds/buffer.c delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/src/libcork/ds/dllist.c delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/src/libcork/ds/file-stream.c delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/src/libcork/ds/hash-table.c delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/src/libcork/ds/managed-buffer.c delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/src/libcork/ds/ring-buffer.c delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/src/libcork/ds/slice.c delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/src/libcork/posix/directory-walker.c delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/src/libcork/posix/env.c delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/src/libcork/posix/exec.c delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/src/libcork/posix/files.c delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/src/libcork/posix/mingw.c delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/src/libcork/posix/process.c delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/src/libcork/posix/subprocess.c delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/src/libcork/pthreads/thread.c delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/tests/.gitattributes delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/tests/.gitignore delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/tests/CMakeLists.txt delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/tests/COPYING.cram.txt delete mode 100755 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/tests/ccram delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/tests/cork-hash.t delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/tests/cork-initializer.t delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/tests/cork-test/cleanup.t delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/tests/cork-test/directory-watcher.t delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/tests/cork-test/help1-c1-s1.t delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/tests/cork-test/help1-c1-s2.t delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/tests/cork-test/help1-c1.t delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/tests/cork-test/help1-c2.t delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/tests/cork-test/help1-root.t delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/tests/cork-test/help2-c1-s1.t delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/tests/cork-test/help2-c1-s2.t delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/tests/cork-test/help2-c1.t delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/tests/cork-test/help2-c2.t delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/tests/cork-test/help2-root.t delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/tests/cork-test/help3-c1-s1.t delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/tests/cork-test/help3-c1-s2.t delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/tests/cork-test/help3-c1.t delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/tests/cork-test/help3-c2.t delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/tests/cork-test/help3-root.t delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/tests/cork-test/no-command-c1.t delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/tests/cork-test/no-command-root.t delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/tests/cork-test/run-c1-s1-f-t.t delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/tests/cork-test/run-c1-s1-f.t delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/tests/cork-test/run-c1-s1-t.t delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/tests/cork-test/run-c1-s1-test.t delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/tests/cork-test/run-c1-s1.t delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/tests/cork-test/run-c1-s2-f.t delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/tests/cork-test/run-c1-s2-file.t delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/tests/cork-test/run-c1-s2.t delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/tests/cork-test/run-c2.t delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/tests/cork-test/run-find-01.t delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/tests/cork-test/run-find-all-01.t delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/tests/cork-test/run-mkdir-01.t delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/tests/cork-test/run-paths-01.t delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/tests/cork-test/run-pwd-01.t delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/tests/cork-test/run-rm-01.t delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/tests/cork-test/run-sub-01.t delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/tests/cork-test/run-sub-02.t delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/tests/cork-test/run-sub-03.t delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/tests/cork-test/run-sub-04.t delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/tests/cork-test/run-sub-05.t delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/tests/cork-test/run-sub-06.t delete mode 100755 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/tests/cram.py delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/tests/helpers.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/tests/test-array.c delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/tests/test-bitset.c delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/tests/test-buffer.c delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/tests/test-core.c delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/tests/test-dllist.c delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/tests/test-files.c delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/tests/test-gc.c delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/tests/test-hash-table.c delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/tests/test-input.txt delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/tests/test-managed-buffer.c delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/tests/test-mempool.c delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/tests/test-ring-buffer.c delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/tests/test-slice.c delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/tests/test-subprocess.c delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/tests/test-threads.c delete mode 100755 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/tests/tile-test delete mode 100755 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libcork/version.sh delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libipset/.buzzy/links.yaml delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libipset/.buzzy/package.yaml delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libipset/.gitignore delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libipset/.travis.yml delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libipset/CMakeLists.txt delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libipset/INSTALL delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libipset/LICENSE.txt delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libipset/README.markdown delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libipset/docs/CMakeLists.txt delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libipset/docs/commands.rst delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libipset/docs/file-format.rst delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libipset/docs/maps.rst delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libipset/docs/sets.rst delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libipset/examples/.gitignore delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libipset/examples/CMakeLists.txt delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libipset/examples/ipv4-set-size.c delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libipset/include/CMakeLists.txt delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libipset/include/ipset/bdd/nodes.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libipset/include/ipset/bits.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libipset/include/ipset/errors.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libipset/include/ipset/ipset.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libipset/include/ipset/logging.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libipset/python/.gitignore delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libipset/python/MANIFEST.in delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libipset/python/setup.cfg delete mode 100755 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libipset/python/setup.py delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libipset/python/src/.gitignore delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libipset/python/src/ipset/__init__.py delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libipset/python/src/ipset/c.py delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libipset/python/src/ipset/tests/__init__.py delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libipset/python/src/ipset/tests/c.py delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libipset/python/src/ipset/tests/obj.py delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libipset/python/tests/empty.map delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libipset/python/tests/empty.set delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libipset/python/tests/just1-v4.map delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libipset/python/tests/just1-v4.set delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libipset/python/tests/just1-v6.map delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libipset/python/tests/just1-v6.set delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libipset/python/version.py delete mode 100755 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libipset/run.sh delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libipset/share/CMakeLists.txt delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libipset/src/CMakeLists.txt delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libipset/src/ipset.pc.in delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libipset/src/ipsetbuild/ipsetbuild.c delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libipset/src/ipsetcat/ipsetcat.c delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libipset/src/ipsetdot/ipsetdot.c delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libipset/src/libipset/bdd/assignments.c delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libipset/src/libipset/bdd/basics.c delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libipset/src/libipset/bdd/bdd-iterator.c delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libipset/src/libipset/bdd/expanded.c delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libipset/src/libipset/bdd/reachable.c delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libipset/src/libipset/bdd/read.c delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libipset/src/libipset/bdd/write.c delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libipset/src/libipset/general.c delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libipset/src/libipset/map/allocation.c delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libipset/src/libipset/map/inspection-template.c.in delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libipset/src/libipset/map/inspection.c delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libipset/src/libipset/map/ipv4_map.c delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libipset/src/libipset/map/ipv6_map.c delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libipset/src/libipset/map/storage.c delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libipset/src/libipset/set/allocation.c delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libipset/src/libipset/set/inspection-template.c.in delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libipset/src/libipset/set/inspection.c delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libipset/src/libipset/set/ipv4_set.c delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libipset/src/libipset/set/ipv6_set.c delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libipset/src/libipset/set/iterator.c delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libipset/src/libipset/set/storage.c delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libipset/tests/.gitattributes delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libipset/tests/.gitignore delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libipset/tests/CMakeLists.txt delete mode 100755 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libipset/tests/ccram delete mode 120000 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libipset/tests/dot/10.0.5.64-30/command delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libipset/tests/dot/10.0.5.64-30/err delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libipset/tests/dot/10.0.5.64-30/in delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libipset/tests/dot/10.0.5.64-30/out delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libipset/tests/dot/command delete mode 120000 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libipset/tests/dot/empty/command delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libipset/tests/dot/empty/err delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libipset/tests/dot/empty/in delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libipset/tests/dot/empty/out delete mode 120000 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libipset/tests/dot/universe/command delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libipset/tests/dot/universe/err delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libipset/tests/dot/universe/in delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libipset/tests/dot/universe/out delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libipset/tests/errors/empty-cidr/command delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libipset/tests/errors/empty-cidr/err delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libipset/tests/errors/empty-cidr/in delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libipset/tests/errors/empty-cidr/out delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libipset/tests/errors/ipsetcat-empty-input/command delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libipset/tests/errors/ipsetcat-empty-input/err delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libipset/tests/errors/ipsetcat-empty-input/in delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libipset/tests/errors/ipsetcat-empty-input/out delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libipset/tests/errors/ipsetcat-file-not-found/command delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libipset/tests/errors/ipsetcat-file-not-found/err delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libipset/tests/errors/ipsetcat-file-not-found/in delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libipset/tests/errors/ipsetcat-file-not-found/out delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libipset/tests/errors/ipsetcat-no-input/command delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libipset/tests/errors/ipsetcat-no-input/err delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libipset/tests/errors/ipsetcat-no-input/in delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libipset/tests/errors/ipsetcat-no-input/out delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libipset/tests/errors/ipsetdot-empty-input/command delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libipset/tests/errors/ipsetdot-empty-input/err delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libipset/tests/errors/ipsetdot-empty-input/in delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libipset/tests/errors/ipsetdot-empty-input/out delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libipset/tests/errors/ipsetdot-file-not-found/command delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libipset/tests/errors/ipsetdot-file-not-found/err delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libipset/tests/errors/ipsetdot-file-not-found/in delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libipset/tests/errors/ipsetdot-file-not-found/out delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libipset/tests/errors/ipsetdot-no-input/command delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libipset/tests/errors/ipsetdot-no-input/err delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libipset/tests/errors/ipsetdot-no-input/in delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libipset/tests/errors/ipsetdot-no-input/out delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libipset/tests/errors/nonnumeric-cidr/command delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libipset/tests/errors/nonnumeric-cidr/err delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libipset/tests/errors/nonnumeric-cidr/in delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libipset/tests/errors/nonnumeric-cidr/out delete mode 120000 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libipset/tests/round-trip/10.0.5.64-30/command delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libipset/tests/round-trip/10.0.5.64-30/err delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libipset/tests/round-trip/10.0.5.64-30/in delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libipset/tests/round-trip/10.0.5.64-30/out delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libipset/tests/round-trip/command delete mode 120000 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libipset/tests/round-trip/empty/command delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libipset/tests/round-trip/empty/err delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libipset/tests/round-trip/empty/in delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libipset/tests/round-trip/empty/out delete mode 120000 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libipset/tests/round-trip/idempotent-01a/command delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libipset/tests/round-trip/idempotent-01a/err delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libipset/tests/round-trip/idempotent-01a/in delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libipset/tests/round-trip/idempotent-01a/out delete mode 120000 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libipset/tests/round-trip/idempotent-01b/command delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libipset/tests/round-trip/idempotent-01b/err delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libipset/tests/round-trip/idempotent-01b/in delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libipset/tests/round-trip/idempotent-01b/out delete mode 120000 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libipset/tests/round-trip/idempotent-02a/command delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libipset/tests/round-trip/idempotent-02a/err delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libipset/tests/round-trip/idempotent-02a/in delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libipset/tests/round-trip/idempotent-02a/out delete mode 120000 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libipset/tests/round-trip/idempotent-02b/command delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libipset/tests/round-trip/idempotent-02b/err delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libipset/tests/round-trip/idempotent-02b/in delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libipset/tests/round-trip/idempotent-02b/out delete mode 120000 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libipset/tests/round-trip/universe/command delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libipset/tests/round-trip/universe/err delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libipset/tests/round-trip/universe/in delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libipset/tests/round-trip/universe/out delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libipset/tests/test-assignment.c delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libipset/tests/test-bdd.c delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libipset/tests/test-ipmap.c delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libipset/tests/test-ipset.c delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libipset/tests/test-iterator.c delete mode 100755 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libipset/tests/tile-test delete mode 100755 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libipset/version.sh delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/src/CMakeLists.txt delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/src/acl.c delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/src/acl.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/src/aead.c delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/src/aead.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/src/android.c delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/src/base64.c delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/src/base64.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/src/cache.c delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/src/cache.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/src/common.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/src/crypto.c delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/src/crypto.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/src/jconf.c delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/src/jconf.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/src/json.c delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/src/json.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/src/local.c delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/src/local.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/src/manager.c delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/src/manager.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/src/netutils.c delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/src/netutils.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/src/plugin.c delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/src/plugin.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/src/ppbloom.c delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/src/ppbloom.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/src/redir.c delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/src/redir.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/src/resolv.c delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/src/resolv.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/src/rule.c delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/src/rule.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/src/server.c delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/src/server.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/src/shadowsocks.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/src/socks5.h delete mode 100755 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/src/ss-nat delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/src/stream.c delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/src/stream.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/src/tunnel.c delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/src/tunnel.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/src/udprelay.c delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/src/udprelay.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/src/uthash.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/src/utils.c delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/src/utils.h delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/src/winsock.c delete mode 100644 client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/src/winsock.h delete mode 160000 client/3rd/outline-go-tun2socks diff --git a/.gitmodules b/.gitmodules index ff50f897..78d45e25 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,18 +1,6 @@ [submodule "client/3rd/OpenVPNAdapter"] path = client/3rd/OpenVPNAdapter url = https://github.com/amnezia-vpn/OpenVPNAdapter.git -[submodule "client/3rd/ShadowPath"] - path = client/3rd/ShadowPath - url = https://github.com/qman9501/ShadowPath -[submodule "client/3rd/outline-go-tun2socks"] - path = client/3rd/outline-go-tun2socks - url = https://github.com/Jigsaw-Code/outline-go-tun2socks.git -[submodule "client/3rd/CocoaAsyncSocket"] - path = client/3rd/CocoaAsyncSocket - url = https://github.com/robbiehanson/CocoaAsyncSocket.git -[submodule "client/3rd/CocoaLumberjack"] - path = client/3rd/CocoaLumberjack - url = https://github.com/CocoaLumberjack/CocoaLumberjack.git [submodule "client/3rd/qtkeychain"] path = client/3rd/qtkeychain url = https://github.com/frankosterfeld/qtkeychain.git diff --git a/client/3rd/CocoaAsyncSocket b/client/3rd/CocoaAsyncSocket deleted file mode 160000 index 5ddba5e7..00000000 --- a/client/3rd/CocoaAsyncSocket +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 5ddba5e72f38e56010dbfac08b44478ee5000c0c diff --git a/client/3rd/CocoaLumberjack b/client/3rd/CocoaLumberjack deleted file mode 160000 index 70f04b1d..00000000 --- a/client/3rd/CocoaLumberjack +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 70f04b1dc56dfc4fa954a39ca269382825f2a6e3 diff --git a/client/3rd/PacketProcessor/PacketProcessor.xcodeproj/project.pbxproj b/client/3rd/PacketProcessor/PacketProcessor.xcodeproj/project.pbxproj deleted file mode 100644 index 04cc4654..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor.xcodeproj/project.pbxproj +++ /dev/null @@ -1,1640 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 55; - objects = { - -/* Begin PBXBuildFile section */ - 19D0CCED277092B50010B299 /* PacketProcessor.h in Headers */ = {isa = PBXBuildFile; fileRef = 19D0CCEC277092B50010B299 /* PacketProcessor.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 19D0D6092770982F0010B299 /* BSocksClient.c in Sources */ = {isa = PBXBuildFile; fileRef = 19D0D44F2770982C0010B299 /* BSocksClient.c */; }; - 19D0D64B277098300010B299 /* sys.c in Sources */ = {isa = PBXBuildFile; fileRef = 19D0D4942770982D0010B299 /* sys.c */; }; - 19D0D64F277098300010B299 /* memp.c in Sources */ = {isa = PBXBuildFile; fileRef = 19D0D49B2770982D0010B299 /* memp.c */; }; - 19D0D650277098300010B299 /* inet_chksum.c in Sources */ = {isa = PBXBuildFile; fileRef = 19D0D49C2770982D0010B299 /* inet_chksum.c */; }; - 19D0D651277098300010B299 /* tcp_out.c in Sources */ = {isa = PBXBuildFile; fileRef = 19D0D49D2770982D0010B299 /* tcp_out.c */; }; - 19D0D652277098300010B299 /* init.c in Sources */ = {isa = PBXBuildFile; fileRef = 19D0D49E2770982D0010B299 /* init.c */; }; - 19D0D653277098300010B299 /* mem.c in Sources */ = {isa = PBXBuildFile; fileRef = 19D0D49F2770982D0010B299 /* mem.c */; }; - 19D0D654277098300010B299 /* def.c in Sources */ = {isa = PBXBuildFile; fileRef = 19D0D4A02770982D0010B299 /* def.c */; }; - 19D0D655277098300010B299 /* udp.c in Sources */ = {isa = PBXBuildFile; fileRef = 19D0D4A12770982D0010B299 /* udp.c */; }; - 19D0D656277098300010B299 /* stats.c in Sources */ = {isa = PBXBuildFile; fileRef = 19D0D4A22770982D0010B299 /* stats.c */; }; - 19D0D657277098300010B299 /* tcp_in.c in Sources */ = {isa = PBXBuildFile; fileRef = 19D0D4A32770982D0010B299 /* tcp_in.c */; }; - 19D0D658277098300010B299 /* ip_frag.c in Sources */ = {isa = PBXBuildFile; fileRef = 19D0D4A52770982D0010B299 /* ip_frag.c */; }; - 19D0D659277098300010B299 /* icmp.c in Sources */ = {isa = PBXBuildFile; fileRef = 19D0D4A62770982D0010B299 /* icmp.c */; }; - 19D0D65A277098300010B299 /* ip4.c in Sources */ = {isa = PBXBuildFile; fileRef = 19D0D4A72770982D0010B299 /* ip4.c */; }; - 19D0D65B277098300010B299 /* ip4_addr.c in Sources */ = {isa = PBXBuildFile; fileRef = 19D0D4A82770982D0010B299 /* ip4_addr.c */; }; - 19D0D65C277098300010B299 /* netif.c in Sources */ = {isa = PBXBuildFile; fileRef = 19D0D4A92770982D0010B299 /* netif.c */; }; - 19D0D65D277098300010B299 /* tcp.c in Sources */ = {isa = PBXBuildFile; fileRef = 19D0D4AA2770982D0010B299 /* tcp.c */; }; - 19D0D65E277098300010B299 /* timers.c in Sources */ = {isa = PBXBuildFile; fileRef = 19D0D4AB2770982D0010B299 /* timers.c */; }; - 19D0D65F277098300010B299 /* pbuf.c in Sources */ = {isa = PBXBuildFile; fileRef = 19D0D4AC2770982D0010B299 /* pbuf.c */; }; - 19D0D660277098300010B299 /* ip6.c in Sources */ = {isa = PBXBuildFile; fileRef = 19D0D4AE2770982D0010B299 /* ip6.c */; }; - 19D0D661277098300010B299 /* icmp6.c in Sources */ = {isa = PBXBuildFile; fileRef = 19D0D4AF2770982D0010B299 /* icmp6.c */; }; - 19D0D662277098300010B299 /* nd6.c in Sources */ = {isa = PBXBuildFile; fileRef = 19D0D4B02770982D0010B299 /* nd6.c */; }; - 19D0D663277098300010B299 /* ip6_addr.c in Sources */ = {isa = PBXBuildFile; fileRef = 19D0D4B12770982D0010B299 /* ip6_addr.c */; }; - 19D0D664277098300010B299 /* ip6_frag.c in Sources */ = {isa = PBXBuildFile; fileRef = 19D0D4B22770982D0010B299 /* ip6_frag.c */; }; - 19D0D69D277098310010B299 /* BTap.m in Sources */ = {isa = PBXBuildFile; fileRef = 19D0D4F52770982D0010B299 /* BTap.m */; }; - 19D0D6A0277098310010B299 /* udpgw.c in Sources */ = {isa = PBXBuildFile; fileRef = 19D0D4F92770982D0010B299 /* udpgw.c */; }; - 19D0D6A9277098310010B299 /* addr.bproto in Resources */ = {isa = PBXBuildFile; fileRef = 19D0D5032770982D0010B299 /* addr.bproto */; }; - 19D0D6AB277098310010B299 /* msgproto.bproto in Resources */ = {isa = PBXBuildFile; fileRef = 19D0D5052770982D0010B299 /* msgproto.bproto */; }; - 19D0D6AE277098310010B299 /* BNetwork.c in Sources */ = {isa = PBXBuildFile; fileRef = 19D0D5092770982D0010B299 /* BNetwork.c */; }; - 19D0D6B0277098310010B299 /* BConnection_common.c in Sources */ = {isa = PBXBuildFile; fileRef = 19D0D50B2770982D0010B299 /* BConnection_common.c */; }; - 19D0D6B5277098310010B299 /* BTime.c in Sources */ = {isa = PBXBuildFile; fileRef = 19D0D5102770982D0010B299 /* BTime.c */; }; - 19D0D6B6277098310010B299 /* BSignal.c in Sources */ = {isa = PBXBuildFile; fileRef = 19D0D5112770982D0010B299 /* BSignal.c */; }; - 19D0D6B8277098310010B299 /* BDatagram_unix.c in Sources */ = {isa = PBXBuildFile; fileRef = 19D0D5132770982D0010B299 /* BDatagram_unix.c */; }; - 19D0D6BA277098310010B299 /* BUnixSignal.c in Sources */ = {isa = PBXBuildFile; fileRef = 19D0D5152770982D0010B299 /* BUnixSignal.c */; }; - 19D0D6BC277098310010B299 /* BReactor_badvpn.c in Sources */ = {isa = PBXBuildFile; fileRef = 19D0D5172770982D0010B299 /* BReactor_badvpn.c */; }; - 19D0D6BF277098310010B299 /* BConnection_unix.c in Sources */ = {isa = PBXBuildFile; fileRef = 19D0D51A2770982D0010B299 /* BConnection_unix.c */; }; - 19D0D6C0277098310010B299 /* tun2socks.c in Sources */ = {isa = PBXBuildFile; fileRef = 19D0D51C2770982D0010B299 /* tun2socks.c */; }; - 19D0D6C3277098310010B299 /* SocksUdpGwClient.c in Sources */ = {isa = PBXBuildFile; fileRef = 19D0D51F2770982D0010B299 /* SocksUdpGwClient.c */; }; - 19D0D6E6277098310010B299 /* PacketPassInactivityMonitor.c in Sources */ = {isa = PBXBuildFile; fileRef = 19D0D5442770982D0010B299 /* PacketPassInactivityMonitor.c */; }; - 19D0D6E7277098310010B299 /* BLog.m in Sources */ = {isa = PBXBuildFile; fileRef = 19D0D5462770982D0010B299 /* BLog.m */; }; - 19D0D6E8277098310010B299 /* BLog_syslog.c in Sources */ = {isa = PBXBuildFile; fileRef = 19D0D5472770982E0010B299 /* BLog_syslog.c */; }; - 19D0D6EA277098310010B299 /* DebugObject.c in Sources */ = {isa = PBXBuildFile; fileRef = 19D0D5492770982E0010B299 /* DebugObject.c */; }; - 19D0D6EF277098310010B299 /* BPending.c in Sources */ = {isa = PBXBuildFile; fileRef = 19D0D54E2770982E0010B299 /* BPending.c */; }; - 19D0D6F1277098310010B299 /* UdpGwClient.c in Sources */ = {isa = PBXBuildFile; fileRef = 19D0D5512770982E0010B299 /* UdpGwClient.c */; }; - 19D0D6F3277098310010B299 /* PacketBuffer.c in Sources */ = {isa = PBXBuildFile; fileRef = 19D0D5542770982E0010B299 /* PacketBuffer.c */; }; - 19D0D6F5277098310010B299 /* BufferWriter.c in Sources */ = {isa = PBXBuildFile; fileRef = 19D0D5562770982E0010B299 /* BufferWriter.c */; }; - 19D0D6F6277098310010B299 /* PacketRecvInterface.c in Sources */ = {isa = PBXBuildFile; fileRef = 19D0D5572770982E0010B299 /* PacketRecvInterface.c */; }; - 19D0D6FA277098320010B299 /* StreamRecvInterface.c in Sources */ = {isa = PBXBuildFile; fileRef = 19D0D55B2770982E0010B299 /* StreamRecvInterface.c */; }; - 19D0D6FB277098320010B299 /* PacketProtoEncoder.c in Sources */ = {isa = PBXBuildFile; fileRef = 19D0D55C2770982E0010B299 /* PacketProtoEncoder.c */; }; - 19D0D6FC277098320010B299 /* StreamPassInterface.c in Sources */ = {isa = PBXBuildFile; fileRef = 19D0D55D2770982E0010B299 /* StreamPassInterface.c */; }; - 19D0D6FD277098320010B299 /* PacketPassConnector.c in Sources */ = {isa = PBXBuildFile; fileRef = 19D0D55E2770982E0010B299 /* PacketPassConnector.c */; }; - 19D0D6FF277098320010B299 /* PacketProtoFlow.c in Sources */ = {isa = PBXBuildFile; fileRef = 19D0D5602770982E0010B299 /* PacketProtoFlow.c */; }; - 19D0D700277098320010B299 /* PacketPassInterface.c in Sources */ = {isa = PBXBuildFile; fileRef = 19D0D5612770982E0010B299 /* PacketPassInterface.c */; }; - 19D0D704277098320010B299 /* PacketStreamSender.c in Sources */ = {isa = PBXBuildFile; fileRef = 19D0D5652770982E0010B299 /* PacketStreamSender.c */; }; - 19D0D706277098320010B299 /* PacketProtoDecoder.c in Sources */ = {isa = PBXBuildFile; fileRef = 19D0D5672770982E0010B299 /* PacketProtoDecoder.c */; }; - 19D0D707277098320010B299 /* SinglePacketBuffer.c in Sources */ = {isa = PBXBuildFile; fileRef = 19D0D5682770982E0010B299 /* SinglePacketBuffer.c */; }; - 19D0D708277098320010B299 /* PacketPassFairQueue.c in Sources */ = {isa = PBXBuildFile; fileRef = 19D0D5692770982E0010B299 /* PacketPassFairQueue.c */; }; - 19D0D70F277098320010B299 /* TunnelInterface.m in Sources */ = {isa = PBXBuildFile; fileRef = 19D0D5702770982E0010B299 /* TunnelInterface.m */; }; - 19D0D710277098610010B299 /* TunnelInterface.h in Headers */ = {isa = PBXBuildFile; fileRef = 19D0D56F2770982E0010B299 /* TunnelInterface.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 19D0D718277099960010B299 /* CocoaAsyncSocket.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 19D0D7162770998F0010B299 /* CocoaAsyncSocket.framework */; }; - 19D0D719277099970010B299 /* CocoaAsyncSocket.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 19D0D7162770998F0010B299 /* CocoaAsyncSocket.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; - 19D0D71C2770A3AD0010B299 /* libresolv.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 19D0D71B2770A3AD0010B299 /* libresolv.tbd */; }; -/* End PBXBuildFile section */ - -/* Begin PBXCopyFilesBuildPhase section */ - 19D0CCF9277096980010B299 /* Embed Frameworks */ = { - isa = PBXCopyFilesBuildPhase; - buildActionMask = 2147483647; - dstPath = ""; - dstSubfolderSpec = 10; - files = ( - 19D0D719277099970010B299 /* CocoaAsyncSocket.framework in Embed Frameworks */, - ); - name = "Embed Frameworks"; - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXCopyFilesBuildPhase section */ - -/* Begin PBXFileReference section */ - 19D0CCE9277092B50010B299 /* PacketProcessor.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = PacketProcessor.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 19D0CCEC277092B50010B299 /* PacketProcessor.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PacketProcessor.h; sourceTree = ""; }; - 19D0D3B62770982C0010B299 /* blog_channel_SocksUdpGwClient.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = blog_channel_SocksUdpGwClient.h; sourceTree = ""; }; - 19D0D3B72770982C0010B299 /* blog_channel_ncd_file_open.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = blog_channel_ncd_file_open.h; sourceTree = ""; }; - 19D0D3B82770982C0010B299 /* blog_channel_BReactor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = blog_channel_BReactor.h; sourceTree = ""; }; - 19D0D3B92770982C0010B299 /* blog_channel_BSSLConnection.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = blog_channel_BSSLConnection.h; sourceTree = ""; }; - 19D0D3BA2770982C0010B299 /* blog_channel_BConnection.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = blog_channel_BConnection.h; sourceTree = ""; }; - 19D0D3BB2770982C0010B299 /* blog_channel_ncd_net_ipv4_route.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = blog_channel_ncd_net_ipv4_route.h; sourceTree = ""; }; - 19D0D3BC2770982C0010B299 /* blog_channel_ncd_sys_request_server.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = blog_channel_ncd_sys_request_server.h; sourceTree = ""; }; - 19D0D3BD2770982C0010B299 /* blog_channel_ncd_sys_watch_usb.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = blog_channel_ncd_sys_watch_usb.h; sourceTree = ""; }; - 19D0D3BE2770982C0010B299 /* blog_channel_ncd_run.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = blog_channel_ncd_run.h; sourceTree = ""; }; - 19D0D3BF2770982C0010B299 /* blog_channels_list.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = blog_channels_list.h; sourceTree = ""; }; - 19D0D3C02770982C0010B299 /* blog_channel_NCDValGenerator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = blog_channel_NCDValGenerator.h; sourceTree = ""; }; - 19D0D3C12770982C0010B299 /* blog_channel_FrameDecider.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = blog_channel_FrameDecider.h; sourceTree = ""; }; - 19D0D3C22770982C0010B299 /* blog_channel_ncd_dynamic_depend.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = blog_channel_ncd_dynamic_depend.h; sourceTree = ""; }; - 19D0D3C32770982C0010B299 /* blog_channel_ncd_net_ipv6_wait_dynamic_addr.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = blog_channel_ncd_net_ipv6_wait_dynamic_addr.h; sourceTree = ""; }; - 19D0D3C42770982C0010B299 /* blog_channel_udpgw.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = blog_channel_udpgw.h; sourceTree = ""; }; - 19D0D3C52770982C0010B299 /* blog_channel_BUnixSignal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = blog_channel_BUnixSignal.h; sourceTree = ""; }; - 19D0D3C62770982C0010B299 /* blog_channel_ncd_parse.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = blog_channel_ncd_parse.h; sourceTree = ""; }; - 19D0D3C72770982C0010B299 /* blog_channel_ncd_ref.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = blog_channel_ncd_ref.h; sourceTree = ""; }; - 19D0D3C82770982C0010B299 /* blog_channel_NCDConfigTokenizer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = blog_channel_NCDConfigTokenizer.h; sourceTree = ""; }; - 19D0D3C92770982C0010B299 /* blog_channel_BDHCPClient.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = blog_channel_BDHCPClient.h; sourceTree = ""; }; - 19D0D3CA2770982C0010B299 /* blog_channel_ncd_spawn.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = blog_channel_ncd_spawn.h; sourceTree = ""; }; - 19D0D3CB2770982C0010B299 /* blog_channel_NCDModuleIndex.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = blog_channel_NCDModuleIndex.h; sourceTree = ""; }; - 19D0D3CC2770982C0010B299 /* blog_channel_ncd_logical.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = blog_channel_ncd_logical.h; sourceTree = ""; }; - 19D0D3CD2770982C0010B299 /* bproto_msgproto.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = bproto_msgproto.h; sourceTree = ""; }; - 19D0D3CE2770982C0010B299 /* blog_channel_ncd_process_manager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = blog_channel_ncd_process_manager.h; sourceTree = ""; }; - 19D0D3CF2770982C0010B299 /* blog_channel_ncd_net_backend_wpa_supplicant.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = blog_channel_ncd_net_backend_wpa_supplicant.h; sourceTree = ""; }; - 19D0D3D02770982C0010B299 /* blog_channel_BThreadWork.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = blog_channel_BThreadWork.h; sourceTree = ""; }; - 19D0D3D12770982C0010B299 /* blog_channel_ncd_try.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = blog_channel_ncd_try.h; sourceTree = ""; }; - 19D0D3D22770982C0010B299 /* blog_channel_BDatagram.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = blog_channel_BDatagram.h; sourceTree = ""; }; - 19D0D3D32770982C0010B299 /* blog_channel_ncd_sys_watch_input.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = blog_channel_ncd_sys_watch_input.h; sourceTree = ""; }; - 19D0D3D42770982C0010B299 /* blog_channel_ncd.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = blog_channel_ncd.h; sourceTree = ""; }; - 19D0D3D52770982C0010B299 /* blog_channel_ncd_implode.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = blog_channel_ncd_implode.h; sourceTree = ""; }; - 19D0D3D62770982C0010B299 /* blog_channel_NCDBuildProgram.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = blog_channel_NCDBuildProgram.h; sourceTree = ""; }; - 19D0D3D72770982C0010B299 /* blog_channel_ncd_file.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = blog_channel_ncd_file.h; sourceTree = ""; }; - 19D0D3D82770982C0010B299 /* blog_channel_ncd_strcmp.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = blog_channel_ncd_strcmp.h; sourceTree = ""; }; - 19D0D3D92770982C0010B299 /* blog_channel_ncd_value.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = blog_channel_ncd_value.h; sourceTree = ""; }; - 19D0D3DA2770982C0010B299 /* blog_channel_NCDValParser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = blog_channel_NCDValParser.h; sourceTree = ""; }; - 19D0D3DB2770982C0010B299 /* blog_channel_BPredicate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = blog_channel_BPredicate.h; sourceTree = ""; }; - 19D0D3DC2770982C0010B299 /* blog_channel_dostest_attacker.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = blog_channel_dostest_attacker.h; sourceTree = ""; }; - 19D0D3DD2770982C0010B299 /* blog_channel_client.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = blog_channel_client.h; sourceTree = ""; }; - 19D0D3DE2770982C0010B299 /* blog_channel_ncd_daemon.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = blog_channel_ncd_daemon.h; sourceTree = ""; }; - 19D0D3DF2770982C0010B299 /* blog_channel_NCDUdevManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = blog_channel_NCDUdevManager.h; sourceTree = ""; }; - 19D0D3E02770982C0010B299 /* blog_channel_PRStreamSource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = blog_channel_PRStreamSource.h; sourceTree = ""; }; - 19D0D3E12770982C0010B299 /* blog_channel_BSignal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = blog_channel_BSignal.h; sourceTree = ""; }; - 19D0D3E22770982C0010B299 /* blog_channel_ncd_foreach.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = blog_channel_ncd_foreach.h; sourceTree = ""; }; - 19D0D3E32770982C0010B299 /* blog_channel_ncd_netmask.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = blog_channel_ncd_netmask.h; sourceTree = ""; }; - 19D0D3E42770982C0010B299 /* blog_channel_NCDVal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = blog_channel_NCDVal.h; sourceTree = ""; }; - 19D0D3E52770982C0010B299 /* blog_channel_ncd_imperative.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = blog_channel_ncd_imperative.h; sourceTree = ""; }; - 19D0D3E62770982C0010B299 /* blog_channel_NCDUdevCache.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = blog_channel_NCDUdevCache.h; sourceTree = ""; }; - 19D0D3E72770982C0010B299 /* blog_channel_ncd_index.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = blog_channel_ncd_index.h; sourceTree = ""; }; - 19D0D3E82770982C0010B299 /* blog_channel_ncd_if.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = blog_channel_ncd_if.h; sourceTree = ""; }; - 19D0D3E92770982C0010B299 /* blog_channel_NCDInterfaceMonitor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = blog_channel_NCDInterfaceMonitor.h; sourceTree = ""; }; - 19D0D3EA2770982C0010B299 /* blog_channel_PacketProtoDecoder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = blog_channel_PacketProtoDecoder.h; sourceTree = ""; }; - 19D0D3EB2770982C0010B299 /* blog_channel_ncd_net_ipv4_addr.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = blog_channel_ncd_net_ipv4_addr.h; sourceTree = ""; }; - 19D0D3EC2770982C0010B299 /* blog_channel_ncd_explode.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = blog_channel_ncd_explode.h; sourceTree = ""; }; - 19D0D3ED2770982C0010B299 /* blog_channels_defines.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = blog_channels_defines.h; sourceTree = ""; }; - 19D0D3EE2770982C0010B299 /* blog_channel_ncd_log_msg.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = blog_channel_ncd_log_msg.h; sourceTree = ""; }; - 19D0D3EF2770982C0010B299 /* blog_channel_BArpProbe.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = blog_channel_BArpProbe.h; sourceTree = ""; }; - 19D0D3F02770982C0010B299 /* blog_channel_ncd_sleep.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = blog_channel_ncd_sleep.h; sourceTree = ""; }; - 19D0D3F12770982C0010B299 /* blog_channel_ncd_sys_start_process.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = blog_channel_ncd_sys_start_process.h; sourceTree = ""; }; - 19D0D3F22770982C0010B299 /* blog_channel_ncd_substr.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = blog_channel_ncd_substr.h; sourceTree = ""; }; - 19D0D3F32770982C0010B299 /* blog_channel_ncd_log.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = blog_channel_ncd_log.h; sourceTree = ""; }; - 19D0D3F42770982C0010B299 /* blog_channel_ncd_request.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = blog_channel_ncd_request.h; sourceTree = ""; }; - 19D0D3F52770982C0010B299 /* blog_channel_ncd_net_backend_rfkill.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = blog_channel_ncd_net_backend_rfkill.h; sourceTree = ""; }; - 19D0D3F62770982C0010B299 /* blog_channel_ncd_objref.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = blog_channel_ncd_objref.h; sourceTree = ""; }; - 19D0D3F72770982C0010B299 /* blog_channel_ncd_net_watch_interfaces.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = blog_channel_ncd_net_watch_interfaces.h; sourceTree = ""; }; - 19D0D3F82770982C0010B299 /* blog_channel_ncd_from_string.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = blog_channel_ncd_from_string.h; sourceTree = ""; }; - 19D0D3F92770982C0010B299 /* blog_channel_BThreadSignal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = blog_channel_BThreadSignal.h; sourceTree = ""; }; - 19D0D3FA2770982C0010B299 /* blog_channel_BEncryption.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = blog_channel_BEncryption.h; sourceTree = ""; }; - 19D0D3FB2770982C0010B299 /* blog_channel_ncd_sys_watch_directory.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = blog_channel_ncd_sys_watch_directory.h; sourceTree = ""; }; - 19D0D3FC2770982C0010B299 /* blog_channel_ncd_net_ipv4_dhcp.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = blog_channel_ncd_net_ipv4_dhcp.h; sourceTree = ""; }; - 19D0D3FD2770982C0010B299 /* blog_channel_ncd_net_ipv6_route.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = blog_channel_ncd_net_ipv6_route.h; sourceTree = ""; }; - 19D0D3FE2770982C0010B299 /* blog_channel_ncd_arithmetic.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = blog_channel_ncd_arithmetic.h; sourceTree = ""; }; - 19D0D3FF2770982C0010B299 /* blog_channel_ncd_alias.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = blog_channel_ncd_alias.h; sourceTree = ""; }; - 19D0D4002770982C0010B299 /* blog_channel_ncd_concat.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = blog_channel_ncd_concat.h; sourceTree = ""; }; - 19D0D4012770982C0010B299 /* blog_channel_DataProto.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = blog_channel_DataProto.h; sourceTree = ""; }; - 19D0D4022770982C0010B299 /* blog_channel_ncd_net_ipv4_arp_probe.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = blog_channel_ncd_net_ipv4_arp_probe.h; sourceTree = ""; }; - 19D0D4032770982C0010B299 /* blog_channel_ncd_net_ipv6_addr.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = blog_channel_ncd_net_ipv6_addr.h; sourceTree = ""; }; - 19D0D4042770982C0010B299 /* blog_channel_NCDIfConfig.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = blog_channel_NCDIfConfig.h; sourceTree = ""; }; - 19D0D4052770982C0010B299 /* blog_channel_Listener.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = blog_channel_Listener.h; sourceTree = ""; }; - 19D0D4062770982C0010B299 /* blog_channel_tun2socks.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = blog_channel_tun2socks.h; sourceTree = ""; }; - 19D0D4072770982C0010B299 /* blog_channel_ncd_call2.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = blog_channel_ncd_call2.h; sourceTree = ""; }; - 19D0D4082770982C0010B299 /* blog_channel_ncd_buffer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = blog_channel_ncd_buffer.h; sourceTree = ""; }; - 19D0D4092770982C0010B299 /* blog_channel_NCDModuleProcess.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = blog_channel_NCDModuleProcess.h; sourceTree = ""; }; - 19D0D40A2770982C0010B299 /* blog_channel_ncd_load_module.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = blog_channel_ncd_load_module.h; sourceTree = ""; }; - 19D0D40B2770982C0010B299 /* blog_channel_ncd_depend_scope.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = blog_channel_ncd_depend_scope.h; sourceTree = ""; }; - 19D0D40C2770982C0010B299 /* blog_channel_ncd_var.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = blog_channel_ncd_var.h; sourceTree = ""; }; - 19D0D40D2770982C0010B299 /* blog_channel_NCDConfigParser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = blog_channel_NCDConfigParser.h; sourceTree = ""; }; - 19D0D40E2770982C0010B299 /* blog_channel_lwip.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = blog_channel_lwip.h; sourceTree = ""; }; - 19D0D40F2770982C0010B299 /* blog_channel_NCDRequestClient.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = blog_channel_NCDRequestClient.h; sourceTree = ""; }; - 19D0D4102770982C0010B299 /* blog_channel_DPRelay.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = blog_channel_DPRelay.h; sourceTree = ""; }; - 19D0D4112770982C0010B299 /* blog_channel_BInputProcess.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = blog_channel_BInputProcess.h; sourceTree = ""; }; - 19D0D4122770982C0010B299 /* blog_channel_ncd_net_ipv4_addr_in_network.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = blog_channel_ncd_net_ipv4_addr_in_network.h; sourceTree = ""; }; - 19D0D4132770982C0010B299 /* blog_channel_ncd_sys_evdev.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = blog_channel_ncd_sys_evdev.h; sourceTree = ""; }; - 19D0D4142770982C0010B299 /* blog_channel_ncd_exit.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = blog_channel_ncd_exit.h; sourceTree = ""; }; - 19D0D4152770982C0010B299 /* blog_channel_SPProtoDecoder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = blog_channel_SPProtoDecoder.h; sourceTree = ""; }; - 19D0D4162770982C0010B299 /* blog_channel_addr.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = blog_channel_addr.h; sourceTree = ""; }; - 19D0D4172770982C0010B299 /* blog_channel_ncd_backtrack.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = blog_channel_ncd_backtrack.h; sourceTree = ""; }; - 19D0D4182770982C0010B299 /* blog_channel_PasswordListener.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = blog_channel_PasswordListener.h; sourceTree = ""; }; - 19D0D4192770982C0010B299 /* blog_channel_ncd_to_string.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = blog_channel_ncd_to_string.h; sourceTree = ""; }; - 19D0D41A2770982C0010B299 /* blog_channel_ncd_net_backend_waitlink.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = blog_channel_ncd_net_backend_waitlink.h; sourceTree = ""; }; - 19D0D41B2770982C0010B299 /* blog_channel_nsskey.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = blog_channel_nsskey.h; sourceTree = ""; }; - 19D0D41C2770982C0010B299 /* blog_channel_DatagramPeerIO.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = blog_channel_DatagramPeerIO.h; sourceTree = ""; }; - 19D0D41D2770982C0010B299 /* blog_channel_ncd_regex_match.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = blog_channel_ncd_regex_match.h; sourceTree = ""; }; - 19D0D41E2770982C0010B299 /* blog_channel_DPReceive.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = blog_channel_DPReceive.h; sourceTree = ""; }; - 19D0D41F2770982C0010B299 /* blog_channel_ncd_valuemetic.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = blog_channel_ncd_valuemetic.h; sourceTree = ""; }; - 19D0D4202770982C0010B299 /* blog_channel_BTime.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = blog_channel_BTime.h; sourceTree = ""; }; - 19D0D4212770982C0010B299 /* blog_channel_ncd_timer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = blog_channel_ncd_timer.h; sourceTree = ""; }; - 19D0D4222770982C0010B299 /* bproto_bproto_test.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = bproto_bproto_test.h; sourceTree = ""; }; - 19D0D4232770982C0010B299 /* blog_channel_ncd_multidepend.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = blog_channel_ncd_multidepend.h; sourceTree = ""; }; - 19D0D4242770982C0010B299 /* blog_channel_server.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = blog_channel_server.h; sourceTree = ""; }; - 19D0D4252770982C0010B299 /* blog_channel_ncd_runonce.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = blog_channel_ncd_runonce.h; sourceTree = ""; }; - 19D0D4262770982C0010B299 /* blog_channel_dostest_server.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = blog_channel_dostest_server.h; sourceTree = ""; }; - 19D0D4272770982C0010B299 /* blog_channel_ncd_net_up.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = blog_channel_ncd_net_up.h; sourceTree = ""; }; - 19D0D4282770982C0010B299 /* blog_channel_BTap.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = blog_channel_BTap.h; sourceTree = ""; }; - 19D0D4292770982C0010B299 /* blog_channel_ncd_net_ipv6_addr_in_network.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = blog_channel_ncd_net_ipv6_addr_in_network.h; sourceTree = ""; }; - 19D0D42A2770982C0010B299 /* blog_channel_BProcess.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = blog_channel_BProcess.h; sourceTree = ""; }; - 19D0D42B2770982C0010B299 /* blog_channel_StreamPeerIO.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = blog_channel_StreamPeerIO.h; sourceTree = ""; }; - 19D0D42C2770982C0010B299 /* blog_channel_NCDRequest.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = blog_channel_NCDRequest.h; sourceTree = ""; }; - 19D0D42D2770982C0010B299 /* blog_channel_NCDRfkillMonitor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = blog_channel_NCDRfkillMonitor.h; sourceTree = ""; }; - 19D0D42E2770982C0010B299 /* blog_channel_NCDUdevMonitorParser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = blog_channel_NCDUdevMonitorParser.h; sourceTree = ""; }; - 19D0D42F2770982C0010B299 /* blog_channel_ServerConnection.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = blog_channel_ServerConnection.h; sourceTree = ""; }; - 19D0D4302770982C0010B299 /* blog_channel_ncd_getargs.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = blog_channel_ncd_getargs.h; sourceTree = ""; }; - 19D0D4312770982C0010B299 /* blog_channel_BDHCPClientCore.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = blog_channel_BDHCPClientCore.h; sourceTree = ""; }; - 19D0D4322770982C0010B299 /* blog_channel_PRStreamSink.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = blog_channel_PRStreamSink.h; sourceTree = ""; }; - 19D0D4332770982C0010B299 /* blog_channel_ncd_getenv.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = blog_channel_ncd_getenv.h; sourceTree = ""; }; - 19D0D4342770982C0010B299 /* bproto_addr.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = bproto_addr.h; sourceTree = ""; }; - 19D0D4352770982C0010B299 /* blog_channel_ncd_blocker.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = blog_channel_ncd_blocker.h; sourceTree = ""; }; - 19D0D4362770982C0010B299 /* blog_channel_ncd_reboot.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = blog_channel_ncd_reboot.h; sourceTree = ""; }; - 19D0D4372770982C0010B299 /* blog_channel_ncd_choose.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = blog_channel_ncd_choose.h; sourceTree = ""; }; - 19D0D4382770982C0010B299 /* blog_channel_LineBuffer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = blog_channel_LineBuffer.h; sourceTree = ""; }; - 19D0D4392770982C0010B299 /* blog_channel_FragmentProtoAssembler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = blog_channel_FragmentProtoAssembler.h; sourceTree = ""; }; - 19D0D43A2770982C0010B299 /* blog_channel_ncd_socket.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = blog_channel_ncd_socket.h; sourceTree = ""; }; - 19D0D43B2770982C0010B299 /* blog_channel_UdpGwClient.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = blog_channel_UdpGwClient.h; sourceTree = ""; }; - 19D0D43C2770982C0010B299 /* blog_channel_flooder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = blog_channel_flooder.h; sourceTree = ""; }; - 19D0D43D2770982C0010B299 /* blog_channel_ncd_assert.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = blog_channel_ncd_assert.h; sourceTree = ""; }; - 19D0D43E2770982C0010B299 /* blog_channel_ncd_net_backend_waitdevice.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = blog_channel_ncd_net_backend_waitdevice.h; sourceTree = ""; }; - 19D0D43F2770982C0010B299 /* blog_channel_ncd_basic_functions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = blog_channel_ncd_basic_functions.h; sourceTree = ""; }; - 19D0D4402770982C0010B299 /* blog_channel_NCDPlaceholderDb.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = blog_channel_NCDPlaceholderDb.h; sourceTree = ""; }; - 19D0D4412770982C0010B299 /* blog_channel_ncd_list.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = blog_channel_ncd_list.h; sourceTree = ""; }; - 19D0D4422770982C0010B299 /* blog_channel_PeerChat.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = blog_channel_PeerChat.h; sourceTree = ""; }; - 19D0D4432770982C0010B299 /* blog_channel_ncd_net_backend_badvpn.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = blog_channel_ncd_net_backend_badvpn.h; sourceTree = ""; }; - 19D0D4442770982C0010B299 /* blog_channel_ncd_print.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = blog_channel_ncd_print.h; sourceTree = ""; }; - 19D0D4452770982C0010B299 /* blog_channel_BNetwork.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = blog_channel_BNetwork.h; sourceTree = ""; }; - 19D0D4462770982C0010B299 /* blog_channel_BLockReactor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = blog_channel_BLockReactor.h; sourceTree = ""; }; - 19D0D4472770982C0010B299 /* blog_channel_ncd_ondemand.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = blog_channel_ncd_ondemand.h; sourceTree = ""; }; - 19D0D4482770982C0010B299 /* blog_channel_ncd_net_iptables.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = blog_channel_ncd_net_iptables.h; sourceTree = ""; }; - 19D0D4492770982C0010B299 /* blog_channel_ncd_depend.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = blog_channel_ncd_depend.h; sourceTree = ""; }; - 19D0D44A2770982C0010B299 /* blog_channel_ncd_sys_request_client.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = blog_channel_ncd_sys_request_client.h; sourceTree = ""; }; - 19D0D44B2770982C0010B299 /* blog_channel_ncd_net_dns.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = blog_channel_ncd_net_dns.h; sourceTree = ""; }; - 19D0D44C2770982C0010B299 /* blog_channel_NCDUdevMonitor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = blog_channel_NCDUdevMonitor.h; sourceTree = ""; }; - 19D0D44D2770982C0010B299 /* blog_channel_BSocksClient.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = blog_channel_BSocksClient.h; sourceTree = ""; }; - 19D0D44F2770982C0010B299 /* BSocksClient.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = BSocksClient.c; sourceTree = ""; }; - 19D0D4502770982C0010B299 /* BSocksClient.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BSocksClient.h; sourceTree = ""; }; - 19D0D4522770982C0010B299 /* packed.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = packed.h; sourceTree = ""; }; - 19D0D4532770982C0010B299 /* concat_strings.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = concat_strings.h; sourceTree = ""; }; - 19D0D4542770982C0010B299 /* Utf8Decoder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Utf8Decoder.h; sourceTree = ""; }; - 19D0D4552770982C0010B299 /* parse_number.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = parse_number.h; sourceTree = ""; }; - 19D0D4562770982C0010B299 /* udp_proto.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = udp_proto.h; sourceTree = ""; }; - 19D0D4572770982C0010B299 /* find_program.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = find_program.h; sourceTree = ""; }; - 19D0D4582770982C0010B299 /* minmax.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = minmax.h; sourceTree = ""; }; - 19D0D4592770982C0010B299 /* socks_proto.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = socks_proto.h; sourceTree = ""; }; - 19D0D45A2770982C0010B299 /* string_begins_with.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = string_begins_with.h; sourceTree = ""; }; - 19D0D45B2770982C0010B299 /* dead.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = dead.h; sourceTree = ""; }; - 19D0D45C2770982C0010B299 /* strdup.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = strdup.h; sourceTree = ""; }; - 19D0D45D2770982C0010B299 /* debug.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = debug.h; sourceTree = ""; }; - 19D0D45E2770982C0010B299 /* array_length.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = array_length.h; sourceTree = ""; }; - 19D0D45F2770982C0010B299 /* version.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = version.h; sourceTree = ""; }; - 19D0D4602770982C0010B299 /* bsort.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = bsort.h; sourceTree = ""; }; - 19D0D4612770982C0010B299 /* debugcounter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = debugcounter.h; sourceTree = ""; }; - 19D0D4622770982C0010B299 /* byteorder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = byteorder.h; sourceTree = ""; }; - 19D0D4632770982C0010B299 /* unicode_funcs.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = unicode_funcs.h; sourceTree = ""; }; - 19D0D4642770982C0010B299 /* Utf16Decoder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Utf16Decoder.h; sourceTree = ""; }; - 19D0D4652770982C0010B299 /* bstring.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = bstring.h; sourceTree = ""; }; - 19D0D4662770982C0010B299 /* maxalign.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = maxalign.h; sourceTree = ""; }; - 19D0D4672770982C0010B299 /* offset.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = offset.h; sourceTree = ""; }; - 19D0D4682770982C0010B299 /* cmdline.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cmdline.h; sourceTree = ""; }; - 19D0D4692770982C0010B299 /* expstring.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = expstring.h; sourceTree = ""; }; - 19D0D46A2770982C0010B299 /* merge.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = merge.h; sourceTree = ""; }; - 19D0D46B2770982C0010B299 /* ipaddr.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ipaddr.h; sourceTree = ""; }; - 19D0D46C2770982D0010B299 /* write_file.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = write_file.h; sourceTree = ""; }; - 19D0D46D2770982D0010B299 /* print_macros.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = print_macros.h; sourceTree = ""; }; - 19D0D46E2770982D0010B299 /* substring.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = substring.h; sourceTree = ""; }; - 19D0D46F2770982D0010B299 /* balign.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = balign.h; sourceTree = ""; }; - 19D0D4702770982D0010B299 /* debugerror.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = debugerror.h; sourceTree = ""; }; - 19D0D4712770982D0010B299 /* memref.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = memref.h; sourceTree = ""; }; - 19D0D4722770982D0010B299 /* hashfun.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = hashfun.h; sourceTree = ""; }; - 19D0D4732770982D0010B299 /* igmp_proto.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = igmp_proto.h; sourceTree = ""; }; - 19D0D4742770982D0010B299 /* mswsock.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = mswsock.h; sourceTree = ""; }; - 19D0D4752770982D0010B299 /* get_iface_info.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = get_iface_info.h; sourceTree = ""; }; - 19D0D4762770982D0010B299 /* sslsocket.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = sslsocket.h; sourceTree = ""; }; - 19D0D4772770982D0010B299 /* blimits.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = blimits.h; sourceTree = ""; }; - 19D0D4782770982D0010B299 /* balloc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = balloc.h; sourceTree = ""; }; - 19D0D4792770982D0010B299 /* ipaddr6.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ipaddr6.h; sourceTree = ""; }; - 19D0D47A2770982D0010B299 /* compare.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = compare.h; sourceTree = ""; }; - 19D0D47B2770982D0010B299 /* nonblocking.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = nonblocking.h; sourceTree = ""; }; - 19D0D47C2770982D0010B299 /* loglevel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = loglevel.h; sourceTree = ""; }; - 19D0D47D2770982D0010B299 /* modadd.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = modadd.h; sourceTree = ""; }; - 19D0D47E2770982D0010B299 /* nsskey.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = nsskey.h; sourceTree = ""; }; - 19D0D47F2770982D0010B299 /* ethernet_proto.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ethernet_proto.h; sourceTree = ""; }; - 19D0D4802770982D0010B299 /* find_char.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = find_char.h; sourceTree = ""; }; - 19D0D4812770982D0010B299 /* read_write_int.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = read_write_int.h; sourceTree = ""; }; - 19D0D4822770982D0010B299 /* ipv6_proto.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ipv6_proto.h; sourceTree = ""; }; - 19D0D4832770982D0010B299 /* loggers_string.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = loggers_string.h; sourceTree = ""; }; - 19D0D4842770982D0010B299 /* overflow.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = overflow.h; sourceTree = ""; }; - 19D0D4852770982D0010B299 /* open_standard_streams.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = open_standard_streams.h; sourceTree = ""; }; - 19D0D4862770982D0010B299 /* Utf16Encoder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Utf16Encoder.h; sourceTree = ""; }; - 19D0D4872770982D0010B299 /* read_file.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = read_file.h; sourceTree = ""; }; - 19D0D4882770982D0010B299 /* dhcp_proto.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = dhcp_proto.h; sourceTree = ""; }; - 19D0D4892770982D0010B299 /* exparray.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = exparray.h; sourceTree = ""; }; - 19D0D48A2770982D0010B299 /* BRefTarget.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BRefTarget.h; sourceTree = ""; }; - 19D0D48B2770982D0010B299 /* ipv4_proto.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ipv4_proto.h; sourceTree = ""; }; - 19D0D48C2770982D0010B299 /* grow_array.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = grow_array.h; sourceTree = ""; }; - 19D0D48D2770982D0010B299 /* stdbuf_cmdline.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = stdbuf_cmdline.h; sourceTree = ""; }; - 19D0D48E2770982D0010B299 /* arp_proto.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = arp_proto.h; sourceTree = ""; }; - 19D0D48F2770982D0010B299 /* ascii_utils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ascii_utils.h; sourceTree = ""; }; - 19D0D4902770982D0010B299 /* bsize.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = bsize.h; sourceTree = ""; }; - 19D0D4912770982D0010B299 /* Utf8Encoder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Utf8Encoder.h; sourceTree = ""; }; - 19D0D4942770982D0010B299 /* sys.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = sys.c; sourceTree = ""; }; - 19D0D4962770982D0010B299 /* cc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cc.h; sourceTree = ""; }; - 19D0D4972770982D0010B299 /* perf.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = perf.h; sourceTree = ""; }; - 19D0D4982770982D0010B299 /* lwipopts.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = lwipopts.h; sourceTree = ""; }; - 19D0D49B2770982D0010B299 /* memp.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = memp.c; sourceTree = ""; }; - 19D0D49C2770982D0010B299 /* inet_chksum.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = inet_chksum.c; sourceTree = ""; }; - 19D0D49D2770982D0010B299 /* tcp_out.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = tcp_out.c; sourceTree = ""; }; - 19D0D49E2770982D0010B299 /* init.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = init.c; sourceTree = ""; }; - 19D0D49F2770982D0010B299 /* mem.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = mem.c; sourceTree = ""; }; - 19D0D4A02770982D0010B299 /* def.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = def.c; sourceTree = ""; }; - 19D0D4A12770982D0010B299 /* udp.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = udp.c; sourceTree = ""; }; - 19D0D4A22770982D0010B299 /* stats.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = stats.c; sourceTree = ""; }; - 19D0D4A32770982D0010B299 /* tcp_in.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = tcp_in.c; sourceTree = ""; }; - 19D0D4A52770982D0010B299 /* ip_frag.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ip_frag.c; sourceTree = ""; }; - 19D0D4A62770982D0010B299 /* icmp.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = icmp.c; sourceTree = ""; }; - 19D0D4A72770982D0010B299 /* ip4.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ip4.c; sourceTree = ""; }; - 19D0D4A82770982D0010B299 /* ip4_addr.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ip4_addr.c; sourceTree = ""; }; - 19D0D4A92770982D0010B299 /* netif.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = netif.c; sourceTree = ""; }; - 19D0D4AA2770982D0010B299 /* tcp.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = tcp.c; sourceTree = ""; }; - 19D0D4AB2770982D0010B299 /* timers.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = timers.c; sourceTree = ""; }; - 19D0D4AC2770982D0010B299 /* pbuf.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = pbuf.c; sourceTree = ""; }; - 19D0D4AE2770982D0010B299 /* ip6.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ip6.c; sourceTree = ""; }; - 19D0D4AF2770982D0010B299 /* icmp6.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = icmp6.c; sourceTree = ""; }; - 19D0D4B02770982D0010B299 /* nd6.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = nd6.c; sourceTree = ""; }; - 19D0D4B12770982D0010B299 /* ip6_addr.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ip6_addr.c; sourceTree = ""; }; - 19D0D4B22770982D0010B299 /* ip6_frag.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ip6_frag.c; sourceTree = ""; }; - 19D0D4B62770982D0010B299 /* socket.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = socket.h; sourceTree = ""; }; - 19D0D4B72770982D0010B299 /* netdb.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = netdb.h; sourceTree = ""; }; - 19D0D4B92770982D0010B299 /* timers.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = timers.h; sourceTree = ""; }; - 19D0D4BA2770982D0010B299 /* pbuf.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pbuf.h; sourceTree = ""; }; - 19D0D4BB2770982D0010B299 /* tcp_impl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = tcp_impl.h; sourceTree = ""; }; - 19D0D4BC2770982D0010B299 /* tcp.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = tcp.h; sourceTree = ""; }; - 19D0D4BD2770982D0010B299 /* err.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = err.h; sourceTree = ""; }; - 19D0D4BE2770982D0010B299 /* snmp_asn1.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = snmp_asn1.h; sourceTree = ""; }; - 19D0D4BF2770982D0010B299 /* netif.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = netif.h; sourceTree = ""; }; - 19D0D4C02770982D0010B299 /* sio.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = sio.h; sourceTree = ""; }; - 19D0D4C12770982D0010B299 /* debug.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = debug.h; sourceTree = ""; }; - 19D0D4C22770982D0010B299 /* tcpip.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = tcpip.h; sourceTree = ""; }; - 19D0D4C32770982D0010B299 /* snmp.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = snmp.h; sourceTree = ""; }; - 19D0D4C42770982D0010B299 /* snmp_structs.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = snmp_structs.h; sourceTree = ""; }; - 19D0D4C52770982D0010B299 /* api_msg.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = api_msg.h; sourceTree = ""; }; - 19D0D4C62770982D0010B299 /* netifapi.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = netifapi.h; sourceTree = ""; }; - 19D0D4C72770982D0010B299 /* netbuf.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = netbuf.h; sourceTree = ""; }; - 19D0D4C82770982D0010B299 /* api.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = api.h; sourceTree = ""; }; - 19D0D4C92770982D0010B299 /* dhcp.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = dhcp.h; sourceTree = ""; }; - 19D0D4CA2770982D0010B299 /* memp.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = memp.h; sourceTree = ""; }; - 19D0D4CB2770982D0010B299 /* sockets.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = sockets.h; sourceTree = ""; }; - 19D0D4CC2770982D0010B299 /* ip_addr.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ip_addr.h; sourceTree = ""; }; - 19D0D4CD2770982D0010B299 /* opt.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = opt.h; sourceTree = ""; }; - 19D0D4CE2770982D0010B299 /* inet_chksum.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = inet_chksum.h; sourceTree = ""; }; - 19D0D4CF2770982D0010B299 /* raw.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = raw.h; sourceTree = ""; }; - 19D0D4D02770982D0010B299 /* sys.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = sys.h; sourceTree = ""; }; - 19D0D4D12770982D0010B299 /* netdb.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = netdb.h; sourceTree = ""; }; - 19D0D4D22770982D0010B299 /* def.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = def.h; sourceTree = ""; }; - 19D0D4D32770982D0010B299 /* mem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = mem.h; sourceTree = ""; }; - 19D0D4D42770982D0010B299 /* dns.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = dns.h; sourceTree = ""; }; - 19D0D4D52770982D0010B299 /* ip.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ip.h; sourceTree = ""; }; - 19D0D4D62770982D0010B299 /* init.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = init.h; sourceTree = ""; }; - 19D0D4D72770982D0010B299 /* snmp_msg.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = snmp_msg.h; sourceTree = ""; }; - 19D0D4D82770982D0010B299 /* stats.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = stats.h; sourceTree = ""; }; - 19D0D4D92770982D0010B299 /* memp_std.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = memp_std.h; sourceTree = ""; }; - 19D0D4DA2770982D0010B299 /* udp.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = udp.h; sourceTree = ""; }; - 19D0D4DB2770982D0010B299 /* arch.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = arch.h; sourceTree = ""; }; - 19D0D4DD2770982D0010B299 /* etharp.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = etharp.h; sourceTree = ""; }; - 19D0D4DE2770982D0010B299 /* ppp_oe.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ppp_oe.h; sourceTree = ""; }; - 19D0D4DF2770982D0010B299 /* slipif.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = slipif.h; sourceTree = ""; }; - 19D0D4E22770982D0010B299 /* igmp.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = igmp.h; sourceTree = ""; }; - 19D0D4E32770982D0010B299 /* ip4.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ip4.h; sourceTree = ""; }; - 19D0D4E42770982D0010B299 /* icmp.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = icmp.h; sourceTree = ""; }; - 19D0D4E52770982D0010B299 /* inet.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = inet.h; sourceTree = ""; }; - 19D0D4E62770982D0010B299 /* ip4_addr.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ip4_addr.h; sourceTree = ""; }; - 19D0D4E72770982D0010B299 /* autoip.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = autoip.h; sourceTree = ""; }; - 19D0D4E82770982D0010B299 /* ip_frag.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ip_frag.h; sourceTree = ""; }; - 19D0D4EB2770982D0010B299 /* nd6.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = nd6.h; sourceTree = ""; }; - 19D0D4EC2770982D0010B299 /* ethip6.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ethip6.h; sourceTree = ""; }; - 19D0D4ED2770982D0010B299 /* inet6.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = inet6.h; sourceTree = ""; }; - 19D0D4EE2770982D0010B299 /* ip6_addr.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ip6_addr.h; sourceTree = ""; }; - 19D0D4EF2770982D0010B299 /* ip6_frag.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ip6_frag.h; sourceTree = ""; }; - 19D0D4F02770982D0010B299 /* ip6.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ip6.h; sourceTree = ""; }; - 19D0D4F12770982D0010B299 /* icmp6.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = icmp6.h; sourceTree = ""; }; - 19D0D4F22770982D0010B299 /* dhcp6.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = dhcp6.h; sourceTree = ""; }; - 19D0D4F32770982D0010B299 /* mld6.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = mld6.h; sourceTree = ""; }; - 19D0D4F52770982D0010B299 /* BTap.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BTap.m; sourceTree = ""; }; - 19D0D4F62770982D0010B299 /* BTap.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BTap.h; sourceTree = ""; }; - 19D0D4F82770982D0010B299 /* udpgw.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = udpgw.h; sourceTree = ""; }; - 19D0D4F92770982D0010B299 /* udpgw.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = udpgw.c; sourceTree = ""; }; - 19D0D4FB2770982D0010B299 /* udpgw_proto.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = udpgw_proto.h; sourceTree = ""; }; - 19D0D4FC2770982D0010B299 /* requestproto.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = requestproto.h; sourceTree = ""; }; - 19D0D4FD2770982D0010B299 /* msgproto.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = msgproto.h; sourceTree = ""; }; - 19D0D4FE2770982D0010B299 /* spproto.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = spproto.h; sourceTree = ""; }; - 19D0D4FF2770982D0010B299 /* packetproto.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = packetproto.h; sourceTree = ""; }; - 19D0D5002770982D0010B299 /* dataproto.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = dataproto.h; sourceTree = ""; }; - 19D0D5012770982D0010B299 /* addr.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = addr.h; sourceTree = ""; }; - 19D0D5022770982D0010B299 /* scproto.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = scproto.h; sourceTree = ""; }; - 19D0D5032770982D0010B299 /* addr.bproto */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = addr.bproto; sourceTree = ""; }; - 19D0D5042770982D0010B299 /* fragmentproto.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fragmentproto.h; sourceTree = ""; }; - 19D0D5052770982D0010B299 /* msgproto.bproto */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = msgproto.bproto; sourceTree = ""; }; - 19D0D5072770982D0010B299 /* BDatagram_unix.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BDatagram_unix.h; sourceTree = ""; }; - 19D0D5082770982D0010B299 /* BUnixSignal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BUnixSignal.h; sourceTree = ""; }; - 19D0D5092770982D0010B299 /* BNetwork.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = BNetwork.c; sourceTree = ""; }; - 19D0D50A2770982D0010B299 /* BConnection.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BConnection.h; sourceTree = ""; }; - 19D0D50B2770982D0010B299 /* BConnection_common.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = BConnection_common.c; sourceTree = ""; }; - 19D0D50C2770982D0010B299 /* BReactor_badvpn.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BReactor_badvpn.h; sourceTree = ""; }; - 19D0D50D2770982D0010B299 /* BAddr.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BAddr.h; sourceTree = ""; }; - 19D0D50E2770982D0010B299 /* BReactor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BReactor.h; sourceTree = ""; }; - 19D0D50F2770982D0010B299 /* BConnection_unix.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BConnection_unix.h; sourceTree = ""; }; - 19D0D5102770982D0010B299 /* BTime.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = BTime.c; sourceTree = ""; }; - 19D0D5112770982D0010B299 /* BSignal.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = BSignal.c; sourceTree = ""; }; - 19D0D5122770982D0010B299 /* BReactor_badvpn_timerstree.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BReactor_badvpn_timerstree.h; sourceTree = ""; }; - 19D0D5132770982D0010B299 /* BDatagram_unix.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = BDatagram_unix.c; sourceTree = ""; }; - 19D0D5142770982D0010B299 /* BNetwork.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BNetwork.h; sourceTree = ""; }; - 19D0D5152770982D0010B299 /* BUnixSignal.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = BUnixSignal.c; sourceTree = ""; }; - 19D0D5162770982D0010B299 /* BDatagram.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BDatagram.h; sourceTree = ""; }; - 19D0D5172770982D0010B299 /* BReactor_badvpn.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = BReactor_badvpn.c; sourceTree = ""; }; - 19D0D5182770982D0010B299 /* BSignal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BSignal.h; sourceTree = ""; }; - 19D0D5192770982D0010B299 /* BTime.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BTime.h; sourceTree = ""; }; - 19D0D51A2770982D0010B299 /* BConnection_unix.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = BConnection_unix.c; sourceTree = ""; }; - 19D0D51C2770982D0010B299 /* tun2socks.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = tun2socks.c; sourceTree = ""; }; - 19D0D51D2770982D0010B299 /* SocksUdpGwClient.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SocksUdpGwClient.h; sourceTree = ""; }; - 19D0D51E2770982D0010B299 /* tun2socks.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = tun2socks.h; sourceTree = ""; }; - 19D0D51F2770982D0010B299 /* SocksUdpGwClient.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = SocksUdpGwClient.c; sourceTree = ""; }; - 19D0D5212770982D0010B299 /* SAvl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SAvl.h; sourceTree = ""; }; - 19D0D5222770982D0010B299 /* Vector_footer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Vector_footer.h; sourceTree = ""; }; - 19D0D5232770982D0010B299 /* ChunkBuffer2.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ChunkBuffer2.h; sourceTree = ""; }; - 19D0D5242770982D0010B299 /* IndexedList_tree.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IndexedList_tree.h; sourceTree = ""; }; - 19D0D5252770982D0010B299 /* LinkedList1.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LinkedList1.h; sourceTree = ""; }; - 19D0D5262770982D0010B299 /* Vector_header.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Vector_header.h; sourceTree = ""; }; - 19D0D5272770982D0010B299 /* CAvl_header.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CAvl_header.h; sourceTree = ""; }; - 19D0D5282770982D0010B299 /* Vector_decl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Vector_decl.h; sourceTree = ""; }; - 19D0D5292770982D0010B299 /* CHash_decl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CHash_decl.h; sourceTree = ""; }; - 19D0D52A2770982D0010B299 /* CAvl_footer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CAvl_footer.h; sourceTree = ""; }; - 19D0D52B2770982D0010B299 /* SLinkedList_decl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SLinkedList_decl.h; sourceTree = ""; }; - 19D0D52C2770982D0010B299 /* CAvl_impl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CAvl_impl.h; sourceTree = ""; }; - 19D0D52D2770982D0010B299 /* SAvl_decl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SAvl_decl.h; sourceTree = ""; }; - 19D0D52E2770982D0010B299 /* CHash.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CHash.h; sourceTree = ""; }; - 19D0D52F2770982D0010B299 /* SAvl_footer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SAvl_footer.h; sourceTree = ""; }; - 19D0D5302770982D0010B299 /* SAvl_tree.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SAvl_tree.h; sourceTree = ""; }; - 19D0D5312770982D0010B299 /* IndexedList.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IndexedList.h; sourceTree = ""; }; - 19D0D5322770982D0010B299 /* SAvl_header.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SAvl_header.h; sourceTree = ""; }; - 19D0D5332770982D0010B299 /* LinkedList3.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LinkedList3.h; sourceTree = ""; }; - 19D0D5342770982D0010B299 /* BAVL.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BAVL.h; sourceTree = ""; }; - 19D0D5352770982D0010B299 /* SLinkedList_impl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SLinkedList_impl.h; sourceTree = ""; }; - 19D0D5362770982D0010B299 /* CAvl_decl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CAvl_decl.h; sourceTree = ""; }; - 19D0D5372770982D0010B299 /* CAvl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CAvl.h; sourceTree = ""; }; - 19D0D5382770982D0010B299 /* Vector_impl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Vector_impl.h; sourceTree = ""; }; - 19D0D5392770982D0010B299 /* SLinkedList.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SLinkedList.h; sourceTree = ""; }; - 19D0D53A2770982D0010B299 /* CHash_impl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CHash_impl.h; sourceTree = ""; }; - 19D0D53B2770982D0010B299 /* CHash_footer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CHash_footer.h; sourceTree = ""; }; - 19D0D53C2770982D0010B299 /* LinkedList0.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LinkedList0.h; sourceTree = ""; }; - 19D0D53D2770982D0010B299 /* CHash_header.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CHash_header.h; sourceTree = ""; }; - 19D0D53E2770982D0010B299 /* SAvl_impl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SAvl_impl.h; sourceTree = ""; }; - 19D0D53F2770982D0010B299 /* Vector.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Vector.h; sourceTree = ""; }; - 19D0D5402770982D0010B299 /* SLinkedList_footer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SLinkedList_footer.h; sourceTree = ""; }; - 19D0D5412770982D0010B299 /* SLinkedList_header.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SLinkedList_header.h; sourceTree = ""; }; - 19D0D5432770982D0010B299 /* PacketPassInactivityMonitor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PacketPassInactivityMonitor.h; sourceTree = ""; }; - 19D0D5442770982D0010B299 /* PacketPassInactivityMonitor.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = PacketPassInactivityMonitor.c; sourceTree = ""; }; - 19D0D5462770982D0010B299 /* BLog.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BLog.m; sourceTree = ""; }; - 19D0D5472770982E0010B299 /* BLog_syslog.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = BLog_syslog.c; sourceTree = ""; }; - 19D0D5482770982E0010B299 /* BPending_list.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BPending_list.h; sourceTree = ""; }; - 19D0D5492770982E0010B299 /* DebugObject.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = DebugObject.c; sourceTree = ""; }; - 19D0D54A2770982E0010B299 /* BPending.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BPending.h; sourceTree = ""; }; - 19D0D54B2770982E0010B299 /* BLog_syslog.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BLog_syslog.h; sourceTree = ""; }; - 19D0D54C2770982E0010B299 /* BLog.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BLog.h; sourceTree = ""; }; - 19D0D54D2770982E0010B299 /* BMutex.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BMutex.h; sourceTree = ""; }; - 19D0D54E2770982E0010B299 /* BPending.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = BPending.c; sourceTree = ""; }; - 19D0D54F2770982E0010B299 /* DebugObject.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DebugObject.h; sourceTree = ""; }; - 19D0D5512770982E0010B299 /* UdpGwClient.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = UdpGwClient.c; sourceTree = ""; }; - 19D0D5522770982E0010B299 /* UdpGwClient.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UdpGwClient.h; sourceTree = ""; }; - 19D0D5542770982E0010B299 /* PacketBuffer.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = PacketBuffer.c; sourceTree = ""; }; - 19D0D5552770982E0010B299 /* PacketStreamSender.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PacketStreamSender.h; sourceTree = ""; }; - 19D0D5562770982E0010B299 /* BufferWriter.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = BufferWriter.c; sourceTree = ""; }; - 19D0D5572770982E0010B299 /* PacketRecvInterface.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = PacketRecvInterface.c; sourceTree = ""; }; - 19D0D5582770982E0010B299 /* PacketPassFairQueue_tree.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PacketPassFairQueue_tree.h; sourceTree = ""; }; - 19D0D5592770982E0010B299 /* SinglePacketBuffer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SinglePacketBuffer.h; sourceTree = ""; }; - 19D0D55A2770982E0010B299 /* PacketProtoDecoder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PacketProtoDecoder.h; sourceTree = ""; }; - 19D0D55B2770982E0010B299 /* StreamRecvInterface.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = StreamRecvInterface.c; sourceTree = ""; }; - 19D0D55C2770982E0010B299 /* PacketProtoEncoder.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = PacketProtoEncoder.c; sourceTree = ""; }; - 19D0D55D2770982E0010B299 /* StreamPassInterface.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = StreamPassInterface.c; sourceTree = ""; }; - 19D0D55E2770982E0010B299 /* PacketPassConnector.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = PacketPassConnector.c; sourceTree = ""; }; - 19D0D55F2770982E0010B299 /* PacketPassFairQueue.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PacketPassFairQueue.h; sourceTree = ""; }; - 19D0D5602770982E0010B299 /* PacketProtoFlow.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = PacketProtoFlow.c; sourceTree = ""; }; - 19D0D5612770982E0010B299 /* PacketPassInterface.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = PacketPassInterface.c; sourceTree = ""; }; - 19D0D5622770982E0010B299 /* BufferWriter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BufferWriter.h; sourceTree = ""; }; - 19D0D5632770982E0010B299 /* PacketRecvInterface.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PacketRecvInterface.h; sourceTree = ""; }; - 19D0D5642770982E0010B299 /* PacketBuffer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PacketBuffer.h; sourceTree = ""; }; - 19D0D5652770982E0010B299 /* PacketStreamSender.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = PacketStreamSender.c; sourceTree = ""; }; - 19D0D5662770982E0010B299 /* StreamRecvInterface.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = StreamRecvInterface.h; sourceTree = ""; }; - 19D0D5672770982E0010B299 /* PacketProtoDecoder.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = PacketProtoDecoder.c; sourceTree = ""; }; - 19D0D5682770982E0010B299 /* SinglePacketBuffer.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = SinglePacketBuffer.c; sourceTree = ""; }; - 19D0D5692770982E0010B299 /* PacketPassFairQueue.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = PacketPassFairQueue.c; sourceTree = ""; }; - 19D0D56A2770982E0010B299 /* PacketPassConnector.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PacketPassConnector.h; sourceTree = ""; }; - 19D0D56B2770982E0010B299 /* StreamPassInterface.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = StreamPassInterface.h; sourceTree = ""; }; - 19D0D56C2770982E0010B299 /* PacketProtoEncoder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PacketProtoEncoder.h; sourceTree = ""; }; - 19D0D56D2770982E0010B299 /* PacketPassInterface.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PacketPassInterface.h; sourceTree = ""; }; - 19D0D56E2770982E0010B299 /* PacketProtoFlow.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PacketProtoFlow.h; sourceTree = ""; }; - 19D0D56F2770982E0010B299 /* TunnelInterface.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TunnelInterface.h; sourceTree = ""; }; - 19D0D5702770982E0010B299 /* TunnelInterface.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TunnelInterface.m; sourceTree = ""; }; - 19D0D7162770998F0010B299 /* CocoaAsyncSocket.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CocoaAsyncSocket.framework; path = PacketProcessor/CocoaAsyncSocket/CocoaAsyncSocket.framework; sourceTree = ""; }; - 19D0D71A27709B4F0010B299 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = Info.plist; sourceTree = ""; }; - 19D0D71B2770A3AD0010B299 /* libresolv.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libresolv.tbd; path = Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.1.sdk/usr/lib/libresolv.tbd; sourceTree = DEVELOPER_DIR; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 19D0CCE6277092B50010B299 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 19D0D71C2770A3AD0010B299 /* libresolv.tbd in Frameworks */, - 19D0D718277099960010B299 /* CocoaAsyncSocket.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 19D0CCDF277092B50010B299 = { - isa = PBXGroup; - children = ( - 19D0CCEB277092B50010B299 /* PacketProcessor */, - 19D0CCEA277092B50010B299 /* Products */, - 19D0CCF4277096720010B299 /* Frameworks */, - ); - sourceTree = ""; - }; - 19D0CCEA277092B50010B299 /* Products */ = { - isa = PBXGroup; - children = ( - 19D0CCE9277092B50010B299 /* PacketProcessor.framework */, - ); - name = Products; - sourceTree = ""; - }; - 19D0CCEB277092B50010B299 /* PacketProcessor */ = { - isa = PBXGroup; - children = ( - 19D0D3B42770982C0010B299 /* tun2socks-iOS */, - 19D0D56F2770982E0010B299 /* TunnelInterface.h */, - 19D0D5702770982E0010B299 /* TunnelInterface.m */, - 19D0CCEC277092B50010B299 /* PacketProcessor.h */, - 19D0D71A27709B4F0010B299 /* Info.plist */, - ); - path = PacketProcessor; - sourceTree = ""; - }; - 19D0CCF4277096720010B299 /* Frameworks */ = { - isa = PBXGroup; - children = ( - 19D0D71B2770A3AD0010B299 /* libresolv.tbd */, - 19D0D7162770998F0010B299 /* CocoaAsyncSocket.framework */, - ); - name = Frameworks; - sourceTree = ""; - }; - 19D0D3B42770982C0010B299 /* tun2socks-iOS */ = { - isa = PBXGroup; - children = ( - 19D0D3B52770982C0010B299 /* generated */, - 19D0D44E2770982C0010B299 /* socksclient */, - 19D0D4512770982C0010B299 /* misc */, - 19D0D4922770982D0010B299 /* lwip */, - 19D0D4F42770982D0010B299 /* tuntap */, - 19D0D4F72770982D0010B299 /* udpgw */, - 19D0D4FA2770982D0010B299 /* protocol */, - 19D0D5062770982D0010B299 /* system */, - 19D0D51B2770982D0010B299 /* tun2socks */, - 19D0D5202770982D0010B299 /* structure */, - 19D0D5422770982D0010B299 /* flowextra */, - 19D0D5452770982D0010B299 /* base */, - 19D0D5502770982E0010B299 /* udpgw_client */, - 19D0D5532770982E0010B299 /* flow */, - ); - path = "tun2socks-iOS"; - sourceTree = ""; - }; - 19D0D3B52770982C0010B299 /* generated */ = { - isa = PBXGroup; - children = ( - 19D0D3B62770982C0010B299 /* blog_channel_SocksUdpGwClient.h */, - 19D0D3B72770982C0010B299 /* blog_channel_ncd_file_open.h */, - 19D0D3B82770982C0010B299 /* blog_channel_BReactor.h */, - 19D0D3B92770982C0010B299 /* blog_channel_BSSLConnection.h */, - 19D0D3BA2770982C0010B299 /* blog_channel_BConnection.h */, - 19D0D3BB2770982C0010B299 /* blog_channel_ncd_net_ipv4_route.h */, - 19D0D3BC2770982C0010B299 /* blog_channel_ncd_sys_request_server.h */, - 19D0D3BD2770982C0010B299 /* blog_channel_ncd_sys_watch_usb.h */, - 19D0D3BE2770982C0010B299 /* blog_channel_ncd_run.h */, - 19D0D3BF2770982C0010B299 /* blog_channels_list.h */, - 19D0D3C02770982C0010B299 /* blog_channel_NCDValGenerator.h */, - 19D0D3C12770982C0010B299 /* blog_channel_FrameDecider.h */, - 19D0D3C22770982C0010B299 /* blog_channel_ncd_dynamic_depend.h */, - 19D0D3C32770982C0010B299 /* blog_channel_ncd_net_ipv6_wait_dynamic_addr.h */, - 19D0D3C42770982C0010B299 /* blog_channel_udpgw.h */, - 19D0D3C52770982C0010B299 /* blog_channel_BUnixSignal.h */, - 19D0D3C62770982C0010B299 /* blog_channel_ncd_parse.h */, - 19D0D3C72770982C0010B299 /* blog_channel_ncd_ref.h */, - 19D0D3C82770982C0010B299 /* blog_channel_NCDConfigTokenizer.h */, - 19D0D3C92770982C0010B299 /* blog_channel_BDHCPClient.h */, - 19D0D3CA2770982C0010B299 /* blog_channel_ncd_spawn.h */, - 19D0D3CB2770982C0010B299 /* blog_channel_NCDModuleIndex.h */, - 19D0D3CC2770982C0010B299 /* blog_channel_ncd_logical.h */, - 19D0D3CD2770982C0010B299 /* bproto_msgproto.h */, - 19D0D3CE2770982C0010B299 /* blog_channel_ncd_process_manager.h */, - 19D0D3CF2770982C0010B299 /* blog_channel_ncd_net_backend_wpa_supplicant.h */, - 19D0D3D02770982C0010B299 /* blog_channel_BThreadWork.h */, - 19D0D3D12770982C0010B299 /* blog_channel_ncd_try.h */, - 19D0D3D22770982C0010B299 /* blog_channel_BDatagram.h */, - 19D0D3D32770982C0010B299 /* blog_channel_ncd_sys_watch_input.h */, - 19D0D3D42770982C0010B299 /* blog_channel_ncd.h */, - 19D0D3D52770982C0010B299 /* blog_channel_ncd_implode.h */, - 19D0D3D62770982C0010B299 /* blog_channel_NCDBuildProgram.h */, - 19D0D3D72770982C0010B299 /* blog_channel_ncd_file.h */, - 19D0D3D82770982C0010B299 /* blog_channel_ncd_strcmp.h */, - 19D0D3D92770982C0010B299 /* blog_channel_ncd_value.h */, - 19D0D3DA2770982C0010B299 /* blog_channel_NCDValParser.h */, - 19D0D3DB2770982C0010B299 /* blog_channel_BPredicate.h */, - 19D0D3DC2770982C0010B299 /* blog_channel_dostest_attacker.h */, - 19D0D3DD2770982C0010B299 /* blog_channel_client.h */, - 19D0D3DE2770982C0010B299 /* blog_channel_ncd_daemon.h */, - 19D0D3DF2770982C0010B299 /* blog_channel_NCDUdevManager.h */, - 19D0D3E02770982C0010B299 /* blog_channel_PRStreamSource.h */, - 19D0D3E12770982C0010B299 /* blog_channel_BSignal.h */, - 19D0D3E22770982C0010B299 /* blog_channel_ncd_foreach.h */, - 19D0D3E32770982C0010B299 /* blog_channel_ncd_netmask.h */, - 19D0D3E42770982C0010B299 /* blog_channel_NCDVal.h */, - 19D0D3E52770982C0010B299 /* blog_channel_ncd_imperative.h */, - 19D0D3E62770982C0010B299 /* blog_channel_NCDUdevCache.h */, - 19D0D3E72770982C0010B299 /* blog_channel_ncd_index.h */, - 19D0D3E82770982C0010B299 /* blog_channel_ncd_if.h */, - 19D0D3E92770982C0010B299 /* blog_channel_NCDInterfaceMonitor.h */, - 19D0D3EA2770982C0010B299 /* blog_channel_PacketProtoDecoder.h */, - 19D0D3EB2770982C0010B299 /* blog_channel_ncd_net_ipv4_addr.h */, - 19D0D3EC2770982C0010B299 /* blog_channel_ncd_explode.h */, - 19D0D3ED2770982C0010B299 /* blog_channels_defines.h */, - 19D0D3EE2770982C0010B299 /* blog_channel_ncd_log_msg.h */, - 19D0D3EF2770982C0010B299 /* blog_channel_BArpProbe.h */, - 19D0D3F02770982C0010B299 /* blog_channel_ncd_sleep.h */, - 19D0D3F12770982C0010B299 /* blog_channel_ncd_sys_start_process.h */, - 19D0D3F22770982C0010B299 /* blog_channel_ncd_substr.h */, - 19D0D3F32770982C0010B299 /* blog_channel_ncd_log.h */, - 19D0D3F42770982C0010B299 /* blog_channel_ncd_request.h */, - 19D0D3F52770982C0010B299 /* blog_channel_ncd_net_backend_rfkill.h */, - 19D0D3F62770982C0010B299 /* blog_channel_ncd_objref.h */, - 19D0D3F72770982C0010B299 /* blog_channel_ncd_net_watch_interfaces.h */, - 19D0D3F82770982C0010B299 /* blog_channel_ncd_from_string.h */, - 19D0D3F92770982C0010B299 /* blog_channel_BThreadSignal.h */, - 19D0D3FA2770982C0010B299 /* blog_channel_BEncryption.h */, - 19D0D3FB2770982C0010B299 /* blog_channel_ncd_sys_watch_directory.h */, - 19D0D3FC2770982C0010B299 /* blog_channel_ncd_net_ipv4_dhcp.h */, - 19D0D3FD2770982C0010B299 /* blog_channel_ncd_net_ipv6_route.h */, - 19D0D3FE2770982C0010B299 /* blog_channel_ncd_arithmetic.h */, - 19D0D3FF2770982C0010B299 /* blog_channel_ncd_alias.h */, - 19D0D4002770982C0010B299 /* blog_channel_ncd_concat.h */, - 19D0D4012770982C0010B299 /* blog_channel_DataProto.h */, - 19D0D4022770982C0010B299 /* blog_channel_ncd_net_ipv4_arp_probe.h */, - 19D0D4032770982C0010B299 /* blog_channel_ncd_net_ipv6_addr.h */, - 19D0D4042770982C0010B299 /* blog_channel_NCDIfConfig.h */, - 19D0D4052770982C0010B299 /* blog_channel_Listener.h */, - 19D0D4062770982C0010B299 /* blog_channel_tun2socks.h */, - 19D0D4072770982C0010B299 /* blog_channel_ncd_call2.h */, - 19D0D4082770982C0010B299 /* blog_channel_ncd_buffer.h */, - 19D0D4092770982C0010B299 /* blog_channel_NCDModuleProcess.h */, - 19D0D40A2770982C0010B299 /* blog_channel_ncd_load_module.h */, - 19D0D40B2770982C0010B299 /* blog_channel_ncd_depend_scope.h */, - 19D0D40C2770982C0010B299 /* blog_channel_ncd_var.h */, - 19D0D40D2770982C0010B299 /* blog_channel_NCDConfigParser.h */, - 19D0D40E2770982C0010B299 /* blog_channel_lwip.h */, - 19D0D40F2770982C0010B299 /* blog_channel_NCDRequestClient.h */, - 19D0D4102770982C0010B299 /* blog_channel_DPRelay.h */, - 19D0D4112770982C0010B299 /* blog_channel_BInputProcess.h */, - 19D0D4122770982C0010B299 /* blog_channel_ncd_net_ipv4_addr_in_network.h */, - 19D0D4132770982C0010B299 /* blog_channel_ncd_sys_evdev.h */, - 19D0D4142770982C0010B299 /* blog_channel_ncd_exit.h */, - 19D0D4152770982C0010B299 /* blog_channel_SPProtoDecoder.h */, - 19D0D4162770982C0010B299 /* blog_channel_addr.h */, - 19D0D4172770982C0010B299 /* blog_channel_ncd_backtrack.h */, - 19D0D4182770982C0010B299 /* blog_channel_PasswordListener.h */, - 19D0D4192770982C0010B299 /* blog_channel_ncd_to_string.h */, - 19D0D41A2770982C0010B299 /* blog_channel_ncd_net_backend_waitlink.h */, - 19D0D41B2770982C0010B299 /* blog_channel_nsskey.h */, - 19D0D41C2770982C0010B299 /* blog_channel_DatagramPeerIO.h */, - 19D0D41D2770982C0010B299 /* blog_channel_ncd_regex_match.h */, - 19D0D41E2770982C0010B299 /* blog_channel_DPReceive.h */, - 19D0D41F2770982C0010B299 /* blog_channel_ncd_valuemetic.h */, - 19D0D4202770982C0010B299 /* blog_channel_BTime.h */, - 19D0D4212770982C0010B299 /* blog_channel_ncd_timer.h */, - 19D0D4222770982C0010B299 /* bproto_bproto_test.h */, - 19D0D4232770982C0010B299 /* blog_channel_ncd_multidepend.h */, - 19D0D4242770982C0010B299 /* blog_channel_server.h */, - 19D0D4252770982C0010B299 /* blog_channel_ncd_runonce.h */, - 19D0D4262770982C0010B299 /* blog_channel_dostest_server.h */, - 19D0D4272770982C0010B299 /* blog_channel_ncd_net_up.h */, - 19D0D4282770982C0010B299 /* blog_channel_BTap.h */, - 19D0D4292770982C0010B299 /* blog_channel_ncd_net_ipv6_addr_in_network.h */, - 19D0D42A2770982C0010B299 /* blog_channel_BProcess.h */, - 19D0D42B2770982C0010B299 /* blog_channel_StreamPeerIO.h */, - 19D0D42C2770982C0010B299 /* blog_channel_NCDRequest.h */, - 19D0D42D2770982C0010B299 /* blog_channel_NCDRfkillMonitor.h */, - 19D0D42E2770982C0010B299 /* blog_channel_NCDUdevMonitorParser.h */, - 19D0D42F2770982C0010B299 /* blog_channel_ServerConnection.h */, - 19D0D4302770982C0010B299 /* blog_channel_ncd_getargs.h */, - 19D0D4312770982C0010B299 /* blog_channel_BDHCPClientCore.h */, - 19D0D4322770982C0010B299 /* blog_channel_PRStreamSink.h */, - 19D0D4332770982C0010B299 /* blog_channel_ncd_getenv.h */, - 19D0D4342770982C0010B299 /* bproto_addr.h */, - 19D0D4352770982C0010B299 /* blog_channel_ncd_blocker.h */, - 19D0D4362770982C0010B299 /* blog_channel_ncd_reboot.h */, - 19D0D4372770982C0010B299 /* blog_channel_ncd_choose.h */, - 19D0D4382770982C0010B299 /* blog_channel_LineBuffer.h */, - 19D0D4392770982C0010B299 /* blog_channel_FragmentProtoAssembler.h */, - 19D0D43A2770982C0010B299 /* blog_channel_ncd_socket.h */, - 19D0D43B2770982C0010B299 /* blog_channel_UdpGwClient.h */, - 19D0D43C2770982C0010B299 /* blog_channel_flooder.h */, - 19D0D43D2770982C0010B299 /* blog_channel_ncd_assert.h */, - 19D0D43E2770982C0010B299 /* blog_channel_ncd_net_backend_waitdevice.h */, - 19D0D43F2770982C0010B299 /* blog_channel_ncd_basic_functions.h */, - 19D0D4402770982C0010B299 /* blog_channel_NCDPlaceholderDb.h */, - 19D0D4412770982C0010B299 /* blog_channel_ncd_list.h */, - 19D0D4422770982C0010B299 /* blog_channel_PeerChat.h */, - 19D0D4432770982C0010B299 /* blog_channel_ncd_net_backend_badvpn.h */, - 19D0D4442770982C0010B299 /* blog_channel_ncd_print.h */, - 19D0D4452770982C0010B299 /* blog_channel_BNetwork.h */, - 19D0D4462770982C0010B299 /* blog_channel_BLockReactor.h */, - 19D0D4472770982C0010B299 /* blog_channel_ncd_ondemand.h */, - 19D0D4482770982C0010B299 /* blog_channel_ncd_net_iptables.h */, - 19D0D4492770982C0010B299 /* blog_channel_ncd_depend.h */, - 19D0D44A2770982C0010B299 /* blog_channel_ncd_sys_request_client.h */, - 19D0D44B2770982C0010B299 /* blog_channel_ncd_net_dns.h */, - 19D0D44C2770982C0010B299 /* blog_channel_NCDUdevMonitor.h */, - 19D0D44D2770982C0010B299 /* blog_channel_BSocksClient.h */, - ); - path = generated; - sourceTree = ""; - }; - 19D0D44E2770982C0010B299 /* socksclient */ = { - isa = PBXGroup; - children = ( - 19D0D44F2770982C0010B299 /* BSocksClient.c */, - 19D0D4502770982C0010B299 /* BSocksClient.h */, - ); - path = socksclient; - sourceTree = ""; - }; - 19D0D4512770982C0010B299 /* misc */ = { - isa = PBXGroup; - children = ( - 19D0D4522770982C0010B299 /* packed.h */, - 19D0D4532770982C0010B299 /* concat_strings.h */, - 19D0D4542770982C0010B299 /* Utf8Decoder.h */, - 19D0D4552770982C0010B299 /* parse_number.h */, - 19D0D4562770982C0010B299 /* udp_proto.h */, - 19D0D4572770982C0010B299 /* find_program.h */, - 19D0D4582770982C0010B299 /* minmax.h */, - 19D0D4592770982C0010B299 /* socks_proto.h */, - 19D0D45A2770982C0010B299 /* string_begins_with.h */, - 19D0D45B2770982C0010B299 /* dead.h */, - 19D0D45C2770982C0010B299 /* strdup.h */, - 19D0D45D2770982C0010B299 /* debug.h */, - 19D0D45E2770982C0010B299 /* array_length.h */, - 19D0D45F2770982C0010B299 /* version.h */, - 19D0D4602770982C0010B299 /* bsort.h */, - 19D0D4612770982C0010B299 /* debugcounter.h */, - 19D0D4622770982C0010B299 /* byteorder.h */, - 19D0D4632770982C0010B299 /* unicode_funcs.h */, - 19D0D4642770982C0010B299 /* Utf16Decoder.h */, - 19D0D4652770982C0010B299 /* bstring.h */, - 19D0D4662770982C0010B299 /* maxalign.h */, - 19D0D4672770982C0010B299 /* offset.h */, - 19D0D4682770982C0010B299 /* cmdline.h */, - 19D0D4692770982C0010B299 /* expstring.h */, - 19D0D46A2770982C0010B299 /* merge.h */, - 19D0D46B2770982C0010B299 /* ipaddr.h */, - 19D0D46C2770982D0010B299 /* write_file.h */, - 19D0D46D2770982D0010B299 /* print_macros.h */, - 19D0D46E2770982D0010B299 /* substring.h */, - 19D0D46F2770982D0010B299 /* balign.h */, - 19D0D4702770982D0010B299 /* debugerror.h */, - 19D0D4712770982D0010B299 /* memref.h */, - 19D0D4722770982D0010B299 /* hashfun.h */, - 19D0D4732770982D0010B299 /* igmp_proto.h */, - 19D0D4742770982D0010B299 /* mswsock.h */, - 19D0D4752770982D0010B299 /* get_iface_info.h */, - 19D0D4762770982D0010B299 /* sslsocket.h */, - 19D0D4772770982D0010B299 /* blimits.h */, - 19D0D4782770982D0010B299 /* balloc.h */, - 19D0D4792770982D0010B299 /* ipaddr6.h */, - 19D0D47A2770982D0010B299 /* compare.h */, - 19D0D47B2770982D0010B299 /* nonblocking.h */, - 19D0D47C2770982D0010B299 /* loglevel.h */, - 19D0D47D2770982D0010B299 /* modadd.h */, - 19D0D47E2770982D0010B299 /* nsskey.h */, - 19D0D47F2770982D0010B299 /* ethernet_proto.h */, - 19D0D4802770982D0010B299 /* find_char.h */, - 19D0D4812770982D0010B299 /* read_write_int.h */, - 19D0D4822770982D0010B299 /* ipv6_proto.h */, - 19D0D4832770982D0010B299 /* loggers_string.h */, - 19D0D4842770982D0010B299 /* overflow.h */, - 19D0D4852770982D0010B299 /* open_standard_streams.h */, - 19D0D4862770982D0010B299 /* Utf16Encoder.h */, - 19D0D4872770982D0010B299 /* read_file.h */, - 19D0D4882770982D0010B299 /* dhcp_proto.h */, - 19D0D4892770982D0010B299 /* exparray.h */, - 19D0D48A2770982D0010B299 /* BRefTarget.h */, - 19D0D48B2770982D0010B299 /* ipv4_proto.h */, - 19D0D48C2770982D0010B299 /* grow_array.h */, - 19D0D48D2770982D0010B299 /* stdbuf_cmdline.h */, - 19D0D48E2770982D0010B299 /* arp_proto.h */, - 19D0D48F2770982D0010B299 /* ascii_utils.h */, - 19D0D4902770982D0010B299 /* bsize.h */, - 19D0D4912770982D0010B299 /* Utf8Encoder.h */, - ); - path = misc; - sourceTree = ""; - }; - 19D0D4922770982D0010B299 /* lwip */ = { - isa = PBXGroup; - children = ( - 19D0D4932770982D0010B299 /* custom */, - 19D0D4992770982D0010B299 /* src */, - ); - path = lwip; - sourceTree = ""; - }; - 19D0D4932770982D0010B299 /* custom */ = { - isa = PBXGroup; - children = ( - 19D0D4942770982D0010B299 /* sys.c */, - 19D0D4952770982D0010B299 /* arch */, - 19D0D4982770982D0010B299 /* lwipopts.h */, - ); - path = custom; - sourceTree = ""; - }; - 19D0D4952770982D0010B299 /* arch */ = { - isa = PBXGroup; - children = ( - 19D0D4962770982D0010B299 /* cc.h */, - 19D0D4972770982D0010B299 /* perf.h */, - ); - path = arch; - sourceTree = ""; - }; - 19D0D4992770982D0010B299 /* src */ = { - isa = PBXGroup; - children = ( - 19D0D49A2770982D0010B299 /* core */, - 19D0D4B32770982D0010B299 /* include */, - ); - path = src; - sourceTree = ""; - }; - 19D0D49A2770982D0010B299 /* core */ = { - isa = PBXGroup; - children = ( - 19D0D49B2770982D0010B299 /* memp.c */, - 19D0D49C2770982D0010B299 /* inet_chksum.c */, - 19D0D49D2770982D0010B299 /* tcp_out.c */, - 19D0D49E2770982D0010B299 /* init.c */, - 19D0D49F2770982D0010B299 /* mem.c */, - 19D0D4A02770982D0010B299 /* def.c */, - 19D0D4A12770982D0010B299 /* udp.c */, - 19D0D4A22770982D0010B299 /* stats.c */, - 19D0D4A32770982D0010B299 /* tcp_in.c */, - 19D0D4A42770982D0010B299 /* ipv4 */, - 19D0D4A92770982D0010B299 /* netif.c */, - 19D0D4AA2770982D0010B299 /* tcp.c */, - 19D0D4AB2770982D0010B299 /* timers.c */, - 19D0D4AC2770982D0010B299 /* pbuf.c */, - 19D0D4AD2770982D0010B299 /* ipv6 */, - ); - path = core; - sourceTree = ""; - }; - 19D0D4A42770982D0010B299 /* ipv4 */ = { - isa = PBXGroup; - children = ( - 19D0D4A52770982D0010B299 /* ip_frag.c */, - 19D0D4A62770982D0010B299 /* icmp.c */, - 19D0D4A72770982D0010B299 /* ip4.c */, - 19D0D4A82770982D0010B299 /* ip4_addr.c */, - ); - path = ipv4; - sourceTree = ""; - }; - 19D0D4AD2770982D0010B299 /* ipv6 */ = { - isa = PBXGroup; - children = ( - 19D0D4AE2770982D0010B299 /* ip6.c */, - 19D0D4AF2770982D0010B299 /* icmp6.c */, - 19D0D4B02770982D0010B299 /* nd6.c */, - 19D0D4B12770982D0010B299 /* ip6_addr.c */, - 19D0D4B22770982D0010B299 /* ip6_frag.c */, - ); - path = ipv6; - sourceTree = ""; - }; - 19D0D4B32770982D0010B299 /* include */ = { - isa = PBXGroup; - children = ( - 19D0D4B42770982D0010B299 /* posix */, - 19D0D4B82770982D0010B299 /* lwip */, - 19D0D4DC2770982D0010B299 /* netif */, - 19D0D4E02770982D0010B299 /* ipv4 */, - 19D0D4E92770982D0010B299 /* ipv6 */, - ); - path = include; - sourceTree = ""; - }; - 19D0D4B42770982D0010B299 /* posix */ = { - isa = PBXGroup; - children = ( - 19D0D4B52770982D0010B299 /* sys */, - 19D0D4B72770982D0010B299 /* netdb.h */, - ); - path = posix; - sourceTree = ""; - }; - 19D0D4B52770982D0010B299 /* sys */ = { - isa = PBXGroup; - children = ( - 19D0D4B62770982D0010B299 /* socket.h */, - ); - path = sys; - sourceTree = ""; - }; - 19D0D4B82770982D0010B299 /* lwip */ = { - isa = PBXGroup; - children = ( - 19D0D4B92770982D0010B299 /* timers.h */, - 19D0D4BA2770982D0010B299 /* pbuf.h */, - 19D0D4BB2770982D0010B299 /* tcp_impl.h */, - 19D0D4BC2770982D0010B299 /* tcp.h */, - 19D0D4BD2770982D0010B299 /* err.h */, - 19D0D4BE2770982D0010B299 /* snmp_asn1.h */, - 19D0D4BF2770982D0010B299 /* netif.h */, - 19D0D4C02770982D0010B299 /* sio.h */, - 19D0D4C12770982D0010B299 /* debug.h */, - 19D0D4C22770982D0010B299 /* tcpip.h */, - 19D0D4C32770982D0010B299 /* snmp.h */, - 19D0D4C42770982D0010B299 /* snmp_structs.h */, - 19D0D4C52770982D0010B299 /* api_msg.h */, - 19D0D4C62770982D0010B299 /* netifapi.h */, - 19D0D4C72770982D0010B299 /* netbuf.h */, - 19D0D4C82770982D0010B299 /* api.h */, - 19D0D4C92770982D0010B299 /* dhcp.h */, - 19D0D4CA2770982D0010B299 /* memp.h */, - 19D0D4CB2770982D0010B299 /* sockets.h */, - 19D0D4CC2770982D0010B299 /* ip_addr.h */, - 19D0D4CD2770982D0010B299 /* opt.h */, - 19D0D4CE2770982D0010B299 /* inet_chksum.h */, - 19D0D4CF2770982D0010B299 /* raw.h */, - 19D0D4D02770982D0010B299 /* sys.h */, - 19D0D4D12770982D0010B299 /* netdb.h */, - 19D0D4D22770982D0010B299 /* def.h */, - 19D0D4D32770982D0010B299 /* mem.h */, - 19D0D4D42770982D0010B299 /* dns.h */, - 19D0D4D52770982D0010B299 /* ip.h */, - 19D0D4D62770982D0010B299 /* init.h */, - 19D0D4D72770982D0010B299 /* snmp_msg.h */, - 19D0D4D82770982D0010B299 /* stats.h */, - 19D0D4D92770982D0010B299 /* memp_std.h */, - 19D0D4DA2770982D0010B299 /* udp.h */, - 19D0D4DB2770982D0010B299 /* arch.h */, - ); - path = lwip; - sourceTree = ""; - }; - 19D0D4DC2770982D0010B299 /* netif */ = { - isa = PBXGroup; - children = ( - 19D0D4DD2770982D0010B299 /* etharp.h */, - 19D0D4DE2770982D0010B299 /* ppp_oe.h */, - 19D0D4DF2770982D0010B299 /* slipif.h */, - ); - path = netif; - sourceTree = ""; - }; - 19D0D4E02770982D0010B299 /* ipv4 */ = { - isa = PBXGroup; - children = ( - 19D0D4E12770982D0010B299 /* lwip */, - ); - path = ipv4; - sourceTree = ""; - }; - 19D0D4E12770982D0010B299 /* lwip */ = { - isa = PBXGroup; - children = ( - 19D0D4E22770982D0010B299 /* igmp.h */, - 19D0D4E32770982D0010B299 /* ip4.h */, - 19D0D4E42770982D0010B299 /* icmp.h */, - 19D0D4E52770982D0010B299 /* inet.h */, - 19D0D4E62770982D0010B299 /* ip4_addr.h */, - 19D0D4E72770982D0010B299 /* autoip.h */, - 19D0D4E82770982D0010B299 /* ip_frag.h */, - ); - path = lwip; - sourceTree = ""; - }; - 19D0D4E92770982D0010B299 /* ipv6 */ = { - isa = PBXGroup; - children = ( - 19D0D4EA2770982D0010B299 /* lwip */, - ); - path = ipv6; - sourceTree = ""; - }; - 19D0D4EA2770982D0010B299 /* lwip */ = { - isa = PBXGroup; - children = ( - 19D0D4EB2770982D0010B299 /* nd6.h */, - 19D0D4EC2770982D0010B299 /* ethip6.h */, - 19D0D4ED2770982D0010B299 /* inet6.h */, - 19D0D4EE2770982D0010B299 /* ip6_addr.h */, - 19D0D4EF2770982D0010B299 /* ip6_frag.h */, - 19D0D4F02770982D0010B299 /* ip6.h */, - 19D0D4F12770982D0010B299 /* icmp6.h */, - 19D0D4F22770982D0010B299 /* dhcp6.h */, - 19D0D4F32770982D0010B299 /* mld6.h */, - ); - path = lwip; - sourceTree = ""; - }; - 19D0D4F42770982D0010B299 /* tuntap */ = { - isa = PBXGroup; - children = ( - 19D0D4F52770982D0010B299 /* BTap.m */, - 19D0D4F62770982D0010B299 /* BTap.h */, - ); - path = tuntap; - sourceTree = ""; - }; - 19D0D4F72770982D0010B299 /* udpgw */ = { - isa = PBXGroup; - children = ( - 19D0D4F82770982D0010B299 /* udpgw.h */, - 19D0D4F92770982D0010B299 /* udpgw.c */, - ); - path = udpgw; - sourceTree = ""; - }; - 19D0D4FA2770982D0010B299 /* protocol */ = { - isa = PBXGroup; - children = ( - 19D0D4FB2770982D0010B299 /* udpgw_proto.h */, - 19D0D4FC2770982D0010B299 /* requestproto.h */, - 19D0D4FD2770982D0010B299 /* msgproto.h */, - 19D0D4FE2770982D0010B299 /* spproto.h */, - 19D0D4FF2770982D0010B299 /* packetproto.h */, - 19D0D5002770982D0010B299 /* dataproto.h */, - 19D0D5012770982D0010B299 /* addr.h */, - 19D0D5022770982D0010B299 /* scproto.h */, - 19D0D5032770982D0010B299 /* addr.bproto */, - 19D0D5042770982D0010B299 /* fragmentproto.h */, - 19D0D5052770982D0010B299 /* msgproto.bproto */, - ); - path = protocol; - sourceTree = ""; - }; - 19D0D5062770982D0010B299 /* system */ = { - isa = PBXGroup; - children = ( - 19D0D5072770982D0010B299 /* BDatagram_unix.h */, - 19D0D5082770982D0010B299 /* BUnixSignal.h */, - 19D0D5092770982D0010B299 /* BNetwork.c */, - 19D0D50A2770982D0010B299 /* BConnection.h */, - 19D0D50B2770982D0010B299 /* BConnection_common.c */, - 19D0D50C2770982D0010B299 /* BReactor_badvpn.h */, - 19D0D50D2770982D0010B299 /* BAddr.h */, - 19D0D50E2770982D0010B299 /* BReactor.h */, - 19D0D50F2770982D0010B299 /* BConnection_unix.h */, - 19D0D5102770982D0010B299 /* BTime.c */, - 19D0D5112770982D0010B299 /* BSignal.c */, - 19D0D5122770982D0010B299 /* BReactor_badvpn_timerstree.h */, - 19D0D5132770982D0010B299 /* BDatagram_unix.c */, - 19D0D5142770982D0010B299 /* BNetwork.h */, - 19D0D5152770982D0010B299 /* BUnixSignal.c */, - 19D0D5162770982D0010B299 /* BDatagram.h */, - 19D0D5172770982D0010B299 /* BReactor_badvpn.c */, - 19D0D5182770982D0010B299 /* BSignal.h */, - 19D0D5192770982D0010B299 /* BTime.h */, - 19D0D51A2770982D0010B299 /* BConnection_unix.c */, - ); - path = system; - sourceTree = ""; - }; - 19D0D51B2770982D0010B299 /* tun2socks */ = { - isa = PBXGroup; - children = ( - 19D0D51C2770982D0010B299 /* tun2socks.c */, - 19D0D51D2770982D0010B299 /* SocksUdpGwClient.h */, - 19D0D51E2770982D0010B299 /* tun2socks.h */, - 19D0D51F2770982D0010B299 /* SocksUdpGwClient.c */, - ); - path = tun2socks; - sourceTree = ""; - }; - 19D0D5202770982D0010B299 /* structure */ = { - isa = PBXGroup; - children = ( - 19D0D5212770982D0010B299 /* SAvl.h */, - 19D0D5222770982D0010B299 /* Vector_footer.h */, - 19D0D5232770982D0010B299 /* ChunkBuffer2.h */, - 19D0D5242770982D0010B299 /* IndexedList_tree.h */, - 19D0D5252770982D0010B299 /* LinkedList1.h */, - 19D0D5262770982D0010B299 /* Vector_header.h */, - 19D0D5272770982D0010B299 /* CAvl_header.h */, - 19D0D5282770982D0010B299 /* Vector_decl.h */, - 19D0D5292770982D0010B299 /* CHash_decl.h */, - 19D0D52A2770982D0010B299 /* CAvl_footer.h */, - 19D0D52B2770982D0010B299 /* SLinkedList_decl.h */, - 19D0D52C2770982D0010B299 /* CAvl_impl.h */, - 19D0D52D2770982D0010B299 /* SAvl_decl.h */, - 19D0D52E2770982D0010B299 /* CHash.h */, - 19D0D52F2770982D0010B299 /* SAvl_footer.h */, - 19D0D5302770982D0010B299 /* SAvl_tree.h */, - 19D0D5312770982D0010B299 /* IndexedList.h */, - 19D0D5322770982D0010B299 /* SAvl_header.h */, - 19D0D5332770982D0010B299 /* LinkedList3.h */, - 19D0D5342770982D0010B299 /* BAVL.h */, - 19D0D5352770982D0010B299 /* SLinkedList_impl.h */, - 19D0D5362770982D0010B299 /* CAvl_decl.h */, - 19D0D5372770982D0010B299 /* CAvl.h */, - 19D0D5382770982D0010B299 /* Vector_impl.h */, - 19D0D5392770982D0010B299 /* SLinkedList.h */, - 19D0D53A2770982D0010B299 /* CHash_impl.h */, - 19D0D53B2770982D0010B299 /* CHash_footer.h */, - 19D0D53C2770982D0010B299 /* LinkedList0.h */, - 19D0D53D2770982D0010B299 /* CHash_header.h */, - 19D0D53E2770982D0010B299 /* SAvl_impl.h */, - 19D0D53F2770982D0010B299 /* Vector.h */, - 19D0D5402770982D0010B299 /* SLinkedList_footer.h */, - 19D0D5412770982D0010B299 /* SLinkedList_header.h */, - ); - path = structure; - sourceTree = ""; - }; - 19D0D5422770982D0010B299 /* flowextra */ = { - isa = PBXGroup; - children = ( - 19D0D5432770982D0010B299 /* PacketPassInactivityMonitor.h */, - 19D0D5442770982D0010B299 /* PacketPassInactivityMonitor.c */, - ); - path = flowextra; - sourceTree = ""; - }; - 19D0D5452770982D0010B299 /* base */ = { - isa = PBXGroup; - children = ( - 19D0D5462770982D0010B299 /* BLog.m */, - 19D0D5472770982E0010B299 /* BLog_syslog.c */, - 19D0D5482770982E0010B299 /* BPending_list.h */, - 19D0D5492770982E0010B299 /* DebugObject.c */, - 19D0D54A2770982E0010B299 /* BPending.h */, - 19D0D54B2770982E0010B299 /* BLog_syslog.h */, - 19D0D54C2770982E0010B299 /* BLog.h */, - 19D0D54D2770982E0010B299 /* BMutex.h */, - 19D0D54E2770982E0010B299 /* BPending.c */, - 19D0D54F2770982E0010B299 /* DebugObject.h */, - ); - path = base; - sourceTree = ""; - }; - 19D0D5502770982E0010B299 /* udpgw_client */ = { - isa = PBXGroup; - children = ( - 19D0D5512770982E0010B299 /* UdpGwClient.c */, - 19D0D5522770982E0010B299 /* UdpGwClient.h */, - ); - path = udpgw_client; - sourceTree = ""; - }; - 19D0D5532770982E0010B299 /* flow */ = { - isa = PBXGroup; - children = ( - 19D0D5542770982E0010B299 /* PacketBuffer.c */, - 19D0D5552770982E0010B299 /* PacketStreamSender.h */, - 19D0D5562770982E0010B299 /* BufferWriter.c */, - 19D0D5572770982E0010B299 /* PacketRecvInterface.c */, - 19D0D5582770982E0010B299 /* PacketPassFairQueue_tree.h */, - 19D0D5592770982E0010B299 /* SinglePacketBuffer.h */, - 19D0D55A2770982E0010B299 /* PacketProtoDecoder.h */, - 19D0D55B2770982E0010B299 /* StreamRecvInterface.c */, - 19D0D55C2770982E0010B299 /* PacketProtoEncoder.c */, - 19D0D55D2770982E0010B299 /* StreamPassInterface.c */, - 19D0D55E2770982E0010B299 /* PacketPassConnector.c */, - 19D0D55F2770982E0010B299 /* PacketPassFairQueue.h */, - 19D0D5602770982E0010B299 /* PacketProtoFlow.c */, - 19D0D5612770982E0010B299 /* PacketPassInterface.c */, - 19D0D5622770982E0010B299 /* BufferWriter.h */, - 19D0D5632770982E0010B299 /* PacketRecvInterface.h */, - 19D0D5642770982E0010B299 /* PacketBuffer.h */, - 19D0D5652770982E0010B299 /* PacketStreamSender.c */, - 19D0D5662770982E0010B299 /* StreamRecvInterface.h */, - 19D0D5672770982E0010B299 /* PacketProtoDecoder.c */, - 19D0D5682770982E0010B299 /* SinglePacketBuffer.c */, - 19D0D5692770982E0010B299 /* PacketPassFairQueue.c */, - 19D0D56A2770982E0010B299 /* PacketPassConnector.h */, - 19D0D56B2770982E0010B299 /* StreamPassInterface.h */, - 19D0D56C2770982E0010B299 /* PacketProtoEncoder.h */, - 19D0D56D2770982E0010B299 /* PacketPassInterface.h */, - 19D0D56E2770982E0010B299 /* PacketProtoFlow.h */, - ); - path = flow; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXHeadersBuildPhase section */ - 19D0CCE4277092B50010B299 /* Headers */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - 19D0CCED277092B50010B299 /* PacketProcessor.h in Headers */, - 19D0D710277098610010B299 /* TunnelInterface.h in Headers */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXHeadersBuildPhase section */ - -/* Begin PBXNativeTarget section */ - 19D0CCE8277092B50010B299 /* PacketProcessor */ = { - isa = PBXNativeTarget; - buildConfigurationList = 19D0CCF0277092B50010B299 /* Build configuration list for PBXNativeTarget "PacketProcessor" */; - buildPhases = ( - 19D0CCE4277092B50010B299 /* Headers */, - 19D0CCE5277092B50010B299 /* Sources */, - 19D0CCE6277092B50010B299 /* Frameworks */, - 19D0CCE7277092B50010B299 /* Resources */, - 19D0CCF9277096980010B299 /* Embed Frameworks */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = PacketProcessor; - productName = PacketProcessor; - productReference = 19D0CCE9277092B50010B299 /* PacketProcessor.framework */; - productType = "com.apple.product-type.framework"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 19D0CCE0277092B50010B299 /* Project object */ = { - isa = PBXProject; - attributes = { - BuildIndependentTargetsInParallel = 1; - LastUpgradeCheck = 1320; - TargetAttributes = { - 19D0CCE8277092B50010B299 = { - CreatedOnToolsVersion = 13.2.1; - }; - }; - }; - buildConfigurationList = 19D0CCE3277092B50010B299 /* Build configuration list for PBXProject "PacketProcessor" */; - compatibilityVersion = "Xcode 13.0"; - developmentRegion = en; - hasScannedForEncodings = 0; - knownRegions = ( - en, - Base, - ); - mainGroup = 19D0CCDF277092B50010B299; - productRefGroup = 19D0CCEA277092B50010B299 /* Products */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - 19D0CCE8277092B50010B299 /* PacketProcessor */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXResourcesBuildPhase section */ - 19D0CCE7277092B50010B299 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 19D0D6AB277098310010B299 /* msgproto.bproto in Resources */, - 19D0D6A9277098310010B299 /* addr.bproto in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 19D0CCE5277092B50010B299 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 19D0D700277098320010B299 /* PacketPassInterface.c in Sources */, - 19D0D662277098300010B299 /* nd6.c in Sources */, - 19D0D664277098300010B299 /* ip6_frag.c in Sources */, - 19D0D6BA277098310010B299 /* BUnixSignal.c in Sources */, - 19D0D708277098320010B299 /* PacketPassFairQueue.c in Sources */, - 19D0D706277098320010B299 /* PacketProtoDecoder.c in Sources */, - 19D0D6E6277098310010B299 /* PacketPassInactivityMonitor.c in Sources */, - 19D0D659277098300010B299 /* icmp.c in Sources */, - 19D0D65E277098300010B299 /* timers.c in Sources */, - 19D0D651277098300010B299 /* tcp_out.c in Sources */, - 19D0D650277098300010B299 /* inet_chksum.c in Sources */, - 19D0D70F277098320010B299 /* TunnelInterface.m in Sources */, - 19D0D6FF277098320010B299 /* PacketProtoFlow.c in Sources */, - 19D0D658277098300010B299 /* ip_frag.c in Sources */, - 19D0D653277098300010B299 /* mem.c in Sources */, - 19D0D65F277098300010B299 /* pbuf.c in Sources */, - 19D0D6A0277098310010B299 /* udpgw.c in Sources */, - 19D0D663277098300010B299 /* ip6_addr.c in Sources */, - 19D0D6F3277098310010B299 /* PacketBuffer.c in Sources */, - 19D0D6B5277098310010B299 /* BTime.c in Sources */, - 19D0D6F6277098310010B299 /* PacketRecvInterface.c in Sources */, - 19D0D6B0277098310010B299 /* BConnection_common.c in Sources */, - 19D0D6B8277098310010B299 /* BDatagram_unix.c in Sources */, - 19D0D65B277098300010B299 /* ip4_addr.c in Sources */, - 19D0D6C3277098310010B299 /* SocksUdpGwClient.c in Sources */, - 19D0D704277098320010B299 /* PacketStreamSender.c in Sources */, - 19D0D6C0277098310010B299 /* tun2socks.c in Sources */, - 19D0D655277098300010B299 /* udp.c in Sources */, - 19D0D6EA277098310010B299 /* DebugObject.c in Sources */, - 19D0D6F5277098310010B299 /* BufferWriter.c in Sources */, - 19D0D661277098300010B299 /* icmp6.c in Sources */, - 19D0D6EF277098310010B299 /* BPending.c in Sources */, - 19D0D6FC277098320010B299 /* StreamPassInterface.c in Sources */, - 19D0D6BF277098310010B299 /* BConnection_unix.c in Sources */, - 19D0D6FB277098320010B299 /* PacketProtoEncoder.c in Sources */, - 19D0D6B6277098310010B299 /* BSignal.c in Sources */, - 19D0D660277098300010B299 /* ip6.c in Sources */, - 19D0D64F277098300010B299 /* memp.c in Sources */, - 19D0D6E8277098310010B299 /* BLog_syslog.c in Sources */, - 19D0D6F1277098310010B299 /* UdpGwClient.c in Sources */, - 19D0D6AE277098310010B299 /* BNetwork.c in Sources */, - 19D0D6BC277098310010B299 /* BReactor_badvpn.c in Sources */, - 19D0D69D277098310010B299 /* BTap.m in Sources */, - 19D0D657277098300010B299 /* tcp_in.c in Sources */, - 19D0D652277098300010B299 /* init.c in Sources */, - 19D0D654277098300010B299 /* def.c in Sources */, - 19D0D6E7277098310010B299 /* BLog.m in Sources */, - 19D0D6FA277098320010B299 /* StreamRecvInterface.c in Sources */, - 19D0D656277098300010B299 /* stats.c in Sources */, - 19D0D6092770982F0010B299 /* BSocksClient.c in Sources */, - 19D0D6FD277098320010B299 /* PacketPassConnector.c in Sources */, - 19D0D707277098320010B299 /* SinglePacketBuffer.c in Sources */, - 19D0D64B277098300010B299 /* sys.c in Sources */, - 19D0D65D277098300010B299 /* tcp.c in Sources */, - 19D0D65C277098300010B299 /* netif.c in Sources */, - 19D0D65A277098300010B299 /* ip4.c in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin XCBuildConfiguration section */ - 19D0CCEE277092B50010B299 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++17"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_ENABLE_OBJC_WEAK = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 1; - DEBUG_INFORMATION_FORMAT = dwarf; - ENABLE_STRICT_OBJC_MSGSEND = YES; - ENABLE_TESTABILITY = YES; - GCC_C_LANGUAGE_STANDARD = gnu11; - GCC_DYNAMIC_NO_PIC = NO; - GCC_NO_COMMON_BLOCKS = YES; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 15.2; - MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; - MTL_FAST_MATH = YES; - ONLY_ACTIVE_ARCH = YES; - SDKROOT = iphoneos; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Debug; - }; - 19D0CCEF277092B50010B299 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++17"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_ENABLE_OBJC_WEAK = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 1; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - ENABLE_NS_ASSERTIONS = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_C_LANGUAGE_STANDARD = gnu11; - GCC_NO_COMMON_BLOCKS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 15.2; - MTL_ENABLE_DEBUG_INFO = NO; - MTL_FAST_MATH = YES; - SDKROOT = iphoneos; - VALIDATE_PRODUCT = YES; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Release; - }; - 19D0CCF1277092B50010B299 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CODE_SIGN_IDENTITY = "Apple Development"; - CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1; - DEFINES_MODULE = YES; - DEVELOPMENT_TEAM = 7VAGZXD78P; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - ENABLE_BITCODE = NO; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/PacketProcessor/CocoaAsyncSocket", - ); - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_PREPROCESSOR_DEFINITIONS = ( - "$(inherited)", - BADVPN_BREACTOR_BADVPN, - BADVPN_FREEBSD, - BADVPN_THREADWORK_USE_PTHREAD, - "BADVPN_THREAD_SAFE=1", - BADVPN_USE_KEVENT, - BADVPN_USE_SYSLOG, - BADVPN_BIG_ENDIAN, - BADVPN_LIBTSOCKS, - ); - GENERATE_INFOPLIST_FILE = YES; - HEADER_SEARCH_PATHS = ( - "${inherited}", - "\"${PROJECT_DIR}/CocoaAsyncSocket/CocoaAsyncSocket.framework/Headers\"", - ); - INFOPLIST_FILE = PacketProcessor/Info.plist; - INFOPLIST_KEY_NSPrincipalClass = ""; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@loader_path/Frameworks", - ); - MARKETING_VERSION = 1.0; - OTHER_LDFLAGS = ( - "$(inherited)", - "-framework", - "\"CFNetwork\"", - "-framework", - "\"CocoaAsyncSocket\"", - "-framework", - "\"Security\"", - ); - PRODUCT_BUNDLE_IDENTIFIER = org.amnezia.Amnezia.PacketProcessor; - PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; - SKIP_INSTALL = YES; - SWIFT_EMIT_LOC_STRINGS = YES; - TARGETED_DEVICE_FAMILY = "1,2"; - USER_HEADER_SEARCH_PATHS = ( - "${inherited}", - "${SRCROOT}/${TARGET_NAME}/tun2socks-iOS", - "${SRCROOT}/${TARGET_NAME}/tun2socks-iOS/lwip/src/include", - "${SRCROOT}/${TARGET_NAME}/tun2socks-iOS/lwip/custom", - "${SRCROOT}/${TARGET_NAME}/tun2socks-iOS/lwip/src/include/ipv4", - "${SRCROOT}/${TARGET_NAME}/tun2socks-iOS/lwip/src/include/ipv6", - ); - }; - name = Debug; - }; - 19D0CCF2277092B50010B299 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CODE_SIGN_IDENTITY = "Apple Development"; - CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1; - DEFINES_MODULE = YES; - DEVELOPMENT_TEAM = 7VAGZXD78P; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - ENABLE_BITCODE = NO; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/PacketProcessor/CocoaAsyncSocket", - ); - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_PREPROCESSOR_DEFINITIONS = ( - "$(inherited)", - BADVPN_BREACTOR_BADVPN, - BADVPN_FREEBSD, - BADVPN_THREADWORK_USE_PTHREAD, - "BADVPN_THREAD_SAFE=1", - BADVPN_USE_KEVENT, - BADVPN_USE_SYSLOG, - BADVPN_BIG_ENDIAN, - BADVPN_LIBTSOCKS, - ); - GENERATE_INFOPLIST_FILE = YES; - HEADER_SEARCH_PATHS = ( - "${inherited}", - "\"${PROJECT_DIR}/CocoaAsyncSocket/CocoaAsyncSocket.framework/Headers\"", - ); - INFOPLIST_FILE = PacketProcessor/Info.plist; - INFOPLIST_KEY_NSPrincipalClass = ""; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@loader_path/Frameworks", - ); - MARKETING_VERSION = 1.0; - OTHER_LDFLAGS = ( - "$(inherited)", - "-framework", - "\"CFNetwork\"", - "-framework", - "\"CocoaAsyncSocket\"", - "-framework", - "\"Security\"", - ); - PRODUCT_BUNDLE_IDENTIFIER = org.amnezia.Amnezia.PacketProcessor; - PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; - SKIP_INSTALL = YES; - SWIFT_EMIT_LOC_STRINGS = YES; - TARGETED_DEVICE_FAMILY = "1,2"; - USER_HEADER_SEARCH_PATHS = ( - "${inherited}", - "${SRCROOT}/${TARGET_NAME}/tun2socks-iOS", - "${SRCROOT}/${TARGET_NAME}/tun2socks-iOS/lwip/src/include", - "${SRCROOT}/${TARGET_NAME}/tun2socks-iOS/lwip/custom", - "${SRCROOT}/${TARGET_NAME}/tun2socks-iOS/lwip/src/include/ipv4", - "${SRCROOT}/${TARGET_NAME}/tun2socks-iOS/lwip/src/include/ipv6", - ); - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 19D0CCE3277092B50010B299 /* Build configuration list for PBXProject "PacketProcessor" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 19D0CCEE277092B50010B299 /* Debug */, - 19D0CCEF277092B50010B299 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 19D0CCF0277092B50010B299 /* Build configuration list for PBXNativeTarget "PacketProcessor" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 19D0CCF1277092B50010B299 /* Debug */, - 19D0CCF2277092B50010B299 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = 19D0CCE0277092B50010B299 /* Project object */; -} diff --git a/client/3rd/PacketProcessor/PacketProcessor.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/client/3rd/PacketProcessor/PacketProcessor.xcodeproj/project.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index 919434a6..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor.xcodeproj/project.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/client/3rd/PacketProcessor/PacketProcessor.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/client/3rd/PacketProcessor/PacketProcessor.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist deleted file mode 100644 index 18d98100..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +++ /dev/null @@ -1,8 +0,0 @@ - - - - - IDEDidComputeMac32BitWarning - - - diff --git a/client/3rd/PacketProcessor/PacketProcessor.xcodeproj/project.xcworkspace/xcuserdata/sanchez.xcuserdatad/UserInterfaceState.xcuserstate b/client/3rd/PacketProcessor/PacketProcessor.xcodeproj/project.xcworkspace/xcuserdata/sanchez.xcuserdatad/UserInterfaceState.xcuserstate deleted file mode 100644 index cdaab9f25c7a098e013037c1bc95b8a7c9fc97f2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 50828 zcmeEv2Y3`!*ZGISiCm&=GgBh0L7z@KQ0wYb1UgWIxxZKrKqRVQ_=egipNpzjNW^%N9_Izh~ou@m4 zE?-+}>o%r%q_e?UG1Qmnb;inw6N>A~>YO@yz>lk9WJX~Em_R0oNo4vlcE-UZG098{ zlgbn@!vkR3Tt5=urXC>3R( zY}6kOMnlk0l!u0+5oi<|jpm|x$c5&k1*j5Lp=#ttHE1EKMT^h{Xeqi7>F9cN1G*92 zgl&JFygV_+a zHygwDW3$-)>;QHMTfh!yN3lh02|Jmc!p>l4va{I*Y%RNly^vkT67~}Ia`p=LYW5m- zC3`)4GkXhrKf8r}fZfVI$UekA%s#?yW4E(A*q!Xt>|XX6_F48N_GR`U`v&_a`xg5) z`yqRTJ<5K>9%sL2PqBY;499U6PUIv`O;V$5oa+h$Ib60U!bJuX!b2o6e zaI3i6xZAnAxwYITZY#Hwdy;#Kdxm>~dzstE9pv8T-sRroj&Mi0Pr1*yZ@81(pBC1_ zSu7UOB3U#`H%kvoPfMUB$P#MlV~MonTKZcCSO!`KSq58%ScY2iEcuoK%W%tBOOa)w zWs;@TGRsnCnQfVGSzxKO)L7~)%Ph++S6QyJ+-O;4S#7!9^04I*%Qnk)%MQzejq=HFW`sqBl%JMIDQ&Gou9$a2TmC2hH-Qm&AzjE8a)g1xAR$l47tRxg3!{Y5!Z=~PFj1H!OcSOHvxG9i zDa;Y(3kw9dP$Sd{^+JPifpC#lM}&)+?=7S+BNUW4+dTopq)4dg~3=Tda3jo2=`so2~a*@3(HVZnwT_ea*Vh`nq+$ z^?>!D^$qKr*0-#0Ti>;QWc|W=%=(@6d+RCdZ(>iem*_7Bh=F2|7%YZ}y~R+mj~FS& ziwR<~m?Gwgxnh4YUn~%(i!;QTVyQSwEE8vod2Kqj;~lNo*E3i}#85i(AA8#I53k;x=)Y__VlJd`Wy+JSe^)ekGm|zZSm{ zzZJg|zZZWHe-wWbPl~4`EU}U(Nm6&IhtyN*C51|Tq)aJG%9e7ZT&ce_KpH3wk_Jmd zqylNAG)fvT6-(2k>Cz0zDb0~Ck}j5XiAa}7mrBc}%cRStE2I_DHPTJetA3WjbVB+`Iw^OP zZL*)-UG5?GlzYkka)2Bt2g#vww45L(%4u@CoFQk*gXF>TBzdwtMV=~8lc&ow}=uY8~Uu>6?(xcs!d zSAI!;S^il5ME+F%O#WQ{LOv#cDIb@=l26Fr$-l_I%BK{hU`0}7rH9f}>8IEghmxcu zD=A8R;5vCQXW@!D!Y^?l-@`3W9^11Sb zid3w!DyLdhUKLcUDyotytKC$8H9!qi`>0`RUo}pRR}<7kHBC)dN2#OLG3r>gNFAq+ zSBupWb%HukovN0pbJcljjk-{+RWDGNs+X!)s4LWK)N9pS)!WqD)jQNX)rZwb)NSf^ zb%*+>`k4B-x>MbyKBYdRzM#IWzM}3^52|mg@2c;qN7T>M&($x~@6{jFAJw1Klj6)Uvc}ZGbjJE6|2(Bec=lIBkM9MVq0` z*2=XCtx~Jfsx`M(uPxFRYb&+uwHve>wVSk?wOh1R+G=f$cB^)qcDr_mcBgiicDJ@! zyHC4c+oC<7ZRP#72elpA9_?vuul9`gtoE9=PkUWEsC}$`qJ64;rhTp**S^-i(SFc= z)&A&)x@q0Ick9tDU_x|teP!hVMrAan8)IX7F#eOq6gw6;8$46tw@*%*7+qdj=J7N! zeoS{A>ueL#lj)^%1pS~#mfE7zb5c_a3$ruq1?g#-_Vkp(H2ctkVFmV-l+@Ir*{P{{ zsd>XnZ9PX644dSxUErxHD|Z&S%j>J0)pcgg!AvBRu#pL2dNZL+A0~_mXCicq&g+71 z)kR&><&8`f6V1dhv5+W^iP05;zSV~j^c^JYsSnfROKpSN)=*M5JKtShSL?2%p zW~ZblrxvE#)06X4?CEKRdG_p~S!wq4%%MXw^KuIF)6)xQ((JD43isl|+OjHVsV%nU z0u+{4Ry(Q8GtuR7&8~D#a@EZ%c2&=fE(uklZUu7L?VM zmD<7}>Co~zkVRYiqJ2wkL9MmA-IcS;YDbv0mf8Ya?|EC)a?9+;G^Ri8$8;ux$z-ya zY$k`v)m2^7yXiLFPw%ex*a*EhkQu}bW`;m-=0V@}(w+Jo-35I(pZ1~+>L{M)UOc93 zk!x-lJb`hk@Q}`m zmXbkayB~CP=k( z@|fbWUaiVNX}k6my8$PV(5&MkMrZsRnTz$9MuzCIltd`9JI%8nc^f2UvuLWSDmxU`=o$RAhEik<>gL~ z$5{c>(K*voPWhq8?Ex6Ot7mw8!#V=;cpk9z;k)$=3XO<~>z9&|JE&mzsG^d|(`Qx8 zt6Es!aM2}K>=&$}R#H<|H*X4H#<^s;tGaHzBr7U_p{T5UfwQit)=ev;Q|R<7GwSNA zQ$6nT1s=O=Y;j5DVpolg-EZ^j-lMa2I+xUxRZ~sY`y^>Y_da@ZrMtL~4M7`v^|%Lw z1vT)m>L~WqmhTS^>HTk15DUfk32zFMJC1FDS?!zQG|Use#EIOFOM&%iXok{i$i`U9P}gJQym-%xTKX?pXL#@5->4u3|R4 zzyE-NUGB^^vj;-4gY!2Ik%vON^E#G&TEks6i_&f4{$YjZ{Tod$f;vWouRC8J*|Gd7 zW1Ne_y(G1N^q8?-Zn(R6G88(lN7MM?j%7{;gjdvqC1wAFiIciqp+C< zSZ4cv*gs=tY1a!Lb}JNI7QSw_T;8!@z-qp`++8-*(@b=3CQ=#lH7j!vkgeI@%BEnf0(6n+5| zenI$pP!X2>Rr9CJbyhoTfg~&TU#ycZ4}rV*5~$yR6FZjbM~*e z@~VI1F|Gy%e9ZA}z^xfg*RE{3?z$+(_pj;t8={6RG`>U)S+Tv3jYTDB5}4T*fN||oFs9v()`Ai35%d_C&klp(>vX3g)agz@T*!%vKgw1Y=bU zo4^hP1Jwj}Dj28SV3t}2W~jT_d%+C#AQ+rp2Q$+b?9UwHcrYpT=90K{?mTWH7>O#l z1>7<)3*E%6;Wl%Rb9=!Av=7Wa-*7)#td;;vxFyDt0H&SuEhUyIV7gffW}7Q5H(1tL z9t2a(E-=l!Z~4sfjpcjGPhgJ0V2tU>`|}}u7@xxD8zX>`Z&=p&e*1p$lMLD7D&}es zvWG3HsWimovGsM8u4?B*mvgaUilvLaPfl6KT*F+;EbVgoQrqm(lDhNqC#GZ;Oe|@w z1LVQf%+{}Msw`=!aeA_R)s;>xE=@~mP3K*Ai$Nl;o;#ufgbvpn7ibm6W2|JZFSYd; zQ#`u9jyAYeE?UQ|q>_;-_1wtZ!Xz{?H!(NsiF&^#W)-tqx9bC`WEZrs-dWpFR7Uj< z0G+2*bD3d?aYbcyaJ||r>JFxn3XOL%cQJP}Yjua7q$les>zO8I9kZUfM^Dw$^mILg z7VYm7lc43r;J@%v|DJQs>QIG6%lB$vnVpWgcW6Vjc$h?Ga`h z7_N6Pk1~%)p+up|L{q;<%&gi-N zfP+xlPMC2|z?|CwCiADD6;1$9kHT zIsj^JVqT_TZP!CBH&46X+H=+JYNt{3KIZjOTc5W5>&@M62%4Dvw2r?>Rb*o34dz{{ zPQA&z#k|cNV%}j6>x1|3r}cBarr!F zmDA83pnr!|Q>=rgL>1cN1+JPJCqTec=joWDFQjM@?Tft<_t-geJkGj2=NypES~3`q zQds7Ka?emyH(HrbNH3{%I;qO;Q_07JLS_XWY3b7Be&NZ>`h_n|P0Q*Ro|>7wY?;{w zUol@(z2k&Fypj1vA3^mFTH?gAN>Ip#dT5De(jS1x6F?23YFC>gvr_woXJuzBgXQxt zbxgCUUztDYWIe_F#{ACwp^w(b=wtPw^+1l3scNf_1HF~1wNO=L=PILDYI7KRW2r6X zY>5D$Adl78f)03w1{#GKYVKK+7`kqkv{)pgKqlcnq`=arp>D{A{7`q)1NB6`kUt90 zi}ezHf<957q)*nT=u`D+`gDDUKJz{lgo5D{#KgfT27X2`G4MTFFV)N7Qwr9JQh;Gk zy&Qg)>J_w)sO2Faw6?Mu(Bc3*PLDC4Ok5aH18~Cic4@r?Uup}0{6Oqwpt4m^Wx3K& zTOl>oL5J1Wx@%h?*@AL`>E*;rJ?k-`YbPbpiGoCVN7wcv#tqc zGE0s7IVg9nKHIoI01cekLU2QCYs(tep#f+RvlL8!-mf;)3FT9?ON?X|5;fXDN7zme6jxODSToL5P2sB}(ky*YDq*%DWk>jLlS z*TJCnI;~ExbO8X2s;PBVft|#>?cKAkXm9BNQ3D`R;G9!dUs+e+oLxWHu(XBy>VvDU z8ZbH1XDKp@8&%feuBT=zZ}PcdL83RQm<8S7E2)U?lzU)|PBW}{4j>Pz1Aq-?Hlund zV@z>N4~=qG&-L2<+FbK;slM0%+G4b1TAO=K2&AF57p9J_aaND01_P)E>>GsD-BKn*EriPNYpXe3B9UQ=5r zOwant3OY%Pz-~U?2||je4gf-J*&Z8fws{S@gGpG2Zbi4D+x6x8W%}jo(4FWmbhmzm zew%(X#b0;&)I&YKs=XE`P*6=!!cA{C!va;%078+g+`M9R(>-X*y=Vj4i0(z3P&3+$ z?nC$MEA$ujp9ta!N+xJ3LGuY(syDukwxS2oLkI*hP&>Av?Pv#j6x5H$(N6g53A7u; z&kCP8zJ)t!d&YQ;;1P3xVyW$#a+FVMIvtVSJk(dBRqzG-X|>mS3@l7bIz7E#ySucW zX=V#1j2{KL&2O!&(IRx~*Xo<~`}8aI7vQf=`txt1r_dhsG(6m1^bC3yJ%^r0FQ6Bh zCg{xq-(!t(8$#>MR@vQ{;k{Z6!sFd;%HK}oI^?V>b5*w{hd%O-$JjY$nXUKqCjDyt z9{pbZDm}H-mejI3x9d!!z*Ylv%Q|h0=PPK-CiE(L4edj(qy6XrI*8stZ|c|R*XuXx zx9F?&TlL%ZJN3Ku#slaOdIz3%2YMI1H?_4D6TIz%KDka`Ims*2I_BAUV;&wsM?u~P z+Gtg)3^~@Dr>M+T+k`%%vgBFQm^FU_Z2O*m1F-8#uietTehl3W*KY!NuPg!URi=$I z?|g$I;La*o#i412Rm8mYqxaStdW#w;&C8#_WTAE3rmuuq<$L5my%pa5jDnI4ArzOOEsc1B{;1yQ>HA@OW|S0k>_pP)KqaDlV3uFMz?L)L2P3p3X|ynyjpB{1h%~@{V9Eq z9yyIZrk94Do|)#dX9!kCi)zu9wR)ppui&U54zK9V*vidPm*Aze)CPQk{;d97n^Gst zfgU)$yi%LJWo@F{qDF&FmT(j~=azZuJ+1w1VE$6P9Fzf=PDb)J@=6oFj81}1?{yG5 z@D+Fkz7k)BcH(RBwP?5givF(tp8hXb#(&fgpSFzS>+ucdGOi!eUoux$qeoVQ?1R_f zTk&o9b})|KiSNR9>o4oC>96Yt^n>~v`kVS&E$bxIyAD>8SM*o)l@qEfG9BeMY_2EA z@FwqqwGS2<&0HSt_bw0ny{jADJTeovS*XlQZ5Ao>Qkx~pEU?X@WL|pOTgTg-FG1#_ z^E_R2^mmNqrQv^Xd7%$&tS#Q|YD-@%9V_w^6-5A`GZQT-$RWBn8TQ~k4M{GN~ajsWp}1jP3V5Z~uM;`<7S?>qSW z`*XzS^^I_N{!Zfio)X^=`WGhgoutI~GyVlWr}Sg`m+(0bw1W$6dA5OqjBovO%IvQ=!gp(+y8 zjUX#Qeufg~U1nGh+Om$VW9!*P1c?O61gWiKT25CLsD>^pfWQtLhQ6U=FEYAYIYW0F ziVb_IkxDy5DnkolR~Un0GX`aGR|loS=~)1W9_;0nE-+HqXD_HpGX6|TtNm*oq{EZ> zR0Z}reIr5LOKtQ1QbG71HK0{zXp4ju1`=$bmit6-!&4FDb$hwJ-I~O%VqveWnO)7U zVQ*z`V{d2gVDDt_f<4l;1o;ybKu{n-K?DU86hcsMfVxH-~2kr;LZyOF&Y zem6651ce*R6G1TqB@mRTgAZcAb4%3UzeKT*!V<+kMo@%rjbeAf8pS@r?uO4(1Vs`Q z<^370H`*52L|dS_bUeqtK$ofK35soGUnHn+7Z<8m*nM=NdKJ3}ilZyl>$sAj_|BH9 zh`XW;Lpa0OW|;LJV&65Eti$@V1lj4D^|}r%jqha9`u9X}pcs28*c)o=U_Pc&-xW`8 zM;81TJ<5K{eg-V~1$&IL;ADL>K|=^ip(HqkpurtT@GJI2D+vxHDD^ZF`~hvbhy9WL zi9N~w%>F`98bKKZWf7D^Q2$ms{EaSg1f|n84(x8{Hp39^>H)*(6 zWd{4Q*Pg}kMiJRY5y7W>>Nw`my>V(zF*C>p1?N%Oa=i>r9b|B7 z^ZyQ~p8jk}r(bA&*d$*sC3Wc1R=Wk)%V5JnJ{)p=xOiYZE{qH3BDhE{ii_rAxLB?) z2lO?Rpge-|2`V56n5&SW^9UMF&Mw*N_mY@=XCQ!zk zc#iS@e#Ya50ON5mLZf_)#}xqMal@DrJZ>^2yy8v>uLCK7Yf5`igB8UI4(HAe#6~wPm>pa-+R4>$3qg9PTL26}(HYYqM?r~Eao z-cxJZb7 zd!!_v`MHgN#;rCeX>O}`O@~qC8mUgkt%p(Fz->gk396<_89@u^u)>yY!|B7?%x!K} z%N7$<*-kIx9t6FNdx(3OdxYD@ZRd7yk8&VAR1xGRsD_}01l1DcA*ha^`j&y?8tJYD ztsAy2rnT|A!hHcgR?{=L>_0=7xh9%i3e&XOLgGU$|enQ`~Rd?*v^$5FrRQ zi7z9tk8EzHai3cd1p(Bc!(^P@Q0H{lf;}I0&}_cxXyJ|NcnO`3B~>nusl!`jW4xBr z@#=J2%Hk76E4&Go&)c-4bk!`&GucFZ{>Hojz$&n+|C+$t}UgP+#R+ z4lGd?2gn_kXz(13we+>bS>nNiG||$}VkhWYg03TIB|+B{bOS**5_A(mHxqOVL93cA zNrv2ENwcJb4`Ylai^?6VO}XPX0vqS4RP0!LPVD&m#SY6b5IZa&39j*p9hMQW+*!_N zn&^k1TdCLqKS0egSANSlOEHKXmhlAL-e>`#@Q$vD9G1zJX;flxS*Geh_;-TDV3|QB zhPygQ41RtKq6~q9fglLp^NE&n%N(z~VR2Gs* z7iulA#}rsz51vfbbsaW92)c)$r#dWbELfu~i!Dn|w?^Gh&<4t5Nu5}uEEicWZdJtY zBM6KuZLLw3%fK3Cx!iJvWd%X^610h+<`(*5+ghW1eAUkKWOCR|2E}YXE5)?4GnqYq zhh-z3+IL#+vfOQ1YiYDJfg|{O%RQD21Z^Sc0fM#?^dLbG5%e%Yj}WwtpzQ?hXtsdi zg#NeOXBbf|Tj|t()STLnw;EA)pPSqNz}((V=k}8XJ!a1Br_X3aF~|Bv%S&`_|BIlV zjh2@Q+SSFmz0Y#MnA`j5+nM~1IwyQv7< z#pMf{EFaU&Na}Fi@g{6onQmOA#@%*81e{~|+?afL9YOHKd(FxBs#pBCoB%1p@--ZG z_}22B<$HpjA?P`RU@E^z(7#%z;XKPpDn-Ejein8V1#{M&G9-uRspJ4HInAPK&etx^ zVcu%Y;g>p}!|z}luksq-jR(&a-Vgin-T5Bu3T89=40y|L=6mt}%nmrG0WKmvz4j#7 zCI`RP`l{+N^;NU!v4HN*YPxsc{-R&`JUE*GCthpEmsQVo!u~W^c`AKgRl}-b&)vJ- zZZq=I{q>gO%v#!BJiRz~IYBmpUa`&BnI3=o{&|O-59UL_Wfz=6sF%FCS8aN){Kl%R8O7a#oKs7f?AX7k~E1Ru#q5%d~C`v`iSp#AIl7(Nz7@IX}u2zpzG_PwLW zPafr*<8_;yGTt?Jp7*b*#(uxy0!qQx;#%3_nrYUS#HZ8RlHq(zDxXHsL4w{O=uLv& zS`P#X*oVE(VKAys89W#=5qwU|s2ekN)bzRqk1tznxT=H8LHoNtmw4~N3GnG`chj5Q zT?@XV;9cRW0Y^tz)BM{d@s>{g`^>fu=7)k?FF%B!Lyb%mGzvUV{6LHJxGR1B`t*s- z)P?+Tni>pAha3431ikA`4rA8R8D95B?_ApUC*HyRtE|2Iv2|B7r&VW)|ecq^`}ZSa*o?dY<(aG(W_-n9%^ z)Q}~Hxz=oQ8Sm_@wmDGSJc2%^wSA&TwvKbukSlCnX#^&SG32Eb3?*(a63kMo`5M|0 zZh}5<C3Z zt+<@OsVyCkL;#^RlVCvI75uCe5j3@wZ8&h29s-=g_JvDA{2(P97@-11N72qJ2Pmf7? zU01=?z78C|N0)gPK+cwW4Vb`O3u?Ip#eo<2dB(v?ug4Y~8#7wj;)pt;z-Z8UwKXFO z;7~pF`>j|4^&9C7Ue%G#>bxI&(hA`?7*Xf^Ai#rQV;~lWpI>&<1GesQaHzVU-I0_% zXz-9iIPW`tf)VNi!V}6$m|BQqRt|rA;J+Kbg@^ZK!XZFIJw!OGhU=9O|EwBPI^o_NZ%!v1m#i`lFtj|J z@eD=AI&HFf>tVM8$tkI68Ceudokt*POxLZAnYyCe4&>yf!ue~E&Y}Cu;owfS(ccp$ zj3_Yt7oqC*w~C?fb#E*Yh*?sQQJ7wsm!E1+PRq%#XJ#em*|Rc+Cfn1qhoi?(<}wPZ#~20dnOocn7%{vipI5I%V=6t(J;7N zT+%+oL-DYg$xE{4l+P}!NS|GvT9NEM5*rL5S>hoIUKWggC369D2^?zN!aT-21uEN7 zI1c+OoCk`BxO3;jIgZ(IC}R#poTJg^s=blsJP>Ja3B;Pa5M6}841n%HyU^2E#^4tU z{*puRa9j+Yc+(*k+$=mBSKtK@_3d`>_qrPn#J<MepEGAfnsva2QsE*lp=>2zDXs zferh`>=D$O&||j=!D1 zlUWMHKwaQXhP|8L#3XFu*Yb^g6TgmM&)>su;5YL367(ZMKM{12pq~kX?Xq79Iz`ZL z1pU4V=zBANAAdi;g@1tG%0I|IM49{#!etUJhj8Z;u7Yq*!p$X|_ZUsjJfP$SHEswh z;qeBH0n0cXw*y~8@5v8Cj0MrR&gm(1*Md)~XSxwr#yF@4@}2P&P7=Y&54LA7;g#Bw zN5QdAdZeY&2?e$u`!KTQf%j{LH>0br0X%C#ZUB+hoT&!nfYO4Ezvy8h5C`eu2k$~M zqI!-SlADJZT9OAE=c9}^n}yLPn;p8Fe;Uq9@K17I^Lq&T6Rdm$Gwb-h{4@Ns1S5jG z5%w5eO#8N2?>q5e9Oa&C7G7%0GE#bfra_nj8t}2WzJ@;0>7I}6(wI&97yk;J*5zN~ zUnUqL4suQWtNd#O^8_n;d>bnmf6!|M!)&Q7b%}imbw9ONy61u`cwt^@PGL@dwml^$ z8)6RSrDoc*Q&Q6G8R>Z$$%UE8nVE$JZ3{YN6lCd8P(f<)(B!P4srF&nl%WdqlkGX# z$;0f~1?fYxl2en@3kvhiX1~k7PeqXT2o@Uo4+yr>UJEiu#OxkZfHu5f`Hw(J1{yYAApdb)8+KiCdgmwH6{Et+IKg0dAi|{A;Us@mcSAtbN-Vif?r;qdp z!CGgJbcp}TY_)~9+AuE(f)L6iJYef3SlMHOB*=mysDdVR6KsN?&|T;u^b~pt{z8Bd zCIKI~?XZ zD;2nmDq~7*|0TY*LbcH%2-j8jpL9a|@Mj%5qpof6v(}SsUJ9tMsA)g{Jw{VNj-fH_ z{@Fuz^z>I!9w-3LCG98h5~C4`|12olP26QhmG)BG|LHcbaEZ~5q*B{|#VHiw3Zp$K zrM4yiI38LKT^g%Xc}*#tbZZaKYmDZkmD=?Gz2=x_K)vmA)s&W1RDicaTiUwmUtwx822-;!GXYTs?EjP_-f+Ai;E``WVXe?~B7x6$BwzN51>>1OBow18WM z^{~|`+$P*E+#%d4+$G#CtQ8uCCSe`HIRxht+@Ih91P>&55Wyh)4RMgf-d=Noy2^}c;@C^jt*lgYFL*esA3D*D<;wo72 z_H-gJnic(EJ!t^&CknvZ0DwT)-e@7GotQT>{4QE4{{FE3DKa7wvB-*?Xc2i)Aovb~ z?<5#z&fNsV%xNUJiGZ6MUQh5n&7x@FPgD)ZYtfJ5Z-a?H@G>68iY15AlolnL+e$b>n$W@Q7!!CoMWgD4OmI7=oo$1t%7kSG?4=ZV9`5#sscNO6=n zS{x&Sp7J2U4-xz@!H*EUjo|GB?;!Y5f*&LJ@n&(H4~Y}RiQ*(CMw~*CxYI=9lLS9Q z@Uv8Ve(oF;{{bk@rBIwl@GcXI3n&yT#VYzC_z8jmHuNWeafHokj(457h{6#>t*07A z5ViJn5sphmaB^!BFQlCKG;pGLF-V7aFGzbG@woHHs3CEN8f`PrxQbVZ;N%91w0I?j z=JOyciWfs}D5FCGW?QcpZ>QM2LA+7CNxWISMO-DW7T1WkinkH`BEkP6_$7j0CioSC zUnTf8g7*;&^5_0$@eUt0*ZNp;J;mk$6Pw`0>0`-5=b-ryK=UCAO`wf~CN#I7O;!}2 z5TB%w1h~H0C<4R1)kR1?BR+31X43IYtiMltwK7jnEQ9-$C? zOMF{AB)%ga7T*=$6WRgkH4e4=!f9Xb>I;A0pw`L z=$AN&2OLTkf{!&yAc%e0H5^K^q-g%`Mvd0 zA-kJ?2>ye{Me+UwH1;zGd$dGj1W02D%QQ+wghgFMV~Ip#1V}VS0L1;;-6YW%0W8~z z_To433$wDB61Dx{25A;xk+o1P(zpPS?F?3KX|7aDu{ck1N%N%zQl(TSRZDKEMp{T% zfv{G>iiDL2D-%{BtV&pou;3GDYnD7dEG{KF z!uBC-7-7Q+8$sAe!bUYqkNF_@gtS|Fl8KS_PzXkw5QM+&gmu8$%qE?~;6H%D*C+<} z5jMue-~q~q2c3s^t_Xr!`D1AWKgf2qyBMGcP zU{aJmf#sP^q}=v7<+gquxXmy2*Qg;@pW>2Z*88>eoxzRYQeY;ZCBK>DXPKqI{6+dz zIwk!k{Vx3>{V6jtk}+XZ37baPbi!s3Hj}Vfgv};w4qT|=eZPfqfpQg%>O4h2-nDHN4?9Z`96f-TmpE=$h!f>F+)U>tUq zY-Wxj@<;%qJXFq;^W_40m|Q5ICl8lL$mbLGJi-nq>gs#EdB#noK3M=>dB1!>J}AE- zzbU^(SeQ0$!osux{iT+$9>UfUww^#NS$1)=e8>mE_h4OySFXuNC` zW&Iom{{aksO)>ZlVH->gLNILDc9B1T4_G?xCF}*>pYZY=n`(B1>U$u|0^*@2zDi&V)0rN ziz|&F?1a7P91{P2Bq~{eLwHL5`U4U>hG92xk*5>@0+oEiUf-wyJ>1Ym1ddQf z83-In5qKlzw$6j8n-z^$CKv!Lp#Z%3uQNEl?Pw0;p4Mka@z{Xpn0u-{YQ2`2B-$e|rRBkjd zcmu`YJpd`?W-8)s=pf?xJ$G-^kl1#9v&wDCodzK9pn%+TmfR+U*C|^lBG)VTC>xZG z%Du`arCHgm+^5`6*v*8!kFfB^7Q#M2*sX+pkgyLC_F=+4(yTn-L*&DTfT--Ch}>o( zaz~4Rxa%As{{cWgO9A;DVYi!rd=UT%){7?kAz-cmlL!201>`#d>lkXuIlG6jPZM@8VV@x^6bjG&JYipGR(|r~ z@K@!O@*6PY9~6f#nmBxgu=@!Mo6v+kcn*kvKM+*~fT*g3g#ce(w`tV|KvezI?({?0 zmk9f^@e`!P?`(a2p!__D+KdOsD&awKZneJ0GX30 zGA9%EsEN#JfXp+VbWvxk6%>(R{rI?1brSZIE+W#URvL(0KoR*V1ynUf<15S8q^nBrK?{-xBsa z!hXMAy;;3QU8RC-{R82wgzHJ*O#pC?C$U{T6C>zKsc|i@-c?yqG!G8BdVJSy{W?i~ z#&98KSXDEiO2@+CtSkuOdcV3weL&r+ zf=KrVVgDo?qYoq;A{<9J3*mUe3AC32Q*sKD^Ye#gr)Fg(=cGbNmgJOVh}e?TdMo|R zw=z54GTx=0)}f0FU6l|w(fj&f-^g@GQUF1gE8P%zhsG20K+;r4a!WG`bG&tBLdcg6 zEzIcH4D-3NI^K$1a0V1WG%9$ZdJ&B^1eKek@PxYC2>)hY*rS4*``WcID}CU6R(;O6 zU@VX?sxLLF{~{bF97MwjhKP>~!t)^TP;Eo_Bv;+M@KLVWwGh;hzI$;ovqXJWeGOtv z`GPG0Zq})<()X2{g}<)uZ(rLR>YME^98%vgE=*hs@#r8#7kz`Y`aWgH4+sarY!0eN z;q9#u2~+(@{aF1({d7vp%Q6Y45KbnXL^y~<@*f@a?<%204c+_b__q$M*=Ii4G4%vQ zJ5s+?kE>r1P9>a1xNhszuQ8{7OE{Z;7lC+g@e_^7HPM(Q5Y_PvgJ%ZP@j(2qGbAxO zhWaq6zYq@g>dlt?rv7dYAdHB{Xz=3q&~}7ydc>f08rE1EuIKE@&Kk8xvuM0g?U|eG zYoR7--GKizSyMDsgMJDiTp;0s2p7CwvuS=>cdZBELI`IkoP%%~|33d25v4jMv|<;; zk*uEkA2MZU#QImvrv+;el5~?6qV?87wLV&y7Oq8Tky;etdJ`^`aD50DM!0aoMG!8M zaBw|(lNQ6Q*7|C3TD+E^C2IYE`M4O$d9j4+OSm|~B@ix=aQ#kWzE0@vOc-m!VJ5$v zg*Q7P$N#UGPs`DA+cAwcP#e_#!cZ;GoH)Qa+Av@~t&ni>f5m(ztk2hA8?_CUYGbsq z?JtbiirZh9s7-2H+BCu?wV^p}rdF!WQa>eJD&bNHm+U3C|83EQ@?Gh?AE#HE z59`$CQ3((D&S1MH&85vJTpHoh>3r>B5YB0{t=nlqq&iP$R#BtXf{d#zBwSXb<{?}* zgo=fDV{|<=qd}ftpqX`vb}8fEtTkvCXiK#VwPo5x+Qpi#5$zJfxwFXk=9Q@~&#+3@To*+Bg?MOfQ;hITa={y^ogQF$ zTT3zCAimWQp|4$O=7InLFpZSncV*W>{JZ*EDA#wG<)f*SpRSvJZF^6WYb`K^0My*L(r>!U4NWzUG+-Sm$S+8x-Hfr~3 zn+P|Sz&nq)afBOB!9=6TwU1xu3kVz7;l@OWH02G#+VR%dnmV`xeVyDPmoIc8+%B%K zssh=@z*n(zE)9d|ncx-fCZ?q2rz9tP*In%)l)FxQSbIdHqg`1+$4BH`e3mgTGFoKqFR@`7GgGn_<#0L6|C*&ZyoE0EvLr_mj2Ti!LM7zl3KUBPDjnM(xYeZ(3seMNk**O14i6n2*>Js zjOcP2v=@ZVp>=h&uGtXf#{=A!Q-0-O)ZYt344eCPO$JhE9E+nT^at%p=Tp=27NxW*4)Uc^RU+zRP^X z9A~~}zGc2g3i3m}Q4H#bl2A4p2+>|gqw#1ins3;sFfx8KX};gSU-Wf5-MN}XVy3$SYQ__|3N{zByS*2`O_9`zcuPU$yq8wD-Q$A3RC?6@GD4!{RfSo!~ zEmVuu5_N()Nu8xGQ0r8pUJjRUSti2xYwX4@By^j0$ z^1s0UQvX~1*ZSY@|B(M9{@eX``aj|Sr2iiO_x!)~|2Y5!umP3;AwUf19?&xYVzLJW z2lNie2q+1d6;L0rIACSK%>nlZ>o*FzYczW>6;QHV-!S@7j3Emp~Q1Bzc+k>AB-V?kx_}Sp+gI^3j5#k?` z6EZ#I!jLONnnKoxYzVnGq&eiikS!rwLmmowBxHNYqalxn90++MgKSQmdVyGP2Gc-6f zEHo}OJ~S~jJv2Y`{Lt~CC7}yK>q1HB^3cmeuME99^xDt|Lmv;_8Tv%%bD;-9kA)r& zJrVj%=y#z%g#HxzbLg+3zlHwMhv^g0C#X+I9|(ZoC!$YOpV&U}efsrD>XX_hz0agR z%loYA)7WQgpBMU^2;;)~hV>7d8MYwo;;WKQI`$cjik@{-8qk(WoVh`cKD zn#kRe&qux!`EKOV~MBqSi#+7PT>IQ`F|D`=ho+JstH-)N@fUM7*-^-a`wQ9nfE=x)(|(LJJjMfZ(PkIszFj?Rr96+Iz(YV_P_PxP|ri=#>O zr7>bm_n5dCdrW@JsF+DHQ(~sYJRGwt=7pG7Vh+U|ja6g2#}14=KX!cV%-C76vtuh_ zt71K|OJc8zT^)O0?3UQAu@A*Q61zS2(b&ghcg60GeJb{i*tcR2#U74*FZP4jBe5UF zeiHjx>=&_L_O$?;|JOX8Qs-yFX!enN|jUrpSXxIgh=;+u(YC%%*TZsPliA0{46{J0J|(aQirWv3-Jll6{JOnti5ymVLI}ZLhW0*%#Xz>`U!y?DyE4?f2QY z*dMlUv+uA!W`Du{lKoZtVf%;nqxO&OU)aC2e`WvL{)eNxBh8WF$a3U3`a1?X20QW` z1&$exS&rF`3dbDBJjZ;8$FbaTxnqUnD#taB>m1iRZgQ-0ta04q*yz~g*z9=N@s#6f z$1{%S90we4INov`a(wFe+;Plt-0_R!l;d~DpGiuRmSjuno)nf8krb5_la!j2k(8B` zlQc4Ea?-S<8A+u{?D%P)$-R;TlS7jGz-t_$l4FzOlk<{?B@a&?nLIjq zZ1T9|smW!@70Gjx=ONE=={L)~7B>U7C6kgjl;Y^|I6}QrD;MP5mrQOtYsIr!7ufm9{Nyf7;=+_tTD~ zeUx@Q?Z>pA(@v%Rk&e>YbW6IBE~fjZ2c`E;4@-|sk4_(&J|?|5ePa6L^cm^1(r2ev zq7W_i5aCC^E0Y4YBD?-i!vHAmS(KTxH{w7jFlNp84qMUl<`Q$_Ke*b zFJ-)%u`gqP#@89YW&D|mGTBTmGbFQ5W_V^~W_sq(%!16q%;A|oX5lO@i_a3X{Ie3X z99bz@=~-D>xmg3VhGgYu6=sddnweFWRi5R{nwvF0t17D|t2V1XYjIXX)~c*+S%i)O(zoY+#{?GUSSO1s$zuN!x{s;QM+5b@g!~K8gf3p9t{eSEK#{gyk9v~0s zJs@mAvpxa3PC`Sqd5@p zKJW_&eB}^C@GA%+ha7SUqFe&v0K1R1vde1S$I8sI((c?Uv-@;4-+eys`^)=xJkRra zU}zW?hJz7cG#CJ5!ir!VSQ$(PgJ5!)0cL{L!mKbKtO*u`HN&>Rw!wD5cES$Bj=+w= zPQbcg-LR{$9@qeE5cUB!lsGK0I?Uyl;9|H8u7%gY zjc_yE1CPSj!#Bb=!wv}55p@}L71e{fj=G7uk9vZ7j(UZ9iyB0aLXSa@MUO|vp=Y7zpyScY z(BGq1qF14DXc{^bosG^#bJ0q)8m&dwpiO8C+KzUj8_*uKAH5yD6TJ)FhTe-lfIfsi zfz4k=QZV z`2SWeKVwN)3N{^^iOt65Vp-S{Y$;ZXg|G^&3aiFiv31ybYy;MfjbK}`8?c+O?btKe zbJz}SC-x@x4)z}QFYF8KYwTO>V9MB(A5zw(6sDA=7*c#G+ft6EoJcvHayI2$N_Wbw zltJ7uTpTU|2gjx02)LhdBpd~oiz~nZI3|vbN#{wOq%KlF`BU;#@?vrUSwyyyL*#wrljQT{ zPVy!474l8;9daM}KKWtVl(f{eoHTkGBdsW{I8BfyN-IsPN~=!Orq!hFPdk-%ChgC( z4$4T%WXe>^bV?j$7G(|vM!`^U6e8tk3P35Ns3_GGEk#E$P|OrJ#Y^#1B9wN@G0F|f zOX@J{$J9~OG1PI?3DoJ-IO;6w9O@6$pQvl7YpHN5lA21DQ z52PQ;z-CY~Xc-w9*%@6Kw=?c$^kv-7bZ15~W0~tSH)VaEH76@RYktB7hS9x#qOY^JptMj$_H3ee|z9{&zAg*9m z!G?m}1$zqi6|~b+=u|qF&Z7(IVtN_9oGzy;>1w)`UPJfOgY;&43q3+_rEjEfrf;S1 zpzoybqFazGAL0@Z*Hr~!oF^qAHiHy$~(-?~wOBu@<-!oP+eq^j+Br*^T6eF2|WiS}kj40zI;}LT*a}|@u zlrZaxRw|3aN@r!Ua#$cs#;Rr6SPqtpBEE@E@pJhqT6Vq4ihc8J}=j<7edH?y~~cd!q$&#^DEFR`z%ud{El z@3Q;YFFC_F(>PypzT(X0#B;vpEZ{8SEafC{R&wy1b(~ZViIc{maWXmCoLo);r;x+o zRB?iwBb+|&XznsDg)8RPakp@HbN6x&a1U}%axZW%axZbaxmUS8-22>q?qlvV?n~}# z@N;ku_%-+~xDZ?hCV(r!RUih$fiy51%moWTCRhY=!D6ritO5OC5DbG6uoc`0ZUMK0 zJHg%HUhq8F33h>(!7E@7cpbb6-Ujc1e}VUlM;6a7#ubCb*5aMTSBl^8rtwzrU_1m5 z#Y^V>%uDBG^0IlkynG&=$LE#sN_kQq#FO*fya;atZ!>QzZzpdTuZ_2tcZzqJ*TcKc zyT$9{{mpy8>*o#fNAbVn&*sPTzveICFXAudC-7JDf8?*>|H4n>Q~BxqOnweOpHJrl zd={V0=koRZ2>%qnUob)NgCI*#E@%|&6dVv75*!g66Py!t3$6)z1vdq^1$PB~g6D!) zg13Ty1pf*@63!GZ6fP4c2v-VM3)c$a!X)7@!ZcxlkSQz@{>Kl5CBjl+nNTaN6GnyW zg`0$1g*$}53)_VIgzdt^!lS~g!d~GG;Vt1EVW056uwOVJd@6h{d|5K7WO)g-L|Wo4 zIaG2_G(r?FLWpo8q9|2F5@m@15lh4o6^jI-5|LOW5vfI5QH{tXvWRS=O`<)bcF|$c z5z$G}8PPdWhv=s0j;LQWAQ}`6iHC_l7LOK>6;BXP63-DY5u?NyF-}Yrr;5p9syIWO zEzT3u#bx4hafMhRR*KbPtynKMh|OY)*e2d2J|lioI;r%B(wtINX`u8#>9x|krGJ$^ zDD5wOS^A-LNHR<^LNZb^N-{#_fQgTLePI5ugCFz!2lU$eFlH8TNmHZ?5AQ>tfR`zk(sIoC- zW6LI#O)C4mY&sa|T7nxz)0P3o5h zrD17A+A7^3Jt6IqUX}JpZ%FS-`=s}!52f#<@1_6BK9fz9O_oiS&5(U1n=P9wTP{nK zrO9ZrOj(XBUsfn%%Gfec#+Q}IbTWg?B&(HKWp%Q8S%b_i^U0cILD_y;k8G%XZaJpB zxZGC0rTowGhvhHIUzfit{|EXQ8V5~;K8L13UqW%vOlTpr1X>QQfL1|2K{N<}*boTu zAQ2>iq)<6j1DT*k$PWdeW+)1^LK~sY(0=F?bOX8#-Glyy9zp}qQ|JZs8hQu4ub5OZ zrD9se^oki3Gb`p)#8=F(__pG^ibWN;3U-CLVspiXiZ}8&`5JkaTq;+|tK~X*jodEx z$bIrAc~IUgZ;@}4|0drh-y`2IZLb+%)hDXas!OUs_CjFs^zNhRV!7iRI61m6+(qnC9AM1oQkE=s#;a2RgeFp zxj$89R7tCxRsO1ARk-Tcs?Alqs`gavuR8c&9(As2?a-m6Ee$Ezo* zKUYsz&rr`)&sHy0C#YAblhhb>ikhJQMNL*y)#+-MTCA>7o75JyUF}pis6A@GI;ak- zBkH~C1L}k7!|EgID3k0q3Wa6cQwN`vo#Aei!@6$ z%QdStC=EuFq9JJ3X;L*gntV;6hN)p|xEj62sc~z3nkG$H6Vb#p>oskfeVUV+KQ-qy zotkdVRZXwvhGsxBsGXpltevWzu8q^q($3Y+*M6&As9mB(X))RqEnZ91rfSJrik7C$ z)MjgQwUE}W-LJi&8?IZRTc<15nRGGTHr;Q!UAi{iVclunS=~8ZhptoCrMs=Wr~6y? zP&c4^q93dOQa?*SS3gg`K)*=8M88ZA*Aw+5eVU%8&(`Pa3-pEh5`CrKp?B%sdY?X^ zZ`S{+kLfq)H|w|QkLge9PwUU>&*?AdyY$`qtNLF34gD?shnlZyl4^h&ea)ttj+!Ti z@rFf)m4+V;YYZ?0#*k_t8>og1L$)E;kZ+(H_=XZgsX=Oh4040p5HV~pY%**$>@@5$ z>@n;!oHleDdJQ)Ww+(+8?i>0I1BUm;(Z*TExyJd%Z;cC$ON`5nD~zj*tBo)t*+?~} z8#9gB#yn$zvCzmc78yB4&{$)P8c!P^nI@W6nX*lg$!+@G)NVR#I%+y@I&ZpSx@PJ% z-7wuU-7!5eJvY5Fy*2$~`e2@6{?@$MywsdvUS~_R@+pn@0Pum{g#84!i!7^kWZ;i7qx2~|RvaYtmtOzU0 zim~FXL~E**VJ)(9te}-=61<{&9mWcd|Rz;qwS>ag00Ke zZM$l_W9zp)wmr4Iu)VUqv43nIWglZ7XP;=FY+q)F*^%~SJJwFLr`k#OG<%_)X&2e0 z_Hw)2US+Sg>+Ci5278OW&A!jxZa-{4YCmB=ZU58WVZUgp>9)MXWeVZRL4pO*^%wYbI=`tqu3#F$Q%`pN=KEW+M#vm z9ZpAs!{hKff{tcKyW@wft*+g!qpnk~v##^5E?2kfnyc6Kz}4>> za6N7Kr6IQ=zk%MsXt>mHr=h>$al^BQmknmhmaJo%miPoYQP5qe5IVvovG%+e)jQw5?{SW>3ie<$UnmWiGQ?ztbe>8<}dQQ{73y4{P+BS`ycuT{7?Na{IC7*{O|ok zO_Q6ZHhs}FqiJT-oThnA-!y&Kw76+$6TXSpRMQl0>S*c@d=i)&AOtc3nSrc8PJk2O z2EYI>00k-n@<3%kA20@L1Gd1Xz@EU~z`nqN!0Eu5z}djLKu@4Ia6ND{@F*}4cpP{d zco%pd7zz#xP7Y2DP7lTfX9ev+PcRzX7~B%v9^4h&6Wkwc4|WCr3ce4G4vh^>2u%)6 z4Sf;%I`m^GIg}O34Hbld5G%w96^8^NQAiS!g=#~#kRwzdY6y8k{!lO!4n;z-(E8AC zq0^yDp~ua`nx{7}X+||?H<$hw2^yOZHXm<3(cIa5v-y5=fAiz!XU#90Km0e@7!m#? zJUaYYczzfW&JJ6`&agM!65bHr9NrfGE&O}-g5V h)|sudTjN`owI;OwpTRJE`2Q*l6XO2A(a^f;e*k89%BTPU diff --git a/client/3rd/PacketProcessor/PacketProcessor.xcodeproj/xcuserdata/sanchez.xcuserdatad/xcschemes/xcschememanagement.plist b/client/3rd/PacketProcessor/PacketProcessor.xcodeproj/xcuserdata/sanchez.xcuserdatad/xcschemes/xcschememanagement.plist deleted file mode 100644 index 64a14287..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor.xcodeproj/xcuserdata/sanchez.xcuserdatad/xcschemes/xcschememanagement.plist +++ /dev/null @@ -1,14 +0,0 @@ - - - - - SchemeUserState - - PacketProcessor.xcscheme_^#shared#^_ - - orderHint - 0 - - - - diff --git a/client/3rd/PacketProcessor/PacketProcessor/CocoaAsyncSocket/CocoaAsyncSocket.framework/CocoaAsyncSocket b/client/3rd/PacketProcessor/PacketProcessor/CocoaAsyncSocket/CocoaAsyncSocket.framework/CocoaAsyncSocket deleted file mode 100755 index 1ed5a5d0efa58d65970d9618cd0bc98dac8a829d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 776832 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

dd)S&#^Wo|m2#he3xD52-L@IfOpYH{i07r>XT+ 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%0ASZ@%F8+8rJF+x7zz36s+>L0Iefv4?!CH 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 z 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 z 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 - -//! Project version number for CocoaAsyncSocket. -FOUNDATION_EXPORT double cocoaAsyncSocketVersionNumber; - -//! Project version string for CocoaAsyncSocket. -FOUNDATION_EXPORT const unsigned char cocoaAsyncSocketVersionString[]; - -#import -#import diff --git a/client/3rd/PacketProcessor/PacketProcessor/CocoaAsyncSocket/CocoaAsyncSocket.framework/Headers/GCDAsyncSocket.h b/client/3rd/PacketProcessor/PacketProcessor/CocoaAsyncSocket/CocoaAsyncSocket.framework/Headers/GCDAsyncSocket.h deleted file mode 100644 index c339f8ab..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/CocoaAsyncSocket/CocoaAsyncSocket.framework/Headers/GCDAsyncSocket.h +++ /dev/null @@ -1,1226 +0,0 @@ -// -// GCDAsyncSocket.h -// -// This class is in the public domain. -// Originally created by Robbie Hanson in Q3 2010. -// Updated and maintained by Deusty LLC and the Apple development community. -// -// https://github.com/robbiehanson/CocoaAsyncSocket -// - -#import -#import -#import -#import -#import - -#include // AF_INET, AF_INET6 - -@class GCDAsyncReadPacket; -@class GCDAsyncWritePacket; -@class GCDAsyncSocketPreBuffer; -@protocol GCDAsyncSocketDelegate; - -NS_ASSUME_NONNULL_BEGIN - -extern NSString *const GCDAsyncSocketException; -extern NSString *const GCDAsyncSocketErrorDomain; - -extern NSString *const GCDAsyncSocketQueueName; -extern NSString *const GCDAsyncSocketThreadName; - -extern NSString *const GCDAsyncSocketManuallyEvaluateTrust; -#if TARGET_OS_IPHONE -extern NSString *const GCDAsyncSocketUseCFStreamForTLS; -#endif -#define GCDAsyncSocketSSLPeerName (NSString *)kCFStreamSSLPeerName -#define GCDAsyncSocketSSLCertificates (NSString *)kCFStreamSSLCertificates -#define GCDAsyncSocketSSLIsServer (NSString *)kCFStreamSSLIsServer -extern NSString *const GCDAsyncSocketSSLPeerID; -extern NSString *const GCDAsyncSocketSSLProtocolVersionMin; -extern NSString *const GCDAsyncSocketSSLProtocolVersionMax; -extern NSString *const GCDAsyncSocketSSLSessionOptionFalseStart; -extern NSString *const GCDAsyncSocketSSLSessionOptionSendOneByteRecord; -extern NSString *const GCDAsyncSocketSSLCipherSuites; -extern NSString *const GCDAsyncSocketSSLALPN; -#if !TARGET_OS_IPHONE -extern NSString *const GCDAsyncSocketSSLDiffieHellmanParameters; -#endif - -#define GCDAsyncSocketLoggingContext 65535 - - -typedef NS_ERROR_ENUM(GCDAsyncSocketErrorDomain, GCDAsyncSocketError) { - GCDAsyncSocketNoError = 0, // Never used - GCDAsyncSocketBadConfigError, // Invalid configuration - GCDAsyncSocketBadParamError, // Invalid parameter was passed - GCDAsyncSocketConnectTimeoutError, // A connect operation timed out - GCDAsyncSocketReadTimeoutError, // A read operation timed out - GCDAsyncSocketWriteTimeoutError, // A write operation timed out - GCDAsyncSocketReadMaxedOutError, // Reached set maxLength without completing - GCDAsyncSocketClosedError, // The remote peer closed the connection - GCDAsyncSocketOtherError, // Description provided in userInfo -}; - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -#pragma mark - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - - -@interface GCDAsyncSocket : NSObject - -/** - * GCDAsyncSocket uses the standard delegate paradigm, - * but executes all delegate callbacks on a given delegate dispatch queue. - * This allows for maximum concurrency, while at the same time providing easy thread safety. - * - * You MUST set a delegate AND delegate dispatch queue before attempting to - * use the socket, or you will get an error. - * - * The socket queue is optional. - * If you pass NULL, GCDAsyncSocket will automatically create it's own socket queue. - * If you choose to provide a socket queue, the socket queue must not be a concurrent queue. - * If you choose to provide a socket queue, and the socket queue has a configured target queue, - * then please see the discussion for the method markSocketQueueTargetQueue. - * - * The delegate queue and socket queue can optionally be the same. -**/ -- (instancetype)init; -- (instancetype)initWithSocketQueue:(nullable dispatch_queue_t)sq; -- (instancetype)initWithDelegate:(nullable id)aDelegate delegateQueue:(nullable dispatch_queue_t)dq; -- (instancetype)initWithDelegate:(nullable id)aDelegate delegateQueue:(nullable dispatch_queue_t)dq socketQueue:(nullable dispatch_queue_t)sq NS_DESIGNATED_INITIALIZER; - -/** - * Create GCDAsyncSocket from already connect BSD socket file descriptor -**/ -+ (nullable instancetype)socketFromConnectedSocketFD:(int)socketFD socketQueue:(nullable dispatch_queue_t)sq error:(NSError**)error; - -+ (nullable instancetype)socketFromConnectedSocketFD:(int)socketFD delegate:(nullable id)aDelegate delegateQueue:(nullable dispatch_queue_t)dq error:(NSError**)error; - -+ (nullable instancetype)socketFromConnectedSocketFD:(int)socketFD delegate:(nullable id)aDelegate delegateQueue:(nullable dispatch_queue_t)dq socketQueue:(nullable dispatch_queue_t)sq error:(NSError **)error; - -#pragma mark Configuration - -@property (atomic, weak, readwrite, nullable) id delegate; -#if OS_OBJECT_USE_OBJC -@property (atomic, strong, readwrite, nullable) dispatch_queue_t delegateQueue; -#else -@property (atomic, assign, readwrite, nullable) dispatch_queue_t delegateQueue; -#endif - -- (void)getDelegate:(id __nullable * __nullable)delegatePtr delegateQueue:(dispatch_queue_t __nullable * __nullable)delegateQueuePtr; -- (void)setDelegate:(nullable id)delegate delegateQueue:(nullable dispatch_queue_t)delegateQueue; - -/** - * If you are setting the delegate to nil within the delegate's dealloc method, - * you may need to use the synchronous versions below. -**/ -- (void)synchronouslySetDelegate:(nullable id)delegate; -- (void)synchronouslySetDelegateQueue:(nullable dispatch_queue_t)delegateQueue; -- (void)synchronouslySetDelegate:(nullable id)delegate delegateQueue:(nullable dispatch_queue_t)delegateQueue; - -/** - * By default, both IPv4 and IPv6 are enabled. - * - * For accepting incoming connections, this means GCDAsyncSocket automatically supports both protocols, - * and can simulataneously accept incoming connections on either protocol. - * - * For outgoing connections, this means GCDAsyncSocket can connect to remote hosts running either protocol. - * If a DNS lookup returns only IPv4 results, GCDAsyncSocket will automatically use IPv4. - * If a DNS lookup returns only IPv6 results, GCDAsyncSocket will automatically use IPv6. - * If a DNS lookup returns both IPv4 and IPv6 results, the preferred protocol will be chosen. - * By default, the preferred protocol is IPv4, but may be configured as desired. -**/ - -@property (atomic, assign, readwrite, getter=isIPv4Enabled) BOOL IPv4Enabled; -@property (atomic, assign, readwrite, getter=isIPv6Enabled) BOOL IPv6Enabled; - -@property (atomic, assign, readwrite, getter=isIPv4PreferredOverIPv6) BOOL IPv4PreferredOverIPv6; - -/** - * When connecting to both IPv4 and IPv6 using Happy Eyeballs (RFC 6555) https://tools.ietf.org/html/rfc6555 - * this is the delay between connecting to the preferred protocol and the fallback protocol. - * - * Defaults to 300ms. -**/ -@property (atomic, assign, readwrite) NSTimeInterval alternateAddressDelay; - -/** - * User data allows you to associate arbitrary information with the socket. - * This data is not used internally by socket in any way. -**/ -@property (atomic, strong, readwrite, nullable) id userData; - -#pragma mark Accepting - -/** - * Tells the socket to begin listening and accepting connections on the given port. - * When a connection is accepted, a new instance of GCDAsyncSocket will be spawned to handle it, - * and the socket:didAcceptNewSocket: delegate method will be invoked. - * - * The socket will listen on all available interfaces (e.g. wifi, ethernet, etc) -**/ -- (BOOL)acceptOnPort:(uint16_t)port error:(NSError **)errPtr; - -/** - * This method is the same as acceptOnPort:error: with the - * additional option of specifying which interface to listen on. - * - * For example, you could specify that the socket should only accept connections over ethernet, - * and not other interfaces such as wifi. - * - * The interface may be specified by name (e.g. "en1" or "lo0") or by IP address (e.g. "192.168.4.34"). - * You may also use the special strings "localhost" or "loopback" to specify that - * the socket only accept connections from the local machine. - * - * You can see the list of interfaces via the command line utility "ifconfig", - * or programmatically via the getifaddrs() function. - * - * To accept connections on any interface pass nil, or simply use the acceptOnPort:error: method. -**/ -- (BOOL)acceptOnInterface:(nullable NSString *)interface port:(uint16_t)port error:(NSError **)errPtr; - -/** - * Tells the socket to begin listening and accepting connections on the unix domain at the given url. - * When a connection is accepted, a new instance of GCDAsyncSocket will be spawned to handle it, - * and the socket:didAcceptNewSocket: delegate method will be invoked. - * - * The socket will listen on all available interfaces (e.g. wifi, ethernet, etc) - **/ -- (BOOL)acceptOnUrl:(NSURL *)url error:(NSError **)errPtr; - -#pragma mark Connecting - -/** - * Connects to the given host and port. - * - * This method invokes connectToHost:onPort:viaInterface:withTimeout:error: - * and uses the default interface, and no timeout. -**/ -- (BOOL)connectToHost:(NSString *)host onPort:(uint16_t)port error:(NSError **)errPtr; - -/** - * Connects to the given host and port with an optional timeout. - * - * This method invokes connectToHost:onPort:viaInterface:withTimeout:error: and uses the default interface. -**/ -- (BOOL)connectToHost:(NSString *)host - onPort:(uint16_t)port - withTimeout:(NSTimeInterval)timeout - error:(NSError **)errPtr; - -/** - * Connects to the given host & port, via the optional interface, with an optional timeout. - * - * The host may be a domain name (e.g. "deusty.com") or an IP address string (e.g. "192.168.0.2"). - * The host may also be the special strings "localhost" or "loopback" to specify connecting - * to a service on the local machine. - * - * The interface may be a name (e.g. "en1" or "lo0") or the corresponding IP address (e.g. "192.168.4.35"). - * The interface may also be used to specify the local port (see below). - * - * To not time out use a negative time interval. - * - * This method will return NO if an error is detected, and set the error pointer (if one was given). - * Possible errors would be a nil host, invalid interface, or socket is already connected. - * - * If no errors are detected, this method will start a background connect operation and immediately return YES. - * The delegate callbacks are used to notify you when the socket connects, or if the host was unreachable. - * - * Since this class supports queued reads and writes, you can immediately start reading and/or writing. - * All read/write operations will be queued, and upon socket connection, - * the operations will be dequeued and processed in order. - * - * The interface may optionally contain a port number at the end of the string, separated by a colon. - * This allows you to specify the local port that should be used for the outgoing connection. (read paragraph to end) - * To specify both interface and local port: "en1:8082" or "192.168.4.35:2424". - * To specify only local port: ":8082". - * Please note this is an advanced feature, and is somewhat hidden on purpose. - * You should understand that 99.999% of the time you should NOT specify the local port for an outgoing connection. - * If you think you need to, there is a very good chance you have a fundamental misunderstanding somewhere. - * Local ports do NOT need to match remote ports. In fact, they almost never do. - * This feature is here for networking professionals using very advanced techniques. -**/ -- (BOOL)connectToHost:(NSString *)host - onPort:(uint16_t)port - viaInterface:(nullable NSString *)interface - withTimeout:(NSTimeInterval)timeout - error:(NSError **)errPtr; - -/** - * Connects to the given address, specified as a sockaddr structure wrapped in a NSData object. - * For example, a NSData object returned from NSNetService's addresses method. - * - * If you have an existing struct sockaddr you can convert it to a NSData object like so: - * struct sockaddr sa -> NSData *dsa = [NSData dataWithBytes:&remoteAddr length:remoteAddr.sa_len]; - * struct sockaddr *sa -> NSData *dsa = [NSData dataWithBytes:remoteAddr length:remoteAddr->sa_len]; - * - * This method invokes connectToAddress:remoteAddr viaInterface:nil withTimeout:-1 error:errPtr. -**/ -- (BOOL)connectToAddress:(NSData *)remoteAddr error:(NSError **)errPtr; - -/** - * This method is the same as connectToAddress:error: with an additional timeout option. - * To not time out use a negative time interval, or simply use the connectToAddress:error: method. -**/ -- (BOOL)connectToAddress:(NSData *)remoteAddr withTimeout:(NSTimeInterval)timeout error:(NSError **)errPtr; - -/** - * Connects to the given address, using the specified interface and timeout. - * - * The address is specified as a sockaddr structure wrapped in a NSData object. - * For example, a NSData object returned from NSNetService's addresses method. - * - * If you have an existing struct sockaddr you can convert it to a NSData object like so: - * struct sockaddr sa -> NSData *dsa = [NSData dataWithBytes:&remoteAddr length:remoteAddr.sa_len]; - * struct sockaddr *sa -> NSData *dsa = [NSData dataWithBytes:remoteAddr length:remoteAddr->sa_len]; - * - * The interface may be a name (e.g. "en1" or "lo0") or the corresponding IP address (e.g. "192.168.4.35"). - * The interface may also be used to specify the local port (see below). - * - * The timeout is optional. To not time out use a negative time interval. - * - * This method will return NO if an error is detected, and set the error pointer (if one was given). - * Possible errors would be a nil host, invalid interface, or socket is already connected. - * - * If no errors are detected, this method will start a background connect operation and immediately return YES. - * The delegate callbacks are used to notify you when the socket connects, or if the host was unreachable. - * - * Since this class supports queued reads and writes, you can immediately start reading and/or writing. - * All read/write operations will be queued, and upon socket connection, - * the operations will be dequeued and processed in order. - * - * The interface may optionally contain a port number at the end of the string, separated by a colon. - * This allows you to specify the local port that should be used for the outgoing connection. (read paragraph to end) - * To specify both interface and local port: "en1:8082" or "192.168.4.35:2424". - * To specify only local port: ":8082". - * Please note this is an advanced feature, and is somewhat hidden on purpose. - * You should understand that 99.999% of the time you should NOT specify the local port for an outgoing connection. - * If you think you need to, there is a very good chance you have a fundamental misunderstanding somewhere. - * Local ports do NOT need to match remote ports. In fact, they almost never do. - * This feature is here for networking professionals using very advanced techniques. -**/ -- (BOOL)connectToAddress:(NSData *)remoteAddr - viaInterface:(nullable NSString *)interface - withTimeout:(NSTimeInterval)timeout - error:(NSError **)errPtr; -/** - * Connects to the unix domain socket at the given url, using the specified timeout. - */ -- (BOOL)connectToUrl:(NSURL *)url withTimeout:(NSTimeInterval)timeout error:(NSError **)errPtr; - -/** - * Iterates over the given NetService's addresses in order, and invokes connectToAddress:error:. Stops at the - * first invocation that succeeds and returns YES; otherwise returns NO. - */ -- (BOOL)connectToNetService:(NSNetService *)netService error:(NSError **)errPtr; - -#pragma mark Disconnecting - -/** - * Disconnects immediately (synchronously). Any pending reads or writes are dropped. - * - * If the socket is not already disconnected, an invocation to the socketDidDisconnect:withError: delegate method - * will be queued onto the delegateQueue asynchronously (behind any previously queued delegate methods). - * In other words, the disconnected delegate method will be invoked sometime shortly after this method returns. - * - * Please note the recommended way of releasing a GCDAsyncSocket instance (e.g. in a dealloc method) - * [asyncSocket setDelegate:nil]; - * [asyncSocket disconnect]; - * [asyncSocket release]; - * - * If you plan on disconnecting the socket, and then immediately asking it to connect again, - * you'll likely want to do so like this: - * [asyncSocket setDelegate:nil]; - * [asyncSocket disconnect]; - * [asyncSocket setDelegate:self]; - * [asyncSocket connect...]; -**/ -- (void)disconnect; - -/** - * Disconnects after all pending reads have completed. - * After calling this, the read and write methods will do nothing. - * The socket will disconnect even if there are still pending writes. -**/ -- (void)disconnectAfterReading; - -/** - * Disconnects after all pending writes have completed. - * After calling this, the read and write methods will do nothing. - * The socket will disconnect even if there are still pending reads. -**/ -- (void)disconnectAfterWriting; - -/** - * Disconnects after all pending reads and writes have completed. - * After calling this, the read and write methods will do nothing. -**/ -- (void)disconnectAfterReadingAndWriting; - -#pragma mark Diagnostics - -/** - * Returns whether the socket is disconnected or connected. - * - * A disconnected socket may be recycled. - * That is, it can be used again for connecting or listening. - * - * If a socket is in the process of connecting, it may be neither disconnected nor connected. -**/ -@property (atomic, readonly) BOOL isDisconnected; -@property (atomic, readonly) BOOL isConnected; - -/** - * Returns the local or remote host and port to which this socket is connected, or nil and 0 if not connected. - * The host will be an IP address. -**/ -@property (atomic, readonly, nullable) NSString *connectedHost; -@property (atomic, readonly) uint16_t connectedPort; -@property (atomic, readonly, nullable) NSURL *connectedUrl; - -@property (atomic, readonly, nullable) NSString *localHost; -@property (atomic, readonly) uint16_t localPort; - -/** - * Returns the local or remote address to which this socket is connected, - * specified as a sockaddr structure wrapped in a NSData object. - * - * @seealso connectedHost - * @seealso connectedPort - * @seealso localHost - * @seealso localPort -**/ -@property (atomic, readonly, nullable) NSData *connectedAddress; -@property (atomic, readonly, nullable) NSData *localAddress; - -/** - * Returns whether the socket is IPv4 or IPv6. - * An accepting socket may be both. -**/ -@property (atomic, readonly) BOOL isIPv4; -@property (atomic, readonly) BOOL isIPv6; - -/** - * Returns whether or not the socket has been secured via SSL/TLS. - * - * See also the startTLS method. -**/ -@property (atomic, readonly) BOOL isSecure; - -#pragma mark Reading - -// The readData and writeData methods won't block (they are asynchronous). -// -// When a read is complete the socket:didReadData:withTag: delegate method is dispatched on the delegateQueue. -// When a write is complete the socket:didWriteDataWithTag: delegate method is dispatched on the delegateQueue. -// -// You may optionally set a timeout for any read/write operation. (To not timeout, use a negative time interval.) -// If a read/write opertion times out, the corresponding "socket:shouldTimeout..." delegate method -// is called to optionally allow you to extend the timeout. -// Upon a timeout, the "socket:didDisconnectWithError:" method is called -// -// The tag is for your convenience. -// You can use it as an array index, step number, state id, pointer, etc. - -/** - * Reads the first available bytes that become available on the socket. - * - * If the timeout value is negative, the read operation will not use a timeout. -**/ -- (void)readDataWithTimeout:(NSTimeInterval)timeout tag:(long)tag; - -/** - * Reads the first available bytes that become available on the socket. - * The bytes will be appended to the given byte buffer starting at the given offset. - * The given buffer will automatically be increased in size if needed. - * - * If the timeout value is negative, the read operation will not use a timeout. - * If the buffer is nil, the socket will create a buffer for you. - * - * If the bufferOffset is greater than the length of the given buffer, - * the method will do nothing, and the delegate will not be called. - * - * If you pass a buffer, you must not alter it in any way while the socket is using it. - * After completion, the data returned in socket:didReadData:withTag: will be a subset of the given buffer. - * That is, it will reference the bytes that were appended to the given buffer via - * the method [NSData dataWithBytesNoCopy:length:freeWhenDone:NO]. -**/ -- (void)readDataWithTimeout:(NSTimeInterval)timeout - buffer:(nullable NSMutableData *)buffer - bufferOffset:(NSUInteger)offset - tag:(long)tag; - -/** - * Reads the first available bytes that become available on the socket. - * The bytes will be appended to the given byte buffer starting at the given offset. - * The given buffer will automatically be increased in size if needed. - * A maximum of length bytes will be read. - * - * If the timeout value is negative, the read operation will not use a timeout. - * If the buffer is nil, a buffer will automatically be created for you. - * If maxLength is zero, no length restriction is enforced. - * - * If the bufferOffset is greater than the length of the given buffer, - * the method will do nothing, and the delegate will not be called. - * - * If you pass a buffer, you must not alter it in any way while the socket is using it. - * After completion, the data returned in socket:didReadData:withTag: will be a subset of the given buffer. - * That is, it will reference the bytes that were appended to the given buffer via - * the method [NSData dataWithBytesNoCopy:length:freeWhenDone:NO]. -**/ -- (void)readDataWithTimeout:(NSTimeInterval)timeout - buffer:(nullable NSMutableData *)buffer - bufferOffset:(NSUInteger)offset - maxLength:(NSUInteger)length - tag:(long)tag; - -/** - * Reads the given number of bytes. - * - * If the timeout value is negative, the read operation will not use a timeout. - * - * If the length is 0, this method does nothing and the delegate is not called. -**/ -- (void)readDataToLength:(NSUInteger)length withTimeout:(NSTimeInterval)timeout tag:(long)tag; - -/** - * Reads the given number of bytes. - * The bytes will be appended to the given byte buffer starting at the given offset. - * The given buffer will automatically be increased in size if needed. - * - * If the timeout value is negative, the read operation will not use a timeout. - * If the buffer is nil, a buffer will automatically be created for you. - * - * If the length is 0, this method does nothing and the delegate is not called. - * If the bufferOffset is greater than the length of the given buffer, - * the method will do nothing, and the delegate will not be called. - * - * If you pass a buffer, you must not alter it in any way while AsyncSocket is using it. - * After completion, the data returned in socket:didReadData:withTag: will be a subset of the given buffer. - * That is, it will reference the bytes that were appended to the given buffer via - * the method [NSData dataWithBytesNoCopy:length:freeWhenDone:NO]. -**/ -- (void)readDataToLength:(NSUInteger)length - withTimeout:(NSTimeInterval)timeout - buffer:(nullable NSMutableData *)buffer - bufferOffset:(NSUInteger)offset - tag:(long)tag; - -/** - * Reads bytes until (and including) the passed "data" parameter, which acts as a separator. - * - * If the timeout value is negative, the read operation will not use a timeout. - * - * If you pass nil or zero-length data as the "data" parameter, - * the method will do nothing (except maybe print a warning), and the delegate will not be called. - * - * To read a line from the socket, use the line separator (e.g. CRLF for HTTP, see below) as the "data" parameter. - * If you're developing your own custom protocol, be sure your separator can not occur naturally as - * part of the data between separators. - * For example, imagine you want to send several small documents over a socket. - * Using CRLF as a separator is likely unwise, as a CRLF could easily exist within the documents. - * In this particular example, it would be better to use a protocol similar to HTTP with - * a header that includes the length of the document. - * Also be careful that your separator cannot occur naturally as part of the encoding for a character. - * - * The given data (separator) parameter should be immutable. - * For performance reasons, the socket will retain it, not copy it. - * So if it is immutable, don't modify it while the socket is using it. -**/ -- (void)readDataToData:(nullable NSData *)data withTimeout:(NSTimeInterval)timeout tag:(long)tag; - -/** - * Reads bytes until (and including) the passed "data" parameter, which acts as a separator. - * The bytes will be appended to the given byte buffer starting at the given offset. - * The given buffer will automatically be increased in size if needed. - * - * If the timeout value is negative, the read operation will not use a timeout. - * If the buffer is nil, a buffer will automatically be created for you. - * - * If the bufferOffset is greater than the length of the given buffer, - * the method will do nothing (except maybe print a warning), and the delegate will not be called. - * - * If you pass a buffer, you must not alter it in any way while the socket is using it. - * After completion, the data returned in socket:didReadData:withTag: will be a subset of the given buffer. - * That is, it will reference the bytes that were appended to the given buffer via - * the method [NSData dataWithBytesNoCopy:length:freeWhenDone:NO]. - * - * To read a line from the socket, use the line separator (e.g. CRLF for HTTP, see below) as the "data" parameter. - * If you're developing your own custom protocol, be sure your separator can not occur naturally as - * part of the data between separators. - * For example, imagine you want to send several small documents over a socket. - * Using CRLF as a separator is likely unwise, as a CRLF could easily exist within the documents. - * In this particular example, it would be better to use a protocol similar to HTTP with - * a header that includes the length of the document. - * Also be careful that your separator cannot occur naturally as part of the encoding for a character. - * - * The given data (separator) parameter should be immutable. - * For performance reasons, the socket will retain it, not copy it. - * So if it is immutable, don't modify it while the socket is using it. -**/ -- (void)readDataToData:(NSData *)data - withTimeout:(NSTimeInterval)timeout - buffer:(nullable NSMutableData *)buffer - bufferOffset:(NSUInteger)offset - tag:(long)tag; - -/** - * Reads bytes until (and including) the passed "data" parameter, which acts as a separator. - * - * If the timeout value is negative, the read operation will not use a timeout. - * - * If maxLength is zero, no length restriction is enforced. - * Otherwise if maxLength bytes are read without completing the read, - * it is treated similarly to a timeout - the socket is closed with a GCDAsyncSocketReadMaxedOutError. - * The read will complete successfully if exactly maxLength bytes are read and the given data is found at the end. - * - * If you pass nil or zero-length data as the "data" parameter, - * the method will do nothing (except maybe print a warning), and the delegate will not be called. - * If you pass a maxLength parameter that is less than the length of the data parameter, - * the method will do nothing (except maybe print a warning), and the delegate will not be called. - * - * To read a line from the socket, use the line separator (e.g. CRLF for HTTP, see below) as the "data" parameter. - * If you're developing your own custom protocol, be sure your separator can not occur naturally as - * part of the data between separators. - * For example, imagine you want to send several small documents over a socket. - * Using CRLF as a separator is likely unwise, as a CRLF could easily exist within the documents. - * In this particular example, it would be better to use a protocol similar to HTTP with - * a header that includes the length of the document. - * Also be careful that your separator cannot occur naturally as part of the encoding for a character. - * - * The given data (separator) parameter should be immutable. - * For performance reasons, the socket will retain it, not copy it. - * So if it is immutable, don't modify it while the socket is using it. -**/ -- (void)readDataToData:(NSData *)data withTimeout:(NSTimeInterval)timeout maxLength:(NSUInteger)length tag:(long)tag; - -/** - * Reads bytes until (and including) the passed "data" parameter, which acts as a separator. - * The bytes will be appended to the given byte buffer starting at the given offset. - * The given buffer will automatically be increased in size if needed. - * - * If the timeout value is negative, the read operation will not use a timeout. - * If the buffer is nil, a buffer will automatically be created for you. - * - * If maxLength is zero, no length restriction is enforced. - * Otherwise if maxLength bytes are read without completing the read, - * it is treated similarly to a timeout - the socket is closed with a GCDAsyncSocketReadMaxedOutError. - * The read will complete successfully if exactly maxLength bytes are read and the given data is found at the end. - * - * If you pass a maxLength parameter that is less than the length of the data (separator) parameter, - * the method will do nothing (except maybe print a warning), and the delegate will not be called. - * If the bufferOffset is greater than the length of the given buffer, - * the method will do nothing (except maybe print a warning), and the delegate will not be called. - * - * If you pass a buffer, you must not alter it in any way while the socket is using it. - * After completion, the data returned in socket:didReadData:withTag: will be a subset of the given buffer. - * That is, it will reference the bytes that were appended to the given buffer via - * the method [NSData dataWithBytesNoCopy:length:freeWhenDone:NO]. - * - * To read a line from the socket, use the line separator (e.g. CRLF for HTTP, see below) as the "data" parameter. - * If you're developing your own custom protocol, be sure your separator can not occur naturally as - * part of the data between separators. - * For example, imagine you want to send several small documents over a socket. - * Using CRLF as a separator is likely unwise, as a CRLF could easily exist within the documents. - * In this particular example, it would be better to use a protocol similar to HTTP with - * a header that includes the length of the document. - * Also be careful that your separator cannot occur naturally as part of the encoding for a character. - * - * The given data (separator) parameter should be immutable. - * For performance reasons, the socket will retain it, not copy it. - * So if it is immutable, don't modify it while the socket is using it. -**/ -- (void)readDataToData:(NSData *)data - withTimeout:(NSTimeInterval)timeout - buffer:(nullable NSMutableData *)buffer - bufferOffset:(NSUInteger)offset - maxLength:(NSUInteger)length - tag:(long)tag; - -/** - * Returns progress of the current read, from 0.0 to 1.0, or NaN if no current read (use isnan() to check). - * The parameters "tag", "done" and "total" will be filled in if they aren't NULL. -**/ -- (float)progressOfReadReturningTag:(nullable long *)tagPtr bytesDone:(nullable NSUInteger *)donePtr total:(nullable NSUInteger *)totalPtr; - -#pragma mark Writing - -/** - * Writes data to the socket, and calls the delegate when finished. - * - * If you pass in nil or zero-length data, this method does nothing and the delegate will not be called. - * If the timeout value is negative, the write operation will not use a timeout. - * - * Thread-Safety Note: - * If the given data parameter is mutable (NSMutableData) then you MUST NOT alter the data while - * the socket is writing it. In other words, it's not safe to alter the data until after the delegate method - * socket:didWriteDataWithTag: is invoked signifying that this particular write operation has completed. - * This is due to the fact that GCDAsyncSocket does NOT copy the data. It simply retains it. - * This is for performance reasons. Often times, if NSMutableData is passed, it is because - * a request/response was built up in memory. Copying this data adds an unwanted/unneeded overhead. - * If you need to write data from an immutable buffer, and you need to alter the buffer before the socket - * completes writing the bytes (which is NOT immediately after this method returns, but rather at a later time - * when the delegate method notifies you), then you should first copy the bytes, and pass the copy to this method. -**/ -- (void)writeData:(nullable NSData *)data withTimeout:(NSTimeInterval)timeout tag:(long)tag; - -/** - * Returns progress of the current write, from 0.0 to 1.0, or NaN if no current write (use isnan() to check). - * The parameters "tag", "done" and "total" will be filled in if they aren't NULL. -**/ -- (float)progressOfWriteReturningTag:(nullable long *)tagPtr bytesDone:(nullable NSUInteger *)donePtr total:(nullable NSUInteger *)totalPtr; - -#pragma mark Security - -/** - * Secures the connection using SSL/TLS. - * - * This method may be called at any time, and the TLS handshake will occur after all pending reads and writes - * are finished. This allows one the option of sending a protocol dependent StartTLS message, and queuing - * the upgrade to TLS at the same time, without having to wait for the write to finish. - * Any reads or writes scheduled after this method is called will occur over the secured connection. - * - * ==== The available TOP-LEVEL KEYS are: - * - * - GCDAsyncSocketManuallyEvaluateTrust - * The value must be of type NSNumber, encapsulating a BOOL value. - * If you set this to YES, then the underlying SecureTransport system will not evaluate the SecTrustRef of the peer. - * Instead it will pause at the moment evaulation would typically occur, - * and allow us to handle the security evaluation however we see fit. - * So GCDAsyncSocket will invoke the delegate method socket:shouldTrustPeer: passing the SecTrustRef. - * - * Note that if you set this option, then all other configuration keys are ignored. - * Evaluation will be completely up to you during the socket:didReceiveTrust:completionHandler: delegate method. - * - * For more information on trust evaluation see: - * Apple's Technical Note TN2232 - HTTPS Server Trust Evaluation - * https://developer.apple.com/library/ios/technotes/tn2232/_index.html - * - * If unspecified, the default value is NO. - * - * - GCDAsyncSocketUseCFStreamForTLS (iOS only) - * The value must be of type NSNumber, encapsulating a BOOL value. - * By default GCDAsyncSocket will use the SecureTransport layer to perform encryption. - * This gives us more control over the security protocol (many more configuration options), - * plus it allows us to optimize things like sys calls and buffer allocation. - * - * However, if you absolutely must, you can instruct GCDAsyncSocket to use the old-fashioned encryption - * technique by going through the CFStream instead. So instead of using SecureTransport, GCDAsyncSocket - * will instead setup a CFRead/CFWriteStream. And then set the kCFStreamPropertySSLSettings property - * (via CFReadStreamSetProperty / CFWriteStreamSetProperty) and will pass the given options to this method. - * - * Thus all the other keys in the given dictionary will be ignored by GCDAsyncSocket, - * and will passed directly CFReadStreamSetProperty / CFWriteStreamSetProperty. - * For more infomation on these keys, please see the documentation for kCFStreamPropertySSLSettings. - * - * If unspecified, the default value is NO. - * - * ==== The available CONFIGURATION KEYS are: - * - * - kCFStreamSSLPeerName - * The value must be of type NSString. - * It should match the name in the X.509 certificate given by the remote party. - * See Apple's documentation for SSLSetPeerDomainName. - * - * - kCFStreamSSLCertificates - * The value must be of type NSArray. - * See Apple's documentation for SSLSetCertificate. - * - * - kCFStreamSSLIsServer - * The value must be of type NSNumber, encapsulationg a BOOL value. - * See Apple's documentation for SSLCreateContext for iOS. - * This is optional for iOS. If not supplied, a NO value is the default. - * This is not needed for Mac OS X, and the value is ignored. - * - * - GCDAsyncSocketSSLPeerID - * The value must be of type NSData. - * You must set this value if you want to use TLS session resumption. - * See Apple's documentation for SSLSetPeerID. - * - * - GCDAsyncSocketSSLProtocolVersionMin - * - GCDAsyncSocketSSLProtocolVersionMax - * The value(s) must be of type NSNumber, encapsulting a SSLProtocol value. - * See Apple's documentation for SSLSetProtocolVersionMin & SSLSetProtocolVersionMax. - * See also the SSLProtocol typedef. - * - * - GCDAsyncSocketSSLSessionOptionFalseStart - * The value must be of type NSNumber, encapsulating a BOOL value. - * See Apple's documentation for kSSLSessionOptionFalseStart. - * - * - GCDAsyncSocketSSLSessionOptionSendOneByteRecord - * The value must be of type NSNumber, encapsulating a BOOL value. - * See Apple's documentation for kSSLSessionOptionSendOneByteRecord. - * - * - GCDAsyncSocketSSLCipherSuites - * The values must be of type NSArray. - * Each item within the array must be a NSNumber, encapsulating an SSLCipherSuite. - * See Apple's documentation for SSLSetEnabledCiphers. - * See also the SSLCipherSuite typedef. - * - * - GCDAsyncSocketSSLDiffieHellmanParameters (Mac OS X only) - * The value must be of type NSData. - * See Apple's documentation for SSLSetDiffieHellmanParams. - * - * ==== The following UNAVAILABLE KEYS are: (with throw an exception) - * - * - kCFStreamSSLAllowsAnyRoot (UNAVAILABLE) - * You MUST use manual trust evaluation instead (see GCDAsyncSocketManuallyEvaluateTrust). - * Corresponding deprecated method: SSLSetAllowsAnyRoot - * - * - kCFStreamSSLAllowsExpiredRoots (UNAVAILABLE) - * You MUST use manual trust evaluation instead (see GCDAsyncSocketManuallyEvaluateTrust). - * Corresponding deprecated method: SSLSetAllowsExpiredRoots - * - * - kCFStreamSSLAllowsExpiredCertificates (UNAVAILABLE) - * You MUST use manual trust evaluation instead (see GCDAsyncSocketManuallyEvaluateTrust). - * Corresponding deprecated method: SSLSetAllowsExpiredCerts - * - * - kCFStreamSSLValidatesCertificateChain (UNAVAILABLE) - * You MUST use manual trust evaluation instead (see GCDAsyncSocketManuallyEvaluateTrust). - * Corresponding deprecated method: SSLSetEnableCertVerify - * - * - kCFStreamSSLLevel (UNAVAILABLE) - * You MUST use GCDAsyncSocketSSLProtocolVersionMin & GCDAsyncSocketSSLProtocolVersionMin instead. - * Corresponding deprecated method: SSLSetProtocolVersionEnabled - * - * - * Please refer to Apple's documentation for corresponding SSLFunctions. - * - * If you pass in nil or an empty dictionary, the default settings will be used. - * - * IMPORTANT SECURITY NOTE: - * The default settings will check to make sure the remote party's certificate is signed by a - * trusted 3rd party certificate agency (e.g. verisign) and that the certificate is not expired. - * However it will not verify the name on the certificate unless you - * give it a name to verify against via the kCFStreamSSLPeerName key. - * The security implications of this are important to understand. - * Imagine you are attempting to create a secure connection to MySecureServer.com, - * but your socket gets directed to MaliciousServer.com because of a hacked DNS server. - * If you simply use the default settings, and MaliciousServer.com has a valid certificate, - * the default settings will not detect any problems since the certificate is valid. - * To properly secure your connection in this particular scenario you - * should set the kCFStreamSSLPeerName property to "MySecureServer.com". - * - * You can also perform additional validation in socketDidSecure. -**/ -- (void)startTLS:(nullable NSDictionary *)tlsSettings; - -#pragma mark Advanced - -/** - * Traditionally sockets are not closed until the conversation is over. - * However, it is technically possible for the remote enpoint to close its write stream. - * Our socket would then be notified that there is no more data to be read, - * but our socket would still be writeable and the remote endpoint could continue to receive our data. - * - * The argument for this confusing functionality stems from the idea that a client could shut down its - * write stream after sending a request to the server, thus notifying the server there are to be no further requests. - * In practice, however, this technique did little to help server developers. - * - * To make matters worse, from a TCP perspective there is no way to tell the difference from a read stream close - * and a full socket close. They both result in the TCP stack receiving a FIN packet. The only way to tell - * is by continuing to write to the socket. If it was only a read stream close, then writes will continue to work. - * Otherwise an error will be occur shortly (when the remote end sends us a RST packet). - * - * In addition to the technical challenges and confusion, many high level socket/stream API's provide - * no support for dealing with the problem. If the read stream is closed, the API immediately declares the - * socket to be closed, and shuts down the write stream as well. In fact, this is what Apple's CFStream API does. - * It might sound like poor design at first, but in fact it simplifies development. - * - * The vast majority of the time if the read stream is closed it's because the remote endpoint closed its socket. - * Thus it actually makes sense to close the socket at this point. - * And in fact this is what most networking developers want and expect to happen. - * However, if you are writing a server that interacts with a plethora of clients, - * you might encounter a client that uses the discouraged technique of shutting down its write stream. - * If this is the case, you can set this property to NO, - * and make use of the socketDidCloseReadStream delegate method. - * - * The default value is YES. -**/ -@property (atomic, assign, readwrite) BOOL autoDisconnectOnClosedReadStream; - -/** - * GCDAsyncSocket maintains thread safety by using an internal serial dispatch_queue. - * In most cases, the instance creates this queue itself. - * However, to allow for maximum flexibility, the internal queue may be passed in the init method. - * This allows for some advanced options such as controlling socket priority via target queues. - * However, when one begins to use target queues like this, they open the door to some specific deadlock issues. - * - * For example, imagine there are 2 queues: - * dispatch_queue_t socketQueue; - * dispatch_queue_t socketTargetQueue; - * - * If you do this (pseudo-code): - * socketQueue.targetQueue = socketTargetQueue; - * - * Then all socketQueue operations will actually get run on the given socketTargetQueue. - * This is fine and works great in most situations. - * But if you run code directly from within the socketTargetQueue that accesses the socket, - * you could potentially get deadlock. Imagine the following code: - * - * - (BOOL)socketHasSomething - * { - * __block BOOL result = NO; - * dispatch_block_t block = ^{ - * result = [self someInternalMethodToBeRunOnlyOnSocketQueue]; - * } - * if (is_executing_on_queue(socketQueue)) - * block(); - * else - * dispatch_sync(socketQueue, block); - * - * return result; - * } - * - * What happens if you call this method from the socketTargetQueue? The result is deadlock. - * This is because the GCD API offers no mechanism to discover a queue's targetQueue. - * Thus we have no idea if our socketQueue is configured with a targetQueue. - * If we had this information, we could easily avoid deadlock. - * But, since these API's are missing or unfeasible, you'll have to explicitly set it. - * - * IF you pass a socketQueue via the init method, - * AND you've configured the passed socketQueue with a targetQueue, - * THEN you should pass the end queue in the target hierarchy. - * - * For example, consider the following queue hierarchy: - * socketQueue -> ipQueue -> moduleQueue - * - * This example demonstrates priority shaping within some server. - * All incoming client connections from the same IP address are executed on the same target queue. - * And all connections for a particular module are executed on the same target queue. - * Thus, the priority of all networking for the entire module can be changed on the fly. - * Additionally, networking traffic from a single IP cannot monopolize the module. - * - * Here's how you would accomplish something like that: - * - (dispatch_queue_t)newSocketQueueForConnectionFromAddress:(NSData *)address onSocket:(GCDAsyncSocket *)sock - * { - * dispatch_queue_t socketQueue = dispatch_queue_create("", NULL); - * dispatch_queue_t ipQueue = [self ipQueueForAddress:address]; - * - * dispatch_set_target_queue(socketQueue, ipQueue); - * dispatch_set_target_queue(iqQueue, moduleQueue); - * - * return socketQueue; - * } - * - (void)socket:(GCDAsyncSocket *)sock didAcceptNewSocket:(GCDAsyncSocket *)newSocket - * { - * [clientConnections addObject:newSocket]; - * [newSocket markSocketQueueTargetQueue:moduleQueue]; - * } - * - * Note: This workaround is ONLY needed if you intend to execute code directly on the ipQueue or moduleQueue. - * This is often NOT the case, as such queues are used solely for execution shaping. -**/ -- (void)markSocketQueueTargetQueue:(dispatch_queue_t)socketQueuesPreConfiguredTargetQueue; -- (void)unmarkSocketQueueTargetQueue:(dispatch_queue_t)socketQueuesPreviouslyConfiguredTargetQueue; - -/** - * It's not thread-safe to access certain variables from outside the socket's internal queue. - * - * For example, the socket file descriptor. - * File descriptors are simply integers which reference an index in the per-process file table. - * However, when one requests a new file descriptor (by opening a file or socket), - * the file descriptor returned is guaranteed to be the lowest numbered unused descriptor. - * So if we're not careful, the following could be possible: - * - * - Thread A invokes a method which returns the socket's file descriptor. - * - The socket is closed via the socket's internal queue on thread B. - * - Thread C opens a file, and subsequently receives the file descriptor that was previously the socket's FD. - * - Thread A is now accessing/altering the file instead of the socket. - * - * In addition to this, other variables are not actually objects, - * and thus cannot be retained/released or even autoreleased. - * An example is the sslContext, of type SSLContextRef, which is actually a malloc'd struct. - * - * Although there are internal variables that make it difficult to maintain thread-safety, - * it is important to provide access to these variables - * to ensure this class can be used in a wide array of environments. - * This method helps to accomplish this by invoking the current block on the socket's internal queue. - * The methods below can be invoked from within the block to access - * those generally thread-unsafe internal variables in a thread-safe manner. - * The given block will be invoked synchronously on the socket's internal queue. - * - * If you save references to any protected variables and use them outside the block, you do so at your own peril. -**/ -- (void)performBlock:(dispatch_block_t)block; - -/** - * These methods are only available from within the context of a performBlock: invocation. - * See the documentation for the performBlock: method above. - * - * Provides access to the socket's file descriptor(s). - * If the socket is a server socket (is accepting incoming connections), - * it might actually have multiple internal socket file descriptors - one for IPv4 and one for IPv6. -**/ -- (int)socketFD; -- (int)socket4FD; -- (int)socket6FD; - -#if TARGET_OS_IPHONE - -/** - * These methods are only available from within the context of a performBlock: invocation. - * See the documentation for the performBlock: method above. - * - * Provides access to the socket's internal CFReadStream/CFWriteStream. - * - * These streams are only used as workarounds for specific iOS shortcomings: - * - * - Apple has decided to keep the SecureTransport framework private is iOS. - * This means the only supplied way to do SSL/TLS is via CFStream or some other API layered on top of it. - * Thus, in order to provide SSL/TLS support on iOS we are forced to rely on CFStream, - * instead of the preferred and faster and more powerful SecureTransport. - * - * - If a socket doesn't have backgrounding enabled, and that socket is closed while the app is backgrounded, - * Apple only bothers to notify us via the CFStream API. - * The faster and more powerful GCD API isn't notified properly in this case. - * - * See also: (BOOL)enableBackgroundingOnSocket -**/ -- (nullable CFReadStreamRef)readStream; -- (nullable CFWriteStreamRef)writeStream; - -/** - * This method is only available from within the context of a performBlock: invocation. - * See the documentation for the performBlock: method above. - * - * Configures the socket to allow it to operate when the iOS application has been backgrounded. - * In other words, this method creates a read & write stream, and invokes: - * - * CFReadStreamSetProperty(readStream, kCFStreamNetworkServiceType, kCFStreamNetworkServiceTypeVoIP); - * CFWriteStreamSetProperty(writeStream, kCFStreamNetworkServiceType, kCFStreamNetworkServiceTypeVoIP); - * - * Returns YES if successful, NO otherwise. - * - * Note: Apple does not officially support backgrounding server sockets. - * That is, if your socket is accepting incoming connections, Apple does not officially support - * allowing iOS applications to accept incoming connections while an app is backgrounded. - * - * Example usage: - * - * - (void)socket:(GCDAsyncSocket *)sock didConnectToHost:(NSString *)host port:(uint16_t)port - * { - * [asyncSocket performBlock:^{ - * [asyncSocket enableBackgroundingOnSocket]; - * }]; - * } -**/ -- (BOOL)enableBackgroundingOnSocket; - -#endif - -/** - * This method is only available from within the context of a performBlock: invocation. - * See the documentation for the performBlock: method above. - * - * Provides access to the socket's SSLContext, if SSL/TLS has been started on the socket. -**/ -- (nullable SSLContextRef)sslContext; - -#pragma mark Utilities - -/** - * The address lookup utility used by the class. - * This method is synchronous, so it's recommended you use it on a background thread/queue. - * - * The special strings "localhost" and "loopback" return the loopback address for IPv4 and IPv6. - * - * @returns - * A mutable array with all IPv4 and IPv6 addresses returned by getaddrinfo. - * The addresses are specifically for TCP connections. - * You can filter the addresses, if needed, using the other utility methods provided by the class. -**/ -+ (nullable NSMutableArray *)lookupHost:(NSString *)host port:(uint16_t)port error:(NSError **)errPtr; - -/** - * Extracting host and port information from raw address data. -**/ - -+ (nullable NSString *)hostFromAddress:(NSData *)address; -+ (uint16_t)portFromAddress:(NSData *)address; - -+ (BOOL)isIPv4Address:(NSData *)address; -+ (BOOL)isIPv6Address:(NSData *)address; - -+ (BOOL)getHost:( NSString * __nullable * __nullable)hostPtr port:(nullable uint16_t *)portPtr fromAddress:(NSData *)address; - -+ (BOOL)getHost:(NSString * __nullable * __nullable)hostPtr port:(nullable uint16_t *)portPtr family:(nullable sa_family_t *)afPtr fromAddress:(NSData *)address; - -/** - * A few common line separators, for use with the readDataToData:... methods. -**/ -+ (NSData *)CRLFData; // 0x0D0A -+ (NSData *)CRData; // 0x0D -+ (NSData *)LFData; // 0x0A -+ (NSData *)ZeroData; // 0x00 - -@end - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -#pragma mark - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -@protocol GCDAsyncSocketDelegate -@optional - -/** - * This method is called immediately prior to socket:didAcceptNewSocket:. - * It optionally allows a listening socket to specify the socketQueue for a new accepted socket. - * If this method is not implemented, or returns NULL, the new accepted socket will create its own default queue. - * - * Since you cannot autorelease a dispatch_queue, - * this method uses the "new" prefix in its name to specify that the returned queue has been retained. - * - * Thus you could do something like this in the implementation: - * return dispatch_queue_create("MyQueue", NULL); - * - * If you are placing multiple sockets on the same queue, - * then care should be taken to increment the retain count each time this method is invoked. - * - * For example, your implementation might look something like this: - * dispatch_retain(myExistingQueue); - * return myExistingQueue; -**/ -- (nullable dispatch_queue_t)newSocketQueueForConnectionFromAddress:(NSData *)address onSocket:(GCDAsyncSocket *)sock; - -/** - * Called when a socket accepts a connection. - * Another socket is automatically spawned to handle it. - * - * You must retain the newSocket if you wish to handle the connection. - * Otherwise the newSocket instance will be released and the spawned connection will be closed. - * - * By default the new socket will have the same delegate and delegateQueue. - * You may, of course, change this at any time. -**/ -- (void)socket:(GCDAsyncSocket *)sock didAcceptNewSocket:(GCDAsyncSocket *)newSocket; - -/** - * Called when a socket connects and is ready for reading and writing. - * The host parameter will be an IP address, not a DNS name. -**/ -- (void)socket:(GCDAsyncSocket *)sock didConnectToHost:(NSString *)host port:(uint16_t)port; - -/** - * Called when a socket connects and is ready for reading and writing. - * The host parameter will be an IP address, not a DNS name. - **/ -- (void)socket:(GCDAsyncSocket *)sock didConnectToUrl:(NSURL *)url; - -/** - * Called when a socket has completed reading the requested data into memory. - * Not called if there is an error. -**/ -- (void)socket:(GCDAsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag; - -/** - * Called when a socket has read in data, but has not yet completed the read. - * This would occur if using readToData: or readToLength: methods. - * It may be used for things such as updating progress bars. -**/ -- (void)socket:(GCDAsyncSocket *)sock didReadPartialDataOfLength:(NSUInteger)partialLength tag:(long)tag; - -/** - * Called when a socket has completed writing the requested data. Not called if there is an error. -**/ -- (void)socket:(GCDAsyncSocket *)sock didWriteDataWithTag:(long)tag; - -/** - * Called when a socket has written some data, but has not yet completed the entire write. - * It may be used for things such as updating progress bars. -**/ -- (void)socket:(GCDAsyncSocket *)sock didWritePartialDataOfLength:(NSUInteger)partialLength tag:(long)tag; - -/** - * Called if a read operation has reached its timeout without completing. - * This method allows you to optionally extend the timeout. - * If you return a positive time interval (> 0) the read's timeout will be extended by the given amount. - * If you don't implement this method, or return a non-positive time interval (<= 0) the read will timeout as usual. - * - * The elapsed parameter is the sum of the original timeout, plus any additions previously added via this method. - * The length parameter is the number of bytes that have been read so far for the read operation. - * - * Note that this method may be called multiple times for a single read if you return positive numbers. -**/ -- (NSTimeInterval)socket:(GCDAsyncSocket *)sock shouldTimeoutReadWithTag:(long)tag - elapsed:(NSTimeInterval)elapsed - bytesDone:(NSUInteger)length; - -/** - * Called if a write operation has reached its timeout without completing. - * This method allows you to optionally extend the timeout. - * If you return a positive time interval (> 0) the write's timeout will be extended by the given amount. - * If you don't implement this method, or return a non-positive time interval (<= 0) the write will timeout as usual. - * - * The elapsed parameter is the sum of the original timeout, plus any additions previously added via this method. - * The length parameter is the number of bytes that have been written so far for the write operation. - * - * Note that this method may be called multiple times for a single write if you return positive numbers. -**/ -- (NSTimeInterval)socket:(GCDAsyncSocket *)sock shouldTimeoutWriteWithTag:(long)tag - elapsed:(NSTimeInterval)elapsed - bytesDone:(NSUInteger)length; - -/** - * Conditionally called if the read stream closes, but the write stream may still be writeable. - * - * This delegate method is only called if autoDisconnectOnClosedReadStream has been set to NO. - * See the discussion on the autoDisconnectOnClosedReadStream method for more information. -**/ -- (void)socketDidCloseReadStream:(GCDAsyncSocket *)sock; - -/** - * Called when a socket disconnects with or without error. - * - * If you call the disconnect method, and the socket wasn't already disconnected, - * then an invocation of this delegate method will be enqueued on the delegateQueue - * before the disconnect method returns. - * - * Note: If the GCDAsyncSocket instance is deallocated while it is still connected, - * and the delegate is not also deallocated, then this method will be invoked, - * but the sock parameter will be nil. (It must necessarily be nil since it is no longer available.) - * This is a generally rare, but is possible if one writes code like this: - * - * asyncSocket = nil; // I'm implicitly disconnecting the socket - * - * In this case it may preferrable to nil the delegate beforehand, like this: - * - * asyncSocket.delegate = nil; // Don't invoke my delegate method - * asyncSocket = nil; // I'm implicitly disconnecting the socket - * - * Of course, this depends on how your state machine is configured. -**/ -- (void)socketDidDisconnect:(GCDAsyncSocket *)sock withError:(nullable NSError *)err; - -/** - * Called after the socket has successfully completed SSL/TLS negotiation. - * This method is not called unless you use the provided startTLS method. - * - * If a SSL/TLS negotiation fails (invalid certificate, etc) then the socket will immediately close, - * and the socketDidDisconnect:withError: delegate method will be called with the specific SSL error code. -**/ -- (void)socketDidSecure:(GCDAsyncSocket *)sock; - -/** - * Allows a socket delegate to hook into the TLS handshake and manually validate the peer it's connecting to. - * - * This is only called if startTLS is invoked with options that include: - * - GCDAsyncSocketManuallyEvaluateTrust == YES - * - * Typically the delegate will use SecTrustEvaluate (and related functions) to properly validate the peer. - * - * Note from Apple's documentation: - * Because [SecTrustEvaluate] might look on the network for certificates in the certificate chain, - * [it] might block while attempting network access. You should never call it from your main thread; - * call it only from within a function running on a dispatch queue or on a separate thread. - * - * Thus this method uses a completionHandler block rather than a normal return value. - * The completionHandler block is thread-safe, and may be invoked from a background queue/thread. - * It is safe to invoke the completionHandler block even if the socket has been closed. -**/ -- (void)socket:(GCDAsyncSocket *)sock didReceiveTrust:(SecTrustRef)trust - completionHandler:(void (^)(BOOL shouldTrustPeer))completionHandler; - -@end -NS_ASSUME_NONNULL_END diff --git a/client/3rd/PacketProcessor/PacketProcessor/CocoaAsyncSocket/CocoaAsyncSocket.framework/Headers/GCDAsyncUdpSocket.h b/client/3rd/PacketProcessor/PacketProcessor/CocoaAsyncSocket/CocoaAsyncSocket.framework/Headers/GCDAsyncUdpSocket.h deleted file mode 100644 index af327e08..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/CocoaAsyncSocket/CocoaAsyncSocket.framework/Headers/GCDAsyncUdpSocket.h +++ /dev/null @@ -1,1036 +0,0 @@ -// -// GCDAsyncUdpSocket -// -// This class is in the public domain. -// Originally created by Robbie Hanson of Deusty LLC. -// Updated and maintained by Deusty LLC and the Apple development community. -// -// https://github.com/robbiehanson/CocoaAsyncSocket -// - -#import -#import -#import -#import - -NS_ASSUME_NONNULL_BEGIN -extern NSString *const GCDAsyncUdpSocketException; -extern NSString *const GCDAsyncUdpSocketErrorDomain; - -extern NSString *const GCDAsyncUdpSocketQueueName; -extern NSString *const GCDAsyncUdpSocketThreadName; - -typedef NS_ERROR_ENUM(GCDAsyncUdpSocketErrorDomain, GCDAsyncUdpSocketError) { - GCDAsyncUdpSocketNoError = 0, // Never used - GCDAsyncUdpSocketBadConfigError, // Invalid configuration - GCDAsyncUdpSocketBadParamError, // Invalid parameter was passed - GCDAsyncUdpSocketSendTimeoutError, // A send operation timed out - GCDAsyncUdpSocketClosedError, // The socket was closed - GCDAsyncUdpSocketOtherError, // Description provided in userInfo -}; - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -#pragma mark - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -@class GCDAsyncUdpSocket; - -@protocol GCDAsyncUdpSocketDelegate -@optional - -/** - * By design, UDP is a connectionless protocol, and connecting is not needed. - * However, you may optionally choose to connect to a particular host for reasons - * outlined in the documentation for the various connect methods listed above. - * - * This method is called if one of the connect methods are invoked, and the connection is successful. -**/ -- (void)udpSocket:(GCDAsyncUdpSocket *)sock didConnectToAddress:(NSData *)address; - -/** - * By design, UDP is a connectionless protocol, and connecting is not needed. - * However, you may optionally choose to connect to a particular host for reasons - * outlined in the documentation for the various connect methods listed above. - * - * This method is called if one of the connect methods are invoked, and the connection fails. - * This may happen, for example, if a domain name is given for the host and the domain name is unable to be resolved. -**/ -- (void)udpSocket:(GCDAsyncUdpSocket *)sock didNotConnect:(NSError * _Nullable)error; - -/** - * Called when the datagram with the given tag has been sent. -**/ -- (void)udpSocket:(GCDAsyncUdpSocket *)sock didSendDataWithTag:(long)tag; - -/** - * Called if an error occurs while trying to send a datagram. - * This could be due to a timeout, or something more serious such as the data being too large to fit in a sigle packet. -**/ -- (void)udpSocket:(GCDAsyncUdpSocket *)sock didNotSendDataWithTag:(long)tag dueToError:(NSError * _Nullable)error; - -/** - * Called when the socket has received the requested datagram. -**/ -- (void)udpSocket:(GCDAsyncUdpSocket *)sock didReceiveData:(NSData *)data - fromAddress:(NSData *)address - withFilterContext:(nullable id)filterContext; - -/** - * Called when the socket is closed. -**/ -- (void)udpSocketDidClose:(GCDAsyncUdpSocket *)sock withError:(NSError * _Nullable)error; - -@end - -/** - * You may optionally set a receive filter for the socket. - * A filter can provide several useful features: - * - * 1. Many times udp packets need to be parsed. - * Since the filter can run in its own independent queue, you can parallelize this parsing quite easily. - * The end result is a parallel socket io, datagram parsing, and packet processing. - * - * 2. Many times udp packets are discarded because they are duplicate/unneeded/unsolicited. - * The filter can prevent such packets from arriving at the delegate. - * And because the filter can run in its own independent queue, this doesn't slow down the delegate. - * - * - Since the udp protocol does not guarantee delivery, udp packets may be lost. - * Many protocols built atop udp thus provide various resend/re-request algorithms. - * This sometimes results in duplicate packets arriving. - * A filter may allow you to architect the duplicate detection code to run in parallel to normal processing. - * - * - Since the udp socket may be connectionless, its possible for unsolicited packets to arrive. - * Such packets need to be ignored. - * - * 3. Sometimes traffic shapers are needed to simulate real world environments. - * A filter allows you to write custom code to simulate such environments. - * The ability to code this yourself is especially helpful when your simulated environment - * is more complicated than simple traffic shaping (e.g. simulating a cone port restricted router), - * or the system tools to handle this aren't available (e.g. on a mobile device). - * - * @param data - The packet that was received. - * @param address - The address the data was received from. - * See utilities section for methods to extract info from address. - * @param context - Out parameter you may optionally set, which will then be passed to the delegate method. - * For example, filter block can parse the data and then, - * pass the parsed data to the delegate. - * - * @returns - YES if the received packet should be passed onto the delegate. - * NO if the received packet should be discarded, and not reported to the delegete. - * - * Example: - * - * GCDAsyncUdpSocketReceiveFilterBlock filter = ^BOOL (NSData *data, NSData *address, id *context) { - * - * MyProtocolMessage *msg = [MyProtocol parseMessage:data]; - * - * *context = response; - * return (response != nil); - * }; - * [udpSocket setReceiveFilter:filter withQueue:myParsingQueue]; - * -**/ -typedef BOOL (^GCDAsyncUdpSocketReceiveFilterBlock)(NSData *data, NSData *address, id __nullable * __nonnull context); - -/** - * You may optionally set a send filter for the socket. - * A filter can provide several interesting possibilities: - * - * 1. Optional caching of resolved addresses for domain names. - * The cache could later be consulted, resulting in fewer system calls to getaddrinfo. - * - * 2. Reusable modules of code for bandwidth monitoring. - * - * 3. Sometimes traffic shapers are needed to simulate real world environments. - * A filter allows you to write custom code to simulate such environments. - * The ability to code this yourself is especially helpful when your simulated environment - * is more complicated than simple traffic shaping (e.g. simulating a cone port restricted router), - * or the system tools to handle this aren't available (e.g. on a mobile device). - * - * @param data - The packet that was received. - * @param address - The address the data was received from. - * See utilities section for methods to extract info from address. - * @param tag - The tag that was passed in the send method. - * - * @returns - YES if the packet should actually be sent over the socket. - * NO if the packet should be silently dropped (not sent over the socket). - * - * Regardless of the return value, the delegate will be informed that the packet was successfully sent. - * -**/ -typedef BOOL (^GCDAsyncUdpSocketSendFilterBlock)(NSData *data, NSData *address, long tag); - - -@interface GCDAsyncUdpSocket : NSObject - -/** - * GCDAsyncUdpSocket uses the standard delegate paradigm, - * but executes all delegate callbacks on a given delegate dispatch queue. - * This allows for maximum concurrency, while at the same time providing easy thread safety. - * - * You MUST set a delegate AND delegate dispatch queue before attempting to - * use the socket, or you will get an error. - * - * The socket queue is optional. - * If you pass NULL, GCDAsyncSocket will automatically create its own socket queue. - * If you choose to provide a socket queue, the socket queue must not be a concurrent queue, - * then please see the discussion for the method markSocketQueueTargetQueue. - * - * The delegate queue and socket queue can optionally be the same. -**/ -- (instancetype)init; -- (instancetype)initWithSocketQueue:(nullable dispatch_queue_t)sq; -- (instancetype)initWithDelegate:(nullable id)aDelegate delegateQueue:(nullable dispatch_queue_t)dq; -- (instancetype)initWithDelegate:(nullable id)aDelegate delegateQueue:(nullable dispatch_queue_t)dq socketQueue:(nullable dispatch_queue_t)sq NS_DESIGNATED_INITIALIZER; - -#pragma mark Configuration - -- (nullable id)delegate; -- (void)setDelegate:(nullable id)delegate; -- (void)synchronouslySetDelegate:(nullable id)delegate; - -- (nullable dispatch_queue_t)delegateQueue; -- (void)setDelegateQueue:(nullable dispatch_queue_t)delegateQueue; -- (void)synchronouslySetDelegateQueue:(nullable dispatch_queue_t)delegateQueue; - -- (void)getDelegate:(id __nullable * __nullable)delegatePtr delegateQueue:(dispatch_queue_t __nullable * __nullable)delegateQueuePtr; -- (void)setDelegate:(nullable id)delegate delegateQueue:(nullable dispatch_queue_t)delegateQueue; -- (void)synchronouslySetDelegate:(nullable id)delegate delegateQueue:(nullable dispatch_queue_t)delegateQueue; - -/** - * By default, both IPv4 and IPv6 are enabled. - * - * This means GCDAsyncUdpSocket automatically supports both protocols, - * and can send to IPv4 or IPv6 addresses, - * as well as receive over IPv4 and IPv6. - * - * For operations that require DNS resolution, GCDAsyncUdpSocket supports both IPv4 and IPv6. - * If a DNS lookup returns only IPv4 results, GCDAsyncUdpSocket will automatically use IPv4. - * If a DNS lookup returns only IPv6 results, GCDAsyncUdpSocket will automatically use IPv6. - * If a DNS lookup returns both IPv4 and IPv6 results, then the protocol used depends on the configured preference. - * If IPv4 is preferred, then IPv4 is used. - * If IPv6 is preferred, then IPv6 is used. - * If neutral, then the first IP version in the resolved array will be used. - * - * Starting with Mac OS X 10.7 Lion and iOS 5, the default IP preference is neutral. - * On prior systems the default IP preference is IPv4. - **/ -- (BOOL)isIPv4Enabled; -- (void)setIPv4Enabled:(BOOL)flag; - -- (BOOL)isIPv6Enabled; -- (void)setIPv6Enabled:(BOOL)flag; - -- (BOOL)isIPv4Preferred; -- (BOOL)isIPv6Preferred; -- (BOOL)isIPVersionNeutral; - -- (void)setPreferIPv4; -- (void)setPreferIPv6; -- (void)setIPVersionNeutral; - -/** - * Gets/Sets the maximum size of the buffer that will be allocated for receive operations. - * The default maximum size is 65535 bytes. - * - * The theoretical maximum size of any IPv4 UDP packet is UINT16_MAX = 65535. - * The theoretical maximum size of any IPv6 UDP packet is UINT32_MAX = 4294967295. - * - * Since the OS/GCD notifies us of the size of each received UDP packet, - * the actual allocated buffer size for each packet is exact. - * And in practice the size of UDP packets is generally much smaller than the max. - * Indeed most protocols will send and receive packets of only a few bytes, - * or will set a limit on the size of packets to prevent fragmentation in the IP layer. - * - * If you set the buffer size too small, the sockets API in the OS will silently discard - * any extra data, and you will not be notified of the error. -**/ -- (uint16_t)maxReceiveIPv4BufferSize; -- (void)setMaxReceiveIPv4BufferSize:(uint16_t)max; - -- (uint32_t)maxReceiveIPv6BufferSize; -- (void)setMaxReceiveIPv6BufferSize:(uint32_t)max; - -/** - * Gets/Sets the maximum size of the buffer that will be allocated for send operations. - * The default maximum size is 65535 bytes. - * - * Given that a typical link MTU is 1500 bytes, a large UDP datagram will have to be - * fragmented, and that’s both expensive and risky (if one fragment goes missing, the - * entire datagram is lost). You are much better off sending a large number of smaller - * UDP datagrams, preferably using a path MTU algorithm to avoid fragmentation. - * - * You must set it before the sockt is created otherwise it won't work. - * - **/ -- (uint16_t)maxSendBufferSize; -- (void)setMaxSendBufferSize:(uint16_t)max; - -/** - * User data allows you to associate arbitrary information with the socket. - * This data is not used internally in any way. -**/ -- (nullable id)userData; -- (void)setUserData:(nullable id)arbitraryUserData; - -#pragma mark Diagnostics - -/** - * Returns the local address info for the socket. - * - * The localAddress method returns a sockaddr structure wrapped in a NSData object. - * The localHost method returns the human readable IP address as a string. - * - * Note: Address info may not be available until after the socket has been binded, connected - * or until after data has been sent. -**/ -- (nullable NSData *)localAddress; -- (nullable NSString *)localHost; -- (uint16_t)localPort; - -- (nullable NSData *)localAddress_IPv4; -- (nullable NSString *)localHost_IPv4; -- (uint16_t)localPort_IPv4; - -- (nullable NSData *)localAddress_IPv6; -- (nullable NSString *)localHost_IPv6; -- (uint16_t)localPort_IPv6; - -/** - * Returns the remote address info for the socket. - * - * The connectedAddress method returns a sockaddr structure wrapped in a NSData object. - * The connectedHost method returns the human readable IP address as a string. - * - * Note: Since UDP is connectionless by design, connected address info - * will not be available unless the socket is explicitly connected to a remote host/port. - * If the socket is not connected, these methods will return nil / 0. -**/ -- (nullable NSData *)connectedAddress; -- (nullable NSString *)connectedHost; -- (uint16_t)connectedPort; - -/** - * Returns whether or not this socket has been connected to a single host. - * By design, UDP is a connectionless protocol, and connecting is not needed. - * If connected, the socket will only be able to send/receive data to/from the connected host. -**/ -- (BOOL)isConnected; - -/** - * Returns whether or not this socket has been closed. - * The only way a socket can be closed is if you explicitly call one of the close methods. -**/ -- (BOOL)isClosed; - -/** - * Returns whether or not this socket is IPv4. - * - * By default this will be true, unless: - * - IPv4 is disabled (via setIPv4Enabled:) - * - The socket is explicitly bound to an IPv6 address - * - The socket is connected to an IPv6 address -**/ -- (BOOL)isIPv4; - -/** - * Returns whether or not this socket is IPv6. - * - * By default this will be true, unless: - * - IPv6 is disabled (via setIPv6Enabled:) - * - The socket is explicitly bound to an IPv4 address - * _ The socket is connected to an IPv4 address - * - * This method will also return false on platforms that do not support IPv6. - * Note: The iPhone does not currently support IPv6. -**/ -- (BOOL)isIPv6; - -#pragma mark Binding - -/** - * Binds the UDP socket to the given port. - * Binding should be done for server sockets that receive data prior to sending it. - * Client sockets can skip binding, - * as the OS will automatically assign the socket an available port when it starts sending data. - * - * You may optionally pass a port number of zero to immediately bind the socket, - * yet still allow the OS to automatically assign an available port. - * - * You cannot bind a socket after its been connected. - * You can only bind a socket once. - * You can still connect a socket (if desired) after binding. - * - * On success, returns YES. - * Otherwise returns NO, and sets errPtr. If you don't care about the error, you can pass NULL for errPtr. -**/ -- (BOOL)bindToPort:(uint16_t)port error:(NSError **)errPtr; - -/** - * Binds the UDP socket to the given port and optional interface. - * Binding should be done for server sockets that receive data prior to sending it. - * Client sockets can skip binding, - * as the OS will automatically assign the socket an available port when it starts sending data. - * - * You may optionally pass a port number of zero to immediately bind the socket, - * yet still allow the OS to automatically assign an available port. - * - * The interface may be a name (e.g. "en1" or "lo0") or the corresponding IP address (e.g. "192.168.4.35"). - * You may also use the special strings "localhost" or "loopback" to specify that - * the socket only accept packets from the local machine. - * - * You cannot bind a socket after its been connected. - * You can only bind a socket once. - * You can still connect a socket (if desired) after binding. - * - * On success, returns YES. - * Otherwise returns NO, and sets errPtr. If you don't care about the error, you can pass NULL for errPtr. -**/ -- (BOOL)bindToPort:(uint16_t)port interface:(nullable NSString *)interface error:(NSError **)errPtr; - -/** - * Binds the UDP socket to the given address, specified as a sockaddr structure wrapped in a NSData object. - * - * If you have an existing struct sockaddr you can convert it to a NSData object like so: - * struct sockaddr sa -> NSData *dsa = [NSData dataWithBytes:&remoteAddr length:remoteAddr.sa_len]; - * struct sockaddr *sa -> NSData *dsa = [NSData dataWithBytes:remoteAddr length:remoteAddr->sa_len]; - * - * Binding should be done for server sockets that receive data prior to sending it. - * Client sockets can skip binding, - * as the OS will automatically assign the socket an available port when it starts sending data. - * - * You cannot bind a socket after its been connected. - * You can only bind a socket once. - * You can still connect a socket (if desired) after binding. - * - * On success, returns YES. - * Otherwise returns NO, and sets errPtr. If you don't care about the error, you can pass NULL for errPtr. -**/ -- (BOOL)bindToAddress:(NSData *)localAddr error:(NSError **)errPtr; - -#pragma mark Connecting - -/** - * Connects the UDP socket to the given host and port. - * By design, UDP is a connectionless protocol, and connecting is not needed. - * - * Choosing to connect to a specific host/port has the following effect: - * - You will only be able to send data to the connected host/port. - * - You will only be able to receive data from the connected host/port. - * - You will receive ICMP messages that come from the connected host/port, such as "connection refused". - * - * The actual process of connecting a UDP socket does not result in any communication on the socket. - * It simply changes the internal state of the socket. - * - * You cannot bind a socket after it has been connected. - * You can only connect a socket once. - * - * The host may be a domain name (e.g. "deusty.com") or an IP address string (e.g. "192.168.0.2"). - * - * This method is asynchronous as it requires a DNS lookup to resolve the given host name. - * If an obvious error is detected, this method immediately returns NO and sets errPtr. - * If you don't care about the error, you can pass nil for errPtr. - * Otherwise, this method returns YES and begins the asynchronous connection process. - * The result of the asynchronous connection process will be reported via the delegate methods. - **/ -- (BOOL)connectToHost:(NSString *)host onPort:(uint16_t)port error:(NSError **)errPtr; - -/** - * Connects the UDP socket to the given address, specified as a sockaddr structure wrapped in a NSData object. - * - * If you have an existing struct sockaddr you can convert it to a NSData object like so: - * struct sockaddr sa -> NSData *dsa = [NSData dataWithBytes:&remoteAddr length:remoteAddr.sa_len]; - * struct sockaddr *sa -> NSData *dsa = [NSData dataWithBytes:remoteAddr length:remoteAddr->sa_len]; - * - * By design, UDP is a connectionless protocol, and connecting is not needed. - * - * Choosing to connect to a specific address has the following effect: - * - You will only be able to send data to the connected address. - * - You will only be able to receive data from the connected address. - * - You will receive ICMP messages that come from the connected address, such as "connection refused". - * - * Connecting a UDP socket does not result in any communication on the socket. - * It simply changes the internal state of the socket. - * - * You cannot bind a socket after its been connected. - * You can only connect a socket once. - * - * On success, returns YES. - * Otherwise returns NO, and sets errPtr. If you don't care about the error, you can pass nil for errPtr. - * - * Note: Unlike the connectToHost:onPort:error: method, this method does not require a DNS lookup. - * Thus when this method returns, the connection has either failed or fully completed. - * In other words, this method is synchronous, unlike the asynchronous connectToHost::: method. - * However, for compatibility and simplification of delegate code, if this method returns YES - * then the corresponding delegate method (udpSocket:didConnectToHost:port:) is still invoked. -**/ -- (BOOL)connectToAddress:(NSData *)remoteAddr error:(NSError **)errPtr; - -#pragma mark Multicast - -/** - * Join multicast group. - * Group should be an IP address (eg @"225.228.0.1"). - * - * On success, returns YES. - * Otherwise returns NO, and sets errPtr. If you don't care about the error, you can pass nil for errPtr. -**/ -- (BOOL)joinMulticastGroup:(NSString *)group error:(NSError **)errPtr; - -/** - * Join multicast group. - * Group should be an IP address (eg @"225.228.0.1"). - * The interface may be a name (e.g. "en1" or "lo0") or the corresponding IP address (e.g. "192.168.4.35"). - * - * On success, returns YES. - * Otherwise returns NO, and sets errPtr. If you don't care about the error, you can pass nil for errPtr. -**/ -- (BOOL)joinMulticastGroup:(NSString *)group onInterface:(nullable NSString *)interface error:(NSError **)errPtr; - -- (BOOL)leaveMulticastGroup:(NSString *)group error:(NSError **)errPtr; -- (BOOL)leaveMulticastGroup:(NSString *)group onInterface:(nullable NSString *)interface error:(NSError **)errPtr; - -/** - * Send multicast on a specified interface. - * For IPv4, interface should be the the IP address of the interface (eg @"192.168.10.1"). - * For IPv6, interface should be the a network interface name (eg @"en0"). - * - * On success, returns YES. - * Otherwise returns NO, and sets errPtr. If you don't care about the error, you can pass nil for errPtr. -**/ - -- (BOOL)sendIPv4MulticastOnInterface:(NSString*)interface error:(NSError **)errPtr; -- (BOOL)sendIPv6MulticastOnInterface:(NSString*)interface error:(NSError **)errPtr; - -#pragma mark Reuse Port - -/** - * By default, only one socket can be bound to a given IP address + port at a time. - * To enable multiple processes to simultaneously bind to the same address+port, - * you need to enable this functionality in the socket. All processes that wish to - * use the address+port simultaneously must all enable reuse port on the socket - * bound to that port. - **/ -- (BOOL)enableReusePort:(BOOL)flag error:(NSError **)errPtr; - -#pragma mark Broadcast - -/** - * By default, the underlying socket in the OS will not allow you to send broadcast messages. - * In order to send broadcast messages, you need to enable this functionality in the socket. - * - * A broadcast is a UDP message to addresses like "192.168.255.255" or "255.255.255.255" that is - * delivered to every host on the network. - * The reason this is generally disabled by default (by the OS) is to prevent - * accidental broadcast messages from flooding the network. -**/ -- (BOOL)enableBroadcast:(BOOL)flag error:(NSError **)errPtr; - -#pragma mark Sending - -/** - * Asynchronously sends the given data, with the given timeout and tag. - * - * This method may only be used with a connected socket. - * Recall that connecting is optional for a UDP socket. - * For connected sockets, data can only be sent to the connected address. - * For non-connected sockets, the remote destination is specified for each packet. - * For more information about optionally connecting udp sockets, see the documentation for the connect methods above. - * - * @param data - * The data to send. - * If data is nil or zero-length, this method does nothing. - * If passing NSMutableData, please read the thread-safety notice below. - * - * @param timeout - * The timeout for the send opeartion. - * If the timeout value is negative, the send operation will not use a timeout. - * - * @param tag - * The tag is for your convenience. - * It is not sent or received over the socket in any manner what-so-ever. - * It is reported back as a parameter in the udpSocket:didSendDataWithTag: - * or udpSocket:didNotSendDataWithTag:dueToError: methods. - * You can use it as an array index, state id, type constant, etc. - * - * - * Thread-Safety Note: - * If the given data parameter is mutable (NSMutableData) then you MUST NOT alter the data while - * the socket is sending it. In other words, it's not safe to alter the data until after the delegate method - * udpSocket:didSendDataWithTag: or udpSocket:didNotSendDataWithTag:dueToError: is invoked signifying - * that this particular send operation has completed. - * This is due to the fact that GCDAsyncUdpSocket does NOT copy the data. - * It simply retains it for performance reasons. - * Often times, if NSMutableData is passed, it is because a request/response was built up in memory. - * Copying this data adds an unwanted/unneeded overhead. - * If you need to write data from an immutable buffer, and you need to alter the buffer before the socket - * completes sending the bytes (which is NOT immediately after this method returns, but rather at a later time - * when the delegate method notifies you), then you should first copy the bytes, and pass the copy to this method. -**/ -- (void)sendData:(NSData *)data withTimeout:(NSTimeInterval)timeout tag:(long)tag; - -/** - * Asynchronously sends the given data, with the given timeout and tag, to the given host and port. - * - * This method cannot be used with a connected socket. - * Recall that connecting is optional for a UDP socket. - * For connected sockets, data can only be sent to the connected address. - * For non-connected sockets, the remote destination is specified for each packet. - * For more information about optionally connecting udp sockets, see the documentation for the connect methods above. - * - * @param data - * The data to send. - * If data is nil or zero-length, this method does nothing. - * If passing NSMutableData, please read the thread-safety notice below. - * - * @param host - * The destination to send the udp packet to. - * May be specified as a domain name (e.g. "deusty.com") or an IP address string (e.g. "192.168.0.2"). - * You may also use the convenience strings of "loopback" or "localhost". - * - * @param port - * The port of the host to send to. - * - * @param timeout - * The timeout for the send opeartion. - * If the timeout value is negative, the send operation will not use a timeout. - * - * @param tag - * The tag is for your convenience. - * It is not sent or received over the socket in any manner what-so-ever. - * It is reported back as a parameter in the udpSocket:didSendDataWithTag: - * or udpSocket:didNotSendDataWithTag:dueToError: methods. - * You can use it as an array index, state id, type constant, etc. - * - * - * Thread-Safety Note: - * If the given data parameter is mutable (NSMutableData) then you MUST NOT alter the data while - * the socket is sending it. In other words, it's not safe to alter the data until after the delegate method - * udpSocket:didSendDataWithTag: or udpSocket:didNotSendDataWithTag:dueToError: is invoked signifying - * that this particular send operation has completed. - * This is due to the fact that GCDAsyncUdpSocket does NOT copy the data. - * It simply retains it for performance reasons. - * Often times, if NSMutableData is passed, it is because a request/response was built up in memory. - * Copying this data adds an unwanted/unneeded overhead. - * If you need to write data from an immutable buffer, and you need to alter the buffer before the socket - * completes sending the bytes (which is NOT immediately after this method returns, but rather at a later time - * when the delegate method notifies you), then you should first copy the bytes, and pass the copy to this method. -**/ -- (void)sendData:(NSData *)data - toHost:(NSString *)host - port:(uint16_t)port - withTimeout:(NSTimeInterval)timeout - tag:(long)tag; - -/** - * Asynchronously sends the given data, with the given timeout and tag, to the given address. - * - * This method cannot be used with a connected socket. - * Recall that connecting is optional for a UDP socket. - * For connected sockets, data can only be sent to the connected address. - * For non-connected sockets, the remote destination is specified for each packet. - * For more information about optionally connecting udp sockets, see the documentation for the connect methods above. - * - * @param data - * The data to send. - * If data is nil or zero-length, this method does nothing. - * If passing NSMutableData, please read the thread-safety notice below. - * - * @param remoteAddr - * The address to send the data to (specified as a sockaddr structure wrapped in a NSData object). - * - * @param timeout - * The timeout for the send opeartion. - * If the timeout value is negative, the send operation will not use a timeout. - * - * @param tag - * The tag is for your convenience. - * It is not sent or received over the socket in any manner what-so-ever. - * It is reported back as a parameter in the udpSocket:didSendDataWithTag: - * or udpSocket:didNotSendDataWithTag:dueToError: methods. - * You can use it as an array index, state id, type constant, etc. - * - * - * Thread-Safety Note: - * If the given data parameter is mutable (NSMutableData) then you MUST NOT alter the data while - * the socket is sending it. In other words, it's not safe to alter the data until after the delegate method - * udpSocket:didSendDataWithTag: or udpSocket:didNotSendDataWithTag:dueToError: is invoked signifying - * that this particular send operation has completed. - * This is due to the fact that GCDAsyncUdpSocket does NOT copy the data. - * It simply retains it for performance reasons. - * Often times, if NSMutableData is passed, it is because a request/response was built up in memory. - * Copying this data adds an unwanted/unneeded overhead. - * If you need to write data from an immutable buffer, and you need to alter the buffer before the socket - * completes sending the bytes (which is NOT immediately after this method returns, but rather at a later time - * when the delegate method notifies you), then you should first copy the bytes, and pass the copy to this method. -**/ -- (void)sendData:(NSData *)data toAddress:(NSData *)remoteAddr withTimeout:(NSTimeInterval)timeout tag:(long)tag; - -/** - * You may optionally set a send filter for the socket. - * A filter can provide several interesting possibilities: - * - * 1. Optional caching of resolved addresses for domain names. - * The cache could later be consulted, resulting in fewer system calls to getaddrinfo. - * - * 2. Reusable modules of code for bandwidth monitoring. - * - * 3. Sometimes traffic shapers are needed to simulate real world environments. - * A filter allows you to write custom code to simulate such environments. - * The ability to code this yourself is especially helpful when your simulated environment - * is more complicated than simple traffic shaping (e.g. simulating a cone port restricted router), - * or the system tools to handle this aren't available (e.g. on a mobile device). - * - * For more information about GCDAsyncUdpSocketSendFilterBlock, see the documentation for its typedef. - * To remove a previously set filter, invoke this method and pass a nil filterBlock and NULL filterQueue. - * - * Note: This method invokes setSendFilter:withQueue:isAsynchronous: (documented below), - * passing YES for the isAsynchronous parameter. -**/ -- (void)setSendFilter:(nullable GCDAsyncUdpSocketSendFilterBlock)filterBlock withQueue:(nullable dispatch_queue_t)filterQueue; - -/** - * The receive filter can be run via dispatch_async or dispatch_sync. - * Most typical situations call for asynchronous operation. - * - * However, there are a few situations in which synchronous operation is preferred. - * Such is the case when the filter is extremely minimal and fast. - * This is because dispatch_sync is faster than dispatch_async. - * - * If you choose synchronous operation, be aware of possible deadlock conditions. - * Since the socket queue is executing your block via dispatch_sync, - * then you cannot perform any tasks which may invoke dispatch_sync on the socket queue. - * For example, you can't query properties on the socket. -**/ -- (void)setSendFilter:(nullable GCDAsyncUdpSocketSendFilterBlock)filterBlock - withQueue:(nullable dispatch_queue_t)filterQueue - isAsynchronous:(BOOL)isAsynchronous; - -#pragma mark Receiving - -/** - * There are two modes of operation for receiving packets: one-at-a-time & continuous. - * - * In one-at-a-time mode, you call receiveOnce everytime your delegate is ready to process an incoming udp packet. - * Receiving packets one-at-a-time may be better suited for implementing certain state machine code, - * where your state machine may not always be ready to process incoming packets. - * - * In continuous mode, the delegate is invoked immediately everytime incoming udp packets are received. - * Receiving packets continuously is better suited to real-time streaming applications. - * - * You may switch back and forth between one-at-a-time mode and continuous mode. - * If the socket is currently in continuous mode, calling this method will switch it to one-at-a-time mode. - * - * When a packet is received (and not filtered by the optional receive filter), - * the delegate method (udpSocket:didReceiveData:fromAddress:withFilterContext:) is invoked. - * - * If the socket is able to begin receiving packets, this method returns YES. - * Otherwise it returns NO, and sets the errPtr with appropriate error information. - * - * An example error: - * You created a udp socket to act as a server, and immediately called receive. - * You forgot to first bind the socket to a port number, and received a error with a message like: - * "Must bind socket before you can receive data." -**/ -- (BOOL)receiveOnce:(NSError **)errPtr; - -/** - * There are two modes of operation for receiving packets: one-at-a-time & continuous. - * - * In one-at-a-time mode, you call receiveOnce everytime your delegate is ready to process an incoming udp packet. - * Receiving packets one-at-a-time may be better suited for implementing certain state machine code, - * where your state machine may not always be ready to process incoming packets. - * - * In continuous mode, the delegate is invoked immediately everytime incoming udp packets are received. - * Receiving packets continuously is better suited to real-time streaming applications. - * - * You may switch back and forth between one-at-a-time mode and continuous mode. - * If the socket is currently in one-at-a-time mode, calling this method will switch it to continuous mode. - * - * For every received packet (not filtered by the optional receive filter), - * the delegate method (udpSocket:didReceiveData:fromAddress:withFilterContext:) is invoked. - * - * If the socket is able to begin receiving packets, this method returns YES. - * Otherwise it returns NO, and sets the errPtr with appropriate error information. - * - * An example error: - * You created a udp socket to act as a server, and immediately called receive. - * You forgot to first bind the socket to a port number, and received a error with a message like: - * "Must bind socket before you can receive data." -**/ -- (BOOL)beginReceiving:(NSError **)errPtr; - -/** - * If the socket is currently receiving (beginReceiving has been called), this method pauses the receiving. - * That is, it won't read any more packets from the underlying OS socket until beginReceiving is called again. - * - * Important Note: - * GCDAsyncUdpSocket may be running in parallel with your code. - * That is, your delegate is likely running on a separate thread/dispatch_queue. - * When you invoke this method, GCDAsyncUdpSocket may have already dispatched delegate methods to be invoked. - * Thus, if those delegate methods have already been dispatch_async'd, - * your didReceive delegate method may still be invoked after this method has been called. - * You should be aware of this, and program defensively. -**/ -- (void)pauseReceiving; - -/** - * You may optionally set a receive filter for the socket. - * This receive filter may be set to run in its own queue (independent of delegate queue). - * - * A filter can provide several useful features. - * - * 1. Many times udp packets need to be parsed. - * Since the filter can run in its own independent queue, you can parallelize this parsing quite easily. - * The end result is a parallel socket io, datagram parsing, and packet processing. - * - * 2. Many times udp packets are discarded because they are duplicate/unneeded/unsolicited. - * The filter can prevent such packets from arriving at the delegate. - * And because the filter can run in its own independent queue, this doesn't slow down the delegate. - * - * - Since the udp protocol does not guarantee delivery, udp packets may be lost. - * Many protocols built atop udp thus provide various resend/re-request algorithms. - * This sometimes results in duplicate packets arriving. - * A filter may allow you to architect the duplicate detection code to run in parallel to normal processing. - * - * - Since the udp socket may be connectionless, its possible for unsolicited packets to arrive. - * Such packets need to be ignored. - * - * 3. Sometimes traffic shapers are needed to simulate real world environments. - * A filter allows you to write custom code to simulate such environments. - * The ability to code this yourself is especially helpful when your simulated environment - * is more complicated than simple traffic shaping (e.g. simulating a cone port restricted router), - * or the system tools to handle this aren't available (e.g. on a mobile device). - * - * Example: - * - * GCDAsyncUdpSocketReceiveFilterBlock filter = ^BOOL (NSData *data, NSData *address, id *context) { - * - * MyProtocolMessage *msg = [MyProtocol parseMessage:data]; - * - * *context = response; - * return (response != nil); - * }; - * [udpSocket setReceiveFilter:filter withQueue:myParsingQueue]; - * - * For more information about GCDAsyncUdpSocketReceiveFilterBlock, see the documentation for its typedef. - * To remove a previously set filter, invoke this method and pass a nil filterBlock and NULL filterQueue. - * - * Note: This method invokes setReceiveFilter:withQueue:isAsynchronous: (documented below), - * passing YES for the isAsynchronous parameter. -**/ -- (void)setReceiveFilter:(nullable GCDAsyncUdpSocketReceiveFilterBlock)filterBlock withQueue:(nullable dispatch_queue_t)filterQueue; - -/** - * The receive filter can be run via dispatch_async or dispatch_sync. - * Most typical situations call for asynchronous operation. - * - * However, there are a few situations in which synchronous operation is preferred. - * Such is the case when the filter is extremely minimal and fast. - * This is because dispatch_sync is faster than dispatch_async. - * - * If you choose synchronous operation, be aware of possible deadlock conditions. - * Since the socket queue is executing your block via dispatch_sync, - * then you cannot perform any tasks which may invoke dispatch_sync on the socket queue. - * For example, you can't query properties on the socket. -**/ -- (void)setReceiveFilter:(nullable GCDAsyncUdpSocketReceiveFilterBlock)filterBlock - withQueue:(nullable dispatch_queue_t)filterQueue - isAsynchronous:(BOOL)isAsynchronous; - -#pragma mark Closing - -/** - * Immediately closes the underlying socket. - * Any pending send operations are discarded. - * - * The GCDAsyncUdpSocket instance may optionally be used again. - * (it will setup/configure/use another unnderlying BSD socket). -**/ -- (void)close; - -/** - * Closes the underlying socket after all pending send operations have been sent. - * - * The GCDAsyncUdpSocket instance may optionally be used again. - * (it will setup/configure/use another unnderlying BSD socket). -**/ -- (void)closeAfterSending; - -#pragma mark Advanced -/** - * GCDAsyncSocket maintains thread safety by using an internal serial dispatch_queue. - * In most cases, the instance creates this queue itself. - * However, to allow for maximum flexibility, the internal queue may be passed in the init method. - * This allows for some advanced options such as controlling socket priority via target queues. - * However, when one begins to use target queues like this, they open the door to some specific deadlock issues. - * - * For example, imagine there are 2 queues: - * dispatch_queue_t socketQueue; - * dispatch_queue_t socketTargetQueue; - * - * If you do this (pseudo-code): - * socketQueue.targetQueue = socketTargetQueue; - * - * Then all socketQueue operations will actually get run on the given socketTargetQueue. - * This is fine and works great in most situations. - * But if you run code directly from within the socketTargetQueue that accesses the socket, - * you could potentially get deadlock. Imagine the following code: - * - * - (BOOL)socketHasSomething - * { - * __block BOOL result = NO; - * dispatch_block_t block = ^{ - * result = [self someInternalMethodToBeRunOnlyOnSocketQueue]; - * } - * if (is_executing_on_queue(socketQueue)) - * block(); - * else - * dispatch_sync(socketQueue, block); - * - * return result; - * } - * - * What happens if you call this method from the socketTargetQueue? The result is deadlock. - * This is because the GCD API offers no mechanism to discover a queue's targetQueue. - * Thus we have no idea if our socketQueue is configured with a targetQueue. - * If we had this information, we could easily avoid deadlock. - * But, since these API's are missing or unfeasible, you'll have to explicitly set it. - * - * IF you pass a socketQueue via the init method, - * AND you've configured the passed socketQueue with a targetQueue, - * THEN you should pass the end queue in the target hierarchy. - * - * For example, consider the following queue hierarchy: - * socketQueue -> ipQueue -> moduleQueue - * - * This example demonstrates priority shaping within some server. - * All incoming client connections from the same IP address are executed on the same target queue. - * And all connections for a particular module are executed on the same target queue. - * Thus, the priority of all networking for the entire module can be changed on the fly. - * Additionally, networking traffic from a single IP cannot monopolize the module. - * - * Here's how you would accomplish something like that: - * - (dispatch_queue_t)newSocketQueueForConnectionFromAddress:(NSData *)address onSocket:(GCDAsyncSocket *)sock - * { - * dispatch_queue_t socketQueue = dispatch_queue_create("", NULL); - * dispatch_queue_t ipQueue = [self ipQueueForAddress:address]; - * - * dispatch_set_target_queue(socketQueue, ipQueue); - * dispatch_set_target_queue(iqQueue, moduleQueue); - * - * return socketQueue; - * } - * - (void)socket:(GCDAsyncSocket *)sock didAcceptNewSocket:(GCDAsyncSocket *)newSocket - * { - * [clientConnections addObject:newSocket]; - * [newSocket markSocketQueueTargetQueue:moduleQueue]; - * } - * - * Note: This workaround is ONLY needed if you intend to execute code directly on the ipQueue or moduleQueue. - * This is often NOT the case, as such queues are used solely for execution shaping. - **/ -- (void)markSocketQueueTargetQueue:(dispatch_queue_t)socketQueuesPreConfiguredTargetQueue; -- (void)unmarkSocketQueueTargetQueue:(dispatch_queue_t)socketQueuesPreviouslyConfiguredTargetQueue; - -/** - * It's not thread-safe to access certain variables from outside the socket's internal queue. - * - * For example, the socket file descriptor. - * File descriptors are simply integers which reference an index in the per-process file table. - * However, when one requests a new file descriptor (by opening a file or socket), - * the file descriptor returned is guaranteed to be the lowest numbered unused descriptor. - * So if we're not careful, the following could be possible: - * - * - Thread A invokes a method which returns the socket's file descriptor. - * - The socket is closed via the socket's internal queue on thread B. - * - Thread C opens a file, and subsequently receives the file descriptor that was previously the socket's FD. - * - Thread A is now accessing/altering the file instead of the socket. - * - * In addition to this, other variables are not actually objects, - * and thus cannot be retained/released or even autoreleased. - * An example is the sslContext, of type SSLContextRef, which is actually a malloc'd struct. - * - * Although there are internal variables that make it difficult to maintain thread-safety, - * it is important to provide access to these variables - * to ensure this class can be used in a wide array of environments. - * This method helps to accomplish this by invoking the current block on the socket's internal queue. - * The methods below can be invoked from within the block to access - * those generally thread-unsafe internal variables in a thread-safe manner. - * The given block will be invoked synchronously on the socket's internal queue. - * - * If you save references to any protected variables and use them outside the block, you do so at your own peril. -**/ -- (void)performBlock:(dispatch_block_t)block; - -/** - * These methods are only available from within the context of a performBlock: invocation. - * See the documentation for the performBlock: method above. - * - * Provides access to the socket's file descriptor(s). - * If the socket isn't connected, or explicity bound to a particular interface, - * it might actually have multiple internal socket file descriptors - one for IPv4 and one for IPv6. -**/ -- (int)socketFD; -- (int)socket4FD; -- (int)socket6FD; - -#if TARGET_OS_IPHONE - -/** - * These methods are only available from within the context of a performBlock: invocation. - * See the documentation for the performBlock: method above. - * - * Returns (creating if necessary) a CFReadStream/CFWriteStream for the internal socket. - * - * Generally GCDAsyncUdpSocket doesn't use CFStream. (It uses the faster GCD API's.) - * However, if you need one for any reason, - * these methods are a convenient way to get access to a safe instance of one. -**/ -- (nullable CFReadStreamRef)readStream; -- (nullable CFWriteStreamRef)writeStream; - -/** - * This method is only available from within the context of a performBlock: invocation. - * See the documentation for the performBlock: method above. - * - * Configures the socket to allow it to operate when the iOS application has been backgrounded. - * In other words, this method creates a read & write stream, and invokes: - * - * CFReadStreamSetProperty(readStream, kCFStreamNetworkServiceType, kCFStreamNetworkServiceTypeVoIP); - * CFWriteStreamSetProperty(writeStream, kCFStreamNetworkServiceType, kCFStreamNetworkServiceTypeVoIP); - * - * Returns YES if successful, NO otherwise. - * - * Example usage: - * - * [asyncUdpSocket performBlock:^{ - * [asyncUdpSocket enableBackgroundingOnSocket]; - * }]; - * - * - * NOTE : Apple doesn't currently support backgrounding UDP sockets. (Only TCP for now). -**/ -//- (BOOL)enableBackgroundingOnSockets; - -#endif - -#pragma mark Utilities - -/** - * Extracting host/port/family information from raw address data. -**/ - -+ (nullable NSString *)hostFromAddress:(NSData *)address; -+ (uint16_t)portFromAddress:(NSData *)address; -+ (int)familyFromAddress:(NSData *)address; - -+ (BOOL)isIPv4Address:(NSData *)address; -+ (BOOL)isIPv6Address:(NSData *)address; - -+ (BOOL)getHost:(NSString * __nullable * __nullable)hostPtr port:(uint16_t * __nullable)portPtr fromAddress:(NSData *)address; -+ (BOOL)getHost:(NSString * __nullable * __nullable)hostPtr port:(uint16_t * __nullable)portPtr family:(int * __nullable)afPtr fromAddress:(NSData *)address; - -@end - -NS_ASSUME_NONNULL_END diff --git a/client/3rd/PacketProcessor/PacketProcessor/CocoaAsyncSocket/CocoaAsyncSocket.framework/Info.plist b/client/3rd/PacketProcessor/PacketProcessor/CocoaAsyncSocket/CocoaAsyncSocket.framework/Info.plist deleted file mode 100644 index ff682d01ff85e141b29c482ea414e6a1c179407e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 756 zcmZ8e%Wl&^6rCAbXn~SR(n4DZrQ!XMWv2wGtBTr03Q=fUJ8eKw&BU2FLv4@oqiRqk z)-3x2Nbm>!0mKT4Jxe6Mfj?l9+6{0w_nv#txw>oFRbxR5fdUXN?ciiDm7gKZjw zqH3qp7sM4C@+oW(YmeB}82F;Qn0EC(528e=M*;I}6K79{%=SnW2mc6S-xm_vZ8#+A z@xTpDoJj@AqF0)sa@S|h@Y;-Kq|}iMyJLKEVRqaY>vgR*V!zZ3Q4Wban$fa&m$s9f zSc>b+V{Ytj=!tl@SrzUwi&lusoI$gssO8cY6%J#STbw)%2cD&KYmY`IUbeU^1-#Q? zv`@T{d(!_L{fQ(SmHJLiS46QU;?q)#HTrz`t(%I8i^CPf_Z=#UYV_z(a-4lvvK->s zl48nDWmPRJE#?nZJT#QDRBESa2n=PVq--lIsv^t!sw97Y@DM|cz!WHh8nD43I0DDu z3-|$k!%0|#kKr2Jgs)))-@^~^2!4de@GJZVzr&vhpb0dMW>5~zq5@h%8hVa&)It=! WL2prv4$wO=3ItCwc$DNMp~FAq&E;_b diff --git a/client/3rd/PacketProcessor/PacketProcessor/CocoaAsyncSocket/CocoaAsyncSocket.framework/Modules/module.modulemap b/client/3rd/PacketProcessor/PacketProcessor/CocoaAsyncSocket/CocoaAsyncSocket.framework/Modules/module.modulemap deleted file mode 100644 index 6c90f597..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/CocoaAsyncSocket/CocoaAsyncSocket.framework/Modules/module.modulemap +++ /dev/null @@ -1,6 +0,0 @@ -framework module CocoaAsyncSocket { - umbrella header "CocoaAsyncSocket.h" - - export * - module * { export * } -} diff --git a/client/3rd/PacketProcessor/PacketProcessor/CocoaAsyncSocket/CocoaAsyncSocket.framework/_CodeSignature/CodeResources b/client/3rd/PacketProcessor/PacketProcessor/CocoaAsyncSocket/CocoaAsyncSocket.framework/_CodeSignature/CodeResources deleted file mode 100644 index f9371095..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/CocoaAsyncSocket/CocoaAsyncSocket.framework/_CodeSignature/CodeResources +++ /dev/null @@ -1,162 +0,0 @@ - - - - - files - - Headers/CocoaAsyncSocket.h - - 19xueMkhcDCf6A2ihyiTCDjWjd4= - - Headers/GCDAsyncSocket.h - - JwDJxahaKup9fnB5MJuoxDHbdDs= - - Headers/GCDAsyncUdpSocket.h - - 9hL7D86xSUKQ1TBRDa+fDNkDlqI= - - Info.plist - - eCKEB+C8HfC7DIu6eNc6P3wxyLo= - - Modules/module.modulemap - - +n94rYTWDjekX3imyh+PSyA9vgA= - - - files2 - - Headers/CocoaAsyncSocket.h - - hash - - 19xueMkhcDCf6A2ihyiTCDjWjd4= - - hash2 - - VpE7gL1U1p/0urO77FEjPNjY06qrttQJnalOd+6VYDQ= - - - Headers/GCDAsyncSocket.h - - hash - - JwDJxahaKup9fnB5MJuoxDHbdDs= - - hash2 - - JL0b2lWPgVphz/ekZLsGMKrShDXTK2YY53aKtusc9hk= - - - Headers/GCDAsyncUdpSocket.h - - hash - - 9hL7D86xSUKQ1TBRDa+fDNkDlqI= - - hash2 - - uNVm5yZ0jBhGDXZuAynPXvem1qcBvAVdWXAewQdJbh8= - - - Modules/module.modulemap - - hash - - +n94rYTWDjekX3imyh+PSyA9vgA= - - hash2 - - RoVn8xMeEnU3Izg0DtYjYL/krI8V7qw0sa7Ggf+08Rs= - - - - rules - - ^.* - - ^.*\.lproj/ - - optional - - weight - 1000 - - ^.*\.lproj/locversion.plist$ - - omit - - weight - 1100 - - ^Base\.lproj/ - - weight - 1010 - - ^version.plist$ - - - rules2 - - .*\.dSYM($|/) - - weight - 11 - - ^(.*/)?\.DS_Store$ - - omit - - weight - 2000 - - ^.* - - ^.*\.lproj/ - - optional - - weight - 1000 - - ^.*\.lproj/locversion.plist$ - - omit - - weight - 1100 - - ^Base\.lproj/ - - weight - 1010 - - ^Info\.plist$ - - omit - - weight - 20 - - ^PkgInfo$ - - omit - - weight - 20 - - ^embedded\.provisionprofile$ - - weight - 20 - - ^version\.plist$ - - weight - 20 - - - - diff --git a/client/3rd/PacketProcessor/PacketProcessor/Info.plist b/client/3rd/PacketProcessor/PacketProcessor/Info.plist deleted file mode 100644 index 5f5e9abf..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/Info.plist +++ /dev/null @@ -1,8 +0,0 @@ - - - - - CFBundleSignature - ???? - - diff --git a/client/3rd/PacketProcessor/PacketProcessor/PacketProcessor.h b/client/3rd/PacketProcessor/PacketProcessor/PacketProcessor.h deleted file mode 100644 index 861c4c10..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/PacketProcessor.h +++ /dev/null @@ -1,19 +0,0 @@ -// -// PacketProcessor.h -// PacketProcessor -// -// Created by sanchez on 20.12.2021. -// - -#import - -//! Project version number for PacketProcessor. -FOUNDATION_EXPORT double PacketProcessorVersionNumber; - -//! Project version string for PacketProcessor. -FOUNDATION_EXPORT const unsigned char PacketProcessorVersionString[]; - -// In this header, you should import all the public headers of your framework using statements like #import - - -#import "TunnelInterface.h" \ No newline at end of file diff --git a/client/3rd/PacketProcessor/PacketProcessor/TunnelInterface.h b/client/3rd/PacketProcessor/PacketProcessor/TunnelInterface.h deleted file mode 100644 index 5de27d9f..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/TunnelInterface.h +++ /dev/null @@ -1,23 +0,0 @@ -// -// TunnelInterface.h -// Potatso -// -// Created by LEI on 12/23/15. -// Copyright © 2015 TouchingApp. All rights reserved. -// - -#import - -@import NetworkExtension; - -#define TunnelMTU 1600 -#define kTun2SocksStoppedNotification @"kTun2SocksStoppedNotification" - -@interface TunnelInterface : NSObject -+ (TunnelInterface *)sharedInterface; -+ (NSError *)setupWithPacketTunnelFlow:(NEPacketTunnelFlow *)packetFlow; -+ (void)processPackets; -+ (void)writePacket: (NSData *)packet; -+ (void)startTun2Socks: (int)socksServerPort; -+ (void)stop; -@end diff --git a/client/3rd/PacketProcessor/PacketProcessor/TunnelInterface.m b/client/3rd/PacketProcessor/PacketProcessor/TunnelInterface.m deleted file mode 100644 index 4a875ed1..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/TunnelInterface.m +++ /dev/null @@ -1,239 +0,0 @@ -// -// TunnelInterface.m -// Potatso -// -// Created by LEI on 12/23/15. -// Copyright © 2015 TouchingApp. All rights reserved. -// - -#import "TunnelInterface.h" -#import -#import "ipv4/lwip/ip4.h" -#import "lwip/udp.h" -#import "lwip/ip.h" -#import -#import "inet_chksum.h" -#import "tun2socks/tun2socks.h" -@import CocoaAsyncSocket; - -#define kTunnelInterfaceErrorDomain [NSString stringWithFormat:@"%@.TunnelInterface", [[NSBundle mainBundle] bundleIdentifier]] - -@interface TunnelInterface () -@property (nonatomic) NEPacketTunnelFlow *tunnelPacketFlow; -@property (nonatomic) NSMutableDictionary *udpSession; -@property (nonatomic) GCDAsyncUdpSocket *udpSocket; -@property (nonatomic) int readFd; -@property (nonatomic) int writeFd; -@end - -@implementation TunnelInterface - -+ (TunnelInterface *)sharedInterface { - static dispatch_once_t onceToken; - static TunnelInterface *interface; - dispatch_once(&onceToken, ^{ - interface = [TunnelInterface new]; - }); - return interface; -} - -- (instancetype)init { - self = [super init]; - if (self) { - _udpSession = [NSMutableDictionary dictionaryWithCapacity:5]; - _udpSocket = [[GCDAsyncUdpSocket alloc] initWithDelegate:self delegateQueue:dispatch_queue_create("udp", NULL)]; - } - return self; -} - -+ (NSError *)setupWithPacketTunnelFlow:(NEPacketTunnelFlow *)packetFlow { - if (packetFlow == nil) { - return [NSError errorWithDomain:kTunnelInterfaceErrorDomain code:1 userInfo:@{NSLocalizedDescriptionKey: @"PacketTunnelFlow can't be nil."}]; - } - [TunnelInterface sharedInterface].tunnelPacketFlow = packetFlow; - - NSError *error; - GCDAsyncUdpSocket *udpSocket = [TunnelInterface sharedInterface].udpSocket; - [udpSocket bindToPort:0 error:&error]; - if (error) { - return [NSError errorWithDomain:kTunnelInterfaceErrorDomain code:1 userInfo:@{NSLocalizedDescriptionKey: [NSString stringWithFormat:@"UDP bind fail(%@).", [error localizedDescription]]}]; - } - [udpSocket beginReceiving:&error]; - if (error) { - return [NSError errorWithDomain:kTunnelInterfaceErrorDomain code:1 userInfo:@{NSLocalizedDescriptionKey: [NSString stringWithFormat:@"UDP bind fail(%@).", [error localizedDescription]]}]; - } - - int fds[2]; - if (pipe(fds) < 0) { - return [NSError errorWithDomain:kTunnelInterfaceErrorDomain code:-1 userInfo:@{NSLocalizedDescriptionKey: @"Unable to pipe."}]; - } - [TunnelInterface sharedInterface].readFd = fds[0]; - [TunnelInterface sharedInterface].writeFd = fds[1]; - return nil; -} - -+ (void)startTun2Socks: (int)socksServerPort { - [NSThread detachNewThreadSelector:@selector(_startTun2Socks:) toTarget:[TunnelInterface sharedInterface] withObject:@(socksServerPort)]; -} - -+ (void)stop { - stop_tun2socks(); -} - -+ (void)writePacket:(NSData *)packet { - dispatch_async(dispatch_get_main_queue(), ^{ - [[TunnelInterface sharedInterface].tunnelPacketFlow writePackets:@[packet] withProtocols:@[@(AF_INET)]]; - }); -} - -+ (void)processPackets { - __weak typeof(self) weakSelf = self; - [[TunnelInterface sharedInterface].tunnelPacketFlow readPacketsWithCompletionHandler:^(NSArray * _Nonnull packets, NSArray * _Nonnull protocols) { - for (NSData *packet in packets) { - uint8_t *data = (uint8_t *)packet.bytes; - struct ip_hdr *iphdr = (struct ip_hdr *)data; - uint8_t proto = IPH_PROTO(iphdr); - if (proto == IP_PROTO_UDP) { - [[TunnelInterface sharedInterface] handleUDPPacket:packet]; - }else if (proto == IP_PROTO_TCP) { - [[TunnelInterface sharedInterface] handleTCPPPacket:packet]; - } - } - [weakSelf processPackets]; - }]; - -} - -- (void)_startTun2Socks: (NSNumber *)socksServerPort { - char socks_server[50]; - sprintf(socks_server, "127.0.0.1:%d", (int)([socksServerPort integerValue])); -#if TCP_DATA_LOG_ENABLE - char *log_lvel = "debug"; -#else - char *log_lvel = "none"; -#endif - char *argv[] = { - "tun2socks", - "--netif-ipaddr", - "192.0.2.4", - "--netif-netmask", - "255.255.255.0", - "--loglevel", - log_lvel, - "--socks-server-addr", - socks_server - }; - tun2socks_main(sizeof(argv)/sizeof(argv[0]), argv, self.readFd, TunnelMTU); - close(self.readFd); - close(self.writeFd); - [[NSNotificationCenter defaultCenter] postNotificationName:kTun2SocksStoppedNotification object:nil]; -} - -- (void)handleTCPPPacket: (NSData *)packet { - uint8_t message[TunnelMTU+2]; - memcpy(message + 2, packet.bytes, packet.length); - message[0] = packet.length / 256; - message[1] = packet.length % 256; - write(self.writeFd , message , packet.length + 2); -} - -- (void)handleUDPPacket: (NSData *)packet { - uint8_t *data = (uint8_t *)packet.bytes; - int data_len = (int)packet.length; - struct ip_hdr *iphdr = (struct ip_hdr *)data; - uint8_t version = IPH_V(iphdr); - - switch (version) { - case 4: { - uint16_t iphdr_hlen = IPH_HL(iphdr) * 4; - data = data + iphdr_hlen; - data_len -= iphdr_hlen; - struct udp_hdr *udphdr = (struct udp_hdr *)data; - - data = data + sizeof(struct udp_hdr *); - data_len -= sizeof(struct udp_hdr *); - - NSData *outData = [[NSData alloc] initWithBytes:data length:data_len]; - struct in_addr dest = { iphdr->dest.addr }; - NSString *destHost = [NSString stringWithUTF8String:inet_ntoa(dest)]; - NSString *key = [self strForHost:iphdr->dest.addr port:udphdr->dest]; - NSString *value = [self strForHost:iphdr->src.addr port:udphdr->src];; - self.udpSession[key] = value; - [self.udpSocket sendData:outData toHost:destHost port:ntohs(udphdr->dest) withTimeout:30 tag:0]; - } break; - case 6: { - - } break; - } -} - -- (void)udpSocket:(GCDAsyncUdpSocket *)sock didReceiveData:(NSData *)data fromAddress:(NSData *)address withFilterContext:(id)filterContext { - const struct sockaddr_in *addr = (const struct sockaddr_in *)[address bytes]; - ip_addr_p_t dest ={ addr->sin_addr.s_addr }; - in_port_t dest_port = addr->sin_port; - NSString *strHostPort = self.udpSession[[self strForHost:dest.addr port:dest_port]]; - NSArray *hostPortArray = [strHostPort componentsSeparatedByString:@":"]; - int src_ip = [hostPortArray[0] intValue]; - int src_port = [hostPortArray[1] intValue]; - uint8_t *bytes = (uint8_t *)[data bytes]; - int bytes_len = (int)data.length; - int udp_length = sizeof(struct udp_hdr) + bytes_len; - int total_len = IP_HLEN + udp_length; - - ip_addr_p_t src = {src_ip}; - struct ip_hdr *iphdr = generateNewIPHeader(IP_PROTO_UDP, dest, src, total_len); - - struct udp_hdr udphdr; - udphdr.src = dest_port; - udphdr.dest = src_port; - udphdr.len = hton16(udp_length); - udphdr.chksum = hton16(0); - - uint8_t *udpdata = malloc(sizeof(uint8_t) * udp_length); - memcpy(udpdata, &udphdr, sizeof(struct udp_hdr)); - memcpy(udpdata + sizeof(struct udp_hdr), bytes, bytes_len); - - ip_addr_t odest = { dest.addr }; - ip_addr_t osrc = { src_ip }; - - struct pbuf *p_udp = pbuf_alloc(PBUF_TRANSPORT, udp_length, PBUF_RAM); - pbuf_take(p_udp, udpdata, udp_length); - - struct udp_hdr *new_udphdr = (struct udp_hdr *) p_udp->payload; - new_udphdr->chksum = inet_chksum_pseudo(p_udp, IP_PROTO_UDP, p_udp->len, &odest, &osrc); - - uint8_t *ipdata = malloc(sizeof(uint8_t) * total_len); - memcpy(ipdata, iphdr, IP_HLEN); - memcpy(ipdata + sizeof(struct ip_hdr), p_udp->payload, udp_length); - - NSData *outData = [[NSData alloc] initWithBytes:ipdata length:total_len]; - free(ipdata); - free(iphdr); - free(udpdata); - pbuf_free(p_udp); - [TunnelInterface writePacket:outData]; -} - -struct ip_hdr *generateNewIPHeader(u8_t proto, ip_addr_p_t src, ip_addr_p_t dest, uint16_t total_len) { - struct ip_hdr *iphdr = malloc(sizeof(struct ip_hdr)); - IPH_VHL_SET(iphdr, 4, IP_HLEN / 4); - IPH_TOS_SET(iphdr, 0); - IPH_LEN_SET(iphdr, htons(total_len)); - IPH_ID_SET(iphdr, 0); - IPH_OFFSET_SET(iphdr, 0); - IPH_TTL_SET(iphdr, 64); - IPH_PROTO_SET(iphdr, IP_PROTO_UDP); - iphdr->src = src; - iphdr->dest = dest; - IPH_CHKSUM_SET(iphdr, 0); - IPH_CHKSUM_SET(iphdr, inet_chksum(iphdr, IP_HLEN)); - return iphdr; -} - -- (NSString *)strForHost: (int)host port: (int)port { - return [NSString stringWithFormat:@"%d:%d",host, port]; -} - - - -@end diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/base/BLog.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/base/BLog.h deleted file mode 100644 index b1881a5e..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/base/BLog.h +++ /dev/null @@ -1,400 +0,0 @@ -/** - * @file BLog.h - * @author Ambroz Bizjak - * - * @section LICENSE - * - * 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 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE 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. - * - * @section DESCRIPTION - * - * A global object for logging. - */ - -#ifndef BADVPN_BLOG_H -#define BADVPN_BLOG_H - -#include -#include - -#include "misc/debug.h" -#include "misc/memref.h" -#include "base/BMutex.h" - -// auto-generated channel numbers and number of channels -#include "generated/blog_channels_defines.h" - -// keep in sync with level names in BLog.c! -#define BLOG_ERROR 1 -#define BLOG_WARNING 2 -#define BLOG_NOTICE 3 -#define BLOG_INFO 4 -#define BLOG_DEBUG 5 - -#define BLog(...) BLog_LogToChannel(BLOG_CURRENT_CHANNEL, __VA_ARGS__) -#define BContextLog(context, ...) BLog_ContextLog((context), BLOG_CURRENT_CHANNEL, __VA_ARGS__) -#define BLOG_CCCC(context) BLog_MakeChannelContext((context), BLOG_CURRENT_CHANNEL) - -typedef void (*_BLog_log_func) (int channel, int level, const char *msg); -typedef void (*_BLog_free_func) (void); - -struct _BLog_channel { - const char *name; - int loglevel; -}; - -struct _BLog_global { - #ifndef NDEBUG - int initialized; // initialized statically - #endif - struct _BLog_channel channels[BLOG_NUM_CHANNELS]; - _BLog_log_func log_func; - _BLog_free_func free_func; - BMutex mutex; -#ifndef NDEBUG - int logging; -#endif - char logbuf[2048]; - int logbuf_pos; -}; - -extern struct _BLog_channel blog_channel_list[]; -extern struct _BLog_global blog_global; - -typedef void (*BLog_logfunc) (void *); - -typedef struct { - BLog_logfunc logfunc; - void *logfunc_user; -} BLogContext; - -typedef struct { - BLogContext context; - int channel; -} BLogChannelContext; - -static int BLogGlobal_GetChannelByName (const char *channel_name); - -static void BLog_Init (_BLog_log_func log_func, _BLog_free_func free_func); -static void BLog_Free (void); -static void BLog_SetChannelLoglevel (int channel, int loglevel); -static int BLog_WouldLog (int channel, int level); -static void BLog_Begin (void); -static void BLog_AppendVarArg (const char *fmt, va_list vl); -static void BLog_Append (const char *fmt, ...); -static void BLog_AppendBytes (MemRef data); -static void BLog_Finish (int channel, int level); -static void BLog_LogToChannelVarArg (int channel, int level, const char *fmt, va_list vl); -static void BLog_LogToChannel (int channel, int level, const char *fmt, ...); -static void BLog_LogViaFuncVarArg (BLog_logfunc func, void *arg, int channel, int level, const char *fmt, va_list vl); -static void BLog_LogViaFunc (BLog_logfunc func, void *arg, int channel, int level, const char *fmt, ...); -static BLogContext BLog_RootContext (void); -static BLogContext BLog_MakeContext (BLog_logfunc logfunc, void *logfunc_user); -static void BLog_ContextLogVarArg (BLogContext context, int channel, int level, const char *fmt, va_list vl); -static void BLog_ContextLog (BLogContext context, int channel, int level, const char *fmt, ...); -static BLogChannelContext BLog_MakeChannelContext (BLogContext context, int channel); -static void BLog_ChannelContextLogVarArg (BLogChannelContext ccontext, int level, const char *fmt, va_list vl); -static void BLog_ChannelContextLog (BLogChannelContext ccontext, int level, const char *fmt, ...); - -void BLog_InitStdout (void); -void BLog_InitStderr (void); - -int BLogGlobal_GetChannelByName (const char *channel_name) -{ - int i; - for (i = 0; i < BLOG_NUM_CHANNELS; i++) { - if (!strcmp(blog_channel_list[i].name, channel_name)) { - return i; - } - } - - return -1; -} - -void BLog_Init (_BLog_log_func log_func, _BLog_free_func free_func) -{ - ASSERT(!blog_global.initialized) - - #ifndef NDEBUG - blog_global.initialized = 1; - #endif - - // initialize channels - memcpy(blog_global.channels, blog_channel_list, BLOG_NUM_CHANNELS * sizeof(struct _BLog_channel)); - - blog_global.log_func = log_func; - blog_global.free_func = free_func; -#ifndef NDEBUG - blog_global.logging = 0; -#endif - blog_global.logbuf_pos = 0; - blog_global.logbuf[0] = '\0'; - - ASSERT_FORCE(BMutex_Init(&blog_global.mutex)) -} - -void BLog_Free (void) -{ - ASSERT(blog_global.initialized) -#ifndef NDEBUG - ASSERT(!blog_global.logging) -#endif - - BMutex_Free(&blog_global.mutex); - - #ifndef NDEBUG - blog_global.initialized = 0; - #endif - - blog_global.free_func(); -} - -void BLog_SetChannelLoglevel (int channel, int loglevel) -{ - ASSERT(blog_global.initialized) - ASSERT(channel >= 0 && channel < BLOG_NUM_CHANNELS) - ASSERT(loglevel >= 0 && loglevel <= BLOG_DEBUG) - - blog_global.channels[channel].loglevel = loglevel; -} - -int BLog_WouldLog (int channel, int level) -{ - ASSERT(blog_global.initialized) - ASSERT(channel >= 0 && channel < BLOG_NUM_CHANNELS) - ASSERT(level >= BLOG_ERROR && level <= BLOG_DEBUG) - - return (level <= blog_global.channels[channel].loglevel); -} - -void BLog_Begin (void) -{ - ASSERT(blog_global.initialized) - - BMutex_Lock(&blog_global.mutex); - -#ifndef NDEBUG - ASSERT(!blog_global.logging) - blog_global.logging = 1; -#endif -} - -void BLog_AppendVarArg (const char *fmt, va_list vl) -{ - ASSERT(blog_global.initialized) -#ifndef NDEBUG - ASSERT(blog_global.logging) -#endif - ASSERT(blog_global.logbuf_pos >= 0) - ASSERT(blog_global.logbuf_pos < sizeof(blog_global.logbuf)) - - int w = vsnprintf(blog_global.logbuf + blog_global.logbuf_pos, sizeof(blog_global.logbuf) - blog_global.logbuf_pos, fmt, vl); - - if (w >= sizeof(blog_global.logbuf) - blog_global.logbuf_pos) { - blog_global.logbuf_pos = sizeof(blog_global.logbuf) - 1; - } else { - blog_global.logbuf_pos += w; - } -} - -void BLog_Append (const char *fmt, ...) -{ - ASSERT(blog_global.initialized) -#ifndef NDEBUG - ASSERT(blog_global.logging) -#endif - - va_list vl; - va_start(vl, fmt); - BLog_AppendVarArg(fmt, vl); - va_end(vl); -} - -void BLog_AppendBytes (MemRef data) -{ - ASSERT(blog_global.initialized) -#ifndef NDEBUG - ASSERT(blog_global.logging) -#endif - ASSERT(blog_global.logbuf_pos >= 0) - ASSERT(blog_global.logbuf_pos < sizeof(blog_global.logbuf)) - - size_t avail = (sizeof(blog_global.logbuf) - 1) - blog_global.logbuf_pos; - data.len = (data.len > avail ? avail : data.len); - - memcpy(blog_global.logbuf + blog_global.logbuf_pos, data.ptr, data.len); - blog_global.logbuf_pos += data.len; - blog_global.logbuf[blog_global.logbuf_pos] = '\0'; -} - -void BLog_Finish (int channel, int level) -{ - ASSERT(blog_global.initialized) -#ifndef NDEBUG - ASSERT(blog_global.logging) -#endif - ASSERT(channel >= 0 && channel < BLOG_NUM_CHANNELS) - ASSERT(level >= BLOG_ERROR && level <= BLOG_DEBUG) - ASSERT(BLog_WouldLog(channel, level)) - - ASSERT(blog_global.logbuf_pos >= 0) - ASSERT(blog_global.logbuf_pos < sizeof(blog_global.logbuf)) - ASSERT(blog_global.logbuf[blog_global.logbuf_pos] == '\0') - - blog_global.log_func(channel, level, blog_global.logbuf); - -#ifndef NDEBUG - blog_global.logging = 0; -#endif - blog_global.logbuf_pos = 0; - blog_global.logbuf[0] = '\0'; - - BMutex_Unlock(&blog_global.mutex); -} - -void BLog_LogToChannelVarArg (int channel, int level, const char *fmt, va_list vl) -{ - ASSERT(blog_global.initialized) - ASSERT(channel >= 0 && channel < BLOG_NUM_CHANNELS) - ASSERT(level >= BLOG_ERROR && level <= BLOG_DEBUG) - - if (!BLog_WouldLog(channel, level)) { - return; - } - - BLog_Begin(); - BLog_AppendVarArg(fmt, vl); - BLog_Finish(channel, level); -} - -void BLog_LogToChannel (int channel, int level, const char *fmt, ...) -{ - ASSERT(blog_global.initialized) - ASSERT(channel >= 0 && channel < BLOG_NUM_CHANNELS) - ASSERT(level >= BLOG_ERROR && level <= BLOG_DEBUG) - - if (!BLog_WouldLog(channel, level)) { - return; - } - - va_list vl; - va_start(vl, fmt); - - BLog_Begin(); - BLog_AppendVarArg(fmt, vl); - BLog_Finish(channel, level); - - va_end(vl); -} - -void BLog_LogViaFuncVarArg (BLog_logfunc func, void *arg, int channel, int level, const char *fmt, va_list vl) -{ - ASSERT(blog_global.initialized) - ASSERT(channel >= 0 && channel < BLOG_NUM_CHANNELS) - ASSERT(level >= BLOG_ERROR && level <= BLOG_DEBUG) - - if (!BLog_WouldLog(channel, level)) { - return; - } - - BLog_Begin(); - func(arg); - BLog_AppendVarArg(fmt, vl); - BLog_Finish(channel, level); -} - -void BLog_LogViaFunc (BLog_logfunc func, void *arg, int channel, int level, const char *fmt, ...) -{ - ASSERT(blog_global.initialized) - ASSERT(channel >= 0 && channel < BLOG_NUM_CHANNELS) - ASSERT(level >= BLOG_ERROR && level <= BLOG_DEBUG) - - if (!BLog_WouldLog(channel, level)) { - return; - } - - va_list vl; - va_start(vl, fmt); - - BLog_Begin(); - func(arg); - BLog_AppendVarArg(fmt, vl); - BLog_Finish(channel, level); - - va_end(vl); -} - -static void BLog__root_logfunc (void *unused) -{ -} - -static BLogContext BLog_RootContext (void) -{ - return BLog_MakeContext(BLog__root_logfunc, NULL); -} - -static BLogContext BLog_MakeContext (BLog_logfunc logfunc, void *logfunc_user) -{ - ASSERT(logfunc) - - BLogContext context; - context.logfunc = logfunc; - context.logfunc_user = logfunc_user; - return context; -} - -static void BLog_ContextLogVarArg (BLogContext context, int channel, int level, const char *fmt, va_list vl) -{ - BLog_LogViaFuncVarArg(context.logfunc, context.logfunc_user, channel, level, fmt, vl); -} - -static void BLog_ContextLog (BLogContext context, int channel, int level, const char *fmt, ...) -{ - va_list vl; - va_start(vl, fmt); - BLog_ContextLogVarArg(context, channel, level, fmt, vl); - va_end(vl); -} - -static BLogChannelContext BLog_MakeChannelContext (BLogContext context, int channel) -{ - BLogChannelContext ccontext; - ccontext.context = context; - ccontext.channel = channel; - return ccontext; -} - -static void BLog_ChannelContextLogVarArg (BLogChannelContext ccontext, int level, const char *fmt, va_list vl) -{ - BLog_ContextLogVarArg(ccontext.context, ccontext.channel, level, fmt, vl); -} - -static void BLog_ChannelContextLog (BLogChannelContext ccontext, int level, const char *fmt, ...) -{ - va_list vl; - va_start(vl, fmt); - BLog_ChannelContextLogVarArg(ccontext, level, fmt, vl); - va_end(vl); -} - -#endif diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/base/BLog.m b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/base/BLog.m deleted file mode 100644 index 18c79c24..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/base/BLog.m +++ /dev/null @@ -1,75 +0,0 @@ -/** - * @file BLog.c - * @author Ambroz Bizjak - * - * @section LICENSE - * - * 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 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE 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. - */ - -#include -#include -#include - -#include "BLog.h" - -#ifndef BADVPN_PLUGIN - -struct _BLog_channel blog_channel_list[] = { -#include "generated/blog_channels_list.h" -}; - -struct _BLog_global blog_global = { - #ifndef NDEBUG - 0 - #endif -}; - -#endif - -// keep in sync with level numbers in BLog.h! -static char *level_names[] = { NULL, "ERROR", "WARNING", "NOTICE", "INFO", "DEBUG" }; - -static void stdout_log (int channel, int level, const char *msg) -{ - NSLog(@"%s(%s): %s\n", level_names[level], blog_global.channels[channel].name, msg); -} - -static void stderr_log (int channel, int level, const char *msg) -{ - NSLog(@"%s(%s): %s\n", level_names[level], blog_global.channels[channel].name, msg); -} - -static void stdout_stderr_free (void) -{ -} - -void BLog_InitStdout (void) -{ - BLog_Init(stdout_log, stdout_stderr_free); -} - -void BLog_InitStderr (void) -{ - BLog_Init(stderr_log, stdout_stderr_free); -} diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/base/BLog_syslog.c b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/base/BLog_syslog.c deleted file mode 100644 index b32bbd44..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/base/BLog_syslog.c +++ /dev/null @@ -1,150 +0,0 @@ -/** - * @file BLog_syslog.c - * @author Ambroz Bizjak - * - * @section LICENSE - * - * 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 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE 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. - */ - -#include -#include -#include - -#include "misc/debug.h" - -#include "BLog_syslog.h" - -static int resolve_facility (char *str, int *out) -{ - if (!strcmp(str, "authpriv")) { - *out = LOG_AUTHPRIV; - } - else if (!strcmp(str, "cron")) { - *out = LOG_CRON; - } - else if (!strcmp(str, "daemon")) { - *out = LOG_DAEMON; - } - else if (!strcmp(str, "ftp")) { - *out = LOG_FTP; - } - else if (!strcmp(str, "local0")) { - *out = LOG_LOCAL0; - } - else if (!strcmp(str, "local1")) { - *out = LOG_LOCAL1; - } - else if (!strcmp(str, "local2")) { - *out = LOG_LOCAL2; - } - else if (!strcmp(str, "local3")) { - *out = LOG_LOCAL3; - } - else if (!strcmp(str, "local4")) { - *out = LOG_LOCAL4; - } - else if (!strcmp(str, "local5")) { - *out = LOG_LOCAL5; - } - else if (!strcmp(str, "local6")) { - *out = LOG_LOCAL6; - } - else if (!strcmp(str, "local7")) { - *out = LOG_LOCAL7; - } - else if (!strcmp(str, "lpr")) { - *out = LOG_LPR; - } - else if (!strcmp(str, "mail")) { - *out = LOG_MAIL; - } - else if (!strcmp(str, "news")) { - *out = LOG_NEWS; - } - else if (!strcmp(str, "syslog")) { - *out = LOG_SYSLOG; - } - else if (!strcmp(str, "user")) { - *out = LOG_USER; - } - else if (!strcmp(str, "uucp")) { - *out = LOG_UUCP; - } - else { - return 0; - } - - return 1; -} - -static int convert_level (int level) -{ - ASSERT(level >= BLOG_ERROR && level <= BLOG_DEBUG) - - switch (level) { - case BLOG_ERROR: - return LOG_ERR; - case BLOG_WARNING: - return LOG_WARNING; - case BLOG_NOTICE: - return LOG_NOTICE; - case BLOG_INFO: - return LOG_INFO; - case BLOG_DEBUG: - return LOG_DEBUG; - default: - ASSERT(0) - return 0; - } -} - -static struct { - char ident[200]; -} syslog_global; - -static void syslog_log (int channel, int level, const char *msg) -{ - syslog(convert_level(level), "%s: %s", blog_global.channels[channel].name, msg); -} - -static void syslog_free (void) -{ - closelog(); -} - -int BLog_InitSyslog (char *ident, char *facility_str) -{ - int facility; - if (!resolve_facility(facility_str, &facility)) { - return 0; - } - - snprintf(syslog_global.ident, sizeof(syslog_global.ident), "%s", ident); - - openlog(syslog_global.ident, 0, facility); - - BLog_Init(syslog_log, syslog_free); - - return 1; -} diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/base/BLog_syslog.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/base/BLog_syslog.h deleted file mode 100644 index 234af902..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/base/BLog_syslog.h +++ /dev/null @@ -1,42 +0,0 @@ -/** - * @file BLog_syslog.h - * @author Ambroz Bizjak - * - * @section LICENSE - * - * 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 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE 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. - * - * @section DESCRIPTION - * - * BLog syslog backend. - */ - -#ifndef BADVPN_BLOG_SYSLOG_H -#define BADVPN_BLOG_SYSLOG_H - -#include "misc/debug.h" -#include "base/BLog.h" - -int BLog_InitSyslog (char *ident, char *facility) WARN_UNUSED; - -#endif diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/base/BMutex.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/base/BMutex.h deleted file mode 100644 index 2990c674..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/base/BMutex.h +++ /dev/null @@ -1,101 +0,0 @@ -/** - * @file BMutex.h - * @author Ambroz Bizjak - * - * @section LICENSE - * - * 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 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE 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. - */ - -#ifndef BADVPN_BMUTEX_H -#define BADVPN_BMUTEX_H - -#if !defined(BADVPN_THREAD_SAFE) || (BADVPN_THREAD_SAFE != 0 && BADVPN_THREAD_SAFE != 1) -#error BADVPN_THREAD_SAFE is not defined or incorrect -#endif - -#if BADVPN_THREAD_SAFE -#include -#endif - -#include "misc/debug.h" -#include "base/DebugObject.h" - -typedef struct { -#if BADVPN_THREAD_SAFE - pthread_mutex_t pthread_mutex; -#endif - DebugObject d_obj; -} BMutex; - -static int BMutex_Init (BMutex *o) WARN_UNUSED; -static void BMutex_Free (BMutex *o); -static void BMutex_Lock (BMutex *o); -static void BMutex_Unlock (BMutex *o); - -static int BMutex_Init (BMutex *o) -{ -#if BADVPN_THREAD_SAFE - if (pthread_mutex_init(&o->pthread_mutex, NULL) != 0) { - return 0; - } -#endif - - DebugObject_Init(&o->d_obj); - return 1; -} - -static void BMutex_Free (BMutex *o) -{ - DebugObject_Free(&o->d_obj); - -#if BADVPN_THREAD_SAFE - int res = pthread_mutex_destroy(&o->pthread_mutex); - B_USE(res) - ASSERT(res == 0) -#endif -} - -static void BMutex_Lock (BMutex *o) -{ - DebugObject_Access(&o->d_obj); - -#if BADVPN_THREAD_SAFE - int res = pthread_mutex_lock(&o->pthread_mutex); - B_USE(res) - ASSERT(res == 0) -#endif -} - -static void BMutex_Unlock (BMutex *o) -{ - DebugObject_Access(&o->d_obj); - -#if BADVPN_THREAD_SAFE - int res = pthread_mutex_unlock(&o->pthread_mutex); - B_USE(res) - ASSERT(res == 0) -#endif -} - -#endif diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/base/BPending.c b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/base/BPending.c deleted file mode 100644 index 474e974e..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/base/BPending.c +++ /dev/null @@ -1,205 +0,0 @@ -/** - * @file BPending.c - * @author Ambroz Bizjak - * - * @section LICENSE - * - * 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 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE 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. - */ - -#include - -#include "misc/debug.h" -#include "misc/offset.h" - -#include "BPending.h" - -#include "BPending_list.h" -#include "structure/SLinkedList_impl.h" - -void BPendingGroup_Init (BPendingGroup *g) -{ - // init jobs list - BPending__List_Init(&g->jobs); - - // init pending counter - DebugCounter_Init(&g->pending_ctr); - - // init debug object - DebugObject_Init(&g->d_obj); -} - -void BPendingGroup_Free (BPendingGroup *g) -{ - DebugCounter_Free(&g->pending_ctr); - ASSERT(BPending__List_IsEmpty(&g->jobs)) - DebugObject_Free(&g->d_obj); -} - -int BPendingGroup_HasJobs (BPendingGroup *g) -{ - DebugObject_Access(&g->d_obj); - - return !BPending__List_IsEmpty(&g->jobs); -} - -void BPendingGroup_ExecuteJob (BPendingGroup *g) -{ - ASSERT(!BPending__List_IsEmpty(&g->jobs)) - DebugObject_Access(&g->d_obj); - - // get a job - BSmallPending *p = BPending__List_First(&g->jobs); - ASSERT(!BPending__ListIsRemoved(p)) - ASSERT(p->pending) - - // remove from jobs list - BPending__List_RemoveFirst(&g->jobs); - - // set not pending - BPending__ListMarkRemoved(p); -#ifndef NDEBUG - p->pending = 0; -#endif - - // execute job - p->handler(p->user); - return; -} - -BSmallPending * BPendingGroup_PeekJob (BPendingGroup *g) -{ - DebugObject_Access(&g->d_obj); - - return BPending__List_First(&g->jobs); -} - -void BSmallPending_Init (BSmallPending *o, BPendingGroup *g, BSmallPending_handler handler, void *user) -{ - // init arguments - o->handler = handler; - o->user = user; - - // set not pending - BPending__ListMarkRemoved(o); -#ifndef NDEBUG - o->pending = 0; -#endif - - // increment pending counter - DebugCounter_Increment(&g->pending_ctr); - - // init debug object - DebugObject_Init(&o->d_obj); -} - -void BSmallPending_Free (BSmallPending *o, BPendingGroup *g) -{ - DebugCounter_Decrement(&g->pending_ctr); - DebugObject_Free(&o->d_obj); - ASSERT(o->pending == !BPending__ListIsRemoved(o)) - - // remove from jobs list - if (!BPending__ListIsRemoved(o)) { - BPending__List_Remove(&g->jobs, o); - } -} - -void BSmallPending_SetHandler (BSmallPending *o, BSmallPending_handler handler, void *user) -{ - DebugObject_Access(&o->d_obj); - - // set handler - o->handler = handler; - o->user = user; -} - -void BSmallPending_Set (BSmallPending *o, BPendingGroup *g) -{ - DebugObject_Access(&o->d_obj); - ASSERT(o->pending == !BPending__ListIsRemoved(o)) - - // remove from jobs list - if (!BPending__ListIsRemoved(o)) { - BPending__List_Remove(&g->jobs, o); - } - - // insert to jobs list - BPending__List_Prepend(&g->jobs, o); - - // set pending -#ifndef NDEBUG - o->pending = 1; -#endif -} - -void BSmallPending_Unset (BSmallPending *o, BPendingGroup *g) -{ - DebugObject_Access(&o->d_obj); - ASSERT(o->pending == !BPending__ListIsRemoved(o)) - - if (!BPending__ListIsRemoved(o)) { - // remove from jobs list - BPending__List_Remove(&g->jobs, o); - - // set not pending - BPending__ListMarkRemoved(o); -#ifndef NDEBUG - o->pending = 0; -#endif - } -} - -int BSmallPending_IsSet (BSmallPending *o) -{ - DebugObject_Access(&o->d_obj); - ASSERT(o->pending == !BPending__ListIsRemoved(o)) - - return !BPending__ListIsRemoved(o); -} - -void BPending_Init (BPending *o, BPendingGroup *g, BPending_handler handler, void *user) -{ - BSmallPending_Init(&o->base, g, handler, user); - o->g = g; -} - -void BPending_Free (BPending *o) -{ - BSmallPending_Free(&o->base, o->g); -} - -void BPending_Set (BPending *o) -{ - BSmallPending_Set(&o->base, o->g); -} - -void BPending_Unset (BPending *o) -{ - BSmallPending_Unset(&o->base, o->g); -} - -int BPending_IsSet (BPending *o) -{ - return BSmallPending_IsSet(&o->base); -} diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/base/BPending.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/base/BPending.h deleted file mode 100644 index 76044d14..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/base/BPending.h +++ /dev/null @@ -1,250 +0,0 @@ -/** - * @file BPending.h - * @author Ambroz Bizjak - * - * @section LICENSE - * - * 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 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE 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. - * - * @section DESCRIPTION - * - * Module for managing a queue of jobs pending execution. - */ - -#ifndef BADVPN_BPENDING_H -#define BADVPN_BPENDING_H - -#include - -#include "misc/debugcounter.h" -#include "structure/SLinkedList.h" -#include "base/DebugObject.h" - -struct BSmallPending_s; - -#include "BPending_list.h" -#include "structure/SLinkedList_decl.h" - -/** - * Job execution handler. - * It is guaranteed that the associated {@link BSmallPending} object was - * in set state. - * The {@link BSmallPending} object enters not set state before the handler - * is called. - * - * @param user as in {@link BSmallPending_Init} - */ -typedef void (*BSmallPending_handler) (void *user); - -/** - * Job execution handler. - * It is guaranteed that the associated {@link BPending} object was - * in set state. - * The {@link BPending} object enters not set state before the handler - * is called. - * - * @param user as in {@link BPending_Init} - */ -typedef void (*BPending_handler) (void *user); - -/** - * Object that contains a list of jobs pending execution. - */ -typedef struct { - BPending__List jobs; - DebugCounter pending_ctr; - DebugObject d_obj; -} BPendingGroup; - -/** - * Object for queuing a job for execution. - */ -typedef struct BSmallPending_s { - BPending_handler handler; - void *user; - BPending__ListNode pending_node; // optimization: if not pending, .next is this -#ifndef NDEBUG - uint8_t pending; -#endif - DebugObject d_obj; -} BSmallPending; - -/** - * Object for queuing a job for execution. This is a convenience wrapper - * around {@link BSmallPending} with an extra field to remember the - * {@link BPendingGroup} being used. - */ -typedef struct { - BSmallPending base; - BPendingGroup *g; -} BPending; - -/** - * Initializes the object. - * - * @param g the object - */ -void BPendingGroup_Init (BPendingGroup *g); - -/** - * Frees the object. - * There must be no {@link BPending} or {@link BSmallPending} objects using - * this group. - * - * @param g the object - */ -void BPendingGroup_Free (BPendingGroup *g); - -/** - * Checks if there is at least one job in the queue. - * - * @param g the object - * @return 1 if there is at least one job, 0 if not - */ -int BPendingGroup_HasJobs (BPendingGroup *g); - -/** - * Executes the top job on the job list. - * The job is removed from the list and enters - * not set state before being executed. - * There must be at least one job in job list. - * - * @param g the object - */ -void BPendingGroup_ExecuteJob (BPendingGroup *g); - -/** - * Returns the top job on the job list, or NULL if there are none. - * - * @param g the object - * @return the top job if there is at least one job, NULL if not - */ -BSmallPending * BPendingGroup_PeekJob (BPendingGroup *g); - -/** - * Initializes the object. - * The object is initialized in not set state. - * - * @param o the object - * @param g pending group to use - * @param handler job execution handler - * @param user value to pass to handler - */ -void BSmallPending_Init (BSmallPending *o, BPendingGroup *g, BSmallPending_handler handler, void *user); - -/** - * Frees the object. - * The execution handler will not be called after the object - * is freed. - * - * @param o the object - * @param g pending group. Must be the same as was used in {@link BSmallPending_Init}. - */ -void BSmallPending_Free (BSmallPending *o, BPendingGroup *g); - -/** - * Changes the job execution handler. - * - * @param o the object - * @param handler job execution handler - * @param user value to pass to handler - */ -void BSmallPending_SetHandler (BSmallPending *o, BSmallPending_handler handler, void *user); - -/** - * Enables the job, pushing it to the top of the job list. - * If the object was already in set state, the job is removed from its - * current position in the list before being pushed. - * The object enters set state. - * - * @param o the object - * @param g pending group. Must be the same as was used in {@link BSmallPending_Init}. - */ -void BSmallPending_Set (BSmallPending *o, BPendingGroup *g); - -/** - * Disables the job, removing it from the job list. - * If the object was not in set state, nothing is done. - * The object enters not set state. - * - * @param o the object - * @param g pending group. Must be the same as was used in {@link BSmallPending_Init}. - */ -void BSmallPending_Unset (BSmallPending *o, BPendingGroup *g); - -/** - * Checks if the job is in set state. - * - * @param o the object - * @return 1 if in set state, 0 if not - */ -int BSmallPending_IsSet (BSmallPending *o); - -/** - * Initializes the object. - * The object is initialized in not set state. - * - * @param o the object - * @param g pending group to use - * @param handler job execution handler - * @param user value to pass to handler - */ -void BPending_Init (BPending *o, BPendingGroup *g, BPending_handler handler, void *user); - -/** - * Frees the object. - * The execution handler will not be called after the object - * is freed. - * - * @param o the object - */ -void BPending_Free (BPending *o); - -/** - * Enables the job, pushing it to the top of the job list. - * If the object was already in set state, the job is removed from its - * current position in the list before being pushed. - * The object enters set state. - * - * @param o the object - */ -void BPending_Set (BPending *o); - -/** - * Disables the job, removing it from the job list. - * If the object was not in set state, nothing is done. - * The object enters not set state. - * - * @param o the object - */ -void BPending_Unset (BPending *o); - -/** - * Checks if the job is in set state. - * - * @param o the object - * @return 1 if in set state, 0 if not - */ -int BPending_IsSet (BPending *o); - -#endif diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/base/BPending_list.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/base/BPending_list.h deleted file mode 100644 index eadac61a..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/base/BPending_list.h +++ /dev/null @@ -1,4 +0,0 @@ -#define SLINKEDLIST_PARAM_NAME BPending__List -#define SLINKEDLIST_PARAM_FEATURE_LAST 0 -#define SLINKEDLIST_PARAM_TYPE_ENTRY struct BSmallPending_s -#define SLINKEDLIST_PARAM_MEMBER_NODE pending_node diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/base/DebugObject.c b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/base/DebugObject.c deleted file mode 100644 index e6946177..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/base/DebugObject.c +++ /dev/null @@ -1,39 +0,0 @@ -/** - * @file DebugObject.c - * @author Ambroz Bizjak - * - * @section LICENSE - * - * 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 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE 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. - */ - -#include "DebugObject.h" - -#ifndef BADVPN_PLUGIN -#ifndef NDEBUG -DebugCounter debugobject_counter = DEBUGCOUNTER_STATIC; -#if BADVPN_THREAD_SAFE -pthread_mutex_t debugobject_mutex = PTHREAD_MUTEX_INITIALIZER; -#endif -#endif -#endif diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/base/DebugObject.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/base/DebugObject.h deleted file mode 100644 index aeb9974d..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/base/DebugObject.h +++ /dev/null @@ -1,147 +0,0 @@ -/** - * @file DebugObject.h - * @author Ambroz Bizjak - * - * @section LICENSE - * - * 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 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE 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. - * - * @section DESCRIPTION - * - * Object used for detecting leaks. - */ - -#ifndef BADVPN_DEBUGOBJECT_H -#define BADVPN_DEBUGOBJECT_H - -#include - -#if !defined(BADVPN_THREAD_SAFE) || (BADVPN_THREAD_SAFE != 0 && BADVPN_THREAD_SAFE != 1) -#error BADVPN_THREAD_SAFE is not defined or incorrect -#endif - -#if BADVPN_THREAD_SAFE -#include -#endif - -#include "misc/debug.h" -#include "misc/debugcounter.h" - -#define DEBUGOBJECT_VALID UINT32_C(0x31415926) - -/** - * Object used for detecting leaks. - */ -typedef struct { - #ifndef NDEBUG - uint32_t c; - #endif -} DebugObject; - -/** - * Initializes the object. - * - * @param obj the object - */ -static void DebugObject_Init (DebugObject *obj); - -/** - * Frees the object. - * - * @param obj the object - */ -static void DebugObject_Free (DebugObject *obj); - -/** - * Does nothing. - * - * @param obj the object - */ -static void DebugObject_Access (const DebugObject *obj); - -/** - * Does nothing. - * There must be no {@link DebugObject}'s initialized. - */ -static void DebugObjectGlobal_Finish (void); - -#ifndef NDEBUG -extern DebugCounter debugobject_counter; -#if BADVPN_THREAD_SAFE -extern pthread_mutex_t debugobject_mutex; -#endif -#endif - -void DebugObject_Init (DebugObject *obj) -{ - #ifndef NDEBUG - - obj->c = DEBUGOBJECT_VALID; - - #if BADVPN_THREAD_SAFE - ASSERT_FORCE(pthread_mutex_lock(&debugobject_mutex) == 0) - #endif - - DebugCounter_Increment(&debugobject_counter); - - #if BADVPN_THREAD_SAFE - ASSERT_FORCE(pthread_mutex_unlock(&debugobject_mutex) == 0) - #endif - - #endif -} - -void DebugObject_Free (DebugObject *obj) -{ - ASSERT(obj->c == DEBUGOBJECT_VALID) - - #ifndef NDEBUG - - obj->c = 0; - - #if BADVPN_THREAD_SAFE - ASSERT_FORCE(pthread_mutex_lock(&debugobject_mutex) == 0) - #endif - - DebugCounter_Decrement(&debugobject_counter); - - #if BADVPN_THREAD_SAFE - ASSERT_FORCE(pthread_mutex_unlock(&debugobject_mutex) == 0) - #endif - - #endif -} - -void DebugObject_Access (const DebugObject *obj) -{ - ASSERT(obj->c == DEBUGOBJECT_VALID) -} - -void DebugObjectGlobal_Finish (void) -{ - #ifndef NDEBUG - DebugCounter_Free(&debugobject_counter); - #endif -} - -#endif diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/flow/BufferWriter.c b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/flow/BufferWriter.c deleted file mode 100644 index 5a1d141f..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/flow/BufferWriter.c +++ /dev/null @@ -1,112 +0,0 @@ -/** - * @file BufferWriter.c - * @author Ambroz Bizjak - * - * @section LICENSE - * - * 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 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE 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. - */ - -#include "misc/debug.h" - -#include "flow/BufferWriter.h" - -static void output_handler_recv (BufferWriter *o, uint8_t *data) -{ - ASSERT(!o->out_have) - - // set output packet - o->out_have = 1; - o->out = data; -} - -void BufferWriter_Init (BufferWriter *o, int mtu, BPendingGroup *pg) -{ - ASSERT(mtu >= 0) - - // init output - PacketRecvInterface_Init(&o->recv_interface, mtu, (PacketRecvInterface_handler_recv)output_handler_recv, o, pg); - - // set no output packet - o->out_have = 0; - - DebugObject_Init(&o->d_obj); - #ifndef NDEBUG - o->d_mtu = mtu; - o->d_writing = 0; - #endif -} - -void BufferWriter_Free (BufferWriter *o) -{ - DebugObject_Free(&o->d_obj); - - // free output - PacketRecvInterface_Free(&o->recv_interface); -} - -PacketRecvInterface * BufferWriter_GetOutput (BufferWriter *o) -{ - DebugObject_Access(&o->d_obj); - - return &o->recv_interface; -} - -int BufferWriter_StartPacket (BufferWriter *o, uint8_t **buf) -{ - ASSERT(!o->d_writing) - DebugObject_Access(&o->d_obj); - - if (!o->out_have) { - return 0; - } - - if (buf) { - *buf = o->out; - } - - #ifndef NDEBUG - o->d_writing = 1; - #endif - - return 1; -} - -void BufferWriter_EndPacket (BufferWriter *o, int len) -{ - ASSERT(len >= 0) - ASSERT(len <= o->d_mtu) - ASSERT(o->out_have) - ASSERT(o->d_writing) - DebugObject_Access(&o->d_obj); - - // set no output packet - o->out_have = 0; - - // finish packet - PacketRecvInterface_Done(&o->recv_interface, len); - - #ifndef NDEBUG - o->d_writing = 0; - #endif -} diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/flow/BufferWriter.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/flow/BufferWriter.h deleted file mode 100644 index e7848cfa..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/flow/BufferWriter.h +++ /dev/null @@ -1,107 +0,0 @@ -/** - * @file BufferWriter.h - * @author Ambroz Bizjak - * - * @section LICENSE - * - * 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 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE 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. - * - * @section DESCRIPTION - * - * Object for writing packets to a {@link PacketRecvInterface} client - * in a best-effort fashion. - */ - -#ifndef BADVPN_FLOW_BUFFERWRITER_H -#define BADVPN_FLOW_BUFFERWRITER_H - -#include - -#include "misc/debug.h" -#include "base/DebugObject.h" -#include "flow/PacketRecvInterface.h" - -/** - * Object for writing packets to a {@link PacketRecvInterface} client - * in a best-effort fashion. - */ -typedef struct { - PacketRecvInterface recv_interface; - int out_have; - uint8_t *out; - DebugObject d_obj; - #ifndef NDEBUG - int d_mtu; - int d_writing; - #endif -} BufferWriter; - -/** - * Initializes the object. - * The object is initialized in not writing state. - * - * @param o the object - * @param mtu maximum input packet length - * @param pg pending group - */ -void BufferWriter_Init (BufferWriter *o, int mtu, BPendingGroup *pg); - -/** - * Frees the object. - * - * @param o the object - */ -void BufferWriter_Free (BufferWriter *o); - -/** - * Returns the output interface. - * - * @param o the object - * @return output interface - */ -PacketRecvInterface * BufferWriter_GetOutput (BufferWriter *o); - -/** - * Attempts to provide a memory location for writing a packet. - * The object must be in not writing state. - * On success, the object enters writing state. - * - * @param o the object - * @param buf if not NULL, on success, the memory location will be stored here. - * It will have space for MTU bytes. - * @return 1 on success, 0 on failure - */ -int BufferWriter_StartPacket (BufferWriter *o, uint8_t **buf) WARN_UNUSED; - -/** - * Submits a packet written to the buffer. - * The object must be in writing state. - * Yhe object enters not writing state. - * - * @param o the object - * @param len length of the packet that was written. Must be >=0 and - * <=MTU. - */ -void BufferWriter_EndPacket (BufferWriter *o, int len); - -#endif diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/flow/PacketBuffer.c b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/flow/PacketBuffer.c deleted file mode 100644 index 2367a390..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/flow/PacketBuffer.c +++ /dev/null @@ -1,131 +0,0 @@ -/** - * @file PacketBuffer.c - * @author Ambroz Bizjak - * - * @section LICENSE - * - * 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 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE 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. - */ - -#include - -#include "misc/debug.h" -#include "misc/balloc.h" - -#include "flow/PacketBuffer.h" - -static void input_handler_done (PacketBuffer *buf, int in_len); -static void output_handler_done (PacketBuffer *buf); - -void input_handler_done (PacketBuffer *buf, int in_len) -{ - ASSERT(in_len >= 0) - ASSERT(in_len <= buf->input_mtu) - DebugObject_Access(&buf->d_obj); - - // remember if buffer is empty - int was_empty = (buf->buf.output_avail < 0); - - // submit packet to buffer - ChunkBuffer2_SubmitPacket(&buf->buf, in_len); - - // if there is space, schedule receive - if (buf->buf.input_avail >= buf->input_mtu) { - PacketRecvInterface_Receiver_Recv(buf->input, buf->buf.input_dest); - } - - // if buffer was empty, schedule send - if (was_empty) { - PacketPassInterface_Sender_Send(buf->output, buf->buf.output_dest, buf->buf.output_avail); - } -} - -void output_handler_done (PacketBuffer *buf) -{ - DebugObject_Access(&buf->d_obj); - - // remember if buffer is full - int was_full = (buf->buf.input_avail < buf->input_mtu); - - // remove packet from buffer - ChunkBuffer2_ConsumePacket(&buf->buf); - - // if buffer was full and there is space, schedule receive - if (was_full && buf->buf.input_avail >= buf->input_mtu) { - PacketRecvInterface_Receiver_Recv(buf->input, buf->buf.input_dest); - } - - // if there is more data, schedule send - if (buf->buf.output_avail >= 0) { - PacketPassInterface_Sender_Send(buf->output, buf->buf.output_dest, buf->buf.output_avail); - } -} - -int PacketBuffer_Init (PacketBuffer *buf, PacketRecvInterface *input, PacketPassInterface *output, int num_packets, BPendingGroup *pg) -{ - ASSERT(PacketPassInterface_GetMTU(output) >= PacketRecvInterface_GetMTU(input)) - ASSERT(num_packets > 0) - - // init arguments - buf->input = input; - buf->output = output; - - // init input - PacketRecvInterface_Receiver_Init(buf->input, (PacketRecvInterface_handler_done)input_handler_done, buf); - - // set input MTU - buf->input_mtu = PacketRecvInterface_GetMTU(buf->input); - - // init output - PacketPassInterface_Sender_Init(buf->output, (PacketPassInterface_handler_done)output_handler_done, buf); - - // allocate buffer - int num_blocks = ChunkBuffer2_calc_blocks(buf->input_mtu, num_packets); - if (num_blocks < 0) { - goto fail0; - } - if (!(buf->buf_data = (struct ChunkBuffer2_block *)BAllocArray(num_blocks, sizeof(buf->buf_data[0])))) { - goto fail0; - } - - // init buffer - ChunkBuffer2_Init(&buf->buf, buf->buf_data, num_blocks, buf->input_mtu); - - // schedule receive - PacketRecvInterface_Receiver_Recv(buf->input, buf->buf.input_dest); - - DebugObject_Init(&buf->d_obj); - - return 1; - -fail0: - return 0; -} - -void PacketBuffer_Free (PacketBuffer *buf) -{ - DebugObject_Free(&buf->d_obj); - - // free buffer - BFree(buf->buf_data); -} diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/flow/PacketBuffer.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/flow/PacketBuffer.h deleted file mode 100644 index 1cfa9afe..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/flow/PacketBuffer.h +++ /dev/null @@ -1,77 +0,0 @@ -/** - * @file PacketBuffer.h - * @author Ambroz Bizjak - * - * @section LICENSE - * - * 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 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE 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. - * - * @section DESCRIPTION - * - * Packet buffer with {@link PacketRecvInterface} input and {@link PacketPassInterface} output. - */ - -#ifndef BADVPN_FLOW_PACKETBUFFER_H -#define BADVPN_FLOW_PACKETBUFFER_H - -#include - -#include "misc/debug.h" -#include "base/DebugObject.h" -#include "structure/ChunkBuffer2.h" -#include "flow/PacketRecvInterface.h" -#include "flow/PacketPassInterface.h" - -/** - * Packet buffer with {@link PacketRecvInterface} input and {@link PacketPassInterface} output. - */ -typedef struct { - DebugObject d_obj; - PacketRecvInterface *input; - int input_mtu; - PacketPassInterface *output; - struct ChunkBuffer2_block *buf_data; - ChunkBuffer2 buf; -} PacketBuffer; - -/** - * Initializes the buffer. - * Output MTU must be >= input MTU. - * - * @param buf the object - * @param input input interface - * @param output output interface - * @param num_packets minimum number of packets the buffer must hold. Must be >0. - * @param pg pending group - * @return 1 on success, 0 on failure - */ -int PacketBuffer_Init (PacketBuffer *buf, PacketRecvInterface *input, PacketPassInterface *output, int num_packets, BPendingGroup *pg) WARN_UNUSED; - -/** - * Frees the buffer. - * - * @param buf the object - */ -void PacketBuffer_Free (PacketBuffer *buf); - -#endif diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/flow/PacketPassConnector.c b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/flow/PacketPassConnector.c deleted file mode 100644 index 3ccd4fec..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/flow/PacketPassConnector.c +++ /dev/null @@ -1,125 +0,0 @@ -/** - * @file PacketPassConnector.c - * @author Ambroz Bizjak - * - * @section LICENSE - * - * 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 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE 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. - */ - -#include - -#include "misc/debug.h" - -#include "flow/PacketPassConnector.h" - -static void input_handler_send (PacketPassConnector *o, uint8_t *data, int data_len) -{ - ASSERT(data_len >= 0) - ASSERT(data_len <= o->input_mtu) - ASSERT(o->in_len == -1) - DebugObject_Access(&o->d_obj); - - // remember input packet - o->in_len = data_len; - o->in = data; - - if (o->output) { - // schedule send - PacketPassInterface_Sender_Send(o->output, o->in, o->in_len); - } -} - -static void output_handler_done (PacketPassConnector *o) -{ - ASSERT(o->in_len >= 0) - ASSERT(o->output) - DebugObject_Access(&o->d_obj); - - // have no input packet - o->in_len = -1; - - // allow input to send more packets - PacketPassInterface_Done(&o->input); -} - -void PacketPassConnector_Init (PacketPassConnector *o, int mtu, BPendingGroup *pg) -{ - ASSERT(mtu >= 0) - - // init arguments - o->input_mtu = mtu; - - // init input - PacketPassInterface_Init(&o->input, o->input_mtu, (PacketPassInterface_handler_send)input_handler_send, o, pg); - - // have no input packet - o->in_len = -1; - - // have no output - o->output = NULL; - - DebugObject_Init(&o->d_obj); -} - -void PacketPassConnector_Free (PacketPassConnector *o) -{ - DebugObject_Free(&o->d_obj); - - // free input - PacketPassInterface_Free(&o->input); -} - -PacketPassInterface * PacketPassConnector_GetInput (PacketPassConnector *o) -{ - DebugObject_Access(&o->d_obj); - - return &o->input; -} - -void PacketPassConnector_ConnectOutput (PacketPassConnector *o, PacketPassInterface *output) -{ - ASSERT(!o->output) - ASSERT(PacketPassInterface_GetMTU(output) >= o->input_mtu) - DebugObject_Access(&o->d_obj); - - // set output - o->output = output; - - // init output - PacketPassInterface_Sender_Init(o->output, (PacketPassInterface_handler_done)output_handler_done, o); - - // if we have an input packet, schedule send - if (o->in_len >= 0) { - PacketPassInterface_Sender_Send(o->output, o->in, o->in_len); - } -} - -void PacketPassConnector_DisconnectOutput (PacketPassConnector *o) -{ - ASSERT(o->output) - DebugObject_Access(&o->d_obj); - - // set no output - o->output = NULL; -} diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/flow/PacketPassConnector.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/flow/PacketPassConnector.h deleted file mode 100644 index e960761c..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/flow/PacketPassConnector.h +++ /dev/null @@ -1,102 +0,0 @@ -/** - * @file PacketPassConnector.h - * @author Ambroz Bizjak - * - * @section LICENSE - * - * 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 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE 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. - * - * @section DESCRIPTION - * - * A {@link PacketPassInterface} layer which allows the output to be - * connected and disconnected on the fly. - */ - -#ifndef BADVPN_FLOW_PACKETPASSCONNECTOR_H -#define BADVPN_FLOW_PACKETPASSCONNECTOR_H - -#include - -#include "base/DebugObject.h" -#include "flow/PacketPassInterface.h" - -/** - * A {@link PacketPassInterface} layer which allows the output to be - * connected and disconnected on the fly. - */ -typedef struct { - PacketPassInterface input; - int input_mtu; - int in_len; - uint8_t *in; - PacketPassInterface *output; - DebugObject d_obj; -} PacketPassConnector; - -/** - * Initializes the object. - * The object is initialized in not connected state. - * - * @param o the object - * @param mtu maximum input packet size. Must be >=0. - * @param pg pending group - */ -void PacketPassConnector_Init (PacketPassConnector *o, int mtu, BPendingGroup *pg); - -/** - * Frees the object. - * - * @param o the object - */ -void PacketPassConnector_Free (PacketPassConnector *o); - -/** - * Returns the input interface. - * The MTU of the interface will be as in {@link PacketPassConnector_Init}. - * - * @param o the object - * @return input interface - */ -PacketPassInterface * PacketPassConnector_GetInput (PacketPassConnector *o); - -/** - * Connects output. - * The object must be in not connected state. - * The object enters connected state. - * - * @param o the object - * @param output output to connect. Its MTU must be >= MTU specified in - * {@link PacketPassConnector_Init}. - */ -void PacketPassConnector_ConnectOutput (PacketPassConnector *o, PacketPassInterface *output); - -/** - * Disconnects output. - * The object must be in connected state. - * The object enters not connected state. - * - * @param o the object - */ -void PacketPassConnector_DisconnectOutput (PacketPassConnector *o); - -#endif diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/flow/PacketPassFairQueue.c b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/flow/PacketPassFairQueue.c deleted file mode 100644 index 1037b8f8..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/flow/PacketPassFairQueue.c +++ /dev/null @@ -1,405 +0,0 @@ -/** - * @file PacketPassFairQueue.c - * @author Ambroz Bizjak - * - * @section LICENSE - * - * 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 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE 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. - */ - -#include - -#include "misc/debug.h" -#include "misc/offset.h" -#include "misc/minmax.h" -#include "misc/compare.h" - -#include "flow/PacketPassFairQueue.h" - -static int compare_flows (PacketPassFairQueueFlow *f1, PacketPassFairQueueFlow *f2) -{ - int cmp = B_COMPARE(f1->time, f2->time); - if (cmp) { - return cmp; - } - - return B_COMPARE((uintptr_t)f1, (uintptr_t)f2); -} - -#include "PacketPassFairQueue_tree.h" -#include "structure/SAvl_impl.h" - -static uint64_t get_current_time (PacketPassFairQueue *m) -{ - if (m->sending_flow) { - return m->sending_flow->time; - } - - uint64_t time = 0; // to remove warning - int have = 0; - - PacketPassFairQueueFlow *first_flow = PacketPassFairQueue__Tree_GetFirst(&m->queued_tree, 0); - if (first_flow) { - ASSERT(first_flow->is_queued) - - time = first_flow->time; - have = 1; - } - - if (m->previous_flow) { - if (!have || m->previous_flow->time < time) { - time = m->previous_flow->time; - have = 1; - } - } - - return (have ? time : 0); -} - -static void increment_sent_flow (PacketPassFairQueueFlow *flow, uint64_t amount) -{ - PacketPassFairQueue *m = flow->m; - - ASSERT(amount <= FAIRQUEUE_MAX_TIME) - ASSERT(!flow->is_queued) - ASSERT(!m->sending_flow) - - // does time overflow? - if (amount > FAIRQUEUE_MAX_TIME - flow->time) { - // get time to subtract - uint64_t subtract; - PacketPassFairQueueFlow *first_flow = PacketPassFairQueue__Tree_GetFirst(&m->queued_tree, 0); - if (!first_flow) { - subtract = flow->time; - } else { - ASSERT(first_flow->is_queued) - subtract = first_flow->time; - } - - // subtract time from all flows - for (LinkedList1Node *list_node = LinkedList1_GetFirst(&m->flows_list); list_node; list_node = LinkedList1Node_Next(list_node)) { - PacketPassFairQueueFlow *someflow = UPPER_OBJECT(list_node, PacketPassFairQueueFlow, list_node); - - // don't subtract more time than there is, except for the just finished flow, - // where we allow time to underflow and then overflow to the correct value after adding to it - if (subtract > someflow->time && someflow != flow) { - ASSERT(!someflow->is_queued) - someflow->time = 0; - } else { - someflow->time -= subtract; - } - } - } - - // add time to flow - flow->time += amount; -} - -static void schedule (PacketPassFairQueue *m) -{ - ASSERT(!m->sending_flow) - ASSERT(!m->previous_flow) - ASSERT(!m->freeing) - ASSERT(!PacketPassFairQueue__Tree_IsEmpty(&m->queued_tree)) - - // get first queued flow - PacketPassFairQueueFlow *qflow = PacketPassFairQueue__Tree_GetFirst(&m->queued_tree, 0); - ASSERT(qflow->is_queued) - - // remove flow from queue - PacketPassFairQueue__Tree_Remove(&m->queued_tree, 0, qflow); - qflow->is_queued = 0; - - // schedule send - PacketPassInterface_Sender_Send(m->output, qflow->queued.data, qflow->queued.data_len); - m->sending_flow = qflow; - m->sending_len = qflow->queued.data_len; -} - -static void schedule_job_handler (PacketPassFairQueue *m) -{ - ASSERT(!m->sending_flow) - ASSERT(!m->freeing) - DebugObject_Access(&m->d_obj); - - // remove previous flow - m->previous_flow = NULL; - - if (!PacketPassFairQueue__Tree_IsEmpty(&m->queued_tree)) { - schedule(m); - } -} - -static void input_handler_send (PacketPassFairQueueFlow *flow, uint8_t *data, int data_len) -{ - PacketPassFairQueue *m = flow->m; - - ASSERT(flow != m->sending_flow) - ASSERT(!flow->is_queued) - ASSERT(!m->freeing) - DebugObject_Access(&flow->d_obj); - - if (flow == m->previous_flow) { - // remove from previous flow - m->previous_flow = NULL; - } else { - // raise time - flow->time = bmax_uint64(flow->time, get_current_time(m)); - } - - // queue flow - flow->queued.data = data; - flow->queued.data_len = data_len; - int res = PacketPassFairQueue__Tree_Insert(&m->queued_tree, 0, flow, NULL); - ASSERT_EXECUTE(res) - flow->is_queued = 1; - - if (!m->sending_flow && !BPending_IsSet(&m->schedule_job)) { - schedule(m); - } -} - -static void output_handler_done (PacketPassFairQueue *m) -{ - ASSERT(m->sending_flow) - ASSERT(!m->previous_flow) - ASSERT(!BPending_IsSet(&m->schedule_job)) - ASSERT(!m->freeing) - ASSERT(!m->sending_flow->is_queued) - - PacketPassFairQueueFlow *flow = m->sending_flow; - - // sending finished - m->sending_flow = NULL; - - // remember this flow so the schedule job can remove its time if it didn's send - m->previous_flow = flow; - - // update flow time by packet size - increment_sent_flow(flow, (uint64_t)m->packet_weight + m->sending_len); - - // schedule schedule - BPending_Set(&m->schedule_job); - - // finish flow packet - PacketPassInterface_Done(&flow->input); - - // call busy handler if set - if (flow->handler_busy) { - // handler is one-shot, unset it before calling - PacketPassFairQueue_handler_busy handler = flow->handler_busy; - flow->handler_busy = NULL; - - // call handler - handler(flow->user); - return; - } -} - -int PacketPassFairQueue_Init (PacketPassFairQueue *m, PacketPassInterface *output, BPendingGroup *pg, int use_cancel, int packet_weight) -{ - ASSERT(packet_weight > 0) - ASSERT(use_cancel == 0 || use_cancel == 1) - ASSERT(!use_cancel || PacketPassInterface_HasCancel(output)) - - // init arguments - m->output = output; - m->pg = pg; - m->use_cancel = use_cancel; - m->packet_weight = packet_weight; - - // make sure that (output MTU + packet_weight <= FAIRQUEUE_MAX_TIME) - if (!( - (PacketPassInterface_GetMTU(output) <= FAIRQUEUE_MAX_TIME) && - (packet_weight <= FAIRQUEUE_MAX_TIME - PacketPassInterface_GetMTU(output)) - )) { - goto fail0; - } - - // init output - PacketPassInterface_Sender_Init(m->output, (PacketPassInterface_handler_done)output_handler_done, m); - - // not sending - m->sending_flow = NULL; - - // no previous flow - m->previous_flow = NULL; - - // init queued tree - PacketPassFairQueue__Tree_Init(&m->queued_tree); - - // init flows list - LinkedList1_Init(&m->flows_list); - - // not freeing - m->freeing = 0; - - // init schedule job - BPending_Init(&m->schedule_job, m->pg, (BPending_handler)schedule_job_handler, m); - - DebugObject_Init(&m->d_obj); - DebugCounter_Init(&m->d_ctr); - return 1; - -fail0: - return 0; -} - -void PacketPassFairQueue_Free (PacketPassFairQueue *m) -{ - ASSERT(LinkedList1_IsEmpty(&m->flows_list)) - ASSERT(PacketPassFairQueue__Tree_IsEmpty(&m->queued_tree)) - ASSERT(!m->previous_flow) - ASSERT(!m->sending_flow) - DebugCounter_Free(&m->d_ctr); - DebugObject_Free(&m->d_obj); - - // free schedule job - BPending_Free(&m->schedule_job); -} - -void PacketPassFairQueue_PrepareFree (PacketPassFairQueue *m) -{ - DebugObject_Access(&m->d_obj); - - // set freeing - m->freeing = 1; -} - -int PacketPassFairQueue_GetMTU (PacketPassFairQueue *m) -{ - DebugObject_Access(&m->d_obj); - - return PacketPassInterface_GetMTU(m->output); -} - -void PacketPassFairQueueFlow_Init (PacketPassFairQueueFlow *flow, PacketPassFairQueue *m) -{ - ASSERT(!m->freeing) - DebugObject_Access(&m->d_obj); - - // init arguments - flow->m = m; - - // have no canfree handler - flow->handler_busy = NULL; - - // init input - PacketPassInterface_Init(&flow->input, PacketPassInterface_GetMTU(flow->m->output), (PacketPassInterface_handler_send)input_handler_send, flow, m->pg); - - // set time - flow->time = 0; - - // add to flows list - LinkedList1_Append(&m->flows_list, &flow->list_node); - - // is not queued - flow->is_queued = 0; - - DebugObject_Init(&flow->d_obj); - DebugCounter_Increment(&m->d_ctr); -} - -void PacketPassFairQueueFlow_Free (PacketPassFairQueueFlow *flow) -{ - PacketPassFairQueue *m = flow->m; - - ASSERT(m->freeing || flow != m->sending_flow) - DebugCounter_Decrement(&m->d_ctr); - DebugObject_Free(&flow->d_obj); - - // remove from current flow - if (flow == m->sending_flow) { - m->sending_flow = NULL; - } - - // remove from previous flow - if (flow == m->previous_flow) { - m->previous_flow = NULL; - } - - // remove from queue - if (flow->is_queued) { - PacketPassFairQueue__Tree_Remove(&m->queued_tree, 0, flow); - } - - // remove from flows list - LinkedList1_Remove(&m->flows_list, &flow->list_node); - - // free input - PacketPassInterface_Free(&flow->input); -} - -void PacketPassFairQueueFlow_AssertFree (PacketPassFairQueueFlow *flow) -{ - PacketPassFairQueue *m = flow->m; - B_USE(m) - - ASSERT(m->freeing || flow != m->sending_flow) - DebugObject_Access(&flow->d_obj); -} - -int PacketPassFairQueueFlow_IsBusy (PacketPassFairQueueFlow *flow) -{ - PacketPassFairQueue *m = flow->m; - - ASSERT(!m->freeing) - DebugObject_Access(&flow->d_obj); - - return (flow == m->sending_flow); -} - -void PacketPassFairQueueFlow_RequestCancel (PacketPassFairQueueFlow *flow) -{ - PacketPassFairQueue *m = flow->m; - - ASSERT(flow == m->sending_flow) - ASSERT(m->use_cancel) - ASSERT(!m->freeing) - ASSERT(!BPending_IsSet(&m->schedule_job)) - DebugObject_Access(&flow->d_obj); - - // request cancel - PacketPassInterface_Sender_RequestCancel(m->output); -} - -void PacketPassFairQueueFlow_SetBusyHandler (PacketPassFairQueueFlow *flow, PacketPassFairQueue_handler_busy handler, void *user) -{ - PacketPassFairQueue *m = flow->m; - B_USE(m) - - ASSERT(flow == m->sending_flow) - ASSERT(!m->freeing) - DebugObject_Access(&flow->d_obj); - - // set handler - flow->handler_busy = handler; - flow->user = user; -} - -PacketPassInterface * PacketPassFairQueueFlow_GetInput (PacketPassFairQueueFlow *flow) -{ - DebugObject_Access(&flow->d_obj); - - return &flow->input; -} diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/flow/PacketPassFairQueue.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/flow/PacketPassFairQueue.h deleted file mode 100644 index 47bf5161..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/flow/PacketPassFairQueue.h +++ /dev/null @@ -1,204 +0,0 @@ -/** - * @file PacketPassFairQueue.h - * @author Ambroz Bizjak - * - * @section LICENSE - * - * 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 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE 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. - * - * @section DESCRIPTION - * - * Fair queue using {@link PacketPassInterface}. - */ - -#ifndef BADVPN_FLOW_PACKETPASSFAIRQUEUE_H -#define BADVPN_FLOW_PACKETPASSFAIRQUEUE_H - -#include - -#include "misc/debug.h" -#include "misc/debugcounter.h" -#include "structure/SAvl.h" -#include "structure/LinkedList1.h" -#include "base/DebugObject.h" -#include "base/BPending.h" -#include "flow/PacketPassInterface.h" - -// reduce this to test time overflow handling -#define FAIRQUEUE_MAX_TIME UINT64_MAX - -typedef void (*PacketPassFairQueue_handler_busy) (void *user); - -struct PacketPassFairQueueFlow_s; - -#include "PacketPassFairQueue_tree.h" -#include "structure/SAvl_decl.h" - -typedef struct PacketPassFairQueueFlow_s { - struct PacketPassFairQueue_s *m; - PacketPassFairQueue_handler_busy handler_busy; - void *user; - PacketPassInterface input; - uint64_t time; - LinkedList1Node list_node; - int is_queued; - struct { - PacketPassFairQueue__TreeNode tree_node; - uint8_t *data; - int data_len; - } queued; - DebugObject d_obj; -} PacketPassFairQueueFlow; - -/** - * Fair queue using {@link PacketPassInterface}. - */ -typedef struct PacketPassFairQueue_s { - PacketPassInterface *output; - BPendingGroup *pg; - int use_cancel; - int packet_weight; - struct PacketPassFairQueueFlow_s *sending_flow; - int sending_len; - struct PacketPassFairQueueFlow_s *previous_flow; - PacketPassFairQueue__Tree queued_tree; - LinkedList1 flows_list; - int freeing; - BPending schedule_job; - DebugObject d_obj; - DebugCounter d_ctr; -} PacketPassFairQueue; - -/** - * Initializes the queue. - * - * @param m the object - * @param output output interface - * @param pg pending group - * @param use_cancel whether cancel functionality is required. Must be 0 or 1. - * If 1, output must support cancel functionality. - * @param packet_weight additional weight a packet bears. Must be >0, to keep - * the queue fair for zero size packets. - * @return 1 on success, 0 on failure (because output MTU is too large) - */ -int PacketPassFairQueue_Init (PacketPassFairQueue *m, PacketPassInterface *output, BPendingGroup *pg, int use_cancel, int packet_weight) WARN_UNUSED; - -/** - * Frees the queue. - * All flows must have been freed. - * - * @param m the object - */ -void PacketPassFairQueue_Free (PacketPassFairQueue *m); - -/** - * Prepares for freeing the entire queue. Must be called to allow freeing - * the flows in the process of freeing the entire queue. - * After this function is called, flows and the queue must be freed - * before any further I/O. - * May be called multiple times. - * The queue enters freeing state. - * - * @param m the object - */ -void PacketPassFairQueue_PrepareFree (PacketPassFairQueue *m); - -/** - * Returns the MTU of the queue. - * - * @param m the object - */ -int PacketPassFairQueue_GetMTU (PacketPassFairQueue *m); - -/** - * Initializes a queue flow. - * Queue must not be in freeing state. - * Must not be called from queue calls to output. - * - * @param flow the object - * @param m queue to attach to - */ -void PacketPassFairQueueFlow_Init (PacketPassFairQueueFlow *flow, PacketPassFairQueue *m); - -/** - * Frees a queue flow. - * Unless the queue is in freeing state: - * - The flow must not be busy as indicated by {@link PacketPassFairQueueFlow_IsBusy}. - * - Must not be called from queue calls to output. - * - * @param flow the object - */ -void PacketPassFairQueueFlow_Free (PacketPassFairQueueFlow *flow); - -/** - * Does nothing. - * It must be possible to free the flow (see {@link PacketPassFairQueueFlow_Free}). - * - * @param flow the object - */ -void PacketPassFairQueueFlow_AssertFree (PacketPassFairQueueFlow *flow); - -/** - * Determines if the flow is busy. If the flow is considered busy, it must not - * be freed. At any given time, at most one flow will be indicated as busy. - * Queue must not be in freeing state. - * Must not be called from queue calls to output. - * - * @param flow the object - * @return 0 if not busy, 1 is busy - */ -int PacketPassFairQueueFlow_IsBusy (PacketPassFairQueueFlow *flow); - -/** - * Requests the output to stop processing the current packet as soon as possible. - * Cancel functionality must be enabled for the queue. - * The flow must be busy as indicated by {@link PacketPassFairQueueFlow_IsBusy}. - * Queue must not be in freeing state. - * - * @param flow the object - */ -void PacketPassFairQueueFlow_RequestCancel (PacketPassFairQueueFlow *flow); - -/** - * Sets up a callback to be called when the flow is no longer busy. - * The handler will be called as soon as the flow is no longer busy, i.e. it is not - * possible that this flow is no longer busy before the handler is called. - * The flow must be busy as indicated by {@link PacketPassFairQueueFlow_IsBusy}. - * Queue must not be in freeing state. - * Must not be called from queue calls to output. - * - * @param flow the object - * @param handler callback function. NULL to disable. - * @param user value passed to callback function. Ignored if handler is NULL. - */ -void PacketPassFairQueueFlow_SetBusyHandler (PacketPassFairQueueFlow *flow, PacketPassFairQueue_handler_busy handler, void *user); - -/** - * Returns the input interface of the flow. - * - * @param flow the object - * @return input interface - */ -PacketPassInterface * PacketPassFairQueueFlow_GetInput (PacketPassFairQueueFlow *flow); - -#endif diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/flow/PacketPassFairQueue_tree.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/flow/PacketPassFairQueue_tree.h deleted file mode 100644 index 5dd0a7d4..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/flow/PacketPassFairQueue_tree.h +++ /dev/null @@ -1,7 +0,0 @@ -#define SAVL_PARAM_NAME PacketPassFairQueue__Tree -#define SAVL_PARAM_FEATURE_COUNTS 0 -#define SAVL_PARAM_FEATURE_NOKEYS 1 -#define SAVL_PARAM_TYPE_ENTRY struct PacketPassFairQueueFlow_s -#define SAVL_PARAM_TYPE_ARG int -#define SAVL_PARAM_FUN_COMPARE_ENTRIES(arg, entry1, entry2) compare_flows((entry1), (entry2)) -#define SAVL_PARAM_MEMBER_NODE queued.tree_node diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/flow/PacketPassInterface.c b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/flow/PacketPassInterface.c deleted file mode 100644 index 9c53003b..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/flow/PacketPassInterface.c +++ /dev/null @@ -1,68 +0,0 @@ -/** - * @file PacketPassInterface.c - * @author Ambroz Bizjak - * - * @section LICENSE - * - * 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 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE 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. - */ - -#include "flow/PacketPassInterface.h" - -void _PacketPassInterface_job_operation (PacketPassInterface *i) -{ - ASSERT(i->state == PPI_STATE_OPERATION_PENDING) - DebugObject_Access(&i->d_obj); - - // set state - i->state = PPI_STATE_BUSY; - - // call handler - i->handler_operation(i->user_provider, i->job_operation_data, i->job_operation_len); - return; -} - -void _PacketPassInterface_job_requestcancel (PacketPassInterface *i) -{ - ASSERT(i->state == PPI_STATE_BUSY) - ASSERT(i->cancel_requested) - ASSERT(i->handler_requestcancel) - DebugObject_Access(&i->d_obj); - - // call handler - i->handler_requestcancel(i->user_provider); - return; -} - -void _PacketPassInterface_job_done (PacketPassInterface *i) -{ - ASSERT(i->state == PPI_STATE_DONE_PENDING) - DebugObject_Access(&i->d_obj); - - // set state - i->state = PPI_STATE_NONE; - - // call handler - i->handler_done(i->user_user); - return; -} diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/flow/PacketPassInterface.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/flow/PacketPassInterface.h deleted file mode 100644 index bcd5c619..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/flow/PacketPassInterface.h +++ /dev/null @@ -1,236 +0,0 @@ -/** - * @file PacketPassInterface.h - * @author Ambroz Bizjak - * - * @section LICENSE - * - * 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 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE 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. - * - * @section DESCRIPTION - * - * Interface allowing a packet sender to pass data packets to a packet receiver. - */ - -#ifndef BADVPN_FLOW_PACKETPASSINTERFACE_H -#define BADVPN_FLOW_PACKETPASSINTERFACE_H - -#include -#include - -#include "misc/debug.h" -#include "base/DebugObject.h" -#include "base/BPending.h" - -#define PPI_STATE_NONE 1 -#define PPI_STATE_OPERATION_PENDING 2 -#define PPI_STATE_BUSY 3 -#define PPI_STATE_DONE_PENDING 4 - -typedef void (*PacketPassInterface_handler_send) (void *user, uint8_t *data, int data_len); - -typedef void (*PacketPassInterface_handler_requestcancel) (void *user); - -typedef void (*PacketPassInterface_handler_done) (void *user); - -typedef struct { - // provider data - int mtu; - PacketPassInterface_handler_send handler_operation; - PacketPassInterface_handler_requestcancel handler_requestcancel; - void *user_provider; - - // user data - PacketPassInterface_handler_done handler_done; - void *user_user; - - // operation job - BPending job_operation; - uint8_t *job_operation_data; - int job_operation_len; - - // requestcancel job - BPending job_requestcancel; - - // done job - BPending job_done; - - // state - int state; - int cancel_requested; - - DebugObject d_obj; -} PacketPassInterface; - -static void PacketPassInterface_Init (PacketPassInterface *i, int mtu, PacketPassInterface_handler_send handler_operation, void *user, BPendingGroup *pg); - -static void PacketPassInterface_Free (PacketPassInterface *i); - -static void PacketPassInterface_EnableCancel (PacketPassInterface *i, PacketPassInterface_handler_requestcancel handler_requestcancel); - -static void PacketPassInterface_Done (PacketPassInterface *i); - -static int PacketPassInterface_GetMTU (PacketPassInterface *i); - -static void PacketPassInterface_Sender_Init (PacketPassInterface *i, PacketPassInterface_handler_done handler_done, void *user); - -static void PacketPassInterface_Sender_Send (PacketPassInterface *i, uint8_t *data, int data_len); - -static void PacketPassInterface_Sender_RequestCancel (PacketPassInterface *i); - -static int PacketPassInterface_HasCancel (PacketPassInterface *i); - -void _PacketPassInterface_job_operation (PacketPassInterface *i); -void _PacketPassInterface_job_requestcancel (PacketPassInterface *i); -void _PacketPassInterface_job_done (PacketPassInterface *i); - -void PacketPassInterface_Init (PacketPassInterface *i, int mtu, PacketPassInterface_handler_send handler_operation, void *user, BPendingGroup *pg) -{ - ASSERT(mtu >= 0) - - // init arguments - i->mtu = mtu; - i->handler_operation = handler_operation; - i->handler_requestcancel = NULL; - i->user_provider = user; - - // set no user - i->handler_done = NULL; - - // init jobs - BPending_Init(&i->job_operation, pg, (BPending_handler)_PacketPassInterface_job_operation, i); - BPending_Init(&i->job_requestcancel, pg, (BPending_handler)_PacketPassInterface_job_requestcancel, i); - BPending_Init(&i->job_done, pg, (BPending_handler)_PacketPassInterface_job_done, i); - - // set state - i->state = PPI_STATE_NONE; - - DebugObject_Init(&i->d_obj); -} - -void PacketPassInterface_Free (PacketPassInterface *i) -{ - DebugObject_Free(&i->d_obj); - - // free jobs - BPending_Free(&i->job_done); - BPending_Free(&i->job_requestcancel); - BPending_Free(&i->job_operation); -} - -void PacketPassInterface_EnableCancel (PacketPassInterface *i, PacketPassInterface_handler_requestcancel handler_requestcancel) -{ - ASSERT(!i->handler_requestcancel) - ASSERT(!i->handler_done) - ASSERT(handler_requestcancel) - - i->handler_requestcancel = handler_requestcancel; -} - -void PacketPassInterface_Done (PacketPassInterface *i) -{ - ASSERT(i->state == PPI_STATE_BUSY) - DebugObject_Access(&i->d_obj); - - // unset requestcancel job - BPending_Unset(&i->job_requestcancel); - - // schedule done - BPending_Set(&i->job_done); - - // set state - i->state = PPI_STATE_DONE_PENDING; -} - -int PacketPassInterface_GetMTU (PacketPassInterface *i) -{ - DebugObject_Access(&i->d_obj); - - return i->mtu; -} - -void PacketPassInterface_Sender_Init (PacketPassInterface *i, PacketPassInterface_handler_done handler_done, void *user) -{ - ASSERT(handler_done) - ASSERT(!i->handler_done) - DebugObject_Access(&i->d_obj); - - i->handler_done = handler_done; - i->user_user = user; -} - -void PacketPassInterface_Sender_Send (PacketPassInterface *i, uint8_t *data, int data_len) -{ - ASSERT(data_len >= 0) - ASSERT(data_len <= i->mtu) - ASSERT(!(data_len > 0) || data) - ASSERT(i->state == PPI_STATE_NONE) - ASSERT(i->handler_done) - DebugObject_Access(&i->d_obj); - - // schedule operation - i->job_operation_data = data; - i->job_operation_len = data_len; - BPending_Set(&i->job_operation); - - // set state - i->state = PPI_STATE_OPERATION_PENDING; - i->cancel_requested = 0; -} - -void PacketPassInterface_Sender_RequestCancel (PacketPassInterface *i) -{ - ASSERT(i->state == PPI_STATE_OPERATION_PENDING || i->state == PPI_STATE_BUSY || i->state == PPI_STATE_DONE_PENDING) - ASSERT(i->handler_requestcancel) - DebugObject_Access(&i->d_obj); - - // ignore multiple cancel requests - if (i->cancel_requested) { - return; - } - - // remember we requested cancel - i->cancel_requested = 1; - - if (i->state == PPI_STATE_OPERATION_PENDING) { - // unset operation job - BPending_Unset(&i->job_operation); - - // set done job - BPending_Set(&i->job_done); - - // set state - i->state = PPI_STATE_DONE_PENDING; - } else if (i->state == PPI_STATE_BUSY) { - // set requestcancel job - BPending_Set(&i->job_requestcancel); - } -} - -int PacketPassInterface_HasCancel (PacketPassInterface *i) -{ - DebugObject_Access(&i->d_obj); - - return !!i->handler_requestcancel; -} - -#endif diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/flow/PacketProtoDecoder.c b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/flow/PacketProtoDecoder.c deleted file mode 100644 index a2cc2b63..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/flow/PacketProtoDecoder.c +++ /dev/null @@ -1,182 +0,0 @@ -/** - * @file PacketProtoDecoder.c - * @author Ambroz Bizjak - * - * @section LICENSE - * - * 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 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE 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. - */ - -#include -#include - -#include "misc/debug.h" -#include "misc/byteorder.h" -#include "misc/minmax.h" -#include "base/BLog.h" - -#include "flow/PacketProtoDecoder.h" - -#include "generated/blog_channel_PacketProtoDecoder.h" - -static void process_data (PacketProtoDecoder *enc); -static void input_handler_done (PacketProtoDecoder *enc, int data_len); -static void output_handler_done (PacketProtoDecoder *enc); - -void process_data (PacketProtoDecoder *enc) -{ - int was_error = 0; - - do { - uint8_t *data = enc->buf + enc->buf_start; - int left = enc->buf_used; - - // check if header was received - if (left < sizeof(struct packetproto_header)) { - break; - } - struct packetproto_header header; - memcpy(&header, data, sizeof(header)); - data += sizeof(struct packetproto_header); - left -= sizeof(struct packetproto_header); - int data_len = ltoh16(header.len); - - // check data length - if (data_len > enc->output_mtu) { - BLog(BLOG_NOTICE, "error: packet too large"); - was_error = 1; - break; - } - - // check if whole packet was received - if (left < data_len) { - break; - } - - // update buffer - enc->buf_start += sizeof(struct packetproto_header) + data_len; - enc->buf_used -= sizeof(struct packetproto_header) + data_len; - - // submit packet - PacketPassInterface_Sender_Send(enc->output, data, data_len); - return; - } while (0); - - if (was_error) { - // reset buffer - enc->buf_start = 0; - enc->buf_used = 0; - } else { - // if we reached the end of the buffer, wrap around to allow more data to be received - if (enc->buf_start + enc->buf_used == enc->buf_size) { - memmove(enc->buf, enc->buf + enc->buf_start, enc->buf_used); - enc->buf_start = 0; - } - } - - // receive data - StreamRecvInterface_Receiver_Recv(enc->input, enc->buf + (enc->buf_start + enc->buf_used), enc->buf_size - (enc->buf_start + enc->buf_used)); - - // if we had error, report it - if (was_error) { - enc->handler_error(enc->user); - return; - } -} - -static void input_handler_done (PacketProtoDecoder *enc, int data_len) -{ - ASSERT(data_len > 0) - ASSERT(data_len <= enc->buf_size - (enc->buf_start + enc->buf_used)) - DebugObject_Access(&enc->d_obj); - - // update buffer - enc->buf_used += data_len; - - // process data - process_data(enc); - return; -} - -void output_handler_done (PacketProtoDecoder *enc) -{ - DebugObject_Access(&enc->d_obj); - - // process data - process_data(enc); - return; -} - -int PacketProtoDecoder_Init (PacketProtoDecoder *enc, StreamRecvInterface *input, PacketPassInterface *output, BPendingGroup *pg, void *user, PacketProtoDecoder_handler_error handler_error) -{ - // init arguments - enc->input = input; - enc->output = output; - enc->user = user; - enc->handler_error = handler_error; - - // init input - StreamRecvInterface_Receiver_Init(enc->input, (StreamRecvInterface_handler_done)input_handler_done, enc); - - // init output - PacketPassInterface_Sender_Init(enc->output, (PacketPassInterface_handler_done)output_handler_done, enc); - - // set output MTU, limit by maximum payload size - enc->output_mtu = bmin_int(PacketPassInterface_GetMTU(enc->output), PACKETPROTO_MAXPAYLOAD); - - // init buffer state - enc->buf_size = PACKETPROTO_ENCLEN(enc->output_mtu); - enc->buf_start = 0; - enc->buf_used = 0; - - // allocate buffer - if (!(enc->buf = (uint8_t *)malloc(enc->buf_size))) { - goto fail0; - } - - // start receiving - StreamRecvInterface_Receiver_Recv(enc->input, enc->buf, enc->buf_size); - - DebugObject_Init(&enc->d_obj); - - return 1; - -fail0: - return 0; -} - -void PacketProtoDecoder_Free (PacketProtoDecoder *enc) -{ - DebugObject_Free(&enc->d_obj); - - // free buffer - free(enc->buf); -} - -void PacketProtoDecoder_Reset (PacketProtoDecoder *enc) -{ - DebugObject_Access(&enc->d_obj); - - enc->buf_start += enc->buf_used; - enc->buf_used = 0; -} diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/flow/PacketProtoDecoder.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/flow/PacketProtoDecoder.h deleted file mode 100644 index 8cece5ba..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/flow/PacketProtoDecoder.h +++ /dev/null @@ -1,96 +0,0 @@ -/** - * @file PacketProtoDecoder.h - * @author Ambroz Bizjak - * - * @section LICENSE - * - * 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 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE 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. - * - * @section DESCRIPTION - * - * Object which decodes a stream according to PacketProto. - */ - -#ifndef BADVPN_FLOW_PACKETPROTODECODER_H -#define BADVPN_FLOW_PACKETPROTODECODER_H - -#include - -#include "protocol/packetproto.h" -#include "misc/debug.h" -#include "base/DebugObject.h" -#include "flow/StreamRecvInterface.h" -#include "flow/PacketPassInterface.h" - -/** - * Handler called when a protocol error occurs. - * When an error occurs, the decoder is reset to the initial state. - * - * @param user as in {@link PacketProtoDecoder_Init} - */ -typedef void (*PacketProtoDecoder_handler_error) (void *user); - -typedef struct { - StreamRecvInterface *input; - PacketPassInterface *output; - void *user; - PacketProtoDecoder_handler_error handler_error; - int output_mtu; - int buf_size; - int buf_start; - int buf_used; - uint8_t *buf; - DebugObject d_obj; -} PacketProtoDecoder; - -/** - * Initializes the object. - * - * @param enc the object - * @param input input interface. The decoder will accept packets with payload size up to its MTU - * (but the payload can never be more than PACKETPROTO_MAXPAYLOAD). - * @param output output interface - * @param pg pending group - * @param user argument to handlers - * @param handler_error error handler - * @return 1 on success, 0 on failure - */ -int PacketProtoDecoder_Init (PacketProtoDecoder *enc, StreamRecvInterface *input, PacketPassInterface *output, BPendingGroup *pg, void *user, PacketProtoDecoder_handler_error handler_error) WARN_UNUSED; - -/** - * Frees the object. - * - * @param enc the object - */ -void PacketProtoDecoder_Free (PacketProtoDecoder *enc); - -/** - * Clears the internal buffer. - * The next data received from the input will be treated as a new - * PacketProto stream. - * - * @param enc the object - */ -void PacketProtoDecoder_Reset (PacketProtoDecoder *enc); - -#endif diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/flow/PacketProtoEncoder.c b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/flow/PacketProtoEncoder.c deleted file mode 100644 index 64c542df..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/flow/PacketProtoEncoder.c +++ /dev/null @@ -1,101 +0,0 @@ -/** - * @file PacketProtoEncoder.c - * @author Ambroz Bizjak - * - * @section LICENSE - * - * 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 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE 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. - */ - -#include -#include - -#include "protocol/packetproto.h" -#include "misc/balign.h" -#include "misc/debug.h" -#include "misc/byteorder.h" - -#include "flow/PacketProtoEncoder.h" - -static void output_handler_recv (PacketProtoEncoder *enc, uint8_t *data) -{ - ASSERT(!enc->output_packet) - ASSERT(data) - DebugObject_Access(&enc->d_obj); - - // schedule receive - enc->output_packet = data; - PacketRecvInterface_Receiver_Recv(enc->input, enc->output_packet + sizeof(struct packetproto_header)); -} - -static void input_handler_done (PacketProtoEncoder *enc, int in_len) -{ - ASSERT(enc->output_packet) - DebugObject_Access(&enc->d_obj); - - // write length - struct packetproto_header pp; - pp.len = htol16(in_len); - memcpy(enc->output_packet, &pp, sizeof(pp)); - - // finish output packet - enc->output_packet = NULL; - PacketRecvInterface_Done(&enc->output, PACKETPROTO_ENCLEN(in_len)); -} - -void PacketProtoEncoder_Init (PacketProtoEncoder *enc, PacketRecvInterface *input, BPendingGroup *pg) -{ - ASSERT(PacketRecvInterface_GetMTU(input) <= PACKETPROTO_MAXPAYLOAD) - - // init arguments - enc->input = input; - - // init input - PacketRecvInterface_Receiver_Init(enc->input, (PacketRecvInterface_handler_done)input_handler_done, enc); - - // init output - PacketRecvInterface_Init( - &enc->output, PACKETPROTO_ENCLEN(PacketRecvInterface_GetMTU(enc->input)), - (PacketRecvInterface_handler_recv)output_handler_recv, enc, pg - ); - - // set no output packet - enc->output_packet = NULL; - - DebugObject_Init(&enc->d_obj); -} - -void PacketProtoEncoder_Free (PacketProtoEncoder *enc) -{ - DebugObject_Free(&enc->d_obj); - - // free input - PacketRecvInterface_Free(&enc->output); -} - -PacketRecvInterface * PacketProtoEncoder_GetOutput (PacketProtoEncoder *enc) -{ - DebugObject_Access(&enc->d_obj); - - return &enc->output; -} diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/flow/PacketProtoEncoder.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/flow/PacketProtoEncoder.h deleted file mode 100644 index c0bf9a2c..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/flow/PacketProtoEncoder.h +++ /dev/null @@ -1,80 +0,0 @@ -/** - * @file PacketProtoEncoder.h - * @author Ambroz Bizjak - * - * @section LICENSE - * - * 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 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE 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. - * - * @section DESCRIPTION - * - * Object which encodes packets according to PacketProto. - */ - -#ifndef BADVPN_FLOW_PACKETPROTOENCODER_H -#define BADVPN_FLOW_PACKETPROTOENCODER_H - -#include - -#include "base/DebugObject.h" -#include "flow/PacketRecvInterface.h" - -/** - * Object which encodes packets according to PacketProto. - * - * Input is with {@link PacketRecvInterface}. - * Output is with {@link PacketRecvInterface}. - */ -typedef struct { - PacketRecvInterface *input; - PacketRecvInterface output; - uint8_t *output_packet; - DebugObject d_obj; -} PacketProtoEncoder; - -/** - * Initializes the object. - * - * @param enc the object - * @param input input interface. Its MTU must be <=PACKETPROTO_MAXPAYLOAD. - * @param pg pending group - */ -void PacketProtoEncoder_Init (PacketProtoEncoder *enc, PacketRecvInterface *input, BPendingGroup *pg); - -/** - * Frees the object. - * - * @param enc the object - */ -void PacketProtoEncoder_Free (PacketProtoEncoder *enc); - -/** - * Returns the output interface. - * The MTU of the output interface is PACKETPROTO_ENCLEN(MTU of input interface). - * - * @param enc the object - * @return output interface - */ -PacketRecvInterface * PacketProtoEncoder_GetOutput (PacketProtoEncoder *enc); - -#endif diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/flow/PacketProtoFlow.c b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/flow/PacketProtoFlow.c deleted file mode 100644 index bb63eb52..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/flow/PacketProtoFlow.c +++ /dev/null @@ -1,82 +0,0 @@ -/** - * @file PacketProtoFlow.c - * @author Ambroz Bizjak - * - * @section LICENSE - * - * 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 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE 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. - */ - -#include "protocol/packetproto.h" -#include "misc/debug.h" - -#include "flow/PacketProtoFlow.h" - -int PacketProtoFlow_Init (PacketProtoFlow *o, int input_mtu, int num_packets, PacketPassInterface *output, BPendingGroup *pg) -{ - ASSERT(input_mtu >= 0) - ASSERT(input_mtu <= PACKETPROTO_MAXPAYLOAD) - ASSERT(num_packets > 0) - ASSERT(PacketPassInterface_GetMTU(output) >= PACKETPROTO_ENCLEN(input_mtu)) - - // init async input - BufferWriter_Init(&o->ainput, input_mtu, pg); - - // init encoder - PacketProtoEncoder_Init(&o->encoder, BufferWriter_GetOutput(&o->ainput), pg); - - // init buffer - if (!PacketBuffer_Init(&o->buffer, PacketProtoEncoder_GetOutput(&o->encoder), output, num_packets, pg)) { - goto fail0; - } - - DebugObject_Init(&o->d_obj); - - return 1; - -fail0: - PacketProtoEncoder_Free(&o->encoder); - BufferWriter_Free(&o->ainput); - return 0; -} - -void PacketProtoFlow_Free (PacketProtoFlow *o) -{ - DebugObject_Free(&o->d_obj); - - // free buffer - PacketBuffer_Free(&o->buffer); - - // free encoder - PacketProtoEncoder_Free(&o->encoder); - - // free async input - BufferWriter_Free(&o->ainput); -} - -BufferWriter * PacketProtoFlow_GetInput (PacketProtoFlow *o) -{ - DebugObject_Access(&o->d_obj); - - return &o->ainput; -} diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/flow/PacketProtoFlow.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/flow/PacketProtoFlow.h deleted file mode 100644 index da9b8ec4..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/flow/PacketProtoFlow.h +++ /dev/null @@ -1,83 +0,0 @@ -/** - * @file PacketProtoFlow.h - * @author Ambroz Bizjak - * - * @section LICENSE - * - * 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 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE 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. - * - * @section DESCRIPTION - * - * Buffer which encodes packets with PacketProto, with {@link BufferWriter} - * input and {@link PacketPassInterface} output. - */ - -#ifndef BADVPN_FLOW_PACKETPROTOFLOW_H -#define BADVPN_FLOW_PACKETPROTOFLOW_H - -#include "misc/debug.h" - -#include "base/DebugObject.h" -#include "flow/BufferWriter.h" -#include "flow/PacketProtoEncoder.h" -#include "flow/PacketBuffer.h" - -/** - * Buffer which encodes packets with PacketProto, with {@link BufferWriter} - * input and {@link PacketPassInterface} output. - */ -typedef struct { - BufferWriter ainput; - PacketProtoEncoder encoder; - PacketBuffer buffer; - DebugObject d_obj; -} PacketProtoFlow; - -/** - * Initializes the object. - * - * @param o the object - * @param input_mtu maximum input packet size. Must be >=0 and <=PACKETPROTO_MAXPAYLOAD. - * @param num_packets minimum number of packets the buffer should hold. Must be >0. - * @param output output interface. Its MTU must be >=PACKETPROTO_ENCLEN(input_mtu). - * @param pg pending group - * @return 1 on success, 0 on failure - */ -int PacketProtoFlow_Init (PacketProtoFlow *o, int input_mtu, int num_packets, PacketPassInterface *output, BPendingGroup *pg) WARN_UNUSED; - -/** - * Frees the object. - * - * @param o the object - */ -void PacketProtoFlow_Free (PacketProtoFlow *o); - -/** - * Returns the input interface. - * - * @param o the object - * @return input interface - */ -BufferWriter * PacketProtoFlow_GetInput (PacketProtoFlow *o); - -#endif diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/flow/PacketRecvInterface.c b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/flow/PacketRecvInterface.c deleted file mode 100644 index 244fbbfd..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/flow/PacketRecvInterface.c +++ /dev/null @@ -1,56 +0,0 @@ -/** - * @file PacketRecvInterface.c - * @author Ambroz Bizjak - * - * @section LICENSE - * - * 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 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE 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. - */ - -#include "flow/PacketRecvInterface.h" - -void _PacketRecvInterface_job_operation (PacketRecvInterface *i) -{ - ASSERT(i->state == PRI_STATE_OPERATION_PENDING) - DebugObject_Access(&i->d_obj); - - // set state - i->state = PRI_STATE_BUSY; - - // call handler - i->handler_operation(i->user_provider, i->job_operation_data); - return; -} - -void _PacketRecvInterface_job_done (PacketRecvInterface *i) -{ - ASSERT(i->state == PRI_STATE_DONE_PENDING) - DebugObject_Access(&i->d_obj); - - // set state - i->state = PRI_STATE_NONE; - - // call handler - i->handler_done(i->user_user, i->job_done_len); - return; -} diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/flow/PacketRecvInterface.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/flow/PacketRecvInterface.h deleted file mode 100644 index 9dcc34eb..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/flow/PacketRecvInterface.h +++ /dev/null @@ -1,170 +0,0 @@ -/** - * @file PacketRecvInterface.h - * @author Ambroz Bizjak - * - * @section LICENSE - * - * 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 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE 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. - * - * @section DESCRIPTION - * - * Interface allowing a packet receiver to receive data packets from a packet sender. - */ - -#ifndef BADVPN_FLOW_PACKETRECVINTERFACE_H -#define BADVPN_FLOW_PACKETRECVINTERFACE_H - -#include -#include - -#include "misc/debug.h" -#include "base/DebugObject.h" -#include "base/BPending.h" - -#define PRI_STATE_NONE 1 -#define PRI_STATE_OPERATION_PENDING 2 -#define PRI_STATE_BUSY 3 -#define PRI_STATE_DONE_PENDING 4 - -typedef void (*PacketRecvInterface_handler_recv) (void *user, uint8_t *data); - -typedef void (*PacketRecvInterface_handler_done) (void *user, int data_len); - -typedef struct { - // provider data - int mtu; - PacketRecvInterface_handler_recv handler_operation; - void *user_provider; - - // user data - PacketRecvInterface_handler_done handler_done; - void *user_user; - - // operation job - BPending job_operation; - uint8_t *job_operation_data; - - // done job - BPending job_done; - int job_done_len; - - // state - int state; - - DebugObject d_obj; -} PacketRecvInterface; - -static void PacketRecvInterface_Init (PacketRecvInterface *i, int mtu, PacketRecvInterface_handler_recv handler_operation, void *user, BPendingGroup *pg); - -static void PacketRecvInterface_Free (PacketRecvInterface *i); - -static void PacketRecvInterface_Done (PacketRecvInterface *i, int data_len); - -static int PacketRecvInterface_GetMTU (PacketRecvInterface *i); - -static void PacketRecvInterface_Receiver_Init (PacketRecvInterface *i, PacketRecvInterface_handler_done handler_done, void *user); - -static void PacketRecvInterface_Receiver_Recv (PacketRecvInterface *i, uint8_t *data); - -void _PacketRecvInterface_job_operation (PacketRecvInterface *i); -void _PacketRecvInterface_job_done (PacketRecvInterface *i); - -void PacketRecvInterface_Init (PacketRecvInterface *i, int mtu, PacketRecvInterface_handler_recv handler_operation, void *user, BPendingGroup *pg) -{ - ASSERT(mtu >= 0) - - // init arguments - i->mtu = mtu; - i->handler_operation = handler_operation; - i->user_provider = user; - - // set no user - i->handler_done = NULL; - - // init jobs - BPending_Init(&i->job_operation, pg, (BPending_handler)_PacketRecvInterface_job_operation, i); - BPending_Init(&i->job_done, pg, (BPending_handler)_PacketRecvInterface_job_done, i); - - // set state - i->state = PRI_STATE_NONE; - - DebugObject_Init(&i->d_obj); -} - -void PacketRecvInterface_Free (PacketRecvInterface *i) -{ - DebugObject_Free(&i->d_obj); - - // free jobs - BPending_Free(&i->job_done); - BPending_Free(&i->job_operation); -} - -void PacketRecvInterface_Done (PacketRecvInterface *i, int data_len) -{ - ASSERT(data_len >= 0) - ASSERT(data_len <= i->mtu) - ASSERT(i->state == PRI_STATE_BUSY) - DebugObject_Access(&i->d_obj); - - // schedule done - i->job_done_len = data_len; - BPending_Set(&i->job_done); - - // set state - i->state = PRI_STATE_DONE_PENDING; -} - -int PacketRecvInterface_GetMTU (PacketRecvInterface *i) -{ - DebugObject_Access(&i->d_obj); - - return i->mtu; -} - -void PacketRecvInterface_Receiver_Init (PacketRecvInterface *i, PacketRecvInterface_handler_done handler_done, void *user) -{ - ASSERT(handler_done) - ASSERT(!i->handler_done) - DebugObject_Access(&i->d_obj); - - i->handler_done = handler_done; - i->user_user = user; -} - -void PacketRecvInterface_Receiver_Recv (PacketRecvInterface *i, uint8_t *data) -{ - ASSERT(!(i->mtu > 0) || data) - ASSERT(i->state == PRI_STATE_NONE) - ASSERT(i->handler_done) - DebugObject_Access(&i->d_obj); - - // schedule operation - i->job_operation_data = data; - BPending_Set(&i->job_operation); - - // set state - i->state = PRI_STATE_OPERATION_PENDING; -} - -#endif diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/flow/PacketStreamSender.c b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/flow/PacketStreamSender.c deleted file mode 100644 index 6a5eebdd..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/flow/PacketStreamSender.c +++ /dev/null @@ -1,111 +0,0 @@ -/** - * @file PacketStreamSender.c - * @author Ambroz Bizjak - * - * @section LICENSE - * - * 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 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE 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. - */ - -#include - -#include "misc/debug.h" - -#include "flow/PacketStreamSender.h" - -static void send_data (PacketStreamSender *s) -{ - ASSERT(s->in_len >= 0) - - if (s->in_used < s->in_len) { - // send more data - StreamPassInterface_Sender_Send(s->output, s->in + s->in_used, s->in_len - s->in_used); - } else { - // finish input packet - s->in_len = -1; - PacketPassInterface_Done(&s->input); - } -} - -static void input_handler_send (PacketStreamSender *s, uint8_t *data, int data_len) -{ - ASSERT(s->in_len == -1) - ASSERT(data_len >= 0) - DebugObject_Access(&s->d_obj); - - // set input packet - s->in_len = data_len; - s->in = data; - s->in_used = 0; - - // send - send_data(s); -} - -static void output_handler_done (PacketStreamSender *s, int data_len) -{ - ASSERT(s->in_len >= 0) - ASSERT(data_len > 0) - ASSERT(data_len <= s->in_len - s->in_used) - DebugObject_Access(&s->d_obj); - - // update number of bytes sent - s->in_used += data_len; - - // send - send_data(s); -} - -void PacketStreamSender_Init (PacketStreamSender *s, StreamPassInterface *output, int mtu, BPendingGroup *pg) -{ - ASSERT(mtu >= 0) - - // init arguments - s->output = output; - - // init input - PacketPassInterface_Init(&s->input, mtu, (PacketPassInterface_handler_send)input_handler_send, s, pg); - - // init output - StreamPassInterface_Sender_Init(s->output, (StreamPassInterface_handler_done)output_handler_done, s); - - // have no input packet - s->in_len = -1; - - DebugObject_Init(&s->d_obj); -} - -void PacketStreamSender_Free (PacketStreamSender *s) -{ - DebugObject_Free(&s->d_obj); - - // free input - PacketPassInterface_Free(&s->input); -} - -PacketPassInterface * PacketStreamSender_GetInput (PacketStreamSender *s) -{ - DebugObject_Access(&s->d_obj); - - return &s->input; -} diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/flow/PacketStreamSender.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/flow/PacketStreamSender.h deleted file mode 100644 index 53bdb2cb..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/flow/PacketStreamSender.h +++ /dev/null @@ -1,83 +0,0 @@ -/** - * @file PacketStreamSender.h - * @author Ambroz Bizjak - * - * @section LICENSE - * - * 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 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE 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. - * - * @section DESCRIPTION - * - * Object which forwards packets obtained with {@link PacketPassInterface} - * as a stream with {@link StreamPassInterface} (i.e. it concatenates them). - */ - -#ifndef BADVPN_FLOW_PACKETSTREAMSENDER_H -#define BADVPN_FLOW_PACKETSTREAMSENDER_H - -#include - -#include "base/DebugObject.h" -#include "flow/PacketPassInterface.h" -#include "flow/StreamPassInterface.h" - -/** - * Object which forwards packets obtained with {@link PacketPassInterface} - * as a stream with {@link StreamPassInterface} (i.e. it concatenates them). - */ -typedef struct { - DebugObject d_obj; - PacketPassInterface input; - StreamPassInterface *output; - int in_len; - uint8_t *in; - int in_used; -} PacketStreamSender; - -/** - * Initializes the object. - * - * @param s the object - * @param output output interface - * @param mtu input MTU. Must be >=0. - * @param pg pending group - */ -void PacketStreamSender_Init (PacketStreamSender *s, StreamPassInterface *output, int mtu, BPendingGroup *pg); - -/** - * Frees the object. - * - * @param s the object - */ -void PacketStreamSender_Free (PacketStreamSender *s); - -/** - * Returns the input interface. - * Its MTU will be as in {@link PacketStreamSender_Init}. - * - * @param s the object - * @return input interface - */ -PacketPassInterface * PacketStreamSender_GetInput (PacketStreamSender *s); - -#endif diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/flow/SinglePacketBuffer.c b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/flow/SinglePacketBuffer.c deleted file mode 100644 index 3e5d886c..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/flow/SinglePacketBuffer.c +++ /dev/null @@ -1,87 +0,0 @@ -/** - * @file SinglePacketBuffer.c - * @author Ambroz Bizjak - * - * @section LICENSE - * - * 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 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE 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. - */ - -#include - -#include "misc/debug.h" -#include "misc/balloc.h" - -#include "flow/SinglePacketBuffer.h" - -static void input_handler_done (SinglePacketBuffer *o, int in_len) -{ - DebugObject_Access(&o->d_obj); - - PacketPassInterface_Sender_Send(o->output, o->buf, in_len); -} - -static void output_handler_done (SinglePacketBuffer *o) -{ - DebugObject_Access(&o->d_obj); - - PacketRecvInterface_Receiver_Recv(o->input, o->buf); -} - -int SinglePacketBuffer_Init (SinglePacketBuffer *o, PacketRecvInterface *input, PacketPassInterface *output, BPendingGroup *pg) -{ - ASSERT(PacketPassInterface_GetMTU(output) >= PacketRecvInterface_GetMTU(input)) - - // init arguments - o->input = input; - o->output = output; - - // init input - PacketRecvInterface_Receiver_Init(o->input, (PacketRecvInterface_handler_done)input_handler_done, o); - - // init output - PacketPassInterface_Sender_Init(o->output, (PacketPassInterface_handler_done)output_handler_done, o); - - // init buffer - if (!(o->buf = (uint8_t *)BAlloc(PacketRecvInterface_GetMTU(o->input)))) { - goto fail1; - } - - // schedule receive - PacketRecvInterface_Receiver_Recv(o->input, o->buf); - - DebugObject_Init(&o->d_obj); - - return 1; - -fail1: - return 0; -} - -void SinglePacketBuffer_Free (SinglePacketBuffer *o) -{ - DebugObject_Free(&o->d_obj); - - // free buffer - BFree(o->buf); -} diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/flow/SinglePacketBuffer.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/flow/SinglePacketBuffer.h deleted file mode 100644 index bbbd6794..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/flow/SinglePacketBuffer.h +++ /dev/null @@ -1,75 +0,0 @@ -/** - * @file SinglePacketBuffer.h - * @author Ambroz Bizjak - * - * @section LICENSE - * - * 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 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE 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. - * - * @section DESCRIPTION - * - * Packet buffer with {@link PacketRecvInterface} input and {@link PacketPassInterface} output - * than can store only a single packet. - */ - -#ifndef BADVPN_FLOW_SINGLEPACKETBUFFER_H -#define BADVPN_FLOW_SINGLEPACKETBUFFER_H - -#include - -#include "misc/debug.h" -#include "base/DebugObject.h" -#include "flow/PacketRecvInterface.h" -#include "flow/PacketPassInterface.h" - -/** - * Packet buffer with {@link PacketRecvInterface} input and {@link PacketPassInterface} output - * than can store only a single packet. - */ -typedef struct { - DebugObject d_obj; - PacketRecvInterface *input; - PacketPassInterface *output; - uint8_t *buf; -} SinglePacketBuffer; - -/** - * Initializes the object. - * Output MTU must be >= input MTU. - * - * @param o the object - * @param input input interface - * @param output output interface - * @param pg pending group - * @return 1 on success, 0 on failure - */ -int SinglePacketBuffer_Init (SinglePacketBuffer *o, PacketRecvInterface *input, PacketPassInterface *output, BPendingGroup *pg) WARN_UNUSED; - -/** - * Frees the object - * - * @param o the object - */ -void SinglePacketBuffer_Free (SinglePacketBuffer *o); - -#endif diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/flow/StreamPassInterface.c b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/flow/StreamPassInterface.c deleted file mode 100644 index 1c57f565..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/flow/StreamPassInterface.c +++ /dev/null @@ -1,56 +0,0 @@ -/** - * @file StreamPassInterface.c - * @author Ambroz Bizjak - * - * @section LICENSE - * - * 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 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE 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. - */ - -#include "flow/StreamPassInterface.h" - -void _StreamPassInterface_job_operation (StreamPassInterface *i) -{ - ASSERT(i->state == SPI_STATE_OPERATION_PENDING) - DebugObject_Access(&i->d_obj); - - // set state - i->state = SPI_STATE_BUSY; - - // call handler - i->handler_operation(i->user_provider, i->job_operation_data, i->job_operation_len); - return; -} - -void _StreamPassInterface_job_done (StreamPassInterface *i) -{ - ASSERT(i->state == SPI_STATE_DONE_PENDING) - DebugObject_Access(&i->d_obj); - - // set state - i->state = SPI_STATE_NONE; - - // call handler - i->handler_done(i->user_user, i->job_done_len); - return; -} diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/flow/StreamPassInterface.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/flow/StreamPassInterface.h deleted file mode 100644 index 69e1064e..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/flow/StreamPassInterface.h +++ /dev/null @@ -1,165 +0,0 @@ -/** - * @file StreamPassInterface.h - * @author Ambroz Bizjak - * - * @section LICENSE - * - * 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 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE 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. - * - * @section DESCRIPTION - * - * Interface allowing a stream sender to pass stream data to a stream receiver. - * - * Note that this interface behaves exactly the same and has the same code as - * {@link StreamRecvInterface} if names and its external semantics are disregarded. - * If you modify this file, you should probably modify {@link StreamRecvInterface} - * too. - */ - -#ifndef BADVPN_FLOW_STREAMPASSINTERFACE_H -#define BADVPN_FLOW_STREAMPASSINTERFACE_H - -#include -#include - -#include "misc/debug.h" -#include "base/DebugObject.h" -#include "base/BPending.h" - -#define SPI_STATE_NONE 1 -#define SPI_STATE_OPERATION_PENDING 2 -#define SPI_STATE_BUSY 3 -#define SPI_STATE_DONE_PENDING 4 - -typedef void (*StreamPassInterface_handler_send) (void *user, uint8_t *data, int data_len); - -typedef void (*StreamPassInterface_handler_done) (void *user, int data_len); - -typedef struct { - // provider data - StreamPassInterface_handler_send handler_operation; - void *user_provider; - - // user data - StreamPassInterface_handler_done handler_done; - void *user_user; - - // operation job - BPending job_operation; - uint8_t *job_operation_data; - int job_operation_len; - - // done job - BPending job_done; - int job_done_len; - - // state - int state; - - DebugObject d_obj; -} StreamPassInterface; - -static void StreamPassInterface_Init (StreamPassInterface *i, StreamPassInterface_handler_send handler_operation, void *user, BPendingGroup *pg); - -static void StreamPassInterface_Free (StreamPassInterface *i); - -static void StreamPassInterface_Done (StreamPassInterface *i, int data_len); - -static void StreamPassInterface_Sender_Init (StreamPassInterface *i, StreamPassInterface_handler_done handler_done, void *user); - -static void StreamPassInterface_Sender_Send (StreamPassInterface *i, uint8_t *data, int data_len); - -void _StreamPassInterface_job_operation (StreamPassInterface *i); -void _StreamPassInterface_job_done (StreamPassInterface *i); - -void StreamPassInterface_Init (StreamPassInterface *i, StreamPassInterface_handler_send handler_operation, void *user, BPendingGroup *pg) -{ - // init arguments - i->handler_operation = handler_operation; - i->user_provider = user; - - // set no user - i->handler_done = NULL; - - // init jobs - BPending_Init(&i->job_operation, pg, (BPending_handler)_StreamPassInterface_job_operation, i); - BPending_Init(&i->job_done, pg, (BPending_handler)_StreamPassInterface_job_done, i); - - // set state - i->state = SPI_STATE_NONE; - - DebugObject_Init(&i->d_obj); -} - -void StreamPassInterface_Free (StreamPassInterface *i) -{ - DebugObject_Free(&i->d_obj); - - // free jobs - BPending_Free(&i->job_done); - BPending_Free(&i->job_operation); -} - -void StreamPassInterface_Done (StreamPassInterface *i, int data_len) -{ - ASSERT(i->state == SPI_STATE_BUSY) - ASSERT(data_len > 0) - ASSERT(data_len <= i->job_operation_len) - DebugObject_Access(&i->d_obj); - - // schedule done - i->job_done_len = data_len; - BPending_Set(&i->job_done); - - // set state - i->state = SPI_STATE_DONE_PENDING; -} - -void StreamPassInterface_Sender_Init (StreamPassInterface *i, StreamPassInterface_handler_done handler_done, void *user) -{ - ASSERT(handler_done) - ASSERT(!i->handler_done) - DebugObject_Access(&i->d_obj); - - i->handler_done = handler_done; - i->user_user = user; -} - -void StreamPassInterface_Sender_Send (StreamPassInterface *i, uint8_t *data, int data_len) -{ - ASSERT(data_len > 0) - ASSERT(data) - ASSERT(i->state == SPI_STATE_NONE) - ASSERT(i->handler_done) - DebugObject_Access(&i->d_obj); - - // schedule operation - i->job_operation_data = data; - i->job_operation_len = data_len; - BPending_Set(&i->job_operation); - - // set state - i->state = SPI_STATE_OPERATION_PENDING; -} - -#endif diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/flow/StreamRecvInterface.c b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/flow/StreamRecvInterface.c deleted file mode 100644 index 0b7820dc..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/flow/StreamRecvInterface.c +++ /dev/null @@ -1,56 +0,0 @@ -/** - * @file StreamRecvInterface.c - * @author Ambroz Bizjak - * - * @section LICENSE - * - * 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 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE 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. - */ - -#include "flow/StreamRecvInterface.h" - -void _StreamRecvInterface_job_operation (StreamRecvInterface *i) -{ - ASSERT(i->state == SRI_STATE_OPERATION_PENDING) - DebugObject_Access(&i->d_obj); - - // set state - i->state = SRI_STATE_BUSY; - - // call handler - i->handler_operation(i->user_provider, i->job_operation_data, i->job_operation_len); - return; -} - -void _StreamRecvInterface_job_done (StreamRecvInterface *i) -{ - ASSERT(i->state == SRI_STATE_DONE_PENDING) - DebugObject_Access(&i->d_obj); - - // set state - i->state = SRI_STATE_NONE; - - // call handler - i->handler_done(i->user_user, i->job_done_len); - return; -} diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/flow/StreamRecvInterface.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/flow/StreamRecvInterface.h deleted file mode 100644 index b50f5a39..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/flow/StreamRecvInterface.h +++ /dev/null @@ -1,165 +0,0 @@ -/** - * @file StreamRecvInterface.h - * @author Ambroz Bizjak - * - * @section LICENSE - * - * 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 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE 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. - * - * @section DESCRIPTION - * - * Interface allowing a stream receiver to receive stream data from a stream sender. - * - * Note that this interface behaves exactly the same and has the same code as - * {@link StreamPassInterface} if names and its external semantics are disregarded. - * If you modify this file, you should probably modify {@link StreamPassInterface} - * too. - */ - -#ifndef BADVPN_FLOW_STREAMRECVINTERFACE_H -#define BADVPN_FLOW_STREAMRECVINTERFACE_H - -#include -#include - -#include "misc/debug.h" -#include "base/DebugObject.h" -#include "base/BPending.h" - -#define SRI_STATE_NONE 1 -#define SRI_STATE_OPERATION_PENDING 2 -#define SRI_STATE_BUSY 3 -#define SRI_STATE_DONE_PENDING 4 - -typedef void (*StreamRecvInterface_handler_recv) (void *user, uint8_t *data, int data_len); - -typedef void (*StreamRecvInterface_handler_done) (void *user, int data_len); - -typedef struct { - // provider data - StreamRecvInterface_handler_recv handler_operation; - void *user_provider; - - // user data - StreamRecvInterface_handler_done handler_done; - void *user_user; - - // operation job - BPending job_operation; - uint8_t *job_operation_data; - int job_operation_len; - - // done job - BPending job_done; - int job_done_len; - - // state - int state; - - DebugObject d_obj; -} StreamRecvInterface; - -static void StreamRecvInterface_Init (StreamRecvInterface *i, StreamRecvInterface_handler_recv handler_operation, void *user, BPendingGroup *pg); - -static void StreamRecvInterface_Free (StreamRecvInterface *i); - -static void StreamRecvInterface_Done (StreamRecvInterface *i, int data_len); - -static void StreamRecvInterface_Receiver_Init (StreamRecvInterface *i, StreamRecvInterface_handler_done handler_done, void *user); - -static void StreamRecvInterface_Receiver_Recv (StreamRecvInterface *i, uint8_t *data, int data_len); - -void _StreamRecvInterface_job_operation (StreamRecvInterface *i); -void _StreamRecvInterface_job_done (StreamRecvInterface *i); - -void StreamRecvInterface_Init (StreamRecvInterface *i, StreamRecvInterface_handler_recv handler_operation, void *user, BPendingGroup *pg) -{ - // init arguments - i->handler_operation = handler_operation; - i->user_provider = user; - - // set no user - i->handler_done = NULL; - - // init jobs - BPending_Init(&i->job_operation, pg, (BPending_handler)_StreamRecvInterface_job_operation, i); - BPending_Init(&i->job_done, pg, (BPending_handler)_StreamRecvInterface_job_done, i); - - // set state - i->state = SRI_STATE_NONE; - - DebugObject_Init(&i->d_obj); -} - -void StreamRecvInterface_Free (StreamRecvInterface *i) -{ - DebugObject_Free(&i->d_obj); - - // free jobs - BPending_Free(&i->job_done); - BPending_Free(&i->job_operation); -} - -void StreamRecvInterface_Done (StreamRecvInterface *i, int data_len) -{ - ASSERT(i->state == SRI_STATE_BUSY) - ASSERT(data_len > 0) - ASSERT(data_len <= i->job_operation_len) - DebugObject_Access(&i->d_obj); - - // schedule done - i->job_done_len = data_len; - BPending_Set(&i->job_done); - - // set state - i->state = SRI_STATE_DONE_PENDING; -} - -void StreamRecvInterface_Receiver_Init (StreamRecvInterface *i, StreamRecvInterface_handler_done handler_done, void *user) -{ - ASSERT(handler_done) - ASSERT(!i->handler_done) - DebugObject_Access(&i->d_obj); - - i->handler_done = handler_done; - i->user_user = user; -} - -void StreamRecvInterface_Receiver_Recv (StreamRecvInterface *i, uint8_t *data, int data_len) -{ - ASSERT(data_len > 0) - ASSERT(data) - ASSERT(i->state == SRI_STATE_NONE) - ASSERT(i->handler_done) - DebugObject_Access(&i->d_obj); - - // schedule operation - i->job_operation_data = data; - i->job_operation_len = data_len; - BPending_Set(&i->job_operation); - - // set state - i->state = SRI_STATE_OPERATION_PENDING; -} - -#endif diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/flowextra/PacketPassInactivityMonitor.c b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/flowextra/PacketPassInactivityMonitor.c deleted file mode 100644 index 6531fe01..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/flowextra/PacketPassInactivityMonitor.c +++ /dev/null @@ -1,131 +0,0 @@ -/** - * @file PacketPassInactivityMonitor.c - * @author Ambroz Bizjak - * - * @section LICENSE - * - * 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 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE 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. - */ - -#include "PacketPassInactivityMonitor.h" - -static void input_handler_send (PacketPassInactivityMonitor *o, uint8_t *data, int data_len) -{ - DebugObject_Access(&o->d_obj); - - // schedule send - PacketPassInterface_Sender_Send(o->output, data, data_len); - - // stop timer - BReactor_RemoveTimer(o->reactor, &o->timer); -} - -static void input_handler_requestcancel (PacketPassInactivityMonitor *o) -{ - DebugObject_Access(&o->d_obj); - - // request cancel - PacketPassInterface_Sender_RequestCancel(o->output); -} - -static void output_handler_done (PacketPassInactivityMonitor *o) -{ - DebugObject_Access(&o->d_obj); - - // output no longer busy, restart timer - BReactor_SetTimer(o->reactor, &o->timer); - - // call done - PacketPassInterface_Done(&o->input); -} - -static void timer_handler (PacketPassInactivityMonitor *o) -{ - DebugObject_Access(&o->d_obj); - - // restart timer - BReactor_SetTimer(o->reactor, &o->timer); - - // call handler - if (o->handler) { - o->handler(o->user); - return; - } -} - -void PacketPassInactivityMonitor_Init (PacketPassInactivityMonitor *o, PacketPassInterface *output, BReactor *reactor, btime_t interval, PacketPassInactivityMonitor_handler handler, void *user) -{ - // init arguments - o->output = output; - o->reactor = reactor; - o->handler = handler; - o->user = user; - - // init input - PacketPassInterface_Init(&o->input, PacketPassInterface_GetMTU(o->output), (PacketPassInterface_handler_send)input_handler_send, o, BReactor_PendingGroup(o->reactor)); - if (PacketPassInterface_HasCancel(o->output)) { - PacketPassInterface_EnableCancel(&o->input, (PacketPassInterface_handler_requestcancel)input_handler_requestcancel); - } - - // init output - PacketPassInterface_Sender_Init(o->output, (PacketPassInterface_handler_done)output_handler_done, o); - - // init timer - BTimer_Init(&o->timer, interval, (BTimer_handler)timer_handler, o); - BReactor_SetTimer(o->reactor, &o->timer); - - DebugObject_Init(&o->d_obj); -} - -void PacketPassInactivityMonitor_Free (PacketPassInactivityMonitor *o) -{ - DebugObject_Free(&o->d_obj); - - // free timer - BReactor_RemoveTimer(o->reactor, &o->timer); - - // free input - PacketPassInterface_Free(&o->input); -} - -PacketPassInterface * PacketPassInactivityMonitor_GetInput (PacketPassInactivityMonitor *o) -{ - DebugObject_Access(&o->d_obj); - - return &o->input; -} - -void PacketPassInactivityMonitor_SetHandler (PacketPassInactivityMonitor *o, PacketPassInactivityMonitor_handler handler, void *user) -{ - DebugObject_Access(&o->d_obj); - - o->handler = handler; - o->user = user; -} - -void PacketPassInactivityMonitor_Force (PacketPassInactivityMonitor *o) -{ - DebugObject_Access(&o->d_obj); - - BReactor_SetTimerAfter(o->reactor, &o->timer, 0); -} diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/flowextra/PacketPassInactivityMonitor.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/flowextra/PacketPassInactivityMonitor.h deleted file mode 100644 index 7805d483..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/flowextra/PacketPassInactivityMonitor.h +++ /dev/null @@ -1,124 +0,0 @@ -/** - * @file PacketPassInactivityMonitor.h - * @author Ambroz Bizjak - * - * @section LICENSE - * - * 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 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE 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. - * - * @section DESCRIPTION - * - * A {@link PacketPassInterface} layer for detecting inactivity. - */ - -#ifndef BADVPN_PACKETPASSINACTIVITYMONITOR_H -#define BADVPN_PACKETPASSINACTIVITYMONITOR_H - -#include "base/DebugObject.h" -#include "system/BReactor.h" -#include "flow/PacketPassInterface.h" - -/** - * Handler function invoked when inactivity is detected. - * It is guaranteed that the interfaces are in not sending state. - * - * @param user value given to {@link PacketPassInactivityMonitor_Init} - */ -typedef void (*PacketPassInactivityMonitor_handler) (void *user); - -/** - * A {@link PacketPassInterface} layer for detecting inactivity. - * It reports inactivity to a user provided handler function. - * - * The object behaves like that: - * ("timer set" means started with the given timeout whether if was running or not, - * "timer unset" means stopped if it was running) - * - There is a timer. - * - The timer is set when the object is initialized. - * - When the input calls Send, the call is passed on to the output. - * If the output accepted the packet, the timer is set. If the output - * blocked the packet, the timer is unset. - * - When the output calls Done, the timer is set, and the call is - * passed on to the input. - * - When the input calls Cancel, the timer is set, and the call is - * passed on to the output. - * - When the timer expires, the timer is set, ant the user's handler - * function is invoked. - */ -typedef struct { - DebugObject d_obj; - PacketPassInterface *output; - BReactor *reactor; - PacketPassInactivityMonitor_handler handler; - void *user; - PacketPassInterface input; - BTimer timer; -} PacketPassInactivityMonitor; - -/** - * Initializes the object. - * See {@link PacketPassInactivityMonitor} for details. - * - * @param o the object - * @param output output interface - * @param reactor reactor we live in - * @param interval timer value in milliseconds - * @param handler handler function for reporting inactivity, or NULL to disable - * @param user value passed to handler functions - */ -void PacketPassInactivityMonitor_Init (PacketPassInactivityMonitor *o, PacketPassInterface *output, BReactor *reactor, btime_t interval, PacketPassInactivityMonitor_handler handler, void *user); - -/** - * Frees the object. - * - * @param o the object - */ -void PacketPassInactivityMonitor_Free (PacketPassInactivityMonitor *o); - -/** - * Returns the input interface. - * The MTU of the interface will be the same as of the output interface. - * The interface supports cancel functionality if the output interface supports it. - * - * @param o the object - * @return input interface - */ -PacketPassInterface * PacketPassInactivityMonitor_GetInput (PacketPassInactivityMonitor *o); - -/** - * Sets or removes the inactivity handler. - * - * @param o the object - * @param handler handler function for reporting inactivity, or NULL to disable - * @param user value passed to handler functions - */ -void PacketPassInactivityMonitor_SetHandler (PacketPassInactivityMonitor *o, PacketPassInactivityMonitor_handler handler, void *user); - -/** - * Sets the timer to expire immediately in order to force an inactivity report. - * - * @param o the object - */ -void PacketPassInactivityMonitor_Force (PacketPassInactivityMonitor *o); - -#endif diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_BArpProbe.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_BArpProbe.h deleted file mode 100644 index f168e638..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_BArpProbe.h +++ /dev/null @@ -1,4 +0,0 @@ -#ifdef BLOG_CURRENT_CHANNEL -#undef BLOG_CURRENT_CHANNEL -#endif -#define BLOG_CURRENT_CHANNEL BLOG_CHANNEL_BArpProbe diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_BConnection.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_BConnection.h deleted file mode 100644 index 8447db02..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_BConnection.h +++ /dev/null @@ -1,4 +0,0 @@ -#ifdef BLOG_CURRENT_CHANNEL -#undef BLOG_CURRENT_CHANNEL -#endif -#define BLOG_CURRENT_CHANNEL BLOG_CHANNEL_BConnection diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_BDHCPClient.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_BDHCPClient.h deleted file mode 100644 index aacf34db..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_BDHCPClient.h +++ /dev/null @@ -1,4 +0,0 @@ -#ifdef BLOG_CURRENT_CHANNEL -#undef BLOG_CURRENT_CHANNEL -#endif -#define BLOG_CURRENT_CHANNEL BLOG_CHANNEL_BDHCPClient diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_BDHCPClientCore.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_BDHCPClientCore.h deleted file mode 100644 index 64fc74d3..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_BDHCPClientCore.h +++ /dev/null @@ -1,4 +0,0 @@ -#ifdef BLOG_CURRENT_CHANNEL -#undef BLOG_CURRENT_CHANNEL -#endif -#define BLOG_CURRENT_CHANNEL BLOG_CHANNEL_BDHCPClientCore diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_BDatagram.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_BDatagram.h deleted file mode 100644 index d95cf245..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_BDatagram.h +++ /dev/null @@ -1,4 +0,0 @@ -#ifdef BLOG_CURRENT_CHANNEL -#undef BLOG_CURRENT_CHANNEL -#endif -#define BLOG_CURRENT_CHANNEL BLOG_CHANNEL_BDatagram diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_BEncryption.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_BEncryption.h deleted file mode 100644 index 6991f370..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_BEncryption.h +++ /dev/null @@ -1,4 +0,0 @@ -#ifdef BLOG_CURRENT_CHANNEL -#undef BLOG_CURRENT_CHANNEL -#endif -#define BLOG_CURRENT_CHANNEL BLOG_CHANNEL_BEncryption diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_BInputProcess.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_BInputProcess.h deleted file mode 100644 index f65f715a..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_BInputProcess.h +++ /dev/null @@ -1,4 +0,0 @@ -#ifdef BLOG_CURRENT_CHANNEL -#undef BLOG_CURRENT_CHANNEL -#endif -#define BLOG_CURRENT_CHANNEL BLOG_CHANNEL_BInputProcess diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_BLockReactor.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_BLockReactor.h deleted file mode 100644 index 5aab6d41..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_BLockReactor.h +++ /dev/null @@ -1,4 +0,0 @@ -#ifdef BLOG_CURRENT_CHANNEL -#undef BLOG_CURRENT_CHANNEL -#endif -#define BLOG_CURRENT_CHANNEL BLOG_CHANNEL_BLockReactor diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_BNetwork.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_BNetwork.h deleted file mode 100644 index c5e3bc1e..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_BNetwork.h +++ /dev/null @@ -1,4 +0,0 @@ -#ifdef BLOG_CURRENT_CHANNEL -#undef BLOG_CURRENT_CHANNEL -#endif -#define BLOG_CURRENT_CHANNEL BLOG_CHANNEL_BNetwork diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_BPredicate.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_BPredicate.h deleted file mode 100644 index 1a683f13..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_BPredicate.h +++ /dev/null @@ -1,4 +0,0 @@ -#ifdef BLOG_CURRENT_CHANNEL -#undef BLOG_CURRENT_CHANNEL -#endif -#define BLOG_CURRENT_CHANNEL BLOG_CHANNEL_BPredicate diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_BProcess.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_BProcess.h deleted file mode 100644 index e11e5a62..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_BProcess.h +++ /dev/null @@ -1,4 +0,0 @@ -#ifdef BLOG_CURRENT_CHANNEL -#undef BLOG_CURRENT_CHANNEL -#endif -#define BLOG_CURRENT_CHANNEL BLOG_CHANNEL_BProcess diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_BReactor.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_BReactor.h deleted file mode 100644 index d111dc79..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_BReactor.h +++ /dev/null @@ -1,4 +0,0 @@ -#ifdef BLOG_CURRENT_CHANNEL -#undef BLOG_CURRENT_CHANNEL -#endif -#define BLOG_CURRENT_CHANNEL BLOG_CHANNEL_BReactor diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_BSSLConnection.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_BSSLConnection.h deleted file mode 100644 index bd55826b..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_BSSLConnection.h +++ /dev/null @@ -1,4 +0,0 @@ -#ifdef BLOG_CURRENT_CHANNEL -#undef BLOG_CURRENT_CHANNEL -#endif -#define BLOG_CURRENT_CHANNEL BLOG_CHANNEL_BSSLConnection diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_BSignal.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_BSignal.h deleted file mode 100644 index 2820ebce..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_BSignal.h +++ /dev/null @@ -1,4 +0,0 @@ -#ifdef BLOG_CURRENT_CHANNEL -#undef BLOG_CURRENT_CHANNEL -#endif -#define BLOG_CURRENT_CHANNEL BLOG_CHANNEL_BSignal diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_BSocksClient.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_BSocksClient.h deleted file mode 100644 index 72086fab..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_BSocksClient.h +++ /dev/null @@ -1,4 +0,0 @@ -#ifdef BLOG_CURRENT_CHANNEL -#undef BLOG_CURRENT_CHANNEL -#endif -#define BLOG_CURRENT_CHANNEL BLOG_CHANNEL_BSocksClient diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_BTap.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_BTap.h deleted file mode 100644 index ab3e951e..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_BTap.h +++ /dev/null @@ -1,4 +0,0 @@ -#ifdef BLOG_CURRENT_CHANNEL -#undef BLOG_CURRENT_CHANNEL -#endif -#define BLOG_CURRENT_CHANNEL BLOG_CHANNEL_BTap diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_BThreadSignal.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_BThreadSignal.h deleted file mode 100644 index f39fc368..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_BThreadSignal.h +++ /dev/null @@ -1,4 +0,0 @@ -#ifdef BLOG_CURRENT_CHANNEL -#undef BLOG_CURRENT_CHANNEL -#endif -#define BLOG_CURRENT_CHANNEL BLOG_CHANNEL_BThreadSignal diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_BThreadWork.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_BThreadWork.h deleted file mode 100644 index f68383c2..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_BThreadWork.h +++ /dev/null @@ -1,4 +0,0 @@ -#ifdef BLOG_CURRENT_CHANNEL -#undef BLOG_CURRENT_CHANNEL -#endif -#define BLOG_CURRENT_CHANNEL BLOG_CHANNEL_BThreadWork diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_BTime.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_BTime.h deleted file mode 100644 index b323ee76..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_BTime.h +++ /dev/null @@ -1,4 +0,0 @@ -#ifdef BLOG_CURRENT_CHANNEL -#undef BLOG_CURRENT_CHANNEL -#endif -#define BLOG_CURRENT_CHANNEL BLOG_CHANNEL_BTime diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_BUnixSignal.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_BUnixSignal.h deleted file mode 100644 index 914b21b8..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_BUnixSignal.h +++ /dev/null @@ -1,4 +0,0 @@ -#ifdef BLOG_CURRENT_CHANNEL -#undef BLOG_CURRENT_CHANNEL -#endif -#define BLOG_CURRENT_CHANNEL BLOG_CHANNEL_BUnixSignal diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_DPReceive.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_DPReceive.h deleted file mode 100644 index 99889b56..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_DPReceive.h +++ /dev/null @@ -1,4 +0,0 @@ -#ifdef BLOG_CURRENT_CHANNEL -#undef BLOG_CURRENT_CHANNEL -#endif -#define BLOG_CURRENT_CHANNEL BLOG_CHANNEL_DPReceive diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_DPRelay.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_DPRelay.h deleted file mode 100644 index bc0153be..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_DPRelay.h +++ /dev/null @@ -1,4 +0,0 @@ -#ifdef BLOG_CURRENT_CHANNEL -#undef BLOG_CURRENT_CHANNEL -#endif -#define BLOG_CURRENT_CHANNEL BLOG_CHANNEL_DPRelay diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_DataProto.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_DataProto.h deleted file mode 100644 index a6f900a3..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_DataProto.h +++ /dev/null @@ -1,4 +0,0 @@ -#ifdef BLOG_CURRENT_CHANNEL -#undef BLOG_CURRENT_CHANNEL -#endif -#define BLOG_CURRENT_CHANNEL BLOG_CHANNEL_DataProto diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_DatagramPeerIO.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_DatagramPeerIO.h deleted file mode 100644 index 16e37b5b..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_DatagramPeerIO.h +++ /dev/null @@ -1,4 +0,0 @@ -#ifdef BLOG_CURRENT_CHANNEL -#undef BLOG_CURRENT_CHANNEL -#endif -#define BLOG_CURRENT_CHANNEL BLOG_CHANNEL_DatagramPeerIO diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_FragmentProtoAssembler.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_FragmentProtoAssembler.h deleted file mode 100644 index 25289efb..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_FragmentProtoAssembler.h +++ /dev/null @@ -1,4 +0,0 @@ -#ifdef BLOG_CURRENT_CHANNEL -#undef BLOG_CURRENT_CHANNEL -#endif -#define BLOG_CURRENT_CHANNEL BLOG_CHANNEL_FragmentProtoAssembler diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_FrameDecider.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_FrameDecider.h deleted file mode 100644 index 5dbf3c46..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_FrameDecider.h +++ /dev/null @@ -1,4 +0,0 @@ -#ifdef BLOG_CURRENT_CHANNEL -#undef BLOG_CURRENT_CHANNEL -#endif -#define BLOG_CURRENT_CHANNEL BLOG_CHANNEL_FrameDecider diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_LineBuffer.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_LineBuffer.h deleted file mode 100644 index 4286a742..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_LineBuffer.h +++ /dev/null @@ -1,4 +0,0 @@ -#ifdef BLOG_CURRENT_CHANNEL -#undef BLOG_CURRENT_CHANNEL -#endif -#define BLOG_CURRENT_CHANNEL BLOG_CHANNEL_LineBuffer diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_Listener.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_Listener.h deleted file mode 100644 index f61bfb3d..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_Listener.h +++ /dev/null @@ -1,4 +0,0 @@ -#ifdef BLOG_CURRENT_CHANNEL -#undef BLOG_CURRENT_CHANNEL -#endif -#define BLOG_CURRENT_CHANNEL BLOG_CHANNEL_Listener diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_NCDBuildProgram.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_NCDBuildProgram.h deleted file mode 100644 index 1a6cdf91..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_NCDBuildProgram.h +++ /dev/null @@ -1,4 +0,0 @@ -#ifdef BLOG_CURRENT_CHANNEL -#undef BLOG_CURRENT_CHANNEL -#endif -#define BLOG_CURRENT_CHANNEL BLOG_CHANNEL_NCDBuildProgram diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_NCDConfigParser.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_NCDConfigParser.h deleted file mode 100644 index 92d98d06..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_NCDConfigParser.h +++ /dev/null @@ -1,4 +0,0 @@ -#ifdef BLOG_CURRENT_CHANNEL -#undef BLOG_CURRENT_CHANNEL -#endif -#define BLOG_CURRENT_CHANNEL BLOG_CHANNEL_NCDConfigParser diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_NCDConfigTokenizer.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_NCDConfigTokenizer.h deleted file mode 100644 index 0b3b6892..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_NCDConfigTokenizer.h +++ /dev/null @@ -1,4 +0,0 @@ -#ifdef BLOG_CURRENT_CHANNEL -#undef BLOG_CURRENT_CHANNEL -#endif -#define BLOG_CURRENT_CHANNEL BLOG_CHANNEL_NCDConfigTokenizer diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_NCDIfConfig.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_NCDIfConfig.h deleted file mode 100644 index 91bdbda5..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_NCDIfConfig.h +++ /dev/null @@ -1,4 +0,0 @@ -#ifdef BLOG_CURRENT_CHANNEL -#undef BLOG_CURRENT_CHANNEL -#endif -#define BLOG_CURRENT_CHANNEL BLOG_CHANNEL_NCDIfConfig diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_NCDInterfaceMonitor.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_NCDInterfaceMonitor.h deleted file mode 100644 index 22c0f8d6..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_NCDInterfaceMonitor.h +++ /dev/null @@ -1,4 +0,0 @@ -#ifdef BLOG_CURRENT_CHANNEL -#undef BLOG_CURRENT_CHANNEL -#endif -#define BLOG_CURRENT_CHANNEL BLOG_CHANNEL_NCDInterfaceMonitor diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_NCDModuleIndex.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_NCDModuleIndex.h deleted file mode 100644 index 34876642..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_NCDModuleIndex.h +++ /dev/null @@ -1,4 +0,0 @@ -#ifdef BLOG_CURRENT_CHANNEL -#undef BLOG_CURRENT_CHANNEL -#endif -#define BLOG_CURRENT_CHANNEL BLOG_CHANNEL_NCDModuleIndex diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_NCDModuleProcess.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_NCDModuleProcess.h deleted file mode 100644 index db34dcc0..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_NCDModuleProcess.h +++ /dev/null @@ -1,4 +0,0 @@ -#ifdef BLOG_CURRENT_CHANNEL -#undef BLOG_CURRENT_CHANNEL -#endif -#define BLOG_CURRENT_CHANNEL BLOG_CHANNEL_NCDModuleProcess diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_NCDPlaceholderDb.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_NCDPlaceholderDb.h deleted file mode 100644 index f1f1db2c..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_NCDPlaceholderDb.h +++ /dev/null @@ -1,4 +0,0 @@ -#ifdef BLOG_CURRENT_CHANNEL -#undef BLOG_CURRENT_CHANNEL -#endif -#define BLOG_CURRENT_CHANNEL BLOG_CHANNEL_NCDPlaceholderDb diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_NCDRequest.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_NCDRequest.h deleted file mode 100644 index 5edc18a2..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_NCDRequest.h +++ /dev/null @@ -1,4 +0,0 @@ -#ifdef BLOG_CURRENT_CHANNEL -#undef BLOG_CURRENT_CHANNEL -#endif -#define BLOG_CURRENT_CHANNEL BLOG_CHANNEL_NCDRequest diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_NCDRequestClient.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_NCDRequestClient.h deleted file mode 100644 index 1e696d8c..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_NCDRequestClient.h +++ /dev/null @@ -1,4 +0,0 @@ -#ifdef BLOG_CURRENT_CHANNEL -#undef BLOG_CURRENT_CHANNEL -#endif -#define BLOG_CURRENT_CHANNEL BLOG_CHANNEL_NCDRequestClient diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_NCDRfkillMonitor.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_NCDRfkillMonitor.h deleted file mode 100644 index 56eba888..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_NCDRfkillMonitor.h +++ /dev/null @@ -1,4 +0,0 @@ -#ifdef BLOG_CURRENT_CHANNEL -#undef BLOG_CURRENT_CHANNEL -#endif -#define BLOG_CURRENT_CHANNEL BLOG_CHANNEL_NCDRfkillMonitor diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_NCDUdevCache.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_NCDUdevCache.h deleted file mode 100644 index 088fc9b3..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_NCDUdevCache.h +++ /dev/null @@ -1,4 +0,0 @@ -#ifdef BLOG_CURRENT_CHANNEL -#undef BLOG_CURRENT_CHANNEL -#endif -#define BLOG_CURRENT_CHANNEL BLOG_CHANNEL_NCDUdevCache diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_NCDUdevManager.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_NCDUdevManager.h deleted file mode 100644 index e9d63758..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_NCDUdevManager.h +++ /dev/null @@ -1,4 +0,0 @@ -#ifdef BLOG_CURRENT_CHANNEL -#undef BLOG_CURRENT_CHANNEL -#endif -#define BLOG_CURRENT_CHANNEL BLOG_CHANNEL_NCDUdevManager diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_NCDUdevMonitor.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_NCDUdevMonitor.h deleted file mode 100644 index bd93249a..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_NCDUdevMonitor.h +++ /dev/null @@ -1,4 +0,0 @@ -#ifdef BLOG_CURRENT_CHANNEL -#undef BLOG_CURRENT_CHANNEL -#endif -#define BLOG_CURRENT_CHANNEL BLOG_CHANNEL_NCDUdevMonitor diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_NCDUdevMonitorParser.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_NCDUdevMonitorParser.h deleted file mode 100644 index a7d560f4..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_NCDUdevMonitorParser.h +++ /dev/null @@ -1,4 +0,0 @@ -#ifdef BLOG_CURRENT_CHANNEL -#undef BLOG_CURRENT_CHANNEL -#endif -#define BLOG_CURRENT_CHANNEL BLOG_CHANNEL_NCDUdevMonitorParser diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_NCDVal.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_NCDVal.h deleted file mode 100644 index f2b67c28..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_NCDVal.h +++ /dev/null @@ -1,4 +0,0 @@ -#ifdef BLOG_CURRENT_CHANNEL -#undef BLOG_CURRENT_CHANNEL -#endif -#define BLOG_CURRENT_CHANNEL BLOG_CHANNEL_NCDVal diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_NCDValGenerator.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_NCDValGenerator.h deleted file mode 100644 index 193826bb..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_NCDValGenerator.h +++ /dev/null @@ -1,4 +0,0 @@ -#ifdef BLOG_CURRENT_CHANNEL -#undef BLOG_CURRENT_CHANNEL -#endif -#define BLOG_CURRENT_CHANNEL BLOG_CHANNEL_NCDValGenerator diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_NCDValParser.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_NCDValParser.h deleted file mode 100644 index 1d44acb7..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_NCDValParser.h +++ /dev/null @@ -1,4 +0,0 @@ -#ifdef BLOG_CURRENT_CHANNEL -#undef BLOG_CURRENT_CHANNEL -#endif -#define BLOG_CURRENT_CHANNEL BLOG_CHANNEL_NCDValParser diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_PRStreamSink.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_PRStreamSink.h deleted file mode 100644 index b70b61cd..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_PRStreamSink.h +++ /dev/null @@ -1,4 +0,0 @@ -#ifdef BLOG_CURRENT_CHANNEL -#undef BLOG_CURRENT_CHANNEL -#endif -#define BLOG_CURRENT_CHANNEL BLOG_CHANNEL_PRStreamSink diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_PRStreamSource.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_PRStreamSource.h deleted file mode 100644 index e16d93db..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_PRStreamSource.h +++ /dev/null @@ -1,4 +0,0 @@ -#ifdef BLOG_CURRENT_CHANNEL -#undef BLOG_CURRENT_CHANNEL -#endif -#define BLOG_CURRENT_CHANNEL BLOG_CHANNEL_PRStreamSource diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_PacketProtoDecoder.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_PacketProtoDecoder.h deleted file mode 100644 index fbfa5d81..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_PacketProtoDecoder.h +++ /dev/null @@ -1,4 +0,0 @@ -#ifdef BLOG_CURRENT_CHANNEL -#undef BLOG_CURRENT_CHANNEL -#endif -#define BLOG_CURRENT_CHANNEL BLOG_CHANNEL_PacketProtoDecoder diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_PasswordListener.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_PasswordListener.h deleted file mode 100644 index 6ff0bb58..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_PasswordListener.h +++ /dev/null @@ -1,4 +0,0 @@ -#ifdef BLOG_CURRENT_CHANNEL -#undef BLOG_CURRENT_CHANNEL -#endif -#define BLOG_CURRENT_CHANNEL BLOG_CHANNEL_PasswordListener diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_PeerChat.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_PeerChat.h deleted file mode 100644 index cadf2308..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_PeerChat.h +++ /dev/null @@ -1,4 +0,0 @@ -#ifdef BLOG_CURRENT_CHANNEL -#undef BLOG_CURRENT_CHANNEL -#endif -#define BLOG_CURRENT_CHANNEL BLOG_CHANNEL_PeerChat diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_SPProtoDecoder.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_SPProtoDecoder.h deleted file mode 100644 index 09bf2599..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_SPProtoDecoder.h +++ /dev/null @@ -1,4 +0,0 @@ -#ifdef BLOG_CURRENT_CHANNEL -#undef BLOG_CURRENT_CHANNEL -#endif -#define BLOG_CURRENT_CHANNEL BLOG_CHANNEL_SPProtoDecoder diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ServerConnection.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ServerConnection.h deleted file mode 100644 index faea1ddd..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ServerConnection.h +++ /dev/null @@ -1,4 +0,0 @@ -#ifdef BLOG_CURRENT_CHANNEL -#undef BLOG_CURRENT_CHANNEL -#endif -#define BLOG_CURRENT_CHANNEL BLOG_CHANNEL_ServerConnection diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_SocksUdpGwClient.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_SocksUdpGwClient.h deleted file mode 100644 index 6ba39aed..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_SocksUdpGwClient.h +++ /dev/null @@ -1,4 +0,0 @@ -#ifdef BLOG_CURRENT_CHANNEL -#undef BLOG_CURRENT_CHANNEL -#endif -#define BLOG_CURRENT_CHANNEL BLOG_CHANNEL_SocksUdpGwClient diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_StreamPeerIO.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_StreamPeerIO.h deleted file mode 100644 index 0359736e..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_StreamPeerIO.h +++ /dev/null @@ -1,4 +0,0 @@ -#ifdef BLOG_CURRENT_CHANNEL -#undef BLOG_CURRENT_CHANNEL -#endif -#define BLOG_CURRENT_CHANNEL BLOG_CHANNEL_StreamPeerIO diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_UdpGwClient.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_UdpGwClient.h deleted file mode 100644 index 85303768..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_UdpGwClient.h +++ /dev/null @@ -1,4 +0,0 @@ -#ifdef BLOG_CURRENT_CHANNEL -#undef BLOG_CURRENT_CHANNEL -#endif -#define BLOG_CURRENT_CHANNEL BLOG_CHANNEL_UdpGwClient diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_addr.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_addr.h deleted file mode 100644 index 512db286..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_addr.h +++ /dev/null @@ -1,4 +0,0 @@ -#ifdef BLOG_CURRENT_CHANNEL -#undef BLOG_CURRENT_CHANNEL -#endif -#define BLOG_CURRENT_CHANNEL BLOG_CHANNEL_addr diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_client.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_client.h deleted file mode 100644 index c851b77b..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_client.h +++ /dev/null @@ -1,4 +0,0 @@ -#ifdef BLOG_CURRENT_CHANNEL -#undef BLOG_CURRENT_CHANNEL -#endif -#define BLOG_CURRENT_CHANNEL BLOG_CHANNEL_client diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_dostest_attacker.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_dostest_attacker.h deleted file mode 100644 index b267c8f4..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_dostest_attacker.h +++ /dev/null @@ -1,4 +0,0 @@ -#ifdef BLOG_CURRENT_CHANNEL -#undef BLOG_CURRENT_CHANNEL -#endif -#define BLOG_CURRENT_CHANNEL BLOG_CHANNEL_dostest_attacker diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_dostest_server.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_dostest_server.h deleted file mode 100644 index 8d3988e0..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_dostest_server.h +++ /dev/null @@ -1,4 +0,0 @@ -#ifdef BLOG_CURRENT_CHANNEL -#undef BLOG_CURRENT_CHANNEL -#endif -#define BLOG_CURRENT_CHANNEL BLOG_CHANNEL_dostest_server diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_flooder.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_flooder.h deleted file mode 100644 index 94f595eb..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_flooder.h +++ /dev/null @@ -1,4 +0,0 @@ -#ifdef BLOG_CURRENT_CHANNEL -#undef BLOG_CURRENT_CHANNEL -#endif -#define BLOG_CURRENT_CHANNEL BLOG_CHANNEL_flooder diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_lwip.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_lwip.h deleted file mode 100644 index fb5687df..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_lwip.h +++ /dev/null @@ -1,4 +0,0 @@ -#ifdef BLOG_CURRENT_CHANNEL -#undef BLOG_CURRENT_CHANNEL -#endif -#define BLOG_CURRENT_CHANNEL BLOG_CHANNEL_lwip diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd.h deleted file mode 100644 index 9bf29567..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd.h +++ /dev/null @@ -1,4 +0,0 @@ -#ifdef BLOG_CURRENT_CHANNEL -#undef BLOG_CURRENT_CHANNEL -#endif -#define BLOG_CURRENT_CHANNEL BLOG_CHANNEL_ncd diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_alias.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_alias.h deleted file mode 100644 index 5b52bf26..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_alias.h +++ /dev/null @@ -1,4 +0,0 @@ -#ifdef BLOG_CURRENT_CHANNEL -#undef BLOG_CURRENT_CHANNEL -#endif -#define BLOG_CURRENT_CHANNEL BLOG_CHANNEL_ncd_alias diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_arithmetic.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_arithmetic.h deleted file mode 100644 index 66c08a8e..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_arithmetic.h +++ /dev/null @@ -1,4 +0,0 @@ -#ifdef BLOG_CURRENT_CHANNEL -#undef BLOG_CURRENT_CHANNEL -#endif -#define BLOG_CURRENT_CHANNEL BLOG_CHANNEL_ncd_arithmetic diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_assert.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_assert.h deleted file mode 100644 index 21e4d419..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_assert.h +++ /dev/null @@ -1,4 +0,0 @@ -#ifdef BLOG_CURRENT_CHANNEL -#undef BLOG_CURRENT_CHANNEL -#endif -#define BLOG_CURRENT_CHANNEL BLOG_CHANNEL_ncd_assert diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_backtrack.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_backtrack.h deleted file mode 100644 index ea669f79..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_backtrack.h +++ /dev/null @@ -1,4 +0,0 @@ -#ifdef BLOG_CURRENT_CHANNEL -#undef BLOG_CURRENT_CHANNEL -#endif -#define BLOG_CURRENT_CHANNEL BLOG_CHANNEL_ncd_backtrack diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_basic_functions.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_basic_functions.h deleted file mode 100644 index 9f0bfdd4..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_basic_functions.h +++ /dev/null @@ -1,4 +0,0 @@ -#ifdef BLOG_CURRENT_CHANNEL -#undef BLOG_CURRENT_CHANNEL -#endif -#define BLOG_CURRENT_CHANNEL BLOG_CHANNEL_ncd_basic_functions diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_blocker.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_blocker.h deleted file mode 100644 index a897b9f5..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_blocker.h +++ /dev/null @@ -1,4 +0,0 @@ -#ifdef BLOG_CURRENT_CHANNEL -#undef BLOG_CURRENT_CHANNEL -#endif -#define BLOG_CURRENT_CHANNEL BLOG_CHANNEL_ncd_blocker diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_buffer.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_buffer.h deleted file mode 100644 index 64e44333..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_buffer.h +++ /dev/null @@ -1,4 +0,0 @@ -#ifdef BLOG_CURRENT_CHANNEL -#undef BLOG_CURRENT_CHANNEL -#endif -#define BLOG_CURRENT_CHANNEL BLOG_CHANNEL_ncd_buffer diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_call2.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_call2.h deleted file mode 100644 index 4b64608d..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_call2.h +++ /dev/null @@ -1,4 +0,0 @@ -#ifdef BLOG_CURRENT_CHANNEL -#undef BLOG_CURRENT_CHANNEL -#endif -#define BLOG_CURRENT_CHANNEL BLOG_CHANNEL_ncd_call2 diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_choose.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_choose.h deleted file mode 100644 index a915036f..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_choose.h +++ /dev/null @@ -1,4 +0,0 @@ -#ifdef BLOG_CURRENT_CHANNEL -#undef BLOG_CURRENT_CHANNEL -#endif -#define BLOG_CURRENT_CHANNEL BLOG_CHANNEL_ncd_choose diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_concat.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_concat.h deleted file mode 100644 index 8c54ccbb..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_concat.h +++ /dev/null @@ -1,4 +0,0 @@ -#ifdef BLOG_CURRENT_CHANNEL -#undef BLOG_CURRENT_CHANNEL -#endif -#define BLOG_CURRENT_CHANNEL BLOG_CHANNEL_ncd_concat diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_daemon.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_daemon.h deleted file mode 100644 index 0a3ae3fa..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_daemon.h +++ /dev/null @@ -1,4 +0,0 @@ -#ifdef BLOG_CURRENT_CHANNEL -#undef BLOG_CURRENT_CHANNEL -#endif -#define BLOG_CURRENT_CHANNEL BLOG_CHANNEL_ncd_daemon diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_depend.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_depend.h deleted file mode 100644 index ae1ff8e9..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_depend.h +++ /dev/null @@ -1,4 +0,0 @@ -#ifdef BLOG_CURRENT_CHANNEL -#undef BLOG_CURRENT_CHANNEL -#endif -#define BLOG_CURRENT_CHANNEL BLOG_CHANNEL_ncd_depend diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_depend_scope.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_depend_scope.h deleted file mode 100644 index 1168714d..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_depend_scope.h +++ /dev/null @@ -1,4 +0,0 @@ -#ifdef BLOG_CURRENT_CHANNEL -#undef BLOG_CURRENT_CHANNEL -#endif -#define BLOG_CURRENT_CHANNEL BLOG_CHANNEL_ncd_depend_scope diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_dynamic_depend.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_dynamic_depend.h deleted file mode 100644 index 7ff305ea..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_dynamic_depend.h +++ /dev/null @@ -1,4 +0,0 @@ -#ifdef BLOG_CURRENT_CHANNEL -#undef BLOG_CURRENT_CHANNEL -#endif -#define BLOG_CURRENT_CHANNEL BLOG_CHANNEL_ncd_dynamic_depend diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_exit.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_exit.h deleted file mode 100644 index 2d2e3af1..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_exit.h +++ /dev/null @@ -1,4 +0,0 @@ -#ifdef BLOG_CURRENT_CHANNEL -#undef BLOG_CURRENT_CHANNEL -#endif -#define BLOG_CURRENT_CHANNEL BLOG_CHANNEL_ncd_exit diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_explode.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_explode.h deleted file mode 100644 index b7dc820e..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_explode.h +++ /dev/null @@ -1,4 +0,0 @@ -#ifdef BLOG_CURRENT_CHANNEL -#undef BLOG_CURRENT_CHANNEL -#endif -#define BLOG_CURRENT_CHANNEL BLOG_CHANNEL_ncd_explode diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_file.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_file.h deleted file mode 100644 index 6cfa5a55..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_file.h +++ /dev/null @@ -1,4 +0,0 @@ -#ifdef BLOG_CURRENT_CHANNEL -#undef BLOG_CURRENT_CHANNEL -#endif -#define BLOG_CURRENT_CHANNEL BLOG_CHANNEL_ncd_file diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_file_open.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_file_open.h deleted file mode 100644 index dd4ecb5f..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_file_open.h +++ /dev/null @@ -1,4 +0,0 @@ -#ifdef BLOG_CURRENT_CHANNEL -#undef BLOG_CURRENT_CHANNEL -#endif -#define BLOG_CURRENT_CHANNEL BLOG_CHANNEL_ncd_file_open diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_foreach.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_foreach.h deleted file mode 100644 index 430b2294..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_foreach.h +++ /dev/null @@ -1,4 +0,0 @@ -#ifdef BLOG_CURRENT_CHANNEL -#undef BLOG_CURRENT_CHANNEL -#endif -#define BLOG_CURRENT_CHANNEL BLOG_CHANNEL_ncd_foreach diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_from_string.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_from_string.h deleted file mode 100644 index e409fffa..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_from_string.h +++ /dev/null @@ -1,4 +0,0 @@ -#ifdef BLOG_CURRENT_CHANNEL -#undef BLOG_CURRENT_CHANNEL -#endif -#define BLOG_CURRENT_CHANNEL BLOG_CHANNEL_ncd_from_string diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_getargs.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_getargs.h deleted file mode 100644 index da7631d4..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_getargs.h +++ /dev/null @@ -1,4 +0,0 @@ -#ifdef BLOG_CURRENT_CHANNEL -#undef BLOG_CURRENT_CHANNEL -#endif -#define BLOG_CURRENT_CHANNEL BLOG_CHANNEL_ncd_getargs diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_getenv.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_getenv.h deleted file mode 100644 index 4f290216..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_getenv.h +++ /dev/null @@ -1,4 +0,0 @@ -#ifdef BLOG_CURRENT_CHANNEL -#undef BLOG_CURRENT_CHANNEL -#endif -#define BLOG_CURRENT_CHANNEL BLOG_CHANNEL_ncd_getenv diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_if.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_if.h deleted file mode 100644 index 11a09a2a..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_if.h +++ /dev/null @@ -1,4 +0,0 @@ -#ifdef BLOG_CURRENT_CHANNEL -#undef BLOG_CURRENT_CHANNEL -#endif -#define BLOG_CURRENT_CHANNEL BLOG_CHANNEL_ncd_if diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_imperative.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_imperative.h deleted file mode 100644 index 362df87a..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_imperative.h +++ /dev/null @@ -1,4 +0,0 @@ -#ifdef BLOG_CURRENT_CHANNEL -#undef BLOG_CURRENT_CHANNEL -#endif -#define BLOG_CURRENT_CHANNEL BLOG_CHANNEL_ncd_imperative diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_implode.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_implode.h deleted file mode 100644 index 5bb66d5b..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_implode.h +++ /dev/null @@ -1,4 +0,0 @@ -#ifdef BLOG_CURRENT_CHANNEL -#undef BLOG_CURRENT_CHANNEL -#endif -#define BLOG_CURRENT_CHANNEL BLOG_CHANNEL_ncd_implode diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_index.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_index.h deleted file mode 100644 index 666bbe9b..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_index.h +++ /dev/null @@ -1,4 +0,0 @@ -#ifdef BLOG_CURRENT_CHANNEL -#undef BLOG_CURRENT_CHANNEL -#endif -#define BLOG_CURRENT_CHANNEL BLOG_CHANNEL_ncd_index diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_list.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_list.h deleted file mode 100644 index f153be78..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_list.h +++ /dev/null @@ -1,4 +0,0 @@ -#ifdef BLOG_CURRENT_CHANNEL -#undef BLOG_CURRENT_CHANNEL -#endif -#define BLOG_CURRENT_CHANNEL BLOG_CHANNEL_ncd_list diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_load_module.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_load_module.h deleted file mode 100644 index c27dddb8..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_load_module.h +++ /dev/null @@ -1,4 +0,0 @@ -#ifdef BLOG_CURRENT_CHANNEL -#undef BLOG_CURRENT_CHANNEL -#endif -#define BLOG_CURRENT_CHANNEL BLOG_CHANNEL_ncd_load_module diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_log.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_log.h deleted file mode 100644 index 9ae2dc95..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_log.h +++ /dev/null @@ -1,4 +0,0 @@ -#ifdef BLOG_CURRENT_CHANNEL -#undef BLOG_CURRENT_CHANNEL -#endif -#define BLOG_CURRENT_CHANNEL BLOG_CHANNEL_ncd_log diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_log_msg.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_log_msg.h deleted file mode 100644 index 9e51b7eb..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_log_msg.h +++ /dev/null @@ -1,4 +0,0 @@ -#ifdef BLOG_CURRENT_CHANNEL -#undef BLOG_CURRENT_CHANNEL -#endif -#define BLOG_CURRENT_CHANNEL BLOG_CHANNEL_ncd_log_msg diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_logical.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_logical.h deleted file mode 100644 index 688453d8..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_logical.h +++ /dev/null @@ -1,4 +0,0 @@ -#ifdef BLOG_CURRENT_CHANNEL -#undef BLOG_CURRENT_CHANNEL -#endif -#define BLOG_CURRENT_CHANNEL BLOG_CHANNEL_ncd_logical diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_multidepend.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_multidepend.h deleted file mode 100644 index a82953df..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_multidepend.h +++ /dev/null @@ -1,4 +0,0 @@ -#ifdef BLOG_CURRENT_CHANNEL -#undef BLOG_CURRENT_CHANNEL -#endif -#define BLOG_CURRENT_CHANNEL BLOG_CHANNEL_ncd_multidepend diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_net_backend_badvpn.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_net_backend_badvpn.h deleted file mode 100644 index c9964c16..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_net_backend_badvpn.h +++ /dev/null @@ -1,4 +0,0 @@ -#ifdef BLOG_CURRENT_CHANNEL -#undef BLOG_CURRENT_CHANNEL -#endif -#define BLOG_CURRENT_CHANNEL BLOG_CHANNEL_ncd_net_backend_badvpn diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_net_backend_rfkill.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_net_backend_rfkill.h deleted file mode 100644 index e69896f9..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_net_backend_rfkill.h +++ /dev/null @@ -1,4 +0,0 @@ -#ifdef BLOG_CURRENT_CHANNEL -#undef BLOG_CURRENT_CHANNEL -#endif -#define BLOG_CURRENT_CHANNEL BLOG_CHANNEL_ncd_net_backend_rfkill diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_net_backend_waitdevice.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_net_backend_waitdevice.h deleted file mode 100644 index 63c4f242..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_net_backend_waitdevice.h +++ /dev/null @@ -1,4 +0,0 @@ -#ifdef BLOG_CURRENT_CHANNEL -#undef BLOG_CURRENT_CHANNEL -#endif -#define BLOG_CURRENT_CHANNEL BLOG_CHANNEL_ncd_net_backend_waitdevice diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_net_backend_waitlink.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_net_backend_waitlink.h deleted file mode 100644 index 96244c0a..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_net_backend_waitlink.h +++ /dev/null @@ -1,4 +0,0 @@ -#ifdef BLOG_CURRENT_CHANNEL -#undef BLOG_CURRENT_CHANNEL -#endif -#define BLOG_CURRENT_CHANNEL BLOG_CHANNEL_ncd_net_backend_waitlink diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_net_backend_wpa_supplicant.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_net_backend_wpa_supplicant.h deleted file mode 100644 index 22572d36..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_net_backend_wpa_supplicant.h +++ /dev/null @@ -1,4 +0,0 @@ -#ifdef BLOG_CURRENT_CHANNEL -#undef BLOG_CURRENT_CHANNEL -#endif -#define BLOG_CURRENT_CHANNEL BLOG_CHANNEL_ncd_net_backend_wpa_supplicant diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_net_dns.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_net_dns.h deleted file mode 100644 index 01c37448..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_net_dns.h +++ /dev/null @@ -1,4 +0,0 @@ -#ifdef BLOG_CURRENT_CHANNEL -#undef BLOG_CURRENT_CHANNEL -#endif -#define BLOG_CURRENT_CHANNEL BLOG_CHANNEL_ncd_net_dns diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_net_iptables.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_net_iptables.h deleted file mode 100644 index 42e23827..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_net_iptables.h +++ /dev/null @@ -1,4 +0,0 @@ -#ifdef BLOG_CURRENT_CHANNEL -#undef BLOG_CURRENT_CHANNEL -#endif -#define BLOG_CURRENT_CHANNEL BLOG_CHANNEL_ncd_net_iptables diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_net_ipv4_addr.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_net_ipv4_addr.h deleted file mode 100644 index 75bcb24d..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_net_ipv4_addr.h +++ /dev/null @@ -1,4 +0,0 @@ -#ifdef BLOG_CURRENT_CHANNEL -#undef BLOG_CURRENT_CHANNEL -#endif -#define BLOG_CURRENT_CHANNEL BLOG_CHANNEL_ncd_net_ipv4_addr diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_net_ipv4_addr_in_network.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_net_ipv4_addr_in_network.h deleted file mode 100644 index 41f2df2e..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_net_ipv4_addr_in_network.h +++ /dev/null @@ -1,4 +0,0 @@ -#ifdef BLOG_CURRENT_CHANNEL -#undef BLOG_CURRENT_CHANNEL -#endif -#define BLOG_CURRENT_CHANNEL BLOG_CHANNEL_ncd_net_ipv4_addr_in_network diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_net_ipv4_arp_probe.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_net_ipv4_arp_probe.h deleted file mode 100644 index 18f7c783..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_net_ipv4_arp_probe.h +++ /dev/null @@ -1,4 +0,0 @@ -#ifdef BLOG_CURRENT_CHANNEL -#undef BLOG_CURRENT_CHANNEL -#endif -#define BLOG_CURRENT_CHANNEL BLOG_CHANNEL_ncd_net_ipv4_arp_probe diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_net_ipv4_dhcp.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_net_ipv4_dhcp.h deleted file mode 100644 index 51fa61fb..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_net_ipv4_dhcp.h +++ /dev/null @@ -1,4 +0,0 @@ -#ifdef BLOG_CURRENT_CHANNEL -#undef BLOG_CURRENT_CHANNEL -#endif -#define BLOG_CURRENT_CHANNEL BLOG_CHANNEL_ncd_net_ipv4_dhcp diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_net_ipv4_route.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_net_ipv4_route.h deleted file mode 100644 index e181a90b..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_net_ipv4_route.h +++ /dev/null @@ -1,4 +0,0 @@ -#ifdef BLOG_CURRENT_CHANNEL -#undef BLOG_CURRENT_CHANNEL -#endif -#define BLOG_CURRENT_CHANNEL BLOG_CHANNEL_ncd_net_ipv4_route diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_net_ipv6_addr.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_net_ipv6_addr.h deleted file mode 100644 index bd6bd10a..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_net_ipv6_addr.h +++ /dev/null @@ -1,4 +0,0 @@ -#ifdef BLOG_CURRENT_CHANNEL -#undef BLOG_CURRENT_CHANNEL -#endif -#define BLOG_CURRENT_CHANNEL BLOG_CHANNEL_ncd_net_ipv6_addr diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_net_ipv6_addr_in_network.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_net_ipv6_addr_in_network.h deleted file mode 100644 index ba33921f..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_net_ipv6_addr_in_network.h +++ /dev/null @@ -1,4 +0,0 @@ -#ifdef BLOG_CURRENT_CHANNEL -#undef BLOG_CURRENT_CHANNEL -#endif -#define BLOG_CURRENT_CHANNEL BLOG_CHANNEL_ncd_net_ipv6_addr_in_network diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_net_ipv6_route.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_net_ipv6_route.h deleted file mode 100644 index b72e4d38..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_net_ipv6_route.h +++ /dev/null @@ -1,4 +0,0 @@ -#ifdef BLOG_CURRENT_CHANNEL -#undef BLOG_CURRENT_CHANNEL -#endif -#define BLOG_CURRENT_CHANNEL BLOG_CHANNEL_ncd_net_ipv6_route diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_net_ipv6_wait_dynamic_addr.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_net_ipv6_wait_dynamic_addr.h deleted file mode 100644 index ff7d6e1e..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_net_ipv6_wait_dynamic_addr.h +++ /dev/null @@ -1,4 +0,0 @@ -#ifdef BLOG_CURRENT_CHANNEL -#undef BLOG_CURRENT_CHANNEL -#endif -#define BLOG_CURRENT_CHANNEL BLOG_CHANNEL_ncd_net_ipv6_wait_dynamic_addr diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_net_up.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_net_up.h deleted file mode 100644 index 7acdedef..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_net_up.h +++ /dev/null @@ -1,4 +0,0 @@ -#ifdef BLOG_CURRENT_CHANNEL -#undef BLOG_CURRENT_CHANNEL -#endif -#define BLOG_CURRENT_CHANNEL BLOG_CHANNEL_ncd_net_up diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_net_watch_interfaces.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_net_watch_interfaces.h deleted file mode 100644 index 7fc078f7..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_net_watch_interfaces.h +++ /dev/null @@ -1,4 +0,0 @@ -#ifdef BLOG_CURRENT_CHANNEL -#undef BLOG_CURRENT_CHANNEL -#endif -#define BLOG_CURRENT_CHANNEL BLOG_CHANNEL_ncd_net_watch_interfaces diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_netmask.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_netmask.h deleted file mode 100644 index 10993f00..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_netmask.h +++ /dev/null @@ -1,4 +0,0 @@ -#ifdef BLOG_CURRENT_CHANNEL -#undef BLOG_CURRENT_CHANNEL -#endif -#define BLOG_CURRENT_CHANNEL BLOG_CHANNEL_ncd_netmask diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_objref.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_objref.h deleted file mode 100644 index 783ee6e5..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_objref.h +++ /dev/null @@ -1,4 +0,0 @@ -#ifdef BLOG_CURRENT_CHANNEL -#undef BLOG_CURRENT_CHANNEL -#endif -#define BLOG_CURRENT_CHANNEL BLOG_CHANNEL_ncd_objref diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_ondemand.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_ondemand.h deleted file mode 100644 index c7a0578c..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_ondemand.h +++ /dev/null @@ -1,4 +0,0 @@ -#ifdef BLOG_CURRENT_CHANNEL -#undef BLOG_CURRENT_CHANNEL -#endif -#define BLOG_CURRENT_CHANNEL BLOG_CHANNEL_ncd_ondemand diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_parse.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_parse.h deleted file mode 100644 index 672155be..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_parse.h +++ /dev/null @@ -1,4 +0,0 @@ -#ifdef BLOG_CURRENT_CHANNEL -#undef BLOG_CURRENT_CHANNEL -#endif -#define BLOG_CURRENT_CHANNEL BLOG_CHANNEL_ncd_parse diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_print.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_print.h deleted file mode 100644 index 22638f3b..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_print.h +++ /dev/null @@ -1,4 +0,0 @@ -#ifdef BLOG_CURRENT_CHANNEL -#undef BLOG_CURRENT_CHANNEL -#endif -#define BLOG_CURRENT_CHANNEL BLOG_CHANNEL_ncd_print diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_process_manager.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_process_manager.h deleted file mode 100644 index 627ba0e5..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_process_manager.h +++ /dev/null @@ -1,4 +0,0 @@ -#ifdef BLOG_CURRENT_CHANNEL -#undef BLOG_CURRENT_CHANNEL -#endif -#define BLOG_CURRENT_CHANNEL BLOG_CHANNEL_ncd_process_manager diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_reboot.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_reboot.h deleted file mode 100644 index 0e31d555..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_reboot.h +++ /dev/null @@ -1,4 +0,0 @@ -#ifdef BLOG_CURRENT_CHANNEL -#undef BLOG_CURRENT_CHANNEL -#endif -#define BLOG_CURRENT_CHANNEL BLOG_CHANNEL_ncd_reboot diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_ref.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_ref.h deleted file mode 100644 index 4f9f24ae..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_ref.h +++ /dev/null @@ -1,4 +0,0 @@ -#ifdef BLOG_CURRENT_CHANNEL -#undef BLOG_CURRENT_CHANNEL -#endif -#define BLOG_CURRENT_CHANNEL BLOG_CHANNEL_ncd_ref diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_regex_match.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_regex_match.h deleted file mode 100644 index 30813479..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_regex_match.h +++ /dev/null @@ -1,4 +0,0 @@ -#ifdef BLOG_CURRENT_CHANNEL -#undef BLOG_CURRENT_CHANNEL -#endif -#define BLOG_CURRENT_CHANNEL BLOG_CHANNEL_ncd_regex_match diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_request.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_request.h deleted file mode 100644 index 00103ea8..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_request.h +++ /dev/null @@ -1,4 +0,0 @@ -#ifdef BLOG_CURRENT_CHANNEL -#undef BLOG_CURRENT_CHANNEL -#endif -#define BLOG_CURRENT_CHANNEL BLOG_CHANNEL_ncd_request diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_run.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_run.h deleted file mode 100644 index 036a93e3..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_run.h +++ /dev/null @@ -1,4 +0,0 @@ -#ifdef BLOG_CURRENT_CHANNEL -#undef BLOG_CURRENT_CHANNEL -#endif -#define BLOG_CURRENT_CHANNEL BLOG_CHANNEL_ncd_run diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_runonce.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_runonce.h deleted file mode 100644 index 2e544520..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_runonce.h +++ /dev/null @@ -1,4 +0,0 @@ -#ifdef BLOG_CURRENT_CHANNEL -#undef BLOG_CURRENT_CHANNEL -#endif -#define BLOG_CURRENT_CHANNEL BLOG_CHANNEL_ncd_runonce diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_sleep.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_sleep.h deleted file mode 100644 index fb6c7fe3..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_sleep.h +++ /dev/null @@ -1,4 +0,0 @@ -#ifdef BLOG_CURRENT_CHANNEL -#undef BLOG_CURRENT_CHANNEL -#endif -#define BLOG_CURRENT_CHANNEL BLOG_CHANNEL_ncd_sleep diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_socket.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_socket.h deleted file mode 100644 index 3c1f0c42..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_socket.h +++ /dev/null @@ -1,4 +0,0 @@ -#ifdef BLOG_CURRENT_CHANNEL -#undef BLOG_CURRENT_CHANNEL -#endif -#define BLOG_CURRENT_CHANNEL BLOG_CHANNEL_ncd_socket diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_spawn.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_spawn.h deleted file mode 100644 index b9b3b24f..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_spawn.h +++ /dev/null @@ -1,4 +0,0 @@ -#ifdef BLOG_CURRENT_CHANNEL -#undef BLOG_CURRENT_CHANNEL -#endif -#define BLOG_CURRENT_CHANNEL BLOG_CHANNEL_ncd_spawn diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_strcmp.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_strcmp.h deleted file mode 100644 index 6ef09adc..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_strcmp.h +++ /dev/null @@ -1,4 +0,0 @@ -#ifdef BLOG_CURRENT_CHANNEL -#undef BLOG_CURRENT_CHANNEL -#endif -#define BLOG_CURRENT_CHANNEL BLOG_CHANNEL_ncd_strcmp diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_substr.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_substr.h deleted file mode 100644 index 691ad0e2..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_substr.h +++ /dev/null @@ -1,4 +0,0 @@ -#ifdef BLOG_CURRENT_CHANNEL -#undef BLOG_CURRENT_CHANNEL -#endif -#define BLOG_CURRENT_CHANNEL BLOG_CHANNEL_ncd_substr diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_sys_evdev.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_sys_evdev.h deleted file mode 100644 index 4a7244e5..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_sys_evdev.h +++ /dev/null @@ -1,4 +0,0 @@ -#ifdef BLOG_CURRENT_CHANNEL -#undef BLOG_CURRENT_CHANNEL -#endif -#define BLOG_CURRENT_CHANNEL BLOG_CHANNEL_ncd_sys_evdev diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_sys_request_client.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_sys_request_client.h deleted file mode 100644 index ce0f9e4c..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_sys_request_client.h +++ /dev/null @@ -1,4 +0,0 @@ -#ifdef BLOG_CURRENT_CHANNEL -#undef BLOG_CURRENT_CHANNEL -#endif -#define BLOG_CURRENT_CHANNEL BLOG_CHANNEL_ncd_sys_request_client diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_sys_request_server.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_sys_request_server.h deleted file mode 100644 index 11979588..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_sys_request_server.h +++ /dev/null @@ -1,4 +0,0 @@ -#ifdef BLOG_CURRENT_CHANNEL -#undef BLOG_CURRENT_CHANNEL -#endif -#define BLOG_CURRENT_CHANNEL BLOG_CHANNEL_ncd_sys_request_server diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_sys_start_process.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_sys_start_process.h deleted file mode 100644 index 45c2edc0..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_sys_start_process.h +++ /dev/null @@ -1,4 +0,0 @@ -#ifdef BLOG_CURRENT_CHANNEL -#undef BLOG_CURRENT_CHANNEL -#endif -#define BLOG_CURRENT_CHANNEL BLOG_CHANNEL_ncd_sys_start_process diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_sys_watch_directory.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_sys_watch_directory.h deleted file mode 100644 index e190da51..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_sys_watch_directory.h +++ /dev/null @@ -1,4 +0,0 @@ -#ifdef BLOG_CURRENT_CHANNEL -#undef BLOG_CURRENT_CHANNEL -#endif -#define BLOG_CURRENT_CHANNEL BLOG_CHANNEL_ncd_sys_watch_directory diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_sys_watch_input.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_sys_watch_input.h deleted file mode 100644 index b8995556..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_sys_watch_input.h +++ /dev/null @@ -1,4 +0,0 @@ -#ifdef BLOG_CURRENT_CHANNEL -#undef BLOG_CURRENT_CHANNEL -#endif -#define BLOG_CURRENT_CHANNEL BLOG_CHANNEL_ncd_sys_watch_input diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_sys_watch_usb.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_sys_watch_usb.h deleted file mode 100644 index bc5102a0..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_sys_watch_usb.h +++ /dev/null @@ -1,4 +0,0 @@ -#ifdef BLOG_CURRENT_CHANNEL -#undef BLOG_CURRENT_CHANNEL -#endif -#define BLOG_CURRENT_CHANNEL BLOG_CHANNEL_ncd_sys_watch_usb diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_timer.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_timer.h deleted file mode 100644 index beaa73db..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_timer.h +++ /dev/null @@ -1,4 +0,0 @@ -#ifdef BLOG_CURRENT_CHANNEL -#undef BLOG_CURRENT_CHANNEL -#endif -#define BLOG_CURRENT_CHANNEL BLOG_CHANNEL_ncd_timer diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_to_string.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_to_string.h deleted file mode 100644 index 41cd8b98..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_to_string.h +++ /dev/null @@ -1,4 +0,0 @@ -#ifdef BLOG_CURRENT_CHANNEL -#undef BLOG_CURRENT_CHANNEL -#endif -#define BLOG_CURRENT_CHANNEL BLOG_CHANNEL_ncd_to_string diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_try.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_try.h deleted file mode 100644 index bb76c685..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_try.h +++ /dev/null @@ -1,4 +0,0 @@ -#ifdef BLOG_CURRENT_CHANNEL -#undef BLOG_CURRENT_CHANNEL -#endif -#define BLOG_CURRENT_CHANNEL BLOG_CHANNEL_ncd_try diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_value.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_value.h deleted file mode 100644 index fa624e8f..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_value.h +++ /dev/null @@ -1,4 +0,0 @@ -#ifdef BLOG_CURRENT_CHANNEL -#undef BLOG_CURRENT_CHANNEL -#endif -#define BLOG_CURRENT_CHANNEL BLOG_CHANNEL_ncd_value diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_valuemetic.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_valuemetic.h deleted file mode 100644 index 385d2bb1..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_valuemetic.h +++ /dev/null @@ -1,4 +0,0 @@ -#ifdef BLOG_CURRENT_CHANNEL -#undef BLOG_CURRENT_CHANNEL -#endif -#define BLOG_CURRENT_CHANNEL BLOG_CHANNEL_ncd_valuemetic diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_var.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_var.h deleted file mode 100644 index fa5c0c43..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_ncd_var.h +++ /dev/null @@ -1,4 +0,0 @@ -#ifdef BLOG_CURRENT_CHANNEL -#undef BLOG_CURRENT_CHANNEL -#endif -#define BLOG_CURRENT_CHANNEL BLOG_CHANNEL_ncd_var diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_nsskey.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_nsskey.h deleted file mode 100644 index 66e6a72d..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_nsskey.h +++ /dev/null @@ -1,4 +0,0 @@ -#ifdef BLOG_CURRENT_CHANNEL -#undef BLOG_CURRENT_CHANNEL -#endif -#define BLOG_CURRENT_CHANNEL BLOG_CHANNEL_nsskey diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_server.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_server.h deleted file mode 100644 index acb3ed0d..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_server.h +++ /dev/null @@ -1,4 +0,0 @@ -#ifdef BLOG_CURRENT_CHANNEL -#undef BLOG_CURRENT_CHANNEL -#endif -#define BLOG_CURRENT_CHANNEL BLOG_CHANNEL_server diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_tun2socks.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_tun2socks.h deleted file mode 100644 index 21c1ce2d..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_tun2socks.h +++ /dev/null @@ -1,4 +0,0 @@ -#ifdef BLOG_CURRENT_CHANNEL -#undef BLOG_CURRENT_CHANNEL -#endif -#define BLOG_CURRENT_CHANNEL BLOG_CHANNEL_tun2socks diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_udpgw.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_udpgw.h deleted file mode 100644 index 504a3522..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channel_udpgw.h +++ /dev/null @@ -1,4 +0,0 @@ -#ifdef BLOG_CURRENT_CHANNEL -#undef BLOG_CURRENT_CHANNEL -#endif -#define BLOG_CURRENT_CHANNEL BLOG_CHANNEL_udpgw diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channels_defines.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channels_defines.h deleted file mode 100644 index 4f554e40..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channels_defines.h +++ /dev/null @@ -1,148 +0,0 @@ -#define BLOG_CHANNEL_server 0 -#define BLOG_CHANNEL_client 1 -#define BLOG_CHANNEL_flooder 2 -#define BLOG_CHANNEL_tun2socks 3 -#define BLOG_CHANNEL_ncd 4 -#define BLOG_CHANNEL_ncd_var 5 -#define BLOG_CHANNEL_ncd_list 6 -#define BLOG_CHANNEL_ncd_depend 7 -#define BLOG_CHANNEL_ncd_multidepend 8 -#define BLOG_CHANNEL_ncd_dynamic_depend 9 -#define BLOG_CHANNEL_ncd_concat 10 -#define BLOG_CHANNEL_ncd_if 11 -#define BLOG_CHANNEL_ncd_strcmp 12 -#define BLOG_CHANNEL_ncd_regex_match 13 -#define BLOG_CHANNEL_ncd_logical 14 -#define BLOG_CHANNEL_ncd_sleep 15 -#define BLOG_CHANNEL_ncd_print 16 -#define BLOG_CHANNEL_ncd_blocker 17 -#define BLOG_CHANNEL_ncd_run 18 -#define BLOG_CHANNEL_ncd_runonce 19 -#define BLOG_CHANNEL_ncd_daemon 20 -#define BLOG_CHANNEL_ncd_spawn 21 -#define BLOG_CHANNEL_ncd_imperative 22 -#define BLOG_CHANNEL_ncd_ref 23 -#define BLOG_CHANNEL_ncd_index 24 -#define BLOG_CHANNEL_ncd_alias 25 -#define BLOG_CHANNEL_ncd_process_manager 26 -#define BLOG_CHANNEL_ncd_ondemand 27 -#define BLOG_CHANNEL_ncd_foreach 28 -#define BLOG_CHANNEL_ncd_choose 29 -#define BLOG_CHANNEL_ncd_net_backend_waitdevice 30 -#define BLOG_CHANNEL_ncd_net_backend_waitlink 31 -#define BLOG_CHANNEL_ncd_net_backend_badvpn 32 -#define BLOG_CHANNEL_ncd_net_backend_wpa_supplicant 33 -#define BLOG_CHANNEL_ncd_net_backend_rfkill 34 -#define BLOG_CHANNEL_ncd_net_up 35 -#define BLOG_CHANNEL_ncd_net_dns 36 -#define BLOG_CHANNEL_ncd_net_iptables 37 -#define BLOG_CHANNEL_ncd_net_ipv4_addr 38 -#define BLOG_CHANNEL_ncd_net_ipv4_route 39 -#define BLOG_CHANNEL_ncd_net_ipv4_dhcp 40 -#define BLOG_CHANNEL_ncd_net_ipv4_arp_probe 41 -#define BLOG_CHANNEL_ncd_net_watch_interfaces 42 -#define BLOG_CHANNEL_ncd_sys_watch_input 43 -#define BLOG_CHANNEL_ncd_sys_watch_usb 44 -#define BLOG_CHANNEL_ncd_sys_evdev 45 -#define BLOG_CHANNEL_ncd_sys_watch_directory 46 -#define BLOG_CHANNEL_StreamPeerIO 47 -#define BLOG_CHANNEL_DatagramPeerIO 48 -#define BLOG_CHANNEL_BReactor 49 -#define BLOG_CHANNEL_BSignal 50 -#define BLOG_CHANNEL_FragmentProtoAssembler 51 -#define BLOG_CHANNEL_BPredicate 52 -#define BLOG_CHANNEL_ServerConnection 53 -#define BLOG_CHANNEL_Listener 54 -#define BLOG_CHANNEL_DataProto 55 -#define BLOG_CHANNEL_FrameDecider 56 -#define BLOG_CHANNEL_BSocksClient 57 -#define BLOG_CHANNEL_BDHCPClientCore 58 -#define BLOG_CHANNEL_BDHCPClient 59 -#define BLOG_CHANNEL_NCDIfConfig 60 -#define BLOG_CHANNEL_BUnixSignal 61 -#define BLOG_CHANNEL_BProcess 62 -#define BLOG_CHANNEL_PRStreamSink 63 -#define BLOG_CHANNEL_PRStreamSource 64 -#define BLOG_CHANNEL_PacketProtoDecoder 65 -#define BLOG_CHANNEL_DPRelay 66 -#define BLOG_CHANNEL_BThreadWork 67 -#define BLOG_CHANNEL_DPReceive 68 -#define BLOG_CHANNEL_BInputProcess 69 -#define BLOG_CHANNEL_NCDUdevMonitorParser 70 -#define BLOG_CHANNEL_NCDUdevMonitor 71 -#define BLOG_CHANNEL_NCDUdevCache 72 -#define BLOG_CHANNEL_NCDUdevManager 73 -#define BLOG_CHANNEL_BTime 74 -#define BLOG_CHANNEL_BEncryption 75 -#define BLOG_CHANNEL_SPProtoDecoder 76 -#define BLOG_CHANNEL_LineBuffer 77 -#define BLOG_CHANNEL_BTap 78 -#define BLOG_CHANNEL_lwip 79 -#define BLOG_CHANNEL_NCDConfigTokenizer 80 -#define BLOG_CHANNEL_NCDConfigParser 81 -#define BLOG_CHANNEL_NCDValParser 82 -#define BLOG_CHANNEL_nsskey 83 -#define BLOG_CHANNEL_addr 84 -#define BLOG_CHANNEL_PasswordListener 85 -#define BLOG_CHANNEL_NCDInterfaceMonitor 86 -#define BLOG_CHANNEL_NCDRfkillMonitor 87 -#define BLOG_CHANNEL_udpgw 88 -#define BLOG_CHANNEL_UdpGwClient 89 -#define BLOG_CHANNEL_SocksUdpGwClient 90 -#define BLOG_CHANNEL_BNetwork 91 -#define BLOG_CHANNEL_BConnection 92 -#define BLOG_CHANNEL_BSSLConnection 93 -#define BLOG_CHANNEL_BDatagram 94 -#define BLOG_CHANNEL_PeerChat 95 -#define BLOG_CHANNEL_BArpProbe 96 -#define BLOG_CHANNEL_NCDModuleIndex 97 -#define BLOG_CHANNEL_NCDModuleProcess 98 -#define BLOG_CHANNEL_NCDValGenerator 99 -#define BLOG_CHANNEL_ncd_from_string 100 -#define BLOG_CHANNEL_ncd_to_string 101 -#define BLOG_CHANNEL_ncd_value 102 -#define BLOG_CHANNEL_ncd_try 103 -#define BLOG_CHANNEL_ncd_sys_request_server 104 -#define BLOG_CHANNEL_NCDRequest 105 -#define BLOG_CHANNEL_ncd_net_ipv6_wait_dynamic_addr 106 -#define BLOG_CHANNEL_NCDRequestClient 107 -#define BLOG_CHANNEL_ncd_request 108 -#define BLOG_CHANNEL_ncd_sys_request_client 109 -#define BLOG_CHANNEL_ncd_exit 110 -#define BLOG_CHANNEL_ncd_getargs 111 -#define BLOG_CHANNEL_ncd_arithmetic 112 -#define BLOG_CHANNEL_ncd_parse 113 -#define BLOG_CHANNEL_ncd_valuemetic 114 -#define BLOG_CHANNEL_ncd_file 115 -#define BLOG_CHANNEL_ncd_netmask 116 -#define BLOG_CHANNEL_ncd_implode 117 -#define BLOG_CHANNEL_ncd_call2 118 -#define BLOG_CHANNEL_ncd_assert 119 -#define BLOG_CHANNEL_ncd_reboot 120 -#define BLOG_CHANNEL_ncd_explode 121 -#define BLOG_CHANNEL_NCDPlaceholderDb 122 -#define BLOG_CHANNEL_NCDVal 123 -#define BLOG_CHANNEL_ncd_net_ipv6_addr 124 -#define BLOG_CHANNEL_ncd_net_ipv6_route 125 -#define BLOG_CHANNEL_ncd_net_ipv4_addr_in_network 126 -#define BLOG_CHANNEL_ncd_net_ipv6_addr_in_network 127 -#define BLOG_CHANNEL_dostest_server 128 -#define BLOG_CHANNEL_dostest_attacker 129 -#define BLOG_CHANNEL_ncd_timer 130 -#define BLOG_CHANNEL_ncd_file_open 131 -#define BLOG_CHANNEL_ncd_backtrack 132 -#define BLOG_CHANNEL_ncd_socket 133 -#define BLOG_CHANNEL_ncd_depend_scope 134 -#define BLOG_CHANNEL_ncd_substr 135 -#define BLOG_CHANNEL_ncd_sys_start_process 136 -#define BLOG_CHANNEL_NCDBuildProgram 137 -#define BLOG_CHANNEL_ncd_log 138 -#define BLOG_CHANNEL_ncd_log_msg 139 -#define BLOG_CHANNEL_ncd_buffer 140 -#define BLOG_CHANNEL_ncd_getenv 141 -#define BLOG_CHANNEL_BThreadSignal 142 -#define BLOG_CHANNEL_BLockReactor 143 -#define BLOG_CHANNEL_ncd_load_module 144 -#define BLOG_CHANNEL_ncd_basic_functions 145 -#define BLOG_CHANNEL_ncd_objref 146 -#define BLOG_NUM_CHANNELS 147 diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channels_list.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channels_list.h deleted file mode 100644 index d099b2ba..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/blog_channels_list.h +++ /dev/null @@ -1,147 +0,0 @@ -{"server", 4}, -{"client", 4}, -{"flooder", 4}, -{"tun2socks", 4}, -{"ncd", 4}, -{"ncd_var", 4}, -{"ncd_list", 4}, -{"ncd_depend", 4}, -{"ncd_multidepend", 4}, -{"ncd_dynamic_depend", 4}, -{"ncd_concat", 4}, -{"ncd_if", 4}, -{"ncd_strcmp", 4}, -{"ncd_regex_match", 4}, -{"ncd_logical", 4}, -{"ncd_sleep", 4}, -{"ncd_print", 4}, -{"ncd_blocker", 4}, -{"ncd_run", 4}, -{"ncd_runonce", 4}, -{"ncd_daemon", 4}, -{"ncd_spawn", 4}, -{"ncd_imperative", 4}, -{"ncd_ref", 4}, -{"ncd_index", 4}, -{"ncd_alias", 4}, -{"ncd_process_manager", 4}, -{"ncd_ondemand", 4}, -{"ncd_foreach", 4}, -{"ncd_choose", 4}, -{"ncd_net_backend_waitdevice", 4}, -{"ncd_net_backend_waitlink", 4}, -{"ncd_net_backend_badvpn", 4}, -{"ncd_net_backend_wpa_supplicant", 4}, -{"ncd_net_backend_rfkill", 4}, -{"ncd_net_up", 4}, -{"ncd_net_dns", 4}, -{"ncd_net_iptables", 4}, -{"ncd_net_ipv4_addr", 4}, -{"ncd_net_ipv4_route", 4}, -{"ncd_net_ipv4_dhcp", 4}, -{"ncd_net_ipv4_arp_probe", 4}, -{"ncd_net_watch_interfaces", 4}, -{"ncd_sys_watch_input", 4}, -{"ncd_sys_watch_usb", 4}, -{"ncd_sys_evdev", 4}, -{"ncd_sys_watch_directory", 4}, -{"StreamPeerIO", 4}, -{"DatagramPeerIO", 4}, -{"BReactor", 3}, -{"BSignal", 3}, -{"FragmentProtoAssembler", 4}, -{"BPredicate", 3}, -{"ServerConnection", 4}, -{"Listener", 4}, -{"DataProto", 4}, -{"FrameDecider", 4}, -{"BSocksClient", 4}, -{"BDHCPClientCore", 4}, -{"BDHCPClient", 4}, -{"NCDIfConfig", 4}, -{"BUnixSignal", 4}, -{"BProcess", 4}, -{"PRStreamSink", 4}, -{"PRStreamSource", 4}, -{"PacketProtoDecoder", 4}, -{"DPRelay", 4}, -{"BThreadWork", 4}, -{"DPReceive", 4}, -{"BInputProcess", 4}, -{"NCDUdevMonitorParser", 4}, -{"NCDUdevMonitor", 4}, -{"NCDUdevCache", 4}, -{"NCDUdevManager", 4}, -{"BTime", 4}, -{"BEncryption", 4}, -{"SPProtoDecoder", 4}, -{"LineBuffer", 4}, -{"BTap", 4}, -{"lwip", 4}, -{"NCDConfigTokenizer", 4}, -{"NCDConfigParser", 4}, -{"NCDValParser", 4}, -{"nsskey", 4}, -{"addr", 4}, -{"PasswordListener", 4}, -{"NCDInterfaceMonitor", 4}, -{"NCDRfkillMonitor", 4}, -{"udpgw", 4}, -{"UdpGwClient", 4}, -{"SocksUdpGwClient", 4}, -{"BNetwork", 4}, -{"BConnection", 4}, -{"BSSLConnection", 4}, -{"BDatagram", 4}, -{"PeerChat", 4}, -{"BArpProbe", 4}, -{"NCDModuleIndex", 4}, -{"NCDModuleProcess", 4}, -{"NCDValGenerator", 4}, -{"ncd_from_string", 4}, -{"ncd_to_string", 4}, -{"ncd_value", 4}, -{"ncd_try", 4}, -{"ncd_sys_request_server", 4}, -{"NCDRequest", 4}, -{"ncd_net_ipv6_wait_dynamic_addr", 4}, -{"NCDRequestClient", 4}, -{"ncd_request", 4}, -{"ncd_sys_request_client", 4}, -{"ncd_exit", 4}, -{"ncd_getargs", 4}, -{"ncd_arithmetic", 4}, -{"ncd_parse", 4}, -{"ncd_valuemetic", 4}, -{"ncd_file", 4}, -{"ncd_netmask", 4}, -{"ncd_implode", 4}, -{"ncd_call2", 4}, -{"ncd_assert", 4}, -{"ncd_reboot", 4}, -{"ncd_explode", 4}, -{"NCDPlaceholderDb", 4}, -{"NCDVal", 4}, -{"ncd_net_ipv6_addr", 4}, -{"ncd_net_ipv6_route", 4}, -{"ncd_net_ipv4_addr_in_network", 4}, -{"ncd_net_ipv6_addr_in_network", 4}, -{"dostest_server", 4}, -{"dostest_attacker", 4}, -{"ncd_timer", 4}, -{"ncd_file_open", 4}, -{"ncd_backtrack", 4}, -{"ncd_socket", 4}, -{"ncd_depend_scope", 4}, -{"ncd_substr", 4}, -{"ncd_sys_start_process", 4}, -{"NCDBuildProgram", 4}, -{"ncd_log", 4}, -{"ncd_log_msg", 4}, -{"ncd_buffer", 4}, -{"ncd_getenv", 4}, -{"BThreadSignal", 4}, -{"BLockReactor", 4}, -{"ncd_load_module", 4}, -{"ncd_basic_functions", 4}, -{"ncd_objref", 4}, diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/bproto_addr.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/bproto_addr.h deleted file mode 100644 index fbd96a80..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/bproto_addr.h +++ /dev/null @@ -1,675 +0,0 @@ -/* - DO NOT EDIT THIS FILE! - This file was automatically generated by the bproto generator. -*/ - -#include -#include - -#include -#include -#include - - -#define addr_SIZEtype (sizeof(struct BProto_header_s) + sizeof(struct BProto_uint8_s)) -#define addr_SIZEip_port (sizeof(struct BProto_header_s) + sizeof(struct BProto_data_header_s) + (2)) -#define addr_SIZEipv4_addr (sizeof(struct BProto_header_s) + sizeof(struct BProto_data_header_s) + (4)) -#define addr_SIZEipv6_addr (sizeof(struct BProto_header_s) + sizeof(struct BProto_data_header_s) + (16)) - -typedef struct { - uint8_t *out; - int used; - int type_count; - int ip_port_count; - int ipv4_addr_count; - int ipv6_addr_count; -} addrWriter; - -static void addrWriter_Init (addrWriter *o, uint8_t *out); -static int addrWriter_Finish (addrWriter *o); -static void addrWriter_Addtype (addrWriter *o, uint8_t v); -static uint8_t * addrWriter_Addip_port (addrWriter *o); -static uint8_t * addrWriter_Addipv4_addr (addrWriter *o); -static uint8_t * addrWriter_Addipv6_addr (addrWriter *o); - -typedef struct { - uint8_t *buf; - int buf_len; - int type_start; - int type_span; - int type_pos; - int ip_port_start; - int ip_port_span; - int ip_port_pos; - int ipv4_addr_start; - int ipv4_addr_span; - int ipv4_addr_pos; - int ipv6_addr_start; - int ipv6_addr_span; - int ipv6_addr_pos; -} addrParser; - -static int addrParser_Init (addrParser *o, uint8_t *buf, int buf_len); -static int addrParser_GotEverything (addrParser *o); -static int addrParser_Gettype (addrParser *o, uint8_t *v); -static void addrParser_Resettype (addrParser *o); -static void addrParser_Forwardtype (addrParser *o); -static int addrParser_Getip_port (addrParser *o, uint8_t **data); -static void addrParser_Resetip_port (addrParser *o); -static void addrParser_Forwardip_port (addrParser *o); -static int addrParser_Getipv4_addr (addrParser *o, uint8_t **data); -static void addrParser_Resetipv4_addr (addrParser *o); -static void addrParser_Forwardipv4_addr (addrParser *o); -static int addrParser_Getipv6_addr (addrParser *o, uint8_t **data); -static void addrParser_Resetipv6_addr (addrParser *o); -static void addrParser_Forwardipv6_addr (addrParser *o); - -void addrWriter_Init (addrWriter *o, uint8_t *out) -{ - o->out = out; - o->used = 0; - o->type_count = 0; - o->ip_port_count = 0; - o->ipv4_addr_count = 0; - o->ipv6_addr_count = 0; -} - -int addrWriter_Finish (addrWriter *o) -{ - ASSERT(o->used >= 0) - ASSERT(o->type_count == 1) - ASSERT(o->ip_port_count >= 0 && o->ip_port_count <= 1) - ASSERT(o->ipv4_addr_count >= 0 && o->ipv4_addr_count <= 1) - ASSERT(o->ipv6_addr_count >= 0 && o->ipv6_addr_count <= 1) - - return o->used; -} - -void addrWriter_Addtype (addrWriter *o, uint8_t v) -{ - ASSERT(o->used >= 0) - ASSERT(o->type_count == 0) - - - struct BProto_header_s header; - header.id = htol16(1); - header.type = htol16(BPROTO_TYPE_UINT8); - memcpy(o->out + o->used, &header, sizeof(header)); - o->used += sizeof(struct BProto_header_s); - - struct BProto_uint8_s data; - data.v = htol8(v); - memcpy(o->out + o->used, &data, sizeof(data)); - o->used += sizeof(struct BProto_uint8_s); - - o->type_count++; -} - -uint8_t * addrWriter_Addip_port (addrWriter *o) -{ - ASSERT(o->used >= 0) - ASSERT(o->ip_port_count == 0) - - - struct BProto_header_s header; - header.id = htol16(2); - header.type = htol16(BPROTO_TYPE_CONSTDATA); - memcpy(o->out + o->used, &header, sizeof(header)); - o->used += sizeof(struct BProto_header_s); - - struct BProto_data_header_s data; - data.len = htol32(2); - memcpy(o->out + o->used, &data, sizeof(data)); - o->used += sizeof(struct BProto_data_header_s); - - uint8_t *dest = (o->out + o->used); - o->used += (2); - - o->ip_port_count++; - - return dest; -} - -uint8_t * addrWriter_Addipv4_addr (addrWriter *o) -{ - ASSERT(o->used >= 0) - ASSERT(o->ipv4_addr_count == 0) - - - struct BProto_header_s header; - header.id = htol16(3); - header.type = htol16(BPROTO_TYPE_CONSTDATA); - memcpy(o->out + o->used, &header, sizeof(header)); - o->used += sizeof(struct BProto_header_s); - - struct BProto_data_header_s data; - data.len = htol32(4); - memcpy(o->out + o->used, &data, sizeof(data)); - o->used += sizeof(struct BProto_data_header_s); - - uint8_t *dest = (o->out + o->used); - o->used += (4); - - o->ipv4_addr_count++; - - return dest; -} - -uint8_t * addrWriter_Addipv6_addr (addrWriter *o) -{ - ASSERT(o->used >= 0) - ASSERT(o->ipv6_addr_count == 0) - - - struct BProto_header_s header; - header.id = htol16(4); - header.type = htol16(BPROTO_TYPE_CONSTDATA); - memcpy(o->out + o->used, &header, sizeof(header)); - o->used += sizeof(struct BProto_header_s); - - struct BProto_data_header_s data; - data.len = htol32(16); - memcpy(o->out + o->used, &data, sizeof(data)); - o->used += sizeof(struct BProto_data_header_s); - - uint8_t *dest = (o->out + o->used); - o->used += (16); - - o->ipv6_addr_count++; - - return dest; -} - -int addrParser_Init (addrParser *o, uint8_t *buf, int buf_len) -{ - ASSERT(buf_len >= 0) - - o->buf = buf; - o->buf_len = buf_len; - o->type_start = o->buf_len; - o->type_span = 0; - o->type_pos = 0; - o->ip_port_start = o->buf_len; - o->ip_port_span = 0; - o->ip_port_pos = 0; - o->ipv4_addr_start = o->buf_len; - o->ipv4_addr_span = 0; - o->ipv4_addr_pos = 0; - o->ipv6_addr_start = o->buf_len; - o->ipv6_addr_span = 0; - o->ipv6_addr_pos = 0; - - int type_count = 0; - int ip_port_count = 0; - int ipv4_addr_count = 0; - int ipv6_addr_count = 0; - - int pos = 0; - int left = o->buf_len; - - while (left > 0) { - int entry_pos = pos; - - if (!(left >= sizeof(struct BProto_header_s))) { - return 0; - } - struct BProto_header_s header; - memcpy(&header, o->buf + pos, sizeof(header)); - pos += sizeof(struct BProto_header_s); - left -= sizeof(struct BProto_header_s); - uint16_t type = ltoh16(header.type); - uint16_t id = ltoh16(header.id); - - switch (type) { - case BPROTO_TYPE_UINT8: { - if (!(left >= sizeof(struct BProto_uint8_s))) { - return 0; - } - pos += sizeof(struct BProto_uint8_s); - left -= sizeof(struct BProto_uint8_s); - - switch (id) { - case 1: - if (o->type_start == o->buf_len) { - o->type_start = entry_pos; - } - o->type_span = pos - o->type_start; - type_count++; - break; - default: - return 0; - } - } break; - case BPROTO_TYPE_UINT16: { - if (!(left >= sizeof(struct BProto_uint16_s))) { - return 0; - } - pos += sizeof(struct BProto_uint16_s); - left -= sizeof(struct BProto_uint16_s); - - switch (id) { - default: - return 0; - } - } break; - case BPROTO_TYPE_UINT32: { - if (!(left >= sizeof(struct BProto_uint32_s))) { - return 0; - } - pos += sizeof(struct BProto_uint32_s); - left -= sizeof(struct BProto_uint32_s); - - switch (id) { - default: - return 0; - } - } break; - case BPROTO_TYPE_UINT64: { - if (!(left >= sizeof(struct BProto_uint64_s))) { - return 0; - } - pos += sizeof(struct BProto_uint64_s); - left -= sizeof(struct BProto_uint64_s); - - switch (id) { - default: - return 0; - } - } break; - case BPROTO_TYPE_DATA: - case BPROTO_TYPE_CONSTDATA: - { - if (!(left >= sizeof(struct BProto_data_header_s))) { - return 0; - } - struct BProto_data_header_s val; - memcpy(&val, o->buf + pos, sizeof(val)); - pos += sizeof(struct BProto_data_header_s); - left -= sizeof(struct BProto_data_header_s); - - uint32_t payload_len = ltoh32(val.len); - if (!(left >= payload_len)) { - return 0; - } - pos += payload_len; - left -= payload_len; - - switch (id) { - case 2: - if (!(type == BPROTO_TYPE_CONSTDATA)) { - return 0; - } - if (!(payload_len == (2))) { - return 0; - } - if (o->ip_port_start == o->buf_len) { - o->ip_port_start = entry_pos; - } - o->ip_port_span = pos - o->ip_port_start; - ip_port_count++; - break; - case 3: - if (!(type == BPROTO_TYPE_CONSTDATA)) { - return 0; - } - if (!(payload_len == (4))) { - return 0; - } - if (o->ipv4_addr_start == o->buf_len) { - o->ipv4_addr_start = entry_pos; - } - o->ipv4_addr_span = pos - o->ipv4_addr_start; - ipv4_addr_count++; - break; - case 4: - if (!(type == BPROTO_TYPE_CONSTDATA)) { - return 0; - } - if (!(payload_len == (16))) { - return 0; - } - if (o->ipv6_addr_start == o->buf_len) { - o->ipv6_addr_start = entry_pos; - } - o->ipv6_addr_span = pos - o->ipv6_addr_start; - ipv6_addr_count++; - break; - default: - return 0; - } - } break; - default: - return 0; - } - } - - if (!(type_count == 1)) { - return 0; - } - if (!(ip_port_count <= 1)) { - return 0; - } - if (!(ipv4_addr_count <= 1)) { - return 0; - } - if (!(ipv6_addr_count <= 1)) { - return 0; - } - - return 1; -} - -int addrParser_GotEverything (addrParser *o) -{ - return ( - o->type_pos == o->type_span - && - o->ip_port_pos == o->ip_port_span - && - o->ipv4_addr_pos == o->ipv4_addr_span - && - o->ipv6_addr_pos == o->ipv6_addr_span - ); -} - -int addrParser_Gettype (addrParser *o, uint8_t *v) -{ - ASSERT(o->type_pos >= 0) - ASSERT(o->type_pos <= o->type_span) - - int left = o->type_span - o->type_pos; - - while (left > 0) { - ASSERT(left >= sizeof(struct BProto_header_s)) - struct BProto_header_s header; - memcpy(&header, o->buf + o->type_start + o->type_pos, sizeof(header)); - o->type_pos += sizeof(struct BProto_header_s); - left -= sizeof(struct BProto_header_s); - uint16_t type = ltoh16(header.type); - uint16_t id = ltoh16(header.id); - - switch (type) { - case BPROTO_TYPE_UINT8: { - ASSERT(left >= sizeof(struct BProto_uint8_s)) - struct BProto_uint8_s val; - memcpy(&val, o->buf + o->type_start + o->type_pos, sizeof(val)); - o->type_pos += sizeof(struct BProto_uint8_s); - left -= sizeof(struct BProto_uint8_s); - - if (id == 1) { - *v = ltoh8(val.v); - return 1; - } - } break; - case BPROTO_TYPE_UINT16: { - ASSERT(left >= sizeof(struct BProto_uint16_s)) - o->type_pos += sizeof(struct BProto_uint16_s); - left -= sizeof(struct BProto_uint16_s); - } break; - case BPROTO_TYPE_UINT32: { - ASSERT(left >= sizeof(struct BProto_uint32_s)) - o->type_pos += sizeof(struct BProto_uint32_s); - left -= sizeof(struct BProto_uint32_s); - } break; - case BPROTO_TYPE_UINT64: { - ASSERT(left >= sizeof(struct BProto_uint64_s)) - o->type_pos += sizeof(struct BProto_uint64_s); - left -= sizeof(struct BProto_uint64_s); - } break; - case BPROTO_TYPE_DATA: - case BPROTO_TYPE_CONSTDATA: - { - ASSERT(left >= sizeof(struct BProto_data_header_s)) - struct BProto_data_header_s val; - memcpy(&val, o->buf + o->type_start + o->type_pos, sizeof(val)); - o->type_pos += sizeof(struct BProto_data_header_s); - left -= sizeof(struct BProto_data_header_s); - - uint32_t payload_len = ltoh32(val.len); - ASSERT(left >= payload_len) - o->type_pos += payload_len; - left -= payload_len; - } break; - default: - ASSERT(0); - } - } - - return 0; -} - -void addrParser_Resettype (addrParser *o) -{ - o->type_pos = 0; -} - -void addrParser_Forwardtype (addrParser *o) -{ - o->type_pos = o->type_span; -} - -int addrParser_Getip_port (addrParser *o, uint8_t **data) -{ - ASSERT(o->ip_port_pos >= 0) - ASSERT(o->ip_port_pos <= o->ip_port_span) - - int left = o->ip_port_span - o->ip_port_pos; - - while (left > 0) { - ASSERT(left >= sizeof(struct BProto_header_s)) - struct BProto_header_s header; - memcpy(&header, o->buf + o->ip_port_start + o->ip_port_pos, sizeof(header)); - o->ip_port_pos += sizeof(struct BProto_header_s); - left -= sizeof(struct BProto_header_s); - uint16_t type = ltoh16(header.type); - uint16_t id = ltoh16(header.id); - - switch (type) { - case BPROTO_TYPE_UINT8: { - ASSERT(left >= sizeof(struct BProto_uint8_s)) - o->ip_port_pos += sizeof(struct BProto_uint8_s); - left -= sizeof(struct BProto_uint8_s); - } break; - case BPROTO_TYPE_UINT16: { - ASSERT(left >= sizeof(struct BProto_uint16_s)) - o->ip_port_pos += sizeof(struct BProto_uint16_s); - left -= sizeof(struct BProto_uint16_s); - } break; - case BPROTO_TYPE_UINT32: { - ASSERT(left >= sizeof(struct BProto_uint32_s)) - o->ip_port_pos += sizeof(struct BProto_uint32_s); - left -= sizeof(struct BProto_uint32_s); - } break; - case BPROTO_TYPE_UINT64: { - ASSERT(left >= sizeof(struct BProto_uint64_s)) - o->ip_port_pos += sizeof(struct BProto_uint64_s); - left -= sizeof(struct BProto_uint64_s); - } break; - case BPROTO_TYPE_DATA: - case BPROTO_TYPE_CONSTDATA: - { - ASSERT(left >= sizeof(struct BProto_data_header_s)) - struct BProto_data_header_s val; - memcpy(&val, o->buf + o->ip_port_start + o->ip_port_pos, sizeof(val)); - o->ip_port_pos += sizeof(struct BProto_data_header_s); - left -= sizeof(struct BProto_data_header_s); - - uint32_t payload_len = ltoh32(val.len); - ASSERT(left >= payload_len) - uint8_t *payload = o->buf + o->ip_port_start + o->ip_port_pos; - o->ip_port_pos += payload_len; - left -= payload_len; - - if (type == BPROTO_TYPE_CONSTDATA && id == 2) { - *data = payload; - return 1; - } - } break; - default: - ASSERT(0); - } - } - - return 0; -} - -void addrParser_Resetip_port (addrParser *o) -{ - o->ip_port_pos = 0; -} - -void addrParser_Forwardip_port (addrParser *o) -{ - o->ip_port_pos = o->ip_port_span; -} - -int addrParser_Getipv4_addr (addrParser *o, uint8_t **data) -{ - ASSERT(o->ipv4_addr_pos >= 0) - ASSERT(o->ipv4_addr_pos <= o->ipv4_addr_span) - - int left = o->ipv4_addr_span - o->ipv4_addr_pos; - - while (left > 0) { - ASSERT(left >= sizeof(struct BProto_header_s)) - struct BProto_header_s header; - memcpy(&header, o->buf + o->ipv4_addr_start + o->ipv4_addr_pos, sizeof(header)); - o->ipv4_addr_pos += sizeof(struct BProto_header_s); - left -= sizeof(struct BProto_header_s); - uint16_t type = ltoh16(header.type); - uint16_t id = ltoh16(header.id); - - switch (type) { - case BPROTO_TYPE_UINT8: { - ASSERT(left >= sizeof(struct BProto_uint8_s)) - o->ipv4_addr_pos += sizeof(struct BProto_uint8_s); - left -= sizeof(struct BProto_uint8_s); - } break; - case BPROTO_TYPE_UINT16: { - ASSERT(left >= sizeof(struct BProto_uint16_s)) - o->ipv4_addr_pos += sizeof(struct BProto_uint16_s); - left -= sizeof(struct BProto_uint16_s); - } break; - case BPROTO_TYPE_UINT32: { - ASSERT(left >= sizeof(struct BProto_uint32_s)) - o->ipv4_addr_pos += sizeof(struct BProto_uint32_s); - left -= sizeof(struct BProto_uint32_s); - } break; - case BPROTO_TYPE_UINT64: { - ASSERT(left >= sizeof(struct BProto_uint64_s)) - o->ipv4_addr_pos += sizeof(struct BProto_uint64_s); - left -= sizeof(struct BProto_uint64_s); - } break; - case BPROTO_TYPE_DATA: - case BPROTO_TYPE_CONSTDATA: - { - ASSERT(left >= sizeof(struct BProto_data_header_s)) - struct BProto_data_header_s val; - memcpy(&val, o->buf + o->ipv4_addr_start + o->ipv4_addr_pos, sizeof(val)); - o->ipv4_addr_pos += sizeof(struct BProto_data_header_s); - left -= sizeof(struct BProto_data_header_s); - - uint32_t payload_len = ltoh32(val.len); - ASSERT(left >= payload_len) - uint8_t *payload = o->buf + o->ipv4_addr_start + o->ipv4_addr_pos; - o->ipv4_addr_pos += payload_len; - left -= payload_len; - - if (type == BPROTO_TYPE_CONSTDATA && id == 3) { - *data = payload; - return 1; - } - } break; - default: - ASSERT(0); - } - } - - return 0; -} - -void addrParser_Resetipv4_addr (addrParser *o) -{ - o->ipv4_addr_pos = 0; -} - -void addrParser_Forwardipv4_addr (addrParser *o) -{ - o->ipv4_addr_pos = o->ipv4_addr_span; -} - -int addrParser_Getipv6_addr (addrParser *o, uint8_t **data) -{ - ASSERT(o->ipv6_addr_pos >= 0) - ASSERT(o->ipv6_addr_pos <= o->ipv6_addr_span) - - int left = o->ipv6_addr_span - o->ipv6_addr_pos; - - while (left > 0) { - ASSERT(left >= sizeof(struct BProto_header_s)) - struct BProto_header_s header; - memcpy(&header, o->buf + o->ipv6_addr_start + o->ipv6_addr_pos, sizeof(header)); - o->ipv6_addr_pos += sizeof(struct BProto_header_s); - left -= sizeof(struct BProto_header_s); - uint16_t type = ltoh16(header.type); - uint16_t id = ltoh16(header.id); - - switch (type) { - case BPROTO_TYPE_UINT8: { - ASSERT(left >= sizeof(struct BProto_uint8_s)) - o->ipv6_addr_pos += sizeof(struct BProto_uint8_s); - left -= sizeof(struct BProto_uint8_s); - } break; - case BPROTO_TYPE_UINT16: { - ASSERT(left >= sizeof(struct BProto_uint16_s)) - o->ipv6_addr_pos += sizeof(struct BProto_uint16_s); - left -= sizeof(struct BProto_uint16_s); - } break; - case BPROTO_TYPE_UINT32: { - ASSERT(left >= sizeof(struct BProto_uint32_s)) - o->ipv6_addr_pos += sizeof(struct BProto_uint32_s); - left -= sizeof(struct BProto_uint32_s); - } break; - case BPROTO_TYPE_UINT64: { - ASSERT(left >= sizeof(struct BProto_uint64_s)) - o->ipv6_addr_pos += sizeof(struct BProto_uint64_s); - left -= sizeof(struct BProto_uint64_s); - } break; - case BPROTO_TYPE_DATA: - case BPROTO_TYPE_CONSTDATA: - { - ASSERT(left >= sizeof(struct BProto_data_header_s)) - struct BProto_data_header_s val; - memcpy(&val, o->buf + o->ipv6_addr_start + o->ipv6_addr_pos, sizeof(val)); - o->ipv6_addr_pos += sizeof(struct BProto_data_header_s); - left -= sizeof(struct BProto_data_header_s); - - uint32_t payload_len = ltoh32(val.len); - ASSERT(left >= payload_len) - uint8_t *payload = o->buf + o->ipv6_addr_start + o->ipv6_addr_pos; - o->ipv6_addr_pos += payload_len; - left -= payload_len; - - if (type == BPROTO_TYPE_CONSTDATA && id == 4) { - *data = payload; - return 1; - } - } break; - default: - ASSERT(0); - } - } - - return 0; -} - -void addrParser_Resetipv6_addr (addrParser *o) -{ - o->ipv6_addr_pos = 0; -} - -void addrParser_Forwardipv6_addr (addrParser *o) -{ - o->ipv6_addr_pos = o->ipv6_addr_span; -} - diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/bproto_bproto_test.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/bproto_bproto_test.h deleted file mode 100644 index dc4ad804..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/bproto_bproto_test.h +++ /dev/null @@ -1,1029 +0,0 @@ -/* - DO NOT EDIT THIS FILE! - This file was automatically generated by the bproto generator. -*/ - -#include -#include - -#include -#include -#include - - -#define msg1_SIZEa (sizeof(struct BProto_header_s) + sizeof(struct BProto_uint16_s)) -#define msg1_SIZEb (sizeof(struct BProto_header_s) + sizeof(struct BProto_uint32_s)) -#define msg1_SIZEc (sizeof(struct BProto_header_s) + sizeof(struct BProto_uint64_s)) -#define msg1_SIZEd (sizeof(struct BProto_header_s) + sizeof(struct BProto_uint16_s)) -#define msg1_SIZEe (sizeof(struct BProto_header_s) + sizeof(struct BProto_uint8_s)) -#define msg1_SIZEf(_len) (sizeof(struct BProto_header_s) + sizeof(struct BProto_data_header_s) + (_len)) -#define msg1_SIZEg (sizeof(struct BProto_header_s) + sizeof(struct BProto_data_header_s) + (4)) - -typedef struct { - uint8_t *out; - int used; - int a_count; - int b_count; - int c_count; - int d_count; - int e_count; - int f_count; - int g_count; -} msg1Writer; - -static void msg1Writer_Init (msg1Writer *o, uint8_t *out); -static int msg1Writer_Finish (msg1Writer *o); -static void msg1Writer_Adda (msg1Writer *o, uint16_t v); -static void msg1Writer_Addb (msg1Writer *o, uint32_t v); -static void msg1Writer_Addc (msg1Writer *o, uint64_t v); -static void msg1Writer_Addd (msg1Writer *o, uint16_t v); -static void msg1Writer_Adde (msg1Writer *o, uint8_t v); -static uint8_t * msg1Writer_Addf (msg1Writer *o, int len); -static uint8_t * msg1Writer_Addg (msg1Writer *o); - -typedef struct { - uint8_t *buf; - int buf_len; - int a_start; - int a_span; - int a_pos; - int b_start; - int b_span; - int b_pos; - int c_start; - int c_span; - int c_pos; - int d_start; - int d_span; - int d_pos; - int e_start; - int e_span; - int e_pos; - int f_start; - int f_span; - int f_pos; - int g_start; - int g_span; - int g_pos; -} msg1Parser; - -static int msg1Parser_Init (msg1Parser *o, uint8_t *buf, int buf_len); -static int msg1Parser_GotEverything (msg1Parser *o); -static int msg1Parser_Geta (msg1Parser *o, uint16_t *v); -static void msg1Parser_Reseta (msg1Parser *o); -static void msg1Parser_Forwarda (msg1Parser *o); -static int msg1Parser_Getb (msg1Parser *o, uint32_t *v); -static void msg1Parser_Resetb (msg1Parser *o); -static void msg1Parser_Forwardb (msg1Parser *o); -static int msg1Parser_Getc (msg1Parser *o, uint64_t *v); -static void msg1Parser_Resetc (msg1Parser *o); -static void msg1Parser_Forwardc (msg1Parser *o); -static int msg1Parser_Getd (msg1Parser *o, uint16_t *v); -static void msg1Parser_Resetd (msg1Parser *o); -static void msg1Parser_Forwardd (msg1Parser *o); -static int msg1Parser_Gete (msg1Parser *o, uint8_t *v); -static void msg1Parser_Resete (msg1Parser *o); -static void msg1Parser_Forwarde (msg1Parser *o); -static int msg1Parser_Getf (msg1Parser *o, uint8_t **data, int *data_len); -static void msg1Parser_Resetf (msg1Parser *o); -static void msg1Parser_Forwardf (msg1Parser *o); -static int msg1Parser_Getg (msg1Parser *o, uint8_t **data); -static void msg1Parser_Resetg (msg1Parser *o); -static void msg1Parser_Forwardg (msg1Parser *o); - -void msg1Writer_Init (msg1Writer *o, uint8_t *out) -{ - o->out = out; - o->used = 0; - o->a_count = 0; - o->b_count = 0; - o->c_count = 0; - o->d_count = 0; - o->e_count = 0; - o->f_count = 0; - o->g_count = 0; -} - -int msg1Writer_Finish (msg1Writer *o) -{ - ASSERT(o->used >= 0) - ASSERT(o->a_count == 1) - ASSERT(o->b_count >= 0 && o->b_count <= 1) - ASSERT(o->c_count >= 1) - ASSERT(o->d_count >= 0) - ASSERT(o->e_count == 1) - ASSERT(o->f_count == 1) - ASSERT(o->g_count == 1) - - return o->used; -} - -void msg1Writer_Adda (msg1Writer *o, uint16_t v) -{ - ASSERT(o->used >= 0) - ASSERT(o->a_count == 0) - - - struct BProto_header_s header; - header.id = htol16(5); - header.type = htol16(BPROTO_TYPE_UINT16); - memcpy(o->out + o->used, &header, sizeof(header)); - o->used += sizeof(struct BProto_header_s); - - struct BProto_uint16_s data; - data.v = htol16(v); - memcpy(o->out + o->used, &data, sizeof(data)); - o->used += sizeof(struct BProto_uint16_s); - - o->a_count++; -} - -void msg1Writer_Addb (msg1Writer *o, uint32_t v) -{ - ASSERT(o->used >= 0) - ASSERT(o->b_count == 0) - - - struct BProto_header_s header; - header.id = htol16(6); - header.type = htol16(BPROTO_TYPE_UINT32); - memcpy(o->out + o->used, &header, sizeof(header)); - o->used += sizeof(struct BProto_header_s); - - struct BProto_uint32_s data; - data.v = htol32(v); - memcpy(o->out + o->used, &data, sizeof(data)); - o->used += sizeof(struct BProto_uint32_s); - - o->b_count++; -} - -void msg1Writer_Addc (msg1Writer *o, uint64_t v) -{ - ASSERT(o->used >= 0) - - - - struct BProto_header_s header; - header.id = htol16(7); - header.type = htol16(BPROTO_TYPE_UINT64); - memcpy(o->out + o->used, &header, sizeof(header)); - o->used += sizeof(struct BProto_header_s); - - struct BProto_uint64_s data; - data.v = htol64(v); - memcpy(o->out + o->used, &data, sizeof(data)); - o->used += sizeof(struct BProto_uint64_s); - - o->c_count++; -} - -void msg1Writer_Addd (msg1Writer *o, uint16_t v) -{ - ASSERT(o->used >= 0) - - - - struct BProto_header_s header; - header.id = htol16(8); - header.type = htol16(BPROTO_TYPE_UINT16); - memcpy(o->out + o->used, &header, sizeof(header)); - o->used += sizeof(struct BProto_header_s); - - struct BProto_uint16_s data; - data.v = htol16(v); - memcpy(o->out + o->used, &data, sizeof(data)); - o->used += sizeof(struct BProto_uint16_s); - - o->d_count++; -} - -void msg1Writer_Adde (msg1Writer *o, uint8_t v) -{ - ASSERT(o->used >= 0) - ASSERT(o->e_count == 0) - - - struct BProto_header_s header; - header.id = htol16(9); - header.type = htol16(BPROTO_TYPE_UINT8); - memcpy(o->out + o->used, &header, sizeof(header)); - o->used += sizeof(struct BProto_header_s); - - struct BProto_uint8_s data; - data.v = htol8(v); - memcpy(o->out + o->used, &data, sizeof(data)); - o->used += sizeof(struct BProto_uint8_s); - - o->e_count++; -} - -uint8_t * msg1Writer_Addf (msg1Writer *o, int len) -{ - ASSERT(o->used >= 0) - ASSERT(o->f_count == 0) - ASSERT(len >= 0 && len <= UINT32_MAX) - - struct BProto_header_s header; - header.id = htol16(10); - header.type = htol16(BPROTO_TYPE_DATA); - memcpy(o->out + o->used, &header, sizeof(header)); - o->used += sizeof(struct BProto_header_s); - - struct BProto_data_header_s data; - data.len = htol32(len); - memcpy(o->out + o->used, &data, sizeof(data)); - o->used += sizeof(struct BProto_data_header_s); - - uint8_t *dest = (o->out + o->used); - o->used += len; - - o->f_count++; - - return dest; -} - -uint8_t * msg1Writer_Addg (msg1Writer *o) -{ - ASSERT(o->used >= 0) - ASSERT(o->g_count == 0) - - - struct BProto_header_s header; - header.id = htol16(11); - header.type = htol16(BPROTO_TYPE_CONSTDATA); - memcpy(o->out + o->used, &header, sizeof(header)); - o->used += sizeof(struct BProto_header_s); - - struct BProto_data_header_s data; - data.len = htol32(4); - memcpy(o->out + o->used, &data, sizeof(data)); - o->used += sizeof(struct BProto_data_header_s); - - uint8_t *dest = (o->out + o->used); - o->used += (4); - - o->g_count++; - - return dest; -} - -int msg1Parser_Init (msg1Parser *o, uint8_t *buf, int buf_len) -{ - ASSERT(buf_len >= 0) - - o->buf = buf; - o->buf_len = buf_len; - o->a_start = o->buf_len; - o->a_span = 0; - o->a_pos = 0; - o->b_start = o->buf_len; - o->b_span = 0; - o->b_pos = 0; - o->c_start = o->buf_len; - o->c_span = 0; - o->c_pos = 0; - o->d_start = o->buf_len; - o->d_span = 0; - o->d_pos = 0; - o->e_start = o->buf_len; - o->e_span = 0; - o->e_pos = 0; - o->f_start = o->buf_len; - o->f_span = 0; - o->f_pos = 0; - o->g_start = o->buf_len; - o->g_span = 0; - o->g_pos = 0; - - int a_count = 0; - int b_count = 0; - int c_count = 0; - int d_count = 0; - int e_count = 0; - int f_count = 0; - int g_count = 0; - - int pos = 0; - int left = o->buf_len; - - while (left > 0) { - int entry_pos = pos; - - if (!(left >= sizeof(struct BProto_header_s))) { - return 0; - } - struct BProto_header_s header; - memcpy(&header, o->buf + pos, sizeof(header)); - pos += sizeof(struct BProto_header_s); - left -= sizeof(struct BProto_header_s); - uint16_t type = ltoh16(header.type); - uint16_t id = ltoh16(header.id); - - switch (type) { - case BPROTO_TYPE_UINT8: { - if (!(left >= sizeof(struct BProto_uint8_s))) { - return 0; - } - pos += sizeof(struct BProto_uint8_s); - left -= sizeof(struct BProto_uint8_s); - - switch (id) { - case 9: - if (o->e_start == o->buf_len) { - o->e_start = entry_pos; - } - o->e_span = pos - o->e_start; - e_count++; - break; - default: - return 0; - } - } break; - case BPROTO_TYPE_UINT16: { - if (!(left >= sizeof(struct BProto_uint16_s))) { - return 0; - } - pos += sizeof(struct BProto_uint16_s); - left -= sizeof(struct BProto_uint16_s); - - switch (id) { - case 5: - if (o->a_start == o->buf_len) { - o->a_start = entry_pos; - } - o->a_span = pos - o->a_start; - a_count++; - break; - case 8: - if (o->d_start == o->buf_len) { - o->d_start = entry_pos; - } - o->d_span = pos - o->d_start; - d_count++; - break; - default: - return 0; - } - } break; - case BPROTO_TYPE_UINT32: { - if (!(left >= sizeof(struct BProto_uint32_s))) { - return 0; - } - pos += sizeof(struct BProto_uint32_s); - left -= sizeof(struct BProto_uint32_s); - - switch (id) { - case 6: - if (o->b_start == o->buf_len) { - o->b_start = entry_pos; - } - o->b_span = pos - o->b_start; - b_count++; - break; - default: - return 0; - } - } break; - case BPROTO_TYPE_UINT64: { - if (!(left >= sizeof(struct BProto_uint64_s))) { - return 0; - } - pos += sizeof(struct BProto_uint64_s); - left -= sizeof(struct BProto_uint64_s); - - switch (id) { - case 7: - if (o->c_start == o->buf_len) { - o->c_start = entry_pos; - } - o->c_span = pos - o->c_start; - c_count++; - break; - default: - return 0; - } - } break; - case BPROTO_TYPE_DATA: - case BPROTO_TYPE_CONSTDATA: - { - if (!(left >= sizeof(struct BProto_data_header_s))) { - return 0; - } - struct BProto_data_header_s val; - memcpy(&val, o->buf + pos, sizeof(val)); - pos += sizeof(struct BProto_data_header_s); - left -= sizeof(struct BProto_data_header_s); - - uint32_t payload_len = ltoh32(val.len); - if (!(left >= payload_len)) { - return 0; - } - pos += payload_len; - left -= payload_len; - - switch (id) { - case 10: - if (!(type == BPROTO_TYPE_DATA)) { - return 0; - } - if (o->f_start == o->buf_len) { - o->f_start = entry_pos; - } - o->f_span = pos - o->f_start; - f_count++; - break; - case 11: - if (!(type == BPROTO_TYPE_CONSTDATA)) { - return 0; - } - if (!(payload_len == (4))) { - return 0; - } - if (o->g_start == o->buf_len) { - o->g_start = entry_pos; - } - o->g_span = pos - o->g_start; - g_count++; - break; - default: - return 0; - } - } break; - default: - return 0; - } - } - - if (!(a_count == 1)) { - return 0; - } - if (!(b_count <= 1)) { - return 0; - } - if (!(c_count >= 1)) { - return 0; - } - if (!(e_count == 1)) { - return 0; - } - if (!(f_count == 1)) { - return 0; - } - if (!(g_count == 1)) { - return 0; - } - - return 1; -} - -int msg1Parser_GotEverything (msg1Parser *o) -{ - return ( - o->a_pos == o->a_span - && - o->b_pos == o->b_span - && - o->c_pos == o->c_span - && - o->d_pos == o->d_span - && - o->e_pos == o->e_span - && - o->f_pos == o->f_span - && - o->g_pos == o->g_span - ); -} - -int msg1Parser_Geta (msg1Parser *o, uint16_t *v) -{ - ASSERT(o->a_pos >= 0) - ASSERT(o->a_pos <= o->a_span) - - int left = o->a_span - o->a_pos; - - while (left > 0) { - ASSERT(left >= sizeof(struct BProto_header_s)) - struct BProto_header_s header; - memcpy(&header, o->buf + o->a_start + o->a_pos, sizeof(header)); - o->a_pos += sizeof(struct BProto_header_s); - left -= sizeof(struct BProto_header_s); - uint16_t type = ltoh16(header.type); - uint16_t id = ltoh16(header.id); - - switch (type) { - case BPROTO_TYPE_UINT8: { - ASSERT(left >= sizeof(struct BProto_uint8_s)) - o->a_pos += sizeof(struct BProto_uint8_s); - left -= sizeof(struct BProto_uint8_s); - } break; - case BPROTO_TYPE_UINT16: { - ASSERT(left >= sizeof(struct BProto_uint16_s)) - struct BProto_uint16_s val; - memcpy(&val, o->buf + o->a_start + o->a_pos, sizeof(val)); - o->a_pos += sizeof(struct BProto_uint16_s); - left -= sizeof(struct BProto_uint16_s); - - if (id == 5) { - *v = ltoh16(val.v); - return 1; - } - } break; - case BPROTO_TYPE_UINT32: { - ASSERT(left >= sizeof(struct BProto_uint32_s)) - o->a_pos += sizeof(struct BProto_uint32_s); - left -= sizeof(struct BProto_uint32_s); - } break; - case BPROTO_TYPE_UINT64: { - ASSERT(left >= sizeof(struct BProto_uint64_s)) - o->a_pos += sizeof(struct BProto_uint64_s); - left -= sizeof(struct BProto_uint64_s); - } break; - case BPROTO_TYPE_DATA: - case BPROTO_TYPE_CONSTDATA: - { - ASSERT(left >= sizeof(struct BProto_data_header_s)) - struct BProto_data_header_s val; - memcpy(&val, o->buf + o->a_start + o->a_pos, sizeof(val)); - o->a_pos += sizeof(struct BProto_data_header_s); - left -= sizeof(struct BProto_data_header_s); - - uint32_t payload_len = ltoh32(val.len); - ASSERT(left >= payload_len) - o->a_pos += payload_len; - left -= payload_len; - } break; - default: - ASSERT(0); - } - } - - return 0; -} - -void msg1Parser_Reseta (msg1Parser *o) -{ - o->a_pos = 0; -} - -void msg1Parser_Forwarda (msg1Parser *o) -{ - o->a_pos = o->a_span; -} - -int msg1Parser_Getb (msg1Parser *o, uint32_t *v) -{ - ASSERT(o->b_pos >= 0) - ASSERT(o->b_pos <= o->b_span) - - int left = o->b_span - o->b_pos; - - while (left > 0) { - ASSERT(left >= sizeof(struct BProto_header_s)) - struct BProto_header_s header; - memcpy(&header, o->buf + o->b_start + o->b_pos, sizeof(header)); - o->b_pos += sizeof(struct BProto_header_s); - left -= sizeof(struct BProto_header_s); - uint16_t type = ltoh16(header.type); - uint16_t id = ltoh16(header.id); - - switch (type) { - case BPROTO_TYPE_UINT8: { - ASSERT(left >= sizeof(struct BProto_uint8_s)) - o->b_pos += sizeof(struct BProto_uint8_s); - left -= sizeof(struct BProto_uint8_s); - } break; - case BPROTO_TYPE_UINT16: { - ASSERT(left >= sizeof(struct BProto_uint16_s)) - o->b_pos += sizeof(struct BProto_uint16_s); - left -= sizeof(struct BProto_uint16_s); - } break; - case BPROTO_TYPE_UINT32: { - ASSERT(left >= sizeof(struct BProto_uint32_s)) - struct BProto_uint32_s val; - memcpy(&val, o->buf + o->b_start + o->b_pos, sizeof(val)); - o->b_pos += sizeof(struct BProto_uint32_s); - left -= sizeof(struct BProto_uint32_s); - - if (id == 6) { - *v = ltoh32(val.v); - return 1; - } - } break; - case BPROTO_TYPE_UINT64: { - ASSERT(left >= sizeof(struct BProto_uint64_s)) - o->b_pos += sizeof(struct BProto_uint64_s); - left -= sizeof(struct BProto_uint64_s); - } break; - case BPROTO_TYPE_DATA: - case BPROTO_TYPE_CONSTDATA: - { - ASSERT(left >= sizeof(struct BProto_data_header_s)) - struct BProto_data_header_s val; - memcpy(&val, o->buf + o->b_start + o->b_pos, sizeof(val)); - o->b_pos += sizeof(struct BProto_data_header_s); - left -= sizeof(struct BProto_data_header_s); - - uint32_t payload_len = ltoh32(val.len); - ASSERT(left >= payload_len) - o->b_pos += payload_len; - left -= payload_len; - } break; - default: - ASSERT(0); - } - } - - return 0; -} - -void msg1Parser_Resetb (msg1Parser *o) -{ - o->b_pos = 0; -} - -void msg1Parser_Forwardb (msg1Parser *o) -{ - o->b_pos = o->b_span; -} - -int msg1Parser_Getc (msg1Parser *o, uint64_t *v) -{ - ASSERT(o->c_pos >= 0) - ASSERT(o->c_pos <= o->c_span) - - int left = o->c_span - o->c_pos; - - while (left > 0) { - ASSERT(left >= sizeof(struct BProto_header_s)) - struct BProto_header_s header; - memcpy(&header, o->buf + o->c_start + o->c_pos, sizeof(header)); - o->c_pos += sizeof(struct BProto_header_s); - left -= sizeof(struct BProto_header_s); - uint16_t type = ltoh16(header.type); - uint16_t id = ltoh16(header.id); - - switch (type) { - case BPROTO_TYPE_UINT8: { - ASSERT(left >= sizeof(struct BProto_uint8_s)) - o->c_pos += sizeof(struct BProto_uint8_s); - left -= sizeof(struct BProto_uint8_s); - } break; - case BPROTO_TYPE_UINT16: { - ASSERT(left >= sizeof(struct BProto_uint16_s)) - o->c_pos += sizeof(struct BProto_uint16_s); - left -= sizeof(struct BProto_uint16_s); - } break; - case BPROTO_TYPE_UINT32: { - ASSERT(left >= sizeof(struct BProto_uint32_s)) - o->c_pos += sizeof(struct BProto_uint32_s); - left -= sizeof(struct BProto_uint32_s); - } break; - case BPROTO_TYPE_UINT64: { - ASSERT(left >= sizeof(struct BProto_uint64_s)) - struct BProto_uint64_s val; - memcpy(&val, o->buf + o->c_start + o->c_pos, sizeof(val)); - o->c_pos += sizeof(struct BProto_uint64_s); - left -= sizeof(struct BProto_uint64_s); - - if (id == 7) { - *v = ltoh64(val.v); - return 1; - } - } break; - case BPROTO_TYPE_DATA: - case BPROTO_TYPE_CONSTDATA: - { - ASSERT(left >= sizeof(struct BProto_data_header_s)) - struct BProto_data_header_s val; - memcpy(&val, o->buf + o->c_start + o->c_pos, sizeof(val)); - o->c_pos += sizeof(struct BProto_data_header_s); - left -= sizeof(struct BProto_data_header_s); - - uint32_t payload_len = ltoh32(val.len); - ASSERT(left >= payload_len) - o->c_pos += payload_len; - left -= payload_len; - } break; - default: - ASSERT(0); - } - } - - return 0; -} - -void msg1Parser_Resetc (msg1Parser *o) -{ - o->c_pos = 0; -} - -void msg1Parser_Forwardc (msg1Parser *o) -{ - o->c_pos = o->c_span; -} - -int msg1Parser_Getd (msg1Parser *o, uint16_t *v) -{ - ASSERT(o->d_pos >= 0) - ASSERT(o->d_pos <= o->d_span) - - int left = o->d_span - o->d_pos; - - while (left > 0) { - ASSERT(left >= sizeof(struct BProto_header_s)) - struct BProto_header_s header; - memcpy(&header, o->buf + o->d_start + o->d_pos, sizeof(header)); - o->d_pos += sizeof(struct BProto_header_s); - left -= sizeof(struct BProto_header_s); - uint16_t type = ltoh16(header.type); - uint16_t id = ltoh16(header.id); - - switch (type) { - case BPROTO_TYPE_UINT8: { - ASSERT(left >= sizeof(struct BProto_uint8_s)) - o->d_pos += sizeof(struct BProto_uint8_s); - left -= sizeof(struct BProto_uint8_s); - } break; - case BPROTO_TYPE_UINT16: { - ASSERT(left >= sizeof(struct BProto_uint16_s)) - struct BProto_uint16_s val; - memcpy(&val, o->buf + o->d_start + o->d_pos, sizeof(val)); - o->d_pos += sizeof(struct BProto_uint16_s); - left -= sizeof(struct BProto_uint16_s); - - if (id == 8) { - *v = ltoh16(val.v); - return 1; - } - } break; - case BPROTO_TYPE_UINT32: { - ASSERT(left >= sizeof(struct BProto_uint32_s)) - o->d_pos += sizeof(struct BProto_uint32_s); - left -= sizeof(struct BProto_uint32_s); - } break; - case BPROTO_TYPE_UINT64: { - ASSERT(left >= sizeof(struct BProto_uint64_s)) - o->d_pos += sizeof(struct BProto_uint64_s); - left -= sizeof(struct BProto_uint64_s); - } break; - case BPROTO_TYPE_DATA: - case BPROTO_TYPE_CONSTDATA: - { - ASSERT(left >= sizeof(struct BProto_data_header_s)) - struct BProto_data_header_s val; - memcpy(&val, o->buf + o->d_start + o->d_pos, sizeof(val)); - o->d_pos += sizeof(struct BProto_data_header_s); - left -= sizeof(struct BProto_data_header_s); - - uint32_t payload_len = ltoh32(val.len); - ASSERT(left >= payload_len) - o->d_pos += payload_len; - left -= payload_len; - } break; - default: - ASSERT(0); - } - } - - return 0; -} - -void msg1Parser_Resetd (msg1Parser *o) -{ - o->d_pos = 0; -} - -void msg1Parser_Forwardd (msg1Parser *o) -{ - o->d_pos = o->d_span; -} - -int msg1Parser_Gete (msg1Parser *o, uint8_t *v) -{ - ASSERT(o->e_pos >= 0) - ASSERT(o->e_pos <= o->e_span) - - int left = o->e_span - o->e_pos; - - while (left > 0) { - ASSERT(left >= sizeof(struct BProto_header_s)) - struct BProto_header_s header; - memcpy(&header, o->buf + o->e_start + o->e_pos, sizeof(header)); - o->e_pos += sizeof(struct BProto_header_s); - left -= sizeof(struct BProto_header_s); - uint16_t type = ltoh16(header.type); - uint16_t id = ltoh16(header.id); - - switch (type) { - case BPROTO_TYPE_UINT8: { - ASSERT(left >= sizeof(struct BProto_uint8_s)) - struct BProto_uint8_s val; - memcpy(&val, o->buf + o->e_start + o->e_pos, sizeof(val)); - o->e_pos += sizeof(struct BProto_uint8_s); - left -= sizeof(struct BProto_uint8_s); - - if (id == 9) { - *v = ltoh8(val.v); - return 1; - } - } break; - case BPROTO_TYPE_UINT16: { - ASSERT(left >= sizeof(struct BProto_uint16_s)) - o->e_pos += sizeof(struct BProto_uint16_s); - left -= sizeof(struct BProto_uint16_s); - } break; - case BPROTO_TYPE_UINT32: { - ASSERT(left >= sizeof(struct BProto_uint32_s)) - o->e_pos += sizeof(struct BProto_uint32_s); - left -= sizeof(struct BProto_uint32_s); - } break; - case BPROTO_TYPE_UINT64: { - ASSERT(left >= sizeof(struct BProto_uint64_s)) - o->e_pos += sizeof(struct BProto_uint64_s); - left -= sizeof(struct BProto_uint64_s); - } break; - case BPROTO_TYPE_DATA: - case BPROTO_TYPE_CONSTDATA: - { - ASSERT(left >= sizeof(struct BProto_data_header_s)) - struct BProto_data_header_s val; - memcpy(&val, o->buf + o->e_start + o->e_pos, sizeof(val)); - o->e_pos += sizeof(struct BProto_data_header_s); - left -= sizeof(struct BProto_data_header_s); - - uint32_t payload_len = ltoh32(val.len); - ASSERT(left >= payload_len) - o->e_pos += payload_len; - left -= payload_len; - } break; - default: - ASSERT(0); - } - } - - return 0; -} - -void msg1Parser_Resete (msg1Parser *o) -{ - o->e_pos = 0; -} - -void msg1Parser_Forwarde (msg1Parser *o) -{ - o->e_pos = o->e_span; -} - -int msg1Parser_Getf (msg1Parser *o, uint8_t **data, int *data_len) -{ - ASSERT(o->f_pos >= 0) - ASSERT(o->f_pos <= o->f_span) - - int left = o->f_span - o->f_pos; - - while (left > 0) { - ASSERT(left >= sizeof(struct BProto_header_s)) - struct BProto_header_s header; - memcpy(&header, o->buf + o->f_start + o->f_pos, sizeof(header)); - o->f_pos += sizeof(struct BProto_header_s); - left -= sizeof(struct BProto_header_s); - uint16_t type = ltoh16(header.type); - uint16_t id = ltoh16(header.id); - - switch (type) { - case BPROTO_TYPE_UINT8: { - ASSERT(left >= sizeof(struct BProto_uint8_s)) - o->f_pos += sizeof(struct BProto_uint8_s); - left -= sizeof(struct BProto_uint8_s); - } break; - case BPROTO_TYPE_UINT16: { - ASSERT(left >= sizeof(struct BProto_uint16_s)) - o->f_pos += sizeof(struct BProto_uint16_s); - left -= sizeof(struct BProto_uint16_s); - } break; - case BPROTO_TYPE_UINT32: { - ASSERT(left >= sizeof(struct BProto_uint32_s)) - o->f_pos += sizeof(struct BProto_uint32_s); - left -= sizeof(struct BProto_uint32_s); - } break; - case BPROTO_TYPE_UINT64: { - ASSERT(left >= sizeof(struct BProto_uint64_s)) - o->f_pos += sizeof(struct BProto_uint64_s); - left -= sizeof(struct BProto_uint64_s); - } break; - case BPROTO_TYPE_DATA: - case BPROTO_TYPE_CONSTDATA: - { - ASSERT(left >= sizeof(struct BProto_data_header_s)) - struct BProto_data_header_s val; - memcpy(&val, o->buf + o->f_start + o->f_pos, sizeof(val)); - o->f_pos += sizeof(struct BProto_data_header_s); - left -= sizeof(struct BProto_data_header_s); - - uint32_t payload_len = ltoh32(val.len); - ASSERT(left >= payload_len) - uint8_t *payload = o->buf + o->f_start + o->f_pos; - o->f_pos += payload_len; - left -= payload_len; - - if (type == BPROTO_TYPE_DATA && id == 10) { - *data = payload; - *data_len = payload_len; - return 1; - } - } break; - default: - ASSERT(0); - } - } - - return 0; -} - -void msg1Parser_Resetf (msg1Parser *o) -{ - o->f_pos = 0; -} - -void msg1Parser_Forwardf (msg1Parser *o) -{ - o->f_pos = o->f_span; -} - -int msg1Parser_Getg (msg1Parser *o, uint8_t **data) -{ - ASSERT(o->g_pos >= 0) - ASSERT(o->g_pos <= o->g_span) - - int left = o->g_span - o->g_pos; - - while (left > 0) { - ASSERT(left >= sizeof(struct BProto_header_s)) - struct BProto_header_s header; - memcpy(&header, o->buf + o->g_start + o->g_pos, sizeof(header)); - o->g_pos += sizeof(struct BProto_header_s); - left -= sizeof(struct BProto_header_s); - uint16_t type = ltoh16(header.type); - uint16_t id = ltoh16(header.id); - - switch (type) { - case BPROTO_TYPE_UINT8: { - ASSERT(left >= sizeof(struct BProto_uint8_s)) - o->g_pos += sizeof(struct BProto_uint8_s); - left -= sizeof(struct BProto_uint8_s); - } break; - case BPROTO_TYPE_UINT16: { - ASSERT(left >= sizeof(struct BProto_uint16_s)) - o->g_pos += sizeof(struct BProto_uint16_s); - left -= sizeof(struct BProto_uint16_s); - } break; - case BPROTO_TYPE_UINT32: { - ASSERT(left >= sizeof(struct BProto_uint32_s)) - o->g_pos += sizeof(struct BProto_uint32_s); - left -= sizeof(struct BProto_uint32_s); - } break; - case BPROTO_TYPE_UINT64: { - ASSERT(left >= sizeof(struct BProto_uint64_s)) - o->g_pos += sizeof(struct BProto_uint64_s); - left -= sizeof(struct BProto_uint64_s); - } break; - case BPROTO_TYPE_DATA: - case BPROTO_TYPE_CONSTDATA: - { - ASSERT(left >= sizeof(struct BProto_data_header_s)) - struct BProto_data_header_s val; - memcpy(&val, o->buf + o->g_start + o->g_pos, sizeof(val)); - o->g_pos += sizeof(struct BProto_data_header_s); - left -= sizeof(struct BProto_data_header_s); - - uint32_t payload_len = ltoh32(val.len); - ASSERT(left >= payload_len) - uint8_t *payload = o->buf + o->g_start + o->g_pos; - o->g_pos += payload_len; - left -= payload_len; - - if (type == BPROTO_TYPE_CONSTDATA && id == 11) { - *data = payload; - return 1; - } - } break; - default: - ASSERT(0); - } - } - - return 0; -} - -void msg1Parser_Resetg (msg1Parser *o) -{ - o->g_pos = 0; -} - -void msg1Parser_Forwardg (msg1Parser *o) -{ - o->g_pos = o->g_span; -} - diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/bproto_msgproto.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/bproto_msgproto.h deleted file mode 100644 index e429223d..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/generated/bproto_msgproto.h +++ /dev/null @@ -1,2122 +0,0 @@ -/* - DO NOT EDIT THIS FILE! - This file was automatically generated by the bproto generator. -*/ - -#include -#include - -#include -#include -#include - - -#define msg_SIZEtype (sizeof(struct BProto_header_s) + sizeof(struct BProto_uint16_s)) -#define msg_SIZEpayload(_len) (sizeof(struct BProto_header_s) + sizeof(struct BProto_data_header_s) + (_len)) - -typedef struct { - uint8_t *out; - int used; - int type_count; - int payload_count; -} msgWriter; - -static void msgWriter_Init (msgWriter *o, uint8_t *out); -static int msgWriter_Finish (msgWriter *o); -static void msgWriter_Addtype (msgWriter *o, uint16_t v); -static uint8_t * msgWriter_Addpayload (msgWriter *o, int len); - -typedef struct { - uint8_t *buf; - int buf_len; - int type_start; - int type_span; - int type_pos; - int payload_start; - int payload_span; - int payload_pos; -} msgParser; - -static int msgParser_Init (msgParser *o, uint8_t *buf, int buf_len); -static int msgParser_GotEverything (msgParser *o); -static int msgParser_Gettype (msgParser *o, uint16_t *v); -static void msgParser_Resettype (msgParser *o); -static void msgParser_Forwardtype (msgParser *o); -static int msgParser_Getpayload (msgParser *o, uint8_t **data, int *data_len); -static void msgParser_Resetpayload (msgParser *o); -static void msgParser_Forwardpayload (msgParser *o); - -void msgWriter_Init (msgWriter *o, uint8_t *out) -{ - o->out = out; - o->used = 0; - o->type_count = 0; - o->payload_count = 0; -} - -int msgWriter_Finish (msgWriter *o) -{ - ASSERT(o->used >= 0) - ASSERT(o->type_count == 1) - ASSERT(o->payload_count == 1) - - return o->used; -} - -void msgWriter_Addtype (msgWriter *o, uint16_t v) -{ - ASSERT(o->used >= 0) - ASSERT(o->type_count == 0) - - - struct BProto_header_s header; - header.id = htol16(1); - header.type = htol16(BPROTO_TYPE_UINT16); - memcpy(o->out + o->used, &header, sizeof(header)); - o->used += sizeof(struct BProto_header_s); - - struct BProto_uint16_s data; - data.v = htol16(v); - memcpy(o->out + o->used, &data, sizeof(data)); - o->used += sizeof(struct BProto_uint16_s); - - o->type_count++; -} - -uint8_t * msgWriter_Addpayload (msgWriter *o, int len) -{ - ASSERT(o->used >= 0) - ASSERT(o->payload_count == 0) - ASSERT(len >= 0 && len <= UINT32_MAX) - - struct BProto_header_s header; - header.id = htol16(2); - header.type = htol16(BPROTO_TYPE_DATA); - memcpy(o->out + o->used, &header, sizeof(header)); - o->used += sizeof(struct BProto_header_s); - - struct BProto_data_header_s data; - data.len = htol32(len); - memcpy(o->out + o->used, &data, sizeof(data)); - o->used += sizeof(struct BProto_data_header_s); - - uint8_t *dest = (o->out + o->used); - o->used += len; - - o->payload_count++; - - return dest; -} - -int msgParser_Init (msgParser *o, uint8_t *buf, int buf_len) -{ - ASSERT(buf_len >= 0) - - o->buf = buf; - o->buf_len = buf_len; - o->type_start = o->buf_len; - o->type_span = 0; - o->type_pos = 0; - o->payload_start = o->buf_len; - o->payload_span = 0; - o->payload_pos = 0; - - int type_count = 0; - int payload_count = 0; - - int pos = 0; - int left = o->buf_len; - - while (left > 0) { - int entry_pos = pos; - - if (!(left >= sizeof(struct BProto_header_s))) { - return 0; - } - struct BProto_header_s header; - memcpy(&header, o->buf + pos, sizeof(header)); - pos += sizeof(struct BProto_header_s); - left -= sizeof(struct BProto_header_s); - uint16_t type = ltoh16(header.type); - uint16_t id = ltoh16(header.id); - - switch (type) { - case BPROTO_TYPE_UINT8: { - if (!(left >= sizeof(struct BProto_uint8_s))) { - return 0; - } - pos += sizeof(struct BProto_uint8_s); - left -= sizeof(struct BProto_uint8_s); - - switch (id) { - default: - return 0; - } - } break; - case BPROTO_TYPE_UINT16: { - if (!(left >= sizeof(struct BProto_uint16_s))) { - return 0; - } - pos += sizeof(struct BProto_uint16_s); - left -= sizeof(struct BProto_uint16_s); - - switch (id) { - case 1: - if (o->type_start == o->buf_len) { - o->type_start = entry_pos; - } - o->type_span = pos - o->type_start; - type_count++; - break; - default: - return 0; - } - } break; - case BPROTO_TYPE_UINT32: { - if (!(left >= sizeof(struct BProto_uint32_s))) { - return 0; - } - pos += sizeof(struct BProto_uint32_s); - left -= sizeof(struct BProto_uint32_s); - - switch (id) { - default: - return 0; - } - } break; - case BPROTO_TYPE_UINT64: { - if (!(left >= sizeof(struct BProto_uint64_s))) { - return 0; - } - pos += sizeof(struct BProto_uint64_s); - left -= sizeof(struct BProto_uint64_s); - - switch (id) { - default: - return 0; - } - } break; - case BPROTO_TYPE_DATA: - case BPROTO_TYPE_CONSTDATA: - { - if (!(left >= sizeof(struct BProto_data_header_s))) { - return 0; - } - struct BProto_data_header_s val; - memcpy(&val, o->buf + pos, sizeof(val)); - pos += sizeof(struct BProto_data_header_s); - left -= sizeof(struct BProto_data_header_s); - - uint32_t payload_len = ltoh32(val.len); - if (!(left >= payload_len)) { - return 0; - } - pos += payload_len; - left -= payload_len; - - switch (id) { - case 2: - if (!(type == BPROTO_TYPE_DATA)) { - return 0; - } - if (o->payload_start == o->buf_len) { - o->payload_start = entry_pos; - } - o->payload_span = pos - o->payload_start; - payload_count++; - break; - default: - return 0; - } - } break; - default: - return 0; - } - } - - if (!(type_count == 1)) { - return 0; - } - if (!(payload_count == 1)) { - return 0; - } - - return 1; -} - -int msgParser_GotEverything (msgParser *o) -{ - return ( - o->type_pos == o->type_span - && - o->payload_pos == o->payload_span - ); -} - -int msgParser_Gettype (msgParser *o, uint16_t *v) -{ - ASSERT(o->type_pos >= 0) - ASSERT(o->type_pos <= o->type_span) - - int left = o->type_span - o->type_pos; - - while (left > 0) { - ASSERT(left >= sizeof(struct BProto_header_s)) - struct BProto_header_s header; - memcpy(&header, o->buf + o->type_start + o->type_pos, sizeof(header)); - o->type_pos += sizeof(struct BProto_header_s); - left -= sizeof(struct BProto_header_s); - uint16_t type = ltoh16(header.type); - uint16_t id = ltoh16(header.id); - - switch (type) { - case BPROTO_TYPE_UINT8: { - ASSERT(left >= sizeof(struct BProto_uint8_s)) - o->type_pos += sizeof(struct BProto_uint8_s); - left -= sizeof(struct BProto_uint8_s); - } break; - case BPROTO_TYPE_UINT16: { - ASSERT(left >= sizeof(struct BProto_uint16_s)) - struct BProto_uint16_s val; - memcpy(&val, o->buf + o->type_start + o->type_pos, sizeof(val)); - o->type_pos += sizeof(struct BProto_uint16_s); - left -= sizeof(struct BProto_uint16_s); - - if (id == 1) { - *v = ltoh16(val.v); - return 1; - } - } break; - case BPROTO_TYPE_UINT32: { - ASSERT(left >= sizeof(struct BProto_uint32_s)) - o->type_pos += sizeof(struct BProto_uint32_s); - left -= sizeof(struct BProto_uint32_s); - } break; - case BPROTO_TYPE_UINT64: { - ASSERT(left >= sizeof(struct BProto_uint64_s)) - o->type_pos += sizeof(struct BProto_uint64_s); - left -= sizeof(struct BProto_uint64_s); - } break; - case BPROTO_TYPE_DATA: - case BPROTO_TYPE_CONSTDATA: - { - ASSERT(left >= sizeof(struct BProto_data_header_s)) - struct BProto_data_header_s val; - memcpy(&val, o->buf + o->type_start + o->type_pos, sizeof(val)); - o->type_pos += sizeof(struct BProto_data_header_s); - left -= sizeof(struct BProto_data_header_s); - - uint32_t payload_len = ltoh32(val.len); - ASSERT(left >= payload_len) - o->type_pos += payload_len; - left -= payload_len; - } break; - default: - ASSERT(0); - } - } - - return 0; -} - -void msgParser_Resettype (msgParser *o) -{ - o->type_pos = 0; -} - -void msgParser_Forwardtype (msgParser *o) -{ - o->type_pos = o->type_span; -} - -int msgParser_Getpayload (msgParser *o, uint8_t **data, int *data_len) -{ - ASSERT(o->payload_pos >= 0) - ASSERT(o->payload_pos <= o->payload_span) - - int left = o->payload_span - o->payload_pos; - - while (left > 0) { - ASSERT(left >= sizeof(struct BProto_header_s)) - struct BProto_header_s header; - memcpy(&header, o->buf + o->payload_start + o->payload_pos, sizeof(header)); - o->payload_pos += sizeof(struct BProto_header_s); - left -= sizeof(struct BProto_header_s); - uint16_t type = ltoh16(header.type); - uint16_t id = ltoh16(header.id); - - switch (type) { - case BPROTO_TYPE_UINT8: { - ASSERT(left >= sizeof(struct BProto_uint8_s)) - o->payload_pos += sizeof(struct BProto_uint8_s); - left -= sizeof(struct BProto_uint8_s); - } break; - case BPROTO_TYPE_UINT16: { - ASSERT(left >= sizeof(struct BProto_uint16_s)) - o->payload_pos += sizeof(struct BProto_uint16_s); - left -= sizeof(struct BProto_uint16_s); - } break; - case BPROTO_TYPE_UINT32: { - ASSERT(left >= sizeof(struct BProto_uint32_s)) - o->payload_pos += sizeof(struct BProto_uint32_s); - left -= sizeof(struct BProto_uint32_s); - } break; - case BPROTO_TYPE_UINT64: { - ASSERT(left >= sizeof(struct BProto_uint64_s)) - o->payload_pos += sizeof(struct BProto_uint64_s); - left -= sizeof(struct BProto_uint64_s); - } break; - case BPROTO_TYPE_DATA: - case BPROTO_TYPE_CONSTDATA: - { - ASSERT(left >= sizeof(struct BProto_data_header_s)) - struct BProto_data_header_s val; - memcpy(&val, o->buf + o->payload_start + o->payload_pos, sizeof(val)); - o->payload_pos += sizeof(struct BProto_data_header_s); - left -= sizeof(struct BProto_data_header_s); - - uint32_t payload_len = ltoh32(val.len); - ASSERT(left >= payload_len) - uint8_t *payload = o->buf + o->payload_start + o->payload_pos; - o->payload_pos += payload_len; - left -= payload_len; - - if (type == BPROTO_TYPE_DATA && id == 2) { - *data = payload; - *data_len = payload_len; - return 1; - } - } break; - default: - ASSERT(0); - } - } - - return 0; -} - -void msgParser_Resetpayload (msgParser *o) -{ - o->payload_pos = 0; -} - -void msgParser_Forwardpayload (msgParser *o) -{ - o->payload_pos = o->payload_span; -} - -#define msg_youconnect_SIZEaddr(_len) (sizeof(struct BProto_header_s) + sizeof(struct BProto_data_header_s) + (_len)) -#define msg_youconnect_SIZEkey(_len) (sizeof(struct BProto_header_s) + sizeof(struct BProto_data_header_s) + (_len)) -#define msg_youconnect_SIZEpassword (sizeof(struct BProto_header_s) + sizeof(struct BProto_uint64_s)) - -typedef struct { - uint8_t *out; - int used; - int addr_count; - int key_count; - int password_count; -} msg_youconnectWriter; - -static void msg_youconnectWriter_Init (msg_youconnectWriter *o, uint8_t *out); -static int msg_youconnectWriter_Finish (msg_youconnectWriter *o); -static uint8_t * msg_youconnectWriter_Addaddr (msg_youconnectWriter *o, int len); -static uint8_t * msg_youconnectWriter_Addkey (msg_youconnectWriter *o, int len); -static void msg_youconnectWriter_Addpassword (msg_youconnectWriter *o, uint64_t v); - -typedef struct { - uint8_t *buf; - int buf_len; - int addr_start; - int addr_span; - int addr_pos; - int key_start; - int key_span; - int key_pos; - int password_start; - int password_span; - int password_pos; -} msg_youconnectParser; - -static int msg_youconnectParser_Init (msg_youconnectParser *o, uint8_t *buf, int buf_len); -static int msg_youconnectParser_GotEverything (msg_youconnectParser *o); -static int msg_youconnectParser_Getaddr (msg_youconnectParser *o, uint8_t **data, int *data_len); -static void msg_youconnectParser_Resetaddr (msg_youconnectParser *o); -static void msg_youconnectParser_Forwardaddr (msg_youconnectParser *o); -static int msg_youconnectParser_Getkey (msg_youconnectParser *o, uint8_t **data, int *data_len); -static void msg_youconnectParser_Resetkey (msg_youconnectParser *o); -static void msg_youconnectParser_Forwardkey (msg_youconnectParser *o); -static int msg_youconnectParser_Getpassword (msg_youconnectParser *o, uint64_t *v); -static void msg_youconnectParser_Resetpassword (msg_youconnectParser *o); -static void msg_youconnectParser_Forwardpassword (msg_youconnectParser *o); - -void msg_youconnectWriter_Init (msg_youconnectWriter *o, uint8_t *out) -{ - o->out = out; - o->used = 0; - o->addr_count = 0; - o->key_count = 0; - o->password_count = 0; -} - -int msg_youconnectWriter_Finish (msg_youconnectWriter *o) -{ - ASSERT(o->used >= 0) - ASSERT(o->addr_count >= 1) - ASSERT(o->key_count >= 0 && o->key_count <= 1) - ASSERT(o->password_count >= 0 && o->password_count <= 1) - - return o->used; -} - -uint8_t * msg_youconnectWriter_Addaddr (msg_youconnectWriter *o, int len) -{ - ASSERT(o->used >= 0) - - ASSERT(len >= 0 && len <= UINT32_MAX) - - struct BProto_header_s header; - header.id = htol16(1); - header.type = htol16(BPROTO_TYPE_DATA); - memcpy(o->out + o->used, &header, sizeof(header)); - o->used += sizeof(struct BProto_header_s); - - struct BProto_data_header_s data; - data.len = htol32(len); - memcpy(o->out + o->used, &data, sizeof(data)); - o->used += sizeof(struct BProto_data_header_s); - - uint8_t *dest = (o->out + o->used); - o->used += len; - - o->addr_count++; - - return dest; -} - -uint8_t * msg_youconnectWriter_Addkey (msg_youconnectWriter *o, int len) -{ - ASSERT(o->used >= 0) - ASSERT(o->key_count == 0) - ASSERT(len >= 0 && len <= UINT32_MAX) - - struct BProto_header_s header; - header.id = htol16(2); - header.type = htol16(BPROTO_TYPE_DATA); - memcpy(o->out + o->used, &header, sizeof(header)); - o->used += sizeof(struct BProto_header_s); - - struct BProto_data_header_s data; - data.len = htol32(len); - memcpy(o->out + o->used, &data, sizeof(data)); - o->used += sizeof(struct BProto_data_header_s); - - uint8_t *dest = (o->out + o->used); - o->used += len; - - o->key_count++; - - return dest; -} - -void msg_youconnectWriter_Addpassword (msg_youconnectWriter *o, uint64_t v) -{ - ASSERT(o->used >= 0) - ASSERT(o->password_count == 0) - - - struct BProto_header_s header; - header.id = htol16(3); - header.type = htol16(BPROTO_TYPE_UINT64); - memcpy(o->out + o->used, &header, sizeof(header)); - o->used += sizeof(struct BProto_header_s); - - struct BProto_uint64_s data; - data.v = htol64(v); - memcpy(o->out + o->used, &data, sizeof(data)); - o->used += sizeof(struct BProto_uint64_s); - - o->password_count++; -} - -int msg_youconnectParser_Init (msg_youconnectParser *o, uint8_t *buf, int buf_len) -{ - ASSERT(buf_len >= 0) - - o->buf = buf; - o->buf_len = buf_len; - o->addr_start = o->buf_len; - o->addr_span = 0; - o->addr_pos = 0; - o->key_start = o->buf_len; - o->key_span = 0; - o->key_pos = 0; - o->password_start = o->buf_len; - o->password_span = 0; - o->password_pos = 0; - - int addr_count = 0; - int key_count = 0; - int password_count = 0; - - int pos = 0; - int left = o->buf_len; - - while (left > 0) { - int entry_pos = pos; - - if (!(left >= sizeof(struct BProto_header_s))) { - return 0; - } - struct BProto_header_s header; - memcpy(&header, o->buf + pos, sizeof(header)); - pos += sizeof(struct BProto_header_s); - left -= sizeof(struct BProto_header_s); - uint16_t type = ltoh16(header.type); - uint16_t id = ltoh16(header.id); - - switch (type) { - case BPROTO_TYPE_UINT8: { - if (!(left >= sizeof(struct BProto_uint8_s))) { - return 0; - } - pos += sizeof(struct BProto_uint8_s); - left -= sizeof(struct BProto_uint8_s); - - switch (id) { - default: - return 0; - } - } break; - case BPROTO_TYPE_UINT16: { - if (!(left >= sizeof(struct BProto_uint16_s))) { - return 0; - } - pos += sizeof(struct BProto_uint16_s); - left -= sizeof(struct BProto_uint16_s); - - switch (id) { - default: - return 0; - } - } break; - case BPROTO_TYPE_UINT32: { - if (!(left >= sizeof(struct BProto_uint32_s))) { - return 0; - } - pos += sizeof(struct BProto_uint32_s); - left -= sizeof(struct BProto_uint32_s); - - switch (id) { - default: - return 0; - } - } break; - case BPROTO_TYPE_UINT64: { - if (!(left >= sizeof(struct BProto_uint64_s))) { - return 0; - } - pos += sizeof(struct BProto_uint64_s); - left -= sizeof(struct BProto_uint64_s); - - switch (id) { - case 3: - if (o->password_start == o->buf_len) { - o->password_start = entry_pos; - } - o->password_span = pos - o->password_start; - password_count++; - break; - default: - return 0; - } - } break; - case BPROTO_TYPE_DATA: - case BPROTO_TYPE_CONSTDATA: - { - if (!(left >= sizeof(struct BProto_data_header_s))) { - return 0; - } - struct BProto_data_header_s val; - memcpy(&val, o->buf + pos, sizeof(val)); - pos += sizeof(struct BProto_data_header_s); - left -= sizeof(struct BProto_data_header_s); - - uint32_t payload_len = ltoh32(val.len); - if (!(left >= payload_len)) { - return 0; - } - pos += payload_len; - left -= payload_len; - - switch (id) { - case 1: - if (!(type == BPROTO_TYPE_DATA)) { - return 0; - } - if (o->addr_start == o->buf_len) { - o->addr_start = entry_pos; - } - o->addr_span = pos - o->addr_start; - addr_count++; - break; - case 2: - if (!(type == BPROTO_TYPE_DATA)) { - return 0; - } - if (o->key_start == o->buf_len) { - o->key_start = entry_pos; - } - o->key_span = pos - o->key_start; - key_count++; - break; - default: - return 0; - } - } break; - default: - return 0; - } - } - - if (!(addr_count >= 1)) { - return 0; - } - if (!(key_count <= 1)) { - return 0; - } - if (!(password_count <= 1)) { - return 0; - } - - return 1; -} - -int msg_youconnectParser_GotEverything (msg_youconnectParser *o) -{ - return ( - o->addr_pos == o->addr_span - && - o->key_pos == o->key_span - && - o->password_pos == o->password_span - ); -} - -int msg_youconnectParser_Getaddr (msg_youconnectParser *o, uint8_t **data, int *data_len) -{ - ASSERT(o->addr_pos >= 0) - ASSERT(o->addr_pos <= o->addr_span) - - int left = o->addr_span - o->addr_pos; - - while (left > 0) { - ASSERT(left >= sizeof(struct BProto_header_s)) - struct BProto_header_s header; - memcpy(&header, o->buf + o->addr_start + o->addr_pos, sizeof(header)); - o->addr_pos += sizeof(struct BProto_header_s); - left -= sizeof(struct BProto_header_s); - uint16_t type = ltoh16(header.type); - uint16_t id = ltoh16(header.id); - - switch (type) { - case BPROTO_TYPE_UINT8: { - ASSERT(left >= sizeof(struct BProto_uint8_s)) - o->addr_pos += sizeof(struct BProto_uint8_s); - left -= sizeof(struct BProto_uint8_s); - } break; - case BPROTO_TYPE_UINT16: { - ASSERT(left >= sizeof(struct BProto_uint16_s)) - o->addr_pos += sizeof(struct BProto_uint16_s); - left -= sizeof(struct BProto_uint16_s); - } break; - case BPROTO_TYPE_UINT32: { - ASSERT(left >= sizeof(struct BProto_uint32_s)) - o->addr_pos += sizeof(struct BProto_uint32_s); - left -= sizeof(struct BProto_uint32_s); - } break; - case BPROTO_TYPE_UINT64: { - ASSERT(left >= sizeof(struct BProto_uint64_s)) - o->addr_pos += sizeof(struct BProto_uint64_s); - left -= sizeof(struct BProto_uint64_s); - } break; - case BPROTO_TYPE_DATA: - case BPROTO_TYPE_CONSTDATA: - { - ASSERT(left >= sizeof(struct BProto_data_header_s)) - struct BProto_data_header_s val; - memcpy(&val, o->buf + o->addr_start + o->addr_pos, sizeof(val)); - o->addr_pos += sizeof(struct BProto_data_header_s); - left -= sizeof(struct BProto_data_header_s); - - uint32_t payload_len = ltoh32(val.len); - ASSERT(left >= payload_len) - uint8_t *payload = o->buf + o->addr_start + o->addr_pos; - o->addr_pos += payload_len; - left -= payload_len; - - if (type == BPROTO_TYPE_DATA && id == 1) { - *data = payload; - *data_len = payload_len; - return 1; - } - } break; - default: - ASSERT(0); - } - } - - return 0; -} - -void msg_youconnectParser_Resetaddr (msg_youconnectParser *o) -{ - o->addr_pos = 0; -} - -void msg_youconnectParser_Forwardaddr (msg_youconnectParser *o) -{ - o->addr_pos = o->addr_span; -} - -int msg_youconnectParser_Getkey (msg_youconnectParser *o, uint8_t **data, int *data_len) -{ - ASSERT(o->key_pos >= 0) - ASSERT(o->key_pos <= o->key_span) - - int left = o->key_span - o->key_pos; - - while (left > 0) { - ASSERT(left >= sizeof(struct BProto_header_s)) - struct BProto_header_s header; - memcpy(&header, o->buf + o->key_start + o->key_pos, sizeof(header)); - o->key_pos += sizeof(struct BProto_header_s); - left -= sizeof(struct BProto_header_s); - uint16_t type = ltoh16(header.type); - uint16_t id = ltoh16(header.id); - - switch (type) { - case BPROTO_TYPE_UINT8: { - ASSERT(left >= sizeof(struct BProto_uint8_s)) - o->key_pos += sizeof(struct BProto_uint8_s); - left -= sizeof(struct BProto_uint8_s); - } break; - case BPROTO_TYPE_UINT16: { - ASSERT(left >= sizeof(struct BProto_uint16_s)) - o->key_pos += sizeof(struct BProto_uint16_s); - left -= sizeof(struct BProto_uint16_s); - } break; - case BPROTO_TYPE_UINT32: { - ASSERT(left >= sizeof(struct BProto_uint32_s)) - o->key_pos += sizeof(struct BProto_uint32_s); - left -= sizeof(struct BProto_uint32_s); - } break; - case BPROTO_TYPE_UINT64: { - ASSERT(left >= sizeof(struct BProto_uint64_s)) - o->key_pos += sizeof(struct BProto_uint64_s); - left -= sizeof(struct BProto_uint64_s); - } break; - case BPROTO_TYPE_DATA: - case BPROTO_TYPE_CONSTDATA: - { - ASSERT(left >= sizeof(struct BProto_data_header_s)) - struct BProto_data_header_s val; - memcpy(&val, o->buf + o->key_start + o->key_pos, sizeof(val)); - o->key_pos += sizeof(struct BProto_data_header_s); - left -= sizeof(struct BProto_data_header_s); - - uint32_t payload_len = ltoh32(val.len); - ASSERT(left >= payload_len) - uint8_t *payload = o->buf + o->key_start + o->key_pos; - o->key_pos += payload_len; - left -= payload_len; - - if (type == BPROTO_TYPE_DATA && id == 2) { - *data = payload; - *data_len = payload_len; - return 1; - } - } break; - default: - ASSERT(0); - } - } - - return 0; -} - -void msg_youconnectParser_Resetkey (msg_youconnectParser *o) -{ - o->key_pos = 0; -} - -void msg_youconnectParser_Forwardkey (msg_youconnectParser *o) -{ - o->key_pos = o->key_span; -} - -int msg_youconnectParser_Getpassword (msg_youconnectParser *o, uint64_t *v) -{ - ASSERT(o->password_pos >= 0) - ASSERT(o->password_pos <= o->password_span) - - int left = o->password_span - o->password_pos; - - while (left > 0) { - ASSERT(left >= sizeof(struct BProto_header_s)) - struct BProto_header_s header; - memcpy(&header, o->buf + o->password_start + o->password_pos, sizeof(header)); - o->password_pos += sizeof(struct BProto_header_s); - left -= sizeof(struct BProto_header_s); - uint16_t type = ltoh16(header.type); - uint16_t id = ltoh16(header.id); - - switch (type) { - case BPROTO_TYPE_UINT8: { - ASSERT(left >= sizeof(struct BProto_uint8_s)) - o->password_pos += sizeof(struct BProto_uint8_s); - left -= sizeof(struct BProto_uint8_s); - } break; - case BPROTO_TYPE_UINT16: { - ASSERT(left >= sizeof(struct BProto_uint16_s)) - o->password_pos += sizeof(struct BProto_uint16_s); - left -= sizeof(struct BProto_uint16_s); - } break; - case BPROTO_TYPE_UINT32: { - ASSERT(left >= sizeof(struct BProto_uint32_s)) - o->password_pos += sizeof(struct BProto_uint32_s); - left -= sizeof(struct BProto_uint32_s); - } break; - case BPROTO_TYPE_UINT64: { - ASSERT(left >= sizeof(struct BProto_uint64_s)) - struct BProto_uint64_s val; - memcpy(&val, o->buf + o->password_start + o->password_pos, sizeof(val)); - o->password_pos += sizeof(struct BProto_uint64_s); - left -= sizeof(struct BProto_uint64_s); - - if (id == 3) { - *v = ltoh64(val.v); - return 1; - } - } break; - case BPROTO_TYPE_DATA: - case BPROTO_TYPE_CONSTDATA: - { - ASSERT(left >= sizeof(struct BProto_data_header_s)) - struct BProto_data_header_s val; - memcpy(&val, o->buf + o->password_start + o->password_pos, sizeof(val)); - o->password_pos += sizeof(struct BProto_data_header_s); - left -= sizeof(struct BProto_data_header_s); - - uint32_t payload_len = ltoh32(val.len); - ASSERT(left >= payload_len) - o->password_pos += payload_len; - left -= payload_len; - } break; - default: - ASSERT(0); - } - } - - return 0; -} - -void msg_youconnectParser_Resetpassword (msg_youconnectParser *o) -{ - o->password_pos = 0; -} - -void msg_youconnectParser_Forwardpassword (msg_youconnectParser *o) -{ - o->password_pos = o->password_span; -} - -#define msg_youconnect_addr_SIZEname(_len) (sizeof(struct BProto_header_s) + sizeof(struct BProto_data_header_s) + (_len)) -#define msg_youconnect_addr_SIZEaddr(_len) (sizeof(struct BProto_header_s) + sizeof(struct BProto_data_header_s) + (_len)) - -typedef struct { - uint8_t *out; - int used; - int name_count; - int addr_count; -} msg_youconnect_addrWriter; - -static void msg_youconnect_addrWriter_Init (msg_youconnect_addrWriter *o, uint8_t *out); -static int msg_youconnect_addrWriter_Finish (msg_youconnect_addrWriter *o); -static uint8_t * msg_youconnect_addrWriter_Addname (msg_youconnect_addrWriter *o, int len); -static uint8_t * msg_youconnect_addrWriter_Addaddr (msg_youconnect_addrWriter *o, int len); - -typedef struct { - uint8_t *buf; - int buf_len; - int name_start; - int name_span; - int name_pos; - int addr_start; - int addr_span; - int addr_pos; -} msg_youconnect_addrParser; - -static int msg_youconnect_addrParser_Init (msg_youconnect_addrParser *o, uint8_t *buf, int buf_len); -static int msg_youconnect_addrParser_GotEverything (msg_youconnect_addrParser *o); -static int msg_youconnect_addrParser_Getname (msg_youconnect_addrParser *o, uint8_t **data, int *data_len); -static void msg_youconnect_addrParser_Resetname (msg_youconnect_addrParser *o); -static void msg_youconnect_addrParser_Forwardname (msg_youconnect_addrParser *o); -static int msg_youconnect_addrParser_Getaddr (msg_youconnect_addrParser *o, uint8_t **data, int *data_len); -static void msg_youconnect_addrParser_Resetaddr (msg_youconnect_addrParser *o); -static void msg_youconnect_addrParser_Forwardaddr (msg_youconnect_addrParser *o); - -void msg_youconnect_addrWriter_Init (msg_youconnect_addrWriter *o, uint8_t *out) -{ - o->out = out; - o->used = 0; - o->name_count = 0; - o->addr_count = 0; -} - -int msg_youconnect_addrWriter_Finish (msg_youconnect_addrWriter *o) -{ - ASSERT(o->used >= 0) - ASSERT(o->name_count == 1) - ASSERT(o->addr_count == 1) - - return o->used; -} - -uint8_t * msg_youconnect_addrWriter_Addname (msg_youconnect_addrWriter *o, int len) -{ - ASSERT(o->used >= 0) - ASSERT(o->name_count == 0) - ASSERT(len >= 0 && len <= UINT32_MAX) - - struct BProto_header_s header; - header.id = htol16(1); - header.type = htol16(BPROTO_TYPE_DATA); - memcpy(o->out + o->used, &header, sizeof(header)); - o->used += sizeof(struct BProto_header_s); - - struct BProto_data_header_s data; - data.len = htol32(len); - memcpy(o->out + o->used, &data, sizeof(data)); - o->used += sizeof(struct BProto_data_header_s); - - uint8_t *dest = (o->out + o->used); - o->used += len; - - o->name_count++; - - return dest; -} - -uint8_t * msg_youconnect_addrWriter_Addaddr (msg_youconnect_addrWriter *o, int len) -{ - ASSERT(o->used >= 0) - ASSERT(o->addr_count == 0) - ASSERT(len >= 0 && len <= UINT32_MAX) - - struct BProto_header_s header; - header.id = htol16(2); - header.type = htol16(BPROTO_TYPE_DATA); - memcpy(o->out + o->used, &header, sizeof(header)); - o->used += sizeof(struct BProto_header_s); - - struct BProto_data_header_s data; - data.len = htol32(len); - memcpy(o->out + o->used, &data, sizeof(data)); - o->used += sizeof(struct BProto_data_header_s); - - uint8_t *dest = (o->out + o->used); - o->used += len; - - o->addr_count++; - - return dest; -} - -int msg_youconnect_addrParser_Init (msg_youconnect_addrParser *o, uint8_t *buf, int buf_len) -{ - ASSERT(buf_len >= 0) - - o->buf = buf; - o->buf_len = buf_len; - o->name_start = o->buf_len; - o->name_span = 0; - o->name_pos = 0; - o->addr_start = o->buf_len; - o->addr_span = 0; - o->addr_pos = 0; - - int name_count = 0; - int addr_count = 0; - - int pos = 0; - int left = o->buf_len; - - while (left > 0) { - int entry_pos = pos; - - if (!(left >= sizeof(struct BProto_header_s))) { - return 0; - } - struct BProto_header_s header; - memcpy(&header, o->buf + pos, sizeof(header)); - pos += sizeof(struct BProto_header_s); - left -= sizeof(struct BProto_header_s); - uint16_t type = ltoh16(header.type); - uint16_t id = ltoh16(header.id); - - switch (type) { - case BPROTO_TYPE_UINT8: { - if (!(left >= sizeof(struct BProto_uint8_s))) { - return 0; - } - pos += sizeof(struct BProto_uint8_s); - left -= sizeof(struct BProto_uint8_s); - - switch (id) { - default: - return 0; - } - } break; - case BPROTO_TYPE_UINT16: { - if (!(left >= sizeof(struct BProto_uint16_s))) { - return 0; - } - pos += sizeof(struct BProto_uint16_s); - left -= sizeof(struct BProto_uint16_s); - - switch (id) { - default: - return 0; - } - } break; - case BPROTO_TYPE_UINT32: { - if (!(left >= sizeof(struct BProto_uint32_s))) { - return 0; - } - pos += sizeof(struct BProto_uint32_s); - left -= sizeof(struct BProto_uint32_s); - - switch (id) { - default: - return 0; - } - } break; - case BPROTO_TYPE_UINT64: { - if (!(left >= sizeof(struct BProto_uint64_s))) { - return 0; - } - pos += sizeof(struct BProto_uint64_s); - left -= sizeof(struct BProto_uint64_s); - - switch (id) { - default: - return 0; - } - } break; - case BPROTO_TYPE_DATA: - case BPROTO_TYPE_CONSTDATA: - { - if (!(left >= sizeof(struct BProto_data_header_s))) { - return 0; - } - struct BProto_data_header_s val; - memcpy(&val, o->buf + pos, sizeof(val)); - pos += sizeof(struct BProto_data_header_s); - left -= sizeof(struct BProto_data_header_s); - - uint32_t payload_len = ltoh32(val.len); - if (!(left >= payload_len)) { - return 0; - } - pos += payload_len; - left -= payload_len; - - switch (id) { - case 1: - if (!(type == BPROTO_TYPE_DATA)) { - return 0; - } - if (o->name_start == o->buf_len) { - o->name_start = entry_pos; - } - o->name_span = pos - o->name_start; - name_count++; - break; - case 2: - if (!(type == BPROTO_TYPE_DATA)) { - return 0; - } - if (o->addr_start == o->buf_len) { - o->addr_start = entry_pos; - } - o->addr_span = pos - o->addr_start; - addr_count++; - break; - default: - return 0; - } - } break; - default: - return 0; - } - } - - if (!(name_count == 1)) { - return 0; - } - if (!(addr_count == 1)) { - return 0; - } - - return 1; -} - -int msg_youconnect_addrParser_GotEverything (msg_youconnect_addrParser *o) -{ - return ( - o->name_pos == o->name_span - && - o->addr_pos == o->addr_span - ); -} - -int msg_youconnect_addrParser_Getname (msg_youconnect_addrParser *o, uint8_t **data, int *data_len) -{ - ASSERT(o->name_pos >= 0) - ASSERT(o->name_pos <= o->name_span) - - int left = o->name_span - o->name_pos; - - while (left > 0) { - ASSERT(left >= sizeof(struct BProto_header_s)) - struct BProto_header_s header; - memcpy(&header, o->buf + o->name_start + o->name_pos, sizeof(header)); - o->name_pos += sizeof(struct BProto_header_s); - left -= sizeof(struct BProto_header_s); - uint16_t type = ltoh16(header.type); - uint16_t id = ltoh16(header.id); - - switch (type) { - case BPROTO_TYPE_UINT8: { - ASSERT(left >= sizeof(struct BProto_uint8_s)) - o->name_pos += sizeof(struct BProto_uint8_s); - left -= sizeof(struct BProto_uint8_s); - } break; - case BPROTO_TYPE_UINT16: { - ASSERT(left >= sizeof(struct BProto_uint16_s)) - o->name_pos += sizeof(struct BProto_uint16_s); - left -= sizeof(struct BProto_uint16_s); - } break; - case BPROTO_TYPE_UINT32: { - ASSERT(left >= sizeof(struct BProto_uint32_s)) - o->name_pos += sizeof(struct BProto_uint32_s); - left -= sizeof(struct BProto_uint32_s); - } break; - case BPROTO_TYPE_UINT64: { - ASSERT(left >= sizeof(struct BProto_uint64_s)) - o->name_pos += sizeof(struct BProto_uint64_s); - left -= sizeof(struct BProto_uint64_s); - } break; - case BPROTO_TYPE_DATA: - case BPROTO_TYPE_CONSTDATA: - { - ASSERT(left >= sizeof(struct BProto_data_header_s)) - struct BProto_data_header_s val; - memcpy(&val, o->buf + o->name_start + o->name_pos, sizeof(val)); - o->name_pos += sizeof(struct BProto_data_header_s); - left -= sizeof(struct BProto_data_header_s); - - uint32_t payload_len = ltoh32(val.len); - ASSERT(left >= payload_len) - uint8_t *payload = o->buf + o->name_start + o->name_pos; - o->name_pos += payload_len; - left -= payload_len; - - if (type == BPROTO_TYPE_DATA && id == 1) { - *data = payload; - *data_len = payload_len; - return 1; - } - } break; - default: - ASSERT(0); - } - } - - return 0; -} - -void msg_youconnect_addrParser_Resetname (msg_youconnect_addrParser *o) -{ - o->name_pos = 0; -} - -void msg_youconnect_addrParser_Forwardname (msg_youconnect_addrParser *o) -{ - o->name_pos = o->name_span; -} - -int msg_youconnect_addrParser_Getaddr (msg_youconnect_addrParser *o, uint8_t **data, int *data_len) -{ - ASSERT(o->addr_pos >= 0) - ASSERT(o->addr_pos <= o->addr_span) - - int left = o->addr_span - o->addr_pos; - - while (left > 0) { - ASSERT(left >= sizeof(struct BProto_header_s)) - struct BProto_header_s header; - memcpy(&header, o->buf + o->addr_start + o->addr_pos, sizeof(header)); - o->addr_pos += sizeof(struct BProto_header_s); - left -= sizeof(struct BProto_header_s); - uint16_t type = ltoh16(header.type); - uint16_t id = ltoh16(header.id); - - switch (type) { - case BPROTO_TYPE_UINT8: { - ASSERT(left >= sizeof(struct BProto_uint8_s)) - o->addr_pos += sizeof(struct BProto_uint8_s); - left -= sizeof(struct BProto_uint8_s); - } break; - case BPROTO_TYPE_UINT16: { - ASSERT(left >= sizeof(struct BProto_uint16_s)) - o->addr_pos += sizeof(struct BProto_uint16_s); - left -= sizeof(struct BProto_uint16_s); - } break; - case BPROTO_TYPE_UINT32: { - ASSERT(left >= sizeof(struct BProto_uint32_s)) - o->addr_pos += sizeof(struct BProto_uint32_s); - left -= sizeof(struct BProto_uint32_s); - } break; - case BPROTO_TYPE_UINT64: { - ASSERT(left >= sizeof(struct BProto_uint64_s)) - o->addr_pos += sizeof(struct BProto_uint64_s); - left -= sizeof(struct BProto_uint64_s); - } break; - case BPROTO_TYPE_DATA: - case BPROTO_TYPE_CONSTDATA: - { - ASSERT(left >= sizeof(struct BProto_data_header_s)) - struct BProto_data_header_s val; - memcpy(&val, o->buf + o->addr_start + o->addr_pos, sizeof(val)); - o->addr_pos += sizeof(struct BProto_data_header_s); - left -= sizeof(struct BProto_data_header_s); - - uint32_t payload_len = ltoh32(val.len); - ASSERT(left >= payload_len) - uint8_t *payload = o->buf + o->addr_start + o->addr_pos; - o->addr_pos += payload_len; - left -= payload_len; - - if (type == BPROTO_TYPE_DATA && id == 2) { - *data = payload; - *data_len = payload_len; - return 1; - } - } break; - default: - ASSERT(0); - } - } - - return 0; -} - -void msg_youconnect_addrParser_Resetaddr (msg_youconnect_addrParser *o) -{ - o->addr_pos = 0; -} - -void msg_youconnect_addrParser_Forwardaddr (msg_youconnect_addrParser *o) -{ - o->addr_pos = o->addr_span; -} - -#define msg_seed_SIZEseed_id (sizeof(struct BProto_header_s) + sizeof(struct BProto_uint16_s)) -#define msg_seed_SIZEkey(_len) (sizeof(struct BProto_header_s) + sizeof(struct BProto_data_header_s) + (_len)) -#define msg_seed_SIZEiv(_len) (sizeof(struct BProto_header_s) + sizeof(struct BProto_data_header_s) + (_len)) - -typedef struct { - uint8_t *out; - int used; - int seed_id_count; - int key_count; - int iv_count; -} msg_seedWriter; - -static void msg_seedWriter_Init (msg_seedWriter *o, uint8_t *out); -static int msg_seedWriter_Finish (msg_seedWriter *o); -static void msg_seedWriter_Addseed_id (msg_seedWriter *o, uint16_t v); -static uint8_t * msg_seedWriter_Addkey (msg_seedWriter *o, int len); -static uint8_t * msg_seedWriter_Addiv (msg_seedWriter *o, int len); - -typedef struct { - uint8_t *buf; - int buf_len; - int seed_id_start; - int seed_id_span; - int seed_id_pos; - int key_start; - int key_span; - int key_pos; - int iv_start; - int iv_span; - int iv_pos; -} msg_seedParser; - -static int msg_seedParser_Init (msg_seedParser *o, uint8_t *buf, int buf_len); -static int msg_seedParser_GotEverything (msg_seedParser *o); -static int msg_seedParser_Getseed_id (msg_seedParser *o, uint16_t *v); -static void msg_seedParser_Resetseed_id (msg_seedParser *o); -static void msg_seedParser_Forwardseed_id (msg_seedParser *o); -static int msg_seedParser_Getkey (msg_seedParser *o, uint8_t **data, int *data_len); -static void msg_seedParser_Resetkey (msg_seedParser *o); -static void msg_seedParser_Forwardkey (msg_seedParser *o); -static int msg_seedParser_Getiv (msg_seedParser *o, uint8_t **data, int *data_len); -static void msg_seedParser_Resetiv (msg_seedParser *o); -static void msg_seedParser_Forwardiv (msg_seedParser *o); - -void msg_seedWriter_Init (msg_seedWriter *o, uint8_t *out) -{ - o->out = out; - o->used = 0; - o->seed_id_count = 0; - o->key_count = 0; - o->iv_count = 0; -} - -int msg_seedWriter_Finish (msg_seedWriter *o) -{ - ASSERT(o->used >= 0) - ASSERT(o->seed_id_count == 1) - ASSERT(o->key_count == 1) - ASSERT(o->iv_count == 1) - - return o->used; -} - -void msg_seedWriter_Addseed_id (msg_seedWriter *o, uint16_t v) -{ - ASSERT(o->used >= 0) - ASSERT(o->seed_id_count == 0) - - - struct BProto_header_s header; - header.id = htol16(1); - header.type = htol16(BPROTO_TYPE_UINT16); - memcpy(o->out + o->used, &header, sizeof(header)); - o->used += sizeof(struct BProto_header_s); - - struct BProto_uint16_s data; - data.v = htol16(v); - memcpy(o->out + o->used, &data, sizeof(data)); - o->used += sizeof(struct BProto_uint16_s); - - o->seed_id_count++; -} - -uint8_t * msg_seedWriter_Addkey (msg_seedWriter *o, int len) -{ - ASSERT(o->used >= 0) - ASSERT(o->key_count == 0) - ASSERT(len >= 0 && len <= UINT32_MAX) - - struct BProto_header_s header; - header.id = htol16(2); - header.type = htol16(BPROTO_TYPE_DATA); - memcpy(o->out + o->used, &header, sizeof(header)); - o->used += sizeof(struct BProto_header_s); - - struct BProto_data_header_s data; - data.len = htol32(len); - memcpy(o->out + o->used, &data, sizeof(data)); - o->used += sizeof(struct BProto_data_header_s); - - uint8_t *dest = (o->out + o->used); - o->used += len; - - o->key_count++; - - return dest; -} - -uint8_t * msg_seedWriter_Addiv (msg_seedWriter *o, int len) -{ - ASSERT(o->used >= 0) - ASSERT(o->iv_count == 0) - ASSERT(len >= 0 && len <= UINT32_MAX) - - struct BProto_header_s header; - header.id = htol16(3); - header.type = htol16(BPROTO_TYPE_DATA); - memcpy(o->out + o->used, &header, sizeof(header)); - o->used += sizeof(struct BProto_header_s); - - struct BProto_data_header_s data; - data.len = htol32(len); - memcpy(o->out + o->used, &data, sizeof(data)); - o->used += sizeof(struct BProto_data_header_s); - - uint8_t *dest = (o->out + o->used); - o->used += len; - - o->iv_count++; - - return dest; -} - -int msg_seedParser_Init (msg_seedParser *o, uint8_t *buf, int buf_len) -{ - ASSERT(buf_len >= 0) - - o->buf = buf; - o->buf_len = buf_len; - o->seed_id_start = o->buf_len; - o->seed_id_span = 0; - o->seed_id_pos = 0; - o->key_start = o->buf_len; - o->key_span = 0; - o->key_pos = 0; - o->iv_start = o->buf_len; - o->iv_span = 0; - o->iv_pos = 0; - - int seed_id_count = 0; - int key_count = 0; - int iv_count = 0; - - int pos = 0; - int left = o->buf_len; - - while (left > 0) { - int entry_pos = pos; - - if (!(left >= sizeof(struct BProto_header_s))) { - return 0; - } - struct BProto_header_s header; - memcpy(&header, o->buf + pos, sizeof(header)); - pos += sizeof(struct BProto_header_s); - left -= sizeof(struct BProto_header_s); - uint16_t type = ltoh16(header.type); - uint16_t id = ltoh16(header.id); - - switch (type) { - case BPROTO_TYPE_UINT8: { - if (!(left >= sizeof(struct BProto_uint8_s))) { - return 0; - } - pos += sizeof(struct BProto_uint8_s); - left -= sizeof(struct BProto_uint8_s); - - switch (id) { - default: - return 0; - } - } break; - case BPROTO_TYPE_UINT16: { - if (!(left >= sizeof(struct BProto_uint16_s))) { - return 0; - } - pos += sizeof(struct BProto_uint16_s); - left -= sizeof(struct BProto_uint16_s); - - switch (id) { - case 1: - if (o->seed_id_start == o->buf_len) { - o->seed_id_start = entry_pos; - } - o->seed_id_span = pos - o->seed_id_start; - seed_id_count++; - break; - default: - return 0; - } - } break; - case BPROTO_TYPE_UINT32: { - if (!(left >= sizeof(struct BProto_uint32_s))) { - return 0; - } - pos += sizeof(struct BProto_uint32_s); - left -= sizeof(struct BProto_uint32_s); - - switch (id) { - default: - return 0; - } - } break; - case BPROTO_TYPE_UINT64: { - if (!(left >= sizeof(struct BProto_uint64_s))) { - return 0; - } - pos += sizeof(struct BProto_uint64_s); - left -= sizeof(struct BProto_uint64_s); - - switch (id) { - default: - return 0; - } - } break; - case BPROTO_TYPE_DATA: - case BPROTO_TYPE_CONSTDATA: - { - if (!(left >= sizeof(struct BProto_data_header_s))) { - return 0; - } - struct BProto_data_header_s val; - memcpy(&val, o->buf + pos, sizeof(val)); - pos += sizeof(struct BProto_data_header_s); - left -= sizeof(struct BProto_data_header_s); - - uint32_t payload_len = ltoh32(val.len); - if (!(left >= payload_len)) { - return 0; - } - pos += payload_len; - left -= payload_len; - - switch (id) { - case 2: - if (!(type == BPROTO_TYPE_DATA)) { - return 0; - } - if (o->key_start == o->buf_len) { - o->key_start = entry_pos; - } - o->key_span = pos - o->key_start; - key_count++; - break; - case 3: - if (!(type == BPROTO_TYPE_DATA)) { - return 0; - } - if (o->iv_start == o->buf_len) { - o->iv_start = entry_pos; - } - o->iv_span = pos - o->iv_start; - iv_count++; - break; - default: - return 0; - } - } break; - default: - return 0; - } - } - - if (!(seed_id_count == 1)) { - return 0; - } - if (!(key_count == 1)) { - return 0; - } - if (!(iv_count == 1)) { - return 0; - } - - return 1; -} - -int msg_seedParser_GotEverything (msg_seedParser *o) -{ - return ( - o->seed_id_pos == o->seed_id_span - && - o->key_pos == o->key_span - && - o->iv_pos == o->iv_span - ); -} - -int msg_seedParser_Getseed_id (msg_seedParser *o, uint16_t *v) -{ - ASSERT(o->seed_id_pos >= 0) - ASSERT(o->seed_id_pos <= o->seed_id_span) - - int left = o->seed_id_span - o->seed_id_pos; - - while (left > 0) { - ASSERT(left >= sizeof(struct BProto_header_s)) - struct BProto_header_s header; - memcpy(&header, o->buf + o->seed_id_start + o->seed_id_pos, sizeof(header)); - o->seed_id_pos += sizeof(struct BProto_header_s); - left -= sizeof(struct BProto_header_s); - uint16_t type = ltoh16(header.type); - uint16_t id = ltoh16(header.id); - - switch (type) { - case BPROTO_TYPE_UINT8: { - ASSERT(left >= sizeof(struct BProto_uint8_s)) - o->seed_id_pos += sizeof(struct BProto_uint8_s); - left -= sizeof(struct BProto_uint8_s); - } break; - case BPROTO_TYPE_UINT16: { - ASSERT(left >= sizeof(struct BProto_uint16_s)) - struct BProto_uint16_s val; - memcpy(&val, o->buf + o->seed_id_start + o->seed_id_pos, sizeof(val)); - o->seed_id_pos += sizeof(struct BProto_uint16_s); - left -= sizeof(struct BProto_uint16_s); - - if (id == 1) { - *v = ltoh16(val.v); - return 1; - } - } break; - case BPROTO_TYPE_UINT32: { - ASSERT(left >= sizeof(struct BProto_uint32_s)) - o->seed_id_pos += sizeof(struct BProto_uint32_s); - left -= sizeof(struct BProto_uint32_s); - } break; - case BPROTO_TYPE_UINT64: { - ASSERT(left >= sizeof(struct BProto_uint64_s)) - o->seed_id_pos += sizeof(struct BProto_uint64_s); - left -= sizeof(struct BProto_uint64_s); - } break; - case BPROTO_TYPE_DATA: - case BPROTO_TYPE_CONSTDATA: - { - ASSERT(left >= sizeof(struct BProto_data_header_s)) - struct BProto_data_header_s val; - memcpy(&val, o->buf + o->seed_id_start + o->seed_id_pos, sizeof(val)); - o->seed_id_pos += sizeof(struct BProto_data_header_s); - left -= sizeof(struct BProto_data_header_s); - - uint32_t payload_len = ltoh32(val.len); - ASSERT(left >= payload_len) - o->seed_id_pos += payload_len; - left -= payload_len; - } break; - default: - ASSERT(0); - } - } - - return 0; -} - -void msg_seedParser_Resetseed_id (msg_seedParser *o) -{ - o->seed_id_pos = 0; -} - -void msg_seedParser_Forwardseed_id (msg_seedParser *o) -{ - o->seed_id_pos = o->seed_id_span; -} - -int msg_seedParser_Getkey (msg_seedParser *o, uint8_t **data, int *data_len) -{ - ASSERT(o->key_pos >= 0) - ASSERT(o->key_pos <= o->key_span) - - int left = o->key_span - o->key_pos; - - while (left > 0) { - ASSERT(left >= sizeof(struct BProto_header_s)) - struct BProto_header_s header; - memcpy(&header, o->buf + o->key_start + o->key_pos, sizeof(header)); - o->key_pos += sizeof(struct BProto_header_s); - left -= sizeof(struct BProto_header_s); - uint16_t type = ltoh16(header.type); - uint16_t id = ltoh16(header.id); - - switch (type) { - case BPROTO_TYPE_UINT8: { - ASSERT(left >= sizeof(struct BProto_uint8_s)) - o->key_pos += sizeof(struct BProto_uint8_s); - left -= sizeof(struct BProto_uint8_s); - } break; - case BPROTO_TYPE_UINT16: { - ASSERT(left >= sizeof(struct BProto_uint16_s)) - o->key_pos += sizeof(struct BProto_uint16_s); - left -= sizeof(struct BProto_uint16_s); - } break; - case BPROTO_TYPE_UINT32: { - ASSERT(left >= sizeof(struct BProto_uint32_s)) - o->key_pos += sizeof(struct BProto_uint32_s); - left -= sizeof(struct BProto_uint32_s); - } break; - case BPROTO_TYPE_UINT64: { - ASSERT(left >= sizeof(struct BProto_uint64_s)) - o->key_pos += sizeof(struct BProto_uint64_s); - left -= sizeof(struct BProto_uint64_s); - } break; - case BPROTO_TYPE_DATA: - case BPROTO_TYPE_CONSTDATA: - { - ASSERT(left >= sizeof(struct BProto_data_header_s)) - struct BProto_data_header_s val; - memcpy(&val, o->buf + o->key_start + o->key_pos, sizeof(val)); - o->key_pos += sizeof(struct BProto_data_header_s); - left -= sizeof(struct BProto_data_header_s); - - uint32_t payload_len = ltoh32(val.len); - ASSERT(left >= payload_len) - uint8_t *payload = o->buf + o->key_start + o->key_pos; - o->key_pos += payload_len; - left -= payload_len; - - if (type == BPROTO_TYPE_DATA && id == 2) { - *data = payload; - *data_len = payload_len; - return 1; - } - } break; - default: - ASSERT(0); - } - } - - return 0; -} - -void msg_seedParser_Resetkey (msg_seedParser *o) -{ - o->key_pos = 0; -} - -void msg_seedParser_Forwardkey (msg_seedParser *o) -{ - o->key_pos = o->key_span; -} - -int msg_seedParser_Getiv (msg_seedParser *o, uint8_t **data, int *data_len) -{ - ASSERT(o->iv_pos >= 0) - ASSERT(o->iv_pos <= o->iv_span) - - int left = o->iv_span - o->iv_pos; - - while (left > 0) { - ASSERT(left >= sizeof(struct BProto_header_s)) - struct BProto_header_s header; - memcpy(&header, o->buf + o->iv_start + o->iv_pos, sizeof(header)); - o->iv_pos += sizeof(struct BProto_header_s); - left -= sizeof(struct BProto_header_s); - uint16_t type = ltoh16(header.type); - uint16_t id = ltoh16(header.id); - - switch (type) { - case BPROTO_TYPE_UINT8: { - ASSERT(left >= sizeof(struct BProto_uint8_s)) - o->iv_pos += sizeof(struct BProto_uint8_s); - left -= sizeof(struct BProto_uint8_s); - } break; - case BPROTO_TYPE_UINT16: { - ASSERT(left >= sizeof(struct BProto_uint16_s)) - o->iv_pos += sizeof(struct BProto_uint16_s); - left -= sizeof(struct BProto_uint16_s); - } break; - case BPROTO_TYPE_UINT32: { - ASSERT(left >= sizeof(struct BProto_uint32_s)) - o->iv_pos += sizeof(struct BProto_uint32_s); - left -= sizeof(struct BProto_uint32_s); - } break; - case BPROTO_TYPE_UINT64: { - ASSERT(left >= sizeof(struct BProto_uint64_s)) - o->iv_pos += sizeof(struct BProto_uint64_s); - left -= sizeof(struct BProto_uint64_s); - } break; - case BPROTO_TYPE_DATA: - case BPROTO_TYPE_CONSTDATA: - { - ASSERT(left >= sizeof(struct BProto_data_header_s)) - struct BProto_data_header_s val; - memcpy(&val, o->buf + o->iv_start + o->iv_pos, sizeof(val)); - o->iv_pos += sizeof(struct BProto_data_header_s); - left -= sizeof(struct BProto_data_header_s); - - uint32_t payload_len = ltoh32(val.len); - ASSERT(left >= payload_len) - uint8_t *payload = o->buf + o->iv_start + o->iv_pos; - o->iv_pos += payload_len; - left -= payload_len; - - if (type == BPROTO_TYPE_DATA && id == 3) { - *data = payload; - *data_len = payload_len; - return 1; - } - } break; - default: - ASSERT(0); - } - } - - return 0; -} - -void msg_seedParser_Resetiv (msg_seedParser *o) -{ - o->iv_pos = 0; -} - -void msg_seedParser_Forwardiv (msg_seedParser *o) -{ - o->iv_pos = o->iv_span; -} - -#define msg_confirmseed_SIZEseed_id (sizeof(struct BProto_header_s) + sizeof(struct BProto_uint16_s)) - -typedef struct { - uint8_t *out; - int used; - int seed_id_count; -} msg_confirmseedWriter; - -static void msg_confirmseedWriter_Init (msg_confirmseedWriter *o, uint8_t *out); -static int msg_confirmseedWriter_Finish (msg_confirmseedWriter *o); -static void msg_confirmseedWriter_Addseed_id (msg_confirmseedWriter *o, uint16_t v); - -typedef struct { - uint8_t *buf; - int buf_len; - int seed_id_start; - int seed_id_span; - int seed_id_pos; -} msg_confirmseedParser; - -static int msg_confirmseedParser_Init (msg_confirmseedParser *o, uint8_t *buf, int buf_len); -static int msg_confirmseedParser_GotEverything (msg_confirmseedParser *o); -static int msg_confirmseedParser_Getseed_id (msg_confirmseedParser *o, uint16_t *v); -static void msg_confirmseedParser_Resetseed_id (msg_confirmseedParser *o); -static void msg_confirmseedParser_Forwardseed_id (msg_confirmseedParser *o); - -void msg_confirmseedWriter_Init (msg_confirmseedWriter *o, uint8_t *out) -{ - o->out = out; - o->used = 0; - o->seed_id_count = 0; -} - -int msg_confirmseedWriter_Finish (msg_confirmseedWriter *o) -{ - ASSERT(o->used >= 0) - ASSERT(o->seed_id_count == 1) - - return o->used; -} - -void msg_confirmseedWriter_Addseed_id (msg_confirmseedWriter *o, uint16_t v) -{ - ASSERT(o->used >= 0) - ASSERT(o->seed_id_count == 0) - - - struct BProto_header_s header; - header.id = htol16(1); - header.type = htol16(BPROTO_TYPE_UINT16); - memcpy(o->out + o->used, &header, sizeof(header)); - o->used += sizeof(struct BProto_header_s); - - struct BProto_uint16_s data; - data.v = htol16(v); - memcpy(o->out + o->used, &data, sizeof(data)); - o->used += sizeof(struct BProto_uint16_s); - - o->seed_id_count++; -} - -int msg_confirmseedParser_Init (msg_confirmseedParser *o, uint8_t *buf, int buf_len) -{ - ASSERT(buf_len >= 0) - - o->buf = buf; - o->buf_len = buf_len; - o->seed_id_start = o->buf_len; - o->seed_id_span = 0; - o->seed_id_pos = 0; - - int seed_id_count = 0; - - int pos = 0; - int left = o->buf_len; - - while (left > 0) { - int entry_pos = pos; - - if (!(left >= sizeof(struct BProto_header_s))) { - return 0; - } - struct BProto_header_s header; - memcpy(&header, o->buf + pos, sizeof(header)); - pos += sizeof(struct BProto_header_s); - left -= sizeof(struct BProto_header_s); - uint16_t type = ltoh16(header.type); - uint16_t id = ltoh16(header.id); - - switch (type) { - case BPROTO_TYPE_UINT8: { - if (!(left >= sizeof(struct BProto_uint8_s))) { - return 0; - } - pos += sizeof(struct BProto_uint8_s); - left -= sizeof(struct BProto_uint8_s); - - switch (id) { - default: - return 0; - } - } break; - case BPROTO_TYPE_UINT16: { - if (!(left >= sizeof(struct BProto_uint16_s))) { - return 0; - } - pos += sizeof(struct BProto_uint16_s); - left -= sizeof(struct BProto_uint16_s); - - switch (id) { - case 1: - if (o->seed_id_start == o->buf_len) { - o->seed_id_start = entry_pos; - } - o->seed_id_span = pos - o->seed_id_start; - seed_id_count++; - break; - default: - return 0; - } - } break; - case BPROTO_TYPE_UINT32: { - if (!(left >= sizeof(struct BProto_uint32_s))) { - return 0; - } - pos += sizeof(struct BProto_uint32_s); - left -= sizeof(struct BProto_uint32_s); - - switch (id) { - default: - return 0; - } - } break; - case BPROTO_TYPE_UINT64: { - if (!(left >= sizeof(struct BProto_uint64_s))) { - return 0; - } - pos += sizeof(struct BProto_uint64_s); - left -= sizeof(struct BProto_uint64_s); - - switch (id) { - default: - return 0; - } - } break; - case BPROTO_TYPE_DATA: - case BPROTO_TYPE_CONSTDATA: - { - if (!(left >= sizeof(struct BProto_data_header_s))) { - return 0; - } - struct BProto_data_header_s val; - memcpy(&val, o->buf + pos, sizeof(val)); - pos += sizeof(struct BProto_data_header_s); - left -= sizeof(struct BProto_data_header_s); - - uint32_t payload_len = ltoh32(val.len); - if (!(left >= payload_len)) { - return 0; - } - pos += payload_len; - left -= payload_len; - - switch (id) { - default: - return 0; - } - } break; - default: - return 0; - } - } - - if (!(seed_id_count == 1)) { - return 0; - } - - return 1; -} - -int msg_confirmseedParser_GotEverything (msg_confirmseedParser *o) -{ - return ( - o->seed_id_pos == o->seed_id_span - ); -} - -int msg_confirmseedParser_Getseed_id (msg_confirmseedParser *o, uint16_t *v) -{ - ASSERT(o->seed_id_pos >= 0) - ASSERT(o->seed_id_pos <= o->seed_id_span) - - int left = o->seed_id_span - o->seed_id_pos; - - while (left > 0) { - ASSERT(left >= sizeof(struct BProto_header_s)) - struct BProto_header_s header; - memcpy(&header, o->buf + o->seed_id_start + o->seed_id_pos, sizeof(header)); - o->seed_id_pos += sizeof(struct BProto_header_s); - left -= sizeof(struct BProto_header_s); - uint16_t type = ltoh16(header.type); - uint16_t id = ltoh16(header.id); - - switch (type) { - case BPROTO_TYPE_UINT8: { - ASSERT(left >= sizeof(struct BProto_uint8_s)) - o->seed_id_pos += sizeof(struct BProto_uint8_s); - left -= sizeof(struct BProto_uint8_s); - } break; - case BPROTO_TYPE_UINT16: { - ASSERT(left >= sizeof(struct BProto_uint16_s)) - struct BProto_uint16_s val; - memcpy(&val, o->buf + o->seed_id_start + o->seed_id_pos, sizeof(val)); - o->seed_id_pos += sizeof(struct BProto_uint16_s); - left -= sizeof(struct BProto_uint16_s); - - if (id == 1) { - *v = ltoh16(val.v); - return 1; - } - } break; - case BPROTO_TYPE_UINT32: { - ASSERT(left >= sizeof(struct BProto_uint32_s)) - o->seed_id_pos += sizeof(struct BProto_uint32_s); - left -= sizeof(struct BProto_uint32_s); - } break; - case BPROTO_TYPE_UINT64: { - ASSERT(left >= sizeof(struct BProto_uint64_s)) - o->seed_id_pos += sizeof(struct BProto_uint64_s); - left -= sizeof(struct BProto_uint64_s); - } break; - case BPROTO_TYPE_DATA: - case BPROTO_TYPE_CONSTDATA: - { - ASSERT(left >= sizeof(struct BProto_data_header_s)) - struct BProto_data_header_s val; - memcpy(&val, o->buf + o->seed_id_start + o->seed_id_pos, sizeof(val)); - o->seed_id_pos += sizeof(struct BProto_data_header_s); - left -= sizeof(struct BProto_data_header_s); - - uint32_t payload_len = ltoh32(val.len); - ASSERT(left >= payload_len) - o->seed_id_pos += payload_len; - left -= payload_len; - } break; - default: - ASSERT(0); - } - } - - return 0; -} - -void msg_confirmseedParser_Resetseed_id (msg_confirmseedParser *o) -{ - o->seed_id_pos = 0; -} - -void msg_confirmseedParser_Forwardseed_id (msg_confirmseedParser *o) -{ - o->seed_id_pos = o->seed_id_span; -} - diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/custom/arch/cc.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/custom/arch/cc.h deleted file mode 100644 index a917779a..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/custom/arch/cc.h +++ /dev/null @@ -1,92 +0,0 @@ -/** - * @file cc.h - * @author Ambroz Bizjak - * - * @section LICENSE - * - * 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 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE 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. - */ - -#ifndef LWIP_CUSTOM_CC_H -#define LWIP_CUSTOM_CC_H - -#include -#include -#include -#include - -#include "misc/debug.h" -#include "misc/byteorder.h" -#include "misc/packed.h" -#include "misc/print_macros.h" -#include "misc/byteorder.h" -#include "base/BLog.h" - -#define u8_t uint8_t -#define s8_t int8_t -#define u16_t uint16_t -#define s16_t int16_t -#define u32_t uint32_t -#define s32_t int32_t -#define mem_ptr_t uintptr_t - -#define PACK_STRUCT_BEGIN B_START_PACKED -#define PACK_STRUCT_END B_END_PACKED -#define PACK_STRUCT_STRUCT B_PACKED - -#define LWIP_PLATFORM_DIAG(x) { if (BLog_WouldLog(BLOG_CHANNEL_lwip, BLOG_INFO)) { BLog_Begin(); BLog_Append x; BLog_Finish(BLOG_CHANNEL_lwip, BLOG_INFO); } } -#define LWIP_PLATFORM_ASSERT(x) { fprintf(stderr, "%s: lwip assertion failure: %s\n", __FUNCTION__, (x)); abort(); } - -#define U16_F PRIu16 -#define S16_F PRId16 -#define X16_F PRIx16 -#define U32_F PRIu32 -#define S32_F PRId32 -#define X32_F PRIx32 -#define SZT_F "zu" - -#define LWIP_PLATFORM_BYTESWAP 1 -#define LWIP_PLATFORM_HTONS(x) hton16(x) -#define LWIP_PLATFORM_HTONL(x) hton32(x) - -#define LWIP_RAND() ( \ - (((uint32_t)(rand() & 0xFF)) << 24) | \ - (((uint32_t)(rand() & 0xFF)) << 16) | \ - (((uint32_t)(rand() & 0xFF)) << 8) | \ - (((uint32_t)(rand() & 0xFF)) << 0) \ -) - -// for BYTE_ORDER -#if defined(BADVPN_FREEBSD) - #include -#else - #define LITTLE_ENDIAN 1234 - #define BIG_ENDIAN 4321 - #if defined(BADVPN_LITTLE_ENDIAN) - #define BYTE_ORDER LITTLE_ENDIAN - #else - #define BYTE_ORDER BIG_ENDIAN - #endif -#endif - -#endif diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/custom/arch/perf.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/custom/arch/perf.h deleted file mode 100644 index 09c9d47d..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/custom/arch/perf.h +++ /dev/null @@ -1,36 +0,0 @@ -/** - * @file perf.h - * @author Ambroz Bizjak - * - * @section LICENSE - * - * 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 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE 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. - */ - -#ifndef LWIP_CUSTOM_PERF_H -#define LWIP_CUSTOM_PERF_H - -#define PERF_START -#define PERF_STOP(x) - -#endif diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/custom/lwipopts.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/custom/lwipopts.h deleted file mode 100644 index 69c27fb2..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/custom/lwipopts.h +++ /dev/null @@ -1,98 +0,0 @@ -/** - * @file lwipopts.h - * @author Ambroz Bizjak - * - * @section LICENSE - * - * 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 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE 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. - */ - -#ifndef LWIP_CUSTOM_LWIPOPTS_H -#define LWIP_CUSTOM_LWIPOPTS_H - -#define NO_SYS 1 -#define MEM_ALIGNMENT 4 - -#define LWIP_ARP 0 -#define ARP_QUEUEING 0 -#define IP_FORWARD 0 -#define LWIP_ICMP 1 -#define LWIP_RAW 0 -#define LWIP_DHCP 0 -#define LWIP_AUTOIP 0 -#define LWIP_SNMP 0 -#define LWIP_IGMP 0 -#define LWIP_DNS 0 -#define LWIP_UDP 1 -#define LWIP_UDPLITE 0 -#define LWIP_TCP 1 -#define LWIP_CALLBACK_API 1 -#define LWIP_NETIF_API 0 -#define LWIP_NETIF_LOOPBACK 0 -#define LWIP_HAVE_LOOPIF 0 -#define LWIP_HAVE_SLIPIF 0 -#define LWIP_NETCONN 0 -#define LWIP_SOCKET 0 -#define PPP_SUPPORT 0 -#define LWIP_IPV6 0 -#define LWIP_IPV6_MLD 0 -#define LWIP_IPV6_AUTOCONFIG 0 - -#define LWIP_CHECKSUM_ON_COPY 1 - -// MEM -#define MEM_SIZE (1024 * 1024 * 2) /* 1MiB */ -#define MEMP_NUM_PBUF 256 -#define MEMP_NUM_TCP_PCB 256 -#define MEMP_NUM_TCP_PCB_LISTEN 256 -#define MEMP_NUM_TCP_SEG 256 -#define MEMP_NUM_REASSDATA 256 -#define MEMP_NUM_FRAG_PBUF 256 -#define PBUF_POOL_SIZE 256 - -//#define MEMP_NUM_TCP_PCB_LISTEN 16 -//#define MEMP_NUM_TCP_PCB 1024 -//#define TCP_SND_BUF 32469 -//#define TCP_SND_QUEUELEN (4 * (TCP_SND_BUF)/(TCP_MSS)) - -#define MEM_LIBC_MALLOC 1 -#define MEMP_MEM_MALLOC 1 - -//#define TCP_MSS 8117 - -#define TCP_MSS 2048 -#define TCP_WND (2*TCP_MSS) -#define TCP_SND_BUF 2 * TCP_WND -#define TCP_OVERSIZE TCP_MSS -#define TCP_SND_QUEUELEN TCP_SNDQUEUELEN_OVERFLOW - - -//#define LWIP_DEBUG -#define TCP_DEBUG LWIP_DBG_ON -#define IP_DEBUG LWIP_DBG_ON -#define TCP_INPUT_DEBUG LWIP_DBG_ON -#define TCP_WND_DEBUG LWIP_DBG_ON -#define TCP_OUTPUT_DEBUG LWIP_DBG_ON -#define TCP_RST_DEBUG LWIP_DBG_ON -#define TCP_QLEN_DEBUG LWIP_DBG_ON -#endif diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/custom/sys.c b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/custom/sys.c deleted file mode 100644 index 6f5ce627..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/custom/sys.c +++ /dev/null @@ -1,37 +0,0 @@ -/** - * @file sys.c - * @author Ambroz Bizjak - * - * @section LICENSE - * - * 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 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE 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. - */ - -#include "system/BTime.h" - -#include "lwip/sys.h" - -u32_t sys_now (void) -{ - return btime_gettime(); -} diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/core/def.c b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/core/def.c deleted file mode 100644 index 352b5524..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/core/def.c +++ /dev/null @@ -1,108 +0,0 @@ -/** - * @file - * Common functions used throughout the stack. - * - */ - -/* - * Copyright (c) 2001-2004 Swedish Institute of Computer Science. - * 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. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT - * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING - * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY - * OF SUCH DAMAGE. - * - * This file is part of the lwIP TCP/IP stack. - * - * Author: Simon Goldschmidt - * - */ - -#include "lwip/opt.h" -#include "lwip/def.h" - -/** - * These are reference implementations of the byte swapping functions. - * Again with the aim of being simple, correct and fully portable. - * Byte swapping is the second thing you would want to optimize. You will - * need to port it to your architecture and in your cc.h: - * - * #define LWIP_PLATFORM_BYTESWAP 1 - * #define LWIP_PLATFORM_HTONS(x) - * #define LWIP_PLATFORM_HTONL(x) - * - * Note ntohs() and ntohl() are merely references to the htonx counterparts. - */ - -#if (LWIP_PLATFORM_BYTESWAP == 0) && (BYTE_ORDER == LITTLE_ENDIAN) - -/** - * Convert an u16_t from host- to network byte order. - * - * @param n u16_t in host byte order - * @return n in network byte order - */ -u16_t -lwip_htons(u16_t n) -{ - return ((n & 0xff) << 8) | ((n & 0xff00) >> 8); -} - -/** - * Convert an u16_t from network- to host byte order. - * - * @param n u16_t in network byte order - * @return n in host byte order - */ -u16_t -lwip_ntohs(u16_t n) -{ - return lwip_htons(n); -} - -/** - * Convert an u32_t from host- to network byte order. - * - * @param n u32_t in host byte order - * @return n in network byte order - */ -u32_t -lwip_htonl(u32_t n) -{ - return ((n & 0xff) << 24) | - ((n & 0xff00) << 8) | - ((n & 0xff0000UL) >> 8) | - ((n & 0xff000000UL) >> 24); -} - -/** - * Convert an u32_t from network- to host byte order. - * - * @param n u32_t in network byte order - * @return n in host byte order - */ -u32_t -lwip_ntohl(u32_t n) -{ - return lwip_htonl(n); -} - -#endif /* (LWIP_PLATFORM_BYTESWAP == 0) && (BYTE_ORDER == LITTLE_ENDIAN) */ diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/core/inet_chksum.c b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/core/inet_chksum.c deleted file mode 100644 index 8bc42c14..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/core/inet_chksum.c +++ /dev/null @@ -1,545 +0,0 @@ -/** - * @file - * Incluse internet checksum functions. - * - */ - -/* - * Copyright (c) 2001-2004 Swedish Institute of Computer Science. - * 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. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT - * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING - * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY - * OF SUCH DAMAGE. - * - * This file is part of the lwIP TCP/IP stack. - * - * Author: Adam Dunkels - * - */ - -#include "lwip/opt.h" - -#include "lwip/inet_chksum.h" -#include "lwip/def.h" - -#include -#include - -/* These are some reference implementations of the checksum algorithm, with the - * aim of being simple, correct and fully portable. Checksumming is the - * first thing you would want to optimize for your platform. If you create - * your own version, link it in and in your cc.h put: - * - * #define LWIP_CHKSUM - * - * Or you can select from the implementations below by defining - * LWIP_CHKSUM_ALGORITHM to 1, 2 or 3. - */ - -#ifndef LWIP_CHKSUM -# define LWIP_CHKSUM lwip_standard_chksum -# ifndef LWIP_CHKSUM_ALGORITHM -# define LWIP_CHKSUM_ALGORITHM 2 -# endif -u16_t lwip_standard_chksum(void *dataptr, int len); -#endif -/* If none set: */ -#ifndef LWIP_CHKSUM_ALGORITHM -# define LWIP_CHKSUM_ALGORITHM 0 -#endif - -#if (LWIP_CHKSUM_ALGORITHM == 1) /* Version #1 */ -/** - * lwip checksum - * - * @param dataptr points to start of data to be summed at any boundary - * @param len length of data to be summed - * @return host order (!) lwip checksum (non-inverted Internet sum) - * - * @note accumulator size limits summable length to 64k - * @note host endianess is irrelevant (p3 RFC1071) - */ -u16_t -lwip_standard_chksum(void *dataptr, u16_t len) -{ - u32_t acc; - u16_t src; - u8_t *octetptr; - - acc = 0; - /* dataptr may be at odd or even addresses */ - octetptr = (u8_t*)dataptr; - while (len > 1) { - /* declare first octet as most significant - thus assume network order, ignoring host order */ - src = (*octetptr) << 8; - octetptr++; - /* declare second octet as least significant */ - src |= (*octetptr); - octetptr++; - acc += src; - len -= 2; - } - if (len > 0) { - /* accumulate remaining octet */ - src = (*octetptr) << 8; - acc += src; - } - /* add deferred carry bits */ - acc = (acc >> 16) + (acc & 0x0000ffffUL); - if ((acc & 0xffff0000UL) != 0) { - acc = (acc >> 16) + (acc & 0x0000ffffUL); - } - /* This maybe a little confusing: reorder sum using htons() - instead of ntohs() since it has a little less call overhead. - The caller must invert bits for Internet sum ! */ - return htons((u16_t)acc); -} -#endif - -#if (LWIP_CHKSUM_ALGORITHM == 2) /* Alternative version #2 */ -/* - * Curt McDowell - * Broadcom Corp. - * csm@broadcom.com - * - * IP checksum two bytes at a time with support for - * unaligned buffer. - * Works for len up to and including 0x20000. - * by Curt McDowell, Broadcom Corp. 12/08/2005 - * - * @param dataptr points to start of data to be summed at any boundary - * @param len length of data to be summed - * @return host order (!) lwip checksum (non-inverted Internet sum) - */ - -u16_t -lwip_standard_chksum(void *dataptr, int len) -{ - u8_t *pb = (u8_t *)dataptr; - u16_t *ps, t = 0; - u32_t sum = 0; - int odd = ((mem_ptr_t)pb & 1); - - /* Get aligned to u16_t */ - if (odd && len > 0) { - ((u8_t *)&t)[1] = *pb++; - len--; - } - - /* Add the bulk of the data */ - ps = (u16_t *)(void *)pb; - while (len > 1) { - sum += *ps++; - len -= 2; - } - - /* Consume left-over byte, if any */ - if (len > 0) { - ((u8_t *)&t)[0] = *(u8_t *)ps; - } - - /* Add end bytes */ - sum += t; - - /* Fold 32-bit sum to 16 bits - calling this twice is propably faster than if statements... */ - sum = FOLD_U32T(sum); - sum = FOLD_U32T(sum); - - /* Swap if alignment was odd */ - if (odd) { - sum = SWAP_BYTES_IN_WORD(sum); - } - - return (u16_t)sum; -} -#endif - -#if (LWIP_CHKSUM_ALGORITHM == 3) /* Alternative version #3 */ -/** - * An optimized checksum routine. Basically, it uses loop-unrolling on - * the checksum loop, treating the head and tail bytes specially, whereas - * the inner loop acts on 8 bytes at a time. - * - * @arg start of buffer to be checksummed. May be an odd byte address. - * @len number of bytes in the buffer to be checksummed. - * @return host order (!) lwip checksum (non-inverted Internet sum) - * - * by Curt McDowell, Broadcom Corp. December 8th, 2005 - */ - -u16_t -lwip_standard_chksum(void *dataptr, int len) -{ - u8_t *pb = (u8_t *)dataptr; - u16_t *ps, t = 0; - u32_t *pl; - u32_t sum = 0, tmp; - /* starts at odd byte address? */ - int odd = ((mem_ptr_t)pb & 1); - - if (odd && len > 0) { - ((u8_t *)&t)[1] = *pb++; - len--; - } - - ps = (u16_t *)pb; - - if (((mem_ptr_t)ps & 3) && len > 1) { - sum += *ps++; - len -= 2; - } - - pl = (u32_t *)ps; - - while (len > 7) { - tmp = sum + *pl++; /* ping */ - if (tmp < sum) { - tmp++; /* add back carry */ - } - - sum = tmp + *pl++; /* pong */ - if (sum < tmp) { - sum++; /* add back carry */ - } - - len -= 8; - } - - /* make room in upper bits */ - sum = FOLD_U32T(sum); - - ps = (u16_t *)pl; - - /* 16-bit aligned word remaining? */ - while (len > 1) { - sum += *ps++; - len -= 2; - } - - /* dangling tail byte remaining? */ - if (len > 0) { /* include odd byte */ - ((u8_t *)&t)[0] = *(u8_t *)ps; - } - - sum += t; /* add end bytes */ - - /* Fold 32-bit sum to 16 bits - calling this twice is propably faster than if statements... */ - sum = FOLD_U32T(sum); - sum = FOLD_U32T(sum); - - if (odd) { - sum = SWAP_BYTES_IN_WORD(sum); - } - - return (u16_t)sum; -} -#endif - -/** Parts of the pseudo checksum which are common to IPv4 and IPv6 */ -static u16_t -inet_cksum_pseudo_base(struct pbuf *p, u8_t proto, u16_t proto_len, u32_t acc) -{ - struct pbuf *q; - u8_t swapped = 0; - - /* iterate through all pbuf in chain */ - for(q = p; q != NULL; q = q->next) { - LWIP_DEBUGF(INET_DEBUG, ("inet_chksum_pseudo(): checksumming pbuf %p (has next %p) \n", - (void *)q, (void *)q->next)); - acc += LWIP_CHKSUM(q->payload, q->len); - /*LWIP_DEBUGF(INET_DEBUG, ("inet_chksum_pseudo(): unwrapped lwip_chksum()=%"X32_F" \n", acc));*/ - /* just executing this next line is probably faster that the if statement needed - to check whether we really need to execute it, and does no harm */ - acc = FOLD_U32T(acc); - if (q->len % 2 != 0) { - swapped = 1 - swapped; - acc = SWAP_BYTES_IN_WORD(acc); - } - /*LWIP_DEBUGF(INET_DEBUG, ("inet_chksum_pseudo(): wrapped lwip_chksum()=%"X32_F" \n", acc));*/ - } - - if (swapped) { - acc = SWAP_BYTES_IN_WORD(acc); - } - - acc += (u32_t)htons((u16_t)proto); - acc += (u32_t)htons(proto_len); - - /* Fold 32-bit sum to 16 bits - calling this twice is propably faster than if statements... */ - acc = FOLD_U32T(acc); - acc = FOLD_U32T(acc); - LWIP_DEBUGF(INET_DEBUG, ("inet_chksum_pseudo(): pbuf chain lwip_chksum()=%"X32_F"\n", acc)); - return (u16_t)~(acc & 0xffffUL); -} - -/* inet_chksum_pseudo: - * - * Calculates the pseudo Internet checksum used by TCP and UDP for a pbuf chain. - * IP addresses are expected to be in network byte order. - * - * @param p chain of pbufs over that a checksum should be calculated (ip data part) - * @param src source ip address (used for checksum of pseudo header) - * @param dst destination ip address (used for checksum of pseudo header) - * @param proto ip protocol (used for checksum of pseudo header) - * @param proto_len length of the ip data part (used for checksum of pseudo header) - * @return checksum (as u16_t) to be saved directly in the protocol header - */ -u16_t -inet_chksum_pseudo(struct pbuf *p, u8_t proto, u16_t proto_len, - ip_addr_t *src, ip_addr_t *dest) -{ - u32_t acc; - u32_t addr; - - addr = ip4_addr_get_u32(src); - acc = (addr & 0xffffUL); - acc += ((addr >> 16) & 0xffffUL); - addr = ip4_addr_get_u32(dest); - acc += (addr & 0xffffUL); - acc += ((addr >> 16) & 0xffffUL); - /* fold down to 16 bits */ - acc = FOLD_U32T(acc); - acc = FOLD_U32T(acc); - - return inet_cksum_pseudo_base(p, proto, proto_len, acc); -} -#if LWIP_IPV6 -/** - * Calculates the checksum with IPv6 pseudo header used by TCP and UDP for a pbuf chain. - * IPv6 addresses are expected to be in network byte order. - * - * @param p chain of pbufs over that a checksum should be calculated (ip data part) - * @param src source ipv6 address (used for checksum of pseudo header) - * @param dst destination ipv6 address (used for checksum of pseudo header) - * @param proto ipv6 protocol/next header (used for checksum of pseudo header) - * @param proto_len length of the ipv6 payload (used for checksum of pseudo header) - * @return checksum (as u16_t) to be saved directly in the protocol header - */ -u16_t -ip6_chksum_pseudo(struct pbuf *p, u8_t proto, u16_t proto_len, - ip6_addr_t *src, ip6_addr_t *dest) -{ - u32_t acc = 0; - u32_t addr; - u8_t addr_part; - - for (addr_part = 0; addr_part < 4; addr_part++) { - addr = src->addr[addr_part]; - acc += (addr & 0xffffUL); - acc += ((addr >> 16) & 0xffffUL); - addr = dest->addr[addr_part]; - acc += (addr & 0xffffUL); - acc += ((addr >> 16) & 0xffffUL); - } - /* fold down to 16 bits */ - acc = FOLD_U32T(acc); - acc = FOLD_U32T(acc); - - return inet_cksum_pseudo_base(p, proto, proto_len, acc); -} -#endif /* LWIP_IPV6 */ - -/** Parts of the pseudo checksum which are common to IPv4 and IPv6 */ -static u16_t -inet_cksum_pseudo_partial_base(struct pbuf *p, u8_t proto, u16_t proto_len, - u16_t chksum_len, u32_t acc) -{ - struct pbuf *q; - u8_t swapped = 0; - u16_t chklen; - - /* iterate through all pbuf in chain */ - for(q = p; (q != NULL) && (chksum_len > 0); q = q->next) { - LWIP_DEBUGF(INET_DEBUG, ("inet_chksum_pseudo(): checksumming pbuf %p (has next %p) \n", - (void *)q, (void *)q->next)); - chklen = q->len; - if (chklen > chksum_len) { - chklen = chksum_len; - } - acc += LWIP_CHKSUM(q->payload, chklen); - chksum_len -= chklen; - LWIP_ASSERT("delete me", chksum_len < 0x7fff); - /*LWIP_DEBUGF(INET_DEBUG, ("inet_chksum_pseudo(): unwrapped lwip_chksum()=%"X32_F" \n", acc));*/ - /* fold the upper bit down */ - acc = FOLD_U32T(acc); - if (q->len % 2 != 0) { - swapped = 1 - swapped; - acc = SWAP_BYTES_IN_WORD(acc); - } - /*LWIP_DEBUGF(INET_DEBUG, ("inet_chksum_pseudo(): wrapped lwip_chksum()=%"X32_F" \n", acc));*/ - } - - if (swapped) { - acc = SWAP_BYTES_IN_WORD(acc); - } - - acc += (u32_t)htons((u16_t)proto); - acc += (u32_t)htons(proto_len); - - /* Fold 32-bit sum to 16 bits - calling this twice is propably faster than if statements... */ - acc = FOLD_U32T(acc); - acc = FOLD_U32T(acc); - LWIP_DEBUGF(INET_DEBUG, ("inet_chksum_pseudo(): pbuf chain lwip_chksum()=%"X32_F"\n", acc)); - return (u16_t)~(acc & 0xffffUL); -} - -/* inet_chksum_pseudo_partial: - * - * Calculates the pseudo Internet checksum used by TCP and UDP for a pbuf chain. - * IP addresses are expected to be in network byte order. - * - * @param p chain of pbufs over that a checksum should be calculated (ip data part) - * @param src source ip address (used for checksum of pseudo header) - * @param dst destination ip address (used for checksum of pseudo header) - * @param proto ip protocol (used for checksum of pseudo header) - * @param proto_len length of the ip data part (used for checksum of pseudo header) - * @return checksum (as u16_t) to be saved directly in the protocol header - */ -u16_t -inet_chksum_pseudo_partial(struct pbuf *p, u8_t proto, u16_t proto_len, - u16_t chksum_len, ip_addr_t *src, ip_addr_t *dest) -{ - u32_t acc; - u32_t addr; - - addr = ip4_addr_get_u32(src); - acc = (addr & 0xffffUL); - acc += ((addr >> 16) & 0xffffUL); - addr = ip4_addr_get_u32(dest); - acc += (addr & 0xffffUL); - acc += ((addr >> 16) & 0xffffUL); - /* fold down to 16 bits */ - acc = FOLD_U32T(acc); - acc = FOLD_U32T(acc); - - return inet_cksum_pseudo_partial_base(p, proto, proto_len, chksum_len, acc); -} - -#if LWIP_IPV6 -/** - * Calculates the checksum with IPv6 pseudo header used by TCP and UDP for a pbuf chain. - * IPv6 addresses are expected to be in network byte order. Will only compute for a - * portion of the payload. - * - * @param p chain of pbufs over that a checksum should be calculated (ip data part) - * @param src source ipv6 address (used for checksum of pseudo header) - * @param dst destination ipv6 address (used for checksum of pseudo header) - * @param proto ipv6 protocol/next header (used for checksum of pseudo header) - * @param proto_len length of the ipv6 payload (used for checksum of pseudo header) - * @param chksum_len number of payload bytes used to compute chksum - * @return checksum (as u16_t) to be saved directly in the protocol header - */ -u16_t -ip6_chksum_pseudo_partial(struct pbuf *p, u8_t proto, u16_t proto_len, - u16_t chksum_len, ip6_addr_t *src, ip6_addr_t *dest) -{ - u32_t acc = 0; - u32_t addr; - u8_t addr_part; - - for (addr_part = 0; addr_part < 4; addr_part++) { - addr = src->addr[addr_part]; - acc += (addr & 0xffffUL); - acc += ((addr >> 16) & 0xffffUL); - addr = dest->addr[addr_part]; - acc += (addr & 0xffffUL); - acc += ((addr >> 16) & 0xffffUL); - } - /* fold down to 16 bits */ - acc = FOLD_U32T(acc); - acc = FOLD_U32T(acc); - - return inet_cksum_pseudo_partial_base(p, proto, proto_len, chksum_len, acc); -} -#endif /* LWIP_IPV6 */ - -/* inet_chksum: - * - * Calculates the Internet checksum over a portion of memory. Used primarily for IP - * and ICMP. - * - * @param dataptr start of the buffer to calculate the checksum (no alignment needed) - * @param len length of the buffer to calculate the checksum - * @return checksum (as u16_t) to be saved directly in the protocol header - */ - -u16_t -inet_chksum(void *dataptr, u16_t len) -{ - return ~LWIP_CHKSUM(dataptr, len); -} - -/** - * Calculate a checksum over a chain of pbufs (without pseudo-header, much like - * inet_chksum only pbufs are used). - * - * @param p pbuf chain over that the checksum should be calculated - * @return checksum (as u16_t) to be saved directly in the protocol header - */ -u16_t -inet_chksum_pbuf(struct pbuf *p) -{ - u32_t acc; - struct pbuf *q; - u8_t swapped; - - acc = 0; - swapped = 0; - for(q = p; q != NULL; q = q->next) { - acc += LWIP_CHKSUM(q->payload, q->len); - acc = FOLD_U32T(acc); - if (q->len % 2 != 0) { - swapped = 1 - swapped; - acc = SWAP_BYTES_IN_WORD(acc); - } - } - - if (swapped) { - acc = SWAP_BYTES_IN_WORD(acc); - } - return (u16_t)~(acc & 0xffffUL); -} - -/* These are some implementations for LWIP_CHKSUM_COPY, which copies data - * like MEMCPY but generates a checksum at the same time. Since this is a - * performance-sensitive function, you might want to create your own version - * in assembly targeted at your hardware by defining it in lwipopts.h: - * #define LWIP_CHKSUM_COPY(dst, src, len) your_chksum_copy(dst, src, len) - */ - -#if (LWIP_CHKSUM_COPY_ALGORITHM == 1) /* Version #1 */ -/** Safe but slow: first call MEMCPY, then call LWIP_CHKSUM. - * For architectures with big caches, data might still be in cache when - * generating the checksum after copying. - */ -u16_t -lwip_chksum_copy(void *dst, const void *src, u16_t len) -{ - MEMCPY(dst, src, len); - return LWIP_CHKSUM(dst, len); -} -#endif /* (LWIP_CHKSUM_COPY_ALGORITHM == 1) */ diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/core/init.c b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/core/init.c deleted file mode 100644 index c24c0274..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/core/init.c +++ /dev/null @@ -1,345 +0,0 @@ -/** - * @file - * Modules initialization - * - */ - -/* - * Copyright (c) 2001-2004 Swedish Institute of Computer Science. - * 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. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT - * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING - * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY - * OF SUCH DAMAGE. - * - * This file is part of the lwIP TCP/IP stack. - * - * Author: Adam Dunkels - * - */ - -#include "lwip/opt.h" - -#include "lwip/init.h" -#include "lwip/stats.h" -#include "lwip/sys.h" -#include "lwip/mem.h" -#include "lwip/memp.h" -#include "lwip/pbuf.h" -#include "lwip/netif.h" -#include "lwip/sockets.h" -#include "lwip/ip.h" -#include "lwip/raw.h" -#include "lwip/udp.h" -#include "lwip/tcp_impl.h" -#include "lwip/snmp_msg.h" -#include "lwip/autoip.h" -#include "lwip/igmp.h" -#include "lwip/dns.h" -#include "lwip/timers.h" -#include "netif/etharp.h" -#include "lwip/ip6.h" -#include "lwip/nd6.h" -#include "lwip/mld6.h" -#include "lwip/api.h" - -/* Compile-time sanity checks for configuration errors. - * These can be done independently of LWIP_DEBUG, without penalty. - */ -#ifndef BYTE_ORDER - #error "BYTE_ORDER is not defined, you have to define it in your cc.h" -#endif -#if (!IP_SOF_BROADCAST && IP_SOF_BROADCAST_RECV) - #error "If you want to use broadcast filter per pcb on recv operations, you have to define IP_SOF_BROADCAST=1 in your lwipopts.h" -#endif -#if (!LWIP_UDP && LWIP_UDPLITE) - #error "If you want to use UDP Lite, you have to define LWIP_UDP=1 in your lwipopts.h" -#endif -#if (!LWIP_UDP && LWIP_SNMP) - #error "If you want to use SNMP, you have to define LWIP_UDP=1 in your lwipopts.h" -#endif -#if (!LWIP_UDP && LWIP_DHCP) - #error "If you want to use DHCP, you have to define LWIP_UDP=1 in your lwipopts.h" -#endif -#if (!LWIP_UDP && LWIP_IGMP) - #error "If you want to use IGMP, you have to define LWIP_UDP=1 in your lwipopts.h" -#endif -#if (!LWIP_UDP && LWIP_SNMP) - #error "If you want to use SNMP, you have to define LWIP_UDP=1 in your lwipopts.h" -#endif -#if (!LWIP_UDP && LWIP_DNS) - #error "If you want to use DNS, you have to define LWIP_UDP=1 in your lwipopts.h" -#endif -#if !MEMP_MEM_MALLOC /* MEMP_NUM_* checks are disabled when not using the pool allocator */ -#if (LWIP_ARP && ARP_QUEUEING && (MEMP_NUM_ARP_QUEUE<=0)) - #error "If you want to use ARP Queueing, you have to define MEMP_NUM_ARP_QUEUE>=1 in your lwipopts.h" -#endif -#if (LWIP_RAW && (MEMP_NUM_RAW_PCB<=0)) - #error "If you want to use RAW, you have to define MEMP_NUM_RAW_PCB>=1 in your lwipopts.h" -#endif -#if (LWIP_UDP && (MEMP_NUM_UDP_PCB<=0)) - #error "If you want to use UDP, you have to define MEMP_NUM_UDP_PCB>=1 in your lwipopts.h" -#endif -#if (LWIP_TCP && (MEMP_NUM_TCP_PCB<=0)) - #error "If you want to use TCP, you have to define MEMP_NUM_TCP_PCB>=1 in your lwipopts.h" -#endif -#if (LWIP_IGMP && (MEMP_NUM_IGMP_GROUP<=1)) - #error "If you want to use IGMP, you have to define MEMP_NUM_IGMP_GROUP>1 in your lwipopts.h" -#endif -#if ((LWIP_NETCONN || LWIP_SOCKET) && (MEMP_NUM_TCPIP_MSG_API<=0)) - #error "If you want to use Sequential API, you have to define MEMP_NUM_TCPIP_MSG_API>=1 in your lwipopts.h" -#endif -/* There must be sufficient timeouts, taking into account requirements of the subsystems. */ -#if LWIP_TIMERS && (MEMP_NUM_SYS_TIMEOUT < (LWIP_TCP + IP_REASSEMBLY + LWIP_ARP + (2*LWIP_DHCP) + LWIP_AUTOIP + LWIP_IGMP + LWIP_DNS + PPP_SUPPORT + (LWIP_IPV6 ? (1 + LWIP_IPV6_REASS + LWIP_IPV6_MLD) : 0))) - #error "MEMP_NUM_SYS_TIMEOUT is too low to accomodate all required timeouts" -#endif -#if (IP_REASSEMBLY && (MEMP_NUM_REASSDATA > IP_REASS_MAX_PBUFS)) - #error "MEMP_NUM_REASSDATA > IP_REASS_MAX_PBUFS doesn't make sense since each struct ip_reassdata must hold 2 pbufs at least!" -#endif -#endif /* !MEMP_MEM_MALLOC */ -#if (LWIP_TCP && (TCP_WND > 0xffff)) - #error "If you want to use TCP, TCP_WND must fit in an u16_t, so, you have to reduce it in your lwipopts.h" -#endif -#if (LWIP_TCP && (TCP_SND_QUEUELEN > 0xffff)) - #error "If you want to use TCP, TCP_SND_QUEUELEN must fit in an u16_t, so, you have to reduce it in your lwipopts.h" -#endif -#if (LWIP_TCP && (TCP_SND_QUEUELEN < 2)) - #error "TCP_SND_QUEUELEN must be at least 2 for no-copy TCP writes to work" -#endif -#if (LWIP_TCP && ((TCP_MAXRTX > 12) || (TCP_SYNMAXRTX > 12))) - #error "If you want to use TCP, TCP_MAXRTX and TCP_SYNMAXRTX must less or equal to 12 (due to tcp_backoff table), so, you have to reduce them in your lwipopts.h" -#endif -#if (LWIP_TCP && TCP_LISTEN_BACKLOG && (TCP_DEFAULT_LISTEN_BACKLOG < 0) || (TCP_DEFAULT_LISTEN_BACKLOG > 0xff)) - #error "If you want to use TCP backlog, TCP_DEFAULT_LISTEN_BACKLOG must fit into an u8_t" -#endif -#if (LWIP_NETIF_API && (NO_SYS==1)) - #error "If you want to use NETIF API, you have to define NO_SYS=0 in your lwipopts.h" -#endif -#if ((LWIP_SOCKET || LWIP_NETCONN) && (NO_SYS==1)) - #error "If you want to use Sequential API, you have to define NO_SYS=0 in your lwipopts.h" -#endif -#if (!LWIP_NETCONN && LWIP_SOCKET) - #error "If you want to use Socket API, you have to define LWIP_NETCONN=1 in your lwipopts.h" -#endif -#if (((!LWIP_DHCP) || (!LWIP_AUTOIP)) && LWIP_DHCP_AUTOIP_COOP) - #error "If you want to use DHCP/AUTOIP cooperation mode, you have to define LWIP_DHCP=1 and LWIP_AUTOIP=1 in your lwipopts.h" -#endif -#if (((!LWIP_DHCP) || (!LWIP_ARP)) && DHCP_DOES_ARP_CHECK) - #error "If you want to use DHCP ARP checking, you have to define LWIP_DHCP=1 and LWIP_ARP=1 in your lwipopts.h" -#endif -#if (!LWIP_ARP && LWIP_AUTOIP) - #error "If you want to use AUTOIP, you have to define LWIP_ARP=1 in your lwipopts.h" -#endif -#if (LWIP_SNMP && (SNMP_CONCURRENT_REQUESTS<=0)) - #error "If you want to use SNMP, you have to define SNMP_CONCURRENT_REQUESTS>=1 in your lwipopts.h" -#endif -#if (LWIP_SNMP && (SNMP_TRAP_DESTINATIONS<=0)) - #error "If you want to use SNMP, you have to define SNMP_TRAP_DESTINATIONS>=1 in your lwipopts.h" -#endif -#if (LWIP_TCP && ((LWIP_EVENT_API && LWIP_CALLBACK_API) || (!LWIP_EVENT_API && !LWIP_CALLBACK_API))) - #error "One and exactly one of LWIP_EVENT_API and LWIP_CALLBACK_API has to be enabled in your lwipopts.h" -#endif -#if (MEM_LIBC_MALLOC && MEM_USE_POOLS) - #error "MEM_LIBC_MALLOC and MEM_USE_POOLS may not both be simultaneously enabled in your lwipopts.h" -#endif -#if (MEM_USE_POOLS && !MEMP_USE_CUSTOM_POOLS) - #error "MEM_USE_POOLS requires custom pools (MEMP_USE_CUSTOM_POOLS) to be enabled in your lwipopts.h" -#endif -#if (PBUF_POOL_BUFSIZE <= MEM_ALIGNMENT) - #error "PBUF_POOL_BUFSIZE must be greater than MEM_ALIGNMENT or the offset may take the full first pbuf" -#endif -#if (DNS_LOCAL_HOSTLIST && !DNS_LOCAL_HOSTLIST_IS_DYNAMIC && !(defined(DNS_LOCAL_HOSTLIST_INIT))) - #error "you have to define define DNS_LOCAL_HOSTLIST_INIT {{'host1', 0x123}, {'host2', 0x234}} to initialize DNS_LOCAL_HOSTLIST" -#endif -#if PPP_SUPPORT && !PPPOS_SUPPORT & !PPPOE_SUPPORT - #error "PPP_SUPPORT needs either PPPOS_SUPPORT or PPPOE_SUPPORT turned on" -#endif -#if !LWIP_ETHERNET && (LWIP_ARP || PPPOE_SUPPORT) - #error "LWIP_ETHERNET needs to be turned on for LWIP_ARP or PPPOE_SUPPORT" -#endif -#if (LWIP_IGMP || LWIP_IPV6) && !defined(LWIP_RAND) - #error "When using IGMP or IPv6, LWIP_RAND() needs to be defined to a random-function returning an u32_t random value" -#endif -#if LWIP_TCPIP_CORE_LOCKING_INPUT && !LWIP_TCPIP_CORE_LOCKING - #error "When using LWIP_TCPIP_CORE_LOCKING_INPUT, LWIP_TCPIP_CORE_LOCKING must be enabled, too" -#endif -#if LWIP_TCP && LWIP_NETIF_TX_SINGLE_PBUF && !TCP_OVERSIZE - #error "LWIP_NETIF_TX_SINGLE_PBUF needs TCP_OVERSIZE enabled to create single-pbuf TCP packets" -#endif -#if IP_FRAG && IP_FRAG_USES_STATIC_BUF && LWIP_NETIF_TX_SINGLE_PBUF - #error "LWIP_NETIF_TX_SINGLE_PBUF does not work with IP_FRAG_USES_STATIC_BUF==1 as that creates pbuf queues" -#endif -#if LWIP_NETCONN && LWIP_TCP -#if NETCONN_COPY != TCP_WRITE_FLAG_COPY - #error "NETCONN_COPY != TCP_WRITE_FLAG_COPY" -#endif -#if NETCONN_MORE != TCP_WRITE_FLAG_MORE - #error "NETCONN_MORE != TCP_WRITE_FLAG_MORE" -#endif -#endif /* LWIP_NETCONN && LWIP_TCP */ -#if LWIP_SOCKET -/* Check that the SO_* socket options and SOF_* lwIP-internal flags match */ -#if SO_ACCEPTCONN != SOF_ACCEPTCONN - #error "SO_ACCEPTCONN != SOF_ACCEPTCONN" -#endif -#if SO_REUSEADDR != SOF_REUSEADDR - #error "WARNING: SO_REUSEADDR != SOF_REUSEADDR" -#endif -#if SO_KEEPALIVE != SOF_KEEPALIVE - #error "WARNING: SO_KEEPALIVE != SOF_KEEPALIVE" -#endif -#if SO_BROADCAST != SOF_BROADCAST - #error "WARNING: SO_BROADCAST != SOF_BROADCAST" -#endif -#if SO_LINGER != SOF_LINGER - #error "WARNING: SO_LINGER != SOF_LINGER" -#endif -#endif /* LWIP_SOCKET */ - - -/* Compile-time checks for deprecated options. - */ -#ifdef MEMP_NUM_TCPIP_MSG - #error "MEMP_NUM_TCPIP_MSG option is deprecated. Remove it from your lwipopts.h." -#endif -#ifdef MEMP_NUM_API_MSG - #error "MEMP_NUM_API_MSG option is deprecated. Remove it from your lwipopts.h." -#endif -#ifdef TCP_REXMIT_DEBUG - #error "TCP_REXMIT_DEBUG option is deprecated. Remove it from your lwipopts.h." -#endif -#ifdef RAW_STATS - #error "RAW_STATS option is deprecated. Remove it from your lwipopts.h." -#endif -#ifdef ETHARP_QUEUE_FIRST - #error "ETHARP_QUEUE_FIRST option is deprecated. Remove it from your lwipopts.h." -#endif -#ifdef ETHARP_ALWAYS_INSERT - #error "ETHARP_ALWAYS_INSERT option is deprecated. Remove it from your lwipopts.h." -#endif - -#ifndef LWIP_DISABLE_TCP_SANITY_CHECKS -#define LWIP_DISABLE_TCP_SANITY_CHECKS 0 -#endif -#ifndef LWIP_DISABLE_MEMP_SANITY_CHECKS -#define LWIP_DISABLE_MEMP_SANITY_CHECKS 0 -#endif - -/* MEMP sanity checks */ -#if !LWIP_DISABLE_MEMP_SANITY_CHECKS -#if LWIP_NETCONN -#if MEMP_MEM_MALLOC -#if !MEMP_NUM_NETCONN && LWIP_SOCKET -#error "lwip_sanity_check: WARNING: MEMP_NUM_NETCONN cannot be 0 when using sockets!" -#endif -#else /* MEMP_MEM_MALLOC */ -#if MEMP_NUM_NETCONN > (MEMP_NUM_TCP_PCB+MEMP_NUM_TCP_PCB_LISTEN+MEMP_NUM_UDP_PCB+MEMP_NUM_RAW_PCB) -#error "lwip_sanity_check: WARNING: MEMP_NUM_NETCONN should be less than the sum of MEMP_NUM_{TCP,RAW,UDP}_PCB+MEMP_NUM_TCP_PCB_LISTEN. If you know what you are doing, define LWIP_DISABLE_MEMP_SANITY_CHECKS to 1 to disable this error." -#endif -#endif /* MEMP_MEM_MALLOC */ -#endif /* LWIP_NETCONN */ -#endif /* !LWIP_DISABLE_MEMP_SANITY_CHECKS */ - -/* TCP sanity checks */ -#if !LWIP_DISABLE_TCP_SANITY_CHECKS -#if LWIP_TCP -#if !MEMP_MEM_MALLOC && (MEMP_NUM_TCP_SEG < TCP_SND_QUEUELEN) - #error "lwip_sanity_check: WARNING: MEMP_NUM_TCP_SEG should be at least as big as TCP_SND_QUEUELEN. If you know what you are doing, define LWIP_DISABLE_TCP_SANITY_CHECKS to 1 to disable this error." -#endif -#if TCP_SND_BUF < (2 * TCP_MSS) - #error "lwip_sanity_check: WARNING: TCP_SND_BUF must be at least as much as (2 * TCP_MSS) for things to work smoothly. If you know what you are doing, define LWIP_DISABLE_TCP_SANITY_CHECKS to 1 to disable this error." -#endif -#if TCP_SND_QUEUELEN < (2 * (TCP_SND_BUF / TCP_MSS)) - #error "lwip_sanity_check: WARNING: TCP_SND_QUEUELEN must be at least as much as (2 * TCP_SND_BUF/TCP_MSS) for things to work. If you know what you are doing, define LWIP_DISABLE_TCP_SANITY_CHECKS to 1 to disable this error." -#endif -#if TCP_SNDLOWAT >= TCP_SND_BUF - #error "lwip_sanity_check: WARNING: TCP_SNDLOWAT must be less than TCP_SND_BUF. If you know what you are doing, define LWIP_DISABLE_TCP_SANITY_CHECKS to 1 to disable this error." -#endif -#if TCP_SNDQUEUELOWAT >= TCP_SND_QUEUELEN - #error "lwip_sanity_check: WARNING: TCP_SNDQUEUELOWAT must be less than TCP_SND_QUEUELEN. If you know what you are doing, define LWIP_DISABLE_TCP_SANITY_CHECKS to 1 to disable this error." -#endif -#if !MEMP_MEM_MALLOC && (PBUF_POOL_BUFSIZE <= (PBUF_LINK_HLEN + PBUF_IP_HLEN + PBUF_TRANSPORT_HLEN)) - #error "lwip_sanity_check: WARNING: PBUF_POOL_BUFSIZE does not provide enough space for protocol headers. If you know what you are doing, define LWIP_DISABLE_TCP_SANITY_CHECKS to 1 to disable this error." -#endif -#if !MEMP_MEM_MALLOC && (TCP_WND > (PBUF_POOL_SIZE * (PBUF_POOL_BUFSIZE - (PBUF_LINK_HLEN + PBUF_IP_HLEN + PBUF_TRANSPORT_HLEN)))) - #error "lwip_sanity_check: WARNING: TCP_WND is larger than space provided by PBUF_POOL_SIZE * (PBUF_POOL_BUFSIZE - protocol headers). If you know what you are doing, define LWIP_DISABLE_TCP_SANITY_CHECKS to 1 to disable this error." -#endif -#if TCP_WND < TCP_MSS - #error "lwip_sanity_check: WARNING: TCP_WND is smaller than MSS. If you know what you are doing, define LWIP_DISABLE_TCP_SANITY_CHECKS to 1 to disable this error." -#endif -#endif /* LWIP_TCP */ -#endif /* !LWIP_DISABLE_TCP_SANITY_CHECKS */ - -/** - * Perform Sanity check of user-configurable values, and initialize all modules. - */ -void -lwip_init(void) -{ - /* Modules initialization */ - stats_init(); -#if !NO_SYS - sys_init(); -#endif /* !NO_SYS */ - mem_init(); - memp_init(); - pbuf_init(); - netif_init(); -#if LWIP_SOCKET - lwip_socket_init(); -#endif /* LWIP_SOCKET */ - ip_init(); -#if LWIP_ARP - etharp_init(); -#endif /* LWIP_ARP */ -#if LWIP_RAW - raw_init(); -#endif /* LWIP_RAW */ -#if LWIP_UDP - udp_init(); -#endif /* LWIP_UDP */ -#if LWIP_TCP - tcp_init(); -#endif /* LWIP_TCP */ -#if LWIP_SNMP - snmp_init(); -#endif /* LWIP_SNMP */ -#if LWIP_AUTOIP - autoip_init(); -#endif /* LWIP_AUTOIP */ -#if LWIP_IGMP - igmp_init(); -#endif /* LWIP_IGMP */ -#if LWIP_DNS - dns_init(); -#endif /* LWIP_DNS */ -#if LWIP_IPV6 - ip6_init(); - nd6_init(); -#if LWIP_IPV6_MLD - mld6_init(); -#endif /* LWIP_IPV6_MLD */ -#endif /* LWIP_IPV6 */ - -#if LWIP_TIMERS - sys_timeouts_init(); -#endif /* LWIP_TIMERS */ -} diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/core/ipv4/icmp.c b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/core/ipv4/icmp.c deleted file mode 100644 index af471533..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/core/ipv4/icmp.c +++ /dev/null @@ -1,338 +0,0 @@ -/** - * @file - * ICMP - Internet Control Message Protocol - * - */ - -/* - * Copyright (c) 2001-2004 Swedish Institute of Computer Science. - * 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. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT - * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING - * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY - * OF SUCH DAMAGE. - * - * This file is part of the lwIP TCP/IP stack. - * - * Author: Adam Dunkels - * - */ - -/* Some ICMP messages should be passed to the transport protocols. This - is not implemented. */ - -#include "lwip/opt.h" - -#if LWIP_ICMP /* don't build if not configured for use in lwipopts.h */ - -#include "lwip/icmp.h" -#include "lwip/inet_chksum.h" -#include "lwip/ip.h" -#include "lwip/def.h" -#include "lwip/stats.h" -#include "lwip/snmp.h" - -#include - -/** Small optimization: set to 0 if incoming PBUF_POOL pbuf always can be - * used to modify and send a response packet (and to 1 if this is not the case, - * e.g. when link header is stripped of when receiving) */ -#ifndef LWIP_ICMP_ECHO_CHECK_INPUT_PBUF_LEN -#define LWIP_ICMP_ECHO_CHECK_INPUT_PBUF_LEN 1 -#endif /* LWIP_ICMP_ECHO_CHECK_INPUT_PBUF_LEN */ - -/* The amount of data from the original packet to return in a dest-unreachable */ -#define ICMP_DEST_UNREACH_DATASIZE 8 - -static void icmp_send_response(struct pbuf *p, u8_t type, u8_t code); - -/** - * Processes ICMP input packets, called from ip_input(). - * - * Currently only processes icmp echo requests and sends - * out the echo response. - * - * @param p the icmp echo request packet, p->payload pointing to the icmp header - * @param inp the netif on which this packet was received - */ -void -icmp_input(struct pbuf *p, struct netif *inp) -{ - u8_t type; -#ifdef LWIP_DEBUG - u8_t code; -#endif /* LWIP_DEBUG */ - struct icmp_echo_hdr *iecho; - struct ip_hdr *iphdr; - s16_t hlen; - - ICMP_STATS_INC(icmp.recv); - snmp_inc_icmpinmsgs(); - - iphdr = (struct ip_hdr *)ip_current_header(); - hlen = IPH_HL(iphdr) * 4; - if (p->len < sizeof(u16_t)*2) { - LWIP_DEBUGF(ICMP_DEBUG, ("icmp_input: short ICMP (%"U16_F" bytes) received\n", p->tot_len)); - goto lenerr; - } - - type = *((u8_t *)p->payload); -#ifdef LWIP_DEBUG - code = *(((u8_t *)p->payload)+1); -#endif /* LWIP_DEBUG */ - switch (type) { - case ICMP_ER: - /* This is OK, echo reply might have been parsed by a raw PCB - (as obviously, an echo request has been sent, too). */ - break; - case ICMP_ECHO: -#if !LWIP_MULTICAST_PING || !LWIP_BROADCAST_PING - { - int accepted = 1; -#if !LWIP_MULTICAST_PING - /* multicast destination address? */ - if (ip_addr_ismulticast(ip_current_dest_addr())) { - accepted = 0; - } -#endif /* LWIP_MULTICAST_PING */ -#if !LWIP_BROADCAST_PING - /* broadcast destination address? */ - if (ip_addr_isbroadcast(ip_current_dest_addr(), inp)) { - accepted = 0; - } -#endif /* LWIP_BROADCAST_PING */ - /* broadcast or multicast destination address not acceptd? */ - if (!accepted) { - LWIP_DEBUGF(ICMP_DEBUG, ("icmp_input: Not echoing to multicast or broadcast pings\n")); - ICMP_STATS_INC(icmp.err); - pbuf_free(p); - return; - } - } -#endif /* !LWIP_MULTICAST_PING || !LWIP_BROADCAST_PING */ - LWIP_DEBUGF(ICMP_DEBUG, ("icmp_input: ping\n")); - if (p->tot_len < sizeof(struct icmp_echo_hdr)) { - LWIP_DEBUGF(ICMP_DEBUG, ("icmp_input: bad ICMP echo received\n")); - goto lenerr; - } - if (inet_chksum_pbuf(p) != 0) { - LWIP_DEBUGF(ICMP_DEBUG, ("icmp_input: checksum failed for received ICMP echo\n")); - pbuf_free(p); - ICMP_STATS_INC(icmp.chkerr); - snmp_inc_icmpinerrors(); - return; - } -#if LWIP_ICMP_ECHO_CHECK_INPUT_PBUF_LEN - if (pbuf_header(p, (PBUF_IP_HLEN + PBUF_LINK_HLEN))) { - /* p is not big enough to contain link headers - * allocate a new one and copy p into it - */ - struct pbuf *r; - /* switch p->payload to ip header */ - if (pbuf_header(p, hlen)) { - LWIP_ASSERT("icmp_input: moving p->payload to ip header failed\n", 0); - goto memerr; - } - /* allocate new packet buffer with space for link headers */ - r = pbuf_alloc(PBUF_LINK, p->tot_len, PBUF_RAM); - if (r == NULL) { - LWIP_DEBUGF(ICMP_DEBUG, ("icmp_input: allocating new pbuf failed\n")); - goto memerr; - } - LWIP_ASSERT("check that first pbuf can hold struct the ICMP header", - (r->len >= hlen + sizeof(struct icmp_echo_hdr))); - /* copy the whole packet including ip header */ - if (pbuf_copy(r, p) != ERR_OK) { - LWIP_ASSERT("icmp_input: copying to new pbuf failed\n", 0); - goto memerr; - } - iphdr = (struct ip_hdr *)r->payload; - /* switch r->payload back to icmp header */ - if (pbuf_header(r, -hlen)) { - LWIP_ASSERT("icmp_input: restoring original p->payload failed\n", 0); - goto memerr; - } - /* free the original p */ - pbuf_free(p); - /* we now have an identical copy of p that has room for link headers */ - p = r; - } else { - /* restore p->payload to point to icmp header */ - if (pbuf_header(p, -(s16_t)(PBUF_IP_HLEN + PBUF_LINK_HLEN))) { - LWIP_ASSERT("icmp_input: restoring original p->payload failed\n", 0); - goto memerr; - } - } -#endif /* LWIP_ICMP_ECHO_CHECK_INPUT_PBUF_LEN */ - /* At this point, all checks are OK. */ - /* We generate an answer by switching the dest and src ip addresses, - * setting the icmp type to ECHO_RESPONSE and updating the checksum. */ - iecho = (struct icmp_echo_hdr *)p->payload; - ip_addr_copy(iphdr->src, *ip_current_dest_addr()); - ip_addr_copy(iphdr->dest, *ip_current_src_addr()); - ICMPH_TYPE_SET(iecho, ICMP_ER); -#if CHECKSUM_GEN_ICMP - /* adjust the checksum */ - if (iecho->chksum >= PP_HTONS(0xffffU - (ICMP_ECHO << 8))) { - iecho->chksum += PP_HTONS(ICMP_ECHO << 8) + 1; - } else { - iecho->chksum += PP_HTONS(ICMP_ECHO << 8); - } -#else /* CHECKSUM_GEN_ICMP */ - iecho->chksum = 0; -#endif /* CHECKSUM_GEN_ICMP */ - - /* Set the correct TTL and recalculate the header checksum. */ - IPH_TTL_SET(iphdr, ICMP_TTL); - IPH_CHKSUM_SET(iphdr, 0); -#if CHECKSUM_GEN_IP - IPH_CHKSUM_SET(iphdr, inet_chksum(iphdr, IP_HLEN)); -#endif /* CHECKSUM_GEN_IP */ - - ICMP_STATS_INC(icmp.xmit); - /* increase number of messages attempted to send */ - snmp_inc_icmpoutmsgs(); - /* increase number of echo replies attempted to send */ - snmp_inc_icmpoutechoreps(); - - if(pbuf_header(p, hlen)) { - LWIP_ASSERT("Can't move over header in packet", 0); - } else { - err_t ret; - /* send an ICMP packet, src addr is the dest addr of the curren packet */ - ret = ip_output_if(p, ip_current_dest_addr(), IP_HDRINCL, - ICMP_TTL, 0, IP_PROTO_ICMP, inp); - if (ret != ERR_OK) { - LWIP_DEBUGF(ICMP_DEBUG, ("icmp_input: ip_output_if returned an error: %c.\n", ret)); - } - } - break; - default: - LWIP_DEBUGF(ICMP_DEBUG, ("icmp_input: ICMP type %"S16_F" code %"S16_F" not supported.\n", - (s16_t)type, (s16_t)code)); - ICMP_STATS_INC(icmp.proterr); - ICMP_STATS_INC(icmp.drop); - } - pbuf_free(p); - return; -lenerr: - pbuf_free(p); - ICMP_STATS_INC(icmp.lenerr); - snmp_inc_icmpinerrors(); - return; -#if LWIP_ICMP_ECHO_CHECK_INPUT_PBUF_LEN -memerr: - pbuf_free(p); - ICMP_STATS_INC(icmp.err); - snmp_inc_icmpinerrors(); - return; -#endif /* LWIP_ICMP_ECHO_CHECK_INPUT_PBUF_LEN */ -} - -/** - * Send an icmp 'destination unreachable' packet, called from ip_input() if - * the transport layer protocol is unknown and from udp_input() if the local - * port is not bound. - * - * @param p the input packet for which the 'unreachable' should be sent, - * p->payload pointing to the IP header - * @param t type of the 'unreachable' packet - */ -void -icmp_dest_unreach(struct pbuf *p, enum icmp_dur_type t) -{ - icmp_send_response(p, ICMP_DUR, t); -} - -#if IP_FORWARD || IP_REASSEMBLY -/** - * Send a 'time exceeded' packet, called from ip_forward() if TTL is 0. - * - * @param p the input packet for which the 'time exceeded' should be sent, - * p->payload pointing to the IP header - * @param t type of the 'time exceeded' packet - */ -void -icmp_time_exceeded(struct pbuf *p, enum icmp_te_type t) -{ - icmp_send_response(p, ICMP_TE, t); -} - -#endif /* IP_FORWARD || IP_REASSEMBLY */ - -/** - * Send an icmp packet in response to an incoming packet. - * - * @param p the input packet for which the 'unreachable' should be sent, - * p->payload pointing to the IP header - * @param type Type of the ICMP header - * @param code Code of the ICMP header - */ -static void -icmp_send_response(struct pbuf *p, u8_t type, u8_t code) -{ - struct pbuf *q; - struct ip_hdr *iphdr; - /* we can use the echo header here */ - struct icmp_echo_hdr *icmphdr; - ip_addr_t iphdr_src; - - /* ICMP header + IP header + 8 bytes of data */ - q = pbuf_alloc(PBUF_IP, sizeof(struct icmp_echo_hdr) + IP_HLEN + ICMP_DEST_UNREACH_DATASIZE, - PBUF_RAM); - if (q == NULL) { - LWIP_DEBUGF(ICMP_DEBUG, ("icmp_time_exceeded: failed to allocate pbuf for ICMP packet.\n")); - return; - } - LWIP_ASSERT("check that first pbuf can hold icmp message", - (q->len >= (sizeof(struct icmp_echo_hdr) + IP_HLEN + ICMP_DEST_UNREACH_DATASIZE))); - - iphdr = (struct ip_hdr *)p->payload; - LWIP_DEBUGF(ICMP_DEBUG, ("icmp_time_exceeded from ")); - ip_addr_debug_print(ICMP_DEBUG, &(iphdr->src)); - LWIP_DEBUGF(ICMP_DEBUG, (" to ")); - ip_addr_debug_print(ICMP_DEBUG, &(iphdr->dest)); - LWIP_DEBUGF(ICMP_DEBUG, ("\n")); - - icmphdr = (struct icmp_echo_hdr *)q->payload; - icmphdr->type = type; - icmphdr->code = code; - icmphdr->id = 0; - icmphdr->seqno = 0; - - /* copy fields from original packet */ - SMEMCPY((u8_t *)q->payload + sizeof(struct icmp_echo_hdr), (u8_t *)p->payload, - IP_HLEN + ICMP_DEST_UNREACH_DATASIZE); - - /* calculate checksum */ - icmphdr->chksum = 0; - icmphdr->chksum = inet_chksum(icmphdr, q->len); - ICMP_STATS_INC(icmp.xmit); - /* increase number of messages attempted to send */ - snmp_inc_icmpoutmsgs(); - /* increase number of destination unreachable messages attempted to send */ - snmp_inc_icmpouttimeexcds(); - ip_addr_copy(iphdr_src, iphdr->src); - ip_output(q, NULL, &iphdr_src, ICMP_TTL, 0, IP_PROTO_ICMP); - pbuf_free(q); -} - -#endif /* LWIP_ICMP */ diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/core/ipv4/ip4.c b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/core/ipv4/ip4.c deleted file mode 100644 index 2f76bdb5..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/core/ipv4/ip4.c +++ /dev/null @@ -1,924 +0,0 @@ -/** - * @file - * This is the IPv4 layer implementation for incoming and outgoing IP traffic. - * - * @see ip_frag.c - * - */ - -/* - * Copyright (c) 2001-2004 Swedish Institute of Computer Science. - * 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. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT - * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING - * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY - * OF SUCH DAMAGE. - * - * This file is part of the lwIP TCP/IP stack. - * - * Author: Adam Dunkels - * - */ - -#include "lwip/opt.h" -#include "lwip/ip.h" -#include "lwip/def.h" -#include "lwip/mem.h" -#include "lwip/ip_frag.h" -#include "lwip/inet_chksum.h" -#include "lwip/netif.h" -#include "lwip/icmp.h" -#include "lwip/igmp.h" -#include "lwip/raw.h" -#include "lwip/udp.h" -#include "lwip/tcp_impl.h" -#include "lwip/snmp.h" -#include "lwip/dhcp.h" -#include "lwip/autoip.h" -#include "lwip/stats.h" -#include "arch/perf.h" - -#include - -/** Set this to 0 in the rare case of wanting to call an extra function to - * generate the IP checksum (in contrast to calculating it on-the-fly). */ -#ifndef LWIP_INLINE_IP_CHKSUM -#define LWIP_INLINE_IP_CHKSUM 1 -#endif -#if LWIP_INLINE_IP_CHKSUM && CHECKSUM_GEN_IP -#define CHECKSUM_GEN_IP_INLINE 1 -#else -#define CHECKSUM_GEN_IP_INLINE 0 -#endif - -#if LWIP_DHCP || defined(LWIP_IP_ACCEPT_UDP_PORT) -#define IP_ACCEPT_LINK_LAYER_ADDRESSING 1 - -/** Some defines for DHCP to let link-layer-addressed packets through while the - * netif is down. - * To use this in your own application/protocol, define LWIP_IP_ACCEPT_UDP_PORT - * to return 1 if the port is accepted and 0 if the port is not accepted. - */ -#if LWIP_DHCP && defined(LWIP_IP_ACCEPT_UDP_PORT) -/* accept DHCP client port and custom port */ -#define IP_ACCEPT_LINK_LAYER_ADDRESSED_PORT(port) (((port) == PP_NTOHS(DHCP_CLIENT_PORT)) \ - || (LWIP_IP_ACCEPT_UDP_PORT(port))) -#elif defined(LWIP_IP_ACCEPT_UDP_PORT) /* LWIP_DHCP && defined(LWIP_IP_ACCEPT_UDP_PORT) */ -/* accept custom port only */ -#define IP_ACCEPT_LINK_LAYER_ADDRESSED_PORT(port) (LWIP_IP_ACCEPT_UDP_PORT(port)) -#else /* LWIP_DHCP && defined(LWIP_IP_ACCEPT_UDP_PORT) */ -/* accept DHCP client port only */ -#define IP_ACCEPT_LINK_LAYER_ADDRESSED_PORT(port) ((port) == PP_NTOHS(DHCP_CLIENT_PORT)) -#endif /* LWIP_DHCP && defined(LWIP_IP_ACCEPT_UDP_PORT) */ - -#else /* LWIP_DHCP */ -#define IP_ACCEPT_LINK_LAYER_ADDRESSING 0 -#endif /* LWIP_DHCP */ - -/** Global data for both IPv4 and IPv6 */ -struct ip_globals ip_data; - -/** The IP header ID of the next outgoing IP packet */ -static u16_t ip_id; - -/** - * Finds the appropriate network interface for a given IP address. It - * searches the list of network interfaces linearly. A match is found - * if the masked IP address of the network interface equals the masked - * IP address given to the function. - * - * @param dest the destination IP address for which to find the route - * @return the netif on which to send to reach dest - */ -struct netif * -ip_route(ip_addr_t *dest) -{ - struct netif *netif; - -#ifdef LWIP_HOOK_IP4_ROUTE - netif = LWIP_HOOK_IP4_ROUTE(dest); - if (netif != NULL) { - return netif; - } -#endif - - /* iterate through netifs */ - for (netif = netif_list; netif != NULL; netif = netif->next) { - /* network mask matches? */ - if (netif_is_up(netif)) { - if (ip_addr_netcmp(dest, &(netif->ip_addr), &(netif->netmask))) { - /* return netif on which to forward IP packet */ - return netif; - } - } - } - if ((netif_default == NULL) || (!netif_is_up(netif_default))) { - LWIP_DEBUGF(IP_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("ip_route: No route to %"U16_F".%"U16_F".%"U16_F".%"U16_F"\n", - ip4_addr1_16(dest), ip4_addr2_16(dest), ip4_addr3_16(dest), ip4_addr4_16(dest))); - IP_STATS_INC(ip.rterr); - snmp_inc_ipoutnoroutes(); - return NULL; - } - /* no matching netif found, use default netif */ - return netif_default; -} - -#if IP_FORWARD -/** - * Determine whether an IP address is in a reserved set of addresses - * that may not be forwarded, or whether datagrams to that destination - * may be forwarded. - * @param p the packet to forward - * @param dest the destination IP address - * @return 1: can forward 0: discard - */ -static int -ip_canforward(struct pbuf *p) -{ - u32_t addr = htonl(ip4_addr_get_u32(ip_current_dest_addr())); - - if (p->flags & PBUF_FLAG_LLBCAST) { - /* don't route link-layer broadcasts */ - return 0; - } - if ((p->flags & PBUF_FLAG_LLMCAST) && !IP_MULTICAST(addr)) { - /* don't route link-layer multicasts unless the destination address is an IP - multicast address */ - return 0; - } - if (IP_EXPERIMENTAL(addr)) { - return 0; - } - if (IP_CLASSA(addr)) { - u32_t net = addr & IP_CLASSA_NET; - if ((net == 0) || (net == ((u32_t)IP_LOOPBACKNET << IP_CLASSA_NSHIFT))) { - /* don't route loopback packets */ - return 0; - } - } - return 1; -} - -/** - * Forwards an IP packet. It finds an appropriate route for the - * packet, decrements the TTL value of the packet, adjusts the - * checksum and outputs the packet on the appropriate interface. - * - * @param p the packet to forward (p->payload points to IP header) - * @param iphdr the IP header of the input packet - * @param inp the netif on which this packet was received - */ -static void -ip_forward(struct pbuf *p, struct ip_hdr *iphdr, struct netif *inp) -{ - struct netif *netif; - - PERF_START; - - if (!ip_canforward(p)) { - goto return_noroute; - } - - /* RFC3927 2.7: do not forward link-local addresses */ - if (ip_addr_islinklocal(ip_current_dest_addr())) { - LWIP_DEBUGF(IP_DEBUG, ("ip_forward: not forwarding LLA %"U16_F".%"U16_F".%"U16_F".%"U16_F"\n", - ip4_addr1_16(ip_current_dest_addr()), ip4_addr2_16(ip_current_dest_addr()), - ip4_addr3_16(ip_current_dest_addr()), ip4_addr4_16(ip_current_dest_addr()))); - goto return_noroute; - } - - /* Find network interface where to forward this IP packet to. */ - netif = ip_route(ip_current_dest_addr()); - if (netif == NULL) { - LWIP_DEBUGF(IP_DEBUG, ("ip_forward: no forwarding route for %"U16_F".%"U16_F".%"U16_F".%"U16_F" found\n", - ip4_addr1_16(ip_current_dest_addr()), ip4_addr2_16(ip_current_dest_addr()), - ip4_addr3_16(ip_current_dest_addr()), ip4_addr4_16(ip_current_dest_addr()))); - /* @todo: send ICMP_DUR_NET? */ - goto return_noroute; - } -#if !IP_FORWARD_ALLOW_TX_ON_RX_NETIF - /* Do not forward packets onto the same network interface on which - * they arrived. */ - if (netif == inp) { - LWIP_DEBUGF(IP_DEBUG, ("ip_forward: not bouncing packets back on incoming interface.\n")); - goto return_noroute; - } -#endif /* IP_FORWARD_ALLOW_TX_ON_RX_NETIF */ - - /* decrement TTL */ - IPH_TTL_SET(iphdr, IPH_TTL(iphdr) - 1); - /* send ICMP if TTL == 0 */ - if (IPH_TTL(iphdr) == 0) { - snmp_inc_ipinhdrerrors(); -#if LWIP_ICMP - /* Don't send ICMP messages in response to ICMP messages */ - if (IPH_PROTO(iphdr) != IP_PROTO_ICMP) { - icmp_time_exceeded(p, ICMP_TE_TTL); - } -#endif /* LWIP_ICMP */ - return; - } - - /* Incrementally update the IP checksum. */ - if (IPH_CHKSUM(iphdr) >= PP_HTONS(0xffffU - 0x100)) { - IPH_CHKSUM_SET(iphdr, IPH_CHKSUM(iphdr) + PP_HTONS(0x100) + 1); - } else { - IPH_CHKSUM_SET(iphdr, IPH_CHKSUM(iphdr) + PP_HTONS(0x100)); - } - - LWIP_DEBUGF(IP_DEBUG, ("ip_forward: forwarding packet to %"U16_F".%"U16_F".%"U16_F".%"U16_F"\n", - ip4_addr1_16(ip_current_dest_addr()), ip4_addr2_16(ip_current_dest_addr()), - ip4_addr3_16(ip_current_dest_addr()), ip4_addr4_16(ip_current_dest_addr()))); - - IP_STATS_INC(ip.fw); - IP_STATS_INC(ip.xmit); - snmp_inc_ipforwdatagrams(); - - PERF_STOP("ip_forward"); - /* don't fragment if interface has mtu set to 0 [loopif] */ - if (netif->mtu && (p->tot_len > netif->mtu)) { - if ((IPH_OFFSET(iphdr) & PP_NTOHS(IP_DF)) == 0) { -#if IP_FRAG - ip_frag(p, netif, ip_current_dest_addr()); -#else /* IP_FRAG */ - /* @todo: send ICMP Destination Unreacheable code 13 "Communication administratively prohibited"? */ -#endif /* IP_FRAG */ - } else { - /* send ICMP Destination Unreacheable code 4: "Fragmentation Needed and DF Set" */ - icmp_dest_unreach(p, ICMP_DUR_FRAG); - } - return; - } - /* transmit pbuf on chosen interface */ - netif->output(netif, p, ip_current_dest_addr()); - return; -return_noroute: - snmp_inc_ipoutnoroutes(); -} -#endif /* IP_FORWARD */ - -/** - * This function is called by the network interface device driver when - * an IP packet is received. The function does the basic checks of the - * IP header such as packet size being at least larger than the header - * size etc. If the packet was not destined for us, the packet is - * forwarded (using ip_forward). The IP checksum is always checked. - * - * Finally, the packet is sent to the upper layer protocol input function. - * - * @param p the received IP packet (p->payload points to IP header) - * @param inp the netif on which this packet was received - * @return ERR_OK if the packet was processed (could return ERR_* if it wasn't - * processed, but currently always returns ERR_OK) - */ -err_t -ip_input(struct pbuf *p, struct netif *inp) -{ - struct ip_hdr *iphdr; - struct netif *netif; - u16_t iphdr_hlen; - u16_t iphdr_len; -#if IP_ACCEPT_LINK_LAYER_ADDRESSING - int check_ip_src=1; -#endif /* IP_ACCEPT_LINK_LAYER_ADDRESSING */ - - IP_STATS_INC(ip.recv); - snmp_inc_ipinreceives(); - - /* identify the IP header */ - iphdr = (struct ip_hdr *)p->payload; - if (IPH_V(iphdr) != 4) { - LWIP_DEBUGF(IP_DEBUG | LWIP_DBG_LEVEL_WARNING, ("IP packet dropped due to bad version number %"U16_F"\n", IPH_V(iphdr))); - ip_debug_print(p); - pbuf_free(p); - IP_STATS_INC(ip.err); - IP_STATS_INC(ip.drop); - snmp_inc_ipinhdrerrors(); - return ERR_OK; - } - -#ifdef LWIP_HOOK_IP4_INPUT - if (LWIP_HOOK_IP4_INPUT(p, inp)) { - /* the packet has been eaten */ - return ERR_OK; - } -#endif - - /* obtain IP header length in number of 32-bit words */ - iphdr_hlen = IPH_HL(iphdr); - /* calculate IP header length in bytes */ - iphdr_hlen *= 4; - /* obtain ip length in bytes */ - iphdr_len = ntohs(IPH_LEN(iphdr)); - - /* header length exceeds first pbuf length, or ip length exceeds total pbuf length? */ - if ((iphdr_hlen > p->len) || (iphdr_len > p->tot_len)) { - if (iphdr_hlen > p->len) { - LWIP_DEBUGF(IP_DEBUG | LWIP_DBG_LEVEL_SERIOUS, - ("IP header (len %"U16_F") does not fit in first pbuf (len %"U16_F"), IP packet dropped.\n", - iphdr_hlen, p->len)); - } - if (iphdr_len > p->tot_len) { - LWIP_DEBUGF(IP_DEBUG | LWIP_DBG_LEVEL_SERIOUS, - ("IP (len %"U16_F") is longer than pbuf (len %"U16_F"), IP packet dropped.\n", - iphdr_len, p->tot_len)); - } - /* free (drop) packet pbufs */ - pbuf_free(p); - IP_STATS_INC(ip.lenerr); - IP_STATS_INC(ip.drop); - snmp_inc_ipindiscards(); - return ERR_OK; - } - - /* verify checksum */ -#if CHECKSUM_CHECK_IP - if (inet_chksum(iphdr, iphdr_hlen) != 0) { - - LWIP_DEBUGF(IP_DEBUG | LWIP_DBG_LEVEL_SERIOUS, - ("Checksum (0x%"X16_F") failed, IP packet dropped.\n", inet_chksum(iphdr, iphdr_hlen))); - ip_debug_print(p); - pbuf_free(p); - IP_STATS_INC(ip.chkerr); - IP_STATS_INC(ip.drop); - snmp_inc_ipinhdrerrors(); - return ERR_OK; - } -#endif - - /* Trim pbuf. This should have been done at the netif layer, - * but we'll do it anyway just to be sure that its done. */ - pbuf_realloc(p, iphdr_len); - - /* copy IP addresses to aligned ip_addr_t */ - ip_addr_copy(*ipX_2_ip(&ip_data.current_iphdr_dest), iphdr->dest); - ip_addr_copy(*ipX_2_ip(&ip_data.current_iphdr_src), iphdr->src); - - /* match packet against an interface, i.e. is this packet for us? */ -#if LWIP_IGMP - if (ip_addr_ismulticast(ip_current_dest_addr())) { - if ((inp->flags & NETIF_FLAG_IGMP) && (igmp_lookfor_group(inp, ip_current_dest_addr()))) { - netif = inp; - } else { - netif = NULL; - } - } else -#endif /* LWIP_IGMP */ - { - /* start trying with inp. if that's not acceptable, start walking the - list of configured netifs. - 'first' is used as a boolean to mark whether we started walking the list */ - int first = 1; - netif = inp; - do { - LWIP_DEBUGF(IP_DEBUG, ("ip_input: iphdr->dest 0x%"X32_F" netif->ip_addr 0x%"X32_F" (0x%"X32_F", 0x%"X32_F", 0x%"X32_F")\n", - ip4_addr_get_u32(&iphdr->dest), ip4_addr_get_u32(&netif->ip_addr), - ip4_addr_get_u32(&iphdr->dest) & ip4_addr_get_u32(&netif->netmask), - ip4_addr_get_u32(&netif->ip_addr) & ip4_addr_get_u32(&netif->netmask), - ip4_addr_get_u32(&iphdr->dest) & ~ip4_addr_get_u32(&netif->netmask))); - - /* interface is up and configured? */ - if ((netif_is_up(netif)) && (!ip_addr_isany(&(netif->ip_addr)))) { - /* unicast to this interface address? */ - if (ip_addr_cmp(ip_current_dest_addr(), &(netif->ip_addr)) || - /* or broadcast on this interface network address? */ - ip_addr_isbroadcast(ip_current_dest_addr(), netif)) { - LWIP_DEBUGF(IP_DEBUG, ("ip_input: packet accepted on interface %c%c\n", - netif->name[0], netif->name[1])); - /* break out of for loop */ - break; - } -#if LWIP_AUTOIP - /* connections to link-local addresses must persist after changing - the netif's address (RFC3927 ch. 1.9) */ - if ((netif->autoip != NULL) && - ip_addr_cmp(ip_current_dest_addr(), &(netif->autoip->llipaddr))) { - LWIP_DEBUGF(IP_DEBUG, ("ip_input: LLA packet accepted on interface %c%c\n", - netif->name[0], netif->name[1])); - /* break out of for loop */ - break; - } -#endif /* LWIP_AUTOIP */ - } - if (first) { - first = 0; - netif = netif_list; - } else { - netif = netif->next; - } - if (netif == inp) { - netif = netif->next; - } - } while(netif != NULL); - } - -#if IP_ACCEPT_LINK_LAYER_ADDRESSING - /* Pass DHCP messages regardless of destination address. DHCP traffic is addressed - * using link layer addressing (such as Ethernet MAC) so we must not filter on IP. - * According to RFC 1542 section 3.1.1, referred by RFC 2131). - * - * If you want to accept private broadcast communication while a netif is down, - * define LWIP_IP_ACCEPT_UDP_PORT(dst_port), e.g.: - * - * #define LWIP_IP_ACCEPT_UDP_PORT(dst_port) ((dst_port) == PP_NTOHS(12345)) - */ - if (netif == NULL) { - /* remote port is DHCP server? */ - if (IPH_PROTO(iphdr) == IP_PROTO_UDP) { - struct udp_hdr *udphdr = (struct udp_hdr *)((u8_t *)iphdr + iphdr_hlen); - LWIP_DEBUGF(IP_DEBUG | LWIP_DBG_TRACE, ("ip_input: UDP packet to DHCP client port %"U16_F"\n", - ntohs(udphdr->dest))); - if (IP_ACCEPT_LINK_LAYER_ADDRESSED_PORT(udphdr->dest)) { - LWIP_DEBUGF(IP_DEBUG | LWIP_DBG_TRACE, ("ip_input: DHCP packet accepted.\n")); - netif = inp; - check_ip_src = 0; - } - } - } -#endif /* IP_ACCEPT_LINK_LAYER_ADDRESSING */ - - /* broadcast or multicast packet source address? Compliant with RFC 1122: 3.2.1.3 */ -#if IP_ACCEPT_LINK_LAYER_ADDRESSING - /* DHCP servers need 0.0.0.0 to be allowed as source address (RFC 1.1.2.2: 3.2.1.3/a) */ - if (check_ip_src && !ip_addr_isany(ip_current_src_addr())) -#endif /* IP_ACCEPT_LINK_LAYER_ADDRESSING */ - { if ((ip_addr_isbroadcast(ip_current_src_addr(), inp)) || - (ip_addr_ismulticast(ip_current_src_addr()))) { - /* packet source is not valid */ - LWIP_DEBUGF(IP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_WARNING, ("ip_input: packet source is not valid.\n")); - /* free (drop) packet pbufs */ - pbuf_free(p); - IP_STATS_INC(ip.drop); - snmp_inc_ipinaddrerrors(); - snmp_inc_ipindiscards(); - return ERR_OK; - } - } - - /* if we're pretending we are everyone for TCP, assume the packet is for source interface if it - isn't for a local address */ - if (netif == NULL && (inp->flags & NETIF_FLAG_PRETEND_TCP) && IPH_PROTO(iphdr) == IP_PROTO_TCP) { - netif = inp; - } - - /* packet not for us? */ - if (netif == NULL) { - /* packet not for us, route or discard */ - LWIP_DEBUGF(IP_DEBUG | LWIP_DBG_TRACE, ("ip_input: packet not for us.\n")); -#if IP_FORWARD - /* non-broadcast packet? */ - if (!ip_addr_isbroadcast(ip_current_dest_addr(), inp)) { - /* try to forward IP packet on (other) interfaces */ - ip_forward(p, iphdr, inp); - } else -#endif /* IP_FORWARD */ - { - snmp_inc_ipinaddrerrors(); - snmp_inc_ipindiscards(); - } - pbuf_free(p); - return ERR_OK; - } - /* packet consists of multiple fragments? */ - if ((IPH_OFFSET(iphdr) & PP_HTONS(IP_OFFMASK | IP_MF)) != 0) { -#if IP_REASSEMBLY /* packet fragment reassembly code present? */ - LWIP_DEBUGF(IP_DEBUG, ("IP packet is a fragment (id=0x%04"X16_F" tot_len=%"U16_F" len=%"U16_F" MF=%"U16_F" offset=%"U16_F"), calling ip_reass()\n", - ntohs(IPH_ID(iphdr)), p->tot_len, ntohs(IPH_LEN(iphdr)), !!(IPH_OFFSET(iphdr) & PP_HTONS(IP_MF)), (ntohs(IPH_OFFSET(iphdr)) & IP_OFFMASK)*8)); - /* reassemble the packet*/ - p = ip_reass(p); - /* packet not fully reassembled yet? */ - if (p == NULL) { - return ERR_OK; - } - iphdr = (struct ip_hdr *)p->payload; -#else /* IP_REASSEMBLY == 0, no packet fragment reassembly code present */ - pbuf_free(p); - LWIP_DEBUGF(IP_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("IP packet dropped since it was fragmented (0x%"X16_F") (while IP_REASSEMBLY == 0).\n", - ntohs(IPH_OFFSET(iphdr)))); - IP_STATS_INC(ip.opterr); - IP_STATS_INC(ip.drop); - /* unsupported protocol feature */ - snmp_inc_ipinunknownprotos(); - return ERR_OK; -#endif /* IP_REASSEMBLY */ - } - -#if IP_OPTIONS_ALLOWED == 0 /* no support for IP options in the IP header? */ - -#if LWIP_IGMP - /* there is an extra "router alert" option in IGMP messages which we allow for but do not police */ - if((iphdr_hlen > IP_HLEN) && (IPH_PROTO(iphdr) != IP_PROTO_IGMP)) { -#else - if (iphdr_hlen > IP_HLEN) { -#endif /* LWIP_IGMP */ - LWIP_DEBUGF(IP_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("IP packet dropped since there were IP options (while IP_OPTIONS_ALLOWED == 0).\n")); - pbuf_free(p); - IP_STATS_INC(ip.opterr); - IP_STATS_INC(ip.drop); - /* unsupported protocol feature */ - snmp_inc_ipinunknownprotos(); - return ERR_OK; - } -#endif /* IP_OPTIONS_ALLOWED == 0 */ - - /* send to upper layers */ - LWIP_DEBUGF(IP_DEBUG, ("ip_input: \n")); - ip_debug_print(p); - LWIP_DEBUGF(IP_DEBUG, ("ip_input: p->len %"U16_F" p->tot_len %"U16_F"\n", p->len, p->tot_len)); - - ip_data.current_netif = inp; - ip_data.current_ip4_header = iphdr; - ip_data.current_ip_header_tot_len = IPH_HL(iphdr) * 4; - -#if LWIP_RAW - /* raw input did not eat the packet? */ - if (raw_input(p, inp) == 0) -#endif /* LWIP_RAW */ - { - pbuf_header(p, -iphdr_hlen); /* Move to payload, no check necessary. */ - - switch (IPH_PROTO(iphdr)) { -#if LWIP_UDP - case IP_PROTO_UDP: -#if LWIP_UDPLITE - case IP_PROTO_UDPLITE: -#endif /* LWIP_UDPLITE */ - snmp_inc_ipindelivers(); - udp_input(p, inp); - break; -#endif /* LWIP_UDP */ -#if LWIP_TCP - case IP_PROTO_TCP: - snmp_inc_ipindelivers(); - tcp_input(p, inp); - break; -#endif /* LWIP_TCP */ -#if LWIP_ICMP - case IP_PROTO_ICMP: - snmp_inc_ipindelivers(); - icmp_input(p, inp); - break; -#endif /* LWIP_ICMP */ -#if LWIP_IGMP - case IP_PROTO_IGMP: - igmp_input(p, inp, ip_current_dest_addr()); - break; -#endif /* LWIP_IGMP */ - default: -#if LWIP_ICMP - /* send ICMP destination protocol unreachable unless is was a broadcast */ - if (!ip_addr_isbroadcast(ip_current_dest_addr(), inp) && - !ip_addr_ismulticast(ip_current_dest_addr())) { - pbuf_header(p, iphdr_hlen); /* Move to ip header, no check necessary. */ - p->payload = iphdr; - icmp_dest_unreach(p, ICMP_DUR_PROTO); - } -#endif /* LWIP_ICMP */ - pbuf_free(p); - - LWIP_DEBUGF(IP_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("Unsupported transport protocol %"U16_F"\n", IPH_PROTO(iphdr))); - - IP_STATS_INC(ip.proterr); - IP_STATS_INC(ip.drop); - snmp_inc_ipinunknownprotos(); - } - } - - /* @todo: this is not really necessary... */ - ip_data.current_netif = NULL; - ip_data.current_ip4_header = NULL; - ip_data.current_ip_header_tot_len = 0; - ip_addr_set_any(ip_current_src_addr()); - ip_addr_set_any(ip_current_dest_addr()); - - return ERR_OK; -} - -/** - * Sends an IP packet on a network interface. This function constructs - * the IP header and calculates the IP header checksum. If the source - * IP address is NULL, the IP address of the outgoing network - * interface is filled in as source address. - * If the destination IP address is IP_HDRINCL, p is assumed to already - * include an IP header and p->payload points to it instead of the data. - * - * @param p the packet to send (p->payload points to the data, e.g. next - protocol header; if dest == IP_HDRINCL, p already includes an IP - header and p->payload points to that IP header) - * @param src the source IP address to send from (if src == IP_ADDR_ANY, the - * IP address of the netif used to send is used as source address) - * @param dest the destination IP address to send the packet to - * @param ttl the TTL value to be set in the IP header - * @param tos the TOS value to be set in the IP header - * @param proto the PROTOCOL to be set in the IP header - * @param netif the netif on which to send this packet - * @return ERR_OK if the packet was sent OK - * ERR_BUF if p doesn't have enough space for IP/LINK headers - * returns errors returned by netif->output - * - * @note ip_id: RFC791 "some host may be able to simply use - * unique identifiers independent of destination" - */ -err_t -ip_output_if(struct pbuf *p, ip_addr_t *src, ip_addr_t *dest, - u8_t ttl, u8_t tos, - u8_t proto, struct netif *netif) -{ -#if IP_OPTIONS_SEND - return ip_output_if_opt(p, src, dest, ttl, tos, proto, netif, NULL, 0); -} - -/** - * Same as ip_output_if() but with the possibility to include IP options: - * - * @ param ip_options pointer to the IP options, copied into the IP header - * @ param optlen length of ip_options - */ -err_t ip_output_if_opt(struct pbuf *p, ip_addr_t *src, ip_addr_t *dest, - u8_t ttl, u8_t tos, u8_t proto, struct netif *netif, void *ip_options, - u16_t optlen) -{ -#endif /* IP_OPTIONS_SEND */ - struct ip_hdr *iphdr; - ip_addr_t dest_addr; -#if CHECKSUM_GEN_IP_INLINE - u32_t chk_sum = 0; -#endif /* CHECKSUM_GEN_IP_INLINE */ - - /* pbufs passed to IP must have a ref-count of 1 as their payload pointer - gets altered as the packet is passed down the stack */ - LWIP_ASSERT("p->ref == 1", p->ref == 1); - - snmp_inc_ipoutrequests(); - - /* Should the IP header be generated or is it already included in p? */ - if (dest != IP_HDRINCL) { - u16_t ip_hlen = IP_HLEN; -#if IP_OPTIONS_SEND - u16_t optlen_aligned = 0; - if (optlen != 0) { -#if CHECKSUM_GEN_IP_INLINE - int i; -#endif /* CHECKSUM_GEN_IP_INLINE */ - /* round up to a multiple of 4 */ - optlen_aligned = ((optlen + 3) & ~3); - ip_hlen += optlen_aligned; - /* First write in the IP options */ - if (pbuf_header(p, optlen_aligned)) { - LWIP_DEBUGF(IP_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("ip_output_if_opt: not enough room for IP options in pbuf\n")); - IP_STATS_INC(ip.err); - snmp_inc_ipoutdiscards(); - return ERR_BUF; - } - MEMCPY(p->payload, ip_options, optlen); - if (optlen < optlen_aligned) { - /* zero the remaining bytes */ - memset(((char*)p->payload) + optlen, 0, optlen_aligned - optlen); - } -#if CHECKSUM_GEN_IP_INLINE - for (i = 0; i < optlen_aligned/2; i++) { - chk_sum += ((u16_t*)p->payload)[i]; - } -#endif /* CHECKSUM_GEN_IP_INLINE */ - } -#endif /* IP_OPTIONS_SEND */ - /* generate IP header */ - if (pbuf_header(p, IP_HLEN)) { - LWIP_DEBUGF(IP_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("ip_output: not enough room for IP header in pbuf\n")); - - IP_STATS_INC(ip.err); - snmp_inc_ipoutdiscards(); - return ERR_BUF; - } - - iphdr = (struct ip_hdr *)p->payload; - LWIP_ASSERT("check that first pbuf can hold struct ip_hdr", - (p->len >= sizeof(struct ip_hdr))); - - IPH_TTL_SET(iphdr, ttl); - IPH_PROTO_SET(iphdr, proto); -#if CHECKSUM_GEN_IP_INLINE - chk_sum += LWIP_MAKE_U16(proto, ttl); -#endif /* CHECKSUM_GEN_IP_INLINE */ - - /* dest cannot be NULL here */ - ip_addr_copy(iphdr->dest, *dest); -#if CHECKSUM_GEN_IP_INLINE - chk_sum += ip4_addr_get_u32(&iphdr->dest) & 0xFFFF; - chk_sum += ip4_addr_get_u32(&iphdr->dest) >> 16; -#endif /* CHECKSUM_GEN_IP_INLINE */ - - IPH_VHL_SET(iphdr, 4, ip_hlen / 4); - IPH_TOS_SET(iphdr, tos); -#if CHECKSUM_GEN_IP_INLINE - chk_sum += LWIP_MAKE_U16(tos, iphdr->_v_hl); -#endif /* CHECKSUM_GEN_IP_INLINE */ - IPH_LEN_SET(iphdr, htons(p->tot_len)); -#if CHECKSUM_GEN_IP_INLINE - chk_sum += iphdr->_len; -#endif /* CHECKSUM_GEN_IP_INLINE */ - IPH_OFFSET_SET(iphdr, (u16_t)(0 | (IP_DF << 4))); - IPH_ID_SET(iphdr, htons(ip_id)); -#if CHECKSUM_GEN_IP_INLINE - chk_sum += iphdr->_id; -#endif /* CHECKSUM_GEN_IP_INLINE */ - ++ip_id; - - if (ip_addr_isany(src)) { - ip_addr_copy(iphdr->src, netif->ip_addr); - } else { - /* src cannot be NULL here */ - ip_addr_copy(iphdr->src, *src); - } - -#if CHECKSUM_GEN_IP_INLINE - chk_sum += ip4_addr_get_u32(&iphdr->src) & 0xFFFF; - chk_sum += ip4_addr_get_u32(&iphdr->src) >> 16; - chk_sum = (chk_sum >> 16) + (chk_sum & 0xFFFF); - chk_sum = (chk_sum >> 16) + chk_sum; - chk_sum = ~chk_sum; - iphdr->_chksum = chk_sum; /* network order */ -#else /* CHECKSUM_GEN_IP_INLINE */ - IPH_CHKSUM_SET(iphdr, 0); -#if CHECKSUM_GEN_IP - IPH_CHKSUM_SET(iphdr, inet_chksum(iphdr, ip_hlen)); -#endif -#endif /* CHECKSUM_GEN_IP_INLINE */ - } else { - /* IP header already included in p */ - iphdr = (struct ip_hdr *)p->payload; - ip_addr_copy(dest_addr, iphdr->dest); - dest = &dest_addr; - } - - IP_STATS_INC(ip.xmit); - - LWIP_DEBUGF(IP_DEBUG, ("ip_output_if: %c%c%"U16_F"\n", netif->name[0], netif->name[1], netif->num)); - ip_debug_print(p); - -#if ENABLE_LOOPBACK - if (ip_addr_cmp(dest, &netif->ip_addr)) { - /* Packet to self, enqueue it for loopback */ - LWIP_DEBUGF(IP_DEBUG, ("netif_loop_output()")); - return netif_loop_output(netif, p, dest); - } -#if LWIP_IGMP - if ((p->flags & PBUF_FLAG_MCASTLOOP) != 0) { - netif_loop_output(netif, p, dest); - } -#endif /* LWIP_IGMP */ -#endif /* ENABLE_LOOPBACK */ -#if IP_FRAG - /* don't fragment if interface has mtu set to 0 [loopif] */ - if (netif->mtu && (p->tot_len > netif->mtu)) { - return ip_frag(p, netif, dest); - } -#endif /* IP_FRAG */ - - LWIP_DEBUGF(IP_DEBUG, ("netif->output()")); - return netif->output(netif, p, dest); -} - -/** - * Simple interface to ip_output_if. It finds the outgoing network - * interface and calls upon ip_output_if to do the actual work. - * - * @param p the packet to send (p->payload points to the data, e.g. next - protocol header; if dest == IP_HDRINCL, p already includes an IP - header and p->payload points to that IP header) - * @param src the source IP address to send from (if src == IP_ADDR_ANY, the - * IP address of the netif used to send is used as source address) - * @param dest the destination IP address to send the packet to - * @param ttl the TTL value to be set in the IP header - * @param tos the TOS value to be set in the IP header - * @param proto the PROTOCOL to be set in the IP header - * - * @return ERR_RTE if no route is found - * see ip_output_if() for more return values - */ -err_t -ip_output(struct pbuf *p, ip_addr_t *src, ip_addr_t *dest, - u8_t ttl, u8_t tos, u8_t proto) -{ - struct netif *netif; - - /* pbufs passed to IP must have a ref-count of 1 as their payload pointer - gets altered as the packet is passed down the stack */ - LWIP_ASSERT("p->ref == 1", p->ref == 1); - - if ((netif = ip_route(dest)) == NULL) { - LWIP_DEBUGF(IP_DEBUG, ("ip_output: No route to %"U16_F".%"U16_F".%"U16_F".%"U16_F"\n", - ip4_addr1_16(dest), ip4_addr2_16(dest), ip4_addr3_16(dest), ip4_addr4_16(dest))); - IP_STATS_INC(ip.rterr); - return ERR_RTE; - } - - return ip_output_if(p, src, dest, ttl, tos, proto, netif); -} - -#if LWIP_NETIF_HWADDRHINT -/** Like ip_output, but takes and addr_hint pointer that is passed on to netif->addr_hint - * before calling ip_output_if. - * - * @param p the packet to send (p->payload points to the data, e.g. next - protocol header; if dest == IP_HDRINCL, p already includes an IP - header and p->payload points to that IP header) - * @param src the source IP address to send from (if src == IP_ADDR_ANY, the - * IP address of the netif used to send is used as source address) - * @param dest the destination IP address to send the packet to - * @param ttl the TTL value to be set in the IP header - * @param tos the TOS value to be set in the IP header - * @param proto the PROTOCOL to be set in the IP header - * @param addr_hint address hint pointer set to netif->addr_hint before - * calling ip_output_if() - * - * @return ERR_RTE if no route is found - * see ip_output_if() for more return values - */ -err_t -ip_output_hinted(struct pbuf *p, ip_addr_t *src, ip_addr_t *dest, - u8_t ttl, u8_t tos, u8_t proto, u8_t *addr_hint) -{ - struct netif *netif; - err_t err; - - /* pbufs passed to IP must have a ref-count of 1 as their payload pointer - gets altered as the packet is passed down the stack */ - LWIP_ASSERT("p->ref == 1", p->ref == 1); - - if ((netif = ip_route(dest)) == NULL) { - LWIP_DEBUGF(IP_DEBUG, ("ip_output: No route to %"U16_F".%"U16_F".%"U16_F".%"U16_F"\n", - ip4_addr1_16(dest), ip4_addr2_16(dest), ip4_addr3_16(dest), ip4_addr4_16(dest))); - IP_STATS_INC(ip.rterr); - return ERR_RTE; - } - - NETIF_SET_HWADDRHINT(netif, addr_hint); - err = ip_output_if(p, src, dest, ttl, tos, proto, netif); - NETIF_SET_HWADDRHINT(netif, NULL); - - return err; -} -#endif /* LWIP_NETIF_HWADDRHINT*/ - -#if IP_DEBUG -/* Print an IP header by using LWIP_DEBUGF - * @param p an IP packet, p->payload pointing to the IP header - */ -void -ip_debug_print(struct pbuf *p) -{ - struct ip_hdr *iphdr = (struct ip_hdr *)p->payload; - - LWIP_DEBUGF(IP_DEBUG, ("IP header:\n")); - LWIP_DEBUGF(IP_DEBUG, ("+-------------------------------+\n")); - LWIP_DEBUGF(IP_DEBUG, ("|%2"S16_F" |%2"S16_F" | 0x%02"X16_F" | %5"U16_F" | (v, hl, tos, len)\n", - IPH_V(iphdr), - IPH_HL(iphdr), - IPH_TOS(iphdr), - ntohs(IPH_LEN(iphdr)))); - LWIP_DEBUGF(IP_DEBUG, ("+-------------------------------+\n")); - LWIP_DEBUGF(IP_DEBUG, ("| %5"U16_F" |%"U16_F"%"U16_F"%"U16_F"| %4"U16_F" | (id, flags, offset)\n", - ntohs(IPH_ID(iphdr)), - ntohs(IPH_OFFSET(iphdr)) >> 15 & 1, - ntohs(IPH_OFFSET(iphdr)) >> 14 & 1, - ntohs(IPH_OFFSET(iphdr)) >> 13 & 1, - ntohs(IPH_OFFSET(iphdr)) & IP_OFFMASK)); - LWIP_DEBUGF(IP_DEBUG, ("+-------------------------------+\n")); - LWIP_DEBUGF(IP_DEBUG, ("| %3"U16_F" | %3"U16_F" | 0x%04"X16_F" | (ttl, proto, chksum)\n", - IPH_TTL(iphdr), - IPH_PROTO(iphdr), - ntohs(IPH_CHKSUM(iphdr)))); - LWIP_DEBUGF(IP_DEBUG, ("+-------------------------------+\n")); - LWIP_DEBUGF(IP_DEBUG, ("| %3"U16_F" | %3"U16_F" | %3"U16_F" | %3"U16_F" | (src)\n", - ip4_addr1_16(&iphdr->src), - ip4_addr2_16(&iphdr->src), - ip4_addr3_16(&iphdr->src), - ip4_addr4_16(&iphdr->src))); - LWIP_DEBUGF(IP_DEBUG, ("+-------------------------------+\n")); - LWIP_DEBUGF(IP_DEBUG, ("| %3"U16_F" | %3"U16_F" | %3"U16_F" | %3"U16_F" | (dest)\n", - ip4_addr1_16(&iphdr->dest), - ip4_addr2_16(&iphdr->dest), - ip4_addr3_16(&iphdr->dest), - ip4_addr4_16(&iphdr->dest))); - LWIP_DEBUGF(IP_DEBUG, ("+-------------------------------+\n")); -} -#endif /* IP_DEBUG */ diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/core/ipv4/ip4_addr.c b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/core/ipv4/ip4_addr.c deleted file mode 100644 index 8f633ff2..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/core/ipv4/ip4_addr.c +++ /dev/null @@ -1,312 +0,0 @@ -/** - * @file - * This is the IPv4 address tools implementation. - * - */ - -/* - * Copyright (c) 2001-2004 Swedish Institute of Computer Science. - * 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. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT - * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING - * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY - * OF SUCH DAMAGE. - * - * This file is part of the lwIP TCP/IP stack. - * - * Author: Adam Dunkels - * - */ - -#include "lwip/opt.h" -#include "lwip/ip_addr.h" -#include "lwip/netif.h" - -/* used by IP_ADDR_ANY and IP_ADDR_BROADCAST in ip_addr.h */ -const ip_addr_t ip_addr_any = { IPADDR_ANY }; -const ip_addr_t ip_addr_broadcast = { IPADDR_BROADCAST }; - -/** - * Determine if an address is a broadcast address on a network interface - * - * @param addr address to be checked - * @param netif the network interface against which the address is checked - * @return returns non-zero if the address is a broadcast address - */ -u8_t -ip4_addr_isbroadcast(u32_t addr, const struct netif *netif) -{ - ip_addr_t ipaddr; - ip4_addr_set_u32(&ipaddr, addr); - - /* all ones (broadcast) or all zeroes (old skool broadcast) */ - if ((~addr == IPADDR_ANY) || - (addr == IPADDR_ANY)) { - return 1; - /* no broadcast support on this network interface? */ - } else if ((netif->flags & NETIF_FLAG_BROADCAST) == 0) { - /* the given address cannot be a broadcast address - * nor can we check against any broadcast addresses */ - return 0; - /* address matches network interface address exactly? => no broadcast */ - } else if (addr == ip4_addr_get_u32(&netif->ip_addr)) { - return 0; - /* on the same (sub) network... */ - } else if (ip_addr_netcmp(&ipaddr, &(netif->ip_addr), &(netif->netmask)) - /* ...and host identifier bits are all ones? =>... */ - && ((addr & ~ip4_addr_get_u32(&netif->netmask)) == - (IPADDR_BROADCAST & ~ip4_addr_get_u32(&netif->netmask)))) { - /* => network broadcast address */ - return 1; - } else { - return 0; - } -} - -/** Checks if a netmask is valid (starting with ones, then only zeros) - * - * @param netmask the IPv4 netmask to check (in network byte order!) - * @return 1 if the netmask is valid, 0 if it is not - */ -u8_t -ip4_addr_netmask_valid(u32_t netmask) -{ - u32_t mask; - u32_t nm_hostorder = lwip_htonl(netmask); - - /* first, check for the first zero */ - for (mask = 1UL << 31 ; mask != 0; mask >>= 1) { - if ((nm_hostorder & mask) == 0) { - break; - } - } - /* then check that there is no one */ - for (; mask != 0; mask >>= 1) { - if ((nm_hostorder & mask) != 0) { - /* there is a one after the first zero -> invalid */ - return 0; - } - } - /* no one after the first zero -> valid */ - return 1; -} - -/* Here for now until needed in other places in lwIP */ -#ifndef isprint -#define in_range(c, lo, up) ((u8_t)c >= lo && (u8_t)c <= up) -#define isprint(c) in_range(c, 0x20, 0x7f) -#define isdigit(c) in_range(c, '0', '9') -#define isxdigit(c) (isdigit(c) || in_range(c, 'a', 'f') || in_range(c, 'A', 'F')) -#define islower(c) in_range(c, 'a', 'z') -#define isspace(c) (c == ' ' || c == '\f' || c == '\n' || c == '\r' || c == '\t' || c == '\v') -#endif - -/** - * Ascii internet address interpretation routine. - * The value returned is in network order. - * - * @param cp IP address in ascii represenation (e.g. "127.0.0.1") - * @return ip address in network order - */ -u32_t -ipaddr_addr(const char *cp) -{ - ip_addr_t val; - - if (ipaddr_aton(cp, &val)) { - return ip4_addr_get_u32(&val); - } - return (IPADDR_NONE); -} - -/** - * Check whether "cp" is a valid ascii representation - * of an Internet address and convert to a binary address. - * Returns 1 if the address is valid, 0 if not. - * This replaces inet_addr, the return value from which - * cannot distinguish between failure and a local broadcast address. - * - * @param cp IP address in ascii represenation (e.g. "127.0.0.1") - * @param addr pointer to which to save the ip address in network order - * @return 1 if cp could be converted to addr, 0 on failure - */ -int -ipaddr_aton(const char *cp, ip_addr_t *addr) -{ - u32_t val; - u8_t base; - char c; - u32_t parts[4]; - u32_t *pp = parts; - - c = *cp; - for (;;) { - /* - * Collect number up to ``.''. - * Values are specified as for C: - * 0x=hex, 0=octal, 1-9=decimal. - */ - if (!isdigit(c)) - return (0); - val = 0; - base = 10; - if (c == '0') { - c = *++cp; - if (c == 'x' || c == 'X') { - base = 16; - c = *++cp; - } else - base = 8; - } - for (;;) { - if (isdigit(c)) { - val = (val * base) + (int)(c - '0'); - c = *++cp; - } else if (base == 16 && isxdigit(c)) { - val = (val << 4) | (int)(c + 10 - (islower(c) ? 'a' : 'A')); - c = *++cp; - } else - break; - } - if (c == '.') { - /* - * Internet format: - * a.b.c.d - * a.b.c (with c treated as 16 bits) - * a.b (with b treated as 24 bits) - */ - if (pp >= parts + 3) { - return (0); - } - *pp++ = val; - c = *++cp; - } else - break; - } - /* - * Check for trailing characters. - */ - if (c != '\0' && !isspace(c)) { - return (0); - } - /* - * Concoct the address according to - * the number of parts specified. - */ - switch (pp - parts + 1) { - - case 0: - return (0); /* initial nondigit */ - - case 1: /* a -- 32 bits */ - break; - - case 2: /* a.b -- 8.24 bits */ - if (val > 0xffffffUL) { - return (0); - } - val |= parts[0] << 24; - break; - - case 3: /* a.b.c -- 8.8.16 bits */ - if (val > 0xffff) { - return (0); - } - val |= (parts[0] << 24) | (parts[1] << 16); - break; - - case 4: /* a.b.c.d -- 8.8.8.8 bits */ - if (val > 0xff) { - return (0); - } - val |= (parts[0] << 24) | (parts[1] << 16) | (parts[2] << 8); - break; - default: - LWIP_ASSERT("unhandled", 0); - break; - } - if (addr) { - ip4_addr_set_u32(addr, htonl(val)); - } - return (1); -} - -/** - * Convert numeric IP address into decimal dotted ASCII representation. - * returns ptr to static buffer; not reentrant! - * - * @param addr ip address in network order to convert - * @return pointer to a global static (!) buffer that holds the ASCII - * represenation of addr - */ -char * -ipaddr_ntoa(const ip_addr_t *addr) -{ - static char str[16]; - return ipaddr_ntoa_r(addr, str, 16); -} - -/** - * Same as ipaddr_ntoa, but reentrant since a user-supplied buffer is used. - * - * @param addr ip address in network order to convert - * @param buf target buffer where the string is stored - * @param buflen length of buf - * @return either pointer to buf which now holds the ASCII - * representation of addr or NULL if buf was too small - */ -char *ipaddr_ntoa_r(const ip_addr_t *addr, char *buf, int buflen) -{ - u32_t s_addr; - char inv[3]; - char *rp; - u8_t *ap; - u8_t rem; - u8_t n; - u8_t i; - int len = 0; - - s_addr = ip4_addr_get_u32(addr); - - rp = buf; - ap = (u8_t *)&s_addr; - for(n = 0; n < 4; n++) { - i = 0; - do { - rem = *ap % (u8_t)10; - *ap /= (u8_t)10; - inv[i++] = '0' + rem; - } while(*ap); - while(i--) { - if (len++ >= buflen) { - return NULL; - } - *rp++ = inv[i]; - } - if (len++ >= buflen) { - return NULL; - } - *rp++ = '.'; - ap++; - } - *--rp = 0; - return buf; -} diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/core/ipv4/ip_frag.c b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/core/ipv4/ip_frag.c deleted file mode 100644 index 8d184345..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/core/ipv4/ip_frag.c +++ /dev/null @@ -1,863 +0,0 @@ -/** - * @file - * This is the IPv4 packet segmentation and reassembly implementation. - * - */ - -/* - * Copyright (c) 2001-2004 Swedish Institute of Computer Science. - * 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. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT - * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING - * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY - * OF SUCH DAMAGE. - * - * This file is part of the lwIP TCP/IP stack. - * - * Author: Jani Monoses - * Simon Goldschmidt - * original reassembly code by Adam Dunkels - * - */ - -#include "lwip/opt.h" -#include "lwip/ip_frag.h" -#include "lwip/def.h" -#include "lwip/inet_chksum.h" -#include "lwip/netif.h" -#include "lwip/snmp.h" -#include "lwip/stats.h" -#include "lwip/icmp.h" - -#include - -#if IP_REASSEMBLY -/** - * The IP reassembly code currently has the following limitations: - * - IP header options are not supported - * - fragments must not overlap (e.g. due to different routes), - * currently, overlapping or duplicate fragments are thrown away - * if IP_REASS_CHECK_OVERLAP=1 (the default)! - * - * @todo: work with IP header options - */ - -/** Setting this to 0, you can turn off checking the fragments for overlapping - * regions. The code gets a little smaller. Only use this if you know that - * overlapping won't occur on your network! */ -#ifndef IP_REASS_CHECK_OVERLAP -#define IP_REASS_CHECK_OVERLAP 1 -#endif /* IP_REASS_CHECK_OVERLAP */ - -/** Set to 0 to prevent freeing the oldest datagram when the reassembly buffer is - * full (IP_REASS_MAX_PBUFS pbufs are enqueued). The code gets a little smaller. - * Datagrams will be freed by timeout only. Especially useful when MEMP_NUM_REASSDATA - * is set to 1, so one datagram can be reassembled at a time, only. */ -#ifndef IP_REASS_FREE_OLDEST -#define IP_REASS_FREE_OLDEST 1 -#endif /* IP_REASS_FREE_OLDEST */ - -#define IP_REASS_FLAG_LASTFRAG 0x01 - -/** This is a helper struct which holds the starting - * offset and the ending offset of this fragment to - * easily chain the fragments. - * It has the same packing requirements as the IP header, since it replaces - * the IP header in memory in incoming fragments (after copying it) to keep - * track of the various fragments. (-> If the IP header doesn't need packing, - * this struct doesn't need packing, too.) - */ -#ifdef PACK_STRUCT_USE_INCLUDES -# include "arch/bpstruct.h" -#endif -PACK_STRUCT_BEGIN -struct ip_reass_helper { - PACK_STRUCT_FIELD(struct pbuf *next_pbuf); - PACK_STRUCT_FIELD(u16_t start); - PACK_STRUCT_FIELD(u16_t end); -} PACK_STRUCT_STRUCT; -PACK_STRUCT_END -#ifdef PACK_STRUCT_USE_INCLUDES -# include "arch/epstruct.h" -#endif - -#define IP_ADDRESSES_AND_ID_MATCH(iphdrA, iphdrB) \ - (ip_addr_cmp(&(iphdrA)->src, &(iphdrB)->src) && \ - ip_addr_cmp(&(iphdrA)->dest, &(iphdrB)->dest) && \ - IPH_ID(iphdrA) == IPH_ID(iphdrB)) ? 1 : 0 - -/* global variables */ -static struct ip_reassdata *reassdatagrams; -static u16_t ip_reass_pbufcount; - -/* function prototypes */ -static void ip_reass_dequeue_datagram(struct ip_reassdata *ipr, struct ip_reassdata *prev); -static int ip_reass_free_complete_datagram(struct ip_reassdata *ipr, struct ip_reassdata *prev); - -/** - * Reassembly timer base function - * for both NO_SYS == 0 and 1 (!). - * - * Should be called every 1000 msec (defined by IP_TMR_INTERVAL). - */ -void -ip_reass_tmr(void) -{ - struct ip_reassdata *r, *prev = NULL; - - r = reassdatagrams; - while (r != NULL) { - /* Decrement the timer. Once it reaches 0, - * clean up the incomplete fragment assembly */ - if (r->timer > 0) { - r->timer--; - LWIP_DEBUGF(IP_REASS_DEBUG, ("ip_reass_tmr: timer dec %"U16_F"\n",(u16_t)r->timer)); - prev = r; - r = r->next; - } else { - /* reassembly timed out */ - struct ip_reassdata *tmp; - LWIP_DEBUGF(IP_REASS_DEBUG, ("ip_reass_tmr: timer timed out\n")); - tmp = r; - /* get the next pointer before freeing */ - r = r->next; - /* free the helper struct and all enqueued pbufs */ - ip_reass_free_complete_datagram(tmp, prev); - } - } -} - -/** - * Free a datagram (struct ip_reassdata) and all its pbufs. - * Updates the total count of enqueued pbufs (ip_reass_pbufcount), - * SNMP counters and sends an ICMP time exceeded packet. - * - * @param ipr datagram to free - * @param prev the previous datagram in the linked list - * @return the number of pbufs freed - */ -static int -ip_reass_free_complete_datagram(struct ip_reassdata *ipr, struct ip_reassdata *prev) -{ - u16_t pbufs_freed = 0; - u8_t clen; - struct pbuf *p; - struct ip_reass_helper *iprh; - - LWIP_ASSERT("prev != ipr", prev != ipr); - if (prev != NULL) { - LWIP_ASSERT("prev->next == ipr", prev->next == ipr); - } - - snmp_inc_ipreasmfails(); -#if LWIP_ICMP - iprh = (struct ip_reass_helper *)ipr->p->payload; - if (iprh->start == 0) { - /* The first fragment was received, send ICMP time exceeded. */ - /* First, de-queue the first pbuf from r->p. */ - p = ipr->p; - ipr->p = iprh->next_pbuf; - /* Then, copy the original header into it. */ - SMEMCPY(p->payload, &ipr->iphdr, IP_HLEN); - icmp_time_exceeded(p, ICMP_TE_FRAG); - clen = pbuf_clen(p); - LWIP_ASSERT("pbufs_freed + clen <= 0xffff", pbufs_freed + clen <= 0xffff); - pbufs_freed += clen; - pbuf_free(p); - } -#endif /* LWIP_ICMP */ - - /* First, free all received pbufs. The individual pbufs need to be released - separately as they have not yet been chained */ - p = ipr->p; - while (p != NULL) { - struct pbuf *pcur; - iprh = (struct ip_reass_helper *)p->payload; - pcur = p; - /* get the next pointer before freeing */ - p = iprh->next_pbuf; - clen = pbuf_clen(pcur); - LWIP_ASSERT("pbufs_freed + clen <= 0xffff", pbufs_freed + clen <= 0xffff); - pbufs_freed += clen; - pbuf_free(pcur); - } - /* Then, unchain the struct ip_reassdata from the list and free it. */ - ip_reass_dequeue_datagram(ipr, prev); - LWIP_ASSERT("ip_reass_pbufcount >= clen", ip_reass_pbufcount >= pbufs_freed); - ip_reass_pbufcount -= pbufs_freed; - - return pbufs_freed; -} - -#if IP_REASS_FREE_OLDEST -/** - * Free the oldest datagram to make room for enqueueing new fragments. - * The datagram 'fraghdr' belongs to is not freed! - * - * @param fraghdr IP header of the current fragment - * @param pbufs_needed number of pbufs needed to enqueue - * (used for freeing other datagrams if not enough space) - * @return the number of pbufs freed - */ -static int -ip_reass_remove_oldest_datagram(struct ip_hdr *fraghdr, int pbufs_needed) -{ - /* @todo Can't we simply remove the last datagram in the - * linked list behind reassdatagrams? - */ - struct ip_reassdata *r, *oldest, *prev; - int pbufs_freed = 0, pbufs_freed_current; - int other_datagrams; - - /* Free datagrams until being allowed to enqueue 'pbufs_needed' pbufs, - * but don't free the datagram that 'fraghdr' belongs to! */ - do { - oldest = NULL; - prev = NULL; - other_datagrams = 0; - r = reassdatagrams; - while (r != NULL) { - if (!IP_ADDRESSES_AND_ID_MATCH(&r->iphdr, fraghdr)) { - /* Not the same datagram as fraghdr */ - other_datagrams++; - if (oldest == NULL) { - oldest = r; - } else if (r->timer <= oldest->timer) { - /* older than the previous oldest */ - oldest = r; - } - } - if (r->next != NULL) { - prev = r; - } - r = r->next; - } - if (oldest != NULL) { - pbufs_freed_current = ip_reass_free_complete_datagram(oldest, prev); - pbufs_freed += pbufs_freed_current; - } - } while ((pbufs_freed < pbufs_needed) && (other_datagrams > 1)); - return pbufs_freed; -} -#endif /* IP_REASS_FREE_OLDEST */ - -/** - * Enqueues a new fragment into the fragment queue - * @param fraghdr points to the new fragments IP hdr - * @param clen number of pbufs needed to enqueue (used for freeing other datagrams if not enough space) - * @return A pointer to the queue location into which the fragment was enqueued - */ -static struct ip_reassdata* -ip_reass_enqueue_new_datagram(struct ip_hdr *fraghdr, int clen) -{ - struct ip_reassdata* ipr; - /* No matching previous fragment found, allocate a new reassdata struct */ - ipr = (struct ip_reassdata *)memp_malloc(MEMP_REASSDATA); - if (ipr == NULL) { -#if IP_REASS_FREE_OLDEST - if (ip_reass_remove_oldest_datagram(fraghdr, clen) >= clen) { - ipr = (struct ip_reassdata *)memp_malloc(MEMP_REASSDATA); - } - if (ipr == NULL) -#endif /* IP_REASS_FREE_OLDEST */ - { - IPFRAG_STATS_INC(ip_frag.memerr); - LWIP_DEBUGF(IP_REASS_DEBUG,("Failed to alloc reassdata struct\n")); - return NULL; - } - } - memset(ipr, 0, sizeof(struct ip_reassdata)); - ipr->timer = IP_REASS_MAXAGE; - - /* enqueue the new structure to the front of the list */ - ipr->next = reassdatagrams; - reassdatagrams = ipr; - /* copy the ip header for later tests and input */ - /* @todo: no ip options supported? */ - SMEMCPY(&(ipr->iphdr), fraghdr, IP_HLEN); - return ipr; -} - -/** - * Dequeues a datagram from the datagram queue. Doesn't deallocate the pbufs. - * @param ipr points to the queue entry to dequeue - */ -static void -ip_reass_dequeue_datagram(struct ip_reassdata *ipr, struct ip_reassdata *prev) -{ - - /* dequeue the reass struct */ - if (reassdatagrams == ipr) { - /* it was the first in the list */ - reassdatagrams = ipr->next; - } else { - /* it wasn't the first, so it must have a valid 'prev' */ - LWIP_ASSERT("sanity check linked list", prev != NULL); - prev->next = ipr->next; - } - - /* now we can free the ip_reass struct */ - memp_free(MEMP_REASSDATA, ipr); -} - -/** - * Chain a new pbuf into the pbuf list that composes the datagram. The pbuf list - * will grow over time as new pbufs are rx. - * Also checks that the datagram passes basic continuity checks (if the last - * fragment was received at least once). - * @param root_p points to the 'root' pbuf for the current datagram being assembled. - * @param new_p points to the pbuf for the current fragment - * @return 0 if invalid, >0 otherwise - */ -static int -ip_reass_chain_frag_into_datagram_and_validate(struct ip_reassdata *ipr, struct pbuf *new_p) -{ - struct ip_reass_helper *iprh, *iprh_tmp, *iprh_prev=NULL; - struct pbuf *q; - u16_t offset,len; - struct ip_hdr *fraghdr; - int valid = 1; - - /* Extract length and fragment offset from current fragment */ - fraghdr = (struct ip_hdr*)new_p->payload; - len = ntohs(IPH_LEN(fraghdr)) - IPH_HL(fraghdr) * 4; - offset = (ntohs(IPH_OFFSET(fraghdr)) & IP_OFFMASK) * 8; - - /* overwrite the fragment's ip header from the pbuf with our helper struct, - * and setup the embedded helper structure. */ - /* make sure the struct ip_reass_helper fits into the IP header */ - LWIP_ASSERT("sizeof(struct ip_reass_helper) <= IP_HLEN", - sizeof(struct ip_reass_helper) <= IP_HLEN); - iprh = (struct ip_reass_helper*)new_p->payload; - iprh->next_pbuf = NULL; - iprh->start = offset; - iprh->end = offset + len; - - /* Iterate through until we either get to the end of the list (append), - * or we find on with a larger offset (insert). */ - for (q = ipr->p; q != NULL;) { - iprh_tmp = (struct ip_reass_helper*)q->payload; - if (iprh->start < iprh_tmp->start) { - /* the new pbuf should be inserted before this */ - iprh->next_pbuf = q; - if (iprh_prev != NULL) { - /* not the fragment with the lowest offset */ -#if IP_REASS_CHECK_OVERLAP - if ((iprh->start < iprh_prev->end) || (iprh->end > iprh_tmp->start)) { - /* fragment overlaps with previous or following, throw away */ - goto freepbuf; - } -#endif /* IP_REASS_CHECK_OVERLAP */ - iprh_prev->next_pbuf = new_p; - } else { - /* fragment with the lowest offset */ - ipr->p = new_p; - } - break; - } else if(iprh->start == iprh_tmp->start) { - /* received the same datagram twice: no need to keep the datagram */ - goto freepbuf; -#if IP_REASS_CHECK_OVERLAP - } else if(iprh->start < iprh_tmp->end) { - /* overlap: no need to keep the new datagram */ - goto freepbuf; -#endif /* IP_REASS_CHECK_OVERLAP */ - } else { - /* Check if the fragments received so far have no wholes. */ - if (iprh_prev != NULL) { - if (iprh_prev->end != iprh_tmp->start) { - /* There is a fragment missing between the current - * and the previous fragment */ - valid = 0; - } - } - } - q = iprh_tmp->next_pbuf; - iprh_prev = iprh_tmp; - } - - /* If q is NULL, then we made it to the end of the list. Determine what to do now */ - if (q == NULL) { - if (iprh_prev != NULL) { - /* this is (for now), the fragment with the highest offset: - * chain it to the last fragment */ -#if IP_REASS_CHECK_OVERLAP - LWIP_ASSERT("check fragments don't overlap", iprh_prev->end <= iprh->start); -#endif /* IP_REASS_CHECK_OVERLAP */ - iprh_prev->next_pbuf = new_p; - if (iprh_prev->end != iprh->start) { - valid = 0; - } - } else { -#if IP_REASS_CHECK_OVERLAP - LWIP_ASSERT("no previous fragment, this must be the first fragment!", - ipr->p == NULL); -#endif /* IP_REASS_CHECK_OVERLAP */ - /* this is the first fragment we ever received for this ip datagram */ - ipr->p = new_p; - } - } - - /* At this point, the validation part begins: */ - /* If we already received the last fragment */ - if ((ipr->flags & IP_REASS_FLAG_LASTFRAG) != 0) { - /* and had no wholes so far */ - if (valid) { - /* then check if the rest of the fragments is here */ - /* Check if the queue starts with the first datagram */ - if (((struct ip_reass_helper*)ipr->p->payload)->start != 0) { - valid = 0; - } else { - /* and check that there are no wholes after this datagram */ - iprh_prev = iprh; - q = iprh->next_pbuf; - while (q != NULL) { - iprh = (struct ip_reass_helper*)q->payload; - if (iprh_prev->end != iprh->start) { - valid = 0; - break; - } - iprh_prev = iprh; - q = iprh->next_pbuf; - } - /* if still valid, all fragments are received - * (because to the MF==0 already arrived */ - if (valid) { - LWIP_ASSERT("sanity check", ipr->p != NULL); - LWIP_ASSERT("sanity check", - ((struct ip_reass_helper*)ipr->p->payload) != iprh); - LWIP_ASSERT("validate_datagram:next_pbuf!=NULL", - iprh->next_pbuf == NULL); - LWIP_ASSERT("validate_datagram:datagram end!=datagram len", - iprh->end == ipr->datagram_len); - } - } - } - /* If valid is 0 here, there are some fragments missing in the middle - * (since MF == 0 has already arrived). Such datagrams simply time out if - * no more fragments are received... */ - return valid; - } - /* If we come here, not all fragments were received, yet! */ - return 0; /* not yet valid! */ -#if IP_REASS_CHECK_OVERLAP -freepbuf: - ip_reass_pbufcount -= pbuf_clen(new_p); - pbuf_free(new_p); - return 0; -#endif /* IP_REASS_CHECK_OVERLAP */ -} - -/** - * Reassembles incoming IP fragments into an IP datagram. - * - * @param p points to a pbuf chain of the fragment - * @return NULL if reassembly is incomplete, ? otherwise - */ -struct pbuf * -ip_reass(struct pbuf *p) -{ - struct pbuf *r; - struct ip_hdr *fraghdr; - struct ip_reassdata *ipr; - struct ip_reass_helper *iprh; - u16_t offset, len; - u8_t clen; - struct ip_reassdata *ipr_prev = NULL; - - IPFRAG_STATS_INC(ip_frag.recv); - snmp_inc_ipreasmreqds(); - - fraghdr = (struct ip_hdr*)p->payload; - - if ((IPH_HL(fraghdr) * 4) != IP_HLEN) { - LWIP_DEBUGF(IP_REASS_DEBUG,("ip_reass: IP options currently not supported!\n")); - IPFRAG_STATS_INC(ip_frag.err); - goto nullreturn; - } - - offset = (ntohs(IPH_OFFSET(fraghdr)) & IP_OFFMASK) * 8; - len = ntohs(IPH_LEN(fraghdr)) - IPH_HL(fraghdr) * 4; - - /* Check if we are allowed to enqueue more datagrams. */ - clen = pbuf_clen(p); - if ((ip_reass_pbufcount + clen) > IP_REASS_MAX_PBUFS) { -#if IP_REASS_FREE_OLDEST - if (!ip_reass_remove_oldest_datagram(fraghdr, clen) || - ((ip_reass_pbufcount + clen) > IP_REASS_MAX_PBUFS)) -#endif /* IP_REASS_FREE_OLDEST */ - { - /* No datagram could be freed and still too many pbufs enqueued */ - LWIP_DEBUGF(IP_REASS_DEBUG,("ip_reass: Overflow condition: pbufct=%d, clen=%d, MAX=%d\n", - ip_reass_pbufcount, clen, IP_REASS_MAX_PBUFS)); - IPFRAG_STATS_INC(ip_frag.memerr); - /* @todo: send ICMP time exceeded here? */ - /* drop this pbuf */ - goto nullreturn; - } - } - - /* Look for the datagram the fragment belongs to in the current datagram queue, - * remembering the previous in the queue for later dequeueing. */ - for (ipr = reassdatagrams; ipr != NULL; ipr = ipr->next) { - /* Check if the incoming fragment matches the one currently present - in the reassembly buffer. If so, we proceed with copying the - fragment into the buffer. */ - if (IP_ADDRESSES_AND_ID_MATCH(&ipr->iphdr, fraghdr)) { - LWIP_DEBUGF(IP_REASS_DEBUG, ("ip_reass: matching previous fragment ID=%"X16_F"\n", - ntohs(IPH_ID(fraghdr)))); - IPFRAG_STATS_INC(ip_frag.cachehit); - break; - } - ipr_prev = ipr; - } - - if (ipr == NULL) { - /* Enqueue a new datagram into the datagram queue */ - ipr = ip_reass_enqueue_new_datagram(fraghdr, clen); - /* Bail if unable to enqueue */ - if(ipr == NULL) { - goto nullreturn; - } - } else { - if (((ntohs(IPH_OFFSET(fraghdr)) & IP_OFFMASK) == 0) && - ((ntohs(IPH_OFFSET(&ipr->iphdr)) & IP_OFFMASK) != 0)) { - /* ipr->iphdr is not the header from the first fragment, but fraghdr is - * -> copy fraghdr into ipr->iphdr since we want to have the header - * of the first fragment (for ICMP time exceeded and later, for copying - * all options, if supported)*/ - SMEMCPY(&ipr->iphdr, fraghdr, IP_HLEN); - } - } - /* Track the current number of pbufs current 'in-flight', in order to limit - the number of fragments that may be enqueued at any one time */ - ip_reass_pbufcount += clen; - - /* At this point, we have either created a new entry or pointing - * to an existing one */ - - /* check for 'no more fragments', and update queue entry*/ - if ((IPH_OFFSET(fraghdr) & PP_NTOHS(IP_MF)) == 0) { - ipr->flags |= IP_REASS_FLAG_LASTFRAG; - ipr->datagram_len = offset + len; - LWIP_DEBUGF(IP_REASS_DEBUG, - ("ip_reass: last fragment seen, total len %"S16_F"\n", - ipr->datagram_len)); - } - /* find the right place to insert this pbuf */ - /* @todo: trim pbufs if fragments are overlapping */ - if (ip_reass_chain_frag_into_datagram_and_validate(ipr, p)) { - /* the totally last fragment (flag more fragments = 0) was received at least - * once AND all fragments are received */ - ipr->datagram_len += IP_HLEN; - - /* save the second pbuf before copying the header over the pointer */ - r = ((struct ip_reass_helper*)ipr->p->payload)->next_pbuf; - - /* copy the original ip header back to the first pbuf */ - fraghdr = (struct ip_hdr*)(ipr->p->payload); - SMEMCPY(fraghdr, &ipr->iphdr, IP_HLEN); - IPH_LEN_SET(fraghdr, htons(ipr->datagram_len)); - IPH_OFFSET_SET(fraghdr, 0); - IPH_CHKSUM_SET(fraghdr, 0); - /* @todo: do we need to set calculate the correct checksum? */ - IPH_CHKSUM_SET(fraghdr, inet_chksum(fraghdr, IP_HLEN)); - - p = ipr->p; - - /* chain together the pbufs contained within the reass_data list. */ - while(r != NULL) { - iprh = (struct ip_reass_helper*)r->payload; - - /* hide the ip header for every succeding fragment */ - pbuf_header(r, -IP_HLEN); - pbuf_cat(p, r); - r = iprh->next_pbuf; - } - /* release the sources allocate for the fragment queue entry */ - ip_reass_dequeue_datagram(ipr, ipr_prev); - - /* and adjust the number of pbufs currently queued for reassembly. */ - ip_reass_pbufcount -= pbuf_clen(p); - - /* Return the pbuf chain */ - return p; - } - /* the datagram is not (yet?) reassembled completely */ - LWIP_DEBUGF(IP_REASS_DEBUG,("ip_reass_pbufcount: %d out\n", ip_reass_pbufcount)); - return NULL; - -nullreturn: - LWIP_DEBUGF(IP_REASS_DEBUG,("ip_reass: nullreturn\n")); - IPFRAG_STATS_INC(ip_frag.drop); - pbuf_free(p); - return NULL; -} -#endif /* IP_REASSEMBLY */ - -#if IP_FRAG -#if IP_FRAG_USES_STATIC_BUF -static u8_t buf[LWIP_MEM_ALIGN_SIZE(IP_FRAG_MAX_MTU + MEM_ALIGNMENT - 1)]; -#else /* IP_FRAG_USES_STATIC_BUF */ - -#if !LWIP_NETIF_TX_SINGLE_PBUF -/** Allocate a new struct pbuf_custom_ref */ -static struct pbuf_custom_ref* -ip_frag_alloc_pbuf_custom_ref(void) -{ - return (struct pbuf_custom_ref*)memp_malloc(MEMP_FRAG_PBUF); -} - -/** Free a struct pbuf_custom_ref */ -static void -ip_frag_free_pbuf_custom_ref(struct pbuf_custom_ref* p) -{ - LWIP_ASSERT("p != NULL", p != NULL); - memp_free(MEMP_FRAG_PBUF, p); -} - -/** Free-callback function to free a 'struct pbuf_custom_ref', called by - * pbuf_free. */ -static void -ipfrag_free_pbuf_custom(struct pbuf *p) -{ - struct pbuf_custom_ref *pcr = (struct pbuf_custom_ref*)p; - LWIP_ASSERT("pcr != NULL", pcr != NULL); - LWIP_ASSERT("pcr == p", (void*)pcr == (void*)p); - if (pcr->original != NULL) { - pbuf_free(pcr->original); - } - ip_frag_free_pbuf_custom_ref(pcr); -} -#endif /* !LWIP_NETIF_TX_SINGLE_PBUF */ -#endif /* IP_FRAG_USES_STATIC_BUF */ - -/** - * Fragment an IP datagram if too large for the netif. - * - * Chop the datagram in MTU sized chunks and send them in order - * by using a fixed size static memory buffer (PBUF_REF) or - * point PBUF_REFs into p (depending on IP_FRAG_USES_STATIC_BUF). - * - * @param p ip packet to send - * @param netif the netif on which to send - * @param dest destination ip address to which to send - * - * @return ERR_OK if sent successfully, err_t otherwise - */ -err_t -ip_frag(struct pbuf *p, struct netif *netif, ip_addr_t *dest) -{ - struct pbuf *rambuf; -#if IP_FRAG_USES_STATIC_BUF - struct pbuf *header; -#else -#if !LWIP_NETIF_TX_SINGLE_PBUF - struct pbuf *newpbuf; -#endif - struct ip_hdr *original_iphdr; -#endif - struct ip_hdr *iphdr; - u16_t nfb; - u16_t left, cop; - u16_t mtu = netif->mtu; - u16_t ofo, omf; - u16_t last; - u16_t poff = IP_HLEN; - u16_t tmp; -#if !IP_FRAG_USES_STATIC_BUF && !LWIP_NETIF_TX_SINGLE_PBUF - u16_t newpbuflen = 0; - u16_t left_to_copy; -#endif - - /* Get a RAM based MTU sized pbuf */ -#if IP_FRAG_USES_STATIC_BUF - /* When using a static buffer, we use a PBUF_REF, which we will - * use to reference the packet (without link header). - * Layer and length is irrelevant. - */ - rambuf = pbuf_alloc(PBUF_LINK, 0, PBUF_REF); - if (rambuf == NULL) { - LWIP_DEBUGF(IP_REASS_DEBUG, ("ip_frag: pbuf_alloc(PBUF_LINK, 0, PBUF_REF) failed\n")); - return ERR_MEM; - } - rambuf->tot_len = rambuf->len = mtu; - rambuf->payload = LWIP_MEM_ALIGN((void *)buf); - - /* Copy the IP header in it */ - iphdr = (struct ip_hdr *)rambuf->payload; - SMEMCPY(iphdr, p->payload, IP_HLEN); -#else /* IP_FRAG_USES_STATIC_BUF */ - original_iphdr = (struct ip_hdr *)p->payload; - iphdr = original_iphdr; -#endif /* IP_FRAG_USES_STATIC_BUF */ - - /* Save original offset */ - tmp = ntohs(IPH_OFFSET(iphdr)); - ofo = tmp & IP_OFFMASK; - omf = tmp & IP_MF; - - left = p->tot_len - IP_HLEN; - - nfb = (mtu - IP_HLEN) / 8; - - while (left) { - last = (left <= mtu - IP_HLEN); - - /* Set new offset and MF flag */ - tmp = omf | (IP_OFFMASK & (ofo)); - if (!last) { - tmp = tmp | IP_MF; - } - - /* Fill this fragment */ - cop = last ? left : nfb * 8; - -#if IP_FRAG_USES_STATIC_BUF - poff += pbuf_copy_partial(p, (u8_t*)iphdr + IP_HLEN, cop, poff); -#else /* IP_FRAG_USES_STATIC_BUF */ -#if LWIP_NETIF_TX_SINGLE_PBUF - rambuf = pbuf_alloc(PBUF_IP, cop, PBUF_RAM); - if (rambuf == NULL) { - return ERR_MEM; - } - LWIP_ASSERT("this needs a pbuf in one piece!", - (rambuf->len == rambuf->tot_len) && (rambuf->next == NULL)); - poff += pbuf_copy_partial(p, rambuf->payload, cop, poff); - /* make room for the IP header */ - if(pbuf_header(rambuf, IP_HLEN)) { - pbuf_free(rambuf); - return ERR_MEM; - } - /* fill in the IP header */ - SMEMCPY(rambuf->payload, original_iphdr, IP_HLEN); - iphdr = rambuf->payload; -#else /* LWIP_NETIF_TX_SINGLE_PBUF */ - /* When not using a static buffer, create a chain of pbufs. - * The first will be a PBUF_RAM holding the link and IP header. - * The rest will be PBUF_REFs mirroring the pbuf chain to be fragged, - * but limited to the size of an mtu. - */ - rambuf = pbuf_alloc(PBUF_LINK, IP_HLEN, PBUF_RAM); - if (rambuf == NULL) { - return ERR_MEM; - } - LWIP_ASSERT("this needs a pbuf in one piece!", - (p->len >= (IP_HLEN))); - SMEMCPY(rambuf->payload, original_iphdr, IP_HLEN); - iphdr = (struct ip_hdr *)rambuf->payload; - - /* Can just adjust p directly for needed offset. */ - p->payload = (u8_t *)p->payload + poff; - p->len -= poff; - - left_to_copy = cop; - while (left_to_copy) { - struct pbuf_custom_ref *pcr; - newpbuflen = (left_to_copy < p->len) ? left_to_copy : p->len; - /* Is this pbuf already empty? */ - if (!newpbuflen) { - p = p->next; - continue; - } - pcr = ip_frag_alloc_pbuf_custom_ref(); - if (pcr == NULL) { - pbuf_free(rambuf); - return ERR_MEM; - } - /* Mirror this pbuf, although we might not need all of it. */ - newpbuf = pbuf_alloced_custom(PBUF_RAW, newpbuflen, PBUF_REF, &pcr->pc, p->payload, newpbuflen); - if (newpbuf == NULL) { - ip_frag_free_pbuf_custom_ref(pcr); - pbuf_free(rambuf); - return ERR_MEM; - } - pbuf_ref(p); - pcr->original = p; - pcr->pc.custom_free_function = ipfrag_free_pbuf_custom; - - /* Add it to end of rambuf's chain, but using pbuf_cat, not pbuf_chain - * so that it is removed when pbuf_dechain is later called on rambuf. - */ - pbuf_cat(rambuf, newpbuf); - left_to_copy -= newpbuflen; - if (left_to_copy) { - p = p->next; - } - } - poff = newpbuflen; -#endif /* LWIP_NETIF_TX_SINGLE_PBUF */ -#endif /* IP_FRAG_USES_STATIC_BUF */ - - /* Correct header */ - IPH_OFFSET_SET(iphdr, htons(tmp)); - IPH_LEN_SET(iphdr, htons(cop + IP_HLEN)); - IPH_CHKSUM_SET(iphdr, 0); - IPH_CHKSUM_SET(iphdr, inet_chksum(iphdr, IP_HLEN)); - -#if IP_FRAG_USES_STATIC_BUF - if (last) { - pbuf_realloc(rambuf, left + IP_HLEN); - } - - /* This part is ugly: we alloc a RAM based pbuf for - * the link level header for each chunk and then - * free it.A PBUF_ROM style pbuf for which pbuf_header - * worked would make things simpler. - */ - header = pbuf_alloc(PBUF_LINK, 0, PBUF_RAM); - if (header != NULL) { - pbuf_chain(header, rambuf); - netif->output(netif, header, dest); - IPFRAG_STATS_INC(ip_frag.xmit); - snmp_inc_ipfragcreates(); - pbuf_free(header); - } else { - LWIP_DEBUGF(IP_REASS_DEBUG, ("ip_frag: pbuf_alloc() for header failed\n")); - pbuf_free(rambuf); - return ERR_MEM; - } -#else /* IP_FRAG_USES_STATIC_BUF */ - /* No need for separate header pbuf - we allowed room for it in rambuf - * when allocated. - */ - netif->output(netif, rambuf, dest); - IPFRAG_STATS_INC(ip_frag.xmit); - - /* Unfortunately we can't reuse rambuf - the hardware may still be - * using the buffer. Instead we free it (and the ensuing chain) and - * recreate it next time round the loop. If we're lucky the hardware - * will have already sent the packet, the free will really free, and - * there will be zero memory penalty. - */ - - pbuf_free(rambuf); -#endif /* IP_FRAG_USES_STATIC_BUF */ - left -= cop; - ofo += nfb; - } -#if IP_FRAG_USES_STATIC_BUF - pbuf_free(rambuf); -#endif /* IP_FRAG_USES_STATIC_BUF */ - snmp_inc_ipfragoks(); - return ERR_OK; -} -#endif /* IP_FRAG */ diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/core/ipv6/icmp6.c b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/core/ipv6/icmp6.c deleted file mode 100644 index fd17f393..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/core/ipv6/icmp6.c +++ /dev/null @@ -1,337 +0,0 @@ -/** - * @file - * - * IPv6 version of ICMP, as per RFC 4443. - */ - -/* - * Copyright (c) 2010 Inico Technologies Ltd. - * 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. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT - * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING - * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY - * OF SUCH DAMAGE. - * - * This file is part of the lwIP TCP/IP stack. - * - * Author: Ivan Delamer - * - * - * Please coordinate changes and requests with Ivan Delamer - * - */ - -#include "lwip/opt.h" - -#if LWIP_ICMP6 && LWIP_IPV6 /* don't build if not configured for use in lwipopts.h */ - -#include "lwip/icmp6.h" -#include "lwip/ip6.h" -#include "lwip/ip6_addr.h" -#include "lwip/inet_chksum.h" -#include "lwip/pbuf.h" -#include "lwip/netif.h" -#include "lwip/nd6.h" -#include "lwip/mld6.h" -#include "lwip/stats.h" - -#include - -#ifndef LWIP_ICMP6_DATASIZE -#define LWIP_ICMP6_DATASIZE 8 -#endif -#if LWIP_ICMP6_DATASIZE == 0 -#define LWIP_ICMP6_DATASIZE 8 -#endif - -/* Forward declarations */ -static void icmp6_send_response(struct pbuf *p, u8_t code, u32_t data, u8_t type); - - -/** - * Process an input ICMPv6 message. Called by ip6_input. - * - * Will generate a reply for echo requests. Other messages are forwarded - * to nd6_input, or mld6_input. - * - * @param p the mld packet, p->payload pointing to the icmpv6 header - * @param inp the netif on which this packet was received - */ -void -icmp6_input(struct pbuf *p, struct netif *inp) -{ - struct pp_icmp6_hdr *icmp6hdr; - struct pbuf * r; - ip6_addr_t * reply_src; - - ICMP6_STATS_INC(icmp6.recv); - - /* Check that ICMPv6 header fits in payload */ - if (p->len < sizeof(struct pp_icmp6_hdr)) { - /* drop short packets */ - pbuf_free(p); - ICMP6_STATS_INC(icmp6.lenerr); - ICMP6_STATS_INC(icmp6.drop); - return; - } - - icmp6hdr = (struct pp_icmp6_hdr *)p->payload; - -#if LWIP_ICMP6_CHECKSUM_CHECK - if (ip6_chksum_pseudo(p, IP6_NEXTH_ICMP6, p->tot_len, ip6_current_src_addr(), - ip6_current_dest_addr()) != 0) { - /* Checksum failed */ - pbuf_free(p); - ICMP6_STATS_INC(icmp6.chkerr); - ICMP6_STATS_INC(icmp6.drop); - return; - } -#endif /* LWIP_ICMP6_CHECKSUM_CHECK */ - - switch (icmp6hdr->type) { - case ICMP6_TYPE_NA: /* Neighbor advertisement */ - case ICMP6_TYPE_NS: /* Neighbor solicitation */ - case ICMP6_TYPE_RA: /* Router advertisement */ - case ICMP6_TYPE_RD: /* Redirect */ - case ICMP6_TYPE_PTB: /* Packet too big */ - nd6_input(p, inp); - return; - break; - case ICMP6_TYPE_RS: -#if LWIP_IPV6_FORWARD - /* TODO implement router functionality */ -#endif - break; -#if LWIP_IPV6_MLD - case ICMP6_TYPE_MLQ: - case ICMP6_TYPE_MLR: - case ICMP6_TYPE_MLD: - mld6_input(p, inp); - return; - break; -#endif - case ICMP6_TYPE_EREQ: -#if !LWIP_MULTICAST_PING - /* multicast destination address? */ - if (ip6_addr_ismulticast(ip6_current_dest_addr())) { - /* drop */ - pbuf_free(p); - ICMP6_STATS_INC(icmp6.drop); - return; - } -#endif /* LWIP_MULTICAST_PING */ - - /* Allocate reply. */ - r = pbuf_alloc(PBUF_IP, p->tot_len, PBUF_RAM); - if (r == NULL) { - /* drop */ - pbuf_free(p); - ICMP6_STATS_INC(icmp6.memerr); - return; - } - - /* Copy echo request. */ - if (pbuf_copy(r, p) != ERR_OK) { - /* drop */ - pbuf_free(p); - pbuf_free(r); - ICMP6_STATS_INC(icmp6.err); - return; - } - - /* Determine reply source IPv6 address. */ -#if LWIP_MULTICAST_PING - if (ip6_addr_ismulticast(ip6_current_dest_addr())) { - reply_src = ip6_select_source_address(inp, ip6_current_src_addr()); - if (reply_src == NULL) { - /* drop */ - pbuf_free(p); - pbuf_free(r); - ICMP6_STATS_INC(icmp6.rterr); - return; - } - } - else -#endif /* LWIP_MULTICAST_PING */ - { - reply_src = ip6_current_dest_addr(); - } - - /* Set fields in reply. */ - ((struct icmp6_echo_hdr *)(r->payload))->type = ICMP6_TYPE_EREP; - ((struct icmp6_echo_hdr *)(r->payload))->chksum = 0; - ((struct icmp6_echo_hdr *)(r->payload))->chksum = ip6_chksum_pseudo(r, - IP6_NEXTH_ICMP6, r->tot_len, reply_src, ip6_current_src_addr()); - - /* Send reply. */ - ICMP6_STATS_INC(icmp6.xmit); - ip6_output_if(r, reply_src, ip6_current_src_addr(), - LWIP_ICMP6_HL, 0, IP6_NEXTH_ICMP6, inp); - pbuf_free(r); - - break; - default: - ICMP6_STATS_INC(icmp6.proterr); - ICMP6_STATS_INC(icmp6.drop); - break; - } - - pbuf_free(p); -} - - -/** - * Send an icmpv6 'destination unreachable' packet. - * - * @param p the input packet for which the 'unreachable' should be sent, - * p->payload pointing to the IPv6 header - * @param c ICMPv6 code for the unreachable type - */ -void -icmp6_dest_unreach(struct pbuf *p, enum icmp6_dur_code c) -{ - icmp6_send_response(p, c, 0, ICMP6_TYPE_DUR); -} - -/** - * Send an icmpv6 'packet too big' packet. - * - * @param p the input packet for which the 'packet too big' should be sent, - * p->payload pointing to the IPv6 header - * @param mtu the maximum mtu that we can accept - */ -void -icmp6_packet_too_big(struct pbuf *p, u32_t mtu) -{ - icmp6_send_response(p, 0, mtu, ICMP6_TYPE_PTB); -} - -/** - * Send an icmpv6 'time exceeded' packet. - * - * @param p the input packet for which the 'unreachable' should be sent, - * p->payload pointing to the IPv6 header - * @param c ICMPv6 code for the time exceeded type - */ -void -icmp6_time_exceeded(struct pbuf *p, enum icmp6_te_code c) -{ - icmp6_send_response(p, c, 0, ICMP6_TYPE_TE); -} - -/** - * Send an icmpv6 'parameter problem' packet. - * - * @param p the input packet for which the 'param problem' should be sent, - * p->payload pointing to the IP header - * @param c ICMPv6 code for the param problem type - * @param pointer the pointer to the byte where the parameter is found - */ -void -icmp6_param_problem(struct pbuf *p, enum icmp6_pp_code c, u32_t pointer) -{ - icmp6_send_response(p, c, pointer, ICMP6_TYPE_PP); -} - -/** - * Send an ICMPv6 packet in response to an incoming packet. - * - * @param p the input packet for which the response should be sent, - * p->payload pointing to the IPv6 header - * @param code Code of the ICMPv6 header - * @param data Additional 32-bit parameter in the ICMPv6 header - * @param type Type of the ICMPv6 header - */ -static void -icmp6_send_response(struct pbuf *p, u8_t code, u32_t data, u8_t type) -{ - struct pbuf *q; - struct pp_icmp6_hdr *icmp6hdr; - ip6_addr_t *reply_src, *reply_dest; - ip6_addr_t reply_src_local, reply_dest_local; - struct ip6_hdr *ip6hdr; - struct netif *netif; - - /* ICMPv6 header + IPv6 header + data */ - q = pbuf_alloc(PBUF_IP, sizeof(struct pp_icmp6_hdr) + IP6_HLEN + LWIP_ICMP6_DATASIZE, - PBUF_RAM); - if (q == NULL) { - LWIP_DEBUGF(ICMP_DEBUG, ("icmp_time_exceeded: failed to allocate pbuf for ICMPv6 packet.\n")); - ICMP6_STATS_INC(icmp6.memerr); - return; - } - LWIP_ASSERT("check that first pbuf can hold icmp 6message", - (q->len >= (sizeof(struct pp_icmp6_hdr) + IP6_HLEN + LWIP_ICMP6_DATASIZE))); - - icmp6hdr = (struct pp_icmp6_hdr *)q->payload; - icmp6hdr->type = type; - icmp6hdr->code = code; - icmp6hdr->data = data; - - /* copy fields from original packet */ - SMEMCPY((u8_t *)q->payload + sizeof(struct pp_icmp6_hdr), (u8_t *)p->payload, - IP6_HLEN + LWIP_ICMP6_DATASIZE); - - /* Get the destination address and netif for this ICMP message. */ - if ((ip_current_netif() == NULL) || - ((code == ICMP6_TE_FRAG) && (type == ICMP6_TYPE_TE))) { - /* Special case, as ip6_current_xxx is either NULL, or points - * to a different packet than the one that expired. - * We must use the addresses that are stored in the expired packet. */ - ip6hdr = (struct ip6_hdr *)p->payload; - /* copy from packed address to aligned address */ - ip6_addr_copy(reply_dest_local, ip6hdr->src); - ip6_addr_copy(reply_src_local, ip6hdr->dest); - reply_dest = &reply_dest_local; - reply_src = &reply_src_local; - netif = ip6_route(reply_src, reply_dest); - if (netif == NULL) { - /* drop */ - pbuf_free(q); - ICMP6_STATS_INC(icmp6.rterr); - return; - } - } - else { - netif = ip_current_netif(); - reply_dest = ip6_current_src_addr(); - - /* Select an address to use as source. */ - reply_src = ip6_select_source_address(netif, reply_dest); - if (reply_src == NULL) { - /* drop */ - pbuf_free(q); - ICMP6_STATS_INC(icmp6.rterr); - return; - } - } - - /* calculate checksum */ - icmp6hdr->chksum = 0; - icmp6hdr->chksum = ip6_chksum_pseudo(q, IP6_NEXTH_ICMP6, q->tot_len, - reply_src, reply_dest); - - ICMP6_STATS_INC(icmp6.xmit); - ip6_output_if(q, reply_src, reply_dest, LWIP_ICMP6_HL, 0, IP6_NEXTH_ICMP6, netif); - pbuf_free(q); -} - -#endif /* LWIP_ICMP6 && LWIP_IPV6 */ diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/core/ipv6/ip6.c b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/core/ipv6/ip6.c deleted file mode 100644 index 1eb91f96..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/core/ipv6/ip6.c +++ /dev/null @@ -1,1034 +0,0 @@ -/** - * @file - * - * IPv6 layer. - */ - -/* - * Copyright (c) 2010 Inico Technologies Ltd. - * 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. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT - * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING - * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY - * OF SUCH DAMAGE. - * - * This file is part of the lwIP TCP/IP stack. - * - * Author: Ivan Delamer - * - * - * Please coordinate changes and requests with Ivan Delamer - * - */ - - -#include "lwip/opt.h" - -#if LWIP_IPV6 /* don't build if not configured for use in lwipopts.h */ - -#include "lwip/def.h" -#include "lwip/mem.h" -#include "lwip/netif.h" -#include "lwip/ip6.h" -#include "lwip/ip6_addr.h" -#include "lwip/ip6_frag.h" -#include "lwip/icmp6.h" -#include "lwip/raw.h" -#include "lwip/udp.h" -#include "lwip/tcp_impl.h" -#include "lwip/dhcp6.h" -#include "lwip/nd6.h" -#include "lwip/mld6.h" -#include "lwip/debug.h" -#include "lwip/stats.h" - - -/** - * Finds the appropriate network interface for a given IPv6 address. It tries to select - * a netif following a sequence of heuristics: - * 1) if there is only 1 netif, return it - * 2) if the destination is a link-local address, try to match the src address to a netif. - * this is a tricky case because with multiple netifs, link-local addresses only have - * meaning within a particular subnet/link. - * 3) tries to match the destination subnet to a configured address - * 4) tries to find a router - * 5) tries to match the source address to the netif - * 6) returns the default netif, if configured - * - * @param src the source IPv6 address, if known - * @param dest the destination IPv6 address for which to find the route - * @return the netif on which to send to reach dest - */ -struct netif * -ip6_route(struct ip6_addr *src, struct ip6_addr *dest) -{ - struct netif *netif; - s8_t i; - - /* If single netif configuration, fast return. */ - if ((netif_list != NULL) && (netif_list->next == NULL)) { - return netif_list; - } - - /* Special processing for link-local addresses. */ - if (ip6_addr_islinklocal(dest)) { - if (ip6_addr_isany(src)) { - /* Use default netif. */ - return netif_default; - } - - /* Try to find the netif for the source address. */ - for(netif = netif_list; netif != NULL; netif = netif->next) { - for (i = 0; i < LWIP_IPV6_NUM_ADDRESSES; i++) { - if (ip6_addr_isvalid(netif_ip6_addr_state(netif, i)) && - ip6_addr_cmp(src, netif_ip6_addr(netif, i))) { - return netif; - } - } - } - - /* netif not found, use default netif */ - return netif_default; - } - - /* See if the destination subnet matches a configured address. */ - for(netif = netif_list; netif != NULL; netif = netif->next) { - for (i = 0; i < LWIP_IPV6_NUM_ADDRESSES; i++) { - if (ip6_addr_isvalid(netif_ip6_addr_state(netif, i)) && - ip6_addr_netcmp(dest, netif_ip6_addr(netif, i))) { - return netif; - } - } - } - - /* Get the netif for a suitable router. */ - i = nd6_select_router(dest, NULL); - if (i >= 0) { - if (default_router_list[i].neighbor_entry != NULL) { - if (default_router_list[i].neighbor_entry->netif != NULL) { - return default_router_list[i].neighbor_entry->netif; - } - } - } - - /* try with the netif that matches the source address. */ - if (!ip6_addr_isany(src)) { - for(netif = netif_list; netif != NULL; netif = netif->next) { - for (i = 0; i < LWIP_IPV6_NUM_ADDRESSES; i++) { - if (ip6_addr_isvalid(netif_ip6_addr_state(netif, i)) && - ip6_addr_cmp(src, netif_ip6_addr(netif, i))) { - return netif; - } - } - } - } - - /* no matching netif found, use default netif */ - return netif_default; -} - -/** - * Select the best IPv6 source address for a given destination - * IPv6 address. Loosely follows RFC 3484. "Strong host" behavior - * is assumed. - * - * @param netif the netif on which to send a packet - * @param dest the destination we are trying to reach - * @return the most suitable source address to use, or NULL if no suitable - * source address is found - */ -ip6_addr_t * -ip6_select_source_address(struct netif *netif, ip6_addr_t * dest) -{ - ip6_addr_t * src = NULL; - u8_t i; - - /* If dest is link-local, choose a link-local source. */ - if (ip6_addr_islinklocal(dest) || ip6_addr_ismulticast_linklocal(dest) || ip6_addr_ismulticast_iflocal(dest)) { - for (i = 0; i < LWIP_IPV6_NUM_ADDRESSES; i++) { - if (ip6_addr_isvalid(netif_ip6_addr_state(netif, i)) && - ip6_addr_islinklocal(netif_ip6_addr(netif, i))) { - return netif_ip6_addr(netif, i); - } - } - } - - /* Choose a site-local with matching prefix. */ - if (ip6_addr_issitelocal(dest) || ip6_addr_ismulticast_sitelocal(dest)) { - for (i = 0; i < LWIP_IPV6_NUM_ADDRESSES; i++) { - if (ip6_addr_isvalid(netif_ip6_addr_state(netif, i)) && - ip6_addr_issitelocal(netif_ip6_addr(netif, i)) && - ip6_addr_netcmp(dest, netif_ip6_addr(netif, i))) { - return netif_ip6_addr(netif, i); - } - } - } - - /* Choose a unique-local with matching prefix. */ - if (ip6_addr_isuniquelocal(dest) || ip6_addr_ismulticast_orglocal(dest)) { - for (i = 0; i < LWIP_IPV6_NUM_ADDRESSES; i++) { - if (ip6_addr_isvalid(netif_ip6_addr_state(netif, i)) && - ip6_addr_isuniquelocal(netif_ip6_addr(netif, i)) && - ip6_addr_netcmp(dest, netif_ip6_addr(netif, i))) { - return netif_ip6_addr(netif, i); - } - } - } - - /* Choose a global with best matching prefix. */ - if (ip6_addr_isglobal(dest) || ip6_addr_ismulticast_global(dest)) { - for (i = 0; i < LWIP_IPV6_NUM_ADDRESSES; i++) { - if (ip6_addr_isvalid(netif_ip6_addr_state(netif, i)) && - ip6_addr_isglobal(netif_ip6_addr(netif, i))) { - if (src == NULL) { - src = netif_ip6_addr(netif, i); - } - else { - /* Replace src only if we find a prefix match. */ - /* TODO find longest matching prefix. */ - if ((!(ip6_addr_netcmp(src, dest))) && - ip6_addr_netcmp(netif_ip6_addr(netif, i), dest)) { - src = netif_ip6_addr(netif, i); - } - } - } - } - if (src != NULL) { - return src; - } - } - - /* Last resort: see if arbitrary prefix matches. */ - for (i = 0; i < LWIP_IPV6_NUM_ADDRESSES; i++) { - if (ip6_addr_isvalid(netif_ip6_addr_state(netif, i)) && - ip6_addr_netcmp(dest, netif_ip6_addr(netif, i))) { - return netif_ip6_addr(netif, i); - } - } - - return NULL; -} - -#if LWIP_IPV6_FORWARD -/** - * Forwards an IPv6 packet. It finds an appropriate route for the - * packet, decrements the HL value of the packet, and outputs - * the packet on the appropriate interface. - * - * @param p the packet to forward (p->payload points to IP header) - * @param iphdr the IPv6 header of the input packet - * @param inp the netif on which this packet was received - */ -static void -ip6_forward(struct pbuf *p, struct ip6_hdr *iphdr, struct netif *inp) -{ - struct netif *netif; - - /* do not forward link-local addresses */ - if (ip6_addr_islinklocal(ip6_current_dest_addr())) { - LWIP_DEBUGF(IP6_DEBUG, ("ip6_forward: not forwarding link-local address.\n")); - IP6_STATS_INC(ip6.rterr); - IP6_STATS_INC(ip6.drop); - return; - } - - /* Find network interface where to forward this IP packet to. */ - netif = ip6_route(IP6_ADDR_ANY, ip6_current_dest_addr()); - if (netif == NULL) { - LWIP_DEBUGF(IP6_DEBUG, ("ip6_forward: no route for %"X16_F":%"X16_F":%"X16_F":%"X16_F":%"X16_F":%"X16_F":%"X16_F":%"X16_F"\n", - IP6_ADDR_BLOCK1(ip6_current_dest_addr()), - IP6_ADDR_BLOCK2(ip6_current_dest_addr()), - IP6_ADDR_BLOCK3(ip6_current_dest_addr()), - IP6_ADDR_BLOCK4(ip6_current_dest_addr()), - IP6_ADDR_BLOCK5(ip6_current_dest_addr()), - IP6_ADDR_BLOCK6(ip6_current_dest_addr()), - IP6_ADDR_BLOCK7(ip6_current_dest_addr()), - IP6_ADDR_BLOCK8(ip6_current_dest_addr()))); -#if LWIP_ICMP6 - /* Don't send ICMP messages in response to ICMP messages */ - if (IP6H_NEXTH(iphdr) != IP6_NEXTH_ICMP6) { - icmp6_dest_unreach(p, ICMP6_DUR_NO_ROUTE); - } -#endif /* LWIP_ICMP6 */ - IP6_STATS_INC(ip6.rterr); - IP6_STATS_INC(ip6.drop); - return; - } - /* Do not forward packets onto the same network interface on which - * they arrived. */ - if (netif == inp) { - LWIP_DEBUGF(IP6_DEBUG, ("ip6_forward: not bouncing packets back on incoming interface.\n")); - IP6_STATS_INC(ip6.rterr); - IP6_STATS_INC(ip6.drop); - return; - } - - /* decrement HL */ - IP6H_HOPLIM_SET(iphdr, IP6H_HOPLIM(iphdr) - 1); - /* send ICMP6 if HL == 0 */ - if (IP6H_HOPLIM(iphdr) == 0) { -#if LWIP_ICMP6 - /* Don't send ICMP messages in response to ICMP messages */ - if (IP6H_NEXTH(iphdr) != IP6_NEXTH_ICMP6) { - icmp6_time_exceeded(p, ICMP6_TE_HL); - } -#endif /* LWIP_ICMP6 */ - IP6_STATS_INC(ip6.drop); - return; - } - - if (netif->mtu && (p->tot_len > netif->mtu)) { -#if LWIP_ICMP6 - /* Don't send ICMP messages in response to ICMP messages */ - if (IP6H_NEXTH(iphdr) != IP6_NEXTH_ICMP6) { - icmp6_packet_too_big(p, netif->mtu); - } -#endif /* LWIP_ICMP6 */ - IP6_STATS_INC(ip6.drop); - return; - } - - LWIP_DEBUGF(IP6_DEBUG, ("ip6_forward: forwarding packet to %"X16_F":%"X16_F":%"X16_F":%"X16_F":%"X16_F":%"X16_F":%"X16_F":%"X16_F"\n", - IP6_ADDR_BLOCK1(ip6_current_dest_addr()), - IP6_ADDR_BLOCK2(ip6_current_dest_addr()), - IP6_ADDR_BLOCK3(ip6_current_dest_addr()), - IP6_ADDR_BLOCK4(ip6_current_dest_addr()), - IP6_ADDR_BLOCK5(ip6_current_dest_addr()), - IP6_ADDR_BLOCK6(ip6_current_dest_addr()), - IP6_ADDR_BLOCK7(ip6_current_dest_addr()), - IP6_ADDR_BLOCK8(ip6_current_dest_addr()))); - - /* transmit pbuf on chosen interface */ - netif->output_ip6(netif, p, ip6_current_dest_addr()); - IP6_STATS_INC(ip6.fw); - IP6_STATS_INC(ip6.xmit); - return; -} -#endif /* LWIP_IPV6_FORWARD */ - - -/** - * This function is called by the network interface device driver when - * an IPv6 packet is received. The function does the basic checks of the - * IP header such as packet size being at least larger than the header - * size etc. If the packet was not destined for us, the packet is - * forwarded (using ip6_forward). - * - * Finally, the packet is sent to the upper layer protocol input function. - * - * @param p the received IPv6 packet (p->payload points to IPv6 header) - * @param inp the netif on which this packet was received - * @return ERR_OK if the packet was processed (could return ERR_* if it wasn't - * processed, but currently always returns ERR_OK) - */ -err_t -ip6_input(struct pbuf *p, struct netif *inp) -{ - struct ip6_hdr *ip6hdr; - struct netif *netif; - u8_t nexth; - u16_t hlen; /* the current header length */ - u8_t i; -#if 0 /*IP_ACCEPT_LINK_LAYER_ADDRESSING*/ - @todo - int check_ip_src=1; -#endif /* IP_ACCEPT_LINK_LAYER_ADDRESSING */ - - IP6_STATS_INC(ip6.recv); - - /* identify the IP header */ - ip6hdr = (struct ip6_hdr *)p->payload; - if (IP6H_V(ip6hdr) != 6) { - LWIP_DEBUGF(IP6_DEBUG | LWIP_DBG_LEVEL_WARNING, ("IPv6 packet dropped due to bad version number %"U32_F"\n", - IP6H_V(ip6hdr))); - pbuf_free(p); - IP6_STATS_INC(ip6.err); - IP6_STATS_INC(ip6.drop); - return ERR_OK; - } - - /* header length exceeds first pbuf length, or ip length exceeds total pbuf length? */ - if ((IP6_HLEN > p->len) || ((IP6H_PLEN(ip6hdr) + IP6_HLEN) > p->tot_len)) { - if (IP6_HLEN > p->len) { - LWIP_DEBUGF(IP6_DEBUG | LWIP_DBG_LEVEL_SERIOUS, - ("IPv6 header (len %"U16_F") does not fit in first pbuf (len %"U16_F"), IP packet dropped.\n", - IP6_HLEN, p->len)); - } - if ((IP6H_PLEN(ip6hdr) + IP6_HLEN) > p->tot_len) { - LWIP_DEBUGF(IP6_DEBUG | LWIP_DBG_LEVEL_SERIOUS, - ("IPv6 (plen %"U16_F") is longer than pbuf (len %"U16_F"), IP packet dropped.\n", - IP6H_PLEN(ip6hdr) + IP6_HLEN, p->tot_len)); - } - /* free (drop) packet pbufs */ - pbuf_free(p); - IP6_STATS_INC(ip6.lenerr); - IP6_STATS_INC(ip6.drop); - return ERR_OK; - } - - /* Trim pbuf. This should have been done at the netif layer, - * but we'll do it anyway just to be sure that its done. */ - pbuf_realloc(p, IP6_HLEN + IP6H_PLEN(ip6hdr)); - - /* copy IP addresses to aligned ip6_addr_t */ - ip6_addr_copy(ip_data.current_iphdr_dest.ip6, ip6hdr->dest); - ip6_addr_copy(ip_data.current_iphdr_src.ip6, ip6hdr->src); - - /* current header pointer. */ - ip_data.current_ip6_header = ip6hdr; - - /* In netif, used in case we need to send ICMPv6 packets back. */ - ip_data.current_netif = inp; - - /* match packet against an interface, i.e. is this packet for us? */ - if (ip6_addr_ismulticast(ip6_current_dest_addr())) { - /* Always joined to multicast if-local and link-local all-nodes group. */ - if (ip6_addr_isallnodes_iflocal(ip6_current_dest_addr()) || - ip6_addr_isallnodes_linklocal(ip6_current_dest_addr())) { - netif = inp; - } -#if LWIP_IPV6_MLD - else if (mld6_lookfor_group(inp, ip6_current_dest_addr())) { - netif = inp; - } -#else /* LWIP_IPV6_MLD */ - else if (ip6_addr_issolicitednode(ip6_current_dest_addr())) { - /* Filter solicited node packets when MLD is not enabled - * (for Neighbor discovery). */ - netif = NULL; - for (i = 0; i < LWIP_IPV6_NUM_ADDRESSES; i++) { - if (ip6_addr_isvalid(netif_ip6_addr_state(inp, i)) && - ip6_addr_cmp_solicitednode(ip6_current_dest_addr(), netif_ip6_addr(inp, i))) { - netif = inp; - LWIP_DEBUGF(IP6_DEBUG, ("ip6_input: solicited node packet accepted on interface %c%c\n", - netif->name[0], netif->name[1])); - break; - } - } - } -#endif /* LWIP_IPV6_MLD */ - else { - netif = NULL; - } - } - else { - /* start trying with inp. if that's not acceptable, start walking the - list of configured netifs. - 'first' is used as a boolean to mark whether we started walking the list */ - int first = 1; - netif = inp; - do { - /* interface is up? */ - if (netif_is_up(netif)) { - /* unicast to this interface address? address configured? */ - for (i = 0; i < LWIP_IPV6_NUM_ADDRESSES; i++) { - if (ip6_addr_isvalid(netif_ip6_addr_state(netif, i)) && - ip6_addr_cmp(ip6_current_dest_addr(), netif_ip6_addr(netif, i))) { - /* exit outer loop */ - goto netif_found; - } - } - } - if (ip6_addr_islinklocal(ip6_current_dest_addr())) { - /* Do not match link-local addresses to other netifs. */ - netif = NULL; - break; - } - if (first) { - first = 0; - netif = netif_list; - } else { - netif = netif->next; - } - if (netif == inp) { - netif = netif->next; - } - } while(netif != NULL); -netif_found: - LWIP_DEBUGF(IP6_DEBUG, ("ip6_input: packet accepted on interface %c%c\n", - netif ? netif->name[0] : 'X', netif? netif->name[1] : 'X')); - } - - /* "::" packet source address? (used in duplicate address detection) */ - if (ip6_addr_isany(ip6_current_src_addr()) && - (!ip6_addr_issolicitednode(ip6_current_dest_addr()))) { - /* packet source is not valid */ - /* free (drop) packet pbufs */ - LWIP_DEBUGF(IP6_DEBUG, ("ip6_input: packet with src ANY_ADDRESS dropped\n")); - pbuf_free(p); - IP6_STATS_INC(ip6.drop); - goto ip6_input_cleanup; - } - - /* if we're pretending we are everyone for TCP, assume the packet is for source interface if it - isn't for a local address */ - if (netif == NULL && (inp->flags & NETIF_FLAG_PRETEND_TCP) && IP6H_NEXTH(ip6hdr) == IP6_NEXTH_TCP) { - netif = inp; - } - - /* packet not for us? */ - if (netif == NULL) { - /* packet not for us, route or discard */ - LWIP_DEBUGF(IP6_DEBUG | LWIP_DBG_TRACE, ("ip6_input: packet not for us.\n")); -#if LWIP_IPV6_FORWARD - /* non-multicast packet? */ - if (!ip6_addr_ismulticast(ip6_current_dest_addr())) { - /* try to forward IP packet on (other) interfaces */ - ip6_forward(p, ip6hdr, inp); - } -#endif /* LWIP_IPV6_FORWARD */ - pbuf_free(p); - goto ip6_input_cleanup; - } - - /* current netif pointer. */ - ip_data.current_netif = netif; - - /* Save next header type. */ - nexth = IP6H_NEXTH(ip6hdr); - - /* Init header length. */ - hlen = ip_data.current_ip_header_tot_len = IP6_HLEN; - - /* Move to payload. */ - pbuf_header(p, -IP6_HLEN); - - /* Process known option extension headers, if present. */ - while (nexth != IP6_NEXTH_NONE) - { - switch (nexth) { - case IP6_NEXTH_HOPBYHOP: - LWIP_DEBUGF(IP6_DEBUG, ("ip6_input: packet with Hop-by-Hop options header\n")); - /* Get next header type. */ - nexth = *((u8_t *)p->payload); - - /* Get the header length. */ - hlen = 8 * (1 + *((u8_t *)p->payload + 1)); - ip_data.current_ip_header_tot_len += hlen; - - /* Skip over this header. */ - if (hlen > p->len) { - LWIP_DEBUGF(IP6_DEBUG | LWIP_DBG_LEVEL_SERIOUS, - ("IPv6 options header (hlen %"U16_F") does not fit in first pbuf (len %"U16_F"), IPv6 packet dropped.\n", - hlen, p->len)); - /* free (drop) packet pbufs */ - pbuf_free(p); - IP6_STATS_INC(ip6.lenerr); - IP6_STATS_INC(ip6.drop); - goto ip6_input_cleanup; - } - - pbuf_header(p, -hlen); - break; - case IP6_NEXTH_DESTOPTS: - LWIP_DEBUGF(IP6_DEBUG, ("ip6_input: packet with Destination options header\n")); - /* Get next header type. */ - nexth = *((u8_t *)p->payload); - - /* Get the header length. */ - hlen = 8 * (1 + *((u8_t *)p->payload + 1)); - ip_data.current_ip_header_tot_len += hlen; - - /* Skip over this header. */ - if (hlen > p->len) { - LWIP_DEBUGF(IP6_DEBUG | LWIP_DBG_LEVEL_SERIOUS, - ("IPv6 options header (hlen %"U16_F") does not fit in first pbuf (len %"U16_F"), IPv6 packet dropped.\n", - hlen, p->len)); - /* free (drop) packet pbufs */ - pbuf_free(p); - IP6_STATS_INC(ip6.lenerr); - IP6_STATS_INC(ip6.drop); - goto ip6_input_cleanup; - } - - pbuf_header(p, -hlen); - break; - case IP6_NEXTH_ROUTING: - LWIP_DEBUGF(IP6_DEBUG, ("ip6_input: packet with Routing header\n")); - /* Get next header type. */ - nexth = *((u8_t *)p->payload); - - /* Get the header length. */ - hlen = 8 * (1 + *((u8_t *)p->payload + 1)); - ip_data.current_ip_header_tot_len += hlen; - - /* Skip over this header. */ - if (hlen > p->len) { - LWIP_DEBUGF(IP6_DEBUG | LWIP_DBG_LEVEL_SERIOUS, - ("IPv6 options header (hlen %"U16_F") does not fit in first pbuf (len %"U16_F"), IPv6 packet dropped.\n", - hlen, p->len)); - /* free (drop) packet pbufs */ - pbuf_free(p); - IP6_STATS_INC(ip6.lenerr); - IP6_STATS_INC(ip6.drop); - goto ip6_input_cleanup; - } - - pbuf_header(p, -hlen); - break; - - case IP6_NEXTH_FRAGMENT: - { - struct ip6_frag_hdr * frag_hdr; - LWIP_DEBUGF(IP6_DEBUG, ("ip6_input: packet with Fragment header\n")); - - frag_hdr = (struct ip6_frag_hdr *)p->payload; - - /* Get next header type. */ - nexth = frag_hdr->_nexth; - - /* Fragment Header length. */ - hlen = 8; - ip_data.current_ip_header_tot_len += hlen; - - /* Make sure this header fits in current pbuf. */ - if (hlen > p->len) { - LWIP_DEBUGF(IP6_DEBUG | LWIP_DBG_LEVEL_SERIOUS, - ("IPv6 options header (hlen %"U16_F") does not fit in first pbuf (len %"U16_F"), IPv6 packet dropped.\n", - hlen, p->len)); - /* free (drop) packet pbufs */ - pbuf_free(p); - IP6_FRAG_STATS_INC(ip6_frag.lenerr); - IP6_FRAG_STATS_INC(ip6_frag.drop); - goto ip6_input_cleanup; - } - - /* Offset == 0 and more_fragments == 0? */ - if (((frag_hdr->_fragment_offset & IP6_FRAG_OFFSET_MASK) == 0) && - ((frag_hdr->_fragment_offset & IP6_FRAG_MORE_FLAG) == 0)) { - - /* This is a 1-fragment packet, usually a packet that we have - * already reassembled. Skip this header anc continue. */ - pbuf_header(p, -hlen); - } - else { -#if LWIP_IPV6_REASS - - /* reassemble the packet */ - p = ip6_reass(p); - /* packet not fully reassembled yet? */ - if (p == NULL) { - goto ip6_input_cleanup; - } - - /* Returned p point to IPv6 header. - * Update all our variables and pointers and continue. */ - ip6hdr = (struct ip6_hdr *)p->payload; - nexth = IP6H_NEXTH(ip6hdr); - hlen = ip_data.current_ip_header_tot_len = IP6_HLEN; - pbuf_header(p, -IP6_HLEN); - -#else /* LWIP_IPV6_REASS */ - /* free (drop) packet pbufs */ - LWIP_DEBUGF(IP6_DEBUG, ("ip6_input: packet with Fragment header dropped (with LWIP_IPV6_REASS==0)\n")); - pbuf_free(p); - IP6_STATS_INC(ip6.opterr); - IP6_STATS_INC(ip6.drop); - goto ip6_input_cleanup; -#endif /* LWIP_IPV6_REASS */ - } - break; - } - default: - goto options_done; - break; - } - } -options_done: - - /* p points to IPv6 header again. */ - pbuf_header(p, ip_data.current_ip_header_tot_len); - - /* send to upper layers */ - LWIP_DEBUGF(IP6_DEBUG, ("ip6_input: \n")); - ip6_debug_print(p); - LWIP_DEBUGF(IP6_DEBUG, ("ip6_input: p->len %"U16_F" p->tot_len %"U16_F"\n", p->len, p->tot_len)); - -#if LWIP_RAW - /* raw input did not eat the packet? */ - if (raw_input(p, inp) == 0) -#endif /* LWIP_RAW */ - { - switch (nexth) { - case IP6_NEXTH_NONE: - pbuf_free(p); - break; -#if LWIP_UDP - case IP6_NEXTH_UDP: -#if LWIP_UDPLITE - case IP6_NEXTH_UDPLITE: -#endif /* LWIP_UDPLITE */ - /* Point to payload. */ - pbuf_header(p, -ip_data.current_ip_header_tot_len); - udp_input(p, inp); - break; -#endif /* LWIP_UDP */ -#if LWIP_TCP - case IP6_NEXTH_TCP: - /* Point to payload. */ - pbuf_header(p, -ip_data.current_ip_header_tot_len); - tcp_input(p, inp); - break; -#endif /* LWIP_TCP */ -#if LWIP_ICMP6 - case IP6_NEXTH_ICMP6: - /* Point to payload. */ - pbuf_header(p, -ip_data.current_ip_header_tot_len); - icmp6_input(p, inp); - break; -#endif /* LWIP_ICMP */ - default: -#if LWIP_ICMP6 - /* send ICMP parameter problem unless it was a multicast or ICMPv6 */ - if ((!ip6_addr_ismulticast(ip6_current_dest_addr())) && - (IP6H_NEXTH(ip6hdr) != IP6_NEXTH_ICMP6)) { - icmp6_param_problem(p, ICMP6_PP_HEADER, ip_data.current_ip_header_tot_len - hlen); - } -#endif /* LWIP_ICMP */ - LWIP_DEBUGF(IP6_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("ip6_input: Unsupported transport protocol %"U16_F"\n", IP6H_NEXTH(ip6hdr))); - pbuf_free(p); - IP6_STATS_INC(ip6.proterr); - IP6_STATS_INC(ip6.drop); - break; - } - } - -ip6_input_cleanup: - ip_data.current_netif = NULL; - ip_data.current_ip6_header = NULL; - ip_data.current_ip_header_tot_len = 0; - ip6_addr_set_any(&ip_data.current_iphdr_src.ip6); - ip6_addr_set_any(&ip_data.current_iphdr_dest.ip6); - - return ERR_OK; -} - - -/** - * Sends an IPv6 packet on a network interface. This function constructs - * the IPv6 header. If the source IPv6 address is NULL, the IPv6 "ANY" address is - * used as source (usually during network startup). If the source IPv6 address it - * IP6_ADDR_ANY, the most appropriate IPv6 address of the outgoing network - * interface is filled in as source address. If the destination IPv6 address is - * IP_HDRINCL, p is assumed to already include an IPv6 header and p->payload points - * to it instead of the data. - * - * @param p the packet to send (p->payload points to the data, e.g. next - protocol header; if dest == IP_HDRINCL, p already includes an - IPv6 header and p->payload points to that IPv6 header) - * @param src the source IPv6 address to send from (if src == IP6_ADDR_ANY, an - * IP address of the netif is selected and used as source address. - * if src == NULL, IP6_ADDR_ANY is used as source) - * @param dest the destination IPv6 address to send the packet to - * @param hl the Hop Limit value to be set in the IPv6 header - * @param tc the Traffic Class value to be set in the IPv6 header - * @param nexth the Next Header to be set in the IPv6 header - * @param netif the netif on which to send this packet - * @return ERR_OK if the packet was sent OK - * ERR_BUF if p doesn't have enough space for IPv6/LINK headers - * returns errors returned by netif->output - */ -err_t -ip6_output_if(struct pbuf *p, ip6_addr_t *src, ip6_addr_t *dest, - u8_t hl, u8_t tc, - u8_t nexth, struct netif *netif) -{ - struct ip6_hdr *ip6hdr; - ip6_addr_t dest_addr; - - /* pbufs passed to IP must have a ref-count of 1 as their payload pointer - gets altered as the packet is passed down the stack */ - LWIP_ASSERT("p->ref == 1", p->ref == 1); - - /* Should the IPv6 header be generated or is it already included in p? */ - if (dest != IP_HDRINCL) { - /* generate IPv6 header */ - if (pbuf_header(p, IP6_HLEN)) { - LWIP_DEBUGF(IP6_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("ip6_output: not enough room for IPv6 header in pbuf\n")); - IP6_STATS_INC(ip6.err); - return ERR_BUF; - } - - ip6hdr = (struct ip6_hdr *)p->payload; - LWIP_ASSERT("check that first pbuf can hold struct ip6_hdr", - (p->len >= sizeof(struct ip6_hdr))); - - IP6H_HOPLIM_SET(ip6hdr, hl); - IP6H_NEXTH_SET(ip6hdr, nexth); - - /* dest cannot be NULL here */ - ip6_addr_copy(ip6hdr->dest, *dest); - - IP6H_VTCFL_SET(ip6hdr, 6, tc, 0); - IP6H_PLEN_SET(ip6hdr, p->tot_len - IP6_HLEN); - - if (src == NULL) { - src = IP6_ADDR_ANY; - } - else if (ip6_addr_isany(src)) { - src = ip6_select_source_address(netif, dest); - if ((src == NULL) || ip6_addr_isany(src)) { - /* No appropriate source address was found for this packet. */ - LWIP_DEBUGF(IP6_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("ip6_output: No suitable source address for packet.\n")); - IP6_STATS_INC(ip6.rterr); - return ERR_RTE; - } - } - /* src cannot be NULL here */ - ip6_addr_copy(ip6hdr->src, *src); - - } else { - /* IP header already included in p */ - ip6hdr = (struct ip6_hdr *)p->payload; - ip6_addr_copy(dest_addr, ip6hdr->dest); - dest = &dest_addr; - } - - IP6_STATS_INC(ip6.xmit); - - LWIP_DEBUGF(IP6_DEBUG, ("ip6_output_if: %c%c%"U16_F"\n", netif->name[0], netif->name[1], netif->num)); - ip6_debug_print(p); - -#if ENABLE_LOOPBACK - /* TODO implement loopback for v6 - if (ip6_addr_cmp(dest, netif_ip6_addr(0))) { - return netif_loop_output(netif, p, dest); - }*/ -#endif /* ENABLE_LOOPBACK */ -#if LWIP_IPV6_FRAG - /* don't fragment if interface has mtu set to 0 [loopif] */ - if (netif->mtu && (p->tot_len > nd6_get_destination_mtu(dest, netif))) { - return ip6_frag(p, netif, dest); - } -#endif /* LWIP_IPV6_FRAG */ - - LWIP_DEBUGF(IP6_DEBUG, ("netif->output_ip6()")); - return netif->output_ip6(netif, p, dest); -} - -/** - * Simple interface to ip6_output_if. It finds the outgoing network - * interface and calls upon ip6_output_if to do the actual work. - * - * @param p the packet to send (p->payload points to the data, e.g. next - protocol header; if dest == IP_HDRINCL, p already includes an - IPv6 header and p->payload points to that IPv6 header) - * @param src the source IPv6 address to send from (if src == IP6_ADDR_ANY, an - * IP address of the netif is selected and used as source address. - * if src == NULL, IP6_ADDR_ANY is used as source) - * @param dest the destination IPv6 address to send the packet to - * @param hl the Hop Limit value to be set in the IPv6 header - * @param tc the Traffic Class value to be set in the IPv6 header - * @param nexth the Next Header to be set in the IPv6 header - * - * @return ERR_RTE if no route is found - * see ip_output_if() for more return values - */ -err_t -ip6_output(struct pbuf *p, ip6_addr_t *src, ip6_addr_t *dest, - u8_t hl, u8_t tc, u8_t nexth) -{ - struct netif *netif; - struct ip6_hdr *ip6hdr; - ip6_addr_t src_addr, dest_addr; - - /* pbufs passed to IPv6 must have a ref-count of 1 as their payload pointer - gets altered as the packet is passed down the stack */ - LWIP_ASSERT("p->ref == 1", p->ref == 1); - - if (dest != IP_HDRINCL) { - netif = ip6_route(src, dest); - } else { - /* IP header included in p, read addresses. */ - ip6hdr = (struct ip6_hdr *)p->payload; - ip6_addr_copy(src_addr, ip6hdr->src); - ip6_addr_copy(dest_addr, ip6hdr->dest); - netif = ip6_route(&src_addr, &dest_addr); - } - - if (netif == NULL) { - LWIP_DEBUGF(IP6_DEBUG, ("ip6_output: no route for %"X16_F":%"X16_F":%"X16_F":%"X16_F":%"X16_F":%"X16_F":%"X16_F":%"X16_F"\n", - IP6_ADDR_BLOCK1(dest), - IP6_ADDR_BLOCK2(dest), - IP6_ADDR_BLOCK3(dest), - IP6_ADDR_BLOCK4(dest), - IP6_ADDR_BLOCK5(dest), - IP6_ADDR_BLOCK6(dest), - IP6_ADDR_BLOCK7(dest), - IP6_ADDR_BLOCK8(dest))); - IP6_STATS_INC(ip6.rterr); - return ERR_RTE; - } - - return ip6_output_if(p, src, dest, hl, tc, nexth, netif); -} - - -#if LWIP_NETIF_HWADDRHINT -/** Like ip6_output, but takes and addr_hint pointer that is passed on to netif->addr_hint - * before calling ip6_output_if. - * - * @param p the packet to send (p->payload points to the data, e.g. next - protocol header; if dest == IP_HDRINCL, p already includes an - IPv6 header and p->payload points to that IPv6 header) - * @param src the source IPv6 address to send from (if src == IP6_ADDR_ANY, an - * IP address of the netif is selected and used as source address. - * if src == NULL, IP6_ADDR_ANY is used as source) - * @param dest the destination IPv6 address to send the packet to - * @param hl the Hop Limit value to be set in the IPv6 header - * @param tc the Traffic Class value to be set in the IPv6 header - * @param nexth the Next Header to be set in the IPv6 header - * @param addr_hint address hint pointer set to netif->addr_hint before - * calling ip_output_if() - * - * @return ERR_RTE if no route is found - * see ip_output_if() for more return values - */ -err_t -ip6_output_hinted(struct pbuf *p, ip6_addr_t *src, ip6_addr_t *dest, - u8_t hl, u8_t tc, u8_t nexth, u8_t *addr_hint) -{ - struct netif *netif; - struct ip6_hdr *ip6hdr; - ip6_addr_t src_addr, dest_addr; - err_t err; - - /* pbufs passed to IP must have a ref-count of 1 as their payload pointer - gets altered as the packet is passed down the stack */ - LWIP_ASSERT("p->ref == 1", p->ref == 1); - - if (dest != IP_HDRINCL) { - netif = ip6_route(src, dest); - } else { - /* IP header included in p, read addresses. */ - ip6hdr = (struct ip6_hdr *)p->payload; - ip6_addr_copy(src_addr, ip6hdr->src); - ip6_addr_copy(dest_addr, ip6hdr->dest); - netif = ip6_route(&src_addr, &dest_addr); - } - - if (netif == NULL) { - LWIP_DEBUGF(IP6_DEBUG, ("ip6_output: no route for %"X16_F":%"X16_F":%"X16_F":%"X16_F":%"X16_F":%"X16_F":%"X16_F":%"X16_F"\n", - IP6_ADDR_BLOCK1(dest), - IP6_ADDR_BLOCK2(dest), - IP6_ADDR_BLOCK3(dest), - IP6_ADDR_BLOCK4(dest), - IP6_ADDR_BLOCK5(dest), - IP6_ADDR_BLOCK6(dest), - IP6_ADDR_BLOCK7(dest), - IP6_ADDR_BLOCK8(dest))); - IP6_STATS_INC(ip6.rterr); - return ERR_RTE; - } - - NETIF_SET_HWADDRHINT(netif, addr_hint); - err = ip6_output_if(p, src, dest, hl, tc, nexth, netif); - NETIF_SET_HWADDRHINT(netif, NULL); - - return err; -} -#endif /* LWIP_NETIF_HWADDRHINT*/ - -#if LWIP_IPV6_MLD -/** - * Add a hop-by-hop options header with a router alert option and padding. - * - * Used by MLD when sending a Multicast listener report/done message. - * - * @param p the packet to which we will prepend the options header - * @param nexth the next header protocol number (e.g. IP6_NEXTH_ICMP6) - * @param value the value of the router alert option data (e.g. IP6_ROUTER_ALERT_VALUE_MLD) - * @return ERR_OK if hop-by-hop header was added, ERR_* otherwise - */ -err_t -ip6_options_add_hbh_ra(struct pbuf * p, u8_t nexth, u8_t value) -{ - struct ip6_hbh_hdr * hbh_hdr; - - /* Move pointer to make room for hop-by-hop options header. */ - if (pbuf_header(p, sizeof(struct ip6_hbh_hdr))) { - LWIP_DEBUGF(IP6_DEBUG, ("ip6_options: no space for options header\n")); - IP6_STATS_INC(ip6.err); - return ERR_BUF; - } - - hbh_hdr = (struct ip6_hbh_hdr *)p->payload; - - /* Set fields. */ - hbh_hdr->_nexth = nexth; - hbh_hdr->_hlen = 0; - hbh_hdr->_ra_opt_type = IP6_ROUTER_ALERT_OPTION; - hbh_hdr->_ra_opt_dlen = 2; - hbh_hdr->_ra_opt_data = value; - hbh_hdr->_padn_opt_type = IP6_PADN_ALERT_OPTION; - hbh_hdr->_padn_opt_dlen = 0; - - return ERR_OK; -} -#endif /* LWIP_IPV6_MLD */ - -#if IP6_DEBUG -/* Print an IPv6 header by using LWIP_DEBUGF - * @param p an IPv6 packet, p->payload pointing to the IPv6 header - */ -void -ip6_debug_print(struct pbuf *p) -{ - struct ip6_hdr *ip6hdr = (struct ip6_hdr *)p->payload; - - LWIP_DEBUGF(IP6_DEBUG, ("IPv6 header:\n")); - LWIP_DEBUGF(IP6_DEBUG, ("+-------------------------------+\n")); - LWIP_DEBUGF(IP6_DEBUG, ("| %2"U16_F" | %3"U16_F" | %7"U32_F" | (ver, class, flow)\n", - IP6H_V(ip6hdr), - IP6H_TC(ip6hdr), - IP6H_FL(ip6hdr))); - LWIP_DEBUGF(IP6_DEBUG, ("+-------------------------------+\n")); - LWIP_DEBUGF(IP6_DEBUG, ("| %5"U16_F" | %3"U16_F" | %3"U16_F" | (plen, nexth, hopl)\n", - IP6H_PLEN(ip6hdr), - IP6H_NEXTH(ip6hdr), - IP6H_HOPLIM(ip6hdr))); - LWIP_DEBUGF(IP6_DEBUG, ("+-------------------------------+\n")); - LWIP_DEBUGF(IP6_DEBUG, ("| %4"X32_F" | %4"X32_F" | %4"X32_F" | %4"X32_F" | (src)\n", - IP6_ADDR_BLOCK1(&(ip6hdr->src)), - IP6_ADDR_BLOCK2(&(ip6hdr->src)), - IP6_ADDR_BLOCK3(&(ip6hdr->src)), - IP6_ADDR_BLOCK4(&(ip6hdr->src)))); - LWIP_DEBUGF(IP6_DEBUG, ("| %4"X32_F" | %4"X32_F" | %4"X32_F" | %4"X32_F" |\n", - IP6_ADDR_BLOCK5(&(ip6hdr->src)), - IP6_ADDR_BLOCK6(&(ip6hdr->src)), - IP6_ADDR_BLOCK7(&(ip6hdr->src)), - IP6_ADDR_BLOCK8(&(ip6hdr->src)))); - LWIP_DEBUGF(IP6_DEBUG, ("+-------------------------------+\n")); - LWIP_DEBUGF(IP6_DEBUG, ("| %4"X32_F" | %4"X32_F" | %4"X32_F" | %4"X32_F" | (dest)\n", - IP6_ADDR_BLOCK1(&(ip6hdr->dest)), - IP6_ADDR_BLOCK2(&(ip6hdr->dest)), - IP6_ADDR_BLOCK3(&(ip6hdr->dest)), - IP6_ADDR_BLOCK4(&(ip6hdr->dest)))); - LWIP_DEBUGF(IP6_DEBUG, ("| %4"X32_F" | %4"X32_F" | %4"X32_F" | %4"X32_F" |\n", - IP6_ADDR_BLOCK5(&(ip6hdr->dest)), - IP6_ADDR_BLOCK6(&(ip6hdr->dest)), - IP6_ADDR_BLOCK7(&(ip6hdr->dest)), - IP6_ADDR_BLOCK8(&(ip6hdr->dest)))); - LWIP_DEBUGF(IP6_DEBUG, ("+-------------------------------+\n")); -} -#endif /* IP6_DEBUG */ - -#endif /* LWIP_IPV6 */ diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/core/ipv6/ip6_addr.c b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/core/ipv6/ip6_addr.c deleted file mode 100644 index 65d27980..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/core/ipv6/ip6_addr.c +++ /dev/null @@ -1,251 +0,0 @@ -/** - * @file - * - * IPv6 addresses. - */ - -/* - * Copyright (c) 2010 Inico Technologies Ltd. - * 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. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT - * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING - * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY - * OF SUCH DAMAGE. - * - * This file is part of the lwIP TCP/IP stack. - * - * Author: Ivan Delamer - * - * Functions for handling IPv6 addresses. - * - * Please coordinate changes and requests with Ivan Delamer - * - */ - -#include "lwip/opt.h" - -#if LWIP_IPV6 /* don't build if not configured for use in lwipopts.h */ - -#include "lwip/ip6_addr.h" -#include "lwip/def.h" - -/* used by IP6_ADDR_ANY in ip6_addr.h */ -const ip6_addr_t ip6_addr_any = { { 0ul, 0ul, 0ul, 0ul } }; - -#ifndef isprint -#define in_range(c, lo, up) ((u8_t)c >= lo && (u8_t)c <= up) -#define isprint(c) in_range(c, 0x20, 0x7f) -#define isdigit(c) in_range(c, '0', '9') -#define isxdigit(c) (isdigit(c) || in_range(c, 'a', 'f') || in_range(c, 'A', 'F')) -#define islower(c) in_range(c, 'a', 'z') -#define isspace(c) (c == ' ' || c == '\f' || c == '\n' || c == '\r' || c == '\t' || c == '\v') -#define xchar(i) ((i) < 10 ? '0' + (i) : 'A' + (i) - 10) -#endif - -/** - * Check whether "cp" is a valid ascii representation - * of an IPv6 address and convert to a binary address. - * Returns 1 if the address is valid, 0 if not. - * - * @param cp IPv6 address in ascii represenation (e.g. "FF01::1") - * @param addr pointer to which to save the ip address in network order - * @return 1 if cp could be converted to addr, 0 on failure - */ -int -ip6addr_aton(const char *cp, ip6_addr_t *addr) -{ - u32_t addr_index, zero_blocks, current_block_index, current_block_value; - const char * s; - - /* Count the number of colons, to count the number of blocks in a "::" sequence - zero_blocks may be 1 even if there are no :: sequences */ - zero_blocks = 8; - for (s = cp; *s != 0; s++) { - if (*s == ':') - zero_blocks--; - else if (!isxdigit(*s)) - break; - } - - /* parse each block */ - addr_index = 0; - current_block_index = 0; - current_block_value = 0; - for (s = cp; *s != 0; s++) { - if (*s == ':') { - if (addr) { - if (current_block_index & 0x1) { - addr->addr[addr_index++] |= current_block_value; - } - else { - addr->addr[addr_index] = current_block_value << 16; - } - } - current_block_index++; - current_block_value = 0; - if (current_block_index > 7) { - /* address too long! */ - return 0; - } if (s[1] == ':') { - s++; - /* "::" found, set zeros */ - while (zero_blocks-- > 0) { - if (current_block_index & 0x1) { - addr_index++; - } - else { - if (addr) { - addr->addr[addr_index] = 0; - } - } - current_block_index++; - } - } - } else if (isxdigit(*s)) { - /* add current digit */ - current_block_value = (current_block_value << 4) + - (isdigit(*s) ? *s - '0' : - 10 + (islower(*s) ? *s - 'a' : *s - 'A')); - } else { - /* unexpected digit, space? CRLF? */ - break; - } - } - - if (addr) { - if (current_block_index & 0x1) { - addr->addr[addr_index++] |= current_block_value; - } - else { - addr->addr[addr_index] = current_block_value << 16; - } - } - - /* convert to network byte order. */ - if (addr) { - for (addr_index = 0; addr_index < 4; addr_index++) { - addr->addr[addr_index] = htonl(addr->addr[addr_index]); - } - } - - if (current_block_index != 7) { - return 0; - } - - return 1; -} - -/** - * Convert numeric IPv6 address into ASCII representation. - * returns ptr to static buffer; not reentrant! - * - * @param addr ip6 address in network order to convert - * @return pointer to a global static (!) buffer that holds the ASCII - * represenation of addr - */ -char * -ip6addr_ntoa(const ip6_addr_t *addr) -{ - static char str[40]; - return ip6addr_ntoa_r(addr, str, 40); -} - -/** - * Same as ipaddr_ntoa, but reentrant since a user-supplied buffer is used. - * - * @param addr ip6 address in network order to convert - * @param buf target buffer where the string is stored - * @param buflen length of buf - * @return either pointer to buf which now holds the ASCII - * representation of addr or NULL if buf was too small - */ -char * -ip6addr_ntoa_r(const ip6_addr_t *addr, char *buf, int buflen) -{ - u32_t current_block_index, current_block_value; - s32_t zero_flag, i; - - i = 0; - zero_flag = 0; /* used to indicate a zero chain for "::' */ - - for (current_block_index = 0; current_block_index < 8; current_block_index++) { - /* get the current 16-bit block */ - current_block_value = htonl(addr->addr[current_block_index >> 1]); - if ((current_block_index & 0x1) == 0) { - current_block_value = current_block_value >> 16; - } - current_block_value &= 0xffff; - - if (current_block_value == 0) { - /* generate empty block "::" */ - if (!zero_flag) { - if (current_block_index > 0) { - zero_flag = 1; - buf[i++] = ':'; - if (i >= buflen) return NULL; - } - } - } - else { - if (current_block_index > 0) { - buf[i++] = ':'; - if (i >= buflen) return NULL; - } - - if ((current_block_value & 0xf000) == 0) { - zero_flag = 1; - } - else { - buf[i++] = xchar(((current_block_value & 0xf000) >> 12)); - zero_flag = 0; - if (i >= buflen) return NULL; - } - - if (((current_block_value & 0xf00) == 0) && (zero_flag)) { - /* do nothing */ - } - else { - buf[i++] = xchar(((current_block_value & 0xf00) >> 8)); - zero_flag = 0; - if (i >= buflen) return NULL; - } - - if (((current_block_value & 0xf0) == 0) && (zero_flag)) { - /* do nothing */ - } - else { - buf[i++] = xchar(((current_block_value & 0xf0) >> 4)); - zero_flag = 0; - if (i >= buflen) return NULL; - } - - buf[i++] = xchar((current_block_value & 0xf)); - if (i >= buflen) return NULL; - - zero_flag = 0; - } - } - - buf[i] = 0; - - return buf; -} -#endif /* LWIP_IPV6 */ diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/core/ipv6/ip6_frag.c b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/core/ipv6/ip6_frag.c deleted file mode 100644 index a43fd614..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/core/ipv6/ip6_frag.c +++ /dev/null @@ -1,697 +0,0 @@ -/** - * @file - * - * IPv6 fragmentation and reassembly. - */ - -/* - * Copyright (c) 2010 Inico Technologies Ltd. - * 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. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT - * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING - * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY - * OF SUCH DAMAGE. - * - * This file is part of the lwIP TCP/IP stack. - * - * Author: Ivan Delamer - * - * - * Please coordinate changes and requests with Ivan Delamer - * - */ - -#include "lwip/opt.h" -#include "lwip/ip6_frag.h" -#include "lwip/ip6.h" -#include "lwip/icmp6.h" -#include "lwip/nd6.h" - -#include "lwip/pbuf.h" -#include "lwip/memp.h" -#include "lwip/stats.h" - -#include - -#if LWIP_IPV6 && LWIP_IPV6_REASS /* don't build if not configured for use in lwipopts.h */ - - -/** Setting this to 0, you can turn off checking the fragments for overlapping - * regions. The code gets a little smaller. Only use this if you know that - * overlapping won't occur on your network! */ -#ifndef IP_REASS_CHECK_OVERLAP -#define IP_REASS_CHECK_OVERLAP 1 -#endif /* IP_REASS_CHECK_OVERLAP */ - -/** Set to 0 to prevent freeing the oldest datagram when the reassembly buffer is - * full (IP_REASS_MAX_PBUFS pbufs are enqueued). The code gets a little smaller. - * Datagrams will be freed by timeout only. Especially useful when MEMP_NUM_REASSDATA - * is set to 1, so one datagram can be reassembled at a time, only. */ -#ifndef IP_REASS_FREE_OLDEST -#define IP_REASS_FREE_OLDEST 1 -#endif /* IP_REASS_FREE_OLDEST */ - -#define IP_REASS_FLAG_LASTFRAG 0x01 - -/** This is a helper struct which holds the starting - * offset and the ending offset of this fragment to - * easily chain the fragments. - * It has the same packing requirements as the IPv6 header, since it replaces - * the Fragment Header in memory in incoming fragments to keep - * track of the various fragments. - */ -#ifdef PACK_STRUCT_USE_INCLUDES -# include "arch/bpstruct.h" -#endif -PACK_STRUCT_BEGIN -struct ip6_reass_helper { - PACK_STRUCT_FIELD(struct pbuf *next_pbuf); - PACK_STRUCT_FIELD(u16_t start); - PACK_STRUCT_FIELD(u16_t end); -} PACK_STRUCT_STRUCT; -PACK_STRUCT_END -#ifdef PACK_STRUCT_USE_INCLUDES -# include "arch/epstruct.h" -#endif - -/* static variables */ -static struct ip6_reassdata *reassdatagrams; -static u16_t ip6_reass_pbufcount; - -/* Forward declarations. */ -static void ip6_reass_free_complete_datagram(struct ip6_reassdata *ipr); -#if IP_REASS_FREE_OLDEST -static void ip6_reass_remove_oldest_datagram(struct ip6_reassdata *ipr, int pbufs_needed); -#endif /* IP_REASS_FREE_OLDEST */ - -void -ip6_reass_tmr(void) -{ - struct ip6_reassdata *r, *tmp; - - r = reassdatagrams; - while (r != NULL) { - /* Decrement the timer. Once it reaches 0, - * clean up the incomplete fragment assembly */ - if (r->timer > 0) { - r->timer--; - r = r->next; - } else { - /* reassembly timed out */ - tmp = r; - /* get the next pointer before freeing */ - r = r->next; - /* free the helper struct and all enqueued pbufs */ - ip6_reass_free_complete_datagram(tmp); - } - } -} - -/** - * Free a datagram (struct ip6_reassdata) and all its pbufs. - * Updates the total count of enqueued pbufs (ip6_reass_pbufcount), - * sends an ICMP time exceeded packet. - * - * @param ipr datagram to free - */ -static void -ip6_reass_free_complete_datagram(struct ip6_reassdata *ipr) -{ - struct ip6_reassdata *prev; - u16_t pbufs_freed = 0; - u8_t clen; - struct pbuf *p; - struct ip6_reass_helper *iprh; - -#if LWIP_ICMP6 - iprh = (struct ip6_reass_helper *)ipr->p->payload; - if (iprh->start == 0) { - /* The first fragment was received, send ICMP time exceeded. */ - /* First, de-queue the first pbuf from r->p. */ - p = ipr->p; - ipr->p = iprh->next_pbuf; - /* Then, move back to the original header (we are now pointing to Fragment header). */ - if (pbuf_header(p, (u8_t*)p->payload - (u8_t*)ipr->iphdr)) { - LWIP_ASSERT("ip6_reass_free: moving p->payload to ip6 header failed\n", 0); - } - else { - icmp6_time_exceeded(p, ICMP6_TE_FRAG); - } - clen = pbuf_clen(p); - LWIP_ASSERT("pbufs_freed + clen <= 0xffff", pbufs_freed + clen <= 0xffff); - pbufs_freed += clen; - pbuf_free(p); - } -#endif /* LWIP_ICMP6 */ - - /* First, free all received pbufs. The individual pbufs need to be released - separately as they have not yet been chained */ - p = ipr->p; - while (p != NULL) { - struct pbuf *pcur; - iprh = (struct ip6_reass_helper *)p->payload; - pcur = p; - /* get the next pointer before freeing */ - p = iprh->next_pbuf; - clen = pbuf_clen(pcur); - LWIP_ASSERT("pbufs_freed + clen <= 0xffff", pbufs_freed + clen <= 0xffff); - pbufs_freed += clen; - pbuf_free(pcur); - } - - /* Then, unchain the struct ip6_reassdata from the list and free it. */ - if (ipr == reassdatagrams) { - reassdatagrams = ipr->next; - } else { - prev = reassdatagrams; - while (prev != NULL) { - if (prev->next == ipr) { - break; - } - prev = prev->next; - } - if (prev != NULL) { - prev->next = ipr->next; - } - } - memp_free(MEMP_IP6_REASSDATA, ipr); - - /* Finally, update number of pbufs in reassembly queue */ - LWIP_ASSERT("ip_reass_pbufcount >= clen", ip6_reass_pbufcount >= pbufs_freed); - ip6_reass_pbufcount -= pbufs_freed; -} - -#if IP_REASS_FREE_OLDEST -/** - * Free the oldest datagram to make room for enqueueing new fragments. - * The datagram ipr is not freed! - * - * @param ipr ip6_reassdata for the current fragment - * @param pbufs_needed number of pbufs needed to enqueue - * (used for freeing other datagrams if not enough space) - */ -static void -ip6_reass_remove_oldest_datagram(struct ip6_reassdata *ipr, int pbufs_needed) -{ - struct ip6_reassdata *r, *oldest; - - /* Free datagrams until being allowed to enqueue 'pbufs_needed' pbufs, - * but don't free the current datagram! */ - do { - r = oldest = reassdatagrams; - while (r != NULL) { - if (r != ipr) { - if (r->timer <= oldest->timer) { - /* older than the previous oldest */ - oldest = r; - } - } - r = r->next; - } - if (oldest != NULL) { - ip6_reass_free_complete_datagram(oldest); - } - } while (((ip6_reass_pbufcount + pbufs_needed) > IP_REASS_MAX_PBUFS) && (reassdatagrams != NULL)); -} -#endif /* IP_REASS_FREE_OLDEST */ - -/** - * Reassembles incoming IPv6 fragments into an IPv6 datagram. - * - * @param p points to the IPv6 Fragment Header - * @param len the length of the payload (after Fragment Header) - * @return NULL if reassembly is incomplete, pbuf pointing to - * IPv6 Header if reassembly is complete - */ -struct pbuf * -ip6_reass(struct pbuf *p) -{ - struct ip6_reassdata *ipr, *ipr_prev; - struct ip6_reass_helper *iprh, *iprh_tmp, *iprh_prev=NULL; - struct ip6_frag_hdr * frag_hdr; - u16_t offset, len; - u8_t clen, valid = 1; - struct pbuf *q; - - IP6_FRAG_STATS_INC(ip6_frag.recv); - - frag_hdr = (struct ip6_frag_hdr *) p->payload; - - clen = pbuf_clen(p); - - offset = ntohs(frag_hdr->_fragment_offset); - - /* Calculate fragment length from IPv6 payload length. - * Adjust for headers before Fragment Header. - * And finally adjust by Fragment Header length. */ - len = ntohs(ip6_current_header()->_plen); - len -= ((u8_t*)p->payload - (u8_t*)ip6_current_header()) - IP6_HLEN; - len -= IP6_FRAG_HLEN; - - /* Look for the datagram the fragment belongs to in the current datagram queue, - * remembering the previous in the queue for later dequeueing. */ - for (ipr = reassdatagrams, ipr_prev = NULL; ipr != NULL; ipr = ipr->next) { - /* Check if the incoming fragment matches the one currently present - in the reassembly buffer. If so, we proceed with copying the - fragment into the buffer. */ - if ((frag_hdr->_identification == ipr->identification) && - ip6_addr_cmp(ip6_current_src_addr(), &(ipr->iphdr->src)) && - ip6_addr_cmp(ip6_current_dest_addr(), &(ipr->iphdr->dest))) { - IP6_FRAG_STATS_INC(ip6_frag.cachehit); - break; - } - ipr_prev = ipr; - } - - if (ipr == NULL) { - /* Enqueue a new datagram into the datagram queue */ - ipr = (struct ip6_reassdata *)memp_malloc(MEMP_IP6_REASSDATA); - if (ipr == NULL) { -#if IP_REASS_FREE_OLDEST - /* Make room and try again. */ - ip6_reass_remove_oldest_datagram(ipr, clen); - ipr = (struct ip6_reassdata *)memp_malloc(MEMP_IP6_REASSDATA); - if (ipr == NULL) -#endif /* IP_REASS_FREE_OLDEST */ - { - IP6_FRAG_STATS_INC(ip6_frag.memerr); - IP6_FRAG_STATS_INC(ip6_frag.drop); - goto nullreturn; - } - } - - memset(ipr, 0, sizeof(struct ip6_reassdata)); - ipr->timer = IP_REASS_MAXAGE; - - /* enqueue the new structure to the front of the list */ - ipr->next = reassdatagrams; - reassdatagrams = ipr; - - /* Use the current IPv6 header for src/dest address reference. - * Eventually, we will replace it when we get the first fragment - * (it might be this one, in any case, it is done later). */ - ipr->iphdr = (struct ip6_hdr *)ip6_current_header(); - - /* copy the fragmented packet id. */ - ipr->identification = frag_hdr->_identification; - - /* copy the nexth field */ - ipr->nexth = frag_hdr->_nexth; - } - - /* Check if we are allowed to enqueue more datagrams. */ - if ((ip6_reass_pbufcount + clen) > IP_REASS_MAX_PBUFS) { -#if IP_REASS_FREE_OLDEST - ip6_reass_remove_oldest_datagram(ipr, clen); - if ((ip6_reass_pbufcount + clen) > IP_REASS_MAX_PBUFS) -#endif /* IP_REASS_FREE_OLDEST */ - { - /* @todo: send ICMPv6 time exceeded here? */ - /* drop this pbuf */ - IP6_FRAG_STATS_INC(ip6_frag.memerr); - IP6_FRAG_STATS_INC(ip6_frag.drop); - goto nullreturn; - } - } - - /* Overwrite Fragment Header with our own helper struct. */ - iprh = (struct ip6_reass_helper *)p->payload; - iprh->next_pbuf = NULL; - iprh->start = (offset & IP6_FRAG_OFFSET_MASK); - iprh->end = (offset & IP6_FRAG_OFFSET_MASK) + len; - - /* find the right place to insert this pbuf */ - /* Iterate through until we either get to the end of the list (append), - * or we find on with a larger offset (insert). */ - for (q = ipr->p; q != NULL;) { - iprh_tmp = (struct ip6_reass_helper*)q->payload; - if (iprh->start < iprh_tmp->start) { -#if IP_REASS_CHECK_OVERLAP - if (iprh->end > iprh_tmp->start) { - /* fragment overlaps with following, throw away */ - IP6_FRAG_STATS_INC(ip6_frag.proterr); - IP6_FRAG_STATS_INC(ip6_frag.drop); - goto nullreturn; - } - if (iprh_prev != NULL) { - if (iprh->start < iprh_prev->end) { - /* fragment overlaps with previous, throw away */ - IP6_FRAG_STATS_INC(ip6_frag.proterr); - IP6_FRAG_STATS_INC(ip6_frag.drop); - goto nullreturn; - } - } -#endif /* IP_REASS_CHECK_OVERLAP */ - /* the new pbuf should be inserted before this */ - iprh->next_pbuf = q; - if (iprh_prev != NULL) { - /* not the fragment with the lowest offset */ - iprh_prev->next_pbuf = p; - } else { - /* fragment with the lowest offset */ - ipr->p = p; - } - break; - } else if(iprh->start == iprh_tmp->start) { - /* received the same datagram twice: no need to keep the datagram */ - IP6_FRAG_STATS_INC(ip6_frag.drop); - goto nullreturn; -#if IP_REASS_CHECK_OVERLAP - } else if(iprh->start < iprh_tmp->end) { - /* overlap: no need to keep the new datagram */ - IP6_FRAG_STATS_INC(ip6_frag.proterr); - IP6_FRAG_STATS_INC(ip6_frag.drop); - goto nullreturn; -#endif /* IP_REASS_CHECK_OVERLAP */ - } else { - /* Check if the fragments received so far have no gaps. */ - if (iprh_prev != NULL) { - if (iprh_prev->end != iprh_tmp->start) { - /* There is a fragment missing between the current - * and the previous fragment */ - valid = 0; - } - } - } - q = iprh_tmp->next_pbuf; - iprh_prev = iprh_tmp; - } - - /* If q is NULL, then we made it to the end of the list. Determine what to do now */ - if (q == NULL) { - if (iprh_prev != NULL) { - /* this is (for now), the fragment with the highest offset: - * chain it to the last fragment */ -#if IP_REASS_CHECK_OVERLAP - LWIP_ASSERT("check fragments don't overlap", iprh_prev->end <= iprh->start); -#endif /* IP_REASS_CHECK_OVERLAP */ - iprh_prev->next_pbuf = p; - if (iprh_prev->end != iprh->start) { - valid = 0; - } - } else { -#if IP_REASS_CHECK_OVERLAP - LWIP_ASSERT("no previous fragment, this must be the first fragment!", - ipr->p == NULL); -#endif /* IP_REASS_CHECK_OVERLAP */ - /* this is the first fragment we ever received for this ip datagram */ - ipr->p = p; - } - } - - /* Track the current number of pbufs current 'in-flight', in order to limit - the number of fragments that may be enqueued at any one time */ - ip6_reass_pbufcount += clen; - - /* Remember IPv6 header if this is the first fragment. */ - if (iprh->start == 0) { - ipr->iphdr = (struct ip6_hdr *)ip6_current_header(); - } - - /* If this is the last fragment, calculate total packet length. */ - if ((offset & IP6_FRAG_MORE_FLAG) == 0) { - ipr->datagram_len = iprh->end; - } - - /* Additional validity tests: we have received first and last fragment. */ - iprh_tmp = (struct ip6_reass_helper*)ipr->p->payload; - if (iprh_tmp->start != 0) { - valid = 0; - } - if (ipr->datagram_len == 0) { - valid = 0; - } - - /* Final validity test: no gaps between current and last fragment. */ - iprh_prev = iprh; - q = iprh->next_pbuf; - while ((q != NULL) && valid) { - iprh = (struct ip6_reass_helper*)q->payload; - if (iprh_prev->end != iprh->start) { - valid = 0; - break; - } - iprh_prev = iprh; - q = iprh->next_pbuf; - } - - if (valid) { - /* All fragments have been received */ - - /* chain together the pbufs contained within the ip6_reassdata list. */ - iprh = (struct ip6_reass_helper*) ipr->p->payload; - while(iprh != NULL) { - - if (iprh->next_pbuf != NULL) { - /* Save next helper struct (will be hidden in next step). */ - iprh_tmp = (struct ip6_reass_helper*) iprh->next_pbuf->payload; - - /* hide the fragment header for every succeding fragment */ - pbuf_header(iprh->next_pbuf, -IP6_FRAG_HLEN); - pbuf_cat(ipr->p, iprh->next_pbuf); - } - else { - iprh_tmp = NULL; - } - - iprh = iprh_tmp; - } - - /* Adjust datagram length by adding header lengths. */ - ipr->datagram_len += ((u8_t*)ipr->p->payload - (u8_t*)ipr->iphdr) - + IP6_FRAG_HLEN - - IP6_HLEN ; - - /* Set payload length in ip header. */ - ipr->iphdr->_plen = htons(ipr->datagram_len); - - /* Get the furst pbuf. */ - p = ipr->p; - - /* Restore Fragment Header in first pbuf. Mark as "single fragment" - * packet. Restore nexth. */ - frag_hdr = (struct ip6_frag_hdr *) p->payload; - frag_hdr->_nexth = ipr->nexth; - frag_hdr->reserved = 0; - frag_hdr->_fragment_offset = 0; - frag_hdr->_identification = 0; - - /* release the sources allocate for the fragment queue entry */ - if (reassdatagrams == ipr) { - /* it was the first in the list */ - reassdatagrams = ipr->next; - } else { - /* it wasn't the first, so it must have a valid 'prev' */ - LWIP_ASSERT("sanity check linked list", ipr_prev != NULL); - ipr_prev->next = ipr->next; - } - memp_free(MEMP_IP6_REASSDATA, ipr); - - /* adjust the number of pbufs currently queued for reassembly. */ - ip6_reass_pbufcount -= pbuf_clen(p); - - /* Move pbuf back to IPv6 header. */ - if (pbuf_header(p, (u8_t*)p->payload - (u8_t*)ipr->iphdr)) { - LWIP_ASSERT("ip6_reass: moving p->payload to ip6 header failed\n", 0); - pbuf_free(p); - return NULL; - } - - /* Return the pbuf chain */ - return p; - } - /* the datagram is not (yet?) reassembled completely */ - return NULL; - -nullreturn: - pbuf_free(p); - return NULL; -} - -#endif /* LWIP_IPV6 ^^ LWIP_IPV6_REASS */ - -#if LWIP_IPV6 && LWIP_IPV6_FRAG - -/** Allocate a new struct pbuf_custom_ref */ -static struct pbuf_custom_ref* -ip6_frag_alloc_pbuf_custom_ref(void) -{ - return (struct pbuf_custom_ref*)memp_malloc(MEMP_FRAG_PBUF); -} - -/** Free a struct pbuf_custom_ref */ -static void -ip6_frag_free_pbuf_custom_ref(struct pbuf_custom_ref* p) -{ - LWIP_ASSERT("p != NULL", p != NULL); - memp_free(MEMP_FRAG_PBUF, p); -} - -/** Free-callback function to free a 'struct pbuf_custom_ref', called by - * pbuf_free. */ -static void -ip6_frag_free_pbuf_custom(struct pbuf *p) -{ - struct pbuf_custom_ref *pcr = (struct pbuf_custom_ref*)p; - LWIP_ASSERT("pcr != NULL", pcr != NULL); - LWIP_ASSERT("pcr == p", (void*)pcr == (void*)p); - if (pcr->original != NULL) { - pbuf_free(pcr->original); - } - ip6_frag_free_pbuf_custom_ref(pcr); -} - -/** - * Fragment an IPv6 datagram if too large for the netif or path MTU. - * - * Chop the datagram in MTU sized chunks and send them in order - * by pointing PBUF_REFs into p - * - * @param p ipv6 packet to send - * @param netif the netif on which to send - * @param dest destination ipv6 address to which to send - * - * @return ERR_OK if sent successfully, err_t otherwise - */ -err_t -ip6_frag(struct pbuf *p, struct netif *netif, ip6_addr_t *dest) -{ - struct ip6_hdr *original_ip6hdr; - struct ip6_hdr *ip6hdr; - struct ip6_frag_hdr * frag_hdr; - struct pbuf *rambuf; - struct pbuf *newpbuf; - static u32_t identification; - u16_t nfb; - u16_t left, cop; - u16_t mtu; - u16_t fragment_offset = 0; - u16_t last; - u16_t poff = IP6_HLEN; - u16_t newpbuflen = 0; - u16_t left_to_copy; - - identification++; - - original_ip6hdr = (struct ip6_hdr *)p->payload; - - mtu = nd6_get_destination_mtu(dest, netif); - - /* TODO we assume there are no options in the unfragmentable part (IPv6 header). */ - left = p->tot_len - IP6_HLEN; - - nfb = (mtu - (IP6_HLEN + IP6_FRAG_HLEN)) & IP6_FRAG_OFFSET_MASK; - - while (left) { - last = (left <= nfb); - - /* Fill this fragment */ - cop = last ? left : nfb; - - /* When not using a static buffer, create a chain of pbufs. - * The first will be a PBUF_RAM holding the link, IPv6, and Fragment header. - * The rest will be PBUF_REFs mirroring the pbuf chain to be fragged, - * but limited to the size of an mtu. - */ - rambuf = pbuf_alloc(PBUF_LINK, IP6_HLEN + IP6_FRAG_HLEN, PBUF_RAM); - if (rambuf == NULL) { - IP6_FRAG_STATS_INC(ip6_frag.memerr); - return ERR_MEM; - } - LWIP_ASSERT("this needs a pbuf in one piece!", - (p->len >= (IP6_HLEN + IP6_FRAG_HLEN))); - SMEMCPY(rambuf->payload, original_ip6hdr, IP6_HLEN); - ip6hdr = (struct ip6_hdr *)rambuf->payload; - frag_hdr = (struct ip6_frag_hdr *)((u8_t*)rambuf->payload + IP6_HLEN); - - /* Can just adjust p directly for needed offset. */ - p->payload = (u8_t *)p->payload + poff; - p->len -= poff; - p->tot_len -= poff; - - left_to_copy = cop; - while (left_to_copy) { - struct pbuf_custom_ref *pcr; - newpbuflen = (left_to_copy < p->len) ? left_to_copy : p->len; - /* Is this pbuf already empty? */ - if (!newpbuflen) { - p = p->next; - continue; - } - pcr = ip6_frag_alloc_pbuf_custom_ref(); - if (pcr == NULL) { - pbuf_free(rambuf); - IP6_FRAG_STATS_INC(ip6_frag.memerr); - return ERR_MEM; - } - /* Mirror this pbuf, although we might not need all of it. */ - newpbuf = pbuf_alloced_custom(PBUF_RAW, newpbuflen, PBUF_REF, &pcr->pc, p->payload, newpbuflen); - if (newpbuf == NULL) { - ip6_frag_free_pbuf_custom_ref(pcr); - pbuf_free(rambuf); - IP6_FRAG_STATS_INC(ip6_frag.memerr); - return ERR_MEM; - } - pbuf_ref(p); - pcr->original = p; - pcr->pc.custom_free_function = ip6_frag_free_pbuf_custom; - - /* Add it to end of rambuf's chain, but using pbuf_cat, not pbuf_chain - * so that it is removed when pbuf_dechain is later called on rambuf. - */ - pbuf_cat(rambuf, newpbuf); - left_to_copy -= newpbuflen; - if (left_to_copy) { - p = p->next; - } - } - poff = newpbuflen; - - /* Set headers */ - frag_hdr->_nexth = original_ip6hdr->_nexth; - frag_hdr->reserved = 0; - frag_hdr->_fragment_offset = htons((fragment_offset & IP6_FRAG_OFFSET_MASK) | (last ? 0 : IP6_FRAG_MORE_FLAG)); - frag_hdr->_identification = htonl(identification); - - IP6H_NEXTH_SET(ip6hdr, IP6_NEXTH_FRAGMENT); - IP6H_PLEN_SET(ip6hdr, cop + IP6_FRAG_HLEN); - - /* No need for separate header pbuf - we allowed room for it in rambuf - * when allocated. - */ - IP6_FRAG_STATS_INC(ip6_frag.xmit); - netif->output_ip6(netif, rambuf, dest); - - /* Unfortunately we can't reuse rambuf - the hardware may still be - * using the buffer. Instead we free it (and the ensuing chain) and - * recreate it next time round the loop. If we're lucky the hardware - * will have already sent the packet, the free will really free, and - * there will be zero memory penalty. - */ - - pbuf_free(rambuf); - left -= cop; - fragment_offset += cop; - } - return ERR_OK; -} - -#endif /* LWIP_IPV6 && LWIP_IPV6_FRAG */ diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/core/ipv6/nd6.c b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/core/ipv6/nd6.c deleted file mode 100644 index 43eb5318..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/core/ipv6/nd6.c +++ /dev/null @@ -1,1790 +0,0 @@ -/** - * @file - * - * Neighbor discovery and stateless address autoconfiguration for IPv6. - * Aims to be compliant with RFC 4861 (Neighbor discovery) and RFC 4862 - * (Address autoconfiguration). - */ - -/* - * Copyright (c) 2010 Inico Technologies Ltd. - * 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. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT - * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING - * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY - * OF SUCH DAMAGE. - * - * This file is part of the lwIP TCP/IP stack. - * - * Author: Ivan Delamer - * - * - * Please coordinate changes and requests with Ivan Delamer - * - */ - -#include "lwip/opt.h" - -#if LWIP_IPV6 /* don't build if not configured for use in lwipopts.h */ - -#include "lwip/nd6.h" -#include "lwip/pbuf.h" -#include "lwip/mem.h" -#include "lwip/memp.h" -#include "lwip/ip6.h" -#include "lwip/ip6_addr.h" -#include "lwip/inet_chksum.h" -#include "lwip/netif.h" -#include "lwip/icmp6.h" -#include "lwip/mld6.h" -#include "lwip/stats.h" - -#include - - -/* Router tables. */ -struct nd6_neighbor_cache_entry neighbor_cache[LWIP_ND6_NUM_NEIGHBORS]; -struct nd6_destination_cache_entry destination_cache[LWIP_ND6_NUM_DESTINATIONS]; -struct nd6_prefix_list_entry prefix_list[LWIP_ND6_NUM_PREFIXES]; -struct nd6_router_list_entry default_router_list[LWIP_ND6_NUM_ROUTERS]; - -/* Default values, can be updated by a RA message. */ -u32_t reachable_time = LWIP_ND6_REACHABLE_TIME; -u32_t retrans_timer = LWIP_ND6_RETRANS_TIMER; /* TODO implement this value in timer */ - -/* Index for cache entries. */ -static u8_t nd6_cached_neighbor_index; -static u8_t nd6_cached_destination_index; - -/* Multicast address holder. */ -static ip6_addr_t multicast_address; - -/* Static buffer to parse RA packet options (size of a prefix option, biggest option) */ -static u8_t nd6_ra_buffer[sizeof(struct prefix_option)]; - -/* Forward declarations. */ -static s8_t nd6_find_neighbor_cache_entry(ip6_addr_t * ip6addr); -static s8_t nd6_new_neighbor_cache_entry(void); -static void nd6_free_neighbor_cache_entry(s8_t i); -static s8_t nd6_find_destination_cache_entry(ip6_addr_t * ip6addr); -static s8_t nd6_new_destination_cache_entry(void); -static s8_t nd6_is_prefix_in_netif(ip6_addr_t * ip6addr, struct netif * netif); -static s8_t nd6_get_router(ip6_addr_t * router_addr, struct netif * netif); -static s8_t nd6_new_router(ip6_addr_t * router_addr, struct netif * netif); -static s8_t nd6_get_onlink_prefix(ip6_addr_t * prefix, struct netif * netif); -static s8_t nd6_new_onlink_prefix(ip6_addr_t * prefix, struct netif * netif); - -#define ND6_SEND_FLAG_MULTICAST_DEST 0x01 -#define ND6_SEND_FLAG_ALLNODES_DEST 0x02 -static void nd6_send_ns(struct netif * netif, ip6_addr_t * target_addr, u8_t flags); -static void nd6_send_na(struct netif * netif, ip6_addr_t * target_addr, u8_t flags); -#if LWIP_IPV6_SEND_ROUTER_SOLICIT -static void nd6_send_rs(struct netif * netif); -#endif /* LWIP_IPV6_SEND_ROUTER_SOLICIT */ - -#if LWIP_ND6_QUEUEING -static void nd6_free_q(struct nd6_q_entry *q); -#else /* LWIP_ND6_QUEUEING */ -#define nd6_free_q(q) pbuf_free(q) -#endif /* LWIP_ND6_QUEUEING */ -static void nd6_send_q(s8_t i); - - -/** - * Process an incoming neighbor discovery message - * - * @param p the nd packet, p->payload pointing to the icmpv6 header - * @param inp the netif on which this packet was received - */ -void -nd6_input(struct pbuf *p, struct netif *inp) -{ - u8_t msg_type; - s8_t i; - - ND6_STATS_INC(nd6.recv); - - msg_type = *((u8_t *)p->payload); - switch (msg_type) { - case ICMP6_TYPE_NA: /* Neighbor Advertisement. */ - { - struct na_header * na_hdr; - struct lladdr_option * lladdr_opt; - - /* Check that na header fits in packet. */ - if (p->len < (sizeof(struct na_header))) { - /* TODO debug message */ - pbuf_free(p); - ND6_STATS_INC(nd6.lenerr); - ND6_STATS_INC(nd6.drop); - return; - } - - na_hdr = (struct na_header *)p->payload; - - /* Unsolicited NA?*/ - if (ip6_addr_ismulticast(ip6_current_dest_addr())) { - /* This is an unsolicited NA. - * link-layer changed? - * part of DAD mechanism? */ - - /* Check that link-layer address option also fits in packet. */ - if (p->len < (sizeof(struct na_header) + sizeof(struct lladdr_option))) { - /* TODO debug message */ - pbuf_free(p); - ND6_STATS_INC(nd6.lenerr); - ND6_STATS_INC(nd6.drop); - return; - } - - lladdr_opt = (struct lladdr_option *)((u8_t*)p->payload + sizeof(struct na_header)); - - /* Override ip6_current_dest_addr() so that we have an aligned copy. */ - ip6_addr_set(ip6_current_dest_addr(), &(na_hdr->target_address)); - -#if LWIP_IPV6_DUP_DETECT_ATTEMPTS - /* If the target address matches this netif, it is a DAD response. */ - for (i = 0; i < LWIP_IPV6_NUM_ADDRESSES; i++) { - if (ip6_addr_cmp(ip6_current_dest_addr(), netif_ip6_addr(inp, i))) { - /* We are using a duplicate address. */ - netif_ip6_addr_set_state(inp, i, IP6_ADDR_INVALID); - -#if LWIP_IPV6_MLD - /* Leave solicited node multicast group. */ - ip6_addr_set_solicitednode(&multicast_address, netif_ip6_addr(inp, i)->addr[3]); - mld6_leavegroup(netif_ip6_addr(inp, i), &multicast_address); -#endif /* LWIP_IPV6_MLD */ - - - - -#if LWIP_IPV6_AUTOCONFIG - /* Check to see if this address was autoconfigured. */ - if (!ip6_addr_islinklocal(ip6_current_dest_addr())) { - i = nd6_get_onlink_prefix(ip6_current_dest_addr(), inp); - if (i >= 0) { - /* Mark this prefix as duplicate, so that we don't use it - * to generate this address again. */ - prefix_list[i].flags |= ND6_PREFIX_AUTOCONFIG_ADDRESS_DUPLICATE; - } - } -#endif /* LWIP_IPV6_AUTOCONFIG */ - - pbuf_free(p); - return; - } - } -#endif /* LWIP_IPV6_DUP_DETECT_ATTEMPTS */ - - /* This is an unsolicited NA, most likely there was a LLADDR change. */ - i = nd6_find_neighbor_cache_entry(ip6_current_dest_addr()); - if (i >= 0) { - if (na_hdr->flags & ND6_FLAG_OVERRIDE) { - MEMCPY(neighbor_cache[i].lladdr, lladdr_opt->addr, inp->hwaddr_len); - } - } - } - else { - /* This is a solicited NA. - * neighbor address resolution response? - * neighbor unreachability detection response? */ - - /* Override ip6_current_dest_addr() so that we have an aligned copy. */ - ip6_addr_set(ip6_current_dest_addr(), &(na_hdr->target_address)); - - /* Find the cache entry corresponding to this na. */ - i = nd6_find_neighbor_cache_entry(ip6_current_dest_addr()); - if (i < 0) { - /* We no longer care about this target address. drop it. */ - pbuf_free(p); - return; - } - - /* Update cache entry. */ - neighbor_cache[i].netif = inp; - neighbor_cache[i].counter.reachable_time = reachable_time; - if ((na_hdr->flags & ND6_FLAG_OVERRIDE) || - (neighbor_cache[i].state == ND6_INCOMPLETE)) { - /* Check that link-layer address option also fits in packet. */ - if (p->len < (sizeof(struct na_header) + sizeof(struct lladdr_option))) { - /* TODO debug message */ - pbuf_free(p); - ND6_STATS_INC(nd6.lenerr); - ND6_STATS_INC(nd6.drop); - return; - } - - lladdr_opt = (struct lladdr_option *)((u8_t*)p->payload + sizeof(struct na_header)); - - MEMCPY(neighbor_cache[i].lladdr, lladdr_opt->addr, inp->hwaddr_len); - } - neighbor_cache[i].state = ND6_REACHABLE; - - /* Send queued packets, if any. */ - if (neighbor_cache[i].q != NULL) { - nd6_send_q(i); - } - } - - break; /* ICMP6_TYPE_NA */ - } - case ICMP6_TYPE_NS: /* Neighbor solicitation. */ - { - struct ns_header * ns_hdr; - struct lladdr_option * lladdr_opt; - u8_t accepted; - - /* Check that ns header fits in packet. */ - if (p->len < sizeof(struct ns_header)) { - /* TODO debug message */ - pbuf_free(p); - ND6_STATS_INC(nd6.lenerr); - ND6_STATS_INC(nd6.drop); - return; - } - - ns_hdr = (struct ns_header *)p->payload; - - /* Check if there is a link-layer address provided. Only point to it if in this buffer. */ - lladdr_opt = NULL; - if (p->len >= (sizeof(struct ns_header) + sizeof(struct lladdr_option))) { - lladdr_opt = (struct lladdr_option *)((u8_t*)p->payload + sizeof(struct ns_header)); - } - - /* Check if the target address is configured on the receiving netif. */ - accepted = 0; - for (i = 0; i < LWIP_IPV6_NUM_ADDRESSES; ++i) { - if ((ip6_addr_isvalid(netif_ip6_addr_state(inp, i)) || - (ip6_addr_istentative(netif_ip6_addr_state(inp, i)) && - ip6_addr_isany(ip6_current_src_addr()))) && - ip6_addr_cmp(&(ns_hdr->target_address), netif_ip6_addr(inp, i))) { - accepted = 1; - break; - } - } - - /* NS not for us? */ - if (!accepted) { - pbuf_free(p); - return; - } - - /* Check for ANY address in src (DAD algorithm). */ - if (ip6_addr_isany(ip6_current_src_addr())) { - /* Sender is validating this address. */ - for (i = 0; i < LWIP_IPV6_NUM_ADDRESSES; ++i) { - if (ip6_addr_cmp(&(ns_hdr->target_address), netif_ip6_addr(inp, i))) { - /* Send a NA back so that the sender does not use this address. */ - nd6_send_na(inp, netif_ip6_addr(inp, i), ND6_FLAG_OVERRIDE | ND6_SEND_FLAG_ALLNODES_DEST); - if (ip6_addr_istentative(netif_ip6_addr_state(inp, i))) { - /* We shouldn't use this address either. */ - netif_ip6_addr_set_state(inp, i, IP6_ADDR_INVALID); - } - } - } - } - else { - /* Sender is trying to resolve our address. */ - /* Verify that they included their own link-layer address. */ - if (lladdr_opt == NULL) { - /* Not a valid message. */ - pbuf_free(p); - ND6_STATS_INC(nd6.proterr); - ND6_STATS_INC(nd6.drop); - return; - } - - i = nd6_find_neighbor_cache_entry(ip6_current_src_addr()); - if ( i>= 0) { - /* We already have a record for the solicitor. */ - if (neighbor_cache[i].state == ND6_INCOMPLETE) { - neighbor_cache[i].netif = inp; - MEMCPY(neighbor_cache[i].lladdr, lladdr_opt->addr, inp->hwaddr_len); - - /* Delay probe in case we get confirmation of reachability from upper layer (TCP). */ - neighbor_cache[i].state = ND6_DELAY; - neighbor_cache[i].counter.delay_time = LWIP_ND6_DELAY_FIRST_PROBE_TIME; - } - } - else - { - /* Add their IPv6 address and link-layer address to neighbor cache. - * We will need it at least to send a unicast NA message, but most - * likely we will also be communicating with this node soon. */ - i = nd6_new_neighbor_cache_entry(); - if (i < 0) { - /* We couldn't assign a cache entry for this neighbor. - * we won't be able to reply. drop it. */ - pbuf_free(p); - ND6_STATS_INC(nd6.memerr); - return; - } - neighbor_cache[i].netif = inp; - MEMCPY(neighbor_cache[i].lladdr, lladdr_opt->addr, inp->hwaddr_len); - ip6_addr_set(&(neighbor_cache[i].next_hop_address), ip6_current_src_addr()); - - /* Receiving a message does not prove reachability: only in one direction. - * Delay probe in case we get confirmation of reachability from upper layer (TCP). */ - neighbor_cache[i].state = ND6_DELAY; - neighbor_cache[i].counter.delay_time = LWIP_ND6_DELAY_FIRST_PROBE_TIME; - } - - /* Override ip6_current_dest_addr() so that we have an aligned copy. */ - ip6_addr_set(ip6_current_dest_addr(), &(ns_hdr->target_address)); - - /* Send back a NA for us. Allocate the reply pbuf. */ - nd6_send_na(inp, ip6_current_dest_addr(), ND6_FLAG_SOLICITED | ND6_FLAG_OVERRIDE); - } - - break; /* ICMP6_TYPE_NS */ - } - case ICMP6_TYPE_RA: /* Router Advertisement. */ - { - struct ra_header * ra_hdr; - u8_t * buffer; /* Used to copy options. */ - u16_t offset; - - /* Check that RA header fits in packet. */ - if (p->len < sizeof(struct ra_header)) { - /* TODO debug message */ - pbuf_free(p); - ND6_STATS_INC(nd6.lenerr); - ND6_STATS_INC(nd6.drop); - return; - } - - ra_hdr = (struct ra_header *)p->payload; - - /* If we are sending RS messages, stop. */ -#if LWIP_IPV6_SEND_ROUTER_SOLICIT - inp->rs_count = 0; -#endif /* LWIP_IPV6_SEND_ROUTER_SOLICIT */ - - /* Get the matching default router entry. */ - i = nd6_get_router(ip6_current_src_addr(), inp); - if (i < 0) { - /* Create a new router entry. */ - i = nd6_new_router(ip6_current_src_addr(), inp); - } - - if (i < 0) { - /* Could not create a new router entry. */ - pbuf_free(p); - ND6_STATS_INC(nd6.memerr); - return; - } - - /* Re-set invalidation timer. */ - default_router_list[i].invalidation_timer = ra_hdr->router_lifetime; - - /* Re-set default timer values. */ -#if LWIP_ND6_ALLOW_RA_UPDATES - if (ra_hdr->retrans_timer > 0) { - retrans_timer = ra_hdr->retrans_timer; - } - if (ra_hdr->reachable_time > 0) { - reachable_time = ra_hdr->reachable_time; - } -#endif /* LWIP_ND6_ALLOW_RA_UPDATES */ - - /* TODO set default hop limit... */ - /* ra_hdr->current_hop_limit;*/ - - /* Update flags in local entry (incl. preference). */ - default_router_list[i].flags = ra_hdr->flags; - - /* Offset to options. */ - offset = sizeof(struct ra_header); - - /* Process each option. */ - while ((p->tot_len - offset) > 0) { - if (p->len == p->tot_len) { - /* no need to copy from contiguous pbuf */ - buffer = &((u8_t*)p->payload)[offset]; - } else { - buffer = nd6_ra_buffer; - pbuf_copy_partial(p, buffer, sizeof(struct prefix_option), offset); - } - switch (buffer[0]) { - case ND6_OPTION_TYPE_SOURCE_LLADDR: - { - struct lladdr_option * lladdr_opt; - lladdr_opt = (struct lladdr_option *)buffer; - if ((default_router_list[i].neighbor_entry != NULL) && - (default_router_list[i].neighbor_entry->state == ND6_INCOMPLETE)) { - SMEMCPY(default_router_list[i].neighbor_entry->lladdr, lladdr_opt->addr, inp->hwaddr_len); - default_router_list[i].neighbor_entry->state = ND6_REACHABLE; - default_router_list[i].neighbor_entry->counter.reachable_time = reachable_time; - } - break; - } - case ND6_OPTION_TYPE_MTU: - { - struct mtu_option * mtu_opt; - mtu_opt = (struct mtu_option *)buffer; - if (mtu_opt->mtu >= 1280) { -#if LWIP_ND6_ALLOW_RA_UPDATES - inp->mtu = mtu_opt->mtu; -#endif /* LWIP_ND6_ALLOW_RA_UPDATES */ - } - break; - } - case ND6_OPTION_TYPE_PREFIX_INFO: - { - struct prefix_option * prefix_opt; - prefix_opt = (struct prefix_option *)buffer; - - if (prefix_opt->flags & ND6_PREFIX_FLAG_ON_LINK) { - /* Add to on-link prefix list. */ - - /* Get a memory-aligned copy of the prefix. */ - ip6_addr_set(ip6_current_dest_addr(), &(prefix_opt->prefix)); - - /* find cache entry for this prefix. */ - i = nd6_get_onlink_prefix(ip6_current_dest_addr(), inp); - if (i < 0) { - /* Create a new cache entry. */ - i = nd6_new_onlink_prefix(ip6_current_dest_addr(), inp); - } - if (i >= 0) { - prefix_list[i].invalidation_timer = prefix_opt->valid_lifetime; - -#if LWIP_IPV6_AUTOCONFIG - if (prefix_opt->flags & ND6_PREFIX_FLAG_AUTONOMOUS) { - /* Mark prefix as autonomous, so that address autoconfiguration can take place. - * Only OR flag, so that we don't over-write other flags (such as ADDRESS_DUPLICATE)*/ - prefix_list[i].flags |= ND6_PREFIX_AUTOCONFIG_AUTONOMOUS; - } -#endif /* LWIP_IPV6_AUTOCONFIG */ - } - } - - break; - } - case ND6_OPTION_TYPE_ROUTE_INFO: - { - /* TODO implement preferred routes. - struct route_option * route_opt; - route_opt = (struct route_option *)buffer;*/ - - break; - } - default: - /* Unrecognized option, abort. */ - ND6_STATS_INC(nd6.proterr); - break; - } - offset += 8 * ((u16_t)buffer[1]); - } - - break; /* ICMP6_TYPE_RA */ - } - case ICMP6_TYPE_RD: /* Redirect */ - { - struct redirect_header * redir_hdr; - struct lladdr_option * lladdr_opt; - - /* Check that Redir header fits in packet. */ - if (p->len < sizeof(struct redirect_header)) { - /* TODO debug message */ - pbuf_free(p); - ND6_STATS_INC(nd6.lenerr); - ND6_STATS_INC(nd6.drop); - return; - } - - redir_hdr = (struct redirect_header *)p->payload; - - lladdr_opt = NULL; - if (p->len >= (sizeof(struct redirect_header) + sizeof(struct lladdr_option))) { - lladdr_opt = (struct lladdr_option *)((u8_t*)p->payload + sizeof(struct redirect_header)); - } - - /* Copy original destination address to current source address, to have an aligned copy. */ - ip6_addr_set(ip6_current_src_addr(), &(redir_hdr->destination_address)); - - /* Find dest address in cache */ - i = nd6_find_destination_cache_entry(ip6_current_src_addr()); - if (i < 0) { - /* Destination not in cache, drop packet. */ - pbuf_free(p); - return; - } - - /* Set the new target address. */ - ip6_addr_set(&(destination_cache[i].next_hop_addr), &(redir_hdr->target_address)); - - /* If Link-layer address of other router is given, try to add to neighbor cache. */ - if (lladdr_opt != NULL) { - if (lladdr_opt->type == ND6_OPTION_TYPE_TARGET_LLADDR) { - /* Copy target address to current source address, to have an aligned copy. */ - ip6_addr_set(ip6_current_src_addr(), &(redir_hdr->target_address)); - - i = nd6_find_neighbor_cache_entry(ip6_current_src_addr()); - if (i < 0) { - i = nd6_new_neighbor_cache_entry(); - if (i >= 0) { - neighbor_cache[i].netif = inp; - MEMCPY(neighbor_cache[i].lladdr, lladdr_opt->addr, inp->hwaddr_len); - ip6_addr_set(&(neighbor_cache[i].next_hop_address), ip6_current_src_addr()); - - /* Receiving a message does not prove reachability: only in one direction. - * Delay probe in case we get confirmation of reachability from upper layer (TCP). */ - neighbor_cache[i].state = ND6_DELAY; - neighbor_cache[i].counter.delay_time = LWIP_ND6_DELAY_FIRST_PROBE_TIME; - } - } - if (i >= 0) { - if (neighbor_cache[i].state == ND6_INCOMPLETE) { - MEMCPY(neighbor_cache[i].lladdr, lladdr_opt->addr, inp->hwaddr_len); - /* Receiving a message does not prove reachability: only in one direction. - * Delay probe in case we get confirmation of reachability from upper layer (TCP). */ - neighbor_cache[i].state = ND6_DELAY; - neighbor_cache[i].counter.delay_time = LWIP_ND6_DELAY_FIRST_PROBE_TIME; - } - } - } - } - break; /* ICMP6_TYPE_RD */ - } - case ICMP6_TYPE_PTB: /* Packet too big */ - { - struct pp_icmp6_hdr *icmp6hdr; /* Packet too big message */ - struct ip6_hdr * ip6hdr; /* IPv6 header of the packet which caused the error */ - - /* Check that ICMPv6 header + IPv6 header fit in payload */ - if (p->len < (sizeof(struct pp_icmp6_hdr) + IP6_HLEN)) { - /* drop short packets */ - pbuf_free(p); - ND6_STATS_INC(nd6.lenerr); - ND6_STATS_INC(nd6.drop); - return; - } - - icmp6hdr = (struct pp_icmp6_hdr *)p->payload; - ip6hdr = (struct ip6_hdr *)((u8_t*)p->payload + sizeof(struct icmp6_hdr)); - - /* Copy original destination address to current source address, to have an aligned copy. */ - ip6_addr_set(ip6_current_src_addr(), &(ip6hdr->dest)); - - /* Look for entry in destination cache. */ - i = nd6_find_destination_cache_entry(ip6_current_src_addr()); - if (i < 0) { - /* Destination not in cache, drop packet. */ - pbuf_free(p); - return; - } - - /* Change the Path MTU. */ - destination_cache[i].pmtu = icmp6hdr->data; - - break; /* ICMP6_TYPE_PTB */ - } - - default: - ND6_STATS_INC(nd6.proterr); - ND6_STATS_INC(nd6.drop); - break; /* default */ - } - - pbuf_free(p); -} - - -/** - * Periodic timer for Neighbor discovery functions: - * - * - Update neighbor reachability states - * - Update destination cache entries age - * - Update invalidation timers of default routers and on-link prefixes - * - Perform duplicate address detection (DAD) for our addresses - * - Send router solicitations - */ -void -nd6_tmr(void) -{ - s8_t i; -#if LWIP_IPV6_AUTOCONFIG - s8_t j; -#endif - struct netif * netif; - - /* Process neighbor entries. */ - for (i = 0; i < LWIP_ND6_NUM_NEIGHBORS; i++) { - switch (neighbor_cache[i].state) { - case ND6_INCOMPLETE: - if (neighbor_cache[i].counter.probes_sent >= LWIP_ND6_MAX_MULTICAST_SOLICIT) { - /* Retries exceeded. */ - nd6_free_neighbor_cache_entry(i); - } - else { - /* Send a NS for this entry. */ - neighbor_cache[i].counter.probes_sent++; - nd6_send_ns(neighbor_cache[i].netif, &(neighbor_cache[i].next_hop_address), ND6_SEND_FLAG_MULTICAST_DEST); - } - break; - case ND6_REACHABLE: - /* Send queued packets, if any are left. Should have been sent already. */ - if (neighbor_cache[i].q != NULL) { - nd6_send_q(i); - } - if (neighbor_cache[i].counter.reachable_time <= ND6_TMR_INTERVAL) { - /* Change to stale state. */ - neighbor_cache[i].state = ND6_STALE; - neighbor_cache[i].counter.stale_time = 0; - } - else { - neighbor_cache[i].counter.reachable_time -= ND6_TMR_INTERVAL; - } - break; - case ND6_STALE: - neighbor_cache[i].counter.stale_time += ND6_TMR_INTERVAL; - break; - case ND6_DELAY: - if (neighbor_cache[i].counter.delay_time <= ND6_TMR_INTERVAL) { - /* Change to PROBE state. */ - neighbor_cache[i].state = ND6_PROBE; - neighbor_cache[i].counter.probes_sent = 0; - } - else { - neighbor_cache[i].counter.delay_time -= ND6_TMR_INTERVAL; - } - break; - case ND6_PROBE: - if (neighbor_cache[i].counter.probes_sent >= LWIP_ND6_MAX_MULTICAST_SOLICIT) { - /* Retries exceeded. */ - nd6_free_neighbor_cache_entry(i); - } - else { - /* Send a NS for this entry. */ - neighbor_cache[i].counter.probes_sent++; - nd6_send_ns(neighbor_cache[i].netif, &(neighbor_cache[i].next_hop_address), 0); - } - break; - case ND6_NO_ENTRY: - default: - /* Do nothing. */ - break; - } - } - - /* Process destination entries. */ - for (i = 0; i < LWIP_ND6_NUM_DESTINATIONS; i++) { - destination_cache[i].age++; - } - - /* Process router entries. */ - for (i = 0; i < LWIP_ND6_NUM_ROUTERS; i++) { - if (default_router_list[i].neighbor_entry != NULL) { - /* Active entry. */ - if (default_router_list[i].invalidation_timer > 0) { - default_router_list[i].invalidation_timer -= ND6_TMR_INTERVAL / 1000; - } - if (default_router_list[i].invalidation_timer < ND6_TMR_INTERVAL / 1000) { - /* Less than 1 second remainig. Clear this entry. */ - default_router_list[i].neighbor_entry->isrouter = 0; - default_router_list[i].neighbor_entry = NULL; - default_router_list[i].invalidation_timer = 0; - default_router_list[i].flags = 0; - } - } - } - - /* Process prefix entries. */ - for (i = 0; i < LWIP_ND6_NUM_PREFIXES; i++) { - if (prefix_list[i].invalidation_timer < ND6_TMR_INTERVAL / 1000) { - prefix_list[i].invalidation_timer = 0; - } - if ((prefix_list[i].invalidation_timer > 0) && - (prefix_list[i].netif != NULL)) { - prefix_list[i].invalidation_timer -= ND6_TMR_INTERVAL / 1000; - -#if LWIP_IPV6_AUTOCONFIG - /* Initiate address autoconfiguration for this prefix, if conditions are met. */ - if (prefix_list[i].netif->ip6_autoconfig_enabled && - (prefix_list[i].flags & ND6_PREFIX_AUTOCONFIG_AUTONOMOUS) && - !(prefix_list[i].flags & ND6_PREFIX_AUTOCONFIG_ADDRESS_GENERATED)) { - /* Try to get an address on this netif that is invalid. - * Skip 0 index (link-local address) */ - for (j = 1; j < LWIP_IPV6_NUM_ADDRESSES; j++) { - if (netif_ip6_addr_state(prefix_list[i].netif, j) == IP6_ADDRESS_STATE_INVALID) { - /* Generate an address using this prefix and interface ID from link-local address. */ - prefix_list[i].netif->ip6_addr[j].addr[0] = prefix_list[i].prefix.addr[0]; - prefix_list[i].netif->ip6_addr[j].addr[1] = prefix_list[i].prefix.addr[1]; - prefix_list[i].netif->ip6_addr[j].addr[2] = prefix_list[i].netif->ip6_addr[0].addr[2]; - prefix_list[i].netif->ip6_addr[j].addr[3] = prefix_list[i].netif->ip6_addr[0].addr[3]; - - /* Mark it as tentative (DAD will be performed if configured). */ - netif_ip6_addr_set_state(prefix_list[i].netif, j, IP6_ADDR_TENTATIVE); - - /* Mark this prefix with ADDRESS_GENERATED, so that we don't try again. */ - prefix_list[i].flags |= ND6_PREFIX_AUTOCONFIG_ADDRESS_GENERATED; - - /* Exit loop. */ - break; - } - } - } -#endif /* LWIP_IPV6_AUTOCONFIG */ - } - } - - - /* Process our own addresses, if DAD configured. */ - for (netif = netif_list; netif != NULL; netif = netif->next) { - for (i = 0; i < LWIP_IPV6_NUM_ADDRESSES; ++i) { - if (ip6_addr_istentative(netif->ip6_addr_state[i])) { - if ((netif->ip6_addr_state[i] & 0x07) >= LWIP_IPV6_DUP_DETECT_ATTEMPTS) { - /* No NA received in response. Mark address as valid. */ - netif->ip6_addr_state[i] = IP6_ADDR_PREFERRED; - /* TODO implement preferred and valid lifetimes. */ - } - else if (netif->flags & NETIF_FLAG_UP) { -#if LWIP_IPV6_MLD - if ((netif->ip6_addr_state[i] & 0x07) == 0) { - /* Join solicited node multicast group. */ - ip6_addr_set_solicitednode(&multicast_address, netif_ip6_addr(netif, i)->addr[3]); - mld6_joingroup(netif_ip6_addr(netif, i), &multicast_address); - } -#endif /* LWIP_IPV6_MLD */ - /* Send a NS for this address. */ - nd6_send_ns(netif, netif_ip6_addr(netif, i), ND6_SEND_FLAG_MULTICAST_DEST); - (netif->ip6_addr_state[i])++; - /* TODO send max 1 NS per tmr call? enable return*/ - /*return;*/ - } - } - } - } - -#if LWIP_IPV6_SEND_ROUTER_SOLICIT - /* Send router solicitation messages, if necessary. */ - for (netif = netif_list; netif != NULL; netif = netif->next) { - if ((netif->rs_count > 0) && (netif->flags & NETIF_FLAG_UP)) { - nd6_send_rs(netif); - netif->rs_count--; - } - } -#endif /* LWIP_IPV6_SEND_ROUTER_SOLICIT */ - -} - -/** - * Send a neighbor solicitation message - * - * @param netif the netif on which to send the message - * @param target_addr the IPv6 target address for the ND message - * @param flags one of ND6_SEND_FLAG_* - */ -static void -nd6_send_ns(struct netif * netif, ip6_addr_t * target_addr, u8_t flags) -{ - struct ns_header * ns_hdr; - struct lladdr_option * lladdr_opt; - struct pbuf * p; - ip6_addr_t * src_addr; - - if (ip6_addr_isvalid(netif_ip6_addr_state(netif,0))) { - /* Use link-local address as source address. */ - src_addr = netif_ip6_addr(netif, 0); - } else { - src_addr = IP6_ADDR_ANY; - } - - /* Allocate a packet. */ - p = pbuf_alloc(PBUF_IP, sizeof(struct ns_header) + sizeof(struct lladdr_option), PBUF_RAM); - if ((p == NULL) || (p->len < (sizeof(struct ns_header) + sizeof(struct lladdr_option)))) { - /* We couldn't allocate a suitable pbuf for the ns. drop it. */ - if (p != NULL) { - pbuf_free(p); - } - ND6_STATS_INC(nd6.memerr); - return; - } - - /* Set fields. */ - ns_hdr = (struct ns_header *)p->payload; - lladdr_opt = (struct lladdr_option *)((u8_t*)p->payload + sizeof(struct ns_header)); - - ns_hdr->type = ICMP6_TYPE_NS; - ns_hdr->code = 0; - ns_hdr->chksum = 0; - ns_hdr->reserved = 0; - ip6_addr_set(&(ns_hdr->target_address), target_addr); - - lladdr_opt->type = ND6_OPTION_TYPE_SOURCE_LLADDR; - lladdr_opt->length = ((netif->hwaddr_len + 2) >> 3) + (((netif->hwaddr_len + 2) & 0x07) ? 1 : 0); - SMEMCPY(lladdr_opt->addr, netif->hwaddr, netif->hwaddr_len); - - /* Generate the solicited node address for the target address. */ - if (flags & ND6_SEND_FLAG_MULTICAST_DEST) { - ip6_addr_set_solicitednode(&multicast_address, target_addr->addr[3]); - target_addr = &multicast_address; - } - - ns_hdr->chksum = ip6_chksum_pseudo(p, IP6_NEXTH_ICMP6, p->len, src_addr, - target_addr); - - /* Send the packet out. */ - ND6_STATS_INC(nd6.xmit); - ip6_output_if(p, (src_addr == IP6_ADDR_ANY) ? NULL : src_addr, target_addr, - LWIP_ICMP6_HL, 0, IP6_NEXTH_ICMP6, netif); - pbuf_free(p); -} - -/** - * Send a neighbor advertisement message - * - * @param netif the netif on which to send the message - * @param target_addr the IPv6 target address for the ND message - * @param flags one of ND6_SEND_FLAG_* - */ -static void -nd6_send_na(struct netif * netif, ip6_addr_t * target_addr, u8_t flags) -{ - struct na_header * na_hdr; - struct lladdr_option * lladdr_opt; - struct pbuf * p; - ip6_addr_t * src_addr; - ip6_addr_t * dest_addr; - - /* Use link-local address as source address. */ - /* src_addr = &(netif->ip6_addr[0]); */ - /* Use target address as source address. */ - src_addr = target_addr; - - /* Allocate a packet. */ - p = pbuf_alloc(PBUF_IP, sizeof(struct na_header) + sizeof(struct lladdr_option), PBUF_RAM); - if ((p == NULL) || (p->len < (sizeof(struct na_header) + sizeof(struct lladdr_option)))) { - /* We couldn't allocate a suitable pbuf for the ns. drop it. */ - if (p != NULL) { - pbuf_free(p); - } - ND6_STATS_INC(nd6.memerr); - return; - } - - /* Set fields. */ - na_hdr = (struct na_header *)p->payload; - lladdr_opt = (struct lladdr_option *)((u8_t*)p->payload + sizeof(struct na_header)); - - na_hdr->type = ICMP6_TYPE_NA; - na_hdr->code = 0; - na_hdr->chksum = 0; - na_hdr->flags = flags & 0xf0; - na_hdr->reserved[0] = 0; - na_hdr->reserved[1] = 0; - na_hdr->reserved[2] = 0; - ip6_addr_set(&(na_hdr->target_address), target_addr); - - lladdr_opt->type = ND6_OPTION_TYPE_TARGET_LLADDR; - lladdr_opt->length = ((netif->hwaddr_len + 2) >> 3) + (((netif->hwaddr_len + 2) & 0x07) ? 1 : 0); - SMEMCPY(lladdr_opt->addr, netif->hwaddr, netif->hwaddr_len); - - /* Generate the solicited node address for the target address. */ - if (flags & ND6_SEND_FLAG_MULTICAST_DEST) { - ip6_addr_set_solicitednode(&multicast_address, target_addr->addr[3]); - dest_addr = &multicast_address; - } - else if (flags & ND6_SEND_FLAG_ALLNODES_DEST) { - ip6_addr_set_allnodes_linklocal(&multicast_address); - dest_addr = &multicast_address; - } - else { - dest_addr = ip6_current_src_addr(); - } - - na_hdr->chksum = ip6_chksum_pseudo(p, IP6_NEXTH_ICMP6, p->len, src_addr, - dest_addr); - - /* Send the packet out. */ - ND6_STATS_INC(nd6.xmit); - ip6_output_if(p, src_addr, dest_addr, - LWIP_ICMP6_HL, 0, IP6_NEXTH_ICMP6, netif); - pbuf_free(p); -} - -#if LWIP_IPV6_SEND_ROUTER_SOLICIT -/** - * Send a router solicitation message - * - * @param netif the netif on which to send the message - */ -static void -nd6_send_rs(struct netif * netif) -{ - struct rs_header * rs_hdr; - struct lladdr_option * lladdr_opt; - struct pbuf * p; - ip6_addr_t * src_addr; - u16_t packet_len; - - /* Link-local source address, or unspecified address? */ - if (ip6_addr_isvalid(netif_ip6_addr_state(netif, 0))) { - src_addr = netif_ip6_addr(netif, 0); - } - else { - src_addr = IP6_ADDR_ANY; - } - - /* Generate the all routers target address. */ - ip6_addr_set_allrouters_linklocal(&multicast_address); - - /* Allocate a packet. */ - packet_len = sizeof(struct rs_header); - if (src_addr != IP6_ADDR_ANY) { - packet_len += sizeof(struct lladdr_option); - } - p = pbuf_alloc(PBUF_IP, packet_len, PBUF_RAM); - if ((p == NULL) || (p->len < packet_len)) { - /* We couldn't allocate a suitable pbuf for the ns. drop it. */ - if (p != NULL) { - pbuf_free(p); - } - ND6_STATS_INC(nd6.memerr); - return; - } - - /* Set fields. */ - rs_hdr = (struct rs_header *)p->payload; - - rs_hdr->type = ICMP6_TYPE_RS; - rs_hdr->code = 0; - rs_hdr->chksum = 0; - rs_hdr->reserved = 0; - - if (src_addr != IP6_ADDR_ANY) { - /* Include our hw address. */ - lladdr_opt = (struct lladdr_option *)((u8_t*)p->payload + sizeof(struct rs_header)); - lladdr_opt->type = ND6_OPTION_TYPE_SOURCE_LLADDR; - lladdr_opt->length = ((netif->hwaddr_len + 2) >> 3) + (((netif->hwaddr_len + 2) & 0x07) ? 1 : 0); - SMEMCPY(lladdr_opt->addr, netif->hwaddr, netif->hwaddr_len); - } - - rs_hdr->chksum = ip6_chksum_pseudo(p, IP6_NEXTH_ICMP6, p->len, src_addr, - &multicast_address); - - /* Send the packet out. */ - ND6_STATS_INC(nd6.xmit); - ip6_output_if(p, src_addr, &multicast_address, - LWIP_ICMP6_HL, 0, IP6_NEXTH_ICMP6, netif); - pbuf_free(p); -} -#endif /* LWIP_IPV6_SEND_ROUTER_SOLICIT */ - -/** - * Search for a neighbor cache entry - * - * @param ip6addr the IPv6 address of the neighbor - * @return The neighbor cache entry index that matched, -1 if no - * entry is found - */ -static s8_t -nd6_find_neighbor_cache_entry(ip6_addr_t * ip6addr) -{ - s8_t i; - for (i = 0; i < LWIP_ND6_NUM_NEIGHBORS; i++) { - if (ip6_addr_cmp(ip6addr, &(neighbor_cache[i].next_hop_address))) { - return i; - } - } - return -1; -} - -/** - * Create a new neighbor cache entry. - * - * If no unused entry is found, will try to recycle an old entry - * according to ad-hoc "age" heuristic. - * - * @return The neighbor cache entry index that was created, -1 if no - * entry could be created - */ -static s8_t -nd6_new_neighbor_cache_entry(void) -{ - s8_t i; - s8_t j; - u32_t time; - - - /* First, try to find an empty entry. */ - for (i = 0; i < LWIP_ND6_NUM_NEIGHBORS; i++) { - if (neighbor_cache[i].state == ND6_NO_ENTRY) { - return i; - } - } - - /* We need to recycle an entry. in general, do not recycle if it is a router. */ - - /* Next, try to find a Stale entry. */ - for (i = 0; i < LWIP_ND6_NUM_NEIGHBORS; i++) { - if ((neighbor_cache[i].state == ND6_STALE) && - (!neighbor_cache[i].isrouter)) { - nd6_free_neighbor_cache_entry(i); - return i; - } - } - - /* Next, try to find a Probe entry. */ - for (i = 0; i < LWIP_ND6_NUM_NEIGHBORS; i++) { - if ((neighbor_cache[i].state == ND6_PROBE) && - (!neighbor_cache[i].isrouter)) { - nd6_free_neighbor_cache_entry(i); - return i; - } - } - - /* Next, try to find a Delayed entry. */ - for (i = 0; i < LWIP_ND6_NUM_NEIGHBORS; i++) { - if ((neighbor_cache[i].state == ND6_DELAY) && - (!neighbor_cache[i].isrouter)) { - nd6_free_neighbor_cache_entry(i); - return i; - } - } - - /* Next, try to find the oldest reachable entry. */ - time = 0xfffffffful; - j = -1; - for (i = 0; i < LWIP_ND6_NUM_NEIGHBORS; i++) { - if ((neighbor_cache[i].state == ND6_REACHABLE) && - (!neighbor_cache[i].isrouter)) { - if (neighbor_cache[i].counter.reachable_time < time) { - j = i; - time = neighbor_cache[i].counter.reachable_time; - } - } - } - if (j >= 0) { - nd6_free_neighbor_cache_entry(j); - return j; - } - - /* Next, find oldest incomplete entry without queued packets. */ - time = 0; - j = -1; - for (i = 0; i < LWIP_ND6_NUM_NEIGHBORS; i++) { - if ( - (neighbor_cache[i].q == NULL) && - (neighbor_cache[i].state == ND6_INCOMPLETE) && - (!neighbor_cache[i].isrouter)) { - if (neighbor_cache[i].counter.probes_sent >= time) { - j = i; - time = neighbor_cache[i].counter.probes_sent; - } - } - } - if (j >= 0) { - nd6_free_neighbor_cache_entry(j); - return j; - } - - /* Next, find oldest incomplete entry with queued packets. */ - time = 0; - j = -1; - for (i = 0; i < LWIP_ND6_NUM_NEIGHBORS; i++) { - if ((neighbor_cache[i].state == ND6_INCOMPLETE) && - (!neighbor_cache[i].isrouter)) { - if (neighbor_cache[i].counter.probes_sent >= time) { - j = i; - time = neighbor_cache[i].counter.probes_sent; - } - } - } - if (j >= 0) { - nd6_free_neighbor_cache_entry(j); - return j; - } - - /* No more entries to try. */ - return -1; -} - -/** - * Will free any resources associated with a neighbor cache - * entry, and will mark it as unused. - * - * @param i the neighbor cache entry index to free - */ -static void -nd6_free_neighbor_cache_entry(s8_t i) -{ - if ((i < 0) || (i >= LWIP_ND6_NUM_NEIGHBORS)) { - return; - } - - /* Free any queued packets. */ - if (neighbor_cache[i].q != NULL) { - nd6_free_q(neighbor_cache[i].q); - neighbor_cache[i].q = NULL; - } - - neighbor_cache[i].state = ND6_NO_ENTRY; - neighbor_cache[i].isrouter = 0; - neighbor_cache[i].netif = NULL; - neighbor_cache[i].counter.reachable_time = 0; - ip6_addr_set_zero(&(neighbor_cache[i].next_hop_address)); -} - -/** - * Search for a destination cache entry - * - * @param ip6addr the IPv6 address of the destination - * @return The destination cache entry index that matched, -1 if no - * entry is found - */ -static s8_t -nd6_find_destination_cache_entry(ip6_addr_t * ip6addr) -{ - s8_t i; - for (i = 0; i < LWIP_ND6_NUM_DESTINATIONS; i++) { - if (ip6_addr_cmp(ip6addr, &(destination_cache[i].destination_addr))) { - return i; - } - } - return -1; -} - -/** - * Create a new destination cache entry. If no unused entry is found, - * will recycle oldest entry. - * - * @return The destination cache entry index that was created, -1 if no - * entry was created - */ -static s8_t -nd6_new_destination_cache_entry(void) -{ - s8_t i, j; - u32_t age; - - /* Find an empty entry. */ - for (i = 0; i < LWIP_ND6_NUM_DESTINATIONS; i++) { - if (ip6_addr_isany(&(destination_cache[i].destination_addr))) { - return i; - } - } - - /* Find oldest entry. */ - age = 0; - j = LWIP_ND6_NUM_DESTINATIONS - 1; - for (i = 0; i < LWIP_ND6_NUM_DESTINATIONS; i++) { - if (destination_cache[i].age > age) { - j = i; - } - } - - return j; -} - -/** - * Determine whether an address matches an on-link prefix. - * - * @param ip6addr the IPv6 address to match - * @return 1 if the address is on-link, 0 otherwise - */ -static s8_t -nd6_is_prefix_in_netif(ip6_addr_t * ip6addr, struct netif * netif) -{ - s8_t i; - for (i = 0; i < LWIP_ND6_NUM_PREFIXES; i++) { - if ((prefix_list[i].netif == netif) && - (prefix_list[i].invalidation_timer > 0) && - ip6_addr_netcmp(ip6addr, &(prefix_list[i].prefix))) { - return 1; - } - } - /* Check to see if address prefix matches a (manually?) configured address. */ - for (i = 0; i < LWIP_IPV6_NUM_ADDRESSES; i++) { - if (ip6_addr_isvalid(netif_ip6_addr_state(netif, i)) && - ip6_addr_netcmp(ip6addr, netif_ip6_addr(netif, i))) { - return 1; - } - } - return 0; -} - -/** - * Select a default router for a destination. - * - * @param ip6addr the destination address - * @param netif the netif for the outgoing packet, if known - * @return the default router entry index, or -1 if no suitable - * router is found - */ -s8_t -nd6_select_router(ip6_addr_t * ip6addr, struct netif * netif) -{ - s8_t i; - /* last_router is used for round-robin router selection (as recommended - * in RFC). This is more robust in case one router is not reachable, - * we are not stuck trying to resolve it. */ - static s8_t last_router; - (void)ip6addr; /* TODO match preferred routes!! (must implement ND6_OPTION_TYPE_ROUTE_INFO) */ - - /* TODO: implement default router preference */ - - /* Look for reachable routers. */ - for (i = 0; i < LWIP_ND6_NUM_ROUTERS; i++) { - if (++last_router >= LWIP_ND6_NUM_ROUTERS) { - last_router = 0; - } - if ((default_router_list[i].neighbor_entry != NULL) && - (netif != NULL ? netif == default_router_list[i].neighbor_entry->netif : 1) && - (default_router_list[i].invalidation_timer > 0) && - (default_router_list[i].neighbor_entry->state == ND6_REACHABLE)) { - return i; - } - } - - /* Look for router in other reachability states, but still valid according to timer. */ - for (i = 0; i < LWIP_ND6_NUM_ROUTERS; i++) { - if (++last_router >= LWIP_ND6_NUM_ROUTERS) { - last_router = 0; - } - if ((default_router_list[i].neighbor_entry != NULL) && - (netif != NULL ? netif == default_router_list[i].neighbor_entry->netif : 1) && - (default_router_list[i].invalidation_timer > 0)) { - return i; - } - } - - /* Look for any router for which we have any information at all. */ - for (i = 0; i < LWIP_ND6_NUM_ROUTERS; i++) { - if (++last_router >= LWIP_ND6_NUM_ROUTERS) { - last_router = 0; - } - if (default_router_list[i].neighbor_entry != NULL && - (netif != NULL ? netif == default_router_list[i].neighbor_entry->netif : 1)) { - return i; - } - } - - /* no suitable router found. */ - return -1; -} - -/** - * Find an entry for a default router. - * - * @param router_addr the IPv6 address of the router - * @param netif the netif on which the router is found, if known - * @return the index of the router entry, or -1 if not found - */ -static s8_t -nd6_get_router(ip6_addr_t * router_addr, struct netif * netif) -{ - s8_t i; - - /* Look for router. */ - for (i = 0; i < LWIP_ND6_NUM_ROUTERS; i++) { - if ((default_router_list[i].neighbor_entry != NULL) && - ((netif != NULL) ? netif == default_router_list[i].neighbor_entry->netif : 1) && - ip6_addr_cmp(router_addr, &(default_router_list[i].neighbor_entry->next_hop_address))) { - return i; - } - } - - /* router not found. */ - return -1; -} - -/** - * Create a new entry for a default router. - * - * @param router_addr the IPv6 address of the router - * @param netif the netif on which the router is connected, if known - * @return the index on the router table, or -1 if could not be created - */ -static s8_t -nd6_new_router(ip6_addr_t * router_addr, struct netif * netif) -{ - s8_t router_index; - s8_t neighbor_index; - - /* Do we have a neighbor entry for this router? */ - neighbor_index = nd6_find_neighbor_cache_entry(router_addr); - if (neighbor_index < 0) { - /* Create a neighbor entry for this router. */ - neighbor_index = nd6_new_neighbor_cache_entry(); - if (neighbor_index < 0) { - /* Could not create neighbor entry for this router. */ - return -1; - } - ip6_addr_set(&(neighbor_cache[neighbor_index].next_hop_address), router_addr); - neighbor_cache[neighbor_index].netif = netif; - neighbor_cache[neighbor_index].q = NULL; - neighbor_cache[neighbor_index].state = ND6_INCOMPLETE; - neighbor_cache[neighbor_index].counter.probes_sent = 0; - } - - /* Mark neighbor as router. */ - neighbor_cache[neighbor_index].isrouter = 1; - - /* Look for empty entry. */ - for (router_index = 0; router_index < LWIP_ND6_NUM_ROUTERS; router_index++) { - if (default_router_list[router_index].neighbor_entry == NULL) { - default_router_list[router_index].neighbor_entry = &(neighbor_cache[neighbor_index]); - return router_index; - } - } - - /* Could not create a router entry. */ - - /* Mark neighbor entry as not-router. Entry might be useful as neighbor still. */ - neighbor_cache[neighbor_index].isrouter = 0; - - /* router not found. */ - return -1; -} - -/** - * Find the cached entry for an on-link prefix. - * - * @param prefix the IPv6 prefix that is on-link - * @param netif the netif on which the prefix is on-link - * @return the index on the prefix table, or -1 if not found - */ -static s8_t -nd6_get_onlink_prefix(ip6_addr_t * prefix, struct netif * netif) -{ - s8_t i; - - /* Look for prefix in list. */ - for (i = 0; i < LWIP_ND6_NUM_PREFIXES; ++i) { - if ((ip6_addr_netcmp(&(prefix_list[i].prefix), prefix)) && - (prefix_list[i].netif == netif)) { - return i; - } - } - - /* Entry not available. */ - return -1; -} - -/** - * Creates a new entry for an on-link prefix. - * - * @param prefix the IPv6 prefix that is on-link - * @param netif the netif on which the prefix is on-link - * @return the index on the prefix table, or -1 if not created - */ -static s8_t -nd6_new_onlink_prefix(ip6_addr_t * prefix, struct netif * netif) -{ - s8_t i; - - /* Create new entry. */ - for (i = 0; i < LWIP_ND6_NUM_PREFIXES; ++i) { - if ((prefix_list[i].netif == NULL) || - (prefix_list[i].invalidation_timer == 0)) { - /* Found empty prefix entry. */ - prefix_list[i].netif = netif; - ip6_addr_set(&(prefix_list[i].prefix), prefix); -#if LWIP_IPV6_AUTOCONFIG - prefix_list[i].flags = 0; -#endif - return i; - } - } - - /* Entry not available. */ - return -1; -} - -/** - * Determine the next hop for a destination. Will determine if the - * destination is on-link, else a suitable on-link router is selected. - * - * The last entry index is cached for fast entry search. - * - * @param ip6addr the destination address - * @param netif the netif on which the packet will be sent - * @return the neighbor cache entry for the next hop, ERR_RTE if no - * suitable next hop was found, ERR_MEM if no cache entry - * could be created - */ -s8_t -nd6_get_next_hop_entry(ip6_addr_t * ip6addr, struct netif * netif) -{ - s8_t i; - -#if LWIP_NETIF_HWADDRHINT - if (netif->addr_hint != NULL) { - /* per-pcb cached entry was given */ - u8_t addr_hint = *(netif->addr_hint); - if (addr_hint < LWIP_ND6_NUM_DESTINATIONS) { - nd6_cached_destination_index = addr_hint; - } - } -#endif /* LWIP_NETIF_HWADDRHINT */ - - /* Look for ip6addr in destination cache. */ - if (ip6_addr_cmp(ip6addr, &(destination_cache[nd6_cached_destination_index].destination_addr))) { - /* the cached entry index is the right one! */ - /* do nothing. */ - ND6_STATS_INC(nd6.cachehit); - } else { - /* Search destination cache. */ - i = nd6_find_destination_cache_entry(ip6addr); - if (i >= 0) { - /* found destination entry. make it our new cached index. */ - nd6_cached_destination_index = i; - } - else { - /* Not found. Create a new destination entry. */ - i = nd6_new_destination_cache_entry(); - if (i >= 0) { - /* got new destination entry. make it our new cached index. */ - nd6_cached_destination_index = i; - } else { - /* Could not create a destination cache entry. */ - return ERR_MEM; - } - - /* Copy dest address to destination cache. */ - ip6_addr_set(&(destination_cache[nd6_cached_destination_index].destination_addr), ip6addr); - - /* Now find the next hop. is it a neighbor? */ - if (ip6_addr_islinklocal(ip6addr) || - nd6_is_prefix_in_netif(ip6addr, netif)) { - /* Destination in local link. */ - destination_cache[nd6_cached_destination_index].pmtu = netif->mtu; - ip6_addr_copy(destination_cache[nd6_cached_destination_index].next_hop_addr, destination_cache[nd6_cached_destination_index].destination_addr); - } - else { - /* We need to select a router. */ - i = nd6_select_router(ip6addr, netif); - if (i < 0) { - /* No router found. */ - ip6_addr_set_any(&(destination_cache[nd6_cached_destination_index].destination_addr)); - return ERR_RTE; - } - destination_cache[nd6_cached_destination_index].pmtu = netif->mtu; /* Start with netif mtu, correct through ICMPv6 if necessary */ - ip6_addr_copy(destination_cache[nd6_cached_destination_index].next_hop_addr, default_router_list[i].neighbor_entry->next_hop_address); - } - } - } - -#if LWIP_NETIF_HWADDRHINT - if (netif->addr_hint != NULL) { - /* per-pcb cached entry was given */ - *(netif->addr_hint) = nd6_cached_destination_index; - } -#endif /* LWIP_NETIF_HWADDRHINT */ - - /* Look in neighbor cache for the next-hop address. */ - if (ip6_addr_cmp(&(destination_cache[nd6_cached_destination_index].next_hop_addr), - &(neighbor_cache[nd6_cached_neighbor_index].next_hop_address))) { - /* Cache hit. */ - /* Do nothing. */ - ND6_STATS_INC(nd6.cachehit); - } else { - i = nd6_find_neighbor_cache_entry(&(destination_cache[nd6_cached_destination_index].next_hop_addr)); - if (i >= 0) { - /* Found a matching record, make it new cached entry. */ - nd6_cached_neighbor_index = i; - } - else { - /* Neighbor not in cache. Make a new entry. */ - i = nd6_new_neighbor_cache_entry(); - if (i >= 0) { - /* got new neighbor entry. make it our new cached index. */ - nd6_cached_neighbor_index = i; - } else { - /* Could not create a neighbor cache entry. */ - return ERR_MEM; - } - - /* Initialize fields. */ - ip6_addr_copy(neighbor_cache[i].next_hop_address, - destination_cache[nd6_cached_destination_index].next_hop_addr); - neighbor_cache[i].isrouter = 0; - neighbor_cache[i].netif = netif; - neighbor_cache[i].state = ND6_INCOMPLETE; - neighbor_cache[i].counter.probes_sent = 0; - } - } - - /* Reset this destination's age. */ - destination_cache[nd6_cached_destination_index].age = 0; - - return nd6_cached_neighbor_index; -} - -/** - * Queue a packet for a neighbor. - * - * @param neighbor_index the index in the neighbor cache table - * @param q packet to be queued - * @return ERR_OK if succeeded, ERR_MEM if out of memory - */ -err_t -nd6_queue_packet(s8_t neighbor_index, struct pbuf * q) -{ - err_t result = ERR_MEM; - struct pbuf *p; - int copy_needed = 0; -#if LWIP_ND6_QUEUEING - struct nd6_q_entry *new_entry, *r; -#endif /* LWIP_ND6_QUEUEING */ - - if ((neighbor_index < 0) || (neighbor_index >= LWIP_ND6_NUM_NEIGHBORS)) { - return ERR_ARG; - } - - /* IF q includes a PBUF_REF, PBUF_POOL or PBUF_RAM, we have no choice but - * to copy the whole queue into a new PBUF_RAM (see bug #11400) - * PBUF_ROMs can be left as they are, since ROM must not get changed. */ - p = q; - while (p) { - if(p->type != PBUF_ROM) { - copy_needed = 1; - break; - } - p = p->next; - } - if(copy_needed) { - /* copy the whole packet into new pbufs */ - p = pbuf_alloc(PBUF_LINK, q->tot_len, PBUF_RAM); - while ((p == NULL) && (neighbor_cache[neighbor_index].q != NULL)) { - /* Free oldest packet (as per RFC recommendation) */ -#if LWIP_ND6_QUEUEING - r = neighbor_cache[neighbor_index].q; - neighbor_cache[neighbor_index].q = r->next; - r->next = NULL; - nd6_free_q(r); -#else /* LWIP_ND6_QUEUEING */ - pbuf_free(neighbor_cache[neighbor_index].q); - neighbor_cache[neighbor_index].q = NULL; -#endif /* LWIP_ND6_QUEUEING */ - p = pbuf_alloc(PBUF_LINK, q->tot_len, PBUF_RAM); - } - if(p != NULL) { - if (pbuf_copy(p, q) != ERR_OK) { - pbuf_free(p); - p = NULL; - } - } - } else { - /* referencing the old pbuf is enough */ - p = q; - pbuf_ref(p); - } - /* packet was copied/ref'd? */ - if (p != NULL) { - /* queue packet ... */ -#if LWIP_ND6_QUEUEING - /* allocate a new nd6 queue entry */ - new_entry = (struct nd6_q_entry *)memp_malloc(MEMP_ND6_QUEUE); - if ((new_entry == NULL) && (neighbor_cache[neighbor_index].q != NULL)) { - /* Free oldest packet (as per RFC recommendation) */ - r = neighbor_cache[neighbor_index].q; - neighbor_cache[neighbor_index].q = r->next; - r->next = NULL; - nd6_free_q(r); - new_entry = (struct nd6_q_entry *)memp_malloc(MEMP_ND6_QUEUE); - } - if (new_entry != NULL) { - new_entry->next = NULL; - new_entry->p = p; - if(neighbor_cache[neighbor_index].q != NULL) { - /* queue was already existent, append the new entry to the end */ - r = neighbor_cache[neighbor_index].q; - while (r->next != NULL) { - r = r->next; - } - r->next = new_entry; - } else { - /* queue did not exist, first item in queue */ - neighbor_cache[neighbor_index].q = new_entry; - } - LWIP_DEBUGF(LWIP_DBG_TRACE, ("ipv6: queued packet %p on neighbor entry %"S16_F"\n", (void *)p, (s16_t)neighbor_index)); - result = ERR_OK; - } else { - /* the pool MEMP_ND6_QUEUE is empty */ - pbuf_free(p); - LWIP_DEBUGF(LWIP_DBG_TRACE, ("ipv6: could not queue a copy of packet %p (out of memory)\n", (void *)p)); - /* { result == ERR_MEM } through initialization */ - } -#else /* LWIP_ND6_QUEUEING */ - /* Queue a single packet. If an older packet is already queued, free it as per RFC. */ - if (neighbor_cache[neighbor_index].q != NULL) { - pbuf_free(neighbor_cache[neighbor_index].q); - } - neighbor_cache[neighbor_index].q = p; - LWIP_DEBUGF(LWIP_DBG_TRACE, ("ipv6: queued packet %p on neighbor entry %"S16_F"\n", (void *)p, (s16_t)neighbor_index)); - result = ERR_OK; -#endif /* LWIP_ND6_QUEUEING */ - } else { - LWIP_DEBUGF(LWIP_DBG_TRACE, ("ipv6: could not queue a copy of packet %p (out of memory)\n", (void *)q)); - /* { result == ERR_MEM } through initialization */ - } - - return result; -} - -#if LWIP_ND6_QUEUEING -/** - * Free a complete queue of nd6 q entries - * - * @param q a queue of nd6_q_entry to free - */ -static void -nd6_free_q(struct nd6_q_entry *q) -{ - struct nd6_q_entry *r; - LWIP_ASSERT("q != NULL", q != NULL); - LWIP_ASSERT("q->p != NULL", q->p != NULL); - while (q) { - r = q; - q = q->next; - LWIP_ASSERT("r->p != NULL", (r->p != NULL)); - pbuf_free(r->p); - memp_free(MEMP_ND6_QUEUE, r); - } -} -#endif /* LWIP_ND6_QUEUEING */ - -/** - * Send queued packets for a neighbor - * - * @param i the neighbor to send packets to - */ -static void -nd6_send_q(s8_t i) -{ - struct ip6_hdr *ip6hdr; -#if LWIP_ND6_QUEUEING - struct nd6_q_entry *q; -#endif /* LWIP_ND6_QUEUEING */ - - if ((i < 0) || (i >= LWIP_ND6_NUM_NEIGHBORS)) { - return; - } - -#if LWIP_ND6_QUEUEING - while (neighbor_cache[i].q != NULL) { - /* remember first in queue */ - q = neighbor_cache[i].q; - /* pop first item off the queue */ - neighbor_cache[i].q = q->next; - /* Get ipv6 header. */ - ip6hdr = (struct ip6_hdr *)(q->p->payload); - /* Override ip6_current_dest_addr() so that we have an aligned copy. */ - ip6_addr_set(ip6_current_dest_addr(), &(ip6hdr->dest)); - /* send the queued IPv6 packet */ - (neighbor_cache[i].netif)->output_ip6(neighbor_cache[i].netif, q->p, ip6_current_dest_addr()); - /* free the queued IP packet */ - pbuf_free(q->p); - /* now queue entry can be freed */ - memp_free(MEMP_ND6_QUEUE, q); - } -#else /* LWIP_ND6_QUEUEING */ - if (neighbor_cache[i].q != NULL) { - /* Get ipv6 header. */ - ip6hdr = (struct ip6_hdr *)(neighbor_cache[i].q->payload); - /* Override ip6_current_dest_addr() so that we have an aligned copy. */ - ip6_addr_set(ip6_current_dest_addr(), &(ip6hdr->dest)); - /* send the queued IPv6 packet */ - (neighbor_cache[i].netif)->output_ip6(neighbor_cache[i].netif, neighbor_cache[i].q, ip6_current_dest_addr()); - /* free the queued IP packet */ - pbuf_free(neighbor_cache[i].q); - neighbor_cache[i].q = NULL; - } -#endif /* LWIP_ND6_QUEUEING */ -} - - -/** - * Get the Path MTU for a destination. - * - * @param ip6addr the destination address - * @param netif the netif on which the packet will be sent - * @return the Path MTU, if known, or the netif default MTU - */ -u16_t -nd6_get_destination_mtu(ip6_addr_t * ip6addr, struct netif * netif) -{ - s8_t i; - - i = nd6_find_destination_cache_entry(ip6addr); - if (i >= 0) { - if (destination_cache[i].pmtu > 0) { - return destination_cache[i].pmtu; - } - } - - if (netif != NULL) { - return netif->mtu; - } - - return 1280; /* Minimum MTU */ -} - - -#if LWIP_ND6_TCP_REACHABILITY_HINTS -/** - * Provide the Neighbor discovery process with a hint that a - * destination is reachable. Called by tcp_receive when ACKs are - * received or sent (as per RFC). This is useful to avoid sending - * NS messages every 30 seconds. - * - * @param ip6addr the destination address which is know to be reachable - * by an upper layer protocol (TCP) - */ -void -nd6_reachability_hint(ip6_addr_t * ip6addr) -{ - s8_t i; - - /* Find destination in cache. */ - if (ip6_addr_cmp(ip6addr, &(destination_cache[nd6_cached_destination_index].destination_addr))) { - i = nd6_cached_destination_index; - ND6_STATS_INC(nd6.cachehit); - } - else { - i = nd6_find_destination_cache_entry(ip6addr); - } - if (i < 0) { - return; - } - - /* Find next hop neighbor in cache. */ - if (ip6_addr_cmp(&(destination_cache[i].next_hop_addr), &(neighbor_cache[nd6_cached_neighbor_index].next_hop_address))) { - i = nd6_cached_neighbor_index; - ND6_STATS_INC(nd6.cachehit); - } - else { - i = nd6_find_neighbor_cache_entry(&(destination_cache[i].next_hop_addr)); - } - if (i < 0) { - return; - } - - /* Set reachability state. */ - neighbor_cache[i].state = ND6_REACHABLE; - neighbor_cache[i].counter.reachable_time = reachable_time; -} -#endif /* LWIP_ND6_TCP_REACHABILITY_HINTS */ - -#endif /* LWIP_IPV6 */ diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/core/mem.c b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/core/mem.c deleted file mode 100644 index 1659a2c7..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/core/mem.c +++ /dev/null @@ -1,659 +0,0 @@ -/** - * @file - * Dynamic memory manager - * - * This is a lightweight replacement for the standard C library malloc(). - * - * If you want to use the standard C library malloc() instead, define - * MEM_LIBC_MALLOC to 1 in your lwipopts.h - * - * To let mem_malloc() use pools (prevents fragmentation and is much faster than - * a heap but might waste some memory), define MEM_USE_POOLS to 1, define - * MEM_USE_CUSTOM_POOLS to 1 and create a file "lwippools.h" that includes a list - * of pools like this (more pools can be added between _START and _END): - * - * Define three pools with sizes 256, 512, and 1512 bytes - * LWIP_MALLOC_MEMPOOL_START - * LWIP_MALLOC_MEMPOOL(20, 256) - * LWIP_MALLOC_MEMPOOL(10, 512) - * LWIP_MALLOC_MEMPOOL(5, 1512) - * LWIP_MALLOC_MEMPOOL_END - */ - -/* - * Copyright (c) 2001-2004 Swedish Institute of Computer Science. - * 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. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT - * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING - * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY - * OF SUCH DAMAGE. - * - * This file is part of the lwIP TCP/IP stack. - * - * Author: Adam Dunkels - * Simon Goldschmidt - * - */ - -#include "lwip/opt.h" - -#if !MEM_LIBC_MALLOC /* don't build if not configured for use in lwipopts.h */ - -#include "lwip/def.h" -#include "lwip/mem.h" -#include "lwip/sys.h" -#include "lwip/stats.h" -#include "lwip/err.h" - -#include - -#if MEM_USE_POOLS -/* lwIP head implemented with different sized pools */ - -/** - * Allocate memory: determine the smallest pool that is big enough - * to contain an element of 'size' and get an element from that pool. - * - * @param size the size in bytes of the memory needed - * @return a pointer to the allocated memory or NULL if the pool is empty - */ -void * -mem_malloc(mem_size_t size) -{ - void *ret; - struct memp_malloc_helper *element; - memp_t poolnr; - mem_size_t required_size = size + LWIP_MEM_ALIGN_SIZE(sizeof(struct memp_malloc_helper)); - - for (poolnr = MEMP_POOL_FIRST; poolnr <= MEMP_POOL_LAST; poolnr = (memp_t)(poolnr + 1)) { -#if MEM_USE_POOLS_TRY_BIGGER_POOL -again: -#endif /* MEM_USE_POOLS_TRY_BIGGER_POOL */ - /* is this pool big enough to hold an element of the required size - plus a struct memp_malloc_helper that saves the pool this element came from? */ - if (required_size <= memp_sizes[poolnr]) { - break; - } - } - if (poolnr > MEMP_POOL_LAST) { - LWIP_ASSERT("mem_malloc(): no pool is that big!", 0); - return NULL; - } - element = (struct memp_malloc_helper*)memp_malloc(poolnr); - if (element == NULL) { - /* No need to DEBUGF or ASSERT: This error is already - taken care of in memp.c */ -#if MEM_USE_POOLS_TRY_BIGGER_POOL - /** Try a bigger pool if this one is empty! */ - if (poolnr < MEMP_POOL_LAST) { - poolnr++; - goto again; - } -#endif /* MEM_USE_POOLS_TRY_BIGGER_POOL */ - return NULL; - } - - /* save the pool number this element came from */ - element->poolnr = poolnr; - /* and return a pointer to the memory directly after the struct memp_malloc_helper */ - ret = (u8_t*)element + LWIP_MEM_ALIGN_SIZE(sizeof(struct memp_malloc_helper)); - - return ret; -} - -/** - * Free memory previously allocated by mem_malloc. Loads the pool number - * and calls memp_free with that pool number to put the element back into - * its pool - * - * @param rmem the memory element to free - */ -void -mem_free(void *rmem) -{ - struct memp_malloc_helper *hmem; - - LWIP_ASSERT("rmem != NULL", (rmem != NULL)); - LWIP_ASSERT("rmem == MEM_ALIGN(rmem)", (rmem == LWIP_MEM_ALIGN(rmem))); - - /* get the original struct memp_malloc_helper */ - hmem = (struct memp_malloc_helper*)(void*)((u8_t*)rmem - LWIP_MEM_ALIGN_SIZE(sizeof(struct memp_malloc_helper))); - - LWIP_ASSERT("hmem != NULL", (hmem != NULL)); - LWIP_ASSERT("hmem == MEM_ALIGN(hmem)", (hmem == LWIP_MEM_ALIGN(hmem))); - LWIP_ASSERT("hmem->poolnr < MEMP_MAX", (hmem->poolnr < MEMP_MAX)); - - /* and put it in the pool we saved earlier */ - memp_free(hmem->poolnr, hmem); -} - -#else /* MEM_USE_POOLS */ -/* lwIP replacement for your libc malloc() */ - -/** - * The heap is made up as a list of structs of this type. - * This does not have to be aligned since for getting its size, - * we only use the macro SIZEOF_STRUCT_MEM, which automatically alignes. - */ -struct mem { - /** index (-> ram[next]) of the next struct */ - mem_size_t next; - /** index (-> ram[prev]) of the previous struct */ - mem_size_t prev; - /** 1: this area is used; 0: this area is unused */ - u8_t used; -}; - -/** All allocated blocks will be MIN_SIZE bytes big, at least! - * MIN_SIZE can be overridden to suit your needs. Smaller values save space, - * larger values could prevent too small blocks to fragment the RAM too much. */ -#ifndef MIN_SIZE -#define MIN_SIZE 12 -#endif /* MIN_SIZE */ -/* some alignment macros: we define them here for better source code layout */ -#define MIN_SIZE_ALIGNED LWIP_MEM_ALIGN_SIZE(MIN_SIZE) -#define SIZEOF_STRUCT_MEM LWIP_MEM_ALIGN_SIZE(sizeof(struct mem)) -#define MEM_SIZE_ALIGNED LWIP_MEM_ALIGN_SIZE(MEM_SIZE) - -/** If you want to relocate the heap to external memory, simply define - * LWIP_RAM_HEAP_POINTER as a void-pointer to that location. - * If so, make sure the memory at that location is big enough (see below on - * how that space is calculated). */ -#ifndef LWIP_RAM_HEAP_POINTER -/** the heap. we need one struct mem at the end and some room for alignment */ -u8_t ram_heap[MEM_SIZE_ALIGNED + (2*SIZEOF_STRUCT_MEM) + MEM_ALIGNMENT]; -#define LWIP_RAM_HEAP_POINTER ram_heap -#endif /* LWIP_RAM_HEAP_POINTER */ - -/** pointer to the heap (ram_heap): for alignment, ram is now a pointer instead of an array */ -static u8_t *ram; -/** the last entry, always unused! */ -static struct mem *ram_end; -/** pointer to the lowest free block, this is used for faster search */ -static struct mem *lfree; - -/** concurrent access protection */ -#if !NO_SYS -static sys_mutex_t mem_mutex; -#endif - -#if LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT - -static volatile u8_t mem_free_count; - -/* Allow mem_free from other (e.g. interrupt) context */ -#define LWIP_MEM_FREE_DECL_PROTECT() SYS_ARCH_DECL_PROTECT(lev_free) -#define LWIP_MEM_FREE_PROTECT() SYS_ARCH_PROTECT(lev_free) -#define LWIP_MEM_FREE_UNPROTECT() SYS_ARCH_UNPROTECT(lev_free) -#define LWIP_MEM_ALLOC_DECL_PROTECT() SYS_ARCH_DECL_PROTECT(lev_alloc) -#define LWIP_MEM_ALLOC_PROTECT() SYS_ARCH_PROTECT(lev_alloc) -#define LWIP_MEM_ALLOC_UNPROTECT() SYS_ARCH_UNPROTECT(lev_alloc) - -#else /* LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT */ - -/* Protect the heap only by using a semaphore */ -#define LWIP_MEM_FREE_DECL_PROTECT() -#define LWIP_MEM_FREE_PROTECT() sys_mutex_lock(&mem_mutex) -#define LWIP_MEM_FREE_UNPROTECT() sys_mutex_unlock(&mem_mutex) -/* mem_malloc is protected using semaphore AND LWIP_MEM_ALLOC_PROTECT */ -#define LWIP_MEM_ALLOC_DECL_PROTECT() -#define LWIP_MEM_ALLOC_PROTECT() -#define LWIP_MEM_ALLOC_UNPROTECT() - -#endif /* LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT */ - - -/** - * "Plug holes" by combining adjacent empty struct mems. - * After this function is through, there should not exist - * one empty struct mem pointing to another empty struct mem. - * - * @param mem this points to a struct mem which just has been freed - * @internal this function is only called by mem_free() and mem_trim() - * - * This assumes access to the heap is protected by the calling function - * already. - */ -static void -plug_holes(struct mem *mem) -{ - struct mem *nmem; - struct mem *pmem; - - LWIP_ASSERT("plug_holes: mem >= ram", (u8_t *)mem >= ram); - LWIP_ASSERT("plug_holes: mem < ram_end", (u8_t *)mem < (u8_t *)ram_end); - LWIP_ASSERT("plug_holes: mem->used == 0", mem->used == 0); - - /* plug hole forward */ - LWIP_ASSERT("plug_holes: mem->next <= MEM_SIZE_ALIGNED", mem->next <= MEM_SIZE_ALIGNED); - - nmem = (struct mem *)(void *)&ram[mem->next]; - if (mem != nmem && nmem->used == 0 && (u8_t *)nmem != (u8_t *)ram_end) { - /* if mem->next is unused and not end of ram, combine mem and mem->next */ - if (lfree == nmem) { - lfree = mem; - } - mem->next = nmem->next; - ((struct mem *)(void *)&ram[nmem->next])->prev = (mem_size_t)((u8_t *)mem - ram); - } - - /* plug hole backward */ - pmem = (struct mem *)(void *)&ram[mem->prev]; - if (pmem != mem && pmem->used == 0) { - /* if mem->prev is unused, combine mem and mem->prev */ - if (lfree == mem) { - lfree = pmem; - } - pmem->next = mem->next; - ((struct mem *)(void *)&ram[mem->next])->prev = (mem_size_t)((u8_t *)pmem - ram); - } -} - -/** - * Zero the heap and initialize start, end and lowest-free - */ -void -mem_init(void) -{ - struct mem *mem; - - LWIP_ASSERT("Sanity check alignment", - (SIZEOF_STRUCT_MEM & (MEM_ALIGNMENT-1)) == 0); - - /* align the heap */ - ram = (u8_t *)LWIP_MEM_ALIGN(LWIP_RAM_HEAP_POINTER); - /* initialize the start of the heap */ - mem = (struct mem *)(void *)ram; - mem->next = MEM_SIZE_ALIGNED; - mem->prev = 0; - mem->used = 0; - /* initialize the end of the heap */ - ram_end = (struct mem *)(void *)&ram[MEM_SIZE_ALIGNED]; - ram_end->used = 1; - ram_end->next = MEM_SIZE_ALIGNED; - ram_end->prev = MEM_SIZE_ALIGNED; - - /* initialize the lowest-free pointer to the start of the heap */ - lfree = (struct mem *)(void *)ram; - - MEM_STATS_AVAIL(avail, MEM_SIZE_ALIGNED); - - if(sys_mutex_new(&mem_mutex) != ERR_OK) { - LWIP_ASSERT("failed to create mem_mutex", 0); - } -} - -/** - * Put a struct mem back on the heap - * - * @param rmem is the data portion of a struct mem as returned by a previous - * call to mem_malloc() - */ -void -mem_free(void *rmem) -{ - struct mem *mem; - LWIP_MEM_FREE_DECL_PROTECT(); - - if (rmem == NULL) { - LWIP_DEBUGF(MEM_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS, ("mem_free(p == NULL) was called.\n")); - return; - } - LWIP_ASSERT("mem_free: sanity check alignment", (((mem_ptr_t)rmem) & (MEM_ALIGNMENT-1)) == 0); - - LWIP_ASSERT("mem_free: legal memory", (u8_t *)rmem >= (u8_t *)ram && - (u8_t *)rmem < (u8_t *)ram_end); - - if ((u8_t *)rmem < (u8_t *)ram || (u8_t *)rmem >= (u8_t *)ram_end) { - SYS_ARCH_DECL_PROTECT(lev); - LWIP_DEBUGF(MEM_DEBUG | LWIP_DBG_LEVEL_SEVERE, ("mem_free: illegal memory\n")); - /* protect mem stats from concurrent access */ - SYS_ARCH_PROTECT(lev); - MEM_STATS_INC(illegal); - SYS_ARCH_UNPROTECT(lev); - return; - } - /* protect the heap from concurrent access */ - LWIP_MEM_FREE_PROTECT(); - /* Get the corresponding struct mem ... */ - mem = (struct mem *)(void *)((u8_t *)rmem - SIZEOF_STRUCT_MEM); - /* ... which has to be in a used state ... */ - LWIP_ASSERT("mem_free: mem->used", mem->used); - /* ... and is now unused. */ - mem->used = 0; - - if (mem < lfree) { - /* the newly freed struct is now the lowest */ - lfree = mem; - } - - MEM_STATS_DEC_USED(used, mem->next - (mem_size_t)(((u8_t *)mem - ram))); - - /* finally, see if prev or next are free also */ - plug_holes(mem); -#if LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT - mem_free_count = 1; -#endif /* LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT */ - LWIP_MEM_FREE_UNPROTECT(); -} - -/** - * Shrink memory returned by mem_malloc(). - * - * @param rmem pointer to memory allocated by mem_malloc the is to be shrinked - * @param newsize required size after shrinking (needs to be smaller than or - * equal to the previous size) - * @return for compatibility reasons: is always == rmem, at the moment - * or NULL if newsize is > old size, in which case rmem is NOT touched - * or freed! - */ -void * -mem_trim(void *rmem, mem_size_t newsize) -{ - mem_size_t size; - mem_size_t ptr, ptr2; - struct mem *mem, *mem2; - /* use the FREE_PROTECT here: it protects with sem OR SYS_ARCH_PROTECT */ - LWIP_MEM_FREE_DECL_PROTECT(); - - /* Expand the size of the allocated memory region so that we can - adjust for alignment. */ - newsize = LWIP_MEM_ALIGN_SIZE(newsize); - - if(newsize < MIN_SIZE_ALIGNED) { - /* every data block must be at least MIN_SIZE_ALIGNED long */ - newsize = MIN_SIZE_ALIGNED; - } - - if (newsize > MEM_SIZE_ALIGNED) { - return NULL; - } - - LWIP_ASSERT("mem_trim: legal memory", (u8_t *)rmem >= (u8_t *)ram && - (u8_t *)rmem < (u8_t *)ram_end); - - if ((u8_t *)rmem < (u8_t *)ram || (u8_t *)rmem >= (u8_t *)ram_end) { - SYS_ARCH_DECL_PROTECT(lev); - LWIP_DEBUGF(MEM_DEBUG | LWIP_DBG_LEVEL_SEVERE, ("mem_trim: illegal memory\n")); - /* protect mem stats from concurrent access */ - SYS_ARCH_PROTECT(lev); - MEM_STATS_INC(illegal); - SYS_ARCH_UNPROTECT(lev); - return rmem; - } - /* Get the corresponding struct mem ... */ - mem = (struct mem *)(void *)((u8_t *)rmem - SIZEOF_STRUCT_MEM); - /* ... and its offset pointer */ - ptr = (mem_size_t)((u8_t *)mem - ram); - - size = mem->next - ptr - SIZEOF_STRUCT_MEM; - LWIP_ASSERT("mem_trim can only shrink memory", newsize <= size); - if (newsize > size) { - /* not supported */ - return NULL; - } - if (newsize == size) { - /* No change in size, simply return */ - return rmem; - } - - /* protect the heap from concurrent access */ - LWIP_MEM_FREE_PROTECT(); - - mem2 = (struct mem *)(void *)&ram[mem->next]; - if(mem2->used == 0) { - /* The next struct is unused, we can simply move it at little */ - mem_size_t next; - /* remember the old next pointer */ - next = mem2->next; - /* create new struct mem which is moved directly after the shrinked mem */ - ptr2 = ptr + SIZEOF_STRUCT_MEM + newsize; - if (lfree == mem2) { - lfree = (struct mem *)(void *)&ram[ptr2]; - } - mem2 = (struct mem *)(void *)&ram[ptr2]; - mem2->used = 0; - /* restore the next pointer */ - mem2->next = next; - /* link it back to mem */ - mem2->prev = ptr; - /* link mem to it */ - mem->next = ptr2; - /* last thing to restore linked list: as we have moved mem2, - * let 'mem2->next->prev' point to mem2 again. but only if mem2->next is not - * the end of the heap */ - if (mem2->next != MEM_SIZE_ALIGNED) { - ((struct mem *)(void *)&ram[mem2->next])->prev = ptr2; - } - MEM_STATS_DEC_USED(used, (size - newsize)); - /* no need to plug holes, we've already done that */ - } else if (newsize + SIZEOF_STRUCT_MEM + MIN_SIZE_ALIGNED <= size) { - /* Next struct is used but there's room for another struct mem with - * at least MIN_SIZE_ALIGNED of data. - * Old size ('size') must be big enough to contain at least 'newsize' plus a struct mem - * ('SIZEOF_STRUCT_MEM') with some data ('MIN_SIZE_ALIGNED'). - * @todo we could leave out MIN_SIZE_ALIGNED. We would create an empty - * region that couldn't hold data, but when mem->next gets freed, - * the 2 regions would be combined, resulting in more free memory */ - ptr2 = ptr + SIZEOF_STRUCT_MEM + newsize; - mem2 = (struct mem *)(void *)&ram[ptr2]; - if (mem2 < lfree) { - lfree = mem2; - } - mem2->used = 0; - mem2->next = mem->next; - mem2->prev = ptr; - mem->next = ptr2; - if (mem2->next != MEM_SIZE_ALIGNED) { - ((struct mem *)(void *)&ram[mem2->next])->prev = ptr2; - } - MEM_STATS_DEC_USED(used, (size - newsize)); - /* the original mem->next is used, so no need to plug holes! */ - } - /* else { - next struct mem is used but size between mem and mem2 is not big enough - to create another struct mem - -> don't do anyhting. - -> the remaining space stays unused since it is too small - } */ -#if LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT - mem_free_count = 1; -#endif /* LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT */ - LWIP_MEM_FREE_UNPROTECT(); - return rmem; -} - -/** - * Adam's mem_malloc() plus solution for bug #17922 - * Allocate a block of memory with a minimum of 'size' bytes. - * - * @param size is the minimum size of the requested block in bytes. - * @return pointer to allocated memory or NULL if no free memory was found. - * - * Note that the returned value will always be aligned (as defined by MEM_ALIGNMENT). - */ -void * -mem_malloc(mem_size_t size) -{ - mem_size_t ptr, ptr2; - struct mem *mem, *mem2; -#if LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT - u8_t local_mem_free_count = 0; -#endif /* LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT */ - LWIP_MEM_ALLOC_DECL_PROTECT(); - - if (size == 0) { - return NULL; - } - - /* Expand the size of the allocated memory region so that we can - adjust for alignment. */ - size = LWIP_MEM_ALIGN_SIZE(size); - - if(size < MIN_SIZE_ALIGNED) { - /* every data block must be at least MIN_SIZE_ALIGNED long */ - size = MIN_SIZE_ALIGNED; - } - - if (size > MEM_SIZE_ALIGNED) { - return NULL; - } - - /* protect the heap from concurrent access */ - sys_mutex_lock(&mem_mutex); - LWIP_MEM_ALLOC_PROTECT(); -#if LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT - /* run as long as a mem_free disturbed mem_malloc or mem_trim */ - do { - local_mem_free_count = 0; -#endif /* LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT */ - - /* Scan through the heap searching for a free block that is big enough, - * beginning with the lowest free block. - */ - for (ptr = (mem_size_t)((u8_t *)lfree - ram); ptr < MEM_SIZE_ALIGNED - size; - ptr = ((struct mem *)(void *)&ram[ptr])->next) { - mem = (struct mem *)(void *)&ram[ptr]; -#if LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT - mem_free_count = 0; - LWIP_MEM_ALLOC_UNPROTECT(); - /* allow mem_free or mem_trim to run */ - LWIP_MEM_ALLOC_PROTECT(); - if (mem_free_count != 0) { - /* If mem_free or mem_trim have run, we have to restart since they - could have altered our current struct mem. */ - local_mem_free_count = 1; - break; - } -#endif /* LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT */ - - if ((!mem->used) && - (mem->next - (ptr + SIZEOF_STRUCT_MEM)) >= size) { - /* mem is not used and at least perfect fit is possible: - * mem->next - (ptr + SIZEOF_STRUCT_MEM) gives us the 'user data size' of mem */ - - if (mem->next - (ptr + SIZEOF_STRUCT_MEM) >= (size + SIZEOF_STRUCT_MEM + MIN_SIZE_ALIGNED)) { - /* (in addition to the above, we test if another struct mem (SIZEOF_STRUCT_MEM) containing - * at least MIN_SIZE_ALIGNED of data also fits in the 'user data space' of 'mem') - * -> split large block, create empty remainder, - * remainder must be large enough to contain MIN_SIZE_ALIGNED data: if - * mem->next - (ptr + (2*SIZEOF_STRUCT_MEM)) == size, - * struct mem would fit in but no data between mem2 and mem2->next - * @todo we could leave out MIN_SIZE_ALIGNED. We would create an empty - * region that couldn't hold data, but when mem->next gets freed, - * the 2 regions would be combined, resulting in more free memory - */ - ptr2 = ptr + SIZEOF_STRUCT_MEM + size; - /* create mem2 struct */ - mem2 = (struct mem *)(void *)&ram[ptr2]; - mem2->used = 0; - mem2->next = mem->next; - mem2->prev = ptr; - /* and insert it between mem and mem->next */ - mem->next = ptr2; - mem->used = 1; - - if (mem2->next != MEM_SIZE_ALIGNED) { - ((struct mem *)(void *)&ram[mem2->next])->prev = ptr2; - } - MEM_STATS_INC_USED(used, (size + SIZEOF_STRUCT_MEM)); - } else { - /* (a mem2 struct does no fit into the user data space of mem and mem->next will always - * be used at this point: if not we have 2 unused structs in a row, plug_holes should have - * take care of this). - * -> near fit or excact fit: do not split, no mem2 creation - * also can't move mem->next directly behind mem, since mem->next - * will always be used at this point! - */ - mem->used = 1; - MEM_STATS_INC_USED(used, mem->next - (mem_size_t)((u8_t *)mem - ram)); - } -#if LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT -mem_malloc_adjust_lfree: -#endif /* LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT */ - if (mem == lfree) { - struct mem *cur = lfree; - /* Find next free block after mem and update lowest free pointer */ - while (cur->used && cur != ram_end) { -#if LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT - mem_free_count = 0; - LWIP_MEM_ALLOC_UNPROTECT(); - /* prevent high interrupt latency... */ - LWIP_MEM_ALLOC_PROTECT(); - if (mem_free_count != 0) { - /* If mem_free or mem_trim have run, we have to restart since they - could have altered our current struct mem or lfree. */ - goto mem_malloc_adjust_lfree; - } -#endif /* LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT */ - cur = (struct mem *)(void *)&ram[cur->next]; - } - lfree = cur; - LWIP_ASSERT("mem_malloc: !lfree->used", ((lfree == ram_end) || (!lfree->used))); - } - LWIP_MEM_ALLOC_UNPROTECT(); - sys_mutex_unlock(&mem_mutex); - LWIP_ASSERT("mem_malloc: allocated memory not above ram_end.", - (mem_ptr_t)mem + SIZEOF_STRUCT_MEM + size <= (mem_ptr_t)ram_end); - LWIP_ASSERT("mem_malloc: allocated memory properly aligned.", - ((mem_ptr_t)mem + SIZEOF_STRUCT_MEM) % MEM_ALIGNMENT == 0); - LWIP_ASSERT("mem_malloc: sanity check alignment", - (((mem_ptr_t)mem) & (MEM_ALIGNMENT-1)) == 0); - - return (u8_t *)mem + SIZEOF_STRUCT_MEM; - } - } -#if LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT - /* if we got interrupted by a mem_free, try again */ - } while(local_mem_free_count != 0); -#endif /* LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT */ - LWIP_DEBUGF(MEM_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("mem_malloc: could not allocate %"S16_F" bytes\n", (s16_t)size)); - MEM_STATS_INC(err); - LWIP_MEM_ALLOC_UNPROTECT(); - sys_mutex_unlock(&mem_mutex); - return NULL; -} - -#endif /* MEM_USE_POOLS */ -/** - * Contiguously allocates enough space for count objects that are size bytes - * of memory each and returns a pointer to the allocated memory. - * - * The allocated memory is filled with bytes of value zero. - * - * @param count number of objects to allocate - * @param size size of the objects to allocate - * @return pointer to allocated memory / NULL pointer if there is an error - */ -void *mem_calloc(mem_size_t count, mem_size_t size) -{ - void *p; - - /* allocate 'count' objects of size 'size' */ - p = mem_malloc(count * size); - if (p) { - /* zero the memory */ - memset(p, 0, count * size); - } - return p; -} - -#endif /* !MEM_LIBC_MALLOC */ diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/core/memp.c b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/core/memp.c deleted file mode 100644 index 1323463e..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/core/memp.c +++ /dev/null @@ -1,485 +0,0 @@ -/** - * @file - * Dynamic pool memory manager - * - * lwIP has dedicated pools for many structures (netconn, protocol control blocks, - * packet buffers, ...). All these pools are managed here. - */ - -/* - * Copyright (c) 2001-2004 Swedish Institute of Computer Science. - * 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. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT - * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING - * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY - * OF SUCH DAMAGE. - * - * This file is part of the lwIP TCP/IP stack. - * - * Author: Adam Dunkels - * - */ - -#include "lwip/opt.h" - -#include "lwip/memp.h" -#include "lwip/pbuf.h" -#include "lwip/udp.h" -#include "lwip/raw.h" -#include "lwip/tcp_impl.h" -#include "lwip/igmp.h" -#include "lwip/api.h" -#include "lwip/api_msg.h" -#include "lwip/tcpip.h" -#include "lwip/sys.h" -#include "lwip/timers.h" -#include "lwip/stats.h" -#include "netif/etharp.h" -#include "lwip/ip_frag.h" -#include "lwip/snmp_structs.h" -#include "lwip/snmp_msg.h" -#include "lwip/dns.h" -#include "netif/ppp_oe.h" -#include "lwip/nd6.h" -#include "lwip/ip6_frag.h" -#include "lwip/mld6.h" - -#include - -#if !MEMP_MEM_MALLOC /* don't build if not configured for use in lwipopts.h */ - -struct memp { - struct memp *next; -#if MEMP_OVERFLOW_CHECK - const char *file; - int line; -#endif /* MEMP_OVERFLOW_CHECK */ -}; - -#if MEMP_OVERFLOW_CHECK -/* if MEMP_OVERFLOW_CHECK is turned on, we reserve some bytes at the beginning - * and at the end of each element, initialize them as 0xcd and check - * them later. */ -/* If MEMP_OVERFLOW_CHECK is >= 2, on every call to memp_malloc or memp_free, - * every single element in each pool is checked! - * This is VERY SLOW but also very helpful. */ -/* MEMP_SANITY_REGION_BEFORE and MEMP_SANITY_REGION_AFTER can be overridden in - * lwipopts.h to change the amount reserved for checking. */ -#ifndef MEMP_SANITY_REGION_BEFORE -#define MEMP_SANITY_REGION_BEFORE 16 -#endif /* MEMP_SANITY_REGION_BEFORE*/ -#if MEMP_SANITY_REGION_BEFORE > 0 -#define MEMP_SANITY_REGION_BEFORE_ALIGNED LWIP_MEM_ALIGN_SIZE(MEMP_SANITY_REGION_BEFORE) -#else -#define MEMP_SANITY_REGION_BEFORE_ALIGNED 0 -#endif /* MEMP_SANITY_REGION_BEFORE*/ -#ifndef MEMP_SANITY_REGION_AFTER -#define MEMP_SANITY_REGION_AFTER 16 -#endif /* MEMP_SANITY_REGION_AFTER*/ -#if MEMP_SANITY_REGION_AFTER > 0 -#define MEMP_SANITY_REGION_AFTER_ALIGNED LWIP_MEM_ALIGN_SIZE(MEMP_SANITY_REGION_AFTER) -#else -#define MEMP_SANITY_REGION_AFTER_ALIGNED 0 -#endif /* MEMP_SANITY_REGION_AFTER*/ - -/* MEMP_SIZE: save space for struct memp and for sanity check */ -#define MEMP_SIZE (LWIP_MEM_ALIGN_SIZE(sizeof(struct memp)) + MEMP_SANITY_REGION_BEFORE_ALIGNED) -#define MEMP_ALIGN_SIZE(x) (LWIP_MEM_ALIGN_SIZE(x) + MEMP_SANITY_REGION_AFTER_ALIGNED) - -#else /* MEMP_OVERFLOW_CHECK */ - -/* No sanity checks - * We don't need to preserve the struct memp while not allocated, so we - * can save a little space and set MEMP_SIZE to 0. - */ -#define MEMP_SIZE 0 -#define MEMP_ALIGN_SIZE(x) (LWIP_MEM_ALIGN_SIZE(x)) - -#endif /* MEMP_OVERFLOW_CHECK */ - -/** This array holds the first free element of each pool. - * Elements form a linked list. */ -static struct memp *memp_tab[MEMP_MAX]; - -#else /* MEMP_MEM_MALLOC */ - -#define MEMP_ALIGN_SIZE(x) (LWIP_MEM_ALIGN_SIZE(x)) - -#endif /* MEMP_MEM_MALLOC */ - -/** This array holds the element sizes of each pool. */ -#if !MEM_USE_POOLS && !MEMP_MEM_MALLOC -static -#endif -const u16_t memp_sizes[MEMP_MAX] = { -#define LWIP_MEMPOOL(name,num,size,desc) LWIP_MEM_ALIGN_SIZE(size), -#include "lwip/memp_std.h" -}; - -#if !MEMP_MEM_MALLOC /* don't build if not configured for use in lwipopts.h */ - -/** This array holds the number of elements in each pool. */ -static const u16_t memp_num[MEMP_MAX] = { -#define LWIP_MEMPOOL(name,num,size,desc) (num), -#include "lwip/memp_std.h" -}; - -/** This array holds a textual description of each pool. */ -#ifdef LWIP_DEBUG -static const char *memp_desc[MEMP_MAX] = { -#define LWIP_MEMPOOL(name,num,size,desc) (desc), -#include "lwip/memp_std.h" -}; -#endif /* LWIP_DEBUG */ - -#if MEMP_SEPARATE_POOLS - -/** This creates each memory pool. These are named memp_memory_XXX_base (where - * XXX is the name of the pool defined in memp_std.h). - * To relocate a pool, declare it as extern in cc.h. Example for GCC: - * extern u8_t __attribute__((section(".onchip_mem"))) memp_memory_UDP_PCB_base[]; - */ -#define LWIP_MEMPOOL(name,num,size,desc) u8_t memp_memory_ ## name ## _base \ - [((num) * (MEMP_SIZE + MEMP_ALIGN_SIZE(size)))]; -#include "lwip/memp_std.h" - -/** This array holds the base of each memory pool. */ -static u8_t *const memp_bases[] = { -#define LWIP_MEMPOOL(name,num,size,desc) memp_memory_ ## name ## _base, -#include "lwip/memp_std.h" -}; - -#else /* MEMP_SEPARATE_POOLS */ - -/** This is the actual memory used by the pools (all pools in one big block). */ -static u8_t memp_memory[MEM_ALIGNMENT - 1 -#define LWIP_MEMPOOL(name,num,size,desc) + ( (num) * (MEMP_SIZE + MEMP_ALIGN_SIZE(size) ) ) -#include "lwip/memp_std.h" -]; - -#endif /* MEMP_SEPARATE_POOLS */ - -#if MEMP_SANITY_CHECK -/** - * Check that memp-lists don't form a circle, using "Floyd's cycle-finding algorithm". - */ -static int -memp_sanity(void) -{ - s16_t i; - struct memp *t, *h; - - for (i = 0; i < MEMP_MAX; i++) { - t = memp_tab[i]; - if(t != NULL) { - for (h = t->next; (t != NULL) && (h != NULL); t = t->next, - h = (((h->next != NULL) && (h->next->next != NULL)) ? h->next->next : NULL)) { - if (t == h) { - return 0; - } - } - } - } - return 1; -} -#endif /* MEMP_SANITY_CHECK*/ -#if MEMP_OVERFLOW_CHECK -#if defined(LWIP_DEBUG) && MEMP_STATS -static const char * memp_overflow_names[] = { -#define LWIP_MEMPOOL(name,num,size,desc) "/"desc, -#include "lwip/memp_std.h" - }; -#endif - -/** - * Check if a memp element was victim of an overflow - * (e.g. the restricted area after it has been altered) - * - * @param p the memp element to check - * @param memp_type the pool p comes from - */ -static void -memp_overflow_check_element_overflow(struct memp *p, u16_t memp_type) -{ - u16_t k; - u8_t *m; -#if MEMP_SANITY_REGION_AFTER_ALIGNED > 0 - m = (u8_t*)p + MEMP_SIZE + memp_sizes[memp_type]; - for (k = 0; k < MEMP_SANITY_REGION_AFTER_ALIGNED; k++) { - if (m[k] != 0xcd) { - char errstr[128] = "detected memp overflow in pool "; - char digit[] = "0"; - if(memp_type >= 10) { - digit[0] = '0' + (memp_type/10); - strcat(errstr, digit); - } - digit[0] = '0' + (memp_type%10); - strcat(errstr, digit); -#if defined(LWIP_DEBUG) && MEMP_STATS - strcat(errstr, memp_overflow_names[memp_type]); -#endif - LWIP_ASSERT(errstr, 0); - } - } -#endif -} - -/** - * Check if a memp element was victim of an underflow - * (e.g. the restricted area before it has been altered) - * - * @param p the memp element to check - * @param memp_type the pool p comes from - */ -static void -memp_overflow_check_element_underflow(struct memp *p, u16_t memp_type) -{ - u16_t k; - u8_t *m; -#if MEMP_SANITY_REGION_BEFORE_ALIGNED > 0 - m = (u8_t*)p + MEMP_SIZE - MEMP_SANITY_REGION_BEFORE_ALIGNED; - for (k = 0; k < MEMP_SANITY_REGION_BEFORE_ALIGNED; k++) { - if (m[k] != 0xcd) { - char errstr[128] = "detected memp underflow in pool "; - char digit[] = "0"; - if(memp_type >= 10) { - digit[0] = '0' + (memp_type/10); - strcat(errstr, digit); - } - digit[0] = '0' + (memp_type%10); - strcat(errstr, digit); -#if defined(LWIP_DEBUG) && MEMP_STATS - strcat(errstr, memp_overflow_names[memp_type]); -#endif - LWIP_ASSERT(errstr, 0); - } - } -#endif -} - -/** - * Do an overflow check for all elements in every pool. - * - * @see memp_overflow_check_element for a description of the check - */ -static void -memp_overflow_check_all(void) -{ - u16_t i, j; - struct memp *p; - -#if !MEMP_SEPARATE_POOLS - p = (struct memp *)LWIP_MEM_ALIGN(memp_memory); -#endif /* !MEMP_SEPARATE_POOLS */ - for (i = 0; i < MEMP_MAX; ++i) { -#if MEMP_SEPARATE_POOLS - p = (struct memp *)(memp_bases[i]); -#endif /* MEMP_SEPARATE_POOLS */ - for (j = 0; j < memp_num[i]; ++j) { - memp_overflow_check_element_overflow(p, i); - p = (struct memp*)((u8_t*)p + MEMP_SIZE + memp_sizes[i] + MEMP_SANITY_REGION_AFTER_ALIGNED); - } - } -#if !MEMP_SEPARATE_POOLS - p = (struct memp *)LWIP_MEM_ALIGN(memp_memory); -#endif /* !MEMP_SEPARATE_POOLS */ - for (i = 0; i < MEMP_MAX; ++i) { -#if MEMP_SEPARATE_POOLS - p = (struct memp *)(memp_bases[i]); -#endif /* MEMP_SEPARATE_POOLS */ - for (j = 0; j < memp_num[i]; ++j) { - memp_overflow_check_element_underflow(p, i); - p = (struct memp*)((u8_t*)p + MEMP_SIZE + memp_sizes[i] + MEMP_SANITY_REGION_AFTER_ALIGNED); - } - } -} - -/** - * Initialize the restricted areas of all memp elements in every pool. - */ -static void -memp_overflow_init(void) -{ - u16_t i, j; - struct memp *p; - u8_t *m; - -#if !MEMP_SEPARATE_POOLS - p = (struct memp *)LWIP_MEM_ALIGN(memp_memory); -#endif /* !MEMP_SEPARATE_POOLS */ - for (i = 0; i < MEMP_MAX; ++i) { -#if MEMP_SEPARATE_POOLS - p = (struct memp *)(memp_bases[i]); -#endif /* MEMP_SEPARATE_POOLS */ - for (j = 0; j < memp_num[i]; ++j) { -#if MEMP_SANITY_REGION_BEFORE_ALIGNED > 0 - m = (u8_t*)p + MEMP_SIZE - MEMP_SANITY_REGION_BEFORE_ALIGNED; - memset(m, 0xcd, MEMP_SANITY_REGION_BEFORE_ALIGNED); -#endif -#if MEMP_SANITY_REGION_AFTER_ALIGNED > 0 - m = (u8_t*)p + MEMP_SIZE + memp_sizes[i]; - memset(m, 0xcd, MEMP_SANITY_REGION_AFTER_ALIGNED); -#endif - p = (struct memp*)((u8_t*)p + MEMP_SIZE + memp_sizes[i] + MEMP_SANITY_REGION_AFTER_ALIGNED); - } - } -} -#endif /* MEMP_OVERFLOW_CHECK */ - -/** - * Initialize this module. - * - * Carves out memp_memory into linked lists for each pool-type. - */ -void -memp_init(void) -{ - struct memp *memp; - u16_t i, j; - - for (i = 0; i < MEMP_MAX; ++i) { - MEMP_STATS_AVAIL(used, i, 0); - MEMP_STATS_AVAIL(max, i, 0); - MEMP_STATS_AVAIL(err, i, 0); - MEMP_STATS_AVAIL(avail, i, memp_num[i]); - } - -#if !MEMP_SEPARATE_POOLS - memp = (struct memp *)LWIP_MEM_ALIGN(memp_memory); -#endif /* !MEMP_SEPARATE_POOLS */ - /* for every pool: */ - for (i = 0; i < MEMP_MAX; ++i) { - memp_tab[i] = NULL; -#if MEMP_SEPARATE_POOLS - memp = (struct memp*)memp_bases[i]; -#endif /* MEMP_SEPARATE_POOLS */ - /* create a linked list of memp elements */ - for (j = 0; j < memp_num[i]; ++j) { - memp->next = memp_tab[i]; - memp_tab[i] = memp; - memp = (struct memp *)(void *)((u8_t *)memp + MEMP_SIZE + memp_sizes[i] -#if MEMP_OVERFLOW_CHECK - + MEMP_SANITY_REGION_AFTER_ALIGNED -#endif - ); - } - } -#if MEMP_OVERFLOW_CHECK - memp_overflow_init(); - /* check everything a first time to see if it worked */ - memp_overflow_check_all(); -#endif /* MEMP_OVERFLOW_CHECK */ -} - -/** - * Get an element from a specific pool. - * - * @param type the pool to get an element from - * - * the debug version has two more parameters: - * @param file file name calling this function - * @param line number of line where this function is called - * - * @return a pointer to the allocated memory or a NULL pointer on error - */ -void * -#if !MEMP_OVERFLOW_CHECK -memp_malloc(memp_t type) -#else -memp_malloc_fn(memp_t type, const char* file, const int line) -#endif -{ - struct memp *memp; - SYS_ARCH_DECL_PROTECT(old_level); - - LWIP_ERROR("memp_malloc: type < MEMP_MAX", (type < MEMP_MAX), return NULL;); - - SYS_ARCH_PROTECT(old_level); -#if MEMP_OVERFLOW_CHECK >= 2 - memp_overflow_check_all(); -#endif /* MEMP_OVERFLOW_CHECK >= 2 */ - - memp = memp_tab[type]; - - if (memp != NULL) { - memp_tab[type] = memp->next; -#if MEMP_OVERFLOW_CHECK - memp->next = NULL; - memp->file = file; - memp->line = line; -#endif /* MEMP_OVERFLOW_CHECK */ - MEMP_STATS_INC_USED(used, type); - LWIP_ASSERT("memp_malloc: memp properly aligned", - ((mem_ptr_t)memp % MEM_ALIGNMENT) == 0); - memp = (struct memp*)(void *)((u8_t*)memp + MEMP_SIZE); - } else { - LWIP_DEBUGF(MEMP_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("memp_malloc: out of memory in pool %s\n", memp_desc[type])); - MEMP_STATS_INC(err, type); - } - - SYS_ARCH_UNPROTECT(old_level); - - return memp; -} - -/** - * Put an element back into its pool. - * - * @param type the pool where to put mem - * @param mem the memp element to free - */ -void -memp_free(memp_t type, void *mem) -{ - struct memp *memp; - SYS_ARCH_DECL_PROTECT(old_level); - - if (mem == NULL) { - return; - } - LWIP_ASSERT("memp_free: mem properly aligned", - ((mem_ptr_t)mem % MEM_ALIGNMENT) == 0); - - memp = (struct memp *)(void *)((u8_t*)mem - MEMP_SIZE); - - SYS_ARCH_PROTECT(old_level); -#if MEMP_OVERFLOW_CHECK -#if MEMP_OVERFLOW_CHECK >= 2 - memp_overflow_check_all(); -#else - memp_overflow_check_element_overflow(memp, type); - memp_overflow_check_element_underflow(memp, type); -#endif /* MEMP_OVERFLOW_CHECK >= 2 */ -#endif /* MEMP_OVERFLOW_CHECK */ - - MEMP_STATS_DEC(used, type); - - memp->next = memp_tab[type]; - memp_tab[type] = memp; - -#if MEMP_SANITY_CHECK - LWIP_ASSERT("memp sanity", memp_sanity()); -#endif /* MEMP_SANITY_CHECK */ - - SYS_ARCH_UNPROTECT(old_level); -} - -#endif /* MEMP_MEM_MALLOC */ diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/core/netif.c b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/core/netif.c deleted file mode 100644 index dcc87580..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/core/netif.c +++ /dev/null @@ -1,913 +0,0 @@ -/** - * @file - * lwIP network interface abstraction - * - */ - -/* - * Copyright (c) 2001-2004 Swedish Institute of Computer Science. - * 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. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT - * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING - * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY - * OF SUCH DAMAGE. - * - * This file is part of the lwIP TCP/IP stack. - * - * Author: Adam Dunkels - * - */ - -#include "lwip/opt.h" - -#include "lwip/def.h" -#include "lwip/ip_addr.h" -#include "lwip/ip6_addr.h" -#include "lwip/netif.h" -#include "lwip/tcp_impl.h" -#include "lwip/snmp.h" -#include "lwip/igmp.h" -#include "netif/etharp.h" -#include "lwip/stats.h" -#if ENABLE_LOOPBACK -#include "lwip/sys.h" -#if LWIP_NETIF_LOOPBACK_MULTITHREADING -#include "lwip/tcpip.h" -#endif /* LWIP_NETIF_LOOPBACK_MULTITHREADING */ -#endif /* ENABLE_LOOPBACK */ - -#if LWIP_AUTOIP -#include "lwip/autoip.h" -#endif /* LWIP_AUTOIP */ -#if LWIP_DHCP -#include "lwip/dhcp.h" -#endif /* LWIP_DHCP */ -#if LWIP_IPV6_DHCP6 -#include "lwip/dhcp6.h" -#endif /* LWIP_IPV6_DHCP6 */ -#if LWIP_IPV6_MLD -#include "lwip/mld6.h" -#endif /* LWIP_IPV6_MLD */ - -#if LWIP_NETIF_STATUS_CALLBACK -#define NETIF_STATUS_CALLBACK(n) do{ if (n->status_callback) { (n->status_callback)(n); }}while(0) -#else -#define NETIF_STATUS_CALLBACK(n) -#endif /* LWIP_NETIF_STATUS_CALLBACK */ - -#if LWIP_NETIF_LINK_CALLBACK -#define NETIF_LINK_CALLBACK(n) do{ if (n->link_callback) { (n->link_callback)(n); }}while(0) -#else -#define NETIF_LINK_CALLBACK(n) -#endif /* LWIP_NETIF_LINK_CALLBACK */ - -struct netif *netif_list; -struct netif *netif_default; - -static u8_t netif_num; - -#if LWIP_IPV6 -static err_t netif_null_output_ip6(struct netif *netif, struct pbuf *p, ip6_addr_t *ipaddr); -#endif /* LWIP_IPV6 */ - -#if LWIP_HAVE_LOOPIF -static struct netif loop_netif; - -/** - * Initialize a lwip network interface structure for a loopback interface - * - * @param netif the lwip network interface structure for this loopif - * @return ERR_OK if the loopif is initialized - * ERR_MEM if private data couldn't be allocated - */ -static err_t -netif_loopif_init(struct netif *netif) -{ - /* initialize the snmp variables and counters inside the struct netif - * ifSpeed: no assumption can be made! - */ - NETIF_INIT_SNMP(netif, snmp_ifType_softwareLoopback, 0); - - netif->name[0] = 'l'; - netif->name[1] = 'o'; - netif->output = netif_loop_output; - return ERR_OK; -} -#endif /* LWIP_HAVE_LOOPIF */ - -void -netif_init(void) -{ -#if LWIP_HAVE_LOOPIF - ip_addr_t loop_ipaddr, loop_netmask, loop_gw; - IP4_ADDR(&loop_gw, 127,0,0,1); - IP4_ADDR(&loop_ipaddr, 127,0,0,1); - IP4_ADDR(&loop_netmask, 255,0,0,0); - -#if NO_SYS - netif_add(&loop_netif, &loop_ipaddr, &loop_netmask, &loop_gw, NULL, netif_loopif_init, ip_input); -#else /* NO_SYS */ - netif_add(&loop_netif, &loop_ipaddr, &loop_netmask, &loop_gw, NULL, netif_loopif_init, tcpip_input); -#endif /* NO_SYS */ - netif_set_up(&loop_netif); - -#endif /* LWIP_HAVE_LOOPIF */ -} - -/** - * Add a network interface to the list of lwIP netifs. - * - * @param netif a pre-allocated netif structure - * @param ipaddr IP address for the new netif - * @param netmask network mask for the new netif - * @param gw default gateway IP address for the new netif - * @param state opaque data passed to the new netif - * @param init callback function that initializes the interface - * @param input callback function that is called to pass - * ingress packets up in the protocol layer stack. - * - * @return netif, or NULL if failed. - */ -struct netif * -netif_add(struct netif *netif, ip_addr_t *ipaddr, ip_addr_t *netmask, - ip_addr_t *gw, void *state, netif_init_fn init, netif_input_fn input) -{ -#if LWIP_IPV6 - u32_t i; -#endif - - LWIP_ASSERT("No init function given", init != NULL); - - /* reset new interface configuration state */ - ip_addr_set_zero(&netif->ip_addr); - ip_addr_set_zero(&netif->netmask); - ip_addr_set_zero(&netif->gw); -#if LWIP_IPV6 - for (i = 0; i < LWIP_IPV6_NUM_ADDRESSES; i++) { - ip6_addr_set_zero(&netif->ip6_addr[i]); - netif_ip6_addr_set_state(netif, i, IP6_ADDR_INVALID); - } - netif->output_ip6 = netif_null_output_ip6; -#endif /* LWIP_IPV6 */ - netif->flags = 0; -#if LWIP_DHCP - /* netif not under DHCP control by default */ - netif->dhcp = NULL; -#endif /* LWIP_DHCP */ -#if LWIP_AUTOIP - /* netif not under AutoIP control by default */ - netif->autoip = NULL; -#endif /* LWIP_AUTOIP */ -#if LWIP_IPV6_AUTOCONFIG - /* IPv6 address autoconfiguration not enabled by default */ - netif->ip6_autoconfig_enabled = 0; -#endif /* LWIP_IPV6_AUTOCONFIG */ -#if LWIP_IPV6_SEND_ROUTER_SOLICIT - netif->rs_count = LWIP_ND6_MAX_MULTICAST_SOLICIT; -#endif /* LWIP_IPV6_SEND_ROUTER_SOLICIT */ -#if LWIP_IPV6_DHCP6 - /* netif not under DHCPv6 control by default */ - netif->dhcp6 = NULL; -#endif /* LWIP_IPV6_DHCP6 */ -#if LWIP_NETIF_STATUS_CALLBACK - netif->status_callback = NULL; -#endif /* LWIP_NETIF_STATUS_CALLBACK */ -#if LWIP_NETIF_LINK_CALLBACK - netif->link_callback = NULL; -#endif /* LWIP_NETIF_LINK_CALLBACK */ -#if LWIP_IGMP - netif->igmp_mac_filter = NULL; -#endif /* LWIP_IGMP */ -#if LWIP_IPV6 && LWIP_IPV6_MLD - netif->mld_mac_filter = NULL; -#endif /* LWIP_IPV6 && LWIP_IPV6_MLD */ -#if ENABLE_LOOPBACK - netif->loop_first = NULL; - netif->loop_last = NULL; -#endif /* ENABLE_LOOPBACK */ - - /* remember netif specific state information data */ - netif->state = state; - netif->num = netif_num++; - netif->input = input; - NETIF_SET_HWADDRHINT(netif, NULL); -#if ENABLE_LOOPBACK && LWIP_LOOPBACK_MAX_PBUFS - netif->loop_cnt_current = 0; -#endif /* ENABLE_LOOPBACK && LWIP_LOOPBACK_MAX_PBUFS */ - - netif_set_addr(netif, ipaddr, netmask, gw); - - /* call user specified initialization function for netif */ - if (init(netif) != ERR_OK) { - return NULL; - } - - /* add this netif to the list */ - netif->next = netif_list; - netif_list = netif; - snmp_inc_iflist(); - -#if LWIP_IGMP - /* start IGMP processing */ - if (netif->flags & NETIF_FLAG_IGMP) { - igmp_start(netif); - } -#endif /* LWIP_IGMP */ - - LWIP_DEBUGF(NETIF_DEBUG, ("netif: added interface %c%c IP addr ", - netif->name[0], netif->name[1])); - ip_addr_debug_print(NETIF_DEBUG, ipaddr); - LWIP_DEBUGF(NETIF_DEBUG, (" netmask ")); - ip_addr_debug_print(NETIF_DEBUG, netmask); - LWIP_DEBUGF(NETIF_DEBUG, (" gw ")); - ip_addr_debug_print(NETIF_DEBUG, gw); - LWIP_DEBUGF(NETIF_DEBUG, ("\n")); - return netif; -} - -/** - * Change IP address configuration for a network interface (including netmask - * and default gateway). - * - * @param netif the network interface to change - * @param ipaddr the new IP address - * @param netmask the new netmask - * @param gw the new default gateway - */ -void -netif_set_addr(struct netif *netif, ip_addr_t *ipaddr, ip_addr_t *netmask, - ip_addr_t *gw) -{ - netif_set_ipaddr(netif, ipaddr); - netif_set_netmask(netif, netmask); - netif_set_gw(netif, gw); -} - -/** - * Remove a network interface from the list of lwIP netifs. - * - * @param netif the network interface to remove - */ -void -netif_remove(struct netif *netif) -{ - if (netif == NULL) { - return; - } - -#if LWIP_IGMP - /* stop IGMP processing */ - if (netif->flags & NETIF_FLAG_IGMP) { - igmp_stop(netif); - } -#endif /* LWIP_IGMP */ -#if LWIP_IPV6 && LWIP_IPV6_MLD - /* stop MLD processing */ - mld6_stop(netif); -#endif /* LWIP_IPV6 && LWIP_IPV6_MLD */ - if (netif_is_up(netif)) { - /* set netif down before removing (call callback function) */ - netif_set_down(netif); - } - - snmp_delete_ipaddridx_tree(netif); - - /* is it the first netif? */ - if (netif_list == netif) { - netif_list = netif->next; - } else { - /* look for netif further down the list */ - struct netif * tmpNetif; - for (tmpNetif = netif_list; tmpNetif != NULL; tmpNetif = tmpNetif->next) { - if (tmpNetif->next == netif) { - tmpNetif->next = netif->next; - break; - } - } - if (tmpNetif == NULL) - return; /* we didn't find any netif today */ - } - snmp_dec_iflist(); - /* this netif is default? */ - if (netif_default == netif) { - /* reset default netif */ - netif_set_default(NULL); - } -#if LWIP_NETIF_REMOVE_CALLBACK - if (netif->remove_callback) { - netif->remove_callback(netif); - } -#endif /* LWIP_NETIF_REMOVE_CALLBACK */ - LWIP_DEBUGF( NETIF_DEBUG, ("netif_remove: removed netif\n") ); -} - -/** - * Find a network interface by searching for its name - * - * @param name the name of the netif (like netif->name) plus concatenated number - * in ascii representation (e.g. 'en0') - */ -struct netif * -netif_find(char *name) -{ - struct netif *netif; - u8_t num; - - if (name == NULL) { - return NULL; - } - - num = name[2] - '0'; - - for(netif = netif_list; netif != NULL; netif = netif->next) { - if (num == netif->num && - name[0] == netif->name[0] && - name[1] == netif->name[1]) { - LWIP_DEBUGF(NETIF_DEBUG, ("netif_find: found %c%c\n", name[0], name[1])); - return netif; - } - } - LWIP_DEBUGF(NETIF_DEBUG, ("netif_find: didn't find %c%c\n", name[0], name[1])); - return NULL; -} - -int netif_is_named (struct netif *netif, const char name[3]) -{ - u8_t num = name[2] - '0'; - - return (!memcmp(netif->name, name, 2) && netif->num == num); -} - -/** - * Change the IP address of a network interface - * - * @param netif the network interface to change - * @param ipaddr the new IP address - * - * @note call netif_set_addr() if you also want to change netmask and - * default gateway - */ -void -netif_set_ipaddr(struct netif *netif, ip_addr_t *ipaddr) -{ - /* TODO: Handling of obsolete pcbs */ - /* See: http://mail.gnu.org/archive/html/lwip-users/2003-03/msg00118.html */ -#if LWIP_TCP - struct tcp_pcb *pcb; - struct tcp_pcb_listen *lpcb; - - /* address is actually being changed? */ - if (ipaddr && (ip_addr_cmp(ipaddr, &(netif->ip_addr))) == 0) { - /* extern struct tcp_pcb *tcp_active_pcbs; defined by tcp.h */ - LWIP_DEBUGF(NETIF_DEBUG | LWIP_DBG_STATE, ("netif_set_ipaddr: netif address being changed\n")); - pcb = tcp_active_pcbs; - while (pcb != NULL) { - /* PCB bound to current local interface address? */ - if (ip_addr_cmp(ipX_2_ip(&pcb->local_ip), &(netif->ip_addr)) -#if LWIP_AUTOIP - /* connections to link-local addresses must persist (RFC3927 ch. 1.9) */ - && !ip_addr_islinklocal(ipX_2_ip(&pcb->local_ip)) -#endif /* LWIP_AUTOIP */ - ) { - /* this connection must be aborted */ - struct tcp_pcb *next = pcb->next; - LWIP_DEBUGF(NETIF_DEBUG | LWIP_DBG_STATE, ("netif_set_ipaddr: aborting TCP pcb %p\n", (void *)pcb)); - tcp_abort(pcb); - pcb = next; - } else { - pcb = pcb->next; - } - } - for (lpcb = tcp_listen_pcbs.listen_pcbs; lpcb != NULL; lpcb = lpcb->next) { - /* PCB bound to current local interface address? */ - if ((!(ip_addr_isany(ipX_2_ip(&lpcb->local_ip)))) && - (ip_addr_cmp(ipX_2_ip(&lpcb->local_ip), &(netif->ip_addr)))) { - /* The PCB is listening to the old ipaddr and - * is set to listen to the new one instead */ - ip_addr_set(ipX_2_ip(&lpcb->local_ip), ipaddr); - } - } - } -#endif - snmp_delete_ipaddridx_tree(netif); - snmp_delete_iprteidx_tree(0,netif); - /* set new IP address to netif */ - ip_addr_set(&(netif->ip_addr), ipaddr); - snmp_insert_ipaddridx_tree(netif); - snmp_insert_iprteidx_tree(0,netif); - - LWIP_DEBUGF(NETIF_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("netif: IP address of interface %c%c set to %"U16_F".%"U16_F".%"U16_F".%"U16_F"\n", - netif->name[0], netif->name[1], - ip4_addr1_16(&netif->ip_addr), - ip4_addr2_16(&netif->ip_addr), - ip4_addr3_16(&netif->ip_addr), - ip4_addr4_16(&netif->ip_addr))); -} - -/** - * Change the default gateway for a network interface - * - * @param netif the network interface to change - * @param gw the new default gateway - * - * @note call netif_set_addr() if you also want to change ip address and netmask - */ -void -netif_set_gw(struct netif *netif, ip_addr_t *gw) -{ - ip_addr_set(&(netif->gw), gw); - LWIP_DEBUGF(NETIF_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("netif: GW address of interface %c%c set to %"U16_F".%"U16_F".%"U16_F".%"U16_F"\n", - netif->name[0], netif->name[1], - ip4_addr1_16(&netif->gw), - ip4_addr2_16(&netif->gw), - ip4_addr3_16(&netif->gw), - ip4_addr4_16(&netif->gw))); -} - -void netif_set_pretend_tcp (struct netif *netif, u8_t pretend) -{ - if (pretend) { - netif->flags |= NETIF_FLAG_PRETEND_TCP; - } else { - netif->flags &= ~NETIF_FLAG_PRETEND_TCP; - } -} - -/** - * Change the netmask of a network interface - * - * @param netif the network interface to change - * @param netmask the new netmask - * - * @note call netif_set_addr() if you also want to change ip address and - * default gateway - */ -void -netif_set_netmask(struct netif *netif, ip_addr_t *netmask) -{ - snmp_delete_iprteidx_tree(0, netif); - /* set new netmask to netif */ - ip_addr_set(&(netif->netmask), netmask); - snmp_insert_iprteidx_tree(0, netif); - LWIP_DEBUGF(NETIF_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("netif: netmask of interface %c%c set to %"U16_F".%"U16_F".%"U16_F".%"U16_F"\n", - netif->name[0], netif->name[1], - ip4_addr1_16(&netif->netmask), - ip4_addr2_16(&netif->netmask), - ip4_addr3_16(&netif->netmask), - ip4_addr4_16(&netif->netmask))); -} - -/** - * Set a network interface as the default network interface - * (used to output all packets for which no specific route is found) - * - * @param netif the default network interface - */ -void -netif_set_default(struct netif *netif) -{ - if (netif == NULL) { - /* remove default route */ - snmp_delete_iprteidx_tree(1, netif); - } else { - /* install default route */ - snmp_insert_iprteidx_tree(1, netif); - } - netif_default = netif; - LWIP_DEBUGF(NETIF_DEBUG, ("netif: setting default interface %c%c\n", - netif ? netif->name[0] : '\'', netif ? netif->name[1] : '\'')); -} - -/** - * Bring an interface up, available for processing - * traffic. - * - * @note: Enabling DHCP on a down interface will make it come - * up once configured. - * - * @see dhcp_start() - */ -void netif_set_up(struct netif *netif) -{ - if (!(netif->flags & NETIF_FLAG_UP)) { - netif->flags |= NETIF_FLAG_UP; - -#if LWIP_SNMP - snmp_get_sysuptime(&netif->ts); -#endif /* LWIP_SNMP */ - - NETIF_STATUS_CALLBACK(netif); - - if (netif->flags & NETIF_FLAG_LINK_UP) { -#if LWIP_ARP - /* For Ethernet network interfaces, we would like to send a "gratuitous ARP" */ - if (netif->flags & (NETIF_FLAG_ETHARP)) { - etharp_gratuitous(netif); - } -#endif /* LWIP_ARP */ - -#if LWIP_IGMP - /* resend IGMP memberships */ - if (netif->flags & NETIF_FLAG_IGMP) { - igmp_report_groups( netif); - } -#endif /* LWIP_IGMP */ -#if LWIP_IPV6 && LWIP_IPV6_MLD - /* send mld memberships */ - mld6_report_groups( netif); -#endif /* LWIP_IPV6 && LWIP_IPV6_MLD */ - -#if LWIP_IPV6_SEND_ROUTER_SOLICIT - /* Send Router Solicitation messages. */ - netif->rs_count = LWIP_ND6_MAX_MULTICAST_SOLICIT; -#endif /* LWIP_IPV6_SEND_ROUTER_SOLICIT */ - - } - } -} - -/** - * Bring an interface down, disabling any traffic processing. - * - * @note: Enabling DHCP on a down interface will make it come - * up once configured. - * - * @see dhcp_start() - */ -void netif_set_down(struct netif *netif) -{ - if (netif->flags & NETIF_FLAG_UP) { - netif->flags &= ~NETIF_FLAG_UP; -#if LWIP_SNMP - snmp_get_sysuptime(&netif->ts); -#endif - -#if LWIP_ARP - if (netif->flags & NETIF_FLAG_ETHARP) { - etharp_cleanup_netif(netif); - } -#endif /* LWIP_ARP */ - NETIF_STATUS_CALLBACK(netif); - } -} - -#if LWIP_NETIF_STATUS_CALLBACK -/** - * Set callback to be called when interface is brought up/down - */ -void netif_set_status_callback(struct netif *netif, netif_status_callback_fn status_callback) -{ - if (netif) { - netif->status_callback = status_callback; - } -} -#endif /* LWIP_NETIF_STATUS_CALLBACK */ - -#if LWIP_NETIF_REMOVE_CALLBACK -/** - * Set callback to be called when the interface has been removed - */ -void -netif_set_remove_callback(struct netif *netif, netif_status_callback_fn remove_callback) -{ - if (netif) { - netif->remove_callback = remove_callback; - } -} -#endif /* LWIP_NETIF_REMOVE_CALLBACK */ - -/** - * Called by a driver when its link goes up - */ -void netif_set_link_up(struct netif *netif ) -{ - if (!(netif->flags & NETIF_FLAG_LINK_UP)) { - netif->flags |= NETIF_FLAG_LINK_UP; - -#if LWIP_DHCP - if (netif->dhcp) { - dhcp_network_changed(netif); - } -#endif /* LWIP_DHCP */ - -#if LWIP_AUTOIP - if (netif->autoip) { - autoip_network_changed(netif); - } -#endif /* LWIP_AUTOIP */ - - if (netif->flags & NETIF_FLAG_UP) { -#if LWIP_ARP - /* For Ethernet network interfaces, we would like to send a "gratuitous ARP" */ - if (netif->flags & NETIF_FLAG_ETHARP) { - etharp_gratuitous(netif); - } -#endif /* LWIP_ARP */ - -#if LWIP_IGMP - /* resend IGMP memberships */ - if (netif->flags & NETIF_FLAG_IGMP) { - igmp_report_groups( netif); - } -#endif /* LWIP_IGMP */ -#if LWIP_IPV6 && LWIP_IPV6_MLD - /* send mld memberships */ - mld6_report_groups( netif); -#endif /* LWIP_IPV6 && LWIP_IPV6_MLD */ - } - NETIF_LINK_CALLBACK(netif); - } -} - -/** - * Called by a driver when its link goes down - */ -void netif_set_link_down(struct netif *netif ) -{ - if (netif->flags & NETIF_FLAG_LINK_UP) { - netif->flags &= ~NETIF_FLAG_LINK_UP; - NETIF_LINK_CALLBACK(netif); - } -} - -#if LWIP_NETIF_LINK_CALLBACK -/** - * Set callback to be called when link is brought up/down - */ -void netif_set_link_callback(struct netif *netif, netif_status_callback_fn link_callback) -{ - if (netif) { - netif->link_callback = link_callback; - } -} -#endif /* LWIP_NETIF_LINK_CALLBACK */ - -#if ENABLE_LOOPBACK -/** - * Send an IP packet to be received on the same netif (loopif-like). - * The pbuf is simply copied and handed back to netif->input. - * In multithreaded mode, this is done directly since netif->input must put - * the packet on a queue. - * In callback mode, the packet is put on an internal queue and is fed to - * netif->input by netif_poll(). - * - * @param netif the lwip network interface structure - * @param p the (IP) packet to 'send' - * @param ipaddr the ip address to send the packet to (not used) - * @return ERR_OK if the packet has been sent - * ERR_MEM if the pbuf used to copy the packet couldn't be allocated - */ -err_t -netif_loop_output(struct netif *netif, struct pbuf *p, - ip_addr_t *ipaddr) -{ - struct pbuf *r; - err_t err; - struct pbuf *last; -#if LWIP_LOOPBACK_MAX_PBUFS - u8_t clen = 0; -#endif /* LWIP_LOOPBACK_MAX_PBUFS */ - /* If we have a loopif, SNMP counters are adjusted for it, - * if not they are adjusted for 'netif'. */ -#if LWIP_SNMP -#if LWIP_HAVE_LOOPIF - struct netif *stats_if = &loop_netif; -#else /* LWIP_HAVE_LOOPIF */ - struct netif *stats_if = netif; -#endif /* LWIP_HAVE_LOOPIF */ -#endif /* LWIP_SNMP */ - SYS_ARCH_DECL_PROTECT(lev); - LWIP_UNUSED_ARG(ipaddr); - - /* Allocate a new pbuf */ - r = pbuf_alloc(PBUF_LINK, p->tot_len, PBUF_RAM); - if (r == NULL) { - LINK_STATS_INC(link.memerr); - LINK_STATS_INC(link.drop); - snmp_inc_ifoutdiscards(stats_if); - return ERR_MEM; - } -#if LWIP_LOOPBACK_MAX_PBUFS - clen = pbuf_clen(r); - /* check for overflow or too many pbuf on queue */ - if(((netif->loop_cnt_current + clen) < netif->loop_cnt_current) || - ((netif->loop_cnt_current + clen) > LWIP_LOOPBACK_MAX_PBUFS)) { - pbuf_free(r); - LINK_STATS_INC(link.memerr); - LINK_STATS_INC(link.drop); - snmp_inc_ifoutdiscards(stats_if); - return ERR_MEM; - } - netif->loop_cnt_current += clen; -#endif /* LWIP_LOOPBACK_MAX_PBUFS */ - - /* Copy the whole pbuf queue p into the single pbuf r */ - if ((err = pbuf_copy(r, p)) != ERR_OK) { - pbuf_free(r); - LINK_STATS_INC(link.memerr); - LINK_STATS_INC(link.drop); - snmp_inc_ifoutdiscards(stats_if); - return err; - } - - /* Put the packet on a linked list which gets emptied through calling - netif_poll(). */ - - /* let last point to the last pbuf in chain r */ - for (last = r; last->next != NULL; last = last->next); - - SYS_ARCH_PROTECT(lev); - if(netif->loop_first != NULL) { - LWIP_ASSERT("if first != NULL, last must also be != NULL", netif->loop_last != NULL); - netif->loop_last->next = r; - netif->loop_last = last; - } else { - netif->loop_first = r; - netif->loop_last = last; - } - SYS_ARCH_UNPROTECT(lev); - - LINK_STATS_INC(link.xmit); - snmp_add_ifoutoctets(stats_if, p->tot_len); - snmp_inc_ifoutucastpkts(stats_if); - -#if LWIP_NETIF_LOOPBACK_MULTITHREADING - /* For multithreading environment, schedule a call to netif_poll */ - tcpip_callback((tcpip_callback_fn)netif_poll, netif); -#endif /* LWIP_NETIF_LOOPBACK_MULTITHREADING */ - - return ERR_OK; -} - -/** - * Call netif_poll() in the main loop of your application. This is to prevent - * reentering non-reentrant functions like tcp_input(). Packets passed to - * netif_loop_output() are put on a list that is passed to netif->input() by - * netif_poll(). - */ -void -netif_poll(struct netif *netif) -{ - struct pbuf *in; - /* If we have a loopif, SNMP counters are adjusted for it, - * if not they are adjusted for 'netif'. */ -#if LWIP_SNMP -#if LWIP_HAVE_LOOPIF - struct netif *stats_if = &loop_netif; -#else /* LWIP_HAVE_LOOPIF */ - struct netif *stats_if = netif; -#endif /* LWIP_HAVE_LOOPIF */ -#endif /* LWIP_SNMP */ - SYS_ARCH_DECL_PROTECT(lev); - - do { - /* Get a packet from the list. With SYS_LIGHTWEIGHT_PROT=1, this is protected */ - SYS_ARCH_PROTECT(lev); - in = netif->loop_first; - if (in != NULL) { - struct pbuf *in_end = in; -#if LWIP_LOOPBACK_MAX_PBUFS - u8_t clen = pbuf_clen(in); - /* adjust the number of pbufs on queue */ - LWIP_ASSERT("netif->loop_cnt_current underflow", - ((netif->loop_cnt_current - clen) < netif->loop_cnt_current)); - netif->loop_cnt_current -= clen; -#endif /* LWIP_LOOPBACK_MAX_PBUFS */ - while (in_end->len != in_end->tot_len) { - LWIP_ASSERT("bogus pbuf: len != tot_len but next == NULL!", in_end->next != NULL); - in_end = in_end->next; - } - /* 'in_end' now points to the last pbuf from 'in' */ - if (in_end == netif->loop_last) { - /* this was the last pbuf in the list */ - netif->loop_first = netif->loop_last = NULL; - } else { - /* pop the pbuf off the list */ - netif->loop_first = in_end->next; - LWIP_ASSERT("should not be null since first != last!", netif->loop_first != NULL); - } - /* De-queue the pbuf from its successors on the 'loop_' list. */ - in_end->next = NULL; - } - SYS_ARCH_UNPROTECT(lev); - - if (in != NULL) { - LINK_STATS_INC(link.recv); - snmp_add_ifinoctets(stats_if, in->tot_len); - snmp_inc_ifinucastpkts(stats_if); - /* loopback packets are always IP packets! */ - if (ip_input(in, netif) != ERR_OK) { - pbuf_free(in); - } - /* Don't reference the packet any more! */ - in = NULL; - } - /* go on while there is a packet on the list */ - } while (netif->loop_first != NULL); -} - -#if !LWIP_NETIF_LOOPBACK_MULTITHREADING -/** - * Calls netif_poll() for every netif on the netif_list. - */ -void -netif_poll_all(void) -{ - struct netif *netif = netif_list; - /* loop through netifs */ - while (netif != NULL) { - netif_poll(netif); - /* proceed to next network interface */ - netif = netif->next; - } -} -#endif /* !LWIP_NETIF_LOOPBACK_MULTITHREADING */ -#endif /* ENABLE_LOOPBACK */ - -#if LWIP_IPV6 -s8_t -netif_matches_ip6_addr(struct netif * netif, ip6_addr_t * ip6addr) -{ - s8_t i; - for (i = 0; i < LWIP_IPV6_NUM_ADDRESSES; i++) { - if (ip6_addr_cmp(netif_ip6_addr(netif, i), ip6addr)) { - return i; - } - } - return -1; -} - -void -netif_create_ip6_linklocal_address(struct netif * netif, u8_t from_mac_48bit) -{ - u8_t i, addr_index, min_len; - - /* Link-local prefix. */ - netif->ip6_addr[0].addr[0] = PP_HTONL(0xfe800000ul); - netif->ip6_addr[0].addr[1] = 0; - - /* Generate interface ID. */ - if (from_mac_48bit) { - /* Assume hwaddr is a 48-bit IEEE 802 MAC. Convert to EUI-64 address. Complement Group bit. */ - netif->ip6_addr[0].addr[2] = htonl((((u32_t)(netif->hwaddr[0] ^ 0x02)) << 24) | - ((u32_t)(netif->hwaddr[1]) << 16) | - ((u32_t)(netif->hwaddr[2]) << 8) | - (0xff)); - netif->ip6_addr[0].addr[3] = htonl((0xfeul << 24) | - ((u32_t)(netif->hwaddr[3]) << 16) | - ((u32_t)(netif->hwaddr[4]) << 8) | - (netif->hwaddr[5])); - } - else { - /* Use hwaddr directly as interface ID. */ - netif->ip6_addr[0].addr[2] = 0; - netif->ip6_addr[0].addr[3] = 0; - - min_len = netif->hwaddr_len < 8 ? netif->hwaddr_len : 8; - addr_index = 3; - for (i = 0; i < min_len; i++) { - if (i == 4) { - addr_index--; - } - netif->ip6_addr[0].addr[addr_index] |= ((u32_t)(netif->hwaddr[netif->hwaddr_len - i - 1])) << (8 * (i & 0x03)); - } - } - - /* Set address state. */ -#if LWIP_IPV6_DUP_DETECT_ATTEMPTS - /* Will perform duplicate address detection (DAD). */ - netif->ip6_addr_state[0] = IP6_ADDR_TENTATIVE; -#else - /* Consider address valid. */ - netif->ip6_addr_state[0] = IP6_ADDR_PREFERRED; -#endif /* LWIP_IPV6_AUTOCONFIG */ -} - -static err_t -netif_null_output_ip6(struct netif *netif, struct pbuf *p, ip6_addr_t *ipaddr) -{ - (void)netif; - (void)p; - (void)ipaddr; - - return ERR_IF; -} -#endif /* LWIP_IPV6 */ diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/core/pbuf.c b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/core/pbuf.c deleted file mode 100644 index 1e5e53b1..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/core/pbuf.c +++ /dev/null @@ -1,1179 +0,0 @@ -/** - * @file - * Packet buffer management - * - * Packets are built from the pbuf data structure. It supports dynamic - * memory allocation for packet contents or can reference externally - * managed packet contents both in RAM and ROM. Quick allocation for - * incoming packets is provided through pools with fixed sized pbufs. - * - * A packet may span over multiple pbufs, chained as a singly linked - * list. This is called a "pbuf chain". - * - * Multiple packets may be queued, also using this singly linked list. - * This is called a "packet queue". - * - * So, a packet queue consists of one or more pbuf chains, each of - * which consist of one or more pbufs. CURRENTLY, PACKET QUEUES ARE - * NOT SUPPORTED!!! Use helper structs to queue multiple packets. - * - * The differences between a pbuf chain and a packet queue are very - * precise but subtle. - * - * The last pbuf of a packet has a ->tot_len field that equals the - * ->len field. It can be found by traversing the list. If the last - * pbuf of a packet has a ->next field other than NULL, more packets - * are on the queue. - * - * Therefore, looping through a pbuf of a single packet, has an - * loop end condition (tot_len == p->len), NOT (next == NULL). - */ - -/* - * Copyright (c) 2001-2004 Swedish Institute of Computer Science. - * 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. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT - * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING - * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY - * OF SUCH DAMAGE. - * - * This file is part of the lwIP TCP/IP stack. - * - * Author: Adam Dunkels - * - */ - -#include "lwip/opt.h" - -#include "lwip/stats.h" -#include "lwip/def.h" -#include "lwip/mem.h" -#include "lwip/memp.h" -#include "lwip/pbuf.h" -#include "lwip/sys.h" -#include "arch/perf.h" -#if LWIP_TCP && TCP_QUEUE_OOSEQ -#include "lwip/tcp_impl.h" -#endif -#if LWIP_CHECKSUM_ON_COPY -#include "lwip/inet_chksum.h" -#endif - -#include - -#define SIZEOF_STRUCT_PBUF LWIP_MEM_ALIGN_SIZE(sizeof(struct pbuf)) -/* Since the pool is created in memp, PBUF_POOL_BUFSIZE will be automatically - aligned there. Therefore, PBUF_POOL_BUFSIZE_ALIGNED can be used here. */ -#define PBUF_POOL_BUFSIZE_ALIGNED LWIP_MEM_ALIGN_SIZE(PBUF_POOL_BUFSIZE) - -#if !LWIP_TCP || !TCP_QUEUE_OOSEQ || !PBUF_POOL_FREE_OOSEQ -#define PBUF_POOL_IS_EMPTY() -#else /* !LWIP_TCP || !TCP_QUEUE_OOSEQ || !PBUF_POOL_FREE_OOSEQ */ - -#if !NO_SYS -#ifndef PBUF_POOL_FREE_OOSEQ_QUEUE_CALL -#include "lwip/tcpip.h" -#define PBUF_POOL_FREE_OOSEQ_QUEUE_CALL() do { \ - if(tcpip_callback_with_block(pbuf_free_ooseq_callback, NULL, 0) != ERR_OK) { \ - SYS_ARCH_PROTECT(old_level); \ - pbuf_free_ooseq_pending = 0; \ - SYS_ARCH_UNPROTECT(old_level); \ - } } while(0) -#endif /* PBUF_POOL_FREE_OOSEQ_QUEUE_CALL */ -#endif /* !NO_SYS */ - -volatile u8_t pbuf_free_ooseq_pending; -#define PBUF_POOL_IS_EMPTY() pbuf_pool_is_empty() - -/** - * Attempt to reclaim some memory from queued out-of-sequence TCP segments - * if we run out of pool pbufs. It's better to give priority to new packets - * if we're running out. - * - * This must be done in the correct thread context therefore this function - * can only be used with NO_SYS=0 and through tcpip_callback. - */ -#if !NO_SYS -static -#endif /* !NO_SYS */ -void -pbuf_free_ooseq(void) -{ - struct tcp_pcb* pcb; - SYS_ARCH_DECL_PROTECT(old_level); - - SYS_ARCH_PROTECT(old_level); - pbuf_free_ooseq_pending = 0; - SYS_ARCH_UNPROTECT(old_level); - - for (pcb = tcp_active_pcbs; NULL != pcb; pcb = pcb->next) { - if (NULL != pcb->ooseq) { - /** Free the ooseq pbufs of one PCB only */ - LWIP_DEBUGF(PBUF_DEBUG | LWIP_DBG_TRACE, ("pbuf_free_ooseq: freeing out-of-sequence pbufs\n")); - tcp_segs_free(pcb->ooseq); - pcb->ooseq = NULL; - return; - } - } -} - -#if !NO_SYS -/** - * Just a callback function for tcpip_timeout() that calls pbuf_free_ooseq(). - */ -static void -pbuf_free_ooseq_callback(void *arg) -{ - LWIP_UNUSED_ARG(arg); - pbuf_free_ooseq(); -} -#endif /* !NO_SYS */ - -/** Queue a call to pbuf_free_ooseq if not already queued. */ -static void -pbuf_pool_is_empty(void) -{ -#ifndef PBUF_POOL_FREE_OOSEQ_QUEUE_CALL - SYS_ARCH_DECL_PROTECT(old_level); - SYS_ARCH_PROTECT(old_level); - pbuf_free_ooseq_pending = 1; - SYS_ARCH_UNPROTECT(old_level); -#else /* PBUF_POOL_FREE_OOSEQ_QUEUE_CALL */ - u8_t queued; - SYS_ARCH_DECL_PROTECT(old_level); - SYS_ARCH_PROTECT(old_level); - queued = pbuf_free_ooseq_pending; - pbuf_free_ooseq_pending = 1; - SYS_ARCH_UNPROTECT(old_level); - - if(!queued) { - /* queue a call to pbuf_free_ooseq if not already queued */ - PBUF_POOL_FREE_OOSEQ_QUEUE_CALL(); - } -#endif /* PBUF_POOL_FREE_OOSEQ_QUEUE_CALL */ -} -#endif /* !LWIP_TCP || !TCP_QUEUE_OOSEQ || !PBUF_POOL_FREE_OOSEQ */ - -/** - * Allocates a pbuf of the given type (possibly a chain for PBUF_POOL type). - * - * The actual memory allocated for the pbuf is determined by the - * layer at which the pbuf is allocated and the requested size - * (from the size parameter). - * - * @param layer flag to define header size - * @param length size of the pbuf's payload - * @param type this parameter decides how and where the pbuf - * should be allocated as follows: - * - * - PBUF_RAM: buffer memory for pbuf is allocated as one large - * chunk. This includes protocol headers as well. - * - PBUF_ROM: no buffer memory is allocated for the pbuf, even for - * protocol headers. Additional headers must be prepended - * by allocating another pbuf and chain in to the front of - * the ROM pbuf. It is assumed that the memory used is really - * similar to ROM in that it is immutable and will not be - * changed. Memory which is dynamic should generally not - * be attached to PBUF_ROM pbufs. Use PBUF_REF instead. - * - PBUF_REF: no buffer memory is allocated for the pbuf, even for - * protocol headers. It is assumed that the pbuf is only - * being used in a single thread. If the pbuf gets queued, - * then pbuf_take should be called to copy the buffer. - * - PBUF_POOL: the pbuf is allocated as a pbuf chain, with pbufs from - * the pbuf pool that is allocated during pbuf_init(). - * - * @return the allocated pbuf. If multiple pbufs where allocated, this - * is the first pbuf of a pbuf chain. - */ -struct pbuf * -pbuf_alloc(pbuf_layer layer, u16_t length, pbuf_type type) -{ - struct pbuf *p, *q, *r; - u16_t offset; - s32_t rem_len; /* remaining length */ - LWIP_DEBUGF(PBUF_DEBUG | LWIP_DBG_TRACE, ("pbuf_alloc(length=%"U16_F")\n", length)); - - /* determine header offset */ - switch (layer) { - case PBUF_TRANSPORT: - /* add room for transport (often TCP) layer header */ - offset = PBUF_LINK_HLEN + PBUF_IP_HLEN + PBUF_TRANSPORT_HLEN; - break; - case PBUF_IP: - /* add room for IP layer header */ - offset = PBUF_LINK_HLEN + PBUF_IP_HLEN; - break; - case PBUF_LINK: - /* add room for link layer header */ - offset = PBUF_LINK_HLEN; - break; - case PBUF_RAW: - offset = 0; - break; - default: - LWIP_ASSERT("pbuf_alloc: bad pbuf layer", 0); - return NULL; - } - - switch (type) { - case PBUF_POOL: - /* allocate head of pbuf chain into p */ - p = (struct pbuf *)memp_malloc(MEMP_PBUF_POOL); - LWIP_DEBUGF(PBUF_DEBUG | LWIP_DBG_TRACE, ("pbuf_alloc: allocated pbuf %p\n", (void *)p)); - if (p == NULL) { - PBUF_POOL_IS_EMPTY(); - return NULL; - } - p->type = type; - p->next = NULL; - - /* make the payload pointer point 'offset' bytes into pbuf data memory */ - p->payload = LWIP_MEM_ALIGN((void *)((u8_t *)p + (SIZEOF_STRUCT_PBUF + offset))); - LWIP_ASSERT("pbuf_alloc: pbuf p->payload properly aligned", - ((mem_ptr_t)p->payload % MEM_ALIGNMENT) == 0); - /* the total length of the pbuf chain is the requested size */ - p->tot_len = length; - /* set the length of the first pbuf in the chain */ - p->len = LWIP_MIN(length, PBUF_POOL_BUFSIZE_ALIGNED - LWIP_MEM_ALIGN_SIZE(offset)); - LWIP_ASSERT("check p->payload + p->len does not overflow pbuf", - ((u8_t*)p->payload + p->len <= - (u8_t*)p + SIZEOF_STRUCT_PBUF + PBUF_POOL_BUFSIZE_ALIGNED)); - LWIP_ASSERT("PBUF_POOL_BUFSIZE must be bigger than MEM_ALIGNMENT", - (PBUF_POOL_BUFSIZE_ALIGNED - LWIP_MEM_ALIGN_SIZE(offset)) > 0 ); - /* set reference count (needed here in case we fail) */ - p->ref = 1; - - /* now allocate the tail of the pbuf chain */ - - /* remember first pbuf for linkage in next iteration */ - r = p; - /* remaining length to be allocated */ - rem_len = length - p->len; - /* any remaining pbufs to be allocated? */ - while (rem_len > 0) { - q = (struct pbuf *)memp_malloc(MEMP_PBUF_POOL); - if (q == NULL) { - PBUF_POOL_IS_EMPTY(); - /* free chain so far allocated */ - pbuf_free(p); - /* bail out unsuccesfully */ - return NULL; - } - q->type = type; - q->flags = 0; - q->next = NULL; - /* make previous pbuf point to this pbuf */ - r->next = q; - /* set total length of this pbuf and next in chain */ - LWIP_ASSERT("rem_len < max_u16_t", rem_len < 0xffff); - q->tot_len = (u16_t)rem_len; - /* this pbuf length is pool size, unless smaller sized tail */ - q->len = LWIP_MIN((u16_t)rem_len, PBUF_POOL_BUFSIZE_ALIGNED); - q->payload = (void *)((u8_t *)q + SIZEOF_STRUCT_PBUF); - LWIP_ASSERT("pbuf_alloc: pbuf q->payload properly aligned", - ((mem_ptr_t)q->payload % MEM_ALIGNMENT) == 0); - LWIP_ASSERT("check p->payload + p->len does not overflow pbuf", - ((u8_t*)p->payload + p->len <= - (u8_t*)p + SIZEOF_STRUCT_PBUF + PBUF_POOL_BUFSIZE_ALIGNED)); - q->ref = 1; - /* calculate remaining length to be allocated */ - rem_len -= q->len; - /* remember this pbuf for linkage in next iteration */ - r = q; - } - /* end of chain */ - /*r->next = NULL;*/ - - break; - case PBUF_RAM: - /* If pbuf is to be allocated in RAM, allocate memory for it. */ - p = (struct pbuf*)mem_malloc(LWIP_MEM_ALIGN_SIZE(SIZEOF_STRUCT_PBUF + offset) + LWIP_MEM_ALIGN_SIZE(length)); - if (p == NULL) { - return NULL; - } - /* Set up internal structure of the pbuf. */ - p->payload = LWIP_MEM_ALIGN((void *)((u8_t *)p + SIZEOF_STRUCT_PBUF + offset)); - p->len = p->tot_len = length; - p->next = NULL; - p->type = type; - - LWIP_ASSERT("pbuf_alloc: pbuf->payload properly aligned", - ((mem_ptr_t)p->payload % MEM_ALIGNMENT) == 0); - break; - /* pbuf references existing (non-volatile static constant) ROM payload? */ - case PBUF_ROM: - /* pbuf references existing (externally allocated) RAM payload? */ - case PBUF_REF: - /* only allocate memory for the pbuf structure */ - p = (struct pbuf *)memp_malloc(MEMP_PBUF); - if (p == NULL) { - LWIP_DEBUGF(PBUF_DEBUG | LWIP_DBG_LEVEL_SERIOUS, - ("pbuf_alloc: Could not allocate MEMP_PBUF for PBUF_%s.\n", - (type == PBUF_ROM) ? "ROM" : "REF")); - return NULL; - } - /* caller must set this field properly, afterwards */ - p->payload = NULL; - p->len = p->tot_len = length; - p->next = NULL; - p->type = type; - break; - default: - LWIP_ASSERT("pbuf_alloc: erroneous type", 0); - return NULL; - } - /* set reference count */ - p->ref = 1; - /* set flags */ - p->flags = 0; - LWIP_DEBUGF(PBUF_DEBUG | LWIP_DBG_TRACE, ("pbuf_alloc(length=%"U16_F") == %p\n", length, (void *)p)); - return p; -} - -#if LWIP_SUPPORT_CUSTOM_PBUF -/** Initialize a custom pbuf (already allocated). - * - * @param layer flag to define header size - * @param length size of the pbuf's payload - * @param type type of the pbuf (only used to treat the pbuf accordingly, as - * this function allocates no memory) - * @param p pointer to the custom pbuf to initialize (already allocated) - * @param payload_mem pointer to the buffer that is used for payload and headers, - * must be at least big enough to hold 'length' plus the header size, - * may be NULL if set later. - * ATTENTION: The caller is responsible for correct alignment of this buffer!! - * @param payload_mem_len the size of the 'payload_mem' buffer, must be at least - * big enough to hold 'length' plus the header size - */ -struct pbuf* -pbuf_alloced_custom(pbuf_layer l, u16_t length, pbuf_type type, struct pbuf_custom *p, - void *payload_mem, u16_t payload_mem_len) -{ - u16_t offset; - LWIP_DEBUGF(PBUF_DEBUG | LWIP_DBG_TRACE, ("pbuf_alloced_custom(length=%"U16_F")\n", length)); - - /* determine header offset */ - switch (l) { - case PBUF_TRANSPORT: - /* add room for transport (often TCP) layer header */ - offset = PBUF_LINK_HLEN + PBUF_IP_HLEN + PBUF_TRANSPORT_HLEN; - break; - case PBUF_IP: - /* add room for IP layer header */ - offset = PBUF_LINK_HLEN + PBUF_IP_HLEN; - break; - case PBUF_LINK: - /* add room for link layer header */ - offset = PBUF_LINK_HLEN; - break; - case PBUF_RAW: - offset = 0; - break; - default: - LWIP_ASSERT("pbuf_alloced_custom: bad pbuf layer", 0); - return NULL; - } - - if (LWIP_MEM_ALIGN_SIZE(offset) + length > payload_mem_len) { - LWIP_DEBUGF(PBUF_DEBUG | LWIP_DBG_LEVEL_WARNING, ("pbuf_alloced_custom(length=%"U16_F") buffer too short\n", length)); - return NULL; - } - - p->pbuf.next = NULL; - if (payload_mem != NULL) { - p->pbuf.payload = (u8_t *)payload_mem + LWIP_MEM_ALIGN_SIZE(offset); - } else { - p->pbuf.payload = NULL; - } - p->pbuf.flags = PBUF_FLAG_IS_CUSTOM; - p->pbuf.len = p->pbuf.tot_len = length; - p->pbuf.type = type; - p->pbuf.ref = 1; - return &p->pbuf; -} -#endif /* LWIP_SUPPORT_CUSTOM_PBUF */ - -/** - * Shrink a pbuf chain to a desired length. - * - * @param p pbuf to shrink. - * @param new_len desired new length of pbuf chain - * - * Depending on the desired length, the first few pbufs in a chain might - * be skipped and left unchanged. The new last pbuf in the chain will be - * resized, and any remaining pbufs will be freed. - * - * @note If the pbuf is ROM/REF, only the ->tot_len and ->len fields are adjusted. - * @note May not be called on a packet queue. - * - * @note Despite its name, pbuf_realloc cannot grow the size of a pbuf (chain). - */ -void -pbuf_realloc(struct pbuf *p, u16_t new_len) -{ - struct pbuf *q; - u16_t rem_len; /* remaining length */ - s32_t grow; - - LWIP_ASSERT("pbuf_realloc: p != NULL", p != NULL); - LWIP_ASSERT("pbuf_realloc: sane p->type", p->type == PBUF_POOL || - p->type == PBUF_ROM || - p->type == PBUF_RAM || - p->type == PBUF_REF); - - /* desired length larger than current length? */ - if (new_len >= p->tot_len) { - /* enlarging not yet supported */ - return; - } - - /* the pbuf chain grows by (new_len - p->tot_len) bytes - * (which may be negative in case of shrinking) */ - grow = new_len - p->tot_len; - - /* first, step over any pbufs that should remain in the chain */ - rem_len = new_len; - q = p; - /* should this pbuf be kept? */ - while (rem_len > q->len) { - /* decrease remaining length by pbuf length */ - rem_len -= q->len; - /* decrease total length indicator */ - LWIP_ASSERT("grow < max_u16_t", grow < 0xffff); - q->tot_len += (u16_t)grow; - /* proceed to next pbuf in chain */ - q = q->next; - LWIP_ASSERT("pbuf_realloc: q != NULL", q != NULL); - } - /* we have now reached the new last pbuf (in q) */ - /* rem_len == desired length for pbuf q */ - - /* shrink allocated memory for PBUF_RAM */ - /* (other types merely adjust their length fields */ - if ((q->type == PBUF_RAM) && (rem_len != q->len)) { - /* reallocate and adjust the length of the pbuf that will be split */ - q = (struct pbuf *)mem_trim(q, (u16_t)((u8_t *)q->payload - (u8_t *)q) + rem_len); - LWIP_ASSERT("mem_trim returned q == NULL", q != NULL); - } - /* adjust length fields for new last pbuf */ - q->len = rem_len; - q->tot_len = q->len; - - /* any remaining pbufs in chain? */ - if (q->next != NULL) { - /* free remaining pbufs in chain */ - pbuf_free(q->next); - } - /* q is last packet in chain */ - q->next = NULL; - -} - -/** - * Adjusts the payload pointer to hide or reveal headers in the payload. - * - * Adjusts the ->payload pointer so that space for a header - * (dis)appears in the pbuf payload. - * - * The ->payload, ->tot_len and ->len fields are adjusted. - * - * @param p pbuf to change the header size. - * @param header_size_increment Number of bytes to increment header size which - * increases the size of the pbuf. New space is on the front. - * (Using a negative value decreases the header size.) - * If hdr_size_inc is 0, this function does nothing and returns succesful. - * - * PBUF_ROM and PBUF_REF type buffers cannot have their sizes increased, so - * the call will fail. A check is made that the increase in header size does - * not move the payload pointer in front of the start of the buffer. - * @return non-zero on failure, zero on success. - * - */ -u8_t -pbuf_header(struct pbuf *p, s16_t header_size_increment) -{ - u16_t type; - void *payload; - u16_t increment_magnitude; - - LWIP_ASSERT("p != NULL", p != NULL); - if ((header_size_increment == 0) || (p == NULL)) { - return 0; - } - - if (header_size_increment < 0){ - increment_magnitude = -header_size_increment; - /* Check that we aren't going to move off the end of the pbuf */ - LWIP_ERROR("increment_magnitude <= p->len", (increment_magnitude <= p->len), return 1;); - } else { - increment_magnitude = header_size_increment; -#if 0 - /* Can't assert these as some callers speculatively call - pbuf_header() to see if it's OK. Will return 1 below instead. */ - /* Check that we've got the correct type of pbuf to work with */ - LWIP_ASSERT("p->type == PBUF_RAM || p->type == PBUF_POOL", - p->type == PBUF_RAM || p->type == PBUF_POOL); - /* Check that we aren't going to move off the beginning of the pbuf */ - LWIP_ASSERT("p->payload - increment_magnitude >= p + SIZEOF_STRUCT_PBUF", - (u8_t *)p->payload - increment_magnitude >= (u8_t *)p + SIZEOF_STRUCT_PBUF); -#endif - } - - type = p->type; - /* remember current payload pointer */ - payload = p->payload; - - /* pbuf types containing payloads? */ - if (type == PBUF_RAM || type == PBUF_POOL) { - /* set new payload pointer */ - p->payload = (u8_t *)p->payload - header_size_increment; - /* boundary check fails? */ - if ((u8_t *)p->payload < (u8_t *)p + SIZEOF_STRUCT_PBUF) { - LWIP_DEBUGF( PBUF_DEBUG | LWIP_DBG_LEVEL_SERIOUS, - ("pbuf_header: failed as %p < %p (not enough space for new header size)\n", - (void *)p->payload, (void *)(p + 1))); - /* restore old payload pointer */ - p->payload = payload; - /* bail out unsuccesfully */ - return 1; - } - /* pbuf types refering to external payloads? */ - } else if (type == PBUF_REF || type == PBUF_ROM) { - /* hide a header in the payload? */ - if ((header_size_increment < 0) && (increment_magnitude <= p->len)) { - /* increase payload pointer */ - p->payload = (u8_t *)p->payload - header_size_increment; - } else { - /* cannot expand payload to front (yet!) - * bail out unsuccesfully */ - return 1; - } - } else { - /* Unknown type */ - LWIP_ASSERT("bad pbuf type", 0); - return 1; - } - /* modify pbuf length fields */ - p->len += header_size_increment; - p->tot_len += header_size_increment; - - LWIP_DEBUGF(PBUF_DEBUG | LWIP_DBG_TRACE, ("pbuf_header: old %p new %p (%"S16_F")\n", - (void *)payload, (void *)p->payload, header_size_increment)); - - return 0; -} - -/** - * Dereference a pbuf chain or queue and deallocate any no-longer-used - * pbufs at the head of this chain or queue. - * - * Decrements the pbuf reference count. If it reaches zero, the pbuf is - * deallocated. - * - * For a pbuf chain, this is repeated for each pbuf in the chain, - * up to the first pbuf which has a non-zero reference count after - * decrementing. So, when all reference counts are one, the whole - * chain is free'd. - * - * @param p The pbuf (chain) to be dereferenced. - * - * @return the number of pbufs that were de-allocated - * from the head of the chain. - * - * @note MUST NOT be called on a packet queue (Not verified to work yet). - * @note the reference counter of a pbuf equals the number of pointers - * that refer to the pbuf (or into the pbuf). - * - * @internal examples: - * - * Assuming existing chains a->b->c with the following reference - * counts, calling pbuf_free(a) results in: - * - * 1->2->3 becomes ...1->3 - * 3->3->3 becomes 2->3->3 - * 1->1->2 becomes ......1 - * 2->1->1 becomes 1->1->1 - * 1->1->1 becomes ....... - * - */ -u8_t -pbuf_free(struct pbuf *p) -{ - u16_t type; - struct pbuf *q; - u8_t count; - - if (p == NULL) { - LWIP_ASSERT("p != NULL", p != NULL); - /* if assertions are disabled, proceed with debug output */ - LWIP_DEBUGF(PBUF_DEBUG | LWIP_DBG_LEVEL_SERIOUS, - ("pbuf_free(p == NULL) was called.\n")); - return 0; - } - LWIP_DEBUGF(PBUF_DEBUG | LWIP_DBG_TRACE, ("pbuf_free(%p)\n", (void *)p)); - - PERF_START; - - LWIP_ASSERT("pbuf_free: sane type", - p->type == PBUF_RAM || p->type == PBUF_ROM || - p->type == PBUF_REF || p->type == PBUF_POOL); - - count = 0; - /* de-allocate all consecutive pbufs from the head of the chain that - * obtain a zero reference count after decrementing*/ - while (p != NULL) { - u16_t ref; - SYS_ARCH_DECL_PROTECT(old_level); - /* Since decrementing ref cannot be guaranteed to be a single machine operation - * we must protect it. We put the new ref into a local variable to prevent - * further protection. */ - SYS_ARCH_PROTECT(old_level); - /* all pbufs in a chain are referenced at least once */ - LWIP_ASSERT("pbuf_free: p->ref > 0", p->ref > 0); - /* decrease reference count (number of pointers to pbuf) */ - ref = --(p->ref); - SYS_ARCH_UNPROTECT(old_level); - /* this pbuf is no longer referenced to? */ - if (ref == 0) { - /* remember next pbuf in chain for next iteration */ - q = p->next; - LWIP_DEBUGF( PBUF_DEBUG | LWIP_DBG_TRACE, ("pbuf_free: deallocating %p\n", (void *)p)); - type = p->type; -#if LWIP_SUPPORT_CUSTOM_PBUF - /* is this a custom pbuf? */ - if ((p->flags & PBUF_FLAG_IS_CUSTOM) != 0) { - struct pbuf_custom *pc = (struct pbuf_custom*)p; - LWIP_ASSERT("pc->custom_free_function != NULL", pc->custom_free_function != NULL); - pc->custom_free_function(p); - } else -#endif /* LWIP_SUPPORT_CUSTOM_PBUF */ - { - /* is this a pbuf from the pool? */ - if (type == PBUF_POOL) { - memp_free(MEMP_PBUF_POOL, p); - /* is this a ROM or RAM referencing pbuf? */ - } else if (type == PBUF_ROM || type == PBUF_REF) { - memp_free(MEMP_PBUF, p); - /* type == PBUF_RAM */ - } else { - mem_free(p); - } - } - count++; - /* proceed to next pbuf */ - p = q; - /* p->ref > 0, this pbuf is still referenced to */ - /* (and so the remaining pbufs in chain as well) */ - } else { - LWIP_DEBUGF( PBUF_DEBUG | LWIP_DBG_TRACE, ("pbuf_free: %p has ref %"U16_F", ending here.\n", (void *)p, ref)); - /* stop walking through the chain */ - p = NULL; - } - } - PERF_STOP("pbuf_free"); - /* return number of de-allocated pbufs */ - return count; -} - -/** - * Count number of pbufs in a chain - * - * @param p first pbuf of chain - * @return the number of pbufs in a chain - */ - -u8_t -pbuf_clen(struct pbuf *p) -{ - u8_t len; - - len = 0; - while (p != NULL) { - ++len; - p = p->next; - } - return len; -} - -/** - * Increment the reference count of the pbuf. - * - * @param p pbuf to increase reference counter of - * - */ -void -pbuf_ref(struct pbuf *p) -{ - SYS_ARCH_DECL_PROTECT(old_level); - /* pbuf given? */ - if (p != NULL) { - SYS_ARCH_PROTECT(old_level); - ++(p->ref); - SYS_ARCH_UNPROTECT(old_level); - } -} - -/** - * Concatenate two pbufs (each may be a pbuf chain) and take over - * the caller's reference of the tail pbuf. - * - * @note The caller MAY NOT reference the tail pbuf afterwards. - * Use pbuf_chain() for that purpose. - * - * @see pbuf_chain() - */ - -void -pbuf_cat(struct pbuf *h, struct pbuf *t) -{ - struct pbuf *p; - - LWIP_ERROR("(h != NULL) && (t != NULL) (programmer violates API)", - ((h != NULL) && (t != NULL)), return;); - - /* proceed to last pbuf of chain */ - for (p = h; p->next != NULL; p = p->next) { - /* add total length of second chain to all totals of first chain */ - p->tot_len += t->tot_len; - } - /* { p is last pbuf of first h chain, p->next == NULL } */ - LWIP_ASSERT("p->tot_len == p->len (of last pbuf in chain)", p->tot_len == p->len); - LWIP_ASSERT("p->next == NULL", p->next == NULL); - /* add total length of second chain to last pbuf total of first chain */ - p->tot_len += t->tot_len; - /* chain last pbuf of head (p) with first of tail (t) */ - p->next = t; - /* p->next now references t, but the caller will drop its reference to t, - * so netto there is no change to the reference count of t. - */ -} - -/** - * Chain two pbufs (or pbuf chains) together. - * - * The caller MUST call pbuf_free(t) once it has stopped - * using it. Use pbuf_cat() instead if you no longer use t. - * - * @param h head pbuf (chain) - * @param t tail pbuf (chain) - * @note The pbufs MUST belong to the same packet. - * @note MAY NOT be called on a packet queue. - * - * The ->tot_len fields of all pbufs of the head chain are adjusted. - * The ->next field of the last pbuf of the head chain is adjusted. - * The ->ref field of the first pbuf of the tail chain is adjusted. - * - */ -void -pbuf_chain(struct pbuf *h, struct pbuf *t) -{ - pbuf_cat(h, t); - /* t is now referenced by h */ - pbuf_ref(t); - LWIP_DEBUGF(PBUF_DEBUG | LWIP_DBG_TRACE, ("pbuf_chain: %p references %p\n", (void *)h, (void *)t)); -} - -/** - * Dechains the first pbuf from its succeeding pbufs in the chain. - * - * Makes p->tot_len field equal to p->len. - * @param p pbuf to dechain - * @return remainder of the pbuf chain, or NULL if it was de-allocated. - * @note May not be called on a packet queue. - */ -struct pbuf * -pbuf_dechain(struct pbuf *p) -{ - struct pbuf *q; - u8_t tail_gone = 1; - /* tail */ - q = p->next; - /* pbuf has successor in chain? */ - if (q != NULL) { - /* assert tot_len invariant: (p->tot_len == p->len + (p->next? p->next->tot_len: 0) */ - LWIP_ASSERT("p->tot_len == p->len + q->tot_len", q->tot_len == p->tot_len - p->len); - /* enforce invariant if assertion is disabled */ - q->tot_len = p->tot_len - p->len; - /* decouple pbuf from remainder */ - p->next = NULL; - /* total length of pbuf p is its own length only */ - p->tot_len = p->len; - /* q is no longer referenced by p, free it */ - LWIP_DEBUGF(PBUF_DEBUG | LWIP_DBG_TRACE, ("pbuf_dechain: unreferencing %p\n", (void *)q)); - tail_gone = pbuf_free(q); - if (tail_gone > 0) { - LWIP_DEBUGF(PBUF_DEBUG | LWIP_DBG_TRACE, - ("pbuf_dechain: deallocated %p (as it is no longer referenced)\n", (void *)q)); - } - /* return remaining tail or NULL if deallocated */ - } - /* assert tot_len invariant: (p->tot_len == p->len + (p->next? p->next->tot_len: 0) */ - LWIP_ASSERT("p->tot_len == p->len", p->tot_len == p->len); - return ((tail_gone > 0) ? NULL : q); -} - -/** - * - * Create PBUF_RAM copies of pbufs. - * - * Used to queue packets on behalf of the lwIP stack, such as - * ARP based queueing. - * - * @note You MUST explicitly use p = pbuf_take(p); - * - * @note Only one packet is copied, no packet queue! - * - * @param p_to pbuf destination of the copy - * @param p_from pbuf source of the copy - * - * @return ERR_OK if pbuf was copied - * ERR_ARG if one of the pbufs is NULL or p_to is not big - * enough to hold p_from - */ -err_t -pbuf_copy(struct pbuf *p_to, struct pbuf *p_from) -{ - u16_t offset_to=0, offset_from=0, len; - - LWIP_DEBUGF(PBUF_DEBUG | LWIP_DBG_TRACE, ("pbuf_copy(%p, %p)\n", - (void*)p_to, (void*)p_from)); - - /* is the target big enough to hold the source? */ - LWIP_ERROR("pbuf_copy: target not big enough to hold source", ((p_to != NULL) && - (p_from != NULL) && (p_to->tot_len >= p_from->tot_len)), return ERR_ARG;); - - /* iterate through pbuf chain */ - do - { - /* copy one part of the original chain */ - if ((p_to->len - offset_to) >= (p_from->len - offset_from)) { - /* complete current p_from fits into current p_to */ - len = p_from->len - offset_from; - } else { - /* current p_from does not fit into current p_to */ - len = p_to->len - offset_to; - } - MEMCPY((u8_t*)p_to->payload + offset_to, (u8_t*)p_from->payload + offset_from, len); - offset_to += len; - offset_from += len; - LWIP_ASSERT("offset_to <= p_to->len", offset_to <= p_to->len); - LWIP_ASSERT("offset_from <= p_from->len", offset_from <= p_from->len); - if (offset_from >= p_from->len) { - /* on to next p_from (if any) */ - offset_from = 0; - p_from = p_from->next; - } - if (offset_to == p_to->len) { - /* on to next p_to (if any) */ - offset_to = 0; - p_to = p_to->next; - LWIP_ERROR("p_to != NULL", (p_to != NULL) || (p_from == NULL) , return ERR_ARG;); - } - - if((p_from != NULL) && (p_from->len == p_from->tot_len)) { - /* don't copy more than one packet! */ - LWIP_ERROR("pbuf_copy() does not allow packet queues!\n", - (p_from->next == NULL), return ERR_VAL;); - } - if((p_to != NULL) && (p_to->len == p_to->tot_len)) { - /* don't copy more than one packet! */ - LWIP_ERROR("pbuf_copy() does not allow packet queues!\n", - (p_to->next == NULL), return ERR_VAL;); - } - } while (p_from); - LWIP_DEBUGF(PBUF_DEBUG | LWIP_DBG_TRACE, ("pbuf_copy: end of chain reached.\n")); - return ERR_OK; -} - -/** - * Copy (part of) the contents of a packet buffer - * to an application supplied buffer. - * - * @param buf the pbuf from which to copy data - * @param dataptr the application supplied buffer - * @param len length of data to copy (dataptr must be big enough). No more - * than buf->tot_len will be copied, irrespective of len - * @param offset offset into the packet buffer from where to begin copying len bytes - * @return the number of bytes copied, or 0 on failure - */ -u16_t -pbuf_copy_partial(struct pbuf *buf, void *dataptr, u16_t len, u16_t offset) -{ - struct pbuf *p; - u16_t left; - u16_t buf_copy_len; - u16_t copied_total = 0; - - LWIP_ERROR("pbuf_copy_partial: invalid buf", (buf != NULL), return 0;); - LWIP_ERROR("pbuf_copy_partial: invalid dataptr", (dataptr != NULL), return 0;); - - left = 0; - - if((buf == NULL) || (dataptr == NULL)) { - return 0; - } - - /* Note some systems use byte copy if dataptr or one of the pbuf payload pointers are unaligned. */ - for(p = buf; len != 0 && p != NULL; p = p->next) { - if ((offset != 0) && (offset >= p->len)) { - /* don't copy from this buffer -> on to the next */ - offset -= p->len; - } else { - /* copy from this buffer. maybe only partially. */ - buf_copy_len = p->len - offset; - if (buf_copy_len > len) - buf_copy_len = len; - /* copy the necessary parts of the buffer */ - MEMCPY(&((char*)dataptr)[left], &((char*)p->payload)[offset], buf_copy_len); - copied_total += buf_copy_len; - left += buf_copy_len; - len -= buf_copy_len; - offset = 0; - } - } - return copied_total; -} - -/** - * Copy application supplied data into a pbuf. - * This function can only be used to copy the equivalent of buf->tot_len data. - * - * @param buf pbuf to fill with data - * @param dataptr application supplied data buffer - * @param len length of the application supplied data buffer - * - * @return ERR_OK if successful, ERR_MEM if the pbuf is not big enough - */ -err_t -pbuf_take(struct pbuf *buf, const void *dataptr, u16_t len) -{ - struct pbuf *p; - u16_t buf_copy_len; - u16_t total_copy_len = len; - u16_t copied_total = 0; - - LWIP_ERROR("pbuf_take: invalid buf", (buf != NULL), return 0;); - LWIP_ERROR("pbuf_take: invalid dataptr", (dataptr != NULL), return 0;); - - if ((buf == NULL) || (dataptr == NULL) || (buf->tot_len < len)) { - return ERR_ARG; - } - - /* Note some systems use byte copy if dataptr or one of the pbuf payload pointers are unaligned. */ - for(p = buf; total_copy_len != 0; p = p->next) { - LWIP_ASSERT("pbuf_take: invalid pbuf", p != NULL); - buf_copy_len = total_copy_len; - if (buf_copy_len > p->len) { - /* this pbuf cannot hold all remaining data */ - buf_copy_len = p->len; - } - /* copy the necessary parts of the buffer */ - MEMCPY(p->payload, &((char*)dataptr)[copied_total], buf_copy_len); - total_copy_len -= buf_copy_len; - copied_total += buf_copy_len; - } - LWIP_ASSERT("did not copy all data", total_copy_len == 0 && copied_total == len); - return ERR_OK; -} - -/** - * Creates a single pbuf out of a queue of pbufs. - * - * @remark: Either the source pbuf 'p' is freed by this function or the original - * pbuf 'p' is returned, therefore the caller has to check the result! - * - * @param p the source pbuf - * @param layer pbuf_layer of the new pbuf - * - * @return a new, single pbuf (p->next is NULL) - * or the old pbuf if allocation fails - */ -struct pbuf* -pbuf_coalesce(struct pbuf *p, pbuf_layer layer) -{ - struct pbuf *q; - err_t err; - if (p->next == NULL) { - return p; - } - q = pbuf_alloc(layer, p->tot_len, PBUF_RAM); - if (q == NULL) { - /* @todo: what do we do now? */ - return p; - } - err = pbuf_copy(q, p); - LWIP_ASSERT("pbuf_copy failed", err == ERR_OK); - pbuf_free(p); - return q; -} - -#if LWIP_CHECKSUM_ON_COPY -/** - * Copies data into a single pbuf (*not* into a pbuf queue!) and updates - * the checksum while copying - * - * @param p the pbuf to copy data into - * @param start_offset offset of p->payload where to copy the data to - * @param dataptr data to copy into the pbuf - * @param len length of data to copy into the pbuf - * @param chksum pointer to the checksum which is updated - * @return ERR_OK if successful, another error if the data does not fit - * within the (first) pbuf (no pbuf queues!) - */ -err_t -pbuf_fill_chksum(struct pbuf *p, u16_t start_offset, const void *dataptr, - u16_t len, u16_t *chksum) -{ - u32_t acc; - u16_t copy_chksum; - char *dst_ptr; - LWIP_ASSERT("p != NULL", p != NULL); - LWIP_ASSERT("dataptr != NULL", dataptr != NULL); - LWIP_ASSERT("chksum != NULL", chksum != NULL); - LWIP_ASSERT("len != 0", len != 0); - - if ((start_offset >= p->len) || (start_offset + len > p->len)) { - return ERR_ARG; - } - - dst_ptr = ((char*)p->payload) + start_offset; - copy_chksum = LWIP_CHKSUM_COPY(dst_ptr, dataptr, len); - if ((start_offset & 1) != 0) { - copy_chksum = SWAP_BYTES_IN_WORD(copy_chksum); - } - acc = *chksum; - acc += copy_chksum; - *chksum = FOLD_U32T(acc); - return ERR_OK; -} -#endif /* LWIP_CHECKSUM_ON_COPY */ - - /** Get one byte from the specified position in a pbuf - * WARNING: returns zero for offset >= p->tot_len - * - * @param p pbuf to parse - * @param offset offset into p of the byte to return - * @return byte at an offset into p OR ZERO IF 'offset' >= p->tot_len - */ -u8_t -pbuf_get_at(struct pbuf* p, u16_t offset) -{ - u16_t copy_from = offset; - struct pbuf* q = p; - - /* get the correct pbuf */ - while ((q != NULL) && (q->len <= copy_from)) { - copy_from -= q->len; - q = q->next; - } - /* return requested data if pbuf is OK */ - if ((q != NULL) && (q->len > copy_from)) { - return ((u8_t*)q->payload)[copy_from]; - } - return 0; -} - -/** Compare pbuf contents at specified offset with memory s2, both of length n - * - * @param p pbuf to compare - * @param offset offset into p at wich to start comparing - * @param s2 buffer to compare - * @param n length of buffer to compare - * @return zero if equal, nonzero otherwise - * (0xffff if p is too short, diffoffset+1 otherwise) - */ -u16_t -pbuf_memcmp(struct pbuf* p, u16_t offset, const void* s2, u16_t n) -{ - u16_t start = offset; - struct pbuf* q = p; - - /* get the correct pbuf */ - while ((q != NULL) && (q->len <= start)) { - start -= q->len; - q = q->next; - } - /* return requested data if pbuf is OK */ - if ((q != NULL) && (q->len > start)) { - u16_t i; - for(i = 0; i < n; i++) { - u8_t a = pbuf_get_at(q, start + i); - u8_t b = ((u8_t*)s2)[i]; - if (a != b) { - return i+1; - } - } - return 0; - } - return 0xffff; -} - -/** Find occurrence of mem (with length mem_len) in pbuf p, starting at offset - * start_offset. - * - * @param p pbuf to search, maximum length is 0xFFFE since 0xFFFF is used as - * return value 'not found' - * @param mem search for the contents of this buffer - * @param mem_len length of 'mem' - * @param start_offset offset into p at which to start searching - * @return 0xFFFF if substr was not found in p or the index where it was found - */ -u16_t -pbuf_memfind(struct pbuf* p, const void* mem, u16_t mem_len, u16_t start_offset) -{ - u16_t i; - u16_t max = p->tot_len - mem_len; - if (p->tot_len >= mem_len + start_offset) { - for(i = start_offset; i <= max; ) { - u16_t plus = pbuf_memcmp(p, i, mem, mem_len); - if (plus == 0) { - return i; - } else { - i += plus; - } - } - } - return 0xFFFF; -} - -/** Find occurrence of substr with length substr_len in pbuf p, start at offset - * start_offset - * WARNING: in contrast to strstr(), this one does not stop at the first \0 in - * the pbuf/source string! - * - * @param p pbuf to search, maximum length is 0xFFFE since 0xFFFF is used as - * return value 'not found' - * @param substr string to search for in p, maximum length is 0xFFFE - * @return 0xFFFF if substr was not found in p or the index where it was found - */ -u16_t -pbuf_strstr(struct pbuf* p, const char* substr) -{ - size_t substr_len; - if ((substr == NULL) || (substr[0] == 0) || (p->tot_len == 0xFFFF)) { - return 0xFFFF; - } - substr_len = strlen(substr); - if (substr_len >= 0xFFFF) { - return 0xFFFF; - } - return pbuf_memfind(p, substr, (u16_t)substr_len, 0); -} diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/core/stats.c b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/core/stats.c deleted file mode 100644 index 06fbe0f2..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/core/stats.c +++ /dev/null @@ -1,181 +0,0 @@ -/** - * @file - * Statistics module - * - */ - -/* - * Copyright (c) 2001-2004 Swedish Institute of Computer Science. - * 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. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT - * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING - * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY - * OF SUCH DAMAGE. - * - * This file is part of the lwIP TCP/IP stack. - * - * Author: Adam Dunkels - * - */ - -#include "lwip/opt.h" - -#if LWIP_STATS /* don't build if not configured for use in lwipopts.h */ - -#include "lwip/def.h" -#include "lwip/stats.h" -#include "lwip/mem.h" - -#include - -struct stats_ lwip_stats; - -void stats_init(void) -{ -#ifdef LWIP_DEBUG -#if MEMP_STATS - const char * memp_names[] = { -#define LWIP_MEMPOOL(name,num,size,desc) desc, -#include "lwip/memp_std.h" - }; - int i; - for (i = 0; i < MEMP_MAX; i++) { - lwip_stats.memp[i].name = memp_names[i]; - } -#endif /* MEMP_STATS */ -#if MEM_STATS - lwip_stats.mem.name = "MEM"; -#endif /* MEM_STATS */ -#endif /* LWIP_DEBUG */ -} - -#if LWIP_STATS_DISPLAY -void -stats_display_proto(struct stats_proto *proto, const char *name) -{ - LWIP_PLATFORM_DIAG(("\n%s\n\t", name)); - LWIP_PLATFORM_DIAG(("xmit: %"STAT_COUNTER_F"\n\t", proto->xmit)); - LWIP_PLATFORM_DIAG(("recv: %"STAT_COUNTER_F"\n\t", proto->recv)); - LWIP_PLATFORM_DIAG(("fw: %"STAT_COUNTER_F"\n\t", proto->fw)); - LWIP_PLATFORM_DIAG(("drop: %"STAT_COUNTER_F"\n\t", proto->drop)); - LWIP_PLATFORM_DIAG(("chkerr: %"STAT_COUNTER_F"\n\t", proto->chkerr)); - LWIP_PLATFORM_DIAG(("lenerr: %"STAT_COUNTER_F"\n\t", proto->lenerr)); - LWIP_PLATFORM_DIAG(("memerr: %"STAT_COUNTER_F"\n\t", proto->memerr)); - LWIP_PLATFORM_DIAG(("rterr: %"STAT_COUNTER_F"\n\t", proto->rterr)); - LWIP_PLATFORM_DIAG(("proterr: %"STAT_COUNTER_F"\n\t", proto->proterr)); - LWIP_PLATFORM_DIAG(("opterr: %"STAT_COUNTER_F"\n\t", proto->opterr)); - LWIP_PLATFORM_DIAG(("err: %"STAT_COUNTER_F"\n\t", proto->err)); - LWIP_PLATFORM_DIAG(("cachehit: %"STAT_COUNTER_F"\n", proto->cachehit)); -} - -#if IGMP_STATS -void -stats_display_igmp(struct stats_igmp *igmp, const char *name) -{ - LWIP_PLATFORM_DIAG(("\n%s\n\t", name)); - LWIP_PLATFORM_DIAG(("xmit: %"STAT_COUNTER_F"\n\t", igmp->xmit)); - LWIP_PLATFORM_DIAG(("recv: %"STAT_COUNTER_F"\n\t", igmp->recv)); - LWIP_PLATFORM_DIAG(("drop: %"STAT_COUNTER_F"\n\t", igmp->drop)); - LWIP_PLATFORM_DIAG(("chkerr: %"STAT_COUNTER_F"\n\t", igmp->chkerr)); - LWIP_PLATFORM_DIAG(("lenerr: %"STAT_COUNTER_F"\n\t", igmp->lenerr)); - LWIP_PLATFORM_DIAG(("memerr: %"STAT_COUNTER_F"\n\t", igmp->memerr)); - LWIP_PLATFORM_DIAG(("proterr: %"STAT_COUNTER_F"\n\t", igmp->proterr)); - LWIP_PLATFORM_DIAG(("rx_v1: %"STAT_COUNTER_F"\n\t", igmp->rx_v1)); - LWIP_PLATFORM_DIAG(("rx_group: %"STAT_COUNTER_F"\n\t", igmp->rx_group)); - LWIP_PLATFORM_DIAG(("rx_general: %"STAT_COUNTER_F"\n\t", igmp->rx_general)); - LWIP_PLATFORM_DIAG(("rx_report: %"STAT_COUNTER_F"\n\t", igmp->rx_report)); - LWIP_PLATFORM_DIAG(("tx_join: %"STAT_COUNTER_F"\n\t", igmp->tx_join)); - LWIP_PLATFORM_DIAG(("tx_leave: %"STAT_COUNTER_F"\n\t", igmp->tx_leave)); - LWIP_PLATFORM_DIAG(("tx_report: %"STAT_COUNTER_F"\n\t", igmp->tx_report)); -} -#endif /* IGMP_STATS */ - -#if MEM_STATS || MEMP_STATS -void -stats_display_mem(struct stats_mem *mem, const char *name) -{ - LWIP_PLATFORM_DIAG(("\nMEM %s\n\t", name)); - LWIP_PLATFORM_DIAG(("avail: %"U32_F"\n\t", (u32_t)mem->avail)); - LWIP_PLATFORM_DIAG(("used: %"U32_F"\n\t", (u32_t)mem->used)); - LWIP_PLATFORM_DIAG(("max: %"U32_F"\n\t", (u32_t)mem->max)); - LWIP_PLATFORM_DIAG(("err: %"U32_F"\n", (u32_t)mem->err)); -} - -#if MEMP_STATS -void -stats_display_memp(struct stats_mem *mem, int index) -{ - char * memp_names[] = { -#define LWIP_MEMPOOL(name,num,size,desc) desc, -#include "lwip/memp_std.h" - }; - if(index < MEMP_MAX) { - stats_display_mem(mem, memp_names[index]); - } -} -#endif /* MEMP_STATS */ -#endif /* MEM_STATS || MEMP_STATS */ - -#if SYS_STATS -void -stats_display_sys(struct stats_sys *sys) -{ - LWIP_PLATFORM_DIAG(("\nSYS\n\t")); - LWIP_PLATFORM_DIAG(("sem.used: %"U32_F"\n\t", (u32_t)sys->sem.used)); - LWIP_PLATFORM_DIAG(("sem.max: %"U32_F"\n\t", (u32_t)sys->sem.max)); - LWIP_PLATFORM_DIAG(("sem.err: %"U32_F"\n\t", (u32_t)sys->sem.err)); - LWIP_PLATFORM_DIAG(("mutex.used: %"U32_F"\n\t", (u32_t)sys->mutex.used)); - LWIP_PLATFORM_DIAG(("mutex.max: %"U32_F"\n\t", (u32_t)sys->mutex.max)); - LWIP_PLATFORM_DIAG(("mutex.err: %"U32_F"\n\t", (u32_t)sys->mutex.err)); - LWIP_PLATFORM_DIAG(("mbox.used: %"U32_F"\n\t", (u32_t)sys->mbox.used)); - LWIP_PLATFORM_DIAG(("mbox.max: %"U32_F"\n\t", (u32_t)sys->mbox.max)); - LWIP_PLATFORM_DIAG(("mbox.err: %"U32_F"\n\t", (u32_t)sys->mbox.err)); -} -#endif /* SYS_STATS */ - -void -stats_display(void) -{ - s16_t i; - - LINK_STATS_DISPLAY(); - ETHARP_STATS_DISPLAY(); - IPFRAG_STATS_DISPLAY(); - IP6_FRAG_STATS_DISPLAY(); - IP_STATS_DISPLAY(); - ND6_STATS_DISPLAY(); - IP6_STATS_DISPLAY(); - IGMP_STATS_DISPLAY(); - MLD6_STATS_DISPLAY(); - ICMP_STATS_DISPLAY(); - ICMP6_STATS_DISPLAY(); - UDP_STATS_DISPLAY(); - TCP_STATS_DISPLAY(); - MEM_STATS_DISPLAY(); - for (i = 0; i < MEMP_MAX; i++) { - MEMP_STATS_DISPLAY(i); - } - SYS_STATS_DISPLAY(); -} -#endif /* LWIP_STATS_DISPLAY */ - -#endif /* LWIP_STATS */ - diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/core/tcp.c b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/core/tcp.c deleted file mode 100644 index 55496d05..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/core/tcp.c +++ /dev/null @@ -1,1852 +0,0 @@ -/** - * @file - * Transmission Control Protocol for IP - * - * This file contains common functions for the TCP implementation, such as functinos - * for manipulating the data structures and the TCP timer functions. TCP functions - * related to input and output is found in tcp_in.c and tcp_out.c respectively. - * - */ - -/* - * Copyright (c) 2001-2004 Swedish Institute of Computer Science. - * 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. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT - * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING - * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY - * OF SUCH DAMAGE. - * - * This file is part of the lwIP TCP/IP stack. - * - * Author: Adam Dunkels - * - */ - -#include "lwip/opt.h" - -#if LWIP_TCP /* don't build if not configured for use in lwipopts.h */ - -#include "lwip/def.h" -#include "lwip/mem.h" -#include "lwip/memp.h" -#include "lwip/snmp.h" -#include "lwip/tcp.h" -#include "lwip/tcp_impl.h" -#include "lwip/debug.h" -#include "lwip/stats.h" -#include "lwip/ip6.h" -#include "lwip/ip6_addr.h" -#include "lwip/nd6.h" - -#include - -#ifndef TCP_LOCAL_PORT_RANGE_START -/* From http://www.iana.org/assignments/port-numbers: - "The Dynamic and/or Private Ports are those from 49152 through 65535" */ -#define TCP_LOCAL_PORT_RANGE_START 0xc000 -#define TCP_LOCAL_PORT_RANGE_END 0xffff -#define TCP_ENSURE_LOCAL_PORT_RANGE(port) (((port) & ~TCP_LOCAL_PORT_RANGE_START) + TCP_LOCAL_PORT_RANGE_START) -#endif - -#if LWIP_TCP_KEEPALIVE -#define TCP_KEEP_DUR(pcb) ((pcb)->keep_cnt * (pcb)->keep_intvl) -#define TCP_KEEP_INTVL(pcb) ((pcb)->keep_intvl) -#else /* LWIP_TCP_KEEPALIVE */ -#define TCP_KEEP_DUR(pcb) TCP_MAXIDLE -#define TCP_KEEP_INTVL(pcb) TCP_KEEPINTVL_DEFAULT -#endif /* LWIP_TCP_KEEPALIVE */ - -const char * const tcp_state_str[] = { - "CLOSED", - "LISTEN", - "SYN_SENT", - "SYN_RCVD", - "ESTABLISHED", - "FIN_WAIT_1", - "FIN_WAIT_2", - "CLOSE_WAIT", - "CLOSING", - "LAST_ACK", - "TIME_WAIT" -}; - -/* last local TCP port */ -static u16_t tcp_port = TCP_LOCAL_PORT_RANGE_START; - -/* Incremented every coarse grained timer shot (typically every 500 ms). */ -u32_t tcp_ticks; -const u8_t tcp_backoff[13] = - { 1, 2, 3, 4, 5, 6, 7, 7, 7, 7, 7, 7, 7}; - /* Times per slowtmr hits */ -const u8_t tcp_persist_backoff[7] = { 3, 6, 12, 24, 48, 96, 120 }; - -/* The TCP PCB lists. */ - -/** List of all TCP PCBs bound but not yet (connected || listening) */ -struct tcp_pcb *tcp_bound_pcbs; -/** List of all TCP PCBs in LISTEN state */ -union tcp_listen_pcbs_t tcp_listen_pcbs; -/** List of all TCP PCBs that are in a state in which - * they accept or send data. */ -struct tcp_pcb *tcp_active_pcbs; -/** List of all TCP PCBs in TIME-WAIT state */ -struct tcp_pcb *tcp_tw_pcbs; - -#define NUM_TCP_PCB_LISTS 4 -#define NUM_TCP_PCB_LISTS_NO_TIME_WAIT 3 -/** An array with all (non-temporary) PCB lists, mainly used for smaller code size */ -struct tcp_pcb ** const tcp_pcb_lists[] = {&tcp_listen_pcbs.pcbs, &tcp_bound_pcbs, - &tcp_active_pcbs, &tcp_tw_pcbs}; - -/** Only used for temporary storage. */ -struct tcp_pcb *tcp_tmp_pcb; - -u8_t tcp_active_pcbs_changed; - -/** Timer counter to handle calling slow-timer from tcp_tmr() */ -static u8_t tcp_timer; -static u8_t tcp_timer_ctr; -static u16_t tcp_new_port(void); - -/** - * Initialize this module. - */ -void -tcp_init(void) -{ -#if LWIP_RANDOMIZE_INITIAL_LOCAL_PORTS && defined(LWIP_RAND) - tcp_port = TCP_ENSURE_LOCAL_PORT_RANGE(LWIP_RAND()); -#endif /* LWIP_RANDOMIZE_INITIAL_LOCAL_PORTS && defined(LWIP_RAND) */ -} - -/** - * Called periodically to dispatch TCP timers. - */ -void -tcp_tmr(void) -{ - /* Call tcp_fasttmr() every 250 ms */ - tcp_fasttmr(); - - if (++tcp_timer & 1) { - /* Call tcp_tmr() every 500 ms, i.e., every other timer - tcp_tmr() is called. */ - tcp_slowtmr(); - } -} - -/** - * Closes the TX side of a connection held by the PCB. - * For tcp_close(), a RST is sent if the application didn't receive all data - * (tcp_recved() not called for all data passed to recv callback). - * - * Listening pcbs are freed and may not be referenced any more. - * Connection pcbs are freed if not yet connected and may not be referenced - * any more. If a connection is established (at least SYN received or in - * a closing state), the connection is closed, and put in a closing state. - * The pcb is then automatically freed in tcp_slowtmr(). It is therefore - * unsafe to reference it. - * - * @param pcb the tcp_pcb to close - * @return ERR_OK if connection has been closed - * another err_t if closing failed and pcb is not freed - */ -static err_t -tcp_close_shutdown(struct tcp_pcb *pcb, u8_t rst_on_unacked_data) -{ - err_t err; - - if (rst_on_unacked_data && ((pcb->state == ESTABLISHED) || (pcb->state == CLOSE_WAIT))) { - if ((pcb->refused_data != NULL) || (pcb->rcv_wnd != TCP_WND)) { - /* Not all data received by application, send RST to tell the remote - side about this. */ - LWIP_ASSERT("pcb->flags & TF_RXCLOSED", pcb->flags & TF_RXCLOSED); - - /* don't call tcp_abort here: we must not deallocate the pcb since - that might not be expected when calling tcp_close */ - tcp_rst(pcb->snd_nxt, pcb->rcv_nxt, &pcb->local_ip, &pcb->remote_ip, - pcb->local_port, pcb->remote_port, PCB_ISIPV6(pcb)); - - tcp_pcb_purge(pcb); - TCP_RMV_ACTIVE(pcb); - if (pcb->state == ESTABLISHED) { - /* move to TIME_WAIT since we close actively */ - pcb->state = TIME_WAIT; - TCP_REG(&tcp_tw_pcbs, pcb); - } else { - /* CLOSE_WAIT: deallocate the pcb since we already sent a RST for it */ - memp_free(MEMP_TCP_PCB, pcb); - } - return ERR_OK; - } - } - - switch (pcb->state) { - case CLOSED: - /* Closing a pcb in the CLOSED state might seem erroneous, - * however, it is in this state once allocated and as yet unused - * and the user needs some way to free it should the need arise. - * Calling tcp_close() with a pcb that has already been closed, (i.e. twice) - * or for a pcb that has been used and then entered the CLOSED state - * is erroneous, but this should never happen as the pcb has in those cases - * been freed, and so any remaining handles are bogus. */ - err = ERR_OK; - if (pcb->local_port != 0 || pcb->bound_to_netif) { - TCP_RMV(&tcp_bound_pcbs, pcb); - } - memp_free(MEMP_TCP_PCB, pcb); - pcb = NULL; - break; - case LISTEN: - err = ERR_OK; - tcp_pcb_remove(&tcp_listen_pcbs.pcbs, pcb); - memp_free(MEMP_TCP_PCB_LISTEN, pcb); - pcb = NULL; - break; - case SYN_SENT: - err = ERR_OK; - TCP_PCB_REMOVE_ACTIVE(pcb); - memp_free(MEMP_TCP_PCB, pcb); - pcb = NULL; - snmp_inc_tcpattemptfails(); - break; - case SYN_RCVD: - err = tcp_send_fin(pcb); - if (err == ERR_OK) { - snmp_inc_tcpattemptfails(); - pcb->state = FIN_WAIT_1; - } - break; - case ESTABLISHED: - err = tcp_send_fin(pcb); - if (err == ERR_OK) { - snmp_inc_tcpestabresets(); - pcb->state = FIN_WAIT_1; - } - break; - case CLOSE_WAIT: - err = tcp_send_fin(pcb); - if (err == ERR_OK) { - snmp_inc_tcpestabresets(); - pcb->state = LAST_ACK; - } - break; - default: - /* Has already been closed, do nothing. */ - err = ERR_OK; - pcb = NULL; - break; - } - - if (pcb != NULL && err == ERR_OK) { - /* To ensure all data has been sent when tcp_close returns, we have - to make sure tcp_output doesn't fail. - Since we don't really have to ensure all data has been sent when tcp_close - returns (unsent data is sent from tcp timer functions, also), we don't care - for the return value of tcp_output for now. */ - /* @todo: When implementing SO_LINGER, this must be changed somehow: - If SOF_LINGER is set, the data should be sent and acked before close returns. - This can only be valid for sequential APIs, not for the raw API. */ - tcp_output(pcb); - } - return err; -} - -/** - * Closes the connection held by the PCB. - * - * Listening pcbs are freed and may not be referenced any more. - * Connection pcbs are freed if not yet connected and may not be referenced - * any more. If a connection is established (at least SYN received or in - * a closing state), the connection is closed, and put in a closing state. - * The pcb is then automatically freed in tcp_slowtmr(). It is therefore - * unsafe to reference it (unless an error is returned). - * - * @param pcb the tcp_pcb to close - * @return ERR_OK if connection has been closed - * another err_t if closing failed and pcb is not freed - */ -err_t -tcp_close(struct tcp_pcb *pcb) -{ -#if TCP_DEBUG - LWIP_DEBUGF(TCP_DEBUG, ("tcp_close: closing in ")); - tcp_debug_print_state(pcb->state); -#endif /* TCP_DEBUG */ - - if (pcb->state != LISTEN) { - /* Set a flag not to receive any more data... */ - pcb->flags |= TF_RXCLOSED; - } - /* ... and close */ - return tcp_close_shutdown(pcb, 1); -} - -/** - * Causes all or part of a full-duplex connection of this PCB to be shut down. - * This doesn't deallocate the PCB unless shutting down both sides! - * Shutting down both sides is the same as calling tcp_close, so if it succeds, - * the PCB should not be referenced any more. - * - * @param pcb PCB to shutdown - * @param shut_rx shut down receive side if this is != 0 - * @param shut_tx shut down send side if this is != 0 - * @return ERR_OK if shutdown succeeded (or the PCB has already been shut down) - * another err_t on error. - */ -err_t -tcp_shutdown(struct tcp_pcb *pcb, int shut_rx, int shut_tx) -{ - if (pcb->state == LISTEN) { - return ERR_CONN; - } - if (shut_rx) { - /* shut down the receive side: set a flag not to receive any more data... */ - pcb->flags |= TF_RXCLOSED; - if (shut_tx) { - /* shutting down the tx AND rx side is the same as closing for the raw API */ - return tcp_close_shutdown(pcb, 1); - } - /* ... and free buffered data */ - if (pcb->refused_data != NULL) { - pbuf_free(pcb->refused_data); - pcb->refused_data = NULL; - } - } - if (shut_tx) { - /* This can't happen twice since if it succeeds, the pcb's state is changed. - Only close in these states as the others directly deallocate the PCB */ - switch (pcb->state) { - case SYN_RCVD: - case ESTABLISHED: - case CLOSE_WAIT: - return tcp_close_shutdown(pcb, shut_rx); - default: - /* Not (yet?) connected, cannot shutdown the TX side as that would bring us - into CLOSED state, where the PCB is deallocated. */ - return ERR_CONN; - } - } - return ERR_OK; -} - -/** - * Abandons a connection and optionally sends a RST to the remote - * host. Deletes the local protocol control block. This is done when - * a connection is killed because of shortage of memory. - * - * @param pcb the tcp_pcb to abort - * @param reset boolean to indicate whether a reset should be sent - */ -void -tcp_abandon(struct tcp_pcb *pcb, int reset) -{ - u32_t seqno, ackno; -#if LWIP_CALLBACK_API - tcp_err_fn errf; -#endif /* LWIP_CALLBACK_API */ - void *errf_arg; - - /* pcb->state LISTEN not allowed here */ - LWIP_ASSERT("don't call tcp_abort/tcp_abandon for listen-pcbs", - pcb->state != LISTEN); - /* Figure out on which TCP PCB list we are, and remove us. If we - are in an active state, call the receive function associated with - the PCB with a NULL argument, and send an RST to the remote end. */ - if (pcb->state == TIME_WAIT) { - tcp_pcb_remove(&tcp_tw_pcbs, pcb); - memp_free(MEMP_TCP_PCB, pcb); - } else { - int send_rst = reset && (pcb->state != CLOSED); - seqno = pcb->snd_nxt; - ackno = pcb->rcv_nxt; -#if LWIP_CALLBACK_API - errf = pcb->errf; -#endif /* LWIP_CALLBACK_API */ - errf_arg = pcb->callback_arg; - TCP_PCB_REMOVE_ACTIVE(pcb); - if (pcb->unacked != NULL) { - tcp_segs_free(pcb->unacked); - } - if (pcb->unsent != NULL) { - tcp_segs_free(pcb->unsent); - } -#if TCP_QUEUE_OOSEQ - if (pcb->ooseq != NULL) { - tcp_segs_free(pcb->ooseq); - } -#endif /* TCP_QUEUE_OOSEQ */ - if (send_rst) { - LWIP_DEBUGF(TCP_RST_DEBUG, ("tcp_abandon: sending RST\n")); - tcp_rst(seqno, ackno, &pcb->local_ip, &pcb->remote_ip, pcb->local_port, pcb->remote_port, PCB_ISIPV6(pcb)); - } - memp_free(MEMP_TCP_PCB, pcb); - TCP_EVENT_ERR(errf, errf_arg, ERR_ABRT); - } -} - -/** - * Aborts the connection by sending a RST (reset) segment to the remote - * host. The pcb is deallocated. This function never fails. - * - * ATTENTION: When calling this from one of the TCP callbacks, make - * sure you always return ERR_ABRT (and never return ERR_ABRT otherwise - * or you will risk accessing deallocated memory or memory leaks! - * - * @param pcb the tcp pcb to abort - */ -void -tcp_abort(struct tcp_pcb *pcb) -{ - tcp_abandon(pcb, 1); -} - -/** - * Binds the connection to a local portnumber and IP address. If the - * IP address is not given (i.e., ipaddr == NULL), the IP address of - * the outgoing network interface is used instead. - * - * @param pcb the tcp_pcb to bind (no check is done whether this pcb is - * already bound!) - * @param ipaddr the local ip address to bind to (use IP_ADDR_ANY to bind - * to any local address - * @param port the local port to bind to - * @return ERR_USE if the port is already in use - * ERR_VAL if bind failed because the PCB is not in a valid state - * ERR_OK if bound - */ -err_t -tcp_bind(struct tcp_pcb *pcb, ip_addr_t *ipaddr, u16_t port) -{ - int i; - int max_pcb_list = NUM_TCP_PCB_LISTS; - struct tcp_pcb *cpcb; - - LWIP_ERROR("tcp_bind: can only bind in state CLOSED", pcb->state == CLOSED, return ERR_VAL); - -#if SO_REUSE - /* Unless the REUSEADDR flag is set, - we have to check the pcbs in TIME-WAIT state, also. - We do not dump TIME_WAIT pcb's; they can still be matched by incoming - packets using both local and remote IP addresses and ports to distinguish. - */ - if (ip_get_option(pcb, SOF_REUSEADDR)) { - max_pcb_list = NUM_TCP_PCB_LISTS_NO_TIME_WAIT; - } -#endif /* SO_REUSE */ - - if (port == 0) { - port = tcp_new_port(); - if (port == 0) { - return ERR_BUF; - } - } - - /* Check if the address already is in use (on all lists) */ - for (i = 0; i < max_pcb_list; i++) { - for(cpcb = *tcp_pcb_lists[i]; cpcb != NULL; cpcb = cpcb->next) { - if (cpcb->local_port == port) { -#if SO_REUSE - /* Omit checking for the same port if both pcbs have REUSEADDR set. - For SO_REUSEADDR, the duplicate-check for a 5-tuple is done in - tcp_connect. */ - if (!ip_get_option(pcb, SOF_REUSEADDR) || - !ip_get_option(cpcb, SOF_REUSEADDR)) -#endif /* SO_REUSE */ - { - /* @todo: check accept_any_ip_version */ - if (IP_PCB_IPVER_EQ(pcb, cpcb) && - (ipX_addr_isany(PCB_ISIPV6(pcb), &cpcb->local_ip) || - ipX_addr_isany(PCB_ISIPV6(pcb), ip_2_ipX(ipaddr)) || - ipX_addr_cmp(PCB_ISIPV6(pcb), &cpcb->local_ip, ip_2_ipX(ipaddr)))) { - return ERR_USE; - } - } - } - } - } - - pcb->bound_to_netif = 0; - if (!ipX_addr_isany(PCB_ISIPV6(pcb), ip_2_ipX(ipaddr))) { - ipX_addr_set(PCB_ISIPV6(pcb), &pcb->local_ip, ip_2_ipX(ipaddr)); - } - pcb->local_port = port; - TCP_REG(&tcp_bound_pcbs, pcb); - LWIP_DEBUGF(TCP_DEBUG, ("tcp_bind: bind to port %"U16_F"\n", port)); - return ERR_OK; -} - -err_t -tcp_bind_to_netif(struct tcp_pcb *pcb, const char ifname[3]) -{ - LWIP_ERROR("tcp_bind_if: can only bind in state CLOSED", pcb->state == CLOSED, return ERR_ISCONN); - - /* Check if the interface is already in use */ - for (int i = 0; i < NUM_TCP_PCB_LISTS; i++) { - for(struct tcp_pcb *cpcb = *tcp_pcb_lists[i]; cpcb != NULL; cpcb = cpcb->next) { - if (IP_PCB_IPVER_EQ(pcb, cpcb) && - cpcb->bound_to_netif && - !memcmp(cpcb->local_netif, ifname, sizeof(cpcb->local_netif))) { - return ERR_USE; - } - } - } - - pcb->bound_to_netif = 1; - ipX_addr_set_any(PCB_ISIPV6(pcb), &pcb->local_ip); - pcb->local_port = 0; - memcpy(pcb->local_netif, ifname, sizeof(pcb->local_netif)); - TCP_REG(&tcp_bound_pcbs, pcb); - LWIP_DEBUGF(TCP_DEBUG, ("tcp_bind_to_netif: bind to interface %c%c%c\n", ifname[0], ifname[1], ifname[2])); - return ERR_OK; -} - -#if LWIP_CALLBACK_API -/** - * Default accept callback if no accept callback is specified by the user. - */ -static err_t -tcp_accept_null(void *arg, struct tcp_pcb *pcb, err_t err) -{ - LWIP_UNUSED_ARG(arg); - LWIP_UNUSED_ARG(pcb); - LWIP_UNUSED_ARG(err); - - return ERR_ABRT; -} -#endif /* LWIP_CALLBACK_API */ - -/** - * Set the state of the connection to be LISTEN, which means that it - * is able to accept incoming connections. The protocol control block - * is reallocated in order to consume less memory. Setting the - * connection to LISTEN is an irreversible process. - * - * @param pcb the original tcp_pcb - * @param backlog the incoming connections queue limit - * @return tcp_pcb used for listening, consumes less memory. - * - * @note The original tcp_pcb is freed. This function therefore has to be - * called like this: - * tpcb = tcp_listen(tpcb); - */ -struct tcp_pcb * -tcp_listen_with_backlog(struct tcp_pcb *pcb, u8_t backlog) -{ - struct tcp_pcb_listen *lpcb; - - LWIP_UNUSED_ARG(backlog); - LWIP_ERROR("tcp_listen: pcb already connected", pcb->state == CLOSED, return NULL); - - /* already listening? */ - if (pcb->state == LISTEN) { - return pcb; - } -#if SO_REUSE - if (ip_get_option(pcb, SOF_REUSEADDR) && !pcb->have_local_netif) { - /* Since SOF_REUSEADDR allows reusing a local address before the pcb's usage - is declared (listen-/connection-pcb), we have to make sure now that - this port is only used once for every local IP. */ - for(lpcb = tcp_listen_pcbs.listen_pcbs; lpcb != NULL; lpcb = lpcb->next) { - if ((lpcb->local_port == pcb->local_port) && - IP_PCB_IPVER_EQ(pcb, lpcb)) { - if (ipX_addr_cmp(PCB_ISIPV6(pcb), &lpcb->local_ip, &pcb->local_ip)) { - /* this address/port is already used */ - return NULL; - } - } - } - } -#endif /* SO_REUSE */ - lpcb = (struct tcp_pcb_listen *)memp_malloc(MEMP_TCP_PCB_LISTEN); - if (lpcb == NULL) { - return NULL; - } - lpcb->callback_arg = pcb->callback_arg; - lpcb->bound_to_netif = pcb->bound_to_netif; - lpcb->local_port = pcb->local_port; - memcpy(lpcb->local_netif, pcb->local_netif, sizeof(pcb->local_netif)); - lpcb->state = LISTEN; - lpcb->prio = pcb->prio; - lpcb->so_options = pcb->so_options; - ip_set_option(lpcb, SOF_ACCEPTCONN); - lpcb->ttl = pcb->ttl; - lpcb->tos = pcb->tos; -#if LWIP_IPV6 - PCB_ISIPV6(lpcb) = PCB_ISIPV6(pcb); - lpcb->accept_any_ip_version = 0; -#endif /* LWIP_IPV6 */ - ipX_addr_copy(PCB_ISIPV6(pcb), lpcb->local_ip, pcb->local_ip); - if (pcb->local_port != 0 || pcb->bound_to_netif) { - TCP_RMV(&tcp_bound_pcbs, pcb); - } - memp_free(MEMP_TCP_PCB, pcb); -#if LWIP_CALLBACK_API - lpcb->accept = tcp_accept_null; -#endif /* LWIP_CALLBACK_API */ -#if TCP_LISTEN_BACKLOG - lpcb->accepts_pending = 0; - lpcb->backlog = (backlog ? backlog : 1); -#endif /* TCP_LISTEN_BACKLOG */ - TCP_REG(&tcp_listen_pcbs.pcbs, (struct tcp_pcb *)lpcb); - return (struct tcp_pcb *)lpcb; -} - -#if LWIP_IPV6 -/** - * Same as tcp_listen_with_backlog, but allows to accept IPv4 and IPv6 - * connections, if the pcb's local address is set to ANY. - */ -struct tcp_pcb * -tcp_listen_dual_with_backlog(struct tcp_pcb *pcb, u8_t backlog) -{ - struct tcp_pcb *lpcb; - - lpcb = tcp_listen_with_backlog(pcb, backlog); - if ((lpcb != NULL) && - ipX_addr_isany(PCB_ISIPV6(pcb), &pcb->local_ip)) { - /* The default behavior is to accept connections on either - * IPv4 or IPv6, if not bound. */ - /* @see NETCONN_FLAG_IPV6_V6ONLY for changing this behavior */ - ((struct tcp_pcb_listen*)lpcb)->accept_any_ip_version = 1; - } - return lpcb; -} -#endif /* LWIP_IPV6 */ - -/** - * Update the state that tracks the available window space to advertise. - * - * Returns how much extra window would be advertised if we sent an - * update now. - */ -u32_t tcp_update_rcv_ann_wnd(struct tcp_pcb *pcb) -{ - u32_t new_right_edge = pcb->rcv_nxt + pcb->rcv_wnd; - - if (TCP_SEQ_GEQ(new_right_edge, pcb->rcv_ann_right_edge + LWIP_MIN((TCP_WND / 2), pcb->mss))) { - /* we can advertise more window */ - pcb->rcv_ann_wnd = pcb->rcv_wnd; - return new_right_edge - pcb->rcv_ann_right_edge; - } else { - if (TCP_SEQ_GT(pcb->rcv_nxt, pcb->rcv_ann_right_edge)) { - /* Can happen due to other end sending out of advertised window, - * but within actual available (but not yet advertised) window */ - pcb->rcv_ann_wnd = 0; - } else { - /* keep the right edge of window constant */ - u32_t new_rcv_ann_wnd = pcb->rcv_ann_right_edge - pcb->rcv_nxt; - LWIP_ASSERT("new_rcv_ann_wnd <= 0xffff", new_rcv_ann_wnd <= 0xffff); - pcb->rcv_ann_wnd = (u16_t)new_rcv_ann_wnd; - } - return 0; - } -} - -/** - * This function should be called by the application when it has - * processed the data. The purpose is to advertise a larger window - * when the data has been processed. - * - * @param pcb the tcp_pcb for which data is read - * @param len the amount of bytes that have been read by the application - */ -void -tcp_recved(struct tcp_pcb *pcb, u16_t len) -{ - int wnd_inflation; - - /* pcb->state LISTEN not allowed here */ - LWIP_ASSERT("don't call tcp_recved for listen-pcbs", - pcb->state != LISTEN); - LWIP_ASSERT("tcp_recved: len would wrap rcv_wnd\n", - len <= 0xffff - pcb->rcv_wnd ); - - pcb->rcv_wnd += len; - if (pcb->rcv_wnd > TCP_WND) { - pcb->rcv_wnd = TCP_WND; - } - - wnd_inflation = tcp_update_rcv_ann_wnd(pcb); - - /* If the change in the right edge of window is significant (default - * watermark is TCP_WND/4), then send an explicit update now. - * Otherwise wait for a packet to be sent in the normal course of - * events (or more window to be available later) */ - if (wnd_inflation >= TCP_WND_UPDATE_THRESHOLD) { - tcp_ack_now(pcb); - tcp_output(pcb); - } - - LWIP_DEBUGF(TCP_DEBUG, ("tcp_recved: recveived %"U16_F" bytes, wnd %"U16_F" (%"U16_F").\n", - len, pcb->rcv_wnd, TCP_WND - pcb->rcv_wnd)); -} - -/** - * Allocate a new local TCP port. - * - * @return a new (free) local TCP port number - */ -static u16_t -tcp_new_port(void) -{ - u8_t i; - u16_t n = 0; - struct tcp_pcb *pcb; - -again: - if (tcp_port++ == TCP_LOCAL_PORT_RANGE_END) { - tcp_port = TCP_LOCAL_PORT_RANGE_START; - } - /* Check all PCB lists. */ - for (i = 0; i < NUM_TCP_PCB_LISTS; i++) { - for(pcb = *tcp_pcb_lists[i]; pcb != NULL; pcb = pcb->next) { - if (pcb->local_port == tcp_port) { - if (++n > (TCP_LOCAL_PORT_RANGE_END - TCP_LOCAL_PORT_RANGE_START)) { - return 0; - } - goto again; - } - } - } - return tcp_port; -} - -/** - * Connects to another host. The function given as the "connected" - * argument will be called when the connection has been established. - * - * @param pcb the tcp_pcb used to establish the connection - * @param ipaddr the remote ip address to connect to - * @param port the remote tcp port to connect to - * @param connected callback function to call when connected (or on error) - * @return ERR_VAL if invalid arguments are given - * ERR_OK if connect request has been sent - * other err_t values if connect request couldn't be sent - */ -err_t -tcp_connect(struct tcp_pcb *pcb, ip_addr_t *ipaddr, u16_t port, - tcp_connected_fn connected) -{ - err_t ret; - u32_t iss; - u16_t old_local_port; - - LWIP_ERROR("tcp_connect: can only connect from state CLOSED", pcb->state == CLOSED, return ERR_ISCONN); - LWIP_ERROR("tcp_connect: cannot connect pcb bound to netif", !pcb->bound_to_netif, return ERR_VAL); - - LWIP_DEBUGF(TCP_DEBUG, ("tcp_connect to port %"U16_F"\n", port)); - if (ipaddr != NULL) { - ipX_addr_set(PCB_ISIPV6(pcb), &pcb->remote_ip, ip_2_ipX(ipaddr)); - } else { - return ERR_VAL; - } - pcb->remote_port = port; - - /* check if we have a route to the remote host */ - if (ipX_addr_isany(PCB_ISIPV6(pcb), &pcb->local_ip)) { - /* no local IP address set, yet. */ - struct netif *netif; - ipX_addr_t *local_ip; - ipX_route_get_local_ipX(PCB_ISIPV6(pcb), &pcb->local_ip, &pcb->remote_ip, netif, local_ip); - if ((netif == NULL) || (local_ip == NULL)) { - /* Don't even try to send a SYN packet if we have no route - since that will fail. */ - return ERR_RTE; - } - /* Use the address as local address of the pcb. */ - ipX_addr_copy(PCB_ISIPV6(pcb), pcb->local_ip, *local_ip); - } - - old_local_port = pcb->local_port; - if (pcb->local_port == 0) { - pcb->local_port = tcp_new_port(); - if (pcb->local_port == 0) { - return ERR_BUF; - } - } -#if SO_REUSE - if (ip_get_option(pcb, SOF_REUSEADDR)) { - /* Since SOF_REUSEADDR allows reusing a local address, we have to make sure - now that the 5-tuple is unique. */ - struct tcp_pcb *cpcb; - int i; - /* Don't check listen- and bound-PCBs, check active- and TIME-WAIT PCBs. */ - for (i = 2; i < NUM_TCP_PCB_LISTS; i++) { - for(cpcb = *tcp_pcb_lists[i]; cpcb != NULL; cpcb = cpcb->next) { - if ((cpcb->local_port == pcb->local_port) && - (cpcb->remote_port == port) && - IP_PCB_IPVER_EQ(cpcb, pcb) && - ipX_addr_cmp(PCB_ISIPV6(pcb), &cpcb->local_ip, &pcb->local_ip) && - ipX_addr_cmp(PCB_ISIPV6(pcb), &cpcb->remote_ip, ip_2_ipX(ipaddr))) { - /* linux returns EISCONN here, but ERR_USE should be OK for us */ - return ERR_USE; - } - } - } - } -#endif /* SO_REUSE */ - iss = tcp_next_iss(); - pcb->rcv_nxt = 0; - pcb->snd_nxt = iss; - pcb->lastack = iss - 1; - pcb->snd_lbb = iss - 1; - pcb->rcv_wnd = TCP_WND; - pcb->rcv_ann_wnd = TCP_WND; - pcb->rcv_ann_right_edge = pcb->rcv_nxt; - pcb->snd_wnd = TCP_WND; - /* As initial send MSS, we use TCP_MSS but limit it to 536. - The send MSS is updated when an MSS option is received. */ - pcb->mss = (TCP_MSS > 536) ? 536 : TCP_MSS; -#if TCP_CALCULATE_EFF_SEND_MSS - pcb->mss = tcp_eff_send_mss(pcb->mss, &pcb->local_ip, &pcb->remote_ip, PCB_ISIPV6(pcb)); -#endif /* TCP_CALCULATE_EFF_SEND_MSS */ - pcb->cwnd = 1; - pcb->ssthresh = pcb->mss * 10; -#if LWIP_CALLBACK_API - pcb->connected = connected; -#else /* LWIP_CALLBACK_API */ - LWIP_UNUSED_ARG(connected); -#endif /* LWIP_CALLBACK_API */ - - /* Send a SYN together with the MSS option. */ - ret = tcp_enqueue_flags(pcb, TCP_SYN); - if (ret == ERR_OK) { - /* SYN segment was enqueued, changed the pcbs state now */ - pcb->state = SYN_SENT; - if (old_local_port != 0) { - TCP_RMV(&tcp_bound_pcbs, pcb); - } - TCP_REG_ACTIVE(pcb); - snmp_inc_tcpactiveopens(); - - tcp_output(pcb); - } - return ret; -} - -/** - * Called every 500 ms and implements the retransmission timer and the timer that - * removes PCBs that have been in TIME-WAIT for enough time. It also increments - * various timers such as the inactivity timer in each PCB. - * - * Automatically called from tcp_tmr(). - */ -void -tcp_slowtmr(void) -{ - struct tcp_pcb *pcb, *prev; - u16_t eff_wnd; - u8_t pcb_remove; /* flag if a PCB should be removed */ - u8_t pcb_reset; /* flag if a RST should be sent when removing */ - err_t err; - - err = ERR_OK; - - ++tcp_ticks; - ++tcp_timer_ctr; - -tcp_slowtmr_start: - /* Steps through all of the active PCBs. */ - prev = NULL; - pcb = tcp_active_pcbs; - if (pcb == NULL) { - LWIP_DEBUGF(TCP_DEBUG, ("tcp_slowtmr: no active pcbs\n")); - } - while (pcb != NULL) { - LWIP_DEBUGF(TCP_DEBUG, ("tcp_slowtmr: processing active pcb\n")); - LWIP_ASSERT("tcp_slowtmr: active pcb->state != CLOSED\n", pcb->state != CLOSED); - LWIP_ASSERT("tcp_slowtmr: active pcb->state != LISTEN\n", pcb->state != LISTEN); - LWIP_ASSERT("tcp_slowtmr: active pcb->state != TIME-WAIT\n", pcb->state != TIME_WAIT); - if (pcb->last_timer == tcp_timer_ctr) { - /* skip this pcb, we have already processed it */ - pcb = pcb->next; - continue; - } - pcb->last_timer = tcp_timer_ctr; - - pcb_remove = 0; - pcb_reset = 0; - - if (pcb->state == SYN_SENT && pcb->nrtx == TCP_SYNMAXRTX) { - ++pcb_remove; - LWIP_DEBUGF(TCP_DEBUG, ("tcp_slowtmr: max SYN retries reached\n")); - } - else if (pcb->nrtx == TCP_MAXRTX) { - ++pcb_remove; - LWIP_DEBUGF(TCP_DEBUG, ("tcp_slowtmr: max DATA retries reached\n")); - } else { - if (pcb->persist_backoff > 0) { - /* If snd_wnd is zero, use persist timer to send 1 byte probes - * instead of using the standard retransmission mechanism. */ - pcb->persist_cnt++; - if (pcb->persist_cnt >= tcp_persist_backoff[pcb->persist_backoff-1]) { - pcb->persist_cnt = 0; - if (pcb->persist_backoff < sizeof(tcp_persist_backoff)) { - pcb->persist_backoff++; - } - tcp_zero_window_probe(pcb); - } - } else { - /* Increase the retransmission timer if it is running */ - if(pcb->rtime >= 0) { - ++pcb->rtime; - } - - if (pcb->unacked != NULL && pcb->rtime >= pcb->rto) { - /* Time for a retransmission. */ - LWIP_DEBUGF(TCP_RTO_DEBUG, ("tcp_slowtmr: rtime %"S16_F - " pcb->rto %"S16_F"\n", - pcb->rtime, pcb->rto)); - - /* Double retransmission time-out unless we are trying to - * connect to somebody (i.e., we are in SYN_SENT). */ - if (pcb->state != SYN_SENT) { - pcb->rto = ((pcb->sa >> 3) + pcb->sv) << tcp_backoff[pcb->nrtx]; - } - - /* Reset the retransmission timer. */ - pcb->rtime = 0; - - /* Reduce congestion window and ssthresh. */ - eff_wnd = LWIP_MIN(pcb->cwnd, pcb->snd_wnd); - pcb->ssthresh = eff_wnd >> 1; - if (pcb->ssthresh < (pcb->mss << 1)) { - pcb->ssthresh = (pcb->mss << 1); - } - pcb->cwnd = pcb->mss; - LWIP_DEBUGF(TCP_CWND_DEBUG, ("tcp_slowtmr: cwnd %"U16_F - " ssthresh %"U16_F"\n", - pcb->cwnd, pcb->ssthresh)); - - /* The following needs to be called AFTER cwnd is set to one - mss - STJ */ - tcp_rexmit_rto(pcb); - } - } - } - /* Check if this PCB has stayed too long in FIN-WAIT-2 */ - if (pcb->state == FIN_WAIT_2) { - /* If this PCB is in FIN_WAIT_2 because of SHUT_WR don't let it time out. */ - if (pcb->flags & TF_RXCLOSED) { - /* PCB was fully closed (either through close() or SHUT_RDWR): - normal FIN-WAIT timeout handling. */ - if ((u32_t)(tcp_ticks - pcb->tmr) > - TCP_FIN_WAIT_TIMEOUT / TCP_SLOW_INTERVAL) { - ++pcb_remove; - LWIP_DEBUGF(TCP_DEBUG, ("tcp_slowtmr: removing pcb stuck in FIN-WAIT-2\n")); - } - } - } - - /* Check if KEEPALIVE should be sent */ - if(ip_get_option(pcb, SOF_KEEPALIVE) && - ((pcb->state == ESTABLISHED) || - (pcb->state == CLOSE_WAIT))) { - if((u32_t)(tcp_ticks - pcb->tmr) > - (pcb->keep_idle + TCP_KEEP_DUR(pcb)) / TCP_SLOW_INTERVAL) - { - LWIP_DEBUGF(TCP_DEBUG, ("tcp_slowtmr: KEEPALIVE timeout. Aborting connection to ")); - ipX_addr_debug_print(PCB_ISIPV6(pcb), TCP_DEBUG, &pcb->remote_ip); - LWIP_DEBUGF(TCP_DEBUG, ("\n")); - - ++pcb_remove; - ++pcb_reset; - } - else if((u32_t)(tcp_ticks - pcb->tmr) > - (pcb->keep_idle + pcb->keep_cnt_sent * TCP_KEEP_INTVL(pcb)) - / TCP_SLOW_INTERVAL) - { - tcp_keepalive(pcb); - pcb->keep_cnt_sent++; - } - } - - /* If this PCB has queued out of sequence data, but has been - inactive for too long, will drop the data (it will eventually - be retransmitted). */ -#if TCP_QUEUE_OOSEQ - if (pcb->ooseq != NULL && - (u32_t)tcp_ticks - pcb->tmr >= pcb->rto * TCP_OOSEQ_TIMEOUT) { - tcp_segs_free(pcb->ooseq); - pcb->ooseq = NULL; - LWIP_DEBUGF(TCP_CWND_DEBUG, ("tcp_slowtmr: dropping OOSEQ queued data\n")); - } -#endif /* TCP_QUEUE_OOSEQ */ - - /* Check if this PCB has stayed too long in SYN-RCVD */ - if (pcb->state == SYN_RCVD) { - if ((u32_t)(tcp_ticks - pcb->tmr) > - TCP_SYN_RCVD_TIMEOUT / TCP_SLOW_INTERVAL) { - ++pcb_remove; - LWIP_DEBUGF(TCP_DEBUG, ("tcp_slowtmr: removing pcb stuck in SYN-RCVD\n")); - } - } - - /* Check if this PCB has stayed too long in LAST-ACK */ - if (pcb->state == LAST_ACK) { - if ((u32_t)(tcp_ticks - pcb->tmr) > 2 * TCP_MSL / TCP_SLOW_INTERVAL) { - ++pcb_remove; - LWIP_DEBUGF(TCP_DEBUG, ("tcp_slowtmr: removing pcb stuck in LAST-ACK\n")); - } - } - - /* If the PCB should be removed, do it. */ - if (pcb_remove) { - struct tcp_pcb *pcb2; - tcp_err_fn err_fn; - void *err_arg; - tcp_pcb_purge(pcb); - /* Remove PCB from tcp_active_pcbs list. */ - if (prev != NULL) { - LWIP_ASSERT("tcp_slowtmr: middle tcp != tcp_active_pcbs", pcb != tcp_active_pcbs); - prev->next = pcb->next; - } else { - /* This PCB was the first. */ - LWIP_ASSERT("tcp_slowtmr: first pcb == tcp_active_pcbs", tcp_active_pcbs == pcb); - tcp_active_pcbs = pcb->next; - } - - if (pcb_reset) { - tcp_rst(pcb->snd_nxt, pcb->rcv_nxt, &pcb->local_ip, &pcb->remote_ip, - pcb->local_port, pcb->remote_port, PCB_ISIPV6(pcb)); - } - - err_fn = pcb->errf; - err_arg = pcb->callback_arg; - pcb2 = pcb; - pcb = pcb->next; - memp_free(MEMP_TCP_PCB, pcb2); - - tcp_active_pcbs_changed = 0; - TCP_EVENT_ERR(err_fn, err_arg, ERR_ABRT); - if (tcp_active_pcbs_changed) { - goto tcp_slowtmr_start; - } - } else { - /* get the 'next' element now and work with 'prev' below (in case of abort) */ - prev = pcb; - pcb = pcb->next; - - /* We check if we should poll the connection. */ - ++prev->polltmr; - if (prev->polltmr >= prev->pollinterval) { - prev->polltmr = 0; - LWIP_DEBUGF(TCP_DEBUG, ("tcp_slowtmr: polling application\n")); - tcp_active_pcbs_changed = 0; - TCP_EVENT_POLL(prev, err); - if (tcp_active_pcbs_changed) { - goto tcp_slowtmr_start; - } - /* if err == ERR_ABRT, 'prev' is already deallocated */ - if (err == ERR_OK) { - tcp_output(prev); - } - } - } - } - - - /* Steps through all of the TIME-WAIT PCBs. */ - prev = NULL; - pcb = tcp_tw_pcbs; - while (pcb != NULL) { - LWIP_ASSERT("tcp_slowtmr: TIME-WAIT pcb->state == TIME-WAIT", pcb->state == TIME_WAIT); - pcb_remove = 0; - - /* Check if this PCB has stayed long enough in TIME-WAIT */ - if ((u32_t)(tcp_ticks - pcb->tmr) > 2 * TCP_MSL / TCP_SLOW_INTERVAL) { - ++pcb_remove; - } - - - - /* If the PCB should be removed, do it. */ - if (pcb_remove) { - struct tcp_pcb *pcb2; - tcp_pcb_purge(pcb); - /* Remove PCB from tcp_tw_pcbs list. */ - if (prev != NULL) { - LWIP_ASSERT("tcp_slowtmr: middle tcp != tcp_tw_pcbs", pcb != tcp_tw_pcbs); - prev->next = pcb->next; - } else { - /* This PCB was the first. */ - LWIP_ASSERT("tcp_slowtmr: first pcb == tcp_tw_pcbs", tcp_tw_pcbs == pcb); - tcp_tw_pcbs = pcb->next; - } - pcb2 = pcb; - pcb = pcb->next; - memp_free(MEMP_TCP_PCB, pcb2); - } else { - prev = pcb; - pcb = pcb->next; - } - } -} - -/** - * Is called every TCP_FAST_INTERVAL (250 ms) and process data previously - * "refused" by upper layer (application) and sends delayed ACKs. - * - * Automatically called from tcp_tmr(). - */ -void -tcp_fasttmr(void) -{ - struct tcp_pcb *pcb; - - ++tcp_timer_ctr; - -tcp_fasttmr_start: - pcb = tcp_active_pcbs; - - while(pcb != NULL) { - if (pcb->last_timer != tcp_timer_ctr) { - struct tcp_pcb *next; - pcb->last_timer = tcp_timer_ctr; - /* send delayed ACKs */ - if (pcb->flags & TF_ACK_DELAY) { - LWIP_DEBUGF(TCP_DEBUG, ("tcp_fasttmr: delayed ACK\n")); - tcp_ack_now(pcb); - tcp_output(pcb); - pcb->flags &= ~(TF_ACK_DELAY | TF_ACK_NOW); - } - - next = pcb->next; - - /* If there is data which was previously "refused" by upper layer */ - if (pcb->refused_data != NULL) { - tcp_active_pcbs_changed = 0; - tcp_process_refused_data(pcb); - if (tcp_active_pcbs_changed) { - /* application callback has changed the pcb list: restart the loop */ - goto tcp_fasttmr_start; - } - } - pcb = next; - } - } -} - -/** Pass pcb->refused_data to the recv callback */ -err_t -tcp_process_refused_data(struct tcp_pcb *pcb) -{ - err_t err; - u8_t refused_flags = pcb->refused_data->flags; - /* set pcb->refused_data to NULL in case the callback frees it and then - closes the pcb */ - struct pbuf *refused_data = pcb->refused_data; - pcb->refused_data = NULL; - /* Notify again application with data previously received. */ - LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_input: notify kept packet\n")); - TCP_EVENT_RECV(pcb, refused_data, ERR_OK, err); - if (err == ERR_OK) { - /* did refused_data include a FIN? */ - if (refused_flags & PBUF_FLAG_TCP_FIN) { - /* correct rcv_wnd as the application won't call tcp_recved() - for the FIN's seqno */ - if (pcb->rcv_wnd != TCP_WND) { - pcb->rcv_wnd++; - } - TCP_EVENT_CLOSED(pcb, err); - if (err == ERR_ABRT) { - return ERR_ABRT; - } - } - } else if (err == ERR_ABRT) { - /* if err == ERR_ABRT, 'pcb' is already deallocated */ - /* Drop incoming packets because pcb is "full" (only if the incoming - segment contains data). */ - LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_input: drop incoming packets, because pcb is \"full\"\n")); - return ERR_ABRT; - } else { - /* data is still refused, pbuf is still valid (go on for ACK-only packets) */ - pcb->refused_data = refused_data; - } - return ERR_OK; -} - -/** - * Deallocates a list of TCP segments (tcp_seg structures). - * - * @param seg tcp_seg list of TCP segments to free - */ -void -tcp_segs_free(struct tcp_seg *seg) -{ - while (seg != NULL) { - struct tcp_seg *next = seg->next; - tcp_seg_free(seg); - seg = next; - } -} - -/** - * Frees a TCP segment (tcp_seg structure). - * - * @param seg single tcp_seg to free - */ -void -tcp_seg_free(struct tcp_seg *seg) -{ - if (seg != NULL) { - if (seg->p != NULL) { - pbuf_free(seg->p); -#if TCP_DEBUG - seg->p = NULL; -#endif /* TCP_DEBUG */ - } - memp_free(MEMP_TCP_SEG, seg); - } -} - -/** - * Sets the priority of a connection. - * - * @param pcb the tcp_pcb to manipulate - * @param prio new priority - */ -void -tcp_setprio(struct tcp_pcb *pcb, u8_t prio) -{ - pcb->prio = prio; -} - -#if TCP_QUEUE_OOSEQ -/** - * Returns a copy of the given TCP segment. - * The pbuf and data are not copied, only the pointers - * - * @param seg the old tcp_seg - * @return a copy of seg - */ -struct tcp_seg * -tcp_seg_copy(struct tcp_seg *seg) -{ - struct tcp_seg *cseg; - - cseg = (struct tcp_seg *)memp_malloc(MEMP_TCP_SEG); - if (cseg == NULL) { - return NULL; - } - SMEMCPY((u8_t *)cseg, (const u8_t *)seg, sizeof(struct tcp_seg)); - pbuf_ref(cseg->p); - return cseg; -} -#endif /* TCP_QUEUE_OOSEQ */ - -#if LWIP_CALLBACK_API -/** - * Default receive callback that is called if the user didn't register - * a recv callback for the pcb. - */ -err_t -tcp_recv_null(void *arg, struct tcp_pcb *pcb, struct pbuf *p, err_t err) -{ - LWIP_UNUSED_ARG(arg); - if (p != NULL) { - tcp_recved(pcb, p->tot_len); - pbuf_free(p); - } else if (err == ERR_OK) { - return tcp_close(pcb); - } - return ERR_OK; -} -#endif /* LWIP_CALLBACK_API */ - -/** - * Kills the oldest active connection that has the same or lower priority than - * 'prio'. - * - * @param prio minimum priority - */ -static void -tcp_kill_prio(u8_t prio) -{ - struct tcp_pcb *pcb, *inactive; - u32_t inactivity; - u8_t mprio; - - - mprio = TCP_PRIO_MAX; - - /* We kill the oldest active connection that has lower priority than prio. */ - inactivity = 0; - inactive = NULL; - for(pcb = tcp_active_pcbs; pcb != NULL; pcb = pcb->next) { - if (pcb->prio <= prio && - pcb->prio <= mprio && - (u32_t)(tcp_ticks - pcb->tmr) >= inactivity) { - inactivity = tcp_ticks - pcb->tmr; - inactive = pcb; - mprio = pcb->prio; - } - } - if (inactive != NULL) { - LWIP_DEBUGF(TCP_DEBUG, ("tcp_kill_prio: killing oldest PCB %p (%"S32_F")\n", - (void *)inactive, inactivity)); - tcp_abort(inactive); - } -} - -/** - * Kills the oldest connection that is in TIME_WAIT state. - * Called from tcp_alloc() if no more connections are available. - */ -static void -tcp_kill_timewait(void) -{ - struct tcp_pcb *pcb, *inactive; - u32_t inactivity; - - inactivity = 0; - inactive = NULL; - /* Go through the list of TIME_WAIT pcbs and get the oldest pcb. */ - for(pcb = tcp_tw_pcbs; pcb != NULL; pcb = pcb->next) { - if ((u32_t)(tcp_ticks - pcb->tmr) >= inactivity) { - inactivity = tcp_ticks - pcb->tmr; - inactive = pcb; - } - } - if (inactive != NULL) { - LWIP_DEBUGF(TCP_DEBUG, ("tcp_kill_timewait: killing oldest TIME-WAIT PCB %p (%"S32_F")\n", - (void *)inactive, inactivity)); - tcp_abort(inactive); - } -} - -/** - * Allocate a new tcp_pcb structure. - * - * @param prio priority for the new pcb - * @return a new tcp_pcb that initially is in state CLOSED - */ -struct tcp_pcb * -tcp_alloc(u8_t prio) -{ - struct tcp_pcb *pcb; - u32_t iss; - - pcb = (struct tcp_pcb *)memp_malloc(MEMP_TCP_PCB); - if (pcb == NULL) { - /* Try killing oldest connection in TIME-WAIT. */ - LWIP_DEBUGF(TCP_DEBUG, ("tcp_alloc: killing off oldest TIME-WAIT connection\n")); - tcp_kill_timewait(); - /* Try to allocate a tcp_pcb again. */ - pcb = (struct tcp_pcb *)memp_malloc(MEMP_TCP_PCB); - if (pcb == NULL) { - /* Try killing active connections with lower priority than the new one. */ - LWIP_DEBUGF(TCP_DEBUG, ("tcp_alloc: killing connection with prio lower than %d\n", prio)); - tcp_kill_prio(prio); - /* Try to allocate a tcp_pcb again. */ - pcb = (struct tcp_pcb *)memp_malloc(MEMP_TCP_PCB); - if (pcb != NULL) { - /* adjust err stats: memp_malloc failed twice before */ - MEMP_STATS_DEC(err, MEMP_TCP_PCB); - } - } - if (pcb != NULL) { - /* adjust err stats: timewait PCB was freed above */ - MEMP_STATS_DEC(err, MEMP_TCP_PCB); - } - } - if (pcb != NULL) { - memset(pcb, 0, sizeof(struct tcp_pcb)); - pcb->prio = prio; - pcb->snd_buf = TCP_SND_BUF; - pcb->snd_queuelen = 0; - pcb->rcv_wnd = TCP_WND; - pcb->rcv_ann_wnd = TCP_WND; - pcb->tos = 0; - pcb->ttl = TCP_TTL; - /* As initial send MSS, we use TCP_MSS but limit it to 536. - The send MSS is updated when an MSS option is received. */ - pcb->mss = (TCP_MSS > 536) ? 536 : TCP_MSS; - pcb->rto = 3000 / TCP_SLOW_INTERVAL; - pcb->sa = 0; - pcb->sv = 3000 / TCP_SLOW_INTERVAL; - pcb->rtime = -1; - pcb->cwnd = 1; - iss = tcp_next_iss(); - pcb->snd_wl2 = iss; - pcb->snd_nxt = iss; - pcb->lastack = iss; - pcb->snd_lbb = iss; - pcb->tmr = tcp_ticks; - pcb->last_timer = tcp_timer_ctr; - - pcb->polltmr = 0; - -#if LWIP_CALLBACK_API - pcb->recv = tcp_recv_null; -#endif /* LWIP_CALLBACK_API */ - - /* Init KEEPALIVE timer */ - pcb->keep_idle = TCP_KEEPIDLE_DEFAULT; - -#if LWIP_TCP_KEEPALIVE - pcb->keep_intvl = TCP_KEEPINTVL_DEFAULT; - pcb->keep_cnt = TCP_KEEPCNT_DEFAULT; -#endif /* LWIP_TCP_KEEPALIVE */ - - pcb->keep_cnt_sent = 0; - } - return pcb; -} - -/** - * Creates a new TCP protocol control block but doesn't place it on - * any of the TCP PCB lists. - * The pcb is not put on any list until binding using tcp_bind(). - * - * @internal: Maybe there should be a idle TCP PCB list where these - * PCBs are put on. Port reservation using tcp_bind() is implemented but - * allocated pcbs that are not bound can't be killed automatically if wanting - * to allocate a pcb with higher prio (@see tcp_kill_prio()) - * - * @return a new tcp_pcb that initially is in state CLOSED - */ -struct tcp_pcb * -tcp_new(void) -{ - return tcp_alloc(TCP_PRIO_NORMAL); -} - -#if LWIP_IPV6 -/** - * Creates a new TCP-over-IPv6 protocol control block but doesn't - * place it on any of the TCP PCB lists. - * The pcb is not put on any list until binding using tcp_bind(). - * - * @return a new tcp_pcb that initially is in state CLOSED - */ -struct tcp_pcb * -tcp_new_ip6(void) -{ - struct tcp_pcb * pcb; - pcb = tcp_alloc(TCP_PRIO_NORMAL); - ip_set_v6(pcb, 1); - return pcb; -} -#endif /* LWIP_IPV6 */ - -/** - * Used to specify the argument that should be passed callback - * functions. - * - * @param pcb tcp_pcb to set the callback argument - * @param arg void pointer argument to pass to callback functions - */ -void -tcp_arg(struct tcp_pcb *pcb, void *arg) -{ - /* This function is allowed to be called for both listen pcbs and - connection pcbs. */ - pcb->callback_arg = arg; -} -#if LWIP_CALLBACK_API - -/** - * Used to specify the function that should be called when a TCP - * connection receives data. - * - * @param pcb tcp_pcb to set the recv callback - * @param recv callback function to call for this pcb when data is received - */ -void -tcp_recv(struct tcp_pcb *pcb, tcp_recv_fn recv) -{ - LWIP_ASSERT("invalid socket state for recv callback", pcb->state != LISTEN); - pcb->recv = recv; -} - -/** - * Used to specify the function that should be called when TCP data - * has been successfully delivered to the remote host. - * - * @param pcb tcp_pcb to set the sent callback - * @param sent callback function to call for this pcb when data is successfully sent - */ -void -tcp_sent(struct tcp_pcb *pcb, tcp_sent_fn sent) -{ - LWIP_ASSERT("invalid socket state for sent callback", pcb->state != LISTEN); - pcb->sent = sent; -} - -/** - * Used to specify the function that should be called when a fatal error - * has occured on the connection. - * - * @param pcb tcp_pcb to set the err callback - * @param err callback function to call for this pcb when a fatal error - * has occured on the connection - */ -void -tcp_err(struct tcp_pcb *pcb, tcp_err_fn err) -{ - LWIP_ASSERT("invalid socket state for err callback", pcb->state != LISTEN); - pcb->errf = err; -} - -/** - * Used for specifying the function that should be called when a - * LISTENing connection has been connected to another host. - * - * @param pcb tcp_pcb to set the accept callback - * @param accept callback function to call for this pcb when LISTENing - * connection has been connected to another host - */ -void -tcp_accept(struct tcp_pcb *pcb, tcp_accept_fn accept) -{ - /* This function is allowed to be called for both listen pcbs and - connection pcbs. */ - pcb->accept = accept; -} -#endif /* LWIP_CALLBACK_API */ - - -/** - * Used to specify the function that should be called periodically - * from TCP. The interval is specified in terms of the TCP coarse - * timer interval, which is called twice a second. - * - */ -void -tcp_poll(struct tcp_pcb *pcb, tcp_poll_fn poll, u8_t interval) -{ - LWIP_ASSERT("invalid socket state for poll", pcb->state != LISTEN); -#if LWIP_CALLBACK_API - pcb->poll = poll; -#else /* LWIP_CALLBACK_API */ - LWIP_UNUSED_ARG(poll); -#endif /* LWIP_CALLBACK_API */ - pcb->pollinterval = interval; -} - -/** - * Purges a TCP PCB. Removes any buffered data and frees the buffer memory - * (pcb->ooseq, pcb->unsent and pcb->unacked are freed). - * - * @param pcb tcp_pcb to purge. The pcb itself is not deallocated! - */ -void -tcp_pcb_purge(struct tcp_pcb *pcb) -{ - if (pcb->state != CLOSED && - pcb->state != TIME_WAIT && - pcb->state != LISTEN) { - - LWIP_DEBUGF(TCP_DEBUG, ("tcp_pcb_purge\n")); - -#if TCP_LISTEN_BACKLOG - if (pcb->state == SYN_RCVD) { - /* Need to find the corresponding listen_pcb and decrease its accepts_pending */ - struct tcp_pcb_listen *lpcb; - LWIP_ASSERT("tcp_pcb_purge: pcb->state == SYN_RCVD but tcp_listen_pcbs is NULL", - tcp_listen_pcbs.listen_pcbs != NULL); - for (lpcb = tcp_listen_pcbs.listen_pcbs; lpcb != NULL; lpcb = lpcb->next) { - if ((!lpcb->bound_to_netif && !pcb->bound_to_netif && - (lpcb->local_port == pcb->local_port) && - IP_PCB_IPVER_EQ(pcb, lpcb) && - (ipX_addr_isany(PCB_ISIPV6(lpcb), &lpcb->local_ip) || - ipX_addr_cmp(PCB_ISIPV6(lpcb), &pcb->local_ip, &lpcb->local_ip))) || - (lpcb->bound_to_netif && pcb->bound_to_netif && - !memcmp(lpcb->local_netif, pcb->local_netif, sizeof(pcb->local_netif)))) { - /* port and address of the listen pcb match the timed-out pcb */ - LWIP_ASSERT("tcp_pcb_purge: listen pcb does not have accepts pending", - lpcb->accepts_pending > 0); - lpcb->accepts_pending--; - break; - } - } - } -#endif /* TCP_LISTEN_BACKLOG */ - - - if (pcb->refused_data != NULL) { - LWIP_DEBUGF(TCP_DEBUG, ("tcp_pcb_purge: data left on ->refused_data\n")); - pbuf_free(pcb->refused_data); - pcb->refused_data = NULL; - } - if (pcb->unsent != NULL) { - LWIP_DEBUGF(TCP_DEBUG, ("tcp_pcb_purge: not all data sent\n")); - } - if (pcb->unacked != NULL) { - LWIP_DEBUGF(TCP_DEBUG, ("tcp_pcb_purge: data left on ->unacked\n")); - } -#if TCP_QUEUE_OOSEQ - if (pcb->ooseq != NULL) { - LWIP_DEBUGF(TCP_DEBUG, ("tcp_pcb_purge: data left on ->ooseq\n")); - } - tcp_segs_free(pcb->ooseq); - pcb->ooseq = NULL; -#endif /* TCP_QUEUE_OOSEQ */ - - /* Stop the retransmission timer as it will expect data on unacked - queue if it fires */ - pcb->rtime = -1; - - tcp_segs_free(pcb->unsent); - tcp_segs_free(pcb->unacked); - pcb->unacked = pcb->unsent = NULL; -#if TCP_OVERSIZE - pcb->unsent_oversize = 0; -#endif /* TCP_OVERSIZE */ - } -} - -/** - * Purges the PCB and removes it from a PCB list. Any delayed ACKs are sent first. - * - * @param pcblist PCB list to purge. - * @param pcb tcp_pcb to purge. The pcb itself is NOT deallocated! - */ -void -tcp_pcb_remove(struct tcp_pcb **pcblist, struct tcp_pcb *pcb) -{ - TCP_RMV(pcblist, pcb); - - tcp_pcb_purge(pcb); - - /* if there is an outstanding delayed ACKs, send it */ - if (pcb->state != TIME_WAIT && - pcb->state != LISTEN && - pcb->flags & TF_ACK_DELAY) { - pcb->flags |= TF_ACK_NOW; - tcp_output(pcb); - } - - if (pcb->state != LISTEN) { - LWIP_ASSERT("unsent segments leaking", pcb->unsent == NULL); - LWIP_ASSERT("unacked segments leaking", pcb->unacked == NULL); -#if TCP_QUEUE_OOSEQ - LWIP_ASSERT("ooseq segments leaking", pcb->ooseq == NULL); -#endif /* TCP_QUEUE_OOSEQ */ - } - - pcb->state = CLOSED; - - LWIP_ASSERT("tcp_pcb_remove: tcp_pcbs_sane()", tcp_pcbs_sane()); -} - -/** - * Calculates a new initial sequence number for new connections. - * - * @return u32_t pseudo random sequence number - */ -u32_t -tcp_next_iss(void) -{ - static u32_t iss = 6510; - - iss += tcp_ticks; /* XXX */ - return iss; -} - -#if TCP_CALCULATE_EFF_SEND_MSS -/** - * Calcluates the effective send mss that can be used for a specific IP address - * by using ip_route to determin the netif used to send to the address and - * calculating the minimum of TCP_MSS and that netif's mtu (if set). - */ -u16_t -tcp_eff_send_mss_impl(u16_t sendmss, ipX_addr_t *dest -#if LWIP_IPV6 - , ipX_addr_t *src, u8_t isipv6 -#endif /* LWIP_IPV6 */ - ) -{ - u16_t mss_s; - struct netif *outif; - s16_t mtu; - - outif = ipX_route(isipv6, src, dest); -#if LWIP_IPV6 - if (isipv6) { - /* First look in destination cache, to see if there is a Path MTU. */ - mtu = nd6_get_destination_mtu(ipX_2_ip6(dest), outif); - } else -#endif /* LWIP_IPV6 */ - { - if (outif == NULL) { - return sendmss; - } - mtu = outif->mtu; - } - - if (mtu != 0) { - mss_s = mtu - IP_HLEN - TCP_HLEN; -#if LWIP_IPV6 - /* for IPv6, substract the difference in header size */ - mss_s -= (IP6_HLEN - IP_HLEN); -#endif /* LWIP_IPV6 */ - /* RFC 1122, chap 4.2.2.6: - * Eff.snd.MSS = min(SendMSS+20, MMS_S) - TCPhdrsize - IPoptionsize - * We correct for TCP options in tcp_write(), and don't support IP options. - */ - sendmss = LWIP_MIN(sendmss, mss_s); - } - return sendmss; -} -#endif /* TCP_CALCULATE_EFF_SEND_MSS */ - -const char* -tcp_debug_state_str(enum tcp_state s) -{ - return tcp_state_str[s]; -} - -#if TCP_DEBUG || TCP_INPUT_DEBUG || TCP_OUTPUT_DEBUG -/** - * Print a tcp header for debugging purposes. - * - * @param tcphdr pointer to a struct tcp_hdr - */ -void -tcp_debug_print(struct tcp_hdr *tcphdr) -{ - LWIP_DEBUGF(TCP_DEBUG, ("TCP header:\n")); - LWIP_DEBUGF(TCP_DEBUG, ("+-------------------------------+\n")); - LWIP_DEBUGF(TCP_DEBUG, ("| %5"U16_F" | %5"U16_F" | (src port, dest port)\n", - ntohs(tcphdr->src), ntohs(tcphdr->dest))); - LWIP_DEBUGF(TCP_DEBUG, ("+-------------------------------+\n")); - LWIP_DEBUGF(TCP_DEBUG, ("| %010"U32_F" | (seq no)\n", - ntohl(tcphdr->seqno))); - LWIP_DEBUGF(TCP_DEBUG, ("+-------------------------------+\n")); - LWIP_DEBUGF(TCP_DEBUG, ("| %010"U32_F" | (ack no)\n", - ntohl(tcphdr->ackno))); - LWIP_DEBUGF(TCP_DEBUG, ("+-------------------------------+\n")); - LWIP_DEBUGF(TCP_DEBUG, ("| %2"U16_F" | |%"U16_F"%"U16_F"%"U16_F"%"U16_F"%"U16_F"%"U16_F"| %5"U16_F" | (hdrlen, flags (", - TCPH_HDRLEN(tcphdr), - TCPH_FLAGS(tcphdr) >> 5 & 1, - TCPH_FLAGS(tcphdr) >> 4 & 1, - TCPH_FLAGS(tcphdr) >> 3 & 1, - TCPH_FLAGS(tcphdr) >> 2 & 1, - TCPH_FLAGS(tcphdr) >> 1 & 1, - TCPH_FLAGS(tcphdr) & 1, - ntohs(tcphdr->wnd))); - tcp_debug_print_flags(TCPH_FLAGS(tcphdr)); - LWIP_DEBUGF(TCP_DEBUG, ("), win)\n")); - LWIP_DEBUGF(TCP_DEBUG, ("+-------------------------------+\n")); - LWIP_DEBUGF(TCP_DEBUG, ("| 0x%04"X16_F" | %5"U16_F" | (chksum, urgp)\n", - ntohs(tcphdr->chksum), ntohs(tcphdr->urgp))); - LWIP_DEBUGF(TCP_DEBUG, ("+-------------------------------+\n")); -} - -/** - * Print a tcp state for debugging purposes. - * - * @param s enum tcp_state to print - */ -void -tcp_debug_print_state(enum tcp_state s) -{ - LWIP_DEBUGF(TCP_DEBUG, ("State: %s\n", tcp_state_str[s])); -} - -/** - * Print tcp flags for debugging purposes. - * - * @param flags tcp flags, all active flags are printed - */ -void -tcp_debug_print_flags(u8_t flags) -{ - if (flags & TCP_FIN) { - LWIP_DEBUGF(TCP_DEBUG, ("FIN ")); - } - if (flags & TCP_SYN) { - LWIP_DEBUGF(TCP_DEBUG, ("SYN ")); - } - if (flags & TCP_RST) { - LWIP_DEBUGF(TCP_DEBUG, ("RST ")); - } - if (flags & TCP_PSH) { - LWIP_DEBUGF(TCP_DEBUG, ("PSH ")); - } - if (flags & TCP_ACK) { - LWIP_DEBUGF(TCP_DEBUG, ("ACK ")); - } - if (flags & TCP_URG) { - LWIP_DEBUGF(TCP_DEBUG, ("URG ")); - } - if (flags & TCP_ECE) { - LWIP_DEBUGF(TCP_DEBUG, ("ECE ")); - } - if (flags & TCP_CWR) { - LWIP_DEBUGF(TCP_DEBUG, ("CWR ")); - } - LWIP_DEBUGF(TCP_DEBUG, ("\n")); -} - -/** - * Print all tcp_pcbs in every list for debugging purposes. - */ -void -tcp_debug_print_pcbs(void) -{ - struct tcp_pcb *pcb; - LWIP_DEBUGF(TCP_DEBUG, ("Active PCB states:\n")); - for(pcb = tcp_active_pcbs; pcb != NULL; pcb = pcb->next) { - LWIP_DEBUGF(TCP_DEBUG, ("Local port %"U16_F", foreign port %"U16_F" snd_nxt %"U32_F" rcv_nxt %"U32_F" ", - pcb->local_port, pcb->remote_port, - pcb->snd_nxt, pcb->rcv_nxt)); - tcp_debug_print_state(pcb->state); - } - LWIP_DEBUGF(TCP_DEBUG, ("Listen PCB states:\n")); - for(pcb = (struct tcp_pcb *)tcp_listen_pcbs.pcbs; pcb != NULL; pcb = pcb->next) { - LWIP_DEBUGF(TCP_DEBUG, ("Local port %"U16_F", foreign port %"U16_F" snd_nxt %"U32_F" rcv_nxt %"U32_F" ", - pcb->local_port, pcb->remote_port, - pcb->snd_nxt, pcb->rcv_nxt)); - tcp_debug_print_state(pcb->state); - } - LWIP_DEBUGF(TCP_DEBUG, ("TIME-WAIT PCB states:\n")); - for(pcb = tcp_tw_pcbs; pcb != NULL; pcb = pcb->next) { - LWIP_DEBUGF(TCP_DEBUG, ("Local port %"U16_F", foreign port %"U16_F" snd_nxt %"U32_F" rcv_nxt %"U32_F" ", - pcb->local_port, pcb->remote_port, - pcb->snd_nxt, pcb->rcv_nxt)); - tcp_debug_print_state(pcb->state); - } -} - -/** - * Check state consistency of the tcp_pcb lists. - */ -s16_t -tcp_pcbs_sane(void) -{ - struct tcp_pcb *pcb; - for(pcb = tcp_active_pcbs; pcb != NULL; pcb = pcb->next) { - LWIP_ASSERT("tcp_pcbs_sane: active pcb->state != CLOSED", pcb->state != CLOSED); - LWIP_ASSERT("tcp_pcbs_sane: active pcb->state != LISTEN", pcb->state != LISTEN); - LWIP_ASSERT("tcp_pcbs_sane: active pcb->state != TIME-WAIT", pcb->state != TIME_WAIT); - } - for(pcb = tcp_tw_pcbs; pcb != NULL; pcb = pcb->next) { - LWIP_ASSERT("tcp_pcbs_sane: tw pcb->state == TIME-WAIT", pcb->state == TIME_WAIT); - } - return 1; -} -#endif /* TCP_DEBUG */ - -#endif /* LWIP_TCP */ diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/core/tcp_in.c b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/core/tcp_in.c deleted file mode 100644 index 6c382d06..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/core/tcp_in.c +++ /dev/null @@ -1,1666 +0,0 @@ -/** - * @file - * Transmission Control Protocol, incoming traffic - * - * The input processing functions of the TCP layer. - * - * These functions are generally called in the order (ip_input() ->) - * tcp_input() -> * tcp_process() -> tcp_receive() (-> application). - * - */ - -/* - * Copyright (c) 2001-2004 Swedish Institute of Computer Science. - * 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. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT - * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING - * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY - * OF SUCH DAMAGE. - * - * This file is part of the lwIP TCP/IP stack. - * - * Author: Adam Dunkels - * - */ - -#include "lwip/opt.h" - -#if LWIP_TCP /* don't build if not configured for use in lwipopts.h */ - -#include "lwip/tcp_impl.h" -#include "lwip/def.h" -#include "lwip/ip_addr.h" -#include "lwip/netif.h" -#include "lwip/mem.h" -#include "lwip/memp.h" -#include "lwip/inet_chksum.h" -#include "lwip/stats.h" -#include "lwip/snmp.h" -#include "arch/perf.h" -#include "lwip/ip6.h" -#include "lwip/ip6_addr.h" -#include "lwip/inet_chksum.h" -#if LWIP_ND6_TCP_REACHABILITY_HINTS -#include "lwip/nd6.h" -#endif /* LWIP_ND6_TCP_REACHABILITY_HINTS */ - -/* These variables are global to all functions involved in the input - processing of TCP segments. They are set by the tcp_input() - function. */ -static struct tcp_seg inseg; -static struct tcp_hdr *tcphdr; -static u32_t seqno, ackno; -static u8_t flags; -static u16_t tcplen; - -static u8_t recv_flags; -static struct pbuf *recv_data; - -struct tcp_pcb *tcp_input_pcb; - -/* Forward declarations. */ -static err_t tcp_process(struct tcp_pcb *pcb); -static void tcp_receive(struct tcp_pcb *pcb); -static void tcp_parseopt(struct tcp_pcb *pcb); - -static err_t tcp_listen_input(struct tcp_pcb_listen *pcb); -static err_t tcp_timewait_input(struct tcp_pcb *pcb); - -/** - * The initial input processing of TCP. It verifies the TCP header, demultiplexes - * the segment between the PCBs and passes it on to tcp_process(), which implements - * the TCP finite state machine. This function is called by the IP layer (in - * ip_input()). - * - * @param p received TCP segment to process (p->payload pointing to the TCP header) - * @param inp network interface on which this segment was received - */ -void -tcp_input(struct pbuf *p, struct netif *inp) -{ - struct tcp_pcb *pcb, *prev; - struct tcp_pcb_listen *lpcb; -#if SO_REUSE - struct tcp_pcb *lpcb_prev = NULL; - struct tcp_pcb_listen *lpcb_any = NULL; -#endif /* SO_REUSE */ - u8_t hdrlen; - err_t err; -#if CHECKSUM_CHECK_TCP - u16_t chksum; -#endif /* CHECKSUM_CHECK_TCP */ - - PERF_START; - - TCP_STATS_INC(tcp.recv); - snmp_inc_tcpinsegs(); - - tcphdr = (struct tcp_hdr *)p->payload; - -#if TCP_INPUT_DEBUG - tcp_debug_print(tcphdr); -#endif - - /* Check that TCP header fits in payload */ - if (p->len < sizeof(struct tcp_hdr)) { - /* drop short packets */ - LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_input: short packet (%"U16_F" bytes) discarded\n", p->tot_len)); - TCP_STATS_INC(tcp.lenerr); - goto dropped; - } - - /* Don't even process incoming broadcasts/multicasts. */ - if ((!ip_current_is_v6() && ip_addr_isbroadcast(ip_current_dest_addr(), inp)) || - ipX_addr_ismulticast(ip_current_is_v6(), ipX_current_dest_addr())) { - TCP_STATS_INC(tcp.proterr); - goto dropped; - } - -#if CHECKSUM_CHECK_TCP - /* Verify TCP checksum. */ - chksum = ipX_chksum_pseudo(ip_current_is_v6(), p, IP_PROTO_TCP, p->tot_len, - ipX_current_src_addr(), ipX_current_dest_addr()); - if (chksum != 0) { - LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_input: packet discarded due to failing checksum 0x%04"X16_F"\n", - chksum)); - tcp_debug_print(tcphdr); - TCP_STATS_INC(tcp.chkerr); - goto dropped; - } -#endif /* CHECKSUM_CHECK_TCP */ - - /* Move the payload pointer in the pbuf so that it points to the - TCP data instead of the TCP header. */ - hdrlen = TCPH_HDRLEN(tcphdr); - if(pbuf_header(p, -(hdrlen * 4))){ - /* drop short packets */ - LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_input: short packet\n")); - TCP_STATS_INC(tcp.lenerr); - goto dropped; - } - - /* Convert fields in TCP header to host byte order. */ - tcphdr->src = ntohs(tcphdr->src); - tcphdr->dest = ntohs(tcphdr->dest); - seqno = tcphdr->seqno = ntohl(tcphdr->seqno); - ackno = tcphdr->ackno = ntohl(tcphdr->ackno); - tcphdr->wnd = ntohs(tcphdr->wnd); - - flags = TCPH_FLAGS(tcphdr); - tcplen = p->tot_len + ((flags & (TCP_FIN | TCP_SYN)) ? 1 : 0); - - /* Demultiplex an incoming segment. First, we check if it is destined - for an active connection. */ - prev = NULL; - - - for(pcb = tcp_active_pcbs; pcb != NULL; pcb = pcb->next) { - LWIP_ASSERT("tcp_input: active pcb->state != CLOSED", pcb->state != CLOSED); - LWIP_ASSERT("tcp_input: active pcb->state != TIME-WAIT", pcb->state != TIME_WAIT); - LWIP_ASSERT("tcp_input: active pcb->state != LISTEN", pcb->state != LISTEN); - if (pcb->remote_port == tcphdr->src && - pcb->local_port == tcphdr->dest && - IP_PCB_IPVER_INPUT_MATCH(pcb) && - ipX_addr_cmp(ip_current_is_v6(), &pcb->remote_ip, ipX_current_src_addr()) && - ipX_addr_cmp(ip_current_is_v6(),&pcb->local_ip, ipX_current_dest_addr())) { - /* Move this PCB to the front of the list so that subsequent - lookups will be faster (we exploit locality in TCP segment - arrivals). */ - LWIP_ASSERT("tcp_input: pcb->next != pcb (before cache)", pcb->next != pcb); - if (prev != NULL) { - prev->next = pcb->next; - pcb->next = tcp_active_pcbs; - tcp_active_pcbs = pcb; - } - LWIP_ASSERT("tcp_input: pcb->next != pcb (after cache)", pcb->next != pcb); - break; - } - prev = pcb; - } - - if (pcb == NULL) { - /* If it did not go to an active connection, we check the connections - in the TIME-WAIT state. */ - for(pcb = tcp_tw_pcbs; pcb != NULL; pcb = pcb->next) { - LWIP_ASSERT("tcp_input: TIME-WAIT pcb->state == TIME-WAIT", pcb->state == TIME_WAIT); - if (pcb->remote_port == tcphdr->src && - pcb->local_port == tcphdr->dest && - IP_PCB_IPVER_INPUT_MATCH(pcb) && - ipX_addr_cmp(ip_current_is_v6(), &pcb->remote_ip, ipX_current_src_addr()) && - ipX_addr_cmp(ip_current_is_v6(),&pcb->local_ip, ipX_current_dest_addr())) { - /* We don't really care enough to move this PCB to the front - of the list since we are not very likely to receive that - many segments for connections in TIME-WAIT. */ - LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_input: packed for TIME_WAITing connection.\n")); - tcp_timewait_input(pcb); - pbuf_free(p); - return; - } - } - - /* Finally, if we still did not get a match, we check all PCBs that - are LISTENing for incoming connections. */ - prev = NULL; - struct tcp_pcb_listen *netif_pcb = NULL; - struct tcp_pcb *netif_pcb_prev = NULL; - for(lpcb = tcp_listen_pcbs.listen_pcbs; lpcb != NULL; lpcb = lpcb->next) { - if (lpcb->bound_to_netif) { - if (IP_PCB_IPVER_INPUT_MATCH(lpcb) && netif_is_named(inp, lpcb->local_netif)) { - netif_pcb = lpcb; - netif_pcb_prev = prev; - } - } - else if (lpcb->local_port == tcphdr->dest) { -#if LWIP_IPV6 - if (lpcb->accept_any_ip_version) { - /* found an ANY-match */ -#if SO_REUSE - lpcb_any = lpcb; - lpcb_prev = prev; -#else /* SO_REUSE */ - break; -#endif /* SO_REUSE */ - } else -#endif /* LWIP_IPV6 */ - if (IP_PCB_IPVER_INPUT_MATCH(lpcb)) { - if (ipX_addr_cmp(ip_current_is_v6(), &lpcb->local_ip, ipX_current_dest_addr())) { - /* found an exact match */ - break; - } else if (ipX_addr_isany(ip_current_is_v6(), &lpcb->local_ip)) { - /* found an ANY-match */ -#if SO_REUSE - lpcb_any = lpcb; - lpcb_prev = prev; -#else /* SO_REUSE */ - break; - #endif /* SO_REUSE */ - } - } - } - prev = (struct tcp_pcb *)lpcb; - } -#if SO_REUSE - /* first try specific local IP */ - if (lpcb == NULL) { - /* only pass to ANY if no specific local IP has been found */ - lpcb = lpcb_any; - prev = lpcb_prev; - } -#endif /* SO_REUSE */ - if (lpcb == NULL && netif_pcb) { - lpcb = netif_pcb; - prev = netif_pcb_prev; - } - if (lpcb != NULL) { - /* Move this PCB to the front of the list so that subsequent - lookups will be faster (we exploit locality in TCP segment - arrivals). */ - if (prev != NULL) { - ((struct tcp_pcb_listen *)prev)->next = lpcb->next; - /* our successor is the remainder of the listening list */ - lpcb->next = tcp_listen_pcbs.listen_pcbs; - /* put this listening pcb at the head of the listening list */ - tcp_listen_pcbs.listen_pcbs = lpcb; - } - - LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_input: packed for LISTENing connection.\n")); - tcp_listen_input(lpcb); - pbuf_free(p); - return; - } - } - -#if TCP_INPUT_DEBUG - LWIP_DEBUGF(TCP_INPUT_DEBUG, ("+-+-+-+-+-+-+-+-+-+-+-+-+-+- tcp_input: flags ")); - tcp_debug_print_flags(TCPH_FLAGS(tcphdr)); - LWIP_DEBUGF(TCP_INPUT_DEBUG, ("-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n")); -#endif /* TCP_INPUT_DEBUG */ - - - if (pcb != NULL) { - /* The incoming segment belongs to a connection. */ -#if TCP_INPUT_DEBUG -#if TCP_DEBUG - tcp_debug_print_state(pcb->state); -#endif /* TCP_DEBUG */ -#endif /* TCP_INPUT_DEBUG */ - - /* Set up a tcp_seg structure. */ - inseg.next = NULL; - inseg.len = p->tot_len; - inseg.p = p; - inseg.tcphdr = tcphdr; - - recv_data = NULL; - recv_flags = 0; - - if (flags & TCP_PSH) { - p->flags |= PBUF_FLAG_PUSH; - } - - /* If there is data which was previously "refused" by upper layer */ - if (pcb->refused_data != NULL) { - if ((tcp_process_refused_data(pcb) == ERR_ABRT) || - ((pcb->refused_data != NULL) && (tcplen > 0))) { - /* pcb has been aborted or refused data is still refused and the new - segment contains data */ - TCP_STATS_INC(tcp.drop); - snmp_inc_tcpinerrs(); - goto aborted; - } - } - tcp_input_pcb = pcb; - err = tcp_process(pcb); - /* A return value of ERR_ABRT means that tcp_abort() was called - and that the pcb has been freed. If so, we don't do anything. */ - if (err != ERR_ABRT) { - if (recv_flags & TF_RESET) { - /* TF_RESET means that the connection was reset by the other - end. We then call the error callback to inform the - application that the connection is dead before we - deallocate the PCB. */ - TCP_EVENT_ERR(pcb->errf, pcb->callback_arg, ERR_RST); - tcp_pcb_remove(&tcp_active_pcbs, pcb); - memp_free(MEMP_TCP_PCB, pcb); - } else if (recv_flags & TF_CLOSED) { - /* The connection has been closed and we will deallocate the - PCB. */ - if (!(pcb->flags & TF_RXCLOSED)) { - /* Connection closed although the application has only shut down the - tx side: call the PCB's err callback and indicate the closure to - ensure the application doesn't continue using the PCB. */ - TCP_EVENT_ERR(pcb->errf, pcb->callback_arg, ERR_CLSD); - } - tcp_pcb_remove(&tcp_active_pcbs, pcb); - memp_free(MEMP_TCP_PCB, pcb); - } else { - err = ERR_OK; - /* If the application has registered a "sent" function to be - called when new send buffer space is available, we call it - now. */ - if (pcb->acked > 0) { - TCP_EVENT_SENT(pcb, pcb->acked, err); - if (err == ERR_ABRT) { - goto aborted; - } - } - - if (recv_data != NULL) { - LWIP_ASSERT("pcb->refused_data == NULL", pcb->refused_data == NULL); - if (pcb->flags & TF_RXCLOSED) { - /* received data although already closed -> abort (send RST) to - notify the remote host that not all data has been processed */ - pbuf_free(recv_data); - tcp_abort(pcb); - goto aborted; - } - - /* Notify application that data has been received. */ - TCP_EVENT_RECV(pcb, recv_data, ERR_OK, err); - if (err == ERR_ABRT) { - goto aborted; - } - - /* If the upper layer can't receive this data, store it */ - if (err != ERR_OK) { - pcb->refused_data = recv_data; - LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_input: keep incoming packet, because pcb is \"full\"\n")); - } - } - - /* If a FIN segment was received, we call the callback - function with a NULL buffer to indicate EOF. */ - if (recv_flags & TF_GOT_FIN) { - if (pcb->refused_data != NULL) { - /* Delay this if we have refused data. */ - pcb->refused_data->flags |= PBUF_FLAG_TCP_FIN; - } else { - /* correct rcv_wnd as the application won't call tcp_recved() - for the FIN's seqno */ - if (pcb->rcv_wnd != TCP_WND) { - pcb->rcv_wnd++; - } - TCP_EVENT_CLOSED(pcb, err); - if (err == ERR_ABRT) { - goto aborted; - } - } - } - - tcp_input_pcb = NULL; - /* Try to send something out. */ - tcp_output(pcb); -#if TCP_INPUT_DEBUG -#if TCP_DEBUG - tcp_debug_print_state(pcb->state); -#endif /* TCP_DEBUG */ -#endif /* TCP_INPUT_DEBUG */ - } - } - /* Jump target if pcb has been aborted in a callback (by calling tcp_abort()). - Below this line, 'pcb' may not be dereferenced! */ -aborted: - tcp_input_pcb = NULL; - recv_data = NULL; - - /* give up our reference to inseg.p */ - if (inseg.p != NULL) - { - pbuf_free(inseg.p); - inseg.p = NULL; - } - } else { - - /* If no matching PCB was found, send a TCP RST (reset) to the - sender. */ - LWIP_DEBUGF(TCP_RST_DEBUG, ("tcp_input: no PCB match found, resetting.\n")); - if (!(TCPH_FLAGS(tcphdr) & TCP_RST)) { - TCP_STATS_INC(tcp.proterr); - TCP_STATS_INC(tcp.drop); - tcp_rst(ackno, seqno + tcplen, ipX_current_dest_addr(), - ipX_current_src_addr(), tcphdr->dest, tcphdr->src, ip_current_is_v6()); - } - pbuf_free(p); - } - - LWIP_ASSERT("tcp_input: tcp_pcbs_sane()", tcp_pcbs_sane()); - PERF_STOP("tcp_input"); - return; -dropped: - TCP_STATS_INC(tcp.drop); - snmp_inc_tcpinerrs(); - pbuf_free(p); -} - -/** - * Called by tcp_input() when a segment arrives for a listening - * connection (from tcp_input()). - * - * @param pcb the tcp_pcb_listen for which a segment arrived - * @return ERR_OK if the segment was processed - * another err_t on error - * - * @note the return value is not (yet?) used in tcp_input() - * @note the segment which arrived is saved in global variables, therefore only the pcb - * involved is passed as a parameter to this function - */ -static err_t -tcp_listen_input(struct tcp_pcb_listen *pcb) -{ - struct tcp_pcb *npcb; - err_t rc; - - if (flags & TCP_RST) { - /* An incoming RST should be ignored. Return. */ - return ERR_OK; - } - - /* In the LISTEN state, we check for incoming SYN segments, - creates a new PCB, and responds with a SYN|ACK. */ - if (flags & TCP_ACK) { - /* For incoming segments with the ACK flag set, respond with a - RST. */ - LWIP_DEBUGF(TCP_RST_DEBUG, ("tcp_listen_input: ACK in LISTEN, sending reset\n")); - tcp_rst(ackno, seqno + tcplen, ipX_current_dest_addr(), - ipX_current_src_addr(), tcphdr->dest, tcphdr->src, ip_current_is_v6()); - } else if (flags & TCP_SYN) { - LWIP_DEBUGF(TCP_DEBUG, ("TCP connection request %"U16_F" -> %"U16_F".\n", tcphdr->src, tcphdr->dest)); -#if TCP_LISTEN_BACKLOG - if (pcb->accepts_pending >= pcb->backlog) { - LWIP_DEBUGF(TCP_DEBUG, ("tcp_listen_input: listen backlog exceeded for port %"U16_F"\n", tcphdr->dest)); - return ERR_ABRT; - } -#endif /* TCP_LISTEN_BACKLOG */ - npcb = tcp_alloc(pcb->prio); - /* If a new PCB could not be created (probably due to lack of memory), - we don't do anything, but rely on the sender will retransmit the - SYN at a time when we have more memory available. */ - if (npcb == NULL) { - LWIP_DEBUGF(TCP_DEBUG, ("tcp_listen_input: could not allocate PCB\n")); - TCP_STATS_INC(tcp.memerr); - return ERR_MEM; - } -#if TCP_LISTEN_BACKLOG - pcb->accepts_pending++; -#endif /* TCP_LISTEN_BACKLOG */ - /* Set up the new PCB. */ -#if LWIP_IPV6 - PCB_ISIPV6(npcb) = ip_current_is_v6(); -#endif /* LWIP_IPV6 */ - ipX_addr_copy(ip_current_is_v6(), npcb->local_ip, *ipX_current_dest_addr()); - ipX_addr_copy(ip_current_is_v6(), npcb->remote_ip, *ipX_current_src_addr()); - npcb->bound_to_netif = pcb->bound_to_netif; - npcb->local_port = tcphdr->dest; - memcpy(npcb->local_netif, pcb->local_netif, sizeof(pcb->local_netif)); - npcb->remote_port = tcphdr->src; - npcb->state = SYN_RCVD; - npcb->rcv_nxt = seqno + 1; - npcb->rcv_ann_right_edge = npcb->rcv_nxt; - npcb->snd_wnd = tcphdr->wnd; - npcb->snd_wnd_max = tcphdr->wnd; - npcb->ssthresh = npcb->snd_wnd; - npcb->snd_wl1 = seqno - 1;/* initialise to seqno-1 to force window update */ - npcb->callback_arg = pcb->callback_arg; -#if LWIP_CALLBACK_API - npcb->accept = pcb->accept; -#endif /* LWIP_CALLBACK_API */ - /* inherit socket options */ - npcb->so_options = pcb->so_options & SOF_INHERITED; - /* Register the new PCB so that we can begin receiving segments - for it. */ - TCP_REG_ACTIVE(npcb); - - /* Parse any options in the SYN. */ - tcp_parseopt(npcb); -#if TCP_CALCULATE_EFF_SEND_MSS - npcb->mss = tcp_eff_send_mss(npcb->mss, &npcb->local_ip, - &npcb->remote_ip, PCB_ISIPV6(npcb)); -#endif /* TCP_CALCULATE_EFF_SEND_MSS */ - - snmp_inc_tcppassiveopens(); - - /* Send a SYN|ACK together with the MSS option. */ - rc = tcp_enqueue_flags(npcb, TCP_SYN | TCP_ACK); - if (rc != ERR_OK) { - tcp_abandon(npcb, 0); - return rc; - } - return tcp_output(npcb); - } - return ERR_OK; -} - -/** - * Called by tcp_input() when a segment arrives for a connection in - * TIME_WAIT. - * - * @param pcb the tcp_pcb for which a segment arrived - * - * @note the segment which arrived is saved in global variables, therefore only the pcb - * involved is passed as a parameter to this function - */ -static err_t -tcp_timewait_input(struct tcp_pcb *pcb) -{ - /* RFC 1337: in TIME_WAIT, ignore RST and ACK FINs + any 'acceptable' segments */ - /* RFC 793 3.9 Event Processing - Segment Arrives: - * - first check sequence number - we skip that one in TIME_WAIT (always - * acceptable since we only send ACKs) - * - second check the RST bit (... return) */ - if (flags & TCP_RST) { - return ERR_OK; - } - /* - fourth, check the SYN bit, */ - if (flags & TCP_SYN) { - /* If an incoming segment is not acceptable, an acknowledgment - should be sent in reply */ - if (TCP_SEQ_BETWEEN(seqno, pcb->rcv_nxt, pcb->rcv_nxt+pcb->rcv_wnd)) { - /* If the SYN is in the window it is an error, send a reset */ - tcp_rst(ackno, seqno + tcplen, ipX_current_dest_addr(), - ipX_current_src_addr(), tcphdr->dest, tcphdr->src, ip_current_is_v6()); - return ERR_OK; - } - } else if (flags & TCP_FIN) { - /* - eighth, check the FIN bit: Remain in the TIME-WAIT state. - Restart the 2 MSL time-wait timeout.*/ - pcb->tmr = tcp_ticks; - } - - if ((tcplen > 0)) { - /* Acknowledge data, FIN or out-of-window SYN */ - pcb->flags |= TF_ACK_NOW; - return tcp_output(pcb); - } - return ERR_OK; -} - -/** - * Implements the TCP state machine. Called by tcp_input. In some - * states tcp_receive() is called to receive data. The tcp_seg - * argument will be freed by the caller (tcp_input()) unless the - * recv_data pointer in the pcb is set. - * - * @param pcb the tcp_pcb for which a segment arrived - * - * @note the segment which arrived is saved in global variables, therefore only the pcb - * involved is passed as a parameter to this function - */ -static err_t -tcp_process(struct tcp_pcb *pcb) -{ - struct tcp_seg *rseg; - u8_t acceptable = 0; - err_t err; - - err = ERR_OK; - - /* Process incoming RST segments. */ - if (flags & TCP_RST) { - /* First, determine if the reset is acceptable. */ - if (pcb->state == SYN_SENT) { - if (ackno == pcb->snd_nxt) { - acceptable = 1; - } - } else { - if (TCP_SEQ_BETWEEN(seqno, pcb->rcv_nxt, - pcb->rcv_nxt+pcb->rcv_wnd)) { - acceptable = 1; - } - } - - if (acceptable) { - LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_process: Connection RESET\n")); - LWIP_ASSERT("tcp_input: pcb->state != CLOSED", pcb->state != CLOSED); - recv_flags |= TF_RESET; - pcb->flags &= ~TF_ACK_DELAY; - return ERR_RST; - } else { - LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_process: unacceptable reset seqno %"U32_F" rcv_nxt %"U32_F"\n", - seqno, pcb->rcv_nxt)); - LWIP_DEBUGF(TCP_DEBUG, ("tcp_process: unacceptable reset seqno %"U32_F" rcv_nxt %"U32_F"\n", - seqno, pcb->rcv_nxt)); - return ERR_OK; - } - } - - if ((flags & TCP_SYN) && (pcb->state != SYN_SENT && pcb->state != SYN_RCVD)) { - /* Cope with new connection attempt after remote end crashed */ - tcp_ack_now(pcb); - return ERR_OK; - } - - if ((pcb->flags & TF_RXCLOSED) == 0) { - /* Update the PCB (in)activity timer unless rx is closed (see tcp_shutdown) */ - pcb->tmr = tcp_ticks; - } - pcb->keep_cnt_sent = 0; - - tcp_parseopt(pcb); - - /* Do different things depending on the TCP state. */ - switch (pcb->state) { - case SYN_SENT: - LWIP_DEBUGF(TCP_INPUT_DEBUG, ("SYN-SENT: ackno %"U32_F" pcb->snd_nxt %"U32_F" unacked %"U32_F"\n", ackno, - pcb->snd_nxt, ntohl(pcb->unacked->tcphdr->seqno))); - /* received SYN ACK with expected sequence number? */ - if ((flags & TCP_ACK) && (flags & TCP_SYN) - && ackno == ntohl(pcb->unacked->tcphdr->seqno) + 1) { - pcb->snd_buf++; - pcb->rcv_nxt = seqno + 1; - pcb->rcv_ann_right_edge = pcb->rcv_nxt; - pcb->lastack = ackno; - pcb->snd_wnd = tcphdr->wnd; - pcb->snd_wnd_max = tcphdr->wnd; - pcb->snd_wl1 = seqno - 1; /* initialise to seqno - 1 to force window update */ - pcb->state = ESTABLISHED; - -#if TCP_CALCULATE_EFF_SEND_MSS - pcb->mss = tcp_eff_send_mss(pcb->mss, &pcb->local_ip, &pcb->remote_ip, - PCB_ISIPV6(pcb)); -#endif /* TCP_CALCULATE_EFF_SEND_MSS */ - - /* Set ssthresh again after changing pcb->mss (already set in tcp_connect - * but for the default value of pcb->mss) */ - pcb->ssthresh = pcb->mss * 10; - - pcb->cwnd = ((pcb->cwnd == 1) ? (pcb->mss * 2) : pcb->mss); - LWIP_ASSERT("pcb->snd_queuelen > 0", (pcb->snd_queuelen > 0)); - --pcb->snd_queuelen; - LWIP_DEBUGF(TCP_QLEN_DEBUG, ("tcp_process: SYN-SENT --queuelen %"U16_F"\n", (u16_t)pcb->snd_queuelen)); - rseg = pcb->unacked; - pcb->unacked = rseg->next; - tcp_seg_free(rseg); - - /* If there's nothing left to acknowledge, stop the retransmit - timer, otherwise reset it to start again */ - if(pcb->unacked == NULL) - pcb->rtime = -1; - else { - pcb->rtime = 0; - pcb->nrtx = 0; - } - - /* Call the user specified function to call when sucessfully - * connected. */ - TCP_EVENT_CONNECTED(pcb, ERR_OK, err); - if (err == ERR_ABRT) { - return ERR_ABRT; - } - tcp_ack_now(pcb); - } - /* received ACK? possibly a half-open connection */ - else if (flags & TCP_ACK) { - /* send a RST to bring the other side in a non-synchronized state. */ - tcp_rst(ackno, seqno + tcplen, ipX_current_dest_addr(), - ipX_current_src_addr(), tcphdr->dest, tcphdr->src, ip_current_is_v6()); - } - break; - case SYN_RCVD: - if (flags & TCP_ACK) { - /* expected ACK number? */ - if (TCP_SEQ_BETWEEN(ackno, pcb->lastack+1, pcb->snd_nxt)) { - u16_t old_cwnd; - pcb->state = ESTABLISHED; - LWIP_DEBUGF(TCP_DEBUG, ("TCP connection established %"U16_F" -> %"U16_F".\n", inseg.tcphdr->src, inseg.tcphdr->dest)); -#if LWIP_CALLBACK_API - LWIP_ASSERT("pcb->accept != NULL", pcb->accept != NULL); -#endif - /* Call the accept function. */ - TCP_EVENT_ACCEPT(pcb, ERR_OK, err); - if (err != ERR_OK) { - /* If the accept function returns with an error, we abort - * the connection. */ - /* Already aborted? */ - if (err != ERR_ABRT) { - tcp_abort(pcb); - } - return ERR_ABRT; - } - old_cwnd = pcb->cwnd; - /* If there was any data contained within this ACK, - * we'd better pass it on to the application as well. */ - tcp_receive(pcb); - - /* Prevent ACK for SYN to generate a sent event */ - if (pcb->acked != 0) { - pcb->acked--; - } - - pcb->cwnd = ((old_cwnd == 1) ? (pcb->mss * 2) : pcb->mss); - - if (recv_flags & TF_GOT_FIN) { - tcp_ack_now(pcb); - pcb->state = CLOSE_WAIT; - } - } else { - /* incorrect ACK number, send RST */ - tcp_rst(ackno, seqno + tcplen, ipX_current_dest_addr(), - ipX_current_src_addr(), tcphdr->dest, tcphdr->src, ip_current_is_v6()); - } - } else if ((flags & TCP_SYN) && (seqno == pcb->rcv_nxt - 1)) { - /* Looks like another copy of the SYN - retransmit our SYN-ACK */ - tcp_rexmit(pcb); - } - break; - case CLOSE_WAIT: - /* FALLTHROUGH */ - case ESTABLISHED: - tcp_receive(pcb); - if (recv_flags & TF_GOT_FIN) { /* passive close */ - tcp_ack_now(pcb); - pcb->state = CLOSE_WAIT; - } - break; - case FIN_WAIT_1: - tcp_receive(pcb); - if (recv_flags & TF_GOT_FIN) { - if ((flags & TCP_ACK) && (ackno == pcb->snd_nxt)) { - LWIP_DEBUGF(TCP_DEBUG, - ("TCP connection closed: FIN_WAIT_1 %"U16_F" -> %"U16_F".\n", inseg.tcphdr->src, inseg.tcphdr->dest)); - tcp_ack_now(pcb); - tcp_pcb_purge(pcb); - TCP_RMV_ACTIVE(pcb); - pcb->state = TIME_WAIT; - TCP_REG(&tcp_tw_pcbs, pcb); - } else { - tcp_ack_now(pcb); - pcb->state = CLOSING; - } - } else if ((flags & TCP_ACK) && (ackno == pcb->snd_nxt)) { - pcb->state = FIN_WAIT_2; - } - break; - case FIN_WAIT_2: - tcp_receive(pcb); - if (recv_flags & TF_GOT_FIN) { - LWIP_DEBUGF(TCP_DEBUG, ("TCP connection closed: FIN_WAIT_2 %"U16_F" -> %"U16_F".\n", inseg.tcphdr->src, inseg.tcphdr->dest)); - tcp_ack_now(pcb); - tcp_pcb_purge(pcb); - TCP_RMV_ACTIVE(pcb); - pcb->state = TIME_WAIT; - TCP_REG(&tcp_tw_pcbs, pcb); - } - break; - case CLOSING: - tcp_receive(pcb); - if (flags & TCP_ACK && ackno == pcb->snd_nxt) { - LWIP_DEBUGF(TCP_DEBUG, ("TCP connection closed: CLOSING %"U16_F" -> %"U16_F".\n", inseg.tcphdr->src, inseg.tcphdr->dest)); - tcp_pcb_purge(pcb); - TCP_RMV_ACTIVE(pcb); - pcb->state = TIME_WAIT; - TCP_REG(&tcp_tw_pcbs, pcb); - } - break; - case LAST_ACK: - tcp_receive(pcb); - if (flags & TCP_ACK && ackno == pcb->snd_nxt) { - LWIP_DEBUGF(TCP_DEBUG, ("TCP connection closed: LAST_ACK %"U16_F" -> %"U16_F".\n", inseg.tcphdr->src, inseg.tcphdr->dest)); - /* bugfix #21699: don't set pcb->state to CLOSED here or we risk leaking segments */ - recv_flags |= TF_CLOSED; - } - break; - default: - break; - } - return ERR_OK; -} - -#if TCP_QUEUE_OOSEQ -/** - * Insert segment into the list (segments covered with new one will be deleted) - * - * Called from tcp_receive() - */ -static void -tcp_oos_insert_segment(struct tcp_seg *cseg, struct tcp_seg *next) -{ - struct tcp_seg *old_seg; - - if (TCPH_FLAGS(cseg->tcphdr) & TCP_FIN) { - /* received segment overlaps all following segments */ - tcp_segs_free(next); - next = NULL; - } - else { - /* delete some following segments - oos queue may have segments with FIN flag */ - while (next && - TCP_SEQ_GEQ((seqno + cseg->len), - (next->tcphdr->seqno + next->len))) { - /* cseg with FIN already processed */ - if (TCPH_FLAGS(next->tcphdr) & TCP_FIN) { - TCPH_SET_FLAG(cseg->tcphdr, TCP_FIN); - } - old_seg = next; - next = next->next; - tcp_seg_free(old_seg); - } - if (next && - TCP_SEQ_GT(seqno + cseg->len, next->tcphdr->seqno)) { - /* We need to trim the incoming segment. */ - cseg->len = (u16_t)(next->tcphdr->seqno - seqno); - pbuf_realloc(cseg->p, cseg->len); - } - } - cseg->next = next; -} -#endif /* TCP_QUEUE_OOSEQ */ - -/** - * Called by tcp_process. Checks if the given segment is an ACK for outstanding - * data, and if so frees the memory of the buffered data. Next, is places the - * segment on any of the receive queues (pcb->recved or pcb->ooseq). If the segment - * is buffered, the pbuf is referenced by pbuf_ref so that it will not be freed until - * it has been removed from the buffer. - * - * If the incoming segment constitutes an ACK for a segment that was used for RTT - * estimation, the RTT is estimated here as well. - * - * Called from tcp_process(). - */ -static void -tcp_receive(struct tcp_pcb *pcb) -{ - struct tcp_seg *next; -#if TCP_QUEUE_OOSEQ - struct tcp_seg *prev, *cseg; -#endif /* TCP_QUEUE_OOSEQ */ - struct pbuf *p; - s32_t off; - s16_t m; - u32_t right_wnd_edge; - u16_t new_tot_len; - int found_dupack = 0; -#if TCP_OOSEQ_MAX_BYTES || TCP_OOSEQ_MAX_PBUFS - u32_t ooseq_blen; - u16_t ooseq_qlen; -#endif /* TCP_OOSEQ_MAX_BYTES || TCP_OOSEQ_MAX_PBUFS */ - - LWIP_ASSERT("tcp_receive: wrong state", pcb->state >= ESTABLISHED); - - if (flags & TCP_ACK) { - right_wnd_edge = pcb->snd_wnd + pcb->snd_wl2; - - /* Update window. */ - if (TCP_SEQ_LT(pcb->snd_wl1, seqno) || - (pcb->snd_wl1 == seqno && TCP_SEQ_LT(pcb->snd_wl2, ackno)) || - (pcb->snd_wl2 == ackno && tcphdr->wnd > pcb->snd_wnd)) { - pcb->snd_wnd = tcphdr->wnd; - /* keep track of the biggest window announced by the remote host to calculate - the maximum segment size */ - if (pcb->snd_wnd_max < tcphdr->wnd) { - pcb->snd_wnd_max = tcphdr->wnd; - } - pcb->snd_wl1 = seqno; - pcb->snd_wl2 = ackno; - if (pcb->snd_wnd == 0) { - if (pcb->persist_backoff == 0) { - /* start persist timer */ - pcb->persist_cnt = 0; - pcb->persist_backoff = 1; - } - } else if (pcb->persist_backoff > 0) { - /* stop persist timer */ - pcb->persist_backoff = 0; - } - LWIP_DEBUGF(TCP_WND_DEBUG, ("tcp_receive: window update %"U16_F"\n", pcb->snd_wnd)); -#if TCP_WND_DEBUG - } else { - if (pcb->snd_wnd != tcphdr->wnd) { - LWIP_DEBUGF(TCP_WND_DEBUG, - ("tcp_receive: no window update lastack %"U32_F" ackno %" - U32_F" wl1 %"U32_F" seqno %"U32_F" wl2 %"U32_F"\n", - pcb->lastack, ackno, pcb->snd_wl1, seqno, pcb->snd_wl2)); - } -#endif /* TCP_WND_DEBUG */ - } - - /* (From Stevens TCP/IP Illustrated Vol II, p970.) Its only a - * duplicate ack if: - * 1) It doesn't ACK new data - * 2) length of received packet is zero (i.e. no payload) - * 3) the advertised window hasn't changed - * 4) There is outstanding unacknowledged data (retransmission timer running) - * 5) The ACK is == biggest ACK sequence number so far seen (snd_una) - * - * If it passes all five, should process as a dupack: - * a) dupacks < 3: do nothing - * b) dupacks == 3: fast retransmit - * c) dupacks > 3: increase cwnd - * - * If it only passes 1-3, should reset dupack counter (and add to - * stats, which we don't do in lwIP) - * - * If it only passes 1, should reset dupack counter - * - */ - - /* Clause 1 */ - if (TCP_SEQ_LEQ(ackno, pcb->lastack)) { - pcb->acked = 0; - /* Clause 2 */ - if (tcplen == 0) { - /* Clause 3 */ - if (pcb->snd_wl2 + pcb->snd_wnd == right_wnd_edge){ - /* Clause 4 */ - if (pcb->rtime >= 0) { - /* Clause 5 */ - if (pcb->lastack == ackno) { - found_dupack = 1; - if ((u8_t)(pcb->dupacks + 1) > pcb->dupacks) { - ++pcb->dupacks; - } - if (pcb->dupacks > 3) { - /* Inflate the congestion window, but not if it means that - the value overflows. */ - if ((u16_t)(pcb->cwnd + pcb->mss) > pcb->cwnd) { - pcb->cwnd += pcb->mss; - } - } else if (pcb->dupacks == 3) { - /* Do fast retransmit */ - tcp_rexmit_fast(pcb); - } - } - } - } - } - /* If Clause (1) or more is true, but not a duplicate ack, reset - * count of consecutive duplicate acks */ - if (!found_dupack) { - pcb->dupacks = 0; - } - } else if (TCP_SEQ_BETWEEN(ackno, pcb->lastack+1, pcb->snd_nxt)){ - /* We come here when the ACK acknowledges new data. */ - - /* Reset the "IN Fast Retransmit" flag, since we are no longer - in fast retransmit. Also reset the congestion window to the - slow start threshold. */ - if (pcb->flags & TF_INFR) { - pcb->flags &= ~TF_INFR; - pcb->cwnd = pcb->ssthresh; - } - - /* Reset the number of retransmissions. */ - pcb->nrtx = 0; - - /* Reset the retransmission time-out. */ - pcb->rto = (pcb->sa >> 3) + pcb->sv; - - /* Update the send buffer space. Diff between the two can never exceed 64K? */ - pcb->acked = (u16_t)(ackno - pcb->lastack); - - pcb->snd_buf += pcb->acked; - - /* Reset the fast retransmit variables. */ - pcb->dupacks = 0; - pcb->lastack = ackno; - - /* Update the congestion control variables (cwnd and - ssthresh). */ - if (pcb->state >= ESTABLISHED) { - if (pcb->cwnd < pcb->ssthresh) { - if ((u16_t)(pcb->cwnd + pcb->mss) > pcb->cwnd) { - pcb->cwnd += pcb->mss; - } - LWIP_DEBUGF(TCP_CWND_DEBUG, ("tcp_receive: slow start cwnd %"U16_F"\n", pcb->cwnd)); - } else { - u16_t new_cwnd = (pcb->cwnd + pcb->mss * pcb->mss / pcb->cwnd); - if (new_cwnd > pcb->cwnd) { - pcb->cwnd = new_cwnd; - } - LWIP_DEBUGF(TCP_CWND_DEBUG, ("tcp_receive: congestion avoidance cwnd %"U16_F"\n", pcb->cwnd)); - } - } - LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_receive: ACK for %"U32_F", unacked->seqno %"U32_F":%"U32_F"\n", - ackno, - pcb->unacked != NULL? - ntohl(pcb->unacked->tcphdr->seqno): 0, - pcb->unacked != NULL? - ntohl(pcb->unacked->tcphdr->seqno) + TCP_TCPLEN(pcb->unacked): 0)); - - /* Remove segment from the unacknowledged list if the incoming - ACK acknowlegdes them. */ - while (pcb->unacked != NULL && - TCP_SEQ_LEQ(ntohl(pcb->unacked->tcphdr->seqno) + - TCP_TCPLEN(pcb->unacked), ackno)) { - LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_receive: removing %"U32_F":%"U32_F" from pcb->unacked\n", - ntohl(pcb->unacked->tcphdr->seqno), - ntohl(pcb->unacked->tcphdr->seqno) + - TCP_TCPLEN(pcb->unacked))); - - next = pcb->unacked; - pcb->unacked = pcb->unacked->next; - - LWIP_DEBUGF(TCP_QLEN_DEBUG, ("tcp_receive: queuelen %"U16_F" ... ", (u16_t)pcb->snd_queuelen)); - LWIP_ASSERT("pcb->snd_queuelen >= pbuf_clen(next->p)", (pcb->snd_queuelen >= pbuf_clen(next->p))); - /* Prevent ACK for FIN to generate a sent event */ - if ((pcb->acked != 0) && ((TCPH_FLAGS(next->tcphdr) & TCP_FIN) != 0)) { - pcb->acked--; - } - - pcb->snd_queuelen -= pbuf_clen(next->p); - tcp_seg_free(next); - - LWIP_DEBUGF(TCP_QLEN_DEBUG, ("%"U16_F" (after freeing unacked)\n", (u16_t)pcb->snd_queuelen)); - if (pcb->snd_queuelen != 0) { - LWIP_ASSERT("tcp_receive: valid queue length", pcb->unacked != NULL || - pcb->unsent != NULL); - } - } - - /* If there's nothing left to acknowledge, stop the retransmit - timer, otherwise reset it to start again */ - if(pcb->unacked == NULL) - pcb->rtime = -1; - else - pcb->rtime = 0; - - pcb->polltmr = 0; - -#if LWIP_IPV6 && LWIP_ND6_TCP_REACHABILITY_HINTS - if (PCB_ISIPV6(pcb)) { - /* Inform neighbor reachability of forward progress. */ - nd6_reachability_hint(ip6_current_src_addr()); - } -#endif /* LWIP_IPV6 && LWIP_ND6_TCP_REACHABILITY_HINTS*/ - } else { - /* Fix bug bug #21582: out of sequence ACK, didn't really ack anything */ - pcb->acked = 0; - } - - /* We go through the ->unsent list to see if any of the segments - on the list are acknowledged by the ACK. This may seem - strange since an "unsent" segment shouldn't be acked. The - rationale is that lwIP puts all outstanding segments on the - ->unsent list after a retransmission, so these segments may - in fact have been sent once. */ - while (pcb->unsent != NULL && - TCP_SEQ_BETWEEN(ackno, ntohl(pcb->unsent->tcphdr->seqno) + - TCP_TCPLEN(pcb->unsent), pcb->snd_nxt)) { - LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_receive: removing %"U32_F":%"U32_F" from pcb->unsent\n", - ntohl(pcb->unsent->tcphdr->seqno), ntohl(pcb->unsent->tcphdr->seqno) + - TCP_TCPLEN(pcb->unsent))); - - next = pcb->unsent; - pcb->unsent = pcb->unsent->next; -#if TCP_OVERSIZE - if (pcb->unsent == NULL) { - pcb->unsent_oversize = 0; - } -#endif /* TCP_OVERSIZE */ - LWIP_DEBUGF(TCP_QLEN_DEBUG, ("tcp_receive: queuelen %"U16_F" ... ", (u16_t)pcb->snd_queuelen)); - LWIP_ASSERT("pcb->snd_queuelen >= pbuf_clen(next->p)", (pcb->snd_queuelen >= pbuf_clen(next->p))); - /* Prevent ACK for FIN to generate a sent event */ - if ((pcb->acked != 0) && ((TCPH_FLAGS(next->tcphdr) & TCP_FIN) != 0)) { - pcb->acked--; - } - pcb->snd_queuelen -= pbuf_clen(next->p); - tcp_seg_free(next); - LWIP_DEBUGF(TCP_QLEN_DEBUG, ("%"U16_F" (after freeing unsent)\n", (u16_t)pcb->snd_queuelen)); - if (pcb->snd_queuelen != 0) { - LWIP_ASSERT("tcp_receive: valid queue length", - pcb->unacked != NULL || pcb->unsent != NULL); - } - } - /* End of ACK for new data processing. */ - - LWIP_DEBUGF(TCP_RTO_DEBUG, ("tcp_receive: pcb->rttest %"U32_F" rtseq %"U32_F" ackno %"U32_F"\n", - pcb->rttest, pcb->rtseq, ackno)); - - /* RTT estimation calculations. This is done by checking if the - incoming segment acknowledges the segment we use to take a - round-trip time measurement. */ - if (pcb->rttest && TCP_SEQ_LT(pcb->rtseq, ackno)) { - /* diff between this shouldn't exceed 32K since this are tcp timer ticks - and a round-trip shouldn't be that long... */ - m = (s16_t)(tcp_ticks - pcb->rttest); - - LWIP_DEBUGF(TCP_RTO_DEBUG, ("tcp_receive: experienced rtt %"U16_F" ticks (%"U16_F" msec).\n", - m, m * TCP_SLOW_INTERVAL)); - - /* This is taken directly from VJs original code in his paper */ - m = m - (pcb->sa >> 3); - pcb->sa += m; - if (m < 0) { - m = -m; - } - m = m - (pcb->sv >> 2); - pcb->sv += m; - pcb->rto = (pcb->sa >> 3) + pcb->sv; - - LWIP_DEBUGF(TCP_RTO_DEBUG, ("tcp_receive: RTO %"U16_F" (%"U16_F" milliseconds)\n", - pcb->rto, pcb->rto * TCP_SLOW_INTERVAL)); - - pcb->rttest = 0; - } - } - - /* If the incoming segment contains data, we must process it - further unless the pcb already received a FIN. - (RFC 793, chapeter 3.9, "SEGMENT ARRIVES" in states CLOSE-WAIT, CLOSING, - LAST-ACK and TIME-WAIT: "Ignore the segment text.") */ - if ((tcplen > 0) && (pcb->state < CLOSE_WAIT)) { - /* This code basically does three things: - - +) If the incoming segment contains data that is the next - in-sequence data, this data is passed to the application. This - might involve trimming the first edge of the data. The rcv_nxt - variable and the advertised window are adjusted. - - +) If the incoming segment has data that is above the next - sequence number expected (->rcv_nxt), the segment is placed on - the ->ooseq queue. This is done by finding the appropriate - place in the ->ooseq queue (which is ordered by sequence - number) and trim the segment in both ends if needed. An - immediate ACK is sent to indicate that we received an - out-of-sequence segment. - - +) Finally, we check if the first segment on the ->ooseq queue - now is in sequence (i.e., if rcv_nxt >= ooseq->seqno). If - rcv_nxt > ooseq->seqno, we must trim the first edge of the - segment on ->ooseq before we adjust rcv_nxt. The data in the - segments that are now on sequence are chained onto the - incoming segment so that we only need to call the application - once. - */ - - /* First, we check if we must trim the first edge. We have to do - this if the sequence number of the incoming segment is less - than rcv_nxt, and the sequence number plus the length of the - segment is larger than rcv_nxt. */ - /* if (TCP_SEQ_LT(seqno, pcb->rcv_nxt)){ - if (TCP_SEQ_LT(pcb->rcv_nxt, seqno + tcplen)) {*/ - if (TCP_SEQ_BETWEEN(pcb->rcv_nxt, seqno + 1, seqno + tcplen - 1)){ - /* Trimming the first edge is done by pushing the payload - pointer in the pbuf downwards. This is somewhat tricky since - we do not want to discard the full contents of the pbuf up to - the new starting point of the data since we have to keep the - TCP header which is present in the first pbuf in the chain. - - What is done is really quite a nasty hack: the first pbuf in - the pbuf chain is pointed to by inseg.p. Since we need to be - able to deallocate the whole pbuf, we cannot change this - inseg.p pointer to point to any of the later pbufs in the - chain. Instead, we point the ->payload pointer in the first - pbuf to data in one of the later pbufs. We also set the - inseg.data pointer to point to the right place. This way, the - ->p pointer will still point to the first pbuf, but the - ->p->payload pointer will point to data in another pbuf. - - After we are done with adjusting the pbuf pointers we must - adjust the ->data pointer in the seg and the segment - length.*/ - - off = pcb->rcv_nxt - seqno; - p = inseg.p; - LWIP_ASSERT("inseg.p != NULL", inseg.p); - LWIP_ASSERT("insane offset!", (off < 0x7fff)); - if (inseg.p->len < off) { - LWIP_ASSERT("pbuf too short!", (((s32_t)inseg.p->tot_len) >= off)); - new_tot_len = (u16_t)(inseg.p->tot_len - off); - while (p->len < off) { - off -= p->len; - /* KJM following line changed (with addition of new_tot_len var) - to fix bug #9076 - inseg.p->tot_len -= p->len; */ - p->tot_len = new_tot_len; - p->len = 0; - p = p->next; - } - if(pbuf_header(p, (s16_t)-off)) { - /* Do we need to cope with this failing? Assert for now */ - LWIP_ASSERT("pbuf_header failed", 0); - } - } else { - if(pbuf_header(inseg.p, (s16_t)-off)) { - /* Do we need to cope with this failing? Assert for now */ - LWIP_ASSERT("pbuf_header failed", 0); - } - } - inseg.len -= (u16_t)(pcb->rcv_nxt - seqno); - inseg.tcphdr->seqno = seqno = pcb->rcv_nxt; - } - else { - if (TCP_SEQ_LT(seqno, pcb->rcv_nxt)){ - /* the whole segment is < rcv_nxt */ - /* must be a duplicate of a packet that has already been correctly handled */ - - LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_receive: duplicate seqno %"U32_F"\n", seqno)); - tcp_ack_now(pcb); - } - } - - /* The sequence number must be within the window (above rcv_nxt - and below rcv_nxt + rcv_wnd) in order to be further - processed. */ - if (TCP_SEQ_BETWEEN(seqno, pcb->rcv_nxt, - pcb->rcv_nxt + pcb->rcv_wnd - 1)){ - if (pcb->rcv_nxt == seqno) { - /* The incoming segment is the next in sequence. We check if - we have to trim the end of the segment and update rcv_nxt - and pass the data to the application. */ - tcplen = TCP_TCPLEN(&inseg); - - if (tcplen > pcb->rcv_wnd) { - LWIP_DEBUGF(TCP_INPUT_DEBUG, - ("tcp_receive: other end overran receive window" - "seqno %"U32_F" len %"U16_F" right edge %"U32_F"\n", - seqno, tcplen, pcb->rcv_nxt + pcb->rcv_wnd)); - if (TCPH_FLAGS(inseg.tcphdr) & TCP_FIN) { - /* Must remove the FIN from the header as we're trimming - * that byte of sequence-space from the packet */ - TCPH_FLAGS_SET(inseg.tcphdr, TCPH_FLAGS(inseg.tcphdr) &~ TCP_FIN); - } - /* Adjust length of segment to fit in the window. */ - inseg.len = pcb->rcv_wnd; - if (TCPH_FLAGS(inseg.tcphdr) & TCP_SYN) { - inseg.len -= 1; - } - pbuf_realloc(inseg.p, inseg.len); - tcplen = TCP_TCPLEN(&inseg); - LWIP_ASSERT("tcp_receive: segment not trimmed correctly to rcv_wnd\n", - (seqno + tcplen) == (pcb->rcv_nxt + pcb->rcv_wnd)); - } -#if TCP_QUEUE_OOSEQ - /* Received in-sequence data, adjust ooseq data if: - - FIN has been received or - - inseq overlaps with ooseq */ - if (pcb->ooseq != NULL) { - if (TCPH_FLAGS(inseg.tcphdr) & TCP_FIN) { - LWIP_DEBUGF(TCP_INPUT_DEBUG, - ("tcp_receive: received in-order FIN, binning ooseq queue\n")); - /* Received in-order FIN means anything that was received - * out of order must now have been received in-order, so - * bin the ooseq queue */ - while (pcb->ooseq != NULL) { - struct tcp_seg *old_ooseq = pcb->ooseq; - pcb->ooseq = pcb->ooseq->next; - tcp_seg_free(old_ooseq); - } - } else { - next = pcb->ooseq; - /* Remove all segments on ooseq that are covered by inseg already. - * FIN is copied from ooseq to inseg if present. */ - while (next && - TCP_SEQ_GEQ(seqno + tcplen, - next->tcphdr->seqno + next->len)) { - /* inseg cannot have FIN here (already processed above) */ - if (TCPH_FLAGS(next->tcphdr) & TCP_FIN && - (TCPH_FLAGS(inseg.tcphdr) & TCP_SYN) == 0) { - TCPH_SET_FLAG(inseg.tcphdr, TCP_FIN); - tcplen = TCP_TCPLEN(&inseg); - } - prev = next; - next = next->next; - tcp_seg_free(prev); - } - /* Now trim right side of inseg if it overlaps with the first - * segment on ooseq */ - if (next && - TCP_SEQ_GT(seqno + tcplen, - next->tcphdr->seqno)) { - /* inseg cannot have FIN here (already processed above) */ - inseg.len = (u16_t)(next->tcphdr->seqno - seqno); - if (TCPH_FLAGS(inseg.tcphdr) & TCP_SYN) { - inseg.len -= 1; - } - pbuf_realloc(inseg.p, inseg.len); - tcplen = TCP_TCPLEN(&inseg); - LWIP_ASSERT("tcp_receive: segment not trimmed correctly to ooseq queue\n", - (seqno + tcplen) == next->tcphdr->seqno); - } - pcb->ooseq = next; - } - } -#endif /* TCP_QUEUE_OOSEQ */ - - pcb->rcv_nxt = seqno + tcplen; - - /* Update the receiver's (our) window. */ - LWIP_ASSERT("tcp_receive: tcplen > rcv_wnd\n", pcb->rcv_wnd >= tcplen); - pcb->rcv_wnd -= tcplen; - - tcp_update_rcv_ann_wnd(pcb); - - /* If there is data in the segment, we make preparations to - pass this up to the application. The ->recv_data variable - is used for holding the pbuf that goes to the - application. The code for reassembling out-of-sequence data - chains its data on this pbuf as well. - - If the segment was a FIN, we set the TF_GOT_FIN flag that will - be used to indicate to the application that the remote side has - closed its end of the connection. */ - if (inseg.p->tot_len > 0) { - recv_data = inseg.p; - /* Since this pbuf now is the responsibility of the - application, we delete our reference to it so that we won't - (mistakingly) deallocate it. */ - inseg.p = NULL; - } - if (TCPH_FLAGS(inseg.tcphdr) & TCP_FIN) { - LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_receive: received FIN.\n")); - recv_flags |= TF_GOT_FIN; - } - -#if TCP_QUEUE_OOSEQ - /* We now check if we have segments on the ->ooseq queue that - are now in sequence. */ - while (pcb->ooseq != NULL && - pcb->ooseq->tcphdr->seqno == pcb->rcv_nxt) { - - cseg = pcb->ooseq; - seqno = pcb->ooseq->tcphdr->seqno; - - pcb->rcv_nxt += TCP_TCPLEN(cseg); - LWIP_ASSERT("tcp_receive: ooseq tcplen > rcv_wnd\n", - pcb->rcv_wnd >= TCP_TCPLEN(cseg)); - pcb->rcv_wnd -= TCP_TCPLEN(cseg); - - tcp_update_rcv_ann_wnd(pcb); - - if (cseg->p->tot_len > 0) { - /* Chain this pbuf onto the pbuf that we will pass to - the application. */ - if (recv_data) { - pbuf_cat(recv_data, cseg->p); - } else { - recv_data = cseg->p; - } - cseg->p = NULL; - } - if (TCPH_FLAGS(cseg->tcphdr) & TCP_FIN) { - LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_receive: dequeued FIN.\n")); - recv_flags |= TF_GOT_FIN; - if (pcb->state == ESTABLISHED) { /* force passive close or we can move to active close */ - pcb->state = CLOSE_WAIT; - } - } - - pcb->ooseq = cseg->next; - tcp_seg_free(cseg); - } -#endif /* TCP_QUEUE_OOSEQ */ - - - /* Acknowledge the segment(s). */ - tcp_ack(pcb); - -#if LWIP_IPV6 && LWIP_ND6_TCP_REACHABILITY_HINTS - if (PCB_ISIPV6(pcb)) { - /* Inform neighbor reachability of forward progress. */ - nd6_reachability_hint(ip6_current_src_addr()); - } -#endif /* LWIP_IPV6 && LWIP_ND6_TCP_REACHABILITY_HINTS*/ - - } else { - /* We get here if the incoming segment is out-of-sequence. */ - tcp_send_empty_ack(pcb); -#if TCP_QUEUE_OOSEQ - /* We queue the segment on the ->ooseq queue. */ - if (pcb->ooseq == NULL) { - pcb->ooseq = tcp_seg_copy(&inseg); - } else { - /* If the queue is not empty, we walk through the queue and - try to find a place where the sequence number of the - incoming segment is between the sequence numbers of the - previous and the next segment on the ->ooseq queue. That is - the place where we put the incoming segment. If needed, we - trim the second edges of the previous and the incoming - segment so that it will fit into the sequence. - - If the incoming segment has the same sequence number as a - segment on the ->ooseq queue, we discard the segment that - contains less data. */ - - prev = NULL; - for(next = pcb->ooseq; next != NULL; next = next->next) { - if (seqno == next->tcphdr->seqno) { - /* The sequence number of the incoming segment is the - same as the sequence number of the segment on - ->ooseq. We check the lengths to see which one to - discard. */ - if (inseg.len > next->len) { - /* The incoming segment is larger than the old - segment. We replace some segments with the new - one. */ - cseg = tcp_seg_copy(&inseg); - if (cseg != NULL) { - if (prev != NULL) { - prev->next = cseg; - } else { - pcb->ooseq = cseg; - } - tcp_oos_insert_segment(cseg, next); - } - break; - } else { - /* Either the lenghts are the same or the incoming - segment was smaller than the old one; in either - case, we ditch the incoming segment. */ - break; - } - } else { - if (prev == NULL) { - if (TCP_SEQ_LT(seqno, next->tcphdr->seqno)) { - /* The sequence number of the incoming segment is lower - than the sequence number of the first segment on the - queue. We put the incoming segment first on the - queue. */ - cseg = tcp_seg_copy(&inseg); - if (cseg != NULL) { - pcb->ooseq = cseg; - tcp_oos_insert_segment(cseg, next); - } - break; - } - } else { - /*if (TCP_SEQ_LT(prev->tcphdr->seqno, seqno) && - TCP_SEQ_LT(seqno, next->tcphdr->seqno)) {*/ - if (TCP_SEQ_BETWEEN(seqno, prev->tcphdr->seqno+1, next->tcphdr->seqno-1)) { - /* The sequence number of the incoming segment is in - between the sequence numbers of the previous and - the next segment on ->ooseq. We trim trim the previous - segment, delete next segments that included in received segment - and trim received, if needed. */ - cseg = tcp_seg_copy(&inseg); - if (cseg != NULL) { - if (TCP_SEQ_GT(prev->tcphdr->seqno + prev->len, seqno)) { - /* We need to trim the prev segment. */ - prev->len = (u16_t)(seqno - prev->tcphdr->seqno); - pbuf_realloc(prev->p, prev->len); - } - prev->next = cseg; - tcp_oos_insert_segment(cseg, next); - } - break; - } - } - /* If the "next" segment is the last segment on the - ooseq queue, we add the incoming segment to the end - of the list. */ - if (next->next == NULL && - TCP_SEQ_GT(seqno, next->tcphdr->seqno)) { - if (TCPH_FLAGS(next->tcphdr) & TCP_FIN) { - /* segment "next" already contains all data */ - break; - } - next->next = tcp_seg_copy(&inseg); - if (next->next != NULL) { - if (TCP_SEQ_GT(next->tcphdr->seqno + next->len, seqno)) { - /* We need to trim the last segment. */ - next->len = (u16_t)(seqno - next->tcphdr->seqno); - pbuf_realloc(next->p, next->len); - } - /* check if the remote side overruns our receive window */ - if ((u32_t)tcplen + seqno > pcb->rcv_nxt + (u32_t)pcb->rcv_wnd) { - LWIP_DEBUGF(TCP_INPUT_DEBUG, - ("tcp_receive: other end overran receive window" - "seqno %"U32_F" len %"U16_F" right edge %"U32_F"\n", - seqno, tcplen, pcb->rcv_nxt + pcb->rcv_wnd)); - if (TCPH_FLAGS(next->next->tcphdr) & TCP_FIN) { - /* Must remove the FIN from the header as we're trimming - * that byte of sequence-space from the packet */ - TCPH_FLAGS_SET(next->next->tcphdr, TCPH_FLAGS(next->next->tcphdr) &~ TCP_FIN); - } - /* Adjust length of segment to fit in the window. */ - next->next->len = pcb->rcv_nxt + pcb->rcv_wnd - seqno; - pbuf_realloc(next->next->p, next->next->len); - tcplen = TCP_TCPLEN(next->next); - LWIP_ASSERT("tcp_receive: segment not trimmed correctly to rcv_wnd\n", - (seqno + tcplen) == (pcb->rcv_nxt + pcb->rcv_wnd)); - } - } - break; - } - } - prev = next; - } - } -#if TCP_OOSEQ_MAX_BYTES || TCP_OOSEQ_MAX_PBUFS - /* Check that the data on ooseq doesn't exceed one of the limits - and throw away everything above that limit. */ - ooseq_blen = 0; - ooseq_qlen = 0; - prev = NULL; - for(next = pcb->ooseq; next != NULL; prev = next, next = next->next) { - struct pbuf *p = next->p; - ooseq_blen += p->tot_len; - ooseq_qlen += pbuf_clen(p); - if ((ooseq_blen > TCP_OOSEQ_MAX_BYTES) || - (ooseq_qlen > TCP_OOSEQ_MAX_PBUFS)) { - /* too much ooseq data, dump this and everything after it */ - tcp_segs_free(next); - if (prev == NULL) { - /* first ooseq segment is too much, dump the whole queue */ - pcb->ooseq = NULL; - } else { - /* just dump 'next' and everything after it */ - prev->next = NULL; - } - break; - } - } -#endif /* TCP_OOSEQ_MAX_BYTES || TCP_OOSEQ_MAX_PBUFS */ -#endif /* TCP_QUEUE_OOSEQ */ - } - } else { - /* The incoming segment is not withing the window. */ - tcp_send_empty_ack(pcb); - } - } else { - /* Segments with length 0 is taken care of here. Segments that - fall out of the window are ACKed. */ - /*if (TCP_SEQ_GT(pcb->rcv_nxt, seqno) || - TCP_SEQ_GEQ(seqno, pcb->rcv_nxt + pcb->rcv_wnd)) {*/ - if(!TCP_SEQ_BETWEEN(seqno, pcb->rcv_nxt, pcb->rcv_nxt + pcb->rcv_wnd-1)){ - tcp_ack_now(pcb); - } - } -} - -/** - * Parses the options contained in the incoming segment. - * - * Called from tcp_listen_input() and tcp_process(). - * Currently, only the MSS option is supported! - * - * @param pcb the tcp_pcb for which a segment arrived - */ -static void -tcp_parseopt(struct tcp_pcb *pcb) -{ - u16_t c, max_c; - u16_t mss; - u8_t *opts, opt; -#if LWIP_TCP_TIMESTAMPS - u32_t tsval; -#endif - - opts = (u8_t *)tcphdr + TCP_HLEN; - - /* Parse the TCP MSS option, if present. */ - if(TCPH_HDRLEN(tcphdr) > 0x5) { - max_c = (TCPH_HDRLEN(tcphdr) - 5) << 2; - for (c = 0; c < max_c; ) { - opt = opts[c]; - switch (opt) { - case 0x00: - /* End of options. */ - LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_parseopt: EOL\n")); - return; - case 0x01: - /* NOP option. */ - ++c; - LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_parseopt: NOP\n")); - break; - case 0x02: - LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_parseopt: MSS\n")); - if (opts[c + 1] != 0x04 || c + 0x04 > max_c) { - /* Bad length */ - LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_parseopt: bad length\n")); - return; - } - /* An MSS option with the right option length. */ - mss = (opts[c + 2] << 8) | opts[c + 3]; - /* Limit the mss to the configured TCP_MSS and prevent division by zero */ - pcb->mss = ((mss > TCP_MSS) || (mss == 0)) ? TCP_MSS : mss; - /* Advance to next option */ - c += 0x04; - break; -#if LWIP_TCP_TIMESTAMPS - case 0x08: - LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_parseopt: TS\n")); - if (opts[c + 1] != 0x0A || c + 0x0A > max_c) { - /* Bad length */ - LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_parseopt: bad length\n")); - return; - } - /* TCP timestamp option with valid length */ - tsval = (opts[c+2]) | (opts[c+3] << 8) | - (opts[c+4] << 16) | (opts[c+5] << 24); - if (flags & TCP_SYN) { - pcb->ts_recent = ntohl(tsval); - pcb->flags |= TF_TIMESTAMP; - } else if (TCP_SEQ_BETWEEN(pcb->ts_lastacksent, seqno, seqno+tcplen)) { - pcb->ts_recent = ntohl(tsval); - } - /* Advance to next option */ - c += 0x0A; - break; -#endif - default: - LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_parseopt: other\n")); - if (opts[c + 1] == 0) { - LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_parseopt: bad length\n")); - /* If the length field is zero, the options are malformed - and we don't process them further. */ - return; - } - /* All other options have a length field, so that we easily - can skip past them. */ - c += opts[c + 1]; - } - } - } -} - -#endif /* LWIP_TCP */ diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/core/tcp_out.c b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/core/tcp_out.c deleted file mode 100644 index d6622178..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/core/tcp_out.c +++ /dev/null @@ -1,1499 +0,0 @@ -/** - * @file - * Transmission Control Protocol, outgoing traffic - * - * The output functions of TCP. - * - */ - -/* - * Copyright (c) 2001-2004 Swedish Institute of Computer Science. - * 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. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT - * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING - * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY - * OF SUCH DAMAGE. - * - * This file is part of the lwIP TCP/IP stack. - * - * Author: Adam Dunkels - * - */ - -#include "lwip/opt.h" - -#if LWIP_TCP /* don't build if not configured for use in lwipopts.h */ - -#include "lwip/tcp_impl.h" -#include "lwip/def.h" -#include "lwip/mem.h" -#include "lwip/memp.h" -#include "lwip/ip_addr.h" -#include "lwip/netif.h" -#include "lwip/inet_chksum.h" -#include "lwip/stats.h" -#include "lwip/snmp.h" -#include "lwip/ip6.h" -#include "lwip/ip6_addr.h" -#include "lwip/inet_chksum.h" -#if LWIP_TCP_TIMESTAMPS -#include "lwip/sys.h" -#endif - -#include - -/* Define some copy-macros for checksum-on-copy so that the code looks - nicer by preventing too many ifdef's. */ -#if TCP_CHECKSUM_ON_COPY -#define TCP_DATA_COPY(dst, src, len, seg) do { \ - tcp_seg_add_chksum(LWIP_CHKSUM_COPY(dst, src, len), \ - len, &seg->chksum, &seg->chksum_swapped); \ - seg->flags |= TF_SEG_DATA_CHECKSUMMED; } while(0) -#define TCP_DATA_COPY2(dst, src, len, chksum, chksum_swapped) \ - tcp_seg_add_chksum(LWIP_CHKSUM_COPY(dst, src, len), len, chksum, chksum_swapped); -#else /* TCP_CHECKSUM_ON_COPY*/ -#define TCP_DATA_COPY(dst, src, len, seg) MEMCPY(dst, src, len) -#define TCP_DATA_COPY2(dst, src, len, chksum, chksum_swapped) MEMCPY(dst, src, len) -#endif /* TCP_CHECKSUM_ON_COPY*/ - -/** Define this to 1 for an extra check that the output checksum is valid - * (usefule when the checksum is generated by the application, not the stack) */ -#ifndef TCP_CHECKSUM_ON_COPY_SANITY_CHECK -#define TCP_CHECKSUM_ON_COPY_SANITY_CHECK 0 -#endif - -/* Forward declarations.*/ -static void tcp_output_segment(struct tcp_seg *seg, struct tcp_pcb *pcb); - -/** Allocate a pbuf and create a tcphdr at p->payload, used for output - * functions other than the default tcp_output -> tcp_output_segment - * (e.g. tcp_send_empty_ack, etc.) - * - * @param pcb tcp pcb for which to send a packet (used to initialize tcp_hdr) - * @param optlen length of header-options - * @param datalen length of tcp data to reserve in pbuf - * @param seqno_be seqno in network byte order (big-endian) - * @return pbuf with p->payload being the tcp_hdr - */ -static struct pbuf * -tcp_output_alloc_header(struct tcp_pcb *pcb, u16_t optlen, u16_t datalen, - u32_t seqno_be /* already in network byte order */) -{ - struct tcp_hdr *tcphdr; - struct pbuf *p = pbuf_alloc(PBUF_IP, TCP_HLEN + optlen + datalen, PBUF_RAM); - if (p != NULL) { - LWIP_ASSERT("check that first pbuf can hold struct tcp_hdr", - (p->len >= TCP_HLEN + optlen)); - tcphdr = (struct tcp_hdr *)p->payload; - tcphdr->src = htons(pcb->local_port); - tcphdr->dest = htons(pcb->remote_port); - tcphdr->seqno = seqno_be; - tcphdr->ackno = htonl(pcb->rcv_nxt); - TCPH_HDRLEN_FLAGS_SET(tcphdr, (5 + optlen / 4), TCP_ACK); - tcphdr->wnd = htons(pcb->rcv_ann_wnd); - tcphdr->chksum = 0; - tcphdr->urgp = 0; - - /* If we're sending a packet, update the announced right window edge */ - pcb->rcv_ann_right_edge = pcb->rcv_nxt + pcb->rcv_ann_wnd; - } - return p; -} - -/** - * Called by tcp_close() to send a segment including FIN flag but not data. - * - * @param pcb the tcp_pcb over which to send a segment - * @return ERR_OK if sent, another err_t otherwise - */ -err_t -tcp_send_fin(struct tcp_pcb *pcb) -{ - /* first, try to add the fin to the last unsent segment */ - if (pcb->unsent != NULL) { - struct tcp_seg *last_unsent; - for (last_unsent = pcb->unsent; last_unsent->next != NULL; - last_unsent = last_unsent->next); - - if ((TCPH_FLAGS(last_unsent->tcphdr) & (TCP_SYN | TCP_FIN | TCP_RST)) == 0) { - /* no SYN/FIN/RST flag in the header, we can add the FIN flag */ - TCPH_SET_FLAG(last_unsent->tcphdr, TCP_FIN); - pcb->flags |= TF_FIN; - return ERR_OK; - } - } - /* no data, no length, flags, copy=1, no optdata */ - return tcp_enqueue_flags(pcb, TCP_FIN); -} - -/** - * Create a TCP segment with prefilled header. - * - * Called by tcp_write and tcp_enqueue_flags. - * - * @param pcb Protocol control block for the TCP connection. - * @param p pbuf that is used to hold the TCP header. - * @param flags TCP flags for header. - * @param seqno TCP sequence number of this packet - * @param optflags options to include in TCP header - * @return a new tcp_seg pointing to p, or NULL. - * The TCP header is filled in except ackno and wnd. - * p is freed on failure. - */ -static struct tcp_seg * -tcp_create_segment(struct tcp_pcb *pcb, struct pbuf *p, u8_t flags, u32_t seqno, u8_t optflags) -{ - struct tcp_seg *seg; - u8_t optlen = LWIP_TCP_OPT_LENGTH(optflags); - - if ((seg = (struct tcp_seg *)memp_malloc(MEMP_TCP_SEG)) == NULL) { - LWIP_DEBUGF(TCP_OUTPUT_DEBUG | 2, ("tcp_create_segment: no memory.\n")); - pbuf_free(p); - return NULL; - } - seg->flags = optflags; - seg->next = NULL; - seg->p = p; - seg->len = p->tot_len - optlen; -#if TCP_OVERSIZE_DBGCHECK - seg->oversize_left = 0; -#endif /* TCP_OVERSIZE_DBGCHECK */ -#if TCP_CHECKSUM_ON_COPY - seg->chksum = 0; - seg->chksum_swapped = 0; - /* check optflags */ - LWIP_ASSERT("invalid optflags passed: TF_SEG_DATA_CHECKSUMMED", - (optflags & TF_SEG_DATA_CHECKSUMMED) == 0); -#endif /* TCP_CHECKSUM_ON_COPY */ - - /* build TCP header */ - if (pbuf_header(p, TCP_HLEN)) { - LWIP_DEBUGF(TCP_OUTPUT_DEBUG | 2, ("tcp_create_segment: no room for TCP header in pbuf.\n")); - TCP_STATS_INC(tcp.err); - tcp_seg_free(seg); - return NULL; - } - seg->tcphdr = (struct tcp_hdr *)seg->p->payload; - seg->tcphdr->src = htons(pcb->local_port); - seg->tcphdr->dest = htons(pcb->remote_port); - seg->tcphdr->seqno = htonl(seqno); - /* ackno is set in tcp_output */ - TCPH_HDRLEN_FLAGS_SET(seg->tcphdr, (5 + optlen / 4), flags); - /* wnd and chksum are set in tcp_output */ - seg->tcphdr->urgp = 0; - return seg; -} - -/** - * Allocate a PBUF_RAM pbuf, perhaps with extra space at the end. - * - * This function is like pbuf_alloc(layer, length, PBUF_RAM) except - * there may be extra bytes available at the end. - * - * @param layer flag to define header size. - * @param length size of the pbuf's payload. - * @param max_length maximum usable size of payload+oversize. - * @param oversize pointer to a u16_t that will receive the number of usable tail bytes. - * @param pcb The TCP connection that willo enqueue the pbuf. - * @param apiflags API flags given to tcp_write. - * @param first_seg true when this pbuf will be used in the first enqueued segment. - * @param - */ -#if TCP_OVERSIZE -static struct pbuf * -tcp_pbuf_prealloc(pbuf_layer layer, u16_t length, u16_t max_length, - u16_t *oversize, struct tcp_pcb *pcb, u8_t apiflags, - u8_t first_seg) -{ - struct pbuf *p; - u16_t alloc = length; - -#if LWIP_NETIF_TX_SINGLE_PBUF - LWIP_UNUSED_ARG(max_length); - LWIP_UNUSED_ARG(pcb); - LWIP_UNUSED_ARG(apiflags); - LWIP_UNUSED_ARG(first_seg); - /* always create MSS-sized pbufs */ - alloc = max_length; -#else /* LWIP_NETIF_TX_SINGLE_PBUF */ - if (length < max_length) { - /* Should we allocate an oversized pbuf, or just the minimum - * length required? If tcp_write is going to be called again - * before this segment is transmitted, we want the oversized - * buffer. If the segment will be transmitted immediately, we can - * save memory by allocating only length. We use a simple - * heuristic based on the following information: - * - * Did the user set TCP_WRITE_FLAG_MORE? - * - * Will the Nagle algorithm defer transmission of this segment? - */ - if ((apiflags & TCP_WRITE_FLAG_MORE) || - (!(pcb->flags & TF_NODELAY) && - (!first_seg || - pcb->unsent != NULL || - pcb->unacked != NULL))) { - alloc = LWIP_MIN(max_length, LWIP_MEM_ALIGN_SIZE(length + TCP_OVERSIZE)); - } - } -#endif /* LWIP_NETIF_TX_SINGLE_PBUF */ - p = pbuf_alloc(layer, alloc, PBUF_RAM); - if (p == NULL) { - return NULL; - } - LWIP_ASSERT("need unchained pbuf", p->next == NULL); - *oversize = p->len - length; - /* trim p->len to the currently used size */ - p->len = p->tot_len = length; - return p; -} -#else /* TCP_OVERSIZE */ -#define tcp_pbuf_prealloc(layer, length, mx, os, pcb, api, fst) pbuf_alloc((layer), (length), PBUF_RAM) -#endif /* TCP_OVERSIZE */ - -#if TCP_CHECKSUM_ON_COPY -/** Add a checksum of newly added data to the segment */ -static void -tcp_seg_add_chksum(u16_t chksum, u16_t len, u16_t *seg_chksum, - u8_t *seg_chksum_swapped) -{ - u32_t helper; - /* add chksum to old chksum and fold to u16_t */ - helper = chksum + *seg_chksum; - chksum = FOLD_U32T(helper); - if ((len & 1) != 0) { - *seg_chksum_swapped = 1 - *seg_chksum_swapped; - chksum = SWAP_BYTES_IN_WORD(chksum); - } - *seg_chksum = chksum; -} -#endif /* TCP_CHECKSUM_ON_COPY */ - -/** Checks if tcp_write is allowed or not (checks state, snd_buf and snd_queuelen). - * - * @param pcb the tcp pcb to check for - * @param len length of data to send (checked agains snd_buf) - * @return ERR_OK if tcp_write is allowed to proceed, another err_t otherwise - */ -static err_t -tcp_write_checks(struct tcp_pcb *pcb, u16_t len) -{ - /* connection is in invalid state for data transmission? */ - if ((pcb->state != ESTABLISHED) && - (pcb->state != CLOSE_WAIT) && - (pcb->state != SYN_SENT) && - (pcb->state != SYN_RCVD)) { - LWIP_DEBUGF(TCP_OUTPUT_DEBUG | LWIP_DBG_STATE | LWIP_DBG_LEVEL_SEVERE, ("tcp_write() called in invalid state\n")); - return ERR_CONN; - } else if (len == 0) { - return ERR_OK; - } - - /* fail on too much data */ - if (len > pcb->snd_buf) { - LWIP_DEBUGF(TCP_OUTPUT_DEBUG | 3, ("tcp_write: too much data (len=%"U16_F" > snd_buf=%"U16_F")\n", - len, pcb->snd_buf)); - pcb->flags |= TF_NAGLEMEMERR; - return ERR_MEM; - } - - LWIP_DEBUGF(TCP_QLEN_DEBUG, ("tcp_write: queuelen: %"U16_F"\n", (u16_t)pcb->snd_queuelen)); - - /* If total number of pbufs on the unsent/unacked queues exceeds the - * configured maximum, return an error */ - /* check for configured max queuelen and possible overflow */ - if ((pcb->snd_queuelen >= TCP_SND_QUEUELEN) || (pcb->snd_queuelen > TCP_SNDQUEUELEN_OVERFLOW)) { - LWIP_DEBUGF(TCP_OUTPUT_DEBUG | 3, ("tcp_write: too long queue %"U16_F" (max %"U16_F")\n", - pcb->snd_queuelen, TCP_SND_QUEUELEN)); - TCP_STATS_INC(tcp.memerr); - pcb->flags |= TF_NAGLEMEMERR; - return ERR_MEM; - } - if (pcb->snd_queuelen != 0) { - LWIP_ASSERT("tcp_write: pbufs on queue => at least one queue non-empty", - pcb->unacked != NULL || pcb->unsent != NULL); - } else { - LWIP_ASSERT("tcp_write: no pbufs on queue => both queues empty", - pcb->unacked == NULL && pcb->unsent == NULL); - } - return ERR_OK; -} - -/** - * Write data for sending (but does not send it immediately). - * - * It waits in the expectation of more data being sent soon (as - * it can send them more efficiently by combining them together). - * To prompt the system to send data now, call tcp_output() after - * calling tcp_write(). - * - * @param pcb Protocol control block for the TCP connection to enqueue data for. - * @param arg Pointer to the data to be enqueued for sending. - * @param len Data length in bytes - * @param apiflags combination of following flags : - * - TCP_WRITE_FLAG_COPY (0x01) data will be copied into memory belonging to the stack - * - TCP_WRITE_FLAG_MORE (0x02) for TCP connection, PSH flag will be set on last segment sent, - * @return ERR_OK if enqueued, another err_t on error - */ -err_t -tcp_write(struct tcp_pcb *pcb, const void *arg, u16_t len, u8_t apiflags) -{ - struct pbuf *concat_p = NULL; - struct tcp_seg *last_unsent = NULL, *seg = NULL, *prev_seg = NULL, *queue = NULL; - u16_t pos = 0; /* position in 'arg' data */ - u16_t queuelen; - u8_t optlen = 0; - u8_t optflags = 0; -#if TCP_OVERSIZE - u16_t oversize = 0; - u16_t oversize_used = 0; -#endif /* TCP_OVERSIZE */ -#if TCP_CHECKSUM_ON_COPY - u16_t concat_chksum = 0; - u8_t concat_chksum_swapped = 0; - u16_t concat_chksummed = 0; -#endif /* TCP_CHECKSUM_ON_COPY */ - err_t err; - /* don't allocate segments bigger than half the maximum window we ever received */ - u16_t mss_local = LWIP_MIN(pcb->mss, pcb->snd_wnd_max/2); - -#if LWIP_NETIF_TX_SINGLE_PBUF - /* Always copy to try to create single pbufs for TX */ - apiflags |= TCP_WRITE_FLAG_COPY; -#endif /* LWIP_NETIF_TX_SINGLE_PBUF */ - - LWIP_DEBUGF(TCP_OUTPUT_DEBUG, ("tcp_write(pcb=%p, data=%p, len=%"U16_F", apiflags=%"U16_F")\n", - (void *)pcb, arg, len, (u16_t)apiflags)); - LWIP_ERROR("tcp_write: arg == NULL (programmer violates API)", - arg != NULL, return ERR_ARG;); - - err = tcp_write_checks(pcb, len); - if (err != ERR_OK) { - return err; - } - queuelen = pcb->snd_queuelen; - -#if LWIP_TCP_TIMESTAMPS - if ((pcb->flags & TF_TIMESTAMP)) { - optflags = TF_SEG_OPTS_TS; - optlen = LWIP_TCP_OPT_LENGTH(TF_SEG_OPTS_TS); - } -#endif /* LWIP_TCP_TIMESTAMPS */ - - - /* - * TCP segmentation is done in three phases with increasing complexity: - * - * 1. Copy data directly into an oversized pbuf. - * 2. Chain a new pbuf to the end of pcb->unsent. - * 3. Create new segments. - * - * We may run out of memory at any point. In that case we must - * return ERR_MEM and not change anything in pcb. Therefore, all - * changes are recorded in local variables and committed at the end - * of the function. Some pcb fields are maintained in local copies: - * - * queuelen = pcb->snd_queuelen - * oversize = pcb->unsent_oversize - * - * These variables are set consistently by the phases: - * - * seg points to the last segment tampered with. - * - * pos records progress as data is segmented. - */ - - /* Find the tail of the unsent queue. */ - if (pcb->unsent != NULL) { - u16_t space; - u16_t unsent_optlen; - - /* @todo: this could be sped up by keeping last_unsent in the pcb */ - for (last_unsent = pcb->unsent; last_unsent->next != NULL; - last_unsent = last_unsent->next); - - /* Usable space at the end of the last unsent segment */ - unsent_optlen = LWIP_TCP_OPT_LENGTH(last_unsent->flags); - space = mss_local - (last_unsent->len + unsent_optlen); - - /* - * Phase 1: Copy data directly into an oversized pbuf. - * - * The number of bytes copied is recorded in the oversize_used - * variable. The actual copying is done at the bottom of the - * function. - */ -#if TCP_OVERSIZE -#if TCP_OVERSIZE_DBGCHECK - /* check that pcb->unsent_oversize matches last_unsent->unsent_oversize */ - LWIP_ASSERT("unsent_oversize mismatch (pcb vs. last_unsent)", - pcb->unsent_oversize == last_unsent->oversize_left); -#endif /* TCP_OVERSIZE_DBGCHECK */ - oversize = pcb->unsent_oversize; - if (oversize > 0) { - LWIP_ASSERT("inconsistent oversize vs. space", oversize_used <= space); - seg = last_unsent; - oversize_used = oversize < len ? oversize : len; - pos += oversize_used; - oversize -= oversize_used; - space -= oversize_used; - } - /* now we are either finished or oversize is zero */ - LWIP_ASSERT("inconsistend oversize vs. len", (oversize == 0) || (pos == len)); -#endif /* TCP_OVERSIZE */ - - /* - * Phase 2: Chain a new pbuf to the end of pcb->unsent. - * - * We don't extend segments containing SYN/FIN flags or options - * (len==0). The new pbuf is kept in concat_p and pbuf_cat'ed at - * the end. - */ - if ((pos < len) && (space > 0) && (last_unsent->len > 0)) { - u16_t seglen = space < len - pos ? space : len - pos; - seg = last_unsent; - - /* Create a pbuf with a copy or reference to seglen bytes. We - * can use PBUF_RAW here since the data appears in the middle of - * a segment. A header will never be prepended. */ - if (apiflags & TCP_WRITE_FLAG_COPY) { - /* Data is copied */ - if ((concat_p = tcp_pbuf_prealloc(PBUF_RAW, seglen, space, &oversize, pcb, apiflags, 1)) == NULL) { - LWIP_DEBUGF(TCP_OUTPUT_DEBUG | 2, - ("tcp_write : could not allocate memory for pbuf copy size %"U16_F"\n", - seglen)); - goto memerr; - } -#if TCP_OVERSIZE_DBGCHECK - last_unsent->oversize_left += oversize; -#endif /* TCP_OVERSIZE_DBGCHECK */ - TCP_DATA_COPY2(concat_p->payload, (u8_t*)arg + pos, seglen, &concat_chksum, &concat_chksum_swapped); -#if TCP_CHECKSUM_ON_COPY - concat_chksummed += seglen; -#endif /* TCP_CHECKSUM_ON_COPY */ - } else { - /* Data is not copied */ - if ((concat_p = pbuf_alloc(PBUF_RAW, seglen, PBUF_ROM)) == NULL) { - LWIP_DEBUGF(TCP_OUTPUT_DEBUG | 2, - ("tcp_write: could not allocate memory for zero-copy pbuf\n")); - goto memerr; - } -#if TCP_CHECKSUM_ON_COPY - /* calculate the checksum of nocopy-data */ - tcp_seg_add_chksum(~inet_chksum((u8_t*)arg + pos, seglen), seglen, - &concat_chksum, &concat_chksum_swapped); - concat_chksummed += seglen; -#endif /* TCP_CHECKSUM_ON_COPY */ - /* reference the non-volatile payload data */ - concat_p->payload = (u8_t*)arg + pos; - } - - pos += seglen; - queuelen += pbuf_clen(concat_p); - } - } else { -#if TCP_OVERSIZE - LWIP_ASSERT("unsent_oversize mismatch (pcb->unsent is NULL)", - pcb->unsent_oversize == 0); -#endif /* TCP_OVERSIZE */ - } - - /* - * Phase 3: Create new segments. - * - * The new segments are chained together in the local 'queue' - * variable, ready to be appended to pcb->unsent. - */ - while (pos < len) { - struct pbuf *p; - u16_t left = len - pos; - u16_t max_len = mss_local - optlen; - u16_t seglen = left > max_len ? max_len : left; -#if TCP_CHECKSUM_ON_COPY - u16_t chksum = 0; - u8_t chksum_swapped = 0; -#endif /* TCP_CHECKSUM_ON_COPY */ - - if (apiflags & TCP_WRITE_FLAG_COPY) { - /* If copy is set, memory should be allocated and data copied - * into pbuf */ - if ((p = tcp_pbuf_prealloc(PBUF_TRANSPORT, seglen + optlen, mss_local, &oversize, pcb, apiflags, queue == NULL)) == NULL) { - LWIP_DEBUGF(TCP_OUTPUT_DEBUG | 2, ("tcp_write : could not allocate memory for pbuf copy size %"U16_F"\n", seglen)); - goto memerr; - } - LWIP_ASSERT("tcp_write: check that first pbuf can hold the complete seglen", - (p->len >= seglen)); - TCP_DATA_COPY2((char *)p->payload + optlen, (u8_t*)arg + pos, seglen, &chksum, &chksum_swapped); - } else { - /* Copy is not set: First allocate a pbuf for holding the data. - * Since the referenced data is available at least until it is - * sent out on the link (as it has to be ACKed by the remote - * party) we can safely use PBUF_ROM instead of PBUF_REF here. - */ - struct pbuf *p2; -#if TCP_OVERSIZE - LWIP_ASSERT("oversize == 0", oversize == 0); -#endif /* TCP_OVERSIZE */ - if ((p2 = pbuf_alloc(PBUF_TRANSPORT, seglen, PBUF_ROM)) == NULL) { - LWIP_DEBUGF(TCP_OUTPUT_DEBUG | 2, ("tcp_write: could not allocate memory for zero-copy pbuf\n")); - goto memerr; - } -#if TCP_CHECKSUM_ON_COPY - /* calculate the checksum of nocopy-data */ - chksum = ~inet_chksum((u8_t*)arg + pos, seglen); -#endif /* TCP_CHECKSUM_ON_COPY */ - /* reference the non-volatile payload data */ - p2->payload = (u8_t*)arg + pos; - - /* Second, allocate a pbuf for the headers. */ - if ((p = pbuf_alloc(PBUF_TRANSPORT, optlen, PBUF_RAM)) == NULL) { - /* If allocation fails, we have to deallocate the data pbuf as - * well. */ - pbuf_free(p2); - LWIP_DEBUGF(TCP_OUTPUT_DEBUG | 2, ("tcp_write: could not allocate memory for header pbuf\n")); - goto memerr; - } - /* Concatenate the headers and data pbufs together. */ - pbuf_cat(p/*header*/, p2/*data*/); - } - - queuelen += pbuf_clen(p); - - /* Now that there are more segments queued, we check again if the - * length of the queue exceeds the configured maximum or - * overflows. */ - if ((queuelen > TCP_SND_QUEUELEN) || (queuelen > TCP_SNDQUEUELEN_OVERFLOW)) { - LWIP_DEBUGF(TCP_OUTPUT_DEBUG | 2, ("tcp_write: queue too long %"U16_F" (%"U16_F")\n", queuelen, TCP_SND_QUEUELEN)); - pbuf_free(p); - goto memerr; - } - - if ((seg = tcp_create_segment(pcb, p, 0, pcb->snd_lbb + pos, optflags)) == NULL) { - goto memerr; - } -#if TCP_OVERSIZE_DBGCHECK - seg->oversize_left = oversize; -#endif /* TCP_OVERSIZE_DBGCHECK */ -#if TCP_CHECKSUM_ON_COPY - seg->chksum = chksum; - seg->chksum_swapped = chksum_swapped; - seg->flags |= TF_SEG_DATA_CHECKSUMMED; -#endif /* TCP_CHECKSUM_ON_COPY */ - - /* first segment of to-be-queued data? */ - if (queue == NULL) { - queue = seg; - } else { - /* Attach the segment to the end of the queued segments */ - LWIP_ASSERT("prev_seg != NULL", prev_seg != NULL); - prev_seg->next = seg; - } - /* remember last segment of to-be-queued data for next iteration */ - prev_seg = seg; - - LWIP_DEBUGF(TCP_OUTPUT_DEBUG | LWIP_DBG_TRACE, ("tcp_write: queueing %"U32_F":%"U32_F"\n", - ntohl(seg->tcphdr->seqno), - ntohl(seg->tcphdr->seqno) + TCP_TCPLEN(seg))); - - pos += seglen; - } - - /* - * All three segmentation phases were successful. We can commit the - * transaction. - */ - - /* - * Phase 1: If data has been added to the preallocated tail of - * last_unsent, we update the length fields of the pbuf chain. - */ -#if TCP_OVERSIZE - if (oversize_used > 0) { - struct pbuf *p; - /* Bump tot_len of whole chain, len of tail */ - for (p = last_unsent->p; p; p = p->next) { - p->tot_len += oversize_used; - if (p->next == NULL) { - TCP_DATA_COPY((char *)p->payload + p->len, arg, oversize_used, last_unsent); - p->len += oversize_used; - } - } - last_unsent->len += oversize_used; -#if TCP_OVERSIZE_DBGCHECK - LWIP_ASSERT("last_unsent->oversize_left >= oversize_used", - last_unsent->oversize_left >= oversize_used); - last_unsent->oversize_left -= oversize_used; -#endif /* TCP_OVERSIZE_DBGCHECK */ - } - pcb->unsent_oversize = oversize; -#endif /* TCP_OVERSIZE */ - - /* - * Phase 2: concat_p can be concatenated onto last_unsent->p - */ - if (concat_p != NULL) { - LWIP_ASSERT("tcp_write: cannot concatenate when pcb->unsent is empty", - (last_unsent != NULL)); - pbuf_cat(last_unsent->p, concat_p); - last_unsent->len += concat_p->tot_len; -#if TCP_CHECKSUM_ON_COPY - if (concat_chksummed) { - tcp_seg_add_chksum(concat_chksum, concat_chksummed, &last_unsent->chksum, - &last_unsent->chksum_swapped); - last_unsent->flags |= TF_SEG_DATA_CHECKSUMMED; - } -#endif /* TCP_CHECKSUM_ON_COPY */ - } - - /* - * Phase 3: Append queue to pcb->unsent. Queue may be NULL, but that - * is harmless - */ - if (last_unsent == NULL) { - pcb->unsent = queue; - } else { - last_unsent->next = queue; - } - - /* - * Finally update the pcb state. - */ - pcb->snd_lbb += len; - pcb->snd_buf -= len; - pcb->snd_queuelen = queuelen; - - LWIP_DEBUGF(TCP_QLEN_DEBUG, ("tcp_write: %"S16_F" (after enqueued)\n", - pcb->snd_queuelen)); - if (pcb->snd_queuelen != 0) { - LWIP_ASSERT("tcp_write: valid queue length", - pcb->unacked != NULL || pcb->unsent != NULL); - } - - /* Set the PSH flag in the last segment that we enqueued. */ - if (seg != NULL && seg->tcphdr != NULL && ((apiflags & TCP_WRITE_FLAG_MORE)==0)) { - TCPH_SET_FLAG(seg->tcphdr, TCP_PSH); - } - - return ERR_OK; -memerr: - pcb->flags |= TF_NAGLEMEMERR; - TCP_STATS_INC(tcp.memerr); - - if (concat_p != NULL) { - pbuf_free(concat_p); - } - if (queue != NULL) { - tcp_segs_free(queue); - } - if (pcb->snd_queuelen != 0) { - LWIP_ASSERT("tcp_write: valid queue length", pcb->unacked != NULL || - pcb->unsent != NULL); - } - LWIP_DEBUGF(TCP_QLEN_DEBUG | LWIP_DBG_STATE, ("tcp_write: %"S16_F" (with mem err)\n", pcb->snd_queuelen)); - return ERR_MEM; -} - -/** - * Enqueue TCP options for transmission. - * - * Called by tcp_connect(), tcp_listen_input(), and tcp_send_ctrl(). - * - * @param pcb Protocol control block for the TCP connection. - * @param flags TCP header flags to set in the outgoing segment. - * @param optdata pointer to TCP options, or NULL. - * @param optlen length of TCP options in bytes. - */ -err_t -tcp_enqueue_flags(struct tcp_pcb *pcb, u8_t flags) -{ - struct pbuf *p; - struct tcp_seg *seg; - u8_t optflags = 0; - u8_t optlen = 0; - - LWIP_DEBUGF(TCP_QLEN_DEBUG, ("tcp_enqueue_flags: queuelen: %"U16_F"\n", (u16_t)pcb->snd_queuelen)); - - LWIP_ASSERT("tcp_enqueue_flags: need either TCP_SYN or TCP_FIN in flags (programmer violates API)", - (flags & (TCP_SYN | TCP_FIN)) != 0); - - /* check for configured max queuelen and possible overflow */ - if ((pcb->snd_queuelen >= TCP_SND_QUEUELEN) || (pcb->snd_queuelen > TCP_SNDQUEUELEN_OVERFLOW)) { - LWIP_DEBUGF(TCP_OUTPUT_DEBUG | 3, ("tcp_enqueue_flags: too long queue %"U16_F" (max %"U16_F")\n", - pcb->snd_queuelen, TCP_SND_QUEUELEN)); - TCP_STATS_INC(tcp.memerr); - pcb->flags |= TF_NAGLEMEMERR; - return ERR_MEM; - } - - if (flags & TCP_SYN) { - optflags = TF_SEG_OPTS_MSS; - } -#if LWIP_TCP_TIMESTAMPS - if ((pcb->flags & TF_TIMESTAMP)) { - optflags |= TF_SEG_OPTS_TS; - } -#endif /* LWIP_TCP_TIMESTAMPS */ - optlen = LWIP_TCP_OPT_LENGTH(optflags); - - /* tcp_enqueue_flags is always called with either SYN or FIN in flags. - * We need one available snd_buf byte to do that. - * This means we can't send FIN while snd_buf==0. A better fix would be to - * not include SYN and FIN sequence numbers in the snd_buf count. */ - if (pcb->snd_buf == 0) { - LWIP_DEBUGF(TCP_OUTPUT_DEBUG | 3, ("tcp_enqueue_flags: no send buffer available\n")); - TCP_STATS_INC(tcp.memerr); - return ERR_MEM; - } - - /* Allocate pbuf with room for TCP header + options */ - if ((p = pbuf_alloc(PBUF_TRANSPORT, optlen, PBUF_RAM)) == NULL) { - pcb->flags |= TF_NAGLEMEMERR; - TCP_STATS_INC(tcp.memerr); - return ERR_MEM; - } - LWIP_ASSERT("tcp_enqueue_flags: check that first pbuf can hold optlen", - (p->len >= optlen)); - - /* Allocate memory for tcp_seg, and fill in fields. */ - if ((seg = tcp_create_segment(pcb, p, flags, pcb->snd_lbb, optflags)) == NULL) { - pcb->flags |= TF_NAGLEMEMERR; - TCP_STATS_INC(tcp.memerr); - return ERR_MEM; - } - LWIP_ASSERT("seg->tcphdr not aligned", ((mem_ptr_t)seg->tcphdr % MEM_ALIGNMENT) == 0); - LWIP_ASSERT("tcp_enqueue_flags: invalid segment length", seg->len == 0); - - LWIP_DEBUGF(TCP_OUTPUT_DEBUG | LWIP_DBG_TRACE, - ("tcp_enqueue_flags: queueing %"U32_F":%"U32_F" (0x%"X16_F")\n", - ntohl(seg->tcphdr->seqno), - ntohl(seg->tcphdr->seqno) + TCP_TCPLEN(seg), - (u16_t)flags)); - - /* Now append seg to pcb->unsent queue */ - if (pcb->unsent == NULL) { - pcb->unsent = seg; - } else { - struct tcp_seg *useg; - for (useg = pcb->unsent; useg->next != NULL; useg = useg->next); - useg->next = seg; - } -#if TCP_OVERSIZE - /* The new unsent tail has no space */ - pcb->unsent_oversize = 0; -#endif /* TCP_OVERSIZE */ - - /* SYN and FIN bump the sequence number */ - if ((flags & TCP_SYN) || (flags & TCP_FIN)) { - pcb->snd_lbb++; - /* optlen does not influence snd_buf */ - pcb->snd_buf--; - } - if (flags & TCP_FIN) { - pcb->flags |= TF_FIN; - } - - /* update number of segments on the queues */ - pcb->snd_queuelen += pbuf_clen(seg->p); - LWIP_DEBUGF(TCP_QLEN_DEBUG, ("tcp_enqueue_flags: %"S16_F" (after enqueued)\n", pcb->snd_queuelen)); - if (pcb->snd_queuelen != 0) { - LWIP_ASSERT("tcp_enqueue_flags: invalid queue length", - pcb->unacked != NULL || pcb->unsent != NULL); - } - - return ERR_OK; -} - -#if LWIP_TCP_TIMESTAMPS -/* Build a timestamp option (12 bytes long) at the specified options pointer) - * - * @param pcb tcp_pcb - * @param opts option pointer where to store the timestamp option - */ -static void -tcp_build_timestamp_option(struct tcp_pcb *pcb, u32_t *opts) -{ - /* Pad with two NOP options to make everything nicely aligned */ - opts[0] = PP_HTONL(0x0101080A); - opts[1] = htonl(sys_now()); - opts[2] = htonl(pcb->ts_recent); -} -#endif - -/** Send an ACK without data. - * - * @param pcb Protocol control block for the TCP connection to send the ACK - */ -err_t -tcp_send_empty_ack(struct tcp_pcb *pcb) -{ - struct pbuf *p; - u8_t optlen = 0; -#if LWIP_TCP_TIMESTAMPS || CHECKSUM_GEN_TCP - struct tcp_hdr *tcphdr; -#endif /* LWIP_TCP_TIMESTAMPS || CHECKSUM_GEN_TCP */ - -#if LWIP_TCP_TIMESTAMPS - if (pcb->flags & TF_TIMESTAMP) { - optlen = LWIP_TCP_OPT_LENGTH(TF_SEG_OPTS_TS); - } -#endif - - p = tcp_output_alloc_header(pcb, optlen, 0, htonl(pcb->snd_nxt)); - if (p == NULL) { - LWIP_DEBUGF(TCP_OUTPUT_DEBUG, ("tcp_output: (ACK) could not allocate pbuf\n")); - return ERR_BUF; - } -#if LWIP_TCP_TIMESTAMPS || CHECKSUM_GEN_TCP - tcphdr = (struct tcp_hdr *)p->payload; -#endif /* LWIP_TCP_TIMESTAMPS || CHECKSUM_GEN_TCP */ - LWIP_DEBUGF(TCP_OUTPUT_DEBUG, - ("tcp_output: sending ACK for %"U32_F"\n", pcb->rcv_nxt)); - /* remove ACK flags from the PCB, as we send an empty ACK now */ - pcb->flags &= ~(TF_ACK_DELAY | TF_ACK_NOW); - - /* NB. MSS option is only sent on SYNs, so ignore it here */ -#if LWIP_TCP_TIMESTAMPS - pcb->ts_lastacksent = pcb->rcv_nxt; - - if (pcb->flags & TF_TIMESTAMP) { - tcp_build_timestamp_option(pcb, (u32_t *)(tcphdr + 1)); - } -#endif - -#if CHECKSUM_GEN_TCP - tcphdr->chksum = ipX_chksum_pseudo(PCB_ISIPV6(pcb), p, IP_PROTO_TCP, p->tot_len, - &pcb->local_ip, &pcb->remote_ip); -#endif -#if LWIP_NETIF_HWADDRHINT - ipX_output_hinted(PCB_ISIPV6(pcb), p, &pcb->local_ip, &pcb->remote_ip, pcb->ttl, pcb->tos, - IP_PROTO_TCP, &pcb->addr_hint); -#else /* LWIP_NETIF_HWADDRHINT*/ - ipX_output(PCB_ISIPV6(pcb), p, &pcb->local_ip, &pcb->remote_ip, pcb->ttl, pcb->tos, - IP_PROTO_TCP); -#endif /* LWIP_NETIF_HWADDRHINT*/ - pbuf_free(p); - - return ERR_OK; -} - -/** - * Find out what we can send and send it - * - * @param pcb Protocol control block for the TCP connection to send data - * @return ERR_OK if data has been sent or nothing to send - * another err_t on error - */ -err_t -tcp_output(struct tcp_pcb *pcb) -{ - struct tcp_seg *seg, *useg; - u32_t wnd, snd_nxt; -#if TCP_CWND_DEBUG - s16_t i = 0; -#endif /* TCP_CWND_DEBUG */ - - /* pcb->state LISTEN not allowed here */ - LWIP_ASSERT("don't call tcp_output for listen-pcbs", - pcb->state != LISTEN); - - /* First, check if we are invoked by the TCP input processing - code. If so, we do not output anything. Instead, we rely on the - input processing code to call us when input processing is done - with. */ - if (tcp_input_pcb == pcb) { - return ERR_OK; - } - - wnd = LWIP_MIN(pcb->snd_wnd, pcb->cwnd); - - seg = pcb->unsent; - - /* If the TF_ACK_NOW flag is set and no data will be sent (either - * because the ->unsent queue is empty or because the window does - * not allow it), construct an empty ACK segment and send it. - * - * If data is to be sent, we will just piggyback the ACK (see below). - */ - if (pcb->flags & TF_ACK_NOW && - (seg == NULL || - ntohl(seg->tcphdr->seqno) - pcb->lastack + seg->len > wnd)) { - return tcp_send_empty_ack(pcb); - } - - /* useg should point to last segment on unacked queue */ - useg = pcb->unacked; - if (useg != NULL) { - for (; useg->next != NULL; useg = useg->next); - } - -#if TCP_OUTPUT_DEBUG - if (seg == NULL) { - LWIP_DEBUGF(TCP_OUTPUT_DEBUG, ("tcp_output: nothing to send (%p)\n", - (void*)pcb->unsent)); - } -#endif /* TCP_OUTPUT_DEBUG */ -#if TCP_CWND_DEBUG - if (seg == NULL) { - LWIP_DEBUGF(TCP_CWND_DEBUG, ("tcp_output: snd_wnd %"U16_F - ", cwnd %"U16_F", wnd %"U32_F - ", seg == NULL, ack %"U32_F"\n", - pcb->snd_wnd, pcb->cwnd, wnd, pcb->lastack)); - } else { - LWIP_DEBUGF(TCP_CWND_DEBUG, - ("tcp_output: snd_wnd %"U16_F", cwnd %"U16_F", wnd %"U32_F - ", effwnd %"U32_F", seq %"U32_F", ack %"U32_F"\n", - pcb->snd_wnd, pcb->cwnd, wnd, - ntohl(seg->tcphdr->seqno) - pcb->lastack + seg->len, - ntohl(seg->tcphdr->seqno), pcb->lastack)); - } -#endif /* TCP_CWND_DEBUG */ - /* data available and window allows it to be sent? */ - while (seg != NULL && - ntohl(seg->tcphdr->seqno) - pcb->lastack + seg->len <= wnd) { - LWIP_ASSERT("RST not expected here!", - (TCPH_FLAGS(seg->tcphdr) & TCP_RST) == 0); - /* Stop sending if the nagle algorithm would prevent it - * Don't stop: - * - if tcp_write had a memory error before (prevent delayed ACK timeout) or - * - if FIN was already enqueued for this PCB (SYN is always alone in a segment - - * either seg->next != NULL or pcb->unacked == NULL; - * RST is no sent using tcp_write/tcp_output. - */ - if((tcp_do_output_nagle(pcb) == 0) && - ((pcb->flags & (TF_NAGLEMEMERR | TF_FIN)) == 0)){ - break; - } -#if TCP_CWND_DEBUG - LWIP_DEBUGF(TCP_CWND_DEBUG, ("tcp_output: snd_wnd %"U16_F", cwnd %"U16_F", wnd %"U32_F", effwnd %"U32_F", seq %"U32_F", ack %"U32_F", i %"S16_F"\n", - pcb->snd_wnd, pcb->cwnd, wnd, - ntohl(seg->tcphdr->seqno) + seg->len - - pcb->lastack, - ntohl(seg->tcphdr->seqno), pcb->lastack, i)); - ++i; -#endif /* TCP_CWND_DEBUG */ - - pcb->unsent = seg->next; - - if (pcb->state != SYN_SENT) { - TCPH_SET_FLAG(seg->tcphdr, TCP_ACK); - pcb->flags &= ~(TF_ACK_DELAY | TF_ACK_NOW); - } - -#if TCP_OVERSIZE_DBGCHECK - seg->oversize_left = 0; -#endif /* TCP_OVERSIZE_DBGCHECK */ - tcp_output_segment(seg, pcb); - snd_nxt = ntohl(seg->tcphdr->seqno) + TCP_TCPLEN(seg); - if (TCP_SEQ_LT(pcb->snd_nxt, snd_nxt)) { - pcb->snd_nxt = snd_nxt; - } - /* put segment on unacknowledged list if length > 0 */ - if (TCP_TCPLEN(seg) > 0) { - seg->next = NULL; - /* unacked list is empty? */ - if (pcb->unacked == NULL) { - pcb->unacked = seg; - useg = seg; - /* unacked list is not empty? */ - } else { - /* In the case of fast retransmit, the packet should not go to the tail - * of the unacked queue, but rather somewhere before it. We need to check for - * this case. -STJ Jul 27, 2004 */ - if (TCP_SEQ_LT(ntohl(seg->tcphdr->seqno), ntohl(useg->tcphdr->seqno))) { - /* add segment to before tail of unacked list, keeping the list sorted */ - struct tcp_seg **cur_seg = &(pcb->unacked); - while (*cur_seg && - TCP_SEQ_LT(ntohl((*cur_seg)->tcphdr->seqno), ntohl(seg->tcphdr->seqno))) { - cur_seg = &((*cur_seg)->next ); - } - seg->next = (*cur_seg); - (*cur_seg) = seg; - } else { - /* add segment to tail of unacked list */ - useg->next = seg; - useg = useg->next; - } - } - /* do not queue empty segments on the unacked list */ - } else { - tcp_seg_free(seg); - } - seg = pcb->unsent; - } -#if TCP_OVERSIZE - if (pcb->unsent == NULL) { - /* last unsent has been removed, reset unsent_oversize */ - pcb->unsent_oversize = 0; - } -#endif /* TCP_OVERSIZE */ - - pcb->flags &= ~TF_NAGLEMEMERR; - return ERR_OK; -} - -/** - * Called by tcp_output() to actually send a TCP segment over IP. - * - * @param seg the tcp_seg to send - * @param pcb the tcp_pcb for the TCP connection used to send the segment - */ -static void -tcp_output_segment(struct tcp_seg *seg, struct tcp_pcb *pcb) -{ - u16_t len; - u32_t *opts; - - /** @bug Exclude retransmitted segments from this count. */ - snmp_inc_tcpoutsegs(); - - /* The TCP header has already been constructed, but the ackno and - wnd fields remain. */ - seg->tcphdr->ackno = htonl(pcb->rcv_nxt); - - /* advertise our receive window size in this TCP segment */ - seg->tcphdr->wnd = htons(pcb->rcv_ann_wnd); - - pcb->rcv_ann_right_edge = pcb->rcv_nxt + pcb->rcv_ann_wnd; - - /* Add any requested options. NB MSS option is only set on SYN - packets, so ignore it here */ - opts = (u32_t *)(void *)(seg->tcphdr + 1); - if (seg->flags & TF_SEG_OPTS_MSS) { - u16_t mss; -#if TCP_CALCULATE_EFF_SEND_MSS - mss = tcp_eff_send_mss(TCP_MSS, &pcb->local_ip, &pcb->remote_ip, PCB_ISIPV6(pcb)); -#else /* TCP_CALCULATE_EFF_SEND_MSS */ - mss = TCP_MSS; -#endif /* TCP_CALCULATE_EFF_SEND_MSS */ - *opts = TCP_BUILD_MSS_OPTION(mss); - opts += 1; - } -#if LWIP_TCP_TIMESTAMPS - pcb->ts_lastacksent = pcb->rcv_nxt; - - if (seg->flags & TF_SEG_OPTS_TS) { - tcp_build_timestamp_option(pcb, opts); - opts += 3; - } -#endif - - /* Set retransmission timer running if it is not currently enabled - This must be set before checking the route. */ - if (pcb->rtime == -1) { - pcb->rtime = 0; - } - - /* If we don't have a local IP address, we get one by - calling ip_route(). */ - if (ipX_addr_isany(PCB_ISIPV6(pcb), &pcb->local_ip)) { - struct netif *netif; - ipX_addr_t *local_ip; - ipX_route_get_local_ipX(PCB_ISIPV6(pcb), &pcb->local_ip, &pcb->remote_ip, netif, local_ip); - if ((netif == NULL) || (local_ip == NULL)) { - return; - } - ipX_addr_copy(PCB_ISIPV6(pcb), pcb->local_ip, *local_ip); - } - - if (pcb->rttest == 0) { - pcb->rttest = tcp_ticks; - pcb->rtseq = ntohl(seg->tcphdr->seqno); - - LWIP_DEBUGF(TCP_RTO_DEBUG, ("tcp_output_segment: rtseq %"U32_F"\n", pcb->rtseq)); - } - LWIP_DEBUGF(TCP_OUTPUT_DEBUG, ("tcp_output_segment: %"U32_F":%"U32_F"\n", - htonl(seg->tcphdr->seqno), htonl(seg->tcphdr->seqno) + - seg->len)); - - len = (u16_t)((u8_t *)seg->tcphdr - (u8_t *)seg->p->payload); - - seg->p->len -= len; - seg->p->tot_len -= len; - - seg->p->payload = seg->tcphdr; - - seg->tcphdr->chksum = 0; -#if TCP_CHECKSUM_ON_COPY - { - u32_t acc; -#if TCP_CHECKSUM_ON_COPY_SANITY_CHECK - u16_t chksum_slow = ipX_chksum_pseudo(PCB_ISIPV6(pcb), seg->p, IP_PROTO_TCP, - seg->p->tot_len, &pcb->local_ip, &pcb->remote_ip); -#endif /* TCP_CHECKSUM_ON_COPY_SANITY_CHECK */ - if ((seg->flags & TF_SEG_DATA_CHECKSUMMED) == 0) { - LWIP_ASSERT("data included but not checksummed", - seg->p->tot_len == (TCPH_HDRLEN(seg->tcphdr) * 4)); - } - - /* rebuild TCP header checksum (TCP header changes for retransmissions!) */ - acc = ipX_chksum_pseudo_partial(PCB_ISIPV6(pcb), seg->p, IP_PROTO_TCP, - seg->p->tot_len, TCPH_HDRLEN(seg->tcphdr) * 4, &pcb->local_ip, &pcb->remote_ip); - /* add payload checksum */ - if (seg->chksum_swapped) { - seg->chksum = SWAP_BYTES_IN_WORD(seg->chksum); - seg->chksum_swapped = 0; - } - acc += (u16_t)~(seg->chksum); - seg->tcphdr->chksum = FOLD_U32T(acc); -#if TCP_CHECKSUM_ON_COPY_SANITY_CHECK - if (chksum_slow != seg->tcphdr->chksum) { - LWIP_DEBUGF(TCP_DEBUG | LWIP_DBG_LEVEL_WARNING, - ("tcp_output_segment: calculated checksum is %"X16_F" instead of %"X16_F"\n", - seg->tcphdr->chksum, chksum_slow)); - seg->tcphdr->chksum = chksum_slow; - } -#endif /* TCP_CHECKSUM_ON_COPY_SANITY_CHECK */ - } -#else /* TCP_CHECKSUM_ON_COPY */ -#if CHECKSUM_GEN_TCP - seg->tcphdr->chksum = ipX_chksum_pseudo(PCB_ISIPV6(pcb), seg->p, IP_PROTO_TCP, - seg->p->tot_len, &pcb->local_ip, &pcb->remote_ip); -#endif /* CHECKSUM_GEN_TCP */ -#endif /* TCP_CHECKSUM_ON_COPY */ - TCP_STATS_INC(tcp.xmit); - -#if LWIP_NETIF_HWADDRHINT - ipX_output_hinted(PCB_ISIPV6(pcb), seg->p, &pcb->local_ip, &pcb->remote_ip, - pcb->ttl, pcb->tos, IP_PROTO_TCP, &pcb->addr_hint); -#else /* LWIP_NETIF_HWADDRHINT*/ - ipX_output(PCB_ISIPV6(pcb), seg->p, &pcb->local_ip, &pcb->remote_ip, pcb->ttl, - pcb->tos, IP_PROTO_TCP); -#endif /* LWIP_NETIF_HWADDRHINT*/ -} - -/** - * Send a TCP RESET packet (empty segment with RST flag set) either to - * abort a connection or to show that there is no matching local connection - * for a received segment. - * - * Called by tcp_abort() (to abort a local connection), tcp_input() (if no - * matching local pcb was found), tcp_listen_input() (if incoming segment - * has ACK flag set) and tcp_process() (received segment in the wrong state) - * - * Since a RST segment is in most cases not sent for an active connection, - * tcp_rst() has a number of arguments that are taken from a tcp_pcb for - * most other segment output functions. - * - * @param seqno the sequence number to use for the outgoing segment - * @param ackno the acknowledge number to use for the outgoing segment - * @param local_ip the local IP address to send the segment from - * @param remote_ip the remote IP address to send the segment to - * @param local_port the local TCP port to send the segment from - * @param remote_port the remote TCP port to send the segment to - */ -void -tcp_rst_impl(u32_t seqno, u32_t ackno, - ipX_addr_t *local_ip, ipX_addr_t *remote_ip, - u16_t local_port, u16_t remote_port -#if LWIP_IPV6 - , u8_t isipv6 -#endif /* LWIP_IPV6 */ - ) -{ - struct pbuf *p; - struct tcp_hdr *tcphdr; - p = pbuf_alloc(PBUF_IP, TCP_HLEN, PBUF_RAM); - if (p == NULL) { - LWIP_DEBUGF(TCP_DEBUG, ("tcp_rst: could not allocate memory for pbuf\n")); - return; - } - LWIP_ASSERT("check that first pbuf can hold struct tcp_hdr", - (p->len >= sizeof(struct tcp_hdr))); - - tcphdr = (struct tcp_hdr *)p->payload; - tcphdr->src = htons(local_port); - tcphdr->dest = htons(remote_port); - tcphdr->seqno = htonl(seqno); - tcphdr->ackno = htonl(ackno); - TCPH_HDRLEN_FLAGS_SET(tcphdr, TCP_HLEN/4, TCP_RST | TCP_ACK); - tcphdr->wnd = PP_HTONS(TCP_WND); - tcphdr->chksum = 0; - tcphdr->urgp = 0; - - TCP_STATS_INC(tcp.xmit); - snmp_inc_tcpoutrsts(); - -#if CHECKSUM_GEN_TCP - tcphdr->chksum = ipX_chksum_pseudo(isipv6, p, IP_PROTO_TCP, p->tot_len, - local_ip, remote_ip); -#endif - /* Send output with hardcoded TTL/HL since we have no access to the pcb */ - ipX_output(isipv6, p, local_ip, remote_ip, TCP_TTL, 0, IP_PROTO_TCP); - pbuf_free(p); - LWIP_DEBUGF(TCP_RST_DEBUG, ("tcp_rst: seqno %"U32_F" ackno %"U32_F".\n", seqno, ackno)); -} - -/** - * Requeue all unacked segments for retransmission - * - * Called by tcp_slowtmr() for slow retransmission. - * - * @param pcb the tcp_pcb for which to re-enqueue all unacked segments - */ -void -tcp_rexmit_rto(struct tcp_pcb *pcb) -{ - struct tcp_seg *seg; - - if (pcb->unacked == NULL) { - return; - } - - /* Move all unacked segments to the head of the unsent queue */ - for (seg = pcb->unacked; seg->next != NULL; seg = seg->next); - /* concatenate unsent queue after unacked queue */ - seg->next = pcb->unsent; - /* unsent queue is the concatenated queue (of unacked, unsent) */ - pcb->unsent = pcb->unacked; - /* unacked queue is now empty */ - pcb->unacked = NULL; - /* last unsent hasn't changed, no need to reset unsent_oversize */ - - /* increment number of retransmissions */ - ++pcb->nrtx; - - /* Don't take any RTT measurements after retransmitting. */ - pcb->rttest = 0; - - /* Do the actual retransmission */ - tcp_output(pcb); -} - -/** - * Requeue the first unacked segment for retransmission - * - * Called by tcp_receive() for fast retramsmit. - * - * @param pcb the tcp_pcb for which to retransmit the first unacked segment - */ -void -tcp_rexmit(struct tcp_pcb *pcb) -{ - struct tcp_seg *seg; - struct tcp_seg **cur_seg; - - if (pcb->unacked == NULL) { - return; - } - - /* Move the first unacked segment to the unsent queue */ - /* Keep the unsent queue sorted. */ - seg = pcb->unacked; - pcb->unacked = seg->next; - - cur_seg = &(pcb->unsent); - while (*cur_seg && - TCP_SEQ_LT(ntohl((*cur_seg)->tcphdr->seqno), ntohl(seg->tcphdr->seqno))) { - cur_seg = &((*cur_seg)->next ); - } - seg->next = *cur_seg; - *cur_seg = seg; -#if TCP_OVERSIZE - if (seg->next == NULL) { - /* the retransmitted segment is last in unsent, so reset unsent_oversize */ - pcb->unsent_oversize = 0; - } -#endif /* TCP_OVERSIZE */ - - ++pcb->nrtx; - - /* Don't take any rtt measurements after retransmitting. */ - pcb->rttest = 0; - - /* Do the actual retransmission. */ - snmp_inc_tcpretranssegs(); - /* No need to call tcp_output: we are always called from tcp_input() - and thus tcp_output directly returns. */ -} - - -/** - * Handle retransmission after three dupacks received - * - * @param pcb the tcp_pcb for which to retransmit the first unacked segment - */ -void -tcp_rexmit_fast(struct tcp_pcb *pcb) -{ - if (pcb->unacked != NULL && !(pcb->flags & TF_INFR)) { - /* This is fast retransmit. Retransmit the first unacked segment. */ - LWIP_DEBUGF(TCP_FR_DEBUG, - ("tcp_receive: dupacks %"U16_F" (%"U32_F - "), fast retransmit %"U32_F"\n", - (u16_t)pcb->dupacks, pcb->lastack, - ntohl(pcb->unacked->tcphdr->seqno))); - tcp_rexmit(pcb); - - /* Set ssthresh to half of the minimum of the current - * cwnd and the advertised window */ - if (pcb->cwnd > pcb->snd_wnd) { - pcb->ssthresh = pcb->snd_wnd / 2; - } else { - pcb->ssthresh = pcb->cwnd / 2; - } - - /* The minimum value for ssthresh should be 2 MSS */ - if (pcb->ssthresh < 2*pcb->mss) { - LWIP_DEBUGF(TCP_FR_DEBUG, - ("tcp_receive: The minimum value for ssthresh %"U16_F - " should be min 2 mss %"U16_F"...\n", - pcb->ssthresh, 2*pcb->mss)); - pcb->ssthresh = 2*pcb->mss; - } - - pcb->cwnd = pcb->ssthresh + 3 * pcb->mss; - pcb->flags |= TF_INFR; - } -} - - -/** - * Send keepalive packets to keep a connection active although - * no data is sent over it. - * - * Called by tcp_slowtmr() - * - * @param pcb the tcp_pcb for which to send a keepalive packet - */ -void -tcp_keepalive(struct tcp_pcb *pcb) -{ - struct pbuf *p; -#if CHECKSUM_GEN_TCP - struct tcp_hdr *tcphdr; -#endif /* CHECKSUM_GEN_TCP */ - - LWIP_DEBUGF(TCP_DEBUG, ("tcp_keepalive: sending KEEPALIVE probe to ")); - ipX_addr_debug_print(PCB_ISIPV6(pcb), TCP_DEBUG, &pcb->remote_ip); - LWIP_DEBUGF(TCP_DEBUG, ("\n")); - - LWIP_DEBUGF(TCP_DEBUG, ("tcp_keepalive: tcp_ticks %"U32_F" pcb->tmr %"U32_F" pcb->keep_cnt_sent %"U16_F"\n", - tcp_ticks, pcb->tmr, pcb->keep_cnt_sent)); - - p = tcp_output_alloc_header(pcb, 0, 0, htonl(pcb->snd_nxt - 1)); - if(p == NULL) { - LWIP_DEBUGF(TCP_DEBUG, - ("tcp_keepalive: could not allocate memory for pbuf\n")); - return; - } -#if CHECKSUM_GEN_TCP - tcphdr = (struct tcp_hdr *)p->payload; - - tcphdr->chksum = ipX_chksum_pseudo(PCB_ISIPV6(pcb), p, IP_PROTO_TCP, p->tot_len, - &pcb->local_ip, &pcb->remote_ip); -#endif /* CHECKSUM_GEN_TCP */ - TCP_STATS_INC(tcp.xmit); - - /* Send output to IP */ -#if LWIP_NETIF_HWADDRHINT - ipX_output_hinted(PCB_ISIPV6(pcb), p, &pcb->local_ip, &pcb->remote_ip, - pcb->ttl, 0, IP_PROTO_TCP, &pcb->addr_hint); -#else /* LWIP_NETIF_HWADDRHINT*/ - ipX_output(PCB_ISIPV6(pcb), p, &pcb->local_ip, &pcb->remote_ip, pcb->ttl, - 0, IP_PROTO_TCP); -#endif /* LWIP_NETIF_HWADDRHINT*/ - - pbuf_free(p); - - LWIP_DEBUGF(TCP_DEBUG, ("tcp_keepalive: seqno %"U32_F" ackno %"U32_F".\n", - pcb->snd_nxt - 1, pcb->rcv_nxt)); -} - - -/** - * Send persist timer zero-window probes to keep a connection active - * when a window update is lost. - * - * Called by tcp_slowtmr() - * - * @param pcb the tcp_pcb for which to send a zero-window probe packet - */ -void -tcp_zero_window_probe(struct tcp_pcb *pcb) -{ - struct pbuf *p; - struct tcp_hdr *tcphdr; - struct tcp_seg *seg; - u16_t len; - u8_t is_fin; - - LWIP_DEBUGF(TCP_DEBUG, ("tcp_zero_window_probe: sending ZERO WINDOW probe to ")); - ipX_addr_debug_print(PCB_ISIPV6(pcb), TCP_DEBUG, &pcb->remote_ip); - LWIP_DEBUGF(TCP_DEBUG, ("\n")); - - LWIP_DEBUGF(TCP_DEBUG, - ("tcp_zero_window_probe: tcp_ticks %"U32_F - " pcb->tmr %"U32_F" pcb->keep_cnt_sent %"U16_F"\n", - tcp_ticks, pcb->tmr, pcb->keep_cnt_sent)); - - seg = pcb->unacked; - - if(seg == NULL) { - seg = pcb->unsent; - } - if(seg == NULL) { - return; - } - - is_fin = ((TCPH_FLAGS(seg->tcphdr) & TCP_FIN) != 0) && (seg->len == 0); - /* we want to send one seqno: either FIN or data (no options) */ - len = is_fin ? 0 : 1; - - p = tcp_output_alloc_header(pcb, 0, len, seg->tcphdr->seqno); - if(p == NULL) { - LWIP_DEBUGF(TCP_DEBUG, ("tcp_zero_window_probe: no memory for pbuf\n")); - return; - } - tcphdr = (struct tcp_hdr *)p->payload; - - if (is_fin) { - /* FIN segment, no data */ - TCPH_FLAGS_SET(tcphdr, TCP_ACK | TCP_FIN); - } else { - /* Data segment, copy in one byte from the head of the unacked queue */ - char *d = ((char *)p->payload + TCP_HLEN); - /* Depending on whether the segment has already been sent (unacked) or not - (unsent), seg->p->payload points to the IP header or TCP header. - Ensure we copy the first TCP data byte: */ - pbuf_copy_partial(seg->p, d, 1, seg->p->tot_len - seg->len); - } - -#if CHECKSUM_GEN_TCP - tcphdr->chksum = ipX_chksum_pseudo(PCB_ISIPV6(pcb), p, IP_PROTO_TCP, p->tot_len, - &pcb->local_ip, &pcb->remote_ip); -#endif - TCP_STATS_INC(tcp.xmit); - - /* Send output to IP */ -#if LWIP_NETIF_HWADDRHINT - ipX_output_hinted(PCB_ISIPV6(pcb), p, &pcb->local_ip, &pcb->remote_ip, pcb->ttl, - 0, IP_PROTO_TCP, &pcb->addr_hint); -#else /* LWIP_NETIF_HWADDRHINT*/ - ipX_output(PCB_ISIPV6(pcb), p, &pcb->local_ip, &pcb->remote_ip, pcb->ttl, 0, IP_PROTO_TCP); -#endif /* LWIP_NETIF_HWADDRHINT*/ - - pbuf_free(p); - - LWIP_DEBUGF(TCP_DEBUG, ("tcp_zero_window_probe: seqno %"U32_F - " ackno %"U32_F".\n", - pcb->snd_nxt - 1, pcb->rcv_nxt)); -} -#endif /* LWIP_TCP */ diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/core/timers.c b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/core/timers.c deleted file mode 100644 index 167f2351..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/core/timers.c +++ /dev/null @@ -1,545 +0,0 @@ -/** - * @file - * Stack-internal timers implementation. - * This file includes timer callbacks for stack-internal timers as well as - * functions to set up or stop timers and check for expired timers. - * - */ - -/* - * Copyright (c) 2001-2004 Swedish Institute of Computer Science. - * 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. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT - * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING - * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY - * OF SUCH DAMAGE. - * - * This file is part of the lwIP TCP/IP stack. - * - * Author: Adam Dunkels - * Simon Goldschmidt - * - */ - -#include "lwip/opt.h" - -#include "lwip/timers.h" -#include "lwip/tcp_impl.h" - -#if LWIP_TIMERS - -#include "lwip/def.h" -#include "lwip/memp.h" -#include "lwip/tcpip.h" - -#include "lwip/ip_frag.h" -#include "netif/etharp.h" -#include "lwip/dhcp.h" -#include "lwip/autoip.h" -#include "lwip/igmp.h" -#include "lwip/dns.h" -#include "lwip/nd6.h" -#include "lwip/ip6_frag.h" -#include "lwip/mld6.h" -#include "lwip/sys.h" -#include "lwip/pbuf.h" - -/** The one and only timeout list */ -static struct sys_timeo *next_timeout; -#if NO_SYS -static u32_t timeouts_last_time; -#endif /* NO_SYS */ - -#if LWIP_TCP -/** global variable that shows if the tcp timer is currently scheduled or not */ -static int tcpip_tcp_timer_active; - -/** - * Timer callback function that calls tcp_tmr() and reschedules itself. - * - * @param arg unused argument - */ -static void -tcpip_tcp_timer(void *arg) -{ - LWIP_UNUSED_ARG(arg); - - /* call TCP timer handler */ - tcp_tmr(); - /* timer still needed? */ - if (tcp_active_pcbs || tcp_tw_pcbs) { - /* restart timer */ - sys_timeout(TCP_TMR_INTERVAL, tcpip_tcp_timer, NULL); - } else { - /* disable timer */ - tcpip_tcp_timer_active = 0; - } -} - -/** - * Called from TCP_REG when registering a new PCB: - * the reason is to have the TCP timer only running when - * there are active (or time-wait) PCBs. - */ -void -tcp_timer_needed(void) -{ - /* timer is off but needed again? */ - if (!tcpip_tcp_timer_active && (tcp_active_pcbs || tcp_tw_pcbs)) { - /* enable and start timer */ - tcpip_tcp_timer_active = 1; - sys_timeout(TCP_TMR_INTERVAL, tcpip_tcp_timer, NULL); - } -} -#endif /* LWIP_TCP */ - -#if IP_REASSEMBLY -/** - * Timer callback function that calls ip_reass_tmr() and reschedules itself. - * - * @param arg unused argument - */ -static void -ip_reass_timer(void *arg) -{ - LWIP_UNUSED_ARG(arg); - LWIP_DEBUGF(TIMERS_DEBUG, ("tcpip: ip_reass_tmr()\n")); - ip_reass_tmr(); - sys_timeout(IP_TMR_INTERVAL, ip_reass_timer, NULL); -} -#endif /* IP_REASSEMBLY */ - -#if LWIP_ARP -/** - * Timer callback function that calls etharp_tmr() and reschedules itself. - * - * @param arg unused argument - */ -static void -arp_timer(void *arg) -{ - LWIP_UNUSED_ARG(arg); - LWIP_DEBUGF(TIMERS_DEBUG, ("tcpip: etharp_tmr()\n")); - etharp_tmr(); - sys_timeout(ARP_TMR_INTERVAL, arp_timer, NULL); -} -#endif /* LWIP_ARP */ - -#if LWIP_DHCP -/** - * Timer callback function that calls dhcp_coarse_tmr() and reschedules itself. - * - * @param arg unused argument - */ -static void -dhcp_timer_coarse(void *arg) -{ - LWIP_UNUSED_ARG(arg); - LWIP_DEBUGF(TIMERS_DEBUG, ("tcpip: dhcp_coarse_tmr()\n")); - dhcp_coarse_tmr(); - sys_timeout(DHCP_COARSE_TIMER_MSECS, dhcp_timer_coarse, NULL); -} - -/** - * Timer callback function that calls dhcp_fine_tmr() and reschedules itself. - * - * @param arg unused argument - */ -static void -dhcp_timer_fine(void *arg) -{ - LWIP_UNUSED_ARG(arg); - LWIP_DEBUGF(TIMERS_DEBUG, ("tcpip: dhcp_fine_tmr()\n")); - dhcp_fine_tmr(); - sys_timeout(DHCP_FINE_TIMER_MSECS, dhcp_timer_fine, NULL); -} -#endif /* LWIP_DHCP */ - -#if LWIP_AUTOIP -/** - * Timer callback function that calls autoip_tmr() and reschedules itself. - * - * @param arg unused argument - */ -static void -autoip_timer(void *arg) -{ - LWIP_UNUSED_ARG(arg); - LWIP_DEBUGF(TIMERS_DEBUG, ("tcpip: autoip_tmr()\n")); - autoip_tmr(); - sys_timeout(AUTOIP_TMR_INTERVAL, autoip_timer, NULL); -} -#endif /* LWIP_AUTOIP */ - -#if LWIP_IGMP -/** - * Timer callback function that calls igmp_tmr() and reschedules itself. - * - * @param arg unused argument - */ -static void -igmp_timer(void *arg) -{ - LWIP_UNUSED_ARG(arg); - LWIP_DEBUGF(TIMERS_DEBUG, ("tcpip: igmp_tmr()\n")); - igmp_tmr(); - sys_timeout(IGMP_TMR_INTERVAL, igmp_timer, NULL); -} -#endif /* LWIP_IGMP */ - -#if LWIP_DNS -/** - * Timer callback function that calls dns_tmr() and reschedules itself. - * - * @param arg unused argument - */ -static void -dns_timer(void *arg) -{ - LWIP_UNUSED_ARG(arg); - LWIP_DEBUGF(TIMERS_DEBUG, ("tcpip: dns_tmr()\n")); - dns_tmr(); - sys_timeout(DNS_TMR_INTERVAL, dns_timer, NULL); -} -#endif /* LWIP_DNS */ - -#if LWIP_IPV6 -/** - * Timer callback function that calls nd6_tmr() and reschedules itself. - * - * @param arg unused argument - */ -static void -nd6_timer(void *arg) -{ - LWIP_UNUSED_ARG(arg); - LWIP_DEBUGF(TIMERS_DEBUG, ("tcpip: nd6_tmr()\n")); - nd6_tmr(); - sys_timeout(ND6_TMR_INTERVAL, nd6_timer, NULL); -} - -#if LWIP_IPV6_REASS -/** - * Timer callback function that calls ip6_reass_tmr() and reschedules itself. - * - * @param arg unused argument - */ -static void -ip6_reass_timer(void *arg) -{ - LWIP_UNUSED_ARG(arg); - LWIP_DEBUGF(TIMERS_DEBUG, ("tcpip: ip6_reass_tmr()\n")); - ip6_reass_tmr(); - sys_timeout(IP6_REASS_TMR_INTERVAL, ip6_reass_timer, NULL); -} -#endif /* LWIP_IPV6_REASS */ - -#if LWIP_IPV6_MLD -/** - * Timer callback function that calls mld6_tmr() and reschedules itself. - * - * @param arg unused argument - */ -static void -mld6_timer(void *arg) -{ - LWIP_UNUSED_ARG(arg); - LWIP_DEBUGF(TIMERS_DEBUG, ("tcpip: mld6_tmr()\n")); - mld6_tmr(); - sys_timeout(MLD6_TMR_INTERVAL, mld6_timer, NULL); -} -#endif /* LWIP_IPV6_MLD */ -#endif /* LWIP_IPV6 */ - -/** Initialize this module */ -void sys_timeouts_init(void) -{ -#if IP_REASSEMBLY - sys_timeout(IP_TMR_INTERVAL, ip_reass_timer, NULL); -#endif /* IP_REASSEMBLY */ -#if LWIP_ARP - sys_timeout(ARP_TMR_INTERVAL, arp_timer, NULL); -#endif /* LWIP_ARP */ -#if LWIP_DHCP - sys_timeout(DHCP_COARSE_TIMER_MSECS, dhcp_timer_coarse, NULL); - sys_timeout(DHCP_FINE_TIMER_MSECS, dhcp_timer_fine, NULL); -#endif /* LWIP_DHCP */ -#if LWIP_AUTOIP - sys_timeout(AUTOIP_TMR_INTERVAL, autoip_timer, NULL); -#endif /* LWIP_AUTOIP */ -#if LWIP_IGMP - sys_timeout(IGMP_TMR_INTERVAL, igmp_timer, NULL); -#endif /* LWIP_IGMP */ -#if LWIP_DNS - sys_timeout(DNS_TMR_INTERVAL, dns_timer, NULL); -#endif /* LWIP_DNS */ -#if LWIP_IPV6 - sys_timeout(ND6_TMR_INTERVAL, nd6_timer, NULL); -#if LWIP_IPV6_REASS - sys_timeout(IP6_REASS_TMR_INTERVAL, ip6_reass_timer, NULL); -#endif /* LWIP_IPV6_REASS */ -#if LWIP_IPV6_MLD - sys_timeout(MLD6_TMR_INTERVAL, mld6_timer, NULL); -#endif /* LWIP_IPV6_MLD */ -#endif /* LWIP_IPV6 */ - -#if NO_SYS - /* Initialise timestamp for sys_check_timeouts */ - timeouts_last_time = sys_now(); -#endif -} - -/** - * Create a one-shot timer (aka timeout). Timeouts are processed in the - * following cases: - * - while waiting for a message using sys_timeouts_mbox_fetch() - * - by calling sys_check_timeouts() (NO_SYS==1 only) - * - * @param msecs time in milliseconds after that the timer should expire - * @param handler callback function to call when msecs have elapsed - * @param arg argument to pass to the callback function - */ -#if LWIP_DEBUG_TIMERNAMES -void -sys_timeout_debug(u32_t msecs, sys_timeout_handler handler, void *arg, const char* handler_name) -#else /* LWIP_DEBUG_TIMERNAMES */ -void -sys_timeout(u32_t msecs, sys_timeout_handler handler, void *arg) -#endif /* LWIP_DEBUG_TIMERNAMES */ -{ - struct sys_timeo *timeout, *t; - timeout = (struct sys_timeo *)memp_malloc(MEMP_SYS_TIMEOUT); - if (timeout == NULL) { - LWIP_ASSERT("sys_timeout: timeout != NULL, pool MEMP_SYS_TIMEOUT is empty", timeout != NULL); - return; - } - timeout->next = NULL; - timeout->h = handler; - timeout->arg = arg; - timeout->time = msecs; -#if LWIP_DEBUG_TIMERNAMES - timeout->handler_name = handler_name; - LWIP_DEBUGF(TIMERS_DEBUG, ("sys_timeout: %p msecs=%"U32_F" handler=%s arg=%p\n", - (void *)timeout, msecs, handler_name, (void *)arg)); -#endif /* LWIP_DEBUG_TIMERNAMES */ - - if (next_timeout == NULL) { - next_timeout = timeout; - return; - } - - if (next_timeout->time > msecs) { - next_timeout->time -= msecs; - timeout->next = next_timeout; - next_timeout = timeout; - } else { - for(t = next_timeout; t != NULL; t = t->next) { - timeout->time -= t->time; - if (t->next == NULL || t->next->time > timeout->time) { - if (t->next != NULL) { - t->next->time -= timeout->time; - } - timeout->next = t->next; - t->next = timeout; - break; - } - } - } -} - -/** - * Go through timeout list (for this task only) and remove the first matching - * entry, even though the timeout has not triggered yet. - * - * @note This function only works as expected if there is only one timeout - * calling 'handler' in the list of timeouts. - * - * @param handler callback function that would be called by the timeout - * @param arg callback argument that would be passed to handler -*/ -void -sys_untimeout(sys_timeout_handler handler, void *arg) -{ - struct sys_timeo *prev_t, *t; - - if (next_timeout == NULL) { - return; - } - - for (t = next_timeout, prev_t = NULL; t != NULL; prev_t = t, t = t->next) { - if ((t->h == handler) && (t->arg == arg)) { - /* We have a match */ - /* Unlink from previous in list */ - if (prev_t == NULL) { - next_timeout = t->next; - } else { - prev_t->next = t->next; - } - /* If not the last one, add time of this one back to next */ - if (t->next != NULL) { - t->next->time += t->time; - } - memp_free(MEMP_SYS_TIMEOUT, t); - return; - } - } - return; -} - -#if NO_SYS - -/** Handle timeouts for NO_SYS==1 (i.e. without using - * tcpip_thread/sys_timeouts_mbox_fetch(). Uses sys_now() to call timeout - * handler functions when timeouts expire. - * - * Must be called periodically from your main loop. - */ -void -sys_check_timeouts(void) -{ - if (next_timeout) { - struct sys_timeo *tmptimeout; - u32_t diff; - sys_timeout_handler handler; - void *arg; - u8_t had_one; - u32_t now; - - now = sys_now(); - /* this cares for wraparounds */ - diff = now - timeouts_last_time; - do - { -#if PBUF_POOL_FREE_OOSEQ - PBUF_CHECK_FREE_OOSEQ(); -#endif /* PBUF_POOL_FREE_OOSEQ */ - had_one = 0; - tmptimeout = next_timeout; - if (tmptimeout && (tmptimeout->time <= diff)) { - /* timeout has expired */ - had_one = 1; - timeouts_last_time = now; - diff -= tmptimeout->time; - next_timeout = tmptimeout->next; - handler = tmptimeout->h; - arg = tmptimeout->arg; -#if LWIP_DEBUG_TIMERNAMES - if (handler != NULL) { - LWIP_DEBUGF(TIMERS_DEBUG, ("sct calling h=%s arg=%p\n", - tmptimeout->handler_name, arg)); - } -#endif /* LWIP_DEBUG_TIMERNAMES */ - memp_free(MEMP_SYS_TIMEOUT, tmptimeout); - if (handler != NULL) { - handler(arg); - } - } - /* repeat until all expired timers have been called */ - }while(had_one); - } -} - -/** Set back the timestamp of the last call to sys_check_timeouts() - * This is necessary if sys_check_timeouts() hasn't been called for a long - * time (e.g. while saving energy) to prevent all timer functions of that - * period being called. - */ -void -sys_restart_timeouts(void) -{ - timeouts_last_time = sys_now(); -} - -#else /* NO_SYS */ - -/** - * Wait (forever) for a message to arrive in an mbox. - * While waiting, timeouts are processed. - * - * @param mbox the mbox to fetch the message from - * @param msg the place to store the message - */ -void -sys_timeouts_mbox_fetch(sys_mbox_t *mbox, void **msg) -{ - u32_t time_needed; - struct sys_timeo *tmptimeout; - sys_timeout_handler handler; - void *arg; - - again: - if (!next_timeout) { - time_needed = sys_arch_mbox_fetch(mbox, msg, 0); - } else { - if (next_timeout->time > 0) { - time_needed = sys_arch_mbox_fetch(mbox, msg, next_timeout->time); - } else { - time_needed = SYS_ARCH_TIMEOUT; - } - - if (time_needed == SYS_ARCH_TIMEOUT) { - /* If time == SYS_ARCH_TIMEOUT, a timeout occured before a message - could be fetched. We should now call the timeout handler and - deallocate the memory allocated for the timeout. */ - tmptimeout = next_timeout; - next_timeout = tmptimeout->next; - handler = tmptimeout->h; - arg = tmptimeout->arg; -#if LWIP_DEBUG_TIMERNAMES - if (handler != NULL) { - LWIP_DEBUGF(TIMERS_DEBUG, ("stmf calling h=%s arg=%p\n", - tmptimeout->handler_name, arg)); - } -#endif /* LWIP_DEBUG_TIMERNAMES */ - memp_free(MEMP_SYS_TIMEOUT, tmptimeout); - if (handler != NULL) { - /* For LWIP_TCPIP_CORE_LOCKING, lock the core before calling the - timeout handler function. */ - LOCK_TCPIP_CORE(); - handler(arg); - UNLOCK_TCPIP_CORE(); - } - LWIP_TCPIP_THREAD_ALIVE(); - - /* We try again to fetch a message from the mbox. */ - goto again; - } else { - /* If time != SYS_ARCH_TIMEOUT, a message was received before the timeout - occured. The time variable is set to the number of - milliseconds we waited for the message. */ - if (time_needed < next_timeout->time) { - next_timeout->time -= time_needed; - } else { - next_timeout->time = 0; - } - } - } -} - -#endif /* NO_SYS */ - -#else /* LWIP_TIMERS */ -/* Satisfy the TCP code which calls this function */ -void -tcp_timer_needed(void) -{ -} -#endif /* LWIP_TIMERS */ diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/core/udp.c b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/core/udp.c deleted file mode 100644 index ac0e56d1..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/core/udp.c +++ /dev/null @@ -1,1151 +0,0 @@ -/** - * @file - * User Datagram Protocol module - * - */ - -/* - * Copyright (c) 2001-2004 Swedish Institute of Computer Science. - * 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. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT - * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING - * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY - * OF SUCH DAMAGE. - * - * This file is part of the lwIP TCP/IP stack. - * - * Author: Adam Dunkels - * - */ - - -/* udp.c - * - * The code for the User Datagram Protocol UDP & UDPLite (RFC 3828). - * - */ - -/* @todo Check the use of '(struct udp_pcb).chksum_len_rx'! - */ - -#include "lwip/opt.h" - -#if LWIP_UDP /* don't build if not configured for use in lwipopts.h */ - -#include "lwip/udp.h" -#include "lwip/def.h" -#include "lwip/memp.h" -#include "lwip/inet_chksum.h" -#include "lwip/ip_addr.h" -#include "lwip/ip6.h" -#include "lwip/ip6_addr.h" -#include "lwip/inet_chksum.h" -#include "lwip/netif.h" -#include "lwip/icmp.h" -#include "lwip/icmp6.h" -#include "lwip/stats.h" -#include "lwip/snmp.h" -#include "arch/perf.h" -#include "lwip/dhcp.h" - -#include - -#ifndef UDP_LOCAL_PORT_RANGE_START -/* From http://www.iana.org/assignments/port-numbers: - "The Dynamic and/or Private Ports are those from 49152 through 65535" */ -#define UDP_LOCAL_PORT_RANGE_START 0xc000 -#define UDP_LOCAL_PORT_RANGE_END 0xffff -#define UDP_ENSURE_LOCAL_PORT_RANGE(port) (((port) & ~UDP_LOCAL_PORT_RANGE_START) + UDP_LOCAL_PORT_RANGE_START) -#endif - -/* last local UDP port */ -static u16_t udp_port = UDP_LOCAL_PORT_RANGE_START; - -/* The list of UDP PCBs */ -/* exported in udp.h (was static) */ -struct udp_pcb *udp_pcbs; - -/** - * Initialize this module. - */ -void -udp_init(void) -{ -#if LWIP_RANDOMIZE_INITIAL_LOCAL_PORTS && defined(LWIP_RAND) - udp_port = UDP_ENSURE_LOCAL_PORT_RANGE(LWIP_RAND()); -#endif /* LWIP_RANDOMIZE_INITIAL_LOCAL_PORTS && defined(LWIP_RAND) */ -} - -/** - * Allocate a new local UDP port. - * - * @return a new (free) local UDP port number - */ -static u16_t -udp_new_port(void) -{ - u16_t n = 0; - struct udp_pcb *pcb; - -again: - if (udp_port++ == UDP_LOCAL_PORT_RANGE_END) { - udp_port = UDP_LOCAL_PORT_RANGE_START; - } - /* Check all PCBs. */ - for(pcb = udp_pcbs; pcb != NULL; pcb = pcb->next) { - if (pcb->local_port == udp_port) { - if (++n > (UDP_LOCAL_PORT_RANGE_END - UDP_LOCAL_PORT_RANGE_START)) { - return 0; - } - goto again; - } - } - return udp_port; -#if 0 - struct udp_pcb *ipcb = udp_pcbs; - while ((ipcb != NULL) && (udp_port != UDP_LOCAL_PORT_RANGE_END)) { - if (ipcb->local_port == udp_port) { - /* port is already used by another udp_pcb */ - udp_port++; - /* restart scanning all udp pcbs */ - ipcb = udp_pcbs; - } else { - /* go on with next udp pcb */ - ipcb = ipcb->next; - } - } - if (ipcb != NULL) { - return 0; - } - return udp_port; -#endif -} - -/** - * Process an incoming UDP datagram. - * - * Given an incoming UDP datagram (as a chain of pbufs) this function - * finds a corresponding UDP PCB and hands over the pbuf to the pcbs - * recv function. If no pcb is found or the datagram is incorrect, the - * pbuf is freed. - * - * @param p pbuf to be demultiplexed to a UDP PCB (p->payload pointing to the UDP header) - * @param inp network interface on which the datagram was received. - * - */ -void -udp_input(struct pbuf *p, struct netif *inp) -{ - struct udp_hdr *udphdr; - struct udp_pcb *pcb, *prev; - struct udp_pcb *uncon_pcb; - u16_t src, dest; - u8_t local_match; - u8_t broadcast; - u8_t for_us; - - PERF_START; - - UDP_STATS_INC(udp.recv); - - /* Check minimum length (UDP header) */ - if (p->len < UDP_HLEN) { - /* drop short packets */ - LWIP_DEBUGF(UDP_DEBUG, - ("udp_input: short UDP datagram (%"U16_F" bytes) discarded\n", p->tot_len)); - UDP_STATS_INC(udp.lenerr); - UDP_STATS_INC(udp.drop); - snmp_inc_udpinerrors(); - pbuf_free(p); - goto end; - } - - udphdr = (struct udp_hdr *)p->payload; - - /* is broadcast packet ? */ -#if LWIP_IPV6 - broadcast = !ip_current_is_v6() && ip_addr_isbroadcast(ip_current_dest_addr(), inp); -#else /* LWIP_IPV6 */ - broadcast = ip_addr_isbroadcast(ip_current_dest_addr(), inp); -#endif /* LWIP_IPV6 */ - - LWIP_DEBUGF(UDP_DEBUG, ("udp_input: received datagram of length %"U16_F"\n", p->tot_len)); - - /* convert src and dest ports to host byte order */ - src = ntohs(udphdr->src); - dest = ntohs(udphdr->dest); - - udp_debug_print(udphdr); - - /* print the UDP source and destination */ - LWIP_DEBUGF(UDP_DEBUG, ("udp (")); - ipX_addr_debug_print(ip_current_is_v6(), UDP_DEBUG, ipX_current_dest_addr()); - LWIP_DEBUGF(UDP_DEBUG, (", %"U16_F") <-- (", ntohs(udphdr->dest))); - ipX_addr_debug_print(ip_current_is_v6(), UDP_DEBUG, ipX_current_src_addr()); - LWIP_DEBUGF(UDP_DEBUG, (", %"U16_F")\n", ntohs(udphdr->src))); - -#if LWIP_DHCP - pcb = NULL; - /* when LWIP_DHCP is active, packets to DHCP_CLIENT_PORT may only be processed by - the dhcp module, no other UDP pcb may use the local UDP port DHCP_CLIENT_PORT */ - if (dest == DHCP_CLIENT_PORT) { - /* all packets for DHCP_CLIENT_PORT not coming from DHCP_SERVER_PORT are dropped! */ - if (src == DHCP_SERVER_PORT) { - if ((inp->dhcp != NULL) && (inp->dhcp->pcb != NULL)) { - /* accept the packe if - (- broadcast or directed to us) -> DHCP is link-layer-addressed, local ip is always ANY! - - inp->dhcp->pcb->remote == ANY or iphdr->src - (no need to check for IPv6 since the dhcp struct always uses IPv4) */ - if (ipX_addr_isany(0, &inp->dhcp->pcb->remote_ip) || - ip_addr_cmp(ipX_2_ip(&(inp->dhcp->pcb->remote_ip)), ip_current_src_addr())) { - pcb = inp->dhcp->pcb; - } - } - } - } else -#endif /* LWIP_DHCP */ - { - prev = NULL; - local_match = 0; - uncon_pcb = NULL; - /* Iterate through the UDP pcb list for a matching pcb. - * 'Perfect match' pcbs (connected to the remote port & ip address) are - * preferred. If no perfect match is found, the first unconnected pcb that - * matches the local port and ip address gets the datagram. */ - for (pcb = udp_pcbs; pcb != NULL; pcb = pcb->next) { - local_match = 0; - /* print the PCB local and remote address */ - LWIP_DEBUGF(UDP_DEBUG, ("pcb (")); - ipX_addr_debug_print(PCB_ISIPV6(pcb), UDP_DEBUG, &pcb->local_ip); - LWIP_DEBUGF(UDP_DEBUG, (", %"U16_F") <-- (", pcb->local_port)); - ipX_addr_debug_print(PCB_ISIPV6(pcb), UDP_DEBUG, &pcb->remote_ip); - LWIP_DEBUGF(UDP_DEBUG, (", %"U16_F")\n", pcb->remote_port)); - - /* compare PCB local addr+port to UDP destination addr+port */ - if (pcb->local_port == dest) { - if ( -#if LWIP_IPV6 - ((PCB_ISIPV6(pcb) && (ip_current_is_v6()) && - (ip6_addr_isany(ipX_2_ip6(&pcb->local_ip)) || -#if LWIP_IPV6_MLD - ip6_addr_ismulticast(ip6_current_dest_addr()) || -#endif /* LWIP_IPV6_MLD */ - ip6_addr_cmp(ipX_2_ip6(&pcb->local_ip), ip6_current_dest_addr()))) || - (!PCB_ISIPV6(pcb) && - (ip_current_header() != NULL) && -#else /* LWIP_IPV6 */ - (( -#endif /* LWIP_IPV6 */ - ((!broadcast && ipX_addr_isany(0, &pcb->local_ip)) || - ip_addr_cmp(ipX_2_ip(&pcb->local_ip), ip_current_dest_addr()) || -#if LWIP_IGMP - ip_addr_ismulticast(ip_current_dest_addr()) || -#endif /* LWIP_IGMP */ -#if IP_SOF_BROADCAST_RECV - (broadcast && ip_get_option(pcb, SOF_BROADCAST) && - (ipX_addr_isany(0, &pcb->local_ip) || - ip_addr_netcmp(ipX_2_ip(&pcb->local_ip), ip_current_dest_addr(), &inp->netmask))))))) { -#else /* IP_SOF_BROADCAST_RECV */ - (broadcast && - (ipX_addr_isany(0, &pcb->local_ip) || - ip_addr_netcmp(ipX_2_ip(&pcb->local_ip), ip_current_dest_addr(), &inp->netmask))))))) { -#endif /* IP_SOF_BROADCAST_RECV */ - local_match = 1; - if ((uncon_pcb == NULL) && - ((pcb->flags & UDP_FLAGS_CONNECTED) == 0)) { - /* the first unconnected matching PCB */ - uncon_pcb = pcb; - } - } - } - /* compare PCB remote addr+port to UDP source addr+port */ - if ((local_match != 0) && - (pcb->remote_port == src) && IP_PCB_IPVER_INPUT_MATCH(pcb) && - (ipX_addr_isany(PCB_ISIPV6(pcb), &pcb->remote_ip) || - ipX_addr_cmp(PCB_ISIPV6(pcb), &pcb->remote_ip, ipX_current_src_addr()))) { - /* the first fully matching PCB */ - if (prev != NULL) { - /* move the pcb to the front of udp_pcbs so that is - found faster next time */ - prev->next = pcb->next; - pcb->next = udp_pcbs; - udp_pcbs = pcb; - } else { - UDP_STATS_INC(udp.cachehit); - } - break; - } - prev = pcb; - } - /* no fully matching pcb found? then look for an unconnected pcb */ - if (pcb == NULL) { - pcb = uncon_pcb; - } - } - - /* Check checksum if this is a match or if it was directed at us. */ - if (pcb != NULL) { - for_us = 1; - } else { -#if LWIP_IPV6 - if (ip_current_is_v6()) { - for_us = netif_matches_ip6_addr(inp, ip6_current_dest_addr()); - } else -#endif /* LWIP_IPV6 */ - { - for_us = ip_addr_cmp(&inp->ip_addr, ip_current_dest_addr()); - } - } - if (for_us) { - LWIP_DEBUGF(UDP_DEBUG | LWIP_DBG_TRACE, ("udp_input: calculating checksum\n")); -#if CHECKSUM_CHECK_UDP -#if LWIP_UDPLITE - if (ip_current_header_proto() == IP_PROTO_UDPLITE) { - /* Do the UDP Lite checksum */ - u16_t chklen = ntohs(udphdr->len); - if (chklen < sizeof(struct udp_hdr)) { - if (chklen == 0) { - /* For UDP-Lite, checksum length of 0 means checksum - over the complete packet (See RFC 3828 chap. 3.1) */ - chklen = p->tot_len; - } else { - /* At least the UDP-Lite header must be covered by the - checksum! (Again, see RFC 3828 chap. 3.1) */ - goto chkerr; - } - } - if (ipX_chksum_pseudo_partial(ip_current_is_v6(), p, IP_PROTO_UDPLITE, - p->tot_len, chklen, - ipX_current_src_addr(), ipX_current_dest_addr()) != 0) { - goto chkerr; - } - } else -#endif /* LWIP_UDPLITE */ - { - if (udphdr->chksum != 0) { - if (ipX_chksum_pseudo(ip_current_is_v6(), p, IP_PROTO_UDP, p->tot_len, - ipX_current_src_addr(), - ipX_current_dest_addr()) != 0) { - goto chkerr; - } - } - } -#endif /* CHECKSUM_CHECK_UDP */ - if(pbuf_header(p, -UDP_HLEN)) { - /* Can we cope with this failing? Just assert for now */ - LWIP_ASSERT("pbuf_header failed\n", 0); - UDP_STATS_INC(udp.drop); - snmp_inc_udpinerrors(); - pbuf_free(p); - goto end; - } - if (pcb != NULL) { - snmp_inc_udpindatagrams(); -#if SO_REUSE && SO_REUSE_RXTOALL - if ((broadcast || -#if LWIP_IPV6 - ip6_addr_ismulticast(ip6_current_dest_addr()) || -#endif /* LWIP_IPV6 */ - ip_addr_ismulticast(ip_current_dest_addr())) && - ip_get_option(pcb, SOF_REUSEADDR)) { - /* pass broadcast- or multicast packets to all multicast pcbs - if SOF_REUSEADDR is set on the first match */ - struct udp_pcb *mpcb; - u8_t p_header_changed = 0; - s16_t hdrs_len = (s16_t)(ip_current_header_tot_len() + UDP_HLEN); - for (mpcb = udp_pcbs; mpcb != NULL; mpcb = mpcb->next) { - if (mpcb != pcb) { - /* compare PCB local addr+port to UDP destination addr+port */ - if ((mpcb->local_port == dest) && -#if LWIP_IPV6 - ((PCB_ISIPV6(mpcb) && - (ip6_addr_ismulticast(ip6_current_dest_addr()) || - ip6_addr_cmp(ipX_2_ip6(&mpcb->local_ip), ip6_current_dest_addr()))) || - (!PCB_ISIPV6(mpcb) && -#else /* LWIP_IPV6 */ - (( -#endif /* LWIP_IPV6 */ - ((!broadcast && ipX_addr_isany(0, &mpcb->local_ip)) || - ip_addr_cmp(ipX_2_ip(&mpcb->local_ip), ip_current_dest_addr()) || -#if LWIP_IGMP - ip_addr_ismulticast(ip_current_dest_addr()) || -#endif /* LWIP_IGMP */ -#if IP_SOF_BROADCAST_RECV - (broadcast && ip_get_option(mpcb, SOF_BROADCAST)))))) { -#else /* IP_SOF_BROADCAST_RECV */ - (broadcast))))) { -#endif /* IP_SOF_BROADCAST_RECV */ - /* pass a copy of the packet to all local matches */ - if (mpcb->recv.ip4 != NULL) { - struct pbuf *q; - /* for that, move payload to IP header again */ - if (p_header_changed == 0) { - pbuf_header(p, hdrs_len); - p_header_changed = 1; - } - q = pbuf_alloc(PBUF_RAW, p->tot_len, PBUF_RAM); - if (q != NULL) { - err_t err = pbuf_copy(q, p); - if (err == ERR_OK) { - /* move payload to UDP data */ - pbuf_header(q, -hdrs_len); -#if LWIP_IPV6 - if (PCB_ISIPV6(mpcb)) { - mpcb->recv.ip6(mpcb->recv_arg, mpcb, q, ip6_current_src_addr(), src); - } - else -#endif /* LWIP_IPV6 */ - { - mpcb->recv.ip4(mpcb->recv_arg, mpcb, q, ip_current_src_addr(), src); - } - } - } - } - } - } - } - if (p_header_changed) { - /* and move payload to UDP data again */ - pbuf_header(p, -hdrs_len); - } - } -#endif /* SO_REUSE && SO_REUSE_RXTOALL */ - /* callback */ - if (pcb->recv.ip4 != NULL) { - /* now the recv function is responsible for freeing p */ -#if LWIP_IPV6 - if (PCB_ISIPV6(pcb)) { - pcb->recv.ip6(pcb->recv_arg, pcb, p, ip6_current_src_addr(), src); - } - else -#endif /* LWIP_IPV6 */ - { - pcb->recv.ip4(pcb->recv_arg, pcb, p, ip_current_src_addr(), src); - } - } else { - /* no recv function registered? then we have to free the pbuf! */ - pbuf_free(p); - goto end; - } - } else { - LWIP_DEBUGF(UDP_DEBUG | LWIP_DBG_TRACE, ("udp_input: not for us.\n")); - -#if LWIP_ICMP || LWIP_ICMP6 - /* No match was found, send ICMP destination port unreachable unless - destination address was broadcast/multicast. */ - if (!broadcast && -#if LWIP_IPV6 - !ip6_addr_ismulticast(ip6_current_dest_addr()) && -#endif /* LWIP_IPV6 */ - !ip_addr_ismulticast(ip_current_dest_addr())) { - /* move payload pointer back to ip header */ - pbuf_header(p, ip_current_header_tot_len() + UDP_HLEN); - icmp_port_unreach(ip_current_is_v6(), p); - } -#endif /* LWIP_ICMP || LWIP_ICMP6 */ - UDP_STATS_INC(udp.proterr); - UDP_STATS_INC(udp.drop); - snmp_inc_udpnoports(); - pbuf_free(p); - } - } else { - pbuf_free(p); - } -end: - PERF_STOP("udp_input"); - return; -#if CHECKSUM_CHECK_UDP -chkerr: - LWIP_DEBUGF(UDP_DEBUG | LWIP_DBG_LEVEL_SERIOUS, - ("udp_input: UDP (or UDP Lite) datagram discarded due to failing checksum\n")); - UDP_STATS_INC(udp.chkerr); - UDP_STATS_INC(udp.drop); - snmp_inc_udpinerrors(); - pbuf_free(p); - PERF_STOP("udp_input"); -#endif /* CHECKSUM_CHECK_UDP */ -} - -/** - * Send data using UDP. - * - * @param pcb UDP PCB used to send the data. - * @param p chain of pbuf's to be sent. - * - * The datagram will be sent to the current remote_ip & remote_port - * stored in pcb. If the pcb is not bound to a port, it will - * automatically be bound to a random port. - * - * @return lwIP error code. - * - ERR_OK. Successful. No error occured. - * - ERR_MEM. Out of memory. - * - ERR_RTE. Could not find route to destination address. - * - More errors could be returned by lower protocol layers. - * - * @see udp_disconnect() udp_sendto() - */ -err_t -udp_send(struct udp_pcb *pcb, struct pbuf *p) -{ - /* send to the packet using remote ip and port stored in the pcb */ - return udp_sendto(pcb, p, ipX_2_ip(&pcb->remote_ip), pcb->remote_port); -} - -#if LWIP_CHECKSUM_ON_COPY && CHECKSUM_GEN_UDP -/** Same as udp_send() but with checksum - */ -err_t -udp_send_chksum(struct udp_pcb *pcb, struct pbuf *p, - u8_t have_chksum, u16_t chksum) -{ - /* send to the packet using remote ip and port stored in the pcb */ - return udp_sendto_chksum(pcb, p, ipX_2_ip(&pcb->remote_ip), pcb->remote_port, - have_chksum, chksum); -} -#endif /* LWIP_CHECKSUM_ON_COPY && CHECKSUM_GEN_UDP */ - -/** - * Send data to a specified address using UDP. - * - * @param pcb UDP PCB used to send the data. - * @param p chain of pbuf's to be sent. - * @param dst_ip Destination IP address. - * @param dst_port Destination UDP port. - * - * dst_ip & dst_port are expected to be in the same byte order as in the pcb. - * - * If the PCB already has a remote address association, it will - * be restored after the data is sent. - * - * @return lwIP error code (@see udp_send for possible error codes) - * - * @see udp_disconnect() udp_send() - */ -err_t -udp_sendto(struct udp_pcb *pcb, struct pbuf *p, - ip_addr_t *dst_ip, u16_t dst_port) -{ -#if LWIP_CHECKSUM_ON_COPY && CHECKSUM_GEN_UDP - return udp_sendto_chksum(pcb, p, dst_ip, dst_port, 0, 0); -} - -/** Same as udp_sendto(), but with checksum */ -err_t -udp_sendto_chksum(struct udp_pcb *pcb, struct pbuf *p, ip_addr_t *dst_ip, - u16_t dst_port, u8_t have_chksum, u16_t chksum) -{ -#endif /* LWIP_CHECKSUM_ON_COPY && CHECKSUM_GEN_UDP */ - struct netif *netif; - ipX_addr_t *dst_ip_route = ip_2_ipX(dst_ip); - - LWIP_DEBUGF(UDP_DEBUG | LWIP_DBG_TRACE, ("udp_send\n")); - -#if LWIP_IPV6 || LWIP_IGMP - if (ipX_addr_ismulticast(PCB_ISIPV6(pcb), dst_ip_route)) { - /* For multicast, find a netif based on source address. */ -#if LWIP_IPV6 - if (PCB_ISIPV6(pcb)) { - dst_ip_route = &pcb->local_ip; - } else -#endif /* LWIP_IPV6 */ - { -#if LWIP_IGMP - dst_ip_route = ip_2_ipX(&pcb->multicast_ip); -#endif /* LWIP_IGMP */ - } - } -#endif /* LWIP_IPV6 || LWIP_IGMP */ - - /* find the outgoing network interface for this packet */ - netif = ipX_route(PCB_ISIPV6(pcb), &pcb->local_ip, dst_ip_route); - - /* no outgoing network interface could be found? */ - if (netif == NULL) { - LWIP_DEBUGF(UDP_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("udp_send: No route to ")); - ipX_addr_debug_print(PCB_ISIPV6(pcb), UDP_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ip_2_ipX(dst_ip)); - LWIP_DEBUGF(UDP_DEBUG, ("\n")); - UDP_STATS_INC(udp.rterr); - return ERR_RTE; - } -#if LWIP_CHECKSUM_ON_COPY && CHECKSUM_GEN_UDP - return udp_sendto_if_chksum(pcb, p, dst_ip, dst_port, netif, have_chksum, chksum); -#else /* LWIP_CHECKSUM_ON_COPY && CHECKSUM_GEN_UDP */ - return udp_sendto_if(pcb, p, dst_ip, dst_port, netif); -#endif /* LWIP_CHECKSUM_ON_COPY && CHECKSUM_GEN_UDP */ -} - -/** - * Send data to a specified address using UDP. - * The netif used for sending can be specified. - * - * This function exists mainly for DHCP, to be able to send UDP packets - * on a netif that is still down. - * - * @param pcb UDP PCB used to send the data. - * @param p chain of pbuf's to be sent. - * @param dst_ip Destination IP address. - * @param dst_port Destination UDP port. - * @param netif the netif used for sending. - * - * dst_ip & dst_port are expected to be in the same byte order as in the pcb. - * - * @return lwIP error code (@see udp_send for possible error codes) - * - * @see udp_disconnect() udp_send() - */ -err_t -udp_sendto_if(struct udp_pcb *pcb, struct pbuf *p, - ip_addr_t *dst_ip, u16_t dst_port, struct netif *netif) -{ -#if LWIP_CHECKSUM_ON_COPY && CHECKSUM_GEN_UDP - return udp_sendto_if_chksum(pcb, p, dst_ip, dst_port, netif, 0, 0); -} - -/** Same as udp_sendto_if(), but with checksum */ -err_t -udp_sendto_if_chksum(struct udp_pcb *pcb, struct pbuf *p, ip_addr_t *dst_ip, - u16_t dst_port, struct netif *netif, u8_t have_chksum, - u16_t chksum) -{ -#endif /* LWIP_CHECKSUM_ON_COPY && CHECKSUM_GEN_UDP */ - struct udp_hdr *udphdr; - ip_addr_t *src_ip; - err_t err; - struct pbuf *q; /* q will be sent down the stack */ - u8_t ip_proto; - -#if IP_SOF_BROADCAST - /* broadcast filter? */ - if (!ip_get_option(pcb, SOF_BROADCAST) && -#if LWIP_IPV6 - !PCB_ISIPV6(pcb) && -#endif /* LWIP_IPV6 */ - ip_addr_isbroadcast(dst_ip, netif) ) { - LWIP_DEBUGF(UDP_DEBUG | LWIP_DBG_LEVEL_SERIOUS, - ("udp_sendto_if: SOF_BROADCAST not enabled on pcb %p\n", (void *)pcb)); - return ERR_VAL; - } -#endif /* IP_SOF_BROADCAST */ - - /* if the PCB is not yet bound to a port, bind it here */ - if (pcb->local_port == 0) { - LWIP_DEBUGF(UDP_DEBUG | LWIP_DBG_TRACE, ("udp_send: not yet bound to a port, binding now\n")); - err = udp_bind(pcb, ipX_2_ip(&pcb->local_ip), pcb->local_port); - if (err != ERR_OK) { - LWIP_DEBUGF(UDP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS, ("udp_send: forced port bind failed\n")); - return err; - } - } - - /* not enough space to add an UDP header to first pbuf in given p chain? */ - if (pbuf_header(p, UDP_HLEN)) { - /* allocate header in a separate new pbuf */ - q = pbuf_alloc(PBUF_IP, UDP_HLEN, PBUF_RAM); - /* new header pbuf could not be allocated? */ - if (q == NULL) { - LWIP_DEBUGF(UDP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS, ("udp_send: could not allocate header\n")); - return ERR_MEM; - } - if (p->tot_len != 0) { - /* chain header q in front of given pbuf p (only if p contains data) */ - pbuf_chain(q, p); - } - /* first pbuf q points to header pbuf */ - LWIP_DEBUGF(UDP_DEBUG, - ("udp_send: added header pbuf %p before given pbuf %p\n", (void *)q, (void *)p)); - } else { - /* adding space for header within p succeeded */ - /* first pbuf q equals given pbuf */ - q = p; - LWIP_DEBUGF(UDP_DEBUG, ("udp_send: added header in given pbuf %p\n", (void *)p)); - } - LWIP_ASSERT("check that first pbuf can hold struct udp_hdr", - (q->len >= sizeof(struct udp_hdr))); - /* q now represents the packet to be sent */ - udphdr = (struct udp_hdr *)q->payload; - udphdr->src = htons(pcb->local_port); - udphdr->dest = htons(dst_port); - /* in UDP, 0 checksum means 'no checksum' */ - udphdr->chksum = 0x0000; - - /* Multicast Loop? */ -#if LWIP_IGMP - if (((pcb->flags & UDP_FLAGS_MULTICAST_LOOP) != 0) && -#if LWIP_IPV6 - ( -#if LWIP_IPV6_MLD - (PCB_ISIPV6(pcb) && - ip6_addr_ismulticast(ip_2_ip6(dst_ip))) || -#endif /* LWIP_IPV6_MLD */ - (!PCB_ISIPV6(pcb) && -#else /* LWIP_IPV6 */ - (( -#endif /* LWIP_IPV6 */ - ip_addr_ismulticast(dst_ip)))) { - q->flags |= PBUF_FLAG_MCASTLOOP; - } -#endif /* LWIP_IGMP */ - - - /* PCB local address is IP_ANY_ADDR? */ -#if LWIP_IPV6 - if (PCB_ISIPV6(pcb)) { - if (ip6_addr_isany(ipX_2_ip6(&pcb->local_ip))) { - src_ip = ip6_2_ip(ip6_select_source_address(netif, ip_2_ip6(dst_ip))); - if (src_ip == NULL) { - /* No suitable source address was found. */ - if (q != p) { - /* free the header pbuf */ - pbuf_free(q); - /* p is still referenced by the caller, and will live on */ - } - return ERR_RTE; - } - } else { - /* use UDP PCB local IPv6 address as source address, if still valid. */ - if (netif_matches_ip6_addr(netif, ipX_2_ip6(&pcb->local_ip)) < 0) { - /* Address isn't valid anymore. */ - if (q != p) { - /* free the header pbuf */ - pbuf_free(q); - /* p is still referenced by the caller, and will live on */ - } - return ERR_RTE; - } - src_ip = ipX_2_ip(&pcb->local_ip); - } - } - else -#endif /* LWIP_IPV6 */ - if (ip_addr_isany(ipX_2_ip(&pcb->local_ip))) { - /* use outgoing network interface IP address as source address */ - src_ip = &(netif->ip_addr); - } else { - /* check if UDP PCB local IP address is correct - * this could be an old address if netif->ip_addr has changed */ - if (!ip_addr_cmp(ipX_2_ip(&(pcb->local_ip)), &(netif->ip_addr))) { - /* local_ip doesn't match, drop the packet */ - if (q != p) { - /* free the header pbuf */ - pbuf_free(q); - q = NULL; - /* p is still referenced by the caller, and will live on */ - } - return ERR_VAL; - } - /* use UDP PCB local IP address as source address */ - src_ip = ipX_2_ip(&(pcb->local_ip)); - } - - LWIP_DEBUGF(UDP_DEBUG, ("udp_send: sending datagram of length %"U16_F"\n", q->tot_len)); - -#if LWIP_UDPLITE - /* UDP Lite protocol? */ - if (pcb->flags & UDP_FLAGS_UDPLITE) { - u16_t chklen, chklen_hdr; - LWIP_DEBUGF(UDP_DEBUG, ("udp_send: UDP LITE packet length %"U16_F"\n", q->tot_len)); - /* set UDP message length in UDP header */ - chklen_hdr = chklen = pcb->chksum_len_tx; - if ((chklen < sizeof(struct udp_hdr)) || (chklen > q->tot_len)) { - if (chklen != 0) { - LWIP_DEBUGF(UDP_DEBUG, ("udp_send: UDP LITE pcb->chksum_len is illegal: %"U16_F"\n", chklen)); - } - /* For UDP-Lite, checksum length of 0 means checksum - over the complete packet. (See RFC 3828 chap. 3.1) - At least the UDP-Lite header must be covered by the - checksum, therefore, if chksum_len has an illegal - value, we generate the checksum over the complete - packet to be safe. */ - chklen_hdr = 0; - chklen = q->tot_len; - } - udphdr->len = htons(chklen_hdr); - /* calculate checksum */ -#if CHECKSUM_GEN_UDP -#if LWIP_CHECKSUM_ON_COPY - if (have_chksum) { - chklen = UDP_HLEN; - } -#endif /* LWIP_CHECKSUM_ON_COPY */ - udphdr->chksum = ipX_chksum_pseudo_partial(PCB_ISIPV6(pcb), q, IP_PROTO_UDPLITE, - q->tot_len, chklen, ip_2_ipX(src_ip), ip_2_ipX(dst_ip)); -#if LWIP_CHECKSUM_ON_COPY - if (have_chksum) { - u32_t acc; - acc = udphdr->chksum + (u16_t)~(chksum); - udphdr->chksum = FOLD_U32T(acc); - } -#endif /* LWIP_CHECKSUM_ON_COPY */ - - /* chksum zero must become 0xffff, as zero means 'no checksum' */ - if (udphdr->chksum == 0x0000) { - udphdr->chksum = 0xffff; - } -#endif /* CHECKSUM_GEN_UDP */ - - ip_proto = IP_PROTO_UDPLITE; - } else -#endif /* LWIP_UDPLITE */ - { /* UDP */ - LWIP_DEBUGF(UDP_DEBUG, ("udp_send: UDP packet length %"U16_F"\n", q->tot_len)); - udphdr->len = htons(q->tot_len); - /* calculate checksum */ -#if CHECKSUM_GEN_UDP - /* Checksum is mandatory over IPv6. */ - if (PCB_ISIPV6(pcb) || (pcb->flags & UDP_FLAGS_NOCHKSUM) == 0) { - u16_t udpchksum; -#if LWIP_CHECKSUM_ON_COPY - if (have_chksum) { - u32_t acc; - udpchksum = ipX_chksum_pseudo_partial(PCB_ISIPV6(pcb), q, IP_PROTO_UDP, - q->tot_len, UDP_HLEN, ip_2_ipX(src_ip), ip_2_ipX(dst_ip)); - acc = udpchksum + (u16_t)~(chksum); - udpchksum = FOLD_U32T(acc); - } else -#endif /* LWIP_CHECKSUM_ON_COPY */ - { - udpchksum = ipX_chksum_pseudo(PCB_ISIPV6(pcb), q, IP_PROTO_UDP, q->tot_len, - ip_2_ipX(src_ip), ip_2_ipX(dst_ip)); - } - - /* chksum zero must become 0xffff, as zero means 'no checksum' */ - if (udpchksum == 0x0000) { - udpchksum = 0xffff; - } - udphdr->chksum = udpchksum; - } -#endif /* CHECKSUM_GEN_UDP */ - ip_proto = IP_PROTO_UDP; - } - - LWIP_DEBUGF(UDP_DEBUG, ("udp_send: UDP checksum 0x%04"X16_F"\n", udphdr->chksum)); - LWIP_DEBUGF(UDP_DEBUG, ("udp_send: ip_output_if (,,,,0x%02"X16_F",)\n", (u16_t)ip_proto)); - /* output to IP */ - NETIF_SET_HWADDRHINT(netif, &(pcb->addr_hint)); - err = ipX_output_if(PCB_ISIPV6(pcb), q, src_ip, dst_ip, pcb->ttl, pcb->tos, ip_proto, netif); - NETIF_SET_HWADDRHINT(netif, NULL); - - /* TODO: must this be increased even if error occured? */ - snmp_inc_udpoutdatagrams(); - - /* did we chain a separate header pbuf earlier? */ - if (q != p) { - /* free the header pbuf */ - pbuf_free(q); - q = NULL; - /* p is still referenced by the caller, and will live on */ - } - - UDP_STATS_INC(udp.xmit); - return err; -} - -/** - * Bind an UDP PCB. - * - * @param pcb UDP PCB to be bound with a local address ipaddr and port. - * @param ipaddr local IP address to bind with. Use IP_ADDR_ANY to - * bind to all local interfaces. - * @param port local UDP port to bind with. Use 0 to automatically bind - * to a random port between UDP_LOCAL_PORT_RANGE_START and - * UDP_LOCAL_PORT_RANGE_END. - * - * ipaddr & port are expected to be in the same byte order as in the pcb. - * - * @return lwIP error code. - * - ERR_OK. Successful. No error occured. - * - ERR_USE. The specified ipaddr and port are already bound to by - * another UDP PCB. - * - * @see udp_disconnect() - */ -err_t -udp_bind(struct udp_pcb *pcb, ip_addr_t *ipaddr, u16_t port) -{ - struct udp_pcb *ipcb; - u8_t rebind; - - LWIP_DEBUGF(UDP_DEBUG | LWIP_DBG_TRACE, ("udp_bind(ipaddr = ")); - ipX_addr_debug_print(PCB_ISIPV6(pcb), UDP_DEBUG | LWIP_DBG_TRACE, ip_2_ipX(ipaddr)); - LWIP_DEBUGF(UDP_DEBUG | LWIP_DBG_TRACE, (", port = %"U16_F")\n", port)); - - rebind = 0; - /* Check for double bind and rebind of the same pcb */ - for (ipcb = udp_pcbs; ipcb != NULL; ipcb = ipcb->next) { - /* is this UDP PCB already on active list? */ - if (pcb == ipcb) { - /* pcb may occur at most once in active list */ - LWIP_ASSERT("rebind == 0", rebind == 0); - /* pcb already in list, just rebind */ - rebind = 1; - } - - /* By default, we don't allow to bind to a port that any other udp - PCB is alread bound to, unless *all* PCBs with that port have tha - REUSEADDR flag set. */ -#if SO_REUSE - else if (!ip_get_option(pcb, SOF_REUSEADDR) && - !ip_get_option(ipcb, SOF_REUSEADDR)) { -#else /* SO_REUSE */ - /* port matches that of PCB in list and REUSEADDR not set -> reject */ - else { -#endif /* SO_REUSE */ - if ((ipcb->local_port == port) && IP_PCB_IPVER_EQ(pcb, ipcb) && - /* IP address matches, or one is IP_ADDR_ANY? */ - (ipX_addr_isany(PCB_ISIPV6(ipcb), &(ipcb->local_ip)) || - ipX_addr_isany(PCB_ISIPV6(ipcb), ip_2_ipX(ipaddr)) || - ipX_addr_cmp(PCB_ISIPV6(ipcb), &(ipcb->local_ip), ip_2_ipX(ipaddr)))) { - /* other PCB already binds to this local IP and port */ - LWIP_DEBUGF(UDP_DEBUG, - ("udp_bind: local port %"U16_F" already bound by another pcb\n", port)); - return ERR_USE; - } - } - } - - ipX_addr_set_ipaddr(PCB_ISIPV6(pcb), &pcb->local_ip, ipaddr); - - /* no port specified? */ - if (port == 0) { - port = udp_new_port(); - if (port == 0) { - /* no more ports available in local range */ - LWIP_DEBUGF(UDP_DEBUG, ("udp_bind: out of free UDP ports\n")); - return ERR_USE; - } - } - pcb->local_port = port; - snmp_insert_udpidx_tree(pcb); - /* pcb not active yet? */ - if (rebind == 0) { - /* place the PCB on the active list if not already there */ - pcb->next = udp_pcbs; - udp_pcbs = pcb; - } - LWIP_DEBUGF(UDP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("udp_bind: bound to ")); - ipX_addr_debug_print(PCB_ISIPV6(pcb), UDP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, &pcb->local_ip); - LWIP_DEBUGF(UDP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, (", port %"U16_F")\n", pcb->local_port)); - return ERR_OK; -} - -/** - * Connect an UDP PCB. - * - * This will associate the UDP PCB with the remote address. - * - * @param pcb UDP PCB to be connected with remote address ipaddr and port. - * @param ipaddr remote IP address to connect with. - * @param port remote UDP port to connect with. - * - * @return lwIP error code - * - * ipaddr & port are expected to be in the same byte order as in the pcb. - * - * The udp pcb is bound to a random local port if not already bound. - * - * @see udp_disconnect() - */ -err_t -udp_connect(struct udp_pcb *pcb, ip_addr_t *ipaddr, u16_t port) -{ - struct udp_pcb *ipcb; - - if (pcb->local_port == 0) { - err_t err = udp_bind(pcb, ipX_2_ip(&pcb->local_ip), pcb->local_port); - if (err != ERR_OK) { - return err; - } - } - - ipX_addr_set_ipaddr(PCB_ISIPV6(pcb), &pcb->remote_ip, ipaddr); - pcb->remote_port = port; - pcb->flags |= UDP_FLAGS_CONNECTED; -/** TODO: this functionality belongs in upper layers */ -#ifdef LWIP_UDP_TODO -#if LWIP_IPV6 - if (!PCB_ISIPV6(pcb)) -#endif /* LWIP_IPV6 */ - { - /* Nail down local IP for netconn_addr()/getsockname() */ - if (ip_addr_isany(ipX_2_ip(&pcb->local_ip)) && !ip_addr_isany(ipX_2_ip(&pcb->remote_ip))) { - struct netif *netif; - - if ((netif = ip_route(ipX_2_ip(&pcb->remote_ip))) == NULL) { - LWIP_DEBUGF(UDP_DEBUG, ("udp_connect: No route to 0x%lx\n", - ip4_addr_get_u32(ipX_2_ip(&pcb->remote_ip)))); - UDP_STATS_INC(udp.rterr); - return ERR_RTE; - } - /** TODO: this will bind the udp pcb locally, to the interface which - is used to route output packets to the remote address. However, we - might want to accept incoming packets on any interface! */ - ipX_addr_copy(0, pcb->local_ip, netif->ip_addr); - } else if (ip_addr_isany(ipX_2_ip(&pcb->remote_ip))) { - ipX_addr_set_any(0, &pcb->local_ip); - } - } -#endif - LWIP_DEBUGF(UDP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("udp_connect: connected to ")); - ipX_addr_debug_print(PCB_ISIPV6(pcb), UDP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, - &pcb->remote_ip); - LWIP_DEBUGF(UDP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, (", port %"U16_F")\n", pcb->remote_port)); - - /* Insert UDP PCB into the list of active UDP PCBs. */ - for (ipcb = udp_pcbs; ipcb != NULL; ipcb = ipcb->next) { - if (pcb == ipcb) { - /* already on the list, just return */ - return ERR_OK; - } - } - /* PCB not yet on the list, add PCB now */ - pcb->next = udp_pcbs; - udp_pcbs = pcb; - return ERR_OK; -} - -/** - * Disconnect a UDP PCB - * - * @param pcb the udp pcb to disconnect. - */ -void -udp_disconnect(struct udp_pcb *pcb) -{ - /* reset remote address association */ - ipX_addr_set_any(PCB_ISIPV6(pcb), &pcb->remote_ip); - pcb->remote_port = 0; - /* mark PCB as unconnected */ - pcb->flags &= ~UDP_FLAGS_CONNECTED; -} - -/** - * Set a receive callback for a UDP PCB - * - * This callback will be called when receiving a datagram for the pcb. - * - * @param pcb the pcb for wich to set the recv callback - * @param recv function pointer of the callback function - * @param recv_arg additional argument to pass to the callback function - */ -void -udp_recv(struct udp_pcb *pcb, udp_recv_fn recv, void *recv_arg) -{ - /* remember recv() callback and user data */ - pcb->recv.ip4 = recv; - pcb->recv_arg = recv_arg; -} - -/** - * Remove an UDP PCB. - * - * @param pcb UDP PCB to be removed. The PCB is removed from the list of - * UDP PCB's and the data structure is freed from memory. - * - * @see udp_new() - */ -void -udp_remove(struct udp_pcb *pcb) -{ - struct udp_pcb *pcb2; - - snmp_delete_udpidx_tree(pcb); - /* pcb to be removed is first in list? */ - if (udp_pcbs == pcb) { - /* make list start at 2nd pcb */ - udp_pcbs = udp_pcbs->next; - /* pcb not 1st in list */ - } else { - for (pcb2 = udp_pcbs; pcb2 != NULL; pcb2 = pcb2->next) { - /* find pcb in udp_pcbs list */ - if (pcb2->next != NULL && pcb2->next == pcb) { - /* remove pcb from list */ - pcb2->next = pcb->next; - } - } - } - memp_free(MEMP_UDP_PCB, pcb); -} - -/** - * Create a UDP PCB. - * - * @return The UDP PCB which was created. NULL if the PCB data structure - * could not be allocated. - * - * @see udp_remove() - */ -struct udp_pcb * -udp_new(void) -{ - struct udp_pcb *pcb; - pcb = (struct udp_pcb *)memp_malloc(MEMP_UDP_PCB); - /* could allocate UDP PCB? */ - if (pcb != NULL) { - /* UDP Lite: by initializing to all zeroes, chksum_len is set to 0 - * which means checksum is generated over the whole datagram per default - * (recommended as default by RFC 3828). */ - /* initialize PCB to all zeroes */ - memset(pcb, 0, sizeof(struct udp_pcb)); - pcb->ttl = UDP_TTL; - } - return pcb; -} - -#if LWIP_IPV6 -/** - * Create a UDP PCB for IPv6. - * - * @return The UDP PCB which was created. NULL if the PCB data structure - * could not be allocated. - * - * @see udp_remove() - */ -struct udp_pcb * -udp_new_ip6(void) -{ - struct udp_pcb *pcb; - pcb = udp_new(); - ip_set_v6(pcb, 1); - return pcb; -} -#endif /* LWIP_IPV6 */ - -#if UDP_DEBUG -/** - * Print UDP header information for debug purposes. - * - * @param udphdr pointer to the udp header in memory. - */ -void -udp_debug_print(struct udp_hdr *udphdr) -{ - LWIP_DEBUGF(UDP_DEBUG, ("UDP header:\n")); - LWIP_DEBUGF(UDP_DEBUG, ("+-------------------------------+\n")); - LWIP_DEBUGF(UDP_DEBUG, ("| %5"U16_F" | %5"U16_F" | (src port, dest port)\n", - ntohs(udphdr->src), ntohs(udphdr->dest))); - LWIP_DEBUGF(UDP_DEBUG, ("+-------------------------------+\n")); - LWIP_DEBUGF(UDP_DEBUG, ("| %5"U16_F" | 0x%04"X16_F" | (len, chksum)\n", - ntohs(udphdr->len), ntohs(udphdr->chksum))); - LWIP_DEBUGF(UDP_DEBUG, ("+-------------------------------+\n")); -} -#endif /* UDP_DEBUG */ - -#endif /* LWIP_UDP */ diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/ipv4/lwip/autoip.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/ipv4/lwip/autoip.h deleted file mode 100644 index e62b72e8..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/ipv4/lwip/autoip.h +++ /dev/null @@ -1,118 +0,0 @@ -/** - * @file - * - * AutoIP Automatic LinkLocal IP Configuration - */ - -/* - * - * Copyright (c) 2007 Dominik Spies - * 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. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT - * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING - * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY - * OF SUCH DAMAGE. - * - * Author: Dominik Spies - * - * This is a AutoIP implementation for the lwIP TCP/IP stack. It aims to conform - * with RFC 3927. - * - * - * Please coordinate changes and requests with Dominik Spies - * - */ - -#ifndef __LWIP_AUTOIP_H__ -#define __LWIP_AUTOIP_H__ - -#include "lwip/opt.h" - -#if LWIP_AUTOIP /* don't build if not configured for use in lwipopts.h */ - -#include "lwip/netif.h" -#include "lwip/udp.h" -#include "netif/etharp.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/* AutoIP Timing */ -#define AUTOIP_TMR_INTERVAL 100 -#define AUTOIP_TICKS_PER_SECOND (1000 / AUTOIP_TMR_INTERVAL) - -/* RFC 3927 Constants */ -#define PROBE_WAIT 1 /* second (initial random delay) */ -#define PROBE_MIN 1 /* second (minimum delay till repeated probe) */ -#define PROBE_MAX 2 /* seconds (maximum delay till repeated probe) */ -#define PROBE_NUM 3 /* (number of probe packets) */ -#define ANNOUNCE_NUM 2 /* (number of announcement packets) */ -#define ANNOUNCE_INTERVAL 2 /* seconds (time between announcement packets) */ -#define ANNOUNCE_WAIT 2 /* seconds (delay before announcing) */ -#define MAX_CONFLICTS 10 /* (max conflicts before rate limiting) */ -#define RATE_LIMIT_INTERVAL 60 /* seconds (delay between successive attempts) */ -#define DEFEND_INTERVAL 10 /* seconds (min. wait between defensive ARPs) */ - -/* AutoIP client states */ -#define AUTOIP_STATE_OFF 0 -#define AUTOIP_STATE_PROBING 1 -#define AUTOIP_STATE_ANNOUNCING 2 -#define AUTOIP_STATE_BOUND 3 - -struct autoip -{ - ip_addr_t llipaddr; /* the currently selected, probed, announced or used LL IP-Address */ - u8_t state; /* current AutoIP state machine state */ - u8_t sent_num; /* sent number of probes or announces, dependent on state */ - u16_t ttw; /* ticks to wait, tick is AUTOIP_TMR_INTERVAL long */ - u8_t lastconflict; /* ticks until a conflict can be solved by defending */ - u8_t tried_llipaddr; /* total number of probed/used Link Local IP-Addresses */ -}; - - -#define autoip_init() /* Compatibility define, no init needed. */ - -/** Set a struct autoip allocated by the application to work with */ -void autoip_set_struct(struct netif *netif, struct autoip *autoip); - -/** Start AutoIP client */ -err_t autoip_start(struct netif *netif); - -/** Stop AutoIP client */ -err_t autoip_stop(struct netif *netif); - -/** Handles every incoming ARP Packet, called by etharp_arp_input */ -void autoip_arp_reply(struct netif *netif, struct etharp_hdr *hdr); - -/** Has to be called in loop every AUTOIP_TMR_INTERVAL milliseconds */ -void autoip_tmr(void); - -/** Handle a possible change in the network configuration */ -void autoip_network_changed(struct netif *netif); - -#ifdef __cplusplus -} -#endif - -#endif /* LWIP_AUTOIP */ - -#endif /* __LWIP_AUTOIP_H__ */ diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/ipv4/lwip/icmp.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/ipv4/lwip/icmp.h deleted file mode 100644 index fa893b6b..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/ipv4/lwip/icmp.h +++ /dev/null @@ -1,125 +0,0 @@ -/* - * Copyright (c) 2001-2004 Swedish Institute of Computer Science. - * 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. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT - * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING - * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY - * OF SUCH DAMAGE. - * - * This file is part of the lwIP TCP/IP stack. - * - * Author: Adam Dunkels - * - */ -#ifndef __LWIP_ICMP_H__ -#define __LWIP_ICMP_H__ - -#include "lwip/opt.h" -#include "lwip/pbuf.h" -#include "lwip/ip_addr.h" -#include "lwip/netif.h" - -#if LWIP_IPV6 && LWIP_ICMP6 -#include "lwip/icmp6.h" -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -#define ICMP_ER 0 /* echo reply */ -#define ICMP_DUR 3 /* destination unreachable */ -#define ICMP_SQ 4 /* source quench */ -#define ICMP_RD 5 /* redirect */ -#define ICMP_ECHO 8 /* echo */ -#define ICMP_TE 11 /* time exceeded */ -#define ICMP_PP 12 /* parameter problem */ -#define ICMP_TS 13 /* timestamp */ -#define ICMP_TSR 14 /* timestamp reply */ -#define ICMP_IRQ 15 /* information request */ -#define ICMP_IR 16 /* information reply */ - -enum icmp_dur_type { - ICMP_DUR_NET = 0, /* net unreachable */ - ICMP_DUR_HOST = 1, /* host unreachable */ - ICMP_DUR_PROTO = 2, /* protocol unreachable */ - ICMP_DUR_PORT = 3, /* port unreachable */ - ICMP_DUR_FRAG = 4, /* fragmentation needed and DF set */ - ICMP_DUR_SR = 5 /* source route failed */ -}; - -enum icmp_te_type { - ICMP_TE_TTL = 0, /* time to live exceeded in transit */ - ICMP_TE_FRAG = 1 /* fragment reassembly time exceeded */ -}; - -#ifdef PACK_STRUCT_USE_INCLUDES -# include "arch/bpstruct.h" -#endif -/** This is the standard ICMP header only that the u32_t data - * is splitted to two u16_t like ICMP echo needs it. - * This header is also used for other ICMP types that do not - * use the data part. - */ -PACK_STRUCT_BEGIN -struct icmp_echo_hdr { - PACK_STRUCT_FIELD(u8_t type); - PACK_STRUCT_FIELD(u8_t code); - PACK_STRUCT_FIELD(u16_t chksum); - PACK_STRUCT_FIELD(u16_t id); - PACK_STRUCT_FIELD(u16_t seqno); -} PACK_STRUCT_STRUCT; -PACK_STRUCT_END -#ifdef PACK_STRUCT_USE_INCLUDES -# include "arch/epstruct.h" -#endif - -#define ICMPH_TYPE(hdr) ((hdr)->type) -#define ICMPH_CODE(hdr) ((hdr)->code) - -/** Combines type and code to an u16_t */ -#define ICMPH_TYPE_SET(hdr, t) ((hdr)->type = (t)) -#define ICMPH_CODE_SET(hdr, c) ((hdr)->code = (c)) - - -#if LWIP_ICMP /* don't build if not configured for use in lwipopts.h */ - -void icmp_input(struct pbuf *p, struct netif *inp); -void icmp_dest_unreach(struct pbuf *p, enum icmp_dur_type t); -void icmp_time_exceeded(struct pbuf *p, enum icmp_te_type t); - -#endif /* LWIP_ICMP */ - -#if (LWIP_IPV6 && LWIP_ICMP6) -#define icmp_port_unreach(isipv6, pbuf) ((isipv6) ? \ - icmp6_dest_unreach(pbuf, ICMP6_DUR_PORT) : \ - icmp_dest_unreach(pbuf, ICMP_DUR_PORT)) -#elif LWIP_ICMP -#define icmp_port_unreach(isipv6, pbuf) icmp_dest_unreach(pbuf, ICMP_DUR_PORT) -#else /* (LWIP_IPV6 && LWIP_ICMP6) || LWIP_ICMP*/ -#define icmp_port_unreach(isipv6, pbuf) -#endif /* (LWIP_IPV6 && LWIP_ICMP6) || LWIP_ICMP*/ - -#ifdef __cplusplus -} -#endif - -#endif /* __LWIP_ICMP_H__ */ diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/ipv4/lwip/igmp.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/ipv4/lwip/igmp.h deleted file mode 100644 index 8aabac24..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/ipv4/lwip/igmp.h +++ /dev/null @@ -1,106 +0,0 @@ -/* - * Copyright (c) 2002 CITEL Technologies Ltd. - * 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. Neither the name of CITEL Technologies Ltd 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 CITEL TECHNOLOGIES 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 CITEL TECHNOLOGIES OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * This file is a contribution to the lwIP TCP/IP stack. - * The Swedish Institute of Computer Science and Adam Dunkels - * are specifically granted permission to redistribute this - * source code. -*/ - -#ifndef __LWIP_IGMP_H__ -#define __LWIP_IGMP_H__ - -#include "lwip/opt.h" -#include "lwip/ip_addr.h" -#include "lwip/netif.h" -#include "lwip/pbuf.h" - -#if LWIP_IGMP /* don't build if not configured for use in lwipopts.h */ - -#ifdef __cplusplus -extern "C" { -#endif - - -/* IGMP timer */ -#define IGMP_TMR_INTERVAL 100 /* Milliseconds */ -#define IGMP_V1_DELAYING_MEMBER_TMR (1000/IGMP_TMR_INTERVAL) -#define IGMP_JOIN_DELAYING_MEMBER_TMR (500 /IGMP_TMR_INTERVAL) - -/* MAC Filter Actions, these are passed to a netif's - * igmp_mac_filter callback function. */ -#define IGMP_DEL_MAC_FILTER 0 -#define IGMP_ADD_MAC_FILTER 1 - - -/** - * igmp group structure - there is - * a list of groups for each interface - * these should really be linked from the interface, but - * if we keep them separate we will not affect the lwip original code - * too much - * - * There will be a group for the all systems group address but this - * will not run the state machine as it is used to kick off reports - * from all the other groups - */ -struct igmp_group { - /** next link */ - struct igmp_group *next; - /** interface on which the group is active */ - struct netif *netif; - /** multicast address */ - ip_addr_t group_address; - /** signifies we were the last person to report */ - u8_t last_reporter_flag; - /** current state of the group */ - u8_t group_state; - /** timer for reporting, negative is OFF */ - u16_t timer; - /** counter of simultaneous uses */ - u8_t use; -}; - -/* Prototypes */ -void igmp_init(void); -err_t igmp_start(struct netif *netif); -err_t igmp_stop(struct netif *netif); -void igmp_report_groups(struct netif *netif); -struct igmp_group *igmp_lookfor_group(struct netif *ifp, ip_addr_t *addr); -void igmp_input(struct pbuf *p, struct netif *inp, ip_addr_t *dest); -err_t igmp_joingroup(ip_addr_t *ifaddr, ip_addr_t *groupaddr); -err_t igmp_leavegroup(ip_addr_t *ifaddr, ip_addr_t *groupaddr); -void igmp_tmr(void); - -#ifdef __cplusplus -} -#endif - -#endif /* LWIP_IGMP */ - -#endif /* __LWIP_IGMP_H__ */ diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/ipv4/lwip/inet.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/ipv4/lwip/inet.h deleted file mode 100644 index 7bff49b5..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/ipv4/lwip/inet.h +++ /dev/null @@ -1,107 +0,0 @@ -/* - * Copyright (c) 2001-2004 Swedish Institute of Computer Science. - * 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. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT - * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING - * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY - * OF SUCH DAMAGE. - * - * This file is part of the lwIP TCP/IP stack. - * - * Author: Adam Dunkels - * - */ -#ifndef __LWIP_INET_H__ -#define __LWIP_INET_H__ - -#include "lwip/opt.h" -#include "lwip/def.h" -#include "lwip/ip_addr.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/** For compatibility with BSD code */ -struct in_addr { - u32_t s_addr; -}; - -/** 255.255.255.255 */ -#define INADDR_NONE IPADDR_NONE -/** 127.0.0.1 */ -#define INADDR_LOOPBACK IPADDR_LOOPBACK -/** 0.0.0.0 */ -#define INADDR_ANY IPADDR_ANY -/** 255.255.255.255 */ -#define INADDR_BROADCAST IPADDR_BROADCAST - -/* Definitions of the bits in an Internet address integer. - - On subnets, host and network parts are found according to - the subnet mask, not these masks. */ -#define IN_CLASSA(a) IP_CLASSA(a) -#define IN_CLASSA_NET IP_CLASSA_NET -#define IN_CLASSA_NSHIFT IP_CLASSA_NSHIFT -#define IN_CLASSA_HOST IP_CLASSA_HOST -#define IN_CLASSA_MAX IP_CLASSA_MAX - -#define IN_CLASSB(b) IP_CLASSB(b) -#define IN_CLASSB_NET IP_CLASSB_NET -#define IN_CLASSB_NSHIFT IP_CLASSB_NSHIFT -#define IN_CLASSB_HOST IP_CLASSB_HOST -#define IN_CLASSB_MAX IP_CLASSB_MAX - -#define IN_CLASSC(c) IP_CLASSC(c) -#define IN_CLASSC_NET IP_CLASSC_NET -#define IN_CLASSC_NSHIFT IP_CLASSC_NSHIFT -#define IN_CLASSC_HOST IP_CLASSC_HOST -#define IN_CLASSC_MAX IP_CLASSC_MAX - -#define IN_CLASSD(d) IP_CLASSD(d) -#define IN_CLASSD_NET IP_CLASSD_NET /* These ones aren't really */ -#define IN_CLASSD_NSHIFT IP_CLASSD_NSHIFT /* net and host fields, but */ -#define IN_CLASSD_HOST IP_CLASSD_HOST /* routing needn't know. */ -#define IN_CLASSD_MAX IP_CLASSD_MAX - -#define IN_MULTICAST(a) IP_MULTICAST(a) - -#define IN_EXPERIMENTAL(a) IP_EXPERIMENTAL(a) -#define IN_BADCLASS(a) IP_BADCLASS(a) - -#define IN_LOOPBACKNET IP_LOOPBACKNET - -#define inet_addr_from_ipaddr(target_inaddr, source_ipaddr) ((target_inaddr)->s_addr = ip4_addr_get_u32(source_ipaddr)) -#define inet_addr_to_ipaddr(target_ipaddr, source_inaddr) (ip4_addr_set_u32(target_ipaddr, (source_inaddr)->s_addr)) -/* ATTENTION: the next define only works because both s_addr and ip_addr_t are an u32_t effectively! */ -#define inet_addr_to_ipaddr_p(target_ipaddr_p, source_inaddr) ((target_ipaddr_p) = (ip_addr_t*)&((source_inaddr)->s_addr)) - -/* directly map this to the lwip internal functions */ -#define inet_addr(cp) ipaddr_addr(cp) -#define inet_aton(cp, addr) ipaddr_aton(cp, (ip_addr_t*)addr) -#define inet_ntoa(addr) ipaddr_ntoa((ip_addr_t*)&(addr)) -#define inet_ntoa_r(addr, buf, buflen) ipaddr_ntoa_r((ip_addr_t*)&(addr), buf, buflen) - -#ifdef __cplusplus -} -#endif - -#endif /* __LWIP_INET_H__ */ diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/ipv4/lwip/ip4.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/ipv4/lwip/ip4.h deleted file mode 100644 index 04b5b8a6..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/ipv4/lwip/ip4.h +++ /dev/null @@ -1,146 +0,0 @@ -/* - * Copyright (c) 2001-2004 Swedish Institute of Computer Science. - * 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. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT - * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING - * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY - * OF SUCH DAMAGE. - * - * This file is part of the lwIP TCP/IP stack. - * - * Author: Adam Dunkels - * - */ -#ifndef __LWIP_IP4_H__ -#define __LWIP_IP4_H__ - -#include "lwip/opt.h" - -#include "lwip/def.h" -#include "lwip/pbuf.h" -#include "lwip/ip_addr.h" -#include "lwip/ip6_addr.h" -#include "lwip/err.h" -#include "lwip/netif.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/** Currently, the function ip_output_if_opt() is only used with IGMP */ -#define IP_OPTIONS_SEND LWIP_IGMP - -#define IP_HLEN 20 - -#define IP_PROTO_ICMP 1 -#define IP_PROTO_IGMP 2 -#define IP_PROTO_UDP 17 -#define IP_PROTO_UDPLITE 136 -#define IP_PROTO_TCP 6 - - -#ifdef PACK_STRUCT_USE_INCLUDES -# include "arch/bpstruct.h" -#endif -PACK_STRUCT_BEGIN -struct ip_hdr { - /* version / header length */ - PACK_STRUCT_FIELD(u8_t _v_hl); - /* type of service */ - PACK_STRUCT_FIELD(u8_t _tos); - /* total length */ - PACK_STRUCT_FIELD(u16_t _len); - /* identification */ - PACK_STRUCT_FIELD(u16_t _id); - /* fragment offset field */ - PACK_STRUCT_FIELD(u16_t _offset); -#define IP_RF 0x8000U /* reserved fragment flag */ -#define IP_DF 0x4000U /* dont fragment flag */ -#define IP_MF 0x2000U /* more fragments flag */ -#define IP_OFFMASK 0x1fffU /* mask for fragmenting bits */ - /* time to live */ - PACK_STRUCT_FIELD(u8_t _ttl); - /* protocol*/ - PACK_STRUCT_FIELD(u8_t _proto); - /* checksum */ - PACK_STRUCT_FIELD(u16_t _chksum); - /* source and destination IP addresses */ - PACK_STRUCT_FIELD(ip_addr_p_t src); - PACK_STRUCT_FIELD(ip_addr_p_t dest); -} PACK_STRUCT_STRUCT; -PACK_STRUCT_END -#ifdef PACK_STRUCT_USE_INCLUDES -# include "arch/epstruct.h" -#endif - -#define IPH_V(hdr) ((hdr)->_v_hl >> 4) -#define IPH_HL(hdr) ((hdr)->_v_hl & 0x0f) -#define IPH_TOS(hdr) ((hdr)->_tos) -#define IPH_LEN(hdr) ((hdr)->_len) -#define IPH_ID(hdr) ((hdr)->_id) -#define IPH_OFFSET(hdr) ((hdr)->_offset) -#define IPH_TTL(hdr) ((hdr)->_ttl) -#define IPH_PROTO(hdr) ((hdr)->_proto) -#define IPH_CHKSUM(hdr) ((hdr)->_chksum) - -#define IPH_VHL_SET(hdr, v, hl) (hdr)->_v_hl = (((v) << 4) | (hl)) -#define IPH_TOS_SET(hdr, tos) (hdr)->_tos = (tos) -#define IPH_LEN_SET(hdr, len) (hdr)->_len = (len) -#define IPH_ID_SET(hdr, id) (hdr)->_id = (id) -#define IPH_OFFSET_SET(hdr, off) (hdr)->_offset = (off) -#define IPH_TTL_SET(hdr, ttl) (hdr)->_ttl = (u8_t)(ttl) -#define IPH_PROTO_SET(hdr, proto) (hdr)->_proto = (u8_t)(proto) -#define IPH_CHKSUM_SET(hdr, chksum) (hdr)->_chksum = (chksum) - - -#define ip_init() /* Compatibility define, no init needed. */ -struct netif *ip_route(ip_addr_t *dest); -err_t ip_input(struct pbuf *p, struct netif *inp); -err_t ip_output(struct pbuf *p, ip_addr_t *src, ip_addr_t *dest, - u8_t ttl, u8_t tos, u8_t proto); -err_t ip_output_if(struct pbuf *p, ip_addr_t *src, ip_addr_t *dest, - u8_t ttl, u8_t tos, u8_t proto, - struct netif *netif); -#if LWIP_NETIF_HWADDRHINT -err_t ip_output_hinted(struct pbuf *p, ip_addr_t *src, ip_addr_t *dest, - u8_t ttl, u8_t tos, u8_t proto, u8_t *addr_hint); -#endif /* LWIP_NETIF_HWADDRHINT */ -#if IP_OPTIONS_SEND -err_t ip_output_if_opt(struct pbuf *p, ip_addr_t *src, ip_addr_t *dest, - u8_t ttl, u8_t tos, u8_t proto, struct netif *netif, void *ip_options, - u16_t optlen); -#endif /* IP_OPTIONS_SEND */ - -#define ip_netif_get_local_ipX(netif) (((netif) != NULL) ? ip_2_ipX(&((netif)->ip_addr)) : NULL) - -#if IP_DEBUG -void ip_debug_print(struct pbuf *p); -#else -#define ip_debug_print(p) -#endif /* IP_DEBUG */ - -#ifdef __cplusplus -} -#endif - -#endif /* __LWIP_IP_H__ */ - - diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/ipv4/lwip/ip4_addr.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/ipv4/lwip/ip4_addr.h deleted file mode 100644 index b05ae537..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/ipv4/lwip/ip4_addr.h +++ /dev/null @@ -1,244 +0,0 @@ -/* - * Copyright (c) 2001-2004 Swedish Institute of Computer Science. - * 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. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT - * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING - * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY - * OF SUCH DAMAGE. - * - * This file is part of the lwIP TCP/IP stack. - * - * Author: Adam Dunkels - * - */ -#ifndef __LWIP_IP4_ADDR_H__ -#define __LWIP_IP4_ADDR_H__ - -#include "lwip/opt.h" -#include "lwip/def.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/* This is the aligned version of ip_addr_t, - used as local variable, on the stack, etc. */ -struct ip_addr { - u32_t addr; -}; - -/* This is the packed version of ip_addr_t, - used in network headers that are itself packed */ -#ifdef PACK_STRUCT_USE_INCLUDES -# include "arch/bpstruct.h" -#endif -PACK_STRUCT_BEGIN -struct ip_addr_packed { - PACK_STRUCT_FIELD(u32_t addr); -} PACK_STRUCT_STRUCT; -PACK_STRUCT_END -#ifdef PACK_STRUCT_USE_INCLUDES -# include "arch/epstruct.h" -#endif - -/** ip_addr_t uses a struct for convenience only, so that the same defines can - * operate both on ip_addr_t as well as on ip_addr_p_t. */ -typedef struct ip_addr ip_addr_t; -typedef struct ip_addr_packed ip_addr_p_t; - -/* - * struct ipaddr2 is used in the definition of the ARP packet format in - * order to support compilers that don't have structure packing. - */ -#ifdef PACK_STRUCT_USE_INCLUDES -# include "arch/bpstruct.h" -#endif -PACK_STRUCT_BEGIN -struct ip_addr2 { - PACK_STRUCT_FIELD(u16_t addrw[2]); -} PACK_STRUCT_STRUCT; -PACK_STRUCT_END -#ifdef PACK_STRUCT_USE_INCLUDES -# include "arch/epstruct.h" -#endif - -/* Forward declaration to not include netif.h */ -struct netif; - -extern const ip_addr_t ip_addr_any; -extern const ip_addr_t ip_addr_broadcast; - -/** IP_ADDR_ can be used as a fixed IP address - * for the wildcard and the broadcast address - */ -#define IP_ADDR_ANY ((ip_addr_t *)&ip_addr_any) -#define IP_ADDR_BROADCAST ((ip_addr_t *)&ip_addr_broadcast) - -/** 255.255.255.255 */ -#define IPADDR_NONE ((u32_t)0xffffffffUL) -/** 127.0.0.1 */ -#define IPADDR_LOOPBACK ((u32_t)0x7f000001UL) -/** 0.0.0.0 */ -#define IPADDR_ANY ((u32_t)0x00000000UL) -/** 255.255.255.255 */ -#define IPADDR_BROADCAST ((u32_t)0xffffffffUL) - -/* Definitions of the bits in an Internet address integer. - - On subnets, host and network parts are found according to - the subnet mask, not these masks. */ -#define IP_CLASSA(a) ((((u32_t)(a)) & 0x80000000UL) == 0) -#define IP_CLASSA_NET 0xff000000 -#define IP_CLASSA_NSHIFT 24 -#define IP_CLASSA_HOST (0xffffffff & ~IP_CLASSA_NET) -#define IP_CLASSA_MAX 128 - -#define IP_CLASSB(a) ((((u32_t)(a)) & 0xc0000000UL) == 0x80000000UL) -#define IP_CLASSB_NET 0xffff0000 -#define IP_CLASSB_NSHIFT 16 -#define IP_CLASSB_HOST (0xffffffff & ~IP_CLASSB_NET) -#define IP_CLASSB_MAX 65536 - -#define IP_CLASSC(a) ((((u32_t)(a)) & 0xe0000000UL) == 0xc0000000UL) -#define IP_CLASSC_NET 0xffffff00 -#define IP_CLASSC_NSHIFT 8 -#define IP_CLASSC_HOST (0xffffffff & ~IP_CLASSC_NET) - -#define IP_CLASSD(a) (((u32_t)(a) & 0xf0000000UL) == 0xe0000000UL) -#define IP_CLASSD_NET 0xf0000000 /* These ones aren't really */ -#define IP_CLASSD_NSHIFT 28 /* net and host fields, but */ -#define IP_CLASSD_HOST 0x0fffffff /* routing needn't know. */ -#define IP_MULTICAST(a) IP_CLASSD(a) - -#define IP_EXPERIMENTAL(a) (((u32_t)(a) & 0xf0000000UL) == 0xf0000000UL) -#define IP_BADCLASS(a) (((u32_t)(a) & 0xf0000000UL) == 0xf0000000UL) - -#define IP_LOOPBACKNET 127 /* official! */ - - -#if BYTE_ORDER == BIG_ENDIAN -/** Set an IP address given by the four byte-parts */ -#define IP4_ADDR(ipaddr, a,b,c,d) \ - (ipaddr)->addr = ((u32_t)((a) & 0xff) << 24) | \ - ((u32_t)((b) & 0xff) << 16) | \ - ((u32_t)((c) & 0xff) << 8) | \ - (u32_t)((d) & 0xff) -#else -/** Set an IP address given by the four byte-parts. - Little-endian version that prevents the use of htonl. */ -#define IP4_ADDR(ipaddr, a,b,c,d) \ - (ipaddr)->addr = ((u32_t)((d) & 0xff) << 24) | \ - ((u32_t)((c) & 0xff) << 16) | \ - ((u32_t)((b) & 0xff) << 8) | \ - (u32_t)((a) & 0xff) -#endif - -/** MEMCPY-like copying of IP addresses where addresses are known to be - * 16-bit-aligned if the port is correctly configured (so a port could define - * this to copying 2 u16_t's) - no NULL-pointer-checking needed. */ -#ifndef IPADDR2_COPY -#define IPADDR2_COPY(dest, src) SMEMCPY(dest, src, sizeof(ip_addr_t)) -#endif - -/** Copy IP address - faster than ip_addr_set: no NULL check */ -#define ip_addr_copy(dest, src) ((dest).addr = (src).addr) -/** Safely copy one IP address to another (src may be NULL) */ -#define ip_addr_set(dest, src) ((dest)->addr = \ - ((src) == NULL ? 0 : \ - (src)->addr)) -/** Set complete address to zero */ -#define ip_addr_set_zero(ipaddr) ((ipaddr)->addr = 0) -/** Set address to IPADDR_ANY (no need for htonl()) */ -#define ip_addr_set_any(ipaddr) ((ipaddr)->addr = IPADDR_ANY) -/** Set address to loopback address */ -#define ip_addr_set_loopback(ipaddr) ((ipaddr)->addr = PP_HTONL(IPADDR_LOOPBACK)) -/** Safely copy one IP address to another and change byte order - * from host- to network-order. */ -#define ip_addr_set_hton(dest, src) ((dest)->addr = \ - ((src) == NULL ? 0:\ - htonl((src)->addr))) -/** IPv4 only: set the IP address given as an u32_t */ -#define ip4_addr_set_u32(dest_ipaddr, src_u32) ((dest_ipaddr)->addr = (src_u32)) -/** IPv4 only: get the IP address as an u32_t */ -#define ip4_addr_get_u32(src_ipaddr) ((src_ipaddr)->addr) - -/** Get the network address by combining host address with netmask */ -#define ip_addr_get_network(target, host, netmask) ((target)->addr = ((host)->addr) & ((netmask)->addr)) - -/** - * Determine if two address are on the same network. - * - * @arg addr1 IP address 1 - * @arg addr2 IP address 2 - * @arg mask network identifier mask - * @return !0 if the network identifiers of both address match - */ -#define ip_addr_netcmp(addr1, addr2, mask) (((addr1)->addr & \ - (mask)->addr) == \ - ((addr2)->addr & \ - (mask)->addr)) -#define ip_addr_cmp(addr1, addr2) ((addr1)->addr == (addr2)->addr) - -#define ip_addr_isany(addr1) ((addr1) == NULL || (addr1)->addr == IPADDR_ANY) - -#define ip_addr_isbroadcast(ipaddr, netif) ip4_addr_isbroadcast((ipaddr)->addr, (netif)) -u8_t ip4_addr_isbroadcast(u32_t addr, const struct netif *netif); - -#define ip_addr_netmask_valid(netmask) ip4_addr_netmask_valid((netmask)->addr) -u8_t ip4_addr_netmask_valid(u32_t netmask); - -#define ip_addr_ismulticast(addr1) (((addr1)->addr & PP_HTONL(0xf0000000UL)) == PP_HTONL(0xe0000000UL)) - -#define ip_addr_islinklocal(addr1) (((addr1)->addr & PP_HTONL(0xffff0000UL)) == PP_HTONL(0xa9fe0000UL)) - -#define ip_addr_debug_print(debug, ipaddr) \ - LWIP_DEBUGF(debug, ("%"U16_F".%"U16_F".%"U16_F".%"U16_F, \ - ipaddr != NULL ? ip4_addr1_16(ipaddr) : 0, \ - ipaddr != NULL ? ip4_addr2_16(ipaddr) : 0, \ - ipaddr != NULL ? ip4_addr3_16(ipaddr) : 0, \ - ipaddr != NULL ? ip4_addr4_16(ipaddr) : 0)) - -/* Get one byte from the 4-byte address */ -#define ip4_addr1(ipaddr) (((u8_t*)(ipaddr))[0]) -#define ip4_addr2(ipaddr) (((u8_t*)(ipaddr))[1]) -#define ip4_addr3(ipaddr) (((u8_t*)(ipaddr))[2]) -#define ip4_addr4(ipaddr) (((u8_t*)(ipaddr))[3]) -/* These are cast to u16_t, with the intent that they are often arguments - * to printf using the U16_F format from cc.h. */ -#define ip4_addr1_16(ipaddr) ((u16_t)ip4_addr1(ipaddr)) -#define ip4_addr2_16(ipaddr) ((u16_t)ip4_addr2(ipaddr)) -#define ip4_addr3_16(ipaddr) ((u16_t)ip4_addr3(ipaddr)) -#define ip4_addr4_16(ipaddr) ((u16_t)ip4_addr4(ipaddr)) - -/** For backwards compatibility */ -#define ip_ntoa(ipaddr) ipaddr_ntoa(ipaddr) - -u32_t ipaddr_addr(const char *cp); -int ipaddr_aton(const char *cp, ip_addr_t *addr); -/** returns ptr to static buffer; not reentrant! */ -char *ipaddr_ntoa(const ip_addr_t *addr); -char *ipaddr_ntoa_r(const ip_addr_t *addr, char *buf, int buflen); - -#ifdef __cplusplus -} -#endif - -#endif /* __LWIP_IP_ADDR_H__ */ diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/ipv4/lwip/ip_frag.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/ipv4/lwip/ip_frag.h deleted file mode 100644 index 47eca9f4..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/ipv4/lwip/ip_frag.h +++ /dev/null @@ -1,91 +0,0 @@ -/* - * Copyright (c) 2001-2004 Swedish Institute of Computer Science. - * 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. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT - * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING - * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY - * OF SUCH DAMAGE. - * - * This file is part of the lwIP TCP/IP stack. - * - * Author: Jani Monoses - * - */ - -#ifndef __LWIP_IP_FRAG_H__ -#define __LWIP_IP_FRAG_H__ - -#include "lwip/opt.h" -#include "lwip/err.h" -#include "lwip/pbuf.h" -#include "lwip/netif.h" -#include "lwip/ip_addr.h" -#include "lwip/ip.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#if IP_REASSEMBLY -/* The IP reassembly timer interval in milliseconds. */ -#define IP_TMR_INTERVAL 1000 - -/* IP reassembly helper struct. - * This is exported because memp needs to know the size. - */ -struct ip_reassdata { - struct ip_reassdata *next; - struct pbuf *p; - struct ip_hdr iphdr; - u16_t datagram_len; - u8_t flags; - u8_t timer; -}; - -void ip_reass_init(void); -void ip_reass_tmr(void); -struct pbuf * ip_reass(struct pbuf *p); -#endif /* IP_REASSEMBLY */ - -#if IP_FRAG -#if !IP_FRAG_USES_STATIC_BUF && !LWIP_NETIF_TX_SINGLE_PBUF -/** A custom pbuf that holds a reference to another pbuf, which is freed - * when this custom pbuf is freed. This is used to create a custom PBUF_REF - * that points into the original pbuf. */ -#ifndef __LWIP_PBUF_CUSTOM_REF__ -#define __LWIP_PBUF_CUSTOM_REF__ -struct pbuf_custom_ref { - /** 'base class' */ - struct pbuf_custom pc; - /** pointer to the original pbuf that is referenced */ - struct pbuf *original; -}; -#endif /* __LWIP_PBUF_CUSTOM_REF__ */ -#endif /* !IP_FRAG_USES_STATIC_BUF && !LWIP_NETIF_TX_SINGLE_PBUF */ - -err_t ip_frag(struct pbuf *p, struct netif *netif, ip_addr_t *dest); -#endif /* IP_FRAG */ - -#ifdef __cplusplus -} -#endif - -#endif /* __LWIP_IP_FRAG_H__ */ diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/ipv6/lwip/dhcp6.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/ipv6/lwip/dhcp6.h deleted file mode 100644 index 4b905c54..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/ipv6/lwip/dhcp6.h +++ /dev/null @@ -1,58 +0,0 @@ -/** - * @file - * - * IPv6 address autoconfiguration as per RFC 4862. - */ - -/* - * Copyright (c) 2010 Inico Technologies Ltd. - * 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. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT - * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING - * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY - * OF SUCH DAMAGE. - * - * This file is part of the lwIP TCP/IP stack. - * - * Author: Ivan Delamer - * - * IPv6 address autoconfiguration as per RFC 4862. - * - * Please coordinate changes and requests with Ivan Delamer - * - */ - -#ifndef __LWIP_IP6_DHCP6_H__ -#define __LWIP_IP6_DHCP6_H__ - -#include "lwip/opt.h" - -#if LWIP_IPV6_DHCP6 /* don't build if not configured for use in lwipopts.h */ - - -struct dhcp6 -{ - /*TODO: implement DHCP6*/ -}; - -#endif /* LWIP_IPV6_DHCP6 */ - -#endif /* __LWIP_IP6_DHCP6_H__ */ diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/ipv6/lwip/ethip6.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/ipv6/lwip/ethip6.h deleted file mode 100644 index e7f412b4..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/ipv6/lwip/ethip6.h +++ /dev/null @@ -1,68 +0,0 @@ -/** - * @file - * - * Ethernet output for IPv6. Uses ND tables for link-layer addressing. - */ - -/* - * Copyright (c) 2010 Inico Technologies Ltd. - * 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. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT - * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING - * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY - * OF SUCH DAMAGE. - * - * This file is part of the lwIP TCP/IP stack. - * - * Author: Ivan Delamer - * - * - * Please coordinate changes and requests with Ivan Delamer - * - */ - -#ifndef __LWIP_ETHIP6_H__ -#define __LWIP_ETHIP6_H__ - -#include "lwip/opt.h" - -#if LWIP_IPV6 && LWIP_ETHERNET /* don't build if not configured for use in lwipopts.h */ - -#include "lwip/pbuf.h" -#include "lwip/ip6.h" -#include "lwip/ip6_addr.h" -#include "lwip/netif.h" - - -#ifdef __cplusplus -extern "C" { -#endif - - -err_t ethip6_output(struct netif *netif, struct pbuf *q, ip6_addr_t *ip6addr); - -#ifdef __cplusplus -} -#endif - -#endif /* LWIP_IPV6 && LWIP_ETHERNET */ - -#endif /* __LWIP_ETHIP6_H__ */ diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/ipv6/lwip/icmp6.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/ipv6/lwip/icmp6.h deleted file mode 100644 index 428f1a4d..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/ipv6/lwip/icmp6.h +++ /dev/null @@ -1,152 +0,0 @@ -/** - * @file - * - * IPv6 version of ICMP, as per RFC 4443. - */ - -/* - * Copyright (c) 2010 Inico Technologies Ltd. - * 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. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT - * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING - * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY - * OF SUCH DAMAGE. - * - * This file is part of the lwIP TCP/IP stack. - * - * Author: Ivan Delamer - * - * - * Please coordinate changes and requests with Ivan Delamer - * - */ -#ifndef __LWIP_ICMP6_H__ -#define __LWIP_ICMP6_H__ - -#include "lwip/opt.h" -#include "lwip/pbuf.h" -#include "lwip/ip6_addr.h" -#include "lwip/netif.h" - - -#ifdef __cplusplus -extern "C" { -#endif - -enum icmp6_type { - ICMP6_TYPE_DUR = 1, /* Destination unreachable */ - ICMP6_TYPE_PTB = 2, /* Packet too big */ - ICMP6_TYPE_TE = 3, /* Time exceeded */ - ICMP6_TYPE_PP = 4, /* Parameter problem */ - ICMP6_TYPE_PE1 = 100, /* Private experimentation */ - ICMP6_TYPE_PE2 = 101, /* Private experimentation */ - ICMP6_TYPE_RSV_ERR = 127, /* Reserved for expansion of error messages */ - - ICMP6_TYPE_EREQ = 128, /* Echo request */ - ICMP6_TYPE_EREP = 129, /* Echo reply */ - ICMP6_TYPE_MLQ = 130, /* Multicast listener query */ - ICMP6_TYPE_MLR = 131, /* Multicast listener report */ - ICMP6_TYPE_MLD = 132, /* Multicast listener done */ - ICMP6_TYPE_RS = 133, /* Router solicitation */ - ICMP6_TYPE_RA = 134, /* Router advertisement */ - ICMP6_TYPE_NS = 135, /* Neighbor solicitation */ - ICMP6_TYPE_NA = 136, /* Neighbor advertisement */ - ICMP6_TYPE_RD = 137, /* Redirect */ - ICMP6_TYPE_MRA = 151, /* Multicast router advertisement */ - ICMP6_TYPE_MRS = 152, /* Multicast router solicitation */ - ICMP6_TYPE_MRT = 153, /* Multicast router termination */ - ICMP6_TYPE_PE3 = 200, /* Private experimentation */ - ICMP6_TYPE_PE4 = 201, /* Private experimentation */ - ICMP6_TYPE_RSV_INF = 255 /* Reserved for expansion of informational messages */ -}; - -enum icmp6_dur_code { - ICMP6_DUR_NO_ROUTE = 0, /* No route to destination */ - ICMP6_DUR_PROHIBITED = 1, /* Communication with destination administratively prohibited */ - ICMP6_DUR_SCOPE = 2, /* Beyond scope of source address */ - ICMP6_DUR_ADDRESS = 3, /* Address unreachable */ - ICMP6_DUR_PORT = 4, /* Port unreachable */ - ICMP6_DUR_POLICY = 5, /* Source address failed ingress/egress policy */ - ICMP6_DUR_REJECT_ROUTE = 6 /* Reject route to destination */ -}; - -enum icmp6_te_code { - ICMP6_TE_HL = 0, /* Hop limit exceeded in transit */ - ICMP6_TE_FRAG = 1 /* Fragment reassembly time exceeded */ -}; - -enum icmp6_pp_code { - ICMP6_PP_FIELD = 0, /* Erroneous header field encountered */ - ICMP6_PP_HEADER = 1, /* Unrecognized next header type encountered */ - ICMP6_PP_OPTION = 2 /* Unrecognized IPv6 option encountered */ -}; - -/** This is the standard ICMP6 header. */ -#ifdef PACK_STRUCT_USE_INCLUDES -# include "arch/bpstruct.h" -#endif -PACK_STRUCT_BEGIN -struct pp_icmp6_hdr { - PACK_STRUCT_FIELD(u8_t type); - PACK_STRUCT_FIELD(u8_t code); - PACK_STRUCT_FIELD(u16_t chksum); - PACK_STRUCT_FIELD(u32_t data); -} PACK_STRUCT_STRUCT; -PACK_STRUCT_END -#ifdef PACK_STRUCT_USE_INCLUDES -# include "arch/epstruct.h" -#endif - -/** This is the ICMP6 header adapted for echo req/resp. */ -#ifdef PACK_STRUCT_USE_INCLUDES -# include "arch/bpstruct.h" -#endif -PACK_STRUCT_BEGIN -struct icmp6_echo_hdr { - PACK_STRUCT_FIELD(u8_t type); - PACK_STRUCT_FIELD(u8_t code); - PACK_STRUCT_FIELD(u16_t chksum); - PACK_STRUCT_FIELD(u16_t id); - PACK_STRUCT_FIELD(u16_t seqno); -} PACK_STRUCT_STRUCT; -PACK_STRUCT_END -#ifdef PACK_STRUCT_USE_INCLUDES -# include "arch/epstruct.h" -#endif - - -#if LWIP_ICMP6 && LWIP_IPV6 /* don't build if not configured for use in lwipopts.h */ - -void icmp6_input(struct pbuf *p, struct netif *inp); -void icmp6_dest_unreach(struct pbuf *p, enum icmp6_dur_code c); -void icmp6_packet_too_big(struct pbuf *p, u32_t mtu); -void icmp6_time_exceeded(struct pbuf *p, enum icmp6_te_code c); -void icmp6_param_problem(struct pbuf *p, enum icmp6_pp_code c, u32_t pointer); - -#endif /* LWIP_ICMP6 && LWIP_IPV6 */ - - -#ifdef __cplusplus -} -#endif - - -#endif /* __LWIP_ICMP6_H__ */ diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/ipv6/lwip/inet6.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/ipv6/lwip/inet6.h deleted file mode 100644 index dbf98df0..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/ipv6/lwip/inet6.h +++ /dev/null @@ -1,92 +0,0 @@ -/** - * @file - * - * INET v6 addresses. - */ - -/* - * Copyright (c) 2010 Inico Technologies Ltd. - * 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. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT - * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING - * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY - * OF SUCH DAMAGE. - * - * This file is part of the lwIP TCP/IP stack. - * - * Author: Ivan Delamer - * - * - * Please coordinate changes and requests with Ivan Delamer - * - */ -#ifndef __LWIP_INET6_H__ -#define __LWIP_INET6_H__ - -#include "lwip/opt.h" - -#if LWIP_IPV6 && LWIP_SOCKET /* don't build if not configured for use in lwipopts.h */ - -#include "lwip/ip6_addr.h" -#include "lwip/def.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/** For compatibility with BSD code */ -struct in6_addr { - union { - u8_t u8_addr[16]; - u32_t u32_addr[4]; - } un; -#define s6_addr un.u32_addr -}; - -#define IN6ADDR_ANY_INIT {0,0,0,0} -#define IN6ADDR_LOOPBACK_INIT {0,0,0,PP_HTONL(1)} - - -#define inet6_addr_from_ip6addr(target_in6addr, source_ip6addr) {(target_in6addr)->un.u32_addr[0] = (source_ip6addr)->addr[0]; \ - (target_in6addr)->un.u32_addr[1] = (source_ip6addr)->addr[1]; \ - (target_in6addr)->un.u32_addr[2] = (source_ip6addr)->addr[2]; \ - (target_in6addr)->un.u32_addr[3] = (source_ip6addr)->addr[3];} -#define inet6_addr_to_ip6addr(target_ip6addr, source_in6addr) {(target_ip6addr)->addr[0] = (source_in6addr)->un.u32_addr[0]; \ - (target_ip6addr)->addr[1] = (source_in6addr)->un.u32_addr[1]; \ - (target_ip6addr)->addr[2] = (source_in6addr)->un.u32_addr[2]; \ - (target_ip6addr)->addr[3] = (source_in6addr)->un.u32_addr[3];} -/* ATTENTION: the next define only works because both in6_addr and ip6_addr_t are an u32_t[4] effectively! */ -#define inet6_addr_to_ip6addr_p(target_ip6addr_p, source_in6addr) ((target_ip6addr_p) = (ip6_addr_t*)(source_in6addr)) - -/* directly map this to the lwip internal functions */ -#define inet6_aton(cp, addr) ip6addr_aton(cp, (ip6_addr_t*)addr) -#define inet6_ntoa(addr) ip6addr_ntoa((ip6_addr_t*)&(addr)) -#define inet6_ntoa_r(addr, buf, buflen) ip6addr_ntoa_r((ip6_addr_t*)&(addr), buf, buflen) - - -#ifdef __cplusplus -} -#endif - -#endif /* LWIP_IPV6 */ - -#endif /* __LWIP_INET6_H__ */ - diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/ipv6/lwip/ip6.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/ipv6/lwip/ip6.h deleted file mode 100644 index b199c95a..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/ipv6/lwip/ip6.h +++ /dev/null @@ -1,197 +0,0 @@ -/** - * @file - * - * IPv6 layer. - */ - -/* - * Copyright (c) 2010 Inico Technologies Ltd. - * 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. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT - * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING - * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY - * OF SUCH DAMAGE. - * - * This file is part of the lwIP TCP/IP stack. - * - * Author: Ivan Delamer - * - * - * Please coordinate changes and requests with Ivan Delamer - * - */ -#ifndef __LWIP_IP6_H__ -#define __LWIP_IP6_H__ - -#include "lwip/opt.h" - -#if LWIP_IPV6 /* don't build if not configured for use in lwipopts.h */ - -#include "lwip/ip.h" -#include "lwip/ip6_addr.h" -#include "lwip/def.h" -#include "lwip/pbuf.h" -#include "lwip/netif.h" - -#include "lwip/err.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#define IP6_HLEN 40 - -#define IP6_NEXTH_HOPBYHOP 0 -#define IP6_NEXTH_TCP 6 -#define IP6_NEXTH_UDP 17 -#define IP6_NEXTH_ENCAPS 41 -#define IP6_NEXTH_ROUTING 43 -#define IP6_NEXTH_FRAGMENT 44 -#define IP6_NEXTH_ICMP6 58 -#define IP6_NEXTH_NONE 59 -#define IP6_NEXTH_DESTOPTS 60 -#define IP6_NEXTH_UDPLITE 136 - - -/* The IPv6 header. */ -#ifdef PACK_STRUCT_USE_INCLUDES -# include "arch/bpstruct.h" -#endif -PACK_STRUCT_BEGIN -struct ip6_hdr { - /* version / traffic class / flow label */ - PACK_STRUCT_FIELD(u32_t _v_tc_fl); - /* payload length */ - PACK_STRUCT_FIELD(u16_t _plen); - /* next header */ - PACK_STRUCT_FIELD(u8_t _nexth); - /* hop limit */ - PACK_STRUCT_FIELD(u8_t _hoplim); - /* source and destination IP addresses */ - PACK_STRUCT_FIELD(ip6_addr_p_t src); - PACK_STRUCT_FIELD(ip6_addr_p_t dest); -} PACK_STRUCT_STRUCT; -PACK_STRUCT_END -#ifdef PACK_STRUCT_USE_INCLUDES -# include "arch/epstruct.h" -#endif - -/* Hop-by-hop router alert option. */ -#define IP6_HBH_HLEN 8 -#define IP6_PAD1_OPTION 0 -#define IP6_PADN_ALERT_OPTION 1 -#define IP6_ROUTER_ALERT_OPTION 5 -#define IP6_ROUTER_ALERT_VALUE_MLD 0 -#ifdef PACK_STRUCT_USE_INCLUDES -# include "arch/bpstruct.h" -#endif -PACK_STRUCT_BEGIN -struct ip6_hbh_hdr { - /* next header */ - PACK_STRUCT_FIELD(u8_t _nexth); - /* header length */ - PACK_STRUCT_FIELD(u8_t _hlen); - /* router alert option type */ - PACK_STRUCT_FIELD(u8_t _ra_opt_type); - /* router alert option data len */ - PACK_STRUCT_FIELD(u8_t _ra_opt_dlen); - /* router alert option data */ - PACK_STRUCT_FIELD(u16_t _ra_opt_data); - /* PadN option type */ - PACK_STRUCT_FIELD(u8_t _padn_opt_type); - /* PadN option data len */ - PACK_STRUCT_FIELD(u8_t _padn_opt_dlen); -} PACK_STRUCT_STRUCT; -PACK_STRUCT_END -#ifdef PACK_STRUCT_USE_INCLUDES -# include "arch/epstruct.h" -#endif - -/* Fragment header. */ -#define IP6_FRAG_HLEN 8 -#define IP6_FRAG_OFFSET_MASK 0xfff8 -#define IP6_FRAG_MORE_FLAG 0x0001 -#ifdef PACK_STRUCT_USE_INCLUDES -# include "arch/bpstruct.h" -#endif -PACK_STRUCT_BEGIN -struct ip6_frag_hdr { - /* next header */ - PACK_STRUCT_FIELD(u8_t _nexth); - /* reserved */ - PACK_STRUCT_FIELD(u8_t reserved); - /* fragment offset */ - PACK_STRUCT_FIELD(u16_t _fragment_offset); - /* fragmented packet identification */ - PACK_STRUCT_FIELD(u32_t _identification); -} PACK_STRUCT_STRUCT; -PACK_STRUCT_END -#ifdef PACK_STRUCT_USE_INCLUDES -# include "arch/epstruct.h" -#endif - -#define IP6H_V(hdr) ((ntohl((hdr)->_v_tc_fl) >> 28) & 0x0f) -#define IP6H_TC(hdr) ((ntohl((hdr)->_v_tc_fl) >> 20) & 0xff) -#define IP6H_FL(hdr) (ntohl((hdr)->_v_tc_fl) & 0x000fffff) -#define IP6H_PLEN(hdr) (ntohs((hdr)->_plen)) -#define IP6H_NEXTH(hdr) ((hdr)->_nexth) -#define IP6H_NEXTH_P(hdr) ((u8_t *)(hdr) + 6) -#define IP6H_HOPLIM(hdr) ((hdr)->_hoplim) - -#define IP6H_VTCFL_SET(hdr, v, tc, fl) (hdr)->_v_tc_fl = (htonl(((v) << 28) | ((tc) << 20) | (fl))) -#define IP6H_PLEN_SET(hdr, plen) (hdr)->_plen = htons(plen) -#define IP6H_NEXTH_SET(hdr, nexth) (hdr)->_nexth = (nexth) -#define IP6H_HOPLIM_SET(hdr, hl) (hdr)->_hoplim = (u8_t)(hl) - - -#define ip6_init() /* TODO should we init current addresses and header pointer? */ -struct netif *ip6_route(struct ip6_addr *src, struct ip6_addr *dest); -ip6_addr_t *ip6_select_source_address(struct netif *netif, ip6_addr_t * dest); -err_t ip6_input(struct pbuf *p, struct netif *inp); -err_t ip6_output(struct pbuf *p, struct ip6_addr *src, struct ip6_addr *dest, - u8_t hl, u8_t tc, u8_t nexth); -err_t ip6_output_if(struct pbuf *p, struct ip6_addr *src, struct ip6_addr *dest, - u8_t hl, u8_t tc, u8_t nexth, struct netif *netif); -#if LWIP_NETIF_HWADDRHINT -err_t ip6_output_hinted(struct pbuf *p, ip6_addr_t *src, ip6_addr_t *dest, - u8_t hl, u8_t tc, u8_t nexth, u8_t *addr_hint); -#endif /* LWIP_NETIF_HWADDRHINT */ -#if LWIP_IPV6_MLD -err_t ip6_options_add_hbh_ra(struct pbuf * p, u8_t nexth, u8_t value); -#endif /* LWIP_IPV6_MLD */ - -#define ip6_netif_get_local_ipX(netif, dest) (((netif) != NULL) ? \ - ip6_2_ipX(ip6_select_source_address(netif, dest)) : NULL) - -#if IP6_DEBUG -void ip6_debug_print(struct pbuf *p); -#else -#define ip6_debug_print(p) -#endif /* IP6_DEBUG */ - - -#ifdef __cplusplus -} -#endif - -#endif /* LWIP_IPV6 */ - -#endif /* __LWIP_IP6_H__ */ diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/ipv6/lwip/ip6_addr.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/ipv6/lwip/ip6_addr.h deleted file mode 100644 index 89b5b811..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/ipv6/lwip/ip6_addr.h +++ /dev/null @@ -1,286 +0,0 @@ -/** - * @file - * - * IPv6 addresses. - */ - -/* - * Copyright (c) 2010 Inico Technologies Ltd. - * 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. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT - * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING - * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY - * OF SUCH DAMAGE. - * - * This file is part of the lwIP TCP/IP stack. - * - * Author: Ivan Delamer - * - * Structs and macros for handling IPv6 addresses. - * - * Please coordinate changes and requests with Ivan Delamer - * - */ -#ifndef __LWIP_IP6_ADDR_H__ -#define __LWIP_IP6_ADDR_H__ - -#include "lwip/opt.h" - -#if LWIP_IPV6 /* don't build if not configured for use in lwipopts.h */ - - -#ifdef __cplusplus -extern "C" { -#endif - - -/* This is the aligned version of ip6_addr_t, - used as local variable, on the stack, etc. */ -struct ip6_addr { - u32_t addr[4]; -}; - -/* This is the packed version of ip6_addr_t, - used in network headers that are itself packed */ -#ifdef PACK_STRUCT_USE_INCLUDES -# include "arch/bpstruct.h" -#endif -PACK_STRUCT_BEGIN -struct ip6_addr_packed { - PACK_STRUCT_FIELD(u32_t addr[4]); -} PACK_STRUCT_STRUCT; -PACK_STRUCT_END -#ifdef PACK_STRUCT_USE_INCLUDES -# include "arch/epstruct.h" -#endif - -/** ip6_addr_t uses a struct for convenience only, so that the same defines can - * operate both on ip6_addr_t as well as on ip6_addr_p_t. */ -typedef struct ip6_addr ip6_addr_t; -typedef struct ip6_addr_packed ip6_addr_p_t; - - -/** IP6_ADDR_ANY can be used as a fixed IPv6 address - * for the wildcard - */ -extern const ip6_addr_t ip6_addr_any; -#define IP6_ADDR_ANY ((ip6_addr_t *)&ip6_addr_any) - - - - -#if BYTE_ORDER == BIG_ENDIAN -/** Set an IPv6 partial address given by byte-parts. */ -#define IP6_ADDR(ip6addr, index, a,b,c,d) \ - (ip6addr)->addr[index] = ((u32_t)((a) & 0xff) << 24) | \ - ((u32_t)((b) & 0xff) << 16) | \ - ((u32_t)((c) & 0xff) << 8) | \ - (u32_t)((d) & 0xff) -#else -/** Set an IPv6 partial address given by byte-parts. -Little-endian version, stored in network order (no htonl). */ -#define IP6_ADDR(ip6addr, index, a,b,c,d) \ - (ip6addr)->addr[index] = ((u32_t)((d) & 0xff) << 24) | \ - ((u32_t)((c) & 0xff) << 16) | \ - ((u32_t)((b) & 0xff) << 8) | \ - (u32_t)((a) & 0xff) -#endif - -/** Access address in 16-bit block */ -#define IP6_ADDR_BLOCK1(ip6addr) ((u16_t)(htonl((ip6addr)->addr[0]) >> 16) & 0xffff) -#define IP6_ADDR_BLOCK2(ip6addr) ((u16_t)(htonl((ip6addr)->addr[0])) & 0xffff) -#define IP6_ADDR_BLOCK3(ip6addr) ((u16_t)(htonl((ip6addr)->addr[1]) >> 16) & 0xffff) -#define IP6_ADDR_BLOCK4(ip6addr) ((u16_t)(htonl((ip6addr)->addr[1])) & 0xffff) -#define IP6_ADDR_BLOCK5(ip6addr) ((u16_t)(htonl((ip6addr)->addr[2]) >> 16) & 0xffff) -#define IP6_ADDR_BLOCK6(ip6addr) ((u16_t)(htonl((ip6addr)->addr[2])) & 0xffff) -#define IP6_ADDR_BLOCK7(ip6addr) ((u16_t)(htonl((ip6addr)->addr[3]) >> 16) & 0xffff) -#define IP6_ADDR_BLOCK8(ip6addr) ((u16_t)(htonl((ip6addr)->addr[3])) & 0xffff) - -/** Copy IPv6 address - faster than ip6_addr_set: no NULL check */ -#define ip6_addr_copy(dest, src) do{(dest).addr[0] = (src).addr[0]; \ - (dest).addr[1] = (src).addr[1]; \ - (dest).addr[2] = (src).addr[2]; \ - (dest).addr[3] = (src).addr[3];}while(0) -/** Safely copy one IPv6 address to another (src may be NULL) */ -#define ip6_addr_set(dest, src) do{(dest)->addr[0] = (src) == NULL ? 0 : (src)->addr[0]; \ - (dest)->addr[1] = (src) == NULL ? 0 : (src)->addr[1]; \ - (dest)->addr[2] = (src) == NULL ? 0 : (src)->addr[2]; \ - (dest)->addr[3] = (src) == NULL ? 0 : (src)->addr[3];}while(0) - -/** Set complete address to zero */ -#define ip6_addr_set_zero(ip6addr) do{(ip6addr)->addr[0] = 0; \ - (ip6addr)->addr[1] = 0; \ - (ip6addr)->addr[2] = 0; \ - (ip6addr)->addr[3] = 0;}while(0) - -/** Set address to ipv6 'any' (no need for htonl()) */ -#define ip6_addr_set_any(ip6addr) ip6_addr_set_zero(ip6addr) -/** Set address to ipv6 loopback address */ -#define ip6_addr_set_loopback(ip6addr) do{(ip6addr)->addr[0] = 0; \ - (ip6addr)->addr[1] = 0; \ - (ip6addr)->addr[2] = 0; \ - (ip6addr)->addr[3] = PP_HTONL(0x00000001UL);}while(0) -/** Safely copy one IPv6 address to another and change byte order - * from host- to network-order. */ -#define ip6_addr_set_hton(dest, src) do{(dest)->addr[0] = (src) == NULL ? 0 : htonl((src)->addr[0]); \ - (dest)->addr[1] = (src) == NULL ? 0 : htonl((src)->addr[1]); \ - (dest)->addr[2] = (src) == NULL ? 0 : htonl((src)->addr[2]); \ - (dest)->addr[3] = (src) == NULL ? 0 : htonl((src)->addr[3]);}while(0) - - - -/** - * Determine if two IPv6 address are on the same network. - * - * @arg addr1 IPv6 address 1 - * @arg addr2 IPv6 address 2 - * @return !0 if the network identifiers of both address match - */ -#define ip6_addr_netcmp(addr1, addr2) (((addr1)->addr[0] == (addr2)->addr[0]) && \ - ((addr1)->addr[1] == (addr2)->addr[1])) - -#define ip6_addr_cmp(addr1, addr2) (((addr1)->addr[0] == (addr2)->addr[0]) && \ - ((addr1)->addr[1] == (addr2)->addr[1]) && \ - ((addr1)->addr[2] == (addr2)->addr[2]) && \ - ((addr1)->addr[3] == (addr2)->addr[3])) - -#define ip6_get_subnet_id(ip6addr) (htonl((ip6addr)->addr[2]) & 0x0000ffffUL) - -#define ip6_addr_isany(ip6addr) (((ip6addr) == NULL) || \ - (((ip6addr)->addr[0] == 0) && \ - ((ip6addr)->addr[1] == 0) && \ - ((ip6addr)->addr[2] == 0) && \ - ((ip6addr)->addr[3] == 0))) - - -#define ip6_addr_isglobal(ip6addr) (((ip6addr)->addr[0] & PP_HTONL(0xe0000000UL)) == PP_HTONL(0x20000000UL)) - -#define ip6_addr_islinklocal(ip6addr) (((ip6addr)->addr[0] & PP_HTONL(0xffc00000UL)) == PP_HTONL(0xfe800000UL)) - -#define ip6_addr_issitelocal(ip6addr) (((ip6addr)->addr[0] & PP_HTONL(0xffc00000UL)) == PP_HTONL(0xfec00000UL)) - -#define ip6_addr_isuniquelocal(ip6addr) (((ip6addr)->addr[0] & PP_HTONL(0xfe000000UL)) == PP_HTONL(0xfc000000UL)) - -#define ip6_addr_ismulticast(ip6addr) (((ip6addr)->addr[0] & PP_HTONL(0xff000000UL)) == PP_HTONL(0xff000000UL)) -#define ip6_addr_multicast_transient_flag(ip6addr) ((ip6addr)->addr[0] & PP_HTONL(0x00100000UL)) -#define ip6_addr_multicast_prefix_flag(ip6addr) ((ip6addr)->addr[0] & PP_HTONL(0x00200000UL)) -#define ip6_addr_multicast_rendezvous_flag(ip6addr) ((ip6addr)->addr[0] & PP_HTONL(0x00400000UL)) -#define ip6_addr_multicast_scope(ip6addr) ((htonl((ip6addr)->addr[0]) >> 16) & 0xf) -#define IP6_MULTICAST_SCOPE_RESERVED 0x0 -#define IP6_MULTICAST_SCOPE_RESERVED0 0x0 -#define IP6_MULTICAST_SCOPE_INTERFACE_LOCAL 0x1 -#define IP6_MULTICAST_SCOPE_LINK_LOCAL 0x2 -#define IP6_MULTICAST_SCOPE_RESERVED3 0x3 -#define IP6_MULTICAST_SCOPE_ADMIN_LOCAL 0x4 -#define IP6_MULTICAST_SCOPE_SITE_LOCAL 0x5 -#define IP6_MULTICAST_SCOPE_ORGANIZATION_LOCAL 0x8 -#define IP6_MULTICAST_SCOPE_GLOBAL 0xe -#define IP6_MULTICAST_SCOPE_RESERVEDF 0xf -#define ip6_addr_ismulticast_iflocal(ip6addr) (((ip6addr)->addr[0] & PP_HTONL(0xffff0000UL)) == PP_HTONL(0xff010000UL)) -#define ip6_addr_ismulticast_linklocal(ip6addr) (((ip6addr)->addr[0] & PP_HTONL(0xffff0000UL)) == PP_HTONL(0xff020000UL)) -#define ip6_addr_ismulticast_adminlocal(ip6addr) (((ip6addr)->addr[0] & PP_HTONL(0xffff0000UL)) == PP_HTONL(0xff040000UL)) -#define ip6_addr_ismulticast_sitelocal(ip6addr) (((ip6addr)->addr[0] & PP_HTONL(0xffff0000UL)) == PP_HTONL(0xff050000UL)) -#define ip6_addr_ismulticast_orglocal(ip6addr) (((ip6addr)->addr[0] & PP_HTONL(0xffff0000UL)) == PP_HTONL(0xff080000UL)) -#define ip6_addr_ismulticast_global(ip6addr) (((ip6addr)->addr[0] & PP_HTONL(0xffff0000UL)) == PP_HTONL(0xff0e0000UL)) - -/* TODO define get/set for well-know multicast addresses, e.g. ff02::1 */ -#define ip6_addr_isallnodes_iflocal(ip6addr) (((ip6addr)->addr[0] == PP_HTONL(0xff010000UL)) && \ - ((ip6addr)->addr[1] == 0UL) && \ - ((ip6addr)->addr[2] == 0UL) && \ - ((ip6addr)->addr[3] == PP_HTONL(0x00000001UL))) - -#define ip6_addr_isallnodes_linklocal(ip6addr) (((ip6addr)->addr[0] == PP_HTONL(0xff020000UL)) && \ - ((ip6addr)->addr[1] == 0UL) && \ - ((ip6addr)->addr[2] == 0UL) && \ - ((ip6addr)->addr[3] == PP_HTONL(0x00000001UL))) -#define ip6_addr_set_allnodes_linklocal(ip6addr) do{(ip6addr)->addr[0] = PP_HTONL(0xff020000UL); \ - (ip6addr)->addr[1] = 0; \ - (ip6addr)->addr[2] = 0; \ - (ip6addr)->addr[3] = PP_HTONL(0x00000001UL);}while(0) - -#define ip6_addr_isallrouters_linklocal(ip6addr) (((ip6addr)->addr[0] == PP_HTONL(0xff020000UL)) && \ - ((ip6addr)->addr[1] == 0UL) && \ - ((ip6addr)->addr[2] == 0UL) && \ - ((ip6addr)->addr[3] == PP_HTONL(0x00000002UL))) -#define ip6_addr_set_allrouters_linklocal(ip6addr) do{(ip6addr)->addr[0] = PP_HTONL(0xff020000UL); \ - (ip6addr)->addr[1] = 0; \ - (ip6addr)->addr[2] = 0; \ - (ip6addr)->addr[3] = PP_HTONL(0x00000002UL);}while(0) - -#define ip6_addr_issolicitednode(ip6addr) ( ((ip6addr)->addr[0] == PP_HTONL(0xff020000UL)) && \ - ((ip6addr)->addr[2] == PP_HTONL(0x00000001UL)) && \ - (((ip6addr)->addr[3] & PP_HTONL(0xff000000UL)) == PP_HTONL(0xff000000UL)) ) - -#define ip6_addr_set_solicitednode(ip6addr, if_id) do{(ip6addr)->addr[0] = PP_HTONL(0xff020000UL); \ - (ip6addr)->addr[1] = 0; \ - (ip6addr)->addr[2] = PP_HTONL(0x00000001UL); \ - (ip6addr)->addr[3] = htonl(0xff000000UL | (htonl(if_id) & 0x00ffffffUL));}while(0) - -#define ip6_addr_cmp_solicitednode(ip6addr, sn_addr) (((ip6addr)->addr[0] == PP_HTONL(0xff020000UL)) && \ - ((ip6addr)->addr[1] == 0) && \ - ((ip6addr)->addr[2] == PP_HTONL(0x00000001UL)) && \ - ((ip6addr)->addr[3] == htonl(0xff000000UL | (htonl((sn_addr)->addr[3]) & 0x00ffffffUL)))) - -/* IPv6 address states. */ -#define IP6_ADDR_INVALID 0x00 -#define IP6_ADDR_TENTATIVE 0x08 -#define IP6_ADDR_TENTATIVE_1 0x09 /* 1 probe sent */ -#define IP6_ADDR_TENTATIVE_2 0x0a /* 2 probes sent */ -#define IP6_ADDR_TENTATIVE_3 0x0b /* 3 probes sent */ -#define IP6_ADDR_TENTATIVE_4 0x0c /* 4 probes sent */ -#define IP6_ADDR_TENTATIVE_5 0x0d /* 5 probes sent */ -#define IP6_ADDR_TENTATIVE_6 0x0e /* 6 probes sent */ -#define IP6_ADDR_TENTATIVE_7 0x0f /* 7 probes sent */ -#define IP6_ADDR_VALID 0x10 -#define IP6_ADDR_PREFERRED 0x30 -#define IP6_ADDR_DEPRECATED 0x50 - -#define ip6_addr_isinvalid(addr_state) (addr_state == IP6_ADDR_INVALID) -#define ip6_addr_istentative(addr_state) (addr_state & IP6_ADDR_TENTATIVE) -#define ip6_addr_isvalid(addr_state) (addr_state & IP6_ADDR_VALID) /* Include valid, preferred, and deprecated. */ -#define ip6_addr_ispreferred(addr_state) (addr_state == IP6_ADDR_PREFERRED) -#define ip6_addr_isdeprecated(addr_state) (addr_state == IP6_ADDR_DEPRECATED) - -#define ip6_addr_debug_print(debug, ipaddr) \ - LWIP_DEBUGF(debug, ("%"X16_F":%"X16_F":%"X16_F":%"X16_F":%"X16_F":%"X16_F":%"X16_F":%"X16_F, \ - ipaddr != NULL ? IP6_ADDR_BLOCK1(ipaddr) : 0, \ - ipaddr != NULL ? IP6_ADDR_BLOCK2(ipaddr) : 0, \ - ipaddr != NULL ? IP6_ADDR_BLOCK3(ipaddr) : 0, \ - ipaddr != NULL ? IP6_ADDR_BLOCK4(ipaddr) : 0, \ - ipaddr != NULL ? IP6_ADDR_BLOCK5(ipaddr) : 0, \ - ipaddr != NULL ? IP6_ADDR_BLOCK6(ipaddr) : 0, \ - ipaddr != NULL ? IP6_ADDR_BLOCK7(ipaddr) : 0, \ - ipaddr != NULL ? IP6_ADDR_BLOCK8(ipaddr) : 0)) - -int ip6addr_aton(const char *cp, ip6_addr_t *addr); -/** returns ptr to static buffer; not reentrant! */ -char *ip6addr_ntoa(const ip6_addr_t *addr); -char *ip6addr_ntoa_r(const ip6_addr_t *addr, char *buf, int buflen); - - - -#ifdef __cplusplus -} -#endif - -#endif /* LWIP_IPV6 */ - -#endif /* __LWIP_IP6_ADDR_H__ */ diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/ipv6/lwip/ip6_frag.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/ipv6/lwip/ip6_frag.h deleted file mode 100644 index 75898b8f..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/ipv6/lwip/ip6_frag.h +++ /dev/null @@ -1,102 +0,0 @@ -/** - * @file - * - * IPv6 fragmentation and reassembly. - */ - -/* - * Copyright (c) 2010 Inico Technologies Ltd. - * 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. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT - * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING - * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY - * OF SUCH DAMAGE. - * - * This file is part of the lwIP TCP/IP stack. - * - * Author: Ivan Delamer - * - * - * Please coordinate changes and requests with Ivan Delamer - * - */ -#ifndef __LWIP_IP6_FRAG_H__ -#define __LWIP_IP6_FRAG_H__ - -#include "lwip/opt.h" -#include "lwip/pbuf.h" -#include "lwip/ip6_addr.h" -#include "lwip/netif.h" - -#ifdef __cplusplus -extern "C" { -#endif - - -#if LWIP_IPV6 && LWIP_IPV6_REASS /* don't build if not configured for use in lwipopts.h */ - -/* The IPv6 reassembly timer interval in milliseconds. */ -#define IP6_REASS_TMR_INTERVAL 1000 - -/* IPv6 reassembly helper struct. - * This is exported because memp needs to know the size. - */ -struct ip6_reassdata { - struct ip6_reassdata *next; - struct pbuf *p; - struct ip6_hdr * iphdr; - u32_t identification; - u16_t datagram_len; - u8_t nexth; - u8_t timer; -}; - -#define ip6_reass_init() /* Compatibility define */ -void ip6_reass_tmr(void); -struct pbuf * ip6_reass(struct pbuf *p); - -#endif /* LWIP_IPV6 && LWIP_IPV6_REASS */ - -#if LWIP_IPV6 && LWIP_IPV6_FRAG /* don't build if not configured for use in lwipopts.h */ - -/** A custom pbuf that holds a reference to another pbuf, which is freed - * when this custom pbuf is freed. This is used to create a custom PBUF_REF - * that points into the original pbuf. */ -#ifndef __LWIP_PBUF_CUSTOM_REF__ -#define __LWIP_PBUF_CUSTOM_REF__ -struct pbuf_custom_ref { - /** 'base class' */ - struct pbuf_custom pc; - /** pointer to the original pbuf that is referenced */ - struct pbuf *original; -}; -#endif /* __LWIP_PBUF_CUSTOM_REF__ */ - -err_t ip6_frag(struct pbuf *p, struct netif *netif, ip6_addr_t *dest); - -#endif /* LWIP_IPV6 && LWIP_IPV6_FRAG */ - - -#ifdef __cplusplus -} -#endif - -#endif /* __LWIP_IP6_FRAG_H__ */ diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/ipv6/lwip/mld6.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/ipv6/lwip/mld6.h deleted file mode 100644 index abd86e55..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/ipv6/lwip/mld6.h +++ /dev/null @@ -1,118 +0,0 @@ -/** - * @file - * - * Multicast listener discovery for IPv6. Aims to be compliant with RFC 2710. - * No support for MLDv2. - */ - -/* - * Copyright (c) 2010 Inico Technologies Ltd. - * 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. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT - * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING - * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY - * OF SUCH DAMAGE. - * - * This file is part of the lwIP TCP/IP stack. - * - * Author: Ivan Delamer - * - * - * Please coordinate changes and requests with Ivan Delamer - * - */ - -#ifndef __LWIP_MLD6_H__ -#define __LWIP_MLD6_H__ - -#include "lwip/opt.h" - -#if LWIP_IPV6_MLD && LWIP_IPV6 /* don't build if not configured for use in lwipopts.h */ - -#include "lwip/pbuf.h" -#include "lwip/netif.h" - - -#ifdef __cplusplus -extern "C" { -#endif - -struct mld_group { - /** next link */ - struct mld_group *next; - /** interface on which the group is active */ - struct netif *netif; - /** multicast address */ - ip6_addr_t group_address; - /** signifies we were the last person to report */ - u8_t last_reporter_flag; - /** current state of the group */ - u8_t group_state; - /** timer for reporting */ - u16_t timer; - /** counter of simultaneous uses */ - u8_t use; -}; - -/** Multicast listener report/query/done message header. */ -#ifdef PACK_STRUCT_USE_INCLUDES -# include "arch/bpstruct.h" -#endif -PACK_STRUCT_BEGIN -struct mld_header { - PACK_STRUCT_FIELD(u8_t type); - PACK_STRUCT_FIELD(u8_t code); - PACK_STRUCT_FIELD(u16_t chksum); - PACK_STRUCT_FIELD(u16_t max_resp_delay); - PACK_STRUCT_FIELD(u16_t reserved); - PACK_STRUCT_FIELD(ip6_addr_p_t multicast_address); - /* Options follow. */ -} PACK_STRUCT_STRUCT; -PACK_STRUCT_END -#ifdef PACK_STRUCT_USE_INCLUDES -# include "arch/epstruct.h" -#endif - -#define MLD6_TMR_INTERVAL 100 /* Milliseconds */ - -/* MAC Filter Actions, these are passed to a netif's - * mld_mac_filter callback function. */ -#define MLD6_DEL_MAC_FILTER 0 -#define MLD6_ADD_MAC_FILTER 1 - - -#define mld6_init() /* TODO should we init tables? */ -err_t mld6_stop(struct netif *netif); -void mld6_report_groups(struct netif *netif); -void mld6_tmr(void); -struct mld_group *mld6_lookfor_group(struct netif *ifp, ip6_addr_t *addr); -void mld6_input(struct pbuf *p, struct netif *inp); -err_t mld6_joingroup(ip6_addr_t *srcaddr, ip6_addr_t *groupaddr); -err_t mld6_leavegroup(ip6_addr_t *srcaddr, ip6_addr_t *groupaddr); - - -#ifdef __cplusplus -} -#endif - -#endif /* LWIP_IPV6_MLD && LWIP_IPV6 */ - -#endif /* __LWIP_MLD6_H__ */ diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/ipv6/lwip/nd6.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/ipv6/lwip/nd6.h deleted file mode 100644 index 28636e89..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/ipv6/lwip/nd6.h +++ /dev/null @@ -1,369 +0,0 @@ -/** - * @file - * - * Neighbor discovery and stateless address autoconfiguration for IPv6. - * Aims to be compliant with RFC 4861 (Neighbor discovery) and RFC 4862 - * (Address autoconfiguration). - */ - -/* - * Copyright (c) 2010 Inico Technologies Ltd. - * 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. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT - * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING - * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY - * OF SUCH DAMAGE. - * - * This file is part of the lwIP TCP/IP stack. - * - * Author: Ivan Delamer - * - * - * Please coordinate changes and requests with Ivan Delamer - * - */ - -#ifndef __LWIP_ND6_H__ -#define __LWIP_ND6_H__ - -#include "lwip/opt.h" - -#if LWIP_IPV6 /* don't build if not configured for use in lwipopts.h */ - -#include "lwip/pbuf.h" -#include "lwip/ip6.h" -#include "lwip/ip6_addr.h" -#include "lwip/netif.h" - - -#ifdef __cplusplus -extern "C" { -#endif - -/* Struct for tables. */ -struct nd6_neighbor_cache_entry { - ip6_addr_t next_hop_address; - struct netif * netif; - u8_t lladdr[NETIF_MAX_HWADDR_LEN]; - /*u32_t pmtu;*/ -#if LWIP_ND6_QUEUEING - /** Pointer to queue of pending outgoing packets on this entry. */ - struct nd6_q_entry *q; -#else /* LWIP_ND6_QUEUEING */ - /** Pointer to a single pending outgoing packet on this entry. */ - struct pbuf *q; -#endif /* LWIP_ND6_QUEUEING */ - u8_t state; - u8_t isrouter; - union { - u32_t reachable_time; - u32_t delay_time; - u32_t probes_sent; - u32_t stale_time; - } counter; -}; - -struct nd6_destination_cache_entry { - ip6_addr_t destination_addr; - ip6_addr_t next_hop_addr; - u32_t pmtu; - u32_t age; -}; - -struct nd6_prefix_list_entry { - ip6_addr_t prefix; - struct netif * netif; - u32_t invalidation_timer; -#if LWIP_IPV6_AUTOCONFIG - u8_t flags; -#define ND6_PREFIX_AUTOCONFIG_AUTONOMOUS 0x01 -#define ND6_PREFIX_AUTOCONFIG_ADDRESS_GENERATED 0x02 -#define ND6_PREFIX_AUTOCONFIG_ADDRESS_DUPLICATE 0x04 -#endif /* LWIP_IPV6_AUTOCONFIG */ -}; - -struct nd6_router_list_entry { - struct nd6_neighbor_cache_entry * neighbor_entry; - u32_t invalidation_timer; - u8_t flags; -}; - - -enum nd6_neighbor_cache_entry_state { - ND6_NO_ENTRY = 0, - ND6_INCOMPLETE, - ND6_REACHABLE, - ND6_STALE, - ND6_DELAY, - ND6_PROBE -}; - -#if LWIP_ND6_QUEUEING -/** struct for queueing outgoing packets for unknown address - * defined here to be accessed by memp.h - */ -struct nd6_q_entry { - struct nd6_q_entry *next; - struct pbuf *p; -}; -#endif /* LWIP_ND6_QUEUEING */ - -/** Neighbor solicitation message header. */ -#ifdef PACK_STRUCT_USE_INCLUDES -# include "arch/bpstruct.h" -#endif -PACK_STRUCT_BEGIN -struct ns_header { - PACK_STRUCT_FIELD(u8_t type); - PACK_STRUCT_FIELD(u8_t code); - PACK_STRUCT_FIELD(u16_t chksum); - PACK_STRUCT_FIELD(u32_t reserved); - PACK_STRUCT_FIELD(ip6_addr_p_t target_address); - /* Options follow. */ -} PACK_STRUCT_STRUCT; -PACK_STRUCT_END -#ifdef PACK_STRUCT_USE_INCLUDES -# include "arch/epstruct.h" -#endif - -/** Neighbor advertisement message header. */ -#ifdef PACK_STRUCT_USE_INCLUDES -# include "arch/bpstruct.h" -#endif -PACK_STRUCT_BEGIN -struct na_header { - PACK_STRUCT_FIELD(u8_t type); - PACK_STRUCT_FIELD(u8_t code); - PACK_STRUCT_FIELD(u16_t chksum); - PACK_STRUCT_FIELD(u8_t flags); - PACK_STRUCT_FIELD(u8_t reserved[3]); - PACK_STRUCT_FIELD(ip6_addr_p_t target_address); - /* Options follow. */ -} PACK_STRUCT_STRUCT; -PACK_STRUCT_END -#ifdef PACK_STRUCT_USE_INCLUDES -# include "arch/epstruct.h" -#endif -#define ND6_FLAG_ROUTER (0x80) -#define ND6_FLAG_SOLICITED (0x40) -#define ND6_FLAG_OVERRIDE (0x20) - -/** Router solicitation message header. */ -#ifdef PACK_STRUCT_USE_INCLUDES -# include "arch/bpstruct.h" -#endif -PACK_STRUCT_BEGIN -struct rs_header { - PACK_STRUCT_FIELD(u8_t type); - PACK_STRUCT_FIELD(u8_t code); - PACK_STRUCT_FIELD(u16_t chksum); - PACK_STRUCT_FIELD(u32_t reserved); - /* Options follow. */ -} PACK_STRUCT_STRUCT; -PACK_STRUCT_END -#ifdef PACK_STRUCT_USE_INCLUDES -# include "arch/epstruct.h" -#endif - -/** Router advertisement message header. */ -#define ND6_RA_FLAG_MANAGED_ADDR_CONFIG (0x80) -#define ND6_RA_FLAG_OTHER_STATEFUL_CONFIG (0x40) -#define ND6_RA_FLAG_HOME_AGENT (0x20) -#define ND6_RA_PREFERENCE_MASK (0x18) -#define ND6_RA_PREFERENCE_HIGH (0x08) -#define ND6_RA_PREFERENCE_MEDIUM (0x00) -#define ND6_RA_PREFERENCE_LOW (0x18) -#define ND6_RA_PREFERENCE_DISABLED (0x10) -#ifdef PACK_STRUCT_USE_INCLUDES -# include "arch/bpstruct.h" -#endif -PACK_STRUCT_BEGIN -struct ra_header { - PACK_STRUCT_FIELD(u8_t type); - PACK_STRUCT_FIELD(u8_t code); - PACK_STRUCT_FIELD(u16_t chksum); - PACK_STRUCT_FIELD(u8_t current_hop_limit); - PACK_STRUCT_FIELD(u8_t flags); - PACK_STRUCT_FIELD(u16_t router_lifetime); - PACK_STRUCT_FIELD(u32_t reachable_time); - PACK_STRUCT_FIELD(u32_t retrans_timer); - /* Options follow. */ -} PACK_STRUCT_STRUCT; -PACK_STRUCT_END -#ifdef PACK_STRUCT_USE_INCLUDES -# include "arch/epstruct.h" -#endif - -/** Redirect message header. */ -#ifdef PACK_STRUCT_USE_INCLUDES -# include "arch/bpstruct.h" -#endif -PACK_STRUCT_BEGIN -struct redirect_header { - PACK_STRUCT_FIELD(u8_t type); - PACK_STRUCT_FIELD(u8_t code); - PACK_STRUCT_FIELD(u16_t chksum); - PACK_STRUCT_FIELD(u32_t reserved); - PACK_STRUCT_FIELD(ip6_addr_p_t target_address); - PACK_STRUCT_FIELD(ip6_addr_p_t destination_address); - /* Options follow. */ -} PACK_STRUCT_STRUCT; -PACK_STRUCT_END -#ifdef PACK_STRUCT_USE_INCLUDES -# include "arch/epstruct.h" -#endif - -/** Link-layer address option. */ -#define ND6_OPTION_TYPE_SOURCE_LLADDR (0x01) -#define ND6_OPTION_TYPE_TARGET_LLADDR (0x02) -#ifdef PACK_STRUCT_USE_INCLUDES -# include "arch/bpstruct.h" -#endif -PACK_STRUCT_BEGIN -struct lladdr_option { - PACK_STRUCT_FIELD(u8_t type); - PACK_STRUCT_FIELD(u8_t length); - PACK_STRUCT_FIELD(u8_t addr[NETIF_MAX_HWADDR_LEN]); -} PACK_STRUCT_STRUCT; -PACK_STRUCT_END -#ifdef PACK_STRUCT_USE_INCLUDES -# include "arch/epstruct.h" -#endif - -/** Prefix information option. */ -#define ND6_OPTION_TYPE_PREFIX_INFO (0x03) -#define ND6_PREFIX_FLAG_ON_LINK (0x80) -#define ND6_PREFIX_FLAG_AUTONOMOUS (0x40) -#define ND6_PREFIX_FLAG_ROUTER_ADDRESS (0x20) -#define ND6_PREFIX_FLAG_SITE_PREFIX (0x10) -#ifdef PACK_STRUCT_USE_INCLUDES -# include "arch/bpstruct.h" -#endif -PACK_STRUCT_BEGIN -struct prefix_option { - PACK_STRUCT_FIELD(u8_t type); - PACK_STRUCT_FIELD(u8_t length); - PACK_STRUCT_FIELD(u8_t prefix_length); - PACK_STRUCT_FIELD(u8_t flags); - PACK_STRUCT_FIELD(u32_t valid_lifetime); - PACK_STRUCT_FIELD(u32_t preferred_lifetime); - PACK_STRUCT_FIELD(u8_t reserved2[3]); - PACK_STRUCT_FIELD(u8_t site_prefix_length); - PACK_STRUCT_FIELD(ip6_addr_p_t prefix); -} PACK_STRUCT_STRUCT; -PACK_STRUCT_END -#ifdef PACK_STRUCT_USE_INCLUDES -# include "arch/epstruct.h" -#endif - -/** Redirected header option. */ -#define ND6_OPTION_TYPE_REDIR_HDR (0x04) -#ifdef PACK_STRUCT_USE_INCLUDES -# include "arch/bpstruct.h" -#endif -PACK_STRUCT_BEGIN -struct redirected_header_option { - PACK_STRUCT_FIELD(u8_t type); - PACK_STRUCT_FIELD(u8_t length); - PACK_STRUCT_FIELD(u8_t reserved[6]); - /* Portion of redirected packet follows. */ - /* PACK_STRUCT_FIELD(u8_t redirected[8]); */ -} PACK_STRUCT_STRUCT; -PACK_STRUCT_END -#ifdef PACK_STRUCT_USE_INCLUDES -# include "arch/epstruct.h" -#endif - -/** MTU option. */ -#define ND6_OPTION_TYPE_MTU (0x05) -#ifdef PACK_STRUCT_USE_INCLUDES -# include "arch/bpstruct.h" -#endif -PACK_STRUCT_BEGIN -struct mtu_option { - PACK_STRUCT_FIELD(u8_t type); - PACK_STRUCT_FIELD(u8_t length); - PACK_STRUCT_FIELD(u16_t reserved); - PACK_STRUCT_FIELD(u32_t mtu); -} PACK_STRUCT_STRUCT; -PACK_STRUCT_END -#ifdef PACK_STRUCT_USE_INCLUDES -# include "arch/epstruct.h" -#endif - -/** Route information option. */ -#define ND6_OPTION_TYPE_ROUTE_INFO (24) -#ifdef PACK_STRUCT_USE_INCLUDES -# include "arch/bpstruct.h" -#endif -PACK_STRUCT_BEGIN -struct route_option { - PACK_STRUCT_FIELD(u8_t type); - PACK_STRUCT_FIELD(u8_t length); - PACK_STRUCT_FIELD(u8_t prefix_length); - PACK_STRUCT_FIELD(u8_t preference); - PACK_STRUCT_FIELD(u32_t route_lifetime); - PACK_STRUCT_FIELD(ip6_addr_p_t prefix); -} PACK_STRUCT_STRUCT; -PACK_STRUCT_END -#ifdef PACK_STRUCT_USE_INCLUDES -# include "arch/epstruct.h" -#endif - -/* the possible states of an IP address */ -#define IP6_ADDRESS_STATE_INVALID (0) -#define IP6_ADDRESS_STATE_VALID (0x4) -#define IP6_ADDRESS_STATE_PREFERRED (0x5) /* includes valid */ -#define IP6_ADDRESS_STATE_DEPRECATED (0x6) /* includes valid */ -#define IP6_ADDRESS_STATE_TENTATIV (0x8) - -/** 1 second period */ -#define ND6_TMR_INTERVAL 1000 - -/* Router tables. */ -/* TODO make these static? and entries accessible through API? */ -extern struct nd6_neighbor_cache_entry neighbor_cache[]; -extern struct nd6_destination_cache_entry destination_cache[]; -extern struct nd6_prefix_list_entry prefix_list[]; -extern struct nd6_router_list_entry default_router_list[]; - -/* Default values, can be updated by a RA message. */ -extern u32_t reachable_time; -extern u32_t retrans_timer; - -#define nd6_init() /* TODO should we init tables? */ -void nd6_tmr(void); -void nd6_input(struct pbuf *p, struct netif *inp); -s8_t nd6_get_next_hop_entry(ip6_addr_t * ip6addr, struct netif * netif); -s8_t nd6_select_router(ip6_addr_t * ip6addr, struct netif * netif); -u16_t nd6_get_destination_mtu(ip6_addr_t * ip6addr, struct netif * netif); -err_t nd6_queue_packet(s8_t neighbor_index, struct pbuf * p); -#if LWIP_ND6_TCP_REACHABILITY_HINTS -void nd6_reachability_hint(ip6_addr_t * ip6addr); -#endif /* LWIP_ND6_TCP_REACHABILITY_HINTS */ - -#ifdef __cplusplus -} -#endif - -#endif /* LWIP_IPV6 */ - -#endif /* __LWIP_ND6_H__ */ diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/lwip/api.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/lwip/api.h deleted file mode 100644 index ac58eebb..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/lwip/api.h +++ /dev/null @@ -1,338 +0,0 @@ -/* - * Copyright (c) 2001-2004 Swedish Institute of Computer Science. - * 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. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT - * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING - * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY - * OF SUCH DAMAGE. - * - * This file is part of the lwIP TCP/IP stack. - * - * Author: Adam Dunkels - * - */ -#ifndef __LWIP_API_H__ -#define __LWIP_API_H__ - -#include "lwip/opt.h" - -#if LWIP_NETCONN /* don't build if not configured for use in lwipopts.h */ - -#include /* for size_t */ - -#include "lwip/netbuf.h" -#include "lwip/sys.h" -#include "lwip/ip_addr.h" -#include "lwip/err.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/* Throughout this file, IP addresses and port numbers are expected to be in - * the same byte order as in the corresponding pcb. - */ - -/* Flags for netconn_write (u8_t) */ -#define NETCONN_NOFLAG 0x00 -#define NETCONN_NOCOPY 0x00 /* Only for source code compatibility */ -#define NETCONN_COPY 0x01 -#define NETCONN_MORE 0x02 -#define NETCONN_DONTBLOCK 0x04 - -/* Flags for struct netconn.flags (u8_t) */ -/** TCP: when data passed to netconn_write doesn't fit into the send buffer, - this temporarily stores whether to wake up the original application task - if data couldn't be sent in the first try. */ -#define NETCONN_FLAG_WRITE_DELAYED 0x01 -/** Should this netconn avoid blocking? */ -#define NETCONN_FLAG_NON_BLOCKING 0x02 -/** Was the last connect action a non-blocking one? */ -#define NETCONN_FLAG_IN_NONBLOCKING_CONNECT 0x04 -/** If this is set, a TCP netconn must call netconn_recved() to update - the TCP receive window (done automatically if not set). */ -#define NETCONN_FLAG_NO_AUTO_RECVED 0x08 -/** If a nonblocking write has been rejected before, poll_tcp needs to - check if the netconn is writable again */ -#define NETCONN_FLAG_CHECK_WRITESPACE 0x10 -#if LWIP_IPV6 -/** If this flag is set then only IPv6 communication is allowed on the - netconn. As per RFC#3493 this features defaults to OFF allowing - dual-stack usage by default. */ -#define NETCONN_FLAG_IPV6_V6ONLY 0x20 -#endif /* LWIP_IPV6 */ - - -/* Helpers to process several netconn_types by the same code */ -#define NETCONNTYPE_GROUP(t) ((t)&0xF0) -#define NETCONNTYPE_DATAGRAM(t) ((t)&0xE0) -#if LWIP_IPV6 -#define NETCONN_TYPE_IPV6 0x08 -#define NETCONNTYPE_ISIPV6(t) ((t)&0x08) -#define NETCONNTYPE_ISUDPLITE(t) (((t)&0xF7) == NETCONN_UDPLITE) -#define NETCONNTYPE_ISUDPNOCHKSUM(t) (((t)&0xF7) == NETCONN_UDPNOCHKSUM) -#else /* LWIP_IPV6 */ -#define NETCONNTYPE_ISUDPLITE(t) ((t) == NETCONN_UDPLITE) -#define NETCONNTYPE_ISUDPNOCHKSUM(t) ((t) == NETCONN_UDPNOCHKSUM) -#endif /* LWIP_IPV6 */ - -/** Protocol family and type of the netconn */ -enum netconn_type { - NETCONN_INVALID = 0, - /* NETCONN_TCP Group */ - NETCONN_TCP = 0x10, -#if LWIP_IPV6 - NETCONN_TCP_IPV6 = NETCONN_TCP | NETCONN_TYPE_IPV6 /* 0x18 */, -#endif /* LWIP_IPV6 */ - /* NETCONN_UDP Group */ - NETCONN_UDP = 0x20, - NETCONN_UDPLITE = 0x21, - NETCONN_UDPNOCHKSUM = 0x22, -#if LWIP_IPV6 - NETCONN_UDP_IPV6 = NETCONN_UDP | NETCONN_TYPE_IPV6 /* 0x28 */, - NETCONN_UDPLITE_IPV6 = NETCONN_UDPLITE | NETCONN_TYPE_IPV6 /* 0x29 */, - NETCONN_UDPNOCHKSUM_IPV6 = NETCONN_UDPNOCHKSUM | NETCONN_TYPE_IPV6 /* 0x2a */, -#endif /* LWIP_IPV6 */ - /* NETCONN_RAW Group */ - NETCONN_RAW = 0x40 -#if LWIP_IPV6 - , - NETCONN_RAW_IPV6 = NETCONN_RAW | NETCONN_TYPE_IPV6 /* 0x48 */ -#endif /* LWIP_IPV6 */ -}; - -/** Current state of the netconn. Non-TCP netconns are always - * in state NETCONN_NONE! */ -enum netconn_state { - NETCONN_NONE, - NETCONN_WRITE, - NETCONN_LISTEN, - NETCONN_CONNECT, - NETCONN_CLOSE -}; - -/** Use to inform the callback function about changes */ -enum netconn_evt { - NETCONN_EVT_RCVPLUS, - NETCONN_EVT_RCVMINUS, - NETCONN_EVT_SENDPLUS, - NETCONN_EVT_SENDMINUS, - NETCONN_EVT_ERROR -}; - -#if LWIP_IGMP || (LWIP_IPV6 && LWIP_IPV6_MLD) -/** Used for netconn_join_leave_group() */ -enum netconn_igmp { - NETCONN_JOIN, - NETCONN_LEAVE -}; -#endif /* LWIP_IGMP || (LWIP_IPV6 && LWIP_IPV6_MLD) */ - -/* forward-declare some structs to avoid to include their headers */ -struct ip_pcb; -struct tcp_pcb; -struct udp_pcb; -struct raw_pcb; -struct netconn; -struct api_msg_msg; - -/** A callback prototype to inform about events for a netconn */ -typedef void (* netconn_callback)(struct netconn *, enum netconn_evt, u16_t len); - -/** A netconn descriptor */ -struct netconn { - /** type of the netconn (TCP, UDP or RAW) */ - enum netconn_type type; - /** current state of the netconn */ - enum netconn_state state; - /** the lwIP internal protocol control block */ - union { - struct ip_pcb *ip; - struct tcp_pcb *tcp; - struct udp_pcb *udp; - struct raw_pcb *raw; - } pcb; - /** the last error this netconn had */ - err_t last_err; - /** sem that is used to synchroneously execute functions in the core context */ - sys_sem_t op_completed; - /** mbox where received packets are stored until they are fetched - by the netconn application thread (can grow quite big) */ - sys_mbox_t recvmbox; -#if LWIP_TCP - /** mbox where new connections are stored until processed - by the application thread */ - sys_mbox_t acceptmbox; -#endif /* LWIP_TCP */ - /** only used for socket layer */ -#if LWIP_SOCKET - int socket; -#endif /* LWIP_SOCKET */ -#if LWIP_SO_SNDTIMEO - /** timeout to wait for sending data (which means enqueueing data for sending - in internal buffers) */ - s32_t send_timeout; -#endif /* LWIP_SO_RCVTIMEO */ -#if LWIP_SO_RCVTIMEO - /** timeout to wait for new data to be received - (or connections to arrive for listening netconns) */ - int recv_timeout; -#endif /* LWIP_SO_RCVTIMEO */ -#if LWIP_SO_RCVBUF - /** maximum amount of bytes queued in recvmbox - not used for TCP: adjust TCP_WND instead! */ - int recv_bufsize; - /** number of bytes currently in recvmbox to be received, - tested against recv_bufsize to limit bytes on recvmbox - for UDP and RAW, used for FIONREAD */ - s16_t recv_avail; -#endif /* LWIP_SO_RCVBUF */ - /** flags holding more netconn-internal state, see NETCONN_FLAG_* defines */ - u8_t flags; -#if LWIP_TCP - /** TCP: when data passed to netconn_write doesn't fit into the send buffer, - this temporarily stores how much is already sent. */ - size_t write_offset; - /** TCP: when data passed to netconn_write doesn't fit into the send buffer, - this temporarily stores the message. - Also used during connect and close. */ - struct api_msg_msg *current_msg; -#endif /* LWIP_TCP */ - /** A callback function that is informed about events for this netconn */ - netconn_callback callback; -}; - -/** Register an Network connection event */ -#define API_EVENT(c,e,l) if (c->callback) { \ - (*c->callback)(c, e, l); \ - } - -/** Set conn->last_err to err but don't overwrite fatal errors */ -#define NETCONN_SET_SAFE_ERR(conn, err) do { \ - SYS_ARCH_DECL_PROTECT(lev); \ - SYS_ARCH_PROTECT(lev); \ - if (!ERR_IS_FATAL((conn)->last_err)) { \ - (conn)->last_err = err; \ - } \ - SYS_ARCH_UNPROTECT(lev); \ -} while(0); - -/* Network connection functions: */ -#define netconn_new(t) netconn_new_with_proto_and_callback(t, 0, NULL) -#define netconn_new_with_callback(t, c) netconn_new_with_proto_and_callback(t, 0, c) -struct -netconn *netconn_new_with_proto_and_callback(enum netconn_type t, u8_t proto, - netconn_callback callback); -err_t netconn_delete(struct netconn *conn); -/** Get the type of a netconn (as enum netconn_type). */ -#define netconn_type(conn) (conn->type) - -err_t netconn_getaddr(struct netconn *conn, ip_addr_t *addr, - u16_t *port, u8_t local); -#define netconn_peer(c,i,p) netconn_getaddr(c,i,p,0) -#define netconn_addr(c,i,p) netconn_getaddr(c,i,p,1) - -err_t netconn_bind(struct netconn *conn, ip_addr_t *addr, u16_t port); -err_t netconn_connect(struct netconn *conn, ip_addr_t *addr, u16_t port); -err_t netconn_disconnect (struct netconn *conn); -err_t netconn_listen_with_backlog(struct netconn *conn, u8_t backlog); -#define netconn_listen(conn) netconn_listen_with_backlog(conn, TCP_DEFAULT_LISTEN_BACKLOG) -err_t netconn_accept(struct netconn *conn, struct netconn **new_conn); -err_t netconn_recv(struct netconn *conn, struct netbuf **new_buf); -err_t netconn_recv_tcp_pbuf(struct netconn *conn, struct pbuf **new_buf); -void netconn_recved(struct netconn *conn, u32_t length); -err_t netconn_sendto(struct netconn *conn, struct netbuf *buf, - ip_addr_t *addr, u16_t port); -err_t netconn_send(struct netconn *conn, struct netbuf *buf); -err_t netconn_write_partly(struct netconn *conn, const void *dataptr, size_t size, - u8_t apiflags, size_t *bytes_written); -#define netconn_write(conn, dataptr, size, apiflags) \ - netconn_write_partly(conn, dataptr, size, apiflags, NULL) -err_t netconn_close(struct netconn *conn); -err_t netconn_shutdown(struct netconn *conn, u8_t shut_rx, u8_t shut_tx); - -#if LWIP_IGMP || (LWIP_IPV6 && LWIP_IPV6_MLD) -err_t netconn_join_leave_group(struct netconn *conn, ip_addr_t *multiaddr, - ip_addr_t *netif_addr, enum netconn_igmp join_or_leave); -#endif /* LWIP_IGMP || (LWIP_IPV6 && LWIP_IPV6_MLD) */ -#if LWIP_DNS -err_t netconn_gethostbyname(const char *name, ip_addr_t *addr); -#endif /* LWIP_DNS */ -#if LWIP_IPV6 - -#define netconn_bind_ip6(conn, ip6addr, port) (NETCONNTYPE_ISIPV6((conn)->type) ? \ - netconn_bind(conn, ip6_2_ip(ip6addr), port) : ERR_VAL) -#define netconn_connect_ip6(conn, ip6addr, port) (NETCONNTYPE_ISIPV6((conn)->type) ? \ - netconn_connect(conn, ip6_2_ip(ip6addr), port) : ERR_VAL) -#define netconn_sendto_ip6(conn, buf, ip6addr, port) (NETCONNTYPE_ISIPV6((conn)->type) ? \ - netconn_sendto(conn, buf, ip6_2_ip(ip6addr), port) : ERR_VAL) -#if LWIP_IPV6_MLD -#define netconn_join_leave_group_ip6(conn, multiaddr, srcaddr, join_or_leave) (NETCONNTYPE_ISIPV6((conn)->type) ? \ - netconn_join_leave_group(conn, ip6_2_ip(multiaddr), ip6_2_ip(srcaddr), join_or_leave) :\ - ERR_VAL) -#endif /* LWIP_IPV6_MLD*/ -#endif /* LWIP_IPV6 */ - -#define netconn_err(conn) ((conn)->last_err) -#define netconn_recv_bufsize(conn) ((conn)->recv_bufsize) - -/** Set the blocking status of netconn calls (@todo: write/send is missing) */ -#define netconn_set_nonblocking(conn, val) do { if(val) { \ - (conn)->flags |= NETCONN_FLAG_NON_BLOCKING; \ -} else { \ - (conn)->flags &= ~ NETCONN_FLAG_NON_BLOCKING; }} while(0) -/** Get the blocking status of netconn calls (@todo: write/send is missing) */ -#define netconn_is_nonblocking(conn) (((conn)->flags & NETCONN_FLAG_NON_BLOCKING) != 0) - -/** TCP: Set the no-auto-recved status of netconn calls (see NETCONN_FLAG_NO_AUTO_RECVED) */ -#define netconn_set_noautorecved(conn, val) do { if(val) { \ - (conn)->flags |= NETCONN_FLAG_NO_AUTO_RECVED; \ -} else { \ - (conn)->flags &= ~ NETCONN_FLAG_NO_AUTO_RECVED; }} while(0) -/** TCP: Get the no-auto-recved status of netconn calls (see NETCONN_FLAG_NO_AUTO_RECVED) */ -#define netconn_get_noautorecved(conn) (((conn)->flags & NETCONN_FLAG_NO_AUTO_RECVED) != 0) - -#if LWIP_SO_SNDTIMEO -/** Set the send timeout in milliseconds */ -#define netconn_set_sendtimeout(conn, timeout) ((conn)->send_timeout = (timeout)) -/** Get the send timeout in milliseconds */ -#define netconn_get_sendtimeout(conn) ((conn)->send_timeout) -#endif /* LWIP_SO_SNDTIMEO */ -#if LWIP_SO_RCVTIMEO -/** Set the receive timeout in milliseconds */ -#define netconn_set_recvtimeout(conn, timeout) ((conn)->recv_timeout = (timeout)) -/** Get the receive timeout in milliseconds */ -#define netconn_get_recvtimeout(conn) ((conn)->recv_timeout) -#endif /* LWIP_SO_RCVTIMEO */ -#if LWIP_SO_RCVBUF -/** Set the receive buffer in bytes */ -#define netconn_set_recvbufsize(conn, recvbufsize) ((conn)->recv_bufsize = (recvbufsize)) -/** Get the receive buffer in bytes */ -#define netconn_get_recvbufsize(conn) ((conn)->recv_bufsize) -#endif /* LWIP_SO_RCVBUF*/ - -#ifdef __cplusplus -} -#endif - -#endif /* LWIP_NETCONN */ - -#endif /* __LWIP_API_H__ */ diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/lwip/api_msg.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/lwip/api_msg.h deleted file mode 100644 index 8268036a..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/lwip/api_msg.h +++ /dev/null @@ -1,177 +0,0 @@ -/* - * Copyright (c) 2001-2004 Swedish Institute of Computer Science. - * 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. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT - * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING - * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY - * OF SUCH DAMAGE. - * - * This file is part of the lwIP TCP/IP stack. - * - * Author: Adam Dunkels - * - */ -#ifndef __LWIP_API_MSG_H__ -#define __LWIP_API_MSG_H__ - -#include "lwip/opt.h" - -#if LWIP_NETCONN /* don't build if not configured for use in lwipopts.h */ - -#include /* for size_t */ - -#include "lwip/ip_addr.h" -#include "lwip/err.h" -#include "lwip/sys.h" -#include "lwip/igmp.h" -#include "lwip/api.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/* For the netconn API, these values are use as a bitmask! */ -#define NETCONN_SHUT_RD 1 -#define NETCONN_SHUT_WR 2 -#define NETCONN_SHUT_RDWR (NETCONN_SHUT_RD | NETCONN_SHUT_WR) - -/* IP addresses and port numbers are expected to be in - * the same byte order as in the corresponding pcb. - */ -/** This struct includes everything that is necessary to execute a function - for a netconn in another thread context (mainly used to process netconns - in the tcpip_thread context to be thread safe). */ -struct api_msg_msg { - /** The netconn which to process - always needed: it includes the semaphore - which is used to block the application thread until the function finished. */ - struct netconn *conn; - /** The return value of the function executed in tcpip_thread. */ - err_t err; - /** Depending on the executed function, one of these union members is used */ - union { - /** used for lwip_netconn_do_send */ - struct netbuf *b; - /** used for lwip_netconn_do_newconn */ - struct { - u8_t proto; - } n; - /** used for lwip_netconn_do_bind and lwip_netconn_do_connect */ - struct { - ip_addr_t *ipaddr; - u16_t port; - } bc; - /** used for lwip_netconn_do_getaddr */ - struct { - ipX_addr_t *ipaddr; - u16_t *port; - u8_t local; - } ad; - /** used for lwip_netconn_do_write */ - struct { - const void *dataptr; - size_t len; - u8_t apiflags; -#if LWIP_SO_SNDTIMEO - u32_t time_started; -#endif /* LWIP_SO_SNDTIMEO */ - } w; - /** used for lwip_netconn_do_recv */ - struct { - u32_t len; - } r; - /** used for lwip_netconn_do_close (/shutdown) */ - struct { - u8_t shut; - } sd; -#if LWIP_IGMP || (LWIP_IPV6 && LWIP_IPV6_MLD) - /** used for lwip_netconn_do_join_leave_group */ - struct { - ipX_addr_t *multiaddr; - ipX_addr_t *netif_addr; - enum netconn_igmp join_or_leave; - } jl; -#endif /* LWIP_IGMP || (LWIP_IPV6 && LWIP_IPV6_MLD) */ -#if TCP_LISTEN_BACKLOG - struct { - u8_t backlog; - } lb; -#endif /* TCP_LISTEN_BACKLOG */ - } msg; -}; - -/** This struct contains a function to execute in another thread context and - a struct api_msg_msg that serves as an argument for this function. - This is passed to tcpip_apimsg to execute functions in tcpip_thread context. */ -struct api_msg { - /** function to execute in tcpip_thread context */ - void (* function)(struct api_msg_msg *msg); - /** arguments for this function */ - struct api_msg_msg msg; -}; - -#if LWIP_DNS -/** As lwip_netconn_do_gethostbyname requires more arguments but doesn't require a netconn, - it has its own struct (to avoid struct api_msg getting bigger than necessary). - lwip_netconn_do_gethostbyname must be called using tcpip_callback instead of tcpip_apimsg - (see netconn_gethostbyname). */ -struct dns_api_msg { - /** Hostname to query or dotted IP address string */ - const char *name; - /** Rhe resolved address is stored here */ - ip_addr_t *addr; - /** This semaphore is posted when the name is resolved, the application thread - should wait on it. */ - sys_sem_t *sem; - /** Errors are given back here */ - err_t *err; -}; -#endif /* LWIP_DNS */ - -void lwip_netconn_do_newconn ( struct api_msg_msg *msg); -void lwip_netconn_do_delconn ( struct api_msg_msg *msg); -void lwip_netconn_do_bind ( struct api_msg_msg *msg); -void lwip_netconn_do_connect ( struct api_msg_msg *msg); -void lwip_netconn_do_disconnect ( struct api_msg_msg *msg); -void lwip_netconn_do_listen ( struct api_msg_msg *msg); -void lwip_netconn_do_send ( struct api_msg_msg *msg); -void lwip_netconn_do_recv ( struct api_msg_msg *msg); -void lwip_netconn_do_write ( struct api_msg_msg *msg); -void lwip_netconn_do_getaddr ( struct api_msg_msg *msg); -void lwip_netconn_do_close ( struct api_msg_msg *msg); -void lwip_netconn_do_shutdown ( struct api_msg_msg *msg); -#if LWIP_IGMP || (LWIP_IPV6 && LWIP_IPV6_MLD) -void lwip_netconn_do_join_leave_group( struct api_msg_msg *msg); -#endif /* LWIP_IGMP || (LWIP_IPV6 && LWIP_IPV6_MLD) */ - -#if LWIP_DNS -void lwip_netconn_do_gethostbyname(void *arg); -#endif /* LWIP_DNS */ - -struct netconn* netconn_alloc(enum netconn_type t, netconn_callback callback); -void netconn_free(struct netconn *conn); - -#ifdef __cplusplus -} -#endif - -#endif /* LWIP_NETCONN */ - -#endif /* __LWIP_API_MSG_H__ */ diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/lwip/arch.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/lwip/arch.h deleted file mode 100644 index 5adae9ef..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/lwip/arch.h +++ /dev/null @@ -1,209 +0,0 @@ -/* - * Copyright (c) 2001-2004 Swedish Institute of Computer Science. - * 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. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT - * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING - * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY - * OF SUCH DAMAGE. - * - * This file is part of the lwIP TCP/IP stack. - * - * Author: Adam Dunkels - * - */ -#ifndef __LWIP_ARCH_H__ -#define __LWIP_ARCH_H__ - -#include "arch/cc.h" - -/** Temporary: define format string for size_t if not defined in cc.h */ -#ifndef SZT_F -#define SZT_F U32_F -#endif /* SZT_F */ -/** Temporary upgrade helper: define format string for u8_t as hex if not - defined in cc.h */ -#ifndef X8_F -#define X8_F "02x" -#endif /* X8_F */ - -#ifdef __cplusplus -extern "C" { -#endif - -#ifndef PACK_STRUCT_BEGIN -#define PACK_STRUCT_BEGIN -#endif /* PACK_STRUCT_BEGIN */ - -#ifndef PACK_STRUCT_END -#define PACK_STRUCT_END -#endif /* PACK_STRUCT_END */ - -#ifndef PACK_STRUCT_FIELD -#define PACK_STRUCT_FIELD(x) x -#endif /* PACK_STRUCT_FIELD */ - - -#ifndef LWIP_UNUSED_ARG -#define LWIP_UNUSED_ARG(x) (void)x -#endif /* LWIP_UNUSED_ARG */ - - -#ifdef LWIP_PROVIDE_ERRNO - -#define EPERM 1 /* Operation not permitted */ -#define ENOENT 2 /* No such file or directory */ -#define ESRCH 3 /* No such process */ -#define EINTR 4 /* Interrupted system call */ -#define EIO 5 /* I/O error */ -#define ENXIO 6 /* No such device or address */ -#define E2BIG 7 /* Arg list too long */ -#define ENOEXEC 8 /* Exec format error */ -#define EBADF 9 /* Bad file number */ -#define ECHILD 10 /* No child processes */ -#define EAGAIN 11 /* Try again */ -#define ENOMEM 12 /* Out of memory */ -#define EACCES 13 /* Permission denied */ -#define EFAULT 14 /* Bad address */ -#define ENOTBLK 15 /* Block device required */ -#define EBUSY 16 /* Device or resource busy */ -#define EEXIST 17 /* File exists */ -#define EXDEV 18 /* Cross-device link */ -#define ENODEV 19 /* No such device */ -#define ENOTDIR 20 /* Not a directory */ -#define EISDIR 21 /* Is a directory */ -#define EINVAL 22 /* Invalid argument */ -#define ENFILE 23 /* File table overflow */ -#define EMFILE 24 /* Too many open files */ -#define ENOTTY 25 /* Not a typewriter */ -#define ETXTBSY 26 /* Text file busy */ -#define EFBIG 27 /* File too large */ -#define ENOSPC 28 /* No space left on device */ -#define ESPIPE 29 /* Illegal seek */ -#define EROFS 30 /* Read-only file system */ -#define EMLINK 31 /* Too many links */ -#define EPIPE 32 /* Broken pipe */ -#define EDOM 33 /* Math argument out of domain of func */ -#define ERANGE 34 /* Math result not representable */ -#define EDEADLK 35 /* Resource deadlock would occur */ -#define ENAMETOOLONG 36 /* File name too long */ -#define ENOLCK 37 /* No record locks available */ -#define ENOSYS 38 /* Function not implemented */ -#define ENOTEMPTY 39 /* Directory not empty */ -#define ELOOP 40 /* Too many symbolic links encountered */ -#define EWOULDBLOCK EAGAIN /* Operation would block */ -#define ENOMSG 42 /* No message of desired type */ -#define EIDRM 43 /* Identifier removed */ -#define ECHRNG 44 /* Channel number out of range */ -#define EL2NSYNC 45 /* Level 2 not synchronized */ -#define EL3HLT 46 /* Level 3 halted */ -#define EL3RST 47 /* Level 3 reset */ -#define ELNRNG 48 /* Link number out of range */ -#define EUNATCH 49 /* Protocol driver not attached */ -#define ENOCSI 50 /* No CSI structure available */ -#define EL2HLT 51 /* Level 2 halted */ -#define EBADE 52 /* Invalid exchange */ -#define EBADR 53 /* Invalid request descriptor */ -#define EXFULL 54 /* Exchange full */ -#define ENOANO 55 /* No anode */ -#define EBADRQC 56 /* Invalid request code */ -#define EBADSLT 57 /* Invalid slot */ - -#define EDEADLOCK EDEADLK - -#define EBFONT 59 /* Bad font file format */ -#define ENOSTR 60 /* Device not a stream */ -#define ENODATA 61 /* No data available */ -#define ETIME 62 /* Timer expired */ -#define ENOSR 63 /* Out of streams resources */ -#define ENONET 64 /* Machine is not on the network */ -#define ENOPKG 65 /* Package not installed */ -#define EREMOTE 66 /* Object is remote */ -#define ENOLINK 67 /* Link has been severed */ -#define EADV 68 /* Advertise error */ -#define ESRMNT 69 /* Srmount error */ -#define ECOMM 70 /* Communication error on send */ -#define EPROTO 71 /* Protocol error */ -#define EMULTIHOP 72 /* Multihop attempted */ -#define EDOTDOT 73 /* RFS specific error */ -#define EBADMSG 74 /* Not a data message */ -#define EOVERFLOW 75 /* Value too large for defined data type */ -#define ENOTUNIQ 76 /* Name not unique on network */ -#define EBADFD 77 /* File descriptor in bad state */ -#define EREMCHG 78 /* Remote address changed */ -#define ELIBACC 79 /* Can not access a needed shared library */ -#define ELIBBAD 80 /* Accessing a corrupted shared library */ -#define ELIBSCN 81 /* .lib section in a.out corrupted */ -#define ELIBMAX 82 /* Attempting to link in too many shared libraries */ -#define ELIBEXEC 83 /* Cannot exec a shared library directly */ -#define EILSEQ 84 /* Illegal byte sequence */ -#define ERESTART 85 /* Interrupted system call should be restarted */ -#define ESTRPIPE 86 /* Streams pipe error */ -#define EUSERS 87 /* Too many users */ -#define ENOTSOCK 88 /* Socket operation on non-socket */ -#define EDESTADDRREQ 89 /* Destination address required */ -#define EMSGSIZE 90 /* Message too long */ -#define EPROTOTYPE 91 /* Protocol wrong type for socket */ -#define ENOPROTOOPT 92 /* Protocol not available */ -#define EPROTONOSUPPORT 93 /* Protocol not supported */ -#define ESOCKTNOSUPPORT 94 /* Socket type not supported */ -#define EOPNOTSUPP 95 /* Operation not supported on transport endpoint */ -#define EPFNOSUPPORT 96 /* Protocol family not supported */ -#define EAFNOSUPPORT 97 /* Address family not supported by protocol */ -#define EADDRINUSE 98 /* Address already in use */ -#define EADDRNOTAVAIL 99 /* Cannot assign requested address */ -#define ENETDOWN 100 /* Network is down */ -#define ENETUNREACH 101 /* Network is unreachable */ -#define ENETRESET 102 /* Network dropped connection because of reset */ -#define ECONNABORTED 103 /* Software caused connection abort */ -#define ECONNRESET 104 /* Connection reset by peer */ -#define ENOBUFS 105 /* No buffer space available */ -#define EISCONN 106 /* Transport endpoint is already connected */ -#define ENOTCONN 107 /* Transport endpoint is not connected */ -#define ESHUTDOWN 108 /* Cannot send after transport endpoint shutdown */ -#define ETOOMANYREFS 109 /* Too many references: cannot splice */ -#define ETIMEDOUT 110 /* Connection timed out */ -#define ECONNREFUSED 111 /* Connection refused */ -#define EHOSTDOWN 112 /* Host is down */ -#define EHOSTUNREACH 113 /* No route to host */ -#define EALREADY 114 /* Operation already in progress */ -#define EINPROGRESS 115 /* Operation now in progress */ -#define ESTALE 116 /* Stale NFS file handle */ -#define EUCLEAN 117 /* Structure needs cleaning */ -#define ENOTNAM 118 /* Not a XENIX named type file */ -#define ENAVAIL 119 /* No XENIX semaphores available */ -#define EISNAM 120 /* Is a named type file */ -#define EREMOTEIO 121 /* Remote I/O error */ -#define EDQUOT 122 /* Quota exceeded */ - -#define ENOMEDIUM 123 /* No medium found */ -#define EMEDIUMTYPE 124 /* Wrong medium type */ - -#ifndef errno -extern int errno; -#endif - -#endif /* LWIP_PROVIDE_ERRNO */ - -#ifdef __cplusplus -} -#endif - -#endif /* __LWIP_ARCH_H__ */ diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/lwip/debug.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/lwip/debug.h deleted file mode 100644 index 0fe04139..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/lwip/debug.h +++ /dev/null @@ -1,99 +0,0 @@ -/* - * Copyright (c) 2001-2004 Swedish Institute of Computer Science. - * 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. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT - * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING - * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY - * OF SUCH DAMAGE. - * - * This file is part of the lwIP TCP/IP stack. - * - * Author: Adam Dunkels - * - */ -#ifndef __LWIP_DEBUG_H__ -#define __LWIP_DEBUG_H__ - -#include "lwip/arch.h" -#include "lwip/opt.h" - -/** lower two bits indicate debug level - * - 0 all - * - 1 warning - * - 2 serious - * - 3 severe - */ -#define LWIP_DBG_LEVEL_ALL 0x00 -#define LWIP_DBG_LEVEL_OFF LWIP_DBG_LEVEL_ALL /* compatibility define only */ -#define LWIP_DBG_LEVEL_WARNING 0x01 /* bad checksums, dropped packets, ... */ -#define LWIP_DBG_LEVEL_SERIOUS 0x02 /* memory allocation failures, ... */ -#define LWIP_DBG_LEVEL_SEVERE 0x03 -#define LWIP_DBG_MASK_LEVEL 0x03 - -/** flag for LWIP_DEBUGF to enable that debug message */ -#define LWIP_DBG_ON 0x80U -/** flag for LWIP_DEBUGF to disable that debug message */ -#define LWIP_DBG_OFF 0x00U - -/** flag for LWIP_DEBUGF indicating a tracing message (to follow program flow) */ -#define LWIP_DBG_TRACE 0x40U -/** flag for LWIP_DEBUGF indicating a state debug message (to follow module states) */ -#define LWIP_DBG_STATE 0x20U -/** flag for LWIP_DEBUGF indicating newly added code, not thoroughly tested yet */ -#define LWIP_DBG_FRESH 0x10U -/** flag for LWIP_DEBUGF to halt after printing this debug message */ -#define LWIP_DBG_HALT 0x08U - -#ifndef LWIP_NOASSERT -#define LWIP_ASSERT(message, assertion) do { if(!(assertion)) \ - LWIP_PLATFORM_ASSERT(message); } while(0) -#else /* LWIP_NOASSERT */ -#define LWIP_ASSERT(message, assertion) -#endif /* LWIP_NOASSERT */ - -/** if "expression" isn't true, then print "message" and execute "handler" expression */ -#ifndef LWIP_ERROR -#define LWIP_ERROR(message, expression, handler) do { if (!(expression)) { \ - LWIP_PLATFORM_ASSERT(message); handler;}} while(0) -#endif /* LWIP_ERROR */ - -#ifdef LWIP_DEBUG -/** print debug message only if debug message type is enabled... - * AND is of correct type AND is at least LWIP_DBG_LEVEL - */ -#define LWIP_DEBUGF(debug, message) do { \ - if ( \ - ((debug) & LWIP_DBG_ON) && \ - ((debug) & LWIP_DBG_TYPES_ON) && \ - ((s16_t)((debug) & LWIP_DBG_MASK_LEVEL) >= LWIP_DBG_MIN_LEVEL)) { \ - LWIP_PLATFORM_DIAG(message); \ - if ((debug) & LWIP_DBG_HALT) { \ - while(1); \ - } \ - } \ - } while(0) - -#else /* LWIP_DEBUG */ -#define LWIP_DEBUGF(debug, message) -#endif /* LWIP_DEBUG */ - -#endif /* __LWIP_DEBUG_H__ */ - diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/lwip/def.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/lwip/def.h deleted file mode 100644 index 73a1b560..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/lwip/def.h +++ /dev/null @@ -1,123 +0,0 @@ -/* - * Copyright (c) 2001-2004 Swedish Institute of Computer Science. - * 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. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT - * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING - * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY - * OF SUCH DAMAGE. - * - * This file is part of the lwIP TCP/IP stack. - * - * Author: Adam Dunkels - * - */ -#ifndef __LWIP_DEF_H__ -#define __LWIP_DEF_H__ - -/* arch.h might define NULL already */ -#include "lwip/arch.h" -#include "lwip/opt.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#define LWIP_MAX(x , y) (((x) > (y)) ? (x) : (y)) -#define LWIP_MIN(x , y) (((x) < (y)) ? (x) : (y)) - -#ifndef NULL -#define NULL ((void *)0) -#endif - -/* Endianess-optimized shifting of two u8_t to create one u16_t */ -#if BYTE_ORDER == LITTLE_ENDIAN -#define LWIP_MAKE_U16(a, b) ((a << 8) | b) -#else -#define LWIP_MAKE_U16(a, b) ((b << 8) | a) -#endif - -#ifndef LWIP_PLATFORM_BYTESWAP -#define LWIP_PLATFORM_BYTESWAP 0 -#endif - -#ifndef LWIP_PREFIX_BYTEORDER_FUNCS -/* workaround for naming collisions on some platforms */ - -#ifdef htons -#undef htons -#endif /* htons */ -#ifdef htonl -#undef htonl -#endif /* htonl */ -#ifdef ntohs -#undef ntohs -#endif /* ntohs */ -#ifdef ntohl -#undef ntohl -#endif /* ntohl */ - -#define htons(x) lwip_htons(x) -#define ntohs(x) lwip_ntohs(x) -#define htonl(x) lwip_htonl(x) -#define ntohl(x) lwip_ntohl(x) -#endif /* LWIP_PREFIX_BYTEORDER_FUNCS */ - -#if BYTE_ORDER == BIG_ENDIAN -#define lwip_htons(x) (x) -#define lwip_ntohs(x) (x) -#define lwip_htonl(x) (x) -#define lwip_ntohl(x) (x) -#define PP_HTONS(x) (x) -#define PP_NTOHS(x) (x) -#define PP_HTONL(x) (x) -#define PP_NTOHL(x) (x) -#else /* BYTE_ORDER != BIG_ENDIAN */ -#if LWIP_PLATFORM_BYTESWAP -#define lwip_htons(x) LWIP_PLATFORM_HTONS(x) -#define lwip_ntohs(x) LWIP_PLATFORM_HTONS(x) -#define lwip_htonl(x) LWIP_PLATFORM_HTONL(x) -#define lwip_ntohl(x) LWIP_PLATFORM_HTONL(x) -#else /* LWIP_PLATFORM_BYTESWAP */ -u16_t lwip_htons(u16_t x); -u16_t lwip_ntohs(u16_t x); -u32_t lwip_htonl(u32_t x); -u32_t lwip_ntohl(u32_t x); -#endif /* LWIP_PLATFORM_BYTESWAP */ - -/* These macros should be calculated by the preprocessor and are used - with compile-time constants only (so that there is no little-endian - overhead at runtime). */ -#define PP_HTONS(x) ((((x) & 0xff) << 8) | (((x) & 0xff00) >> 8)) -#define PP_NTOHS(x) PP_HTONS(x) -#define PP_HTONL(x) ((((x) & 0xff) << 24) | \ - (((x) & 0xff00) << 8) | \ - (((x) & 0xff0000UL) >> 8) | \ - (((x) & 0xff000000UL) >> 24)) -#define PP_NTOHL(x) PP_HTONL(x) - -#endif /* BYTE_ORDER == BIG_ENDIAN */ - -#ifdef __cplusplus -} -#endif - -#endif /* __LWIP_DEF_H__ */ - diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/lwip/dhcp.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/lwip/dhcp.h deleted file mode 100644 index 32d93381..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/lwip/dhcp.h +++ /dev/null @@ -1,242 +0,0 @@ -/** @file - */ - -#ifndef __LWIP_DHCP_H__ -#define __LWIP_DHCP_H__ - -#include "lwip/opt.h" - -#if LWIP_DHCP /* don't build if not configured for use in lwipopts.h */ - -#include "lwip/netif.h" -#include "lwip/udp.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/** period (in seconds) of the application calling dhcp_coarse_tmr() */ -#define DHCP_COARSE_TIMER_SECS 60 -/** period (in milliseconds) of the application calling dhcp_coarse_tmr() */ -#define DHCP_COARSE_TIMER_MSECS (DHCP_COARSE_TIMER_SECS * 1000UL) -/** period (in milliseconds) of the application calling dhcp_fine_tmr() */ -#define DHCP_FINE_TIMER_MSECS 500 - -#define DHCP_CHADDR_LEN 16U -#define DHCP_SNAME_LEN 64U -#define DHCP_FILE_LEN 128U - -struct dhcp -{ - /** transaction identifier of last sent request */ - u32_t xid; - /** our connection to the DHCP server */ - struct udp_pcb *pcb; - /** incoming msg */ - struct dhcp_msg *msg_in; - /** current DHCP state machine state */ - u8_t state; - /** retries of current request */ - u8_t tries; -#if LWIP_DHCP_AUTOIP_COOP - u8_t autoip_coop_state; -#endif - u8_t subnet_mask_given; - - struct pbuf *p_out; /* pbuf of outcoming msg */ - struct dhcp_msg *msg_out; /* outgoing msg */ - u16_t options_out_len; /* outgoing msg options length */ - u16_t request_timeout; /* #ticks with period DHCP_FINE_TIMER_SECS for request timeout */ - u16_t t1_timeout; /* #ticks with period DHCP_COARSE_TIMER_SECS for renewal time */ - u16_t t2_timeout; /* #ticks with period DHCP_COARSE_TIMER_SECS for rebind time */ - ip_addr_t server_ip_addr; /* dhcp server address that offered this lease */ - ip_addr_t offered_ip_addr; - ip_addr_t offered_sn_mask; - ip_addr_t offered_gw_addr; - - u32_t offered_t0_lease; /* lease period (in seconds) */ - u32_t offered_t1_renew; /* recommended renew time (usually 50% of lease period) */ - u32_t offered_t2_rebind; /* recommended rebind time (usually 66% of lease period) */ - /* @todo: LWIP_DHCP_BOOTP_FILE configuration option? - integrate with possible TFTP-client for booting? */ -#if LWIP_DHCP_BOOTP_FILE - ip_addr_t offered_si_addr; - char boot_file_name[DHCP_FILE_LEN]; -#endif /* LWIP_DHCP_BOOTPFILE */ -}; - -/* MUST be compiled with "pack structs" or equivalent! */ -#ifdef PACK_STRUCT_USE_INCLUDES -# include "arch/bpstruct.h" -#endif -PACK_STRUCT_BEGIN -/** minimum set of fields of any DHCP message */ -struct dhcp_msg -{ - PACK_STRUCT_FIELD(u8_t op); - PACK_STRUCT_FIELD(u8_t htype); - PACK_STRUCT_FIELD(u8_t hlen); - PACK_STRUCT_FIELD(u8_t hops); - PACK_STRUCT_FIELD(u32_t xid); - PACK_STRUCT_FIELD(u16_t secs); - PACK_STRUCT_FIELD(u16_t flags); - PACK_STRUCT_FIELD(ip_addr_p_t ciaddr); - PACK_STRUCT_FIELD(ip_addr_p_t yiaddr); - PACK_STRUCT_FIELD(ip_addr_p_t siaddr); - PACK_STRUCT_FIELD(ip_addr_p_t giaddr); - PACK_STRUCT_FIELD(u8_t chaddr[DHCP_CHADDR_LEN]); - PACK_STRUCT_FIELD(u8_t sname[DHCP_SNAME_LEN]); - PACK_STRUCT_FIELD(u8_t file[DHCP_FILE_LEN]); - PACK_STRUCT_FIELD(u32_t cookie); -#define DHCP_MIN_OPTIONS_LEN 68U -/** make sure user does not configure this too small */ -#if ((defined(DHCP_OPTIONS_LEN)) && (DHCP_OPTIONS_LEN < DHCP_MIN_OPTIONS_LEN)) -# undef DHCP_OPTIONS_LEN -#endif -/** allow this to be configured in lwipopts.h, but not too small */ -#if (!defined(DHCP_OPTIONS_LEN)) -/** set this to be sufficient for your options in outgoing DHCP msgs */ -# define DHCP_OPTIONS_LEN DHCP_MIN_OPTIONS_LEN -#endif - PACK_STRUCT_FIELD(u8_t options[DHCP_OPTIONS_LEN]); -} PACK_STRUCT_STRUCT; -PACK_STRUCT_END -#ifdef PACK_STRUCT_USE_INCLUDES -# include "arch/epstruct.h" -#endif - -void dhcp_set_struct(struct netif *netif, struct dhcp *dhcp); -/** Remove a struct dhcp previously set to the netif using dhcp_set_struct() */ -#define dhcp_remove_struct(netif) do { (netif)->dhcp = NULL; } while(0) -void dhcp_cleanup(struct netif *netif); -/** start DHCP configuration */ -err_t dhcp_start(struct netif *netif); -/** enforce early lease renewal (not needed normally)*/ -err_t dhcp_renew(struct netif *netif); -/** release the DHCP lease, usually called before dhcp_stop()*/ -err_t dhcp_release(struct netif *netif); -/** stop DHCP configuration */ -void dhcp_stop(struct netif *netif); -/** inform server of our manual IP address */ -void dhcp_inform(struct netif *netif); -/** Handle a possible change in the network configuration */ -void dhcp_network_changed(struct netif *netif); - -/** if enabled, check whether the offered IP address is not in use, using ARP */ -#if DHCP_DOES_ARP_CHECK -void dhcp_arp_reply(struct netif *netif, ip_addr_t *addr); -#endif - -/** to be called every minute */ -void dhcp_coarse_tmr(void); -/** to be called every half second */ -void dhcp_fine_tmr(void); - -/** DHCP message item offsets and length */ -#define DHCP_OP_OFS 0 -#define DHCP_HTYPE_OFS 1 -#define DHCP_HLEN_OFS 2 -#define DHCP_HOPS_OFS 3 -#define DHCP_XID_OFS 4 -#define DHCP_SECS_OFS 8 -#define DHCP_FLAGS_OFS 10 -#define DHCP_CIADDR_OFS 12 -#define DHCP_YIADDR_OFS 16 -#define DHCP_SIADDR_OFS 20 -#define DHCP_GIADDR_OFS 24 -#define DHCP_CHADDR_OFS 28 -#define DHCP_SNAME_OFS 44 -#define DHCP_FILE_OFS 108 -#define DHCP_MSG_LEN 236 - -#define DHCP_COOKIE_OFS DHCP_MSG_LEN -#define DHCP_OPTIONS_OFS (DHCP_MSG_LEN + 4) - -#define DHCP_CLIENT_PORT 68 -#define DHCP_SERVER_PORT 67 - -/** DHCP client states */ -#define DHCP_OFF 0 -#define DHCP_REQUESTING 1 -#define DHCP_INIT 2 -#define DHCP_REBOOTING 3 -#define DHCP_REBINDING 4 -#define DHCP_RENEWING 5 -#define DHCP_SELECTING 6 -#define DHCP_INFORMING 7 -#define DHCP_CHECKING 8 -#define DHCP_PERMANENT 9 -#define DHCP_BOUND 10 -/** not yet implemented #define DHCP_RELEASING 11 */ -#define DHCP_BACKING_OFF 12 - -/** AUTOIP cooperatation flags */ -#define DHCP_AUTOIP_COOP_STATE_OFF 0 -#define DHCP_AUTOIP_COOP_STATE_ON 1 - -#define DHCP_BOOTREQUEST 1 -#define DHCP_BOOTREPLY 2 - -/** DHCP message types */ -#define DHCP_DISCOVER 1 -#define DHCP_OFFER 2 -#define DHCP_REQUEST 3 -#define DHCP_DECLINE 4 -#define DHCP_ACK 5 -#define DHCP_NAK 6 -#define DHCP_RELEASE 7 -#define DHCP_INFORM 8 - -/** DHCP hardware type, currently only ethernet is supported */ -#define DHCP_HTYPE_ETH 1 - -#define DHCP_MAGIC_COOKIE 0x63825363UL - -/* This is a list of options for BOOTP and DHCP, see RFC 2132 for descriptions */ - -/** BootP options */ -#define DHCP_OPTION_PAD 0 -#define DHCP_OPTION_SUBNET_MASK 1 /* RFC 2132 3.3 */ -#define DHCP_OPTION_ROUTER 3 -#define DHCP_OPTION_DNS_SERVER 6 -#define DHCP_OPTION_HOSTNAME 12 -#define DHCP_OPTION_IP_TTL 23 -#define DHCP_OPTION_MTU 26 -#define DHCP_OPTION_BROADCAST 28 -#define DHCP_OPTION_TCP_TTL 37 -#define DHCP_OPTION_END 255 - -/** DHCP options */ -#define DHCP_OPTION_REQUESTED_IP 50 /* RFC 2132 9.1, requested IP address */ -#define DHCP_OPTION_LEASE_TIME 51 /* RFC 2132 9.2, time in seconds, in 4 bytes */ -#define DHCP_OPTION_OVERLOAD 52 /* RFC2132 9.3, use file and/or sname field for options */ - -#define DHCP_OPTION_MESSAGE_TYPE 53 /* RFC 2132 9.6, important for DHCP */ -#define DHCP_OPTION_MESSAGE_TYPE_LEN 1 - -#define DHCP_OPTION_SERVER_ID 54 /* RFC 2132 9.7, server IP address */ -#define DHCP_OPTION_PARAMETER_REQUEST_LIST 55 /* RFC 2132 9.8, requested option types */ - -#define DHCP_OPTION_MAX_MSG_SIZE 57 /* RFC 2132 9.10, message size accepted >= 576 */ -#define DHCP_OPTION_MAX_MSG_SIZE_LEN 2 - -#define DHCP_OPTION_T1 58 /* T1 renewal time */ -#define DHCP_OPTION_T2 59 /* T2 rebinding time */ -#define DHCP_OPTION_US 60 -#define DHCP_OPTION_CLIENT_ID 61 -#define DHCP_OPTION_TFTP_SERVERNAME 66 -#define DHCP_OPTION_BOOTFILE 67 - -/** possible combinations of overloading the file and sname fields with options */ -#define DHCP_OVERLOAD_NONE 0 -#define DHCP_OVERLOAD_FILE 1 -#define DHCP_OVERLOAD_SNAME 2 -#define DHCP_OVERLOAD_SNAME_FILE 3 - -#ifdef __cplusplus -} -#endif - -#endif /* LWIP_DHCP */ - -#endif /*__LWIP_DHCP_H__*/ diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/lwip/dns.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/lwip/dns.h deleted file mode 100644 index 6c7d9b07..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/lwip/dns.h +++ /dev/null @@ -1,124 +0,0 @@ -/** - * lwip DNS resolver header file. - - * Author: Jim Pettinato - * April 2007 - - * ported from uIP resolv.c Copyright (c) 2002-2003, Adam Dunkels. - * - * 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. The name of the author may not be used to endorse or promote - * products derived from this software without specific prior - * written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS - * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE - * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef __LWIP_DNS_H__ -#define __LWIP_DNS_H__ - -#include "lwip/opt.h" - -#if LWIP_DNS /* don't build if not configured for use in lwipopts.h */ - -#ifdef __cplusplus -extern "C" { -#endif - -/** DNS timer period */ -#define DNS_TMR_INTERVAL 1000 - -/** DNS field TYPE used for "Resource Records" */ -#define DNS_RRTYPE_A 1 /* a host address */ -#define DNS_RRTYPE_NS 2 /* an authoritative name server */ -#define DNS_RRTYPE_MD 3 /* a mail destination (Obsolete - use MX) */ -#define DNS_RRTYPE_MF 4 /* a mail forwarder (Obsolete - use MX) */ -#define DNS_RRTYPE_CNAME 5 /* the canonical name for an alias */ -#define DNS_RRTYPE_SOA 6 /* marks the start of a zone of authority */ -#define DNS_RRTYPE_MB 7 /* a mailbox domain name (EXPERIMENTAL) */ -#define DNS_RRTYPE_MG 8 /* a mail group member (EXPERIMENTAL) */ -#define DNS_RRTYPE_MR 9 /* a mail rename domain name (EXPERIMENTAL) */ -#define DNS_RRTYPE_NULL 10 /* a null RR (EXPERIMENTAL) */ -#define DNS_RRTYPE_WKS 11 /* a well known service description */ -#define DNS_RRTYPE_PTR 12 /* a domain name pointer */ -#define DNS_RRTYPE_HINFO 13 /* host information */ -#define DNS_RRTYPE_MINFO 14 /* mailbox or mail list information */ -#define DNS_RRTYPE_MX 15 /* mail exchange */ -#define DNS_RRTYPE_TXT 16 /* text strings */ - -/** DNS field CLASS used for "Resource Records" */ -#define DNS_RRCLASS_IN 1 /* the Internet */ -#define DNS_RRCLASS_CS 2 /* the CSNET class (Obsolete - used only for examples in some obsolete RFCs) */ -#define DNS_RRCLASS_CH 3 /* the CHAOS class */ -#define DNS_RRCLASS_HS 4 /* Hesiod [Dyer 87] */ -#define DNS_RRCLASS_FLUSH 0x800 /* Flush bit */ - -/* The size used for the next line is rather a hack, but it prevents including socket.h in all files - that include memp.h, and that would possibly break portability (since socket.h defines some types - and constants possibly already define by the OS). - Calculation rule: - sizeof(struct addrinfo) + sizeof(struct sockaddr_in) + DNS_MAX_NAME_LENGTH + 1 byte zero-termination */ -#define NETDB_ELEM_SIZE (32 + 16 + DNS_MAX_NAME_LENGTH + 1) - -#if DNS_LOCAL_HOSTLIST -/** struct used for local host-list */ -struct local_hostlist_entry { - /** static hostname */ - const char *name; - /** static host address in network byteorder */ - ip_addr_t addr; - struct local_hostlist_entry *next; -}; -#if DNS_LOCAL_HOSTLIST_IS_DYNAMIC -#ifndef DNS_LOCAL_HOSTLIST_MAX_NAMELEN -#define DNS_LOCAL_HOSTLIST_MAX_NAMELEN DNS_MAX_NAME_LENGTH -#endif -#define LOCALHOSTLIST_ELEM_SIZE ((sizeof(struct local_hostlist_entry) + DNS_LOCAL_HOSTLIST_MAX_NAMELEN + 1)) -#endif /* DNS_LOCAL_HOSTLIST_IS_DYNAMIC */ -#endif /* DNS_LOCAL_HOSTLIST */ - -/** Callback which is invoked when a hostname is found. - * A function of this type must be implemented by the application using the DNS resolver. - * @param name pointer to the name that was looked up. - * @param ipaddr pointer to an ip_addr_t containing the IP address of the hostname, - * or NULL if the name could not be found (or on any other error). - * @param callback_arg a user-specified callback argument passed to dns_gethostbyname -*/ -typedef void (*dns_found_callback)(const char *name, ip_addr_t *ipaddr, void *callback_arg); - -void dns_init(void); -void dns_tmr(void); -void dns_setserver(u8_t numdns, ip_addr_t *dnsserver); -ip_addr_t dns_getserver(u8_t numdns); -err_t dns_gethostbyname(const char *hostname, ip_addr_t *addr, - dns_found_callback found, void *callback_arg); - -#if DNS_LOCAL_HOSTLIST && DNS_LOCAL_HOSTLIST_IS_DYNAMIC -int dns_local_removehost(const char *hostname, const ip_addr_t *addr); -err_t dns_local_addhost(const char *hostname, const ip_addr_t *addr); -#endif /* DNS_LOCAL_HOSTLIST && DNS_LOCAL_HOSTLIST_IS_DYNAMIC */ - -#ifdef __cplusplus -} -#endif - -#endif /* LWIP_DNS */ - -#endif /* __LWIP_DNS_H__ */ diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/lwip/err.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/lwip/err.h deleted file mode 100644 index ac907729..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/lwip/err.h +++ /dev/null @@ -1,85 +0,0 @@ -/* - * Copyright (c) 2001-2004 Swedish Institute of Computer Science. - * 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. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT - * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING - * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY - * OF SUCH DAMAGE. - * - * This file is part of the lwIP TCP/IP stack. - * - * Author: Adam Dunkels - * - */ -#ifndef __LWIP_ERR_H__ -#define __LWIP_ERR_H__ - -#include "lwip/opt.h" -#include "lwip/arch.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/** Define LWIP_ERR_T in cc.h if you want to use - * a different type for your platform (must be signed). */ -#ifdef LWIP_ERR_T -typedef LWIP_ERR_T err_t; -#else /* LWIP_ERR_T */ -typedef s8_t err_t; -#endif /* LWIP_ERR_T*/ - -/* Definitions for error constants. */ - -#define ERR_OK 0 /* No error, everything OK. */ -#define ERR_MEM -1 /* Out of memory error. */ -#define ERR_BUF -2 /* Buffer error. */ -#define ERR_TIMEOUT -3 /* Timeout. */ -#define ERR_RTE -4 /* Routing problem. */ -#define ERR_INPROGRESS -5 /* Operation in progress */ -#define ERR_VAL -6 /* Illegal value. */ -#define ERR_WOULDBLOCK -7 /* Operation would block. */ -#define ERR_USE -8 /* Address in use. */ -#define ERR_ISCONN -9 /* Already connected. */ - -#define ERR_IS_FATAL(e) ((e) < ERR_ISCONN) - -#define ERR_ABRT -10 /* Connection aborted. */ -#define ERR_RST -11 /* Connection reset. */ -#define ERR_CLSD -12 /* Connection closed. */ -#define ERR_CONN -13 /* Not connected. */ - -#define ERR_ARG -14 /* Illegal argument. */ - -#define ERR_IF -15 /* Low-level netif error */ - - -#ifdef LWIP_DEBUG -extern const char *lwip_strerr(err_t err); -#else -#define lwip_strerr(x) "" -#endif /* LWIP_DEBUG */ - -#ifdef __cplusplus -} -#endif - -#endif /* __LWIP_ERR_H__ */ diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/lwip/inet_chksum.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/lwip/inet_chksum.h deleted file mode 100644 index e1687888..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/lwip/inet_chksum.h +++ /dev/null @@ -1,112 +0,0 @@ -/* - * Copyright (c) 2001-2004 Swedish Institute of Computer Science. - * 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. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT - * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING - * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY - * OF SUCH DAMAGE. - * - * This file is part of the lwIP TCP/IP stack. - * - * Author: Adam Dunkels - * - */ -#ifndef __LWIP_INET_CHKSUM_H__ -#define __LWIP_INET_CHKSUM_H__ - -#include "lwip/opt.h" - -#include "lwip/pbuf.h" -#include "lwip/ip_addr.h" - -/** Swap the bytes in an u16_t: much like htons() for little-endian */ -#ifndef SWAP_BYTES_IN_WORD -#if LWIP_PLATFORM_BYTESWAP && (BYTE_ORDER == LITTLE_ENDIAN) -/* little endian and PLATFORM_BYTESWAP defined */ -#define SWAP_BYTES_IN_WORD(w) LWIP_PLATFORM_HTONS(w) -#else /* LWIP_PLATFORM_BYTESWAP && (BYTE_ORDER == LITTLE_ENDIAN) */ -/* can't use htons on big endian (or PLATFORM_BYTESWAP not defined)... */ -#define SWAP_BYTES_IN_WORD(w) (((w) & 0xff) << 8) | (((w) & 0xff00) >> 8) -#endif /* LWIP_PLATFORM_BYTESWAP && (BYTE_ORDER == LITTLE_ENDIAN)*/ -#endif /* SWAP_BYTES_IN_WORD */ - -/** Split an u32_t in two u16_ts and add them up */ -#ifndef FOLD_U32T -#define FOLD_U32T(u) (((u) >> 16) + ((u) & 0x0000ffffUL)) -#endif - -#if LWIP_CHECKSUM_ON_COPY -/** Function-like macro: same as MEMCPY but returns the checksum of copied data - as u16_t */ -#ifndef LWIP_CHKSUM_COPY -#define LWIP_CHKSUM_COPY(dst, src, len) lwip_chksum_copy(dst, src, len) -#ifndef LWIP_CHKSUM_COPY_ALGORITHM -#define LWIP_CHKSUM_COPY_ALGORITHM 1 -#endif /* LWIP_CHKSUM_COPY_ALGORITHM */ -#endif /* LWIP_CHKSUM_COPY */ -#else /* LWIP_CHECKSUM_ON_COPY */ -#define LWIP_CHKSUM_COPY_ALGORITHM 0 -#endif /* LWIP_CHECKSUM_ON_COPY */ - -#ifdef __cplusplus -extern "C" { -#endif - -u16_t inet_chksum(void *dataptr, u16_t len); -u16_t inet_chksum_pbuf(struct pbuf *p); -u16_t inet_chksum_pseudo(struct pbuf *p, u8_t proto, u16_t proto_len, - ip_addr_t *src, ip_addr_t *dest); -u16_t inet_chksum_pseudo_partial(struct pbuf *p, u8_t proto, - u16_t proto_len, u16_t chksum_len, ip_addr_t *src, ip_addr_t *dest); -#if LWIP_CHKSUM_COPY_ALGORITHM -u16_t lwip_chksum_copy(void *dst, const void *src, u16_t len); -#endif /* LWIP_CHKSUM_COPY_ALGORITHM */ - -#if LWIP_IPV6 -u16_t ip6_chksum_pseudo(struct pbuf *p, u8_t proto, u16_t proto_len, - ip6_addr_t *src, ip6_addr_t *dest); -u16_t ip6_chksum_pseudo_partial(struct pbuf *p, u8_t proto, u16_t proto_len, - u16_t chksum_len, ip6_addr_t *src, ip6_addr_t *dest); - -#define ipX_chksum_pseudo(isipv6, p, proto, proto_len, src, dest) \ - ((isipv6) ? \ - ip6_chksum_pseudo(p, proto, proto_len, ipX_2_ip6(src), ipX_2_ip6(dest)) :\ - inet_chksum_pseudo(p, proto, proto_len, ipX_2_ip(src), ipX_2_ip(dest))) -#define ipX_chksum_pseudo_partial(isipv6, p, proto, proto_len, chksum_len, src, dest) \ - ((isipv6) ? \ - ip6_chksum_pseudo_partial(p, proto, proto_len, chksum_len, ipX_2_ip6(src), ipX_2_ip6(dest)) :\ - inet_chksum_pseudo_partial(p, proto, proto_len, chksum_len, ipX_2_ip(src), ipX_2_ip(dest))) - -#else /* LWIP_IPV6 */ - -#define ipX_chksum_pseudo(isipv6, p, proto, proto_len, src, dest) \ - inet_chksum_pseudo(p, proto, proto_len, src, dest) -#define ipX_chksum_pseudo_partial(isipv6, p, proto, proto_len, chksum_len, src, dest) \ - inet_chksum_pseudo_partial(p, proto, proto_len, chksum_len, src, dest) - -#endif /* LWIP_IPV6 */ - -#ifdef __cplusplus -} -#endif - -#endif /* __LWIP_INET_H__ */ - diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/lwip/init.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/lwip/init.h deleted file mode 100644 index 4e2e2856..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/lwip/init.h +++ /dev/null @@ -1,72 +0,0 @@ -/* - * Copyright (c) 2001-2004 Swedish Institute of Computer Science. - * 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. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT - * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING - * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY - * OF SUCH DAMAGE. - * - * This file is part of the lwIP TCP/IP stack. - * - * Author: Adam Dunkels - * - */ -#ifndef __LWIP_INIT_H__ -#define __LWIP_INIT_H__ - -#include "lwip/opt.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/** X.x.x: Major version of the stack */ -#define LWIP_VERSION_MAJOR 1U -/** x.X.x: Minor version of the stack */ -#define LWIP_VERSION_MINOR 4U -/** x.x.X: Revision of the stack */ -#define LWIP_VERSION_REVISION 1U -/** For release candidates, this is set to 1..254 - * For official releases, this is set to 255 (LWIP_RC_RELEASE) - * For development versions (CVS), this is set to 0 (LWIP_RC_DEVELOPMENT) */ -#define LWIP_VERSION_RC 0U - -/** LWIP_VERSION_RC is set to LWIP_RC_RELEASE for official releases */ -#define LWIP_RC_RELEASE 255U -/** LWIP_VERSION_RC is set to LWIP_RC_DEVELOPMENT for CVS versions */ -#define LWIP_RC_DEVELOPMENT 0U - -#define LWIP_VERSION_IS_RELEASE (LWIP_VERSION_RC == LWIP_RC_RELEASE) -#define LWIP_VERSION_IS_DEVELOPMENT (LWIP_VERSION_RC == LWIP_RC_DEVELOPMENT) -#define LWIP_VERSION_IS_RC ((LWIP_VERSION_RC != LWIP_RC_RELEASE) && (LWIP_VERSION_RC != LWIP_RC_DEVELOPMENT)) - -/** Provides the version of the stack */ -#define LWIP_VERSION (LWIP_VERSION_MAJOR << 24 | LWIP_VERSION_MINOR << 16 | \ - LWIP_VERSION_REVISION << 8 | LWIP_VERSION_RC) - -/* Modules initialization */ -void lwip_init(void); - -#ifdef __cplusplus -} -#endif - -#endif /* __LWIP_INIT_H__ */ diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/lwip/ip.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/lwip/ip.h deleted file mode 100644 index a0cd1d4d..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/lwip/ip.h +++ /dev/null @@ -1,254 +0,0 @@ -/* - * Copyright (c) 2001-2004 Swedish Institute of Computer Science. - * 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. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT - * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING - * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY - * OF SUCH DAMAGE. - * - * This file is part of the lwIP TCP/IP stack. - * - * Author: Adam Dunkels - * - */ -#ifndef __LWIP_IP_H__ -#define __LWIP_IP_H__ - -#include "lwip/opt.h" - -#include "lwip/def.h" -#include "lwip/pbuf.h" -#include "lwip/ip_addr.h" -#include "lwip/err.h" -#include "lwip/netif.h" -#include "lwip/ip4.h" -#include "lwip/ip6.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/* This is passed as the destination address to ip_output_if (not - to ip_output), meaning that an IP header already is constructed - in the pbuf. This is used when TCP retransmits. */ -#ifdef IP_HDRINCL -#undef IP_HDRINCL -#endif /* IP_HDRINCL */ -#define IP_HDRINCL NULL - -#if LWIP_NETIF_HWADDRHINT -#define IP_PCB_ADDRHINT ;u8_t addr_hint -#else -#define IP_PCB_ADDRHINT -#endif /* LWIP_NETIF_HWADDRHINT */ - -#if LWIP_IPV6 -#define IP_PCB_ISIPV6_MEMBER u8_t isipv6; -#define IP_PCB_IPVER_EQ(pcb1, pcb2) ((pcb1)->isipv6 == (pcb2)->isipv6) -#define IP_PCB_IPVER_INPUT_MATCH(pcb) (ip_current_is_v6() ? \ - ((pcb)->isipv6 != 0) : \ - ((pcb)->isipv6 == 0)) -#define PCB_ISIPV6(pcb) ((pcb)->isipv6) -#else -#define IP_PCB_ISIPV6_MEMBER -#define IP_PCB_IPVER_EQ(pcb1, pcb2) 1 -#define IP_PCB_IPVER_INPUT_MATCH(pcb) 1 -#define PCB_ISIPV6(pcb) 0 -#endif /* LWIP_IPV6 */ - -/* This is the common part of all PCB types. It needs to be at the - beginning of a PCB type definition. It is located here so that - changes to this common part are made in one location instead of - having to change all PCB structs. */ -#define IP_PCB \ - IP_PCB_ISIPV6_MEMBER \ - /* ip addresses in network byte order */ \ - ipX_addr_t local_ip; \ - ipX_addr_t remote_ip; \ - /* Socket options */ \ - u8_t so_options; \ - /* Type Of Service */ \ - u8_t tos; \ - /* Time To Live */ \ - u8_t ttl \ - /* link layer address resolution hint */ \ - IP_PCB_ADDRHINT - -struct ip_pcb { -/* Common members of all PCB types */ - IP_PCB; -}; - -/* - * Option flags per-socket. These are the same like SO_XXX. - */ -/*#define SOF_DEBUG 0x01U Unimplemented: turn on debugging info recording */ -#define SOF_ACCEPTCONN 0x02U /* socket has had listen() */ -#define SOF_REUSEADDR 0x04U /* allow local address reuse */ -#define SOF_KEEPALIVE 0x08U /* keep connections alive */ -/*#define SOF_DONTROUTE 0x10U Unimplemented: just use interface addresses */ -#define SOF_BROADCAST 0x20U /* permit to send and to receive broadcast messages (see IP_SOF_BROADCAST option) */ -/*#define SOF_USELOOPBACK 0x40U Unimplemented: bypass hardware when possible */ -#define SOF_LINGER 0x80U /* linger on close if data present */ -/*#define SOF_OOBINLINE 0x0100U Unimplemented: leave received OOB data in line */ -/*#define SOF_REUSEPORT 0x0200U Unimplemented: allow local address & port reuse */ - -/* These flags are inherited (e.g. from a listen-pcb to a connection-pcb): */ -#define SOF_INHERITED (SOF_REUSEADDR|SOF_KEEPALIVE|SOF_LINGER/*|SOF_DEBUG|SOF_DONTROUTE|SOF_OOBINLINE*/) - -/* Global variables of this module, kept in a struct for efficient access using base+index. */ -struct ip_globals -{ - /** The interface that provided the packet for the current callback invocation. */ - struct netif *current_netif; - /** Header of the input packet currently being processed. */ - const struct ip_hdr *current_ip4_header; -#if LWIP_IPV6 - /** Header of the input IPv6 packet currently being processed. */ - const struct ip6_hdr *current_ip6_header; -#endif /* LWIP_IPV6 */ - /** Total header length of current_ip4/6_header (i.e. after this, the UDP/TCP header starts) */ - u16_t current_ip_header_tot_len; - /** Source IP address of current_header */ - ipX_addr_t current_iphdr_src; - /** Destination IP address of current_header */ - ipX_addr_t current_iphdr_dest; -}; -extern struct ip_globals ip_data; - - -/** Get the interface that received the current packet. - * This function must only be called from a receive callback (udp_recv, - * raw_recv, tcp_accept). It will return NULL otherwise. */ -#define ip_current_netif() (ip_data.current_netif) -/** Get the IP header of the current packet. - * This function must only be called from a receive callback (udp_recv, - * raw_recv, tcp_accept). It will return NULL otherwise. */ -#define ip_current_header() (ip_data.current_ip4_header) -/** Total header length of ip(6)_current_header() (i.e. after this, the UDP/TCP header starts) */ -#define ip_current_header_tot_len() (ip_data.current_ip_header_tot_len) -/** Source IP address of current_header */ -#define ipX_current_src_addr() (&ip_data.current_iphdr_src) -/** Destination IP address of current_header */ -#define ipX_current_dest_addr() (&ip_data.current_iphdr_dest) - -#if LWIP_IPV6 -/** Get the IPv6 header of the current packet. - * This function must only be called from a receive callback (udp_recv, - * raw_recv, tcp_accept). It will return NULL otherwise. */ -#define ip6_current_header() (ip_data.current_ip6_header) -/** Returns TRUE if the current IP input packet is IPv6, FALSE if it is IPv4 */ -#define ip_current_is_v6() (ip6_current_header() != NULL) -/** Source IPv6 address of current_header */ -#define ip6_current_src_addr() (ipX_2_ip6(&ip_data.current_iphdr_src)) -/** Destination IPv6 address of current_header */ -#define ip6_current_dest_addr() (ipX_2_ip6(&ip_data.current_iphdr_dest)) -/** Get the transport layer protocol */ -#define ip_current_header_proto() (ip_current_is_v6() ? \ - IP6H_NEXTH(ip6_current_header()) :\ - IPH_PROTO(ip_current_header())) -/** Get the transport layer header */ -#define ipX_next_header_ptr() ((void*)((ip_current_is_v6() ? \ - (u8_t*)ip6_current_header() : (u8_t*)ip_current_header()) + ip_current_header_tot_len())) - -/** Set an IP_PCB to IPv6 (IPv4 is the default) */ -#define ip_set_v6(pcb, val) do{if(pcb != NULL) { pcb->isipv6 = val; }}while(0) - -/** Source IP4 address of current_header */ -#define ip_current_src_addr() (ipX_2_ip(&ip_data.current_iphdr_src)) -/** Destination IP4 address of current_header */ -#define ip_current_dest_addr() (ipX_2_ip(&ip_data.current_iphdr_dest)) - -#else /* LWIP_IPV6 */ - -/** Always returns FALSE when only supporting IPv4 */ -#define ip_current_is_v6() 0 -/** Get the transport layer protocol */ -#define ip_current_header_proto() IPH_PROTO(ip_current_header()) -/** Get the transport layer header */ -#define ipX_next_header_ptr() ((void*)((u8_t*)ip_current_header() + ip_current_header_tot_len())) -/** Source IP4 address of current_header */ -#define ip_current_src_addr() (&ip_data.current_iphdr_src) -/** Destination IP4 address of current_header */ -#define ip_current_dest_addr() (&ip_data.current_iphdr_dest) - -#endif /* LWIP_IPV6 */ - -/** Union source address of current_header */ -#define ipX_current_src_addr() (&ip_data.current_iphdr_src) -/** Union destination address of current_header */ -#define ipX_current_dest_addr() (&ip_data.current_iphdr_dest) - -/** Gets an IP pcb option (SOF_* flags) */ -#define ip_get_option(pcb, opt) ((pcb)->so_options & (opt)) -/** Sets an IP pcb option (SOF_* flags) */ -#define ip_set_option(pcb, opt) ((pcb)->so_options |= (opt)) -/** Resets an IP pcb option (SOF_* flags) */ -#define ip_reset_option(pcb, opt) ((pcb)->so_options &= ~(opt)) - -#if LWIP_IPV6 -#define ipX_output(isipv6, p, src, dest, ttl, tos, proto) \ - ((isipv6) ? \ - ip6_output(p, ipX_2_ip6(src), ipX_2_ip6(dest), ttl, tos, proto) : \ - ip_output(p, ipX_2_ip(src), ipX_2_ip(dest), ttl, tos, proto)) -#define ipX_output_if(isipv6, p, src, dest, ttl, tos, proto, netif) \ - ((isipv6) ? \ - ip6_output_if(p, ip_2_ip6(src), ip_2_ip6(dest), ttl, tos, proto, netif) : \ - ip_output_if(p, (src), (dest), ttl, tos, proto, netif)) -#define ipX_output_hinted(isipv6, p, src, dest, ttl, tos, proto, addr_hint) \ - ((isipv6) ? \ - ip6_output_hinted(p, ipX_2_ip6(src), ipX_2_ip6(dest), ttl, tos, proto, addr_hint) : \ - ip_output_hinted(p, ipX_2_ip(src), ipX_2_ip(dest), ttl, tos, proto, addr_hint)) -#define ipX_route(isipv6, src, dest) \ - ((isipv6) ? \ - ip6_route(ipX_2_ip6(src), ipX_2_ip6(dest)) : \ - ip_route(ipX_2_ip(dest))) -#define ipX_netif_get_local_ipX(isipv6, netif, dest) \ - ((isipv6) ? \ - ip6_netif_get_local_ipX(netif, ipX_2_ip6(dest)) : \ - ip_netif_get_local_ipX(netif)) -#define ipX_debug_print(is_ipv6, p) ((is_ipv6) ? ip6_debug_print(p) : ip_debug_print(p)) -#else /* LWIP_IPV6 */ -#define ipX_output(isipv6, p, src, dest, ttl, tos, proto) \ - ip_output(p, src, dest, ttl, tos, proto) -#define ipX_output_if(isipv6, p, src, dest, ttl, tos, proto, netif) \ - ip_output_if(p, src, dest, ttl, tos, proto, netif) -#define ipX_output_hinted(isipv6, p, src, dest, ttl, tos, proto, addr_hint) \ - ip_output_hinted(p, src, dest, ttl, tos, proto, addr_hint) -#define ipX_route(isipv6, src, dest) \ - ip_route(ipX_2_ip(dest)) -#define ipX_netif_get_local_ipX(isipv6, netif, dest) \ - ip_netif_get_local_ipX(netif) -#define ipX_debug_print(is_ipv6, p) ip_debug_print(p) -#endif /* LWIP_IPV6 */ - -#define ipX_route_get_local_ipX(isipv6, src, dest, netif, ipXaddr) do { \ - (netif) = ipX_route(isipv6, src, dest); \ - (ipXaddr) = ipX_netif_get_local_ipX(isipv6, netif, dest); \ -}while(0) - -#ifdef __cplusplus -} -#endif - -#endif /* __LWIP_IP_H__ */ - - diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/lwip/ip_addr.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/lwip/ip_addr.h deleted file mode 100644 index 7bd03cbd..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/lwip/ip_addr.h +++ /dev/null @@ -1,130 +0,0 @@ -/* - * Copyright (c) 2001-2004 Swedish Institute of Computer Science. - * 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. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT - * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING - * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY - * OF SUCH DAMAGE. - * - * This file is part of the lwIP TCP/IP stack. - * - * Author: Adam Dunkels - * - */ -#ifndef __LWIP_IP_ADDR_H__ -#define __LWIP_IP_ADDR_H__ - -#include "lwip/opt.h" -#include "lwip/def.h" - -#include "lwip/ip4_addr.h" -#include "lwip/ip6_addr.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#if LWIP_IPV6 -/* A union struct for both IP version's addresses. */ -typedef union { - ip_addr_t ip4; - ip6_addr_t ip6; -} ipX_addr_t; - -/** These functions only exist for type-safe conversion from ip_addr_t to - ip6_addr_t and back */ -#ifdef LWIP_ALLOW_STATIC_FN_IN_HEADER -static ip6_addr_t* ip_2_ip6(ip_addr_t *ipaddr) -{ return (ip6_addr_t*)ipaddr;} -static ip_addr_t* ip6_2_ip(ip6_addr_t *ip6addr) -{ return (ip_addr_t*)ip6addr; } -static ipX_addr_t* ip_2_ipX(ip_addr_t *ipaddr) -{ return (ipX_addr_t*)ipaddr; } -static ipX_addr_t* ip6_2_ipX(ip6_addr_t *ip6addr) -{ return (ipX_addr_t*)ip6addr; } -#else /* LWIP_ALLOW_STATIC_FN_IN_HEADER */ -#define ip_2_ip6(ipaddr) ((ip6_addr_t*)(ipaddr)) -#define ip6_2_ip(ip6addr) ((ip_addr_t*)(ip6addr)) -#define ip_2_ipX(ipaddr) ((ipX_addr_t*)ipaddr) -#define ip6_2_ipX(ip6addr) ((ipX_addr_t*)ip6addr) -#endif /* LWIP_ALLOW_STATIC_FN_IN_HEADER*/ -#define ipX_2_ip6(ip6addr) (&((ip6addr)->ip6)) -#define ipX_2_ip(ipaddr) (&((ipaddr)->ip4)) - -#define ipX_addr_copy(is_ipv6, dest, src) do{if(is_ipv6){ \ - ip6_addr_copy((dest).ip6, (src).ip6); }else{ \ - ip_addr_copy((dest).ip4, (src).ip4); }}while(0) -#define ipX_addr_set(is_ipv6, dest, src) do{if(is_ipv6){ \ - ip6_addr_set(ipX_2_ip6(dest), ipX_2_ip6(src)); }else{ \ - ip_addr_set(ipX_2_ip(dest), ipX_2_ip(src)); }}while(0) -#define ipX_addr_set_ipaddr(is_ipv6, dest, src) do{if(is_ipv6){ \ - ip6_addr_set(ipX_2_ip6(dest), ip_2_ip6(src)); }else{ \ - ip_addr_set(ipX_2_ip(dest), src); }}while(0) -#define ipX_addr_set_zero(is_ipv6, ipaddr) do{if(is_ipv6){ \ - ip6_addr_set_zero(ipX_2_ip6(ipaddr)); }else{ \ - ip_addr_set_zero(ipX_2_ip(ipaddr)); }}while(0) -#define ipX_addr_set_any(is_ipv6, ipaddr) do{if(is_ipv6){ \ - ip6_addr_set_any(ipX_2_ip6(ipaddr)); }else{ \ - ip_addr_set_any(ipX_2_ip(ipaddr)); }}while(0) -#define ipX_addr_set_loopback(is_ipv6, ipaddr) do{if(is_ipv6){ \ - ip6_addr_set_loopback(ipX_2_ip6(ipaddr)); }else{ \ - ip_addr_set_loopback(ipX_2_ip(ipaddr)); }}while(0) -#define ipX_addr_set_hton(is_ipv6, dest, src) do{if(is_ipv6){ \ - ip6_addr_set_hton(ipX_2_ip6(ipaddr), (src)) ;}else{ \ - ip_addr_set_hton(ipX_2_ip(ipaddr), (src));}}while(0) -#define ipX_addr_cmp(is_ipv6, addr1, addr2) ((is_ipv6) ? \ - ip6_addr_cmp(ipX_2_ip6(addr1), ipX_2_ip6(addr2)) : \ - ip_addr_cmp(ipX_2_ip(addr1), ipX_2_ip(addr2))) -#define ipX_addr_isany(is_ipv6, ipaddr) ((is_ipv6) ? \ - ip6_addr_isany(ipX_2_ip6(ipaddr)) : \ - ip_addr_isany(ipX_2_ip(ipaddr))) -#define ipX_addr_ismulticast(is_ipv6, ipaddr) ((is_ipv6) ? \ - ip6_addr_ismulticast(ipX_2_ip6(ipaddr)) : \ - ip_addr_ismulticast(ipX_2_ip(ipaddr))) -#define ipX_addr_debug_print(is_ipv6, debug, ipaddr) do { if(is_ipv6) { \ - ip6_addr_debug_print(debug, ipX_2_ip6(ipaddr)); } else { \ - ip_addr_debug_print(debug, ipX_2_ip(ipaddr)); }}while(0) - -#else /* LWIP_IPV6 */ - -typedef ip_addr_t ipX_addr_t; -#define ipX_2_ip(ipaddr) (ipaddr) -#define ip_2_ipX(ipaddr) (ipaddr) - -#define ipX_addr_copy(is_ipv6, dest, src) ip_addr_copy(dest, src) -#define ipX_addr_set(is_ipv6, dest, src) ip_addr_set(dest, src) -#define ipX_addr_set_ipaddr(is_ipv6, dest, src) ip_addr_set(dest, src) -#define ipX_addr_set_zero(is_ipv6, ipaddr) ip_addr_set_zero(ipaddr) -#define ipX_addr_set_any(is_ipv6, ipaddr) ip_addr_set_any(ipaddr) -#define ipX_addr_set_loopback(is_ipv6, ipaddr) ip_addr_set_loopback(ipaddr) -#define ipX_addr_set_hton(is_ipv6, dest, src) ip_addr_set_hton(dest, src) -#define ipX_addr_cmp(is_ipv6, addr1, addr2) ip_addr_cmp(addr1, addr2) -#define ipX_addr_isany(is_ipv6, ipaddr) ip_addr_isany(ipaddr) -#define ipX_addr_ismulticast(is_ipv6, ipaddr) ip_addr_ismulticast(ipaddr) -#define ipX_addr_debug_print(is_ipv6, debug, ipaddr) ip_addr_debug_print(debug, ipaddr) - -#endif /* LWIP_IPV6 */ - -#ifdef __cplusplus -} -#endif - -#endif /* __LWIP_IP_ADDR_H__ */ diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/lwip/mem.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/lwip/mem.h deleted file mode 100644 index 0ad9db65..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/lwip/mem.h +++ /dev/null @@ -1,123 +0,0 @@ -/* - * Copyright (c) 2001-2004 Swedish Institute of Computer Science. - * 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. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT - * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING - * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY - * OF SUCH DAMAGE. - * - * This file is part of the lwIP TCP/IP stack. - * - * Author: Adam Dunkels - * - */ -#ifndef __LWIP_MEM_H__ -#define __LWIP_MEM_H__ - -#include "lwip/opt.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#if MEM_LIBC_MALLOC - -#include /* for size_t */ - -typedef size_t mem_size_t; -#define MEM_SIZE_F SZT_F - -/* aliases for C library malloc() */ -#define mem_init() -/* in case C library malloc() needs extra protection, - * allow these defines to be overridden. - */ -#ifndef mem_free -#define mem_free(mem) do {free(mem); (mem)=NULL;} while (0); -#endif -#ifndef mem_malloc -#define mem_malloc malloc -#endif -#ifndef mem_calloc -#define mem_calloc calloc -#endif -/* Since there is no C library allocation function to shrink memory without - moving it, define this to nothing. */ -#ifndef mem_trim -#define mem_trim(mem, size) (mem) -#endif -#else /* MEM_LIBC_MALLOC */ - -/* MEM_SIZE would have to be aligned, but using 64000 here instead of - * 65535 leaves some room for alignment... - */ -#if MEM_SIZE > 64000L -typedef u32_t mem_size_t; -#define MEM_SIZE_F U32_F -#else -typedef u16_t mem_size_t; -#define MEM_SIZE_F U16_F -#endif /* MEM_SIZE > 64000 */ - -#if MEM_USE_POOLS -/** mem_init is not used when using pools instead of a heap */ -#define mem_init() -/** mem_trim is not used when using pools instead of a heap: - we can't free part of a pool element and don't want to copy the rest */ -#define mem_trim(mem, size) (mem) -#else /* MEM_USE_POOLS */ -/* lwIP alternative malloc */ -void mem_init(void); -void *mem_trim(void *mem, mem_size_t size); -#endif /* MEM_USE_POOLS */ -void *mem_malloc(mem_size_t size); -void *mem_calloc(mem_size_t count, mem_size_t size); -void mem_free(void *mem); -#endif /* MEM_LIBC_MALLOC */ - -/** Calculate memory size for an aligned buffer - returns the next highest - * multiple of MEM_ALIGNMENT (e.g. LWIP_MEM_ALIGN_SIZE(3) and - * LWIP_MEM_ALIGN_SIZE(4) will both yield 4 for MEM_ALIGNMENT == 4). - */ -#ifndef LWIP_MEM_ALIGN_SIZE -#define LWIP_MEM_ALIGN_SIZE(size) (((size) + MEM_ALIGNMENT - 1) & ~(MEM_ALIGNMENT-1)) -#endif - -/** Calculate safe memory size for an aligned buffer when using an unaligned - * type as storage. This includes a safety-margin on (MEM_ALIGNMENT - 1) at the - * start (e.g. if buffer is u8_t[] and actual data will be u32_t*) - */ -#ifndef LWIP_MEM_ALIGN_BUFFER -#define LWIP_MEM_ALIGN_BUFFER(size) (((size) + MEM_ALIGNMENT - 1)) -#endif - -/** Align a memory pointer to the alignment defined by MEM_ALIGNMENT - * so that ADDR % MEM_ALIGNMENT == 0 - */ -#ifndef LWIP_MEM_ALIGN -#define LWIP_MEM_ALIGN(addr) ((void *)(((mem_ptr_t)(addr) + MEM_ALIGNMENT - 1) & ~(mem_ptr_t)(MEM_ALIGNMENT-1))) -#endif - -#ifdef __cplusplus -} -#endif - -#endif /* __LWIP_MEM_H__ */ diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/lwip/memp.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/lwip/memp.h deleted file mode 100644 index f0d07399..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/lwip/memp.h +++ /dev/null @@ -1,116 +0,0 @@ -/* - * Copyright (c) 2001-2004 Swedish Institute of Computer Science. - * 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. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT - * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING - * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY - * OF SUCH DAMAGE. - * - * This file is part of the lwIP TCP/IP stack. - * - * Author: Adam Dunkels - * - */ - -#ifndef __LWIP_MEMP_H__ -#define __LWIP_MEMP_H__ - -#include "lwip/opt.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/* Create the list of all memory pools managed by memp. MEMP_MAX represents a NULL pool at the end */ -typedef enum { -#define LWIP_MEMPOOL(name,num,size,desc) MEMP_##name, -#include "lwip/memp_std.h" - MEMP_MAX -} memp_t; - -#if MEM_USE_POOLS -/* Use a helper type to get the start and end of the user "memory pools" for mem_malloc */ -typedef enum { - /* Get the first (via: - MEMP_POOL_HELPER_START = ((u8_t) 1*MEMP_POOL_A + 0*MEMP_POOL_B + 0*MEMP_POOL_C + 0)*/ - MEMP_POOL_HELPER_FIRST = ((u8_t) -#define LWIP_MEMPOOL(name,num,size,desc) -#define LWIP_MALLOC_MEMPOOL_START 1 -#define LWIP_MALLOC_MEMPOOL(num, size) * MEMP_POOL_##size + 0 -#define LWIP_MALLOC_MEMPOOL_END -#include "lwip/memp_std.h" - ) , - /* Get the last (via: - MEMP_POOL_HELPER_END = ((u8_t) 0 + MEMP_POOL_A*0 + MEMP_POOL_B*0 + MEMP_POOL_C*1) */ - MEMP_POOL_HELPER_LAST = ((u8_t) -#define LWIP_MEMPOOL(name,num,size,desc) -#define LWIP_MALLOC_MEMPOOL_START -#define LWIP_MALLOC_MEMPOOL(num, size) 0 + MEMP_POOL_##size * -#define LWIP_MALLOC_MEMPOOL_END 1 -#include "lwip/memp_std.h" - ) -} memp_pool_helper_t; - -/* The actual start and stop values are here (cast them over) - We use this helper type and these defines so we can avoid using const memp_t values */ -#define MEMP_POOL_FIRST ((memp_t) MEMP_POOL_HELPER_FIRST) -#define MEMP_POOL_LAST ((memp_t) MEMP_POOL_HELPER_LAST) -#endif /* MEM_USE_POOLS */ - -#if MEMP_MEM_MALLOC || MEM_USE_POOLS -extern const u16_t memp_sizes[MEMP_MAX]; -#endif /* MEMP_MEM_MALLOC || MEM_USE_POOLS */ - -#if MEMP_MEM_MALLOC - -#include "mem.h" - -#define memp_init() -#define memp_malloc(type) mem_malloc(memp_sizes[type]) -#define memp_free(type, mem) mem_free(mem) - -#else /* MEMP_MEM_MALLOC */ - -#if MEM_USE_POOLS -/** This structure is used to save the pool one element came from. */ -struct memp_malloc_helper -{ - memp_t poolnr; -}; -#endif /* MEM_USE_POOLS */ - -void memp_init(void); - -#if MEMP_OVERFLOW_CHECK -void *memp_malloc_fn(memp_t type, const char* file, const int line); -#define memp_malloc(t) memp_malloc_fn((t), __FILE__, __LINE__) -#else -void *memp_malloc(memp_t type); -#endif -void memp_free(memp_t type, void *mem); - -#endif /* MEMP_MEM_MALLOC */ - -#ifdef __cplusplus -} -#endif - -#endif /* __LWIP_MEMP_H__ */ diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/lwip/memp_std.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/lwip/memp_std.h deleted file mode 100644 index 592a2824..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/lwip/memp_std.h +++ /dev/null @@ -1,135 +0,0 @@ -/* - * SETUP: Make sure we define everything we will need. - * - * We have create three types of pools: - * 1) MEMPOOL - standard pools - * 2) MALLOC_MEMPOOL - to be used by mem_malloc in mem.c - * 3) PBUF_MEMPOOL - a mempool of pbuf's, so include space for the pbuf struct - * - * If the include'r doesn't require any special treatment of each of the types - * above, then will declare #2 & #3 to be just standard mempools. - */ -#ifndef LWIP_MALLOC_MEMPOOL -/* This treats "malloc pools" just like any other pool. - The pools are a little bigger to provide 'size' as the amount of user data. */ -#define LWIP_MALLOC_MEMPOOL(num, size) LWIP_MEMPOOL(POOL_##size, num, (size + sizeof(struct memp_malloc_helper)), "MALLOC_"#size) -#define LWIP_MALLOC_MEMPOOL_START -#define LWIP_MALLOC_MEMPOOL_END -#endif /* LWIP_MALLOC_MEMPOOL */ - -#ifndef LWIP_PBUF_MEMPOOL -/* This treats "pbuf pools" just like any other pool. - * Allocates buffers for a pbuf struct AND a payload size */ -#define LWIP_PBUF_MEMPOOL(name, num, payload, desc) LWIP_MEMPOOL(name, num, (MEMP_ALIGN_SIZE(sizeof(struct pbuf)) + MEMP_ALIGN_SIZE(payload)), desc) -#endif /* LWIP_PBUF_MEMPOOL */ - - -/* - * A list of internal pools used by LWIP. - * - * LWIP_MEMPOOL(pool_name, number_elements, element_size, pool_description) - * creates a pool name MEMP_pool_name. description is used in stats.c - */ -#if LWIP_RAW -LWIP_MEMPOOL(RAW_PCB, MEMP_NUM_RAW_PCB, sizeof(struct raw_pcb), "RAW_PCB") -#endif /* LWIP_RAW */ - -#if LWIP_UDP -LWIP_MEMPOOL(UDP_PCB, MEMP_NUM_UDP_PCB, sizeof(struct udp_pcb), "UDP_PCB") -#endif /* LWIP_UDP */ - -#if LWIP_TCP -LWIP_MEMPOOL(TCP_PCB, MEMP_NUM_TCP_PCB, sizeof(struct tcp_pcb), "TCP_PCB") -LWIP_MEMPOOL(TCP_PCB_LISTEN, MEMP_NUM_TCP_PCB_LISTEN, sizeof(struct tcp_pcb_listen), "TCP_PCB_LISTEN") -LWIP_MEMPOOL(TCP_SEG, MEMP_NUM_TCP_SEG, sizeof(struct tcp_seg), "TCP_SEG") -#endif /* LWIP_TCP */ - -#if IP_REASSEMBLY -LWIP_MEMPOOL(REASSDATA, MEMP_NUM_REASSDATA, sizeof(struct ip_reassdata), "REASSDATA") -#endif /* IP_REASSEMBLY */ -#if (IP_FRAG && !IP_FRAG_USES_STATIC_BUF && !LWIP_NETIF_TX_SINGLE_PBUF) || LWIP_IPV6_FRAG -LWIP_MEMPOOL(FRAG_PBUF, MEMP_NUM_FRAG_PBUF, sizeof(struct pbuf_custom_ref),"FRAG_PBUF") -#endif /* IP_FRAG && !IP_FRAG_USES_STATIC_BUF && !LWIP_NETIF_TX_SINGLE_PBUF */ - -#if LWIP_NETCONN -LWIP_MEMPOOL(NETBUF, MEMP_NUM_NETBUF, sizeof(struct netbuf), "NETBUF") -LWIP_MEMPOOL(NETCONN, MEMP_NUM_NETCONN, sizeof(struct netconn), "NETCONN") -#endif /* LWIP_NETCONN */ - -#if NO_SYS==0 -LWIP_MEMPOOL(TCPIP_MSG_API, MEMP_NUM_TCPIP_MSG_API, sizeof(struct tcpip_msg), "TCPIP_MSG_API") -#if !LWIP_TCPIP_CORE_LOCKING_INPUT -LWIP_MEMPOOL(TCPIP_MSG_INPKT,MEMP_NUM_TCPIP_MSG_INPKT, sizeof(struct tcpip_msg), "TCPIP_MSG_INPKT") -#endif /* !LWIP_TCPIP_CORE_LOCKING_INPUT */ -#endif /* NO_SYS==0 */ - -#if LWIP_ARP && ARP_QUEUEING -LWIP_MEMPOOL(ARP_QUEUE, MEMP_NUM_ARP_QUEUE, sizeof(struct etharp_q_entry), "ARP_QUEUE") -#endif /* LWIP_ARP && ARP_QUEUEING */ - -#if LWIP_IGMP -LWIP_MEMPOOL(IGMP_GROUP, MEMP_NUM_IGMP_GROUP, sizeof(struct igmp_group), "IGMP_GROUP") -#endif /* LWIP_IGMP */ - -#if (!NO_SYS || (NO_SYS && !NO_SYS_NO_TIMERS)) /* LWIP_TIMERS */ -LWIP_MEMPOOL(SYS_TIMEOUT, MEMP_NUM_SYS_TIMEOUT, sizeof(struct sys_timeo), "SYS_TIMEOUT") -#endif /* LWIP_TIMERS */ - -#if LWIP_SNMP -LWIP_MEMPOOL(SNMP_ROOTNODE, MEMP_NUM_SNMP_ROOTNODE, sizeof(struct mib_list_rootnode), "SNMP_ROOTNODE") -LWIP_MEMPOOL(SNMP_NODE, MEMP_NUM_SNMP_NODE, sizeof(struct mib_list_node), "SNMP_NODE") -LWIP_MEMPOOL(SNMP_VARBIND, MEMP_NUM_SNMP_VARBIND, sizeof(struct snmp_varbind), "SNMP_VARBIND") -LWIP_MEMPOOL(SNMP_VALUE, MEMP_NUM_SNMP_VALUE, SNMP_MAX_VALUE_SIZE, "SNMP_VALUE") -#endif /* LWIP_SNMP */ -#if LWIP_DNS && LWIP_SOCKET -LWIP_MEMPOOL(NETDB, MEMP_NUM_NETDB, NETDB_ELEM_SIZE, "NETDB") -#endif /* LWIP_DNS && LWIP_SOCKET */ -#if LWIP_DNS && DNS_LOCAL_HOSTLIST && DNS_LOCAL_HOSTLIST_IS_DYNAMIC -LWIP_MEMPOOL(LOCALHOSTLIST, MEMP_NUM_LOCALHOSTLIST, LOCALHOSTLIST_ELEM_SIZE, "LOCALHOSTLIST") -#endif /* LWIP_DNS && DNS_LOCAL_HOSTLIST && DNS_LOCAL_HOSTLIST_IS_DYNAMIC */ -#if PPP_SUPPORT && PPPOE_SUPPORT -LWIP_MEMPOOL(PPPOE_IF, MEMP_NUM_PPPOE_INTERFACES, sizeof(struct pppoe_softc), "PPPOE_IF") -#endif /* PPP_SUPPORT && PPPOE_SUPPORT */ - -#if LWIP_IPV6 && LWIP_ND6_QUEUEING -LWIP_MEMPOOL(ND6_QUEUE, MEMP_NUM_ND6_QUEUE, sizeof(struct nd6_q_entry), "ND6_QUEUE") -#endif /* LWIP_IPV6 && LWIP_ND6_QUEUEING */ - -#if LWIP_IPV6 && LWIP_IPV6_REASS -LWIP_MEMPOOL(IP6_REASSDATA, MEMP_NUM_REASSDATA, sizeof(struct ip6_reassdata), "IP6_REASSDATA") -#endif /* LWIP_IPV6 && LWIP_IPV6_REASS */ - -#if LWIP_IPV6 && LWIP_IPV6_MLD -LWIP_MEMPOOL(MLD6_GROUP, MEMP_NUM_MLD6_GROUP, sizeof(struct mld_group), "MLD6_GROUP") -#endif /* LWIP_IPV6 && LWIP_IPV6_MLD */ - - -/* - * A list of pools of pbuf's used by LWIP. - * - * LWIP_PBUF_MEMPOOL(pool_name, number_elements, pbuf_payload_size, pool_description) - * creates a pool name MEMP_pool_name. description is used in stats.c - * This allocates enough space for the pbuf struct and a payload. - * (Example: pbuf_payload_size=0 allocates only size for the struct) - */ -LWIP_PBUF_MEMPOOL(PBUF, MEMP_NUM_PBUF, 0, "PBUF_REF/ROM") -LWIP_PBUF_MEMPOOL(PBUF_POOL, PBUF_POOL_SIZE, PBUF_POOL_BUFSIZE, "PBUF_POOL") - - -/* - * Allow for user-defined pools; this must be explicitly set in lwipopts.h - * since the default is to NOT look for lwippools.h - */ -#if MEMP_USE_CUSTOM_POOLS -#include "lwippools.h" -#endif /* MEMP_USE_CUSTOM_POOLS */ - -/* - * REQUIRED CLEANUP: Clear up so we don't get "multiply defined" error later - * (#undef is ignored for something that is not defined) - */ -#undef LWIP_MEMPOOL -#undef LWIP_MALLOC_MEMPOOL -#undef LWIP_MALLOC_MEMPOOL_START -#undef LWIP_MALLOC_MEMPOOL_END -#undef LWIP_PBUF_MEMPOOL diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/lwip/netbuf.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/lwip/netbuf.h deleted file mode 100644 index d12fe270..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/lwip/netbuf.h +++ /dev/null @@ -1,112 +0,0 @@ -/* - * Copyright (c) 2001-2004 Swedish Institute of Computer Science. - * 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. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT - * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING - * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY - * OF SUCH DAMAGE. - * - * This file is part of the lwIP TCP/IP stack. - * - * Author: Adam Dunkels - * - */ -#ifndef __LWIP_NETBUF_H__ -#define __LWIP_NETBUF_H__ - -#include "lwip/opt.h" -#include "lwip/pbuf.h" -#include "lwip/ip_addr.h" -#include "lwip/ip6_addr.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/** This netbuf has dest-addr/port set */ -#define NETBUF_FLAG_DESTADDR 0x01 -/** This netbuf includes a checksum */ -#define NETBUF_FLAG_CHKSUM 0x02 - -struct netbuf { - struct pbuf *p, *ptr; - ipX_addr_t addr; - u16_t port; -#if LWIP_NETBUF_RECVINFO || LWIP_CHECKSUM_ON_COPY -#if LWIP_CHECKSUM_ON_COPY - u8_t flags; -#endif /* LWIP_CHECKSUM_ON_COPY */ - u16_t toport_chksum; -#if LWIP_NETBUF_RECVINFO - ipX_addr_t toaddr; -#endif /* LWIP_NETBUF_RECVINFO */ -#endif /* LWIP_NETBUF_RECVINFO || LWIP_CHECKSUM_ON_COPY */ -}; - -/* Network buffer functions: */ -struct netbuf * netbuf_new (void); -void netbuf_delete (struct netbuf *buf); -void * netbuf_alloc (struct netbuf *buf, u16_t size); -void netbuf_free (struct netbuf *buf); -err_t netbuf_ref (struct netbuf *buf, - const void *dataptr, u16_t size); -void netbuf_chain (struct netbuf *head, - struct netbuf *tail); - -err_t netbuf_data (struct netbuf *buf, - void **dataptr, u16_t *len); -s8_t netbuf_next (struct netbuf *buf); -void netbuf_first (struct netbuf *buf); - - -#define netbuf_copy_partial(buf, dataptr, len, offset) \ - pbuf_copy_partial((buf)->p, (dataptr), (len), (offset)) -#define netbuf_copy(buf,dataptr,len) netbuf_copy_partial(buf, dataptr, len, 0) -#define netbuf_take(buf, dataptr, len) pbuf_take((buf)->p, dataptr, len) -#define netbuf_len(buf) ((buf)->p->tot_len) -#define netbuf_fromaddr(buf) (ipX_2_ip(&((buf)->addr))) -#define netbuf_set_fromaddr(buf, fromaddr) ip_addr_set(ipX_2_ip(&((buf)->addr)), fromaddr) -#define netbuf_fromport(buf) ((buf)->port) -#if LWIP_NETBUF_RECVINFO -#define netbuf_destaddr(buf) (ipX_2_ip(&((buf)->toaddr))) -#define netbuf_set_destaddr(buf, destaddr) ip_addr_set(ipX_2_ip(&((buf)->toaddr)), destaddr) -#define netbuf_destport(buf) (((buf)->flags & NETBUF_FLAG_DESTADDR) ? (buf)->toport_chksum : 0) -#endif /* LWIP_NETBUF_RECVINFO */ -#if LWIP_CHECKSUM_ON_COPY -#define netbuf_set_chksum(buf, chksum) do { (buf)->flags = NETBUF_FLAG_CHKSUM; \ - (buf)->toport_chksum = chksum; } while(0) -#endif /* LWIP_CHECKSUM_ON_COPY */ - -#if LWIP_IPV6 -#define netbuf_fromaddr_ip6(buf) (ipX_2_ip6(&((buf)->addr))) -#define netbuf_set_fromaddr_ip6(buf, fromaddr) ip6_addr_set(ipX_2_ip6(&((buf)->addr)), fromaddr) -#define netbuf_destaddr_ip6(buf) (ipX_2_ip6(&((buf)->toaddr))) -#define netbuf_set_destaddr_ip6(buf, destaddr) ip6_addr_set(ipX_2_ip6(&((buf)->toaddr)), destaddr) -#endif /* LWIP_IPV6 */ - -#define netbuf_fromaddr_ipX(buf) (&((buf)->addr)) -#define netbuf_destaddr_ipX(buf) (&((buf)->toaddr)) - -#ifdef __cplusplus -} -#endif - -#endif /* __LWIP_NETBUF_H__ */ diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/lwip/netdb.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/lwip/netdb.h deleted file mode 100644 index 7587e2f2..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/lwip/netdb.h +++ /dev/null @@ -1,124 +0,0 @@ -/* - * 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. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT - * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING - * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY - * OF SUCH DAMAGE. - * - * This file is part of the lwIP TCP/IP stack. - * - * Author: Simon Goldschmidt - * - */ -#ifndef __LWIP_NETDB_H__ -#define __LWIP_NETDB_H__ - -#include "lwip/opt.h" - -#if LWIP_DNS && LWIP_SOCKET - -#include /* for size_t */ - -#include "lwip/inet.h" -#include "lwip/sockets.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/* some rarely used options */ -#ifndef LWIP_DNS_API_DECLARE_H_ERRNO -#define LWIP_DNS_API_DECLARE_H_ERRNO 1 -#endif - -#ifndef LWIP_DNS_API_DEFINE_ERRORS -#define LWIP_DNS_API_DEFINE_ERRORS 1 -#endif - -#ifndef LWIP_DNS_API_DECLARE_STRUCTS -#define LWIP_DNS_API_DECLARE_STRUCTS 1 -#endif - -#if LWIP_DNS_API_DEFINE_ERRORS -/** Errors used by the DNS API functions, h_errno can be one of them */ -#define EAI_NONAME 200 -#define EAI_SERVICE 201 -#define EAI_FAIL 202 -#define EAI_MEMORY 203 - -#define HOST_NOT_FOUND 210 -#define NO_DATA 211 -#define NO_RECOVERY 212 -#define TRY_AGAIN 213 -#endif /* LWIP_DNS_API_DEFINE_ERRORS */ - -#if LWIP_DNS_API_DECLARE_STRUCTS -struct hostent { - char *h_name; /* Official name of the host. */ - char **h_aliases; /* A pointer to an array of pointers to alternative host names, - terminated by a null pointer. */ - int h_addrtype; /* Address type. */ - int h_length; /* The length, in bytes, of the address. */ - char **h_addr_list; /* A pointer to an array of pointers to network addresses (in - network byte order) for the host, terminated by a null pointer. */ -#define h_addr h_addr_list[0] /* for backward compatibility */ -}; - -struct addrinfo { - int ai_flags; /* Input flags. */ - int ai_family; /* Address family of socket. */ - int ai_socktype; /* Socket type. */ - int ai_protocol; /* Protocol of socket. */ - socklen_t ai_addrlen; /* Length of socket address. */ - struct sockaddr *ai_addr; /* Socket address of socket. */ - char *ai_canonname; /* Canonical name of service location. */ - struct addrinfo *ai_next; /* Pointer to next in list. */ -}; -#endif /* LWIP_DNS_API_DECLARE_STRUCTS */ - -#if LWIP_DNS_API_DECLARE_H_ERRNO -/* application accessable error code set by the DNS API functions */ -extern int h_errno; -#endif /* LWIP_DNS_API_DECLARE_H_ERRNO*/ - -struct hostent *lwip_gethostbyname(const char *name); -int lwip_gethostbyname_r(const char *name, struct hostent *ret, char *buf, - size_t buflen, struct hostent **result, int *h_errnop); -void lwip_freeaddrinfo(struct addrinfo *ai); -int lwip_getaddrinfo(const char *nodename, - const char *servname, - const struct addrinfo *hints, - struct addrinfo **res); - -#if LWIP_COMPAT_SOCKETS -#define gethostbyname(name) lwip_gethostbyname(name) -#define gethostbyname_r(name, ret, buf, buflen, result, h_errnop) \ - lwip_gethostbyname_r(name, ret, buf, buflen, result, h_errnop) -#define freeaddrinfo(addrinfo) lwip_freeaddrinfo(addrinfo) -#define getaddrinfo(nodname, servname, hints, res) \ - lwip_getaddrinfo(nodname, servname, hints, res) -#endif /* LWIP_COMPAT_SOCKETS */ - -#ifdef __cplusplus -} -#endif - -#endif /* LWIP_DNS && LWIP_SOCKET */ - -#endif /* __LWIP_NETDB_H__ */ diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/lwip/netif.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/lwip/netif.h deleted file mode 100644 index f9770324..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/lwip/netif.h +++ /dev/null @@ -1,393 +0,0 @@ -/* - * Copyright (c) 2001-2004 Swedish Institute of Computer Science. - * 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. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT - * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING - * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY - * OF SUCH DAMAGE. - * - * This file is part of the lwIP TCP/IP stack. - * - * Author: Adam Dunkels - * - */ -#ifndef __LWIP_NETIF_H__ -#define __LWIP_NETIF_H__ - -#include "lwip/opt.h" - -#define ENABLE_LOOPBACK (LWIP_NETIF_LOOPBACK || LWIP_HAVE_LOOPIF) - -#include "lwip/err.h" - -#include "lwip/ip_addr.h" -#include "lwip/ip6_addr.h" - -#include "lwip/def.h" -#include "lwip/pbuf.h" -#if LWIP_DHCP -struct dhcp; -#endif -#if LWIP_AUTOIP -struct autoip; -#endif -#if LWIP_IPV6_DHCP6 -#include "lwip/dhcp6.h" -#endif /* LWIP_IPV6_DHCP6 */ - -#ifdef __cplusplus -extern "C" { -#endif - -/* Throughout this file, IP addresses are expected to be in - * the same byte order as in IP_PCB. */ - -/** must be the maximum of all used hardware address lengths - across all types of interfaces in use */ -#define NETIF_MAX_HWADDR_LEN 6U - -/** Whether the network interface is 'up'. This is - * a software flag used to control whether this network - * interface is enabled and processes traffic. - * It is set by the startup code (for static IP configuration) or - * by dhcp/autoip when an address has been assigned. - */ -#define NETIF_FLAG_UP 0x01U -/** If set, the netif has broadcast capability. - * Set by the netif driver in its init function. */ -#define NETIF_FLAG_BROADCAST 0x02U -/** If set, the netif is one end of a point-to-point connection. - * Set by the netif driver in its init function. */ -#define NETIF_FLAG_POINTTOPOINT 0x04U -/** If set, the interface is configured using DHCP. - * Set by the DHCP code when starting or stopping DHCP. */ -#define NETIF_FLAG_DHCP 0x08U -/** If set, the interface has an active link - * (set by the network interface driver). - * Either set by the netif driver in its init function (if the link - * is up at that time) or at a later point once the link comes up - * (if link detection is supported by the hardware). */ -#define NETIF_FLAG_LINK_UP 0x10U -/** If set, the netif is an ethernet device using ARP. - * Set by the netif driver in its init function. - * Used to check input packet types and use of DHCP. */ -#define NETIF_FLAG_ETHARP 0x20U -/** If set, the netif is an ethernet device. It might not use - * ARP or TCP/IP if it is used for PPPoE only. - */ -#define NETIF_FLAG_ETHERNET 0x40U -/** If set, the netif has IGMP capability. - * Set by the netif driver in its init function. */ -#define NETIF_FLAG_IGMP 0x80U -/** Whether to pretend that we are every host for TCP packets. - * Set by netif_set_pretend_tcp. */ -#define NETIF_FLAG_PRETEND_TCP 0x100U - -/** Function prototype for netif init functions. Set up flags and output/linkoutput - * callback functions in this function. - * - * @param netif The netif to initialize - */ -typedef err_t (*netif_init_fn)(struct netif *netif); -/** Function prototype for netif->input functions. This function is saved as 'input' - * callback function in the netif struct. Call it when a packet has been received. - * - * @param p The received packet, copied into a pbuf - * @param inp The netif which received the packet - */ -typedef err_t (*netif_input_fn)(struct pbuf *p, struct netif *inp); -/** Function prototype for netif->output functions. Called by lwIP when a packet - * shall be sent. For ethernet netif, set this to 'etharp_output' and set - * 'linkoutput'. - * - * @param netif The netif which shall send a packet - * @param p The packet to send (p->payload points to IP header) - * @param ipaddr The IP address to which the packet shall be sent - */ -typedef err_t (*netif_output_fn)(struct netif *netif, struct pbuf *p, - ip_addr_t *ipaddr); -#if LWIP_IPV6 -/** Function prototype for netif->output_ip6 functions. Called by lwIP when a packet - * shall be sent. For ethernet netif, set this to 'nd_output' and set - * 'linkoutput'. - * - * @param netif The netif which shall send a packet - * @param p The packet to send (p->payload points to IP header) - * @param ipaddr The IPv6 address to which the packet shall be sent - */ -typedef err_t (*netif_output_ip6_fn)(struct netif *netif, struct pbuf *p, - ip6_addr_t *ipaddr); -#endif /* LWIP_IPV6 */ -/** Function prototype for netif->linkoutput functions. Only used for ethernet - * netifs. This function is called by ARP when a packet shall be sent. - * - * @param netif The netif which shall send a packet - * @param p The packet to send (raw ethernet packet) - */ -typedef err_t (*netif_linkoutput_fn)(struct netif *netif, struct pbuf *p); -/** Function prototype for netif status- or link-callback functions. */ -typedef void (*netif_status_callback_fn)(struct netif *netif); -/** Function prototype for netif igmp_mac_filter functions */ -typedef err_t (*netif_igmp_mac_filter_fn)(struct netif *netif, - ip_addr_t *group, u8_t action); -#if LWIP_IPV6 && LWIP_IPV6_MLD -/** Function prototype for netif mld_mac_filter functions */ -typedef err_t (*netif_mld_mac_filter_fn)(struct netif *netif, - ip6_addr_t *group, u8_t action); -#endif /* LWIP_IPV6 && LWIP_IPV6_MLD */ - -/** Generic data structure used for all lwIP network interfaces. - * The following fields should be filled in by the initialization - * function for the device driver: hwaddr_len, hwaddr[], mtu, flags */ -struct netif { - /** pointer to next in linked list */ - struct netif *next; - - /** IP address configuration in network byte order */ - ip_addr_t ip_addr; - ip_addr_t netmask; - ip_addr_t gw; - -#if LWIP_IPV6 - /** Array of IPv6 addresses for this netif. */ - ip6_addr_t ip6_addr[LWIP_IPV6_NUM_ADDRESSES]; - /** The state of each IPv6 address (Tentative, Preferred, etc). - * @see ip6_addr.h */ - u8_t ip6_addr_state[LWIP_IPV6_NUM_ADDRESSES]; -#endif /* LWIP_IPV6 */ - /** This function is called by the network device driver - * to pass a packet up the TCP/IP stack. */ - netif_input_fn input; - /** This function is called by the IP module when it wants - * to send a packet on the interface. This function typically - * first resolves the hardware address, then sends the packet. */ - netif_output_fn output; - /** This function is called by the ARP module when it wants - * to send a packet on the interface. This function outputs - * the pbuf as-is on the link medium. */ - netif_linkoutput_fn linkoutput; -#if LWIP_IPV6 - /** This function is called by the IPv6 module when it wants - * to send a packet on the interface. This function typically - * first resolves the hardware address, then sends the packet. */ - netif_output_ip6_fn output_ip6; -#endif /* LWIP_IPV6 */ -#if LWIP_NETIF_STATUS_CALLBACK - /** This function is called when the netif state is set to up or down - */ - netif_status_callback_fn status_callback; -#endif /* LWIP_NETIF_STATUS_CALLBACK */ -#if LWIP_NETIF_LINK_CALLBACK - /** This function is called when the netif link is set to up or down - */ - netif_status_callback_fn link_callback; -#endif /* LWIP_NETIF_LINK_CALLBACK */ -#if LWIP_NETIF_REMOVE_CALLBACK - /** This function is called when the netif has been removed */ - netif_status_callback_fn remove_callback; -#endif /* LWIP_NETIF_REMOVE_CALLBACK */ - /** This field can be set by the device driver and could point - * to state information for the device. */ - void *state; -#if LWIP_DHCP - /** the DHCP client state information for this netif */ - struct dhcp *dhcp; -#endif /* LWIP_DHCP */ -#if LWIP_AUTOIP - /** the AutoIP client state information for this netif */ - struct autoip *autoip; -#endif -#if LWIP_IPV6_AUTOCONFIG - /** is this netif enabled for IPv6 autoconfiguration */ - u8_t ip6_autoconfig_enabled; -#endif /* LWIP_IPV6_AUTOCONFIG */ -#if LWIP_IPV6_SEND_ROUTER_SOLICIT - /** Number of Router Solicitation messages that remain to be sent. */ - u8_t rs_count; -#endif /* LWIP_IPV6_SEND_ROUTER_SOLICIT */ -#if LWIP_IPV6_DHCP6 - /** the DHCPv6 client state information for this netif */ - struct dhcp6 *dhcp6; -#endif /* LWIP_IPV6_DHCP6 */ -#if LWIP_NETIF_HOSTNAME - /* the hostname for this netif, NULL is a valid value */ - char* hostname; -#endif /* LWIP_NETIF_HOSTNAME */ - /** maximum transfer unit (in bytes) */ - u16_t mtu; - /** number of bytes used in hwaddr */ - u8_t hwaddr_len; - /** link level hardware address of this interface */ - u8_t hwaddr[NETIF_MAX_HWADDR_LEN]; - /** flags (see NETIF_FLAG_ above) */ - u16_t flags; - /** descriptive abbreviation */ - char name[2]; - /** number of this interface */ - u8_t num; -#if LWIP_SNMP - /** link type (from "snmp_ifType" enum from snmp.h) */ - u8_t link_type; - /** (estimate) link speed */ - u32_t link_speed; - /** timestamp at last change made (up/down) */ - u32_t ts; - /** counters */ - u32_t ifinoctets; - u32_t ifinucastpkts; - u32_t ifinnucastpkts; - u32_t ifindiscards; - u32_t ifoutoctets; - u32_t ifoutucastpkts; - u32_t ifoutnucastpkts; - u32_t ifoutdiscards; -#endif /* LWIP_SNMP */ -#if LWIP_IGMP - /** This function could be called to add or delete an entry in the multicast - filter table of the ethernet MAC.*/ - netif_igmp_mac_filter_fn igmp_mac_filter; -#endif /* LWIP_IGMP */ -#if LWIP_IPV6 && LWIP_IPV6_MLD - /** This function could be called to add or delete an entry in the IPv6 multicast - filter table of the ethernet MAC. */ - netif_mld_mac_filter_fn mld_mac_filter; -#endif /* LWIP_IPV6 && LWIP_IPV6_MLD */ -#if LWIP_NETIF_HWADDRHINT - u8_t *addr_hint; -#endif /* LWIP_NETIF_HWADDRHINT */ -#if ENABLE_LOOPBACK - /* List of packets to be queued for ourselves. */ - struct pbuf *loop_first; - struct pbuf *loop_last; -#if LWIP_LOOPBACK_MAX_PBUFS - u16_t loop_cnt_current; -#endif /* LWIP_LOOPBACK_MAX_PBUFS */ -#endif /* ENABLE_LOOPBACK */ -}; - -#if LWIP_SNMP -#define NETIF_INIT_SNMP(netif, type, speed) \ - /* use "snmp_ifType" enum from snmp.h for "type", snmp_ifType_ethernet_csmacd by example */ \ - (netif)->link_type = (type); \ - /* your link speed here (units: bits per second) */ \ - (netif)->link_speed = (speed); \ - (netif)->ts = 0; \ - (netif)->ifinoctets = 0; \ - (netif)->ifinucastpkts = 0; \ - (netif)->ifinnucastpkts = 0; \ - (netif)->ifindiscards = 0; \ - (netif)->ifoutoctets = 0; \ - (netif)->ifoutucastpkts = 0; \ - (netif)->ifoutnucastpkts = 0; \ - (netif)->ifoutdiscards = 0 -#else /* LWIP_SNMP */ -#define NETIF_INIT_SNMP(netif, type, speed) -#endif /* LWIP_SNMP */ - - -/** The list of network interfaces. */ -extern struct netif *netif_list; -/** The default network interface. */ -extern struct netif *netif_default; - -void netif_init(void); - -struct netif *netif_add(struct netif *netif, ip_addr_t *ipaddr, ip_addr_t *netmask, - ip_addr_t *gw, void *state, netif_init_fn init, netif_input_fn input); - -void -netif_set_addr(struct netif *netif, ip_addr_t *ipaddr, ip_addr_t *netmask, - ip_addr_t *gw); -void netif_remove(struct netif * netif); - -/* Returns a network interface given its name. The name is of the form - "et0", where the first two letters are the "name" field in the - netif structure, and the digit is in the num field in the same - structure. */ -struct netif *netif_find(char *name); - -int netif_is_named (struct netif *netif, const char name[3]); - -void netif_set_default(struct netif *netif); - -void netif_set_ipaddr(struct netif *netif, ip_addr_t *ipaddr); -void netif_set_netmask(struct netif *netif, ip_addr_t *netmask); -void netif_set_gw(struct netif *netif, ip_addr_t *gw); -void netif_set_pretend_tcp(struct netif *netif, u8_t pretend); - -void netif_set_up(struct netif *netif); -void netif_set_down(struct netif *netif); -/** Ask if an interface is up */ -#define netif_is_up(netif) (((netif)->flags & NETIF_FLAG_UP) ? (u8_t)1 : (u8_t)0) - -#if LWIP_NETIF_STATUS_CALLBACK -void netif_set_status_callback(struct netif *netif, netif_status_callback_fn status_callback); -#endif /* LWIP_NETIF_STATUS_CALLBACK */ -#if LWIP_NETIF_REMOVE_CALLBACK -void netif_set_remove_callback(struct netif *netif, netif_status_callback_fn remove_callback); -#endif /* LWIP_NETIF_REMOVE_CALLBACK */ - -void netif_set_link_up(struct netif *netif); -void netif_set_link_down(struct netif *netif); -/** Ask if a link is up */ -#define netif_is_link_up(netif) (((netif)->flags & NETIF_FLAG_LINK_UP) ? (u8_t)1 : (u8_t)0) - -#if LWIP_NETIF_LINK_CALLBACK -void netif_set_link_callback(struct netif *netif, netif_status_callback_fn link_callback); -#endif /* LWIP_NETIF_LINK_CALLBACK */ - -#if LWIP_NETIF_HOSTNAME -#define netif_set_hostname(netif, name) do { if((netif) != NULL) { (netif)->hostname = name; }}while(0) -#define netif_get_hostname(netif) (((netif) != NULL) ? ((netif)->hostname) : NULL) -#endif /* LWIP_NETIF_HOSTNAME */ - -#if LWIP_IGMP -#define netif_set_igmp_mac_filter(netif, function) do { if((netif) != NULL) { (netif)->igmp_mac_filter = function; }}while(0) -#define netif_get_igmp_mac_filter(netif) (((netif) != NULL) ? ((netif)->igmp_mac_filter) : NULL) -#endif /* LWIP_IGMP */ - -#if ENABLE_LOOPBACK -err_t netif_loop_output(struct netif *netif, struct pbuf *p, ip_addr_t *dest_ip); -void netif_poll(struct netif *netif); -#if !LWIP_NETIF_LOOPBACK_MULTITHREADING -void netif_poll_all(void); -#endif /* !LWIP_NETIF_LOOPBACK_MULTITHREADING */ -#endif /* ENABLE_LOOPBACK */ - -#if LWIP_IPV6 -#define netif_ip6_addr(netif, i) (&((netif)->ip6_addr[(i)])) -#define netif_ip6_addr_state(netif, i) ((netif)->ip6_addr_state[(i)]) -#define netif_ip6_addr_set_state(netif, i, state) ((netif)->ip6_addr_state[(i)] = (state)) -s8_t netif_matches_ip6_addr(struct netif * netif, ip6_addr_t * ip6addr); -void netif_create_ip6_linklocal_address(struct netif * netif, u8_t from_mac_48bit); -#endif /* LWIP_IPV6 */ - -#if LWIP_NETIF_HWADDRHINT -#define NETIF_SET_HWADDRHINT(netif, hint) ((netif)->addr_hint = (hint)) -#else /* LWIP_NETIF_HWADDRHINT */ -#define NETIF_SET_HWADDRHINT(netif, hint) -#endif /* LWIP_NETIF_HWADDRHINT */ - -#ifdef __cplusplus -} -#endif - -#endif /* __LWIP_NETIF_H__ */ diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/lwip/netifapi.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/lwip/netifapi.h deleted file mode 100644 index 33318efa..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/lwip/netifapi.h +++ /dev/null @@ -1,108 +0,0 @@ -/* - * 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. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT - * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING - * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY - * OF SUCH DAMAGE. - * - * This file is part of the lwIP TCP/IP stack. - * - */ - -#ifndef __LWIP_NETIFAPI_H__ -#define __LWIP_NETIFAPI_H__ - -#include "lwip/opt.h" - -#if LWIP_NETIF_API /* don't build if not configured for use in lwipopts.h */ - -#include "lwip/sys.h" -#include "lwip/netif.h" -#include "lwip/dhcp.h" -#include "lwip/autoip.h" - -#ifdef __cplusplus -extern "C" { -#endif - -typedef void (*netifapi_void_fn)(struct netif *netif); -typedef err_t (*netifapi_errt_fn)(struct netif *netif); - -struct netifapi_msg_msg { -#if !LWIP_TCPIP_CORE_LOCKING - sys_sem_t sem; -#endif /* !LWIP_TCPIP_CORE_LOCKING */ - err_t err; - struct netif *netif; - union { - struct { - ip_addr_t *ipaddr; - ip_addr_t *netmask; - ip_addr_t *gw; - void *state; - netif_init_fn init; - netif_input_fn input; - } add; - struct { - netifapi_void_fn voidfunc; - netifapi_errt_fn errtfunc; - } common; - } msg; -}; - -struct netifapi_msg { - void (* function)(struct netifapi_msg_msg *msg); - struct netifapi_msg_msg msg; -}; - - -/* API for application */ -err_t netifapi_netif_add ( struct netif *netif, - ip_addr_t *ipaddr, - ip_addr_t *netmask, - ip_addr_t *gw, - void *state, - netif_init_fn init, - netif_input_fn input); - -err_t netifapi_netif_set_addr ( struct netif *netif, - ip_addr_t *ipaddr, - ip_addr_t *netmask, - ip_addr_t *gw ); - -err_t netifapi_netif_common ( struct netif *netif, - netifapi_void_fn voidfunc, - netifapi_errt_fn errtfunc); - -#define netifapi_netif_remove(n) netifapi_netif_common(n, netif_remove, NULL) -#define netifapi_netif_set_up(n) netifapi_netif_common(n, netif_set_up, NULL) -#define netifapi_netif_set_down(n) netifapi_netif_common(n, netif_set_down, NULL) -#define netifapi_netif_set_default(n) netifapi_netif_common(n, netif_set_default, NULL) -#define netifapi_dhcp_start(n) netifapi_netif_common(n, NULL, dhcp_start) -#define netifapi_dhcp_stop(n) netifapi_netif_common(n, dhcp_stop, NULL) -#define netifapi_autoip_start(n) netifapi_netif_common(n, NULL, autoip_start) -#define netifapi_autoip_stop(n) netifapi_netif_common(n, NULL, autoip_stop) - -#ifdef __cplusplus -} -#endif - -#endif /* LWIP_NETIF_API */ - -#endif /* __LWIP_NETIFAPI_H__ */ diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/lwip/opt.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/lwip/opt.h deleted file mode 100644 index e51f8e55..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/lwip/opt.h +++ /dev/null @@ -1,2417 +0,0 @@ -/** - * @file - * - * lwIP Options Configuration - */ - -/* - * Copyright (c) 2001-2004 Swedish Institute of Computer Science. - * 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. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT - * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING - * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY - * OF SUCH DAMAGE. - * - * This file is part of the lwIP TCP/IP stack. - * - * Author: Adam Dunkels - * - */ -#ifndef __LWIP_OPT_H__ -#define __LWIP_OPT_H__ - -/* - * Include user defined options first. Anything not defined in these files - * will be set to standard values. Override anything you dont like! - */ -#include "lwipopts.h" -#include "lwip/debug.h" - -/* - ----------------------------------------------- - ---------- Platform specific locking ---------- - ----------------------------------------------- -*/ - -/** - * SYS_LIGHTWEIGHT_PROT==1: if you want inter-task protection for certain - * critical regions during buffer allocation, deallocation and memory - * allocation and deallocation. - */ -#ifndef SYS_LIGHTWEIGHT_PROT -#define SYS_LIGHTWEIGHT_PROT 0 -#endif - -/** - * NO_SYS==1: Provides VERY minimal functionality. Otherwise, - * use lwIP facilities. - */ -#ifndef NO_SYS -#define NO_SYS 0 -#endif - -/** - * NO_SYS_NO_TIMERS==1: Drop support for sys_timeout when NO_SYS==1 - * Mainly for compatibility to old versions. - */ -#ifndef NO_SYS_NO_TIMERS -#define NO_SYS_NO_TIMERS 0 -#endif - -/** - * MEMCPY: override this if you have a faster implementation at hand than the - * one included in your C library - */ -#ifndef MEMCPY -#define MEMCPY(dst,src,len) memcpy(dst,src,len) -#endif - -/** - * SMEMCPY: override this with care! Some compilers (e.g. gcc) can inline a - * call to memcpy() if the length is known at compile time and is small. - */ -#ifndef SMEMCPY -#define SMEMCPY(dst,src,len) memcpy(dst,src,len) -#endif - -/* - ------------------------------------ - ---------- Memory options ---------- - ------------------------------------ -*/ -/** - * MEM_LIBC_MALLOC==1: Use malloc/free/realloc provided by your C-library - * instead of the lwip internal allocator. Can save code size if you - * already use it. - */ -#ifndef MEM_LIBC_MALLOC -#define MEM_LIBC_MALLOC 0 -#endif - -/** -* MEMP_MEM_MALLOC==1: Use mem_malloc/mem_free instead of the lwip pool allocator. -* Especially useful with MEM_LIBC_MALLOC but handle with care regarding execution -* speed and usage from interrupts! -*/ -#ifndef MEMP_MEM_MALLOC -#define MEMP_MEM_MALLOC 0 -#endif - -/** - * MEM_ALIGNMENT: should be set to the alignment of the CPU - * 4 byte alignment -> #define MEM_ALIGNMENT 4 - * 2 byte alignment -> #define MEM_ALIGNMENT 2 - */ -#ifndef MEM_ALIGNMENT -#define MEM_ALIGNMENT 1 -#endif - -/** - * MEM_SIZE: the size of the heap memory. If the application will send - * a lot of data that needs to be copied, this should be set high. - */ -#ifndef MEM_SIZE -#define MEM_SIZE 1600 -#endif - -/** - * MEMP_SEPARATE_POOLS: if defined to 1, each pool is placed in its own array. - * This can be used to individually change the location of each pool. - * Default is one big array for all pools - */ -#ifndef MEMP_SEPARATE_POOLS -#define MEMP_SEPARATE_POOLS 0 -#endif - -/** - * MEMP_OVERFLOW_CHECK: memp overflow protection reserves a configurable - * amount of bytes before and after each memp element in every pool and fills - * it with a prominent default value. - * MEMP_OVERFLOW_CHECK == 0 no checking - * MEMP_OVERFLOW_CHECK == 1 checks each element when it is freed - * MEMP_OVERFLOW_CHECK >= 2 checks each element in every pool every time - * memp_malloc() or memp_free() is called (useful but slow!) - */ -#ifndef MEMP_OVERFLOW_CHECK -#define MEMP_OVERFLOW_CHECK 0 -#endif - -/** - * MEMP_SANITY_CHECK==1: run a sanity check after each memp_free() to make - * sure that there are no cycles in the linked lists. - */ -#ifndef MEMP_SANITY_CHECK -#define MEMP_SANITY_CHECK 0 -#endif - -/** - * MEM_USE_POOLS==1: Use an alternative to malloc() by allocating from a set - * of memory pools of various sizes. When mem_malloc is called, an element of - * the smallest pool that can provide the length needed is returned. - * To use this, MEMP_USE_CUSTOM_POOLS also has to be enabled. - */ -#ifndef MEM_USE_POOLS -#define MEM_USE_POOLS 0 -#endif - -/** - * MEM_USE_POOLS_TRY_BIGGER_POOL==1: if one malloc-pool is empty, try the next - * bigger pool - WARNING: THIS MIGHT WASTE MEMORY but it can make a system more - * reliable. */ -#ifndef MEM_USE_POOLS_TRY_BIGGER_POOL -#define MEM_USE_POOLS_TRY_BIGGER_POOL 0 -#endif - -/** - * MEMP_USE_CUSTOM_POOLS==1: whether to include a user file lwippools.h - * that defines additional pools beyond the "standard" ones required - * by lwIP. If you set this to 1, you must have lwippools.h in your - * inlude path somewhere. - */ -#ifndef MEMP_USE_CUSTOM_POOLS -#define MEMP_USE_CUSTOM_POOLS 0 -#endif - -/** - * Set this to 1 if you want to free PBUF_RAM pbufs (or call mem_free()) from - * interrupt context (or another context that doesn't allow waiting for a - * semaphore). - * If set to 1, mem_malloc will be protected by a semaphore and SYS_ARCH_PROTECT, - * while mem_free will only use SYS_ARCH_PROTECT. mem_malloc SYS_ARCH_UNPROTECTs - * with each loop so that mem_free can run. - * - * ATTENTION: As you can see from the above description, this leads to dis-/ - * enabling interrupts often, which can be slow! Also, on low memory, mem_malloc - * can need longer. - * - * If you don't want that, at least for NO_SYS=0, you can still use the following - * functions to enqueue a deallocation call which then runs in the tcpip_thread - * context: - * - pbuf_free_callback(p); - * - mem_free_callback(m); - */ -#ifndef LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT -#define LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT 0 -#endif - -/* - ------------------------------------------------ - ---------- Internal Memory Pool Sizes ---------- - ------------------------------------------------ -*/ -/** - * MEMP_NUM_PBUF: the number of memp struct pbufs (used for PBUF_ROM and PBUF_REF). - * If the application sends a lot of data out of ROM (or other static memory), - * this should be set high. - */ -#ifndef MEMP_NUM_PBUF -#define MEMP_NUM_PBUF 16 -#endif - -/** - * MEMP_NUM_RAW_PCB: Number of raw connection PCBs - * (requires the LWIP_RAW option) - */ -#ifndef MEMP_NUM_RAW_PCB -#define MEMP_NUM_RAW_PCB 4 -#endif - -/** - * MEMP_NUM_UDP_PCB: the number of UDP protocol control blocks. One - * per active UDP "connection". - * (requires the LWIP_UDP option) - */ -#ifndef MEMP_NUM_UDP_PCB -#define MEMP_NUM_UDP_PCB 4 -#endif - -/** - * MEMP_NUM_TCP_PCB: the number of simulatenously active TCP connections. - * (requires the LWIP_TCP option) - */ -#ifndef MEMP_NUM_TCP_PCB -#define MEMP_NUM_TCP_PCB 5 -#endif - -/** - * MEMP_NUM_TCP_PCB_LISTEN: the number of listening TCP connections. - * (requires the LWIP_TCP option) - */ -#ifndef MEMP_NUM_TCP_PCB_LISTEN -#define MEMP_NUM_TCP_PCB_LISTEN 8 -#endif - -/** - * MEMP_NUM_TCP_SEG: the number of simultaneously queued TCP segments. - * (requires the LWIP_TCP option) - */ -#ifndef MEMP_NUM_TCP_SEG -#define MEMP_NUM_TCP_SEG 16 -#endif - -/** - * MEMP_NUM_REASSDATA: the number of IP packets simultaneously queued for - * reassembly (whole packets, not fragments!) - */ -#ifndef MEMP_NUM_REASSDATA -#define MEMP_NUM_REASSDATA 5 -#endif - -/** - * MEMP_NUM_FRAG_PBUF: the number of IP fragments simultaneously sent - * (fragments, not whole packets!). - * This is only used with IP_FRAG_USES_STATIC_BUF==0 and - * LWIP_NETIF_TX_SINGLE_PBUF==0 and only has to be > 1 with DMA-enabled MACs - * where the packet is not yet sent when netif->output returns. - */ -#ifndef MEMP_NUM_FRAG_PBUF -#define MEMP_NUM_FRAG_PBUF 15 -#endif - -/** - * MEMP_NUM_ARP_QUEUE: the number of simulateously queued outgoing - * packets (pbufs) that are waiting for an ARP request (to resolve - * their destination address) to finish. - * (requires the ARP_QUEUEING option) - */ -#ifndef MEMP_NUM_ARP_QUEUE -#define MEMP_NUM_ARP_QUEUE 30 -#endif - -/** - * MEMP_NUM_IGMP_GROUP: The number of multicast groups whose network interfaces - * can be members et the same time (one per netif - allsystems group -, plus one - * per netif membership). - * (requires the LWIP_IGMP option) - */ -#ifndef MEMP_NUM_IGMP_GROUP -#define MEMP_NUM_IGMP_GROUP 8 -#endif - -/** - * MEMP_NUM_SYS_TIMEOUT: the number of simulateously active timeouts. - * (requires NO_SYS==0) - * The default number of timeouts is calculated here for all enabled modules. - * The formula expects settings to be either '0' or '1'. - */ -#ifndef MEMP_NUM_SYS_TIMEOUT -#define MEMP_NUM_SYS_TIMEOUT (LWIP_TCP + IP_REASSEMBLY + LWIP_ARP + (2*LWIP_DHCP) + LWIP_AUTOIP + LWIP_IGMP + LWIP_DNS + PPP_SUPPORT + (LWIP_IPV6 ? (1 + LWIP_IPV6_REASS + LWIP_IPV6_MLD) : 0)) -#endif - -/** - * MEMP_NUM_NETBUF: the number of struct netbufs. - * (only needed if you use the sequential API, like api_lib.c) - */ -#ifndef MEMP_NUM_NETBUF -#define MEMP_NUM_NETBUF 2 -#endif - -/** - * MEMP_NUM_NETCONN: the number of struct netconns. - * (only needed if you use the sequential API, like api_lib.c) - */ -#ifndef MEMP_NUM_NETCONN -#define MEMP_NUM_NETCONN 4 -#endif - -/** - * MEMP_NUM_TCPIP_MSG_API: the number of struct tcpip_msg, which are used - * for callback/timeout API communication. - * (only needed if you use tcpip.c) - */ -#ifndef MEMP_NUM_TCPIP_MSG_API -#define MEMP_NUM_TCPIP_MSG_API 8 -#endif - -/** - * MEMP_NUM_TCPIP_MSG_INPKT: the number of struct tcpip_msg, which are used - * for incoming packets. - * (only needed if you use tcpip.c) - */ -#ifndef MEMP_NUM_TCPIP_MSG_INPKT -#define MEMP_NUM_TCPIP_MSG_INPKT 8 -#endif - -/** - * MEMP_NUM_SNMP_NODE: the number of leafs in the SNMP tree. - */ -#ifndef MEMP_NUM_SNMP_NODE -#define MEMP_NUM_SNMP_NODE 50 -#endif - -/** - * MEMP_NUM_SNMP_ROOTNODE: the number of branches in the SNMP tree. - * Every branch has one leaf (MEMP_NUM_SNMP_NODE) at least! - */ -#ifndef MEMP_NUM_SNMP_ROOTNODE -#define MEMP_NUM_SNMP_ROOTNODE 30 -#endif - -/** - * MEMP_NUM_SNMP_VARBIND: the number of concurrent requests (does not have to - * be changed normally) - 2 of these are used per request (1 for input, - * 1 for output) - */ -#ifndef MEMP_NUM_SNMP_VARBIND -#define MEMP_NUM_SNMP_VARBIND 2 -#endif - -/** - * MEMP_NUM_SNMP_VALUE: the number of OID or values concurrently used - * (does not have to be changed normally) - 3 of these are used per request - * (1 for the value read and 2 for OIDs - input and output) - */ -#ifndef MEMP_NUM_SNMP_VALUE -#define MEMP_NUM_SNMP_VALUE 3 -#endif - -/** - * MEMP_NUM_NETDB: the number of concurrently running lwip_addrinfo() calls - * (before freeing the corresponding memory using lwip_freeaddrinfo()). - */ -#ifndef MEMP_NUM_NETDB -#define MEMP_NUM_NETDB 1 -#endif - -/** - * MEMP_NUM_LOCALHOSTLIST: the number of host entries in the local host list - * if DNS_LOCAL_HOSTLIST_IS_DYNAMIC==1. - */ -#ifndef MEMP_NUM_LOCALHOSTLIST -#define MEMP_NUM_LOCALHOSTLIST 1 -#endif - -/** - * MEMP_NUM_PPPOE_INTERFACES: the number of concurrently active PPPoE - * interfaces (only used with PPPOE_SUPPORT==1) - */ -#ifndef MEMP_NUM_PPPOE_INTERFACES -#define MEMP_NUM_PPPOE_INTERFACES 1 -#endif - -/** - * PBUF_POOL_SIZE: the number of buffers in the pbuf pool. - */ -#ifndef PBUF_POOL_SIZE -#define PBUF_POOL_SIZE 16 -#endif - -/* - --------------------------------- - ---------- ARP options ---------- - --------------------------------- -*/ -/** - * LWIP_ARP==1: Enable ARP functionality. - */ -#ifndef LWIP_ARP -#define LWIP_ARP 1 -#endif - -/** - * ARP_TABLE_SIZE: Number of active MAC-IP address pairs cached. - */ -#ifndef ARP_TABLE_SIZE -#define ARP_TABLE_SIZE 10 -#endif - -/** - * ARP_QUEUEING==1: Multiple outgoing packets are queued during hardware address - * resolution. By default, only the most recent packet is queued per IP address. - * This is sufficient for most protocols and mainly reduces TCP connection - * startup time. Set this to 1 if you know your application sends more than one - * packet in a row to an IP address that is not in the ARP cache. - */ -#ifndef ARP_QUEUEING -#define ARP_QUEUEING 0 -#endif - -/** - * ETHARP_TRUST_IP_MAC==1: Incoming IP packets cause the ARP table to be - * updated with the source MAC and IP addresses supplied in the packet. - * You may want to disable this if you do not trust LAN peers to have the - * correct addresses, or as a limited approach to attempt to handle - * spoofing. If disabled, lwIP will need to make a new ARP request if - * the peer is not already in the ARP table, adding a little latency. - * The peer *is* in the ARP table if it requested our address before. - * Also notice that this slows down input processing of every IP packet! - */ -#ifndef ETHARP_TRUST_IP_MAC -#define ETHARP_TRUST_IP_MAC 0 -#endif - -/** - * ETHARP_SUPPORT_VLAN==1: support receiving ethernet packets with VLAN header. - * Additionally, you can define ETHARP_VLAN_CHECK to an u16_t VLAN ID to check. - * If ETHARP_VLAN_CHECK is defined, only VLAN-traffic for this VLAN is accepted. - * If ETHARP_VLAN_CHECK is not defined, all traffic is accepted. - * Alternatively, define a function/define ETHARP_VLAN_CHECK_FN(eth_hdr, vlan) - * that returns 1 to accept a packet or 0 to drop a packet. - */ -#ifndef ETHARP_SUPPORT_VLAN -#define ETHARP_SUPPORT_VLAN 0 -#endif - -/** LWIP_ETHERNET==1: enable ethernet support for PPPoE even though ARP - * might be disabled - */ -#ifndef LWIP_ETHERNET -#define LWIP_ETHERNET (LWIP_ARP || PPPOE_SUPPORT) -#endif - -/** ETH_PAD_SIZE: number of bytes added before the ethernet header to ensure - * alignment of payload after that header. Since the header is 14 bytes long, - * without this padding e.g. addresses in the IP header will not be aligned - * on a 32-bit boundary, so setting this to 2 can speed up 32-bit-platforms. - */ -#ifndef ETH_PAD_SIZE -#define ETH_PAD_SIZE 0 -#endif - -/** ETHARP_SUPPORT_STATIC_ENTRIES==1: enable code to support static ARP table - * entries (using etharp_add_static_entry/etharp_remove_static_entry). - */ -#ifndef ETHARP_SUPPORT_STATIC_ENTRIES -#define ETHARP_SUPPORT_STATIC_ENTRIES 0 -#endif - - -/* - -------------------------------- - ---------- IP options ---------- - -------------------------------- -*/ -/** - * IP_FORWARD==1: Enables the ability to forward IP packets across network - * interfaces. If you are going to run lwIP on a device with only one network - * interface, define this to 0. - */ -#ifndef IP_FORWARD -#define IP_FORWARD 0 -#endif - -/** - * IP_OPTIONS_ALLOWED: Defines the behavior for IP options. - * IP_OPTIONS_ALLOWED==0: All packets with IP options are dropped. - * IP_OPTIONS_ALLOWED==1: IP options are allowed (but not parsed). - */ -#ifndef IP_OPTIONS_ALLOWED -#define IP_OPTIONS_ALLOWED 1 -#endif - -/** - * IP_REASSEMBLY==1: Reassemble incoming fragmented IP packets. Note that - * this option does not affect outgoing packet sizes, which can be controlled - * via IP_FRAG. - */ -#ifndef IP_REASSEMBLY -#define IP_REASSEMBLY 1 -#endif - -/** - * IP_FRAG==1: Fragment outgoing IP packets if their size exceeds MTU. Note - * that this option does not affect incoming packet sizes, which can be - * controlled via IP_REASSEMBLY. - */ -#ifndef IP_FRAG -#define IP_FRAG 1 -#endif - -/** - * IP_REASS_MAXAGE: Maximum time (in multiples of IP_TMR_INTERVAL - so seconds, normally) - * a fragmented IP packet waits for all fragments to arrive. If not all fragments arrived - * in this time, the whole packet is discarded. - */ -#ifndef IP_REASS_MAXAGE -#define IP_REASS_MAXAGE 3 -#endif - -/** - * IP_REASS_MAX_PBUFS: Total maximum amount of pbufs waiting to be reassembled. - * Since the received pbufs are enqueued, be sure to configure - * PBUF_POOL_SIZE > IP_REASS_MAX_PBUFS so that the stack is still able to receive - * packets even if the maximum amount of fragments is enqueued for reassembly! - */ -#ifndef IP_REASS_MAX_PBUFS -#define IP_REASS_MAX_PBUFS 10 -#endif - -/** - * IP_FRAG_USES_STATIC_BUF==1: Use a static MTU-sized buffer for IP - * fragmentation. Otherwise pbufs are allocated and reference the original - * packet data to be fragmented (or with LWIP_NETIF_TX_SINGLE_PBUF==1, - * new PBUF_RAM pbufs are used for fragments). - * ATTENTION: IP_FRAG_USES_STATIC_BUF==1 may not be used for DMA-enabled MACs! - */ -#ifndef IP_FRAG_USES_STATIC_BUF -#define IP_FRAG_USES_STATIC_BUF 0 -#endif - -/** - * IP_FRAG_MAX_MTU: Assumed max MTU on any interface for IP frag buffer - * (requires IP_FRAG_USES_STATIC_BUF==1) - */ -#if IP_FRAG_USES_STATIC_BUF && !defined(IP_FRAG_MAX_MTU) -#define IP_FRAG_MAX_MTU 1500 -#endif - -/** - * IP_DEFAULT_TTL: Default value for Time-To-Live used by transport layers. - */ -#ifndef IP_DEFAULT_TTL -#define IP_DEFAULT_TTL 255 -#endif - -/** - * IP_SOF_BROADCAST=1: Use the SOF_BROADCAST field to enable broadcast - * filter per pcb on udp and raw send operations. To enable broadcast filter - * on recv operations, you also have to set IP_SOF_BROADCAST_RECV=1. - */ -#ifndef IP_SOF_BROADCAST -#define IP_SOF_BROADCAST 0 -#endif - -/** - * IP_SOF_BROADCAST_RECV (requires IP_SOF_BROADCAST=1) enable the broadcast - * filter on recv operations. - */ -#ifndef IP_SOF_BROADCAST_RECV -#define IP_SOF_BROADCAST_RECV 0 -#endif - -/** - * IP_FORWARD_ALLOW_TX_ON_RX_NETIF==1: allow ip_forward() to send packets back - * out on the netif where it was received. This should only be used for - * wireless networks. - * ATTENTION: When this is 1, make sure your netif driver correctly marks incoming - * link-layer-broadcast/multicast packets as such using the corresponding pbuf flags! - */ -#ifndef IP_FORWARD_ALLOW_TX_ON_RX_NETIF -#define IP_FORWARD_ALLOW_TX_ON_RX_NETIF 0 -#endif - -/** - * LWIP_RANDOMIZE_INITIAL_LOCAL_PORTS==1: randomize the local port for the first - * local TCP/UDP pcb (default==0). This can prevent creating predictable port - * numbers after booting a device. - */ -#ifndef LWIP_RANDOMIZE_INITIAL_LOCAL_PORTS -#define LWIP_RANDOMIZE_INITIAL_LOCAL_PORTS 0 -#endif - -/* - ---------------------------------- - ---------- ICMP options ---------- - ---------------------------------- -*/ -/** - * LWIP_ICMP==1: Enable ICMP module inside the IP stack. - * Be careful, disable that make your product non-compliant to RFC1122 - */ -#ifndef LWIP_ICMP -#define LWIP_ICMP 1 -#endif - -/** - * ICMP_TTL: Default value for Time-To-Live used by ICMP packets. - */ -#ifndef ICMP_TTL -#define ICMP_TTL (IP_DEFAULT_TTL) -#endif - -/** - * LWIP_BROADCAST_PING==1: respond to broadcast pings (default is unicast only) - */ -#ifndef LWIP_BROADCAST_PING -#define LWIP_BROADCAST_PING 0 -#endif - -/** - * LWIP_MULTICAST_PING==1: respond to multicast pings (default is unicast only) - */ -#ifndef LWIP_MULTICAST_PING -#define LWIP_MULTICAST_PING 0 -#endif - -/* - --------------------------------- - ---------- RAW options ---------- - --------------------------------- -*/ -/** - * LWIP_RAW==1: Enable application layer to hook into the IP layer itself. - */ -#ifndef LWIP_RAW -#define LWIP_RAW 1 -#endif - -/** - * LWIP_RAW==1: Enable application layer to hook into the IP layer itself. - */ -#ifndef RAW_TTL -#define RAW_TTL (IP_DEFAULT_TTL) -#endif - -/* - ---------------------------------- - ---------- DHCP options ---------- - ---------------------------------- -*/ -/** - * LWIP_DHCP==1: Enable DHCP module. - */ -#ifndef LWIP_DHCP -#define LWIP_DHCP 0 -#endif - -/** - * DHCP_DOES_ARP_CHECK==1: Do an ARP check on the offered address. - */ -#ifndef DHCP_DOES_ARP_CHECK -#define DHCP_DOES_ARP_CHECK ((LWIP_DHCP) && (LWIP_ARP)) -#endif - -/* - ------------------------------------ - ---------- AUTOIP options ---------- - ------------------------------------ -*/ -/** - * LWIP_AUTOIP==1: Enable AUTOIP module. - */ -#ifndef LWIP_AUTOIP -#define LWIP_AUTOIP 0 -#endif - -/** - * LWIP_DHCP_AUTOIP_COOP==1: Allow DHCP and AUTOIP to be both enabled on - * the same interface at the same time. - */ -#ifndef LWIP_DHCP_AUTOIP_COOP -#define LWIP_DHCP_AUTOIP_COOP 0 -#endif - -/** - * LWIP_DHCP_AUTOIP_COOP_TRIES: Set to the number of DHCP DISCOVER probes - * that should be sent before falling back on AUTOIP. This can be set - * as low as 1 to get an AutoIP address very quickly, but you should - * be prepared to handle a changing IP address when DHCP overrides - * AutoIP. - */ -#ifndef LWIP_DHCP_AUTOIP_COOP_TRIES -#define LWIP_DHCP_AUTOIP_COOP_TRIES 9 -#endif - -/* - ---------------------------------- - ---------- SNMP options ---------- - ---------------------------------- -*/ -/** - * LWIP_SNMP==1: Turn on SNMP module. UDP must be available for SNMP - * transport. - */ -#ifndef LWIP_SNMP -#define LWIP_SNMP 0 -#endif - -/** - * SNMP_CONCURRENT_REQUESTS: Number of concurrent requests the module will - * allow. At least one request buffer is required. - * Does not have to be changed unless external MIBs answer request asynchronously - */ -#ifndef SNMP_CONCURRENT_REQUESTS -#define SNMP_CONCURRENT_REQUESTS 1 -#endif - -/** - * SNMP_TRAP_DESTINATIONS: Number of trap destinations. At least one trap - * destination is required - */ -#ifndef SNMP_TRAP_DESTINATIONS -#define SNMP_TRAP_DESTINATIONS 1 -#endif - -/** - * SNMP_PRIVATE_MIB: - * When using a private MIB, you have to create a file 'private_mib.h' that contains - * a 'struct mib_array_node mib_private' which contains your MIB. - */ -#ifndef SNMP_PRIVATE_MIB -#define SNMP_PRIVATE_MIB 0 -#endif - -/** - * Only allow SNMP write actions that are 'safe' (e.g. disabeling netifs is not - * a safe action and disabled when SNMP_SAFE_REQUESTS = 1). - * Unsafe requests are disabled by default! - */ -#ifndef SNMP_SAFE_REQUESTS -#define SNMP_SAFE_REQUESTS 1 -#endif - -/** - * The maximum length of strings used. This affects the size of - * MEMP_SNMP_VALUE elements. - */ -#ifndef SNMP_MAX_OCTET_STRING_LEN -#define SNMP_MAX_OCTET_STRING_LEN 127 -#endif - -/** - * The maximum depth of the SNMP tree. - * With private MIBs enabled, this depends on your MIB! - * This affects the size of MEMP_SNMP_VALUE elements. - */ -#ifndef SNMP_MAX_TREE_DEPTH -#define SNMP_MAX_TREE_DEPTH 15 -#endif - -/** - * The size of the MEMP_SNMP_VALUE elements, normally calculated from - * SNMP_MAX_OCTET_STRING_LEN and SNMP_MAX_TREE_DEPTH. - */ -#ifndef SNMP_MAX_VALUE_SIZE -#define SNMP_MAX_VALUE_SIZE LWIP_MAX((SNMP_MAX_OCTET_STRING_LEN)+1, sizeof(s32_t)*(SNMP_MAX_TREE_DEPTH)) -#endif - -/* - ---------------------------------- - ---------- IGMP options ---------- - ---------------------------------- -*/ -/** - * LWIP_IGMP==1: Turn on IGMP module. - */ -#ifndef LWIP_IGMP -#define LWIP_IGMP 0 -#endif - -/* - ---------------------------------- - ---------- DNS options ----------- - ---------------------------------- -*/ -/** - * LWIP_DNS==1: Turn on DNS module. UDP must be available for DNS - * transport. - */ -#ifndef LWIP_DNS -#define LWIP_DNS 0 -#endif - -/** DNS maximum number of entries to maintain locally. */ -#ifndef DNS_TABLE_SIZE -#define DNS_TABLE_SIZE 4 -#endif - -/** DNS maximum host name length supported in the name table. */ -#ifndef DNS_MAX_NAME_LENGTH -#define DNS_MAX_NAME_LENGTH 256 -#endif - -/** The maximum of DNS servers */ -#ifndef DNS_MAX_SERVERS -#define DNS_MAX_SERVERS 2 -#endif - -/** DNS do a name checking between the query and the response. */ -#ifndef DNS_DOES_NAME_CHECK -#define DNS_DOES_NAME_CHECK 1 -#endif - -/** DNS message max. size. Default value is RFC compliant. */ -#ifndef DNS_MSG_SIZE -#define DNS_MSG_SIZE 512 -#endif - -/** DNS_LOCAL_HOSTLIST: Implements a local host-to-address list. If enabled, - * you have to define - * #define DNS_LOCAL_HOSTLIST_INIT {{"host1", 0x123}, {"host2", 0x234}} - * (an array of structs name/address, where address is an u32_t in network - * byte order). - * - * Instead, you can also use an external function: - * #define DNS_LOOKUP_LOCAL_EXTERN(x) extern u32_t my_lookup_function(const char *name) - * that returns the IP address or INADDR_NONE if not found. - */ -#ifndef DNS_LOCAL_HOSTLIST -#define DNS_LOCAL_HOSTLIST 0 -#endif /* DNS_LOCAL_HOSTLIST */ - -/** If this is turned on, the local host-list can be dynamically changed - * at runtime. */ -#ifndef DNS_LOCAL_HOSTLIST_IS_DYNAMIC -#define DNS_LOCAL_HOSTLIST_IS_DYNAMIC 0 -#endif /* DNS_LOCAL_HOSTLIST_IS_DYNAMIC */ - -/* - --------------------------------- - ---------- UDP options ---------- - --------------------------------- -*/ -/** - * LWIP_UDP==1: Turn on UDP. - */ -#ifndef LWIP_UDP -#define LWIP_UDP 1 -#endif - -/** - * LWIP_UDPLITE==1: Turn on UDP-Lite. (Requires LWIP_UDP) - */ -#ifndef LWIP_UDPLITE -#define LWIP_UDPLITE 0 -#endif - -/** - * UDP_TTL: Default Time-To-Live value. - */ -#ifndef UDP_TTL -#define UDP_TTL (IP_DEFAULT_TTL) -#endif - -/** - * LWIP_NETBUF_RECVINFO==1: append destination addr and port to every netbuf. - */ -#ifndef LWIP_NETBUF_RECVINFO -#define LWIP_NETBUF_RECVINFO 0 -#endif - -/* - --------------------------------- - ---------- TCP options ---------- - --------------------------------- -*/ -/** - * LWIP_TCP==1: Turn on TCP. - */ -#ifndef LWIP_TCP -#define LWIP_TCP 1 -#endif - -/** - * TCP_TTL: Default Time-To-Live value. - */ -#ifndef TCP_TTL -#define TCP_TTL (IP_DEFAULT_TTL) -#endif - -/** - * TCP_WND: The size of a TCP window. This must be at least - * (2 * TCP_MSS) for things to work well - */ -#ifndef TCP_WND -#define TCP_WND (4 * TCP_MSS) -#endif - -/** - * TCP_MAXRTX: Maximum number of retransmissions of data segments. - */ -#ifndef TCP_MAXRTX -#define TCP_MAXRTX 12 -#endif - -/** - * TCP_SYNMAXRTX: Maximum number of retransmissions of SYN segments. - */ -#ifndef TCP_SYNMAXRTX -#define TCP_SYNMAXRTX 6 -#endif - -/** - * TCP_QUEUE_OOSEQ==1: TCP will queue segments that arrive out of order. - * Define to 0 if your device is low on memory. - */ -#ifndef TCP_QUEUE_OOSEQ -#define TCP_QUEUE_OOSEQ (LWIP_TCP) -#endif - -/** - * TCP_MSS: TCP Maximum segment size. (default is 536, a conservative default, - * you might want to increase this.) - * For the receive side, this MSS is advertised to the remote side - * when opening a connection. For the transmit size, this MSS sets - * an upper limit on the MSS advertised by the remote host. - */ -#ifndef TCP_MSS -#define TCP_MSS 536 -#endif - -/** - * TCP_CALCULATE_EFF_SEND_MSS: "The maximum size of a segment that TCP really - * sends, the 'effective send MSS,' MUST be the smaller of the send MSS (which - * reflects the available reassembly buffer size at the remote host) and the - * largest size permitted by the IP layer" (RFC 1122) - * Setting this to 1 enables code that checks TCP_MSS against the MTU of the - * netif used for a connection and limits the MSS if it would be too big otherwise. - */ -#ifndef TCP_CALCULATE_EFF_SEND_MSS -#define TCP_CALCULATE_EFF_SEND_MSS 1 -#endif - - -/** - * TCP_SND_BUF: TCP sender buffer space (bytes). - * To achieve good performance, this should be at least 2 * TCP_MSS. - */ -#ifndef TCP_SND_BUF -#define TCP_SND_BUF (2 * TCP_MSS) -#endif - -/** - * TCP_SND_QUEUELEN: TCP sender buffer space (pbufs). This must be at least - * as much as (2 * TCP_SND_BUF/TCP_MSS) for things to work. - */ -#ifndef TCP_SND_QUEUELEN -#define TCP_SND_QUEUELEN ((4 * (TCP_SND_BUF) + (TCP_MSS - 1))/(TCP_MSS)) -#endif - -/** - * TCP_SNDLOWAT: TCP writable space (bytes). This must be less than - * TCP_SND_BUF. It is the amount of space which must be available in the - * TCP snd_buf for select to return writable (combined with TCP_SNDQUEUELOWAT). - */ -#ifndef TCP_SNDLOWAT -#define TCP_SNDLOWAT LWIP_MIN(LWIP_MAX(((TCP_SND_BUF)/2), (2 * TCP_MSS) + 1), (TCP_SND_BUF) - 1) -#endif - -/** - * TCP_SNDQUEUELOWAT: TCP writable bufs (pbuf count). This must be less - * than TCP_SND_QUEUELEN. If the number of pbufs queued on a pcb drops below - * this number, select returns writable (combined with TCP_SNDLOWAT). - */ -#ifndef TCP_SNDQUEUELOWAT -#define TCP_SNDQUEUELOWAT LWIP_MAX(((TCP_SND_QUEUELEN)/2), 5) -#endif - -/** - * TCP_OOSEQ_MAX_BYTES: The maximum number of bytes queued on ooseq per pcb. - * Default is 0 (no limit). Only valid for TCP_QUEUE_OOSEQ==0. - */ -#ifndef TCP_OOSEQ_MAX_BYTES -#define TCP_OOSEQ_MAX_BYTES 0 -#endif - -/** - * TCP_OOSEQ_MAX_PBUFS: The maximum number of pbufs queued on ooseq per pcb. - * Default is 0 (no limit). Only valid for TCP_QUEUE_OOSEQ==0. - */ -#ifndef TCP_OOSEQ_MAX_PBUFS -#define TCP_OOSEQ_MAX_PBUFS 0 -#endif - -/** - * TCP_LISTEN_BACKLOG: Enable the backlog option for tcp listen pcb. - */ -#ifndef TCP_LISTEN_BACKLOG -#define TCP_LISTEN_BACKLOG 0 -#endif - -/** - * The maximum allowed backlog for TCP listen netconns. - * This backlog is used unless another is explicitly specified. - * 0xff is the maximum (u8_t). - */ -#ifndef TCP_DEFAULT_LISTEN_BACKLOG -#define TCP_DEFAULT_LISTEN_BACKLOG 0xff -#endif - -/** - * TCP_OVERSIZE: The maximum number of bytes that tcp_write may - * allocate ahead of time in an attempt to create shorter pbuf chains - * for transmission. The meaningful range is 0 to TCP_MSS. Some - * suggested values are: - * - * 0: Disable oversized allocation. Each tcp_write() allocates a new - pbuf (old behaviour). - * 1: Allocate size-aligned pbufs with minimal excess. Use this if your - * scatter-gather DMA requires aligned fragments. - * 128: Limit the pbuf/memory overhead to 20%. - * TCP_MSS: Try to create unfragmented TCP packets. - * TCP_MSS/4: Try to create 4 fragments or less per TCP packet. - */ -#ifndef TCP_OVERSIZE -#define TCP_OVERSIZE TCP_MSS -#endif - -/** - * LWIP_TCP_TIMESTAMPS==1: support the TCP timestamp option. - */ -#ifndef LWIP_TCP_TIMESTAMPS -#define LWIP_TCP_TIMESTAMPS 0 -#endif - -/** - * TCP_WND_UPDATE_THRESHOLD: difference in window to trigger an - * explicit window update - */ -#ifndef TCP_WND_UPDATE_THRESHOLD -#define TCP_WND_UPDATE_THRESHOLD (TCP_WND / 4) -#endif - -/** - * LWIP_EVENT_API and LWIP_CALLBACK_API: Only one of these should be set to 1. - * LWIP_EVENT_API==1: The user defines lwip_tcp_event() to receive all - * events (accept, sent, etc) that happen in the system. - * LWIP_CALLBACK_API==1: The PCB callback function is called directly - * for the event. This is the default. - */ -#if !defined(LWIP_EVENT_API) && !defined(LWIP_CALLBACK_API) -#define LWIP_EVENT_API 0 -#define LWIP_CALLBACK_API 1 -#endif - - -/* - ---------------------------------- - ---------- Pbuf options ---------- - ---------------------------------- -*/ -/** - * PBUF_LINK_HLEN: the number of bytes that should be allocated for a - * link level header. The default is 14, the standard value for - * Ethernet. - */ -#ifndef PBUF_LINK_HLEN -#define PBUF_LINK_HLEN (14 + ETH_PAD_SIZE) -#endif - -/** - * PBUF_POOL_BUFSIZE: the size of each pbuf in the pbuf pool. The default is - * designed to accomodate single full size TCP frame in one pbuf, including - * TCP_MSS, IP header, and link header. - */ -#ifndef PBUF_POOL_BUFSIZE -#define PBUF_POOL_BUFSIZE LWIP_MEM_ALIGN_SIZE(TCP_MSS+40+PBUF_LINK_HLEN) -#endif - -/* - ------------------------------------------------ - ---------- Network Interfaces options ---------- - ------------------------------------------------ -*/ -/** - * LWIP_NETIF_HOSTNAME==1: use DHCP_OPTION_HOSTNAME with netif's hostname - * field. - */ -#ifndef LWIP_NETIF_HOSTNAME -#define LWIP_NETIF_HOSTNAME 0 -#endif - -/** - * LWIP_NETIF_API==1: Support netif api (in netifapi.c) - */ -#ifndef LWIP_NETIF_API -#define LWIP_NETIF_API 0 -#endif - -/** - * LWIP_NETIF_STATUS_CALLBACK==1: Support a callback function whenever an interface - * changes its up/down status (i.e., due to DHCP IP acquistion) - */ -#ifndef LWIP_NETIF_STATUS_CALLBACK -#define LWIP_NETIF_STATUS_CALLBACK 0 -#endif - -/** - * LWIP_NETIF_LINK_CALLBACK==1: Support a callback function from an interface - * whenever the link changes (i.e., link down) - */ -#ifndef LWIP_NETIF_LINK_CALLBACK -#define LWIP_NETIF_LINK_CALLBACK 0 -#endif - -/** - * LWIP_NETIF_REMOVE_CALLBACK==1: Support a callback function that is called - * when a netif has been removed - */ -#ifndef LWIP_NETIF_REMOVE_CALLBACK -#define LWIP_NETIF_REMOVE_CALLBACK 0 -#endif - -/** - * LWIP_NETIF_HWADDRHINT==1: Cache link-layer-address hints (e.g. table - * indices) in struct netif. TCP and UDP can make use of this to prevent - * scanning the ARP table for every sent packet. While this is faster for big - * ARP tables or many concurrent connections, it might be counterproductive - * if you have a tiny ARP table or if there never are concurrent connections. - */ -#ifndef LWIP_NETIF_HWADDRHINT -#define LWIP_NETIF_HWADDRHINT 0 -#endif - -/** - * LWIP_NETIF_LOOPBACK==1: Support sending packets with a destination IP - * address equal to the netif IP address, looping them back up the stack. - */ -#ifndef LWIP_NETIF_LOOPBACK -#define LWIP_NETIF_LOOPBACK 0 -#endif - -/** - * LWIP_LOOPBACK_MAX_PBUFS: Maximum number of pbufs on queue for loopback - * sending for each netif (0 = disabled) - */ -#ifndef LWIP_LOOPBACK_MAX_PBUFS -#define LWIP_LOOPBACK_MAX_PBUFS 0 -#endif - -/** - * LWIP_NETIF_LOOPBACK_MULTITHREADING: Indicates whether threading is enabled in - * the system, as netifs must change how they behave depending on this setting - * for the LWIP_NETIF_LOOPBACK option to work. - * Setting this is needed to avoid reentering non-reentrant functions like - * tcp_input(). - * LWIP_NETIF_LOOPBACK_MULTITHREADING==1: Indicates that the user is using a - * multithreaded environment like tcpip.c. In this case, netif->input() - * is called directly. - * LWIP_NETIF_LOOPBACK_MULTITHREADING==0: Indicates a polling (or NO_SYS) setup. - * The packets are put on a list and netif_poll() must be called in - * the main application loop. - */ -#ifndef LWIP_NETIF_LOOPBACK_MULTITHREADING -#define LWIP_NETIF_LOOPBACK_MULTITHREADING (!NO_SYS) -#endif - -/** - * LWIP_NETIF_TX_SINGLE_PBUF: if this is set to 1, lwIP tries to put all data - * to be sent into one single pbuf. This is for compatibility with DMA-enabled - * MACs that do not support scatter-gather. - * Beware that this might involve CPU-memcpy before transmitting that would not - * be needed without this flag! Use this only if you need to! - * - * @todo: TCP and IP-frag do not work with this, yet: - */ -#ifndef LWIP_NETIF_TX_SINGLE_PBUF -#define LWIP_NETIF_TX_SINGLE_PBUF 0 -#endif /* LWIP_NETIF_TX_SINGLE_PBUF */ - -/* - ------------------------------------ - ---------- LOOPIF options ---------- - ------------------------------------ -*/ -/** - * LWIP_HAVE_LOOPIF==1: Support loop interface (127.0.0.1) and loopif.c - */ -#ifndef LWIP_HAVE_LOOPIF -#define LWIP_HAVE_LOOPIF 0 -#endif - -/* - ------------------------------------ - ---------- SLIPIF options ---------- - ------------------------------------ -*/ -/** - * LWIP_HAVE_SLIPIF==1: Support slip interface and slipif.c - */ -#ifndef LWIP_HAVE_SLIPIF -#define LWIP_HAVE_SLIPIF 0 -#endif - -/* - ------------------------------------ - ---------- Thread options ---------- - ------------------------------------ -*/ -/** - * TCPIP_THREAD_NAME: The name assigned to the main tcpip thread. - */ -#ifndef TCPIP_THREAD_NAME -#define TCPIP_THREAD_NAME "tcpip_thread" -#endif - -/** - * TCPIP_THREAD_STACKSIZE: The stack size used by the main tcpip thread. - * The stack size value itself is platform-dependent, but is passed to - * sys_thread_new() when the thread is created. - */ -#ifndef TCPIP_THREAD_STACKSIZE -#define TCPIP_THREAD_STACKSIZE 0 -#endif - -/** - * TCPIP_THREAD_PRIO: The priority assigned to the main tcpip thread. - * The priority value itself is platform-dependent, but is passed to - * sys_thread_new() when the thread is created. - */ -#ifndef TCPIP_THREAD_PRIO -#define TCPIP_THREAD_PRIO 1 -#endif - -/** - * TCPIP_MBOX_SIZE: The mailbox size for the tcpip thread messages - * The queue size value itself is platform-dependent, but is passed to - * sys_mbox_new() when tcpip_init is called. - */ -#ifndef TCPIP_MBOX_SIZE -#define TCPIP_MBOX_SIZE 0 -#endif - -/** - * SLIPIF_THREAD_NAME: The name assigned to the slipif_loop thread. - */ -#ifndef SLIPIF_THREAD_NAME -#define SLIPIF_THREAD_NAME "slipif_loop" -#endif - -/** - * SLIP_THREAD_STACKSIZE: The stack size used by the slipif_loop thread. - * The stack size value itself is platform-dependent, but is passed to - * sys_thread_new() when the thread is created. - */ -#ifndef SLIPIF_THREAD_STACKSIZE -#define SLIPIF_THREAD_STACKSIZE 0 -#endif - -/** - * SLIPIF_THREAD_PRIO: The priority assigned to the slipif_loop thread. - * The priority value itself is platform-dependent, but is passed to - * sys_thread_new() when the thread is created. - */ -#ifndef SLIPIF_THREAD_PRIO -#define SLIPIF_THREAD_PRIO 1 -#endif - -/** - * PPP_THREAD_NAME: The name assigned to the pppInputThread. - */ -#ifndef PPP_THREAD_NAME -#define PPP_THREAD_NAME "pppInputThread" -#endif - -/** - * PPP_THREAD_STACKSIZE: The stack size used by the pppInputThread. - * The stack size value itself is platform-dependent, but is passed to - * sys_thread_new() when the thread is created. - */ -#ifndef PPP_THREAD_STACKSIZE -#define PPP_THREAD_STACKSIZE 0 -#endif - -/** - * PPP_THREAD_PRIO: The priority assigned to the pppInputThread. - * The priority value itself is platform-dependent, but is passed to - * sys_thread_new() when the thread is created. - */ -#ifndef PPP_THREAD_PRIO -#define PPP_THREAD_PRIO 1 -#endif - -/** - * DEFAULT_THREAD_NAME: The name assigned to any other lwIP thread. - */ -#ifndef DEFAULT_THREAD_NAME -#define DEFAULT_THREAD_NAME "lwIP" -#endif - -/** - * DEFAULT_THREAD_STACKSIZE: The stack size used by any other lwIP thread. - * The stack size value itself is platform-dependent, but is passed to - * sys_thread_new() when the thread is created. - */ -#ifndef DEFAULT_THREAD_STACKSIZE -#define DEFAULT_THREAD_STACKSIZE 0 -#endif - -/** - * DEFAULT_THREAD_PRIO: The priority assigned to any other lwIP thread. - * The priority value itself is platform-dependent, but is passed to - * sys_thread_new() when the thread is created. - */ -#ifndef DEFAULT_THREAD_PRIO -#define DEFAULT_THREAD_PRIO 1 -#endif - -/** - * DEFAULT_RAW_RECVMBOX_SIZE: The mailbox size for the incoming packets on a - * NETCONN_RAW. The queue size value itself is platform-dependent, but is passed - * to sys_mbox_new() when the recvmbox is created. - */ -#ifndef DEFAULT_RAW_RECVMBOX_SIZE -#define DEFAULT_RAW_RECVMBOX_SIZE 0 -#endif - -/** - * DEFAULT_UDP_RECVMBOX_SIZE: The mailbox size for the incoming packets on a - * NETCONN_UDP. The queue size value itself is platform-dependent, but is passed - * to sys_mbox_new() when the recvmbox is created. - */ -#ifndef DEFAULT_UDP_RECVMBOX_SIZE -#define DEFAULT_UDP_RECVMBOX_SIZE 0 -#endif - -/** - * DEFAULT_TCP_RECVMBOX_SIZE: The mailbox size for the incoming packets on a - * NETCONN_TCP. The queue size value itself is platform-dependent, but is passed - * to sys_mbox_new() when the recvmbox is created. - */ -#ifndef DEFAULT_TCP_RECVMBOX_SIZE -#define DEFAULT_TCP_RECVMBOX_SIZE 0 -#endif - -/** - * DEFAULT_ACCEPTMBOX_SIZE: The mailbox size for the incoming connections. - * The queue size value itself is platform-dependent, but is passed to - * sys_mbox_new() when the acceptmbox is created. - */ -#ifndef DEFAULT_ACCEPTMBOX_SIZE -#define DEFAULT_ACCEPTMBOX_SIZE 0 -#endif - -/* - ---------------------------------------------- - ---------- Sequential layer options ---------- - ---------------------------------------------- -*/ -/** - * LWIP_TCPIP_CORE_LOCKING: (EXPERIMENTAL!) - * Don't use it if you're not an active lwIP project member - */ -#ifndef LWIP_TCPIP_CORE_LOCKING -#define LWIP_TCPIP_CORE_LOCKING 0 -#endif - -/** - * LWIP_TCPIP_CORE_LOCKING_INPUT: (EXPERIMENTAL!) - * Don't use it if you're not an active lwIP project member - */ -#ifndef LWIP_TCPIP_CORE_LOCKING_INPUT -#define LWIP_TCPIP_CORE_LOCKING_INPUT 0 -#endif - -/** - * LWIP_NETCONN==1: Enable Netconn API (require to use api_lib.c) - */ -#ifndef LWIP_NETCONN -#define LWIP_NETCONN 1 -#endif - -/** LWIP_TCPIP_TIMEOUT==1: Enable tcpip_timeout/tcpip_untimeout tod create - * timers running in tcpip_thread from another thread. - */ -#ifndef LWIP_TCPIP_TIMEOUT -#define LWIP_TCPIP_TIMEOUT 1 -#endif - -/* - ------------------------------------ - ---------- Socket options ---------- - ------------------------------------ -*/ -/** - * LWIP_SOCKET==1: Enable Socket API (require to use sockets.c) - */ -#ifndef LWIP_SOCKET -#define LWIP_SOCKET 1 -#endif - -/** - * LWIP_COMPAT_SOCKETS==1: Enable BSD-style sockets functions names. - * (only used if you use sockets.c) - */ -#ifndef LWIP_COMPAT_SOCKETS -#define LWIP_COMPAT_SOCKETS 1 -#endif - -/** - * LWIP_POSIX_SOCKETS_IO_NAMES==1: Enable POSIX-style sockets functions names. - * Disable this option if you use a POSIX operating system that uses the same - * names (read, write & close). (only used if you use sockets.c) - */ -#ifndef LWIP_POSIX_SOCKETS_IO_NAMES -#define LWIP_POSIX_SOCKETS_IO_NAMES 1 -#endif - -/** - * LWIP_TCP_KEEPALIVE==1: Enable TCP_KEEPIDLE, TCP_KEEPINTVL and TCP_KEEPCNT - * options processing. Note that TCP_KEEPIDLE and TCP_KEEPINTVL have to be set - * in seconds. (does not require sockets.c, and will affect tcp.c) - */ -#ifndef LWIP_TCP_KEEPALIVE -#define LWIP_TCP_KEEPALIVE 0 -#endif - -/** - * LWIP_SO_SNDTIMEO==1: Enable send timeout for sockets/netconns and - * SO_SNDTIMEO processing. - */ -#ifndef LWIP_SO_SNDTIMEO -#define LWIP_SO_SNDTIMEO 0 -#endif - -/** - * LWIP_SO_RCVTIMEO==1: Enable receive timeout for sockets/netconns and - * SO_RCVTIMEO processing. - */ -#ifndef LWIP_SO_RCVTIMEO -#define LWIP_SO_RCVTIMEO 0 -#endif - -/** - * LWIP_SO_RCVBUF==1: Enable SO_RCVBUF processing. - */ -#ifndef LWIP_SO_RCVBUF -#define LWIP_SO_RCVBUF 0 -#endif - -/** - * If LWIP_SO_RCVBUF is used, this is the default value for recv_bufsize. - */ -#ifndef RECV_BUFSIZE_DEFAULT -#define RECV_BUFSIZE_DEFAULT INT_MAX -#endif - -/** - * SO_REUSE==1: Enable SO_REUSEADDR option. - */ -#ifndef SO_REUSE -#define SO_REUSE 0 -#endif - -/** - * SO_REUSE_RXTOALL==1: Pass a copy of incoming broadcast/multicast packets - * to all local matches if SO_REUSEADDR is turned on. - * WARNING: Adds a memcpy for every packet if passing to more than one pcb! - */ -#ifndef SO_REUSE_RXTOALL -#define SO_REUSE_RXTOALL 0 -#endif - -/** - * LWIP_FIONREAD_LINUXMODE==0 (default): ioctl/FIONREAD returns the amount of - * pending data in the network buffer. This is the way windows does it. It's - * the default for lwIP since it is smaller. - * LWIP_FIONREAD_LINUXMODE==1: ioctl/FIONREAD returns the size of the next - * pending datagram in bytes. This is the way linux does it. This code is only - * here for compatibility. - */ -#ifndef LWIP_FIONREAD_LINUXMODE -#define LWIP_FIONREAD_LINUXMODE 0 -#endif - -/* - ---------------------------------------- - ---------- Statistics options ---------- - ---------------------------------------- -*/ -/** - * LWIP_STATS==1: Enable statistics collection in lwip_stats. - */ -#ifndef LWIP_STATS -#define LWIP_STATS 1 -#endif - -#if LWIP_STATS - -/** - * LWIP_STATS_DISPLAY==1: Compile in the statistics output functions. - */ -#ifndef LWIP_STATS_DISPLAY -#define LWIP_STATS_DISPLAY 0 -#endif - -/** - * LINK_STATS==1: Enable link stats. - */ -#ifndef LINK_STATS -#define LINK_STATS 1 -#endif - -/** - * ETHARP_STATS==1: Enable etharp stats. - */ -#ifndef ETHARP_STATS -#define ETHARP_STATS (LWIP_ARP) -#endif - -/** - * IP_STATS==1: Enable IP stats. - */ -#ifndef IP_STATS -#define IP_STATS 1 -#endif - -/** - * IPFRAG_STATS==1: Enable IP fragmentation stats. Default is - * on if using either frag or reass. - */ -#ifndef IPFRAG_STATS -#define IPFRAG_STATS (IP_REASSEMBLY || IP_FRAG) -#endif - -/** - * ICMP_STATS==1: Enable ICMP stats. - */ -#ifndef ICMP_STATS -#define ICMP_STATS 1 -#endif - -/** - * IGMP_STATS==1: Enable IGMP stats. - */ -#ifndef IGMP_STATS -#define IGMP_STATS (LWIP_IGMP) -#endif - -/** - * UDP_STATS==1: Enable UDP stats. Default is on if - * UDP enabled, otherwise off. - */ -#ifndef UDP_STATS -#define UDP_STATS (LWIP_UDP) -#endif - -/** - * TCP_STATS==1: Enable TCP stats. Default is on if TCP - * enabled, otherwise off. - */ -#ifndef TCP_STATS -#define TCP_STATS (LWIP_TCP) -#endif - -/** - * MEM_STATS==1: Enable mem.c stats. - */ -#ifndef MEM_STATS -#define MEM_STATS ((MEM_LIBC_MALLOC == 0) && (MEM_USE_POOLS == 0)) -#endif - -/** - * MEMP_STATS==1: Enable memp.c pool stats. - */ -#ifndef MEMP_STATS -#define MEMP_STATS (MEMP_MEM_MALLOC == 0) -#endif - -/** - * SYS_STATS==1: Enable system stats (sem and mbox counts, etc). - */ -#ifndef SYS_STATS -#define SYS_STATS (NO_SYS == 0) -#endif - -/** - * IP6_STATS==1: Enable IPv6 stats. - */ -#ifndef IP6_STATS -#define IP6_STATS (LWIP_IPV6) -#endif - -/** - * ICMP6_STATS==1: Enable ICMP for IPv6 stats. - */ -#ifndef ICMP6_STATS -#define ICMP6_STATS (LWIP_IPV6 && LWIP_ICMP6) -#endif - -/** - * IP6_FRAG_STATS==1: Enable IPv6 fragmentation stats. - */ -#ifndef IP6_FRAG_STATS -#define IP6_FRAG_STATS (LWIP_IPV6 && (LWIP_IPV6_FRAG || LWIP_IPV6_REASS)) -#endif - -/** - * MLD6_STATS==1: Enable MLD for IPv6 stats. - */ -#ifndef MLD6_STATS -#define MLD6_STATS (LWIP_IPV6 && LWIP_IPV6_MLD) -#endif - -/** - * ND6_STATS==1: Enable Neighbor discovery for IPv6 stats. - */ -#ifndef ND6_STATS -#define ND6_STATS (LWIP_IPV6) -#endif - -#else - -#define LINK_STATS 0 -#define IP_STATS 0 -#define IPFRAG_STATS 0 -#define ICMP_STATS 0 -#define IGMP_STATS 0 -#define UDP_STATS 0 -#define TCP_STATS 0 -#define MEM_STATS 0 -#define MEMP_STATS 0 -#define SYS_STATS 0 -#define LWIP_STATS_DISPLAY 0 -#define IP6_STATS 0 -#define ICMP6_STATS 0 -#define IP6_FRAG_STATS 0 -#define MLD6_STATS 0 -#define ND6_STATS 0 - -#endif /* LWIP_STATS */ - -/* - --------------------------------- - ---------- PPP options ---------- - --------------------------------- -*/ -/** - * PPP_SUPPORT==1: Enable PPP. - */ -#ifndef PPP_SUPPORT -#define PPP_SUPPORT 0 -#endif - -/** - * PPPOE_SUPPORT==1: Enable PPP Over Ethernet - */ -#ifndef PPPOE_SUPPORT -#define PPPOE_SUPPORT 0 -#endif - -/** - * PPPOS_SUPPORT==1: Enable PPP Over Serial - */ -#ifndef PPPOS_SUPPORT -#define PPPOS_SUPPORT PPP_SUPPORT -#endif - -#if PPP_SUPPORT - -/** - * NUM_PPP: Max PPP sessions. - */ -#ifndef NUM_PPP -#define NUM_PPP 1 -#endif - -/** - * PAP_SUPPORT==1: Support PAP. - */ -#ifndef PAP_SUPPORT -#define PAP_SUPPORT 0 -#endif - -/** - * CHAP_SUPPORT==1: Support CHAP. - */ -#ifndef CHAP_SUPPORT -#define CHAP_SUPPORT 0 -#endif - -/** - * MSCHAP_SUPPORT==1: Support MSCHAP. CURRENTLY NOT SUPPORTED! DO NOT SET! - */ -#ifndef MSCHAP_SUPPORT -#define MSCHAP_SUPPORT 0 -#endif - -/** - * CBCP_SUPPORT==1: Support CBCP. CURRENTLY NOT SUPPORTED! DO NOT SET! - */ -#ifndef CBCP_SUPPORT -#define CBCP_SUPPORT 0 -#endif - -/** - * CCP_SUPPORT==1: Support CCP. CURRENTLY NOT SUPPORTED! DO NOT SET! - */ -#ifndef CCP_SUPPORT -#define CCP_SUPPORT 0 -#endif - -/** - * VJ_SUPPORT==1: Support VJ header compression. - */ -#ifndef VJ_SUPPORT -#define VJ_SUPPORT 0 -#endif - -/** - * MD5_SUPPORT==1: Support MD5 (see also CHAP). - */ -#ifndef MD5_SUPPORT -#define MD5_SUPPORT 0 -#endif - -/* - * Timeouts - */ -#ifndef FSM_DEFTIMEOUT -#define FSM_DEFTIMEOUT 6 /* Timeout time in seconds */ -#endif - -#ifndef FSM_DEFMAXTERMREQS -#define FSM_DEFMAXTERMREQS 2 /* Maximum Terminate-Request transmissions */ -#endif - -#ifndef FSM_DEFMAXCONFREQS -#define FSM_DEFMAXCONFREQS 10 /* Maximum Configure-Request transmissions */ -#endif - -#ifndef FSM_DEFMAXNAKLOOPS -#define FSM_DEFMAXNAKLOOPS 5 /* Maximum number of nak loops */ -#endif - -#ifndef UPAP_DEFTIMEOUT -#define UPAP_DEFTIMEOUT 6 /* Timeout (seconds) for retransmitting req */ -#endif - -#ifndef UPAP_DEFREQTIME -#define UPAP_DEFREQTIME 30 /* Time to wait for auth-req from peer */ -#endif - -#ifndef CHAP_DEFTIMEOUT -#define CHAP_DEFTIMEOUT 6 /* Timeout time in seconds */ -#endif - -#ifndef CHAP_DEFTRANSMITS -#define CHAP_DEFTRANSMITS 10 /* max # times to send challenge */ -#endif - -/* Interval in seconds between keepalive echo requests, 0 to disable. */ -#ifndef LCP_ECHOINTERVAL -#define LCP_ECHOINTERVAL 0 -#endif - -/* Number of unanswered echo requests before failure. */ -#ifndef LCP_MAXECHOFAILS -#define LCP_MAXECHOFAILS 3 -#endif - -/* Max Xmit idle time (in jiffies) before resend flag char. */ -#ifndef PPP_MAXIDLEFLAG -#define PPP_MAXIDLEFLAG 100 -#endif - -/* - * Packet sizes - * - * Note - lcp shouldn't be allowed to negotiate stuff outside these - * limits. See lcp.h in the pppd directory. - * (XXX - these constants should simply be shared by lcp.c instead - * of living in lcp.h) - */ -#define PPP_MTU 1500 /* Default MTU (size of Info field) */ -#ifndef PPP_MAXMTU -/* #define PPP_MAXMTU 65535 - (PPP_HDRLEN + PPP_FCSLEN) */ -#define PPP_MAXMTU 1500 /* Largest MTU we allow */ -#endif -#define PPP_MINMTU 64 -#define PPP_MRU 1500 /* default MRU = max length of info field */ -#define PPP_MAXMRU 1500 /* Largest MRU we allow */ -#ifndef PPP_DEFMRU -#define PPP_DEFMRU 296 /* Try for this */ -#endif -#define PPP_MINMRU 128 /* No MRUs below this */ - -#ifndef MAXNAMELEN -#define MAXNAMELEN 256 /* max length of hostname or name for auth */ -#endif -#ifndef MAXSECRETLEN -#define MAXSECRETLEN 256 /* max length of password or secret */ -#endif - -#endif /* PPP_SUPPORT */ - -/* - -------------------------------------- - ---------- Checksum options ---------- - -------------------------------------- -*/ -/** - * CHECKSUM_GEN_IP==1: Generate checksums in software for outgoing IP packets. - */ -#ifndef CHECKSUM_GEN_IP -#define CHECKSUM_GEN_IP 1 -#endif - -/** - * CHECKSUM_GEN_UDP==1: Generate checksums in software for outgoing UDP packets. - */ -#ifndef CHECKSUM_GEN_UDP -#define CHECKSUM_GEN_UDP 1 -#endif - -/** - * CHECKSUM_GEN_TCP==1: Generate checksums in software for outgoing TCP packets. - */ -#ifndef CHECKSUM_GEN_TCP -#define CHECKSUM_GEN_TCP 1 -#endif - -/** - * CHECKSUM_GEN_ICMP==1: Generate checksums in software for outgoing ICMP packets. - */ -#ifndef CHECKSUM_GEN_ICMP -#define CHECKSUM_GEN_ICMP 1 -#endif - -/** - * CHECKSUM_CHECK_IP==1: Check checksums in software for incoming IP packets. - */ -#ifndef CHECKSUM_CHECK_IP -#define CHECKSUM_CHECK_IP 1 -#endif - -/** - * CHECKSUM_CHECK_UDP==1: Check checksums in software for incoming UDP packets. - */ -#ifndef CHECKSUM_CHECK_UDP -#define CHECKSUM_CHECK_UDP 1 -#endif - -/** - * CHECKSUM_CHECK_TCP==1: Check checksums in software for incoming TCP packets. - */ -#ifndef CHECKSUM_CHECK_TCP -#define CHECKSUM_CHECK_TCP 1 -#endif - -/** - * LWIP_CHECKSUM_ON_COPY==1: Calculate checksum when copying data from - * application buffers to pbufs. - */ -#ifndef LWIP_CHECKSUM_ON_COPY -#define LWIP_CHECKSUM_ON_COPY 0 -#endif - -/* - --------------------------------------- - ---------- IPv6 options --------------- - --------------------------------------- -*/ -/** - * LWIP_IPV6==1: Enable IPv6 - */ -#ifndef LWIP_IPV6 -#define LWIP_IPV6 0 -#endif - -/** - * LWIP_IPV6_NUM_ADDRESSES: Number of IPv6 addresses per netif. - */ -#ifndef LWIP_IPV6_NUM_ADDRESSES -#define LWIP_IPV6_NUM_ADDRESSES 3 -#endif - -/** - * LWIP_IPV6_FORWARD==1: Forward IPv6 packets across netifs - */ -#ifndef LWIP_IPV6_FORWARD -#define LWIP_IPV6_FORWARD 0 -#endif - -/** - * LWIP_ICMP6==1: Enable ICMPv6 (mandatory per RFC) - */ -#ifndef LWIP_ICMP6 -#define LWIP_ICMP6 (LWIP_IPV6) -#endif - -/** - * LWIP_ICMP6_DATASIZE: bytes from original packet to send back in - * ICMPv6 error messages. - */ -#ifndef LWIP_ICMP6_DATASIZE -#define LWIP_ICMP6_DATASIZE 8 -#endif - -/** - * LWIP_ICMP6_HL: default hop limit for ICMPv6 messages - */ -#ifndef LWIP_ICMP6_HL -#define LWIP_ICMP6_HL 255 -#endif - -/** - * LWIP_ICMP6_CHECKSUM_CHECK==1: verify checksum on ICMPv6 packets - */ -#ifndef LWIP_ICMP6_CHECKSUM_CHECK -#define LWIP_ICMP6_CHECKSUM_CHECK 1 -#endif - -/** - * LWIP_IPV6_MLD==1: Enable multicast listener discovery protocol. - */ -#ifndef LWIP_IPV6_MLD -#define LWIP_IPV6_MLD (LWIP_IPV6) -#endif - -/** - * MEMP_NUM_MLD6_GROUP: Max number of IPv6 multicast that can be joined. - */ -#ifndef MEMP_NUM_MLD6_GROUP -#define MEMP_NUM_MLD6_GROUP 4 -#endif - -/** - * LWIP_IPV6_FRAG==1: Fragment outgoing IPv6 packets that are too big. - */ -#ifndef LWIP_IPV6_FRAG -#define LWIP_IPV6_FRAG 0 -#endif - -/** - * LWIP_IPV6_REASS==1: reassemble incoming IPv6 packets that fragmented - */ -#ifndef LWIP_IPV6_REASS -#define LWIP_IPV6_REASS (LWIP_IPV6) -#endif - -/** - * LWIP_ND6_QUEUEING==1: queue outgoing IPv6 packets while MAC address - * is being resolved. - */ -#ifndef LWIP_ND6_QUEUEING -#define LWIP_ND6_QUEUEING (LWIP_IPV6) -#endif - -/** - * MEMP_NUM_ND6_QUEUE: Max number of IPv6 packets to queue during MAC resolution. - */ -#ifndef MEMP_NUM_ND6_QUEUE -#define MEMP_NUM_ND6_QUEUE 20 -#endif - -/** - * LWIP_ND6_NUM_NEIGHBORS: Number of entries in IPv6 neighbor cache - */ -#ifndef LWIP_ND6_NUM_NEIGHBORS -#define LWIP_ND6_NUM_NEIGHBORS 10 -#endif - -/** - * LWIP_ND6_NUM_DESTINATIONS: number of entries in IPv6 destination cache - */ -#ifndef LWIP_ND6_NUM_DESTINATIONS -#define LWIP_ND6_NUM_DESTINATIONS 10 -#endif - -/** - * LWIP_ND6_NUM_PREFIXES: number of entries in IPv6 on-link prefixes cache - */ -#ifndef LWIP_ND6_NUM_PREFIXES -#define LWIP_ND6_NUM_PREFIXES 5 -#endif - -/** - * LWIP_ND6_NUM_ROUTERS: number of entries in IPv6 default router cache - */ -#ifndef LWIP_ND6_NUM_ROUTERS -#define LWIP_ND6_NUM_ROUTERS 3 -#endif - -/** - * LWIP_ND6_MAX_MULTICAST_SOLICIT: max number of multicast solicit messages to send - * (neighbor solicit and router solicit) - */ -#ifndef LWIP_ND6_MAX_MULTICAST_SOLICIT -#define LWIP_ND6_MAX_MULTICAST_SOLICIT 3 -#endif - -/** - * LWIP_ND6_MAX_UNICAST_SOLICIT: max number of unicast neighbor solicitation messages - * to send during neighbor reachability detection. - */ -#ifndef LWIP_ND6_MAX_UNICAST_SOLICIT -#define LWIP_ND6_MAX_UNICAST_SOLICIT 3 -#endif - -/** - * Unused: See ND RFC (time in milliseconds). - */ -#ifndef LWIP_ND6_MAX_ANYCAST_DELAY_TIME -#define LWIP_ND6_MAX_ANYCAST_DELAY_TIME 1000 -#endif - -/** - * Unused: See ND RFC - */ -#ifndef LWIP_ND6_MAX_NEIGHBOR_ADVERTISEMENT -#define LWIP_ND6_MAX_NEIGHBOR_ADVERTISEMENT 3 -#endif - -/** - * LWIP_ND6_REACHABLE_TIME: default neighbor reachable time (in milliseconds). - * May be updated by router advertisement messages. - */ -#ifndef LWIP_ND6_REACHABLE_TIME -#define LWIP_ND6_REACHABLE_TIME 30000 -#endif - -/** - * LWIP_ND6_RETRANS_TIMER: default retransmission timer for solicitation messages - */ -#ifndef LWIP_ND6_RETRANS_TIMER -#define LWIP_ND6_RETRANS_TIMER 1000 -#endif - -/** - * LWIP_ND6_DELAY_FIRST_PROBE_TIME: Delay before first unicast neighbor solicitation - * message is sent, during neighbor reachability detection. - */ -#ifndef LWIP_ND6_DELAY_FIRST_PROBE_TIME -#define LWIP_ND6_DELAY_FIRST_PROBE_TIME 5000 -#endif - -/** - * LWIP_ND6_ALLOW_RA_UPDATES==1: Allow Router Advertisement messages to update - * Reachable time and retransmission timers, and netif MTU. - */ -#ifndef LWIP_ND6_ALLOW_RA_UPDATES -#define LWIP_ND6_ALLOW_RA_UPDATES 1 -#endif - -/** - * LWIP_IPV6_SEND_ROUTER_SOLICIT==1: Send router solicitation messages during - * network startup. - */ -#ifndef LWIP_IPV6_SEND_ROUTER_SOLICIT -#define LWIP_IPV6_SEND_ROUTER_SOLICIT 1 -#endif - -/** - * LWIP_ND6_TCP_REACHABILITY_HINTS==1: Allow TCP to provide Neighbor Discovery - * with reachability hints for connected destinations. This helps avoid sending - * unicast neighbor solicitation messages. - */ -#ifndef LWIP_ND6_TCP_REACHABILITY_HINTS -#define LWIP_ND6_TCP_REACHABILITY_HINTS 1 -#endif - -/** - * LWIP_IPV6_AUTOCONFIG==1: Enable stateless address autoconfiguration as per RFC 4862. - */ -#ifndef LWIP_IPV6_AUTOCONFIG -#define LWIP_IPV6_AUTOCONFIG (LWIP_IPV6) -#endif - -/** - * LWIP_IPV6_DUP_DETECT_ATTEMPTS: Number of duplicate address detection attempts. - */ -#ifndef LWIP_IPV6_DUP_DETECT_ATTEMPTS -#define LWIP_IPV6_DUP_DETECT_ATTEMPTS 1 -#endif - -/** - * LWIP_IPV6_DHCP6==1: enable DHCPv6 stateful address autoconfiguration. - */ -#ifndef LWIP_IPV6_DHCP6 -#define LWIP_IPV6_DHCP6 0 -#endif - -/* - --------------------------------------- - ---------- Hook options --------------- - --------------------------------------- -*/ - -/* Hooks are undefined by default, define them to a function if you need them. */ - -/** - * LWIP_HOOK_IP4_INPUT(pbuf, input_netif): - * - called from ip_input() (IPv4) - * - pbuf: received struct pbuf passed to ip_input() - * - input_netif: struct netif on which the packet has been received - * Return values: - * - 0: Hook has not consumed the packet, packet is processed as normal - * - != 0: Hook has consumed the packet. - * If the hook consumed the packet, 'pbuf' is in the responsibility of the hook - * (i.e. free it when done). - */ - -/** - * LWIP_HOOK_IP4_ROUTE(dest): - * - called from ip_route() (IPv4) - * - dest: destination IPv4 address - * Returns the destination netif or NULL if no destination netif is found. In - * that case, ip_route() continues as normal. - */ - -/* - --------------------------------------- - ---------- Debugging options ---------- - --------------------------------------- -*/ -/** - * LWIP_DBG_MIN_LEVEL: After masking, the value of the debug is - * compared against this value. If it is smaller, then debugging - * messages are written. - */ -#ifndef LWIP_DBG_MIN_LEVEL -#define LWIP_DBG_MIN_LEVEL LWIP_DBG_LEVEL_ALL -#endif - -/** - * LWIP_DBG_TYPES_ON: A mask that can be used to globally enable/disable - * debug messages of certain types. - */ -#ifndef LWIP_DBG_TYPES_ON -#define LWIP_DBG_TYPES_ON LWIP_DBG_ON -#endif - -/** - * ETHARP_DEBUG: Enable debugging in etharp.c. - */ -#ifndef ETHARP_DEBUG -#define ETHARP_DEBUG LWIP_DBG_OFF -#endif - -/** - * NETIF_DEBUG: Enable debugging in netif.c. - */ -#ifndef NETIF_DEBUG -#define NETIF_DEBUG LWIP_DBG_OFF -#endif - -/** - * PBUF_DEBUG: Enable debugging in pbuf.c. - */ -#ifndef PBUF_DEBUG -#define PBUF_DEBUG LWIP_DBG_OFF -#endif - -/** - * API_LIB_DEBUG: Enable debugging in api_lib.c. - */ -#ifndef API_LIB_DEBUG -#define API_LIB_DEBUG LWIP_DBG_OFF -#endif - -/** - * API_MSG_DEBUG: Enable debugging in api_msg.c. - */ -#ifndef API_MSG_DEBUG -#define API_MSG_DEBUG LWIP_DBG_OFF -#endif - -/** - * SOCKETS_DEBUG: Enable debugging in sockets.c. - */ -#ifndef SOCKETS_DEBUG -#define SOCKETS_DEBUG LWIP_DBG_OFF -#endif - -/** - * ICMP_DEBUG: Enable debugging in icmp.c. - */ -#ifndef ICMP_DEBUG -#define ICMP_DEBUG LWIP_DBG_OFF -#endif - -/** - * IGMP_DEBUG: Enable debugging in igmp.c. - */ -#ifndef IGMP_DEBUG -#define IGMP_DEBUG LWIP_DBG_OFF -#endif - -/** - * INET_DEBUG: Enable debugging in inet.c. - */ -#ifndef INET_DEBUG -#define INET_DEBUG LWIP_DBG_OFF -#endif - -/** - * IP_DEBUG: Enable debugging for IP. - */ -#ifndef IP_DEBUG -#define IP_DEBUG LWIP_DBG_OFF -#endif - -/** - * IP_REASS_DEBUG: Enable debugging in ip_frag.c for both frag & reass. - */ -#ifndef IP_REASS_DEBUG -#define IP_REASS_DEBUG LWIP_DBG_OFF -#endif - -/** - * RAW_DEBUG: Enable debugging in raw.c. - */ -#ifndef RAW_DEBUG -#define RAW_DEBUG LWIP_DBG_OFF -#endif - -/** - * MEM_DEBUG: Enable debugging in mem.c. - */ -#ifndef MEM_DEBUG -#define MEM_DEBUG LWIP_DBG_OFF -#endif - -/** - * MEMP_DEBUG: Enable debugging in memp.c. - */ -#ifndef MEMP_DEBUG -#define MEMP_DEBUG LWIP_DBG_OFF -#endif - -/** - * SYS_DEBUG: Enable debugging in sys.c. - */ -#ifndef SYS_DEBUG -#define SYS_DEBUG LWIP_DBG_OFF -#endif - -/** - * TIMERS_DEBUG: Enable debugging in timers.c. - */ -#ifndef TIMERS_DEBUG -#define TIMERS_DEBUG LWIP_DBG_OFF -#endif - -/** - * TCP_DEBUG: Enable debugging for TCP. - */ -#ifndef TCP_DEBUG -#define TCP_DEBUG LWIP_DBG_OFF -#endif - -/** - * TCP_INPUT_DEBUG: Enable debugging in tcp_in.c for incoming debug. - */ -#ifndef TCP_INPUT_DEBUG -#define TCP_INPUT_DEBUG LWIP_DBG_OFF -#endif - -/** - * TCP_FR_DEBUG: Enable debugging in tcp_in.c for fast retransmit. - */ -#ifndef TCP_FR_DEBUG -#define TCP_FR_DEBUG LWIP_DBG_OFF -#endif - -/** - * TCP_RTO_DEBUG: Enable debugging in TCP for retransmit - * timeout. - */ -#ifndef TCP_RTO_DEBUG -#define TCP_RTO_DEBUG LWIP_DBG_OFF -#endif - -/** - * TCP_CWND_DEBUG: Enable debugging for TCP congestion window. - */ -#ifndef TCP_CWND_DEBUG -#define TCP_CWND_DEBUG LWIP_DBG_OFF -#endif - -/** - * TCP_WND_DEBUG: Enable debugging in tcp_in.c for window updating. - */ -#ifndef TCP_WND_DEBUG -#define TCP_WND_DEBUG LWIP_DBG_OFF -#endif - -/** - * TCP_OUTPUT_DEBUG: Enable debugging in tcp_out.c output functions. - */ -#ifndef TCP_OUTPUT_DEBUG -#define TCP_OUTPUT_DEBUG LWIP_DBG_OFF -#endif - -/** - * TCP_RST_DEBUG: Enable debugging for TCP with the RST message. - */ -#ifndef TCP_RST_DEBUG -#define TCP_RST_DEBUG LWIP_DBG_OFF -#endif - -/** - * TCP_QLEN_DEBUG: Enable debugging for TCP queue lengths. - */ -#ifndef TCP_QLEN_DEBUG -#define TCP_QLEN_DEBUG LWIP_DBG_OFF -#endif - -/** - * UDP_DEBUG: Enable debugging in UDP. - */ -#ifndef UDP_DEBUG -#define UDP_DEBUG LWIP_DBG_OFF -#endif - -/** - * TCPIP_DEBUG: Enable debugging in tcpip.c. - */ -#ifndef TCPIP_DEBUG -#define TCPIP_DEBUG LWIP_DBG_OFF -#endif - -/** - * PPP_DEBUG: Enable debugging for PPP. - */ -#ifndef PPP_DEBUG -#define PPP_DEBUG LWIP_DBG_OFF -#endif - -/** - * SLIP_DEBUG: Enable debugging in slipif.c. - */ -#ifndef SLIP_DEBUG -#define SLIP_DEBUG LWIP_DBG_OFF -#endif - -/** - * DHCP_DEBUG: Enable debugging in dhcp.c. - */ -#ifndef DHCP_DEBUG -#define DHCP_DEBUG LWIP_DBG_OFF -#endif - -/** - * AUTOIP_DEBUG: Enable debugging in autoip.c. - */ -#ifndef AUTOIP_DEBUG -#define AUTOIP_DEBUG LWIP_DBG_OFF -#endif - -/** - * SNMP_MSG_DEBUG: Enable debugging for SNMP messages. - */ -#ifndef SNMP_MSG_DEBUG -#define SNMP_MSG_DEBUG LWIP_DBG_OFF -#endif - -/** - * SNMP_MIB_DEBUG: Enable debugging for SNMP MIBs. - */ -#ifndef SNMP_MIB_DEBUG -#define SNMP_MIB_DEBUG LWIP_DBG_OFF -#endif - -/** - * DNS_DEBUG: Enable debugging for DNS. - */ -#ifndef DNS_DEBUG -#define DNS_DEBUG LWIP_DBG_OFF -#endif - -/** - * IP6_DEBUG: Enable debugging for IPv6. - */ -#ifndef IP6_DEBUG -#define IP6_DEBUG LWIP_DBG_OFF -#endif - -#endif /* __LWIP_OPT_H__ */ diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/lwip/pbuf.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/lwip/pbuf.h deleted file mode 100644 index 4f8dca8a..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/lwip/pbuf.h +++ /dev/null @@ -1,185 +0,0 @@ -/* - * Copyright (c) 2001-2004 Swedish Institute of Computer Science. - * 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. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT - * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING - * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY - * OF SUCH DAMAGE. - * - * This file is part of the lwIP TCP/IP stack. - * - * Author: Adam Dunkels - * - */ - -#ifndef __LWIP_PBUF_H__ -#define __LWIP_PBUF_H__ - -#include "lwip/opt.h" -#include "lwip/err.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/** Currently, the pbuf_custom code is only needed for one specific configuration - * of IP_FRAG */ -#define LWIP_SUPPORT_CUSTOM_PBUF (IP_FRAG && !IP_FRAG_USES_STATIC_BUF && !LWIP_NETIF_TX_SINGLE_PBUF) - -/* @todo: We need a mechanism to prevent wasting memory in every pbuf - (TCP vs. UDP, IPv4 vs. IPv6: UDP/IPv4 packets may waste up to 28 bytes) */ - -#define PBUF_TRANSPORT_HLEN 20 -#if LWIP_IPV6 -#define PBUF_IP_HLEN 40 -#else -#define PBUF_IP_HLEN 20 -#endif - -typedef enum { - PBUF_TRANSPORT, - PBUF_IP, - PBUF_LINK, - PBUF_RAW -} pbuf_layer; - -typedef enum { - PBUF_RAM, /* pbuf data is stored in RAM */ - PBUF_ROM, /* pbuf data is stored in ROM */ - PBUF_REF, /* pbuf comes from the pbuf pool */ - PBUF_POOL /* pbuf payload refers to RAM */ -} pbuf_type; - - -/** indicates this packet's data should be immediately passed to the application */ -#define PBUF_FLAG_PUSH 0x01U -/** indicates this is a custom pbuf: pbuf_free and pbuf_header handle such a - a pbuf differently */ -#define PBUF_FLAG_IS_CUSTOM 0x02U -/** indicates this pbuf is UDP multicast to be looped back */ -#define PBUF_FLAG_MCASTLOOP 0x04U -/** indicates this pbuf was received as link-level broadcast */ -#define PBUF_FLAG_LLBCAST 0x08U -/** indicates this pbuf was received as link-level multicast */ -#define PBUF_FLAG_LLMCAST 0x10U -/** indicates this pbuf includes a TCP FIN flag */ -#define PBUF_FLAG_TCP_FIN 0x20U - -struct pbuf { - /** next pbuf in singly linked pbuf chain */ - struct pbuf *next; - - /** pointer to the actual data in the buffer */ - void *payload; - - /** - * total length of this buffer and all next buffers in chain - * belonging to the same packet. - * - * For non-queue packet chains this is the invariant: - * p->tot_len == p->len + (p->next? p->next->tot_len: 0) - */ - u16_t tot_len; - - /** length of this buffer */ - u16_t len; - - /** pbuf_type as u8_t instead of enum to save space */ - u8_t /*pbuf_type*/ type; - - /** misc flags */ - u8_t flags; - - /** - * the reference count always equals the number of pointers - * that refer to this pbuf. This can be pointers from an application, - * the stack itself, or pbuf->next pointers from a chain. - */ - u16_t ref; -}; - -#if LWIP_SUPPORT_CUSTOM_PBUF -/** Prototype for a function to free a custom pbuf */ -typedef void (*pbuf_free_custom_fn)(struct pbuf *p); - -/** A custom pbuf: like a pbuf, but following a function pointer to free it. */ -struct pbuf_custom { - /** The actual pbuf */ - struct pbuf pbuf; - /** This function is called when pbuf_free deallocates this pbuf(_custom) */ - pbuf_free_custom_fn custom_free_function; -}; -#endif /* LWIP_SUPPORT_CUSTOM_PBUF */ - -#if LWIP_TCP && TCP_QUEUE_OOSEQ -/** Define this to 0 to prevent freeing ooseq pbufs when the PBUF_POOL is empty */ -#ifndef PBUF_POOL_FREE_OOSEQ -#define PBUF_POOL_FREE_OOSEQ 1 -#endif /* PBUF_POOL_FREE_OOSEQ */ -#if NO_SYS && PBUF_POOL_FREE_OOSEQ -extern volatile u8_t pbuf_free_ooseq_pending; -void pbuf_free_ooseq(void); -/** When not using sys_check_timeouts(), call PBUF_CHECK_FREE_OOSEQ() - at regular intervals from main level to check if ooseq pbufs need to be - freed! */ -#define PBUF_CHECK_FREE_OOSEQ() do { if(pbuf_free_ooseq_pending) { \ - /* pbuf_alloc() reported PBUF_POOL to be empty -> try to free some \ - ooseq queued pbufs now */ \ - pbuf_free_ooseq(); }}while(0) -#endif /* NO_SYS && PBUF_POOL_FREE_OOSEQ*/ -#endif /* LWIP_TCP && TCP_QUEUE_OOSEQ */ - -/* Initializes the pbuf module. This call is empty for now, but may not be in future. */ -#define pbuf_init() - -struct pbuf *pbuf_alloc(pbuf_layer l, u16_t length, pbuf_type type); -#if LWIP_SUPPORT_CUSTOM_PBUF -struct pbuf *pbuf_alloced_custom(pbuf_layer l, u16_t length, pbuf_type type, - struct pbuf_custom *p, void *payload_mem, - u16_t payload_mem_len); -#endif /* LWIP_SUPPORT_CUSTOM_PBUF */ -void pbuf_realloc(struct pbuf *p, u16_t size); -u8_t pbuf_header(struct pbuf *p, s16_t header_size); -void pbuf_ref(struct pbuf *p); -u8_t pbuf_free(struct pbuf *p); -u8_t pbuf_clen(struct pbuf *p); -void pbuf_cat(struct pbuf *head, struct pbuf *tail); -void pbuf_chain(struct pbuf *head, struct pbuf *tail); -struct pbuf *pbuf_dechain(struct pbuf *p); -err_t pbuf_copy(struct pbuf *p_to, struct pbuf *p_from); -u16_t pbuf_copy_partial(struct pbuf *p, void *dataptr, u16_t len, u16_t offset); -err_t pbuf_take(struct pbuf *buf, const void *dataptr, u16_t len); -struct pbuf *pbuf_coalesce(struct pbuf *p, pbuf_layer layer); -#if LWIP_CHECKSUM_ON_COPY -err_t pbuf_fill_chksum(struct pbuf *p, u16_t start_offset, const void *dataptr, - u16_t len, u16_t *chksum); -#endif /* LWIP_CHECKSUM_ON_COPY */ - -u8_t pbuf_get_at(struct pbuf* p, u16_t offset); -u16_t pbuf_memcmp(struct pbuf* p, u16_t offset, const void* s2, u16_t n); -u16_t pbuf_memfind(struct pbuf* p, const void* mem, u16_t mem_len, u16_t start_offset); -u16_t pbuf_strstr(struct pbuf* p, const char* substr); - -#ifdef __cplusplus -} -#endif - -#endif /* __LWIP_PBUF_H__ */ diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/lwip/raw.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/lwip/raw.h deleted file mode 100644 index f0c8ed47..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/lwip/raw.h +++ /dev/null @@ -1,131 +0,0 @@ -/* - * Copyright (c) 2001-2004 Swedish Institute of Computer Science. - * 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. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT - * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING - * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY - * OF SUCH DAMAGE. - * - * This file is part of the lwIP TCP/IP stack. - * - * Author: Adam Dunkels - * - */ -#ifndef __LWIP_RAW_H__ -#define __LWIP_RAW_H__ - -#include "lwip/opt.h" - -#if LWIP_RAW /* don't build if not configured for use in lwipopts.h */ - -#include "lwip/pbuf.h" -#include "lwip/def.h" -#include "lwip/ip.h" -#include "lwip/ip_addr.h" -#include "lwip/ip6_addr.h" - -#ifdef __cplusplus -extern "C" { -#endif - -struct raw_pcb; - -/** Function prototype for raw pcb receive callback functions. - * @param arg user supplied argument (raw_pcb.recv_arg) - * @param pcb the raw_pcb which received data - * @param p the packet buffer that was received - * @param addr the remote IP address from which the packet was received - * @return 1 if the packet was 'eaten' (aka. deleted), - * 0 if the packet lives on - * If returning 1, the callback is responsible for freeing the pbuf - * if it's not used any more. - */ -typedef u8_t (*raw_recv_fn)(void *arg, struct raw_pcb *pcb, struct pbuf *p, - ip_addr_t *addr); - -#if LWIP_IPV6 -/** Function prototype for raw pcb IPv6 receive callback functions. - * @param arg user supplied argument (raw_pcb.recv_arg) - * @param pcb the raw_pcb which received data - * @param p the packet buffer that was received - * @param addr the remote IPv6 address from which the packet was received - * @return 1 if the packet was 'eaten' (aka. deleted), - * 0 if the packet lives on - * If returning 1, the callback is responsible for freeing the pbuf - * if it's not used any more. - */ -typedef u8_t (*raw_recv_ip6_fn)(void *arg, struct raw_pcb *pcb, struct pbuf *p, - ip6_addr_t *addr); -#endif /* LWIP_IPV6 */ - -#if LWIP_IPV6 -#define RAW_PCB_RECV_IP6 raw_recv_ip6_fn ip6; -#else -#define RAW_PCB_RECV_IP6 -#endif /* LWIP_IPV6 */ - -struct raw_pcb { - /* Common members of all PCB types */ - IP_PCB; - - struct raw_pcb *next; - - u8_t protocol; - - /** receive callback function */ - union { - raw_recv_fn ip4; - RAW_PCB_RECV_IP6 - } recv; - /* user-supplied argument for the recv callback */ - void *recv_arg; -}; - -/* The following functions is the application layer interface to the - RAW code. */ -struct raw_pcb * raw_new (u8_t proto); -void raw_remove (struct raw_pcb *pcb); -err_t raw_bind (struct raw_pcb *pcb, ip_addr_t *ipaddr); -err_t raw_connect (struct raw_pcb *pcb, ip_addr_t *ipaddr); - -void raw_recv (struct raw_pcb *pcb, raw_recv_fn recv, void *recv_arg); -err_t raw_sendto (struct raw_pcb *pcb, struct pbuf *p, ip_addr_t *ipaddr); -err_t raw_send (struct raw_pcb *pcb, struct pbuf *p); - -#if LWIP_IPV6 -struct raw_pcb * raw_new_ip6 (u8_t proto); -#define raw_bind_ip6(pcb, ip6addr) raw_bind(pcb, ip6_2_ip(ip6addr)) -#define raw_connect_ip6(pcb, ip6addr) raw_connect(pcb, ip6_2_ip(ip6addr)) -#define raw_recv_ip6(pcb, recv_ip6_fn, recv_arg) raw_recv(pcb, (raw_recv_fn)recv_ip6_fn, recv_arg) -#define raw_sendto_ip6(pcb, pbuf, ip6addr) raw_sendto(pcb, pbuf, ip6_2_ip(ip6addr)) -#endif /* LWIP_IPV6 */ - -/* The following functions are the lower layer interface to RAW. */ -u8_t raw_input (struct pbuf *p, struct netif *inp); -#define raw_init() /* Compatibility define, not init needed. */ - -#ifdef __cplusplus -} -#endif - -#endif /* LWIP_RAW */ - -#endif /* __LWIP_RAW_H__ */ diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/lwip/sio.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/lwip/sio.h deleted file mode 100644 index 28ae2f22..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/lwip/sio.h +++ /dev/null @@ -1,141 +0,0 @@ -/* - * Copyright (c) 2001-2004 Swedish Institute of Computer Science. - * 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. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT - * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING - * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY - * OF SUCH DAMAGE. - * - * This file is part of the lwIP TCP/IP stack. - */ - -/* - * This is the interface to the platform specific serial IO module - * It needs to be implemented by those platforms which need SLIP or PPP - */ - -#ifndef __SIO_H__ -#define __SIO_H__ - -#include "lwip/arch.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/* If you want to define sio_fd_t elsewhere or differently, - define this in your cc.h file. */ -#ifndef __sio_fd_t_defined -typedef void * sio_fd_t; -#endif - -/* The following functions can be defined to something else in your cc.h file - or be implemented in your custom sio.c file. */ - -#ifndef sio_open -/** - * Opens a serial device for communication. - * - * @param devnum device number - * @return handle to serial device if successful, NULL otherwise - */ -sio_fd_t sio_open(u8_t devnum); -#endif - -#ifndef sio_send -/** - * Sends a single character to the serial device. - * - * @param c character to send - * @param fd serial device handle - * - * @note This function will block until the character can be sent. - */ -void sio_send(u8_t c, sio_fd_t fd); -#endif - -#ifndef sio_recv -/** - * Receives a single character from the serial device. - * - * @param fd serial device handle - * - * @note This function will block until a character is received. - */ -u8_t sio_recv(sio_fd_t fd); -#endif - -#ifndef sio_read -/** - * Reads from the serial device. - * - * @param fd serial device handle - * @param data pointer to data buffer for receiving - * @param len maximum length (in bytes) of data to receive - * @return number of bytes actually received - may be 0 if aborted by sio_read_abort - * - * @note This function will block until data can be received. The blocking - * can be cancelled by calling sio_read_abort(). - */ -u32_t sio_read(sio_fd_t fd, u8_t *data, u32_t len); -#endif - -#ifndef sio_tryread -/** - * Tries to read from the serial device. Same as sio_read but returns - * immediately if no data is available and never blocks. - * - * @param fd serial device handle - * @param data pointer to data buffer for receiving - * @param len maximum length (in bytes) of data to receive - * @return number of bytes actually received - */ -u32_t sio_tryread(sio_fd_t fd, u8_t *data, u32_t len); -#endif - -#ifndef sio_write -/** - * Writes to the serial device. - * - * @param fd serial device handle - * @param data pointer to data to send - * @param len length (in bytes) of data to send - * @return number of bytes actually sent - * - * @note This function will block until all data can be sent. - */ -u32_t sio_write(sio_fd_t fd, u8_t *data, u32_t len); -#endif - -#ifndef sio_read_abort -/** - * Aborts a blocking sio_read() call. - * - * @param fd serial device handle - */ -void sio_read_abort(sio_fd_t fd); -#endif - -#ifdef __cplusplus -} -#endif - -#endif /* __SIO_H__ */ diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/lwip/snmp.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/lwip/snmp.h deleted file mode 100644 index 2ed043dd..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/lwip/snmp.h +++ /dev/null @@ -1,367 +0,0 @@ -/* - * Copyright (c) 2001, 2002 Leon Woestenberg - * Copyright (c) 2001, 2002 Axon Digital Design B.V., The Netherlands. - * 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. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT - * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING - * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY - * OF SUCH DAMAGE. - * - * This file is part of the lwIP TCP/IP stack. - * - * Author: Leon Woestenberg - * - */ -#ifndef __LWIP_SNMP_H__ -#define __LWIP_SNMP_H__ - -#include "lwip/opt.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#include "lwip/ip_addr.h" - -struct udp_pcb; -struct netif; - -/** - * @see RFC1213, "MIB-II, 6. Definitions" - */ -enum snmp_ifType { - snmp_ifType_other=1, /* none of the following */ - snmp_ifType_regular1822, - snmp_ifType_hdh1822, - snmp_ifType_ddn_x25, - snmp_ifType_rfc877_x25, - snmp_ifType_ethernet_csmacd, - snmp_ifType_iso88023_csmacd, - snmp_ifType_iso88024_tokenBus, - snmp_ifType_iso88025_tokenRing, - snmp_ifType_iso88026_man, - snmp_ifType_starLan, - snmp_ifType_proteon_10Mbit, - snmp_ifType_proteon_80Mbit, - snmp_ifType_hyperchannel, - snmp_ifType_fddi, - snmp_ifType_lapb, - snmp_ifType_sdlc, - snmp_ifType_ds1, /* T-1 */ - snmp_ifType_e1, /* european equiv. of T-1 */ - snmp_ifType_basicISDN, - snmp_ifType_primaryISDN, /* proprietary serial */ - snmp_ifType_propPointToPointSerial, - snmp_ifType_ppp, - snmp_ifType_softwareLoopback, - snmp_ifType_eon, /* CLNP over IP [11] */ - snmp_ifType_ethernet_3Mbit, - snmp_ifType_nsip, /* XNS over IP */ - snmp_ifType_slip, /* generic SLIP */ - snmp_ifType_ultra, /* ULTRA technologies */ - snmp_ifType_ds3, /* T-3 */ - snmp_ifType_sip, /* SMDS */ - snmp_ifType_frame_relay -}; - -#if LWIP_SNMP /* don't build if not configured for use in lwipopts.h */ - -/** SNMP "sysuptime" Interval */ -#define SNMP_SYSUPTIME_INTERVAL 10 - -/** fixed maximum length for object identifier type */ -#define LWIP_SNMP_OBJ_ID_LEN 32 - -/** internal object identifier representation */ -struct snmp_obj_id -{ - u8_t len; - s32_t id[LWIP_SNMP_OBJ_ID_LEN]; -}; - -/* system */ -void snmp_set_sysdesr(u8_t* str, u8_t* len); -void snmp_set_sysobjid(struct snmp_obj_id *oid); -void snmp_get_sysobjid_ptr(struct snmp_obj_id **oid); -void snmp_inc_sysuptime(void); -void snmp_add_sysuptime(u32_t value); -void snmp_get_sysuptime(u32_t *value); -void snmp_set_syscontact(u8_t *ocstr, u8_t *ocstrlen); -void snmp_set_sysname(u8_t *ocstr, u8_t *ocstrlen); -void snmp_set_syslocation(u8_t *ocstr, u8_t *ocstrlen); - -/* network interface */ -void snmp_add_ifinoctets(struct netif *ni, u32_t value); -void snmp_inc_ifinucastpkts(struct netif *ni); -void snmp_inc_ifinnucastpkts(struct netif *ni); -void snmp_inc_ifindiscards(struct netif *ni); -void snmp_add_ifoutoctets(struct netif *ni, u32_t value); -void snmp_inc_ifoutucastpkts(struct netif *ni); -void snmp_inc_ifoutnucastpkts(struct netif *ni); -void snmp_inc_ifoutdiscards(struct netif *ni); -void snmp_inc_iflist(void); -void snmp_dec_iflist(void); - -/* ARP (for atTable and ipNetToMediaTable) */ -void snmp_insert_arpidx_tree(struct netif *ni, ip_addr_t *ip); -void snmp_delete_arpidx_tree(struct netif *ni, ip_addr_t *ip); - -/* IP */ -void snmp_inc_ipinreceives(void); -void snmp_inc_ipinhdrerrors(void); -void snmp_inc_ipinaddrerrors(void); -void snmp_inc_ipforwdatagrams(void); -void snmp_inc_ipinunknownprotos(void); -void snmp_inc_ipindiscards(void); -void snmp_inc_ipindelivers(void); -void snmp_inc_ipoutrequests(void); -void snmp_inc_ipoutdiscards(void); -void snmp_inc_ipoutnoroutes(void); -void snmp_inc_ipreasmreqds(void); -void snmp_inc_ipreasmoks(void); -void snmp_inc_ipreasmfails(void); -void snmp_inc_ipfragoks(void); -void snmp_inc_ipfragfails(void); -void snmp_inc_ipfragcreates(void); -void snmp_inc_iproutingdiscards(void); -void snmp_insert_ipaddridx_tree(struct netif *ni); -void snmp_delete_ipaddridx_tree(struct netif *ni); -void snmp_insert_iprteidx_tree(u8_t dflt, struct netif *ni); -void snmp_delete_iprteidx_tree(u8_t dflt, struct netif *ni); - -/* ICMP */ -void snmp_inc_icmpinmsgs(void); -void snmp_inc_icmpinerrors(void); -void snmp_inc_icmpindestunreachs(void); -void snmp_inc_icmpintimeexcds(void); -void snmp_inc_icmpinparmprobs(void); -void snmp_inc_icmpinsrcquenchs(void); -void snmp_inc_icmpinredirects(void); -void snmp_inc_icmpinechos(void); -void snmp_inc_icmpinechoreps(void); -void snmp_inc_icmpintimestamps(void); -void snmp_inc_icmpintimestampreps(void); -void snmp_inc_icmpinaddrmasks(void); -void snmp_inc_icmpinaddrmaskreps(void); -void snmp_inc_icmpoutmsgs(void); -void snmp_inc_icmpouterrors(void); -void snmp_inc_icmpoutdestunreachs(void); -void snmp_inc_icmpouttimeexcds(void); -void snmp_inc_icmpoutparmprobs(void); -void snmp_inc_icmpoutsrcquenchs(void); -void snmp_inc_icmpoutredirects(void); -void snmp_inc_icmpoutechos(void); -void snmp_inc_icmpoutechoreps(void); -void snmp_inc_icmpouttimestamps(void); -void snmp_inc_icmpouttimestampreps(void); -void snmp_inc_icmpoutaddrmasks(void); -void snmp_inc_icmpoutaddrmaskreps(void); - -/* TCP */ -void snmp_inc_tcpactiveopens(void); -void snmp_inc_tcppassiveopens(void); -void snmp_inc_tcpattemptfails(void); -void snmp_inc_tcpestabresets(void); -void snmp_inc_tcpinsegs(void); -void snmp_inc_tcpoutsegs(void); -void snmp_inc_tcpretranssegs(void); -void snmp_inc_tcpinerrs(void); -void snmp_inc_tcpoutrsts(void); - -/* UDP */ -void snmp_inc_udpindatagrams(void); -void snmp_inc_udpnoports(void); -void snmp_inc_udpinerrors(void); -void snmp_inc_udpoutdatagrams(void); -void snmp_insert_udpidx_tree(struct udp_pcb *pcb); -void snmp_delete_udpidx_tree(struct udp_pcb *pcb); - -/* SNMP */ -void snmp_inc_snmpinpkts(void); -void snmp_inc_snmpoutpkts(void); -void snmp_inc_snmpinbadversions(void); -void snmp_inc_snmpinbadcommunitynames(void); -void snmp_inc_snmpinbadcommunityuses(void); -void snmp_inc_snmpinasnparseerrs(void); -void snmp_inc_snmpintoobigs(void); -void snmp_inc_snmpinnosuchnames(void); -void snmp_inc_snmpinbadvalues(void); -void snmp_inc_snmpinreadonlys(void); -void snmp_inc_snmpingenerrs(void); -void snmp_add_snmpintotalreqvars(u8_t value); -void snmp_add_snmpintotalsetvars(u8_t value); -void snmp_inc_snmpingetrequests(void); -void snmp_inc_snmpingetnexts(void); -void snmp_inc_snmpinsetrequests(void); -void snmp_inc_snmpingetresponses(void); -void snmp_inc_snmpintraps(void); -void snmp_inc_snmpouttoobigs(void); -void snmp_inc_snmpoutnosuchnames(void); -void snmp_inc_snmpoutbadvalues(void); -void snmp_inc_snmpoutgenerrs(void); -void snmp_inc_snmpoutgetrequests(void); -void snmp_inc_snmpoutgetnexts(void); -void snmp_inc_snmpoutsetrequests(void); -void snmp_inc_snmpoutgetresponses(void); -void snmp_inc_snmpouttraps(void); -void snmp_get_snmpgrpid_ptr(struct snmp_obj_id **oid); -void snmp_set_snmpenableauthentraps(u8_t *value); -void snmp_get_snmpenableauthentraps(u8_t *value); - -/* LWIP_SNMP support not available */ -/* define everything to be empty */ -#else - -/* system */ -#define snmp_set_sysdesr(str, len) -#define snmp_set_sysobjid(oid); -#define snmp_get_sysobjid_ptr(oid) -#define snmp_inc_sysuptime() -#define snmp_add_sysuptime(value) -#define snmp_get_sysuptime(value) -#define snmp_set_syscontact(ocstr, ocstrlen); -#define snmp_set_sysname(ocstr, ocstrlen); -#define snmp_set_syslocation(ocstr, ocstrlen); - -/* network interface */ -#define snmp_add_ifinoctets(ni,value) -#define snmp_inc_ifinucastpkts(ni) -#define snmp_inc_ifinnucastpkts(ni) -#define snmp_inc_ifindiscards(ni) -#define snmp_add_ifoutoctets(ni,value) -#define snmp_inc_ifoutucastpkts(ni) -#define snmp_inc_ifoutnucastpkts(ni) -#define snmp_inc_ifoutdiscards(ni) -#define snmp_inc_iflist() -#define snmp_dec_iflist() - -/* ARP */ -#define snmp_insert_arpidx_tree(ni,ip) -#define snmp_delete_arpidx_tree(ni,ip) - -/* IP */ -#define snmp_inc_ipinreceives() -#define snmp_inc_ipinhdrerrors() -#define snmp_inc_ipinaddrerrors() -#define snmp_inc_ipforwdatagrams() -#define snmp_inc_ipinunknownprotos() -#define snmp_inc_ipindiscards() -#define snmp_inc_ipindelivers() -#define snmp_inc_ipoutrequests() -#define snmp_inc_ipoutdiscards() -#define snmp_inc_ipoutnoroutes() -#define snmp_inc_ipreasmreqds() -#define snmp_inc_ipreasmoks() -#define snmp_inc_ipreasmfails() -#define snmp_inc_ipfragoks() -#define snmp_inc_ipfragfails() -#define snmp_inc_ipfragcreates() -#define snmp_inc_iproutingdiscards() -#define snmp_insert_ipaddridx_tree(ni) -#define snmp_delete_ipaddridx_tree(ni) -#define snmp_insert_iprteidx_tree(dflt, ni) -#define snmp_delete_iprteidx_tree(dflt, ni) - -/* ICMP */ -#define snmp_inc_icmpinmsgs() -#define snmp_inc_icmpinerrors() -#define snmp_inc_icmpindestunreachs() -#define snmp_inc_icmpintimeexcds() -#define snmp_inc_icmpinparmprobs() -#define snmp_inc_icmpinsrcquenchs() -#define snmp_inc_icmpinredirects() -#define snmp_inc_icmpinechos() -#define snmp_inc_icmpinechoreps() -#define snmp_inc_icmpintimestamps() -#define snmp_inc_icmpintimestampreps() -#define snmp_inc_icmpinaddrmasks() -#define snmp_inc_icmpinaddrmaskreps() -#define snmp_inc_icmpoutmsgs() -#define snmp_inc_icmpouterrors() -#define snmp_inc_icmpoutdestunreachs() -#define snmp_inc_icmpouttimeexcds() -#define snmp_inc_icmpoutparmprobs() -#define snmp_inc_icmpoutsrcquenchs() -#define snmp_inc_icmpoutredirects() -#define snmp_inc_icmpoutechos() -#define snmp_inc_icmpoutechoreps() -#define snmp_inc_icmpouttimestamps() -#define snmp_inc_icmpouttimestampreps() -#define snmp_inc_icmpoutaddrmasks() -#define snmp_inc_icmpoutaddrmaskreps() -/* TCP */ -#define snmp_inc_tcpactiveopens() -#define snmp_inc_tcppassiveopens() -#define snmp_inc_tcpattemptfails() -#define snmp_inc_tcpestabresets() -#define snmp_inc_tcpinsegs() -#define snmp_inc_tcpoutsegs() -#define snmp_inc_tcpretranssegs() -#define snmp_inc_tcpinerrs() -#define snmp_inc_tcpoutrsts() - -/* UDP */ -#define snmp_inc_udpindatagrams() -#define snmp_inc_udpnoports() -#define snmp_inc_udpinerrors() -#define snmp_inc_udpoutdatagrams() -#define snmp_insert_udpidx_tree(pcb) -#define snmp_delete_udpidx_tree(pcb) - -/* SNMP */ -#define snmp_inc_snmpinpkts() -#define snmp_inc_snmpoutpkts() -#define snmp_inc_snmpinbadversions() -#define snmp_inc_snmpinbadcommunitynames() -#define snmp_inc_snmpinbadcommunityuses() -#define snmp_inc_snmpinasnparseerrs() -#define snmp_inc_snmpintoobigs() -#define snmp_inc_snmpinnosuchnames() -#define snmp_inc_snmpinbadvalues() -#define snmp_inc_snmpinreadonlys() -#define snmp_inc_snmpingenerrs() -#define snmp_add_snmpintotalreqvars(value) -#define snmp_add_snmpintotalsetvars(value) -#define snmp_inc_snmpingetrequests() -#define snmp_inc_snmpingetnexts() -#define snmp_inc_snmpinsetrequests() -#define snmp_inc_snmpingetresponses() -#define snmp_inc_snmpintraps() -#define snmp_inc_snmpouttoobigs() -#define snmp_inc_snmpoutnosuchnames() -#define snmp_inc_snmpoutbadvalues() -#define snmp_inc_snmpoutgenerrs() -#define snmp_inc_snmpoutgetrequests() -#define snmp_inc_snmpoutgetnexts() -#define snmp_inc_snmpoutsetrequests() -#define snmp_inc_snmpoutgetresponses() -#define snmp_inc_snmpouttraps() -#define snmp_get_snmpgrpid_ptr(oid) -#define snmp_set_snmpenableauthentraps(value) -#define snmp_get_snmpenableauthentraps(value) - -#endif /* LWIP_SNMP */ - -#ifdef __cplusplus -} -#endif - -#endif /* __LWIP_SNMP_H__ */ diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/lwip/snmp_asn1.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/lwip/snmp_asn1.h deleted file mode 100644 index 605fa3f1..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/lwip/snmp_asn1.h +++ /dev/null @@ -1,101 +0,0 @@ -/** - * @file - * Abstract Syntax Notation One (ISO 8824, 8825) codec. - */ - -/* - * Copyright (c) 2006 Axon Digital Design B.V., The Netherlands. - * 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. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT - * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING - * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY - * OF SUCH DAMAGE. - * - * Author: Christiaan Simons - */ - -#ifndef __LWIP_SNMP_ASN1_H__ -#define __LWIP_SNMP_ASN1_H__ - -#include "lwip/opt.h" -#include "lwip/err.h" -#include "lwip/pbuf.h" -#include "lwip/snmp.h" - -#if LWIP_SNMP - -#ifdef __cplusplus -extern "C" { -#endif - -#define SNMP_ASN1_UNIV (0) /* (!0x80 | !0x40) */ -#define SNMP_ASN1_APPLIC (0x40) /* (!0x80 | 0x40) */ -#define SNMP_ASN1_CONTXT (0x80) /* ( 0x80 | !0x40) */ - -#define SNMP_ASN1_CONSTR (0x20) /* ( 0x20) */ -#define SNMP_ASN1_PRIMIT (0) /* (!0x20) */ - -/* universal tags */ -#define SNMP_ASN1_INTEG 2 -#define SNMP_ASN1_OC_STR 4 -#define SNMP_ASN1_NUL 5 -#define SNMP_ASN1_OBJ_ID 6 -#define SNMP_ASN1_SEQ 16 - -/* application specific (SNMP) tags */ -#define SNMP_ASN1_IPADDR 0 /* octet string size(4) */ -#define SNMP_ASN1_COUNTER 1 /* u32_t */ -#define SNMP_ASN1_GAUGE 2 /* u32_t */ -#define SNMP_ASN1_TIMETICKS 3 /* u32_t */ -#define SNMP_ASN1_OPAQUE 4 /* octet string */ - -/* context specific (SNMP) tags */ -#define SNMP_ASN1_PDU_GET_REQ 0 -#define SNMP_ASN1_PDU_GET_NEXT_REQ 1 -#define SNMP_ASN1_PDU_GET_RESP 2 -#define SNMP_ASN1_PDU_SET_REQ 3 -#define SNMP_ASN1_PDU_TRAP 4 - -err_t snmp_asn1_dec_type(struct pbuf *p, u16_t ofs, u8_t *type); -err_t snmp_asn1_dec_length(struct pbuf *p, u16_t ofs, u8_t *octets_used, u16_t *length); -err_t snmp_asn1_dec_u32t(struct pbuf *p, u16_t ofs, u16_t len, u32_t *value); -err_t snmp_asn1_dec_s32t(struct pbuf *p, u16_t ofs, u16_t len, s32_t *value); -err_t snmp_asn1_dec_oid(struct pbuf *p, u16_t ofs, u16_t len, struct snmp_obj_id *oid); -err_t snmp_asn1_dec_raw(struct pbuf *p, u16_t ofs, u16_t len, u16_t raw_len, u8_t *raw); - -void snmp_asn1_enc_length_cnt(u16_t length, u8_t *octets_needed); -void snmp_asn1_enc_u32t_cnt(u32_t value, u16_t *octets_needed); -void snmp_asn1_enc_s32t_cnt(s32_t value, u16_t *octets_needed); -void snmp_asn1_enc_oid_cnt(u8_t ident_len, s32_t *ident, u16_t *octets_needed); -err_t snmp_asn1_enc_type(struct pbuf *p, u16_t ofs, u8_t type); -err_t snmp_asn1_enc_length(struct pbuf *p, u16_t ofs, u16_t length); -err_t snmp_asn1_enc_u32t(struct pbuf *p, u16_t ofs, u16_t octets_needed, u32_t value); -err_t snmp_asn1_enc_s32t(struct pbuf *p, u16_t ofs, u16_t octets_needed, s32_t value); -err_t snmp_asn1_enc_oid(struct pbuf *p, u16_t ofs, u8_t ident_len, s32_t *ident); -err_t snmp_asn1_enc_raw(struct pbuf *p, u16_t ofs, u16_t raw_len, u8_t *raw); - -#ifdef __cplusplus -} -#endif - -#endif /* LWIP_SNMP */ - -#endif /* __LWIP_SNMP_ASN1_H__ */ diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/lwip/snmp_msg.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/lwip/snmp_msg.h deleted file mode 100644 index 1183e3a9..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/lwip/snmp_msg.h +++ /dev/null @@ -1,315 +0,0 @@ -/** - * @file - * SNMP Agent message handling structures. - */ - -/* - * Copyright (c) 2006 Axon Digital Design B.V., The Netherlands. - * 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. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT - * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING - * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY - * OF SUCH DAMAGE. - * - * Author: Christiaan Simons - */ - -#ifndef __LWIP_SNMP_MSG_H__ -#define __LWIP_SNMP_MSG_H__ - -#include "lwip/opt.h" -#include "lwip/snmp.h" -#include "lwip/snmp_structs.h" -#include "lwip/ip_addr.h" -#include "lwip/err.h" - -#if LWIP_SNMP - -#if SNMP_PRIVATE_MIB -/* When using a private MIB, you have to create a file 'private_mib.h' that contains - * a 'struct mib_array_node mib_private' which contains your MIB. */ -#include "private_mib.h" -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -/* The listen port of the SNMP agent. Clients have to make their requests to - this port. Most standard clients won't work if you change this! */ -#ifndef SNMP_IN_PORT -#define SNMP_IN_PORT 161 -#endif -/* The remote port the SNMP agent sends traps to. Most standard trap sinks won't - work if you change this! */ -#ifndef SNMP_TRAP_PORT -#define SNMP_TRAP_PORT 162 -#endif - -#define SNMP_ES_NOERROR 0 -#define SNMP_ES_TOOBIG 1 -#define SNMP_ES_NOSUCHNAME 2 -#define SNMP_ES_BADVALUE 3 -#define SNMP_ES_READONLY 4 -#define SNMP_ES_GENERROR 5 - -#define SNMP_GENTRAP_COLDSTART 0 -#define SNMP_GENTRAP_WARMSTART 1 -#define SNMP_GENTRAP_AUTHFAIL 4 -#define SNMP_GENTRAP_ENTERPRISESPC 6 - -struct snmp_varbind -{ - /* next pointer, NULL for last in list */ - struct snmp_varbind *next; - /* previous pointer, NULL for first in list */ - struct snmp_varbind *prev; - - /* object identifier length (in s32_t) */ - u8_t ident_len; - /* object identifier array */ - s32_t *ident; - - /* object value ASN1 type */ - u8_t value_type; - /* object value length (in u8_t) */ - u8_t value_len; - /* object value */ - void *value; - - /* encoding varbind seq length length */ - u8_t seqlenlen; - /* encoding object identifier length length */ - u8_t olenlen; - /* encoding object value length length */ - u8_t vlenlen; - /* encoding varbind seq length */ - u16_t seqlen; - /* encoding object identifier length */ - u16_t olen; - /* encoding object value length */ - u16_t vlen; -}; - -struct snmp_varbind_root -{ - struct snmp_varbind *head; - struct snmp_varbind *tail; - /* number of variable bindings in list */ - u8_t count; - /* encoding varbind-list seq length length */ - u8_t seqlenlen; - /* encoding varbind-list seq length */ - u16_t seqlen; -}; - -/** output response message header length fields */ -struct snmp_resp_header_lengths -{ - /* encoding error-index length length */ - u8_t erridxlenlen; - /* encoding error-status length length */ - u8_t errstatlenlen; - /* encoding request id length length */ - u8_t ridlenlen; - /* encoding pdu length length */ - u8_t pdulenlen; - /* encoding community length length */ - u8_t comlenlen; - /* encoding version length length */ - u8_t verlenlen; - /* encoding sequence length length */ - u8_t seqlenlen; - - /* encoding error-index length */ - u16_t erridxlen; - /* encoding error-status length */ - u16_t errstatlen; - /* encoding request id length */ - u16_t ridlen; - /* encoding pdu length */ - u16_t pdulen; - /* encoding community length */ - u16_t comlen; - /* encoding version length */ - u16_t verlen; - /* encoding sequence length */ - u16_t seqlen; -}; - -/** output response message header length fields */ -struct snmp_trap_header_lengths -{ - /* encoding timestamp length length */ - u8_t tslenlen; - /* encoding specific-trap length length */ - u8_t strplenlen; - /* encoding generic-trap length length */ - u8_t gtrplenlen; - /* encoding agent-addr length length */ - u8_t aaddrlenlen; - /* encoding enterprise-id length length */ - u8_t eidlenlen; - /* encoding pdu length length */ - u8_t pdulenlen; - /* encoding community length length */ - u8_t comlenlen; - /* encoding version length length */ - u8_t verlenlen; - /* encoding sequence length length */ - u8_t seqlenlen; - - /* encoding timestamp length */ - u16_t tslen; - /* encoding specific-trap length */ - u16_t strplen; - /* encoding generic-trap length */ - u16_t gtrplen; - /* encoding agent-addr length */ - u16_t aaddrlen; - /* encoding enterprise-id length */ - u16_t eidlen; - /* encoding pdu length */ - u16_t pdulen; - /* encoding community length */ - u16_t comlen; - /* encoding version length */ - u16_t verlen; - /* encoding sequence length */ - u16_t seqlen; -}; - -/* Accepting new SNMP messages. */ -#define SNMP_MSG_EMPTY 0 -/* Search for matching object for variable binding. */ -#define SNMP_MSG_SEARCH_OBJ 1 -/* Perform SNMP operation on in-memory object. - Pass-through states, for symmetry only. */ -#define SNMP_MSG_INTERNAL_GET_OBJDEF 2 -#define SNMP_MSG_INTERNAL_GET_VALUE 3 -#define SNMP_MSG_INTERNAL_SET_TEST 4 -#define SNMP_MSG_INTERNAL_GET_OBJDEF_S 5 -#define SNMP_MSG_INTERNAL_SET_VALUE 6 -/* Perform SNMP operation on object located externally. - In theory this could be used for building a proxy agent. - Practical use is for an enterprise spc. app. gateway. */ -#define SNMP_MSG_EXTERNAL_GET_OBJDEF 7 -#define SNMP_MSG_EXTERNAL_GET_VALUE 8 -#define SNMP_MSG_EXTERNAL_SET_TEST 9 -#define SNMP_MSG_EXTERNAL_GET_OBJDEF_S 10 -#define SNMP_MSG_EXTERNAL_SET_VALUE 11 - -#define SNMP_COMMUNITY_STR_LEN 64 -struct snmp_msg_pstat -{ - /* lwIP local port (161) binding */ - struct udp_pcb *pcb; - /* source IP address */ - ip_addr_t sip; - /* source UDP port */ - u16_t sp; - /* request type */ - u8_t rt; - /* request ID */ - s32_t rid; - /* error status */ - s32_t error_status; - /* error index */ - s32_t error_index; - /* community name (zero terminated) */ - u8_t community[SNMP_COMMUNITY_STR_LEN + 1]; - /* community string length (exclusive zero term) */ - u8_t com_strlen; - /* one out of MSG_EMPTY, MSG_DEMUX, MSG_INTERNAL, MSG_EXTERNAL_x */ - u8_t state; - /* saved arguments for MSG_EXTERNAL_x */ - struct mib_external_node *ext_mib_node; - struct snmp_name_ptr ext_name_ptr; - struct obj_def ext_object_def; - struct snmp_obj_id ext_oid; - /* index into input variable binding list */ - u8_t vb_idx; - /* ptr into input variable binding list */ - struct snmp_varbind *vb_ptr; - /* list of variable bindings from input */ - struct snmp_varbind_root invb; - /* list of variable bindings to output */ - struct snmp_varbind_root outvb; - /* output response lengths used in ASN encoding */ - struct snmp_resp_header_lengths rhl; -}; - -struct snmp_msg_trap -{ - /* lwIP local port (161) binding */ - struct udp_pcb *pcb; - /* destination IP address in network order */ - ip_addr_t dip; - - /* source enterprise ID (sysObjectID) */ - struct snmp_obj_id *enterprise; - /* source IP address, raw network order format */ - u8_t sip_raw[4]; - /* generic trap code */ - u32_t gen_trap; - /* specific trap code */ - u32_t spc_trap; - /* timestamp */ - u32_t ts; - /* list of variable bindings to output */ - struct snmp_varbind_root outvb; - /* output trap lengths used in ASN encoding */ - struct snmp_trap_header_lengths thl; -}; - -/** Agent Version constant, 0 = v1 oddity */ -extern const s32_t snmp_version; -/** Agent default "public" community string */ -extern const char snmp_publiccommunity[7]; - -extern struct snmp_msg_trap trap_msg; - -/** Agent setup, start listening to port 161. */ -void snmp_init(void); -void snmp_trap_dst_enable(u8_t dst_idx, u8_t enable); -void snmp_trap_dst_ip_set(u8_t dst_idx, ip_addr_t *dst); - -/** Varbind-list functions. */ -struct snmp_varbind* snmp_varbind_alloc(struct snmp_obj_id *oid, u8_t type, u8_t len); -void snmp_varbind_free(struct snmp_varbind *vb); -void snmp_varbind_list_free(struct snmp_varbind_root *root); -void snmp_varbind_tail_add(struct snmp_varbind_root *root, struct snmp_varbind *vb); -struct snmp_varbind* snmp_varbind_tail_remove(struct snmp_varbind_root *root); - -/** Handle an internal (recv) or external (private response) event. */ -void snmp_msg_event(u8_t request_id); -err_t snmp_send_response(struct snmp_msg_pstat *m_stat); -err_t snmp_send_trap(s8_t generic_trap, struct snmp_obj_id *eoid, s32_t specific_trap); -void snmp_coldstart_trap(void); -void snmp_authfail_trap(void); - -#ifdef __cplusplus -} -#endif - -#endif /* LWIP_SNMP */ - -#endif /* __LWIP_SNMP_MSG_H__ */ diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/lwip/snmp_structs.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/lwip/snmp_structs.h deleted file mode 100644 index 0d3b46a9..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/lwip/snmp_structs.h +++ /dev/null @@ -1,268 +0,0 @@ -/** - * @file - * Generic MIB tree structures. - * - * @todo namespace prefixes - */ - -/* - * Copyright (c) 2006 Axon Digital Design B.V., The Netherlands. - * 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. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT - * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING - * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY - * OF SUCH DAMAGE. - * - * Author: Christiaan Simons - */ - -#ifndef __LWIP_SNMP_STRUCTS_H__ -#define __LWIP_SNMP_STRUCTS_H__ - -#include "lwip/opt.h" - -#if LWIP_SNMP /* don't build if not configured for use in lwipopts.h */ - -#include "lwip/snmp.h" - -#if SNMP_PRIVATE_MIB -/* When using a private MIB, you have to create a file 'private_mib.h' that contains - * a 'struct mib_array_node mib_private' which contains your MIB. */ -#include "private_mib.h" -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -/* MIB object instance */ -#define MIB_OBJECT_NONE 0 -#define MIB_OBJECT_SCALAR 1 -#define MIB_OBJECT_TAB 2 - -/* MIB access types */ -#define MIB_ACCESS_READ 1 -#define MIB_ACCESS_WRITE 2 - -/* MIB object access */ -#define MIB_OBJECT_READ_ONLY MIB_ACCESS_READ -#define MIB_OBJECT_READ_WRITE (MIB_ACCESS_READ | MIB_ACCESS_WRITE) -#define MIB_OBJECT_WRITE_ONLY MIB_ACCESS_WRITE -#define MIB_OBJECT_NOT_ACCESSIBLE 0 - -/** object definition returned by (get_object_def)() */ -struct obj_def -{ - /* MIB_OBJECT_NONE (0), MIB_OBJECT_SCALAR (1), MIB_OBJECT_TAB (2) */ - u8_t instance; - /* 0 read-only, 1 read-write, 2 write-only, 3 not-accessible */ - u8_t access; - /* ASN type for this object */ - u8_t asn_type; - /* value length (host length) */ - u16_t v_len; - /* length of instance part of supplied object identifier */ - u8_t id_inst_len; - /* instance part of supplied object identifier */ - s32_t *id_inst_ptr; -}; - -struct snmp_name_ptr -{ - u8_t ident_len; - s32_t *ident; -}; - -/** MIB const scalar (.0) node */ -#define MIB_NODE_SC 0x01 -/** MIB const array node */ -#define MIB_NODE_AR 0x02 -/** MIB array node (mem_malloced from RAM) */ -#define MIB_NODE_RA 0x03 -/** MIB list root node (mem_malloced from RAM) */ -#define MIB_NODE_LR 0x04 -/** MIB node for external objects */ -#define MIB_NODE_EX 0x05 - -/** node "base class" layout, the mandatory fields for a node */ -struct mib_node -{ - /** returns struct obj_def for the given object identifier */ - void (*get_object_def)(u8_t ident_len, s32_t *ident, struct obj_def *od); - /** returns object value for the given object identifier, - @note the caller must allocate at least len bytes for the value */ - void (*get_value)(struct obj_def *od, u16_t len, void *value); - /** tests length and/or range BEFORE setting */ - u8_t (*set_test)(struct obj_def *od, u16_t len, void *value); - /** sets object value, only to be called when set_test() */ - void (*set_value)(struct obj_def *od, u16_t len, void *value); - /** One out of MIB_NODE_AR, MIB_NODE_LR or MIB_NODE_EX */ - u8_t node_type; - /* array or max list length */ - u16_t maxlength; -}; - -/** derived node for scalars .0 index */ -typedef struct mib_node mib_scalar_node; - -/** derived node, points to a fixed size const array - of sub-identifiers plus a 'child' pointer */ -struct mib_array_node -{ - /* inherited "base class" members */ - void (*get_object_def)(u8_t ident_len, s32_t *ident, struct obj_def *od); - void (*get_value)(struct obj_def *od, u16_t len, void *value); - u8_t (*set_test)(struct obj_def *od, u16_t len, void *value); - void (*set_value)(struct obj_def *od, u16_t len, void *value); - - u8_t node_type; - u16_t maxlength; - - /* additional struct members */ - const s32_t *objid; - struct mib_node* const *nptr; -}; - -/** derived node, points to a fixed size mem_malloced array - of sub-identifiers plus a 'child' pointer */ -struct mib_ram_array_node -{ - /* inherited "base class" members */ - void (*get_object_def)(u8_t ident_len, s32_t *ident, struct obj_def *od); - void (*get_value)(struct obj_def *od, u16_t len, void *value); - u8_t (*set_test)(struct obj_def *od, u16_t len, void *value); - void (*set_value)(struct obj_def *od, u16_t len, void *value); - - u8_t node_type; - u16_t maxlength; - - /* aditional struct members */ - s32_t *objid; - struct mib_node **nptr; -}; - -struct mib_list_node -{ - struct mib_list_node *prev; - struct mib_list_node *next; - s32_t objid; - struct mib_node *nptr; -}; - -/** derived node, points to a doubly linked list - of sub-identifiers plus a 'child' pointer */ -struct mib_list_rootnode -{ - /* inherited "base class" members */ - void (*get_object_def)(u8_t ident_len, s32_t *ident, struct obj_def *od); - void (*get_value)(struct obj_def *od, u16_t len, void *value); - u8_t (*set_test)(struct obj_def *od, u16_t len, void *value); - void (*set_value)(struct obj_def *od, u16_t len, void *value); - - u8_t node_type; - u16_t maxlength; - - /* additional struct members */ - struct mib_list_node *head; - struct mib_list_node *tail; - /* counts list nodes in list */ - u16_t count; -}; - -/** derived node, has access functions for mib object in external memory or device - using 'tree_level' and 'idx', with a range 0 .. (level_length() - 1) */ -struct mib_external_node -{ - /* inherited "base class" members */ - void (*get_object_def)(u8_t ident_len, s32_t *ident, struct obj_def *od); - void (*get_value)(struct obj_def *od, u16_t len, void *value); - u8_t (*set_test)(struct obj_def *od, u16_t len, void *value); - void (*set_value)(struct obj_def *od, u16_t len, void *value); - - u8_t node_type; - u16_t maxlength; - - /* additional struct members */ - /** points to an external (in memory) record of some sort of addressing - information, passed to and interpreted by the funtions below */ - void* addr_inf; - /** tree levels under this node */ - u8_t tree_levels; - /** number of objects at this level */ - u16_t (*level_length)(void* addr_inf, u8_t level); - /** compares object sub identifier with external id - return zero when equal, nonzero when unequal */ - s32_t (*ident_cmp)(void* addr_inf, u8_t level, u16_t idx, s32_t sub_id); - void (*get_objid)(void* addr_inf, u8_t level, u16_t idx, s32_t *sub_id); - - /** async Questions */ - void (*get_object_def_q)(void* addr_inf, u8_t rid, u8_t ident_len, s32_t *ident); - void (*get_value_q)(u8_t rid, struct obj_def *od); - void (*set_test_q)(u8_t rid, struct obj_def *od); - void (*set_value_q)(u8_t rid, struct obj_def *od, u16_t len, void *value); - /** async Answers */ - void (*get_object_def_a)(u8_t rid, u8_t ident_len, s32_t *ident, struct obj_def *od); - void (*get_value_a)(u8_t rid, struct obj_def *od, u16_t len, void *value); - u8_t (*set_test_a)(u8_t rid, struct obj_def *od, u16_t len, void *value); - void (*set_value_a)(u8_t rid, struct obj_def *od, u16_t len, void *value); - /** async Panic Close (agent returns error reply, - e.g. used for external transaction cleanup) */ - void (*get_object_def_pc)(u8_t rid, u8_t ident_len, s32_t *ident); - void (*get_value_pc)(u8_t rid, struct obj_def *od); - void (*set_test_pc)(u8_t rid, struct obj_def *od); - void (*set_value_pc)(u8_t rid, struct obj_def *od); -}; - -/** export MIB tree from mib2.c */ -extern const struct mib_array_node internet; - -/** dummy function pointers for non-leaf MIB nodes from mib2.c */ -void noleafs_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od); -void noleafs_get_value(struct obj_def *od, u16_t len, void *value); -u8_t noleafs_set_test(struct obj_def *od, u16_t len, void *value); -void noleafs_set_value(struct obj_def *od, u16_t len, void *value); - -void snmp_oidtoip(s32_t *ident, ip_addr_t *ip); -void snmp_iptooid(ip_addr_t *ip, s32_t *ident); -void snmp_ifindextonetif(s32_t ifindex, struct netif **netif); -void snmp_netiftoifindex(struct netif *netif, s32_t *ifidx); - -struct mib_list_node* snmp_mib_ln_alloc(s32_t id); -void snmp_mib_ln_free(struct mib_list_node *ln); -struct mib_list_rootnode* snmp_mib_lrn_alloc(void); -void snmp_mib_lrn_free(struct mib_list_rootnode *lrn); - -s8_t snmp_mib_node_insert(struct mib_list_rootnode *rn, s32_t objid, struct mib_list_node **insn); -s8_t snmp_mib_node_find(struct mib_list_rootnode *rn, s32_t objid, struct mib_list_node **fn); -struct mib_list_rootnode *snmp_mib_node_delete(struct mib_list_rootnode *rn, struct mib_list_node *n); - -struct mib_node* snmp_search_tree(struct mib_node *node, u8_t ident_len, s32_t *ident, struct snmp_name_ptr *np); -struct mib_node* snmp_expand_tree(struct mib_node *node, u8_t ident_len, s32_t *ident, struct snmp_obj_id *oidret); -u8_t snmp_iso_prefix_tst(u8_t ident_len, s32_t *ident); -u8_t snmp_iso_prefix_expand(u8_t ident_len, s32_t *ident, struct snmp_obj_id *oidret); - -#ifdef __cplusplus -} -#endif - -#endif /* LWIP_SNMP */ - -#endif /* __LWIP_SNMP_STRUCTS_H__ */ diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/lwip/sockets.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/lwip/sockets.h deleted file mode 100644 index 73461374..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/lwip/sockets.h +++ /dev/null @@ -1,411 +0,0 @@ -/* - * Copyright (c) 2001-2004 Swedish Institute of Computer Science. - * 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. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT - * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING - * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY - * OF SUCH DAMAGE. - * - * This file is part of the lwIP TCP/IP stack. - * - * Author: Adam Dunkels - * - */ - - -#ifndef __LWIP_SOCKETS_H__ -#define __LWIP_SOCKETS_H__ - -#include "lwip/opt.h" - -#if LWIP_SOCKET /* don't build if not configured for use in lwipopts.h */ - -#include /* for size_t */ - -#include "lwip/ip_addr.h" -#include "lwip/inet.h" -#include "lwip/inet6.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/* members are in network byte order */ -struct sockaddr_in { - u8_t sin_len; - u8_t sin_family; - u16_t sin_port; - struct in_addr sin_addr; -#define SIN_ZERO_LEN 8 - char sin_zero[SIN_ZERO_LEN]; -}; - -#if LWIP_IPV6 -struct sockaddr_in6 { - u8_t sin6_len; /* length of this structure */ - u8_t sin6_family; /* AF_INET6 */ - u16_t sin6_port; /* Transport layer port # */ - u32_t sin6_flowinfo; /* IPv6 flow information */ - struct in6_addr sin6_addr; /* IPv6 address */ -}; -#endif /* LWIP_IPV6 */ - -struct sockaddr { - u8_t sa_len; - u8_t sa_family; -#if LWIP_IPV6 - u8_t sa_data[22]; -#else /* LWIP_IPV6 */ - u8_t sa_data[14]; -#endif /* LWIP_IPV6 */ -}; - -/* If your port already typedef's socklen_t, define SOCKLEN_T_DEFINED - to prevent this code from redefining it. */ -#if !defined(socklen_t) && !defined(SOCKLEN_T_DEFINED) -typedef u32_t socklen_t; -#endif - -/* Socket protocol types (TCP/UDP/RAW) */ -#define SOCK_STREAM 1 -#define SOCK_DGRAM 2 -#define SOCK_RAW 3 - -/* - * Option flags per-socket. These must match the SOF_ flags in ip.h (checked in init.c) - */ -#define SO_DEBUG 0x0001 /* Unimplemented: turn on debugging info recording */ -#define SO_ACCEPTCONN 0x0002 /* socket has had listen() */ -#define SO_REUSEADDR 0x0004 /* Allow local address reuse */ -#define SO_KEEPALIVE 0x0008 /* keep connections alive */ -#define SO_DONTROUTE 0x0010 /* Unimplemented: just use interface addresses */ -#define SO_BROADCAST 0x0020 /* permit to send and to receive broadcast messages (see IP_SOF_BROADCAST option) */ -#define SO_USELOOPBACK 0x0040 /* Unimplemented: bypass hardware when possible */ -#define SO_LINGER 0x0080 /* linger on close if data present */ -#define SO_OOBINLINE 0x0100 /* Unimplemented: leave received OOB data in line */ -#define SO_REUSEPORT 0x0200 /* Unimplemented: allow local address & port reuse */ - -#define SO_DONTLINGER ((int)(~SO_LINGER)) - -/* - * Additional options, not kept in so_options. - */ -#define SO_SNDBUF 0x1001 /* Unimplemented: send buffer size */ -#define SO_RCVBUF 0x1002 /* receive buffer size */ -#define SO_SNDLOWAT 0x1003 /* Unimplemented: send low-water mark */ -#define SO_RCVLOWAT 0x1004 /* Unimplemented: receive low-water mark */ -#define SO_SNDTIMEO 0x1005 /* Unimplemented: send timeout */ -#define SO_RCVTIMEO 0x1006 /* receive timeout */ -#define SO_ERROR 0x1007 /* get error status and clear */ -#define SO_TYPE 0x1008 /* get socket type */ -#define SO_CONTIMEO 0x1009 /* Unimplemented: connect timeout */ -#define SO_NO_CHECK 0x100a /* don't create UDP checksum */ - - -/* - * Structure used for manipulating linger option. - */ -struct linger { - int l_onoff; /* option on/off */ - int l_linger; /* linger time */ -}; - -/* - * Level number for (get/set)sockopt() to apply to socket itself. - */ -#define SOL_SOCKET 0xfff /* options for socket level */ - - -#define AF_UNSPEC 0 -#define AF_INET 2 -#if LWIP_IPV6 -#define AF_INET6 10 -#else /* LWIP_IPV6 */ -#define AF_INET6 AF_UNSPEC -#endif /* LWIP_IPV6 */ -#define PF_INET AF_INET -#define PF_INET6 AF_INET6 -#define PF_UNSPEC AF_UNSPEC - -#define IPPROTO_IP 0 -#define IPPROTO_TCP 6 -#define IPPROTO_UDP 17 -#if LWIP_IPV6 -#define IPPROTO_IPV6 41 -#endif /* LWIP_IPV6 */ -#define IPPROTO_UDPLITE 136 - -/* Flags we can use with send and recv. */ -#define MSG_PEEK 0x01 /* Peeks at an incoming message */ -#define MSG_WAITALL 0x02 /* Unimplemented: Requests that the function block until the full amount of data requested can be returned */ -#define MSG_OOB 0x04 /* Unimplemented: Requests out-of-band data. The significance and semantics of out-of-band data are protocol-specific */ -#define MSG_DONTWAIT 0x08 /* Nonblocking i/o for this operation only */ -#define MSG_MORE 0x10 /* Sender will send more */ - - -/* - * Options for level IPPROTO_IP - */ -#define IP_TOS 1 -#define IP_TTL 2 - -#if LWIP_TCP -/* - * Options for level IPPROTO_TCP - */ -#define TCP_NODELAY 0x01 /* don't delay send to coalesce packets */ -#define TCP_KEEPALIVE 0x02 /* send KEEPALIVE probes when idle for pcb->keep_idle milliseconds */ -#define TCP_KEEPIDLE 0x03 /* set pcb->keep_idle - Same as TCP_KEEPALIVE, but use seconds for get/setsockopt */ -#define TCP_KEEPINTVL 0x04 /* set pcb->keep_intvl - Use seconds for get/setsockopt */ -#define TCP_KEEPCNT 0x05 /* set pcb->keep_cnt - Use number of probes sent for get/setsockopt */ -#endif /* LWIP_TCP */ - -#if LWIP_IPV6 -/* - * Options for level IPPROTO_IPV6 - */ -#define IPV6_V6ONLY 27 /* RFC3493: boolean control to restrict AF_INET6 sockets to IPv6 communications only. */ -#endif /* LWIP_IPV6 */ - -#if LWIP_UDP && LWIP_UDPLITE -/* - * Options for level IPPROTO_UDPLITE - */ -#define UDPLITE_SEND_CSCOV 0x01 /* sender checksum coverage */ -#define UDPLITE_RECV_CSCOV 0x02 /* minimal receiver checksum coverage */ -#endif /* LWIP_UDP && LWIP_UDPLITE*/ - - -#if LWIP_IGMP -/* - * Options and types for UDP multicast traffic handling - */ -#define IP_ADD_MEMBERSHIP 3 -#define IP_DROP_MEMBERSHIP 4 -#define IP_MULTICAST_TTL 5 -#define IP_MULTICAST_IF 6 -#define IP_MULTICAST_LOOP 7 - -typedef struct ip_mreq { - struct in_addr imr_multiaddr; /* IP multicast address of group */ - struct in_addr imr_interface; /* local IP address of interface */ -} ip_mreq; -#endif /* LWIP_IGMP */ - -/* - * The Type of Service provides an indication of the abstract - * parameters of the quality of service desired. These parameters are - * to be used to guide the selection of the actual service parameters - * when transmitting a datagram through a particular network. Several - * networks offer service precedence, which somehow treats high - * precedence traffic as more important than other traffic (generally - * by accepting only traffic above a certain precedence at time of high - * load). The major choice is a three way tradeoff between low-delay, - * high-reliability, and high-throughput. - * The use of the Delay, Throughput, and Reliability indications may - * increase the cost (in some sense) of the service. In many networks - * better performance for one of these parameters is coupled with worse - * performance on another. Except for very unusual cases at most two - * of these three indications should be set. - */ -#define IPTOS_TOS_MASK 0x1E -#define IPTOS_TOS(tos) ((tos) & IPTOS_TOS_MASK) -#define IPTOS_LOWDELAY 0x10 -#define IPTOS_THROUGHPUT 0x08 -#define IPTOS_RELIABILITY 0x04 -#define IPTOS_LOWCOST 0x02 -#define IPTOS_MINCOST IPTOS_LOWCOST - -/* - * The Network Control precedence designation is intended to be used - * within a network only. The actual use and control of that - * designation is up to each network. The Internetwork Control - * designation is intended for use by gateway control originators only. - * If the actual use of these precedence designations is of concern to - * a particular network, it is the responsibility of that network to - * control the access to, and use of, those precedence designations. - */ -#define IPTOS_PREC_MASK 0xe0 -#define IPTOS_PREC(tos) ((tos) & IPTOS_PREC_MASK) -#define IPTOS_PREC_NETCONTROL 0xe0 -#define IPTOS_PREC_INTERNETCONTROL 0xc0 -#define IPTOS_PREC_CRITIC_ECP 0xa0 -#define IPTOS_PREC_FLASHOVERRIDE 0x80 -#define IPTOS_PREC_FLASH 0x60 -#define IPTOS_PREC_IMMEDIATE 0x40 -#define IPTOS_PREC_PRIORITY 0x20 -#define IPTOS_PREC_ROUTINE 0x00 - - -/* - * Commands for ioctlsocket(), taken from the BSD file fcntl.h. - * lwip_ioctl only supports FIONREAD and FIONBIO, for now - * - * Ioctl's have the command encoded in the lower word, - * and the size of any in or out parameters in the upper - * word. The high 2 bits of the upper word are used - * to encode the in/out status of the parameter; for now - * we restrict parameters to at most 128 bytes. - */ -#if !defined(FIONREAD) || !defined(FIONBIO) -#define IOCPARM_MASK 0x7fU /* parameters must be < 128 bytes */ -#define IOC_VOID 0x20000000UL /* no parameters */ -#define IOC_OUT 0x40000000UL /* copy out parameters */ -#define IOC_IN 0x80000000UL /* copy in parameters */ -#define IOC_INOUT (IOC_IN|IOC_OUT) - /* 0x20000000 distinguishes new & - old ioctl's */ -#define _IO(x,y) (IOC_VOID|((x)<<8)|(y)) - -#define _IOR(x,y,t) (IOC_OUT|(((long)sizeof(t)&IOCPARM_MASK)<<16)|((x)<<8)|(y)) - -#define _IOW(x,y,t) (IOC_IN|(((long)sizeof(t)&IOCPARM_MASK)<<16)|((x)<<8)|(y)) -#endif /* !defined(FIONREAD) || !defined(FIONBIO) */ - -#ifndef FIONREAD -#define FIONREAD _IOR('f', 127, unsigned long) /* get # bytes to read */ -#endif -#ifndef FIONBIO -#define FIONBIO _IOW('f', 126, unsigned long) /* set/clear non-blocking i/o */ -#endif - -/* Socket I/O Controls: unimplemented */ -#ifndef SIOCSHIWAT -#define SIOCSHIWAT _IOW('s', 0, unsigned long) /* set high watermark */ -#define SIOCGHIWAT _IOR('s', 1, unsigned long) /* get high watermark */ -#define SIOCSLOWAT _IOW('s', 2, unsigned long) /* set low watermark */ -#define SIOCGLOWAT _IOR('s', 3, unsigned long) /* get low watermark */ -#define SIOCATMARK _IOR('s', 7, unsigned long) /* at oob mark? */ -#endif - -/* commands for fnctl */ -#ifndef F_GETFL -#define F_GETFL 3 -#endif -#ifndef F_SETFL -#define F_SETFL 4 -#endif - -/* File status flags and file access modes for fnctl, - these are bits in an int. */ -#ifndef O_NONBLOCK -#define O_NONBLOCK 1 /* nonblocking I/O */ -#endif -#ifndef O_NDELAY -#define O_NDELAY 1 /* same as O_NONBLOCK, for compatibility */ -#endif - -#ifndef SHUT_RD - #define SHUT_RD 0 - #define SHUT_WR 1 - #define SHUT_RDWR 2 -#endif - -/* FD_SET used for lwip_select */ -#ifndef FD_SET - #undef FD_SETSIZE - /* Make FD_SETSIZE match NUM_SOCKETS in socket.c */ - #define FD_SETSIZE MEMP_NUM_NETCONN - #define FD_SET(n, p) ((p)->fd_bits[(n)/8] |= (1 << ((n) & 7))) - #define FD_CLR(n, p) ((p)->fd_bits[(n)/8] &= ~(1 << ((n) & 7))) - #define FD_ISSET(n,p) ((p)->fd_bits[(n)/8] & (1 << ((n) & 7))) - #define FD_ZERO(p) memset((void*)(p),0,sizeof(*(p))) - - typedef struct fd_set { - unsigned char fd_bits [(FD_SETSIZE+7)/8]; - } fd_set; - -#endif /* FD_SET */ - -/** LWIP_TIMEVAL_PRIVATE: if you want to use the struct timeval provided - * by your system, set this to 0 and include in cc.h */ -#ifndef LWIP_TIMEVAL_PRIVATE -#define LWIP_TIMEVAL_PRIVATE 1 -#endif - -#if LWIP_TIMEVAL_PRIVATE -struct timeval { - long tv_sec; /* seconds */ - long tv_usec; /* and microseconds */ -}; -#endif /* LWIP_TIMEVAL_PRIVATE */ - -void lwip_socket_init(void); - -int lwip_accept(int s, struct sockaddr *addr, socklen_t *addrlen); -int lwip_bind(int s, const struct sockaddr *name, socklen_t namelen); -int lwip_shutdown(int s, int how); -int lwip_getpeername (int s, struct sockaddr *name, socklen_t *namelen); -int lwip_getsockname (int s, struct sockaddr *name, socklen_t *namelen); -int lwip_getsockopt (int s, int level, int optname, void *optval, socklen_t *optlen); -int lwip_setsockopt (int s, int level, int optname, const void *optval, socklen_t optlen); -int lwip_close(int s); -int lwip_connect(int s, const struct sockaddr *name, socklen_t namelen); -int lwip_listen(int s, int backlog); -int lwip_recv(int s, void *mem, size_t len, int flags); -int lwip_read(int s, void *mem, size_t len); -int lwip_recvfrom(int s, void *mem, size_t len, int flags, - struct sockaddr *from, socklen_t *fromlen); -int lwip_send(int s, const void *dataptr, size_t size, int flags); -int lwip_sendto(int s, const void *dataptr, size_t size, int flags, - const struct sockaddr *to, socklen_t tolen); -int lwip_socket(int domain, int type, int protocol); -int lwip_write(int s, const void *dataptr, size_t size); -int lwip_select(int maxfdp1, fd_set *readset, fd_set *writeset, fd_set *exceptset, - struct timeval *timeout); -int lwip_ioctl(int s, long cmd, void *argp); -int lwip_fcntl(int s, int cmd, int val); - -#if LWIP_COMPAT_SOCKETS -#define accept(a,b,c) lwip_accept(a,b,c) -#define bind(a,b,c) lwip_bind(a,b,c) -#define shutdown(a,b) lwip_shutdown(a,b) -#define closesocket(s) lwip_close(s) -#define connect(a,b,c) lwip_connect(a,b,c) -#define getsockname(a,b,c) lwip_getsockname(a,b,c) -#define getpeername(a,b,c) lwip_getpeername(a,b,c) -#define setsockopt(a,b,c,d,e) lwip_setsockopt(a,b,c,d,e) -#define getsockopt(a,b,c,d,e) lwip_getsockopt(a,b,c,d,e) -#define listen(a,b) lwip_listen(a,b) -#define recv(a,b,c,d) lwip_recv(a,b,c,d) -#define recvfrom(a,b,c,d,e,f) lwip_recvfrom(a,b,c,d,e,f) -#define send(a,b,c,d) lwip_send(a,b,c,d) -#define sendto(a,b,c,d,e,f) lwip_sendto(a,b,c,d,e,f) -#define socket(a,b,c) lwip_socket(a,b,c) -#define select(a,b,c,d,e) lwip_select(a,b,c,d,e) -#define ioctlsocket(a,b,c) lwip_ioctl(a,b,c) - -#if LWIP_POSIX_SOCKETS_IO_NAMES -#define read(a,b,c) lwip_read(a,b,c) -#define write(a,b,c) lwip_write(a,b,c) -#define close(s) lwip_close(s) -#define fcntl(a,b,c) lwip_fcntl(a,b,c) -#endif /* LWIP_POSIX_SOCKETS_IO_NAMES */ - -#endif /* LWIP_COMPAT_SOCKETS */ - -#ifdef __cplusplus -} -#endif - -#endif /* LWIP_SOCKET */ - -#endif /* __LWIP_SOCKETS_H__ */ diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/lwip/stats.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/lwip/stats.h deleted file mode 100644 index d9112160..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/lwip/stats.h +++ /dev/null @@ -1,347 +0,0 @@ -/* - * Copyright (c) 2001-2004 Swedish Institute of Computer Science. - * 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. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT - * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING - * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY - * OF SUCH DAMAGE. - * - * This file is part of the lwIP TCP/IP stack. - * - * Author: Adam Dunkels - * - */ -#ifndef __LWIP_STATS_H__ -#define __LWIP_STATS_H__ - -#include "lwip/opt.h" - -#include "lwip/mem.h" -#include "lwip/memp.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#if LWIP_STATS - -#ifndef LWIP_STATS_LARGE -#define LWIP_STATS_LARGE 0 -#endif - -#if LWIP_STATS_LARGE -#define STAT_COUNTER u32_t -#define STAT_COUNTER_F U32_F -#else -#define STAT_COUNTER u16_t -#define STAT_COUNTER_F U16_F -#endif - -struct stats_proto { - STAT_COUNTER xmit; /* Transmitted packets. */ - STAT_COUNTER recv; /* Received packets. */ - STAT_COUNTER fw; /* Forwarded packets. */ - STAT_COUNTER drop; /* Dropped packets. */ - STAT_COUNTER chkerr; /* Checksum error. */ - STAT_COUNTER lenerr; /* Invalid length error. */ - STAT_COUNTER memerr; /* Out of memory error. */ - STAT_COUNTER rterr; /* Routing error. */ - STAT_COUNTER proterr; /* Protocol error. */ - STAT_COUNTER opterr; /* Error in options. */ - STAT_COUNTER err; /* Misc error. */ - STAT_COUNTER cachehit; -}; - -struct stats_igmp { - STAT_COUNTER xmit; /* Transmitted packets. */ - STAT_COUNTER recv; /* Received packets. */ - STAT_COUNTER drop; /* Dropped packets. */ - STAT_COUNTER chkerr; /* Checksum error. */ - STAT_COUNTER lenerr; /* Invalid length error. */ - STAT_COUNTER memerr; /* Out of memory error. */ - STAT_COUNTER proterr; /* Protocol error. */ - STAT_COUNTER rx_v1; /* Received v1 frames. */ - STAT_COUNTER rx_group; /* Received group-specific queries. */ - STAT_COUNTER rx_general; /* Received general queries. */ - STAT_COUNTER rx_report; /* Received reports. */ - STAT_COUNTER tx_join; /* Sent joins. */ - STAT_COUNTER tx_leave; /* Sent leaves. */ - STAT_COUNTER tx_report; /* Sent reports. */ -}; - -struct stats_mem { -#ifdef LWIP_DEBUG - const char *name; -#endif /* LWIP_DEBUG */ - mem_size_t avail; - mem_size_t used; - mem_size_t max; - STAT_COUNTER err; - STAT_COUNTER illegal; -}; - -struct stats_syselem { - STAT_COUNTER used; - STAT_COUNTER max; - STAT_COUNTER err; -}; - -struct stats_sys { - struct stats_syselem sem; - struct stats_syselem mutex; - struct stats_syselem mbox; -}; - -struct stats_ { -#if LINK_STATS - struct stats_proto link; -#endif -#if ETHARP_STATS - struct stats_proto etharp; -#endif -#if IPFRAG_STATS - struct stats_proto ip_frag; -#endif -#if IP_STATS - struct stats_proto ip; -#endif -#if ICMP_STATS - struct stats_proto icmp; -#endif -#if IGMP_STATS - struct stats_igmp igmp; -#endif -#if UDP_STATS - struct stats_proto udp; -#endif -#if TCP_STATS - struct stats_proto tcp; -#endif -#if MEM_STATS - struct stats_mem mem; -#endif -#if MEMP_STATS - struct stats_mem memp[MEMP_MAX]; -#endif -#if SYS_STATS - struct stats_sys sys; -#endif -#if IP6_STATS - struct stats_proto ip6; -#endif -#if ICMP6_STATS - struct stats_proto icmp6; -#endif -#if IP6_FRAG_STATS - struct stats_proto ip6_frag; -#endif -#if MLD6_STATS - struct stats_igmp mld6; -#endif -#if ND6_STATS - struct stats_proto nd6; -#endif -}; - -extern struct stats_ lwip_stats; - -void stats_init(void); - -#define STATS_INC(x) ++lwip_stats.x -#define STATS_DEC(x) --lwip_stats.x -#define STATS_INC_USED(x, y) do { lwip_stats.x.used += y; \ - if (lwip_stats.x.max < lwip_stats.x.used) { \ - lwip_stats.x.max = lwip_stats.x.used; \ - } \ - } while(0) -#else /* LWIP_STATS */ -#define stats_init() -#define STATS_INC(x) -#define STATS_DEC(x) -#define STATS_INC_USED(x) -#endif /* LWIP_STATS */ - -#if TCP_STATS -#define TCP_STATS_INC(x) STATS_INC(x) -#define TCP_STATS_DISPLAY() stats_display_proto(&lwip_stats.tcp, "TCP") -#else -#define TCP_STATS_INC(x) -#define TCP_STATS_DISPLAY() -#endif - -#if UDP_STATS -#define UDP_STATS_INC(x) STATS_INC(x) -#define UDP_STATS_DISPLAY() stats_display_proto(&lwip_stats.udp, "UDP") -#else -#define UDP_STATS_INC(x) -#define UDP_STATS_DISPLAY() -#endif - -#if ICMP_STATS -#define ICMP_STATS_INC(x) STATS_INC(x) -#define ICMP_STATS_DISPLAY() stats_display_proto(&lwip_stats.icmp, "ICMP") -#else -#define ICMP_STATS_INC(x) -#define ICMP_STATS_DISPLAY() -#endif - -#if IGMP_STATS -#define IGMP_STATS_INC(x) STATS_INC(x) -#define IGMP_STATS_DISPLAY() stats_display_igmp(&lwip_stats.igmp, "IGMP") -#else -#define IGMP_STATS_INC(x) -#define IGMP_STATS_DISPLAY() -#endif - -#if IP_STATS -#define IP_STATS_INC(x) STATS_INC(x) -#define IP_STATS_DISPLAY() stats_display_proto(&lwip_stats.ip, "IP") -#else -#define IP_STATS_INC(x) -#define IP_STATS_DISPLAY() -#endif - -#if IPFRAG_STATS -#define IPFRAG_STATS_INC(x) STATS_INC(x) -#define IPFRAG_STATS_DISPLAY() stats_display_proto(&lwip_stats.ip_frag, "IP_FRAG") -#else -#define IPFRAG_STATS_INC(x) -#define IPFRAG_STATS_DISPLAY() -#endif - -#if ETHARP_STATS -#define ETHARP_STATS_INC(x) STATS_INC(x) -#define ETHARP_STATS_DISPLAY() stats_display_proto(&lwip_stats.etharp, "ETHARP") -#else -#define ETHARP_STATS_INC(x) -#define ETHARP_STATS_DISPLAY() -#endif - -#if LINK_STATS -#define LINK_STATS_INC(x) STATS_INC(x) -#define LINK_STATS_DISPLAY() stats_display_proto(&lwip_stats.link, "LINK") -#else -#define LINK_STATS_INC(x) -#define LINK_STATS_DISPLAY() -#endif - -#if MEM_STATS -#define MEM_STATS_AVAIL(x, y) lwip_stats.mem.x = y -#define MEM_STATS_INC(x) STATS_INC(mem.x) -#define MEM_STATS_INC_USED(x, y) STATS_INC_USED(mem, y) -#define MEM_STATS_DEC_USED(x, y) lwip_stats.mem.x -= y -#define MEM_STATS_DISPLAY() stats_display_mem(&lwip_stats.mem, "HEAP") -#else -#define MEM_STATS_AVAIL(x, y) -#define MEM_STATS_INC(x) -#define MEM_STATS_INC_USED(x, y) -#define MEM_STATS_DEC_USED(x, y) -#define MEM_STATS_DISPLAY() -#endif - -#if MEMP_STATS -#define MEMP_STATS_AVAIL(x, i, y) lwip_stats.memp[i].x = y -#define MEMP_STATS_INC(x, i) STATS_INC(memp[i].x) -#define MEMP_STATS_DEC(x, i) STATS_DEC(memp[i].x) -#define MEMP_STATS_INC_USED(x, i) STATS_INC_USED(memp[i], 1) -#define MEMP_STATS_DISPLAY(i) stats_display_memp(&lwip_stats.memp[i], i) -#else -#define MEMP_STATS_AVAIL(x, i, y) -#define MEMP_STATS_INC(x, i) -#define MEMP_STATS_DEC(x, i) -#define MEMP_STATS_INC_USED(x, i) -#define MEMP_STATS_DISPLAY(i) -#endif - -#if SYS_STATS -#define SYS_STATS_INC(x) STATS_INC(sys.x) -#define SYS_STATS_DEC(x) STATS_DEC(sys.x) -#define SYS_STATS_INC_USED(x) STATS_INC_USED(sys.x, 1) -#define SYS_STATS_DISPLAY() stats_display_sys(&lwip_stats.sys) -#else -#define SYS_STATS_INC(x) -#define SYS_STATS_DEC(x) -#define SYS_STATS_INC_USED(x) -#define SYS_STATS_DISPLAY() -#endif - -#if IP6_STATS -#define IP6_STATS_INC(x) STATS_INC(x) -#define IP6_STATS_DISPLAY() stats_display_proto(&lwip_stats.ip6, "IPv6") -#else -#define IP6_STATS_INC(x) -#define IP6_STATS_DISPLAY() -#endif - -#if ICMP6_STATS -#define ICMP6_STATS_INC(x) STATS_INC(x) -#define ICMP6_STATS_DISPLAY() stats_display_proto(&lwip_stats.icmp6, "ICMPv6") -#else -#define ICMP6_STATS_INC(x) -#define ICMP6_STATS_DISPLAY() -#endif - -#if IP6_FRAG_STATS -#define IP6_FRAG_STATS_INC(x) STATS_INC(x) -#define IP6_FRAG_STATS_DISPLAY() stats_display_proto(&lwip_stats.ip6_frag, "IPv6 FRAG") -#else -#define IP6_FRAG_STATS_INC(x) -#define IP6_FRAG_STATS_DISPLAY() -#endif - -#if MLD6_STATS -#define MLD6_STATS_INC(x) STATS_INC(x) -#define MLD6_STATS_DISPLAY() stats_display_igmp(&lwip_stats.mld6, "MLDv1") -#else -#define MLD6_STATS_INC(x) -#define MLD6_STATS_DISPLAY() -#endif - -#if ND6_STATS -#define ND6_STATS_INC(x) STATS_INC(x) -#define ND6_STATS_DISPLAY() stats_display_proto(&lwip_stats.nd6, "ND") -#else -#define ND6_STATS_INC(x) -#define ND6_STATS_DISPLAY() -#endif - -/* Display of statistics */ -#if LWIP_STATS_DISPLAY -void stats_display(void); -void stats_display_proto(struct stats_proto *proto, const char *name); -void stats_display_igmp(struct stats_igmp *igmp, const char *name); -void stats_display_mem(struct stats_mem *mem, const char *name); -void stats_display_memp(struct stats_mem *mem, int index); -void stats_display_sys(struct stats_sys *sys); -#else /* LWIP_STATS_DISPLAY */ -#define stats_display() -#define stats_display_proto(proto, name) -#define stats_display_igmp(igmp, name) -#define stats_display_mem(mem, name) -#define stats_display_memp(mem, index) -#define stats_display_sys(sys) -#endif /* LWIP_STATS_DISPLAY */ - -#ifdef __cplusplus -} -#endif - -#endif /* __LWIP_STATS_H__ */ diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/lwip/sys.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/lwip/sys.h deleted file mode 100644 index fd45ee8a..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/lwip/sys.h +++ /dev/null @@ -1,336 +0,0 @@ -/* - * Copyright (c) 2001-2004 Swedish Institute of Computer Science. - * 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. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT - * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING - * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY - * OF SUCH DAMAGE. - * - * This file is part of the lwIP TCP/IP stack. - * - * Author: Adam Dunkels - * - */ -#ifndef __LWIP_SYS_H__ -#define __LWIP_SYS_H__ - -#include "lwip/opt.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#if NO_SYS - -/* For a totally minimal and standalone system, we provide null - definitions of the sys_ functions. */ -typedef u8_t sys_sem_t; -typedef u8_t sys_mutex_t; -typedef u8_t sys_mbox_t; - -#define sys_sem_new(s, c) ERR_OK -#define sys_sem_signal(s) -#define sys_sem_wait(s) -#define sys_arch_sem_wait(s,t) -#define sys_sem_free(s) -#define sys_sem_valid(s) 0 -#define sys_sem_set_invalid(s) -#define sys_mutex_new(mu) ERR_OK -#define sys_mutex_lock(mu) -#define sys_mutex_unlock(mu) -#define sys_mutex_free(mu) -#define sys_mutex_valid(mu) 0 -#define sys_mutex_set_invalid(mu) -#define sys_mbox_new(m, s) ERR_OK -#define sys_mbox_fetch(m,d) -#define sys_mbox_tryfetch(m,d) -#define sys_mbox_post(m,d) -#define sys_mbox_trypost(m,d) -#define sys_mbox_free(m) -#define sys_mbox_valid(m) -#define sys_mbox_set_invalid(m) - -#define sys_thread_new(n,t,a,s,p) - -#define sys_msleep(t) - -#else /* NO_SYS */ - -/** Return code for timeouts from sys_arch_mbox_fetch and sys_arch_sem_wait */ -#define SYS_ARCH_TIMEOUT 0xffffffffUL - -/** sys_mbox_tryfetch() returns SYS_MBOX_EMPTY if appropriate. - * For now we use the same magic value, but we allow this to change in future. - */ -#define SYS_MBOX_EMPTY SYS_ARCH_TIMEOUT - -#include "lwip/err.h" -#include "arch/sys_arch.h" - -/** Function prototype for thread functions */ -typedef void (*lwip_thread_fn)(void *arg); - -/* Function prototypes for functions to be implemented by platform ports - (in sys_arch.c) */ - -/* Mutex functions: */ - -/** Define LWIP_COMPAT_MUTEX if the port has no mutexes and binary semaphores - should be used instead */ -#if LWIP_COMPAT_MUTEX -/* for old ports that don't have mutexes: define them to binary semaphores */ -#define sys_mutex_t sys_sem_t -#define sys_mutex_new(mutex) sys_sem_new(mutex, 1) -#define sys_mutex_lock(mutex) sys_sem_wait(mutex) -#define sys_mutex_unlock(mutex) sys_sem_signal(mutex) -#define sys_mutex_free(mutex) sys_sem_free(mutex) -#define sys_mutex_valid(mutex) sys_sem_valid(mutex) -#define sys_mutex_set_invalid(mutex) sys_sem_set_invalid(mutex) - -#else /* LWIP_COMPAT_MUTEX */ - -/** Create a new mutex - * @param mutex pointer to the mutex to create - * @return a new mutex */ -err_t sys_mutex_new(sys_mutex_t *mutex); -/** Lock a mutex - * @param mutex the mutex to lock */ -void sys_mutex_lock(sys_mutex_t *mutex); -/** Unlock a mutex - * @param mutex the mutex to unlock */ -void sys_mutex_unlock(sys_mutex_t *mutex); -/** Delete a semaphore - * @param mutex the mutex to delete */ -void sys_mutex_free(sys_mutex_t *mutex); -#ifndef sys_mutex_valid -/** Check if a mutex is valid/allocated: return 1 for valid, 0 for invalid */ -int sys_mutex_valid(sys_mutex_t *mutex); -#endif -#ifndef sys_mutex_set_invalid -/** Set a mutex invalid so that sys_mutex_valid returns 0 */ -void sys_mutex_set_invalid(sys_mutex_t *mutex); -#endif -#endif /* LWIP_COMPAT_MUTEX */ - -/* Semaphore functions: */ - -/** Create a new semaphore - * @param sem pointer to the semaphore to create - * @param count initial count of the semaphore - * @return ERR_OK if successful, another err_t otherwise */ -err_t sys_sem_new(sys_sem_t *sem, u8_t count); -/** Signals a semaphore - * @param sem the semaphore to signal */ -void sys_sem_signal(sys_sem_t *sem); -/** Wait for a semaphore for the specified timeout - * @param sem the semaphore to wait for - * @param timeout timeout in milliseconds to wait (0 = wait forever) - * @return time (in milliseconds) waited for the semaphore - * or SYS_ARCH_TIMEOUT on timeout */ -u32_t sys_arch_sem_wait(sys_sem_t *sem, u32_t timeout); -/** Delete a semaphore - * @param sem semaphore to delete */ -void sys_sem_free(sys_sem_t *sem); -/** Wait for a semaphore - forever/no timeout */ -#define sys_sem_wait(sem) sys_arch_sem_wait(sem, 0) -#ifndef sys_sem_valid -/** Check if a sempahore is valid/allocated: return 1 for valid, 0 for invalid */ -int sys_sem_valid(sys_sem_t *sem); -#endif -#ifndef sys_sem_set_invalid -/** Set a semaphore invalid so that sys_sem_valid returns 0 */ -void sys_sem_set_invalid(sys_sem_t *sem); -#endif - -/* Time functions. */ -#ifndef sys_msleep -void sys_msleep(u32_t ms); /* only has a (close to) 1 jiffy resolution. */ -#endif - -/* Mailbox functions. */ - -/** Create a new mbox of specified size - * @param mbox pointer to the mbox to create - * @param size (miminum) number of messages in this mbox - * @return ERR_OK if successful, another err_t otherwise */ -err_t sys_mbox_new(sys_mbox_t *mbox, int size); -/** Post a message to an mbox - may not fail - * -> blocks if full, only used from tasks not from ISR - * @param mbox mbox to posts the message - * @param msg message to post (ATTENTION: can be NULL) */ -void sys_mbox_post(sys_mbox_t *mbox, void *msg); -/** Try to post a message to an mbox - may fail if full or ISR - * @param mbox mbox to posts the message - * @param msg message to post (ATTENTION: can be NULL) */ -err_t sys_mbox_trypost(sys_mbox_t *mbox, void *msg); -/** Wait for a new message to arrive in the mbox - * @param mbox mbox to get a message from - * @param msg pointer where the message is stored - * @param timeout maximum time (in milliseconds) to wait for a message (0 = wait forever) - * @return time (in milliseconds) waited for a message, may be 0 if not waited - or SYS_ARCH_TIMEOUT on timeout - * The returned time has to be accurate to prevent timer jitter! */ -u32_t sys_arch_mbox_fetch(sys_mbox_t *mbox, void **msg, u32_t timeout); -/* Allow port to override with a macro, e.g. special timout for sys_arch_mbox_fetch() */ -#ifndef sys_arch_mbox_tryfetch -/** Wait for a new message to arrive in the mbox - * @param mbox mbox to get a message from - * @param msg pointer where the message is stored - * @return 0 (milliseconds) if a message has been received - * or SYS_MBOX_EMPTY if the mailbox is empty */ -u32_t sys_arch_mbox_tryfetch(sys_mbox_t *mbox, void **msg); -#endif -/** For now, we map straight to sys_arch implementation. */ -#define sys_mbox_tryfetch(mbox, msg) sys_arch_mbox_tryfetch(mbox, msg) -/** Delete an mbox - * @param mbox mbox to delete */ -void sys_mbox_free(sys_mbox_t *mbox); -#define sys_mbox_fetch(mbox, msg) sys_arch_mbox_fetch(mbox, msg, 0) -#ifndef sys_mbox_valid -/** Check if an mbox is valid/allocated: return 1 for valid, 0 for invalid */ -int sys_mbox_valid(sys_mbox_t *mbox); -#endif -#ifndef sys_mbox_set_invalid -/** Set an mbox invalid so that sys_mbox_valid returns 0 */ -void sys_mbox_set_invalid(sys_mbox_t *mbox); -#endif - -/** The only thread function: - * Creates a new thread - * @param name human-readable name for the thread (used for debugging purposes) - * @param thread thread-function - * @param arg parameter passed to 'thread' - * @param stacksize stack size in bytes for the new thread (may be ignored by ports) - * @param prio priority of the new thread (may be ignored by ports) */ -sys_thread_t sys_thread_new(const char *name, lwip_thread_fn thread, void *arg, int stacksize, int prio); - -#endif /* NO_SYS */ - -/* sys_init() must be called before anthing else. */ -void sys_init(void); - -#ifndef sys_jiffies -/** Ticks/jiffies since power up. */ -u32_t sys_jiffies(void); -#endif - -/** Returns the current time in milliseconds, - * may be the same as sys_jiffies or at least based on it. */ -u32_t sys_now(void); - -/* Critical Region Protection */ -/* These functions must be implemented in the sys_arch.c file. - In some implementations they can provide a more light-weight protection - mechanism than using semaphores. Otherwise semaphores can be used for - implementation */ -#ifndef SYS_ARCH_PROTECT -/** SYS_LIGHTWEIGHT_PROT - * define SYS_LIGHTWEIGHT_PROT in lwipopts.h if you want inter-task protection - * for certain critical regions during buffer allocation, deallocation and memory - * allocation and deallocation. - */ -#if SYS_LIGHTWEIGHT_PROT - -/** SYS_ARCH_DECL_PROTECT - * declare a protection variable. This macro will default to defining a variable of - * type sys_prot_t. If a particular port needs a different implementation, then - * this macro may be defined in sys_arch.h. - */ -#define SYS_ARCH_DECL_PROTECT(lev) sys_prot_t lev -/** SYS_ARCH_PROTECT - * Perform a "fast" protect. This could be implemented by - * disabling interrupts for an embedded system or by using a semaphore or - * mutex. The implementation should allow calling SYS_ARCH_PROTECT when - * already protected. The old protection level is returned in the variable - * "lev". This macro will default to calling the sys_arch_protect() function - * which should be implemented in sys_arch.c. If a particular port needs a - * different implementation, then this macro may be defined in sys_arch.h - */ -#define SYS_ARCH_PROTECT(lev) lev = sys_arch_protect() -/** SYS_ARCH_UNPROTECT - * Perform a "fast" set of the protection level to "lev". This could be - * implemented by setting the interrupt level to "lev" within the MACRO or by - * using a semaphore or mutex. This macro will default to calling the - * sys_arch_unprotect() function which should be implemented in - * sys_arch.c. If a particular port needs a different implementation, then - * this macro may be defined in sys_arch.h - */ -#define SYS_ARCH_UNPROTECT(lev) sys_arch_unprotect(lev) -sys_prot_t sys_arch_protect(void); -void sys_arch_unprotect(sys_prot_t pval); - -#else - -#define SYS_ARCH_DECL_PROTECT(lev) -#define SYS_ARCH_PROTECT(lev) -#define SYS_ARCH_UNPROTECT(lev) - -#endif /* SYS_LIGHTWEIGHT_PROT */ - -#endif /* SYS_ARCH_PROTECT */ - -/* - * Macros to set/get and increase/decrease variables in a thread-safe way. - * Use these for accessing variable that are used from more than one thread. - */ - -#ifndef SYS_ARCH_INC -#define SYS_ARCH_INC(var, val) do { \ - SYS_ARCH_DECL_PROTECT(old_level); \ - SYS_ARCH_PROTECT(old_level); \ - var += val; \ - SYS_ARCH_UNPROTECT(old_level); \ - } while(0) -#endif /* SYS_ARCH_INC */ - -#ifndef SYS_ARCH_DEC -#define SYS_ARCH_DEC(var, val) do { \ - SYS_ARCH_DECL_PROTECT(old_level); \ - SYS_ARCH_PROTECT(old_level); \ - var -= val; \ - SYS_ARCH_UNPROTECT(old_level); \ - } while(0) -#endif /* SYS_ARCH_DEC */ - -#ifndef SYS_ARCH_GET -#define SYS_ARCH_GET(var, ret) do { \ - SYS_ARCH_DECL_PROTECT(old_level); \ - SYS_ARCH_PROTECT(old_level); \ - ret = var; \ - SYS_ARCH_UNPROTECT(old_level); \ - } while(0) -#endif /* SYS_ARCH_GET */ - -#ifndef SYS_ARCH_SET -#define SYS_ARCH_SET(var, val) do { \ - SYS_ARCH_DECL_PROTECT(old_level); \ - SYS_ARCH_PROTECT(old_level); \ - var = val; \ - SYS_ARCH_UNPROTECT(old_level); \ - } while(0) -#endif /* SYS_ARCH_SET */ - - -#ifdef __cplusplus -} -#endif - -#endif /* __LWIP_SYS_H__ */ diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/lwip/tcp.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/lwip/tcp.h deleted file mode 100644 index 535b6a38..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/lwip/tcp.h +++ /dev/null @@ -1,400 +0,0 @@ -/* - * Copyright (c) 2001-2004 Swedish Institute of Computer Science. - * 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. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT - * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING - * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY - * OF SUCH DAMAGE. - * - * This file is part of the lwIP TCP/IP stack. - * - * Author: Adam Dunkels - * - */ -#ifndef __LWIP_TCP_H__ -#define __LWIP_TCP_H__ - -#include "lwip/opt.h" - -#if LWIP_TCP /* don't build if not configured for use in lwipopts.h */ - -#include "lwip/mem.h" -#include "lwip/pbuf.h" -#include "lwip/ip.h" -#include "lwip/icmp.h" -#include "lwip/err.h" -#include "lwip/ip6.h" -#include "lwip/ip6_addr.h" - -#ifdef __cplusplus -extern "C" { -#endif - -struct tcp_pcb; - -/** Function prototype for tcp accept callback functions. Called when a new - * connection can be accepted on a listening pcb. - * - * @param arg Additional argument to pass to the callback function (@see tcp_arg()) - * @param newpcb The new connection pcb - * @param err An error code if there has been an error accepting. - * Only return ERR_ABRT if you have called tcp_abort from within the - * callback function! - */ -typedef err_t (*tcp_accept_fn)(void *arg, struct tcp_pcb *newpcb, err_t err); - -/** Function prototype for tcp receive callback functions. Called when data has - * been received. - * - * @param arg Additional argument to pass to the callback function (@see tcp_arg()) - * @param tpcb The connection pcb which received data - * @param p The received data (or NULL when the connection has been closed!) - * @param err An error code if there has been an error receiving - * Only return ERR_ABRT if you have called tcp_abort from within the - * callback function! - */ -typedef err_t (*tcp_recv_fn)(void *arg, struct tcp_pcb *tpcb, - struct pbuf *p, err_t err); - -/** Function prototype for tcp sent callback functions. Called when sent data has - * been acknowledged by the remote side. Use it to free corresponding resources. - * This also means that the pcb has now space available to send new data. - * - * @param arg Additional argument to pass to the callback function (@see tcp_arg()) - * @param tpcb The connection pcb for which data has been acknowledged - * @param len The amount of bytes acknowledged - * @return ERR_OK: try to send some data by calling tcp_output - * Only return ERR_ABRT if you have called tcp_abort from within the - * callback function! - */ -typedef err_t (*tcp_sent_fn)(void *arg, struct tcp_pcb *tpcb, - u16_t len); - -/** Function prototype for tcp poll callback functions. Called periodically as - * specified by @see tcp_poll. - * - * @param arg Additional argument to pass to the callback function (@see tcp_arg()) - * @param tpcb tcp pcb - * @return ERR_OK: try to send some data by calling tcp_output - * Only return ERR_ABRT if you have called tcp_abort from within the - * callback function! - */ -typedef err_t (*tcp_poll_fn)(void *arg, struct tcp_pcb *tpcb); - -/** Function prototype for tcp error callback functions. Called when the pcb - * receives a RST or is unexpectedly closed for any other reason. - * - * @note The corresponding pcb is already freed when this callback is called! - * - * @param arg Additional argument to pass to the callback function (@see tcp_arg()) - * @param err Error code to indicate why the pcb has been closed - * ERR_ABRT: aborted through tcp_abort or by a TCP timer - * ERR_RST: the connection was reset by the remote host - */ -typedef void (*tcp_err_fn)(void *arg, err_t err); - -/** Function prototype for tcp connected callback functions. Called when a pcb - * is connected to the remote side after initiating a connection attempt by - * calling tcp_connect(). - * - * @param arg Additional argument to pass to the callback function (@see tcp_arg()) - * @param tpcb The connection pcb which is connected - * @param err An unused error code, always ERR_OK currently ;-) TODO! - * Only return ERR_ABRT if you have called tcp_abort from within the - * callback function! - * - * @note When a connection attempt fails, the error callback is currently called! - */ -typedef err_t (*tcp_connected_fn)(void *arg, struct tcp_pcb *tpcb, err_t err); - -enum tcp_state { - CLOSED = 0, - LISTEN = 1, - SYN_SENT = 2, - SYN_RCVD = 3, - ESTABLISHED = 4, - FIN_WAIT_1 = 5, - FIN_WAIT_2 = 6, - CLOSE_WAIT = 7, - CLOSING = 8, - LAST_ACK = 9, - TIME_WAIT = 10 -}; - -#if LWIP_CALLBACK_API - /* Function to call when a listener has been connected. - * @param arg user-supplied argument (tcp_pcb.callback_arg) - * @param pcb a new tcp_pcb that now is connected - * @param err an error argument (TODO: that is current always ERR_OK?) - * @return ERR_OK: accept the new connection, - * any other err_t abortsthe new connection - */ -#define DEF_ACCEPT_CALLBACK tcp_accept_fn accept; -#else /* LWIP_CALLBACK_API */ -#define DEF_ACCEPT_CALLBACK -#endif /* LWIP_CALLBACK_API */ - -/** - * members common to struct tcp_pcb and struct tcp_listen_pcb - */ -#define TCP_PCB_COMMON(type) \ - type *next; /* for the linked list */ \ - void *callback_arg; \ - /* the accept callback for listen- and normal pcbs, if LWIP_CALLBACK_API */ \ - DEF_ACCEPT_CALLBACK \ - enum tcp_state state; /* TCP state */ \ - u8_t prio; \ - /* ports are in host byte order */ \ - int bound_to_netif; \ - u16_t local_port; \ - char local_netif[3] - - -/* the TCP protocol control block */ -struct tcp_pcb { -/** common PCB members */ - IP_PCB; -/** protocol specific PCB members */ - TCP_PCB_COMMON(struct tcp_pcb); - - /* ports are in host byte order */ - u16_t remote_port; - - u8_t flags; -#define TF_ACK_DELAY ((u8_t)0x01U) /* Delayed ACK. */ -#define TF_ACK_NOW ((u8_t)0x02U) /* Immediate ACK. */ -#define TF_INFR ((u8_t)0x04U) /* In fast recovery. */ -#define TF_TIMESTAMP ((u8_t)0x08U) /* Timestamp option enabled */ -#define TF_RXCLOSED ((u8_t)0x10U) /* rx closed by tcp_shutdown */ -#define TF_FIN ((u8_t)0x20U) /* Connection was closed locally (FIN segment enqueued). */ -#define TF_NODELAY ((u8_t)0x40U) /* Disable Nagle algorithm */ -#define TF_NAGLEMEMERR ((u8_t)0x80U) /* nagle enabled, memerr, try to output to prevent delayed ACK to happen */ - - /* the rest of the fields are in host byte order - as we have to do some math with them */ - - /* Timers */ - u8_t polltmr, pollinterval; - u8_t last_timer; - u32_t tmr; - - /* receiver variables */ - u32_t rcv_nxt; /* next seqno expected */ - u16_t rcv_wnd; /* receiver window available */ - u16_t rcv_ann_wnd; /* receiver window to announce */ - u32_t rcv_ann_right_edge; /* announced right edge of window */ - - /* Retransmission timer. */ - s16_t rtime; - - u16_t mss; /* maximum segment size */ - - /* RTT (round trip time) estimation variables */ - u32_t rttest; /* RTT estimate in 500ms ticks */ - u32_t rtseq; /* sequence number being timed */ - s16_t sa, sv; /* @todo document this */ - - s16_t rto; /* retransmission time-out */ - u8_t nrtx; /* number of retransmissions */ - - /* fast retransmit/recovery */ - u8_t dupacks; - u32_t lastack; /* Highest acknowledged seqno. */ - - /* congestion avoidance/control variables */ - u16_t cwnd; - u16_t ssthresh; - - /* sender variables */ - u32_t snd_nxt; /* next new seqno to be sent */ - u32_t snd_wl1, snd_wl2; /* Sequence and acknowledgement numbers of last - window update. */ - u32_t snd_lbb; /* Sequence number of next byte to be buffered. */ - u16_t snd_wnd; /* sender window */ - u16_t snd_wnd_max; /* the maximum sender window announced by the remote host */ - - u16_t acked; - - u16_t snd_buf; /* Available buffer space for sending (in bytes). */ -#define TCP_SNDQUEUELEN_OVERFLOW (0xffffU-3) - u16_t snd_queuelen; /* Available buffer space for sending (in tcp_segs). */ - -#if TCP_OVERSIZE - /* Extra bytes available at the end of the last pbuf in unsent. */ - u16_t unsent_oversize; -#endif /* TCP_OVERSIZE */ - - /* These are ordered by sequence number: */ - struct tcp_seg *unsent; /* Unsent (queued) segments. */ - struct tcp_seg *unacked; /* Sent but unacknowledged segments. */ -#if TCP_QUEUE_OOSEQ - struct tcp_seg *ooseq; /* Received out of sequence segments. */ -#endif /* TCP_QUEUE_OOSEQ */ - - struct pbuf *refused_data; /* Data previously received but not yet taken by upper layer */ - -#if LWIP_CALLBACK_API - /* Function to be called when more send buffer space is available. */ - tcp_sent_fn sent; - /* Function to be called when (in-sequence) data has arrived. */ - tcp_recv_fn recv; - /* Function to be called when a connection has been set up. */ - tcp_connected_fn connected; - /* Function which is called periodically. */ - tcp_poll_fn poll; - /* Function to be called whenever a fatal error occurs. */ - tcp_err_fn errf; -#endif /* LWIP_CALLBACK_API */ - -#if LWIP_TCP_TIMESTAMPS - u32_t ts_lastacksent; - u32_t ts_recent; -#endif /* LWIP_TCP_TIMESTAMPS */ - - /* idle time before KEEPALIVE is sent */ - u32_t keep_idle; -#if LWIP_TCP_KEEPALIVE - u32_t keep_intvl; - u32_t keep_cnt; -#endif /* LWIP_TCP_KEEPALIVE */ - - /* Persist timer counter */ - u8_t persist_cnt; - /* Persist timer back-off */ - u8_t persist_backoff; - - /* KEEPALIVE counter */ - u8_t keep_cnt_sent; -}; - -struct tcp_pcb_listen { -/* Common members of all PCB types */ - IP_PCB; -/* Protocol specific PCB members */ - TCP_PCB_COMMON(struct tcp_pcb_listen); - -#if TCP_LISTEN_BACKLOG - u8_t backlog; - u8_t accepts_pending; -#endif /* TCP_LISTEN_BACKLOG */ -#if LWIP_IPV6 - u8_t accept_any_ip_version; -#endif /* LWIP_IPV6 */ -}; - -#if LWIP_EVENT_API - -enum lwip_event { - LWIP_EVENT_ACCEPT, - LWIP_EVENT_SENT, - LWIP_EVENT_RECV, - LWIP_EVENT_CONNECTED, - LWIP_EVENT_POLL, - LWIP_EVENT_ERR -}; - -err_t lwip_tcp_event(void *arg, struct tcp_pcb *pcb, - enum lwip_event, - struct pbuf *p, - u16_t size, - err_t err); - -#endif /* LWIP_EVENT_API */ - -/* Application program's interface: */ -struct tcp_pcb * tcp_new (void); - -void tcp_arg (struct tcp_pcb *pcb, void *arg); -void tcp_accept (struct tcp_pcb *pcb, tcp_accept_fn accept); -void tcp_recv (struct tcp_pcb *pcb, tcp_recv_fn recv); -void tcp_sent (struct tcp_pcb *pcb, tcp_sent_fn sent); -void tcp_poll (struct tcp_pcb *pcb, tcp_poll_fn poll, u8_t interval); -void tcp_err (struct tcp_pcb *pcb, tcp_err_fn err); - -#define tcp_mss(pcb) (((pcb)->flags & TF_TIMESTAMP) ? ((pcb)->mss - 12) : (pcb)->mss) -#define tcp_sndbuf(pcb) ((pcb)->snd_buf) -#define tcp_sndqueuelen(pcb) ((pcb)->snd_queuelen) -#define tcp_nagle_disable(pcb) ((pcb)->flags |= TF_NODELAY) -#define tcp_nagle_enable(pcb) ((pcb)->flags &= ~TF_NODELAY) -#define tcp_nagle_disabled(pcb) (((pcb)->flags & TF_NODELAY) != 0) - -#if TCP_LISTEN_BACKLOG -#define tcp_accepted(pcb) do { \ - LWIP_ASSERT("pcb->state == LISTEN (called for wrong pcb?)", pcb->state == LISTEN); \ - (((struct tcp_pcb_listen *)(pcb))->accepts_pending--); } while(0) -#else /* TCP_LISTEN_BACKLOG */ -#define tcp_accepted(pcb) LWIP_ASSERT("pcb->state == LISTEN (called for wrong pcb?)", \ - (pcb)->state == LISTEN) -#endif /* TCP_LISTEN_BACKLOG */ - -void tcp_recved (struct tcp_pcb *pcb, u16_t len); -err_t tcp_bind (struct tcp_pcb *pcb, ip_addr_t *ipaddr, - u16_t port); -err_t tcp_bind_to_netif (struct tcp_pcb *pcb, const char ifname[3]); -err_t tcp_connect (struct tcp_pcb *pcb, ip_addr_t *ipaddr, - u16_t port, tcp_connected_fn connected); - -struct tcp_pcb * tcp_listen_with_backlog(struct tcp_pcb *pcb, u8_t backlog); -#define tcp_listen(pcb) tcp_listen_with_backlog(pcb, TCP_DEFAULT_LISTEN_BACKLOG) - -void tcp_abort (struct tcp_pcb *pcb); -err_t tcp_close (struct tcp_pcb *pcb); -err_t tcp_shutdown(struct tcp_pcb *pcb, int shut_rx, int shut_tx); - -/* Flags for "apiflags" parameter in tcp_write */ -#define TCP_WRITE_FLAG_COPY 0x01 -#define TCP_WRITE_FLAG_MORE 0x02 - -err_t tcp_write (struct tcp_pcb *pcb, const void *dataptr, u16_t len, - u8_t apiflags); - -void tcp_setprio (struct tcp_pcb *pcb, u8_t prio); - -#define TCP_PRIO_MIN 1 -#define TCP_PRIO_NORMAL 64 -#define TCP_PRIO_MAX 127 - -err_t tcp_output (struct tcp_pcb *pcb); - - -const char* tcp_debug_state_str(enum tcp_state s); - -#if LWIP_IPV6 -struct tcp_pcb * tcp_new_ip6 (void); -#define tcp_bind_ip6(pcb, ip6addr, port) \ - tcp_bind(pcb, ip6_2_ip(ip6addr), port) -#define tcp_connect_ip6(pcb, ip6addr, port, connected) \ - tcp_connect(pcb, ip6_2_ip(ip6addr), port, connected) -struct tcp_pcb * tcp_listen_dual_with_backlog(struct tcp_pcb *pcb, u8_t backlog); -#define tcp_listen_dual(pcb) tcp_listen_dual_with_backlog(pcb, TCP_DEFAULT_LISTEN_BACKLOG) -#else /* LWIP_IPV6 */ -#define tcp_listen_dual_with_backlog(pcb, backlog) tcp_listen_with_backlog(pcb, backlog) -#define tcp_listen_dual(pcb) tcp_listen(pcb) -#endif /* LWIP_IPV6 */ - - -#ifdef __cplusplus -} -#endif - -#endif /* LWIP_TCP */ - -#endif /* __LWIP_TCP_H__ */ diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/lwip/tcp_impl.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/lwip/tcp_impl.h deleted file mode 100644 index 2afc20d3..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/lwip/tcp_impl.h +++ /dev/null @@ -1,508 +0,0 @@ -/* - * Copyright (c) 2001-2004 Swedish Institute of Computer Science. - * 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. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT - * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING - * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY - * OF SUCH DAMAGE. - * - * This file is part of the lwIP TCP/IP stack. - * - * Author: Adam Dunkels - * - */ -#ifndef __LWIP_TCP_IMPL_H__ -#define __LWIP_TCP_IMPL_H__ - -#include "lwip/opt.h" - -#if LWIP_TCP /* don't build if not configured for use in lwipopts.h */ - -#include "lwip/tcp.h" -#include "lwip/mem.h" -#include "lwip/pbuf.h" -#include "lwip/ip.h" -#include "lwip/icmp.h" -#include "lwip/err.h" -#include "lwip/ip6.h" -#include "lwip/ip6_addr.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/* Functions for interfacing with TCP: */ - -/* Lower layer interface to TCP: */ -void tcp_init (void); /* Initialize this module. */ -void tcp_tmr (void); /* Must be called every - TCP_TMR_INTERVAL - ms. (Typically 250 ms). */ -/* It is also possible to call these two functions at the right - intervals (instead of calling tcp_tmr()). */ -void tcp_slowtmr (void); -void tcp_fasttmr (void); - - -/* Only used by IP to pass a TCP segment to TCP: */ -void tcp_input (struct pbuf *p, struct netif *inp); -/* Used within the TCP code only: */ -struct tcp_pcb * tcp_alloc (u8_t prio); -void tcp_abandon (struct tcp_pcb *pcb, int reset); -err_t tcp_send_empty_ack(struct tcp_pcb *pcb); -void tcp_rexmit (struct tcp_pcb *pcb); -void tcp_rexmit_rto (struct tcp_pcb *pcb); -void tcp_rexmit_fast (struct tcp_pcb *pcb); -u32_t tcp_update_rcv_ann_wnd(struct tcp_pcb *pcb); -err_t tcp_process_refused_data(struct tcp_pcb *pcb); - -/** - * This is the Nagle algorithm: try to combine user data to send as few TCP - * segments as possible. Only send if - * - no previously transmitted data on the connection remains unacknowledged or - * - the TF_NODELAY flag is set (nagle algorithm turned off for this pcb) or - * - the only unsent segment is at least pcb->mss bytes long (or there is more - * than one unsent segment - with lwIP, this can happen although unsent->len < mss) - * - or if we are in fast-retransmit (TF_INFR) - */ -#define tcp_do_output_nagle(tpcb) ((((tpcb)->unacked == NULL) || \ - ((tpcb)->flags & (TF_NODELAY | TF_INFR)) || \ - (((tpcb)->unsent != NULL) && (((tpcb)->unsent->next != NULL) || \ - ((tpcb)->unsent->len >= (tpcb)->mss))) || \ - ((tcp_sndbuf(tpcb) == 0) || (tcp_sndqueuelen(tpcb) >= TCP_SND_QUEUELEN)) \ - ) ? 1 : 0) -#define tcp_output_nagle(tpcb) (tcp_do_output_nagle(tpcb) ? tcp_output(tpcb) : ERR_OK) - - -#define TCP_SEQ_LT(a,b) ((s32_t)((u32_t)(a) - (u32_t)(b)) < 0) -#define TCP_SEQ_LEQ(a,b) ((s32_t)((u32_t)(a) - (u32_t)(b)) <= 0) -#define TCP_SEQ_GT(a,b) ((s32_t)((u32_t)(a) - (u32_t)(b)) > 0) -#define TCP_SEQ_GEQ(a,b) ((s32_t)((u32_t)(a) - (u32_t)(b)) >= 0) -/* is b<=a<=c? */ -#if 0 /* see bug #10548 */ -#define TCP_SEQ_BETWEEN(a,b,c) ((c)-(b) >= (a)-(b)) -#endif -#define TCP_SEQ_BETWEEN(a,b,c) (TCP_SEQ_GEQ(a,b) && TCP_SEQ_LEQ(a,c)) -#define TCP_FIN 0x01U -#define TCP_SYN 0x02U -#define TCP_RST 0x04U -#define TCP_PSH 0x08U -#define TCP_ACK 0x10U -#define TCP_URG 0x20U -#define TCP_ECE 0x40U -#define TCP_CWR 0x80U - -#define TCP_FLAGS 0x3fU - -/* Length of the TCP header, excluding options. */ -#define TCP_HLEN 20 - -#ifndef TCP_TMR_INTERVAL -#define TCP_TMR_INTERVAL 250 /* The TCP timer interval in milliseconds. */ -#endif /* TCP_TMR_INTERVAL */ - -#ifndef TCP_FAST_INTERVAL -#define TCP_FAST_INTERVAL TCP_TMR_INTERVAL /* the fine grained timeout in milliseconds */ -#endif /* TCP_FAST_INTERVAL */ - -#ifndef TCP_SLOW_INTERVAL -#define TCP_SLOW_INTERVAL (2*TCP_TMR_INTERVAL) /* the coarse grained timeout in milliseconds */ -#endif /* TCP_SLOW_INTERVAL */ - -#define TCP_FIN_WAIT_TIMEOUT 20000 /* milliseconds */ -#define TCP_SYN_RCVD_TIMEOUT 20000 /* milliseconds */ - -#define TCP_OOSEQ_TIMEOUT 6U /* x RTO */ - -#ifndef TCP_MSL -#define TCP_MSL 60000UL /* The maximum segment lifetime in milliseconds */ -#endif - -/* Keepalive values, compliant with RFC 1122. Don't change this unless you know what you're doing */ -#ifndef TCP_KEEPIDLE_DEFAULT -#define TCP_KEEPIDLE_DEFAULT 7200000UL /* Default KEEPALIVE timer in milliseconds */ -#endif - -#ifndef TCP_KEEPINTVL_DEFAULT -#define TCP_KEEPINTVL_DEFAULT 75000UL /* Default Time between KEEPALIVE probes in milliseconds */ -#endif - -#ifndef TCP_KEEPCNT_DEFAULT -#define TCP_KEEPCNT_DEFAULT 9U /* Default Counter for KEEPALIVE probes */ -#endif - -#define TCP_MAXIDLE TCP_KEEPCNT_DEFAULT * TCP_KEEPINTVL_DEFAULT /* Maximum KEEPALIVE probe time */ - -/* Fields are (of course) in network byte order. - * Some fields are converted to host byte order in tcp_input(). - */ -#ifdef PACK_STRUCT_USE_INCLUDES -# include "arch/bpstruct.h" -#endif -PACK_STRUCT_BEGIN -struct tcp_hdr { - PACK_STRUCT_FIELD(u16_t src); - PACK_STRUCT_FIELD(u16_t dest); - PACK_STRUCT_FIELD(u32_t seqno); - PACK_STRUCT_FIELD(u32_t ackno); - PACK_STRUCT_FIELD(u16_t _hdrlen_rsvd_flags); - PACK_STRUCT_FIELD(u16_t wnd); - PACK_STRUCT_FIELD(u16_t chksum); - PACK_STRUCT_FIELD(u16_t urgp); -} PACK_STRUCT_STRUCT; -PACK_STRUCT_END -#ifdef PACK_STRUCT_USE_INCLUDES -# include "arch/epstruct.h" -#endif - -#define TCPH_HDRLEN(phdr) (ntohs((phdr)->_hdrlen_rsvd_flags) >> 12) -#define TCPH_FLAGS(phdr) (ntohs((phdr)->_hdrlen_rsvd_flags) & TCP_FLAGS) - -#define TCPH_HDRLEN_SET(phdr, len) (phdr)->_hdrlen_rsvd_flags = htons(((len) << 12) | TCPH_FLAGS(phdr)) -#define TCPH_FLAGS_SET(phdr, flags) (phdr)->_hdrlen_rsvd_flags = (((phdr)->_hdrlen_rsvd_flags & PP_HTONS((u16_t)(~(u16_t)(TCP_FLAGS)))) | htons(flags)) -#define TCPH_HDRLEN_FLAGS_SET(phdr, len, flags) (phdr)->_hdrlen_rsvd_flags = htons(((len) << 12) | (flags)) - -#define TCPH_SET_FLAG(phdr, flags ) (phdr)->_hdrlen_rsvd_flags = ((phdr)->_hdrlen_rsvd_flags | htons(flags)) -#define TCPH_UNSET_FLAG(phdr, flags) (phdr)->_hdrlen_rsvd_flags = htons(ntohs((phdr)->_hdrlen_rsvd_flags) | (TCPH_FLAGS(phdr) & ~(flags)) ) - -#define TCP_TCPLEN(seg) ((seg)->len + ((TCPH_FLAGS((seg)->tcphdr) & (TCP_FIN | TCP_SYN)) != 0)) - -/** Flags used on input processing, not on pcb->flags -*/ -#define TF_RESET (u8_t)0x08U /* Connection was reset. */ -#define TF_CLOSED (u8_t)0x10U /* Connection was sucessfully closed. */ -#define TF_GOT_FIN (u8_t)0x20U /* Connection was closed by the remote end. */ - - -#if LWIP_EVENT_API - -#define TCP_EVENT_ACCEPT(pcb,err,ret) ret = lwip_tcp_event((pcb)->callback_arg, (pcb),\ - LWIP_EVENT_ACCEPT, NULL, 0, err) -#define TCP_EVENT_SENT(pcb,space,ret) ret = lwip_tcp_event((pcb)->callback_arg, (pcb),\ - LWIP_EVENT_SENT, NULL, space, ERR_OK) -#define TCP_EVENT_RECV(pcb,p,err,ret) ret = lwip_tcp_event((pcb)->callback_arg, (pcb),\ - LWIP_EVENT_RECV, (p), 0, (err)) -#define TCP_EVENT_CLOSED(pcb,ret) ret = lwip_tcp_event((pcb)->callback_arg, (pcb),\ - LWIP_EVENT_RECV, NULL, 0, ERR_OK) -#define TCP_EVENT_CONNECTED(pcb,err,ret) ret = lwip_tcp_event((pcb)->callback_arg, (pcb),\ - LWIP_EVENT_CONNECTED, NULL, 0, (err)) -#define TCP_EVENT_POLL(pcb,ret) ret = lwip_tcp_event((pcb)->callback_arg, (pcb),\ - LWIP_EVENT_POLL, NULL, 0, ERR_OK) -#define TCP_EVENT_ERR(errf,arg,err) lwip_tcp_event((arg), NULL, \ - LWIP_EVENT_ERR, NULL, 0, (err)) - -#else /* LWIP_EVENT_API */ - -#define TCP_EVENT_ACCEPT(pcb,err,ret) \ - do { \ - if((pcb)->accept != NULL) \ - (ret) = (pcb)->accept((pcb)->callback_arg,(pcb),(err)); \ - else (ret) = ERR_ARG; \ - } while (0) - -#define TCP_EVENT_SENT(pcb,space,ret) \ - do { \ - if((pcb)->sent != NULL) \ - (ret) = (pcb)->sent((pcb)->callback_arg,(pcb),(space)); \ - else (ret) = ERR_OK; \ - } while (0) - -#define TCP_EVENT_RECV(pcb,p,err,ret) \ - do { \ - if((pcb)->recv != NULL) { \ - (ret) = (pcb)->recv((pcb)->callback_arg,(pcb),(p),(err));\ - } else { \ - (ret) = tcp_recv_null(NULL, (pcb), (p), (err)); \ - } \ - } while (0) - -#define TCP_EVENT_CLOSED(pcb,ret) \ - do { \ - if(((pcb)->recv != NULL)) { \ - (ret) = (pcb)->recv((pcb)->callback_arg,(pcb),NULL,ERR_OK);\ - } else { \ - (ret) = ERR_OK; \ - } \ - } while (0) - -#define TCP_EVENT_CONNECTED(pcb,err,ret) \ - do { \ - if((pcb)->connected != NULL) \ - (ret) = (pcb)->connected((pcb)->callback_arg,(pcb),(err)); \ - else (ret) = ERR_OK; \ - } while (0) - -#define TCP_EVENT_POLL(pcb,ret) \ - do { \ - if((pcb)->poll != NULL) \ - (ret) = (pcb)->poll((pcb)->callback_arg,(pcb)); \ - else (ret) = ERR_OK; \ - } while (0) - -#define TCP_EVENT_ERR(errf,arg,err) \ - do { \ - if((errf) != NULL) \ - (errf)((arg),(err)); \ - } while (0) - -#endif /* LWIP_EVENT_API */ - -/** Enabled extra-check for TCP_OVERSIZE if LWIP_DEBUG is enabled */ -#if TCP_OVERSIZE && defined(LWIP_DEBUG) -#define TCP_OVERSIZE_DBGCHECK 1 -#else -#define TCP_OVERSIZE_DBGCHECK 0 -#endif - -/** Don't generate checksum on copy if CHECKSUM_GEN_TCP is disabled */ -#define TCP_CHECKSUM_ON_COPY (LWIP_CHECKSUM_ON_COPY && CHECKSUM_GEN_TCP) - -/* This structure represents a TCP segment on the unsent, unacked and ooseq queues */ -struct tcp_seg { - struct tcp_seg *next; /* used when putting segements on a queue */ - struct pbuf *p; /* buffer containing data + TCP header */ - u16_t len; /* the TCP length of this segment */ -#if TCP_OVERSIZE_DBGCHECK - u16_t oversize_left; /* Extra bytes available at the end of the last - pbuf in unsent (used for asserting vs. - tcp_pcb.unsent_oversized only) */ -#endif /* TCP_OVERSIZE_DBGCHECK */ -#if TCP_CHECKSUM_ON_COPY - u16_t chksum; - u8_t chksum_swapped; -#endif /* TCP_CHECKSUM_ON_COPY */ - u8_t flags; -#define TF_SEG_OPTS_MSS (u8_t)0x01U /* Include MSS option. */ -#define TF_SEG_OPTS_TS (u8_t)0x02U /* Include timestamp option. */ -#define TF_SEG_DATA_CHECKSUMMED (u8_t)0x04U /* ALL data (not the header) is - checksummed into 'chksum' */ - struct tcp_hdr *tcphdr; /* the TCP header */ -}; - -#define LWIP_TCP_OPT_LENGTH(flags) \ - (flags & TF_SEG_OPTS_MSS ? 4 : 0) + \ - (flags & TF_SEG_OPTS_TS ? 12 : 0) - -/** This returns a TCP header option for MSS in an u32_t */ -#define TCP_BUILD_MSS_OPTION(mss) htonl(0x02040000 | ((mss) & 0xFFFF)) - -/* Global variables: */ -extern struct tcp_pcb *tcp_input_pcb; -extern u32_t tcp_ticks; -extern u8_t tcp_active_pcbs_changed; - -/* The TCP PCB lists. */ -union tcp_listen_pcbs_t { /* List of all TCP PCBs in LISTEN state. */ - struct tcp_pcb_listen *listen_pcbs; - struct tcp_pcb *pcbs; -}; -extern struct tcp_pcb *tcp_bound_pcbs; -extern union tcp_listen_pcbs_t tcp_listen_pcbs; -extern struct tcp_pcb *tcp_active_pcbs; /* List of all TCP PCBs that are in a - state in which they accept or send - data. */ -extern struct tcp_pcb *tcp_tw_pcbs; /* List of all TCP PCBs in TIME-WAIT. */ - -extern struct tcp_pcb *tcp_tmp_pcb; /* Only used for temporary storage. */ - -/* Axioms about the above lists: - 1) Every TCP PCB that is not CLOSED is in one of the lists. - 2) A PCB is only in one of the lists. - 3) All PCBs in the tcp_listen_pcbs list is in LISTEN state. - 4) All PCBs in the tcp_tw_pcbs list is in TIME-WAIT state. -*/ -/* Define two macros, TCP_REG and TCP_RMV that registers a TCP PCB - with a PCB list or removes a PCB from a list, respectively. */ -#ifndef TCP_DEBUG_PCB_LISTS -#define TCP_DEBUG_PCB_LISTS 0 -#endif -#if TCP_DEBUG_PCB_LISTS -#define TCP_REG(pcbs, npcb) do {\ - LWIP_DEBUGF(TCP_DEBUG, ("TCP_REG %p local port %d\n", (npcb), (npcb)->local_port)); \ - for(tcp_tmp_pcb = *(pcbs); \ - tcp_tmp_pcb != NULL; \ - tcp_tmp_pcb = tcp_tmp_pcb->next) { \ - LWIP_ASSERT("TCP_REG: already registered\n", tcp_tmp_pcb != (npcb)); \ - } \ - LWIP_ASSERT("TCP_REG: pcb->state != CLOSED", ((pcbs) == &tcp_bound_pcbs) || ((npcb)->state != CLOSED)); \ - (npcb)->next = *(pcbs); \ - LWIP_ASSERT("TCP_REG: npcb->next != npcb", (npcb)->next != (npcb)); \ - *(pcbs) = (npcb); \ - LWIP_ASSERT("TCP_RMV: tcp_pcbs sane", tcp_pcbs_sane()); \ - tcp_timer_needed(); \ - } while(0) -#define TCP_RMV(pcbs, npcb) do { \ - LWIP_ASSERT("TCP_RMV: pcbs != NULL", *(pcbs) != NULL); \ - LWIP_DEBUGF(TCP_DEBUG, ("TCP_RMV: removing %p from %p\n", (npcb), *(pcbs))); \ - if(*(pcbs) == (npcb)) { \ - *(pcbs) = (*pcbs)->next; \ - } else for(tcp_tmp_pcb = *(pcbs); tcp_tmp_pcb != NULL; tcp_tmp_pcb = tcp_tmp_pcb->next) { \ - if(tcp_tmp_pcb->next == (npcb)) { \ - tcp_tmp_pcb->next = (npcb)->next; \ - break; \ - } \ - } \ - (npcb)->next = NULL; \ - LWIP_ASSERT("TCP_RMV: tcp_pcbs sane", tcp_pcbs_sane()); \ - LWIP_DEBUGF(TCP_DEBUG, ("TCP_RMV: removed %p from %p\n", (npcb), *(pcbs))); \ - } while(0) - -#else /* LWIP_DEBUG */ - -#define TCP_REG(pcbs, npcb) \ - do { \ - (npcb)->next = *pcbs; \ - *(pcbs) = (npcb); \ - tcp_timer_needed(); \ - } while (0) - -#define TCP_RMV(pcbs, npcb) \ - do { \ - if(*(pcbs) == (npcb)) { \ - (*(pcbs)) = (*pcbs)->next; \ - } \ - else { \ - for(tcp_tmp_pcb = *pcbs; \ - tcp_tmp_pcb != NULL; \ - tcp_tmp_pcb = tcp_tmp_pcb->next) { \ - if(tcp_tmp_pcb->next == (npcb)) { \ - tcp_tmp_pcb->next = (npcb)->next; \ - break; \ - } \ - } \ - } \ - (npcb)->next = NULL; \ - } while(0) - -#endif /* LWIP_DEBUG */ - -#define TCP_REG_ACTIVE(npcb) \ - do { \ - TCP_REG(&tcp_active_pcbs, npcb); \ - tcp_active_pcbs_changed = 1; \ - } while (0) - -#define TCP_RMV_ACTIVE(npcb) \ - do { \ - TCP_RMV(&tcp_active_pcbs, npcb); \ - tcp_active_pcbs_changed = 1; \ - } while (0) - -#define TCP_PCB_REMOVE_ACTIVE(pcb) \ - do { \ - tcp_pcb_remove(&tcp_active_pcbs, pcb); \ - tcp_active_pcbs_changed = 1; \ - } while (0) - - -/* Internal functions: */ -struct tcp_pcb *tcp_pcb_copy(struct tcp_pcb *pcb); -void tcp_pcb_purge(struct tcp_pcb *pcb); -void tcp_pcb_remove(struct tcp_pcb **pcblist, struct tcp_pcb *pcb); - -void tcp_segs_free(struct tcp_seg *seg); -void tcp_seg_free(struct tcp_seg *seg); -struct tcp_seg *tcp_seg_copy(struct tcp_seg *seg); - -#define tcp_ack(pcb) \ - do { \ - if((pcb)->flags & TF_ACK_DELAY) { \ - (pcb)->flags &= ~TF_ACK_DELAY; \ - (pcb)->flags |= TF_ACK_NOW; \ - } \ - else { \ - (pcb)->flags |= TF_ACK_DELAY; \ - } \ - } while (0) - -#define tcp_ack_now(pcb) \ - do { \ - (pcb)->flags |= TF_ACK_NOW; \ - } while (0) - -err_t tcp_send_fin(struct tcp_pcb *pcb); -err_t tcp_enqueue_flags(struct tcp_pcb *pcb, u8_t flags); - -void tcp_rexmit_seg(struct tcp_pcb *pcb, struct tcp_seg *seg); - -void tcp_rst_impl(u32_t seqno, u32_t ackno, - ipX_addr_t *local_ip, ipX_addr_t *remote_ip, - u16_t local_port, u16_t remote_port -#if LWIP_IPV6 - , u8_t isipv6 -#endif /* LWIP_IPV6 */ - ); -#if LWIP_IPV6 -#define tcp_rst(seqno, ackno, local_ip, remote_ip, local_port, remote_port, isipv6) \ - tcp_rst_impl(seqno, ackno, local_ip, remote_ip, local_port, remote_port, isipv6) -#else /* LWIP_IPV6 */ -#define tcp_rst(seqno, ackno, local_ip, remote_ip, local_port, remote_port, isipv6) \ - tcp_rst_impl(seqno, ackno, local_ip, remote_ip, local_port, remote_port) -#endif /* LWIP_IPV6 */ - -u32_t tcp_next_iss(void); - -void tcp_keepalive(struct tcp_pcb *pcb); -void tcp_zero_window_probe(struct tcp_pcb *pcb); - -#if TCP_CALCULATE_EFF_SEND_MSS -u16_t tcp_eff_send_mss_impl(u16_t sendmss, ipX_addr_t *dest -#if LWIP_IPV6 - , ipX_addr_t *src, u8_t isipv6 -#endif /* LWIP_IPV6 */ - ); -#if LWIP_IPV6 -#define tcp_eff_send_mss(sendmss, src, dest, isipv6) tcp_eff_send_mss_impl(sendmss, dest, src, isipv6) -#else /* LWIP_IPV6 */ -#define tcp_eff_send_mss(sendmss, src, dest, isipv6) tcp_eff_send_mss_impl(sendmss, dest) -#endif /* LWIP_IPV6 */ -#endif /* TCP_CALCULATE_EFF_SEND_MSS */ - -#if LWIP_CALLBACK_API -err_t tcp_recv_null(void *arg, struct tcp_pcb *pcb, struct pbuf *p, err_t err); -#endif /* LWIP_CALLBACK_API */ - -#if TCP_DEBUG || TCP_INPUT_DEBUG || TCP_OUTPUT_DEBUG -void tcp_debug_print(struct tcp_hdr *tcphdr); -void tcp_debug_print_flags(u8_t flags); -void tcp_debug_print_state(enum tcp_state s); -void tcp_debug_print_pcbs(void); -s16_t tcp_pcbs_sane(void); -#else -# define tcp_debug_print(tcphdr) -# define tcp_debug_print_flags(flags) -# define tcp_debug_print_state(s) -# define tcp_debug_print_pcbs() -# define tcp_pcbs_sane() 1 -#endif /* TCP_DEBUG */ - -/** External function (implemented in timers.c), called when TCP detects - * that a timer is needed (i.e. active- or time-wait-pcb found). */ -void tcp_timer_needed(void); - - -#ifdef __cplusplus -} -#endif - -#endif /* LWIP_TCP */ - -#endif /* __LWIP_TCP_H__ */ diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/lwip/tcpip.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/lwip/tcpip.h deleted file mode 100644 index 04567f2c..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/lwip/tcpip.h +++ /dev/null @@ -1,179 +0,0 @@ -/* - * Copyright (c) 2001-2004 Swedish Institute of Computer Science. - * 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. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT - * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING - * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY - * OF SUCH DAMAGE. - * - * This file is part of the lwIP TCP/IP stack. - * - * Author: Adam Dunkels - * - */ -#ifndef __LWIP_TCPIP_H__ -#define __LWIP_TCPIP_H__ - -#include "lwip/opt.h" - -#if !NO_SYS /* don't build if not configured for use in lwipopts.h */ - -#include "lwip/api_msg.h" -#include "lwip/netifapi.h" -#include "lwip/pbuf.h" -#include "lwip/api.h" -#include "lwip/sys.h" -#include "lwip/timers.h" -#include "lwip/netif.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/** Define this to something that triggers a watchdog. This is called from - * tcpip_thread after processing a message. */ -#ifndef LWIP_TCPIP_THREAD_ALIVE -#define LWIP_TCPIP_THREAD_ALIVE() -#endif - -#if LWIP_TCPIP_CORE_LOCKING -/** The global semaphore to lock the stack. */ -extern sys_mutex_t lock_tcpip_core; -#define LOCK_TCPIP_CORE() sys_mutex_lock(&lock_tcpip_core) -#define UNLOCK_TCPIP_CORE() sys_mutex_unlock(&lock_tcpip_core) -#ifdef LWIP_DEBUG -#define TCIP_APIMSG_SET_ERR(m, e) (m)->msg.err = e /* catch functions that don't set err */ -#else -#define TCIP_APIMSG_SET_ERR(m, e) -#endif -#define TCPIP_APIMSG_NOERR(m,f) do { \ - TCIP_APIMSG_SET_ERR(m, ERR_VAL); \ - LOCK_TCPIP_CORE(); \ - f(&((m)->msg)); \ - UNLOCK_TCPIP_CORE(); \ -} while(0) -#define TCPIP_APIMSG(m,f,e) do { \ - TCPIP_APIMSG_NOERR(m,f); \ - (e) = (m)->msg.err; \ -} while(0) -#define TCPIP_APIMSG_ACK(m) -#define TCPIP_NETIFAPI(m) tcpip_netifapi_lock(m) -#define TCPIP_NETIFAPI_ACK(m) -#else /* LWIP_TCPIP_CORE_LOCKING */ -#define LOCK_TCPIP_CORE() -#define UNLOCK_TCPIP_CORE() -#define TCPIP_APIMSG_NOERR(m,f) do { (m)->function = f; tcpip_apimsg(m); } while(0) -#define TCPIP_APIMSG(m,f,e) do { (m)->function = f; (e) = tcpip_apimsg(m); } while(0) -#define TCPIP_APIMSG_ACK(m) sys_sem_signal(&m->conn->op_completed) -#define TCPIP_NETIFAPI(m) tcpip_netifapi(m) -#define TCPIP_NETIFAPI_ACK(m) sys_sem_signal(&m->sem) -#endif /* LWIP_TCPIP_CORE_LOCKING */ - -/** Function prototype for the init_done function passed to tcpip_init */ -typedef void (*tcpip_init_done_fn)(void *arg); -/** Function prototype for functions passed to tcpip_callback() */ -typedef void (*tcpip_callback_fn)(void *ctx); - -/* Forward declarations */ -struct tcpip_callback_msg; - -void tcpip_init(tcpip_init_done_fn tcpip_init_done, void *arg); - -#if LWIP_NETCONN -err_t tcpip_apimsg(struct api_msg *apimsg); -#endif /* LWIP_NETCONN */ - -err_t tcpip_input(struct pbuf *p, struct netif *inp); - -#if LWIP_NETIF_API -err_t tcpip_netifapi(struct netifapi_msg *netifapimsg); -#if LWIP_TCPIP_CORE_LOCKING -err_t tcpip_netifapi_lock(struct netifapi_msg *netifapimsg); -#endif /* LWIP_TCPIP_CORE_LOCKING */ -#endif /* LWIP_NETIF_API */ - -err_t tcpip_callback_with_block(tcpip_callback_fn function, void *ctx, u8_t block); -#define tcpip_callback(f, ctx) tcpip_callback_with_block(f, ctx, 1) - -struct tcpip_callback_msg* tcpip_callbackmsg_new(tcpip_callback_fn function, void *ctx); -void tcpip_callbackmsg_delete(struct tcpip_callback_msg* msg); -err_t tcpip_trycallback(struct tcpip_callback_msg* msg); - -/* free pbufs or heap memory from another context without blocking */ -err_t pbuf_free_callback(struct pbuf *p); -err_t mem_free_callback(void *m); - -#if LWIP_TCPIP_TIMEOUT -err_t tcpip_timeout(u32_t msecs, sys_timeout_handler h, void *arg); -err_t tcpip_untimeout(sys_timeout_handler h, void *arg); -#endif /* LWIP_TCPIP_TIMEOUT */ - -enum tcpip_msg_type { -#if LWIP_NETCONN - TCPIP_MSG_API, -#endif /* LWIP_NETCONN */ - TCPIP_MSG_INPKT, -#if LWIP_NETIF_API - TCPIP_MSG_NETIFAPI, -#endif /* LWIP_NETIF_API */ -#if LWIP_TCPIP_TIMEOUT - TCPIP_MSG_TIMEOUT, - TCPIP_MSG_UNTIMEOUT, -#endif /* LWIP_TCPIP_TIMEOUT */ - TCPIP_MSG_CALLBACK, - TCPIP_MSG_CALLBACK_STATIC -}; - -struct tcpip_msg { - enum tcpip_msg_type type; - sys_sem_t *sem; - union { -#if LWIP_NETCONN - struct api_msg *apimsg; -#endif /* LWIP_NETCONN */ -#if LWIP_NETIF_API - struct netifapi_msg *netifapimsg; -#endif /* LWIP_NETIF_API */ - struct { - struct pbuf *p; - struct netif *netif; - } inp; - struct { - tcpip_callback_fn function; - void *ctx; - } cb; -#if LWIP_TCPIP_TIMEOUT - struct { - u32_t msecs; - sys_timeout_handler h; - void *arg; - } tmo; -#endif /* LWIP_TCPIP_TIMEOUT */ - } msg; -}; - -#ifdef __cplusplus -} -#endif - -#endif /* !NO_SYS */ - -#endif /* __LWIP_TCPIP_H__ */ diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/lwip/timers.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/lwip/timers.h deleted file mode 100644 index 04e78e0f..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/lwip/timers.h +++ /dev/null @@ -1,100 +0,0 @@ -/* - * Copyright (c) 2001-2004 Swedish Institute of Computer Science. - * 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. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT - * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING - * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY - * OF SUCH DAMAGE. - * - * This file is part of the lwIP TCP/IP stack. - * - * Author: Adam Dunkels - * Simon Goldschmidt - * - */ -#ifndef __LWIP_TIMERS_H__ -#define __LWIP_TIMERS_H__ - -#include "lwip/opt.h" - -/* Timers are not supported when NO_SYS==1 and NO_SYS_NO_TIMERS==1 */ -#define LWIP_TIMERS (!NO_SYS || (NO_SYS && !NO_SYS_NO_TIMERS)) - -#if LWIP_TIMERS - -#include "lwip/err.h" -#if !NO_SYS -#include "lwip/sys.h" -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -#ifndef LWIP_DEBUG_TIMERNAMES -#ifdef LWIP_DEBUG -#define LWIP_DEBUG_TIMERNAMES SYS_DEBUG -#else /* LWIP_DEBUG */ -#define LWIP_DEBUG_TIMERNAMES 0 -#endif /* LWIP_DEBUG*/ -#endif - -/** Function prototype for a timeout callback function. Register such a function - * using sys_timeout(). - * - * @param arg Additional argument to pass to the function - set up by sys_timeout() - */ -typedef void (* sys_timeout_handler)(void *arg); - -struct sys_timeo { - struct sys_timeo *next; - u32_t time; - sys_timeout_handler h; - void *arg; -#if LWIP_DEBUG_TIMERNAMES - const char* handler_name; -#endif /* LWIP_DEBUG_TIMERNAMES */ -}; - -void sys_timeouts_init(void); - -#if LWIP_DEBUG_TIMERNAMES -void sys_timeout_debug(u32_t msecs, sys_timeout_handler handler, void *arg, const char* handler_name); -#define sys_timeout(msecs, handler, arg) sys_timeout_debug(msecs, handler, arg, #handler) -#else /* LWIP_DEBUG_TIMERNAMES */ -void sys_timeout(u32_t msecs, sys_timeout_handler handler, void *arg); -#endif /* LWIP_DEBUG_TIMERNAMES */ - -void sys_untimeout(sys_timeout_handler handler, void *arg); -#if NO_SYS -void sys_check_timeouts(void); -void sys_restart_timeouts(void); -#else /* NO_SYS */ -void sys_timeouts_mbox_fetch(sys_mbox_t *mbox, void **msg); -#endif /* NO_SYS */ - - -#ifdef __cplusplus -} -#endif - -#endif /* LWIP_TIMERS */ -#endif /* __LWIP_TIMERS_H__ */ diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/lwip/udp.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/lwip/udp.h deleted file mode 100644 index 14d5c0ae..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/lwip/udp.h +++ /dev/null @@ -1,215 +0,0 @@ -/* - * Copyright (c) 2001-2004 Swedish Institute of Computer Science. - * 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. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT - * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING - * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY - * OF SUCH DAMAGE. - * - * This file is part of the lwIP TCP/IP stack. - * - * Author: Adam Dunkels - * - */ -#ifndef __LWIP_UDP_H__ -#define __LWIP_UDP_H__ - -#include "lwip/opt.h" - -#if LWIP_UDP /* don't build if not configured for use in lwipopts.h */ - -#include "lwip/pbuf.h" -#include "lwip/netif.h" -#include "lwip/ip_addr.h" -#include "lwip/ip.h" -#include "lwip/ip6_addr.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#define UDP_HLEN 8 - -/* Fields are (of course) in network byte order. */ -#ifdef PACK_STRUCT_USE_INCLUDES -# include "arch/bpstruct.h" -#endif -PACK_STRUCT_BEGIN -struct udp_hdr { - PACK_STRUCT_FIELD(u16_t src); - PACK_STRUCT_FIELD(u16_t dest); /* src/dest UDP ports */ - PACK_STRUCT_FIELD(u16_t len); - PACK_STRUCT_FIELD(u16_t chksum); -} PACK_STRUCT_STRUCT; -PACK_STRUCT_END -#ifdef PACK_STRUCT_USE_INCLUDES -# include "arch/epstruct.h" -#endif - -#define UDP_FLAGS_NOCHKSUM 0x01U -#define UDP_FLAGS_UDPLITE 0x02U -#define UDP_FLAGS_CONNECTED 0x04U -#define UDP_FLAGS_MULTICAST_LOOP 0x08U - -struct udp_pcb; - -/** Function prototype for udp pcb receive callback functions - * addr and port are in same byte order as in the pcb - * The callback is responsible for freeing the pbuf - * if it's not used any more. - * - * ATTENTION: Be aware that 'addr' points into the pbuf 'p' so freeing this pbuf - * makes 'addr' invalid, too. - * - * @param arg user supplied argument (udp_pcb.recv_arg) - * @param pcb the udp_pcb which received data - * @param p the packet buffer that was received - * @param addr the remote IP address from which the packet was received - * @param port the remote port from which the packet was received - */ -typedef void (*udp_recv_fn)(void *arg, struct udp_pcb *pcb, struct pbuf *p, - ip_addr_t *addr, u16_t port); - -#if LWIP_IPV6 -/** Function prototype for udp pcb IPv6 receive callback functions - * The callback is responsible for freeing the pbuf - * if it's not used any more. - * - * @param arg user supplied argument (udp_pcb.recv_arg) - * @param pcb the udp_pcb which received data - * @param p the packet buffer that was received - * @param addr the remote IPv6 address from which the packet was received - * @param port the remote port from which the packet was received - */ -typedef void (*udp_recv_ip6_fn)(void *arg, struct udp_pcb *pcb, struct pbuf *p, - ip6_addr_t *addr, u16_t port); -#endif /* LWIP_IPV6 */ - -#if LWIP_IPV6 -#define UDP_PCB_RECV_IP6 udp_recv_ip6_fn ip6; -#else -#define UDP_PCB_RECV_IP6 -#endif /* LWIP_IPV6 */ - -struct udp_pcb { -/* Common members of all PCB types */ - IP_PCB; - -/* Protocol specific PCB members */ - - struct udp_pcb *next; - - u8_t flags; - /** ports are in host byte order */ - u16_t local_port, remote_port; - -#if LWIP_IGMP - /** outgoing network interface for multicast packets */ - ip_addr_t multicast_ip; -#endif /* LWIP_IGMP */ - -#if LWIP_UDPLITE - /** used for UDP_LITE only */ - u16_t chksum_len_rx, chksum_len_tx; -#endif /* LWIP_UDPLITE */ - - /** receive callback function */ - union { - udp_recv_fn ip4; - UDP_PCB_RECV_IP6 - }recv; - /** user-supplied argument for the recv callback */ - void *recv_arg; -}; -/* udp_pcbs export for exernal reference (e.g. SNMP agent) */ -extern struct udp_pcb *udp_pcbs; - -/* The following functions is the application layer interface to the - UDP code. */ -struct udp_pcb * udp_new (void); -void udp_remove (struct udp_pcb *pcb); -err_t udp_bind (struct udp_pcb *pcb, ip_addr_t *ipaddr, - u16_t port); -err_t udp_connect (struct udp_pcb *pcb, ip_addr_t *ipaddr, - u16_t port); -void udp_disconnect (struct udp_pcb *pcb); -void udp_recv (struct udp_pcb *pcb, udp_recv_fn recv, - void *recv_arg); -err_t udp_sendto_if (struct udp_pcb *pcb, struct pbuf *p, - ip_addr_t *dst_ip, u16_t dst_port, - struct netif *netif); -err_t udp_sendto (struct udp_pcb *pcb, struct pbuf *p, - ip_addr_t *dst_ip, u16_t dst_port); -err_t udp_send (struct udp_pcb *pcb, struct pbuf *p); - -#if LWIP_CHECKSUM_ON_COPY && CHECKSUM_GEN_UDP -err_t udp_sendto_if_chksum(struct udp_pcb *pcb, struct pbuf *p, - ip_addr_t *dst_ip, u16_t dst_port, - struct netif *netif, u8_t have_chksum, - u16_t chksum); -err_t udp_sendto_chksum(struct udp_pcb *pcb, struct pbuf *p, - ip_addr_t *dst_ip, u16_t dst_port, - u8_t have_chksum, u16_t chksum); -err_t udp_send_chksum(struct udp_pcb *pcb, struct pbuf *p, - u8_t have_chksum, u16_t chksum); -#endif /* LWIP_CHECKSUM_ON_COPY && CHECKSUM_GEN_UDP */ - -#define udp_flags(pcb) ((pcb)->flags) -#define udp_setflags(pcb, f) ((pcb)->flags = (f)) - -/* The following functions are the lower layer interface to UDP. */ -void udp_input (struct pbuf *p, struct netif *inp); - -void udp_init (void); - -#if LWIP_IPV6 -struct udp_pcb * udp_new_ip6(void); -#define udp_bind_ip6(pcb, ip6addr, port) \ - udp_bind(pcb, ip6_2_ip(ip6addr), port) -#define udp_connect_ip6(pcb, ip6addr, port) \ - udp_connect(pcb, ip6_2_ip(ip6addr), port) -#define udp_recv_ip6(pcb, recv_ip6_fn, recv_arg) \ - udp_recv(pcb, (udp_recv_fn)recv_ip6_fn, recv_arg) -#define udp_sendto_ip6(pcb, pbuf, ip6addr, port) \ - udp_sendto(pcb, pbuf, ip6_2_ip(ip6addr), port) -#define udp_sendto_if_ip6(pcb, pbuf, ip6addr, port, netif) \ - udp_sendto_if(pcb, pbuf, ip6_2_ip(ip6addr), port, netif) -#if LWIP_CHECKSUM_ON_COPY && CHECKSUM_GEN_UDP -#define udp_sendto_chksum_ip6(pcb, pbuf, ip6addr, port, have_chk, chksum) \ - udp_sendto_chksum(pcb, pbuf, ip6_2_ip(ip6addr), port, have_chk, chksum) -#define udp_sendto_if_chksum_ip6(pcb, pbuf, ip6addr, port, netif, have_chk, chksum) \ - udp_sendto_if_chksum(pcb, pbuf, ip6_2_ip(ip6addr), port, netif, have_chk, chksum) -#endif /*LWIP_CHECKSUM_ON_COPY && CHECKSUM_GEN_UDP */ -#endif /* LWIP_IPV6 */ - -#if UDP_DEBUG -void udp_debug_print(struct udp_hdr *udphdr); -#else -#define udp_debug_print(udphdr) -#endif - -#ifdef __cplusplus -} -#endif - -#endif /* LWIP_UDP */ - -#endif /* __LWIP_UDP_H__ */ diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/netif/etharp.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/netif/etharp.h deleted file mode 100644 index 8275a28f..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/netif/etharp.h +++ /dev/null @@ -1,223 +0,0 @@ -/* - * Copyright (c) 2001-2003 Swedish Institute of Computer Science. - * Copyright (c) 2003-2004 Leon Woestenberg - * Copyright (c) 2003-2004 Axon Digital Design B.V., The Netherlands. - * 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. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT - * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING - * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY - * OF SUCH DAMAGE. - * - * This file is part of the lwIP TCP/IP stack. - * - * Author: Adam Dunkels - * - */ - -#ifndef __NETIF_ETHARP_H__ -#define __NETIF_ETHARP_H__ - -#include "lwip/opt.h" - -#if LWIP_ARP || LWIP_ETHERNET /* don't build if not configured for use in lwipopts.h */ - -#include "lwip/pbuf.h" -#include "lwip/ip_addr.h" -#include "lwip/netif.h" -#include "lwip/ip.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#ifndef ETHARP_HWADDR_LEN -#define ETHARP_HWADDR_LEN 6 -#endif - -#ifdef PACK_STRUCT_USE_INCLUDES -# include "arch/bpstruct.h" -#endif -PACK_STRUCT_BEGIN -struct eth_addr { - PACK_STRUCT_FIELD(u8_t addr[ETHARP_HWADDR_LEN]); -} PACK_STRUCT_STRUCT; -PACK_STRUCT_END -#ifdef PACK_STRUCT_USE_INCLUDES -# include "arch/epstruct.h" -#endif - -#ifdef PACK_STRUCT_USE_INCLUDES -# include "arch/bpstruct.h" -#endif -PACK_STRUCT_BEGIN -/** Ethernet header */ -struct eth_hdr { -#if ETH_PAD_SIZE - PACK_STRUCT_FIELD(u8_t padding[ETH_PAD_SIZE]); -#endif - PACK_STRUCT_FIELD(struct eth_addr dest); - PACK_STRUCT_FIELD(struct eth_addr src); - PACK_STRUCT_FIELD(u16_t type); -} PACK_STRUCT_STRUCT; -PACK_STRUCT_END -#ifdef PACK_STRUCT_USE_INCLUDES -# include "arch/epstruct.h" -#endif - -#define SIZEOF_ETH_HDR (14 + ETH_PAD_SIZE) - -#if ETHARP_SUPPORT_VLAN - -#ifdef PACK_STRUCT_USE_INCLUDES -# include "arch/bpstruct.h" -#endif -PACK_STRUCT_BEGIN -/** VLAN header inserted between ethernet header and payload - * if 'type' in ethernet header is ETHTYPE_VLAN. - * See IEEE802.Q */ -struct eth_vlan_hdr { - PACK_STRUCT_FIELD(u16_t prio_vid); - PACK_STRUCT_FIELD(u16_t tpid); -} PACK_STRUCT_STRUCT; -PACK_STRUCT_END -#ifdef PACK_STRUCT_USE_INCLUDES -# include "arch/epstruct.h" -#endif - -#define SIZEOF_VLAN_HDR 4 -#define VLAN_ID(vlan_hdr) (htons((vlan_hdr)->prio_vid) & 0xFFF) - -#endif /* ETHARP_SUPPORT_VLAN */ - -#ifdef PACK_STRUCT_USE_INCLUDES -# include "arch/bpstruct.h" -#endif -PACK_STRUCT_BEGIN -/** the ARP message, see RFC 826 ("Packet format") */ -struct etharp_hdr { - PACK_STRUCT_FIELD(u16_t hwtype); - PACK_STRUCT_FIELD(u16_t proto); - PACK_STRUCT_FIELD(u8_t hwlen); - PACK_STRUCT_FIELD(u8_t protolen); - PACK_STRUCT_FIELD(u16_t opcode); - PACK_STRUCT_FIELD(struct eth_addr shwaddr); - PACK_STRUCT_FIELD(struct ip_addr2 sipaddr); - PACK_STRUCT_FIELD(struct eth_addr dhwaddr); - PACK_STRUCT_FIELD(struct ip_addr2 dipaddr); -} PACK_STRUCT_STRUCT; -PACK_STRUCT_END -#ifdef PACK_STRUCT_USE_INCLUDES -# include "arch/epstruct.h" -#endif - -#define SIZEOF_ETHARP_HDR 28 -#define SIZEOF_ETHARP_PACKET (SIZEOF_ETH_HDR + SIZEOF_ETHARP_HDR) - -/** 5 seconds period */ -#define ARP_TMR_INTERVAL 5000 - -#define ETHTYPE_ARP 0x0806U -#define ETHTYPE_IP 0x0800U -#define ETHTYPE_VLAN 0x8100U -#define ETHTYPE_IPV6 0x86DDU -#define ETHTYPE_PPPOEDISC 0x8863U /* PPP Over Ethernet Discovery Stage */ -#define ETHTYPE_PPPOE 0x8864U /* PPP Over Ethernet Session Stage */ - -/** MEMCPY-like macro to copy to/from struct eth_addr's that are local variables - * or known to be 32-bit aligned within the protocol header. */ -#ifndef ETHADDR32_COPY -#define ETHADDR32_COPY(src, dst) SMEMCPY(src, dst, ETHARP_HWADDR_LEN) -#endif - -/** MEMCPY-like macro to copy to/from struct eth_addr's that are no local - * variables and known to be 16-bit aligned within the protocol header. */ -#ifndef ETHADDR16_COPY -#define ETHADDR16_COPY(src, dst) SMEMCPY(src, dst, ETHARP_HWADDR_LEN) -#endif - -#if LWIP_ARP /* don't build if not configured for use in lwipopts.h */ - -/** ARP message types (opcodes) */ -#define ARP_REQUEST 1 -#define ARP_REPLY 2 - -/** Define this to 1 and define LWIP_ARP_FILTER_NETIF_FN(pbuf, netif, type) - * to a filter function that returns the correct netif when using multiple - * netifs on one hardware interface where the netif's low-level receive - * routine cannot decide for the correct netif (e.g. when mapping multiple - * IP addresses to one hardware interface). - */ -#ifndef LWIP_ARP_FILTER_NETIF -#define LWIP_ARP_FILTER_NETIF 0 -#endif - -#if ARP_QUEUEING -/** struct for queueing outgoing packets for unknown address - * defined here to be accessed by memp.h - */ -struct etharp_q_entry { - struct etharp_q_entry *next; - struct pbuf *p; -}; -#endif /* ARP_QUEUEING */ - -#define etharp_init() /* Compatibility define, not init needed. */ -void etharp_tmr(void); -s8_t etharp_find_addr(struct netif *netif, ip_addr_t *ipaddr, - struct eth_addr **eth_ret, ip_addr_t **ip_ret); -err_t etharp_output(struct netif *netif, struct pbuf *q, ip_addr_t *ipaddr); -err_t etharp_query(struct netif *netif, ip_addr_t *ipaddr, struct pbuf *q); -err_t etharp_request(struct netif *netif, ip_addr_t *ipaddr); -/** For Ethernet network interfaces, we might want to send "gratuitous ARP"; - * this is an ARP packet sent by a node in order to spontaneously cause other - * nodes to update an entry in their ARP cache. - * From RFC 3220 "IP Mobility Support for IPv4" section 4.6. */ -#define etharp_gratuitous(netif) etharp_request((netif), &(netif)->ip_addr) -void etharp_cleanup_netif(struct netif *netif); - -#if ETHARP_SUPPORT_STATIC_ENTRIES -err_t etharp_add_static_entry(ip_addr_t *ipaddr, struct eth_addr *ethaddr); -err_t etharp_remove_static_entry(ip_addr_t *ipaddr); -#endif /* ETHARP_SUPPORT_STATIC_ENTRIES */ - -#if LWIP_AUTOIP -err_t etharp_raw(struct netif *netif, const struct eth_addr *ethsrc_addr, - const struct eth_addr *ethdst_addr, - const struct eth_addr *hwsrc_addr, const ip_addr_t *ipsrc_addr, - const struct eth_addr *hwdst_addr, const ip_addr_t *ipdst_addr, - const u16_t opcode); -#endif /* LWIP_AUTOIP */ - -#endif /* LWIP_ARP */ - -err_t ethernet_input(struct pbuf *p, struct netif *netif); - -#define eth_addr_cmp(addr1, addr2) (memcmp((addr1)->addr, (addr2)->addr, ETHARP_HWADDR_LEN) == 0) - -extern const struct eth_addr ethbroadcast, ethzero; - -#ifdef __cplusplus -} -#endif - -#endif /* LWIP_ARP || LWIP_ETHERNET */ - -#endif /* __NETIF_ARP_H__ */ diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/netif/ppp_oe.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/netif/ppp_oe.h deleted file mode 100644 index e1cdfa51..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/netif/ppp_oe.h +++ /dev/null @@ -1,190 +0,0 @@ -/***************************************************************************** -* ppp_oe.h - PPP Over Ethernet implementation for lwIP. -* -* Copyright (c) 2006 by Marc Boucher, Services Informatiques (MBSI) inc. -* -* The authors hereby grant permission to use, copy, modify, distribute, -* and license this software and its documentation for any purpose, provided -* that existing copyright notices are retained in all copies and that this -* notice and the following disclaimer are included verbatim in any -* distributions. No written agreement, license, or royalty fee is required -* for any of the authorized uses. -* -* THIS SOFTWARE IS PROVIDED BY THE CONTRIBUTORS *AS IS* AND ANY EXPRESS OR -* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES -* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -* IN NO EVENT SHALL THE 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. -* -****************************************************************************** -* REVISION HISTORY -* -* 06-01-01 Marc Boucher -* Ported to lwIP. -*****************************************************************************/ - - - -/* based on NetBSD: if_pppoe.c,v 1.64 2006/01/31 23:50:15 martin Exp */ - -/*- - * Copyright (c) 2002 The NetBSD Foundation, Inc. - * All rights reserved. - * - * This code is derived from software contributed to The NetBSD Foundation - * by Martin Husemann . - * - * 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 acknowledgement: - * This product includes software developed by the NetBSD - * Foundation, Inc. and its contributors. - * 4. Neither the name of The NetBSD Foundation 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 NETBSD FOUNDATION, INC. AND CONTRIBUTORS - * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS - * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ -#ifndef PPP_OE_H -#define PPP_OE_H - -#include "lwip/opt.h" - -#if PPPOE_SUPPORT > 0 - -#include "netif/etharp.h" - -#ifdef PACK_STRUCT_USE_INCLUDES -# include "arch/bpstruct.h" -#endif -PACK_STRUCT_BEGIN -struct pppoehdr { - PACK_STRUCT_FIELD(u8_t vertype); - PACK_STRUCT_FIELD(u8_t code); - PACK_STRUCT_FIELD(u16_t session); - PACK_STRUCT_FIELD(u16_t plen); -} PACK_STRUCT_STRUCT; -PACK_STRUCT_END -#ifdef PACK_STRUCT_USE_INCLUDES -# include "arch/epstruct.h" -#endif - -#ifdef PACK_STRUCT_USE_INCLUDES -# include "arch/bpstruct.h" -#endif -PACK_STRUCT_BEGIN -struct pppoetag { - PACK_STRUCT_FIELD(u16_t tag); - PACK_STRUCT_FIELD(u16_t len); -} PACK_STRUCT_STRUCT; -PACK_STRUCT_END -#ifdef PACK_STRUCT_USE_INCLUDES -# include "arch/epstruct.h" -#endif - - -#define PPPOE_STATE_INITIAL 0 -#define PPPOE_STATE_PADI_SENT 1 -#define PPPOE_STATE_PADR_SENT 2 -#define PPPOE_STATE_SESSION 3 -#define PPPOE_STATE_CLOSING 4 -/* passive */ -#define PPPOE_STATE_PADO_SENT 1 - -#define PPPOE_HEADERLEN sizeof(struct pppoehdr) -#define PPPOE_VERTYPE 0x11 /* VER=1, TYPE = 1 */ - -#define PPPOE_TAG_EOL 0x0000 /* end of list */ -#define PPPOE_TAG_SNAME 0x0101 /* service name */ -#define PPPOE_TAG_ACNAME 0x0102 /* access concentrator name */ -#define PPPOE_TAG_HUNIQUE 0x0103 /* host unique */ -#define PPPOE_TAG_ACCOOKIE 0x0104 /* AC cookie */ -#define PPPOE_TAG_VENDOR 0x0105 /* vendor specific */ -#define PPPOE_TAG_RELAYSID 0x0110 /* relay session id */ -#define PPPOE_TAG_SNAME_ERR 0x0201 /* service name error */ -#define PPPOE_TAG_ACSYS_ERR 0x0202 /* AC system error */ -#define PPPOE_TAG_GENERIC_ERR 0x0203 /* gerneric error */ - -#define PPPOE_CODE_PADI 0x09 /* Active Discovery Initiation */ -#define PPPOE_CODE_PADO 0x07 /* Active Discovery Offer */ -#define PPPOE_CODE_PADR 0x19 /* Active Discovery Request */ -#define PPPOE_CODE_PADS 0x65 /* Active Discovery Session confirmation */ -#define PPPOE_CODE_PADT 0xA7 /* Active Discovery Terminate */ - -#ifndef ETHERMTU -#define ETHERMTU 1500 -#endif - -/* two byte PPP protocol discriminator, then IP data */ -#define PPPOE_MAXMTU (ETHERMTU-PPPOE_HEADERLEN-2) - -#ifndef PPPOE_MAX_AC_COOKIE_LEN -#define PPPOE_MAX_AC_COOKIE_LEN 64 -#endif - -struct pppoe_softc { - struct pppoe_softc *next; - struct netif *sc_ethif; /* ethernet interface we are using */ - int sc_pd; /* ppp unit number */ - void (*sc_linkStatusCB)(int pd, int up); - - int sc_state; /* discovery phase or session connected */ - struct eth_addr sc_dest; /* hardware address of concentrator */ - u16_t sc_session; /* PPPoE session id */ - -#ifdef PPPOE_TODO - char *sc_service_name; /* if != NULL: requested name of service */ - char *sc_concentrator_name; /* if != NULL: requested concentrator id */ -#endif /* PPPOE_TODO */ - u8_t sc_ac_cookie[PPPOE_MAX_AC_COOKIE_LEN]; /* content of AC cookie we must echo back */ - size_t sc_ac_cookie_len; /* length of cookie data */ -#ifdef PPPOE_SERVER - u8_t *sc_hunique; /* content of host unique we must echo back */ - size_t sc_hunique_len; /* length of host unique */ -#endif - int sc_padi_retried; /* number of PADI retries already done */ - int sc_padr_retried; /* number of PADR retries already done */ -}; - - -#define pppoe_init() /* compatibility define, no initialization needed */ - -err_t pppoe_create(struct netif *ethif, int pd, void (*linkStatusCB)(int pd, int up), struct pppoe_softc **scptr); -err_t pppoe_destroy(struct netif *ifp); - -int pppoe_connect(struct pppoe_softc *sc); -void pppoe_disconnect(struct pppoe_softc *sc); - -void pppoe_disc_input(struct netif *netif, struct pbuf *p); -void pppoe_data_input(struct netif *netif, struct pbuf *p); - -err_t pppoe_xmit(struct pppoe_softc *sc, struct pbuf *pb); - -/** used in ppp.c */ -#define PPPOE_HDRLEN (sizeof(struct eth_hdr) + PPPOE_HEADERLEN) - -#endif /* PPPOE_SUPPORT */ - -#endif /* PPP_OE_H */ diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/netif/slipif.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/netif/slipif.h deleted file mode 100644 index 7b6ce5e2..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/netif/slipif.h +++ /dev/null @@ -1,81 +0,0 @@ -/* - * Copyright (c) 2001, Swedish Institute of Computer Science. - * 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. Neither the name of the Institute 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 INSTITUTE AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * This file is part of the lwIP TCP/IP stack. - * - * Author: Adam Dunkels - * - */ -#ifndef __NETIF_SLIPIF_H__ -#define __NETIF_SLIPIF_H__ - -#include "lwip/opt.h" -#include "lwip/netif.h" - -/** Set this to 1 to start a thread that blocks reading on the serial line - * (using sio_read()). - */ -#ifndef SLIP_USE_RX_THREAD -#define SLIP_USE_RX_THREAD !NO_SYS -#endif - -/** Set this to 1 to enable functions to pass in RX bytes from ISR context. - * If enabled, slipif_received_byte[s]() process incoming bytes and put assembled - * packets on a queue, which is fed into lwIP from slipif_poll(). - * If disabled, slipif_poll() polls the serila line (using sio_tryread()). - */ -#ifndef SLIP_RX_FROM_ISR -#define SLIP_RX_FROM_ISR 0 -#endif - -/** Set this to 1 (default for SLIP_RX_FROM_ISR) to queue incoming packets - * received by slipif_received_byte[s]() as long as PBUF_POOL pbufs are available. - * If disabled, packets will be dropped if more than one packet is received. - */ -#ifndef SLIP_RX_QUEUE -#define SLIP_RX_QUEUE SLIP_RX_FROM_ISR -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -err_t slipif_init(struct netif * netif); -void slipif_poll(struct netif *netif); -#if SLIP_RX_FROM_ISR -void slipif_process_rxqueue(struct netif *netif); -void slipif_received_byte(struct netif *netif, u8_t data); -void slipif_received_bytes(struct netif *netif, u8_t *data, u8_t len); -#endif /* SLIP_RX_FROM_ISR */ - -#ifdef __cplusplus -} -#endif - -#endif - diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/posix/netdb.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/posix/netdb.h deleted file mode 100644 index 7134032d..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/posix/netdb.h +++ /dev/null @@ -1,33 +0,0 @@ -/** - * @file - * This file is a posix wrapper for lwip/netdb.h. - */ - -/* - * 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. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT - * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING - * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY - * OF SUCH DAMAGE. - * - * This file is part of the lwIP TCP/IP stack. - * - */ - -#include "lwip/netdb.h" diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/posix/sys/socket.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/posix/sys/socket.h deleted file mode 100644 index f7c7066e..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/lwip/src/include/posix/sys/socket.h +++ /dev/null @@ -1,33 +0,0 @@ -/** - * @file - * This file is a posix wrapper for lwip/sockets.h. - */ - -/* - * 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. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT - * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT - * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING - * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY - * OF SUCH DAMAGE. - * - * This file is part of the lwIP TCP/IP stack. - * - */ - -#include "lwip/sockets.h" diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/BRefTarget.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/BRefTarget.h deleted file mode 100644 index 4324605a..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/BRefTarget.h +++ /dev/null @@ -1,114 +0,0 @@ -/** - * @file BRefTarget.h - * @author Ambroz Bizjak - * - * @section LICENSE - * - * 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 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE 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. - */ - -#ifndef BADVPN_B_REF_TARGET_H -#define BADVPN_B_REF_TARGET_H - -#include - -#include -#include - -/** - * Represents a reference-counted object. - */ -typedef struct BRefTarget_s BRefTarget; - -/** - * Callback function called after the reference count of a {@link BRefTarget} - * reaches has reached zero. At this point the BRefTarget object has already - * been invalidated, i.e. {@link BRefTarget_Ref} must not be called on this - * object after this handler is called. - */ -typedef void (*BRefTarget_func_release) (BRefTarget *o); - -struct BRefTarget_s { - BRefTarget_func_release func_release; - int refcnt; - DebugObject d_obj; -}; - -/** - * Initializes a reference target object. The initial reference count of the object - * is 1. The \a func_release argument specifies the function to be called from - * {@link BRefTarget_Deref} when the reference count reaches zero. - */ -static void BRefTarget_Init (BRefTarget *o, BRefTarget_func_release func_release); - -/** - * Decrements the reference count of a reference target object. If the reference - * count has reached zero, the object's {@link BRefTarget_func_release} function - * is called, and the object is considered destroyed. - */ -static void BRefTarget_Deref (BRefTarget *o); - -/** - * Increments the reference count of a reference target object. - * Returns 1 on success and 0 on failure. - */ -static int BRefTarget_Ref (BRefTarget *o) WARN_UNUSED; - -static void BRefTarget_Init (BRefTarget *o, BRefTarget_func_release func_release) -{ - ASSERT(func_release) - - o->func_release = func_release; - o->refcnt = 1; - - DebugObject_Init(&o->d_obj); -} - -static void BRefTarget_Deref (BRefTarget *o) -{ - DebugObject_Access(&o->d_obj); - ASSERT(o->refcnt > 0) - - o->refcnt--; - - if (o->refcnt == 0) { - DebugObject_Free(&o->d_obj); - o->func_release(o); - } -} - -static int BRefTarget_Ref (BRefTarget *o) -{ - DebugObject_Access(&o->d_obj); - ASSERT(o->refcnt > 0) - - if (o->refcnt == INT_MAX) { - return 0; - } - - o->refcnt++; - - return 1; -} - -#endif diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/Utf16Decoder.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/Utf16Decoder.h deleted file mode 100644 index 819ac94c..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/Utf16Decoder.h +++ /dev/null @@ -1,113 +0,0 @@ -/** - * @file Utf16Decoder.h - * @author Ambroz Bizjak - * - * @section LICENSE - * - * 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 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE 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. - */ - -#ifndef BADVPN_UTF16DECODER_H -#define BADVPN_UTF16DECODER_H - -#include - -#include - -/** - * Decodes UTF-16 data into Unicode characters. - */ -typedef struct { - int cont; - uint32_t ch; -} Utf16Decoder; - -/** - * Initializes the UTF-16 decoder. - * - * @param o the object - */ -static void Utf16Decoder_Init (Utf16Decoder *o); - -/** - * Inputs a 16-bit value to the decoder. - * - * @param o the object - * @param b 16-bit value to input - * @param out_ch will receive a Unicode character if this function returns 1. - * If written, the character will be in the range 0 - 0x10FFFF, - * excluding the surrogate range 0xD800 - 0xDFFF. - * @return 1 if a Unicode character has been written to *out_ch, 0 if not - */ -static int Utf16Decoder_Input (Utf16Decoder *o, uint16_t b, uint32_t *out_ch); - -void Utf16Decoder_Init (Utf16Decoder *o) -{ - o->cont = 0; -} - -int Utf16Decoder_Input (Utf16Decoder *o, uint16_t b, uint32_t *out_ch) -{ - // high surrogate - if (b >= UINT16_C(0xD800) && b <= UINT16_C(0xDBFF)) { - // set continuation state - o->cont = 1; - - // add high bits - o->ch = (uint32_t)(b - UINT16_C(0xD800)) << 10; - - return 0; - } - - // low surrogate - if (b >= UINT16_C(0xDC00) && b <= UINT16_C(0xDFFF)) { - // check continuation - if (!o->cont) { - return 0; - } - - // add low bits - o->ch |= (b - UINT16_C(0xDC00)); - - // reset state - o->cont = 0; - - // don't report surrogates - if (o->ch >= UINT32_C(0xD800) && o->ch <= UINT32_C(0xDFFF)) { - return 0; - } - - // return character - *out_ch = o->ch; - return 1; - } - - // reset state - o->cont = 0; - - // return character - *out_ch = b; - return 1; -} - -#endif diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/Utf16Encoder.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/Utf16Encoder.h deleted file mode 100644 index 4900b426..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/Utf16Encoder.h +++ /dev/null @@ -1,67 +0,0 @@ -/** - * @file Utf16Encoder.h - * @author Ambroz Bizjak - * - * @section LICENSE - * - * 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 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE 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. - */ - -#ifndef BADVPN_UTF16ENCODER_H -#define BADVPN_UTF16ENCODER_H - -#include - -/** - * Encodes a Unicode character into a sequence of 16-bit values according to UTF-16. - * - * @param ch Unicode character to encode - * @param out will receive the encoded 16-bit values. Must have space for 2 values. - * @return number of 16-bit values written, 0-2, with 0 meaning the character cannot - * be encoded - */ -static int Utf16Encoder_EncodeCharacter (uint32_t ch, uint16_t *out); - -int Utf16Encoder_EncodeCharacter (uint32_t ch, uint16_t *out) -{ - if (ch <= UINT32_C(0xFFFF)) { - // surrogates - if (ch >= UINT32_C(0xD800) && ch <= UINT32_C(0xDFFF)) { - return 0; - } - - out[0] = ch; - return 1; - } - - if (ch <= UINT32_C(0x10FFFF)) { - uint32_t x = ch - UINT32_C(0x10000); - out[0] = UINT32_C(0xD800) + (x >> 10); - out[1] = UINT32_C(0xDC00) + (x & UINT32_C(0x3FF)); - return 2; - } - - return 0; -} - -#endif diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/Utf8Decoder.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/Utf8Decoder.h deleted file mode 100644 index c6412b18..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/Utf8Decoder.h +++ /dev/null @@ -1,143 +0,0 @@ -/** - * @file Utf8Decoder.h - * @author Ambroz Bizjak - * - * @section LICENSE - * - * 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 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE 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. - */ - -#ifndef BADVPN_UTF8DECODER_H -#define BADVPN_UTF8DECODER_H - -#include - -#include - -/** - * Decodes UTF-8 data into Unicode characters. - */ -typedef struct { - int bytes; - int pos; - uint32_t ch; -} Utf8Decoder; - -/** - * Initializes the UTF-8 decoder. - * - * @param o the object - */ -static void Utf8Decoder_Init (Utf8Decoder *o); - -/** - * Inputs a byte to the decoder. - * - * @param o the object - * @param b byte to input - * @param out_ch will receive a Unicode character if this function returns 1. - * If written, the character will be in the range 0 - 0x10FFFF, - * excluding the surrogate range 0xD800 - 0xDFFF. - * @return 1 if a Unicode character has been written to *out_ch, 0 if not - */ -static int Utf8Decoder_Input (Utf8Decoder *o, uint8_t b, uint32_t *out_ch); - -void Utf8Decoder_Init (Utf8Decoder *o) -{ - o->bytes = 0; -} - -int Utf8Decoder_Input (Utf8Decoder *o, uint8_t b, uint32_t *out_ch) -{ - // one-byte character - if ((b & 128) == 0) { - o->bytes = 0; - *out_ch = b; - return 1; - } - - // start of two-byte character - if ((b & 224) == 192) { - o->bytes = 2; - o->pos = 1; - o->ch = (uint32_t)(b & 31) << 6; - return 0; - } - - // start of three-byte character - if ((b & 240) == 224) { - o->bytes = 3; - o->pos = 1; - o->ch = (uint32_t)(b & 15) << 12; - return 0; - } - - // start of four-byte character - if ((b & 248) == 240) { - o->bytes = 4; - o->pos = 1; - o->ch = (uint32_t)(b & 7) << 18; - return 0; - } - - // continuation of multi-byte character - if ((b & 192) == 128 && o->bytes > 0) { - ASSERT(o->bytes <= 4) - ASSERT(o->pos > 0) - ASSERT(o->pos < o->bytes) - - // add bits from this byte - o->ch |= (uint32_t)(b & 63) << (6 * (o->bytes - o->pos - 1)); - - // end of multi-byte character? - if (o->pos == o->bytes - 1) { - // reset state - o->bytes = 0; - - // don't report out-of-range characters - if (o->ch > UINT32_C(0x10FFFF)) { - return 0; - } - - // don't report surrogates - if (o->ch >= UINT32_C(0xD800) && o->ch <= UINT32_C(0xDFFF)) { - return 0; - } - - *out_ch = o->ch; - return 1; - } - - // increment byte index - o->pos++; - - return 0; - } - - // error, reset state - o->bytes = 0; - - return 0; -} - -#endif diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/Utf8Encoder.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/Utf8Encoder.h deleted file mode 100644 index 00eb5e68..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/Utf8Encoder.h +++ /dev/null @@ -1,81 +0,0 @@ -/** - * @file Utf8Encoder.h - * @author Ambroz Bizjak - * - * @section LICENSE - * - * 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 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE 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. - */ - -#ifndef BADVPN_UTF8ENCODER_H -#define BADVPN_UTF8ENCODER_H - -#include - -/** - * Encodes a Unicode character into a sequence of bytes according to UTF-8. - * - * @param ch Unicode character to encode - * @param out will receive the encoded bytes. Must have space for 4 bytes. - * @return number of bytes written, 0-4, with 0 meaning the character cannot - * be encoded - */ -static int Utf8Encoder_EncodeCharacter (uint32_t ch, uint8_t *out); - -int Utf8Encoder_EncodeCharacter (uint32_t ch, uint8_t *out) -{ - if (ch <= UINT32_C(0x007F)) { - out[0] = ch; - return 1; - } - - if (ch <= UINT32_C(0x07FF)) { - out[0] = (0xC0 | (ch >> 6)); - out[1] = (0x80 | ((ch >> 0) & 0x3F)); - return 2; - } - - if (ch <= UINT32_C(0xFFFF)) { - // surrogates - if (ch >= UINT32_C(0xD800) && ch <= UINT32_C(0xDFFF)) { - return 0; - } - - out[0] = (0xE0 | (ch >> 12)); - out[1] = (0x80 | ((ch >> 6) & 0x3F)); - out[2] = (0x80 | ((ch >> 0) & 0x3F)); - return 3; - } - - if (ch < UINT32_C(0x10FFFF)) { - out[0] = (0xF0 | (ch >> 18)); - out[1] = (0x80 | ((ch >> 12) & 0x3F)); - out[2] = (0x80 | ((ch >> 6) & 0x3F)); - out[3] = (0x80 | ((ch >> 0) & 0x3F)); - return 4; - } - - return 0; -} - -#endif diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/arp_proto.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/arp_proto.h deleted file mode 100644 index 71a6c98d..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/arp_proto.h +++ /dev/null @@ -1,60 +0,0 @@ -/** - * @file arp_proto.h - * @author Ambroz Bizjak - * - * @section LICENSE - * - * 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 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE 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. - * - * @section DESCRIPTION - * - * Definitions for the ARP protocol. - */ - -#ifndef BADVPN_ARP_PROTO_H -#define BADVPN_ARP_PROTO_H - -#include - -#include - -#define ARP_HARDWARE_TYPE_ETHERNET 1 - -#define ARP_OPCODE_REQUEST 1 -#define ARP_OPCODE_REPLY 2 - -B_START_PACKED -struct arp_packet { - uint16_t hardware_type; - uint16_t protocol_type; - uint8_t hardware_size; - uint8_t protocol_size; - uint16_t opcode; - uint8_t sender_mac[6]; - uint32_t sender_ip; - uint8_t target_mac[6]; - uint32_t target_ip; -} B_PACKED; -B_END_PACKED - -#endif diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/array_length.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/array_length.h deleted file mode 100644 index 15de964c..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/array_length.h +++ /dev/null @@ -1,35 +0,0 @@ -/** - * @file array_length.h - * @author Ambroz Bizjak - * - * @section LICENSE - * - * 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 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE 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. - */ - -#ifndef BADVPN_ARRAY_LENGTH -#define BADVPN_ARRAY_LENGTH - -#define B_ARRAY_LENGTH(arr) (sizeof((arr)) / sizeof((arr)[0])) - -#endif diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/ascii_utils.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/ascii_utils.h deleted file mode 100644 index 2baa9fc2..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/ascii_utils.h +++ /dev/null @@ -1,43 +0,0 @@ -/** - * @file ascii_utils.h - * @author Ambroz Bizjak - * - * @section LICENSE - * - * 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 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE 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. - */ - -#ifndef BADVPN_ASCII_UTILS_H -#define BADVPN_ASCII_UTILS_H - -static char b_ascii_tolower (char c) -{ - return (c >= 'A' && c <= 'Z') ? (c + 32) : c; -} - -static char b_ascii_toupper (char c) -{ - return (c >= 'a' && c <= 'z') ? (c - 32) : c; -} - -#endif diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/balign.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/balign.h deleted file mode 100644 index 57152afb..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/balign.h +++ /dev/null @@ -1,76 +0,0 @@ -/** - * @file balign.h - * @author Ambroz Bizjak - * - * @section LICENSE - * - * 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 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE 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. - * - * @section DESCRIPTION - * - * Integer alignment macros. - */ - -#ifndef BADVPN_MISC_BALIGN_H -#define BADVPN_MISC_BALIGN_H - -#include -#include - -/** - * Checks if aligning x up to n would overflow. - */ -static int balign_up_overflows (size_t x, size_t n) -{ - size_t r = x % n; - - return (r && x > SIZE_MAX - (n - r)); -} - -/** - * Aligns x up to n. - */ -static size_t balign_up (size_t x, size_t n) -{ - size_t r = x % n; - return (r ? x + (n - r) : x); -} - -/** - * Aligns x down to n. - */ -static size_t balign_down (size_t x, size_t n) -{ - return (x - (x % n)); -} - -/** - * Calculates the quotient of a and b, rounded up. - */ -static size_t bdivide_up (size_t a, size_t b) -{ - size_t r = a % b; - return (r > 0 ? a / b + 1 : a / b); -} - -#endif diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/balloc.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/balloc.h deleted file mode 100644 index ff946b6a..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/balloc.h +++ /dev/null @@ -1,248 +0,0 @@ -/** - * @file balloc.h - * @author Ambroz Bizjak - * - * @section LICENSE - * - * 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 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE 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. - * - * @section DESCRIPTION - * - * Memory allocation functions. - */ - -#ifndef BADVPN_MISC_BALLOC_H -#define BADVPN_MISC_BALLOC_H - -#include -#include -#include -#include - -#include "misc/debug.h" -#include "misc/bsize.h" -#include "misc/maxalign.h" - -/** - * Allocates memory. - * - * @param bytes number of bytes to allocate. - * @return a non-NULL pointer to the memory, or NULL on failure. - * The memory allocated can be freed using {@link BFree}. - */ -static void * BAlloc (size_t bytes); - -/** - * Frees memory. - * - * @param m memory to free. Must have been obtained with {@link BAlloc}, - * {@link BAllocArray}, or {@link BAllocArray2}. May be NULL; - * in this case, this function does nothing. - */ -static void BFree (void *m); - -/** - * Changes the size of a memory block. On success, the memory block - * may be moved to a different address. - * - * @param m pointer to a memory block obtained from {@link BAlloc} - * or other functions in this group. If this is NULL, the - * call is equivalent to {@link BAlloc}(bytes). - * @param bytes new size of the memory block - * @return new pointer to the memory block, or NULL on failure - */ -static void * BRealloc (void *m, size_t bytes); - -/** - * Allocates memory, with size given as a {@link bsize_t}. - * - * @param bytes number of bytes to allocate. If the size is overflow, - * this function will return NULL. - * @return a non-NULL pointer to the memory, or NULL on failure. - * The memory allocated can be freed using {@link BFree}. - */ -static void * BAllocSize (bsize_t bytes); - -/** - * Allocates memory for an array. - * A check is first done to make sure the multiplication doesn't overflow; - * otherwise, this is equivalent to {@link BAlloc}(count * bytes). - * This may be slightly faster if 'bytes' is constant, because a division - * with 'bytes' is performed. - * - * @param count number of elements. - * @param bytes size of one array element. - * @return a non-NULL pointer to the memory, or NULL on failure. - * The memory allocated can be freed using {@link BFree}. - */ -static void * BAllocArray (size_t count, size_t bytes); - -/** - * Reallocates memory that was allocated using one of the allocation - * functions in this file. On success, the memory may be moved to a - * different address, leaving the old address invalid. - * - * @param mem pointer to an existing memory block. May be NULL, in which - * case this is equivalent to {@link BAllocArray}. - * @param count number of elements for reallocation - * @param bytes size of one array element for reallocation - * @return a non-NULL pointer to the address of the reallocated memory - * block, or NULL on failure. On failure, the original memory - * block is left intact. - */ -static void * BReallocArray (void *mem, size_t count, size_t bytes); - -/** - * Allocates memory for a two-dimensional array. - * - * Checks are first done to make sure the multiplications don't overflow; - * otherwise, this is equivalent to {@link BAlloc}((count2 * (count1 * bytes)). - * - * @param count2 number of elements in one dimension. - * @param count1 number of elements in the other dimension. - * @param bytes size of one array element. - * @return a non-NULL pointer to the memory, or NULL on failure. - * The memory allocated can be freed using {@link BFree}. - */ -static void * BAllocArray2 (size_t count2, size_t count1, size_t bytes); - -/** - * Adds to a size_t with overflow detection. - * - * @param s pointer to a size_t to add to - * @param add number to add - * @return 1 on success, 0 on failure - */ -static int BSizeAdd (size_t *s, size_t add); - -/** - * Aligns a size_t upwards with overflow detection. - * - * @param s pointer to a size_t to align - * @param align alignment value. Must be >0. - * @return 1 on success, 0 on failure - */ -static int BSizeAlign (size_t *s, size_t align); - -void * BAlloc (size_t bytes) -{ - if (bytes == 0) { - return malloc(1); - } - - return malloc(bytes); -} - -void BFree (void *m) -{ - free(m); -} - -void * BRealloc (void *m, size_t bytes) -{ - if (bytes == 0) { - return realloc(m, 1); - } - - return realloc(m, bytes); -} - -void * BAllocSize (bsize_t bytes) -{ - if (bytes.is_overflow) { - return NULL; - } - - return BAlloc(bytes.value); -} - -void * BAllocArray (size_t count, size_t bytes) -{ - if (count == 0 || bytes == 0) { - return malloc(1); - } - - if (count > SIZE_MAX / bytes) { - return NULL; - } - - return BAlloc(count * bytes); -} - -void * BReallocArray (void *mem, size_t count, size_t bytes) -{ - if (count == 0 || bytes == 0) { - return realloc(mem, 1); - } - - if (count > SIZE_MAX / bytes) { - return NULL; - } - - return realloc(mem, count * bytes); -} - -void * BAllocArray2 (size_t count2, size_t count1, size_t bytes) -{ - if (count2 == 0 || count1 == 0 || bytes == 0) { - return malloc(1); - } - - if (count1 > SIZE_MAX / bytes) { - return NULL; - } - - if (count2 > SIZE_MAX / (count1 * bytes)) { - return NULL; - } - - return BAlloc(count2 * (count1 * bytes)); -} - -int BSizeAdd (size_t *s, size_t add) -{ - ASSERT(s) - - if (add > SIZE_MAX - *s) { - return 0; - } - *s += add; - return 1; -} - -int BSizeAlign (size_t *s, size_t align) -{ - ASSERT(s) - ASSERT(align > 0) - - size_t mod = *s % align; - if (mod > 0) { - if (align - mod > SIZE_MAX - *s) { - return 0; - } - *s += align - mod; - } - return 1; -} - -#endif diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/blimits.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/blimits.h deleted file mode 100644 index 8bcdc2a7..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/blimits.h +++ /dev/null @@ -1,60 +0,0 @@ -/** - * @file blimits.h - * @author Ambroz Bizjak - * - * @section LICENSE - * - * 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 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE 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. - */ - -#ifndef BADVPN_BLIMITS_H -#define BADVPN_BLIMITS_H - -#include - -#define BTYPE_IS_SIGNED(type) ((type)-1 < 0) - -#define BSIGNED_TYPE_MIN(type) ( \ - sizeof(type) == 1 ? INT8_MIN : ( \ - sizeof(type) == 2 ? INT16_MIN : ( \ - sizeof(type) == 4 ? INT32_MIN : ( \ - sizeof(type) == 8 ? INT64_MIN : 0)))) - -#define BSIGNED_TYPE_MAX(type) ( \ - sizeof(type) == 1 ? INT8_MAX : ( \ - sizeof(type) == 2 ? INT16_MAX : ( \ - sizeof(type) == 4 ? INT32_MAX : ( \ - sizeof(type) == 8 ? INT64_MAX : 0)))) - -#define BUNSIGNED_TYPE_MIN(type) ((type)0) - -#define BUNSIGNED_TYPE_MAX(type) ( \ - sizeof(type) == 1 ? UINT8_MAX : ( \ - sizeof(type) == 2 ? UINT16_MAX : ( \ - sizeof(type) == 4 ? UINT32_MAX : ( \ - sizeof(type) == 8 ? UINT64_MAX : 0)))) - -#define BTYPE_MIN(type) (BTYPE_IS_SIGNED(type) ? BSIGNED_TYPE_MIN(type) : BUNSIGNED_TYPE_MIN(type)) -#define BTYPE_MAX(type) (BTYPE_IS_SIGNED(type) ? BSIGNED_TYPE_MAX(type) : BUNSIGNED_TYPE_MAX(type)) - -#endif diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/bsize.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/bsize.h deleted file mode 100644 index c28dbf69..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/bsize.h +++ /dev/null @@ -1,117 +0,0 @@ -/** - * @file bsize.h - * @author Ambroz Bizjak - * - * @section LICENSE - * - * 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 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE 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. - * - * @section DESCRIPTION - * - * Arithmetic with overflow detection. - */ - -#ifndef BADVPN_MISC_BSIZE_H -#define BADVPN_MISC_BSIZE_H - -#include -#include -#include - -typedef struct { - int is_overflow; - size_t value; -} bsize_t; - -static bsize_t bsize_fromsize (size_t v); -static bsize_t bsize_fromint (int v); -static bsize_t bsize_overflow (void); -static int bsize_tosize (bsize_t s, size_t *out); -static int bsize_toint (bsize_t s, int *out); -static bsize_t bsize_add (bsize_t s1, bsize_t s2); -static bsize_t bsize_max (bsize_t s1, bsize_t s2); -static bsize_t bsize_mul (bsize_t s1, bsize_t s2); - -bsize_t bsize_fromsize (size_t v) -{ - bsize_t s = {0, v}; - return s; -} - -bsize_t bsize_fromint (int v) -{ - bsize_t s = {(v < 0 || v > SIZE_MAX), v}; - return s; -} - -static bsize_t bsize_overflow (void) -{ - bsize_t s = {1, 0}; - return s; -} - -int bsize_tosize (bsize_t s, size_t *out) -{ - if (s.is_overflow) { - return 0; - } - - if (out) { - *out = s.value; - } - - return 1; -} - -int bsize_toint (bsize_t s, int *out) -{ - if (s.is_overflow || s.value > INT_MAX) { - return 0; - } - - if (out) { - *out = (int)s.value; - } - - return 1; -} - -bsize_t bsize_add (bsize_t s1, bsize_t s2) -{ - bsize_t s = {(s1.is_overflow || s2.is_overflow || s2.value > SIZE_MAX - s1.value), (s1.value + s2.value)}; - return s; -} - -bsize_t bsize_max (bsize_t s1, bsize_t s2) -{ - bsize_t s = {(s1.is_overflow || s2.is_overflow), ((s1.value > s2.value) * s1.value + (s1.value <= s2.value) * s2.value)}; - return s; -} - -bsize_t bsize_mul (bsize_t s1, bsize_t s2) -{ - bsize_t s = {(s1.is_overflow || s2.is_overflow || (s1.value != 0 && s2.value > SIZE_MAX / s1.value)), (s1.value * s2.value)}; - return s; -} - -#endif diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/bsort.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/bsort.h deleted file mode 100644 index 24d7a66a..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/bsort.h +++ /dev/null @@ -1,69 +0,0 @@ -/** - * @file bsort.h - * @author Ambroz Bizjak - * - * @section LICENSE - * - * 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 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE 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. - * - * @section DESCRIPTION - * - * Sorting functions. - */ - -#ifndef BADVPN_MISC_BSORT_H -#define BADVPN_MISC_BSORT_H - -#include -#include -#include - -#include -#include - -typedef int (*BSort_comparator) (const void *e1, const void *e2); - -static void BInsertionSort (void *arr, size_t count, size_t esize, BSort_comparator compatator, void *temp); - -void BInsertionSort (void *arr, size_t count, size_t esize, BSort_comparator compatator, void *temp) -{ - ASSERT(esize > 0) - - for (size_t i = 0; i < count; i++) { - size_t j = i; - while (j > 0) { - uint8_t *x = (uint8_t *)arr + (j - 1) * esize; - uint8_t *y = (uint8_t *)arr + j * esize; - int c = compatator(x, y); - if (c <= 0) { - break; - } - memcpy(temp, x, esize); - memcpy(x, y, esize); - memcpy(y, temp, esize); - j--; - } - } -} - -#endif diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/bstring.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/bstring.h deleted file mode 100644 index caef1062..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/bstring.h +++ /dev/null @@ -1,140 +0,0 @@ -/** - * @file bstring.h - * @author Ambroz Bizjak - * - * @section LICENSE - * - * 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 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE 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. - */ - -#ifndef BADVPN_BSTRING_H -#define BADVPN_BSTRING_H - -#include - -#include -#include - -#define BSTRING_TYPE_STATIC 5 -#define BSTRING_TYPE_DYNAMIC 7 -#define BSTRING_TYPE_EXTERNAL 11 - -#define BSTRING_STATIC_SIZE 23 -#define BSTRING_STATIC_MAX (BSTRING_STATIC_SIZE - 1) - -typedef struct { - union { - struct { - char type; - char static_string[BSTRING_STATIC_SIZE]; - } us; - struct { - char type; - char *dynamic_string; - } ud; - struct { - char type; - const char *external_string; - } ue; - } u; -} BString; - -static void BString__assert (BString *o) -{ - switch (o->u.us.type) { - case BSTRING_TYPE_STATIC: - case BSTRING_TYPE_DYNAMIC: - case BSTRING_TYPE_EXTERNAL: - return; - } - - ASSERT(0); -} - -static int BString_Init (BString *o, const char *str) -{ - if (strlen(str) <= BSTRING_STATIC_MAX) { - strcpy(o->u.us.static_string, str); - o->u.us.type = BSTRING_TYPE_STATIC; - } else { - if (!(o->u.ud.dynamic_string = malloc(strlen(str) + 1))) { - return 0; - } - strcpy(o->u.ud.dynamic_string, str); - o->u.ud.type = BSTRING_TYPE_DYNAMIC; - } - - BString__assert(o); - return 1; -} - -static void BString_InitStatic (BString *o, const char *str) -{ - ASSERT(strlen(str) <= BSTRING_STATIC_MAX) - - strcpy(o->u.us.static_string, str); - o->u.us.type = BSTRING_TYPE_STATIC; - - BString__assert(o); -} - -static void BString_InitExternal (BString *o, const char *str) -{ - o->u.ue.external_string = str; - o->u.ue.type = BSTRING_TYPE_EXTERNAL; - - BString__assert(o); -} - -static void BString_InitAllocated (BString *o, char *str) -{ - o->u.ud.dynamic_string = str; - o->u.ud.type = BSTRING_TYPE_DYNAMIC; - - BString__assert(o); -} - -static void BString_Free (BString *o) -{ - BString__assert(o); - - if (o->u.ud.type == BSTRING_TYPE_DYNAMIC) { - free(o->u.ud.dynamic_string); - } -} - -static const char * BString_Get (BString *o) -{ - BString__assert(o); - - switch (o->u.us.type) { - case BSTRING_TYPE_STATIC: return o->u.us.static_string; - case BSTRING_TYPE_DYNAMIC: return o->u.ud.dynamic_string; - case BSTRING_TYPE_EXTERNAL: return o->u.ue.external_string; - } - - ASSERT(0); - return NULL; -} - -#endif diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/byteorder.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/byteorder.h deleted file mode 100644 index 055b0a59..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/byteorder.h +++ /dev/null @@ -1,196 +0,0 @@ -/** - * @file byteorder.h - * @author Ambroz Bizjak - * - * @section LICENSE - * - * 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 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE 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. - * - * @section DESCRIPTION - * - * Byte order conversion functions. - * - * hton* functions convert from host to big-endian (network) byte order. - * htol* functions convert from host to little-endian byte order. - * ntoh* functions convert from big-endian (network) to host byte order. - * ltoh* functions convert from little-endian to host byte order. - */ - -#ifndef BADVPN_MISC_BYTEORDER_H -#define BADVPN_MISC_BYTEORDER_H - -#if (defined(BADVPN_LITTLE_ENDIAN) + defined(BADVPN_BIG_ENDIAN)) != 1 -#error Unknown byte order or too many byte orders -#endif - -#include - -static uint16_t badvpn_reverse16 (uint16_t x) -{ - uint16_t y; - *((uint8_t *)&y+0) = *((uint8_t *)&x+1); - *((uint8_t *)&y+1) = *((uint8_t *)&x+0); - return y; -} - -static uint32_t badvpn_reverse32 (uint32_t x) -{ - uint32_t y; - *((uint8_t *)&y+0) = *((uint8_t *)&x+3); - *((uint8_t *)&y+1) = *((uint8_t *)&x+2); - *((uint8_t *)&y+2) = *((uint8_t *)&x+1); - *((uint8_t *)&y+3) = *((uint8_t *)&x+0); - return y; -} - -static uint64_t badvpn_reverse64 (uint64_t x) -{ - uint64_t y; - *((uint8_t *)&y+0) = *((uint8_t *)&x+7); - *((uint8_t *)&y+1) = *((uint8_t *)&x+6); - *((uint8_t *)&y+2) = *((uint8_t *)&x+5); - *((uint8_t *)&y+3) = *((uint8_t *)&x+4); - *((uint8_t *)&y+4) = *((uint8_t *)&x+3); - *((uint8_t *)&y+5) = *((uint8_t *)&x+2); - *((uint8_t *)&y+6) = *((uint8_t *)&x+1); - *((uint8_t *)&y+7) = *((uint8_t *)&x+0); - return y; -} - -static uint8_t hton8 (uint8_t x) -{ - return x; -} - -static uint8_t htol8 (uint8_t x) -{ - return x; -} - -#if defined(BADVPN_LITTLE_ENDIAN) - -static uint16_t hton16 (uint16_t x) -{ - return badvpn_reverse16(x); -} - -static uint32_t hton32 (uint32_t x) -{ - return badvpn_reverse32(x); -} - -static uint64_t hton64 (uint64_t x) -{ - return badvpn_reverse64(x); -} - -static uint16_t htol16 (uint16_t x) -{ - return x; -} - -static uint32_t htol32 (uint32_t x) -{ - return x; -} - -static uint64_t htol64 (uint64_t x) -{ - return x; -} - -#elif defined(BADVPN_BIG_ENDIAN) - -static uint16_t hton16 (uint16_t x) -{ - return x; -} - -static uint32_t hton32 (uint32_t x) -{ - return x; -} - -static uint64_t hton64 (uint64_t x) -{ - return x; -} - -static uint16_t htol16 (uint16_t x) -{ - return badvpn_reverse16(x); -} - -static uint32_t htol32 (uint32_t x) -{ - return badvpn_reverse32(x); -} - -static uint64_t htol64 (uint64_t x) -{ - return badvpn_reverse64(x); -} - -#endif - -static uint8_t ntoh8 (uint8_t x) -{ - return hton8(x); -} - -static uint16_t ntoh16 (uint16_t x) -{ - return hton16(x); -} - -static uint32_t ntoh32 (uint32_t x) -{ - return hton32(x); -} - -static uint64_t ntoh64 (uint64_t x) -{ - return hton64(x); -} - -static uint8_t ltoh8 (uint8_t x) -{ - return htol8(x); -} - -static uint16_t ltoh16 (uint16_t x) -{ - return htol16(x); -} - -static uint32_t ltoh32 (uint32_t x) -{ - return htol32(x); -} - -static uint64_t ltoh64 (uint64_t x) -{ - return htol64(x); -} - -#endif diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/cmdline.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/cmdline.h deleted file mode 100644 index 396d7948..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/cmdline.h +++ /dev/null @@ -1,168 +0,0 @@ -/** - * @file cmdline.h - * @author Ambroz Bizjak - * - * @section LICENSE - * - * 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 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE 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. - * - * @section DESCRIPTION - * - * Command line construction functions. - */ - -#ifndef BADVPN_MISC_CMDLINE_H -#define BADVPN_MISC_CMDLINE_H - -#include -#include - -#include -#include -#include -#include - -typedef struct { - struct ExpArray arr; - size_t n; -} CmdLine; - -static int CmdLine_Init (CmdLine *c); -static void CmdLine_Free (CmdLine *c); -static int CmdLine_Append (CmdLine *c, const char *str); -static int CmdLine_AppendNoNull (CmdLine *c, const char *str, size_t str_len); -static int CmdLine_AppendNoNullMr (CmdLine *c, MemRef mr); -static int CmdLine_AppendMulti (CmdLine *c, int num, ...); -static int CmdLine_Finish (CmdLine *c); -static char ** CmdLine_Get (CmdLine *c); - -static int _CmdLine_finished (CmdLine *c) -{ - return (c->n > 0 && ((char **)c->arr.v)[c->n - 1] == NULL); -} - -int CmdLine_Init (CmdLine *c) -{ - if (!ExpArray_init(&c->arr, sizeof(char *), 16)) { - return 0; - } - - c->n = 0; - - return 1; -} - -void CmdLine_Free (CmdLine *c) -{ - for (size_t i = 0; i < c->n; i++) { - free(((char **)c->arr.v)[i]); - } - - free(c->arr.v); -} - -int CmdLine_Append (CmdLine *c, const char *str) -{ - ASSERT(str) - ASSERT(!_CmdLine_finished(c)) - - if (!ExpArray_resize(&c->arr, c->n + 1)) { - return 0; - } - - if (!(((char **)c->arr.v)[c->n] = strdup(str))) { - return 0; - } - - c->n++; - - return 1; -} - -int CmdLine_AppendNoNull (CmdLine *c, const char *str, size_t str_len) -{ - ASSERT(str) - ASSERT(!memchr(str, '\0', str_len)) - ASSERT(!_CmdLine_finished(c)) - - if (!ExpArray_resize(&c->arr, c->n + 1)) { - return 0; - } - - if (!(((char **)c->arr.v)[c->n] = b_strdup_bin(str, str_len))) { - return 0; - } - - c->n++; - - return 1; -} - -int CmdLine_AppendNoNullMr (CmdLine *c, MemRef mr) -{ - return CmdLine_AppendNoNull(c, mr.ptr, mr.len); -} - -int CmdLine_AppendMulti (CmdLine *c, int num, ...) -{ - int res = 1; - - va_list vl; - va_start(vl, num); - - for (int i = 0; i < num; i++) { - const char *str = va_arg(vl, const char *); - if (!CmdLine_Append(c, str)) { - res = 0; - break; - } - } - - va_end(vl); - - return res; -} - -int CmdLine_Finish (CmdLine *c) -{ - ASSERT(!_CmdLine_finished(c)) - - if (!ExpArray_resize(&c->arr, c->n + 1)) { - return 0; - } - - ((char **)c->arr.v)[c->n] = NULL; - - c->n++; - - return 1; -} - -char ** CmdLine_Get (CmdLine *c) -{ - ASSERT(_CmdLine_finished(c)) - - return (char **)c->arr.v; -} - -#endif diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/compare.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/compare.h deleted file mode 100644 index 8d1a1b99..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/compare.h +++ /dev/null @@ -1,37 +0,0 @@ -/** - * @file compare.h - * @author Ambroz Bizjak - * - * @section LICENSE - * - * 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 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE 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. - */ - -#ifndef BADVPN_COMPARE_H -#define BADVPN_COMPARE_H - -#define B_COMPARE(a, b) (((a) > (b)) - ((a) < (b))) -#define B_COMPARE_COMBINE(cmp1, cmp2) ((cmp1) ? (cmp1) : (cmp2)) -#define B_COMPARE2(a, b, c, d) B_COMPARE_COMBINE(B_COMPARE((a), (b)), B_COMPARE((c), (d))) - -#endif diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/concat_strings.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/concat_strings.h deleted file mode 100644 index 1166906c..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/concat_strings.h +++ /dev/null @@ -1,85 +0,0 @@ -/** - * @file concat_strings.h - * @author Ambroz Bizjak - * - * @section LICENSE - * - * 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 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE 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. - * - * @section DESCRIPTION - * - * Function for concatenating strings. - */ - -#ifndef BADVPN_MISC_CONCAT_STRINGS_H -#define BADVPN_MISC_CONCAT_STRINGS_H - -#include -#include -#include - -#include "misc/debug.h" - -static char * concat_strings (int num, ...) -{ - ASSERT(num >= 0) - - // calculate sum of lengths - size_t sum = 0; - va_list ap; - va_start(ap, num); - for (int i = 0; i < num; i++) { - const char *str = va_arg(ap, const char *); - size_t str_len = strlen(str); - if (str_len > SIZE_MAX - 1 - sum) { - va_end(ap); - return NULL; - } - sum += str_len; - } - va_end(ap); - - // allocate memory - char *res_str = (char *)malloc(sum + 1); - if (!res_str) { - return NULL; - } - - // copy strings - sum = 0; - va_start(ap, num); - for (int i = 0; i < num; i++) { - const char *str = va_arg(ap, const char *); - size_t str_len = strlen(str); - memcpy(res_str + sum, str, str_len); - sum += str_len; - } - va_end(ap); - - // terminate - res_str[sum] = '\0'; - - return res_str; -} - -#endif diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/dead.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/dead.h deleted file mode 100644 index 7f574219..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/dead.h +++ /dev/null @@ -1,134 +0,0 @@ -/** - * @file dead.h - * @author Ambroz Bizjak - * - * @section LICENSE - * - * 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 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE 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. - * - * @section DESCRIPTION - * - * Dead mechanism definitions. - * - * The dead mechanism is a way for a piece of code to detect whether some - * specific event has occured during some operation (usually during calling - * a user-provided handler function), without requiring access to memory - * that might no longer be available because of the event. - * - * It works somehow like that: - * - * First a dead variable ({@link dead_t}) is allocated somewhere, and - * initialized with {@link DEAD_INIT}, e.g.: - * DEAD_INIT(dead); - * - * When the event that needs to be caught occurs, {@link DEAD_KILL} is - * called, e.g.: - * DEAD_KILL(dead); - * The memory used by the dead variable is no longer needed after - * that. - * - * If a piece of code needs to know whether the event occured during some - * operation (but it must not have occured before!), it puts {@link DEAD_ENTER}} - * in front of the operation, and does {@link DEAD_LEAVE} at the end. If - * {@link DEAD_LEAVE} returned nonzero, the event occured, otherwise it did - * not. Example: - * DEAD_ENTER(dead) - * HandlerFunction(); - * if (DEAD_LEAVE(dead)) { - * (event occured) - * } - * - * If is is needed to check for the event more than once in a single block, - * {@link DEAD_DECLARE} should be put somewhere before, and {@link DEAD_ENTER2} - * should be used instead of {@link DEAD_ENTER}. - * - * If it is needed to check for multiple events (dead variables) at the same - * time, DEAD_*_N macros should be used instead, specifying different - * identiers as the first argument for different dead variables. - */ - -#ifndef BADVPN_MISC_DEAD_H -#define BADVPN_MISC_DEAD_H - -#include - -/** - * Dead variable. - */ -typedef int *dead_t; - -/** - * Initializes a dead variable. - */ -#define DEAD_INIT(ptr) { ptr = NULL; } - -/** - * Kills the dead variable, - */ -#define DEAD_KILL(ptr) { if (ptr) *(ptr) = 1; } - -/** - * Kills the dead variable with the given value, or does nothing - * if the value is 0. The value will seen by {@link DEAD_KILLED}. - */ -#define DEAD_KILL_WITH(ptr, val) { if (ptr) *(ptr) = (val); } - -/** - * Declares dead catching variables. - */ -#define DEAD_DECLARE int badvpn__dead; dead_t badvpn__prev_ptr; - -/** - * Enters a dead catching using already declared dead catching variables. - * The dead variable must have been initialized with {@link DEAD_INIT}, - * and {@link DEAD_KILL} must not have been called yet. - * {@link DEAD_LEAVE2} must be called before the current scope is left. - */ -#define DEAD_ENTER2(ptr) { badvpn__dead = 0; badvpn__prev_ptr = ptr; ptr = &badvpn__dead; } - -/** - * Declares dead catching variables and enters a dead catching. - * The dead variable must have been initialized with {@link DEAD_INIT}, - * and {@link DEAD_KILL} must not have been called yet. - * {@link DEAD_LEAVE2} must be called before the current scope is left. - */ -#define DEAD_ENTER(ptr) DEAD_DECLARE DEAD_ENTER2(ptr) - -/** - * Leaves a dead catching. - */ -#define DEAD_LEAVE2(ptr) { if (!badvpn__dead) ptr = badvpn__prev_ptr; if (badvpn__prev_ptr) *badvpn__prev_ptr = badvpn__dead; } - -/** - * Returns 1 if {@link DEAD_KILL} was called for the dead variable, 0 otherwise. - * Must be called after entering a dead catching. - */ -#define DEAD_KILLED (badvpn__dead) - -#define DEAD_DECLARE_N(n) int badvpn__dead##n; dead_t badvpn__prev_ptr##n; -#define DEAD_ENTER2_N(n, ptr) { badvpn__dead##n = 0; badvpn__prev_ptr##n = ptr; ptr = &badvpn__dead##n;} -#define DEAD_ENTER_N(n, ptr) DEAD_DECLARE_N(n) DEAD_ENTER2_N(n, ptr) -#define DEAD_LEAVE2_N(n, ptr) { if (!badvpn__dead##n) ptr = badvpn__prev_ptr##n; if (badvpn__prev_ptr##n) *badvpn__prev_ptr##n = badvpn__dead##n; } -#define DEAD_KILLED_N(n) (badvpn__dead##n) - -#endif diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/debug.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/debug.h deleted file mode 100644 index 8e5b07fb..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/debug.h +++ /dev/null @@ -1,141 +0,0 @@ -/** - * @file debug.h - * @author Ambroz Bizjak - * - * @section LICENSE - * - * 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 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE 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. - * - * @section DESCRIPTION - * - * Debugging macros. - */ - -/** - * @def DEBUG - * - * Macro for printing debugging text. Use the same way as printf, - * but without a newline. - * Prepends "function_name: " and appends a newline. - */ - -/** - * @def ASSERT_FORCE - * - * Macro for forced assertions. - * Evaluates the argument and terminates the program abnormally - * if the result is false. - */ - -/** - * @def ASSERT - * - * Macro for assertions. - * The argument may or may not be evaluated. - * If the argument is evaluated, it must not evaluate to false. - */ - -/** - * @def ASSERT_EXECUTE - * - * Macro for always-evaluated assertions. - * The argument is evaluated. - * The argument must not evaluate to false. - */ - -/** - * @def DEBUG_ZERO_MEMORY - * - * If debugging is enabled, zeroes the given memory region. - * First argument is pointer to the memory region, second is - * number of bytes. - */ - -/** - * @def WARN_UNUSED - * - * Tells the compiler that the result of a function should not be unused. - * Insert at the end of the declaration of a function before the semicolon. - */ - -/** - * @def B_USE - * - * This can be used to suppress warnings about unused variables. It can - * be applied to a variable or any expression. It does not evaluate the - * expression. - */ - -#ifndef BADVPN_MISC_DEBUG_H -#define BADVPN_MISC_DEBUG_H - -#include -#include -#include -#include -#include - -#define DEBUG(...) \ - { \ - fprintf(stderr, "%s: ", __FUNCTION__); \ - fprintf(stderr, __VA_ARGS__); \ - fprintf(stderr, "\n"); \ - } - -#define ASSERT_FORCE(e) \ - { \ - if (!(e)) { \ - fprintf(stderr, "%s:%d Assertion failed\n", __FILE__, __LINE__); \ - } \ - } - -#ifdef NDEBUG - #define DEBUG_ZERO_MEMORY(buf, len) {} - #define ASSERT(e) {} - #define ASSERT_EXECUTE(e) { (e); } -#else - #define DEBUG_ZERO_MEMORY(buf, len) { memset((buf), 0, (len)); } - #ifdef BADVPN_USE_C_ASSERT - #define ASSERT(e) { assert(e); } - #define ASSERT_EXECUTE(e) \ - { \ - int _assert_res = !!(e); \ - assert(_assert_res); \ - } - #else - #define ASSERT(e) ASSERT_FORCE(e) - #define ASSERT_EXECUTE(e) ASSERT_FORCE(e) - #endif -#endif - -#ifdef __GNUC__ - #define WARN_UNUSED __attribute__((warn_unused_result)) -#else - #define WARN_UNUSED -#endif - -#define B_USE(expr) (void)(sizeof((expr))); - -#define B_ASSERT_USE(expr) { ASSERT(expr) B_USE(expr) } - -#endif diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/debugcounter.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/debugcounter.h deleted file mode 100644 index c305dbe5..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/debugcounter.h +++ /dev/null @@ -1,118 +0,0 @@ -/** - * @file debugcounter.h - * @author Ambroz Bizjak - * - * @section LICENSE - * - * 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 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE 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. - * - * @section DESCRIPTION - * - * Counter for detecting leaks. - */ - -#ifndef BADVPN_MISC_DEBUGCOUNTER_H -#define BADVPN_MISC_DEBUGCOUNTER_H - -#include - -#include "misc/debug.h" - -/** - * Counter for detecting leaks. - */ -typedef struct { -#ifndef NDEBUG - int32_t c; -#endif -} DebugCounter; - -#ifndef NDEBUG -#define DEBUGCOUNTER_STATIC { 0 } -#else -#define DEBUGCOUNTER_STATIC {} -#endif - -/** - * Initializes the object. - * The object is initialized with counter value zero. - * - * @param obj the object - */ -static void DebugCounter_Init (DebugCounter *obj) -{ -#ifndef NDEBUG - obj->c = 0; -#endif -} - -/** - * Frees the object. - * This does not have to be called when the counter is no longer needed. - * The counter value must be zero. - * - * @param obj the object - */ -static void DebugCounter_Free (DebugCounter *obj) -{ -#ifndef NDEBUG - ASSERT(obj->c == 0 || obj->c == INT32_MAX) -#endif -} - -/** - * Increments the counter. - * Increments the counter value by one. - * - * @param obj the object - */ -static void DebugCounter_Increment (DebugCounter *obj) -{ -#ifndef NDEBUG - ASSERT(obj->c >= 0) - - if (obj->c != INT32_MAX) { - obj->c++; - } -#endif -} - -/** - * Decrements the counter. - * The counter value must be >0. - * Decrements the counter value by one. - * - * @param obj the object - */ -static void DebugCounter_Decrement (DebugCounter *obj) -{ -#ifndef NDEBUG - ASSERT(obj->c > 0) - - if (obj->c != INT32_MAX) { - obj->c--; - } -#endif -} - -#endif diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/debugerror.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/debugerror.h deleted file mode 100644 index 44dc6859..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/debugerror.h +++ /dev/null @@ -1,90 +0,0 @@ -/** - * @file debugerror.h - * @author Ambroz Bizjak - * - * @section LICENSE - * - * 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 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE 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. - * - * @section DESCRIPTION - * - * Mechanism for ensuring an object is destroyed from inside an error handler - * or its jobs. - */ - -#ifndef BADVPN_MISC_DEBUGERROR_H -#define BADVPN_MISC_DEBUGERROR_H - -#include "misc/debug.h" -#include "base/BPending.h" - -#ifndef NDEBUG - #define DEBUGERROR(de, call) \ - { \ - ASSERT(!BPending_IsSet(&(de)->job)) \ - BPending_Set(&(de)->job); \ - (call); \ - } -#else - #define DEBUGERROR(de, call) { (call); } -#endif - -typedef struct { - #ifndef NDEBUG - BPending job; - #endif -} DebugError; - -static void DebugError_Init (DebugError *o, BPendingGroup *pg); -static void DebugError_Free (DebugError *o); -static void DebugError_AssertNoError (DebugError *o); - -#ifndef NDEBUG -static void _DebugError_job_handler (DebugError *o) -{ - ASSERT(0); -} -#endif - -void DebugError_Init (DebugError *o, BPendingGroup *pg) -{ - #ifndef NDEBUG - BPending_Init(&o->job, pg, (BPending_handler)_DebugError_job_handler, o); - #endif -} - -void DebugError_Free (DebugError *o) -{ - #ifndef NDEBUG - BPending_Free(&o->job); - #endif -} - -void DebugError_AssertNoError (DebugError *o) -{ - #ifndef NDEBUG - ASSERT(!BPending_IsSet(&o->job)) - #endif -} - -#endif diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/dhcp_proto.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/dhcp_proto.h deleted file mode 100644 index ed835445..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/dhcp_proto.h +++ /dev/null @@ -1,131 +0,0 @@ -/** - * @file dhcp_proto.h - * @author Ambroz Bizjak - * - * @section LICENSE - * - * 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 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE 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. - * - * @section DESCRIPTION - * - * Definitions for the DHCP protocol. - */ - -#ifndef BADVPN_MISC_DHCP_PROTO_H -#define BADVPN_MISC_DHCP_PROTO_H - -#include - -#include - -#define DHCP_OP_BOOTREQUEST 1 -#define DHCP_OP_BOOTREPLY 2 - -#define DHCP_HARDWARE_ADDRESS_TYPE_ETHERNET 1 - -#define DHCP_MAGIC 0x63825363 - -#define DHCP_OPTION_PAD 0 -#define DHCP_OPTION_END 255 - -#define DHCP_OPTION_SUBNET_MASK 1 -#define DHCP_OPTION_ROUTER 3 -#define DHCP_OPTION_DOMAIN_NAME_SERVER 6 -#define DHCP_OPTION_HOST_NAME 12 -#define DHCP_OPTION_REQUESTED_IP_ADDRESS 50 -#define DHCP_OPTION_IP_ADDRESS_LEASE_TIME 51 -#define DHCP_OPTION_DHCP_MESSAGE_TYPE 53 -#define DHCP_OPTION_DHCP_SERVER_IDENTIFIER 54 -#define DHCP_OPTION_PARAMETER_REQUEST_LIST 55 -#define DHCP_OPTION_MAXIMUM_MESSAGE_SIZE 57 -#define DHCP_OPTION_RENEWAL_TIME_VALUE 58 -#define DHCP_OPTION_REBINDING_TIME_VALUE 59 -#define DHCP_OPTION_VENDOR_CLASS_IDENTIFIER 60 -#define DHCP_OPTION_CLIENT_IDENTIFIER 61 - -#define DHCP_MESSAGE_TYPE_DISCOVER 1 -#define DHCP_MESSAGE_TYPE_OFFER 2 -#define DHCP_MESSAGE_TYPE_REQUEST 3 -#define DHCP_MESSAGE_TYPE_DECLINE 4 -#define DHCP_MESSAGE_TYPE_ACK 5 -#define DHCP_MESSAGE_TYPE_NAK 6 -#define DHCP_MESSAGE_TYPE_RELEASE 7 - -B_START_PACKED -struct dhcp_header { - uint8_t op; - uint8_t htype; - uint8_t hlen; - uint8_t hops; - uint32_t xid; - uint16_t secs; - uint16_t flags; - uint32_t ciaddr; - uint32_t yiaddr; - uint32_t siaddr; - uint32_t giaddr; - uint8_t chaddr[16]; - uint8_t sname[64]; - uint8_t file[128]; - uint32_t magic; -} B_PACKED; -B_END_PACKED - -B_START_PACKED -struct dhcp_option_header { - uint8_t type; - uint8_t len; -} B_PACKED; -B_END_PACKED - -B_START_PACKED -struct dhcp_option_dhcp_message_type { - uint8_t type; -} B_PACKED; -B_END_PACKED - -B_START_PACKED -struct dhcp_option_maximum_message_size { - uint16_t size; -} B_PACKED; -B_END_PACKED - -B_START_PACKED -struct dhcp_option_dhcp_server_identifier { - uint32_t id; -} B_PACKED; -B_END_PACKED - -B_START_PACKED -struct dhcp_option_time { - uint32_t time; -} B_PACKED; -B_END_PACKED - -B_START_PACKED -struct dhcp_option_addr { - uint32_t addr; -} B_PACKED; -B_END_PACKED - -#endif diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/ethernet_proto.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/ethernet_proto.h deleted file mode 100644 index 6e49e02b..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/ethernet_proto.h +++ /dev/null @@ -1,52 +0,0 @@ -/** - * @file ethernet_proto.h - * @author Ambroz Bizjak - * - * @section LICENSE - * - * 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 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE 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. - * - * @section DESCRIPTION - * - * Definitions for the Ethernet protocol. - */ - -#ifndef BADVPN_MISC_ETHERNET_PROTO_H -#define BADVPN_MISC_ETHERNET_PROTO_H - -#include - -#include - -#define ETHERTYPE_IPV4 0x0800 -#define ETHERTYPE_ARP 0x0806 - -B_START_PACKED -struct ethernet_header { - uint8_t dest[6]; - uint8_t source[6]; - uint16_t type; -} B_PACKED; -B_END_PACKED - -#endif diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/exparray.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/exparray.h deleted file mode 100644 index b24149f8..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/exparray.h +++ /dev/null @@ -1,101 +0,0 @@ -/** - * @file exparray.h - * @author Ambroz Bizjak - * - * @section LICENSE - * - * 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 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE 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. - * - * @section DESCRIPTION - * - * Dynamic array which grows exponentionally on demand. - */ - -#ifndef BADVPN_MISC_EXPARRAY_H -#define BADVPN_MISC_EXPARRAY_H - -#include -#include -#include - -#include - -struct ExpArray { - size_t esize; - size_t size; - void *v; -}; - -static int ExpArray_init (struct ExpArray *o, size_t esize, size_t size) -{ - ASSERT(esize > 0) - ASSERT(size > 0) - - o->esize = esize; - o->size = size; - - if (o->size > SIZE_MAX / o->esize) { - return 0; - } - - if (!(o->v = malloc(o->size * o->esize))) { - return 0; - } - - return 1; -} - -static int ExpArray_resize (struct ExpArray *o, size_t size) -{ - ASSERT(size > 0) - - if (size <= o->size) { - return 1; - } - - size_t newsize = o->size; - - while (newsize < size) { - if (2 > SIZE_MAX / newsize) { - return 0; - } - - newsize = 2 * newsize; - } - - if (newsize > SIZE_MAX / o->esize) { - return 0; - } - - void *newarr = realloc(o->v, newsize * o->esize); - if (!newarr) { - return 0; - } - - o->size = newsize; - o->v = newarr; - - return 1; -} - -#endif diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/expstring.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/expstring.h deleted file mode 100644 index 8081e2f7..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/expstring.h +++ /dev/null @@ -1,174 +0,0 @@ -/** - * @file expstring.h - * @author Ambroz Bizjak - * - * @section LICENSE - * - * 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 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE 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. - */ - -#ifndef BADVPN_MISC_EXPSTRING_H -#define BADVPN_MISC_EXPSTRING_H - -#include - -#include -#include -#include -#include - -typedef struct { - struct ExpArray arr; - size_t n; -} ExpString; - -static int ExpString_Init (ExpString *c); -static void ExpString_Free (ExpString *c); -static int ExpString_Append (ExpString *c, const char *str); -static int ExpString_AppendChar (ExpString *c, char ch); -static int ExpString_AppendByte (ExpString *c, uint8_t x); -static int ExpString_AppendBinary (ExpString *c, const uint8_t *data, size_t len); -static int ExpString_AppendBinaryMr (ExpString *c, MemRef data); -static int ExpString_AppendZeros (ExpString *c, size_t len); -static char * ExpString_Get (ExpString *c); -static size_t ExpString_Length (ExpString *c); -static MemRef ExpString_GetMr (ExpString *c); - -int ExpString_Init (ExpString *c) -{ - if (!ExpArray_init(&c->arr, 1, 16)) { - return 0; - } - - c->n = 0; - ((char *)c->arr.v)[c->n] = '\0'; - - return 1; -} - -void ExpString_Free (ExpString *c) -{ - free(c->arr.v); -} - -int ExpString_Append (ExpString *c, const char *str) -{ - ASSERT(str) - - size_t l = strlen(str); - bsize_t newsize = bsize_add(bsize_fromsize(c->n), bsize_add(bsize_fromsize(l), bsize_fromint(1))); - - if (newsize.is_overflow || !ExpArray_resize(&c->arr, newsize.value)) { - return 0; - } - - memcpy((char *)c->arr.v + c->n, str, l); - c->n += l; - ((char *)c->arr.v)[c->n] = '\0'; - - return 1; -} - -int ExpString_AppendChar (ExpString *c, char ch) -{ - ASSERT(ch != '\0') - - bsize_t newsize = bsize_add(bsize_fromsize(c->n), bsize_fromint(2)); - - if (newsize.is_overflow || !ExpArray_resize(&c->arr, newsize.value)) { - return 0; - } - - ((char *)c->arr.v)[c->n] = ch; - c->n++; - ((char *)c->arr.v)[c->n] = '\0'; - - return 1; -} - -int ExpString_AppendByte (ExpString *c, uint8_t x) -{ - bsize_t newsize = bsize_add(bsize_fromsize(c->n), bsize_fromint(2)); - - if (newsize.is_overflow || !ExpArray_resize(&c->arr, newsize.value)) { - return 0; - } - - ((uint8_t *)c->arr.v)[c->n] = x; - c->n++; - ((char *)c->arr.v)[c->n] = '\0'; - - return 1; -} - -int ExpString_AppendBinary (ExpString *c, const uint8_t *data, size_t len) -{ - bsize_t newsize = bsize_add(bsize_fromsize(c->n), bsize_add(bsize_fromsize(len), bsize_fromint(1))); - - if (newsize.is_overflow || !ExpArray_resize(&c->arr, newsize.value)) { - return 0; - } - - memcpy((char *)c->arr.v + c->n, data, len); - c->n += len; - ((char *)c->arr.v)[c->n] = '\0'; - - return 1; -} - -int ExpString_AppendBinaryMr (ExpString *c, MemRef data) -{ - return ExpString_AppendBinary(c, (uint8_t const *)data.ptr, data.len); -} - -int ExpString_AppendZeros (ExpString *c, size_t len) -{ - bsize_t newsize = bsize_add(bsize_fromsize(c->n), bsize_add(bsize_fromsize(len), bsize_fromint(1))); - - if (newsize.is_overflow || !ExpArray_resize(&c->arr, newsize.value)) { - return 0; - } - - memset((char *)c->arr.v + c->n, 0, len); - c->n += len; - ((char *)c->arr.v)[c->n] = '\0'; - - return 1; -} - -char * ExpString_Get (ExpString *c) -{ - return (char *)c->arr.v; -} - -size_t ExpString_Length (ExpString *c) -{ - return c->n; -} - -MemRef ExpString_GetMr (ExpString *c) -{ - return MemRef_Make((char const *)c->arr.v, c->n); -} - -#endif diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/find_char.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/find_char.h deleted file mode 100644 index a3a868e6..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/find_char.h +++ /dev/null @@ -1,58 +0,0 @@ -/** - * @file find_char.h - * @author Ambroz Bizjak - * - * @section LICENSE - * - * 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 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE 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. - */ - -#ifndef BADVPN_FIND_CHAR_H -#define BADVPN_FIND_CHAR_H - -#include - -#include "misc/debug.h" - -/** - * Finds the first character 'c' in the string represented by 'str' and 'len'. - * If found, returns 1 and writes the position to *out_pos (if out_pos!=NULL). - * If not found, returns 0 and does not modify *out_pos. - */ -static int b_find_char_bin (const char *str, size_t len, char c, size_t *out_pos) -{ - ASSERT(str) - - for (size_t i = 0; i < len; i++) { - if (str[i] == c) { - if (out_pos) { - *out_pos = i; - } - return 1; - } - } - - return 0; -} - -#endif diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/find_program.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/find_program.h deleted file mode 100644 index d381e185..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/find_program.h +++ /dev/null @@ -1,103 +0,0 @@ -/** - * @file find_program.h - * @author Ambroz Bizjak - * - * @section LICENSE - * - * 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 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE 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. - * - * @section DESCRIPTION - * - * Function that finds the absolute path of a program by checking a predefined - * list of directories. - */ - -#ifndef BADVPN_FIND_PROGRAM_H -#define BADVPN_FIND_PROGRAM_H - -#include -#include -#include - -#include -#include -#include - -static char * badvpn_find_program (const char *name); - -static char * badvpn_find_program (const char *name) -{ - ASSERT(name) - - char *path = getenv("PATH"); - if (path) { - while (1) { - size_t i = 0; - while (path[i] != ':' && path[i] != '\0') { - i++; - } - char const *src = path; - size_t src_len = i; - if (src_len == 0) { - src = "."; - src_len = 1; - } - size_t name_len = strlen(name); - char *entry = BAllocSize(bsize_add(bsize_fromsize(src_len), bsize_add(bsize_fromsize(name_len), bsize_fromsize(2)))); - if (!entry) { - goto fail; - } - memcpy(entry, src, src_len); - entry[src_len] = '/'; - strcpy(entry + (src_len + 1), name); - if (access(entry, X_OK) == 0) { - return entry; - } - free(entry); - if (path[i] == '\0') { - break; - } - path += i + 1; - } - } - - const char *dirs[] = {"/usr/sbin", "/usr/bin", "/sbin", "/bin", NULL}; - - for (size_t i = 0; dirs[i]; i++) { - char *try_path = concat_strings(3, dirs[i], "/", name); - if (!try_path) { - goto fail; - } - - if (access(try_path, X_OK) == 0) { - return try_path; - } - - free(try_path); - } - -fail: - return NULL; -} - -#endif diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/get_iface_info.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/get_iface_info.h deleted file mode 100644 index 190741b3..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/get_iface_info.h +++ /dev/null @@ -1,110 +0,0 @@ -/** - * @file get_iface_info.h - * @author Ambroz Bizjak - * - * @section LICENSE - * - * 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 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE 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. - */ - -#ifndef BADVPN_GETIFACEINFO_H -#define BADVPN_GETIFACEINFO_H - -#include -#include -#include -#include -#include -#include -#include -#include - -#include - -/** - * Returns information about a network interface with the given name. - * - * @param ifname name of interface to get information for - * @param out_mac the MAC address will be returned here, unless NULL - * @param out_mtu the MTU will be returned here, unless NULL - * @param out_ifindex the interface index will be returned here, unless NULL - * @return 1 on success, 0 on failure - */ -static int badvpn_get_iface_info (const char *ifname, uint8_t *out_mac, int *out_mtu, int *out_ifindex) WARN_UNUSED; - - -static int badvpn_get_iface_info (const char *ifname, uint8_t *out_mac, int *out_mtu, int *out_ifindex) -{ - ASSERT(ifname) - - struct ifreq ifr; - - int s = socket(AF_INET, SOCK_DGRAM, 0); - if (s < 0) { - goto fail0; - } - - // get MAC - if (out_mac) { - memset(&ifr, 0, sizeof(ifr)); - snprintf(ifr.ifr_name, sizeof(ifr.ifr_name), "%s", ifname); - if (ioctl(s, SIOCGIFHWADDR, &ifr)) { - goto fail1; - } - if (ifr.ifr_hwaddr.sa_family != ARPHRD_ETHER) { - goto fail1; - } - memcpy(out_mac, ifr.ifr_hwaddr.sa_data, 6); - } - - // get MTU - if (out_mtu) { - memset(&ifr, 0, sizeof(ifr)); - snprintf(ifr.ifr_name, sizeof(ifr.ifr_name), "%s", ifname); - if (ioctl(s, SIOCGIFMTU, &ifr)) { - goto fail1; - } - *out_mtu = ifr.ifr_mtu; - } - - // get interface index - if (out_ifindex) { - memset(&ifr, 0, sizeof(ifr)); - snprintf(ifr.ifr_name, sizeof(ifr.ifr_name), "%s", ifname); - if (ioctl(s, SIOCGIFINDEX, &ifr)) { - goto fail1; - } - *out_ifindex = ifr.ifr_ifindex; - } - - close(s); - - return 1; - -fail1: - close(s); -fail0: - return 0; -} - -#endif diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/grow_array.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/grow_array.h deleted file mode 100644 index 9a42d04c..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/grow_array.h +++ /dev/null @@ -1,139 +0,0 @@ -/** - * @file grow_array.h - * @author Ambroz Bizjak - * - * @section LICENSE - * - * 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 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE 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. - */ - -// Preprocessor inputs: -// GROWARRAY_NAME - prefix of of functions to define -// GROWARRAY_OBJECT_TYPE - type of structure where array and capacity sizes are -// GROWARRAY_ARRAY_MEMBER - array member -// GROWARRAY_CAPACITY_MEMBER - capacity member -// GROWARRAY_MAX_CAPACITY - max value of capacity member - -#include -#include -#include - -#include -#include -#include - -#define GrowArrayObject GROWARRAY_OBJECT_TYPE -#define GrowArray_Init MERGE(GROWARRAY_NAME, _Init) -#define GrowArray_InitEmpty MERGE(GROWARRAY_NAME, _InitEmpty) -#define GrowArray_Free MERGE(GROWARRAY_NAME, _Free) -#define GrowArray_DoubleUp MERGE(GROWARRAY_NAME, _DoubleUp) -#define GrowArray_DoubleUpLimit MERGE(GROWARRAY_NAME, _DoubleUpLimit) - -static int GrowArray_Init (GrowArrayObject *o, size_t capacity) WARN_UNUSED; -static void GrowArray_InitEmpty (GrowArrayObject *o); -static void GrowArray_Free (GrowArrayObject *o); -static int GrowArray_DoubleUp (GrowArrayObject *o) WARN_UNUSED; -static int GrowArray_DoubleUpLimit (GrowArrayObject *o, size_t limit) WARN_UNUSED; - -static int GrowArray_Init (GrowArrayObject *o, size_t capacity) -{ - if (capacity > GROWARRAY_MAX_CAPACITY) { - return 0; - } - - if (capacity == 0) { - o->GROWARRAY_ARRAY_MEMBER = NULL; - } else { - if (!(o->GROWARRAY_ARRAY_MEMBER = BAllocArray(capacity, sizeof(o->GROWARRAY_ARRAY_MEMBER[0])))) { - return 0; - } - } - - o->GROWARRAY_CAPACITY_MEMBER = capacity; - - return 1; -} - -static void GrowArray_InitEmpty (GrowArrayObject *o) -{ - o->GROWARRAY_ARRAY_MEMBER = NULL; - o->GROWARRAY_CAPACITY_MEMBER = 0; -} - -static void GrowArray_Free (GrowArrayObject *o) -{ - if (o->GROWARRAY_ARRAY_MEMBER) { - BFree(o->GROWARRAY_ARRAY_MEMBER); - } -} - -static int GrowArray_DoubleUp (GrowArrayObject *o) -{ - return GrowArray_DoubleUpLimit(o, SIZE_MAX); -} - -static int GrowArray_DoubleUpLimit (GrowArrayObject *o, size_t limit) -{ - if (o->GROWARRAY_CAPACITY_MEMBER > SIZE_MAX / 2 || o->GROWARRAY_CAPACITY_MEMBER > GROWARRAY_MAX_CAPACITY / 2) { - return 0; - } - - size_t newcap = 2 * o->GROWARRAY_CAPACITY_MEMBER; - if (newcap == 0) { - newcap = 1; - } - - if (newcap > limit) { - newcap = limit; - if (newcap == o->GROWARRAY_CAPACITY_MEMBER) { - return 0; - } - } - - void *newarr = BAllocArray(newcap, sizeof(o->GROWARRAY_ARRAY_MEMBER[0])); - if (!newarr) { - return 0; - } - - memcpy(newarr, o->GROWARRAY_ARRAY_MEMBER, o->GROWARRAY_CAPACITY_MEMBER * sizeof(o->GROWARRAY_ARRAY_MEMBER[0])); - - BFree(o->GROWARRAY_ARRAY_MEMBER); - - o->GROWARRAY_ARRAY_MEMBER = newarr; - o->GROWARRAY_CAPACITY_MEMBER = newcap; - - return 1; -} - -#undef GROWARRAY_NAME -#undef GROWARRAY_OBJECT_TYPE -#undef GROWARRAY_ARRAY_MEMBER -#undef GROWARRAY_CAPACITY_MEMBER -#undef GROWARRAY_MAX_CAPACITY - -#undef GrowArrayObject -#undef GrowArray_Init -#undef GrowArray_InitEmpty -#undef GrowArray_Free -#undef GrowArray_DoubleUp -#undef GrowArray_DoubleUpLimit diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/hashfun.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/hashfun.h deleted file mode 100644 index 5e8956ab..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/hashfun.h +++ /dev/null @@ -1,60 +0,0 @@ -/** - * @file hashfun.h - * @author Ambroz Bizjak - * - * @section LICENSE - * - * 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 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE 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. - */ - -#ifndef BADVPN_HASHFUN_H -#define BADVPN_HASHFUN_H - -#include -#include - -static size_t badvpn_djb2_hash (const uint8_t *str) -{ - size_t hash = 5381; - int c; - - while (c = *str++) { - hash = ((hash << 5) + hash) + c; - } - - return hash; -} - -static size_t badvpn_djb2_hash_bin (const uint8_t *str, size_t str_len) -{ - size_t hash = 5381; - - while (str_len-- > 0) { - int c = *str++; - hash = ((hash << 5) + hash) + c; - } - - return hash; -} - -#endif diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/igmp_proto.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/igmp_proto.h deleted file mode 100644 index 9188ea02..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/igmp_proto.h +++ /dev/null @@ -1,97 +0,0 @@ -/** - * @file igmp_proto.h - * @author Ambroz Bizjak - * - * @section LICENSE - * - * 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 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE 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. - * - * @section DESCRIPTION - * - * Definitions for the IGMP protocol. - */ - -#ifndef BADVPN_MISC_IGMP_PROTO_H -#define BADVPN_MISC_IGMP_PROTO_H - -#include - -#include - -#define IGMP_TYPE_MEMBERSHIP_QUERY 0x11 -#define IGMP_TYPE_V1_MEMBERSHIP_REPORT 0x12 -#define IGMP_TYPE_V2_MEMBERSHIP_REPORT 0x16 -#define IGMP_TYPE_V3_MEMBERSHIP_REPORT 0x22 -#define IGMP_TYPE_V2_LEAVE_GROUP 0x17 - -#define IGMP_RECORD_TYPE_MODE_IS_INCLUDE 1 -#define IGMP_RECORD_TYPE_MODE_IS_EXCLUDE 2 -#define IGMP_RECORD_TYPE_CHANGE_TO_INCLUDE_MODE 3 -#define IGMP_RECORD_TYPE_CHANGE_TO_EXCLUDE_MODE 4 - -B_START_PACKED -struct igmp_source { - uint32_t addr; -} B_PACKED; -B_END_PACKED - -B_START_PACKED -struct igmp_base { - uint8_t type; - uint8_t max_resp_code; - uint16_t checksum; -} B_PACKED; -B_END_PACKED - -B_START_PACKED -struct igmp_v3_query_extra { - uint32_t group; - uint8_t reserved4_suppress1_qrv3; - uint8_t qqic; - uint16_t number_of_sources; -} B_PACKED; -B_END_PACKED - -B_START_PACKED -struct igmp_v3_report_extra { - uint16_t reserved; - uint16_t number_of_group_records; -} B_PACKED; -B_END_PACKED - -B_START_PACKED -struct igmp_v3_report_record { - uint8_t type; - uint8_t aux_data_len; - uint16_t number_of_sources; - uint32_t group; -} B_PACKED; -B_END_PACKED - -B_START_PACKED -struct igmp_v2_extra { - uint32_t group; -} B_PACKED; -B_END_PACKED - -#endif diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/ipaddr.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/ipaddr.h deleted file mode 100644 index 6de58522..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/ipaddr.h +++ /dev/null @@ -1,201 +0,0 @@ -/** - * @file ipaddr.h - * @author Ambroz Bizjak - * - * @section LICENSE - * - * 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 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE 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. - * - * @section DESCRIPTION - * - * IP address parsing functions. - */ - -#ifndef BADVPN_MISC_IPADDR_H -#define BADVPN_MISC_IPADDR_H - -#include -#include - -#include -#include -#include -#include -#include -#include - -struct ipv4_ifaddr { - uint32_t addr; - int prefix; -}; - -static int ipaddr_parse_ipv4_addr (MemRef name, uint32_t *out_addr); -static int ipaddr_parse_ipv4_prefix (MemRef str, int *num); -static int ipaddr_parse_ipv4_ifaddr (MemRef str, struct ipv4_ifaddr *out); -static int ipaddr_ipv4_ifaddr_from_addr_mask (uint32_t addr, uint32_t mask, struct ipv4_ifaddr *out); -static uint32_t ipaddr_ipv4_mask_from_prefix (int prefix); -static int ipaddr_ipv4_prefix_from_mask (uint32_t mask, int *out_prefix); -static int ipaddr_ipv4_addrs_in_network (uint32_t addr1, uint32_t addr2, int netprefix); - -#define IPADDR_PRINT_MAX 19 - -static void ipaddr_print_addr (uint32_t addr, char *out); -static void ipaddr_print_ifaddr (struct ipv4_ifaddr ifaddr, char *out); - -int ipaddr_parse_ipv4_addr (MemRef name, uint32_t *out_addr) -{ - for (size_t i = 0; ; i++) { - size_t j; - for (j = 0; j < name.len && name.ptr[j] != '.'; j++); - - if ((j == name.len && i < 3) || (j < name.len && i == 3)) { - return 0; - } - - if (j < 1 || j > 3) { - return 0; - } - - uintmax_t d; - if (!parse_unsigned_integer(MemRef_SubTo(name, j), &d)) { - return 0; - } - - if (d > 255) { - return 0; - } - - ((uint8_t *)out_addr)[i] = d; - - if (i == 3) { - return 1; - } - - name.ptr += j + 1; - name.len -= j + 1; - } -} - -int ipaddr_parse_ipv4_prefix (MemRef str, int *num) -{ - uintmax_t d; - if (!parse_unsigned_integer(str, &d)) { - return 0; - } - if (d > 32) { - return 0; - } - - *num = d; - return 1; -} - -int ipaddr_parse_ipv4_ifaddr (MemRef str, struct ipv4_ifaddr *out) -{ - size_t slash_pos; - if (!MemRef_FindChar(str, '/', &slash_pos)) { - return 0; - } - - return (ipaddr_parse_ipv4_addr(MemRef_SubTo(str, slash_pos), &out->addr) && - ipaddr_parse_ipv4_prefix(MemRef_SubFrom(str, slash_pos + 1), &out->prefix)); -} - -int ipaddr_ipv4_ifaddr_from_addr_mask (uint32_t addr, uint32_t mask, struct ipv4_ifaddr *out) -{ - int prefix; - if (!ipaddr_ipv4_prefix_from_mask(mask, &prefix)) { - return 0; - } - - out->addr = addr; - out->prefix = prefix; - return 1; -} - -uint32_t ipaddr_ipv4_mask_from_prefix (int prefix) -{ - ASSERT(prefix >= 0) - ASSERT(prefix <= 32) - - uint32_t t = 0; - for (int i = 0; i < prefix; i++) { - t |= 1 << (32 - i - 1); - } - - return hton32(t); -} - -int ipaddr_ipv4_prefix_from_mask (uint32_t mask, int *out_prefix) -{ - uint32_t t = 0; - int i; - for (i = 0; i <= 32; i++) { - if (ntoh32(mask) == t) { - break; - } - if (i < 32) { - t |= (1 << (32 - i - 1)); - } - } - if (!(i <= 32)) { - return 0; - } - - *out_prefix = i; - return 1; -} - -int ipaddr_ipv4_addrs_in_network (uint32_t addr1, uint32_t addr2, int netprefix) -{ - ASSERT(netprefix >= 0) - ASSERT(netprefix <= 32) - - uint32_t mask = ipaddr_ipv4_mask_from_prefix(netprefix); - - return !!((addr1 & mask) == (addr2 & mask)); -} - -void ipaddr_print_addr (uint32_t addr, char *out) -{ - ASSERT(out) - - uint8_t *b = (uint8_t *)&addr; - - sprintf(out, "%"PRIu8".%"PRIu8".%"PRIu8".%"PRIu8, - b[0], b[1], b[2], b[3]); -} - -void ipaddr_print_ifaddr (struct ipv4_ifaddr ifaddr, char *out) -{ - ASSERT(ifaddr.prefix >= 0) - ASSERT(ifaddr.prefix <= 32) - ASSERT(out) - - uint8_t *b = (uint8_t *)&ifaddr.addr; - - sprintf(out, "%"PRIu8".%"PRIu8".%"PRIu8".%"PRIu8"/%d", - b[0], b[1], b[2], b[3], ifaddr.prefix); -} - -#endif diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/ipaddr6.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/ipaddr6.h deleted file mode 100644 index 5befd790..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/ipaddr6.h +++ /dev/null @@ -1,383 +0,0 @@ -/** - * @file ipaddr6.h - * @author Ambroz Bizjak - * - * @section LICENSE - * - * 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 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE 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. - * - * @section DESCRIPTION - * - * IPv6 address parsing functions. - */ - -#ifndef BADVPN_MISC_IPADDR6_H -#define BADVPN_MISC_IPADDR6_H - -#include -#include -#include -#include - -#include "misc/debug.h" -#include "misc/byteorder.h" -#include "misc/parse_number.h" -#include "misc/find_char.h" -#include "misc/print_macros.h" -#include "misc/memref.h" - -struct ipv6_addr { - uint8_t bytes[16]; -}; - -struct ipv6_ifaddr { - struct ipv6_addr addr; - int prefix; -}; - -static int ipaddr6_parse_ipv6_addr (MemRef name, struct ipv6_addr *out_addr); -static int ipaddr6_parse_ipv6_prefix (MemRef str, int *out_num); -static int ipaddr6_parse_ipv6_ifaddr (MemRef str, struct ipv6_ifaddr *out); -static int ipaddr6_ipv6_ifaddr_from_addr_mask (struct ipv6_addr addr, struct ipv6_addr mask, struct ipv6_ifaddr *out); -static void ipaddr6_ipv6_mask_from_prefix (int prefix, struct ipv6_addr *out_mask); -static int ipaddr6_ipv6_prefix_from_mask (struct ipv6_addr mask, int *out_prefix); -static int ipaddr6_ipv6_addrs_in_network (struct ipv6_addr addr1, struct ipv6_addr addr2, int netprefix); - -#define IPADDR6_PRINT_MAX 44 - -static void ipaddr6_print_addr (struct ipv6_addr addr, char *out_buf); -static void ipaddr6_print_ifaddr (struct ipv6_ifaddr addr, char *out_buf); - -int ipaddr6_parse_ipv6_addr (MemRef name, struct ipv6_addr *out_addr) -{ - int num_blocks = 0; - int compress_pos = -1; - uint16_t block = 0; - int empty = 1; - - size_t i = 0; - - while (i < name.len) { - if (name.ptr[i] == '.') { - goto ipv4_ending; - } else if (name.ptr[i] == ':') { - int is_double = (i + 1 < name.len && name.ptr[i + 1] == ':'); - - if (i > 0) { - if (empty || num_blocks == 7) { - return 0; - } - out_addr->bytes[2 * num_blocks + 0] = block >> 8; - out_addr->bytes[2 * num_blocks + 1] = block & 0xFF; - num_blocks++; - block = 0; - empty = 1; - } - else if (!is_double) { - return 0; - } - - if (is_double) { - if (compress_pos != -1) { - return 0; - } - compress_pos = num_blocks; - } - - i += 1 + is_double; - } else { - int digit = decode_hex_digit(name.ptr[i]); - if (digit < 0) { - return 0; - } - if (block > UINT16_MAX / 16) { - return 0; - } - block *= 16; - if (digit > UINT16_MAX - block) { - return 0; - } - block += digit; - empty = 0; - i += 1; - } - } - - if (!empty) { - out_addr->bytes[2 * num_blocks + 0] = block >> 8; - out_addr->bytes[2 * num_blocks + 1] = block & 0xFF; - num_blocks++; - } - else if (num_blocks != compress_pos) { - return 0; - } - -ipv4_done: - if (compress_pos == -1) { - if (num_blocks != 8) { - return 0; - } - compress_pos = 0; - } - - int num_rear = num_blocks - compress_pos; - memmove(out_addr->bytes + 2 * (8 - num_rear), out_addr->bytes + 2 * compress_pos, 2 * num_rear); - memset(out_addr->bytes + 2 * compress_pos, 0, 2 * (8 - num_rear - compress_pos)); - - return 1; - -ipv4_ending: - if (empty || (num_blocks == 0 && compress_pos == -1)) { - return 0; - } - - while (name.ptr[i - 1] != ':') { - i--; - } - - uint8_t bytes[4]; - int cur_byte = 0; - uint8_t byte = 0; - empty = 1; - - while (i < name.len) { - if (name.ptr[i] == '.') { - if (empty || cur_byte == 3) { - return 0; - } - bytes[cur_byte] = byte; - cur_byte++; - byte = 0; - empty = 1; - } else { - if (!empty && byte == 0) { - return 0; - } - int digit = decode_decimal_digit(name.ptr[i]); - if (digit < 0) { - return 0; - } - if (byte > UINT8_MAX / 10) { - return 0; - } - byte *= 10; - if (digit > UINT8_MAX - byte) { - return 0; - } - byte += digit; - empty = 0; - } - i++; - } - - if (cur_byte != 3 || empty) { - return 0; - } - bytes[cur_byte] = byte; - - if (8 - num_blocks < 2) { - return 0; - } - memcpy(out_addr->bytes + 2 * num_blocks, bytes, 4); - num_blocks += 2; - - goto ipv4_done; -} - -int ipaddr6_parse_ipv6_prefix (MemRef str, int *out_num) -{ - uintmax_t d; - if (!parse_unsigned_integer(str, &d)) { - return 0; - } - if (d > 128) { - return 0; - } - - *out_num = d; - return 1; -} - -int ipaddr6_parse_ipv6_ifaddr (MemRef str, struct ipv6_ifaddr *out) -{ - size_t slash_pos; - if (!MemRef_FindChar(str, '/', &slash_pos)) { - return 0; - } - - return (ipaddr6_parse_ipv6_addr(MemRef_SubTo(str, slash_pos), &out->addr) && - ipaddr6_parse_ipv6_prefix(MemRef_SubFrom(str, slash_pos + 1), &out->prefix)); -} - -int ipaddr6_ipv6_ifaddr_from_addr_mask (struct ipv6_addr addr, struct ipv6_addr mask, struct ipv6_ifaddr *out) -{ - int prefix; - if (!ipaddr6_ipv6_prefix_from_mask(mask, &prefix)) { - return 0; - } - - out->addr = addr; - out->prefix = prefix; - return 1; -} - -void ipaddr6_ipv6_mask_from_prefix (int prefix, struct ipv6_addr *out_mask) -{ - ASSERT(prefix >= 0) - ASSERT(prefix <= 128) - - int quot = prefix / 8; - int rem = prefix % 8; - - if (quot > 0) { - memset(out_mask->bytes, UINT8_MAX, quot); - } - if (16 - quot > 0) { - memset(out_mask->bytes + quot, 0, 16 - quot); - } - - for (int i = 0; i < rem; i++) { - out_mask->bytes[quot] |= (uint8_t)1 << (8 - i - 1); - } -} - -int ipaddr6_ipv6_prefix_from_mask (struct ipv6_addr mask, int *out_prefix) -{ - int prefix = 0; - int i = 0; - - while (i < 16 && mask.bytes[i] == UINT8_MAX) { - prefix += 8; - i++; - } - - if (i < 16) { - uint8_t t = 0; - int j; - for (j = 0; j <= 8; j++) { - if (mask.bytes[i] == t) { - break; - } - if (j < 8) { - t |= ((uint8_t)1 << (8 - j - 1)); - } - } - if (!(j <= 8)) { - return 0; - } - - prefix += j; - i++; - - while (i < 16) { - if (mask.bytes[i] != 0) { - return 0; - } - i++; - } - } - - *out_prefix = prefix; - return 1; -} - -int ipaddr6_ipv6_addrs_in_network (struct ipv6_addr addr1, struct ipv6_addr addr2, int netprefix) -{ - ASSERT(netprefix >= 0) - ASSERT(netprefix <= 128) - - int quot = netprefix / 8; - int rem = netprefix % 8; - - if (memcmp(addr1.bytes, addr2.bytes, quot)) { - return 0; - } - - if (rem == 0) { - return 1; - } - - uint8_t t = 0; - for (int i = 0; i < rem; i++) { - t |= (uint8_t)1 << (8 - i - 1); - } - - return ((addr1.bytes[quot] & t) == (addr2.bytes[quot] & t)); -} - -void ipaddr6_print_addr (struct ipv6_addr addr, char *out_buf) -{ - int largest_start = 0; - int largest_len = 0; - int current_start = 0; - int current_len = 0; - - for (int i = 0; i < 8; i++) { - if (addr.bytes[2 * i] == 0 && addr.bytes[2 * i + 1] == 0) { - current_len++; - if (current_len > largest_len) { - largest_start = current_start; - largest_len = current_len; - } - } else { - current_start = i + 1; - current_len = 0; - } - } - - if (largest_len > 1) { - for (int i = 0; i < largest_start; i++) { - uint16_t block = ((uint16_t)addr.bytes[2 * i] << 8) | addr.bytes[2 * i + 1]; - out_buf += sprintf(out_buf, "%"PRIx16":", block); - } - if (largest_start == 0) { - out_buf += sprintf(out_buf, ":"); - } - - for (int i = largest_start + largest_len; i < 8; i++) { - uint16_t block = ((uint16_t)addr.bytes[2 * i] << 8) | addr.bytes[2 * i + 1]; - out_buf += sprintf(out_buf, ":%"PRIx16, block); - } - if (largest_start + largest_len == 8) { - out_buf += sprintf(out_buf, ":"); - } - } else { - const char *prefix = ""; - for (int i = 0; i < 8; i++) { - uint16_t block = ((uint16_t)addr.bytes[2 * i] << 8) | addr.bytes[2 * i + 1]; - out_buf += sprintf(out_buf, "%s%"PRIx16, prefix, block); - prefix = ":"; - } - } -} - -void ipaddr6_print_ifaddr (struct ipv6_ifaddr addr, char *out_buf) -{ - ASSERT(addr.prefix >= 0) - ASSERT(addr.prefix <= 128) - - ipaddr6_print_addr(addr.addr, out_buf); - sprintf(out_buf + strlen(out_buf), "/%d", addr.prefix); -} - -#endif diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/ipv4_proto.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/ipv4_proto.h deleted file mode 100644 index cb10e110..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/ipv4_proto.h +++ /dev/null @@ -1,145 +0,0 @@ -/** - * @file ipv4_proto.h - * @author Ambroz Bizjak - * - * @section LICENSE - * - * 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 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE 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. - * - * @section DESCRIPTION - * - * Definitions for the IPv4 protocol. - */ - -#ifndef BADVPN_MISC_IPV4_PROTO_H -#define BADVPN_MISC_IPV4_PROTO_H - -#include -#include - -#include "misc/debug.h" -#include "misc/byteorder.h" -#include "misc/packed.h" -#include "misc/read_write_int.h" - -#define IPV4_PROTOCOL_IGMP 2 -#define IPV4_PROTOCOL_UDP 17 - -B_START_PACKED -struct ipv4_header { - uint8_t version4_ihl4; - uint8_t ds; - uint16_t total_length; - // - uint16_t identification; - uint16_t flags3_fragmentoffset13; - // - uint8_t ttl; - uint8_t protocol; - uint16_t checksum; - // - uint32_t source_address; - // - uint32_t destination_address; -} B_PACKED; -B_END_PACKED - -#define IPV4_GET_VERSION(_header) (((_header).version4_ihl4&0xF0)>>4) -#define IPV4_GET_IHL(_header) (((_header).version4_ihl4&0x0F)>>0) - -#define IPV4_MAKE_VERSION_IHL(size) (((size)/4) + (4 << 4)) - -static uint16_t ipv4_checksum (const struct ipv4_header *header, const char *extra, uint16_t extra_len) -{ - ASSERT(extra_len % 2 == 0) - ASSERT(extra_len == 0 || extra) - - uint32_t t = 0; - - for (uint16_t i = 0; i < sizeof(*header) / 2; i++) { - t += badvpn_read_be16((const char *)header + 2 * i); - } - - for (uint16_t i = 0; i < extra_len / 2; i++) { - t += badvpn_read_be16((const char *)extra + 2 * i); - } - - while (t >> 16) { - t = (t & 0xFFFF) + (t >> 16); - } - - return hton16(~t); -} - -static int ipv4_check (uint8_t *data, int data_len, struct ipv4_header *out_header, uint8_t **out_payload, int *out_payload_len) -{ - ASSERT(data_len >= 0) - ASSERT(out_header) - ASSERT(out_payload) - ASSERT(out_payload_len) - - // check base header - if (data_len < sizeof(struct ipv4_header)) { - return 0; - } - memcpy(out_header, data, sizeof(*out_header)); - - // check version - if (IPV4_GET_VERSION(*out_header) != 4) { - return 0; - } - - // check options - uint16_t header_len = IPV4_GET_IHL(*out_header) * 4; - if (header_len < sizeof(struct ipv4_header)) { - return 0; - } - if (header_len > data_len) { - return 0; - } - - // check total length - uint16_t total_length = ntoh16(out_header->total_length); - if (total_length < header_len) { - return 0; - } - if (total_length > data_len) { - return 0; - } - - // check checksum - uint16_t checksum_in_packet = out_header->checksum; - out_header->checksum = hton16(0); - uint16_t checksum_computed = ipv4_checksum(out_header, (char *)data + sizeof(*out_header), header_len - sizeof(*out_header)); - out_header->checksum = checksum_in_packet; - if (checksum_in_packet != checksum_computed) { - return 0; - } - - *out_payload = data + header_len; - *out_payload_len = total_length - header_len; - - return 1; -} - -#endif diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/ipv6_proto.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/ipv6_proto.h deleted file mode 100644 index d681ea4f..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/ipv6_proto.h +++ /dev/null @@ -1,86 +0,0 @@ -/** - * @file ipv6_proto.h - * @author Ambroz Bizjak - * - * @section LICENSE - * - * 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 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE 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. - */ - -#ifndef BADVPN_IPV6_PROTO_H -#define BADVPN_IPV6_PROTO_H - -#include -#include - -#include "misc/debug.h" -#include "misc/byteorder.h" -#include "misc/packed.h" - -#define IPV6_NEXT_IGMP 2 -#define IPV6_NEXT_UDP 17 - -B_START_PACKED -struct ipv6_header { - uint8_t version4_tc4; - uint8_t tc4_fl4; - uint16_t fl; - uint16_t payload_length; - uint8_t next_header; - uint8_t hop_limit; - uint8_t source_address[16]; - uint8_t destination_address[16]; -} B_PACKED; -B_END_PACKED - -static int ipv6_check (uint8_t *data, int data_len, struct ipv6_header *out_header, uint8_t **out_payload, int *out_payload_len) -{ - ASSERT(data_len >= 0) - ASSERT(out_header) - ASSERT(out_payload) - ASSERT(out_payload_len) - - // check base header - if (data_len < sizeof(struct ipv6_header)) { - return 0; - } - memcpy(out_header, data, sizeof(*out_header)); - - // check version - if ((ntoh8(out_header->version4_tc4) >> 4) != 6) { - return 0; - } - - // check payload length - uint16_t payload_length = ntoh16(out_header->payload_length); - if (payload_length > data_len - sizeof(struct ipv6_header)) { - return 0; - } - - *out_payload = data + sizeof(struct ipv6_header); - *out_payload_len = payload_length; - - return 1; -} - -#endif diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/loggers_string.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/loggers_string.h deleted file mode 100644 index 66986b84..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/loggers_string.h +++ /dev/null @@ -1,43 +0,0 @@ -/** - * @file loggers_string.h - * @author Ambroz Bizjak - * - * @section LICENSE - * - * 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 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE 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. - * - * @section DESCRIPTION - * - * List of available loggers. - */ - -#ifndef BADVPN_MISC_LOGGERSSTRING_H -#define BADVPN_MISC_LOGGERSSTRING_H - -#ifdef BADVPN_USE_WINAPI -#define LOGGERS_STRING "stdout" -#else -#define LOGGERS_STRING "stdout/syslog" -#endif - -#endif diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/loglevel.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/loglevel.h deleted file mode 100644 index afe6a766..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/loglevel.h +++ /dev/null @@ -1,80 +0,0 @@ -/** - * @file loglevel.h - * @author Ambroz Bizjak - * - * @section LICENSE - * - * 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 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE 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. - * - * @section DESCRIPTION - * - * Log level specification parsing function. - */ - -#ifndef BADVPN_MISC_LOGLEVEL_H -#define BADVPN_MISC_LOGLEVEL_H - -#include - -#include "base/BLog.h" - -/** - * Parses the log level string. - * - * @param str log level string. Recognizes none, error, warning, notice, - * info, debug. - * @return 0 for none, one of BLOG_* for some log level, -1 for unrecognized - */ -static int parse_loglevel (char *str); - -int parse_loglevel (char *str) -{ - if (!strcmp(str, "none")) { - return 0; - } - if (!strcmp(str, "error")) { - return BLOG_ERROR; - } - if (!strcmp(str, "warning")) { - return BLOG_WARNING; - } - if (!strcmp(str, "notice")) { - return BLOG_NOTICE; - } - if (!strcmp(str, "info")) { - return BLOG_INFO; - } - if (!strcmp(str, "debug")) { - return BLOG_DEBUG; - } - - char *endptr; - long int res = strtol(str, &endptr, 10); - if (*str && !*endptr && res >= 0 && res <= BLOG_DEBUG) { - return res; - } - - return -1; -} - -#endif diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/maxalign.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/maxalign.h deleted file mode 100644 index cb1f4605..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/maxalign.h +++ /dev/null @@ -1,53 +0,0 @@ -/** - * @file maxalign.h - * @author Ambroz Bizjak - * - * @section LICENSE - * - * 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 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE 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. - */ - -#ifndef BADVPN_MAXALIGN_H -#define BADVPN_MAXALIGN_H - -#include -#include - -typedef union { - short a; - long b; - long long c; - double d; - long double e; - void *f; - uint8_t g; - uint16_t h; - uint32_t i; - uint64_t j; - size_t k; - void (*l) (void); -} bmax_align_t; - -#define BMAX_ALIGN (__alignof(bmax_align_t)) - -#endif diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/memref.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/memref.h deleted file mode 100644 index 1003b3c3..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/memref.h +++ /dev/null @@ -1,175 +0,0 @@ -/** - * @file memref.h - * @author Ambroz Bizjak - * - * @section LICENSE - * - * 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 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE 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. - */ - -#ifndef BADVPN_MEMREF_H -#define BADVPN_MEMREF_H - -#include -#include -#include - -#include "misc/debug.h" -#include "misc/balloc.h" -#include "misc/strdup.h" - -typedef struct { - char const *ptr; - size_t len; -} MemRef; - -static MemRef MemRef_Make (char const *ptr, size_t len); -static MemRef MemRef_MakeCstr (char const *ptr); -static char MemRef_At (MemRef o, size_t pos); -static void MemRef_AssertRange (MemRef o, size_t offset, size_t length); -static MemRef MemRef_SubFrom (MemRef o, size_t offset); -static MemRef MemRef_SubTo (MemRef o, size_t length); -static MemRef MemRef_Sub (MemRef o, size_t offset, size_t length); -static char * MemRef_StrDup (MemRef o); -static void MemRef_CopyOut (MemRef o, char *out); -static int MemRef_Equal (MemRef o, MemRef other); -static int MemRef_FindChar (MemRef o, char ch, size_t *out_index); - -#define MEMREF_LOOP_CHARS__BODY(char_rel_pos_var, char_var, body) \ -{ \ - for (size_t char_rel_pos_var = 0; char_rel_pos_var < MemRef__Loop_length; char_rel_pos_var++) { \ - char char_var = MemRef__Loop_o.ptr[MemRef__Loop_offset + char_rel_pos_var]; \ - { body } \ - } \ -} - -#define MEMREF_LOOP_CHARS_RANGE(o, offset, length, char_rel_pos_var, char_var, body) \ -{ \ - MemRef MemRef__Loop_o = (o); \ - size_t MemRef__Loop_offset = (offset); \ - size_t MemRef__Loop_length = (length); \ - MEMREF_LOOP_CHARS__BODY(char_rel_pos_var, char_var, body) \ -} - -#define MEMREF_LOOP_CHARS(o, char_rel_pos_var, char_var, body) \ -{ \ - MemRef MemRef__Loop_o = (o); \ - size_t MemRef__Loop_offset = 0; \ - size_t MemRef__Loop_length = MemRef__Loop_o.len; \ - MEMREF_LOOP_CHARS__BODY(char_rel_pos_var, char_var, body) \ -} - -// - -static MemRef MemRef_Make (char const *ptr, size_t len) -{ - MemRef res; - res.ptr = ptr; - res.len = len; - return res; -} - -static MemRef MemRef_MakeCstr (char const *ptr) -{ - ASSERT(ptr) - - return MemRef_Make(ptr, strlen(ptr)); -} - -static char MemRef_At (MemRef o, size_t pos) -{ - ASSERT(o.ptr) - ASSERT(pos < o.len) - - return o.ptr[pos]; -} - -static void MemRef_AssertRange (MemRef o, size_t offset, size_t length) -{ - ASSERT(offset <= o.len) - ASSERT(length <= o.len - offset) -} - -static MemRef MemRef_SubFrom (MemRef o, size_t offset) -{ - ASSERT(o.ptr) - ASSERT(offset <= o.len) - - return MemRef_Make(o.ptr + offset, o.len - offset); -} - -static MemRef MemRef_SubTo (MemRef o, size_t length) -{ - ASSERT(o.ptr) - ASSERT(length <= o.len) - - return MemRef_Make(o.ptr, length); -} - -static MemRef MemRef_Sub (MemRef o, size_t offset, size_t length) -{ - ASSERT(o.ptr) - MemRef_AssertRange(o, offset, length); - - return MemRef_Make(o.ptr + offset, length); -} - -static char * MemRef_StrDup (MemRef o) -{ - ASSERT(o.ptr) - - return b_strdup_bin(o.ptr, o.len); -} - -static void MemRef_CopyOut (MemRef o, char *out) -{ - ASSERT(o.ptr) - ASSERT(out) - - memcpy(out, o.ptr, o.len); -} - -static int MemRef_Equal (MemRef o, MemRef other) -{ - ASSERT(o.ptr) - ASSERT(other.ptr) - - return (o.len == other.len) && !memcmp(o.ptr, other.ptr, o.len); -} - -static int MemRef_FindChar (MemRef o, char ch, size_t *out_index) -{ - ASSERT(o.ptr) - - for (size_t i = 0; i < o.len; i++) { - if (o.ptr[i] == ch) { - if (out_index) { - *out_index = i; - } - return 1; - } - } - return 0; -} - -#endif diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/merge.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/merge.h deleted file mode 100644 index 53227712..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/merge.h +++ /dev/null @@ -1,36 +0,0 @@ -/** - * @file merge.h - * @author Ambroz Bizjak - * - * @section LICENSE - * - * 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 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE 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. - */ - -#ifndef BADVPN_MERGE_H -#define BADVPN_MERGE_H - -#define MERGE_HELPER(x, y) x ## y -#define MERGE(x, y) MERGE_HELPER(x, y) - -#endif diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/minmax.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/minmax.h deleted file mode 100644 index ca82055e..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/minmax.h +++ /dev/null @@ -1,56 +0,0 @@ -/** - * @file minmax.h - * @author Ambroz Bizjak - * - * @section LICENSE - * - * 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 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE 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. - * - * @section DESCRIPTION - * - * Minimum and maximum macros. - */ - -#ifndef BADVPN_MISC_MINMAX_H -#define BADVPN_MISC_MINMAX_H - -#include -#include - -#define DEFINE_BMINMAX(name, type) \ -static type bmin ## name (type a, type b) { return (a < b ? a : b); } \ -static type bmax ## name (type a, type b) { return (a > b ? a : b); } - -DEFINE_BMINMAX(_size, size_t) -DEFINE_BMINMAX(_int, int) -DEFINE_BMINMAX(_int8, int8_t) -DEFINE_BMINMAX(_int16, int16_t) -DEFINE_BMINMAX(_int32, int32_t) -DEFINE_BMINMAX(_int64, int64_t) -DEFINE_BMINMAX(_uint, unsigned int) -DEFINE_BMINMAX(_uint8, uint8_t) -DEFINE_BMINMAX(_uint16, uint16_t) -DEFINE_BMINMAX(_uint32, uint32_t) -DEFINE_BMINMAX(_uint64, uint64_t) - -#endif diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/modadd.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/modadd.h deleted file mode 100644 index 4e4f04ad..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/modadd.h +++ /dev/null @@ -1,59 +0,0 @@ -/** - * @file modadd.h - * @author Ambroz Bizjak - * - * @section LICENSE - * - * 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 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE 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. - * - * @section DESCRIPTION - * - * Modular addition macro. - * - * Calculates (x + y) mod m, assuming - * 0 <= x < m and 0 <= y < m. - */ - -#ifndef BADVPN_MISC_MODADD_H -#define BADVPN_MISC_MODADD_H - -#include - -#define DECLARE_BMODADD(type, name) \ -static type bmodadd_##name (type x, type y, type m) \ -{ \ - ASSERT(x >= 0) \ - ASSERT(x < m) \ - ASSERT(y >= 0) \ - ASSERT(y < m) \ - \ - if (y >= m - x) { \ - return (y - (m - x)); \ - } else { \ - return (x + y); \ - } \ -} \ - -DECLARE_BMODADD(int, int) - -#endif diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/mswsock.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/mswsock.h deleted file mode 100644 index 4f4c38df..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/mswsock.h +++ /dev/null @@ -1,229 +0,0 @@ -/** - * This file has no copyright assigned and is placed in the Public Domain. - * This file is part of the w64 mingw-runtime package. - * No warranty is given; refer to the file DISCLAIMER.PD within this package. - */ - -#include - -#ifndef _MSWSOCK_ -#define _MSWSOCK_ - -#ifdef __cplusplus -extern "C" { -#endif - -#define SO_CONNDATA 0x7000 -#define SO_CONNOPT 0x7001 -#define SO_DISCDATA 0x7002 -#define SO_DISCOPT 0x7003 -#define SO_CONNDATALEN 0x7004 -#define SO_CONNOPTLEN 0x7005 -#define SO_DISCDATALEN 0x7006 -#define SO_DISCOPTLEN 0x7007 - -#define SO_OPENTYPE 0x7008 - -#define SO_SYNCHRONOUS_ALERT 0x10 -#define SO_SYNCHRONOUS_NONALERT 0x20 - -#define SO_MAXDG 0x7009 -#define SO_MAXPATHDG 0x700A -#define SO_UPDATE_ACCEPT_CONTEXT 0x700B -#define SO_CONNECT_TIME 0x700C -#define SO_UPDATE_CONNECT_CONTEXT 0x7010 - -#define TCP_BSDURGENT 0x7000 - -#define SIO_UDP_CONNRESET _WSAIOW(IOC_VENDOR,12) -#if (_WIN32_WINNT < 0x0600) && (_WIN32_WINNT >= 0x0501) -#define SIO_SOCKET_CLOSE_NOTIFY _WSAIOW(IOC_VENDOR,13) -#endif /* >= XP && < VISTA */ -#if (_WIN32_WINNT >= 0x0600) -#define SIO_BSP_HANDLE _WSAIOR(IOC_WS2,27) -#define SIO_BSP_HANDLE_SELECT _WSAIOR(IOC_WS2,28) -#define SIO_BSP_HANDLE_POLL _WSAIOR(IOC_WS2,29) - -#define SIO_EXT_SELECT _WSAIORW(IOC_WS2,30) -#define SIO_EXT_POLL _WSAIORW(IOC_WS2,31) -#define SIO_EXT_SENDMSG _WSAIORW(IOC_WS2,32) - -#define SIO_BASE_HANDLE _WSAIOR(IOC_WS2,34) -#endif /* _WIN32_WINNT >= 0x0600 */ - -#ifndef __MSWSOCK_WS1_SHARED - int WINAPI WSARecvEx(SOCKET s,char *buf,int len,int *flags); -#endif /* __MSWSOCK_WS1_SHARED */ - -#define TF_DISCONNECT 0x01 -#define TF_REUSE_SOCKET 0x02 -#define TF_WRITE_BEHIND 0x04 -#define TF_USE_DEFAULT_WORKER 0x00 -#define TF_USE_SYSTEM_THREAD 0x10 -#define TF_USE_KERNEL_APC 0x20 - -#include -#ifndef __MSWSOCK_WS1_SHARED - WINBOOL WINAPI TransmitFile(SOCKET hSocket,HANDLE hFile,DWORD nNumberOfBytesToWrite,DWORD nNumberOfBytesPerSend,LPOVERLAPPED lpOverlapped,LPTRANSMIT_FILE_BUFFERS lpTransmitBuffers,DWORD dwReserved); - WINBOOL WINAPI AcceptEx(SOCKET sListenSocket,SOCKET sAcceptSocket,PVOID lpOutputBuffer,DWORD dwReceiveDataLength,DWORD dwLocalAddressLength,DWORD dwRemoteAddressLength,LPDWORD lpdwBytesReceived,LPOVERLAPPED lpOverlapped); - VOID WINAPI GetAcceptExSockaddrs(PVOID lpOutputBuffer,DWORD dwReceiveDataLength,DWORD dwLocalAddressLength,DWORD dwRemoteAddressLength,struct sockaddr **LocalSockaddr,LPINT LocalSockaddrLength,struct sockaddr **RemoteSockaddr,LPINT RemoteSockaddrLength); -#endif /* __MSWSOCK_WS1_SHARED */ - - typedef WINBOOL (WINAPI *LPFN_TRANSMITFILE)(SOCKET hSocket,HANDLE hFile,DWORD nNumberOfBytesToWrite,DWORD nNumberOfBytesPerSend,LPOVERLAPPED lpOverlapped,LPTRANSMIT_FILE_BUFFERS lpTransmitBuffers,DWORD dwReserved); - -#define WSAID_TRANSMITFILE {0xb5367df0,0xcbac,0x11cf,{0x95,0xca,0x00,0x80,0x5f,0x48,0xa1,0x92}} - - typedef WINBOOL (WINAPI *LPFN_ACCEPTEX)(SOCKET sListenSocket,SOCKET sAcceptSocket,PVOID lpOutputBuffer,DWORD dwReceiveDataLength,DWORD dwLocalAddressLength,DWORD dwRemoteAddressLength,LPDWORD lpdwBytesReceived,LPOVERLAPPED lpOverlapped); - -#define WSAID_ACCEPTEX {0xb5367df1,0xcbac,0x11cf,{0x95,0xca,0x00,0x80,0x5f,0x48,0xa1,0x92}} - - typedef VOID (WINAPI *LPFN_GETACCEPTEXSOCKADDRS)(PVOID lpOutputBuffer,DWORD dwReceiveDataLength,DWORD dwLocalAddressLength,DWORD dwRemoteAddressLength,struct sockaddr **LocalSockaddr,LPINT LocalSockaddrLength,struct sockaddr **RemoteSockaddr,LPINT RemoteSockaddrLength); - -#define WSAID_GETACCEPTEXSOCKADDRS {0xb5367df2,0xcbac,0x11cf,{0x95,0xca,0x00,0x80,0x5f,0x48,0xa1,0x92}} - - typedef struct _TRANSMIT_PACKETS_ELEMENT { - ULONG dwElFlags; -#define TP_ELEMENT_MEMORY 1 -#define TP_ELEMENT_FILE 2 -#define TP_ELEMENT_EOP 4 - ULONG cLength; - __MINGW_EXTENSION union { - __MINGW_EXTENSION struct { - LARGE_INTEGER nFileOffset; - HANDLE hFile; - }; - PVOID pBuffer; - }; - } TRANSMIT_PACKETS_ELEMENT,*PTRANSMIT_PACKETS_ELEMENT,*LPTRANSMIT_PACKETS_ELEMENT; - -#define TP_DISCONNECT TF_DISCONNECT -#define TP_REUSE_SOCKET TF_REUSE_SOCKET -#define TP_USE_DEFAULT_WORKER TF_USE_DEFAULT_WORKER -#define TP_USE_SYSTEM_THREAD TF_USE_SYSTEM_THREAD -#define TP_USE_KERNEL_APC TF_USE_KERNEL_APC - - typedef WINBOOL (WINAPI *LPFN_TRANSMITPACKETS) (SOCKET hSocket,LPTRANSMIT_PACKETS_ELEMENT lpPacketArray,DWORD nElementCount,DWORD nSendSize,LPOVERLAPPED lpOverlapped,DWORD dwFlags); - -#define WSAID_TRANSMITPACKETS {0xd9689da0,0x1f90,0x11d3,{0x99,0x71,0x00,0xc0,0x4f,0x68,0xc8,0x76}} - - typedef WINBOOL (WINAPI *LPFN_CONNECTEX)(SOCKET s,const struct sockaddr *name,int namelen,PVOID lpSendBuffer,DWORD dwSendDataLength,LPDWORD lpdwBytesSent,LPOVERLAPPED lpOverlapped); - -#define WSAID_CONNECTEX {0x25a207b9,0xddf3,0x4660,{0x8e,0xe9,0x76,0xe5,0x8c,0x74,0x06,0x3e}} - - typedef WINBOOL (WINAPI *LPFN_DISCONNECTEX)(SOCKET s,LPOVERLAPPED lpOverlapped,DWORD dwFlags,DWORD dwReserved); - -#define WSAID_DISCONNECTEX {0x7fda2e11,0x8630,0x436f,{0xa0,0x31,0xf5,0x36,0xa6,0xee,0xc1,0x57}} - -#define DE_REUSE_SOCKET TF_REUSE_SOCKET - -#define NLA_NAMESPACE_GUID {0x6642243a,0x3ba8,0x4aa6,{0xba,0xa5,0x2e,0xb,0xd7,0x1f,0xdd,0x83}} - -#define NLA_SERVICE_CLASS_GUID {0x37e515,0xb5c9,0x4a43,{0xba,0xda,0x8b,0x48,0xa8,0x7a,0xd2,0x39}} - -#define NLA_ALLUSERS_NETWORK 0x00000001 -#define NLA_FRIENDLY_NAME 0x00000002 - - typedef enum _NLA_BLOB_DATA_TYPE { - NLA_RAW_DATA = 0,NLA_INTERFACE = 1,NLA_802_1X_LOCATION = 2,NLA_CONNECTIVITY = 3,NLA_ICS = 4 - } NLA_BLOB_DATA_TYPE,*PNLA_BLOB_DATA_TYPE; - - typedef enum _NLA_CONNECTIVITY_TYPE { - NLA_NETWORK_AD_HOC = 0,NLA_NETWORK_MANAGED = 1,NLA_NETWORK_UNMANAGED = 2,NLA_NETWORK_UNKNOWN = 3 - } NLA_CONNECTIVITY_TYPE,*PNLA_CONNECTIVITY_TYPE; - - typedef enum _NLA_INTERNET { - NLA_INTERNET_UNKNOWN = 0,NLA_INTERNET_NO = 1,NLA_INTERNET_YES = 2 - } NLA_INTERNET,*PNLA_INTERNET; - - typedef struct _NLA_BLOB { - struct { - NLA_BLOB_DATA_TYPE type; - DWORD dwSize; - DWORD nextOffset; - } header; - union { - CHAR rawData[1]; - struct { - DWORD dwType; - DWORD dwSpeed; - CHAR adapterName[1]; - } interfaceData; - struct { - CHAR information[1]; - } locationData; - struct { - NLA_CONNECTIVITY_TYPE type; - NLA_INTERNET internet; - } connectivity; - struct { - struct { - DWORD speed; - DWORD type; - DWORD state; - WCHAR machineName[256]; - WCHAR sharedAdapterName[256]; - } remote; - } ICS; - } data; - } NLA_BLOB,*PNLA_BLOB,*LPNLA_BLOB; - -#ifdef BADVPN_SHIPPED_MSWSOCK_DECLARE_WSAMSG - typedef struct _WSAMSG { - LPSOCKADDR name; - INT namelen; - LPWSABUF lpBuffers; - DWORD dwBufferCount; - WSABUF Control; - DWORD dwFlags; - } WSAMSG,*PWSAMSG,*LPWSAMSG; -#endif - - typedef struct _WSACMSGHDR { - SIZE_T cmsg_len; - INT cmsg_level; - INT cmsg_type; - } WSACMSGHDR,*PWSACMSGHDR,*LPWSACMSGHDR; - -#define WSA_CMSGHDR_ALIGN(length) (((length) + TYPE_ALIGNMENT(WSACMSGHDR)-1) & (~(TYPE_ALIGNMENT(WSACMSGHDR)-1))) -#define WSA_CMSGDATA_ALIGN(length) (((length) + MAX_NATURAL_ALIGNMENT-1) & (~(MAX_NATURAL_ALIGNMENT-1))) -#define WSA_CMSG_FIRSTHDR(msg) (((msg)->Control.len >= sizeof(WSACMSGHDR)) ? (LPWSACMSGHDR)(msg)->Control.buf : (LPWSACMSGHDR)NULL) -#define WSA_CMSG_NXTHDR(msg,cmsg) ((!(cmsg)) ? WSA_CMSG_FIRSTHDR(msg) : ((((u_char *)(cmsg) + WSA_CMSGHDR_ALIGN((cmsg)->cmsg_len) + sizeof(WSACMSGHDR)) > (u_char *)((msg)->Control.buf) + (msg)->Control.len) ? (LPWSACMSGHDR)NULL : (LPWSACMSGHDR)((u_char *)(cmsg) + WSA_CMSGHDR_ALIGN((cmsg)->cmsg_len)))) -#define WSA_CMSG_DATA(cmsg) ((u_char *)(cmsg) + WSA_CMSGDATA_ALIGN(sizeof(WSACMSGHDR))) -#define WSA_CMSG_SPACE(length) (WSA_CMSGDATA_ALIGN(sizeof(WSACMSGHDR) + WSA_CMSGHDR_ALIGN(length))) -#define WSA_CMSG_LEN(length) (WSA_CMSGDATA_ALIGN(sizeof(WSACMSGHDR)) + length) - -#define MSG_TRUNC 0x0100 -#define MSG_CTRUNC 0x0200 -#define MSG_BCAST 0x0400 -#define MSG_MCAST 0x0800 - - typedef INT (WINAPI *LPFN_WSARECVMSG)(SOCKET s, LPWSAMSG lpMsg, - LPDWORD lpdwNumberOfBytesRecvd, - LPWSAOVERLAPPED lpOverlapped, - LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine); - -#define WSAID_WSARECVMSG {0xf689d7c8,0x6f1f,0x436b,{0x8a,0x53,0xe5,0x4f,0xe3,0x51,0xc3,0x22}} - -#if(_WIN32_WINNT >= 0x0600) - typedef struct { - LPWSAMSG lpMsg; - DWORD dwFlags; - LPDWORD lpNumberOfBytesSent; - LPWSAOVERLAPPED lpOverlapped; - LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine; - } WSASENDMSG, *LPWSASENDMSG; - - typedef INT (WSAAPI *LPFN_WSASENDMSG)(SOCKET s, LPWSAMSG lpMsg, DWORD dwFlags, - LPDWORD lpNumberOfBytesSent, - LPWSAOVERLAPPED lpOverlapped, - LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine); - -#define WSAID_WSASENDMSG {0xa441e712,0x754f,0x43ca,{0x84,0xa7,0x0d,0xee,0x44,0xcf,0x60,0x6d}} - -#endif /* (_WIN32_WINNT >= 0x0600) */ - -#ifdef __cplusplus -} -#endif - -#endif /* _MSWSOCK_ */ diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/nonblocking.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/nonblocking.h deleted file mode 100644 index fe82584a..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/nonblocking.h +++ /dev/null @@ -1,51 +0,0 @@ -/** - * @file nonblocking.h - * @author Ambroz Bizjak - * - * @section LICENSE - * - * 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 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE 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. - * - * @section DESCRIPTION - * - * Function for enabling non-blocking mode for a file descriptor. - */ - -#ifndef BADVPN_MISC_NONBLOCKING_H -#define BADVPN_MISC_NONBLOCKING_H - -#include -#include - -static int badvpn_set_nonblocking (int fd); - -int badvpn_set_nonblocking (int fd) -{ - if (fcntl(fd, F_SETFL, O_NONBLOCK) < 0) { - return 0; - } - - return 1; -} - -#endif diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/nsskey.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/nsskey.h deleted file mode 100644 index 8268235f..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/nsskey.h +++ /dev/null @@ -1,118 +0,0 @@ -/** - * @file nsskey.h - * @author Ambroz Bizjak - * - * @section LICENSE - * - * 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 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE 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. - * - * @section DESCRIPTION - * - * Function for opening a NSS certificate and its private key. - */ - -#ifndef BADVPN_MISC_NSSKEY_H -#define BADVPN_MISC_NSSKEY_H - -#include - -#include -#include -#include -#include - -#include - -#include - -/** - * Opens a NSS certificate and its private key. - * - * @param name name of the certificate - * @param out_cert on success, the certificate will be returned here. Should be - * released with CERT_DestroyCertificate. - * @param out_key on success, the private key will be returned here. Should be - * released with SECKEY_DestroyPrivateKey. - * @return 1 on success, 0 on failure - */ -static int open_nss_cert_and_key (char *name, CERTCertificate **out_cert, SECKEYPrivateKey **out_key) WARN_UNUSED; - -static SECKEYPrivateKey * find_nss_private_key (char *name) -{ - SECKEYPrivateKey *key = NULL; - - PK11SlotList *slot_list = PK11_GetAllTokens(CKM_INVALID_MECHANISM, PR_FALSE, PR_FALSE, NULL); - if (!slot_list) { - return NULL; - } - - PK11SlotListElement *slot_entry; - for (slot_entry = slot_list->head; !key && slot_entry; slot_entry = slot_entry->next) { - SECKEYPrivateKeyList *key_list = PK11_ListPrivKeysInSlot(slot_entry->slot, name, NULL); - if (!key_list) { - BLog(BLOG_ERROR, "PK11_ListPrivKeysInSlot failed"); - continue; - } - - SECKEYPrivateKeyListNode *key_node; - for (key_node = PRIVKEY_LIST_HEAD(key_list); !key && !PRIVKEY_LIST_END(key_node, key_list); key_node = PRIVKEY_LIST_NEXT(key_node)) { - char *key_name = PK11_GetPrivateKeyNickname(key_node->key); - if (!key_name || strcmp(key_name, name)) { - PORT_Free((void *)key_name); - continue; - } - PORT_Free((void *)key_name); - - key = SECKEY_CopyPrivateKey(key_node->key); - } - - SECKEY_DestroyPrivateKeyList(key_list); - } - - PK11_FreeSlotList(slot_list); - - return key; -} - -int open_nss_cert_and_key (char *name, CERTCertificate **out_cert, SECKEYPrivateKey **out_key) -{ - CERTCertificate *cert; - cert = CERT_FindCertByNicknameOrEmailAddr(CERT_GetDefaultCertDB(), name); - if (!cert) { - BLog(BLOG_ERROR, "CERT_FindCertByName failed (%d)", (int)PR_GetError()); - return 0; - } - - SECKEYPrivateKey *key = find_nss_private_key(name); - if (!key) { - BLog(BLOG_ERROR, "Failed to find private key"); - CERT_DestroyCertificate(cert); - return 0; - } - - *out_cert = cert; - *out_key = key; - return 1; -} - -#endif diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/offset.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/offset.h deleted file mode 100644 index 23b7683c..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/offset.h +++ /dev/null @@ -1,51 +0,0 @@ -/** - * @file offset.h - * @author Ambroz Bizjak - * - * @section LICENSE - * - * 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 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE 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. - * - * @section DESCRIPTION - * - * Macros for determining offsets of members in structs. - */ - -#ifndef BADVPN_MISC_OFFSET_H -#define BADVPN_MISC_OFFSET_H - -#include -#include - -/** - * Returns a pointer to a struct, given a pointer to its member. - */ -#define UPPER_OBJECT(_ptr, _object_type, _field_name) ((_object_type *)((char *)(_ptr) - offsetof(_object_type, _field_name))) - -/** - * Returns the offset of one struct member from another. - * Expands to an int. - */ -#define OFFSET_DIFF(_object_type, _field1, _field2) ((int)offsetof(_object_type, _field1) - (int)offsetof(_object_type, _field2)) - -#endif diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/open_standard_streams.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/open_standard_streams.h deleted file mode 100644 index 7fd6d414..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/open_standard_streams.h +++ /dev/null @@ -1,54 +0,0 @@ -/** - * @file open_standard_streams.h - * @author Ambroz Bizjak - * - * @section LICENSE - * - * 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 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE 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. - */ - -#ifndef BADVPN_OPEN_STANDARD_STREAMS_H -#define BADVPN_OPEN_STANDARD_STREAMS_H - -#ifndef BADVPN_USE_WINAPI -#include -#include -#include -#include -#endif - -static void open_standard_streams (void) -{ -#ifndef BADVPN_USE_WINAPI - int fd; - - do { - fd = open("/dev/null", O_RDWR); - if (fd > 2) { - close(fd); - } - } while (fd >= 0 && fd <= 2); -#endif -} - -#endif diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/overflow.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/overflow.h deleted file mode 100644 index 9fde52ad..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/overflow.h +++ /dev/null @@ -1,66 +0,0 @@ -/** - * @file overflow.h - * @author Ambroz Bizjak - * - * @section LICENSE - * - * 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 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE 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. - * - * @section DESCRIPTION - * - * Functions for checking for overflow of integer addition. - */ - -#ifndef BADVPN_MISC_OVERFLOW_H -#define BADVPN_MISC_OVERFLOW_H - -#include -#include - -#define DEFINE_UNSIGNED_OVERFLOW(_name, _type, _max) \ -static int add_ ## _name ## _overflows (_type a, _type b) \ -{\ - return (b > _max - a); \ -} - -#define DEFINE_SIGNED_OVERFLOW(_name, _type, _min, _max) \ -static int add_ ## _name ## _overflows (_type a, _type b) \ -{\ - if ((a < 0) ^ (b < 0)) return 0; \ - if (a < 0) return -(a < _min - b); \ - return (a > _max - b); \ -} - -DEFINE_UNSIGNED_OVERFLOW(uint, unsigned int, UINT_MAX) -DEFINE_UNSIGNED_OVERFLOW(uint8, uint8_t, UINT8_MAX) -DEFINE_UNSIGNED_OVERFLOW(uint16, uint16_t, UINT16_MAX) -DEFINE_UNSIGNED_OVERFLOW(uint32, uint32_t, UINT32_MAX) -DEFINE_UNSIGNED_OVERFLOW(uint64, uint64_t, UINT64_MAX) - -DEFINE_SIGNED_OVERFLOW(int, int, INT_MIN, INT_MAX) -DEFINE_SIGNED_OVERFLOW(int8, int8_t, INT8_MIN, INT8_MAX) -DEFINE_SIGNED_OVERFLOW(int16, int16_t, INT16_MIN, INT16_MAX) -DEFINE_SIGNED_OVERFLOW(int32, int32_t, INT32_MIN, INT32_MAX) -DEFINE_SIGNED_OVERFLOW(int64, int64_t, INT64_MIN, INT64_MAX) - -#endif diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/packed.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/packed.h deleted file mode 100644 index 2175536a..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/packed.h +++ /dev/null @@ -1,51 +0,0 @@ -/** - * @file packed.h - * @author Ambroz Bizjak - * - * @section LICENSE - * - * 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 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE 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. - * - * @section DESCRIPTION - * - * Structure packing macros. - */ - -#ifndef BADVPN_PACKED_H -#define BADVPN_PACKED_H - -#ifdef _MSC_VER - -#define B_START_PACKED __pragma(pack(push, 1)) -#define B_END_PACKED __pragma(pack(pop)) -#define B_PACKED - -#else - -#define B_START_PACKED -#define B_END_PACKED -#define B_PACKED __attribute__((packed)) - -#endif - -#endif diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/parse_number.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/parse_number.h deleted file mode 100644 index 3a3db3a1..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/parse_number.h +++ /dev/null @@ -1,234 +0,0 @@ -/** - * @file parse_number.h - * @author Ambroz Bizjak - * - * @section LICENSE - * - * 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 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE 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. - * - * @section DESCRIPTION - * - * Numeric string parsing. - */ - -#ifndef BADVPN_MISC_PARSE_NUMBER_H -#define BADVPN_MISC_PARSE_NUMBER_H - -#include -#include -#include -#include - -#include "misc/memref.h" -#include "misc/debug.h" - -// public parsing functions -static int decode_decimal_digit (char c); -static int decode_hex_digit (char c); -static int parse_unsigned_integer (MemRef str, uintmax_t *out) WARN_UNUSED; -static int parse_unsigned_hex_integer (MemRef str, uintmax_t *out) WARN_UNUSED; -static int parse_signmag_integer (MemRef str, int *out_sign, uintmax_t *out_mag) WARN_UNUSED; - -// public generation functions -static int compute_decimal_repr_size (uintmax_t x); -static void generate_decimal_repr (uintmax_t x, char *out, int repr_size); -static int generate_decimal_repr_string (uintmax_t x, char *out); - -// implementation follows - -// decimal representation of UINTMAX_MAX -static const char parse_number__uintmax_max_str[] = "18446744073709551615"; - -// make sure UINTMAX_MAX is what we think it is -static const char parse_number__uintmax_max_str_assert[(UINTMAX_MAX == UINTMAX_C(18446744073709551615)) ? 1 : -1]; - -static int decode_decimal_digit (char c) -{ - switch (c) { - case '0': return 0; - case '1': return 1; - case '2': return 2; - case '3': return 3; - case '4': return 4; - case '5': return 5; - case '6': return 6; - case '7': return 7; - case '8': return 8; - case '9': return 9; - } - - return -1; -} - -static int decode_hex_digit (char c) -{ - switch (c) { - case '0': return 0; - case '1': return 1; - case '2': return 2; - case '3': return 3; - case '4': return 4; - case '5': return 5; - case '6': return 6; - case '7': return 7; - case '8': return 8; - case '9': return 9; - case 'A': case 'a': return 10; - case 'B': case 'b': return 11; - case 'C': case 'c': return 12; - case 'D': case 'd': return 13; - case 'E': case 'e': return 14; - case 'F': case 'f': return 15; - } - - return -1; -} - -static int parse__no_overflow (const char *str, size_t str_len, uintmax_t *out) -{ - uintmax_t n = 0; - - while (str_len > 0) { - if (*str < '0' || *str > '9') { - return 0; - } - - n = 10 * n + (*str - '0'); - - str++; - str_len--; - } - - *out = n; - return 1; -} - -int parse_unsigned_integer (MemRef str, uintmax_t *out) -{ - // we do not allow empty strings - if (str.len == 0) { - return 0; - } - - // remove leading zeros - while (str.len > 0 && *str.ptr == '0') { - str.ptr++; - str.len--; - } - - // detect overflow - if (str.len > sizeof(parse_number__uintmax_max_str) - 1 || - (str.len == sizeof(parse_number__uintmax_max_str) - 1 && memcmp(str.ptr, parse_number__uintmax_max_str, sizeof(parse_number__uintmax_max_str) - 1) > 0)) { - return 0; - } - - // will not overflow (but can still have invalid characters) - return parse__no_overflow(str.ptr, str.len, out); -} - -int parse_unsigned_hex_integer (MemRef str, uintmax_t *out) -{ - uintmax_t n = 0; - - if (str.len == 0) { - return 0; - } - - while (str.len > 0) { - int digit = decode_hex_digit(*str.ptr); - if (digit < 0) { - return 0; - } - - if (n > UINTMAX_MAX / 16) { - return 0; - } - n *= 16; - - if (digit > UINTMAX_MAX - n) { - return 0; - } - n += digit; - - str.ptr++; - str.len--; - } - - *out = n; - return 1; -} - -int parse_signmag_integer (MemRef str, int *out_sign, uintmax_t *out_mag) -{ - int sign = 1; - if (str.len > 0 && (str.ptr[0] == '+' || str.ptr[0] == '-')) { - sign = 1 - 2 * (str.ptr[0] == '-'); - str.ptr++; - str.len--; - } - - if (!parse_unsigned_integer(str, out_mag)) { - return 0; - } - - *out_sign = sign; - return 1; -} - -int compute_decimal_repr_size (uintmax_t x) -{ - int size = 0; - - do { - size++; - x /= 10; - } while (x > 0); - - return size; -} - -void generate_decimal_repr (uintmax_t x, char *out, int repr_size) -{ - ASSERT(out) - ASSERT(repr_size == compute_decimal_repr_size(x)) - - out += repr_size; - - do { - *(--out) = '0' + (x % 10); - x /= 10; - } while (x > 0); -} - -int generate_decimal_repr_string (uintmax_t x, char *out) -{ - ASSERT(out) - - int repr_size = compute_decimal_repr_size(x); - generate_decimal_repr(x, out, repr_size); - out[repr_size] = '\0'; - - return repr_size; -} - -#endif diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/print_macros.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/print_macros.h deleted file mode 100644 index a07fdbe4..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/print_macros.h +++ /dev/null @@ -1,98 +0,0 @@ -/** - * @file print_macros.h - * @author Ambroz Bizjak - * - * @section LICENSE - * - * 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 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE 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. - * - * @section DESCRIPTION - * - * Format macros for printf() for non-standard compilers. - */ - -#ifndef BADVPN_PRINT_MACROS -#define BADVPN_PRINT_MACROS - -#ifdef _MSC_VER - -// size_t -#define PRIsz "Iu" - -// signed exact width (intN_t) -#define PRId8 "d" -#define PRIi8 "i" -#define PRId16 "d" -#define PRIi16 "i" -#define PRId32 "I32d" -#define PRIi32 "I32i" -#define PRId64 "I64d" -#define PRIi64 "I64i" - -// unsigned exact width (uintN_t) -#define PRIo8 "o" -#define PRIu8 "u" -#define PRIx8 "x" -#define PRIX8 "X" -#define PRIo16 "o" -#define PRIu16 "u" -#define PRIx16 "x" -#define PRIX16 "X" -#define PRIo32 "I32o" -#define PRIu32 "I32u" -#define PRIx32 "I32x" -#define PRIX32 "I32X" -#define PRIo64 "I64o" -#define PRIu64 "I64u" -#define PRIx64 "I64x" -#define PRIX64 "I64X" - -// signed maximum width (intmax_t) -#define PRIdMAX "I64d" -#define PRIiMAX "I64i" - -// unsigned maximum width (uintmax_t) -#define PRIoMAX "I64o" -#define PRIuMAX "I64u" -#define PRIxMAX "I64x" -#define PRIXMAX "I64X" - -// signed pointer (intptr_t) -#define PRIdPTR "Id" -#define PRIiPTR "Ii" - -// unsigned pointer (uintptr_t) -#define PRIoPTR "Io" -#define PRIuPTR "Iu" -#define PRIxPTR "Ix" -#define PRIXPTR "IX" - -#else - -#include - -#define PRIsz "zu" - -#endif - -#endif diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/read_file.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/read_file.h deleted file mode 100644 index e1862e5b..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/read_file.h +++ /dev/null @@ -1,98 +0,0 @@ -/** - * @file read_file.h - * @author Ambroz Bizjak - * - * @section LICENSE - * - * 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 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE 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. - * - * @section DESCRIPTION - * - * Function for reading a file into memory using stdio. - */ - -#ifndef BADVPN_MISC_READ_FILE_H -#define BADVPN_MISC_READ_FILE_H - -#include -#include -#include -#include - -static int read_file (const char *file, uint8_t **out_data, size_t *out_len) -{ - FILE *f = fopen(file, "r"); - if (!f) { - goto fail0; - } - - size_t buf_len = 0; - size_t buf_size = 128; - - uint8_t *buf = (uint8_t *)malloc(buf_size); - if (!buf) { - goto fail1; - } - - while (1) { - if (buf_len == buf_size) { - if (2 > SIZE_MAX / buf_size) { - goto fail; - } - size_t newsize = 2 * buf_size; - - uint8_t *newbuf = (uint8_t *)realloc(buf, newsize); - if (!newbuf) { - goto fail; - } - - buf = newbuf; - buf_size = newsize; - } - - size_t bytes = fread(buf + buf_len, 1, buf_size - buf_len, f); - if (bytes == 0) { - if (feof(f)) { - break; - } - goto fail; - } - - buf_len += bytes; - } - - fclose(f); - - *out_data = buf; - *out_len = buf_len; - return 1; - -fail: - free(buf); -fail1: - fclose(f); -fail0: - return 0; -} - -#endif diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/read_write_int.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/read_write_int.h deleted file mode 100644 index bc4ed2c0..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/read_write_int.h +++ /dev/null @@ -1,181 +0,0 @@ -/** - * @file read_write_int.h - * @author Ambroz Bizjak - * - * @section LICENSE - * - * 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 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE 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. - */ - -#ifndef BADVPN_READ_WRITE_INT_H -#define BADVPN_READ_WRITE_INT_H - -#include - -static uint8_t badvpn_read_le8 (const char *c_ptr); -static uint16_t badvpn_read_le16 (const char *c_ptr); -static uint32_t badvpn_read_le32 (const char *c_ptr); -static uint64_t badvpn_read_le64 (const char *c_ptr); - -static uint8_t badvpn_read_be8 (const char *c_ptr); -static uint16_t badvpn_read_be16 (const char *c_ptr); -static uint32_t badvpn_read_be32 (const char *c_ptr); -static uint64_t badvpn_read_be64 (const char *c_ptr); - -static void badvpn_write_le8 (uint8_t x, char *c_ptr); -static void badvpn_write_le16 (uint16_t x, char *c_ptr); -static void badvpn_write_le32 (uint32_t x, char *c_ptr); -static void badvpn_write_le64 (uint64_t x, char *c_ptr); - -static void badvpn_write_be8 (uint8_t x, char *c_ptr); -static void badvpn_write_be16 (uint16_t x, char *c_ptr); -static void badvpn_write_be32 (uint32_t x, char *c_ptr); -static void badvpn_write_be64 (uint64_t x, char *c_ptr); - -static uint8_t badvpn_read_le8 (const char *c_ptr) -{ - const uint8_t *ptr = (const uint8_t *)c_ptr; - return ((uint8_t)ptr[0] << 0); -} - -static uint16_t badvpn_read_le16 (const char *c_ptr) -{ - const uint8_t *ptr = (const uint8_t *)c_ptr; - return ((uint16_t)ptr[1] << 8) | ((uint16_t)ptr[0] << 0); -} - -static uint32_t badvpn_read_le32 (const char *c_ptr) -{ - const uint8_t *ptr = (const uint8_t *)c_ptr; - return ((uint32_t)ptr[3] << 24) | ((uint32_t)ptr[2] << 16) | - ((uint32_t)ptr[1] << 8) | ((uint32_t)ptr[0] << 0); -} - -static uint64_t badvpn_read_le64 (const char *c_ptr) -{ - const uint8_t *ptr = (const uint8_t *)c_ptr; - return ((uint64_t)ptr[7] << 56) | ((uint64_t)ptr[6] << 48) | - ((uint64_t)ptr[5] << 40) | ((uint64_t)ptr[4] << 32) | - ((uint64_t)ptr[3] << 24) | ((uint64_t)ptr[2] << 16) | - ((uint64_t)ptr[1] << 8) | ((uint64_t)ptr[0] << 0); -} - -static uint8_t badvpn_read_be8 (const char *c_ptr) -{ - const uint8_t *ptr = (const uint8_t *)c_ptr; - return ((uint8_t)ptr[0] << 0); -} - -static uint16_t badvpn_read_be16 (const char *c_ptr) -{ - const uint8_t *ptr = (const uint8_t *)c_ptr; - return ((uint16_t)ptr[0] << 8) | ((uint16_t)ptr[1] << 0); -} - -static uint32_t badvpn_read_be32 (const char *c_ptr) -{ - const uint8_t *ptr = (const uint8_t *)c_ptr; - return ((uint32_t)ptr[0] << 24) | ((uint32_t)ptr[1] << 16) | - ((uint32_t)ptr[2] << 8) | ((uint32_t)ptr[3] << 0); -} - -static uint64_t badvpn_read_be64 (const char *c_ptr) -{ - const uint8_t *ptr = (const uint8_t *)c_ptr; - return ((uint64_t)ptr[0] << 56) | ((uint64_t)ptr[1] << 48) | - ((uint64_t)ptr[2] << 40) | ((uint64_t)ptr[3] << 32) | - ((uint64_t)ptr[4] << 24) | ((uint64_t)ptr[5] << 16) | - ((uint64_t)ptr[6] << 8) | ((uint64_t)ptr[7] << 0); -} - -static void badvpn_write_le8 (uint8_t x, char *c_ptr) -{ - uint8_t *ptr = (uint8_t *)c_ptr; - ptr[0] = x >> 0; -} - -static void badvpn_write_le16 (uint16_t x, char *c_ptr) -{ - uint8_t *ptr = (uint8_t *)c_ptr; - ptr[1] = x >> 8; - ptr[0] = x >> 0; -} - -static void badvpn_write_le32 (uint32_t x, char *c_ptr) -{ - uint8_t *ptr = (uint8_t *)c_ptr; - ptr[3] = x >> 24; - ptr[2] = x >> 16; - ptr[1] = x >> 8; - ptr[0] = x >> 0; -} - -static void badvpn_write_le64 (uint64_t x, char *c_ptr) -{ - uint8_t *ptr = (uint8_t *)c_ptr; - ptr[7] = x >> 56; - ptr[6] = x >> 48; - ptr[5] = x >> 40; - ptr[4] = x >> 32; - ptr[3] = x >> 24; - ptr[2] = x >> 16; - ptr[1] = x >> 8; - ptr[0] = x >> 0; -} - -static void badvpn_write_be8 (uint8_t x, char *c_ptr) -{ - uint8_t *ptr = (uint8_t *)c_ptr; - ptr[0] = x >> 0; -} - -static void badvpn_write_be16 (uint16_t x, char *c_ptr) -{ - uint8_t *ptr = (uint8_t *)c_ptr; - ptr[0] = x >> 8; - ptr[1] = x >> 0; -} - -static void badvpn_write_be32 (uint32_t x, char *c_ptr) -{ - uint8_t *ptr = (uint8_t *)c_ptr; - ptr[0] = x >> 24; - ptr[1] = x >> 16; - ptr[2] = x >> 8; - ptr[3] = x >> 0; -} - -static void badvpn_write_be64 (uint64_t x, char *c_ptr) -{ - uint8_t *ptr = (uint8_t *)c_ptr; - ptr[0] = x >> 56; - ptr[1] = x >> 48; - ptr[2] = x >> 40; - ptr[3] = x >> 32; - ptr[4] = x >> 24; - ptr[5] = x >> 16; - ptr[6] = x >> 8; - ptr[7] = x >> 0; -} - -#endif diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/socks_proto.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/socks_proto.h deleted file mode 100644 index 94e4d9a6..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/socks_proto.h +++ /dev/null @@ -1,118 +0,0 @@ -/** - * @file socks_proto.h - * @author Ambroz Bizjak - * - * @section LICENSE - * - * 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 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE 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. - * - * @section DESCRIPTION - * - * Definitions for the SOCKS protocol. - */ - -#ifndef BADVPN_MISC_SOCKS_PROTO_H -#define BADVPN_MISC_SOCKS_PROTO_H - -#include - -#include "misc/packed.h" - -#define SOCKS_VERSION 0x05 - -#define SOCKS_METHOD_NO_AUTHENTICATION_REQUIRED 0x00 -#define SOCKS_METHOD_GSSAPI 0x01 -#define SOCKS_METHOD_USERNAME_PASSWORD 0x02 -#define SOCKS_METHOD_NO_ACCEPTABLE_METHODS 0xFF - -#define SOCKS_CMD_CONNECT 0x01 -#define SOCKS_CMD_BIND 0x02 -#define SOCKS_CMD_UDP_ASSOCIATE 0x03 - -#define SOCKS_ATYP_IPV4 0x01 -#define SOCKS_ATYP_DOMAINNAME 0x03 -#define SOCKS_ATYP_IPV6 0x04 - -#define SOCKS_REP_SUCCEEDED 0x00 -#define SOCKS_REP_GENERAL_FAILURE 0x01 -#define SOCKS_REP_CONNECTION_NOT_ALLOWED 0x02 -#define SOCKS_REP_NETWORK_UNREACHABLE 0x03 -#define SOCKS_REP_HOST_UNREACHABLE 0x04 -#define SOCKS_REP_CONNECTION_REFUSED 0x05 -#define SOCKS_REP_TTL_EXPIRED 0x06 -#define SOCKS_REP_COMMAND_NOT_SUPPORTED 0x07 -#define SOCKS_REP_ADDRESS_TYPE_NOT_SUPPORTED 0x08 - -B_START_PACKED -struct socks_client_hello_header { - uint8_t ver; - uint8_t nmethods; -} B_PACKED; -B_END_PACKED - -B_START_PACKED -struct socks_client_hello_method { - uint8_t method; -} B_PACKED; -B_END_PACKED - -B_START_PACKED -struct socks_server_hello { - uint8_t ver; - uint8_t method; -} B_PACKED; -B_END_PACKED - -B_START_PACKED -struct socks_request_header { - uint8_t ver; - uint8_t cmd; - uint8_t rsv; - uint8_t atyp; -} B_PACKED; -B_END_PACKED - -B_START_PACKED -struct socks_reply_header { - uint8_t ver; - uint8_t rep; - uint8_t rsv; - uint8_t atyp; -} B_PACKED; -B_END_PACKED - -B_START_PACKED -struct socks_addr_ipv4 { - uint32_t addr; - uint16_t port; -} B_PACKED; -B_END_PACKED - -B_START_PACKED -struct socks_addr_ipv6 { - uint8_t addr[16]; - uint16_t port; -} B_PACKED; -B_END_PACKED - -#endif diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/sslsocket.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/sslsocket.h deleted file mode 100644 index 71e43c20..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/sslsocket.h +++ /dev/null @@ -1,48 +0,0 @@ -/** - * @file sslsocket.h - * @author Ambroz Bizjak - * - * @section LICENSE - * - * 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 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE 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. - * - * @section DESCRIPTION - * - * Structure for moving around sockets, possibly together with SSL compoments. - */ - -#ifndef BADVPN_MISC_SSLSOCKET_H -#define BADVPN_MISC_SSLSOCKET_H - -#include - -#include -#include - -typedef struct { - BConnection con; - PRFileDesc bottom_prfd; - PRFileDesc *ssl_prfd; -} sslsocket; - -#endif diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/stdbuf_cmdline.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/stdbuf_cmdline.h deleted file mode 100644 index 8459c645..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/stdbuf_cmdline.h +++ /dev/null @@ -1,92 +0,0 @@ -/** - * @file stdbuf_cmdline.h - * @author Ambroz Bizjak - * - * @section LICENSE - * - * 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 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE 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. - * - * @section DESCRIPTION - * - * Builds command line for running a program via stdbuf. - */ - -#ifndef BADVPN_STDBUF_CMDLINE_H -#define BADVPN_STDBUF_CMDLINE_H - -#include - -#include -#include -#include - -/** - * Builds the initial part of command line for calling a program via stdbuf - * with standard output buffering set to line-buffered. - * - * @param out {@link CmdLine} to append the result to. Note than on failure, only - * some part of the cmdline may have been appended. - * @param stdbuf_exec full path to stdbuf executable - * @param exec path to the executable. Must not contain nulls. - * @param exec_len number of characters in exec - * @return 1 on success, 0 on failure - */ -static int build_stdbuf_cmdline (CmdLine *out, const char *stdbuf_exec, const char *exec, size_t exec_len) WARN_UNUSED; - -int build_stdbuf_cmdline (CmdLine *out, const char *stdbuf_exec, const char *exec, size_t exec_len) -{ - ASSERT(!memchr(exec, '\0', exec_len)) - - if (!CmdLine_AppendMulti(out, 3, stdbuf_exec, "-o", "L")) { - goto fail1; - } - - if (exec[0] == '/') { - if (!CmdLine_AppendNoNull(out, exec, exec_len)) { - goto fail1; - } - } else { - bsize_t size = bsize_add(bsize_fromsize(exec_len), bsize_fromsize(3)); - char *real_exec = BAllocSize(size); - if (!real_exec) { - goto fail1; - } - - memcpy(real_exec, "./", 2); - memcpy(real_exec + 2, exec, exec_len); - real_exec[2 + exec_len] = '\0'; - - int res = CmdLine_Append(out, real_exec); - free(real_exec); - if (!res) { - goto fail1; - } - } - - return 1; - -fail1: - return 0; -} - -#endif diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/strdup.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/strdup.h deleted file mode 100644 index 7f57af1a..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/strdup.h +++ /dev/null @@ -1,86 +0,0 @@ -/** - * @file strdup.h - * @author Ambroz Bizjak - * - * @section LICENSE - * - * 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 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE 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. - * - * @section DESCRIPTION - * - * Allocate memory for a string and copy it there. - */ - -#ifndef BADVPN_STRDUP_H -#define BADVPN_STRDUP_H - -#include -#include -#include - -#include "misc/debug.h" - -/** - * Allocate and copy a null-terminated string. - */ -static char * b_strdup (const char *str) -{ - ASSERT(str) - - size_t len = strlen(str); - - char *s = (char *)malloc(len + 1); - if (!s) { - return NULL; - } - - memcpy(s, str, len + 1); - - return s; -} - -/** - * Allocate memory for a null-terminated string and use the - * given data as its contents. A null terminator is appended - * after the specified data. - */ -static char * b_strdup_bin (const char *str, size_t len) -{ - ASSERT(str) - - if (len == SIZE_MAX) { - return NULL; - } - - char *s = (char *)malloc(len + 1); - if (!s) { - return NULL; - } - - memcpy(s, str, len); - s[len] = '\0'; - - return s; -} - -#endif diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/string_begins_with.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/string_begins_with.h deleted file mode 100644 index 3c9c5e91..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/string_begins_with.h +++ /dev/null @@ -1,96 +0,0 @@ -/** - * @file string_begins_with.h - * @author Ambroz Bizjak - * - * @section LICENSE - * - * 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 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE 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. - * - * @section DESCRIPTION - * - * Function for checking if a string begins with a given string. - */ - -#ifndef BADVPN_MISC_STRING_BEGINS_WITH -#define BADVPN_MISC_STRING_BEGINS_WITH - -#include -#include - -#include - -static size_t data_begins_with (const char *str, size_t str_len, const char *needle) -{ - ASSERT(strlen(needle) > 0) - - size_t len = 0; - - while (str_len > 0 && *needle) { - if (*str != *needle) { - return 0; - } - str++; - str_len--; - needle++; - len++; - } - - if (*needle) { - return 0; - } - - return len; -} - -static size_t string_begins_with (const char *str, const char *needle) -{ - ASSERT(strlen(needle) > 0) - - return data_begins_with(str, strlen(str), needle); -} - -static size_t data_begins_with_bin (const char *str, size_t str_len, const char *needle, size_t needle_len) -{ - ASSERT(needle_len > 0) - - size_t len = 0; - - while (str_len > 0 && needle_len > 0) { - if (*str != *needle) { - return 0; - } - str++; - str_len--; - needle++; - needle_len--; - len++; - } - - if (needle_len > 0) { - return 0; - } - - return len; -} - -#endif diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/substring.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/substring.h deleted file mode 100644 index 958d5ffc..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/substring.h +++ /dev/null @@ -1,82 +0,0 @@ -#include - -#include -#include - -static void build_substring_backtrack_table (MemRef str, size_t *out_table) -{ - ASSERT(str.len > 0) - - size_t x = 0; - - for (size_t i = 1; i < str.len; i++) { - out_table[i] = x; - while (x > 0 && str.ptr[i] != str.ptr[x]) { - x = out_table[x]; - } - if (str.ptr[i] == str.ptr[x]) { - x++; - } - } -} - -static int find_substring (MemRef text, MemRef word, const size_t *table, size_t *out_position) -{ - ASSERT(word.len > 0) - - size_t x = 0; - - for (size_t i = 0; i < text.len; i++) { - while (x > 0 && text.ptr[i] != word.ptr[x]) { - x = table[x]; - } - if (text.ptr[i] == word.ptr[x]) { - if (x + 1 == word.len) { - *out_position = i - x; - return 1; - } - x++; - } - } - - return 0; -} - -static void build_substring_backtrack_table_reverse (MemRef str, size_t *out_table) -{ - ASSERT(str.len > 0) - - size_t x = 0; - - for (size_t i = 1; i < str.len; i++) { - out_table[i] = x; - while (x > 0 && str.ptr[str.len - 1 - i] != str.ptr[str.len - 1 - x]) { - x = out_table[x]; - } - if (str.ptr[str.len - 1 - i] == str.ptr[str.len - 1 - x]) { - x++; - } - } -} - -static int find_substring_reverse (MemRef text, MemRef word, const size_t *table, size_t *out_position) -{ - ASSERT(word.len > 0) - - size_t x = 0; - - for (size_t i = 0; i < text.len; i++) { - while (x > 0 && text.ptr[text.len - 1 - i] != word.ptr[word.len - 1 - x]) { - x = table[x]; - } - if (text.ptr[text.len - 1 - i] == word.ptr[word.len - 1 - x]) { - if (x + 1 == word.len) { - *out_position = (text.len - 1 - i); - return 1; - } - x++; - } - } - - return 0; -} diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/udp_proto.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/udp_proto.h deleted file mode 100644 index fde677ad..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/udp_proto.h +++ /dev/null @@ -1,170 +0,0 @@ -/** - * @file udp_proto.h - * @author Ambroz Bizjak - * - * @section LICENSE - * - * 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 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE 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. - * - * @section DESCRIPTION - * - * Definitions for the UDP protocol. - */ - -#ifndef BADVPN_MISC_UDP_PROTO_H -#define BADVPN_MISC_UDP_PROTO_H - -#include - -#include "misc/debug.h" -#include "misc/byteorder.h" -#include "misc/ipv4_proto.h" -#include "misc/ipv6_proto.h" -#include "misc/read_write_int.h" - -B_START_PACKED -struct udp_header { - uint16_t source_port; - uint16_t dest_port; - uint16_t length; - uint16_t checksum; -} B_PACKED; -B_END_PACKED - -static uint32_t udp_checksum_summer (const char *data, uint16_t len) -{ - ASSERT(len % 2 == 0) - - uint32_t t = 0; - - for (uint16_t i = 0; i < len / 2; i++) { - t += badvpn_read_be16(data + 2 * i); - } - - return t; -} - -static uint16_t udp_checksum (const struct udp_header *header, const uint8_t *payload, uint16_t payload_len, uint32_t source_addr, uint32_t dest_addr) -{ - uint32_t t = 0; - - t += udp_checksum_summer((char *)&source_addr, sizeof(source_addr)); - t += udp_checksum_summer((char *)&dest_addr, sizeof(dest_addr)); - - uint16_t x; - x = hton16(IPV4_PROTOCOL_UDP); - t += udp_checksum_summer((char *)&x, sizeof(x)); - x = hton16(sizeof(*header) + payload_len); - t += udp_checksum_summer((char *)&x, sizeof(x)); - - t += udp_checksum_summer((const char *)header, sizeof(*header)); - - if (payload_len % 2 == 0) { - t += udp_checksum_summer((const char *)payload, payload_len); - } else { - t += udp_checksum_summer((const char *)payload, payload_len - 1); - - x = hton16(((uint16_t)payload[payload_len - 1]) << 8); - t += udp_checksum_summer((char *)&x, sizeof(x)); - } - - while (t >> 16) { - t = (t & 0xFFFF) + (t >> 16); - } - - if (t == 0) { - t = UINT16_MAX; - } - - return hton16(~t); -} - -static uint16_t udp_ip6_checksum (const struct udp_header *header, const uint8_t *payload, uint16_t payload_len, const uint8_t *source_addr, const uint8_t *dest_addr) -{ - uint32_t t = 0; - - t += udp_checksum_summer((const char *)source_addr, 16); - t += udp_checksum_summer((const char *)dest_addr, 16); - - uint32_t x; - x = hton32(sizeof(*header) + payload_len); - t += udp_checksum_summer((char *)&x, sizeof(x)); - x = hton32(IPV6_NEXT_UDP); - t += udp_checksum_summer((char *)&x, sizeof(x)); - - t += udp_checksum_summer((const char *)header, sizeof(*header)); - - if (payload_len % 2 == 0) { - t += udp_checksum_summer((const char *)payload, payload_len); - } else { - t += udp_checksum_summer((const char *)payload, payload_len - 1); - - uint16_t y; - y = hton16(((uint16_t)payload[payload_len - 1]) << 8); - t += udp_checksum_summer((char *)&y, sizeof(y)); - } - - while (t >> 16) { - t = (t & 0xFFFF) + (t >> 16); - } - - if (t == 0) { - t = UINT16_MAX; - } - - return hton16(~t); -} - -static int udp_check (const uint8_t *data, int data_len, struct udp_header *out_header, uint8_t **out_payload, int *out_payload_len) -{ - ASSERT(data_len >= 0) - ASSERT(out_header) - ASSERT(out_payload) - ASSERT(out_payload_len) - - // parse UDP header - if (data_len < sizeof(struct udp_header)) { - return 0; - } - memcpy(out_header, data, sizeof(*out_header)); - data += sizeof(*out_header); - data_len -= sizeof(*out_header); - - // verify UDP payload - int udp_length = ntoh16(out_header->length); - if (udp_length < sizeof(*out_header)) { - return 0; - } - if (udp_length > sizeof(*out_header) + data_len) { - return 0; - } - - // ignore stray data - data_len = udp_length - sizeof(*out_header); - - *out_payload = (uint8_t *)data; - *out_payload_len = data_len; - return 1; -} - -#endif diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/unicode_funcs.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/unicode_funcs.h deleted file mode 100644 index 2442e7fe..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/unicode_funcs.h +++ /dev/null @@ -1,232 +0,0 @@ -/** - * @file unicode_funcs.h - * @author Ambroz Bizjak - * - * @section LICENSE - * - * 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 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE 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. - */ - -#ifndef BADVPN_UNICODE_FUNCS_H -#define BADVPN_UNICODE_FUNCS_H - -#include -#include -#include -#include -#include -#include - -/** - * Decodes UTF-16 data as bytes into an allocated null-terminated UTF-8 string. - * - * @param data UTF-16 data, in big endian - * @param data_len size of data in bytes - * @param out_is_error if not NULL and the function returns a string, - * *out_is_error will be set to 0 or 1, indicating - * whether there have been errors decoding the input. - * A null decoded character is treated as an error. - * @return An UTF-8 null-terminated string which can be freed with free(), - * or NULL if out of memory. - */ -static char * unicode_decode_utf16_to_utf8 (const uint8_t *data, size_t data_len, int *out_is_error); - -/** - * Decodes UTF-8 data into UTF-16 data as bytes. - * - * @param data UTF-8 data - * @param data_len size of data in bytes - * @param out output buffer - * @param out_avail number of bytes available in output buffer - * @param out_len if not NULL, *out_len will contain the number of bytes - * required to store the resulting data (or overflow) - * @param out_is_error if not NULL, *out_is_error will contain 0 or 1, - * indicating whether there have been errors decoding - * the input - */ -static void unicode_decode_utf8_to_utf16 (const uint8_t *data, size_t data_len, uint8_t *out, size_t out_avail, bsize_t *out_len, int *out_is_error); - -static char * unicode_decode_utf16_to_utf8 (const uint8_t *data, size_t data_len, int *out_is_error) -{ - // will build the resulting UTF-8 string by appending to ExpString - ExpString str; - if (!ExpString_Init(&str)) { - goto fail0; - } - - // init UTF-16 decoder - Utf16Decoder decoder; - Utf16Decoder_Init(&decoder); - - // set initial input and input matching positions - size_t i_in = 0; - size_t i_ch = 0; - - int error = 0; - - while (i_in < data_len) { - // read two input bytes from the input position - uint8_t x = data[i_in++]; - if (i_in == data_len) { - break; - } - uint8_t y = data[i_in++]; - - // combine them into a 16-bit value - uint16_t xy = (((uint16_t)x << 8) | (uint16_t)y); - - // give the 16-bit value to the UTF-16 decoder and maybe - // receive a Unicode character back - uint32_t ch; - if (!Utf16Decoder_Input(&decoder, xy, &ch)) { - continue; - } - - if (!error) { - // encode the Unicode character back into UTF-16 - uint16_t chenc[2]; - int chenc_n = Utf16Encoder_EncodeCharacter(ch, chenc); - ASSERT(chenc_n > 0) - - // match the result with input - for (int chenc_i = 0; chenc_i < chenc_n; chenc_i++) { - uint8_t cx = (chenc[chenc_i] >> 8); - uint8_t cy = (chenc[chenc_i] & 0xFF); - - if (i_ch >= data_len || data[i_ch] != cx) { - error = 1; - break; - } - i_ch++; - - if (i_ch >= data_len || data[i_ch] != cy) { - error = 1; - break; - } - i_ch++; - } - } - - // we don't like null Unicode characters because we're building a - // null-terminated UTF-8 string - if (ch == 0) { - error = 1; - continue; - } - - // encode the Unicode character into UTF-8 - uint8_t enc[5]; - int enc_n = Utf8Encoder_EncodeCharacter(ch, enc); - ASSERT(enc_n > 0) - - // append the resulting UTF-8 bytes to the result string - enc[enc_n] = 0; - if (!ExpString_Append(&str, enc)) { - goto fail1; - } - } - - // check if we matched the whole input string when encoding back - if (i_ch < data_len) { - error = 1; - } - - if (out_is_error) { - *out_is_error = error; - } - return ExpString_Get(&str); - -fail1: - ExpString_Free(&str); -fail0: - return NULL; -} - -static void unicode_decode_utf8_to_utf16 (const uint8_t *data, size_t data_len, uint8_t *out, size_t out_avail, bsize_t *out_len, int *out_is_error) -{ - Utf8Decoder decoder; - Utf8Decoder_Init(&decoder); - - size_t i_in = 0; - size_t i_ch = 0; - - bsize_t len = bsize_fromsize(0); - - int error = 0; - - while (i_in < data_len) { - uint8_t x = data[i_in++]; - - uint32_t ch; - if (!Utf8Decoder_Input(&decoder, x, &ch)) { - continue; - } - - if (!error) { - uint8_t chenc[4]; - int chenc_n = Utf8Encoder_EncodeCharacter(ch, chenc); - ASSERT(chenc_n > 0) - - for (int chenc_i = 0; chenc_i < chenc_n; chenc_i++) { - if (i_ch >= data_len || data[i_ch] != chenc[chenc_i]) { - error = 1; - break; - } - i_ch++; - } - } - - uint16_t enc[2]; - int enc_n = Utf16Encoder_EncodeCharacter(ch, enc); - ASSERT(enc_n > 0) - - len = bsize_add(len, bsize_fromsize(2 * enc_n)); - - for (int enc_i = 0; enc_i < enc_n; enc_i++) { - if (out_avail == 0) { - break; - } - *(out++) = (enc[enc_i] >> 8); - out_avail--; - - if (out_avail == 0) { - break; - } - *(out++) = (enc[enc_i] & 0xFF); - out_avail--; - } - } - - if (i_ch < data_len) { - error = 1; - } - - if (out_len) { - *out_len = len; - } - if (out_is_error) { - *out_is_error = error; - } -} - -#endif diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/version.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/version.h deleted file mode 100644 index 1079ab09..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/version.h +++ /dev/null @@ -1,41 +0,0 @@ -/** - * @file version.h - * @author Ambroz Bizjak - * - * @section LICENSE - * - * 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 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE 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. - * - * @section DESCRIPTION - * - * Product information definitions. - */ - -#ifndef BADVPN_MISC_VERSION_H -#define BADVPN_MISC_VERSION_H - -#define GLOBAL_PRODUCT_NAME "BadVPN" -#define GLOBAL_VERSION "1.999.130" -#define GLOBAL_COPYRIGHT_NOTICE "Copyright (C) 2010 Ambroz Bizjak " - -#endif diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/write_file.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/write_file.h deleted file mode 100644 index 50b323a5..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/misc/write_file.h +++ /dev/null @@ -1,70 +0,0 @@ -/** - * @file write_file.h - * @author Ambroz Bizjak - * - * @section LICENSE - * - * 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 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE 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. - */ - -#ifndef BADVPN_WRITE_FILE_H -#define BADVPN_WRITE_FILE_H - -#include -#include -#include - -#include -#include - -static int write_file (const char *file, MemRef data) -{ - FILE *f = fopen(file, "w"); - if (!f) { - goto fail0; - } - - while (data.len > 0) { - size_t res = fwrite(data.ptr, 1, data.len, f); - if (res == 0) { - goto fail1; - } - - ASSERT(res <= data.len) - - data = MemRef_SubFrom(data, res); - } - - if (fclose(f) != 0) { - return 0; - } - - return 1; - -fail1: - fclose(f); -fail0: - return 0; -} - -#endif diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/protocol/addr.bproto b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/protocol/addr.bproto deleted file mode 100644 index f020350d..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/protocol/addr.bproto +++ /dev/null @@ -1,11 +0,0 @@ -// message for an AddrProto address -message addr { - // address type. from addr.h - required uint8 type = 1; - // for IPv4 and IPv6 addresses, the port (network byte order) - optional data("2") ip_port = 2; - // for IPv4 addresses, the IP address - optional data("4") ipv4_addr = 3; - // for IPv6 addresses, the IP address - optional data("16") ipv6_addr = 4; -}; diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/protocol/addr.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/protocol/addr.h deleted file mode 100644 index 9d202654..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/protocol/addr.h +++ /dev/null @@ -1,207 +0,0 @@ -/** - * @file addr.h - * @author Ambroz Bizjak - * - * @section LICENSE - * - * 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 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE 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. - * - * @section DESCRIPTION - * - * AddrProto, a protocol for encoding network addresses. - * - * AddrProto is built with BProto, the protocol and code generator for building - * custom message protocols. The BProto specification file is addr.bproto. - */ - -#ifndef BADVPN_PROTOCOL_ADDR_H -#define BADVPN_PROTOCOL_ADDR_H - -#include -#include - -#include -#include -#include - -#include - -#include - -#define ADDR_TYPE_IPV4 1 -#define ADDR_TYPE_IPV6 2 - -#define ADDR_SIZE_IPV4 (addr_SIZEtype + addr_SIZEip_port + addr_SIZEipv4_addr) -#define ADDR_SIZE_IPV6 (addr_SIZEtype + addr_SIZEip_port + addr_SIZEipv6_addr) - -/** - * Determines if the given address is supported by AddrProto. - * Depends only on the type of the address. - * - * @param addr address to check. Must be recognized according to {@link BAddr_IsRecognized}. - * @return 1 if supported, 0 if not - */ -static int addr_supported (BAddr addr); - -/** - * Determines the size of the given address when encoded by AddrProto. - * Depends only on the type of the address. - * - * @param addr address to check. Must be supported according to {@link addr_supported}. - * @return encoded size - */ -static int addr_size (BAddr addr); - -/** - * Encodes an address according to AddrProto. - * - * @param out output buffer. Must have at least addr_size(addr) space. - * @param addr address to encode. Must be supported according to {@link addr_supported}. - */ -static void addr_write (uint8_t *out, BAddr addr); - -/** - * Decodes an address according to AddrProto. - * - * @param data input buffer containing the address to decode - * @param data_len size of input. Must be >=0. - * @param out_addr the decoded address will be stored here on success - * @return 1 on success, 0 on failure - */ -static int addr_read (uint8_t *data, int data_len, BAddr *out_addr) WARN_UNUSED; - -int addr_supported (BAddr addr) -{ - BAddr_Assert(&addr); - - switch (addr.type) { - case BADDR_TYPE_IPV4: - case BADDR_TYPE_IPV6: - return 1; - default: - return 0; - } -} - -int addr_size (BAddr addr) -{ - ASSERT(addr_supported(addr)) - - switch (addr.type) { - case BADDR_TYPE_IPV4: - return ADDR_SIZE_IPV4; - case BADDR_TYPE_IPV6: - return ADDR_SIZE_IPV6; - default: - ASSERT(0) - return 0; - } -} - -void addr_write (uint8_t *out, BAddr addr) -{ - ASSERT(addr_supported(addr)) - - addrWriter writer; - addrWriter_Init(&writer, out); - - switch (addr.type) { - case BADDR_TYPE_IPV4: { - addrWriter_Addtype(&writer, ADDR_TYPE_IPV4); - uint8_t *out_port = addrWriter_Addip_port(&writer); - memcpy(out_port, &addr.ipv4.port, sizeof(addr.ipv4.port)); - uint8_t *out_addr = addrWriter_Addipv4_addr(&writer); - memcpy(out_addr, &addr.ipv4.ip, sizeof(addr.ipv4.ip)); - } break; - case BADDR_TYPE_IPV6: { - addrWriter_Addtype(&writer, ADDR_TYPE_IPV6); - uint8_t *out_port = addrWriter_Addip_port(&writer); - memcpy(out_port, &addr.ipv6.port, sizeof(addr.ipv6.port)); - uint8_t *out_addr = addrWriter_Addipv6_addr(&writer); - memcpy(out_addr, addr.ipv6.ip, sizeof(addr.ipv6.ip)); - } break; - default: - ASSERT(0); - } - - int len = addrWriter_Finish(&writer); - B_USE(len) - - ASSERT(len == addr_size(addr)) -} - -int addr_read (uint8_t *data, int data_len, BAddr *out_addr) -{ - ASSERT(data_len >= 0) - - addrParser parser; - if (!addrParser_Init(&parser, data, data_len)) { - BLog(BLOG_ERROR, "failed to parse addr"); - return 0; - } - - uint8_t type = 0; // to remove warning - addrParser_Gettype(&parser, &type); - - switch (type) { - case ADDR_TYPE_IPV4: { - uint8_t *port_data; - if (!addrParser_Getip_port(&parser, &port_data)) { - BLog(BLOG_ERROR, "port missing for IPv4 address"); - return 0; - } - uint8_t *addr_data; - if (!addrParser_Getipv4_addr(&parser, &addr_data)) { - BLog(BLOG_ERROR, "address missing for IPv4 address"); - return 0; - } - uint16_t port; - uint32_t addr; - memcpy(&port, port_data, sizeof(port)); - memcpy(&addr, addr_data, sizeof(addr)); - BAddr_InitIPv4(out_addr, addr, port); - } break; - case ADDR_TYPE_IPV6: { - uint8_t *port_data; - if (!addrParser_Getip_port(&parser, &port_data)) { - BLog(BLOG_ERROR, "port missing for IPv6 address"); - return 0; - } - uint8_t *addr_data; - if (!addrParser_Getipv6_addr(&parser, &addr_data)) { - BLog(BLOG_ERROR, "address missing for IPv6 address"); - return 0; - } - uint16_t port; - memcpy(&port, port_data, sizeof(port)); - BAddr_InitIPv6(out_addr, addr_data, port); - } break; - default: - BLog(BLOG_ERROR, "unknown address type %d", (int)type); - return 0; - } - - return 1; -} - -#endif diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/protocol/dataproto.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/protocol/dataproto.h deleted file mode 100644 index 998d9535..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/protocol/dataproto.h +++ /dev/null @@ -1,91 +0,0 @@ -/** - * @file dataproto.h - * @author Ambroz Bizjak - * - * @section LICENSE - * - * 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 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE 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. - * - * @section DESCRIPTION - * - * Definitions for DataProto, the protocol for data transport between VPN peers. - * - * All multi-byte integers in structs are little-endian, unless stated otherwise. - * - * A DataProto packet consists of: - * - the header (struct {@link dataproto_header}) - * - between zero and DATAPROTO_MAX_PEER_IDS destination peer IDs (struct {@link dataproto_peer_id}) - * - the payload, e.g. Ethernet frame - */ - -#ifndef BADVPN_PROTOCOL_DATAPROTO_H -#define BADVPN_PROTOCOL_DATAPROTO_H - -#include - -#include -#include - -#define DATAPROTO_MAX_PEER_IDS 1 - -#define DATAPROTO_FLAGS_RECEIVING_KEEPALIVES 1 - -/** - * DataProto header. - */ -B_START_PACKED -struct dataproto_header { - /** - * Bitwise OR of flags. Possible flags: - * - DATAPROTO_FLAGS_RECEIVING_KEEPALIVES - * Indicates that when the peer sent this packet, it has received at least - * one packet from the other peer in the last keep-alive tolerance time. - */ - uint8_t flags; - - /** - * ID of the peer this frame originates from. - */ - peerid_t from_id; - - /** - * Number of destination peer IDs that follow. - * Must be <=DATAPROTO_MAX_PEER_IDS. - */ - peerid_t num_peer_ids; -} B_PACKED; -B_END_PACKED - -/** - * Structure for a destination peer ID in DataProto. - * Wraps a single peerid_t in a packed struct for easy access. - */ -B_START_PACKED -struct dataproto_peer_id { - peerid_t id; -} B_PACKED; -B_END_PACKED - -#define DATAPROTO_MAX_OVERHEAD (sizeof(struct dataproto_header) + DATAPROTO_MAX_PEER_IDS * sizeof(struct dataproto_peer_id)) - -#endif diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/protocol/fragmentproto.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/protocol/fragmentproto.h deleted file mode 100644 index 4d2315e7..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/protocol/fragmentproto.h +++ /dev/null @@ -1,100 +0,0 @@ -/** - * @file fragmentproto.h - * @author Ambroz Bizjak - * - * @section LICENSE - * - * 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 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE 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. - * - * @section DESCRIPTION - * - * Definitions for FragmentProto, a protocol that allows sending of arbitrarily sized packets over - * a link with a fixed MTU. - * - * All multi-byte integers in structs are little-endian, unless stated otherwise. - * - * A FragmentProto packet consists of a number of chunks. - * Each chunk consists of: - * - the chunk header (struct {@link fragmentproto_chunk_header}) - * - the chunk payload, i.e. part of the frame specified in the header - */ - -#ifndef BADVPN_PROTOCOL_FRAGMENTPROTO_H -#define BADVPN_PROTOCOL_FRAGMENTPROTO_H - -#include - -#include -#include - -typedef uint16_t fragmentproto_frameid; - -/** - * FragmentProto chunk header. - */ -B_START_PACKED -struct fragmentproto_chunk_header { - /** - * Identifier of the frame this chunk belongs to. - * Frames should be given ascending identifiers as they are encoded - * into chunks (except when the ID wraps to zero). - */ - fragmentproto_frameid frame_id; - - /** - * Position in the frame where this chunk starts. - */ - uint16_t chunk_start; - - /** - * Length of the chunk's payload. - */ - uint16_t chunk_len; - - /** - * Whether this is the last chunk of the frame, i.e. - * the total length of the frame is chunk_start + chunk_len. - */ - uint8_t is_last; -} B_PACKED; -B_END_PACKED - -/** - * Calculates how many chunks are needed at most for encoding one frame of the - * given maximum size with FragmentProto onto a carrier with a given MTU. - * This includes the case when the first chunk of a frame is not the first chunk - * in a FragmentProto packet. - * - * @param carrier_mtu MTU of the carrier, i.e. maximum length of FragmentProto packets. Must be >sizeof(struct fragmentproto_chunk_header). - * @param frame_mtu maximum frame size. Must be >=0. - * @return maximum number of chunks needed. Will be >0. - */ -static int fragmentproto_max_chunks_for_frame (int carrier_mtu, int frame_mtu) -{ - ASSERT(carrier_mtu > sizeof(struct fragmentproto_chunk_header)) - ASSERT(frame_mtu >= 0) - - return (bdivide_up(frame_mtu, (carrier_mtu - sizeof(struct fragmentproto_chunk_header))) + 1); -} - -#endif diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/protocol/msgproto.bproto b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/protocol/msgproto.bproto deleted file mode 100644 index 202931e2..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/protocol/msgproto.bproto +++ /dev/null @@ -1,43 +0,0 @@ -// message for all MsgProto messages -message msg { - // message type, from msgproto.h - required uint16 type = 1; - // message payload. Is itself one of the messages below - // for "youconnect", "seed" and "confirmseed" messages, - // and empty for other messages - required data payload = 2; -}; - -// "youconnect" message payload -message msg_youconnect { - // external addresses to try; one or more msg_youconnect_addr messages - required repeated data addr = 1; - // encryption key if using UDP and encryption is enabled - optional data key = 2; - // password if using TCP - optional uint64 password = 3; -}; - -// an external address -message msg_youconnect_addr { - // scope name for this address - required data name = 1; - // address according to AddrProto - required data addr = 2; -}; - -// "seed" message payload -message msg_seed { - // identifier for the seed being send - required uint16 seed_id = 1; - // seed encryption key - required data key = 2; - // seed IV - required data iv = 3; -}; - -// "confirmseed" message payload -message msg_confirmseed { - // identifier for the seed being confirmed - required uint16 seed_id = 1; -}; diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/protocol/msgproto.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/protocol/msgproto.h deleted file mode 100644 index 286abb08..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/protocol/msgproto.h +++ /dev/null @@ -1,76 +0,0 @@ -/** - * @file msgproto.h - * @author Ambroz Bizjak - * - * @section LICENSE - * - * 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 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE 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. - * - * @section DESCRIPTION - * - * MsgProto is used by each pair of VPN peers as messages through the server, in order to - * establish a direct data connection. MsgProto operates on top of the SCProto message - * service, optionally secured with SSL; see {@link scproto.h} for details. - * - * MsgProto is built with BProto, the protocol and code generator for building - * custom message protocols. The BProto specification file is msgproto.bproto. - * - * It goes roughly like that: - * - * We name one peer the master and the other the slave. The master is the one with - * greater ID. - * When the peers get to know about each other, the master starts the binding procedure. - * It binds/listens to an address, and sends the slave the "youconnect" message. It - * contains a list of external addresses for that bind address and additional parameters. - * Each external address includes a string called a scope name. The slave, which receives - * the "youconnect" message, finds the first external address whose scope it recognizes, - * and attempts to establish connection to that address. If it finds an address, buf fails - * at connecting, it sends "youretry", which makes the master restart the binding procedure - * after some time. If it however does not recognize any external address, it sends - * "cannotconnect" back to the master. - * When the master receives the "cannotconnect", it tries the next bind address, as described - * above. When the master runs out of bind addresses, it sends "cannotbind" to the slave. - * When the slave receives the "cannotbind", it starts its own binding procedure, similarly - * to what is described above, with master and slave reversed. First difference is if the - * master fails to connect to a recognized address, it doesn't send "youretry", but rather - * simply restarts the whole procedure after some time. The other difference is when the - * slave runs out of bind addresses, it not only sends "cannotbind" to the master, but - * registers relaying to the master. And in this case, when the master receives the "cannotbind", - * it doesn't start the binding procedure all all over, but registers relaying to the slave. - */ - -#ifndef BADVPN_PROTOCOL_MSGPROTO_H -#define BADVPN_PROTOCOL_MSGPROTO_H - -#include - -#define MSGID_YOUCONNECT 1 -#define MSGID_CANNOTCONNECT 2 -#define MSGID_CANNOTBIND 3 -#define MSGID_YOURETRY 5 -#define MSGID_SEED 6 -#define MSGID_CONFIRMSEED 7 - -#define MSG_MAX_PAYLOAD (SC_MAX_MSGLEN - msg_SIZEtype - msg_SIZEpayload(0)) - -#endif diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/protocol/packetproto.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/protocol/packetproto.h deleted file mode 100644 index fcac3e5d..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/protocol/packetproto.h +++ /dev/null @@ -1,68 +0,0 @@ -/** - * @file packetproto.h - * @author Ambroz Bizjak - * - * @section LICENSE - * - * 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 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE 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. - * - * @section DESCRIPTION - * - * Definitions for PacketProto, a protocol that allows sending of packets - * over a reliable stream connection. - * - * All multi-byte integers in structs are little-endian, unless stated otherwise. - * - * Packets are encoded into a stream by representing each packet with: - * - a 16-bit little-endian unsigned integer representing the length - * of the payload - * - that many bytes of payload - */ - -#ifndef BADVPN_PROTOCOL_PACKETPROTO_H -#define BADVPN_PROTOCOL_PACKETPROTO_H - -#include -#include - -#include "misc/packed.h" - -/** - * PacketProto packet header. - * Wraps a single uint16_t in a packed struct for easy access. - */ -B_START_PACKED -struct packetproto_header -{ - /** - * Length of the packet payload that follows. - */ - uint16_t len; -} B_PACKED; -B_END_PACKED - -#define PACKETPROTO_ENCLEN(_len) (sizeof(struct packetproto_header) + (_len)) - -#define PACKETPROTO_MAXPAYLOAD UINT16_MAX - -#endif diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/protocol/requestproto.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/protocol/requestproto.h deleted file mode 100644 index 2ec3d0dc..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/protocol/requestproto.h +++ /dev/null @@ -1,50 +0,0 @@ -/** - * @file requestproto.h - * @author Ambroz Bizjak - * - * @section LICENSE - * - * 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 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE 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. - */ - -#ifndef BADVPN_REQUESTPROTO_H -#define BADVPN_REQUESTPROTO_H - -#include - -#include - -#define REQUESTPROTO_TYPE_CLIENT_REQUEST 1 -#define REQUESTPROTO_TYPE_CLIENT_ABORT 2 -#define REQUESTPROTO_TYPE_SERVER_REPLY 3 -#define REQUESTPROTO_TYPE_SERVER_FINISHED 4 -#define REQUESTPROTO_TYPE_SERVER_ERROR 5 - -B_START_PACKED -struct requestproto_header { - uint32_t request_id; - uint32_t type; -} B_PACKED; -B_END_PACKED - -#endif diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/protocol/scproto.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/protocol/scproto.h deleted file mode 100644 index f138e0a5..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/protocol/scproto.h +++ /dev/null @@ -1,266 +0,0 @@ -/** - * @file scproto.h - * @author Ambroz Bizjak - * - * @section LICENSE - * - * 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 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE 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. - * - * @section DESCRIPTION - * - * Definitions for SCProto, the protocol that the clients communicate in - * with the server. - * - * All multi-byte integers in structs are little-endian, unless stated otherwise. - * - * A SCProto packet consists of: - * - a header (struct {@link sc_header}) which contains the type of the - * packet - * - the payload - * - * It goes roughly like that: - * - * When the client connects to the server, it sends a "clienthello" packet - * to the server. The packet contains the protocol version the client is using. - * When the server receives the "clienthello" packet, it checks the version. - * If it doesn't match, it disconnects the client. Otherwise the server sends - * the client a "serverhello" packet to the client. That packet contains - * the ID of the client and possibly its IPv4 address as the server sees it - * (zero if not applicable). - * - * The server than proceeds to synchronize the peers' knowledge of each other. - * It does that by sending a "newclient" messages to a client to inform it of - * another peer, and "endclient" messages to inform it that a peer is gone. - * Each client, upon receiving a "newclient" message, MUST sent a corresponding - * "acceptpeer" message, before sending any messages to the new peer. - * The server forwards messages between synchronized peers to allow them to - * communicate. A peer sends a message to another peer by sending the "outmsg" - * packet to the server, and the server delivers a message to a peer by sending - * it the "inmsg" packet. - * - * The message service is reliable; messages from one client to another are - * expected to arrive unmodified and in the same order. There is, however, - * no flow control. This means that messages can not be used for bulk transfers - * between the clients (and they are not). If the server runs out of buffer for - * messages from one client to another, it will stop forwarding messages, and - * will reset knowledge of the two clients after some delay. Similarly, if one - * of the clients runs out of buffer locally, it will send the "resetpeer" - * packet to make the server reset knowledge. - * - * The messages transport either: - * - * - If the relevant "newclient" packets do not contain the - * SCID_NEWCLIENT_FLAG_SSL flag, then plaintext MsgProto messages. - * - * - If the relevant "newclient" packets do contain the SCID_NEWCLIENT_FLAG_SSL - * flag, then SSL, broken down into packets, PacketProto inside SSL, and finally - * MsgProto inside PacketProto. The master peer (one with higher ID) acts as an - * SSL server, and the other acts as an SSL client. The peers must identify with - * the same certificate they used when connecting to the server, and each peer - * must byte-compare the other's certificate agains the one provided to it by - * by the server in the relevent "newclient" message. - */ - -#ifndef BADVPN_PROTOCOL_SCPROTO_H -#define BADVPN_PROTOCOL_SCPROTO_H - -#include - -#include - -#define SC_VERSION 29 -#define SC_OLDVERSION_NOSSL 27 -#define SC_OLDVERSION_BROKENCERT 26 - -#define SC_KEEPALIVE_INTERVAL 10000 - -/** - * SCProto packet header. - * Follows up to SC_MAX_PAYLOAD bytes of payload. - */ -B_START_PACKED -struct sc_header { - /** - * Message type. - */ - uint8_t type; -} B_PACKED; -B_END_PACKED - -#define SC_MAX_PAYLOAD 2000 -#define SC_MAX_ENC (sizeof(struct sc_header) + SC_MAX_PAYLOAD) - -typedef uint16_t peerid_t; - -#define SCID_KEEPALIVE 0 -#define SCID_CLIENTHELLO 1 -#define SCID_SERVERHELLO 2 -#define SCID_NEWCLIENT 3 -#define SCID_ENDCLIENT 4 -#define SCID_OUTMSG 5 -#define SCID_INMSG 6 -#define SCID_RESETPEER 7 -#define SCID_ACCEPTPEER 8 - -/** - * "clienthello" client packet payload. - * Packet type is SCID_CLIENTHELLO. - */ -B_START_PACKED -struct sc_client_hello { - /** - * Protocol version the client is using. - */ - uint16_t version; -} B_PACKED; -B_END_PACKED - -/** - * "serverhello" server packet payload. - * Packet type is SCID_SERVERHELLO. - */ -B_START_PACKED -struct sc_server_hello { - /** - * Flags. Not used yet. - */ - uint16_t flags; - - /** - * Peer ID of the client. - */ - peerid_t id; - - /** - * IPv4 address of the client as seen by the server - * (network byte order). Zero if not applicable. - */ - uint32_t clientAddr; -} B_PACKED; -B_END_PACKED - -/** - * "newclient" server packet payload. - * Packet type is SCID_NEWCLIENT. - * If the server is using TLS, follows up to SCID_NEWCLIENT_MAX_CERT_LEN - * bytes of the new client's certificate (encoded in DER). - */ -B_START_PACKED -struct sc_server_newclient { - /** - * ID of the new peer. - */ - peerid_t id; - - /** - * Flags. Possible flags: - * - SCID_NEWCLIENT_FLAG_RELAY_SERVER - * You can relay frames to other peers through this peer. - * - SCID_NEWCLIENT_FLAG_RELAY_CLIENT - * You must allow this peer to relay frames to other peers through you. - * - SCID_NEWCLIENT_FLAG_SSL - * SSL must be used to talk to this peer through messages. - */ - uint16_t flags; -} B_PACKED; -B_END_PACKED - -#define SCID_NEWCLIENT_FLAG_RELAY_SERVER 1 -#define SCID_NEWCLIENT_FLAG_RELAY_CLIENT 2 -#define SCID_NEWCLIENT_FLAG_SSL 4 - -#define SCID_NEWCLIENT_MAX_CERT_LEN (SC_MAX_PAYLOAD - sizeof(struct sc_server_newclient)) - -/** - * "endclient" server packet payload. - * Packet type is SCID_ENDCLIENT. - */ -B_START_PACKED -struct sc_server_endclient { - /** - * ID of the removed peer. - */ - peerid_t id; -} B_PACKED; -B_END_PACKED - -/** - * "outmsg" client packet header. - * Packet type is SCID_OUTMSG. - * Follows up to SC_MAX_MSGLEN bytes of message payload. - */ -B_START_PACKED -struct sc_client_outmsg { - /** - * ID of the destionation peer. - */ - peerid_t clientid; -} B_PACKED; -B_END_PACKED - -/** - * "inmsg" server packet payload. - * Packet type is SCID_INMSG. - * Follows up to SC_MAX_MSGLEN bytes of message payload. - */ -B_START_PACKED -struct sc_server_inmsg { - /** - * ID of the source peer. - */ - peerid_t clientid; -} B_PACKED; -B_END_PACKED - -#define _SC_MAX_OUTMSGLEN (SC_MAX_PAYLOAD - sizeof(struct sc_client_outmsg)) -#define _SC_MAX_INMSGLEN (SC_MAX_PAYLOAD - sizeof(struct sc_server_inmsg)) - -#define SC_MAX_MSGLEN (_SC_MAX_OUTMSGLEN < _SC_MAX_INMSGLEN ? _SC_MAX_OUTMSGLEN : _SC_MAX_INMSGLEN) - -/** - * "resetpeer" client packet header. - * Packet type is SCID_RESETPEER. - */ -B_START_PACKED -struct sc_client_resetpeer { - /** - * ID of the peer to reset. - */ - peerid_t clientid; -} B_PACKED; -B_END_PACKED - -/** - * "acceptpeer" client packet payload. - * Packet type is SCID_ACCEPTPEER. - */ -B_START_PACKED -struct sc_client_acceptpeer { - /** - * ID of the peer to accept. - */ - peerid_t clientid; -} B_PACKED; -B_END_PACKED - -#endif diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/protocol/spproto.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/protocol/spproto.h deleted file mode 100644 index 4b5bf5dc..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/protocol/spproto.h +++ /dev/null @@ -1,195 +0,0 @@ -/** - * @file spproto.h - * @author Ambroz Bizjak - * - * @section LICENSE - * - * 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 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE 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. - * - * @section DESCRIPTION - * - * Protocol for securing datagram communication. - * - * Security features implemented: - * - Encryption. Encrypts packets with a block cipher. - * Protects against a third party from seeing the data - * being transmitted. - * - Hashes. Adds a hash of the packet into the packet. - * Combined with encryption, protects against tampering - * with packets and crafting new packets. - * - One-time passwords. Adds a password to each packet - * for the receiver to recognize. Protects agains replaying - * packets and crafting new packets. - * - * A SPProto plaintext packet contains the following, in order: - * - if OTPs are used, a struct {@link spproto_otpdata} which contains - * the seed ID and the OTP, - * - if hashes are used, the hash, - * - payload data. - * - * If encryption is used: - * - the plaintext is padded by appending a 0x01 byte and as many 0x00 - * bytes as needed to align to block size, - * - the padded plaintext is encrypted, and - * - the initialization vector (IV) is prepended. - */ - -#ifndef BADVPN_PROTOCOL_SPPROTO_H -#define BADVPN_PROTOCOL_SPPROTO_H - -#include -#include - -#include -#include -#include -#include -#include -#include - -#define SPPROTO_HASH_MODE_NONE 0 -#define SPPROTO_ENCRYPTION_MODE_NONE 0 -#define SPPROTO_OTP_MODE_NONE 0 - -/** - * Stores security parameters for SPProto. - */ -struct spproto_security_params { - /** - * Hash mode. - * Either SPPROTO_HASH_MODE_NONE for no hashes, or a valid bhash - * hash mode. - */ - int hash_mode; - - /** - * Encryption mode. - * Either SPPROTO_ENCRYPTION_MODE_NONE for no encryption, or a valid - * {@link BEncryption} cipher. - */ - int encryption_mode; - - /** - * One-time password (OTP) mode. - * Either SPPROTO_OTP_MODE_NONE for no OTPs, or a valid - * {@link BEncryption} cipher. - */ - int otp_mode; - - /** - * If OTPs are used (otp_mode != SPPROTO_OTP_MODE_NONE), number of - * OTPs generated from a single seed. - */ - int otp_num; -}; - -#define SPPROTO_HAVE_HASH(_params) ((_params).hash_mode != SPPROTO_HASH_MODE_NONE) -#define SPPROTO_HASH_SIZE(_params) ( \ - SPPROTO_HAVE_HASH(_params) ? \ - BHash_size((_params).hash_mode) : \ - 0 \ -) - -#define SPPROTO_HAVE_ENCRYPTION(_params) ((_params).encryption_mode != SPPROTO_ENCRYPTION_MODE_NONE) - -#define SPPROTO_HAVE_OTP(_params) ((_params).otp_mode != SPPROTO_OTP_MODE_NONE) - -B_START_PACKED -struct spproto_otpdata { - uint16_t seed_id; - otp_t otp; -} B_PACKED; -B_END_PACKED - -#define SPPROTO_HEADER_OTPDATA_OFF(_params) 0 -#define SPPROTO_HEADER_OTPDATA_LEN(_params) (SPPROTO_HAVE_OTP(_params) ? sizeof(struct spproto_otpdata) : 0) -#define SPPROTO_HEADER_HASH_OFF(_params) (SPPROTO_HEADER_OTPDATA_OFF(_params) + SPPROTO_HEADER_OTPDATA_LEN(_params)) -#define SPPROTO_HEADER_HASH_LEN(_params) SPPROTO_HASH_SIZE(_params) -#define SPPROTO_HEADER_LEN(_params) (SPPROTO_HEADER_HASH_OFF(_params) + SPPROTO_HEADER_HASH_LEN(_params)) - -/** - * Asserts that the given SPProto security parameters are valid. - * - * @param params security parameters - */ -static void spproto_assert_security_params (struct spproto_security_params params) -{ - ASSERT(params.hash_mode == SPPROTO_HASH_MODE_NONE || BHash_type_valid(params.hash_mode)) - ASSERT(params.encryption_mode == SPPROTO_ENCRYPTION_MODE_NONE || BEncryption_cipher_valid(params.encryption_mode)) - ASSERT(params.otp_mode == SPPROTO_OTP_MODE_NONE || BEncryption_cipher_valid(params.otp_mode)) - ASSERT(params.otp_mode == SPPROTO_OTP_MODE_NONE || params.otp_num > 0) -} - -/** - * Calculates the maximum payload size for SPProto given the - * security parameters and the maximum encoded packet size. - * - * @param params security parameters - * @param carrier_mtu maximum encoded packet size. Must be >=0. - * @return maximum payload size. Negative means is is impossible - * to encode anything. - */ -static int spproto_payload_mtu_for_carrier_mtu (struct spproto_security_params params, int carrier_mtu) -{ - spproto_assert_security_params(params); - ASSERT(carrier_mtu >= 0) - - if (params.encryption_mode == SPPROTO_ENCRYPTION_MODE_NONE) { - return (carrier_mtu - SPPROTO_HEADER_LEN(params)); - } else { - int block_size = BEncryption_cipher_block_size(params.encryption_mode); - return (balign_down(carrier_mtu, block_size) - block_size - SPPROTO_HEADER_LEN(params) - 1); - } -} - -/** - * Calculates the maximum encoded packet size for SPProto given the - * security parameters and the maximum payload size. - * - * @param params security parameters - * @param payload_mtu maximum payload size. Must be >=0. - * @return maximum encoded packet size, -1 if payload_mtu is too large - */ -static int spproto_carrier_mtu_for_payload_mtu (struct spproto_security_params params, int payload_mtu) -{ - spproto_assert_security_params(params); - ASSERT(payload_mtu >= 0) - - if (params.encryption_mode == SPPROTO_ENCRYPTION_MODE_NONE) { - if (payload_mtu > INT_MAX - SPPROTO_HEADER_LEN(params)) { - return -1; - } - - return (SPPROTO_HEADER_LEN(params) + payload_mtu); - } else { - int block_size = BEncryption_cipher_block_size(params.encryption_mode); - - if (payload_mtu > INT_MAX - (block_size + SPPROTO_HEADER_LEN(params) + block_size)) { - return -1; - } - - return (block_size + balign_up((SPPROTO_HEADER_LEN(params) + payload_mtu + 1), block_size)); - } -} - -#endif diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/protocol/udpgw_proto.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/protocol/udpgw_proto.h deleted file mode 100644 index e781c14b..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/protocol/udpgw_proto.h +++ /dev/null @@ -1,98 +0,0 @@ -/* - * Copyright (C) Ambroz Bizjak - * Contributions: - * Transparent DNS: Copyright (C) Kerem Hadimli - * - * 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 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE 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. - */ - -#ifndef BADVPN_PROTOCOL_UDPGW_PROTO_H -#define BADVPN_PROTOCOL_UDPGW_PROTO_H - -#include - -#include "misc/bsize.h" -#include "misc/packed.h" - -#define UDPGW_CLIENT_FLAG_KEEPALIVE (1 << 0) -#define UDPGW_CLIENT_FLAG_REBIND (1 << 1) -#define UDPGW_CLIENT_FLAG_DNS (1 << 2) -#define UDPGW_CLIENT_FLAG_IPV6 (1 << 3) - -#ifdef BADVPN_SOCKS_UDP_RELAY -B_START_PACKED -struct socks_udp_header { - uint16_t rsv; - uint8_t frag; - uint8_t atyp; -} B_PACKED; -B_END_PACKED -#endif - -B_START_PACKED -struct udpgw_header { - uint8_t flags; - uint16_t conid; -} B_PACKED; -B_END_PACKED - -B_START_PACKED -struct udpgw_addr_ipv4 { - uint32_t addr_ip; - uint16_t addr_port; -} B_PACKED; -B_END_PACKED - -B_START_PACKED -struct udpgw_addr_ipv6 { - uint8_t addr_ip[16]; - uint16_t addr_port; -} B_PACKED; -B_END_PACKED - -static int udpgw_compute_mtu (int dgram_mtu) -{ - bsize_t bs = bsize_add( -#ifdef BADVPN_SOCKS_UDP_RELAY - bsize_fromsize(sizeof(struct socks_udp_header)), -#else - bsize_fromsize(sizeof(struct udpgw_header)), -#endif - bsize_add( - bsize_max( - bsize_fromsize(sizeof(struct udpgw_addr_ipv4)), - bsize_fromsize(sizeof(struct udpgw_addr_ipv6)) - ), - bsize_fromint(dgram_mtu) - ) - ); - - int s; - if (!bsize_toint(bs, &s)) { - return -1; - } - - return s; -} - -#endif diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/socksclient/BSocksClient.c b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/socksclient/BSocksClient.c deleted file mode 100644 index c20e46e0..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/socksclient/BSocksClient.c +++ /dev/null @@ -1,626 +0,0 @@ -/** - * @file BSocksClient.c - * @author Ambroz Bizjak - * - * @section LICENSE - * - * 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 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE 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. - */ - -#include - -#include "misc/byteorder.h" -#include "misc/balloc.h" -#include "base/BLog.h" - -#include "socksclient/BSocksClient.h" - -#include "generated/blog_channel_BSocksClient.h" -//#include -#include - -#define STATE_CONNECTING 1 -#define STATE_SENDING_HELLO 2 -#define STATE_SENT_HELLO 3 -#define STATE_SENDING_PASSWORD 10 -#define STATE_SENT_PASSWORD 11 -#define STATE_SENDING_REQUEST 4 -#define STATE_SENT_REQUEST 5 -#define STATE_RECEIVED_REPLY_HEADER 6 -#define STATE_UP 7 - -static void report_error (BSocksClient *o, int error); -static void init_control_io (BSocksClient *o); -static void free_control_io (BSocksClient *o); -static void init_up_io (BSocksClient *o); -static void free_up_io (BSocksClient *o); -static int reserve_buffer (BSocksClient *o, bsize_t size); -static void start_receive (BSocksClient *o, uint8_t *dest, int total); -static void do_receive (BSocksClient *o); -static void connector_handler (BSocksClient* o, int is_error); -static void connection_handler (BSocksClient* o, int event); -static void recv_handler_done (BSocksClient *o, int data_len); -static void send_handler_done (BSocksClient *o); -static void auth_finished (BSocksClient *p); - -void report_error (BSocksClient *o, int error) -{ - DEBUGERROR(&o->d_err, o->handler(o->user, error)) -} - -void init_control_io (BSocksClient *o) -{ - // init receiving - BConnection_RecvAsync_Init(&o->con); - o->control.recv_if = BConnection_RecvAsync_GetIf(&o->con); - StreamRecvInterface_Receiver_Init(o->control.recv_if, (StreamRecvInterface_handler_done)recv_handler_done, o); - - // init sending - BConnection_SendAsync_Init(&o->con); - PacketStreamSender_Init(&o->control.send_sender, BConnection_SendAsync_GetIf(&o->con), INT_MAX, BReactor_PendingGroup(o->reactor)); - o->control.send_if = PacketStreamSender_GetInput(&o->control.send_sender); - PacketPassInterface_Sender_Init(o->control.send_if, (PacketPassInterface_handler_done)send_handler_done, o); -} - -void free_control_io (BSocksClient *o) -{ - // free sending - PacketStreamSender_Free(&o->control.send_sender); - BConnection_SendAsync_Free(&o->con); - - // free receiving - BConnection_RecvAsync_Free(&o->con); -} - -void init_up_io (BSocksClient *o) -{ - // init receiving - BConnection_RecvAsync_Init(&o->con); - - // init sending - BConnection_SendAsync_Init(&o->con); -} - -void free_up_io (BSocksClient *o) -{ - // free sending - BConnection_SendAsync_Free(&o->con); - - // free receiving - BConnection_RecvAsync_Free(&o->con); -} - -int reserve_buffer (BSocksClient *o, bsize_t size) -{ - if (size.is_overflow) { - BLog(BLOG_ERROR, "size overflow"); - return 0; - } - - char *buffer = (char *)BRealloc(o->buffer, size.value); - if (!buffer) { - BLog(BLOG_ERROR, "BRealloc failed"); - return 0; - } - - o->buffer = buffer; - - return 1; -} - -void start_receive (BSocksClient *o, uint8_t *dest, int total) -{ - ASSERT(total > 0) - - o->control.recv_dest = dest; - o->control.recv_len = 0; - o->control.recv_total = total; - - do_receive(o); -} - -void do_receive (BSocksClient *o) -{ - ASSERT(o->control.recv_len < o->control.recv_total) - - StreamRecvInterface_Receiver_Recv(o->control.recv_if, o->control.recv_dest + o->control.recv_len, o->control.recv_total - o->control.recv_len); -} - -void connector_handler (BSocksClient* o, int is_error) -{ - DebugObject_Access(&o->d_obj); - ASSERT(o->state == STATE_CONNECTING) - - // check connection result - if (is_error) { - BLog(BLOG_ERROR, "connection failed"); - goto fail0; - } - - // init connection - if (!BConnection_Init(&o->con, BConnection_source_connector(&o->connector), o->reactor, o, (BConnection_handler)connection_handler)) { - BLog(BLOG_ERROR, "BConnection_Init failed"); - goto fail0; - } - - BLog(BLOG_DEBUG, "connected"); - - // init control I/O - init_control_io(o); - - // check number of methods - if (o->num_auth_info == 0 || o->num_auth_info > 255) { - BLog(BLOG_ERROR, "invalid number of authentication methods"); - goto fail1; - } - - // allocate buffer for sending hello - bsize_t size = bsize_add( - bsize_fromsize(sizeof(struct socks_client_hello_header)), - bsize_mul( - bsize_fromsize(o->num_auth_info), - bsize_fromsize(sizeof(struct socks_client_hello_method)) - ) - ); - if (!reserve_buffer(o, size)) { - goto fail1; - } - - // write hello header - struct socks_client_hello_header header; - header.ver = hton8(SOCKS_VERSION); - header.nmethods = hton8(o->num_auth_info); - memcpy(o->buffer, &header, sizeof(header)); - - // write hello methods - for (size_t i = 0; i < o->num_auth_info; i++) { - struct socks_client_hello_method method; - method.method = hton8(o->auth_info[i].auth_type); - memcpy(o->buffer + sizeof(header) + i * sizeof(method), &method, sizeof(method)); - } -#if SOCKS_DATA_LOG_ENABLE - BLog(BLOG_DEBUG, "tun2socks socks send hello data", size.value); -#endif - // send - PacketPassInterface_Sender_Send(o->control.send_if, (uint8_t *)o->buffer, size.value); - - // set state - o->state = STATE_SENDING_HELLO; - - return; - -fail1: - free_control_io(o); - BConnection_Free(&o->con); -fail0: - report_error(o, BSOCKSCLIENT_EVENT_ERROR); - return; -} - -void connection_handler (BSocksClient* o, int event) -{ - DebugObject_Access(&o->d_obj); - ASSERT(o->state != STATE_CONNECTING) - - if (o->state == STATE_UP && event == BCONNECTION_EVENT_RECVCLOSED) { - report_error(o, BSOCKSCLIENT_EVENT_ERROR_CLOSED); - return; - } - - report_error(o, BSOCKSCLIENT_EVENT_ERROR); - return; -} - -void recv_handler_done (BSocksClient *o, int data_len) -{ - ASSERT(data_len >= 0) - ASSERT(data_len <= o->control.recv_total - o->control.recv_len) - - DebugObject_Access(&o->d_obj); - - o->control.recv_len += data_len; - - if (o->control.recv_len < o->control.recv_total) { - do_receive(o); - return; - } -#if TCP_DATA_LOG_ENABLE - struct in_addr a = {o->dest_addr.ipv4.ip}; - char *ip = inet_ntoa(a); - BLog(BLOG_INFO, "socks client<%s:%d> recv_handler_done state: %d, data ", ip, o->dest_addr.ipv4.port, o->state, data_len); - -#endif - - switch (o->state) { - case STATE_SENT_HELLO: { - BLog(BLOG_DEBUG, "received hello"); - - struct socks_server_hello imsg; - memcpy(&imsg, o->buffer, sizeof(imsg)); - - if (ntoh8(imsg.ver) != SOCKS_VERSION) { - BLog(BLOG_NOTICE, "wrong version"); - goto fail; - } - - size_t auth_index; - for (auth_index = 0; auth_index < o->num_auth_info; auth_index++) { - if (o->auth_info[auth_index].auth_type == ntoh8(imsg.method)) { - break; - } - } - - if (auth_index == o->num_auth_info) { - BLog(BLOG_NOTICE, "server didn't accept any authentication method"); - goto fail; - } - - const struct BSocksClient_auth_info *ai = &o->auth_info[auth_index]; - - switch (ai->auth_type) { - case SOCKS_METHOD_NO_AUTHENTICATION_REQUIRED: { - BLog(BLOG_DEBUG, "no authentication"); - - auth_finished(o); - } break; - - case SOCKS_METHOD_USERNAME_PASSWORD: { - BLog(BLOG_DEBUG, "password authentication"); - - if (ai->password.username_len == 0 || ai->password.username_len > 255 || - ai->password.password_len == 0 || ai->password.password_len > 255 - ) { - BLog(BLOG_NOTICE, "invalid username/password length"); - goto fail; - } - - // allocate password packet - bsize_t size = bsize_fromsize(1 + 1 + ai->password.username_len + 1 + ai->password.password_len); - if (!reserve_buffer(o, size)) { - goto fail; - } - - // write password packet - char *ptr = o->buffer; - *ptr++ = 1; - *ptr++ = ai->password.username_len; - memcpy(ptr, ai->password.username, ai->password.username_len); - ptr += ai->password.username_len; - *ptr++ = ai->password.password_len; - memcpy(ptr, ai->password.password, ai->password.password_len); - ptr += ai->password.password_len; - - // start sending - PacketPassInterface_Sender_Send(o->control.send_if, (uint8_t *)o->buffer, size.value); - - // set state - o->state = STATE_SENDING_PASSWORD; - } break; - - default: ASSERT(0); - } - } break; - - case STATE_SENT_REQUEST: { - BLog(BLOG_DEBUG, "received reply header"); - - struct socks_reply_header imsg; - memcpy(&imsg, o->buffer, sizeof(imsg)); - - if (ntoh8(imsg.ver) != SOCKS_VERSION) { - BLog(BLOG_NOTICE, "wrong version"); - goto fail; - } - - if (ntoh8(imsg.rep) != SOCKS_REP_SUCCEEDED) { - BLog(BLOG_NOTICE, "reply not successful"); - goto fail; - } - - int addr_len; - switch (ntoh8(imsg.atyp)) { - case SOCKS_ATYP_IPV4: - addr_len = sizeof(struct socks_addr_ipv4); - break; - case SOCKS_ATYP_IPV6: - addr_len = sizeof(struct socks_addr_ipv6); - break; - default: - BLog(BLOG_NOTICE, "reply has unknown address type"); - goto fail; - } - - // receive the rest of the reply - start_receive(o, (uint8_t *)o->buffer + sizeof(imsg), addr_len); - - // set state - o->state = STATE_RECEIVED_REPLY_HEADER; - } break; - - case STATE_SENT_PASSWORD: { - BLog(BLOG_DEBUG, "received password reply"); - - if (o->buffer[0] != 1) { - BLog(BLOG_NOTICE, "password reply has unknown version"); - goto fail; - } - - if (o->buffer[1] != 0) { - BLog(BLOG_NOTICE, "password reply is negative"); - goto fail; - } - - auth_finished(o); - } break; - - case STATE_RECEIVED_REPLY_HEADER: { - BLog(BLOG_DEBUG, "received reply rest"); - - // free buffer - BFree(o->buffer); - o->buffer = NULL; - - // free control I/O - free_control_io(o); - - // init up I/O - init_up_io(o); - - // set state - o->state = STATE_UP; - - // call handler - o->handler(o->user, BSOCKSCLIENT_EVENT_UP); - return; - } break; - - default: - ASSERT(0); - } - - return; - -fail: - report_error(o, BSOCKSCLIENT_EVENT_ERROR); -} - -void send_handler_done (BSocksClient *o) -{ - DebugObject_Access(&o->d_obj); - ASSERT(o->buffer) -#if TCP_DATA_LOG_ENABLE - struct in_addr a = {o->dest_addr.ipv4.ip}; - char *ip = inet_ntoa(a); - BLog(BLOG_DEBUG, "socks client<%s:%d> send_handler_done state: %d", ip, o->dest_addr.ipv4.port, o->state); -#endif - - switch (o->state) { - case STATE_SENDING_HELLO: { - BLog(BLOG_DEBUG, "sent hello"); - - // allocate buffer for receiving hello - bsize_t size = bsize_fromsize(sizeof(struct socks_server_hello)); - if (!reserve_buffer(o, size)) { - goto fail; - } - - // receive hello - start_receive(o, (uint8_t *)o->buffer, size.value); - - // set state - o->state = STATE_SENT_HELLO; - } break; - - case STATE_SENDING_REQUEST: { - BLog(BLOG_DEBUG, "sent request"); - - // allocate buffer for receiving reply - bsize_t size = bsize_add( - bsize_fromsize(sizeof(struct socks_reply_header)), - bsize_max(bsize_fromsize(sizeof(struct socks_addr_ipv4)), bsize_fromsize(sizeof(struct socks_addr_ipv6))) - ); - if (!reserve_buffer(o, size)) { - goto fail; - } - - // receive reply header - start_receive(o, (uint8_t *)o->buffer, sizeof(struct socks_reply_header)); - - // set state - o->state = STATE_SENT_REQUEST; - } break; - - case STATE_SENDING_PASSWORD: { - BLog(BLOG_DEBUG, "send password"); - - // allocate buffer for receiving reply - bsize_t size = bsize_fromsize(2); - if (!reserve_buffer(o, size)) { - goto fail; - } - - // receive reply header - start_receive(o, (uint8_t *)o->buffer, size.value); - - // set state - o->state = STATE_SENT_PASSWORD; - } break; - - default: - ASSERT(0); - } - - return; - -fail: - report_error(o, BSOCKSCLIENT_EVENT_ERROR); -} - -void auth_finished (BSocksClient *o) -{ - // allocate request buffer - bsize_t size = bsize_fromsize(sizeof(struct socks_request_header)); - switch (o->dest_addr.type) { - case BADDR_TYPE_IPV4: size = bsize_add(size, bsize_fromsize(sizeof(struct socks_addr_ipv4))); break; - case BADDR_TYPE_IPV6: size = bsize_add(size, bsize_fromsize(sizeof(struct socks_addr_ipv6))); break; - } - if (!reserve_buffer(o, size)) { - report_error(o, BSOCKSCLIENT_EVENT_ERROR); - return; - } - - // write request - struct socks_request_header header; - header.ver = hton8(SOCKS_VERSION); - header.cmd = hton8(SOCKS_CMD_CONNECT); - header.rsv = hton8(0); - switch (o->dest_addr.type) { - case BADDR_TYPE_IPV4: { - header.atyp = hton8(SOCKS_ATYP_IPV4); - struct socks_addr_ipv4 addr; - addr.addr = o->dest_addr.ipv4.ip; - addr.port = o->dest_addr.ipv4.port; - memcpy(o->buffer + sizeof(header), &addr, sizeof(addr)); - } break; - case BADDR_TYPE_IPV6: { - header.atyp = hton8(SOCKS_ATYP_IPV6); - struct socks_addr_ipv6 addr; - memcpy(addr.addr, o->dest_addr.ipv6.ip, sizeof(o->dest_addr.ipv6.ip)); - addr.port = o->dest_addr.ipv6.port; - memcpy(o->buffer + sizeof(header), &addr, sizeof(addr)); - } break; - default: - ASSERT(0); - } - memcpy(o->buffer, &header, sizeof(header)); -#if SOCKS_DATA_LOG_ENABLE - BLog(BLOG_DEBUG, "tun2socks socks send request data", size.value); -#endif - // send request - PacketPassInterface_Sender_Send(o->control.send_if, (uint8_t *)o->buffer, size.value); - - // set state - o->state = STATE_SENDING_REQUEST; -} - -struct BSocksClient_auth_info BSocksClient_auth_none (void) -{ - struct BSocksClient_auth_info info; - info.auth_type = SOCKS_METHOD_NO_AUTHENTICATION_REQUIRED; - return info; -} - -struct BSocksClient_auth_info BSocksClient_auth_password (const char *username, size_t username_len, const char *password, size_t password_len) -{ - struct BSocksClient_auth_info info; - info.auth_type = SOCKS_METHOD_USERNAME_PASSWORD; - info.password.username = username; - info.password.username_len = username_len; - info.password.password = password; - info.password.password_len = password_len; - return info; -} - -int BSocksClient_Init (BSocksClient *o, - BAddr server_addr, const struct BSocksClient_auth_info *auth_info, size_t num_auth_info, - BAddr dest_addr, BSocksClient_handler handler, void *user, BReactor *reactor) -{ - ASSERT(!BAddr_IsInvalid(&server_addr)) - ASSERT(dest_addr.type == BADDR_TYPE_IPV4 || dest_addr.type == BADDR_TYPE_IPV6) -#ifndef NDEBUG - for (size_t i = 0; i < num_auth_info; i++) { - ASSERT(auth_info[i].auth_type == SOCKS_METHOD_NO_AUTHENTICATION_REQUIRED || - auth_info[i].auth_type == SOCKS_METHOD_USERNAME_PASSWORD) - } -#endif - - // init arguments - o->auth_info = auth_info; - o->num_auth_info = num_auth_info; - o->dest_addr = dest_addr; - o->handler = handler; - o->user = user; - o->reactor = reactor; - - // set no buffer - o->buffer = NULL; - - // init connector - if (!BConnector_Init(&o->connector, server_addr, o->reactor, o, (BConnector_handler)connector_handler)) { - BLog(BLOG_ERROR, "BConnector_Init failed"); - goto fail0; - } - - // set state - o->state = STATE_CONNECTING; - - DebugError_Init(&o->d_err, BReactor_PendingGroup(o->reactor)); - DebugObject_Init(&o->d_obj); - return 1; - -fail0: - return 0; -} - -void BSocksClient_Free (BSocksClient *o) -{ - DebugObject_Free(&o->d_obj); - DebugError_Free(&o->d_err); - - if (o->state != STATE_CONNECTING) { - if (o->state == STATE_UP) { - // free up I/O - free_up_io(o); - } else { - // free control I/O - free_control_io(o); - } - - // free connection - BConnection_Free(&o->con); - } - - // free connector - BConnector_Free(&o->connector); - - // free buffer - if (o->buffer) { - BFree(o->buffer); - } -} - -StreamPassInterface * BSocksClient_GetSendInterface (BSocksClient *o) -{ - ASSERT(o->state == STATE_UP) - DebugObject_Access(&o->d_obj); - - return BConnection_SendAsync_GetIf(&o->con); -} - -StreamRecvInterface * BSocksClient_GetRecvInterface (BSocksClient *o) -{ - ASSERT(o->state == STATE_UP) - DebugObject_Access(&o->d_obj); - - return BConnection_RecvAsync_GetIf(&o->con); -} diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/socksclient/BSocksClient.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/socksclient/BSocksClient.h deleted file mode 100644 index 41c69505..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/socksclient/BSocksClient.h +++ /dev/null @@ -1,147 +0,0 @@ -/** - * @file BSocksClient.h - * @author Ambroz Bizjak - * - * @section LICENSE - * - * 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 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE 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. - * - * @section DESCRIPTION - * - * SOCKS5 client. TCP only, no authentication. - */ - -#ifndef BADVPN_SOCKS_BSOCKSCLIENT_H -#define BADVPN_SOCKS_BSOCKSCLIENT_H - -#include - -#include "misc/debug.h" -#include "misc/debugerror.h" -#include "misc/socks_proto.h" -#include "misc/packed.h" -#include "base/DebugObject.h" -#include "system/BConnection.h" -#include "flow/PacketStreamSender.h" - -#define BSOCKSCLIENT_EVENT_ERROR 1 -#define BSOCKSCLIENT_EVENT_UP 2 -#define BSOCKSCLIENT_EVENT_ERROR_CLOSED 3 - -/** - * Handler for events generated by the SOCKS client. - * - * @param user as in {@link BSocksClient_Init} - * @param event event type. One of BSOCKSCLIENT_EVENT_ERROR, BSOCKSCLIENT_EVENT_UP - * and BSOCKSCLIENT_EVENT_ERROR_CLOSED. - * If event is BSOCKSCLIENT_EVENT_UP, the object was previously in down - * state and has transitioned to up state; I/O can be done from this point on. - * If event is BSOCKSCLIENT_EVENT_ERROR or BSOCKSCLIENT_EVENT_ERROR_CLOSED, - * the object must be freed from within the job closure of this handler, - * and no further I/O must be attempted. - */ -typedef void (*BSocksClient_handler) (void *user, int event); - -struct BSocksClient_auth_info { - int auth_type; - union { - struct { - const char *username; - size_t username_len; - const char *password; - size_t password_len; - } password; - }; -}; - -typedef struct { - const struct BSocksClient_auth_info *auth_info; - size_t num_auth_info; - BAddr dest_addr; - BSocksClient_handler handler; - void *user; - BReactor *reactor; - int state; - char *buffer; - BConnector connector; - BConnection con; - union { - struct { - PacketPassInterface *send_if; - PacketStreamSender send_sender; - StreamRecvInterface *recv_if; - uint8_t *recv_dest; - int recv_len; - int recv_total; - } control; - }; - DebugError d_err; - DebugObject d_obj; -} BSocksClient; - -struct BSocksClient_auth_info BSocksClient_auth_none (void); -struct BSocksClient_auth_info BSocksClient_auth_password (const char *username, size_t username_len, const char *password, size_t password_len); - -/** - * Initializes the object. - * The object is initialized in down state. The object must transition to up - * state before the user may begin any I/O. - * - * @param o the object - * @param server_addr SOCKS5 server address - * @param dest_addr remote address - * @param handler handler for up and error events - * @param user value passed to handler - * @param reactor reactor we live in - * @return 1 on success, 0 on failure - */ -int BSocksClient_Init (BSocksClient *o, - BAddr server_addr, const struct BSocksClient_auth_info *auth_info, size_t num_auth_info, - BAddr dest_addr, BSocksClient_handler handler, void *user, BReactor *reactor) WARN_UNUSED; - -/** - * Frees the object. - * - * @param o the object - */ -void BSocksClient_Free (BSocksClient *o); - -/** - * Returns the send interface. - * The object must be in up state. - * - * @param o the object - * @return send interface - */ -StreamPassInterface * BSocksClient_GetSendInterface (BSocksClient *o); - -/** - * Returns the receive interface. - * The object must be in up state. - * - * @param o the object - * @return receive interface - */ -StreamRecvInterface * BSocksClient_GetRecvInterface (BSocksClient *o); - -#endif diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/structure/BAVL.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/structure/BAVL.h deleted file mode 100644 index fc6f540e..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/structure/BAVL.h +++ /dev/null @@ -1,797 +0,0 @@ -/** - * @file BAVL.h - * @author Ambroz Bizjak - * - * @section LICENSE - * - * 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 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE 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. - * - * @section DESCRIPTION - * - * AVL tree. - */ - -#ifndef BADVPN_STRUCTURE_BAVL_H -#define BADVPN_STRUCTURE_BAVL_H - -//#define BAVL_DEBUG - -#include -#include - -#include "misc/debug.h" - -/** - * Handler function called by tree algorithms to compare two values. - * For any two values, the comparator must always return the same result. - * The <= relation defined by the comparator must be a total order. - * Values are obtained like that: - * - The value of a node in the tree, or a node that is being inserted is: - * (uint8_t *)node + offset. - * - The value being looked up is the same as given to the lookup function. - * - * @param user as in {@link BAVL_Init} - * @param val1 first value - * @param val2 second value - * @return -1 if val1 < val2, 0 if val1 = val2, 1 if val1 > val2 - */ -typedef int (*BAVL_comparator) (void *user, void *val1, void *val2); - -struct BAVLNode; - -/** - * AVL tree. - */ -typedef struct { - int offset; - BAVL_comparator comparator; - void *user; - struct BAVLNode *root; -} BAVL; - -/** - * AVL tree node. - */ -typedef struct BAVLNode { - struct BAVLNode *parent; - struct BAVLNode *link[2]; - int8_t balance; -#ifdef BAVL_COUNT - uint64_t count; -#endif -} BAVLNode; - -/** - * Initializes the tree. - * - * @param o tree to initialize - * @param offset offset of a value from its node - * @param comparator value comparator handler function - * @param user value to pass to comparator - */ -static void BAVL_Init (BAVL *o, int offset, BAVL_comparator comparator, void *user); - -/** - * Inserts a node into the tree. - * Must not be called from comparator. - * - * @param o the tree - * @param node uninitialized node to insert. Must have a valid value (its value - * may be passed to the comparator during insertion). - * @param ref if not NULL, will return (regardless if insertion succeeded): - * - the greatest node lesser than the inserted value, or (not in order) - * - the smallest node greater than the inserted value, or - * - NULL meaning there were no nodes in the tree. - * @param 1 on success, 0 if an element with an equal value is already in the tree - */ -static int BAVL_Insert (BAVL *o, BAVLNode *node, BAVLNode **ref); - -/** - * Removes a node from the tree. - * Must not be called from comparator. - * - * @param o the tree - * @param node node to remove - */ -static void BAVL_Remove (BAVL *o, BAVLNode *node); - -/** - * Checks if the tree is empty. - * Must not be called from comparator. - * - * @param o the tree - * @return 1 if empty, 0 if not - */ -static int BAVL_IsEmpty (const BAVL *o); - -/** - * Looks for a value in the tree. - * Must not be called from comparator. - * - * @param o the tree - * @param val value to look for - * @return If a node is in the thee with an equal value, that node. - * Else if the tree is not empty: - * - the greatest node lesser than the given value, or (not in order) - * - the smallest node greater than the given value. - * NULL if the tree is empty. - */ -static BAVLNode * BAVL_Lookup (const BAVL *o, void *val); - -/** - * Looks for a value in the tree. - * Must not be called from comparator. - * - * @param o the tree - * @param val value to look for - * @return If a node is in the thee with an equal value, that node. - * Else NULL. - */ -static BAVLNode * BAVL_LookupExact (const BAVL *o, void *val); - -/** - * Returns the smallest node in the tree, or NULL if the tree is empty. - * - * @param o the tree - * @return smallest node or NULL - */ -static BAVLNode * BAVL_GetFirst (const BAVL *o); - -/** - * Returns the greatest node in the tree, or NULL if the tree is empty. - * - * @param o the tree - * @return greatest node or NULL - */ -static BAVLNode * BAVL_GetLast (const BAVL *o); - -/** - * Returns the node that follows the given node, or NULL if it's the - * last node. - * - * @param o the tree - * @param n node - * @return next node, or NULL - */ -static BAVLNode * BAVL_GetNext (const BAVL *o, BAVLNode *n); - -/** - * Returns the node that precedes the given node, or NULL if it's the - * first node. - * - * @param o the tree - * @param n node - * @return previous node, or NULL - */ -static BAVLNode * BAVL_GetPrev (const BAVL *o, BAVLNode *n); - -#ifdef BAVL_COUNT -static uint64_t BAVL_Count (const BAVL *o); -static uint64_t BAVL_IndexOf (const BAVL *o, BAVLNode *n); -static BAVLNode * BAVL_GetAt (const BAVL *o, uint64_t index); -#endif - -static void BAVL_Verify (BAVL *o); - -#define BAVL_MAX(_a, _b) ((_a) > (_b) ? (_a) : (_b)) -#define BAVL_OPTNEG(_a, _neg) ((_neg) ? -(_a) : (_a)) - -static void * _BAVL_node_value (const BAVL *o, BAVLNode *n) -{ - return ((uint8_t *)n + o->offset); -} - -static int _BAVL_compare_values (const BAVL *o, void *v1, void *v2) -{ - int res = o->comparator(o->user, v1, v2); - - ASSERT(res == -1 || res == 0 || res == 1) - - return res; -} - -static int _BAVL_compare_nodes (BAVL *o, BAVLNode *n1, BAVLNode *n2) -{ - return _BAVL_compare_values(o, _BAVL_node_value(o, n1), _BAVL_node_value(o, n2)); -} - -#ifdef BAVL_AUTO_VERIFY -#define BAVL_ASSERT(_h) BAVL_Verify((_h)); -#else -#define BAVL_ASSERT(_h) -#endif - -static int _BAVL_assert_recurser (BAVL *o, BAVLNode *n) -{ - ASSERT_FORCE(n->balance >= -1) - ASSERT_FORCE(n->balance <= 1) - - int height_left = 0; - int height_right = 0; -#ifdef BAVL_COUNT - uint64_t count_left = 0; - uint64_t count_right = 0; -#endif - - // check left subtree - if (n->link[0]) { - // check parent link - ASSERT_FORCE(n->link[0]->parent == n) - // check binary search tree - ASSERT_FORCE(_BAVL_compare_nodes(o, n->link[0], n) == -1) - // recursively calculate height - height_left = _BAVL_assert_recurser(o, n->link[0]); -#ifdef BAVL_COUNT - count_left = n->link[0]->count; -#endif - } - - // check right subtree - if (n->link[1]) { - // check parent link - ASSERT_FORCE(n->link[1]->parent == n) - // check binary search tree - ASSERT_FORCE(_BAVL_compare_nodes(o, n->link[1], n) == 1) - // recursively calculate height - height_right = _BAVL_assert_recurser(o, n->link[1]); -#ifdef BAVL_COUNT - count_right = n->link[1]->count; -#endif - } - - // check balance factor - ASSERT_FORCE(n->balance == height_right - height_left) - -#ifdef BAVL_COUNT - // check count - ASSERT_FORCE(n->count == 1 + count_left + count_right) -#endif - - return (BAVL_MAX(height_left, height_right) + 1); -} - -#ifdef BAVL_COUNT -static void _BAVL_update_count_from_children (BAVLNode *n) -{ - n->count = 1 + (n->link[0] ? n->link[0]->count : 0) + (n->link[1] ? n->link[1]->count : 0); -} -#endif - -static void _BAVL_rotate (BAVL *tree, BAVLNode *r, uint8_t dir) -{ - BAVLNode *nr = r->link[!dir]; - - r->link[!dir] = nr->link[dir]; - if (r->link[!dir]) { - r->link[!dir]->parent = r; - } - nr->link[dir] = r; - nr->parent = r->parent; - if (nr->parent) { - nr->parent->link[r == r->parent->link[1]] = nr; - } else { - tree->root = nr; - } - r->parent = nr; - -#ifdef BAVL_COUNT - // update counts - _BAVL_update_count_from_children(r); // first r! - _BAVL_update_count_from_children(nr); -#endif -} - -static BAVLNode * _BAVL_subtree_max (BAVLNode *n) -{ - ASSERT(n) - while (n->link[1]) { - n = n->link[1]; - } - return n; -} - -static void _BAVL_replace_subtree (BAVL *tree, BAVLNode *dest, BAVLNode *n) -{ - ASSERT(dest) - - if (dest->parent) { - dest->parent->link[dest == dest->parent->link[1]] = n; - } else { - tree->root = n; - } - if (n) { - n->parent = dest->parent; - } - -#ifdef BAVL_COUNT - // update counts - for (BAVLNode *c = dest->parent; c; c = c->parent) { - ASSERT(c->count >= dest->count) - c->count -= dest->count; - if (n) { - ASSERT(n->count <= UINT64_MAX - c->count) - c->count += n->count; - } - } -#endif -} - -static void _BAVL_swap_nodes (BAVL *tree, BAVLNode *n1, BAVLNode *n2) -{ - if (n2->parent == n1 || n1->parent == n2) { - // when the nodes are directly connected we need special handling - // make sure n1 is above n2 - if (n1->parent == n2) { - BAVLNode *t = n1; - n1 = n2; - n2 = t; - } - - uint8_t side = (n2 == n1->link[1]); - BAVLNode *c = n1->link[!side]; - - if (n1->link[0] = n2->link[0]) { - n1->link[0]->parent = n1; - } - if (n1->link[1] = n2->link[1]) { - n1->link[1]->parent = n1; - } - - if (n2->parent = n1->parent) { - n2->parent->link[n1 == n1->parent->link[1]] = n2; - } else { - tree->root = n2; - } - - n2->link[side] = n1; - n1->parent = n2; - if (n2->link[!side] = c) { - c->parent = n2; - } - } else { - BAVLNode *temp; - - // swap parents - temp = n1->parent; - if (n1->parent = n2->parent) { - n1->parent->link[n2 == n2->parent->link[1]] = n1; - } else { - tree->root = n1; - } - if (n2->parent = temp) { - n2->parent->link[n1 == temp->link[1]] = n2; - } else { - tree->root = n2; - } - - // swap left children - temp = n1->link[0]; - if (n1->link[0] = n2->link[0]) { - n1->link[0]->parent = n1; - } - if (n2->link[0] = temp) { - n2->link[0]->parent = n2; - } - - // swap right children - temp = n1->link[1]; - if (n1->link[1] = n2->link[1]) { - n1->link[1]->parent = n1; - } - if (n2->link[1] = temp) { - n2->link[1]->parent = n2; - } - } - - // swap balance factors - int8_t b = n1->balance; - n1->balance = n2->balance; - n2->balance = b; - -#ifdef BAVL_COUNT - // swap counts - uint64_t c = n1->count; - n1->count = n2->count; - n2->count = c; -#endif -} - -static void _BAVL_rebalance (BAVL *o, BAVLNode *node, uint8_t side, int8_t deltac) -{ - ASSERT(side == 0 || side == 1) - ASSERT(deltac >= -1 && deltac <= 1) - ASSERT(node->balance >= -1 && node->balance <= 1) - - // if no subtree changed its height, no more rebalancing is needed - if (deltac == 0) { - return; - } - - // calculate how much our height changed - int8_t delta = BAVL_MAX(deltac, BAVL_OPTNEG(node->balance, side)) - BAVL_MAX(0, BAVL_OPTNEG(node->balance, side)); - ASSERT(delta >= -1 && delta <= 1) - - // update our balance factor - node->balance -= BAVL_OPTNEG(deltac, side); - - BAVLNode *child; - BAVLNode *gchild; - - // perform transformations if the balance factor is wrong - if (node->balance == 2 || node->balance == -2) { - uint8_t bside; - int8_t bsidef; - if (node->balance == 2) { - bside = 1; - bsidef = 1; - } else { - bside = 0; - bsidef = -1; - } - - ASSERT(node->link[bside]) - child = node->link[bside]; - switch (child->balance * bsidef) { - case 1: - _BAVL_rotate(o, node, !bside); - node->balance = 0; - child->balance = 0; - node = child; - delta -= 1; - break; - case 0: - _BAVL_rotate(o, node, !bside); - node->balance = 1 * bsidef; - child->balance = -1 * bsidef; - node = child; - break; - case -1: - ASSERT(child->link[!bside]) - gchild = child->link[!bside]; - _BAVL_rotate(o, child, bside); - _BAVL_rotate(o, node, !bside); - node->balance = -BAVL_MAX(0, gchild->balance * bsidef) * bsidef; - child->balance = BAVL_MAX(0, -gchild->balance * bsidef) * bsidef; - gchild->balance = 0; - node = gchild; - delta -= 1; - break; - default: - ASSERT(0); - } - } - - ASSERT(delta >= -1 && delta <= 1) - // Transformations above preserve this. Proof: - // - if a child subtree gained 1 height and rebalancing was needed, - // it was the heavier subtree. Then delta was was originally 1, because - // the heaviest subtree gained one height. If the transformation reduces - // delta by one, it becomes 0. - // - if a child subtree lost 1 height and rebalancing was needed, it - // was the lighter subtree. Then delta was originally 0, because - // the height of the heaviest subtree was unchanged. If the transformation - // reduces delta by one, it becomes -1. - - if (node->parent) { - _BAVL_rebalance(o, node->parent, node == node->parent->link[1], delta); - } -} - -void BAVL_Init (BAVL *o, int offset, BAVL_comparator comparator, void *user) -{ - o->offset = offset; - o->comparator = comparator; - o->user = user; - o->root = NULL; - - BAVL_ASSERT(o) -} - -int BAVL_Insert (BAVL *o, BAVLNode *node, BAVLNode **ref) -{ - // insert to root? - if (!o->root) { - o->root = node; - node->parent = NULL; - node->link[0] = NULL; - node->link[1] = NULL; - node->balance = 0; -#ifdef BAVL_COUNT - node->count = 1; -#endif - - BAVL_ASSERT(o) - - if (ref) { - *ref = NULL; - } - return 1; - } - - // find node to insert to - BAVLNode *c = o->root; - int side; - while (1) { - // compare - int comp = _BAVL_compare_nodes(o, node, c); - - // have we found a node that compares equal? - if (comp == 0) { - if (ref) { - *ref = c; - } - return 0; - } - - side = (comp == 1); - - // have we reached a leaf? - if (!c->link[side]) { - break; - } - - c = c->link[side]; - } - - // insert - c->link[side] = node; - node->parent = c; - node->link[0] = NULL; - node->link[1] = NULL; - node->balance = 0; -#ifdef BAVL_COUNT - node->count = 1; -#endif - -#ifdef BAVL_COUNT - // update counts - for (BAVLNode *p = c; p; p = p->parent) { - ASSERT(p->count < UINT64_MAX) - p->count++; - } -#endif - - // rebalance - _BAVL_rebalance(o, c, side, 1); - - BAVL_ASSERT(o) - - if (ref) { - *ref = c; - } - return 1; -} - -void BAVL_Remove (BAVL *o, BAVLNode *node) -{ - // if we have both subtrees, swap the node and the largest node - // in the left subtree, so we have at most one subtree - if (node->link[0] && node->link[1]) { - // find the largest node in the left subtree - BAVLNode *max = _BAVL_subtree_max(node->link[0]); - // swap the nodes - _BAVL_swap_nodes(o, node, max); - } - - // have at most one child now - ASSERT(!(node->link[0] && node->link[1])) - - BAVLNode *parent = node->parent; - BAVLNode *child = (node->link[0] ? node->link[0] : node->link[1]); - - if (parent) { - // remember on which side node is - int side = (node == parent->link[1]); - // replace node with child - _BAVL_replace_subtree(o, node, child); - // rebalance - _BAVL_rebalance(o, parent, side, -1); - } else { - // replace node with child - _BAVL_replace_subtree(o, node, child); - } - - BAVL_ASSERT(o) -} - -int BAVL_IsEmpty (const BAVL *o) -{ - return (!o->root); -} - -BAVLNode * BAVL_Lookup (const BAVL *o, void *val) -{ - if (!o->root) { - return NULL; - } - - BAVLNode *c = o->root; - while (1) { - // compare - int comp = _BAVL_compare_values(o, val, _BAVL_node_value(o, c)); - - // have we found a node that compares equal? - if (comp == 0) { - return c; - } - - int side = (comp == 1); - - // have we reached a leaf? - if (!c->link[side]) { - return c; - } - - c = c->link[side]; - } -} - -BAVLNode * BAVL_LookupExact (const BAVL *o, void *val) -{ - if (!o->root) { - return NULL; - } - - BAVLNode *c = o->root; - while (1) { - // compare - int comp = _BAVL_compare_values(o, val, _BAVL_node_value(o, c)); - - // have we found a node that compares equal? - if (comp == 0) { - return c; - } - - int side = (comp == 1); - - // have we reached a leaf? - if (!c->link[side]) { - return NULL; - } - - c = c->link[side]; - } -} - -BAVLNode * BAVL_GetFirst (const BAVL *o) -{ - if (!o->root) { - return NULL; - } - - BAVLNode *n = o->root; - while (n->link[0]) { - n = n->link[0]; - } - - return n; -} - -BAVLNode * BAVL_GetLast (const BAVL *o) -{ - if (!o->root) { - return NULL; - } - - BAVLNode *n = o->root; - while (n->link[1]) { - n = n->link[1]; - } - - return n; -} - -BAVLNode * BAVL_GetNext (const BAVL *o, BAVLNode *n) -{ - if (n->link[1]) { - n = n->link[1]; - while (n->link[0]) { - n = n->link[0]; - } - } else { - while (n->parent && n == n->parent->link[1]) { - n = n->parent; - } - n = n->parent; - } - - return n; -} - -BAVLNode * BAVL_GetPrev (const BAVL *o, BAVLNode *n) -{ - if (n->link[0]) { - n = n->link[0]; - while (n->link[1]) { - n = n->link[1]; - } - } else { - while (n->parent && n == n->parent->link[0]) { - n = n->parent; - } - n = n->parent; - } - - return n; -} - -#ifdef BAVL_COUNT - -static uint64_t BAVL_Count (const BAVL *o) -{ - return (o->root ? o->root->count : 0); -} - -static uint64_t BAVL_IndexOf (const BAVL *o, BAVLNode *n) -{ - uint64_t index = (n->link[0] ? n->link[0]->count : 0); - - for (BAVLNode *c = n; c->parent; c = c->parent) { - if (c == c->parent->link[1]) { - ASSERT(c->parent->count > c->count) - ASSERT(c->parent->count - c->count <= UINT64_MAX - index) - index += c->parent->count - c->count; - } - } - - return index; -} - -static BAVLNode * BAVL_GetAt (const BAVL *o, uint64_t index) -{ - if (index >= BAVL_Count(o)) { - return NULL; - } - - BAVLNode *c = o->root; - - while (1) { - ASSERT(c) - ASSERT(index < c->count) - - uint64_t left_count = (c->link[0] ? c->link[0]->count : 0); - - if (index == left_count) { - return c; - } - - if (index < left_count) { - c = c->link[0]; - } else { - c = c->link[1]; - index -= left_count + 1; - } - } -} - -#endif - -static void BAVL_Verify (BAVL *o) -{ - if (o->root) { - ASSERT(!o->root->parent) - _BAVL_assert_recurser(o, o->root); - } -} - -#endif diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/structure/CAvl.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/structure/CAvl.h deleted file mode 100644 index 6d98194b..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/structure/CAvl.h +++ /dev/null @@ -1,36 +0,0 @@ -/** - * @file CAvl.h - * @author Ambroz Bizjak - * - * @section LICENSE - * - * 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 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE 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. - */ - -#ifndef BADVPN_CAVL_H -#define BADVPN_CAVL_H - -#include "misc/debug.h" -#include "misc/merge.h" - -#endif diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/structure/CAvl_decl.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/structure/CAvl_decl.h deleted file mode 100644 index 7d54a815..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/structure/CAvl_decl.h +++ /dev/null @@ -1,77 +0,0 @@ -/** - * @file CAvl_decl.h - * @author Ambroz Bizjak - * - * @section LICENSE - * - * 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 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE 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. - */ - -#include "CAvl_header.h" - -typedef struct { - CAvlLink root; -} CAvl; - -typedef struct { - CAvlEntry *ptr; - CAvlLink link; -} CAvlRef; - -static int CAvlIsNullRef (CAvlRef node); -static int CAvlIsValidRef (CAvlRef node); -static CAvlRef CAvlDeref (CAvlArg arg, CAvlLink link); - -static void CAvl_Init (CAvl *o); -#if !CAVL_PARAM_FEATURE_KEYS_ARE_INDICES -static int CAvl_Insert (CAvl *o, CAvlArg arg, CAvlRef node, CAvlRef *out_ref); -#else -static void CAvl_InsertAt (CAvl *o, CAvlArg arg, CAvlRef node, CAvlCount index); -#endif -static void CAvl_Remove (CAvl *o, CAvlArg arg, CAvlRef node); -#if !CAVL_PARAM_FEATURE_KEYS_ARE_INDICES && !CAVL_PARAM_FEATURE_NOKEYS -static CAvlRef CAvl_Lookup (const CAvl *o, CAvlArg arg, CAvlKey key); -static CAvlRef CAvl_LookupExact (const CAvl *o, CAvlArg arg, CAvlKey key); -static CAvlRef CAvl_GetFirstGreater (const CAvl *o, CAvlArg arg, CAvlKey key); -static CAvlRef CAvl_GetLastLesser (const CAvl *o, CAvlArg arg, CAvlKey key); -static CAvlRef CAvl_GetFirstGreaterEqual (const CAvl *o, CAvlArg arg, CAvlKey key); -static CAvlRef CAvl_GetLastLesserEqual (const CAvl *o, CAvlArg arg, CAvlKey key); -#endif -static CAvlRef CAvl_GetFirst (const CAvl *o, CAvlArg arg); -static CAvlRef CAvl_GetLast (const CAvl *o, CAvlArg arg); -static CAvlRef CAvl_GetNext (const CAvl *o, CAvlArg arg, CAvlRef node); -static CAvlRef CAvl_GetPrev (const CAvl *o, CAvlArg arg, CAvlRef node); -static int CAvl_IsEmpty (const CAvl *o); -static void CAvl_Verify (const CAvl *o, CAvlArg arg); -#if CAVL_PARAM_FEATURE_COUNTS -static CAvlCount CAvl_Count (const CAvl *o, CAvlArg arg); -static CAvlCount CAvl_IndexOf (const CAvl *o, CAvlArg arg, CAvlRef node); -static CAvlRef CAvl_GetAt (const CAvl *o, CAvlArg arg, CAvlCount index); -#endif -#if CAVL_PARAM_FEATURE_ASSOC -static CAvlAssoc CAvl_AssocSum (const CAvl *o, CAvlArg arg); -static CAvlAssoc CAvl_ExclusiveAssocPrefixSum (const CAvl *o, CAvlArg arg, CAvlRef node); -static CAvlRef CAvl_FindLastExclusiveAssocPrefixSumLesserEqual (const CAvl *o, CAvlArg arg, CAvlAssoc sum, int (*sum_less) (void *, CAvlAssoc, CAvlAssoc), void *user); -#endif - -#include "CAvl_footer.h" diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/structure/CAvl_footer.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/structure/CAvl_footer.h deleted file mode 100644 index 43b85c3a..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/structure/CAvl_footer.h +++ /dev/null @@ -1,113 +0,0 @@ -/** - * @file CAvl_footer.h - * @author Ambroz Bizjak - * - * @section LICENSE - * - * 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 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE 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. - */ - -#undef CAVL_PARAM_NAME -#undef CAVL_PARAM_FEATURE_COUNTS -#undef CAVL_PARAM_FEATURE_KEYS_ARE_INDICES -#undef CAVL_PARAM_FEATURE_NOKEYS -#undef CAVL_PARAM_FEATURE_ASSOC -#undef CAVL_PARAM_TYPE_ENTRY -#undef CAVL_PARAM_TYPE_LINK -#undef CAVL_PARAM_TYPE_KEY -#undef CAVL_PARAM_TYPE_ARG -#undef CAVL_PARAM_TYPE_COUNT -#undef CAVL_PARAM_TYPE_ASSOC -#undef CAVL_PARAM_VALUE_COUNT_MAX -#undef CAVL_PARAM_VALUE_NULL -#undef CAVL_PARAM_VALUE_ASSOC_ZERO -#undef CAVL_PARAM_FUN_DEREF -#undef CAVL_PARAM_FUN_COMPARE_ENTRIES -#undef CAVL_PARAM_FUN_COMPARE_KEY_ENTRY -#undef CAVL_PARAM_FUN_ASSOC_VALUE -#undef CAVL_PARAM_FUN_ASSOC_OPER -#undef CAVL_PARAM_MEMBER_CHILD -#undef CAVL_PARAM_MEMBER_BALANCE -#undef CAVL_PARAM_MEMBER_PARENT -#undef CAVL_PARAM_MEMBER_COUNT -#undef CAVL_PARAM_MEMBER_ASSOC - -#undef CAvl -#undef CAvlEntry -#undef CAvlLink -#undef CAvlRef -#undef CAvlArg -#undef CAvlKey -#undef CAvlCount -#undef CAvlAssoc - -#undef CAvlIsNullRef -#undef CAvlIsValidRef -#undef CAvlDeref - -#undef CAvl_Init -#undef CAvl_Insert -#undef CAvl_InsertAt -#undef CAvl_Remove -#undef CAvl_Lookup -#undef CAvl_LookupExact -#undef CAvl_GetFirstGreater -#undef CAvl_GetLastLesser -#undef CAvl_GetFirstGreaterEqual -#undef CAvl_GetLastLesserEqual -#undef CAvl_GetFirst -#undef CAvl_GetLast -#undef CAvl_GetNext -#undef CAvl_GetPrev -#undef CAvl_IsEmpty -#undef CAvl_Verify -#undef CAvl_Count -#undef CAvl_IndexOf -#undef CAvl_GetAt -#undef CAvl_AssocSum -#undef CAvl_ExclusiveAssocPrefixSum -#undef CAvl_FindLastExclusiveAssocPrefixSumLesserEqual - -#undef CAvl_link -#undef CAvl_balance -#undef CAvl_parent -#undef CAvl_count -#undef CAvl_assoc -#undef CAvl_nulllink -#undef CAvl_nullref -#undef CAvl_compare_entries -#undef CAvl_compare_key_entry -#undef CAvl_compute_node_assoc -#undef CAvl_check_parent -#undef CAvl_verify_recurser -#undef CAvl_assert_tree -#undef CAvl_update_count_from_children -#undef CAvl_rotate -#undef CAvl_subtree_min -#undef CAvl_subtree_max -#undef CAvl_replace_subtree_fix_assoc -#undef CAvl_swap_for_remove -#undef CAvl_rebalance -#undef CAvl_child_count -#undef CAvl_MAX -#undef CAvl_OPTNEG diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/structure/CAvl_header.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/structure/CAvl_header.h deleted file mode 100644 index 91ea7df6..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/structure/CAvl_header.h +++ /dev/null @@ -1,141 +0,0 @@ -/** - * @file CAvl_header.h - * @author Ambroz Bizjak - * - * @section LICENSE - * - * 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 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE 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. - */ - -// Preprocessor inputs: -// CAVL_PARAM_NAME - name of this data structure -// CAVL_PARAM_FEATURE_COUNTS - whether to keep count information (0 or 1) -// CAVL_PARAM_FEATURE_KEYS_ARE_INDICES - (0 or 1) whether to assume the keys are entry indices -// (number of entries lesser than given entry). If yes, CAVL_PARAM_TYPE_KEY is unused. -// Requires CAVL_PARAM_FEATURE_COUNTS. -// CAVL_PARAM_FEATURE_NOKEYS - define to 1 if there is no need for a lookup operation -// CAVL_PARAM_FEATURE_ASSOC - define to 1 for computation of an associative operation on subtrees. -// If enabled, the following macros must be defined: CAVL_PARAM_TYPE_ASSOC, -// CAVL_PARAM_VALUE_ASSOC_ZERO, CAVL_PARAM_FUN_ASSOC_VALUE, -// CAVL_PARAM_FUN_ASSOC_OPER, CAVL_PARAM_MEMBER_ASSOC. -// CAVL_PARAM_TYPE_ENTRY - type of entry -// CAVL_PARAM_TYPE_LINK - type of entry link (usually pointer or index) -// CAVL_PARAM_TYPE_KEY - type of key (only if not CAVL_PARAM_FEATURE_KEYS_ARE_INDICES and -// not CAVL_PARAM_FEATURE_NOKEYS) -// CAVL_PARAM_TYPE_ARG - type of argument pass through to callbacks -// CAVL_PARAM_TYPE_COUNT - type of count (only if CAVL_PARAM_FEATURE_COUNTS) -// CAVL_PARAM_TYPE_ASSOC - type of associative operation result -// CAVL_PARAM_VALUE_COUNT_MAX - maximum value of count (type is CAVL_PARAM_TYPE_COUNT) -// CAVL_PARAM_VALUE_NULL - value of invalid link (type is CAVL_PARAM_TYPE_LINK) -// CAVL_PARAM_VALUE_ASSOC_ZERO - zero value for associative operation (type is CAVL_PARAM_TYPE_ASSOC). -// This must be both a left- and right-identity for the associative operation. -// CAVL_PARAM_FUN_DEREF(arg, link) - dereference a non-null link; returns pointer to CAVL_PARAM_TYPE_LINK -// CAVL_PARAM_FUN_COMPARE_ENTRIES(arg, entry1, entry2) - compare to entries; returns -1/0/1 -// CAVL_PARAM_FUN_COMPARE_KEY_ENTRY(arg, key1, entry2) - compare key and entry; returns -1/0/1 -// CAVL_PARAM_FUN_ASSOC_VALUE(arg, entry) - get value of a node for associative operation. -// The result will be cast to CAVL_PARAM_TYPE_ASSOC. -// CAVL_PARAM_FUN_ASSOC_OPER(arg, value1, value2) - compute the associative operation on two values. -// The type of the two values is CAVL_PARAM_TYPE_ASSOC, and the result will be cast to -// CAVL_PARAM_TYPE_ASSOC. -// CAVL_PARAM_MEMBER_CHILD - name of the child member in entry (type is CAVL_PARAM_TYPE_LINK[2]) -// CAVL_PARAM_MEMBER_BALANCE - name of the balance member in entry (type is any signed integer) -// CAVL_PARAM_MEMBER_PARENT - name of the parent member in entry (type is CAVL_PARAM_TYPE_LINK) -// CAVL_PARAM_MEMBER_COUNT - name of the count member in entry (type is CAVL_PARAM_TYPE_COUNT) -// (only if CAVL_PARAM_FEATURE_COUNTS) -// CAVL_PARAM_MEMBER_ASSOC - name of assoc member in entry (type is CAVL_PARAM_TYPE_ASSOC) - -#ifndef BADVPN_CAVL_H -#error CAvl.h has not been included -#endif - -#if CAVL_PARAM_FEATURE_KEYS_ARE_INDICES && !CAVL_PARAM_FEATURE_COUNTS -#error CAVL_PARAM_FEATURE_KEYS_ARE_INDICES requires CAVL_PARAM_FEATURE_COUNTS -#endif - -#if CAVL_PARAM_FEATURE_KEYS_ARE_INDICES && CAVL_PARAM_FEATURE_NOKEYS -#error CAVL_PARAM_FEATURE_KEYS_ARE_INDICES and CAVL_PARAM_FEATURE_NOKEYS cannot be used together -#endif - -// types -#define CAvl CAVL_PARAM_NAME -#define CAvlEntry CAVL_PARAM_TYPE_ENTRY -#define CAvlLink CAVL_PARAM_TYPE_LINK -#define CAvlRef MERGE(CAVL_PARAM_NAME, Ref) -#define CAvlArg CAVL_PARAM_TYPE_ARG -#define CAvlKey CAVL_PARAM_TYPE_KEY -#define CAvlCount CAVL_PARAM_TYPE_COUNT -#define CAvlAssoc CAVL_PARAM_TYPE_ASSOC - -// non-object public functions -#define CAvlIsNullRef MERGE(CAvl, IsNullRef) -#define CAvlIsValidRef MERGE(CAvl, IsValidRef) -#define CAvlDeref MERGE(CAvl, Deref) - -// public functions -#define CAvl_Init MERGE(CAvl, _Init) -#define CAvl_Insert MERGE(CAvl, _Insert) -#define CAvl_InsertAt MERGE(CAvl, _InsertAt) -#define CAvl_Remove MERGE(CAvl, _Remove) -#define CAvl_Lookup MERGE(CAvl, _Lookup) -#define CAvl_LookupExact MERGE(CAvl, _LookupExact) -#define CAvl_GetFirstGreater MERGE(CAvl, _GetFirstGreater) -#define CAvl_GetLastLesser MERGE(CAvl, _GetLastLesser) -#define CAvl_GetFirstGreaterEqual MERGE(CAvl, _GetFirstGreaterEqual) -#define CAvl_GetLastLesserEqual MERGE(CAvl, _GetLastLesserEqual) -#define CAvl_GetFirst MERGE(CAvl, _GetFirst) -#define CAvl_GetLast MERGE(CAvl, _GetLast) -#define CAvl_GetNext MERGE(CAvl, _GetNext) -#define CAvl_GetPrev MERGE(CAvl, _GetPrev) -#define CAvl_IsEmpty MERGE(CAvl, _IsEmpty) -#define CAvl_Verify MERGE(CAvl, _Verify) -#define CAvl_Count MERGE(CAvl, _Count) -#define CAvl_IndexOf MERGE(CAvl, _IndexOf) -#define CAvl_GetAt MERGE(CAvl, _GetAt) -#define CAvl_AssocSum MERGE(CAvl, _AssocSum) -#define CAvl_ExclusiveAssocPrefixSum MERGE(CAvl, _ExclusiveAssocPrefixSum) -#define CAvl_FindLastExclusiveAssocPrefixSumLesserEqual MERGE(CAvl, _FindLastExclusiveAssocPrefixSumLesserEqual) - -// private stuff -#define CAvl_link(entry) ((entry).ptr->CAVL_PARAM_MEMBER_CHILD) -#define CAvl_balance(entry) ((entry).ptr->CAVL_PARAM_MEMBER_BALANCE) -#define CAvl_parent(entry) ((entry).ptr->CAVL_PARAM_MEMBER_PARENT) -#define CAvl_count(entry) ((entry).ptr->CAVL_PARAM_MEMBER_COUNT) -#define CAvl_assoc(entry) ((entry).ptr->CAVL_PARAM_MEMBER_ASSOC) -#define CAvl_nulllink MERGE(CAvl, __nulllink) -#define CAvl_nullref MERGE(CAvl, __nullref) -#define CAvl_compare_entries MERGE(CAVL_PARAM_NAME, _compare_entries) -#define CAvl_compare_key_entry MERGE(CAVL_PARAM_NAME, _compare_key_entry) -#define CAvl_compute_node_assoc MERGE(CAVL_PARAM_NAME, _compute_node_assoc) -#define CAvl_check_parent MERGE(CAVL_PARAM_NAME, _check_parent) -#define CAvl_verify_recurser MERGE(CAVL_PARAM_NAME, _verify_recurser) -#define CAvl_assert_tree MERGE(CAVL_PARAM_NAME, _assert_tree) -#define CAvl_update_count_from_children MERGE(CAVL_PARAM_NAME, _update_count_from_children) -#define CAvl_rotate MERGE(CAVL_PARAM_NAME, _rotate) -#define CAvl_subtree_min MERGE(CAVL_PARAM_NAME, _subtree_min) -#define CAvl_subtree_max MERGE(CAVL_PARAM_NAME, _subtree_max) -#define CAvl_replace_subtree_fix_assoc MERGE(CAVL_PARAM_NAME, _replace_subtree_fix_counts) -#define CAvl_swap_for_remove MERGE(CAVL_PARAM_NAME, _swap_entries) -#define CAvl_rebalance MERGE(CAVL_PARAM_NAME, _rebalance) -#define CAvl_child_count MERGE(CAvl, __child_count) -#define CAvl_MAX(_a, _b) ((_a) > (_b) ? (_a) : (_b)) -#define CAvl_OPTNEG(_a, _neg) ((_neg) ? -(_a) : (_a)) diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/structure/CAvl_impl.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/structure/CAvl_impl.h deleted file mode 100644 index 984bdea1..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/structure/CAvl_impl.h +++ /dev/null @@ -1,949 +0,0 @@ -/** - * @file CAvl_impl.h - * @author Ambroz Bizjak - * - * @section LICENSE - * - * 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 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE 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. - */ - -#include "CAvl_header.h" - -static CAvlLink CAvl_nulllink (void) -{ - return CAVL_PARAM_VALUE_NULL; -} - -static CAvlRef CAvl_nullref (void) -{ - CAvlRef n; - n.link = CAVL_PARAM_VALUE_NULL; - n.ptr = NULL; - return n; -} - -#if !CAVL_PARAM_FEATURE_KEYS_ARE_INDICES - -static int CAvl_compare_entries (CAvlArg arg, CAvlRef node1, CAvlRef node2) -{ - int res = CAVL_PARAM_FUN_COMPARE_ENTRIES(arg, node1, node2); - ASSERT(res >= -1) - ASSERT(res <= 1) - - return res; -} - -#if !CAVL_PARAM_FEATURE_NOKEYS - -static int CAvl_compare_key_entry (CAvlArg arg, CAvlKey key1, CAvlRef node2) -{ - int res = CAVL_PARAM_FUN_COMPARE_KEY_ENTRY(arg, key1, node2); - ASSERT(res >= -1) - ASSERT(res <= 1) - - return res; -} - -#endif - -#endif - -#if CAVL_PARAM_FEATURE_ASSOC - -static CAvlAssoc CAvl_compute_node_assoc (CAvlArg arg, CAvlRef node) -{ - CAvlAssoc sum = CAVL_PARAM_FUN_ASSOC_VALUE(arg, node); - if (CAvl_link(node)[0] != CAvl_nulllink()) { - sum = CAVL_PARAM_FUN_ASSOC_OPER(arg, CAvl_assoc(CAvlDeref(arg, CAvl_link(node)[0])), sum); - } - if (CAvl_link(node)[1] != CAvl_nulllink()) { - sum = CAVL_PARAM_FUN_ASSOC_OPER(arg, sum, CAvl_assoc(CAvlDeref(arg, CAvl_link(node)[1]))); - } - return sum; -} - -#endif - -static int CAvl_check_parent (CAvlRef p, CAvlRef c) -{ - return (p.link == CAvl_parent(c)) && (p.link == CAvl_nulllink() || c.link == CAvl_link(p)[0] || c.link == CAvl_link(p)[1]); -} - -static int CAvl_verify_recurser (CAvlArg arg, CAvlRef n) -{ - ASSERT_FORCE(CAvl_balance(n) >= -1) - ASSERT_FORCE(CAvl_balance(n) <= 1) - - int height_left = 0; - int height_right = 0; -#if CAVL_PARAM_FEATURE_COUNTS - CAvlCount count_left = 0; - CAvlCount count_right = 0; -#endif - - // check left subtree - if (CAvl_link(n)[0] != CAvl_nulllink()) { - // check parent link - ASSERT_FORCE(CAvl_parent(CAvlDeref(arg, CAvl_link(n)[0])) == n.link) - // check binary search tree -#if !CAVL_PARAM_FEATURE_KEYS_ARE_INDICES - ASSERT_FORCE(CAvl_compare_entries(arg, CAvlDeref(arg, CAvl_link(n)[0]), n) == -1) -#endif - // recursively calculate height - height_left = CAvl_verify_recurser(arg, CAvlDeref(arg, CAvl_link(n)[0])); -#if CAVL_PARAM_FEATURE_COUNTS - count_left = CAvl_count(CAvlDeref(arg, CAvl_link(n)[0])); -#endif - } - - // check right subtree - if (CAvl_link(n)[1] != CAvl_nulllink()) { - // check parent link - ASSERT_FORCE(CAvl_parent(CAvlDeref(arg, CAvl_link(n)[1])) == n.link) - // check binary search tree -#if !CAVL_PARAM_FEATURE_KEYS_ARE_INDICES - ASSERT_FORCE(CAvl_compare_entries(arg, CAvlDeref(arg, CAvl_link(n)[1]), n) == 1) -#endif - // recursively calculate height - height_right = CAvl_verify_recurser(arg, CAvlDeref(arg, CAvl_link(n)[1])); -#if CAVL_PARAM_FEATURE_COUNTS - count_right = CAvl_count(CAvlDeref(arg, CAvl_link(n)[1])); -#endif - } - - // check balance factor - ASSERT_FORCE(CAvl_balance(n) == height_right - height_left) - -#if CAVL_PARAM_FEATURE_COUNTS - // check count - ASSERT_FORCE(CAvl_count(n) == 1 + count_left + count_right) -#endif - -#if CAVL_PARAM_FEATURE_ASSOC - // check assoc - ASSERT_FORCE(CAvl_assoc(n) == CAvl_compute_node_assoc(arg, n)) -#endif - - return CAvl_MAX(height_left, height_right) + 1; -} - -static void CAvl_assert_tree (CAvl *o, CAvlArg arg) -{ -#ifdef CAVL_AUTO_VERIFY - CAvl_Verify(o, arg); -#endif -} - -#if CAVL_PARAM_FEATURE_COUNTS -static void CAvl_update_count_from_children (CAvlArg arg, CAvlRef n) -{ - CAvlCount left_count = CAvl_link(n)[0] != CAvl_nulllink() ? CAvl_count(CAvlDeref(arg, CAvl_link(n)[0])) : 0; - CAvlCount right_count = CAvl_link(n)[1] != CAvl_nulllink() ? CAvl_count(CAvlDeref(arg, CAvl_link(n)[1])) : 0; - CAvl_count(n) = 1 + left_count + right_count; -} -#endif - -static void CAvl_rotate (CAvl *o, CAvlArg arg, CAvlRef r, uint8_t dir, CAvlRef r_parent) -{ - ASSERT(CAvl_check_parent(r_parent, r)) - CAvlRef nr = CAvlDeref(arg, CAvl_link(r)[!dir]); - - CAvl_link(r)[!dir] = CAvl_link(nr)[dir]; - if (CAvl_link(r)[!dir] != CAvl_nulllink()) { - CAvl_parent(CAvlDeref(arg, CAvl_link(r)[!dir])) = r.link; - } - CAvl_link(nr)[dir] = r.link; - CAvl_parent(nr) = r_parent.link; - if (r_parent.link != CAvl_nulllink()) { - CAvl_link(r_parent)[r.link == CAvl_link(r_parent)[1]] = nr.link; - } else { - o->root = nr.link; - } - CAvl_parent(r) = nr.link; - -#if CAVL_PARAM_FEATURE_COUNTS - CAvl_update_count_from_children(arg, r); - CAvl_update_count_from_children(arg, nr); -#endif - -#if CAVL_PARAM_FEATURE_ASSOC - CAvl_assoc(r) = CAvl_compute_node_assoc(arg, r); - CAvl_assoc(nr) = CAvl_compute_node_assoc(arg, nr); -#endif -} - -static CAvlRef CAvl_subtree_min (CAvlArg arg, CAvlRef n) -{ - ASSERT(n.link != CAvl_nulllink()) - - while (CAvl_link(n)[0] != CAvl_nulllink()) { - n = CAvlDeref(arg, CAvl_link(n)[0]); - } - - return n; -} - -static CAvlRef CAvl_subtree_max (CAvlArg arg, CAvlRef n) -{ - ASSERT(n.link != CAvl_nulllink()) - - while (CAvl_link(n)[1] != CAvl_nulllink()) { - n = CAvlDeref(arg, CAvl_link(n)[1]); - } - - return n; -} - -static void CAvl_replace_subtree_fix_assoc (CAvl *o, CAvlArg arg, CAvlRef dest, CAvlRef n, CAvlRef dest_parent) -{ - ASSERT(dest.link != CAvl_nulllink()) - ASSERT(CAvl_check_parent(dest_parent, dest)) - - if (dest_parent.link != CAvl_nulllink()) { - CAvl_link(dest_parent)[dest.link == CAvl_link(dest_parent)[1]] = n.link; - } else { - o->root = n.link; - } - if (n.link != CAvl_nulllink()) { - CAvl_parent(n) = CAvl_parent(dest); - } - -#if CAVL_PARAM_FEATURE_COUNTS || CAVL_PARAM_FEATURE_ASSOC - for (CAvlRef c = dest_parent; c.link != CAvl_nulllink(); c = CAvlDeref(arg, CAvl_parent(c))) { -#if CAVL_PARAM_FEATURE_COUNTS - ASSERT(CAvl_count(c) >= CAvl_count(dest)) - CAvl_count(c) -= CAvl_count(dest); - if (n.link != CAvl_nulllink()) { - ASSERT(CAvl_count(n) <= CAVL_PARAM_VALUE_COUNT_MAX - CAvl_count(c)) - CAvl_count(c) += CAvl_count(n); - } -#endif -#if CAVL_PARAM_FEATURE_ASSOC - CAvl_assoc(c) = CAvl_compute_node_assoc(arg, c); -#endif - } -#endif -} - -static void CAvl_swap_for_remove (CAvl *o, CAvlArg arg, CAvlRef node, CAvlRef enode, CAvlRef node_parent, CAvlRef enode_parent) -{ - ASSERT(CAvl_check_parent(node_parent, node)) - ASSERT(CAvl_check_parent(enode_parent, enode)) - - if (enode_parent.link == node.link) { - // when the nodes are directly connected we need special handling - - uint8_t side = (enode.link == CAvl_link(node)[1]); - CAvlRef c = CAvlDeref(arg, CAvl_link(node)[!side]); - - if ((CAvl_link(node)[0] = CAvl_link(enode)[0]) != CAvl_nulllink()) { - CAvl_parent(CAvlDeref(arg, CAvl_link(node)[0])) = node.link; - } - if ((CAvl_link(node)[1] = CAvl_link(enode)[1]) != CAvl_nulllink()) { - CAvl_parent(CAvlDeref(arg, CAvl_link(node)[1])) = node.link; - } - - CAvl_parent(enode) = CAvl_parent(node); - if (node_parent.link != CAvl_nulllink()) { - CAvl_link(node_parent)[node.link == CAvl_link(node_parent)[1]] = enode.link; - } else { - o->root = enode.link; - } - - CAvl_link(enode)[side] = node.link; - CAvl_parent(node) = enode.link; - if ((CAvl_link(enode)[!side] = c.link) != CAvl_nulllink()) { - CAvl_parent(c) = enode.link; - } - } else { - CAvlRef temp; - - // swap parents - temp = node_parent; - CAvl_parent(node) = CAvl_parent(enode); - if (enode_parent.link != CAvl_nulllink()) { - CAvl_link(enode_parent)[enode.link == CAvl_link(enode_parent)[1]] = node.link; - } else { - o->root = node.link; - } - CAvl_parent(enode) = temp.link; - if (temp.link != CAvl_nulllink()) { - CAvl_link(temp)[node.link == CAvl_link(temp)[1]] = enode.link; - } else { - o->root = enode.link; - } - - // swap left children - temp = CAvlDeref(arg, CAvl_link(node)[0]); - if ((CAvl_link(node)[0] = CAvl_link(enode)[0]) != CAvl_nulllink()) { - CAvl_parent(CAvlDeref(arg, CAvl_link(node)[0])) = node.link; - } - if ((CAvl_link(enode)[0] = temp.link) != CAvl_nulllink()) { - CAvl_parent(CAvlDeref(arg, CAvl_link(enode)[0])) = enode.link; - } - - // swap right children - temp = CAvlDeref(arg, CAvl_link(node)[1]); - if ((CAvl_link(node)[1] = CAvl_link(enode)[1]) != CAvl_nulllink()) { - CAvl_parent(CAvlDeref(arg, CAvl_link(node)[1])) = node.link; - } - if ((CAvl_link(enode)[1] = temp.link) != CAvl_nulllink()) { - CAvl_parent(CAvlDeref(arg, CAvl_link(enode)[1])) = enode.link; - } - } - - // swap balance factors - int8_t b = CAvl_balance(node); - CAvl_balance(node) = CAvl_balance(enode); - CAvl_balance(enode) = b; - -#if CAVL_PARAM_FEATURE_COUNTS - // swap counts - CAvlCount c = CAvl_count(node); - CAvl_count(node) = CAvl_count(enode); - CAvl_count(enode) = c; -#endif - - // not fixing assoc values here because CAvl_replace_subtree_fix_assoc() will do it -} - -static void CAvl_rebalance (CAvl *o, CAvlArg arg, CAvlRef node, uint8_t side, int8_t deltac) -{ - ASSERT(side == 0 || side == 1) - ASSERT(deltac >= -1 && deltac <= 1) - ASSERT(CAvl_balance(node) >= -1 && CAvl_balance(node) <= 1) - - // if no subtree changed its height, no more rebalancing is needed - if (deltac == 0) { - return; - } - - // calculate how much our height changed - int8_t delta = CAvl_MAX(deltac, CAvl_OPTNEG(CAvl_balance(node), side)) - CAvl_MAX(0, CAvl_OPTNEG(CAvl_balance(node), side)); - ASSERT(delta >= -1 && delta <= 1) - - // update our balance factor - CAvl_balance(node) -= CAvl_OPTNEG(deltac, side); - - CAvlRef child; - CAvlRef gchild; - - // perform transformations if the balance factor is wrong - if (CAvl_balance(node) == 2 || CAvl_balance(node) == -2) { - uint8_t bside; - int8_t bsidef; - if (CAvl_balance(node) == 2) { - bside = 1; - bsidef = 1; - } else { - bside = 0; - bsidef = -1; - } - - ASSERT(CAvl_link(node)[bside] != CAvl_nulllink()) - child = CAvlDeref(arg, CAvl_link(node)[bside]); - - switch (CAvl_balance(child) * bsidef) { - case 1: - CAvl_rotate(o, arg, node, !bside, CAvlDeref(arg, CAvl_parent(node))); - CAvl_balance(node) = 0; - CAvl_balance(child) = 0; - node = child; - delta -= 1; - break; - case 0: - CAvl_rotate(o, arg, node, !bside, CAvlDeref(arg, CAvl_parent(node))); - CAvl_balance(node) = 1 * bsidef; - CAvl_balance(child) = -1 * bsidef; - node = child; - break; - case -1: - ASSERT(CAvl_link(child)[!bside] != CAvl_nulllink()) - gchild = CAvlDeref(arg, CAvl_link(child)[!bside]); - CAvl_rotate(o, arg, child, bside, node); - CAvl_rotate(o, arg, node, !bside, CAvlDeref(arg, CAvl_parent(node))); - CAvl_balance(node) = -CAvl_MAX(0, CAvl_balance(gchild) * bsidef) * bsidef; - CAvl_balance(child) = CAvl_MAX(0, -CAvl_balance(gchild) * bsidef) * bsidef; - CAvl_balance(gchild) = 0; - node = gchild; - delta -= 1; - break; - default: - ASSERT(0); - } - } - - ASSERT(delta >= -1 && delta <= 1) - // Transformations above preserve this. Proof: - // - if a child subtree gained 1 height and rebalancing was needed, - // it was the heavier subtree. Then delta was was originally 1, because - // the heaviest subtree gained one height. If the transformation reduces - // delta by one, it becomes 0. - // - if a child subtree lost 1 height and rebalancing was needed, it - // was the lighter subtree. Then delta was originally 0, because - // the height of the heaviest subtree was unchanged. If the transformation - // reduces delta by one, it becomes -1. - - if (CAvl_parent(node) != CAvl_nulllink()) { - CAvlRef node_parent = CAvlDeref(arg, CAvl_parent(node)); - CAvl_rebalance(o, arg, node_parent, node.link == CAvl_link(node_parent)[1], delta); - } -} - -#if CAVL_PARAM_FEATURE_KEYS_ARE_INDICES -static CAvlCount CAvl_child_count (CAvlArg arg, CAvlRef n, int dir) -{ - return (CAvl_link(n)[dir] != CAvl_nulllink() ? CAvl_count(CAvlDeref(arg, CAvl_link(n)[dir])) : 0); -} -#endif - -static int CAvlIsNullRef (CAvlRef node) -{ - return node.link == CAvl_nulllink(); -} - -static int CAvlIsValidRef (CAvlRef node) -{ - return node.link != CAvl_nulllink(); -} - -static CAvlRef CAvlDeref (CAvlArg arg, CAvlLink link) -{ - if (link == CAvl_nulllink()) { - return CAvl_nullref(); - } - - CAvlRef n; - n.ptr = CAVL_PARAM_FUN_DEREF(arg, link); - n.link = link; - - ASSERT(n.ptr) - - return n; -} - -static void CAvl_Init (CAvl *o) -{ - o->root = CAvl_nulllink(); -} - -#if !CAVL_PARAM_FEATURE_KEYS_ARE_INDICES - -static int CAvl_Insert (CAvl *o, CAvlArg arg, CAvlRef node, CAvlRef *out_ref) -{ - ASSERT(node.link != CAvl_nulllink()) -#if CAVL_PARAM_FEATURE_COUNTS - ASSERT(CAvl_Count(o, arg) < CAVL_PARAM_VALUE_COUNT_MAX) -#endif - - // insert to root? - if (o->root == CAvl_nulllink()) { - o->root = node.link; - CAvl_parent(node) = CAvl_nulllink(); - CAvl_link(node)[0] = CAvl_nulllink(); - CAvl_link(node)[1] = CAvl_nulllink(); - CAvl_balance(node) = 0; -#if CAVL_PARAM_FEATURE_COUNTS - CAvl_count(node) = 1; -#endif -#if CAVL_PARAM_FEATURE_ASSOC - CAvl_assoc(node) = CAVL_PARAM_FUN_ASSOC_VALUE(arg, node); -#endif - - CAvl_assert_tree(o, arg); - - if (out_ref) { - *out_ref = CAvl_nullref(); - } - return 1; - } - - CAvlRef c = CAvlDeref(arg, o->root); - int side; - while (1) { - int comp = CAvl_compare_entries(arg, node, c); - - if (comp == 0) { - if (out_ref) { - *out_ref = c; - } - return 0; - } - - side = (comp == 1); - - if (CAvl_link(c)[side] == CAvl_nulllink()) { - break; - } - - c = CAvlDeref(arg, CAvl_link(c)[side]); - } - - CAvl_link(c)[side] = node.link; - CAvl_parent(node) = c.link; - CAvl_link(node)[0] = CAvl_nulllink(); - CAvl_link(node)[1] = CAvl_nulllink(); - CAvl_balance(node) = 0; -#if CAVL_PARAM_FEATURE_COUNTS - CAvl_count(node) = 1; -#endif -#if CAVL_PARAM_FEATURE_ASSOC - CAvl_assoc(node) = CAVL_PARAM_FUN_ASSOC_VALUE(arg, node); -#endif - -#if CAVL_PARAM_FEATURE_COUNTS || CAVL_PARAM_FEATURE_ASSOC - for (CAvlRef p = c; p.link != CAvl_nulllink(); p = CAvlDeref(arg, CAvl_parent(p))) { -#if CAVL_PARAM_FEATURE_COUNTS - CAvl_count(p)++; -#endif -#if CAVL_PARAM_FEATURE_ASSOC - CAvl_assoc(p) = CAvl_compute_node_assoc(arg, p); -#endif - } -#endif - - CAvl_rebalance(o, arg, c, side, 1); - - CAvl_assert_tree(o, arg); - - if (out_ref) { - *out_ref = c; - } - return 1; -} - -#else - -static void CAvl_InsertAt (CAvl *o, CAvlArg arg, CAvlRef node, CAvlCount index) -{ - ASSERT(node.link != CAvl_nulllink()) - ASSERT(index <= CAvl_Count(o, arg)) - ASSERT(CAvl_Count(o, arg) < CAVL_PARAM_VALUE_COUNT_MAX) - - // insert to root? - if (o->root == CAvl_nulllink()) { - o->root = node.link; - CAvl_parent(node) = CAvl_nulllink(); - CAvl_link(node)[0] = CAvl_nulllink(); - CAvl_link(node)[1] = CAvl_nulllink(); - CAvl_balance(node) = 0; - CAvl_count(node) = 1; -#if CAVL_PARAM_FEATURE_ASSOC - CAvl_assoc(node) = CAVL_PARAM_FUN_ASSOC_VALUE(arg, node); -#endif - - CAvl_assert_tree(o, arg); - return; - } - - CAvlRef c = CAvlDeref(arg, o->root); - CAvlCount c_idx = CAvl_child_count(arg, c, 0); - int side; - while (1) { - side = (index > c_idx); - - if (CAvl_link(c)[side] == CAvl_nulllink()) { - break; - } - - c = CAvlDeref(arg, CAvl_link(c)[side]); - - if (side == 0) { - c_idx -= 1 + CAvl_child_count(arg, c, 1); - } else { - c_idx += 1 + CAvl_child_count(arg, c, 0); - } - } - - CAvl_link(c)[side] = node.link; - CAvl_parent(node) = c.link; - CAvl_link(node)[0] = CAvl_nulllink(); - CAvl_link(node)[1] = CAvl_nulllink(); - CAvl_balance(node) = 0; - CAvl_count(node) = 1; -#if CAVL_PARAM_FEATURE_ASSOC - CAvl_assoc(node) = CAVL_PARAM_FUN_ASSOC_VALUE(arg, node); -#endif - - for (CAvlRef p = c; p.link != CAvl_nulllink(); p = CAvlDeref(arg, CAvl_parent(p))) { - CAvl_count(p)++; -#if CAVL_PARAM_FEATURE_ASSOC - CAvl_assoc(p) = CAvl_compute_node_assoc(arg, p); -#endif - } - - CAvl_rebalance(o, arg, c, side, 1); - - CAvl_assert_tree(o, arg); - return; -} - -#endif - -static void CAvl_Remove (CAvl *o, CAvlArg arg, CAvlRef node) -{ - ASSERT(node.link != CAvl_nulllink()) - ASSERT(o->root != CAvl_nulllink()) - - if (CAvl_link(node)[0] != CAvl_nulllink() && CAvl_link(node)[1] != CAvl_nulllink()) { - CAvlRef max = CAvl_subtree_max(arg, CAvlDeref(arg, CAvl_link(node)[0])); - CAvl_swap_for_remove(o, arg, node, max, CAvlDeref(arg, CAvl_parent(node)), CAvlDeref(arg, CAvl_parent(max))); - } - - ASSERT(CAvl_link(node)[0] == CAvl_nulllink() || CAvl_link(node)[1] == CAvl_nulllink()) - - CAvlRef paren = CAvlDeref(arg, CAvl_parent(node)); - CAvlRef child = (CAvl_link(node)[0] != CAvl_nulllink() ? CAvlDeref(arg, CAvl_link(node)[0]) : CAvlDeref(arg, CAvl_link(node)[1])); - - if (paren.link != CAvl_nulllink()) { - int side = (node.link == CAvl_link(paren)[1]); - CAvl_replace_subtree_fix_assoc(o, arg, node, child, paren); - CAvl_rebalance(o, arg, paren, side, -1); - } else { - CAvl_replace_subtree_fix_assoc(o, arg, node, child, paren); - } - - CAvl_assert_tree(o, arg); -} - -#if !CAVL_PARAM_FEATURE_KEYS_ARE_INDICES && !CAVL_PARAM_FEATURE_NOKEYS - -static CAvlRef CAvl_Lookup (const CAvl *o, CAvlArg arg, CAvlKey key) -{ - if (o->root == CAvl_nulllink()) { - return CAvl_nullref(); - } - - CAvlRef c = CAvlDeref(arg, o->root); - while (1) { - // compare - int comp = CAvl_compare_key_entry(arg, key, c); - - // have we found a node that compares equal? - if (comp == 0) { - return c; - } - - int side = (comp == 1); - - // have we reached a leaf? - if (CAvl_link(c)[side] == CAvl_nulllink()) { - return c; - } - - c = CAvlDeref(arg, CAvl_link(c)[side]); - } -} - -static CAvlRef CAvl_LookupExact (const CAvl *o, CAvlArg arg, CAvlKey key) -{ - if (o->root == CAvl_nulllink()) { - return CAvl_nullref(); - } - - CAvlRef c = CAvlDeref(arg, o->root); - while (1) { - // compare - int comp = CAvl_compare_key_entry(arg, key, c); - - // have we found a node that compares equal? - if (comp == 0) { - return c; - } - - int side = (comp == 1); - - // have we reached a leaf? - if (CAvl_link(c)[side] == CAvl_nulllink()) { - return CAvl_nullref(); - } - - c = CAvlDeref(arg, CAvl_link(c)[side]); - } -} - -static CAvlRef CAvl_GetFirstGreater (const CAvl *o, CAvlArg arg, CAvlKey key) -{ - CAvlRef c = CAvl_Lookup(o, arg, key); - if (CAvlIsNullRef(c)) { - return CAvl_nullref(); - } - - if (CAvl_compare_key_entry(arg, key, c) >= 0) { - c = CAvl_GetNext(o, arg, c); - if (CAvlIsNullRef(c)) { - return CAvl_nullref(); - } - } - - ASSERT(CAvl_compare_key_entry(arg, key, c) < 0); - - return c; -} - -static CAvlRef CAvl_GetLastLesser (const CAvl *o, CAvlArg arg, CAvlKey key) -{ - CAvlRef c = CAvl_Lookup(o, arg, key); - if (CAvlIsNullRef(c)) { - return CAvl_nullref(); - } - - if (CAvl_compare_key_entry(arg, key, c) <= 0) { - c = CAvl_GetPrev(o, arg, c); - if (CAvlIsNullRef(c)) { - return CAvl_nullref(); - } - } - - ASSERT(CAvl_compare_key_entry(arg, key, c) > 0); - - return c; -} - -static CAvlRef CAvl_GetFirstGreaterEqual (const CAvl *o, CAvlArg arg, CAvlKey key) -{ - CAvlRef c = CAvl_Lookup(o, arg, key); - if (CAvlIsNullRef(c)) { - return CAvl_nullref(); - } - - if (CAvl_compare_key_entry(arg, key, c) > 0) { - c = CAvl_GetNext(o, arg, c); - if (CAvlIsNullRef(c)) { - return CAvl_nullref(); - } - } - - ASSERT(CAvl_compare_key_entry(arg, key, c) <= 0); - - return c; -} - -static CAvlRef CAvl_GetLastLesserEqual (const CAvl *o, CAvlArg arg, CAvlKey key) -{ - CAvlRef c = CAvl_Lookup(o, arg, key); - if (CAvlIsNullRef(c)) { - return CAvl_nullref(); - } - - if (CAvl_compare_key_entry(arg, key, c) < 0) { - c = CAvl_GetPrev(o, arg, c); - if (CAvlIsNullRef(c)) { - return CAvl_nullref(); - } - } - - ASSERT(CAvl_compare_key_entry(arg, key, c) >= 0); - - return c; -} - -#endif - -static CAvlRef CAvl_GetFirst (const CAvl *o, CAvlArg arg) -{ - if (o->root == CAvl_nulllink()) { - return CAvl_nullref(); - } - - return CAvl_subtree_min(arg, CAvlDeref(arg, o->root)); -} - -static CAvlRef CAvl_GetLast (const CAvl *o, CAvlArg arg) -{ - if (o->root == CAvl_nulllink()) { - return CAvl_nullref(); - } - - return CAvl_subtree_max(arg, CAvlDeref(arg, o->root)); -} - -static CAvlRef CAvl_GetNext (const CAvl *o, CAvlArg arg, CAvlRef node) -{ - ASSERT(node.link != CAvl_nulllink()) - ASSERT(o->root != CAvl_nulllink()) - - if (CAvl_link(node)[1] != CAvl_nulllink()) { - node = CAvlDeref(arg, CAvl_link(node)[1]); - while (CAvl_link(node)[0] != CAvl_nulllink()) { - node = CAvlDeref(arg, CAvl_link(node)[0]); - } - } else { - while (CAvl_parent(node) != CAvl_nulllink() && node.link == CAvl_link(CAvlDeref(arg, CAvl_parent(node)))[1]) { - node = CAvlDeref(arg, CAvl_parent(node)); - } - node = CAvlDeref(arg, CAvl_parent(node)); - } - - return node; -} - -static CAvlRef CAvl_GetPrev (const CAvl *o, CAvlArg arg, CAvlRef node) -{ - ASSERT(node.link != CAvl_nulllink()) - ASSERT(o->root != CAvl_nulllink()) - - if (CAvl_link(node)[0] != CAvl_nulllink()) { - node = CAvlDeref(arg, CAvl_link(node)[0]); - while (CAvl_link(node)[1] != CAvl_nulllink()) { - node = CAvlDeref(arg, CAvl_link(node)[1]); - } - } else { - while (CAvl_parent(node) != CAvl_nulllink() && node.link == CAvl_link(CAvlDeref(arg, CAvl_parent(node)))[0]) { - node = CAvlDeref(arg, CAvl_parent(node)); - } - node = CAvlDeref(arg, CAvl_parent(node)); - } - - return node; -} - -static int CAvl_IsEmpty (const CAvl *o) -{ - return o->root == CAvl_nulllink(); -} - -static void CAvl_Verify (const CAvl *o, CAvlArg arg) -{ - if (o->root != CAvl_nulllink()) { - CAvlRef root = CAvlDeref(arg, o->root); - ASSERT(CAvl_parent(root) == CAvl_nulllink()) - CAvl_verify_recurser(arg, root); - } -} - -#if CAVL_PARAM_FEATURE_COUNTS - -static CAvlCount CAvl_Count (const CAvl *o, CAvlArg arg) -{ - return (o->root != CAvl_nulllink() ? CAvl_count(CAvlDeref(arg, o->root)) : 0); -} - -static CAvlCount CAvl_IndexOf (const CAvl *o, CAvlArg arg, CAvlRef node) -{ - ASSERT(node.link != CAvl_nulllink()) - ASSERT(o->root != CAvl_nulllink()) - - CAvlCount index = (CAvl_link(node)[0] != CAvl_nulllink() ? CAvl_count(CAvlDeref(arg, CAvl_link(node)[0])) : 0); - - CAvlRef paren = CAvlDeref(arg, CAvl_parent(node)); - - for (CAvlRef c = node; paren.link != CAvl_nulllink(); c = paren, paren = CAvlDeref(arg, CAvl_parent(c))) { - if (c.link == CAvl_link(paren)[1]) { - ASSERT(CAvl_count(paren) > CAvl_count(c)) - ASSERT(CAvl_count(paren) - CAvl_count(c) <= CAVL_PARAM_VALUE_COUNT_MAX - index) - index += CAvl_count(paren) - CAvl_count(c); - } - } - - return index; -} - -static CAvlRef CAvl_GetAt (const CAvl *o, CAvlArg arg, CAvlCount index) -{ - if (index >= CAvl_Count(o, arg)) { - return CAvl_nullref(); - } - - CAvlRef c = CAvlDeref(arg, o->root); - - while (1) { - ASSERT(c.link != CAvl_nulllink()) - ASSERT(index < CAvl_count(c)) - - CAvlCount left_count = (CAvl_link(c)[0] != CAvl_nulllink() ? CAvl_count(CAvlDeref(arg, CAvl_link(c)[0])) : 0); - - if (index == left_count) { - return c; - } - - if (index < left_count) { - c = CAvlDeref(arg, CAvl_link(c)[0]); - } else { - c = CAvlDeref(arg, CAvl_link(c)[1]); - index -= left_count + 1; - } - } -} - -#endif - -#if CAVL_PARAM_FEATURE_ASSOC - -static CAvlAssoc CAvl_AssocSum (const CAvl *o, CAvlArg arg) -{ - if (o->root == CAvl_nulllink()) { - return CAVL_PARAM_VALUE_ASSOC_ZERO; - } - CAvlRef root = CAvlDeref(arg, o->root); - return CAvl_assoc(root); -} - -static CAvlAssoc CAvl_ExclusiveAssocPrefixSum (const CAvl *o, CAvlArg arg, CAvlRef node) -{ - ASSERT(node.link != CAvl_nulllink()) - ASSERT(o->root != CAvl_nulllink()) - - CAvlAssoc sum = (CAvl_link(node)[0] != CAvl_nulllink() ? CAvl_assoc(CAvlDeref(arg, CAvl_link(node)[0])) : CAVL_PARAM_VALUE_ASSOC_ZERO); - - CAvlRef paren = CAvlDeref(arg, CAvl_parent(node)); - - for (CAvlRef c = node; paren.link != CAvl_nulllink(); c = paren, paren = CAvlDeref(arg, CAvl_parent(c))) { - if (c.link == CAvl_link(paren)[1]) { - CAvlAssoc c_val = CAVL_PARAM_FUN_ASSOC_VALUE(arg, paren); - sum = CAVL_PARAM_FUN_ASSOC_OPER(arg, c_val, sum); - if (CAvl_link(paren)[0] != CAvl_nulllink()) { - sum = CAVL_PARAM_FUN_ASSOC_OPER(arg, CAvl_assoc(CAvlDeref(arg, CAvl_link(paren)[0])), sum); - } - } - } - - return sum; -} - -static CAvlRef CAvl_FindLastExclusiveAssocPrefixSumLesserEqual (const CAvl *o, CAvlArg arg, CAvlAssoc sum, int (*sum_less) (void *, CAvlAssoc, CAvlAssoc), void *user) -{ - CAvlRef result = CAvl_nullref(); - CAvlRef c = CAvlDeref(arg, o->root); - CAvlAssoc sum_offset = CAVL_PARAM_VALUE_ASSOC_ZERO; - - while (c.link != CAvl_nulllink()) { - CAvlAssoc left_sum = (CAvl_link(c)[0] != CAvl_nulllink() ? CAvl_assoc(CAvlDeref(arg, CAvl_link(c)[0])) : CAVL_PARAM_VALUE_ASSOC_ZERO); - CAvlAssoc c_prefixsum = CAVL_PARAM_FUN_ASSOC_OPER(arg, sum_offset, left_sum); - - if (sum_less(user, sum, c_prefixsum)) { - c = CAvlDeref(arg, CAvl_link(c)[0]); - } else { - result = c; - CAvlAssoc c_val = CAVL_PARAM_FUN_ASSOC_VALUE(arg, c); - sum_offset = CAVL_PARAM_FUN_ASSOC_OPER(arg, c_prefixsum, c_val); - c = CAvlDeref(arg, CAvl_link(c)[1]); - } - } - - return result; -} - -#endif - -#include "CAvl_footer.h" diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/structure/CHash.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/structure/CHash.h deleted file mode 100644 index 45fef7a3..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/structure/CHash.h +++ /dev/null @@ -1,39 +0,0 @@ -/** - * @file CHash.h - * @author Ambroz Bizjak - * - * @section LICENSE - * - * 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 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE 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. - */ - -#ifndef BADVPN_CHASH_H -#define BADVPN_CHASH_H - -#include - -#include -#include -#include - -#endif diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/structure/CHash_decl.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/structure/CHash_decl.h deleted file mode 100644 index d47702a1..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/structure/CHash_decl.h +++ /dev/null @@ -1,59 +0,0 @@ -/** - * @file CHash_decl.h - * @author Ambroz Bizjak - * - * @section LICENSE - * - * 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 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE 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. - */ - -#include "CHash_header.h" - -typedef struct { - CHashLink *buckets; - size_t num_buckets; -} CHash; - -typedef struct { - CHashEntry *ptr; - CHashLink link; -} CHashRef; - -static CHashLink CHashNullLink (void); -static CHashRef CHashNullRef (void); -static int CHashIsNullLink (CHashLink link); -static int CHashIsNullRef (CHashRef ref); -static CHashRef CHashDerefMayNull (CHashArg arg, CHashLink link); -static CHashRef CHashDerefNonNull (CHashArg arg, CHashLink link); - -static int CHash_Init (CHash *o, size_t num_buckets); -static void CHash_Free (CHash *o); -static int CHash_Insert (CHash *o, CHashArg arg, CHashRef entry, CHashRef *out_existing); -static void CHash_InsertMulti (CHash *o, CHashArg arg, CHashRef entry); -static void CHash_Remove (CHash *o, CHashArg arg, CHashRef entry); -static CHashRef CHash_Lookup (const CHash *o, CHashArg arg, CHashKey key); -static CHashRef CHash_GetNextEqual (const CHash *o, CHashArg arg, CHashRef entry); -static int CHash_MultiplyBuckets (CHash *o, CHashArg arg, int exp); -static void CHash_Verify (const CHash *o, CHashArg arg); - -#include "CHash_footer.h" diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/structure/CHash_footer.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/structure/CHash_footer.h deleted file mode 100644 index cb95dafd..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/structure/CHash_footer.h +++ /dev/null @@ -1,74 +0,0 @@ -/** - * @file CHash_footer.h - * @author Ambroz Bizjak - * - * @section LICENSE - * - * 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 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE 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. - */ - -// preprocessor inputs -#undef CHASH_PARAM_NAME -#undef CHASH_PARAM_ENTRY -#undef CHASH_PARAM_LINK -#undef CHASH_PARAM_KEY -#undef CHASH_PARAM_ARG -#undef CHASH_PARAM_NULL -#undef CHASH_PARAM_DEREF -#undef CHASH_PARAM_ENTRYHASH -#undef CHASH_PARAM_KEYHASH -#undef CHASH_PARAM_ENTRYHASH_IS_CHEAP -#undef CHASH_PARAM_COMPARE_ENTRIES -#undef CHASH_PARAM_COMPARE_KEY_ENTRY -#undef CHASH_PARAM_ENTRY_NEXT - -// types -#undef CHash -#undef CHashEntry -#undef CHashLink -#undef CHashRef -#undef CHashArg -#undef CHashKey - -// non-object public functions -#undef CHashNullLink -#undef CHashNullRef -#undef CHashIsNullLink -#undef CHashIsNullRef -#undef CHashDerefMayNull -#undef CHashDerefNonNull - -// public functions -#undef CHash_Init -#undef CHash_Free -#undef CHash_Insert -#undef CHash_InsertMulti -#undef CHash_Remove -#undef CHash_Lookup -#undef CHash_GetNextEqual -#undef CHash_MultiplyBuckets -#undef CHash_Verify - -// private things -#undef CHash_next -#undef CHash_assert_valid_entry diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/structure/CHash_header.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/structure/CHash_header.h deleted file mode 100644 index 27800aca..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/structure/CHash_header.h +++ /dev/null @@ -1,78 +0,0 @@ -/** - * @file CHash_header.h - * @author Ambroz Bizjak - * - * @section LICENSE - * - * 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 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE 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. - */ - -// Preprocessor inputs: -// CHASH_PARAM_NAME - name of this data structure -// CHASH_PARAM_ENTRY - type of entry -// CHASH_PARAM_LINK - type of entry link (usually a pointer or index to an array) -// CHASH_PARAM_KEY - type of key -// CHASH_PARAM_ARG - type of argument pass through to comparisons -// CHASH_PARAM_NULL - invalid link -// CHASH_PARAM_DEREF(arg, link) - dereference a non-null link -// CHASH_PARAM_ENTRYHASH(arg, entry) - hash function for entries; returns size_t -// CHASH_PARAM_KEYHASH(arg, key) - hash function for keys; returns size_t -// CHASH_PARAM_ENTRYHASH_IS_CHEAP - define to 1 if CHASH_PARAM_ENTRYHASH is cheap (e.g. hashes are precomputed) -// CHASH_PARAM_COMPARE_ENTRIES(arg, entry1, entry2) - compares two entries; returns 1 for equality, 0 otherwise -// CHASH_PARAM_COMPARE_KEY_ENTRY(arg, key1, entry2) - compares key and entry; returns 1 for equality, 0 otherwise -// CHASH_PARAM_ENTRY_NEXT - next member in entry - -#ifndef BADVPN_CHASH_H -#error CHash.h has not been included -#endif - -// types -#define CHash CHASH_PARAM_NAME -#define CHashEntry CHASH_PARAM_ENTRY -#define CHashLink CHASH_PARAM_LINK -#define CHashRef MERGE(CHash, Ref) -#define CHashArg CHASH_PARAM_ARG -#define CHashKey CHASH_PARAM_KEY - -// non-object public functions -#define CHashNullLink MERGE(CHash, NullLink) -#define CHashNullRef MERGE(CHash, NullRef) -#define CHashIsNullLink MERGE(CHash, IsNullLink) -#define CHashIsNullRef MERGE(CHash, IsNullRef) -#define CHashDerefMayNull MERGE(CHash, DerefMayNull) -#define CHashDerefNonNull MERGE(CHash, DerefNonNull) - -// public functions -#define CHash_Init MERGE(CHash, _Init) -#define CHash_Free MERGE(CHash, _Free) -#define CHash_Insert MERGE(CHash, _Insert) -#define CHash_InsertMulti MERGE(CHash, _InsertMulti) -#define CHash_Remove MERGE(CHash, _Remove) -#define CHash_Lookup MERGE(CHash, _Lookup) -#define CHash_GetNextEqual MERGE(CHash, _GetNextEqual) -#define CHash_MultiplyBuckets MERGE(CHash, _MultiplyBuckets) -#define CHash_Verify MERGE(CHash, _Verify) - -// private things -#define CHash_next(entry) ((entry).ptr->CHASH_PARAM_ENTRY_NEXT) -#define CHash_assert_valid_entry MERGE(CHash, _assert_valid_entry) diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/structure/CHash_impl.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/structure/CHash_impl.h deleted file mode 100644 index 0bded845..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/structure/CHash_impl.h +++ /dev/null @@ -1,312 +0,0 @@ -/** - * @file CHash_impl.h - * @author Ambroz Bizjak - * - * @section LICENSE - * - * 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 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE 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. - */ - -#include "CHash_header.h" - -static void CHash_assert_valid_entry (CHashArg arg, CHashRef entry) -{ - ASSERT(entry.link != CHashNullLink()) - ASSERT(entry.ptr == CHASH_PARAM_DEREF(arg, entry.link)) -} - -static CHashLink CHashNullLink (void) -{ - return CHASH_PARAM_NULL; -} - -static CHashRef CHashNullRef (void) -{ - CHashRef entry = {NULL, CHashNullLink()}; - return entry; -} - -static int CHashIsNullLink (CHashLink link) -{ - return (link == CHashNullLink()); -} - -static int CHashIsNullRef (CHashRef ref) -{ - return CHashIsNullLink(ref.link); -} - -static CHashRef CHashDerefMayNull (CHashArg arg, CHashLink link) -{ - if (link == CHashNullLink()) { - return CHashNullRef(); - } - - CHashRef entry = {CHASH_PARAM_DEREF(arg, link), link}; - ASSERT(entry.ptr) - - return entry; -} - -static CHashRef CHashDerefNonNull (CHashArg arg, CHashLink link) -{ - ASSERT(link != CHashNullLink()) - - CHashRef entry = {CHASH_PARAM_DEREF(arg, link), link}; - ASSERT(entry.ptr) - - return entry; -} - -static int CHash_Init (CHash *o, size_t num_buckets) -{ - if (num_buckets == 0) { - num_buckets = 1; - } - - o->num_buckets = num_buckets; - - o->buckets = (CHashLink *)BAllocArray(o->num_buckets, sizeof(o->buckets[0])); - if (!o->buckets) { - return 0; - } - - for (size_t i = 0; i < o->num_buckets; i++) { - o->buckets[i] = CHashNullLink(); - } - - return 1; -} - -static void CHash_Free (CHash *o) -{ - BFree(o->buckets); -} - -static int CHash_Insert (CHash *o, CHashArg arg, CHashRef entry, CHashRef *out_existing) -{ - CHash_assert_valid_entry(arg, entry); - - size_t index = CHASH_PARAM_ENTRYHASH(arg, entry) % o->num_buckets; - - CHashLink link = o->buckets[index]; - while (link != CHashNullLink()) { - CHashRef cur = CHashDerefNonNull(arg, link); - if (CHASH_PARAM_COMPARE_ENTRIES(arg, cur, entry)) { - if (out_existing) { - *out_existing = cur; - } - return 0; - } - link = CHash_next(cur); - } - - CHash_next(entry) = o->buckets[index]; - o->buckets[index] = entry.link; - - return 1; -} - -static void CHash_InsertMulti (CHash *o, CHashArg arg, CHashRef entry) -{ - CHash_assert_valid_entry(arg, entry); - - size_t index = CHASH_PARAM_ENTRYHASH(arg, entry) % o->num_buckets; - - CHashRef prev = CHashNullRef(); - CHashLink link = o->buckets[index]; - while (link != CHashNullLink()) { - CHashRef cur = CHashDerefNonNull(arg, link); - if (CHASH_PARAM_COMPARE_ENTRIES(arg, cur, entry)) { - break; - } - prev = cur; - link = CHash_next(cur); - } - - if (link == CHashNullLink() || prev.link == CHashNullLink()) { - CHash_next(entry) = o->buckets[index]; - o->buckets[index] = entry.link; - } else { - CHash_next(entry) = link; - CHash_next(prev) = entry.link; - } -} - -static void CHash_Remove (CHash *o, CHashArg arg, CHashRef entry) -{ - CHash_assert_valid_entry(arg, entry); - - size_t index = CHASH_PARAM_ENTRYHASH(arg, entry) % o->num_buckets; - - CHashRef prev = CHashNullRef(); - CHashLink link = o->buckets[index]; - while (link != entry.link) { - CHashRef cur = CHashDerefNonNull(arg, link); - prev = cur; - link = CHash_next(cur); - ASSERT(link != CHashNullLink()) - } - - if (prev.link == CHashNullLink()) { - o->buckets[index] = CHash_next(entry); - } else { - CHash_next(prev) = CHash_next(entry); - } -} - -static CHashRef CHash_Lookup (const CHash *o, CHashArg arg, CHashKey key) -{ - size_t hash = CHASH_PARAM_KEYHASH(arg, key); - size_t index = hash % o->num_buckets; - - CHashLink link = o->buckets[index]; - while (link != CHashNullLink()) { - CHashRef cur = CHashDerefNonNull(arg, link); -#if CHASH_PARAM_ENTRYHASH_IS_CHEAP - if (CHASH_PARAM_ENTRYHASH(arg, cur) == hash && CHASH_PARAM_COMPARE_KEY_ENTRY(arg, key, cur)) { -#else - if (CHASH_PARAM_COMPARE_KEY_ENTRY(arg, key, cur)) { -#endif - return cur; - } - link = CHash_next(cur); - } - - return CHashNullRef(); -} - -static CHashRef CHash_GetNextEqual (const CHash *o, CHashArg arg, CHashRef entry) -{ - CHash_assert_valid_entry(arg, entry); - - CHashLink next = CHash_next(entry); - - if (next == CHashNullLink()) { - return CHashNullRef(); - } - - CHashRef next_ref = CHashDerefNonNull(arg, next); - if (!CHASH_PARAM_COMPARE_ENTRIES(arg, next_ref, entry)) { - return CHashNullRef(); - } - - return next_ref; -} - -static int CHash_MultiplyBuckets (CHash *o, CHashArg arg, int exp) -{ - ASSERT(exp > 0) - - size_t new_num_buckets = o->num_buckets; - while (exp-- > 0) { - if (new_num_buckets > SIZE_MAX / 2) { - return 0; - } - new_num_buckets *= 2; - } - - CHashLink *new_buckets = (CHashLink *)BReallocArray(o->buckets, new_num_buckets, sizeof(new_buckets[0])); - if (!new_buckets) { - return 0; - } - o->buckets = new_buckets; - - for (size_t i = o->num_buckets; i < new_num_buckets; i++) { - o->buckets[i] = CHashNullLink(); - } - - for (size_t i = 0; i < o->num_buckets; i++) { - CHashRef prev = CHashNullRef(); - CHashLink link = o->buckets[i]; - - while (link != CHashNullLink()) { - CHashRef cur = CHashDerefNonNull(arg, link); - link = CHash_next(cur); - - size_t new_index = CHASH_PARAM_ENTRYHASH(arg, cur) % new_num_buckets; - if (new_index == i) { - prev = cur; - continue; - } - - if (CHashIsNullRef(prev)) { - o->buckets[i] = CHash_next(cur); - } else { - CHash_next(prev) = CHash_next(cur); - } - - CHash_next(cur) = o->buckets[new_index]; - o->buckets[new_index] = cur.link; - } - } - - for (size_t i = o->num_buckets; i < new_num_buckets; i++) { - CHashLink new_bucket_link = CHashNullLink(); - - CHashLink link = o->buckets[i]; - while (link != CHashNullLink()) { - CHashRef cur = CHashDerefNonNull(arg, link); - link = CHash_next(cur); - - CHash_next(cur) = new_bucket_link; - new_bucket_link = cur.link; - } - - o->buckets[i] = new_bucket_link; - } - - o->num_buckets = new_num_buckets; - - return 1; -} - -static void CHash_Verify (const CHash *o, CHashArg arg) -{ - ASSERT_FORCE(o->num_buckets > 0) - ASSERT_FORCE(o->buckets) - - for (size_t i = 0; i < o->num_buckets; i++) { - CHashRef cur = CHashDerefMayNull(arg, o->buckets[i]); - CHashRef same_first = cur; - - while (!CHashIsNullRef(cur)) { - size_t index = CHASH_PARAM_ENTRYHASH(arg, cur) % o->num_buckets; - ASSERT_FORCE(index == i) - - if (!CHASH_PARAM_COMPARE_ENTRIES(arg, cur, same_first)) { - same_first = cur; - } - - CHashRef ccur = CHashDerefNonNull(arg, o->buckets[i]); - while (ccur.link != same_first.link) { - ASSERT_FORCE(!CHASH_PARAM_COMPARE_ENTRIES(arg, ccur, cur)) - ccur = CHashDerefMayNull(arg, CHash_next(ccur)); - } - - cur = CHashDerefMayNull(arg, CHash_next(cur)); - } - } -} - -#include "CHash_footer.h" diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/structure/ChunkBuffer2.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/structure/ChunkBuffer2.h deleted file mode 100644 index 966fbef2..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/structure/ChunkBuffer2.h +++ /dev/null @@ -1,317 +0,0 @@ -/** - * @file ChunkBuffer2.h - * @author Ambroz Bizjak - * - * @section LICENSE - * - * 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 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE 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. - * - * @section DESCRIPTION - * - * Circular packet buffer - */ - -#ifndef BADVPN_STRUCTURE_CHUNKBUFFER2_H -#define BADVPN_STRUCTURE_CHUNKBUFFER2_H - -#include -#include -#include - -#include "misc/balign.h" -#include "misc/debug.h" - -#ifndef NDEBUG -#define CHUNKBUFFER2_ASSERT_BUFFER(_buf) _ChunkBuffer2_assert_buffer(_buf); -#define CHUNKBUFFER2_ASSERT_IO(_buf) _ChunkBuffer2_assert_io(_buf); -#else -#define CHUNKBUFFER2_ASSERT_BUFFER(_buf) -#define CHUNKBUFFER2_ASSERT_IO(_buf) -#endif - -struct ChunkBuffer2_block { - int len; -}; - -typedef struct { - struct ChunkBuffer2_block *buffer; - int size; - int wrap; - int start; - int used; - int mtu; - uint8_t *input_dest; - int input_avail; - uint8_t *output_dest; - int output_avail; -} ChunkBuffer2; - -// calculates a buffer size needed to hold at least 'num' packets long at least 'chunk_len' -static int ChunkBuffer2_calc_blocks (int chunk_len, int num); - -// initialize -static void ChunkBuffer2_Init (ChunkBuffer2 *buf, struct ChunkBuffer2_block *buffer, int blocks, int mtu); - -// submit a packet written to the buffer -static void ChunkBuffer2_SubmitPacket (ChunkBuffer2 *buf, int len); - -// remove the first packet -static void ChunkBuffer2_ConsumePacket (ChunkBuffer2 *buf); - -static int _ChunkBuffer2_end (ChunkBuffer2 *buf) -{ - if (buf->used >= buf->wrap - buf->start) { - return (buf->used - (buf->wrap - buf->start)); - } else { - return (buf->start + buf->used); - } -} - -#ifndef NDEBUG - -static void _ChunkBuffer2_assert_buffer (ChunkBuffer2 *buf) -{ - ASSERT(buf->size > 0) - ASSERT(buf->wrap > 0) - ASSERT(buf->wrap <= buf->size) - ASSERT(buf->start >= 0) - ASSERT(buf->start < buf->wrap) - ASSERT(buf->used >= 0) - ASSERT(buf->used <= buf->wrap) - ASSERT(buf->wrap == buf->size || buf->used >= buf->wrap - buf->start) - ASSERT(buf->mtu >= 0) -} - -static void _ChunkBuffer2_assert_io (ChunkBuffer2 *buf) -{ - // check input - - int end = _ChunkBuffer2_end(buf); - - if (buf->size - end - 1 < buf->mtu) { - // it will never be possible to write a MTU long packet here - ASSERT(!buf->input_dest) - ASSERT(buf->input_avail == -1) - } else { - // calculate number of free blocks - int free; - if (buf->used >= buf->wrap - buf->start) { - free = buf->start - end; - } else { - free = buf->size - end; - } - - if (free > 0) { - // got space at least for a header. More space will become available as packets are - // read from the buffer, up to MTU. - ASSERT(buf->input_dest == (uint8_t *)&buf->buffer[end + 1]) - ASSERT(buf->input_avail == (free - 1) * sizeof(struct ChunkBuffer2_block)) - } else { - // no space - ASSERT(!buf->input_dest) - ASSERT(buf->input_avail == -1) - } - } - - // check output - - if (buf->used > 0) { - int datalen = buf->buffer[buf->start].len; - ASSERT(datalen >= 0) - int blocklen = bdivide_up(datalen, sizeof(struct ChunkBuffer2_block)); - ASSERT(blocklen <= buf->used - 1) - ASSERT(blocklen <= buf->wrap - buf->start - 1) - ASSERT(buf->output_dest == (uint8_t *)&buf->buffer[buf->start + 1]) - ASSERT(buf->output_avail == datalen) - } else { - ASSERT(!buf->output_dest) - ASSERT(buf->output_avail == -1) - } -} - -#endif - -static void _ChunkBuffer2_update_input (ChunkBuffer2 *buf) -{ - int end = _ChunkBuffer2_end(buf); - - if (buf->size - end - 1 < buf->mtu) { - // it will never be possible to write a MTU long packet here - buf->input_dest = NULL; - buf->input_avail = -1; - return; - } - - // calculate number of free blocks - int free; - if (buf->used >= buf->wrap - buf->start) { - free = buf->start - end; - } else { - free = buf->size - end; - } - - if (free > 0) { - // got space at least for a header. More space will become available as packets are - // read from the buffer, up to MTU. - buf->input_dest = (uint8_t *)&buf->buffer[end + 1]; - buf->input_avail = (free - 1) * sizeof(struct ChunkBuffer2_block); - } else { - // no space - buf->input_dest = NULL; - buf->input_avail = -1; - } -} - -static void _ChunkBuffer2_update_output (ChunkBuffer2 *buf) -{ - if (buf->used > 0) { - int datalen = buf->buffer[buf->start].len; - ASSERT(datalen >= 0) -#ifndef NDEBUG - int blocklen = bdivide_up(datalen, sizeof(struct ChunkBuffer2_block)); - ASSERT(blocklen <= buf->used - 1) - ASSERT(blocklen <= buf->wrap - buf->start - 1) -#endif - buf->output_dest = (uint8_t *)&buf->buffer[buf->start + 1]; - buf->output_avail = datalen; - } else { - buf->output_dest = NULL; - buf->output_avail = -1; - } -} - -int ChunkBuffer2_calc_blocks (int chunk_len, int num) -{ - int chunk_data_blocks = bdivide_up(chunk_len, sizeof(struct ChunkBuffer2_block)); - - if (chunk_data_blocks > INT_MAX - 1) { - return -1; - } - int chunk_blocks = 1 + chunk_data_blocks; - - if (num > INT_MAX - 1) { - return -1; - } - int num_chunks = num + 1; - - if (chunk_blocks > INT_MAX / num_chunks) { - return -1; - } - int blocks = chunk_blocks * num_chunks; - - return blocks; -} - -void ChunkBuffer2_Init (ChunkBuffer2 *buf, struct ChunkBuffer2_block *buffer, int blocks, int mtu) -{ - ASSERT(blocks > 0) - ASSERT(mtu >= 0) - - buf->buffer = buffer; - buf->size = blocks; - buf->wrap = blocks; - buf->start = 0; - buf->used = 0; - buf->mtu = bdivide_up(mtu, sizeof(struct ChunkBuffer2_block)); - - CHUNKBUFFER2_ASSERT_BUFFER(buf) - - _ChunkBuffer2_update_input(buf); - _ChunkBuffer2_update_output(buf); - - CHUNKBUFFER2_ASSERT_IO(buf) -} - -void ChunkBuffer2_SubmitPacket (ChunkBuffer2 *buf, int len) -{ - ASSERT(buf->input_dest) - ASSERT(len >= 0) - ASSERT(len <= buf->input_avail) - - CHUNKBUFFER2_ASSERT_BUFFER(buf) - CHUNKBUFFER2_ASSERT_IO(buf) - - int end = _ChunkBuffer2_end(buf); - int blocklen = bdivide_up(len, sizeof(struct ChunkBuffer2_block)); - - ASSERT(blocklen <= buf->size - end - 1) - ASSERT(buf->used < buf->wrap - buf->start || blocklen <= buf->start - end - 1) - - buf->buffer[end].len = len; - buf->used += 1 + blocklen; - - if (buf->used <= buf->wrap - buf->start && buf->mtu > buf->size - (end + 1 + blocklen) - 1) { - buf->wrap = end + 1 + blocklen; - } - - CHUNKBUFFER2_ASSERT_BUFFER(buf) - - // update input - _ChunkBuffer2_update_input(buf); - - // update output - if (buf->used == 1 + blocklen) { - _ChunkBuffer2_update_output(buf); - } - - CHUNKBUFFER2_ASSERT_IO(buf) -} - -void ChunkBuffer2_ConsumePacket (ChunkBuffer2 *buf) -{ - ASSERT(buf->output_dest) - - CHUNKBUFFER2_ASSERT_BUFFER(buf) - CHUNKBUFFER2_ASSERT_IO(buf) - - ASSERT(1 <= buf->wrap - buf->start) - ASSERT(1 <= buf->used) - - int blocklen = bdivide_up(buf->buffer[buf->start].len, sizeof(struct ChunkBuffer2_block)); - - ASSERT(blocklen <= buf->wrap - buf->start - 1) - ASSERT(blocklen <= buf->used - 1) - - int data_wrapped = (buf->used >= buf->wrap - buf->start); - - buf->start += 1 + blocklen; - buf->used -= 1 + blocklen; - if (buf->start == buf->wrap) { - buf->start = 0; - buf->wrap = buf->size; - } - - CHUNKBUFFER2_ASSERT_BUFFER(buf) - - // update input - if (data_wrapped) { - _ChunkBuffer2_update_input(buf); - } - - // update output - _ChunkBuffer2_update_output(buf); - - CHUNKBUFFER2_ASSERT_IO(buf) -} - -#endif diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/structure/IndexedList.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/structure/IndexedList.h deleted file mode 100644 index ca611e9b..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/structure/IndexedList.h +++ /dev/null @@ -1,225 +0,0 @@ -/** - * @file IndexedList.h - * @author Ambroz Bizjak - * - * @section LICENSE - * - * 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 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE 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. - * - * @section DESCRIPTION - * - * A data structure similar to a list, but with efficient index-based access. - */ - -#ifndef BADVPN_INDEXEDLIST_H -#define BADVPN_INDEXEDLIST_H - -#include -#include - -#include -#include -#include - -typedef struct IndexedList_s IndexedList; -typedef struct IndexedListNode_s IndexedListNode; - -typedef IndexedListNode *IndexedList__tree_link; - -#include "IndexedList_tree.h" -#include - -struct IndexedList_s { - IndexedList__Tree tree; -}; - -struct IndexedListNode_s { - IndexedListNode *tree_child[2]; - IndexedListNode *tree_parent; - int8_t tree_balance; - uint64_t tree_count; -}; - -/** - * Initializes the indexed list. - * - * @param o uninitialized list object to initialize - */ -static void IndexedList_Init (IndexedList *o); - -/** - * Inserts a node into the indexed list. - * - * @param o indexed list to insert into - * @param node uninitialized node to insert - * @param index index to insert at (starting with zero). Any existing elements - * at or after this index will be shifted forward, i.e. their - * indices will be incremented by one. Must be <=count. - */ -static void IndexedList_InsertAt (IndexedList *o, IndexedListNode *node, uint64_t index); - -/** - * Removes a nove from the indexed list. - * - * @param o indexed list to remove from - * @param node node in the list to remove - */ -static void IndexedList_Remove (IndexedList *o, IndexedListNode *node); - -/** - * Returns the number of nodes in the indexed list. - * - * @param o indexed list - * @return number of nodes - */ -static uint64_t IndexedList_Count (IndexedList *o); - -/** - * Returns the index of a node in the indexed list. - * - * @param o indexed list - * @param node node in the list to get index of - * @return index of the node - */ -static uint64_t IndexedList_IndexOf (IndexedList *o, IndexedListNode *node); - -/** - * Returns the node at the specified index in the indexed list. - * - * @param o indexed list - * @param index index of the node to return. Must be < count. - * @return node at the specified index - */ -static IndexedListNode * IndexedList_GetAt (IndexedList *o, uint64_t index); - -/** - * Returns the first node, or NULL if the list is empty. - * - * @param o indexed list - * @return first node, or NULL - */ -static IndexedListNode * IndexedList_GetFirst (IndexedList *o); - -/** - * Returns the last node, or NULL if the list is empty. - * - * @param o indexed list - * @return last node, or NULL - */ -static IndexedListNode * IndexedList_GetLast (IndexedList *o); - -/** - * Returns the next node of a given node, or NULL this is the last node. - * - * @param o indexed list - * @param node existing node - * @return next node, or NULL - */ -static IndexedListNode * IndexedList_GetNext (IndexedList *o, IndexedListNode *node); - -/** - * Returns the previous node of a given node, or NULL this is the first node. - * - * @param o indexed list - * @param node existing node - * @return previous node, or NULL - */ -static IndexedListNode * IndexedList_GetPrev (IndexedList *o, IndexedListNode *node); - -#include "IndexedList_tree.h" -#include - -static IndexedListNode * IndexedList__deref (IndexedList__TreeRef ref) -{ - return ref.link; -} - -static void IndexedList_Init (IndexedList *o) -{ - IndexedList__Tree_Init(&o->tree); -} - -static void IndexedList_InsertAt (IndexedList *o, IndexedListNode *node, uint64_t index) -{ - ASSERT(index <= IndexedList__Tree_Count(&o->tree, 0)) - ASSERT(IndexedList__Tree_Count(&o->tree, 0) < UINT64_MAX - 1) - - uint64_t orig_count = IndexedList__Tree_Count(&o->tree, 0); - B_USE(orig_count) - - IndexedList__Tree_InsertAt(&o->tree, 0, IndexedList__TreeDeref(0, node), index); - - ASSERT(IndexedList__Tree_IndexOf(&o->tree, 0, IndexedList__TreeDeref(0, node)) == index) - ASSERT(IndexedList__Tree_Count(&o->tree, 0) == orig_count + 1) -} - -static void IndexedList_Remove (IndexedList *o, IndexedListNode *node) -{ - IndexedList__Tree_Remove(&o->tree, 0, IndexedList__TreeDeref(0, node)); -} - -static uint64_t IndexedList_Count (IndexedList *o) -{ - return IndexedList__Tree_Count(&o->tree, 0); -} - -static uint64_t IndexedList_IndexOf (IndexedList *o, IndexedListNode *node) -{ - return IndexedList__Tree_IndexOf(&o->tree, 0, IndexedList__TreeDeref(0, node)); -} - -static IndexedListNode * IndexedList_GetAt (IndexedList *o, uint64_t index) -{ - ASSERT(index < IndexedList__Tree_Count(&o->tree, 0)) - - IndexedList__TreeRef ref = IndexedList__Tree_GetAt(&o->tree, 0, index); - ASSERT(!IndexedList__TreeIsNullRef(ref)) - - return ref.ptr; -} - -static IndexedListNode * IndexedList_GetFirst (IndexedList *o) -{ - return IndexedList__deref(IndexedList__Tree_GetFirst(&o->tree, 0)); -} - -static IndexedListNode * IndexedList_GetLast (IndexedList *o) -{ - return IndexedList__deref(IndexedList__Tree_GetLast(&o->tree, 0)); -} - -static IndexedListNode * IndexedList_GetNext (IndexedList *o, IndexedListNode *node) -{ - ASSERT(node) - - return IndexedList__deref(IndexedList__Tree_GetNext(&o->tree, 0, IndexedList__TreeDeref(0, node))); -} - -static IndexedListNode * IndexedList_GetPrev (IndexedList *o, IndexedListNode *node) -{ - ASSERT(node) - - return IndexedList__deref(IndexedList__Tree_GetPrev(&o->tree, 0, IndexedList__TreeDeref(0, node))); -} - -#endif diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/structure/IndexedList_tree.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/structure/IndexedList_tree.h deleted file mode 100644 index 130f00fd..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/structure/IndexedList_tree.h +++ /dev/null @@ -1,15 +0,0 @@ -#define CAVL_PARAM_NAME IndexedList__Tree -#define CAVL_PARAM_FEATURE_COUNTS 1 -#define CAVL_PARAM_FEATURE_KEYS_ARE_INDICES 1 -#define CAVL_PARAM_FEATURE_NOKEYS 0 -#define CAVL_PARAM_TYPE_ENTRY IndexedListNode -#define CAVL_PARAM_TYPE_LINK IndexedList__tree_link -#define CAVL_PARAM_TYPE_ARG int -#define CAVL_PARAM_TYPE_COUNT uint64_t -#define CAVL_PARAM_VALUE_COUNT_MAX UINT64_MAX -#define CAVL_PARAM_VALUE_NULL ((IndexedList__tree_link)NULL) -#define CAVL_PARAM_FUN_DEREF(arg, link) (link) -#define CAVL_PARAM_MEMBER_CHILD tree_child -#define CAVL_PARAM_MEMBER_BALANCE tree_balance -#define CAVL_PARAM_MEMBER_PARENT tree_parent -#define CAVL_PARAM_MEMBER_COUNT tree_count diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/structure/LinkedList0.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/structure/LinkedList0.h deleted file mode 100644 index feef4d7b..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/structure/LinkedList0.h +++ /dev/null @@ -1,202 +0,0 @@ -/** - * @file LinkedList0.h - * @author Ambroz Bizjak - * - * @section LICENSE - * - * 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 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE 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. - * - * @section DESCRIPTION - * - * Very simple doubly linked list, with only a 'first' pointer an no 'last' - * pointer. - */ - -#ifndef BADVPN_STRUCTURE_LINKEDLIST0_H -#define BADVPN_STRUCTURE_LINKEDLIST0_H - -#include - -#include - -/** - * Linked list node. - */ -typedef struct LinkedList0Node_t -{ - struct LinkedList0Node_t *p; - struct LinkedList0Node_t *n; -} LinkedList0Node; - -/** - * Simple doubly linked list. - */ -typedef struct -{ - LinkedList0Node *first; -} LinkedList0; - -/** - * Initializes the linked list. - * - * @param list list to initialize - */ -static void LinkedList0_Init (LinkedList0 *list); - -/** - * Determines if the list is empty. - * - * @param list the list - * @return 1 if empty, 0 if not - */ -static int LinkedList0_IsEmpty (LinkedList0 *list); - -/** - * Returns the first node of the list. - * - * @param list the list - * @return first node of the list, or NULL if the list is empty - */ -static LinkedList0Node * LinkedList0_GetFirst (LinkedList0 *list); - -/** - * Inserts a node to the beginning of the list. - * - * @param list the list - * @param node uninitialized node to insert - */ -static void LinkedList0_Prepend (LinkedList0 *list, LinkedList0Node *node); - -/** - * Inserts a node before a given node. - * - * @param list the list - * @param node uninitialized node to insert - * @param target node in the list to insert before - */ -static void LinkedList0_InsertBefore (LinkedList0 *list, LinkedList0Node *node, LinkedList0Node *target); - -/** - * Inserts a node after a given node. - * - * @param list the list - * @param node uninitialized node to insert - * @param target node in the list to insert after - */ -static void LinkedList0_InsertAfter (LinkedList0 *list, LinkedList0Node *node, LinkedList0Node *target); - -/** - * Removes a node from the list. - * - * @param list the list - * @param node node to remove - */ -static void LinkedList0_Remove (LinkedList0 *list, LinkedList0Node *node); - -/** - * Returns the next node of a given node. - * - * @param node reference node - * @return next node, or NULL if none - */ -static LinkedList0Node * LinkedList0Node_Next (LinkedList0Node *node); - -/** - * Returns the previous node of a given node. - * - * @param node reference node - * @return previous node, or NULL if none - */ -static LinkedList0Node * LinkedList0Node_Prev (LinkedList0Node *node); - -void LinkedList0_Init (LinkedList0 *list) -{ - list->first = NULL; -} - -int LinkedList0_IsEmpty (LinkedList0 *list) -{ - return (!list->first); -} - -LinkedList0Node * LinkedList0_GetFirst (LinkedList0 *list) -{ - return (list->first); -} - -void LinkedList0_Prepend (LinkedList0 *list, LinkedList0Node *node) -{ - node->p = NULL; - node->n = list->first; - if (list->first) { - list->first->p = node; - } - list->first = node; -} - -void LinkedList0_InsertBefore (LinkedList0 *list, LinkedList0Node *node, LinkedList0Node *target) -{ - node->p = target->p; - node->n = target; - if (target->p) { - target->p->n = node; - } else { - list->first = node; - } - target->p = node; -} - -void LinkedList0_InsertAfter (LinkedList0 *list, LinkedList0Node *node, LinkedList0Node *target) -{ - node->p = target; - node->n = target->n; - if (target->n) { - target->n->p = node; - } - target->n = node; -} - -void LinkedList0_Remove (LinkedList0 *list, LinkedList0Node *node) -{ - // remove from list - if (node->p) { - node->p->n = node->n; - } else { - list->first = node->n; - } - if (node->n) { - node->n->p = node->p; - } -} - -LinkedList0Node * LinkedList0Node_Next (LinkedList0Node *node) -{ - return node->n; -} - -LinkedList0Node * LinkedList0Node_Prev (LinkedList0Node *node) -{ - return node->p; -} - -#endif diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/structure/LinkedList1.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/structure/LinkedList1.h deleted file mode 100644 index 15ec2694..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/structure/LinkedList1.h +++ /dev/null @@ -1,275 +0,0 @@ -/** - * @file LinkedList1.h - * @author Ambroz Bizjak - * - * @section LICENSE - * - * 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 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE 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. - * - * @section DESCRIPTION - * - * Simple doubly linked list. - */ - -#ifndef BADVPN_STRUCTURE_LINKEDLIST1_H -#define BADVPN_STRUCTURE_LINKEDLIST1_H - -#include - -#include "misc/debug.h" - -/** - * Linked list node. - */ -typedef struct LinkedList1Node_t -{ - struct LinkedList1Node_t *p; - struct LinkedList1Node_t *n; -} LinkedList1Node; - -/** - * Simple doubly linked list. - */ -typedef struct -{ - LinkedList1Node *first; - LinkedList1Node *last; -} LinkedList1; - -/** - * Initializes the linked list. - * - * @param list list to initialize - */ -static void LinkedList1_Init (LinkedList1 *list); - -/** - * Determines if the list is empty. - * - * @param list the list - * @return 1 if empty, 0 if not - */ -static int LinkedList1_IsEmpty (LinkedList1 *list); - -/** - * Returns the first node of the list. - * - * @param list the list - * @return first node of the list, or NULL if the list is empty - */ -static LinkedList1Node * LinkedList1_GetFirst (LinkedList1 *list); - -/** - * Returns the last node of the list. - * - * @param list the list - * @return last node of the list, or NULL if the list is empty - */ -static LinkedList1Node * LinkedList1_GetLast (LinkedList1 *list); - -/** - * Inserts a node to the beginning of the list. - * - * @param list the list - * @param node uninitialized node to insert - */ -static void LinkedList1_Prepend (LinkedList1 *list, LinkedList1Node *node); - -/** - * Inserts a node to the end of the list. - * - * @param list the list - * @param node uninitialized node to insert - */ -static void LinkedList1_Append (LinkedList1 *list, LinkedList1Node *node); - -/** - * Inserts a node before a given node. - * - * @param list the list - * @param node uninitialized node to insert - * @param target node in the list to insert before - */ -static void LinkedList1_InsertBefore (LinkedList1 *list, LinkedList1Node *node, LinkedList1Node *target); - -/** - * Inserts a node after a given node. - * - * @param list the list - * @param node uninitialized node to insert - * @param target node in the list to insert after - */ -static void LinkedList1_InsertAfter (LinkedList1 *list, LinkedList1Node *node, LinkedList1Node *target); - -/** - * Removes a node from the list. - * - * @param list the list - * @param node node to remove - */ -static void LinkedList1_Remove (LinkedList1 *list, LinkedList1Node *node); - -/** - * Inserts the nodes in the list \a ins_list into this list, after the node \a target. - * If \a target is NULL, the nodes are inserted to the beginning. - * Note that because the first and last node in \a ins_list are modified - * (unless the list is empty), \a ins_list is invalidated and must no longer - * be used to access the inserted nodes. - */ -static void LinkedList1_InsertListAfter (LinkedList1 *list, LinkedList1 ins_list, LinkedList1Node *target); - -/** - * Returns the next node of a given node. - * - * @param node reference node - * @return next node, or NULL if none - */ -static LinkedList1Node * LinkedList1Node_Next (LinkedList1Node *node); - -/** - * Returns the previous node of a given node. - * - * @param node reference node - * @return previous node, or NULL if none - */ -static LinkedList1Node * LinkedList1Node_Prev (LinkedList1Node *node); - -void LinkedList1_Init (LinkedList1 *list) -{ - list->first = NULL; - list->last = NULL; -} - -int LinkedList1_IsEmpty (LinkedList1 *list) -{ - return (list->first) == NULL; -} - -LinkedList1Node * LinkedList1_GetFirst (LinkedList1 *list) -{ - return (list->first); -} - -LinkedList1Node * LinkedList1_GetLast (LinkedList1 *list) -{ - return (list->last); -} - -void LinkedList1_Prepend (LinkedList1 *list, LinkedList1Node *node) -{ - node->p = NULL; - node->n = list->first; - if (list->first) { - list->first->p = node; - } else { - list->last = node; - } - list->first = node; -} - -void LinkedList1_Append (LinkedList1 *list, LinkedList1Node *node) -{ - node->p = list->last; - node->n = NULL; - if (list->last) { - list->last->n = node; - } else { - list->first = node; - } - list->last = node; -} - -void LinkedList1_InsertBefore (LinkedList1 *list, LinkedList1Node *node, LinkedList1Node *target) -{ - node->p = target->p; - node->n = target; - if (target->p) { - target->p->n = node; - } else { - list->first = node; - } - target->p = node; -} - -void LinkedList1_InsertAfter (LinkedList1 *list, LinkedList1Node *node, LinkedList1Node *target) -{ - node->p = target; - node->n = target->n; - if (target->n) { - target->n->p = node; - } else { - list->last = node; - } - target->n = node; -} - -void LinkedList1_Remove (LinkedList1 *list, LinkedList1Node *node) -{ - // remove from list - if (node->p) { - node->p->n = node->n; - } else { - list->first = node->n; - } - if (node->n) { - node->n->p = node->p; - } else { - list->last = node->p; - } -} - -void LinkedList1_InsertListAfter (LinkedList1 *list, LinkedList1 ins_list, LinkedList1Node *target) -{ - if (!ins_list.first) { - return; - } - - LinkedList1Node *t_next = (target ? target->n : list->first); - - ins_list.first->p = target; - ins_list.last->n = t_next; - - if (target) { - target->n = ins_list.first; - } else { - list->first = ins_list.first; - } - - if (t_next) { - t_next->p = ins_list.last; - } else { - list->last = ins_list.last; - } -} - -LinkedList1Node * LinkedList1Node_Next (LinkedList1Node *node) -{ - return node->n; -} - -LinkedList1Node * LinkedList1Node_Prev (LinkedList1Node *node) -{ - return node->p; -} - -#endif diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/structure/LinkedList3.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/structure/LinkedList3.h deleted file mode 100644 index 8f54cdb5..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/structure/LinkedList3.h +++ /dev/null @@ -1,362 +0,0 @@ -/** - * @file LinkedList3.h - * @author Ambroz Bizjak - * - * @section LICENSE - * - * 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 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE 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. - * - * @section DESCRIPTION - * - * Doubly linked list that support multiple iterations and removing - * aritrary elements during iteration, without a central object to - * represent the list. - */ - -#ifndef BADVPN_STRUCTURE_LINKEDLIST3_H -#define BADVPN_STRUCTURE_LINKEDLIST3_H - -#include -#include - -#include - -struct _LinkedList3Iterator; - -/** - * Linked list node. - */ -typedef struct _LinkedList3Node { - struct _LinkedList3Node *p; - struct _LinkedList3Node *n; - struct _LinkedList3Iterator *it; -} LinkedList3Node; - -/** - * Linked list iterator. - */ -typedef struct _LinkedList3Iterator { - int8_t dir; - struct _LinkedList3Node *e; - struct _LinkedList3Iterator *pi; - struct _LinkedList3Iterator *ni; -} LinkedList3Iterator; - -/** - * Initializes a list node to form a new list consisting of a - * single node. - * - * @param node list node structure to initialize. The node must remain - * available until it is freed with {@link LinkedList3Node_Free}, - * or the list is no longer required. - */ -static void LinkedList3Node_InitLonely (LinkedList3Node *node); - -/** - * Initializes a list node to go after an existing node. - * - * @param node list node structure to initialize. The node must remain - * available until it is freed with {@link LinkedList3Node_Free}, - * or the list is no longer required. - * @param ref existing list node - */ -static void LinkedList3Node_InitAfter (LinkedList3Node *node, LinkedList3Node *ref); - -/** - * Initializes a list node to go before an existing node. - * - * @param node list node structure to initialize. The node must remain - * available until it is freed with {@link LinkedList3Node_Free}, - * or the list is no longer required. - * @param ref existing list node - */ -static void LinkedList3Node_InitBefore (LinkedList3Node *node, LinkedList3Node *ref); - -/** - * Frees a list node, removing it a list (if there were other nodes - * in the list). - * - * @param node list node to free - */ -static void LinkedList3Node_Free (LinkedList3Node *node); - -/** - * Determines if a list node is a single node in a list. - * - * @param node list node - * @return 1 if the node ia a single node, 0 if not - */ -static int LinkedList3Node_IsLonely (LinkedList3Node *node); - -/** - * Returnes the node preceding this node (if there is one), - * the node following this node (if there is one), or NULL, - * respectively. - * - * @param node list node - * @return neighbour node or NULL if none - */ -static LinkedList3Node * LinkedList3Node_PrevOrNext (LinkedList3Node *node); - -/** - * Returnes the node following this node (if there is one), - * the node preceding this node (if there is one), or NULL, - * respectively. - * - * @param node list node - * @return neighbour node or NULL if none - */ -static LinkedList3Node * LinkedList3Node_NextOrPrev (LinkedList3Node *node); - -/** - * Returns the node preceding this node, or NULL if there is none. - * - * @param node list node - * @return left neighbour, or NULL if none - */ -static LinkedList3Node * LinkedList3Node_Prev (LinkedList3Node *node); - -/** - * Returns the node following this node, or NULL if there is none. - * - * @param node list node - * @return right neighbour, or NULL if none - */ -static LinkedList3Node * LinkedList3Node_Next (LinkedList3Node *node); - -/** - * Returns the first node in the list which this node is part of. - * It is found by iterating the list from this node to the beginning. - * - * @param node list node - * @return first node in the list - */ -static LinkedList3Node * LinkedList3Node_First (LinkedList3Node *node); - -/** - * Returns the last node in the list which this node is part of. - * It is found by iterating the list from this node to the end. - * - * @param node list node - * @return last node in the list - */ -static LinkedList3Node * LinkedList3Node_Last (LinkedList3Node *node); - -/** - * Initializes a linked list iterator. - * The iterator structure must remain available until either of these occurs: - * - the list is no longer needed, or - * - the iterator is freed with {@link LinkedList3Iterator_Free}, or - * - the iterator reaches the end of iteration. - * - * @param it uninitialized iterator to initialize - * @param e initial position of the iterator. NULL for end of iteration. - * @param dir direction of iteration. Must be 1 (forward) or -1 (backward). - */ -static void LinkedList3Iterator_Init (LinkedList3Iterator *it, LinkedList3Node *e, int dir); - -/** - * Frees a linked list iterator. - * - * @param it iterator to free - */ -static void LinkedList3Iterator_Free (LinkedList3Iterator *it); - -/** - * Moves the iterator one node forward or backward (depending on its direction), or, - * if it's at the last or first node (depending on the direction), it reaches - * the end of iteration, or, if it's at the end of iteration, it remains there. - * Returns the the previous position. - * - * @param it the iterator - * @return node on the position of iterator before it was (possibly) moved, or NULL - * if it was at the end of iteration - */ -static LinkedList3Node * LinkedList3Iterator_Next (LinkedList3Iterator *it); - -void LinkedList3Node_InitLonely (LinkedList3Node *node) -{ - node->p = NULL; - node->n = NULL; - node->it = NULL; -} - -void LinkedList3Node_InitAfter (LinkedList3Node *node, LinkedList3Node *ref) -{ - ASSERT(ref) - - node->p = ref; - node->n = ref->n; - ref->n = node; - if (node->n) { - node->n->p = node; - } - node->it = NULL; -} - -void LinkedList3Node_InitBefore (LinkedList3Node *node, LinkedList3Node *ref) -{ - ASSERT(ref) - - node->n = ref; - node->p = ref->p; - ref->p = node; - if (node->p) { - node->p->n = node; - } - node->it = NULL; -} - -void LinkedList3Node_Free (LinkedList3Node *node) -{ - // jump iterators - while (node->it) { - LinkedList3Iterator_Next(node->it); - } - - if (node->p) { - node->p->n = node->n; - } - if (node->n) { - node->n->p = node->p; - } -} - -int LinkedList3Node_IsLonely (LinkedList3Node *node) -{ - return (!node->p && !node->n); -} - -LinkedList3Node * LinkedList3Node_PrevOrNext (LinkedList3Node *node) -{ - if (node->p) { - return node->p; - } - if (node->n) { - return node->n; - } - return NULL; -} - -LinkedList3Node * LinkedList3Node_NextOrPrev (LinkedList3Node *node) -{ - if (node->n) { - return node->n; - } - if (node->p) { - return node->p; - } - return NULL; -} - -LinkedList3Node * LinkedList3Node_Prev (LinkedList3Node *node) -{ - return node->p; -} - -LinkedList3Node * LinkedList3Node_Next (LinkedList3Node *node) -{ - return node->n; -} - -LinkedList3Node * LinkedList3Node_First (LinkedList3Node *node) -{ - while (node->p) { - node = node->p; - } - - return node; -} - -LinkedList3Node * LinkedList3Node_Last (LinkedList3Node *node) -{ - while (node->n) { - node = node->n; - } - - return node; -} - -void LinkedList3Iterator_Init (LinkedList3Iterator *it, LinkedList3Node *e, int dir) -{ - ASSERT(dir == -1 || dir == 1) - - it->dir = dir; - it->e = e; - - if (e) { - // link into node's iterator list - it->pi = NULL; - it->ni = e->it; - if (e->it) { - e->it->pi = it; - } - e->it = it; - } -} - -void LinkedList3Iterator_Free (LinkedList3Iterator *it) -{ - if (it->e) { - // remove from node's iterator list - if (it->ni) { - it->ni->pi = it->pi; - } - if (it->pi) { - it->pi->ni = it->ni; - } else { - it->e->it = it->ni; - } - } -} - -LinkedList3Node * LinkedList3Iterator_Next (LinkedList3Iterator *it) -{ - // remember original entry - LinkedList3Node *orig = it->e; - - // jump to next entry - if (it->e) { - // get next entry - LinkedList3Node *next = NULL; // to remove warning - switch (it->dir) { - case 1: - next = it->e->n; - break; - case -1: - next = it->e->p; - break; - default: - ASSERT(0); - } - // destroy interator - LinkedList3Iterator_Free(it); - // re-initialize at next entry - LinkedList3Iterator_Init(it, next, it->dir); - } - - // return original entry - return orig; -} - -#endif diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/structure/SAvl.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/structure/SAvl.h deleted file mode 100644 index 36aa10ef..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/structure/SAvl.h +++ /dev/null @@ -1,40 +0,0 @@ -/** - * @file SAvl.h - * @author Ambroz Bizjak - * - * @section LICENSE - * - * 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 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE 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. - */ - -#ifndef BADVPN_SAVL_H -#define BADVPN_SAVL_H - -#include -#include - -#include "structure/CAvl.h" -#include "misc/merge.h" -#include "misc/debug.h" - -#endif diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/structure/SAvl_decl.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/structure/SAvl_decl.h deleted file mode 100644 index c1d9244d..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/structure/SAvl_decl.h +++ /dev/null @@ -1,73 +0,0 @@ -/** - * @file SAvl_decl.h - * @author Ambroz Bizjak - * - * @section LICENSE - * - * 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 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE 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. - */ - -#include "SAvl_header.h" - -typedef SAvlEntry *SAvl__TreeLink; - -#include "SAvl_tree.h" -#include "structure/CAvl_decl.h" - -typedef struct { - SAvl__Tree tree; -} SAvl; - -typedef struct { - SAvlEntry *child[2]; - SAvlEntry *parent; - int8_t balance; -#if SAVL_PARAM_FEATURE_COUNTS - SAvlCount count; -#endif -} SAvlNode; - -static void SAvl_Init (SAvl *o); -static int SAvl_Insert (SAvl *o, SAvlArg arg, SAvlEntry *entry, SAvlEntry **out_existing); -static void SAvl_Remove (SAvl *o, SAvlArg arg, SAvlEntry *entry); -#if !SAVL_PARAM_FEATURE_NOKEYS -static SAvlEntry * SAvl_Lookup (const SAvl *o, SAvlArg arg, SAvlKey key); -static SAvlEntry * SAvl_LookupExact (const SAvl *o, SAvlArg arg, SAvlKey key); -static SAvlEntry * SAvl_GetFirstGreater (const SAvl *o, SAvlArg arg, SAvlKey key); -static SAvlEntry * SAvl_GetLastLesser (const SAvl *o, SAvlArg arg, SAvlKey key); -static SAvlEntry * SAvl_GetFirstGreaterEqual (const SAvl *o, SAvlArg arg, SAvlKey key); -static SAvlEntry * SAvl_GetLastLesserEqual (const SAvl *o, SAvlArg arg, SAvlKey key); -#endif -static SAvlEntry * SAvl_GetFirst (const SAvl *o, SAvlArg arg); -static SAvlEntry * SAvl_GetLast (const SAvl *o, SAvlArg arg); -static SAvlEntry * SAvl_GetNext (const SAvl *o, SAvlArg arg, SAvlEntry *entry); -static SAvlEntry * SAvl_GetPrev (const SAvl *o, SAvlArg arg, SAvlEntry *entry); -static int SAvl_IsEmpty (const SAvl *o); -static void SAvl_Verify (const SAvl *o, SAvlArg arg); -#if SAVL_PARAM_FEATURE_COUNTS -static SAvlCount SAvl_Count (const SAvl *o, SAvlArg arg); -static SAvlCount SAvl_IndexOf (const SAvl *o, SAvlArg arg, SAvlEntry *entry); -static SAvlEntry * SAvl_GetAt (const SAvl *o, SAvlArg arg, SAvlCount index); -#endif - -#include "SAvl_footer.h" diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/structure/SAvl_footer.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/structure/SAvl_footer.h deleted file mode 100644 index ad90e404..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/structure/SAvl_footer.h +++ /dev/null @@ -1,89 +0,0 @@ -/** - * @file SAvl_footer.h - * @author Ambroz Bizjak - * - * @section LICENSE - * - * 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 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE 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. - */ - -#undef SAVL_PARAM_NAME -#undef SAVL_PARAM_FEATURE_COUNTS -#undef SAVL_PARAM_FEATURE_NOKEYS -#undef SAVL_PARAM_TYPE_ENTRY -#undef SAVL_PARAM_TYPE_KEY -#undef SAVL_PARAM_TYPE_ARG -#undef SAVL_PARAM_TYPE_COUNT -#undef SAVL_PARAM_VALUE_COUNT_MAX -#undef SAVL_PARAM_FUN_COMPARE_ENTRIES -#undef SAVL_PARAM_FUN_COMPARE_KEY_ENTRY -#undef SAVL_PARAM_MEMBER_NODE - -#undef SAvl -#undef SAvlEntry -#undef SAvlArg -#undef SAvlKey -#undef SAvlCount -#undef SAvlNode - -#undef SAvl_Init -#undef SAvl_Insert -#undef SAvl_Remove -#undef SAvl_Lookup -#undef SAvl_LookupExact -#undef SAvl_GetFirstGreater -#undef SAvl_GetLastLesser -#undef SAvl_GetFirstGreaterEqual -#undef SAvl_GetLastLesserEqual -#undef SAvl_GetFirst -#undef SAvl_GetLast -#undef SAvl_GetNext -#undef SAvl_GetPrev -#undef SAvl_IsEmpty -#undef SAvl_Verify -#undef SAvl_Count -#undef SAvl_IndexOf -#undef SAvl_GetAt - -#undef SAvl__Tree -#undef SAvl__TreeRef -#undef SAvl__TreeLink -#undef SAvl__TreeDeref -#undef SAvl__Tree_Init -#undef SAvl__Tree_Insert -#undef SAvl__Tree_Remove -#undef SAvl__Tree_Lookup -#undef SAvl__Tree_LookupExact -#undef SAvl__Tree_GetFirstGreater -#undef SAvl__Tree_GetLastLesser -#undef SAvl__Tree_GetFirstGreaterEqual -#undef SAvl__Tree_GetLastLesserEqual -#undef SAvl__Tree_GetFirst -#undef SAvl__Tree_GetLast -#undef SAvl__Tree_GetNext -#undef SAvl__Tree_GetPrev -#undef SAvl__Tree_IsEmpty -#undef SAvl__Tree_Verify -#undef SAvl__Tree_Count -#undef SAvl__Tree_IndexOf -#undef SAvl__Tree_GetAt diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/structure/SAvl_header.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/structure/SAvl_header.h deleted file mode 100644 index 5d7d9b15..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/structure/SAvl_header.h +++ /dev/null @@ -1,93 +0,0 @@ -/** - * @file SAvl_header.h - * @author Ambroz Bizjak - * - * @section LICENSE - * - * 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 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE 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. - */ - -// Preprocessor inputs. All types must be typedef names unless stated otherwise. -// SAVL_PARAM_NAME - name of this data structure -// SAVL_PARAM_FEATURE_COUNTS - whether to keep count information (0 or 1) -// SAVL_PARAM_FEATURE_NOKEYS - define to 1 if there is no need for a lookup operation -// SAVL_PARAM_TYPE_ENTRY - type of entry. This can also be a struct (e.g.: struct Foo). -// SAVL_PARAM_TYPE_KEY - type of key (ignored if SAVL_PARAM_FEATURE_NOKEYS) -// SAVL_PARAM_TYPE_ARG - type of argument pass through to callbacks -// SAVL_PARAM_TYPE_COUNT - type of count (only if SAVL_PARAM_FEATURE_COUNTS) -// SAVL_PARAM_VALUE_COUNT_MAX - maximum value of count (of type SAVL_PARAM_TYPE_COUNT) (only if SAVL_PARAM_FEATURE_COUNTS) -// SAVL_PARAM_FUN_COMPARE_ENTRIES(arg, entry1, entry2) - compare two entries; returns -1/0/1 -// SAVL_PARAM_FUN_COMPARE_KEY_ENTRY(arg, key1, entry2) - compare key and entry; returns -1/0/1 (ignored if SAVL_PARAM_FEATURE_NOKEYS) -// SAVL_PARAM_MEMBER_NODE - node member in entry - -// types -#define SAvl SAVL_PARAM_NAME -#define SAvlEntry SAVL_PARAM_TYPE_ENTRY -#define SAvlArg SAVL_PARAM_TYPE_ARG -#define SAvlKey SAVL_PARAM_TYPE_KEY -#define SAvlCount SAVL_PARAM_TYPE_COUNT -#define SAvlNode MERGE(SAvl, Node) - -// public functions -#define SAvl_Init MERGE(SAvl, _Init) -#define SAvl_Insert MERGE(SAvl, _Insert) -#define SAvl_Remove MERGE(SAvl, _Remove) -#define SAvl_Lookup MERGE(SAvl, _Lookup) -#define SAvl_LookupExact MERGE(SAvl, _LookupExact) -#define SAvl_GetFirstGreater MERGE(SAvl, _GetFirstGreater) -#define SAvl_GetLastLesser MERGE(SAvl, _GetLastLesser) -#define SAvl_GetFirstGreaterEqual MERGE(SAvl, _GetFirstGreaterEqual) -#define SAvl_GetLastLesserEqual MERGE(SAvl, _GetLastLesserEqual) -#define SAvl_GetFirst MERGE(SAvl, _GetFirst) -#define SAvl_GetLast MERGE(SAvl, _GetLast) -#define SAvl_GetNext MERGE(SAvl, _GetNext) -#define SAvl_GetPrev MERGE(SAvl, _GetPrev) -#define SAvl_IsEmpty MERGE(SAvl, _IsEmpty) -#define SAvl_Verify MERGE(SAvl, _Verify) -#define SAvl_Count MERGE(SAvl, _Count) -#define SAvl_IndexOf MERGE(SAvl, _IndexOf) -#define SAvl_GetAt MERGE(SAvl, _GetAt) - -// internal stuff -#define SAvl__Tree MERGE(SAvl, __Tree) -#define SAvl__TreeRef MERGE(SAvl, __TreeRef) -#define SAvl__TreeLink MERGE(SAvl, __TreeLink) -#define SAvl__TreeDeref MERGE(SAvl, __TreeDeref) -#define SAvl__Tree_Init MERGE(SAvl, __Tree_Init) -#define SAvl__Tree_Insert MERGE(SAvl, __Tree_Insert) -#define SAvl__Tree_Remove MERGE(SAvl, __Tree_Remove) -#define SAvl__Tree_Lookup MERGE(SAvl, __Tree_Lookup) -#define SAvl__Tree_LookupExact MERGE(SAvl, __Tree_LookupExact) -#define SAvl__Tree_GetFirstGreater MERGE(SAvl, __Tree_GetFirstGreater) -#define SAvl__Tree_GetLastLesser MERGE(SAvl, __Tree_GetLastLesser) -#define SAvl__Tree_GetFirstGreaterEqual MERGE(SAvl, __Tree_GetFirstGreaterEqual) -#define SAvl__Tree_GetLastLesserEqual MERGE(SAvl, __Tree_GetLastLesserEqual) -#define SAvl__Tree_GetFirst MERGE(SAvl, __Tree_GetFirst) -#define SAvl__Tree_GetLast MERGE(SAvl, __Tree_GetLast) -#define SAvl__Tree_GetNext MERGE(SAvl, __Tree_GetNext) -#define SAvl__Tree_GetPrev MERGE(SAvl, __Tree_GetPrev) -#define SAvl__Tree_IsEmpty MERGE(SAvl, __Tree_IsEmpty) -#define SAvl__Tree_Verify MERGE(SAvl, __Tree_Verify) -#define SAvl__Tree_Count MERGE(SAvl, __Tree_Count) -#define SAvl__Tree_IndexOf MERGE(SAvl, __Tree_IndexOf) -#define SAvl__Tree_GetAt MERGE(SAvl, __Tree_GetAt) diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/structure/SAvl_impl.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/structure/SAvl_impl.h deleted file mode 100644 index 95fd65f2..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/structure/SAvl_impl.h +++ /dev/null @@ -1,164 +0,0 @@ -/** - * @file SAvl_impl.h - * @author Ambroz Bizjak - * - * @section LICENSE - * - * 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 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE 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. - */ - -#include "SAvl_header.h" - -#include "SAvl_tree.h" -#include "structure/CAvl_impl.h" - -static void SAvl_Init (SAvl *o) -{ - SAvl__Tree_Init(&o->tree); -} - -static int SAvl_Insert (SAvl *o, SAvlArg arg, SAvlEntry *entry, SAvlEntry **out_existing) -{ - ASSERT(entry) -#if SAVL_PARAM_FEATURE_COUNTS - ASSERT(SAvl_Count(o, arg) < SAVL_PARAM_VALUE_COUNT_MAX) -#endif - - SAvl__TreeRef out_ref; - int res = SAvl__Tree_Insert(&o->tree, arg, SAvl__TreeDeref(arg, entry), &out_ref); - - if (out_existing) { - *out_existing = out_ref.link; - } - - return res; -} - -static void SAvl_Remove (SAvl *o, SAvlArg arg, SAvlEntry *entry) -{ - ASSERT(entry) - - SAvl__Tree_Remove(&o->tree, arg, SAvl__TreeDeref(arg, entry)); -} - -#if !SAVL_PARAM_FEATURE_NOKEYS - -static SAvlEntry * SAvl_Lookup (const SAvl *o, SAvlArg arg, SAvlKey key) -{ - SAvl__TreeRef ref = SAvl__Tree_Lookup(&o->tree, arg, key); - return ref.link; -} - -static SAvlEntry * SAvl_LookupExact (const SAvl *o, SAvlArg arg, SAvlKey key) -{ - SAvl__TreeRef ref = SAvl__Tree_LookupExact(&o->tree, arg, key); - return ref.link; -} - -static SAvlEntry * SAvl_GetFirstGreater (const SAvl *o, SAvlArg arg, SAvlKey key) -{ - SAvl__TreeRef ref = SAvl__Tree_GetFirstGreater(&o->tree, arg, key); - return ref.link; -} - -static SAvlEntry * SAvl_GetLastLesser (const SAvl *o, SAvlArg arg, SAvlKey key) -{ - SAvl__TreeRef ref = SAvl__Tree_GetLastLesser(&o->tree, arg, key); - return ref.link; -} - -static SAvlEntry * SAvl_GetFirstGreaterEqual (const SAvl *o, SAvlArg arg, SAvlKey key) -{ - SAvl__TreeRef ref = SAvl__Tree_GetFirstGreaterEqual(&o->tree, arg, key); - return ref.link; -} - -static SAvlEntry * SAvl_GetLastLesserEqual (const SAvl *o, SAvlArg arg, SAvlKey key) -{ - SAvl__TreeRef ref = SAvl__Tree_GetLastLesserEqual(&o->tree, arg, key); - return ref.link; -} - -#endif - -static SAvlEntry * SAvl_GetFirst (const SAvl *o, SAvlArg arg) -{ - SAvl__TreeRef ref = SAvl__Tree_GetFirst(&o->tree, arg); - return ref.link; -} - -static SAvlEntry * SAvl_GetLast (const SAvl *o, SAvlArg arg) -{ - SAvl__TreeRef ref = SAvl__Tree_GetLast(&o->tree, arg); - return ref.link; -} - -static SAvlEntry * SAvl_GetNext (const SAvl *o, SAvlArg arg, SAvlEntry *entry) -{ - ASSERT(entry) - - SAvl__TreeRef ref = SAvl__Tree_GetNext(&o->tree, arg, SAvl__TreeDeref(arg, entry)); - return ref.link; -} - -static SAvlEntry * SAvl_GetPrev (const SAvl *o, SAvlArg arg, SAvlEntry *entry) -{ - ASSERT(entry) - - SAvl__TreeRef ref = SAvl__Tree_GetPrev(&o->tree, arg, SAvl__TreeDeref(arg, entry)); - return ref.link; -} - -static int SAvl_IsEmpty (const SAvl *o) -{ - return SAvl__Tree_IsEmpty(&o->tree); -} - -static void SAvl_Verify (const SAvl *o, SAvlArg arg) -{ - return SAvl__Tree_Verify(&o->tree, arg); -} - -#if SAVL_PARAM_FEATURE_COUNTS - -static SAvlCount SAvl_Count (const SAvl *o, SAvlArg arg) -{ - return SAvl__Tree_Count(&o->tree, arg); -} - -static SAvlCount SAvl_IndexOf (const SAvl *o, SAvlArg arg, SAvlEntry *entry) -{ - ASSERT(entry) - - return SAvl__Tree_IndexOf(&o->tree, arg, SAvl__TreeDeref(arg, entry)); -} - -static SAvlEntry * SAvl_GetAt (const SAvl *o, SAvlArg arg, SAvlCount index) -{ - SAvl__TreeRef ref = SAvl__Tree_GetAt(&o->tree, arg, index); - return ref.link; -} - -#endif - -#include "SAvl_footer.h" diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/structure/SAvl_tree.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/structure/SAvl_tree.h deleted file mode 100644 index 5e5b18bb..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/structure/SAvl_tree.h +++ /dev/null @@ -1,18 +0,0 @@ -#define CAVL_PARAM_NAME SAvl__Tree -#define CAVL_PARAM_FEATURE_COUNTS SAVL_PARAM_FEATURE_COUNTS -#define CAVL_PARAM_FEATURE_KEYS_ARE_INDICES 0 -#define CAVL_PARAM_FEATURE_NOKEYS SAVL_PARAM_FEATURE_NOKEYS -#define CAVL_PARAM_TYPE_ENTRY SAvlEntry -#define CAVL_PARAM_TYPE_LINK SAvl__TreeLink -#define CAVL_PARAM_TYPE_KEY SAvlKey -#define CAVL_PARAM_TYPE_ARG SAvlArg -#define CAVL_PARAM_TYPE_COUNT SAvlCount -#define CAVL_PARAM_VALUE_COUNT_MAX SAVL_PARAM_VALUE_COUNT_MAX -#define CAVL_PARAM_VALUE_NULL ((SAvl__TreeLink)NULL) -#define CAVL_PARAM_FUN_DEREF(arg, link) (link) -#define CAVL_PARAM_FUN_COMPARE_ENTRIES(arg, entry1, entry2) SAVL_PARAM_FUN_COMPARE_ENTRIES((arg), (entry1).link, (entry2).link) -#define CAVL_PARAM_FUN_COMPARE_KEY_ENTRY(arg, key1, entry2) SAVL_PARAM_FUN_COMPARE_KEY_ENTRY((arg), (key1), (entry2).link) -#define CAVL_PARAM_MEMBER_CHILD SAVL_PARAM_MEMBER_NODE . child -#define CAVL_PARAM_MEMBER_BALANCE SAVL_PARAM_MEMBER_NODE . balance -#define CAVL_PARAM_MEMBER_PARENT SAVL_PARAM_MEMBER_NODE . parent -#define CAVL_PARAM_MEMBER_COUNT SAVL_PARAM_MEMBER_NODE . count diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/structure/SLinkedList.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/structure/SLinkedList.h deleted file mode 100644 index 966a3de8..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/structure/SLinkedList.h +++ /dev/null @@ -1,38 +0,0 @@ -/** - * @file SLinkedList.h - * @author Ambroz Bizjak - * - * @section LICENSE - * - * 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 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE 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. - */ - -#ifndef BADVPN_SLINKEDLIST_H -#define BADVPN_SLINKEDLIST_H - -#include - -#include "misc/merge.h" -#include "misc/debug.h" - -#endif diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/structure/SLinkedList_decl.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/structure/SLinkedList_decl.h deleted file mode 100644 index 4a0ade48..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/structure/SLinkedList_decl.h +++ /dev/null @@ -1,67 +0,0 @@ -/** - * @file SLinkedList_decl.h - * @author Ambroz Bizjak - * - * @section LICENSE - * - * 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 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE 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. - */ - -#include "SLinkedList_header.h" - -typedef struct { - SLinkedListEntry *first; -#if SLINKEDLIST_PARAM_FEATURE_LAST - SLinkedListEntry *last; -#endif -} SLinkedList; - -typedef struct { - SLinkedListEntry *prev; - SLinkedListEntry *next; -} SLinkedListNode; - -static void SLinkedListMarkRemoved (SLinkedListEntry *entry); -static int SLinkedListIsRemoved (SLinkedListEntry *entry); - -static void SLinkedList_Init (SLinkedList *o); -static SLinkedListEntry * SLinkedList_Next (SLinkedList *o, SLinkedListEntry *entry); -static SLinkedListEntry * SLinkedList_Prev (SLinkedList *o, SLinkedListEntry *entry); -static void SLinkedList_Prepend (SLinkedList *o, SLinkedListEntry *entry); -#if SLINKEDLIST_PARAM_FEATURE_LAST -static void SLinkedList_Append (SLinkedList *o, SLinkedListEntry *entry); -#endif -static void SLinkedList_InsertBefore (SLinkedList *o, SLinkedListEntry *entry, SLinkedListEntry *before_entry); -static void SLinkedList_InsertAfter (SLinkedList *o, SLinkedListEntry *entry, SLinkedListEntry *after_entry); -static void SLinkedList_Remove (SLinkedList *o, SLinkedListEntry *entry); -static void SLinkedList_RemoveFirst (SLinkedList *o); -#if SLINKEDLIST_PARAM_FEATURE_LAST -static void SLinkedList_RemoveLast (SLinkedList *o); -#endif -static SLinkedListEntry * SLinkedList_First (const SLinkedList *o); -#if SLINKEDLIST_PARAM_FEATURE_LAST -static SLinkedListEntry * SLinkedList_Last (const SLinkedList *o); -#endif -static int SLinkedList_IsEmpty (const SLinkedList *o); - -#include "SLinkedList_footer.h" diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/structure/SLinkedList_footer.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/structure/SLinkedList_footer.h deleted file mode 100644 index 10ab1e32..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/structure/SLinkedList_footer.h +++ /dev/null @@ -1,57 +0,0 @@ -/** - * @file SLinkedList_footer.h - * @author Ambroz Bizjak - * - * @section LICENSE - * - * 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 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE 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. - */ - -#undef SLINKEDLIST_PARAM_NAME -#undef SLINKEDLIST_PARAM_FEATURE_LAST -#undef SLINKEDLIST_PARAM_TYPE_ENTRY -#undef SLINKEDLIST_PARAM_MEMBER_NODE - -#undef SLinkedList -#undef SLinkedListEntry -#undef SLinkedListNode - -#undef SLinkedListMarkRemoved -#undef SLinkedListIsRemoved - -#undef SLinkedList_Init -#undef SLinkedList_Next -#undef SLinkedList_Prev -#undef SLinkedList_Prepend -#undef SLinkedList_Append -#undef SLinkedList_InsertBefore -#undef SLinkedList_InsertAfter -#undef SLinkedList_Remove -#undef SLinkedList_RemoveFirst -#undef SLinkedList_RemoveLast -#undef SLinkedList_First -#undef SLinkedList_Last -#undef SLinkedList_IsEmpty - -#undef SLinkedList_prev -#undef SLinkedList_next diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/structure/SLinkedList_header.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/structure/SLinkedList_header.h deleted file mode 100644 index 4a0fd54a..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/structure/SLinkedList_header.h +++ /dev/null @@ -1,62 +0,0 @@ -/** - * @file SLinkedList_header.h - * @author Ambroz Bizjak - * - * @section LICENSE - * - * 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 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE 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. - */ - -// Preprocessor inputs: -// SLINKEDLIST_PARAM_NAME - name of this data structure -// SLINKEDLIST_PARAM_FEATURE_LAST - whether to keep track of the last entry in the list (0/1) -// SLINKEDLIST_PARAM_TYPE_ENTRY - type of entry -// SLINKEDLIST_PARAM_MEMBER_NODE - name of the node member in entry - -// types -#define SLinkedList SLINKEDLIST_PARAM_NAME -#define SLinkedListEntry SLINKEDLIST_PARAM_TYPE_ENTRY -#define SLinkedListNode MERGE(SLinkedList, Node) - -// non-object public functions -#define SLinkedListMarkRemoved MERGE(SLinkedList, MarkRemoved) -#define SLinkedListIsRemoved MERGE(SLinkedList, IsRemoved) - -// public functions -#define SLinkedList_Init MERGE(SLinkedList, _Init) -#define SLinkedList_Next MERGE(SLinkedList, _Next) -#define SLinkedList_Prev MERGE(SLinkedList, _Prev) -#define SLinkedList_Prepend MERGE(SLinkedList, _Prepend) -#define SLinkedList_Append MERGE(SLinkedList, _Append) -#define SLinkedList_InsertBefore MERGE(SLinkedList, _InsertBefore) -#define SLinkedList_InsertAfter MERGE(SLinkedList, _InsertAfter) -#define SLinkedList_Remove MERGE(SLinkedList, _Remove) -#define SLinkedList_RemoveFirst MERGE(SLinkedList, _RemoveFirst) -#define SLinkedList_RemoveLast MERGE(SLinkedList, _RemoveLast) -#define SLinkedList_First MERGE(SLinkedList, _First) -#define SLinkedList_Last MERGE(SLinkedList, _Last) -#define SLinkedList_IsEmpty MERGE(SLinkedList, _IsEmpty) - -// private things -#define SLinkedList_prev(entry) ((entry)->SLINKEDLIST_PARAM_MEMBER_NODE . prev) -#define SLinkedList_next(entry) ((entry)->SLINKEDLIST_PARAM_MEMBER_NODE . next) diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/structure/SLinkedList_impl.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/structure/SLinkedList_impl.h deleted file mode 100644 index 1bbce9a5..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/structure/SLinkedList_impl.h +++ /dev/null @@ -1,182 +0,0 @@ -/** - * @file SLinkedList_impl.h - * @author Ambroz Bizjak - * - * @section LICENSE - * - * 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 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE 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. - */ - -#include "SLinkedList_header.h" - -static void SLinkedListMarkRemoved (SLinkedListEntry *entry) -{ - ASSERT(entry) - - SLinkedList_next(entry) = entry; -} - -static int SLinkedListIsRemoved (SLinkedListEntry *entry) -{ - ASSERT(entry) - - return (entry == SLinkedList_next(entry)); -} - -static void SLinkedList_Init (SLinkedList *o) -{ - o->first = NULL; -} - -static SLinkedListEntry * SLinkedList_Next (SLinkedList *o, SLinkedListEntry *entry) -{ - ASSERT(entry) - - return SLinkedList_next(entry); -} - -static SLinkedListEntry * SLinkedList_Prev (SLinkedList *o, SLinkedListEntry *entry) -{ - ASSERT(entry) - - return (entry == o->first) ? NULL : SLinkedList_prev(entry); -} - -static void SLinkedList_Prepend (SLinkedList *o, SLinkedListEntry *entry) -{ - ASSERT(entry) - - SLinkedList_next(entry) = o->first; - if (o->first) { - SLinkedList_prev(o->first) = entry; - } else { -#if SLINKEDLIST_PARAM_FEATURE_LAST - o->last = entry; -#endif - } - o->first = entry; -} - -#if SLINKEDLIST_PARAM_FEATURE_LAST -static void SLinkedList_Append (SLinkedList *o, SLinkedListEntry *entry) -{ - ASSERT(entry) - - SLinkedList_next(entry) = NULL; - if (o->first) { - SLinkedList_prev(entry) = o->last; - SLinkedList_next(o->last) = entry; - } else { - o->first = entry; - } - o->last = entry; -} -#endif - -static void SLinkedList_InsertBefore (SLinkedList *o, SLinkedListEntry *entry, SLinkedListEntry *before_entry) -{ - ASSERT(entry) - ASSERT(before_entry) - - SLinkedList_next(entry) = before_entry; - if (before_entry != o->first) { - SLinkedList_prev(entry) = SLinkedList_prev(before_entry); - SLinkedList_next(SLinkedList_prev(before_entry)) = entry; - } else { - o->first = entry; - } - SLinkedList_prev(before_entry) = entry; -} - -static void SLinkedList_InsertAfter (SLinkedList *o, SLinkedListEntry *entry, SLinkedListEntry *after_entry) -{ - ASSERT(entry) - ASSERT(after_entry) - - SLinkedList_next(entry) = SLinkedList_next(after_entry); - SLinkedList_prev(entry) = after_entry; - if (SLinkedList_next(after_entry)) { - SLinkedList_prev(SLinkedList_next(after_entry)) = entry; - } else { -#if SLINKEDLIST_PARAM_FEATURE_LAST - o->last = entry; -#endif - } - SLinkedList_next(after_entry) = entry; -} - -static void SLinkedList_Remove (SLinkedList *o, SLinkedListEntry *entry) -{ - if (entry != o->first) { - SLinkedList_next(SLinkedList_prev(entry)) = SLinkedList_next(entry); - if (SLinkedList_next(entry)) { - SLinkedList_prev(SLinkedList_next(entry)) = SLinkedList_prev(entry); - } else { -#if SLINKEDLIST_PARAM_FEATURE_LAST - o->last = SLinkedList_prev(entry); -#endif - } - } else { - o->first = SLinkedList_next(entry); - } -} - -static void SLinkedList_RemoveFirst (SLinkedList *o) -{ - ASSERT(o->first) - - o->first = SLinkedList_next(o->first); -} - -#if SLINKEDLIST_PARAM_FEATURE_LAST -static void SLinkedList_RemoveLast (SLinkedList *o) -{ - ASSERT(o->first) - - if (o->last == o->first) { - o->first = NULL; - } else { - SLinkedList_next(SLinkedList_prev(o->last)) = NULL; - o->last = SLinkedList_prev(o->last); - } -} -#endif - -static SLinkedListEntry * SLinkedList_First (const SLinkedList *o) -{ - return o->first; -} - -#if SLINKEDLIST_PARAM_FEATURE_LAST -static SLinkedListEntry * SLinkedList_Last (const SLinkedList *o) -{ - return (!o->first ? NULL : o->last); -} -#endif - -static int SLinkedList_IsEmpty (const SLinkedList *o) -{ - return !o->first; -} - -#include "SLinkedList_footer.h" diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/structure/Vector.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/structure/Vector.h deleted file mode 100644 index f173c28c..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/structure/Vector.h +++ /dev/null @@ -1,36 +0,0 @@ -/** - * @file Vector.h - * @author Ambroz Bizjak - * - * @section LICENSE - * - * 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 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE 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. - */ - -#include -#include -#include - -#include -#include -#include diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/structure/Vector_decl.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/structure/Vector_decl.h deleted file mode 100644 index 8e36c9dd..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/structure/Vector_decl.h +++ /dev/null @@ -1,46 +0,0 @@ -/** - * @file Vector_decl.h - * @author Ambroz Bizjak - * - * @section LICENSE - * - * 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 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE 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. - */ - -#include "Vector_header.h" - -typedef struct { - VectorElem *elems; - size_t capacity; - size_t count; -} Vector; - -static int Vector_Init (Vector *o, size_t capacity) WARN_UNUSED; -static void Vector_Free (Vector *o); -static size_t Vector_Count (Vector *o); -static VectorElem * Vector_Get (Vector *o, size_t index); -static int Vector_Reserve (Vector *o, size_t capacity) WARN_UNUSED; -static VectorElem * Vector_Push (Vector *o, size_t *out_index) WARN_UNUSED; -static VectorElem * Vector_Pop (Vector *o, size_t *out_index); - -#include "Vector_footer.h" diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/structure/Vector_footer.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/structure/Vector_footer.h deleted file mode 100644 index 3e561d9a..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/structure/Vector_footer.h +++ /dev/null @@ -1,41 +0,0 @@ -/** - * @file Vector_footer.h - * @author Ambroz Bizjak - * - * @section LICENSE - * - * 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 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE 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. - */ - -#undef VECTOR_NAME -#undef VECTOR_ELEM_TYPE - -#undef Vector -#undef VectorElem -#undef Vector_Init -#undef Vector_Free -#undef Vector_Count -#undef Vector_Get -#undef Vector_Reserve -#undef Vector_Push -#undef Vector_Pop diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/structure/Vector_header.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/structure/Vector_header.h deleted file mode 100644 index 61be2294..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/structure/Vector_header.h +++ /dev/null @@ -1,42 +0,0 @@ -/** - * @file Vector_header.h - * @author Ambroz Bizjak - * - * @section LICENSE - * - * 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 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE 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. - */ - -// Preprocessor inputs: -// VECTOR_NAME - prefix of functions and types to be defined -// VECTOR_ELEM_TYPE - type of vector elements - -#define Vector VECTOR_NAME -#define VectorElem VECTOR_ELEM_TYPE -#define Vector_Init MERGE(VECTOR_NAME, _Init) -#define Vector_Free MERGE(VECTOR_NAME, _Free) -#define Vector_Count MERGE(VECTOR_NAME, _Count) -#define Vector_Get MERGE(VECTOR_NAME, _Get) -#define Vector_Reserve MERGE(VECTOR_NAME, _Reserve) -#define Vector_Push MERGE(VECTOR_NAME, _Push) -#define Vector_Pop MERGE(VECTOR_NAME, _Pop) diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/structure/Vector_impl.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/structure/Vector_impl.h deleted file mode 100644 index b71d515b..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/structure/Vector_impl.h +++ /dev/null @@ -1,117 +0,0 @@ -/** - * @file Vector_impl.h - * @author Ambroz Bizjak - * - * @section LICENSE - * - * 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 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE 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. - */ - -#include "Vector_header.h" - -static int Vector_Init (Vector *o, size_t capacity) -{ - if (capacity == 0) { - o->elems = NULL; - } else { - o->elems = BAllocArray(capacity, sizeof(VectorElem)); - if (!o->elems) { - return 0; - } - } - o->capacity = capacity; - o->count = 0; - return 1; -} - -static void Vector_Free (Vector *o) -{ - BFree(o->elems); -} - -static size_t Vector_Count (Vector *o) -{ - return o->count; -} - -static VectorElem * Vector_Get (Vector *o, size_t index) -{ - ASSERT(index < o->capacity) - - return &o->elems[index]; -} - -static int Vector_Reserve (Vector *o, size_t capacity) -{ - if (capacity > o->capacity) { - size_t new_capacity = o->capacity; - do { - if (new_capacity > SIZE_MAX / 2) { - return 0; - } - new_capacity = (new_capacity == 0) ? 1 : (2 * new_capacity); - } while (capacity > new_capacity); - - VectorElem *new_elems = BAllocArray(new_capacity, sizeof(VectorElem)); - if (!new_elems) { - return 0; - } - - if (o->count > 0) { - memcpy(new_elems, o->elems, o->count * sizeof(VectorElem)); - } - - BFree(o->elems); - - o->elems = new_elems; - o->capacity = new_capacity; - } - - return 1; -} - -static VectorElem * Vector_Push (Vector *o, size_t *out_index) -{ - if (o->count == SIZE_MAX || !Vector_Reserve(o, o->count + 1)) { - return NULL; - } - if (out_index) { - *out_index = o->count; - } - VectorElem *ptr = &o->elems[o->count]; - o->count++; - return ptr; -} - -static VectorElem * Vector_Pop (Vector *o, size_t *out_index) -{ - ASSERT(o->count > 0) - - o->count--; - if (out_index) { - *out_index = o->count; - } - return &o->elems[o->count]; -} - -#include "Vector_footer.h" diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/system/BAddr.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/system/BAddr.h deleted file mode 100644 index c43ec3b4..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/system/BAddr.h +++ /dev/null @@ -1,808 +0,0 @@ -/** - * @file BAddr.h - * @author Ambroz Bizjak - * - * @section LICENSE - * - * 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 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE 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. - * - * @section DESCRIPTION - * - * Network address abstractions. - */ - -#ifndef BADVPN_SYSTEM_BADDR_H -#define BADVPN_SYSTEM_BADDR_H - -#include -#include -#include -#include -#include - -#ifdef BADVPN_USE_WINAPI -#include -#else -#include -#include -#include -#include -#endif - -#include "misc/byteorder.h" -#include "misc/debug.h" -#include "misc/print_macros.h" -#include "misc/read_write_int.h" -#include "misc/compare.h" - -#define BADDR_TYPE_NONE 0 -#define BADDR_TYPE_IPV4 1 -#define BADDR_TYPE_IPV6 2 -#ifdef BADVPN_LINUX - #define BADDR_TYPE_PACKET 5 -#endif - -#define BADDR_MAX_ADDR_LEN 128 - -#define BIPADDR_MAX_PRINT_LEN 40 -#define BADDR_MAX_PRINT_LEN 120 - -#define BADDR_PACKET_HEADER_TYPE_ETHERNET 1 - -#define BADDR_PACKET_PACKET_TYPE_HOST 1 -#define BADDR_PACKET_PACKET_TYPE_BROADCAST 2 -#define BADDR_PACKET_PACKET_TYPE_MULTICAST 3 -#define BADDR_PACKET_PACKET_TYPE_OTHERHOST 4 -#define BADDR_PACKET_PACKET_TYPE_OUTGOING 5 - -typedef struct { - int type; - union { - uint32_t ipv4; - uint8_t ipv6[16]; - }; -} BIPAddr; - -static void BIPAddr_InitInvalid (BIPAddr *addr); - -static void BIPAddr_InitIPv4 (BIPAddr *addr, uint32_t ip); - -static void BIPAddr_InitIPv6 (BIPAddr *addr, uint8_t *ip); - -static void BIPAddr_Assert (BIPAddr *addr); - -static int BIPAddr_IsInvalid (BIPAddr *addr); - -static int BIPAddr_Resolve (BIPAddr *addr, char *str, int noresolve) WARN_UNUSED; - -static int BIPAddr_Compare (BIPAddr *addr1, BIPAddr *addr2); - -/** - * Converts an IP address to human readable form. - * - * @param addr IP address to convert - * @param out destination buffer. Must be at least BIPADDR_MAX_PRINT_LEN characters long. - */ -static void BIPAddr_Print (BIPAddr *addr, char *out); - -/** - * Socket address - IP address and transport protocol port number - */ -typedef struct { - int type; - union { - struct { - uint32_t ip; - uint16_t port; - } ipv4; - struct { - uint8_t ip[16]; - uint16_t port; - } ipv6; - struct { - uint16_t phys_proto; - int interface_index; - int header_type; - int packet_type; - uint8_t phys_addr[8]; - } packet; - }; -} BAddr; - -/** - * Makes an invalid address. - */ -static BAddr BAddr_MakeNone (void); - -/** - * Makes an IPv4 address. - * - * @param ip IP address in network byte order - * @param port port number in network byte order - */ -static BAddr BAddr_MakeIPv4 (uint32_t ip, uint16_t port); - -/** - * Makes an IPv6 address. - * - * @param ip IP address (16 bytes) - * @param port port number in network byte order - */ -static BAddr BAddr_MakeIPv6 (const uint8_t *ip, uint16_t port); - -/** - * Makes an address from a BIPAddr and port number. - * - * @param ipaddr the BIPAddr - * @param port port number in network byte order - */ -static BAddr BAddr_MakeFromIpaddrAndPort (BIPAddr ipaddr, uint16_t port); - -/** - * Deprecated, use BAddr_MakeNone. - */ -static void BAddr_InitNone (BAddr *addr); - -/** - * Deprecated, use BAddr_MakeIPv4. - */ -static void BAddr_InitIPv4 (BAddr *addr, uint32_t ip, uint16_t port); - -/** - * Deprecated, use BAddr_MakeIPv6. - */ -static void BAddr_InitIPv6 (BAddr *addr, uint8_t *ip, uint16_t port); - -/** - * Deprecated, use BAddr_MakeFromIpaddrAndPort. - */ -static void BAddr_InitFromIpaddrAndPort (BAddr *addr, BIPAddr ipaddr, uint16_t port); - -/** - * Initializes a packet socket (data link layer) address. - * Only Ethernet addresses are supported. - * - * @param addr the object - * @param phys_proto identifier for the upper protocol, network byte order (EtherType) - * @param interface_index network interface index - * @param header_type data link layer header type. Must be BADDR_PACKET_HEADER_TYPE_ETHERNET. - * @param packet_type the manner in which packets are sent/received. Must be one of - * BADDR_PACKET_PACKET_TYPE_HOST, BADDR_PACKET_PACKET_TYPE_BROADCAST, - * BADDR_PACKET_PACKET_TYPE_MULTICAST, BADDR_PACKET_PACKET_TYPE_OTHERHOST, - * BADDR_PACKET_PACKET_TYPE_OUTGOING. - * @param phys_addr data link layer address (MAC address) - */ -static void BAddr_InitPacket (BAddr *addr, uint16_t phys_proto, int interface_index, int header_type, int packet_type, uint8_t *phys_addr); - -/** - * Does nothing. - * - * @param addr the object - */ -static void BAddr_Assert (BAddr *addr); - -/** - * Determines whether the address is an invalid address. - * - * @param addr the object - * @return 1 if invalid, 0 if invalid - **/ -static int BAddr_IsInvalid (BAddr *addr); - -/** - * Returns the port number in the address. - * - * @param addr the object - * Must be an IPv4 or IPv6 address. - * @return port number, in network byte order - */ -static uint16_t BAddr_GetPort (BAddr *addr); - -/** - * Returns the IP address in the address. - * - * @param addr the object - * @param ipaddr IP address will be returned here. If \a addr is not - * an IPv4 or IPv6 address, an invalid address will be - * returned. - */ -static void BAddr_GetIPAddr (BAddr *addr, BIPAddr *ipaddr); - -/** - * Sets the port number in the address. - * - * @param addr the object - * Must be an IPv4 or IPv6 address. - * @param port port number, in network byte order - */ -static void BAddr_SetPort (BAddr *addr, uint16_t port); - -/** - * Converts an IP address to human readable form. - * - * @param addr address to convert - * @param out destination buffer. Must be at least BADDR_MAX_PRINT_LEN characters long. - */ -static void BAddr_Print (BAddr *addr, char *out); - -/** - * Resolves an address string. - * Format is "addr:port" for IPv4, "[addr]:port" for IPv6. - * addr is be a numeric address or a name. - * port is a numeric port number. - * - * @param addr output address - * @param name if not NULL, the name portion of the address will be - * stored here - * @param name_len if name is not NULL, the size of the name buffer - * @param noresolve only accept numeric addresses. Avoids blocking the caller. - * @return 1 on success, 0 on parse error - */ -static int BAddr_Parse2 (BAddr *addr, char *str, char *name, int name_len, int noresolve) WARN_UNUSED; - -/** - * Resolves an address string. - * IPv4 input format is "a.b.c.d:p", where a.b.c.d is the IP address - * and d is the port number. - * IPv6 input format is "[addr]:p", where addr is an IPv6 addres in - * standard notation and p is the port number. - * - * @param addr output address - * @param name if not NULL, the name portion of the address will be - * stored here - * @param name_len if name is not NULL, the size of the name buffer - * @return 1 on success, 0 on parse error - */ -static int BAddr_Parse (BAddr *addr, char *str, char *name, int name_len) WARN_UNUSED; - -static int BAddr_Compare (BAddr *addr1, BAddr *addr2); - -static int BAddr_CompareOrder (BAddr *addr1, BAddr *addr2); - -void BIPAddr_InitInvalid (BIPAddr *addr) -{ - addr->type = BADDR_TYPE_NONE; -} - -void BIPAddr_InitIPv4 (BIPAddr *addr, uint32_t ip) -{ - addr->type = BADDR_TYPE_IPV4; - addr->ipv4 = ip; -} - -void BIPAddr_InitIPv6 (BIPAddr *addr, uint8_t *ip) -{ - addr->type = BADDR_TYPE_IPV6; - memcpy(addr->ipv6, ip, 16); -} - -void BIPAddr_Assert (BIPAddr *addr) -{ - switch (addr->type) { - case BADDR_TYPE_NONE: - case BADDR_TYPE_IPV4: - case BADDR_TYPE_IPV6: - return; - default: - ASSERT(0); - } -} - -int BIPAddr_IsInvalid (BIPAddr *addr) -{ - BIPAddr_Assert(addr); - - return (addr->type == BADDR_TYPE_NONE); -} - -int BIPAddr_Resolve (BIPAddr *addr, char *str, int noresolve) -{ - int len = strlen(str); - - char *addr_start; - int addr_len; - - // determine address type - if (len >= 1 && str[0] == '[' && str[len - 1] == ']') { - addr->type = BADDR_TYPE_IPV6; - addr_start = str + 1; - addr_len = len - 2; - } else { - addr->type = BADDR_TYPE_IPV4; - addr_start = str; - addr_len = len; - } - - // copy - char addr_str[BADDR_MAX_ADDR_LEN + 1]; - if (addr_len > BADDR_MAX_ADDR_LEN) { - return 0; - } - memcpy(addr_str, addr_start, addr_len); - addr_str[addr_len] = '\0'; - - // initialize hints - struct addrinfo hints; - memset(&hints, 0, sizeof(hints)); - switch (addr->type) { - case BADDR_TYPE_IPV6: - hints.ai_family = AF_INET6; - break; - case BADDR_TYPE_IPV4: - hints.ai_family = AF_INET; - break; - } - if (noresolve) { - hints.ai_flags |= AI_NUMERICHOST; - } - - // call getaddrinfo - struct addrinfo *addrs; - int res; - if ((res = getaddrinfo(addr_str, NULL, &hints, &addrs)) != 0) { - return 0; - } - - // set address - switch (addr->type) { - case BADDR_TYPE_IPV6: - memcpy(addr->ipv6, ((struct sockaddr_in6 *)addrs->ai_addr)->sin6_addr.s6_addr, sizeof(addr->ipv6)); - break; - case BADDR_TYPE_IPV4: - addr->ipv4 = ((struct sockaddr_in *)addrs->ai_addr)->sin_addr.s_addr; - break; - } - - freeaddrinfo(addrs); - - return 1; -} - -int BIPAddr_Compare (BIPAddr *addr1, BIPAddr *addr2) -{ - BIPAddr_Assert(addr1); - BIPAddr_Assert(addr2); - - if (addr1->type != addr2->type) { - return 0; - } - - switch (addr1->type) { - case BADDR_TYPE_NONE: - return 0; - case BADDR_TYPE_IPV4: - return (addr1->ipv4 == addr2->ipv4); - case BADDR_TYPE_IPV6: - return (!memcmp(addr1->ipv6, addr2->ipv6, sizeof(addr1->ipv6))); - default: - ASSERT(0) - return 0; - } -} - -uint16_t BAddr_GetPort (BAddr *addr) -{ - BAddr_Assert(addr); - ASSERT(addr->type == BADDR_TYPE_IPV4 || addr->type == BADDR_TYPE_IPV6) - - switch (addr->type) { - case BADDR_TYPE_IPV4: - return addr->ipv4.port; - case BADDR_TYPE_IPV6: - return addr->ipv6.port; - default: - ASSERT(0) - return 0; - } -} - -void BAddr_GetIPAddr (BAddr *addr, BIPAddr *ipaddr) -{ - BAddr_Assert(addr); - - switch (addr->type) { - case BADDR_TYPE_IPV4: - BIPAddr_InitIPv4(ipaddr, addr->ipv4.ip); - return; - case BADDR_TYPE_IPV6: - BIPAddr_InitIPv6(ipaddr, addr->ipv6.ip); - return; - default: - BIPAddr_InitInvalid(ipaddr); - } -} - -void BAddr_SetPort (BAddr *addr, uint16_t port) -{ - BAddr_Assert(addr); - ASSERT(addr->type == BADDR_TYPE_IPV4 || addr->type == BADDR_TYPE_IPV6) - - switch (addr->type) { - case BADDR_TYPE_IPV4: - addr->ipv4.port = port; - break; - case BADDR_TYPE_IPV6: - addr->ipv6.port = port; - break; - default: - ASSERT(0); - } -} - -void BIPAddr_Print (BIPAddr *addr, char *out) -{ - switch (addr->type) { - case BADDR_TYPE_NONE: - sprintf(out, "(none)"); - break; - case BADDR_TYPE_IPV4: - sprintf(out, "%"PRIu8".%"PRIu8".%"PRIu8".%"PRIu8, - *((uint8_t *)&addr->ipv4 + 0), - *((uint8_t *)&addr->ipv4 + 1), - *((uint8_t *)&addr->ipv4 + 2), - *((uint8_t *)&addr->ipv4 + 3) - ); - break; - case BADDR_TYPE_IPV6: { - const char *ptr = (const char *)addr->ipv6; - sprintf(out, - "%"PRIx16":%"PRIx16":%"PRIx16":%"PRIx16":" - "%"PRIx16":%"PRIx16":%"PRIx16":%"PRIx16, - badvpn_read_be16(ptr + 0), - badvpn_read_be16(ptr + 2), - badvpn_read_be16(ptr + 4), - badvpn_read_be16(ptr + 6), - badvpn_read_be16(ptr + 8), - badvpn_read_be16(ptr + 10), - badvpn_read_be16(ptr + 12), - badvpn_read_be16(ptr + 14) - ); - } break; - default: - ASSERT(0); - } -} - -BAddr BAddr_MakeNone (void) -{ - BAddr addr; - addr.type = BADDR_TYPE_NONE; - return addr; -} - -BAddr BAddr_MakeIPv4 (uint32_t ip, uint16_t port) -{ - BAddr addr; - addr.type = BADDR_TYPE_IPV4; - addr.ipv4.ip = ip; - addr.ipv4.port = port; - return addr; -} - -BAddr BAddr_MakeIPv6 (const uint8_t *ip, uint16_t port) -{ - BAddr addr; - addr.type = BADDR_TYPE_IPV6; - memcpy(addr.ipv6.ip, ip, 16); - addr.ipv6.port = port; - return addr; -} - -BAddr BAddr_MakeFromIpaddrAndPort (BIPAddr ipaddr, uint16_t port) -{ - BIPAddr_Assert(&ipaddr); - - switch (ipaddr.type) { - case BADDR_TYPE_NONE: - return BAddr_MakeNone(); - case BADDR_TYPE_IPV4: - return BAddr_MakeIPv4(ipaddr.ipv4, port); - case BADDR_TYPE_IPV6: - return BAddr_MakeIPv6(ipaddr.ipv6, port); - default: - ASSERT(0); - return BAddr_MakeNone(); - } -} - -void BAddr_InitNone (BAddr *addr) -{ - *addr = BAddr_MakeNone(); -} - -void BAddr_InitIPv4 (BAddr *addr, uint32_t ip, uint16_t port) -{ - *addr = BAddr_MakeIPv4(ip, port); -} - -void BAddr_InitIPv6 (BAddr *addr, uint8_t *ip, uint16_t port) -{ - *addr = BAddr_MakeIPv6(ip, port); -} - -void BAddr_InitFromIpaddrAndPort (BAddr *addr, BIPAddr ipaddr, uint16_t port) -{ - BIPAddr_Assert(&ipaddr); - - *addr = BAddr_MakeFromIpaddrAndPort(ipaddr, port); -} - -#ifdef BADVPN_LINUX - -void BAddr_InitPacket (BAddr *addr, uint16_t phys_proto, int interface_index, int header_type, int packet_type, uint8_t *phys_addr) -{ - ASSERT(header_type == BADDR_PACKET_HEADER_TYPE_ETHERNET) - ASSERT(packet_type == BADDR_PACKET_PACKET_TYPE_HOST || packet_type == BADDR_PACKET_PACKET_TYPE_BROADCAST || - packet_type == BADDR_PACKET_PACKET_TYPE_MULTICAST || packet_type == BADDR_PACKET_PACKET_TYPE_OTHERHOST || - packet_type == BADDR_PACKET_PACKET_TYPE_OUTGOING) - - addr->type = BADDR_TYPE_PACKET; - addr->packet.phys_proto = phys_proto; - addr->packet.interface_index = interface_index; - addr->packet.header_type = header_type; - addr->packet.packet_type = packet_type; - memcpy(addr->packet.phys_addr, phys_addr, 6); -} - -#endif - -void BAddr_Assert (BAddr *addr) -{ - switch (addr->type) { - case BADDR_TYPE_NONE: - case BADDR_TYPE_IPV4: - case BADDR_TYPE_IPV6: - #ifdef BADVPN_LINUX - case BADDR_TYPE_PACKET: - #endif - return; - default: - ASSERT(0); - } -} - -int BAddr_IsInvalid (BAddr *addr) -{ - BAddr_Assert(addr); - - return (addr->type == BADDR_TYPE_NONE); -} - -void BAddr_Print (BAddr *addr, char *out) -{ - BAddr_Assert(addr); - - BIPAddr ipaddr; - - switch (addr->type) { - case BADDR_TYPE_NONE: - sprintf(out, "(none)"); - break; - case BADDR_TYPE_IPV4: - BIPAddr_InitIPv4(&ipaddr, addr->ipv4.ip); - BIPAddr_Print(&ipaddr, out); - sprintf(out + strlen(out), ":%"PRIu16, ntoh16(addr->ipv4.port)); - break; - case BADDR_TYPE_IPV6: - BIPAddr_InitIPv6(&ipaddr, addr->ipv6.ip); - BIPAddr_Print(&ipaddr, out); - sprintf(out + strlen(out), ":%"PRIu16, ntoh16(addr->ipv6.port)); - break; - #ifdef BADVPN_LINUX - case BADDR_TYPE_PACKET: - ASSERT(addr->packet.header_type == BADDR_PACKET_HEADER_TYPE_ETHERNET) - sprintf(out, "proto=%"PRIu16",ifindex=%d,htype=eth,ptype=%d,addr=%02"PRIx8":%02"PRIx8":%02"PRIx8":%02"PRIx8":%02"PRIx8":%02"PRIx8, - addr->packet.phys_proto, (int)addr->packet.interface_index, (int)addr->packet.packet_type, - addr->packet.phys_addr[0], addr->packet.phys_addr[1], addr->packet.phys_addr[2], - addr->packet.phys_addr[3], addr->packet.phys_addr[4], addr->packet.phys_addr[5]); - break; - #endif - default: - ASSERT(0); - } -} - -int BAddr_Parse2 (BAddr *addr, char *str, char *name, int name_len, int noresolve) -{ - int len = strlen(str); - if (len < 1 || len > 1000) { - return 0; - } - - int addr_start; - int addr_len; - int port_start; - int port_len; - - // leading '[' indicates an IPv6 address - if (str[0] == '[') { - addr->type = BADDR_TYPE_IPV6; - // find ']' - int i=1; - while (i < len && str[i] != ']') i++; - if (i >= len) { - return 0; - } - addr_start = 1; - addr_len = i - addr_start; - // follows ':' and port number - if (i + 1 >= len || str[i + 1] != ':') { - return 0; - } - port_start = i + 2; - port_len = len - port_start; - } - // otherwise it's an IPv4 address - else { - addr->type = BADDR_TYPE_IPV4; - // find ':' - int i=0; - while (i < len && str[i] != ':') i++; - if (i >= len) { - return 0; - } - addr_start = 0; - addr_len = i - addr_start; - port_start = i + 1; - port_len = len - port_start; - } - - // copy address and port to zero-terminated buffers - - char addr_str[128]; - if (addr_len >= sizeof(addr_str)) { - return 0; - } - memcpy(addr_str, str + addr_start, addr_len); - addr_str[addr_len] = '\0'; - - char port_str[6]; - if (port_len >= sizeof(port_str)) { - return 0; - } - memcpy(port_str, str + port_start, port_len); - port_str[port_len] = '\0'; - - // parse port - char *err; - long int conv_res = strtol(port_str, &err, 10); - if (port_str[0] == '\0' || *err != '\0') { - return 0; - } - if (conv_res < 0 || conv_res > UINT16_MAX) { - return 0; - } - uint16_t port = conv_res; - port = hton16(port); - - // initialize hints - struct addrinfo hints; - memset(&hints, 0, sizeof(hints)); - switch (addr->type) { - case BADDR_TYPE_IPV6: - hints.ai_family = AF_INET6; - break; - case BADDR_TYPE_IPV4: - hints.ai_family = AF_INET; - break; - } - if (noresolve) { - hints.ai_flags |= AI_NUMERICHOST; - } - - // call getaddrinfo - struct addrinfo *addrs; - int res; - if ((res = getaddrinfo(addr_str, NULL, &hints, &addrs)) != 0) { - return 0; - } - - // set address - switch (addr->type) { - case BADDR_TYPE_IPV6: - memcpy(addr->ipv6.ip, ((struct sockaddr_in6 *)addrs->ai_addr)->sin6_addr.s6_addr, sizeof(addr->ipv6.ip)); - addr->ipv6.port = port; - break; - case BADDR_TYPE_IPV4: - addr->ipv4.ip = ((struct sockaddr_in *)addrs->ai_addr)->sin_addr.s_addr; - addr->ipv4.port = port; - break; - } - - freeaddrinfo(addrs); - - if (name) { - if (strlen(addr_str) >= name_len) { - return 0; - } - strcpy(name, addr_str); - } - - return 1; -} - -int BAddr_Parse (BAddr *addr, char *str, char *name, int name_len) -{ - return BAddr_Parse2(addr, str, name, name_len, 0); -} - -int BAddr_Compare (BAddr *addr1, BAddr *addr2) -{ - BAddr_Assert(addr1); - BAddr_Assert(addr2); - - if (addr1->type != addr2->type) { - return 0; - } - - switch (addr1->type) { - case BADDR_TYPE_IPV4: - return (addr1->ipv4.ip == addr2->ipv4.ip && addr1->ipv4.port == addr2->ipv4.port); - case BADDR_TYPE_IPV6: - return (!memcmp(addr1->ipv6.ip, addr2->ipv6.ip, sizeof(addr1->ipv6.ip)) && addr1->ipv6.port == addr2->ipv6.port); - default: - return 0; - } -} - -int BAddr_CompareOrder (BAddr *addr1, BAddr *addr2) -{ - BAddr_Assert(addr1); - BAddr_Assert(addr2); - - int cmp = B_COMPARE(addr1->type, addr2->type); - if (cmp) { - return cmp; - } - - switch (addr1->type) { - case BADDR_TYPE_NONE: { - return 0; - } break; - case BADDR_TYPE_IPV4: { - uint32_t ip1 = ntoh32(addr1->ipv4.ip); - uint32_t ip2 = ntoh32(addr2->ipv4.ip); - cmp = B_COMPARE(ip1, ip2); - if (cmp) { - return cmp; - } - uint16_t port1 = ntoh16(addr1->ipv4.port); - uint16_t port2 = ntoh16(addr2->ipv4.port); - return B_COMPARE(port1, port2); - } break; - case BADDR_TYPE_IPV6: { - cmp = memcmp(addr1->ipv6.ip, addr2->ipv6.ip, sizeof(addr1->ipv6.ip)); - if (cmp) { - return B_COMPARE(cmp, 0); - } - uint16_t port1 = ntoh16(addr1->ipv6.port); - uint16_t port2 = ntoh16(addr2->ipv6.port); - return B_COMPARE(port1, port2); - } break; - default: { - return 0; - } break; - } -} - -#endif diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/system/BConnection.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/system/BConnection.h deleted file mode 100644 index 5af0a040..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/system/BConnection.h +++ /dev/null @@ -1,424 +0,0 @@ -/** - * @file BConnection.h - * @author Ambroz Bizjak - * - * @section LICENSE - * - * 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 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE 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. - */ - -#ifndef BADVPN_SYSTEM_BCONNECTION -#define BADVPN_SYSTEM_BCONNECTION - -#include "misc/debug.h" -#include "flow/StreamPassInterface.h" -#include "flow/StreamRecvInterface.h" -#include "system/BAddr.h" -#include "system/BReactor.h" -#include "system/BNetwork.h" - - - -/** - * Checks if the given address is supported by {@link BConnection} and related objects. - * - * @param addr address to check. Must be a proper {@link BAddr} object according to - * {@link BIPAddr_Assert}. - * @return 1 if supported, 0 if not - */ -int BConnection_AddressSupported (BAddr addr); - - -#define BLISCON_FROM_ADDR 1 -#define BLISCON_FROM_UNIX 2 - -struct BLisCon_from { - int type; - union { - struct { - BAddr addr; - } from_addr; -#ifndef BADVPN_USE_WINAPI - struct { - char const *socket_path; - } from_unix; -#endif - } u; -}; - -static struct BLisCon_from BLisCon_from_addr (BAddr addr) -{ - struct BLisCon_from res; - res.type = BLISCON_FROM_ADDR; - res.u.from_addr.addr = addr; - return res; -} - -#ifndef BADVPN_USE_WINAPI -static struct BLisCon_from BLisCon_from_unix (char const *socket_path) -{ - struct BLisCon_from res; - res.type = BLISCON_FROM_UNIX; - res.u.from_unix.socket_path = socket_path; - return res; -} -#endif - - -struct BListener_s; - -/** - * Object which listens for connections on an address. - * When a connection is ready, the {@link BListener_handler} handler is called, from which - * the connection can be accepted into a new {@link BConnection} object. - */ -typedef struct BListener_s BListener; - -/** - * Handler called when a new connection is ready. - * The connection can be accepted by calling {@link BConnection_Init} with the a - * BCONNECTION_SOURCE_LISTENER 'source' argument. - * If no attempt is made to accept the connection from the job closure of this handler, - * the connection will be discarded. - * - * @param user as in {@link BListener_Init} - */ -typedef void (*BListener_handler) (void *user); - -/** - * Common listener initialization function. - * - * The other type-specific init functions are wrappers around this one. - */ -int BListener_InitFrom (BListener *o, struct BLisCon_from from, - BReactor *reactor, void *user, - BListener_handler handler) WARN_UNUSED; - -/** - * Initializes the object for listening on an address. - * {@link BNetwork_GlobalInit} must have been done. - * - * @param o the object - * @param addr address to listen on - * @param reactor reactor we live in - * @param user argument to handler - * @param handler handler called when a connection can be accepted - * @return 1 on success, 0 on failure - */ -int BListener_Init (BListener *o, BAddr addr, BReactor *reactor, void *user, - BListener_handler handler) WARN_UNUSED; - -#ifndef BADVPN_USE_WINAPI -/** - * Initializes the object for listening on a Unix socket. - * {@link BNetwork_GlobalInit} must have been done. - * - * @param o the object - * @param socket_path socket path for listening - * @param reactor reactor we live in - * @param user argument to handler - * @param handler handler called when a connection can be accepted - * @return 1 on success, 0 on failure - */ -int BListener_InitUnix (BListener *o, const char *socket_path, BReactor *reactor, void *user, - BListener_handler handler) WARN_UNUSED; -#endif - -/** - * Frees the object. - * - * @param o the object - */ -void BListener_Free (BListener *o); - - - -struct BConnector_s; - -/** - * Object which connects to an address. - * When the connection attempt finishes, the {@link BConnector_handler} handler is called, from which, - * if successful, the resulting connection can be moved to a new {@link BConnection} object. - */ -typedef struct BConnector_s BConnector; - -/** - * Handler called when the connection attempt finishes. - * If the connection attempt succeeded (is_error==0), the new connection can be used by calling - * {@link BConnection_Init} with a BCONNECTION_SOURCE_TYPE_CONNECTOR 'source' argument. - * This handler will be called at most once. The connector object need not be freed after it - * is called. - * - * @param user as in {@link BConnector_Init} - * @param is_error whether the connection attempt succeeded (0) or failed (1) - */ -typedef void (*BConnector_handler) (void *user, int is_error); - -/** - * Common connector initialization function. - * - * The other type-specific init functions are wrappers around this one. - */ -int BConnector_InitFrom (BConnector *o, struct BLisCon_from from, BReactor *reactor, void *user, - BConnector_handler handler) WARN_UNUSED; - -/** - * Initializes the object for connecting to an address. - * {@link BNetwork_GlobalInit} must have been done. - * - * @param o the object - * @param addr address to connect to - * @param reactor reactor we live in - * @param user argument to handler - * @param handler handler called when the connection attempt finishes - * @return 1 on success, 0 on failure - */ -int BConnector_Init (BConnector *o, BAddr addr, BReactor *reactor, void *user, - BConnector_handler handler) WARN_UNUSED; - -#ifndef BADVPN_USE_WINAPI -/** - * Initializes the object for connecting to a Unix socket. - * {@link BNetwork_GlobalInit} must have been done. - * - * @param o the object - * @param socket_path socket path for connecting - * @param reactor reactor we live in - * @param user argument to handler - * @param handler handler called when the connection attempt finishes - * @return 1 on success, 0 on failure - */ -int BConnector_InitUnix (BConnector *o, const char *socket_path, BReactor *reactor, void *user, - BConnector_handler handler) WARN_UNUSED; -#endif - -/** - * Frees the object. - * - * @param o the object - */ -void BConnector_Free (BConnector *o); - - - -#define BCONNECTION_SOURCE_TYPE_LISTENER 1 -#define BCONNECTION_SOURCE_TYPE_CONNECTOR 2 -#define BCONNECTION_SOURCE_TYPE_PIPE 3 - -struct BConnection_source { - int type; - union { - struct { - BListener *listener; - BAddr *out_addr; - } listener; - struct { - BConnector *connector; - } connector; -#ifndef BADVPN_USE_WINAPI - struct { - int pipefd; - int close_it; - } pipe; -#endif - } u; -}; - -static struct BConnection_source BConnection_source_listener (BListener *listener, BAddr *out_addr) -{ - struct BConnection_source s; - s.type = BCONNECTION_SOURCE_TYPE_LISTENER; - s.u.listener.listener = listener; - s.u.listener.out_addr = out_addr; - return s; -} - -static struct BConnection_source BConnection_source_connector (BConnector *connector) -{ - struct BConnection_source s; - s.type = BCONNECTION_SOURCE_TYPE_CONNECTOR; - s.u.connector.connector = connector; - return s; -} - -#ifndef BADVPN_USE_WINAPI -static struct BConnection_source BConnection_source_pipe (int pipefd, int close_it) -{ - struct BConnection_source s; - s.type = BCONNECTION_SOURCE_TYPE_PIPE; - s.u.pipe.pipefd = pipefd; - s.u.pipe.close_it = close_it; - return s; -} -#endif - -struct BConnection_s; - -/** - * Object which represents a stream connection. This is usually a TCP connection, either client - * or server, but may also be used with any file descriptor (e.g. pipe) on Unix-like systems. - * Sending and receiving is performed via {@link StreamPassInterface} and {@link StreamRecvInterface}, - * respectively. - */ -typedef struct BConnection_s BConnection; - -#define BCONNECTION_EVENT_ERROR 1 -#define BCONNECTION_EVENT_RECVCLOSED 2 - -/** - * Handler called when an error occurs or the receive end of the connection was closed - * by the remote peer. - * - If event is BCONNECTION_EVENT_ERROR, the connection is no longer usable and must be freed - * from withing the job closure of this handler. No further I/O or interface initialization - * must occur. - * - If event is BCONNECTION_EVENT_RECVCLOSED, no further receive I/O or receive interface - * initialization must occur. It is guarantted that the receive interface was initialized. - * - * @param user as in {@link BConnection_Init} or {@link BConnection_SetHandlers} - * @param event what happened - BCONNECTION_EVENT_ERROR or BCONNECTION_EVENT_RECVCLOSED - */ -typedef void (*BConnection_handler) (void *user, int event); - -/** - * Initializes the object. - * {@link BNetwork_GlobalInit} must have been done. - * - * @param o the object - * @param source specifies what the connection comes from. This argument must be created with one of the - * following macros: - * - BCONNECTION_SOURCE_LISTENER(BListener *, BAddr *) - * Accepts a connection ready on a {@link BListener} object. Must be called from the job - * closure of the listener's {@link BListener_handler}, and must be the first attempt - * for this handler invocation. The address of the client is written if the address - * argument is not NULL (theoretically an invalid address may be returned). - * - BCONNECTION_SOURCE_CONNECTOR(Bconnector *) - * Uses a connection establised with {@link BConnector}. Must be called from the job - * closure of the connector's {@link BConnector_handler}, the handler must be reporting - * successful connection, and must be the first attempt for this handler invocation. - * - BCONNECTION_SOURCE_PIPE(int pipefd, int close_it) - * On Unix-like systems, uses the provided file descriptor. The file descriptor number must - * be >=0. If close_it is true, the connector will take responsibility of closing the - * pipefd. Note that it will be closed even when this Init fails. - * @param reactor reactor we live in - * @param user argument to handler - * @param handler handler called when an error occurs or the receive end of the connection was closed - * by the remote peer. - * @return 1 on success, 0 on failure - */ -int BConnection_Init (BConnection *o, struct BConnection_source source, BReactor *reactor, void *user, - BConnection_handler handler) WARN_UNUSED; - -/** - * Frees the object. - * The send and receive interfaces must not be initialized. - * If the connection was created with a BCONNECTION_SOURCE_PIPE 'source' argument, the file descriptor - * will not be closed. - * - * @param o the object - */ -void BConnection_Free (BConnection *o); - -/** - * Updates the handler function. - * - * @param o the object - * @param user argument to handler - * @param handler new handler function, as in {@link BConnection_Init}. Additionally, may be NULL to - * remove the current handler. In this case, a proper handler must be set before anything - * can happen with the connection. This is used when moving the connection ownership from - * one module to another. - */ -void BConnection_SetHandlers (BConnection *o, void *user, BConnection_handler handler); - -/** - * Sets the SO_SNDBUF socket option. - * - * @param o the object - * @param buf_size value for SO_SNDBUF option - * @return 1 on success, 0 on failure - */ -int BConnection_SetSendBuffer (BConnection *o, int buf_size); - -/** - * Initializes the send interface for the connection. - * The send interface must not be initialized. - * - * @param o the object - */ -void BConnection_SendAsync_Init (BConnection *o); - -/** - * Frees the send interface for the connection. - * The send interface must be initialized. - * If the send interface was busy when this is called, the connection is no longer usable and must be - * freed before any further I/O or interface initialization. - * - * @param o the object - */ -void BConnection_SendAsync_Free (BConnection *o); - -/** - * Returns the send interface. - * The send interface must be initialized. - * - * @param o the object - * @return send interface - */ -StreamPassInterface * BConnection_SendAsync_GetIf (BConnection *o); - -/** - * Initializes the receive interface for the connection. - * The receive interface must not be initialized. - * - * @param o the object - */ -void BConnection_RecvAsync_Init (BConnection *o); - -/** - * Frees the receive interface for the connection. - * The receive interface must be initialized. - * If the receive interface was busy when this is called, the connection is no longer usable and must be - * freed before any further I/O or interface initialization. - * - * @param o the object - */ -void BConnection_RecvAsync_Free (BConnection *o); - -/** - * Returns the receive interface. - * The receive interface must be initialized. - * - * @param o the object - * @return receive interface - */ -StreamRecvInterface * BConnection_RecvAsync_GetIf (BConnection *o); - - - -#ifdef BADVPN_USE_WINAPI -#include "BConnection_win.h" -#else -#include "BConnection_unix.h" -#endif - -#endif diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/system/BConnection_common.c b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/system/BConnection_common.c deleted file mode 100644 index 79950eae..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/system/BConnection_common.c +++ /dev/null @@ -1,58 +0,0 @@ -/** - * @file BConnection_common.c - * @author Ambroz Bizjak - * - * @section LICENSE - * - * 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 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE 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. - */ - -#include "BConnection.h" - -int BListener_Init (BListener *o, BAddr addr, BReactor *reactor, void *user, - BListener_handler handler) -{ - return BListener_InitFrom(o, BLisCon_from_addr(addr), reactor, user, handler); -} - -#ifndef BADVPN_USE_WINAPI -int BListener_InitUnix (BListener *o, const char *socket_path, BReactor *reactor, void *user, - BListener_handler handler) -{ - return BListener_InitFrom(o, BLisCon_from_unix(socket_path), reactor, user, handler); -} -#endif - -int BConnector_Init (BConnector *o, BAddr addr, BReactor *reactor, void *user, - BConnector_handler handler) -{ - return BConnector_InitFrom(o, BLisCon_from_addr(addr), reactor, user, handler); -} - -#ifndef BADVPN_USE_WINAPI -int BConnector_InitUnix (BConnector *o, const char *socket_path, BReactor *reactor, void *user, - BConnector_handler handler) -{ - return BConnector_InitFrom(o, BLisCon_from_unix(socket_path), reactor, user, handler); -} -#endif diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/system/BConnection_unix.c b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/system/BConnection_unix.c deleted file mode 100644 index 14dcb2fd..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/system/BConnection_unix.c +++ /dev/null @@ -1,968 +0,0 @@ -/** - * @file BConnection_unix.c - * @author Ambroz Bizjak - * - * @section LICENSE - * - * 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 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE 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. - */ - -#include -#include -#include -#include -#include -#include -#include - -#include "misc/nonblocking.h" -#include "misc/strdup.h" -#include "base/BLog.h" - -#include "BConnection.h" - -#include "generated/blog_channel_BConnection.h" - -#define MAX_UNIX_SOCKET_PATH 200 - -#define SEND_STATE_NOT_INITED 0 -#define SEND_STATE_READY 1 -#define SEND_STATE_BUSY 2 - -#define RECV_STATE_NOT_INITED 0 -#define RECV_STATE_READY 1 -#define RECV_STATE_BUSY 2 -#define RECV_STATE_INITED_CLOSED 3 -#define RECV_STATE_NOT_INITED_CLOSED 4 - -struct sys_addr { - socklen_t len; - union { - struct sockaddr generic; - struct sockaddr_in ipv4; - struct sockaddr_in6 ipv6; - } addr; -}; - -struct unix_addr { - socklen_t len; - union { - struct sockaddr_un addr; - uint8_t bytes[offsetof(struct sockaddr_un, sun_path) + MAX_UNIX_SOCKET_PATH + 1]; - } u; -}; - -static int build_unix_address (struct unix_addr *out, const char *socket_path); -static void addr_socket_to_sys (struct sys_addr *out, BAddr addr); -static void addr_sys_to_socket (BAddr *out, struct sys_addr addr); -static void listener_fd_handler (BListener *o, int events); -static void listener_default_job_handler (BListener *o); -static void connector_fd_handler (BConnector *o, int events); -static void connector_job_handler (BConnector *o); -static void connection_report_error (BConnection *o); -static void connection_send (BConnection *o); -static void connection_recv (BConnection *o); -static void connection_fd_handler (BConnection *o, int events); -static void connection_send_job_handler (BConnection *o); -static void connection_recv_job_handler (BConnection *o); -static void connection_send_if_handler_send (BConnection *o, uint8_t *data, int data_len); -static void connection_recv_if_handler_recv (BConnection *o, uint8_t *data, int data_len); - -static int build_unix_address (struct unix_addr *out, const char *socket_path) -{ - ASSERT(socket_path); - - if (strlen(socket_path) > MAX_UNIX_SOCKET_PATH) { - return 0; - } - - out->len = offsetof(struct sockaddr_un, sun_path) + strlen(socket_path) + 1; - out->u.addr.sun_family = AF_UNIX; - strcpy(out->u.addr.sun_path, socket_path); - - return 1; -} - -static void addr_socket_to_sys (struct sys_addr *out, BAddr addr) -{ - switch (addr.type) { - case BADDR_TYPE_IPV4: { - out->len = sizeof(out->addr.ipv4); - memset(&out->addr.ipv4, 0, sizeof(out->addr.ipv4)); - out->addr.ipv4.sin_family = AF_INET; - out->addr.ipv4.sin_port = addr.ipv4.port; - out->addr.ipv4.sin_addr.s_addr = addr.ipv4.ip; - } break; - - case BADDR_TYPE_IPV6: { - out->len = sizeof(out->addr.ipv6); - memset(&out->addr.ipv6, 0, sizeof(out->addr.ipv6)); - out->addr.ipv6.sin6_family = AF_INET6; - out->addr.ipv6.sin6_port = addr.ipv6.port; - out->addr.ipv6.sin6_flowinfo = 0; - memcpy(out->addr.ipv6.sin6_addr.s6_addr, addr.ipv6.ip, 16); - out->addr.ipv6.sin6_scope_id = 0; - } break; - - default: ASSERT(0); - } -} - -static void addr_sys_to_socket (BAddr *out, struct sys_addr addr) -{ - switch (addr.addr.generic.sa_family) { - case AF_INET: { - ASSERT(addr.len == sizeof(struct sockaddr_in)) - BAddr_InitIPv4(out, addr.addr.ipv4.sin_addr.s_addr, addr.addr.ipv4.sin_port); - } break; - - case AF_INET6: { - ASSERT(addr.len == sizeof(struct sockaddr_in6)) - BAddr_InitIPv6(out, addr.addr.ipv6.sin6_addr.s6_addr, addr.addr.ipv6.sin6_port); - } break; - - default: { - BAddr_InitNone(out); - } break; - } -} - -static void listener_fd_handler (BListener *o, int events) -{ - DebugObject_Access(&o->d_obj); - - // set default job - BPending_Set(&o->default_job); - - // call handler - o->handler(o->user); - return; -} - -static void listener_default_job_handler (BListener *o) -{ - DebugObject_Access(&o->d_obj); - - BLog(BLOG_ERROR, "discarding connection"); - - // accept - int newfd = accept(o->fd, NULL, NULL); - if (newfd < 0) { - BLog(BLOG_ERROR, "accept failed"); - return; - } - - // close new fd - if (close(newfd) < 0) { - BLog(BLOG_ERROR, "close failed"); - } -} - -static void connector_fd_handler (BConnector *o, int events) -{ - DebugObject_Access(&o->d_obj); - ASSERT(o->fd >= 0) - ASSERT(!o->connected) - ASSERT(o->have_bfd) - - // free BFileDescriptor - BReactor_RemoveFileDescriptor(o->reactor, &o->bfd); - - // set have no BFileDescriptor - o->have_bfd = 0; - - // read connection result - int result; - socklen_t result_len = sizeof(result); - if (getsockopt(o->fd, SOL_SOCKET, SO_ERROR, &result, &result_len) < 0) { - BLog(BLOG_ERROR, "getsockopt failed"); - goto fail0; - } - ASSERT_FORCE(result_len == sizeof(result)) - - if (result != 0) { - BLog(BLOG_ERROR, "connection failed"); - goto fail0; - } - - // set connected - o->connected = 1; - -fail0: - // call handler - o->handler(o->user, !o->connected); - return; -} - -static void connector_job_handler (BConnector *o) -{ - DebugObject_Access(&o->d_obj); - ASSERT(o->fd >= 0) - ASSERT(o->connected) - ASSERT(!o->have_bfd) - - // call handler - o->handler(o->user, 0); - return; -} - -static void connection_report_error (BConnection *o) -{ - DebugError_AssertNoError(&o->d_err); - ASSERT(o->handler) - - // report error - DEBUGERROR(&o->d_err, o->handler(o->user, BCONNECTION_EVENT_ERROR)); - return; -} - -static void connection_send (BConnection *o) -{ - DebugError_AssertNoError(&o->d_err); - ASSERT(o->send.state == SEND_STATE_BUSY) - - // limit - if (!o->is_hupd) { - if (!BReactorLimit_Increment(&o->send.limit)) { - // wait for fd - o->wait_events |= BREACTOR_WRITE; - BReactor_SetFileDescriptorEvents(o->reactor, &o->bfd, o->wait_events); - return; - } - } - - // send - int bytes = write(o->fd, o->send.busy_data, o->send.busy_data_len); - if (bytes < 0) { - if (!o->is_hupd && (errno == EAGAIN || errno == EWOULDBLOCK)) { - // wait for fd - o->wait_events |= BREACTOR_WRITE; - BReactor_SetFileDescriptorEvents(o->reactor, &o->bfd, o->wait_events); - return; - } - - BLog(BLOG_ERROR, "send failed"); - connection_report_error(o); - return; - } - BLog(BLOG_INFO, "clien try write: %d, written: %d", o->send.busy_data_len, bytes); - - ASSERT(bytes > 0) - ASSERT(bytes <= o->send.busy_data_len) - - // set ready - o->send.state = SEND_STATE_READY; - - // done - StreamPassInterface_Done(&o->send.iface, bytes); -} - -static void connection_recv (BConnection *o) -{ - DebugError_AssertNoError(&o->d_err); - ASSERT(o->recv.state == RECV_STATE_BUSY) - - // limit - if (!o->is_hupd) { - if (!BReactorLimit_Increment(&o->recv.limit)) { - // wait for fd - o->wait_events |= BREACTOR_READ; - BReactor_SetFileDescriptorEvents(o->reactor, &o->bfd, o->wait_events); - return; - } - } - BLog(BLOG_INFO, "clien try read: %d", o->recv.busy_data_avail); - - // recv - int bytes = recv(o->fd, o->recv.busy_data, o->recv.busy_data_avail, 0); - if (bytes < 0) { - if (!o->is_hupd && (errno == EAGAIN || errno == EWOULDBLOCK)) { - // wait for fd - o->wait_events |= BREACTOR_READ; - BReactor_SetFileDescriptorEvents(o->reactor, &o->bfd, o->wait_events); - return; - } - BLog(BLOG_ERROR, "recv failed"); - connection_report_error(o); - return; - } - BLog(BLOG_INFO, "clien try read: %d, received: %d", o->recv.busy_data_avail, bytes); - - if (bytes == 0) { - // set recv inited closed - o->recv.state = RECV_STATE_INITED_CLOSED; - - // report recv closed - o->handler(o->user, BCONNECTION_EVENT_RECVCLOSED); - return; - } - - ASSERT(bytes > 0) - ASSERT(bytes <= o->recv.busy_data_avail) - - // set not busy - o->recv.state = RECV_STATE_READY; - // done - StreamRecvInterface_Done(&o->recv.iface, bytes); -} - -static void connection_fd_handler (BConnection *o, int events) -{ - DebugObject_Access(&o->d_obj); - DebugError_AssertNoError(&o->d_err); - ASSERT(!o->is_hupd) - - // clear handled events - o->wait_events &= ~events; - BReactor_SetFileDescriptorEvents(o->reactor, &o->bfd, o->wait_events); - - int have_send = 0; - int have_recv = 0; - - // if we got a HUP event, stop monitoring the file descriptor - if ((events & BREACTOR_HUP)) { - BReactor_RemoveFileDescriptor(o->reactor, &o->bfd); - o->is_hupd = 1; - } - - if ((events & BREACTOR_WRITE) || ((events & (BREACTOR_ERROR|BREACTOR_HUP)) && o->send.state == SEND_STATE_BUSY)) { - ASSERT(o->send.state == SEND_STATE_BUSY) - have_send = 1; - } - - if ((events & BREACTOR_READ) || ((events & (BREACTOR_ERROR|BREACTOR_HUP)) && o->recv.state == RECV_STATE_BUSY)) { - ASSERT(o->recv.state == RECV_STATE_BUSY) - have_recv = 1; - } - - if (have_send) { - if (have_recv) { - BPending_Set(&o->recv.job); - } - - connection_send(o); - return; - } - - if (have_recv) { - connection_recv(o); - return; - } - - if (!o->is_hupd) { - BLog(BLOG_ERROR, "fd error event"); - connection_report_error(o); - return; - } -} - -static void connection_send_job_handler (BConnection *o) -{ - DebugObject_Access(&o->d_obj); - DebugError_AssertNoError(&o->d_err); - ASSERT(o->send.state == SEND_STATE_BUSY) - - connection_send(o); - return; -} - -static void connection_recv_job_handler (BConnection *o) -{ - DebugObject_Access(&o->d_obj); - DebugError_AssertNoError(&o->d_err); - ASSERT(o->recv.state == RECV_STATE_BUSY) - - connection_recv(o); - return; -} - -static void connection_send_if_handler_send (BConnection *o, uint8_t *data, int data_len) -{ - DebugObject_Access(&o->d_obj); - DebugError_AssertNoError(&o->d_err); - ASSERT(o->send.state == SEND_STATE_READY) - ASSERT(data_len > 0) - - // remember data - o->send.busy_data = data; - o->send.busy_data_len = data_len; - - // set busy - o->send.state = SEND_STATE_BUSY; - - connection_send(o); - return; -} - -static void connection_recv_if_handler_recv (BConnection *o, uint8_t *data, int data_avail) -{ - DebugObject_Access(&o->d_obj); - DebugError_AssertNoError(&o->d_err); - ASSERT(o->recv.state == RECV_STATE_READY) - ASSERT(data_avail > 0) - - // remember data - o->recv.busy_data = data; - o->recv.busy_data_avail = data_avail; - - // set busy - o->recv.state = RECV_STATE_BUSY; - - connection_recv(o); - return; -} - -int BConnection_AddressSupported (BAddr addr) -{ - BAddr_Assert(&addr); - - return (addr.type == BADDR_TYPE_IPV4 || addr.type == BADDR_TYPE_IPV6); -} - -int BListener_InitFrom (BListener *o, struct BLisCon_from from, - BReactor *reactor, void *user, - BListener_handler handler) -{ - ASSERT(from.type == BLISCON_FROM_ADDR || from.type == BLISCON_FROM_UNIX) - ASSERT(from.type != BLISCON_FROM_UNIX || from.u.from_unix.socket_path) - ASSERT(handler) - BNetwork_Assert(); - - // init arguments - o->reactor = reactor; - o->user = user; - o->handler = handler; - - // init socket path - o->unix_socket_path = NULL; - if (from.type == BLISCON_FROM_UNIX) { - o->unix_socket_path = b_strdup(from.u.from_unix.socket_path); - if (!o->unix_socket_path) { - BLog(BLOG_ERROR, "b_strdup failed"); - goto fail0; - } - } - - struct unix_addr unixaddr; - struct sys_addr sysaddr; - - if (from.type == BLISCON_FROM_UNIX) { - // build address - if (!build_unix_address(&unixaddr, o->unix_socket_path)) { - BLog(BLOG_ERROR, "build_unix_address failed"); - goto fail1; - } - - // init fd - if ((o->fd = socket(AF_UNIX, SOCK_STREAM, 0)) < 0) { - BLog(BLOG_ERROR, "socket failed"); - goto fail1; - } - } else { - // check address - if (!BConnection_AddressSupported(from.u.from_addr.addr)) { - BLog(BLOG_ERROR, "address not supported"); - goto fail1; - } - - // convert address - addr_socket_to_sys(&sysaddr, from.u.from_addr.addr); - - // init fd - if ((o->fd = socket(sysaddr.addr.generic.sa_family, SOCK_STREAM, 0)) < 0) { - BLog(BLOG_ERROR, "socket failed"); - goto fail1; - } - } - - // set non-blocking - if (!badvpn_set_nonblocking(o->fd)) { - BLog(BLOG_ERROR, "badvpn_set_nonblocking failed"); - goto fail2; - } - - if (from.type == BLISCON_FROM_UNIX) { - // unlink existing socket - if (unlink(o->unix_socket_path) < 0 && errno != ENOENT) { - BLog(BLOG_ERROR, "unlink existing socket failed"); - goto fail2; - } - - // bind - if (bind(o->fd, (struct sockaddr *)&unixaddr.u.addr, unixaddr.len) < 0) { - BLog(BLOG_ERROR, "bind failed"); - goto fail2; - } - } else { - // set SO_REUSEADDR - int optval = 1; - if (setsockopt(o->fd, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof(optval)) < 0) { - BLog(BLOG_ERROR, "setsockopt(SO_REUSEADDR) failed"); - } - - // bind - if (bind(o->fd, &sysaddr.addr.generic, sysaddr.len) < 0) { - BLog(BLOG_ERROR, "bind failed"); - goto fail2; - } - } - - // listen - if (listen(o->fd, BCONNECTION_LISTEN_BACKLOG) < 0) { - BLog(BLOG_ERROR, "listen failed"); - goto fail3; - } - - // init BFileDescriptor - BFileDescriptor_Init(&o->bfd, o->fd, (BFileDescriptor_handler)listener_fd_handler, o); - if (!BReactor_AddFileDescriptor(o->reactor, &o->bfd)) { - BLog(BLOG_ERROR, "BReactor_AddFileDescriptor failed"); - goto fail3; - } - BReactor_SetFileDescriptorEvents(o->reactor, &o->bfd, BREACTOR_READ); - - // init default job - BPending_Init(&o->default_job, BReactor_PendingGroup(o->reactor), (BPending_handler)listener_default_job_handler, o); - - DebugObject_Init(&o->d_obj); - return 1; - -fail3: - if (from.type == BLISCON_FROM_UNIX) { - if (unlink(o->unix_socket_path) < 0) { - BLog(BLOG_ERROR, "unlink socket failed"); - } - } -fail2: - if (close(o->fd) < 0) { - BLog(BLOG_ERROR, "close failed"); - } -fail1: - free(o->unix_socket_path); -fail0: - return 0; -} - -void BListener_Free (BListener *o) -{ - DebugObject_Free(&o->d_obj); - - // free default job - BPending_Free(&o->default_job); - - // free BFileDescriptor - BReactor_RemoveFileDescriptor(o->reactor, &o->bfd); - - // free fd - if (close(o->fd) < 0) { - BLog(BLOG_ERROR, "close failed"); - } - - // unlink unix socket - if (o->unix_socket_path) { - if (unlink(o->unix_socket_path) < 0) { - BLog(BLOG_ERROR, "unlink socket failed"); - } - } - - // free unix socket path - if (o->unix_socket_path) { - free(o->unix_socket_path); - } -} - -int BConnector_InitFrom (BConnector *o, struct BLisCon_from from, BReactor *reactor, void *user, - BConnector_handler handler) -{ - ASSERT(from.type == BLISCON_FROM_ADDR || from.type == BLISCON_FROM_UNIX) - ASSERT(from.type != BLISCON_FROM_UNIX || from.u.from_unix.socket_path) - ASSERT(handler) - BNetwork_Assert(); - - // init arguments - o->reactor = reactor; - o->user = user; - o->handler = handler; - - struct unix_addr unixaddr; - struct sys_addr sysaddr; - - if (from.type == BLISCON_FROM_UNIX) { - // build address - if (!build_unix_address(&unixaddr, from.u.from_unix.socket_path)) { - BLog(BLOG_ERROR, "build_unix_address failed"); - goto fail0; - } - } else { - // check address - if (!BConnection_AddressSupported(from.u.from_addr.addr)) { - BLog(BLOG_ERROR, "address not supported"); - goto fail0; - } - - // convert address - addr_socket_to_sys(&sysaddr, from.u.from_addr.addr); - } - - // init job - BPending_Init(&o->job, BReactor_PendingGroup(o->reactor), (BPending_handler)connector_job_handler, o); - - if (from.type == BLISCON_FROM_UNIX) { - // init fd - if ((o->fd = socket(AF_UNIX, SOCK_STREAM, 0)) < 0) { - BLog(BLOG_ERROR, "socket failed"); - goto fail1; - } - } else { - // init fd - if ((o->fd = socket(sysaddr.addr.generic.sa_family, SOCK_STREAM, 0)) < 0) { - BLog(BLOG_ERROR, "socket failed"); - goto fail1; - } - } - - // set fd non-blocking - if (!badvpn_set_nonblocking(o->fd)) { - BLog(BLOG_ERROR, "badvpn_set_nonblocking failed"); - goto fail2; - } - - // connect fd - int connect_res; - if (from.type == BLISCON_FROM_UNIX) { - connect_res = connect(o->fd, (struct sockaddr *)&unixaddr.u.addr, unixaddr.len); - } else { - connect_res = connect(o->fd, &sysaddr.addr.generic, sysaddr.len); - } - if (connect_res < 0 && errno != EINPROGRESS) { - BLog(BLOG_ERROR, "connect failed"); - goto fail2; - } - - // set not connected - o->connected = 0; - - // set have no BFileDescriptor - o->have_bfd = 0; - - if (connect_res < 0) { - // init BFileDescriptor - BFileDescriptor_Init(&o->bfd, o->fd, (BFileDescriptor_handler)connector_fd_handler, o); - if (!BReactor_AddFileDescriptor(o->reactor, &o->bfd)) { - BLog(BLOG_ERROR, "BReactor_AddFileDescriptor failed"); - goto fail2; - } - BReactor_SetFileDescriptorEvents(o->reactor, &o->bfd, BREACTOR_WRITE); - - // set have BFileDescriptor - o->have_bfd = 1; - } else { - // set connected - o->connected = 1; - - // set job - BPending_Set(&o->job); - } - - DebugObject_Init(&o->d_obj); - return 1; - -fail2: - if (close(o->fd) < 0) { - BLog(BLOG_ERROR, "close failed"); - } -fail1: - BPending_Free(&o->job); -fail0: - return 0; -} - -void BConnector_Free (BConnector *o) -{ - DebugObject_Free(&o->d_obj); - - // free BFileDescriptor - if (o->have_bfd) { - BReactor_RemoveFileDescriptor(o->reactor, &o->bfd); - } - - // close fd - if (o->fd != -1) { - if (close(o->fd) < 0) { - BLog(BLOG_ERROR, "close failed"); - } - } - - // free job - BPending_Free(&o->job); -} - -int BConnection_Init (BConnection *o, struct BConnection_source source, BReactor *reactor, void *user, - BConnection_handler handler) -{ - switch (source.type) { - case BCONNECTION_SOURCE_TYPE_LISTENER: { - BListener *listener = source.u.listener.listener; - DebugObject_Access(&listener->d_obj); - ASSERT(BPending_IsSet(&listener->default_job)) - } break; - case BCONNECTION_SOURCE_TYPE_CONNECTOR: { - BConnector *connector = source.u.connector.connector; - DebugObject_Access(&connector->d_obj); - ASSERT(connector->fd >= 0) - ASSERT(connector->connected) - ASSERT(!connector->have_bfd) - ASSERT(!BPending_IsSet(&connector->job)) - } break; - case BCONNECTION_SOURCE_TYPE_PIPE: { - ASSERT(source.u.pipe.pipefd >= 0) - } break; - default: ASSERT(0); - } - ASSERT(handler) - BNetwork_Assert(); - - // init arguments - o->reactor = reactor; - o->user = user; - o->handler = handler; - - switch (source.type) { - case BCONNECTION_SOURCE_TYPE_LISTENER: { - BListener *listener = source.u.listener.listener; - - // unset listener's default job - BPending_Unset(&listener->default_job); - - // accept - struct sys_addr sysaddr; - sysaddr.len = sizeof(sysaddr.addr); - if ((o->fd = accept(listener->fd, &sysaddr.addr.generic, &sysaddr.len)) < 0) { - BLog(BLOG_ERROR, "accept failed"); - goto fail0; - } - o->close_fd = 1; - - // set non-blocking - if (!badvpn_set_nonblocking(o->fd)) { - BLog(BLOG_ERROR, "badvpn_set_nonblocking failed"); - goto fail1; - } - - // return address - if (source.u.listener.out_addr) { - addr_sys_to_socket(source.u.listener.out_addr, sysaddr); - } - } break; - - case BCONNECTION_SOURCE_TYPE_CONNECTOR: { - BConnector *connector = source.u.connector.connector; - - // grab fd from connector - o->fd = connector->fd; - connector->fd = -1; - o->close_fd = 1; - } break; - - case BCONNECTION_SOURCE_TYPE_PIPE: { - // use user-provided fd - o->fd = source.u.pipe.pipefd; - o->close_fd = !!source.u.pipe.close_it; - - // set non-blocking - if (!badvpn_set_nonblocking(o->fd)) { - BLog(BLOG_ERROR, "badvpn_set_nonblocking failed"); - goto fail1; - } - } break; - } - - // set not HUPd - o->is_hupd = 0; - - // init BFileDescriptor - BFileDescriptor_Init(&o->bfd, o->fd, (BFileDescriptor_handler)connection_fd_handler, o); - if (!BReactor_AddFileDescriptor(o->reactor, &o->bfd)) { - BLog(BLOG_ERROR, "BReactor_AddFileDescriptor failed"); - goto fail1; - } - - // set no wait events - o->wait_events = 0; - - // init limits - BReactorLimit_Init(&o->send.limit, o->reactor, BCONNECTION_SEND_LIMIT); - BReactorLimit_Init(&o->recv.limit, o->reactor, BCONNECTION_RECV_LIMIT); - - // set send and recv not inited - o->send.state = SEND_STATE_NOT_INITED; - o->recv.state = RECV_STATE_NOT_INITED; - - DebugError_Init(&o->d_err, BReactor_PendingGroup(o->reactor)); - DebugObject_Init(&o->d_obj); - return 1; - -fail1: - if (o->close_fd) { - if (close(o->fd) < 0) { - BLog(BLOG_ERROR, "close failed"); - } - } -fail0: - return 0; -} - -void BConnection_Free (BConnection *o) -{ - DebugObject_Free(&o->d_obj); - DebugError_Free(&o->d_err); - ASSERT(o->send.state == SEND_STATE_NOT_INITED) - ASSERT(o->recv.state == RECV_STATE_NOT_INITED || o->recv.state == RECV_STATE_NOT_INITED_CLOSED) - - // free limits - BReactorLimit_Free(&o->recv.limit); - BReactorLimit_Free(&o->send.limit); - - // free BFileDescriptor - if (!o->is_hupd) { - BReactor_RemoveFileDescriptor(o->reactor, &o->bfd); - } - - // close fd - if (o->close_fd) { - if (close(o->fd) < 0) { - BLog(BLOG_ERROR, "close failed"); - } - } -} - -void BConnection_SetHandlers (BConnection *o, void *user, BConnection_handler handler) -{ - DebugObject_Access(&o->d_obj); - - // set handlers - o->user = user; - o->handler = handler; -} - -int BConnection_SetSendBuffer (BConnection *o, int buf_size) -{ - DebugObject_Access(&o->d_obj); - - if (setsockopt(o->fd, SOL_SOCKET, SO_SNDBUF, (void *)&buf_size, sizeof(buf_size)) < 0) { - BLog(BLOG_ERROR, "setsockopt failed"); - return 0; - } - - return 1; -} - -void BConnection_SendAsync_Init (BConnection *o) -{ - DebugObject_Access(&o->d_obj); - DebugError_AssertNoError(&o->d_err); - ASSERT(o->send.state == SEND_STATE_NOT_INITED) - - // init interface - StreamPassInterface_Init(&o->send.iface, (StreamPassInterface_handler_send)connection_send_if_handler_send, o, BReactor_PendingGroup(o->reactor)); - - // init job - BPending_Init(&o->send.job, BReactor_PendingGroup(o->reactor), (BPending_handler)connection_send_job_handler, o); - - // set ready - o->send.state = SEND_STATE_READY; -} - -void BConnection_SendAsync_Free (BConnection *o) -{ - DebugObject_Access(&o->d_obj); - ASSERT(o->send.state == SEND_STATE_READY || o->send.state == SEND_STATE_BUSY) - - // update events - if (!o->is_hupd) { - o->wait_events &= ~BREACTOR_WRITE; - BReactor_SetFileDescriptorEvents(o->reactor, &o->bfd, o->wait_events); - } - - // free job - BPending_Free(&o->send.job); - - // free interface - StreamPassInterface_Free(&o->send.iface); - - // set not inited - o->send.state = SEND_STATE_NOT_INITED; -} - -StreamPassInterface * BConnection_SendAsync_GetIf (BConnection *o) -{ - DebugObject_Access(&o->d_obj); - ASSERT(o->send.state == SEND_STATE_READY || o->send.state == SEND_STATE_BUSY) - - return &o->send.iface; -} - -void BConnection_RecvAsync_Init (BConnection *o) -{ - DebugObject_Access(&o->d_obj); - DebugError_AssertNoError(&o->d_err); - ASSERT(o->recv.state == RECV_STATE_NOT_INITED) - - // init interface - StreamRecvInterface_Init(&o->recv.iface, (StreamRecvInterface_handler_recv)connection_recv_if_handler_recv, o, BReactor_PendingGroup(o->reactor)); - - // init job - BPending_Init(&o->recv.job, BReactor_PendingGroup(o->reactor), (BPending_handler)connection_recv_job_handler, o); - - // set ready - o->recv.state = RECV_STATE_READY; -} - -void BConnection_RecvAsync_Free (BConnection *o) -{ - DebugObject_Access(&o->d_obj); - ASSERT(o->recv.state == RECV_STATE_READY || o->recv.state == RECV_STATE_BUSY || o->recv.state == RECV_STATE_INITED_CLOSED) - - // update events - if (!o->is_hupd) { - o->wait_events &= ~BREACTOR_READ; - BReactor_SetFileDescriptorEvents(o->reactor, &o->bfd, o->wait_events); - } - - // free job - BPending_Free(&o->recv.job); - - // free interface - StreamRecvInterface_Free(&o->recv.iface); - - // set not inited - o->recv.state = RECV_STATE_NOT_INITED; -} - -StreamRecvInterface * BConnection_RecvAsync_GetIf (BConnection *o) -{ - DebugObject_Access(&o->d_obj); - ASSERT(o->recv.state == RECV_STATE_READY || o->recv.state == RECV_STATE_BUSY || o->recv.state == RECV_STATE_INITED_CLOSED) - - return &o->recv.iface; -} diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/system/BConnection_unix.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/system/BConnection_unix.h deleted file mode 100644 index 38d368ca..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/system/BConnection_unix.h +++ /dev/null @@ -1,87 +0,0 @@ -/** - * @file BConnection_unix.h - * @author Ambroz Bizjak - * - * @section LICENSE - * - * 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 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE 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. - */ - -#include "misc/debugerror.h" -#include "base/DebugObject.h" - -#define BCONNECTION_SEND_LIMIT 2 -#define BCONNECTION_RECV_LIMIT 2 -#define BCONNECTION_LISTEN_BACKLOG 128 - -struct BListener_s { - BReactor *reactor; - void *user; - BListener_handler handler; - char *unix_socket_path; - int fd; - BFileDescriptor bfd; - BPending default_job; - DebugObject d_obj; -}; - -struct BConnector_s { - BReactor *reactor; - void *user; - BConnector_handler handler; - BPending job; - int fd; - int connected; - int have_bfd; - BFileDescriptor bfd; - DebugObject d_obj; -}; - -struct BConnection_s { - BReactor *reactor; - void *user; - BConnection_handler handler; - int fd; - int close_fd; - int is_hupd; - BFileDescriptor bfd; - int wait_events; - struct { - BReactorLimit limit; - StreamPassInterface iface; - BPending job; - const uint8_t *busy_data; - int busy_data_len; - int state; - } send; - struct { - BReactorLimit limit; - StreamRecvInterface iface; - BPending job; - uint8_t *busy_data; - int busy_data_avail; - int state; - } recv; - DebugError d_err; - DebugObject d_obj; -}; diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/system/BDatagram.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/system/BDatagram.h deleted file mode 100644 index 6196b5df..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/system/BDatagram.h +++ /dev/null @@ -1,209 +0,0 @@ -/** - * @file BDatagram.h - * @author Ambroz Bizjak - * - * @section LICENSE - * - * 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 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE 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. - */ - -#ifndef BADVPN_SYSTEM_BDATAGRAM -#define BADVPN_SYSTEM_BDATAGRAM - -#include "misc/debug.h" -#include "flow/PacketPassInterface.h" -#include "flow/PacketRecvInterface.h" -#include "system/BAddr.h" -#include "system/BReactor.h" -#include "system/BNetwork.h" - -struct BDatagram_s; - -/** - * Represents datagram communication. This is usually UDP, but may also be Linux packet sockets. - * Sending and receiving is performed via {@link PacketPassInterface} and {@link PacketRecvInterface}, - * respectively. - */ -typedef struct BDatagram_s BDatagram; - -#define BDATAGRAM_EVENT_ERROR 1 - -/** - * Handler called when an error occurs with the datagram object. - * The datagram object is no longer usable and must be freed from withing the job closure of - * this handler. No further I/O, interface initialization, binding and send address setting - * must occur. - * - * @param user as in {@link BDatagram_Init} - * @param event always BDATAGRAM_EVENT_ERROR - */ -typedef void (*BDatagram_handler) (void *user, int event); - -/** - * Checks if the given address family (from {@link BAddr.h}) is supported by {@link BDatagram} - * and related objects. - * - * @param family family to check - * @return 1 if supported, 0 if not - */ -int BDatagram_AddressFamilySupported (int family); - -/** - * Initializes the object. - * {@link BNetwork_GlobalInit} must have been done. - * - * @param o the object - * @param family address family. Must be supported according to {@link BDatagram_AddressFamilySupported}. - * @param reactor reactor we live in - * @param user argument to handler - * @param handler handler called when an error occurs - * @return 1 on success, 0 on failure - */ -int BDatagram_Init (BDatagram *o, int family, BReactor *reactor, void *user, - BDatagram_handler handler) WARN_UNUSED; - -/** - * Frees the object. - * The send and receive interfaces must not be initialized. - * - * @param o the object - */ -void BDatagram_Free (BDatagram *o); - -/** - * Binds to the given local address. - * May initiate I/O. - * - * @param o the object - * @param addr address to bind to. Its family must be supported according to {@link BDatagram_AddressFamilySupported}. - * @return 1 on success, 0 on failure - */ -int BDatagram_Bind (BDatagram *o, BAddr addr) WARN_UNUSED; - -/** - * Sets addresses for sending. - * May initiate I/O. - * - * @param o the object - * @param remote_addr destination address for sending datagrams. Its family must be supported according - * to {@link BDatagram_AddressFamilySupported}. - * @param local_addr local source IP address. May be an invalid address, otherwise its family must be - * supported according to {@link BDatagram_AddressFamilySupported}. - */ -void BDatagram_SetSendAddrs (BDatagram *o, BAddr remote_addr, BIPAddr local_addr); - -/** - * Returns the remote and local address of the last datagram received. - * Fails if and only if no datagrams have been received yet. - * - * @param o the object - * @param remote_addr returns the remote source address of the datagram. May be an invalid address, theoretically. - * @param local_addr returns the local destination IP address. May be an invalid address. - * @return 1 on success, 0 on failure - */ -int BDatagram_GetLastReceiveAddrs (BDatagram *o, BAddr *remote_addr, BIPAddr *local_addr); - -#ifndef BADVPN_USE_WINAPI -/** - * Returns the underlying socket file descriptor of the datagram object. - * Available on Unix-like systems only. - * - * @param o the object - * @return file descriptor - */ -int BDatagram_GetFd (BDatagram *o); -#endif - -/** - * Sets the SO_REUSEADDR option for the underlying socket. - * - * @param o the object - * @param reuse value of the option. Must be 0 or 1. - */ -int BDatagram_SetReuseAddr (BDatagram *o, int reuse); - -/** - * Initializes the send interface. - * The send interface must not be initialized. - * - * @param o the object - * @param mtu maximum transmission unit. Must be >=0. - */ -void BDatagram_SendAsync_Init (BDatagram *o, int mtu); - -/** - * Frees the send interface. - * The send interface must be initialized. - * If the send interface was busy when this is called, the datagram object is no longer usable and must be - * freed before any further I/O or interface initialization. - * - * @param o the object - */ -void BDatagram_SendAsync_Free (BDatagram *o); - -/** - * Returns the send interface. - * The send interface must be initialized. - * The MTU of the interface will be as in {@link BDatagram_SendAsync_Init}. - * - * @param o the object - * @return send interface - */ -PacketPassInterface * BDatagram_SendAsync_GetIf (BDatagram *o); - -/** - * Initializes the receive interface. - * The receive interface must not be initialized. - * - * @param o the object - * @param mtu maximum transmission unit. Must be >=0. - */ -void BDatagram_RecvAsync_Init (BDatagram *o, int mtu); - -/** - * Frees the receive interface. - * The receive interface must be initialized. - * If the receive interface was busy when this is called, the datagram object is no longer usable and must be - * freed before any further I/O or interface initialization. - * - * @param o the object - */ -void BDatagram_RecvAsync_Free (BDatagram *o); - -/** - * Returns the receive interface. - * The receive interface must be initialized. - * The MTU of the interface will be as in {@link BDatagram_RecvAsync_Init}. - * - * @param o the object - * @return receive interface - */ -PacketRecvInterface * BDatagram_RecvAsync_GetIf (BDatagram *o); - -#ifdef BADVPN_USE_WINAPI -#include "BDatagram_win.h" -#else -#include "BDatagram_unix.h" -#endif - -#endif diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/system/BDatagram_unix.c b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/system/BDatagram_unix.c deleted file mode 100644 index 6f9a9323..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/system/BDatagram_unix.c +++ /dev/null @@ -1,881 +0,0 @@ -/** - * @file BDatagram_unix.c - * @author Ambroz Bizjak - * - * @section LICENSE - * - * 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 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE 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. - */ - -#ifndef _GNU_SOURCE -#define _GNU_SOURCE -#endif - -#include -#include -#include -#include -#ifdef __APPLE__ -#define IPV6_PKTINFO IPV6_2292PKTINFO -#endif -#include -#include -#ifdef BADVPN_LINUX -# include -# include -#endif - -#include "misc/nonblocking.h" -#include "base/BLog.h" - -#include "BDatagram.h" - -#include "generated/blog_channel_BDatagram.h" - -struct sys_addr { - socklen_t len; - union { - struct sockaddr generic; - struct sockaddr_in ipv4; - struct sockaddr_in6 ipv6; -#ifdef BADVPN_LINUX - struct sockaddr_ll packet; -#endif - } addr; -}; - -static int family_socket_to_sys (int family); -static void addr_socket_to_sys (struct sys_addr *out, BAddr addr); -static void addr_sys_to_socket (BAddr *out, struct sys_addr addr); -static void set_pktinfo (int fd, int family); -static void report_error (BDatagram *o); -static void do_send (BDatagram *o); -static void do_recv (BDatagram *o); -static void fd_handler (BDatagram *o, int events); -static void send_job_handler (BDatagram *o); -static void recv_job_handler (BDatagram *o); -static void send_if_handler_send (BDatagram *o, uint8_t *data, int data_len); -static void recv_if_handler_recv (BDatagram *o, uint8_t *data); - -static int family_socket_to_sys (int family) -{ - switch (family) { - case BADDR_TYPE_IPV4: - return AF_INET; - case BADDR_TYPE_IPV6: - return AF_INET6; -#ifdef BADVPN_LINUX - case BADDR_TYPE_PACKET: - return AF_PACKET; -#endif - } - - ASSERT(0); - return 0; -} - -static void addr_socket_to_sys (struct sys_addr *out, BAddr addr) -{ - switch (addr.type) { - case BADDR_TYPE_IPV4: { - out->len = sizeof(out->addr.ipv4); - memset(&out->addr.ipv4, 0, sizeof(out->addr.ipv4)); - out->addr.ipv4.sin_family = AF_INET; - out->addr.ipv4.sin_port = addr.ipv4.port; - out->addr.ipv4.sin_addr.s_addr = addr.ipv4.ip; - } break; - - case BADDR_TYPE_IPV6: { - out->len = sizeof(out->addr.ipv6); - memset(&out->addr.ipv6, 0, sizeof(out->addr.ipv6)); - out->addr.ipv6.sin6_family = AF_INET6; - out->addr.ipv6.sin6_port = addr.ipv6.port; - out->addr.ipv6.sin6_flowinfo = 0; - memcpy(out->addr.ipv6.sin6_addr.s6_addr, addr.ipv6.ip, 16); - out->addr.ipv6.sin6_scope_id = 0; - } break; - -#ifdef BADVPN_LINUX - case BADDR_TYPE_PACKET: { - ASSERT(addr.packet.header_type == BADDR_PACKET_HEADER_TYPE_ETHERNET) - memset(&out->addr.packet, 0, sizeof(out->addr.packet)); - out->len = sizeof(out->addr.packet); - out->addr.packet.sll_family = AF_PACKET; - out->addr.packet.sll_protocol = addr.packet.phys_proto; - out->addr.packet.sll_ifindex = addr.packet.interface_index; - out->addr.packet.sll_hatype = 1; // linux/if_arp.h: #define ARPHRD_ETHER 1 - switch (addr.packet.packet_type) { - case BADDR_PACKET_PACKET_TYPE_HOST: - out->addr.packet.sll_pkttype = PACKET_HOST; - break; - case BADDR_PACKET_PACKET_TYPE_BROADCAST: - out->addr.packet.sll_pkttype = PACKET_BROADCAST; - break; - case BADDR_PACKET_PACKET_TYPE_MULTICAST: - out->addr.packet.sll_pkttype = PACKET_MULTICAST; - break; - case BADDR_PACKET_PACKET_TYPE_OTHERHOST: - out->addr.packet.sll_pkttype = PACKET_OTHERHOST; - break; - case BADDR_PACKET_PACKET_TYPE_OUTGOING: - out->addr.packet.sll_pkttype = PACKET_OUTGOING; - break; - default: - ASSERT(0); - } - out->addr.packet.sll_halen = 6; - memcpy(out->addr.packet.sll_addr, addr.packet.phys_addr, 6); - } break; -#endif - - default: ASSERT(0); - } -} - -static void addr_sys_to_socket (BAddr *out, struct sys_addr addr) -{ - switch (addr.addr.generic.sa_family) { - case AF_INET: { - ASSERT(addr.len == sizeof(struct sockaddr_in)) - BAddr_InitIPv4(out, addr.addr.ipv4.sin_addr.s_addr, addr.addr.ipv4.sin_port); - } break; - - case AF_INET6: { - ASSERT(addr.len == sizeof(struct sockaddr_in6)) - BAddr_InitIPv6(out, addr.addr.ipv6.sin6_addr.s6_addr, addr.addr.ipv6.sin6_port); - } break; - -#ifdef BADVPN_LINUX - case AF_PACKET: { - if (addr.len < offsetof(struct sockaddr_ll, sll_addr) + 6) { - goto fail; - } - if (addr.addr.packet.sll_hatype != 1) { // linux/if_arp.h: #define ARPHRD_ETHER 1 - goto fail; - } - int packet_type; - switch (addr.addr.packet.sll_pkttype) { - case PACKET_HOST: - packet_type = BADDR_PACKET_PACKET_TYPE_HOST; - break; - case PACKET_BROADCAST: - packet_type = BADDR_PACKET_PACKET_TYPE_BROADCAST; - break; - case PACKET_MULTICAST: - packet_type = BADDR_PACKET_PACKET_TYPE_MULTICAST; - break; - case PACKET_OTHERHOST: - packet_type = BADDR_PACKET_PACKET_TYPE_OTHERHOST; - break; - case PACKET_OUTGOING: - packet_type = BADDR_PACKET_PACKET_TYPE_OUTGOING; - break; - default: - goto fail; - } - if (addr.addr.packet.sll_halen != 6) { - goto fail; - } - BAddr_InitPacket(out, addr.addr.packet.sll_protocol, addr.addr.packet.sll_ifindex, BADDR_PACKET_HEADER_TYPE_ETHERNET, packet_type, addr.addr.packet.sll_addr); - } break; -#endif - - fail: - default: { - BAddr_InitNone(out); - } break; - } -} - -static void set_pktinfo (int fd, int family) -{ - int opt = 1; - - switch (family) { - case BADDR_TYPE_IPV4: { -#ifdef BADVPN_FREEBSD - if (setsockopt(fd, IPPROTO_IP, IP_RECVDSTADDR, &opt, sizeof(opt)) < 0) { - BLog(BLOG_ERROR, "setsockopt(IP_RECVDSTADDR) failed"); - } -#else - if (setsockopt(fd, IPPROTO_IP, IP_PKTINFO, &opt, sizeof(opt)) < 0) { - BLog(BLOG_ERROR, "setsockopt(IP_PKTINFO) failed"); - } -#endif - } break; - -#ifdef IPV6_RECVPKTINFO - case BADDR_TYPE_IPV6: { - if (setsockopt(fd, IPPROTO_IPV6, IPV6_RECVPKTINFO, &opt, sizeof(opt)) < 0) { - BLog(BLOG_ERROR, "setsockopt(IPV6_RECVPKTINFO) failed"); - } - } break; -#endif - } -} - -static void report_error (BDatagram *o) -{ - DebugError_AssertNoError(&o->d_err); - - // report error - DEBUGERROR(&o->d_err, o->handler(o->user, BDATAGRAM_EVENT_ERROR)); - return; -} - -static void do_send (BDatagram *o) -{ - DebugError_AssertNoError(&o->d_err); - ASSERT(o->send.inited) - ASSERT(o->send.busy) - ASSERT(o->send.have_addrs) - - // limit - if (!BReactorLimit_Increment(&o->send.limit)) { - // wait for fd - o->wait_events |= BREACTOR_WRITE; - BReactor_SetFileDescriptorEvents(o->reactor, &o->bfd, o->wait_events); - return; - } - - // convert destination address - struct sys_addr sysaddr; - addr_socket_to_sys(&sysaddr, o->send.remote_addr); - - struct iovec iov; - iov.iov_base = (uint8_t *)o->send.busy_data; - iov.iov_len = o->send.busy_data_len; - - union { -#ifdef BADVPN_FREEBSD - char in[CMSG_SPACE(sizeof(struct in_addr))]; -#else - char in[CMSG_SPACE(sizeof(struct in_pktinfo))]; -#endif - char in6[CMSG_SPACE(sizeof(struct in6_pktinfo))]; - } cdata; - - struct msghdr msg; - memset(&msg, 0, sizeof(msg)); - msg.msg_name = &sysaddr.addr.generic; - msg.msg_namelen = sysaddr.len; - msg.msg_iov = &iov; - msg.msg_iovlen = 1; - msg.msg_control = &cdata; - msg.msg_controllen = sizeof(cdata); - - struct cmsghdr *cmsg = CMSG_FIRSTHDR(&msg); - - size_t controllen = 0; -#ifdef __APPLE__ - int bytes = -1; - switch (o->send.local_addr.type) { - case BADDR_TYPE_IPV4: { - bytes = sendto(o->fd, iov.iov_base, iov.iov_len, 0, msg.msg_name, msg.msg_namelen); - } break; - - case BADDR_TYPE_IPV6: { - memset(cmsg, 0, CMSG_SPACE(sizeof(struct in6_pktinfo))); - cmsg->cmsg_level = IPPROTO_IPV6; - cmsg->cmsg_type = IPV6_PKTINFO; - cmsg->cmsg_len = CMSG_LEN(sizeof(struct in6_pktinfo)); - struct in6_pktinfo *pktinfo = (struct in6_pktinfo *)CMSG_DATA(cmsg); - memcpy(pktinfo->ipi6_addr.s6_addr, o->send.local_addr.ipv6, 16); - controllen += CMSG_SPACE(sizeof(struct in6_pktinfo)); - msg.msg_controllen = controllen; - if (msg.msg_controllen == 0) { - msg.msg_control = NULL; - } - bytes = sendmsg(o->fd, &msg, 0); - } break; - } -#else - switch (o->send.local_addr.type) { - case BADDR_TYPE_IPV4: { -#ifdef BADVPN_FREEBSD - memset(cmsg, 0, CMSG_SPACE(sizeof(struct in_addr))); - cmsg->cmsg_level = IPPROTO_IP; - cmsg->cmsg_type = IP_SENDSRCADDR; - cmsg->cmsg_len = CMSG_LEN(sizeof(struct in_addr)); - struct in_addr *addrinfo = (struct in_addr *)CMSG_DATA(cmsg); - addrinfo->s_addr = o->send.local_addr.ipv4; - controllen += CMSG_SPACE(sizeof(struct in_addr)); -#else - memset(cmsg, 0, CMSG_SPACE(sizeof(struct in_pktinfo))); - cmsg->cmsg_level = IPPROTO_IP; - cmsg->cmsg_type = IP_PKTINFO; - cmsg->cmsg_len = CMSG_LEN(sizeof(struct in_pktinfo)); - struct in_pktinfo *pktinfo = (struct in_pktinfo *)CMSG_DATA(cmsg); - pktinfo->ipi_spec_dst.s_addr = o->send.local_addr.ipv4; - controllen += CMSG_SPACE(sizeof(struct in_pktinfo)); -#endif - } break; - - case BADDR_TYPE_IPV6: { - memset(cmsg, 0, CMSG_SPACE(sizeof(struct in6_pktinfo))); - cmsg->cmsg_level = IPPROTO_IPV6; - cmsg->cmsg_type = IPV6_PKTINFO; - cmsg->cmsg_len = CMSG_LEN(sizeof(struct in6_pktinfo)); - struct in6_pktinfo *pktinfo = (struct in6_pktinfo *)CMSG_DATA(cmsg); - memcpy(pktinfo->ipi6_addr.s6_addr, o->send.local_addr.ipv6, 16); - controllen += CMSG_SPACE(sizeof(struct in6_pktinfo)); - } break; - } - - msg.msg_controllen = controllen; - - if (msg.msg_controllen == 0) { - msg.msg_control = NULL; - } - - // send - int bytes = sendmsg(o->fd, &msg, 0); -#endif - if (bytes < 0) { - if (errno == EAGAIN || errno == EWOULDBLOCK) { - // wait for fd - o->wait_events |= BREACTOR_WRITE; - BReactor_SetFileDescriptorEvents(o->reactor, &o->bfd, o->wait_events); - return; - } - - BLog(BLOG_ERROR, "send failed"); - report_error(o); - return; - } - - ASSERT(bytes >= 0) - ASSERT(bytes <= o->send.busy_data_len) - - if (bytes < o->send.busy_data_len) { - BLog(BLOG_ERROR, "send sent too little"); - } - - // if recv wasn't started yet, start it - if (!o->recv.started) { - // set recv started - o->recv.started = 1; - - // continue receiving - if (o->recv.inited && o->recv.busy) { - BPending_Set(&o->recv.job); - } - } - - // set not busy - o->send.busy = 0; - - // done - PacketPassInterface_Done(&o->send.iface); -} - -static void do_recv (BDatagram *o) -{ - DebugError_AssertNoError(&o->d_err); - ASSERT(o->recv.inited) - ASSERT(o->recv.busy) - ASSERT(o->recv.started) - - // limit - if (!BReactorLimit_Increment(&o->recv.limit)) { - // wait for fd - o->wait_events |= BREACTOR_READ; - BReactor_SetFileDescriptorEvents(o->reactor, &o->bfd, o->wait_events); - return; - } - - struct sys_addr sysaddr; - - struct iovec iov; - iov.iov_base = o->recv.busy_data; - iov.iov_len = o->recv.mtu; - - union { -#ifdef BADVPN_FREEBSD - char in[CMSG_SPACE(sizeof(struct in_addr))]; -#else - char in[CMSG_SPACE(sizeof(struct in_pktinfo))]; -#endif - char in6[CMSG_SPACE(sizeof(struct in6_pktinfo))]; - } cdata; - - struct msghdr msg; - memset(&msg, 0, sizeof(msg)); - msg.msg_name = &sysaddr.addr.generic; - msg.msg_namelen = sizeof(sysaddr.addr); - msg.msg_iov = &iov; - msg.msg_iovlen = 1; - msg.msg_control = &cdata; - msg.msg_controllen = sizeof(cdata); - - // recv - int bytes = recvmsg(o->fd, &msg, 0); - if (bytes < 0) { - if (errno == EAGAIN || errno == EWOULDBLOCK) { - // wait for fd - o->wait_events |= BREACTOR_READ; - BReactor_SetFileDescriptorEvents(o->reactor, &o->bfd, o->wait_events); - return; - } - - BLog(BLOG_ERROR, "recv failed"); - report_error(o); - return; - } - - ASSERT(bytes >= 0) - ASSERT(bytes <= o->recv.mtu) - - // read returned address - sysaddr.len = msg.msg_namelen; - addr_sys_to_socket(&o->recv.remote_addr, sysaddr); - - // read returned local address - BIPAddr_InitInvalid(&o->recv.local_addr); - for (struct cmsghdr *cmsg = CMSG_FIRSTHDR(&msg); cmsg; cmsg = CMSG_NXTHDR(&msg, cmsg)) { -#ifdef BADVPN_FREEBSD - if (cmsg->cmsg_level == IPPROTO_IP && cmsg->cmsg_type == IP_RECVDSTADDR) { - struct in_addr *addrinfo = (struct in_addr *)CMSG_DATA(cmsg); - BIPAddr_InitIPv4(&o->recv.local_addr, addrinfo->s_addr); - } -#else - if (cmsg->cmsg_level == IPPROTO_IP && cmsg->cmsg_type == IP_PKTINFO) { - struct in_pktinfo *pktinfo = (struct in_pktinfo *)CMSG_DATA(cmsg); - BIPAddr_InitIPv4(&o->recv.local_addr, pktinfo->ipi_addr.s_addr); - } -#endif - else if (cmsg->cmsg_level == IPPROTO_IPV6 && cmsg->cmsg_type == IPV6_PKTINFO) { - struct in6_pktinfo *pktinfo = (struct in6_pktinfo *)CMSG_DATA(cmsg); - BIPAddr_InitIPv6(&o->recv.local_addr, pktinfo->ipi6_addr.s6_addr); - } - } - - // set have addresses - o->recv.have_addrs = 1; - - // set not busy - o->recv.busy = 0; - - // done - PacketRecvInterface_Done(&o->recv.iface, bytes); -} - -static void fd_handler (BDatagram *o, int events) -{ - DebugObject_Access(&o->d_obj); - DebugError_AssertNoError(&o->d_err); - - // clear handled events - o->wait_events &= ~events; - BReactor_SetFileDescriptorEvents(o->reactor, &o->bfd, o->wait_events); - - int have_send = 0; - int have_recv = 0; - - if ((events & BREACTOR_WRITE) || ((events & (BREACTOR_ERROR|BREACTOR_HUP)) && o->send.inited && o->send.busy && o->send.have_addrs)) { - ASSERT(o->send.inited) - ASSERT(o->send.busy) - ASSERT(o->send.have_addrs) - - have_send = 1; - } - - if ((events & BREACTOR_READ) || ((events & (BREACTOR_ERROR|BREACTOR_HUP)) && o->recv.inited && o->recv.busy && o->recv.started)) { - ASSERT(o->recv.inited) - ASSERT(o->recv.busy) - ASSERT(o->recv.started) - - have_recv = 1; - } - - if (have_send) { - if (have_recv) { - BPending_Set(&o->recv.job); - } - - do_send(o); - return; - } - - if (have_recv) { - do_recv(o); - return; - } - - BLog(BLOG_ERROR, "fd error event"); - report_error(o); - return; -} - -static void send_job_handler (BDatagram *o) -{ - DebugObject_Access(&o->d_obj); - DebugError_AssertNoError(&o->d_err); - ASSERT(o->send.inited) - ASSERT(o->send.busy) - ASSERT(o->send.have_addrs) - - do_send(o); - return; -} - -static void recv_job_handler (BDatagram *o) -{ - DebugObject_Access(&o->d_obj); - DebugError_AssertNoError(&o->d_err); - ASSERT(o->recv.inited) - ASSERT(o->recv.busy) - ASSERT(o->recv.started) - - do_recv(o); - return; -} - -static void send_if_handler_send (BDatagram *o, uint8_t *data, int data_len) -{ - DebugObject_Access(&o->d_obj); - DebugError_AssertNoError(&o->d_err); - ASSERT(o->send.inited) - ASSERT(!o->send.busy) - ASSERT(data_len >= 0) - ASSERT(data_len <= o->send.mtu) - - // remember data - o->send.busy_data = data; - o->send.busy_data_len = data_len; - - // set busy - o->send.busy = 1; - - // if have no addresses, wait - if (!o->send.have_addrs) { - return; - } - - // set job - BPending_Set(&o->send.job); -} - -static void recv_if_handler_recv (BDatagram *o, uint8_t *data) -{ - DebugObject_Access(&o->d_obj); - DebugError_AssertNoError(&o->d_err); - ASSERT(o->recv.inited) - ASSERT(!o->recv.busy) - - // remember data - o->recv.busy_data = data; - - // set busy - o->recv.busy = 1; - - // if recv not started yet, wait - if (!o->recv.started) { - return; - } - - // set job - BPending_Set(&o->recv.job); -} - -int BDatagram_AddressFamilySupported (int family) -{ - switch (family) { - case BADDR_TYPE_IPV4: - case BADDR_TYPE_IPV6: -#ifdef BADVPN_LINUX - case BADDR_TYPE_PACKET: -#endif - return 1; - } - - return 0; -} - -int BDatagram_Init (BDatagram *o, int family, BReactor *reactor, void *user, - BDatagram_handler handler) -{ - ASSERT(BDatagram_AddressFamilySupported(family)) - ASSERT(handler) - BNetwork_Assert(); - - // init arguments - o->reactor = reactor; - o->user = user; - o->handler = handler; - - // init fd - if ((o->fd = socket(family_socket_to_sys(family), SOCK_DGRAM, 0)) < 0) { - BLog(BLOG_ERROR, "socket failed"); - goto fail0; - } - - // set fd non-blocking - if (!badvpn_set_nonblocking(o->fd)) { - BLog(BLOG_ERROR, "badvpn_set_nonblocking failed"); - goto fail1; - } - - // enable receiving pktinfo - set_pktinfo(o->fd, family); - - // init BFileDescriptor - BFileDescriptor_Init(&o->bfd, o->fd, (BFileDescriptor_handler)fd_handler, o); - if (!BReactor_AddFileDescriptor(o->reactor, &o->bfd)) { - BLog(BLOG_ERROR, "BReactor_AddFileDescriptor failed"); - goto fail1; - } - - // set no wait events - o->wait_events = 0; - - // init limits - BReactorLimit_Init(&o->send.limit, o->reactor, BDATAGRAM_SEND_LIMIT); - BReactorLimit_Init(&o->recv.limit, o->reactor, BDATAGRAM_RECV_LIMIT); - - // set have no send and recv addresses - o->send.have_addrs = 0; - o->recv.have_addrs = 0; - - // set recv not started - o->recv.started = 0; - - // set send and recv not inited - o->send.inited = 0; - o->recv.inited = 0; - - DebugError_Init(&o->d_err, BReactor_PendingGroup(o->reactor)); - DebugObject_Init(&o->d_obj); - return 1; - -fail1: - if (close(o->fd) < 0) { - BLog(BLOG_ERROR, "close failed"); - } -fail0: - return 0; -} - -void BDatagram_Free (BDatagram *o) -{ - DebugObject_Free(&o->d_obj); - DebugError_Free(&o->d_err); - ASSERT(!o->recv.inited) - ASSERT(!o->send.inited) - - // free limits - BReactorLimit_Free(&o->recv.limit); - BReactorLimit_Free(&o->send.limit); - - // free BFileDescriptor - BReactor_RemoveFileDescriptor(o->reactor, &o->bfd); - - // free fd - if (close(o->fd) < 0) { - BLog(BLOG_ERROR, "close failed"); - } -} - -int BDatagram_Bind (BDatagram *o, BAddr addr) -{ - DebugObject_Access(&o->d_obj); - DebugError_AssertNoError(&o->d_err); - ASSERT(BDatagram_AddressFamilySupported(addr.type)) - - // translate address - struct sys_addr sysaddr; - addr_socket_to_sys(&sysaddr, addr); - - // bind - if (bind(o->fd, &sysaddr.addr.generic, sysaddr.len) < 0) { - BLog(BLOG_ERROR, "bind failed"); - return 0; - } - - // if recv wasn't started yet, start it - if (!o->recv.started) { - // set recv started - o->recv.started = 1; - - // continue receiving - if (o->recv.inited && o->recv.busy) { - BPending_Set(&o->recv.job); - } - } - - return 1; -} - -void BDatagram_SetSendAddrs (BDatagram *o, BAddr remote_addr, BIPAddr local_addr) -{ - DebugObject_Access(&o->d_obj); - DebugError_AssertNoError(&o->d_err); - ASSERT(BDatagram_AddressFamilySupported(remote_addr.type)) - ASSERT(local_addr.type == BADDR_TYPE_NONE || BDatagram_AddressFamilySupported(local_addr.type)) - - // set addresses - o->send.remote_addr = remote_addr; - o->send.local_addr = local_addr; - - if (!o->send.have_addrs) { - // set have addresses - o->send.have_addrs = 1; - - // start sending - if (o->send.inited && o->send.busy) { - BPending_Set(&o->send.job); - } - } -} - -int BDatagram_GetLastReceiveAddrs (BDatagram *o, BAddr *remote_addr, BIPAddr *local_addr) -{ - DebugObject_Access(&o->d_obj); - - if (!o->recv.have_addrs) { - return 0; - } - - *remote_addr = o->recv.remote_addr; - *local_addr = o->recv.local_addr; - return 1; -} - -int BDatagram_GetFd (BDatagram *o) -{ - DebugObject_Access(&o->d_obj); - - return o->fd; -} - -int BDatagram_SetReuseAddr (BDatagram *o, int reuse) -{ - DebugObject_Access(&o->d_obj); - ASSERT(reuse == 0 || reuse == 1) - - if (setsockopt(o->fd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse)) < 0) { - return 0; - } - - return 1; -} - -void BDatagram_SendAsync_Init (BDatagram *o, int mtu) -{ - DebugObject_Access(&o->d_obj); - DebugError_AssertNoError(&o->d_err); - ASSERT(!o->send.inited) - ASSERT(mtu >= 0) - - // init arguments - o->send.mtu = mtu; - - // init interface - PacketPassInterface_Init(&o->send.iface, o->send.mtu, (PacketPassInterface_handler_send)send_if_handler_send, o, BReactor_PendingGroup(o->reactor)); - - // init job - BPending_Init(&o->send.job, BReactor_PendingGroup(o->reactor), (BPending_handler)send_job_handler, o); - - // set not busy - o->send.busy = 0; - - // set inited - o->send.inited = 1; -} - -void BDatagram_SendAsync_Free (BDatagram *o) -{ - DebugObject_Access(&o->d_obj); - ASSERT(o->send.inited) - - // update events - o->wait_events &= ~BREACTOR_WRITE; - BReactor_SetFileDescriptorEvents(o->reactor, &o->bfd, o->wait_events); - - // free job - BPending_Free(&o->send.job); - - // free interface - PacketPassInterface_Free(&o->send.iface); - - // set not inited - o->send.inited = 0; -} - -PacketPassInterface * BDatagram_SendAsync_GetIf (BDatagram *o) -{ - DebugObject_Access(&o->d_obj); - ASSERT(o->send.inited) - - return &o->send.iface; -} - -void BDatagram_RecvAsync_Init (BDatagram *o, int mtu) -{ - DebugObject_Access(&o->d_obj); - DebugError_AssertNoError(&o->d_err); - ASSERT(!o->recv.inited) - ASSERT(mtu >= 0) - - // init arguments - o->recv.mtu = mtu; - - // init interface - PacketRecvInterface_Init(&o->recv.iface, o->recv.mtu, (PacketRecvInterface_handler_recv)recv_if_handler_recv, o, BReactor_PendingGroup(o->reactor)); - - // init job - BPending_Init(&o->recv.job, BReactor_PendingGroup(o->reactor), (BPending_handler)recv_job_handler, o); - - // set not busy - o->recv.busy = 0; - - // set inited - o->recv.inited = 1; -} - -void BDatagram_RecvAsync_Free (BDatagram *o) -{ - DebugObject_Access(&o->d_obj); - ASSERT(o->recv.inited) - - // update events - o->wait_events &= ~BREACTOR_READ; - BReactor_SetFileDescriptorEvents(o->reactor, &o->bfd, o->wait_events); - - // free job - BPending_Free(&o->recv.job); - - // free interface - PacketRecvInterface_Free(&o->recv.iface); - - // set not inited - o->recv.inited = 0; -} - -PacketRecvInterface * BDatagram_RecvAsync_GetIf (BDatagram *o) -{ - DebugObject_Access(&o->d_obj); - ASSERT(o->recv.inited) - - return &o->recv.iface; -} diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/system/BDatagram_unix.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/system/BDatagram_unix.h deleted file mode 100644 index ffc5a529..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/system/BDatagram_unix.h +++ /dev/null @@ -1,71 +0,0 @@ -/** - * @file BDatagram_unix.h - * @author Ambroz Bizjak - * - * @section LICENSE - * - * 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 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE 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. - */ - -#include "misc/debugerror.h" -#include "base/DebugObject.h" - -#define BDATAGRAM_SEND_LIMIT 2 -#define BDATAGRAM_RECV_LIMIT 2 - -struct BDatagram_s { - BReactor *reactor; - void *user; - BDatagram_handler handler; - int fd; - BFileDescriptor bfd; - int wait_events; - struct { - BReactorLimit limit; - int have_addrs; - BAddr remote_addr; - BIPAddr local_addr; - int inited; - int mtu; - PacketPassInterface iface; - BPending job; - int busy; - const uint8_t *busy_data; - int busy_data_len; - } send; - struct { - BReactorLimit limit; - int started; - int have_addrs; - BAddr remote_addr; - BIPAddr local_addr; - int inited; - int mtu; - PacketRecvInterface iface; - BPending job; - int busy; - uint8_t *busy_data; - } recv; - DebugError d_err; - DebugObject d_obj; -}; diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/system/BNetwork.c b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/system/BNetwork.c deleted file mode 100644 index 82fb266b..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/system/BNetwork.c +++ /dev/null @@ -1,99 +0,0 @@ -/** - * @file BNetwork.c - * @author Ambroz Bizjak - * - * @section LICENSE - * - * 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 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE 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. - */ - -#ifdef BADVPN_USE_WINAPI -#include -#include -#include -#else -#include -#include -#endif - -#include "misc/debug.h" -#include "base/BLog.h" - -#include "system/BNetwork.h" - -#include "generated/blog_channel_BNetwork.h" - -extern int bnetwork_initialized; - -#ifndef BADVPN_PLUGIN -int bnetwork_initialized = 0; -#endif - -int BNetwork_GlobalInit (void) -{ - ASSERT(!bnetwork_initialized) - -#ifdef BADVPN_USE_WINAPI - - WORD requested = MAKEWORD(2, 2); - WSADATA wsadata; - if (WSAStartup(requested, &wsadata) != 0) { - BLog(BLOG_ERROR, "WSAStartup failed"); - goto fail0; - } - if (wsadata.wVersion != requested) { - BLog(BLOG_ERROR, "WSAStartup returned wrong version"); - goto fail1; - } - -#else - - struct sigaction act; - memset(&act, 0, sizeof(act)); - act.sa_handler = SIG_IGN; - sigemptyset(&act.sa_mask); - act.sa_flags = 0; - if (sigaction(SIGPIPE, &act, NULL) < 0) { - BLog(BLOG_ERROR, "sigaction failed"); - goto fail0; - } - -#endif - - bnetwork_initialized = 1; - - return 1; - -#ifdef BADVPN_USE_WINAPI -fail1: - WSACleanup(); -#endif - -fail0: - return 0; -} - -void BNetwork_Assert (void) -{ - ASSERT(bnetwork_initialized) -} diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/system/BNetwork.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/system/BNetwork.h deleted file mode 100644 index 0db1744c..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/system/BNetwork.h +++ /dev/null @@ -1,36 +0,0 @@ -/** - * @file BNetwork.h - * @author Ambroz Bizjak - * - * @section LICENSE - * - * 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 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE 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. - */ - -#ifndef BADVPN_SYSTEM_BNETWORK_H -#define BADVPN_SYSTEM_BNETWORK_H - -int BNetwork_GlobalInit (void); -void BNetwork_Assert (void); - -#endif diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/system/BReactor.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/system/BReactor.h deleted file mode 100644 index 4c0fa5be..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/system/BReactor.h +++ /dev/null @@ -1,11 +0,0 @@ -#if defined(BADVPN_BREACTOR_BADVPN) + defined(BADVPN_BREACTOR_GLIB) + defined(BADVPN_BREACTOR_EMSCRIPTEN) != 1 -#error No reactor backend or too many reactor backens -#endif - -#if defined(BADVPN_BREACTOR_BADVPN) -#include "BReactor_badvpn.h" -#elif defined(BADVPN_BREACTOR_GLIB) -#include "BReactor_glib.h" -#elif defined(BADVPN_BREACTOR_EMSCRIPTEN) -#include "BReactor_emscripten.h" -#endif diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/system/BReactor_badvpn.c b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/system/BReactor_badvpn.c deleted file mode 100644 index 29e96ebd..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/system/BReactor_badvpn.c +++ /dev/null @@ -1,1430 +0,0 @@ -/** - * @file BReactor_badvpn.c - * @author Ambroz Bizjak - * - * @section LICENSE - * - * 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 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE 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. - */ - -#include -#include -#include -#include - -#ifdef BADVPN_USE_WINAPI -#include -#else -#include -#include -#include -#include -#endif - -#include "misc/debug.h" -#include "misc/offset.h" -#include "misc/balloc.h" -#include "misc/compare.h" -#include "base/BLog.h" - -#include "system/BReactor.h" - -#include "generated/blog_channel_BReactor.h" - -#define KEVENT_TAG_FD 1 -#define KEVENT_TAG_KEVENT 2 - -#define TIMER_STATE_INACTIVE 1 -#define TIMER_STATE_RUNNING 2 -#define TIMER_STATE_EXPIRED 3 - -static int compare_timers (BSmallTimer *t1, BSmallTimer *t2) -{ - int cmp = B_COMPARE(t1->absTime, t2->absTime); - if (cmp) { - return cmp; - } - - return B_COMPARE((uintptr_t)t1, (uintptr_t)t2); -} - -#include "BReactor_badvpn_timerstree.h" -#include "structure/CAvl_impl.h" - -static void assert_timer (BSmallTimer *bt) -{ - ASSERT(bt->state == TIMER_STATE_INACTIVE || bt->state == TIMER_STATE_RUNNING || - bt->state == TIMER_STATE_EXPIRED) -} - -static int move_expired_timers (BReactor *bsys, btime_t now) -{ - int moved = 0; - - // move timed out timers to the expired list - BReactor__TimersTreeRef ref; - BSmallTimer *timer; - while (timer = (ref = BReactor__TimersTree_GetFirst(&bsys->timers_tree, 0)).link) { - ASSERT(timer->state == TIMER_STATE_RUNNING) - - // if it's in the future, stop - if (timer->absTime > now) { - break; - } - moved = 1; - - // remove from running timers tree - BReactor__TimersTree_Remove(&bsys->timers_tree, 0, ref); - - // add to expired timers list - LinkedList1_Append(&bsys->timers_expired_list, &timer->u.list_node); - - // set expired - timer->state = TIMER_STATE_EXPIRED; - } - - return moved; -} - -static void move_first_timers (BReactor *bsys) -{ - BReactor__TimersTreeRef ref; - - // get the time of the first timer - BSmallTimer *first_timer = (ref = BReactor__TimersTree_GetFirst(&bsys->timers_tree, 0)).link; - ASSERT(first_timer) - ASSERT(first_timer->state == TIMER_STATE_RUNNING) - btime_t first_time = first_timer->absTime; - - // remove from running timers tree - BReactor__TimersTree_Remove(&bsys->timers_tree, 0, ref); - - // add to expired timers list - LinkedList1_Append(&bsys->timers_expired_list, &first_timer->u.list_node); - - // set expired - first_timer->state = TIMER_STATE_EXPIRED; - - // also move other timers with the same timeout - BSmallTimer *timer; - while (timer = (ref = BReactor__TimersTree_GetFirst(&bsys->timers_tree, 0)).link) { - ASSERT(timer->state == TIMER_STATE_RUNNING) - ASSERT(timer->absTime >= first_time) - - // if it's in the future, stop - if (timer->absTime > first_time) { - break; - } - - // remove from running timers tree - BReactor__TimersTree_Remove(&bsys->timers_tree, 0, ref); - - // add to expired timers list - LinkedList1_Append(&bsys->timers_expired_list, &timer->u.list_node); - - // set expired - timer->state = TIMER_STATE_EXPIRED; - } -} - -#ifdef BADVPN_USE_WINAPI - -static void set_iocp_ready (BReactorIOCPOverlapped *olap, int succeeded, DWORD bytes) -{ - BReactor *reactor = olap->reactor; - ASSERT(!olap->is_ready) - - // set parameters - olap->ready_succeeded = succeeded; - olap->ready_bytes = bytes; - - // insert to IOCP ready list - LinkedList1_Append(&reactor->iocp_ready_list, &olap->ready_list_node); - - // set ready - olap->is_ready = 1; -} - -#endif - -#ifdef BADVPN_USE_EPOLL - -static void set_epoll_fd_pointers (BReactor *bsys) -{ - // Write pointers to our entry pointers into file descriptors. - // If a handler function frees some other file descriptor, the - // free routine will set our pointer to NULL so we don't dispatch it. - for (int i = 0; i < bsys->epoll_results_num; i++) { - struct epoll_event *event = &bsys->epoll_results[i]; - ASSERT(event->data.ptr) - BFileDescriptor *bfd = (BFileDescriptor *)event->data.ptr; - ASSERT(bfd->active) - ASSERT(!bfd->epoll_returned_ptr) - bfd->epoll_returned_ptr = (BFileDescriptor **)&event->data.ptr; - } -} - -#endif - -#ifdef BADVPN_USE_KEVENT - -static void set_kevent_fd_pointers (BReactor *bsys) -{ - for (int i = 0; i < bsys->kevent_results_num; i++) { - struct kevent *event = &bsys->kevent_results[i]; - ASSERT(event->udata) - int *tag = event->udata; - switch (*tag) { - case KEVENT_TAG_FD: { - BFileDescriptor *bfd = UPPER_OBJECT(tag, BFileDescriptor, kevent_tag); - ASSERT(bfd->active) - ASSERT(!bfd->kevent_returned_ptr) - bfd->kevent_returned_ptr = (int **)&event->udata; - } break; - - case KEVENT_TAG_KEVENT: { - BReactorKEvent *kev = UPPER_OBJECT(tag, BReactorKEvent, kevent_tag); - ASSERT(kev->reactor == bsys) - ASSERT(!kev->kevent_returned_ptr) - kev->kevent_returned_ptr = (int **)&event->udata; - } break; - - default: - ASSERT(0); - } - } -} - -static void update_kevent_fd_events (BReactor *bsys, BFileDescriptor *bs, int events) -{ - struct kevent event; - - if (!(bs->waitEvents & BREACTOR_READ) && (events & BREACTOR_READ)) { - memset(&event, 0, sizeof(event)); - event.ident = bs->fd; - event.filter = EVFILT_READ; - event.flags = EV_ADD; - event.udata = &bs->kevent_tag; - ASSERT_FORCE(kevent(bsys->kqueue_fd, &event, 1, NULL, 0, NULL) == 0) - } - else if ((bs->waitEvents & BREACTOR_READ) && !(events & BREACTOR_READ)) { - memset(&event, 0, sizeof(event)); - event.ident = bs->fd; - event.filter = EVFILT_READ; - event.flags = EV_DELETE; - ASSERT_FORCE(kevent(bsys->kqueue_fd, &event, 1, NULL, 0, NULL) == 0) - } - - if (!(bs->waitEvents & BREACTOR_WRITE) && (events & BREACTOR_WRITE)) { - memset(&event, 0, sizeof(event)); - event.ident = bs->fd; - event.filter = EVFILT_WRITE; - event.flags = EV_ADD; - event.udata = &bs->kevent_tag; - ASSERT_FORCE(kevent(bsys->kqueue_fd, &event, 1, NULL, 0, NULL) == 0) - } - else if ((bs->waitEvents & BREACTOR_WRITE) && !(events & BREACTOR_WRITE)) { - memset(&event, 0, sizeof(event)); - event.ident = bs->fd; - event.filter = EVFILT_WRITE; - event.flags = EV_DELETE; - ASSERT_FORCE(kevent(bsys->kqueue_fd, &event, 1, NULL, 0, NULL) == 0) - } -} - -#endif - -#ifdef BADVPN_USE_POLL - -static void set_poll_fd_pointers (BReactor *bsys) -{ - for (int i = 0; i < bsys->poll_results_num; i++) { - BFileDescriptor *bfd = bsys->poll_results_bfds[i]; - ASSERT(bfd) - ASSERT(bfd->active) - ASSERT(bfd->poll_returned_index == -1) - bfd->poll_returned_index = i; - } -} - -#endif - -static void wait_for_events (BReactor *bsys) -{ - // must have processed all pending events - ASSERT(!BPendingGroup_HasJobs(&bsys->pending_jobs)) - ASSERT(LinkedList1_IsEmpty(&bsys->timers_expired_list)) - #ifdef BADVPN_USE_WINAPI - ASSERT(LinkedList1_IsEmpty(&bsys->iocp_ready_list)) - #endif - #ifdef BADVPN_USE_EPOLL - ASSERT(bsys->epoll_results_pos == bsys->epoll_results_num) - #endif - #ifdef BADVPN_USE_KEVENT - ASSERT(bsys->kevent_results_pos == bsys->kevent_results_num) - #endif - #ifdef BADVPN_USE_POLL - ASSERT(bsys->poll_results_pos == bsys->poll_results_num) - #endif - - // clean up epoll results - #ifdef BADVPN_USE_EPOLL - bsys->epoll_results_num = 0; - bsys->epoll_results_pos = 0; - #endif - - // clean up kevent results - #ifdef BADVPN_USE_KEVENT - bsys->kevent_results_num = 0; - bsys->kevent_results_pos = 0; - #endif - - // clean up poll results - #ifdef BADVPN_USE_POLL - bsys->poll_results_num = 0; - bsys->poll_results_pos = 0; - #endif - - // timeout vars - int have_timeout = 0; - btime_t timeout_abs; - btime_t now = 0; // to remove warning - - // compute timeout - BSmallTimer *first_timer = BReactor__TimersTree_GetFirst(&bsys->timers_tree, 0).link; - if (first_timer) { - ASSERT(first_timer->state == TIMER_STATE_RUNNING) - - // get current time - now = btime_gettime(); - - // if some timers have already timed out, return them immediately - if (move_expired_timers(bsys, now)) { - BLog(BLOG_DEBUG, "Got already expired timers"); - return; - } - - // timeout is first timer, remember absolute time - have_timeout = 1; - timeout_abs = first_timer->absTime; - } - - // wait until the timeout is reached or the file descriptor / handle in ready - while (1) { - // compute timeout - btime_t timeout_rel = 0; // to remove warning - btime_t timeout_rel_trunc = 0; // to remove warning - if (have_timeout) { - timeout_rel = timeout_abs - now; - timeout_rel_trunc = timeout_rel; - } - - // perform wait - - #ifdef BADVPN_USE_WINAPI - - if (have_timeout) { - if (timeout_rel_trunc > INFINITE - 1) { - timeout_rel_trunc = INFINITE - 1; - } - } - - DWORD bytes = 0; - ULONG_PTR key; - BReactorIOCPOverlapped *olap = NULL; - BOOL res = GetQueuedCompletionStatus(bsys->iocp_handle, &bytes, &key, (OVERLAPPED **)&olap, (have_timeout ? timeout_rel_trunc : INFINITE)); - - ASSERT_FORCE(olap || have_timeout) - - if (olap || timeout_rel_trunc == timeout_rel) { - if (olap) { - BLog(BLOG_DEBUG, "GetQueuedCompletionStatus returned event"); - - DebugObject_Access(&olap->d_obj); - ASSERT(olap->reactor == bsys) - ASSERT(!olap->is_ready) - - set_iocp_ready(olap, (res == TRUE), bytes); - } else { - BLog(BLOG_DEBUG, "GetQueuedCompletionStatus timed out"); - move_first_timers(bsys); - } - break; - } - - #endif - - #ifdef BADVPN_USE_EPOLL - - if (have_timeout) { - if (timeout_rel_trunc > INT_MAX) { - timeout_rel_trunc = INT_MAX; - } - } - - BLog(BLOG_DEBUG, "Calling epoll_wait"); - - int waitres = epoll_wait(bsys->efd, bsys->epoll_results, BSYSTEM_MAX_RESULTS, (have_timeout ? timeout_rel_trunc : -1)); - if (waitres < 0) { - int error = errno; - if (error == EINTR) { - BLog(BLOG_DEBUG, "epoll_wait interrupted"); - goto try_again; - } - perror("epoll_wait"); - ASSERT_FORCE(0) - } - - ASSERT_FORCE(!(waitres == 0) || have_timeout) - ASSERT_FORCE(waitres <= BSYSTEM_MAX_RESULTS) - - if (waitres != 0 || timeout_rel_trunc == timeout_rel) { - if (waitres != 0) { - BLog(BLOG_DEBUG, "epoll_wait returned %d file descriptors", waitres); - bsys->epoll_results_num = waitres; - set_epoll_fd_pointers(bsys); - } else { - BLog(BLOG_DEBUG, "epoll_wait timed out"); - move_first_timers(bsys); - } - break; - } - - #endif - - #ifdef BADVPN_USE_KEVENT - - struct timespec ts; - if (have_timeout) { - if (timeout_rel_trunc > 86400000) { - timeout_rel_trunc = 86400000; - } - ts.tv_sec = timeout_rel_trunc / 1000; - ts.tv_nsec = (timeout_rel_trunc % 1000) * 1000000; - } - -// BLog(BLOG_DEBUG, "Calling kevent"); - - int waitres = kevent(bsys->kqueue_fd, NULL, 0, bsys->kevent_results, BSYSTEM_MAX_RESULTS, (have_timeout ? &ts : NULL)); - if (waitres < 0) { - int error = errno; - if (error == EINTR) { - BLog(BLOG_DEBUG, "kevent interrupted"); - goto try_again; - } - perror("kevent"); - ASSERT_FORCE(0) - } - - ASSERT_FORCE(!(waitres == 0) || have_timeout) - ASSERT_FORCE(waitres <= BSYSTEM_MAX_RESULTS) - - if (waitres != 0 || timeout_rel_trunc == timeout_rel) { - if (waitres != 0) { -// BLog(BLOG_DEBUG, "kevent returned %d events", waitres); - bsys->kevent_results_num = waitres; - set_kevent_fd_pointers(bsys); - } else { -// BLog(BLOG_DEBUG, "kevent timed out"); - move_first_timers(bsys); - } - break; - } - - #endif - - #ifdef BADVPN_USE_POLL - - if (have_timeout) { - if (timeout_rel_trunc > INT_MAX) { - timeout_rel_trunc = INT_MAX; - } - } - - ASSERT(bsys->poll_num_enabled_fds >= 0) - ASSERT(bsys->poll_num_enabled_fds <= BSYSTEM_MAX_POLL_FDS) - int num_fds = 0; - - LinkedList1Node *list_node = LinkedList1_GetFirst(&bsys->poll_enabled_fds_list); - while (list_node) { - BFileDescriptor *bfd = UPPER_OBJECT(list_node, BFileDescriptor, poll_enabled_fds_list_node); - ASSERT(bfd->active) - ASSERT(bfd->poll_returned_index == -1) - - // calculate poll events - int pevents = 0; - if ((bfd->waitEvents & BREACTOR_READ)) { - pevents |= POLLIN; - } - if ((bfd->waitEvents & BREACTOR_WRITE)) { - pevents |= POLLOUT; - } - - // write pollfd entry - struct pollfd *pfd = &bsys->poll_results_pollfds[num_fds]; - pfd->fd = bfd->fd; - pfd->events = pevents; - pfd->revents = 0; - - // write BFileDescriptor reference entry - bsys->poll_results_bfds[num_fds] = bfd; - - // increment number of fds in array - num_fds++; - - list_node = LinkedList1Node_Next(list_node); - } - - BLog(BLOG_DEBUG, "Calling poll"); - - int waitres = poll(bsys->poll_results_pollfds, num_fds, (have_timeout ? timeout_rel_trunc : -1)); - if (waitres < 0) { - int error = errno; - if (error == EINTR) { - BLog(BLOG_DEBUG, "poll interrupted"); - goto try_again; - } - perror("poll"); - ASSERT_FORCE(0) - } - - ASSERT_FORCE(!(waitres == 0) || have_timeout) - - if (waitres != 0 || timeout_rel_trunc == timeout_rel) { - if (waitres != 0) { - BLog(BLOG_DEBUG, "poll returned %d file descriptors", waitres); - bsys->poll_results_num = num_fds; - bsys->poll_results_pos = 0; - set_poll_fd_pointers(bsys); - } else { - BLog(BLOG_DEBUG, "poll timed out"); - move_first_timers(bsys); - } - break; - } - - #endif - - try_again: - if (have_timeout) { - // get current time - now = btime_gettime(); - // check if we already reached the time we're waiting for - if (now >= timeout_abs) { - BLog(BLOG_DEBUG, "already timed out while trying again"); - move_first_timers(bsys); - break; - } - } - } - - // reset limit objects - LinkedList1Node *list_node; - while (list_node = LinkedList1_GetFirst(&bsys->active_limits_list)) { - BReactorLimit *limit = UPPER_OBJECT(list_node, BReactorLimit, active_limits_list_node); - ASSERT(limit->count > 0) - limit->count = 0; - LinkedList1_Remove(&bsys->active_limits_list, &limit->active_limits_list_node); - } -} - -#ifndef BADVPN_USE_WINAPI - -void BFileDescriptor_Init (BFileDescriptor *bs, int fd, BFileDescriptor_handler handler, void *user) -{ - bs->fd = fd; - bs->handler = handler; - bs->user = user; - bs->active = 0; -} - -#endif - -void BSmallTimer_Init (BSmallTimer *bt, BSmallTimer_handler handler) -{ - bt->handler.smalll = handler; - bt->state = TIMER_STATE_INACTIVE; - bt->is_small = 1; -} - -int BSmallTimer_IsRunning (BSmallTimer *bt) -{ - assert_timer(bt); - - return (bt->state != TIMER_STATE_INACTIVE); -} - -void BTimer_Init (BTimer *bt, btime_t msTime, BTimer_handler handler, void *user) -{ - bt->base.handler.heavy = handler; - bt->base.state = TIMER_STATE_INACTIVE; - bt->base.is_small = 0; - bt->user = user; - bt->msTime = msTime; -} - -int BTimer_IsRunning (BTimer *bt) -{ - return BSmallTimer_IsRunning(&bt->base); -} - -int BReactor_Init (BReactor *bsys) -{ - BLog(BLOG_DEBUG, "Reactor initializing"); - - // set not exiting - bsys->exiting = 0; - - // init jobs - BPendingGroup_Init(&bsys->pending_jobs); - - // init timers - BReactor__TimersTree_Init(&bsys->timers_tree); - LinkedList1_Init(&bsys->timers_expired_list); - - // init limits - LinkedList1_Init(&bsys->active_limits_list); - - #ifdef BADVPN_USE_WINAPI - - // init IOCP list - LinkedList1_Init(&bsys->iocp_list); - - // init IOCP handle - if (!(bsys->iocp_handle = CreateIoCompletionPort(INVALID_HANDLE_VALUE, NULL, 0, 1))) { - BLog(BLOG_ERROR, "CreateIoCompletionPort failed"); - goto fail0; - } - - // init IOCP ready list - LinkedList1_Init(&bsys->iocp_ready_list); - - #endif - - #ifdef BADVPN_USE_EPOLL - - // create epoll fd - if ((bsys->efd = epoll_create(10)) < 0) { - BLog(BLOG_ERROR, "epoll_create failed"); - goto fail0; - } - - // init results array - bsys->epoll_results_num = 0; - bsys->epoll_results_pos = 0; - - #endif - - #ifdef BADVPN_USE_KEVENT - - // create kqueue fd - if ((bsys->kqueue_fd = kqueue()) < 0) { - BLog(BLOG_ERROR, "kqueue failed"); - goto fail0; - } - - // init results array - bsys->kevent_results_num = 0; - bsys->kevent_results_pos = 0; - - #endif - - #ifdef BADVPN_USE_POLL - - // init enabled fds list - LinkedList1_Init(&bsys->poll_enabled_fds_list); - - // set zero enabled fds - bsys->poll_num_enabled_fds = 0; - - // allocate results arrays - if (!(bsys->poll_results_pollfds = BAllocArray(BSYSTEM_MAX_POLL_FDS, sizeof(bsys->poll_results_pollfds[0])))) { - BLog(BLOG_ERROR, "BAllocArray failed"); - goto fail0; - } - if (!(bsys->poll_results_bfds = BAllocArray(BSYSTEM_MAX_POLL_FDS, sizeof(bsys->poll_results_bfds[0])))) { - BLog(BLOG_ERROR, "BAllocArray failed"); - goto fail1; - } - - // init results array - bsys->poll_results_num = 0; - bsys->poll_results_pos = 0; - - #endif - - DebugObject_Init(&bsys->d_obj); - #ifndef BADVPN_USE_WINAPI - DebugCounter_Init(&bsys->d_fds_counter); - #endif - #ifdef BADVPN_USE_KEVENT - DebugCounter_Init(&bsys->d_kevent_ctr); - #endif - DebugCounter_Init(&bsys->d_limits_ctr); - - return 1; - - #ifdef BADVPN_USE_POLL -fail1: - BFree(bsys->poll_results_pollfds); - #endif -fail0: - BPendingGroup_Free(&bsys->pending_jobs); - BLog(BLOG_ERROR, "Reactor failed to initialize"); - return 0; -} - -void BReactor_Free (BReactor *bsys) -{ - DebugObject_Access(&bsys->d_obj); - - #ifdef BADVPN_USE_WINAPI - while (!LinkedList1_IsEmpty(&bsys->iocp_list)) { - BReactorIOCPOverlapped *olap = UPPER_OBJECT(LinkedList1_GetLast(&bsys->iocp_list), BReactorIOCPOverlapped, iocp_list_node); - ASSERT(olap->reactor == bsys) - olap->handler(olap->user, BREACTOR_IOCP_EVENT_EXITING, 0); - } - #endif - - // {pending group has no BPending objects} - ASSERT(!BPendingGroup_HasJobs(&bsys->pending_jobs)) - ASSERT(BReactor__TimersTree_IsEmpty(&bsys->timers_tree)) - ASSERT(LinkedList1_IsEmpty(&bsys->timers_expired_list)) - ASSERT(LinkedList1_IsEmpty(&bsys->active_limits_list)) - DebugObject_Free(&bsys->d_obj); - #ifdef BADVPN_USE_WINAPI - ASSERT(LinkedList1_IsEmpty(&bsys->iocp_ready_list)) - ASSERT(LinkedList1_IsEmpty(&bsys->iocp_list)) - #endif - #ifndef BADVPN_USE_WINAPI - DebugCounter_Free(&bsys->d_fds_counter); - #endif - #ifdef BADVPN_USE_KEVENT - DebugCounter_Free(&bsys->d_kevent_ctr); - #endif - DebugCounter_Free(&bsys->d_limits_ctr); - #ifdef BADVPN_USE_POLL - ASSERT(bsys->poll_num_enabled_fds == 0) - ASSERT(LinkedList1_IsEmpty(&bsys->poll_enabled_fds_list)) - #endif - - BLog(BLOG_DEBUG, "Reactor freeing"); - - #ifdef BADVPN_USE_WINAPI - - // close IOCP handle - ASSERT_FORCE(CloseHandle(bsys->iocp_handle)) - - #endif - - #ifdef BADVPN_USE_EPOLL - - // close epoll fd - ASSERT_FORCE(close(bsys->efd) == 0) - - #endif - - #ifdef BADVPN_USE_KEVENT - - // close kqueue fd - ASSERT_FORCE(close(bsys->kqueue_fd) == 0) - - #endif - - #ifdef BADVPN_USE_POLL - - // free results arrays - BFree(bsys->poll_results_bfds); - BFree(bsys->poll_results_pollfds); - - #endif - - // free jobs - BPendingGroup_Free(&bsys->pending_jobs); -} - -int BReactor_Exec (BReactor *bsys) -{ - BLog(BLOG_DEBUG, "Entering event loop"); - - while (!bsys->exiting) { - // dispatch job - if (BPendingGroup_HasJobs(&bsys->pending_jobs)) { - BPendingGroup_ExecuteJob(&bsys->pending_jobs); - continue; - } - - // dispatch timer - LinkedList1Node *list_node = LinkedList1_GetFirst(&bsys->timers_expired_list); - if (list_node) { - BSmallTimer *timer = UPPER_OBJECT(list_node, BSmallTimer, u.list_node); - ASSERT(timer->state == TIMER_STATE_EXPIRED) - - // remove from expired list - LinkedList1_Remove(&bsys->timers_expired_list, &timer->u.list_node); - - // set inactive - timer->state = TIMER_STATE_INACTIVE; - - // call handler -// BLog(BLOG_DEBUG, "Dispatching timer"); - if (timer->is_small) { - timer->handler.smalll(timer); - } else { - BTimer *btimer = UPPER_OBJECT(timer, BTimer, base); - timer->handler.heavy(btimer->user); - } - continue; - } - - #ifdef BADVPN_USE_WINAPI - - if (!LinkedList1_IsEmpty(&bsys->iocp_ready_list)) { - BReactorIOCPOverlapped *olap = UPPER_OBJECT(LinkedList1_GetFirst(&bsys->iocp_ready_list), BReactorIOCPOverlapped, ready_list_node); - ASSERT(olap->is_ready) - ASSERT(olap->handler) - - // remove from ready list - LinkedList1_Remove(&bsys->iocp_ready_list, &olap->ready_list_node); - - // set not ready - olap->is_ready = 0; - - int event = (olap->ready_succeeded ? BREACTOR_IOCP_EVENT_SUCCEEDED : BREACTOR_IOCP_EVENT_FAILED); - - // call handler - olap->handler(olap->user, event, olap->ready_bytes); - continue; - } - - #endif - - #ifdef BADVPN_USE_EPOLL - - // dispatch file descriptor - if (bsys->epoll_results_pos < bsys->epoll_results_num) { - // grab event - struct epoll_event *event = &bsys->epoll_results[bsys->epoll_results_pos]; - bsys->epoll_results_pos++; - - // check if the BFileDescriptor was removed - if (!event->data.ptr) { - continue; - } - - // get BFileDescriptor - BFileDescriptor *bfd = (BFileDescriptor *)event->data.ptr; - ASSERT(bfd->active) - ASSERT(bfd->epoll_returned_ptr == (BFileDescriptor **)&event->data.ptr) - - // zero pointer to the epoll entry - bfd->epoll_returned_ptr = NULL; - - // calculate events to report - int events = 0; - if ((bfd->waitEvents&BREACTOR_READ) && (event->events&EPOLLIN)) { - events |= BREACTOR_READ; - } - if ((bfd->waitEvents&BREACTOR_WRITE) && (event->events&EPOLLOUT)) { - events |= BREACTOR_WRITE; - } - if ((event->events&EPOLLERR)) { - events |= BREACTOR_ERROR; - } - if ((event->events&EPOLLHUP)) { - events |= BREACTOR_HUP; - } - - if (!events) { - BLog(BLOG_ERROR, "no events detected?"); - continue; - } - - // call handler - BLog(BLOG_DEBUG, "Dispatching file descriptor"); - bfd->handler(bfd->user, events); - continue; - } - - #endif - - #ifdef BADVPN_USE_KEVENT - - // dispatch kevent - if (bsys->kevent_results_pos < bsys->kevent_results_num) { - // grab event - struct kevent *event = &bsys->kevent_results[bsys->kevent_results_pos]; - bsys->kevent_results_pos++; - - // check if the event was removed - if (!event->udata) { - continue; - } - - // check tag - int *tag = event->udata; - switch (*tag) { - case KEVENT_TAG_FD: { - // get BFileDescriptor - BFileDescriptor *bfd = UPPER_OBJECT(tag, BFileDescriptor, kevent_tag); - ASSERT(bfd->active) - ASSERT(bfd->kevent_returned_ptr == (int **)&event->udata) - - // zero pointer to the kevent entry - bfd->kevent_returned_ptr = NULL; - - // calculate event to report - int events = 0; - if ((bfd->waitEvents&BREACTOR_READ) && event->filter == EVFILT_READ) { - events |= BREACTOR_READ; - } - if ((bfd->waitEvents&BREACTOR_WRITE) && event->filter == EVFILT_WRITE) { - events |= BREACTOR_WRITE; - } - - if (!events) { - BLog(BLOG_ERROR, "no events detected?"); - continue; - } - - // call handler -// BLog(BLOG_DEBUG, "Dispatching file descriptor"); - bfd->handler(bfd->user, events); - continue; - } break; - - case KEVENT_TAG_KEVENT: { - // get BReactorKEvent - BReactorKEvent *kev = UPPER_OBJECT(tag, BReactorKEvent, kevent_tag); - ASSERT(kev->reactor == bsys) - ASSERT(kev->kevent_returned_ptr == (int **)&event->udata) - - // zero pointer to the kevent entry - kev->kevent_returned_ptr = NULL; - - // call handler -// BLog(BLOG_DEBUG, "Dispatching kevent"); - kev->handler(kev->user, event->fflags, event->data); - continue; - } break; - - default: - ASSERT(0); - } - } - - #endif - - #ifdef BADVPN_USE_POLL - - if (bsys->poll_results_pos < bsys->poll_results_num) { - // grab event - struct pollfd *pfd = &bsys->poll_results_pollfds[bsys->poll_results_pos]; - BFileDescriptor *bfd = bsys->poll_results_bfds[bsys->poll_results_pos]; - bsys->poll_results_pos++; - - // skip removed entry - if (!bfd) { - continue; - } - - ASSERT(bfd->active) - ASSERT(bfd->poll_returned_index == bsys->poll_results_pos - 1) - - // remove result reference - bfd->poll_returned_index = -1; - - // calculate events to report - int events = 0; - if ((bfd->waitEvents & BREACTOR_READ) && (pfd->revents & POLLIN)) { - events |= BREACTOR_READ; - } - if ((bfd->waitEvents & BREACTOR_WRITE) && (pfd->revents & POLLOUT)) { - events |= BREACTOR_WRITE; - } - if ((pfd->revents & POLLERR) || (pfd->revents & POLLHUP)) { - events |= BREACTOR_ERROR; - } - - if (!events) { - continue; - } - - // call handler - BLog(BLOG_DEBUG, "Dispatching file descriptor"); - bfd->handler(bfd->user, events); - continue; - } - - #endif - - wait_for_events(bsys); - } - - BLog(BLOG_DEBUG, "Exiting event loop, exit code %d", bsys->exit_code); - - return bsys->exit_code; -} - -void BReactor_Quit (BReactor *bsys, int code) -{ - bsys->exiting = 1; - bsys->exit_code = code; -} - -void BReactor_SetSmallTimer (BReactor *bsys, BSmallTimer *bt, int mode, btime_t time) -{ - assert_timer(bt); - ASSERT(mode == BTIMER_SET_ABSOLUTE || mode == BTIMER_SET_RELATIVE) - - // unlink it if it's already in the list - BReactor_RemoveSmallTimer(bsys, bt); - - // if mode is relative, add current time - if (mode == BTIMER_SET_RELATIVE) { - time = btime_add(btime_gettime(), time); - } - - // set time - bt->absTime = time; - - // set running - bt->state = TIMER_STATE_RUNNING; - - // insert to running timers tree - BReactor__TimersTreeRef ref = {bt, bt}; - int res = BReactor__TimersTree_Insert(&bsys->timers_tree, 0, ref, NULL); - ASSERT_EXECUTE(res) -} - -void BReactor_RemoveSmallTimer (BReactor *bsys, BSmallTimer *bt) -{ - assert_timer(bt); - - if (bt->state == TIMER_STATE_INACTIVE) { - return; - } - - if (bt->state == TIMER_STATE_EXPIRED) { - // remove from expired list - LinkedList1_Remove(&bsys->timers_expired_list, &bt->u.list_node); - } else { - // remove from running tree - BReactor__TimersTreeRef ref = {bt, bt}; - BReactor__TimersTree_Remove(&bsys->timers_tree, 0, ref); - } - - // set inactive - bt->state = TIMER_STATE_INACTIVE; -} - -void BReactor_SetTimer (BReactor *bsys, BTimer *bt) -{ - BReactor_SetSmallTimer(bsys, &bt->base, BTIMER_SET_RELATIVE, bt->msTime); -} - -void BReactor_SetTimerAfter (BReactor *bsys, BTimer *bt, btime_t after) -{ - BReactor_SetSmallTimer(bsys, &bt->base, BTIMER_SET_RELATIVE, after); -} - -void BReactor_SetTimerAbsolute (BReactor *bsys, BTimer *bt, btime_t time) -{ - BReactor_SetSmallTimer(bsys, &bt->base, BTIMER_SET_ABSOLUTE, time); -} - -void BReactor_RemoveTimer (BReactor *bsys, BTimer *bt) -{ - return BReactor_RemoveSmallTimer(bsys, &bt->base); -} - -BPendingGroup * BReactor_PendingGroup (BReactor *bsys) -{ - return &bsys->pending_jobs; -} - -int BReactor_Synchronize (BReactor *bsys, BSmallPending *ref) -{ - ASSERT(ref) - - while (!bsys->exiting) { - ASSERT(BPendingGroup_HasJobs(&bsys->pending_jobs)) - - if (BPendingGroup_PeekJob(&bsys->pending_jobs) == ref) { - return 1; - } - - BPendingGroup_ExecuteJob(&bsys->pending_jobs); - } - - return 0; -} - -#ifndef BADVPN_USE_WINAPI - -int BReactor_AddFileDescriptor (BReactor *bsys, BFileDescriptor *bs) -{ - ASSERT(!bs->active) - - #ifdef BADVPN_USE_EPOLL - - // add epoll entry - struct epoll_event event; - memset(&event, 0, sizeof(event)); - event.events = 0; - event.data.ptr = bs; - if (epoll_ctl(bsys->efd, EPOLL_CTL_ADD, bs->fd, &event) < 0) { - int error = errno; - BLog(BLOG_ERROR, "epoll_ctl failed: %d", error); - return 0; - } - - // set epoll returned pointer - bs->epoll_returned_ptr = NULL; - - #endif - - #ifdef BADVPN_USE_KEVENT - - // set kevent tag - bs->kevent_tag = KEVENT_TAG_FD; - - // set kevent returned pointer - bs->kevent_returned_ptr = NULL; - - #endif - - #ifdef BADVPN_USE_POLL - - if (bsys->poll_num_enabled_fds == BSYSTEM_MAX_POLL_FDS) { - BLog(BLOG_ERROR, "too many fds"); - return 0; - } - - // append to enabled fds list - LinkedList1_Append(&bsys->poll_enabled_fds_list, &bs->poll_enabled_fds_list_node); - bsys->poll_num_enabled_fds++; - - // set not returned - bs->poll_returned_index = -1; - - #endif - - bs->active = 1; - bs->waitEvents = 0; - - DebugCounter_Increment(&bsys->d_fds_counter); - return 1; -} - -void BReactor_RemoveFileDescriptor (BReactor *bsys, BFileDescriptor *bs) -{ - ASSERT(bs->active) - DebugCounter_Decrement(&bsys->d_fds_counter); - - bs->active = 0; - - #ifdef BADVPN_USE_EPOLL - - // delete epoll entry - struct epoll_event event; - memset(&event, 0, sizeof(event)); - ASSERT_FORCE(epoll_ctl(bsys->efd, EPOLL_CTL_DEL, bs->fd, &event) == 0) - - // write through epoll returned pointer - if (bs->epoll_returned_ptr) { - *bs->epoll_returned_ptr = NULL; - } - - #endif - - #ifdef BADVPN_USE_KEVENT - - // delete kevents - update_kevent_fd_events(bsys, bs, 0); - - // write through kevent returned pointer - if (bs->kevent_returned_ptr) { - *bs->kevent_returned_ptr = NULL; - } - - #endif - - #ifdef BADVPN_USE_POLL - - // invalidate results entry - if (bs->poll_returned_index != -1) { - ASSERT(bs->poll_returned_index >= bsys->poll_results_pos) - ASSERT(bs->poll_returned_index < bsys->poll_results_num) - ASSERT(bsys->poll_results_bfds[bs->poll_returned_index] == bs) - - bsys->poll_results_bfds[bs->poll_returned_index] = NULL; - } - - // remove from enabled fds list - LinkedList1_Remove(&bsys->poll_enabled_fds_list, &bs->poll_enabled_fds_list_node); - bsys->poll_num_enabled_fds--; - - #endif -} - -void BReactor_SetFileDescriptorEvents (BReactor *bsys, BFileDescriptor *bs, int events) -{ - ASSERT(bs->active) - ASSERT(!(events&~(BREACTOR_READ|BREACTOR_WRITE))) - - if (bs->waitEvents == events) { - return; - } - - #ifdef BADVPN_USE_EPOLL - - // calculate epoll events - int eevents = 0; - if ((events & BREACTOR_READ)) { - eevents |= EPOLLIN; - } - if ((events & BREACTOR_WRITE)) { - eevents |= EPOLLOUT; - } - - // update epoll entry - struct epoll_event event; - memset(&event, 0, sizeof(event)); - event.events = eevents; - event.data.ptr = bs; - ASSERT_FORCE(epoll_ctl(bsys->efd, EPOLL_CTL_MOD, bs->fd, &event) == 0) - - #endif - - #ifdef BADVPN_USE_KEVENT - - update_kevent_fd_events(bsys, bs, events); - - #endif - - // update events - bs->waitEvents = events; -} - -#endif - -void BReactorLimit_Init (BReactorLimit *o, BReactor *reactor, int limit) -{ - DebugObject_Access(&reactor->d_obj); - ASSERT(limit > 0) - - // init arguments - o->reactor = reactor; - o->limit = limit; - - // set count zero - o->count = 0; - - DebugCounter_Increment(&reactor->d_limits_ctr); - DebugObject_Init(&o->d_obj); -} - -void BReactorLimit_Free (BReactorLimit *o) -{ - BReactor *reactor = o->reactor; - DebugObject_Free(&o->d_obj); - DebugCounter_Decrement(&reactor->d_limits_ctr); - - // remove from active limits list - if (o->count > 0) { - LinkedList1_Remove(&reactor->active_limits_list, &o->active_limits_list_node); - } -} - -int BReactorLimit_Increment (BReactorLimit *o) -{ - BReactor *reactor = o->reactor; - DebugObject_Access(&o->d_obj); - - // check count against limit - if (o->count >= o->limit) { - return 0; - } - - // increment count - o->count++; - - // if limit was zero, add to active limits list - if (o->count == 1) { - LinkedList1_Append(&reactor->active_limits_list, &o->active_limits_list_node); - } - - return 1; -} - -void BReactorLimit_SetLimit (BReactorLimit *o, int limit) -{ - DebugObject_Access(&o->d_obj); - ASSERT(limit > 0) - - // set limit - o->limit = limit; -} - -#ifdef BADVPN_USE_KEVENT - -int BReactorKEvent_Init (BReactorKEvent *o, BReactor *reactor, BReactorKEvent_handler handler, void *user, uintptr_t ident, short filter, u_int fflags, intptr_t data) -{ - DebugObject_Access(&reactor->d_obj); - - // init arguments - o->reactor = reactor; - o->handler = handler; - o->user = user; - o->ident = ident; - o->filter = filter; - - // add kevent - struct kevent event; - memset(&event, 0, sizeof(event)); - event.ident = o->ident; - event.filter = o->filter; - event.flags = EV_ADD; - event.fflags = fflags; - event.data = data; - event.udata = &o->kevent_tag; - if (kevent(o->reactor->kqueue_fd, &event, 1, NULL, 0, NULL) < 0) { - return 0; - } - - // set kevent tag - o->kevent_tag = KEVENT_TAG_KEVENT; - - // set kevent returned pointer - o->kevent_returned_ptr = NULL; - - DebugObject_Init(&o->d_obj); - DebugCounter_Increment(&o->reactor->d_kevent_ctr); - return 1; -} - -void BReactorKEvent_Free (BReactorKEvent *o) -{ - DebugObject_Free(&o->d_obj); - DebugCounter_Decrement(&o->reactor->d_kevent_ctr); - - // write through kevent returned pointer - if (o->kevent_returned_ptr) { - *o->kevent_returned_ptr = NULL; - } - - // delete kevent - struct kevent event; - memset(&event, 0, sizeof(event)); - event.ident = o->ident; - event.filter = o->filter; - event.flags = EV_DELETE; - ASSERT_FORCE(kevent(o->reactor->kqueue_fd, &event, 1, NULL, 0, NULL) == 0) -} - -#endif - -#ifdef BADVPN_USE_WINAPI - -HANDLE BReactor_GetIOCPHandle (BReactor *reactor) -{ - DebugObject_Access(&reactor->d_obj); - - return reactor->iocp_handle; -} - -void BReactorIOCPOverlapped_Init (BReactorIOCPOverlapped *o, BReactor *reactor, void *user, BReactorIOCPOverlapped_handler handler) -{ - DebugObject_Access(&reactor->d_obj); - - // init arguments - o->reactor = reactor; - o->user = user; - o->handler = handler; - - // zero overlapped - memset(&o->olap, 0, sizeof(o->olap)); - - // append to IOCP list - LinkedList1_Append(&reactor->iocp_list, &o->iocp_list_node); - - // set not ready - o->is_ready = 0; - - DebugObject_Init(&o->d_obj); -} - -void BReactorIOCPOverlapped_Free (BReactorIOCPOverlapped *o) -{ - BReactor *reactor = o->reactor; - DebugObject_Free(&o->d_obj); - - // remove from IOCP ready list - if (o->is_ready) { - LinkedList1_Remove(&reactor->iocp_ready_list, &o->ready_list_node); - } - - // remove from IOCP list - LinkedList1_Remove(&reactor->iocp_list, &o->iocp_list_node); -} - -void BReactorIOCPOverlapped_Wait (BReactorIOCPOverlapped *o, int *out_succeeded, DWORD *out_bytes) -{ - BReactor *reactor = o->reactor; - DebugObject_Access(&o->d_obj); - - // wait for IOCP events until we get an event for this olap - while (!o->is_ready) { - DWORD bytes = 0; - ULONG_PTR key; - BReactorIOCPOverlapped *olap = NULL; - BOOL res = GetQueuedCompletionStatus(reactor->iocp_handle, &bytes, &key, (OVERLAPPED **)&olap, INFINITE); - - ASSERT_FORCE(olap) - DebugObject_Access(&olap->d_obj); - ASSERT(olap->reactor == reactor) - - // regular I/O should be done synchronously, so we shoudln't ever get a second completion before an - // existing one is dispatched. If however PostQueuedCompletionStatus is being used to signal events, - // just discard any excess events. - if (!olap->is_ready) { - set_iocp_ready(olap, (res == TRUE), bytes); - } - } - - // remove from IOCP ready list - LinkedList1_Remove(&reactor->iocp_ready_list, &o->ready_list_node); - - // set not ready - o->is_ready = 0; - - if (out_succeeded) { - *out_succeeded = o->ready_succeeded; - } - if (out_bytes) { - *out_bytes = o->ready_bytes; - } -} - -#endif diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/system/BReactor_badvpn.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/system/BReactor_badvpn.h deleted file mode 100644 index 8f10532f..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/system/BReactor_badvpn.h +++ /dev/null @@ -1,572 +0,0 @@ -/** - * @file BReactor_badvpn.h - * @author Ambroz Bizjak - * - * @section LICENSE - * - * 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 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE 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. - * - * @section DESCRIPTION - * - * Event loop that supports file desciptor (Linux) or HANDLE (Windows) events - * and timers. - */ - -#ifndef BADVPN_SYSTEM_BREACTOR_H -#define BADVPN_SYSTEM_BREACTOR_H - -#if (defined(BADVPN_USE_WINAPI) + defined(BADVPN_USE_EPOLL) + defined(BADVPN_USE_KEVENT) + defined(BADVPN_USE_POLL)) != 1 -#error Unknown event backend or too many event backends -#endif - -#ifdef BADVPN_USE_WINAPI -#include -#endif - -#ifdef BADVPN_USE_EPOLL -#include -#endif - -#ifdef BADVPN_USE_KEVENT -#include -#include -#include -#endif - -#ifdef BADVPN_USE_POLL -#include -#endif - -#include - -#include "misc/debug.h" -#include "misc/debugcounter.h" -#include "base/DebugObject.h" -#include "structure/LinkedList1.h" -#include "structure/CAvl.h" -#include "system/BTime.h" -#include "base/BPending.h" - -struct BSmallTimer_t; -typedef struct BSmallTimer_t *BReactor_timerstree_link; - -#include "BReactor_badvpn_timerstree.h" -#include "structure/CAvl_decl.h" - -#define BTIMER_SET_ABSOLUTE 1 -#define BTIMER_SET_RELATIVE 2 - -/** - * Handler function invoked when the timer expires. - * The timer was in running state. - * The timer enters not running state before this function is invoked. - * This function is being called from within the timer's previosly - * associated reactor. - * - * @param timer pointer to the timer. Use the {@link UPPER_OBJECT} macro - * to obtain the pointer to the containing structure. - */ -typedef void (*BSmallTimer_handler) (struct BSmallTimer_t *timer); - -/** - * Handler function invoked when the timer expires. - * The timer was in running state. - * The timer enters not running state before this function is invoked. - * This function is being called from within the timer's previosly - * associated reactor. - * - * @param user value passed to {@link BTimer_Init} - */ -typedef void (*BTimer_handler) (void *user); - -/** - * Timer object used with {@link BReactor}. - */ -typedef struct BSmallTimer_t { - union { - BSmallTimer_handler smalll; // MSVC doesn't like "small" - BTimer_handler heavy; - } handler; - union { - LinkedList1Node list_node; - struct BSmallTimer_t *tree_child[2]; - } u; - struct BSmallTimer_t *tree_parent; - btime_t absTime; - int8_t tree_balance; - uint8_t state; - uint8_t is_small; -} BSmallTimer; - -/** - * Initializes the timer object. - * The timer object is initialized in not running state. - * - * @param bt the object - * @param handler handler function invoked when the timer expires - */ -void BSmallTimer_Init (BSmallTimer *bt, BSmallTimer_handler handler); - -/** - * Checks if the timer is running. - * - * @param bt the object - * @return 1 if running, 0 if not running - */ -int BSmallTimer_IsRunning (BSmallTimer *bt); - -/** - * Timer object used with {@link BReactor}. This is a legacy wrapper - * around {@link BSmallTimer} with an extra field for the default time. - */ -typedef struct { - BSmallTimer base; - void *user; - btime_t msTime; -} BTimer; - -/** - * Initializes the timer object. - * The timer object is initialized in not running state. - * - * @param bt the object - * @param msTime default timeout in milliseconds - * @param handler handler function invoked when the timer expires - * @param user value to pass to the handler function - */ -void BTimer_Init (BTimer *bt, btime_t msTime, BTimer_handler handler, void *user); - -/** - * Checks if the timer is running. - * - * @param bt the object - * @return 1 if running, 0 if not running - */ -int BTimer_IsRunning (BTimer *bt); - -#ifndef BADVPN_USE_WINAPI - -struct BFileDescriptor_t; - -#define BREACTOR_READ (1 << 0) -#define BREACTOR_WRITE (1 << 1) -#define BREACTOR_ERROR (1 << 2) -#define BREACTOR_HUP (1 << 3) - -/** - * Handler function invoked by the reactor when one or more events are detected. - * The events argument will contain a subset of the monitored events (BREACTOR_READ, BREACTOR_WRITE), - * plus possibly the error event (BREACTOR_ERROR). - * The file descriptor object is in active state, being called from within - * the associated reactor. - * - * @param user value passed to {@link BFileDescriptor_Init} - * @param events bitmask composed of a subset of monitored events (BREACTOR_READ, BREACTOR_WRITE), - * and possibly the error event BREACTOR_ERROR and the hang-up event BREACTOR_HUP. - * Will be nonzero. - */ -typedef void (*BFileDescriptor_handler) (void *user, int events); - -/** - * File descriptor object used with {@link BReactor}. - */ -typedef struct BFileDescriptor_t { - int fd; - BFileDescriptor_handler handler; - void *user; - int active; - int waitEvents; - - #ifdef BADVPN_USE_EPOLL - struct BFileDescriptor_t **epoll_returned_ptr; - #endif - - #ifdef BADVPN_USE_KEVENT - int kevent_tag; - int **kevent_returned_ptr; - #endif - - #ifdef BADVPN_USE_POLL - LinkedList1Node poll_enabled_fds_list_node; - int poll_returned_index; - #endif -} BFileDescriptor; - -/** - * Intializes the file descriptor object. - * The object is initialized in not active state. - * - * @param bs file descriptor object to initialize - * @param fb file descriptor to represent - * @param handler handler function invoked by the reactor when a monitored event is detected - * @param user value passed to the handler functuon - */ -void BFileDescriptor_Init (BFileDescriptor *bs, int fd, BFileDescriptor_handler handler, void *user); - -#endif - -// BReactor - -#define BSYSTEM_MAX_RESULTS 64 -#define BSYSTEM_MAX_HANDLES 64 -#define BSYSTEM_MAX_POLL_FDS 4096 - -/** - * Event loop that supports file desciptor (Linux) or HANDLE (Windows) events - * and timers. - */ -typedef struct { - int exiting; - int exit_code; - - // jobs - BPendingGroup pending_jobs; - - // timers - BReactor__TimersTree timers_tree; - LinkedList1 timers_expired_list; - - // limits - LinkedList1 active_limits_list; - - #ifdef BADVPN_USE_WINAPI - LinkedList1 iocp_list; - HANDLE iocp_handle; - LinkedList1 iocp_ready_list; - #endif - - #ifdef BADVPN_USE_EPOLL - int efd; // epoll fd - struct epoll_event epoll_results[BSYSTEM_MAX_RESULTS]; // epoll returned events buffer - int epoll_results_num; // number of events in the array - int epoll_results_pos; // number of events processed so far - #endif - - #ifdef BADVPN_USE_KEVENT - int kqueue_fd; - struct kevent kevent_results[BSYSTEM_MAX_RESULTS]; - int kevent_results_num; - int kevent_results_pos; - #endif - - #ifdef BADVPN_USE_POLL - LinkedList1 poll_enabled_fds_list; - int poll_num_enabled_fds; - int poll_results_num; - int poll_results_pos; - struct pollfd *poll_results_pollfds; - BFileDescriptor **poll_results_bfds; - #endif - - DebugObject d_obj; - #ifndef BADVPN_USE_WINAPI - DebugCounter d_fds_counter; - #endif - #ifdef BADVPN_USE_KEVENT - DebugCounter d_kevent_ctr; - #endif - DebugCounter d_limits_ctr; -} BReactor; - -/** - * Initializes the reactor. - * {@link BLog_Init} must have been done. - * {@link BTime_Init} must have been done. - * - * @param bsys the object - * @return 1 on success, 0 on failure - */ -int BReactor_Init (BReactor *bsys) WARN_UNUSED; - -/** - * Frees the reactor. - * Must not be called from within the event loop ({@link BReactor_Exec}). - * There must be no {@link BPending} or {@link BSmallPending} objects using the - * pending group returned by {@link BReactor_PendingGroup}. - * There must be no running timers in this reactor. - * There must be no limit objects in this reactor. - * There must be no file descriptors or handles registered - * with this reactor. - * There must be no {@link BReactorKEvent} objects in this reactor. - * - * @param bsys the object - */ -void BReactor_Free (BReactor *bsys); - -/** - * Runs the event loop. - * - * @param bsys the object - * @return value passed to {@link BReactor_Quit} - */ -int BReactor_Exec (BReactor *bsys); - -/** - * Causes the event loop ({@link BReactor_Exec}) to cease - * dispatching events and return. - * Any further calls of {@link BReactor_Exec} will return immediately. - * - * @param bsys the object - * @param code value {@link BReactor_Exec} should return. If this is - * called more than once, it will return the last code. - */ -void BReactor_Quit (BReactor *bsys, int code); - -/** - * Starts a timer to expire at the specified time. - * The timer must have been initialized with {@link BSmallTimer_Init}. - * If the timer is in running state, it must be associated with this reactor. - * The timer enters running state, associated with this reactor. - * - * @param bsys the object - * @param bt timer to start - * @param mode interpretation of time (BTIMER_SET_ABSOLUTE or BTIMER_SET_RELATIVE) - * @param time absolute or relative expiration time - */ -void BReactor_SetSmallTimer (BReactor *bsys, BSmallTimer *bt, int mode, btime_t time); - -/** - * Stops a timer. - * If the timer is in running state, it must be associated with this reactor. - * The timer enters not running state. - * - * @param bsys the object - * @param bt timer to stop - */ -void BReactor_RemoveSmallTimer (BReactor *bsys, BSmallTimer *bt); - -/** - * Starts a timer to expire after its default time. - * The timer must have been initialized with {@link BTimer_Init}. - * If the timer is in running state, it must be associated with this reactor. - * The timer enters running state, associated with this reactor. - * - * @param bsys the object - * @param bt timer to start - */ -void BReactor_SetTimer (BReactor *bsys, BTimer *bt); - -/** - * Starts a timer to expire after a given time. - * The timer must have been initialized with {@link BTimer_Init}. - * If the timer is in running state, it must be associated with this reactor. - * The timer enters running state, associated with this reactor. - * - * @param bsys the object - * @param bt timer to start - * @param after relative expiration time - */ -void BReactor_SetTimerAfter (BReactor *bsys, BTimer *bt, btime_t after); - -/** - * Starts a timer to expire at the specified time. - * The timer must have been initialized with {@link BTimer_Init}. - * If the timer is in running state, it must be associated with this reactor. - * The timer enters running state, associated with this reactor. - * The timer's expiration time is set to the time argument. - * - * @param bsys the object - * @param bt timer to start - * @param time absolute expiration time (according to {@link btime_gettime}) - */ -void BReactor_SetTimerAbsolute (BReactor *bsys, BTimer *bt, btime_t time); - -/** - * Stops a timer. - * If the timer is in running state, it must be associated with this reactor. - * The timer enters not running state. - * - * @param bsys the object - * @param bt timer to stop - */ -void BReactor_RemoveTimer (BReactor *bsys, BTimer *bt); - -/** - * Returns a {@link BPendingGroup} object that can be used to schedule jobs for - * the reactor to execute. These jobs have complete priority over other events - * (timers, file descriptors and Windows handles). - * The returned pending group may only be used as an argument to {@link BPending_Init}, - * and must not be accessed by other means. - * All {@link BPending} and {@link BSmallPending} objects using this group must be - * freed before freeing the reactor. - * - * @param bsys the object - * @return pending group for scheduling jobs for the reactor to execute - */ -BPendingGroup * BReactor_PendingGroup (BReactor *bsys); - -/** - * Executes pending jobs until either: - * - the reference job is reached, or - * - {@link BReactor_Quit} is called. - * The reference job must be reached before the job list empties. - * The reference job will not be executed. - * - * WARNING: Use with care. This should only be used to to work around third-party software - * that does not integrade into the jobs system. In particular, you should think about: - * - the effects the jobs to be executed may have, and - * - the environment those jobs expect to be executed in. - * - * @param bsys the object - * @param ref reference job. It is not accessed in any way, only its address is compared to - * pending jobs before they are executed. - * @return 1 if the reference job was reached, - * 0 if {@link BReactor_Quit} was called (either while executing a job, or before) - */ -int BReactor_Synchronize (BReactor *bsys, BSmallPending *ref); - -#ifndef BADVPN_USE_WINAPI - -/** - * Starts monitoring a file descriptor. - * - * @param bsys the object - * @param bs file descriptor object. Must have been initialized with - * {@link BFileDescriptor_Init} Must be in not active state. - * On success, the file descriptor object enters active state, - * associated with this reactor. - * @return 1 on success, 0 on failure - */ -int BReactor_AddFileDescriptor (BReactor *bsys, BFileDescriptor *bs) WARN_UNUSED; - -/** - * Stops monitoring a file descriptor. - * - * @param bsys the object - * @param bs {@link BFileDescriptor} object. Must be in active state, - * associated with this reactor. The file descriptor object - * enters not active state. - */ -void BReactor_RemoveFileDescriptor (BReactor *bsys, BFileDescriptor *bs); - -/** - * Sets monitored file descriptor events. - * - * @param bsys the object - * @param bs {@link BFileDescriptor} object. Must be in active state, - * associated with this reactor. - * @param events events to watch for. Must not have any bits other than - * BREACTOR_READ and BREACTOR_WRITE. - * This overrides previosly monitored events. - */ -void BReactor_SetFileDescriptorEvents (BReactor *bsys, BFileDescriptor *bs, int events); - -#endif - -typedef struct { - BReactor *reactor; - int limit; - int count; - LinkedList1Node active_limits_list_node; - DebugObject d_obj; -} BReactorLimit; - -/** - * Initializes a limit object. - * A limit object consists of a counter integer, which is initialized to - * zero, is incremented by {@link BReactorLimit_Increment} up to \a limit, - * and is reset to zero every time the event loop performs a wait. - * If the event loop has processed all detected events, and before performing - * a wait, it determines that timers have expired, the counter will not be reset. - * - * @param o the object - * @param reactor reactor the object is tied to - * @param limit maximum counter value. Must be >0. - */ -void BReactorLimit_Init (BReactorLimit *o, BReactor *reactor, int limit); - -/** - * Frees a limit object. - * - * @param o the object - */ -void BReactorLimit_Free (BReactorLimit *o); - -/** - * Attempts to increment the counter of a limit object. - * - * @param o the object - * @return 1 if the counter was lesser than the limit and was incremented, - * 0 if the counter was greater or equal to the limit and could not be - * incremented - */ -int BReactorLimit_Increment (BReactorLimit *o); - -/** - * Sets the limit of a limit object. - * - * @param o the object - * @param limit new limit. Must be >0. - */ -void BReactorLimit_SetLimit (BReactorLimit *o, int limit); - -#ifdef BADVPN_USE_KEVENT - -typedef void (*BReactorKEvent_handler) (void *user, u_int fflags, intptr_t data); - -typedef struct { - BReactor *reactor; - BReactorKEvent_handler handler; - void *user; - uintptr_t ident; - short filter; - int kevent_tag; - int **kevent_returned_ptr; - DebugObject d_obj; -} BReactorKEvent; - -int BReactorKEvent_Init (BReactorKEvent *o, BReactor *reactor, BReactorKEvent_handler handler, void *user, uintptr_t ident, short filter, u_int fflags, intptr_t data); -void BReactorKEvent_Free (BReactorKEvent *o); - -#endif - -#ifdef BADVPN_USE_WINAPI - -#define BREACTOR_IOCP_EVENT_SUCCEEDED 1 -#define BREACTOR_IOCP_EVENT_FAILED 2 -#define BREACTOR_IOCP_EVENT_EXITING 3 - -typedef void (*BReactorIOCPOverlapped_handler) (void *user, int event, DWORD bytes); - -typedef struct { - OVERLAPPED olap; - BReactor *reactor; - void *user; - BReactorIOCPOverlapped_handler handler; - LinkedList1Node iocp_list_node; - int is_ready; - LinkedList1Node ready_list_node; - int ready_succeeded; - DWORD ready_bytes; - DebugObject d_obj; -} BReactorIOCPOverlapped; - -HANDLE BReactor_GetIOCPHandle (BReactor *reactor); - -void BReactorIOCPOverlapped_Init (BReactorIOCPOverlapped *o, BReactor *reactor, void *user, BReactorIOCPOverlapped_handler handler); -void BReactorIOCPOverlapped_Free (BReactorIOCPOverlapped *o); -void BReactorIOCPOverlapped_Wait (BReactorIOCPOverlapped *o, int *out_succeeded, DWORD *out_bytes); - -#endif - -#endif diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/system/BReactor_badvpn_timerstree.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/system/BReactor_badvpn_timerstree.h deleted file mode 100644 index 3cecd75e..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/system/BReactor_badvpn_timerstree.h +++ /dev/null @@ -1,13 +0,0 @@ -#define CAVL_PARAM_NAME BReactor__TimersTree -#define CAVL_PARAM_FEATURE_COUNTS 0 -#define CAVL_PARAM_FEATURE_KEYS_ARE_INDICES 0 -#define CAVL_PARAM_FEATURE_NOKEYS 1 -#define CAVL_PARAM_TYPE_ENTRY struct BSmallTimer_t -#define CAVL_PARAM_TYPE_LINK BReactor_timerstree_link -#define CAVL_PARAM_TYPE_ARG int -#define CAVL_PARAM_VALUE_NULL ((BReactor_timerstree_link)NULL) -#define CAVL_PARAM_FUN_DEREF(arg, link) (link) -#define CAVL_PARAM_FUN_COMPARE_ENTRIES(arg, entry1, entry2) compare_timers((entry1).link, (entry2).link) -#define CAVL_PARAM_MEMBER_CHILD u.tree_child -#define CAVL_PARAM_MEMBER_BALANCE tree_balance -#define CAVL_PARAM_MEMBER_PARENT tree_parent diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/system/BSignal.c b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/system/BSignal.c deleted file mode 100644 index 4a71198d..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/system/BSignal.c +++ /dev/null @@ -1,188 +0,0 @@ -/** - * @file BSignal.c - * @author Ambroz Bizjak - * - * @section LICENSE - * - * 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 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE 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. - */ - -#ifdef BADVPN_USE_WINAPI -#include -#else -#include -#include "system/BUnixSignal.h" -#endif - -#include "misc/debug.h" -#include "base/BLog.h" - -#include "system/BSignal.h" - -#include "generated/blog_channel_BSignal.h" - -static struct { - int initialized; - int finished; - BReactor *reactor; - BSignal_handler handler; - void *user; - #ifdef BADVPN_USE_WINAPI - BReactorIOCPOverlapped olap; - CRITICAL_SECTION iocp_handle_mutex; - HANDLE iocp_handle; - #else - BUnixSignal signal; - #endif -} bsignal_global = { - 0 -}; - -#ifdef BADVPN_USE_WINAPI - -static void olap_handler (void *user, int event, DWORD bytes) -{ - ASSERT(bsignal_global.initialized) - ASSERT(!(event == BREACTOR_IOCP_EVENT_EXITING) || bsignal_global.finished) - - if (event == BREACTOR_IOCP_EVENT_EXITING) { - BReactorIOCPOverlapped_Free(&bsignal_global.olap); - return; - } - - if (!bsignal_global.finished) { - // call handler - bsignal_global.handler(bsignal_global.user); - return; - } -} - -static BOOL WINAPI ctrl_handler (DWORD type) -{ - EnterCriticalSection(&bsignal_global.iocp_handle_mutex); - - if (bsignal_global.iocp_handle) { - PostQueuedCompletionStatus(bsignal_global.iocp_handle, 0, 0, &bsignal_global.olap.olap); - } - - LeaveCriticalSection(&bsignal_global.iocp_handle_mutex); - - return TRUE; -} - -#else - -static void unix_signal_handler (void *user, int signo) -{ - ASSERT(signo == SIGTERM || signo == SIGINT) - ASSERT(bsignal_global.initialized) - ASSERT(!bsignal_global.finished) - - BLog(BLOG_DEBUG, "Dispatching signal"); - - // call handler - bsignal_global.handler(bsignal_global.user); - return; -} - -#endif - -int BSignal_Init (BReactor *reactor, BSignal_handler handler, void *user) -{ - ASSERT(!bsignal_global.initialized) - - // init arguments - bsignal_global.reactor = reactor; - bsignal_global.handler = handler; - bsignal_global.user = user; - - BLog(BLOG_DEBUG, "BSignal initializing"); - - #ifdef BADVPN_USE_WINAPI - - // init olap - BReactorIOCPOverlapped_Init(&bsignal_global.olap, bsignal_global.reactor, NULL, olap_handler); - - // init handler mutex - InitializeCriticalSection(&bsignal_global.iocp_handle_mutex); - - // remember IOCP handle - bsignal_global.iocp_handle = BReactor_GetIOCPHandle(bsignal_global.reactor); - - // configure ctrl handler - if (!SetConsoleCtrlHandler(ctrl_handler, TRUE)) { - BLog(BLOG_ERROR, "SetConsoleCtrlHandler failed"); - goto fail1; - } - - #else - - sigset_t sset; - ASSERT_FORCE(sigemptyset(&sset) == 0) - ASSERT_FORCE(sigaddset(&sset, SIGTERM) == 0) - ASSERT_FORCE(sigaddset(&sset, SIGINT) == 0) - - // init BUnixSignal - if (!BUnixSignal_Init(&bsignal_global.signal, bsignal_global.reactor, sset, unix_signal_handler, NULL)) { - BLog(BLOG_ERROR, "BUnixSignal_Init failed"); - goto fail0; - } - - #endif - - bsignal_global.initialized = 1; - bsignal_global.finished = 0; - - return 1; - - #ifdef BADVPN_USE_WINAPI -fail1: - DeleteCriticalSection(&bsignal_global.iocp_handle_mutex); - BReactorIOCPOverlapped_Free(&bsignal_global.olap); - #endif - -fail0: - return 0; -} - -void BSignal_Finish (void) -{ - ASSERT(bsignal_global.initialized) - ASSERT(!bsignal_global.finished) - - #ifdef BADVPN_USE_WINAPI - - // forget IOCP handle - EnterCriticalSection(&bsignal_global.iocp_handle_mutex); - bsignal_global.iocp_handle = NULL; - LeaveCriticalSection(&bsignal_global.iocp_handle_mutex); - - #else - - // free BUnixSignal - BUnixSignal_Free(&bsignal_global.signal, 0); - - #endif - - bsignal_global.finished = 1; -} diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/system/BSignal.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/system/BSignal.h deleted file mode 100644 index 9e7701df..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/system/BSignal.h +++ /dev/null @@ -1,64 +0,0 @@ -/** - * @file BSignal.h - * @author Ambroz Bizjak - * - * @section LICENSE - * - * 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 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE 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. - * - * @section DESCRIPTION - * - * A global object for catching program termination requests. - */ - -#ifndef BADVPN_SYSTEM_BSIGNAL_H -#define BADVPN_SYSTEM_BSIGNAL_H - -#include "misc/debug.h" -#include "system/BReactor.h" - -typedef void (*BSignal_handler) (void *user); - -/** - * Initializes signal handling. - * The object is created in not capturing state. - * {@link BLog_Init} must have been done. - * - * WARNING: make sure this won't interfere with other components: - * - on Linux, this uses {@link BUnixSignal} to catch SIGTERM and SIGINT, - * - on Windows, this sets up a handler with SetConsoleCtrlHandler. - * - * @param reactor {@link BReactor} from which the handler will be called - * @param handler callback function invoked from the reactor - * @param user value passed to callback function - * @return 1 on success, 0 on failure - */ -int BSignal_Init (BReactor *reactor, BSignal_handler handler, void *user) WARN_UNUSED; - -/** - * Finishes signal handling. - * {@link BSignal_Init} must not be called again. - */ -void BSignal_Finish (void); - -#endif diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/system/BTime.c b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/system/BTime.c deleted file mode 100644 index 0ab77f9a..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/system/BTime.c +++ /dev/null @@ -1,55 +0,0 @@ -/** - * @file BTime.c - * @author Ambroz Bizjak - * - * @section LICENSE - * - * 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 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE 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. - */ - -#include "system/BTime.h" - -#ifndef BADVPN_PLUGIN -struct _BTime_global btime_global = { - #ifndef NDEBUG - 0 - #endif -}; -#endif - -#ifdef __MACH__ -#include -#include - -int clock_gettime_ex(int clk_id, struct timespec* t) -{ - clock_serv_t cclock; - mach_timespec_t mts; - host_get_clock_service(mach_host_self(), CALENDAR_CLOCK, &cclock); - clock_get_time(cclock, &mts); - mach_port_deallocate(mach_task_self(), cclock); - t->tv_sec = mts.tv_sec; - t->tv_nsec = mts.tv_nsec; - return 0; -} -#endif diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/system/BTime.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/system/BTime.h deleted file mode 100644 index 481a1cde..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/system/BTime.h +++ /dev/null @@ -1,168 +0,0 @@ -/** - * @file BTime.h - * @author Ambroz Bizjak - * - * @section LICENSE - * - * 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 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE 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. - * - * @section DESCRIPTION - * - * System time abstraction used by {@link BReactor}. - */ - -#ifndef BADVPN_SYSTEM_BTIME_H -#define BADVPN_SYSTEM_BTIME_H - -#if defined(BADVPN_USE_WINAPI) -#include -#elif defined(BADVPN_EMSCRIPTEN) -#include -#else -#include -#include -#endif - -#include - -#include "misc/debug.h" -#include "misc/overflow.h" -#include "base/BLog.h" - -#include "generated/blog_channel_BTime.h" - -typedef int64_t btime_t; - -#define BTIME_MIN INT64_MIN - -struct _BTime_global { - #ifndef NDEBUG - int initialized; // initialized statically - #endif - #if defined(BADVPN_USE_WINAPI) - LARGE_INTEGER start_time; - #elif defined(BADVPN_EMSCRIPTEN) - btime_t start_time; - #else - btime_t start_time; - int use_gettimeofday; - #endif -}; - -#ifdef __MACH__ -#define CLOCK_MONOTONIC 1 -int clock_gettime_ex(int clk_id, struct timespec* t); -#endif - -extern struct _BTime_global btime_global; - -static void BTime_Init (void) -{ - ASSERT(!btime_global.initialized) - - #if defined(BADVPN_USE_WINAPI) - - ASSERT_FORCE(QueryPerformanceCounter(&btime_global.start_time)) - - #elif defined(BADVPN_EMSCRIPTEN) - - btime_global.start_time = emscripten_get_now(); - - #else - - struct timespec ts; - if (clock_gettime_ex(CLOCK_MONOTONIC, &ts) < 0) { - BLog(BLOG_WARNING, "CLOCK_MONOTONIC is not available. Timers will be confused by clock changes."); - - struct timeval tv; - ASSERT_FORCE(gettimeofday(&tv, NULL) == 0) - - btime_global.start_time = (int64_t)tv.tv_sec * 1000 + (int64_t)tv.tv_usec/1000; - btime_global.use_gettimeofday = 1; - } else { - btime_global.start_time = (int64_t)ts.tv_sec * 1000 + (int64_t)ts.tv_nsec/1000000; - btime_global.use_gettimeofday = 0; - } - - #endif - - #ifndef NDEBUG - btime_global.initialized = 1; - #endif -} - -static btime_t btime_gettime (void) -{ - ASSERT(btime_global.initialized) - - #if defined(BADVPN_USE_WINAPI) - - LARGE_INTEGER count; - LARGE_INTEGER freq; - ASSERT_FORCE(QueryPerformanceCounter(&count)) - ASSERT_FORCE(QueryPerformanceFrequency(&freq)) - return (((count.QuadPart - btime_global.start_time.QuadPart) * 1000) / freq.QuadPart); - - #elif defined(BADVPN_EMSCRIPTEN) - - return (btime_t)emscripten_get_now() - btime_global.start_time; - - #else - - if (btime_global.use_gettimeofday) { - struct timeval tv; - ASSERT_FORCE(gettimeofday(&tv, NULL) == 0) - return ((int64_t)tv.tv_sec * 1000 + (int64_t)tv.tv_usec/1000); - } else { - struct timespec ts; - ASSERT_FORCE(clock_gettime_ex(CLOCK_MONOTONIC, &ts) == 0) - return (((int64_t)ts.tv_sec * 1000 + (int64_t)ts.tv_nsec/1000000) - btime_global.start_time); - } - - #endif -} - -static btime_t btime_add (btime_t t1, btime_t t2) -{ - // handle overflow - int overflows = add_int64_overflows(t1, t2); - btime_t sum; - if (overflows != 0) { - if (overflows > 0) { - sum = INT64_MAX; - } else { - sum = INT64_MIN; - } - } else { - sum = t1 + t2; - } - - return sum; -} - -static btime_t btime_getpast (void) -{ - return INT64_MIN; -} - -#endif diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/system/BUnixSignal.c b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/system/BUnixSignal.c deleted file mode 100644 index aaea06d9..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/system/BUnixSignal.c +++ /dev/null @@ -1,406 +0,0 @@ -/** - * @file BUnixSignal.c - * @author Ambroz Bizjak - * - * @section LICENSE - * - * 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 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE 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. - */ - -#include -#include -#include -#include -#include -#include - -#ifdef BADVPN_USE_SIGNALFD -#include -#endif - -#include "misc/balloc.h" -#include "misc/nonblocking.h" -#include "base/BLog.h" - -#include "system/BUnixSignal.h" - -#include "generated/blog_channel_BUnixSignal.h" - -#define BUNIXSIGNAL_MAX_SIGNALS 64 - -#ifdef BADVPN_USE_SIGNALFD - -static void signalfd_handler (BUnixSignal *o, int events) -{ - DebugObject_Access(&o->d_obj); - - // read a signal - struct signalfd_siginfo siginfo; - int bytes = read(o->signalfd_fd, &siginfo, sizeof(siginfo)); - if (bytes < 0) { - int error = errno; - if (error == EAGAIN || error == EWOULDBLOCK) { - return; - } - BLog(BLOG_ERROR, "read failed (%d)", error); - return; - } - ASSERT_FORCE(bytes == sizeof(siginfo)) - - // check signal - if (siginfo.ssi_signo > INT_MAX) { - BLog(BLOG_ERROR, "read returned out of int range signo (%"PRIu32")", siginfo.ssi_signo); - return; - } - int signo = siginfo.ssi_signo; - if (sigismember(&o->signals, signo) <= 0) { - BLog(BLOG_ERROR, "read returned wrong signo (%d)", signo); - return; - } - - BLog(BLOG_DEBUG, "dispatching signal %d", signo); - - // call handler - o->handler(o->user, signo); - return; -} - -#endif - -#ifdef BADVPN_USE_KEVENT - -static void kevent_handler (struct BUnixSignal_kevent_entry *entry, u_int fflags, intptr_t data) -{ - BUnixSignal *o = entry->parent; - DebugObject_Access(&o->d_obj); - - // call signal - o->handler(o->user, entry->signo); - return; -} - -#endif - -#ifdef BADVPN_USE_SELFPIPE - -struct BUnixSignal_selfpipe_entry *bunixsignal_selfpipe_entries[BUNIXSIGNAL_MAX_SIGNALS]; - -static void free_selfpipe_entry (struct BUnixSignal_selfpipe_entry *entry) -{ - BUnixSignal *o = entry->parent; - - // uninstall signal handler - struct sigaction act; - memset(&act, 0, sizeof(act)); - act.sa_handler = SIG_DFL; - sigemptyset(&act.sa_mask); - ASSERT_FORCE(sigaction(entry->signo, &act, NULL) == 0) - - // free BFileDescriptor - BReactor_RemoveFileDescriptor(o->reactor, &entry->pipe_read_bfd); - - // close pipe - ASSERT_FORCE(close(entry->pipefds[0]) == 0) - ASSERT_FORCE(close(entry->pipefds[1]) == 0) -} - -static void pipe_read_fd_handler (struct BUnixSignal_selfpipe_entry *entry, int events) -{ - BUnixSignal *o = entry->parent; - DebugObject_Access(&o->d_obj); - - // read a byte - uint8_t b; - if (read(entry->pipefds[0], &b, sizeof(b)) < 0) { - int error = errno; - if (error == EAGAIN || error == EWOULDBLOCK) { - return; - } - BLog(BLOG_ERROR, "read failed (%d)", error); - return; - } - - // call handler - o->handler(o->user, entry->signo); - return; -} - -static void signal_handler (int signo) -{ - ASSERT(signo >= 0) - ASSERT(signo < BUNIXSIGNAL_MAX_SIGNALS) - - struct BUnixSignal_selfpipe_entry *entry = bunixsignal_selfpipe_entries[signo]; - - uint8_t b = 0; - write(entry->pipefds[1], &b, sizeof(b)); -} - -#endif - -int BUnixSignal_Init (BUnixSignal *o, BReactor *reactor, sigset_t signals, BUnixSignal_handler handler, void *user) -{ - // init arguments - o->reactor = reactor; - o->signals = signals; - o->handler = handler; - o->user = user; - - #ifdef BADVPN_USE_SIGNALFD - - // init signalfd fd - if ((o->signalfd_fd = signalfd(-1, &o->signals, 0)) < 0) { - BLog(BLOG_ERROR, "signalfd failed"); - goto fail0; - } - - // set non-blocking - if (fcntl(o->signalfd_fd, F_SETFL, O_NONBLOCK) < 0) { - BLog(BLOG_ERROR, "cannot set non-blocking"); - goto fail1; - } - - // init signalfd BFileDescriptor - BFileDescriptor_Init(&o->signalfd_bfd, o->signalfd_fd, (BFileDescriptor_handler)signalfd_handler, o); - if (!BReactor_AddFileDescriptor(o->reactor, &o->signalfd_bfd)) { - BLog(BLOG_ERROR, "BReactor_AddFileDescriptor failed"); - goto fail1; - } - BReactor_SetFileDescriptorEvents(o->reactor, &o->signalfd_bfd, BREACTOR_READ); - - // block signals - if (sigprocmask(SIG_BLOCK, &o->signals, 0) < 0) { - BLog(BLOG_ERROR, "sigprocmask block failed"); - goto fail2; - } - - #endif - - #ifdef BADVPN_USE_KEVENT - - // count signals - int num_signals = 0; - for (int i = 0; i < BUNIXSIGNAL_MAX_SIGNALS; i++) { - if (!sigismember(&o->signals, i)) { - continue; - } - num_signals++; - } - - // allocate array - if (!(o->entries = BAllocArray(num_signals, sizeof(o->entries[0])))) { - BLog(BLOG_ERROR, "BAllocArray failed"); - goto fail0; - } - - // init kevents - o->num_entries = 0; - for (int i = 0; i < BUNIXSIGNAL_MAX_SIGNALS; i++) { - if (!sigismember(&o->signals, i)) { - continue; - } - struct BUnixSignal_kevent_entry *entry = &o->entries[o->num_entries]; - entry->parent = o; - entry->signo = i; - if (!BReactorKEvent_Init(&entry->kevent, o->reactor, (BReactorKEvent_handler)kevent_handler, entry, entry->signo, EVFILT_SIGNAL, 0, 0)) { - BLog(BLOG_ERROR, "BReactorKEvent_Init failed"); - goto fail2; - } - o->num_entries++; - } - - // block signals - if (sigprocmask(SIG_BLOCK, &o->signals, 0) < 0) { - BLog(BLOG_ERROR, "sigprocmask block failed"); - goto fail2; - } - - #endif - - #ifdef BADVPN_USE_SELFPIPE - - // count signals - int num_signals = 0; - for (int i = 1; i < BUNIXSIGNAL_MAX_SIGNALS; i++) { - if (!sigismember(&o->signals, i)) { - continue; - } - num_signals++; - } - - // allocate array - if (!(o->entries = BAllocArray(num_signals, sizeof(o->entries[0])))) { - BLog(BLOG_ERROR, "BAllocArray failed"); - goto fail0; - } - - // init entries - o->num_entries = 0; - for (int i = 1; i < BUNIXSIGNAL_MAX_SIGNALS; i++) { - if (!sigismember(&o->signals, i)) { - continue; - } - - struct BUnixSignal_selfpipe_entry *entry = &o->entries[o->num_entries]; - entry->parent = o; - entry->signo = i; - - // init pipe - if (pipe(entry->pipefds) < 0) { - BLog(BLOG_ERROR, "pipe failed"); - goto loop_fail0; - } - - // set pipe ends non-blocking - if (!badvpn_set_nonblocking(entry->pipefds[0]) || !badvpn_set_nonblocking(entry->pipefds[1])) { - BLog(BLOG_ERROR, "set nonblocking failed"); - goto loop_fail1; - } - - // init read end BFileDescriptor - BFileDescriptor_Init(&entry->pipe_read_bfd, entry->pipefds[0], (BFileDescriptor_handler)pipe_read_fd_handler, entry); - if (!BReactor_AddFileDescriptor(o->reactor, &entry->pipe_read_bfd)) { - BLog(BLOG_ERROR, "BReactor_AddFileDescriptor failed"); - goto loop_fail1; - } - BReactor_SetFileDescriptorEvents(o->reactor, &entry->pipe_read_bfd, BREACTOR_READ); - - // set global entry pointer - bunixsignal_selfpipe_entries[entry->signo] = entry; - - // install signal handler - struct sigaction act; - memset(&act, 0, sizeof(act)); - act.sa_handler = signal_handler; - sigemptyset(&act.sa_mask); - if (sigaction(entry->signo, &act, NULL) < 0) { - BLog(BLOG_ERROR, "sigaction failed"); - goto loop_fail2; - } - - o->num_entries++; - - continue; - - loop_fail2: - BReactor_RemoveFileDescriptor(o->reactor, &entry->pipe_read_bfd); - loop_fail1: - ASSERT_FORCE(close(entry->pipefds[0]) == 0) - ASSERT_FORCE(close(entry->pipefds[1]) == 0) - loop_fail0: - goto fail2; - } - - #endif - - DebugObject_Init(&o->d_obj); - - return 1; - - #ifdef BADVPN_USE_SIGNALFD -fail2: - BReactor_RemoveFileDescriptor(o->reactor, &o->signalfd_bfd); -fail1: - ASSERT_FORCE(close(o->signalfd_fd) == 0) - #endif - - #ifdef BADVPN_USE_KEVENT -fail2: - while (o->num_entries > 0) { - BReactorKEvent_Free(&o->entries[o->num_entries - 1].kevent); - o->num_entries--; - } - BFree(o->entries); - #endif - - #ifdef BADVPN_USE_SELFPIPE -fail2: - while (o->num_entries > 0) { - free_selfpipe_entry(&o->entries[o->num_entries - 1]); - o->num_entries--; - } - BFree(o->entries); - #endif - -fail0: - return 0; -} - -void BUnixSignal_Free (BUnixSignal *o, int unblock) -{ - ASSERT(unblock == 0 || unblock == 1) - DebugObject_Free(&o->d_obj); - - #ifdef BADVPN_USE_SIGNALFD - - if (unblock) { - // unblock signals - ASSERT_FORCE(sigprocmask(SIG_UNBLOCK, &o->signals, 0) == 0) - } - - // free signalfd BFileDescriptor - BReactor_RemoveFileDescriptor(o->reactor, &o->signalfd_bfd); - - // free signalfd fd - ASSERT_FORCE(close(o->signalfd_fd) == 0) - - #endif - - #ifdef BADVPN_USE_KEVENT - - if (unblock) { - // unblock signals - ASSERT_FORCE(sigprocmask(SIG_UNBLOCK, &o->signals, 0) == 0) - } - - // free kevents - while (o->num_entries > 0) { - BReactorKEvent_Free(&o->entries[o->num_entries - 1].kevent); - o->num_entries--; - } - - // free array - BFree(o->entries); - - #endif - - #ifdef BADVPN_USE_SELFPIPE - - if (!unblock) { - // block signals - if (sigprocmask(SIG_BLOCK, &o->signals, 0) < 0) { - BLog(BLOG_ERROR, "sigprocmask block failed"); - } - } - - // free entries - while (o->num_entries > 0) { - free_selfpipe_entry(&o->entries[o->num_entries - 1]); - o->num_entries--; - } - - // free array - BFree(o->entries); - - #endif -} diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/system/BUnixSignal.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/system/BUnixSignal.h deleted file mode 100644 index 53f48ae3..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/system/BUnixSignal.h +++ /dev/null @@ -1,132 +0,0 @@ -/** - * @file BUnixSignal.h - * @author Ambroz Bizjak - * - * @section LICENSE - * - * 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 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE 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. - * - * @section DESCRIPTION - * - * Object for catching unix signals. - */ - -#ifndef BADVPN_SYSTEM_BUNIXSIGNAL_H -#define BADVPN_SYSTEM_BUNIXSIGNAL_H - -#if (defined(BADVPN_USE_SIGNALFD) + defined(BADVPN_USE_KEVENT) + defined(BADVPN_USE_SELFPIPE)) != 1 -#error Unknown signal backend or too many signal backends -#endif - -#include -#include - -#include "misc/debug.h" -#include "system/BReactor.h" -#include "base/DebugObject.h" - -struct BUnixSignal_s; - -/** - * Handler function called when a signal is received. - * - * @param user as in {@link BUnixSignal_Init} - * @param signo signal number. Will be one of the signals provided to {@link signals}. - */ -typedef void (*BUnixSignal_handler) (void *user, int signo); - -#ifdef BADVPN_USE_KEVENT -struct BUnixSignal_kevent_entry { - struct BUnixSignal_s *parent; - int signo; - BReactorKEvent kevent; -}; -#endif - -#ifdef BADVPN_USE_SELFPIPE -struct BUnixSignal_selfpipe_entry { - struct BUnixSignal_s *parent; - int signo; - int pipefds[2]; - BFileDescriptor pipe_read_bfd; -}; -#endif - -/** - * Object for catching unix signals. - */ -typedef struct BUnixSignal_s { - BReactor *reactor; - sigset_t signals; - BUnixSignal_handler handler; - void *user; - - #ifdef BADVPN_USE_SIGNALFD - int signalfd_fd; - BFileDescriptor signalfd_bfd; - #endif - - #ifdef BADVPN_USE_KEVENT - struct BUnixSignal_kevent_entry *entries; - int num_entries; - #endif - - #ifdef BADVPN_USE_SELFPIPE - struct BUnixSignal_selfpipe_entry *entries; - int num_entries; - #endif - - DebugObject d_obj; -} BUnixSignal; - -/** - * Initializes the object. - * {@link BLog_Init} must have been done. - * - * WARNING: for every signal number there should be at most one {@link BUnixSignal} - * object handling it (or anything else that could interfere). - * - * This blocks the signal using sigprocmask() and sets up signalfd() for receiving - * signals. - * - * @param o the object - * @param reactor reactor we live in - * @param signals signals to handle. See man 3 sigsetops. - * @param handler handler function to call when a signal is received - * @param user value passed to callback function - * @return 1 on success, 0 on failure - */ -int BUnixSignal_Init (BUnixSignal *o, BReactor *reactor, sigset_t signals, BUnixSignal_handler handler, void *user) WARN_UNUSED; - -/** - * Frees the object. - * - * @param o the object - * @param unblock whether to unblock the signals using sigprocmask(). Not unblocking it - * can be used while the program is exiting gracefully to prevent the - * signals from being handled handled according to its default disposition - * after this function is called. Must be 0 or 1. - */ -void BUnixSignal_Free (BUnixSignal *o, int unblock); - -#endif diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/tun2socks/SocksUdpGwClient.c b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/tun2socks/SocksUdpGwClient.c deleted file mode 100644 index 93fb019d..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/tun2socks/SocksUdpGwClient.c +++ /dev/null @@ -1,606 +0,0 @@ -/* - * Copyright (C) Ambroz Bizjak - * Contributions: - * Transparent DNS: Copyright (C) Kerem Hadimli - * - * 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 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE 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. - */ - -#include "misc/debug.h" -#include "base/BLog.h" - -#include "tun2socks/SocksUdpGwClient.h" - -#include "generated/blog_channel_SocksUdpGwClient.h" - -#ifdef BADVPN_SOCKS_UDP_RELAY - -#include "misc/socks_proto.h" -#define CONNECTION_UDP_BUFFER_SIZE 1 - -#else - -static void free_socks (SocksUdpGwClient *o); -static void try_connect (SocksUdpGwClient *o); -static void reconnect_timer_handler (SocksUdpGwClient *o); -static void socks_client_handler (SocksUdpGwClient *o, int event); -static void udpgw_handler_servererror (SocksUdpGwClient *o); -static void udpgw_handler_received (SocksUdpGwClient *o, BAddr local_addr, BAddr remote_addr, const uint8_t *data, int data_len); - -#endif - -#ifdef BADVPN_SOCKS_UDP_RELAY -static void dgram_handler (SocksUdpGwClient_connection *o, int event); -static void dgram_handler_received (SocksUdpGwClient_connection *o, uint8_t *data, int data_len); -static int conaddr_comparator (void *unused, SocksUdpGwClient_conaddr *v1, SocksUdpGwClient_conaddr *v2); -static SocksUdpGwClient_connection * find_connection (SocksUdpGwClient *o, SocksUdpGwClient_conaddr conaddr); -static SocksUdpGwClient_connection * reuse_connection (SocksUdpGwClient *o, SocksUdpGwClient_conaddr conaddr); -static void connection_send (SocksUdpGwClient_connection *o, const uint8_t *data, int data_len); -static void connection_first_job_handler (SocksUdpGwClient_connection *con); -static SocksUdpGwClient_connection *connection_init (SocksUdpGwClient *client, SocksUdpGwClient_conaddr conaddr, const uint8_t *data, int data_len); -static void connection_free (SocksUdpGwClient_connection *o); - -static void dgram_handler (SocksUdpGwClient_connection *o, int event) -{ - SocksUdpGwClient *client = o->client; - ASSERT(client); - - DebugObject_Access(&client->d_obj); - - BLog(BLOG_INFO, "UDP error"); -} - -static void dgram_handler_received (SocksUdpGwClient_connection *o, uint8_t *data, int data_len) -{ - SocksUdpGwClient *client = o->client; - ASSERT(client); - - DebugObject_Access(&client->d_obj); - ASSERT(data_len >= 0) - ASSERT(data_len <= client->udpgw_mtu) - - // accept packet - PacketPassInterface_Done(&o->udp_recv_if); - - // check header - if (data_len < sizeof(struct socks_udp_header)) { - BLog(BLOG_ERROR, "missing header"); - return; - } - struct socks_udp_header header; - memcpy(&header, data, sizeof(header)); - data += sizeof(header); - data_len -= sizeof(header); - uint8_t frag = header.frag; - uint8_t atyp = header.atyp; - - // check fragment - if (frag) { - BLog(BLOG_ERROR, "unexpected frag"); - return; - } - - // parse address - BAddr remote_addr; - if (atyp == SOCKS_ATYP_IPV6) { - if (data_len < sizeof(struct udpgw_addr_ipv6)) { - BLog(BLOG_ERROR, "missing ipv6 address"); - return; - } - struct udpgw_addr_ipv6 addr_ipv6; - memcpy(&addr_ipv6, data, sizeof(addr_ipv6)); - data += sizeof(addr_ipv6); - data_len -= sizeof(addr_ipv6); - BAddr_InitIPv6(&remote_addr, addr_ipv6.addr_ip, addr_ipv6.addr_port); - } else { - if (data_len < sizeof(struct udpgw_addr_ipv4)) { - BLog(BLOG_ERROR, "missing ipv4 address"); - return; - } - struct udpgw_addr_ipv4 addr_ipv4; - memcpy(&addr_ipv4, data, sizeof(addr_ipv4)); - data += sizeof(addr_ipv4); - data_len -= sizeof(addr_ipv4); - BAddr_InitIPv4(&remote_addr, addr_ipv4.addr_ip, addr_ipv4.addr_port); - } - - // check remote addr - if (!BAddr_Compare(&remote_addr, &o->conaddr.remote_addr)) { - BLog(BLOG_ERROR, "remote addr not match"); - return; - } - - // check remaining data - if (data_len > client->udp_mtu) { - BLog(BLOG_ERROR, "too much data"); - return; - } - - // submit to user - client->handler_received(client->user, o->conaddr.local_addr, remote_addr, data, data_len); -} - -static int conaddr_comparator (void *unused, SocksUdpGwClient_conaddr *v1, SocksUdpGwClient_conaddr *v2) -{ - int r = BAddr_CompareOrder(&v1->remote_addr, &v2->remote_addr); - if (r) { - return r; - } - return BAddr_CompareOrder(&v1->local_addr, &v2->local_addr); -} - -static SocksUdpGwClient_connection * find_connection (SocksUdpGwClient *o, SocksUdpGwClient_conaddr conaddr) -{ - BAVLNode *tree_node = BAVL_LookupExact(&o->connections_tree, &conaddr); - if (!tree_node) { - return NULL; - } - - return UPPER_OBJECT(tree_node, SocksUdpGwClient_connection, connections_tree_node); -} - -static SocksUdpGwClient_connection * reuse_connection (SocksUdpGwClient *o, SocksUdpGwClient_conaddr conaddr) -{ - ASSERT(!find_connection(o, conaddr)) - ASSERT(o->num_connections > 0) - - // get least recently used connection - SocksUdpGwClient_connection *con = UPPER_OBJECT(LinkedList1_GetFirst(&o->connections_list), SocksUdpGwClient_connection, connections_list_node); - - // remove from connections tree by conaddr - BAVL_Remove(&o->connections_tree, &con->connections_tree_node); - - // set new conaddr - con->conaddr = conaddr; - - // insert to connections tree by conaddr - ASSERT_EXECUTE(BAVL_Insert(&o->connections_tree, &con->connections_tree_node, NULL)) - - return con; -} - -static void connection_send (SocksUdpGwClient_connection *o, const uint8_t *data, int data_len) -{ - // get buffer location - uint8_t *out; - if (!BufferWriter_StartPacket(&o->udp_send_writer, &out)) { - BLog(BLOG_ERROR, "out of UDP buffer"); - return; - } - int out_pos = 0; - - // write header - BAddr remote_addr = o->conaddr.remote_addr; - struct socks_udp_header header; - header.rsv = 0; - header.frag = 0; - if (remote_addr.type == BADDR_TYPE_IPV4) { - header.atyp = SOCKS_ATYP_IPV4; - } else { - header.atyp = SOCKS_ATYP_IPV6; - } - memcpy(out + out_pos, &header, sizeof(header)); - out_pos += sizeof(header); - - // write address - switch (remote_addr.type) { - case BADDR_TYPE_IPV4: { - struct udpgw_addr_ipv4 addr_ipv4; - addr_ipv4.addr_ip = remote_addr.ipv4.ip; - addr_ipv4.addr_port = remote_addr.ipv4.port; - memcpy(out + out_pos, &addr_ipv4, sizeof(addr_ipv4)); - out_pos += sizeof(addr_ipv4); - } break; - case BADDR_TYPE_IPV6: { - struct udpgw_addr_ipv6 addr_ipv6; - memcpy(addr_ipv6.addr_ip, remote_addr.ipv6.ip, sizeof(addr_ipv6.addr_ip)); - addr_ipv6.addr_port = remote_addr.ipv6.port; - memcpy(out + out_pos, &addr_ipv6, sizeof(addr_ipv6)); - out_pos += sizeof(addr_ipv6); - } break; - } - - // write packet to buffer - memcpy(out + out_pos, data, data_len); - out_pos += data_len; - - // submit written message - BufferWriter_EndPacket(&o->udp_send_writer, out_pos); -} - -static void connection_first_job_handler (SocksUdpGwClient_connection *con) -{ - connection_send(con, con->first_data, con->first_data_len); -} - -static SocksUdpGwClient_connection *connection_init (SocksUdpGwClient *client, SocksUdpGwClient_conaddr conaddr, const uint8_t *data, int data_len) -{ - // allocate structure - SocksUdpGwClient_connection *o = (SocksUdpGwClient_connection *) malloc(sizeof(*o)); - if (!o) { - BLog(BLOG_ERROR, "malloc failed"); - goto fail; - } - - // init arguments - o->client = client; - o->conaddr = conaddr; - o->first_data = data; - o->first_data_len = data_len; - - // init first job - BPending_Init(&o->first_job, BReactor_PendingGroup(client->reactor), (BPending_handler)connection_first_job_handler, o); - BPending_Set(&o->first_job); - - // init UDP dgram - if (!BDatagram_Init(&o->udp_dgram, client->remote_udpgw_addr.type, client->reactor, o, (BDatagram_handler)dgram_handler)) { - goto fail0; - } - - // set SO_REUSEADDR - if (!BDatagram_SetReuseAddr(&o->udp_dgram, 1)) { - BLog(BLOG_ERROR, "set SO_REUSEADDR failed"); - goto fail1; - } - - // set UDP dgram send address - BIPAddr ipaddr; - memset(&ipaddr, 0, sizeof(ipaddr)); - ipaddr.type = client->remote_udpgw_addr.type; - BDatagram_SetSendAddrs(&o->udp_dgram, client->remote_udpgw_addr, ipaddr); - - // init UDP dgram interfaces - BDatagram_SendAsync_Init(&o->udp_dgram, client->udp_mtu); - BDatagram_RecvAsync_Init(&o->udp_dgram, client->udp_mtu); - - // init UDP writer - BufferWriter_Init(&o->udp_send_writer, client->udp_mtu, BReactor_PendingGroup(client->reactor)); - - // init UDP buffer - if (!PacketBuffer_Init(&o->udp_send_buffer, BufferWriter_GetOutput(&o->udp_send_writer), BDatagram_SendAsync_GetIf(&o->udp_dgram), CONNECTION_UDP_BUFFER_SIZE, BReactor_PendingGroup(client->reactor))) { - BLog(BLOG_ERROR, "PacketBuffer_Init failed"); - goto fail2; - } - - // init UDP recv interface - PacketPassInterface_Init(&o->udp_recv_if, client->udp_mtu, (PacketPassInterface_handler_send)dgram_handler_received, o, BReactor_PendingGroup(client->reactor)); - - // init UDP recv buffer - if (!SinglePacketBuffer_Init(&o->udp_recv_buffer, BDatagram_RecvAsync_GetIf(&o->udp_dgram), &o->udp_recv_if, BReactor_PendingGroup(client->reactor))) { - BLog(BLOG_ERROR, "SinglePacketBuffer_Init failed"); - goto fail3; - } - - // insert to connections tree by conaddr - ASSERT_EXECUTE(BAVL_Insert(&client->connections_tree, &o->connections_tree_node, NULL)); - - // insert to connections list - LinkedList1_Append(&client->connections_list, &o->connections_list_node); - - // increment number of connections - client->num_connections++; - - // succeed to init - return o; - -fail3: - PacketPassInterface_Free(&o->udp_recv_if); - PacketBuffer_Free(&o->udp_send_buffer); -fail2: - BufferWriter_Free(&o->udp_send_writer); - BDatagram_RecvAsync_Free(&o->udp_dgram); - BDatagram_SendAsync_Free(&o->udp_dgram); -fail1: - BDatagram_Free(&o->udp_dgram); - -fail0: - BPending_Free(&o->first_job); - free(o); -fail: - return NULL; -} - -static void connection_free (SocksUdpGwClient_connection *o) -{ - SocksUdpGwClient *client = o->client; - - // decrement number of connections - client->num_connections--; - - // remove from connections list - LinkedList1_Remove(&client->connections_list, &o->connections_list_node); - - // remove from connections tree by conaddr - BAVL_Remove(&client->connections_tree, &o->connections_tree_node); - - // free UDP receive buffer - SinglePacketBuffer_Free(&o->udp_recv_buffer); - - // free UDP receive interface - PacketPassInterface_Free(&o->udp_recv_if); - - // free UDP buffer - PacketBuffer_Free(&o->udp_send_buffer); - - // free UDP writer - BufferWriter_Free(&o->udp_send_writer); - - // free UDP dgram interfaces - BDatagram_RecvAsync_Free(&o->udp_dgram); - BDatagram_SendAsync_Free(&o->udp_dgram); - - // free UDP dgram - BDatagram_Free(&o->udp_dgram); - - // free structure - free(o); -} - -#else - -static void free_socks (SocksUdpGwClient *o) -{ - ASSERT(o->have_socks) - - // disconnect udpgw client from SOCKS - if (o->socks_up) { - UdpGwClient_DisconnectServer(&o->udpgw_client); - } - - // free SOCKS client - BSocksClient_Free(&o->socks_client); - - // set have no SOCKS - o->have_socks = 0; -} - -static void try_connect (SocksUdpGwClient *o) -{ - ASSERT(!o->have_socks) - ASSERT(!BTimer_IsRunning(&o->reconnect_timer)) - - // init SOCKS client - if (!BSocksClient_Init(&o->socks_client, o->socks_server_addr, o->auth_info, o->num_auth_info, o->remote_udpgw_addr, (BSocksClient_handler)socks_client_handler, o, o->reactor)) { - BLog(BLOG_ERROR, "BSocksClient_Init failed"); - goto fail0; - } - - // set have SOCKS - o->have_socks = 1; - - // set SOCKS not up - o->socks_up = 0; - - return; - -fail0: - // set reconnect timer - BReactor_SetTimer(o->reactor, &o->reconnect_timer); -} - -static void reconnect_timer_handler (SocksUdpGwClient *o) -{ - DebugObject_Access(&o->d_obj); - ASSERT(!o->have_socks) - - // try connecting - try_connect(o); -} - -static void socks_client_handler (SocksUdpGwClient *o, int event) -{ - DebugObject_Access(&o->d_obj); - ASSERT(o->have_socks) - - switch (event) { - case BSOCKSCLIENT_EVENT_UP: { - ASSERT(!o->socks_up) - - BLog(BLOG_INFO, "SOCKS up"); - - // connect udpgw client to SOCKS - if (!UdpGwClient_ConnectServer(&o->udpgw_client, BSocksClient_GetSendInterface(&o->socks_client), BSocksClient_GetRecvInterface(&o->socks_client))) { - BLog(BLOG_ERROR, "UdpGwClient_ConnectServer failed"); - goto fail0; - } - - // set SOCKS up - o->socks_up = 1; - - return; - - fail0: - // free SOCKS - free_socks(o); - - // set reconnect timer - BReactor_SetTimer(o->reactor, &o->reconnect_timer); - } break; - - case BSOCKSCLIENT_EVENT_ERROR: - case BSOCKSCLIENT_EVENT_ERROR_CLOSED: { - BLog(BLOG_INFO, "SOCKS error"); - - // free SOCKS - free_socks(o); - - // set reconnect timer - BReactor_SetTimer(o->reactor, &o->reconnect_timer); - } break; - - default: ASSERT(0); - } -} - -static void udpgw_handler_servererror (SocksUdpGwClient *o) -{ - DebugObject_Access(&o->d_obj); - ASSERT(o->have_socks) - ASSERT(o->socks_up) - - BLog(BLOG_ERROR, "client reports server error"); - - // free SOCKS - free_socks(o); - - // set reconnect timer - BReactor_SetTimer(o->reactor, &o->reconnect_timer); -} - -static void udpgw_handler_received (SocksUdpGwClient *o, BAddr local_addr, BAddr remote_addr, const uint8_t *data, int data_len) -{ - DebugObject_Access(&o->d_obj); - - // submit to user - o->handler_received(o->user, local_addr, remote_addr, data, data_len); - return; -} - -#endif - -int SocksUdpGwClient_Init (SocksUdpGwClient *o, int udp_mtu, int max_connections, int send_buffer_size, btime_t keepalive_time, BAddr socks_server_addr, const struct BSocksClient_auth_info *auth_info, size_t num_auth_info, - BAddr remote_udpgw_addr, btime_t reconnect_time, BReactor *reactor, void *user, - SocksUdpGwClient_handler_received handler_received) -{ - // see asserts in UdpGwClient_Init -// ASSERT(!BAddr_IsInvalid(&socks_server_addr)) -#ifndef BADVPN_SOCKS_UDP_RELAY - ASSERT(remote_udpgw_addr.type == BADDR_TYPE_IPV4 || remote_udpgw_addr.type == BADDR_TYPE_IPV6) -#endif - - // init arguments - o->udp_mtu = udp_mtu; - o->socks_server_addr = socks_server_addr; - o->auth_info = auth_info; - o->num_auth_info = num_auth_info; - o->remote_udpgw_addr = remote_udpgw_addr; - o->reactor = reactor; - o->user = user; - o->handler_received = handler_received; - -#ifdef BADVPN_SOCKS_UDP_RELAY - // compute MTUs - o->udpgw_mtu = udpgw_compute_mtu(o->udp_mtu); - o->max_connections = max_connections; - - // limit max connections to number of conid's - if (o->max_connections > UINT16_MAX + 1) { - o->max_connections = UINT16_MAX + 1; - } - - // init connections tree by conaddr - BAVL_Init(&o->connections_tree, OFFSET_DIFF(SocksUdpGwClient_connection, conaddr, connections_tree_node), (BAVL_comparator)conaddr_comparator, NULL); - - // init connections list - LinkedList1_Init(&o->connections_list); -#else - // init udpgw client - if (!UdpGwClient_Init(&o->udpgw_client, udp_mtu, max_connections, send_buffer_size, keepalive_time, o->reactor, o, - (UdpGwClient_handler_servererror)udpgw_handler_servererror, - (UdpGwClient_handler_received)udpgw_handler_received - )) { - goto fail0; - } - - // init reconnect timer - BTimer_Init(&o->reconnect_timer, reconnect_time, (BTimer_handler)reconnect_timer_handler, o); - - // set have no SOCKS - o->have_socks = 0; - - // try connecting - try_connect(o); -#endif - - DebugObject_Init(&o->d_obj); - return 1; - -fail0: - return 0; -} - -void SocksUdpGwClient_Free (SocksUdpGwClient *o) -{ - DebugObject_Free(&o->d_obj); - -#ifdef BADVPN_SOCKS_UDP_RELAY - // free connections - while (!LinkedList1_IsEmpty(&o->connections_list)) { - SocksUdpGwClient_connection *con = UPPER_OBJECT(LinkedList1_GetFirst(&o->connections_list), SocksUdpGwClient_connection, connections_list_node); - connection_free(con); - } -#else - // free SOCKS - if (o->have_socks) { - free_socks(o); - } - - // free reconnect timer - BReactor_RemoveTimer(o->reactor, &o->reconnect_timer); - - // free udpgw client - UdpGwClient_Free(&o->udpgw_client); -#endif -} - -void SocksUdpGwClient_SubmitPacket (SocksUdpGwClient *o, BAddr local_addr, BAddr remote_addr, int is_dns, const uint8_t *data, int data_len) -{ - DebugObject_Access(&o->d_obj); - // see asserts in UdpGwClient_SubmitPacket - -#ifdef BADVPN_SOCKS_UDP_RELAY - ASSERT(local_addr.type == BADDR_TYPE_IPV4 || local_addr.type == BADDR_TYPE_IPV6) - ASSERT(remote_addr.type == BADDR_TYPE_IPV4 || remote_addr.type == BADDR_TYPE_IPV6) - ASSERT(data_len >= 0) - ASSERT(data_len <= o->udp_mtu) - - // build conaddr - SocksUdpGwClient_conaddr conaddr; - conaddr.local_addr = local_addr; - conaddr.remote_addr = remote_addr; - - // lookup connection - SocksUdpGwClient_connection *con = find_connection(o, conaddr); - - // if no connection and can't create a new one, reuse the least recently used une - if (!con && o->num_connections == o->max_connections) { - con = reuse_connection(o, conaddr); - } - - if (!con) { - // create new connection - con = connection_init(o, conaddr, data, data_len); - } else { - // move connection to front of the list - LinkedList1_Remove(&o->connections_list, &con->connections_list_node); - LinkedList1_Append(&o->connections_list, &con->connections_list_node); - - // send packet to existing connection - connection_send(con, data, data_len); - } -#else - // submit to udpgw client - UdpGwClient_SubmitPacket(&o->udpgw_client, local_addr, remote_addr, is_dns, data, data_len); -#endif -} - diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/tun2socks/SocksUdpGwClient.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/tun2socks/SocksUdpGwClient.h deleted file mode 100644 index f69df1f9..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/tun2socks/SocksUdpGwClient.h +++ /dev/null @@ -1,105 +0,0 @@ -/* - * Copyright (C) Ambroz Bizjak - * Contributions: - * Transparent DNS: Copyright (C) Kerem Hadimli - * - * 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 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE 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. - */ - -#ifndef BADVPN_TUN2SOCKS_SOCKSUDPGWCLIENT_H -#define BADVPN_TUN2SOCKS_SOCKSUDPGWCLIENT_H - -#include "misc/debug.h" -#include "base/DebugObject.h" -#include "system/BReactor.h" -#ifdef BADVPN_SOCKS_UDP_RELAY -#include -#include -#include -#include -#include -#include -#include -#include -#include -#else -#include "udpgw_client/UdpGwClient.h" -#include "socksclient/BSocksClient.h" -#endif - -typedef void (*SocksUdpGwClient_handler_received) (void *user, BAddr local_addr, BAddr remote_addr, const uint8_t *data, int data_len); - -typedef struct { - int udp_mtu; - BAddr socks_server_addr; - const struct BSocksClient_auth_info *auth_info; - size_t num_auth_info; - BAddr remote_udpgw_addr; - BReactor *reactor; - void *user; - SocksUdpGwClient_handler_received handler_received; -#ifdef BADVPN_SOCKS_UDP_RELAY - int udpgw_mtu; - int num_connections; - int max_connections; - BAVL connections_tree; - LinkedList1 connections_list; -#else - UdpGwClient udpgw_client; - BTimer reconnect_timer; - int have_socks; - BSocksClient socks_client; - int socks_up; -#endif - DebugObject d_obj; -} SocksUdpGwClient; - -#ifdef BADVPN_SOCKS_UDP_RELAY -typedef struct { - BAddr local_addr; - BAddr remote_addr; -} SocksUdpGwClient_conaddr; - -typedef struct { - SocksUdpGwClient *client; - SocksUdpGwClient_conaddr conaddr; - BPending first_job; - const uint8_t *first_data; - int first_data_len; - BDatagram udp_dgram; - BufferWriter udp_send_writer; - PacketBuffer udp_send_buffer; - SinglePacketBuffer udp_recv_buffer; - PacketPassInterface udp_recv_if; - BAVLNode connections_tree_node; - LinkedList1Node connections_list_node; -} SocksUdpGwClient_connection; -#endif - -int SocksUdpGwClient_Init (SocksUdpGwClient *o, int udp_mtu, int max_connections, int send_buffer_size, btime_t keepalive_time, BAddr socks_server_addr, const struct BSocksClient_auth_info *auth_info, size_t num_auth_info, - BAddr remote_udpgw_addr, btime_t reconnect_time, BReactor *reactor, void *user, - SocksUdpGwClient_handler_received handler_received) WARN_UNUSED; -void SocksUdpGwClient_Free (SocksUdpGwClient *o); -void SocksUdpGwClient_SubmitPacket (SocksUdpGwClient *o, BAddr local_addr, BAddr remote_addr, int is_dns, const uint8_t *data, int data_len); - -#endif diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/tun2socks/tun2socks.c b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/tun2socks/tun2socks.c deleted file mode 100644 index 4e07999a..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/tun2socks/tun2socks.c +++ /dev/null @@ -1,1955 +0,0 @@ -/* - * Copyright (C) Ambroz Bizjak - * Contributions: - * Transparent DNS: Copyright (C) Kerem Hadimli - * - * 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 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE 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. - */ - -#include -#include -#include -#include -#include - -#include "misc/version.h" -#include "misc/loggers_string.h" -#include "misc/loglevel.h" -#include "misc/minmax.h" -#include "misc/offset.h" -#include "misc/dead.h" -#include "misc/ipv4_proto.h" -#include "misc/ipv6_proto.h" -#include "misc/udp_proto.h" -#include "misc/byteorder.h" -#include "misc/balloc.h" -#include "misc/open_standard_streams.h" -#include "misc/read_file.h" -#include "misc/ipaddr6.h" -#include "misc/concat_strings.h" -#include "structure/LinkedList1.h" -#include "base/BLog.h" -#include "system/BReactor.h" -#include "system/BSignal.h" -#include "system/BAddr.h" -#include "system/BNetwork.h" -#include "flow/SinglePacketBuffer.h" -#include "socksclient/BSocksClient.h" -#include "tuntap/BTap.h" -#include "lwip/init.h" -#include "lwip/tcp_impl.h" -#include "lwip/netif.h" -#include "lwip/tcp.h" -#include "tun2socks/SocksUdpGwClient.h" -//#include - -#ifndef BADVPN_USE_WINAPI -#include "base/BLog_syslog.h" -#endif - -#include "tun2socks/tun2socks.h" - -#include "generated/blog_channel_tun2socks.h" - -#define LOGGER_STDOUT 1 -#define LOGGER_SYSLOG 2 - -#define SYNC_DECL \ - BPending sync_mark; \ - -#define SYNC_FROMHERE \ - BPending_Init(&sync_mark, BReactor_PendingGroup(&ss), NULL, NULL); \ - BPending_Set(&sync_mark); - -#define SYNC_BREAK \ - BPending_Free(&sync_mark); - -#define SYNC_COMMIT \ - BReactor_Synchronize(&ss, &sync_mark.base); \ - BPending_Free(&sync_mark); - -// command-line options -struct { - int help; - int version; - int logger; - #ifndef BADVPN_USE_WINAPI - char *logger_syslog_facility; - char *logger_syslog_ident; - #endif - int loglevel; - int loglevels[BLOG_NUM_CHANNELS]; - int fd; - int mtu; - char *netif_ipaddr; - char *netif_netmask; - char *netif_ip6addr; - char *socks_server_addr; - char *username; - char *password; - char *password_file; - int append_source_to_username; - char *udpgw_remote_server_addr; - int udpgw_max_connections; - int udpgw_connection_buffer_size; - int udpgw_transparent_dns; -} options; - -// TCP client -struct tcp_client { - dead_t dead; - dead_t dead_client; - LinkedList1Node list_node; - BAddr local_addr; - BAddr remote_addr; - struct tcp_pcb *pcb; - int client_closed; - uint8_t buf[TCP_WND]; - int buf_used; - char *socks_username; - BSocksClient socks_client; - int socks_up; - int socks_closed; - StreamPassInterface *socks_send_if; - StreamRecvInterface *socks_recv_if; - uint8_t socks_recv_buf[CLIENT_SOCKS_RECV_BUF_SIZE]; - int socks_recv_buf_used; - int socks_recv_buf_sent; - int socks_recv_waiting; - int socks_recv_tcp_pending; -}; - -// IP address of netif -BIPAddr netif_ipaddr; - -// netmask of netif -BIPAddr netif_netmask; - -// IP6 address of netif -struct ipv6_addr netif_ip6addr; - -// SOCKS server address -BAddr socks_server_addr; - -// allocated password file contents -uint8_t *password_file_contents; - -// SOCKS authentication information -struct BSocksClient_auth_info socks_auth_info[2]; -size_t socks_num_auth_info; - -// remote udpgw server addr, if provided -BAddr udpgw_remote_server_addr; - -// reactor -BReactor ss; - -// set to 1 by terminate -int quitting; - -// TUN device -BTap device; - -// device write buffer -uint8_t *device_write_buf; - -// device reading -SinglePacketBuffer device_read_buffer; -PacketPassInterface device_read_interface; - -// udpgw client -SocksUdpGwClient udpgw_client; -int udp_mtu; - -// TCP timer -BTimer tcp_timer; - -// job for initializing lwip -BPending lwip_init_job; - -// lwip netif -int have_netif; -struct netif the_netif; - -// lwip TCP listener -struct tcp_pcb *listener; - -// lwip TCP/IPv6 listener -struct tcp_pcb *listener_ip6; - -// TCP clients -LinkedList1 tcp_clients; - -// number of clients -int num_clients; - -static void terminate (void); -static void print_help (const char *name); -static void print_version (void); -static int parse_arguments (int argc, char *argv[]); -static int process_arguments (void); -static void signal_handler (void *unused); -static BAddr baddr_from_lwip (int is_ipv6, const ipX_addr_t *ipx_addr, uint16_t port_hostorder); -static void lwip_init_job_hadler (void *unused); -static void tcp_timer_handler (void *unused); -static void device_error_handler (void *unused); -static void device_read_handler_send (void *unused, uint8_t *data, int data_len); -static int process_device_udp_packet (uint8_t *data, int data_len); -static err_t netif_init_func (struct netif *netif); -static err_t netif_output_func (struct netif *netif, struct pbuf *p, ip_addr_t *ipaddr); -//static err_t netif_output_ip6_func (struct netif *netif, struct pbuf *p, ip6_addr_t *ipaddr); -static err_t common_netif_output (struct netif *netif, struct pbuf *p); -static err_t netif_input_func (struct pbuf *p, struct netif *inp); -static void client_logfunc (struct tcp_client *client); -static void client_log (struct tcp_client *client, int level, const char *fmt, ...); -static err_t listener_accept_func (void *arg, struct tcp_pcb *newpcb, err_t err); -static void client_handle_freed_client (struct tcp_client *client); -static void client_free_client (struct tcp_client *client); -static void client_abort_client (struct tcp_client *client); -static void client_free_socks (struct tcp_client *client); -static void client_murder (struct tcp_client *client); -static void client_dealloc (struct tcp_client *client); -static void client_err_func (void *arg, err_t err); -static err_t client_recv_func (void *arg, struct tcp_pcb *tpcb, struct pbuf *p, err_t err); -static void client_socks_handler (struct tcp_client *client, int event); -static void client_send_to_socks (struct tcp_client *client); -static void client_socks_send_handler_done (struct tcp_client *client, int data_len); -static void client_socks_recv_initiate (struct tcp_client *client); -static void client_socks_recv_handler_done (struct tcp_client *client, int data_len); -static int client_socks_recv_send_out (struct tcp_client *client); -static err_t client_sent_func (void *arg, struct tcp_pcb *tpcb, u16_t len); -static void udpgw_client_handler_received (void *unused, BAddr local_addr, BAddr remote_addr, const uint8_t *data, int data_len); - -int tun2socks_main (int argc, char **argv, int fd, int mtu) -{ - if (argc <= 0) { - return 1; - } - - // open standard streams - open_standard_streams(); - - // parse command-line arguments - if (!parse_arguments(argc, argv)) { - fprintf(stderr, "Failed to parse arguments\n"); - print_help(argv[0]); - goto fail0; - } - - options.fd = fd; - options.mtu = mtu; - // handle --help and --version - if (options.help) { - print_version(); - print_help(argv[0]); - return 0; - } - if (options.version) { - print_version(); - return 0; - } - - // initialize logger - switch (options.logger) { - case LOGGER_STDOUT: - BLog_InitStdout(); - break; - #ifndef BADVPN_USE_WINAPI - case LOGGER_SYSLOG: - if (!BLog_InitSyslog(options.logger_syslog_ident, options.logger_syslog_facility)) { - fprintf(stderr, "Failed to initialize syslog logger\n"); - goto fail0; - } - break; - #endif - default: - ASSERT(0); - } - - // configure logger channels - for (int i = 0; i < BLOG_NUM_CHANNELS; i++) { - if (options.loglevels[i] >= 0) { - BLog_SetChannelLoglevel(i, options.loglevels[i]); - } - else if (options.loglevel >= 0) { - BLog_SetChannelLoglevel(i, options.loglevel); - } - } - - BLog(BLOG_NOTICE, "initializing "GLOBAL_PRODUCT_NAME" "PROGRAM_NAME" "GLOBAL_VERSION); - - // clear password contents pointer - password_file_contents = NULL; - - // initialize network - if (!BNetwork_GlobalInit()) { - BLog(BLOG_ERROR, "BNetwork_GlobalInit failed"); - goto fail1; - } - - // process arguments - if (!process_arguments()) { - BLog(BLOG_ERROR, "Failed to process arguments"); - goto fail1; - } - - // init time - BTime_Init(); - - // init reactor - if (!BReactor_Init(&ss)) { - BLog(BLOG_ERROR, "BReactor_Init failed"); - goto fail1; - } - - // set not quitting - quitting = 0; - -// // setup signal handler -// if (!BSignal_Init(&ss, signal_handler, NULL)) { -// BLog(BLOG_ERROR, "BSignal_Init failed"); -// goto fail2; -// } - - struct BTap_init_data init_data; - init_data.dev_type = BTAP_DEV_TUN ; - init_data.init_type = BTAP_INIT_FD; - init_data.init.fd.fd = fd; - init_data.init.fd.mtu = mtu; - - if (!BTap_Init2(&device, &ss, init_data, device_error_handler, NULL)) { - // init TUN device -// if (!BTap_Init(&device, &ss, options.fd, options.mtu, device_error_handler, NULL, 1)) { - BLog(BLOG_ERROR, "BTap_Init failed"); - goto fail2; - } - - // NOTE: the order of the following is important: - // first device writing must evaluate, - // then lwip (so it can send packets to the device), - // then device reading (so it can pass received packets to lwip). - - // init device reading - PacketPassInterface_Init(&device_read_interface, BTap_GetMTU(&device), device_read_handler_send, NULL, BReactor_PendingGroup(&ss)); - if (!SinglePacketBuffer_Init(&device_read_buffer, BTap_GetOutput(&device), &device_read_interface, BReactor_PendingGroup(&ss))) { - BLog(BLOG_ERROR, "SinglePacketBuffer_Init failed"); - goto fail4; - } - - if (options.udpgw_remote_server_addr) { - // compute maximum UDP payload size we need to pass through udpgw - udp_mtu = BTap_GetMTU(&device) - (int)(sizeof(struct ipv4_header) + sizeof(struct udp_header)); - if (options.netif_ip6addr) { - int udp_ip6_mtu = BTap_GetMTU(&device) - (int)(sizeof(struct ipv6_header) + sizeof(struct udp_header)); - if (udp_mtu < udp_ip6_mtu) { - udp_mtu = udp_ip6_mtu; - } - } - if (udp_mtu < 0) { - udp_mtu = 0; - } - - // make sure our UDP payloads aren't too large for udpgw - int udpgw_mtu = udpgw_compute_mtu(udp_mtu); - if (udpgw_mtu < 0 || udpgw_mtu > PACKETPROTO_MAXPAYLOAD) { - BLog(BLOG_ERROR, "device MTU is too large for UDP"); - goto fail4a; - } - - // init udpgw client - if (!SocksUdpGwClient_Init(&udpgw_client, udp_mtu, DEFAULT_UDPGW_MAX_CONNECTIONS, options.udpgw_connection_buffer_size, UDPGW_KEEPALIVE_TIME, socks_server_addr, socks_auth_info, socks_num_auth_info, udpgw_remote_server_addr, UDPGW_RECONNECT_TIME, &ss, NULL, udpgw_client_handler_received)) { - BLog(BLOG_ERROR, "SocksUdpGwClient_Init failed"); - goto fail4a; - } - } - - // init lwip init job - BPending_Init(&lwip_init_job, BReactor_PendingGroup(&ss), lwip_init_job_hadler, NULL); - BPending_Set(&lwip_init_job); - - // init device write buffer - if (!(device_write_buf = (uint8_t *)BAlloc(BTap_GetMTU(&device)))) { - BLog(BLOG_ERROR, "BAlloc failed"); - goto fail5; - } - - // init TCP timer - // it won't trigger before lwip is initialized, becuase the lwip init is a job - BTimer_Init(&tcp_timer, TCP_TMR_INTERVAL, tcp_timer_handler, NULL); - BReactor_SetTimer(&ss, &tcp_timer); - - // set no netif - have_netif = 0; - - // set no listener - listener = NULL; - listener_ip6 = NULL; - - // init clients list - LinkedList1_Init(&tcp_clients); - - // init number of clients - num_clients = 0; - - // enter event loop - BLog(BLOG_NOTICE, "entering event loop"); - BReactor_Exec(&ss); - - // free clients - LinkedList1Node *node; - while ((node = LinkedList1_GetFirst(&tcp_clients)) != NULL) { - struct tcp_client *client = UPPER_OBJECT(node, struct tcp_client, list_node); - client_murder(client); - } - - // free listener - if (listener_ip6) { - tcp_close(listener_ip6); - } - if (listener) { - tcp_close(listener); - } - - // free netif - if (have_netif) { - netif_remove(&the_netif); - } - - BReactor_RemoveTimer(&ss, &tcp_timer); - BFree(device_write_buf); -fail5: - BPending_Free(&lwip_init_job); - if (options.udpgw_remote_server_addr) { - SocksUdpGwClient_Free(&udpgw_client); - } -fail4a: - SinglePacketBuffer_Free(&device_read_buffer); -fail4: - PacketPassInterface_Free(&device_read_interface); - BTap_Free(&device); -//fail3: -// BSignal_Finish(); -fail2: - BReactor_Free(&ss); -fail1: - BFree(password_file_contents); - BLog(BLOG_NOTICE, "exiting"); - BLog_Free(); -fail0: - DebugObjectGlobal_Finish(); - - return 1; -} - -void stop_tun2socks() { - terminate(); -} - -void terminate (void) -{ - ASSERT(!quitting) - - BLog(BLOG_NOTICE, "tearing down"); - - // set quitting - quitting = 1; - - // exit event loop - BReactor_Quit(&ss, 1); -} - -void print_help (const char *name) -{ - printf( - "Usage:\n" - " %s\n" - " [--help]\n" - " [--version]\n" - " [--logger <"LOGGERS_STRING">]\n" - #ifndef BADVPN_USE_WINAPI - " (logger=syslog?\n" - " [--syslog-facility ]\n" - " [--syslog-ident ]\n" - " )\n" - #endif - " [--loglevel <0-5/none/error/warning/notice/info/debug>]\n" - " [--channel-loglevel <0-5/none/error/warning/notice/info/debug>] ...\n" - " [--tundev ]\n" - " --netif-ipaddr \n" - " --netif-netmask \n" - " --socks-server-addr \n" - " [--netif-ip6addr ]\n" - " [--username ]\n" - " [--password ]\n" - " [--password-file ]\n" - " [--append-source-to-username]\n" -#ifdef BADVPN_SOCKS_UDP_RELAY - " [--enable-udprelay]\n" - " [--udprelay-max-connections ]\n" -#else - " [--udpgw-remote-server-addr ]\n" - " [--udpgw-max-connections ]\n" - " [--udpgw-connection-buffer-size ]\n" - " [--udpgw-transparent-dns]\n" -#endif - "Address format is a.b.c.d:port (IPv4) or [addr]:port (IPv6).\n", - name - ); -} - -void print_version (void) -{ - printf(GLOBAL_PRODUCT_NAME" "PROGRAM_NAME" "GLOBAL_VERSION"\n"GLOBAL_COPYRIGHT_NOTICE"\n"); -} - -int parse_arguments (int argc, char *argv[]) -{ - if (argc <= 0) { - return 0; - } - - options.help = 0; - options.version = 0; - options.logger = LOGGER_STDOUT; - #ifndef BADVPN_USE_WINAPI - options.logger_syslog_facility = "daemon"; - options.logger_syslog_ident = argv[0]; - #endif - options.loglevel = -1; - for (int i = 0; i < BLOG_NUM_CHANNELS; i++) { - options.loglevels[i] = -1; - } - options.fd = 0; - options.mtu = 4096; - options.netif_ipaddr = NULL; - options.netif_netmask = NULL; - options.netif_ip6addr = NULL; - options.socks_server_addr = NULL; - options.username = NULL; - options.password = NULL; - options.password_file = NULL; - options.append_source_to_username = 0; - options.udpgw_remote_server_addr = NULL; - options.udpgw_max_connections = DEFAULT_UDPGW_MAX_CONNECTIONS; - options.udpgw_connection_buffer_size = DEFAULT_UDPGW_CONNECTION_BUFFER_SIZE; - options.udpgw_transparent_dns = 0; - - int i; - for (i = 1; i < argc; i++) { - char *arg = argv[i]; - if (!strcmp(arg, "--help")) { - options.help = 1; - } - else if (!strcmp(arg, "--version")) { - options.version = 1; - } - else if (!strcmp(arg, "--logger")) { - if (1 >= argc - i) { - fprintf(stderr, "%s: requires an argument\n", arg); - return 0; - } - char *arg2 = argv[i + 1]; - if (!strcmp(arg2, "stdout")) { - options.logger = LOGGER_STDOUT; - } - #ifndef BADVPN_USE_WINAPI - else if (!strcmp(arg2, "syslog")) { - options.logger = LOGGER_SYSLOG; - } - #endif - else { - fprintf(stderr, "%s: wrong argument\n", arg); - return 0; - } - i++; - } - #ifndef BADVPN_USE_WINAPI - else if (!strcmp(arg, "--syslog-facility")) { - if (1 >= argc - i) { - fprintf(stderr, "%s: requires an argument\n", arg); - return 0; - } - options.logger_syslog_facility = argv[i + 1]; - i++; - } - else if (!strcmp(arg, "--syslog-ident")) { - if (1 >= argc - i) { - fprintf(stderr, "%s: requires an argument\n", arg); - return 0; - } - options.logger_syslog_ident = argv[i + 1]; - i++; - } - #endif - else if (!strcmp(arg, "--loglevel")) { - if (1 >= argc - i) { - fprintf(stderr, "%s: requires an argument\n", arg); - return 0; - } - if ((options.loglevel = parse_loglevel(argv[i + 1])) < 0) { - fprintf(stderr, "%s: wrong argument\n", arg); - return 0; - } - i++; - } - else if (!strcmp(arg, "--channel-loglevel")) { - if (2 >= argc - i) { - fprintf(stderr, "%s: requires two arguments\n", arg); - return 0; - } - int channel = BLogGlobal_GetChannelByName(argv[i + 1]); - if (channel < 0) { - fprintf(stderr, "%s: wrong channel argument\n", arg); - return 0; - } - int loglevel = parse_loglevel(argv[i + 2]); - if (loglevel < 0) { - fprintf(stderr, "%s: wrong loglevel argument\n", arg); - return 0; - } - options.loglevels[channel] = loglevel; - i += 2; - } - else if (!strcmp(arg, "--netif-ipaddr")) { - if (1 >= argc - i) { - fprintf(stderr, "%s: requires an argument\n", arg); - return 0; - } - options.netif_ipaddr = argv[i + 1]; - i++; - } - else if (!strcmp(arg, "--netif-netmask")) { - if (1 >= argc - i) { - fprintf(stderr, "%s: requires an argument\n", arg); - return 0; - } - options.netif_netmask = argv[i + 1]; - i++; - } - else if (!strcmp(arg, "--netif-ip6addr")) { - if (1 >= argc - i) { - fprintf(stderr, "%s: requires an argument\n", arg); - return 0; - } - options.netif_ip6addr = argv[i + 1]; - i++; - } - else if (!strcmp(arg, "--socks-server-addr")) { - if (1 >= argc - i) { - fprintf(stderr, "%s: requires an argument\n", arg); - return 0; - } - options.socks_server_addr = argv[i + 1]; - i++; - } - else if (!strcmp(arg, "--username")) { - if (1 >= argc - i) { - fprintf(stderr, "%s: requires an argument\n", arg); - return 0; - } - options.username = argv[i + 1]; - i++; - } - else if (!strcmp(arg, "--password")) { - if (1 >= argc - i) { - fprintf(stderr, "%s: requires an argument\n", arg); - return 0; - } - options.password = argv[i + 1]; - i++; - } - else if (!strcmp(arg, "--password-file")) { - if (1 >= argc - i) { - fprintf(stderr, "%s: requires an argument\n", arg); - return 0; - } - options.password_file = argv[i + 1]; - i++; - } - else if (!strcmp(arg, "--append-source-to-username")) { - options.append_source_to_username = 1; - } -#ifdef BADVPN_SOCKS_UDP_RELAY - else if (!strcmp(arg, "--udpgw-remote-server-addr")) { -// options.udpgw_remote_server_addr = "0.0.0.0:0"; - if (1 >= argc - i) { - fprintf(stderr, "%s: requires an argument\n", arg); - return 0; - } - options.udpgw_remote_server_addr = argv[i + 1]; - i++; -#else - else if (!strcmp(arg, "--udpgw-remote-server-addr")) { - if (1 >= argc - i) { - fprintf(stderr, "%s: requires an argument\n", arg); - return 0; - } - options.udpgw_remote_server_addr = argv[i + 1]; - i++; -#endif - } -#ifdef BADVPN_SOCKS_UDP_RELAY - else if (!strcmp(arg, "--udprelay-max-connections")) { -#else - else if (!strcmp(arg, "--udpgw-max-connections")) { -#endif - if (1 >= argc - i) { - fprintf(stderr, "%s: requires an argument\n", arg); - return 0; - } - if ((options.udpgw_max_connections = atoi(argv[i + 1])) <= 0) { - fprintf(stderr, "%s: wrong argument\n", arg); - return 0; - } - i++; - } -#ifndef BADVPN_SOCKS_UDP_RELAY - else if (!strcmp(arg, "--udpgw-connection-buffer-size")) { - if (1 >= argc - i) { - fprintf(stderr, "%s: requires an argument\n", arg); - return 0; - } - if ((options.udpgw_connection_buffer_size = atoi(argv[i + 1])) <= 0) { - fprintf(stderr, "%s: wrong argument\n", arg); - return 0; - } - i++; - } - else if (!strcmp(arg, "--udpgw-transparent-dns")) { - options.udpgw_transparent_dns = 1; - } -#endif - else { - fprintf(stderr, "unknown option: %s\n", arg); - return 0; - } - } - - if (options.help || options.version) { - return 1; - } - - if (!options.netif_ipaddr) { - fprintf(stderr, "--netif-ipaddr is required\n"); - return 0; - } - - if (!options.netif_netmask) { - fprintf(stderr, "--netif-netmask is required\n"); - return 0; - } - - if (!options.socks_server_addr) { - fprintf(stderr, "--socks-server-addr is required\n"); - return 0; - } - - if (options.username) { - if (!options.password && !options.password_file) { - fprintf(stderr, "username given but password not given\n"); - return 0; - } - - if (options.password && options.password_file) { - fprintf(stderr, "--password and --password-file cannot both be given\n"); - return 0; - } - } - - return 1; -} - -int process_arguments (void) -{ - ASSERT(!password_file_contents) - - // resolve netif ipaddr - if (!BIPAddr_Resolve(&netif_ipaddr, options.netif_ipaddr, 0)) { - BLog(BLOG_ERROR, "netif ipaddr: BIPAddr_Resolve failed"); - return 0; - } - if (netif_ipaddr.type != BADDR_TYPE_IPV4) { - BLog(BLOG_ERROR, "netif ipaddr: must be an IPv4 address"); - return 0; - } - - // resolve netif netmask - if (!BIPAddr_Resolve(&netif_netmask, options.netif_netmask, 0)) { - BLog(BLOG_ERROR, "netif netmask: BIPAddr_Resolve failed"); - return 0; - } - if (netif_netmask.type != BADDR_TYPE_IPV4) { - BLog(BLOG_ERROR, "netif netmask: must be an IPv4 address"); - return 0; - } - - // parse IP6 address - if (options.netif_ip6addr) { - if (!ipaddr6_parse_ipv6_addr(MemRef_MakeCstr(options.netif_ip6addr), &netif_ip6addr)) { - BLog(BLOG_ERROR, "netif ip6addr: incorrect"); - return 0; - } - } - - // resolve SOCKS server address - if (!BAddr_Parse2(&socks_server_addr, options.socks_server_addr, NULL, 0, 0)) { - BLog(BLOG_ERROR, "socks server addr: BAddr_Parse2 failed"); - return 0; - } - - // add none socks authentication method - socks_auth_info[0] = BSocksClient_auth_none(); - socks_num_auth_info = 1; - - // add password socks authentication method - if (options.username) { - const char *password; - size_t password_len; - if (options.password) { - password = options.password; - password_len = strlen(options.password); - } else { - if (!read_file(options.password_file, &password_file_contents, &password_len)) { - BLog(BLOG_ERROR, "failed to read password file"); - return 0; - } - password = (char *)password_file_contents; - } - - socks_auth_info[socks_num_auth_info++] = BSocksClient_auth_password( - options.username, strlen(options.username), - password, password_len - ); - } - - // resolve remote udpgw server address - if (options.udpgw_remote_server_addr) { - if (!BAddr_Parse2(&udpgw_remote_server_addr, options.udpgw_remote_server_addr, NULL, 0, 0)) { -#ifdef BADVPN_SOCKS_UDP_RELAY - BLog(BLOG_ERROR, "udprelay server addr: BAddr_Parse2 failed"); -#else - BLog(BLOG_ERROR, "remote udpgw server addr: BAddr_Parse2 failed"); -#endif - return 0; - } - } - - return 1; -} - -void signal_handler (void *unused) -{ - ASSERT(!quitting) - - BLog(BLOG_NOTICE, "termination requested"); - - terminate(); -} - -BAddr baddr_from_lwip (int is_ipv6, const ipX_addr_t *ipx_addr, uint16_t port_hostorder) -{ - BAddr addr; -// if (is_ipv6) { -// BAddr_InitIPv6(&addr, (uint8_t *)ipx_addr->ip6.addr, hton16(port_hostorder)); -// } else { - BAddr_InitIPv4(&addr, ipx_addr->addr, hton16(port_hostorder)); -// } - return addr; -} - -void lwip_init_job_hadler (void *unused) -{ - ASSERT(!quitting) - ASSERT(netif_ipaddr.type == BADDR_TYPE_IPV4) - ASSERT(netif_netmask.type == BADDR_TYPE_IPV4) - ASSERT(!have_netif) - ASSERT(!listener) - ASSERT(!listener_ip6) - - BLog(BLOG_DEBUG, "lwip init"); - - // NOTE: the device may fail during this, but there's no harm in not checking - // for that at every step - - // init lwip - lwip_init(); - - // make addresses for netif - ip_addr_t addr; - addr.addr = netif_ipaddr.ipv4; - ip_addr_t netmask; - netmask.addr = netif_netmask.ipv4; - ip_addr_t gw; - ip_addr_set_any(&gw); - - // init netif - if (!netif_add(&the_netif, &addr, &netmask, &gw, NULL, netif_init_func, netif_input_func)) { - BLog(BLOG_ERROR, "netif_add failed"); - goto fail; - } - have_netif = 1; - - // set netif up - netif_set_up(&the_netif); - - // set netif pretend TCP - netif_set_pretend_tcp(&the_netif, 1); - - // set netif default - netif_set_default(&the_netif); - -// if (options.netif_ip6addr) { -// // add IPv6 address -// memcpy(netif_ip6_addr(&the_netif, 0), netif_ip6addr.bytes, sizeof(netif_ip6addr.bytes)); -// netif_ip6_addr_set_state(&the_netif, 0, IP6_ADDR_VALID); -// } - - // init listener - struct tcp_pcb *l = tcp_new(); - if (!l) { - BLog(BLOG_ERROR, "tcp_new failed"); - goto fail; - } - - // bind listener - if (tcp_bind_to_netif(l, "ho0") != ERR_OK) { - BLog(BLOG_ERROR, "tcp_bind_to_netif failed"); - tcp_close(l); - goto fail; - } - - // listen listener - if (!(listener = tcp_listen(l))) { - BLog(BLOG_ERROR, "tcp_listen failed"); - tcp_close(l); - goto fail; - } - - // setup listener accept handler - tcp_accept(listener, listener_accept_func); - -// if (options.netif_ip6addr) { -// struct tcp_pcb *l_ip6 = tcp_new_ip6(); -// if (!l_ip6) { -// BLog(BLOG_ERROR, "tcp_new_ip6 failed"); -// goto fail; -// } -// -// if (tcp_bind_to_netif(l_ip6, "ho0") != ERR_OK) { -// BLog(BLOG_ERROR, "tcp_bind_to_netif failed"); -// tcp_close(l_ip6); -// goto fail; -// } -// -// if (!(listener_ip6 = tcp_listen(l_ip6))) { -// BLog(BLOG_ERROR, "tcp_listen failed"); -// tcp_close(l_ip6); -// goto fail; -// } -// -// tcp_accept(listener_ip6, listener_accept_func); -// } - - return; - -fail: - if (!quitting) { - terminate(); - } -} - -void tcp_timer_handler (void *unused) -{ - ASSERT(!quitting) - -// BLog(BLOG_DEBUG, "TCP timer"); - - // schedule next timer - // TODO: calculate timeout so we don't drift - BReactor_SetTimer(&ss, &tcp_timer); - - tcp_tmr(); - return; -} - -void device_error_handler (void *unused) -{ - ASSERT(!quitting) - - BLog(BLOG_ERROR, "device error"); - - terminate(); - return; -} - -void device_read_handler_send (void *unused, uint8_t *data, int data_len) -{ - ASSERT(!quitting) - ASSERT(data_len >= 0) - - BLog(BLOG_DEBUG, "device: received packet"); - - // accept packet - PacketPassInterface_Done(&device_read_interface); - - // process UDP directly - if (process_device_udp_packet(data, data_len)) { - return; - } - - // obtain pbuf - if (data_len > UINT16_MAX) { - BLog(BLOG_WARNING, "device read: packet too large"); - return; - } - struct pbuf *p = pbuf_alloc(PBUF_RAW, data_len, PBUF_POOL); - if (!p) { - BLog(BLOG_WARNING, "device read: pbuf_alloc failed"); - return; - } - - // write packet to pbuf - ASSERT_FORCE(pbuf_take(p, data, data_len) == ERR_OK) - - // pass pbuf to input - if (the_netif.input(p, &the_netif) != ERR_OK) { - BLog(BLOG_WARNING, "device read: input failed"); - pbuf_free(p); - } -} - -int process_device_udp_packet (uint8_t *data, int data_len) -{ - ASSERT(data_len >= 0) - - // do nothing if we don't have udpgw -// if (!options.udpgw_remote_server_addr) { -// goto fail; -// } - - BAddr local_addr; - BAddr remote_addr; - int is_dns = 0; - - uint8_t ip_version = 0; - if (data_len > 0) { - ip_version = (data[0] >> 4); - } - - switch (ip_version) { - case 4: { - // ignore non-UDP packets - if (data_len < sizeof(struct ipv4_header) || data[offsetof(struct ipv4_header, protocol)] != IPV4_PROTOCOL_UDP) { - goto fail; - } - - // parse IPv4 header - struct ipv4_header ipv4_header; - if (!ipv4_check(data, data_len, &ipv4_header, &data, &data_len)) { - goto fail; - } - - // parse UDP - struct udp_header udp_header; - if (!udp_check(data, data_len, &udp_header, &data, &data_len)) { - goto fail; - } - - // verify UDP checksum - uint16_t checksum_in_packet = udp_header.checksum; - udp_header.checksum = 0; - uint16_t checksum_computed = udp_checksum(&udp_header, data, data_len, ipv4_header.source_address, ipv4_header.destination_address); - if (checksum_in_packet != checksum_computed) { - goto fail; - } - - BLog(BLOG_INFO, "UDP: from device %d bytes", data_len); - - // construct addresses - BAddr_InitIPv4(&local_addr, ipv4_header.source_address, udp_header.source_port); - BAddr_InitIPv4(&remote_addr, ipv4_header.destination_address, udp_header.dest_port); - - // if transparent DNS is enabled, any packet arriving at out netif - // address to port 53 is considered a DNS packet -// is_dns = (options.udpgw_transparent_dns && -// ipv4_header.destination_address == netif_ipaddr.ipv4 && -// udp_header.dest_port == hton16(53)); -// is_dns = 0; - } break; - - case 6: { - // ignore if IPv6 support is disabled - if (!options.netif_ip6addr) { - goto fail; - } - - // ignore non-UDP packets - if (data_len < sizeof(struct ipv6_header) || data[offsetof(struct ipv6_header, next_header)] != IPV6_NEXT_UDP) { - goto fail; - } - - // parse IPv6 header - struct ipv6_header ipv6_header; - if (!ipv6_check(data, data_len, &ipv6_header, &data, &data_len)) { - goto fail; - } - - // parse UDP - struct udp_header udp_header; - if (!udp_check(data, data_len, &udp_header, &data, &data_len)) { - goto fail; - } - - // verify UDP checksum - uint16_t checksum_in_packet = udp_header.checksum; - udp_header.checksum = 0; - uint16_t checksum_computed = udp_ip6_checksum(&udp_header, data, data_len, ipv6_header.source_address, ipv6_header.destination_address); - if (checksum_in_packet != checksum_computed) { - goto fail; - } - - BLog(BLOG_INFO, "UDP/IPv6: from device %d bytes", data_len); - - // construct addresses - BAddr_InitIPv6(&local_addr, ipv6_header.source_address, udp_header.source_port); - BAddr_InitIPv6(&remote_addr, ipv6_header.destination_address, udp_header.dest_port); - - // TODO dns - is_dns = 0; - } break; - - default: { - goto fail; - } break; - } - - // check payload length - if (data_len > udp_mtu) { -#ifdef BADVPN_SOCKS_UDP_RELAY - BLog(BLOG_ERROR, "packet is too large, cannot send to udprelay"); -#else - BLog(BLOG_ERROR, "packet is too large, cannot send to udpgw"); -#endif - goto fail; - } - - // submit packet to udpgw - SocksUdpGwClient_SubmitPacket(&udpgw_client, local_addr, remote_addr, is_dns, data, data_len); - - return 1; - -fail: - return 0; -} - -err_t netif_init_func (struct netif *netif) -{ - BLog(BLOG_DEBUG, "netif func init"); - - netif->name[0] = 'h'; - netif->name[1] = 'o'; - netif->output = netif_output_func; -// netif->output_ip6 = netif_output_ip6_func; - netif->mtu = options.mtu; - - return ERR_OK; -} - -err_t netif_output_func (struct netif *netif, struct pbuf *p, ip_addr_t *ipaddr) -{ - return common_netif_output(netif, p); -} - -//err_t netif_output_ip6_func (struct netif *netif, struct pbuf *p, ip6_addr_t *ipaddr) -//{ -// return common_netif_output(netif, p); -//} - -err_t common_netif_output (struct netif *netif, struct pbuf *p) -{ - SYNC_DECL - - BLog(BLOG_DEBUG, "device write: send packet"); - - if (quitting) { - return ERR_OK; - } - - // if there is just one chunk, send it directly, else via buffer - if (!p->next) { - if (p->len > BTap_GetMTU(&device)) { - BLog(BLOG_WARNING, "netif func output: no space left"); - goto out; - } - - SYNC_FROMHERE - BTap_Send(&device, (uint8_t *)p->payload, p->len); - SYNC_COMMIT - } else { - int len = 0; - do { - if (p->len > BTap_GetMTU(&device) - len) { - BLog(BLOG_WARNING, "netif func output: no space left"); - goto out; - } - memcpy(device_write_buf + len, p->payload, p->len); - len += p->len; - } while ((p = p->next) != NULL); - - SYNC_FROMHERE - BTap_Send(&device, device_write_buf, len); - SYNC_COMMIT - } - -out: - return ERR_OK; -} - -err_t netif_input_func (struct pbuf *p, struct netif *inp) -{ - uint8_t ip_version = 0; - if (p->len > 0) { - ip_version = (((uint8_t *)p->payload)[0] >> 4); - } - - switch (ip_version) { - case 4: { - return ip_input(p, inp); - } break; - case 6: { -// if (options.netif_ip6addr) { -// return ip6_input(p, inp); -// } - } break; - } - - pbuf_free(p); - return ERR_OK; -} - -void client_logfunc (struct tcp_client *client) -{ - char local_addr_s[BADDR_MAX_PRINT_LEN]; - BAddr_Print(&client->local_addr, local_addr_s); - char remote_addr_s[BADDR_MAX_PRINT_LEN]; - BAddr_Print(&client->remote_addr, remote_addr_s); - - BLog_Append("%05d (%s %s): ", num_clients, local_addr_s, remote_addr_s); -} - -void client_log (struct tcp_client *client, int level, const char *fmt, ...) -{ - va_list vl; - va_start(vl, fmt); - BLog_LogViaFuncVarArg((BLog_logfunc)client_logfunc, client, BLOG_CURRENT_CHANNEL, level, fmt, vl); - va_end(vl); -} - -err_t listener_accept_func (void *arg, struct tcp_pcb *newpcb, err_t err) -{ - ASSERT(err == ERR_OK) - - // signal accepted - struct tcp_pcb *this_listener = (PCB_ISIPV6(newpcb) ? listener_ip6 : listener); - tcp_accepted(this_listener); - - // allocate client structure - struct tcp_client *client = (struct tcp_client *)malloc(sizeof(*client)); - if (!client) { - BLog(BLOG_ERROR, "listener accept: malloc failed"); - goto fail0; - } - client->socks_username = NULL; - - SYNC_DECL - SYNC_FROMHERE - - // read addresses - client->local_addr = baddr_from_lwip(PCB_ISIPV6(newpcb), &newpcb->local_ip, newpcb->local_port); - client->remote_addr = baddr_from_lwip(PCB_ISIPV6(newpcb), &newpcb->remote_ip, newpcb->remote_port); - - // get destination address - BAddr addr = client->local_addr; -#ifdef OVERRIDE_DEST_ADDR - ASSERT_FORCE(BAddr_Parse2(&addr, OVERRIDE_DEST_ADDR, NULL, 0, 1)) -#endif - - // add source address to username if requested - if (options.username && options.append_source_to_username) { - char addr_str[BADDR_MAX_PRINT_LEN]; - BAddr_Print(&client->remote_addr, addr_str); - client->socks_username = concat_strings(3, options.username, "@", addr_str); - if (!client->socks_username) { - goto fail1; - } - socks_auth_info[1].password.username = client->socks_username; - socks_auth_info[1].password.username_len = strlen(client->socks_username); - } - - // init SOCKS - if (!BSocksClient_Init(&client->socks_client, socks_server_addr, socks_auth_info, socks_num_auth_info, - addr, (BSocksClient_handler)client_socks_handler, client, &ss)) { - BLog(BLOG_ERROR, "listener accept: BSocksClient_Init failed"); - goto fail1; - } - - // init dead vars - DEAD_INIT(client->dead); - DEAD_INIT(client->dead_client); - - // add to linked list - LinkedList1_Append(&tcp_clients, &client->list_node); - - // increment counter - ASSERT(num_clients >= 0) - num_clients++; - - // set pcb - client->pcb = newpcb; - - // set client not closed - client->client_closed = 0; - - // setup handler argument - tcp_arg(client->pcb, client); - - // setup handlers - tcp_err(client->pcb, client_err_func); - tcp_recv(client->pcb, client_recv_func); - - // setup buffer - client->buf_used = 0; - - // set SOCKS not up, not closed - client->socks_up = 0; - client->socks_closed = 0; - - client_log(client, BLOG_INFO, "accepted"); - - DEAD_ENTER(client->dead_client) - SYNC_COMMIT - DEAD_LEAVE2(client->dead_client) - if (DEAD_KILLED) { - return ERR_ABRT; - } - - return ERR_OK; - -fail1: - SYNC_BREAK - free(client->socks_username); - free(client); -fail0: - return ERR_MEM; -} - -void client_handle_freed_client (struct tcp_client *client) -{ - ASSERT(!client->client_closed) - - // pcb was taken care of by the caller - - // kill client dead var - DEAD_KILL(client->dead_client); - - // set client closed - client->client_closed = 1; - - // if we have data to be sent to SOCKS and can send it, keep sending - if (client->buf_used > 0 && !client->socks_closed) { - client_log(client, BLOG_INFO, "waiting untill buffered data is sent to SOCKS"); - } else { - if (!client->socks_closed) { - client_free_socks(client); - } else { - client_dealloc(client); - } - } -} - -void client_free_client (struct tcp_client *client) -{ - ASSERT(!client->client_closed) - - // remove callbacks - tcp_err(client->pcb, NULL); - tcp_recv(client->pcb, NULL); - tcp_sent(client->pcb, NULL); - - // free pcb - err_t err = tcp_close(client->pcb); - if (err != ERR_OK) { - client_log(client, BLOG_ERROR, "tcp_close failed (%d)", err); - tcp_abort(client->pcb); - } - - client_handle_freed_client(client); -} - -void client_abort_client (struct tcp_client *client) -{ - ASSERT(!client->client_closed) - - // remove callbacks - tcp_err(client->pcb, NULL); - tcp_recv(client->pcb, NULL); - tcp_sent(client->pcb, NULL); - - // free pcb - tcp_abort(client->pcb); - - client_handle_freed_client(client); -} - -void client_free_socks (struct tcp_client *client) -{ - ASSERT(!client->socks_closed) - - // stop sending to SOCKS - if (client->socks_up) { - // stop receiving from client - if (!client->client_closed) { - tcp_recv(client->pcb, NULL); - } - } - - // free SOCKS - BSocksClient_Free(&client->socks_client); - - // set SOCKS closed - client->socks_closed = 1; - - // if we have data to be sent to the client and we can send it, keep sending - if (client->socks_up && (client->socks_recv_buf_used >= 0 || client->socks_recv_tcp_pending > 0) && !client->client_closed) { - client_log(client, BLOG_INFO, "waiting until buffered data is sent to client"); - } else { - if (!client->client_closed) { - client_free_client(client); - } else { - client_dealloc(client); - } - } -} - -void client_murder (struct tcp_client *client) -{ - // free client - if (!client->client_closed) { - // remove callbacks - tcp_err(client->pcb, NULL); - tcp_recv(client->pcb, NULL); - tcp_sent(client->pcb, NULL); - - // abort - tcp_abort(client->pcb); - - // kill client dead var - DEAD_KILL(client->dead_client); - - // set client closed - client->client_closed = 1; - } - - // free SOCKS - if (!client->socks_closed) { - // free SOCKS - BSocksClient_Free(&client->socks_client); - - // set SOCKS closed - client->socks_closed = 1; - } - - // dealloc entry - client_dealloc(client); -} - -void client_dealloc (struct tcp_client *client) -{ - ASSERT(client->client_closed) - ASSERT(client->socks_closed) - - // decrement counter - ASSERT(num_clients > 0) - num_clients--; - - // remove client entry - LinkedList1_Remove(&tcp_clients, &client->list_node); - - // kill dead var - DEAD_KILL(client->dead); - - // free memory - free(client->socks_username); - free(client); -} - -void client_err_func (void *arg, err_t err) -{ - struct tcp_client *client = (struct tcp_client *)arg; - ASSERT(!client->client_closed) - - client_log(client, BLOG_INFO, "client_err_func client error (%d)", (int)err); - - // the pcb was taken care of by the caller - client_handle_freed_client(client); -} - -err_t client_recv_func (void *arg, struct tcp_pcb *tpcb, struct pbuf *p, err_t err) -{ - - struct tcp_client *client = (struct tcp_client *)arg; - client_log(client, BLOG_INFO, "client_recv_func client received (%d)", sizeof(client->buf)); - - ASSERT(!client->client_closed) - ASSERT(err == ERR_OK) // checked in lwIP source. Otherwise, I've no idea what should - // be done with the pbuf in case of an error. - - if (!p) { - client_log(client, BLOG_INFO, "client closed"); - client_free_client(client); - return ERR_ABRT; - } - - ASSERT(p->tot_len > 0) - - // check if we have enough buffer - if (p->tot_len > sizeof(client->buf) - client->buf_used) { - client_log(client, BLOG_ERROR, "no buffer for data !?!"); - return ERR_MEM; - } - - // copy data to buffer - ASSERT_EXECUTE(pbuf_copy_partial(p, client->buf + client->buf_used, p->tot_len, 0) == p->tot_len) - client->buf_used += p->tot_len; - - // if there was nothing in the buffer before, and SOCKS is up, start send data - if (client->buf_used == p->tot_len && client->socks_up) { - ASSERT(!client->socks_closed) // this callback is removed when SOCKS is closed - - SYNC_DECL - SYNC_FROMHERE - client_send_to_socks(client); - DEAD_ENTER(client->dead_client) - SYNC_COMMIT - DEAD_LEAVE2(client->dead_client) - if (DEAD_KILLED) { - return ERR_ABRT; - } - } - - // free pbuff - pbuf_free(p); - - return ERR_OK; -} - -void client_socks_handler (struct tcp_client *client, int event) -{ - ASSERT(!client->socks_closed) -#if SOCKS_DATA_LOG_ENABLE - client_log(client, BLOG_DEBUG, "tun2socks client_socks_handler event: %d", event); -#endif - switch (event) { - case BSOCKSCLIENT_EVENT_ERROR: { - client_log(client, BLOG_INFO, "SOCKS error"); - - client_free_socks(client); - } break; - - case BSOCKSCLIENT_EVENT_UP: { - ASSERT(!client->socks_up) - - client_log(client, BLOG_INFO, "tun2socks SOCKS up"); - - // init sending - client->socks_send_if = BSocksClient_GetSendInterface(&client->socks_client); - StreamPassInterface_Sender_Init(client->socks_send_if, (StreamPassInterface_handler_done)client_socks_send_handler_done, client); - client_log(client, BLOG_INFO, "tun2socks SOCKS init 0"); - // init receiving - client->socks_recv_if = BSocksClient_GetRecvInterface(&client->socks_client); - StreamRecvInterface_Receiver_Init(client->socks_recv_if, (StreamRecvInterface_handler_done)client_socks_recv_handler_done, client); - client->socks_recv_buf_used = -1; - client->socks_recv_tcp_pending = 0; - client_log(client, BLOG_INFO, "tun2socks SOCKS init 1"); - if (!client->client_closed) { - client_log(client, BLOG_INFO, "tun2socks SOCKS init 2"); - tcp_sent(client->pcb, client_sent_func); - } - client_log(client, BLOG_INFO, "tun2socks SOCKS init 3"); - // set up - client->socks_up = 1; - - // start sending data if there is any - if (client->buf_used > 0) { - client_log(client, BLOG_INFO, "tun2socks SOCKS init 4"); -// client->buf_used = 0; - client_send_to_socks(client); - } - client_log(client, BLOG_INFO, "tun2socks SOCKS init 5"); - // start receiving data if client is still up - if (!client->client_closed) { - client_log(client, BLOG_INFO, "tun2socks SOCKS init 6"); - client_socks_recv_initiate(client); - } - } break; - - case BSOCKSCLIENT_EVENT_ERROR_CLOSED: { - ASSERT(client->socks_up) - - client_log(client, BLOG_INFO, "SOCKS closed"); - - client_free_socks(client); - } break; - - default: - ASSERT(0); - } -} - -void client_send_to_socks (struct tcp_client *client) -{ - ASSERT(!client->socks_closed) - ASSERT(client->socks_up) - ASSERT(client->buf_used > 0) - -#if SOCKS_DATA_LOG_ENABLE - client_log(client, BLOG_DEBUG, "tun2socks client_send_to_socks data: %@", client->buf_used); -#endif - // schedule sending - StreamPassInterface_Sender_Send(client->socks_send_if, client->buf, client->buf_used); -} - -void client_socks_send_handler_done (struct tcp_client *client, int data_len) -{ - ASSERT(!client->socks_closed) - ASSERT(client->socks_up) - ASSERT(client->buf_used > 0) - ASSERT(data_len > 0) - ASSERT(data_len <= client->buf_used) - - // remove sent data from buffer - memmove(client->buf, client->buf + data_len, client->buf_used - data_len); - client->buf_used -= data_len; - - if (!client->client_closed) { - // confirm sent data - tcp_recved(client->pcb, data_len); - } - - if (client->buf_used > 0) { - // send any further data - StreamPassInterface_Sender_Send(client->socks_send_if, client->buf, client->buf_used); - } - else if (client->client_closed) { - // client was closed we've sent everything we had buffered; we're done with it - client_log(client, BLOG_INFO, "removing after client went down"); - - client_free_socks(client); - } -} - -void client_socks_recv_initiate (struct tcp_client *client) -{ - ASSERT(!client->client_closed) - ASSERT(!client->socks_closed) - ASSERT(client->socks_up) - ASSERT(client->socks_recv_buf_used == -1) - - StreamRecvInterface_Receiver_Recv(client->socks_recv_if, client->socks_recv_buf, sizeof(client->socks_recv_buf)); -} - -void client_socks_recv_handler_done (struct tcp_client *client, int data_len) -{ - ASSERT(data_len > 0) - ASSERT(data_len <= sizeof(client->socks_recv_buf)) - ASSERT(!client->socks_closed) - ASSERT(client->socks_up) - ASSERT(client->socks_recv_buf_used == -1) - - // if client was closed, stop receiving - if (client->client_closed) { - return; - } - - // set amount of data in buffer - client->socks_recv_buf_used = data_len; - client->socks_recv_buf_sent = 0; - client->socks_recv_waiting = 0; - - // send to client - client_log(client, BLOG_INFO, "client_socks_recv_handler_done prepare send to client: %d", data_len); - if (client_socks_recv_send_out(client) < 0) { - client_log(client, BLOG_INFO, "client_socks_recv_send_out error"); - return; - } - - // continue receiving if needed - if (client->socks_recv_buf_used == -1) { - client_log(client, BLOG_INFO, "client_socks_recv_send_out continue receiving"); - client_socks_recv_initiate(client); - }else{ -// client_socks_recv_initiate(client); - client_log(client, BLOG_INFO, "client_socks_recv_send_out continue error"); - } -} - -int client_socks_recv_send_out (struct tcp_client *client) -{ - ASSERT(!client->client_closed) - ASSERT(client->socks_up) - ASSERT(client->socks_recv_buf_used > 0) - ASSERT(client->socks_recv_buf_sent < client->socks_recv_buf_used) - ASSERT(!client->socks_recv_waiting) - - // return value -1 means tcp_abort() was done, - // 0 means it wasn't and the client (pcb) is still up - - do { - int to_write = bmin_int(client->socks_recv_buf_used - client->socks_recv_buf_sent, tcp_sndbuf(client->pcb)); -#if SOCKS_DATA_LOG_ENABLE - client_log(client, BLOG_INFO, "tun2socks client_socks_recv_send_out data", to_write); -#endif - if (to_write == 0) { -#if SOCKS_DATA_LOG_ENABLE - client_log(client, BLOG_INFO, "tun2socks client_socks_recv_send_out to_write zero, break"); -#endif - break; - } - err_t err = tcp_write(client->pcb, client->socks_recv_buf + client->socks_recv_buf_sent, to_write, TCP_WRITE_FLAG_COPY); -#if SOCKS_DATA_LOG_ENABLE - client_log(client, BLOG_INFO, "tun2socks client_socks_recv_send_out tcp write err: %d", err); -#endif - if (err != ERR_OK) { - if (err == ERR_MEM) { -#if SOCKS_DATA_LOG_ENABLE - client_log(client, BLOG_INFO, "tun2socks client_socks_recv_send_out tcp write error error_mem"); -#endif - break; - } -#if SOCKS_DATA_LOG_ENABLE - client_log(client, BLOG_INFO, "tcp_write failed (%d)", (int)err); -#endif - client_abort_client(client); - return -1; - } - - client->socks_recv_buf_sent += to_write; - client->socks_recv_tcp_pending += to_write; - } while (client->socks_recv_buf_sent < client->socks_recv_buf_used); -#if SOCKS_DATA_LOG_ENABLE - client_log(client, BLOG_INFO, "tun2socks client_socks_recv_send_out begin tcp_output"); -#endif - // start sending now - err_t err = tcp_output(client->pcb); -#if SOCKS_DATA_LOG_ENABLE - client_log(client, BLOG_INFO, "tun2socks client_socks_recv_send_out begin tcp_output err: %d", err); -#endif - if (err != ERR_OK) { -#if SOCKS_DATA_LOG_ENABLE - client_log(client, BLOG_INFO, "tcp_output failed (%d)", (int)err); -#endif - client_abort_client(client); - return -1; - } - - // more data to queue? - if (client->socks_recv_buf_sent < client->socks_recv_buf_used) { - if (client->socks_recv_tcp_pending == 0) { - client_log(client, BLOG_ERROR, "can't queue data, but all data was confirmed !?!"); - - client_abort_client(client); - return -1; - } - - // set waiting, continue in client_sent_func - client->socks_recv_waiting = 1; - return 0; - } - - // everything was queued - client->socks_recv_buf_used = -1; -// client->socks_recv_buf_used = 0; - - return 0; -} - -err_t client_sent_func (void *arg, struct tcp_pcb *tpcb, u16_t len) -{ - struct tcp_client *client = (struct tcp_client *)arg; - - ASSERT(!client->client_closed) - ASSERT(client->socks_up) - ASSERT(len > 0) - ASSERT(len <= client->socks_recv_tcp_pending) - - // decrement pending - client->socks_recv_tcp_pending -= len; - - // continue queuing - if (client->socks_recv_buf_used > 0) { - ASSERT(client->socks_recv_waiting) - ASSERT(client->socks_recv_buf_sent < client->socks_recv_buf_used) - - // set not waiting - client->socks_recv_waiting = 0; - - // possibly send more data - if (client_socks_recv_send_out(client) < 0) { - return ERR_ABRT; - } - - // we just queued some data, so it can't have been confirmed yet - ASSERT(client->socks_recv_tcp_pending > 0) - - // continue receiving if needed - if (client->socks_recv_buf_used == -1 && !client->socks_closed) { - SYNC_DECL - SYNC_FROMHERE - client_socks_recv_initiate(client); - DEAD_ENTER(client->dead_client) - SYNC_COMMIT - DEAD_LEAVE2(client->dead_client) - if (DEAD_KILLED) { - return ERR_ABRT; - } - } - - return ERR_OK; - } - - // have we sent everything after SOCKS was closed? - if (client->socks_closed && client->socks_recv_tcp_pending == 0) { - client_log(client, BLOG_INFO, "removing after SOCKS went down"); - client_free_client(client); - return ERR_ABRT; - } - - return ERR_OK; -} - -void udpgw_client_handler_received (void *unused, BAddr local_addr, BAddr remote_addr, const uint8_t *data, int data_len) -{ - ASSERT(options.udpgw_remote_server_addr) - ASSERT(local_addr.type == BADDR_TYPE_IPV4 || local_addr.type == BADDR_TYPE_IPV6) - ASSERT(local_addr.type == remote_addr.type) - ASSERT(data_len >= 0) - - int packet_length = 0; - - switch (local_addr.type) { - case BADDR_TYPE_IPV4: { -#ifdef BADVPN_SOCKS_UDP_RELAY - BLog(BLOG_INFO, "UDP: from udprelay %d bytes", data_len); -#else - BLog(BLOG_INFO, "UDP: from udpgw %d bytes", data_len); -#endif - - if (data_len > UINT16_MAX - (sizeof(struct ipv4_header) + sizeof(struct udp_header)) || - data_len > BTap_GetMTU(&device) - (int)(sizeof(struct ipv4_header) + sizeof(struct udp_header)) - ) { - BLog(BLOG_ERROR, "UDP: packet is too large"); - return; - } - - // build IP header - struct ipv4_header iph; - iph.version4_ihl4 = IPV4_MAKE_VERSION_IHL(sizeof(iph)); - iph.ds = hton8(0); - iph.total_length = hton16(sizeof(iph) + sizeof(struct udp_header) + data_len); - iph.identification = hton16(0); - iph.flags3_fragmentoffset13 = hton16(0); - iph.ttl = hton8(64); - iph.protocol = hton8(IPV4_PROTOCOL_UDP); - iph.checksum = hton16(0); - iph.source_address = remote_addr.ipv4.ip; - iph.destination_address = local_addr.ipv4.ip; - iph.checksum = ipv4_checksum(&iph, NULL, 0); - - // build UDP header - struct udp_header udph; - udph.source_port = remote_addr.ipv4.port; - udph.dest_port = local_addr.ipv4.port; - udph.length = hton16(sizeof(udph) + data_len); - udph.checksum = hton16(0); - udph.checksum = udp_checksum(&udph, data, data_len, iph.source_address, iph.destination_address); - - // write packet - memcpy(device_write_buf, &iph, sizeof(iph)); - memcpy(device_write_buf + sizeof(iph), &udph, sizeof(udph)); - memcpy(device_write_buf + sizeof(iph) + sizeof(udph), data, data_len); - packet_length = sizeof(iph) + sizeof(udph) + data_len; - } break; - - case BADDR_TYPE_IPV6: { -#ifdef BADVPN_SOCKS_UDP_RELAY - BLog(BLOG_INFO, "UDP/IPv6: from udprelay %d bytes", data_len); -#else - BLog(BLOG_INFO, "UDP/IPv6: from udpgw %d bytes", data_len); -#endif - - if (!options.netif_ip6addr) { -#ifdef BADVPN_SOCKS_UDP_RELAY - BLog(BLOG_ERROR, "got IPv6 packet from udprelay but IPv6 is disabled"); -#else - BLog(BLOG_ERROR, "got IPv6 packet from udpgw but IPv6 is disabled"); -#endif - return; - } - - if (data_len > UINT16_MAX - sizeof(struct udp_header) || - data_len > BTap_GetMTU(&device) - (int)(sizeof(struct ipv6_header) + sizeof(struct udp_header)) - ) { - BLog(BLOG_ERROR, "UDP/IPv6: packet is too large"); - return; - } - - // build IPv6 header - struct ipv6_header iph; - iph.version4_tc4 = hton8((6 << 4)); - iph.tc4_fl4 = hton8(0); - iph.fl = hton16(0); - iph.payload_length = hton16(sizeof(struct udp_header) + data_len); - iph.next_header = hton8(IPV6_NEXT_UDP); - iph.hop_limit = hton8(64); - memcpy(iph.source_address, remote_addr.ipv6.ip, 16); - memcpy(iph.destination_address, local_addr.ipv6.ip, 16); - - // build UDP header - struct udp_header udph; - udph.source_port = remote_addr.ipv6.port; - udph.dest_port = local_addr.ipv6.port; - udph.length = hton16(sizeof(udph) + data_len); - udph.checksum = hton16(0); - udph.checksum = udp_ip6_checksum(&udph, data, data_len, iph.source_address, iph.destination_address); - - // write packet - memcpy(device_write_buf, &iph, sizeof(iph)); - memcpy(device_write_buf + sizeof(iph), &udph, sizeof(udph)); - memcpy(device_write_buf + sizeof(iph) + sizeof(udph), data, data_len); - packet_length = sizeof(iph) + sizeof(udph) + data_len; - } break; - } - - // submit packet - BTap_Send(&device, device_write_buf, packet_length); -} diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/tun2socks/tun2socks.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/tun2socks/tun2socks.h deleted file mode 100644 index 87bb5374..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/tun2socks/tun2socks.h +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright (C) Ambroz Bizjak - * - * 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 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE 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. - */ - - -// name of the program -#define PROGRAM_NAME "tun2socks" - -// size of temporary buffer for passing data from the SOCKS server to TCP for sending -#define CLIENT_SOCKS_RECV_BUF_SIZE 2048 - -// maximum number of udpgw connections -#define DEFAULT_UDPGW_MAX_CONNECTIONS 256 - -// udpgw per-connection send buffer size, in number of packets -#define DEFAULT_UDPGW_CONNECTION_BUFFER_SIZE 8 - -// udpgw reconnect time after connection fails -#define UDPGW_RECONNECT_TIME 5000 - -// udpgw keepalive sending interval -#define UDPGW_KEEPALIVE_TIME 10000 - -// option to override the destination addresses to give the SOCKS server -//#define OVERRIDE_DEST_ADDR "10.111.0.2:2000" - -extern int tun2socks_main (int argc, char **argv, int fd, int mtu); -extern void stop_tun2socks(); \ No newline at end of file diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/tuntap/BTap.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/tuntap/BTap.h deleted file mode 100644 index 555f3143..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/tuntap/BTap.h +++ /dev/null @@ -1,196 +0,0 @@ -/** - * @file BTap.h - * @author Ambroz Bizjak - * - * @section LICENSE - * - * 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 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE 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. - * - * @section DESCRIPTION - * - * TAP device abstraction. - */ - -#ifndef BADVPN_TUNTAP_BTAP_H -#define BADVPN_TUNTAP_BTAP_H - -#if (defined(BADVPN_USE_WINAPI) + defined(BADVPN_LINUX) + defined(BADVPN_FREEBSD)) != 1 -#error Unknown TAP backend or too many TAP backends -#endif - -#include - -#ifdef BADVPN_USE_WINAPI -#else -#include -#endif - -#include "misc/debug.h" -#include "misc/debugerror.h" -#include "base/DebugObject.h" -#include "system/BReactor.h" -#include "flow/PacketRecvInterface.h" - -#define BTAP_ETHERNET_HEADER_LENGTH 14 - -/** - * Handler called when an error occurs on the device. - * The object must be destroyed from the job context of this - * handler, and no further I/O may occur. - * - * @param user as in {@link BTap_Init} - */ -typedef void (*BTap_handler_error) (void *used); - -typedef struct { - BReactor *reactor; - BTap_handler_error handler_error; - void *handler_error_user; - int frame_mtu; - PacketRecvInterface output; - uint8_t *output_packet; - -#ifdef BADVPN_USE_WINAPI - HANDLE device; - BReactorIOCPOverlapped send_olap; - BReactorIOCPOverlapped recv_olap; -#else - int close_fd; - int fd; - BFileDescriptor bfd; - int poll_events; -#endif - - DebugError d_err; - DebugObject d_obj; -} BTap; - -/** - * Initializes the TAP device. - * - * @param o the object - * @param BReactor {@link BReactor} we live in - * @param devname name of the devece to open. - * On Linux: a network interface name. If it is NULL, no - * specific device will be requested, and the operating system - * may create a new device. - * On Windows: a string "component_id:device_name", where - * component_id is a string identifying the driver, and device_name - * is the name of the network interface. If component_id is empty, - * a hardcoded default will be used instead. If device_name is empty, - * the first device found with a matching component_id will be used. - * Specifying a NULL devname is equivalent to specifying ":". - * @param handler_error error handler function - * @param handler_error_user value passed to error handler - * @param tun whether to create a TUN (IP) device or a TAP (Ethernet) device. Must be 0 or 1. - * @return 1 on success, 0 on failure - */ -int BTap_Init (BTap *o, BReactor *reactor, int fd, int mtu, BTap_handler_error handler_error, void *handler_error_user, int tun); - -enum BTap_dev_type {BTAP_DEV_TUN, BTAP_DEV_TAP}; - -enum BTap_init_type { - BTAP_INIT_STRING, -#ifndef BADVPN_USE_WINAPI - BTAP_INIT_FD, -#endif -}; - -struct BTap_init_data { - enum BTap_dev_type dev_type; - enum BTap_init_type init_type; - union { - char *string; - struct { - int fd; - int mtu; - } fd; - } init; -}; - -/** - * Initializes the TAP device. - * - * @param o the object - * @param BReactor {@link BReactor} we live in - * @param init_data struct containing initialization parameters (to allow transparent passing). - * init.data.dev_type must be either BTAP_DEV_TUN for an IP device, or - * BTAP_DEV_TAP for an Ethernet device. - * init_data.init_type must be either BTAP_INIT_STRING or BTAP_INIT_FD. - * For BTAP_INIT_STRING, init_data.init.string specifies the TUN or TAP - * device, as described next. - * On Linux: a network interface name. If it is NULL, no - * specific device will be requested, and the operating system - * may create a new device. - * On Windows: a string "component_id:device_name", where - * component_id is a string identifying the driver, and device_name - * is the name of the network interface. If component_id is empty, - * a hardcoded default will be used instead. If device_name is empty, - * the first device found with a matching component_id will be used. - * Specifying NULL is equivalent to specifying ":". - * For BTAP_INIT_FD, the device is initialized using a file descriptor. - * In this case, init_data.init.fd.fd must be set to the file descriptor, - * and init_data.init.fd.mtu must be set to the largest IP packet or - * Ethernet frame supported, for a TUN or TAP device, respectively. - * File descriptor initialization is not supported on Windows. - * @param handler_error error handler function - * @param handler_error_user value passed to error handler - * @return 1 on success, 0 on failure - */ -int BTap_Init2 (BTap *o, BReactor *reactor, struct BTap_init_data init_data, BTap_handler_error handler_error, void *handler_error_user) WARN_UNUSED; - -/** - * Frees the TAP device. - * - * @param o the object - */ -void BTap_Free (BTap *o); - -/** - * Returns the device's maximum transmission unit (including any protocol headers). - * - * @param o the object - * @return device's MTU - */ -int BTap_GetMTU (BTap *o); - -/** - * Sends a packet to the device. - * Any errors will be reported via a job. - * - * @param o the object - * @param data packet to send - * @param data_len length of packet. Must be >=0 and <=MTU, as reported by {@link BTap_GetMTU}. - */ -void BTap_Send (BTap *o, uint8_t *data, int data_len); - -/** - * Returns a {@link PacketRecvInterface} for reading packets from the device. - * The MTU of the interface will be {@link BTap_GetMTU}. - * - * @param o the object - * @return output interface - */ -PacketRecvInterface * BTap_GetOutput (BTap *o); - -#endif diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/tuntap/BTap.m b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/tuntap/BTap.m deleted file mode 100644 index 18a17760..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/tuntap/BTap.m +++ /dev/null @@ -1,511 +0,0 @@ -/** - * @file BTap.c - * @author Ambroz Bizjak - * - * @section LICENSE - * - * 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 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE 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. - */ - -#include -#include - -#ifdef BADVPN_USE_WINAPI -#include -#include -#include -#include -#include "wintap-common.h" -#include -#else -#include -#include -#include -#include -#include -#include -#include -#include -// #include -#ifdef BADVPN_LINUX -#include -#endif -#ifdef BADVPN_FREEBSD -#ifdef __APPLE__ -#include -// #include -// #include -// #include -#include -#include -#else -#include -#include -#endif -#endif -#endif - -#include "base/BLog.h" - -#include "tuntap/BTap.h" - -#include "generated/blog_channel_BTap.h" -#include "TunnelInterface.h" - -static void report_error (BTap *o); -static void output_handler_recv (BTap *o, uint8_t *data); - -#ifdef BADVPN_USE_WINAPI - -static void recv_olap_handler (BTap *o, int event, DWORD bytes) -{ - DebugObject_Access(&o->d_obj); - ASSERT(o->output_packet) - ASSERT(event == BREACTOR_IOCP_EVENT_SUCCEEDED || event == BREACTOR_IOCP_EVENT_FAILED) - - // set no output packet - o->output_packet = NULL; - - if (event == BREACTOR_IOCP_EVENT_FAILED) { - BLog(BLOG_ERROR, "read operation failed"); - report_error(o); - return; - } - - ASSERT(bytes >= 0) - ASSERT(bytes <= o->frame_mtu) - - // done - PacketRecvInterface_Done(&o->output, bytes); -} - -#else - -#ifdef __APPLE__ - -static inline int header_modify_read_write_return (int len) -{ - if (len > 0) { - return len > sizeof (u_int32_t) ? len - sizeof (u_int32_t) : 0; - } else { - return len; - } -} - -static int write_tun_header (int fd, void *buf, size_t len) -{ - u_int32_t type; - struct iovec iv[2]; - struct ip *iph; - - iph = (struct ip *) buf; - - if (iph->ip_v == 6) { - type = htonl(AF_INET6); - } else { - type = htonl(AF_INET); - } - - iv[0].iov_base = &type; - iv[0].iov_len = sizeof(type); - iv[1].iov_base = buf; - iv[1].iov_len = len; - - return header_modify_read_write_return(writev(fd, iv, 2)); -} - -static int read_tun_header (int fd, void *buf, size_t len) -{ - u_int32_t type; - struct iovec iv[2]; - - iv[0].iov_base = &type; - iv[0].iov_len = sizeof(type); - iv[1].iov_base = buf; - iv[1].iov_len = len; - - return header_modify_read_write_return(readv(fd, iv, 2)); -} - -#endif - -static void fd_handler (BTap *o, int events) -{ - DebugObject_Access(&o->d_obj); - DebugError_AssertNoError(&o->d_err); - - if (events&(BREACTOR_ERROR|BREACTOR_HUP)) { - BLog(BLOG_WARNING, "device fd reports error?"); - } - - if (events&BREACTOR_READ) do { - ASSERT(o->output_packet) - - // try reading into the buffer -#ifdef __APPLE__ - // int bytes = read_tun_header(o->fd, o->output_packet, o->frame_mtu); - uint8_t data[2]; - int bytes = read(o->fd, data, 2); - if (bytes != 2) { - // Treat zero return value the same as EAGAIN. - // See: https://bugzilla.kernel.org/show_bug.cgi?id=96381 -// if (bytes == 0 || errno == EAGAIN || errno == EWOULDBLOCK) { -// // retry later -// break; -// } -// // report fatal error -// report_error(o); -// return; - break; - } - int data_len = data[0] * 256 + data[1]; - - bytes = read(o->fd, o->output_packet, data_len); -#else - int bytes = read(o->fd, o->output_packet, o->frame_mtu); -#endif - if (bytes != data_len) { - // report fatal error - report_error(o); - return; - } - if (bytes <= 0) { - // Treat zero return value the same as EAGAIN. - // See: https://bugzilla.kernel.org/show_bug.cgi?id=96381 - if (bytes == 0 || errno == EAGAIN || errno == EWOULDBLOCK) { - // retry later - break; - } - // report fatal error - report_error(o); - return; - } - -#if TCP_DATA_LOG_ENABLE - BLog(BLOG_DEBUG, "tun2socks receive from tunnel data", bytes); -#endif - - ASSERT_FORCE(bytes <= o->frame_mtu) - - // set no output packet - o->output_packet = NULL; - - // update events - o->poll_events &= ~BREACTOR_READ; - BReactor_SetFileDescriptorEvents(o->reactor, &o->bfd, o->poll_events); - - // inform receiver we finished the packet - PacketRecvInterface_Done(&o->output, bytes); - } while (0); -} - -#endif - -void report_error (BTap *o) -{ - DEBUGERROR(&o->d_err, o->handler_error(o->handler_error_user)); -} - -void output_handler_recv (BTap *o, uint8_t *data) -{ - DebugObject_Access(&o->d_obj); - DebugError_AssertNoError(&o->d_err); - ASSERT(data) - ASSERT(!o->output_packet) - -#ifdef BADVPN_USE_WINAPI - - memset(&o->recv_olap.olap, 0, sizeof(o->recv_olap.olap)); - - // read - BOOL res = ReadFile(o->device, data, o->frame_mtu, NULL, &o->recv_olap.olap); - if (res == FALSE && GetLastError() != ERROR_IO_PENDING) { - BLog(BLOG_ERROR, "ReadFile failed (%u)", GetLastError()); - report_error(o); - return; - } - - o->output_packet = data; - -#else - - // attempt read -//#ifdef __APPLE__ -// // int bytes = read_tun_header(o->fd, data, o->frame_mtu); -// char msg[2]; -// int bytes = read(o->fd, msg, 2); -// NSLog(@"fd2 bytes: %d", bytes); -// -// if (bytes <= 0) { -// if (bytes == 0 || errno == EAGAIN || errno == EWOULDBLOCK) { -// // See note about zero return in fd_handler. -// // retry later in fd_handler -// // remember packet -// o->output_packet = data; -// // update events -// o->poll_events |= BREACTOR_READ; -// BReactor_SetFileDescriptorEvents(o->reactor, &o->bfd, o->poll_events); -// return; -// } -// // report fatal error -// report_error(o); -// return; -// } -// int len = msg[0] * 256 + msg[1]; -// NSLog(@"fd2 len: %x, %x, len: %d", data[0], data[1], len); -// bytes = read(o->fd, data, len); -//#else -// int bytes = read(o->fd, data, o->frame_mtu); -//#endif -// if (bytes <= 0) { -// if (bytes == 0 || errno == EAGAIN || errno == EWOULDBLOCK) { -// // See note about zero return in fd_handler. -// // retry later in fd_handler -// // remember packet -// o->output_packet = data; -// // update events -// o->poll_events |= BREACTOR_READ; -// BReactor_SetFileDescriptorEvents(o->reactor, &o->bfd, o->poll_events); -// return; -// } -// // report fatal error -// report_error(o); -// return; -// } -// -// NSLog(@"tun2 receive: %@", [[NSData alloc] initWithBytes:data length:bytes]); -// -// ASSERT_FORCE(bytes <= o->frame_mtu) -// -// PacketRecvInterface_Done(&o->output, bytes); - o->output_packet = data; - // update events - o->poll_events |= BREACTOR_READ; - BReactor_SetFileDescriptorEvents(o->reactor, &o->bfd, o->poll_events); - -#endif -} - -int BTap_Init (BTap *o, BReactor *reactor, int fd, int mtu, BTap_handler_error handler_error, void *handler_error_user, int tun) -{ - ASSERT(tun == 0 || tun == 1) - - struct BTap_init_data init_data; - init_data.dev_type = tun ? BTAP_DEV_TUN : BTAP_DEV_TAP; - init_data.init_type = BTAP_INIT_FD; - init_data.init.fd.fd = fd; - init_data.init.fd.mtu = mtu; - - return BTap_Init2(o, reactor, init_data, handler_error, handler_error_user); -} - -int BTap_Init2 (BTap *o, BReactor *reactor, struct BTap_init_data init_data, BTap_handler_error handler_error, void *handler_error_user) -{ - ASSERT(init_data.dev_type == BTAP_DEV_TUN || init_data.dev_type == BTAP_DEV_TAP) - - // init arguments - o->reactor = reactor; - o->handler_error = handler_error; - o->handler_error_user = handler_error_user; - -#if defined(BADVPN_LINUX) || defined(BADVPN_FREEBSD) - - o->close_fd = (init_data.init_type != BTAP_INIT_FD); - - switch (init_data.init_type) { - case BTAP_INIT_FD: { - ASSERT(init_data.init.fd.fd >= 0) - ASSERT(init_data.init.fd.mtu >= 0) - ASSERT(init_data.dev_type != BTAP_DEV_TAP || init_data.init.fd.mtu >= BTAP_ETHERNET_HEADER_LENGTH) - - o->fd = init_data.init.fd.fd; - o->frame_mtu = init_data.init.fd.mtu; - } break; - - case BTAP_INIT_STRING: - break; - - default: ASSERT(0); - } - - // set non-blocking - if (fcntl(o->fd, F_SETFL, O_NONBLOCK) < 0) { - BLog(BLOG_ERROR, "cannot set non-blocking"); - goto fail1; - } - - // init file descriptor object - BFileDescriptor_Init(&o->bfd, o->fd, (BFileDescriptor_handler)fd_handler, o); - if (!BReactor_AddFileDescriptor(o->reactor, &o->bfd)) { - BLog(BLOG_ERROR, "BReactor_AddFileDescriptor failed"); - goto fail1; - } - o->poll_events = 0; - - goto success; - -fail1: - if (o->close_fd) { - ASSERT_FORCE(close(o->fd) == 0) - } -fail0: - return 0; - -#endif - -success: - // init output - PacketRecvInterface_Init(&o->output, o->frame_mtu, (PacketRecvInterface_handler_recv)output_handler_recv, o, BReactor_PendingGroup(o->reactor)); - - // set no output packet - o->output_packet = NULL; - - DebugError_Init(&o->d_err, BReactor_PendingGroup(o->reactor)); - DebugObject_Init(&o->d_obj); - return 1; -} - -void BTap_Free (BTap *o) -{ - DebugObject_Free(&o->d_obj); - DebugError_Free(&o->d_err); - - // free output - PacketRecvInterface_Free(&o->output); - -#ifdef BADVPN_USE_WINAPI - - // cancel I/O - ASSERT_FORCE(CancelIo(o->device)) - - // wait receiving to finish - if (o->output_packet) { - BLog(BLOG_DEBUG, "waiting for receiving to finish"); - BReactorIOCPOverlapped_Wait(&o->recv_olap, NULL, NULL); - } - - // free recv olap - BReactorIOCPOverlapped_Free(&o->recv_olap); - - // free send olap - BReactorIOCPOverlapped_Free(&o->send_olap); - - // close device - ASSERT_FORCE(CloseHandle(o->device)) - -#else - - // free BFileDescriptor - BReactor_RemoveFileDescriptor(o->reactor, &o->bfd); - - if (o->close_fd) { - // close file descriptor - ASSERT_FORCE(close(o->fd) == 0) - } - -#endif -} - -int BTap_GetMTU (BTap *o) -{ - DebugObject_Access(&o->d_obj); - - return o->frame_mtu; -} - -void BTap_Send (BTap *o, uint8_t *data, int data_len) -{ - DebugObject_Access(&o->d_obj); - DebugError_AssertNoError(&o->d_err); - ASSERT(data_len >= 0) - ASSERT(data_len <= o->frame_mtu) - -#ifdef BADVPN_USE_WINAPI - - // ignore frames without an Ethernet header, or we get errors in WriteFile - if (data_len < 14) { - return; - } - - memset(&o->send_olap.olap, 0, sizeof(o->send_olap.olap)); - - // write - BOOL res = WriteFile(o->device, data, data_len, NULL, &o->send_olap.olap); - if (res == FALSE && GetLastError() != ERROR_IO_PENDING) { - BLog(BLOG_ERROR, "WriteFile failed (%u)", GetLastError()); - return; - } - - // wait - int succeeded; - DWORD bytes; - BReactorIOCPOverlapped_Wait(&o->send_olap, &succeeded, &bytes); - - if (!succeeded) { - BLog(BLOG_ERROR, "write operation failed"); - } else { - ASSERT(bytes >= 0) - ASSERT(bytes <= data_len) - - if (bytes < data_len) { - BLog(BLOG_ERROR, "write operation didn't write everything"); - } - } - -#else - -#ifdef __APPLE__ - // int bytes = write_tun_header(o->fd, data, data_len); - NSData *outdata = [[NSData alloc] initWithBytes:data length:data_len]; -#if TCP_DATA_LOG_ENABLE - BLog(BLOG_DEBUG, "tun2socks send to tunnel data", data_len); -#endif - [TunnelInterface writePacket:outdata]; - return; - uint8_t msg[o->frame_mtu+2]; - msg[0] = data_len / 256; - msg[1] = data_len % 256; - memcpy(msg + 2, data, data_len); - - int bytes = write(o->fd, msg, data_len + 2); -#else - int bytes = write(o->fd, data, data_len); -#endif - if (bytes < 0) { - // malformed packets will cause errors, ignore them and act like - // the packet was accepeted - } else { - if (bytes != data_len + 2) { - BLog(BLOG_WARNING, "written %d expected %d", bytes, data_len + 2); - } - } - -#endif -} - -PacketRecvInterface * BTap_GetOutput (BTap *o) -{ - DebugObject_Access(&o->d_obj); - - return &o->output; -} diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/udpgw/udpgw.c b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/udpgw/udpgw.c deleted file mode 100644 index 5247574c..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/udpgw/udpgw.c +++ /dev/null @@ -1,1473 +0,0 @@ -/* - * Copyright (C) Ambroz Bizjak - * Contributions: - * Transparent DNS: Copyright (C) Kerem Hadimli - * - * 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 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE 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. - */ - -#include -#include -#include -#include -#include - -#include "protocol/udpgw_proto.h" -#include "misc/debug.h" -#include "misc/version.h" -#include "misc/loggers_string.h" -#include "misc/loglevel.h" -#include "misc/offset.h" -#include "misc/byteorder.h" -#include "misc/bsize.h" -#include "misc/open_standard_streams.h" -#include "misc/balloc.h" -#include "misc/compare.h" -#include "misc/print_macros.h" -#include "structure/LinkedList1.h" -#include "structure/BAVL.h" -#include "base/BLog.h" -#include "system/BReactor.h" -#include "system/BNetwork.h" -#include "system/BConnection.h" -#include "system/BDatagram.h" -#include "system/BSignal.h" -#include "flow/PacketProtoDecoder.h" -#include "flow/PacketPassFairQueue.h" -#include "flow/PacketStreamSender.h" -#include "flow/PacketProtoFlow.h" -#include "flow/SinglePacketBuffer.h" - -#ifndef BADVPN_USE_WINAPI -#include "base/BLog_syslog.h" -#include -#include -#endif - -#include "udpgw.h" - -#include "generated/blog_channel_udpgw.h" - -#define LOGGER_STDOUT 1 -#define LOGGER_SYSLOG 2 - -#define DNS_UPDATE_TIME 2000 - -struct client { - BConnection con; - BAddr addr; - BTimer disconnect_timer; - PacketProtoDecoder recv_decoder; - PacketPassInterface recv_if; - PacketPassFairQueue send_queue; - PacketStreamSender send_sender; - BAVL connections_tree; - LinkedList1 connections_list; - int num_connections; - LinkedList1 closing_connections_list; - LinkedList1Node clients_list_node; -}; - -struct connection { - struct client *client; - uint16_t conid; - BAddr addr; - BAddr orig_addr; - const uint8_t *first_data; - int first_data_len; - btime_t last_use_time; - int closing; - BPending first_job; - BufferWriter *send_if; - PacketProtoFlow send_ppflow; - PacketPassFairQueueFlow send_qflow; - union { - struct { - BDatagram udp_dgram; - int local_port_index; - BufferWriter udp_send_writer; - PacketBuffer udp_send_buffer; - SinglePacketBuffer udp_recv_buffer; - PacketPassInterface udp_recv_if; - BAVLNode connections_tree_node; - LinkedList1Node connections_list_node; - }; - struct { - LinkedList1Node closing_connections_list_node; - }; - }; -}; - -// command-line options -struct { - int help; - int version; - int logger; -#ifndef BADVPN_USE_WINAPI - char *logger_syslog_facility; - char *logger_syslog_ident; -#endif - int loglevel; - int loglevels[BLOG_NUM_CHANNELS]; - char *listen_addrs[MAX_LISTEN_ADDRS]; - int num_listen_addrs; - int udp_mtu; - int max_clients; - int max_connections_for_client; - int client_socket_sndbuf; - int local_udp_num_ports; - char *local_udp_addr; - int local_udp_ip6_num_ports; - char *local_udp_ip6_addr; - int unique_local_ports; -} server_options; - -// MTUs -int udpgw_mtu; -int pp_mtu; - -// listen addresses -BAddr listen_addrs[MAX_LISTEN_ADDRS]; -int num_listen_addrs; - -// local UDP port range, if options.local_udp_num_ports>=0 -BAddr local_udp_addr; - -// local UDP/IPv6 port range, if options.local_udp_ip6_num_ports>=0 -BAddr local_udp_ip6_addr; - -// DNS forwarding -BAddr dns_addr; -btime_t last_dns_update_time; - -// reactor -BReactor server_ss; - -// listeners -BListener listeners[MAX_LISTEN_ADDRS]; -int num_listeners; - -// clients -LinkedList1 clients_list; -int server_num_clients; - -static void print_help (const char *name); -static void print_version (void); -static int parse_arguments (int argc, char *argv[]); -static int process_arguments (void); -static void signal_handler (void *unused); -static void listener_handler (BListener *listener); -static void client_free (struct client *client); -static void client_logfunc (struct client *client); -static void client_log (struct client *client, int level, const char *fmt, ...); -static void client_disconnect_timer_handler (struct client *client); -static void client_connection_handler (struct client *client, int event); -static void client_decoder_handler_error (struct client *client); -static void client_recv_if_handler_send (struct client *client, uint8_t *data, int data_len); -static int get_local_num_ports (int addr_type); -static BAddr get_local_addr (int addr_type); -static uint8_t * build_port_usage_array_and_find_least_used_connection (BAddr remote_addr, struct connection **out_con); -static void connection_init (struct client *client, uint16_t conid, BAddr addr, BAddr orig_addr, const uint8_t *data, int data_len); -static void connection_free (struct connection *con); -static void connection_logfunc (struct connection *con); -static void connection_log (struct connection *con, int level, const char *fmt, ...); -static void connection_free_udp (struct connection *con); -static void connection_first_job_handler (struct connection *con); -static void connection_send_to_client (struct connection *con, uint8_t flags, const uint8_t *data, int data_len); -static int connection_send_to_udp (struct connection *con, const uint8_t *data, int data_len); -static void connection_close (struct connection *con); -static void connection_send_qflow_busy_handler (struct connection *con); -static void connection_dgram_handler_event (struct connection *con, int event); -static void connection_udp_recv_if_handler_send (struct connection *con, uint8_t *data, int data_len); -static struct connection * find_connection (struct client *client, uint16_t conid); -static int uint16_comparator (void *unused, uint16_t *v1, uint16_t *v2); -static void maybe_update_dns (void); - -int udpgw_main (int argc, char **argv) -{ - if (argc <= 0) { - return 1; - } - - // open standard streams - open_standard_streams(); - - // parse command-line arguments - if (!parse_arguments(argc, argv)) { - fprintf(stderr, "Failed to parse arguments\n"); - print_help(argv[0]); - goto fail0; - } - - // handle --help and --version - if (server_options.help) { - print_version(); - print_help(argv[0]); - return 0; - } - if (server_options.version) { - print_version(); - return 0; - } - - // initialize logger - switch (server_options.logger) { - case LOGGER_STDOUT: - BLog_InitStdout(); - break; -#ifndef BADVPN_USE_WINAPI - case LOGGER_SYSLOG: - if (!BLog_InitSyslog(server_options.logger_syslog_ident, server_options.logger_syslog_facility)) { - fprintf(stderr, "Failed to initialize syslog logger\n"); - goto fail0; - } - break; -#endif - default: - ASSERT(0); - } - - // configure logger channels - for (int i = 0; i < BLOG_NUM_CHANNELS; i++) { - if (server_options.loglevels[i] >= 0) { - BLog_SetChannelLoglevel(i, server_options.loglevels[i]); - } - else if (server_options.loglevel >= 0) { - BLog_SetChannelLoglevel(i, server_options.loglevel); - } - } - - BLog(BLOG_NOTICE, "initializing "GLOBAL_PRODUCT_NAME" "PROGRAM_NAME" "GLOBAL_VERSION); - - // initialize network - if (!BNetwork_GlobalInit()) { - BLog(BLOG_ERROR, "BNetwork_GlobalInit failed"); - goto fail1; - } - - // process arguments - if (!process_arguments()) { - BLog(BLOG_ERROR, "Failed to process arguments"); - goto fail1; - } - - // compute MTUs - udpgw_mtu = udpgw_compute_mtu(server_options.udp_mtu); - if (udpgw_mtu < 0 || udpgw_mtu > PACKETPROTO_MAXPAYLOAD) { - udpgw_mtu = PACKETPROTO_MAXPAYLOAD; - } - pp_mtu = udpgw_mtu + sizeof(struct packetproto_header); - - // init time - BTime_Init(); - - // init DNS forwarding - BAddr_InitNone(&dns_addr); - last_dns_update_time = INT64_MIN; - maybe_update_dns(); - - // init reactor - if (!BReactor_Init(&server_ss)) { - BLog(BLOG_ERROR, "BReactor_Init failed"); - goto fail1; - } - - // setup signal handler - if (!BSignal_Init(&server_ss, signal_handler, NULL)) { - BLog(BLOG_ERROR, "BSignal_Init failed"); - goto fail2; - } - - // initialize listeners - num_listeners = 0; - while (num_listeners < num_listen_addrs) { - if (!BListener_Init(&listeners[num_listeners], listen_addrs[num_listeners], &server_ss, &listeners[num_listeners], (BListener_handler)listener_handler)) { - BLog(BLOG_ERROR, "Listener_Init failed"); - goto fail3; - } - num_listeners++; - } - - // init clients list - LinkedList1_Init(&clients_list); - server_num_clients = 0; - - // enter event loop - BLog(BLOG_NOTICE, "entering event loop"); - BReactor_Exec(&server_ss); - - // free clients - while (!LinkedList1_IsEmpty(&clients_list)) { - struct client *client = UPPER_OBJECT(LinkedList1_GetFirst(&clients_list), struct client, clients_list_node); - client_free(client); - } -fail3: - // free listeners - while (num_listeners > 0) { - num_listeners--; - BListener_Free(&listeners[num_listeners]); - } - // finish signal handling - BSignal_Finish(); -fail2: - // free reactor - BReactor_Free(&server_ss); -fail1: - // free logger - BLog(BLOG_NOTICE, "exiting"); - BLog_Free(); -fail0: - // finish debug objects - DebugObjectGlobal_Finish(); - - return 1; -} - -void print_help (const char *name) -{ - printf( - "Usage:\n" - " %s\n" - " [--help]\n" - " [--version]\n" - " [--logger <"LOGGERS_STRING">]\n" -#ifndef BADVPN_USE_WINAPI - " (logger=syslog?\n" - " [--syslog-facility ]\n" - " [--syslog-ident ]\n" - " )\n" -#endif - " [--loglevel <0-5/none/error/warning/notice/info/debug>]\n" - " [--channel-loglevel <0-5/none/error/warning/notice/info/debug>] ...\n" - " [--listen-addr ] ...\n" - " [--udp-mtu ]\n" - " [--max-clients ]\n" - " [--max-connections-for-client ]\n" - " [--client-socket-sndbuf ]\n" - " [--local-udp-addrs ]\n" - " [--local-udp-ip6-addrs ]\n" - " [--unique-local-ports]\n" - "Address format is a.b.c.d:port (IPv4) or [addr]:port (IPv6).\n", - name - ); -} - -void print_version (void) -{ - printf(GLOBAL_PRODUCT_NAME" "PROGRAM_NAME" "GLOBAL_VERSION"\n"GLOBAL_COPYRIGHT_NOTICE"\n"); -} - -int parse_arguments (int argc, char *argv[]) -{ - if (argc <= 0) { - return 0; - } - - server_options.help = 0; - server_options.version = 0; - server_options.logger = LOGGER_STDOUT; -#ifndef BADVPN_USE_WINAPI - server_options.logger_syslog_facility = "daemon"; - server_options.logger_syslog_ident = argv[0]; -#endif - server_options.loglevel = -1; - for (int i = 0; i < BLOG_NUM_CHANNELS; i++) { - server_options.loglevels[i] = -1; - } - server_options.num_listen_addrs = 0; - server_options.udp_mtu = DEFAULT_UDP_MTU; - server_options.max_clients = DEFAULT_MAX_CLIENTS; - server_options.max_connections_for_client = DEFAULT_MAX_CONNECTIONS_FOR_CLIENT; - server_options.client_socket_sndbuf = CLIENT_DEFAULT_SOCKET_SEND_BUFFER; - server_options.local_udp_num_ports = -1; - server_options.local_udp_ip6_num_ports = -1; - server_options.unique_local_ports = 0; - - int i; - for (i = 1; i < argc; i++) { - char *arg = argv[i]; - if (!strcmp(arg, "--help")) { - server_options.help = 1; - } - else if (!strcmp(arg, "--version")) { - server_options.version = 1; - } - else if (!strcmp(arg, "--logger")) { - if (1 >= argc - i) { - fprintf(stderr, "%s: requires an argument\n", arg); - return 0; - } - char *arg2 = argv[i + 1]; - if (!strcmp(arg2, "stdout")) { - server_options.logger = LOGGER_STDOUT; - } -#ifndef BADVPN_USE_WINAPI - else if (!strcmp(arg2, "syslog")) { - server_options.logger = LOGGER_SYSLOG; - } -#endif - else { - fprintf(stderr, "%s: wrong argument\n", arg); - return 0; - } - i++; - } -#ifndef BADVPN_USE_WINAPI - else if (!strcmp(arg, "--syslog-facility")) { - if (1 >= argc - i) { - fprintf(stderr, "%s: requires an argument\n", arg); - return 0; - } - server_options.logger_syslog_facility = argv[i + 1]; - i++; - } - else if (!strcmp(arg, "--syslog-ident")) { - if (1 >= argc - i) { - fprintf(stderr, "%s: requires an argument\n", arg); - return 0; - } - server_options.logger_syslog_ident = argv[i + 1]; - i++; - } -#endif - else if (!strcmp(arg, "--loglevel")) { - if (1 >= argc - i) { - fprintf(stderr, "%s: requires an argument\n", arg); - return 0; - } - if ((server_options.loglevel = parse_loglevel(argv[i + 1])) < 0) { - fprintf(stderr, "%s: wrong argument\n", arg); - return 0; - } - i++; - } - else if (!strcmp(arg, "--channel-loglevel")) { - if (2 >= argc - i) { - fprintf(stderr, "%s: requires two arguments\n", arg); - return 0; - } - int channel = BLogGlobal_GetChannelByName(argv[i + 1]); - if (channel < 0) { - fprintf(stderr, "%s: wrong channel argument\n", arg); - return 0; - } - int loglevel = parse_loglevel(argv[i + 2]); - if (loglevel < 0) { - fprintf(stderr, "%s: wrong loglevel argument\n", arg); - return 0; - } - server_options.loglevels[channel] = loglevel; - i += 2; - } - else if (!strcmp(arg, "--listen-addr")) { - if (1 >= argc - i) { - fprintf(stderr, "%s: requires an argument\n", arg); - return 0; - } - if (server_options.num_listen_addrs == MAX_LISTEN_ADDRS) { - fprintf(stderr, "%s: too many\n", arg); - return 0; - } - server_options.listen_addrs[server_options.num_listen_addrs] = argv[i + 1]; - server_options.num_listen_addrs++; - i++; - } - else if (!strcmp(arg, "--udp-mtu")) { - if (1 >= argc - i) { - fprintf(stderr, "%s: requires an argument\n", arg); - return 0; - } - if ((server_options.udp_mtu = atoi(argv[i + 1])) < 0) { - fprintf(stderr, "%s: wrong argument\n", arg); - return 0; - } - i++; - } - else if (!strcmp(arg, "--max-clients")) { - if (1 >= argc - i) { - fprintf(stderr, "%s: requires an argument\n", arg); - return 0; - } - if ((server_options.max_clients = atoi(argv[i + 1])) <= 0) { - fprintf(stderr, "%s: wrong argument\n", arg); - return 0; - } - i++; - } - else if (!strcmp(arg, "--max-connections-for-client")) { - if (1 >= argc - i) { - fprintf(stderr, "%s: requires an argument\n", arg); - return 0; - } - if ((server_options.max_connections_for_client = atoi(argv[i + 1])) <= 0) { - fprintf(stderr, "%s: wrong argument\n", arg); - return 0; - } - i++; - } - else if (!strcmp(arg, "--client-socket-sndbuf")) { - if (1 >= argc - i) { - fprintf(stderr, "%s: requires an argument\n", arg); - return 0; - } - if ((server_options.client_socket_sndbuf = atoi(argv[i + 1])) < 0) { - fprintf(stderr, "%s: wrong argument\n", arg); - return 0; - } - i++; - } - else if (!strcmp(arg, "--local-udp-addrs")) { - if (2 >= argc - i) { - fprintf(stderr, "%s: requires two arguments\n", arg); - return 0; - } - server_options.local_udp_addr = argv[i + 1]; - if ((server_options.local_udp_num_ports = atoi(argv[i + 2])) < 0) { - fprintf(stderr, "%s: wrong argument\n", arg); - return 0; - } - i += 2; - } - else if (!strcmp(arg, "--local-udp-ip6-addrs")) { - if (2 >= argc - i) { - fprintf(stderr, "%s: requires two arguments\n", arg); - return 0; - } - server_options.local_udp_ip6_addr = argv[i + 1]; - if ((server_options.local_udp_ip6_num_ports = atoi(argv[i + 2])) < 0) { - fprintf(stderr, "%s: wrong argument\n", arg); - return 0; - } - i += 2; - } - else if (!strcmp(arg, "--unique-local-ports")) { - server_options.unique_local_ports = 1; - } - else { - fprintf(stderr, "unknown option: %s\n", arg); - return 0; - } - } - - if (server_options.help || server_options.version) { - return 1; - } - - return 1; -} - -int process_arguments (void) -{ - // resolve listen addresses - num_listen_addrs = 0; - while (num_listen_addrs < server_options.num_listen_addrs) { - if (!BAddr_Parse(&listen_addrs[num_listen_addrs], server_options.listen_addrs[num_listen_addrs], NULL, 0)) { - BLog(BLOG_ERROR, "listen addr: BAddr_Parse failed"); - return 0; - } - num_listen_addrs++; - } - - // resolve local UDP address - if (server_options.local_udp_num_ports >= 0) { - if (!BAddr_Parse(&local_udp_addr, server_options.local_udp_addr, NULL, 0)) { - BLog(BLOG_ERROR, "local udp addr: BAddr_Parse failed"); - return 0; - } - if (local_udp_addr.type != BADDR_TYPE_IPV4) { - BLog(BLOG_ERROR, "local udp addr: must be an IPv4 address"); - return 0; - } - } - - // resolve local UDP/IPv6 address - if (server_options.local_udp_ip6_num_ports >= 0) { - if (!BAddr_Parse(&local_udp_ip6_addr, server_options.local_udp_ip6_addr, NULL, 0)) { - BLog(BLOG_ERROR, "local udp ip6 addr: BAddr_Parse failed"); - return 0; - } - if (local_udp_ip6_addr.type != BADDR_TYPE_IPV6) { - BLog(BLOG_ERROR, "local udp ip6 addr: must be an IPv6 address"); - return 0; - } - } - - return 1; -} - -void signal_handler (void *unused) -{ - BLog(BLOG_NOTICE, "termination requested"); - - // exit event loop - BReactor_Quit(&server_ss, 1); -} - -void listener_handler (BListener *listener) -{ - if (server_num_clients == server_options.max_clients) { - BLog(BLOG_ERROR, "maximum number of clients reached"); - goto fail0; - } - - // allocate structure - struct client *client = (struct client *)malloc(sizeof(*client)); - if (!client) { - BLog(BLOG_ERROR, "malloc failed"); - goto fail0; - } - - // accept client - if (!BConnection_Init(&client->con, BConnection_source_listener(listener, &client->addr), &server_ss, client, (BConnection_handler)client_connection_handler)) { - BLog(BLOG_ERROR, "BConnection_Init failed"); - goto fail1; - } - - // limit socket send buffer, else our scheduling is pointless - if (server_options.client_socket_sndbuf > 0) { - if (!BConnection_SetSendBuffer(&client->con, server_options.client_socket_sndbuf)) { - BLog(BLOG_WARNING, "BConnection_SetSendBuffer failed"); - } - } - - // init connection interfaces - BConnection_SendAsync_Init(&client->con); - BConnection_RecvAsync_Init(&client->con); - - // init disconnect timer - BTimer_Init(&client->disconnect_timer, CLIENT_DISCONNECT_TIMEOUT, (BTimer_handler)client_disconnect_timer_handler, client); - BReactor_SetTimer(&server_ss, &client->disconnect_timer); - - // init recv interface - PacketPassInterface_Init(&client->recv_if, udpgw_mtu, (PacketPassInterface_handler_send)client_recv_if_handler_send, client, BReactor_PendingGroup(&server_ss)); - - // init recv decoder - if (!PacketProtoDecoder_Init(&client->recv_decoder, BConnection_RecvAsync_GetIf(&client->con), &client->recv_if, BReactor_PendingGroup(&server_ss), client, - (PacketProtoDecoder_handler_error)client_decoder_handler_error - )) { - BLog(BLOG_ERROR, "PacketProtoDecoder_Init failed"); - goto fail2; - } - - // init send sender - PacketStreamSender_Init(&client->send_sender, BConnection_SendAsync_GetIf(&client->con), pp_mtu, BReactor_PendingGroup(&server_ss)); - - // init send queue - if (!PacketPassFairQueue_Init(&client->send_queue, PacketStreamSender_GetInput(&client->send_sender), BReactor_PendingGroup(&server_ss), 0, 1)) { - BLog(BLOG_ERROR, "PacketPassFairQueue_Init failed"); - goto fail3; - } - - // init connections tree - BAVL_Init(&client->connections_tree, OFFSET_DIFF(struct connection, conid, connections_tree_node), (BAVL_comparator)uint16_comparator, NULL); - - // init connections list - LinkedList1_Init(&client->connections_list); - - // set zero connections - client->num_connections = 0; - - // init closing connections list - LinkedList1_Init(&client->closing_connections_list); - - // insert to clients list - LinkedList1_Append(&clients_list, &client->clients_list_node); - server_num_clients++; - - client_log(client, BLOG_INFO, "connected"); - - return; - -fail3: - PacketStreamSender_Free(&client->send_sender); - PacketProtoDecoder_Free(&client->recv_decoder); -fail2: - PacketPassInterface_Free(&client->recv_if); - BReactor_RemoveTimer(&server_ss, &client->disconnect_timer); - BConnection_RecvAsync_Free(&client->con); - BConnection_SendAsync_Free(&client->con); - BConnection_Free(&client->con); -fail1: - free(client); -fail0: - return; -} - -void client_free (struct client *client) -{ - // allow freeing send queue flows - PacketPassFairQueue_PrepareFree(&client->send_queue); - - // free connections - while (!LinkedList1_IsEmpty(&client->connections_list)) { - struct connection *con = UPPER_OBJECT(LinkedList1_GetFirst(&client->connections_list), struct connection, connections_list_node); - connection_free(con); - } - - // free closing connections - while (!LinkedList1_IsEmpty(&client->closing_connections_list)) { - struct connection *con = UPPER_OBJECT(LinkedList1_GetFirst(&client->closing_connections_list), struct connection, closing_connections_list_node); - connection_free(con); - } - - // remove from clients list - LinkedList1_Remove(&clients_list, &client->clients_list_node); - server_num_clients--; - - // free send queue - PacketPassFairQueue_Free(&client->send_queue); - - // free send sender - PacketStreamSender_Free(&client->send_sender); - - // free recv decoder - PacketProtoDecoder_Free(&client->recv_decoder); - - // free recv interface - PacketPassInterface_Free(&client->recv_if); - - // free disconnect timer - BReactor_RemoveTimer(&server_ss, &client->disconnect_timer); - - // free connection interfaces - BConnection_RecvAsync_Free(&client->con); - BConnection_SendAsync_Free(&client->con); - - // free connection - BConnection_Free(&client->con); - - // free structure - free(client); -} - -void client_logfunc (struct client *client) -{ - char addr[BADDR_MAX_PRINT_LEN]; - BAddr_Print(&client->addr, addr); - - BLog_Append("client (%s): ", addr); -} - -void client_log (struct client *client, int level, const char *fmt, ...) -{ - va_list vl; - va_start(vl, fmt); - BLog_LogViaFuncVarArg((BLog_logfunc)client_logfunc, client, BLOG_CURRENT_CHANNEL, level, fmt, vl); - va_end(vl); -} - -void client_disconnect_timer_handler (struct client *client) -{ - client_log(client, BLOG_INFO, "timed out, disconnecting"); - - // free client - client_free(client); -} - -void client_connection_handler (struct client *client, int event) -{ - if (event == BCONNECTION_EVENT_RECVCLOSED) { - client_log(client, BLOG_INFO, "client closed"); - } else { - client_log(client, BLOG_INFO, "client error"); - } - - // free client - client_free(client); -} - -void client_decoder_handler_error (struct client *client) -{ - client_log(client, BLOG_ERROR, "decoder error"); - - // free client - client_free(client); -} - -void client_recv_if_handler_send (struct client *client, uint8_t *data, int data_len) -{ - ASSERT(data_len >= 0) - ASSERT(data_len <= udpgw_mtu) - - // accept packet - PacketPassInterface_Done(&client->recv_if); - - // parse header - if (data_len < sizeof(struct udpgw_header)) { - client_log(client, BLOG_ERROR, "missing header"); - return; - } - struct udpgw_header header; - memcpy(&header, data, sizeof(header)); - data += sizeof(header); - data_len -= sizeof(header); - uint8_t flags = ltoh8(header.flags); - uint16_t conid = ltoh16(header.conid); - - // reset disconnect timer - BReactor_SetTimer(&server_ss, &client->disconnect_timer); - - // if this is keepalive, ignore any payload - if ((flags & UDPGW_CLIENT_FLAG_KEEPALIVE)) { - client_log(client, BLOG_DEBUG, "received keepalive"); - return; - } - - // parse address - BAddr orig_addr; - if ((flags & UDPGW_CLIENT_FLAG_IPV6)) { - if (data_len < sizeof(struct udpgw_addr_ipv6)) { - client_log(client, BLOG_ERROR, "missing ipv6 address"); - return; - } - struct udpgw_addr_ipv6 addr_ipv6; - memcpy(&addr_ipv6, data, sizeof(addr_ipv6)); - data += sizeof(addr_ipv6); - data_len -= sizeof(addr_ipv6); - BAddr_InitIPv6(&orig_addr, addr_ipv6.addr_ip, addr_ipv6.addr_port); - } else { - if (data_len < sizeof(struct udpgw_addr_ipv4)) { - client_log(client, BLOG_ERROR, "missing ipv4 address"); - return; - } - struct udpgw_addr_ipv4 addr_ipv4; - memcpy(&addr_ipv4, data, sizeof(addr_ipv4)); - data += sizeof(addr_ipv4); - data_len -= sizeof(addr_ipv4); - BAddr_InitIPv4(&orig_addr, addr_ipv4.addr_ip, addr_ipv4.addr_port); - } - - // check payload length - if (data_len > server_options.udp_mtu) { - client_log(client, BLOG_ERROR, "too much data"); - return; - } - - // find connection - struct connection *con = find_connection(client, conid); - ASSERT(!con || !con->closing) - - // if connection exists, close it if needed - if (con && ((flags & UDPGW_CLIENT_FLAG_REBIND) || !BAddr_Compare(&con->orig_addr, &orig_addr))) { - connection_log(con, BLOG_DEBUG, "close old"); - connection_close(con); - con = NULL; - } - - // if connection doesn't exists, create it - if (!con) { - // check number of connections - if (client->num_connections == server_options.max_connections_for_client) { - // close least recently used connection - con = UPPER_OBJECT(LinkedList1_GetFirst(&client->connections_list), struct connection, connections_list_node); - connection_close(con); - } - - // if this is DNS, replace actual address, but keep still remember the orig_addr - BAddr addr = orig_addr; - if ((flags & UDPGW_CLIENT_FLAG_DNS)) { - maybe_update_dns(); - if (dns_addr.type == BADDR_TYPE_NONE) { - client_log(client, BLOG_WARNING, "received DNS packet, but no DNS server available"); - } else { - client_log(client, BLOG_DEBUG, "received DNS"); - addr = dns_addr; - } - } - - // create new connection - connection_init(client, conid, addr, orig_addr, data, data_len); - } else { - // submit packet to existing connection - connection_send_to_udp(con, data, data_len); - } -} - -int get_local_num_ports (int addr_type) -{ - switch (addr_type) { - case BADDR_TYPE_IPV4: return server_options.local_udp_num_ports; - case BADDR_TYPE_IPV6: return server_options.local_udp_ip6_num_ports; - default: ASSERT(0); return 0; - } -} - -BAddr get_local_addr (int addr_type) -{ - ASSERT(get_local_num_ports(addr_type) >= 0) - - switch (addr_type) { - case BADDR_TYPE_IPV4: return local_udp_addr; - case BADDR_TYPE_IPV6: return local_udp_ip6_addr; - default: ASSERT(0); return BAddr_MakeNone(); - } -} - -uint8_t * build_port_usage_array_and_find_least_used_connection (BAddr remote_addr, struct connection **out_con) -{ - ASSERT(remote_addr.type == BADDR_TYPE_IPV4 || remote_addr.type == BADDR_TYPE_IPV6) - ASSERT(get_local_num_ports(remote_addr.type) >= 0) - - int local_num_ports = get_local_num_ports(remote_addr.type); - - // allocate port usage array - uint8_t *port_usage = (uint8_t *)BAllocSize(bsize_fromint(local_num_ports)); - if (!port_usage) { - return NULL; - } - - // zero array - memset(port_usage, 0, local_num_ports); - - struct connection *least_con = NULL; - - // flag inappropriate ports (those with the same remote address) - for (LinkedList1Node *ln = LinkedList1_GetFirst(&clients_list); ln; ln = LinkedList1Node_Next(ln)) { - struct client *client = UPPER_OBJECT(ln, struct client, clients_list_node); - - for (LinkedList1Node *ln2 = LinkedList1_GetFirst(&client->connections_list); ln2; ln2 = LinkedList1Node_Next(ln2)) { - struct connection *con = UPPER_OBJECT(ln2, struct connection, connections_list_node); - ASSERT(con->client == client) - ASSERT(!con->closing) - - if (con->addr.type != remote_addr.type || con->local_port_index < 0) { - continue; - } - ASSERT(con->local_port_index < local_num_ports) - - if (server_options.unique_local_ports) { - BIPAddr ip1; - BIPAddr ip2; - BAddr_GetIPAddr(&con->addr, &ip1); - BAddr_GetIPAddr(&remote_addr, &ip2); - if (!BIPAddr_Compare(&ip1, &ip2)) { - continue; - } - } else { - if (!BAddr_Compare(&con->addr, &remote_addr)) { - continue; - } - } - - port_usage[con->local_port_index] = 1; - - if (!PacketPassFairQueueFlow_IsBusy(&con->send_qflow)) { - if (!least_con || con->last_use_time < least_con->last_use_time) { - least_con = con; - } - } - } - } - - *out_con = least_con; - return port_usage; -} - -void connection_init (struct client *client, uint16_t conid, BAddr addr, BAddr orig_addr, const uint8_t *data, int data_len) -{ - ASSERT(client->num_connections < server_options.max_connections_for_client) - ASSERT(!find_connection(client, conid)) - BAddr_Assert(&addr); - ASSERT(addr.type == BADDR_TYPE_IPV4 || addr.type == BADDR_TYPE_IPV6) - ASSERT(orig_addr.type == BADDR_TYPE_IPV4 || orig_addr.type == BADDR_TYPE_IPV6) - ASSERT(data_len >= 0) - ASSERT(data_len <= server_options.udp_mtu) - - // allocate structure - struct connection *con = (struct connection *)malloc(sizeof(*con)); - if (!con) { - client_log(client, BLOG_ERROR, "malloc failed"); - goto fail0; - } - - // init arguments - con->client = client; - con->conid = conid; - con->addr = addr; - con->orig_addr = orig_addr; - con->first_data = data; - con->first_data_len = data_len; - - // set last use time - con->last_use_time = btime_gettime(); - - // set not closing - con->closing = 0; - - // init first job - BPending_Init(&con->first_job, BReactor_PendingGroup(&server_ss), (BPending_handler)connection_first_job_handler, con); - BPending_Set(&con->first_job); - - // init send queue flow - PacketPassFairQueueFlow_Init(&con->send_qflow, &client->send_queue); - - // init send PacketProtoFlow - if (!PacketProtoFlow_Init(&con->send_ppflow, udpgw_mtu, CONNECTION_CLIENT_BUFFER_SIZE, PacketPassFairQueueFlow_GetInput(&con->send_qflow), BReactor_PendingGroup(&server_ss))) { - client_log(client, BLOG_ERROR, "PacketProtoFlow_Init failed"); - goto fail1; - } - con->send_if = PacketProtoFlow_GetInput(&con->send_ppflow); - - // init UDP dgram - if (!BDatagram_Init(&con->udp_dgram, addr.type, &server_ss, con, (BDatagram_handler)connection_dgram_handler_event)) { - client_log(client, BLOG_ERROR, "BDatagram_Init failed"); - goto fail2; - } - - con->local_port_index = -1; - - int local_num_ports = get_local_num_ports(addr.type); - - if (local_num_ports >= 0) { - // build port usage array, find least used connection - struct connection *least_con; - uint8_t *port_usage = build_port_usage_array_and_find_least_used_connection(addr, &least_con); - if (!port_usage) { - client_log(client, BLOG_ERROR, "build_port_usage_array failed"); - goto failed; - } - - // set SO_REUSEADDR - if (!BDatagram_SetReuseAddr(&con->udp_dgram, 1)) { - client_log(client, BLOG_ERROR, "set SO_REUSEADDR failed"); - goto failed; - } - - // get starting local address - BAddr local_addr = get_local_addr(addr.type); - - // try different ports - for (int i = 0; i < local_num_ports; i++) { - // skip inappropriate ports - if (port_usage[i]) { - continue; - } - - BAddr bind_addr = local_addr; - BAddr_SetPort(&bind_addr, hton16(ntoh16(BAddr_GetPort(&bind_addr)) + (uint16_t)i)); - if (BDatagram_Bind(&con->udp_dgram, bind_addr)) { - // remember which port we're using - con->local_port_index = i; - goto cont; - } - } - - // try closing an unused connection with the same remote addr - if (!least_con) { - goto failed; - } - - ASSERT(least_con->addr.type == addr.type) - ASSERT(least_con->local_port_index >= 0) - ASSERT(least_con->local_port_index < local_num_ports) - ASSERT(!PacketPassFairQueueFlow_IsBusy(&least_con->send_qflow)) - - int i = least_con->local_port_index; - - BLog(BLOG_INFO, "closing connection for its remote address"); - - // close the offending connection - connection_close(least_con); - - // try binding to its port - BAddr bind_addr = local_addr; - BAddr_SetPort(&bind_addr, hton16(ntoh16(BAddr_GetPort(&bind_addr)) + (uint16_t)i)); - if (BDatagram_Bind(&con->udp_dgram, bind_addr)) { - // remember which port we're using - con->local_port_index = i; - goto cont; - } - - failed: - client_log(client, BLOG_WARNING, "failed to bind to any local address; proceeding regardless"); - cont:; - BFree(port_usage); - } - - // set UDP dgram send address - BIPAddr ipaddr; - BIPAddr_InitInvalid(&ipaddr); - BDatagram_SetSendAddrs(&con->udp_dgram, addr, ipaddr); - - // init UDP dgram interfaces - BDatagram_SendAsync_Init(&con->udp_dgram, server_options.udp_mtu); - BDatagram_RecvAsync_Init(&con->udp_dgram, server_options.udp_mtu); - - // init UDP writer - BufferWriter_Init(&con->udp_send_writer, server_options.udp_mtu, BReactor_PendingGroup(&server_ss)); - - // init UDP buffer - if (!PacketBuffer_Init(&con->udp_send_buffer, BufferWriter_GetOutput(&con->udp_send_writer), BDatagram_SendAsync_GetIf(&con->udp_dgram), CONNECTION_UDP_BUFFER_SIZE, BReactor_PendingGroup(&server_ss))) { - client_log(client, BLOG_ERROR, "PacketBuffer_Init failed"); - goto fail4; - } - - // init UDP recv interface - PacketPassInterface_Init(&con->udp_recv_if, server_options.udp_mtu, (PacketPassInterface_handler_send)connection_udp_recv_if_handler_send, con, BReactor_PendingGroup(&server_ss)); - - // init UDP recv buffer - if (!SinglePacketBuffer_Init(&con->udp_recv_buffer, BDatagram_RecvAsync_GetIf(&con->udp_dgram), &con->udp_recv_if, BReactor_PendingGroup(&server_ss))) { - client_log(client, BLOG_ERROR, "SinglePacketBuffer_Init failed"); - goto fail5; - } - - // insert to client's connections tree - ASSERT_EXECUTE(BAVL_Insert(&client->connections_tree, &con->connections_tree_node, NULL)) - - // insert to client's connections list - LinkedList1_Append(&client->connections_list, &con->connections_list_node); - - // increment number of connections - client->num_connections++; - - connection_log(con, BLOG_DEBUG, "initialized"); - - return; - -fail5: - PacketPassInterface_Free(&con->udp_recv_if); - PacketBuffer_Free(&con->udp_send_buffer); -fail4: - BufferWriter_Free(&con->udp_send_writer); - BDatagram_RecvAsync_Free(&con->udp_dgram); - BDatagram_SendAsync_Free(&con->udp_dgram); - BDatagram_Free(&con->udp_dgram); -fail2: - PacketProtoFlow_Free(&con->send_ppflow); -fail1: - PacketPassFairQueueFlow_Free(&con->send_qflow); - BPending_Free(&con->first_job); - free(con); -fail0: - return; -} - -void connection_free (struct connection *con) -{ - struct client *client = con->client; - PacketPassFairQueueFlow_AssertFree(&con->send_qflow); - - if (con->closing) { - // remove from client's closing connections list - LinkedList1_Remove(&client->closing_connections_list, &con->closing_connections_list_node); - } else { - // decrement number of connections - client->num_connections--; - - // remove from client's connections list - LinkedList1_Remove(&client->connections_list, &con->connections_list_node); - - // remove from client's connections tree - BAVL_Remove(&client->connections_tree, &con->connections_tree_node); - - // free UDP - connection_free_udp(con); - } - - // free send PacketProtoFlow - PacketProtoFlow_Free(&con->send_ppflow); - - // free send queue flow - PacketPassFairQueueFlow_Free(&con->send_qflow); - - // free first job - BPending_Free(&con->first_job); - - // free structure - free(con); -} - -void connection_logfunc (struct connection *con) -{ - client_logfunc(con->client); - - if (con->closing) { - BLog_Append("old connection %"PRIu16": ", con->conid); - } else { - BLog_Append("connection %"PRIu16": ", con->conid); - } -} - -void connection_log (struct connection *con, int level, const char *fmt, ...) -{ - va_list vl; - va_start(vl, fmt); - BLog_LogViaFuncVarArg((BLog_logfunc)connection_logfunc, con, BLOG_CURRENT_CHANNEL, level, fmt, vl); - va_end(vl); -} - -void connection_free_udp (struct connection *con) -{ - // free UDP receive buffer - SinglePacketBuffer_Free(&con->udp_recv_buffer); - - // free UDP receive interface - PacketPassInterface_Free(&con->udp_recv_if); - - // free UDP buffer - PacketBuffer_Free(&con->udp_send_buffer); - - // free UDP writer - BufferWriter_Free(&con->udp_send_writer); - - // free UDP dgram interfaces - BDatagram_RecvAsync_Free(&con->udp_dgram); - BDatagram_SendAsync_Free(&con->udp_dgram); - - // free UDP dgram - BDatagram_Free(&con->udp_dgram); -} - -void connection_first_job_handler (struct connection *con) -{ - ASSERT(!con->closing) - - connection_send_to_udp(con, con->first_data, con->first_data_len); -} - -void connection_send_to_client (struct connection *con, uint8_t flags, const uint8_t *data, int data_len) -{ - ASSERT(data_len >= 0) - ASSERT(data_len <= server_options.udp_mtu) - - size_t addr_len = (con->orig_addr.type == BADDR_TYPE_IPV6) ? sizeof(struct udpgw_addr_ipv6) : - (con->orig_addr.type == BADDR_TYPE_IPV4) ? sizeof(struct udpgw_addr_ipv4) : 0; - if (data_len > udpgw_mtu - (int)(sizeof(struct udpgw_header) + addr_len)) { - connection_log(con, BLOG_WARNING, "packet is too large, cannot send to client"); - return; - } - - // get buffer location - uint8_t *out; - if (!BufferWriter_StartPacket(con->send_if, &out)) { - connection_log(con, BLOG_ERROR, "out of client buffer"); - return; - } - int out_pos = 0; - - if (con->orig_addr.type == BADDR_TYPE_IPV6) { - flags |= UDPGW_CLIENT_FLAG_IPV6; - } - - // write header - struct udpgw_header header; - header.flags = htol8(flags); - header.conid = htol16(con->conid); - memcpy(out + out_pos, &header, sizeof(header)); - out_pos += sizeof(header); - - // write address - switch (con->orig_addr.type) { - case BADDR_TYPE_IPV4: { - struct udpgw_addr_ipv4 addr_ipv4; - addr_ipv4.addr_ip = con->orig_addr.ipv4.ip; - addr_ipv4.addr_port = con->orig_addr.ipv4.port; - memcpy(out + out_pos, &addr_ipv4, sizeof(addr_ipv4)); - out_pos += sizeof(addr_ipv4); - } break; - case BADDR_TYPE_IPV6: { - struct udpgw_addr_ipv6 addr_ipv6; - memcpy(addr_ipv6.addr_ip, con->orig_addr.ipv6.ip, sizeof(addr_ipv6.addr_ip)); - addr_ipv6.addr_port = con->orig_addr.ipv6.port; - memcpy(out + out_pos, &addr_ipv6, sizeof(addr_ipv6)); - out_pos += sizeof(addr_ipv6); - } break; - } - - // write message - memcpy(out + out_pos, data, data_len); - out_pos += data_len; - - // submit written message - ASSERT(out_pos <= udpgw_mtu) - BufferWriter_EndPacket(con->send_if, out_pos); -} - -int connection_send_to_udp (struct connection *con, const uint8_t *data, int data_len) -{ - struct client *client = con->client; - ASSERT(!con->closing) - ASSERT(data_len >= 0) - ASSERT(data_len <= server_options.udp_mtu) - - connection_log(con, BLOG_DEBUG, "from client %d bytes", data_len); - - // set last use time - con->last_use_time = btime_gettime(); - - // move connection to front - LinkedList1_Remove(&client->connections_list, &con->connections_list_node); - LinkedList1_Append(&client->connections_list, &con->connections_list_node); - - // get buffer location - uint8_t *out; - if (!BufferWriter_StartPacket(&con->udp_send_writer, &out)) { - connection_log(con, BLOG_ERROR, "out of UDP buffer"); - return 0; - } - - // write message - memcpy(out, data, data_len); - - // submit written message - BufferWriter_EndPacket(&con->udp_send_writer, data_len); - - return 1; -} - -void connection_close (struct connection *con) -{ - struct client *client = con->client; - ASSERT(!con->closing) - - // if possible, free connection immediately - if (!PacketPassFairQueueFlow_IsBusy(&con->send_qflow)) { - connection_free(con); - return; - } - - connection_log(con, BLOG_DEBUG, "closing later"); - - // decrement number of connections - client->num_connections--; - - // remove from client's connections list - LinkedList1_Remove(&client->connections_list, &con->connections_list_node); - - // remove from client's connections tree - BAVL_Remove(&client->connections_tree, &con->connections_tree_node); - - // free UDP - connection_free_udp(con); - - // insert to client's closing connections list - LinkedList1_Append(&client->closing_connections_list, &con->closing_connections_list_node); - - // set busy handler - PacketPassFairQueueFlow_SetBusyHandler(&con->send_qflow, (PacketPassFairQueue_handler_busy)connection_send_qflow_busy_handler, con); - - // unset first job - BPending_Unset(&con->first_job); - - // set closing - con->closing = 1; -} - -void connection_send_qflow_busy_handler (struct connection *con) -{ - ASSERT(con->closing) - PacketPassFairQueueFlow_AssertFree(&con->send_qflow); - - connection_log(con, BLOG_DEBUG, "closing finally"); - - // free connection - connection_free(con); -} - -void connection_dgram_handler_event (struct connection *con, int event) -{ - ASSERT(!con->closing) - - connection_log(con, BLOG_INFO, "UDP error"); - - // close connection - connection_close(con); -} - -void connection_udp_recv_if_handler_send (struct connection *con, uint8_t *data, int data_len) -{ - struct client *client = con->client; - ASSERT(!con->closing) - ASSERT(data_len >= 0) - ASSERT(data_len <= server_options.udp_mtu) - - connection_log(con, BLOG_DEBUG, "from UDP %d bytes", data_len); - - // set last use time - con->last_use_time = btime_gettime(); - - // move connection to front - LinkedList1_Remove(&client->connections_list, &con->connections_list_node); - LinkedList1_Append(&client->connections_list, &con->connections_list_node); - - // accept packet - PacketPassInterface_Done(&con->udp_recv_if); - - // send packet to client - connection_send_to_client(con, 0, data, data_len); -} - -struct connection * find_connection (struct client *client, uint16_t conid) -{ - BAVLNode *tree_node = BAVL_LookupExact(&client->connections_tree, &conid); - if (!tree_node) { - return NULL; - } - struct connection *con = UPPER_OBJECT(tree_node, struct connection, connections_tree_node); - ASSERT(con->conid == conid) - ASSERT(!con->closing) - - return con; -} - -int uint16_comparator (void *unused, uint16_t *v1, uint16_t *v2) -{ - return B_COMPARE(*v1, *v2); -} - -void maybe_update_dns (void) -{ -#ifndef BADVPN_USE_WINAPI - btime_t now = btime_gettime(); - if (now < btime_add(last_dns_update_time, DNS_UPDATE_TIME)) { - return; - } - last_dns_update_time = now; - BLog(BLOG_DEBUG, "update dns"); - - if (res_init() != 0) { - BLog(BLOG_ERROR, "res_init failed"); - goto fail; - } - - if (_res.nscount == 0) { - BLog(BLOG_ERROR, "no name servers available"); - goto fail; - } - - BAddr addr; - BAddr_InitIPv4(&addr, _res.nsaddr_list[0].sin_addr.s_addr, hton16(53)); - - if (!BAddr_Compare(&addr, &dns_addr)) { - char str[BADDR_MAX_PRINT_LEN]; - BAddr_Print(&addr, str); - BLog(BLOG_INFO, "using DNS server %s", str); - } - - dns_addr = addr; - return; - -fail: - BAddr_InitNone(&dns_addr); -#endif -} \ No newline at end of file diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/udpgw/udpgw.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/udpgw/udpgw.h deleted file mode 100644 index 45f2e5e4..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/udpgw/udpgw.h +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Copyright (C) Ambroz Bizjak - * - * 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 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE 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. - */ - -// name of the program -#define PROGRAM_NAME "udpgw" - -// maxiumum listen addresses -#define MAX_LISTEN_ADDRS 16 - -// maximum datagram size -#define DEFAULT_UDP_MTU 65520 - -// connection buffer size for sending to client, in packets -#define CONNECTION_CLIENT_BUFFER_SIZE 1 - -// connection buffer size for sending to UDP, in packets -#define CONNECTION_UDP_BUFFER_SIZE 1 - -// maximum number of clients -#define DEFAULT_MAX_CLIENTS 3 - -// maximum connections for client -#define DEFAULT_MAX_CONNECTIONS_FOR_CLIENT 256 - -// how long after nothing has been received to disconnect a client -#define CLIENT_DISCONNECT_TIMEOUT 20000 - -// SO_SNDBFUF socket option for clients, 0 to not set -#define CLIENT_DEFAULT_SOCKET_SEND_BUFFER 1048576 - -extern int udpgw_main (int argc, char **argv); \ No newline at end of file diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/udpgw_client/UdpGwClient.c b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/udpgw_client/UdpGwClient.c deleted file mode 100644 index e4e458cc..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/udpgw_client/UdpGwClient.c +++ /dev/null @@ -1,597 +0,0 @@ -/* - * Copyright (C) Ambroz Bizjak - * Contributions: - * Transparent DNS: Copyright (C) Kerem Hadimli - * - * 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 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE 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. - */ - -#include -#include - -#include "misc/offset.h" -#include "misc/byteorder.h" -#include "misc/compare.h" -#include "base/BLog.h" - -#include "udpgw_client/UdpGwClient.h" - -#include "generated/blog_channel_UdpGwClient.h" - -static int uint16_comparator (void *unused, uint16_t *v1, uint16_t *v2); -static int conaddr_comparator (void *unused, struct UdpGwClient_conaddr *v1, struct UdpGwClient_conaddr *v2); -static void free_server (UdpGwClient *o); -static void decoder_handler_error (UdpGwClient *o); -static void recv_interface_handler_send (UdpGwClient *o, uint8_t *data, int data_len); -static void send_monitor_handler (UdpGwClient *o); -static void keepalive_if_handler_done (UdpGwClient *o); -static struct UdpGwClient_connection * find_connection_by_conaddr (UdpGwClient *o, struct UdpGwClient_conaddr conaddr); -static struct UdpGwClient_connection * find_connection_by_conid (UdpGwClient *o, uint16_t conid); -static uint16_t find_unused_conid (UdpGwClient *o); -static void connection_init (UdpGwClient *o, struct UdpGwClient_conaddr conaddr, uint8_t flags, const uint8_t *data, int data_len); -static void connection_free (struct UdpGwClient_connection *con); -static void connection_first_job_handler (struct UdpGwClient_connection *con); -static void connection_send (struct UdpGwClient_connection *con, uint8_t flags, const uint8_t *data, int data_len); -static struct UdpGwClient_connection * reuse_connection (UdpGwClient *o, struct UdpGwClient_conaddr conaddr); - -static int uint16_comparator (void *unused, uint16_t *v1, uint16_t *v2) -{ - return B_COMPARE(*v1, *v2); -} - -static int conaddr_comparator (void *unused, struct UdpGwClient_conaddr *v1, struct UdpGwClient_conaddr *v2) -{ - int r = BAddr_CompareOrder(&v1->remote_addr, &v2->remote_addr); - if (r) { - return r; - } - return BAddr_CompareOrder(&v1->local_addr, &v2->local_addr); -} - -static void free_server (UdpGwClient *o) -{ - // disconnect send connector - PacketPassConnector_DisconnectOutput(&o->send_connector); - - // free send sender - PacketStreamSender_Free(&o->send_sender); - - // free receive decoder - PacketProtoDecoder_Free(&o->recv_decoder); - - // free receive interface - PacketPassInterface_Free(&o->recv_if); -} - -static void decoder_handler_error (UdpGwClient *o) -{ - DebugObject_Access(&o->d_obj); - ASSERT(o->have_server) - - BLog(BLOG_ERROR, "decoder error"); - - // report error - o->handler_servererror(o->user); - return; -} - -static void recv_interface_handler_send (UdpGwClient *o, uint8_t *data, int data_len) -{ - DebugObject_Access(&o->d_obj); - ASSERT(o->have_server) - ASSERT(data_len >= 0) - ASSERT(data_len <= o->udpgw_mtu) - - // accept packet - PacketPassInterface_Done(&o->recv_if); - - // check header - if (data_len < sizeof(struct udpgw_header)) { - BLog(BLOG_ERROR, "missing header"); - return; - } - struct udpgw_header header; - memcpy(&header, data, sizeof(header)); - data += sizeof(header); - data_len -= sizeof(header); - uint8_t flags = ltoh8(header.flags); - uint16_t conid = ltoh16(header.conid); - - // parse address - BAddr remote_addr; - if ((flags & UDPGW_CLIENT_FLAG_IPV6)) { - if (data_len < sizeof(struct udpgw_addr_ipv6)) { - BLog(BLOG_ERROR, "missing ipv6 address"); - return; - } - struct udpgw_addr_ipv6 addr_ipv6; - memcpy(&addr_ipv6, data, sizeof(addr_ipv6)); - data += sizeof(addr_ipv6); - data_len -= sizeof(addr_ipv6); - BAddr_InitIPv6(&remote_addr, addr_ipv6.addr_ip, addr_ipv6.addr_port); - } else { - if (data_len < sizeof(struct udpgw_addr_ipv4)) { - BLog(BLOG_ERROR, "missing ipv4 address"); - return; - } - struct udpgw_addr_ipv4 addr_ipv4; - memcpy(&addr_ipv4, data, sizeof(addr_ipv4)); - data += sizeof(addr_ipv4); - data_len -= sizeof(addr_ipv4); - BAddr_InitIPv4(&remote_addr, addr_ipv4.addr_ip, addr_ipv4.addr_port); - } - - // check remaining data - if (data_len > o->udp_mtu) { - BLog(BLOG_ERROR, "too much data"); - return; - } - - // find connection - struct UdpGwClient_connection *con = find_connection_by_conid(o, conid); - if (!con) { - BLog(BLOG_ERROR, "unknown conid"); - return; - } - - // check remote address - if (BAddr_CompareOrder(&con->conaddr.remote_addr, &remote_addr) != 0) { - BLog(BLOG_ERROR, "wrong remote address"); - return; - } - - // move connection to front of the list - LinkedList1_Remove(&o->connections_list, &con->connections_list_node); - LinkedList1_Append(&o->connections_list, &con->connections_list_node); - - // pass packet to user - o->handler_received(o->user, con->conaddr.local_addr, con->conaddr.remote_addr, data, data_len); - return; -} - -static void send_monitor_handler (UdpGwClient *o) -{ - DebugObject_Access(&o->d_obj); - - if (o->keepalive_sending) { - return; - } - - BLog(BLOG_INFO, "keepalive"); - - // send keepalive - PacketPassInterface_Sender_Send(o->keepalive_if, (uint8_t *)&o->keepalive_packet, sizeof(o->keepalive_packet)); - - // set sending keep-alive - o->keepalive_sending = 1; -} - -static void keepalive_if_handler_done (UdpGwClient *o) -{ - DebugObject_Access(&o->d_obj); - ASSERT(o->keepalive_sending) - - // set not sending keepalive - o->keepalive_sending = 0; -} - -static struct UdpGwClient_connection * find_connection_by_conaddr (UdpGwClient *o, struct UdpGwClient_conaddr conaddr) -{ - BAVLNode *tree_node = BAVL_LookupExact(&o->connections_tree_by_conaddr, &conaddr); - if (!tree_node) { - return NULL; - } - - return UPPER_OBJECT(tree_node, struct UdpGwClient_connection, connections_tree_by_conaddr_node); -} - -static struct UdpGwClient_connection * find_connection_by_conid (UdpGwClient *o, uint16_t conid) -{ - BAVLNode *tree_node = BAVL_LookupExact(&o->connections_tree_by_conid, &conid); - if (!tree_node) { - return NULL; - } - - return UPPER_OBJECT(tree_node, struct UdpGwClient_connection, connections_tree_by_conid_node); -} - -static uint16_t find_unused_conid (UdpGwClient *o) -{ - ASSERT(o->num_connections < o->max_connections) - - while (1) { - if (!find_connection_by_conid(o, o->next_conid)) { - return o->next_conid; - } - - if (o->next_conid == o->max_connections - 1) { - o->next_conid = 0; - } else { - o->next_conid++; - } - } -} - -static void connection_init (UdpGwClient *o, struct UdpGwClient_conaddr conaddr, uint8_t flags, const uint8_t *data, int data_len) -{ - ASSERT(o->num_connections < o->max_connections) - ASSERT(!find_connection_by_conaddr(o, conaddr)) - ASSERT(data_len >= 0) - ASSERT(data_len <= o->udp_mtu) - - // allocate structure - struct UdpGwClient_connection *con = (struct UdpGwClient_connection *)malloc(sizeof(*con)); - if (!con) { - BLog(BLOG_ERROR, "malloc failed"); - goto fail0; - } - - // init arguments - con->client = o; - con->conaddr = conaddr; - con->first_flags = flags; - con->first_data = data; - con->first_data_len = data_len; - - // allocate conid - con->conid = find_unused_conid(o); - - // init first job - BPending_Init(&con->first_job, BReactor_PendingGroup(o->reactor), (BPending_handler)connection_first_job_handler, con); - BPending_Set(&con->first_job); - - // init queue flow - PacketPassFairQueueFlow_Init(&con->send_qflow, &o->send_queue); - - // init PacketProtoFlow - if (!PacketProtoFlow_Init(&con->send_ppflow, o->udpgw_mtu, o->send_buffer_size, PacketPassFairQueueFlow_GetInput(&con->send_qflow), BReactor_PendingGroup(o->reactor))) { - BLog(BLOG_ERROR, "PacketProtoFlow_Init failed"); - goto fail1; - } - con->send_if = PacketProtoFlow_GetInput(&con->send_ppflow); - - // insert to connections tree by conaddr - ASSERT_EXECUTE(BAVL_Insert(&o->connections_tree_by_conaddr, &con->connections_tree_by_conaddr_node, NULL)) - - // insert to connections tree by conid - ASSERT_EXECUTE(BAVL_Insert(&o->connections_tree_by_conid, &con->connections_tree_by_conid_node, NULL)) - - // insert to connections list - LinkedList1_Append(&o->connections_list, &con->connections_list_node); - - // increment number of connections - o->num_connections++; - - return; - -fail1: - PacketPassFairQueueFlow_Free(&con->send_qflow); - BPending_Free(&con->first_job); - free(con); -fail0: - return; -} - -static void connection_free (struct UdpGwClient_connection *con) -{ - UdpGwClient *o = con->client; - PacketPassFairQueueFlow_AssertFree(&con->send_qflow); - - // decrement number of connections - o->num_connections--; - - // remove from connections list - LinkedList1_Remove(&o->connections_list, &con->connections_list_node); - - // remove from connections tree by conid - BAVL_Remove(&o->connections_tree_by_conid, &con->connections_tree_by_conid_node); - - // remove from connections tree by conaddr - BAVL_Remove(&o->connections_tree_by_conaddr, &con->connections_tree_by_conaddr_node); - - // free PacketProtoFlow - PacketProtoFlow_Free(&con->send_ppflow); - - // free queue flow - PacketPassFairQueueFlow_Free(&con->send_qflow); - - // free first job - BPending_Free(&con->first_job); - - // free structure - free(con); -} - -static void connection_first_job_handler (struct UdpGwClient_connection *con) -{ - connection_send(con, UDPGW_CLIENT_FLAG_REBIND|con->first_flags, con->first_data, con->first_data_len); -} - -static void connection_send (struct UdpGwClient_connection *con, uint8_t flags, const uint8_t *data, int data_len) -{ - UdpGwClient *o = con->client; - B_USE(o) - ASSERT(data_len >= 0) - ASSERT(data_len <= o->udp_mtu) - - // get buffer location - uint8_t *out; - if (!BufferWriter_StartPacket(con->send_if, &out)) { - BLog(BLOG_ERROR, "out of buffer"); - return; - } - int out_pos = 0; - - if (con->conaddr.remote_addr.type == BADDR_TYPE_IPV6) { - flags |= UDPGW_CLIENT_FLAG_IPV6; - } - - // write header - struct udpgw_header header; - header.flags = ltoh8(flags); - header.conid = ltoh16(con->conid); - memcpy(out + out_pos, &header, sizeof(header)); - out_pos += sizeof(header); - - // write address - switch (con->conaddr.remote_addr.type) { - case BADDR_TYPE_IPV4: { - struct udpgw_addr_ipv4 addr_ipv4; - addr_ipv4.addr_ip = con->conaddr.remote_addr.ipv4.ip; - addr_ipv4.addr_port = con->conaddr.remote_addr.ipv4.port; - memcpy(out + out_pos, &addr_ipv4, sizeof(addr_ipv4)); - out_pos += sizeof(addr_ipv4); - } break; - case BADDR_TYPE_IPV6: { - struct udpgw_addr_ipv6 addr_ipv6; - memcpy(addr_ipv6.addr_ip, con->conaddr.remote_addr.ipv6.ip, sizeof(addr_ipv6.addr_ip)); - addr_ipv6.addr_port = con->conaddr.remote_addr.ipv6.port; - memcpy(out + out_pos, &addr_ipv6, sizeof(addr_ipv6)); - out_pos += sizeof(addr_ipv6); - } break; - } - - // write packet to buffer - memcpy(out + out_pos, data, data_len); - out_pos += data_len; - - // submit packet to buffer - BufferWriter_EndPacket(con->send_if, out_pos); -} - -static struct UdpGwClient_connection * reuse_connection (UdpGwClient *o, struct UdpGwClient_conaddr conaddr) -{ - ASSERT(!find_connection_by_conaddr(o, conaddr)) - ASSERT(o->num_connections > 0) - - // get least recently used connection - struct UdpGwClient_connection *con = UPPER_OBJECT(LinkedList1_GetFirst(&o->connections_list), struct UdpGwClient_connection, connections_list_node); - - // remove from connections tree by conaddr - BAVL_Remove(&o->connections_tree_by_conaddr, &con->connections_tree_by_conaddr_node); - - // set new conaddr - con->conaddr = conaddr; - - // insert to connections tree by conaddr - ASSERT_EXECUTE(BAVL_Insert(&o->connections_tree_by_conaddr, &con->connections_tree_by_conaddr_node, NULL)) - - return con; -} - -int UdpGwClient_Init (UdpGwClient *o, int udp_mtu, int max_connections, int send_buffer_size, btime_t keepalive_time, BReactor *reactor, void *user, - UdpGwClient_handler_servererror handler_servererror, - UdpGwClient_handler_received handler_received) -{ - ASSERT(udp_mtu >= 0) - ASSERT(udpgw_compute_mtu(udp_mtu) >= 0) - ASSERT(udpgw_compute_mtu(udp_mtu) <= PACKETPROTO_MAXPAYLOAD) - ASSERT(max_connections > 0) - ASSERT(send_buffer_size > 0) - - // init arguments - o->udp_mtu = udp_mtu; - o->max_connections = max_connections; - o->send_buffer_size = send_buffer_size; - o->keepalive_time = keepalive_time; - o->reactor = reactor; - o->user = user; - o->handler_servererror = handler_servererror; - o->handler_received = handler_received; - - // limit max connections to number of conid's - if (o->max_connections > UINT16_MAX + 1) { - o->max_connections = UINT16_MAX + 1; - } - - // compute MTUs - o->udpgw_mtu = udpgw_compute_mtu(o->udp_mtu); - o->pp_mtu = o->udpgw_mtu + sizeof(struct packetproto_header); - - // init connections tree by conaddr - BAVL_Init(&o->connections_tree_by_conaddr, OFFSET_DIFF(struct UdpGwClient_connection, conaddr, connections_tree_by_conaddr_node), (BAVL_comparator)conaddr_comparator, NULL); - - // init connections tree by conid - BAVL_Init(&o->connections_tree_by_conid, OFFSET_DIFF(struct UdpGwClient_connection, conid, connections_tree_by_conid_node), (BAVL_comparator)uint16_comparator, NULL); - - // init connections list - LinkedList1_Init(&o->connections_list); - - // set zero connections - o->num_connections = 0; - - // set next conid - o->next_conid = 0; - - // init send connector - PacketPassConnector_Init(&o->send_connector, o->pp_mtu, BReactor_PendingGroup(o->reactor)); - - // init send monitor - PacketPassInactivityMonitor_Init(&o->send_monitor, PacketPassConnector_GetInput(&o->send_connector), o->reactor, o->keepalive_time, (PacketPassInactivityMonitor_handler)send_monitor_handler, o); - - // init send queue - if (!PacketPassFairQueue_Init(&o->send_queue, PacketPassInactivityMonitor_GetInput(&o->send_monitor), BReactor_PendingGroup(o->reactor), 0, 1)) { - goto fail0; - } - - // construct keepalive packet - o->keepalive_packet.pp.len = sizeof(o->keepalive_packet.udpgw); - memset(&o->keepalive_packet.udpgw, 0, sizeof(o->keepalive_packet.udpgw)); - o->keepalive_packet.udpgw.flags = UDPGW_CLIENT_FLAG_KEEPALIVE; - - // init keepalive queue flow - PacketPassFairQueueFlow_Init(&o->keepalive_qflow, &o->send_queue); - o->keepalive_if = PacketPassFairQueueFlow_GetInput(&o->keepalive_qflow); - - // init keepalive output - PacketPassInterface_Sender_Init(o->keepalive_if, (PacketPassInterface_handler_done)keepalive_if_handler_done, o); - - // set not sending keepalive - o->keepalive_sending = 0; - - // set have no server - o->have_server = 0; - - DebugObject_Init(&o->d_obj); - return 1; - -fail0: - PacketPassInactivityMonitor_Free(&o->send_monitor); - PacketPassConnector_Free(&o->send_connector); - return 0; -} - -void UdpGwClient_Free (UdpGwClient *o) -{ - DebugObject_Free(&o->d_obj); - - // allow freeing send queue flows - PacketPassFairQueue_PrepareFree(&o->send_queue); - - // free connections - while (!LinkedList1_IsEmpty(&o->connections_list)) { - struct UdpGwClient_connection *con = UPPER_OBJECT(LinkedList1_GetFirst(&o->connections_list), struct UdpGwClient_connection, connections_list_node); - connection_free(con); - } - - // free server - if (o->have_server) { - free_server(o); - } - - // free keepalive queue flow - PacketPassFairQueueFlow_Free(&o->keepalive_qflow); - - // free send queue - PacketPassFairQueue_Free(&o->send_queue); - - // free send - PacketPassInactivityMonitor_Free(&o->send_monitor); - - // free send connector - PacketPassConnector_Free(&o->send_connector); -} - -void UdpGwClient_SubmitPacket (UdpGwClient *o, BAddr local_addr, BAddr remote_addr, int is_dns, const uint8_t *data, int data_len) -{ - DebugObject_Access(&o->d_obj); - ASSERT(local_addr.type == BADDR_TYPE_IPV4 || local_addr.type == BADDR_TYPE_IPV6) - ASSERT(remote_addr.type == BADDR_TYPE_IPV4 || remote_addr.type == BADDR_TYPE_IPV6) - ASSERT(data_len >= 0) - ASSERT(data_len <= o->udp_mtu) - - // build conaddr - struct UdpGwClient_conaddr conaddr; - conaddr.local_addr = local_addr; - conaddr.remote_addr = remote_addr; - - // lookup connection - struct UdpGwClient_connection *con = find_connection_by_conaddr(o, conaddr); - - uint8_t flags = 0; - - if (is_dns) { - // route to remote DNS server instead of provided address - flags |= UDPGW_CLIENT_FLAG_DNS; - } - - // if no connection and can't create a new one, reuse the least recently used une - if (!con && o->num_connections == o->max_connections) { - con = reuse_connection(o, conaddr); - flags |= UDPGW_CLIENT_FLAG_REBIND; - } - - if (!con) { - // create new connection - connection_init(o, conaddr, flags, data, data_len); - } else { - // move connection to front of the list - LinkedList1_Remove(&o->connections_list, &con->connections_list_node); - LinkedList1_Append(&o->connections_list, &con->connections_list_node); - - // send packet to existing connection - connection_send(con, flags, data, data_len); - } -} - -int UdpGwClient_ConnectServer (UdpGwClient *o, StreamPassInterface *send_if, StreamRecvInterface *recv_if) -{ - DebugObject_Access(&o->d_obj); - ASSERT(!o->have_server) - - // init receive interface - PacketPassInterface_Init(&o->recv_if, o->udpgw_mtu, (PacketPassInterface_handler_send)recv_interface_handler_send, o, BReactor_PendingGroup(o->reactor)); - - // init receive decoder - if (!PacketProtoDecoder_Init(&o->recv_decoder, recv_if, &o->recv_if, BReactor_PendingGroup(o->reactor), o, (PacketProtoDecoder_handler_error)decoder_handler_error)) { - BLog(BLOG_ERROR, "PacketProtoDecoder_Init failed"); - goto fail1; - } - - // init send sender - PacketStreamSender_Init(&o->send_sender, send_if, o->pp_mtu, BReactor_PendingGroup(o->reactor)); - - // connect send connector - PacketPassConnector_ConnectOutput(&o->send_connector, PacketStreamSender_GetInput(&o->send_sender)); - - // set have server - o->have_server = 1; - - return 1; - -fail1: - PacketPassInterface_Free(&o->recv_if); - return 0; -} - -void UdpGwClient_DisconnectServer (UdpGwClient *o) -{ - DebugObject_Access(&o->d_obj); - ASSERT(o->have_server) - - // free server - free_server(o); - - // set have no server - o->have_server = 0; -} diff --git a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/udpgw_client/UdpGwClient.h b/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/udpgw_client/UdpGwClient.h deleted file mode 100644 index fae257ba..00000000 --- a/client/3rd/PacketProcessor/PacketProcessor/tun2socks-iOS/udpgw_client/UdpGwClient.h +++ /dev/null @@ -1,118 +0,0 @@ -/* - * Copyright (C) Ambroz Bizjak - * Contributions: - * Transparent DNS: Copyright (C) Kerem Hadimli - * - * 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 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE 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. - */ - -#ifndef BADVPN_UDPGW_CLIENT_UDPGWCLIENT_H -#define BADVPN_UDPGW_CLIENT_UDPGWCLIENT_H - -#include - -#include "protocol/udpgw_proto.h" -#include "misc/debug.h" -#include "misc/packed.h" -#include "structure/BAVL.h" -#include "structure/LinkedList1.h" -#include "base/DebugObject.h" -#include "system/BAddr.h" -#include "base/BPending.h" -#include "flow/PacketPassFairQueue.h" -#include "flow/PacketStreamSender.h" -#include "flow/PacketProtoFlow.h" -#include "flow/PacketProtoDecoder.h" -#include "flow/PacketPassConnector.h" -#include "flowextra/PacketPassInactivityMonitor.h" - -typedef void (*UdpGwClient_handler_servererror) (void *user); -typedef void (*UdpGwClient_handler_received) (void *user, BAddr local_addr, BAddr remote_addr, const uint8_t *data, int data_len); - -B_START_PACKED -struct UdpGwClient__keepalive_packet { - struct packetproto_header pp; - struct udpgw_header udpgw; -} B_PACKED; -B_END_PACKED - -typedef struct { - int udp_mtu; - int max_connections; - int send_buffer_size; - btime_t keepalive_time; - BReactor *reactor; - void *user; - UdpGwClient_handler_servererror handler_servererror; - UdpGwClient_handler_received handler_received; - int udpgw_mtu; - int pp_mtu; - BAVL connections_tree_by_conaddr; - BAVL connections_tree_by_conid; - LinkedList1 connections_list; - int num_connections; - int next_conid; - PacketPassFairQueue send_queue; - PacketPassInactivityMonitor send_monitor; - PacketPassConnector send_connector; - struct UdpGwClient__keepalive_packet keepalive_packet; - PacketPassInterface *keepalive_if; - PacketPassFairQueueFlow keepalive_qflow; - int keepalive_sending; - int have_server; - PacketStreamSender send_sender; - PacketProtoDecoder recv_decoder; - PacketPassInterface recv_if; - DebugObject d_obj; -} UdpGwClient; - -struct UdpGwClient_conaddr { - BAddr local_addr; - BAddr remote_addr; -}; - -struct UdpGwClient_connection { - UdpGwClient *client; - struct UdpGwClient_conaddr conaddr; - uint8_t first_flags; - const uint8_t *first_data; - int first_data_len; - uint16_t conid; - BPending first_job; - BufferWriter *send_if; - PacketProtoFlow send_ppflow; - PacketPassFairQueueFlow send_qflow; - BAVLNode connections_tree_by_conaddr_node; - BAVLNode connections_tree_by_conid_node; - LinkedList1Node connections_list_node; -}; - -int UdpGwClient_Init (UdpGwClient *o, int udp_mtu, int max_connections, int send_buffer_size, btime_t keepalive_time, BReactor *reactor, void *user, - UdpGwClient_handler_servererror handler_servererror, - UdpGwClient_handler_received handler_received) WARN_UNUSED; -void UdpGwClient_Free (UdpGwClient *o); -void UdpGwClient_SubmitPacket (UdpGwClient *o, BAddr local_addr, BAddr remote_addr, int is_dns, const uint8_t *data, int data_len); -int UdpGwClient_ConnectServer (UdpGwClient *o, StreamPassInterface *send_if, StreamRecvInterface *recv_if) WARN_UNUSED; -void UdpGwClient_DisconnectServer (UdpGwClient *o); - -#endif diff --git a/client/3rd/ShadowPath b/client/3rd/ShadowPath deleted file mode 160000 index 51942d6b..00000000 --- a/client/3rd/ShadowPath +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 51942d6b4cbacc056a33993a3aa4eb0db6afcd94 diff --git a/client/3rd/ShadowSocks/ShadowSocks.xcodeproj/project.pbxproj b/client/3rd/ShadowSocks/ShadowSocks.xcodeproj/project.pbxproj deleted file mode 100644 index 1b1480e5..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks.xcodeproj/project.pbxproj +++ /dev/null @@ -1,1796 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 55; - objects = { - -/* Begin PBXBuildFile section */ - 190B1226276CF6B5002B86DD /* ShadowSocks.h in Headers */ = {isa = PBXBuildFile; fileRef = 190B1225276CF6B5002B86DD /* ShadowSocks.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 190B1DAE276CFC69002B86DD /* event.h in Headers */ = {isa = PBXBuildFile; fileRef = 190B1AB6276CFC67002B86DD /* event.h */; }; - 190B1DAF276CFC69002B86DD /* ev++.h in Headers */ = {isa = PBXBuildFile; fileRef = 190B1AB7276CFC67002B86DD /* ev++.h */; }; - 190B1DB0276CFC69002B86DD /* ev.h in Headers */ = {isa = PBXBuildFile; fileRef = 190B1AB8276CFC67002B86DD /* ev.h */; }; - 190B1E07276CFC69002B86DD /* libmbedcrypto.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 190B1B18276CFC67002B86DD /* libmbedcrypto.a */; platformFilter = ios; }; - 190B1E08276CFC69002B86DD /* libmbedx509.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 190B1B19276CFC67002B86DD /* libmbedx509.a */; platformFilter = ios; }; - 190B1E09276CFC69002B86DD /* libmbedtls.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 190B1B1A276CFC67002B86DD /* libmbedtls.a */; platformFilter = ios; }; - 190B1E0A276CFC69002B86DD /* ares_version.h in Headers */ = {isa = PBXBuildFile; fileRef = 190B1B1D276CFC67002B86DD /* ares_version.h */; }; - 190B1E0B276CFC69002B86DD /* ares_build.h in Headers */ = {isa = PBXBuildFile; fileRef = 190B1B1E276CFC67002B86DD /* ares_build.h */; }; - 190B1E0C276CFC69002B86DD /* ares.h in Headers */ = {isa = PBXBuildFile; fileRef = 190B1B1F276CFC67002B86DD /* ares.h */; }; - 190B1E0D276CFC69002B86DD /* ares_rules.h in Headers */ = {isa = PBXBuildFile; fileRef = 190B1B20276CFC67002B86DD /* ares_rules.h */; }; - 190B1E0E276CFC69002B86DD /* ares_dns.h in Headers */ = {isa = PBXBuildFile; fileRef = 190B1B21276CFC67002B86DD /* ares_dns.h */; }; - 190B2144276D0DB5002B86DD /* json.c in Sources */ = {isa = PBXBuildFile; fileRef = 190B1F45276D0DB3002B86DD /* json.c */; }; - 190B2145276D0DB5002B86DD /* utils.h in Headers */ = {isa = PBXBuildFile; fileRef = 190B1F46276D0DB3002B86DD /* utils.h */; }; - 190B2146276D0DB5002B86DD /* resolv.h in Headers */ = {isa = PBXBuildFile; fileRef = 190B1F47276D0DB3002B86DD /* resolv.h */; }; - 190B2147276D0DB5002B86DD /* winsock.h in Headers */ = {isa = PBXBuildFile; fileRef = 190B1F48276D0DB3002B86DD /* winsock.h */; }; - 190B2148276D0DB5002B86DD /* rule.c in Sources */ = {isa = PBXBuildFile; fileRef = 190B1F49276D0DB3002B86DD /* rule.c */; }; - 190B214A276D0DB5002B86DD /* acl.h in Headers */ = {isa = PBXBuildFile; fileRef = 190B1F4B276D0DB3002B86DD /* acl.h */; }; - 190B214B276D0DB5002B86DD /* plugin.h in Headers */ = {isa = PBXBuildFile; fileRef = 190B1F4C276D0DB3002B86DD /* plugin.h */; }; - 190B214C276D0DB5002B86DD /* aead.c in Sources */ = {isa = PBXBuildFile; fileRef = 190B1F4D276D0DB3002B86DD /* aead.c */; }; - 190B214D276D0DB5002B86DD /* ppbloom.c in Sources */ = {isa = PBXBuildFile; fileRef = 190B1F4E276D0DB3002B86DD /* ppbloom.c */; }; - 190B214E276D0DB5002B86DD /* base64.h in Headers */ = {isa = PBXBuildFile; fileRef = 190B1F4F276D0DB3002B86DD /* base64.h */; }; - 190B214F276D0DB5002B86DD /* netutils.h in Headers */ = {isa = PBXBuildFile; fileRef = 190B1F50276D0DB3002B86DD /* netutils.h */; }; - 190B2150276D0DB5002B86DD /* local.c in Sources */ = {isa = PBXBuildFile; fileRef = 190B1F51276D0DB3002B86DD /* local.c */; }; - 190B2151276D0DB5002B86DD /* manager.h in Headers */ = {isa = PBXBuildFile; fileRef = 190B1F52276D0DB3002B86DD /* manager.h */; }; - 190B2152276D0DB5002B86DD /* tunnel.h in Headers */ = {isa = PBXBuildFile; fileRef = 190B1F53276D0DB3002B86DD /* tunnel.h */; }; - 190B2153276D0DB5002B86DD /* cache.h in Headers */ = {isa = PBXBuildFile; fileRef = 190B1F54276D0DB3002B86DD /* cache.h */; }; - 190B2156276D0DB5002B86DD /* stream.h in Headers */ = {isa = PBXBuildFile; fileRef = 190B1F57276D0DB3002B86DD /* stream.h */; }; - 190B2157276D0DB5002B86DD /* uthash.h in Headers */ = {isa = PBXBuildFile; fileRef = 190B1F58276D0DB3002B86DD /* uthash.h */; }; - 190B2158276D0DB5002B86DD /* server.c in Sources */ = {isa = PBXBuildFile; fileRef = 190B1F59276D0DB3002B86DD /* server.c */; }; - 190B2159276D0DB5002B86DD /* jconf.h in Headers */ = {isa = PBXBuildFile; fileRef = 190B1F5A276D0DB3002B86DD /* jconf.h */; }; - 190B215A276D0DB5002B86DD /* crypto.h in Headers */ = {isa = PBXBuildFile; fileRef = 190B1F5B276D0DB3002B86DD /* crypto.h */; }; - 190B215B276D0DB5002B86DD /* udprelay.c in Sources */ = {isa = PBXBuildFile; fileRef = 190B1F5C276D0DB3002B86DD /* udprelay.c */; }; - 190B215C276D0DB5002B86DD /* winsock.c in Sources */ = {isa = PBXBuildFile; fileRef = 190B1F5D276D0DB3002B86DD /* winsock.c */; }; - 190B215E276D0DB5002B86DD /* resolv.c in Sources */ = {isa = PBXBuildFile; fileRef = 190B1F5F276D0DB3002B86DD /* resolv.c */; }; - 190B215F276D0DB5002B86DD /* utils.c in Sources */ = {isa = PBXBuildFile; fileRef = 190B1F60276D0DB3002B86DD /* utils.c */; }; - 190B2160276D0DB5002B86DD /* common.h in Headers */ = {isa = PBXBuildFile; fileRef = 190B1F61276D0DB3002B86DD /* common.h */; }; - 190B2161276D0DB5002B86DD /* json.h in Headers */ = {isa = PBXBuildFile; fileRef = 190B1F62276D0DB3002B86DD /* json.h */; }; - 190B2162276D0DB5002B86DD /* netutils.c in Sources */ = {isa = PBXBuildFile; fileRef = 190B1F63276D0DB3002B86DD /* netutils.c */; }; - 190B2163276D0DB5002B86DD /* base64.c in Sources */ = {isa = PBXBuildFile; fileRef = 190B1F64276D0DB3002B86DD /* base64.c */; }; - 190B2165276D0DB5002B86DD /* ppbloom.h in Headers */ = {isa = PBXBuildFile; fileRef = 190B1F66276D0DB3002B86DD /* ppbloom.h */; }; - 190B2166276D0DB5002B86DD /* aead.h in Headers */ = {isa = PBXBuildFile; fileRef = 190B1F67276D0DB3002B86DD /* aead.h */; }; - 190B2167276D0DB5002B86DD /* plugin.c in Sources */ = {isa = PBXBuildFile; fileRef = 190B1F68276D0DB3002B86DD /* plugin.c */; }; - 190B2168276D0DB5002B86DD /* acl.c in Sources */ = {isa = PBXBuildFile; fileRef = 190B1F69276D0DB3002B86DD /* acl.c */; }; - 190B2169276D0DB5002B86DD /* rule.h in Headers */ = {isa = PBXBuildFile; fileRef = 190B1F6A276D0DB3002B86DD /* rule.h */; }; - 190B216A276D0DB5002B86DD /* cache.c in Sources */ = {isa = PBXBuildFile; fileRef = 190B1F6B276D0DB3002B86DD /* cache.c */; }; - 190B216B276D0DB5002B86DD /* manager.c in Sources */ = {isa = PBXBuildFile; fileRef = 190B1F6C276D0DB3002B86DD /* manager.c */; }; - 190B216C276D0DB5002B86DD /* tunnel.c in Sources */ = {isa = PBXBuildFile; fileRef = 190B1F6D276D0DB3002B86DD /* tunnel.c */; }; - 190B216D276D0DB5002B86DD /* shadowsocks.h in Headers */ = {isa = PBXBuildFile; fileRef = 190B1F6E276D0DB3002B86DD /* shadowsocks.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 190B216E276D0DB5002B86DD /* local.h in Headers */ = {isa = PBXBuildFile; fileRef = 190B1F6F276D0DB3002B86DD /* local.h */; }; - 190B216F276D0DB5002B86DD /* crypto.c in Sources */ = {isa = PBXBuildFile; fileRef = 190B1F71276D0DB3002B86DD /* crypto.c */; }; - 190B2170276D0DB5002B86DD /* jconf.c in Sources */ = {isa = PBXBuildFile; fileRef = 190B1F72276D0DB3002B86DD /* jconf.c */; }; - 190B2171276D0DB5002B86DD /* server.h in Headers */ = {isa = PBXBuildFile; fileRef = 190B1F73276D0DB3002B86DD /* server.h */; }; - 190B2172276D0DB5002B86DD /* udprelay.h in Headers */ = {isa = PBXBuildFile; fileRef = 190B1F74276D0DB4002B86DD /* udprelay.h */; }; - 190B2174276D0DB5002B86DD /* socks5.h in Headers */ = {isa = PBXBuildFile; fileRef = 190B1F76276D0DB4002B86DD /* socks5.h */; }; - 190B2175276D0DB5002B86DD /* stream.c in Sources */ = {isa = PBXBuildFile; fileRef = 190B1F77276D0DB4002B86DD /* stream.c */; }; - 190B2268276D0DB6002B86DD /* bloom.c in Sources */ = {isa = PBXBuildFile; fileRef = 190B2095276D0DB4002B86DD /* bloom.c */; }; - 190B226C276D0DB6002B86DD /* bloom.h in Headers */ = {isa = PBXBuildFile; fileRef = 190B2099276D0DB4002B86DD /* bloom.h */; }; - 190B226E276D0DB6002B86DD /* murmurhash2.h in Headers */ = {isa = PBXBuildFile; fileRef = 190B209D276D0DB5002B86DD /* murmurhash2.h */; }; - 190B2270276D0DB6002B86DD /* MurmurHash2.c in Sources */ = {isa = PBXBuildFile; fileRef = 190B209F276D0DB5002B86DD /* MurmurHash2.c */; }; - 190B2294276D1697002B86DD /* storage.c in Sources */ = {isa = PBXBuildFile; fileRef = 190B2273276D1697002B86DD /* storage.c */; }; - 190B2295276D1697002B86DD /* inspection.c in Sources */ = {isa = PBXBuildFile; fileRef = 190B2274276D1697002B86DD /* inspection.c */; }; - 190B2297276D1697002B86DD /* ipv4_map.c in Sources */ = {isa = PBXBuildFile; fileRef = 190B2276276D1697002B86DD /* ipv4_map.c */; }; - 190B2298276D1697002B86DD /* ipv6_map.c in Sources */ = {isa = PBXBuildFile; fileRef = 190B2277276D1697002B86DD /* ipv6_map.c */; }; - 190B2299276D1697002B86DD /* allocation.c in Sources */ = {isa = PBXBuildFile; fileRef = 190B2278276D1697002B86DD /* allocation.c */; }; - 190B229A276D1697002B86DD /* expanded.c in Sources */ = {isa = PBXBuildFile; fileRef = 190B227B276D1697002B86DD /* expanded.c */; }; - 190B229B276D1697002B86DD /* basics.c in Sources */ = {isa = PBXBuildFile; fileRef = 190B227C276D1697002B86DD /* basics.c */; }; - 190B229C276D1697002B86DD /* assignments.c in Sources */ = {isa = PBXBuildFile; fileRef = 190B227D276D1697002B86DD /* assignments.c */; }; - 190B229D276D1697002B86DD /* bdd-iterator.c in Sources */ = {isa = PBXBuildFile; fileRef = 190B227E276D1697002B86DD /* bdd-iterator.c */; }; - 190B229E276D1697002B86DD /* read.c in Sources */ = {isa = PBXBuildFile; fileRef = 190B227F276D1697002B86DD /* read.c */; }; - 190B229F276D1697002B86DD /* reachable.c in Sources */ = {isa = PBXBuildFile; fileRef = 190B2280276D1697002B86DD /* reachable.c */; }; - 190B22A0276D1697002B86DD /* write.c in Sources */ = {isa = PBXBuildFile; fileRef = 190B2282276D1697002B86DD /* write.c */; }; - 190B22A1276D1697002B86DD /* ipv4_set.c in Sources */ = {isa = PBXBuildFile; fileRef = 190B2284276D1697002B86DD /* ipv4_set.c */; }; - 190B22A2276D1697002B86DD /* ipv6_set.c in Sources */ = {isa = PBXBuildFile; fileRef = 190B2285276D1697002B86DD /* ipv6_set.c */; }; - 190B22A3276D1697002B86DD /* storage.c in Sources */ = {isa = PBXBuildFile; fileRef = 190B2286276D1697002B86DD /* storage.c */; }; - 190B22A4276D1697002B86DD /* inspection.c in Sources */ = {isa = PBXBuildFile; fileRef = 190B2287276D1697002B86DD /* inspection.c */; }; - 190B22A5276D1697002B86DD /* iterator.c in Sources */ = {isa = PBXBuildFile; fileRef = 190B2288276D1697002B86DD /* iterator.c */; }; - 190B22A7276D1697002B86DD /* allocation.c in Sources */ = {isa = PBXBuildFile; fileRef = 190B228A276D1697002B86DD /* allocation.c */; }; - 190B22A8276D1697002B86DD /* general.c in Sources */ = {isa = PBXBuildFile; fileRef = 190B228C276D1697002B86DD /* general.c */; }; - 190B22A9276D1697002B86DD /* ipsetcat.c in Sources */ = {isa = PBXBuildFile; fileRef = 190B228F276D1697002B86DD /* ipsetcat.c */; }; - 190B22AA276D1697002B86DD /* ipsetbuild.c in Sources */ = {isa = PBXBuildFile; fileRef = 190B2291276D1697002B86DD /* ipsetbuild.c */; }; - 190B22AB276D1697002B86DD /* ipsetdot.c in Sources */ = {isa = PBXBuildFile; fileRef = 190B2293276D1697002B86DD /* ipsetdot.c */; }; - 190B22DA276D16C2002B86DD /* mingw.c in Sources */ = {isa = PBXBuildFile; fileRef = 190B22AE276D16C2002B86DD /* mingw.c */; }; - 190B22DB276D16C2002B86DD /* process.c in Sources */ = {isa = PBXBuildFile; fileRef = 190B22AF276D16C2002B86DD /* process.c */; }; - 190B22DC276D16C2002B86DD /* exec.c in Sources */ = {isa = PBXBuildFile; fileRef = 190B22B0276D16C2002B86DD /* exec.c */; }; - 190B22DD276D16C2002B86DD /* files.c in Sources */ = {isa = PBXBuildFile; fileRef = 190B22B1276D16C2002B86DD /* files.c */; }; - 190B22DE276D16C2002B86DD /* subprocess.c in Sources */ = {isa = PBXBuildFile; fileRef = 190B22B2276D16C2002B86DD /* subprocess.c */; }; - 190B22DF276D16C2002B86DD /* env.c in Sources */ = {isa = PBXBuildFile; fileRef = 190B22B3276D16C2002B86DD /* env.c */; }; - 190B22E0276D16C2002B86DD /* directory-walker.c in Sources */ = {isa = PBXBuildFile; fileRef = 190B22B4276D16C2002B86DD /* directory-walker.c */; }; - 190B22E1276D16C2002B86DD /* allocator.c in Sources */ = {isa = PBXBuildFile; fileRef = 190B22B7276D16C2002B86DD /* allocator.c */; }; - 190B22E2276D16C2002B86DD /* ip-address.c in Sources */ = {isa = PBXBuildFile; fileRef = 190B22B8276D16C2002B86DD /* ip-address.c */; }; - 190B22E3276D16C2002B86DD /* mempool.c in Sources */ = {isa = PBXBuildFile; fileRef = 190B22B9276D16C2002B86DD /* mempool.c */; }; - 190B22E4276D16C2002B86DD /* timestamp.c in Sources */ = {isa = PBXBuildFile; fileRef = 190B22BA276D16C2002B86DD /* timestamp.c */; }; - 190B22E5276D16C2002B86DD /* hash.c in Sources */ = {isa = PBXBuildFile; fileRef = 190B22BB276D16C2002B86DD /* hash.c */; }; - 190B22E6276D16C2002B86DD /* error.c in Sources */ = {isa = PBXBuildFile; fileRef = 190B22BC276D16C2002B86DD /* error.c */; }; - 190B22E7276D16C2002B86DD /* version.c in Sources */ = {isa = PBXBuildFile; fileRef = 190B22BD276D16C2002B86DD /* version.c */; }; - 190B22E8276D16C2002B86DD /* u128.c in Sources */ = {isa = PBXBuildFile; fileRef = 190B22BE276D16C2002B86DD /* u128.c */; }; - 190B22E9276D16C2002B86DD /* gc.c in Sources */ = {isa = PBXBuildFile; fileRef = 190B22C0276D16C2002B86DD /* gc.c */; }; - 190B22EA276D16C2002B86DD /* buffer.c in Sources */ = {isa = PBXBuildFile; fileRef = 190B22C2276D16C2002B86DD /* buffer.c */; }; - 190B22EB276D16C2002B86DD /* managed-buffer.c in Sources */ = {isa = PBXBuildFile; fileRef = 190B22C3276D16C2002B86DD /* managed-buffer.c */; }; - 190B22EC276D16C2002B86DD /* array.c in Sources */ = {isa = PBXBuildFile; fileRef = 190B22C4276D16C2002B86DD /* array.c */; }; - 190B22ED276D16C2002B86DD /* dllist.c in Sources */ = {isa = PBXBuildFile; fileRef = 190B22C5276D16C2002B86DD /* dllist.c */; }; - 190B22EE276D16C2002B86DD /* file-stream.c in Sources */ = {isa = PBXBuildFile; fileRef = 190B22C6276D16C2002B86DD /* file-stream.c */; }; - 190B22EF276D16C2002B86DD /* ring-buffer.c in Sources */ = {isa = PBXBuildFile; fileRef = 190B22C7276D16C2002B86DD /* ring-buffer.c */; }; - 190B22F0276D16C2002B86DD /* hash-table.c in Sources */ = {isa = PBXBuildFile; fileRef = 190B22C8276D16C2002B86DD /* hash-table.c */; }; - 190B22F1276D16C2002B86DD /* bitset.c in Sources */ = {isa = PBXBuildFile; fileRef = 190B22C9276D16C2002B86DD /* bitset.c */; }; - 190B22F2276D16C2002B86DD /* slice.c in Sources */ = {isa = PBXBuildFile; fileRef = 190B22CA276D16C2002B86DD /* slice.c */; }; - 190B22F3276D16C2002B86DD /* commands.c in Sources */ = {isa = PBXBuildFile; fileRef = 190B22CE276D16C2002B86DD /* commands.c */; }; - 190B22F4276D16C2002B86DD /* thread.c in Sources */ = {isa = PBXBuildFile; fileRef = 190B22D0276D16C2002B86DD /* thread.c */; }; - 190B22F5276D16C2002B86DD /* cork-test.c in Sources */ = {isa = PBXBuildFile; fileRef = 190B22D3276D16C2002B86DD /* cork-test.c */; }; - 190B22F6276D16C2002B86DD /* init1.c in Sources */ = {isa = PBXBuildFile; fileRef = 190B22D5276D16C2002B86DD /* init1.c */; }; - 190B22F7276D16C2002B86DD /* init2.c in Sources */ = {isa = PBXBuildFile; fileRef = 190B22D6276D16C2002B86DD /* init2.c */; }; - 190B22F8276D16C2002B86DD /* main.c in Sources */ = {isa = PBXBuildFile; fileRef = 190B22D7276D16C2002B86DD /* main.c */; }; - 190B22F9276D16C2002B86DD /* cork-hash.c in Sources */ = {isa = PBXBuildFile; fileRef = 190B22D9276D16C2002B86DD /* cork-hash.c */; }; - 190B23C4276D18CF002B86DD /* pem.h in Headers */ = {isa = PBXBuildFile; fileRef = 190B233D276D18CE002B86DD /* pem.h */; }; - 190B23C5276D18CF002B86DD /* check_config.h in Headers */ = {isa = PBXBuildFile; fileRef = 190B233E276D18CE002B86DD /* check_config.h */; }; - 190B23C6276D18CF002B86DD /* error.h in Headers */ = {isa = PBXBuildFile; fileRef = 190B233F276D18CE002B86DD /* error.h */; }; - 190B23C7276D18CF002B86DD /* md2.h in Headers */ = {isa = PBXBuildFile; fileRef = 190B2340276D18CE002B86DD /* md2.h */; }; - 190B23C8276D18CF002B86DD /* oid.h in Headers */ = {isa = PBXBuildFile; fileRef = 190B2341276D18CE002B86DD /* oid.h */; }; - 190B23C9276D18CF002B86DD /* pkcs5.h in Headers */ = {isa = PBXBuildFile; fileRef = 190B2342276D18CE002B86DD /* pkcs5.h */; }; - 190B23CA276D18CF002B86DD /* ripemd160.h in Headers */ = {isa = PBXBuildFile; fileRef = 190B2343276D18CE002B86DD /* ripemd160.h */; }; - 190B23CB276D18CF002B86DD /* blowfish.h in Headers */ = {isa = PBXBuildFile; fileRef = 190B2344276D18CE002B86DD /* blowfish.h */; }; - 190B23CC276D18CF002B86DD /* debug.h in Headers */ = {isa = PBXBuildFile; fileRef = 190B2345276D18CE002B86DD /* debug.h */; }; - 190B23CD276D18CF002B86DD /* x509.h in Headers */ = {isa = PBXBuildFile; fileRef = 190B2346276D18CE002B86DD /* x509.h */; }; - 190B23CE276D18CF002B86DD /* version.h in Headers */ = {isa = PBXBuildFile; fileRef = 190B2347276D18CE002B86DD /* version.h */; }; - 190B23D0276D18CF002B86DD /* ecp.h in Headers */ = {isa = PBXBuildFile; fileRef = 190B2349276D18CE002B86DD /* ecp.h */; }; - 190B23D1276D18CF002B86DD /* net.h in Headers */ = {isa = PBXBuildFile; fileRef = 190B234A276D18CE002B86DD /* net.h */; }; - 190B23D2276D18CF002B86DD /* cipher_internal.h in Headers */ = {isa = PBXBuildFile; fileRef = 190B234B276D18CE002B86DD /* cipher_internal.h */; }; - 190B23D4276D18CF002B86DD /* md_internal.h in Headers */ = {isa = PBXBuildFile; fileRef = 190B234D276D18CE002B86DD /* md_internal.h */; }; - 190B23D5276D18CF002B86DD /* base64.h in Headers */ = {isa = PBXBuildFile; fileRef = 190B234E276D18CE002B86DD /* base64.h */; }; - 190B23D6276D18CF002B86DD /* pkcs11.h in Headers */ = {isa = PBXBuildFile; fileRef = 190B234F276D18CE002B86DD /* pkcs11.h */; }; - 190B23D7276D18CF002B86DD /* ssl_internal.h in Headers */ = {isa = PBXBuildFile; fileRef = 190B2350276D18CE002B86DD /* ssl_internal.h */; }; - 190B23D8276D18CF002B86DD /* asn1.h in Headers */ = {isa = PBXBuildFile; fileRef = 190B2351276D18CE002B86DD /* asn1.h */; }; - 190B23D9276D18CF002B86DD /* config.h in Headers */ = {isa = PBXBuildFile; fileRef = 190B2352276D18CE002B86DD /* config.h */; }; - 190B23DA276D18CF002B86DD /* memory_buffer_alloc.h in Headers */ = {isa = PBXBuildFile; fileRef = 190B2353276D18CE002B86DD /* memory_buffer_alloc.h */; }; - 190B23DB276D18CF002B86DD /* x509_csr.h in Headers */ = {isa = PBXBuildFile; fileRef = 190B2354276D18CE002B86DD /* x509_csr.h */; }; - 190B23DC276D18CF002B86DD /* xtea.h in Headers */ = {isa = PBXBuildFile; fileRef = 190B2355276D18CE002B86DD /* xtea.h */; }; - 190B23DD276D18CF002B86DD /* threading.h in Headers */ = {isa = PBXBuildFile; fileRef = 190B2356276D18CE002B86DD /* threading.h */; }; - 190B23DE276D18CF002B86DD /* compat-1.3.h in Headers */ = {isa = PBXBuildFile; fileRef = 190B2357276D18CE002B86DD /* compat-1.3.h */; }; - 190B23DF276D18CF002B86DD /* md5.h in Headers */ = {isa = PBXBuildFile; fileRef = 190B2358276D18CE002B86DD /* md5.h */; }; - 190B23E0276D18CF002B86DD /* timing.h in Headers */ = {isa = PBXBuildFile; fileRef = 190B2359276D18CE002B86DD /* timing.h */; }; - 190B23E1276D18CF002B86DD /* arc4.h in Headers */ = {isa = PBXBuildFile; fileRef = 190B235A276D18CE002B86DD /* arc4.h */; }; - 190B23E2276D18CF002B86DD /* sha256.h in Headers */ = {isa = PBXBuildFile; fileRef = 190B235B276D18CE002B86DD /* sha256.h */; }; - 190B23E3276D18CF002B86DD /* pem.h in Headers */ = {isa = PBXBuildFile; fileRef = 190B235D276D18CE002B86DD /* pem.h */; }; - 190B23E5276D18CF002B86DD /* error.h in Headers */ = {isa = PBXBuildFile; fileRef = 190B235F276D18CE002B86DD /* error.h */; }; - 190B23E6276D18CF002B86DD /* md2.h in Headers */ = {isa = PBXBuildFile; fileRef = 190B2360276D18CE002B86DD /* md2.h */; }; - 190B23E7276D18CF002B86DD /* oid.h in Headers */ = {isa = PBXBuildFile; fileRef = 190B2361276D18CE002B86DD /* oid.h */; }; - 190B23E8276D18CF002B86DD /* pkcs5.h in Headers */ = {isa = PBXBuildFile; fileRef = 190B2362276D18CE002B86DD /* pkcs5.h */; }; - 190B23E9276D18CF002B86DD /* ripemd160.h in Headers */ = {isa = PBXBuildFile; fileRef = 190B2363276D18CE002B86DD /* ripemd160.h */; }; - 190B23EA276D18CF002B86DD /* blowfish.h in Headers */ = {isa = PBXBuildFile; fileRef = 190B2364276D18CE002B86DD /* blowfish.h */; }; - 190B23EB276D18CF002B86DD /* debug.h in Headers */ = {isa = PBXBuildFile; fileRef = 190B2365276D18CE002B86DD /* debug.h */; }; - 190B23EC276D18CF002B86DD /* x509.h in Headers */ = {isa = PBXBuildFile; fileRef = 190B2366276D18CE002B86DD /* x509.h */; }; - 190B23ED276D18CF002B86DD /* version.h in Headers */ = {isa = PBXBuildFile; fileRef = 190B2367276D18CE002B86DD /* version.h */; }; - 190B23EE276D18CF002B86DD /* ecp.h in Headers */ = {isa = PBXBuildFile; fileRef = 190B2368276D18CE002B86DD /* ecp.h */; }; - 190B23EF276D18CF002B86DD /* net.h in Headers */ = {isa = PBXBuildFile; fileRef = 190B2369276D18CE002B86DD /* net.h */; }; - 190B23F0276D18CF002B86DD /* cipher_internal.h in Headers */ = {isa = PBXBuildFile; fileRef = 190B236A276D18CE002B86DD /* cipher_internal.h */; }; - 190B23F2276D18CF002B86DD /* md_internal.h in Headers */ = {isa = PBXBuildFile; fileRef = 190B236C276D18CF002B86DD /* md_internal.h */; }; - 190B23F3276D18CF002B86DD /* base64.h in Headers */ = {isa = PBXBuildFile; fileRef = 190B236D276D18CF002B86DD /* base64.h */; }; - 190B23F4276D18CF002B86DD /* pkcs11.h in Headers */ = {isa = PBXBuildFile; fileRef = 190B236E276D18CF002B86DD /* pkcs11.h */; }; - 190B23F5276D18CF002B86DD /* ssl_internal.h in Headers */ = {isa = PBXBuildFile; fileRef = 190B236F276D18CF002B86DD /* ssl_internal.h */; }; - 190B23F6276D18CF002B86DD /* asn1.h in Headers */ = {isa = PBXBuildFile; fileRef = 190B2370276D18CF002B86DD /* asn1.h */; }; - 190B23F8276D18CF002B86DD /* memory_buffer_alloc.h in Headers */ = {isa = PBXBuildFile; fileRef = 190B2372276D18CF002B86DD /* memory_buffer_alloc.h */; }; - 190B23F9276D18CF002B86DD /* x509_csr.h in Headers */ = {isa = PBXBuildFile; fileRef = 190B2373276D18CF002B86DD /* x509_csr.h */; }; - 190B23FA276D18CF002B86DD /* xtea.h in Headers */ = {isa = PBXBuildFile; fileRef = 190B2374276D18CF002B86DD /* xtea.h */; }; - 190B23FB276D18CF002B86DD /* threading.h in Headers */ = {isa = PBXBuildFile; fileRef = 190B2375276D18CF002B86DD /* threading.h */; }; - 190B23FC276D18CF002B86DD /* compat-1.3.h in Headers */ = {isa = PBXBuildFile; fileRef = 190B2376276D18CF002B86DD /* compat-1.3.h */; }; - 190B23FD276D18CF002B86DD /* md5.h in Headers */ = {isa = PBXBuildFile; fileRef = 190B2377276D18CF002B86DD /* md5.h */; }; - 190B23FE276D18CF002B86DD /* timing.h in Headers */ = {isa = PBXBuildFile; fileRef = 190B2378276D18CF002B86DD /* timing.h */; }; - 190B23FF276D18CF002B86DD /* arc4.h in Headers */ = {isa = PBXBuildFile; fileRef = 190B2379276D18CF002B86DD /* arc4.h */; }; - 190B2400276D18CF002B86DD /* sha256.h in Headers */ = {isa = PBXBuildFile; fileRef = 190B237A276D18CF002B86DD /* sha256.h */; }; - 190B2401276D18CF002B86DD /* ecdsa.h in Headers */ = {isa = PBXBuildFile; fileRef = 190B237B276D18CF002B86DD /* ecdsa.h */; }; - 190B2402276D18CF002B86DD /* md.h in Headers */ = {isa = PBXBuildFile; fileRef = 190B237C276D18CF002B86DD /* md.h */; }; - 190B2403276D18CF002B86DD /* cipher.h in Headers */ = {isa = PBXBuildFile; fileRef = 190B237D276D18CF002B86DD /* cipher.h */; }; - 190B2404276D18CF002B86DD /* entropy.h in Headers */ = {isa = PBXBuildFile; fileRef = 190B237E276D18CF002B86DD /* entropy.h */; }; - 190B2405276D18CF002B86DD /* pkcs12.h in Headers */ = {isa = PBXBuildFile; fileRef = 190B237F276D18CF002B86DD /* pkcs12.h */; }; - 190B2406276D18CF002B86DD /* padlock.h in Headers */ = {isa = PBXBuildFile; fileRef = 190B2380276D18CF002B86DD /* padlock.h */; }; - 190B2407276D18CF002B86DD /* sha512.h in Headers */ = {isa = PBXBuildFile; fileRef = 190B2381276D18CF002B86DD /* sha512.h */; }; - 190B2408276D18CF002B86DD /* bn_mul.h in Headers */ = {isa = PBXBuildFile; fileRef = 190B2382276D18CF002B86DD /* bn_mul.h */; }; - 190B2409276D18CF002B86DD /* pk.h in Headers */ = {isa = PBXBuildFile; fileRef = 190B2383276D18CF002B86DD /* pk.h */; }; - 190B240A276D18CF002B86DD /* ssl.h in Headers */ = {isa = PBXBuildFile; fileRef = 190B2384276D18CF002B86DD /* ssl.h */; }; - 190B240B276D18CF002B86DD /* camellia.h in Headers */ = {isa = PBXBuildFile; fileRef = 190B2385276D18CF002B86DD /* camellia.h */; }; - 190B240C276D18CF002B86DD /* md4.h in Headers */ = {isa = PBXBuildFile; fileRef = 190B2386276D18CF002B86DD /* md4.h */; }; - 190B240D276D18CF002B86DD /* x509_crt.h in Headers */ = {isa = PBXBuildFile; fileRef = 190B2387276D18CF002B86DD /* x509_crt.h */; }; - 190B240E276D18CF002B86DD /* aes.h in Headers */ = {isa = PBXBuildFile; fileRef = 190B2388276D18CF002B86DD /* aes.h */; }; - 190B240F276D18CF002B86DD /* pk_internal.h in Headers */ = {isa = PBXBuildFile; fileRef = 190B2389276D18CF002B86DD /* pk_internal.h */; }; - 190B2410276D18CF002B86DD /* ssl_cookie.h in Headers */ = {isa = PBXBuildFile; fileRef = 190B238A276D18CF002B86DD /* ssl_cookie.h */; }; - 190B2411276D18CF002B86DD /* dhm.h in Headers */ = {isa = PBXBuildFile; fileRef = 190B238B276D18CF002B86DD /* dhm.h */; }; - 190B2412276D18CF002B86DD /* aesni.h in Headers */ = {isa = PBXBuildFile; fileRef = 190B238C276D18CF002B86DD /* aesni.h */; }; - 190B2413276D18CF002B86DD /* ctr_drbg.h in Headers */ = {isa = PBXBuildFile; fileRef = 190B238D276D18CF002B86DD /* ctr_drbg.h */; }; - 190B2414276D18CF002B86DD /* des.h in Headers */ = {isa = PBXBuildFile; fileRef = 190B238E276D18CF002B86DD /* des.h */; }; - 190B2415276D18CF002B86DD /* x509_crl.h in Headers */ = {isa = PBXBuildFile; fileRef = 190B238F276D18CF002B86DD /* x509_crl.h */; }; - 190B2416276D18CF002B86DD /* ecdh.h in Headers */ = {isa = PBXBuildFile; fileRef = 190B2390276D18CF002B86DD /* ecdh.h */; }; - 190B2417276D18CF002B86DD /* sha1.h in Headers */ = {isa = PBXBuildFile; fileRef = 190B2391276D18CF002B86DD /* sha1.h */; }; - 190B2418276D18CF002B86DD /* gcm.h in Headers */ = {isa = PBXBuildFile; fileRef = 190B2392276D18CF002B86DD /* gcm.h */; }; - 190B2419276D18CF002B86DD /* certs.h in Headers */ = {isa = PBXBuildFile; fileRef = 190B2393276D18CF002B86DD /* certs.h */; }; - 190B241A276D18CF002B86DD /* rsa.h in Headers */ = {isa = PBXBuildFile; fileRef = 190B2394276D18CF002B86DD /* rsa.h */; }; - 190B241B276D18CF002B86DD /* hmac_drbg.h in Headers */ = {isa = PBXBuildFile; fileRef = 190B2395276D18CF002B86DD /* hmac_drbg.h */; }; - 190B241C276D18CF002B86DD /* ssl_ticket.h in Headers */ = {isa = PBXBuildFile; fileRef = 190B2396276D18CF002B86DD /* ssl_ticket.h */; }; - 190B241D276D18CF002B86DD /* ssl_ciphersuites.h in Headers */ = {isa = PBXBuildFile; fileRef = 190B2397276D18CF002B86DD /* ssl_ciphersuites.h */; }; - 190B241E276D18CF002B86DD /* ssl_cache.h in Headers */ = {isa = PBXBuildFile; fileRef = 190B2398276D18CF002B86DD /* ssl_cache.h */; }; - 190B241F276D18CF002B86DD /* platform.h in Headers */ = {isa = PBXBuildFile; fileRef = 190B2399276D18CF002B86DD /* platform.h */; }; - 190B2420276D18CF002B86DD /* bignum.h in Headers */ = {isa = PBXBuildFile; fileRef = 190B239A276D18CF002B86DD /* bignum.h */; }; - 190B2421276D18CF002B86DD /* entropy_poll.h in Headers */ = {isa = PBXBuildFile; fileRef = 190B239B276D18CF002B86DD /* entropy_poll.h */; }; - 190B2422276D18CF002B86DD /* havege.h in Headers */ = {isa = PBXBuildFile; fileRef = 190B239C276D18CF002B86DD /* havege.h */; }; - 190B2423276D18CF002B86DD /* asn1write.h in Headers */ = {isa = PBXBuildFile; fileRef = 190B239D276D18CF002B86DD /* asn1write.h */; }; - 190B2424276D18CF002B86DD /* ccm.h in Headers */ = {isa = PBXBuildFile; fileRef = 190B239E276D18CF002B86DD /* ccm.h */; }; - 190B2425276D18CF002B86DD /* ecdsa.h in Headers */ = {isa = PBXBuildFile; fileRef = 190B239F276D18CF002B86DD /* ecdsa.h */; }; - 190B2426276D18CF002B86DD /* md.h in Headers */ = {isa = PBXBuildFile; fileRef = 190B23A0276D18CF002B86DD /* md.h */; }; - 190B2427276D18CF002B86DD /* cipher.h in Headers */ = {isa = PBXBuildFile; fileRef = 190B23A1276D18CF002B86DD /* cipher.h */; }; - 190B2428276D18CF002B86DD /* entropy.h in Headers */ = {isa = PBXBuildFile; fileRef = 190B23A2276D18CF002B86DD /* entropy.h */; }; - 190B2429276D18CF002B86DD /* pkcs12.h in Headers */ = {isa = PBXBuildFile; fileRef = 190B23A3276D18CF002B86DD /* pkcs12.h */; }; - 190B242A276D18CF002B86DD /* padlock.h in Headers */ = {isa = PBXBuildFile; fileRef = 190B23A4276D18CF002B86DD /* padlock.h */; }; - 190B242B276D18CF002B86DD /* sha512.h in Headers */ = {isa = PBXBuildFile; fileRef = 190B23A5276D18CF002B86DD /* sha512.h */; }; - 190B242C276D18CF002B86DD /* bn_mul.h in Headers */ = {isa = PBXBuildFile; fileRef = 190B23A6276D18CF002B86DD /* bn_mul.h */; }; - 190B242D276D18CF002B86DD /* pk.h in Headers */ = {isa = PBXBuildFile; fileRef = 190B23A7276D18CF002B86DD /* pk.h */; }; - 190B242E276D18CF002B86DD /* ssl.h in Headers */ = {isa = PBXBuildFile; fileRef = 190B23A8276D18CF002B86DD /* ssl.h */; }; - 190B242F276D18CF002B86DD /* camellia.h in Headers */ = {isa = PBXBuildFile; fileRef = 190B23A9276D18CF002B86DD /* camellia.h */; }; - 190B2430276D18CF002B86DD /* md4.h in Headers */ = {isa = PBXBuildFile; fileRef = 190B23AA276D18CF002B86DD /* md4.h */; }; - 190B2431276D18CF002B86DD /* x509_crt.h in Headers */ = {isa = PBXBuildFile; fileRef = 190B23AB276D18CF002B86DD /* x509_crt.h */; }; - 190B2433276D18CF002B86DD /* aes.h in Headers */ = {isa = PBXBuildFile; fileRef = 190B23AD276D18CF002B86DD /* aes.h */; }; - 190B2434276D18CF002B86DD /* pk_internal.h in Headers */ = {isa = PBXBuildFile; fileRef = 190B23AE276D18CF002B86DD /* pk_internal.h */; }; - 190B2435276D18CF002B86DD /* ssl_cookie.h in Headers */ = {isa = PBXBuildFile; fileRef = 190B23AF276D18CF002B86DD /* ssl_cookie.h */; }; - 190B2436276D18CF002B86DD /* dhm.h in Headers */ = {isa = PBXBuildFile; fileRef = 190B23B0276D18CF002B86DD /* dhm.h */; }; - 190B2437276D18CF002B86DD /* aesni.h in Headers */ = {isa = PBXBuildFile; fileRef = 190B23B1276D18CF002B86DD /* aesni.h */; }; - 190B2438276D18CF002B86DD /* ctr_drbg.h in Headers */ = {isa = PBXBuildFile; fileRef = 190B23B2276D18CF002B86DD /* ctr_drbg.h */; }; - 190B2439276D18CF002B86DD /* des.h in Headers */ = {isa = PBXBuildFile; fileRef = 190B23B3276D18CF002B86DD /* des.h */; }; - 190B243A276D18CF002B86DD /* x509_crl.h in Headers */ = {isa = PBXBuildFile; fileRef = 190B23B4276D18CF002B86DD /* x509_crl.h */; }; - 190B243B276D18CF002B86DD /* ecdh.h in Headers */ = {isa = PBXBuildFile; fileRef = 190B23B5276D18CF002B86DD /* ecdh.h */; }; - 190B243C276D18CF002B86DD /* sha1.h in Headers */ = {isa = PBXBuildFile; fileRef = 190B23B6276D18CF002B86DD /* sha1.h */; }; - 190B243D276D18CF002B86DD /* gcm.h in Headers */ = {isa = PBXBuildFile; fileRef = 190B23B7276D18CF002B86DD /* gcm.h */; }; - 190B243E276D18CF002B86DD /* certs.h in Headers */ = {isa = PBXBuildFile; fileRef = 190B23B8276D18CF002B86DD /* certs.h */; }; - 190B243F276D18CF002B86DD /* rsa.h in Headers */ = {isa = PBXBuildFile; fileRef = 190B23B9276D18CF002B86DD /* rsa.h */; }; - 190B2440276D18CF002B86DD /* hmac_drbg.h in Headers */ = {isa = PBXBuildFile; fileRef = 190B23BA276D18CF002B86DD /* hmac_drbg.h */; }; - 190B2441276D18CF002B86DD /* ssl_ticket.h in Headers */ = {isa = PBXBuildFile; fileRef = 190B23BB276D18CF002B86DD /* ssl_ticket.h */; }; - 190B2442276D18CF002B86DD /* ssl_ciphersuites.h in Headers */ = {isa = PBXBuildFile; fileRef = 190B23BC276D18CF002B86DD /* ssl_ciphersuites.h */; }; - 190B2443276D18CF002B86DD /* ssl_cache.h in Headers */ = {isa = PBXBuildFile; fileRef = 190B23BD276D18CF002B86DD /* ssl_cache.h */; }; - 190B2444276D18CF002B86DD /* platform.h in Headers */ = {isa = PBXBuildFile; fileRef = 190B23BE276D18CF002B86DD /* platform.h */; }; - 190B2445276D18CF002B86DD /* bignum.h in Headers */ = {isa = PBXBuildFile; fileRef = 190B23BF276D18CF002B86DD /* bignum.h */; }; - 190B2446276D18CF002B86DD /* entropy_poll.h in Headers */ = {isa = PBXBuildFile; fileRef = 190B23C0276D18CF002B86DD /* entropy_poll.h */; }; - 190B2447276D18CF002B86DD /* havege.h in Headers */ = {isa = PBXBuildFile; fileRef = 190B23C1276D18CF002B86DD /* havege.h */; }; - 190B2448276D18CF002B86DD /* asn1write.h in Headers */ = {isa = PBXBuildFile; fileRef = 190B23C2276D18CF002B86DD /* asn1write.h */; }; - 190B2449276D18CF002B86DD /* ccm.h in Headers */ = {isa = PBXBuildFile; fileRef = 190B23C3276D18CF002B86DD /* ccm.h */; }; - 190B28D6276D25DA002B86DD /* redir.c in Sources */ = {isa = PBXBuildFile; fileRef = 190B28D3276D25DA002B86DD /* redir.c */; }; - 190B28D8276D25DA002B86DD /* redir.h in Headers */ = {isa = PBXBuildFile; fileRef = 190B28D5276D25DA002B86DD /* redir.h */; }; - 196AAB6A2776263400602189 /* Clibsodium.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 196AAB672776262D00602189 /* Clibsodium.xcframework */; settings = {ATTRIBUTES = (Weak, ); }; }; - 196AAB6D2776264F00602189 /* Clibsodium.xcframework in CopyFiles */ = {isa = PBXBuildFile; fileRef = 196AAB672776262D00602189 /* Clibsodium.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; - 19835087276D2DED0002E2E9 /* config.h in Headers */ = {isa = PBXBuildFile; fileRef = 19835086276D2CB40002E2E9 /* config.h */; }; - 19835092276D3C0D0002E2E9 /* libev.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 19835090276D3C0D0002E2E9 /* libev.a */; platformFilter = ios; }; - 198350A0276D3C4F0002E2E9 /* libcares.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1983509D276D3C4E0002E2E9 /* libcares.a */; platformFilter = ios; }; - 198350B1276D3C850002E2E9 /* libpcreposix.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 198350A8276D3C850002E2E9 /* libpcreposix.a */; platformFilter = ios; }; - 198350B2276D3C850002E2E9 /* libpcre.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 198350A9276D3C850002E2E9 /* libpcre.a */; platformFilter = ios; }; - 198350B4276D3C850002E2E9 /* libpcrecpp.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 198350AB276D3C850002E2E9 /* libpcrecpp.a */; platformFilter = ios; }; - 198350BC276D3DAC0002E2E9 /* libresolv.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 19835089276D3A4F0002E2E9 /* libresolv.tbd */; platformFilter = ios; }; -/* End PBXBuildFile section */ - -/* Begin PBXCopyFilesBuildPhase section */ - 196AAB66277625DF00602189 /* CopyFiles */ = { - isa = PBXCopyFilesBuildPhase; - buildActionMask = 2147483647; - dstPath = ""; - dstSubfolderSpec = 10; - files = ( - 196AAB6D2776264F00602189 /* Clibsodium.xcframework in CopyFiles */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 196AAB6C2776263400602189 /* Embed Frameworks */ = { - isa = PBXCopyFilesBuildPhase; - buildActionMask = 2147483647; - dstPath = ""; - dstSubfolderSpec = 10; - files = ( - ); - name = "Embed Frameworks"; - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXCopyFilesBuildPhase section */ - -/* Begin PBXFileReference section */ - 190B1222276CF6B5002B86DD /* ShadowSocks.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = ShadowSocks.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 190B1225276CF6B5002B86DD /* ShadowSocks.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ShadowSocks.h; sourceTree = ""; }; - 190B1AB6276CFC67002B86DD /* event.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = event.h; sourceTree = ""; }; - 190B1AB7276CFC67002B86DD /* ev++.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "ev++.h"; sourceTree = ""; }; - 190B1AB8276CFC67002B86DD /* ev.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ev.h; sourceTree = ""; }; - 190B1B18276CFC67002B86DD /* libmbedcrypto.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libmbedcrypto.a; sourceTree = ""; }; - 190B1B19276CFC67002B86DD /* libmbedx509.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libmbedx509.a; sourceTree = ""; }; - 190B1B1A276CFC67002B86DD /* libmbedtls.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libmbedtls.a; sourceTree = ""; }; - 190B1B1D276CFC67002B86DD /* ares_version.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ares_version.h; sourceTree = ""; }; - 190B1B1E276CFC67002B86DD /* ares_build.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ares_build.h; sourceTree = ""; }; - 190B1B1F276CFC67002B86DD /* ares.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ares.h; sourceTree = ""; }; - 190B1B20276CFC67002B86DD /* ares_rules.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ares_rules.h; sourceTree = ""; }; - 190B1B21276CFC67002B86DD /* ares_dns.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ares_dns.h; sourceTree = ""; }; - 190B1F45276D0DB3002B86DD /* json.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = json.c; sourceTree = ""; }; - 190B1F46276D0DB3002B86DD /* utils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = utils.h; sourceTree = ""; }; - 190B1F47276D0DB3002B86DD /* resolv.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = resolv.h; sourceTree = ""; }; - 190B1F48276D0DB3002B86DD /* winsock.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = winsock.h; sourceTree = ""; }; - 190B1F49276D0DB3002B86DD /* rule.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = rule.c; sourceTree = ""; }; - 190B1F4B276D0DB3002B86DD /* acl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = acl.h; sourceTree = ""; }; - 190B1F4C276D0DB3002B86DD /* plugin.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = plugin.h; sourceTree = ""; }; - 190B1F4D276D0DB3002B86DD /* aead.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = aead.c; sourceTree = ""; }; - 190B1F4E276D0DB3002B86DD /* ppbloom.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ppbloom.c; sourceTree = ""; }; - 190B1F4F276D0DB3002B86DD /* base64.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = base64.h; sourceTree = ""; }; - 190B1F50276D0DB3002B86DD /* netutils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = netutils.h; sourceTree = ""; }; - 190B1F51276D0DB3002B86DD /* local.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = local.c; sourceTree = ""; }; - 190B1F52276D0DB3002B86DD /* manager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = manager.h; sourceTree = ""; }; - 190B1F53276D0DB3002B86DD /* tunnel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = tunnel.h; sourceTree = ""; }; - 190B1F54276D0DB3002B86DD /* cache.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cache.h; sourceTree = ""; }; - 190B1F57276D0DB3002B86DD /* stream.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = stream.h; sourceTree = ""; }; - 190B1F58276D0DB3002B86DD /* uthash.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = uthash.h; sourceTree = ""; }; - 190B1F59276D0DB3002B86DD /* server.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = server.c; sourceTree = ""; }; - 190B1F5A276D0DB3002B86DD /* jconf.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = jconf.h; sourceTree = ""; }; - 190B1F5B276D0DB3002B86DD /* crypto.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = crypto.h; sourceTree = ""; }; - 190B1F5C276D0DB3002B86DD /* udprelay.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = udprelay.c; sourceTree = ""; }; - 190B1F5D276D0DB3002B86DD /* winsock.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = winsock.c; sourceTree = ""; }; - 190B1F5F276D0DB3002B86DD /* resolv.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = resolv.c; sourceTree = ""; }; - 190B1F60276D0DB3002B86DD /* utils.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = utils.c; sourceTree = ""; }; - 190B1F61276D0DB3002B86DD /* common.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = common.h; sourceTree = ""; }; - 190B1F62276D0DB3002B86DD /* json.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = json.h; sourceTree = ""; }; - 190B1F63276D0DB3002B86DD /* netutils.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = netutils.c; sourceTree = ""; }; - 190B1F64276D0DB3002B86DD /* base64.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = base64.c; sourceTree = ""; }; - 190B1F66276D0DB3002B86DD /* ppbloom.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ppbloom.h; sourceTree = ""; }; - 190B1F67276D0DB3002B86DD /* aead.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = aead.h; sourceTree = ""; }; - 190B1F68276D0DB3002B86DD /* plugin.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = plugin.c; sourceTree = ""; }; - 190B1F69276D0DB3002B86DD /* acl.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = acl.c; sourceTree = ""; }; - 190B1F6A276D0DB3002B86DD /* rule.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = rule.h; sourceTree = ""; }; - 190B1F6B276D0DB3002B86DD /* cache.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = cache.c; sourceTree = ""; }; - 190B1F6C276D0DB3002B86DD /* manager.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = manager.c; sourceTree = ""; }; - 190B1F6D276D0DB3002B86DD /* tunnel.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = tunnel.c; sourceTree = ""; }; - 190B1F6E276D0DB3002B86DD /* shadowsocks.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = shadowsocks.h; sourceTree = ""; }; - 190B1F6F276D0DB3002B86DD /* local.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = local.h; sourceTree = ""; }; - 190B1F71276D0DB3002B86DD /* crypto.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = crypto.c; sourceTree = ""; }; - 190B1F72276D0DB3002B86DD /* jconf.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = jconf.c; sourceTree = ""; }; - 190B1F73276D0DB3002B86DD /* server.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = server.h; sourceTree = ""; }; - 190B1F74276D0DB4002B86DD /* udprelay.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = udprelay.h; sourceTree = ""; }; - 190B1F76276D0DB4002B86DD /* socks5.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = socks5.h; sourceTree = ""; }; - 190B1F77276D0DB4002B86DD /* stream.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = stream.c; sourceTree = ""; }; - 190B2095276D0DB4002B86DD /* bloom.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = bloom.c; sourceTree = ""; }; - 190B2099276D0DB4002B86DD /* bloom.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = bloom.h; sourceTree = ""; }; - 190B209D276D0DB5002B86DD /* murmurhash2.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = murmurhash2.h; sourceTree = ""; }; - 190B209F276D0DB5002B86DD /* MurmurHash2.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = MurmurHash2.c; sourceTree = ""; }; - 190B2273276D1697002B86DD /* storage.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = storage.c; sourceTree = ""; }; - 190B2274276D1697002B86DD /* inspection.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = inspection.c; sourceTree = ""; }; - 190B2276276D1697002B86DD /* ipv4_map.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ipv4_map.c; sourceTree = ""; }; - 190B2277276D1697002B86DD /* ipv6_map.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ipv6_map.c; sourceTree = ""; }; - 190B2278276D1697002B86DD /* allocation.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = allocation.c; sourceTree = ""; }; - 190B227B276D1697002B86DD /* expanded.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = expanded.c; sourceTree = ""; }; - 190B227C276D1697002B86DD /* basics.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = basics.c; sourceTree = ""; }; - 190B227D276D1697002B86DD /* assignments.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = assignments.c; sourceTree = ""; }; - 190B227E276D1697002B86DD /* bdd-iterator.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = "bdd-iterator.c"; sourceTree = ""; }; - 190B227F276D1697002B86DD /* read.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = read.c; sourceTree = ""; }; - 190B2280276D1697002B86DD /* reachable.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = reachable.c; sourceTree = ""; }; - 190B2282276D1697002B86DD /* write.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = write.c; sourceTree = ""; }; - 190B2284276D1697002B86DD /* ipv4_set.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ipv4_set.c; sourceTree = ""; }; - 190B2285276D1697002B86DD /* ipv6_set.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ipv6_set.c; sourceTree = ""; }; - 190B2286276D1697002B86DD /* storage.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = storage.c; sourceTree = ""; }; - 190B2287276D1697002B86DD /* inspection.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = inspection.c; sourceTree = ""; }; - 190B2288276D1697002B86DD /* iterator.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = iterator.c; sourceTree = ""; }; - 190B228A276D1697002B86DD /* allocation.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = allocation.c; sourceTree = ""; }; - 190B228C276D1697002B86DD /* general.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = general.c; sourceTree = ""; }; - 190B228F276D1697002B86DD /* ipsetcat.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ipsetcat.c; sourceTree = ""; }; - 190B2291276D1697002B86DD /* ipsetbuild.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ipsetbuild.c; sourceTree = ""; }; - 190B2293276D1697002B86DD /* ipsetdot.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ipsetdot.c; sourceTree = ""; }; - 190B22AE276D16C2002B86DD /* mingw.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = mingw.c; sourceTree = ""; }; - 190B22AF276D16C2002B86DD /* process.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = process.c; sourceTree = ""; }; - 190B22B0276D16C2002B86DD /* exec.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = exec.c; sourceTree = ""; }; - 190B22B1276D16C2002B86DD /* files.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = files.c; sourceTree = ""; }; - 190B22B2276D16C2002B86DD /* subprocess.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = subprocess.c; sourceTree = ""; }; - 190B22B3276D16C2002B86DD /* env.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = env.c; sourceTree = ""; }; - 190B22B4276D16C2002B86DD /* directory-walker.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = "directory-walker.c"; sourceTree = ""; }; - 190B22B7276D16C2002B86DD /* allocator.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = allocator.c; sourceTree = ""; }; - 190B22B8276D16C2002B86DD /* ip-address.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = "ip-address.c"; sourceTree = ""; }; - 190B22B9276D16C2002B86DD /* mempool.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = mempool.c; sourceTree = ""; }; - 190B22BA276D16C2002B86DD /* timestamp.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = timestamp.c; sourceTree = ""; }; - 190B22BB276D16C2002B86DD /* hash.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = hash.c; sourceTree = ""; }; - 190B22BC276D16C2002B86DD /* error.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = error.c; sourceTree = ""; }; - 190B22BD276D16C2002B86DD /* version.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = version.c; sourceTree = ""; }; - 190B22BE276D16C2002B86DD /* u128.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = u128.c; sourceTree = ""; }; - 190B22C0276D16C2002B86DD /* gc.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = gc.c; sourceTree = ""; }; - 190B22C2276D16C2002B86DD /* buffer.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = buffer.c; sourceTree = ""; }; - 190B22C3276D16C2002B86DD /* managed-buffer.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = "managed-buffer.c"; sourceTree = ""; }; - 190B22C4276D16C2002B86DD /* array.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = array.c; sourceTree = ""; }; - 190B22C5276D16C2002B86DD /* dllist.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = dllist.c; sourceTree = ""; }; - 190B22C6276D16C2002B86DD /* file-stream.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = "file-stream.c"; sourceTree = ""; }; - 190B22C7276D16C2002B86DD /* ring-buffer.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = "ring-buffer.c"; sourceTree = ""; }; - 190B22C8276D16C2002B86DD /* hash-table.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = "hash-table.c"; sourceTree = ""; }; - 190B22C9276D16C2002B86DD /* bitset.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = bitset.c; sourceTree = ""; }; - 190B22CA276D16C2002B86DD /* slice.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = slice.c; sourceTree = ""; }; - 190B22CE276D16C2002B86DD /* commands.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = commands.c; sourceTree = ""; }; - 190B22D0276D16C2002B86DD /* thread.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = thread.c; sourceTree = ""; }; - 190B22D3276D16C2002B86DD /* cork-test.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = "cork-test.c"; sourceTree = ""; }; - 190B22D5276D16C2002B86DD /* init1.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = init1.c; sourceTree = ""; }; - 190B22D6276D16C2002B86DD /* init2.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = init2.c; sourceTree = ""; }; - 190B22D7276D16C2002B86DD /* main.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = main.c; sourceTree = ""; }; - 190B22D9276D16C2002B86DD /* cork-hash.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = "cork-hash.c"; sourceTree = ""; }; - 190B233D276D18CE002B86DD /* pem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pem.h; sourceTree = ""; }; - 190B233E276D18CE002B86DD /* check_config.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = check_config.h; sourceTree = ""; }; - 190B233F276D18CE002B86DD /* error.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = error.h; sourceTree = ""; }; - 190B2340276D18CE002B86DD /* md2.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = md2.h; sourceTree = ""; }; - 190B2341276D18CE002B86DD /* oid.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = oid.h; sourceTree = ""; }; - 190B2342276D18CE002B86DD /* pkcs5.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pkcs5.h; sourceTree = ""; }; - 190B2343276D18CE002B86DD /* ripemd160.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ripemd160.h; sourceTree = ""; }; - 190B2344276D18CE002B86DD /* blowfish.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = blowfish.h; sourceTree = ""; }; - 190B2345276D18CE002B86DD /* debug.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = debug.h; sourceTree = ""; }; - 190B2346276D18CE002B86DD /* x509.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = x509.h; sourceTree = ""; }; - 190B2347276D18CE002B86DD /* version.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = version.h; sourceTree = ""; }; - 190B2349276D18CE002B86DD /* ecp.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ecp.h; sourceTree = ""; }; - 190B234A276D18CE002B86DD /* net.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = net.h; sourceTree = ""; }; - 190B234B276D18CE002B86DD /* cipher_internal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cipher_internal.h; sourceTree = ""; }; - 190B234D276D18CE002B86DD /* md_internal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = md_internal.h; sourceTree = ""; }; - 190B234E276D18CE002B86DD /* base64.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = base64.h; sourceTree = ""; }; - 190B234F276D18CE002B86DD /* pkcs11.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pkcs11.h; sourceTree = ""; }; - 190B2350276D18CE002B86DD /* ssl_internal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ssl_internal.h; sourceTree = ""; }; - 190B2351276D18CE002B86DD /* asn1.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = asn1.h; sourceTree = ""; }; - 190B2352276D18CE002B86DD /* config.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = config.h; sourceTree = ""; }; - 190B2353276D18CE002B86DD /* memory_buffer_alloc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = memory_buffer_alloc.h; sourceTree = ""; }; - 190B2354276D18CE002B86DD /* x509_csr.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = x509_csr.h; sourceTree = ""; }; - 190B2355276D18CE002B86DD /* xtea.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = xtea.h; sourceTree = ""; }; - 190B2356276D18CE002B86DD /* threading.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = threading.h; sourceTree = ""; }; - 190B2357276D18CE002B86DD /* compat-1.3.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "compat-1.3.h"; sourceTree = ""; }; - 190B2358276D18CE002B86DD /* md5.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = md5.h; sourceTree = ""; }; - 190B2359276D18CE002B86DD /* timing.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = timing.h; sourceTree = ""; }; - 190B235A276D18CE002B86DD /* arc4.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = arc4.h; sourceTree = ""; }; - 190B235B276D18CE002B86DD /* sha256.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = sha256.h; sourceTree = ""; }; - 190B235D276D18CE002B86DD /* pem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pem.h; sourceTree = ""; }; - 190B235E276D18CE002B86DD /* check_config.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = check_config.h; sourceTree = ""; }; - 190B235F276D18CE002B86DD /* error.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = error.h; sourceTree = ""; }; - 190B2360276D18CE002B86DD /* md2.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = md2.h; sourceTree = ""; }; - 190B2361276D18CE002B86DD /* oid.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = oid.h; sourceTree = ""; }; - 190B2362276D18CE002B86DD /* pkcs5.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pkcs5.h; sourceTree = ""; }; - 190B2363276D18CE002B86DD /* ripemd160.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ripemd160.h; sourceTree = ""; }; - 190B2364276D18CE002B86DD /* blowfish.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = blowfish.h; sourceTree = ""; }; - 190B2365276D18CE002B86DD /* debug.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = debug.h; sourceTree = ""; }; - 190B2366276D18CE002B86DD /* x509.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = x509.h; sourceTree = ""; }; - 190B2367276D18CE002B86DD /* version.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = version.h; sourceTree = ""; }; - 190B2368276D18CE002B86DD /* ecp.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ecp.h; sourceTree = ""; }; - 190B2369276D18CE002B86DD /* net.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = net.h; sourceTree = ""; }; - 190B236A276D18CE002B86DD /* cipher_internal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cipher_internal.h; sourceTree = ""; }; - 190B236B276D18CE002B86DD /* LICENSE */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = LICENSE; sourceTree = ""; }; - 190B236C276D18CF002B86DD /* md_internal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = md_internal.h; sourceTree = ""; }; - 190B236D276D18CF002B86DD /* base64.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = base64.h; sourceTree = ""; }; - 190B236E276D18CF002B86DD /* pkcs11.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pkcs11.h; sourceTree = ""; }; - 190B236F276D18CF002B86DD /* ssl_internal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ssl_internal.h; sourceTree = ""; }; - 190B2370276D18CF002B86DD /* asn1.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = asn1.h; sourceTree = ""; }; - 190B2371276D18CF002B86DD /* config.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = config.h; sourceTree = ""; }; - 190B2372276D18CF002B86DD /* memory_buffer_alloc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = memory_buffer_alloc.h; sourceTree = ""; }; - 190B2373276D18CF002B86DD /* x509_csr.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = x509_csr.h; sourceTree = ""; }; - 190B2374276D18CF002B86DD /* xtea.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = xtea.h; sourceTree = ""; }; - 190B2375276D18CF002B86DD /* threading.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = threading.h; sourceTree = ""; }; - 190B2376276D18CF002B86DD /* compat-1.3.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "compat-1.3.h"; sourceTree = ""; }; - 190B2377276D18CF002B86DD /* md5.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = md5.h; sourceTree = ""; }; - 190B2378276D18CF002B86DD /* timing.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = timing.h; sourceTree = ""; }; - 190B2379276D18CF002B86DD /* arc4.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = arc4.h; sourceTree = ""; }; - 190B237A276D18CF002B86DD /* sha256.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = sha256.h; sourceTree = ""; }; - 190B237B276D18CF002B86DD /* ecdsa.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ecdsa.h; sourceTree = ""; }; - 190B237C276D18CF002B86DD /* md.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = md.h; sourceTree = ""; }; - 190B237D276D18CF002B86DD /* cipher.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cipher.h; sourceTree = ""; }; - 190B237E276D18CF002B86DD /* entropy.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = entropy.h; sourceTree = ""; }; - 190B237F276D18CF002B86DD /* pkcs12.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pkcs12.h; sourceTree = ""; }; - 190B2380276D18CF002B86DD /* padlock.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = padlock.h; sourceTree = ""; }; - 190B2381276D18CF002B86DD /* sha512.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = sha512.h; sourceTree = ""; }; - 190B2382276D18CF002B86DD /* bn_mul.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = bn_mul.h; sourceTree = ""; }; - 190B2383276D18CF002B86DD /* pk.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pk.h; sourceTree = ""; }; - 190B2384276D18CF002B86DD /* ssl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ssl.h; sourceTree = ""; }; - 190B2385276D18CF002B86DD /* camellia.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = camellia.h; sourceTree = ""; }; - 190B2386276D18CF002B86DD /* md4.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = md4.h; sourceTree = ""; }; - 190B2387276D18CF002B86DD /* x509_crt.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = x509_crt.h; sourceTree = ""; }; - 190B2388276D18CF002B86DD /* aes.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = aes.h; sourceTree = ""; }; - 190B2389276D18CF002B86DD /* pk_internal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pk_internal.h; sourceTree = ""; }; - 190B238A276D18CF002B86DD /* ssl_cookie.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ssl_cookie.h; sourceTree = ""; }; - 190B238B276D18CF002B86DD /* dhm.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = dhm.h; sourceTree = ""; }; - 190B238C276D18CF002B86DD /* aesni.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = aesni.h; sourceTree = ""; }; - 190B238D276D18CF002B86DD /* ctr_drbg.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ctr_drbg.h; sourceTree = ""; }; - 190B238E276D18CF002B86DD /* des.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = des.h; sourceTree = ""; }; - 190B238F276D18CF002B86DD /* x509_crl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = x509_crl.h; sourceTree = ""; }; - 190B2390276D18CF002B86DD /* ecdh.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ecdh.h; sourceTree = ""; }; - 190B2391276D18CF002B86DD /* sha1.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = sha1.h; sourceTree = ""; }; - 190B2392276D18CF002B86DD /* gcm.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = gcm.h; sourceTree = ""; }; - 190B2393276D18CF002B86DD /* certs.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = certs.h; sourceTree = ""; }; - 190B2394276D18CF002B86DD /* rsa.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = rsa.h; sourceTree = ""; }; - 190B2395276D18CF002B86DD /* hmac_drbg.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = hmac_drbg.h; sourceTree = ""; }; - 190B2396276D18CF002B86DD /* ssl_ticket.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ssl_ticket.h; sourceTree = ""; }; - 190B2397276D18CF002B86DD /* ssl_ciphersuites.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ssl_ciphersuites.h; sourceTree = ""; }; - 190B2398276D18CF002B86DD /* ssl_cache.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ssl_cache.h; sourceTree = ""; }; - 190B2399276D18CF002B86DD /* platform.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = platform.h; sourceTree = ""; }; - 190B239A276D18CF002B86DD /* bignum.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = bignum.h; sourceTree = ""; }; - 190B239B276D18CF002B86DD /* entropy_poll.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = entropy_poll.h; sourceTree = ""; }; - 190B239C276D18CF002B86DD /* havege.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = havege.h; sourceTree = ""; }; - 190B239D276D18CF002B86DD /* asn1write.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = asn1write.h; sourceTree = ""; }; - 190B239E276D18CF002B86DD /* ccm.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ccm.h; sourceTree = ""; }; - 190B239F276D18CF002B86DD /* ecdsa.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ecdsa.h; sourceTree = ""; }; - 190B23A0276D18CF002B86DD /* md.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = md.h; sourceTree = ""; }; - 190B23A1276D18CF002B86DD /* cipher.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cipher.h; sourceTree = ""; }; - 190B23A2276D18CF002B86DD /* entropy.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = entropy.h; sourceTree = ""; }; - 190B23A3276D18CF002B86DD /* pkcs12.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pkcs12.h; sourceTree = ""; }; - 190B23A4276D18CF002B86DD /* padlock.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = padlock.h; sourceTree = ""; }; - 190B23A5276D18CF002B86DD /* sha512.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = sha512.h; sourceTree = ""; }; - 190B23A6276D18CF002B86DD /* bn_mul.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = bn_mul.h; sourceTree = ""; }; - 190B23A7276D18CF002B86DD /* pk.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pk.h; sourceTree = ""; }; - 190B23A8276D18CF002B86DD /* ssl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ssl.h; sourceTree = ""; }; - 190B23A9276D18CF002B86DD /* camellia.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = camellia.h; sourceTree = ""; }; - 190B23AA276D18CF002B86DD /* md4.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = md4.h; sourceTree = ""; }; - 190B23AB276D18CF002B86DD /* x509_crt.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = x509_crt.h; sourceTree = ""; }; - 190B23AC276D18CF002B86DD /* .gitignore */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = .gitignore; sourceTree = ""; }; - 190B23AD276D18CF002B86DD /* aes.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = aes.h; sourceTree = ""; }; - 190B23AE276D18CF002B86DD /* pk_internal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pk_internal.h; sourceTree = ""; }; - 190B23AF276D18CF002B86DD /* ssl_cookie.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ssl_cookie.h; sourceTree = ""; }; - 190B23B0276D18CF002B86DD /* dhm.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = dhm.h; sourceTree = ""; }; - 190B23B1276D18CF002B86DD /* aesni.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = aesni.h; sourceTree = ""; }; - 190B23B2276D18CF002B86DD /* ctr_drbg.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ctr_drbg.h; sourceTree = ""; }; - 190B23B3276D18CF002B86DD /* des.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = des.h; sourceTree = ""; }; - 190B23B4276D18CF002B86DD /* x509_crl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = x509_crl.h; sourceTree = ""; }; - 190B23B5276D18CF002B86DD /* ecdh.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ecdh.h; sourceTree = ""; }; - 190B23B6276D18CF002B86DD /* sha1.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = sha1.h; sourceTree = ""; }; - 190B23B7276D18CF002B86DD /* gcm.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = gcm.h; sourceTree = ""; }; - 190B23B8276D18CF002B86DD /* certs.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = certs.h; sourceTree = ""; }; - 190B23B9276D18CF002B86DD /* rsa.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = rsa.h; sourceTree = ""; }; - 190B23BA276D18CF002B86DD /* hmac_drbg.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = hmac_drbg.h; sourceTree = ""; }; - 190B23BB276D18CF002B86DD /* ssl_ticket.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ssl_ticket.h; sourceTree = ""; }; - 190B23BC276D18CF002B86DD /* ssl_ciphersuites.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ssl_ciphersuites.h; sourceTree = ""; }; - 190B23BD276D18CF002B86DD /* ssl_cache.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ssl_cache.h; sourceTree = ""; }; - 190B23BE276D18CF002B86DD /* platform.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = platform.h; sourceTree = ""; }; - 190B23BF276D18CF002B86DD /* bignum.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = bignum.h; sourceTree = ""; }; - 190B23C0276D18CF002B86DD /* entropy_poll.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = entropy_poll.h; sourceTree = ""; }; - 190B23C1276D18CF002B86DD /* havege.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = havege.h; sourceTree = ""; }; - 190B23C2276D18CF002B86DD /* asn1write.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = asn1write.h; sourceTree = ""; }; - 190B23C3276D18CF002B86DD /* ccm.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ccm.h; sourceTree = ""; }; - 190B245A276D2251002B86DD /* pcrecpparg.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pcrecpparg.h; sourceTree = ""; }; - 190B245B276D2251002B86DD /* pcreposix.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pcreposix.h; sourceTree = ""; }; - 190B245C276D2251002B86DD /* pcre_scanner.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pcre_scanner.h; sourceTree = ""; }; - 190B245D276D2251002B86DD /* pcre_stringpiece.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pcre_stringpiece.h; sourceTree = ""; }; - 190B245E276D2251002B86DD /* pcre.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pcre.h; sourceTree = ""; }; - 190B245F276D2251002B86DD /* pcrecpp.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pcrecpp.h; sourceTree = ""; }; - 190B28D3276D25DA002B86DD /* redir.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = redir.c; sourceTree = ""; }; - 190B28D4276D25DA002B86DD /* android.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = android.c; sourceTree = ""; }; - 190B28D5276D25DA002B86DD /* redir.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = redir.h; sourceTree = ""; }; - 196AAB672776262D00602189 /* Clibsodium.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = Clibsodium.xcframework; path = ShadowSocks/libsodium/lib/Clibsodium.xcframework; sourceTree = ""; }; - 19835086276D2CB40002E2E9 /* config.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = config.h; sourceTree = ""; }; - 19835089276D3A4F0002E2E9 /* libresolv.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libresolv.tbd; path = Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.1.sdk/usr/lib/libresolv.tbd; sourceTree = DEVELOPER_DIR; }; - 19835090276D3C0D0002E2E9 /* libev.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libev.a; sourceTree = ""; }; - 19835091276D3C0D0002E2E9 /* libev.la */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = libev.la; sourceTree = ""; }; - 1983509D276D3C4E0002E2E9 /* libcares.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libcares.a; sourceTree = ""; }; - 198350A6276D3C850002E2E9 /* libpcre.la */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = libpcre.la; sourceTree = ""; }; - 198350A7276D3C850002E2E9 /* libpcrecpp.la */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = libpcrecpp.la; sourceTree = ""; }; - 198350A8276D3C850002E2E9 /* libpcreposix.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libpcreposix.a; sourceTree = ""; }; - 198350A9276D3C850002E2E9 /* libpcre.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libpcre.a; sourceTree = ""; }; - 198350AA276D3C850002E2E9 /* libpcreposix.la */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = libpcreposix.la; sourceTree = ""; }; - 198350AB276D3C850002E2E9 /* libpcrecpp.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libpcrecpp.a; sourceTree = ""; }; - 198350B6276D3D6A0002E2E9 /* libz.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libz.tbd; path = Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.1.sdk/usr/lib/libz.tbd; sourceTree = DEVELOPER_DIR; }; - 198350B8276D3D840002E2E9 /* libexpat.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libexpat.tbd; path = Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.1.sdk/usr/lib/libexpat.tbd; sourceTree = DEVELOPER_DIR; }; - 198350BA276D3D9D0002E2E9 /* libresolv.9.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libresolv.9.tbd; path = Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.1.sdk/usr/lib/libresolv.9.tbd; sourceTree = DEVELOPER_DIR; }; - 198350BD276D3E430002E2E9 /* libpthread.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libpthread.tbd; path = Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.1.sdk/usr/lib/libpthread.tbd; sourceTree = DEVELOPER_DIR; }; - 198350BF276D520F0002E2E9 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = Info.plist; sourceTree = ""; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 190B121F276CF6B5002B86DD /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 198350BC276D3DAC0002E2E9 /* libresolv.tbd in Frameworks */, - 19835092276D3C0D0002E2E9 /* libev.a in Frameworks */, - 198350B4276D3C850002E2E9 /* libpcrecpp.a in Frameworks */, - 198350B1276D3C850002E2E9 /* libpcreposix.a in Frameworks */, - 198350B2276D3C850002E2E9 /* libpcre.a in Frameworks */, - 198350A0276D3C4F0002E2E9 /* libcares.a in Frameworks */, - 196AAB6A2776263400602189 /* Clibsodium.xcframework in Frameworks */, - 190B1E08276CFC69002B86DD /* libmbedx509.a in Frameworks */, - 190B1E07276CFC69002B86DD /* libmbedcrypto.a in Frameworks */, - 190B1E09276CFC69002B86DD /* libmbedtls.a in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 190B1218276CF6B5002B86DD = { - isa = PBXGroup; - children = ( - 190B1224276CF6B5002B86DD /* ShadowSocks */, - 190B1223276CF6B5002B86DD /* Products */, - 190B1E6B276D06F2002B86DD /* Frameworks */, - ); - sourceTree = ""; - }; - 190B1223276CF6B5002B86DD /* Products */ = { - isa = PBXGroup; - children = ( - 190B1222276CF6B5002B86DD /* ShadowSocks.framework */, - ); - name = Products; - sourceTree = ""; - }; - 190B1224276CF6B5002B86DD /* ShadowSocks */ = { - isa = PBXGroup; - children = ( - 190B2458276D2251002B86DD /* pcre */, - 190B1B1B276CFC67002B86DD /* libcares */, - 190B1A9B276CFC66002B86DD /* libev */, - 190B1AC0276CFC67002B86DD /* mbedtls */, - 190B1B72276CFC67002B86DD /* shadowsocks-libev */, - 190B1225276CF6B5002B86DD /* ShadowSocks.h */, - 198350BF276D520F0002E2E9 /* Info.plist */, - ); - path = ShadowSocks; - sourceTree = ""; - }; - 190B1A9B276CFC66002B86DD /* libev */ = { - isa = PBXGroup; - children = ( - 190B1AB4276CFC67002B86DD /* arm64 */, - ); - path = libev; - sourceTree = ""; - }; - 190B1AB4276CFC67002B86DD /* arm64 */ = { - isa = PBXGroup; - children = ( - 1983508F276D3C0D0002E2E9 /* lib */, - 190B1AB5276CFC67002B86DD /* include */, - ); - path = arm64; - sourceTree = ""; - }; - 190B1AB5276CFC67002B86DD /* include */ = { - isa = PBXGroup; - children = ( - 190B1AB6276CFC67002B86DD /* event.h */, - 190B1AB7276CFC67002B86DD /* ev++.h */, - 190B1AB8276CFC67002B86DD /* ev.h */, - ); - path = include; - sourceTree = ""; - }; - 190B1AC0276CFC67002B86DD /* mbedtls */ = { - isa = PBXGroup; - children = ( - 190B233C276D18CE002B86DD /* include */, - 190B1B17276CFC67002B86DD /* lib */, - ); - path = mbedtls; - sourceTree = ""; - }; - 190B1B17276CFC67002B86DD /* lib */ = { - isa = PBXGroup; - children = ( - 190B1B18276CFC67002B86DD /* libmbedcrypto.a */, - 190B1B19276CFC67002B86DD /* libmbedx509.a */, - 190B1B1A276CFC67002B86DD /* libmbedtls.a */, - ); - path = lib; - sourceTree = ""; - }; - 190B1B1B276CFC67002B86DD /* libcares */ = { - isa = PBXGroup; - children = ( - 19835097276D3C4E0002E2E9 /* lib */, - 190B1B1C276CFC67002B86DD /* include */, - ); - path = libcares; - sourceTree = ""; - }; - 190B1B1C276CFC67002B86DD /* include */ = { - isa = PBXGroup; - children = ( - 190B1B1D276CFC67002B86DD /* ares_version.h */, - 190B1B1E276CFC67002B86DD /* ares_build.h */, - 190B1B1F276CFC67002B86DD /* ares.h */, - 190B1B20276CFC67002B86DD /* ares_rules.h */, - 190B1B21276CFC67002B86DD /* ares_dns.h */, - ); - path = include; - sourceTree = ""; - }; - 190B1B72276CFC67002B86DD /* shadowsocks-libev */ = { - isa = PBXGroup; - children = ( - 19835086276D2CB40002E2E9 /* config.h */, - 190B2070276D0DB4002B86DD /* libbloom */, - 190B1F79276D0DB4002B86DD /* libcork */, - 190B1E6C276D0DB3002B86DD /* libipset */, - 190B1F44276D0DB3002B86DD /* src */, - ); - path = "shadowsocks-libev"; - sourceTree = ""; - }; - 190B1E6B276D06F2002B86DD /* Frameworks */ = { - isa = PBXGroup; - children = ( - 196AAB672776262D00602189 /* Clibsodium.xcframework */, - 198350BD276D3E430002E2E9 /* libpthread.tbd */, - 198350BA276D3D9D0002E2E9 /* libresolv.9.tbd */, - 198350B8276D3D840002E2E9 /* libexpat.tbd */, - 198350B6276D3D6A0002E2E9 /* libz.tbd */, - 19835089276D3A4F0002E2E9 /* libresolv.tbd */, - ); - name = Frameworks; - sourceTree = ""; - }; - 190B1E6C276D0DB3002B86DD /* libipset */ = { - isa = PBXGroup; - children = ( - 190B2290276D1697002B86DD /* ipsetbuild */, - 190B228E276D1697002B86DD /* ipsetcat */, - 190B2292276D1697002B86DD /* ipsetdot */, - 190B2271276D1697002B86DD /* libipset */, - ); - path = libipset; - sourceTree = ""; - }; - 190B1F44276D0DB3002B86DD /* src */ = { - isa = PBXGroup; - children = ( - 190B1F69276D0DB3002B86DD /* acl.c */, - 190B1F4B276D0DB3002B86DD /* acl.h */, - 190B1F4D276D0DB3002B86DD /* aead.c */, - 190B1F67276D0DB3002B86DD /* aead.h */, - 190B28D4276D25DA002B86DD /* android.c */, - 190B1F64276D0DB3002B86DD /* base64.c */, - 190B1F4F276D0DB3002B86DD /* base64.h */, - 190B1F6B276D0DB3002B86DD /* cache.c */, - 190B1F54276D0DB3002B86DD /* cache.h */, - 190B1F61276D0DB3002B86DD /* common.h */, - 190B1F71276D0DB3002B86DD /* crypto.c */, - 190B1F5B276D0DB3002B86DD /* crypto.h */, - 190B1F72276D0DB3002B86DD /* jconf.c */, - 190B1F5A276D0DB3002B86DD /* jconf.h */, - 190B1F45276D0DB3002B86DD /* json.c */, - 190B1F62276D0DB3002B86DD /* json.h */, - 190B1F51276D0DB3002B86DD /* local.c */, - 190B1F6F276D0DB3002B86DD /* local.h */, - 190B1F6C276D0DB3002B86DD /* manager.c */, - 190B1F52276D0DB3002B86DD /* manager.h */, - 190B1F63276D0DB3002B86DD /* netutils.c */, - 190B1F50276D0DB3002B86DD /* netutils.h */, - 190B1F68276D0DB3002B86DD /* plugin.c */, - 190B1F4C276D0DB3002B86DD /* plugin.h */, - 190B1F4E276D0DB3002B86DD /* ppbloom.c */, - 190B1F66276D0DB3002B86DD /* ppbloom.h */, - 190B28D3276D25DA002B86DD /* redir.c */, - 190B28D5276D25DA002B86DD /* redir.h */, - 190B1F5F276D0DB3002B86DD /* resolv.c */, - 190B1F47276D0DB3002B86DD /* resolv.h */, - 190B1F49276D0DB3002B86DD /* rule.c */, - 190B1F6A276D0DB3002B86DD /* rule.h */, - 190B1F59276D0DB3002B86DD /* server.c */, - 190B1F73276D0DB3002B86DD /* server.h */, - 190B1F6E276D0DB3002B86DD /* shadowsocks.h */, - 190B1F76276D0DB4002B86DD /* socks5.h */, - 190B1F77276D0DB4002B86DD /* stream.c */, - 190B1F57276D0DB3002B86DD /* stream.h */, - 190B1F6D276D0DB3002B86DD /* tunnel.c */, - 190B1F53276D0DB3002B86DD /* tunnel.h */, - 190B1F5C276D0DB3002B86DD /* udprelay.c */, - 190B1F74276D0DB4002B86DD /* udprelay.h */, - 190B1F58276D0DB3002B86DD /* uthash.h */, - 190B1F60276D0DB3002B86DD /* utils.c */, - 190B1F46276D0DB3002B86DD /* utils.h */, - 190B1F5D276D0DB3002B86DD /* winsock.c */, - 190B1F48276D0DB3002B86DD /* winsock.h */, - ); - path = src; - sourceTree = ""; - }; - 190B1F79276D0DB4002B86DD /* libcork */ = { - isa = PBXGroup; - children = ( - 190B22D8276D16C2002B86DD /* cork-hash */, - 190B22D4276D16C2002B86DD /* cork-initializer */, - 190B22D2276D16C2002B86DD /* cork-test */, - 190B22AC276D16C2002B86DD /* libcork */, - ); - path = libcork; - sourceTree = ""; - }; - 190B2070276D0DB4002B86DD /* libbloom */ = { - isa = PBXGroup; - children = ( - 190B2095276D0DB4002B86DD /* bloom.c */, - 190B2099276D0DB4002B86DD /* bloom.h */, - 190B209C276D0DB4002B86DD /* murmur2 */, - ); - path = libbloom; - sourceTree = ""; - }; - 190B209C276D0DB4002B86DD /* murmur2 */ = { - isa = PBXGroup; - children = ( - 190B209D276D0DB5002B86DD /* murmurhash2.h */, - 190B209F276D0DB5002B86DD /* MurmurHash2.c */, - ); - path = murmur2; - sourceTree = ""; - }; - 190B2271276D1697002B86DD /* libipset */ = { - isa = PBXGroup; - children = ( - 190B2272276D1697002B86DD /* map */, - 190B227A276D1697002B86DD /* bdd */, - 190B2283276D1697002B86DD /* set */, - 190B228C276D1697002B86DD /* general.c */, - ); - name = libipset; - path = src/libipset; - sourceTree = ""; - }; - 190B2272276D1697002B86DD /* map */ = { - isa = PBXGroup; - children = ( - 190B2273276D1697002B86DD /* storage.c */, - 190B2274276D1697002B86DD /* inspection.c */, - 190B2276276D1697002B86DD /* ipv4_map.c */, - 190B2277276D1697002B86DD /* ipv6_map.c */, - 190B2278276D1697002B86DD /* allocation.c */, - ); - path = map; - sourceTree = ""; - }; - 190B227A276D1697002B86DD /* bdd */ = { - isa = PBXGroup; - children = ( - 190B227B276D1697002B86DD /* expanded.c */, - 190B227C276D1697002B86DD /* basics.c */, - 190B227D276D1697002B86DD /* assignments.c */, - 190B227E276D1697002B86DD /* bdd-iterator.c */, - 190B227F276D1697002B86DD /* read.c */, - 190B2280276D1697002B86DD /* reachable.c */, - 190B2282276D1697002B86DD /* write.c */, - ); - path = bdd; - sourceTree = ""; - }; - 190B2283276D1697002B86DD /* set */ = { - isa = PBXGroup; - children = ( - 190B2284276D1697002B86DD /* ipv4_set.c */, - 190B2285276D1697002B86DD /* ipv6_set.c */, - 190B2286276D1697002B86DD /* storage.c */, - 190B2287276D1697002B86DD /* inspection.c */, - 190B2288276D1697002B86DD /* iterator.c */, - 190B228A276D1697002B86DD /* allocation.c */, - ); - path = set; - sourceTree = ""; - }; - 190B228E276D1697002B86DD /* ipsetcat */ = { - isa = PBXGroup; - children = ( - 190B228F276D1697002B86DD /* ipsetcat.c */, - ); - name = ipsetcat; - path = src/ipsetcat; - sourceTree = ""; - }; - 190B2290276D1697002B86DD /* ipsetbuild */ = { - isa = PBXGroup; - children = ( - 190B2291276D1697002B86DD /* ipsetbuild.c */, - ); - name = ipsetbuild; - path = src/ipsetbuild; - sourceTree = ""; - }; - 190B2292276D1697002B86DD /* ipsetdot */ = { - isa = PBXGroup; - children = ( - 190B2293276D1697002B86DD /* ipsetdot.c */, - ); - name = ipsetdot; - path = src/ipsetdot; - sourceTree = ""; - }; - 190B22AC276D16C2002B86DD /* libcork */ = { - isa = PBXGroup; - children = ( - 190B22AD276D16C2002B86DD /* posix */, - 190B22B6276D16C2002B86DD /* core */, - 190B22C1276D16C2002B86DD /* ds */, - 190B22CC276D16C2002B86DD /* cli */, - 190B22CF276D16C2002B86DD /* pthreads */, - ); - name = libcork; - path = src/libcork; - sourceTree = ""; - }; - 190B22AD276D16C2002B86DD /* posix */ = { - isa = PBXGroup; - children = ( - 190B22AE276D16C2002B86DD /* mingw.c */, - 190B22AF276D16C2002B86DD /* process.c */, - 190B22B0276D16C2002B86DD /* exec.c */, - 190B22B1276D16C2002B86DD /* files.c */, - 190B22B2276D16C2002B86DD /* subprocess.c */, - 190B22B3276D16C2002B86DD /* env.c */, - 190B22B4276D16C2002B86DD /* directory-walker.c */, - ); - path = posix; - sourceTree = ""; - }; - 190B22B6276D16C2002B86DD /* core */ = { - isa = PBXGroup; - children = ( - 190B22B7276D16C2002B86DD /* allocator.c */, - 190B22B8276D16C2002B86DD /* ip-address.c */, - 190B22B9276D16C2002B86DD /* mempool.c */, - 190B22BA276D16C2002B86DD /* timestamp.c */, - 190B22BB276D16C2002B86DD /* hash.c */, - 190B22BC276D16C2002B86DD /* error.c */, - 190B22BD276D16C2002B86DD /* version.c */, - 190B22BE276D16C2002B86DD /* u128.c */, - 190B22C0276D16C2002B86DD /* gc.c */, - ); - path = core; - sourceTree = ""; - }; - 190B22C1276D16C2002B86DD /* ds */ = { - isa = PBXGroup; - children = ( - 190B22C2276D16C2002B86DD /* buffer.c */, - 190B22C3276D16C2002B86DD /* managed-buffer.c */, - 190B22C4276D16C2002B86DD /* array.c */, - 190B22C5276D16C2002B86DD /* dllist.c */, - 190B22C6276D16C2002B86DD /* file-stream.c */, - 190B22C7276D16C2002B86DD /* ring-buffer.c */, - 190B22C8276D16C2002B86DD /* hash-table.c */, - 190B22C9276D16C2002B86DD /* bitset.c */, - 190B22CA276D16C2002B86DD /* slice.c */, - ); - path = ds; - sourceTree = ""; - }; - 190B22CC276D16C2002B86DD /* cli */ = { - isa = PBXGroup; - children = ( - 190B22CE276D16C2002B86DD /* commands.c */, - ); - path = cli; - sourceTree = ""; - }; - 190B22CF276D16C2002B86DD /* pthreads */ = { - isa = PBXGroup; - children = ( - 190B22D0276D16C2002B86DD /* thread.c */, - ); - path = pthreads; - sourceTree = ""; - }; - 190B22D2276D16C2002B86DD /* cork-test */ = { - isa = PBXGroup; - children = ( - 190B22D3276D16C2002B86DD /* cork-test.c */, - ); - name = "cork-test"; - path = "src/cork-test"; - sourceTree = ""; - }; - 190B22D4276D16C2002B86DD /* cork-initializer */ = { - isa = PBXGroup; - children = ( - 190B22D5276D16C2002B86DD /* init1.c */, - 190B22D6276D16C2002B86DD /* init2.c */, - 190B22D7276D16C2002B86DD /* main.c */, - ); - name = "cork-initializer"; - path = "src/cork-initializer"; - sourceTree = ""; - }; - 190B22D8276D16C2002B86DD /* cork-hash */ = { - isa = PBXGroup; - children = ( - 190B22D9276D16C2002B86DD /* cork-hash.c */, - ); - name = "cork-hash"; - path = "src/cork-hash"; - sourceTree = ""; - }; - 190B233C276D18CE002B86DD /* include */ = { - isa = PBXGroup; - children = ( - 190B233D276D18CE002B86DD /* pem.h */, - 190B233E276D18CE002B86DD /* check_config.h */, - 190B233F276D18CE002B86DD /* error.h */, - 190B2340276D18CE002B86DD /* md2.h */, - 190B2341276D18CE002B86DD /* oid.h */, - 190B2342276D18CE002B86DD /* pkcs5.h */, - 190B2343276D18CE002B86DD /* ripemd160.h */, - 190B2344276D18CE002B86DD /* blowfish.h */, - 190B2345276D18CE002B86DD /* debug.h */, - 190B2346276D18CE002B86DD /* x509.h */, - 190B2347276D18CE002B86DD /* version.h */, - 190B2349276D18CE002B86DD /* ecp.h */, - 190B234A276D18CE002B86DD /* net.h */, - 190B234B276D18CE002B86DD /* cipher_internal.h */, - 190B234D276D18CE002B86DD /* md_internal.h */, - 190B234E276D18CE002B86DD /* base64.h */, - 190B234F276D18CE002B86DD /* pkcs11.h */, - 190B2350276D18CE002B86DD /* ssl_internal.h */, - 190B2351276D18CE002B86DD /* asn1.h */, - 190B2352276D18CE002B86DD /* config.h */, - 190B2353276D18CE002B86DD /* memory_buffer_alloc.h */, - 190B2354276D18CE002B86DD /* x509_csr.h */, - 190B2355276D18CE002B86DD /* xtea.h */, - 190B2356276D18CE002B86DD /* threading.h */, - 190B2357276D18CE002B86DD /* compat-1.3.h */, - 190B2358276D18CE002B86DD /* md5.h */, - 190B2359276D18CE002B86DD /* timing.h */, - 190B235A276D18CE002B86DD /* arc4.h */, - 190B235B276D18CE002B86DD /* sha256.h */, - 190B235C276D18CE002B86DD /* mbedtls */, - 190B239F276D18CF002B86DD /* ecdsa.h */, - 190B23A0276D18CF002B86DD /* md.h */, - 190B23A1276D18CF002B86DD /* cipher.h */, - 190B23A2276D18CF002B86DD /* entropy.h */, - 190B23A3276D18CF002B86DD /* pkcs12.h */, - 190B23A4276D18CF002B86DD /* padlock.h */, - 190B23A5276D18CF002B86DD /* sha512.h */, - 190B23A6276D18CF002B86DD /* bn_mul.h */, - 190B23A7276D18CF002B86DD /* pk.h */, - 190B23A8276D18CF002B86DD /* ssl.h */, - 190B23A9276D18CF002B86DD /* camellia.h */, - 190B23AA276D18CF002B86DD /* md4.h */, - 190B23AB276D18CF002B86DD /* x509_crt.h */, - 190B23AC276D18CF002B86DD /* .gitignore */, - 190B23AD276D18CF002B86DD /* aes.h */, - 190B23AE276D18CF002B86DD /* pk_internal.h */, - 190B23AF276D18CF002B86DD /* ssl_cookie.h */, - 190B23B0276D18CF002B86DD /* dhm.h */, - 190B23B1276D18CF002B86DD /* aesni.h */, - 190B23B2276D18CF002B86DD /* ctr_drbg.h */, - 190B23B3276D18CF002B86DD /* des.h */, - 190B23B4276D18CF002B86DD /* x509_crl.h */, - 190B23B5276D18CF002B86DD /* ecdh.h */, - 190B23B6276D18CF002B86DD /* sha1.h */, - 190B23B7276D18CF002B86DD /* gcm.h */, - 190B23B8276D18CF002B86DD /* certs.h */, - 190B23B9276D18CF002B86DD /* rsa.h */, - 190B23BA276D18CF002B86DD /* hmac_drbg.h */, - 190B23BB276D18CF002B86DD /* ssl_ticket.h */, - 190B23BC276D18CF002B86DD /* ssl_ciphersuites.h */, - 190B23BD276D18CF002B86DD /* ssl_cache.h */, - 190B23BE276D18CF002B86DD /* platform.h */, - 190B23BF276D18CF002B86DD /* bignum.h */, - 190B23C0276D18CF002B86DD /* entropy_poll.h */, - 190B23C1276D18CF002B86DD /* havege.h */, - 190B23C2276D18CF002B86DD /* asn1write.h */, - 190B23C3276D18CF002B86DD /* ccm.h */, - ); - path = include; - sourceTree = ""; - }; - 190B235C276D18CE002B86DD /* mbedtls */ = { - isa = PBXGroup; - children = ( - 190B235D276D18CE002B86DD /* pem.h */, - 190B235E276D18CE002B86DD /* check_config.h */, - 190B235F276D18CE002B86DD /* error.h */, - 190B2360276D18CE002B86DD /* md2.h */, - 190B2361276D18CE002B86DD /* oid.h */, - 190B2362276D18CE002B86DD /* pkcs5.h */, - 190B2363276D18CE002B86DD /* ripemd160.h */, - 190B2364276D18CE002B86DD /* blowfish.h */, - 190B2365276D18CE002B86DD /* debug.h */, - 190B2366276D18CE002B86DD /* x509.h */, - 190B2367276D18CE002B86DD /* version.h */, - 190B2368276D18CE002B86DD /* ecp.h */, - 190B2369276D18CE002B86DD /* net.h */, - 190B236A276D18CE002B86DD /* cipher_internal.h */, - 190B236B276D18CE002B86DD /* LICENSE */, - 190B236C276D18CF002B86DD /* md_internal.h */, - 190B236D276D18CF002B86DD /* base64.h */, - 190B236E276D18CF002B86DD /* pkcs11.h */, - 190B236F276D18CF002B86DD /* ssl_internal.h */, - 190B2370276D18CF002B86DD /* asn1.h */, - 190B2371276D18CF002B86DD /* config.h */, - 190B2372276D18CF002B86DD /* memory_buffer_alloc.h */, - 190B2373276D18CF002B86DD /* x509_csr.h */, - 190B2374276D18CF002B86DD /* xtea.h */, - 190B2375276D18CF002B86DD /* threading.h */, - 190B2376276D18CF002B86DD /* compat-1.3.h */, - 190B2377276D18CF002B86DD /* md5.h */, - 190B2378276D18CF002B86DD /* timing.h */, - 190B2379276D18CF002B86DD /* arc4.h */, - 190B237A276D18CF002B86DD /* sha256.h */, - 190B237B276D18CF002B86DD /* ecdsa.h */, - 190B237C276D18CF002B86DD /* md.h */, - 190B237D276D18CF002B86DD /* cipher.h */, - 190B237E276D18CF002B86DD /* entropy.h */, - 190B237F276D18CF002B86DD /* pkcs12.h */, - 190B2380276D18CF002B86DD /* padlock.h */, - 190B2381276D18CF002B86DD /* sha512.h */, - 190B2382276D18CF002B86DD /* bn_mul.h */, - 190B2383276D18CF002B86DD /* pk.h */, - 190B2384276D18CF002B86DD /* ssl.h */, - 190B2385276D18CF002B86DD /* camellia.h */, - 190B2386276D18CF002B86DD /* md4.h */, - 190B2387276D18CF002B86DD /* x509_crt.h */, - 190B2388276D18CF002B86DD /* aes.h */, - 190B2389276D18CF002B86DD /* pk_internal.h */, - 190B238A276D18CF002B86DD /* ssl_cookie.h */, - 190B238B276D18CF002B86DD /* dhm.h */, - 190B238C276D18CF002B86DD /* aesni.h */, - 190B238D276D18CF002B86DD /* ctr_drbg.h */, - 190B238E276D18CF002B86DD /* des.h */, - 190B238F276D18CF002B86DD /* x509_crl.h */, - 190B2390276D18CF002B86DD /* ecdh.h */, - 190B2391276D18CF002B86DD /* sha1.h */, - 190B2392276D18CF002B86DD /* gcm.h */, - 190B2393276D18CF002B86DD /* certs.h */, - 190B2394276D18CF002B86DD /* rsa.h */, - 190B2395276D18CF002B86DD /* hmac_drbg.h */, - 190B2396276D18CF002B86DD /* ssl_ticket.h */, - 190B2397276D18CF002B86DD /* ssl_ciphersuites.h */, - 190B2398276D18CF002B86DD /* ssl_cache.h */, - 190B2399276D18CF002B86DD /* platform.h */, - 190B239A276D18CF002B86DD /* bignum.h */, - 190B239B276D18CF002B86DD /* entropy_poll.h */, - 190B239C276D18CF002B86DD /* havege.h */, - 190B239D276D18CF002B86DD /* asn1write.h */, - 190B239E276D18CF002B86DD /* ccm.h */, - ); - path = mbedtls; - sourceTree = ""; - }; - 190B2458276D2251002B86DD /* pcre */ = { - isa = PBXGroup; - children = ( - 198350A1276D3C850002E2E9 /* lib */, - 190B2459276D2251002B86DD /* include */, - ); - path = pcre; - sourceTree = ""; - }; - 190B2459276D2251002B86DD /* include */ = { - isa = PBXGroup; - children = ( - 190B245A276D2251002B86DD /* pcrecpparg.h */, - 190B245B276D2251002B86DD /* pcreposix.h */, - 190B245C276D2251002B86DD /* pcre_scanner.h */, - 190B245D276D2251002B86DD /* pcre_stringpiece.h */, - 190B245E276D2251002B86DD /* pcre.h */, - 190B245F276D2251002B86DD /* pcrecpp.h */, - ); - path = include; - sourceTree = ""; - }; - 1983508F276D3C0D0002E2E9 /* lib */ = { - isa = PBXGroup; - children = ( - 19835090276D3C0D0002E2E9 /* libev.a */, - 19835091276D3C0D0002E2E9 /* libev.la */, - ); - path = lib; - sourceTree = ""; - }; - 19835097276D3C4E0002E2E9 /* lib */ = { - isa = PBXGroup; - children = ( - 1983509C276D3C4E0002E2E9 /* arm64 */, - ); - path = lib; - sourceTree = ""; - }; - 1983509C276D3C4E0002E2E9 /* arm64 */ = { - isa = PBXGroup; - children = ( - 1983509D276D3C4E0002E2E9 /* libcares.a */, - ); - path = arm64; - sourceTree = ""; - }; - 198350A1276D3C850002E2E9 /* lib */ = { - isa = PBXGroup; - children = ( - 198350A6276D3C850002E2E9 /* libpcre.la */, - 198350A7276D3C850002E2E9 /* libpcrecpp.la */, - 198350A8276D3C850002E2E9 /* libpcreposix.a */, - 198350A9276D3C850002E2E9 /* libpcre.a */, - 198350AA276D3C850002E2E9 /* libpcreposix.la */, - 198350AB276D3C850002E2E9 /* libpcrecpp.a */, - ); - path = lib; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXHeadersBuildPhase section */ - 190B121D276CF6B5002B86DD /* Headers */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - 190B23F2276D18CF002B86DD /* md_internal.h in Headers */, - 190B216D276D0DB5002B86DD /* shadowsocks.h in Headers */, - 19835087276D2DED0002E2E9 /* config.h in Headers */, - 190B241E276D18CF002B86DD /* ssl_cache.h in Headers */, - 190B214B276D0DB5002B86DD /* plugin.h in Headers */, - 190B23E8276D18CF002B86DD /* pkcs5.h in Headers */, - 190B2413276D18CF002B86DD /* ctr_drbg.h in Headers */, - 190B2424276D18CF002B86DD /* ccm.h in Headers */, - 190B23C8276D18CF002B86DD /* oid.h in Headers */, - 190B2443276D18CF002B86DD /* ssl_cache.h in Headers */, - 190B1E0B276CFC69002B86DD /* ares_build.h in Headers */, - 190B1226276CF6B5002B86DD /* ShadowSocks.h in Headers */, - 190B23EC276D18CF002B86DD /* x509.h in Headers */, - 190B1E0D276CFC69002B86DD /* ares_rules.h in Headers */, - 190B241F276D18CF002B86DD /* platform.h in Headers */, - 190B2439276D18CF002B86DD /* des.h in Headers */, - 190B1E0C276CFC69002B86DD /* ares.h in Headers */, - 190B23EA276D18CF002B86DD /* blowfish.h in Headers */, - 190B2441276D18CF002B86DD /* ssl_ticket.h in Headers */, - 190B23E6276D18CF002B86DD /* md2.h in Headers */, - 190B241B276D18CF002B86DD /* hmac_drbg.h in Headers */, - 190B243F276D18CF002B86DD /* rsa.h in Headers */, - 190B2428276D18CF002B86DD /* entropy.h in Headers */, - 190B23DB276D18CF002B86DD /* x509_csr.h in Headers */, - 190B23FE276D18CF002B86DD /* timing.h in Headers */, - 190B2427276D18CF002B86DD /* cipher.h in Headers */, - 190B23C4276D18CF002B86DD /* pem.h in Headers */, - 190B240D276D18CF002B86DD /* x509_crt.h in Headers */, - 190B23D9276D18CF002B86DD /* config.h in Headers */, - 190B2404276D18CF002B86DD /* entropy.h in Headers */, - 190B2440276D18CF002B86DD /* hmac_drbg.h in Headers */, - 190B23E9276D18CF002B86DD /* ripemd160.h in Headers */, - 190B2423276D18CF002B86DD /* asn1write.h in Headers */, - 190B240C276D18CF002B86DD /* md4.h in Headers */, - 190B2412276D18CF002B86DD /* aesni.h in Headers */, - 190B242E276D18CF002B86DD /* ssl.h in Headers */, - 190B2151276D0DB5002B86DD /* manager.h in Headers */, - 190B2414276D18CF002B86DD /* des.h in Headers */, - 190B2405276D18CF002B86DD /* pkcs12.h in Headers */, - 190B23D2276D18CF002B86DD /* cipher_internal.h in Headers */, - 190B242D276D18CF002B86DD /* pk.h in Headers */, - 190B23D6276D18CF002B86DD /* pkcs11.h in Headers */, - 190B2411276D18CF002B86DD /* dhm.h in Headers */, - 190B23F0276D18CF002B86DD /* cipher_internal.h in Headers */, - 190B2161276D0DB5002B86DD /* json.h in Headers */, - 190B23C9276D18CF002B86DD /* pkcs5.h in Headers */, - 190B243C276D18CF002B86DD /* sha1.h in Headers */, - 190B23D4276D18CF002B86DD /* md_internal.h in Headers */, - 190B23E7276D18CF002B86DD /* oid.h in Headers */, - 190B23FD276D18CF002B86DD /* md5.h in Headers */, - 190B2410276D18CF002B86DD /* ssl_cookie.h in Headers */, - 190B2447276D18CF002B86DD /* havege.h in Headers */, - 190B2401276D18CF002B86DD /* ecdsa.h in Headers */, - 190B2402276D18CF002B86DD /* md.h in Headers */, - 190B23F8276D18CF002B86DD /* memory_buffer_alloc.h in Headers */, - 190B1DB0276CFC69002B86DD /* ev.h in Headers */, - 190B23DF276D18CF002B86DD /* md5.h in Headers */, - 190B240E276D18CF002B86DD /* aes.h in Headers */, - 190B2169276D0DB5002B86DD /* rule.h in Headers */, - 190B240A276D18CF002B86DD /* ssl.h in Headers */, - 190B214E276D0DB5002B86DD /* base64.h in Headers */, - 190B2153276D0DB5002B86DD /* cache.h in Headers */, - 190B23E5276D18CF002B86DD /* error.h in Headers */, - 190B243E276D18CF002B86DD /* certs.h in Headers */, - 190B2156276D0DB5002B86DD /* stream.h in Headers */, - 190B241D276D18CF002B86DD /* ssl_ciphersuites.h in Headers */, - 190B23EE276D18CF002B86DD /* ecp.h in Headers */, - 190B23ED276D18CF002B86DD /* version.h in Headers */, - 190B214A276D0DB5002B86DD /* acl.h in Headers */, - 190B2426276D18CF002B86DD /* md.h in Headers */, - 190B23DA276D18CF002B86DD /* memory_buffer_alloc.h in Headers */, - 190B23C6276D18CF002B86DD /* error.h in Headers */, - 190B2416276D18CF002B86DD /* ecdh.h in Headers */, - 190B2421276D18CF002B86DD /* entropy_poll.h in Headers */, - 190B23D5276D18CF002B86DD /* base64.h in Headers */, - 190B2437276D18CF002B86DD /* aesni.h in Headers */, - 190B23EF276D18CF002B86DD /* net.h in Headers */, - 190B23CD276D18CF002B86DD /* x509.h in Headers */, - 190B2172276D0DB5002B86DD /* udprelay.h in Headers */, - 190B23DD276D18CF002B86DD /* threading.h in Headers */, - 190B2174276D0DB5002B86DD /* socks5.h in Headers */, - 190B2147276D0DB5002B86DD /* winsock.h in Headers */, - 190B2422276D18CF002B86DD /* havege.h in Headers */, - 190B240B276D18CF002B86DD /* camellia.h in Headers */, - 190B23FC276D18CF002B86DD /* compat-1.3.h in Headers */, - 190B2157276D0DB5002B86DD /* uthash.h in Headers */, - 190B2145276D0DB5002B86DD /* utils.h in Headers */, - 190B23DC276D18CF002B86DD /* xtea.h in Headers */, - 190B242F276D18CF002B86DD /* camellia.h in Headers */, - 190B241A276D18CF002B86DD /* rsa.h in Headers */, - 190B2166276D0DB5002B86DD /* aead.h in Headers */, - 190B2446276D18CF002B86DD /* entropy_poll.h in Headers */, - 190B226E276D0DB6002B86DD /* murmurhash2.h in Headers */, - 190B23EB276D18CF002B86DD /* debug.h in Headers */, - 190B23D0276D18CF002B86DD /* ecp.h in Headers */, - 190B23F4276D18CF002B86DD /* pkcs11.h in Headers */, - 190B243A276D18CF002B86DD /* x509_crl.h in Headers */, - 190B2159276D0DB5002B86DD /* jconf.h in Headers */, - 190B2408276D18CF002B86DD /* bn_mul.h in Headers */, - 190B23CC276D18CF002B86DD /* debug.h in Headers */, - 190B23CB276D18CF002B86DD /* blowfish.h in Headers */, - 190B2425276D18CF002B86DD /* ecdsa.h in Headers */, - 190B2430276D18CF002B86DD /* md4.h in Headers */, - 190B2449276D18CF002B86DD /* ccm.h in Headers */, - 190B2146276D0DB5002B86DD /* resolv.h in Headers */, - 190B2152276D0DB5002B86DD /* tunnel.h in Headers */, - 190B1E0E276CFC69002B86DD /* ares_dns.h in Headers */, - 190B23E2276D18CF002B86DD /* sha256.h in Headers */, - 190B2438276D18CF002B86DD /* ctr_drbg.h in Headers */, - 190B1DAF276CFC69002B86DD /* ev++.h in Headers */, - 190B28D8276D25DA002B86DD /* redir.h in Headers */, - 190B23DE276D18CF002B86DD /* compat-1.3.h in Headers */, - 190B2436276D18CF002B86DD /* dhm.h in Headers */, - 190B2433276D18CF002B86DD /* aes.h in Headers */, - 190B241C276D18CF002B86DD /* ssl_ticket.h in Headers */, - 190B23E3276D18CF002B86DD /* pem.h in Headers */, - 190B2406276D18CF002B86DD /* padlock.h in Headers */, - 190B2420276D18CF002B86DD /* bignum.h in Headers */, - 190B2403276D18CF002B86DD /* cipher.h in Headers */, - 190B242B276D18CF002B86DD /* sha512.h in Headers */, - 190B226C276D0DB6002B86DD /* bloom.h in Headers */, - 190B1DAE276CFC69002B86DD /* event.h in Headers */, - 190B23FF276D18CF002B86DD /* arc4.h in Headers */, - 190B2419276D18CF002B86DD /* certs.h in Headers */, - 190B2444276D18CF002B86DD /* platform.h in Headers */, - 190B23E1276D18CF002B86DD /* arc4.h in Headers */, - 190B2418276D18CF002B86DD /* gcm.h in Headers */, - 190B23FB276D18CF002B86DD /* threading.h in Headers */, - 190B23D8276D18CF002B86DD /* asn1.h in Headers */, - 190B23D1276D18CF002B86DD /* net.h in Headers */, - 190B23F6276D18CF002B86DD /* asn1.h in Headers */, - 190B2165276D0DB5002B86DD /* ppbloom.h in Headers */, - 190B23C5276D18CF002B86DD /* check_config.h in Headers */, - 190B23E0276D18CF002B86DD /* timing.h in Headers */, - 190B23CA276D18CF002B86DD /* ripemd160.h in Headers */, - 190B23FA276D18CF002B86DD /* xtea.h in Headers */, - 190B23D7276D18CF002B86DD /* ssl_internal.h in Headers */, - 190B2431276D18CF002B86DD /* x509_crt.h in Headers */, - 190B2434276D18CF002B86DD /* pk_internal.h in Headers */, - 190B214F276D0DB5002B86DD /* netutils.h in Headers */, - 190B23CE276D18CF002B86DD /* version.h in Headers */, - 190B2435276D18CF002B86DD /* ssl_cookie.h in Headers */, - 190B2442276D18CF002B86DD /* ssl_ciphersuites.h in Headers */, - 190B215A276D0DB5002B86DD /* crypto.h in Headers */, - 190B2400276D18CF002B86DD /* sha256.h in Headers */, - 190B240F276D18CF002B86DD /* pk_internal.h in Headers */, - 190B1E0A276CFC69002B86DD /* ares_version.h in Headers */, - 190B23C7276D18CF002B86DD /* md2.h in Headers */, - 190B2160276D0DB5002B86DD /* common.h in Headers */, - 190B2429276D18CF002B86DD /* pkcs12.h in Headers */, - 190B2409276D18CF002B86DD /* pk.h in Headers */, - 190B243B276D18CF002B86DD /* ecdh.h in Headers */, - 190B2415276D18CF002B86DD /* x509_crl.h in Headers */, - 190B2171276D0DB5002B86DD /* server.h in Headers */, - 190B2448276D18CF002B86DD /* asn1write.h in Headers */, - 190B242A276D18CF002B86DD /* padlock.h in Headers */, - 190B243D276D18CF002B86DD /* gcm.h in Headers */, - 190B2445276D18CF002B86DD /* bignum.h in Headers */, - 190B242C276D18CF002B86DD /* bn_mul.h in Headers */, - 190B23F5276D18CF002B86DD /* ssl_internal.h in Headers */, - 190B216E276D0DB5002B86DD /* local.h in Headers */, - 190B2417276D18CF002B86DD /* sha1.h in Headers */, - 190B2407276D18CF002B86DD /* sha512.h in Headers */, - 190B23F9276D18CF002B86DD /* x509_csr.h in Headers */, - 190B23F3276D18CF002B86DD /* base64.h in Headers */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXHeadersBuildPhase section */ - -/* Begin PBXNativeTarget section */ - 190B1221276CF6B5002B86DD /* ShadowSocks */ = { - isa = PBXNativeTarget; - buildConfigurationList = 190B1229276CF6B5002B86DD /* Build configuration list for PBXNativeTarget "ShadowSocks" */; - buildPhases = ( - 190B121D276CF6B5002B86DD /* Headers */, - 190B121E276CF6B5002B86DD /* Sources */, - 190B121F276CF6B5002B86DD /* Frameworks */, - 190B1220276CF6B5002B86DD /* Resources */, - 196AAB66277625DF00602189 /* CopyFiles */, - 196AAB6C2776263400602189 /* Embed Frameworks */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = ShadowSocks; - productName = ShadowSocks; - productReference = 190B1222276CF6B5002B86DD /* ShadowSocks.framework */; - productType = "com.apple.product-type.framework"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 190B1219276CF6B5002B86DD /* Project object */ = { - isa = PBXProject; - attributes = { - BuildIndependentTargetsInParallel = 1; - LastUpgradeCheck = 1320; - TargetAttributes = { - 190B1221276CF6B5002B86DD = { - CreatedOnToolsVersion = 13.2; - }; - }; - }; - buildConfigurationList = 190B121C276CF6B5002B86DD /* Build configuration list for PBXProject "ShadowSocks" */; - compatibilityVersion = "Xcode 13.0"; - developmentRegion = en; - hasScannedForEncodings = 0; - knownRegions = ( - en, - Base, - ); - mainGroup = 190B1218276CF6B5002B86DD; - productRefGroup = 190B1223276CF6B5002B86DD /* Products */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - 190B1221276CF6B5002B86DD /* ShadowSocks */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXResourcesBuildPhase section */ - 190B1220276CF6B5002B86DD /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 190B121E276CF6B5002B86DD /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 190B22DA276D16C2002B86DD /* mingw.c in Sources */, - 190B22DD276D16C2002B86DD /* files.c in Sources */, - 190B229D276D1697002B86DD /* bdd-iterator.c in Sources */, - 190B2158276D0DB5002B86DD /* server.c in Sources */, - 190B22F8276D16C2002B86DD /* main.c in Sources */, - 190B2148276D0DB5002B86DD /* rule.c in Sources */, - 190B216B276D0DB5002B86DD /* manager.c in Sources */, - 190B22DF276D16C2002B86DD /* env.c in Sources */, - 190B216C276D0DB5002B86DD /* tunnel.c in Sources */, - 190B229B276D1697002B86DD /* basics.c in Sources */, - 190B2150276D0DB5002B86DD /* local.c in Sources */, - 190B229F276D1697002B86DD /* reachable.c in Sources */, - 190B22F1276D16C2002B86DD /* bitset.c in Sources */, - 190B22EA276D16C2002B86DD /* buffer.c in Sources */, - 190B216F276D0DB5002B86DD /* crypto.c in Sources */, - 190B214C276D0DB5002B86DD /* aead.c in Sources */, - 190B2298276D1697002B86DD /* ipv6_map.c in Sources */, - 190B2294276D1697002B86DD /* storage.c in Sources */, - 190B22E8276D16C2002B86DD /* u128.c in Sources */, - 190B2163276D0DB5002B86DD /* base64.c in Sources */, - 190B22A1276D1697002B86DD /* ipv4_set.c in Sources */, - 190B22EE276D16C2002B86DD /* file-stream.c in Sources */, - 190B22EB276D16C2002B86DD /* managed-buffer.c in Sources */, - 190B22E2276D16C2002B86DD /* ip-address.c in Sources */, - 190B22EF276D16C2002B86DD /* ring-buffer.c in Sources */, - 190B215B276D0DB5002B86DD /* udprelay.c in Sources */, - 190B22A4276D1697002B86DD /* inspection.c in Sources */, - 190B229E276D1697002B86DD /* read.c in Sources */, - 190B22DE276D16C2002B86DD /* subprocess.c in Sources */, - 190B2170276D0DB5002B86DD /* jconf.c in Sources */, - 190B2168276D0DB5002B86DD /* acl.c in Sources */, - 190B215E276D0DB5002B86DD /* resolv.c in Sources */, - 190B2175276D0DB5002B86DD /* stream.c in Sources */, - 190B22DB276D16C2002B86DD /* process.c in Sources */, - 190B214D276D0DB5002B86DD /* ppbloom.c in Sources */, - 190B2167276D0DB5002B86DD /* plugin.c in Sources */, - 190B22F7276D16C2002B86DD /* init2.c in Sources */, - 190B2297276D1697002B86DD /* ipv4_map.c in Sources */, - 190B2299276D1697002B86DD /* allocation.c in Sources */, - 190B22A3276D1697002B86DD /* storage.c in Sources */, - 190B215F276D0DB5002B86DD /* utils.c in Sources */, - 190B22E5276D16C2002B86DD /* hash.c in Sources */, - 190B2162276D0DB5002B86DD /* netutils.c in Sources */, - 190B2270276D0DB6002B86DD /* MurmurHash2.c in Sources */, - 190B22F6276D16C2002B86DD /* init1.c in Sources */, - 190B22F0276D16C2002B86DD /* hash-table.c in Sources */, - 190B22F3276D16C2002B86DD /* commands.c in Sources */, - 190B22E0276D16C2002B86DD /* directory-walker.c in Sources */, - 190B22E9276D16C2002B86DD /* gc.c in Sources */, - 190B2144276D0DB5002B86DD /* json.c in Sources */, - 190B22A0276D1697002B86DD /* write.c in Sources */, - 190B216A276D0DB5002B86DD /* cache.c in Sources */, - 190B22E4276D16C2002B86DD /* timestamp.c in Sources */, - 190B22A2276D1697002B86DD /* ipv6_set.c in Sources */, - 190B22E1276D16C2002B86DD /* allocator.c in Sources */, - 190B22AA276D1697002B86DD /* ipsetbuild.c in Sources */, - 190B22A9276D1697002B86DD /* ipsetcat.c in Sources */, - 190B22A8276D1697002B86DD /* general.c in Sources */, - 190B22A7276D1697002B86DD /* allocation.c in Sources */, - 190B2295276D1697002B86DD /* inspection.c in Sources */, - 190B215C276D0DB5002B86DD /* winsock.c in Sources */, - 190B229A276D1697002B86DD /* expanded.c in Sources */, - 190B22EC276D16C2002B86DD /* array.c in Sources */, - 190B22AB276D1697002B86DD /* ipsetdot.c in Sources */, - 190B22DC276D16C2002B86DD /* exec.c in Sources */, - 190B22F2276D16C2002B86DD /* slice.c in Sources */, - 190B22A5276D1697002B86DD /* iterator.c in Sources */, - 190B22F4276D16C2002B86DD /* thread.c in Sources */, - 190B22F9276D16C2002B86DD /* cork-hash.c in Sources */, - 190B22E7276D16C2002B86DD /* version.c in Sources */, - 190B28D6276D25DA002B86DD /* redir.c in Sources */, - 190B22E6276D16C2002B86DD /* error.c in Sources */, - 190B2268276D0DB6002B86DD /* bloom.c in Sources */, - 190B22E3276D16C2002B86DD /* mempool.c in Sources */, - 190B22F5276D16C2002B86DD /* cork-test.c in Sources */, - 190B22ED276D16C2002B86DD /* dllist.c in Sources */, - 190B229C276D1697002B86DD /* assignments.c in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin XCBuildConfiguration section */ - 190B1227276CF6B5002B86DD /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++17"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_ENABLE_OBJC_WEAK = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 1; - DEBUG_INFORMATION_FORMAT = dwarf; - ENABLE_STRICT_OBJC_MSGSEND = YES; - ENABLE_TESTABILITY = YES; - GCC_C_LANGUAGE_STANDARD = gnu11; - GCC_DYNAMIC_NO_PIC = NO; - GCC_NO_COMMON_BLOCKS = YES; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; - MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; - MTL_FAST_MATH = YES; - ONLY_ACTIVE_ARCH = YES; - SDKROOT = iphoneos; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Debug; - }; - 190B1228276CF6B5002B86DD /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++17"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_ENABLE_OBJC_WEAK = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 1; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - ENABLE_NS_ASSERTIONS = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_C_LANGUAGE_STANDARD = gnu11; - GCC_NO_COMMON_BLOCKS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; - MTL_ENABLE_DEBUG_INFO = NO; - MTL_FAST_MATH = YES; - SDKROOT = iphoneos; - SWIFT_COMPILATION_MODE = wholemodule; - SWIFT_OPTIMIZATION_LEVEL = "-O"; - VALIDATE_PRODUCT = YES; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Release; - }; - 190B122A276CF6B5002B86DD /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - APPLICATION_EXTENSION_API_ONLY = YES; - ARCHS = arm64; - BUILD_LIBRARY_FOR_DISTRIBUTION = YES; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1; - DEAD_CODE_STRIPPING = NO; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = ""; - DYLIB_CURRENT_VERSION = ""; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - ENABLE_BITCODE = NO; - GCC_C_LANGUAGE_STANDARD = gnu11; - GCC_NO_COMMON_BLOCKS = YES; - GENERATE_INFOPLIST_FILE = YES; - HEADER_SEARCH_PATHS = ( - "${PROJECT_DIR}/ShadowSocks/shadowsocks-libev/libcork/include/**", - "${PROJECT_DIR}/ShadowSocks/shadowsocks-libev/libipset/include/**", - "$(PROJECT_DIR)/ShadowSocks/libev/arm64/include", - "$(PROJECT_DIR)/ShadowSocks/mbedtls/include", - "$(PROJECT_DIR)/ShadowSocks/libcares/include/arm64", - "${PROJECT_DIR}/ShadowSocks/shadowsocks-libev/src", - ); - INFOPLIST_FILE = ShadowSocks/Info.plist; - INFOPLIST_KEY_NSHumanReadableCopyright = ""; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@loader_path/Frameworks", - ); - LIBRARY_SEARCH_PATHS = ( - "${Inherited}", - "$(PROJECT_DIR)/ShadowSocks/libev/arm64/lib", - "$(PROJECT_DIR)/ShadowSocks/mbedtls/bin", - "$(PROJECT_DIR)/ShadowSocks/mbedtls/lib", - "$(PROJECT_DIR)/ShadowSocks/libcares/lib/arm64", - "$(PROJECT_DIR)/ShadowSocks/shadowsocks-libev/lib", - "$(PROJECT_DIR)/ShadowSocks/pcre/lib", - "$(PROJECT_DIR)/ShadowSocks/libsodium/lib", - ); - MACH_O_TYPE = mh_dylib; - MARKETING_VERSION = 1.0; - OTHER_CFLAGS = ( - "-DHAVE_CONFIG_H", - "-DLIB_ONLY", - "-DUDPRELAY_LOCAL", - "-DMODULE_LOCAL", - ); - PRODUCT_BUNDLE_IDENTIFIER = org.amnezia.Amnezia.ShadowSocks; - PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; - SKIP_INSTALL = YES; - SUPPORTS_MACCATALYST = NO; - SWIFT_EMIT_LOC_STRINGS = YES; - SWIFT_VERSION = 5.0; - SYSTEM_FRAMEWORK_SEARCH_PATHS = "${inherited}"; - SYSTEM_HEADER_SEARCH_PATHS = "${inherited}"; - TARGETED_DEVICE_FAMILY = 1; - }; - name = Debug; - }; - 190B122B276CF6B5002B86DD /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - APPLICATION_EXTENSION_API_ONLY = YES; - ARCHS = arm64; - BUILD_LIBRARY_FOR_DISTRIBUTION = YES; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1; - DEAD_CODE_STRIPPING = NO; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = ""; - DYLIB_CURRENT_VERSION = ""; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - ENABLE_BITCODE = NO; - GCC_C_LANGUAGE_STANDARD = gnu11; - GCC_NO_COMMON_BLOCKS = YES; - GENERATE_INFOPLIST_FILE = YES; - HEADER_SEARCH_PATHS = ( - "${PROJECT_DIR}/ShadowSocks/shadowsocks-libev/libcork/include/**", - "${PROJECT_DIR}/ShadowSocks/shadowsocks-libev/libipset/include/**", - "$(PROJECT_DIR)/ShadowSocks/libev/arm64/include", - "$(PROJECT_DIR)/ShadowSocks/mbedtls/include", - "$(PROJECT_DIR)/ShadowSocks/libcares/include/arm64", - "${PROJECT_DIR}/ShadowSocks/shadowsocks-libev/src", - ); - INFOPLIST_FILE = ShadowSocks/Info.plist; - INFOPLIST_KEY_NSHumanReadableCopyright = ""; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@loader_path/Frameworks", - ); - LIBRARY_SEARCH_PATHS = ( - "${Inherited}", - "$(PROJECT_DIR)/ShadowSocks/libev/arm64/lib", - "$(PROJECT_DIR)/ShadowSocks/mbedtls/bin", - "$(PROJECT_DIR)/ShadowSocks/mbedtls/lib", - "$(PROJECT_DIR)/ShadowSocks/libcares/lib/arm64", - "$(PROJECT_DIR)/ShadowSocks/shadowsocks-libev/lib", - "$(PROJECT_DIR)/ShadowSocks/pcre/lib", - "$(PROJECT_DIR)/ShadowSocks/libsodium/lib", - ); - MACH_O_TYPE = mh_dylib; - MARKETING_VERSION = 1.0; - OTHER_CFLAGS = ( - "-DHAVE_CONFIG_H", - "-DLIB_ONLY", - "-DUDPRELAY_LOCAL", - "-DMODULE_LOCAL", - ); - PRODUCT_BUNDLE_IDENTIFIER = org.amnezia.Amnezia.ShadowSocks; - PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; - SKIP_INSTALL = YES; - SUPPORTS_MACCATALYST = NO; - SWIFT_EMIT_LOC_STRINGS = YES; - SWIFT_VERSION = 5.0; - SYSTEM_FRAMEWORK_SEARCH_PATHS = "${inherited}"; - SYSTEM_HEADER_SEARCH_PATHS = "${inherited}"; - TARGETED_DEVICE_FAMILY = 1; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 190B121C276CF6B5002B86DD /* Build configuration list for PBXProject "ShadowSocks" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 190B1227276CF6B5002B86DD /* Debug */, - 190B1228276CF6B5002B86DD /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 190B1229276CF6B5002B86DD /* Build configuration list for PBXNativeTarget "ShadowSocks" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 190B122A276CF6B5002B86DD /* Debug */, - 190B122B276CF6B5002B86DD /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = 190B1219276CF6B5002B86DD /* Project object */; -} diff --git a/client/3rd/ShadowSocks/ShadowSocks.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/client/3rd/ShadowSocks/ShadowSocks.xcodeproj/project.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index 919434a6..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks.xcodeproj/project.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/client/3rd/ShadowSocks/ShadowSocks.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/client/3rd/ShadowSocks/ShadowSocks.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist deleted file mode 100644 index 18d98100..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +++ /dev/null @@ -1,8 +0,0 @@ - - - - - IDEDidComputeMac32BitWarning - - - diff --git a/client/3rd/ShadowSocks/ShadowSocks.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/client/3rd/ShadowSocks/ShadowSocks.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings deleted file mode 100644 index f9b0d7c5..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings +++ /dev/null @@ -1,8 +0,0 @@ - - - - - PreviewsEnabled - - - diff --git a/client/3rd/ShadowSocks/ShadowSocks.xcodeproj/project.xcworkspace/xcuserdata/sanchez.xcuserdatad/UserInterfaceState.xcuserstate b/client/3rd/ShadowSocks/ShadowSocks.xcodeproj/project.xcworkspace/xcuserdata/sanchez.xcuserdatad/UserInterfaceState.xcuserstate deleted file mode 100644 index 932288fcd403aecd1bb00d481ea2efe8bbe96d8d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 207529 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 diff --git a/client/3rd/ShadowSocks/ShadowSocks.xcodeproj/project.xcworkspace/xcuserdata/sanchez.xcuserdatad/WorkspaceSettings.xcsettings b/client/3rd/ShadowSocks/ShadowSocks.xcodeproj/project.xcworkspace/xcuserdata/sanchez.xcuserdatad/WorkspaceSettings.xcsettings deleted file mode 100644 index 379adbed..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks.xcodeproj/project.xcworkspace/xcuserdata/sanchez.xcuserdatad/WorkspaceSettings.xcsettings +++ /dev/null @@ -1,18 +0,0 @@ - - - - - BuildLocationStyle - UseAppPreferences - CustomBuildLocationType - RelativeToDerivedData - DerivedDataLocationStyle - Default - IssueFilterStyle - ShowActiveSchemeOnly - LiveSourceIssuesEnabled - - ShowSharedSchemesAutomaticallyEnabled - - - diff --git a/client/3rd/ShadowSocks/ShadowSocks.xcodeproj/xcshareddata/xcschemes/ShadowSocks.xcscheme b/client/3rd/ShadowSocks/ShadowSocks.xcodeproj/xcshareddata/xcschemes/ShadowSocks.xcscheme deleted file mode 100644 index f9afd0eb..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks.xcodeproj/xcshareddata/xcschemes/ShadowSocks.xcscheme +++ /dev/null @@ -1,67 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/client/3rd/ShadowSocks/ShadowSocks.xcodeproj/xcuserdata/sanchez.xcuserdatad/xcschemes/xcschememanagement.plist b/client/3rd/ShadowSocks/ShadowSocks.xcodeproj/xcuserdata/sanchez.xcuserdatad/xcschemes/xcschememanagement.plist deleted file mode 100644 index f526c1f7..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks.xcodeproj/xcuserdata/sanchez.xcuserdatad/xcschemes/xcschememanagement.plist +++ /dev/null @@ -1,22 +0,0 @@ - - - - - SchemeUserState - - ShadowSocks.xcscheme_^#shared#^_ - - orderHint - 0 - - - SuppressBuildableAutocreation - - 190B1221276CF6B5002B86DD - - primary - - - - - diff --git a/client/3rd/ShadowSocks/ShadowSocks/Info.plist b/client/3rd/ShadowSocks/ShadowSocks/Info.plist deleted file mode 100644 index d4062ea9..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/Info.plist +++ /dev/null @@ -1,26 +0,0 @@ - - - - - CFBundleSignature - ???? - CFBundlePackageType - FMWK - CFBundleIdentifier - ${PRODUCT_BUNDLE_IDENTIFIER} - CFBundleName - ${PRODUCT_NAME} - CFBundleVersion - ${CURRENT_PROJECT_VERSION} - CFBundleInfoDictionaryVersion - 6.0 - CFBundleExecutable - ${EXECUTABLE_NAME} - CFBundleShortVersionString - 1.0 - CFBundleDevelopmentRegion - en_US - NSPrincipalClass - - - diff --git a/client/3rd/ShadowSocks/ShadowSocks/ShadowSocks.h b/client/3rd/ShadowSocks/ShadowSocks/ShadowSocks.h deleted file mode 100644 index 9336d1e2..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/ShadowSocks.h +++ /dev/null @@ -1,11 +0,0 @@ -#import - -//! Project version number for ShadowSocks. -FOUNDATION_EXPORT double ShadowSocksVersionNumber; - -//! Project version string for ShadowSocks. -FOUNDATION_EXPORT const unsigned char ShadowSocksVersionString[]; - -// In this header, you should import all the public headers of your framework using statements like #import - -#import "shadowsocks.h" diff --git a/client/3rd/ShadowSocks/ShadowSocks/libcares/include/ares.h b/client/3rd/ShadowSocks/ShadowSocks/libcares/include/ares.h deleted file mode 100644 index cf8a8553..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libcares/include/ares.h +++ /dev/null @@ -1,755 +0,0 @@ - -/* Copyright 1998 by the Massachusetts Institute of Technology. - * Copyright (C) 2007-2013 by Daniel Stenberg - * - * Permission to use, copy, modify, and distribute this - * software and its documentation for any purpose and without - * fee is hereby granted, provided that the above copyright - * notice appear in all copies and that both that copyright - * notice and this permission notice appear in supporting - * documentation, and that the name of M.I.T. not be used in - * advertising or publicity pertaining to distribution of the - * software without specific, written prior permission. - * M.I.T. makes no representations about the suitability of - * this software for any purpose. It is provided "as is" - * without express or implied warranty. - */ - -#ifndef ARES__H -#define ARES__H - -#include "ares_version.h" /* c-ares version defines */ -#include "ares_build.h" /* c-ares build definitions */ -#include "ares_rules.h" /* c-ares rules enforcement */ - -/* - * Define WIN32 when build target is Win32 API - */ - -#if (defined(_WIN32) || defined(__WIN32__)) && \ - !defined(WIN32) && !defined(__SYMBIAN32__) -# define WIN32 -#endif - -#include - -/* HP-UX systems version 9, 10 and 11 lack sys/select.h and so does oldish - libc5-based Linux systems. Only include it on system that are known to - require it! */ -#if defined(_AIX) || defined(__NOVELL_LIBC__) || defined(__NetBSD__) || \ - defined(__minix) || defined(__SYMBIAN32__) || defined(__INTEGRITY) || \ - defined(ANDROID) || defined(__ANDROID__) || defined(__OpenBSD__) || \ - defined(__QNXNTO__) || defined(__MVS__) || defined(__HAIKU__) -#include -#endif -#if (defined(NETWARE) && !defined(__NOVELL_LIBC__)) -#include -#endif - -#if defined(WATT32) -# include -# include -# include -#elif defined(_WIN32_WCE) -# ifndef WIN32_LEAN_AND_MEAN -# define WIN32_LEAN_AND_MEAN -# endif -# include -# include -#elif defined(WIN32) -# ifndef WIN32_LEAN_AND_MEAN -# define WIN32_LEAN_AND_MEAN -# endif -# include -# include -# include -#else -# include -# include -#endif - -#if defined(ANDROID) || defined(__ANDROID__) -#include -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -/* -** c-ares external API function linkage decorations. -*/ - -#ifdef CARES_STATICLIB -# define CARES_EXTERN -#elif defined(WIN32) || defined(_WIN32) || defined(__SYMBIAN32__) -# if defined(CARES_BUILDING_LIBRARY) -# define CARES_EXTERN __declspec(dllexport) -# else -# define CARES_EXTERN __declspec(dllimport) -# endif -#elif defined(CARES_BUILDING_LIBRARY) && defined(CARES_SYMBOL_HIDING) -# define CARES_EXTERN CARES_SYMBOL_SCOPE_EXTERN -#else -# define CARES_EXTERN -#endif - - -#define ARES_SUCCESS 0 - -/* Server error codes (ARES_ENODATA indicates no relevant answer) */ -#define ARES_ENODATA 1 -#define ARES_EFORMERR 2 -#define ARES_ESERVFAIL 3 -#define ARES_ENOTFOUND 4 -#define ARES_ENOTIMP 5 -#define ARES_EREFUSED 6 - -/* Locally generated error codes */ -#define ARES_EBADQUERY 7 -#define ARES_EBADNAME 8 -#define ARES_EBADFAMILY 9 -#define ARES_EBADRESP 10 -#define ARES_ECONNREFUSED 11 -#define ARES_ETIMEOUT 12 -#define ARES_EOF 13 -#define ARES_EFILE 14 -#define ARES_ENOMEM 15 -#define ARES_EDESTRUCTION 16 -#define ARES_EBADSTR 17 - -/* ares_getnameinfo error codes */ -#define ARES_EBADFLAGS 18 - -/* ares_getaddrinfo error codes */ -#define ARES_ENONAME 19 -#define ARES_EBADHINTS 20 - -/* Uninitialized library error code */ -#define ARES_ENOTINITIALIZED 21 /* introduced in 1.7.0 */ - -/* ares_library_init error codes */ -#define ARES_ELOADIPHLPAPI 22 /* introduced in 1.7.0 */ -#define ARES_EADDRGETNETWORKPARAMS 23 /* introduced in 1.7.0 */ - -/* More error codes */ -#define ARES_ECANCELLED 24 /* introduced in 1.7.0 */ - -/* More ares_getaddrinfo error codes */ -#define ARES_ESERVICE 25 /* introduced in 1.?.0 */ - -/* Flag values */ -#define ARES_FLAG_USEVC (1 << 0) -#define ARES_FLAG_PRIMARY (1 << 1) -#define ARES_FLAG_IGNTC (1 << 2) -#define ARES_FLAG_NORECURSE (1 << 3) -#define ARES_FLAG_STAYOPEN (1 << 4) -#define ARES_FLAG_NOSEARCH (1 << 5) -#define ARES_FLAG_NOALIASES (1 << 6) -#define ARES_FLAG_NOCHECKRESP (1 << 7) -#define ARES_FLAG_EDNS (1 << 8) - -/* Option mask values */ -#define ARES_OPT_FLAGS (1 << 0) -#define ARES_OPT_TIMEOUT (1 << 1) -#define ARES_OPT_TRIES (1 << 2) -#define ARES_OPT_NDOTS (1 << 3) -#define ARES_OPT_UDP_PORT (1 << 4) -#define ARES_OPT_TCP_PORT (1 << 5) -#define ARES_OPT_SERVERS (1 << 6) -#define ARES_OPT_DOMAINS (1 << 7) -#define ARES_OPT_LOOKUPS (1 << 8) -#define ARES_OPT_SOCK_STATE_CB (1 << 9) -#define ARES_OPT_SORTLIST (1 << 10) -#define ARES_OPT_SOCK_SNDBUF (1 << 11) -#define ARES_OPT_SOCK_RCVBUF (1 << 12) -#define ARES_OPT_TIMEOUTMS (1 << 13) -#define ARES_OPT_ROTATE (1 << 14) -#define ARES_OPT_EDNSPSZ (1 << 15) -#define ARES_OPT_NOROTATE (1 << 16) -#define ARES_OPT_RESOLVCONF (1 << 17) - -/* Nameinfo flag values */ -#define ARES_NI_NOFQDN (1 << 0) -#define ARES_NI_NUMERICHOST (1 << 1) -#define ARES_NI_NAMEREQD (1 << 2) -#define ARES_NI_NUMERICSERV (1 << 3) -#define ARES_NI_DGRAM (1 << 4) -#define ARES_NI_TCP 0 -#define ARES_NI_UDP ARES_NI_DGRAM -#define ARES_NI_SCTP (1 << 5) -#define ARES_NI_DCCP (1 << 6) -#define ARES_NI_NUMERICSCOPE (1 << 7) -#define ARES_NI_LOOKUPHOST (1 << 8) -#define ARES_NI_LOOKUPSERVICE (1 << 9) -/* Reserved for future use */ -#define ARES_NI_IDN (1 << 10) -#define ARES_NI_IDN_ALLOW_UNASSIGNED (1 << 11) -#define ARES_NI_IDN_USE_STD3_ASCII_RULES (1 << 12) - -/* Addrinfo flag values */ -#define ARES_AI_CANONNAME (1 << 0) -#define ARES_AI_NUMERICHOST (1 << 1) -#define ARES_AI_PASSIVE (1 << 2) -#define ARES_AI_NUMERICSERV (1 << 3) -#define ARES_AI_V4MAPPED (1 << 4) -#define ARES_AI_ALL (1 << 5) -#define ARES_AI_ADDRCONFIG (1 << 6) -#define ARES_AI_NOSORT (1 << 7) -#define ARES_AI_ENVHOSTS (1 << 8) -/* Reserved for future use */ -#define ARES_AI_IDN (1 << 10) -#define ARES_AI_IDN_ALLOW_UNASSIGNED (1 << 11) -#define ARES_AI_IDN_USE_STD3_ASCII_RULES (1 << 12) -#define ARES_AI_CANONIDN (1 << 13) - -#define ARES_AI_MASK (ARES_AI_CANONNAME|ARES_AI_NUMERICHOST|ARES_AI_PASSIVE| \ - ARES_AI_NUMERICSERV|ARES_AI_V4MAPPED|ARES_AI_ALL| \ - ARES_AI_ADDRCONFIG) -#define ARES_GETSOCK_MAXNUM 16 /* ares_getsock() can return info about this - many sockets */ -#define ARES_GETSOCK_READABLE(bits,num) (bits & (1<< (num))) -#define ARES_GETSOCK_WRITABLE(bits,num) (bits & (1 << ((num) + \ - ARES_GETSOCK_MAXNUM))) - -/* c-ares library initialization flag values */ -#define ARES_LIB_INIT_NONE (0) -#define ARES_LIB_INIT_WIN32 (1 << 0) -#define ARES_LIB_INIT_ALL (ARES_LIB_INIT_WIN32) - - -/* - * Typedef our socket type - */ - -#ifndef ares_socket_typedef -#ifdef WIN32 -typedef SOCKET ares_socket_t; -#define ARES_SOCKET_BAD INVALID_SOCKET -#else -typedef int ares_socket_t; -#define ARES_SOCKET_BAD -1 -#endif -#define ares_socket_typedef -#endif /* ares_socket_typedef */ - -typedef void (*ares_sock_state_cb)(void *data, - ares_socket_t socket_fd, - int readable, - int writable); - -struct apattern; - -/* NOTE about the ares_options struct to users and developers. - - This struct will remain looking like this. It will not be extended nor - shrunk in future releases, but all new options will be set by ares_set_*() - options instead of with the ares_init_options() function. - - Eventually (in a galaxy far far away), all options will be settable by - ares_set_*() options and the ares_init_options() function will become - deprecated. - - When new options are added to c-ares, they are not added to this - struct. And they are not "saved" with the ares_save_options() function but - instead we encourage the use of the ares_dup() function. Needless to say, - if you add config options to c-ares you need to make sure ares_dup() - duplicates this new option. - - */ -struct ares_options { - int flags; - int timeout; /* in seconds or milliseconds, depending on options */ - int tries; - int ndots; - unsigned short udp_port; - unsigned short tcp_port; - int socket_send_buffer_size; - int socket_receive_buffer_size; - struct in_addr *servers; - int nservers; - char **domains; - int ndomains; - char *lookups; - ares_sock_state_cb sock_state_cb; - void *sock_state_cb_data; - struct apattern *sortlist; - int nsort; - int ednspsz; - char *resolvconf_path; -}; - -struct hostent; -struct timeval; -struct sockaddr; -struct ares_channeldata; -struct ares_addrinfo; -struct ares_addrinfo_hints; - -typedef struct ares_channeldata *ares_channel; - -typedef void (*ares_callback)(void *arg, - int status, - int timeouts, - unsigned char *abuf, - int alen); - -typedef void (*ares_host_callback)(void *arg, - int status, - int timeouts, - struct hostent *hostent); - -typedef void (*ares_nameinfo_callback)(void *arg, - int status, - int timeouts, - char *node, - char *service); - -typedef int (*ares_sock_create_callback)(ares_socket_t socket_fd, - int type, - void *data); - -typedef int (*ares_sock_config_callback)(ares_socket_t socket_fd, - int type, - void *data); - -typedef void (*ares_addrinfo_callback)(void *arg, - int status, - int timeouts, - struct ares_addrinfo *res); - -CARES_EXTERN int ares_library_init(int flags); - -CARES_EXTERN int ares_library_init_mem(int flags, - void *(*amalloc)(size_t size), - void (*afree)(void *ptr), - void *(*arealloc)(void *ptr, size_t size)); - -#if defined(ANDROID) || defined(__ANDROID__) -CARES_EXTERN void ares_library_init_jvm(JavaVM *jvm); -CARES_EXTERN int ares_library_init_android(jobject connectivity_manager); -CARES_EXTERN int ares_library_android_initialized(void); -#endif - -CARES_EXTERN int ares_library_initialized(void); - -CARES_EXTERN void ares_library_cleanup(void); - -CARES_EXTERN const char *ares_version(int *version); - -CARES_EXTERN int ares_init(ares_channel *channelptr); - -CARES_EXTERN int ares_init_options(ares_channel *channelptr, - struct ares_options *options, - int optmask); - -CARES_EXTERN int ares_save_options(ares_channel channel, - struct ares_options *options, - int *optmask); - -CARES_EXTERN void ares_destroy_options(struct ares_options *options); - -CARES_EXTERN int ares_dup(ares_channel *dest, - ares_channel src); - -CARES_EXTERN void ares_destroy(ares_channel channel); - -CARES_EXTERN void ares_cancel(ares_channel channel); - -/* These next 3 configure local binding for the out-going socket - * connection. Use these to specify source IP and/or network device - * on multi-homed systems. - */ -CARES_EXTERN void ares_set_local_ip4(ares_channel channel, unsigned int local_ip); - -/* local_ip6 should be 16 bytes in length */ -CARES_EXTERN void ares_set_local_ip6(ares_channel channel, - const unsigned char* local_ip6); - -/* local_dev_name should be null terminated. */ -CARES_EXTERN void ares_set_local_dev(ares_channel channel, - const char* local_dev_name); - -CARES_EXTERN void ares_set_socket_callback(ares_channel channel, - ares_sock_create_callback callback, - void *user_data); - -CARES_EXTERN void ares_set_socket_configure_callback(ares_channel channel, - ares_sock_config_callback callback, - void *user_data); - -CARES_EXTERN int ares_set_sortlist(ares_channel channel, - const char *sortstr); - -CARES_EXTERN void ares_getaddrinfo(ares_channel channel, - const char* node, - const char* service, - const struct ares_addrinfo_hints* hints, - ares_addrinfo_callback callback, - void* arg); - -CARES_EXTERN void ares_freeaddrinfo(struct ares_addrinfo* ai); - -/* - * Virtual function set to have user-managed socket IO. - * Note that all functions need to be defined, and when - * set, the library will not do any bind nor set any - * socket options, assuming the client handles these - * through either socket creation or the - * ares_sock_config_callback call. - */ -struct iovec; -struct ares_socket_functions { - ares_socket_t(*asocket)(int, int, int, void *); - int(*aclose)(ares_socket_t, void *); - int(*aconnect)(ares_socket_t, const struct sockaddr *, ares_socklen_t, void *); - ares_ssize_t(*arecvfrom)(ares_socket_t, void *, size_t, int, struct sockaddr *, ares_socklen_t *, void *); - ares_ssize_t(*asendv)(ares_socket_t, const struct iovec *, int, void *); -}; - -CARES_EXTERN void ares_set_socket_functions(ares_channel channel, - const struct ares_socket_functions * funcs, - void *user_data); - -CARES_EXTERN void ares_send(ares_channel channel, - const unsigned char *qbuf, - int qlen, - ares_callback callback, - void *arg); - -CARES_EXTERN void ares_query(ares_channel channel, - const char *name, - int dnsclass, - int type, - ares_callback callback, - void *arg); - -CARES_EXTERN void ares_search(ares_channel channel, - const char *name, - int dnsclass, - int type, - ares_callback callback, - void *arg); - -CARES_EXTERN void ares_gethostbyname(ares_channel channel, - const char *name, - int family, - ares_host_callback callback, - void *arg); - -CARES_EXTERN int ares_gethostbyname_file(ares_channel channel, - const char *name, - int family, - struct hostent **host); - -CARES_EXTERN void ares_gethostbyaddr(ares_channel channel, - const void *addr, - int addrlen, - int family, - ares_host_callback callback, - void *arg); - -CARES_EXTERN void ares_getnameinfo(ares_channel channel, - const struct sockaddr *sa, - ares_socklen_t salen, - int flags, - ares_nameinfo_callback callback, - void *arg); - -CARES_EXTERN int ares_fds(ares_channel channel, - fd_set *read_fds, - fd_set *write_fds); - -CARES_EXTERN int ares_getsock(ares_channel channel, - ares_socket_t *socks, - int numsocks); - -CARES_EXTERN struct timeval *ares_timeout(ares_channel channel, - struct timeval *maxtv, - struct timeval *tv); - -CARES_EXTERN void ares_process(ares_channel channel, - fd_set *read_fds, - fd_set *write_fds); - -CARES_EXTERN void ares_process_fd(ares_channel channel, - ares_socket_t read_fd, - ares_socket_t write_fd); - -CARES_EXTERN int ares_create_query(const char *name, - int dnsclass, - int type, - unsigned short id, - int rd, - unsigned char **buf, - int *buflen, - int max_udp_size); - -CARES_EXTERN int ares_mkquery(const char *name, - int dnsclass, - int type, - unsigned short id, - int rd, - unsigned char **buf, - int *buflen); - -CARES_EXTERN int ares_expand_name(const unsigned char *encoded, - const unsigned char *abuf, - int alen, - char **s, - long *enclen); - -CARES_EXTERN int ares_expand_string(const unsigned char *encoded, - const unsigned char *abuf, - int alen, - unsigned char **s, - long *enclen); - -/* - * NOTE: before c-ares 1.7.0 we would most often use the system in6_addr - * struct below when ares itself was built, but many apps would use this - * private version since the header checked a HAVE_* define for it. Starting - * with 1.7.0 we always declare and use our own to stop relying on the - * system's one. - */ -struct ares_in6_addr { - union { - unsigned char _S6_u8[16]; - } _S6_un; -}; - -struct ares_addrttl { - struct in_addr ipaddr; - int ttl; -}; - -struct ares_addr6ttl { - struct ares_in6_addr ip6addr; - int ttl; -}; - -struct ares_caa_reply { - struct ares_caa_reply *next; - int critical; - unsigned char *property; - size_t plength; /* plength excludes null termination */ - unsigned char *value; - size_t length; /* length excludes null termination */ -}; - -struct ares_srv_reply { - struct ares_srv_reply *next; - char *host; - unsigned short priority; - unsigned short weight; - unsigned short port; -}; - -struct ares_mx_reply { - struct ares_mx_reply *next; - char *host; - unsigned short priority; -}; - -struct ares_txt_reply { - struct ares_txt_reply *next; - unsigned char *txt; - size_t length; /* length excludes null termination */ -}; - -/* NOTE: This structure is a superset of ares_txt_reply - */ -struct ares_txt_ext { - struct ares_txt_ext *next; - unsigned char *txt; - size_t length; - /* 1 - if start of new record - * 0 - if a chunk in the same record */ - unsigned char record_start; -}; - -struct ares_naptr_reply { - struct ares_naptr_reply *next; - unsigned char *flags; - unsigned char *service; - unsigned char *regexp; - char *replacement; - unsigned short order; - unsigned short preference; -}; - -struct ares_soa_reply { - char *nsname; - char *hostmaster; - unsigned int serial; - unsigned int refresh; - unsigned int retry; - unsigned int expire; - unsigned int minttl; -}; - -struct ares_uri_reply { - struct ares_uri_reply *next; - unsigned short priority; - unsigned short weight; - char *uri; - int ttl; -}; - -/* - * Similar to addrinfo, but with extra ttl and missing canonname. - */ -struct ares_addrinfo_node { - int ai_ttl; - int ai_flags; - int ai_family; - int ai_socktype; - int ai_protocol; - ares_socklen_t ai_addrlen; - struct sockaddr *ai_addr; - struct ares_addrinfo_node *ai_next; -}; - -/* - * alias - label of the resource record. - * name - value (canonical name) of the resource record. - * See RFC2181 10.1.1. CNAME terminology. - */ -struct ares_addrinfo_cname { - int ttl; - char *alias; - char *name; - struct ares_addrinfo_cname *next; -}; - -struct ares_addrinfo { - struct ares_addrinfo_cname *cnames; - struct ares_addrinfo_node *nodes; - char *name; -}; - -struct ares_addrinfo_hints { - int ai_flags; - int ai_family; - int ai_socktype; - int ai_protocol; -}; - -/* -** Parse the buffer, starting at *abuf and of length alen bytes, previously -** obtained from an ares_search call. Put the results in *host, if nonnull. -** Also, if addrttls is nonnull, put up to *naddrttls IPv4 addresses along with -** their TTLs in that array, and set *naddrttls to the number of addresses -** so written. -*/ - -CARES_EXTERN int ares_parse_a_reply(const unsigned char *abuf, - int alen, - struct hostent **host, - struct ares_addrttl *addrttls, - int *naddrttls); - -CARES_EXTERN int ares_parse_aaaa_reply(const unsigned char *abuf, - int alen, - struct hostent **host, - struct ares_addr6ttl *addrttls, - int *naddrttls); - -CARES_EXTERN int ares_parse_caa_reply(const unsigned char* abuf, - int alen, - struct ares_caa_reply** caa_out); - -CARES_EXTERN int ares_parse_ptr_reply(const unsigned char *abuf, - int alen, - const void *addr, - int addrlen, - int family, - struct hostent **host); - -CARES_EXTERN int ares_parse_ns_reply(const unsigned char *abuf, - int alen, - struct hostent **host); - -CARES_EXTERN int ares_parse_srv_reply(const unsigned char* abuf, - int alen, - struct ares_srv_reply** srv_out); - -CARES_EXTERN int ares_parse_mx_reply(const unsigned char* abuf, - int alen, - struct ares_mx_reply** mx_out); - -CARES_EXTERN int ares_parse_txt_reply(const unsigned char* abuf, - int alen, - struct ares_txt_reply** txt_out); - -CARES_EXTERN int ares_parse_txt_reply_ext(const unsigned char* abuf, - int alen, - struct ares_txt_ext** txt_out); - -CARES_EXTERN int ares_parse_naptr_reply(const unsigned char* abuf, - int alen, - struct ares_naptr_reply** naptr_out); - -CARES_EXTERN int ares_parse_soa_reply(const unsigned char* abuf, - int alen, - struct ares_soa_reply** soa_out); - -CARES_EXTERN int ares_parse_uri_reply(const unsigned char* abuf, - int alen, - struct ares_uri_reply** uri_out); - -CARES_EXTERN void ares_free_string(void *str); - -CARES_EXTERN void ares_free_hostent(struct hostent *host); - -CARES_EXTERN void ares_free_data(void *dataptr); - -CARES_EXTERN const char *ares_strerror(int code); - -struct ares_addr_node { - struct ares_addr_node *next; - int family; - union { - struct in_addr addr4; - struct ares_in6_addr addr6; - } addr; -}; - -struct ares_addr_port_node { - struct ares_addr_port_node *next; - int family; - union { - struct in_addr addr4; - struct ares_in6_addr addr6; - } addr; - int udp_port; - int tcp_port; -}; - -CARES_EXTERN int ares_set_servers(ares_channel channel, - struct ares_addr_node *servers); -CARES_EXTERN int ares_set_servers_ports(ares_channel channel, - struct ares_addr_port_node *servers); - -/* Incomming string format: host[:port][,host[:port]]... */ -CARES_EXTERN int ares_set_servers_csv(ares_channel channel, - const char* servers); -CARES_EXTERN int ares_set_servers_ports_csv(ares_channel channel, - const char* servers); - -CARES_EXTERN int ares_get_servers(ares_channel channel, - struct ares_addr_node **servers); -CARES_EXTERN int ares_get_servers_ports(ares_channel channel, - struct ares_addr_port_node **servers); - -CARES_EXTERN const char *ares_inet_ntop(int af, const void *src, char *dst, - ares_socklen_t size); - -CARES_EXTERN int ares_inet_pton(int af, const char *src, void *dst); - - -#ifdef __cplusplus -} -#endif - -#endif /* ARES__H */ diff --git a/client/3rd/ShadowSocks/ShadowSocks/libcares/include/ares_build.h b/client/3rd/ShadowSocks/ShadowSocks/libcares/include/ares_build.h deleted file mode 100644 index f42b59d0..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libcares/include/ares_build.h +++ /dev/null @@ -1,104 +0,0 @@ -/* include/ares_build.h. Generated from ares_build.h.in by configure. */ -#ifndef __CARES_BUILD_H -#define __CARES_BUILD_H - - -/* Copyright (C) 2009 - 2021 by Daniel Stenberg et al - * - * Permission to use, copy, modify, and distribute this software and its - * documentation for any purpose and without fee is hereby granted, provided - * that the above copyright notice appear in all copies and that both that - * copyright notice and this permission notice appear in supporting - * documentation, and that the name of M.I.T. not be used in advertising or - * publicity pertaining to distribution of the software without specific, - * written prior permission. M.I.T. makes no representations about the - * suitability of this software for any purpose. It is provided "as is" - * without express or implied warranty. - */ - -/* ================================================================ */ -/* NOTES FOR CONFIGURE CAPABLE SYSTEMS */ -/* ================================================================ */ - -/* - * NOTE 1: - * ------- - * - * Nothing in this file is intended to be modified or adjusted by the - * c-ares library user nor by the c-ares library builder. - * - * If you think that something actually needs to be changed, adjusted - * or fixed in this file, then, report it on the c-ares development - * mailing list: http://lists.haxx.se/listinfo/c-ares/ - * - * This header file shall only export symbols which are 'cares' or 'CARES' - * prefixed, otherwise public name space would be polluted. - * - * NOTE 2: - * ------- - * - * Right now you might be staring at file ares_build.h.in or ares_build.h, - * this is due to the following reason: - * - * On systems capable of running the configure script, the configure process - * will overwrite the distributed ares_build.h file with one that is suitable - * and specific to the library being configured and built, which is generated - * from the ares_build.h.in template file. - * - */ - -/* ================================================================ */ -/* DEFINITION OF THESE SYMBOLS SHALL NOT TAKE PLACE ANYWHERE ELSE */ -/* ================================================================ */ - -#ifdef CARES_TYPEOF_ARES_SOCKLEN_T -# error "CARES_TYPEOF_ARES_SOCKLEN_T shall not be defined except in ares_build.h" - Error Compilation_aborted_CARES_TYPEOF_ARES_SOCKLEN_T_already_defined -#endif - -#define CARES_HAVE_ARPA_NAMESER_H 1 -#define CARES_HAVE_ARPA_NAMESER_COMPAT_H 1 - -/* ================================================================ */ -/* EXTERNAL INTERFACE SETTINGS FOR CONFIGURE CAPABLE SYSTEMS ONLY */ -/* ================================================================ */ - -/* Configure process defines this to 1 when it finds out that system */ -/* header file ws2tcpip.h must be included by the external interface. */ -/* #undef CARES_PULL_WS2TCPIP_H */ -#ifdef CARES_PULL_WS2TCPIP_H -# ifndef WIN32_LEAN_AND_MEAN -# define WIN32_LEAN_AND_MEAN -# endif -# include -# include -# include -#endif - -/* Configure process defines this to 1 when it finds out that system */ -/* header file sys/types.h must be included by the external interface. */ -#define CARES_PULL_SYS_TYPES_H 1 -#ifdef CARES_PULL_SYS_TYPES_H -# include -#endif - -/* Configure process defines this to 1 when it finds out that system */ -/* header file sys/socket.h must be included by the external interface. */ -#define CARES_PULL_SYS_SOCKET_H 1 -#ifdef CARES_PULL_SYS_SOCKET_H -# include -#endif - -/* Integral data type used for ares_socklen_t. */ -#define CARES_TYPEOF_ARES_SOCKLEN_T socklen_t - -/* Data type definition of ares_socklen_t. */ -typedef CARES_TYPEOF_ARES_SOCKLEN_T ares_socklen_t; - -/* Integral data type used for ares_ssize_t. */ -#define CARES_TYPEOF_ARES_SSIZE_T ssize_t - -/* Data type definition of ares_ssize_t. */ -typedef CARES_TYPEOF_ARES_SSIZE_T ares_ssize_t; - -#endif /* __CARES_BUILD_H */ diff --git a/client/3rd/ShadowSocks/ShadowSocks/libcares/include/ares_dns.h b/client/3rd/ShadowSocks/ShadowSocks/libcares/include/ares_dns.h deleted file mode 100644 index bc8aa7b1..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libcares/include/ares_dns.h +++ /dev/null @@ -1,112 +0,0 @@ -#ifndef HEADER_CARES_DNS_H -#define HEADER_CARES_DNS_H - -/* Copyright 1998, 2011 by the Massachusetts Institute of Technology. - * - * Permission to use, copy, modify, and distribute this - * software and its documentation for any purpose and without - * fee is hereby granted, provided that the above copyright - * notice appear in all copies and that both that copyright - * notice and this permission notice appear in supporting - * documentation, and that the name of M.I.T. not be used in - * advertising or publicity pertaining to distribution of the - * software without specific, written prior permission. - * M.I.T. makes no representations about the suitability of - * this software for any purpose. It is provided "as is" - * without express or implied warranty. - */ - -/* - * NOTE TO INTEGRATORS: - * - * This header is made public due to legacy projects relying on it. - * Please do not use the macros within this header, or include this - * header in your project as it may be removed in the future. - */ - - -/* - * Macro DNS__16BIT reads a network short (16 bit) given in network - * byte order, and returns its value as an unsigned short. - */ -#define DNS__16BIT(p) ((unsigned short)((unsigned int) 0xffff & \ - (((unsigned int)((unsigned char)(p)[0]) << 8U) | \ - ((unsigned int)((unsigned char)(p)[1]))))) - -/* - * Macro DNS__32BIT reads a network long (32 bit) given in network - * byte order, and returns its value as an unsigned int. - */ -#define DNS__32BIT(p) ((unsigned int) \ - (((unsigned int)((unsigned char)(p)[0]) << 24U) | \ - ((unsigned int)((unsigned char)(p)[1]) << 16U) | \ - ((unsigned int)((unsigned char)(p)[2]) << 8U) | \ - ((unsigned int)((unsigned char)(p)[3])))) - -#define DNS__SET16BIT(p, v) (((p)[0] = (unsigned char)(((v) >> 8) & 0xff)), \ - ((p)[1] = (unsigned char)((v) & 0xff))) -#define DNS__SET32BIT(p, v) (((p)[0] = (unsigned char)(((v) >> 24) & 0xff)), \ - ((p)[1] = (unsigned char)(((v) >> 16) & 0xff)), \ - ((p)[2] = (unsigned char)(((v) >> 8) & 0xff)), \ - ((p)[3] = (unsigned char)((v) & 0xff))) - -#if 0 -/* we cannot use this approach on systems where we can't access 16/32 bit - data on un-aligned addresses */ -#define DNS__16BIT(p) ntohs(*(unsigned short*)(p)) -#define DNS__32BIT(p) ntohl(*(unsigned long*)(p)) -#define DNS__SET16BIT(p, v) *(unsigned short*)(p) = htons(v) -#define DNS__SET32BIT(p, v) *(unsigned long*)(p) = htonl(v) -#endif - -/* Macros for parsing a DNS header */ -#define DNS_HEADER_QID(h) DNS__16BIT(h) -#define DNS_HEADER_QR(h) (((h)[2] >> 7) & 0x1) -#define DNS_HEADER_OPCODE(h) (((h)[2] >> 3) & 0xf) -#define DNS_HEADER_AA(h) (((h)[2] >> 2) & 0x1) -#define DNS_HEADER_TC(h) (((h)[2] >> 1) & 0x1) -#define DNS_HEADER_RD(h) ((h)[2] & 0x1) -#define DNS_HEADER_RA(h) (((h)[3] >> 7) & 0x1) -#define DNS_HEADER_Z(h) (((h)[3] >> 4) & 0x7) -#define DNS_HEADER_RCODE(h) ((h)[3] & 0xf) -#define DNS_HEADER_QDCOUNT(h) DNS__16BIT((h) + 4) -#define DNS_HEADER_ANCOUNT(h) DNS__16BIT((h) + 6) -#define DNS_HEADER_NSCOUNT(h) DNS__16BIT((h) + 8) -#define DNS_HEADER_ARCOUNT(h) DNS__16BIT((h) + 10) - -/* Macros for constructing a DNS header */ -#define DNS_HEADER_SET_QID(h, v) DNS__SET16BIT(h, v) -#define DNS_HEADER_SET_QR(h, v) ((h)[2] |= (unsigned char)(((v) & 0x1) << 7)) -#define DNS_HEADER_SET_OPCODE(h, v) ((h)[2] |= (unsigned char)(((v) & 0xf) << 3)) -#define DNS_HEADER_SET_AA(h, v) ((h)[2] |= (unsigned char)(((v) & 0x1) << 2)) -#define DNS_HEADER_SET_TC(h, v) ((h)[2] |= (unsigned char)(((v) & 0x1) << 1)) -#define DNS_HEADER_SET_RD(h, v) ((h)[2] |= (unsigned char)((v) & 0x1)) -#define DNS_HEADER_SET_RA(h, v) ((h)[3] |= (unsigned char)(((v) & 0x1) << 7)) -#define DNS_HEADER_SET_Z(h, v) ((h)[3] |= (unsigned char)(((v) & 0x7) << 4)) -#define DNS_HEADER_SET_RCODE(h, v) ((h)[3] |= (unsigned char)((v) & 0xf)) -#define DNS_HEADER_SET_QDCOUNT(h, v) DNS__SET16BIT((h) + 4, v) -#define DNS_HEADER_SET_ANCOUNT(h, v) DNS__SET16BIT((h) + 6, v) -#define DNS_HEADER_SET_NSCOUNT(h, v) DNS__SET16BIT((h) + 8, v) -#define DNS_HEADER_SET_ARCOUNT(h, v) DNS__SET16BIT((h) + 10, v) - -/* Macros for parsing the fixed part of a DNS question */ -#define DNS_QUESTION_TYPE(q) DNS__16BIT(q) -#define DNS_QUESTION_CLASS(q) DNS__16BIT((q) + 2) - -/* Macros for constructing the fixed part of a DNS question */ -#define DNS_QUESTION_SET_TYPE(q, v) DNS__SET16BIT(q, v) -#define DNS_QUESTION_SET_CLASS(q, v) DNS__SET16BIT((q) + 2, v) - -/* Macros for parsing the fixed part of a DNS resource record */ -#define DNS_RR_TYPE(r) DNS__16BIT(r) -#define DNS_RR_CLASS(r) DNS__16BIT((r) + 2) -#define DNS_RR_TTL(r) DNS__32BIT((r) + 4) -#define DNS_RR_LEN(r) DNS__16BIT((r) + 8) - -/* Macros for constructing the fixed part of a DNS resource record */ -#define DNS_RR_SET_TYPE(r, v) DNS__SET16BIT(r, v) -#define DNS_RR_SET_CLASS(r, v) DNS__SET16BIT((r) + 2, v) -#define DNS_RR_SET_TTL(r, v) DNS__SET32BIT((r) + 4, v) -#define DNS_RR_SET_LEN(r, v) DNS__SET16BIT((r) + 8, v) - -#endif /* HEADER_CARES_DNS_H */ diff --git a/client/3rd/ShadowSocks/ShadowSocks/libcares/include/ares_rules.h b/client/3rd/ShadowSocks/ShadowSocks/libcares/include/ares_rules.h deleted file mode 100644 index 1706ab7d..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libcares/include/ares_rules.h +++ /dev/null @@ -1,125 +0,0 @@ -#ifndef __CARES_RULES_H -#define __CARES_RULES_H - - -/* Copyright (C) 2009 - 2021 by Daniel Stenberg et al - * - * Permission to use, copy, modify, and distribute this software and its - * documentation for any purpose and without fee is hereby granted, provided - * that the above copyright notice appear in all copies and that both that - * copyright notice and this permission notice appear in supporting - * documentation, and that the name of M.I.T. not be used in advertising or - * publicity pertaining to distribution of the software without specific, - * written prior permission. M.I.T. makes no representations about the - * suitability of this software for any purpose. It is provided "as is" - * without express or implied warranty. - */ - -/* ================================================================ */ -/* COMPILE TIME SANITY CHECKS */ -/* ================================================================ */ - -/* - * NOTE 1: - * ------- - * - * All checks done in this file are intentionally placed in a public - * header file which is pulled by ares.h when an application is - * being built using an already built c-ares library. Additionally - * this file is also included and used when building the library. - * - * If compilation fails on this file it is certainly sure that the - * problem is elsewhere. It could be a problem in the ares_build.h - * header file, or simply that you are using different compilation - * settings than those used to build the library. - * - * Nothing in this file is intended to be modified or adjusted by the - * c-ares library user nor by the c-ares library builder. - * - * Do not deactivate any check, these are done to make sure that the - * library is properly built and used. - * - * You can find further help on the c-ares development mailing list: - * http://lists.haxx.se/listinfo/c-ares/ - * - * NOTE 2 - * ------ - * - * Some of the following compile time checks are based on the fact - * that the dimension of a constant array can not be a negative one. - * In this way if the compile time verification fails, the compilation - * will fail issuing an error. The error description wording is compiler - * dependent but it will be quite similar to one of the following: - * - * "negative subscript or subscript is too large" - * "array must have at least one element" - * "-1 is an illegal array size" - * "size of array is negative" - * - * If you are building an application which tries to use an already - * built c-ares library and you are getting this kind of errors on - * this file, it is a clear indication that there is a mismatch between - * how the library was built and how you are trying to use it for your - * application. Your already compiled or binary library provider is the - * only one who can give you the details you need to properly use it. - */ - -/* - * Verify that some macros are actually defined. - */ - -#ifndef CARES_TYPEOF_ARES_SOCKLEN_T -# error "CARES_TYPEOF_ARES_SOCKLEN_T definition is missing!" - Error Compilation_aborted_CARES_TYPEOF_ARES_SOCKLEN_T_is_missing -#endif - -/* - * Macros private to this header file. - */ - -#define CareschkszEQ(t, s) sizeof(t) == s ? 1 : -1 - -#define CareschkszGE(t1, t2) sizeof(t1) >= sizeof(t2) ? 1 : -1 - -/* - * Verify that the size previously defined and expected for - * ares_socklen_t is actually the same as the one reported - * by sizeof() at compile time. - */ - -typedef char - __cares_rule_02__ - [CareschkszEQ(ares_socklen_t, sizeof(CARES_TYPEOF_ARES_SOCKLEN_T))]; - -/* - * Verify at compile time that the size of ares_socklen_t as reported - * by sizeof() is greater or equal than the one reported for int for - * the current compilation. - */ - -typedef char - __cares_rule_03__ - [CareschkszGE(ares_socklen_t, int)]; - -/* ================================================================ */ -/* EXTERNALLY AND INTERNALLY VISIBLE DEFINITIONS */ -/* ================================================================ */ - -/* - * Get rid of macros private to this header file. - */ - -#undef CareschkszEQ -#undef CareschkszGE - -/* - * Get rid of macros not intended to exist beyond this point. - */ - -#undef CARES_PULL_WS2TCPIP_H -#undef CARES_PULL_SYS_TYPES_H -#undef CARES_PULL_SYS_SOCKET_H - -#undef CARES_TYPEOF_ARES_SOCKLEN_T - -#endif /* __CARES_RULES_H */ diff --git a/client/3rd/ShadowSocks/ShadowSocks/libcares/include/ares_version.h b/client/3rd/ShadowSocks/ShadowSocks/libcares/include/ares_version.h deleted file mode 100644 index 22c6f62f..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libcares/include/ares_version.h +++ /dev/null @@ -1,24 +0,0 @@ - -#ifndef ARES__VERSION_H -#define ARES__VERSION_H - -/* This is the global package copyright */ -#define ARES_COPYRIGHT "2004 - 2021 Daniel Stenberg, ." - -#define ARES_VERSION_MAJOR 1 -#define ARES_VERSION_MINOR 18 -#define ARES_VERSION_PATCH 1 -#define ARES_VERSION ((ARES_VERSION_MAJOR<<16)|\ - (ARES_VERSION_MINOR<<8)|\ - (ARES_VERSION_PATCH)) -#define ARES_VERSION_STR "1.18.1" - -#if (ARES_VERSION >= 0x010700) -# define CARES_HAVE_ARES_LIBRARY_INIT 1 -# define CARES_HAVE_ARES_LIBRARY_CLEANUP 1 -#else -# undef CARES_HAVE_ARES_LIBRARY_INIT -# undef CARES_HAVE_ARES_LIBRARY_CLEANUP -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libcares/lib/arm64/libcares.a b/client/3rd/ShadowSocks/ShadowSocks/libcares/lib/arm64/libcares.a deleted file mode 100644 index f0deed82ac0f6552190f436439b08aa689e945d3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 124704 zcmeFadwAT{b??1rMwgLnz!&*~aH6p>K?X!@Bijk|+gXxRt zuQ9RnjG1fU(y%du-Nt;@!o}DhEivY+7Qe^BpG1ur`B}((0yzBNLZ-XWn4KLVlaT*; z#yn*4IU!@Ftv6;Juy+f7Ec^@W{wr{Ek1_es6`Tvb-h(021^Rf*nD_IHX^Do+dHFuP zjWox9V$8)BueR_S?57P9)~4^TEPTnrXKZ|b2;JT*jQNr1-)PKtfYD{f+-T|i)cX6Z z&DZzk9yjINC% zX_qlyQ~p9B^DcCr`?4{Aqi|n0<`uc`F{X_4t6bh!`YsHaq5>bjZSxg|{^NgU%xvJu zUl?;LB z(x>!pBwZa-L*`D>HF{~t^Z-*=giIfB+LDm@U%%R!mN$mXItx32y)7X#22}ehB;A4^2dbUCVbk-3P5*lA)gHG34}3pl z{=wS6X5sr5&LzbxYUQbc&qs&gRAqE|t!1`_|5`Y&-c&w6|_a$K7@7 zmaSj2A(|SuG&Q@-ZR~7rPHbrGYP61<8{5fE&?d2=d3#sq)?JD1&7HS4cWzH??`rIF zgsqzm?0jzR=xW`%C7s9SogIx7$Ck#;&54a$I};Rk2hNU0BItf=V|y#fY2IK-2HY}j zNK@;UuUfl}8(d^weliQxv&!(Ekd-U5M3WNc!e=_E`kYHJjEy#3KZ&Nst}HqeOQey>*mJREff9~T77H6MjgRoH1^i6-0f>ehxH>bfzL!{8{6J^Yjd_0 zJ?cFO~Hen+Kd+uPSSrjsfP&SmSCjjdnZ(b;?&KO1*!X$tlQ zKX_+Xduy6ms9o7;+gsOnHg@hxG_^N3Zb|3d*#=4=XqDL9yg4hpe74e&ZcBF~zZqC> za0hjAi}{7G1SMMN6q9WOO$NVkfi3{tC7lD+x);8Ab4S-MN1(HL^HwTlW9Qb*LC>4p zw(V%{biSHMOILFuV6`)`y|ruWcH8TGY{vxFj$5lA1#Y)xV>{ArJ2Kon%<{aQ2@iAq zS{&H2HkU?^Y=QBa;GhmZw+8%6Wj#-`}yiYd}#%KDC@WzgIS2)(Lu`!o* zQ%>8>J9ALj(%8`@uA5DH%k~_WxxH@Rnkx<4J8#WFp=)Q?>1<*5t|R*y+|k*Z;h*L| zF;KeJ)U2Vmqkwv|VFyhNrI9&CMIO?no!2b8AzxYjKGV zA4_aZcZIJuZ)xsSGu_hswM474&Y&p%pTY8I#aq7G&d?g9haAc1T#AD_~n(m}cdS1k2Dc8JcNmZ5go-Bq%HF;uHdt*hGcx8v@E4LDbXa3=X zfBo%LV-Q~bKZs@qQ4|4>ALc@SBi>i;KcmQ=GW$FV$jcT-w3Rq)B3!yZ8fw|J+qxhG-JZnA~MV2lGYA(lzxSm`|MAb|^`E>wzyIVlp`Ldm=FqT7t=%!h9R77Ad}smicqDYF zl;Xc75+AGOXYx{OO=#82$*>vgon{W3*Ujfh#AAI0@iB_Ok~AM7%_Zd_bGW1^J}?)0 zMZi^|lD4^X4wOcx$H%(I$B$4}B_+7Yy)PUeW4e0yLix>)kF5%scd84&RT@3d_e-8j zYgND-F4Q*3I zyx^XnknguB6d(Ix$Q`NJRc!XJ0j-r9Q^hb#|O$N<2_+hue21+N)7z#>+wHX z^n1nMRyh{^%Q)8AzX$MjArr)s2fwYuI=3X{LSsT(oQ!Ysox5DnGeGG?EYfs+(Dcabzw6$w! zb8BdOtNTxE{oB65NP;#r;WtM3cgM%)tlDX|B}wC|sM&T5ID-8k_4a4{WcM(3cT--n zAC5#1iH^d&G3Q|EL1W(e6;N&q#>Xocg^G*c_-)~eCyf~>GL!-J6*Z5~xGWSONQ9zo zwg02LbP;*Jm-<&5lUq?9^+owkfyRB*!xgmMgP~AcGPLHlO%YRn1!3FnjQ@$^WXfIN zHof@U2cb3fsryUYr<;NAnH28D-@XF6sXc=$Q!U?Hsk(2QI%RL#U%u~8e%fen_vgn4 z+FLF^`aJ{fd^7!fq<0bhWYLN7BT>@vx0DNI>X}{=S|)ClWn?ci*XNTK^X>F^A2!ra z#Rd!GK!~)j^kG9e5YAMQB0PMxqTa%5fz*42IJoRzhnDavApEDDiWh8%0rBFoB*AF7 zvMMj~MBZTDGhSLz&lpraX|q!}aXLO)3too1%LnQ(4|f5Qd<23ktr>V*7Or#!{jbi# zE=Kael;Xd=oJ2Fos)Dz6p$OUF>JYvRb^B6~WnQe=pQ$ByF zv|sr!eVx%zQE}e4;Al8vaB{mEjb)g1nQL44rnl-o0<@!OtaY@k~A z%{Qj!)r(Efpz?~}*Z6)t;^W66C5OV$m%U`K-iTTD^V>e!Nk6Qgg*~z{`7!&0=}bz7 zpv-m?=ey)t<+=@A|C@Mc+Ke zcsm@Kb?D^n*HU)ZP^N48DNFK`cv)etzIusSvUJ6ji}|+%3umU07}{=D@1xCQFS8Cv zKbqvO@riI18kfj-dzB9x76VCJ#XKNgrXml>5=_M?boi`0?!%hrfXMUh&-$lOQ~kQU$o|lQ&_kiT$Rpvt@T1|v@I8_4NM7XG$a9gGB8B1Okx{Utc^W1OFY_M1 z;5aGaTH~bSYyWETcI;&SggvXliLoY;0@|>d(`Wo?3V7biQsyAV}@2I~qHkCLl22FZBj|hJ7z}^qUVq{#P$s z?hpU5T;qRG-Ll;c{gk*dxyJtvReVgYXP%ck*P6E%L{>l$t^O1Kr7WE5|0CwHf7$GOu{t!YhDyYA^R;13>k{e571X<`eva{8ju*{L{6Y zS>T$7IHS)1YA(yd9fJt=v|M&h(d^9tvW0$VqK~`E^<;JEGwI`&R##i^x%$1-+?lGl z-?hJ|ypfH@XA8sOAGW`LB|uO8Wm?o2uY%68zb7r77&K(wCPC_h9S93HsTtkzRQ-J? z{?`#sp4H!<14kY(=!wj8z|-~jskoo38IMGsf8*l(%_p`Npc5%XPK_d46(M64BcDz| zUJqx=rHaq^{?umb!jor5zH54-p|AhNNTC_) zyX~VhM&_6Sa>K~!&O#BgZB;?~o`Gn*5f%I1)Q+=Gg zkKp%UIQr(@@WAfyV72*3{2P5{bVbV)vo~53A26XAGiayC?A@OH-(6sykN z?C{IVZTKCyl@q?@d{en9Vya`uAZuoG?NSJsFOyzOvD}}vbUV1k1b`!1-9qD-3RO`FD$W+dwZNJYr6%A#UA53AH z;;be8@vL$nPnAkTZDG!Glm0Wi+$vrAD{T7N!`0Jr!Y>>2+b<{`N*8VEIHgnk7Gw(#zbQ{QtHVg(l=8F zV}jBnm!pS&<8tJMB40QC#>degg#0=E8zM4l-XAe-aPtB^~jo zIs6d3W7wO=`nq|_d+ad0Yn1x$ras?OJD`0C=4zMlos4?zrH>8KMn=(bchjylw&xns>IcF8NO-S54iT2|q(otUP8)FY&M@gq!aLt5&FZVisr#W1#+MCK4qkcA zFautBscg}6L<788{95@}+t>k}r>RGMU&Zf__*Qs+X`^u#d1jK_v<`dZ*^0$L=(k_t z!-j=G&5!2-X`2;VpVIvK6(B?^q_+}W2W0+RF$5y_M}Q2K?Y%y1*a>7PuJ{U&@~xO_ z;UG+p&x(B(UTdKSZP`CdfeCh7SZm=_3pJ0&YkQv$8@>W0sqO20*boOQKP!FMu-M{P zSX^?R++kdT4U!*)ANOIyD;9sr;)g9R`BMH>xbnZx;$1-HvmB^&Ec9Vo?#zoUEWaWz zvM(e}KwjkW(BaV0P&E8f=oPTzq0!I@;QsJ|@I&Fe$fM!M!-s)Sga^aV0AC6JEIb^J zhWjFqMxx=~qDPAGGxhPQho_n$;t9&JKM+nCB}s$~*~^e)@3wYwliA2mew?Z2BZz+| z3-8RrznO(!n}r|A!WU=Z3$pN%EW9QQcQSQAvh}Spw|r!7F=1Zsuf7L$^QWEoClZ?* zx3_ifnAlzy*l(A(ws~XYj`ps#IM-=kpxfNztM$)f;y*FdKiBp5rHd!_B~M;|&#|x2 z&h~#-xxbIjCgbFOhksbPzdJyW=4z_oBa*l2^eF*n&ZL)jbYeEZT2r?GYX7C=yY;F{O+91_|xI%Pi)Oc{wzQaEkquTB9|5+ z^CS1)9qt()kMxi44)?EGY_{Ei-d*EdG#cL(t(kUnv}o{_vV6u#PY0cc4myHW7$KhVi$nddy@qc56lpip{d7l3 zcj+S2lZecFv-^Yb`l9LaU5jdNdU4Ttga5QHQna@W`=PP%`r=T0*Y%Xy^~5)Y_0`*f z(fo;WTs7Ui6E9kQo8gxt@2ge||B8plDEGuHvrTSK6`1H5kK{y_&=bneg-$<@{IUMuJ!Z|>?P0WEC8?} zZt;~CuLSbHVjh1aujBzG2T5}89zn$D&c8o@Uw&TXt^Bw1 zj{~157%X_E0KDMsg5v}T<2fi#oFKg93CCye0Y9ByY=s{me|^KA3&o!{2ea^bS@`F( z@PEm|f0l)}W#P(qFg_eR+u- zgR@IrU<-WC?elJJ!EG7$QfUMGLWj4O;k?-;h@g7$ob`$;+=4_w znn%bu`NH8JR=%hT(4+a95!&`bMR1Ptg`*QwSj-S~=;9_y=d^1a|Pa9+te~(`LBW9V# z$g|O@{aQLT{O-0owU)EcskK<0+HQ1eV~U5l_Q-F>&swMEbYd?sUMOtzgK_5nXRq6G zI=LTcEK>N<@yarEY6hKJ@B8D2&qlYUaJBD^SH3G9L6+WO(9K;;z&wW;>COM%G zy~PM)@vo65lGvxvx1LSBEz*NQ3qA1*=$xv3dD7Rf3`fksRfXm-dL!wO*B)n#mj4fc z<>*-ibETCgpRFfZR!dnNN5+w!g?>>|t2!dRvdckZSq>VN-8R4Uu@Z$#P{xuQ++Iz_ z_iYbpUtn1rxd(k2^q>5%=+Dugja(DznfZImMvt)9v70>n8abtJYi_9`;BFSGgjFzN3?*n6_LljjQK18%Pe^5HVk z&_0tmX&6F&6AfQx%T2>`3($xaBX^RYmS2ol&I)_=d)aaF;$+Z4^kQT5&lLK1c*y=3 zI&IaV_l;b)y}-QlFgnJIXqzq!e!MV2e=~8HY*n_>Y&$+BJ{D(fFdEj5)+*5YH%RzXH>i25G_C;

8_mC=JP>2Y`_F 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 QjlLf2sH%zE+xm_F0)e28-v9sr diff --git a/client/3rd/ShadowSocks/ShadowSocks/libcares/lib/armv7/libcares.a b/client/3rd/ShadowSocks/ShadowSocks/libcares/lib/armv7/libcares.a deleted file mode 100644 index 34185f5d0d62f0770e28e1e8843a3d169dc7cd3f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 94384 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 diff --git a/client/3rd/ShadowSocks/ShadowSocks/libcares/lib/armv7s/libcares.a b/client/3rd/ShadowSocks/ShadowSocks/libcares/lib/armv7s/libcares.a deleted file mode 100644 index 98fadd9d7231027fffca88d3382a60eb29892088..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 94456 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 kzc_yV{{fUOfB*mh diff --git a/client/3rd/ShadowSocks/ShadowSocks/libev/arm64/include/ev++.h b/client/3rd/ShadowSocks/ShadowSocks/libev/arm64/include/ev++.h deleted file mode 100644 index 22dfcf58..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libev/arm64/include/ev++.h +++ /dev/null @@ -1,818 +0,0 @@ -/* - * libev simple C++ wrapper classes - * - * Copyright (c) 2007,2008,2010,2018,2020 Marc Alexander Lehmann - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modifica- - * tion, 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. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MER- - * CHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO - * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPE- - * CIAL, 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 OTH- - * ERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - * OF THE POSSIBILITY OF SUCH DAMAGE. - * - * Alternatively, the contents of this file may be used under the terms of - * the GNU General Public License ("GPL") version 2 or any later version, - * in which case the provisions of the GPL are applicable instead of - * the above. If you wish to allow the use of your version of this file - * only under the terms of the GPL and not to allow others to use your - * version of this file under the BSD license, indicate your decision - * by deleting the provisions above and replace them with the notice - * and other provisions required by the GPL. If you do not delete the - * provisions above, a recipient may use your version of this file under - * either the BSD or the GPL. - */ - -#ifndef EVPP_H__ -#define EVPP_H__ - -#ifdef EV_H -# include EV_H -#else -# include "ev.h" -#endif - -#ifndef EV_USE_STDEXCEPT -# define EV_USE_STDEXCEPT 1 -#endif - -#if EV_USE_STDEXCEPT -# include -#endif - -namespace ev { - - typedef ev_tstamp tstamp; - - enum { - UNDEF = EV_UNDEF, - NONE = EV_NONE, - READ = EV_READ, - WRITE = EV_WRITE, -#if EV_COMPAT3 - TIMEOUT = EV_TIMEOUT, -#endif - TIMER = EV_TIMER, - PERIODIC = EV_PERIODIC, - SIGNAL = EV_SIGNAL, - CHILD = EV_CHILD, - STAT = EV_STAT, - IDLE = EV_IDLE, - CHECK = EV_CHECK, - PREPARE = EV_PREPARE, - FORK = EV_FORK, - ASYNC = EV_ASYNC, - EMBED = EV_EMBED, -# undef ERROR // some systems stupidly #define ERROR - ERROR = EV_ERROR - }; - - enum - { - AUTO = EVFLAG_AUTO, - NOENV = EVFLAG_NOENV, - FORKCHECK = EVFLAG_FORKCHECK, - - SELECT = EVBACKEND_SELECT, - POLL = EVBACKEND_POLL, - EPOLL = EVBACKEND_EPOLL, - KQUEUE = EVBACKEND_KQUEUE, - DEVPOLL = EVBACKEND_DEVPOLL, - PORT = EVBACKEND_PORT - }; - - enum - { -#if EV_COMPAT3 - NONBLOCK = EVLOOP_NONBLOCK, - ONESHOT = EVLOOP_ONESHOT, -#endif - NOWAIT = EVRUN_NOWAIT, - ONCE = EVRUN_ONCE - }; - - enum how_t - { - ONE = EVBREAK_ONE, - ALL = EVBREAK_ALL - }; - - struct bad_loop -#if EV_USE_STDEXCEPT - : std::exception -#endif - { -#if EV_USE_STDEXCEPT - const char *what () const EV_NOEXCEPT - { - return "libev event loop cannot be initialized, bad value of LIBEV_FLAGS?"; - } -#endif - }; - -#ifdef EV_AX -# undef EV_AX -#endif - -#ifdef EV_AX_ -# undef EV_AX_ -#endif - -#if EV_MULTIPLICITY -# define EV_AX raw_loop -# define EV_AX_ raw_loop, -#else -# define EV_AX -# define EV_AX_ -#endif - - struct loop_ref - { - loop_ref (EV_P) EV_NOEXCEPT -#if EV_MULTIPLICITY - : EV_AX (EV_A) -#endif - { - } - - bool operator == (const loop_ref &other) const EV_NOEXCEPT - { -#if EV_MULTIPLICITY - return EV_AX == other.EV_AX; -#else - return true; -#endif - } - - bool operator != (const loop_ref &other) const EV_NOEXCEPT - { -#if EV_MULTIPLICITY - return ! (*this == other); -#else - return false; -#endif - } - -#if EV_MULTIPLICITY - bool operator == (const EV_P) const EV_NOEXCEPT - { - return this->EV_AX == EV_A; - } - - bool operator != (const EV_P) const EV_NOEXCEPT - { - return ! (*this == EV_A); - } - - operator struct ev_loop * () const EV_NOEXCEPT - { - return EV_AX; - } - - operator const struct ev_loop * () const EV_NOEXCEPT - { - return EV_AX; - } - - bool is_default () const EV_NOEXCEPT - { - return EV_AX == ev_default_loop (0); - } -#endif - -#if EV_COMPAT3 - void loop (int flags = 0) - { - ev_run (EV_AX_ flags); - } - - void unloop (how_t how = ONE) EV_NOEXCEPT - { - ev_break (EV_AX_ how); - } -#endif - - void run (int flags = 0) - { - ev_run (EV_AX_ flags); - } - - void break_loop (how_t how = ONE) EV_NOEXCEPT - { - ev_break (EV_AX_ how); - } - - void post_fork () EV_NOEXCEPT - { - ev_loop_fork (EV_AX); - } - - unsigned int backend () const EV_NOEXCEPT - { - return ev_backend (EV_AX); - } - - tstamp now () const EV_NOEXCEPT - { - return ev_now (EV_AX); - } - - void ref () EV_NOEXCEPT - { - ev_ref (EV_AX); - } - - void unref () EV_NOEXCEPT - { - ev_unref (EV_AX); - } - -#if EV_FEATURE_API - unsigned int iteration () const EV_NOEXCEPT - { - return ev_iteration (EV_AX); - } - - unsigned int depth () const EV_NOEXCEPT - { - return ev_depth (EV_AX); - } - - void set_io_collect_interval (tstamp interval) EV_NOEXCEPT - { - ev_set_io_collect_interval (EV_AX_ interval); - } - - void set_timeout_collect_interval (tstamp interval) EV_NOEXCEPT - { - ev_set_timeout_collect_interval (EV_AX_ interval); - } -#endif - - // function callback - void once (int fd, int events, tstamp timeout, void (*cb)(int, void *), void *arg = 0) EV_NOEXCEPT - { - ev_once (EV_AX_ fd, events, timeout, cb, arg); - } - - // method callback - template - void once (int fd, int events, tstamp timeout, K *object) EV_NOEXCEPT - { - once (fd, events, timeout, method_thunk, object); - } - - // default method == operator () - template - void once (int fd, int events, tstamp timeout, K *object) EV_NOEXCEPT - { - once (fd, events, timeout, method_thunk, object); - } - - template - static void method_thunk (int revents, void *arg) - { - (static_cast(arg)->*method) - (revents); - } - - // no-argument method callback - template - void once (int fd, int events, tstamp timeout, K *object) EV_NOEXCEPT - { - once (fd, events, timeout, method_noargs_thunk, object); - } - - template - static void method_noargs_thunk (int revents, void *arg) - { - (static_cast(arg)->*method) - (); - } - - // simpler function callback - template - void once (int fd, int events, tstamp timeout) EV_NOEXCEPT - { - once (fd, events, timeout, simpler_func_thunk); - } - - template - static void simpler_func_thunk (int revents, void *arg) - { - (*cb) - (revents); - } - - // simplest function callback - template - void once (int fd, int events, tstamp timeout) EV_NOEXCEPT - { - once (fd, events, timeout, simplest_func_thunk); - } - - template - static void simplest_func_thunk (int revents, void *arg) - { - (*cb) - (); - } - - void feed_fd_event (int fd, int revents) EV_NOEXCEPT - { - ev_feed_fd_event (EV_AX_ fd, revents); - } - - void feed_signal_event (int signum) EV_NOEXCEPT - { - ev_feed_signal_event (EV_AX_ signum); - } - -#if EV_MULTIPLICITY - struct ev_loop* EV_AX; -#endif - - }; - -#if EV_MULTIPLICITY - struct dynamic_loop : loop_ref - { - - dynamic_loop (unsigned int flags = AUTO) - : loop_ref (ev_loop_new (flags)) - { - if (!EV_AX) - throw bad_loop (); - } - - ~dynamic_loop () EV_NOEXCEPT - { - ev_loop_destroy (EV_AX); - EV_AX = 0; - } - - private: - - dynamic_loop (const dynamic_loop &); - - dynamic_loop & operator= (const dynamic_loop &); - - }; -#endif - - struct default_loop : loop_ref - { - default_loop (unsigned int flags = AUTO) -#if EV_MULTIPLICITY - : loop_ref (ev_default_loop (flags)) -#endif - { - if ( -#if EV_MULTIPLICITY - !EV_AX -#else - !ev_default_loop (flags) -#endif - ) - throw bad_loop (); - } - - private: - default_loop (const default_loop &); - default_loop &operator = (const default_loop &); - }; - - inline loop_ref get_default_loop () EV_NOEXCEPT - { -#if EV_MULTIPLICITY - return ev_default_loop (0); -#else - return loop_ref (); -#endif - } - -#undef EV_AX -#undef EV_AX_ - -#undef EV_PX -#undef EV_PX_ -#if EV_MULTIPLICITY -# define EV_PX loop_ref EV_A -# define EV_PX_ loop_ref EV_A_ -#else -# define EV_PX -# define EV_PX_ -#endif - - template - struct base : ev_watcher - { - // scoped pause/unpause of a watcher - struct freeze_guard - { - watcher &w; - bool active; - - freeze_guard (watcher *self) EV_NOEXCEPT - : w (*self), active (w.is_active ()) - { - if (active) w.stop (); - } - - ~freeze_guard () - { - if (active) w.start (); - } - }; - - #if EV_MULTIPLICITY - EV_PX; - - // loop set - void set (EV_P) EV_NOEXCEPT - { - this->EV_A = EV_A; - } - #endif - - base (EV_PX) EV_NOEXCEPT - #if EV_MULTIPLICITY - : EV_A (EV_A) - #endif - { - ev_init (this, 0); - } - - void set_ (const void *data, void (*cb)(EV_P_ ev_watcher *w, int revents)) EV_NOEXCEPT - { - this->data = (void *)data; - ev_set_cb (static_cast(this), cb); - } - - // function callback - template - void set (void *data = 0) EV_NOEXCEPT - { - set_ (data, function_thunk); - } - - template - static void function_thunk (EV_P_ ev_watcher *w, int revents) - { - function - (*static_cast(w), revents); - } - - // method callback - template - void set (K *object) EV_NOEXCEPT - { - set_ (object, method_thunk); - } - - // default method == operator () - template - void set (K *object) EV_NOEXCEPT - { - set_ (object, method_thunk); - } - - template - static void method_thunk (EV_P_ ev_watcher *w, int revents) - { - (static_cast(w->data)->*method) - (*static_cast(w), revents); - } - - // no-argument callback - template - void set (K *object) EV_NOEXCEPT - { - set_ (object, method_noargs_thunk); - } - - template - static void method_noargs_thunk (EV_P_ ev_watcher *w, int revents) - { - (static_cast(w->data)->*method) - (); - } - - void operator ()(int events = EV_UNDEF) - { - return - ev_cb (static_cast(this)) - (static_cast(this), events); - } - - bool is_active () const EV_NOEXCEPT - { - return ev_is_active (static_cast(this)); - } - - bool is_pending () const EV_NOEXCEPT - { - return ev_is_pending (static_cast(this)); - } - - void feed_event (int revents) EV_NOEXCEPT - { - ev_feed_event (EV_A_ static_cast(this), revents); - } - }; - - inline tstamp now (EV_P) EV_NOEXCEPT - { - return ev_now (EV_A); - } - - inline void delay (tstamp interval) EV_NOEXCEPT - { - ev_sleep (interval); - } - - inline int version_major () EV_NOEXCEPT - { - return ev_version_major (); - } - - inline int version_minor () EV_NOEXCEPT - { - return ev_version_minor (); - } - - inline unsigned int supported_backends () EV_NOEXCEPT - { - return ev_supported_backends (); - } - - inline unsigned int recommended_backends () EV_NOEXCEPT - { - return ev_recommended_backends (); - } - - inline unsigned int embeddable_backends () EV_NOEXCEPT - { - return ev_embeddable_backends (); - } - - inline void set_allocator (void *(*cb)(void *ptr, long size) EV_NOEXCEPT) EV_NOEXCEPT - { - ev_set_allocator (cb); - } - - inline void set_syserr_cb (void (*cb)(const char *msg) EV_NOEXCEPT) EV_NOEXCEPT - { - ev_set_syserr_cb (cb); - } - - #if EV_MULTIPLICITY - #define EV_CONSTRUCT(cppstem,cstem) \ - (EV_PX = get_default_loop ()) EV_NOEXCEPT \ - : base (EV_A) \ - { \ - } - #else - #define EV_CONSTRUCT(cppstem,cstem) \ - () EV_NOEXCEPT \ - { \ - } - #endif - - /* using a template here would require quite a few more lines, - * so a macro solution was chosen */ - #define EV_BEGIN_WATCHER(cppstem,cstem) \ - \ - struct cppstem : base \ - { \ - void start () EV_NOEXCEPT \ - { \ - ev_ ## cstem ## _start (EV_A_ static_cast(this)); \ - } \ - \ - void stop () EV_NOEXCEPT \ - { \ - ev_ ## cstem ## _stop (EV_A_ static_cast(this)); \ - } \ - \ - cppstem EV_CONSTRUCT(cppstem,cstem) \ - \ - ~cppstem () EV_NOEXCEPT \ - { \ - stop (); \ - } \ - \ - using base::set; \ - \ - private: \ - \ - cppstem (const cppstem &o); \ - \ - cppstem &operator =(const cppstem &o); \ - \ - public: - - #define EV_END_WATCHER(cppstem,cstem) \ - }; - - EV_BEGIN_WATCHER (io, io) - void set (int fd, int events) EV_NOEXCEPT - { - freeze_guard freeze (this); - ev_io_set (static_cast(this), fd, events); - } - - void set (int events) EV_NOEXCEPT - { - freeze_guard freeze (this); - ev_io_modify (static_cast(this), events); - } - - void start (int fd, int events) EV_NOEXCEPT - { - set (fd, events); - start (); - } - EV_END_WATCHER (io, io) - - EV_BEGIN_WATCHER (timer, timer) - void set (ev_tstamp after, ev_tstamp repeat = 0.) EV_NOEXCEPT - { - freeze_guard freeze (this); - ev_timer_set (static_cast(this), after, repeat); - } - - void start (ev_tstamp after, ev_tstamp repeat = 0.) EV_NOEXCEPT - { - set (after, repeat); - start (); - } - - void again () EV_NOEXCEPT - { - ev_timer_again (EV_A_ static_cast(this)); - } - - ev_tstamp remaining () - { - return ev_timer_remaining (EV_A_ static_cast(this)); - } - EV_END_WATCHER (timer, timer) - - #if EV_PERIODIC_ENABLE - EV_BEGIN_WATCHER (periodic, periodic) - void set (ev_tstamp at, ev_tstamp interval = 0.) EV_NOEXCEPT - { - freeze_guard freeze (this); - ev_periodic_set (static_cast(this), at, interval, 0); - } - - void start (ev_tstamp at, ev_tstamp interval = 0.) EV_NOEXCEPT - { - set (at, interval); - start (); - } - - void again () EV_NOEXCEPT - { - ev_periodic_again (EV_A_ static_cast(this)); - } - EV_END_WATCHER (periodic, periodic) - #endif - - #if EV_SIGNAL_ENABLE - EV_BEGIN_WATCHER (sig, signal) - void set (int signum) EV_NOEXCEPT - { - freeze_guard freeze (this); - ev_signal_set (static_cast(this), signum); - } - - void start (int signum) EV_NOEXCEPT - { - set (signum); - start (); - } - EV_END_WATCHER (sig, signal) - #endif - - #if EV_CHILD_ENABLE - EV_BEGIN_WATCHER (child, child) - void set (int pid, int trace = 0) EV_NOEXCEPT - { - freeze_guard freeze (this); - ev_child_set (static_cast(this), pid, trace); - } - - void start (int pid, int trace = 0) EV_NOEXCEPT - { - set (pid, trace); - start (); - } - EV_END_WATCHER (child, child) - #endif - - #if EV_STAT_ENABLE - EV_BEGIN_WATCHER (stat, stat) - void set (const char *path, ev_tstamp interval = 0.) EV_NOEXCEPT - { - freeze_guard freeze (this); - ev_stat_set (static_cast(this), path, interval); - } - - void start (const char *path, ev_tstamp interval = 0.) EV_NOEXCEPT - { - stop (); - set (path, interval); - start (); - } - - void update () EV_NOEXCEPT - { - ev_stat_stat (EV_A_ static_cast(this)); - } - EV_END_WATCHER (stat, stat) - #endif - - #if EV_IDLE_ENABLE - EV_BEGIN_WATCHER (idle, idle) - void set () EV_NOEXCEPT { } - EV_END_WATCHER (idle, idle) - #endif - - #if EV_PREPARE_ENABLE - EV_BEGIN_WATCHER (prepare, prepare) - void set () EV_NOEXCEPT { } - EV_END_WATCHER (prepare, prepare) - #endif - - #if EV_CHECK_ENABLE - EV_BEGIN_WATCHER (check, check) - void set () EV_NOEXCEPT { } - EV_END_WATCHER (check, check) - #endif - - #if EV_EMBED_ENABLE - EV_BEGIN_WATCHER (embed, embed) - void set_embed (struct ev_loop *embedded_loop) EV_NOEXCEPT - { - freeze_guard freeze (this); - ev_embed_set (static_cast(this), embedded_loop); - } - - void start (struct ev_loop *embedded_loop) EV_NOEXCEPT - { - set (embedded_loop); - start (); - } - - void sweep () - { - ev_embed_sweep (EV_A_ static_cast(this)); - } - EV_END_WATCHER (embed, embed) - #endif - - #if EV_FORK_ENABLE - EV_BEGIN_WATCHER (fork, fork) - void set () EV_NOEXCEPT { } - EV_END_WATCHER (fork, fork) - #endif - - #if EV_ASYNC_ENABLE - EV_BEGIN_WATCHER (async, async) - void send () EV_NOEXCEPT - { - ev_async_send (EV_A_ static_cast(this)); - } - - bool async_pending () EV_NOEXCEPT - { - return ev_async_pending (static_cast(this)); - } - EV_END_WATCHER (async, async) - #endif - - #undef EV_PX - #undef EV_PX_ - #undef EV_CONSTRUCT - #undef EV_BEGIN_WATCHER - #undef EV_END_WATCHER -} - -#endif - diff --git a/client/3rd/ShadowSocks/ShadowSocks/libev/arm64/include/ev.h b/client/3rd/ShadowSocks/ShadowSocks/libev/arm64/include/ev.h deleted file mode 100644 index 4669c39b..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libev/arm64/include/ev.h +++ /dev/null @@ -1,860 +0,0 @@ -/* - * libev native API header - * - * Copyright (c) 2007-2020 Marc Alexander Lehmann - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modifica- - * tion, 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. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MER- - * CHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO - * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPE- - * CIAL, 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 OTH- - * ERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - * OF THE POSSIBILITY OF SUCH DAMAGE. - * - * Alternatively, the contents of this file may be used under the terms of - * the GNU General Public License ("GPL") version 2 or any later version, - * in which case the provisions of the GPL are applicable instead of - * the above. If you wish to allow the use of your version of this file - * only under the terms of the GPL and not to allow others to use your - * version of this file under the BSD license, indicate your decision - * by deleting the provisions above and replace them with the notice - * and other provisions required by the GPL. If you do not delete the - * provisions above, a recipient may use your version of this file under - * either the BSD or the GPL. - */ - -#ifndef EV_H_ -#define EV_H_ - -#ifdef __cplusplus -# define EV_CPP(x) x -# if __cplusplus >= 201103L -# define EV_NOEXCEPT noexcept -# else -# define EV_NOEXCEPT -# endif -#else -# define EV_CPP(x) -# define EV_NOEXCEPT -#endif -#define EV_THROW EV_NOEXCEPT /* pre-4.25, do not use in new code */ - -EV_CPP(extern "C" {) - -/*****************************************************************************/ - -/* pre-4.0 compatibility */ -#ifndef EV_COMPAT3 -# define EV_COMPAT3 1 -#endif - -#ifndef EV_FEATURES -# if defined __OPTIMIZE_SIZE__ -# define EV_FEATURES 0x7c -# else -# define EV_FEATURES 0x7f -# endif -#endif - -#define EV_FEATURE_CODE ((EV_FEATURES) & 1) -#define EV_FEATURE_DATA ((EV_FEATURES) & 2) -#define EV_FEATURE_CONFIG ((EV_FEATURES) & 4) -#define EV_FEATURE_API ((EV_FEATURES) & 8) -#define EV_FEATURE_WATCHERS ((EV_FEATURES) & 16) -#define EV_FEATURE_BACKENDS ((EV_FEATURES) & 32) -#define EV_FEATURE_OS ((EV_FEATURES) & 64) - -/* these priorities are inclusive, higher priorities will be invoked earlier */ -#ifndef EV_MINPRI -# define EV_MINPRI (EV_FEATURE_CONFIG ? -2 : 0) -#endif -#ifndef EV_MAXPRI -# define EV_MAXPRI (EV_FEATURE_CONFIG ? +2 : 0) -#endif - -#ifndef EV_MULTIPLICITY -# define EV_MULTIPLICITY EV_FEATURE_CONFIG -#endif - -#ifndef EV_PERIODIC_ENABLE -# define EV_PERIODIC_ENABLE EV_FEATURE_WATCHERS -#endif - -#ifndef EV_STAT_ENABLE -# define EV_STAT_ENABLE EV_FEATURE_WATCHERS -#endif - -#ifndef EV_PREPARE_ENABLE -# define EV_PREPARE_ENABLE EV_FEATURE_WATCHERS -#endif - -#ifndef EV_CHECK_ENABLE -# define EV_CHECK_ENABLE EV_FEATURE_WATCHERS -#endif - -#ifndef EV_IDLE_ENABLE -# define EV_IDLE_ENABLE EV_FEATURE_WATCHERS -#endif - -#ifndef EV_FORK_ENABLE -# define EV_FORK_ENABLE EV_FEATURE_WATCHERS -#endif - -#ifndef EV_CLEANUP_ENABLE -# define EV_CLEANUP_ENABLE EV_FEATURE_WATCHERS -#endif - -#ifndef EV_SIGNAL_ENABLE -# define EV_SIGNAL_ENABLE EV_FEATURE_WATCHERS -#endif - -#ifndef EV_CHILD_ENABLE -# ifdef _WIN32 -# define EV_CHILD_ENABLE 0 -# else -# define EV_CHILD_ENABLE EV_FEATURE_WATCHERS -#endif -#endif - -#ifndef EV_ASYNC_ENABLE -# define EV_ASYNC_ENABLE EV_FEATURE_WATCHERS -#endif - -#ifndef EV_EMBED_ENABLE -# define EV_EMBED_ENABLE EV_FEATURE_WATCHERS -#endif - -#ifndef EV_WALK_ENABLE -# define EV_WALK_ENABLE 0 /* not yet */ -#endif - -/*****************************************************************************/ - -#if EV_CHILD_ENABLE && !EV_SIGNAL_ENABLE -# undef EV_SIGNAL_ENABLE -# define EV_SIGNAL_ENABLE 1 -#endif - -/*****************************************************************************/ - -#ifndef EV_TSTAMP_T -# define EV_TSTAMP_T double -#endif -typedef EV_TSTAMP_T ev_tstamp; - -#include /* for memmove */ - -#ifndef EV_ATOMIC_T -# include -# define EV_ATOMIC_T sig_atomic_t volatile -#endif - -#if EV_STAT_ENABLE -# ifdef _WIN32 -# include -# include -# endif -# include -#endif - -/* support multiple event loops? */ -#if EV_MULTIPLICITY -struct ev_loop; -# define EV_P struct ev_loop *loop /* a loop as sole parameter in a declaration */ -# define EV_P_ EV_P, /* a loop as first of multiple parameters */ -# define EV_A loop /* a loop as sole argument to a function call */ -# define EV_A_ EV_A, /* a loop as first of multiple arguments */ -# define EV_DEFAULT_UC ev_default_loop_uc_ () /* the default loop, if initialised, as sole arg */ -# define EV_DEFAULT_UC_ EV_DEFAULT_UC, /* the default loop as first of multiple arguments */ -# define EV_DEFAULT ev_default_loop (0) /* the default loop as sole arg */ -# define EV_DEFAULT_ EV_DEFAULT, /* the default loop as first of multiple arguments */ -#else -# define EV_P void -# define EV_P_ -# define EV_A -# define EV_A_ -# define EV_DEFAULT -# define EV_DEFAULT_ -# define EV_DEFAULT_UC -# define EV_DEFAULT_UC_ -# undef EV_EMBED_ENABLE -#endif - -/* EV_INLINE is used for functions in header files */ -#if __STDC_VERSION__ >= 199901L || __GNUC__ >= 3 -# define EV_INLINE static inline -#else -# define EV_INLINE static -#endif - -#ifdef EV_API_STATIC -# define EV_API_DECL static -#else -# define EV_API_DECL extern -#endif - -/* EV_PROTOTYPES can be used to switch of prototype declarations */ -#ifndef EV_PROTOTYPES -# define EV_PROTOTYPES 1 -#endif - -/*****************************************************************************/ - -#define EV_VERSION_MAJOR 4 -#define EV_VERSION_MINOR 33 - -/* eventmask, revents, events... */ -enum { - EV_UNDEF = (int)0xFFFFFFFF, /* guaranteed to be invalid */ - EV_NONE = 0x00, /* no events */ - EV_READ = 0x01, /* ev_io detected read will not block */ - EV_WRITE = 0x02, /* ev_io detected write will not block */ - EV__IOFDSET = 0x80, /* internal use only */ - EV_IO = EV_READ, /* alias for type-detection */ - EV_TIMER = 0x00000100, /* timer timed out */ -#if EV_COMPAT3 - EV_TIMEOUT = EV_TIMER, /* pre 4.0 API compatibility */ -#endif - EV_PERIODIC = 0x00000200, /* periodic timer timed out */ - EV_SIGNAL = 0x00000400, /* signal was received */ - EV_CHILD = 0x00000800, /* child/pid had status change */ - EV_STAT = 0x00001000, /* stat data changed */ - EV_IDLE = 0x00002000, /* event loop is idling */ - EV_PREPARE = 0x00004000, /* event loop about to poll */ - EV_CHECK = 0x00008000, /* event loop finished poll */ - EV_EMBED = 0x00010000, /* embedded event loop needs sweep */ - EV_FORK = 0x00020000, /* event loop resumed in child */ - EV_CLEANUP = 0x00040000, /* event loop resumed in child */ - EV_ASYNC = 0x00080000, /* async intra-loop signal */ - EV_CUSTOM = 0x01000000, /* for use by user code */ - EV_ERROR = (int)0x80000000 /* sent when an error occurs */ -}; - -/* can be used to add custom fields to all watchers, while losing binary compatibility */ -#ifndef EV_COMMON -# define EV_COMMON void *data; -#endif - -#ifndef EV_CB_DECLARE -# define EV_CB_DECLARE(type) void (*cb)(EV_P_ struct type *w, int revents); -#endif -#ifndef EV_CB_INVOKE -# define EV_CB_INVOKE(watcher,revents) (watcher)->cb (EV_A_ (watcher), (revents)) -#endif - -/* not official, do not use */ -#define EV_CB(type,name) void name (EV_P_ struct ev_ ## type *w, int revents) - -/* - * struct member types: - * private: you may look at them, but not change them, - * and they might not mean anything to you. - * ro: can be read anytime, but only changed when the watcher isn't active. - * rw: can be read and modified anytime, even when the watcher is active. - * - * some internal details that might be helpful for debugging: - * - * active is either 0, which means the watcher is not active, - * or the array index of the watcher (periodics, timers) - * or the array index + 1 (most other watchers) - * or simply 1 for watchers that aren't in some array. - * pending is either 0, in which case the watcher isn't, - * or the array index + 1 in the pendings array. - */ - -#if EV_MINPRI == EV_MAXPRI -# define EV_DECL_PRIORITY -#elif !defined (EV_DECL_PRIORITY) -# define EV_DECL_PRIORITY int priority; -#endif - -/* shared by all watchers */ -#define EV_WATCHER(type) \ - int active; /* private */ \ - int pending; /* private */ \ - EV_DECL_PRIORITY /* private */ \ - EV_COMMON /* rw */ \ - EV_CB_DECLARE (type) /* private */ - -#define EV_WATCHER_LIST(type) \ - EV_WATCHER (type) \ - struct ev_watcher_list *next; /* private */ - -#define EV_WATCHER_TIME(type) \ - EV_WATCHER (type) \ - ev_tstamp at; /* private */ - -/* base class, nothing to see here unless you subclass */ -typedef struct ev_watcher -{ - EV_WATCHER (ev_watcher) -} ev_watcher; - -/* base class, nothing to see here unless you subclass */ -typedef struct ev_watcher_list -{ - EV_WATCHER_LIST (ev_watcher_list) -} ev_watcher_list; - -/* base class, nothing to see here unless you subclass */ -typedef struct ev_watcher_time -{ - EV_WATCHER_TIME (ev_watcher_time) -} ev_watcher_time; - -/* invoked when fd is either EV_READable or EV_WRITEable */ -/* revent EV_READ, EV_WRITE */ -typedef struct ev_io -{ - EV_WATCHER_LIST (ev_io) - - int fd; /* ro */ - int events; /* ro */ -} ev_io; - -/* invoked after a specific time, repeatable (based on monotonic clock) */ -/* revent EV_TIMEOUT */ -typedef struct ev_timer -{ - EV_WATCHER_TIME (ev_timer) - - ev_tstamp repeat; /* rw */ -} ev_timer; - -/* invoked at some specific time, possibly repeating at regular intervals (based on UTC) */ -/* revent EV_PERIODIC */ -typedef struct ev_periodic -{ - EV_WATCHER_TIME (ev_periodic) - - ev_tstamp offset; /* rw */ - ev_tstamp interval; /* rw */ - ev_tstamp (*reschedule_cb)(struct ev_periodic *w, ev_tstamp now) EV_NOEXCEPT; /* rw */ -} ev_periodic; - -/* invoked when the given signal has been received */ -/* revent EV_SIGNAL */ -typedef struct ev_signal -{ - EV_WATCHER_LIST (ev_signal) - - int signum; /* ro */ -} ev_signal; - -/* invoked when sigchld is received and waitpid indicates the given pid */ -/* revent EV_CHILD */ -/* does not support priorities */ -typedef struct ev_child -{ - EV_WATCHER_LIST (ev_child) - - int flags; /* private */ - int pid; /* ro */ - int rpid; /* rw, holds the received pid */ - int rstatus; /* rw, holds the exit status, use the macros from sys/wait.h */ -} ev_child; - -#if EV_STAT_ENABLE -/* st_nlink = 0 means missing file or other error */ -# ifdef _WIN32 -typedef struct _stati64 ev_statdata; -# else -typedef struct stat ev_statdata; -# endif - -/* invoked each time the stat data changes for a given path */ -/* revent EV_STAT */ -typedef struct ev_stat -{ - EV_WATCHER_LIST (ev_stat) - - ev_timer timer; /* private */ - ev_tstamp interval; /* ro */ - const char *path; /* ro */ - ev_statdata prev; /* ro */ - ev_statdata attr; /* ro */ - - int wd; /* wd for inotify, fd for kqueue */ -} ev_stat; -#endif - -/* invoked when the nothing else needs to be done, keeps the process from blocking */ -/* revent EV_IDLE */ -typedef struct ev_idle -{ - EV_WATCHER (ev_idle) -} ev_idle; - -/* invoked for each run of the mainloop, just before the blocking call */ -/* you can still change events in any way you like */ -/* revent EV_PREPARE */ -typedef struct ev_prepare -{ - EV_WATCHER (ev_prepare) -} ev_prepare; - -/* invoked for each run of the mainloop, just after the blocking call */ -/* revent EV_CHECK */ -typedef struct ev_check -{ - EV_WATCHER (ev_check) -} ev_check; - -/* the callback gets invoked before check in the child process when a fork was detected */ -/* revent EV_FORK */ -typedef struct ev_fork -{ - EV_WATCHER (ev_fork) -} ev_fork; - -/* is invoked just before the loop gets destroyed */ -/* revent EV_CLEANUP */ -typedef struct ev_cleanup -{ - EV_WATCHER (ev_cleanup) -} ev_cleanup; - -#if EV_EMBED_ENABLE -/* used to embed an event loop inside another */ -/* the callback gets invoked when the event loop has handled events, and can be 0 */ -typedef struct ev_embed -{ - EV_WATCHER (ev_embed) - - struct ev_loop *other; /* ro */ -#undef EV_IO_ENABLE -#define EV_IO_ENABLE 1 - ev_io io; /* private */ -#undef EV_PREPARE_ENABLE -#define EV_PREPARE_ENABLE 1 - ev_prepare prepare; /* private */ - ev_check check; /* unused */ - ev_timer timer; /* unused */ - ev_periodic periodic; /* unused */ - ev_idle idle; /* unused */ - ev_fork fork; /* private */ - ev_cleanup cleanup; /* unused */ -} ev_embed; -#endif - -#if EV_ASYNC_ENABLE -/* invoked when somebody calls ev_async_send on the watcher */ -/* revent EV_ASYNC */ -typedef struct ev_async -{ - EV_WATCHER (ev_async) - - EV_ATOMIC_T sent; /* private */ -} ev_async; - -# define ev_async_pending(w) (+(w)->sent) -#endif - -/* the presence of this union forces similar struct layout */ -union ev_any_watcher -{ - struct ev_watcher w; - struct ev_watcher_list wl; - - struct ev_io io; - struct ev_timer timer; - struct ev_periodic periodic; - struct ev_signal signal; - struct ev_child child; -#if EV_STAT_ENABLE - struct ev_stat stat; -#endif -#if EV_IDLE_ENABLE - struct ev_idle idle; -#endif - struct ev_prepare prepare; - struct ev_check check; -#if EV_FORK_ENABLE - struct ev_fork fork; -#endif -#if EV_CLEANUP_ENABLE - struct ev_cleanup cleanup; -#endif -#if EV_EMBED_ENABLE - struct ev_embed embed; -#endif -#if EV_ASYNC_ENABLE - struct ev_async async; -#endif -}; - -/* flag bits for ev_default_loop and ev_loop_new */ -enum { - /* the default */ - EVFLAG_AUTO = 0x00000000U, /* not quite a mask */ - /* flag bits */ - EVFLAG_NOENV = 0x01000000U, /* do NOT consult environment */ - EVFLAG_FORKCHECK = 0x02000000U, /* check for a fork in each iteration */ - /* debugging/feature disable */ - EVFLAG_NOINOTIFY = 0x00100000U, /* do not attempt to use inotify */ -#if EV_COMPAT3 - EVFLAG_NOSIGFD = 0, /* compatibility to pre-3.9 */ -#endif - EVFLAG_SIGNALFD = 0x00200000U, /* attempt to use signalfd */ - EVFLAG_NOSIGMASK = 0x00400000U, /* avoid modifying the signal mask */ - EVFLAG_NOTIMERFD = 0x00800000U /* avoid creating a timerfd */ -}; - -/* method bits to be ored together */ -enum { - EVBACKEND_SELECT = 0x00000001U, /* available just about anywhere */ - EVBACKEND_POLL = 0x00000002U, /* !win, !aix, broken on osx */ - EVBACKEND_EPOLL = 0x00000004U, /* linux */ - EVBACKEND_KQUEUE = 0x00000008U, /* bsd, broken on osx */ - EVBACKEND_DEVPOLL = 0x00000010U, /* solaris 8 */ /* NYI */ - EVBACKEND_PORT = 0x00000020U, /* solaris 10 */ - EVBACKEND_LINUXAIO = 0x00000040U, /* linux AIO, 4.19+ */ - EVBACKEND_IOURING = 0x00000080U, /* linux io_uring, 5.1+ */ - EVBACKEND_ALL = 0x000000FFU, /* all known backends */ - EVBACKEND_MASK = 0x0000FFFFU /* all future backends */ -}; - -#if EV_PROTOTYPES -EV_API_DECL int ev_version_major (void) EV_NOEXCEPT; -EV_API_DECL int ev_version_minor (void) EV_NOEXCEPT; - -EV_API_DECL unsigned int ev_supported_backends (void) EV_NOEXCEPT; -EV_API_DECL unsigned int ev_recommended_backends (void) EV_NOEXCEPT; -EV_API_DECL unsigned int ev_embeddable_backends (void) EV_NOEXCEPT; - -EV_API_DECL ev_tstamp ev_time (void) EV_NOEXCEPT; -EV_API_DECL void ev_sleep (ev_tstamp delay) EV_NOEXCEPT; /* sleep for a while */ - -/* Sets the allocation function to use, works like realloc. - * It is used to allocate and free memory. - * If it returns zero when memory needs to be allocated, the library might abort - * or take some potentially destructive action. - * The default is your system realloc function. - */ -EV_API_DECL void ev_set_allocator (void *(*cb)(void *ptr, long size) EV_NOEXCEPT) EV_NOEXCEPT; - -/* set the callback function to call on a - * retryable syscall error - * (such as failed select, poll, epoll_wait) - */ -EV_API_DECL void ev_set_syserr_cb (void (*cb)(const char *msg) EV_NOEXCEPT) EV_NOEXCEPT; - -#if EV_MULTIPLICITY - -/* the default loop is the only one that handles signals and child watchers */ -/* you can call this as often as you like */ -EV_API_DECL struct ev_loop *ev_default_loop (unsigned int flags EV_CPP (= 0)) EV_NOEXCEPT; - -#ifdef EV_API_STATIC -EV_API_DECL struct ev_loop *ev_default_loop_ptr; -#endif - -EV_INLINE struct ev_loop * -ev_default_loop_uc_ (void) EV_NOEXCEPT -{ - extern struct ev_loop *ev_default_loop_ptr; - - return ev_default_loop_ptr; -} - -EV_INLINE int -ev_is_default_loop (EV_P) EV_NOEXCEPT -{ - return EV_A == EV_DEFAULT_UC; -} - -/* create and destroy alternative loops that don't handle signals */ -EV_API_DECL struct ev_loop *ev_loop_new (unsigned int flags EV_CPP (= 0)) EV_NOEXCEPT; - -EV_API_DECL ev_tstamp ev_now (EV_P) EV_NOEXCEPT; /* time w.r.t. timers and the eventloop, updated after each poll */ - -#else - -EV_API_DECL int ev_default_loop (unsigned int flags EV_CPP (= 0)) EV_NOEXCEPT; /* returns true when successful */ - -EV_API_DECL ev_tstamp ev_rt_now; - -EV_INLINE ev_tstamp -ev_now (void) EV_NOEXCEPT -{ - return ev_rt_now; -} - -/* looks weird, but ev_is_default_loop (EV_A) still works if this exists */ -EV_INLINE int -ev_is_default_loop (void) EV_NOEXCEPT -{ - return 1; -} - -#endif /* multiplicity */ - -/* destroy event loops, also works for the default loop */ -EV_API_DECL void ev_loop_destroy (EV_P); - -/* this needs to be called after fork, to duplicate the loop */ -/* when you want to re-use it in the child */ -/* you can call it in either the parent or the child */ -/* you can actually call it at any time, anywhere :) */ -EV_API_DECL void ev_loop_fork (EV_P) EV_NOEXCEPT; - -EV_API_DECL unsigned int ev_backend (EV_P) EV_NOEXCEPT; /* backend in use by loop */ - -EV_API_DECL void ev_now_update (EV_P) EV_NOEXCEPT; /* update event loop time */ - -#if EV_WALK_ENABLE -/* walk (almost) all watchers in the loop of a given type, invoking the */ -/* callback on every such watcher. The callback might stop the watcher, */ -/* but do nothing else with the loop */ -EV_API_DECL void ev_walk (EV_P_ int types, void (*cb)(EV_P_ int type, void *w)) EV_NOEXCEPT; -#endif - -#endif /* prototypes */ - -/* ev_run flags values */ -enum { - EVRUN_NOWAIT = 1, /* do not block/wait */ - EVRUN_ONCE = 2 /* block *once* only */ -}; - -/* ev_break how values */ -enum { - EVBREAK_CANCEL = 0, /* undo unloop */ - EVBREAK_ONE = 1, /* unloop once */ - EVBREAK_ALL = 2 /* unloop all loops */ -}; - -#if EV_PROTOTYPES -EV_API_DECL int ev_run (EV_P_ int flags EV_CPP (= 0)); -EV_API_DECL void ev_break (EV_P_ int how EV_CPP (= EVBREAK_ONE)) EV_NOEXCEPT; /* break out of the loop */ - -/* - * ref/unref can be used to add or remove a refcount on the mainloop. every watcher - * keeps one reference. if you have a long-running watcher you never unregister that - * should not keep ev_loop from running, unref() after starting, and ref() before stopping. - */ -EV_API_DECL void ev_ref (EV_P) EV_NOEXCEPT; -EV_API_DECL void ev_unref (EV_P) EV_NOEXCEPT; - -/* - * convenience function, wait for a single event, without registering an event watcher - * if timeout is < 0, do wait indefinitely - */ -EV_API_DECL void ev_once (EV_P_ int fd, int events, ev_tstamp timeout, void (*cb)(int revents, void *arg), void *arg) EV_NOEXCEPT; - -EV_API_DECL void ev_invoke_pending (EV_P); /* invoke all pending watchers */ - -# if EV_FEATURE_API -EV_API_DECL unsigned int ev_iteration (EV_P) EV_NOEXCEPT; /* number of loop iterations */ -EV_API_DECL unsigned int ev_depth (EV_P) EV_NOEXCEPT; /* #ev_loop enters - #ev_loop leaves */ -EV_API_DECL void ev_verify (EV_P) EV_NOEXCEPT; /* abort if loop data corrupted */ - -EV_API_DECL void ev_set_io_collect_interval (EV_P_ ev_tstamp interval) EV_NOEXCEPT; /* sleep at least this time, default 0 */ -EV_API_DECL void ev_set_timeout_collect_interval (EV_P_ ev_tstamp interval) EV_NOEXCEPT; /* sleep at least this time, default 0 */ - -/* advanced stuff for threading etc. support, see docs */ -EV_API_DECL void ev_set_userdata (EV_P_ void *data) EV_NOEXCEPT; -EV_API_DECL void *ev_userdata (EV_P) EV_NOEXCEPT; -typedef void (*ev_loop_callback)(EV_P); -EV_API_DECL void ev_set_invoke_pending_cb (EV_P_ ev_loop_callback invoke_pending_cb) EV_NOEXCEPT; -/* C++ doesn't allow the use of the ev_loop_callback typedef here, so we need to spell it out */ -EV_API_DECL void ev_set_loop_release_cb (EV_P_ void (*release)(EV_P) EV_NOEXCEPT, void (*acquire)(EV_P) EV_NOEXCEPT) EV_NOEXCEPT; - -EV_API_DECL unsigned int ev_pending_count (EV_P) EV_NOEXCEPT; /* number of pending events, if any */ - -/* - * stop/start the timer handling. - */ -EV_API_DECL void ev_suspend (EV_P) EV_NOEXCEPT; -EV_API_DECL void ev_resume (EV_P) EV_NOEXCEPT; -#endif - -#endif - -/* these may evaluate ev multiple times, and the other arguments at most once */ -/* either use ev_init + ev_TYPE_set, or the ev_TYPE_init macro, below, to first initialise a watcher */ -#define ev_init(ev,cb_) do { \ - ((ev_watcher *)(void *)(ev))->active = \ - ((ev_watcher *)(void *)(ev))->pending = 0; \ - ev_set_priority ((ev), 0); \ - ev_set_cb ((ev), cb_); \ -} while (0) - -#define ev_io_modify(ev,events_) do { (ev)->events = (ev)->events & EV__IOFDSET | (events_); } while (0) -#define ev_io_set(ev,fd_,events_) do { (ev)->fd = (fd_); (ev)->events = (events_) | EV__IOFDSET; } while (0) -#define ev_timer_set(ev,after_,repeat_) do { ((ev_watcher_time *)(ev))->at = (after_); (ev)->repeat = (repeat_); } while (0) -#define ev_periodic_set(ev,ofs_,ival_,rcb_) do { (ev)->offset = (ofs_); (ev)->interval = (ival_); (ev)->reschedule_cb = (rcb_); } while (0) -#define ev_signal_set(ev,signum_) do { (ev)->signum = (signum_); } while (0) -#define ev_child_set(ev,pid_,trace_) do { (ev)->pid = (pid_); (ev)->flags = !!(trace_); } while (0) -#define ev_stat_set(ev,path_,interval_) do { (ev)->path = (path_); (ev)->interval = (interval_); (ev)->wd = -2; } while (0) -#define ev_idle_set(ev) /* nop, yes, this is a serious in-joke */ -#define ev_prepare_set(ev) /* nop, yes, this is a serious in-joke */ -#define ev_check_set(ev) /* nop, yes, this is a serious in-joke */ -#define ev_embed_set(ev,other_) do { (ev)->other = (other_); } while (0) -#define ev_fork_set(ev) /* nop, yes, this is a serious in-joke */ -#define ev_cleanup_set(ev) /* nop, yes, this is a serious in-joke */ -#define ev_async_set(ev) /* nop, yes, this is a serious in-joke */ - -#define ev_io_init(ev,cb,fd,events) do { ev_init ((ev), (cb)); ev_io_set ((ev),(fd),(events)); } while (0) -#define ev_timer_init(ev,cb,after,repeat) do { ev_init ((ev), (cb)); ev_timer_set ((ev),(after),(repeat)); } while (0) -#define ev_periodic_init(ev,cb,ofs,ival,rcb) do { ev_init ((ev), (cb)); ev_periodic_set ((ev),(ofs),(ival),(rcb)); } while (0) -#define ev_signal_init(ev,cb,signum) do { ev_init ((ev), (cb)); ev_signal_set ((ev), (signum)); } while (0) -#define ev_child_init(ev,cb,pid,trace) do { ev_init ((ev), (cb)); ev_child_set ((ev),(pid),(trace)); } while (0) -#define ev_stat_init(ev,cb,path,interval) do { ev_init ((ev), (cb)); ev_stat_set ((ev),(path),(interval)); } while (0) -#define ev_idle_init(ev,cb) do { ev_init ((ev), (cb)); ev_idle_set ((ev)); } while (0) -#define ev_prepare_init(ev,cb) do { ev_init ((ev), (cb)); ev_prepare_set ((ev)); } while (0) -#define ev_check_init(ev,cb) do { ev_init ((ev), (cb)); ev_check_set ((ev)); } while (0) -#define ev_embed_init(ev,cb,other) do { ev_init ((ev), (cb)); ev_embed_set ((ev),(other)); } while (0) -#define ev_fork_init(ev,cb) do { ev_init ((ev), (cb)); ev_fork_set ((ev)); } while (0) -#define ev_cleanup_init(ev,cb) do { ev_init ((ev), (cb)); ev_cleanup_set ((ev)); } while (0) -#define ev_async_init(ev,cb) do { ev_init ((ev), (cb)); ev_async_set ((ev)); } while (0) - -#define ev_is_pending(ev) (0 + ((ev_watcher *)(void *)(ev))->pending) /* ro, true when watcher is waiting for callback invocation */ -#define ev_is_active(ev) (0 + ((ev_watcher *)(void *)(ev))->active) /* ro, true when the watcher has been started */ - -#define ev_cb_(ev) (ev)->cb /* rw */ -#define ev_cb(ev) (memmove (&ev_cb_ (ev), &((ev_watcher *)(ev))->cb, sizeof (ev_cb_ (ev))), (ev)->cb) - -#if EV_MINPRI == EV_MAXPRI -# define ev_priority(ev) ((ev), EV_MINPRI) -# define ev_set_priority(ev,pri) ((ev), (pri)) -#else -# define ev_priority(ev) (+(((ev_watcher *)(void *)(ev))->priority)) -# define ev_set_priority(ev,pri) ( (ev_watcher *)(void *)(ev))->priority = (pri) -#endif - -#define ev_periodic_at(ev) (+((ev_watcher_time *)(ev))->at) - -#ifndef ev_set_cb -/* memmove is used here to avoid strict aliasing violations, and hopefully is optimized out by any reasonable compiler */ -# define ev_set_cb(ev,cb_) (ev_cb_ (ev) = (cb_), memmove (&((ev_watcher *)(ev))->cb, &ev_cb_ (ev), sizeof (ev_cb_ (ev)))) -#endif - -/* stopping (enabling, adding) a watcher does nothing if it is already running */ -/* stopping (disabling, deleting) a watcher does nothing unless it's already running */ -#if EV_PROTOTYPES - -/* feeds an event into a watcher as if the event actually occurred */ -/* accepts any ev_watcher type */ -EV_API_DECL void ev_feed_event (EV_P_ void *w, int revents) EV_NOEXCEPT; -EV_API_DECL void ev_feed_fd_event (EV_P_ int fd, int revents) EV_NOEXCEPT; -#if EV_SIGNAL_ENABLE -EV_API_DECL void ev_feed_signal (int signum) EV_NOEXCEPT; -EV_API_DECL void ev_feed_signal_event (EV_P_ int signum) EV_NOEXCEPT; -#endif -EV_API_DECL void ev_invoke (EV_P_ void *w, int revents); -EV_API_DECL int ev_clear_pending (EV_P_ void *w) EV_NOEXCEPT; - -EV_API_DECL void ev_io_start (EV_P_ ev_io *w) EV_NOEXCEPT; -EV_API_DECL void ev_io_stop (EV_P_ ev_io *w) EV_NOEXCEPT; - -EV_API_DECL void ev_timer_start (EV_P_ ev_timer *w) EV_NOEXCEPT; -EV_API_DECL void ev_timer_stop (EV_P_ ev_timer *w) EV_NOEXCEPT; -/* stops if active and no repeat, restarts if active and repeating, starts if inactive and repeating */ -EV_API_DECL void ev_timer_again (EV_P_ ev_timer *w) EV_NOEXCEPT; -/* return remaining time */ -EV_API_DECL ev_tstamp ev_timer_remaining (EV_P_ ev_timer *w) EV_NOEXCEPT; - -#if EV_PERIODIC_ENABLE -EV_API_DECL void ev_periodic_start (EV_P_ ev_periodic *w) EV_NOEXCEPT; -EV_API_DECL void ev_periodic_stop (EV_P_ ev_periodic *w) EV_NOEXCEPT; -EV_API_DECL void ev_periodic_again (EV_P_ ev_periodic *w) EV_NOEXCEPT; -#endif - -/* only supported in the default loop */ -#if EV_SIGNAL_ENABLE -EV_API_DECL void ev_signal_start (EV_P_ ev_signal *w) EV_NOEXCEPT; -EV_API_DECL void ev_signal_stop (EV_P_ ev_signal *w) EV_NOEXCEPT; -#endif - -/* only supported in the default loop */ -# if EV_CHILD_ENABLE -EV_API_DECL void ev_child_start (EV_P_ ev_child *w) EV_NOEXCEPT; -EV_API_DECL void ev_child_stop (EV_P_ ev_child *w) EV_NOEXCEPT; -# endif - -# if EV_STAT_ENABLE -EV_API_DECL void ev_stat_start (EV_P_ ev_stat *w) EV_NOEXCEPT; -EV_API_DECL void ev_stat_stop (EV_P_ ev_stat *w) EV_NOEXCEPT; -EV_API_DECL void ev_stat_stat (EV_P_ ev_stat *w) EV_NOEXCEPT; -# endif - -# if EV_IDLE_ENABLE -EV_API_DECL void ev_idle_start (EV_P_ ev_idle *w) EV_NOEXCEPT; -EV_API_DECL void ev_idle_stop (EV_P_ ev_idle *w) EV_NOEXCEPT; -# endif - -#if EV_PREPARE_ENABLE -EV_API_DECL void ev_prepare_start (EV_P_ ev_prepare *w) EV_NOEXCEPT; -EV_API_DECL void ev_prepare_stop (EV_P_ ev_prepare *w) EV_NOEXCEPT; -#endif - -#if EV_CHECK_ENABLE -EV_API_DECL void ev_check_start (EV_P_ ev_check *w) EV_NOEXCEPT; -EV_API_DECL void ev_check_stop (EV_P_ ev_check *w) EV_NOEXCEPT; -#endif - -# if EV_FORK_ENABLE -EV_API_DECL void ev_fork_start (EV_P_ ev_fork *w) EV_NOEXCEPT; -EV_API_DECL void ev_fork_stop (EV_P_ ev_fork *w) EV_NOEXCEPT; -# endif - -# if EV_CLEANUP_ENABLE -EV_API_DECL void ev_cleanup_start (EV_P_ ev_cleanup *w) EV_NOEXCEPT; -EV_API_DECL void ev_cleanup_stop (EV_P_ ev_cleanup *w) EV_NOEXCEPT; -# endif - -# if EV_EMBED_ENABLE -/* only supported when loop to be embedded is in fact embeddable */ -EV_API_DECL void ev_embed_start (EV_P_ ev_embed *w) EV_NOEXCEPT; -EV_API_DECL void ev_embed_stop (EV_P_ ev_embed *w) EV_NOEXCEPT; -EV_API_DECL void ev_embed_sweep (EV_P_ ev_embed *w) EV_NOEXCEPT; -# endif - -# if EV_ASYNC_ENABLE -EV_API_DECL void ev_async_start (EV_P_ ev_async *w) EV_NOEXCEPT; -EV_API_DECL void ev_async_stop (EV_P_ ev_async *w) EV_NOEXCEPT; -EV_API_DECL void ev_async_send (EV_P_ ev_async *w) EV_NOEXCEPT; -# endif - -#if EV_COMPAT3 - #define EVLOOP_NONBLOCK EVRUN_NOWAIT - #define EVLOOP_ONESHOT EVRUN_ONCE - #define EVUNLOOP_CANCEL EVBREAK_CANCEL - #define EVUNLOOP_ONE EVBREAK_ONE - #define EVUNLOOP_ALL EVBREAK_ALL - #if EV_PROTOTYPES - EV_INLINE void ev_loop (EV_P_ int flags) { ev_run (EV_A_ flags); } - EV_INLINE void ev_unloop (EV_P_ int how ) { ev_break (EV_A_ how ); } - EV_INLINE void ev_default_destroy (void) { ev_loop_destroy (EV_DEFAULT); } - EV_INLINE void ev_default_fork (void) { ev_loop_fork (EV_DEFAULT); } - #if EV_FEATURE_API - EV_INLINE unsigned int ev_loop_count (EV_P) { return ev_iteration (EV_A); } - EV_INLINE unsigned int ev_loop_depth (EV_P) { return ev_depth (EV_A); } - EV_INLINE void ev_loop_verify (EV_P) { ev_verify (EV_A); } - #endif - #endif -#else - typedef struct ev_loop ev_loop; -#endif - -#endif - -EV_CPP(}) - -#endif - diff --git a/client/3rd/ShadowSocks/ShadowSocks/libev/arm64/include/event.h b/client/3rd/ShadowSocks/ShadowSocks/libev/arm64/include/event.h deleted file mode 100644 index aa81928f..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libev/arm64/include/event.h +++ /dev/null @@ -1,177 +0,0 @@ -/* - * libevent compatibility header, only core events supported - * - * Copyright (c) 2007,2008,2010,2012 Marc Alexander Lehmann - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modifica- - * tion, 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. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MER- - * CHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO - * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPE- - * CIAL, 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 OTH- - * ERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - * OF THE POSSIBILITY OF SUCH DAMAGE. - * - * Alternatively, the contents of this file may be used under the terms of - * the GNU General Public License ("GPL") version 2 or any later version, - * in which case the provisions of the GPL are applicable instead of - * the above. If you wish to allow the use of your version of this file - * only under the terms of the GPL and not to allow others to use your - * version of this file under the BSD license, indicate your decision - * by deleting the provisions above and replace them with the notice - * and other provisions required by the GPL. If you do not delete the - * provisions above, a recipient may use your version of this file under - * either the BSD or the GPL. - */ - -#ifndef EVENT_H_ -#define EVENT_H_ - -#ifdef EV_H -# include EV_H -#else -# include "ev.h" -#endif - -#ifndef EVLOOP_NONBLOCK -# define EVLOOP_NONBLOCK EVRUN_NOWAIT -#endif -#ifndef EVLOOP_ONESHOT -# define EVLOOP_ONESHOT EVRUN_ONCE -#endif -#ifndef EV_TIMEOUT -# define EV_TIMEOUT EV_TIMER -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -/* we need sys/time.h for struct timeval only */ -#if !defined (WIN32) || defined (__MINGW32__) -# include /* mingw seems to need this, for whatever reason */ -# include -#endif - -struct event_base; - -#define EVLIST_TIMEOUT 0x01 -#define EVLIST_INSERTED 0x02 -#define EVLIST_SIGNAL 0x04 -#define EVLIST_ACTIVE 0x08 -#define EVLIST_INTERNAL 0x10 -#define EVLIST_INIT 0x80 - -typedef void (*event_callback_fn)(int, short, void *); - -struct event -{ - /* libev watchers we map onto */ - union { - struct ev_io io; - struct ev_signal sig; - } iosig; - struct ev_timer to; - - /* compatibility slots */ - struct event_base *ev_base; - event_callback_fn ev_callback; - void *ev_arg; - int ev_fd; - int ev_pri; - int ev_res; - int ev_flags; - short ev_events; -}; - -event_callback_fn event_get_callback (const struct event *ev); - -#define EV_READ EV_READ -#define EV_WRITE EV_WRITE -#define EV_PERSIST 0x10 -#define EV_ET 0x20 /* nop */ - -#define EVENT_SIGNAL(ev) ((int) (ev)->ev_fd) -#define EVENT_FD(ev) ((int) (ev)->ev_fd) - -#define event_initialized(ev) ((ev)->ev_flags & EVLIST_INIT) - -#define evtimer_add(ev,tv) event_add (ev, tv) -#define evtimer_set(ev,cb,data) event_set (ev, -1, 0, cb, data) -#define evtimer_del(ev) event_del (ev) -#define evtimer_pending(ev,tv) event_pending (ev, EV_TIMEOUT, tv) -#define evtimer_initialized(ev) event_initialized (ev) - -#define timeout_add(ev,tv) evtimer_add (ev, tv) -#define timeout_set(ev,cb,data) evtimer_set (ev, cb, data) -#define timeout_del(ev) evtimer_del (ev) -#define timeout_pending(ev,tv) evtimer_pending (ev, tv) -#define timeout_initialized(ev) evtimer_initialized (ev) - -#define signal_add(ev,tv) event_add (ev, tv) -#define signal_set(ev,sig,cb,data) event_set (ev, sig, EV_SIGNAL | EV_PERSIST, cb, data) -#define signal_del(ev) event_del (ev) -#define signal_pending(ev,tv) event_pending (ev, EV_SIGNAL, tv) -#define signal_initialized(ev) event_initialized (ev) - -const char *event_get_version (void); -const char *event_get_method (void); - -void *event_init (void); -void event_base_free (struct event_base *base); - -#define EVLOOP_ONCE EVLOOP_ONESHOT -int event_loop (int); -int event_loopexit (struct timeval *tv); -int event_dispatch (void); - -#define _EVENT_LOG_DEBUG 0 -#define _EVENT_LOG_MSG 1 -#define _EVENT_LOG_WARN 2 -#define _EVENT_LOG_ERR 3 -typedef void (*event_log_cb)(int severity, const char *msg); -void event_set_log_callback(event_log_cb cb); - -void event_set (struct event *ev, int fd, short events, void (*cb)(int, short, void *), void *arg); -int event_once (int fd, short events, void (*cb)(int, short, void *), void *arg, struct timeval *tv); - -int event_add (struct event *ev, struct timeval *tv); -int event_del (struct event *ev); -void event_active (struct event *ev, int res, short ncalls); /* ncalls is being ignored */ - -int event_pending (struct event *ev, short, struct timeval *tv); - -int event_priority_init (int npri); -int event_priority_set (struct event *ev, int pri); - -struct event_base *event_base_new (void); -const char *event_base_get_method (const struct event_base *); -int event_base_set (struct event_base *base, struct event *ev); -int event_base_loop (struct event_base *base, int); -int event_base_loopexit (struct event_base *base, struct timeval *tv); -int event_base_dispatch (struct event_base *base); -int event_base_once (struct event_base *base, int fd, short events, void (*cb)(int, short, void *), void *arg, struct timeval *tv); -int event_base_priority_init (struct event_base *base, int fd); - -/* next line is different in the libevent+libev version */ -/*libevent-include*/ - -#ifdef __cplusplus -} -#endif - -#endif - diff --git a/client/3rd/ShadowSocks/ShadowSocks/libev/arm64/lib/libev.a b/client/3rd/ShadowSocks/ShadowSocks/libev/arm64/lib/libev.a deleted file mode 100644 index e5f098b3a5f9e83697eaeaf1c0a26f658a637bfc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 52648 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. -.tr \(*W- -.ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p' -.ie n \{\ -. ds -- \(*W- -. ds PI pi -. if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch -. if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch -. ds L" "" -. ds R" "" -. ds C` "" -. ds C' "" -'br\} -.el\{\ -. ds -- \|\(em\| -. ds PI \(*p -. ds L" `` -. ds R" '' -. ds C` -. ds C' -'br\} -.\" -.\" Escape single quotes in literal strings from groff's Unicode transform. -.ie \n(.g .ds Aq \(aq -.el .ds Aq ' -.\" -.\" If the F register is >0, we'll generate index entries on stderr for -.\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index -.\" entries marked with X<> in POD. Of course, you'll have to process the -.\" output yourself in some meaningful fashion. -.\" -.\" Avoid warning from groff about undefined register 'F'. -.de IX -.. -.nr rF 0 -.if \n(.g .if rF .nr rF 1 -.if (\n(rF:(\n(.g==0)) \{\ -. if \nF \{\ -. de IX -. tm Index:\\$1\t\\n%\t"\\$2" -.. -. if !\nF==2 \{\ -. nr % 0 -. nr F 2 -. \} -. \} -.\} -.rr rF -.\" -.\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2). -.\" Fear. Run. Save yourself. No user-serviceable parts. -. \" fudge factors for nroff and troff -.if n \{\ -. ds #H 0 -. ds #V .8m -. ds #F .3m -. ds #[ \f1 -. ds #] \fP -.\} -.if t \{\ -. ds #H ((1u-(\\\\n(.fu%2u))*.13m) -. ds #V .6m -. ds #F 0 -. ds #[ \& -. ds #] \& -.\} -. \" simple accents for nroff and troff -.if n \{\ -. ds ' \& -. ds ` \& -. ds ^ \& -. ds , \& -. ds ~ ~ -. ds / -.\} -.if t \{\ -. ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u" -. ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u' -. ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u' -. ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u' -. ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u' -. ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u' -.\} -. \" troff and (daisy-wheel) nroff accents -.ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V' -.ds 8 \h'\*(#H'\(*b\h'-\*(#H' -.ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#] -.ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H' -.ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u' -.ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#] -.ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#] -.ds ae a\h'-(\w'a'u*4/10)'e -.ds Ae A\h'-(\w'A'u*4/10)'E -. \" corrections for vroff -.if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u' -.if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u' -. \" for low resolution devices (crt and lpr) -.if \n(.H>23 .if \n(.V>19 \ -\{\ -. ds : e -. ds 8 ss -. ds o a -. ds d- d\h'-1'\(ga -. ds D- D\h'-1'\(hy -. ds th \o'bp' -. ds Th \o'LP' -. ds ae ae -. ds Ae AE -.\} -.rm #[ #] #H #V #F C -.\" ======================================================================== -.\" -.IX Title "LIBEV 3" -.TH LIBEV 3 "2020-03-12" "libev-4.31" "libev - high performance full featured event loop" -.\" For nroff, turn off justification. Always turn off hyphenation; it makes -.\" way too many mistakes in technical documents. -.if n .ad l -.nh -.SH "NAME" -libev \- a high performance full\-featured event loop written in C -.SH "SYNOPSIS" -.IX Header "SYNOPSIS" -.Vb 1 -\& #include -.Ve -.SS "\s-1EXAMPLE PROGRAM\s0" -.IX Subsection "EXAMPLE PROGRAM" -.Vb 2 -\& // a single header file is required -\& #include -\& -\& #include // for puts -\& -\& // every watcher type has its own typedef\*(Aqd struct -\& // with the name ev_TYPE -\& ev_io stdin_watcher; -\& ev_timer timeout_watcher; -\& -\& // all watcher callbacks have a similar signature -\& // this callback is called when data is readable on stdin -\& static void -\& stdin_cb (EV_P_ ev_io *w, int revents) -\& { -\& puts ("stdin ready"); -\& // for one\-shot events, one must manually stop the watcher -\& // with its corresponding stop function. -\& ev_io_stop (EV_A_ w); -\& -\& // this causes all nested ev_run\*(Aqs to stop iterating -\& ev_break (EV_A_ EVBREAK_ALL); -\& } -\& -\& // another callback, this time for a time\-out -\& static void -\& timeout_cb (EV_P_ ev_timer *w, int revents) -\& { -\& puts ("timeout"); -\& // this causes the innermost ev_run to stop iterating -\& ev_break (EV_A_ EVBREAK_ONE); -\& } -\& -\& int -\& main (void) -\& { -\& // use the default event loop unless you have special needs -\& struct ev_loop *loop = EV_DEFAULT; -\& -\& // initialise an io watcher, then start it -\& // this one will watch for stdin to become readable -\& ev_io_init (&stdin_watcher, stdin_cb, /*STDIN_FILENO*/ 0, EV_READ); -\& ev_io_start (loop, &stdin_watcher); -\& -\& // initialise a timer watcher, then start it -\& // simple non\-repeating 5.5 second timeout -\& ev_timer_init (&timeout_watcher, timeout_cb, 5.5, 0.); -\& ev_timer_start (loop, &timeout_watcher); -\& -\& // now wait for events to arrive -\& ev_run (loop, 0); -\& -\& // break was called, so exit -\& return 0; -\& } -.Ve -.SH "ABOUT THIS DOCUMENT" -.IX Header "ABOUT THIS DOCUMENT" -This document documents the libev software package. -.PP -The newest version of this document is also available as an html-formatted -web page you might find easier to navigate when reading it for the first -time: . -.PP -While this document tries to be as complete as possible in documenting -libev, its usage and the rationale behind its design, it is not a tutorial -on event-based programming, nor will it introduce event-based programming -with libev. -.PP -Familiarity with event based programming techniques in general is assumed -throughout this document. -.SH "WHAT TO READ WHEN IN A HURRY" -.IX Header "WHAT TO READ WHEN IN A HURRY" -This manual tries to be very detailed, but unfortunately, this also makes -it very long. If you just want to know the basics of libev, I suggest -reading \*(L"\s-1ANATOMY OF A WATCHER\*(R"\s0, then the \*(L"\s-1EXAMPLE PROGRAM\*(R"\s0 above and -look up the missing functions in \*(L"\s-1GLOBAL FUNCTIONS\*(R"\s0 and the \f(CW\*(C`ev_io\*(C'\fR and -\&\f(CW\*(C`ev_timer\*(C'\fR sections in \*(L"\s-1WATCHER TYPES\*(R"\s0. -.SH "ABOUT LIBEV" -.IX Header "ABOUT LIBEV" -Libev is an event loop: you register interest in certain events (such as a -file descriptor being readable or a timeout occurring), and it will manage -these event sources and provide your program with events. -.PP -To do this, it must take more or less complete control over your process -(or thread) by executing the \fIevent loop\fR handler, and will then -communicate events via a callback mechanism. -.PP -You register interest in certain events by registering so-called \fIevent -watchers\fR, which are relatively small C structures you initialise with the -details of the event, and then hand it over to libev by \fIstarting\fR the -watcher. -.SS "\s-1FEATURES\s0" -.IX Subsection "FEATURES" -Libev supports \f(CW\*(C`select\*(C'\fR, \f(CW\*(C`poll\*(C'\fR, the Linux-specific aio and \f(CW\*(C`epoll\*(C'\fR -interfaces, the BSD-specific \f(CW\*(C`kqueue\*(C'\fR and the Solaris-specific event port -mechanisms for file descriptor events (\f(CW\*(C`ev_io\*(C'\fR), the Linux \f(CW\*(C`inotify\*(C'\fR -interface (for \f(CW\*(C`ev_stat\*(C'\fR), Linux eventfd/signalfd (for faster and cleaner -inter-thread wakeup (\f(CW\*(C`ev_async\*(C'\fR)/signal handling (\f(CW\*(C`ev_signal\*(C'\fR)) relative -timers (\f(CW\*(C`ev_timer\*(C'\fR), absolute timers with customised rescheduling -(\f(CW\*(C`ev_periodic\*(C'\fR), synchronous signals (\f(CW\*(C`ev_signal\*(C'\fR), process status -change events (\f(CW\*(C`ev_child\*(C'\fR), and event watchers dealing with the event -loop mechanism itself (\f(CW\*(C`ev_idle\*(C'\fR, \f(CW\*(C`ev_embed\*(C'\fR, \f(CW\*(C`ev_prepare\*(C'\fR and -\&\f(CW\*(C`ev_check\*(C'\fR watchers) as well as file watchers (\f(CW\*(C`ev_stat\*(C'\fR) and even -limited support for fork events (\f(CW\*(C`ev_fork\*(C'\fR). -.PP -It also is quite fast (see this -benchmark comparing it to libevent -for example). -.SS "\s-1CONVENTIONS\s0" -.IX Subsection "CONVENTIONS" -Libev is very configurable. In this manual the default (and most common) -configuration will be described, which supports multiple event loops. For -more info about various configuration options please have a look at -\&\fB\s-1EMBED\s0\fR section in this manual. If libev was configured without support -for multiple event loops, then all functions taking an initial argument of -name \f(CW\*(C`loop\*(C'\fR (which is always of type \f(CW\*(C`struct ev_loop *\*(C'\fR) will not have -this argument. -.SS "\s-1TIME REPRESENTATION\s0" -.IX Subsection "TIME REPRESENTATION" -Libev represents time as a single floating point number, representing -the (fractional) number of seconds since the (\s-1POSIX\s0) epoch (in practice -somewhere near the beginning of 1970, details are complicated, don't -ask). This type is called \f(CW\*(C`ev_tstamp\*(C'\fR, which is what you should use -too. It usually aliases to the \f(CW\*(C`double\*(C'\fR type in C. When you need to do -any calculations on it, you should treat it as some floating point value. -.PP -Unlike the name component \f(CW\*(C`stamp\*(C'\fR might indicate, it is also used for -time differences (e.g. delays) throughout libev. -.SH "ERROR HANDLING" -.IX Header "ERROR HANDLING" -Libev knows three classes of errors: operating system errors, usage errors -and internal errors (bugs). -.PP -When libev catches an operating system error it cannot handle (for example -a system call indicating a condition libev cannot fix), it calls the callback -set via \f(CW\*(C`ev_set_syserr_cb\*(C'\fR, which is supposed to fix the problem or -abort. The default is to print a diagnostic message and to call \f(CW\*(C`abort -()\*(C'\fR. -.PP -When libev detects a usage error such as a negative timer interval, then -it will print a diagnostic message and abort (via the \f(CW\*(C`assert\*(C'\fR mechanism, -so \f(CW\*(C`NDEBUG\*(C'\fR will disable this checking): these are programming errors in -the libev caller and need to be fixed there. -.PP -Via the \f(CW\*(C`EV_FREQUENT\*(C'\fR macro you can compile in and/or enable extensive -consistency checking code inside libev that can be used to check for -internal inconsistencies, suually caused by application bugs. -.PP -Libev also has a few internal error-checking \f(CW\*(C`assert\*(C'\fRions. These do not -trigger under normal circumstances, as they indicate either a bug in libev -or worse. -.SH "GLOBAL FUNCTIONS" -.IX Header "GLOBAL FUNCTIONS" -These functions can be called anytime, even before initialising the -library in any way. -.IP "ev_tstamp ev_time ()" 4 -.IX Item "ev_tstamp ev_time ()" -Returns the current time as libev would use it. Please note that the -\&\f(CW\*(C`ev_now\*(C'\fR function is usually faster and also often returns the timestamp -you actually want to know. Also interesting is the combination of -\&\f(CW\*(C`ev_now_update\*(C'\fR and \f(CW\*(C`ev_now\*(C'\fR. -.IP "ev_sleep (ev_tstamp interval)" 4 -.IX Item "ev_sleep (ev_tstamp interval)" -Sleep for the given interval: The current thread will be blocked -until either it is interrupted or the given time interval has -passed (approximately \- it might return a bit earlier even if not -interrupted). Returns immediately if \f(CW\*(C`interval <= 0\*(C'\fR. -.Sp -Basically this is a sub-second-resolution \f(CW\*(C`sleep ()\*(C'\fR. -.Sp -The range of the \f(CW\*(C`interval\*(C'\fR is limited \- libev only guarantees to work -with sleep times of up to one day (\f(CW\*(C`interval <= 86400\*(C'\fR). -.IP "int ev_version_major ()" 4 -.IX Item "int ev_version_major ()" -.PD 0 -.IP "int ev_version_minor ()" 4 -.IX Item "int ev_version_minor ()" -.PD -You can find out the major and minor \s-1ABI\s0 version numbers of the library -you linked against by calling the functions \f(CW\*(C`ev_version_major\*(C'\fR and -\&\f(CW\*(C`ev_version_minor\*(C'\fR. If you want, you can compare against the global -symbols \f(CW\*(C`EV_VERSION_MAJOR\*(C'\fR and \f(CW\*(C`EV_VERSION_MINOR\*(C'\fR, which specify the -version of the library your program was compiled against. -.Sp -These version numbers refer to the \s-1ABI\s0 version of the library, not the -release version. -.Sp -Usually, it's a good idea to terminate if the major versions mismatch, -as this indicates an incompatible change. Minor versions are usually -compatible to older versions, so a larger minor version alone is usually -not a problem. -.Sp -Example: Make sure we haven't accidentally been linked against the wrong -version (note, however, that this will not detect other \s-1ABI\s0 mismatches, -such as \s-1LFS\s0 or reentrancy). -.Sp -.Vb 3 -\& assert (("libev version mismatch", -\& ev_version_major () == EV_VERSION_MAJOR -\& && ev_version_minor () >= EV_VERSION_MINOR)); -.Ve -.IP "unsigned int ev_supported_backends ()" 4 -.IX Item "unsigned int ev_supported_backends ()" -Return the set of all backends (i.e. their corresponding \f(CW\*(C`EV_BACKEND_*\*(C'\fR -value) compiled into this binary of libev (independent of their -availability on the system you are running on). See \f(CW\*(C`ev_default_loop\*(C'\fR for -a description of the set values. -.Sp -Example: make sure we have the epoll method, because yeah this is cool and -a must have and can we have a torrent of it please!!!11 -.Sp -.Vb 2 -\& assert (("sorry, no epoll, no sex", -\& ev_supported_backends () & EVBACKEND_EPOLL)); -.Ve -.IP "unsigned int ev_recommended_backends ()" 4 -.IX Item "unsigned int ev_recommended_backends ()" -Return the set of all backends compiled into this binary of libev and -also recommended for this platform, meaning it will work for most file -descriptor types. This set is often smaller than the one returned by -\&\f(CW\*(C`ev_supported_backends\*(C'\fR, as for example kqueue is broken on most BSDs -and will not be auto-detected unless you explicitly request it (assuming -you know what you are doing). This is the set of backends that libev will -probe for if you specify no backends explicitly. -.IP "unsigned int ev_embeddable_backends ()" 4 -.IX Item "unsigned int ev_embeddable_backends ()" -Returns the set of backends that are embeddable in other event loops. This -value is platform-specific but can include backends not available on the -current system. To find which embeddable backends might be supported on -the current system, you would need to look at \f(CW\*(C`ev_embeddable_backends () -& ev_supported_backends ()\*(C'\fR, likewise for recommended ones. -.Sp -See the description of \f(CW\*(C`ev_embed\*(C'\fR watchers for more info. -.IP "ev_set_allocator (void *(*cb)(void *ptr, long size) throw ())" 4 -.IX Item "ev_set_allocator (void *(*cb)(void *ptr, long size) throw ())" -Sets the allocation function to use (the prototype is similar \- the -semantics are identical to the \f(CW\*(C`realloc\*(C'\fR C89/SuS/POSIX function). It is -used to allocate and free memory (no surprises here). If it returns zero -when memory needs to be allocated (\f(CW\*(C`size != 0\*(C'\fR), the library might abort -or take some potentially destructive action. -.Sp -Since some systems (at least OpenBSD and Darwin) fail to implement -correct \f(CW\*(C`realloc\*(C'\fR semantics, libev will use a wrapper around the system -\&\f(CW\*(C`realloc\*(C'\fR and \f(CW\*(C`free\*(C'\fR functions by default. -.Sp -You could override this function in high-availability programs to, say, -free some memory if it cannot allocate memory, to use a special allocator, -or even to sleep a while and retry until some memory is available. -.Sp -Example: The following is the \f(CW\*(C`realloc\*(C'\fR function that libev itself uses -which should work with \f(CW\*(C`realloc\*(C'\fR and \f(CW\*(C`free\*(C'\fR functions of all kinds and -is probably a good basis for your own implementation. -.Sp -.Vb 5 -\& static void * -\& ev_realloc_emul (void *ptr, long size) EV_NOEXCEPT -\& { -\& if (size) -\& return realloc (ptr, size); -\& -\& free (ptr); -\& return 0; -\& } -.Ve -.Sp -Example: Replace the libev allocator with one that waits a bit and then -retries. -.Sp -.Vb 8 -\& static void * -\& persistent_realloc (void *ptr, size_t size) -\& { -\& if (!size) -\& { -\& free (ptr); -\& return 0; -\& } -\& -\& for (;;) -\& { -\& void *newptr = realloc (ptr, size); -\& -\& if (newptr) -\& return newptr; -\& -\& sleep (60); -\& } -\& } -\& -\& ... -\& ev_set_allocator (persistent_realloc); -.Ve -.IP "ev_set_syserr_cb (void (*cb)(const char *msg) throw ())" 4 -.IX Item "ev_set_syserr_cb (void (*cb)(const char *msg) throw ())" -Set the callback function to call on a retryable system call error (such -as failed select, poll, epoll_wait). The message is a printable string -indicating the system call or subsystem causing the problem. If this -callback is set, then libev will expect it to remedy the situation, no -matter what, when it returns. That is, libev will generally retry the -requested operation, or, if the condition doesn't go away, do bad stuff -(such as abort). -.Sp -Example: This is basically the same thing that libev does internally, too. -.Sp -.Vb 6 -\& static void -\& fatal_error (const char *msg) -\& { -\& perror (msg); -\& abort (); -\& } -\& -\& ... -\& ev_set_syserr_cb (fatal_error); -.Ve -.IP "ev_feed_signal (int signum)" 4 -.IX Item "ev_feed_signal (int signum)" -This function can be used to \*(L"simulate\*(R" a signal receive. It is completely -safe to call this function at any time, from any context, including signal -handlers or random threads. -.Sp -Its main use is to customise signal handling in your process, especially -in the presence of threads. For example, you could block signals -by default in all threads (and specifying \f(CW\*(C`EVFLAG_NOSIGMASK\*(C'\fR when -creating any loops), and in one thread, use \f(CW\*(C`sigwait\*(C'\fR or any other -mechanism to wait for signals, then \*(L"deliver\*(R" them to libev by calling -\&\f(CW\*(C`ev_feed_signal\*(C'\fR. -.SH "FUNCTIONS CONTROLLING EVENT LOOPS" -.IX Header "FUNCTIONS CONTROLLING EVENT LOOPS" -An event loop is described by a \f(CW\*(C`struct ev_loop *\*(C'\fR (the \f(CW\*(C`struct\*(C'\fR is -\&\fInot\fR optional in this case unless libev 3 compatibility is disabled, as -libev 3 had an \f(CW\*(C`ev_loop\*(C'\fR function colliding with the struct name). -.PP -The library knows two types of such loops, the \fIdefault\fR loop, which -supports child process events, and dynamically created event loops which -do not. -.IP "struct ev_loop *ev_default_loop (unsigned int flags)" 4 -.IX Item "struct ev_loop *ev_default_loop (unsigned int flags)" -This returns the \*(L"default\*(R" event loop object, which is what you should -normally use when you just need \*(L"the event loop\*(R". Event loop objects and -the \f(CW\*(C`flags\*(C'\fR parameter are described in more detail in the entry for -\&\f(CW\*(C`ev_loop_new\*(C'\fR. -.Sp -If the default loop is already initialised then this function simply -returns it (and ignores the flags. If that is troubling you, check -\&\f(CW\*(C`ev_backend ()\*(C'\fR afterwards). Otherwise it will create it with the given -flags, which should almost always be \f(CW0\fR, unless the caller is also the -one calling \f(CW\*(C`ev_run\*(C'\fR or otherwise qualifies as \*(L"the main program\*(R". -.Sp -If you don't know what event loop to use, use the one returned from this -function (or via the \f(CW\*(C`EV_DEFAULT\*(C'\fR macro). -.Sp -Note that this function is \fInot\fR thread-safe, so if you want to use it -from multiple threads, you have to employ some kind of mutex (note also -that this case is unlikely, as loops cannot be shared easily between -threads anyway). -.Sp -The default loop is the only loop that can handle \f(CW\*(C`ev_child\*(C'\fR watchers, -and to do this, it always registers a handler for \f(CW\*(C`SIGCHLD\*(C'\fR. If this is -a problem for your application you can either create a dynamic loop with -\&\f(CW\*(C`ev_loop_new\*(C'\fR which doesn't do that, or you can simply overwrite the -\&\f(CW\*(C`SIGCHLD\*(C'\fR signal handler \fIafter\fR calling \f(CW\*(C`ev_default_init\*(C'\fR. -.Sp -Example: This is the most typical usage. -.Sp -.Vb 2 -\& if (!ev_default_loop (0)) -\& fatal ("could not initialise libev, bad $LIBEV_FLAGS in environment?"); -.Ve -.Sp -Example: Restrict libev to the select and poll backends, and do not allow -environment settings to be taken into account: -.Sp -.Vb 1 -\& ev_default_loop (EVBACKEND_POLL | EVBACKEND_SELECT | EVFLAG_NOENV); -.Ve -.IP "struct ev_loop *ev_loop_new (unsigned int flags)" 4 -.IX Item "struct ev_loop *ev_loop_new (unsigned int flags)" -This will create and initialise a new event loop object. If the loop -could not be initialised, returns false. -.Sp -This function is thread-safe, and one common way to use libev with -threads is indeed to create one loop per thread, and using the default -loop in the \*(L"main\*(R" or \*(L"initial\*(R" thread. -.Sp -The flags argument can be used to specify special behaviour or specific -backends to use, and is usually specified as \f(CW0\fR (or \f(CW\*(C`EVFLAG_AUTO\*(C'\fR). -.Sp -The following flags are supported: -.RS 4 -.ie n .IP """EVFLAG_AUTO""" 4 -.el .IP "\f(CWEVFLAG_AUTO\fR" 4 -.IX Item "EVFLAG_AUTO" -The default flags value. Use this if you have no clue (it's the right -thing, believe me). -.ie n .IP """EVFLAG_NOENV""" 4 -.el .IP "\f(CWEVFLAG_NOENV\fR" 4 -.IX Item "EVFLAG_NOENV" -If this flag bit is or'ed into the flag value (or the program runs setuid -or setgid) then libev will \fInot\fR look at the environment variable -\&\f(CW\*(C`LIBEV_FLAGS\*(C'\fR. Otherwise (the default), this environment variable will -override the flags completely if it is found in the environment. This is -useful to try out specific backends to test their performance, to work -around bugs, or to make libev threadsafe (accessing environment variables -cannot be done in a threadsafe way, but usually it works if no other -thread modifies them). -.ie n .IP """EVFLAG_FORKCHECK""" 4 -.el .IP "\f(CWEVFLAG_FORKCHECK\fR" 4 -.IX Item "EVFLAG_FORKCHECK" -Instead of calling \f(CW\*(C`ev_loop_fork\*(C'\fR manually after a fork, you can also -make libev check for a fork in each iteration by enabling this flag. -.Sp -This works by calling \f(CW\*(C`getpid ()\*(C'\fR on every iteration of the loop, -and thus this might slow down your event loop if you do a lot of loop -iterations and little real work, but is usually not noticeable (on my -GNU/Linux system for example, \f(CW\*(C`getpid\*(C'\fR is actually a simple 5\-insn -sequence without a system call and thus \fIvery\fR fast, but my GNU/Linux -system also has \f(CW\*(C`pthread_atfork\*(C'\fR which is even faster). (Update: glibc -versions 2.25 apparently removed the \f(CW\*(C`getpid\*(C'\fR optimisation again). -.Sp -The big advantage of this flag is that you can forget about fork (and -forget about forgetting to tell libev about forking, although you still -have to ignore \f(CW\*(C`SIGPIPE\*(C'\fR) when you use this flag. -.Sp -This flag setting cannot be overridden or specified in the \f(CW\*(C`LIBEV_FLAGS\*(C'\fR -environment variable. -.ie n .IP """EVFLAG_NOINOTIFY""" 4 -.el .IP "\f(CWEVFLAG_NOINOTIFY\fR" 4 -.IX Item "EVFLAG_NOINOTIFY" -When this flag is specified, then libev will not attempt to use the -\&\fIinotify\fR \s-1API\s0 for its \f(CW\*(C`ev_stat\*(C'\fR watchers. Apart from debugging and -testing, this flag can be useful to conserve inotify file descriptors, as -otherwise each loop using \f(CW\*(C`ev_stat\*(C'\fR watchers consumes one inotify handle. -.ie n .IP """EVFLAG_SIGNALFD""" 4 -.el .IP "\f(CWEVFLAG_SIGNALFD\fR" 4 -.IX Item "EVFLAG_SIGNALFD" -When this flag is specified, then libev will attempt to use the -\&\fIsignalfd\fR \s-1API\s0 for its \f(CW\*(C`ev_signal\*(C'\fR (and \f(CW\*(C`ev_child\*(C'\fR) watchers. This \s-1API\s0 -delivers signals synchronously, which makes it both faster and might make -it possible to get the queued signal data. It can also simplify signal -handling with threads, as long as you properly block signals in your -threads that are not interested in handling them. -.Sp -Signalfd will not be used by default as this changes your signal mask, and -there are a lot of shoddy libraries and programs (glib's threadpool for -example) that can't properly initialise their signal masks. -.ie n .IP """EVFLAG_NOSIGMASK""" 4 -.el .IP "\f(CWEVFLAG_NOSIGMASK\fR" 4 -.IX Item "EVFLAG_NOSIGMASK" -When this flag is specified, then libev will avoid to modify the signal -mask. Specifically, this means you have to make sure signals are unblocked -when you want to receive them. -.Sp -This behaviour is useful when you want to do your own signal handling, or -want to handle signals only in specific threads and want to avoid libev -unblocking the signals. -.Sp -It's also required by \s-1POSIX\s0 in a threaded program, as libev calls -\&\f(CW\*(C`sigprocmask\*(C'\fR, whose behaviour is officially unspecified. -.ie n .IP """EVFLAG_NOTIMERFD""" 4 -.el .IP "\f(CWEVFLAG_NOTIMERFD\fR" 4 -.IX Item "EVFLAG_NOTIMERFD" -When this flag is specified, the libev will avoid using a \f(CW\*(C`timerfd\*(C'\fR to -detect time jumps. It will still be able to detect time jumps, but takes -longer and has a lower accuracy in doing so, but saves a file descriptor -per loop. -.Sp -The current implementation only tries to use a \f(CW\*(C`timerfd\*(C'\fR when the first -\&\f(CW\*(C`ev_periodic\*(C'\fR watcher is started and falls back on other methods if it -cannot be created, but this behaviour might change in the future. -.ie n .IP """EVBACKEND_SELECT"" (value 1, portable select backend)" 4 -.el .IP "\f(CWEVBACKEND_SELECT\fR (value 1, portable select backend)" 4 -.IX Item "EVBACKEND_SELECT (value 1, portable select backend)" -This is your standard \fBselect\fR\|(2) backend. Not \fIcompletely\fR standard, as -libev tries to roll its own fd_set with no limits on the number of fds, -but if that fails, expect a fairly low limit on the number of fds when -using this backend. It doesn't scale too well (O(highest_fd)), but its -usually the fastest backend for a low number of (low-numbered :) fds. -.Sp -To get good performance out of this backend you need a high amount of -parallelism (most of the file descriptors should be busy). If you are -writing a server, you should \f(CW\*(C`accept ()\*(C'\fR in a loop to accept as many -connections as possible during one iteration. You might also want to have -a look at \f(CW\*(C`ev_set_io_collect_interval ()\*(C'\fR to increase the amount of -readiness notifications you get per iteration. -.Sp -This backend maps \f(CW\*(C`EV_READ\*(C'\fR to the \f(CW\*(C`readfds\*(C'\fR set and \f(CW\*(C`EV_WRITE\*(C'\fR to the -\&\f(CW\*(C`writefds\*(C'\fR set (and to work around Microsoft Windows bugs, also onto the -\&\f(CW\*(C`exceptfds\*(C'\fR set on that platform). -.ie n .IP """EVBACKEND_POLL"" (value 2, poll backend, available everywhere except on windows)" 4 -.el .IP "\f(CWEVBACKEND_POLL\fR (value 2, poll backend, available everywhere except on windows)" 4 -.IX Item "EVBACKEND_POLL (value 2, poll backend, available everywhere except on windows)" -And this is your standard \fBpoll\fR\|(2) backend. It's more complicated -than select, but handles sparse fds better and has no artificial -limit on the number of fds you can use (except it will slow down -considerably with a lot of inactive fds). It scales similarly to select, -i.e. O(total_fds). See the entry for \f(CW\*(C`EVBACKEND_SELECT\*(C'\fR, above, for -performance tips. -.Sp -This backend maps \f(CW\*(C`EV_READ\*(C'\fR to \f(CW\*(C`POLLIN | POLLERR | POLLHUP\*(C'\fR, and -\&\f(CW\*(C`EV_WRITE\*(C'\fR to \f(CW\*(C`POLLOUT | POLLERR | POLLHUP\*(C'\fR. -.ie n .IP """EVBACKEND_EPOLL"" (value 4, Linux)" 4 -.el .IP "\f(CWEVBACKEND_EPOLL\fR (value 4, Linux)" 4 -.IX Item "EVBACKEND_EPOLL (value 4, Linux)" -Use the Linux-specific \fBepoll\fR\|(7) interface (for both pre\- and post\-2.6.9 -kernels). -.Sp -For few fds, this backend is a bit little slower than poll and select, but -it scales phenomenally better. While poll and select usually scale like -O(total_fds) where total_fds is the total number of fds (or the highest -fd), epoll scales either O(1) or O(active_fds). -.Sp -The epoll mechanism deserves honorable mention as the most misdesigned -of the more advanced event mechanisms: mere annoyances include silently -dropping file descriptors, requiring a system call per change per file -descriptor (and unnecessary guessing of parameters), problems with dup, -returning before the timeout value, resulting in additional iterations -(and only giving 5ms accuracy while select on the same platform gives -0.1ms) and so on. The biggest issue is fork races, however \- if a program -forks then \fIboth\fR parent and child process have to recreate the epoll -set, which can take considerable time (one syscall per file descriptor) -and is of course hard to detect. -.Sp -Epoll is also notoriously buggy \- embedding epoll fds \fIshould\fR work, -but of course \fIdoesn't\fR, and epoll just loves to report events for -totally \fIdifferent\fR file descriptors (even already closed ones, so -one cannot even remove them from the set) than registered in the set -(especially on \s-1SMP\s0 systems). Libev tries to counter these spurious -notifications by employing an additional generation counter and comparing -that against the events to filter out spurious ones, recreating the set -when required. Epoll also erroneously rounds down timeouts, but gives you -no way to know when and by how much, so sometimes you have to busy-wait -because epoll returns immediately despite a nonzero timeout. And last -not least, it also refuses to work with some file descriptors which work -perfectly fine with \f(CW\*(C`select\*(C'\fR (files, many character devices...). -.Sp -Epoll is truly the train wreck among event poll mechanisms, a frankenpoll, -cobbled together in a hurry, no thought to design or interaction with -others. Oh, the pain, will it ever stop... -.Sp -While stopping, setting and starting an I/O watcher in the same iteration -will result in some caching, there is still a system call per such -incident (because the same \fIfile descriptor\fR could point to a different -\&\fIfile description\fR now), so its best to avoid that. Also, \f(CW\*(C`dup ()\*(C'\fR'ed -file descriptors might not work very well if you register events for both -file descriptors. -.Sp -Best performance from this backend is achieved by not unregistering all -watchers for a file descriptor until it has been closed, if possible, -i.e. keep at least one watcher active per fd at all times. Stopping and -starting a watcher (without re-setting it) also usually doesn't cause -extra overhead. A fork can both result in spurious notifications as well -as in libev having to destroy and recreate the epoll object, which can -take considerable time and thus should be avoided. -.Sp -All this means that, in practice, \f(CW\*(C`EVBACKEND_SELECT\*(C'\fR can be as fast or -faster than epoll for maybe up to a hundred file descriptors, depending on -the usage. So sad. -.Sp -While nominally embeddable in other event loops, this feature is broken in -a lot of kernel revisions, but probably(!) works in current versions. -.Sp -This backend maps \f(CW\*(C`EV_READ\*(C'\fR and \f(CW\*(C`EV_WRITE\*(C'\fR in the same way as -\&\f(CW\*(C`EVBACKEND_POLL\*(C'\fR. -.ie n .IP """EVBACKEND_LINUXAIO"" (value 64, Linux)" 4 -.el .IP "\f(CWEVBACKEND_LINUXAIO\fR (value 64, Linux)" 4 -.IX Item "EVBACKEND_LINUXAIO (value 64, Linux)" -Use the Linux-specific Linux \s-1AIO\s0 (\fInot\fR \f(CWaio(7)\fR but \f(CWio_submit(2)\fR) event interface available in post\-4.18 kernels (but libev -only tries to use it in 4.19+). -.Sp -This is another Linux train wreck of an event interface. -.Sp -If this backend works for you (as of this writing, it was very -experimental), it is the best event interface available on Linux and might -be well worth enabling it \- if it isn't available in your kernel this will -be detected and this backend will be skipped. -.Sp -This backend can batch oneshot requests and supports a user-space ring -buffer to receive events. It also doesn't suffer from most of the design -problems of epoll (such as not being able to remove event sources from -the epoll set), and generally sounds too good to be true. Because, this -being the Linux kernel, of course it suffers from a whole new set of -limitations, forcing you to fall back to epoll, inheriting all its design -issues. -.Sp -For one, it is not easily embeddable (but probably could be done using -an event fd at some extra overhead). It also is subject to a system wide -limit that can be configured in \fI/proc/sys/fs/aio\-max\-nr\fR. If no \s-1AIO\s0 -requests are left, this backend will be skipped during initialisation, and -will switch to epoll when the loop is active. -.Sp -Most problematic in practice, however, is that not all file descriptors -work with it. For example, in Linux 5.1, \s-1TCP\s0 sockets, pipes, event fds, -files, \fI/dev/null\fR and many others are supported, but ttys do not work -properly (a known bug that the kernel developers don't care about, see -), so this is not -(yet?) a generic event polling interface. -.Sp -Overall, it seems the Linux developers just don't want it to have a -generic event handling mechanism other than \f(CW\*(C`select\*(C'\fR or \f(CW\*(C`poll\*(C'\fR. -.Sp -To work around all these problem, the current version of libev uses its -epoll backend as a fallback for file descriptor types that do not work. Or -falls back completely to epoll if the kernel acts up. -.Sp -This backend maps \f(CW\*(C`EV_READ\*(C'\fR and \f(CW\*(C`EV_WRITE\*(C'\fR in the same way as -\&\f(CW\*(C`EVBACKEND_POLL\*(C'\fR. -.ie n .IP """EVBACKEND_KQUEUE"" (value 8, most \s-1BSD\s0 clones)" 4 -.el .IP "\f(CWEVBACKEND_KQUEUE\fR (value 8, most \s-1BSD\s0 clones)" 4 -.IX Item "EVBACKEND_KQUEUE (value 8, most BSD clones)" -Kqueue deserves special mention, as at the time this backend was -implemented, it was broken on all BSDs except NetBSD (usually it doesn't -work reliably with anything but sockets and pipes, except on Darwin, -where of course it's completely useless). Unlike epoll, however, whose -brokenness is by design, these kqueue bugs can be (and mostly have been) -fixed without \s-1API\s0 changes to existing programs. For this reason it's not -being \*(L"auto-detected\*(R" on all platforms unless you explicitly specify it -in the flags (i.e. using \f(CW\*(C`EVBACKEND_KQUEUE\*(C'\fR) or libev was compiled on a -known-to-be-good (\-enough) system like NetBSD. -.Sp -You still can embed kqueue into a normal poll or select backend and use it -only for sockets (after having made sure that sockets work with kqueue on -the target platform). See \f(CW\*(C`ev_embed\*(C'\fR watchers for more info. -.Sp -It scales in the same way as the epoll backend, but the interface to the -kernel is more efficient (which says nothing about its actual speed, of -course). While stopping, setting and starting an I/O watcher does never -cause an extra system call as with \f(CW\*(C`EVBACKEND_EPOLL\*(C'\fR, it still adds up to -two event changes per incident. Support for \f(CW\*(C`fork ()\*(C'\fR is very bad (you -might have to leak fds on fork, but it's more sane than epoll) and it -drops fds silently in similarly hard-to-detect cases. -.Sp -This backend usually performs well under most conditions. -.Sp -While nominally embeddable in other event loops, this doesn't work -everywhere, so you might need to test for this. And since it is broken -almost everywhere, you should only use it when you have a lot of sockets -(for which it usually works), by embedding it into another event loop -(e.g. \f(CW\*(C`EVBACKEND_SELECT\*(C'\fR or \f(CW\*(C`EVBACKEND_POLL\*(C'\fR (but \f(CW\*(C`poll\*(C'\fR is of course -also broken on \s-1OS X\s0)) and, did I mention it, using it only for sockets. -.Sp -This backend maps \f(CW\*(C`EV_READ\*(C'\fR into an \f(CW\*(C`EVFILT_READ\*(C'\fR kevent with -\&\f(CW\*(C`NOTE_EOF\*(C'\fR, and \f(CW\*(C`EV_WRITE\*(C'\fR into an \f(CW\*(C`EVFILT_WRITE\*(C'\fR kevent with -\&\f(CW\*(C`NOTE_EOF\*(C'\fR. -.ie n .IP """EVBACKEND_DEVPOLL"" (value 16, Solaris 8)" 4 -.el .IP "\f(CWEVBACKEND_DEVPOLL\fR (value 16, Solaris 8)" 4 -.IX Item "EVBACKEND_DEVPOLL (value 16, Solaris 8)" -This is not implemented yet (and might never be, unless you send me an -implementation). According to reports, \f(CW\*(C`/dev/poll\*(C'\fR only supports sockets -and is not embeddable, which would limit the usefulness of this backend -immensely. -.ie n .IP """EVBACKEND_PORT"" (value 32, Solaris 10)" 4 -.el .IP "\f(CWEVBACKEND_PORT\fR (value 32, Solaris 10)" 4 -.IX Item "EVBACKEND_PORT (value 32, Solaris 10)" -This uses the Solaris 10 event port mechanism. As with everything on Solaris, -it's really slow, but it still scales very well (O(active_fds)). -.Sp -While this backend scales well, it requires one system call per active -file descriptor per loop iteration. For small and medium numbers of file -descriptors a \*(L"slow\*(R" \f(CW\*(C`EVBACKEND_SELECT\*(C'\fR or \f(CW\*(C`EVBACKEND_POLL\*(C'\fR backend -might perform better. -.Sp -On the positive side, this backend actually performed fully to -specification in all tests and is fully embeddable, which is a rare feat -among the OS-specific backends (I vastly prefer correctness over speed -hacks). -.Sp -On the negative side, the interface is \fIbizarre\fR \- so bizarre that -even sun itself gets it wrong in their code examples: The event polling -function sometimes returns events to the caller even though an error -occurred, but with no indication whether it has done so or not (yes, it's -even documented that way) \- deadly for edge-triggered interfaces where you -absolutely have to know whether an event occurred or not because you have -to re-arm the watcher. -.Sp -Fortunately libev seems to be able to work around these idiocies. -.Sp -This backend maps \f(CW\*(C`EV_READ\*(C'\fR and \f(CW\*(C`EV_WRITE\*(C'\fR in the same way as -\&\f(CW\*(C`EVBACKEND_POLL\*(C'\fR. -.ie n .IP """EVBACKEND_ALL""" 4 -.el .IP "\f(CWEVBACKEND_ALL\fR" 4 -.IX Item "EVBACKEND_ALL" -Try all backends (even potentially broken ones that wouldn't be tried -with \f(CW\*(C`EVFLAG_AUTO\*(C'\fR). Since this is a mask, you can do stuff such as -\&\f(CW\*(C`EVBACKEND_ALL & ~EVBACKEND_KQUEUE\*(C'\fR. -.Sp -It is definitely not recommended to use this flag, use whatever -\&\f(CW\*(C`ev_recommended_backends ()\*(C'\fR returns, or simply do not specify a backend -at all. -.ie n .IP """EVBACKEND_MASK""" 4 -.el .IP "\f(CWEVBACKEND_MASK\fR" 4 -.IX Item "EVBACKEND_MASK" -Not a backend at all, but a mask to select all backend bits from a -\&\f(CW\*(C`flags\*(C'\fR value, in case you want to mask out any backends from a flags -value (e.g. when modifying the \f(CW\*(C`LIBEV_FLAGS\*(C'\fR environment variable). -.RE -.RS 4 -.Sp -If one or more of the backend flags are or'ed into the flags value, -then only these backends will be tried (in the reverse order as listed -here). If none are specified, all backends in \f(CW\*(C`ev_recommended_backends -()\*(C'\fR will be tried. -.Sp -Example: Try to create a event loop that uses epoll and nothing else. -.Sp -.Vb 3 -\& struct ev_loop *epoller = ev_loop_new (EVBACKEND_EPOLL | EVFLAG_NOENV); -\& if (!epoller) -\& fatal ("no epoll found here, maybe it hides under your chair"); -.Ve -.Sp -Example: Use whatever libev has to offer, but make sure that kqueue is -used if available. -.Sp -.Vb 1 -\& struct ev_loop *loop = ev_loop_new (ev_recommended_backends () | EVBACKEND_KQUEUE); -.Ve -.Sp -Example: Similarly, on linux, you mgiht want to take advantage of the -linux aio backend if possible, but fall back to something else if that -isn't available. -.Sp -.Vb 1 -\& struct ev_loop *loop = ev_loop_new (ev_recommended_backends () | EVBACKEND_LINUXAIO); -.Ve -.RE -.IP "ev_loop_destroy (loop)" 4 -.IX Item "ev_loop_destroy (loop)" -Destroys an event loop object (frees all memory and kernel state -etc.). None of the active event watchers will be stopped in the normal -sense, so e.g. \f(CW\*(C`ev_is_active\*(C'\fR might still return true. It is your -responsibility to either stop all watchers cleanly yourself \fIbefore\fR -calling this function, or cope with the fact afterwards (which is usually -the easiest thing, you can just ignore the watchers and/or \f(CW\*(C`free ()\*(C'\fR them -for example). -.Sp -Note that certain global state, such as signal state (and installed signal -handlers), will not be freed by this function, and related watchers (such -as signal and child watchers) would need to be stopped manually. -.Sp -This function is normally used on loop objects allocated by -\&\f(CW\*(C`ev_loop_new\*(C'\fR, but it can also be used on the default loop returned by -\&\f(CW\*(C`ev_default_loop\*(C'\fR, in which case it is not thread-safe. -.Sp -Note that it is not advisable to call this function on the default loop -except in the rare occasion where you really need to free its resources. -If you need dynamically allocated loops it is better to use \f(CW\*(C`ev_loop_new\*(C'\fR -and \f(CW\*(C`ev_loop_destroy\*(C'\fR. -.IP "ev_loop_fork (loop)" 4 -.IX Item "ev_loop_fork (loop)" -This function sets a flag that causes subsequent \f(CW\*(C`ev_run\*(C'\fR iterations -to reinitialise the kernel state for backends that have one. Despite -the name, you can call it anytime you are allowed to start or stop -watchers (except inside an \f(CW\*(C`ev_prepare\*(C'\fR callback), but it makes most -sense after forking, in the child process. You \fImust\fR call it (or use -\&\f(CW\*(C`EVFLAG_FORKCHECK\*(C'\fR) in the child before resuming or calling \f(CW\*(C`ev_run\*(C'\fR. -.Sp -In addition, if you want to reuse a loop (via this function or -\&\f(CW\*(C`EVFLAG_FORKCHECK\*(C'\fR), you \fIalso\fR have to ignore \f(CW\*(C`SIGPIPE\*(C'\fR. -.Sp -Again, you \fIhave\fR to call it on \fIany\fR loop that you want to re-use after -a fork, \fIeven if you do not plan to use the loop in the parent\fR. This is -because some kernel interfaces *cough* \fIkqueue\fR *cough* do funny things -during fork. -.Sp -On the other hand, you only need to call this function in the child -process if and only if you want to use the event loop in the child. If -you just fork+exec or create a new loop in the child, you don't have to -call it at all (in fact, \f(CW\*(C`epoll\*(C'\fR is so badly broken that it makes a -difference, but libev will usually detect this case on its own and do a -costly reset of the backend). -.Sp -The function itself is quite fast and it's usually not a problem to call -it just in case after a fork. -.Sp -Example: Automate calling \f(CW\*(C`ev_loop_fork\*(C'\fR on the default loop when -using pthreads. -.Sp -.Vb 5 -\& static void -\& post_fork_child (void) -\& { -\& ev_loop_fork (EV_DEFAULT); -\& } -\& -\& ... -\& pthread_atfork (0, 0, post_fork_child); -.Ve -.IP "int ev_is_default_loop (loop)" 4 -.IX Item "int ev_is_default_loop (loop)" -Returns true when the given loop is, in fact, the default loop, and false -otherwise. -.IP "unsigned int ev_iteration (loop)" 4 -.IX Item "unsigned int ev_iteration (loop)" -Returns the current iteration count for the event loop, which is identical -to the number of times libev did poll for new events. It starts at \f(CW0\fR -and happily wraps around with enough iterations. -.Sp -This value can sometimes be useful as a generation counter of sorts (it -\&\*(L"ticks\*(R" the number of loop iterations), as it roughly corresponds with -\&\f(CW\*(C`ev_prepare\*(C'\fR and \f(CW\*(C`ev_check\*(C'\fR calls \- and is incremented between the -prepare and check phases. -.IP "unsigned int ev_depth (loop)" 4 -.IX Item "unsigned int ev_depth (loop)" -Returns the number of times \f(CW\*(C`ev_run\*(C'\fR was entered minus the number of -times \f(CW\*(C`ev_run\*(C'\fR was exited normally, in other words, the recursion depth. -.Sp -Outside \f(CW\*(C`ev_run\*(C'\fR, this number is zero. In a callback, this number is -\&\f(CW1\fR, unless \f(CW\*(C`ev_run\*(C'\fR was invoked recursively (or from another thread), -in which case it is higher. -.Sp -Leaving \f(CW\*(C`ev_run\*(C'\fR abnormally (setjmp/longjmp, cancelling the thread, -throwing an exception etc.), doesn't count as \*(L"exit\*(R" \- consider this -as a hint to avoid such ungentleman-like behaviour unless it's really -convenient, in which case it is fully supported. -.IP "unsigned int ev_backend (loop)" 4 -.IX Item "unsigned int ev_backend (loop)" -Returns one of the \f(CW\*(C`EVBACKEND_*\*(C'\fR flags indicating the event backend in -use. -.IP "ev_tstamp ev_now (loop)" 4 -.IX Item "ev_tstamp ev_now (loop)" -Returns the current \*(L"event loop time\*(R", which is the time the event loop -received events and started processing them. This timestamp does not -change as long as callbacks are being processed, and this is also the base -time used for relative timers. You can treat it as the timestamp of the -event occurring (or more correctly, libev finding out about it). -.IP "ev_now_update (loop)" 4 -.IX Item "ev_now_update (loop)" -Establishes the current time by querying the kernel, updating the time -returned by \f(CW\*(C`ev_now ()\*(C'\fR in the progress. This is a costly operation and -is usually done automatically within \f(CW\*(C`ev_run ()\*(C'\fR. -.Sp -This function is rarely useful, but when some event callback runs for a -very long time without entering the event loop, updating libev's idea of -the current time is a good idea. -.Sp -See also \*(L"The special problem of time updates\*(R" in the \f(CW\*(C`ev_timer\*(C'\fR section. -.IP "ev_suspend (loop)" 4 -.IX Item "ev_suspend (loop)" -.PD 0 -.IP "ev_resume (loop)" 4 -.IX Item "ev_resume (loop)" -.PD -These two functions suspend and resume an event loop, for use when the -loop is not used for a while and timeouts should not be processed. -.Sp -A typical use case would be an interactive program such as a game: When -the user presses \f(CW\*(C`^Z\*(C'\fR to suspend the game and resumes it an hour later it -would be best to handle timeouts as if no time had actually passed while -the program was suspended. This can be achieved by calling \f(CW\*(C`ev_suspend\*(C'\fR -in your \f(CW\*(C`SIGTSTP\*(C'\fR handler, sending yourself a \f(CW\*(C`SIGSTOP\*(C'\fR and calling -\&\f(CW\*(C`ev_resume\*(C'\fR directly afterwards to resume timer processing. -.Sp -Effectively, all \f(CW\*(C`ev_timer\*(C'\fR watchers will be delayed by the time spend -between \f(CW\*(C`ev_suspend\*(C'\fR and \f(CW\*(C`ev_resume\*(C'\fR, and all \f(CW\*(C`ev_periodic\*(C'\fR watchers -will be rescheduled (that is, they will lose any events that would have -occurred while suspended). -.Sp -After calling \f(CW\*(C`ev_suspend\*(C'\fR you \fBmust not\fR call \fIany\fR function on the -given loop other than \f(CW\*(C`ev_resume\*(C'\fR, and you \fBmust not\fR call \f(CW\*(C`ev_resume\*(C'\fR -without a previous call to \f(CW\*(C`ev_suspend\*(C'\fR. -.Sp -Calling \f(CW\*(C`ev_suspend\*(C'\fR/\f(CW\*(C`ev_resume\*(C'\fR has the side effect of updating the -event loop time (see \f(CW\*(C`ev_now_update\*(C'\fR). -.IP "bool ev_run (loop, int flags)" 4 -.IX Item "bool ev_run (loop, int flags)" -Finally, this is it, the event handler. This function usually is called -after you have initialised all your watchers and you want to start -handling events. It will ask the operating system for any new events, call -the watcher callbacks, and then repeat the whole process indefinitely: This -is why event loops are called \fIloops\fR. -.Sp -If the flags argument is specified as \f(CW0\fR, it will keep handling events -until either no event watchers are active anymore or \f(CW\*(C`ev_break\*(C'\fR was -called. -.Sp -The return value is false if there are no more active watchers (which -usually means \*(L"all jobs done\*(R" or \*(L"deadlock\*(R"), and true in all other cases -(which usually means " you should call \f(CW\*(C`ev_run\*(C'\fR again"). -.Sp -Please note that an explicit \f(CW\*(C`ev_break\*(C'\fR is usually better than -relying on all watchers to be stopped when deciding when a program has -finished (especially in interactive programs), but having a program -that automatically loops as long as it has to and no longer by virtue -of relying on its watchers stopping correctly, that is truly a thing of -beauty. -.Sp -This function is \fImostly\fR exception-safe \- you can break out of a -\&\f(CW\*(C`ev_run\*(C'\fR call by calling \f(CW\*(C`longjmp\*(C'\fR in a callback, throwing a \*(C+ -exception and so on. This does not decrement the \f(CW\*(C`ev_depth\*(C'\fR value, nor -will it clear any outstanding \f(CW\*(C`EVBREAK_ONE\*(C'\fR breaks. -.Sp -A flags value of \f(CW\*(C`EVRUN_NOWAIT\*(C'\fR will look for new events, will handle -those events and any already outstanding ones, but will not wait and -block your process in case there are no events and will return after one -iteration of the loop. This is sometimes useful to poll and handle new -events while doing lengthy calculations, to keep the program responsive. -.Sp -A flags value of \f(CW\*(C`EVRUN_ONCE\*(C'\fR will look for new events (waiting if -necessary) and will handle those and any already outstanding ones. It -will block your process until at least one new event arrives (which could -be an event internal to libev itself, so there is no guarantee that a -user-registered callback will be called), and will return after one -iteration of the loop. -.Sp -This is useful if you are waiting for some external event in conjunction -with something not expressible using other libev watchers (i.e. "roll your -own \f(CW\*(C`ev_run\*(C'\fR"). However, a pair of \f(CW\*(C`ev_prepare\*(C'\fR/\f(CW\*(C`ev_check\*(C'\fR watchers is -usually a better approach for this kind of thing. -.Sp -Here are the gory details of what \f(CW\*(C`ev_run\*(C'\fR does (this is for your -understanding, not a guarantee that things will work exactly like this in -future versions): -.Sp -.Vb 10 -\& \- Increment loop depth. -\& \- Reset the ev_break status. -\& \- Before the first iteration, call any pending watchers. -\& LOOP: -\& \- If EVFLAG_FORKCHECK was used, check for a fork. -\& \- If a fork was detected (by any means), queue and call all fork watchers. -\& \- Queue and call all prepare watchers. -\& \- If ev_break was called, goto FINISH. -\& \- If we have been forked, detach and recreate the kernel state -\& as to not disturb the other process. -\& \- Update the kernel state with all outstanding changes. -\& \- Update the "event loop time" (ev_now ()). -\& \- Calculate for how long to sleep or block, if at all -\& (active idle watchers, EVRUN_NOWAIT or not having -\& any active watchers at all will result in not sleeping). -\& \- Sleep if the I/O and timer collect interval say so. -\& \- Increment loop iteration counter. -\& \- Block the process, waiting for any events. -\& \- Queue all outstanding I/O (fd) events. -\& \- Update the "event loop time" (ev_now ()), and do time jump adjustments. -\& \- Queue all expired timers. -\& \- Queue all expired periodics. -\& \- Queue all idle watchers with priority higher than that of pending events. -\& \- Queue all check watchers. -\& \- Call all queued watchers in reverse order (i.e. check watchers first). -\& Signals and child watchers are implemented as I/O watchers, and will -\& be handled here by queueing them when their watcher gets executed. -\& \- If ev_break has been called, or EVRUN_ONCE or EVRUN_NOWAIT -\& were used, or there are no active watchers, goto FINISH, otherwise -\& continue with step LOOP. -\& FINISH: -\& \- Reset the ev_break status iff it was EVBREAK_ONE. -\& \- Decrement the loop depth. -\& \- Return. -.Ve -.Sp -Example: Queue some jobs and then loop until no events are outstanding -anymore. -.Sp -.Vb 4 -\& ... queue jobs here, make sure they register event watchers as long -\& ... as they still have work to do (even an idle watcher will do..) -\& ev_run (my_loop, 0); -\& ... jobs done or somebody called break. yeah! -.Ve -.IP "ev_break (loop, how)" 4 -.IX Item "ev_break (loop, how)" -Can be used to make a call to \f(CW\*(C`ev_run\*(C'\fR return early (but only after it -has processed all outstanding events). The \f(CW\*(C`how\*(C'\fR argument must be either -\&\f(CW\*(C`EVBREAK_ONE\*(C'\fR, which will make the innermost \f(CW\*(C`ev_run\*(C'\fR call return, or -\&\f(CW\*(C`EVBREAK_ALL\*(C'\fR, which will make all nested \f(CW\*(C`ev_run\*(C'\fR calls return. -.Sp -This \*(L"break state\*(R" will be cleared on the next call to \f(CW\*(C`ev_run\*(C'\fR. -.Sp -It is safe to call \f(CW\*(C`ev_break\*(C'\fR from outside any \f(CW\*(C`ev_run\*(C'\fR calls, too, in -which case it will have no effect. -.IP "ev_ref (loop)" 4 -.IX Item "ev_ref (loop)" -.PD 0 -.IP "ev_unref (loop)" 4 -.IX Item "ev_unref (loop)" -.PD -Ref/unref can be used to add or remove a reference count on the event -loop: Every watcher keeps one reference, and as long as the reference -count is nonzero, \f(CW\*(C`ev_run\*(C'\fR will not return on its own. -.Sp -This is useful when you have a watcher that you never intend to -unregister, but that nevertheless should not keep \f(CW\*(C`ev_run\*(C'\fR from -returning. In such a case, call \f(CW\*(C`ev_unref\*(C'\fR after starting, and \f(CW\*(C`ev_ref\*(C'\fR -before stopping it. -.Sp -As an example, libev itself uses this for its internal signal pipe: It -is not visible to the libev user and should not keep \f(CW\*(C`ev_run\*(C'\fR from -exiting if no event watchers registered by it are active. It is also an -excellent way to do this for generic recurring timers or from within -third-party libraries. Just remember to \fIunref after start\fR and \fIref -before stop\fR (but only if the watcher wasn't active before, or was active -before, respectively. Note also that libev might stop watchers itself -(e.g. non-repeating timers) in which case you have to \f(CW\*(C`ev_ref\*(C'\fR -in the callback). -.Sp -Example: Create a signal watcher, but keep it from keeping \f(CW\*(C`ev_run\*(C'\fR -running when nothing else is active. -.Sp -.Vb 4 -\& ev_signal exitsig; -\& ev_signal_init (&exitsig, sig_cb, SIGINT); -\& ev_signal_start (loop, &exitsig); -\& ev_unref (loop); -.Ve -.Sp -Example: For some weird reason, unregister the above signal handler again. -.Sp -.Vb 2 -\& ev_ref (loop); -\& ev_signal_stop (loop, &exitsig); -.Ve -.IP "ev_set_io_collect_interval (loop, ev_tstamp interval)" 4 -.IX Item "ev_set_io_collect_interval (loop, ev_tstamp interval)" -.PD 0 -.IP "ev_set_timeout_collect_interval (loop, ev_tstamp interval)" 4 -.IX Item "ev_set_timeout_collect_interval (loop, ev_tstamp interval)" -.PD -These advanced functions influence the time that libev will spend waiting -for events. Both time intervals are by default \f(CW0\fR, meaning that libev -will try to invoke timer/periodic callbacks and I/O callbacks with minimum -latency. -.Sp -Setting these to a higher value (the \f(CW\*(C`interval\*(C'\fR \fImust\fR be >= \f(CW0\fR) -allows libev to delay invocation of I/O and timer/periodic callbacks -to increase efficiency of loop iterations (or to increase power-saving -opportunities). -.Sp -The idea is that sometimes your program runs just fast enough to handle -one (or very few) event(s) per loop iteration. While this makes the -program responsive, it also wastes a lot of \s-1CPU\s0 time to poll for new -events, especially with backends like \f(CW\*(C`select ()\*(C'\fR which have a high -overhead for the actual polling but can deliver many events at once. -.Sp -By setting a higher \fIio collect interval\fR you allow libev to spend more -time collecting I/O events, so you can handle more events per iteration, -at the cost of increasing latency. Timeouts (both \f(CW\*(C`ev_periodic\*(C'\fR and -\&\f(CW\*(C`ev_timer\*(C'\fR) will not be affected. Setting this to a non-null value will -introduce an additional \f(CW\*(C`ev_sleep ()\*(C'\fR call into most loop iterations. The -sleep time ensures that libev will not poll for I/O events more often then -once per this interval, on average (as long as the host time resolution is -good enough). -.Sp -Likewise, by setting a higher \fItimeout collect interval\fR you allow libev -to spend more time collecting timeouts, at the expense of increased -latency/jitter/inexactness (the watcher callback will be called -later). \f(CW\*(C`ev_io\*(C'\fR watchers will not be affected. Setting this to a non-null -value will not introduce any overhead in libev. -.Sp -Many (busy) programs can usually benefit by setting the I/O collect -interval to a value near \f(CW0.1\fR or so, which is often enough for -interactive servers (of course not for games), likewise for timeouts. It -usually doesn't make much sense to set it to a lower value than \f(CW0.01\fR, -as this approaches the timing granularity of most systems. Note that if -you do transactions with the outside world and you can't increase the -parallelity, then this setting will limit your transaction rate (if you -need to poll once per transaction and the I/O collect interval is 0.01, -then you can't do more than 100 transactions per second). -.Sp -Setting the \fItimeout collect interval\fR can improve the opportunity for -saving power, as the program will \*(L"bundle\*(R" timer callback invocations that -are \*(L"near\*(R" in time together, by delaying some, thus reducing the number of -times the process sleeps and wakes up again. Another useful technique to -reduce iterations/wake\-ups is to use \f(CW\*(C`ev_periodic\*(C'\fR watchers and make sure -they fire on, say, one-second boundaries only. -.Sp -Example: we only need 0.1s timeout granularity, and we wish not to poll -more often than 100 times per second: -.Sp -.Vb 2 -\& ev_set_timeout_collect_interval (EV_DEFAULT_UC_ 0.1); -\& ev_set_io_collect_interval (EV_DEFAULT_UC_ 0.01); -.Ve -.IP "ev_invoke_pending (loop)" 4 -.IX Item "ev_invoke_pending (loop)" -This call will simply invoke all pending watchers while resetting their -pending state. Normally, \f(CW\*(C`ev_run\*(C'\fR does this automatically when required, -but when overriding the invoke callback this call comes handy. This -function can be invoked from a watcher \- this can be useful for example -when you want to do some lengthy calculation and want to pass further -event handling to another thread (you still have to make sure only one -thread executes within \f(CW\*(C`ev_invoke_pending\*(C'\fR or \f(CW\*(C`ev_run\*(C'\fR of course). -.IP "int ev_pending_count (loop)" 4 -.IX Item "int ev_pending_count (loop)" -Returns the number of pending watchers \- zero indicates that no watchers -are pending. -.IP "ev_set_invoke_pending_cb (loop, void (*invoke_pending_cb)(\s-1EV_P\s0))" 4 -.IX Item "ev_set_invoke_pending_cb (loop, void (*invoke_pending_cb)(EV_P))" -This overrides the invoke pending functionality of the loop: Instead of -invoking all pending watchers when there are any, \f(CW\*(C`ev_run\*(C'\fR will call -this callback instead. This is useful, for example, when you want to -invoke the actual watchers inside another context (another thread etc.). -.Sp -If you want to reset the callback, use \f(CW\*(C`ev_invoke_pending\*(C'\fR as new -callback. -.IP "ev_set_loop_release_cb (loop, void (*release)(\s-1EV_P\s0) throw (), void (*acquire)(\s-1EV_P\s0) throw ())" 4 -.IX Item "ev_set_loop_release_cb (loop, void (*release)(EV_P) throw (), void (*acquire)(EV_P) throw ())" -Sometimes you want to share the same loop between multiple threads. This -can be done relatively simply by putting mutex_lock/unlock calls around -each call to a libev function. -.Sp -However, \f(CW\*(C`ev_run\*(C'\fR can run an indefinite time, so it is not feasible -to wait for it to return. One way around this is to wake up the event -loop via \f(CW\*(C`ev_break\*(C'\fR and \f(CW\*(C`ev_async_send\*(C'\fR, another way is to set these -\&\fIrelease\fR and \fIacquire\fR callbacks on the loop. -.Sp -When set, then \f(CW\*(C`release\*(C'\fR will be called just before the thread is -suspended waiting for new events, and \f(CW\*(C`acquire\*(C'\fR is called just -afterwards. -.Sp -Ideally, \f(CW\*(C`release\*(C'\fR will just call your mutex_unlock function, and -\&\f(CW\*(C`acquire\*(C'\fR will just call the mutex_lock function again. -.Sp -While event loop modifications are allowed between invocations of -\&\f(CW\*(C`release\*(C'\fR and \f(CW\*(C`acquire\*(C'\fR (that's their only purpose after all), no -modifications done will affect the event loop, i.e. adding watchers will -have no effect on the set of file descriptors being watched, or the time -waited. Use an \f(CW\*(C`ev_async\*(C'\fR watcher to wake up \f(CW\*(C`ev_run\*(C'\fR when you want it -to take note of any changes you made. -.Sp -In theory, threads executing \f(CW\*(C`ev_run\*(C'\fR will be async-cancel safe between -invocations of \f(CW\*(C`release\*(C'\fR and \f(CW\*(C`acquire\*(C'\fR. -.Sp -See also the locking example in the \f(CW\*(C`THREADS\*(C'\fR section later in this -document. -.IP "ev_set_userdata (loop, void *data)" 4 -.IX Item "ev_set_userdata (loop, void *data)" -.PD 0 -.IP "void *ev_userdata (loop)" 4 -.IX Item "void *ev_userdata (loop)" -.PD -Set and retrieve a single \f(CW\*(C`void *\*(C'\fR associated with a loop. When -\&\f(CW\*(C`ev_set_userdata\*(C'\fR has never been called, then \f(CW\*(C`ev_userdata\*(C'\fR returns -\&\f(CW0\fR. -.Sp -These two functions can be used to associate arbitrary data with a loop, -and are intended solely for the \f(CW\*(C`invoke_pending_cb\*(C'\fR, \f(CW\*(C`release\*(C'\fR and -\&\f(CW\*(C`acquire\*(C'\fR callbacks described above, but of course can be (ab\-)used for -any other purpose as well. -.IP "ev_verify (loop)" 4 -.IX Item "ev_verify (loop)" -This function only does something when \f(CW\*(C`EV_VERIFY\*(C'\fR support has been -compiled in, which is the default for non-minimal builds. It tries to go -through all internal structures and checks them for validity. If anything -is found to be inconsistent, it will print an error message to standard -error and call \f(CW\*(C`abort ()\*(C'\fR. -.Sp -This can be used to catch bugs inside libev itself: under normal -circumstances, this function will never abort as of course libev keeps its -data structures consistent. -.SH "ANATOMY OF A WATCHER" -.IX Header "ANATOMY OF A WATCHER" -In the following description, uppercase \f(CW\*(C`TYPE\*(C'\fR in names stands for the -watcher type, e.g. \f(CW\*(C`ev_TYPE_start\*(C'\fR can mean \f(CW\*(C`ev_timer_start\*(C'\fR for timer -watchers and \f(CW\*(C`ev_io_start\*(C'\fR for I/O watchers. -.PP -A watcher is an opaque structure that you allocate and register to record -your interest in some event. To make a concrete example, imagine you want -to wait for \s-1STDIN\s0 to become readable, you would create an \f(CW\*(C`ev_io\*(C'\fR watcher -for that: -.PP -.Vb 5 -\& static void my_cb (struct ev_loop *loop, ev_io *w, int revents) -\& { -\& ev_io_stop (w); -\& ev_break (loop, EVBREAK_ALL); -\& } -\& -\& struct ev_loop *loop = ev_default_loop (0); -\& -\& ev_io stdin_watcher; -\& -\& ev_init (&stdin_watcher, my_cb); -\& ev_io_set (&stdin_watcher, STDIN_FILENO, EV_READ); -\& ev_io_start (loop, &stdin_watcher); -\& -\& ev_run (loop, 0); -.Ve -.PP -As you can see, you are responsible for allocating the memory for your -watcher structures (and it is \fIusually\fR a bad idea to do this on the -stack). -.PP -Each watcher has an associated watcher structure (called \f(CW\*(C`struct ev_TYPE\*(C'\fR -or simply \f(CW\*(C`ev_TYPE\*(C'\fR, as typedefs are provided for all watcher structs). -.PP -Each watcher structure must be initialised by a call to \f(CW\*(C`ev_init (watcher -*, callback)\*(C'\fR, which expects a callback to be provided. This callback is -invoked each time the event occurs (or, in the case of I/O watchers, each -time the event loop detects that the file descriptor given is readable -and/or writable). -.PP -Each watcher type further has its own \f(CW\*(C`ev_TYPE_set (watcher *, ...)\*(C'\fR -macro to configure it, with arguments specific to the watcher type. There -is also a macro to combine initialisation and setting in one call: \f(CW\*(C`ev_TYPE_init (watcher *, callback, ...)\*(C'\fR. -.PP -To make the watcher actually watch out for events, you have to start it -with a watcher-specific start function (\f(CW\*(C`ev_TYPE_start (loop, watcher -*)\*(C'\fR), and you can stop watching for events at any time by calling the -corresponding stop function (\f(CW\*(C`ev_TYPE_stop (loop, watcher *)\*(C'\fR. -.PP -As long as your watcher is active (has been started but not stopped) you -must not touch the values stored in it except when explicitly documented -otherwise. Most specifically you must never reinitialise it or call its -\&\f(CW\*(C`ev_TYPE_set\*(C'\fR macro. -.PP -Each and every callback receives the event loop pointer as first, the -registered watcher structure as second, and a bitset of received events as -third argument. -.PP -The received events usually include a single bit per event type received -(you can receive multiple events at the same time). The possible bit masks -are: -.ie n .IP """EV_READ""" 4 -.el .IP "\f(CWEV_READ\fR" 4 -.IX Item "EV_READ" -.PD 0 -.ie n .IP """EV_WRITE""" 4 -.el .IP "\f(CWEV_WRITE\fR" 4 -.IX Item "EV_WRITE" -.PD -The file descriptor in the \f(CW\*(C`ev_io\*(C'\fR watcher has become readable and/or -writable. -.ie n .IP """EV_TIMER""" 4 -.el .IP "\f(CWEV_TIMER\fR" 4 -.IX Item "EV_TIMER" -The \f(CW\*(C`ev_timer\*(C'\fR watcher has timed out. -.ie n .IP """EV_PERIODIC""" 4 -.el .IP "\f(CWEV_PERIODIC\fR" 4 -.IX Item "EV_PERIODIC" -The \f(CW\*(C`ev_periodic\*(C'\fR watcher has timed out. -.ie n .IP """EV_SIGNAL""" 4 -.el .IP "\f(CWEV_SIGNAL\fR" 4 -.IX Item "EV_SIGNAL" -The signal specified in the \f(CW\*(C`ev_signal\*(C'\fR watcher has been received by a thread. -.ie n .IP """EV_CHILD""" 4 -.el .IP "\f(CWEV_CHILD\fR" 4 -.IX Item "EV_CHILD" -The pid specified in the \f(CW\*(C`ev_child\*(C'\fR watcher has received a status change. -.ie n .IP """EV_STAT""" 4 -.el .IP "\f(CWEV_STAT\fR" 4 -.IX Item "EV_STAT" -The path specified in the \f(CW\*(C`ev_stat\*(C'\fR watcher changed its attributes somehow. -.ie n .IP """EV_IDLE""" 4 -.el .IP "\f(CWEV_IDLE\fR" 4 -.IX Item "EV_IDLE" -The \f(CW\*(C`ev_idle\*(C'\fR watcher has determined that you have nothing better to do. -.ie n .IP """EV_PREPARE""" 4 -.el .IP "\f(CWEV_PREPARE\fR" 4 -.IX Item "EV_PREPARE" -.PD 0 -.ie n .IP """EV_CHECK""" 4 -.el .IP "\f(CWEV_CHECK\fR" 4 -.IX Item "EV_CHECK" -.PD -All \f(CW\*(C`ev_prepare\*(C'\fR watchers are invoked just \fIbefore\fR \f(CW\*(C`ev_run\*(C'\fR starts to -gather new events, and all \f(CW\*(C`ev_check\*(C'\fR watchers are queued (not invoked) -just after \f(CW\*(C`ev_run\*(C'\fR has gathered them, but before it queues any callbacks -for any received events. That means \f(CW\*(C`ev_prepare\*(C'\fR watchers are the last -watchers invoked before the event loop sleeps or polls for new events, and -\&\f(CW\*(C`ev_check\*(C'\fR watchers will be invoked before any other watchers of the same -or lower priority within an event loop iteration. -.Sp -Callbacks of both watcher types can start and stop as many watchers as -they want, and all of them will be taken into account (for example, a -\&\f(CW\*(C`ev_prepare\*(C'\fR watcher might start an idle watcher to keep \f(CW\*(C`ev_run\*(C'\fR from -blocking). -.ie n .IP """EV_EMBED""" 4 -.el .IP "\f(CWEV_EMBED\fR" 4 -.IX Item "EV_EMBED" -The embedded event loop specified in the \f(CW\*(C`ev_embed\*(C'\fR watcher needs attention. -.ie n .IP """EV_FORK""" 4 -.el .IP "\f(CWEV_FORK\fR" 4 -.IX Item "EV_FORK" -The event loop has been resumed in the child process after fork (see -\&\f(CW\*(C`ev_fork\*(C'\fR). -.ie n .IP """EV_CLEANUP""" 4 -.el .IP "\f(CWEV_CLEANUP\fR" 4 -.IX Item "EV_CLEANUP" -The event loop is about to be destroyed (see \f(CW\*(C`ev_cleanup\*(C'\fR). -.ie n .IP """EV_ASYNC""" 4 -.el .IP "\f(CWEV_ASYNC\fR" 4 -.IX Item "EV_ASYNC" -The given async watcher has been asynchronously notified (see \f(CW\*(C`ev_async\*(C'\fR). -.ie n .IP """EV_CUSTOM""" 4 -.el .IP "\f(CWEV_CUSTOM\fR" 4 -.IX Item "EV_CUSTOM" -Not ever sent (or otherwise used) by libev itself, but can be freely used -by libev users to signal watchers (e.g. via \f(CW\*(C`ev_feed_event\*(C'\fR). -.ie n .IP """EV_ERROR""" 4 -.el .IP "\f(CWEV_ERROR\fR" 4 -.IX Item "EV_ERROR" -An unspecified error has occurred, the watcher has been stopped. This might -happen because the watcher could not be properly started because libev -ran out of memory, a file descriptor was found to be closed or any other -problem. Libev considers these application bugs. -.Sp -You best act on it by reporting the problem and somehow coping with the -watcher being stopped. Note that well-written programs should not receive -an error ever, so when your watcher receives it, this usually indicates a -bug in your program. -.Sp -Libev will usually signal a few \*(L"dummy\*(R" events together with an error, for -example it might indicate that a fd is readable or writable, and if your -callbacks is well-written it can just attempt the operation and cope with -the error from \fBread()\fR or \fBwrite()\fR. This will not work in multi-threaded -programs, though, as the fd could already be closed and reused for another -thing, so beware. -.SS "\s-1GENERIC WATCHER FUNCTIONS\s0" -.IX Subsection "GENERIC WATCHER FUNCTIONS" -.ie n .IP """ev_init"" (ev_TYPE *watcher, callback)" 4 -.el .IP "\f(CWev_init\fR (ev_TYPE *watcher, callback)" 4 -.IX Item "ev_init (ev_TYPE *watcher, callback)" -This macro initialises the generic portion of a watcher. The contents -of the watcher object can be arbitrary (so \f(CW\*(C`malloc\*(C'\fR will do). Only -the generic parts of the watcher are initialised, you \fIneed\fR to call -the type-specific \f(CW\*(C`ev_TYPE_set\*(C'\fR macro afterwards to initialise the -type-specific parts. For each type there is also a \f(CW\*(C`ev_TYPE_init\*(C'\fR macro -which rolls both calls into one. -.Sp -You can reinitialise a watcher at any time as long as it has been stopped -(or never started) and there are no pending events outstanding. -.Sp -The callback is always of type \f(CW\*(C`void (*)(struct ev_loop *loop, ev_TYPE *watcher, -int revents)\*(C'\fR. -.Sp -Example: Initialise an \f(CW\*(C`ev_io\*(C'\fR watcher in two steps. -.Sp -.Vb 3 -\& ev_io w; -\& ev_init (&w, my_cb); -\& ev_io_set (&w, STDIN_FILENO, EV_READ); -.Ve -.ie n .IP """ev_TYPE_set"" (ev_TYPE *watcher, [args])" 4 -.el .IP "\f(CWev_TYPE_set\fR (ev_TYPE *watcher, [args])" 4 -.IX Item "ev_TYPE_set (ev_TYPE *watcher, [args])" -This macro initialises the type-specific parts of a watcher. You need to -call \f(CW\*(C`ev_init\*(C'\fR at least once before you call this macro, but you can -call \f(CW\*(C`ev_TYPE_set\*(C'\fR any number of times. You must not, however, call this -macro on a watcher that is active (it can be pending, however, which is a -difference to the \f(CW\*(C`ev_init\*(C'\fR macro). -.Sp -Although some watcher types do not have type-specific arguments -(e.g. \f(CW\*(C`ev_prepare\*(C'\fR) you still need to call its \f(CW\*(C`set\*(C'\fR macro. -.Sp -See \f(CW\*(C`ev_init\*(C'\fR, above, for an example. -.ie n .IP """ev_TYPE_init"" (ev_TYPE *watcher, callback, [args])" 4 -.el .IP "\f(CWev_TYPE_init\fR (ev_TYPE *watcher, callback, [args])" 4 -.IX Item "ev_TYPE_init (ev_TYPE *watcher, callback, [args])" -This convenience macro rolls both \f(CW\*(C`ev_init\*(C'\fR and \f(CW\*(C`ev_TYPE_set\*(C'\fR macro -calls into a single call. This is the most convenient method to initialise -a watcher. The same limitations apply, of course. -.Sp -Example: Initialise and set an \f(CW\*(C`ev_io\*(C'\fR watcher in one step. -.Sp -.Vb 1 -\& ev_io_init (&w, my_cb, STDIN_FILENO, EV_READ); -.Ve -.ie n .IP """ev_TYPE_start"" (loop, ev_TYPE *watcher)" 4 -.el .IP "\f(CWev_TYPE_start\fR (loop, ev_TYPE *watcher)" 4 -.IX Item "ev_TYPE_start (loop, ev_TYPE *watcher)" -Starts (activates) the given watcher. Only active watchers will receive -events. If the watcher is already active nothing will happen. -.Sp -Example: Start the \f(CW\*(C`ev_io\*(C'\fR watcher that is being abused as example in this -whole section. -.Sp -.Vb 1 -\& ev_io_start (EV_DEFAULT_UC, &w); -.Ve -.ie n .IP """ev_TYPE_stop"" (loop, ev_TYPE *watcher)" 4 -.el .IP "\f(CWev_TYPE_stop\fR (loop, ev_TYPE *watcher)" 4 -.IX Item "ev_TYPE_stop (loop, ev_TYPE *watcher)" -Stops the given watcher if active, and clears the pending status (whether -the watcher was active or not). -.Sp -It is possible that stopped watchers are pending \- for example, -non-repeating timers are being stopped when they become pending \- but -calling \f(CW\*(C`ev_TYPE_stop\*(C'\fR ensures that the watcher is neither active nor -pending. If you want to free or reuse the memory used by the watcher it is -therefore a good idea to always call its \f(CW\*(C`ev_TYPE_stop\*(C'\fR function. -.IP "bool ev_is_active (ev_TYPE *watcher)" 4 -.IX Item "bool ev_is_active (ev_TYPE *watcher)" -Returns a true value iff the watcher is active (i.e. it has been started -and not yet been stopped). As long as a watcher is active you must not modify -it. -.IP "bool ev_is_pending (ev_TYPE *watcher)" 4 -.IX Item "bool ev_is_pending (ev_TYPE *watcher)" -Returns a true value iff the watcher is pending, (i.e. it has outstanding -events but its callback has not yet been invoked). As long as a watcher -is pending (but not active) you must not call an init function on it (but -\&\f(CW\*(C`ev_TYPE_set\*(C'\fR is safe), you must not change its priority, and you must -make sure the watcher is available to libev (e.g. you cannot \f(CW\*(C`free ()\*(C'\fR -it). -.IP "callback ev_cb (ev_TYPE *watcher)" 4 -.IX Item "callback ev_cb (ev_TYPE *watcher)" -Returns the callback currently set on the watcher. -.IP "ev_set_cb (ev_TYPE *watcher, callback)" 4 -.IX Item "ev_set_cb (ev_TYPE *watcher, callback)" -Change the callback. You can change the callback at virtually any time -(modulo threads). -.IP "ev_set_priority (ev_TYPE *watcher, int priority)" 4 -.IX Item "ev_set_priority (ev_TYPE *watcher, int priority)" -.PD 0 -.IP "int ev_priority (ev_TYPE *watcher)" 4 -.IX Item "int ev_priority (ev_TYPE *watcher)" -.PD -Set and query the priority of the watcher. The priority is a small -integer between \f(CW\*(C`EV_MAXPRI\*(C'\fR (default: \f(CW2\fR) and \f(CW\*(C`EV_MINPRI\*(C'\fR -(default: \f(CW\*(C`\-2\*(C'\fR). Pending watchers with higher priority will be invoked -before watchers with lower priority, but priority will not keep watchers -from being executed (except for \f(CW\*(C`ev_idle\*(C'\fR watchers). -.Sp -If you need to suppress invocation when higher priority events are pending -you need to look at \f(CW\*(C`ev_idle\*(C'\fR watchers, which provide this functionality. -.Sp -You \fImust not\fR change the priority of a watcher as long as it is active or -pending. -.Sp -Setting a priority outside the range of \f(CW\*(C`EV_MINPRI\*(C'\fR to \f(CW\*(C`EV_MAXPRI\*(C'\fR is -fine, as long as you do not mind that the priority value you query might -or might not have been clamped to the valid range. -.Sp -The default priority used by watchers when no priority has been set is -always \f(CW0\fR, which is supposed to not be too high and not be too low :). -.Sp -See \*(L"\s-1WATCHER PRIORITY MODELS\*(R"\s0, below, for a more thorough treatment of -priorities. -.IP "ev_invoke (loop, ev_TYPE *watcher, int revents)" 4 -.IX Item "ev_invoke (loop, ev_TYPE *watcher, int revents)" -Invoke the \f(CW\*(C`watcher\*(C'\fR with the given \f(CW\*(C`loop\*(C'\fR and \f(CW\*(C`revents\*(C'\fR. Neither -\&\f(CW\*(C`loop\*(C'\fR nor \f(CW\*(C`revents\*(C'\fR need to be valid as long as the watcher callback -can deal with that fact, as both are simply passed through to the -callback. -.IP "int ev_clear_pending (loop, ev_TYPE *watcher)" 4 -.IX Item "int ev_clear_pending (loop, ev_TYPE *watcher)" -If the watcher is pending, this function clears its pending status and -returns its \f(CW\*(C`revents\*(C'\fR bitset (as if its callback was invoked). If the -watcher isn't pending it does nothing and returns \f(CW0\fR. -.Sp -Sometimes it can be useful to \*(L"poll\*(R" a watcher instead of waiting for its -callback to be invoked, which can be accomplished with this function. -.IP "ev_feed_event (loop, ev_TYPE *watcher, int revents)" 4 -.IX Item "ev_feed_event (loop, ev_TYPE *watcher, int revents)" -Feeds the given event set into the event loop, as if the specified event -had happened for the specified watcher (which must be a pointer to an -initialised but not necessarily started event watcher). Obviously you must -not free the watcher as long as it has pending events. -.Sp -Stopping the watcher, letting libev invoke it, or calling -\&\f(CW\*(C`ev_clear_pending\*(C'\fR will clear the pending event, even if the watcher was -not started in the first place. -.Sp -See also \f(CW\*(C`ev_feed_fd_event\*(C'\fR and \f(CW\*(C`ev_feed_signal_event\*(C'\fR for related -functions that do not need a watcher. -.PP -See also the \*(L"\s-1ASSOCIATING CUSTOM DATA WITH A WATCHER\*(R"\s0 and \*(L"\s-1BUILDING YOUR -OWN COMPOSITE WATCHERS\*(R"\s0 idioms. -.SS "\s-1WATCHER STATES\s0" -.IX Subsection "WATCHER STATES" -There are various watcher states mentioned throughout this manual \- -active, pending and so on. In this section these states and the rules to -transition between them will be described in more detail \- and while these -rules might look complicated, they usually do \*(L"the right thing\*(R". -.IP "initialised" 4 -.IX Item "initialised" -Before a watcher can be registered with the event loop it has to be -initialised. This can be done with a call to \f(CW\*(C`ev_TYPE_init\*(C'\fR, or calls to -\&\f(CW\*(C`ev_init\*(C'\fR followed by the watcher-specific \f(CW\*(C`ev_TYPE_set\*(C'\fR function. -.Sp -In this state it is simply some block of memory that is suitable for -use in an event loop. It can be moved around, freed, reused etc. at -will \- as long as you either keep the memory contents intact, or call -\&\f(CW\*(C`ev_TYPE_init\*(C'\fR again. -.IP "started/running/active" 4 -.IX Item "started/running/active" -Once a watcher has been started with a call to \f(CW\*(C`ev_TYPE_start\*(C'\fR it becomes -property of the event loop, and is actively waiting for events. While in -this state it cannot be accessed (except in a few documented ways), moved, -freed or anything else \- the only legal thing is to keep a pointer to it, -and call libev functions on it that are documented to work on active watchers. -.IP "pending" 4 -.IX Item "pending" -If a watcher is active and libev determines that an event it is interested -in has occurred (such as a timer expiring), it will become pending. It will -stay in this pending state until either it is stopped or its callback is -about to be invoked, so it is not normally pending inside the watcher -callback. -.Sp -The watcher might or might not be active while it is pending (for example, -an expired non-repeating timer can be pending but no longer active). If it -is stopped, it can be freely accessed (e.g. by calling \f(CW\*(C`ev_TYPE_set\*(C'\fR), -but it is still property of the event loop at this time, so cannot be -moved, freed or reused. And if it is active the rules described in the -previous item still apply. -.Sp -It is also possible to feed an event on a watcher that is not active (e.g. -via \f(CW\*(C`ev_feed_event\*(C'\fR), in which case it becomes pending without being -active. -.IP "stopped" 4 -.IX Item "stopped" -A watcher can be stopped implicitly by libev (in which case it might still -be pending), or explicitly by calling its \f(CW\*(C`ev_TYPE_stop\*(C'\fR function. The -latter will clear any pending state the watcher might be in, regardless -of whether it was active or not, so stopping a watcher explicitly before -freeing it is often a good idea. -.Sp -While stopped (and not pending) the watcher is essentially in the -initialised state, that is, it can be reused, moved, modified in any way -you wish (but when you trash the memory block, you need to \f(CW\*(C`ev_TYPE_init\*(C'\fR -it again). -.SS "\s-1WATCHER PRIORITY MODELS\s0" -.IX Subsection "WATCHER PRIORITY MODELS" -Many event loops support \fIwatcher priorities\fR, which are usually small -integers that influence the ordering of event callback invocation -between watchers in some way, all else being equal. -.PP -In libev, watcher priorities can be set using \f(CW\*(C`ev_set_priority\*(C'\fR. See its -description for the more technical details such as the actual priority -range. -.PP -There are two common ways how these these priorities are being interpreted -by event loops: -.PP -In the more common lock-out model, higher priorities \*(L"lock out\*(R" invocation -of lower priority watchers, which means as long as higher priority -watchers receive events, lower priority watchers are not being invoked. -.PP -The less common only-for-ordering model uses priorities solely to order -callback invocation within a single event loop iteration: Higher priority -watchers are invoked before lower priority ones, but they all get invoked -before polling for new events. -.PP -Libev uses the second (only-for-ordering) model for all its watchers -except for idle watchers (which use the lock-out model). -.PP -The rationale behind this is that implementing the lock-out model for -watchers is not well supported by most kernel interfaces, and most event -libraries will just poll for the same events again and again as long as -their callbacks have not been executed, which is very inefficient in the -common case of one high-priority watcher locking out a mass of lower -priority ones. -.PP -Static (ordering) priorities are most useful when you have two or more -watchers handling the same resource: a typical usage example is having an -\&\f(CW\*(C`ev_io\*(C'\fR watcher to receive data, and an associated \f(CW\*(C`ev_timer\*(C'\fR to handle -timeouts. Under load, data might be received while the program handles -other jobs, but since timers normally get invoked first, the timeout -handler will be executed before checking for data. In that case, giving -the timer a lower priority than the I/O watcher ensures that I/O will be -handled first even under adverse conditions (which is usually, but not -always, what you want). -.PP -Since idle watchers use the \*(L"lock-out\*(R" model, meaning that idle watchers -will only be executed when no same or higher priority watchers have -received events, they can be used to implement the \*(L"lock-out\*(R" model when -required. -.PP -For example, to emulate how many other event libraries handle priorities, -you can associate an \f(CW\*(C`ev_idle\*(C'\fR watcher to each such watcher, and in -the normal watcher callback, you just start the idle watcher. The real -processing is done in the idle watcher callback. This causes libev to -continuously poll and process kernel event data for the watcher, but when -the lock-out case is known to be rare (which in turn is rare :), this is -workable. -.PP -Usually, however, the lock-out model implemented that way will perform -miserably under the type of load it was designed to handle. In that case, -it might be preferable to stop the real watcher before starting the -idle watcher, so the kernel will not have to process the event in case -the actual processing will be delayed for considerable time. -.PP -Here is an example of an I/O watcher that should run at a strictly lower -priority than the default, and which should only process data when no -other events are pending: -.PP -.Vb 2 -\& ev_idle idle; // actual processing watcher -\& ev_io io; // actual event watcher -\& -\& static void -\& io_cb (EV_P_ ev_io *w, int revents) -\& { -\& // stop the I/O watcher, we received the event, but -\& // are not yet ready to handle it. -\& ev_io_stop (EV_A_ w); -\& -\& // start the idle watcher to handle the actual event. -\& // it will not be executed as long as other watchers -\& // with the default priority are receiving events. -\& ev_idle_start (EV_A_ &idle); -\& } -\& -\& static void -\& idle_cb (EV_P_ ev_idle *w, int revents) -\& { -\& // actual processing -\& read (STDIN_FILENO, ...); -\& -\& // have to start the I/O watcher again, as -\& // we have handled the event -\& ev_io_start (EV_P_ &io); -\& } -\& -\& // initialisation -\& ev_idle_init (&idle, idle_cb); -\& ev_io_init (&io, io_cb, STDIN_FILENO, EV_READ); -\& ev_io_start (EV_DEFAULT_ &io); -.Ve -.PP -In the \*(L"real\*(R" world, it might also be beneficial to start a timer, so that -low-priority connections can not be locked out forever under load. This -enables your program to keep a lower latency for important connections -during short periods of high load, while not completely locking out less -important ones. -.SH "WATCHER TYPES" -.IX Header "WATCHER TYPES" -This section describes each watcher in detail, but will not repeat -information given in the last section. Any initialisation/set macros, -functions and members specific to the watcher type are explained. -.PP -Most members are additionally marked with either \fI[read\-only]\fR, meaning -that, while the watcher is active, you can look at the member and expect -some sensible content, but you must not modify it (you can modify it while -the watcher is stopped to your hearts content), or \fI[read\-write]\fR, which -means you can expect it to have some sensible content while the watcher is -active, but you can also modify it (within the same thread as the event -loop, i.e. without creating data races). Modifying it may not do something -sensible or take immediate effect (or do anything at all), but libev will -not crash or malfunction in any way. -.PP -In any case, the documentation for each member will explain what the -effects are, and if there are any additional access restrictions. -.ie n .SS """ev_io"" \- is this file descriptor readable or writable?" -.el .SS "\f(CWev_io\fP \- is this file descriptor readable or writable?" -.IX Subsection "ev_io - is this file descriptor readable or writable?" -I/O watchers check whether a file descriptor is readable or writable -in each iteration of the event loop, or, more precisely, when reading -would not block the process and writing would at least be able to write -some data. This behaviour is called level-triggering because you keep -receiving events as long as the condition persists. Remember you can stop -the watcher if you don't want to act on the event and neither want to -receive future events. -.PP -In general you can register as many read and/or write event watchers per -fd as you want (as long as you don't confuse yourself). Setting all file -descriptors to non-blocking mode is also usually a good idea (but not -required if you know what you are doing). -.PP -Another thing you have to watch out for is that it is quite easy to -receive \*(L"spurious\*(R" readiness notifications, that is, your callback might -be called with \f(CW\*(C`EV_READ\*(C'\fR but a subsequent \f(CW\*(C`read\*(C'\fR(2) will actually block -because there is no data. It is very easy to get into this situation even -with a relatively standard program structure. Thus it is best to always -use non-blocking I/O: An extra \f(CW\*(C`read\*(C'\fR(2) returning \f(CW\*(C`EAGAIN\*(C'\fR is far -preferable to a program hanging until some data arrives. -.PP -If you cannot run the fd in non-blocking mode (for example you should -not play around with an Xlib connection), then you have to separately -re-test whether a file descriptor is really ready with a known-to-be good -interface such as poll (fortunately in the case of Xlib, it already does -this on its own, so its quite safe to use). Some people additionally -use \f(CW\*(C`SIGALRM\*(C'\fR and an interval timer, just to be sure you won't block -indefinitely. -.PP -But really, best use non-blocking mode. -.PP -\fIThe special problem of disappearing file descriptors\fR -.IX Subsection "The special problem of disappearing file descriptors" -.PP -Some backends (e.g. kqueue, epoll, linuxaio) need to be told about closing -a file descriptor (either due to calling \f(CW\*(C`close\*(C'\fR explicitly or any other -means, such as \f(CW\*(C`dup2\*(C'\fR). The reason is that you register interest in some -file descriptor, but when it goes away, the operating system will silently -drop this interest. If another file descriptor with the same number then -is registered with libev, there is no efficient way to see that this is, -in fact, a different file descriptor. -.PP -To avoid having to explicitly tell libev about such cases, libev follows -the following policy: Each time \f(CW\*(C`ev_io_set\*(C'\fR is being called, libev -will assume that this is potentially a new file descriptor, otherwise -it is assumed that the file descriptor stays the same. That means that -you \fIhave\fR to call \f(CW\*(C`ev_io_set\*(C'\fR (or \f(CW\*(C`ev_io_init\*(C'\fR) when you change the -descriptor even if the file descriptor number itself did not change. -.PP -This is how one would do it normally anyway, the important point is that -the libev application should not optimise around libev but should leave -optimisations to libev. -.PP -\fIThe special problem of dup'ed file descriptors\fR -.IX Subsection "The special problem of dup'ed file descriptors" -.PP -Some backends (e.g. epoll), cannot register events for file descriptors, -but only events for the underlying file descriptions. That means when you -have \f(CW\*(C`dup ()\*(C'\fR'ed file descriptors or weirder constellations, and register -events for them, only one file descriptor might actually receive events. -.PP -There is no workaround possible except not registering events -for potentially \f(CW\*(C`dup ()\*(C'\fR'ed file descriptors, or to resort to -\&\f(CW\*(C`EVBACKEND_SELECT\*(C'\fR or \f(CW\*(C`EVBACKEND_POLL\*(C'\fR. -.PP -\fIThe special problem of files\fR -.IX Subsection "The special problem of files" -.PP -Many people try to use \f(CW\*(C`select\*(C'\fR (or libev) on file descriptors -representing files, and expect it to become ready when their program -doesn't block on disk accesses (which can take a long time on their own). -.PP -However, this cannot ever work in the \*(L"expected\*(R" way \- you get a readiness -notification as soon as the kernel knows whether and how much data is -there, and in the case of open files, that's always the case, so you -always get a readiness notification instantly, and your read (or possibly -write) will still block on the disk I/O. -.PP -Another way to view it is that in the case of sockets, pipes, character -devices and so on, there is another party (the sender) that delivers data -on its own, but in the case of files, there is no such thing: the disk -will not send data on its own, simply because it doesn't know what you -wish to read \- you would first have to request some data. -.PP -Since files are typically not-so-well supported by advanced notification -mechanism, libev tries hard to emulate \s-1POSIX\s0 behaviour with respect -to files, even though you should not use it. The reason for this is -convenience: sometimes you want to watch \s-1STDIN\s0 or \s-1STDOUT,\s0 which is -usually a tty, often a pipe, but also sometimes files or special devices -(for example, \f(CW\*(C`epoll\*(C'\fR on Linux works with \fI/dev/random\fR but not with -\&\fI/dev/urandom\fR), and even though the file might better be served with -asynchronous I/O instead of with non-blocking I/O, it is still useful when -it \*(L"just works\*(R" instead of freezing. -.PP -So avoid file descriptors pointing to files when you know it (e.g. use -libeio), but use them when it is convenient, e.g. for \s-1STDIN/STDOUT,\s0 or -when you rarely read from a file instead of from a socket, and want to -reuse the same code path. -.PP -\fIThe special problem of fork\fR -.IX Subsection "The special problem of fork" -.PP -Some backends (epoll, kqueue, linuxaio, iouring) do not support \f(CW\*(C`fork ()\*(C'\fR -at all or exhibit useless behaviour. Libev fully supports fork, but needs -to be told about it in the child if you want to continue to use it in the -child. -.PP -To support fork in your child processes, you have to call \f(CW\*(C`ev_loop_fork -()\*(C'\fR after a fork in the child, enable \f(CW\*(C`EVFLAG_FORKCHECK\*(C'\fR, or resort to -\&\f(CW\*(C`EVBACKEND_SELECT\*(C'\fR or \f(CW\*(C`EVBACKEND_POLL\*(C'\fR. -.PP -\fIThe special problem of \s-1SIGPIPE\s0\fR -.IX Subsection "The special problem of SIGPIPE" -.PP -While not really specific to libev, it is easy to forget about \f(CW\*(C`SIGPIPE\*(C'\fR: -when writing to a pipe whose other end has been closed, your program gets -sent a \s-1SIGPIPE,\s0 which, by default, aborts your program. For most programs -this is sensible behaviour, for daemons, this is usually undesirable. -.PP -So when you encounter spurious, unexplained daemon exits, make sure you -ignore \s-1SIGPIPE\s0 (and maybe make sure you log the exit status of your daemon -somewhere, as that would have given you a big clue). -.PP -\fIThe special problem of \f(BIaccept()\fIing when you can't\fR -.IX Subsection "The special problem of accept()ing when you can't" -.PP -Many implementations of the \s-1POSIX\s0 \f(CW\*(C`accept\*(C'\fR function (for example, -found in post\-2004 Linux) have the peculiar behaviour of not removing a -connection from the pending queue in all error cases. -.PP -For example, larger servers often run out of file descriptors (because -of resource limits), causing \f(CW\*(C`accept\*(C'\fR to fail with \f(CW\*(C`ENFILE\*(C'\fR but not -rejecting the connection, leading to libev signalling readiness on -the next iteration again (the connection still exists after all), and -typically causing the program to loop at 100% \s-1CPU\s0 usage. -.PP -Unfortunately, the set of errors that cause this issue differs between -operating systems, there is usually little the app can do to remedy the -situation, and no known thread-safe method of removing the connection to -cope with overload is known (to me). -.PP -One of the easiest ways to handle this situation is to just ignore it -\&\- when the program encounters an overload, it will just loop until the -situation is over. While this is a form of busy waiting, no \s-1OS\s0 offers an -event-based way to handle this situation, so it's the best one can do. -.PP -A better way to handle the situation is to log any errors other than -\&\f(CW\*(C`EAGAIN\*(C'\fR and \f(CW\*(C`EWOULDBLOCK\*(C'\fR, making sure not to flood the log with such -messages, and continue as usual, which at least gives the user an idea of -what could be wrong (\*(L"raise the ulimit!\*(R"). For extra points one could stop -the \f(CW\*(C`ev_io\*(C'\fR watcher on the listening fd \*(L"for a while\*(R", which reduces \s-1CPU\s0 -usage. -.PP -If your program is single-threaded, then you could also keep a dummy file -descriptor for overload situations (e.g. by opening \fI/dev/null\fR), and -when you run into \f(CW\*(C`ENFILE\*(C'\fR or \f(CW\*(C`EMFILE\*(C'\fR, close it, run \f(CW\*(C`accept\*(C'\fR, -close that fd, and create a new dummy fd. This will gracefully refuse -clients under typical overload conditions. -.PP -The last way to handle it is to simply log the error and \f(CW\*(C`exit\*(C'\fR, as -is often done with \f(CW\*(C`malloc\*(C'\fR failures, but this results in an easy -opportunity for a DoS attack. -.PP -\fIWatcher-Specific Functions\fR -.IX Subsection "Watcher-Specific Functions" -.IP "ev_io_init (ev_io *, callback, int fd, int events)" 4 -.IX Item "ev_io_init (ev_io *, callback, int fd, int events)" -.PD 0 -.IP "ev_io_set (ev_io *, int fd, int events)" 4 -.IX Item "ev_io_set (ev_io *, int fd, int events)" -.PD -Configures an \f(CW\*(C`ev_io\*(C'\fR watcher. The \f(CW\*(C`fd\*(C'\fR is the file descriptor to -receive events for and \f(CW\*(C`events\*(C'\fR is either \f(CW\*(C`EV_READ\*(C'\fR, \f(CW\*(C`EV_WRITE\*(C'\fR, both -\&\f(CW\*(C`EV_READ | EV_WRITE\*(C'\fR or \f(CW0\fR, to express the desire to receive the given -events. -.Sp -Note that setting the \f(CW\*(C`events\*(C'\fR to \f(CW0\fR and starting the watcher is -supported, but not specially optimized \- if your program sometimes happens -to generate this combination this is fine, but if it is easy to avoid -starting an io watcher watching for no events you should do so. -.IP "ev_io_modify (ev_io *, int events)" 4 -.IX Item "ev_io_modify (ev_io *, int events)" -Similar to \f(CW\*(C`ev_io_set\*(C'\fR, but only changes the requested events. Using this -might be faster with some backends, as libev can assume that the \f(CW\*(C`fd\*(C'\fR -still refers to the same underlying file description, something it cannot -do when using \f(CW\*(C`ev_io_set\*(C'\fR. -.IP "int fd [no\-modify]" 4 -.IX Item "int fd [no-modify]" -The file descriptor being watched. While it can be read at any time, you -must not modify this member even when the watcher is stopped \- always use -\&\f(CW\*(C`ev_io_set\*(C'\fR for that. -.IP "int events [no\-modify]" 4 -.IX Item "int events [no-modify]" -The set of events the fd is being watched for, among other flags. Remember -that this is a bit set \- to test for \f(CW\*(C`EV_READ\*(C'\fR, use \f(CW\*(C`w\->events & -EV_READ\*(C'\fR, and similarly for \f(CW\*(C`EV_WRITE\*(C'\fR. -.Sp -As with \f(CW\*(C`fd\*(C'\fR, you must not modify this member even when the watcher is -stopped, always use \f(CW\*(C`ev_io_set\*(C'\fR or \f(CW\*(C`ev_io_modify\*(C'\fR for that. -.PP -\fIExamples\fR -.IX Subsection "Examples" -.PP -Example: Call \f(CW\*(C`stdin_readable_cb\*(C'\fR when \s-1STDIN_FILENO\s0 has become, well -readable, but only once. Since it is likely line-buffered, you could -attempt to read a whole line in the callback. -.PP -.Vb 6 -\& static void -\& stdin_readable_cb (struct ev_loop *loop, ev_io *w, int revents) -\& { -\& ev_io_stop (loop, w); -\& .. read from stdin here (or from w\->fd) and handle any I/O errors -\& } -\& -\& ... -\& struct ev_loop *loop = ev_default_init (0); -\& ev_io stdin_readable; -\& ev_io_init (&stdin_readable, stdin_readable_cb, STDIN_FILENO, EV_READ); -\& ev_io_start (loop, &stdin_readable); -\& ev_run (loop, 0); -.Ve -.ie n .SS """ev_timer"" \- relative and optionally repeating timeouts" -.el .SS "\f(CWev_timer\fP \- relative and optionally repeating timeouts" -.IX Subsection "ev_timer - relative and optionally repeating timeouts" -Timer watchers are simple relative timers that generate an event after a -given time, and optionally repeating in regular intervals after that. -.PP -The timers are based on real time, that is, if you register an event that -times out after an hour and you reset your system clock to January last -year, it will still time out after (roughly) one hour. \*(L"Roughly\*(R" because -detecting time jumps is hard, and some inaccuracies are unavoidable (the -monotonic clock option helps a lot here). -.PP -The callback is guaranteed to be invoked only \fIafter\fR its timeout has -passed (not \fIat\fR, so on systems with very low-resolution clocks this -might introduce a small delay, see \*(L"the special problem of being too -early\*(R", below). If multiple timers become ready during the same loop -iteration then the ones with earlier time-out values are invoked before -ones of the same priority with later time-out values (but this is no -longer true when a callback calls \f(CW\*(C`ev_run\*(C'\fR recursively). -.PP -\fIBe smart about timeouts\fR -.IX Subsection "Be smart about timeouts" -.PP -Many real-world problems involve some kind of timeout, usually for error -recovery. A typical example is an \s-1HTTP\s0 request \- if the other side hangs, -you want to raise some error after a while. -.PP -What follows are some ways to handle this problem, from obvious and -inefficient to smart and efficient. -.PP -In the following, a 60 second activity timeout is assumed \- a timeout that -gets reset to 60 seconds each time there is activity (e.g. each time some -data or other life sign was received). -.IP "1. Use a timer and stop, reinitialise and start it on activity." 4 -.IX Item "1. Use a timer and stop, reinitialise and start it on activity." -This is the most obvious, but not the most simple way: In the beginning, -start the watcher: -.Sp -.Vb 2 -\& ev_timer_init (timer, callback, 60., 0.); -\& ev_timer_start (loop, timer); -.Ve -.Sp -Then, each time there is some activity, \f(CW\*(C`ev_timer_stop\*(C'\fR it, initialise it -and start it again: -.Sp -.Vb 3 -\& ev_timer_stop (loop, timer); -\& ev_timer_set (timer, 60., 0.); -\& ev_timer_start (loop, timer); -.Ve -.Sp -This is relatively simple to implement, but means that each time there is -some activity, libev will first have to remove the timer from its internal -data structure and then add it again. Libev tries to be fast, but it's -still not a constant-time operation. -.ie n .IP "2. Use a timer and re-start it with ""ev_timer_again"" inactivity." 4 -.el .IP "2. Use a timer and re-start it with \f(CWev_timer_again\fR inactivity." 4 -.IX Item "2. Use a timer and re-start it with ev_timer_again inactivity." -This is the easiest way, and involves using \f(CW\*(C`ev_timer_again\*(C'\fR instead of -\&\f(CW\*(C`ev_timer_start\*(C'\fR. -.Sp -To implement this, configure an \f(CW\*(C`ev_timer\*(C'\fR with a \f(CW\*(C`repeat\*(C'\fR value -of \f(CW60\fR and then call \f(CW\*(C`ev_timer_again\*(C'\fR at start and each time you -successfully read or write some data. If you go into an idle state where -you do not expect data to travel on the socket, you can \f(CW\*(C`ev_timer_stop\*(C'\fR -the timer, and \f(CW\*(C`ev_timer_again\*(C'\fR will automatically restart it if need be. -.Sp -That means you can ignore both the \f(CW\*(C`ev_timer_start\*(C'\fR function and the -\&\f(CW\*(C`after\*(C'\fR argument to \f(CW\*(C`ev_timer_set\*(C'\fR, and only ever use the \f(CW\*(C`repeat\*(C'\fR -member and \f(CW\*(C`ev_timer_again\*(C'\fR. -.Sp -At start: -.Sp -.Vb 3 -\& ev_init (timer, callback); -\& timer\->repeat = 60.; -\& ev_timer_again (loop, timer); -.Ve -.Sp -Each time there is some activity: -.Sp -.Vb 1 -\& ev_timer_again (loop, timer); -.Ve -.Sp -It is even possible to change the time-out on the fly, regardless of -whether the watcher is active or not: -.Sp -.Vb 2 -\& timer\->repeat = 30.; -\& ev_timer_again (loop, timer); -.Ve -.Sp -This is slightly more efficient then stopping/starting the timer each time -you want to modify its timeout value, as libev does not have to completely -remove and re-insert the timer from/into its internal data structure. -.Sp -It is, however, even simpler than the \*(L"obvious\*(R" way to do it. -.IP "3. Let the timer time out, but then re-arm it as required." 4 -.IX Item "3. Let the timer time out, but then re-arm it as required." -This method is more tricky, but usually most efficient: Most timeouts are -relatively long compared to the intervals between other activity \- in -our example, within 60 seconds, there are usually many I/O events with -associated activity resets. -.Sp -In this case, it would be more efficient to leave the \f(CW\*(C`ev_timer\*(C'\fR alone, -but remember the time of last activity, and check for a real timeout only -within the callback: -.Sp -.Vb 3 -\& ev_tstamp timeout = 60.; -\& ev_tstamp last_activity; // time of last activity -\& ev_timer timer; -\& -\& static void -\& callback (EV_P_ ev_timer *w, int revents) -\& { -\& // calculate when the timeout would happen -\& ev_tstamp after = last_activity \- ev_now (EV_A) + timeout; -\& -\& // if negative, it means we the timeout already occurred -\& if (after < 0.) -\& { -\& // timeout occurred, take action -\& } -\& else -\& { -\& // callback was invoked, but there was some recent -\& // activity. simply restart the timer to time out -\& // after "after" seconds, which is the earliest time -\& // the timeout can occur. -\& ev_timer_set (w, after, 0.); -\& ev_timer_start (EV_A_ w); -\& } -\& } -.Ve -.Sp -To summarise the callback: first calculate in how many seconds the -timeout will occur (by calculating the absolute time when it would occur, -\&\f(CW\*(C`last_activity + timeout\*(C'\fR, and subtracting the current time, \f(CW\*(C`ev_now -(EV_A)\*(C'\fR from that). -.Sp -If this value is negative, then we are already past the timeout, i.e. we -timed out, and need to do whatever is needed in this case. -.Sp -Otherwise, we now the earliest time at which the timeout would trigger, -and simply start the timer with this timeout value. -.Sp -In other words, each time the callback is invoked it will check whether -the timeout occurred. If not, it will simply reschedule itself to check -again at the earliest time it could time out. Rinse. Repeat. -.Sp -This scheme causes more callback invocations (about one every 60 seconds -minus half the average time between activity), but virtually no calls to -libev to change the timeout. -.Sp -To start the machinery, simply initialise the watcher and set -\&\f(CW\*(C`last_activity\*(C'\fR to the current time (meaning there was some activity just -now), then call the callback, which will \*(L"do the right thing\*(R" and start -the timer: -.Sp -.Vb 3 -\& last_activity = ev_now (EV_A); -\& ev_init (&timer, callback); -\& callback (EV_A_ &timer, 0); -.Ve -.Sp -When there is some activity, simply store the current time in -\&\f(CW\*(C`last_activity\*(C'\fR, no libev calls at all: -.Sp -.Vb 2 -\& if (activity detected) -\& last_activity = ev_now (EV_A); -.Ve -.Sp -When your timeout value changes, then the timeout can be changed by simply -providing a new value, stopping the timer and calling the callback, which -will again do the right thing (for example, time out immediately :). -.Sp -.Vb 3 -\& timeout = new_value; -\& ev_timer_stop (EV_A_ &timer); -\& callback (EV_A_ &timer, 0); -.Ve -.Sp -This technique is slightly more complex, but in most cases where the -time-out is unlikely to be triggered, much more efficient. -.IP "4. Wee, just use a double-linked list for your timeouts." 4 -.IX Item "4. Wee, just use a double-linked list for your timeouts." -If there is not one request, but many thousands (millions...), all -employing some kind of timeout with the same timeout value, then one can -do even better: -.Sp -When starting the timeout, calculate the timeout value and put the timeout -at the \fIend\fR of the list. -.Sp -Then use an \f(CW\*(C`ev_timer\*(C'\fR to fire when the timeout at the \fIbeginning\fR of -the list is expected to fire (for example, using the technique #3). -.Sp -When there is some activity, remove the timer from the list, recalculate -the timeout, append it to the end of the list again, and make sure to -update the \f(CW\*(C`ev_timer\*(C'\fR if it was taken from the beginning of the list. -.Sp -This way, one can manage an unlimited number of timeouts in O(1) time for -starting, stopping and updating the timers, at the expense of a major -complication, and having to use a constant timeout. The constant timeout -ensures that the list stays sorted. -.PP -So which method the best? -.PP -Method #2 is a simple no-brain-required solution that is adequate in most -situations. Method #3 requires a bit more thinking, but handles many cases -better, and isn't very complicated either. In most case, choosing either -one is fine, with #3 being better in typical situations. -.PP -Method #1 is almost always a bad idea, and buys you nothing. Method #4 is -rather complicated, but extremely efficient, something that really pays -off after the first million or so of active timers, i.e. it's usually -overkill :) -.PP -\fIThe special problem of being too early\fR -.IX Subsection "The special problem of being too early" -.PP -If you ask a timer to call your callback after three seconds, then -you expect it to be invoked after three seconds \- but of course, this -cannot be guaranteed to infinite precision. Less obviously, it cannot be -guaranteed to any precision by libev \- imagine somebody suspending the -process with a \s-1STOP\s0 signal for a few hours for example. -.PP -So, libev tries to invoke your callback as soon as possible \fIafter\fR the -delay has occurred, but cannot guarantee this. -.PP -A less obvious failure mode is calling your callback too early: many event -loops compare timestamps with a \*(L"elapsed delay >= requested delay\*(R", but -this can cause your callback to be invoked much earlier than you would -expect. -.PP -To see why, imagine a system with a clock that only offers full second -resolution (think windows if you can't come up with a broken enough \s-1OS\s0 -yourself). If you schedule a one-second timer at the time 500.9, then the -event loop will schedule your timeout to elapse at a system time of 500 -(500.9 truncated to the resolution) + 1, or 501. -.PP -If an event library looks at the timeout 0.1s later, it will see \*(L"501 >= -501\*(R" and invoke the callback 0.1s after it was started, even though a -one-second delay was requested \- this is being \*(L"too early\*(R", despite best -intentions. -.PP -This is the reason why libev will never invoke the callback if the elapsed -delay equals the requested delay, but only when the elapsed delay is -larger than the requested delay. In the example above, libev would only invoke -the callback at system time 502, or 1.1s after the timer was started. -.PP -So, while libev cannot guarantee that your callback will be invoked -exactly when requested, it \fIcan\fR and \fIdoes\fR guarantee that the requested -delay has actually elapsed, or in other words, it always errs on the \*(L"too -late\*(R" side of things. -.PP -\fIThe special problem of time updates\fR -.IX Subsection "The special problem of time updates" -.PP -Establishing the current time is a costly operation (it usually takes -at least one system call): \s-1EV\s0 therefore updates its idea of the current -time only before and after \f(CW\*(C`ev_run\*(C'\fR collects new events, which causes a -growing difference between \f(CW\*(C`ev_now ()\*(C'\fR and \f(CW\*(C`ev_time ()\*(C'\fR when handling -lots of events in one iteration. -.PP -The relative timeouts are calculated relative to the \f(CW\*(C`ev_now ()\*(C'\fR -time. This is usually the right thing as this timestamp refers to the time -of the event triggering whatever timeout you are modifying/starting. If -you suspect event processing to be delayed and you \fIneed\fR to base the -timeout on the current time, use something like the following to adjust -for it: -.PP -.Vb 1 -\& ev_timer_set (&timer, after + (ev_time () \- ev_now ()), 0.); -.Ve -.PP -If the event loop is suspended for a long time, you can also force an -update of the time returned by \f(CW\*(C`ev_now ()\*(C'\fR by calling \f(CW\*(C`ev_now_update -()\*(C'\fR, although that will push the event time of all outstanding events -further into the future. -.PP -\fIThe special problem of unsynchronised clocks\fR -.IX Subsection "The special problem of unsynchronised clocks" -.PP -Modern systems have a variety of clocks \- libev itself uses the normal -\&\*(L"wall clock\*(R" clock and, if available, the monotonic clock (to avoid time -jumps). -.PP -Neither of these clocks is synchronised with each other or any other clock -on the system, so \f(CW\*(C`ev_time ()\*(C'\fR might return a considerably different time -than \f(CW\*(C`gettimeofday ()\*(C'\fR or \f(CW\*(C`time ()\*(C'\fR. On a GNU/Linux system, for example, -a call to \f(CW\*(C`gettimeofday\*(C'\fR might return a second count that is one higher -than a directly following call to \f(CW\*(C`time\*(C'\fR. -.PP -The moral of this is to only compare libev-related timestamps with -\&\f(CW\*(C`ev_time ()\*(C'\fR and \f(CW\*(C`ev_now ()\*(C'\fR, at least if you want better precision than -a second or so. -.PP -One more problem arises due to this lack of synchronisation: if libev uses -the system monotonic clock and you compare timestamps from \f(CW\*(C`ev_time\*(C'\fR -or \f(CW\*(C`ev_now\*(C'\fR from when you started your timer and when your callback is -invoked, you will find that sometimes the callback is a bit \*(L"early\*(R". -.PP -This is because \f(CW\*(C`ev_timer\*(C'\fRs work in real time, not wall clock time, so -libev makes sure your callback is not invoked before the delay happened, -\&\fImeasured according to the real time\fR, not the system clock. -.PP -If your timeouts are based on a physical timescale (e.g. \*(L"time out this -connection after 100 seconds\*(R") then this shouldn't bother you as it is -exactly the right behaviour. -.PP -If you want to compare wall clock/system timestamps to your timers, then -you need to use \f(CW\*(C`ev_periodic\*(C'\fRs, as these are based on the wall clock -time, where your comparisons will always generate correct results. -.PP -\fIThe special problems of suspended animation\fR -.IX Subsection "The special problems of suspended animation" -.PP -When you leave the server world it is quite customary to hit machines that -can suspend/hibernate \- what happens to the clocks during such a suspend? -.PP -Some quick tests made with a Linux 2.6.28 indicate that a suspend freezes -all processes, while the clocks (\f(CW\*(C`times\*(C'\fR, \f(CW\*(C`CLOCK_MONOTONIC\*(C'\fR) continue -to run until the system is suspended, but they will not advance while the -system is suspended. That means, on resume, it will be as if the program -was frozen for a few seconds, but the suspend time will not be counted -towards \f(CW\*(C`ev_timer\*(C'\fR when a monotonic clock source is used. The real time -clock advanced as expected, but if it is used as sole clocksource, then a -long suspend would be detected as a time jump by libev, and timers would -be adjusted accordingly. -.PP -I would not be surprised to see different behaviour in different between -operating systems, \s-1OS\s0 versions or even different hardware. -.PP -The other form of suspend (job control, or sending a \s-1SIGSTOP\s0) will see a -time jump in the monotonic clocks and the realtime clock. If the program -is suspended for a very long time, and monotonic clock sources are in use, -then you can expect \f(CW\*(C`ev_timer\*(C'\fRs to expire as the full suspension time -will be counted towards the timers. When no monotonic clock source is in -use, then libev will again assume a timejump and adjust accordingly. -.PP -It might be beneficial for this latter case to call \f(CW\*(C`ev_suspend\*(C'\fR -and \f(CW\*(C`ev_resume\*(C'\fR in code that handles \f(CW\*(C`SIGTSTP\*(C'\fR, to at least get -deterministic behaviour in this case (you can do nothing against -\&\f(CW\*(C`SIGSTOP\*(C'\fR). -.PP -\fIWatcher-Specific Functions and Data Members\fR -.IX Subsection "Watcher-Specific Functions and Data Members" -.IP "ev_timer_init (ev_timer *, callback, ev_tstamp after, ev_tstamp repeat)" 4 -.IX Item "ev_timer_init (ev_timer *, callback, ev_tstamp after, ev_tstamp repeat)" -.PD 0 -.IP "ev_timer_set (ev_timer *, ev_tstamp after, ev_tstamp repeat)" 4 -.IX Item "ev_timer_set (ev_timer *, ev_tstamp after, ev_tstamp repeat)" -.PD -Configure the timer to trigger after \f(CW\*(C`after\*(C'\fR seconds (fractional and -negative values are supported). If \f(CW\*(C`repeat\*(C'\fR is \f(CW0.\fR, then it will -automatically be stopped once the timeout is reached. If it is positive, -then the timer will automatically be configured to trigger again \f(CW\*(C`repeat\*(C'\fR -seconds later, again, and again, until stopped manually. -.Sp -The timer itself will do a best-effort at avoiding drift, that is, if -you configure a timer to trigger every 10 seconds, then it will normally -trigger at exactly 10 second intervals. If, however, your program cannot -keep up with the timer (because it takes longer than those 10 seconds to -do stuff) the timer will not fire more than once per event loop iteration. -.IP "ev_timer_again (loop, ev_timer *)" 4 -.IX Item "ev_timer_again (loop, ev_timer *)" -This will act as if the timer timed out, and restarts it again if it is -repeating. It basically works like calling \f(CW\*(C`ev_timer_stop\*(C'\fR, updating the -timeout to the \f(CW\*(C`repeat\*(C'\fR value and calling \f(CW\*(C`ev_timer_start\*(C'\fR. -.Sp -The exact semantics are as in the following rules, all of which will be -applied to the watcher: -.RS 4 -.IP "If the timer is pending, the pending status is always cleared." 4 -.IX Item "If the timer is pending, the pending status is always cleared." -.PD 0 -.IP "If the timer is started but non-repeating, stop it (as if it timed out, without invoking it)." 4 -.IX Item "If the timer is started but non-repeating, stop it (as if it timed out, without invoking it)." -.ie n .IP "If the timer is repeating, make the ""repeat"" value the new timeout and start the timer, if necessary." 4 -.el .IP "If the timer is repeating, make the \f(CWrepeat\fR value the new timeout and start the timer, if necessary." 4 -.IX Item "If the timer is repeating, make the repeat value the new timeout and start the timer, if necessary." -.RE -.RS 4 -.PD -.Sp -This sounds a bit complicated, see \*(L"Be smart about timeouts\*(R", above, for a -usage example. -.RE -.IP "ev_tstamp ev_timer_remaining (loop, ev_timer *)" 4 -.IX Item "ev_tstamp ev_timer_remaining (loop, ev_timer *)" -Returns the remaining time until a timer fires. If the timer is active, -then this time is relative to the current event loop time, otherwise it's -the timeout value currently configured. -.Sp -That is, after an \f(CW\*(C`ev_timer_set (w, 5, 7)\*(C'\fR, \f(CW\*(C`ev_timer_remaining\*(C'\fR returns -\&\f(CW5\fR. When the timer is started and one second passes, \f(CW\*(C`ev_timer_remaining\*(C'\fR -will return \f(CW4\fR. When the timer expires and is restarted, it will return -roughly \f(CW7\fR (likely slightly less as callback invocation takes some time, -too), and so on. -.IP "ev_tstamp repeat [read\-write]" 4 -.IX Item "ev_tstamp repeat [read-write]" -The current \f(CW\*(C`repeat\*(C'\fR value. Will be used each time the watcher times out -or \f(CW\*(C`ev_timer_again\*(C'\fR is called, and determines the next timeout (if any), -which is also when any modifications are taken into account. -.PP -\fIExamples\fR -.IX Subsection "Examples" -.PP -Example: Create a timer that fires after 60 seconds. -.PP -.Vb 5 -\& static void -\& one_minute_cb (struct ev_loop *loop, ev_timer *w, int revents) -\& { -\& .. one minute over, w is actually stopped right here -\& } -\& -\& ev_timer mytimer; -\& ev_timer_init (&mytimer, one_minute_cb, 60., 0.); -\& ev_timer_start (loop, &mytimer); -.Ve -.PP -Example: Create a timeout timer that times out after 10 seconds of -inactivity. -.PP -.Vb 5 -\& static void -\& timeout_cb (struct ev_loop *loop, ev_timer *w, int revents) -\& { -\& .. ten seconds without any activity -\& } -\& -\& ev_timer mytimer; -\& ev_timer_init (&mytimer, timeout_cb, 0., 10.); /* note, only repeat used */ -\& ev_timer_again (&mytimer); /* start timer */ -\& ev_run (loop, 0); -\& -\& // and in some piece of code that gets executed on any "activity": -\& // reset the timeout to start ticking again at 10 seconds -\& ev_timer_again (&mytimer); -.Ve -.ie n .SS """ev_periodic"" \- to cron or not to cron?" -.el .SS "\f(CWev_periodic\fP \- to cron or not to cron?" -.IX Subsection "ev_periodic - to cron or not to cron?" -Periodic watchers are also timers of a kind, but they are very versatile -(and unfortunately a bit complex). -.PP -Unlike \f(CW\*(C`ev_timer\*(C'\fR, periodic watchers are not based on real time (or -relative time, the physical time that passes) but on wall clock time -(absolute time, the thing you can read on your calendar or clock). The -difference is that wall clock time can run faster or slower than real -time, and time jumps are not uncommon (e.g. when you adjust your -wrist-watch). -.PP -You can tell a periodic watcher to trigger after some specific point -in time: for example, if you tell a periodic watcher to trigger \*(L"in 10 -seconds\*(R" (by specifying e.g. \f(CW\*(C`ev_now () + 10.\*(C'\fR, that is, an absolute time -not a delay) and then reset your system clock to January of the previous -year, then it will take a year or more to trigger the event (unlike an -\&\f(CW\*(C`ev_timer\*(C'\fR, which would still trigger roughly 10 seconds after starting -it, as it uses a relative timeout). -.PP -\&\f(CW\*(C`ev_periodic\*(C'\fR watchers can also be used to implement vastly more complex -timers, such as triggering an event on each \*(L"midnight, local time\*(R", or -other complicated rules. This cannot easily be done with \f(CW\*(C`ev_timer\*(C'\fR -watchers, as those cannot react to time jumps. -.PP -As with timers, the callback is guaranteed to be invoked only when the -point in time where it is supposed to trigger has passed. If multiple -timers become ready during the same loop iteration then the ones with -earlier time-out values are invoked before ones with later time-out values -(but this is no longer true when a callback calls \f(CW\*(C`ev_run\*(C'\fR recursively). -.PP -\fIWatcher-Specific Functions and Data Members\fR -.IX Subsection "Watcher-Specific Functions and Data Members" -.IP "ev_periodic_init (ev_periodic *, callback, ev_tstamp offset, ev_tstamp interval, reschedule_cb)" 4 -.IX Item "ev_periodic_init (ev_periodic *, callback, ev_tstamp offset, ev_tstamp interval, reschedule_cb)" -.PD 0 -.IP "ev_periodic_set (ev_periodic *, ev_tstamp offset, ev_tstamp interval, reschedule_cb)" 4 -.IX Item "ev_periodic_set (ev_periodic *, ev_tstamp offset, ev_tstamp interval, reschedule_cb)" -.PD -Lots of arguments, let's sort it out... There are basically three modes of -operation, and we will explain them from simplest to most complex: -.RS 4 -.IP "\(bu" 4 -absolute timer (offset = absolute time, interval = 0, reschedule_cb = 0) -.Sp -In this configuration the watcher triggers an event after the wall clock -time \f(CW\*(C`offset\*(C'\fR has passed. It will not repeat and will not adjust when a -time jump occurs, that is, if it is to be run at January 1st 2011 then it -will be stopped and invoked when the system clock reaches or surpasses -this point in time. -.IP "\(bu" 4 -repeating interval timer (offset = offset within interval, interval > 0, reschedule_cb = 0) -.Sp -In this mode the watcher will always be scheduled to time out at the next -\&\f(CW\*(C`offset + N * interval\*(C'\fR time (for some integer N, which can also be -negative) and then repeat, regardless of any time jumps. The \f(CW\*(C`offset\*(C'\fR -argument is merely an offset into the \f(CW\*(C`interval\*(C'\fR periods. -.Sp -This can be used to create timers that do not drift with respect to the -system clock, for example, here is an \f(CW\*(C`ev_periodic\*(C'\fR that triggers each -hour, on the hour (with respect to \s-1UTC\s0): -.Sp -.Vb 1 -\& ev_periodic_set (&periodic, 0., 3600., 0); -.Ve -.Sp -This doesn't mean there will always be 3600 seconds in between triggers, -but only that the callback will be called when the system time shows a -full hour (\s-1UTC\s0), or more correctly, when the system time is evenly divisible -by 3600. -.Sp -Another way to think about it (for the mathematically inclined) is that -\&\f(CW\*(C`ev_periodic\*(C'\fR will try to run the callback in this mode at the next possible -time where \f(CW\*(C`time = offset (mod interval)\*(C'\fR, regardless of any time jumps. -.Sp -The \f(CW\*(C`interval\*(C'\fR \fI\s-1MUST\s0\fR be positive, and for numerical stability, the -interval value should be higher than \f(CW\*(C`1/8192\*(C'\fR (which is around 100 -microseconds) and \f(CW\*(C`offset\*(C'\fR should be higher than \f(CW0\fR and should have -at most a similar magnitude as the current time (say, within a factor of -ten). Typical values for offset are, in fact, \f(CW0\fR or something between -\&\f(CW0\fR and \f(CW\*(C`interval\*(C'\fR, which is also the recommended range. -.Sp -Note also that there is an upper limit to how often a timer can fire (\s-1CPU\s0 -speed for example), so if \f(CW\*(C`interval\*(C'\fR is very small then timing stability -will of course deteriorate. Libev itself tries to be exact to be about one -millisecond (if the \s-1OS\s0 supports it and the machine is fast enough). -.IP "\(bu" 4 -manual reschedule mode (offset ignored, interval ignored, reschedule_cb = callback) -.Sp -In this mode the values for \f(CW\*(C`interval\*(C'\fR and \f(CW\*(C`offset\*(C'\fR are both being -ignored. Instead, each time the periodic watcher gets scheduled, the -reschedule callback will be called with the watcher as first, and the -current time as second argument. -.Sp -\&\s-1NOTE:\s0 \fIThis callback \s-1MUST NOT\s0 stop or destroy any periodic watcher, ever, -or make \s-1ANY\s0 other event loop modifications whatsoever, unless explicitly -allowed by documentation here\fR. -.Sp -If you need to stop it, return \f(CW\*(C`now + 1e30\*(C'\fR (or so, fudge fudge) and stop -it afterwards (e.g. by starting an \f(CW\*(C`ev_prepare\*(C'\fR watcher, which is the -only event loop modification you are allowed to do). -.Sp -The callback prototype is \f(CW\*(C`ev_tstamp (*reschedule_cb)(ev_periodic -*w, ev_tstamp now)\*(C'\fR, e.g.: -.Sp -.Vb 5 -\& static ev_tstamp -\& my_rescheduler (ev_periodic *w, ev_tstamp now) -\& { -\& return now + 60.; -\& } -.Ve -.Sp -It must return the next time to trigger, based on the passed time value -(that is, the lowest time value larger than to the second argument). It -will usually be called just before the callback will be triggered, but -might be called at other times, too. -.Sp -\&\s-1NOTE:\s0 \fIThis callback must always return a time that is higher than or -equal to the passed \f(CI\*(C`now\*(C'\fI value\fR. -.Sp -This can be used to create very complex timers, such as a timer that -triggers on \*(L"next midnight, local time\*(R". To do this, you would calculate -the next midnight after \f(CW\*(C`now\*(C'\fR and return the timestamp value for -this. Here is a (completely untested, no error checking) example on how to -do this: -.Sp -.Vb 1 -\& #include -\& -\& static ev_tstamp -\& my_rescheduler (ev_periodic *w, ev_tstamp now) -\& { -\& time_t tnow = (time_t)now; -\& struct tm tm; -\& localtime_r (&tnow, &tm); -\& -\& tm.tm_sec = tm.tm_min = tm.tm_hour = 0; // midnight current day -\& ++tm.tm_mday; // midnight next day -\& -\& return mktime (&tm); -\& } -.Ve -.Sp -Note: this code might run into trouble on days that have more then two -midnights (beginning and end). -.RE -.RS 4 -.RE -.IP "ev_periodic_again (loop, ev_periodic *)" 4 -.IX Item "ev_periodic_again (loop, ev_periodic *)" -Simply stops and restarts the periodic watcher again. This is only useful -when you changed some parameters or the reschedule callback would return -a different time than the last time it was called (e.g. in a crond like -program when the crontabs have changed). -.IP "ev_tstamp ev_periodic_at (ev_periodic *)" 4 -.IX Item "ev_tstamp ev_periodic_at (ev_periodic *)" -When active, returns the absolute time that the watcher is supposed -to trigger next. This is not the same as the \f(CW\*(C`offset\*(C'\fR argument to -\&\f(CW\*(C`ev_periodic_set\*(C'\fR, but indeed works even in interval and manual -rescheduling modes. -.IP "ev_tstamp offset [read\-write]" 4 -.IX Item "ev_tstamp offset [read-write]" -When repeating, this contains the offset value, otherwise this is the -absolute point in time (the \f(CW\*(C`offset\*(C'\fR value passed to \f(CW\*(C`ev_periodic_set\*(C'\fR, -although libev might modify this value for better numerical stability). -.Sp -Can be modified any time, but changes only take effect when the periodic -timer fires or \f(CW\*(C`ev_periodic_again\*(C'\fR is being called. -.IP "ev_tstamp interval [read\-write]" 4 -.IX Item "ev_tstamp interval [read-write]" -The current interval value. Can be modified any time, but changes only -take effect when the periodic timer fires or \f(CW\*(C`ev_periodic_again\*(C'\fR is being -called. -.IP "ev_tstamp (*reschedule_cb)(ev_periodic *w, ev_tstamp now) [read\-write]" 4 -.IX Item "ev_tstamp (*reschedule_cb)(ev_periodic *w, ev_tstamp now) [read-write]" -The current reschedule callback, or \f(CW0\fR, if this functionality is -switched off. Can be changed any time, but changes only take effect when -the periodic timer fires or \f(CW\*(C`ev_periodic_again\*(C'\fR is being called. -.PP -\fIExamples\fR -.IX Subsection "Examples" -.PP -Example: Call a callback every hour, or, more precisely, whenever the -system time is divisible by 3600. The callback invocation times have -potentially a lot of jitter, but good long-term stability. -.PP -.Vb 5 -\& static void -\& clock_cb (struct ev_loop *loop, ev_periodic *w, int revents) -\& { -\& ... its now a full hour (UTC, or TAI or whatever your clock follows) -\& } -\& -\& ev_periodic hourly_tick; -\& ev_periodic_init (&hourly_tick, clock_cb, 0., 3600., 0); -\& ev_periodic_start (loop, &hourly_tick); -.Ve -.PP -Example: The same as above, but use a reschedule callback to do it: -.PP -.Vb 1 -\& #include -\& -\& static ev_tstamp -\& my_scheduler_cb (ev_periodic *w, ev_tstamp now) -\& { -\& return now + (3600. \- fmod (now, 3600.)); -\& } -\& -\& ev_periodic_init (&hourly_tick, clock_cb, 0., 0., my_scheduler_cb); -.Ve -.PP -Example: Call a callback every hour, starting now: -.PP -.Vb 4 -\& ev_periodic hourly_tick; -\& ev_periodic_init (&hourly_tick, clock_cb, -\& fmod (ev_now (loop), 3600.), 3600., 0); -\& ev_periodic_start (loop, &hourly_tick); -.Ve -.ie n .SS """ev_signal"" \- signal me when a signal gets signalled!" -.el .SS "\f(CWev_signal\fP \- signal me when a signal gets signalled!" -.IX Subsection "ev_signal - signal me when a signal gets signalled!" -Signal watchers will trigger an event when the process receives a specific -signal one or more times. Even though signals are very asynchronous, libev -will try its best to deliver signals synchronously, i.e. as part of the -normal event processing, like any other event. -.PP -If you want signals to be delivered truly asynchronously, just use -\&\f(CW\*(C`sigaction\*(C'\fR as you would do without libev and forget about sharing -the signal. You can even use \f(CW\*(C`ev_async\*(C'\fR from a signal handler to -synchronously wake up an event loop. -.PP -You can configure as many watchers as you like for the same signal, but -only within the same loop, i.e. you can watch for \f(CW\*(C`SIGINT\*(C'\fR in your -default loop and for \f(CW\*(C`SIGIO\*(C'\fR in another loop, but you cannot watch for -\&\f(CW\*(C`SIGINT\*(C'\fR in both the default loop and another loop at the same time. At -the moment, \f(CW\*(C`SIGCHLD\*(C'\fR is permanently tied to the default loop. -.PP -Only after the first watcher for a signal is started will libev actually -register something with the kernel. It thus coexists with your own signal -handlers as long as you don't register any with libev for the same signal. -.PP -If possible and supported, libev will install its handlers with -\&\f(CW\*(C`SA_RESTART\*(C'\fR (or equivalent) behaviour enabled, so system calls should -not be unduly interrupted. If you have a problem with system calls getting -interrupted by signals you can block all signals in an \f(CW\*(C`ev_check\*(C'\fR watcher -and unblock them in an \f(CW\*(C`ev_prepare\*(C'\fR watcher. -.PP -\fIThe special problem of inheritance over fork/execve/pthread_create\fR -.IX Subsection "The special problem of inheritance over fork/execve/pthread_create" -.PP -Both the signal mask (\f(CW\*(C`sigprocmask\*(C'\fR) and the signal disposition -(\f(CW\*(C`sigaction\*(C'\fR) are unspecified after starting a signal watcher (and after -stopping it again), that is, libev might or might not block the signal, -and might or might not set or restore the installed signal handler (but -see \f(CW\*(C`EVFLAG_NOSIGMASK\*(C'\fR). -.PP -While this does not matter for the signal disposition (libev never -sets signals to \f(CW\*(C`SIG_IGN\*(C'\fR, so handlers will be reset to \f(CW\*(C`SIG_DFL\*(C'\fR on -\&\f(CW\*(C`execve\*(C'\fR), this matters for the signal mask: many programs do not expect -certain signals to be blocked. -.PP -This means that before calling \f(CW\*(C`exec\*(C'\fR (from the child) you should reset -the signal mask to whatever \*(L"default\*(R" you expect (all clear is a good -choice usually). -.PP -The simplest way to ensure that the signal mask is reset in the child is -to install a fork handler with \f(CW\*(C`pthread_atfork\*(C'\fR that resets it. That will -catch fork calls done by libraries (such as the libc) as well. -.PP -In current versions of libev, the signal will not be blocked indefinitely -unless you use the \f(CW\*(C`signalfd\*(C'\fR \s-1API\s0 (\f(CW\*(C`EV_SIGNALFD\*(C'\fR). While this reduces -the window of opportunity for problems, it will not go away, as libev -\&\fIhas\fR to modify the signal mask, at least temporarily. -.PP -So I can't stress this enough: \fIIf you do not reset your signal mask when -you expect it to be empty, you have a race condition in your code\fR. This -is not a libev-specific thing, this is true for most event libraries. -.PP -\fIThe special problem of threads signal handling\fR -.IX Subsection "The special problem of threads signal handling" -.PP -\&\s-1POSIX\s0 threads has problematic signal handling semantics, specifically, -a lot of functionality (sigfd, sigwait etc.) only really works if all -threads in a process block signals, which is hard to achieve. -.PP -When you want to use sigwait (or mix libev signal handling with your own -for the same signals), you can tackle this problem by globally blocking -all signals before creating any threads (or creating them with a fully set -sigprocmask) and also specifying the \f(CW\*(C`EVFLAG_NOSIGMASK\*(C'\fR when creating -loops. Then designate one thread as \*(L"signal receiver thread\*(R" which handles -these signals. You can pass on any signals that libev might be interested -in by calling \f(CW\*(C`ev_feed_signal\*(C'\fR. -.PP -\fIWatcher-Specific Functions and Data Members\fR -.IX Subsection "Watcher-Specific Functions and Data Members" -.IP "ev_signal_init (ev_signal *, callback, int signum)" 4 -.IX Item "ev_signal_init (ev_signal *, callback, int signum)" -.PD 0 -.IP "ev_signal_set (ev_signal *, int signum)" 4 -.IX Item "ev_signal_set (ev_signal *, int signum)" -.PD -Configures the watcher to trigger on the given signal number (usually one -of the \f(CW\*(C`SIGxxx\*(C'\fR constants). -.IP "int signum [read\-only]" 4 -.IX Item "int signum [read-only]" -The signal the watcher watches out for. -.PP -\fIExamples\fR -.IX Subsection "Examples" -.PP -Example: Try to exit cleanly on \s-1SIGINT.\s0 -.PP -.Vb 5 -\& static void -\& sigint_cb (struct ev_loop *loop, ev_signal *w, int revents) -\& { -\& ev_break (loop, EVBREAK_ALL); -\& } -\& -\& ev_signal signal_watcher; -\& ev_signal_init (&signal_watcher, sigint_cb, SIGINT); -\& ev_signal_start (loop, &signal_watcher); -.Ve -.ie n .SS """ev_child"" \- watch out for process status changes" -.el .SS "\f(CWev_child\fP \- watch out for process status changes" -.IX Subsection "ev_child - watch out for process status changes" -Child watchers trigger when your process receives a \s-1SIGCHLD\s0 in response to -some child status changes (most typically when a child of yours dies or -exits). It is permissible to install a child watcher \fIafter\fR the child -has been forked (which implies it might have already exited), as long -as the event loop isn't entered (or is continued from a watcher), i.e., -forking and then immediately registering a watcher for the child is fine, -but forking and registering a watcher a few event loop iterations later or -in the next callback invocation is not. -.PP -Only the default event loop is capable of handling signals, and therefore -you can only register child watchers in the default event loop. -.PP -Due to some design glitches inside libev, child watchers will always be -handled at maximum priority (their priority is set to \f(CW\*(C`EV_MAXPRI\*(C'\fR by -libev) -.PP -\fIProcess Interaction\fR -.IX Subsection "Process Interaction" -.PP -Libev grabs \f(CW\*(C`SIGCHLD\*(C'\fR as soon as the default event loop is -initialised. This is necessary to guarantee proper behaviour even if the -first child watcher is started after the child exits. The occurrence -of \f(CW\*(C`SIGCHLD\*(C'\fR is recorded asynchronously, but child reaping is done -synchronously as part of the event loop processing. Libev always reaps all -children, even ones not watched. -.PP -\fIOverriding the Built-In Processing\fR -.IX Subsection "Overriding the Built-In Processing" -.PP -Libev offers no special support for overriding the built-in child -processing, but if your application collides with libev's default child -handler, you can override it easily by installing your own handler for -\&\f(CW\*(C`SIGCHLD\*(C'\fR after initialising the default loop, and making sure the -default loop never gets destroyed. You are encouraged, however, to use an -event-based approach to child reaping and thus use libev's support for -that, so other libev users can use \f(CW\*(C`ev_child\*(C'\fR watchers freely. -.PP -\fIStopping the Child Watcher\fR -.IX Subsection "Stopping the Child Watcher" -.PP -Currently, the child watcher never gets stopped, even when the -child terminates, so normally one needs to stop the watcher in the -callback. Future versions of libev might stop the watcher automatically -when a child exit is detected (calling \f(CW\*(C`ev_child_stop\*(C'\fR twice is not a -problem). -.PP -\fIWatcher-Specific Functions and Data Members\fR -.IX Subsection "Watcher-Specific Functions and Data Members" -.IP "ev_child_init (ev_child *, callback, int pid, int trace)" 4 -.IX Item "ev_child_init (ev_child *, callback, int pid, int trace)" -.PD 0 -.IP "ev_child_set (ev_child *, int pid, int trace)" 4 -.IX Item "ev_child_set (ev_child *, int pid, int trace)" -.PD -Configures the watcher to wait for status changes of process \f(CW\*(C`pid\*(C'\fR (or -\&\fIany\fR process if \f(CW\*(C`pid\*(C'\fR is specified as \f(CW0\fR). The callback can look -at the \f(CW\*(C`rstatus\*(C'\fR member of the \f(CW\*(C`ev_child\*(C'\fR watcher structure to see -the status word (use the macros from \f(CW\*(C`sys/wait.h\*(C'\fR and see your systems -\&\f(CW\*(C`waitpid\*(C'\fR documentation). The \f(CW\*(C`rpid\*(C'\fR member contains the pid of the -process causing the status change. \f(CW\*(C`trace\*(C'\fR must be either \f(CW0\fR (only -activate the watcher when the process terminates) or \f(CW1\fR (additionally -activate the watcher when the process is stopped or continued). -.IP "int pid [read\-only]" 4 -.IX Item "int pid [read-only]" -The process id this watcher watches out for, or \f(CW0\fR, meaning any process id. -.IP "int rpid [read\-write]" 4 -.IX Item "int rpid [read-write]" -The process id that detected a status change. -.IP "int rstatus [read\-write]" 4 -.IX Item "int rstatus [read-write]" -The process exit/trace status caused by \f(CW\*(C`rpid\*(C'\fR (see your systems -\&\f(CW\*(C`waitpid\*(C'\fR and \f(CW\*(C`sys/wait.h\*(C'\fR documentation for details). -.PP -\fIExamples\fR -.IX Subsection "Examples" -.PP -Example: \f(CW\*(C`fork()\*(C'\fR a new process and install a child handler to wait for -its completion. -.PP -.Vb 1 -\& ev_child cw; -\& -\& static void -\& child_cb (EV_P_ ev_child *w, int revents) -\& { -\& ev_child_stop (EV_A_ w); -\& printf ("process %d exited with status %x\en", w\->rpid, w\->rstatus); -\& } -\& -\& pid_t pid = fork (); -\& -\& if (pid < 0) -\& // error -\& else if (pid == 0) -\& { -\& // the forked child executes here -\& exit (1); -\& } -\& else -\& { -\& ev_child_init (&cw, child_cb, pid, 0); -\& ev_child_start (EV_DEFAULT_ &cw); -\& } -.Ve -.ie n .SS """ev_stat"" \- did the file attributes just change?" -.el .SS "\f(CWev_stat\fP \- did the file attributes just change?" -.IX Subsection "ev_stat - did the file attributes just change?" -This watches a file system path for attribute changes. That is, it calls -\&\f(CW\*(C`stat\*(C'\fR on that path in regular intervals (or when the \s-1OS\s0 says it changed) -and sees if it changed compared to the last time, invoking the callback -if it did. Starting the watcher \f(CW\*(C`stat\*(C'\fR's the file, so only changes that -happen after the watcher has been started will be reported. -.PP -The path does not need to exist: changing from \*(L"path exists\*(R" to \*(L"path does -not exist\*(R" is a status change like any other. The condition \*(L"path does not -exist\*(R" (or more correctly \*(L"path cannot be stat'ed\*(R") is signified by the -\&\f(CW\*(C`st_nlink\*(C'\fR field being zero (which is otherwise always forced to be at -least one) and all the other fields of the stat buffer having unspecified -contents. -.PP -The path \fImust not\fR end in a slash or contain special components such as -\&\f(CW\*(C`.\*(C'\fR or \f(CW\*(C`..\*(C'\fR. The path \fIshould\fR be absolute: If it is relative and -your working directory changes, then the behaviour is undefined. -.PP -Since there is no portable change notification interface available, the -portable implementation simply calls \f(CWstat(2)\fR regularly on the path -to see if it changed somehow. You can specify a recommended polling -interval for this case. If you specify a polling interval of \f(CW0\fR (highly -recommended!) then a \fIsuitable, unspecified default\fR value will be used -(which you can expect to be around five seconds, although this might -change dynamically). Libev will also impose a minimum interval which is -currently around \f(CW0.1\fR, but that's usually overkill. -.PP -This watcher type is not meant for massive numbers of stat watchers, -as even with OS-supported change notifications, this can be -resource-intensive. -.PP -At the time of this writing, the only OS-specific interface implemented -is the Linux inotify interface (implementing kqueue support is left as an -exercise for the reader. Note, however, that the author sees no way of -implementing \f(CW\*(C`ev_stat\*(C'\fR semantics with kqueue, except as a hint). -.PP -\fI\s-1ABI\s0 Issues (Largefile Support)\fR -.IX Subsection "ABI Issues (Largefile Support)" -.PP -Libev by default (unless the user overrides this) uses the default -compilation environment, which means that on systems with large file -support disabled by default, you get the 32 bit version of the stat -structure. When using the library from programs that change the \s-1ABI\s0 to -use 64 bit file offsets the programs will fail. In that case you have to -compile libev with the same flags to get binary compatibility. This is -obviously the case with any flags that change the \s-1ABI,\s0 but the problem is -most noticeably displayed with ev_stat and large file support. -.PP -The solution for this is to lobby your distribution maker to make large -file interfaces available by default (as e.g. FreeBSD does) and not -optional. Libev cannot simply switch on large file support because it has -to exchange stat structures with application programs compiled using the -default compilation environment. -.PP -\fIInotify and Kqueue\fR -.IX Subsection "Inotify and Kqueue" -.PP -When \f(CW\*(C`inotify (7)\*(C'\fR support has been compiled into libev and present at -runtime, it will be used to speed up change detection where possible. The -inotify descriptor will be created lazily when the first \f(CW\*(C`ev_stat\*(C'\fR -watcher is being started. -.PP -Inotify presence does not change the semantics of \f(CW\*(C`ev_stat\*(C'\fR watchers -except that changes might be detected earlier, and in some cases, to avoid -making regular \f(CW\*(C`stat\*(C'\fR calls. Even in the presence of inotify support -there are many cases where libev has to resort to regular \f(CW\*(C`stat\*(C'\fR polling, -but as long as kernel 2.6.25 or newer is used (2.6.24 and older have too -many bugs), the path exists (i.e. stat succeeds), and the path resides on -a local filesystem (libev currently assumes only ext2/3, jfs, reiserfs and -xfs are fully working) libev usually gets away without polling. -.PP -There is no support for kqueue, as apparently it cannot be used to -implement this functionality, due to the requirement of having a file -descriptor open on the object at all times, and detecting renames, unlinks -etc. is difficult. -.PP -\fI\f(CI\*(C`stat ()\*(C'\fI is a synchronous operation\fR -.IX Subsection "stat () is a synchronous operation" -.PP -Libev doesn't normally do any kind of I/O itself, and so is not blocking -the process. The exception are \f(CW\*(C`ev_stat\*(C'\fR watchers \- those call \f(CW\*(C`stat -()\*(C'\fR, which is a synchronous operation. -.PP -For local paths, this usually doesn't matter: unless the system is very -busy or the intervals between stat's are large, a stat call will be fast, -as the path data is usually in memory already (except when starting the -watcher). -.PP -For networked file systems, calling \f(CW\*(C`stat ()\*(C'\fR can block an indefinite -time due to network issues, and even under good conditions, a stat call -often takes multiple milliseconds. -.PP -Therefore, it is best to avoid using \f(CW\*(C`ev_stat\*(C'\fR watchers on networked -paths, although this is fully supported by libev. -.PP -\fIThe special problem of stat time resolution\fR -.IX Subsection "The special problem of stat time resolution" -.PP -The \f(CW\*(C`stat ()\*(C'\fR system call only supports full-second resolution portably, -and even on systems where the resolution is higher, most file systems -still only support whole seconds. -.PP -That means that, if the time is the only thing that changes, you can -easily miss updates: on the first update, \f(CW\*(C`ev_stat\*(C'\fR detects a change and -calls your callback, which does something. When there is another update -within the same second, \f(CW\*(C`ev_stat\*(C'\fR will be unable to detect unless the -stat data does change in other ways (e.g. file size). -.PP -The solution to this is to delay acting on a change for slightly more -than a second (or till slightly after the next full second boundary), using -a roughly one-second-delay \f(CW\*(C`ev_timer\*(C'\fR (e.g. \f(CW\*(C`ev_timer_set (w, 0., 1.02); -ev_timer_again (loop, w)\*(C'\fR). -.PP -The \f(CW.02\fR offset is added to work around small timing inconsistencies -of some operating systems (where the second counter of the current time -might be be delayed. One such system is the Linux kernel, where a call to -\&\f(CW\*(C`gettimeofday\*(C'\fR might return a timestamp with a full second later than -a subsequent \f(CW\*(C`time\*(C'\fR call \- if the equivalent of \f(CW\*(C`time ()\*(C'\fR is used to -update file times then there will be a small window where the kernel uses -the previous second to update file times but libev might already execute -the timer callback). -.PP -\fIWatcher-Specific Functions and Data Members\fR -.IX Subsection "Watcher-Specific Functions and Data Members" -.IP "ev_stat_init (ev_stat *, callback, const char *path, ev_tstamp interval)" 4 -.IX Item "ev_stat_init (ev_stat *, callback, const char *path, ev_tstamp interval)" -.PD 0 -.IP "ev_stat_set (ev_stat *, const char *path, ev_tstamp interval)" 4 -.IX Item "ev_stat_set (ev_stat *, const char *path, ev_tstamp interval)" -.PD -Configures the watcher to wait for status changes of the given -\&\f(CW\*(C`path\*(C'\fR. The \f(CW\*(C`interval\*(C'\fR is a hint on how quickly a change is expected to -be detected and should normally be specified as \f(CW0\fR to let libev choose -a suitable value. The memory pointed to by \f(CW\*(C`path\*(C'\fR must point to the same -path for as long as the watcher is active. -.Sp -The callback will receive an \f(CW\*(C`EV_STAT\*(C'\fR event when a change was detected, -relative to the attributes at the time the watcher was started (or the -last change was detected). -.IP "ev_stat_stat (loop, ev_stat *)" 4 -.IX Item "ev_stat_stat (loop, ev_stat *)" -Updates the stat buffer immediately with new values. If you change the -watched path in your callback, you could call this function to avoid -detecting this change (while introducing a race condition if you are not -the only one changing the path). Can also be useful simply to find out the -new values. -.IP "ev_statdata attr [read\-only]" 4 -.IX Item "ev_statdata attr [read-only]" -The most-recently detected attributes of the file. Although the type is -\&\f(CW\*(C`ev_statdata\*(C'\fR, this is usually the (or one of the) \f(CW\*(C`struct stat\*(C'\fR types -suitable for your system, but you can only rely on the POSIX-standardised -members to be present. If the \f(CW\*(C`st_nlink\*(C'\fR member is \f(CW0\fR, then there was -some error while \f(CW\*(C`stat\*(C'\fRing the file. -.IP "ev_statdata prev [read\-only]" 4 -.IX Item "ev_statdata prev [read-only]" -The previous attributes of the file. The callback gets invoked whenever -\&\f(CW\*(C`prev\*(C'\fR != \f(CW\*(C`attr\*(C'\fR, or, more precisely, one or more of these members -differ: \f(CW\*(C`st_dev\*(C'\fR, \f(CW\*(C`st_ino\*(C'\fR, \f(CW\*(C`st_mode\*(C'\fR, \f(CW\*(C`st_nlink\*(C'\fR, \f(CW\*(C`st_uid\*(C'\fR, -\&\f(CW\*(C`st_gid\*(C'\fR, \f(CW\*(C`st_rdev\*(C'\fR, \f(CW\*(C`st_size\*(C'\fR, \f(CW\*(C`st_atime\*(C'\fR, \f(CW\*(C`st_mtime\*(C'\fR, \f(CW\*(C`st_ctime\*(C'\fR. -.IP "ev_tstamp interval [read\-only]" 4 -.IX Item "ev_tstamp interval [read-only]" -The specified interval. -.IP "const char *path [read\-only]" 4 -.IX Item "const char *path [read-only]" -The file system path that is being watched. -.PP -\fIExamples\fR -.IX Subsection "Examples" -.PP -Example: Watch \f(CW\*(C`/etc/passwd\*(C'\fR for attribute changes. -.PP -.Vb 10 -\& static void -\& passwd_cb (struct ev_loop *loop, ev_stat *w, int revents) -\& { -\& /* /etc/passwd changed in some way */ -\& if (w\->attr.st_nlink) -\& { -\& printf ("passwd current size %ld\en", (long)w\->attr.st_size); -\& printf ("passwd current atime %ld\en", (long)w\->attr.st_mtime); -\& printf ("passwd current mtime %ld\en", (long)w\->attr.st_mtime); -\& } -\& else -\& /* you shalt not abuse printf for puts */ -\& puts ("wow, /etc/passwd is not there, expect problems. " -\& "if this is windows, they already arrived\en"); -\& } -\& -\& ... -\& ev_stat passwd; -\& -\& ev_stat_init (&passwd, passwd_cb, "/etc/passwd", 0.); -\& ev_stat_start (loop, &passwd); -.Ve -.PP -Example: Like above, but additionally use a one-second delay so we do not -miss updates (however, frequent updates will delay processing, too, so -one might do the work both on \f(CW\*(C`ev_stat\*(C'\fR callback invocation \fIand\fR on -\&\f(CW\*(C`ev_timer\*(C'\fR callback invocation). -.PP -.Vb 2 -\& static ev_stat passwd; -\& static ev_timer timer; -\& -\& static void -\& timer_cb (EV_P_ ev_timer *w, int revents) -\& { -\& ev_timer_stop (EV_A_ w); -\& -\& /* now it\*(Aqs one second after the most recent passwd change */ -\& } -\& -\& static void -\& stat_cb (EV_P_ ev_stat *w, int revents) -\& { -\& /* reset the one\-second timer */ -\& ev_timer_again (EV_A_ &timer); -\& } -\& -\& ... -\& ev_stat_init (&passwd, stat_cb, "/etc/passwd", 0.); -\& ev_stat_start (loop, &passwd); -\& ev_timer_init (&timer, timer_cb, 0., 1.02); -.Ve -.ie n .SS """ev_idle"" \- when you've got nothing better to do..." -.el .SS "\f(CWev_idle\fP \- when you've got nothing better to do..." -.IX Subsection "ev_idle - when you've got nothing better to do..." -Idle watchers trigger events when no other events of the same or higher -priority are pending (prepare, check and other idle watchers do not count -as receiving \*(L"events\*(R"). -.PP -That is, as long as your process is busy handling sockets or timeouts -(or even signals, imagine) of the same or higher priority it will not be -triggered. But when your process is idle (or only lower-priority watchers -are pending), the idle watchers are being called once per event loop -iteration \- until stopped, that is, or your process receives more events -and becomes busy again with higher priority stuff. -.PP -The most noteworthy effect is that as long as any idle watchers are -active, the process will not block when waiting for new events. -.PP -Apart from keeping your process non-blocking (which is a useful -effect on its own sometimes), idle watchers are a good place to do -\&\*(L"pseudo-background processing\*(R", or delay processing stuff to after the -event loop has handled all outstanding events. -.PP -\fIAbusing an \f(CI\*(C`ev_idle\*(C'\fI watcher for its side-effect\fR -.IX Subsection "Abusing an ev_idle watcher for its side-effect" -.PP -As long as there is at least one active idle watcher, libev will never -sleep unnecessarily. Or in other words, it will loop as fast as possible. -For this to work, the idle watcher doesn't need to be invoked at all \- the -lowest priority will do. -.PP -This mode of operation can be useful together with an \f(CW\*(C`ev_check\*(C'\fR watcher, -to do something on each event loop iteration \- for example to balance load -between different connections. -.PP -See \*(L"Abusing an ev_check watcher for its side-effect\*(R" for a longer -example. -.PP -\fIWatcher-Specific Functions and Data Members\fR -.IX Subsection "Watcher-Specific Functions and Data Members" -.IP "ev_idle_init (ev_idle *, callback)" 4 -.IX Item "ev_idle_init (ev_idle *, callback)" -Initialises and configures the idle watcher \- it has no parameters of any -kind. There is a \f(CW\*(C`ev_idle_set\*(C'\fR macro, but using it is utterly pointless, -believe me. -.PP -\fIExamples\fR -.IX Subsection "Examples" -.PP -Example: Dynamically allocate an \f(CW\*(C`ev_idle\*(C'\fR watcher, start it, and in the -callback, free it. Also, use no error checking, as usual. -.PP -.Vb 5 -\& static void -\& idle_cb (struct ev_loop *loop, ev_idle *w, int revents) -\& { -\& // stop the watcher -\& ev_idle_stop (loop, w); -\& -\& // now we can free it -\& free (w); -\& -\& // now do something you wanted to do when the program has -\& // no longer anything immediate to do. -\& } -\& -\& ev_idle *idle_watcher = malloc (sizeof (ev_idle)); -\& ev_idle_init (idle_watcher, idle_cb); -\& ev_idle_start (loop, idle_watcher); -.Ve -.ie n .SS """ev_prepare"" and ""ev_check"" \- customise your event loop!" -.el .SS "\f(CWev_prepare\fP and \f(CWev_check\fP \- customise your event loop!" -.IX Subsection "ev_prepare and ev_check - customise your event loop!" -Prepare and check watchers are often (but not always) used in pairs: -prepare watchers get invoked before the process blocks and check watchers -afterwards. -.PP -You \fImust not\fR call \f(CW\*(C`ev_run\*(C'\fR (or similar functions that enter the -current event loop) or \f(CW\*(C`ev_loop_fork\*(C'\fR from either \f(CW\*(C`ev_prepare\*(C'\fR or -\&\f(CW\*(C`ev_check\*(C'\fR watchers. Other loops than the current one are fine, -however. The rationale behind this is that you do not need to check -for recursion in those watchers, i.e. the sequence will always be -\&\f(CW\*(C`ev_prepare\*(C'\fR, blocking, \f(CW\*(C`ev_check\*(C'\fR so if you have one watcher of each -kind they will always be called in pairs bracketing the blocking call. -.PP -Their main purpose is to integrate other event mechanisms into libev and -their use is somewhat advanced. They could be used, for example, to track -variable changes, implement your own watchers, integrate net-snmp or a -coroutine library and lots more. They are also occasionally useful if -you cache some data and want to flush it before blocking (for example, -in X programs you might want to do an \f(CW\*(C`XFlush ()\*(C'\fR in an \f(CW\*(C`ev_prepare\*(C'\fR -watcher). -.PP -This is done by examining in each prepare call which file descriptors -need to be watched by the other library, registering \f(CW\*(C`ev_io\*(C'\fR watchers -for them and starting an \f(CW\*(C`ev_timer\*(C'\fR watcher for any timeouts (many -libraries provide exactly this functionality). Then, in the check watcher, -you check for any events that occurred (by checking the pending status -of all watchers and stopping them) and call back into the library. The -I/O and timer callbacks will never actually be called (but must be valid -nevertheless, because you never know, you know?). -.PP -As another example, the Perl Coro module uses these hooks to integrate -coroutines into libev programs, by yielding to other active coroutines -during each prepare and only letting the process block if no coroutines -are ready to run (it's actually more complicated: it only runs coroutines -with priority higher than or equal to the event loop and one coroutine -of lower priority, but only once, using idle watchers to keep the event -loop from blocking if lower-priority coroutines are active, thus mapping -low-priority coroutines to idle/background tasks). -.PP -When used for this purpose, it is recommended to give \f(CW\*(C`ev_check\*(C'\fR watchers -highest (\f(CW\*(C`EV_MAXPRI\*(C'\fR) priority, to ensure that they are being run before -any other watchers after the poll (this doesn't matter for \f(CW\*(C`ev_prepare\*(C'\fR -watchers). -.PP -Also, \f(CW\*(C`ev_check\*(C'\fR watchers (and \f(CW\*(C`ev_prepare\*(C'\fR watchers, too) should not -activate (\*(L"feed\*(R") events into libev. While libev fully supports this, they -might get executed before other \f(CW\*(C`ev_check\*(C'\fR watchers did their job. As -\&\f(CW\*(C`ev_check\*(C'\fR watchers are often used to embed other (non-libev) event -loops those other event loops might be in an unusable state until their -\&\f(CW\*(C`ev_check\*(C'\fR watcher ran (always remind yourself to coexist peacefully with -others). -.PP -\fIAbusing an \f(CI\*(C`ev_check\*(C'\fI watcher for its side-effect\fR -.IX Subsection "Abusing an ev_check watcher for its side-effect" -.PP -\&\f(CW\*(C`ev_check\*(C'\fR (and less often also \f(CW\*(C`ev_prepare\*(C'\fR) watchers can also be -useful because they are called once per event loop iteration. For -example, if you want to handle a large number of connections fairly, you -normally only do a bit of work for each active connection, and if there -is more work to do, you wait for the next event loop iteration, so other -connections have a chance of making progress. -.PP -Using an \f(CW\*(C`ev_check\*(C'\fR watcher is almost enough: it will be called on the -next event loop iteration. However, that isn't as soon as possible \- -without external events, your \f(CW\*(C`ev_check\*(C'\fR watcher will not be invoked. -.PP -This is where \f(CW\*(C`ev_idle\*(C'\fR watchers come in handy \- all you need is a -single global idle watcher that is active as long as you have one active -\&\f(CW\*(C`ev_check\*(C'\fR watcher. The \f(CW\*(C`ev_idle\*(C'\fR watcher makes sure the event loop -will not sleep, and the \f(CW\*(C`ev_check\*(C'\fR watcher makes sure a callback gets -invoked. Neither watcher alone can do that. -.PP -\fIWatcher-Specific Functions and Data Members\fR -.IX Subsection "Watcher-Specific Functions and Data Members" -.IP "ev_prepare_init (ev_prepare *, callback)" 4 -.IX Item "ev_prepare_init (ev_prepare *, callback)" -.PD 0 -.IP "ev_check_init (ev_check *, callback)" 4 -.IX Item "ev_check_init (ev_check *, callback)" -.PD -Initialises and configures the prepare or check watcher \- they have no -parameters of any kind. There are \f(CW\*(C`ev_prepare_set\*(C'\fR and \f(CW\*(C`ev_check_set\*(C'\fR -macros, but using them is utterly, utterly, utterly and completely -pointless. -.PP -\fIExamples\fR -.IX Subsection "Examples" -.PP -There are a number of principal ways to embed other event loops or modules -into libev. Here are some ideas on how to include libadns into libev -(there is a Perl module named \f(CW\*(C`EV::ADNS\*(C'\fR that does this, which you could -use as a working example. Another Perl module named \f(CW\*(C`EV::Glib\*(C'\fR embeds a -Glib main context into libev, and finally, \f(CW\*(C`Glib::EV\*(C'\fR embeds \s-1EV\s0 into the -Glib event loop). -.PP -Method 1: Add \s-1IO\s0 watchers and a timeout watcher in a prepare handler, -and in a check watcher, destroy them and call into libadns. What follows -is pseudo-code only of course. This requires you to either use a low -priority for the check watcher or use \f(CW\*(C`ev_clear_pending\*(C'\fR explicitly, as -the callbacks for the IO/timeout watchers might not have been called yet. -.PP -.Vb 2 -\& static ev_io iow [nfd]; -\& static ev_timer tw; -\& -\& static void -\& io_cb (struct ev_loop *loop, ev_io *w, int revents) -\& { -\& } -\& -\& // create io watchers for each fd and a timer before blocking -\& static void -\& adns_prepare_cb (struct ev_loop *loop, ev_prepare *w, int revents) -\& { -\& int timeout = 3600000; -\& struct pollfd fds [nfd]; -\& // actual code will need to loop here and realloc etc. -\& adns_beforepoll (ads, fds, &nfd, &timeout, timeval_from (ev_time ())); -\& -\& /* the callback is illegal, but won\*(Aqt be called as we stop during check */ -\& ev_timer_init (&tw, 0, timeout * 1e\-3, 0.); -\& ev_timer_start (loop, &tw); -\& -\& // create one ev_io per pollfd -\& for (int i = 0; i < nfd; ++i) -\& { -\& ev_io_init (iow + i, io_cb, fds [i].fd, -\& ((fds [i].events & POLLIN ? EV_READ : 0) -\& | (fds [i].events & POLLOUT ? EV_WRITE : 0))); -\& -\& fds [i].revents = 0; -\& ev_io_start (loop, iow + i); -\& } -\& } -\& -\& // stop all watchers after blocking -\& static void -\& adns_check_cb (struct ev_loop *loop, ev_check *w, int revents) -\& { -\& ev_timer_stop (loop, &tw); -\& -\& for (int i = 0; i < nfd; ++i) -\& { -\& // set the relevant poll flags -\& // could also call adns_processreadable etc. here -\& struct pollfd *fd = fds + i; -\& int revents = ev_clear_pending (iow + i); -\& if (revents & EV_READ ) fd\->revents |= fd\->events & POLLIN; -\& if (revents & EV_WRITE) fd\->revents |= fd\->events & POLLOUT; -\& -\& // now stop the watcher -\& ev_io_stop (loop, iow + i); -\& } -\& -\& adns_afterpoll (adns, fds, nfd, timeval_from (ev_now (loop)); -\& } -.Ve -.PP -Method 2: This would be just like method 1, but you run \f(CW\*(C`adns_afterpoll\*(C'\fR -in the prepare watcher and would dispose of the check watcher. -.PP -Method 3: If the module to be embedded supports explicit event -notification (libadns does), you can also make use of the actual watcher -callbacks, and only destroy/create the watchers in the prepare watcher. -.PP -.Vb 5 -\& static void -\& timer_cb (EV_P_ ev_timer *w, int revents) -\& { -\& adns_state ads = (adns_state)w\->data; -\& update_now (EV_A); -\& -\& adns_processtimeouts (ads, &tv_now); -\& } -\& -\& static void -\& io_cb (EV_P_ ev_io *w, int revents) -\& { -\& adns_state ads = (adns_state)w\->data; -\& update_now (EV_A); -\& -\& if (revents & EV_READ ) adns_processreadable (ads, w\->fd, &tv_now); -\& if (revents & EV_WRITE) adns_processwriteable (ads, w\->fd, &tv_now); -\& } -\& -\& // do not ever call adns_afterpoll -.Ve -.PP -Method 4: Do not use a prepare or check watcher because the module you -want to embed is not flexible enough to support it. Instead, you can -override their poll function. The drawback with this solution is that the -main loop is now no longer controllable by \s-1EV.\s0 The \f(CW\*(C`Glib::EV\*(C'\fR module uses -this approach, effectively embedding \s-1EV\s0 as a client into the horrible -libglib event loop. -.PP -.Vb 4 -\& static gint -\& event_poll_func (GPollFD *fds, guint nfds, gint timeout) -\& { -\& int got_events = 0; -\& -\& for (n = 0; n < nfds; ++n) -\& // create/start io watcher that sets the relevant bits in fds[n] and increment got_events -\& -\& if (timeout >= 0) -\& // create/start timer -\& -\& // poll -\& ev_run (EV_A_ 0); -\& -\& // stop timer again -\& if (timeout >= 0) -\& ev_timer_stop (EV_A_ &to); -\& -\& // stop io watchers again \- their callbacks should have set -\& for (n = 0; n < nfds; ++n) -\& ev_io_stop (EV_A_ iow [n]); -\& -\& return got_events; -\& } -.Ve -.ie n .SS """ev_embed"" \- when one backend isn't enough..." -.el .SS "\f(CWev_embed\fP \- when one backend isn't enough..." -.IX Subsection "ev_embed - when one backend isn't enough..." -This is a rather advanced watcher type that lets you embed one event loop -into another (currently only \f(CW\*(C`ev_io\*(C'\fR events are supported in the embedded -loop, other types of watchers might be handled in a delayed or incorrect -fashion and must not be used). -.PP -There are primarily two reasons you would want that: work around bugs and -prioritise I/O. -.PP -As an example for a bug workaround, the kqueue backend might only support -sockets on some platform, so it is unusable as generic backend, but you -still want to make use of it because you have many sockets and it scales -so nicely. In this case, you would create a kqueue-based loop and embed -it into your default loop (which might use e.g. poll). Overall operation -will be a bit slower because first libev has to call \f(CW\*(C`poll\*(C'\fR and then -\&\f(CW\*(C`kevent\*(C'\fR, but at least you can use both mechanisms for what they are -best: \f(CW\*(C`kqueue\*(C'\fR for scalable sockets and \f(CW\*(C`poll\*(C'\fR if you want it to work :) -.PP -As for prioritising I/O: under rare circumstances you have the case where -some fds have to be watched and handled very quickly (with low latency), -and even priorities and idle watchers might have too much overhead. In -this case you would put all the high priority stuff in one loop and all -the rest in a second one, and embed the second one in the first. -.PP -As long as the watcher is active, the callback will be invoked every -time there might be events pending in the embedded loop. The callback -must then call \f(CW\*(C`ev_embed_sweep (mainloop, watcher)\*(C'\fR to make a single -sweep and invoke their callbacks (the callback doesn't need to invoke the -\&\f(CW\*(C`ev_embed_sweep\*(C'\fR function directly, it could also start an idle watcher -to give the embedded loop strictly lower priority for example). -.PP -You can also set the callback to \f(CW0\fR, in which case the embed watcher -will automatically execute the embedded loop sweep whenever necessary. -.PP -Fork detection will be handled transparently while the \f(CW\*(C`ev_embed\*(C'\fR watcher -is active, i.e., the embedded loop will automatically be forked when the -embedding loop forks. In other cases, the user is responsible for calling -\&\f(CW\*(C`ev_loop_fork\*(C'\fR on the embedded loop. -.PP -Unfortunately, not all backends are embeddable: only the ones returned by -\&\f(CW\*(C`ev_embeddable_backends\*(C'\fR are, which, unfortunately, does not include any -portable one. -.PP -So when you want to use this feature you will always have to be prepared -that you cannot get an embeddable loop. The recommended way to get around -this is to have a separate variables for your embeddable loop, try to -create it, and if that fails, use the normal loop for everything. -.PP -\fI\f(CI\*(C`ev_embed\*(C'\fI and fork\fR -.IX Subsection "ev_embed and fork" -.PP -While the \f(CW\*(C`ev_embed\*(C'\fR watcher is running, forks in the embedding loop will -automatically be applied to the embedded loop as well, so no special -fork handling is required in that case. When the watcher is not running, -however, it is still the task of the libev user to call \f(CW\*(C`ev_loop_fork ()\*(C'\fR -as applicable. -.PP -\fIWatcher-Specific Functions and Data Members\fR -.IX Subsection "Watcher-Specific Functions and Data Members" -.IP "ev_embed_init (ev_embed *, callback, struct ev_loop *embedded_loop)" 4 -.IX Item "ev_embed_init (ev_embed *, callback, struct ev_loop *embedded_loop)" -.PD 0 -.IP "ev_embed_set (ev_embed *, struct ev_loop *embedded_loop)" 4 -.IX Item "ev_embed_set (ev_embed *, struct ev_loop *embedded_loop)" -.PD -Configures the watcher to embed the given loop, which must be -embeddable. If the callback is \f(CW0\fR, then \f(CW\*(C`ev_embed_sweep\*(C'\fR will be -invoked automatically, otherwise it is the responsibility of the callback -to invoke it (it will continue to be called until the sweep has been done, -if you do not want that, you need to temporarily stop the embed watcher). -.IP "ev_embed_sweep (loop, ev_embed *)" 4 -.IX Item "ev_embed_sweep (loop, ev_embed *)" -Make a single, non-blocking sweep over the embedded loop. This works -similarly to \f(CW\*(C`ev_run (embedded_loop, EVRUN_NOWAIT)\*(C'\fR, but in the most -appropriate way for embedded loops. -.IP "struct ev_loop *other [read\-only]" 4 -.IX Item "struct ev_loop *other [read-only]" -The embedded event loop. -.PP -\fIExamples\fR -.IX Subsection "Examples" -.PP -Example: Try to get an embeddable event loop and embed it into the default -event loop. If that is not possible, use the default loop. The default -loop is stored in \f(CW\*(C`loop_hi\*(C'\fR, while the embeddable loop is stored in -\&\f(CW\*(C`loop_lo\*(C'\fR (which is \f(CW\*(C`loop_hi\*(C'\fR in the case no embeddable loop can be -used). -.PP -.Vb 3 -\& struct ev_loop *loop_hi = ev_default_init (0); -\& struct ev_loop *loop_lo = 0; -\& ev_embed embed; -\& -\& // see if there is a chance of getting one that works -\& // (remember that a flags value of 0 means autodetection) -\& loop_lo = ev_embeddable_backends () & ev_recommended_backends () -\& ? ev_loop_new (ev_embeddable_backends () & ev_recommended_backends ()) -\& : 0; -\& -\& // if we got one, then embed it, otherwise default to loop_hi -\& if (loop_lo) -\& { -\& ev_embed_init (&embed, 0, loop_lo); -\& ev_embed_start (loop_hi, &embed); -\& } -\& else -\& loop_lo = loop_hi; -.Ve -.PP -Example: Check if kqueue is available but not recommended and create -a kqueue backend for use with sockets (which usually work with any -kqueue implementation). Store the kqueue/socket\-only event loop in -\&\f(CW\*(C`loop_socket\*(C'\fR. (One might optionally use \f(CW\*(C`EVFLAG_NOENV\*(C'\fR, too). -.PP -.Vb 3 -\& struct ev_loop *loop = ev_default_init (0); -\& struct ev_loop *loop_socket = 0; -\& ev_embed embed; -\& -\& if (ev_supported_backends () & ~ev_recommended_backends () & EVBACKEND_KQUEUE) -\& if ((loop_socket = ev_loop_new (EVBACKEND_KQUEUE)) -\& { -\& ev_embed_init (&embed, 0, loop_socket); -\& ev_embed_start (loop, &embed); -\& } -\& -\& if (!loop_socket) -\& loop_socket = loop; -\& -\& // now use loop_socket for all sockets, and loop for everything else -.Ve -.ie n .SS """ev_fork"" \- the audacity to resume the event loop after a fork" -.el .SS "\f(CWev_fork\fP \- the audacity to resume the event loop after a fork" -.IX Subsection "ev_fork - the audacity to resume the event loop after a fork" -Fork watchers are called when a \f(CW\*(C`fork ()\*(C'\fR was detected (usually because -whoever is a good citizen cared to tell libev about it by calling -\&\f(CW\*(C`ev_loop_fork\*(C'\fR). The invocation is done before the event loop blocks next -and before \f(CW\*(C`ev_check\*(C'\fR watchers are being called, and only in the child -after the fork. If whoever good citizen calling \f(CW\*(C`ev_default_fork\*(C'\fR cheats -and calls it in the wrong process, the fork handlers will be invoked, too, -of course. -.PP -\fIThe special problem of life after fork \- how is it possible?\fR -.IX Subsection "The special problem of life after fork - how is it possible?" -.PP -Most uses of \f(CW\*(C`fork ()\*(C'\fR consist of forking, then some simple calls to set -up/change the process environment, followed by a call to \f(CW\*(C`exec()\*(C'\fR. This -sequence should be handled by libev without any problems. -.PP -This changes when the application actually wants to do event handling -in the child, or both parent in child, in effect \*(L"continuing\*(R" after the -fork. -.PP -The default mode of operation (for libev, with application help to detect -forks) is to duplicate all the state in the child, as would be expected -when \fIeither\fR the parent \fIor\fR the child process continues. -.PP -When both processes want to continue using libev, then this is usually the -wrong result. In that case, usually one process (typically the parent) is -supposed to continue with all watchers in place as before, while the other -process typically wants to start fresh, i.e. without any active watchers. -.PP -The cleanest and most efficient way to achieve that with libev is to -simply create a new event loop, which of course will be \*(L"empty\*(R", and -use that for new watchers. This has the advantage of not touching more -memory than necessary, and thus avoiding the copy-on-write, and the -disadvantage of having to use multiple event loops (which do not support -signal watchers). -.PP -When this is not possible, or you want to use the default loop for -other reasons, then in the process that wants to start \*(L"fresh\*(R", call -\&\f(CW\*(C`ev_loop_destroy (EV_DEFAULT)\*(C'\fR followed by \f(CW\*(C`ev_default_loop (...)\*(C'\fR. -Destroying the default loop will \*(L"orphan\*(R" (not stop) all registered -watchers, so you have to be careful not to execute code that modifies -those watchers. Note also that in that case, you have to re-register any -signal watchers. -.PP -\fIWatcher-Specific Functions and Data Members\fR -.IX Subsection "Watcher-Specific Functions and Data Members" -.IP "ev_fork_init (ev_fork *, callback)" 4 -.IX Item "ev_fork_init (ev_fork *, callback)" -Initialises and configures the fork watcher \- it has no parameters of any -kind. There is a \f(CW\*(C`ev_fork_set\*(C'\fR macro, but using it is utterly pointless, -really. -.ie n .SS """ev_cleanup"" \- even the best things end" -.el .SS "\f(CWev_cleanup\fP \- even the best things end" -.IX Subsection "ev_cleanup - even the best things end" -Cleanup watchers are called just before the event loop is being destroyed -by a call to \f(CW\*(C`ev_loop_destroy\*(C'\fR. -.PP -While there is no guarantee that the event loop gets destroyed, cleanup -watchers provide a convenient method to install cleanup hooks for your -program, worker threads and so on \- you just to make sure to destroy the -loop when you want them to be invoked. -.PP -Cleanup watchers are invoked in the same way as any other watcher. Unlike -all other watchers, they do not keep a reference to the event loop (which -makes a lot of sense if you think about it). Like all other watchers, you -can call libev functions in the callback, except \f(CW\*(C`ev_cleanup_start\*(C'\fR. -.PP -\fIWatcher-Specific Functions and Data Members\fR -.IX Subsection "Watcher-Specific Functions and Data Members" -.IP "ev_cleanup_init (ev_cleanup *, callback)" 4 -.IX Item "ev_cleanup_init (ev_cleanup *, callback)" -Initialises and configures the cleanup watcher \- it has no parameters of -any kind. There is a \f(CW\*(C`ev_cleanup_set\*(C'\fR macro, but using it is utterly -pointless, I assure you. -.PP -Example: Register an atexit handler to destroy the default loop, so any -cleanup functions are called. -.PP -.Vb 5 -\& static void -\& program_exits (void) -\& { -\& ev_loop_destroy (EV_DEFAULT_UC); -\& } -\& -\& ... -\& atexit (program_exits); -.Ve -.ie n .SS """ev_async"" \- how to wake up an event loop" -.el .SS "\f(CWev_async\fP \- how to wake up an event loop" -.IX Subsection "ev_async - how to wake up an event loop" -In general, you cannot use an \f(CW\*(C`ev_loop\*(C'\fR from multiple threads or other -asynchronous sources such as signal handlers (as opposed to multiple event -loops \- those are of course safe to use in different threads). -.PP -Sometimes, however, you need to wake up an event loop you do not control, -for example because it belongs to another thread. This is what \f(CW\*(C`ev_async\*(C'\fR -watchers do: as long as the \f(CW\*(C`ev_async\*(C'\fR watcher is active, you can signal -it by calling \f(CW\*(C`ev_async_send\*(C'\fR, which is thread\- and signal safe. -.PP -This functionality is very similar to \f(CW\*(C`ev_signal\*(C'\fR watchers, as signals, -too, are asynchronous in nature, and signals, too, will be compressed -(i.e. the number of callback invocations may be less than the number of -\&\f(CW\*(C`ev_async_send\*(C'\fR calls). In fact, you could use signal watchers as a kind -of \*(L"global async watchers\*(R" by using a watcher on an otherwise unused -signal, and \f(CW\*(C`ev_feed_signal\*(C'\fR to signal this watcher from another thread, -even without knowing which loop owns the signal. -.PP -\fIQueueing\fR -.IX Subsection "Queueing" -.PP -\&\f(CW\*(C`ev_async\*(C'\fR does not support queueing of data in any way. The reason -is that the author does not know of a simple (or any) algorithm for a -multiple-writer-single-reader queue that works in all cases and doesn't -need elaborate support such as pthreads or unportable memory access -semantics. -.PP -That means that if you want to queue data, you have to provide your own -queue. But at least I can tell you how to implement locking around your -queue: -.IP "queueing from a signal handler context" 4 -.IX Item "queueing from a signal handler context" -To implement race-free queueing, you simply add to the queue in the signal -handler but you block the signal handler in the watcher callback. Here is -an example that does that for some fictitious \s-1SIGUSR1\s0 handler: -.Sp -.Vb 1 -\& static ev_async mysig; -\& -\& static void -\& sigusr1_handler (void) -\& { -\& sometype data; -\& -\& // no locking etc. -\& queue_put (data); -\& ev_async_send (EV_DEFAULT_ &mysig); -\& } -\& -\& static void -\& mysig_cb (EV_P_ ev_async *w, int revents) -\& { -\& sometype data; -\& sigset_t block, prev; -\& -\& sigemptyset (&block); -\& sigaddset (&block, SIGUSR1); -\& sigprocmask (SIG_BLOCK, &block, &prev); -\& -\& while (queue_get (&data)) -\& process (data); -\& -\& if (sigismember (&prev, SIGUSR1) -\& sigprocmask (SIG_UNBLOCK, &block, 0); -\& } -.Ve -.Sp -(Note: pthreads in theory requires you to use \f(CW\*(C`pthread_setmask\*(C'\fR -instead of \f(CW\*(C`sigprocmask\*(C'\fR when you use threads, but libev doesn't do it -either...). -.IP "queueing from a thread context" 4 -.IX Item "queueing from a thread context" -The strategy for threads is different, as you cannot (easily) block -threads but you can easily preempt them, so to queue safely you need to -employ a traditional mutex lock, such as in this pthread example: -.Sp -.Vb 2 -\& static ev_async mysig; -\& static pthread_mutex_t mymutex = PTHREAD_MUTEX_INITIALIZER; -\& -\& static void -\& otherthread (void) -\& { -\& // only need to lock the actual queueing operation -\& pthread_mutex_lock (&mymutex); -\& queue_put (data); -\& pthread_mutex_unlock (&mymutex); -\& -\& ev_async_send (EV_DEFAULT_ &mysig); -\& } -\& -\& static void -\& mysig_cb (EV_P_ ev_async *w, int revents) -\& { -\& pthread_mutex_lock (&mymutex); -\& -\& while (queue_get (&data)) -\& process (data); -\& -\& pthread_mutex_unlock (&mymutex); -\& } -.Ve -.PP -\fIWatcher-Specific Functions and Data Members\fR -.IX Subsection "Watcher-Specific Functions and Data Members" -.IP "ev_async_init (ev_async *, callback)" 4 -.IX Item "ev_async_init (ev_async *, callback)" -Initialises and configures the async watcher \- it has no parameters of any -kind. There is a \f(CW\*(C`ev_async_set\*(C'\fR macro, but using it is utterly pointless, -trust me. -.IP "ev_async_send (loop, ev_async *)" 4 -.IX Item "ev_async_send (loop, ev_async *)" -Sends/signals/activates the given \f(CW\*(C`ev_async\*(C'\fR watcher, that is, feeds -an \f(CW\*(C`EV_ASYNC\*(C'\fR event on the watcher into the event loop, and instantly -returns. -.Sp -Unlike \f(CW\*(C`ev_feed_event\*(C'\fR, this call is safe to do from other threads, -signal or similar contexts (see the discussion of \f(CW\*(C`EV_ATOMIC_T\*(C'\fR in the -embedding section below on what exactly this means). -.Sp -Note that, as with other watchers in libev, multiple events might get -compressed into a single callback invocation (another way to look at -this is that \f(CW\*(C`ev_async\*(C'\fR watchers are level-triggered: they are set on -\&\f(CW\*(C`ev_async_send\*(C'\fR, reset when the event loop detects that). -.Sp -This call incurs the overhead of at most one extra system call per event -loop iteration, if the event loop is blocked, and no syscall at all if -the event loop (or your program) is processing events. That means that -repeated calls are basically free (there is no need to avoid calls for -performance reasons) and that the overhead becomes smaller (typically -zero) under load. -.IP "bool = ev_async_pending (ev_async *)" 4 -.IX Item "bool = ev_async_pending (ev_async *)" -Returns a non-zero value when \f(CW\*(C`ev_async_send\*(C'\fR has been called on the -watcher but the event has not yet been processed (or even noted) by the -event loop. -.Sp -\&\f(CW\*(C`ev_async_send\*(C'\fR sets a flag in the watcher and wakes up the loop. When -the loop iterates next and checks for the watcher to have become active, -it will reset the flag again. \f(CW\*(C`ev_async_pending\*(C'\fR can be used to very -quickly check whether invoking the loop might be a good idea. -.Sp -Not that this does \fInot\fR check whether the watcher itself is pending, -only whether it has been requested to make this watcher pending: there -is a time window between the event loop checking and resetting the async -notification, and the callback being invoked. -.SH "OTHER FUNCTIONS" -.IX Header "OTHER FUNCTIONS" -There are some other functions of possible interest. Described. Here. Now. -.IP "ev_once (loop, int fd, int events, ev_tstamp timeout, callback, arg)" 4 -.IX Item "ev_once (loop, int fd, int events, ev_tstamp timeout, callback, arg)" -This function combines a simple timer and an I/O watcher, calls your -callback on whichever event happens first and automatically stops both -watchers. This is useful if you want to wait for a single event on an fd -or timeout without having to allocate/configure/start/stop/free one or -more watchers yourself. -.Sp -If \f(CW\*(C`fd\*(C'\fR is less than 0, then no I/O watcher will be started and the -\&\f(CW\*(C`events\*(C'\fR argument is being ignored. Otherwise, an \f(CW\*(C`ev_io\*(C'\fR watcher for -the given \f(CW\*(C`fd\*(C'\fR and \f(CW\*(C`events\*(C'\fR set will be created and started. -.Sp -If \f(CW\*(C`timeout\*(C'\fR is less than 0, then no timeout watcher will be -started. Otherwise an \f(CW\*(C`ev_timer\*(C'\fR watcher with after = \f(CW\*(C`timeout\*(C'\fR (and -repeat = 0) will be started. \f(CW0\fR is a valid timeout. -.Sp -The callback has the type \f(CW\*(C`void (*cb)(int revents, void *arg)\*(C'\fR and is -passed an \f(CW\*(C`revents\*(C'\fR set like normal event callbacks (a combination of -\&\f(CW\*(C`EV_ERROR\*(C'\fR, \f(CW\*(C`EV_READ\*(C'\fR, \f(CW\*(C`EV_WRITE\*(C'\fR or \f(CW\*(C`EV_TIMER\*(C'\fR) and the \f(CW\*(C`arg\*(C'\fR -value passed to \f(CW\*(C`ev_once\*(C'\fR. Note that it is possible to receive \fIboth\fR -a timeout and an io event at the same time \- you probably should give io -events precedence. -.Sp -Example: wait up to ten seconds for data to appear on \s-1STDIN_FILENO.\s0 -.Sp -.Vb 7 -\& static void stdin_ready (int revents, void *arg) -\& { -\& if (revents & EV_READ) -\& /* stdin might have data for us, joy! */; -\& else if (revents & EV_TIMER) -\& /* doh, nothing entered */; -\& } -\& -\& ev_once (STDIN_FILENO, EV_READ, 10., stdin_ready, 0); -.Ve -.IP "ev_feed_fd_event (loop, int fd, int revents)" 4 -.IX Item "ev_feed_fd_event (loop, int fd, int revents)" -Feed an event on the given fd, as if a file descriptor backend detected -the given events. -.IP "ev_feed_signal_event (loop, int signum)" 4 -.IX Item "ev_feed_signal_event (loop, int signum)" -Feed an event as if the given signal occurred. See also \f(CW\*(C`ev_feed_signal\*(C'\fR, -which is async-safe. -.SH "COMMON OR USEFUL IDIOMS (OR BOTH)" -.IX Header "COMMON OR USEFUL IDIOMS (OR BOTH)" -This section explains some common idioms that are not immediately -obvious. Note that examples are sprinkled over the whole manual, and this -section only contains stuff that wouldn't fit anywhere else. -.SS "\s-1ASSOCIATING CUSTOM DATA WITH A WATCHER\s0" -.IX Subsection "ASSOCIATING CUSTOM DATA WITH A WATCHER" -Each watcher has, by default, a \f(CW\*(C`void *data\*(C'\fR member that you can read -or modify at any time: libev will completely ignore it. This can be used -to associate arbitrary data with your watcher. If you need more data and -don't want to allocate memory separately and store a pointer to it in that -data member, you can also \*(L"subclass\*(R" the watcher type and provide your own -data: -.PP -.Vb 7 -\& struct my_io -\& { -\& ev_io io; -\& int otherfd; -\& void *somedata; -\& struct whatever *mostinteresting; -\& }; -\& -\& ... -\& struct my_io w; -\& ev_io_init (&w.io, my_cb, fd, EV_READ); -.Ve -.PP -And since your callback will be called with a pointer to the watcher, you -can cast it back to your own type: -.PP -.Vb 5 -\& static void my_cb (struct ev_loop *loop, ev_io *w_, int revents) -\& { -\& struct my_io *w = (struct my_io *)w_; -\& ... -\& } -.Ve -.PP -More interesting and less C\-conformant ways of casting your callback -function type instead have been omitted. -.SS "\s-1BUILDING YOUR OWN COMPOSITE WATCHERS\s0" -.IX Subsection "BUILDING YOUR OWN COMPOSITE WATCHERS" -Another common scenario is to use some data structure with multiple -embedded watchers, in effect creating your own watcher that combines -multiple libev event sources into one \*(L"super-watcher\*(R": -.PP -.Vb 6 -\& struct my_biggy -\& { -\& int some_data; -\& ev_timer t1; -\& ev_timer t2; -\& } -.Ve -.PP -In this case getting the pointer to \f(CW\*(C`my_biggy\*(C'\fR is a bit more -complicated: Either you store the address of your \f(CW\*(C`my_biggy\*(C'\fR struct in -the \f(CW\*(C`data\*(C'\fR member of the watcher (for woozies or \*(C+ coders), or you need -to use some pointer arithmetic using \f(CW\*(C`offsetof\*(C'\fR inside your watchers (for -real programmers): -.PP -.Vb 1 -\& #include -\& -\& static void -\& t1_cb (EV_P_ ev_timer *w, int revents) -\& { -\& struct my_biggy big = (struct my_biggy *) -\& (((char *)w) \- offsetof (struct my_biggy, t1)); -\& } -\& -\& static void -\& t2_cb (EV_P_ ev_timer *w, int revents) -\& { -\& struct my_biggy big = (struct my_biggy *) -\& (((char *)w) \- offsetof (struct my_biggy, t2)); -\& } -.Ve -.SS "\s-1AVOIDING FINISHING BEFORE RETURNING\s0" -.IX Subsection "AVOIDING FINISHING BEFORE RETURNING" -Often you have structures like this in event-based programs: -.PP -.Vb 4 -\& callback () -\& { -\& free (request); -\& } -\& -\& request = start_new_request (..., callback); -.Ve -.PP -The intent is to start some \*(L"lengthy\*(R" operation. The \f(CW\*(C`request\*(C'\fR could be -used to cancel the operation, or do other things with it. -.PP -It's not uncommon to have code paths in \f(CW\*(C`start_new_request\*(C'\fR that -immediately invoke the callback, for example, to report errors. Or you add -some caching layer that finds that it can skip the lengthy aspects of the -operation and simply invoke the callback with the result. -.PP -The problem here is that this will happen \fIbefore\fR \f(CW\*(C`start_new_request\*(C'\fR -has returned, so \f(CW\*(C`request\*(C'\fR is not set. -.PP -Even if you pass the request by some safer means to the callback, you -might want to do something to the request after starting it, such as -canceling it, which probably isn't working so well when the callback has -already been invoked. -.PP -A common way around all these issues is to make sure that -\&\f(CW\*(C`start_new_request\*(C'\fR \fIalways\fR returns before the callback is invoked. If -\&\f(CW\*(C`start_new_request\*(C'\fR immediately knows the result, it can artificially -delay invoking the callback by using a \f(CW\*(C`prepare\*(C'\fR or \f(CW\*(C`idle\*(C'\fR watcher for -example, or more sneakily, by reusing an existing (stopped) watcher and -pushing it into the pending queue: -.PP -.Vb 2 -\& ev_set_cb (watcher, callback); -\& ev_feed_event (EV_A_ watcher, 0); -.Ve -.PP -This way, \f(CW\*(C`start_new_request\*(C'\fR can safely return before the callback is -invoked, while not delaying callback invocation too much. -.SS "\s-1MODEL/NESTED EVENT LOOP INVOCATIONS AND EXIT CONDITIONS\s0" -.IX Subsection "MODEL/NESTED EVENT LOOP INVOCATIONS AND EXIT CONDITIONS" -Often (especially in \s-1GUI\s0 toolkits) there are places where you have -\&\fImodal\fR interaction, which is most easily implemented by recursively -invoking \f(CW\*(C`ev_run\*(C'\fR. -.PP -This brings the problem of exiting \- a callback might want to finish the -main \f(CW\*(C`ev_run\*(C'\fR call, but not the nested one (e.g. user clicked \*(L"Quit\*(R", but -a modal \*(L"Are you sure?\*(R" dialog is still waiting), or just the nested one -and not the main one (e.g. user clocked \*(L"Ok\*(R" in a modal dialog), or some -other combination: In these cases, a simple \f(CW\*(C`ev_break\*(C'\fR will not work. -.PP -The solution is to maintain \*(L"break this loop\*(R" variable for each \f(CW\*(C`ev_run\*(C'\fR -invocation, and use a loop around \f(CW\*(C`ev_run\*(C'\fR until the condition is -triggered, using \f(CW\*(C`EVRUN_ONCE\*(C'\fR: -.PP -.Vb 2 -\& // main loop -\& int exit_main_loop = 0; -\& -\& while (!exit_main_loop) -\& ev_run (EV_DEFAULT_ EVRUN_ONCE); -\& -\& // in a modal watcher -\& int exit_nested_loop = 0; -\& -\& while (!exit_nested_loop) -\& ev_run (EV_A_ EVRUN_ONCE); -.Ve -.PP -To exit from any of these loops, just set the corresponding exit variable: -.PP -.Vb 2 -\& // exit modal loop -\& exit_nested_loop = 1; -\& -\& // exit main program, after modal loop is finished -\& exit_main_loop = 1; -\& -\& // exit both -\& exit_main_loop = exit_nested_loop = 1; -.Ve -.SS "\s-1THREAD LOCKING EXAMPLE\s0" -.IX Subsection "THREAD LOCKING EXAMPLE" -Here is a fictitious example of how to run an event loop in a different -thread from where callbacks are being invoked and watchers are -created/added/removed. -.PP -For a real-world example, see the \f(CW\*(C`EV::Loop::Async\*(C'\fR perl module, -which uses exactly this technique (which is suited for many high-level -languages). -.PP -The example uses a pthread mutex to protect the loop data, a condition -variable to wait for callback invocations, an async watcher to notify the -event loop thread and an unspecified mechanism to wake up the main thread. -.PP -First, you need to associate some data with the event loop: -.PP -.Vb 6 -\& typedef struct { -\& mutex_t lock; /* global loop lock */ -\& ev_async async_w; -\& thread_t tid; -\& cond_t invoke_cv; -\& } userdata; -\& -\& void prepare_loop (EV_P) -\& { -\& // for simplicity, we use a static userdata struct. -\& static userdata u; -\& -\& ev_async_init (&u\->async_w, async_cb); -\& ev_async_start (EV_A_ &u\->async_w); -\& -\& pthread_mutex_init (&u\->lock, 0); -\& pthread_cond_init (&u\->invoke_cv, 0); -\& -\& // now associate this with the loop -\& ev_set_userdata (EV_A_ u); -\& ev_set_invoke_pending_cb (EV_A_ l_invoke); -\& ev_set_loop_release_cb (EV_A_ l_release, l_acquire); -\& -\& // then create the thread running ev_run -\& pthread_create (&u\->tid, 0, l_run, EV_A); -\& } -.Ve -.PP -The callback for the \f(CW\*(C`ev_async\*(C'\fR watcher does nothing: the watcher is used -solely to wake up the event loop so it takes notice of any new watchers -that might have been added: -.PP -.Vb 5 -\& static void -\& async_cb (EV_P_ ev_async *w, int revents) -\& { -\& // just used for the side effects -\& } -.Ve -.PP -The \f(CW\*(C`l_release\*(C'\fR and \f(CW\*(C`l_acquire\*(C'\fR callbacks simply unlock/lock the mutex -protecting the loop data, respectively. -.PP -.Vb 6 -\& static void -\& l_release (EV_P) -\& { -\& userdata *u = ev_userdata (EV_A); -\& pthread_mutex_unlock (&u\->lock); -\& } -\& -\& static void -\& l_acquire (EV_P) -\& { -\& userdata *u = ev_userdata (EV_A); -\& pthread_mutex_lock (&u\->lock); -\& } -.Ve -.PP -The event loop thread first acquires the mutex, and then jumps straight -into \f(CW\*(C`ev_run\*(C'\fR: -.PP -.Vb 4 -\& void * -\& l_run (void *thr_arg) -\& { -\& struct ev_loop *loop = (struct ev_loop *)thr_arg; -\& -\& l_acquire (EV_A); -\& pthread_setcanceltype (PTHREAD_CANCEL_ASYNCHRONOUS, 0); -\& ev_run (EV_A_ 0); -\& l_release (EV_A); -\& -\& return 0; -\& } -.Ve -.PP -Instead of invoking all pending watchers, the \f(CW\*(C`l_invoke\*(C'\fR callback will -signal the main thread via some unspecified mechanism (signals? pipe -writes? \f(CW\*(C`Async::Interrupt\*(C'\fR?) and then waits until all pending watchers -have been called (in a while loop because a) spurious wakeups are possible -and b) skipping inter-thread-communication when there are no pending -watchers is very beneficial): -.PP -.Vb 4 -\& static void -\& l_invoke (EV_P) -\& { -\& userdata *u = ev_userdata (EV_A); -\& -\& while (ev_pending_count (EV_A)) -\& { -\& wake_up_other_thread_in_some_magic_or_not_so_magic_way (); -\& pthread_cond_wait (&u\->invoke_cv, &u\->lock); -\& } -\& } -.Ve -.PP -Now, whenever the main thread gets told to invoke pending watchers, it -will grab the lock, call \f(CW\*(C`ev_invoke_pending\*(C'\fR and then signal the loop -thread to continue: -.PP -.Vb 4 -\& static void -\& real_invoke_pending (EV_P) -\& { -\& userdata *u = ev_userdata (EV_A); -\& -\& pthread_mutex_lock (&u\->lock); -\& ev_invoke_pending (EV_A); -\& pthread_cond_signal (&u\->invoke_cv); -\& pthread_mutex_unlock (&u\->lock); -\& } -.Ve -.PP -Whenever you want to start/stop a watcher or do other modifications to an -event loop, you will now have to lock: -.PP -.Vb 2 -\& ev_timer timeout_watcher; -\& userdata *u = ev_userdata (EV_A); -\& -\& ev_timer_init (&timeout_watcher, timeout_cb, 5.5, 0.); -\& -\& pthread_mutex_lock (&u\->lock); -\& ev_timer_start (EV_A_ &timeout_watcher); -\& ev_async_send (EV_A_ &u\->async_w); -\& pthread_mutex_unlock (&u\->lock); -.Ve -.PP -Note that sending the \f(CW\*(C`ev_async\*(C'\fR watcher is required because otherwise -an event loop currently blocking in the kernel will have no knowledge -about the newly added timer. By waking up the loop it will pick up any new -watchers in the next event loop iteration. -.SS "\s-1THREADS, COROUTINES, CONTINUATIONS, QUEUES... INSTEAD OF CALLBACKS\s0" -.IX Subsection "THREADS, COROUTINES, CONTINUATIONS, QUEUES... INSTEAD OF CALLBACKS" -While the overhead of a callback that e.g. schedules a thread is small, it -is still an overhead. If you embed libev, and your main usage is with some -kind of threads or coroutines, you might want to customise libev so that -doesn't need callbacks anymore. -.PP -Imagine you have coroutines that you can switch to using a function -\&\f(CW\*(C`switch_to (coro)\*(C'\fR, that libev runs in a coroutine called \f(CW\*(C`libev_coro\*(C'\fR -and that due to some magic, the currently active coroutine is stored in a -global called \f(CW\*(C`current_coro\*(C'\fR. Then you can build your own \*(L"wait for libev -event\*(R" primitive by changing \f(CW\*(C`EV_CB_DECLARE\*(C'\fR and \f(CW\*(C`EV_CB_INVOKE\*(C'\fR (note -the differing \f(CW\*(C`;\*(C'\fR conventions): -.PP -.Vb 2 -\& #define EV_CB_DECLARE(type) struct my_coro *cb; -\& #define EV_CB_INVOKE(watcher) switch_to ((watcher)\->cb) -.Ve -.PP -That means instead of having a C callback function, you store the -coroutine to switch to in each watcher, and instead of having libev call -your callback, you instead have it switch to that coroutine. -.PP -A coroutine might now wait for an event with a function called -\&\f(CW\*(C`wait_for_event\*(C'\fR. (the watcher needs to be started, as always, but it doesn't -matter when, or whether the watcher is active or not when this function is -called): -.PP -.Vb 6 -\& void -\& wait_for_event (ev_watcher *w) -\& { -\& ev_set_cb (w, current_coro); -\& switch_to (libev_coro); -\& } -.Ve -.PP -That basically suspends the coroutine inside \f(CW\*(C`wait_for_event\*(C'\fR and -continues the libev coroutine, which, when appropriate, switches back to -this or any other coroutine. -.PP -You can do similar tricks if you have, say, threads with an event queue \- -instead of storing a coroutine, you store the queue object and instead of -switching to a coroutine, you push the watcher onto the queue and notify -any waiters. -.PP -To embed libev, see \*(L"\s-1EMBEDDING\*(R"\s0, but in short, it's easiest to create two -files, \fImy_ev.h\fR and \fImy_ev.c\fR that include the respective libev files: -.PP -.Vb 4 -\& // my_ev.h -\& #define EV_CB_DECLARE(type) struct my_coro *cb; -\& #define EV_CB_INVOKE(watcher) switch_to ((watcher)\->cb) -\& #include "../libev/ev.h" -\& -\& // my_ev.c -\& #define EV_H "my_ev.h" -\& #include "../libev/ev.c" -.Ve -.PP -And then use \fImy_ev.h\fR when you would normally use \fIev.h\fR, and compile -\&\fImy_ev.c\fR into your project. When properly specifying include paths, you -can even use \fIev.h\fR as header file name directly. -.SH "LIBEVENT EMULATION" -.IX Header "LIBEVENT EMULATION" -Libev offers a compatibility emulation layer for libevent. It cannot -emulate the internals of libevent, so here are some usage hints: -.IP "\(bu" 4 -Only the libevent\-1.4.1\-beta \s-1API\s0 is being emulated. -.Sp -This was the newest libevent version available when libev was implemented, -and is still mostly unchanged in 2010. -.IP "\(bu" 4 -Use it by including , as usual. -.IP "\(bu" 4 -The following members are fully supported: ev_base, ev_callback, -ev_arg, ev_fd, ev_res, ev_events. -.IP "\(bu" 4 -Avoid using ev_flags and the EVLIST_*\-macros, while it is -maintained by libev, it does not work exactly the same way as in libevent (consider -it a private \s-1API\s0). -.IP "\(bu" 4 -Priorities are not currently supported. Initialising priorities -will fail and all watchers will have the same priority, even though there -is an ev_pri field. -.IP "\(bu" 4 -In libevent, the last base created gets the signals, in libev, the -base that registered the signal gets the signals. -.IP "\(bu" 4 -Other members are not supported. -.IP "\(bu" 4 -The libev emulation is \fInot\fR \s-1ABI\s0 compatible to libevent, you need -to use the libev header file and library. -.SH "\*(C+ SUPPORT" -.IX Header " SUPPORT" -.SS "C \s-1API\s0" -.IX Subsection "C API" -The normal C \s-1API\s0 should work fine when used from \*(C+: both ev.h and the -libev sources can be compiled as \*(C+. Therefore, code that uses the C \s-1API\s0 -will work fine. -.PP -Proper exception specifications might have to be added to callbacks passed -to libev: exceptions may be thrown only from watcher callbacks, all other -callbacks (allocator, syserr, loop acquire/release and periodic reschedule -callbacks) must not throw exceptions, and might need a \f(CW\*(C`noexcept\*(C'\fR -specification. If you have code that needs to be compiled as both C and -\&\*(C+ you can use the \f(CW\*(C`EV_NOEXCEPT\*(C'\fR macro for this: -.PP -.Vb 6 -\& static void -\& fatal_error (const char *msg) EV_NOEXCEPT -\& { -\& perror (msg); -\& abort (); -\& } -\& -\& ... -\& ev_set_syserr_cb (fatal_error); -.Ve -.PP -The only \s-1API\s0 functions that can currently throw exceptions are \f(CW\*(C`ev_run\*(C'\fR, -\&\f(CW\*(C`ev_invoke\*(C'\fR, \f(CW\*(C`ev_invoke_pending\*(C'\fR and \f(CW\*(C`ev_loop_destroy\*(C'\fR (the latter -because it runs cleanup watchers). -.PP -Throwing exceptions in watcher callbacks is only supported if libev itself -is compiled with a \*(C+ compiler or your C and \*(C+ environments allow -throwing exceptions through C libraries (most do). -.SS "\*(C+ \s-1API\s0" -.IX Subsection " API" -Libev comes with some simplistic wrapper classes for \*(C+ that mainly allow -you to use some convenience methods to start/stop watchers and also change -the callback model to a model using method callbacks on objects. -.PP -To use it, -.PP -.Vb 1 -\& #include -.Ve -.PP -This automatically includes \fIev.h\fR and puts all of its definitions (many -of them macros) into the global namespace. All \*(C+ specific things are -put into the \f(CW\*(C`ev\*(C'\fR namespace. It should support all the same embedding -options as \fIev.h\fR, most notably \f(CW\*(C`EV_MULTIPLICITY\*(C'\fR. -.PP -Care has been taken to keep the overhead low. The only data member the \*(C+ -classes add (compared to plain C\-style watchers) is the event loop pointer -that the watcher is associated with (or no additional members at all if -you disable \f(CW\*(C`EV_MULTIPLICITY\*(C'\fR when embedding libev). -.PP -Currently, functions, static and non-static member functions and classes -with \f(CW\*(C`operator ()\*(C'\fR can be used as callbacks. Other types should be easy -to add as long as they only need one additional pointer for context. If -you need support for other types of functors please contact the author -(preferably after implementing it). -.PP -For all this to work, your \*(C+ compiler either has to use the same calling -conventions as your C compiler (for static member functions), or you have -to embed libev and compile libev itself as \*(C+. -.PP -Here is a list of things available in the \f(CW\*(C`ev\*(C'\fR namespace: -.ie n .IP """ev::READ"", ""ev::WRITE"" etc." 4 -.el .IP "\f(CWev::READ\fR, \f(CWev::WRITE\fR etc." 4 -.IX Item "ev::READ, ev::WRITE etc." -These are just enum values with the same values as the \f(CW\*(C`EV_READ\*(C'\fR etc. -macros from \fIev.h\fR. -.ie n .IP """ev::tstamp"", ""ev::now""" 4 -.el .IP "\f(CWev::tstamp\fR, \f(CWev::now\fR" 4 -.IX Item "ev::tstamp, ev::now" -Aliases to the same types/functions as with the \f(CW\*(C`ev_\*(C'\fR prefix. -.ie n .IP """ev::io"", ""ev::timer"", ""ev::periodic"", ""ev::idle"", ""ev::sig"" etc." 4 -.el .IP "\f(CWev::io\fR, \f(CWev::timer\fR, \f(CWev::periodic\fR, \f(CWev::idle\fR, \f(CWev::sig\fR etc." 4 -.IX Item "ev::io, ev::timer, ev::periodic, ev::idle, ev::sig etc." -For each \f(CW\*(C`ev_TYPE\*(C'\fR watcher in \fIev.h\fR there is a corresponding class of -the same name in the \f(CW\*(C`ev\*(C'\fR namespace, with the exception of \f(CW\*(C`ev_signal\*(C'\fR -which is called \f(CW\*(C`ev::sig\*(C'\fR to avoid clashes with the \f(CW\*(C`signal\*(C'\fR macro -defined by many implementations. -.Sp -All of those classes have these methods: -.RS 4 -.IP "ev::TYPE::TYPE ()" 4 -.IX Item "ev::TYPE::TYPE ()" -.PD 0 -.IP "ev::TYPE::TYPE (loop)" 4 -.IX Item "ev::TYPE::TYPE (loop)" -.IP "ev::TYPE::~TYPE" 4 -.IX Item "ev::TYPE::~TYPE" -.PD -The constructor (optionally) takes an event loop to associate the watcher -with. If it is omitted, it will use \f(CW\*(C`EV_DEFAULT\*(C'\fR. -.Sp -The constructor calls \f(CW\*(C`ev_init\*(C'\fR for you, which means you have to call the -\&\f(CW\*(C`set\*(C'\fR method before starting it. -.Sp -It will not set a callback, however: You have to call the templated \f(CW\*(C`set\*(C'\fR -method to set a callback before you can start the watcher. -.Sp -(The reason why you have to use a method is a limitation in \*(C+ which does -not allow explicit template arguments for constructors). -.Sp -The destructor automatically stops the watcher if it is active. -.IP "w\->set (object *)" 4 -.IX Item "w->set (object *)" -This method sets the callback method to call. The method has to have a -signature of \f(CW\*(C`void (*)(ev_TYPE &, int)\*(C'\fR, it receives the watcher as -first argument and the \f(CW\*(C`revents\*(C'\fR as second. The object must be given as -parameter and is stored in the \f(CW\*(C`data\*(C'\fR member of the watcher. -.Sp -This method synthesizes efficient thunking code to call your method from -the C callback that libev requires. If your compiler can inline your -callback (i.e. it is visible to it at the place of the \f(CW\*(C`set\*(C'\fR call and -your compiler is good :), then the method will be fully inlined into the -thunking function, making it as fast as a direct C callback. -.Sp -Example: simple class declaration and watcher initialisation -.Sp -.Vb 4 -\& struct myclass -\& { -\& void io_cb (ev::io &w, int revents) { } -\& } -\& -\& myclass obj; -\& ev::io iow; -\& iow.set (&obj); -.Ve -.IP "w\->set (object *)" 4 -.IX Item "w->set (object *)" -This is a variation of a method callback \- leaving out the method to call -will default the method to \f(CW\*(C`operator ()\*(C'\fR, which makes it possible to use -functor objects without having to manually specify the \f(CW\*(C`operator ()\*(C'\fR all -the time. Incidentally, you can then also leave out the template argument -list. -.Sp -The \f(CW\*(C`operator ()\*(C'\fR method prototype must be \f(CW\*(C`void operator ()(watcher &w, -int revents)\*(C'\fR. -.Sp -See the method\-\f(CW\*(C`set\*(C'\fR above for more details. -.Sp -Example: use a functor object as callback. -.Sp -.Vb 7 -\& struct myfunctor -\& { -\& void operator() (ev::io &w, int revents) -\& { -\& ... -\& } -\& } -\& -\& myfunctor f; -\& -\& ev::io w; -\& w.set (&f); -.Ve -.IP "w\->set (void *data = 0)" 4 -.IX Item "w->set (void *data = 0)" -Also sets a callback, but uses a static method or plain function as -callback. The optional \f(CW\*(C`data\*(C'\fR argument will be stored in the watcher's -\&\f(CW\*(C`data\*(C'\fR member and is free for you to use. -.Sp -The prototype of the \f(CW\*(C`function\*(C'\fR must be \f(CW\*(C`void (*)(ev::TYPE &w, int)\*(C'\fR. -.Sp -See the method\-\f(CW\*(C`set\*(C'\fR above for more details. -.Sp -Example: Use a plain function as callback. -.Sp -.Vb 2 -\& static void io_cb (ev::io &w, int revents) { } -\& iow.set (); -.Ve -.IP "w\->set (loop)" 4 -.IX Item "w->set (loop)" -Associates a different \f(CW\*(C`struct ev_loop\*(C'\fR with this watcher. You can only -do this when the watcher is inactive (and not pending either). -.IP "w\->set ([arguments])" 4 -.IX Item "w->set ([arguments])" -Basically the same as \f(CW\*(C`ev_TYPE_set\*(C'\fR (except for \f(CW\*(C`ev::embed\*(C'\fR watchers>), -with the same arguments. Either this method or a suitable start method -must be called at least once. Unlike the C counterpart, an active watcher -gets automatically stopped and restarted when reconfiguring it with this -method. -.Sp -For \f(CW\*(C`ev::embed\*(C'\fR watchers this method is called \f(CW\*(C`set_embed\*(C'\fR, to avoid -clashing with the \f(CW\*(C`set (loop)\*(C'\fR method. -.Sp -For \f(CW\*(C`ev::io\*(C'\fR watchers there is an additional \f(CW\*(C`set\*(C'\fR method that acepts a -new event mask only, and internally calls \f(CW\*(C`ev_io_modfify\*(C'\fR. -.IP "w\->start ()" 4 -.IX Item "w->start ()" -Starts the watcher. Note that there is no \f(CW\*(C`loop\*(C'\fR argument, as the -constructor already stores the event loop. -.IP "w\->start ([arguments])" 4 -.IX Item "w->start ([arguments])" -Instead of calling \f(CW\*(C`set\*(C'\fR and \f(CW\*(C`start\*(C'\fR methods separately, it is often -convenient to wrap them in one call. Uses the same type of arguments as -the configure \f(CW\*(C`set\*(C'\fR method of the watcher. -.IP "w\->stop ()" 4 -.IX Item "w->stop ()" -Stops the watcher if it is active. Again, no \f(CW\*(C`loop\*(C'\fR argument. -.ie n .IP "w\->again () (""ev::timer"", ""ev::periodic"" only)" 4 -.el .IP "w\->again () (\f(CWev::timer\fR, \f(CWev::periodic\fR only)" 4 -.IX Item "w->again () (ev::timer, ev::periodic only)" -For \f(CW\*(C`ev::timer\*(C'\fR and \f(CW\*(C`ev::periodic\*(C'\fR, this invokes the corresponding -\&\f(CW\*(C`ev_TYPE_again\*(C'\fR function. -.ie n .IP "w\->sweep () (""ev::embed"" only)" 4 -.el .IP "w\->sweep () (\f(CWev::embed\fR only)" 4 -.IX Item "w->sweep () (ev::embed only)" -Invokes \f(CW\*(C`ev_embed_sweep\*(C'\fR. -.ie n .IP "w\->update () (""ev::stat"" only)" 4 -.el .IP "w\->update () (\f(CWev::stat\fR only)" 4 -.IX Item "w->update () (ev::stat only)" -Invokes \f(CW\*(C`ev_stat_stat\*(C'\fR. -.RE -.RS 4 -.RE -.PP -Example: Define a class with two I/O and idle watchers, start the I/O -watchers in the constructor. -.PP -.Vb 5 -\& class myclass -\& { -\& ev::io io ; void io_cb (ev::io &w, int revents); -\& ev::io io2 ; void io2_cb (ev::io &w, int revents); -\& ev::idle idle; void idle_cb (ev::idle &w, int revents); -\& -\& myclass (int fd) -\& { -\& io .set (this); -\& io2 .set (this); -\& idle.set (this); -\& -\& io.set (fd, ev::WRITE); // configure the watcher -\& io.start (); // start it whenever convenient -\& -\& io2.start (fd, ev::READ); // set + start in one call -\& } -\& }; -.Ve -.SH "OTHER LANGUAGE BINDINGS" -.IX Header "OTHER LANGUAGE BINDINGS" -Libev does not offer other language bindings itself, but bindings for a -number of languages exist in the form of third-party packages. If you know -any interesting language binding in addition to the ones listed here, drop -me a note. -.IP "Perl" 4 -.IX Item "Perl" -The \s-1EV\s0 module implements the full libev \s-1API\s0 and is actually used to test -libev. \s-1EV\s0 is developed together with libev. Apart from the \s-1EV\s0 core module, -there are additional modules that implement libev-compatible interfaces -to \f(CW\*(C`libadns\*(C'\fR (\f(CW\*(C`EV::ADNS\*(C'\fR, but \f(CW\*(C`AnyEvent::DNS\*(C'\fR is preferred nowadays), -\&\f(CW\*(C`Net::SNMP\*(C'\fR (\f(CW\*(C`Net::SNMP::EV\*(C'\fR) and the \f(CW\*(C`libglib\*(C'\fR event core (\f(CW\*(C`Glib::EV\*(C'\fR -and \f(CW\*(C`EV::Glib\*(C'\fR). -.Sp -It can be found and installed via \s-1CPAN,\s0 its homepage is at -. -.IP "Python" 4 -.IX Item "Python" -Python bindings can be found at . It -seems to be quite complete and well-documented. -.IP "Ruby" 4 -.IX Item "Ruby" -Tony Arcieri has written a ruby extension that offers access to a subset -of the libev \s-1API\s0 and adds file handle abstractions, asynchronous \s-1DNS\s0 and -more on top of it. It can be found via gem servers. Its homepage is at -. -.Sp -Roger Pack reports that using the link order \f(CW\*(C`\-lws2_32 \-lmsvcrt\-ruby\-190\*(C'\fR -makes rev work even on mingw. -.IP "Haskell" 4 -.IX Item "Haskell" -A haskell binding to libev is available at -. -.IP "D" 4 -.IX Item "D" -Leandro Lucarella has written a D language binding (\fIev.d\fR) for libev, to -be found at . -.IP "Ocaml" 4 -.IX Item "Ocaml" -Erkki Seppala has written Ocaml bindings for libev, to be found at -. -.IP "Lua" 4 -.IX Item "Lua" -Brian Maher has written a partial interface to libev for lua (at the -time of this writing, only \f(CW\*(C`ev_io\*(C'\fR and \f(CW\*(C`ev_timer\*(C'\fR), to be found at -. -.IP "Javascript" 4 -.IX Item "Javascript" -Node.js () uses libev as the underlying event library. -.IP "Others" 4 -.IX Item "Others" -There are others, and I stopped counting. -.SH "MACRO MAGIC" -.IX Header "MACRO MAGIC" -Libev can be compiled with a variety of options, the most fundamental -of which is \f(CW\*(C`EV_MULTIPLICITY\*(C'\fR. This option determines whether (most) -functions and callbacks have an initial \f(CW\*(C`struct ev_loop *\*(C'\fR argument. -.PP -To make it easier to write programs that cope with either variant, the -following macros are defined: -.ie n .IP """EV_A"", ""EV_A_""" 4 -.el .IP "\f(CWEV_A\fR, \f(CWEV_A_\fR" 4 -.IX Item "EV_A, EV_A_" -This provides the loop \fIargument\fR for functions, if one is required (\*(L"ev -loop argument\*(R"). The \f(CW\*(C`EV_A\*(C'\fR form is used when this is the sole argument, -\&\f(CW\*(C`EV_A_\*(C'\fR is used when other arguments are following. Example: -.Sp -.Vb 3 -\& ev_unref (EV_A); -\& ev_timer_add (EV_A_ watcher); -\& ev_run (EV_A_ 0); -.Ve -.Sp -It assumes the variable \f(CW\*(C`loop\*(C'\fR of type \f(CW\*(C`struct ev_loop *\*(C'\fR is in scope, -which is often provided by the following macro. -.ie n .IP """EV_P"", ""EV_P_""" 4 -.el .IP "\f(CWEV_P\fR, \f(CWEV_P_\fR" 4 -.IX Item "EV_P, EV_P_" -This provides the loop \fIparameter\fR for functions, if one is required (\*(L"ev -loop parameter\*(R"). The \f(CW\*(C`EV_P\*(C'\fR form is used when this is the sole parameter, -\&\f(CW\*(C`EV_P_\*(C'\fR is used when other parameters are following. Example: -.Sp -.Vb 2 -\& // this is how ev_unref is being declared -\& static void ev_unref (EV_P); -\& -\& // this is how you can declare your typical callback -\& static void cb (EV_P_ ev_timer *w, int revents) -.Ve -.Sp -It declares a parameter \f(CW\*(C`loop\*(C'\fR of type \f(CW\*(C`struct ev_loop *\*(C'\fR, quite -suitable for use with \f(CW\*(C`EV_A\*(C'\fR. -.ie n .IP """EV_DEFAULT"", ""EV_DEFAULT_""" 4 -.el .IP "\f(CWEV_DEFAULT\fR, \f(CWEV_DEFAULT_\fR" 4 -.IX Item "EV_DEFAULT, EV_DEFAULT_" -Similar to the other two macros, this gives you the value of the default -loop, if multiple loops are supported (\*(L"ev loop default\*(R"). The default loop -will be initialised if it isn't already initialised. -.Sp -For non-multiplicity builds, these macros do nothing, so you always have -to initialise the loop somewhere. -.ie n .IP """EV_DEFAULT_UC"", ""EV_DEFAULT_UC_""" 4 -.el .IP "\f(CWEV_DEFAULT_UC\fR, \f(CWEV_DEFAULT_UC_\fR" 4 -.IX Item "EV_DEFAULT_UC, EV_DEFAULT_UC_" -Usage identical to \f(CW\*(C`EV_DEFAULT\*(C'\fR and \f(CW\*(C`EV_DEFAULT_\*(C'\fR, but requires that the -default loop has been initialised (\f(CW\*(C`UC\*(C'\fR == unchecked). Their behaviour -is undefined when the default loop has not been initialised by a previous -execution of \f(CW\*(C`EV_DEFAULT\*(C'\fR, \f(CW\*(C`EV_DEFAULT_\*(C'\fR or \f(CW\*(C`ev_default_init (...)\*(C'\fR. -.Sp -It is often prudent to use \f(CW\*(C`EV_DEFAULT\*(C'\fR when initialising the first -watcher in a function but use \f(CW\*(C`EV_DEFAULT_UC\*(C'\fR afterwards. -.PP -Example: Declare and initialise a check watcher, utilising the above -macros so it will work regardless of whether multiple loops are supported -or not. -.PP -.Vb 5 -\& static void -\& check_cb (EV_P_ ev_timer *w, int revents) -\& { -\& ev_check_stop (EV_A_ w); -\& } -\& -\& ev_check check; -\& ev_check_init (&check, check_cb); -\& ev_check_start (EV_DEFAULT_ &check); -\& ev_run (EV_DEFAULT_ 0); -.Ve -.SH "EMBEDDING" -.IX Header "EMBEDDING" -Libev can (and often is) directly embedded into host -applications. Examples of applications that embed it include the Deliantra -Game Server, the \s-1EV\s0 perl module, the \s-1GNU\s0 Virtual Private Ethernet (gvpe) -and rxvt-unicode. -.PP -The goal is to enable you to just copy the necessary files into your -source directory without having to change even a single line in them, so -you can easily upgrade by simply copying (or having a checked-out copy of -libev somewhere in your source tree). -.SS "\s-1FILESETS\s0" -.IX Subsection "FILESETS" -Depending on what features you need you need to include one or more sets of files -in your application. -.PP -\fI\s-1CORE EVENT LOOP\s0\fR -.IX Subsection "CORE EVENT LOOP" -.PP -To include only the libev core (all the \f(CW\*(C`ev_*\*(C'\fR functions), with manual -configuration (no autoconf): -.PP -.Vb 2 -\& #define EV_STANDALONE 1 -\& #include "ev.c" -.Ve -.PP -This will automatically include \fIev.h\fR, too, and should be done in a -single C source file only to provide the function implementations. To use -it, do the same for \fIev.h\fR in all files wishing to use this \s-1API\s0 (best -done by writing a wrapper around \fIev.h\fR that you can include instead and -where you can put other configuration options): -.PP -.Vb 2 -\& #define EV_STANDALONE 1 -\& #include "ev.h" -.Ve -.PP -Both header files and implementation files can be compiled with a \*(C+ -compiler (at least, that's a stated goal, and breakage will be treated -as a bug). -.PP -You need the following files in your source tree, or in a directory -in your include path (e.g. in libev/ when using \-Ilibev): -.PP -.Vb 4 -\& ev.h -\& ev.c -\& ev_vars.h -\& ev_wrap.h -\& -\& ev_win32.c required on win32 platforms only -\& -\& ev_select.c only when select backend is enabled -\& ev_poll.c only when poll backend is enabled -\& ev_epoll.c only when the epoll backend is enabled -\& ev_linuxaio.c only when the linux aio backend is enabled -\& ev_iouring.c only when the linux io_uring backend is enabled -\& ev_kqueue.c only when the kqueue backend is enabled -\& ev_port.c only when the solaris port backend is enabled -.Ve -.PP -\&\fIev.c\fR includes the backend files directly when enabled, so you only need -to compile this single file. -.PP -\fI\s-1LIBEVENT COMPATIBILITY API\s0\fR -.IX Subsection "LIBEVENT COMPATIBILITY API" -.PP -To include the libevent compatibility \s-1API,\s0 also include: -.PP -.Vb 1 -\& #include "event.c" -.Ve -.PP -in the file including \fIev.c\fR, and: -.PP -.Vb 1 -\& #include "event.h" -.Ve -.PP -in the files that want to use the libevent \s-1API.\s0 This also includes \fIev.h\fR. -.PP -You need the following additional files for this: -.PP -.Vb 2 -\& event.h -\& event.c -.Ve -.PP -\fI\s-1AUTOCONF SUPPORT\s0\fR -.IX Subsection "AUTOCONF SUPPORT" -.PP -Instead of using \f(CW\*(C`EV_STANDALONE=1\*(C'\fR and providing your configuration in -whatever way you want, you can also \f(CW\*(C`m4_include([libev.m4])\*(C'\fR in your -\&\fIconfigure.ac\fR and leave \f(CW\*(C`EV_STANDALONE\*(C'\fR undefined. \fIev.c\fR will then -include \fIconfig.h\fR and configure itself accordingly. -.PP -For this of course you need the m4 file: -.PP -.Vb 1 -\& libev.m4 -.Ve -.SS "\s-1PREPROCESSOR SYMBOLS/MACROS\s0" -.IX Subsection "PREPROCESSOR SYMBOLS/MACROS" -Libev can be configured via a variety of preprocessor symbols you have to -define before including (or compiling) any of its files. The default in -the absence of autoconf is documented for every option. -.PP -Symbols marked with \*(L"(h)\*(R" do not change the \s-1ABI,\s0 and can have different -values when compiling libev vs. including \fIev.h\fR, so it is permissible -to redefine them before including \fIev.h\fR without breaking compatibility -to a compiled library. All other symbols change the \s-1ABI,\s0 which means all -users of libev and the libev code itself must be compiled with compatible -settings. -.IP "\s-1EV_COMPAT3\s0 (h)" 4 -.IX Item "EV_COMPAT3 (h)" -Backwards compatibility is a major concern for libev. This is why this -release of libev comes with wrappers for the functions and symbols that -have been renamed between libev version 3 and 4. -.Sp -You can disable these wrappers (to test compatibility with future -versions) by defining \f(CW\*(C`EV_COMPAT3\*(C'\fR to \f(CW0\fR when compiling your -sources. This has the additional advantage that you can drop the \f(CW\*(C`struct\*(C'\fR -from \f(CW\*(C`struct ev_loop\*(C'\fR declarations, as libev will provide an \f(CW\*(C`ev_loop\*(C'\fR -typedef in that case. -.Sp -In some future version, the default for \f(CW\*(C`EV_COMPAT3\*(C'\fR will become \f(CW0\fR, -and in some even more future version the compatibility code will be -removed completely. -.IP "\s-1EV_STANDALONE\s0 (h)" 4 -.IX Item "EV_STANDALONE (h)" -Must always be \f(CW1\fR if you do not use autoconf configuration, which -keeps libev from including \fIconfig.h\fR, and it also defines dummy -implementations for some libevent functions (such as logging, which is not -supported). It will also not define any of the structs usually found in -\&\fIevent.h\fR that are not directly supported by the libev core alone. -.Sp -In standalone mode, libev will still try to automatically deduce the -configuration, but has to be more conservative. -.IP "\s-1EV_USE_FLOOR\s0" 4 -.IX Item "EV_USE_FLOOR" -If defined to be \f(CW1\fR, libev will use the \f(CW\*(C`floor ()\*(C'\fR function for its -periodic reschedule calculations, otherwise libev will fall back on a -portable (slower) implementation. If you enable this, you usually have to -link against libm or something equivalent. Enabling this when the \f(CW\*(C`floor\*(C'\fR -function is not available will fail, so the safe default is to not enable -this. -.IP "\s-1EV_USE_MONOTONIC\s0" 4 -.IX Item "EV_USE_MONOTONIC" -If defined to be \f(CW1\fR, libev will try to detect the availability of the -monotonic clock option at both compile time and runtime. Otherwise no -use of the monotonic clock option will be attempted. If you enable this, -you usually have to link against librt or something similar. Enabling it -when the functionality isn't available is safe, though, although you have -to make sure you link against any libraries where the \f(CW\*(C`clock_gettime\*(C'\fR -function is hiding in (often \fI\-lrt\fR). See also \f(CW\*(C`EV_USE_CLOCK_SYSCALL\*(C'\fR. -.IP "\s-1EV_USE_REALTIME\s0" 4 -.IX Item "EV_USE_REALTIME" -If defined to be \f(CW1\fR, libev will try to detect the availability of the -real-time clock option at compile time (and assume its availability -at runtime if successful). Otherwise no use of the real-time clock -option will be attempted. This effectively replaces \f(CW\*(C`gettimeofday\*(C'\fR -by \f(CW\*(C`clock_get (CLOCK_REALTIME, ...)\*(C'\fR and will not normally affect -correctness. See the note about libraries in the description of -\&\f(CW\*(C`EV_USE_MONOTONIC\*(C'\fR, though. Defaults to the opposite value of -\&\f(CW\*(C`EV_USE_CLOCK_SYSCALL\*(C'\fR. -.IP "\s-1EV_USE_CLOCK_SYSCALL\s0" 4 -.IX Item "EV_USE_CLOCK_SYSCALL" -If defined to be \f(CW1\fR, libev will try to use a direct syscall instead -of calling the system-provided \f(CW\*(C`clock_gettime\*(C'\fR function. This option -exists because on GNU/Linux, \f(CW\*(C`clock_gettime\*(C'\fR is in \f(CW\*(C`librt\*(C'\fR, but \f(CW\*(C`librt\*(C'\fR -unconditionally pulls in \f(CW\*(C`libpthread\*(C'\fR, slowing down single-threaded -programs needlessly. Using a direct syscall is slightly slower (in -theory), because no optimised vdso implementation can be used, but avoids -the pthread dependency. Defaults to \f(CW1\fR on GNU/Linux with glibc 2.x or -higher, as it simplifies linking (no need for \f(CW\*(C`\-lrt\*(C'\fR). -.IP "\s-1EV_USE_NANOSLEEP\s0" 4 -.IX Item "EV_USE_NANOSLEEP" -If defined to be \f(CW1\fR, libev will assume that \f(CW\*(C`nanosleep ()\*(C'\fR is available -and will use it for delays. Otherwise it will use \f(CW\*(C`select ()\*(C'\fR. -.IP "\s-1EV_USE_EVENTFD\s0" 4 -.IX Item "EV_USE_EVENTFD" -If defined to be \f(CW1\fR, then libev will assume that \f(CW\*(C`eventfd ()\*(C'\fR is -available and will probe for kernel support at runtime. This will improve -\&\f(CW\*(C`ev_signal\*(C'\fR and \f(CW\*(C`ev_async\*(C'\fR performance and reduce resource consumption. -If undefined, it will be enabled if the headers indicate GNU/Linux + Glibc -2.7 or newer, otherwise disabled. -.IP "\s-1EV_USE_SIGNALFD\s0" 4 -.IX Item "EV_USE_SIGNALFD" -If defined to be \f(CW1\fR, then libev will assume that \f(CW\*(C`signalfd ()\*(C'\fR is -available and will probe for kernel support at runtime. This enables -the use of \s-1EVFLAG_SIGNALFD\s0 for faster and simpler signal handling. If -undefined, it will be enabled if the headers indicate GNU/Linux + Glibc -2.7 or newer, otherwise disabled. -.IP "\s-1EV_USE_TIMERFD\s0" 4 -.IX Item "EV_USE_TIMERFD" -If defined to be \f(CW1\fR, then libev will assume that \f(CW\*(C`timerfd ()\*(C'\fR is -available and will probe for kernel support at runtime. This allows -libev to detect time jumps accurately. If undefined, it will be enabled -if the headers indicate GNU/Linux + Glibc 2.8 or newer and define -\&\f(CW\*(C`TFD_TIMER_CANCEL_ON_SET\*(C'\fR, otherwise disabled. -.IP "\s-1EV_USE_EVENTFD\s0" 4 -.IX Item "EV_USE_EVENTFD" -If defined to be \f(CW1\fR, then libev will assume that \f(CW\*(C`eventfd ()\*(C'\fR is -available and will probe for kernel support at runtime. This will improve -\&\f(CW\*(C`ev_signal\*(C'\fR and \f(CW\*(C`ev_async\*(C'\fR performance and reduce resource consumption. -If undefined, it will be enabled if the headers indicate GNU/Linux + Glibc -2.7 or newer, otherwise disabled. -.IP "\s-1EV_USE_SELECT\s0" 4 -.IX Item "EV_USE_SELECT" -If undefined or defined to be \f(CW1\fR, libev will compile in support for the -\&\f(CW\*(C`select\*(C'\fR(2) backend. No attempt at auto-detection will be done: if no -other method takes over, select will be it. Otherwise the select backend -will not be compiled in. -.IP "\s-1EV_SELECT_USE_FD_SET\s0" 4 -.IX Item "EV_SELECT_USE_FD_SET" -If defined to \f(CW1\fR, then the select backend will use the system \f(CW\*(C`fd_set\*(C'\fR -structure. This is useful if libev doesn't compile due to a missing -\&\f(CW\*(C`NFDBITS\*(C'\fR or \f(CW\*(C`fd_mask\*(C'\fR definition or it mis-guesses the bitset layout -on exotic systems. This usually limits the range of file descriptors to -some low limit such as 1024 or might have other limitations (winsocket -only allows 64 sockets). The \f(CW\*(C`FD_SETSIZE\*(C'\fR macro, set before compilation, -configures the maximum size of the \f(CW\*(C`fd_set\*(C'\fR. -.IP "\s-1EV_SELECT_IS_WINSOCKET\s0" 4 -.IX Item "EV_SELECT_IS_WINSOCKET" -When defined to \f(CW1\fR, the select backend will assume that -select/socket/connect etc. don't understand file descriptors but -wants osf handles on win32 (this is the case when the select to -be used is the winsock select). This means that it will call -\&\f(CW\*(C`_get_osfhandle\*(C'\fR on the fd to convert it to an \s-1OS\s0 handle. Otherwise, -it is assumed that all these functions actually work on fds, even -on win32. Should not be defined on non\-win32 platforms. -.IP "\s-1EV_FD_TO_WIN32_HANDLE\s0(fd)" 4 -.IX Item "EV_FD_TO_WIN32_HANDLE(fd)" -If \f(CW\*(C`EV_SELECT_IS_WINSOCKET\*(C'\fR is enabled, then libev needs a way to map -file descriptors to socket handles. When not defining this symbol (the -default), then libev will call \f(CW\*(C`_get_osfhandle\*(C'\fR, which is usually -correct. In some cases, programs use their own file descriptor management, -in which case they can provide this function to map fds to socket handles. -.IP "\s-1EV_WIN32_HANDLE_TO_FD\s0(handle)" 4 -.IX Item "EV_WIN32_HANDLE_TO_FD(handle)" -If \f(CW\*(C`EV_SELECT_IS_WINSOCKET\*(C'\fR then libev maps handles to file descriptors -using the standard \f(CW\*(C`_open_osfhandle\*(C'\fR function. For programs implementing -their own fd to handle mapping, overwriting this function makes it easier -to do so. This can be done by defining this macro to an appropriate value. -.IP "\s-1EV_WIN32_CLOSE_FD\s0(fd)" 4 -.IX Item "EV_WIN32_CLOSE_FD(fd)" -If programs implement their own fd to handle mapping on win32, then this -macro can be used to override the \f(CW\*(C`close\*(C'\fR function, useful to unregister -file descriptors again. Note that the replacement function has to close -the underlying \s-1OS\s0 handle. -.IP "\s-1EV_USE_WSASOCKET\s0" 4 -.IX Item "EV_USE_WSASOCKET" -If defined to be \f(CW1\fR, libev will use \f(CW\*(C`WSASocket\*(C'\fR to create its internal -communication socket, which works better in some environments. Otherwise, -the normal \f(CW\*(C`socket\*(C'\fR function will be used, which works better in other -environments. -.IP "\s-1EV_USE_POLL\s0" 4 -.IX Item "EV_USE_POLL" -If defined to be \f(CW1\fR, libev will compile in support for the \f(CW\*(C`poll\*(C'\fR(2) -backend. Otherwise it will be enabled on non\-win32 platforms. It -takes precedence over select. -.IP "\s-1EV_USE_EPOLL\s0" 4 -.IX Item "EV_USE_EPOLL" -If defined to be \f(CW1\fR, libev will compile in support for the Linux -\&\f(CW\*(C`epoll\*(C'\fR(7) backend. Its availability will be detected at runtime, -otherwise another method will be used as fallback. This is the preferred -backend for GNU/Linux systems. If undefined, it will be enabled if the -headers indicate GNU/Linux + Glibc 2.4 or newer, otherwise disabled. -.IP "\s-1EV_USE_LINUXAIO\s0" 4 -.IX Item "EV_USE_LINUXAIO" -If defined to be \f(CW1\fR, libev will compile in support for the Linux aio -backend (\f(CW\*(C`EV_USE_EPOLL\*(C'\fR must also be enabled). If undefined, it will be -enabled on linux, otherwise disabled. -.IP "\s-1EV_USE_IOURING\s0" 4 -.IX Item "EV_USE_IOURING" -If defined to be \f(CW1\fR, libev will compile in support for the Linux -io_uring backend (\f(CW\*(C`EV_USE_EPOLL\*(C'\fR must also be enabled). Due to it's -current limitations it has to be requested explicitly. If undefined, it -will be enabled on linux, otherwise disabled. -.IP "\s-1EV_USE_KQUEUE\s0" 4 -.IX Item "EV_USE_KQUEUE" -If defined to be \f(CW1\fR, libev will compile in support for the \s-1BSD\s0 style -\&\f(CW\*(C`kqueue\*(C'\fR(2) backend. Its actual availability will be detected at runtime, -otherwise another method will be used as fallback. This is the preferred -backend for \s-1BSD\s0 and BSD-like systems, although on most BSDs kqueue only -supports some types of fds correctly (the only platform we found that -supports ptys for example was NetBSD), so kqueue might be compiled in, but -not be used unless explicitly requested. The best way to use it is to find -out whether kqueue supports your type of fd properly and use an embedded -kqueue loop. -.IP "\s-1EV_USE_PORT\s0" 4 -.IX Item "EV_USE_PORT" -If defined to be \f(CW1\fR, libev will compile in support for the Solaris -10 port style backend. Its availability will be detected at runtime, -otherwise another method will be used as fallback. This is the preferred -backend for Solaris 10 systems. -.IP "\s-1EV_USE_DEVPOLL\s0" 4 -.IX Item "EV_USE_DEVPOLL" -Reserved for future expansion, works like the \s-1USE\s0 symbols above. -.IP "\s-1EV_USE_INOTIFY\s0" 4 -.IX Item "EV_USE_INOTIFY" -If defined to be \f(CW1\fR, libev will compile in support for the Linux inotify -interface to speed up \f(CW\*(C`ev_stat\*(C'\fR watchers. Its actual availability will -be detected at runtime. If undefined, it will be enabled if the headers -indicate GNU/Linux + Glibc 2.4 or newer, otherwise disabled. -.IP "\s-1EV_NO_SMP\s0" 4 -.IX Item "EV_NO_SMP" -If defined to be \f(CW1\fR, libev will assume that memory is always coherent -between threads, that is, threads can be used, but threads never run on -different cpus (or different cpu cores). This reduces dependencies -and makes libev faster. -.IP "\s-1EV_NO_THREADS\s0" 4 -.IX Item "EV_NO_THREADS" -If defined to be \f(CW1\fR, libev will assume that it will never be called from -different threads (that includes signal handlers), which is a stronger -assumption than \f(CW\*(C`EV_NO_SMP\*(C'\fR, above. This reduces dependencies and makes -libev faster. -.IP "\s-1EV_ATOMIC_T\s0" 4 -.IX Item "EV_ATOMIC_T" -Libev requires an integer type (suitable for storing \f(CW0\fR or \f(CW1\fR) whose -access is atomic with respect to other threads or signal contexts. No -such type is easily found in the C language, so you can provide your own -type that you know is safe for your purposes. It is used both for signal -handler \*(L"locking\*(R" as well as for signal and thread safety in \f(CW\*(C`ev_async\*(C'\fR -watchers. -.Sp -In the absence of this define, libev will use \f(CW\*(C`sig_atomic_t volatile\*(C'\fR -(from \fIsignal.h\fR), which is usually good enough on most platforms. -.IP "\s-1EV_H\s0 (h)" 4 -.IX Item "EV_H (h)" -The name of the \fIev.h\fR header file used to include it. The default if -undefined is \f(CW"ev.h"\fR in \fIevent.h\fR, \fIev.c\fR and \fIev++.h\fR. This can be -used to virtually rename the \fIev.h\fR header file in case of conflicts. -.IP "\s-1EV_CONFIG_H\s0 (h)" 4 -.IX Item "EV_CONFIG_H (h)" -If \f(CW\*(C`EV_STANDALONE\*(C'\fR isn't \f(CW1\fR, this variable can be used to override -\&\fIev.c\fR's idea of where to find the \fIconfig.h\fR file, similarly to -\&\f(CW\*(C`EV_H\*(C'\fR, above. -.IP "\s-1EV_EVENT_H\s0 (h)" 4 -.IX Item "EV_EVENT_H (h)" -Similarly to \f(CW\*(C`EV_H\*(C'\fR, this macro can be used to override \fIevent.c\fR's idea -of how the \fIevent.h\fR header can be found, the default is \f(CW"event.h"\fR. -.IP "\s-1EV_PROTOTYPES\s0 (h)" 4 -.IX Item "EV_PROTOTYPES (h)" -If defined to be \f(CW0\fR, then \fIev.h\fR will not define any function -prototypes, but still define all the structs and other symbols. This is -occasionally useful if you want to provide your own wrapper functions -around libev functions. -.IP "\s-1EV_MULTIPLICITY\s0" 4 -.IX Item "EV_MULTIPLICITY" -If undefined or defined to \f(CW1\fR, then all event-loop-specific functions -will have the \f(CW\*(C`struct ev_loop *\*(C'\fR as first argument, and you can create -additional independent event loops. Otherwise there will be no support -for multiple event loops and there is no first event loop pointer -argument. Instead, all functions act on the single default loop. -.Sp -Note that \f(CW\*(C`EV_DEFAULT\*(C'\fR and \f(CW\*(C`EV_DEFAULT_\*(C'\fR will no longer provide a -default loop when multiplicity is switched off \- you always have to -initialise the loop manually in this case. -.IP "\s-1EV_MINPRI\s0" 4 -.IX Item "EV_MINPRI" -.PD 0 -.IP "\s-1EV_MAXPRI\s0" 4 -.IX Item "EV_MAXPRI" -.PD -The range of allowed priorities. \f(CW\*(C`EV_MINPRI\*(C'\fR must be smaller or equal to -\&\f(CW\*(C`EV_MAXPRI\*(C'\fR, but otherwise there are no non-obvious limitations. You can -provide for more priorities by overriding those symbols (usually defined -to be \f(CW\*(C`\-2\*(C'\fR and \f(CW2\fR, respectively). -.Sp -When doing priority-based operations, libev usually has to linearly search -all the priorities, so having many of them (hundreds) uses a lot of space -and time, so using the defaults of five priorities (\-2 .. +2) is usually -fine. -.Sp -If your embedding application does not need any priorities, defining these -both to \f(CW0\fR will save some memory and \s-1CPU.\s0 -.IP "\s-1EV_PERIODIC_ENABLE, EV_IDLE_ENABLE, EV_EMBED_ENABLE, EV_STAT_ENABLE, EV_PREPARE_ENABLE, EV_CHECK_ENABLE, EV_FORK_ENABLE, EV_SIGNAL_ENABLE, EV_ASYNC_ENABLE, EV_CHILD_ENABLE.\s0" 4 -.IX Item "EV_PERIODIC_ENABLE, EV_IDLE_ENABLE, EV_EMBED_ENABLE, EV_STAT_ENABLE, EV_PREPARE_ENABLE, EV_CHECK_ENABLE, EV_FORK_ENABLE, EV_SIGNAL_ENABLE, EV_ASYNC_ENABLE, EV_CHILD_ENABLE." -If undefined or defined to be \f(CW1\fR (and the platform supports it), then -the respective watcher type is supported. If defined to be \f(CW0\fR, then it -is not. Disabling watcher types mainly saves code size. -.IP "\s-1EV_FEATURES\s0" 4 -.IX Item "EV_FEATURES" -If you need to shave off some kilobytes of code at the expense of some -speed (but with the full \s-1API\s0), you can define this symbol to request -certain subsets of functionality. The default is to enable all features -that can be enabled on the platform. -.Sp -A typical way to use this symbol is to define it to \f(CW0\fR (or to a bitset -with some broad features you want) and then selectively re-enable -additional parts you want, for example if you want everything minimal, -but multiple event loop support, async and child watchers and the poll -backend, use this: -.Sp -.Vb 5 -\& #define EV_FEATURES 0 -\& #define EV_MULTIPLICITY 1 -\& #define EV_USE_POLL 1 -\& #define EV_CHILD_ENABLE 1 -\& #define EV_ASYNC_ENABLE 1 -.Ve -.Sp -The actual value is a bitset, it can be a combination of the following -values (by default, all of these are enabled): -.RS 4 -.ie n .IP "1 \- faster/larger code" 4 -.el .IP "\f(CW1\fR \- faster/larger code" 4 -.IX Item "1 - faster/larger code" -Use larger code to speed up some operations. -.Sp -Currently this is used to override some inlining decisions (enlarging the -code size by roughly 30% on amd64). -.Sp -When optimising for size, use of compiler flags such as \f(CW\*(C`\-Os\*(C'\fR with -gcc is recommended, as well as \f(CW\*(C`\-DNDEBUG\*(C'\fR, as libev contains a number of -assertions. -.Sp -The default is off when \f(CW\*(C`_\|_OPTIMIZE_SIZE_\|_\*(C'\fR is defined by your compiler -(e.g. gcc with \f(CW\*(C`\-Os\*(C'\fR). -.ie n .IP "2 \- faster/larger data structures" 4 -.el .IP "\f(CW2\fR \- faster/larger data structures" 4 -.IX Item "2 - faster/larger data structures" -Replaces the small 2\-heap for timer management by a faster 4\-heap, larger -hash table sizes and so on. This will usually further increase code size -and can additionally have an effect on the size of data structures at -runtime. -.Sp -The default is off when \f(CW\*(C`_\|_OPTIMIZE_SIZE_\|_\*(C'\fR is defined by your compiler -(e.g. gcc with \f(CW\*(C`\-Os\*(C'\fR). -.ie n .IP "4 \- full \s-1API\s0 configuration" 4 -.el .IP "\f(CW4\fR \- full \s-1API\s0 configuration" 4 -.IX Item "4 - full API configuration" -This enables priorities (sets \f(CW\*(C`EV_MAXPRI\*(C'\fR=2 and \f(CW\*(C`EV_MINPRI\*(C'\fR=\-2), and -enables multiplicity (\f(CW\*(C`EV_MULTIPLICITY\*(C'\fR=1). -.ie n .IP "8 \- full \s-1API\s0" 4 -.el .IP "\f(CW8\fR \- full \s-1API\s0" 4 -.IX Item "8 - full API" -This enables a lot of the \*(L"lesser used\*(R" \s-1API\s0 functions. See \f(CW\*(C`ev.h\*(C'\fR for -details on which parts of the \s-1API\s0 are still available without this -feature, and do not complain if this subset changes over time. -.ie n .IP "16 \- enable all optional watcher types" 4 -.el .IP "\f(CW16\fR \- enable all optional watcher types" 4 -.IX Item "16 - enable all optional watcher types" -Enables all optional watcher types. If you want to selectively enable -only some watcher types other than I/O and timers (e.g. prepare, -embed, async, child...) you can enable them manually by defining -\&\f(CW\*(C`EV_watchertype_ENABLE\*(C'\fR to \f(CW1\fR instead. -.ie n .IP "32 \- enable all backends" 4 -.el .IP "\f(CW32\fR \- enable all backends" 4 -.IX Item "32 - enable all backends" -This enables all backends \- without this feature, you need to enable at -least one backend manually (\f(CW\*(C`EV_USE_SELECT\*(C'\fR is a good choice). -.ie n .IP "64 \- enable OS-specific ""helper"" APIs" 4 -.el .IP "\f(CW64\fR \- enable OS-specific ``helper'' APIs" 4 -.IX Item "64 - enable OS-specific helper APIs" -Enable inotify, eventfd, signalfd and similar OS-specific helper APIs by -default. -.RE -.RS 4 -.Sp -Compiling with \f(CW\*(C`gcc \-Os \-DEV_STANDALONE \-DEV_USE_EPOLL=1 \-DEV_FEATURES=0\*(C'\fR -reduces the compiled size of libev from 24.7Kb code/2.8Kb data to 6.5Kb -code/0.3Kb data on my GNU/Linux amd64 system, while still giving you I/O -watchers, timers and monotonic clock support. -.Sp -With an intelligent-enough linker (gcc+binutils are intelligent enough -when you use \f(CW\*(C`\-Wl,\-\-gc\-sections \-ffunction\-sections\*(C'\fR) functions unused by -your program might be left out as well \- a binary starting a timer and an -I/O watcher then might come out at only 5Kb. -.RE -.IP "\s-1EV_API_STATIC\s0" 4 -.IX Item "EV_API_STATIC" -If this symbol is defined (by default it is not), then all identifiers -will have static linkage. This means that libev will not export any -identifiers, and you cannot link against libev anymore. This can be useful -when you embed libev, only want to use libev functions in a single file, -and do not want its identifiers to be visible. -.Sp -To use this, define \f(CW\*(C`EV_API_STATIC\*(C'\fR and include \fIev.c\fR in the file that -wants to use libev. -.Sp -This option only works when libev is compiled with a C compiler, as \*(C+ -doesn't support the required declaration syntax. -.IP "\s-1EV_AVOID_STDIO\s0" 4 -.IX Item "EV_AVOID_STDIO" -If this is set to \f(CW1\fR at compiletime, then libev will avoid using stdio -functions (printf, scanf, perror etc.). This will increase the code size -somewhat, but if your program doesn't otherwise depend on stdio and your -libc allows it, this avoids linking in the stdio library which is quite -big. -.Sp -Note that error messages might become less precise when this option is -enabled. -.IP "\s-1EV_NSIG\s0" 4 -.IX Item "EV_NSIG" -The highest supported signal number, +1 (or, the number of -signals): Normally, libev tries to deduce the maximum number of signals -automatically, but sometimes this fails, in which case it can be -specified. Also, using a lower number than detected (\f(CW32\fR should be -good for about any system in existence) can save some memory, as libev -statically allocates some 12\-24 bytes per signal number. -.IP "\s-1EV_PID_HASHSIZE\s0" 4 -.IX Item "EV_PID_HASHSIZE" -\&\f(CW\*(C`ev_child\*(C'\fR watchers use a small hash table to distribute workload by -pid. The default size is \f(CW16\fR (or \f(CW1\fR with \f(CW\*(C`EV_FEATURES\*(C'\fR disabled), -usually more than enough. If you need to manage thousands of children you -might want to increase this value (\fImust\fR be a power of two). -.IP "\s-1EV_INOTIFY_HASHSIZE\s0" 4 -.IX Item "EV_INOTIFY_HASHSIZE" -\&\f(CW\*(C`ev_stat\*(C'\fR watchers use a small hash table to distribute workload by -inotify watch id. The default size is \f(CW16\fR (or \f(CW1\fR with \f(CW\*(C`EV_FEATURES\*(C'\fR -disabled), usually more than enough. If you need to manage thousands of -\&\f(CW\*(C`ev_stat\*(C'\fR watchers you might want to increase this value (\fImust\fR be a -power of two). -.IP "\s-1EV_USE_4HEAP\s0" 4 -.IX Item "EV_USE_4HEAP" -Heaps are not very cache-efficient. To improve the cache-efficiency of the -timer and periodics heaps, libev uses a 4\-heap when this symbol is defined -to \f(CW1\fR. The 4\-heap uses more complicated (longer) code but has noticeably -faster performance with many (thousands) of watchers. -.Sp -The default is \f(CW1\fR, unless \f(CW\*(C`EV_FEATURES\*(C'\fR overrides it, in which case it -will be \f(CW0\fR. -.IP "\s-1EV_HEAP_CACHE_AT\s0" 4 -.IX Item "EV_HEAP_CACHE_AT" -Heaps are not very cache-efficient. To improve the cache-efficiency of the -timer and periodics heaps, libev can cache the timestamp (\fIat\fR) within -the heap structure (selected by defining \f(CW\*(C`EV_HEAP_CACHE_AT\*(C'\fR to \f(CW1\fR), -which uses 8\-12 bytes more per watcher and a few hundred bytes more code, -but avoids random read accesses on heap changes. This improves performance -noticeably with many (hundreds) of watchers. -.Sp -The default is \f(CW1\fR, unless \f(CW\*(C`EV_FEATURES\*(C'\fR overrides it, in which case it -will be \f(CW0\fR. -.IP "\s-1EV_VERIFY\s0" 4 -.IX Item "EV_VERIFY" -Controls how much internal verification (see \f(CW\*(C`ev_verify ()\*(C'\fR) will -be done: If set to \f(CW0\fR, no internal verification code will be compiled -in. If set to \f(CW1\fR, then verification code will be compiled in, but not -called. If set to \f(CW2\fR, then the internal verification code will be -called once per loop, which can slow down libev. If set to \f(CW3\fR, then the -verification code will be called very frequently, which will slow down -libev considerably. -.Sp -Verification errors are reported via C's \f(CW\*(C`assert\*(C'\fR mechanism, so if you -disable that (e.g. by defining \f(CW\*(C`NDEBUG\*(C'\fR) then no errors will be reported. -.Sp -The default is \f(CW1\fR, unless \f(CW\*(C`EV_FEATURES\*(C'\fR overrides it, in which case it -will be \f(CW0\fR. -.IP "\s-1EV_COMMON\s0" 4 -.IX Item "EV_COMMON" -By default, all watchers have a \f(CW\*(C`void *data\*(C'\fR member. By redefining -this macro to something else you can include more and other types of -members. You have to define it each time you include one of the files, -though, and it must be identical each time. -.Sp -For example, the perl \s-1EV\s0 module uses something like this: -.Sp -.Vb 3 -\& #define EV_COMMON \e -\& SV *self; /* contains this struct */ \e -\& SV *cb_sv, *fh /* note no trailing ";" */ -.Ve -.IP "\s-1EV_CB_DECLARE\s0 (type)" 4 -.IX Item "EV_CB_DECLARE (type)" -.PD 0 -.IP "\s-1EV_CB_INVOKE\s0 (watcher, revents)" 4 -.IX Item "EV_CB_INVOKE (watcher, revents)" -.IP "ev_set_cb (ev, cb)" 4 -.IX Item "ev_set_cb (ev, cb)" -.PD -Can be used to change the callback member declaration in each watcher, -and the way callbacks are invoked and set. Must expand to a struct member -definition and a statement, respectively. See the \fIev.h\fR header file for -their default definitions. One possible use for overriding these is to -avoid the \f(CW\*(C`struct ev_loop *\*(C'\fR as first argument in all cases, or to use -method calls instead of plain function calls in \*(C+. -.SS "\s-1EXPORTED API SYMBOLS\s0" -.IX Subsection "EXPORTED API SYMBOLS" -If you need to re-export the \s-1API\s0 (e.g. via a \s-1DLL\s0) and you need a list of -exported symbols, you can use the provided \fISymbol.*\fR files which list -all public symbols, one per line: -.PP -.Vb 2 -\& Symbols.ev for libev proper -\& Symbols.event for the libevent emulation -.Ve -.PP -This can also be used to rename all public symbols to avoid clashes with -multiple versions of libev linked together (which is obviously bad in -itself, but sometimes it is inconvenient to avoid this). -.PP -A sed command like this will create wrapper \f(CW\*(C`#define\*(C'\fR's that you need to -include before including \fIev.h\fR: -.PP -.Vb 1 -\& wrap.h -.Ve -.PP -This would create a file \fIwrap.h\fR which essentially looks like this: -.PP -.Vb 4 -\& #define ev_backend myprefix_ev_backend -\& #define ev_check_start myprefix_ev_check_start -\& #define ev_check_stop myprefix_ev_check_stop -\& ... -.Ve -.SS "\s-1EXAMPLES\s0" -.IX Subsection "EXAMPLES" -For a real-world example of a program the includes libev -verbatim, you can have a look at the \s-1EV\s0 perl module -(). It has the libev files in -the \fIlibev/\fR subdirectory and includes them in the \fI\s-1EV/EVAPI\s0.h\fR (public -interface) and \fI\s-1EV\s0.xs\fR (implementation) files. Only the \fI\s-1EV\s0.xs\fR file -will be compiled. It is pretty complex because it provides its own header -file. -.PP -The usage in rxvt-unicode is simpler. It has a \fIev_cpp.h\fR header file -that everybody includes and which overrides some configure choices: -.PP -.Vb 8 -\& #define EV_FEATURES 8 -\& #define EV_USE_SELECT 1 -\& #define EV_PREPARE_ENABLE 1 -\& #define EV_IDLE_ENABLE 1 -\& #define EV_SIGNAL_ENABLE 1 -\& #define EV_CHILD_ENABLE 1 -\& #define EV_USE_STDEXCEPT 0 -\& #define EV_CONFIG_H -\& -\& #include "ev++.h" -.Ve -.PP -And a \fIev_cpp.C\fR implementation file that contains libev proper and is compiled: -.PP -.Vb 2 -\& #include "ev_cpp.h" -\& #include "ev.c" -.Ve -.SH "INTERACTION WITH OTHER PROGRAMS, LIBRARIES OR THE ENVIRONMENT" -.IX Header "INTERACTION WITH OTHER PROGRAMS, LIBRARIES OR THE ENVIRONMENT" -.SS "\s-1THREADS AND COROUTINES\s0" -.IX Subsection "THREADS AND COROUTINES" -\fI\s-1THREADS\s0\fR -.IX Subsection "THREADS" -.PP -All libev functions are reentrant and thread-safe unless explicitly -documented otherwise, but libev implements no locking itself. This means -that you can use as many loops as you want in parallel, as long as there -are no concurrent calls into any libev function with the same loop -parameter (\f(CW\*(C`ev_default_*\*(C'\fR calls have an implicit default loop parameter, -of course): libev guarantees that different event loops share no data -structures that need any locking. -.PP -Or to put it differently: calls with different loop parameters can be done -concurrently from multiple threads, calls with the same loop parameter -must be done serially (but can be done from different threads, as long as -only one thread ever is inside a call at any point in time, e.g. by using -a mutex per loop). -.PP -Specifically to support threads (and signal handlers), libev implements -so-called \f(CW\*(C`ev_async\*(C'\fR watchers, which allow some limited form of -concurrency on the same event loop, namely waking it up \*(L"from the -outside\*(R". -.PP -If you want to know which design (one loop, locking, or multiple loops -without or something else still) is best for your problem, then I cannot -help you, but here is some generic advice: -.IP "\(bu" 4 -most applications have a main thread: use the default libev loop -in that thread, or create a separate thread running only the default loop. -.Sp -This helps integrating other libraries or software modules that use libev -themselves and don't care/know about threading. -.IP "\(bu" 4 -one loop per thread is usually a good model. -.Sp -Doing this is almost never wrong, sometimes a better-performance model -exists, but it is always a good start. -.IP "\(bu" 4 -other models exist, such as the leader/follower pattern, where one -loop is handed through multiple threads in a kind of round-robin fashion. -.Sp -Choosing a model is hard \- look around, learn, know that usually you can do -better than you currently do :\-) -.IP "\(bu" 4 -often you need to talk to some other thread which blocks in the -event loop. -.Sp -\&\f(CW\*(C`ev_async\*(C'\fR watchers can be used to wake them up from other threads safely -(or from signal contexts...). -.Sp -An example use would be to communicate signals or other events that only -work in the default loop by registering the signal watcher with the -default loop and triggering an \f(CW\*(C`ev_async\*(C'\fR watcher from the default loop -watcher callback into the event loop interested in the signal. -.PP -See also \*(L"\s-1THREAD LOCKING EXAMPLE\*(R"\s0. -.PP -\fI\s-1COROUTINES\s0\fR -.IX Subsection "COROUTINES" -.PP -Libev is very accommodating to coroutines (\*(L"cooperative threads\*(R"): -libev fully supports nesting calls to its functions from different -coroutines (e.g. you can call \f(CW\*(C`ev_run\*(C'\fR on the same loop from two -different coroutines, and switch freely between both coroutines running -the loop, as long as you don't confuse yourself). The only exception is -that you must not do this from \f(CW\*(C`ev_periodic\*(C'\fR reschedule callbacks. -.PP -Care has been taken to ensure that libev does not keep local state inside -\&\f(CW\*(C`ev_run\*(C'\fR, and other calls do not usually allow for coroutine switches as -they do not call any callbacks. -.SS "\s-1COMPILER WARNINGS\s0" -.IX Subsection "COMPILER WARNINGS" -Depending on your compiler and compiler settings, you might get no or a -lot of warnings when compiling libev code. Some people are apparently -scared by this. -.PP -However, these are unavoidable for many reasons. For one, each compiler -has different warnings, and each user has different tastes regarding -warning options. \*(L"Warn-free\*(R" code therefore cannot be a goal except when -targeting a specific compiler and compiler-version. -.PP -Another reason is that some compiler warnings require elaborate -workarounds, or other changes to the code that make it less clear and less -maintainable. -.PP -And of course, some compiler warnings are just plain stupid, or simply -wrong (because they don't actually warn about the condition their message -seems to warn about). For example, certain older gcc versions had some -warnings that resulted in an extreme number of false positives. These have -been fixed, but some people still insist on making code warn-free with -such buggy versions. -.PP -While libev is written to generate as few warnings as possible, -\&\*(L"warn-free\*(R" code is not a goal, and it is recommended not to build libev -with any compiler warnings enabled unless you are prepared to cope with -them (e.g. by ignoring them). Remember that warnings are just that: -warnings, not errors, or proof of bugs. -.SS "\s-1VALGRIND\s0" -.IX Subsection "VALGRIND" -Valgrind has a special section here because it is a popular tool that is -highly useful. Unfortunately, valgrind reports are very hard to interpret. -.PP -If you think you found a bug (memory leak, uninitialised data access etc.) -in libev, then check twice: If valgrind reports something like: -.PP -.Vb 3 -\& ==2274== definitely lost: 0 bytes in 0 blocks. -\& ==2274== possibly lost: 0 bytes in 0 blocks. -\& ==2274== still reachable: 256 bytes in 1 blocks. -.Ve -.PP -Then there is no memory leak, just as memory accounted to global variables -is not a memleak \- the memory is still being referenced, and didn't leak. -.PP -Similarly, under some circumstances, valgrind might report kernel bugs -as if it were a bug in libev (e.g. in realloc or in the poll backend, -although an acceptable workaround has been found here), or it might be -confused. -.PP -Keep in mind that valgrind is a very good tool, but only a tool. Don't -make it into some kind of religion. -.PP -If you are unsure about something, feel free to contact the mailing list -with the full valgrind report and an explanation on why you think this -is a bug in libev (best check the archives, too :). However, don't be -annoyed when you get a brisk \*(L"this is no bug\*(R" answer and take the chance -of learning how to interpret valgrind properly. -.PP -If you need, for some reason, empty reports from valgrind for your project -I suggest using suppression lists. -.SH "PORTABILITY NOTES" -.IX Header "PORTABILITY NOTES" -.SS "\s-1GNU/LINUX 32 BIT LIMITATIONS\s0" -.IX Subsection "GNU/LINUX 32 BIT LIMITATIONS" -GNU/Linux is the only common platform that supports 64 bit file/large file -interfaces but \fIdisables\fR them by default. -.PP -That means that libev compiled in the default environment doesn't support -files larger than 2GiB or so, which mainly affects \f(CW\*(C`ev_stat\*(C'\fR watchers. -.PP -Unfortunately, many programs try to work around this GNU/Linux issue -by enabling the large file \s-1API,\s0 which makes them incompatible with the -standard libev compiled for their system. -.PP -Likewise, libev cannot enable the large file \s-1API\s0 itself as this would -suddenly make it incompatible to the default compile time environment, -i.e. all programs not using special compile switches. -.SS "\s-1OS/X AND DARWIN BUGS\s0" -.IX Subsection "OS/X AND DARWIN BUGS" -The whole thing is a bug if you ask me \- basically any system interface -you touch is broken, whether it is locales, poll, kqueue or even the -OpenGL drivers. -.PP -\fI\f(CI\*(C`kqueue\*(C'\fI is buggy\fR -.IX Subsection "kqueue is buggy" -.PP -The kqueue syscall is broken in all known versions \- most versions support -only sockets, many support pipes. -.PP -Libev tries to work around this by not using \f(CW\*(C`kqueue\*(C'\fR by default on this -rotten platform, but of course you can still ask for it when creating a -loop \- embedding a socket-only kqueue loop into a select-based one is -probably going to work well. -.PP -\fI\f(CI\*(C`poll\*(C'\fI is buggy\fR -.IX Subsection "poll is buggy" -.PP -Instead of fixing \f(CW\*(C`kqueue\*(C'\fR, Apple replaced their (working) \f(CW\*(C`poll\*(C'\fR -implementation by something calling \f(CW\*(C`kqueue\*(C'\fR internally around the 10.5.6 -release, so now \f(CW\*(C`kqueue\*(C'\fR \fIand\fR \f(CW\*(C`poll\*(C'\fR are broken. -.PP -Libev tries to work around this by not using \f(CW\*(C`poll\*(C'\fR by default on -this rotten platform, but of course you can still ask for it when creating -a loop. -.PP -\fI\f(CI\*(C`select\*(C'\fI is buggy\fR -.IX Subsection "select is buggy" -.PP -All that's left is \f(CW\*(C`select\*(C'\fR, and of course Apple found a way to fuck this -one up as well: On \s-1OS/X,\s0 \f(CW\*(C`select\*(C'\fR actively limits the number of file -descriptors you can pass in to 1024 \- your program suddenly crashes when -you use more. -.PP -There is an undocumented \*(L"workaround\*(R" for this \- defining -\&\f(CW\*(C`_DARWIN_UNLIMITED_SELECT\*(C'\fR, which libev tries to use, so select \fIshould\fR -work on \s-1OS/X.\s0 -.SS "\s-1SOLARIS PROBLEMS AND WORKAROUNDS\s0" -.IX Subsection "SOLARIS PROBLEMS AND WORKAROUNDS" -\fI\f(CI\*(C`errno\*(C'\fI reentrancy\fR -.IX Subsection "errno reentrancy" -.PP -The default compile environment on Solaris is unfortunately so -thread-unsafe that you can't even use components/libraries compiled -without \f(CW\*(C`\-D_REENTRANT\*(C'\fR in a threaded program, which, of course, isn't -defined by default. A valid, if stupid, implementation choice. -.PP -If you want to use libev in threaded environments you have to make sure -it's compiled with \f(CW\*(C`_REENTRANT\*(C'\fR defined. -.PP -\fIEvent port backend\fR -.IX Subsection "Event port backend" -.PP -The scalable event interface for Solaris is called \*(L"event -ports\*(R". Unfortunately, this mechanism is very buggy in all major -releases. If you run into high \s-1CPU\s0 usage, your program freezes or you get -a large number of spurious wakeups, make sure you have all the relevant -and latest kernel patches applied. No, I don't know which ones, but there -are multiple ones to apply, and afterwards, event ports actually work -great. -.PP -If you can't get it to work, you can try running the program by setting -the environment variable \f(CW\*(C`LIBEV_FLAGS=3\*(C'\fR to only allow \f(CW\*(C`poll\*(C'\fR and -\&\f(CW\*(C`select\*(C'\fR backends. -.SS "\s-1AIX POLL BUG\s0" -.IX Subsection "AIX POLL BUG" -\&\s-1AIX\s0 unfortunately has a broken \f(CW\*(C`poll.h\*(C'\fR header. Libev works around -this by trying to avoid the poll backend altogether (i.e. it's not even -compiled in), which normally isn't a big problem as \f(CW\*(C`select\*(C'\fR works fine -with large bitsets on \s-1AIX,\s0 and \s-1AIX\s0 is dead anyway. -.SS "\s-1WIN32 PLATFORM LIMITATIONS AND WORKAROUNDS\s0" -.IX Subsection "WIN32 PLATFORM LIMITATIONS AND WORKAROUNDS" -\fIGeneral issues\fR -.IX Subsection "General issues" -.PP -Win32 doesn't support any of the standards (e.g. \s-1POSIX\s0) that libev -requires, and its I/O model is fundamentally incompatible with the \s-1POSIX\s0 -model. Libev still offers limited functionality on this platform in -the form of the \f(CW\*(C`EVBACKEND_SELECT\*(C'\fR backend, and only supports socket -descriptors. This only applies when using Win32 natively, not when using -e.g. cygwin. Actually, it only applies to the microsofts own compilers, -as every compiler comes with a slightly differently broken/incompatible -environment. -.PP -Lifting these limitations would basically require the full -re-implementation of the I/O system. If you are into this kind of thing, -then note that glib does exactly that for you in a very portable way (note -also that glib is the slowest event library known to man). -.PP -There is no supported compilation method available on windows except -embedding it into other applications. -.PP -Sensible signal handling is officially unsupported by Microsoft \- libev -tries its best, but under most conditions, signals will simply not work. -.PP -Not a libev limitation but worth mentioning: windows apparently doesn't -accept large writes: instead of resulting in a partial write, windows will -either accept everything or return \f(CW\*(C`ENOBUFS\*(C'\fR if the buffer is too large, -so make sure you only write small amounts into your sockets (less than a -megabyte seems safe, but this apparently depends on the amount of memory -available). -.PP -Due to the many, low, and arbitrary limits on the win32 platform and -the abysmal performance of winsockets, using a large number of sockets -is not recommended (and not reasonable). If your program needs to use -more than a hundred or so sockets, then likely it needs to use a totally -different implementation for windows, as libev offers the \s-1POSIX\s0 readiness -notification model, which cannot be implemented efficiently on windows -(due to Microsoft monopoly games). -.PP -A typical way to use libev under windows is to embed it (see the embedding -section for details) and use the following \fIevwrap.h\fR header file instead -of \fIev.h\fR: -.PP -.Vb 2 -\& #define EV_STANDALONE /* keeps ev from requiring config.h */ -\& #define EV_SELECT_IS_WINSOCKET 1 /* configure libev for windows select */ -\& -\& #include "ev.h" -.Ve -.PP -And compile the following \fIevwrap.c\fR file into your project (make sure -you do \fInot\fR compile the \fIev.c\fR or any other embedded source files!): -.PP -.Vb 2 -\& #include "evwrap.h" -\& #include "ev.c" -.Ve -.PP -\fIThe winsocket \f(CI\*(C`select\*(C'\fI function\fR -.IX Subsection "The winsocket select function" -.PP -The winsocket \f(CW\*(C`select\*(C'\fR function doesn't follow \s-1POSIX\s0 in that it -requires socket \fIhandles\fR and not socket \fIfile descriptors\fR (it is -also extremely buggy). This makes select very inefficient, and also -requires a mapping from file descriptors to socket handles (the Microsoft -C runtime provides the function \f(CW\*(C`_open_osfhandle\*(C'\fR for this). See the -discussion of the \f(CW\*(C`EV_SELECT_USE_FD_SET\*(C'\fR, \f(CW\*(C`EV_SELECT_IS_WINSOCKET\*(C'\fR and -\&\f(CW\*(C`EV_FD_TO_WIN32_HANDLE\*(C'\fR preprocessor symbols for more info. -.PP -The configuration for a \*(L"naked\*(R" win32 using the Microsoft runtime -libraries and raw winsocket select is: -.PP -.Vb 2 -\& #define EV_USE_SELECT 1 -\& #define EV_SELECT_IS_WINSOCKET 1 /* forces EV_SELECT_USE_FD_SET, too */ -.Ve -.PP -Note that winsockets handling of fd sets is O(n), so you can easily get a -complexity in the O(nX) range when using win32. -.PP -\fILimited number of file descriptors\fR -.IX Subsection "Limited number of file descriptors" -.PP -Windows has numerous arbitrary (and low) limits on things. -.PP -Early versions of winsocket's select only supported waiting for a maximum -of \f(CW64\fR handles (probably owning to the fact that all windows kernels -can only wait for \f(CW64\fR things at the same time internally; Microsoft -recommends spawning a chain of threads and wait for 63 handles and the -previous thread in each. Sounds great!). -.PP -Newer versions support more handles, but you need to define \f(CW\*(C`FD_SETSIZE\*(C'\fR -to some high number (e.g. \f(CW2048\fR) before compiling the winsocket select -call (which might be in libev or elsewhere, for example, perl and many -other interpreters do their own select emulation on windows). -.PP -Another limit is the number of file descriptors in the Microsoft runtime -libraries, which by default is \f(CW64\fR (there must be a hidden \fI64\fR -fetish or something like this inside Microsoft). You can increase this -by calling \f(CW\*(C`_setmaxstdio\*(C'\fR, which can increase this limit to \f(CW2048\fR -(another arbitrary limit), but is broken in many versions of the Microsoft -runtime libraries. This might get you to about \f(CW512\fR or \f(CW2048\fR sockets -(depending on windows version and/or the phase of the moon). To get more, -you need to wrap all I/O functions and provide your own fd management, but -the cost of calling select (O(nX)) will likely make this unworkable. -.SS "\s-1PORTABILITY REQUIREMENTS\s0" -.IX Subsection "PORTABILITY REQUIREMENTS" -In addition to a working ISO-C implementation and of course the -backend-specific APIs, libev relies on a few additional extensions: -.ie n .IP """void (*)(ev_watcher_type *, int revents)"" must have compatible calling conventions regardless of ""ev_watcher_type *""." 4 -.el .IP "\f(CWvoid (*)(ev_watcher_type *, int revents)\fR must have compatible calling conventions regardless of \f(CWev_watcher_type *\fR." 4 -.IX Item "void (*)(ev_watcher_type *, int revents) must have compatible calling conventions regardless of ev_watcher_type *." -Libev assumes not only that all watcher pointers have the same internal -structure (guaranteed by \s-1POSIX\s0 but not by \s-1ISO C\s0 for example), but it also -assumes that the same (machine) code can be used to call any watcher -callback: The watcher callbacks have different type signatures, but libev -calls them using an \f(CW\*(C`ev_watcher *\*(C'\fR internally. -.IP "null pointers and integer zero are represented by 0 bytes" 4 -.IX Item "null pointers and integer zero are represented by 0 bytes" -Libev uses \f(CW\*(C`memset\*(C'\fR to initialise structs and arrays to \f(CW0\fR bytes, and -relies on this setting pointers and integers to null. -.IP "pointer accesses must be thread-atomic" 4 -.IX Item "pointer accesses must be thread-atomic" -Accessing a pointer value must be atomic, it must both be readable and -writable in one piece \- this is the case on all current architectures. -.ie n .IP """sig_atomic_t volatile"" must be thread-atomic as well" 4 -.el .IP "\f(CWsig_atomic_t volatile\fR must be thread-atomic as well" 4 -.IX Item "sig_atomic_t volatile must be thread-atomic as well" -The type \f(CW\*(C`sig_atomic_t volatile\*(C'\fR (or whatever is defined as -\&\f(CW\*(C`EV_ATOMIC_T\*(C'\fR) must be atomic with respect to accesses from different -threads. This is not part of the specification for \f(CW\*(C`sig_atomic_t\*(C'\fR, but is -believed to be sufficiently portable. -.ie n .IP """sigprocmask"" must work in a threaded environment" 4 -.el .IP "\f(CWsigprocmask\fR must work in a threaded environment" 4 -.IX Item "sigprocmask must work in a threaded environment" -Libev uses \f(CW\*(C`sigprocmask\*(C'\fR to temporarily block signals. This is not -allowed in a threaded program (\f(CW\*(C`pthread_sigmask\*(C'\fR has to be used). Typical -pthread implementations will either allow \f(CW\*(C`sigprocmask\*(C'\fR in the \*(L"main -thread\*(R" or will block signals process-wide, both behaviours would -be compatible with libev. Interaction between \f(CW\*(C`sigprocmask\*(C'\fR and -\&\f(CW\*(C`pthread_sigmask\*(C'\fR could complicate things, however. -.Sp -The most portable way to handle signals is to block signals in all threads -except the initial one, and run the signal handling loop in the initial -thread as well. -.ie n .IP """long"" must be large enough for common memory allocation sizes" 4 -.el .IP "\f(CWlong\fR must be large enough for common memory allocation sizes" 4 -.IX Item "long must be large enough for common memory allocation sizes" -To improve portability and simplify its \s-1API,\s0 libev uses \f(CW\*(C`long\*(C'\fR internally -instead of \f(CW\*(C`size_t\*(C'\fR when allocating its data structures. On non-POSIX -systems (Microsoft...) this might be unexpectedly low, but is still at -least 31 bits everywhere, which is enough for hundreds of millions of -watchers. -.ie n .IP """double"" must hold a time value in seconds with enough accuracy" 4 -.el .IP "\f(CWdouble\fR must hold a time value in seconds with enough accuracy" 4 -.IX Item "double must hold a time value in seconds with enough accuracy" -The type \f(CW\*(C`double\*(C'\fR is used to represent timestamps. It is required to -have at least 51 bits of mantissa (and 9 bits of exponent), which is -good enough for at least into the year 4000 with millisecond accuracy -(the design goal for libev). This requirement is overfulfilled by -implementations using \s-1IEEE 754,\s0 which is basically all existing ones. -.Sp -With \s-1IEEE 754\s0 doubles, you get microsecond accuracy until at least the -year 2255 (and millisecond accuracy till the year 287396 \- by then, libev -is either obsolete or somebody patched it to use \f(CW\*(C`long double\*(C'\fR or -something like that, just kidding). -.PP -If you know of other additional requirements drop me a note. -.SH "ALGORITHMIC COMPLEXITIES" -.IX Header "ALGORITHMIC COMPLEXITIES" -In this section the complexities of (many of) the algorithms used inside -libev will be documented. For complexity discussions about backends see -the documentation for \f(CW\*(C`ev_default_init\*(C'\fR. -.PP -All of the following are about amortised time: If an array needs to be -extended, libev needs to realloc and move the whole array, but this -happens asymptotically rarer with higher number of elements, so O(1) might -mean that libev does a lengthy realloc operation in rare cases, but on -average it is much faster and asymptotically approaches constant time. -.IP "Starting and stopping timer/periodic watchers: O(log skipped_other_timers)" 4 -.IX Item "Starting and stopping timer/periodic watchers: O(log skipped_other_timers)" -This means that, when you have a watcher that triggers in one hour and -there are 100 watchers that would trigger before that, then inserting will -have to skip roughly seven (\f(CW\*(C`ld 100\*(C'\fR) of these watchers. -.IP "Changing timer/periodic watchers (by autorepeat or calling again): O(log skipped_other_timers)" 4 -.IX Item "Changing timer/periodic watchers (by autorepeat or calling again): O(log skipped_other_timers)" -That means that changing a timer costs less than removing/adding them, -as only the relative motion in the event queue has to be paid for. -.IP "Starting io/check/prepare/idle/signal/child/fork/async watchers: O(1)" 4 -.IX Item "Starting io/check/prepare/idle/signal/child/fork/async watchers: O(1)" -These just add the watcher into an array or at the head of a list. -.IP "Stopping check/prepare/idle/fork/async watchers: O(1)" 4 -.IX Item "Stopping check/prepare/idle/fork/async watchers: O(1)" -.PD 0 -.IP "Stopping an io/signal/child watcher: O(number_of_watchers_for_this_(fd/signal/pid % \s-1EV_PID_HASHSIZE\s0))" 4 -.IX Item "Stopping an io/signal/child watcher: O(number_of_watchers_for_this_(fd/signal/pid % EV_PID_HASHSIZE))" -.PD -These watchers are stored in lists, so they need to be walked to find the -correct watcher to remove. The lists are usually short (you don't usually -have many watchers waiting for the same fd or signal: one is typical, two -is rare). -.IP "Finding the next timer in each loop iteration: O(1)" 4 -.IX Item "Finding the next timer in each loop iteration: O(1)" -By virtue of using a binary or 4\-heap, the next timer is always found at a -fixed position in the storage array. -.IP "Each change on a file descriptor per loop iteration: O(number_of_watchers_for_this_fd)" 4 -.IX Item "Each change on a file descriptor per loop iteration: O(number_of_watchers_for_this_fd)" -A change means an I/O watcher gets started or stopped, which requires -libev to recalculate its status (and possibly tell the kernel, depending -on backend and whether \f(CW\*(C`ev_io_set\*(C'\fR was used). -.IP "Activating one watcher (putting it into the pending state): O(1)" 4 -.IX Item "Activating one watcher (putting it into the pending state): O(1)" -.PD 0 -.IP "Priority handling: O(number_of_priorities)" 4 -.IX Item "Priority handling: O(number_of_priorities)" -.PD -Priorities are implemented by allocating some space for each -priority. When doing priority-based operations, libev usually has to -linearly search all the priorities, but starting/stopping and activating -watchers becomes O(1) with respect to priority handling. -.IP "Sending an ev_async: O(1)" 4 -.IX Item "Sending an ev_async: O(1)" -.PD 0 -.IP "Processing ev_async_send: O(number_of_async_watchers)" 4 -.IX Item "Processing ev_async_send: O(number_of_async_watchers)" -.IP "Processing signals: O(max_signal_number)" 4 -.IX Item "Processing signals: O(max_signal_number)" -.PD -Sending involves a system call \fIiff\fR there were no other \f(CW\*(C`ev_async_send\*(C'\fR -calls in the current loop iteration and the loop is currently -blocked. Checking for async and signal events involves iterating over all -running async watchers or all signal numbers. -.SH "PORTING FROM LIBEV 3.X TO 4.X" -.IX Header "PORTING FROM LIBEV 3.X TO 4.X" -The major version 4 introduced some incompatible changes to the \s-1API.\s0 -.PP -At the moment, the \f(CW\*(C`ev.h\*(C'\fR header file provides compatibility definitions -for all changes, so most programs should still compile. The compatibility -layer might be removed in later versions of libev, so better update to the -new \s-1API\s0 early than late. -.ie n .IP """EV_COMPAT3"" backwards compatibility mechanism" 4 -.el .IP "\f(CWEV_COMPAT3\fR backwards compatibility mechanism" 4 -.IX Item "EV_COMPAT3 backwards compatibility mechanism" -The backward compatibility mechanism can be controlled by -\&\f(CW\*(C`EV_COMPAT3\*(C'\fR. See \*(L"\s-1PREPROCESSOR SYMBOLS/MACROS\*(R"\s0 in the \*(L"\s-1EMBEDDING\*(R"\s0 -section. -.ie n .IP """ev_default_destroy"" and ""ev_default_fork"" have been removed" 4 -.el .IP "\f(CWev_default_destroy\fR and \f(CWev_default_fork\fR have been removed" 4 -.IX Item "ev_default_destroy and ev_default_fork have been removed" -These calls can be replaced easily by their \f(CW\*(C`ev_loop_xxx\*(C'\fR counterparts: -.Sp -.Vb 2 -\& ev_loop_destroy (EV_DEFAULT_UC); -\& ev_loop_fork (EV_DEFAULT); -.Ve -.IP "function/symbol renames" 4 -.IX Item "function/symbol renames" -A number of functions and symbols have been renamed: -.Sp -.Vb 3 -\& ev_loop => ev_run -\& EVLOOP_NONBLOCK => EVRUN_NOWAIT -\& EVLOOP_ONESHOT => EVRUN_ONCE -\& -\& ev_unloop => ev_break -\& EVUNLOOP_CANCEL => EVBREAK_CANCEL -\& EVUNLOOP_ONE => EVBREAK_ONE -\& EVUNLOOP_ALL => EVBREAK_ALL -\& -\& EV_TIMEOUT => EV_TIMER -\& -\& ev_loop_count => ev_iteration -\& ev_loop_depth => ev_depth -\& ev_loop_verify => ev_verify -.Ve -.Sp -Most functions working on \f(CW\*(C`struct ev_loop\*(C'\fR objects don't have an -\&\f(CW\*(C`ev_loop_\*(C'\fR prefix, so it was removed; \f(CW\*(C`ev_loop\*(C'\fR, \f(CW\*(C`ev_unloop\*(C'\fR and -associated constants have been renamed to not collide with the \f(CW\*(C`struct -ev_loop\*(C'\fR anymore and \f(CW\*(C`EV_TIMER\*(C'\fR now follows the same naming scheme -as all other watcher types. Note that \f(CW\*(C`ev_loop_fork\*(C'\fR is still called -\&\f(CW\*(C`ev_loop_fork\*(C'\fR because it would otherwise clash with the \f(CW\*(C`ev_fork\*(C'\fR -typedef. -.ie n .IP """EV_MINIMAL"" mechanism replaced by ""EV_FEATURES""" 4 -.el .IP "\f(CWEV_MINIMAL\fR mechanism replaced by \f(CWEV_FEATURES\fR" 4 -.IX Item "EV_MINIMAL mechanism replaced by EV_FEATURES" -The preprocessor symbol \f(CW\*(C`EV_MINIMAL\*(C'\fR has been replaced by a different -mechanism, \f(CW\*(C`EV_FEATURES\*(C'\fR. Programs using \f(CW\*(C`EV_MINIMAL\*(C'\fR usually compile -and work, but the library code will of course be larger. -.SH "GLOSSARY" -.IX Header "GLOSSARY" -.IP "active" 4 -.IX Item "active" -A watcher is active as long as it has been started and not yet stopped. -See \*(L"\s-1WATCHER STATES\*(R"\s0 for details. -.IP "application" 4 -.IX Item "application" -In this document, an application is whatever is using libev. -.IP "backend" 4 -.IX Item "backend" -The part of the code dealing with the operating system interfaces. -.IP "callback" 4 -.IX Item "callback" -The address of a function that is called when some event has been -detected. Callbacks are being passed the event loop, the watcher that -received the event, and the actual event bitset. -.IP "callback/watcher invocation" 4 -.IX Item "callback/watcher invocation" -The act of calling the callback associated with a watcher. -.IP "event" 4 -.IX Item "event" -A change of state of some external event, such as data now being available -for reading on a file descriptor, time having passed or simply not having -any other events happening anymore. -.Sp -In libev, events are represented as single bits (such as \f(CW\*(C`EV_READ\*(C'\fR or -\&\f(CW\*(C`EV_TIMER\*(C'\fR). -.IP "event library" 4 -.IX Item "event library" -A software package implementing an event model and loop. -.IP "event loop" 4 -.IX Item "event loop" -An entity that handles and processes external events and converts them -into callback invocations. -.IP "event model" 4 -.IX Item "event model" -The model used to describe how an event loop handles and processes -watchers and events. -.IP "pending" 4 -.IX Item "pending" -A watcher is pending as soon as the corresponding event has been -detected. See \*(L"\s-1WATCHER STATES\*(R"\s0 for details. -.IP "real time" 4 -.IX Item "real time" -The physical time that is observed. It is apparently strictly monotonic :) -.IP "wall-clock time" 4 -.IX Item "wall-clock time" -The time and date as shown on clocks. Unlike real time, it can actually -be wrong and jump forwards and backwards, e.g. when you adjust your -clock. -.IP "watcher" 4 -.IX Item "watcher" -A data structure that describes interest in certain events. Watchers need -to be started (attached to an event loop) before they can receive events. -.SH "AUTHOR" -.IX Header "AUTHOR" -Marc Lehmann , with repeated corrections by Mikael -Magnusson and Emanuele Giaquinta, and minor corrections by many others. diff --git a/client/3rd/ShadowSocks/ShadowSocks/libev/armv7/include/ev++.h b/client/3rd/ShadowSocks/ShadowSocks/libev/armv7/include/ev++.h deleted file mode 100644 index 22dfcf58..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libev/armv7/include/ev++.h +++ /dev/null @@ -1,818 +0,0 @@ -/* - * libev simple C++ wrapper classes - * - * Copyright (c) 2007,2008,2010,2018,2020 Marc Alexander Lehmann - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modifica- - * tion, 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. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MER- - * CHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO - * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPE- - * CIAL, 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 OTH- - * ERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - * OF THE POSSIBILITY OF SUCH DAMAGE. - * - * Alternatively, the contents of this file may be used under the terms of - * the GNU General Public License ("GPL") version 2 or any later version, - * in which case the provisions of the GPL are applicable instead of - * the above. If you wish to allow the use of your version of this file - * only under the terms of the GPL and not to allow others to use your - * version of this file under the BSD license, indicate your decision - * by deleting the provisions above and replace them with the notice - * and other provisions required by the GPL. If you do not delete the - * provisions above, a recipient may use your version of this file under - * either the BSD or the GPL. - */ - -#ifndef EVPP_H__ -#define EVPP_H__ - -#ifdef EV_H -# include EV_H -#else -# include "ev.h" -#endif - -#ifndef EV_USE_STDEXCEPT -# define EV_USE_STDEXCEPT 1 -#endif - -#if EV_USE_STDEXCEPT -# include -#endif - -namespace ev { - - typedef ev_tstamp tstamp; - - enum { - UNDEF = EV_UNDEF, - NONE = EV_NONE, - READ = EV_READ, - WRITE = EV_WRITE, -#if EV_COMPAT3 - TIMEOUT = EV_TIMEOUT, -#endif - TIMER = EV_TIMER, - PERIODIC = EV_PERIODIC, - SIGNAL = EV_SIGNAL, - CHILD = EV_CHILD, - STAT = EV_STAT, - IDLE = EV_IDLE, - CHECK = EV_CHECK, - PREPARE = EV_PREPARE, - FORK = EV_FORK, - ASYNC = EV_ASYNC, - EMBED = EV_EMBED, -# undef ERROR // some systems stupidly #define ERROR - ERROR = EV_ERROR - }; - - enum - { - AUTO = EVFLAG_AUTO, - NOENV = EVFLAG_NOENV, - FORKCHECK = EVFLAG_FORKCHECK, - - SELECT = EVBACKEND_SELECT, - POLL = EVBACKEND_POLL, - EPOLL = EVBACKEND_EPOLL, - KQUEUE = EVBACKEND_KQUEUE, - DEVPOLL = EVBACKEND_DEVPOLL, - PORT = EVBACKEND_PORT - }; - - enum - { -#if EV_COMPAT3 - NONBLOCK = EVLOOP_NONBLOCK, - ONESHOT = EVLOOP_ONESHOT, -#endif - NOWAIT = EVRUN_NOWAIT, - ONCE = EVRUN_ONCE - }; - - enum how_t - { - ONE = EVBREAK_ONE, - ALL = EVBREAK_ALL - }; - - struct bad_loop -#if EV_USE_STDEXCEPT - : std::exception -#endif - { -#if EV_USE_STDEXCEPT - const char *what () const EV_NOEXCEPT - { - return "libev event loop cannot be initialized, bad value of LIBEV_FLAGS?"; - } -#endif - }; - -#ifdef EV_AX -# undef EV_AX -#endif - -#ifdef EV_AX_ -# undef EV_AX_ -#endif - -#if EV_MULTIPLICITY -# define EV_AX raw_loop -# define EV_AX_ raw_loop, -#else -# define EV_AX -# define EV_AX_ -#endif - - struct loop_ref - { - loop_ref (EV_P) EV_NOEXCEPT -#if EV_MULTIPLICITY - : EV_AX (EV_A) -#endif - { - } - - bool operator == (const loop_ref &other) const EV_NOEXCEPT - { -#if EV_MULTIPLICITY - return EV_AX == other.EV_AX; -#else - return true; -#endif - } - - bool operator != (const loop_ref &other) const EV_NOEXCEPT - { -#if EV_MULTIPLICITY - return ! (*this == other); -#else - return false; -#endif - } - -#if EV_MULTIPLICITY - bool operator == (const EV_P) const EV_NOEXCEPT - { - return this->EV_AX == EV_A; - } - - bool operator != (const EV_P) const EV_NOEXCEPT - { - return ! (*this == EV_A); - } - - operator struct ev_loop * () const EV_NOEXCEPT - { - return EV_AX; - } - - operator const struct ev_loop * () const EV_NOEXCEPT - { - return EV_AX; - } - - bool is_default () const EV_NOEXCEPT - { - return EV_AX == ev_default_loop (0); - } -#endif - -#if EV_COMPAT3 - void loop (int flags = 0) - { - ev_run (EV_AX_ flags); - } - - void unloop (how_t how = ONE) EV_NOEXCEPT - { - ev_break (EV_AX_ how); - } -#endif - - void run (int flags = 0) - { - ev_run (EV_AX_ flags); - } - - void break_loop (how_t how = ONE) EV_NOEXCEPT - { - ev_break (EV_AX_ how); - } - - void post_fork () EV_NOEXCEPT - { - ev_loop_fork (EV_AX); - } - - unsigned int backend () const EV_NOEXCEPT - { - return ev_backend (EV_AX); - } - - tstamp now () const EV_NOEXCEPT - { - return ev_now (EV_AX); - } - - void ref () EV_NOEXCEPT - { - ev_ref (EV_AX); - } - - void unref () EV_NOEXCEPT - { - ev_unref (EV_AX); - } - -#if EV_FEATURE_API - unsigned int iteration () const EV_NOEXCEPT - { - return ev_iteration (EV_AX); - } - - unsigned int depth () const EV_NOEXCEPT - { - return ev_depth (EV_AX); - } - - void set_io_collect_interval (tstamp interval) EV_NOEXCEPT - { - ev_set_io_collect_interval (EV_AX_ interval); - } - - void set_timeout_collect_interval (tstamp interval) EV_NOEXCEPT - { - ev_set_timeout_collect_interval (EV_AX_ interval); - } -#endif - - // function callback - void once (int fd, int events, tstamp timeout, void (*cb)(int, void *), void *arg = 0) EV_NOEXCEPT - { - ev_once (EV_AX_ fd, events, timeout, cb, arg); - } - - // method callback - template - void once (int fd, int events, tstamp timeout, K *object) EV_NOEXCEPT - { - once (fd, events, timeout, method_thunk, object); - } - - // default method == operator () - template - void once (int fd, int events, tstamp timeout, K *object) EV_NOEXCEPT - { - once (fd, events, timeout, method_thunk, object); - } - - template - static void method_thunk (int revents, void *arg) - { - (static_cast(arg)->*method) - (revents); - } - - // no-argument method callback - template - void once (int fd, int events, tstamp timeout, K *object) EV_NOEXCEPT - { - once (fd, events, timeout, method_noargs_thunk, object); - } - - template - static void method_noargs_thunk (int revents, void *arg) - { - (static_cast(arg)->*method) - (); - } - - // simpler function callback - template - void once (int fd, int events, tstamp timeout) EV_NOEXCEPT - { - once (fd, events, timeout, simpler_func_thunk); - } - - template - static void simpler_func_thunk (int revents, void *arg) - { - (*cb) - (revents); - } - - // simplest function callback - template - void once (int fd, int events, tstamp timeout) EV_NOEXCEPT - { - once (fd, events, timeout, simplest_func_thunk); - } - - template - static void simplest_func_thunk (int revents, void *arg) - { - (*cb) - (); - } - - void feed_fd_event (int fd, int revents) EV_NOEXCEPT - { - ev_feed_fd_event (EV_AX_ fd, revents); - } - - void feed_signal_event (int signum) EV_NOEXCEPT - { - ev_feed_signal_event (EV_AX_ signum); - } - -#if EV_MULTIPLICITY - struct ev_loop* EV_AX; -#endif - - }; - -#if EV_MULTIPLICITY - struct dynamic_loop : loop_ref - { - - dynamic_loop (unsigned int flags = AUTO) - : loop_ref (ev_loop_new (flags)) - { - if (!EV_AX) - throw bad_loop (); - } - - ~dynamic_loop () EV_NOEXCEPT - { - ev_loop_destroy (EV_AX); - EV_AX = 0; - } - - private: - - dynamic_loop (const dynamic_loop &); - - dynamic_loop & operator= (const dynamic_loop &); - - }; -#endif - - struct default_loop : loop_ref - { - default_loop (unsigned int flags = AUTO) -#if EV_MULTIPLICITY - : loop_ref (ev_default_loop (flags)) -#endif - { - if ( -#if EV_MULTIPLICITY - !EV_AX -#else - !ev_default_loop (flags) -#endif - ) - throw bad_loop (); - } - - private: - default_loop (const default_loop &); - default_loop &operator = (const default_loop &); - }; - - inline loop_ref get_default_loop () EV_NOEXCEPT - { -#if EV_MULTIPLICITY - return ev_default_loop (0); -#else - return loop_ref (); -#endif - } - -#undef EV_AX -#undef EV_AX_ - -#undef EV_PX -#undef EV_PX_ -#if EV_MULTIPLICITY -# define EV_PX loop_ref EV_A -# define EV_PX_ loop_ref EV_A_ -#else -# define EV_PX -# define EV_PX_ -#endif - - template - struct base : ev_watcher - { - // scoped pause/unpause of a watcher - struct freeze_guard - { - watcher &w; - bool active; - - freeze_guard (watcher *self) EV_NOEXCEPT - : w (*self), active (w.is_active ()) - { - if (active) w.stop (); - } - - ~freeze_guard () - { - if (active) w.start (); - } - }; - - #if EV_MULTIPLICITY - EV_PX; - - // loop set - void set (EV_P) EV_NOEXCEPT - { - this->EV_A = EV_A; - } - #endif - - base (EV_PX) EV_NOEXCEPT - #if EV_MULTIPLICITY - : EV_A (EV_A) - #endif - { - ev_init (this, 0); - } - - void set_ (const void *data, void (*cb)(EV_P_ ev_watcher *w, int revents)) EV_NOEXCEPT - { - this->data = (void *)data; - ev_set_cb (static_cast(this), cb); - } - - // function callback - template - void set (void *data = 0) EV_NOEXCEPT - { - set_ (data, function_thunk); - } - - template - static void function_thunk (EV_P_ ev_watcher *w, int revents) - { - function - (*static_cast(w), revents); - } - - // method callback - template - void set (K *object) EV_NOEXCEPT - { - set_ (object, method_thunk); - } - - // default method == operator () - template - void set (K *object) EV_NOEXCEPT - { - set_ (object, method_thunk); - } - - template - static void method_thunk (EV_P_ ev_watcher *w, int revents) - { - (static_cast(w->data)->*method) - (*static_cast(w), revents); - } - - // no-argument callback - template - void set (K *object) EV_NOEXCEPT - { - set_ (object, method_noargs_thunk); - } - - template - static void method_noargs_thunk (EV_P_ ev_watcher *w, int revents) - { - (static_cast(w->data)->*method) - (); - } - - void operator ()(int events = EV_UNDEF) - { - return - ev_cb (static_cast(this)) - (static_cast(this), events); - } - - bool is_active () const EV_NOEXCEPT - { - return ev_is_active (static_cast(this)); - } - - bool is_pending () const EV_NOEXCEPT - { - return ev_is_pending (static_cast(this)); - } - - void feed_event (int revents) EV_NOEXCEPT - { - ev_feed_event (EV_A_ static_cast(this), revents); - } - }; - - inline tstamp now (EV_P) EV_NOEXCEPT - { - return ev_now (EV_A); - } - - inline void delay (tstamp interval) EV_NOEXCEPT - { - ev_sleep (interval); - } - - inline int version_major () EV_NOEXCEPT - { - return ev_version_major (); - } - - inline int version_minor () EV_NOEXCEPT - { - return ev_version_minor (); - } - - inline unsigned int supported_backends () EV_NOEXCEPT - { - return ev_supported_backends (); - } - - inline unsigned int recommended_backends () EV_NOEXCEPT - { - return ev_recommended_backends (); - } - - inline unsigned int embeddable_backends () EV_NOEXCEPT - { - return ev_embeddable_backends (); - } - - inline void set_allocator (void *(*cb)(void *ptr, long size) EV_NOEXCEPT) EV_NOEXCEPT - { - ev_set_allocator (cb); - } - - inline void set_syserr_cb (void (*cb)(const char *msg) EV_NOEXCEPT) EV_NOEXCEPT - { - ev_set_syserr_cb (cb); - } - - #if EV_MULTIPLICITY - #define EV_CONSTRUCT(cppstem,cstem) \ - (EV_PX = get_default_loop ()) EV_NOEXCEPT \ - : base (EV_A) \ - { \ - } - #else - #define EV_CONSTRUCT(cppstem,cstem) \ - () EV_NOEXCEPT \ - { \ - } - #endif - - /* using a template here would require quite a few more lines, - * so a macro solution was chosen */ - #define EV_BEGIN_WATCHER(cppstem,cstem) \ - \ - struct cppstem : base \ - { \ - void start () EV_NOEXCEPT \ - { \ - ev_ ## cstem ## _start (EV_A_ static_cast(this)); \ - } \ - \ - void stop () EV_NOEXCEPT \ - { \ - ev_ ## cstem ## _stop (EV_A_ static_cast(this)); \ - } \ - \ - cppstem EV_CONSTRUCT(cppstem,cstem) \ - \ - ~cppstem () EV_NOEXCEPT \ - { \ - stop (); \ - } \ - \ - using base::set; \ - \ - private: \ - \ - cppstem (const cppstem &o); \ - \ - cppstem &operator =(const cppstem &o); \ - \ - public: - - #define EV_END_WATCHER(cppstem,cstem) \ - }; - - EV_BEGIN_WATCHER (io, io) - void set (int fd, int events) EV_NOEXCEPT - { - freeze_guard freeze (this); - ev_io_set (static_cast(this), fd, events); - } - - void set (int events) EV_NOEXCEPT - { - freeze_guard freeze (this); - ev_io_modify (static_cast(this), events); - } - - void start (int fd, int events) EV_NOEXCEPT - { - set (fd, events); - start (); - } - EV_END_WATCHER (io, io) - - EV_BEGIN_WATCHER (timer, timer) - void set (ev_tstamp after, ev_tstamp repeat = 0.) EV_NOEXCEPT - { - freeze_guard freeze (this); - ev_timer_set (static_cast(this), after, repeat); - } - - void start (ev_tstamp after, ev_tstamp repeat = 0.) EV_NOEXCEPT - { - set (after, repeat); - start (); - } - - void again () EV_NOEXCEPT - { - ev_timer_again (EV_A_ static_cast(this)); - } - - ev_tstamp remaining () - { - return ev_timer_remaining (EV_A_ static_cast(this)); - } - EV_END_WATCHER (timer, timer) - - #if EV_PERIODIC_ENABLE - EV_BEGIN_WATCHER (periodic, periodic) - void set (ev_tstamp at, ev_tstamp interval = 0.) EV_NOEXCEPT - { - freeze_guard freeze (this); - ev_periodic_set (static_cast(this), at, interval, 0); - } - - void start (ev_tstamp at, ev_tstamp interval = 0.) EV_NOEXCEPT - { - set (at, interval); - start (); - } - - void again () EV_NOEXCEPT - { - ev_periodic_again (EV_A_ static_cast(this)); - } - EV_END_WATCHER (periodic, periodic) - #endif - - #if EV_SIGNAL_ENABLE - EV_BEGIN_WATCHER (sig, signal) - void set (int signum) EV_NOEXCEPT - { - freeze_guard freeze (this); - ev_signal_set (static_cast(this), signum); - } - - void start (int signum) EV_NOEXCEPT - { - set (signum); - start (); - } - EV_END_WATCHER (sig, signal) - #endif - - #if EV_CHILD_ENABLE - EV_BEGIN_WATCHER (child, child) - void set (int pid, int trace = 0) EV_NOEXCEPT - { - freeze_guard freeze (this); - ev_child_set (static_cast(this), pid, trace); - } - - void start (int pid, int trace = 0) EV_NOEXCEPT - { - set (pid, trace); - start (); - } - EV_END_WATCHER (child, child) - #endif - - #if EV_STAT_ENABLE - EV_BEGIN_WATCHER (stat, stat) - void set (const char *path, ev_tstamp interval = 0.) EV_NOEXCEPT - { - freeze_guard freeze (this); - ev_stat_set (static_cast(this), path, interval); - } - - void start (const char *path, ev_tstamp interval = 0.) EV_NOEXCEPT - { - stop (); - set (path, interval); - start (); - } - - void update () EV_NOEXCEPT - { - ev_stat_stat (EV_A_ static_cast(this)); - } - EV_END_WATCHER (stat, stat) - #endif - - #if EV_IDLE_ENABLE - EV_BEGIN_WATCHER (idle, idle) - void set () EV_NOEXCEPT { } - EV_END_WATCHER (idle, idle) - #endif - - #if EV_PREPARE_ENABLE - EV_BEGIN_WATCHER (prepare, prepare) - void set () EV_NOEXCEPT { } - EV_END_WATCHER (prepare, prepare) - #endif - - #if EV_CHECK_ENABLE - EV_BEGIN_WATCHER (check, check) - void set () EV_NOEXCEPT { } - EV_END_WATCHER (check, check) - #endif - - #if EV_EMBED_ENABLE - EV_BEGIN_WATCHER (embed, embed) - void set_embed (struct ev_loop *embedded_loop) EV_NOEXCEPT - { - freeze_guard freeze (this); - ev_embed_set (static_cast(this), embedded_loop); - } - - void start (struct ev_loop *embedded_loop) EV_NOEXCEPT - { - set (embedded_loop); - start (); - } - - void sweep () - { - ev_embed_sweep (EV_A_ static_cast(this)); - } - EV_END_WATCHER (embed, embed) - #endif - - #if EV_FORK_ENABLE - EV_BEGIN_WATCHER (fork, fork) - void set () EV_NOEXCEPT { } - EV_END_WATCHER (fork, fork) - #endif - - #if EV_ASYNC_ENABLE - EV_BEGIN_WATCHER (async, async) - void send () EV_NOEXCEPT - { - ev_async_send (EV_A_ static_cast(this)); - } - - bool async_pending () EV_NOEXCEPT - { - return ev_async_pending (static_cast(this)); - } - EV_END_WATCHER (async, async) - #endif - - #undef EV_PX - #undef EV_PX_ - #undef EV_CONSTRUCT - #undef EV_BEGIN_WATCHER - #undef EV_END_WATCHER -} - -#endif - diff --git a/client/3rd/ShadowSocks/ShadowSocks/libev/armv7/include/ev.h b/client/3rd/ShadowSocks/ShadowSocks/libev/armv7/include/ev.h deleted file mode 100644 index 4669c39b..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libev/armv7/include/ev.h +++ /dev/null @@ -1,860 +0,0 @@ -/* - * libev native API header - * - * Copyright (c) 2007-2020 Marc Alexander Lehmann - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modifica- - * tion, 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. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MER- - * CHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO - * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPE- - * CIAL, 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 OTH- - * ERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - * OF THE POSSIBILITY OF SUCH DAMAGE. - * - * Alternatively, the contents of this file may be used under the terms of - * the GNU General Public License ("GPL") version 2 or any later version, - * in which case the provisions of the GPL are applicable instead of - * the above. If you wish to allow the use of your version of this file - * only under the terms of the GPL and not to allow others to use your - * version of this file under the BSD license, indicate your decision - * by deleting the provisions above and replace them with the notice - * and other provisions required by the GPL. If you do not delete the - * provisions above, a recipient may use your version of this file under - * either the BSD or the GPL. - */ - -#ifndef EV_H_ -#define EV_H_ - -#ifdef __cplusplus -# define EV_CPP(x) x -# if __cplusplus >= 201103L -# define EV_NOEXCEPT noexcept -# else -# define EV_NOEXCEPT -# endif -#else -# define EV_CPP(x) -# define EV_NOEXCEPT -#endif -#define EV_THROW EV_NOEXCEPT /* pre-4.25, do not use in new code */ - -EV_CPP(extern "C" {) - -/*****************************************************************************/ - -/* pre-4.0 compatibility */ -#ifndef EV_COMPAT3 -# define EV_COMPAT3 1 -#endif - -#ifndef EV_FEATURES -# if defined __OPTIMIZE_SIZE__ -# define EV_FEATURES 0x7c -# else -# define EV_FEATURES 0x7f -# endif -#endif - -#define EV_FEATURE_CODE ((EV_FEATURES) & 1) -#define EV_FEATURE_DATA ((EV_FEATURES) & 2) -#define EV_FEATURE_CONFIG ((EV_FEATURES) & 4) -#define EV_FEATURE_API ((EV_FEATURES) & 8) -#define EV_FEATURE_WATCHERS ((EV_FEATURES) & 16) -#define EV_FEATURE_BACKENDS ((EV_FEATURES) & 32) -#define EV_FEATURE_OS ((EV_FEATURES) & 64) - -/* these priorities are inclusive, higher priorities will be invoked earlier */ -#ifndef EV_MINPRI -# define EV_MINPRI (EV_FEATURE_CONFIG ? -2 : 0) -#endif -#ifndef EV_MAXPRI -# define EV_MAXPRI (EV_FEATURE_CONFIG ? +2 : 0) -#endif - -#ifndef EV_MULTIPLICITY -# define EV_MULTIPLICITY EV_FEATURE_CONFIG -#endif - -#ifndef EV_PERIODIC_ENABLE -# define EV_PERIODIC_ENABLE EV_FEATURE_WATCHERS -#endif - -#ifndef EV_STAT_ENABLE -# define EV_STAT_ENABLE EV_FEATURE_WATCHERS -#endif - -#ifndef EV_PREPARE_ENABLE -# define EV_PREPARE_ENABLE EV_FEATURE_WATCHERS -#endif - -#ifndef EV_CHECK_ENABLE -# define EV_CHECK_ENABLE EV_FEATURE_WATCHERS -#endif - -#ifndef EV_IDLE_ENABLE -# define EV_IDLE_ENABLE EV_FEATURE_WATCHERS -#endif - -#ifndef EV_FORK_ENABLE -# define EV_FORK_ENABLE EV_FEATURE_WATCHERS -#endif - -#ifndef EV_CLEANUP_ENABLE -# define EV_CLEANUP_ENABLE EV_FEATURE_WATCHERS -#endif - -#ifndef EV_SIGNAL_ENABLE -# define EV_SIGNAL_ENABLE EV_FEATURE_WATCHERS -#endif - -#ifndef EV_CHILD_ENABLE -# ifdef _WIN32 -# define EV_CHILD_ENABLE 0 -# else -# define EV_CHILD_ENABLE EV_FEATURE_WATCHERS -#endif -#endif - -#ifndef EV_ASYNC_ENABLE -# define EV_ASYNC_ENABLE EV_FEATURE_WATCHERS -#endif - -#ifndef EV_EMBED_ENABLE -# define EV_EMBED_ENABLE EV_FEATURE_WATCHERS -#endif - -#ifndef EV_WALK_ENABLE -# define EV_WALK_ENABLE 0 /* not yet */ -#endif - -/*****************************************************************************/ - -#if EV_CHILD_ENABLE && !EV_SIGNAL_ENABLE -# undef EV_SIGNAL_ENABLE -# define EV_SIGNAL_ENABLE 1 -#endif - -/*****************************************************************************/ - -#ifndef EV_TSTAMP_T -# define EV_TSTAMP_T double -#endif -typedef EV_TSTAMP_T ev_tstamp; - -#include /* for memmove */ - -#ifndef EV_ATOMIC_T -# include -# define EV_ATOMIC_T sig_atomic_t volatile -#endif - -#if EV_STAT_ENABLE -# ifdef _WIN32 -# include -# include -# endif -# include -#endif - -/* support multiple event loops? */ -#if EV_MULTIPLICITY -struct ev_loop; -# define EV_P struct ev_loop *loop /* a loop as sole parameter in a declaration */ -# define EV_P_ EV_P, /* a loop as first of multiple parameters */ -# define EV_A loop /* a loop as sole argument to a function call */ -# define EV_A_ EV_A, /* a loop as first of multiple arguments */ -# define EV_DEFAULT_UC ev_default_loop_uc_ () /* the default loop, if initialised, as sole arg */ -# define EV_DEFAULT_UC_ EV_DEFAULT_UC, /* the default loop as first of multiple arguments */ -# define EV_DEFAULT ev_default_loop (0) /* the default loop as sole arg */ -# define EV_DEFAULT_ EV_DEFAULT, /* the default loop as first of multiple arguments */ -#else -# define EV_P void -# define EV_P_ -# define EV_A -# define EV_A_ -# define EV_DEFAULT -# define EV_DEFAULT_ -# define EV_DEFAULT_UC -# define EV_DEFAULT_UC_ -# undef EV_EMBED_ENABLE -#endif - -/* EV_INLINE is used for functions in header files */ -#if __STDC_VERSION__ >= 199901L || __GNUC__ >= 3 -# define EV_INLINE static inline -#else -# define EV_INLINE static -#endif - -#ifdef EV_API_STATIC -# define EV_API_DECL static -#else -# define EV_API_DECL extern -#endif - -/* EV_PROTOTYPES can be used to switch of prototype declarations */ -#ifndef EV_PROTOTYPES -# define EV_PROTOTYPES 1 -#endif - -/*****************************************************************************/ - -#define EV_VERSION_MAJOR 4 -#define EV_VERSION_MINOR 33 - -/* eventmask, revents, events... */ -enum { - EV_UNDEF = (int)0xFFFFFFFF, /* guaranteed to be invalid */ - EV_NONE = 0x00, /* no events */ - EV_READ = 0x01, /* ev_io detected read will not block */ - EV_WRITE = 0x02, /* ev_io detected write will not block */ - EV__IOFDSET = 0x80, /* internal use only */ - EV_IO = EV_READ, /* alias for type-detection */ - EV_TIMER = 0x00000100, /* timer timed out */ -#if EV_COMPAT3 - EV_TIMEOUT = EV_TIMER, /* pre 4.0 API compatibility */ -#endif - EV_PERIODIC = 0x00000200, /* periodic timer timed out */ - EV_SIGNAL = 0x00000400, /* signal was received */ - EV_CHILD = 0x00000800, /* child/pid had status change */ - EV_STAT = 0x00001000, /* stat data changed */ - EV_IDLE = 0x00002000, /* event loop is idling */ - EV_PREPARE = 0x00004000, /* event loop about to poll */ - EV_CHECK = 0x00008000, /* event loop finished poll */ - EV_EMBED = 0x00010000, /* embedded event loop needs sweep */ - EV_FORK = 0x00020000, /* event loop resumed in child */ - EV_CLEANUP = 0x00040000, /* event loop resumed in child */ - EV_ASYNC = 0x00080000, /* async intra-loop signal */ - EV_CUSTOM = 0x01000000, /* for use by user code */ - EV_ERROR = (int)0x80000000 /* sent when an error occurs */ -}; - -/* can be used to add custom fields to all watchers, while losing binary compatibility */ -#ifndef EV_COMMON -# define EV_COMMON void *data; -#endif - -#ifndef EV_CB_DECLARE -# define EV_CB_DECLARE(type) void (*cb)(EV_P_ struct type *w, int revents); -#endif -#ifndef EV_CB_INVOKE -# define EV_CB_INVOKE(watcher,revents) (watcher)->cb (EV_A_ (watcher), (revents)) -#endif - -/* not official, do not use */ -#define EV_CB(type,name) void name (EV_P_ struct ev_ ## type *w, int revents) - -/* - * struct member types: - * private: you may look at them, but not change them, - * and they might not mean anything to you. - * ro: can be read anytime, but only changed when the watcher isn't active. - * rw: can be read and modified anytime, even when the watcher is active. - * - * some internal details that might be helpful for debugging: - * - * active is either 0, which means the watcher is not active, - * or the array index of the watcher (periodics, timers) - * or the array index + 1 (most other watchers) - * or simply 1 for watchers that aren't in some array. - * pending is either 0, in which case the watcher isn't, - * or the array index + 1 in the pendings array. - */ - -#if EV_MINPRI == EV_MAXPRI -# define EV_DECL_PRIORITY -#elif !defined (EV_DECL_PRIORITY) -# define EV_DECL_PRIORITY int priority; -#endif - -/* shared by all watchers */ -#define EV_WATCHER(type) \ - int active; /* private */ \ - int pending; /* private */ \ - EV_DECL_PRIORITY /* private */ \ - EV_COMMON /* rw */ \ - EV_CB_DECLARE (type) /* private */ - -#define EV_WATCHER_LIST(type) \ - EV_WATCHER (type) \ - struct ev_watcher_list *next; /* private */ - -#define EV_WATCHER_TIME(type) \ - EV_WATCHER (type) \ - ev_tstamp at; /* private */ - -/* base class, nothing to see here unless you subclass */ -typedef struct ev_watcher -{ - EV_WATCHER (ev_watcher) -} ev_watcher; - -/* base class, nothing to see here unless you subclass */ -typedef struct ev_watcher_list -{ - EV_WATCHER_LIST (ev_watcher_list) -} ev_watcher_list; - -/* base class, nothing to see here unless you subclass */ -typedef struct ev_watcher_time -{ - EV_WATCHER_TIME (ev_watcher_time) -} ev_watcher_time; - -/* invoked when fd is either EV_READable or EV_WRITEable */ -/* revent EV_READ, EV_WRITE */ -typedef struct ev_io -{ - EV_WATCHER_LIST (ev_io) - - int fd; /* ro */ - int events; /* ro */ -} ev_io; - -/* invoked after a specific time, repeatable (based on monotonic clock) */ -/* revent EV_TIMEOUT */ -typedef struct ev_timer -{ - EV_WATCHER_TIME (ev_timer) - - ev_tstamp repeat; /* rw */ -} ev_timer; - -/* invoked at some specific time, possibly repeating at regular intervals (based on UTC) */ -/* revent EV_PERIODIC */ -typedef struct ev_periodic -{ - EV_WATCHER_TIME (ev_periodic) - - ev_tstamp offset; /* rw */ - ev_tstamp interval; /* rw */ - ev_tstamp (*reschedule_cb)(struct ev_periodic *w, ev_tstamp now) EV_NOEXCEPT; /* rw */ -} ev_periodic; - -/* invoked when the given signal has been received */ -/* revent EV_SIGNAL */ -typedef struct ev_signal -{ - EV_WATCHER_LIST (ev_signal) - - int signum; /* ro */ -} ev_signal; - -/* invoked when sigchld is received and waitpid indicates the given pid */ -/* revent EV_CHILD */ -/* does not support priorities */ -typedef struct ev_child -{ - EV_WATCHER_LIST (ev_child) - - int flags; /* private */ - int pid; /* ro */ - int rpid; /* rw, holds the received pid */ - int rstatus; /* rw, holds the exit status, use the macros from sys/wait.h */ -} ev_child; - -#if EV_STAT_ENABLE -/* st_nlink = 0 means missing file or other error */ -# ifdef _WIN32 -typedef struct _stati64 ev_statdata; -# else -typedef struct stat ev_statdata; -# endif - -/* invoked each time the stat data changes for a given path */ -/* revent EV_STAT */ -typedef struct ev_stat -{ - EV_WATCHER_LIST (ev_stat) - - ev_timer timer; /* private */ - ev_tstamp interval; /* ro */ - const char *path; /* ro */ - ev_statdata prev; /* ro */ - ev_statdata attr; /* ro */ - - int wd; /* wd for inotify, fd for kqueue */ -} ev_stat; -#endif - -/* invoked when the nothing else needs to be done, keeps the process from blocking */ -/* revent EV_IDLE */ -typedef struct ev_idle -{ - EV_WATCHER (ev_idle) -} ev_idle; - -/* invoked for each run of the mainloop, just before the blocking call */ -/* you can still change events in any way you like */ -/* revent EV_PREPARE */ -typedef struct ev_prepare -{ - EV_WATCHER (ev_prepare) -} ev_prepare; - -/* invoked for each run of the mainloop, just after the blocking call */ -/* revent EV_CHECK */ -typedef struct ev_check -{ - EV_WATCHER (ev_check) -} ev_check; - -/* the callback gets invoked before check in the child process when a fork was detected */ -/* revent EV_FORK */ -typedef struct ev_fork -{ - EV_WATCHER (ev_fork) -} ev_fork; - -/* is invoked just before the loop gets destroyed */ -/* revent EV_CLEANUP */ -typedef struct ev_cleanup -{ - EV_WATCHER (ev_cleanup) -} ev_cleanup; - -#if EV_EMBED_ENABLE -/* used to embed an event loop inside another */ -/* the callback gets invoked when the event loop has handled events, and can be 0 */ -typedef struct ev_embed -{ - EV_WATCHER (ev_embed) - - struct ev_loop *other; /* ro */ -#undef EV_IO_ENABLE -#define EV_IO_ENABLE 1 - ev_io io; /* private */ -#undef EV_PREPARE_ENABLE -#define EV_PREPARE_ENABLE 1 - ev_prepare prepare; /* private */ - ev_check check; /* unused */ - ev_timer timer; /* unused */ - ev_periodic periodic; /* unused */ - ev_idle idle; /* unused */ - ev_fork fork; /* private */ - ev_cleanup cleanup; /* unused */ -} ev_embed; -#endif - -#if EV_ASYNC_ENABLE -/* invoked when somebody calls ev_async_send on the watcher */ -/* revent EV_ASYNC */ -typedef struct ev_async -{ - EV_WATCHER (ev_async) - - EV_ATOMIC_T sent; /* private */ -} ev_async; - -# define ev_async_pending(w) (+(w)->sent) -#endif - -/* the presence of this union forces similar struct layout */ -union ev_any_watcher -{ - struct ev_watcher w; - struct ev_watcher_list wl; - - struct ev_io io; - struct ev_timer timer; - struct ev_periodic periodic; - struct ev_signal signal; - struct ev_child child; -#if EV_STAT_ENABLE - struct ev_stat stat; -#endif -#if EV_IDLE_ENABLE - struct ev_idle idle; -#endif - struct ev_prepare prepare; - struct ev_check check; -#if EV_FORK_ENABLE - struct ev_fork fork; -#endif -#if EV_CLEANUP_ENABLE - struct ev_cleanup cleanup; -#endif -#if EV_EMBED_ENABLE - struct ev_embed embed; -#endif -#if EV_ASYNC_ENABLE - struct ev_async async; -#endif -}; - -/* flag bits for ev_default_loop and ev_loop_new */ -enum { - /* the default */ - EVFLAG_AUTO = 0x00000000U, /* not quite a mask */ - /* flag bits */ - EVFLAG_NOENV = 0x01000000U, /* do NOT consult environment */ - EVFLAG_FORKCHECK = 0x02000000U, /* check for a fork in each iteration */ - /* debugging/feature disable */ - EVFLAG_NOINOTIFY = 0x00100000U, /* do not attempt to use inotify */ -#if EV_COMPAT3 - EVFLAG_NOSIGFD = 0, /* compatibility to pre-3.9 */ -#endif - EVFLAG_SIGNALFD = 0x00200000U, /* attempt to use signalfd */ - EVFLAG_NOSIGMASK = 0x00400000U, /* avoid modifying the signal mask */ - EVFLAG_NOTIMERFD = 0x00800000U /* avoid creating a timerfd */ -}; - -/* method bits to be ored together */ -enum { - EVBACKEND_SELECT = 0x00000001U, /* available just about anywhere */ - EVBACKEND_POLL = 0x00000002U, /* !win, !aix, broken on osx */ - EVBACKEND_EPOLL = 0x00000004U, /* linux */ - EVBACKEND_KQUEUE = 0x00000008U, /* bsd, broken on osx */ - EVBACKEND_DEVPOLL = 0x00000010U, /* solaris 8 */ /* NYI */ - EVBACKEND_PORT = 0x00000020U, /* solaris 10 */ - EVBACKEND_LINUXAIO = 0x00000040U, /* linux AIO, 4.19+ */ - EVBACKEND_IOURING = 0x00000080U, /* linux io_uring, 5.1+ */ - EVBACKEND_ALL = 0x000000FFU, /* all known backends */ - EVBACKEND_MASK = 0x0000FFFFU /* all future backends */ -}; - -#if EV_PROTOTYPES -EV_API_DECL int ev_version_major (void) EV_NOEXCEPT; -EV_API_DECL int ev_version_minor (void) EV_NOEXCEPT; - -EV_API_DECL unsigned int ev_supported_backends (void) EV_NOEXCEPT; -EV_API_DECL unsigned int ev_recommended_backends (void) EV_NOEXCEPT; -EV_API_DECL unsigned int ev_embeddable_backends (void) EV_NOEXCEPT; - -EV_API_DECL ev_tstamp ev_time (void) EV_NOEXCEPT; -EV_API_DECL void ev_sleep (ev_tstamp delay) EV_NOEXCEPT; /* sleep for a while */ - -/* Sets the allocation function to use, works like realloc. - * It is used to allocate and free memory. - * If it returns zero when memory needs to be allocated, the library might abort - * or take some potentially destructive action. - * The default is your system realloc function. - */ -EV_API_DECL void ev_set_allocator (void *(*cb)(void *ptr, long size) EV_NOEXCEPT) EV_NOEXCEPT; - -/* set the callback function to call on a - * retryable syscall error - * (such as failed select, poll, epoll_wait) - */ -EV_API_DECL void ev_set_syserr_cb (void (*cb)(const char *msg) EV_NOEXCEPT) EV_NOEXCEPT; - -#if EV_MULTIPLICITY - -/* the default loop is the only one that handles signals and child watchers */ -/* you can call this as often as you like */ -EV_API_DECL struct ev_loop *ev_default_loop (unsigned int flags EV_CPP (= 0)) EV_NOEXCEPT; - -#ifdef EV_API_STATIC -EV_API_DECL struct ev_loop *ev_default_loop_ptr; -#endif - -EV_INLINE struct ev_loop * -ev_default_loop_uc_ (void) EV_NOEXCEPT -{ - extern struct ev_loop *ev_default_loop_ptr; - - return ev_default_loop_ptr; -} - -EV_INLINE int -ev_is_default_loop (EV_P) EV_NOEXCEPT -{ - return EV_A == EV_DEFAULT_UC; -} - -/* create and destroy alternative loops that don't handle signals */ -EV_API_DECL struct ev_loop *ev_loop_new (unsigned int flags EV_CPP (= 0)) EV_NOEXCEPT; - -EV_API_DECL ev_tstamp ev_now (EV_P) EV_NOEXCEPT; /* time w.r.t. timers and the eventloop, updated after each poll */ - -#else - -EV_API_DECL int ev_default_loop (unsigned int flags EV_CPP (= 0)) EV_NOEXCEPT; /* returns true when successful */ - -EV_API_DECL ev_tstamp ev_rt_now; - -EV_INLINE ev_tstamp -ev_now (void) EV_NOEXCEPT -{ - return ev_rt_now; -} - -/* looks weird, but ev_is_default_loop (EV_A) still works if this exists */ -EV_INLINE int -ev_is_default_loop (void) EV_NOEXCEPT -{ - return 1; -} - -#endif /* multiplicity */ - -/* destroy event loops, also works for the default loop */ -EV_API_DECL void ev_loop_destroy (EV_P); - -/* this needs to be called after fork, to duplicate the loop */ -/* when you want to re-use it in the child */ -/* you can call it in either the parent or the child */ -/* you can actually call it at any time, anywhere :) */ -EV_API_DECL void ev_loop_fork (EV_P) EV_NOEXCEPT; - -EV_API_DECL unsigned int ev_backend (EV_P) EV_NOEXCEPT; /* backend in use by loop */ - -EV_API_DECL void ev_now_update (EV_P) EV_NOEXCEPT; /* update event loop time */ - -#if EV_WALK_ENABLE -/* walk (almost) all watchers in the loop of a given type, invoking the */ -/* callback on every such watcher. The callback might stop the watcher, */ -/* but do nothing else with the loop */ -EV_API_DECL void ev_walk (EV_P_ int types, void (*cb)(EV_P_ int type, void *w)) EV_NOEXCEPT; -#endif - -#endif /* prototypes */ - -/* ev_run flags values */ -enum { - EVRUN_NOWAIT = 1, /* do not block/wait */ - EVRUN_ONCE = 2 /* block *once* only */ -}; - -/* ev_break how values */ -enum { - EVBREAK_CANCEL = 0, /* undo unloop */ - EVBREAK_ONE = 1, /* unloop once */ - EVBREAK_ALL = 2 /* unloop all loops */ -}; - -#if EV_PROTOTYPES -EV_API_DECL int ev_run (EV_P_ int flags EV_CPP (= 0)); -EV_API_DECL void ev_break (EV_P_ int how EV_CPP (= EVBREAK_ONE)) EV_NOEXCEPT; /* break out of the loop */ - -/* - * ref/unref can be used to add or remove a refcount on the mainloop. every watcher - * keeps one reference. if you have a long-running watcher you never unregister that - * should not keep ev_loop from running, unref() after starting, and ref() before stopping. - */ -EV_API_DECL void ev_ref (EV_P) EV_NOEXCEPT; -EV_API_DECL void ev_unref (EV_P) EV_NOEXCEPT; - -/* - * convenience function, wait for a single event, without registering an event watcher - * if timeout is < 0, do wait indefinitely - */ -EV_API_DECL void ev_once (EV_P_ int fd, int events, ev_tstamp timeout, void (*cb)(int revents, void *arg), void *arg) EV_NOEXCEPT; - -EV_API_DECL void ev_invoke_pending (EV_P); /* invoke all pending watchers */ - -# if EV_FEATURE_API -EV_API_DECL unsigned int ev_iteration (EV_P) EV_NOEXCEPT; /* number of loop iterations */ -EV_API_DECL unsigned int ev_depth (EV_P) EV_NOEXCEPT; /* #ev_loop enters - #ev_loop leaves */ -EV_API_DECL void ev_verify (EV_P) EV_NOEXCEPT; /* abort if loop data corrupted */ - -EV_API_DECL void ev_set_io_collect_interval (EV_P_ ev_tstamp interval) EV_NOEXCEPT; /* sleep at least this time, default 0 */ -EV_API_DECL void ev_set_timeout_collect_interval (EV_P_ ev_tstamp interval) EV_NOEXCEPT; /* sleep at least this time, default 0 */ - -/* advanced stuff for threading etc. support, see docs */ -EV_API_DECL void ev_set_userdata (EV_P_ void *data) EV_NOEXCEPT; -EV_API_DECL void *ev_userdata (EV_P) EV_NOEXCEPT; -typedef void (*ev_loop_callback)(EV_P); -EV_API_DECL void ev_set_invoke_pending_cb (EV_P_ ev_loop_callback invoke_pending_cb) EV_NOEXCEPT; -/* C++ doesn't allow the use of the ev_loop_callback typedef here, so we need to spell it out */ -EV_API_DECL void ev_set_loop_release_cb (EV_P_ void (*release)(EV_P) EV_NOEXCEPT, void (*acquire)(EV_P) EV_NOEXCEPT) EV_NOEXCEPT; - -EV_API_DECL unsigned int ev_pending_count (EV_P) EV_NOEXCEPT; /* number of pending events, if any */ - -/* - * stop/start the timer handling. - */ -EV_API_DECL void ev_suspend (EV_P) EV_NOEXCEPT; -EV_API_DECL void ev_resume (EV_P) EV_NOEXCEPT; -#endif - -#endif - -/* these may evaluate ev multiple times, and the other arguments at most once */ -/* either use ev_init + ev_TYPE_set, or the ev_TYPE_init macro, below, to first initialise a watcher */ -#define ev_init(ev,cb_) do { \ - ((ev_watcher *)(void *)(ev))->active = \ - ((ev_watcher *)(void *)(ev))->pending = 0; \ - ev_set_priority ((ev), 0); \ - ev_set_cb ((ev), cb_); \ -} while (0) - -#define ev_io_modify(ev,events_) do { (ev)->events = (ev)->events & EV__IOFDSET | (events_); } while (0) -#define ev_io_set(ev,fd_,events_) do { (ev)->fd = (fd_); (ev)->events = (events_) | EV__IOFDSET; } while (0) -#define ev_timer_set(ev,after_,repeat_) do { ((ev_watcher_time *)(ev))->at = (after_); (ev)->repeat = (repeat_); } while (0) -#define ev_periodic_set(ev,ofs_,ival_,rcb_) do { (ev)->offset = (ofs_); (ev)->interval = (ival_); (ev)->reschedule_cb = (rcb_); } while (0) -#define ev_signal_set(ev,signum_) do { (ev)->signum = (signum_); } while (0) -#define ev_child_set(ev,pid_,trace_) do { (ev)->pid = (pid_); (ev)->flags = !!(trace_); } while (0) -#define ev_stat_set(ev,path_,interval_) do { (ev)->path = (path_); (ev)->interval = (interval_); (ev)->wd = -2; } while (0) -#define ev_idle_set(ev) /* nop, yes, this is a serious in-joke */ -#define ev_prepare_set(ev) /* nop, yes, this is a serious in-joke */ -#define ev_check_set(ev) /* nop, yes, this is a serious in-joke */ -#define ev_embed_set(ev,other_) do { (ev)->other = (other_); } while (0) -#define ev_fork_set(ev) /* nop, yes, this is a serious in-joke */ -#define ev_cleanup_set(ev) /* nop, yes, this is a serious in-joke */ -#define ev_async_set(ev) /* nop, yes, this is a serious in-joke */ - -#define ev_io_init(ev,cb,fd,events) do { ev_init ((ev), (cb)); ev_io_set ((ev),(fd),(events)); } while (0) -#define ev_timer_init(ev,cb,after,repeat) do { ev_init ((ev), (cb)); ev_timer_set ((ev),(after),(repeat)); } while (0) -#define ev_periodic_init(ev,cb,ofs,ival,rcb) do { ev_init ((ev), (cb)); ev_periodic_set ((ev),(ofs),(ival),(rcb)); } while (0) -#define ev_signal_init(ev,cb,signum) do { ev_init ((ev), (cb)); ev_signal_set ((ev), (signum)); } while (0) -#define ev_child_init(ev,cb,pid,trace) do { ev_init ((ev), (cb)); ev_child_set ((ev),(pid),(trace)); } while (0) -#define ev_stat_init(ev,cb,path,interval) do { ev_init ((ev), (cb)); ev_stat_set ((ev),(path),(interval)); } while (0) -#define ev_idle_init(ev,cb) do { ev_init ((ev), (cb)); ev_idle_set ((ev)); } while (0) -#define ev_prepare_init(ev,cb) do { ev_init ((ev), (cb)); ev_prepare_set ((ev)); } while (0) -#define ev_check_init(ev,cb) do { ev_init ((ev), (cb)); ev_check_set ((ev)); } while (0) -#define ev_embed_init(ev,cb,other) do { ev_init ((ev), (cb)); ev_embed_set ((ev),(other)); } while (0) -#define ev_fork_init(ev,cb) do { ev_init ((ev), (cb)); ev_fork_set ((ev)); } while (0) -#define ev_cleanup_init(ev,cb) do { ev_init ((ev), (cb)); ev_cleanup_set ((ev)); } while (0) -#define ev_async_init(ev,cb) do { ev_init ((ev), (cb)); ev_async_set ((ev)); } while (0) - -#define ev_is_pending(ev) (0 + ((ev_watcher *)(void *)(ev))->pending) /* ro, true when watcher is waiting for callback invocation */ -#define ev_is_active(ev) (0 + ((ev_watcher *)(void *)(ev))->active) /* ro, true when the watcher has been started */ - -#define ev_cb_(ev) (ev)->cb /* rw */ -#define ev_cb(ev) (memmove (&ev_cb_ (ev), &((ev_watcher *)(ev))->cb, sizeof (ev_cb_ (ev))), (ev)->cb) - -#if EV_MINPRI == EV_MAXPRI -# define ev_priority(ev) ((ev), EV_MINPRI) -# define ev_set_priority(ev,pri) ((ev), (pri)) -#else -# define ev_priority(ev) (+(((ev_watcher *)(void *)(ev))->priority)) -# define ev_set_priority(ev,pri) ( (ev_watcher *)(void *)(ev))->priority = (pri) -#endif - -#define ev_periodic_at(ev) (+((ev_watcher_time *)(ev))->at) - -#ifndef ev_set_cb -/* memmove is used here to avoid strict aliasing violations, and hopefully is optimized out by any reasonable compiler */ -# define ev_set_cb(ev,cb_) (ev_cb_ (ev) = (cb_), memmove (&((ev_watcher *)(ev))->cb, &ev_cb_ (ev), sizeof (ev_cb_ (ev)))) -#endif - -/* stopping (enabling, adding) a watcher does nothing if it is already running */ -/* stopping (disabling, deleting) a watcher does nothing unless it's already running */ -#if EV_PROTOTYPES - -/* feeds an event into a watcher as if the event actually occurred */ -/* accepts any ev_watcher type */ -EV_API_DECL void ev_feed_event (EV_P_ void *w, int revents) EV_NOEXCEPT; -EV_API_DECL void ev_feed_fd_event (EV_P_ int fd, int revents) EV_NOEXCEPT; -#if EV_SIGNAL_ENABLE -EV_API_DECL void ev_feed_signal (int signum) EV_NOEXCEPT; -EV_API_DECL void ev_feed_signal_event (EV_P_ int signum) EV_NOEXCEPT; -#endif -EV_API_DECL void ev_invoke (EV_P_ void *w, int revents); -EV_API_DECL int ev_clear_pending (EV_P_ void *w) EV_NOEXCEPT; - -EV_API_DECL void ev_io_start (EV_P_ ev_io *w) EV_NOEXCEPT; -EV_API_DECL void ev_io_stop (EV_P_ ev_io *w) EV_NOEXCEPT; - -EV_API_DECL void ev_timer_start (EV_P_ ev_timer *w) EV_NOEXCEPT; -EV_API_DECL void ev_timer_stop (EV_P_ ev_timer *w) EV_NOEXCEPT; -/* stops if active and no repeat, restarts if active and repeating, starts if inactive and repeating */ -EV_API_DECL void ev_timer_again (EV_P_ ev_timer *w) EV_NOEXCEPT; -/* return remaining time */ -EV_API_DECL ev_tstamp ev_timer_remaining (EV_P_ ev_timer *w) EV_NOEXCEPT; - -#if EV_PERIODIC_ENABLE -EV_API_DECL void ev_periodic_start (EV_P_ ev_periodic *w) EV_NOEXCEPT; -EV_API_DECL void ev_periodic_stop (EV_P_ ev_periodic *w) EV_NOEXCEPT; -EV_API_DECL void ev_periodic_again (EV_P_ ev_periodic *w) EV_NOEXCEPT; -#endif - -/* only supported in the default loop */ -#if EV_SIGNAL_ENABLE -EV_API_DECL void ev_signal_start (EV_P_ ev_signal *w) EV_NOEXCEPT; -EV_API_DECL void ev_signal_stop (EV_P_ ev_signal *w) EV_NOEXCEPT; -#endif - -/* only supported in the default loop */ -# if EV_CHILD_ENABLE -EV_API_DECL void ev_child_start (EV_P_ ev_child *w) EV_NOEXCEPT; -EV_API_DECL void ev_child_stop (EV_P_ ev_child *w) EV_NOEXCEPT; -# endif - -# if EV_STAT_ENABLE -EV_API_DECL void ev_stat_start (EV_P_ ev_stat *w) EV_NOEXCEPT; -EV_API_DECL void ev_stat_stop (EV_P_ ev_stat *w) EV_NOEXCEPT; -EV_API_DECL void ev_stat_stat (EV_P_ ev_stat *w) EV_NOEXCEPT; -# endif - -# if EV_IDLE_ENABLE -EV_API_DECL void ev_idle_start (EV_P_ ev_idle *w) EV_NOEXCEPT; -EV_API_DECL void ev_idle_stop (EV_P_ ev_idle *w) EV_NOEXCEPT; -# endif - -#if EV_PREPARE_ENABLE -EV_API_DECL void ev_prepare_start (EV_P_ ev_prepare *w) EV_NOEXCEPT; -EV_API_DECL void ev_prepare_stop (EV_P_ ev_prepare *w) EV_NOEXCEPT; -#endif - -#if EV_CHECK_ENABLE -EV_API_DECL void ev_check_start (EV_P_ ev_check *w) EV_NOEXCEPT; -EV_API_DECL void ev_check_stop (EV_P_ ev_check *w) EV_NOEXCEPT; -#endif - -# if EV_FORK_ENABLE -EV_API_DECL void ev_fork_start (EV_P_ ev_fork *w) EV_NOEXCEPT; -EV_API_DECL void ev_fork_stop (EV_P_ ev_fork *w) EV_NOEXCEPT; -# endif - -# if EV_CLEANUP_ENABLE -EV_API_DECL void ev_cleanup_start (EV_P_ ev_cleanup *w) EV_NOEXCEPT; -EV_API_DECL void ev_cleanup_stop (EV_P_ ev_cleanup *w) EV_NOEXCEPT; -# endif - -# if EV_EMBED_ENABLE -/* only supported when loop to be embedded is in fact embeddable */ -EV_API_DECL void ev_embed_start (EV_P_ ev_embed *w) EV_NOEXCEPT; -EV_API_DECL void ev_embed_stop (EV_P_ ev_embed *w) EV_NOEXCEPT; -EV_API_DECL void ev_embed_sweep (EV_P_ ev_embed *w) EV_NOEXCEPT; -# endif - -# if EV_ASYNC_ENABLE -EV_API_DECL void ev_async_start (EV_P_ ev_async *w) EV_NOEXCEPT; -EV_API_DECL void ev_async_stop (EV_P_ ev_async *w) EV_NOEXCEPT; -EV_API_DECL void ev_async_send (EV_P_ ev_async *w) EV_NOEXCEPT; -# endif - -#if EV_COMPAT3 - #define EVLOOP_NONBLOCK EVRUN_NOWAIT - #define EVLOOP_ONESHOT EVRUN_ONCE - #define EVUNLOOP_CANCEL EVBREAK_CANCEL - #define EVUNLOOP_ONE EVBREAK_ONE - #define EVUNLOOP_ALL EVBREAK_ALL - #if EV_PROTOTYPES - EV_INLINE void ev_loop (EV_P_ int flags) { ev_run (EV_A_ flags); } - EV_INLINE void ev_unloop (EV_P_ int how ) { ev_break (EV_A_ how ); } - EV_INLINE void ev_default_destroy (void) { ev_loop_destroy (EV_DEFAULT); } - EV_INLINE void ev_default_fork (void) { ev_loop_fork (EV_DEFAULT); } - #if EV_FEATURE_API - EV_INLINE unsigned int ev_loop_count (EV_P) { return ev_iteration (EV_A); } - EV_INLINE unsigned int ev_loop_depth (EV_P) { return ev_depth (EV_A); } - EV_INLINE void ev_loop_verify (EV_P) { ev_verify (EV_A); } - #endif - #endif -#else - typedef struct ev_loop ev_loop; -#endif - -#endif - -EV_CPP(}) - -#endif - diff --git a/client/3rd/ShadowSocks/ShadowSocks/libev/armv7/include/event.h b/client/3rd/ShadowSocks/ShadowSocks/libev/armv7/include/event.h deleted file mode 100644 index aa81928f..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libev/armv7/include/event.h +++ /dev/null @@ -1,177 +0,0 @@ -/* - * libevent compatibility header, only core events supported - * - * Copyright (c) 2007,2008,2010,2012 Marc Alexander Lehmann - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modifica- - * tion, 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. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MER- - * CHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO - * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPE- - * CIAL, 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 OTH- - * ERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - * OF THE POSSIBILITY OF SUCH DAMAGE. - * - * Alternatively, the contents of this file may be used under the terms of - * the GNU General Public License ("GPL") version 2 or any later version, - * in which case the provisions of the GPL are applicable instead of - * the above. If you wish to allow the use of your version of this file - * only under the terms of the GPL and not to allow others to use your - * version of this file under the BSD license, indicate your decision - * by deleting the provisions above and replace them with the notice - * and other provisions required by the GPL. If you do not delete the - * provisions above, a recipient may use your version of this file under - * either the BSD or the GPL. - */ - -#ifndef EVENT_H_ -#define EVENT_H_ - -#ifdef EV_H -# include EV_H -#else -# include "ev.h" -#endif - -#ifndef EVLOOP_NONBLOCK -# define EVLOOP_NONBLOCK EVRUN_NOWAIT -#endif -#ifndef EVLOOP_ONESHOT -# define EVLOOP_ONESHOT EVRUN_ONCE -#endif -#ifndef EV_TIMEOUT -# define EV_TIMEOUT EV_TIMER -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -/* we need sys/time.h for struct timeval only */ -#if !defined (WIN32) || defined (__MINGW32__) -# include /* mingw seems to need this, for whatever reason */ -# include -#endif - -struct event_base; - -#define EVLIST_TIMEOUT 0x01 -#define EVLIST_INSERTED 0x02 -#define EVLIST_SIGNAL 0x04 -#define EVLIST_ACTIVE 0x08 -#define EVLIST_INTERNAL 0x10 -#define EVLIST_INIT 0x80 - -typedef void (*event_callback_fn)(int, short, void *); - -struct event -{ - /* libev watchers we map onto */ - union { - struct ev_io io; - struct ev_signal sig; - } iosig; - struct ev_timer to; - - /* compatibility slots */ - struct event_base *ev_base; - event_callback_fn ev_callback; - void *ev_arg; - int ev_fd; - int ev_pri; - int ev_res; - int ev_flags; - short ev_events; -}; - -event_callback_fn event_get_callback (const struct event *ev); - -#define EV_READ EV_READ -#define EV_WRITE EV_WRITE -#define EV_PERSIST 0x10 -#define EV_ET 0x20 /* nop */ - -#define EVENT_SIGNAL(ev) ((int) (ev)->ev_fd) -#define EVENT_FD(ev) ((int) (ev)->ev_fd) - -#define event_initialized(ev) ((ev)->ev_flags & EVLIST_INIT) - -#define evtimer_add(ev,tv) event_add (ev, tv) -#define evtimer_set(ev,cb,data) event_set (ev, -1, 0, cb, data) -#define evtimer_del(ev) event_del (ev) -#define evtimer_pending(ev,tv) event_pending (ev, EV_TIMEOUT, tv) -#define evtimer_initialized(ev) event_initialized (ev) - -#define timeout_add(ev,tv) evtimer_add (ev, tv) -#define timeout_set(ev,cb,data) evtimer_set (ev, cb, data) -#define timeout_del(ev) evtimer_del (ev) -#define timeout_pending(ev,tv) evtimer_pending (ev, tv) -#define timeout_initialized(ev) evtimer_initialized (ev) - -#define signal_add(ev,tv) event_add (ev, tv) -#define signal_set(ev,sig,cb,data) event_set (ev, sig, EV_SIGNAL | EV_PERSIST, cb, data) -#define signal_del(ev) event_del (ev) -#define signal_pending(ev,tv) event_pending (ev, EV_SIGNAL, tv) -#define signal_initialized(ev) event_initialized (ev) - -const char *event_get_version (void); -const char *event_get_method (void); - -void *event_init (void); -void event_base_free (struct event_base *base); - -#define EVLOOP_ONCE EVLOOP_ONESHOT -int event_loop (int); -int event_loopexit (struct timeval *tv); -int event_dispatch (void); - -#define _EVENT_LOG_DEBUG 0 -#define _EVENT_LOG_MSG 1 -#define _EVENT_LOG_WARN 2 -#define _EVENT_LOG_ERR 3 -typedef void (*event_log_cb)(int severity, const char *msg); -void event_set_log_callback(event_log_cb cb); - -void event_set (struct event *ev, int fd, short events, void (*cb)(int, short, void *), void *arg); -int event_once (int fd, short events, void (*cb)(int, short, void *), void *arg, struct timeval *tv); - -int event_add (struct event *ev, struct timeval *tv); -int event_del (struct event *ev); -void event_active (struct event *ev, int res, short ncalls); /* ncalls is being ignored */ - -int event_pending (struct event *ev, short, struct timeval *tv); - -int event_priority_init (int npri); -int event_priority_set (struct event *ev, int pri); - -struct event_base *event_base_new (void); -const char *event_base_get_method (const struct event_base *); -int event_base_set (struct event_base *base, struct event *ev); -int event_base_loop (struct event_base *base, int); -int event_base_loopexit (struct event_base *base, struct timeval *tv); -int event_base_dispatch (struct event_base *base); -int event_base_once (struct event_base *base, int fd, short events, void (*cb)(int, short, void *), void *arg, struct timeval *tv); -int event_base_priority_init (struct event_base *base, int fd); - -/* next line is different in the libevent+libev version */ -/*libevent-include*/ - -#ifdef __cplusplus -} -#endif - -#endif - diff --git a/client/3rd/ShadowSocks/ShadowSocks/libev/armv7/lib/libev.a b/client/3rd/ShadowSocks/ShadowSocks/libev/armv7/lib/libev.a deleted file mode 100644 index 075d48857f98b8386bbbc4099562e245ebe98929..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 37192 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 diff --git a/client/3rd/ShadowSocks/ShadowSocks/libev/armv7/lib/libev.la b/client/3rd/ShadowSocks/ShadowSocks/libev/armv7/lib/libev.la deleted file mode 100755 index d1e8d01a..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libev/armv7/lib/libev.la +++ /dev/null @@ -1,41 +0,0 @@ -# libev.la - a libtool library file -# Generated by libtool (GNU libtool) 2.4.6 Debian-2.4.6-9 -# -# Please DO NOT delete this file! -# It is necessary for linking the library. - -# The name that we can dlopen(3). -dlname='' - -# Names of this library. -library_names='' - -# The name of the static archive. -old_library='libev.a' - -# Linker flags that cannot go in dependency_libs. -inherited_linker_flags=' ' - -# Libraries that this one depends upon. -dependency_libs=' -L/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS15.2.sdk/usr/lib' - -# Names of additional weak libraries provided by this library -weak_library_names='' - -# Version information for libev. -current=4 -age=0 -revision=0 - -# Is this an already installed library? -installed=yes - -# Should we warn about portability when linking against -modules? -shouldnotlink=no - -# Files to dlopen/dlpreopen -dlopen='' -dlpreopen='' - -# Directory that this library needs to be installed in: -libdir='/Users/sanchez/work/vied/ios/vpn/playground/ss-libev-build/ShadowSocks-libev-iOS/ShadowSocks-libev-iOS/libev/libev/armv7/lib' diff --git a/client/3rd/ShadowSocks/ShadowSocks/libev/armv7/share/man/man3/ev.3 b/client/3rd/ShadowSocks/ShadowSocks/libev/armv7/share/man/man3/ev.3 deleted file mode 100644 index af578f0b..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libev/armv7/share/man/man3/ev.3 +++ /dev/null @@ -1,5819 +0,0 @@ -.\" Automatically generated by Pod::Man 4.11 (Pod::Simple 3.35) -.\" -.\" Standard preamble: -.\" ======================================================================== -.de Sp \" Vertical space (when we can't use .PP) -.if t .sp .5v -.if n .sp -.. -.de Vb \" Begin verbatim text -.ft CW -.nf -.ne \\$1 -.. -.de Ve \" End verbatim text -.ft R -.fi -.. -.\" Set up some character translations and predefined strings. \*(-- will -.\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left -.\" double quote, and \*(R" will give a right double quote. \*(C+ will -.\" give a nicer C++. Capital omega is used to do unbreakable dashes and -.\" therefore won't be available. \*(C` and \*(C' expand to `' in nroff, -.\" nothing in troff, for use with C<>. -.tr \(*W- -.ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p' -.ie n \{\ -. ds -- \(*W- -. ds PI pi -. if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch -. if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch -. ds L" "" -. ds R" "" -. ds C` "" -. ds C' "" -'br\} -.el\{\ -. ds -- \|\(em\| -. ds PI \(*p -. ds L" `` -. ds R" '' -. ds C` -. ds C' -'br\} -.\" -.\" Escape single quotes in literal strings from groff's Unicode transform. -.ie \n(.g .ds Aq \(aq -.el .ds Aq ' -.\" -.\" If the F register is >0, we'll generate index entries on stderr for -.\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index -.\" entries marked with X<> in POD. Of course, you'll have to process the -.\" output yourself in some meaningful fashion. -.\" -.\" Avoid warning from groff about undefined register 'F'. -.de IX -.. -.nr rF 0 -.if \n(.g .if rF .nr rF 1 -.if (\n(rF:(\n(.g==0)) \{\ -. if \nF \{\ -. de IX -. tm Index:\\$1\t\\n%\t"\\$2" -.. -. if !\nF==2 \{\ -. nr % 0 -. nr F 2 -. \} -. \} -.\} -.rr rF -.\" -.\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2). -.\" Fear. Run. Save yourself. No user-serviceable parts. -. \" fudge factors for nroff and troff -.if n \{\ -. ds #H 0 -. ds #V .8m -. ds #F .3m -. ds #[ \f1 -. ds #] \fP -.\} -.if t \{\ -. ds #H ((1u-(\\\\n(.fu%2u))*.13m) -. ds #V .6m -. ds #F 0 -. ds #[ \& -. ds #] \& -.\} -. \" simple accents for nroff and troff -.if n \{\ -. ds ' \& -. ds ` \& -. ds ^ \& -. ds , \& -. ds ~ ~ -. ds / -.\} -.if t \{\ -. ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u" -. ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u' -. ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u' -. ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u' -. ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u' -. ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u' -.\} -. \" troff and (daisy-wheel) nroff accents -.ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V' -.ds 8 \h'\*(#H'\(*b\h'-\*(#H' -.ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#] -.ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H' -.ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u' -.ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#] -.ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#] -.ds ae a\h'-(\w'a'u*4/10)'e -.ds Ae A\h'-(\w'A'u*4/10)'E -. \" corrections for vroff -.if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u' -.if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u' -. \" for low resolution devices (crt and lpr) -.if \n(.H>23 .if \n(.V>19 \ -\{\ -. ds : e -. ds 8 ss -. ds o a -. ds d- d\h'-1'\(ga -. ds D- D\h'-1'\(hy -. ds th \o'bp' -. ds Th \o'LP' -. ds ae ae -. ds Ae AE -.\} -.rm #[ #] #H #V #F C -.\" ======================================================================== -.\" -.IX Title "LIBEV 3" -.TH LIBEV 3 "2020-03-12" "libev-4.31" "libev - high performance full featured event loop" -.\" For nroff, turn off justification. Always turn off hyphenation; it makes -.\" way too many mistakes in technical documents. -.if n .ad l -.nh -.SH "NAME" -libev \- a high performance full\-featured event loop written in C -.SH "SYNOPSIS" -.IX Header "SYNOPSIS" -.Vb 1 -\& #include -.Ve -.SS "\s-1EXAMPLE PROGRAM\s0" -.IX Subsection "EXAMPLE PROGRAM" -.Vb 2 -\& // a single header file is required -\& #include -\& -\& #include // for puts -\& -\& // every watcher type has its own typedef\*(Aqd struct -\& // with the name ev_TYPE -\& ev_io stdin_watcher; -\& ev_timer timeout_watcher; -\& -\& // all watcher callbacks have a similar signature -\& // this callback is called when data is readable on stdin -\& static void -\& stdin_cb (EV_P_ ev_io *w, int revents) -\& { -\& puts ("stdin ready"); -\& // for one\-shot events, one must manually stop the watcher -\& // with its corresponding stop function. -\& ev_io_stop (EV_A_ w); -\& -\& // this causes all nested ev_run\*(Aqs to stop iterating -\& ev_break (EV_A_ EVBREAK_ALL); -\& } -\& -\& // another callback, this time for a time\-out -\& static void -\& timeout_cb (EV_P_ ev_timer *w, int revents) -\& { -\& puts ("timeout"); -\& // this causes the innermost ev_run to stop iterating -\& ev_break (EV_A_ EVBREAK_ONE); -\& } -\& -\& int -\& main (void) -\& { -\& // use the default event loop unless you have special needs -\& struct ev_loop *loop = EV_DEFAULT; -\& -\& // initialise an io watcher, then start it -\& // this one will watch for stdin to become readable -\& ev_io_init (&stdin_watcher, stdin_cb, /*STDIN_FILENO*/ 0, EV_READ); -\& ev_io_start (loop, &stdin_watcher); -\& -\& // initialise a timer watcher, then start it -\& // simple non\-repeating 5.5 second timeout -\& ev_timer_init (&timeout_watcher, timeout_cb, 5.5, 0.); -\& ev_timer_start (loop, &timeout_watcher); -\& -\& // now wait for events to arrive -\& ev_run (loop, 0); -\& -\& // break was called, so exit -\& return 0; -\& } -.Ve -.SH "ABOUT THIS DOCUMENT" -.IX Header "ABOUT THIS DOCUMENT" -This document documents the libev software package. -.PP -The newest version of this document is also available as an html-formatted -web page you might find easier to navigate when reading it for the first -time: . -.PP -While this document tries to be as complete as possible in documenting -libev, its usage and the rationale behind its design, it is not a tutorial -on event-based programming, nor will it introduce event-based programming -with libev. -.PP -Familiarity with event based programming techniques in general is assumed -throughout this document. -.SH "WHAT TO READ WHEN IN A HURRY" -.IX Header "WHAT TO READ WHEN IN A HURRY" -This manual tries to be very detailed, but unfortunately, this also makes -it very long. If you just want to know the basics of libev, I suggest -reading \*(L"\s-1ANATOMY OF A WATCHER\*(R"\s0, then the \*(L"\s-1EXAMPLE PROGRAM\*(R"\s0 above and -look up the missing functions in \*(L"\s-1GLOBAL FUNCTIONS\*(R"\s0 and the \f(CW\*(C`ev_io\*(C'\fR and -\&\f(CW\*(C`ev_timer\*(C'\fR sections in \*(L"\s-1WATCHER TYPES\*(R"\s0. -.SH "ABOUT LIBEV" -.IX Header "ABOUT LIBEV" -Libev is an event loop: you register interest in certain events (such as a -file descriptor being readable or a timeout occurring), and it will manage -these event sources and provide your program with events. -.PP -To do this, it must take more or less complete control over your process -(or thread) by executing the \fIevent loop\fR handler, and will then -communicate events via a callback mechanism. -.PP -You register interest in certain events by registering so-called \fIevent -watchers\fR, which are relatively small C structures you initialise with the -details of the event, and then hand it over to libev by \fIstarting\fR the -watcher. -.SS "\s-1FEATURES\s0" -.IX Subsection "FEATURES" -Libev supports \f(CW\*(C`select\*(C'\fR, \f(CW\*(C`poll\*(C'\fR, the Linux-specific aio and \f(CW\*(C`epoll\*(C'\fR -interfaces, the BSD-specific \f(CW\*(C`kqueue\*(C'\fR and the Solaris-specific event port -mechanisms for file descriptor events (\f(CW\*(C`ev_io\*(C'\fR), the Linux \f(CW\*(C`inotify\*(C'\fR -interface (for \f(CW\*(C`ev_stat\*(C'\fR), Linux eventfd/signalfd (for faster and cleaner -inter-thread wakeup (\f(CW\*(C`ev_async\*(C'\fR)/signal handling (\f(CW\*(C`ev_signal\*(C'\fR)) relative -timers (\f(CW\*(C`ev_timer\*(C'\fR), absolute timers with customised rescheduling -(\f(CW\*(C`ev_periodic\*(C'\fR), synchronous signals (\f(CW\*(C`ev_signal\*(C'\fR), process status -change events (\f(CW\*(C`ev_child\*(C'\fR), and event watchers dealing with the event -loop mechanism itself (\f(CW\*(C`ev_idle\*(C'\fR, \f(CW\*(C`ev_embed\*(C'\fR, \f(CW\*(C`ev_prepare\*(C'\fR and -\&\f(CW\*(C`ev_check\*(C'\fR watchers) as well as file watchers (\f(CW\*(C`ev_stat\*(C'\fR) and even -limited support for fork events (\f(CW\*(C`ev_fork\*(C'\fR). -.PP -It also is quite fast (see this -benchmark comparing it to libevent -for example). -.SS "\s-1CONVENTIONS\s0" -.IX Subsection "CONVENTIONS" -Libev is very configurable. In this manual the default (and most common) -configuration will be described, which supports multiple event loops. For -more info about various configuration options please have a look at -\&\fB\s-1EMBED\s0\fR section in this manual. If libev was configured without support -for multiple event loops, then all functions taking an initial argument of -name \f(CW\*(C`loop\*(C'\fR (which is always of type \f(CW\*(C`struct ev_loop *\*(C'\fR) will not have -this argument. -.SS "\s-1TIME REPRESENTATION\s0" -.IX Subsection "TIME REPRESENTATION" -Libev represents time as a single floating point number, representing -the (fractional) number of seconds since the (\s-1POSIX\s0) epoch (in practice -somewhere near the beginning of 1970, details are complicated, don't -ask). This type is called \f(CW\*(C`ev_tstamp\*(C'\fR, which is what you should use -too. It usually aliases to the \f(CW\*(C`double\*(C'\fR type in C. When you need to do -any calculations on it, you should treat it as some floating point value. -.PP -Unlike the name component \f(CW\*(C`stamp\*(C'\fR might indicate, it is also used for -time differences (e.g. delays) throughout libev. -.SH "ERROR HANDLING" -.IX Header "ERROR HANDLING" -Libev knows three classes of errors: operating system errors, usage errors -and internal errors (bugs). -.PP -When libev catches an operating system error it cannot handle (for example -a system call indicating a condition libev cannot fix), it calls the callback -set via \f(CW\*(C`ev_set_syserr_cb\*(C'\fR, which is supposed to fix the problem or -abort. The default is to print a diagnostic message and to call \f(CW\*(C`abort -()\*(C'\fR. -.PP -When libev detects a usage error such as a negative timer interval, then -it will print a diagnostic message and abort (via the \f(CW\*(C`assert\*(C'\fR mechanism, -so \f(CW\*(C`NDEBUG\*(C'\fR will disable this checking): these are programming errors in -the libev caller and need to be fixed there. -.PP -Via the \f(CW\*(C`EV_FREQUENT\*(C'\fR macro you can compile in and/or enable extensive -consistency checking code inside libev that can be used to check for -internal inconsistencies, suually caused by application bugs. -.PP -Libev also has a few internal error-checking \f(CW\*(C`assert\*(C'\fRions. These do not -trigger under normal circumstances, as they indicate either a bug in libev -or worse. -.SH "GLOBAL FUNCTIONS" -.IX Header "GLOBAL FUNCTIONS" -These functions can be called anytime, even before initialising the -library in any way. -.IP "ev_tstamp ev_time ()" 4 -.IX Item "ev_tstamp ev_time ()" -Returns the current time as libev would use it. Please note that the -\&\f(CW\*(C`ev_now\*(C'\fR function is usually faster and also often returns the timestamp -you actually want to know. Also interesting is the combination of -\&\f(CW\*(C`ev_now_update\*(C'\fR and \f(CW\*(C`ev_now\*(C'\fR. -.IP "ev_sleep (ev_tstamp interval)" 4 -.IX Item "ev_sleep (ev_tstamp interval)" -Sleep for the given interval: The current thread will be blocked -until either it is interrupted or the given time interval has -passed (approximately \- it might return a bit earlier even if not -interrupted). Returns immediately if \f(CW\*(C`interval <= 0\*(C'\fR. -.Sp -Basically this is a sub-second-resolution \f(CW\*(C`sleep ()\*(C'\fR. -.Sp -The range of the \f(CW\*(C`interval\*(C'\fR is limited \- libev only guarantees to work -with sleep times of up to one day (\f(CW\*(C`interval <= 86400\*(C'\fR). -.IP "int ev_version_major ()" 4 -.IX Item "int ev_version_major ()" -.PD 0 -.IP "int ev_version_minor ()" 4 -.IX Item "int ev_version_minor ()" -.PD -You can find out the major and minor \s-1ABI\s0 version numbers of the library -you linked against by calling the functions \f(CW\*(C`ev_version_major\*(C'\fR and -\&\f(CW\*(C`ev_version_minor\*(C'\fR. If you want, you can compare against the global -symbols \f(CW\*(C`EV_VERSION_MAJOR\*(C'\fR and \f(CW\*(C`EV_VERSION_MINOR\*(C'\fR, which specify the -version of the library your program was compiled against. -.Sp -These version numbers refer to the \s-1ABI\s0 version of the library, not the -release version. -.Sp -Usually, it's a good idea to terminate if the major versions mismatch, -as this indicates an incompatible change. Minor versions are usually -compatible to older versions, so a larger minor version alone is usually -not a problem. -.Sp -Example: Make sure we haven't accidentally been linked against the wrong -version (note, however, that this will not detect other \s-1ABI\s0 mismatches, -such as \s-1LFS\s0 or reentrancy). -.Sp -.Vb 3 -\& assert (("libev version mismatch", -\& ev_version_major () == EV_VERSION_MAJOR -\& && ev_version_minor () >= EV_VERSION_MINOR)); -.Ve -.IP "unsigned int ev_supported_backends ()" 4 -.IX Item "unsigned int ev_supported_backends ()" -Return the set of all backends (i.e. their corresponding \f(CW\*(C`EV_BACKEND_*\*(C'\fR -value) compiled into this binary of libev (independent of their -availability on the system you are running on). See \f(CW\*(C`ev_default_loop\*(C'\fR for -a description of the set values. -.Sp -Example: make sure we have the epoll method, because yeah this is cool and -a must have and can we have a torrent of it please!!!11 -.Sp -.Vb 2 -\& assert (("sorry, no epoll, no sex", -\& ev_supported_backends () & EVBACKEND_EPOLL)); -.Ve -.IP "unsigned int ev_recommended_backends ()" 4 -.IX Item "unsigned int ev_recommended_backends ()" -Return the set of all backends compiled into this binary of libev and -also recommended for this platform, meaning it will work for most file -descriptor types. This set is often smaller than the one returned by -\&\f(CW\*(C`ev_supported_backends\*(C'\fR, as for example kqueue is broken on most BSDs -and will not be auto-detected unless you explicitly request it (assuming -you know what you are doing). This is the set of backends that libev will -probe for if you specify no backends explicitly. -.IP "unsigned int ev_embeddable_backends ()" 4 -.IX Item "unsigned int ev_embeddable_backends ()" -Returns the set of backends that are embeddable in other event loops. This -value is platform-specific but can include backends not available on the -current system. To find which embeddable backends might be supported on -the current system, you would need to look at \f(CW\*(C`ev_embeddable_backends () -& ev_supported_backends ()\*(C'\fR, likewise for recommended ones. -.Sp -See the description of \f(CW\*(C`ev_embed\*(C'\fR watchers for more info. -.IP "ev_set_allocator (void *(*cb)(void *ptr, long size) throw ())" 4 -.IX Item "ev_set_allocator (void *(*cb)(void *ptr, long size) throw ())" -Sets the allocation function to use (the prototype is similar \- the -semantics are identical to the \f(CW\*(C`realloc\*(C'\fR C89/SuS/POSIX function). It is -used to allocate and free memory (no surprises here). If it returns zero -when memory needs to be allocated (\f(CW\*(C`size != 0\*(C'\fR), the library might abort -or take some potentially destructive action. -.Sp -Since some systems (at least OpenBSD and Darwin) fail to implement -correct \f(CW\*(C`realloc\*(C'\fR semantics, libev will use a wrapper around the system -\&\f(CW\*(C`realloc\*(C'\fR and \f(CW\*(C`free\*(C'\fR functions by default. -.Sp -You could override this function in high-availability programs to, say, -free some memory if it cannot allocate memory, to use a special allocator, -or even to sleep a while and retry until some memory is available. -.Sp -Example: The following is the \f(CW\*(C`realloc\*(C'\fR function that libev itself uses -which should work with \f(CW\*(C`realloc\*(C'\fR and \f(CW\*(C`free\*(C'\fR functions of all kinds and -is probably a good basis for your own implementation. -.Sp -.Vb 5 -\& static void * -\& ev_realloc_emul (void *ptr, long size) EV_NOEXCEPT -\& { -\& if (size) -\& return realloc (ptr, size); -\& -\& free (ptr); -\& return 0; -\& } -.Ve -.Sp -Example: Replace the libev allocator with one that waits a bit and then -retries. -.Sp -.Vb 8 -\& static void * -\& persistent_realloc (void *ptr, size_t size) -\& { -\& if (!size) -\& { -\& free (ptr); -\& return 0; -\& } -\& -\& for (;;) -\& { -\& void *newptr = realloc (ptr, size); -\& -\& if (newptr) -\& return newptr; -\& -\& sleep (60); -\& } -\& } -\& -\& ... -\& ev_set_allocator (persistent_realloc); -.Ve -.IP "ev_set_syserr_cb (void (*cb)(const char *msg) throw ())" 4 -.IX Item "ev_set_syserr_cb (void (*cb)(const char *msg) throw ())" -Set the callback function to call on a retryable system call error (such -as failed select, poll, epoll_wait). The message is a printable string -indicating the system call or subsystem causing the problem. If this -callback is set, then libev will expect it to remedy the situation, no -matter what, when it returns. That is, libev will generally retry the -requested operation, or, if the condition doesn't go away, do bad stuff -(such as abort). -.Sp -Example: This is basically the same thing that libev does internally, too. -.Sp -.Vb 6 -\& static void -\& fatal_error (const char *msg) -\& { -\& perror (msg); -\& abort (); -\& } -\& -\& ... -\& ev_set_syserr_cb (fatal_error); -.Ve -.IP "ev_feed_signal (int signum)" 4 -.IX Item "ev_feed_signal (int signum)" -This function can be used to \*(L"simulate\*(R" a signal receive. It is completely -safe to call this function at any time, from any context, including signal -handlers or random threads. -.Sp -Its main use is to customise signal handling in your process, especially -in the presence of threads. For example, you could block signals -by default in all threads (and specifying \f(CW\*(C`EVFLAG_NOSIGMASK\*(C'\fR when -creating any loops), and in one thread, use \f(CW\*(C`sigwait\*(C'\fR or any other -mechanism to wait for signals, then \*(L"deliver\*(R" them to libev by calling -\&\f(CW\*(C`ev_feed_signal\*(C'\fR. -.SH "FUNCTIONS CONTROLLING EVENT LOOPS" -.IX Header "FUNCTIONS CONTROLLING EVENT LOOPS" -An event loop is described by a \f(CW\*(C`struct ev_loop *\*(C'\fR (the \f(CW\*(C`struct\*(C'\fR is -\&\fInot\fR optional in this case unless libev 3 compatibility is disabled, as -libev 3 had an \f(CW\*(C`ev_loop\*(C'\fR function colliding with the struct name). -.PP -The library knows two types of such loops, the \fIdefault\fR loop, which -supports child process events, and dynamically created event loops which -do not. -.IP "struct ev_loop *ev_default_loop (unsigned int flags)" 4 -.IX Item "struct ev_loop *ev_default_loop (unsigned int flags)" -This returns the \*(L"default\*(R" event loop object, which is what you should -normally use when you just need \*(L"the event loop\*(R". Event loop objects and -the \f(CW\*(C`flags\*(C'\fR parameter are described in more detail in the entry for -\&\f(CW\*(C`ev_loop_new\*(C'\fR. -.Sp -If the default loop is already initialised then this function simply -returns it (and ignores the flags. If that is troubling you, check -\&\f(CW\*(C`ev_backend ()\*(C'\fR afterwards). Otherwise it will create it with the given -flags, which should almost always be \f(CW0\fR, unless the caller is also the -one calling \f(CW\*(C`ev_run\*(C'\fR or otherwise qualifies as \*(L"the main program\*(R". -.Sp -If you don't know what event loop to use, use the one returned from this -function (or via the \f(CW\*(C`EV_DEFAULT\*(C'\fR macro). -.Sp -Note that this function is \fInot\fR thread-safe, so if you want to use it -from multiple threads, you have to employ some kind of mutex (note also -that this case is unlikely, as loops cannot be shared easily between -threads anyway). -.Sp -The default loop is the only loop that can handle \f(CW\*(C`ev_child\*(C'\fR watchers, -and to do this, it always registers a handler for \f(CW\*(C`SIGCHLD\*(C'\fR. If this is -a problem for your application you can either create a dynamic loop with -\&\f(CW\*(C`ev_loop_new\*(C'\fR which doesn't do that, or you can simply overwrite the -\&\f(CW\*(C`SIGCHLD\*(C'\fR signal handler \fIafter\fR calling \f(CW\*(C`ev_default_init\*(C'\fR. -.Sp -Example: This is the most typical usage. -.Sp -.Vb 2 -\& if (!ev_default_loop (0)) -\& fatal ("could not initialise libev, bad $LIBEV_FLAGS in environment?"); -.Ve -.Sp -Example: Restrict libev to the select and poll backends, and do not allow -environment settings to be taken into account: -.Sp -.Vb 1 -\& ev_default_loop (EVBACKEND_POLL | EVBACKEND_SELECT | EVFLAG_NOENV); -.Ve -.IP "struct ev_loop *ev_loop_new (unsigned int flags)" 4 -.IX Item "struct ev_loop *ev_loop_new (unsigned int flags)" -This will create and initialise a new event loop object. If the loop -could not be initialised, returns false. -.Sp -This function is thread-safe, and one common way to use libev with -threads is indeed to create one loop per thread, and using the default -loop in the \*(L"main\*(R" or \*(L"initial\*(R" thread. -.Sp -The flags argument can be used to specify special behaviour or specific -backends to use, and is usually specified as \f(CW0\fR (or \f(CW\*(C`EVFLAG_AUTO\*(C'\fR). -.Sp -The following flags are supported: -.RS 4 -.ie n .IP """EVFLAG_AUTO""" 4 -.el .IP "\f(CWEVFLAG_AUTO\fR" 4 -.IX Item "EVFLAG_AUTO" -The default flags value. Use this if you have no clue (it's the right -thing, believe me). -.ie n .IP """EVFLAG_NOENV""" 4 -.el .IP "\f(CWEVFLAG_NOENV\fR" 4 -.IX Item "EVFLAG_NOENV" -If this flag bit is or'ed into the flag value (or the program runs setuid -or setgid) then libev will \fInot\fR look at the environment variable -\&\f(CW\*(C`LIBEV_FLAGS\*(C'\fR. Otherwise (the default), this environment variable will -override the flags completely if it is found in the environment. This is -useful to try out specific backends to test their performance, to work -around bugs, or to make libev threadsafe (accessing environment variables -cannot be done in a threadsafe way, but usually it works if no other -thread modifies them). -.ie n .IP """EVFLAG_FORKCHECK""" 4 -.el .IP "\f(CWEVFLAG_FORKCHECK\fR" 4 -.IX Item "EVFLAG_FORKCHECK" -Instead of calling \f(CW\*(C`ev_loop_fork\*(C'\fR manually after a fork, you can also -make libev check for a fork in each iteration by enabling this flag. -.Sp -This works by calling \f(CW\*(C`getpid ()\*(C'\fR on every iteration of the loop, -and thus this might slow down your event loop if you do a lot of loop -iterations and little real work, but is usually not noticeable (on my -GNU/Linux system for example, \f(CW\*(C`getpid\*(C'\fR is actually a simple 5\-insn -sequence without a system call and thus \fIvery\fR fast, but my GNU/Linux -system also has \f(CW\*(C`pthread_atfork\*(C'\fR which is even faster). (Update: glibc -versions 2.25 apparently removed the \f(CW\*(C`getpid\*(C'\fR optimisation again). -.Sp -The big advantage of this flag is that you can forget about fork (and -forget about forgetting to tell libev about forking, although you still -have to ignore \f(CW\*(C`SIGPIPE\*(C'\fR) when you use this flag. -.Sp -This flag setting cannot be overridden or specified in the \f(CW\*(C`LIBEV_FLAGS\*(C'\fR -environment variable. -.ie n .IP """EVFLAG_NOINOTIFY""" 4 -.el .IP "\f(CWEVFLAG_NOINOTIFY\fR" 4 -.IX Item "EVFLAG_NOINOTIFY" -When this flag is specified, then libev will not attempt to use the -\&\fIinotify\fR \s-1API\s0 for its \f(CW\*(C`ev_stat\*(C'\fR watchers. Apart from debugging and -testing, this flag can be useful to conserve inotify file descriptors, as -otherwise each loop using \f(CW\*(C`ev_stat\*(C'\fR watchers consumes one inotify handle. -.ie n .IP """EVFLAG_SIGNALFD""" 4 -.el .IP "\f(CWEVFLAG_SIGNALFD\fR" 4 -.IX Item "EVFLAG_SIGNALFD" -When this flag is specified, then libev will attempt to use the -\&\fIsignalfd\fR \s-1API\s0 for its \f(CW\*(C`ev_signal\*(C'\fR (and \f(CW\*(C`ev_child\*(C'\fR) watchers. This \s-1API\s0 -delivers signals synchronously, which makes it both faster and might make -it possible to get the queued signal data. It can also simplify signal -handling with threads, as long as you properly block signals in your -threads that are not interested in handling them. -.Sp -Signalfd will not be used by default as this changes your signal mask, and -there are a lot of shoddy libraries and programs (glib's threadpool for -example) that can't properly initialise their signal masks. -.ie n .IP """EVFLAG_NOSIGMASK""" 4 -.el .IP "\f(CWEVFLAG_NOSIGMASK\fR" 4 -.IX Item "EVFLAG_NOSIGMASK" -When this flag is specified, then libev will avoid to modify the signal -mask. Specifically, this means you have to make sure signals are unblocked -when you want to receive them. -.Sp -This behaviour is useful when you want to do your own signal handling, or -want to handle signals only in specific threads and want to avoid libev -unblocking the signals. -.Sp -It's also required by \s-1POSIX\s0 in a threaded program, as libev calls -\&\f(CW\*(C`sigprocmask\*(C'\fR, whose behaviour is officially unspecified. -.ie n .IP """EVFLAG_NOTIMERFD""" 4 -.el .IP "\f(CWEVFLAG_NOTIMERFD\fR" 4 -.IX Item "EVFLAG_NOTIMERFD" -When this flag is specified, the libev will avoid using a \f(CW\*(C`timerfd\*(C'\fR to -detect time jumps. It will still be able to detect time jumps, but takes -longer and has a lower accuracy in doing so, but saves a file descriptor -per loop. -.Sp -The current implementation only tries to use a \f(CW\*(C`timerfd\*(C'\fR when the first -\&\f(CW\*(C`ev_periodic\*(C'\fR watcher is started and falls back on other methods if it -cannot be created, but this behaviour might change in the future. -.ie n .IP """EVBACKEND_SELECT"" (value 1, portable select backend)" 4 -.el .IP "\f(CWEVBACKEND_SELECT\fR (value 1, portable select backend)" 4 -.IX Item "EVBACKEND_SELECT (value 1, portable select backend)" -This is your standard \fBselect\fR\|(2) backend. Not \fIcompletely\fR standard, as -libev tries to roll its own fd_set with no limits on the number of fds, -but if that fails, expect a fairly low limit on the number of fds when -using this backend. It doesn't scale too well (O(highest_fd)), but its -usually the fastest backend for a low number of (low-numbered :) fds. -.Sp -To get good performance out of this backend you need a high amount of -parallelism (most of the file descriptors should be busy). If you are -writing a server, you should \f(CW\*(C`accept ()\*(C'\fR in a loop to accept as many -connections as possible during one iteration. You might also want to have -a look at \f(CW\*(C`ev_set_io_collect_interval ()\*(C'\fR to increase the amount of -readiness notifications you get per iteration. -.Sp -This backend maps \f(CW\*(C`EV_READ\*(C'\fR to the \f(CW\*(C`readfds\*(C'\fR set and \f(CW\*(C`EV_WRITE\*(C'\fR to the -\&\f(CW\*(C`writefds\*(C'\fR set (and to work around Microsoft Windows bugs, also onto the -\&\f(CW\*(C`exceptfds\*(C'\fR set on that platform). -.ie n .IP """EVBACKEND_POLL"" (value 2, poll backend, available everywhere except on windows)" 4 -.el .IP "\f(CWEVBACKEND_POLL\fR (value 2, poll backend, available everywhere except on windows)" 4 -.IX Item "EVBACKEND_POLL (value 2, poll backend, available everywhere except on windows)" -And this is your standard \fBpoll\fR\|(2) backend. It's more complicated -than select, but handles sparse fds better and has no artificial -limit on the number of fds you can use (except it will slow down -considerably with a lot of inactive fds). It scales similarly to select, -i.e. O(total_fds). See the entry for \f(CW\*(C`EVBACKEND_SELECT\*(C'\fR, above, for -performance tips. -.Sp -This backend maps \f(CW\*(C`EV_READ\*(C'\fR to \f(CW\*(C`POLLIN | POLLERR | POLLHUP\*(C'\fR, and -\&\f(CW\*(C`EV_WRITE\*(C'\fR to \f(CW\*(C`POLLOUT | POLLERR | POLLHUP\*(C'\fR. -.ie n .IP """EVBACKEND_EPOLL"" (value 4, Linux)" 4 -.el .IP "\f(CWEVBACKEND_EPOLL\fR (value 4, Linux)" 4 -.IX Item "EVBACKEND_EPOLL (value 4, Linux)" -Use the Linux-specific \fBepoll\fR\|(7) interface (for both pre\- and post\-2.6.9 -kernels). -.Sp -For few fds, this backend is a bit little slower than poll and select, but -it scales phenomenally better. While poll and select usually scale like -O(total_fds) where total_fds is the total number of fds (or the highest -fd), epoll scales either O(1) or O(active_fds). -.Sp -The epoll mechanism deserves honorable mention as the most misdesigned -of the more advanced event mechanisms: mere annoyances include silently -dropping file descriptors, requiring a system call per change per file -descriptor (and unnecessary guessing of parameters), problems with dup, -returning before the timeout value, resulting in additional iterations -(and only giving 5ms accuracy while select on the same platform gives -0.1ms) and so on. The biggest issue is fork races, however \- if a program -forks then \fIboth\fR parent and child process have to recreate the epoll -set, which can take considerable time (one syscall per file descriptor) -and is of course hard to detect. -.Sp -Epoll is also notoriously buggy \- embedding epoll fds \fIshould\fR work, -but of course \fIdoesn't\fR, and epoll just loves to report events for -totally \fIdifferent\fR file descriptors (even already closed ones, so -one cannot even remove them from the set) than registered in the set -(especially on \s-1SMP\s0 systems). Libev tries to counter these spurious -notifications by employing an additional generation counter and comparing -that against the events to filter out spurious ones, recreating the set -when required. Epoll also erroneously rounds down timeouts, but gives you -no way to know when and by how much, so sometimes you have to busy-wait -because epoll returns immediately despite a nonzero timeout. And last -not least, it also refuses to work with some file descriptors which work -perfectly fine with \f(CW\*(C`select\*(C'\fR (files, many character devices...). -.Sp -Epoll is truly the train wreck among event poll mechanisms, a frankenpoll, -cobbled together in a hurry, no thought to design or interaction with -others. Oh, the pain, will it ever stop... -.Sp -While stopping, setting and starting an I/O watcher in the same iteration -will result in some caching, there is still a system call per such -incident (because the same \fIfile descriptor\fR could point to a different -\&\fIfile description\fR now), so its best to avoid that. Also, \f(CW\*(C`dup ()\*(C'\fR'ed -file descriptors might not work very well if you register events for both -file descriptors. -.Sp -Best performance from this backend is achieved by not unregistering all -watchers for a file descriptor until it has been closed, if possible, -i.e. keep at least one watcher active per fd at all times. Stopping and -starting a watcher (without re-setting it) also usually doesn't cause -extra overhead. A fork can both result in spurious notifications as well -as in libev having to destroy and recreate the epoll object, which can -take considerable time and thus should be avoided. -.Sp -All this means that, in practice, \f(CW\*(C`EVBACKEND_SELECT\*(C'\fR can be as fast or -faster than epoll for maybe up to a hundred file descriptors, depending on -the usage. So sad. -.Sp -While nominally embeddable in other event loops, this feature is broken in -a lot of kernel revisions, but probably(!) works in current versions. -.Sp -This backend maps \f(CW\*(C`EV_READ\*(C'\fR and \f(CW\*(C`EV_WRITE\*(C'\fR in the same way as -\&\f(CW\*(C`EVBACKEND_POLL\*(C'\fR. -.ie n .IP """EVBACKEND_LINUXAIO"" (value 64, Linux)" 4 -.el .IP "\f(CWEVBACKEND_LINUXAIO\fR (value 64, Linux)" 4 -.IX Item "EVBACKEND_LINUXAIO (value 64, Linux)" -Use the Linux-specific Linux \s-1AIO\s0 (\fInot\fR \f(CWaio(7)\fR but \f(CWio_submit(2)\fR) event interface available in post\-4.18 kernels (but libev -only tries to use it in 4.19+). -.Sp -This is another Linux train wreck of an event interface. -.Sp -If this backend works for you (as of this writing, it was very -experimental), it is the best event interface available on Linux and might -be well worth enabling it \- if it isn't available in your kernel this will -be detected and this backend will be skipped. -.Sp -This backend can batch oneshot requests and supports a user-space ring -buffer to receive events. It also doesn't suffer from most of the design -problems of epoll (such as not being able to remove event sources from -the epoll set), and generally sounds too good to be true. Because, this -being the Linux kernel, of course it suffers from a whole new set of -limitations, forcing you to fall back to epoll, inheriting all its design -issues. -.Sp -For one, it is not easily embeddable (but probably could be done using -an event fd at some extra overhead). It also is subject to a system wide -limit that can be configured in \fI/proc/sys/fs/aio\-max\-nr\fR. If no \s-1AIO\s0 -requests are left, this backend will be skipped during initialisation, and -will switch to epoll when the loop is active. -.Sp -Most problematic in practice, however, is that not all file descriptors -work with it. For example, in Linux 5.1, \s-1TCP\s0 sockets, pipes, event fds, -files, \fI/dev/null\fR and many others are supported, but ttys do not work -properly (a known bug that the kernel developers don't care about, see -), so this is not -(yet?) a generic event polling interface. -.Sp -Overall, it seems the Linux developers just don't want it to have a -generic event handling mechanism other than \f(CW\*(C`select\*(C'\fR or \f(CW\*(C`poll\*(C'\fR. -.Sp -To work around all these problem, the current version of libev uses its -epoll backend as a fallback for file descriptor types that do not work. Or -falls back completely to epoll if the kernel acts up. -.Sp -This backend maps \f(CW\*(C`EV_READ\*(C'\fR and \f(CW\*(C`EV_WRITE\*(C'\fR in the same way as -\&\f(CW\*(C`EVBACKEND_POLL\*(C'\fR. -.ie n .IP """EVBACKEND_KQUEUE"" (value 8, most \s-1BSD\s0 clones)" 4 -.el .IP "\f(CWEVBACKEND_KQUEUE\fR (value 8, most \s-1BSD\s0 clones)" 4 -.IX Item "EVBACKEND_KQUEUE (value 8, most BSD clones)" -Kqueue deserves special mention, as at the time this backend was -implemented, it was broken on all BSDs except NetBSD (usually it doesn't -work reliably with anything but sockets and pipes, except on Darwin, -where of course it's completely useless). Unlike epoll, however, whose -brokenness is by design, these kqueue bugs can be (and mostly have been) -fixed without \s-1API\s0 changes to existing programs. For this reason it's not -being \*(L"auto-detected\*(R" on all platforms unless you explicitly specify it -in the flags (i.e. using \f(CW\*(C`EVBACKEND_KQUEUE\*(C'\fR) or libev was compiled on a -known-to-be-good (\-enough) system like NetBSD. -.Sp -You still can embed kqueue into a normal poll or select backend and use it -only for sockets (after having made sure that sockets work with kqueue on -the target platform). See \f(CW\*(C`ev_embed\*(C'\fR watchers for more info. -.Sp -It scales in the same way as the epoll backend, but the interface to the -kernel is more efficient (which says nothing about its actual speed, of -course). While stopping, setting and starting an I/O watcher does never -cause an extra system call as with \f(CW\*(C`EVBACKEND_EPOLL\*(C'\fR, it still adds up to -two event changes per incident. Support for \f(CW\*(C`fork ()\*(C'\fR is very bad (you -might have to leak fds on fork, but it's more sane than epoll) and it -drops fds silently in similarly hard-to-detect cases. -.Sp -This backend usually performs well under most conditions. -.Sp -While nominally embeddable in other event loops, this doesn't work -everywhere, so you might need to test for this. And since it is broken -almost everywhere, you should only use it when you have a lot of sockets -(for which it usually works), by embedding it into another event loop -(e.g. \f(CW\*(C`EVBACKEND_SELECT\*(C'\fR or \f(CW\*(C`EVBACKEND_POLL\*(C'\fR (but \f(CW\*(C`poll\*(C'\fR is of course -also broken on \s-1OS X\s0)) and, did I mention it, using it only for sockets. -.Sp -This backend maps \f(CW\*(C`EV_READ\*(C'\fR into an \f(CW\*(C`EVFILT_READ\*(C'\fR kevent with -\&\f(CW\*(C`NOTE_EOF\*(C'\fR, and \f(CW\*(C`EV_WRITE\*(C'\fR into an \f(CW\*(C`EVFILT_WRITE\*(C'\fR kevent with -\&\f(CW\*(C`NOTE_EOF\*(C'\fR. -.ie n .IP """EVBACKEND_DEVPOLL"" (value 16, Solaris 8)" 4 -.el .IP "\f(CWEVBACKEND_DEVPOLL\fR (value 16, Solaris 8)" 4 -.IX Item "EVBACKEND_DEVPOLL (value 16, Solaris 8)" -This is not implemented yet (and might never be, unless you send me an -implementation). According to reports, \f(CW\*(C`/dev/poll\*(C'\fR only supports sockets -and is not embeddable, which would limit the usefulness of this backend -immensely. -.ie n .IP """EVBACKEND_PORT"" (value 32, Solaris 10)" 4 -.el .IP "\f(CWEVBACKEND_PORT\fR (value 32, Solaris 10)" 4 -.IX Item "EVBACKEND_PORT (value 32, Solaris 10)" -This uses the Solaris 10 event port mechanism. As with everything on Solaris, -it's really slow, but it still scales very well (O(active_fds)). -.Sp -While this backend scales well, it requires one system call per active -file descriptor per loop iteration. For small and medium numbers of file -descriptors a \*(L"slow\*(R" \f(CW\*(C`EVBACKEND_SELECT\*(C'\fR or \f(CW\*(C`EVBACKEND_POLL\*(C'\fR backend -might perform better. -.Sp -On the positive side, this backend actually performed fully to -specification in all tests and is fully embeddable, which is a rare feat -among the OS-specific backends (I vastly prefer correctness over speed -hacks). -.Sp -On the negative side, the interface is \fIbizarre\fR \- so bizarre that -even sun itself gets it wrong in their code examples: The event polling -function sometimes returns events to the caller even though an error -occurred, but with no indication whether it has done so or not (yes, it's -even documented that way) \- deadly for edge-triggered interfaces where you -absolutely have to know whether an event occurred or not because you have -to re-arm the watcher. -.Sp -Fortunately libev seems to be able to work around these idiocies. -.Sp -This backend maps \f(CW\*(C`EV_READ\*(C'\fR and \f(CW\*(C`EV_WRITE\*(C'\fR in the same way as -\&\f(CW\*(C`EVBACKEND_POLL\*(C'\fR. -.ie n .IP """EVBACKEND_ALL""" 4 -.el .IP "\f(CWEVBACKEND_ALL\fR" 4 -.IX Item "EVBACKEND_ALL" -Try all backends (even potentially broken ones that wouldn't be tried -with \f(CW\*(C`EVFLAG_AUTO\*(C'\fR). Since this is a mask, you can do stuff such as -\&\f(CW\*(C`EVBACKEND_ALL & ~EVBACKEND_KQUEUE\*(C'\fR. -.Sp -It is definitely not recommended to use this flag, use whatever -\&\f(CW\*(C`ev_recommended_backends ()\*(C'\fR returns, or simply do not specify a backend -at all. -.ie n .IP """EVBACKEND_MASK""" 4 -.el .IP "\f(CWEVBACKEND_MASK\fR" 4 -.IX Item "EVBACKEND_MASK" -Not a backend at all, but a mask to select all backend bits from a -\&\f(CW\*(C`flags\*(C'\fR value, in case you want to mask out any backends from a flags -value (e.g. when modifying the \f(CW\*(C`LIBEV_FLAGS\*(C'\fR environment variable). -.RE -.RS 4 -.Sp -If one or more of the backend flags are or'ed into the flags value, -then only these backends will be tried (in the reverse order as listed -here). If none are specified, all backends in \f(CW\*(C`ev_recommended_backends -()\*(C'\fR will be tried. -.Sp -Example: Try to create a event loop that uses epoll and nothing else. -.Sp -.Vb 3 -\& struct ev_loop *epoller = ev_loop_new (EVBACKEND_EPOLL | EVFLAG_NOENV); -\& if (!epoller) -\& fatal ("no epoll found here, maybe it hides under your chair"); -.Ve -.Sp -Example: Use whatever libev has to offer, but make sure that kqueue is -used if available. -.Sp -.Vb 1 -\& struct ev_loop *loop = ev_loop_new (ev_recommended_backends () | EVBACKEND_KQUEUE); -.Ve -.Sp -Example: Similarly, on linux, you mgiht want to take advantage of the -linux aio backend if possible, but fall back to something else if that -isn't available. -.Sp -.Vb 1 -\& struct ev_loop *loop = ev_loop_new (ev_recommended_backends () | EVBACKEND_LINUXAIO); -.Ve -.RE -.IP "ev_loop_destroy (loop)" 4 -.IX Item "ev_loop_destroy (loop)" -Destroys an event loop object (frees all memory and kernel state -etc.). None of the active event watchers will be stopped in the normal -sense, so e.g. \f(CW\*(C`ev_is_active\*(C'\fR might still return true. It is your -responsibility to either stop all watchers cleanly yourself \fIbefore\fR -calling this function, or cope with the fact afterwards (which is usually -the easiest thing, you can just ignore the watchers and/or \f(CW\*(C`free ()\*(C'\fR them -for example). -.Sp -Note that certain global state, such as signal state (and installed signal -handlers), will not be freed by this function, and related watchers (such -as signal and child watchers) would need to be stopped manually. -.Sp -This function is normally used on loop objects allocated by -\&\f(CW\*(C`ev_loop_new\*(C'\fR, but it can also be used on the default loop returned by -\&\f(CW\*(C`ev_default_loop\*(C'\fR, in which case it is not thread-safe. -.Sp -Note that it is not advisable to call this function on the default loop -except in the rare occasion where you really need to free its resources. -If you need dynamically allocated loops it is better to use \f(CW\*(C`ev_loop_new\*(C'\fR -and \f(CW\*(C`ev_loop_destroy\*(C'\fR. -.IP "ev_loop_fork (loop)" 4 -.IX Item "ev_loop_fork (loop)" -This function sets a flag that causes subsequent \f(CW\*(C`ev_run\*(C'\fR iterations -to reinitialise the kernel state for backends that have one. Despite -the name, you can call it anytime you are allowed to start or stop -watchers (except inside an \f(CW\*(C`ev_prepare\*(C'\fR callback), but it makes most -sense after forking, in the child process. You \fImust\fR call it (or use -\&\f(CW\*(C`EVFLAG_FORKCHECK\*(C'\fR) in the child before resuming or calling \f(CW\*(C`ev_run\*(C'\fR. -.Sp -In addition, if you want to reuse a loop (via this function or -\&\f(CW\*(C`EVFLAG_FORKCHECK\*(C'\fR), you \fIalso\fR have to ignore \f(CW\*(C`SIGPIPE\*(C'\fR. -.Sp -Again, you \fIhave\fR to call it on \fIany\fR loop that you want to re-use after -a fork, \fIeven if you do not plan to use the loop in the parent\fR. This is -because some kernel interfaces *cough* \fIkqueue\fR *cough* do funny things -during fork. -.Sp -On the other hand, you only need to call this function in the child -process if and only if you want to use the event loop in the child. If -you just fork+exec or create a new loop in the child, you don't have to -call it at all (in fact, \f(CW\*(C`epoll\*(C'\fR is so badly broken that it makes a -difference, but libev will usually detect this case on its own and do a -costly reset of the backend). -.Sp -The function itself is quite fast and it's usually not a problem to call -it just in case after a fork. -.Sp -Example: Automate calling \f(CW\*(C`ev_loop_fork\*(C'\fR on the default loop when -using pthreads. -.Sp -.Vb 5 -\& static void -\& post_fork_child (void) -\& { -\& ev_loop_fork (EV_DEFAULT); -\& } -\& -\& ... -\& pthread_atfork (0, 0, post_fork_child); -.Ve -.IP "int ev_is_default_loop (loop)" 4 -.IX Item "int ev_is_default_loop (loop)" -Returns true when the given loop is, in fact, the default loop, and false -otherwise. -.IP "unsigned int ev_iteration (loop)" 4 -.IX Item "unsigned int ev_iteration (loop)" -Returns the current iteration count for the event loop, which is identical -to the number of times libev did poll for new events. It starts at \f(CW0\fR -and happily wraps around with enough iterations. -.Sp -This value can sometimes be useful as a generation counter of sorts (it -\&\*(L"ticks\*(R" the number of loop iterations), as it roughly corresponds with -\&\f(CW\*(C`ev_prepare\*(C'\fR and \f(CW\*(C`ev_check\*(C'\fR calls \- and is incremented between the -prepare and check phases. -.IP "unsigned int ev_depth (loop)" 4 -.IX Item "unsigned int ev_depth (loop)" -Returns the number of times \f(CW\*(C`ev_run\*(C'\fR was entered minus the number of -times \f(CW\*(C`ev_run\*(C'\fR was exited normally, in other words, the recursion depth. -.Sp -Outside \f(CW\*(C`ev_run\*(C'\fR, this number is zero. In a callback, this number is -\&\f(CW1\fR, unless \f(CW\*(C`ev_run\*(C'\fR was invoked recursively (or from another thread), -in which case it is higher. -.Sp -Leaving \f(CW\*(C`ev_run\*(C'\fR abnormally (setjmp/longjmp, cancelling the thread, -throwing an exception etc.), doesn't count as \*(L"exit\*(R" \- consider this -as a hint to avoid such ungentleman-like behaviour unless it's really -convenient, in which case it is fully supported. -.IP "unsigned int ev_backend (loop)" 4 -.IX Item "unsigned int ev_backend (loop)" -Returns one of the \f(CW\*(C`EVBACKEND_*\*(C'\fR flags indicating the event backend in -use. -.IP "ev_tstamp ev_now (loop)" 4 -.IX Item "ev_tstamp ev_now (loop)" -Returns the current \*(L"event loop time\*(R", which is the time the event loop -received events and started processing them. This timestamp does not -change as long as callbacks are being processed, and this is also the base -time used for relative timers. You can treat it as the timestamp of the -event occurring (or more correctly, libev finding out about it). -.IP "ev_now_update (loop)" 4 -.IX Item "ev_now_update (loop)" -Establishes the current time by querying the kernel, updating the time -returned by \f(CW\*(C`ev_now ()\*(C'\fR in the progress. This is a costly operation and -is usually done automatically within \f(CW\*(C`ev_run ()\*(C'\fR. -.Sp -This function is rarely useful, but when some event callback runs for a -very long time without entering the event loop, updating libev's idea of -the current time is a good idea. -.Sp -See also \*(L"The special problem of time updates\*(R" in the \f(CW\*(C`ev_timer\*(C'\fR section. -.IP "ev_suspend (loop)" 4 -.IX Item "ev_suspend (loop)" -.PD 0 -.IP "ev_resume (loop)" 4 -.IX Item "ev_resume (loop)" -.PD -These two functions suspend and resume an event loop, for use when the -loop is not used for a while and timeouts should not be processed. -.Sp -A typical use case would be an interactive program such as a game: When -the user presses \f(CW\*(C`^Z\*(C'\fR to suspend the game and resumes it an hour later it -would be best to handle timeouts as if no time had actually passed while -the program was suspended. This can be achieved by calling \f(CW\*(C`ev_suspend\*(C'\fR -in your \f(CW\*(C`SIGTSTP\*(C'\fR handler, sending yourself a \f(CW\*(C`SIGSTOP\*(C'\fR and calling -\&\f(CW\*(C`ev_resume\*(C'\fR directly afterwards to resume timer processing. -.Sp -Effectively, all \f(CW\*(C`ev_timer\*(C'\fR watchers will be delayed by the time spend -between \f(CW\*(C`ev_suspend\*(C'\fR and \f(CW\*(C`ev_resume\*(C'\fR, and all \f(CW\*(C`ev_periodic\*(C'\fR watchers -will be rescheduled (that is, they will lose any events that would have -occurred while suspended). -.Sp -After calling \f(CW\*(C`ev_suspend\*(C'\fR you \fBmust not\fR call \fIany\fR function on the -given loop other than \f(CW\*(C`ev_resume\*(C'\fR, and you \fBmust not\fR call \f(CW\*(C`ev_resume\*(C'\fR -without a previous call to \f(CW\*(C`ev_suspend\*(C'\fR. -.Sp -Calling \f(CW\*(C`ev_suspend\*(C'\fR/\f(CW\*(C`ev_resume\*(C'\fR has the side effect of updating the -event loop time (see \f(CW\*(C`ev_now_update\*(C'\fR). -.IP "bool ev_run (loop, int flags)" 4 -.IX Item "bool ev_run (loop, int flags)" -Finally, this is it, the event handler. This function usually is called -after you have initialised all your watchers and you want to start -handling events. It will ask the operating system for any new events, call -the watcher callbacks, and then repeat the whole process indefinitely: This -is why event loops are called \fIloops\fR. -.Sp -If the flags argument is specified as \f(CW0\fR, it will keep handling events -until either no event watchers are active anymore or \f(CW\*(C`ev_break\*(C'\fR was -called. -.Sp -The return value is false if there are no more active watchers (which -usually means \*(L"all jobs done\*(R" or \*(L"deadlock\*(R"), and true in all other cases -(which usually means " you should call \f(CW\*(C`ev_run\*(C'\fR again"). -.Sp -Please note that an explicit \f(CW\*(C`ev_break\*(C'\fR is usually better than -relying on all watchers to be stopped when deciding when a program has -finished (especially in interactive programs), but having a program -that automatically loops as long as it has to and no longer by virtue -of relying on its watchers stopping correctly, that is truly a thing of -beauty. -.Sp -This function is \fImostly\fR exception-safe \- you can break out of a -\&\f(CW\*(C`ev_run\*(C'\fR call by calling \f(CW\*(C`longjmp\*(C'\fR in a callback, throwing a \*(C+ -exception and so on. This does not decrement the \f(CW\*(C`ev_depth\*(C'\fR value, nor -will it clear any outstanding \f(CW\*(C`EVBREAK_ONE\*(C'\fR breaks. -.Sp -A flags value of \f(CW\*(C`EVRUN_NOWAIT\*(C'\fR will look for new events, will handle -those events and any already outstanding ones, but will not wait and -block your process in case there are no events and will return after one -iteration of the loop. This is sometimes useful to poll and handle new -events while doing lengthy calculations, to keep the program responsive. -.Sp -A flags value of \f(CW\*(C`EVRUN_ONCE\*(C'\fR will look for new events (waiting if -necessary) and will handle those and any already outstanding ones. It -will block your process until at least one new event arrives (which could -be an event internal to libev itself, so there is no guarantee that a -user-registered callback will be called), and will return after one -iteration of the loop. -.Sp -This is useful if you are waiting for some external event in conjunction -with something not expressible using other libev watchers (i.e. "roll your -own \f(CW\*(C`ev_run\*(C'\fR"). However, a pair of \f(CW\*(C`ev_prepare\*(C'\fR/\f(CW\*(C`ev_check\*(C'\fR watchers is -usually a better approach for this kind of thing. -.Sp -Here are the gory details of what \f(CW\*(C`ev_run\*(C'\fR does (this is for your -understanding, not a guarantee that things will work exactly like this in -future versions): -.Sp -.Vb 10 -\& \- Increment loop depth. -\& \- Reset the ev_break status. -\& \- Before the first iteration, call any pending watchers. -\& LOOP: -\& \- If EVFLAG_FORKCHECK was used, check for a fork. -\& \- If a fork was detected (by any means), queue and call all fork watchers. -\& \- Queue and call all prepare watchers. -\& \- If ev_break was called, goto FINISH. -\& \- If we have been forked, detach and recreate the kernel state -\& as to not disturb the other process. -\& \- Update the kernel state with all outstanding changes. -\& \- Update the "event loop time" (ev_now ()). -\& \- Calculate for how long to sleep or block, if at all -\& (active idle watchers, EVRUN_NOWAIT or not having -\& any active watchers at all will result in not sleeping). -\& \- Sleep if the I/O and timer collect interval say so. -\& \- Increment loop iteration counter. -\& \- Block the process, waiting for any events. -\& \- Queue all outstanding I/O (fd) events. -\& \- Update the "event loop time" (ev_now ()), and do time jump adjustments. -\& \- Queue all expired timers. -\& \- Queue all expired periodics. -\& \- Queue all idle watchers with priority higher than that of pending events. -\& \- Queue all check watchers. -\& \- Call all queued watchers in reverse order (i.e. check watchers first). -\& Signals and child watchers are implemented as I/O watchers, and will -\& be handled here by queueing them when their watcher gets executed. -\& \- If ev_break has been called, or EVRUN_ONCE or EVRUN_NOWAIT -\& were used, or there are no active watchers, goto FINISH, otherwise -\& continue with step LOOP. -\& FINISH: -\& \- Reset the ev_break status iff it was EVBREAK_ONE. -\& \- Decrement the loop depth. -\& \- Return. -.Ve -.Sp -Example: Queue some jobs and then loop until no events are outstanding -anymore. -.Sp -.Vb 4 -\& ... queue jobs here, make sure they register event watchers as long -\& ... as they still have work to do (even an idle watcher will do..) -\& ev_run (my_loop, 0); -\& ... jobs done or somebody called break. yeah! -.Ve -.IP "ev_break (loop, how)" 4 -.IX Item "ev_break (loop, how)" -Can be used to make a call to \f(CW\*(C`ev_run\*(C'\fR return early (but only after it -has processed all outstanding events). The \f(CW\*(C`how\*(C'\fR argument must be either -\&\f(CW\*(C`EVBREAK_ONE\*(C'\fR, which will make the innermost \f(CW\*(C`ev_run\*(C'\fR call return, or -\&\f(CW\*(C`EVBREAK_ALL\*(C'\fR, which will make all nested \f(CW\*(C`ev_run\*(C'\fR calls return. -.Sp -This \*(L"break state\*(R" will be cleared on the next call to \f(CW\*(C`ev_run\*(C'\fR. -.Sp -It is safe to call \f(CW\*(C`ev_break\*(C'\fR from outside any \f(CW\*(C`ev_run\*(C'\fR calls, too, in -which case it will have no effect. -.IP "ev_ref (loop)" 4 -.IX Item "ev_ref (loop)" -.PD 0 -.IP "ev_unref (loop)" 4 -.IX Item "ev_unref (loop)" -.PD -Ref/unref can be used to add or remove a reference count on the event -loop: Every watcher keeps one reference, and as long as the reference -count is nonzero, \f(CW\*(C`ev_run\*(C'\fR will not return on its own. -.Sp -This is useful when you have a watcher that you never intend to -unregister, but that nevertheless should not keep \f(CW\*(C`ev_run\*(C'\fR from -returning. In such a case, call \f(CW\*(C`ev_unref\*(C'\fR after starting, and \f(CW\*(C`ev_ref\*(C'\fR -before stopping it. -.Sp -As an example, libev itself uses this for its internal signal pipe: It -is not visible to the libev user and should not keep \f(CW\*(C`ev_run\*(C'\fR from -exiting if no event watchers registered by it are active. It is also an -excellent way to do this for generic recurring timers or from within -third-party libraries. Just remember to \fIunref after start\fR and \fIref -before stop\fR (but only if the watcher wasn't active before, or was active -before, respectively. Note also that libev might stop watchers itself -(e.g. non-repeating timers) in which case you have to \f(CW\*(C`ev_ref\*(C'\fR -in the callback). -.Sp -Example: Create a signal watcher, but keep it from keeping \f(CW\*(C`ev_run\*(C'\fR -running when nothing else is active. -.Sp -.Vb 4 -\& ev_signal exitsig; -\& ev_signal_init (&exitsig, sig_cb, SIGINT); -\& ev_signal_start (loop, &exitsig); -\& ev_unref (loop); -.Ve -.Sp -Example: For some weird reason, unregister the above signal handler again. -.Sp -.Vb 2 -\& ev_ref (loop); -\& ev_signal_stop (loop, &exitsig); -.Ve -.IP "ev_set_io_collect_interval (loop, ev_tstamp interval)" 4 -.IX Item "ev_set_io_collect_interval (loop, ev_tstamp interval)" -.PD 0 -.IP "ev_set_timeout_collect_interval (loop, ev_tstamp interval)" 4 -.IX Item "ev_set_timeout_collect_interval (loop, ev_tstamp interval)" -.PD -These advanced functions influence the time that libev will spend waiting -for events. Both time intervals are by default \f(CW0\fR, meaning that libev -will try to invoke timer/periodic callbacks and I/O callbacks with minimum -latency. -.Sp -Setting these to a higher value (the \f(CW\*(C`interval\*(C'\fR \fImust\fR be >= \f(CW0\fR) -allows libev to delay invocation of I/O and timer/periodic callbacks -to increase efficiency of loop iterations (or to increase power-saving -opportunities). -.Sp -The idea is that sometimes your program runs just fast enough to handle -one (or very few) event(s) per loop iteration. While this makes the -program responsive, it also wastes a lot of \s-1CPU\s0 time to poll for new -events, especially with backends like \f(CW\*(C`select ()\*(C'\fR which have a high -overhead for the actual polling but can deliver many events at once. -.Sp -By setting a higher \fIio collect interval\fR you allow libev to spend more -time collecting I/O events, so you can handle more events per iteration, -at the cost of increasing latency. Timeouts (both \f(CW\*(C`ev_periodic\*(C'\fR and -\&\f(CW\*(C`ev_timer\*(C'\fR) will not be affected. Setting this to a non-null value will -introduce an additional \f(CW\*(C`ev_sleep ()\*(C'\fR call into most loop iterations. The -sleep time ensures that libev will not poll for I/O events more often then -once per this interval, on average (as long as the host time resolution is -good enough). -.Sp -Likewise, by setting a higher \fItimeout collect interval\fR you allow libev -to spend more time collecting timeouts, at the expense of increased -latency/jitter/inexactness (the watcher callback will be called -later). \f(CW\*(C`ev_io\*(C'\fR watchers will not be affected. Setting this to a non-null -value will not introduce any overhead in libev. -.Sp -Many (busy) programs can usually benefit by setting the I/O collect -interval to a value near \f(CW0.1\fR or so, which is often enough for -interactive servers (of course not for games), likewise for timeouts. It -usually doesn't make much sense to set it to a lower value than \f(CW0.01\fR, -as this approaches the timing granularity of most systems. Note that if -you do transactions with the outside world and you can't increase the -parallelity, then this setting will limit your transaction rate (if you -need to poll once per transaction and the I/O collect interval is 0.01, -then you can't do more than 100 transactions per second). -.Sp -Setting the \fItimeout collect interval\fR can improve the opportunity for -saving power, as the program will \*(L"bundle\*(R" timer callback invocations that -are \*(L"near\*(R" in time together, by delaying some, thus reducing the number of -times the process sleeps and wakes up again. Another useful technique to -reduce iterations/wake\-ups is to use \f(CW\*(C`ev_periodic\*(C'\fR watchers and make sure -they fire on, say, one-second boundaries only. -.Sp -Example: we only need 0.1s timeout granularity, and we wish not to poll -more often than 100 times per second: -.Sp -.Vb 2 -\& ev_set_timeout_collect_interval (EV_DEFAULT_UC_ 0.1); -\& ev_set_io_collect_interval (EV_DEFAULT_UC_ 0.01); -.Ve -.IP "ev_invoke_pending (loop)" 4 -.IX Item "ev_invoke_pending (loop)" -This call will simply invoke all pending watchers while resetting their -pending state. Normally, \f(CW\*(C`ev_run\*(C'\fR does this automatically when required, -but when overriding the invoke callback this call comes handy. This -function can be invoked from a watcher \- this can be useful for example -when you want to do some lengthy calculation and want to pass further -event handling to another thread (you still have to make sure only one -thread executes within \f(CW\*(C`ev_invoke_pending\*(C'\fR or \f(CW\*(C`ev_run\*(C'\fR of course). -.IP "int ev_pending_count (loop)" 4 -.IX Item "int ev_pending_count (loop)" -Returns the number of pending watchers \- zero indicates that no watchers -are pending. -.IP "ev_set_invoke_pending_cb (loop, void (*invoke_pending_cb)(\s-1EV_P\s0))" 4 -.IX Item "ev_set_invoke_pending_cb (loop, void (*invoke_pending_cb)(EV_P))" -This overrides the invoke pending functionality of the loop: Instead of -invoking all pending watchers when there are any, \f(CW\*(C`ev_run\*(C'\fR will call -this callback instead. This is useful, for example, when you want to -invoke the actual watchers inside another context (another thread etc.). -.Sp -If you want to reset the callback, use \f(CW\*(C`ev_invoke_pending\*(C'\fR as new -callback. -.IP "ev_set_loop_release_cb (loop, void (*release)(\s-1EV_P\s0) throw (), void (*acquire)(\s-1EV_P\s0) throw ())" 4 -.IX Item "ev_set_loop_release_cb (loop, void (*release)(EV_P) throw (), void (*acquire)(EV_P) throw ())" -Sometimes you want to share the same loop between multiple threads. This -can be done relatively simply by putting mutex_lock/unlock calls around -each call to a libev function. -.Sp -However, \f(CW\*(C`ev_run\*(C'\fR can run an indefinite time, so it is not feasible -to wait for it to return. One way around this is to wake up the event -loop via \f(CW\*(C`ev_break\*(C'\fR and \f(CW\*(C`ev_async_send\*(C'\fR, another way is to set these -\&\fIrelease\fR and \fIacquire\fR callbacks on the loop. -.Sp -When set, then \f(CW\*(C`release\*(C'\fR will be called just before the thread is -suspended waiting for new events, and \f(CW\*(C`acquire\*(C'\fR is called just -afterwards. -.Sp -Ideally, \f(CW\*(C`release\*(C'\fR will just call your mutex_unlock function, and -\&\f(CW\*(C`acquire\*(C'\fR will just call the mutex_lock function again. -.Sp -While event loop modifications are allowed between invocations of -\&\f(CW\*(C`release\*(C'\fR and \f(CW\*(C`acquire\*(C'\fR (that's their only purpose after all), no -modifications done will affect the event loop, i.e. adding watchers will -have no effect on the set of file descriptors being watched, or the time -waited. Use an \f(CW\*(C`ev_async\*(C'\fR watcher to wake up \f(CW\*(C`ev_run\*(C'\fR when you want it -to take note of any changes you made. -.Sp -In theory, threads executing \f(CW\*(C`ev_run\*(C'\fR will be async-cancel safe between -invocations of \f(CW\*(C`release\*(C'\fR and \f(CW\*(C`acquire\*(C'\fR. -.Sp -See also the locking example in the \f(CW\*(C`THREADS\*(C'\fR section later in this -document. -.IP "ev_set_userdata (loop, void *data)" 4 -.IX Item "ev_set_userdata (loop, void *data)" -.PD 0 -.IP "void *ev_userdata (loop)" 4 -.IX Item "void *ev_userdata (loop)" -.PD -Set and retrieve a single \f(CW\*(C`void *\*(C'\fR associated with a loop. When -\&\f(CW\*(C`ev_set_userdata\*(C'\fR has never been called, then \f(CW\*(C`ev_userdata\*(C'\fR returns -\&\f(CW0\fR. -.Sp -These two functions can be used to associate arbitrary data with a loop, -and are intended solely for the \f(CW\*(C`invoke_pending_cb\*(C'\fR, \f(CW\*(C`release\*(C'\fR and -\&\f(CW\*(C`acquire\*(C'\fR callbacks described above, but of course can be (ab\-)used for -any other purpose as well. -.IP "ev_verify (loop)" 4 -.IX Item "ev_verify (loop)" -This function only does something when \f(CW\*(C`EV_VERIFY\*(C'\fR support has been -compiled in, which is the default for non-minimal builds. It tries to go -through all internal structures and checks them for validity. If anything -is found to be inconsistent, it will print an error message to standard -error and call \f(CW\*(C`abort ()\*(C'\fR. -.Sp -This can be used to catch bugs inside libev itself: under normal -circumstances, this function will never abort as of course libev keeps its -data structures consistent. -.SH "ANATOMY OF A WATCHER" -.IX Header "ANATOMY OF A WATCHER" -In the following description, uppercase \f(CW\*(C`TYPE\*(C'\fR in names stands for the -watcher type, e.g. \f(CW\*(C`ev_TYPE_start\*(C'\fR can mean \f(CW\*(C`ev_timer_start\*(C'\fR for timer -watchers and \f(CW\*(C`ev_io_start\*(C'\fR for I/O watchers. -.PP -A watcher is an opaque structure that you allocate and register to record -your interest in some event. To make a concrete example, imagine you want -to wait for \s-1STDIN\s0 to become readable, you would create an \f(CW\*(C`ev_io\*(C'\fR watcher -for that: -.PP -.Vb 5 -\& static void my_cb (struct ev_loop *loop, ev_io *w, int revents) -\& { -\& ev_io_stop (w); -\& ev_break (loop, EVBREAK_ALL); -\& } -\& -\& struct ev_loop *loop = ev_default_loop (0); -\& -\& ev_io stdin_watcher; -\& -\& ev_init (&stdin_watcher, my_cb); -\& ev_io_set (&stdin_watcher, STDIN_FILENO, EV_READ); -\& ev_io_start (loop, &stdin_watcher); -\& -\& ev_run (loop, 0); -.Ve -.PP -As you can see, you are responsible for allocating the memory for your -watcher structures (and it is \fIusually\fR a bad idea to do this on the -stack). -.PP -Each watcher has an associated watcher structure (called \f(CW\*(C`struct ev_TYPE\*(C'\fR -or simply \f(CW\*(C`ev_TYPE\*(C'\fR, as typedefs are provided for all watcher structs). -.PP -Each watcher structure must be initialised by a call to \f(CW\*(C`ev_init (watcher -*, callback)\*(C'\fR, which expects a callback to be provided. This callback is -invoked each time the event occurs (or, in the case of I/O watchers, each -time the event loop detects that the file descriptor given is readable -and/or writable). -.PP -Each watcher type further has its own \f(CW\*(C`ev_TYPE_set (watcher *, ...)\*(C'\fR -macro to configure it, with arguments specific to the watcher type. There -is also a macro to combine initialisation and setting in one call: \f(CW\*(C`ev_TYPE_init (watcher *, callback, ...)\*(C'\fR. -.PP -To make the watcher actually watch out for events, you have to start it -with a watcher-specific start function (\f(CW\*(C`ev_TYPE_start (loop, watcher -*)\*(C'\fR), and you can stop watching for events at any time by calling the -corresponding stop function (\f(CW\*(C`ev_TYPE_stop (loop, watcher *)\*(C'\fR. -.PP -As long as your watcher is active (has been started but not stopped) you -must not touch the values stored in it except when explicitly documented -otherwise. Most specifically you must never reinitialise it or call its -\&\f(CW\*(C`ev_TYPE_set\*(C'\fR macro. -.PP -Each and every callback receives the event loop pointer as first, the -registered watcher structure as second, and a bitset of received events as -third argument. -.PP -The received events usually include a single bit per event type received -(you can receive multiple events at the same time). The possible bit masks -are: -.ie n .IP """EV_READ""" 4 -.el .IP "\f(CWEV_READ\fR" 4 -.IX Item "EV_READ" -.PD 0 -.ie n .IP """EV_WRITE""" 4 -.el .IP "\f(CWEV_WRITE\fR" 4 -.IX Item "EV_WRITE" -.PD -The file descriptor in the \f(CW\*(C`ev_io\*(C'\fR watcher has become readable and/or -writable. -.ie n .IP """EV_TIMER""" 4 -.el .IP "\f(CWEV_TIMER\fR" 4 -.IX Item "EV_TIMER" -The \f(CW\*(C`ev_timer\*(C'\fR watcher has timed out. -.ie n .IP """EV_PERIODIC""" 4 -.el .IP "\f(CWEV_PERIODIC\fR" 4 -.IX Item "EV_PERIODIC" -The \f(CW\*(C`ev_periodic\*(C'\fR watcher has timed out. -.ie n .IP """EV_SIGNAL""" 4 -.el .IP "\f(CWEV_SIGNAL\fR" 4 -.IX Item "EV_SIGNAL" -The signal specified in the \f(CW\*(C`ev_signal\*(C'\fR watcher has been received by a thread. -.ie n .IP """EV_CHILD""" 4 -.el .IP "\f(CWEV_CHILD\fR" 4 -.IX Item "EV_CHILD" -The pid specified in the \f(CW\*(C`ev_child\*(C'\fR watcher has received a status change. -.ie n .IP """EV_STAT""" 4 -.el .IP "\f(CWEV_STAT\fR" 4 -.IX Item "EV_STAT" -The path specified in the \f(CW\*(C`ev_stat\*(C'\fR watcher changed its attributes somehow. -.ie n .IP """EV_IDLE""" 4 -.el .IP "\f(CWEV_IDLE\fR" 4 -.IX Item "EV_IDLE" -The \f(CW\*(C`ev_idle\*(C'\fR watcher has determined that you have nothing better to do. -.ie n .IP """EV_PREPARE""" 4 -.el .IP "\f(CWEV_PREPARE\fR" 4 -.IX Item "EV_PREPARE" -.PD 0 -.ie n .IP """EV_CHECK""" 4 -.el .IP "\f(CWEV_CHECK\fR" 4 -.IX Item "EV_CHECK" -.PD -All \f(CW\*(C`ev_prepare\*(C'\fR watchers are invoked just \fIbefore\fR \f(CW\*(C`ev_run\*(C'\fR starts to -gather new events, and all \f(CW\*(C`ev_check\*(C'\fR watchers are queued (not invoked) -just after \f(CW\*(C`ev_run\*(C'\fR has gathered them, but before it queues any callbacks -for any received events. That means \f(CW\*(C`ev_prepare\*(C'\fR watchers are the last -watchers invoked before the event loop sleeps or polls for new events, and -\&\f(CW\*(C`ev_check\*(C'\fR watchers will be invoked before any other watchers of the same -or lower priority within an event loop iteration. -.Sp -Callbacks of both watcher types can start and stop as many watchers as -they want, and all of them will be taken into account (for example, a -\&\f(CW\*(C`ev_prepare\*(C'\fR watcher might start an idle watcher to keep \f(CW\*(C`ev_run\*(C'\fR from -blocking). -.ie n .IP """EV_EMBED""" 4 -.el .IP "\f(CWEV_EMBED\fR" 4 -.IX Item "EV_EMBED" -The embedded event loop specified in the \f(CW\*(C`ev_embed\*(C'\fR watcher needs attention. -.ie n .IP """EV_FORK""" 4 -.el .IP "\f(CWEV_FORK\fR" 4 -.IX Item "EV_FORK" -The event loop has been resumed in the child process after fork (see -\&\f(CW\*(C`ev_fork\*(C'\fR). -.ie n .IP """EV_CLEANUP""" 4 -.el .IP "\f(CWEV_CLEANUP\fR" 4 -.IX Item "EV_CLEANUP" -The event loop is about to be destroyed (see \f(CW\*(C`ev_cleanup\*(C'\fR). -.ie n .IP """EV_ASYNC""" 4 -.el .IP "\f(CWEV_ASYNC\fR" 4 -.IX Item "EV_ASYNC" -The given async watcher has been asynchronously notified (see \f(CW\*(C`ev_async\*(C'\fR). -.ie n .IP """EV_CUSTOM""" 4 -.el .IP "\f(CWEV_CUSTOM\fR" 4 -.IX Item "EV_CUSTOM" -Not ever sent (or otherwise used) by libev itself, but can be freely used -by libev users to signal watchers (e.g. via \f(CW\*(C`ev_feed_event\*(C'\fR). -.ie n .IP """EV_ERROR""" 4 -.el .IP "\f(CWEV_ERROR\fR" 4 -.IX Item "EV_ERROR" -An unspecified error has occurred, the watcher has been stopped. This might -happen because the watcher could not be properly started because libev -ran out of memory, a file descriptor was found to be closed or any other -problem. Libev considers these application bugs. -.Sp -You best act on it by reporting the problem and somehow coping with the -watcher being stopped. Note that well-written programs should not receive -an error ever, so when your watcher receives it, this usually indicates a -bug in your program. -.Sp -Libev will usually signal a few \*(L"dummy\*(R" events together with an error, for -example it might indicate that a fd is readable or writable, and if your -callbacks is well-written it can just attempt the operation and cope with -the error from \fBread()\fR or \fBwrite()\fR. This will not work in multi-threaded -programs, though, as the fd could already be closed and reused for another -thing, so beware. -.SS "\s-1GENERIC WATCHER FUNCTIONS\s0" -.IX Subsection "GENERIC WATCHER FUNCTIONS" -.ie n .IP """ev_init"" (ev_TYPE *watcher, callback)" 4 -.el .IP "\f(CWev_init\fR (ev_TYPE *watcher, callback)" 4 -.IX Item "ev_init (ev_TYPE *watcher, callback)" -This macro initialises the generic portion of a watcher. The contents -of the watcher object can be arbitrary (so \f(CW\*(C`malloc\*(C'\fR will do). Only -the generic parts of the watcher are initialised, you \fIneed\fR to call -the type-specific \f(CW\*(C`ev_TYPE_set\*(C'\fR macro afterwards to initialise the -type-specific parts. For each type there is also a \f(CW\*(C`ev_TYPE_init\*(C'\fR macro -which rolls both calls into one. -.Sp -You can reinitialise a watcher at any time as long as it has been stopped -(or never started) and there are no pending events outstanding. -.Sp -The callback is always of type \f(CW\*(C`void (*)(struct ev_loop *loop, ev_TYPE *watcher, -int revents)\*(C'\fR. -.Sp -Example: Initialise an \f(CW\*(C`ev_io\*(C'\fR watcher in two steps. -.Sp -.Vb 3 -\& ev_io w; -\& ev_init (&w, my_cb); -\& ev_io_set (&w, STDIN_FILENO, EV_READ); -.Ve -.ie n .IP """ev_TYPE_set"" (ev_TYPE *watcher, [args])" 4 -.el .IP "\f(CWev_TYPE_set\fR (ev_TYPE *watcher, [args])" 4 -.IX Item "ev_TYPE_set (ev_TYPE *watcher, [args])" -This macro initialises the type-specific parts of a watcher. You need to -call \f(CW\*(C`ev_init\*(C'\fR at least once before you call this macro, but you can -call \f(CW\*(C`ev_TYPE_set\*(C'\fR any number of times. You must not, however, call this -macro on a watcher that is active (it can be pending, however, which is a -difference to the \f(CW\*(C`ev_init\*(C'\fR macro). -.Sp -Although some watcher types do not have type-specific arguments -(e.g. \f(CW\*(C`ev_prepare\*(C'\fR) you still need to call its \f(CW\*(C`set\*(C'\fR macro. -.Sp -See \f(CW\*(C`ev_init\*(C'\fR, above, for an example. -.ie n .IP """ev_TYPE_init"" (ev_TYPE *watcher, callback, [args])" 4 -.el .IP "\f(CWev_TYPE_init\fR (ev_TYPE *watcher, callback, [args])" 4 -.IX Item "ev_TYPE_init (ev_TYPE *watcher, callback, [args])" -This convenience macro rolls both \f(CW\*(C`ev_init\*(C'\fR and \f(CW\*(C`ev_TYPE_set\*(C'\fR macro -calls into a single call. This is the most convenient method to initialise -a watcher. The same limitations apply, of course. -.Sp -Example: Initialise and set an \f(CW\*(C`ev_io\*(C'\fR watcher in one step. -.Sp -.Vb 1 -\& ev_io_init (&w, my_cb, STDIN_FILENO, EV_READ); -.Ve -.ie n .IP """ev_TYPE_start"" (loop, ev_TYPE *watcher)" 4 -.el .IP "\f(CWev_TYPE_start\fR (loop, ev_TYPE *watcher)" 4 -.IX Item "ev_TYPE_start (loop, ev_TYPE *watcher)" -Starts (activates) the given watcher. Only active watchers will receive -events. If the watcher is already active nothing will happen. -.Sp -Example: Start the \f(CW\*(C`ev_io\*(C'\fR watcher that is being abused as example in this -whole section. -.Sp -.Vb 1 -\& ev_io_start (EV_DEFAULT_UC, &w); -.Ve -.ie n .IP """ev_TYPE_stop"" (loop, ev_TYPE *watcher)" 4 -.el .IP "\f(CWev_TYPE_stop\fR (loop, ev_TYPE *watcher)" 4 -.IX Item "ev_TYPE_stop (loop, ev_TYPE *watcher)" -Stops the given watcher if active, and clears the pending status (whether -the watcher was active or not). -.Sp -It is possible that stopped watchers are pending \- for example, -non-repeating timers are being stopped when they become pending \- but -calling \f(CW\*(C`ev_TYPE_stop\*(C'\fR ensures that the watcher is neither active nor -pending. If you want to free or reuse the memory used by the watcher it is -therefore a good idea to always call its \f(CW\*(C`ev_TYPE_stop\*(C'\fR function. -.IP "bool ev_is_active (ev_TYPE *watcher)" 4 -.IX Item "bool ev_is_active (ev_TYPE *watcher)" -Returns a true value iff the watcher is active (i.e. it has been started -and not yet been stopped). As long as a watcher is active you must not modify -it. -.IP "bool ev_is_pending (ev_TYPE *watcher)" 4 -.IX Item "bool ev_is_pending (ev_TYPE *watcher)" -Returns a true value iff the watcher is pending, (i.e. it has outstanding -events but its callback has not yet been invoked). As long as a watcher -is pending (but not active) you must not call an init function on it (but -\&\f(CW\*(C`ev_TYPE_set\*(C'\fR is safe), you must not change its priority, and you must -make sure the watcher is available to libev (e.g. you cannot \f(CW\*(C`free ()\*(C'\fR -it). -.IP "callback ev_cb (ev_TYPE *watcher)" 4 -.IX Item "callback ev_cb (ev_TYPE *watcher)" -Returns the callback currently set on the watcher. -.IP "ev_set_cb (ev_TYPE *watcher, callback)" 4 -.IX Item "ev_set_cb (ev_TYPE *watcher, callback)" -Change the callback. You can change the callback at virtually any time -(modulo threads). -.IP "ev_set_priority (ev_TYPE *watcher, int priority)" 4 -.IX Item "ev_set_priority (ev_TYPE *watcher, int priority)" -.PD 0 -.IP "int ev_priority (ev_TYPE *watcher)" 4 -.IX Item "int ev_priority (ev_TYPE *watcher)" -.PD -Set and query the priority of the watcher. The priority is a small -integer between \f(CW\*(C`EV_MAXPRI\*(C'\fR (default: \f(CW2\fR) and \f(CW\*(C`EV_MINPRI\*(C'\fR -(default: \f(CW\*(C`\-2\*(C'\fR). Pending watchers with higher priority will be invoked -before watchers with lower priority, but priority will not keep watchers -from being executed (except for \f(CW\*(C`ev_idle\*(C'\fR watchers). -.Sp -If you need to suppress invocation when higher priority events are pending -you need to look at \f(CW\*(C`ev_idle\*(C'\fR watchers, which provide this functionality. -.Sp -You \fImust not\fR change the priority of a watcher as long as it is active or -pending. -.Sp -Setting a priority outside the range of \f(CW\*(C`EV_MINPRI\*(C'\fR to \f(CW\*(C`EV_MAXPRI\*(C'\fR is -fine, as long as you do not mind that the priority value you query might -or might not have been clamped to the valid range. -.Sp -The default priority used by watchers when no priority has been set is -always \f(CW0\fR, which is supposed to not be too high and not be too low :). -.Sp -See \*(L"\s-1WATCHER PRIORITY MODELS\*(R"\s0, below, for a more thorough treatment of -priorities. -.IP "ev_invoke (loop, ev_TYPE *watcher, int revents)" 4 -.IX Item "ev_invoke (loop, ev_TYPE *watcher, int revents)" -Invoke the \f(CW\*(C`watcher\*(C'\fR with the given \f(CW\*(C`loop\*(C'\fR and \f(CW\*(C`revents\*(C'\fR. Neither -\&\f(CW\*(C`loop\*(C'\fR nor \f(CW\*(C`revents\*(C'\fR need to be valid as long as the watcher callback -can deal with that fact, as both are simply passed through to the -callback. -.IP "int ev_clear_pending (loop, ev_TYPE *watcher)" 4 -.IX Item "int ev_clear_pending (loop, ev_TYPE *watcher)" -If the watcher is pending, this function clears its pending status and -returns its \f(CW\*(C`revents\*(C'\fR bitset (as if its callback was invoked). If the -watcher isn't pending it does nothing and returns \f(CW0\fR. -.Sp -Sometimes it can be useful to \*(L"poll\*(R" a watcher instead of waiting for its -callback to be invoked, which can be accomplished with this function. -.IP "ev_feed_event (loop, ev_TYPE *watcher, int revents)" 4 -.IX Item "ev_feed_event (loop, ev_TYPE *watcher, int revents)" -Feeds the given event set into the event loop, as if the specified event -had happened for the specified watcher (which must be a pointer to an -initialised but not necessarily started event watcher). Obviously you must -not free the watcher as long as it has pending events. -.Sp -Stopping the watcher, letting libev invoke it, or calling -\&\f(CW\*(C`ev_clear_pending\*(C'\fR will clear the pending event, even if the watcher was -not started in the first place. -.Sp -See also \f(CW\*(C`ev_feed_fd_event\*(C'\fR and \f(CW\*(C`ev_feed_signal_event\*(C'\fR for related -functions that do not need a watcher. -.PP -See also the \*(L"\s-1ASSOCIATING CUSTOM DATA WITH A WATCHER\*(R"\s0 and \*(L"\s-1BUILDING YOUR -OWN COMPOSITE WATCHERS\*(R"\s0 idioms. -.SS "\s-1WATCHER STATES\s0" -.IX Subsection "WATCHER STATES" -There are various watcher states mentioned throughout this manual \- -active, pending and so on. In this section these states and the rules to -transition between them will be described in more detail \- and while these -rules might look complicated, they usually do \*(L"the right thing\*(R". -.IP "initialised" 4 -.IX Item "initialised" -Before a watcher can be registered with the event loop it has to be -initialised. This can be done with a call to \f(CW\*(C`ev_TYPE_init\*(C'\fR, or calls to -\&\f(CW\*(C`ev_init\*(C'\fR followed by the watcher-specific \f(CW\*(C`ev_TYPE_set\*(C'\fR function. -.Sp -In this state it is simply some block of memory that is suitable for -use in an event loop. It can be moved around, freed, reused etc. at -will \- as long as you either keep the memory contents intact, or call -\&\f(CW\*(C`ev_TYPE_init\*(C'\fR again. -.IP "started/running/active" 4 -.IX Item "started/running/active" -Once a watcher has been started with a call to \f(CW\*(C`ev_TYPE_start\*(C'\fR it becomes -property of the event loop, and is actively waiting for events. While in -this state it cannot be accessed (except in a few documented ways), moved, -freed or anything else \- the only legal thing is to keep a pointer to it, -and call libev functions on it that are documented to work on active watchers. -.IP "pending" 4 -.IX Item "pending" -If a watcher is active and libev determines that an event it is interested -in has occurred (such as a timer expiring), it will become pending. It will -stay in this pending state until either it is stopped or its callback is -about to be invoked, so it is not normally pending inside the watcher -callback. -.Sp -The watcher might or might not be active while it is pending (for example, -an expired non-repeating timer can be pending but no longer active). If it -is stopped, it can be freely accessed (e.g. by calling \f(CW\*(C`ev_TYPE_set\*(C'\fR), -but it is still property of the event loop at this time, so cannot be -moved, freed or reused. And if it is active the rules described in the -previous item still apply. -.Sp -It is also possible to feed an event on a watcher that is not active (e.g. -via \f(CW\*(C`ev_feed_event\*(C'\fR), in which case it becomes pending without being -active. -.IP "stopped" 4 -.IX Item "stopped" -A watcher can be stopped implicitly by libev (in which case it might still -be pending), or explicitly by calling its \f(CW\*(C`ev_TYPE_stop\*(C'\fR function. The -latter will clear any pending state the watcher might be in, regardless -of whether it was active or not, so stopping a watcher explicitly before -freeing it is often a good idea. -.Sp -While stopped (and not pending) the watcher is essentially in the -initialised state, that is, it can be reused, moved, modified in any way -you wish (but when you trash the memory block, you need to \f(CW\*(C`ev_TYPE_init\*(C'\fR -it again). -.SS "\s-1WATCHER PRIORITY MODELS\s0" -.IX Subsection "WATCHER PRIORITY MODELS" -Many event loops support \fIwatcher priorities\fR, which are usually small -integers that influence the ordering of event callback invocation -between watchers in some way, all else being equal. -.PP -In libev, watcher priorities can be set using \f(CW\*(C`ev_set_priority\*(C'\fR. See its -description for the more technical details such as the actual priority -range. -.PP -There are two common ways how these these priorities are being interpreted -by event loops: -.PP -In the more common lock-out model, higher priorities \*(L"lock out\*(R" invocation -of lower priority watchers, which means as long as higher priority -watchers receive events, lower priority watchers are not being invoked. -.PP -The less common only-for-ordering model uses priorities solely to order -callback invocation within a single event loop iteration: Higher priority -watchers are invoked before lower priority ones, but they all get invoked -before polling for new events. -.PP -Libev uses the second (only-for-ordering) model for all its watchers -except for idle watchers (which use the lock-out model). -.PP -The rationale behind this is that implementing the lock-out model for -watchers is not well supported by most kernel interfaces, and most event -libraries will just poll for the same events again and again as long as -their callbacks have not been executed, which is very inefficient in the -common case of one high-priority watcher locking out a mass of lower -priority ones. -.PP -Static (ordering) priorities are most useful when you have two or more -watchers handling the same resource: a typical usage example is having an -\&\f(CW\*(C`ev_io\*(C'\fR watcher to receive data, and an associated \f(CW\*(C`ev_timer\*(C'\fR to handle -timeouts. Under load, data might be received while the program handles -other jobs, but since timers normally get invoked first, the timeout -handler will be executed before checking for data. In that case, giving -the timer a lower priority than the I/O watcher ensures that I/O will be -handled first even under adverse conditions (which is usually, but not -always, what you want). -.PP -Since idle watchers use the \*(L"lock-out\*(R" model, meaning that idle watchers -will only be executed when no same or higher priority watchers have -received events, they can be used to implement the \*(L"lock-out\*(R" model when -required. -.PP -For example, to emulate how many other event libraries handle priorities, -you can associate an \f(CW\*(C`ev_idle\*(C'\fR watcher to each such watcher, and in -the normal watcher callback, you just start the idle watcher. The real -processing is done in the idle watcher callback. This causes libev to -continuously poll and process kernel event data for the watcher, but when -the lock-out case is known to be rare (which in turn is rare :), this is -workable. -.PP -Usually, however, the lock-out model implemented that way will perform -miserably under the type of load it was designed to handle. In that case, -it might be preferable to stop the real watcher before starting the -idle watcher, so the kernel will not have to process the event in case -the actual processing will be delayed for considerable time. -.PP -Here is an example of an I/O watcher that should run at a strictly lower -priority than the default, and which should only process data when no -other events are pending: -.PP -.Vb 2 -\& ev_idle idle; // actual processing watcher -\& ev_io io; // actual event watcher -\& -\& static void -\& io_cb (EV_P_ ev_io *w, int revents) -\& { -\& // stop the I/O watcher, we received the event, but -\& // are not yet ready to handle it. -\& ev_io_stop (EV_A_ w); -\& -\& // start the idle watcher to handle the actual event. -\& // it will not be executed as long as other watchers -\& // with the default priority are receiving events. -\& ev_idle_start (EV_A_ &idle); -\& } -\& -\& static void -\& idle_cb (EV_P_ ev_idle *w, int revents) -\& { -\& // actual processing -\& read (STDIN_FILENO, ...); -\& -\& // have to start the I/O watcher again, as -\& // we have handled the event -\& ev_io_start (EV_P_ &io); -\& } -\& -\& // initialisation -\& ev_idle_init (&idle, idle_cb); -\& ev_io_init (&io, io_cb, STDIN_FILENO, EV_READ); -\& ev_io_start (EV_DEFAULT_ &io); -.Ve -.PP -In the \*(L"real\*(R" world, it might also be beneficial to start a timer, so that -low-priority connections can not be locked out forever under load. This -enables your program to keep a lower latency for important connections -during short periods of high load, while not completely locking out less -important ones. -.SH "WATCHER TYPES" -.IX Header "WATCHER TYPES" -This section describes each watcher in detail, but will not repeat -information given in the last section. Any initialisation/set macros, -functions and members specific to the watcher type are explained. -.PP -Most members are additionally marked with either \fI[read\-only]\fR, meaning -that, while the watcher is active, you can look at the member and expect -some sensible content, but you must not modify it (you can modify it while -the watcher is stopped to your hearts content), or \fI[read\-write]\fR, which -means you can expect it to have some sensible content while the watcher is -active, but you can also modify it (within the same thread as the event -loop, i.e. without creating data races). Modifying it may not do something -sensible or take immediate effect (or do anything at all), but libev will -not crash or malfunction in any way. -.PP -In any case, the documentation for each member will explain what the -effects are, and if there are any additional access restrictions. -.ie n .SS """ev_io"" \- is this file descriptor readable or writable?" -.el .SS "\f(CWev_io\fP \- is this file descriptor readable or writable?" -.IX Subsection "ev_io - is this file descriptor readable or writable?" -I/O watchers check whether a file descriptor is readable or writable -in each iteration of the event loop, or, more precisely, when reading -would not block the process and writing would at least be able to write -some data. This behaviour is called level-triggering because you keep -receiving events as long as the condition persists. Remember you can stop -the watcher if you don't want to act on the event and neither want to -receive future events. -.PP -In general you can register as many read and/or write event watchers per -fd as you want (as long as you don't confuse yourself). Setting all file -descriptors to non-blocking mode is also usually a good idea (but not -required if you know what you are doing). -.PP -Another thing you have to watch out for is that it is quite easy to -receive \*(L"spurious\*(R" readiness notifications, that is, your callback might -be called with \f(CW\*(C`EV_READ\*(C'\fR but a subsequent \f(CW\*(C`read\*(C'\fR(2) will actually block -because there is no data. It is very easy to get into this situation even -with a relatively standard program structure. Thus it is best to always -use non-blocking I/O: An extra \f(CW\*(C`read\*(C'\fR(2) returning \f(CW\*(C`EAGAIN\*(C'\fR is far -preferable to a program hanging until some data arrives. -.PP -If you cannot run the fd in non-blocking mode (for example you should -not play around with an Xlib connection), then you have to separately -re-test whether a file descriptor is really ready with a known-to-be good -interface such as poll (fortunately in the case of Xlib, it already does -this on its own, so its quite safe to use). Some people additionally -use \f(CW\*(C`SIGALRM\*(C'\fR and an interval timer, just to be sure you won't block -indefinitely. -.PP -But really, best use non-blocking mode. -.PP -\fIThe special problem of disappearing file descriptors\fR -.IX Subsection "The special problem of disappearing file descriptors" -.PP -Some backends (e.g. kqueue, epoll, linuxaio) need to be told about closing -a file descriptor (either due to calling \f(CW\*(C`close\*(C'\fR explicitly or any other -means, such as \f(CW\*(C`dup2\*(C'\fR). The reason is that you register interest in some -file descriptor, but when it goes away, the operating system will silently -drop this interest. If another file descriptor with the same number then -is registered with libev, there is no efficient way to see that this is, -in fact, a different file descriptor. -.PP -To avoid having to explicitly tell libev about such cases, libev follows -the following policy: Each time \f(CW\*(C`ev_io_set\*(C'\fR is being called, libev -will assume that this is potentially a new file descriptor, otherwise -it is assumed that the file descriptor stays the same. That means that -you \fIhave\fR to call \f(CW\*(C`ev_io_set\*(C'\fR (or \f(CW\*(C`ev_io_init\*(C'\fR) when you change the -descriptor even if the file descriptor number itself did not change. -.PP -This is how one would do it normally anyway, the important point is that -the libev application should not optimise around libev but should leave -optimisations to libev. -.PP -\fIThe special problem of dup'ed file descriptors\fR -.IX Subsection "The special problem of dup'ed file descriptors" -.PP -Some backends (e.g. epoll), cannot register events for file descriptors, -but only events for the underlying file descriptions. That means when you -have \f(CW\*(C`dup ()\*(C'\fR'ed file descriptors or weirder constellations, and register -events for them, only one file descriptor might actually receive events. -.PP -There is no workaround possible except not registering events -for potentially \f(CW\*(C`dup ()\*(C'\fR'ed file descriptors, or to resort to -\&\f(CW\*(C`EVBACKEND_SELECT\*(C'\fR or \f(CW\*(C`EVBACKEND_POLL\*(C'\fR. -.PP -\fIThe special problem of files\fR -.IX Subsection "The special problem of files" -.PP -Many people try to use \f(CW\*(C`select\*(C'\fR (or libev) on file descriptors -representing files, and expect it to become ready when their program -doesn't block on disk accesses (which can take a long time on their own). -.PP -However, this cannot ever work in the \*(L"expected\*(R" way \- you get a readiness -notification as soon as the kernel knows whether and how much data is -there, and in the case of open files, that's always the case, so you -always get a readiness notification instantly, and your read (or possibly -write) will still block on the disk I/O. -.PP -Another way to view it is that in the case of sockets, pipes, character -devices and so on, there is another party (the sender) that delivers data -on its own, but in the case of files, there is no such thing: the disk -will not send data on its own, simply because it doesn't know what you -wish to read \- you would first have to request some data. -.PP -Since files are typically not-so-well supported by advanced notification -mechanism, libev tries hard to emulate \s-1POSIX\s0 behaviour with respect -to files, even though you should not use it. The reason for this is -convenience: sometimes you want to watch \s-1STDIN\s0 or \s-1STDOUT,\s0 which is -usually a tty, often a pipe, but also sometimes files or special devices -(for example, \f(CW\*(C`epoll\*(C'\fR on Linux works with \fI/dev/random\fR but not with -\&\fI/dev/urandom\fR), and even though the file might better be served with -asynchronous I/O instead of with non-blocking I/O, it is still useful when -it \*(L"just works\*(R" instead of freezing. -.PP -So avoid file descriptors pointing to files when you know it (e.g. use -libeio), but use them when it is convenient, e.g. for \s-1STDIN/STDOUT,\s0 or -when you rarely read from a file instead of from a socket, and want to -reuse the same code path. -.PP -\fIThe special problem of fork\fR -.IX Subsection "The special problem of fork" -.PP -Some backends (epoll, kqueue, linuxaio, iouring) do not support \f(CW\*(C`fork ()\*(C'\fR -at all or exhibit useless behaviour. Libev fully supports fork, but needs -to be told about it in the child if you want to continue to use it in the -child. -.PP -To support fork in your child processes, you have to call \f(CW\*(C`ev_loop_fork -()\*(C'\fR after a fork in the child, enable \f(CW\*(C`EVFLAG_FORKCHECK\*(C'\fR, or resort to -\&\f(CW\*(C`EVBACKEND_SELECT\*(C'\fR or \f(CW\*(C`EVBACKEND_POLL\*(C'\fR. -.PP -\fIThe special problem of \s-1SIGPIPE\s0\fR -.IX Subsection "The special problem of SIGPIPE" -.PP -While not really specific to libev, it is easy to forget about \f(CW\*(C`SIGPIPE\*(C'\fR: -when writing to a pipe whose other end has been closed, your program gets -sent a \s-1SIGPIPE,\s0 which, by default, aborts your program. For most programs -this is sensible behaviour, for daemons, this is usually undesirable. -.PP -So when you encounter spurious, unexplained daemon exits, make sure you -ignore \s-1SIGPIPE\s0 (and maybe make sure you log the exit status of your daemon -somewhere, as that would have given you a big clue). -.PP -\fIThe special problem of \f(BIaccept()\fIing when you can't\fR -.IX Subsection "The special problem of accept()ing when you can't" -.PP -Many implementations of the \s-1POSIX\s0 \f(CW\*(C`accept\*(C'\fR function (for example, -found in post\-2004 Linux) have the peculiar behaviour of not removing a -connection from the pending queue in all error cases. -.PP -For example, larger servers often run out of file descriptors (because -of resource limits), causing \f(CW\*(C`accept\*(C'\fR to fail with \f(CW\*(C`ENFILE\*(C'\fR but not -rejecting the connection, leading to libev signalling readiness on -the next iteration again (the connection still exists after all), and -typically causing the program to loop at 100% \s-1CPU\s0 usage. -.PP -Unfortunately, the set of errors that cause this issue differs between -operating systems, there is usually little the app can do to remedy the -situation, and no known thread-safe method of removing the connection to -cope with overload is known (to me). -.PP -One of the easiest ways to handle this situation is to just ignore it -\&\- when the program encounters an overload, it will just loop until the -situation is over. While this is a form of busy waiting, no \s-1OS\s0 offers an -event-based way to handle this situation, so it's the best one can do. -.PP -A better way to handle the situation is to log any errors other than -\&\f(CW\*(C`EAGAIN\*(C'\fR and \f(CW\*(C`EWOULDBLOCK\*(C'\fR, making sure not to flood the log with such -messages, and continue as usual, which at least gives the user an idea of -what could be wrong (\*(L"raise the ulimit!\*(R"). For extra points one could stop -the \f(CW\*(C`ev_io\*(C'\fR watcher on the listening fd \*(L"for a while\*(R", which reduces \s-1CPU\s0 -usage. -.PP -If your program is single-threaded, then you could also keep a dummy file -descriptor for overload situations (e.g. by opening \fI/dev/null\fR), and -when you run into \f(CW\*(C`ENFILE\*(C'\fR or \f(CW\*(C`EMFILE\*(C'\fR, close it, run \f(CW\*(C`accept\*(C'\fR, -close that fd, and create a new dummy fd. This will gracefully refuse -clients under typical overload conditions. -.PP -The last way to handle it is to simply log the error and \f(CW\*(C`exit\*(C'\fR, as -is often done with \f(CW\*(C`malloc\*(C'\fR failures, but this results in an easy -opportunity for a DoS attack. -.PP -\fIWatcher-Specific Functions\fR -.IX Subsection "Watcher-Specific Functions" -.IP "ev_io_init (ev_io *, callback, int fd, int events)" 4 -.IX Item "ev_io_init (ev_io *, callback, int fd, int events)" -.PD 0 -.IP "ev_io_set (ev_io *, int fd, int events)" 4 -.IX Item "ev_io_set (ev_io *, int fd, int events)" -.PD -Configures an \f(CW\*(C`ev_io\*(C'\fR watcher. The \f(CW\*(C`fd\*(C'\fR is the file descriptor to -receive events for and \f(CW\*(C`events\*(C'\fR is either \f(CW\*(C`EV_READ\*(C'\fR, \f(CW\*(C`EV_WRITE\*(C'\fR, both -\&\f(CW\*(C`EV_READ | EV_WRITE\*(C'\fR or \f(CW0\fR, to express the desire to receive the given -events. -.Sp -Note that setting the \f(CW\*(C`events\*(C'\fR to \f(CW0\fR and starting the watcher is -supported, but not specially optimized \- if your program sometimes happens -to generate this combination this is fine, but if it is easy to avoid -starting an io watcher watching for no events you should do so. -.IP "ev_io_modify (ev_io *, int events)" 4 -.IX Item "ev_io_modify (ev_io *, int events)" -Similar to \f(CW\*(C`ev_io_set\*(C'\fR, but only changes the requested events. Using this -might be faster with some backends, as libev can assume that the \f(CW\*(C`fd\*(C'\fR -still refers to the same underlying file description, something it cannot -do when using \f(CW\*(C`ev_io_set\*(C'\fR. -.IP "int fd [no\-modify]" 4 -.IX Item "int fd [no-modify]" -The file descriptor being watched. While it can be read at any time, you -must not modify this member even when the watcher is stopped \- always use -\&\f(CW\*(C`ev_io_set\*(C'\fR for that. -.IP "int events [no\-modify]" 4 -.IX Item "int events [no-modify]" -The set of events the fd is being watched for, among other flags. Remember -that this is a bit set \- to test for \f(CW\*(C`EV_READ\*(C'\fR, use \f(CW\*(C`w\->events & -EV_READ\*(C'\fR, and similarly for \f(CW\*(C`EV_WRITE\*(C'\fR. -.Sp -As with \f(CW\*(C`fd\*(C'\fR, you must not modify this member even when the watcher is -stopped, always use \f(CW\*(C`ev_io_set\*(C'\fR or \f(CW\*(C`ev_io_modify\*(C'\fR for that. -.PP -\fIExamples\fR -.IX Subsection "Examples" -.PP -Example: Call \f(CW\*(C`stdin_readable_cb\*(C'\fR when \s-1STDIN_FILENO\s0 has become, well -readable, but only once. Since it is likely line-buffered, you could -attempt to read a whole line in the callback. -.PP -.Vb 6 -\& static void -\& stdin_readable_cb (struct ev_loop *loop, ev_io *w, int revents) -\& { -\& ev_io_stop (loop, w); -\& .. read from stdin here (or from w\->fd) and handle any I/O errors -\& } -\& -\& ... -\& struct ev_loop *loop = ev_default_init (0); -\& ev_io stdin_readable; -\& ev_io_init (&stdin_readable, stdin_readable_cb, STDIN_FILENO, EV_READ); -\& ev_io_start (loop, &stdin_readable); -\& ev_run (loop, 0); -.Ve -.ie n .SS """ev_timer"" \- relative and optionally repeating timeouts" -.el .SS "\f(CWev_timer\fP \- relative and optionally repeating timeouts" -.IX Subsection "ev_timer - relative and optionally repeating timeouts" -Timer watchers are simple relative timers that generate an event after a -given time, and optionally repeating in regular intervals after that. -.PP -The timers are based on real time, that is, if you register an event that -times out after an hour and you reset your system clock to January last -year, it will still time out after (roughly) one hour. \*(L"Roughly\*(R" because -detecting time jumps is hard, and some inaccuracies are unavoidable (the -monotonic clock option helps a lot here). -.PP -The callback is guaranteed to be invoked only \fIafter\fR its timeout has -passed (not \fIat\fR, so on systems with very low-resolution clocks this -might introduce a small delay, see \*(L"the special problem of being too -early\*(R", below). If multiple timers become ready during the same loop -iteration then the ones with earlier time-out values are invoked before -ones of the same priority with later time-out values (but this is no -longer true when a callback calls \f(CW\*(C`ev_run\*(C'\fR recursively). -.PP -\fIBe smart about timeouts\fR -.IX Subsection "Be smart about timeouts" -.PP -Many real-world problems involve some kind of timeout, usually for error -recovery. A typical example is an \s-1HTTP\s0 request \- if the other side hangs, -you want to raise some error after a while. -.PP -What follows are some ways to handle this problem, from obvious and -inefficient to smart and efficient. -.PP -In the following, a 60 second activity timeout is assumed \- a timeout that -gets reset to 60 seconds each time there is activity (e.g. each time some -data or other life sign was received). -.IP "1. Use a timer and stop, reinitialise and start it on activity." 4 -.IX Item "1. Use a timer and stop, reinitialise and start it on activity." -This is the most obvious, but not the most simple way: In the beginning, -start the watcher: -.Sp -.Vb 2 -\& ev_timer_init (timer, callback, 60., 0.); -\& ev_timer_start (loop, timer); -.Ve -.Sp -Then, each time there is some activity, \f(CW\*(C`ev_timer_stop\*(C'\fR it, initialise it -and start it again: -.Sp -.Vb 3 -\& ev_timer_stop (loop, timer); -\& ev_timer_set (timer, 60., 0.); -\& ev_timer_start (loop, timer); -.Ve -.Sp -This is relatively simple to implement, but means that each time there is -some activity, libev will first have to remove the timer from its internal -data structure and then add it again. Libev tries to be fast, but it's -still not a constant-time operation. -.ie n .IP "2. Use a timer and re-start it with ""ev_timer_again"" inactivity." 4 -.el .IP "2. Use a timer and re-start it with \f(CWev_timer_again\fR inactivity." 4 -.IX Item "2. Use a timer and re-start it with ev_timer_again inactivity." -This is the easiest way, and involves using \f(CW\*(C`ev_timer_again\*(C'\fR instead of -\&\f(CW\*(C`ev_timer_start\*(C'\fR. -.Sp -To implement this, configure an \f(CW\*(C`ev_timer\*(C'\fR with a \f(CW\*(C`repeat\*(C'\fR value -of \f(CW60\fR and then call \f(CW\*(C`ev_timer_again\*(C'\fR at start and each time you -successfully read or write some data. If you go into an idle state where -you do not expect data to travel on the socket, you can \f(CW\*(C`ev_timer_stop\*(C'\fR -the timer, and \f(CW\*(C`ev_timer_again\*(C'\fR will automatically restart it if need be. -.Sp -That means you can ignore both the \f(CW\*(C`ev_timer_start\*(C'\fR function and the -\&\f(CW\*(C`after\*(C'\fR argument to \f(CW\*(C`ev_timer_set\*(C'\fR, and only ever use the \f(CW\*(C`repeat\*(C'\fR -member and \f(CW\*(C`ev_timer_again\*(C'\fR. -.Sp -At start: -.Sp -.Vb 3 -\& ev_init (timer, callback); -\& timer\->repeat = 60.; -\& ev_timer_again (loop, timer); -.Ve -.Sp -Each time there is some activity: -.Sp -.Vb 1 -\& ev_timer_again (loop, timer); -.Ve -.Sp -It is even possible to change the time-out on the fly, regardless of -whether the watcher is active or not: -.Sp -.Vb 2 -\& timer\->repeat = 30.; -\& ev_timer_again (loop, timer); -.Ve -.Sp -This is slightly more efficient then stopping/starting the timer each time -you want to modify its timeout value, as libev does not have to completely -remove and re-insert the timer from/into its internal data structure. -.Sp -It is, however, even simpler than the \*(L"obvious\*(R" way to do it. -.IP "3. Let the timer time out, but then re-arm it as required." 4 -.IX Item "3. Let the timer time out, but then re-arm it as required." -This method is more tricky, but usually most efficient: Most timeouts are -relatively long compared to the intervals between other activity \- in -our example, within 60 seconds, there are usually many I/O events with -associated activity resets. -.Sp -In this case, it would be more efficient to leave the \f(CW\*(C`ev_timer\*(C'\fR alone, -but remember the time of last activity, and check for a real timeout only -within the callback: -.Sp -.Vb 3 -\& ev_tstamp timeout = 60.; -\& ev_tstamp last_activity; // time of last activity -\& ev_timer timer; -\& -\& static void -\& callback (EV_P_ ev_timer *w, int revents) -\& { -\& // calculate when the timeout would happen -\& ev_tstamp after = last_activity \- ev_now (EV_A) + timeout; -\& -\& // if negative, it means we the timeout already occurred -\& if (after < 0.) -\& { -\& // timeout occurred, take action -\& } -\& else -\& { -\& // callback was invoked, but there was some recent -\& // activity. simply restart the timer to time out -\& // after "after" seconds, which is the earliest time -\& // the timeout can occur. -\& ev_timer_set (w, after, 0.); -\& ev_timer_start (EV_A_ w); -\& } -\& } -.Ve -.Sp -To summarise the callback: first calculate in how many seconds the -timeout will occur (by calculating the absolute time when it would occur, -\&\f(CW\*(C`last_activity + timeout\*(C'\fR, and subtracting the current time, \f(CW\*(C`ev_now -(EV_A)\*(C'\fR from that). -.Sp -If this value is negative, then we are already past the timeout, i.e. we -timed out, and need to do whatever is needed in this case. -.Sp -Otherwise, we now the earliest time at which the timeout would trigger, -and simply start the timer with this timeout value. -.Sp -In other words, each time the callback is invoked it will check whether -the timeout occurred. If not, it will simply reschedule itself to check -again at the earliest time it could time out. Rinse. Repeat. -.Sp -This scheme causes more callback invocations (about one every 60 seconds -minus half the average time between activity), but virtually no calls to -libev to change the timeout. -.Sp -To start the machinery, simply initialise the watcher and set -\&\f(CW\*(C`last_activity\*(C'\fR to the current time (meaning there was some activity just -now), then call the callback, which will \*(L"do the right thing\*(R" and start -the timer: -.Sp -.Vb 3 -\& last_activity = ev_now (EV_A); -\& ev_init (&timer, callback); -\& callback (EV_A_ &timer, 0); -.Ve -.Sp -When there is some activity, simply store the current time in -\&\f(CW\*(C`last_activity\*(C'\fR, no libev calls at all: -.Sp -.Vb 2 -\& if (activity detected) -\& last_activity = ev_now (EV_A); -.Ve -.Sp -When your timeout value changes, then the timeout can be changed by simply -providing a new value, stopping the timer and calling the callback, which -will again do the right thing (for example, time out immediately :). -.Sp -.Vb 3 -\& timeout = new_value; -\& ev_timer_stop (EV_A_ &timer); -\& callback (EV_A_ &timer, 0); -.Ve -.Sp -This technique is slightly more complex, but in most cases where the -time-out is unlikely to be triggered, much more efficient. -.IP "4. Wee, just use a double-linked list for your timeouts." 4 -.IX Item "4. Wee, just use a double-linked list for your timeouts." -If there is not one request, but many thousands (millions...), all -employing some kind of timeout with the same timeout value, then one can -do even better: -.Sp -When starting the timeout, calculate the timeout value and put the timeout -at the \fIend\fR of the list. -.Sp -Then use an \f(CW\*(C`ev_timer\*(C'\fR to fire when the timeout at the \fIbeginning\fR of -the list is expected to fire (for example, using the technique #3). -.Sp -When there is some activity, remove the timer from the list, recalculate -the timeout, append it to the end of the list again, and make sure to -update the \f(CW\*(C`ev_timer\*(C'\fR if it was taken from the beginning of the list. -.Sp -This way, one can manage an unlimited number of timeouts in O(1) time for -starting, stopping and updating the timers, at the expense of a major -complication, and having to use a constant timeout. The constant timeout -ensures that the list stays sorted. -.PP -So which method the best? -.PP -Method #2 is a simple no-brain-required solution that is adequate in most -situations. Method #3 requires a bit more thinking, but handles many cases -better, and isn't very complicated either. In most case, choosing either -one is fine, with #3 being better in typical situations. -.PP -Method #1 is almost always a bad idea, and buys you nothing. Method #4 is -rather complicated, but extremely efficient, something that really pays -off after the first million or so of active timers, i.e. it's usually -overkill :) -.PP -\fIThe special problem of being too early\fR -.IX Subsection "The special problem of being too early" -.PP -If you ask a timer to call your callback after three seconds, then -you expect it to be invoked after three seconds \- but of course, this -cannot be guaranteed to infinite precision. Less obviously, it cannot be -guaranteed to any precision by libev \- imagine somebody suspending the -process with a \s-1STOP\s0 signal for a few hours for example. -.PP -So, libev tries to invoke your callback as soon as possible \fIafter\fR the -delay has occurred, but cannot guarantee this. -.PP -A less obvious failure mode is calling your callback too early: many event -loops compare timestamps with a \*(L"elapsed delay >= requested delay\*(R", but -this can cause your callback to be invoked much earlier than you would -expect. -.PP -To see why, imagine a system with a clock that only offers full second -resolution (think windows if you can't come up with a broken enough \s-1OS\s0 -yourself). If you schedule a one-second timer at the time 500.9, then the -event loop will schedule your timeout to elapse at a system time of 500 -(500.9 truncated to the resolution) + 1, or 501. -.PP -If an event library looks at the timeout 0.1s later, it will see \*(L"501 >= -501\*(R" and invoke the callback 0.1s after it was started, even though a -one-second delay was requested \- this is being \*(L"too early\*(R", despite best -intentions. -.PP -This is the reason why libev will never invoke the callback if the elapsed -delay equals the requested delay, but only when the elapsed delay is -larger than the requested delay. In the example above, libev would only invoke -the callback at system time 502, or 1.1s after the timer was started. -.PP -So, while libev cannot guarantee that your callback will be invoked -exactly when requested, it \fIcan\fR and \fIdoes\fR guarantee that the requested -delay has actually elapsed, or in other words, it always errs on the \*(L"too -late\*(R" side of things. -.PP -\fIThe special problem of time updates\fR -.IX Subsection "The special problem of time updates" -.PP -Establishing the current time is a costly operation (it usually takes -at least one system call): \s-1EV\s0 therefore updates its idea of the current -time only before and after \f(CW\*(C`ev_run\*(C'\fR collects new events, which causes a -growing difference between \f(CW\*(C`ev_now ()\*(C'\fR and \f(CW\*(C`ev_time ()\*(C'\fR when handling -lots of events in one iteration. -.PP -The relative timeouts are calculated relative to the \f(CW\*(C`ev_now ()\*(C'\fR -time. This is usually the right thing as this timestamp refers to the time -of the event triggering whatever timeout you are modifying/starting. If -you suspect event processing to be delayed and you \fIneed\fR to base the -timeout on the current time, use something like the following to adjust -for it: -.PP -.Vb 1 -\& ev_timer_set (&timer, after + (ev_time () \- ev_now ()), 0.); -.Ve -.PP -If the event loop is suspended for a long time, you can also force an -update of the time returned by \f(CW\*(C`ev_now ()\*(C'\fR by calling \f(CW\*(C`ev_now_update -()\*(C'\fR, although that will push the event time of all outstanding events -further into the future. -.PP -\fIThe special problem of unsynchronised clocks\fR -.IX Subsection "The special problem of unsynchronised clocks" -.PP -Modern systems have a variety of clocks \- libev itself uses the normal -\&\*(L"wall clock\*(R" clock and, if available, the monotonic clock (to avoid time -jumps). -.PP -Neither of these clocks is synchronised with each other or any other clock -on the system, so \f(CW\*(C`ev_time ()\*(C'\fR might return a considerably different time -than \f(CW\*(C`gettimeofday ()\*(C'\fR or \f(CW\*(C`time ()\*(C'\fR. On a GNU/Linux system, for example, -a call to \f(CW\*(C`gettimeofday\*(C'\fR might return a second count that is one higher -than a directly following call to \f(CW\*(C`time\*(C'\fR. -.PP -The moral of this is to only compare libev-related timestamps with -\&\f(CW\*(C`ev_time ()\*(C'\fR and \f(CW\*(C`ev_now ()\*(C'\fR, at least if you want better precision than -a second or so. -.PP -One more problem arises due to this lack of synchronisation: if libev uses -the system monotonic clock and you compare timestamps from \f(CW\*(C`ev_time\*(C'\fR -or \f(CW\*(C`ev_now\*(C'\fR from when you started your timer and when your callback is -invoked, you will find that sometimes the callback is a bit \*(L"early\*(R". -.PP -This is because \f(CW\*(C`ev_timer\*(C'\fRs work in real time, not wall clock time, so -libev makes sure your callback is not invoked before the delay happened, -\&\fImeasured according to the real time\fR, not the system clock. -.PP -If your timeouts are based on a physical timescale (e.g. \*(L"time out this -connection after 100 seconds\*(R") then this shouldn't bother you as it is -exactly the right behaviour. -.PP -If you want to compare wall clock/system timestamps to your timers, then -you need to use \f(CW\*(C`ev_periodic\*(C'\fRs, as these are based on the wall clock -time, where your comparisons will always generate correct results. -.PP -\fIThe special problems of suspended animation\fR -.IX Subsection "The special problems of suspended animation" -.PP -When you leave the server world it is quite customary to hit machines that -can suspend/hibernate \- what happens to the clocks during such a suspend? -.PP -Some quick tests made with a Linux 2.6.28 indicate that a suspend freezes -all processes, while the clocks (\f(CW\*(C`times\*(C'\fR, \f(CW\*(C`CLOCK_MONOTONIC\*(C'\fR) continue -to run until the system is suspended, but they will not advance while the -system is suspended. That means, on resume, it will be as if the program -was frozen for a few seconds, but the suspend time will not be counted -towards \f(CW\*(C`ev_timer\*(C'\fR when a monotonic clock source is used. The real time -clock advanced as expected, but if it is used as sole clocksource, then a -long suspend would be detected as a time jump by libev, and timers would -be adjusted accordingly. -.PP -I would not be surprised to see different behaviour in different between -operating systems, \s-1OS\s0 versions or even different hardware. -.PP -The other form of suspend (job control, or sending a \s-1SIGSTOP\s0) will see a -time jump in the monotonic clocks and the realtime clock. If the program -is suspended for a very long time, and monotonic clock sources are in use, -then you can expect \f(CW\*(C`ev_timer\*(C'\fRs to expire as the full suspension time -will be counted towards the timers. When no monotonic clock source is in -use, then libev will again assume a timejump and adjust accordingly. -.PP -It might be beneficial for this latter case to call \f(CW\*(C`ev_suspend\*(C'\fR -and \f(CW\*(C`ev_resume\*(C'\fR in code that handles \f(CW\*(C`SIGTSTP\*(C'\fR, to at least get -deterministic behaviour in this case (you can do nothing against -\&\f(CW\*(C`SIGSTOP\*(C'\fR). -.PP -\fIWatcher-Specific Functions and Data Members\fR -.IX Subsection "Watcher-Specific Functions and Data Members" -.IP "ev_timer_init (ev_timer *, callback, ev_tstamp after, ev_tstamp repeat)" 4 -.IX Item "ev_timer_init (ev_timer *, callback, ev_tstamp after, ev_tstamp repeat)" -.PD 0 -.IP "ev_timer_set (ev_timer *, ev_tstamp after, ev_tstamp repeat)" 4 -.IX Item "ev_timer_set (ev_timer *, ev_tstamp after, ev_tstamp repeat)" -.PD -Configure the timer to trigger after \f(CW\*(C`after\*(C'\fR seconds (fractional and -negative values are supported). If \f(CW\*(C`repeat\*(C'\fR is \f(CW0.\fR, then it will -automatically be stopped once the timeout is reached. If it is positive, -then the timer will automatically be configured to trigger again \f(CW\*(C`repeat\*(C'\fR -seconds later, again, and again, until stopped manually. -.Sp -The timer itself will do a best-effort at avoiding drift, that is, if -you configure a timer to trigger every 10 seconds, then it will normally -trigger at exactly 10 second intervals. If, however, your program cannot -keep up with the timer (because it takes longer than those 10 seconds to -do stuff) the timer will not fire more than once per event loop iteration. -.IP "ev_timer_again (loop, ev_timer *)" 4 -.IX Item "ev_timer_again (loop, ev_timer *)" -This will act as if the timer timed out, and restarts it again if it is -repeating. It basically works like calling \f(CW\*(C`ev_timer_stop\*(C'\fR, updating the -timeout to the \f(CW\*(C`repeat\*(C'\fR value and calling \f(CW\*(C`ev_timer_start\*(C'\fR. -.Sp -The exact semantics are as in the following rules, all of which will be -applied to the watcher: -.RS 4 -.IP "If the timer is pending, the pending status is always cleared." 4 -.IX Item "If the timer is pending, the pending status is always cleared." -.PD 0 -.IP "If the timer is started but non-repeating, stop it (as if it timed out, without invoking it)." 4 -.IX Item "If the timer is started but non-repeating, stop it (as if it timed out, without invoking it)." -.ie n .IP "If the timer is repeating, make the ""repeat"" value the new timeout and start the timer, if necessary." 4 -.el .IP "If the timer is repeating, make the \f(CWrepeat\fR value the new timeout and start the timer, if necessary." 4 -.IX Item "If the timer is repeating, make the repeat value the new timeout and start the timer, if necessary." -.RE -.RS 4 -.PD -.Sp -This sounds a bit complicated, see \*(L"Be smart about timeouts\*(R", above, for a -usage example. -.RE -.IP "ev_tstamp ev_timer_remaining (loop, ev_timer *)" 4 -.IX Item "ev_tstamp ev_timer_remaining (loop, ev_timer *)" -Returns the remaining time until a timer fires. If the timer is active, -then this time is relative to the current event loop time, otherwise it's -the timeout value currently configured. -.Sp -That is, after an \f(CW\*(C`ev_timer_set (w, 5, 7)\*(C'\fR, \f(CW\*(C`ev_timer_remaining\*(C'\fR returns -\&\f(CW5\fR. When the timer is started and one second passes, \f(CW\*(C`ev_timer_remaining\*(C'\fR -will return \f(CW4\fR. When the timer expires and is restarted, it will return -roughly \f(CW7\fR (likely slightly less as callback invocation takes some time, -too), and so on. -.IP "ev_tstamp repeat [read\-write]" 4 -.IX Item "ev_tstamp repeat [read-write]" -The current \f(CW\*(C`repeat\*(C'\fR value. Will be used each time the watcher times out -or \f(CW\*(C`ev_timer_again\*(C'\fR is called, and determines the next timeout (if any), -which is also when any modifications are taken into account. -.PP -\fIExamples\fR -.IX Subsection "Examples" -.PP -Example: Create a timer that fires after 60 seconds. -.PP -.Vb 5 -\& static void -\& one_minute_cb (struct ev_loop *loop, ev_timer *w, int revents) -\& { -\& .. one minute over, w is actually stopped right here -\& } -\& -\& ev_timer mytimer; -\& ev_timer_init (&mytimer, one_minute_cb, 60., 0.); -\& ev_timer_start (loop, &mytimer); -.Ve -.PP -Example: Create a timeout timer that times out after 10 seconds of -inactivity. -.PP -.Vb 5 -\& static void -\& timeout_cb (struct ev_loop *loop, ev_timer *w, int revents) -\& { -\& .. ten seconds without any activity -\& } -\& -\& ev_timer mytimer; -\& ev_timer_init (&mytimer, timeout_cb, 0., 10.); /* note, only repeat used */ -\& ev_timer_again (&mytimer); /* start timer */ -\& ev_run (loop, 0); -\& -\& // and in some piece of code that gets executed on any "activity": -\& // reset the timeout to start ticking again at 10 seconds -\& ev_timer_again (&mytimer); -.Ve -.ie n .SS """ev_periodic"" \- to cron or not to cron?" -.el .SS "\f(CWev_periodic\fP \- to cron or not to cron?" -.IX Subsection "ev_periodic - to cron or not to cron?" -Periodic watchers are also timers of a kind, but they are very versatile -(and unfortunately a bit complex). -.PP -Unlike \f(CW\*(C`ev_timer\*(C'\fR, periodic watchers are not based on real time (or -relative time, the physical time that passes) but on wall clock time -(absolute time, the thing you can read on your calendar or clock). The -difference is that wall clock time can run faster or slower than real -time, and time jumps are not uncommon (e.g. when you adjust your -wrist-watch). -.PP -You can tell a periodic watcher to trigger after some specific point -in time: for example, if you tell a periodic watcher to trigger \*(L"in 10 -seconds\*(R" (by specifying e.g. \f(CW\*(C`ev_now () + 10.\*(C'\fR, that is, an absolute time -not a delay) and then reset your system clock to January of the previous -year, then it will take a year or more to trigger the event (unlike an -\&\f(CW\*(C`ev_timer\*(C'\fR, which would still trigger roughly 10 seconds after starting -it, as it uses a relative timeout). -.PP -\&\f(CW\*(C`ev_periodic\*(C'\fR watchers can also be used to implement vastly more complex -timers, such as triggering an event on each \*(L"midnight, local time\*(R", or -other complicated rules. This cannot easily be done with \f(CW\*(C`ev_timer\*(C'\fR -watchers, as those cannot react to time jumps. -.PP -As with timers, the callback is guaranteed to be invoked only when the -point in time where it is supposed to trigger has passed. If multiple -timers become ready during the same loop iteration then the ones with -earlier time-out values are invoked before ones with later time-out values -(but this is no longer true when a callback calls \f(CW\*(C`ev_run\*(C'\fR recursively). -.PP -\fIWatcher-Specific Functions and Data Members\fR -.IX Subsection "Watcher-Specific Functions and Data Members" -.IP "ev_periodic_init (ev_periodic *, callback, ev_tstamp offset, ev_tstamp interval, reschedule_cb)" 4 -.IX Item "ev_periodic_init (ev_periodic *, callback, ev_tstamp offset, ev_tstamp interval, reschedule_cb)" -.PD 0 -.IP "ev_periodic_set (ev_periodic *, ev_tstamp offset, ev_tstamp interval, reschedule_cb)" 4 -.IX Item "ev_periodic_set (ev_periodic *, ev_tstamp offset, ev_tstamp interval, reschedule_cb)" -.PD -Lots of arguments, let's sort it out... There are basically three modes of -operation, and we will explain them from simplest to most complex: -.RS 4 -.IP "\(bu" 4 -absolute timer (offset = absolute time, interval = 0, reschedule_cb = 0) -.Sp -In this configuration the watcher triggers an event after the wall clock -time \f(CW\*(C`offset\*(C'\fR has passed. It will not repeat and will not adjust when a -time jump occurs, that is, if it is to be run at January 1st 2011 then it -will be stopped and invoked when the system clock reaches or surpasses -this point in time. -.IP "\(bu" 4 -repeating interval timer (offset = offset within interval, interval > 0, reschedule_cb = 0) -.Sp -In this mode the watcher will always be scheduled to time out at the next -\&\f(CW\*(C`offset + N * interval\*(C'\fR time (for some integer N, which can also be -negative) and then repeat, regardless of any time jumps. The \f(CW\*(C`offset\*(C'\fR -argument is merely an offset into the \f(CW\*(C`interval\*(C'\fR periods. -.Sp -This can be used to create timers that do not drift with respect to the -system clock, for example, here is an \f(CW\*(C`ev_periodic\*(C'\fR that triggers each -hour, on the hour (with respect to \s-1UTC\s0): -.Sp -.Vb 1 -\& ev_periodic_set (&periodic, 0., 3600., 0); -.Ve -.Sp -This doesn't mean there will always be 3600 seconds in between triggers, -but only that the callback will be called when the system time shows a -full hour (\s-1UTC\s0), or more correctly, when the system time is evenly divisible -by 3600. -.Sp -Another way to think about it (for the mathematically inclined) is that -\&\f(CW\*(C`ev_periodic\*(C'\fR will try to run the callback in this mode at the next possible -time where \f(CW\*(C`time = offset (mod interval)\*(C'\fR, regardless of any time jumps. -.Sp -The \f(CW\*(C`interval\*(C'\fR \fI\s-1MUST\s0\fR be positive, and for numerical stability, the -interval value should be higher than \f(CW\*(C`1/8192\*(C'\fR (which is around 100 -microseconds) and \f(CW\*(C`offset\*(C'\fR should be higher than \f(CW0\fR and should have -at most a similar magnitude as the current time (say, within a factor of -ten). Typical values for offset are, in fact, \f(CW0\fR or something between -\&\f(CW0\fR and \f(CW\*(C`interval\*(C'\fR, which is also the recommended range. -.Sp -Note also that there is an upper limit to how often a timer can fire (\s-1CPU\s0 -speed for example), so if \f(CW\*(C`interval\*(C'\fR is very small then timing stability -will of course deteriorate. Libev itself tries to be exact to be about one -millisecond (if the \s-1OS\s0 supports it and the machine is fast enough). -.IP "\(bu" 4 -manual reschedule mode (offset ignored, interval ignored, reschedule_cb = callback) -.Sp -In this mode the values for \f(CW\*(C`interval\*(C'\fR and \f(CW\*(C`offset\*(C'\fR are both being -ignored. Instead, each time the periodic watcher gets scheduled, the -reschedule callback will be called with the watcher as first, and the -current time as second argument. -.Sp -\&\s-1NOTE:\s0 \fIThis callback \s-1MUST NOT\s0 stop or destroy any periodic watcher, ever, -or make \s-1ANY\s0 other event loop modifications whatsoever, unless explicitly -allowed by documentation here\fR. -.Sp -If you need to stop it, return \f(CW\*(C`now + 1e30\*(C'\fR (or so, fudge fudge) and stop -it afterwards (e.g. by starting an \f(CW\*(C`ev_prepare\*(C'\fR watcher, which is the -only event loop modification you are allowed to do). -.Sp -The callback prototype is \f(CW\*(C`ev_tstamp (*reschedule_cb)(ev_periodic -*w, ev_tstamp now)\*(C'\fR, e.g.: -.Sp -.Vb 5 -\& static ev_tstamp -\& my_rescheduler (ev_periodic *w, ev_tstamp now) -\& { -\& return now + 60.; -\& } -.Ve -.Sp -It must return the next time to trigger, based on the passed time value -(that is, the lowest time value larger than to the second argument). It -will usually be called just before the callback will be triggered, but -might be called at other times, too. -.Sp -\&\s-1NOTE:\s0 \fIThis callback must always return a time that is higher than or -equal to the passed \f(CI\*(C`now\*(C'\fI value\fR. -.Sp -This can be used to create very complex timers, such as a timer that -triggers on \*(L"next midnight, local time\*(R". To do this, you would calculate -the next midnight after \f(CW\*(C`now\*(C'\fR and return the timestamp value for -this. Here is a (completely untested, no error checking) example on how to -do this: -.Sp -.Vb 1 -\& #include -\& -\& static ev_tstamp -\& my_rescheduler (ev_periodic *w, ev_tstamp now) -\& { -\& time_t tnow = (time_t)now; -\& struct tm tm; -\& localtime_r (&tnow, &tm); -\& -\& tm.tm_sec = tm.tm_min = tm.tm_hour = 0; // midnight current day -\& ++tm.tm_mday; // midnight next day -\& -\& return mktime (&tm); -\& } -.Ve -.Sp -Note: this code might run into trouble on days that have more then two -midnights (beginning and end). -.RE -.RS 4 -.RE -.IP "ev_periodic_again (loop, ev_periodic *)" 4 -.IX Item "ev_periodic_again (loop, ev_periodic *)" -Simply stops and restarts the periodic watcher again. This is only useful -when you changed some parameters or the reschedule callback would return -a different time than the last time it was called (e.g. in a crond like -program when the crontabs have changed). -.IP "ev_tstamp ev_periodic_at (ev_periodic *)" 4 -.IX Item "ev_tstamp ev_periodic_at (ev_periodic *)" -When active, returns the absolute time that the watcher is supposed -to trigger next. This is not the same as the \f(CW\*(C`offset\*(C'\fR argument to -\&\f(CW\*(C`ev_periodic_set\*(C'\fR, but indeed works even in interval and manual -rescheduling modes. -.IP "ev_tstamp offset [read\-write]" 4 -.IX Item "ev_tstamp offset [read-write]" -When repeating, this contains the offset value, otherwise this is the -absolute point in time (the \f(CW\*(C`offset\*(C'\fR value passed to \f(CW\*(C`ev_periodic_set\*(C'\fR, -although libev might modify this value for better numerical stability). -.Sp -Can be modified any time, but changes only take effect when the periodic -timer fires or \f(CW\*(C`ev_periodic_again\*(C'\fR is being called. -.IP "ev_tstamp interval [read\-write]" 4 -.IX Item "ev_tstamp interval [read-write]" -The current interval value. Can be modified any time, but changes only -take effect when the periodic timer fires or \f(CW\*(C`ev_periodic_again\*(C'\fR is being -called. -.IP "ev_tstamp (*reschedule_cb)(ev_periodic *w, ev_tstamp now) [read\-write]" 4 -.IX Item "ev_tstamp (*reschedule_cb)(ev_periodic *w, ev_tstamp now) [read-write]" -The current reschedule callback, or \f(CW0\fR, if this functionality is -switched off. Can be changed any time, but changes only take effect when -the periodic timer fires or \f(CW\*(C`ev_periodic_again\*(C'\fR is being called. -.PP -\fIExamples\fR -.IX Subsection "Examples" -.PP -Example: Call a callback every hour, or, more precisely, whenever the -system time is divisible by 3600. The callback invocation times have -potentially a lot of jitter, but good long-term stability. -.PP -.Vb 5 -\& static void -\& clock_cb (struct ev_loop *loop, ev_periodic *w, int revents) -\& { -\& ... its now a full hour (UTC, or TAI or whatever your clock follows) -\& } -\& -\& ev_periodic hourly_tick; -\& ev_periodic_init (&hourly_tick, clock_cb, 0., 3600., 0); -\& ev_periodic_start (loop, &hourly_tick); -.Ve -.PP -Example: The same as above, but use a reschedule callback to do it: -.PP -.Vb 1 -\& #include -\& -\& static ev_tstamp -\& my_scheduler_cb (ev_periodic *w, ev_tstamp now) -\& { -\& return now + (3600. \- fmod (now, 3600.)); -\& } -\& -\& ev_periodic_init (&hourly_tick, clock_cb, 0., 0., my_scheduler_cb); -.Ve -.PP -Example: Call a callback every hour, starting now: -.PP -.Vb 4 -\& ev_periodic hourly_tick; -\& ev_periodic_init (&hourly_tick, clock_cb, -\& fmod (ev_now (loop), 3600.), 3600., 0); -\& ev_periodic_start (loop, &hourly_tick); -.Ve -.ie n .SS """ev_signal"" \- signal me when a signal gets signalled!" -.el .SS "\f(CWev_signal\fP \- signal me when a signal gets signalled!" -.IX Subsection "ev_signal - signal me when a signal gets signalled!" -Signal watchers will trigger an event when the process receives a specific -signal one or more times. Even though signals are very asynchronous, libev -will try its best to deliver signals synchronously, i.e. as part of the -normal event processing, like any other event. -.PP -If you want signals to be delivered truly asynchronously, just use -\&\f(CW\*(C`sigaction\*(C'\fR as you would do without libev and forget about sharing -the signal. You can even use \f(CW\*(C`ev_async\*(C'\fR from a signal handler to -synchronously wake up an event loop. -.PP -You can configure as many watchers as you like for the same signal, but -only within the same loop, i.e. you can watch for \f(CW\*(C`SIGINT\*(C'\fR in your -default loop and for \f(CW\*(C`SIGIO\*(C'\fR in another loop, but you cannot watch for -\&\f(CW\*(C`SIGINT\*(C'\fR in both the default loop and another loop at the same time. At -the moment, \f(CW\*(C`SIGCHLD\*(C'\fR is permanently tied to the default loop. -.PP -Only after the first watcher for a signal is started will libev actually -register something with the kernel. It thus coexists with your own signal -handlers as long as you don't register any with libev for the same signal. -.PP -If possible and supported, libev will install its handlers with -\&\f(CW\*(C`SA_RESTART\*(C'\fR (or equivalent) behaviour enabled, so system calls should -not be unduly interrupted. If you have a problem with system calls getting -interrupted by signals you can block all signals in an \f(CW\*(C`ev_check\*(C'\fR watcher -and unblock them in an \f(CW\*(C`ev_prepare\*(C'\fR watcher. -.PP -\fIThe special problem of inheritance over fork/execve/pthread_create\fR -.IX Subsection "The special problem of inheritance over fork/execve/pthread_create" -.PP -Both the signal mask (\f(CW\*(C`sigprocmask\*(C'\fR) and the signal disposition -(\f(CW\*(C`sigaction\*(C'\fR) are unspecified after starting a signal watcher (and after -stopping it again), that is, libev might or might not block the signal, -and might or might not set or restore the installed signal handler (but -see \f(CW\*(C`EVFLAG_NOSIGMASK\*(C'\fR). -.PP -While this does not matter for the signal disposition (libev never -sets signals to \f(CW\*(C`SIG_IGN\*(C'\fR, so handlers will be reset to \f(CW\*(C`SIG_DFL\*(C'\fR on -\&\f(CW\*(C`execve\*(C'\fR), this matters for the signal mask: many programs do not expect -certain signals to be blocked. -.PP -This means that before calling \f(CW\*(C`exec\*(C'\fR (from the child) you should reset -the signal mask to whatever \*(L"default\*(R" you expect (all clear is a good -choice usually). -.PP -The simplest way to ensure that the signal mask is reset in the child is -to install a fork handler with \f(CW\*(C`pthread_atfork\*(C'\fR that resets it. That will -catch fork calls done by libraries (such as the libc) as well. -.PP -In current versions of libev, the signal will not be blocked indefinitely -unless you use the \f(CW\*(C`signalfd\*(C'\fR \s-1API\s0 (\f(CW\*(C`EV_SIGNALFD\*(C'\fR). While this reduces -the window of opportunity for problems, it will not go away, as libev -\&\fIhas\fR to modify the signal mask, at least temporarily. -.PP -So I can't stress this enough: \fIIf you do not reset your signal mask when -you expect it to be empty, you have a race condition in your code\fR. This -is not a libev-specific thing, this is true for most event libraries. -.PP -\fIThe special problem of threads signal handling\fR -.IX Subsection "The special problem of threads signal handling" -.PP -\&\s-1POSIX\s0 threads has problematic signal handling semantics, specifically, -a lot of functionality (sigfd, sigwait etc.) only really works if all -threads in a process block signals, which is hard to achieve. -.PP -When you want to use sigwait (or mix libev signal handling with your own -for the same signals), you can tackle this problem by globally blocking -all signals before creating any threads (or creating them with a fully set -sigprocmask) and also specifying the \f(CW\*(C`EVFLAG_NOSIGMASK\*(C'\fR when creating -loops. Then designate one thread as \*(L"signal receiver thread\*(R" which handles -these signals. You can pass on any signals that libev might be interested -in by calling \f(CW\*(C`ev_feed_signal\*(C'\fR. -.PP -\fIWatcher-Specific Functions and Data Members\fR -.IX Subsection "Watcher-Specific Functions and Data Members" -.IP "ev_signal_init (ev_signal *, callback, int signum)" 4 -.IX Item "ev_signal_init (ev_signal *, callback, int signum)" -.PD 0 -.IP "ev_signal_set (ev_signal *, int signum)" 4 -.IX Item "ev_signal_set (ev_signal *, int signum)" -.PD -Configures the watcher to trigger on the given signal number (usually one -of the \f(CW\*(C`SIGxxx\*(C'\fR constants). -.IP "int signum [read\-only]" 4 -.IX Item "int signum [read-only]" -The signal the watcher watches out for. -.PP -\fIExamples\fR -.IX Subsection "Examples" -.PP -Example: Try to exit cleanly on \s-1SIGINT.\s0 -.PP -.Vb 5 -\& static void -\& sigint_cb (struct ev_loop *loop, ev_signal *w, int revents) -\& { -\& ev_break (loop, EVBREAK_ALL); -\& } -\& -\& ev_signal signal_watcher; -\& ev_signal_init (&signal_watcher, sigint_cb, SIGINT); -\& ev_signal_start (loop, &signal_watcher); -.Ve -.ie n .SS """ev_child"" \- watch out for process status changes" -.el .SS "\f(CWev_child\fP \- watch out for process status changes" -.IX Subsection "ev_child - watch out for process status changes" -Child watchers trigger when your process receives a \s-1SIGCHLD\s0 in response to -some child status changes (most typically when a child of yours dies or -exits). It is permissible to install a child watcher \fIafter\fR the child -has been forked (which implies it might have already exited), as long -as the event loop isn't entered (or is continued from a watcher), i.e., -forking and then immediately registering a watcher for the child is fine, -but forking and registering a watcher a few event loop iterations later or -in the next callback invocation is not. -.PP -Only the default event loop is capable of handling signals, and therefore -you can only register child watchers in the default event loop. -.PP -Due to some design glitches inside libev, child watchers will always be -handled at maximum priority (their priority is set to \f(CW\*(C`EV_MAXPRI\*(C'\fR by -libev) -.PP -\fIProcess Interaction\fR -.IX Subsection "Process Interaction" -.PP -Libev grabs \f(CW\*(C`SIGCHLD\*(C'\fR as soon as the default event loop is -initialised. This is necessary to guarantee proper behaviour even if the -first child watcher is started after the child exits. The occurrence -of \f(CW\*(C`SIGCHLD\*(C'\fR is recorded asynchronously, but child reaping is done -synchronously as part of the event loop processing. Libev always reaps all -children, even ones not watched. -.PP -\fIOverriding the Built-In Processing\fR -.IX Subsection "Overriding the Built-In Processing" -.PP -Libev offers no special support for overriding the built-in child -processing, but if your application collides with libev's default child -handler, you can override it easily by installing your own handler for -\&\f(CW\*(C`SIGCHLD\*(C'\fR after initialising the default loop, and making sure the -default loop never gets destroyed. You are encouraged, however, to use an -event-based approach to child reaping and thus use libev's support for -that, so other libev users can use \f(CW\*(C`ev_child\*(C'\fR watchers freely. -.PP -\fIStopping the Child Watcher\fR -.IX Subsection "Stopping the Child Watcher" -.PP -Currently, the child watcher never gets stopped, even when the -child terminates, so normally one needs to stop the watcher in the -callback. Future versions of libev might stop the watcher automatically -when a child exit is detected (calling \f(CW\*(C`ev_child_stop\*(C'\fR twice is not a -problem). -.PP -\fIWatcher-Specific Functions and Data Members\fR -.IX Subsection "Watcher-Specific Functions and Data Members" -.IP "ev_child_init (ev_child *, callback, int pid, int trace)" 4 -.IX Item "ev_child_init (ev_child *, callback, int pid, int trace)" -.PD 0 -.IP "ev_child_set (ev_child *, int pid, int trace)" 4 -.IX Item "ev_child_set (ev_child *, int pid, int trace)" -.PD -Configures the watcher to wait for status changes of process \f(CW\*(C`pid\*(C'\fR (or -\&\fIany\fR process if \f(CW\*(C`pid\*(C'\fR is specified as \f(CW0\fR). The callback can look -at the \f(CW\*(C`rstatus\*(C'\fR member of the \f(CW\*(C`ev_child\*(C'\fR watcher structure to see -the status word (use the macros from \f(CW\*(C`sys/wait.h\*(C'\fR and see your systems -\&\f(CW\*(C`waitpid\*(C'\fR documentation). The \f(CW\*(C`rpid\*(C'\fR member contains the pid of the -process causing the status change. \f(CW\*(C`trace\*(C'\fR must be either \f(CW0\fR (only -activate the watcher when the process terminates) or \f(CW1\fR (additionally -activate the watcher when the process is stopped or continued). -.IP "int pid [read\-only]" 4 -.IX Item "int pid [read-only]" -The process id this watcher watches out for, or \f(CW0\fR, meaning any process id. -.IP "int rpid [read\-write]" 4 -.IX Item "int rpid [read-write]" -The process id that detected a status change. -.IP "int rstatus [read\-write]" 4 -.IX Item "int rstatus [read-write]" -The process exit/trace status caused by \f(CW\*(C`rpid\*(C'\fR (see your systems -\&\f(CW\*(C`waitpid\*(C'\fR and \f(CW\*(C`sys/wait.h\*(C'\fR documentation for details). -.PP -\fIExamples\fR -.IX Subsection "Examples" -.PP -Example: \f(CW\*(C`fork()\*(C'\fR a new process and install a child handler to wait for -its completion. -.PP -.Vb 1 -\& ev_child cw; -\& -\& static void -\& child_cb (EV_P_ ev_child *w, int revents) -\& { -\& ev_child_stop (EV_A_ w); -\& printf ("process %d exited with status %x\en", w\->rpid, w\->rstatus); -\& } -\& -\& pid_t pid = fork (); -\& -\& if (pid < 0) -\& // error -\& else if (pid == 0) -\& { -\& // the forked child executes here -\& exit (1); -\& } -\& else -\& { -\& ev_child_init (&cw, child_cb, pid, 0); -\& ev_child_start (EV_DEFAULT_ &cw); -\& } -.Ve -.ie n .SS """ev_stat"" \- did the file attributes just change?" -.el .SS "\f(CWev_stat\fP \- did the file attributes just change?" -.IX Subsection "ev_stat - did the file attributes just change?" -This watches a file system path for attribute changes. That is, it calls -\&\f(CW\*(C`stat\*(C'\fR on that path in regular intervals (or when the \s-1OS\s0 says it changed) -and sees if it changed compared to the last time, invoking the callback -if it did. Starting the watcher \f(CW\*(C`stat\*(C'\fR's the file, so only changes that -happen after the watcher has been started will be reported. -.PP -The path does not need to exist: changing from \*(L"path exists\*(R" to \*(L"path does -not exist\*(R" is a status change like any other. The condition \*(L"path does not -exist\*(R" (or more correctly \*(L"path cannot be stat'ed\*(R") is signified by the -\&\f(CW\*(C`st_nlink\*(C'\fR field being zero (which is otherwise always forced to be at -least one) and all the other fields of the stat buffer having unspecified -contents. -.PP -The path \fImust not\fR end in a slash or contain special components such as -\&\f(CW\*(C`.\*(C'\fR or \f(CW\*(C`..\*(C'\fR. The path \fIshould\fR be absolute: If it is relative and -your working directory changes, then the behaviour is undefined. -.PP -Since there is no portable change notification interface available, the -portable implementation simply calls \f(CWstat(2)\fR regularly on the path -to see if it changed somehow. You can specify a recommended polling -interval for this case. If you specify a polling interval of \f(CW0\fR (highly -recommended!) then a \fIsuitable, unspecified default\fR value will be used -(which you can expect to be around five seconds, although this might -change dynamically). Libev will also impose a minimum interval which is -currently around \f(CW0.1\fR, but that's usually overkill. -.PP -This watcher type is not meant for massive numbers of stat watchers, -as even with OS-supported change notifications, this can be -resource-intensive. -.PP -At the time of this writing, the only OS-specific interface implemented -is the Linux inotify interface (implementing kqueue support is left as an -exercise for the reader. Note, however, that the author sees no way of -implementing \f(CW\*(C`ev_stat\*(C'\fR semantics with kqueue, except as a hint). -.PP -\fI\s-1ABI\s0 Issues (Largefile Support)\fR -.IX Subsection "ABI Issues (Largefile Support)" -.PP -Libev by default (unless the user overrides this) uses the default -compilation environment, which means that on systems with large file -support disabled by default, you get the 32 bit version of the stat -structure. When using the library from programs that change the \s-1ABI\s0 to -use 64 bit file offsets the programs will fail. In that case you have to -compile libev with the same flags to get binary compatibility. This is -obviously the case with any flags that change the \s-1ABI,\s0 but the problem is -most noticeably displayed with ev_stat and large file support. -.PP -The solution for this is to lobby your distribution maker to make large -file interfaces available by default (as e.g. FreeBSD does) and not -optional. Libev cannot simply switch on large file support because it has -to exchange stat structures with application programs compiled using the -default compilation environment. -.PP -\fIInotify and Kqueue\fR -.IX Subsection "Inotify and Kqueue" -.PP -When \f(CW\*(C`inotify (7)\*(C'\fR support has been compiled into libev and present at -runtime, it will be used to speed up change detection where possible. The -inotify descriptor will be created lazily when the first \f(CW\*(C`ev_stat\*(C'\fR -watcher is being started. -.PP -Inotify presence does not change the semantics of \f(CW\*(C`ev_stat\*(C'\fR watchers -except that changes might be detected earlier, and in some cases, to avoid -making regular \f(CW\*(C`stat\*(C'\fR calls. Even in the presence of inotify support -there are many cases where libev has to resort to regular \f(CW\*(C`stat\*(C'\fR polling, -but as long as kernel 2.6.25 or newer is used (2.6.24 and older have too -many bugs), the path exists (i.e. stat succeeds), and the path resides on -a local filesystem (libev currently assumes only ext2/3, jfs, reiserfs and -xfs are fully working) libev usually gets away without polling. -.PP -There is no support for kqueue, as apparently it cannot be used to -implement this functionality, due to the requirement of having a file -descriptor open on the object at all times, and detecting renames, unlinks -etc. is difficult. -.PP -\fI\f(CI\*(C`stat ()\*(C'\fI is a synchronous operation\fR -.IX Subsection "stat () is a synchronous operation" -.PP -Libev doesn't normally do any kind of I/O itself, and so is not blocking -the process. The exception are \f(CW\*(C`ev_stat\*(C'\fR watchers \- those call \f(CW\*(C`stat -()\*(C'\fR, which is a synchronous operation. -.PP -For local paths, this usually doesn't matter: unless the system is very -busy or the intervals between stat's are large, a stat call will be fast, -as the path data is usually in memory already (except when starting the -watcher). -.PP -For networked file systems, calling \f(CW\*(C`stat ()\*(C'\fR can block an indefinite -time due to network issues, and even under good conditions, a stat call -often takes multiple milliseconds. -.PP -Therefore, it is best to avoid using \f(CW\*(C`ev_stat\*(C'\fR watchers on networked -paths, although this is fully supported by libev. -.PP -\fIThe special problem of stat time resolution\fR -.IX Subsection "The special problem of stat time resolution" -.PP -The \f(CW\*(C`stat ()\*(C'\fR system call only supports full-second resolution portably, -and even on systems where the resolution is higher, most file systems -still only support whole seconds. -.PP -That means that, if the time is the only thing that changes, you can -easily miss updates: on the first update, \f(CW\*(C`ev_stat\*(C'\fR detects a change and -calls your callback, which does something. When there is another update -within the same second, \f(CW\*(C`ev_stat\*(C'\fR will be unable to detect unless the -stat data does change in other ways (e.g. file size). -.PP -The solution to this is to delay acting on a change for slightly more -than a second (or till slightly after the next full second boundary), using -a roughly one-second-delay \f(CW\*(C`ev_timer\*(C'\fR (e.g. \f(CW\*(C`ev_timer_set (w, 0., 1.02); -ev_timer_again (loop, w)\*(C'\fR). -.PP -The \f(CW.02\fR offset is added to work around small timing inconsistencies -of some operating systems (where the second counter of the current time -might be be delayed. One such system is the Linux kernel, where a call to -\&\f(CW\*(C`gettimeofday\*(C'\fR might return a timestamp with a full second later than -a subsequent \f(CW\*(C`time\*(C'\fR call \- if the equivalent of \f(CW\*(C`time ()\*(C'\fR is used to -update file times then there will be a small window where the kernel uses -the previous second to update file times but libev might already execute -the timer callback). -.PP -\fIWatcher-Specific Functions and Data Members\fR -.IX Subsection "Watcher-Specific Functions and Data Members" -.IP "ev_stat_init (ev_stat *, callback, const char *path, ev_tstamp interval)" 4 -.IX Item "ev_stat_init (ev_stat *, callback, const char *path, ev_tstamp interval)" -.PD 0 -.IP "ev_stat_set (ev_stat *, const char *path, ev_tstamp interval)" 4 -.IX Item "ev_stat_set (ev_stat *, const char *path, ev_tstamp interval)" -.PD -Configures the watcher to wait for status changes of the given -\&\f(CW\*(C`path\*(C'\fR. The \f(CW\*(C`interval\*(C'\fR is a hint on how quickly a change is expected to -be detected and should normally be specified as \f(CW0\fR to let libev choose -a suitable value. The memory pointed to by \f(CW\*(C`path\*(C'\fR must point to the same -path for as long as the watcher is active. -.Sp -The callback will receive an \f(CW\*(C`EV_STAT\*(C'\fR event when a change was detected, -relative to the attributes at the time the watcher was started (or the -last change was detected). -.IP "ev_stat_stat (loop, ev_stat *)" 4 -.IX Item "ev_stat_stat (loop, ev_stat *)" -Updates the stat buffer immediately with new values. If you change the -watched path in your callback, you could call this function to avoid -detecting this change (while introducing a race condition if you are not -the only one changing the path). Can also be useful simply to find out the -new values. -.IP "ev_statdata attr [read\-only]" 4 -.IX Item "ev_statdata attr [read-only]" -The most-recently detected attributes of the file. Although the type is -\&\f(CW\*(C`ev_statdata\*(C'\fR, this is usually the (or one of the) \f(CW\*(C`struct stat\*(C'\fR types -suitable for your system, but you can only rely on the POSIX-standardised -members to be present. If the \f(CW\*(C`st_nlink\*(C'\fR member is \f(CW0\fR, then there was -some error while \f(CW\*(C`stat\*(C'\fRing the file. -.IP "ev_statdata prev [read\-only]" 4 -.IX Item "ev_statdata prev [read-only]" -The previous attributes of the file. The callback gets invoked whenever -\&\f(CW\*(C`prev\*(C'\fR != \f(CW\*(C`attr\*(C'\fR, or, more precisely, one or more of these members -differ: \f(CW\*(C`st_dev\*(C'\fR, \f(CW\*(C`st_ino\*(C'\fR, \f(CW\*(C`st_mode\*(C'\fR, \f(CW\*(C`st_nlink\*(C'\fR, \f(CW\*(C`st_uid\*(C'\fR, -\&\f(CW\*(C`st_gid\*(C'\fR, \f(CW\*(C`st_rdev\*(C'\fR, \f(CW\*(C`st_size\*(C'\fR, \f(CW\*(C`st_atime\*(C'\fR, \f(CW\*(C`st_mtime\*(C'\fR, \f(CW\*(C`st_ctime\*(C'\fR. -.IP "ev_tstamp interval [read\-only]" 4 -.IX Item "ev_tstamp interval [read-only]" -The specified interval. -.IP "const char *path [read\-only]" 4 -.IX Item "const char *path [read-only]" -The file system path that is being watched. -.PP -\fIExamples\fR -.IX Subsection "Examples" -.PP -Example: Watch \f(CW\*(C`/etc/passwd\*(C'\fR for attribute changes. -.PP -.Vb 10 -\& static void -\& passwd_cb (struct ev_loop *loop, ev_stat *w, int revents) -\& { -\& /* /etc/passwd changed in some way */ -\& if (w\->attr.st_nlink) -\& { -\& printf ("passwd current size %ld\en", (long)w\->attr.st_size); -\& printf ("passwd current atime %ld\en", (long)w\->attr.st_mtime); -\& printf ("passwd current mtime %ld\en", (long)w\->attr.st_mtime); -\& } -\& else -\& /* you shalt not abuse printf for puts */ -\& puts ("wow, /etc/passwd is not there, expect problems. " -\& "if this is windows, they already arrived\en"); -\& } -\& -\& ... -\& ev_stat passwd; -\& -\& ev_stat_init (&passwd, passwd_cb, "/etc/passwd", 0.); -\& ev_stat_start (loop, &passwd); -.Ve -.PP -Example: Like above, but additionally use a one-second delay so we do not -miss updates (however, frequent updates will delay processing, too, so -one might do the work both on \f(CW\*(C`ev_stat\*(C'\fR callback invocation \fIand\fR on -\&\f(CW\*(C`ev_timer\*(C'\fR callback invocation). -.PP -.Vb 2 -\& static ev_stat passwd; -\& static ev_timer timer; -\& -\& static void -\& timer_cb (EV_P_ ev_timer *w, int revents) -\& { -\& ev_timer_stop (EV_A_ w); -\& -\& /* now it\*(Aqs one second after the most recent passwd change */ -\& } -\& -\& static void -\& stat_cb (EV_P_ ev_stat *w, int revents) -\& { -\& /* reset the one\-second timer */ -\& ev_timer_again (EV_A_ &timer); -\& } -\& -\& ... -\& ev_stat_init (&passwd, stat_cb, "/etc/passwd", 0.); -\& ev_stat_start (loop, &passwd); -\& ev_timer_init (&timer, timer_cb, 0., 1.02); -.Ve -.ie n .SS """ev_idle"" \- when you've got nothing better to do..." -.el .SS "\f(CWev_idle\fP \- when you've got nothing better to do..." -.IX Subsection "ev_idle - when you've got nothing better to do..." -Idle watchers trigger events when no other events of the same or higher -priority are pending (prepare, check and other idle watchers do not count -as receiving \*(L"events\*(R"). -.PP -That is, as long as your process is busy handling sockets or timeouts -(or even signals, imagine) of the same or higher priority it will not be -triggered. But when your process is idle (or only lower-priority watchers -are pending), the idle watchers are being called once per event loop -iteration \- until stopped, that is, or your process receives more events -and becomes busy again with higher priority stuff. -.PP -The most noteworthy effect is that as long as any idle watchers are -active, the process will not block when waiting for new events. -.PP -Apart from keeping your process non-blocking (which is a useful -effect on its own sometimes), idle watchers are a good place to do -\&\*(L"pseudo-background processing\*(R", or delay processing stuff to after the -event loop has handled all outstanding events. -.PP -\fIAbusing an \f(CI\*(C`ev_idle\*(C'\fI watcher for its side-effect\fR -.IX Subsection "Abusing an ev_idle watcher for its side-effect" -.PP -As long as there is at least one active idle watcher, libev will never -sleep unnecessarily. Or in other words, it will loop as fast as possible. -For this to work, the idle watcher doesn't need to be invoked at all \- the -lowest priority will do. -.PP -This mode of operation can be useful together with an \f(CW\*(C`ev_check\*(C'\fR watcher, -to do something on each event loop iteration \- for example to balance load -between different connections. -.PP -See \*(L"Abusing an ev_check watcher for its side-effect\*(R" for a longer -example. -.PP -\fIWatcher-Specific Functions and Data Members\fR -.IX Subsection "Watcher-Specific Functions and Data Members" -.IP "ev_idle_init (ev_idle *, callback)" 4 -.IX Item "ev_idle_init (ev_idle *, callback)" -Initialises and configures the idle watcher \- it has no parameters of any -kind. There is a \f(CW\*(C`ev_idle_set\*(C'\fR macro, but using it is utterly pointless, -believe me. -.PP -\fIExamples\fR -.IX Subsection "Examples" -.PP -Example: Dynamically allocate an \f(CW\*(C`ev_idle\*(C'\fR watcher, start it, and in the -callback, free it. Also, use no error checking, as usual. -.PP -.Vb 5 -\& static void -\& idle_cb (struct ev_loop *loop, ev_idle *w, int revents) -\& { -\& // stop the watcher -\& ev_idle_stop (loop, w); -\& -\& // now we can free it -\& free (w); -\& -\& // now do something you wanted to do when the program has -\& // no longer anything immediate to do. -\& } -\& -\& ev_idle *idle_watcher = malloc (sizeof (ev_idle)); -\& ev_idle_init (idle_watcher, idle_cb); -\& ev_idle_start (loop, idle_watcher); -.Ve -.ie n .SS """ev_prepare"" and ""ev_check"" \- customise your event loop!" -.el .SS "\f(CWev_prepare\fP and \f(CWev_check\fP \- customise your event loop!" -.IX Subsection "ev_prepare and ev_check - customise your event loop!" -Prepare and check watchers are often (but not always) used in pairs: -prepare watchers get invoked before the process blocks and check watchers -afterwards. -.PP -You \fImust not\fR call \f(CW\*(C`ev_run\*(C'\fR (or similar functions that enter the -current event loop) or \f(CW\*(C`ev_loop_fork\*(C'\fR from either \f(CW\*(C`ev_prepare\*(C'\fR or -\&\f(CW\*(C`ev_check\*(C'\fR watchers. Other loops than the current one are fine, -however. The rationale behind this is that you do not need to check -for recursion in those watchers, i.e. the sequence will always be -\&\f(CW\*(C`ev_prepare\*(C'\fR, blocking, \f(CW\*(C`ev_check\*(C'\fR so if you have one watcher of each -kind they will always be called in pairs bracketing the blocking call. -.PP -Their main purpose is to integrate other event mechanisms into libev and -their use is somewhat advanced. They could be used, for example, to track -variable changes, implement your own watchers, integrate net-snmp or a -coroutine library and lots more. They are also occasionally useful if -you cache some data and want to flush it before blocking (for example, -in X programs you might want to do an \f(CW\*(C`XFlush ()\*(C'\fR in an \f(CW\*(C`ev_prepare\*(C'\fR -watcher). -.PP -This is done by examining in each prepare call which file descriptors -need to be watched by the other library, registering \f(CW\*(C`ev_io\*(C'\fR watchers -for them and starting an \f(CW\*(C`ev_timer\*(C'\fR watcher for any timeouts (many -libraries provide exactly this functionality). Then, in the check watcher, -you check for any events that occurred (by checking the pending status -of all watchers and stopping them) and call back into the library. The -I/O and timer callbacks will never actually be called (but must be valid -nevertheless, because you never know, you know?). -.PP -As another example, the Perl Coro module uses these hooks to integrate -coroutines into libev programs, by yielding to other active coroutines -during each prepare and only letting the process block if no coroutines -are ready to run (it's actually more complicated: it only runs coroutines -with priority higher than or equal to the event loop and one coroutine -of lower priority, but only once, using idle watchers to keep the event -loop from blocking if lower-priority coroutines are active, thus mapping -low-priority coroutines to idle/background tasks). -.PP -When used for this purpose, it is recommended to give \f(CW\*(C`ev_check\*(C'\fR watchers -highest (\f(CW\*(C`EV_MAXPRI\*(C'\fR) priority, to ensure that they are being run before -any other watchers after the poll (this doesn't matter for \f(CW\*(C`ev_prepare\*(C'\fR -watchers). -.PP -Also, \f(CW\*(C`ev_check\*(C'\fR watchers (and \f(CW\*(C`ev_prepare\*(C'\fR watchers, too) should not -activate (\*(L"feed\*(R") events into libev. While libev fully supports this, they -might get executed before other \f(CW\*(C`ev_check\*(C'\fR watchers did their job. As -\&\f(CW\*(C`ev_check\*(C'\fR watchers are often used to embed other (non-libev) event -loops those other event loops might be in an unusable state until their -\&\f(CW\*(C`ev_check\*(C'\fR watcher ran (always remind yourself to coexist peacefully with -others). -.PP -\fIAbusing an \f(CI\*(C`ev_check\*(C'\fI watcher for its side-effect\fR -.IX Subsection "Abusing an ev_check watcher for its side-effect" -.PP -\&\f(CW\*(C`ev_check\*(C'\fR (and less often also \f(CW\*(C`ev_prepare\*(C'\fR) watchers can also be -useful because they are called once per event loop iteration. For -example, if you want to handle a large number of connections fairly, you -normally only do a bit of work for each active connection, and if there -is more work to do, you wait for the next event loop iteration, so other -connections have a chance of making progress. -.PP -Using an \f(CW\*(C`ev_check\*(C'\fR watcher is almost enough: it will be called on the -next event loop iteration. However, that isn't as soon as possible \- -without external events, your \f(CW\*(C`ev_check\*(C'\fR watcher will not be invoked. -.PP -This is where \f(CW\*(C`ev_idle\*(C'\fR watchers come in handy \- all you need is a -single global idle watcher that is active as long as you have one active -\&\f(CW\*(C`ev_check\*(C'\fR watcher. The \f(CW\*(C`ev_idle\*(C'\fR watcher makes sure the event loop -will not sleep, and the \f(CW\*(C`ev_check\*(C'\fR watcher makes sure a callback gets -invoked. Neither watcher alone can do that. -.PP -\fIWatcher-Specific Functions and Data Members\fR -.IX Subsection "Watcher-Specific Functions and Data Members" -.IP "ev_prepare_init (ev_prepare *, callback)" 4 -.IX Item "ev_prepare_init (ev_prepare *, callback)" -.PD 0 -.IP "ev_check_init (ev_check *, callback)" 4 -.IX Item "ev_check_init (ev_check *, callback)" -.PD -Initialises and configures the prepare or check watcher \- they have no -parameters of any kind. There are \f(CW\*(C`ev_prepare_set\*(C'\fR and \f(CW\*(C`ev_check_set\*(C'\fR -macros, but using them is utterly, utterly, utterly and completely -pointless. -.PP -\fIExamples\fR -.IX Subsection "Examples" -.PP -There are a number of principal ways to embed other event loops or modules -into libev. Here are some ideas on how to include libadns into libev -(there is a Perl module named \f(CW\*(C`EV::ADNS\*(C'\fR that does this, which you could -use as a working example. Another Perl module named \f(CW\*(C`EV::Glib\*(C'\fR embeds a -Glib main context into libev, and finally, \f(CW\*(C`Glib::EV\*(C'\fR embeds \s-1EV\s0 into the -Glib event loop). -.PP -Method 1: Add \s-1IO\s0 watchers and a timeout watcher in a prepare handler, -and in a check watcher, destroy them and call into libadns. What follows -is pseudo-code only of course. This requires you to either use a low -priority for the check watcher or use \f(CW\*(C`ev_clear_pending\*(C'\fR explicitly, as -the callbacks for the IO/timeout watchers might not have been called yet. -.PP -.Vb 2 -\& static ev_io iow [nfd]; -\& static ev_timer tw; -\& -\& static void -\& io_cb (struct ev_loop *loop, ev_io *w, int revents) -\& { -\& } -\& -\& // create io watchers for each fd and a timer before blocking -\& static void -\& adns_prepare_cb (struct ev_loop *loop, ev_prepare *w, int revents) -\& { -\& int timeout = 3600000; -\& struct pollfd fds [nfd]; -\& // actual code will need to loop here and realloc etc. -\& adns_beforepoll (ads, fds, &nfd, &timeout, timeval_from (ev_time ())); -\& -\& /* the callback is illegal, but won\*(Aqt be called as we stop during check */ -\& ev_timer_init (&tw, 0, timeout * 1e\-3, 0.); -\& ev_timer_start (loop, &tw); -\& -\& // create one ev_io per pollfd -\& for (int i = 0; i < nfd; ++i) -\& { -\& ev_io_init (iow + i, io_cb, fds [i].fd, -\& ((fds [i].events & POLLIN ? EV_READ : 0) -\& | (fds [i].events & POLLOUT ? EV_WRITE : 0))); -\& -\& fds [i].revents = 0; -\& ev_io_start (loop, iow + i); -\& } -\& } -\& -\& // stop all watchers after blocking -\& static void -\& adns_check_cb (struct ev_loop *loop, ev_check *w, int revents) -\& { -\& ev_timer_stop (loop, &tw); -\& -\& for (int i = 0; i < nfd; ++i) -\& { -\& // set the relevant poll flags -\& // could also call adns_processreadable etc. here -\& struct pollfd *fd = fds + i; -\& int revents = ev_clear_pending (iow + i); -\& if (revents & EV_READ ) fd\->revents |= fd\->events & POLLIN; -\& if (revents & EV_WRITE) fd\->revents |= fd\->events & POLLOUT; -\& -\& // now stop the watcher -\& ev_io_stop (loop, iow + i); -\& } -\& -\& adns_afterpoll (adns, fds, nfd, timeval_from (ev_now (loop)); -\& } -.Ve -.PP -Method 2: This would be just like method 1, but you run \f(CW\*(C`adns_afterpoll\*(C'\fR -in the prepare watcher and would dispose of the check watcher. -.PP -Method 3: If the module to be embedded supports explicit event -notification (libadns does), you can also make use of the actual watcher -callbacks, and only destroy/create the watchers in the prepare watcher. -.PP -.Vb 5 -\& static void -\& timer_cb (EV_P_ ev_timer *w, int revents) -\& { -\& adns_state ads = (adns_state)w\->data; -\& update_now (EV_A); -\& -\& adns_processtimeouts (ads, &tv_now); -\& } -\& -\& static void -\& io_cb (EV_P_ ev_io *w, int revents) -\& { -\& adns_state ads = (adns_state)w\->data; -\& update_now (EV_A); -\& -\& if (revents & EV_READ ) adns_processreadable (ads, w\->fd, &tv_now); -\& if (revents & EV_WRITE) adns_processwriteable (ads, w\->fd, &tv_now); -\& } -\& -\& // do not ever call adns_afterpoll -.Ve -.PP -Method 4: Do not use a prepare or check watcher because the module you -want to embed is not flexible enough to support it. Instead, you can -override their poll function. The drawback with this solution is that the -main loop is now no longer controllable by \s-1EV.\s0 The \f(CW\*(C`Glib::EV\*(C'\fR module uses -this approach, effectively embedding \s-1EV\s0 as a client into the horrible -libglib event loop. -.PP -.Vb 4 -\& static gint -\& event_poll_func (GPollFD *fds, guint nfds, gint timeout) -\& { -\& int got_events = 0; -\& -\& for (n = 0; n < nfds; ++n) -\& // create/start io watcher that sets the relevant bits in fds[n] and increment got_events -\& -\& if (timeout >= 0) -\& // create/start timer -\& -\& // poll -\& ev_run (EV_A_ 0); -\& -\& // stop timer again -\& if (timeout >= 0) -\& ev_timer_stop (EV_A_ &to); -\& -\& // stop io watchers again \- their callbacks should have set -\& for (n = 0; n < nfds; ++n) -\& ev_io_stop (EV_A_ iow [n]); -\& -\& return got_events; -\& } -.Ve -.ie n .SS """ev_embed"" \- when one backend isn't enough..." -.el .SS "\f(CWev_embed\fP \- when one backend isn't enough..." -.IX Subsection "ev_embed - when one backend isn't enough..." -This is a rather advanced watcher type that lets you embed one event loop -into another (currently only \f(CW\*(C`ev_io\*(C'\fR events are supported in the embedded -loop, other types of watchers might be handled in a delayed or incorrect -fashion and must not be used). -.PP -There are primarily two reasons you would want that: work around bugs and -prioritise I/O. -.PP -As an example for a bug workaround, the kqueue backend might only support -sockets on some platform, so it is unusable as generic backend, but you -still want to make use of it because you have many sockets and it scales -so nicely. In this case, you would create a kqueue-based loop and embed -it into your default loop (which might use e.g. poll). Overall operation -will be a bit slower because first libev has to call \f(CW\*(C`poll\*(C'\fR and then -\&\f(CW\*(C`kevent\*(C'\fR, but at least you can use both mechanisms for what they are -best: \f(CW\*(C`kqueue\*(C'\fR for scalable sockets and \f(CW\*(C`poll\*(C'\fR if you want it to work :) -.PP -As for prioritising I/O: under rare circumstances you have the case where -some fds have to be watched and handled very quickly (with low latency), -and even priorities and idle watchers might have too much overhead. In -this case you would put all the high priority stuff in one loop and all -the rest in a second one, and embed the second one in the first. -.PP -As long as the watcher is active, the callback will be invoked every -time there might be events pending in the embedded loop. The callback -must then call \f(CW\*(C`ev_embed_sweep (mainloop, watcher)\*(C'\fR to make a single -sweep and invoke their callbacks (the callback doesn't need to invoke the -\&\f(CW\*(C`ev_embed_sweep\*(C'\fR function directly, it could also start an idle watcher -to give the embedded loop strictly lower priority for example). -.PP -You can also set the callback to \f(CW0\fR, in which case the embed watcher -will automatically execute the embedded loop sweep whenever necessary. -.PP -Fork detection will be handled transparently while the \f(CW\*(C`ev_embed\*(C'\fR watcher -is active, i.e., the embedded loop will automatically be forked when the -embedding loop forks. In other cases, the user is responsible for calling -\&\f(CW\*(C`ev_loop_fork\*(C'\fR on the embedded loop. -.PP -Unfortunately, not all backends are embeddable: only the ones returned by -\&\f(CW\*(C`ev_embeddable_backends\*(C'\fR are, which, unfortunately, does not include any -portable one. -.PP -So when you want to use this feature you will always have to be prepared -that you cannot get an embeddable loop. The recommended way to get around -this is to have a separate variables for your embeddable loop, try to -create it, and if that fails, use the normal loop for everything. -.PP -\fI\f(CI\*(C`ev_embed\*(C'\fI and fork\fR -.IX Subsection "ev_embed and fork" -.PP -While the \f(CW\*(C`ev_embed\*(C'\fR watcher is running, forks in the embedding loop will -automatically be applied to the embedded loop as well, so no special -fork handling is required in that case. When the watcher is not running, -however, it is still the task of the libev user to call \f(CW\*(C`ev_loop_fork ()\*(C'\fR -as applicable. -.PP -\fIWatcher-Specific Functions and Data Members\fR -.IX Subsection "Watcher-Specific Functions and Data Members" -.IP "ev_embed_init (ev_embed *, callback, struct ev_loop *embedded_loop)" 4 -.IX Item "ev_embed_init (ev_embed *, callback, struct ev_loop *embedded_loop)" -.PD 0 -.IP "ev_embed_set (ev_embed *, struct ev_loop *embedded_loop)" 4 -.IX Item "ev_embed_set (ev_embed *, struct ev_loop *embedded_loop)" -.PD -Configures the watcher to embed the given loop, which must be -embeddable. If the callback is \f(CW0\fR, then \f(CW\*(C`ev_embed_sweep\*(C'\fR will be -invoked automatically, otherwise it is the responsibility of the callback -to invoke it (it will continue to be called until the sweep has been done, -if you do not want that, you need to temporarily stop the embed watcher). -.IP "ev_embed_sweep (loop, ev_embed *)" 4 -.IX Item "ev_embed_sweep (loop, ev_embed *)" -Make a single, non-blocking sweep over the embedded loop. This works -similarly to \f(CW\*(C`ev_run (embedded_loop, EVRUN_NOWAIT)\*(C'\fR, but in the most -appropriate way for embedded loops. -.IP "struct ev_loop *other [read\-only]" 4 -.IX Item "struct ev_loop *other [read-only]" -The embedded event loop. -.PP -\fIExamples\fR -.IX Subsection "Examples" -.PP -Example: Try to get an embeddable event loop and embed it into the default -event loop. If that is not possible, use the default loop. The default -loop is stored in \f(CW\*(C`loop_hi\*(C'\fR, while the embeddable loop is stored in -\&\f(CW\*(C`loop_lo\*(C'\fR (which is \f(CW\*(C`loop_hi\*(C'\fR in the case no embeddable loop can be -used). -.PP -.Vb 3 -\& struct ev_loop *loop_hi = ev_default_init (0); -\& struct ev_loop *loop_lo = 0; -\& ev_embed embed; -\& -\& // see if there is a chance of getting one that works -\& // (remember that a flags value of 0 means autodetection) -\& loop_lo = ev_embeddable_backends () & ev_recommended_backends () -\& ? ev_loop_new (ev_embeddable_backends () & ev_recommended_backends ()) -\& : 0; -\& -\& // if we got one, then embed it, otherwise default to loop_hi -\& if (loop_lo) -\& { -\& ev_embed_init (&embed, 0, loop_lo); -\& ev_embed_start (loop_hi, &embed); -\& } -\& else -\& loop_lo = loop_hi; -.Ve -.PP -Example: Check if kqueue is available but not recommended and create -a kqueue backend for use with sockets (which usually work with any -kqueue implementation). Store the kqueue/socket\-only event loop in -\&\f(CW\*(C`loop_socket\*(C'\fR. (One might optionally use \f(CW\*(C`EVFLAG_NOENV\*(C'\fR, too). -.PP -.Vb 3 -\& struct ev_loop *loop = ev_default_init (0); -\& struct ev_loop *loop_socket = 0; -\& ev_embed embed; -\& -\& if (ev_supported_backends () & ~ev_recommended_backends () & EVBACKEND_KQUEUE) -\& if ((loop_socket = ev_loop_new (EVBACKEND_KQUEUE)) -\& { -\& ev_embed_init (&embed, 0, loop_socket); -\& ev_embed_start (loop, &embed); -\& } -\& -\& if (!loop_socket) -\& loop_socket = loop; -\& -\& // now use loop_socket for all sockets, and loop for everything else -.Ve -.ie n .SS """ev_fork"" \- the audacity to resume the event loop after a fork" -.el .SS "\f(CWev_fork\fP \- the audacity to resume the event loop after a fork" -.IX Subsection "ev_fork - the audacity to resume the event loop after a fork" -Fork watchers are called when a \f(CW\*(C`fork ()\*(C'\fR was detected (usually because -whoever is a good citizen cared to tell libev about it by calling -\&\f(CW\*(C`ev_loop_fork\*(C'\fR). The invocation is done before the event loop blocks next -and before \f(CW\*(C`ev_check\*(C'\fR watchers are being called, and only in the child -after the fork. If whoever good citizen calling \f(CW\*(C`ev_default_fork\*(C'\fR cheats -and calls it in the wrong process, the fork handlers will be invoked, too, -of course. -.PP -\fIThe special problem of life after fork \- how is it possible?\fR -.IX Subsection "The special problem of life after fork - how is it possible?" -.PP -Most uses of \f(CW\*(C`fork ()\*(C'\fR consist of forking, then some simple calls to set -up/change the process environment, followed by a call to \f(CW\*(C`exec()\*(C'\fR. This -sequence should be handled by libev without any problems. -.PP -This changes when the application actually wants to do event handling -in the child, or both parent in child, in effect \*(L"continuing\*(R" after the -fork. -.PP -The default mode of operation (for libev, with application help to detect -forks) is to duplicate all the state in the child, as would be expected -when \fIeither\fR the parent \fIor\fR the child process continues. -.PP -When both processes want to continue using libev, then this is usually the -wrong result. In that case, usually one process (typically the parent) is -supposed to continue with all watchers in place as before, while the other -process typically wants to start fresh, i.e. without any active watchers. -.PP -The cleanest and most efficient way to achieve that with libev is to -simply create a new event loop, which of course will be \*(L"empty\*(R", and -use that for new watchers. This has the advantage of not touching more -memory than necessary, and thus avoiding the copy-on-write, and the -disadvantage of having to use multiple event loops (which do not support -signal watchers). -.PP -When this is not possible, or you want to use the default loop for -other reasons, then in the process that wants to start \*(L"fresh\*(R", call -\&\f(CW\*(C`ev_loop_destroy (EV_DEFAULT)\*(C'\fR followed by \f(CW\*(C`ev_default_loop (...)\*(C'\fR. -Destroying the default loop will \*(L"orphan\*(R" (not stop) all registered -watchers, so you have to be careful not to execute code that modifies -those watchers. Note also that in that case, you have to re-register any -signal watchers. -.PP -\fIWatcher-Specific Functions and Data Members\fR -.IX Subsection "Watcher-Specific Functions and Data Members" -.IP "ev_fork_init (ev_fork *, callback)" 4 -.IX Item "ev_fork_init (ev_fork *, callback)" -Initialises and configures the fork watcher \- it has no parameters of any -kind. There is a \f(CW\*(C`ev_fork_set\*(C'\fR macro, but using it is utterly pointless, -really. -.ie n .SS """ev_cleanup"" \- even the best things end" -.el .SS "\f(CWev_cleanup\fP \- even the best things end" -.IX Subsection "ev_cleanup - even the best things end" -Cleanup watchers are called just before the event loop is being destroyed -by a call to \f(CW\*(C`ev_loop_destroy\*(C'\fR. -.PP -While there is no guarantee that the event loop gets destroyed, cleanup -watchers provide a convenient method to install cleanup hooks for your -program, worker threads and so on \- you just to make sure to destroy the -loop when you want them to be invoked. -.PP -Cleanup watchers are invoked in the same way as any other watcher. Unlike -all other watchers, they do not keep a reference to the event loop (which -makes a lot of sense if you think about it). Like all other watchers, you -can call libev functions in the callback, except \f(CW\*(C`ev_cleanup_start\*(C'\fR. -.PP -\fIWatcher-Specific Functions and Data Members\fR -.IX Subsection "Watcher-Specific Functions and Data Members" -.IP "ev_cleanup_init (ev_cleanup *, callback)" 4 -.IX Item "ev_cleanup_init (ev_cleanup *, callback)" -Initialises and configures the cleanup watcher \- it has no parameters of -any kind. There is a \f(CW\*(C`ev_cleanup_set\*(C'\fR macro, but using it is utterly -pointless, I assure you. -.PP -Example: Register an atexit handler to destroy the default loop, so any -cleanup functions are called. -.PP -.Vb 5 -\& static void -\& program_exits (void) -\& { -\& ev_loop_destroy (EV_DEFAULT_UC); -\& } -\& -\& ... -\& atexit (program_exits); -.Ve -.ie n .SS """ev_async"" \- how to wake up an event loop" -.el .SS "\f(CWev_async\fP \- how to wake up an event loop" -.IX Subsection "ev_async - how to wake up an event loop" -In general, you cannot use an \f(CW\*(C`ev_loop\*(C'\fR from multiple threads or other -asynchronous sources such as signal handlers (as opposed to multiple event -loops \- those are of course safe to use in different threads). -.PP -Sometimes, however, you need to wake up an event loop you do not control, -for example because it belongs to another thread. This is what \f(CW\*(C`ev_async\*(C'\fR -watchers do: as long as the \f(CW\*(C`ev_async\*(C'\fR watcher is active, you can signal -it by calling \f(CW\*(C`ev_async_send\*(C'\fR, which is thread\- and signal safe. -.PP -This functionality is very similar to \f(CW\*(C`ev_signal\*(C'\fR watchers, as signals, -too, are asynchronous in nature, and signals, too, will be compressed -(i.e. the number of callback invocations may be less than the number of -\&\f(CW\*(C`ev_async_send\*(C'\fR calls). In fact, you could use signal watchers as a kind -of \*(L"global async watchers\*(R" by using a watcher on an otherwise unused -signal, and \f(CW\*(C`ev_feed_signal\*(C'\fR to signal this watcher from another thread, -even without knowing which loop owns the signal. -.PP -\fIQueueing\fR -.IX Subsection "Queueing" -.PP -\&\f(CW\*(C`ev_async\*(C'\fR does not support queueing of data in any way. The reason -is that the author does not know of a simple (or any) algorithm for a -multiple-writer-single-reader queue that works in all cases and doesn't -need elaborate support such as pthreads or unportable memory access -semantics. -.PP -That means that if you want to queue data, you have to provide your own -queue. But at least I can tell you how to implement locking around your -queue: -.IP "queueing from a signal handler context" 4 -.IX Item "queueing from a signal handler context" -To implement race-free queueing, you simply add to the queue in the signal -handler but you block the signal handler in the watcher callback. Here is -an example that does that for some fictitious \s-1SIGUSR1\s0 handler: -.Sp -.Vb 1 -\& static ev_async mysig; -\& -\& static void -\& sigusr1_handler (void) -\& { -\& sometype data; -\& -\& // no locking etc. -\& queue_put (data); -\& ev_async_send (EV_DEFAULT_ &mysig); -\& } -\& -\& static void -\& mysig_cb (EV_P_ ev_async *w, int revents) -\& { -\& sometype data; -\& sigset_t block, prev; -\& -\& sigemptyset (&block); -\& sigaddset (&block, SIGUSR1); -\& sigprocmask (SIG_BLOCK, &block, &prev); -\& -\& while (queue_get (&data)) -\& process (data); -\& -\& if (sigismember (&prev, SIGUSR1) -\& sigprocmask (SIG_UNBLOCK, &block, 0); -\& } -.Ve -.Sp -(Note: pthreads in theory requires you to use \f(CW\*(C`pthread_setmask\*(C'\fR -instead of \f(CW\*(C`sigprocmask\*(C'\fR when you use threads, but libev doesn't do it -either...). -.IP "queueing from a thread context" 4 -.IX Item "queueing from a thread context" -The strategy for threads is different, as you cannot (easily) block -threads but you can easily preempt them, so to queue safely you need to -employ a traditional mutex lock, such as in this pthread example: -.Sp -.Vb 2 -\& static ev_async mysig; -\& static pthread_mutex_t mymutex = PTHREAD_MUTEX_INITIALIZER; -\& -\& static void -\& otherthread (void) -\& { -\& // only need to lock the actual queueing operation -\& pthread_mutex_lock (&mymutex); -\& queue_put (data); -\& pthread_mutex_unlock (&mymutex); -\& -\& ev_async_send (EV_DEFAULT_ &mysig); -\& } -\& -\& static void -\& mysig_cb (EV_P_ ev_async *w, int revents) -\& { -\& pthread_mutex_lock (&mymutex); -\& -\& while (queue_get (&data)) -\& process (data); -\& -\& pthread_mutex_unlock (&mymutex); -\& } -.Ve -.PP -\fIWatcher-Specific Functions and Data Members\fR -.IX Subsection "Watcher-Specific Functions and Data Members" -.IP "ev_async_init (ev_async *, callback)" 4 -.IX Item "ev_async_init (ev_async *, callback)" -Initialises and configures the async watcher \- it has no parameters of any -kind. There is a \f(CW\*(C`ev_async_set\*(C'\fR macro, but using it is utterly pointless, -trust me. -.IP "ev_async_send (loop, ev_async *)" 4 -.IX Item "ev_async_send (loop, ev_async *)" -Sends/signals/activates the given \f(CW\*(C`ev_async\*(C'\fR watcher, that is, feeds -an \f(CW\*(C`EV_ASYNC\*(C'\fR event on the watcher into the event loop, and instantly -returns. -.Sp -Unlike \f(CW\*(C`ev_feed_event\*(C'\fR, this call is safe to do from other threads, -signal or similar contexts (see the discussion of \f(CW\*(C`EV_ATOMIC_T\*(C'\fR in the -embedding section below on what exactly this means). -.Sp -Note that, as with other watchers in libev, multiple events might get -compressed into a single callback invocation (another way to look at -this is that \f(CW\*(C`ev_async\*(C'\fR watchers are level-triggered: they are set on -\&\f(CW\*(C`ev_async_send\*(C'\fR, reset when the event loop detects that). -.Sp -This call incurs the overhead of at most one extra system call per event -loop iteration, if the event loop is blocked, and no syscall at all if -the event loop (or your program) is processing events. That means that -repeated calls are basically free (there is no need to avoid calls for -performance reasons) and that the overhead becomes smaller (typically -zero) under load. -.IP "bool = ev_async_pending (ev_async *)" 4 -.IX Item "bool = ev_async_pending (ev_async *)" -Returns a non-zero value when \f(CW\*(C`ev_async_send\*(C'\fR has been called on the -watcher but the event has not yet been processed (or even noted) by the -event loop. -.Sp -\&\f(CW\*(C`ev_async_send\*(C'\fR sets a flag in the watcher and wakes up the loop. When -the loop iterates next and checks for the watcher to have become active, -it will reset the flag again. \f(CW\*(C`ev_async_pending\*(C'\fR can be used to very -quickly check whether invoking the loop might be a good idea. -.Sp -Not that this does \fInot\fR check whether the watcher itself is pending, -only whether it has been requested to make this watcher pending: there -is a time window between the event loop checking and resetting the async -notification, and the callback being invoked. -.SH "OTHER FUNCTIONS" -.IX Header "OTHER FUNCTIONS" -There are some other functions of possible interest. Described. Here. Now. -.IP "ev_once (loop, int fd, int events, ev_tstamp timeout, callback, arg)" 4 -.IX Item "ev_once (loop, int fd, int events, ev_tstamp timeout, callback, arg)" -This function combines a simple timer and an I/O watcher, calls your -callback on whichever event happens first and automatically stops both -watchers. This is useful if you want to wait for a single event on an fd -or timeout without having to allocate/configure/start/stop/free one or -more watchers yourself. -.Sp -If \f(CW\*(C`fd\*(C'\fR is less than 0, then no I/O watcher will be started and the -\&\f(CW\*(C`events\*(C'\fR argument is being ignored. Otherwise, an \f(CW\*(C`ev_io\*(C'\fR watcher for -the given \f(CW\*(C`fd\*(C'\fR and \f(CW\*(C`events\*(C'\fR set will be created and started. -.Sp -If \f(CW\*(C`timeout\*(C'\fR is less than 0, then no timeout watcher will be -started. Otherwise an \f(CW\*(C`ev_timer\*(C'\fR watcher with after = \f(CW\*(C`timeout\*(C'\fR (and -repeat = 0) will be started. \f(CW0\fR is a valid timeout. -.Sp -The callback has the type \f(CW\*(C`void (*cb)(int revents, void *arg)\*(C'\fR and is -passed an \f(CW\*(C`revents\*(C'\fR set like normal event callbacks (a combination of -\&\f(CW\*(C`EV_ERROR\*(C'\fR, \f(CW\*(C`EV_READ\*(C'\fR, \f(CW\*(C`EV_WRITE\*(C'\fR or \f(CW\*(C`EV_TIMER\*(C'\fR) and the \f(CW\*(C`arg\*(C'\fR -value passed to \f(CW\*(C`ev_once\*(C'\fR. Note that it is possible to receive \fIboth\fR -a timeout and an io event at the same time \- you probably should give io -events precedence. -.Sp -Example: wait up to ten seconds for data to appear on \s-1STDIN_FILENO.\s0 -.Sp -.Vb 7 -\& static void stdin_ready (int revents, void *arg) -\& { -\& if (revents & EV_READ) -\& /* stdin might have data for us, joy! */; -\& else if (revents & EV_TIMER) -\& /* doh, nothing entered */; -\& } -\& -\& ev_once (STDIN_FILENO, EV_READ, 10., stdin_ready, 0); -.Ve -.IP "ev_feed_fd_event (loop, int fd, int revents)" 4 -.IX Item "ev_feed_fd_event (loop, int fd, int revents)" -Feed an event on the given fd, as if a file descriptor backend detected -the given events. -.IP "ev_feed_signal_event (loop, int signum)" 4 -.IX Item "ev_feed_signal_event (loop, int signum)" -Feed an event as if the given signal occurred. See also \f(CW\*(C`ev_feed_signal\*(C'\fR, -which is async-safe. -.SH "COMMON OR USEFUL IDIOMS (OR BOTH)" -.IX Header "COMMON OR USEFUL IDIOMS (OR BOTH)" -This section explains some common idioms that are not immediately -obvious. Note that examples are sprinkled over the whole manual, and this -section only contains stuff that wouldn't fit anywhere else. -.SS "\s-1ASSOCIATING CUSTOM DATA WITH A WATCHER\s0" -.IX Subsection "ASSOCIATING CUSTOM DATA WITH A WATCHER" -Each watcher has, by default, a \f(CW\*(C`void *data\*(C'\fR member that you can read -or modify at any time: libev will completely ignore it. This can be used -to associate arbitrary data with your watcher. If you need more data and -don't want to allocate memory separately and store a pointer to it in that -data member, you can also \*(L"subclass\*(R" the watcher type and provide your own -data: -.PP -.Vb 7 -\& struct my_io -\& { -\& ev_io io; -\& int otherfd; -\& void *somedata; -\& struct whatever *mostinteresting; -\& }; -\& -\& ... -\& struct my_io w; -\& ev_io_init (&w.io, my_cb, fd, EV_READ); -.Ve -.PP -And since your callback will be called with a pointer to the watcher, you -can cast it back to your own type: -.PP -.Vb 5 -\& static void my_cb (struct ev_loop *loop, ev_io *w_, int revents) -\& { -\& struct my_io *w = (struct my_io *)w_; -\& ... -\& } -.Ve -.PP -More interesting and less C\-conformant ways of casting your callback -function type instead have been omitted. -.SS "\s-1BUILDING YOUR OWN COMPOSITE WATCHERS\s0" -.IX Subsection "BUILDING YOUR OWN COMPOSITE WATCHERS" -Another common scenario is to use some data structure with multiple -embedded watchers, in effect creating your own watcher that combines -multiple libev event sources into one \*(L"super-watcher\*(R": -.PP -.Vb 6 -\& struct my_biggy -\& { -\& int some_data; -\& ev_timer t1; -\& ev_timer t2; -\& } -.Ve -.PP -In this case getting the pointer to \f(CW\*(C`my_biggy\*(C'\fR is a bit more -complicated: Either you store the address of your \f(CW\*(C`my_biggy\*(C'\fR struct in -the \f(CW\*(C`data\*(C'\fR member of the watcher (for woozies or \*(C+ coders), or you need -to use some pointer arithmetic using \f(CW\*(C`offsetof\*(C'\fR inside your watchers (for -real programmers): -.PP -.Vb 1 -\& #include -\& -\& static void -\& t1_cb (EV_P_ ev_timer *w, int revents) -\& { -\& struct my_biggy big = (struct my_biggy *) -\& (((char *)w) \- offsetof (struct my_biggy, t1)); -\& } -\& -\& static void -\& t2_cb (EV_P_ ev_timer *w, int revents) -\& { -\& struct my_biggy big = (struct my_biggy *) -\& (((char *)w) \- offsetof (struct my_biggy, t2)); -\& } -.Ve -.SS "\s-1AVOIDING FINISHING BEFORE RETURNING\s0" -.IX Subsection "AVOIDING FINISHING BEFORE RETURNING" -Often you have structures like this in event-based programs: -.PP -.Vb 4 -\& callback () -\& { -\& free (request); -\& } -\& -\& request = start_new_request (..., callback); -.Ve -.PP -The intent is to start some \*(L"lengthy\*(R" operation. The \f(CW\*(C`request\*(C'\fR could be -used to cancel the operation, or do other things with it. -.PP -It's not uncommon to have code paths in \f(CW\*(C`start_new_request\*(C'\fR that -immediately invoke the callback, for example, to report errors. Or you add -some caching layer that finds that it can skip the lengthy aspects of the -operation and simply invoke the callback with the result. -.PP -The problem here is that this will happen \fIbefore\fR \f(CW\*(C`start_new_request\*(C'\fR -has returned, so \f(CW\*(C`request\*(C'\fR is not set. -.PP -Even if you pass the request by some safer means to the callback, you -might want to do something to the request after starting it, such as -canceling it, which probably isn't working so well when the callback has -already been invoked. -.PP -A common way around all these issues is to make sure that -\&\f(CW\*(C`start_new_request\*(C'\fR \fIalways\fR returns before the callback is invoked. If -\&\f(CW\*(C`start_new_request\*(C'\fR immediately knows the result, it can artificially -delay invoking the callback by using a \f(CW\*(C`prepare\*(C'\fR or \f(CW\*(C`idle\*(C'\fR watcher for -example, or more sneakily, by reusing an existing (stopped) watcher and -pushing it into the pending queue: -.PP -.Vb 2 -\& ev_set_cb (watcher, callback); -\& ev_feed_event (EV_A_ watcher, 0); -.Ve -.PP -This way, \f(CW\*(C`start_new_request\*(C'\fR can safely return before the callback is -invoked, while not delaying callback invocation too much. -.SS "\s-1MODEL/NESTED EVENT LOOP INVOCATIONS AND EXIT CONDITIONS\s0" -.IX Subsection "MODEL/NESTED EVENT LOOP INVOCATIONS AND EXIT CONDITIONS" -Often (especially in \s-1GUI\s0 toolkits) there are places where you have -\&\fImodal\fR interaction, which is most easily implemented by recursively -invoking \f(CW\*(C`ev_run\*(C'\fR. -.PP -This brings the problem of exiting \- a callback might want to finish the -main \f(CW\*(C`ev_run\*(C'\fR call, but not the nested one (e.g. user clicked \*(L"Quit\*(R", but -a modal \*(L"Are you sure?\*(R" dialog is still waiting), or just the nested one -and not the main one (e.g. user clocked \*(L"Ok\*(R" in a modal dialog), or some -other combination: In these cases, a simple \f(CW\*(C`ev_break\*(C'\fR will not work. -.PP -The solution is to maintain \*(L"break this loop\*(R" variable for each \f(CW\*(C`ev_run\*(C'\fR -invocation, and use a loop around \f(CW\*(C`ev_run\*(C'\fR until the condition is -triggered, using \f(CW\*(C`EVRUN_ONCE\*(C'\fR: -.PP -.Vb 2 -\& // main loop -\& int exit_main_loop = 0; -\& -\& while (!exit_main_loop) -\& ev_run (EV_DEFAULT_ EVRUN_ONCE); -\& -\& // in a modal watcher -\& int exit_nested_loop = 0; -\& -\& while (!exit_nested_loop) -\& ev_run (EV_A_ EVRUN_ONCE); -.Ve -.PP -To exit from any of these loops, just set the corresponding exit variable: -.PP -.Vb 2 -\& // exit modal loop -\& exit_nested_loop = 1; -\& -\& // exit main program, after modal loop is finished -\& exit_main_loop = 1; -\& -\& // exit both -\& exit_main_loop = exit_nested_loop = 1; -.Ve -.SS "\s-1THREAD LOCKING EXAMPLE\s0" -.IX Subsection "THREAD LOCKING EXAMPLE" -Here is a fictitious example of how to run an event loop in a different -thread from where callbacks are being invoked and watchers are -created/added/removed. -.PP -For a real-world example, see the \f(CW\*(C`EV::Loop::Async\*(C'\fR perl module, -which uses exactly this technique (which is suited for many high-level -languages). -.PP -The example uses a pthread mutex to protect the loop data, a condition -variable to wait for callback invocations, an async watcher to notify the -event loop thread and an unspecified mechanism to wake up the main thread. -.PP -First, you need to associate some data with the event loop: -.PP -.Vb 6 -\& typedef struct { -\& mutex_t lock; /* global loop lock */ -\& ev_async async_w; -\& thread_t tid; -\& cond_t invoke_cv; -\& } userdata; -\& -\& void prepare_loop (EV_P) -\& { -\& // for simplicity, we use a static userdata struct. -\& static userdata u; -\& -\& ev_async_init (&u\->async_w, async_cb); -\& ev_async_start (EV_A_ &u\->async_w); -\& -\& pthread_mutex_init (&u\->lock, 0); -\& pthread_cond_init (&u\->invoke_cv, 0); -\& -\& // now associate this with the loop -\& ev_set_userdata (EV_A_ u); -\& ev_set_invoke_pending_cb (EV_A_ l_invoke); -\& ev_set_loop_release_cb (EV_A_ l_release, l_acquire); -\& -\& // then create the thread running ev_run -\& pthread_create (&u\->tid, 0, l_run, EV_A); -\& } -.Ve -.PP -The callback for the \f(CW\*(C`ev_async\*(C'\fR watcher does nothing: the watcher is used -solely to wake up the event loop so it takes notice of any new watchers -that might have been added: -.PP -.Vb 5 -\& static void -\& async_cb (EV_P_ ev_async *w, int revents) -\& { -\& // just used for the side effects -\& } -.Ve -.PP -The \f(CW\*(C`l_release\*(C'\fR and \f(CW\*(C`l_acquire\*(C'\fR callbacks simply unlock/lock the mutex -protecting the loop data, respectively. -.PP -.Vb 6 -\& static void -\& l_release (EV_P) -\& { -\& userdata *u = ev_userdata (EV_A); -\& pthread_mutex_unlock (&u\->lock); -\& } -\& -\& static void -\& l_acquire (EV_P) -\& { -\& userdata *u = ev_userdata (EV_A); -\& pthread_mutex_lock (&u\->lock); -\& } -.Ve -.PP -The event loop thread first acquires the mutex, and then jumps straight -into \f(CW\*(C`ev_run\*(C'\fR: -.PP -.Vb 4 -\& void * -\& l_run (void *thr_arg) -\& { -\& struct ev_loop *loop = (struct ev_loop *)thr_arg; -\& -\& l_acquire (EV_A); -\& pthread_setcanceltype (PTHREAD_CANCEL_ASYNCHRONOUS, 0); -\& ev_run (EV_A_ 0); -\& l_release (EV_A); -\& -\& return 0; -\& } -.Ve -.PP -Instead of invoking all pending watchers, the \f(CW\*(C`l_invoke\*(C'\fR callback will -signal the main thread via some unspecified mechanism (signals? pipe -writes? \f(CW\*(C`Async::Interrupt\*(C'\fR?) and then waits until all pending watchers -have been called (in a while loop because a) spurious wakeups are possible -and b) skipping inter-thread-communication when there are no pending -watchers is very beneficial): -.PP -.Vb 4 -\& static void -\& l_invoke (EV_P) -\& { -\& userdata *u = ev_userdata (EV_A); -\& -\& while (ev_pending_count (EV_A)) -\& { -\& wake_up_other_thread_in_some_magic_or_not_so_magic_way (); -\& pthread_cond_wait (&u\->invoke_cv, &u\->lock); -\& } -\& } -.Ve -.PP -Now, whenever the main thread gets told to invoke pending watchers, it -will grab the lock, call \f(CW\*(C`ev_invoke_pending\*(C'\fR and then signal the loop -thread to continue: -.PP -.Vb 4 -\& static void -\& real_invoke_pending (EV_P) -\& { -\& userdata *u = ev_userdata (EV_A); -\& -\& pthread_mutex_lock (&u\->lock); -\& ev_invoke_pending (EV_A); -\& pthread_cond_signal (&u\->invoke_cv); -\& pthread_mutex_unlock (&u\->lock); -\& } -.Ve -.PP -Whenever you want to start/stop a watcher or do other modifications to an -event loop, you will now have to lock: -.PP -.Vb 2 -\& ev_timer timeout_watcher; -\& userdata *u = ev_userdata (EV_A); -\& -\& ev_timer_init (&timeout_watcher, timeout_cb, 5.5, 0.); -\& -\& pthread_mutex_lock (&u\->lock); -\& ev_timer_start (EV_A_ &timeout_watcher); -\& ev_async_send (EV_A_ &u\->async_w); -\& pthread_mutex_unlock (&u\->lock); -.Ve -.PP -Note that sending the \f(CW\*(C`ev_async\*(C'\fR watcher is required because otherwise -an event loop currently blocking in the kernel will have no knowledge -about the newly added timer. By waking up the loop it will pick up any new -watchers in the next event loop iteration. -.SS "\s-1THREADS, COROUTINES, CONTINUATIONS, QUEUES... INSTEAD OF CALLBACKS\s0" -.IX Subsection "THREADS, COROUTINES, CONTINUATIONS, QUEUES... INSTEAD OF CALLBACKS" -While the overhead of a callback that e.g. schedules a thread is small, it -is still an overhead. If you embed libev, and your main usage is with some -kind of threads or coroutines, you might want to customise libev so that -doesn't need callbacks anymore. -.PP -Imagine you have coroutines that you can switch to using a function -\&\f(CW\*(C`switch_to (coro)\*(C'\fR, that libev runs in a coroutine called \f(CW\*(C`libev_coro\*(C'\fR -and that due to some magic, the currently active coroutine is stored in a -global called \f(CW\*(C`current_coro\*(C'\fR. Then you can build your own \*(L"wait for libev -event\*(R" primitive by changing \f(CW\*(C`EV_CB_DECLARE\*(C'\fR and \f(CW\*(C`EV_CB_INVOKE\*(C'\fR (note -the differing \f(CW\*(C`;\*(C'\fR conventions): -.PP -.Vb 2 -\& #define EV_CB_DECLARE(type) struct my_coro *cb; -\& #define EV_CB_INVOKE(watcher) switch_to ((watcher)\->cb) -.Ve -.PP -That means instead of having a C callback function, you store the -coroutine to switch to in each watcher, and instead of having libev call -your callback, you instead have it switch to that coroutine. -.PP -A coroutine might now wait for an event with a function called -\&\f(CW\*(C`wait_for_event\*(C'\fR. (the watcher needs to be started, as always, but it doesn't -matter when, or whether the watcher is active or not when this function is -called): -.PP -.Vb 6 -\& void -\& wait_for_event (ev_watcher *w) -\& { -\& ev_set_cb (w, current_coro); -\& switch_to (libev_coro); -\& } -.Ve -.PP -That basically suspends the coroutine inside \f(CW\*(C`wait_for_event\*(C'\fR and -continues the libev coroutine, which, when appropriate, switches back to -this or any other coroutine. -.PP -You can do similar tricks if you have, say, threads with an event queue \- -instead of storing a coroutine, you store the queue object and instead of -switching to a coroutine, you push the watcher onto the queue and notify -any waiters. -.PP -To embed libev, see \*(L"\s-1EMBEDDING\*(R"\s0, but in short, it's easiest to create two -files, \fImy_ev.h\fR and \fImy_ev.c\fR that include the respective libev files: -.PP -.Vb 4 -\& // my_ev.h -\& #define EV_CB_DECLARE(type) struct my_coro *cb; -\& #define EV_CB_INVOKE(watcher) switch_to ((watcher)\->cb) -\& #include "../libev/ev.h" -\& -\& // my_ev.c -\& #define EV_H "my_ev.h" -\& #include "../libev/ev.c" -.Ve -.PP -And then use \fImy_ev.h\fR when you would normally use \fIev.h\fR, and compile -\&\fImy_ev.c\fR into your project. When properly specifying include paths, you -can even use \fIev.h\fR as header file name directly. -.SH "LIBEVENT EMULATION" -.IX Header "LIBEVENT EMULATION" -Libev offers a compatibility emulation layer for libevent. It cannot -emulate the internals of libevent, so here are some usage hints: -.IP "\(bu" 4 -Only the libevent\-1.4.1\-beta \s-1API\s0 is being emulated. -.Sp -This was the newest libevent version available when libev was implemented, -and is still mostly unchanged in 2010. -.IP "\(bu" 4 -Use it by including , as usual. -.IP "\(bu" 4 -The following members are fully supported: ev_base, ev_callback, -ev_arg, ev_fd, ev_res, ev_events. -.IP "\(bu" 4 -Avoid using ev_flags and the EVLIST_*\-macros, while it is -maintained by libev, it does not work exactly the same way as in libevent (consider -it a private \s-1API\s0). -.IP "\(bu" 4 -Priorities are not currently supported. Initialising priorities -will fail and all watchers will have the same priority, even though there -is an ev_pri field. -.IP "\(bu" 4 -In libevent, the last base created gets the signals, in libev, the -base that registered the signal gets the signals. -.IP "\(bu" 4 -Other members are not supported. -.IP "\(bu" 4 -The libev emulation is \fInot\fR \s-1ABI\s0 compatible to libevent, you need -to use the libev header file and library. -.SH "\*(C+ SUPPORT" -.IX Header " SUPPORT" -.SS "C \s-1API\s0" -.IX Subsection "C API" -The normal C \s-1API\s0 should work fine when used from \*(C+: both ev.h and the -libev sources can be compiled as \*(C+. Therefore, code that uses the C \s-1API\s0 -will work fine. -.PP -Proper exception specifications might have to be added to callbacks passed -to libev: exceptions may be thrown only from watcher callbacks, all other -callbacks (allocator, syserr, loop acquire/release and periodic reschedule -callbacks) must not throw exceptions, and might need a \f(CW\*(C`noexcept\*(C'\fR -specification. If you have code that needs to be compiled as both C and -\&\*(C+ you can use the \f(CW\*(C`EV_NOEXCEPT\*(C'\fR macro for this: -.PP -.Vb 6 -\& static void -\& fatal_error (const char *msg) EV_NOEXCEPT -\& { -\& perror (msg); -\& abort (); -\& } -\& -\& ... -\& ev_set_syserr_cb (fatal_error); -.Ve -.PP -The only \s-1API\s0 functions that can currently throw exceptions are \f(CW\*(C`ev_run\*(C'\fR, -\&\f(CW\*(C`ev_invoke\*(C'\fR, \f(CW\*(C`ev_invoke_pending\*(C'\fR and \f(CW\*(C`ev_loop_destroy\*(C'\fR (the latter -because it runs cleanup watchers). -.PP -Throwing exceptions in watcher callbacks is only supported if libev itself -is compiled with a \*(C+ compiler or your C and \*(C+ environments allow -throwing exceptions through C libraries (most do). -.SS "\*(C+ \s-1API\s0" -.IX Subsection " API" -Libev comes with some simplistic wrapper classes for \*(C+ that mainly allow -you to use some convenience methods to start/stop watchers and also change -the callback model to a model using method callbacks on objects. -.PP -To use it, -.PP -.Vb 1 -\& #include -.Ve -.PP -This automatically includes \fIev.h\fR and puts all of its definitions (many -of them macros) into the global namespace. All \*(C+ specific things are -put into the \f(CW\*(C`ev\*(C'\fR namespace. It should support all the same embedding -options as \fIev.h\fR, most notably \f(CW\*(C`EV_MULTIPLICITY\*(C'\fR. -.PP -Care has been taken to keep the overhead low. The only data member the \*(C+ -classes add (compared to plain C\-style watchers) is the event loop pointer -that the watcher is associated with (or no additional members at all if -you disable \f(CW\*(C`EV_MULTIPLICITY\*(C'\fR when embedding libev). -.PP -Currently, functions, static and non-static member functions and classes -with \f(CW\*(C`operator ()\*(C'\fR can be used as callbacks. Other types should be easy -to add as long as they only need one additional pointer for context. If -you need support for other types of functors please contact the author -(preferably after implementing it). -.PP -For all this to work, your \*(C+ compiler either has to use the same calling -conventions as your C compiler (for static member functions), or you have -to embed libev and compile libev itself as \*(C+. -.PP -Here is a list of things available in the \f(CW\*(C`ev\*(C'\fR namespace: -.ie n .IP """ev::READ"", ""ev::WRITE"" etc." 4 -.el .IP "\f(CWev::READ\fR, \f(CWev::WRITE\fR etc." 4 -.IX Item "ev::READ, ev::WRITE etc." -These are just enum values with the same values as the \f(CW\*(C`EV_READ\*(C'\fR etc. -macros from \fIev.h\fR. -.ie n .IP """ev::tstamp"", ""ev::now""" 4 -.el .IP "\f(CWev::tstamp\fR, \f(CWev::now\fR" 4 -.IX Item "ev::tstamp, ev::now" -Aliases to the same types/functions as with the \f(CW\*(C`ev_\*(C'\fR prefix. -.ie n .IP """ev::io"", ""ev::timer"", ""ev::periodic"", ""ev::idle"", ""ev::sig"" etc." 4 -.el .IP "\f(CWev::io\fR, \f(CWev::timer\fR, \f(CWev::periodic\fR, \f(CWev::idle\fR, \f(CWev::sig\fR etc." 4 -.IX Item "ev::io, ev::timer, ev::periodic, ev::idle, ev::sig etc." -For each \f(CW\*(C`ev_TYPE\*(C'\fR watcher in \fIev.h\fR there is a corresponding class of -the same name in the \f(CW\*(C`ev\*(C'\fR namespace, with the exception of \f(CW\*(C`ev_signal\*(C'\fR -which is called \f(CW\*(C`ev::sig\*(C'\fR to avoid clashes with the \f(CW\*(C`signal\*(C'\fR macro -defined by many implementations. -.Sp -All of those classes have these methods: -.RS 4 -.IP "ev::TYPE::TYPE ()" 4 -.IX Item "ev::TYPE::TYPE ()" -.PD 0 -.IP "ev::TYPE::TYPE (loop)" 4 -.IX Item "ev::TYPE::TYPE (loop)" -.IP "ev::TYPE::~TYPE" 4 -.IX Item "ev::TYPE::~TYPE" -.PD -The constructor (optionally) takes an event loop to associate the watcher -with. If it is omitted, it will use \f(CW\*(C`EV_DEFAULT\*(C'\fR. -.Sp -The constructor calls \f(CW\*(C`ev_init\*(C'\fR for you, which means you have to call the -\&\f(CW\*(C`set\*(C'\fR method before starting it. -.Sp -It will not set a callback, however: You have to call the templated \f(CW\*(C`set\*(C'\fR -method to set a callback before you can start the watcher. -.Sp -(The reason why you have to use a method is a limitation in \*(C+ which does -not allow explicit template arguments for constructors). -.Sp -The destructor automatically stops the watcher if it is active. -.IP "w\->set (object *)" 4 -.IX Item "w->set (object *)" -This method sets the callback method to call. The method has to have a -signature of \f(CW\*(C`void (*)(ev_TYPE &, int)\*(C'\fR, it receives the watcher as -first argument and the \f(CW\*(C`revents\*(C'\fR as second. The object must be given as -parameter and is stored in the \f(CW\*(C`data\*(C'\fR member of the watcher. -.Sp -This method synthesizes efficient thunking code to call your method from -the C callback that libev requires. If your compiler can inline your -callback (i.e. it is visible to it at the place of the \f(CW\*(C`set\*(C'\fR call and -your compiler is good :), then the method will be fully inlined into the -thunking function, making it as fast as a direct C callback. -.Sp -Example: simple class declaration and watcher initialisation -.Sp -.Vb 4 -\& struct myclass -\& { -\& void io_cb (ev::io &w, int revents) { } -\& } -\& -\& myclass obj; -\& ev::io iow; -\& iow.set (&obj); -.Ve -.IP "w\->set (object *)" 4 -.IX Item "w->set (object *)" -This is a variation of a method callback \- leaving out the method to call -will default the method to \f(CW\*(C`operator ()\*(C'\fR, which makes it possible to use -functor objects without having to manually specify the \f(CW\*(C`operator ()\*(C'\fR all -the time. Incidentally, you can then also leave out the template argument -list. -.Sp -The \f(CW\*(C`operator ()\*(C'\fR method prototype must be \f(CW\*(C`void operator ()(watcher &w, -int revents)\*(C'\fR. -.Sp -See the method\-\f(CW\*(C`set\*(C'\fR above for more details. -.Sp -Example: use a functor object as callback. -.Sp -.Vb 7 -\& struct myfunctor -\& { -\& void operator() (ev::io &w, int revents) -\& { -\& ... -\& } -\& } -\& -\& myfunctor f; -\& -\& ev::io w; -\& w.set (&f); -.Ve -.IP "w\->set (void *data = 0)" 4 -.IX Item "w->set (void *data = 0)" -Also sets a callback, but uses a static method or plain function as -callback. The optional \f(CW\*(C`data\*(C'\fR argument will be stored in the watcher's -\&\f(CW\*(C`data\*(C'\fR member and is free for you to use. -.Sp -The prototype of the \f(CW\*(C`function\*(C'\fR must be \f(CW\*(C`void (*)(ev::TYPE &w, int)\*(C'\fR. -.Sp -See the method\-\f(CW\*(C`set\*(C'\fR above for more details. -.Sp -Example: Use a plain function as callback. -.Sp -.Vb 2 -\& static void io_cb (ev::io &w, int revents) { } -\& iow.set (); -.Ve -.IP "w\->set (loop)" 4 -.IX Item "w->set (loop)" -Associates a different \f(CW\*(C`struct ev_loop\*(C'\fR with this watcher. You can only -do this when the watcher is inactive (and not pending either). -.IP "w\->set ([arguments])" 4 -.IX Item "w->set ([arguments])" -Basically the same as \f(CW\*(C`ev_TYPE_set\*(C'\fR (except for \f(CW\*(C`ev::embed\*(C'\fR watchers>), -with the same arguments. Either this method or a suitable start method -must be called at least once. Unlike the C counterpart, an active watcher -gets automatically stopped and restarted when reconfiguring it with this -method. -.Sp -For \f(CW\*(C`ev::embed\*(C'\fR watchers this method is called \f(CW\*(C`set_embed\*(C'\fR, to avoid -clashing with the \f(CW\*(C`set (loop)\*(C'\fR method. -.Sp -For \f(CW\*(C`ev::io\*(C'\fR watchers there is an additional \f(CW\*(C`set\*(C'\fR method that acepts a -new event mask only, and internally calls \f(CW\*(C`ev_io_modfify\*(C'\fR. -.IP "w\->start ()" 4 -.IX Item "w->start ()" -Starts the watcher. Note that there is no \f(CW\*(C`loop\*(C'\fR argument, as the -constructor already stores the event loop. -.IP "w\->start ([arguments])" 4 -.IX Item "w->start ([arguments])" -Instead of calling \f(CW\*(C`set\*(C'\fR and \f(CW\*(C`start\*(C'\fR methods separately, it is often -convenient to wrap them in one call. Uses the same type of arguments as -the configure \f(CW\*(C`set\*(C'\fR method of the watcher. -.IP "w\->stop ()" 4 -.IX Item "w->stop ()" -Stops the watcher if it is active. Again, no \f(CW\*(C`loop\*(C'\fR argument. -.ie n .IP "w\->again () (""ev::timer"", ""ev::periodic"" only)" 4 -.el .IP "w\->again () (\f(CWev::timer\fR, \f(CWev::periodic\fR only)" 4 -.IX Item "w->again () (ev::timer, ev::periodic only)" -For \f(CW\*(C`ev::timer\*(C'\fR and \f(CW\*(C`ev::periodic\*(C'\fR, this invokes the corresponding -\&\f(CW\*(C`ev_TYPE_again\*(C'\fR function. -.ie n .IP "w\->sweep () (""ev::embed"" only)" 4 -.el .IP "w\->sweep () (\f(CWev::embed\fR only)" 4 -.IX Item "w->sweep () (ev::embed only)" -Invokes \f(CW\*(C`ev_embed_sweep\*(C'\fR. -.ie n .IP "w\->update () (""ev::stat"" only)" 4 -.el .IP "w\->update () (\f(CWev::stat\fR only)" 4 -.IX Item "w->update () (ev::stat only)" -Invokes \f(CW\*(C`ev_stat_stat\*(C'\fR. -.RE -.RS 4 -.RE -.PP -Example: Define a class with two I/O and idle watchers, start the I/O -watchers in the constructor. -.PP -.Vb 5 -\& class myclass -\& { -\& ev::io io ; void io_cb (ev::io &w, int revents); -\& ev::io io2 ; void io2_cb (ev::io &w, int revents); -\& ev::idle idle; void idle_cb (ev::idle &w, int revents); -\& -\& myclass (int fd) -\& { -\& io .set (this); -\& io2 .set (this); -\& idle.set (this); -\& -\& io.set (fd, ev::WRITE); // configure the watcher -\& io.start (); // start it whenever convenient -\& -\& io2.start (fd, ev::READ); // set + start in one call -\& } -\& }; -.Ve -.SH "OTHER LANGUAGE BINDINGS" -.IX Header "OTHER LANGUAGE BINDINGS" -Libev does not offer other language bindings itself, but bindings for a -number of languages exist in the form of third-party packages. If you know -any interesting language binding in addition to the ones listed here, drop -me a note. -.IP "Perl" 4 -.IX Item "Perl" -The \s-1EV\s0 module implements the full libev \s-1API\s0 and is actually used to test -libev. \s-1EV\s0 is developed together with libev. Apart from the \s-1EV\s0 core module, -there are additional modules that implement libev-compatible interfaces -to \f(CW\*(C`libadns\*(C'\fR (\f(CW\*(C`EV::ADNS\*(C'\fR, but \f(CW\*(C`AnyEvent::DNS\*(C'\fR is preferred nowadays), -\&\f(CW\*(C`Net::SNMP\*(C'\fR (\f(CW\*(C`Net::SNMP::EV\*(C'\fR) and the \f(CW\*(C`libglib\*(C'\fR event core (\f(CW\*(C`Glib::EV\*(C'\fR -and \f(CW\*(C`EV::Glib\*(C'\fR). -.Sp -It can be found and installed via \s-1CPAN,\s0 its homepage is at -. -.IP "Python" 4 -.IX Item "Python" -Python bindings can be found at . It -seems to be quite complete and well-documented. -.IP "Ruby" 4 -.IX Item "Ruby" -Tony Arcieri has written a ruby extension that offers access to a subset -of the libev \s-1API\s0 and adds file handle abstractions, asynchronous \s-1DNS\s0 and -more on top of it. It can be found via gem servers. Its homepage is at -. -.Sp -Roger Pack reports that using the link order \f(CW\*(C`\-lws2_32 \-lmsvcrt\-ruby\-190\*(C'\fR -makes rev work even on mingw. -.IP "Haskell" 4 -.IX Item "Haskell" -A haskell binding to libev is available at -. -.IP "D" 4 -.IX Item "D" -Leandro Lucarella has written a D language binding (\fIev.d\fR) for libev, to -be found at . -.IP "Ocaml" 4 -.IX Item "Ocaml" -Erkki Seppala has written Ocaml bindings for libev, to be found at -. -.IP "Lua" 4 -.IX Item "Lua" -Brian Maher has written a partial interface to libev for lua (at the -time of this writing, only \f(CW\*(C`ev_io\*(C'\fR and \f(CW\*(C`ev_timer\*(C'\fR), to be found at -. -.IP "Javascript" 4 -.IX Item "Javascript" -Node.js () uses libev as the underlying event library. -.IP "Others" 4 -.IX Item "Others" -There are others, and I stopped counting. -.SH "MACRO MAGIC" -.IX Header "MACRO MAGIC" -Libev can be compiled with a variety of options, the most fundamental -of which is \f(CW\*(C`EV_MULTIPLICITY\*(C'\fR. This option determines whether (most) -functions and callbacks have an initial \f(CW\*(C`struct ev_loop *\*(C'\fR argument. -.PP -To make it easier to write programs that cope with either variant, the -following macros are defined: -.ie n .IP """EV_A"", ""EV_A_""" 4 -.el .IP "\f(CWEV_A\fR, \f(CWEV_A_\fR" 4 -.IX Item "EV_A, EV_A_" -This provides the loop \fIargument\fR for functions, if one is required (\*(L"ev -loop argument\*(R"). The \f(CW\*(C`EV_A\*(C'\fR form is used when this is the sole argument, -\&\f(CW\*(C`EV_A_\*(C'\fR is used when other arguments are following. Example: -.Sp -.Vb 3 -\& ev_unref (EV_A); -\& ev_timer_add (EV_A_ watcher); -\& ev_run (EV_A_ 0); -.Ve -.Sp -It assumes the variable \f(CW\*(C`loop\*(C'\fR of type \f(CW\*(C`struct ev_loop *\*(C'\fR is in scope, -which is often provided by the following macro. -.ie n .IP """EV_P"", ""EV_P_""" 4 -.el .IP "\f(CWEV_P\fR, \f(CWEV_P_\fR" 4 -.IX Item "EV_P, EV_P_" -This provides the loop \fIparameter\fR for functions, if one is required (\*(L"ev -loop parameter\*(R"). The \f(CW\*(C`EV_P\*(C'\fR form is used when this is the sole parameter, -\&\f(CW\*(C`EV_P_\*(C'\fR is used when other parameters are following. Example: -.Sp -.Vb 2 -\& // this is how ev_unref is being declared -\& static void ev_unref (EV_P); -\& -\& // this is how you can declare your typical callback -\& static void cb (EV_P_ ev_timer *w, int revents) -.Ve -.Sp -It declares a parameter \f(CW\*(C`loop\*(C'\fR of type \f(CW\*(C`struct ev_loop *\*(C'\fR, quite -suitable for use with \f(CW\*(C`EV_A\*(C'\fR. -.ie n .IP """EV_DEFAULT"", ""EV_DEFAULT_""" 4 -.el .IP "\f(CWEV_DEFAULT\fR, \f(CWEV_DEFAULT_\fR" 4 -.IX Item "EV_DEFAULT, EV_DEFAULT_" -Similar to the other two macros, this gives you the value of the default -loop, if multiple loops are supported (\*(L"ev loop default\*(R"). The default loop -will be initialised if it isn't already initialised. -.Sp -For non-multiplicity builds, these macros do nothing, so you always have -to initialise the loop somewhere. -.ie n .IP """EV_DEFAULT_UC"", ""EV_DEFAULT_UC_""" 4 -.el .IP "\f(CWEV_DEFAULT_UC\fR, \f(CWEV_DEFAULT_UC_\fR" 4 -.IX Item "EV_DEFAULT_UC, EV_DEFAULT_UC_" -Usage identical to \f(CW\*(C`EV_DEFAULT\*(C'\fR and \f(CW\*(C`EV_DEFAULT_\*(C'\fR, but requires that the -default loop has been initialised (\f(CW\*(C`UC\*(C'\fR == unchecked). Their behaviour -is undefined when the default loop has not been initialised by a previous -execution of \f(CW\*(C`EV_DEFAULT\*(C'\fR, \f(CW\*(C`EV_DEFAULT_\*(C'\fR or \f(CW\*(C`ev_default_init (...)\*(C'\fR. -.Sp -It is often prudent to use \f(CW\*(C`EV_DEFAULT\*(C'\fR when initialising the first -watcher in a function but use \f(CW\*(C`EV_DEFAULT_UC\*(C'\fR afterwards. -.PP -Example: Declare and initialise a check watcher, utilising the above -macros so it will work regardless of whether multiple loops are supported -or not. -.PP -.Vb 5 -\& static void -\& check_cb (EV_P_ ev_timer *w, int revents) -\& { -\& ev_check_stop (EV_A_ w); -\& } -\& -\& ev_check check; -\& ev_check_init (&check, check_cb); -\& ev_check_start (EV_DEFAULT_ &check); -\& ev_run (EV_DEFAULT_ 0); -.Ve -.SH "EMBEDDING" -.IX Header "EMBEDDING" -Libev can (and often is) directly embedded into host -applications. Examples of applications that embed it include the Deliantra -Game Server, the \s-1EV\s0 perl module, the \s-1GNU\s0 Virtual Private Ethernet (gvpe) -and rxvt-unicode. -.PP -The goal is to enable you to just copy the necessary files into your -source directory without having to change even a single line in them, so -you can easily upgrade by simply copying (or having a checked-out copy of -libev somewhere in your source tree). -.SS "\s-1FILESETS\s0" -.IX Subsection "FILESETS" -Depending on what features you need you need to include one or more sets of files -in your application. -.PP -\fI\s-1CORE EVENT LOOP\s0\fR -.IX Subsection "CORE EVENT LOOP" -.PP -To include only the libev core (all the \f(CW\*(C`ev_*\*(C'\fR functions), with manual -configuration (no autoconf): -.PP -.Vb 2 -\& #define EV_STANDALONE 1 -\& #include "ev.c" -.Ve -.PP -This will automatically include \fIev.h\fR, too, and should be done in a -single C source file only to provide the function implementations. To use -it, do the same for \fIev.h\fR in all files wishing to use this \s-1API\s0 (best -done by writing a wrapper around \fIev.h\fR that you can include instead and -where you can put other configuration options): -.PP -.Vb 2 -\& #define EV_STANDALONE 1 -\& #include "ev.h" -.Ve -.PP -Both header files and implementation files can be compiled with a \*(C+ -compiler (at least, that's a stated goal, and breakage will be treated -as a bug). -.PP -You need the following files in your source tree, or in a directory -in your include path (e.g. in libev/ when using \-Ilibev): -.PP -.Vb 4 -\& ev.h -\& ev.c -\& ev_vars.h -\& ev_wrap.h -\& -\& ev_win32.c required on win32 platforms only -\& -\& ev_select.c only when select backend is enabled -\& ev_poll.c only when poll backend is enabled -\& ev_epoll.c only when the epoll backend is enabled -\& ev_linuxaio.c only when the linux aio backend is enabled -\& ev_iouring.c only when the linux io_uring backend is enabled -\& ev_kqueue.c only when the kqueue backend is enabled -\& ev_port.c only when the solaris port backend is enabled -.Ve -.PP -\&\fIev.c\fR includes the backend files directly when enabled, so you only need -to compile this single file. -.PP -\fI\s-1LIBEVENT COMPATIBILITY API\s0\fR -.IX Subsection "LIBEVENT COMPATIBILITY API" -.PP -To include the libevent compatibility \s-1API,\s0 also include: -.PP -.Vb 1 -\& #include "event.c" -.Ve -.PP -in the file including \fIev.c\fR, and: -.PP -.Vb 1 -\& #include "event.h" -.Ve -.PP -in the files that want to use the libevent \s-1API.\s0 This also includes \fIev.h\fR. -.PP -You need the following additional files for this: -.PP -.Vb 2 -\& event.h -\& event.c -.Ve -.PP -\fI\s-1AUTOCONF SUPPORT\s0\fR -.IX Subsection "AUTOCONF SUPPORT" -.PP -Instead of using \f(CW\*(C`EV_STANDALONE=1\*(C'\fR and providing your configuration in -whatever way you want, you can also \f(CW\*(C`m4_include([libev.m4])\*(C'\fR in your -\&\fIconfigure.ac\fR and leave \f(CW\*(C`EV_STANDALONE\*(C'\fR undefined. \fIev.c\fR will then -include \fIconfig.h\fR and configure itself accordingly. -.PP -For this of course you need the m4 file: -.PP -.Vb 1 -\& libev.m4 -.Ve -.SS "\s-1PREPROCESSOR SYMBOLS/MACROS\s0" -.IX Subsection "PREPROCESSOR SYMBOLS/MACROS" -Libev can be configured via a variety of preprocessor symbols you have to -define before including (or compiling) any of its files. The default in -the absence of autoconf is documented for every option. -.PP -Symbols marked with \*(L"(h)\*(R" do not change the \s-1ABI,\s0 and can have different -values when compiling libev vs. including \fIev.h\fR, so it is permissible -to redefine them before including \fIev.h\fR without breaking compatibility -to a compiled library. All other symbols change the \s-1ABI,\s0 which means all -users of libev and the libev code itself must be compiled with compatible -settings. -.IP "\s-1EV_COMPAT3\s0 (h)" 4 -.IX Item "EV_COMPAT3 (h)" -Backwards compatibility is a major concern for libev. This is why this -release of libev comes with wrappers for the functions and symbols that -have been renamed between libev version 3 and 4. -.Sp -You can disable these wrappers (to test compatibility with future -versions) by defining \f(CW\*(C`EV_COMPAT3\*(C'\fR to \f(CW0\fR when compiling your -sources. This has the additional advantage that you can drop the \f(CW\*(C`struct\*(C'\fR -from \f(CW\*(C`struct ev_loop\*(C'\fR declarations, as libev will provide an \f(CW\*(C`ev_loop\*(C'\fR -typedef in that case. -.Sp -In some future version, the default for \f(CW\*(C`EV_COMPAT3\*(C'\fR will become \f(CW0\fR, -and in some even more future version the compatibility code will be -removed completely. -.IP "\s-1EV_STANDALONE\s0 (h)" 4 -.IX Item "EV_STANDALONE (h)" -Must always be \f(CW1\fR if you do not use autoconf configuration, which -keeps libev from including \fIconfig.h\fR, and it also defines dummy -implementations for some libevent functions (such as logging, which is not -supported). It will also not define any of the structs usually found in -\&\fIevent.h\fR that are not directly supported by the libev core alone. -.Sp -In standalone mode, libev will still try to automatically deduce the -configuration, but has to be more conservative. -.IP "\s-1EV_USE_FLOOR\s0" 4 -.IX Item "EV_USE_FLOOR" -If defined to be \f(CW1\fR, libev will use the \f(CW\*(C`floor ()\*(C'\fR function for its -periodic reschedule calculations, otherwise libev will fall back on a -portable (slower) implementation. If you enable this, you usually have to -link against libm or something equivalent. Enabling this when the \f(CW\*(C`floor\*(C'\fR -function is not available will fail, so the safe default is to not enable -this. -.IP "\s-1EV_USE_MONOTONIC\s0" 4 -.IX Item "EV_USE_MONOTONIC" -If defined to be \f(CW1\fR, libev will try to detect the availability of the -monotonic clock option at both compile time and runtime. Otherwise no -use of the monotonic clock option will be attempted. If you enable this, -you usually have to link against librt or something similar. Enabling it -when the functionality isn't available is safe, though, although you have -to make sure you link against any libraries where the \f(CW\*(C`clock_gettime\*(C'\fR -function is hiding in (often \fI\-lrt\fR). See also \f(CW\*(C`EV_USE_CLOCK_SYSCALL\*(C'\fR. -.IP "\s-1EV_USE_REALTIME\s0" 4 -.IX Item "EV_USE_REALTIME" -If defined to be \f(CW1\fR, libev will try to detect the availability of the -real-time clock option at compile time (and assume its availability -at runtime if successful). Otherwise no use of the real-time clock -option will be attempted. This effectively replaces \f(CW\*(C`gettimeofday\*(C'\fR -by \f(CW\*(C`clock_get (CLOCK_REALTIME, ...)\*(C'\fR and will not normally affect -correctness. See the note about libraries in the description of -\&\f(CW\*(C`EV_USE_MONOTONIC\*(C'\fR, though. Defaults to the opposite value of -\&\f(CW\*(C`EV_USE_CLOCK_SYSCALL\*(C'\fR. -.IP "\s-1EV_USE_CLOCK_SYSCALL\s0" 4 -.IX Item "EV_USE_CLOCK_SYSCALL" -If defined to be \f(CW1\fR, libev will try to use a direct syscall instead -of calling the system-provided \f(CW\*(C`clock_gettime\*(C'\fR function. This option -exists because on GNU/Linux, \f(CW\*(C`clock_gettime\*(C'\fR is in \f(CW\*(C`librt\*(C'\fR, but \f(CW\*(C`librt\*(C'\fR -unconditionally pulls in \f(CW\*(C`libpthread\*(C'\fR, slowing down single-threaded -programs needlessly. Using a direct syscall is slightly slower (in -theory), because no optimised vdso implementation can be used, but avoids -the pthread dependency. Defaults to \f(CW1\fR on GNU/Linux with glibc 2.x or -higher, as it simplifies linking (no need for \f(CW\*(C`\-lrt\*(C'\fR). -.IP "\s-1EV_USE_NANOSLEEP\s0" 4 -.IX Item "EV_USE_NANOSLEEP" -If defined to be \f(CW1\fR, libev will assume that \f(CW\*(C`nanosleep ()\*(C'\fR is available -and will use it for delays. Otherwise it will use \f(CW\*(C`select ()\*(C'\fR. -.IP "\s-1EV_USE_EVENTFD\s0" 4 -.IX Item "EV_USE_EVENTFD" -If defined to be \f(CW1\fR, then libev will assume that \f(CW\*(C`eventfd ()\*(C'\fR is -available and will probe for kernel support at runtime. This will improve -\&\f(CW\*(C`ev_signal\*(C'\fR and \f(CW\*(C`ev_async\*(C'\fR performance and reduce resource consumption. -If undefined, it will be enabled if the headers indicate GNU/Linux + Glibc -2.7 or newer, otherwise disabled. -.IP "\s-1EV_USE_SIGNALFD\s0" 4 -.IX Item "EV_USE_SIGNALFD" -If defined to be \f(CW1\fR, then libev will assume that \f(CW\*(C`signalfd ()\*(C'\fR is -available and will probe for kernel support at runtime. This enables -the use of \s-1EVFLAG_SIGNALFD\s0 for faster and simpler signal handling. If -undefined, it will be enabled if the headers indicate GNU/Linux + Glibc -2.7 or newer, otherwise disabled. -.IP "\s-1EV_USE_TIMERFD\s0" 4 -.IX Item "EV_USE_TIMERFD" -If defined to be \f(CW1\fR, then libev will assume that \f(CW\*(C`timerfd ()\*(C'\fR is -available and will probe for kernel support at runtime. This allows -libev to detect time jumps accurately. If undefined, it will be enabled -if the headers indicate GNU/Linux + Glibc 2.8 or newer and define -\&\f(CW\*(C`TFD_TIMER_CANCEL_ON_SET\*(C'\fR, otherwise disabled. -.IP "\s-1EV_USE_EVENTFD\s0" 4 -.IX Item "EV_USE_EVENTFD" -If defined to be \f(CW1\fR, then libev will assume that \f(CW\*(C`eventfd ()\*(C'\fR is -available and will probe for kernel support at runtime. This will improve -\&\f(CW\*(C`ev_signal\*(C'\fR and \f(CW\*(C`ev_async\*(C'\fR performance and reduce resource consumption. -If undefined, it will be enabled if the headers indicate GNU/Linux + Glibc -2.7 or newer, otherwise disabled. -.IP "\s-1EV_USE_SELECT\s0" 4 -.IX Item "EV_USE_SELECT" -If undefined or defined to be \f(CW1\fR, libev will compile in support for the -\&\f(CW\*(C`select\*(C'\fR(2) backend. No attempt at auto-detection will be done: if no -other method takes over, select will be it. Otherwise the select backend -will not be compiled in. -.IP "\s-1EV_SELECT_USE_FD_SET\s0" 4 -.IX Item "EV_SELECT_USE_FD_SET" -If defined to \f(CW1\fR, then the select backend will use the system \f(CW\*(C`fd_set\*(C'\fR -structure. This is useful if libev doesn't compile due to a missing -\&\f(CW\*(C`NFDBITS\*(C'\fR or \f(CW\*(C`fd_mask\*(C'\fR definition or it mis-guesses the bitset layout -on exotic systems. This usually limits the range of file descriptors to -some low limit such as 1024 or might have other limitations (winsocket -only allows 64 sockets). The \f(CW\*(C`FD_SETSIZE\*(C'\fR macro, set before compilation, -configures the maximum size of the \f(CW\*(C`fd_set\*(C'\fR. -.IP "\s-1EV_SELECT_IS_WINSOCKET\s0" 4 -.IX Item "EV_SELECT_IS_WINSOCKET" -When defined to \f(CW1\fR, the select backend will assume that -select/socket/connect etc. don't understand file descriptors but -wants osf handles on win32 (this is the case when the select to -be used is the winsock select). This means that it will call -\&\f(CW\*(C`_get_osfhandle\*(C'\fR on the fd to convert it to an \s-1OS\s0 handle. Otherwise, -it is assumed that all these functions actually work on fds, even -on win32. Should not be defined on non\-win32 platforms. -.IP "\s-1EV_FD_TO_WIN32_HANDLE\s0(fd)" 4 -.IX Item "EV_FD_TO_WIN32_HANDLE(fd)" -If \f(CW\*(C`EV_SELECT_IS_WINSOCKET\*(C'\fR is enabled, then libev needs a way to map -file descriptors to socket handles. When not defining this symbol (the -default), then libev will call \f(CW\*(C`_get_osfhandle\*(C'\fR, which is usually -correct. In some cases, programs use their own file descriptor management, -in which case they can provide this function to map fds to socket handles. -.IP "\s-1EV_WIN32_HANDLE_TO_FD\s0(handle)" 4 -.IX Item "EV_WIN32_HANDLE_TO_FD(handle)" -If \f(CW\*(C`EV_SELECT_IS_WINSOCKET\*(C'\fR then libev maps handles to file descriptors -using the standard \f(CW\*(C`_open_osfhandle\*(C'\fR function. For programs implementing -their own fd to handle mapping, overwriting this function makes it easier -to do so. This can be done by defining this macro to an appropriate value. -.IP "\s-1EV_WIN32_CLOSE_FD\s0(fd)" 4 -.IX Item "EV_WIN32_CLOSE_FD(fd)" -If programs implement their own fd to handle mapping on win32, then this -macro can be used to override the \f(CW\*(C`close\*(C'\fR function, useful to unregister -file descriptors again. Note that the replacement function has to close -the underlying \s-1OS\s0 handle. -.IP "\s-1EV_USE_WSASOCKET\s0" 4 -.IX Item "EV_USE_WSASOCKET" -If defined to be \f(CW1\fR, libev will use \f(CW\*(C`WSASocket\*(C'\fR to create its internal -communication socket, which works better in some environments. Otherwise, -the normal \f(CW\*(C`socket\*(C'\fR function will be used, which works better in other -environments. -.IP "\s-1EV_USE_POLL\s0" 4 -.IX Item "EV_USE_POLL" -If defined to be \f(CW1\fR, libev will compile in support for the \f(CW\*(C`poll\*(C'\fR(2) -backend. Otherwise it will be enabled on non\-win32 platforms. It -takes precedence over select. -.IP "\s-1EV_USE_EPOLL\s0" 4 -.IX Item "EV_USE_EPOLL" -If defined to be \f(CW1\fR, libev will compile in support for the Linux -\&\f(CW\*(C`epoll\*(C'\fR(7) backend. Its availability will be detected at runtime, -otherwise another method will be used as fallback. This is the preferred -backend for GNU/Linux systems. If undefined, it will be enabled if the -headers indicate GNU/Linux + Glibc 2.4 or newer, otherwise disabled. -.IP "\s-1EV_USE_LINUXAIO\s0" 4 -.IX Item "EV_USE_LINUXAIO" -If defined to be \f(CW1\fR, libev will compile in support for the Linux aio -backend (\f(CW\*(C`EV_USE_EPOLL\*(C'\fR must also be enabled). If undefined, it will be -enabled on linux, otherwise disabled. -.IP "\s-1EV_USE_IOURING\s0" 4 -.IX Item "EV_USE_IOURING" -If defined to be \f(CW1\fR, libev will compile in support for the Linux -io_uring backend (\f(CW\*(C`EV_USE_EPOLL\*(C'\fR must also be enabled). Due to it's -current limitations it has to be requested explicitly. If undefined, it -will be enabled on linux, otherwise disabled. -.IP "\s-1EV_USE_KQUEUE\s0" 4 -.IX Item "EV_USE_KQUEUE" -If defined to be \f(CW1\fR, libev will compile in support for the \s-1BSD\s0 style -\&\f(CW\*(C`kqueue\*(C'\fR(2) backend. Its actual availability will be detected at runtime, -otherwise another method will be used as fallback. This is the preferred -backend for \s-1BSD\s0 and BSD-like systems, although on most BSDs kqueue only -supports some types of fds correctly (the only platform we found that -supports ptys for example was NetBSD), so kqueue might be compiled in, but -not be used unless explicitly requested. The best way to use it is to find -out whether kqueue supports your type of fd properly and use an embedded -kqueue loop. -.IP "\s-1EV_USE_PORT\s0" 4 -.IX Item "EV_USE_PORT" -If defined to be \f(CW1\fR, libev will compile in support for the Solaris -10 port style backend. Its availability will be detected at runtime, -otherwise another method will be used as fallback. This is the preferred -backend for Solaris 10 systems. -.IP "\s-1EV_USE_DEVPOLL\s0" 4 -.IX Item "EV_USE_DEVPOLL" -Reserved for future expansion, works like the \s-1USE\s0 symbols above. -.IP "\s-1EV_USE_INOTIFY\s0" 4 -.IX Item "EV_USE_INOTIFY" -If defined to be \f(CW1\fR, libev will compile in support for the Linux inotify -interface to speed up \f(CW\*(C`ev_stat\*(C'\fR watchers. Its actual availability will -be detected at runtime. If undefined, it will be enabled if the headers -indicate GNU/Linux + Glibc 2.4 or newer, otherwise disabled. -.IP "\s-1EV_NO_SMP\s0" 4 -.IX Item "EV_NO_SMP" -If defined to be \f(CW1\fR, libev will assume that memory is always coherent -between threads, that is, threads can be used, but threads never run on -different cpus (or different cpu cores). This reduces dependencies -and makes libev faster. -.IP "\s-1EV_NO_THREADS\s0" 4 -.IX Item "EV_NO_THREADS" -If defined to be \f(CW1\fR, libev will assume that it will never be called from -different threads (that includes signal handlers), which is a stronger -assumption than \f(CW\*(C`EV_NO_SMP\*(C'\fR, above. This reduces dependencies and makes -libev faster. -.IP "\s-1EV_ATOMIC_T\s0" 4 -.IX Item "EV_ATOMIC_T" -Libev requires an integer type (suitable for storing \f(CW0\fR or \f(CW1\fR) whose -access is atomic with respect to other threads or signal contexts. No -such type is easily found in the C language, so you can provide your own -type that you know is safe for your purposes. It is used both for signal -handler \*(L"locking\*(R" as well as for signal and thread safety in \f(CW\*(C`ev_async\*(C'\fR -watchers. -.Sp -In the absence of this define, libev will use \f(CW\*(C`sig_atomic_t volatile\*(C'\fR -(from \fIsignal.h\fR), which is usually good enough on most platforms. -.IP "\s-1EV_H\s0 (h)" 4 -.IX Item "EV_H (h)" -The name of the \fIev.h\fR header file used to include it. The default if -undefined is \f(CW"ev.h"\fR in \fIevent.h\fR, \fIev.c\fR and \fIev++.h\fR. This can be -used to virtually rename the \fIev.h\fR header file in case of conflicts. -.IP "\s-1EV_CONFIG_H\s0 (h)" 4 -.IX Item "EV_CONFIG_H (h)" -If \f(CW\*(C`EV_STANDALONE\*(C'\fR isn't \f(CW1\fR, this variable can be used to override -\&\fIev.c\fR's idea of where to find the \fIconfig.h\fR file, similarly to -\&\f(CW\*(C`EV_H\*(C'\fR, above. -.IP "\s-1EV_EVENT_H\s0 (h)" 4 -.IX Item "EV_EVENT_H (h)" -Similarly to \f(CW\*(C`EV_H\*(C'\fR, this macro can be used to override \fIevent.c\fR's idea -of how the \fIevent.h\fR header can be found, the default is \f(CW"event.h"\fR. -.IP "\s-1EV_PROTOTYPES\s0 (h)" 4 -.IX Item "EV_PROTOTYPES (h)" -If defined to be \f(CW0\fR, then \fIev.h\fR will not define any function -prototypes, but still define all the structs and other symbols. This is -occasionally useful if you want to provide your own wrapper functions -around libev functions. -.IP "\s-1EV_MULTIPLICITY\s0" 4 -.IX Item "EV_MULTIPLICITY" -If undefined or defined to \f(CW1\fR, then all event-loop-specific functions -will have the \f(CW\*(C`struct ev_loop *\*(C'\fR as first argument, and you can create -additional independent event loops. Otherwise there will be no support -for multiple event loops and there is no first event loop pointer -argument. Instead, all functions act on the single default loop. -.Sp -Note that \f(CW\*(C`EV_DEFAULT\*(C'\fR and \f(CW\*(C`EV_DEFAULT_\*(C'\fR will no longer provide a -default loop when multiplicity is switched off \- you always have to -initialise the loop manually in this case. -.IP "\s-1EV_MINPRI\s0" 4 -.IX Item "EV_MINPRI" -.PD 0 -.IP "\s-1EV_MAXPRI\s0" 4 -.IX Item "EV_MAXPRI" -.PD -The range of allowed priorities. \f(CW\*(C`EV_MINPRI\*(C'\fR must be smaller or equal to -\&\f(CW\*(C`EV_MAXPRI\*(C'\fR, but otherwise there are no non-obvious limitations. You can -provide for more priorities by overriding those symbols (usually defined -to be \f(CW\*(C`\-2\*(C'\fR and \f(CW2\fR, respectively). -.Sp -When doing priority-based operations, libev usually has to linearly search -all the priorities, so having many of them (hundreds) uses a lot of space -and time, so using the defaults of five priorities (\-2 .. +2) is usually -fine. -.Sp -If your embedding application does not need any priorities, defining these -both to \f(CW0\fR will save some memory and \s-1CPU.\s0 -.IP "\s-1EV_PERIODIC_ENABLE, EV_IDLE_ENABLE, EV_EMBED_ENABLE, EV_STAT_ENABLE, EV_PREPARE_ENABLE, EV_CHECK_ENABLE, EV_FORK_ENABLE, EV_SIGNAL_ENABLE, EV_ASYNC_ENABLE, EV_CHILD_ENABLE.\s0" 4 -.IX Item "EV_PERIODIC_ENABLE, EV_IDLE_ENABLE, EV_EMBED_ENABLE, EV_STAT_ENABLE, EV_PREPARE_ENABLE, EV_CHECK_ENABLE, EV_FORK_ENABLE, EV_SIGNAL_ENABLE, EV_ASYNC_ENABLE, EV_CHILD_ENABLE." -If undefined or defined to be \f(CW1\fR (and the platform supports it), then -the respective watcher type is supported. If defined to be \f(CW0\fR, then it -is not. Disabling watcher types mainly saves code size. -.IP "\s-1EV_FEATURES\s0" 4 -.IX Item "EV_FEATURES" -If you need to shave off some kilobytes of code at the expense of some -speed (but with the full \s-1API\s0), you can define this symbol to request -certain subsets of functionality. The default is to enable all features -that can be enabled on the platform. -.Sp -A typical way to use this symbol is to define it to \f(CW0\fR (or to a bitset -with some broad features you want) and then selectively re-enable -additional parts you want, for example if you want everything minimal, -but multiple event loop support, async and child watchers and the poll -backend, use this: -.Sp -.Vb 5 -\& #define EV_FEATURES 0 -\& #define EV_MULTIPLICITY 1 -\& #define EV_USE_POLL 1 -\& #define EV_CHILD_ENABLE 1 -\& #define EV_ASYNC_ENABLE 1 -.Ve -.Sp -The actual value is a bitset, it can be a combination of the following -values (by default, all of these are enabled): -.RS 4 -.ie n .IP "1 \- faster/larger code" 4 -.el .IP "\f(CW1\fR \- faster/larger code" 4 -.IX Item "1 - faster/larger code" -Use larger code to speed up some operations. -.Sp -Currently this is used to override some inlining decisions (enlarging the -code size by roughly 30% on amd64). -.Sp -When optimising for size, use of compiler flags such as \f(CW\*(C`\-Os\*(C'\fR with -gcc is recommended, as well as \f(CW\*(C`\-DNDEBUG\*(C'\fR, as libev contains a number of -assertions. -.Sp -The default is off when \f(CW\*(C`_\|_OPTIMIZE_SIZE_\|_\*(C'\fR is defined by your compiler -(e.g. gcc with \f(CW\*(C`\-Os\*(C'\fR). -.ie n .IP "2 \- faster/larger data structures" 4 -.el .IP "\f(CW2\fR \- faster/larger data structures" 4 -.IX Item "2 - faster/larger data structures" -Replaces the small 2\-heap for timer management by a faster 4\-heap, larger -hash table sizes and so on. This will usually further increase code size -and can additionally have an effect on the size of data structures at -runtime. -.Sp -The default is off when \f(CW\*(C`_\|_OPTIMIZE_SIZE_\|_\*(C'\fR is defined by your compiler -(e.g. gcc with \f(CW\*(C`\-Os\*(C'\fR). -.ie n .IP "4 \- full \s-1API\s0 configuration" 4 -.el .IP "\f(CW4\fR \- full \s-1API\s0 configuration" 4 -.IX Item "4 - full API configuration" -This enables priorities (sets \f(CW\*(C`EV_MAXPRI\*(C'\fR=2 and \f(CW\*(C`EV_MINPRI\*(C'\fR=\-2), and -enables multiplicity (\f(CW\*(C`EV_MULTIPLICITY\*(C'\fR=1). -.ie n .IP "8 \- full \s-1API\s0" 4 -.el .IP "\f(CW8\fR \- full \s-1API\s0" 4 -.IX Item "8 - full API" -This enables a lot of the \*(L"lesser used\*(R" \s-1API\s0 functions. See \f(CW\*(C`ev.h\*(C'\fR for -details on which parts of the \s-1API\s0 are still available without this -feature, and do not complain if this subset changes over time. -.ie n .IP "16 \- enable all optional watcher types" 4 -.el .IP "\f(CW16\fR \- enable all optional watcher types" 4 -.IX Item "16 - enable all optional watcher types" -Enables all optional watcher types. If you want to selectively enable -only some watcher types other than I/O and timers (e.g. prepare, -embed, async, child...) you can enable them manually by defining -\&\f(CW\*(C`EV_watchertype_ENABLE\*(C'\fR to \f(CW1\fR instead. -.ie n .IP "32 \- enable all backends" 4 -.el .IP "\f(CW32\fR \- enable all backends" 4 -.IX Item "32 - enable all backends" -This enables all backends \- without this feature, you need to enable at -least one backend manually (\f(CW\*(C`EV_USE_SELECT\*(C'\fR is a good choice). -.ie n .IP "64 \- enable OS-specific ""helper"" APIs" 4 -.el .IP "\f(CW64\fR \- enable OS-specific ``helper'' APIs" 4 -.IX Item "64 - enable OS-specific helper APIs" -Enable inotify, eventfd, signalfd and similar OS-specific helper APIs by -default. -.RE -.RS 4 -.Sp -Compiling with \f(CW\*(C`gcc \-Os \-DEV_STANDALONE \-DEV_USE_EPOLL=1 \-DEV_FEATURES=0\*(C'\fR -reduces the compiled size of libev from 24.7Kb code/2.8Kb data to 6.5Kb -code/0.3Kb data on my GNU/Linux amd64 system, while still giving you I/O -watchers, timers and monotonic clock support. -.Sp -With an intelligent-enough linker (gcc+binutils are intelligent enough -when you use \f(CW\*(C`\-Wl,\-\-gc\-sections \-ffunction\-sections\*(C'\fR) functions unused by -your program might be left out as well \- a binary starting a timer and an -I/O watcher then might come out at only 5Kb. -.RE -.IP "\s-1EV_API_STATIC\s0" 4 -.IX Item "EV_API_STATIC" -If this symbol is defined (by default it is not), then all identifiers -will have static linkage. This means that libev will not export any -identifiers, and you cannot link against libev anymore. This can be useful -when you embed libev, only want to use libev functions in a single file, -and do not want its identifiers to be visible. -.Sp -To use this, define \f(CW\*(C`EV_API_STATIC\*(C'\fR and include \fIev.c\fR in the file that -wants to use libev. -.Sp -This option only works when libev is compiled with a C compiler, as \*(C+ -doesn't support the required declaration syntax. -.IP "\s-1EV_AVOID_STDIO\s0" 4 -.IX Item "EV_AVOID_STDIO" -If this is set to \f(CW1\fR at compiletime, then libev will avoid using stdio -functions (printf, scanf, perror etc.). This will increase the code size -somewhat, but if your program doesn't otherwise depend on stdio and your -libc allows it, this avoids linking in the stdio library which is quite -big. -.Sp -Note that error messages might become less precise when this option is -enabled. -.IP "\s-1EV_NSIG\s0" 4 -.IX Item "EV_NSIG" -The highest supported signal number, +1 (or, the number of -signals): Normally, libev tries to deduce the maximum number of signals -automatically, but sometimes this fails, in which case it can be -specified. Also, using a lower number than detected (\f(CW32\fR should be -good for about any system in existence) can save some memory, as libev -statically allocates some 12\-24 bytes per signal number. -.IP "\s-1EV_PID_HASHSIZE\s0" 4 -.IX Item "EV_PID_HASHSIZE" -\&\f(CW\*(C`ev_child\*(C'\fR watchers use a small hash table to distribute workload by -pid. The default size is \f(CW16\fR (or \f(CW1\fR with \f(CW\*(C`EV_FEATURES\*(C'\fR disabled), -usually more than enough. If you need to manage thousands of children you -might want to increase this value (\fImust\fR be a power of two). -.IP "\s-1EV_INOTIFY_HASHSIZE\s0" 4 -.IX Item "EV_INOTIFY_HASHSIZE" -\&\f(CW\*(C`ev_stat\*(C'\fR watchers use a small hash table to distribute workload by -inotify watch id. The default size is \f(CW16\fR (or \f(CW1\fR with \f(CW\*(C`EV_FEATURES\*(C'\fR -disabled), usually more than enough. If you need to manage thousands of -\&\f(CW\*(C`ev_stat\*(C'\fR watchers you might want to increase this value (\fImust\fR be a -power of two). -.IP "\s-1EV_USE_4HEAP\s0" 4 -.IX Item "EV_USE_4HEAP" -Heaps are not very cache-efficient. To improve the cache-efficiency of the -timer and periodics heaps, libev uses a 4\-heap when this symbol is defined -to \f(CW1\fR. The 4\-heap uses more complicated (longer) code but has noticeably -faster performance with many (thousands) of watchers. -.Sp -The default is \f(CW1\fR, unless \f(CW\*(C`EV_FEATURES\*(C'\fR overrides it, in which case it -will be \f(CW0\fR. -.IP "\s-1EV_HEAP_CACHE_AT\s0" 4 -.IX Item "EV_HEAP_CACHE_AT" -Heaps are not very cache-efficient. To improve the cache-efficiency of the -timer and periodics heaps, libev can cache the timestamp (\fIat\fR) within -the heap structure (selected by defining \f(CW\*(C`EV_HEAP_CACHE_AT\*(C'\fR to \f(CW1\fR), -which uses 8\-12 bytes more per watcher and a few hundred bytes more code, -but avoids random read accesses on heap changes. This improves performance -noticeably with many (hundreds) of watchers. -.Sp -The default is \f(CW1\fR, unless \f(CW\*(C`EV_FEATURES\*(C'\fR overrides it, in which case it -will be \f(CW0\fR. -.IP "\s-1EV_VERIFY\s0" 4 -.IX Item "EV_VERIFY" -Controls how much internal verification (see \f(CW\*(C`ev_verify ()\*(C'\fR) will -be done: If set to \f(CW0\fR, no internal verification code will be compiled -in. If set to \f(CW1\fR, then verification code will be compiled in, but not -called. If set to \f(CW2\fR, then the internal verification code will be -called once per loop, which can slow down libev. If set to \f(CW3\fR, then the -verification code will be called very frequently, which will slow down -libev considerably. -.Sp -Verification errors are reported via C's \f(CW\*(C`assert\*(C'\fR mechanism, so if you -disable that (e.g. by defining \f(CW\*(C`NDEBUG\*(C'\fR) then no errors will be reported. -.Sp -The default is \f(CW1\fR, unless \f(CW\*(C`EV_FEATURES\*(C'\fR overrides it, in which case it -will be \f(CW0\fR. -.IP "\s-1EV_COMMON\s0" 4 -.IX Item "EV_COMMON" -By default, all watchers have a \f(CW\*(C`void *data\*(C'\fR member. By redefining -this macro to something else you can include more and other types of -members. You have to define it each time you include one of the files, -though, and it must be identical each time. -.Sp -For example, the perl \s-1EV\s0 module uses something like this: -.Sp -.Vb 3 -\& #define EV_COMMON \e -\& SV *self; /* contains this struct */ \e -\& SV *cb_sv, *fh /* note no trailing ";" */ -.Ve -.IP "\s-1EV_CB_DECLARE\s0 (type)" 4 -.IX Item "EV_CB_DECLARE (type)" -.PD 0 -.IP "\s-1EV_CB_INVOKE\s0 (watcher, revents)" 4 -.IX Item "EV_CB_INVOKE (watcher, revents)" -.IP "ev_set_cb (ev, cb)" 4 -.IX Item "ev_set_cb (ev, cb)" -.PD -Can be used to change the callback member declaration in each watcher, -and the way callbacks are invoked and set. Must expand to a struct member -definition and a statement, respectively. See the \fIev.h\fR header file for -their default definitions. One possible use for overriding these is to -avoid the \f(CW\*(C`struct ev_loop *\*(C'\fR as first argument in all cases, or to use -method calls instead of plain function calls in \*(C+. -.SS "\s-1EXPORTED API SYMBOLS\s0" -.IX Subsection "EXPORTED API SYMBOLS" -If you need to re-export the \s-1API\s0 (e.g. via a \s-1DLL\s0) and you need a list of -exported symbols, you can use the provided \fISymbol.*\fR files which list -all public symbols, one per line: -.PP -.Vb 2 -\& Symbols.ev for libev proper -\& Symbols.event for the libevent emulation -.Ve -.PP -This can also be used to rename all public symbols to avoid clashes with -multiple versions of libev linked together (which is obviously bad in -itself, but sometimes it is inconvenient to avoid this). -.PP -A sed command like this will create wrapper \f(CW\*(C`#define\*(C'\fR's that you need to -include before including \fIev.h\fR: -.PP -.Vb 1 -\& wrap.h -.Ve -.PP -This would create a file \fIwrap.h\fR which essentially looks like this: -.PP -.Vb 4 -\& #define ev_backend myprefix_ev_backend -\& #define ev_check_start myprefix_ev_check_start -\& #define ev_check_stop myprefix_ev_check_stop -\& ... -.Ve -.SS "\s-1EXAMPLES\s0" -.IX Subsection "EXAMPLES" -For a real-world example of a program the includes libev -verbatim, you can have a look at the \s-1EV\s0 perl module -(). It has the libev files in -the \fIlibev/\fR subdirectory and includes them in the \fI\s-1EV/EVAPI\s0.h\fR (public -interface) and \fI\s-1EV\s0.xs\fR (implementation) files. Only the \fI\s-1EV\s0.xs\fR file -will be compiled. It is pretty complex because it provides its own header -file. -.PP -The usage in rxvt-unicode is simpler. It has a \fIev_cpp.h\fR header file -that everybody includes and which overrides some configure choices: -.PP -.Vb 8 -\& #define EV_FEATURES 8 -\& #define EV_USE_SELECT 1 -\& #define EV_PREPARE_ENABLE 1 -\& #define EV_IDLE_ENABLE 1 -\& #define EV_SIGNAL_ENABLE 1 -\& #define EV_CHILD_ENABLE 1 -\& #define EV_USE_STDEXCEPT 0 -\& #define EV_CONFIG_H -\& -\& #include "ev++.h" -.Ve -.PP -And a \fIev_cpp.C\fR implementation file that contains libev proper and is compiled: -.PP -.Vb 2 -\& #include "ev_cpp.h" -\& #include "ev.c" -.Ve -.SH "INTERACTION WITH OTHER PROGRAMS, LIBRARIES OR THE ENVIRONMENT" -.IX Header "INTERACTION WITH OTHER PROGRAMS, LIBRARIES OR THE ENVIRONMENT" -.SS "\s-1THREADS AND COROUTINES\s0" -.IX Subsection "THREADS AND COROUTINES" -\fI\s-1THREADS\s0\fR -.IX Subsection "THREADS" -.PP -All libev functions are reentrant and thread-safe unless explicitly -documented otherwise, but libev implements no locking itself. This means -that you can use as many loops as you want in parallel, as long as there -are no concurrent calls into any libev function with the same loop -parameter (\f(CW\*(C`ev_default_*\*(C'\fR calls have an implicit default loop parameter, -of course): libev guarantees that different event loops share no data -structures that need any locking. -.PP -Or to put it differently: calls with different loop parameters can be done -concurrently from multiple threads, calls with the same loop parameter -must be done serially (but can be done from different threads, as long as -only one thread ever is inside a call at any point in time, e.g. by using -a mutex per loop). -.PP -Specifically to support threads (and signal handlers), libev implements -so-called \f(CW\*(C`ev_async\*(C'\fR watchers, which allow some limited form of -concurrency on the same event loop, namely waking it up \*(L"from the -outside\*(R". -.PP -If you want to know which design (one loop, locking, or multiple loops -without or something else still) is best for your problem, then I cannot -help you, but here is some generic advice: -.IP "\(bu" 4 -most applications have a main thread: use the default libev loop -in that thread, or create a separate thread running only the default loop. -.Sp -This helps integrating other libraries or software modules that use libev -themselves and don't care/know about threading. -.IP "\(bu" 4 -one loop per thread is usually a good model. -.Sp -Doing this is almost never wrong, sometimes a better-performance model -exists, but it is always a good start. -.IP "\(bu" 4 -other models exist, such as the leader/follower pattern, where one -loop is handed through multiple threads in a kind of round-robin fashion. -.Sp -Choosing a model is hard \- look around, learn, know that usually you can do -better than you currently do :\-) -.IP "\(bu" 4 -often you need to talk to some other thread which blocks in the -event loop. -.Sp -\&\f(CW\*(C`ev_async\*(C'\fR watchers can be used to wake them up from other threads safely -(or from signal contexts...). -.Sp -An example use would be to communicate signals or other events that only -work in the default loop by registering the signal watcher with the -default loop and triggering an \f(CW\*(C`ev_async\*(C'\fR watcher from the default loop -watcher callback into the event loop interested in the signal. -.PP -See also \*(L"\s-1THREAD LOCKING EXAMPLE\*(R"\s0. -.PP -\fI\s-1COROUTINES\s0\fR -.IX Subsection "COROUTINES" -.PP -Libev is very accommodating to coroutines (\*(L"cooperative threads\*(R"): -libev fully supports nesting calls to its functions from different -coroutines (e.g. you can call \f(CW\*(C`ev_run\*(C'\fR on the same loop from two -different coroutines, and switch freely between both coroutines running -the loop, as long as you don't confuse yourself). The only exception is -that you must not do this from \f(CW\*(C`ev_periodic\*(C'\fR reschedule callbacks. -.PP -Care has been taken to ensure that libev does not keep local state inside -\&\f(CW\*(C`ev_run\*(C'\fR, and other calls do not usually allow for coroutine switches as -they do not call any callbacks. -.SS "\s-1COMPILER WARNINGS\s0" -.IX Subsection "COMPILER WARNINGS" -Depending on your compiler and compiler settings, you might get no or a -lot of warnings when compiling libev code. Some people are apparently -scared by this. -.PP -However, these are unavoidable for many reasons. For one, each compiler -has different warnings, and each user has different tastes regarding -warning options. \*(L"Warn-free\*(R" code therefore cannot be a goal except when -targeting a specific compiler and compiler-version. -.PP -Another reason is that some compiler warnings require elaborate -workarounds, or other changes to the code that make it less clear and less -maintainable. -.PP -And of course, some compiler warnings are just plain stupid, or simply -wrong (because they don't actually warn about the condition their message -seems to warn about). For example, certain older gcc versions had some -warnings that resulted in an extreme number of false positives. These have -been fixed, but some people still insist on making code warn-free with -such buggy versions. -.PP -While libev is written to generate as few warnings as possible, -\&\*(L"warn-free\*(R" code is not a goal, and it is recommended not to build libev -with any compiler warnings enabled unless you are prepared to cope with -them (e.g. by ignoring them). Remember that warnings are just that: -warnings, not errors, or proof of bugs. -.SS "\s-1VALGRIND\s0" -.IX Subsection "VALGRIND" -Valgrind has a special section here because it is a popular tool that is -highly useful. Unfortunately, valgrind reports are very hard to interpret. -.PP -If you think you found a bug (memory leak, uninitialised data access etc.) -in libev, then check twice: If valgrind reports something like: -.PP -.Vb 3 -\& ==2274== definitely lost: 0 bytes in 0 blocks. -\& ==2274== possibly lost: 0 bytes in 0 blocks. -\& ==2274== still reachable: 256 bytes in 1 blocks. -.Ve -.PP -Then there is no memory leak, just as memory accounted to global variables -is not a memleak \- the memory is still being referenced, and didn't leak. -.PP -Similarly, under some circumstances, valgrind might report kernel bugs -as if it were a bug in libev (e.g. in realloc or in the poll backend, -although an acceptable workaround has been found here), or it might be -confused. -.PP -Keep in mind that valgrind is a very good tool, but only a tool. Don't -make it into some kind of religion. -.PP -If you are unsure about something, feel free to contact the mailing list -with the full valgrind report and an explanation on why you think this -is a bug in libev (best check the archives, too :). However, don't be -annoyed when you get a brisk \*(L"this is no bug\*(R" answer and take the chance -of learning how to interpret valgrind properly. -.PP -If you need, for some reason, empty reports from valgrind for your project -I suggest using suppression lists. -.SH "PORTABILITY NOTES" -.IX Header "PORTABILITY NOTES" -.SS "\s-1GNU/LINUX 32 BIT LIMITATIONS\s0" -.IX Subsection "GNU/LINUX 32 BIT LIMITATIONS" -GNU/Linux is the only common platform that supports 64 bit file/large file -interfaces but \fIdisables\fR them by default. -.PP -That means that libev compiled in the default environment doesn't support -files larger than 2GiB or so, which mainly affects \f(CW\*(C`ev_stat\*(C'\fR watchers. -.PP -Unfortunately, many programs try to work around this GNU/Linux issue -by enabling the large file \s-1API,\s0 which makes them incompatible with the -standard libev compiled for their system. -.PP -Likewise, libev cannot enable the large file \s-1API\s0 itself as this would -suddenly make it incompatible to the default compile time environment, -i.e. all programs not using special compile switches. -.SS "\s-1OS/X AND DARWIN BUGS\s0" -.IX Subsection "OS/X AND DARWIN BUGS" -The whole thing is a bug if you ask me \- basically any system interface -you touch is broken, whether it is locales, poll, kqueue or even the -OpenGL drivers. -.PP -\fI\f(CI\*(C`kqueue\*(C'\fI is buggy\fR -.IX Subsection "kqueue is buggy" -.PP -The kqueue syscall is broken in all known versions \- most versions support -only sockets, many support pipes. -.PP -Libev tries to work around this by not using \f(CW\*(C`kqueue\*(C'\fR by default on this -rotten platform, but of course you can still ask for it when creating a -loop \- embedding a socket-only kqueue loop into a select-based one is -probably going to work well. -.PP -\fI\f(CI\*(C`poll\*(C'\fI is buggy\fR -.IX Subsection "poll is buggy" -.PP -Instead of fixing \f(CW\*(C`kqueue\*(C'\fR, Apple replaced their (working) \f(CW\*(C`poll\*(C'\fR -implementation by something calling \f(CW\*(C`kqueue\*(C'\fR internally around the 10.5.6 -release, so now \f(CW\*(C`kqueue\*(C'\fR \fIand\fR \f(CW\*(C`poll\*(C'\fR are broken. -.PP -Libev tries to work around this by not using \f(CW\*(C`poll\*(C'\fR by default on -this rotten platform, but of course you can still ask for it when creating -a loop. -.PP -\fI\f(CI\*(C`select\*(C'\fI is buggy\fR -.IX Subsection "select is buggy" -.PP -All that's left is \f(CW\*(C`select\*(C'\fR, and of course Apple found a way to fuck this -one up as well: On \s-1OS/X,\s0 \f(CW\*(C`select\*(C'\fR actively limits the number of file -descriptors you can pass in to 1024 \- your program suddenly crashes when -you use more. -.PP -There is an undocumented \*(L"workaround\*(R" for this \- defining -\&\f(CW\*(C`_DARWIN_UNLIMITED_SELECT\*(C'\fR, which libev tries to use, so select \fIshould\fR -work on \s-1OS/X.\s0 -.SS "\s-1SOLARIS PROBLEMS AND WORKAROUNDS\s0" -.IX Subsection "SOLARIS PROBLEMS AND WORKAROUNDS" -\fI\f(CI\*(C`errno\*(C'\fI reentrancy\fR -.IX Subsection "errno reentrancy" -.PP -The default compile environment on Solaris is unfortunately so -thread-unsafe that you can't even use components/libraries compiled -without \f(CW\*(C`\-D_REENTRANT\*(C'\fR in a threaded program, which, of course, isn't -defined by default. A valid, if stupid, implementation choice. -.PP -If you want to use libev in threaded environments you have to make sure -it's compiled with \f(CW\*(C`_REENTRANT\*(C'\fR defined. -.PP -\fIEvent port backend\fR -.IX Subsection "Event port backend" -.PP -The scalable event interface for Solaris is called \*(L"event -ports\*(R". Unfortunately, this mechanism is very buggy in all major -releases. If you run into high \s-1CPU\s0 usage, your program freezes or you get -a large number of spurious wakeups, make sure you have all the relevant -and latest kernel patches applied. No, I don't know which ones, but there -are multiple ones to apply, and afterwards, event ports actually work -great. -.PP -If you can't get it to work, you can try running the program by setting -the environment variable \f(CW\*(C`LIBEV_FLAGS=3\*(C'\fR to only allow \f(CW\*(C`poll\*(C'\fR and -\&\f(CW\*(C`select\*(C'\fR backends. -.SS "\s-1AIX POLL BUG\s0" -.IX Subsection "AIX POLL BUG" -\&\s-1AIX\s0 unfortunately has a broken \f(CW\*(C`poll.h\*(C'\fR header. Libev works around -this by trying to avoid the poll backend altogether (i.e. it's not even -compiled in), which normally isn't a big problem as \f(CW\*(C`select\*(C'\fR works fine -with large bitsets on \s-1AIX,\s0 and \s-1AIX\s0 is dead anyway. -.SS "\s-1WIN32 PLATFORM LIMITATIONS AND WORKAROUNDS\s0" -.IX Subsection "WIN32 PLATFORM LIMITATIONS AND WORKAROUNDS" -\fIGeneral issues\fR -.IX Subsection "General issues" -.PP -Win32 doesn't support any of the standards (e.g. \s-1POSIX\s0) that libev -requires, and its I/O model is fundamentally incompatible with the \s-1POSIX\s0 -model. Libev still offers limited functionality on this platform in -the form of the \f(CW\*(C`EVBACKEND_SELECT\*(C'\fR backend, and only supports socket -descriptors. This only applies when using Win32 natively, not when using -e.g. cygwin. Actually, it only applies to the microsofts own compilers, -as every compiler comes with a slightly differently broken/incompatible -environment. -.PP -Lifting these limitations would basically require the full -re-implementation of the I/O system. If you are into this kind of thing, -then note that glib does exactly that for you in a very portable way (note -also that glib is the slowest event library known to man). -.PP -There is no supported compilation method available on windows except -embedding it into other applications. -.PP -Sensible signal handling is officially unsupported by Microsoft \- libev -tries its best, but under most conditions, signals will simply not work. -.PP -Not a libev limitation but worth mentioning: windows apparently doesn't -accept large writes: instead of resulting in a partial write, windows will -either accept everything or return \f(CW\*(C`ENOBUFS\*(C'\fR if the buffer is too large, -so make sure you only write small amounts into your sockets (less than a -megabyte seems safe, but this apparently depends on the amount of memory -available). -.PP -Due to the many, low, and arbitrary limits on the win32 platform and -the abysmal performance of winsockets, using a large number of sockets -is not recommended (and not reasonable). If your program needs to use -more than a hundred or so sockets, then likely it needs to use a totally -different implementation for windows, as libev offers the \s-1POSIX\s0 readiness -notification model, which cannot be implemented efficiently on windows -(due to Microsoft monopoly games). -.PP -A typical way to use libev under windows is to embed it (see the embedding -section for details) and use the following \fIevwrap.h\fR header file instead -of \fIev.h\fR: -.PP -.Vb 2 -\& #define EV_STANDALONE /* keeps ev from requiring config.h */ -\& #define EV_SELECT_IS_WINSOCKET 1 /* configure libev for windows select */ -\& -\& #include "ev.h" -.Ve -.PP -And compile the following \fIevwrap.c\fR file into your project (make sure -you do \fInot\fR compile the \fIev.c\fR or any other embedded source files!): -.PP -.Vb 2 -\& #include "evwrap.h" -\& #include "ev.c" -.Ve -.PP -\fIThe winsocket \f(CI\*(C`select\*(C'\fI function\fR -.IX Subsection "The winsocket select function" -.PP -The winsocket \f(CW\*(C`select\*(C'\fR function doesn't follow \s-1POSIX\s0 in that it -requires socket \fIhandles\fR and not socket \fIfile descriptors\fR (it is -also extremely buggy). This makes select very inefficient, and also -requires a mapping from file descriptors to socket handles (the Microsoft -C runtime provides the function \f(CW\*(C`_open_osfhandle\*(C'\fR for this). See the -discussion of the \f(CW\*(C`EV_SELECT_USE_FD_SET\*(C'\fR, \f(CW\*(C`EV_SELECT_IS_WINSOCKET\*(C'\fR and -\&\f(CW\*(C`EV_FD_TO_WIN32_HANDLE\*(C'\fR preprocessor symbols for more info. -.PP -The configuration for a \*(L"naked\*(R" win32 using the Microsoft runtime -libraries and raw winsocket select is: -.PP -.Vb 2 -\& #define EV_USE_SELECT 1 -\& #define EV_SELECT_IS_WINSOCKET 1 /* forces EV_SELECT_USE_FD_SET, too */ -.Ve -.PP -Note that winsockets handling of fd sets is O(n), so you can easily get a -complexity in the O(nX) range when using win32. -.PP -\fILimited number of file descriptors\fR -.IX Subsection "Limited number of file descriptors" -.PP -Windows has numerous arbitrary (and low) limits on things. -.PP -Early versions of winsocket's select only supported waiting for a maximum -of \f(CW64\fR handles (probably owning to the fact that all windows kernels -can only wait for \f(CW64\fR things at the same time internally; Microsoft -recommends spawning a chain of threads and wait for 63 handles and the -previous thread in each. Sounds great!). -.PP -Newer versions support more handles, but you need to define \f(CW\*(C`FD_SETSIZE\*(C'\fR -to some high number (e.g. \f(CW2048\fR) before compiling the winsocket select -call (which might be in libev or elsewhere, for example, perl and many -other interpreters do their own select emulation on windows). -.PP -Another limit is the number of file descriptors in the Microsoft runtime -libraries, which by default is \f(CW64\fR (there must be a hidden \fI64\fR -fetish or something like this inside Microsoft). You can increase this -by calling \f(CW\*(C`_setmaxstdio\*(C'\fR, which can increase this limit to \f(CW2048\fR -(another arbitrary limit), but is broken in many versions of the Microsoft -runtime libraries. This might get you to about \f(CW512\fR or \f(CW2048\fR sockets -(depending on windows version and/or the phase of the moon). To get more, -you need to wrap all I/O functions and provide your own fd management, but -the cost of calling select (O(nX)) will likely make this unworkable. -.SS "\s-1PORTABILITY REQUIREMENTS\s0" -.IX Subsection "PORTABILITY REQUIREMENTS" -In addition to a working ISO-C implementation and of course the -backend-specific APIs, libev relies on a few additional extensions: -.ie n .IP """void (*)(ev_watcher_type *, int revents)"" must have compatible calling conventions regardless of ""ev_watcher_type *""." 4 -.el .IP "\f(CWvoid (*)(ev_watcher_type *, int revents)\fR must have compatible calling conventions regardless of \f(CWev_watcher_type *\fR." 4 -.IX Item "void (*)(ev_watcher_type *, int revents) must have compatible calling conventions regardless of ev_watcher_type *." -Libev assumes not only that all watcher pointers have the same internal -structure (guaranteed by \s-1POSIX\s0 but not by \s-1ISO C\s0 for example), but it also -assumes that the same (machine) code can be used to call any watcher -callback: The watcher callbacks have different type signatures, but libev -calls them using an \f(CW\*(C`ev_watcher *\*(C'\fR internally. -.IP "null pointers and integer zero are represented by 0 bytes" 4 -.IX Item "null pointers and integer zero are represented by 0 bytes" -Libev uses \f(CW\*(C`memset\*(C'\fR to initialise structs and arrays to \f(CW0\fR bytes, and -relies on this setting pointers and integers to null. -.IP "pointer accesses must be thread-atomic" 4 -.IX Item "pointer accesses must be thread-atomic" -Accessing a pointer value must be atomic, it must both be readable and -writable in one piece \- this is the case on all current architectures. -.ie n .IP """sig_atomic_t volatile"" must be thread-atomic as well" 4 -.el .IP "\f(CWsig_atomic_t volatile\fR must be thread-atomic as well" 4 -.IX Item "sig_atomic_t volatile must be thread-atomic as well" -The type \f(CW\*(C`sig_atomic_t volatile\*(C'\fR (or whatever is defined as -\&\f(CW\*(C`EV_ATOMIC_T\*(C'\fR) must be atomic with respect to accesses from different -threads. This is not part of the specification for \f(CW\*(C`sig_atomic_t\*(C'\fR, but is -believed to be sufficiently portable. -.ie n .IP """sigprocmask"" must work in a threaded environment" 4 -.el .IP "\f(CWsigprocmask\fR must work in a threaded environment" 4 -.IX Item "sigprocmask must work in a threaded environment" -Libev uses \f(CW\*(C`sigprocmask\*(C'\fR to temporarily block signals. This is not -allowed in a threaded program (\f(CW\*(C`pthread_sigmask\*(C'\fR has to be used). Typical -pthread implementations will either allow \f(CW\*(C`sigprocmask\*(C'\fR in the \*(L"main -thread\*(R" or will block signals process-wide, both behaviours would -be compatible with libev. Interaction between \f(CW\*(C`sigprocmask\*(C'\fR and -\&\f(CW\*(C`pthread_sigmask\*(C'\fR could complicate things, however. -.Sp -The most portable way to handle signals is to block signals in all threads -except the initial one, and run the signal handling loop in the initial -thread as well. -.ie n .IP """long"" must be large enough for common memory allocation sizes" 4 -.el .IP "\f(CWlong\fR must be large enough for common memory allocation sizes" 4 -.IX Item "long must be large enough for common memory allocation sizes" -To improve portability and simplify its \s-1API,\s0 libev uses \f(CW\*(C`long\*(C'\fR internally -instead of \f(CW\*(C`size_t\*(C'\fR when allocating its data structures. On non-POSIX -systems (Microsoft...) this might be unexpectedly low, but is still at -least 31 bits everywhere, which is enough for hundreds of millions of -watchers. -.ie n .IP """double"" must hold a time value in seconds with enough accuracy" 4 -.el .IP "\f(CWdouble\fR must hold a time value in seconds with enough accuracy" 4 -.IX Item "double must hold a time value in seconds with enough accuracy" -The type \f(CW\*(C`double\*(C'\fR is used to represent timestamps. It is required to -have at least 51 bits of mantissa (and 9 bits of exponent), which is -good enough for at least into the year 4000 with millisecond accuracy -(the design goal for libev). This requirement is overfulfilled by -implementations using \s-1IEEE 754,\s0 which is basically all existing ones. -.Sp -With \s-1IEEE 754\s0 doubles, you get microsecond accuracy until at least the -year 2255 (and millisecond accuracy till the year 287396 \- by then, libev -is either obsolete or somebody patched it to use \f(CW\*(C`long double\*(C'\fR or -something like that, just kidding). -.PP -If you know of other additional requirements drop me a note. -.SH "ALGORITHMIC COMPLEXITIES" -.IX Header "ALGORITHMIC COMPLEXITIES" -In this section the complexities of (many of) the algorithms used inside -libev will be documented. For complexity discussions about backends see -the documentation for \f(CW\*(C`ev_default_init\*(C'\fR. -.PP -All of the following are about amortised time: If an array needs to be -extended, libev needs to realloc and move the whole array, but this -happens asymptotically rarer with higher number of elements, so O(1) might -mean that libev does a lengthy realloc operation in rare cases, but on -average it is much faster and asymptotically approaches constant time. -.IP "Starting and stopping timer/periodic watchers: O(log skipped_other_timers)" 4 -.IX Item "Starting and stopping timer/periodic watchers: O(log skipped_other_timers)" -This means that, when you have a watcher that triggers in one hour and -there are 100 watchers that would trigger before that, then inserting will -have to skip roughly seven (\f(CW\*(C`ld 100\*(C'\fR) of these watchers. -.IP "Changing timer/periodic watchers (by autorepeat or calling again): O(log skipped_other_timers)" 4 -.IX Item "Changing timer/periodic watchers (by autorepeat or calling again): O(log skipped_other_timers)" -That means that changing a timer costs less than removing/adding them, -as only the relative motion in the event queue has to be paid for. -.IP "Starting io/check/prepare/idle/signal/child/fork/async watchers: O(1)" 4 -.IX Item "Starting io/check/prepare/idle/signal/child/fork/async watchers: O(1)" -These just add the watcher into an array or at the head of a list. -.IP "Stopping check/prepare/idle/fork/async watchers: O(1)" 4 -.IX Item "Stopping check/prepare/idle/fork/async watchers: O(1)" -.PD 0 -.IP "Stopping an io/signal/child watcher: O(number_of_watchers_for_this_(fd/signal/pid % \s-1EV_PID_HASHSIZE\s0))" 4 -.IX Item "Stopping an io/signal/child watcher: O(number_of_watchers_for_this_(fd/signal/pid % EV_PID_HASHSIZE))" -.PD -These watchers are stored in lists, so they need to be walked to find the -correct watcher to remove. The lists are usually short (you don't usually -have many watchers waiting for the same fd or signal: one is typical, two -is rare). -.IP "Finding the next timer in each loop iteration: O(1)" 4 -.IX Item "Finding the next timer in each loop iteration: O(1)" -By virtue of using a binary or 4\-heap, the next timer is always found at a -fixed position in the storage array. -.IP "Each change on a file descriptor per loop iteration: O(number_of_watchers_for_this_fd)" 4 -.IX Item "Each change on a file descriptor per loop iteration: O(number_of_watchers_for_this_fd)" -A change means an I/O watcher gets started or stopped, which requires -libev to recalculate its status (and possibly tell the kernel, depending -on backend and whether \f(CW\*(C`ev_io_set\*(C'\fR was used). -.IP "Activating one watcher (putting it into the pending state): O(1)" 4 -.IX Item "Activating one watcher (putting it into the pending state): O(1)" -.PD 0 -.IP "Priority handling: O(number_of_priorities)" 4 -.IX Item "Priority handling: O(number_of_priorities)" -.PD -Priorities are implemented by allocating some space for each -priority. When doing priority-based operations, libev usually has to -linearly search all the priorities, but starting/stopping and activating -watchers becomes O(1) with respect to priority handling. -.IP "Sending an ev_async: O(1)" 4 -.IX Item "Sending an ev_async: O(1)" -.PD 0 -.IP "Processing ev_async_send: O(number_of_async_watchers)" 4 -.IX Item "Processing ev_async_send: O(number_of_async_watchers)" -.IP "Processing signals: O(max_signal_number)" 4 -.IX Item "Processing signals: O(max_signal_number)" -.PD -Sending involves a system call \fIiff\fR there were no other \f(CW\*(C`ev_async_send\*(C'\fR -calls in the current loop iteration and the loop is currently -blocked. Checking for async and signal events involves iterating over all -running async watchers or all signal numbers. -.SH "PORTING FROM LIBEV 3.X TO 4.X" -.IX Header "PORTING FROM LIBEV 3.X TO 4.X" -The major version 4 introduced some incompatible changes to the \s-1API.\s0 -.PP -At the moment, the \f(CW\*(C`ev.h\*(C'\fR header file provides compatibility definitions -for all changes, so most programs should still compile. The compatibility -layer might be removed in later versions of libev, so better update to the -new \s-1API\s0 early than late. -.ie n .IP """EV_COMPAT3"" backwards compatibility mechanism" 4 -.el .IP "\f(CWEV_COMPAT3\fR backwards compatibility mechanism" 4 -.IX Item "EV_COMPAT3 backwards compatibility mechanism" -The backward compatibility mechanism can be controlled by -\&\f(CW\*(C`EV_COMPAT3\*(C'\fR. See \*(L"\s-1PREPROCESSOR SYMBOLS/MACROS\*(R"\s0 in the \*(L"\s-1EMBEDDING\*(R"\s0 -section. -.ie n .IP """ev_default_destroy"" and ""ev_default_fork"" have been removed" 4 -.el .IP "\f(CWev_default_destroy\fR and \f(CWev_default_fork\fR have been removed" 4 -.IX Item "ev_default_destroy and ev_default_fork have been removed" -These calls can be replaced easily by their \f(CW\*(C`ev_loop_xxx\*(C'\fR counterparts: -.Sp -.Vb 2 -\& ev_loop_destroy (EV_DEFAULT_UC); -\& ev_loop_fork (EV_DEFAULT); -.Ve -.IP "function/symbol renames" 4 -.IX Item "function/symbol renames" -A number of functions and symbols have been renamed: -.Sp -.Vb 3 -\& ev_loop => ev_run -\& EVLOOP_NONBLOCK => EVRUN_NOWAIT -\& EVLOOP_ONESHOT => EVRUN_ONCE -\& -\& ev_unloop => ev_break -\& EVUNLOOP_CANCEL => EVBREAK_CANCEL -\& EVUNLOOP_ONE => EVBREAK_ONE -\& EVUNLOOP_ALL => EVBREAK_ALL -\& -\& EV_TIMEOUT => EV_TIMER -\& -\& ev_loop_count => ev_iteration -\& ev_loop_depth => ev_depth -\& ev_loop_verify => ev_verify -.Ve -.Sp -Most functions working on \f(CW\*(C`struct ev_loop\*(C'\fR objects don't have an -\&\f(CW\*(C`ev_loop_\*(C'\fR prefix, so it was removed; \f(CW\*(C`ev_loop\*(C'\fR, \f(CW\*(C`ev_unloop\*(C'\fR and -associated constants have been renamed to not collide with the \f(CW\*(C`struct -ev_loop\*(C'\fR anymore and \f(CW\*(C`EV_TIMER\*(C'\fR now follows the same naming scheme -as all other watcher types. Note that \f(CW\*(C`ev_loop_fork\*(C'\fR is still called -\&\f(CW\*(C`ev_loop_fork\*(C'\fR because it would otherwise clash with the \f(CW\*(C`ev_fork\*(C'\fR -typedef. -.ie n .IP """EV_MINIMAL"" mechanism replaced by ""EV_FEATURES""" 4 -.el .IP "\f(CWEV_MINIMAL\fR mechanism replaced by \f(CWEV_FEATURES\fR" 4 -.IX Item "EV_MINIMAL mechanism replaced by EV_FEATURES" -The preprocessor symbol \f(CW\*(C`EV_MINIMAL\*(C'\fR has been replaced by a different -mechanism, \f(CW\*(C`EV_FEATURES\*(C'\fR. Programs using \f(CW\*(C`EV_MINIMAL\*(C'\fR usually compile -and work, but the library code will of course be larger. -.SH "GLOSSARY" -.IX Header "GLOSSARY" -.IP "active" 4 -.IX Item "active" -A watcher is active as long as it has been started and not yet stopped. -See \*(L"\s-1WATCHER STATES\*(R"\s0 for details. -.IP "application" 4 -.IX Item "application" -In this document, an application is whatever is using libev. -.IP "backend" 4 -.IX Item "backend" -The part of the code dealing with the operating system interfaces. -.IP "callback" 4 -.IX Item "callback" -The address of a function that is called when some event has been -detected. Callbacks are being passed the event loop, the watcher that -received the event, and the actual event bitset. -.IP "callback/watcher invocation" 4 -.IX Item "callback/watcher invocation" -The act of calling the callback associated with a watcher. -.IP "event" 4 -.IX Item "event" -A change of state of some external event, such as data now being available -for reading on a file descriptor, time having passed or simply not having -any other events happening anymore. -.Sp -In libev, events are represented as single bits (such as \f(CW\*(C`EV_READ\*(C'\fR or -\&\f(CW\*(C`EV_TIMER\*(C'\fR). -.IP "event library" 4 -.IX Item "event library" -A software package implementing an event model and loop. -.IP "event loop" 4 -.IX Item "event loop" -An entity that handles and processes external events and converts them -into callback invocations. -.IP "event model" 4 -.IX Item "event model" -The model used to describe how an event loop handles and processes -watchers and events. -.IP "pending" 4 -.IX Item "pending" -A watcher is pending as soon as the corresponding event has been -detected. See \*(L"\s-1WATCHER STATES\*(R"\s0 for details. -.IP "real time" 4 -.IX Item "real time" -The physical time that is observed. It is apparently strictly monotonic :) -.IP "wall-clock time" 4 -.IX Item "wall-clock time" -The time and date as shown on clocks. Unlike real time, it can actually -be wrong and jump forwards and backwards, e.g. when you adjust your -clock. -.IP "watcher" 4 -.IX Item "watcher" -A data structure that describes interest in certain events. Watchers need -to be started (attached to an event loop) before they can receive events. -.SH "AUTHOR" -.IX Header "AUTHOR" -Marc Lehmann , with repeated corrections by Mikael -Magnusson and Emanuele Giaquinta, and minor corrections by many others. diff --git a/client/3rd/ShadowSocks/ShadowSocks/libev/armv7s/include/ev++.h b/client/3rd/ShadowSocks/ShadowSocks/libev/armv7s/include/ev++.h deleted file mode 100644 index 22dfcf58..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libev/armv7s/include/ev++.h +++ /dev/null @@ -1,818 +0,0 @@ -/* - * libev simple C++ wrapper classes - * - * Copyright (c) 2007,2008,2010,2018,2020 Marc Alexander Lehmann - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modifica- - * tion, 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. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MER- - * CHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO - * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPE- - * CIAL, 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 OTH- - * ERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - * OF THE POSSIBILITY OF SUCH DAMAGE. - * - * Alternatively, the contents of this file may be used under the terms of - * the GNU General Public License ("GPL") version 2 or any later version, - * in which case the provisions of the GPL are applicable instead of - * the above. If you wish to allow the use of your version of this file - * only under the terms of the GPL and not to allow others to use your - * version of this file under the BSD license, indicate your decision - * by deleting the provisions above and replace them with the notice - * and other provisions required by the GPL. If you do not delete the - * provisions above, a recipient may use your version of this file under - * either the BSD or the GPL. - */ - -#ifndef EVPP_H__ -#define EVPP_H__ - -#ifdef EV_H -# include EV_H -#else -# include "ev.h" -#endif - -#ifndef EV_USE_STDEXCEPT -# define EV_USE_STDEXCEPT 1 -#endif - -#if EV_USE_STDEXCEPT -# include -#endif - -namespace ev { - - typedef ev_tstamp tstamp; - - enum { - UNDEF = EV_UNDEF, - NONE = EV_NONE, - READ = EV_READ, - WRITE = EV_WRITE, -#if EV_COMPAT3 - TIMEOUT = EV_TIMEOUT, -#endif - TIMER = EV_TIMER, - PERIODIC = EV_PERIODIC, - SIGNAL = EV_SIGNAL, - CHILD = EV_CHILD, - STAT = EV_STAT, - IDLE = EV_IDLE, - CHECK = EV_CHECK, - PREPARE = EV_PREPARE, - FORK = EV_FORK, - ASYNC = EV_ASYNC, - EMBED = EV_EMBED, -# undef ERROR // some systems stupidly #define ERROR - ERROR = EV_ERROR - }; - - enum - { - AUTO = EVFLAG_AUTO, - NOENV = EVFLAG_NOENV, - FORKCHECK = EVFLAG_FORKCHECK, - - SELECT = EVBACKEND_SELECT, - POLL = EVBACKEND_POLL, - EPOLL = EVBACKEND_EPOLL, - KQUEUE = EVBACKEND_KQUEUE, - DEVPOLL = EVBACKEND_DEVPOLL, - PORT = EVBACKEND_PORT - }; - - enum - { -#if EV_COMPAT3 - NONBLOCK = EVLOOP_NONBLOCK, - ONESHOT = EVLOOP_ONESHOT, -#endif - NOWAIT = EVRUN_NOWAIT, - ONCE = EVRUN_ONCE - }; - - enum how_t - { - ONE = EVBREAK_ONE, - ALL = EVBREAK_ALL - }; - - struct bad_loop -#if EV_USE_STDEXCEPT - : std::exception -#endif - { -#if EV_USE_STDEXCEPT - const char *what () const EV_NOEXCEPT - { - return "libev event loop cannot be initialized, bad value of LIBEV_FLAGS?"; - } -#endif - }; - -#ifdef EV_AX -# undef EV_AX -#endif - -#ifdef EV_AX_ -# undef EV_AX_ -#endif - -#if EV_MULTIPLICITY -# define EV_AX raw_loop -# define EV_AX_ raw_loop, -#else -# define EV_AX -# define EV_AX_ -#endif - - struct loop_ref - { - loop_ref (EV_P) EV_NOEXCEPT -#if EV_MULTIPLICITY - : EV_AX (EV_A) -#endif - { - } - - bool operator == (const loop_ref &other) const EV_NOEXCEPT - { -#if EV_MULTIPLICITY - return EV_AX == other.EV_AX; -#else - return true; -#endif - } - - bool operator != (const loop_ref &other) const EV_NOEXCEPT - { -#if EV_MULTIPLICITY - return ! (*this == other); -#else - return false; -#endif - } - -#if EV_MULTIPLICITY - bool operator == (const EV_P) const EV_NOEXCEPT - { - return this->EV_AX == EV_A; - } - - bool operator != (const EV_P) const EV_NOEXCEPT - { - return ! (*this == EV_A); - } - - operator struct ev_loop * () const EV_NOEXCEPT - { - return EV_AX; - } - - operator const struct ev_loop * () const EV_NOEXCEPT - { - return EV_AX; - } - - bool is_default () const EV_NOEXCEPT - { - return EV_AX == ev_default_loop (0); - } -#endif - -#if EV_COMPAT3 - void loop (int flags = 0) - { - ev_run (EV_AX_ flags); - } - - void unloop (how_t how = ONE) EV_NOEXCEPT - { - ev_break (EV_AX_ how); - } -#endif - - void run (int flags = 0) - { - ev_run (EV_AX_ flags); - } - - void break_loop (how_t how = ONE) EV_NOEXCEPT - { - ev_break (EV_AX_ how); - } - - void post_fork () EV_NOEXCEPT - { - ev_loop_fork (EV_AX); - } - - unsigned int backend () const EV_NOEXCEPT - { - return ev_backend (EV_AX); - } - - tstamp now () const EV_NOEXCEPT - { - return ev_now (EV_AX); - } - - void ref () EV_NOEXCEPT - { - ev_ref (EV_AX); - } - - void unref () EV_NOEXCEPT - { - ev_unref (EV_AX); - } - -#if EV_FEATURE_API - unsigned int iteration () const EV_NOEXCEPT - { - return ev_iteration (EV_AX); - } - - unsigned int depth () const EV_NOEXCEPT - { - return ev_depth (EV_AX); - } - - void set_io_collect_interval (tstamp interval) EV_NOEXCEPT - { - ev_set_io_collect_interval (EV_AX_ interval); - } - - void set_timeout_collect_interval (tstamp interval) EV_NOEXCEPT - { - ev_set_timeout_collect_interval (EV_AX_ interval); - } -#endif - - // function callback - void once (int fd, int events, tstamp timeout, void (*cb)(int, void *), void *arg = 0) EV_NOEXCEPT - { - ev_once (EV_AX_ fd, events, timeout, cb, arg); - } - - // method callback - template - void once (int fd, int events, tstamp timeout, K *object) EV_NOEXCEPT - { - once (fd, events, timeout, method_thunk, object); - } - - // default method == operator () - template - void once (int fd, int events, tstamp timeout, K *object) EV_NOEXCEPT - { - once (fd, events, timeout, method_thunk, object); - } - - template - static void method_thunk (int revents, void *arg) - { - (static_cast(arg)->*method) - (revents); - } - - // no-argument method callback - template - void once (int fd, int events, tstamp timeout, K *object) EV_NOEXCEPT - { - once (fd, events, timeout, method_noargs_thunk, object); - } - - template - static void method_noargs_thunk (int revents, void *arg) - { - (static_cast(arg)->*method) - (); - } - - // simpler function callback - template - void once (int fd, int events, tstamp timeout) EV_NOEXCEPT - { - once (fd, events, timeout, simpler_func_thunk); - } - - template - static void simpler_func_thunk (int revents, void *arg) - { - (*cb) - (revents); - } - - // simplest function callback - template - void once (int fd, int events, tstamp timeout) EV_NOEXCEPT - { - once (fd, events, timeout, simplest_func_thunk); - } - - template - static void simplest_func_thunk (int revents, void *arg) - { - (*cb) - (); - } - - void feed_fd_event (int fd, int revents) EV_NOEXCEPT - { - ev_feed_fd_event (EV_AX_ fd, revents); - } - - void feed_signal_event (int signum) EV_NOEXCEPT - { - ev_feed_signal_event (EV_AX_ signum); - } - -#if EV_MULTIPLICITY - struct ev_loop* EV_AX; -#endif - - }; - -#if EV_MULTIPLICITY - struct dynamic_loop : loop_ref - { - - dynamic_loop (unsigned int flags = AUTO) - : loop_ref (ev_loop_new (flags)) - { - if (!EV_AX) - throw bad_loop (); - } - - ~dynamic_loop () EV_NOEXCEPT - { - ev_loop_destroy (EV_AX); - EV_AX = 0; - } - - private: - - dynamic_loop (const dynamic_loop &); - - dynamic_loop & operator= (const dynamic_loop &); - - }; -#endif - - struct default_loop : loop_ref - { - default_loop (unsigned int flags = AUTO) -#if EV_MULTIPLICITY - : loop_ref (ev_default_loop (flags)) -#endif - { - if ( -#if EV_MULTIPLICITY - !EV_AX -#else - !ev_default_loop (flags) -#endif - ) - throw bad_loop (); - } - - private: - default_loop (const default_loop &); - default_loop &operator = (const default_loop &); - }; - - inline loop_ref get_default_loop () EV_NOEXCEPT - { -#if EV_MULTIPLICITY - return ev_default_loop (0); -#else - return loop_ref (); -#endif - } - -#undef EV_AX -#undef EV_AX_ - -#undef EV_PX -#undef EV_PX_ -#if EV_MULTIPLICITY -# define EV_PX loop_ref EV_A -# define EV_PX_ loop_ref EV_A_ -#else -# define EV_PX -# define EV_PX_ -#endif - - template - struct base : ev_watcher - { - // scoped pause/unpause of a watcher - struct freeze_guard - { - watcher &w; - bool active; - - freeze_guard (watcher *self) EV_NOEXCEPT - : w (*self), active (w.is_active ()) - { - if (active) w.stop (); - } - - ~freeze_guard () - { - if (active) w.start (); - } - }; - - #if EV_MULTIPLICITY - EV_PX; - - // loop set - void set (EV_P) EV_NOEXCEPT - { - this->EV_A = EV_A; - } - #endif - - base (EV_PX) EV_NOEXCEPT - #if EV_MULTIPLICITY - : EV_A (EV_A) - #endif - { - ev_init (this, 0); - } - - void set_ (const void *data, void (*cb)(EV_P_ ev_watcher *w, int revents)) EV_NOEXCEPT - { - this->data = (void *)data; - ev_set_cb (static_cast(this), cb); - } - - // function callback - template - void set (void *data = 0) EV_NOEXCEPT - { - set_ (data, function_thunk); - } - - template - static void function_thunk (EV_P_ ev_watcher *w, int revents) - { - function - (*static_cast(w), revents); - } - - // method callback - template - void set (K *object) EV_NOEXCEPT - { - set_ (object, method_thunk); - } - - // default method == operator () - template - void set (K *object) EV_NOEXCEPT - { - set_ (object, method_thunk); - } - - template - static void method_thunk (EV_P_ ev_watcher *w, int revents) - { - (static_cast(w->data)->*method) - (*static_cast(w), revents); - } - - // no-argument callback - template - void set (K *object) EV_NOEXCEPT - { - set_ (object, method_noargs_thunk); - } - - template - static void method_noargs_thunk (EV_P_ ev_watcher *w, int revents) - { - (static_cast(w->data)->*method) - (); - } - - void operator ()(int events = EV_UNDEF) - { - return - ev_cb (static_cast(this)) - (static_cast(this), events); - } - - bool is_active () const EV_NOEXCEPT - { - return ev_is_active (static_cast(this)); - } - - bool is_pending () const EV_NOEXCEPT - { - return ev_is_pending (static_cast(this)); - } - - void feed_event (int revents) EV_NOEXCEPT - { - ev_feed_event (EV_A_ static_cast(this), revents); - } - }; - - inline tstamp now (EV_P) EV_NOEXCEPT - { - return ev_now (EV_A); - } - - inline void delay (tstamp interval) EV_NOEXCEPT - { - ev_sleep (interval); - } - - inline int version_major () EV_NOEXCEPT - { - return ev_version_major (); - } - - inline int version_minor () EV_NOEXCEPT - { - return ev_version_minor (); - } - - inline unsigned int supported_backends () EV_NOEXCEPT - { - return ev_supported_backends (); - } - - inline unsigned int recommended_backends () EV_NOEXCEPT - { - return ev_recommended_backends (); - } - - inline unsigned int embeddable_backends () EV_NOEXCEPT - { - return ev_embeddable_backends (); - } - - inline void set_allocator (void *(*cb)(void *ptr, long size) EV_NOEXCEPT) EV_NOEXCEPT - { - ev_set_allocator (cb); - } - - inline void set_syserr_cb (void (*cb)(const char *msg) EV_NOEXCEPT) EV_NOEXCEPT - { - ev_set_syserr_cb (cb); - } - - #if EV_MULTIPLICITY - #define EV_CONSTRUCT(cppstem,cstem) \ - (EV_PX = get_default_loop ()) EV_NOEXCEPT \ - : base (EV_A) \ - { \ - } - #else - #define EV_CONSTRUCT(cppstem,cstem) \ - () EV_NOEXCEPT \ - { \ - } - #endif - - /* using a template here would require quite a few more lines, - * so a macro solution was chosen */ - #define EV_BEGIN_WATCHER(cppstem,cstem) \ - \ - struct cppstem : base \ - { \ - void start () EV_NOEXCEPT \ - { \ - ev_ ## cstem ## _start (EV_A_ static_cast(this)); \ - } \ - \ - void stop () EV_NOEXCEPT \ - { \ - ev_ ## cstem ## _stop (EV_A_ static_cast(this)); \ - } \ - \ - cppstem EV_CONSTRUCT(cppstem,cstem) \ - \ - ~cppstem () EV_NOEXCEPT \ - { \ - stop (); \ - } \ - \ - using base::set; \ - \ - private: \ - \ - cppstem (const cppstem &o); \ - \ - cppstem &operator =(const cppstem &o); \ - \ - public: - - #define EV_END_WATCHER(cppstem,cstem) \ - }; - - EV_BEGIN_WATCHER (io, io) - void set (int fd, int events) EV_NOEXCEPT - { - freeze_guard freeze (this); - ev_io_set (static_cast(this), fd, events); - } - - void set (int events) EV_NOEXCEPT - { - freeze_guard freeze (this); - ev_io_modify (static_cast(this), events); - } - - void start (int fd, int events) EV_NOEXCEPT - { - set (fd, events); - start (); - } - EV_END_WATCHER (io, io) - - EV_BEGIN_WATCHER (timer, timer) - void set (ev_tstamp after, ev_tstamp repeat = 0.) EV_NOEXCEPT - { - freeze_guard freeze (this); - ev_timer_set (static_cast(this), after, repeat); - } - - void start (ev_tstamp after, ev_tstamp repeat = 0.) EV_NOEXCEPT - { - set (after, repeat); - start (); - } - - void again () EV_NOEXCEPT - { - ev_timer_again (EV_A_ static_cast(this)); - } - - ev_tstamp remaining () - { - return ev_timer_remaining (EV_A_ static_cast(this)); - } - EV_END_WATCHER (timer, timer) - - #if EV_PERIODIC_ENABLE - EV_BEGIN_WATCHER (periodic, periodic) - void set (ev_tstamp at, ev_tstamp interval = 0.) EV_NOEXCEPT - { - freeze_guard freeze (this); - ev_periodic_set (static_cast(this), at, interval, 0); - } - - void start (ev_tstamp at, ev_tstamp interval = 0.) EV_NOEXCEPT - { - set (at, interval); - start (); - } - - void again () EV_NOEXCEPT - { - ev_periodic_again (EV_A_ static_cast(this)); - } - EV_END_WATCHER (periodic, periodic) - #endif - - #if EV_SIGNAL_ENABLE - EV_BEGIN_WATCHER (sig, signal) - void set (int signum) EV_NOEXCEPT - { - freeze_guard freeze (this); - ev_signal_set (static_cast(this), signum); - } - - void start (int signum) EV_NOEXCEPT - { - set (signum); - start (); - } - EV_END_WATCHER (sig, signal) - #endif - - #if EV_CHILD_ENABLE - EV_BEGIN_WATCHER (child, child) - void set (int pid, int trace = 0) EV_NOEXCEPT - { - freeze_guard freeze (this); - ev_child_set (static_cast(this), pid, trace); - } - - void start (int pid, int trace = 0) EV_NOEXCEPT - { - set (pid, trace); - start (); - } - EV_END_WATCHER (child, child) - #endif - - #if EV_STAT_ENABLE - EV_BEGIN_WATCHER (stat, stat) - void set (const char *path, ev_tstamp interval = 0.) EV_NOEXCEPT - { - freeze_guard freeze (this); - ev_stat_set (static_cast(this), path, interval); - } - - void start (const char *path, ev_tstamp interval = 0.) EV_NOEXCEPT - { - stop (); - set (path, interval); - start (); - } - - void update () EV_NOEXCEPT - { - ev_stat_stat (EV_A_ static_cast(this)); - } - EV_END_WATCHER (stat, stat) - #endif - - #if EV_IDLE_ENABLE - EV_BEGIN_WATCHER (idle, idle) - void set () EV_NOEXCEPT { } - EV_END_WATCHER (idle, idle) - #endif - - #if EV_PREPARE_ENABLE - EV_BEGIN_WATCHER (prepare, prepare) - void set () EV_NOEXCEPT { } - EV_END_WATCHER (prepare, prepare) - #endif - - #if EV_CHECK_ENABLE - EV_BEGIN_WATCHER (check, check) - void set () EV_NOEXCEPT { } - EV_END_WATCHER (check, check) - #endif - - #if EV_EMBED_ENABLE - EV_BEGIN_WATCHER (embed, embed) - void set_embed (struct ev_loop *embedded_loop) EV_NOEXCEPT - { - freeze_guard freeze (this); - ev_embed_set (static_cast(this), embedded_loop); - } - - void start (struct ev_loop *embedded_loop) EV_NOEXCEPT - { - set (embedded_loop); - start (); - } - - void sweep () - { - ev_embed_sweep (EV_A_ static_cast(this)); - } - EV_END_WATCHER (embed, embed) - #endif - - #if EV_FORK_ENABLE - EV_BEGIN_WATCHER (fork, fork) - void set () EV_NOEXCEPT { } - EV_END_WATCHER (fork, fork) - #endif - - #if EV_ASYNC_ENABLE - EV_BEGIN_WATCHER (async, async) - void send () EV_NOEXCEPT - { - ev_async_send (EV_A_ static_cast(this)); - } - - bool async_pending () EV_NOEXCEPT - { - return ev_async_pending (static_cast(this)); - } - EV_END_WATCHER (async, async) - #endif - - #undef EV_PX - #undef EV_PX_ - #undef EV_CONSTRUCT - #undef EV_BEGIN_WATCHER - #undef EV_END_WATCHER -} - -#endif - diff --git a/client/3rd/ShadowSocks/ShadowSocks/libev/armv7s/include/ev.h b/client/3rd/ShadowSocks/ShadowSocks/libev/armv7s/include/ev.h deleted file mode 100644 index 4669c39b..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libev/armv7s/include/ev.h +++ /dev/null @@ -1,860 +0,0 @@ -/* - * libev native API header - * - * Copyright (c) 2007-2020 Marc Alexander Lehmann - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modifica- - * tion, 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. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MER- - * CHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO - * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPE- - * CIAL, 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 OTH- - * ERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - * OF THE POSSIBILITY OF SUCH DAMAGE. - * - * Alternatively, the contents of this file may be used under the terms of - * the GNU General Public License ("GPL") version 2 or any later version, - * in which case the provisions of the GPL are applicable instead of - * the above. If you wish to allow the use of your version of this file - * only under the terms of the GPL and not to allow others to use your - * version of this file under the BSD license, indicate your decision - * by deleting the provisions above and replace them with the notice - * and other provisions required by the GPL. If you do not delete the - * provisions above, a recipient may use your version of this file under - * either the BSD or the GPL. - */ - -#ifndef EV_H_ -#define EV_H_ - -#ifdef __cplusplus -# define EV_CPP(x) x -# if __cplusplus >= 201103L -# define EV_NOEXCEPT noexcept -# else -# define EV_NOEXCEPT -# endif -#else -# define EV_CPP(x) -# define EV_NOEXCEPT -#endif -#define EV_THROW EV_NOEXCEPT /* pre-4.25, do not use in new code */ - -EV_CPP(extern "C" {) - -/*****************************************************************************/ - -/* pre-4.0 compatibility */ -#ifndef EV_COMPAT3 -# define EV_COMPAT3 1 -#endif - -#ifndef EV_FEATURES -# if defined __OPTIMIZE_SIZE__ -# define EV_FEATURES 0x7c -# else -# define EV_FEATURES 0x7f -# endif -#endif - -#define EV_FEATURE_CODE ((EV_FEATURES) & 1) -#define EV_FEATURE_DATA ((EV_FEATURES) & 2) -#define EV_FEATURE_CONFIG ((EV_FEATURES) & 4) -#define EV_FEATURE_API ((EV_FEATURES) & 8) -#define EV_FEATURE_WATCHERS ((EV_FEATURES) & 16) -#define EV_FEATURE_BACKENDS ((EV_FEATURES) & 32) -#define EV_FEATURE_OS ((EV_FEATURES) & 64) - -/* these priorities are inclusive, higher priorities will be invoked earlier */ -#ifndef EV_MINPRI -# define EV_MINPRI (EV_FEATURE_CONFIG ? -2 : 0) -#endif -#ifndef EV_MAXPRI -# define EV_MAXPRI (EV_FEATURE_CONFIG ? +2 : 0) -#endif - -#ifndef EV_MULTIPLICITY -# define EV_MULTIPLICITY EV_FEATURE_CONFIG -#endif - -#ifndef EV_PERIODIC_ENABLE -# define EV_PERIODIC_ENABLE EV_FEATURE_WATCHERS -#endif - -#ifndef EV_STAT_ENABLE -# define EV_STAT_ENABLE EV_FEATURE_WATCHERS -#endif - -#ifndef EV_PREPARE_ENABLE -# define EV_PREPARE_ENABLE EV_FEATURE_WATCHERS -#endif - -#ifndef EV_CHECK_ENABLE -# define EV_CHECK_ENABLE EV_FEATURE_WATCHERS -#endif - -#ifndef EV_IDLE_ENABLE -# define EV_IDLE_ENABLE EV_FEATURE_WATCHERS -#endif - -#ifndef EV_FORK_ENABLE -# define EV_FORK_ENABLE EV_FEATURE_WATCHERS -#endif - -#ifndef EV_CLEANUP_ENABLE -# define EV_CLEANUP_ENABLE EV_FEATURE_WATCHERS -#endif - -#ifndef EV_SIGNAL_ENABLE -# define EV_SIGNAL_ENABLE EV_FEATURE_WATCHERS -#endif - -#ifndef EV_CHILD_ENABLE -# ifdef _WIN32 -# define EV_CHILD_ENABLE 0 -# else -# define EV_CHILD_ENABLE EV_FEATURE_WATCHERS -#endif -#endif - -#ifndef EV_ASYNC_ENABLE -# define EV_ASYNC_ENABLE EV_FEATURE_WATCHERS -#endif - -#ifndef EV_EMBED_ENABLE -# define EV_EMBED_ENABLE EV_FEATURE_WATCHERS -#endif - -#ifndef EV_WALK_ENABLE -# define EV_WALK_ENABLE 0 /* not yet */ -#endif - -/*****************************************************************************/ - -#if EV_CHILD_ENABLE && !EV_SIGNAL_ENABLE -# undef EV_SIGNAL_ENABLE -# define EV_SIGNAL_ENABLE 1 -#endif - -/*****************************************************************************/ - -#ifndef EV_TSTAMP_T -# define EV_TSTAMP_T double -#endif -typedef EV_TSTAMP_T ev_tstamp; - -#include /* for memmove */ - -#ifndef EV_ATOMIC_T -# include -# define EV_ATOMIC_T sig_atomic_t volatile -#endif - -#if EV_STAT_ENABLE -# ifdef _WIN32 -# include -# include -# endif -# include -#endif - -/* support multiple event loops? */ -#if EV_MULTIPLICITY -struct ev_loop; -# define EV_P struct ev_loop *loop /* a loop as sole parameter in a declaration */ -# define EV_P_ EV_P, /* a loop as first of multiple parameters */ -# define EV_A loop /* a loop as sole argument to a function call */ -# define EV_A_ EV_A, /* a loop as first of multiple arguments */ -# define EV_DEFAULT_UC ev_default_loop_uc_ () /* the default loop, if initialised, as sole arg */ -# define EV_DEFAULT_UC_ EV_DEFAULT_UC, /* the default loop as first of multiple arguments */ -# define EV_DEFAULT ev_default_loop (0) /* the default loop as sole arg */ -# define EV_DEFAULT_ EV_DEFAULT, /* the default loop as first of multiple arguments */ -#else -# define EV_P void -# define EV_P_ -# define EV_A -# define EV_A_ -# define EV_DEFAULT -# define EV_DEFAULT_ -# define EV_DEFAULT_UC -# define EV_DEFAULT_UC_ -# undef EV_EMBED_ENABLE -#endif - -/* EV_INLINE is used for functions in header files */ -#if __STDC_VERSION__ >= 199901L || __GNUC__ >= 3 -# define EV_INLINE static inline -#else -# define EV_INLINE static -#endif - -#ifdef EV_API_STATIC -# define EV_API_DECL static -#else -# define EV_API_DECL extern -#endif - -/* EV_PROTOTYPES can be used to switch of prototype declarations */ -#ifndef EV_PROTOTYPES -# define EV_PROTOTYPES 1 -#endif - -/*****************************************************************************/ - -#define EV_VERSION_MAJOR 4 -#define EV_VERSION_MINOR 33 - -/* eventmask, revents, events... */ -enum { - EV_UNDEF = (int)0xFFFFFFFF, /* guaranteed to be invalid */ - EV_NONE = 0x00, /* no events */ - EV_READ = 0x01, /* ev_io detected read will not block */ - EV_WRITE = 0x02, /* ev_io detected write will not block */ - EV__IOFDSET = 0x80, /* internal use only */ - EV_IO = EV_READ, /* alias for type-detection */ - EV_TIMER = 0x00000100, /* timer timed out */ -#if EV_COMPAT3 - EV_TIMEOUT = EV_TIMER, /* pre 4.0 API compatibility */ -#endif - EV_PERIODIC = 0x00000200, /* periodic timer timed out */ - EV_SIGNAL = 0x00000400, /* signal was received */ - EV_CHILD = 0x00000800, /* child/pid had status change */ - EV_STAT = 0x00001000, /* stat data changed */ - EV_IDLE = 0x00002000, /* event loop is idling */ - EV_PREPARE = 0x00004000, /* event loop about to poll */ - EV_CHECK = 0x00008000, /* event loop finished poll */ - EV_EMBED = 0x00010000, /* embedded event loop needs sweep */ - EV_FORK = 0x00020000, /* event loop resumed in child */ - EV_CLEANUP = 0x00040000, /* event loop resumed in child */ - EV_ASYNC = 0x00080000, /* async intra-loop signal */ - EV_CUSTOM = 0x01000000, /* for use by user code */ - EV_ERROR = (int)0x80000000 /* sent when an error occurs */ -}; - -/* can be used to add custom fields to all watchers, while losing binary compatibility */ -#ifndef EV_COMMON -# define EV_COMMON void *data; -#endif - -#ifndef EV_CB_DECLARE -# define EV_CB_DECLARE(type) void (*cb)(EV_P_ struct type *w, int revents); -#endif -#ifndef EV_CB_INVOKE -# define EV_CB_INVOKE(watcher,revents) (watcher)->cb (EV_A_ (watcher), (revents)) -#endif - -/* not official, do not use */ -#define EV_CB(type,name) void name (EV_P_ struct ev_ ## type *w, int revents) - -/* - * struct member types: - * private: you may look at them, but not change them, - * and they might not mean anything to you. - * ro: can be read anytime, but only changed when the watcher isn't active. - * rw: can be read and modified anytime, even when the watcher is active. - * - * some internal details that might be helpful for debugging: - * - * active is either 0, which means the watcher is not active, - * or the array index of the watcher (periodics, timers) - * or the array index + 1 (most other watchers) - * or simply 1 for watchers that aren't in some array. - * pending is either 0, in which case the watcher isn't, - * or the array index + 1 in the pendings array. - */ - -#if EV_MINPRI == EV_MAXPRI -# define EV_DECL_PRIORITY -#elif !defined (EV_DECL_PRIORITY) -# define EV_DECL_PRIORITY int priority; -#endif - -/* shared by all watchers */ -#define EV_WATCHER(type) \ - int active; /* private */ \ - int pending; /* private */ \ - EV_DECL_PRIORITY /* private */ \ - EV_COMMON /* rw */ \ - EV_CB_DECLARE (type) /* private */ - -#define EV_WATCHER_LIST(type) \ - EV_WATCHER (type) \ - struct ev_watcher_list *next; /* private */ - -#define EV_WATCHER_TIME(type) \ - EV_WATCHER (type) \ - ev_tstamp at; /* private */ - -/* base class, nothing to see here unless you subclass */ -typedef struct ev_watcher -{ - EV_WATCHER (ev_watcher) -} ev_watcher; - -/* base class, nothing to see here unless you subclass */ -typedef struct ev_watcher_list -{ - EV_WATCHER_LIST (ev_watcher_list) -} ev_watcher_list; - -/* base class, nothing to see here unless you subclass */ -typedef struct ev_watcher_time -{ - EV_WATCHER_TIME (ev_watcher_time) -} ev_watcher_time; - -/* invoked when fd is either EV_READable or EV_WRITEable */ -/* revent EV_READ, EV_WRITE */ -typedef struct ev_io -{ - EV_WATCHER_LIST (ev_io) - - int fd; /* ro */ - int events; /* ro */ -} ev_io; - -/* invoked after a specific time, repeatable (based on monotonic clock) */ -/* revent EV_TIMEOUT */ -typedef struct ev_timer -{ - EV_WATCHER_TIME (ev_timer) - - ev_tstamp repeat; /* rw */ -} ev_timer; - -/* invoked at some specific time, possibly repeating at regular intervals (based on UTC) */ -/* revent EV_PERIODIC */ -typedef struct ev_periodic -{ - EV_WATCHER_TIME (ev_periodic) - - ev_tstamp offset; /* rw */ - ev_tstamp interval; /* rw */ - ev_tstamp (*reschedule_cb)(struct ev_periodic *w, ev_tstamp now) EV_NOEXCEPT; /* rw */ -} ev_periodic; - -/* invoked when the given signal has been received */ -/* revent EV_SIGNAL */ -typedef struct ev_signal -{ - EV_WATCHER_LIST (ev_signal) - - int signum; /* ro */ -} ev_signal; - -/* invoked when sigchld is received and waitpid indicates the given pid */ -/* revent EV_CHILD */ -/* does not support priorities */ -typedef struct ev_child -{ - EV_WATCHER_LIST (ev_child) - - int flags; /* private */ - int pid; /* ro */ - int rpid; /* rw, holds the received pid */ - int rstatus; /* rw, holds the exit status, use the macros from sys/wait.h */ -} ev_child; - -#if EV_STAT_ENABLE -/* st_nlink = 0 means missing file or other error */ -# ifdef _WIN32 -typedef struct _stati64 ev_statdata; -# else -typedef struct stat ev_statdata; -# endif - -/* invoked each time the stat data changes for a given path */ -/* revent EV_STAT */ -typedef struct ev_stat -{ - EV_WATCHER_LIST (ev_stat) - - ev_timer timer; /* private */ - ev_tstamp interval; /* ro */ - const char *path; /* ro */ - ev_statdata prev; /* ro */ - ev_statdata attr; /* ro */ - - int wd; /* wd for inotify, fd for kqueue */ -} ev_stat; -#endif - -/* invoked when the nothing else needs to be done, keeps the process from blocking */ -/* revent EV_IDLE */ -typedef struct ev_idle -{ - EV_WATCHER (ev_idle) -} ev_idle; - -/* invoked for each run of the mainloop, just before the blocking call */ -/* you can still change events in any way you like */ -/* revent EV_PREPARE */ -typedef struct ev_prepare -{ - EV_WATCHER (ev_prepare) -} ev_prepare; - -/* invoked for each run of the mainloop, just after the blocking call */ -/* revent EV_CHECK */ -typedef struct ev_check -{ - EV_WATCHER (ev_check) -} ev_check; - -/* the callback gets invoked before check in the child process when a fork was detected */ -/* revent EV_FORK */ -typedef struct ev_fork -{ - EV_WATCHER (ev_fork) -} ev_fork; - -/* is invoked just before the loop gets destroyed */ -/* revent EV_CLEANUP */ -typedef struct ev_cleanup -{ - EV_WATCHER (ev_cleanup) -} ev_cleanup; - -#if EV_EMBED_ENABLE -/* used to embed an event loop inside another */ -/* the callback gets invoked when the event loop has handled events, and can be 0 */ -typedef struct ev_embed -{ - EV_WATCHER (ev_embed) - - struct ev_loop *other; /* ro */ -#undef EV_IO_ENABLE -#define EV_IO_ENABLE 1 - ev_io io; /* private */ -#undef EV_PREPARE_ENABLE -#define EV_PREPARE_ENABLE 1 - ev_prepare prepare; /* private */ - ev_check check; /* unused */ - ev_timer timer; /* unused */ - ev_periodic periodic; /* unused */ - ev_idle idle; /* unused */ - ev_fork fork; /* private */ - ev_cleanup cleanup; /* unused */ -} ev_embed; -#endif - -#if EV_ASYNC_ENABLE -/* invoked when somebody calls ev_async_send on the watcher */ -/* revent EV_ASYNC */ -typedef struct ev_async -{ - EV_WATCHER (ev_async) - - EV_ATOMIC_T sent; /* private */ -} ev_async; - -# define ev_async_pending(w) (+(w)->sent) -#endif - -/* the presence of this union forces similar struct layout */ -union ev_any_watcher -{ - struct ev_watcher w; - struct ev_watcher_list wl; - - struct ev_io io; - struct ev_timer timer; - struct ev_periodic periodic; - struct ev_signal signal; - struct ev_child child; -#if EV_STAT_ENABLE - struct ev_stat stat; -#endif -#if EV_IDLE_ENABLE - struct ev_idle idle; -#endif - struct ev_prepare prepare; - struct ev_check check; -#if EV_FORK_ENABLE - struct ev_fork fork; -#endif -#if EV_CLEANUP_ENABLE - struct ev_cleanup cleanup; -#endif -#if EV_EMBED_ENABLE - struct ev_embed embed; -#endif -#if EV_ASYNC_ENABLE - struct ev_async async; -#endif -}; - -/* flag bits for ev_default_loop and ev_loop_new */ -enum { - /* the default */ - EVFLAG_AUTO = 0x00000000U, /* not quite a mask */ - /* flag bits */ - EVFLAG_NOENV = 0x01000000U, /* do NOT consult environment */ - EVFLAG_FORKCHECK = 0x02000000U, /* check for a fork in each iteration */ - /* debugging/feature disable */ - EVFLAG_NOINOTIFY = 0x00100000U, /* do not attempt to use inotify */ -#if EV_COMPAT3 - EVFLAG_NOSIGFD = 0, /* compatibility to pre-3.9 */ -#endif - EVFLAG_SIGNALFD = 0x00200000U, /* attempt to use signalfd */ - EVFLAG_NOSIGMASK = 0x00400000U, /* avoid modifying the signal mask */ - EVFLAG_NOTIMERFD = 0x00800000U /* avoid creating a timerfd */ -}; - -/* method bits to be ored together */ -enum { - EVBACKEND_SELECT = 0x00000001U, /* available just about anywhere */ - EVBACKEND_POLL = 0x00000002U, /* !win, !aix, broken on osx */ - EVBACKEND_EPOLL = 0x00000004U, /* linux */ - EVBACKEND_KQUEUE = 0x00000008U, /* bsd, broken on osx */ - EVBACKEND_DEVPOLL = 0x00000010U, /* solaris 8 */ /* NYI */ - EVBACKEND_PORT = 0x00000020U, /* solaris 10 */ - EVBACKEND_LINUXAIO = 0x00000040U, /* linux AIO, 4.19+ */ - EVBACKEND_IOURING = 0x00000080U, /* linux io_uring, 5.1+ */ - EVBACKEND_ALL = 0x000000FFU, /* all known backends */ - EVBACKEND_MASK = 0x0000FFFFU /* all future backends */ -}; - -#if EV_PROTOTYPES -EV_API_DECL int ev_version_major (void) EV_NOEXCEPT; -EV_API_DECL int ev_version_minor (void) EV_NOEXCEPT; - -EV_API_DECL unsigned int ev_supported_backends (void) EV_NOEXCEPT; -EV_API_DECL unsigned int ev_recommended_backends (void) EV_NOEXCEPT; -EV_API_DECL unsigned int ev_embeddable_backends (void) EV_NOEXCEPT; - -EV_API_DECL ev_tstamp ev_time (void) EV_NOEXCEPT; -EV_API_DECL void ev_sleep (ev_tstamp delay) EV_NOEXCEPT; /* sleep for a while */ - -/* Sets the allocation function to use, works like realloc. - * It is used to allocate and free memory. - * If it returns zero when memory needs to be allocated, the library might abort - * or take some potentially destructive action. - * The default is your system realloc function. - */ -EV_API_DECL void ev_set_allocator (void *(*cb)(void *ptr, long size) EV_NOEXCEPT) EV_NOEXCEPT; - -/* set the callback function to call on a - * retryable syscall error - * (such as failed select, poll, epoll_wait) - */ -EV_API_DECL void ev_set_syserr_cb (void (*cb)(const char *msg) EV_NOEXCEPT) EV_NOEXCEPT; - -#if EV_MULTIPLICITY - -/* the default loop is the only one that handles signals and child watchers */ -/* you can call this as often as you like */ -EV_API_DECL struct ev_loop *ev_default_loop (unsigned int flags EV_CPP (= 0)) EV_NOEXCEPT; - -#ifdef EV_API_STATIC -EV_API_DECL struct ev_loop *ev_default_loop_ptr; -#endif - -EV_INLINE struct ev_loop * -ev_default_loop_uc_ (void) EV_NOEXCEPT -{ - extern struct ev_loop *ev_default_loop_ptr; - - return ev_default_loop_ptr; -} - -EV_INLINE int -ev_is_default_loop (EV_P) EV_NOEXCEPT -{ - return EV_A == EV_DEFAULT_UC; -} - -/* create and destroy alternative loops that don't handle signals */ -EV_API_DECL struct ev_loop *ev_loop_new (unsigned int flags EV_CPP (= 0)) EV_NOEXCEPT; - -EV_API_DECL ev_tstamp ev_now (EV_P) EV_NOEXCEPT; /* time w.r.t. timers and the eventloop, updated after each poll */ - -#else - -EV_API_DECL int ev_default_loop (unsigned int flags EV_CPP (= 0)) EV_NOEXCEPT; /* returns true when successful */ - -EV_API_DECL ev_tstamp ev_rt_now; - -EV_INLINE ev_tstamp -ev_now (void) EV_NOEXCEPT -{ - return ev_rt_now; -} - -/* looks weird, but ev_is_default_loop (EV_A) still works if this exists */ -EV_INLINE int -ev_is_default_loop (void) EV_NOEXCEPT -{ - return 1; -} - -#endif /* multiplicity */ - -/* destroy event loops, also works for the default loop */ -EV_API_DECL void ev_loop_destroy (EV_P); - -/* this needs to be called after fork, to duplicate the loop */ -/* when you want to re-use it in the child */ -/* you can call it in either the parent or the child */ -/* you can actually call it at any time, anywhere :) */ -EV_API_DECL void ev_loop_fork (EV_P) EV_NOEXCEPT; - -EV_API_DECL unsigned int ev_backend (EV_P) EV_NOEXCEPT; /* backend in use by loop */ - -EV_API_DECL void ev_now_update (EV_P) EV_NOEXCEPT; /* update event loop time */ - -#if EV_WALK_ENABLE -/* walk (almost) all watchers in the loop of a given type, invoking the */ -/* callback on every such watcher. The callback might stop the watcher, */ -/* but do nothing else with the loop */ -EV_API_DECL void ev_walk (EV_P_ int types, void (*cb)(EV_P_ int type, void *w)) EV_NOEXCEPT; -#endif - -#endif /* prototypes */ - -/* ev_run flags values */ -enum { - EVRUN_NOWAIT = 1, /* do not block/wait */ - EVRUN_ONCE = 2 /* block *once* only */ -}; - -/* ev_break how values */ -enum { - EVBREAK_CANCEL = 0, /* undo unloop */ - EVBREAK_ONE = 1, /* unloop once */ - EVBREAK_ALL = 2 /* unloop all loops */ -}; - -#if EV_PROTOTYPES -EV_API_DECL int ev_run (EV_P_ int flags EV_CPP (= 0)); -EV_API_DECL void ev_break (EV_P_ int how EV_CPP (= EVBREAK_ONE)) EV_NOEXCEPT; /* break out of the loop */ - -/* - * ref/unref can be used to add or remove a refcount on the mainloop. every watcher - * keeps one reference. if you have a long-running watcher you never unregister that - * should not keep ev_loop from running, unref() after starting, and ref() before stopping. - */ -EV_API_DECL void ev_ref (EV_P) EV_NOEXCEPT; -EV_API_DECL void ev_unref (EV_P) EV_NOEXCEPT; - -/* - * convenience function, wait for a single event, without registering an event watcher - * if timeout is < 0, do wait indefinitely - */ -EV_API_DECL void ev_once (EV_P_ int fd, int events, ev_tstamp timeout, void (*cb)(int revents, void *arg), void *arg) EV_NOEXCEPT; - -EV_API_DECL void ev_invoke_pending (EV_P); /* invoke all pending watchers */ - -# if EV_FEATURE_API -EV_API_DECL unsigned int ev_iteration (EV_P) EV_NOEXCEPT; /* number of loop iterations */ -EV_API_DECL unsigned int ev_depth (EV_P) EV_NOEXCEPT; /* #ev_loop enters - #ev_loop leaves */ -EV_API_DECL void ev_verify (EV_P) EV_NOEXCEPT; /* abort if loop data corrupted */ - -EV_API_DECL void ev_set_io_collect_interval (EV_P_ ev_tstamp interval) EV_NOEXCEPT; /* sleep at least this time, default 0 */ -EV_API_DECL void ev_set_timeout_collect_interval (EV_P_ ev_tstamp interval) EV_NOEXCEPT; /* sleep at least this time, default 0 */ - -/* advanced stuff for threading etc. support, see docs */ -EV_API_DECL void ev_set_userdata (EV_P_ void *data) EV_NOEXCEPT; -EV_API_DECL void *ev_userdata (EV_P) EV_NOEXCEPT; -typedef void (*ev_loop_callback)(EV_P); -EV_API_DECL void ev_set_invoke_pending_cb (EV_P_ ev_loop_callback invoke_pending_cb) EV_NOEXCEPT; -/* C++ doesn't allow the use of the ev_loop_callback typedef here, so we need to spell it out */ -EV_API_DECL void ev_set_loop_release_cb (EV_P_ void (*release)(EV_P) EV_NOEXCEPT, void (*acquire)(EV_P) EV_NOEXCEPT) EV_NOEXCEPT; - -EV_API_DECL unsigned int ev_pending_count (EV_P) EV_NOEXCEPT; /* number of pending events, if any */ - -/* - * stop/start the timer handling. - */ -EV_API_DECL void ev_suspend (EV_P) EV_NOEXCEPT; -EV_API_DECL void ev_resume (EV_P) EV_NOEXCEPT; -#endif - -#endif - -/* these may evaluate ev multiple times, and the other arguments at most once */ -/* either use ev_init + ev_TYPE_set, or the ev_TYPE_init macro, below, to first initialise a watcher */ -#define ev_init(ev,cb_) do { \ - ((ev_watcher *)(void *)(ev))->active = \ - ((ev_watcher *)(void *)(ev))->pending = 0; \ - ev_set_priority ((ev), 0); \ - ev_set_cb ((ev), cb_); \ -} while (0) - -#define ev_io_modify(ev,events_) do { (ev)->events = (ev)->events & EV__IOFDSET | (events_); } while (0) -#define ev_io_set(ev,fd_,events_) do { (ev)->fd = (fd_); (ev)->events = (events_) | EV__IOFDSET; } while (0) -#define ev_timer_set(ev,after_,repeat_) do { ((ev_watcher_time *)(ev))->at = (after_); (ev)->repeat = (repeat_); } while (0) -#define ev_periodic_set(ev,ofs_,ival_,rcb_) do { (ev)->offset = (ofs_); (ev)->interval = (ival_); (ev)->reschedule_cb = (rcb_); } while (0) -#define ev_signal_set(ev,signum_) do { (ev)->signum = (signum_); } while (0) -#define ev_child_set(ev,pid_,trace_) do { (ev)->pid = (pid_); (ev)->flags = !!(trace_); } while (0) -#define ev_stat_set(ev,path_,interval_) do { (ev)->path = (path_); (ev)->interval = (interval_); (ev)->wd = -2; } while (0) -#define ev_idle_set(ev) /* nop, yes, this is a serious in-joke */ -#define ev_prepare_set(ev) /* nop, yes, this is a serious in-joke */ -#define ev_check_set(ev) /* nop, yes, this is a serious in-joke */ -#define ev_embed_set(ev,other_) do { (ev)->other = (other_); } while (0) -#define ev_fork_set(ev) /* nop, yes, this is a serious in-joke */ -#define ev_cleanup_set(ev) /* nop, yes, this is a serious in-joke */ -#define ev_async_set(ev) /* nop, yes, this is a serious in-joke */ - -#define ev_io_init(ev,cb,fd,events) do { ev_init ((ev), (cb)); ev_io_set ((ev),(fd),(events)); } while (0) -#define ev_timer_init(ev,cb,after,repeat) do { ev_init ((ev), (cb)); ev_timer_set ((ev),(after),(repeat)); } while (0) -#define ev_periodic_init(ev,cb,ofs,ival,rcb) do { ev_init ((ev), (cb)); ev_periodic_set ((ev),(ofs),(ival),(rcb)); } while (0) -#define ev_signal_init(ev,cb,signum) do { ev_init ((ev), (cb)); ev_signal_set ((ev), (signum)); } while (0) -#define ev_child_init(ev,cb,pid,trace) do { ev_init ((ev), (cb)); ev_child_set ((ev),(pid),(trace)); } while (0) -#define ev_stat_init(ev,cb,path,interval) do { ev_init ((ev), (cb)); ev_stat_set ((ev),(path),(interval)); } while (0) -#define ev_idle_init(ev,cb) do { ev_init ((ev), (cb)); ev_idle_set ((ev)); } while (0) -#define ev_prepare_init(ev,cb) do { ev_init ((ev), (cb)); ev_prepare_set ((ev)); } while (0) -#define ev_check_init(ev,cb) do { ev_init ((ev), (cb)); ev_check_set ((ev)); } while (0) -#define ev_embed_init(ev,cb,other) do { ev_init ((ev), (cb)); ev_embed_set ((ev),(other)); } while (0) -#define ev_fork_init(ev,cb) do { ev_init ((ev), (cb)); ev_fork_set ((ev)); } while (0) -#define ev_cleanup_init(ev,cb) do { ev_init ((ev), (cb)); ev_cleanup_set ((ev)); } while (0) -#define ev_async_init(ev,cb) do { ev_init ((ev), (cb)); ev_async_set ((ev)); } while (0) - -#define ev_is_pending(ev) (0 + ((ev_watcher *)(void *)(ev))->pending) /* ro, true when watcher is waiting for callback invocation */ -#define ev_is_active(ev) (0 + ((ev_watcher *)(void *)(ev))->active) /* ro, true when the watcher has been started */ - -#define ev_cb_(ev) (ev)->cb /* rw */ -#define ev_cb(ev) (memmove (&ev_cb_ (ev), &((ev_watcher *)(ev))->cb, sizeof (ev_cb_ (ev))), (ev)->cb) - -#if EV_MINPRI == EV_MAXPRI -# define ev_priority(ev) ((ev), EV_MINPRI) -# define ev_set_priority(ev,pri) ((ev), (pri)) -#else -# define ev_priority(ev) (+(((ev_watcher *)(void *)(ev))->priority)) -# define ev_set_priority(ev,pri) ( (ev_watcher *)(void *)(ev))->priority = (pri) -#endif - -#define ev_periodic_at(ev) (+((ev_watcher_time *)(ev))->at) - -#ifndef ev_set_cb -/* memmove is used here to avoid strict aliasing violations, and hopefully is optimized out by any reasonable compiler */ -# define ev_set_cb(ev,cb_) (ev_cb_ (ev) = (cb_), memmove (&((ev_watcher *)(ev))->cb, &ev_cb_ (ev), sizeof (ev_cb_ (ev)))) -#endif - -/* stopping (enabling, adding) a watcher does nothing if it is already running */ -/* stopping (disabling, deleting) a watcher does nothing unless it's already running */ -#if EV_PROTOTYPES - -/* feeds an event into a watcher as if the event actually occurred */ -/* accepts any ev_watcher type */ -EV_API_DECL void ev_feed_event (EV_P_ void *w, int revents) EV_NOEXCEPT; -EV_API_DECL void ev_feed_fd_event (EV_P_ int fd, int revents) EV_NOEXCEPT; -#if EV_SIGNAL_ENABLE -EV_API_DECL void ev_feed_signal (int signum) EV_NOEXCEPT; -EV_API_DECL void ev_feed_signal_event (EV_P_ int signum) EV_NOEXCEPT; -#endif -EV_API_DECL void ev_invoke (EV_P_ void *w, int revents); -EV_API_DECL int ev_clear_pending (EV_P_ void *w) EV_NOEXCEPT; - -EV_API_DECL void ev_io_start (EV_P_ ev_io *w) EV_NOEXCEPT; -EV_API_DECL void ev_io_stop (EV_P_ ev_io *w) EV_NOEXCEPT; - -EV_API_DECL void ev_timer_start (EV_P_ ev_timer *w) EV_NOEXCEPT; -EV_API_DECL void ev_timer_stop (EV_P_ ev_timer *w) EV_NOEXCEPT; -/* stops if active and no repeat, restarts if active and repeating, starts if inactive and repeating */ -EV_API_DECL void ev_timer_again (EV_P_ ev_timer *w) EV_NOEXCEPT; -/* return remaining time */ -EV_API_DECL ev_tstamp ev_timer_remaining (EV_P_ ev_timer *w) EV_NOEXCEPT; - -#if EV_PERIODIC_ENABLE -EV_API_DECL void ev_periodic_start (EV_P_ ev_periodic *w) EV_NOEXCEPT; -EV_API_DECL void ev_periodic_stop (EV_P_ ev_periodic *w) EV_NOEXCEPT; -EV_API_DECL void ev_periodic_again (EV_P_ ev_periodic *w) EV_NOEXCEPT; -#endif - -/* only supported in the default loop */ -#if EV_SIGNAL_ENABLE -EV_API_DECL void ev_signal_start (EV_P_ ev_signal *w) EV_NOEXCEPT; -EV_API_DECL void ev_signal_stop (EV_P_ ev_signal *w) EV_NOEXCEPT; -#endif - -/* only supported in the default loop */ -# if EV_CHILD_ENABLE -EV_API_DECL void ev_child_start (EV_P_ ev_child *w) EV_NOEXCEPT; -EV_API_DECL void ev_child_stop (EV_P_ ev_child *w) EV_NOEXCEPT; -# endif - -# if EV_STAT_ENABLE -EV_API_DECL void ev_stat_start (EV_P_ ev_stat *w) EV_NOEXCEPT; -EV_API_DECL void ev_stat_stop (EV_P_ ev_stat *w) EV_NOEXCEPT; -EV_API_DECL void ev_stat_stat (EV_P_ ev_stat *w) EV_NOEXCEPT; -# endif - -# if EV_IDLE_ENABLE -EV_API_DECL void ev_idle_start (EV_P_ ev_idle *w) EV_NOEXCEPT; -EV_API_DECL void ev_idle_stop (EV_P_ ev_idle *w) EV_NOEXCEPT; -# endif - -#if EV_PREPARE_ENABLE -EV_API_DECL void ev_prepare_start (EV_P_ ev_prepare *w) EV_NOEXCEPT; -EV_API_DECL void ev_prepare_stop (EV_P_ ev_prepare *w) EV_NOEXCEPT; -#endif - -#if EV_CHECK_ENABLE -EV_API_DECL void ev_check_start (EV_P_ ev_check *w) EV_NOEXCEPT; -EV_API_DECL void ev_check_stop (EV_P_ ev_check *w) EV_NOEXCEPT; -#endif - -# if EV_FORK_ENABLE -EV_API_DECL void ev_fork_start (EV_P_ ev_fork *w) EV_NOEXCEPT; -EV_API_DECL void ev_fork_stop (EV_P_ ev_fork *w) EV_NOEXCEPT; -# endif - -# if EV_CLEANUP_ENABLE -EV_API_DECL void ev_cleanup_start (EV_P_ ev_cleanup *w) EV_NOEXCEPT; -EV_API_DECL void ev_cleanup_stop (EV_P_ ev_cleanup *w) EV_NOEXCEPT; -# endif - -# if EV_EMBED_ENABLE -/* only supported when loop to be embedded is in fact embeddable */ -EV_API_DECL void ev_embed_start (EV_P_ ev_embed *w) EV_NOEXCEPT; -EV_API_DECL void ev_embed_stop (EV_P_ ev_embed *w) EV_NOEXCEPT; -EV_API_DECL void ev_embed_sweep (EV_P_ ev_embed *w) EV_NOEXCEPT; -# endif - -# if EV_ASYNC_ENABLE -EV_API_DECL void ev_async_start (EV_P_ ev_async *w) EV_NOEXCEPT; -EV_API_DECL void ev_async_stop (EV_P_ ev_async *w) EV_NOEXCEPT; -EV_API_DECL void ev_async_send (EV_P_ ev_async *w) EV_NOEXCEPT; -# endif - -#if EV_COMPAT3 - #define EVLOOP_NONBLOCK EVRUN_NOWAIT - #define EVLOOP_ONESHOT EVRUN_ONCE - #define EVUNLOOP_CANCEL EVBREAK_CANCEL - #define EVUNLOOP_ONE EVBREAK_ONE - #define EVUNLOOP_ALL EVBREAK_ALL - #if EV_PROTOTYPES - EV_INLINE void ev_loop (EV_P_ int flags) { ev_run (EV_A_ flags); } - EV_INLINE void ev_unloop (EV_P_ int how ) { ev_break (EV_A_ how ); } - EV_INLINE void ev_default_destroy (void) { ev_loop_destroy (EV_DEFAULT); } - EV_INLINE void ev_default_fork (void) { ev_loop_fork (EV_DEFAULT); } - #if EV_FEATURE_API - EV_INLINE unsigned int ev_loop_count (EV_P) { return ev_iteration (EV_A); } - EV_INLINE unsigned int ev_loop_depth (EV_P) { return ev_depth (EV_A); } - EV_INLINE void ev_loop_verify (EV_P) { ev_verify (EV_A); } - #endif - #endif -#else - typedef struct ev_loop ev_loop; -#endif - -#endif - -EV_CPP(}) - -#endif - diff --git a/client/3rd/ShadowSocks/ShadowSocks/libev/armv7s/include/event.h b/client/3rd/ShadowSocks/ShadowSocks/libev/armv7s/include/event.h deleted file mode 100644 index aa81928f..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libev/armv7s/include/event.h +++ /dev/null @@ -1,177 +0,0 @@ -/* - * libevent compatibility header, only core events supported - * - * Copyright (c) 2007,2008,2010,2012 Marc Alexander Lehmann - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modifica- - * tion, 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. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MER- - * CHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO - * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPE- - * CIAL, 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 OTH- - * ERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - * OF THE POSSIBILITY OF SUCH DAMAGE. - * - * Alternatively, the contents of this file may be used under the terms of - * the GNU General Public License ("GPL") version 2 or any later version, - * in which case the provisions of the GPL are applicable instead of - * the above. If you wish to allow the use of your version of this file - * only under the terms of the GPL and not to allow others to use your - * version of this file under the BSD license, indicate your decision - * by deleting the provisions above and replace them with the notice - * and other provisions required by the GPL. If you do not delete the - * provisions above, a recipient may use your version of this file under - * either the BSD or the GPL. - */ - -#ifndef EVENT_H_ -#define EVENT_H_ - -#ifdef EV_H -# include EV_H -#else -# include "ev.h" -#endif - -#ifndef EVLOOP_NONBLOCK -# define EVLOOP_NONBLOCK EVRUN_NOWAIT -#endif -#ifndef EVLOOP_ONESHOT -# define EVLOOP_ONESHOT EVRUN_ONCE -#endif -#ifndef EV_TIMEOUT -# define EV_TIMEOUT EV_TIMER -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -/* we need sys/time.h for struct timeval only */ -#if !defined (WIN32) || defined (__MINGW32__) -# include /* mingw seems to need this, for whatever reason */ -# include -#endif - -struct event_base; - -#define EVLIST_TIMEOUT 0x01 -#define EVLIST_INSERTED 0x02 -#define EVLIST_SIGNAL 0x04 -#define EVLIST_ACTIVE 0x08 -#define EVLIST_INTERNAL 0x10 -#define EVLIST_INIT 0x80 - -typedef void (*event_callback_fn)(int, short, void *); - -struct event -{ - /* libev watchers we map onto */ - union { - struct ev_io io; - struct ev_signal sig; - } iosig; - struct ev_timer to; - - /* compatibility slots */ - struct event_base *ev_base; - event_callback_fn ev_callback; - void *ev_arg; - int ev_fd; - int ev_pri; - int ev_res; - int ev_flags; - short ev_events; -}; - -event_callback_fn event_get_callback (const struct event *ev); - -#define EV_READ EV_READ -#define EV_WRITE EV_WRITE -#define EV_PERSIST 0x10 -#define EV_ET 0x20 /* nop */ - -#define EVENT_SIGNAL(ev) ((int) (ev)->ev_fd) -#define EVENT_FD(ev) ((int) (ev)->ev_fd) - -#define event_initialized(ev) ((ev)->ev_flags & EVLIST_INIT) - -#define evtimer_add(ev,tv) event_add (ev, tv) -#define evtimer_set(ev,cb,data) event_set (ev, -1, 0, cb, data) -#define evtimer_del(ev) event_del (ev) -#define evtimer_pending(ev,tv) event_pending (ev, EV_TIMEOUT, tv) -#define evtimer_initialized(ev) event_initialized (ev) - -#define timeout_add(ev,tv) evtimer_add (ev, tv) -#define timeout_set(ev,cb,data) evtimer_set (ev, cb, data) -#define timeout_del(ev) evtimer_del (ev) -#define timeout_pending(ev,tv) evtimer_pending (ev, tv) -#define timeout_initialized(ev) evtimer_initialized (ev) - -#define signal_add(ev,tv) event_add (ev, tv) -#define signal_set(ev,sig,cb,data) event_set (ev, sig, EV_SIGNAL | EV_PERSIST, cb, data) -#define signal_del(ev) event_del (ev) -#define signal_pending(ev,tv) event_pending (ev, EV_SIGNAL, tv) -#define signal_initialized(ev) event_initialized (ev) - -const char *event_get_version (void); -const char *event_get_method (void); - -void *event_init (void); -void event_base_free (struct event_base *base); - -#define EVLOOP_ONCE EVLOOP_ONESHOT -int event_loop (int); -int event_loopexit (struct timeval *tv); -int event_dispatch (void); - -#define _EVENT_LOG_DEBUG 0 -#define _EVENT_LOG_MSG 1 -#define _EVENT_LOG_WARN 2 -#define _EVENT_LOG_ERR 3 -typedef void (*event_log_cb)(int severity, const char *msg); -void event_set_log_callback(event_log_cb cb); - -void event_set (struct event *ev, int fd, short events, void (*cb)(int, short, void *), void *arg); -int event_once (int fd, short events, void (*cb)(int, short, void *), void *arg, struct timeval *tv); - -int event_add (struct event *ev, struct timeval *tv); -int event_del (struct event *ev); -void event_active (struct event *ev, int res, short ncalls); /* ncalls is being ignored */ - -int event_pending (struct event *ev, short, struct timeval *tv); - -int event_priority_init (int npri); -int event_priority_set (struct event *ev, int pri); - -struct event_base *event_base_new (void); -const char *event_base_get_method (const struct event_base *); -int event_base_set (struct event_base *base, struct event *ev); -int event_base_loop (struct event_base *base, int); -int event_base_loopexit (struct event_base *base, struct timeval *tv); -int event_base_dispatch (struct event_base *base); -int event_base_once (struct event_base *base, int fd, short events, void (*cb)(int, short, void *), void *arg, struct timeval *tv); -int event_base_priority_init (struct event_base *base, int fd); - -/* next line is different in the libevent+libev version */ -/*libevent-include*/ - -#ifdef __cplusplus -} -#endif - -#endif - diff --git a/client/3rd/ShadowSocks/ShadowSocks/libev/armv7s/lib/libev.a b/client/3rd/ShadowSocks/ShadowSocks/libev/armv7s/lib/libev.a deleted file mode 100644 index effb47a23037677a4ef0dc49f5df13e0fd8960c5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 37280 zcmbWg4_s7L`agc|Fdzadn7L%67c_UoKY^){Sq%e@q^9^M*UEwc#%7d%0sdXTEt<8g zmP@W%uIm=M)@oTXWv!SB6}nW`XK2wi{}kK0%8Jl1DRWg|zVGMUbBBx4XTQJSyf{4P zdCv2k^PK;G?>VtkY(?3Q2f~IY-Zef!?*1iCy8GTqN%u^gG*Ol(CM3c^bxur3m^5Jm zu)C84duCWh#<+QpKAbw$D$koecmC8=hF@q9{b#JaFJl7)946p60VfMc0>n38z-$4F z1zacK76D%u@UH^a33yh(3j+EC43Sj-2Mah(!21Q9EntR#%LH66;AR1L2>7mm2L$|5 zz*7RA7x1!x!3H(_TLhE^GzoZ*fMx;b3TPK_rGOg*+%DkT0v;9cD*?X|@Sg(yC}2P2 z38nKW0h0xsCt!(y&k6XlfNuy`DPXmLUkZ3yK(ByZ0`@Vg;r&d&(E{El;B*1!3uqHC zSHNckEC(!G$Jna^?h){?fd3=lc>#R_Mg*&JF#?ViaGHR>5HL%?A_1QlaI1iC3HVn5 zKNaxr0)8i8tAIfvYPdfW&;*!aU!GwrUX`DnQEbo8(W51{qLLnXK_N%8Y}rdS)~q7C zZ7HW_JM7s@Gl~O38ZLyg9nRdG9?mMRIp^AK`O6CR3;~Lcr6{8iAv^P*;z8!v7u%NQ zmSp4>2o^mdqp+k%a21v~xXqrIW!LMV;X+!VE9`bPo*d7yW#!s4M3jrUH;e7?#lGC0 zuci)17vDrFc0QGF%k36WalKqYkv_c^tEkY$nS)Tf6H}m?WB&4jrFQPMlUsYFinBm3 zNQfp@VlT3lI1BQ*Bqdr#j=i{~s9;q$fwbtx^6e`)l3x&j8OsWDY$a;o1^L;kMPy1w zcEK`{D24VSXF-lLJHz&r&8Y?$AazGeM-n;~7TF7JMf#|BQv^$qJ-Z+;55)kv&?8@p z?2Ea!MfT!ld8%SX%ha%o?Ijtu+}wg}TScdi|u-u;#I}=q9Q$|#F=L=SXT1WUM+(JQq!h}%L|My??j0S^FRx*)- zC3;4Is^w8QiqtAzR#;e2RB~fl6)!8MOydEQngL6ZF2~5BD5J=phb+|UoJ#A?LJb$e zEz8$(p-0@7qc|*9iy5rND1#Y!wk0Af0u*PyNa^^r!J&Ho9=h)9#x)#T5o0S zO^gMYk(FvJ85vo{G_KQr85ya`^OH494Y!n>VA6v zGBWaWGm2N`WfkPAUFi*R2}M4HLUs+(QZJ|F33+=bOe9$t26u)5Y?Q#yAl_+6IFgHo z8DnScW56WDx+F|38|lF5H%FL<0Jp*X9OkEfBjAr-7mY8~YfP^3GHF$6XlCKG6z_Xa zcVnd=6j;|)I;|lJAOmup{7zZe8SKE<(J8x4}#tu`yUouZtZVfXH9eb#$iZo ztO{#h8|=tSiCJnd&WyLtRm{V7whc0tS#CciI|@8~B&qpR$(r7@Bs8@~F_s$T&lLwd z)Wm{4haf3^wnS>KVd;u7Ci!BhWCm=x5bFq)nI}k*Gm9N(FZ{+D<&fH>i1(Xk4w!v$ zX2i8K5!YFp>&mYR!oQJHlf46iZc8<{`-}gO5_#`S*F7EN`ia77(yYuAbAXKsZg4C6 z5;j`us+mXHUpS3o5o~oUl?XL4^GVkrtH&96(P#*Ao2-dezwZVAawi*ix!!ZA`p3tA zD9&s`t!5E%Z`phU3qc{`Cyu%Lx?1i;nwUvUQYo_T|znzi+HR&)I&V@{mz3oE8fc z4kN+rhH)$9jQ*dI=zk;r*C^}d8l^OnY%jo8#%<@K$o(95_rPAGG)2`YmtxhlqY}VO z$e*?Akcu_2EZ*#4Yg4_oY0xoLNj<4BmOk~C`c&^W85FiMl{qq9r<5&BO86ZAQ@!hA zK}X3?M-GKuJ*CvJg>c`G^pP6;zM`&E%0Xezg?+oQFNVFGg_^?aPbnse#WK%W$i{G+ z3AS=(;BJweG7JfpVGKB4C5Mp!I>RgWC*O*+_P0So3qn#-&sf znCGf8(!O}{`RoQIhx^#3)G8}&waN=HIX3Bj#~l~ocO`=yeEMGbT&c|bT-ld-N|Cvb z-+(d#6cdaLY6AD=D^MrcK39@p5^SfGDV+K#sAf=7VWxnJHVJ<22X!VW=`d-a?&Z|C zL9GO3AIx4*_jBq_P!EDq1G690Eu8uas9QnV4zmT+3Qm0i)Lo$LhN%Fxj#JlydJGgd zOdU*lrkbaH+{m$5s=J4pJZ9#}+h3=!Otmf}^r&E5;Y4 z`0&$Pt+%4(Fj^NV#@l791$FI2r*yxs{t3mn(R0YHY>AW-Yw*8t8r6UZYp_-FjJYN| z8eJ96l=hQ0wbWRK8k#Kzsd-)hV(UC5^sXY;PRni9A@y0#u*@NjD?4>jHvYy z)`5=lX+{@wl^;rJw`OYPnmJP1H$_jPpD zqOGY_Vi3LzGr|_iwcOoj=<(JntM_5~)Asbj>Fpg+UwYeOE#COKNK^C@J^c?8F(&_w zSJo98V()C+{a)p@QjfWBut$i+tn0 zwV{EERnzRnFcxP(`jkg9S$?W>O7=6J8o|DgHDzm!TzQkzj~uRp2mqjJ=?t2EAywl?gfQW-f%nQT7j zVk7Ugnt5H>rFi-TxnH+1&$FdDPLo42t*+ngOrN@{UYeBWWMiATFJWy`*t)6TA{?`H zQb~<1xBL?JDN$zBwvUvP%1ltxK`jC`jZ-TXHX^inJ(Kb*`7c=(fLGU9Lne|y~zdM**;4y?*V;)iD$S}vtmZ9|ySJ*`>TZk6L-4Z;yz9l&Pa%<*j z8nYU{nb;_BK8C&h#6q-Y+x`123D&dqNS}Tl=zCv4lQm*Qo#MSaph*zML=QpVTLWAR z0$kMru3&IY0@n}eh$luYmiB}I*MtC<5nRK0td?NZ7;No7Y=JT&GSso&5>hWsF+sOk zel~_ijw#*`1L2)d)Kc-?fKO5Isp~5B6DjR4OoV&z|4EgsCO&dZX@6!AD8@CZV=`s< zdAWo7ij%IC_UWRhVRBlg**n4jF0?hFnPIj;a+%E_mw}&oCZKP@SSzU(|4oj{LrgYd zOi6jMwz403Unj=*{)AiN{Juk1L#)gceztq`*#8>aCSw$A@cj8&zec}r?^Wg)YznPc zWr85{XUIsVf1i>nJ>1V{D}${V@tS7VM_9|8QqnNfLtm$O$1I0#AhG0Pk~yT`@x(hSoR*=|@Stl3uWZ6tKTg_gkcnsd)gb7a;vLLXpDgY3 zV_`$9nBpB61RKhAviIwOe&58amUd5}#x*X$H9Np{0$g!d`AFqnb)+K2mMWJpVhMLf zPh)KuAI33xjuMv;ohnV9cgNLwba*1p+VcSCej%ONd=U@X@ zO*+CzmEwOG@^P7~0i$uV1MLyUEJi*{zT7&Uw?UPy)4xcou58WxqCrWQR)RAvz{xo0 zKDbfqRi|>b$nYa>Mnj8f^uE>{?n3f8Uyx=Ww3<1ky_Ld(+)FVSO>dn>Gs~?^&22UA6t^@NS{20fqqV%2drFJ^ zzT1@tS|h@#t=M-JagJi69!7dkk*tmrXn_&qKnt9F{6tHi8PH$`#pqUd5!M~F);SHj zW{y4z3C-R7oC{Nj&!}+42VoB^0)Q+q<=oe&~ zM-+AW{^qY(f;lttB^~*;06L}xbYuY?ryu`u$uC`VFD2ZbfK;G059ow6XV5e&ob(Pq zHRPWsTKe*}5YmQdcet77*PY}ee2-GK{dVaR%ZA^Xv%|^r@r%9BbCF53yjtH{r>NgKU;qI zwISawzJFp=+QcMzJ?dry#v&~K!OIEnplqOi&%Vs=_WM$i z+G}Yw5`jx7jQeP z#Hc9rOgdWR;La}JPEKQ{c0SJT@@?yq;ZoD%)>lK znS{KlP;sQmJIdX_6C~EWQQFxYZrF_YCm_9(B=^4!o+prETbX1sR;%@kV#eFpd#Q~z z?j3;^cnezKzqFaq9%CH+1x&L#HZge8uNpj=Fs7^2hSNM)Yr_HGg26m5#rymuv}foo zjn)Lm?)SH}gltSeoqfVhbE_`j#m*bY;@`Eb?lHG&XfaUBGn!hF%dI)1Da{@}-p~>P z>Q2nD7}f}Bgb(wUrlC68uWU7Mq!E9Y@2|atlC2Acp+*@4b^p8SqSmq*zE-xhr1cF7 zGyG&Vh01>1T1vCMqZd?PU+Bfxhi6n=pxL0h&e-K!eG|`XEvav1wQdN^HYsFUsifKB z%GONO=}c;K03)waE0h)f*H-q$<<^;;Qr3VGW^j}BwU)$YGhfT>@}=DrhTi`KhvWSa zIoaCfo6rm2CZUHqhm|HKeobwQHhb+|A5E7BuUOtac)`q5IHVW9H;i^)NI=Y}Mx>(k zVV?O4d=FoAf$X!CxC`1mOIzQqQMO{V!Kz(!>Nl`zyP;*P@6OqP5l;4kokFq0nrDqi^#% z!`!8Y=1&cM+j4^}O6Zid%(;p&LLG6DW;8Nw`Y6J>$@w8#u=~z7Itx6{N}-mA>b3Fb z28C9v_x;v7b?&L-d_{OtB#l8QnKPXgmdD+VPEaGI=A+W|Rm@WwbW2K#M+%zp^y;eP z$^_}Sk`y%~=7^G%xYn`|^3;Yr%P@k?ZFI_>Qr2iwYnjFSnyij0liN=|4I9Ru7Vj&= zVdG=Z9}QhT-*t<3Re(#|4X}9k1h_7P>)iF?7}6*d?Lu+K5n6L>u4BiQeUUqwL#5BL z+Suj$`uZO(SiEBcek~4!_&4F#?8{|yyL^YQ2VdD%1g)ct@NFi1OQ0AfZojb6aSP`0 zC#wq(SHtMt)rR34Gs80V>vPna(OiOg7AYo2>HF_s{5GxueGz-!5`PNgK8*M$Mc#`M zzonivA7xIblu1;yo>-kjzkn6EQ5f|eWy!0OF=DVh{d83WQWUK&QWWDkr08w%r#nSG zhb-RtfjDipX{k6PkUo(EyL|Jn8xbeS@i={dy%s*e&&1Og!mJND*{H+rJ(jEWhPFZM zgA3CgkGWV|Zr_a#o@+}n21nk7Zl~Fmx&moL`APbypOtD2=AoFI_L)H~>c^-9+L$N$ zG>sZ9&^a}h`Z~Wa(?815fK`aKmOBswj3brUbb_?v$UO4?O2i~65Rib(aM7f zG5O(|@k&L}j2KArxU4~3rbwe4|G1E@#Fk@}7jdxJHej%OM&vipW{5Ri8J_TW=y(}z zBh{|H-yqzC+cIZg%nCZ#oHZcIda0f@hFQ%@T={1T!)}1K#_IR2_QyFsfB!iAPgmk1 zcUUIWA6HTnA02uG?Z7s~g8YVD0&y7P2b=~Mg%yr=HYn(#CFs+IYRKwn%kYil>AG%c zj6z!M@gGOpH9#-5y$lY=YAoiaSf9o2s*HK5#rvq3;U%{p6mxEicU~YZrXnqz*Sd8b z0bLtf`tY&b!1pPp@ot16dOGrd3QBQm)PL9W)^8|BB+u@T$d`WZTEvLj1$AZEf4JMe zq`LA@l%SidX+@&1Bg*AQs8S#`VwPj~uwJFTxt7ls!&pX%7{)b_edVget zaxjusC;Oc3^8Hhhws!fx#Vq9@lNxC?T=M+k8jY}Nq<*rR=-4G-YcV4{gAsT#v|NT& zByCm5u+`#yMzlM99eo|4Lk!hHm1$A0tF`i~x*J*z9}tv-Xy+M3X-mATe}9}Sp$U;ibWlF^Yr7$AV+UeWqXQnTeq|&|(A0YkvY&-j(z7L%JPw@6M zq;xP+x|{Mk+!Gy}rk+*g(pyo#4@M5Q9#?AQbr<^@)?SQ|qEg0N`__Mey0Fm_T))m@ ztUiuCjnb*J-A9zP#@CgZ39l=&42?G_9IGWWxuVC#nRT@izBu+ zEe_x6c*?NV^i<5&BT6YdqO7lwr5D3kXv%ib+^iqCUV-f-i-2u2Y>g}&wioL^ztCM{c3zhq<*r!k z9F(*q7cVsl)T2@<8r0EUiqsxfYmunbCt);P=Ac~~KDxtv9iuy}8wc|_@_JiHn-q#O z0c($ArA&gK<&uf-)3#r$aDYduR|;dLEAJG(YzaPvda8^xtF4A~Wq*<6Fv=;&@t^y5 zfOoC*v9d^N;aby3(eImf-Q-Ame~-g><;@~P;#`bkjNqzQ)+9>zeT@H)D#Od)au}MQ zHT(|eMuKo|q*O{#r1H&5d|L$TK-si!3y zC8fn5uN}u;3uuYYT0+hsU9|D}%*sQ-SB_!qy9GUEr|+vSq#oyM)ur+e*m-zddadN|QFKp}gwWX*bttH`i$nblQcmb_<;pGn(pwn)y)9#yes^~?hG^d2w!8Zq~Jg6;T3blaFa;yVId3F!D-_1sz zx5Zk`-h9z^p(QKWndQa`ket0%&dkx^?J{pKhm4xUz$b{xPu@pRfT3_XA~=X7g4=ANgq+I$-0{d8qyZ>!B_Hhh9h=Bv#) zPBy0JYV&DjcltuCx=WK5Og&YP5Mt*}O}F-|uV@ZqUtlE&>&{5K`#Q9+KdldMq_9}? z2CNx{Va=%1H@Fk7(!VdL^`26h#s@pv>OyE8bfPj}*%zVi7LZ@JcF<`fI!A%@s_t1{ z_VMzvkC&HwuVTK3a$pz)Fki0YeERf0u5_nZ9a7BAQ_Ou+iq-X!Vp806 z8@uxT)19J@QhBEp9IRxF-H7vc`yJ*>(f3Vp{zHi<#W@FgW^5 z_5>ZGzP*!avVDX)(zoFVdULkbjMa!HTRP^aUA{v9DAZ25U{>ZPNN8iMP}>Js3#74q zF!uJ;bs^eceXgb7MjF?ca+3xfo$!p1Fs@t@6F|l$h=CH$uqK9K07fqfTzpp}ww8U-n0| zi{0tVxX$F#L+V=3S~@G!Cm8z!`mAR}#8<6YN!lXHq zTo2pm{2gC&N0^1zr3VUQTI;o)QCfi-ie2wu>o&_k_aJB(f)j?xw2L|3fKyUqu2%F3 zIZhO`oCcx{zv|KP1cNf(uWdv%=n5Z(# zU1uBkS-DQ%E7V3*~)VtW0eqHi>j5RQKAwL;|k-}QW&}-&*(%G1)m!g+qZvuNrE9(zoW%0$9AUavf z*J;0Nd0cn0)QJ7S?dZc}pv8z-=#>aR8qdbg}3>b+;yMqIDz;lT9Q=i3JZP~P47dm~nUSkfUsnwnA zeODWWdvcZYkTv04U8nCj=3rx@(qeS!f9n5#`oDu#(Iox#0`u5AnP*w2I&ap_=~C&_ z&fB>a8RcOFUs)T0m9<;3eh?!CH9w2C4X0U^LAkOLxky&}zrbS6N<<7+!C;IrYPmCB zDMw2j6Ez5VelOM(V#u$=?=Db1O!nR;))Sa1**jjGSBkEda9%Fd%Hj=fIzb#ct<(4G ztDU~*uybCSfSur=$B_e})$s2?_iF7n%WU@@s4ujSJ;=7nG6Q8d5_Qd#$;KJ5wrG?h zk%JMor?Dmy5oHFwK?#K}5ooC&Mn7W2ipZo=T6avIno|F;i%wPrdklu;ix$N5C|g@P z4DylK>+_FKR!lM^qi8KMB5ISRx*8mYACd1L2j@Aet8p?o^5gVJ5Q0%UjQMnARLw%P znVDLOY$ytClY)p&_Zr|mm_3sVLkNoa;^-sv110BXI>yd)Ss8H~3 z1+P)sbAi`ezCLfc6n(p!*P!Hj3Xk;qu4Qt#11l(id}WKyW=FP0#&`PurKt7f>5o3Z zTz}lzTi*viR^MZ>4r#P`%F?PrCuzPQHdv3n{P$ZL*M{8LAl;wni1gfMK<>mvdSV7d zR~yDte>~C8#-6LE79VE~Jj<|OTQ=meA3jEB!H4ptuQ`$KH z4}8ssO29tsxeYnZ?o?~z5yn;(x^N~0shXuo38D3!z9+e6LC}m&RQ^nnCer%zbC!Rf zuEbf=eR7s-&QP_yePS4>7{{=9j4yGP%CNufLU*a_J_-J+D*|KRpwK#;vZS$Dm+u8W zMzf$tScg#ot!Ym{S@ekA2+{HeZ?l-(F=*vy^_4usm=tHY#xTZbQf2d;VMEVirWbi! zQP>=1q-?nu7WD5vq1ADK$;wFVtBj0Hz8Ge}JW9^ExW4Gg>H=Uhzm9+o$hK)>p2xc9+bhqHQwmm2eCw?R8RP`x^#r~efTRVK4 z{HGKJv<{B_8rWsRWN=7k$?z8Y9UI=^`=vkFdJ66Se|UMm|18NDy-z2UShHpDY>yN! zO;-Kwh{U?HS=x*-Uiu>!jqGO_{|^fdzZUAD)B9AaO%^KC<6R-mp{$~9n3RsveYA5o zdVpy39{;JAACR`O_!IR;T?iv7wIQXlW} zv&t)5GbFb(qEBNyMrX<1UnQD{(3#NGzRBJ~QJ+E_M_sc$hH#H_H{!-j{p$z05}v8) z6XrgugjP<>I;xDQFr%zu*FUSncNhP1p-G&KquiukK&wp&r?EG(lFqiP{ooNPY}El* z|ED)SJ$;qMvlhEr>u%bE2}e&6*n`3N9JO-dbCz#UhoL2Mz^^Yj7vAs}Ywl1iKouB3#Y01{7J3pE4`sXh);5l&|d>tp@DqjTq3+ItMF} z!KdUU(_?mK(OP-sp&2o;ON?@d??jiJwPT5wuNZcgBU)WV5|-1W}aB^T<$yyw_`A8d*!(oJl}WjgxhYI24ipj z+z%di=QD6$4|Akfo)qvL?tBdHnJ@=?<*|ZiZ|5YqPk}kwE6+^uZ0j5d_h^_yz4FWf zPg!RxK7zUov$t2C1>jlU`8nL(FgtqXc^o`Boo|pIFq?bfnSFUNc;X1M@M=jsDEOoDH6^POrq6 z0^{t3$J~A=c$AK>;NAd})GN<$@SN{>6YiBTXJBp&%iR7^QHQUggUZDVaQ{oMI*$X- zCmlik7;}Ip9Pnm;en4229l7)^9(bMxypbo_JJrzPd$ohgg$$ley@ZwQof+4G9`wCF zjN!W)Rt0#oKd)Fie5*UI!|fz^4ET8OMxKrE#o58CH^S|AFn{cY=Q;5F0z6N_tpH|4 zFFX%{XDWDJhTE$!yL#by8a#J{=S{e+hS}Q-&noc5g6Da-Er9t3X2K|ZAGe&oiKQ=! z@nvZ?Q@<6?&M%Q4xL+Qd$QI{hJ8bz+;k)IPMA1+%FjHKvGt0hwvYc;!3g5ynx5HI- z<_CC+O*yU`@CnU#0-KClI0=8TjYVvT4OA`TqOmM4dd?@|?wa6s(+O zFTrgE`2l}y`8nJp_+c`^7w8v1YQ?Cr4?qasI7c!5xweQ1w^O2MpWzF-hN@2dx&?9( zi6Oourql+7(ai+-h?yr7M|7;@rt#6m0>Xc?lHb|t4G)4UFmmA6Q3x`(6H(j)Ajksa z-q6JpnkQr@A|g-U{s*!fIOT|p%LA72@6Y9&W%Pk82>e5SImcdtul?;gNIGK7$SKIT zQ{GKoV3|8Lc}B+EsVR@loi|mN5rxh|d&UYmzo0}`b8C#8wX8%YGAFLU$KfURd^JCv z#epmxsS1u7MM?%PYtU<|5oP*3+>T=6EOF=yEWAX9ss;1E$~oc1Q?^_bDt!1Y=h=#v zLOj;AV(bH)QY?>@pD|5ckdg7wY-{Sgsq^JEh%=&_oT}P>G54YQQ%6DD{~A(uK~d4N zLZqQq9ubhq^oyCi1m@!dZAwoS4@4c;2HfN?vPmCtEdq$LDQ_8S87?1KMO6(DF|sYj z{R~7aDv2G15D_tvIP%Dm0-M5X1WyrW5A?Rbr?~%ZbAhPO{Q#{y0y?jHjf3Vc|8z7omYBNkdo zP#NU>Ww_6!NX-HwEz6T1kP}3%3&IpC%(Lb_G)-52ZL;uymnN#eS$5f0Qes0xo+FnO z$R#TZH*>}aX@tv6Z^!$XJfC>u9kf5QXQF1hKE%3KIBMa0!x zZV+*2F>kiIZ@odB#r-O1BjA0vOW@uW*+dNk?@~u0tMYkcsNS<;m+#EYk+W8n*o()= zwk+I1g64J{oB5ChIbxleJZ)Y;aOu;_?91%(QuR(970W2Z{VP=9RTRB^Af*KR;(}%9 z?r?{TE!UZY1`+C_qt=wcZ7e1BJQ+8#;7$?pDUpsn;!O<&u{Wj8?=TK;{`oQB>KGn%&+#LG?sq*;Z*o+CWk3HAQ-+#0sQ1ijx`uEGS_#RumOdttjf4 zuNe3EQ1K7=9_ZDe*UcT9td__XxV6hJ7Zw#{+lz~7xTJPYPy%_Yb$isr&Yzc&GJDoM zBptfIQGpTVO`#$%tz$qfDy9~98A8zR!RfA96p+^9721la7KjAIkQikbNKr`!E~e^^ zF0boyHf|)NrbaZ!ckuxvAC=K6k@~BWIKlLY<_@B=Wo zdn9ic=oUfW3|fUwZWHkBI=KzNUlwwupbr*u`Jk=Q$t?lC5;zm?i-8vjxkaEKd63a> z$8^vZ0TBfY<5dJ_KGXd;K{`1D@JJ!2Okg`-7INn&U@Z=~mJiLT&+QIXbzyz%zAnvw$xWa;cz)3Ayp0nRRmGfKSoM#RE?gax&;Yh2US z81QJFTnO+%LayU(w(~n7ckynl3j){j;XLrmz_on%9=HdF^5G~TmfGxx1>7g#cEDY5 z-z4B_L9ZLH^3N4e9?z=qjVLR;mAOWM7BimhAsoLQgr7=O`5O{h)u(30F7#)vlc2d1 z*&f32+d=qIm_H)C8o|F0{B-}>{DI81AGAvF6HfeuzajW51pgL+FBW(R;79PUHG#4B z02>8d1W56nC7@Zr@dEC>OLgBV;7S2!31|i+J(B<_eT;(MK8{t5HZwLhin*@ga$WB@ zwuf;1b`ahKLvrT;DSS8hDLzR^w+7ITfnSRs;hzZp!-D^SfNu!;%K|SGa1!8t_}@NO z^}k8L?*aFL{<*-70(!?V_8RD|fFA;$7^CVl{%6c}3be1sbn8R-=WuUEe|g(2%=H!U zqi`pj;z#&C7@n>IP8ZNDpm((DeqO-F(X8qf$iEB!&VhDjG}}Ws`A7KIFqB?z3jWQ2 zl-@Z4?+^Gc@S1ql-+Td61soyZKmnP6Zmg-2p4$Y(I!VI;3J&)2v3C}z99lO{9MHk3;42t>jg9m7%!kQQsv(%;PV2m5wJ+W906wuI8wkc z0lV&0{b?1@4fsCd|DM3(1&k9gQot|)J4UGTO(R%UBWNDP_Y!F5MzB4EQ+x?OCHOuE z-#E}0f$uBOj)ISH;v@Wk;CmH(gFw#*-%ilBfsb(FBYe5wn;_s&0o#YG`cw$GLBK2l zJ#ni0Ndfl?xInHo!c8#5A1UDX!&sG>_#l3M7-QcKV|xh4ZwKKUV94J^0*(YfwZBVD z%oPt>9Qd{NnD9ZueGS~Bfk*1x2@i##@H>X8uyv^F-%jv*LAyA#+dsn33qCja=)Ojj zVOIla$G}H8=}Gt}g6~c6QT@ugleyjj?G5m0^^NeYFqE$Az(?u$4EUZ0?HTZC=}LG$ z4Cy&bKr`S@$V~?PGvEk89|HJS;DZDn27kXzfqw9}KWHKFmvGXPa3=Vh?oh*z9*OdL z2g>Um-Qg4707K!|33w2Y`qTFy_u&1EJvWTGJ_PL@$PrHd6TTbn)Gx=Qz1a(V7u>ae zn($ZQJ`Vh4klzV>8{7#edBUHEp>UrOaEyQrF^s*A@HYXH9_wQe&J@g(WacUZtuzMV z04IM4Urp}NW8v-0^$hUk-mbd8 zDd4LDmI*jXz<5B?SH7K9{c;Lp^I|cM04?Trwuf*EkMO~8C;bk_FxL>^1L3aeOLzp_ z^T7Wo4DR9J4?=rj1m1BQ+e0|X6W)HCs>ewIvjm(ExDDY?zl~M>=|0A0 zKz%`h@`Rh=PT_4H%3P_yr@&ncpYTa=-wgiwke>{EJlqK@w3}971SWq63ZWhoc4`6!;r*tFy<^HPsoC(ae ztv~8v|894}_xDrF+dKVORqz9h%}!vh_dt8IAKODX`9t_FxKsTZ7tdU~fmgs?t51Y) zgZt+DQSRR?R zBElIA`IW#6b>R^1fH{nCQUMPF#)E%5`p6}i=ZphwB=`xZ@Cc8Cp?Y8xurWgI@5kJO zaef5G`4QdyJ>eh1RKwq0fPVyh6_Dh&2)ItTFBEtx{40cg1cp6nfM)ndIE7F6B)FGN zWo-JrX#aqZhdbfqPPhq%{2vOwU7$Y$zBtf^fRAwEBRm4`G=6#EKJ+KRL*cHCX9#C7 zl>Y7EtmVO zA$$o8g_8-sKO+3Q!IuNtBJdGT;Sjz+gtG?WJO+HOE*!#Vig50Od^+$nT{wg%!AMBI z#xOO!6Je|>5&q8u|0&SE4r6-=r|<|r26xJzkg?3=23`kuEx!o=1nys(Q63Ad z6OP{w!Vkbuyeh%>PtZq!Zy#uT!ACfLI|zS6gfj-=ya{}#E*!$Qi*Uw4z5@7GT{wgn z!ce?&1#}3QBVeY0iv(OK;Cuno1)M2hnt-VSngyI9V3L3n1WXWcjDQgWw)Yk3E#T(@ zz9V3%fJ+243AjB}?Z?)HvZ}OEm^WeESqj?9P_~C~N;kqCaJK?K0ry?<9Ey-&H!(KJK^L`_%0aAmrdYHi^tj%#tWN4+WPgK!Vkke0`o%a1I+aa@B?rsoZJcD4R?Bb0PB#hy})q^A zl0ZuUpEeIAd?XC%Z4~g7QN=$IaGQYZ1IDgJ7uN zj|8j%Gzk222$TGKk}Cfg^!N~jccgB4!nX>(5&?4rlm)Cn#(w~RM*>oPz%Y`R5A1!q zFvMmUvIWWq;m97oE^9=*&>YY&ur4cb(#x0*hfvs17dYGx$4KBY2!Nmoo)Js~B))|L zZV@o%4warDt9{72=B=uODrqe6Ba&4{c+I(sgh)(?jvWeTNFZoi?soz0A!0FUS{Xy8NKf5gSDG9@vRPdjJ zeTeYq0LCq!^yRX~ROHDu1cR`Qm9UQ!^cP@1F6a%gHwk+#^4=kM9H4(H=;ff(d1vw` z2KjYd@SK72zZ7-`o=U-^KsH&>M}Xc>*wbLAv(DttKG;_Y`$^d8tTfR(V1E+vA-fEJ z&Qm%g&NRl}A<}`y?O`JBO(^ew5OLp*`FOp^my@U`{}yRQ^NjmM{(3O~94chbjK{c7 z(B~sAdBXoKF&MuK*-ucvt_%Jw@V_YHl7n=ZC+uag4-@viu#Xb@n_+)m_`iKH^c40_ zV5fE+ab%N`aoNJY9y%0IxG=Q#dR_SGhCc^|Zf2RWFNB@et#4D)jnP^+#u(gBS|1-M zbhr%JWZ^&U6HF9#+FKYcWGfKv2ZBy##}5cS7a{I%i}Y-VeY)^78ug3DWt2x#V80;j znXuD%kLc@Rr?>Pdj?pOF+Xc^V(BBkcJqfy3*h^t=2LAx?4}@-W5iZ$_evb77)M>IG zgFOUsBzpDcuy5K1V4c~Hde^w)`U4nlR{QS4D7lHnBl0{gBfPWSI z`w;%?!cN~lEEIn3g8jFGPTz5Og`WN4=cB^UZLkj)JWJy6U5TJK!TxTD8kQSlyW_%7 z8s{|#e-;-!a^2t`-iYE6S8%XEfMrHpydktLclR1EHl#oe}sJ~ z@{Zo%BtIJ<`-B;oyG#>PcGnfq0d0TY!Ox_ z!hKlyKL#E0D}oJ zJS21*3SR2)iJk-Np9RlKlq(vC5PdG}0|Yu0tJYe;46q0@61@TxY;Xpg)qG z|6IT|dtdme*-t_@&2B`vntd~*H2Z5h{(R1F=6){F$!4KoY5ervmS#Vo3s;Qmx$I{; z*(t~)jeo5!+#x#p1f6}1&ioC{F(JbHCa#U~#TEfa0A!I&xUBILD?2p}l!YN2N3PV}M|>=Pzd&{G_%W z7JjOkUghiMEyg1CF-Cq~Qs*qba?w$=k3Cd>ZhQk$yb4N(w<#Q)m+bM#YWL%q8i#l( zR73Sg&B+7(X>h{D%dde~TeZWPIt9fMUOY?3ANLfev`Lu1e5#&`2a2=uT*sey4^=Sm zA*LADaL)~HI@np*MnDMoV(^N5qB3)K;vayC&zQ_+I!1tI`w=%mWpN1SDbsk z!izxgy+VG8`jl_?bF%zdSxVR}TMpcixOoN3@!YF8cl;4pIvO5$tC$oC zAUv`~h(}Q|IJ0vL2#_$>UVA(kbR@Cp6}Ss|!qi$u$J({C>yQ;?x+fKRqQ*?q5&1|_bCwheiUyz3IJgDH z2m)${2|E=`5p7`?K#LP1inICPaoCpI(OKdHpMrcRaM3Gd6%iII4l_Ebxt>>Ebc!!v3NjE{Qgd4SnZl)woxQR)n zphZ)azL_EM?we#(NT%6^1}l?^nU2ox)bh^Tq#V- z4BhVy9|S6cPI6clV2!}BB*O+_-g^*4iXW|A(~tZkLws0PVK_4JlfN^%xu2fN?7e7K zZ(k~$X7>IoV5j?=&ECdTxZ%Yy*%9qxcvG^;Z)hZV&M#+{A2NI25AYN9n`*Q7O>tK{ z-Fb^!(W?Evufz+(X76UfjYG3|!T1xu`qE+PA-davC{;ZuW^a}Sq2nbp$r|bK``+x~ z>i6yJft$S(blmhxFvC57>YXdkR_<}VgqMw9YT>UXkH%}sGrnsX9G=r!fp=wg(%sAa zh8enhIV)Uh^tZBbyqPkZ?r_)ccHYhJWj2(Xy<5c1X3|S@E{(sBy@Wf75^*<;!S8$2 z&*UJyx~#p)QJSmXgZ&RBw0zjLbsga9U!xcsYj7(~jS|{8H#oS#>@5F8;6_a$+%c)ArklhuS68i*ga zHUA|4Al!VjqfJKf{*-eW;p?94x0YO7Vp^*DO8L32((K(i2Kq*Hq`qVgvr1N^LgN_) ztLy(^56nOq2E~B1(rzPqw(<_^U}#cmjX+7-*VW{@>NwyqW=_pqmx=et3?KKBgSY%d z4jLQjo~THkk7nk*^yQy=T!*$Bb;tzjrK0r z%P4m*tL09-(mgQndX84M_?_P~jBT=1+cIDV-9I{k`yjDCjYK8NXi#Ji_Lb~r4^~U< zO!frInR=(Hrg2C^X`fKsC`oaQ>(kF2?g+1% z;h5nvc!EOuG^*Gwba(G!*2qSF9URmUwj`|Tp(QSt^>XR*KjDqpgPrs~0NrNy9MTK- zMB;WkdVxGRaF^I~EmBy>MI*yqbk)>;(H&a!S_PS8#H4UqS`PgW#a(cI-BLOD? z#sZEIaIk=vvF0=e^z(r6fM)=Q1HK{XTL4D`p9?q&a57*Vpn^91=YZ$1uX+-Gp}%uA zf!2t9Rl@PxLHHIJY)j>>1VrCs$Gt>V)Hm%kFjp36kAa_X;wOBv;G_Lm;y;If1hL=B z<)DWPd$H_I?7wPqgl~uYILK_k7G4E#?8ojQoctxc9PV`g5RSmQa8EYfA+(2ZawmK} z+`9ma;9dq;3U|WEo$%=}6yFKpb0dC87grK!3E(4~_y|7%3xNF?_HRkQ2}YbB0Id%D zx0=3$?}x#%v z8rGWw;S(My{QDQ&2LVU7AMlTGcwI%~98`tC{x;$G?ZEOSn~y}K{pwJZH-ZNR+y@@Q zW$^q6L;JIou75yY)7}u}#R|xho$@bS&?&E%3ObdGw*;NaYBcP$j!jC@nm*Yh;qL|T zlYKqH87b&UKfb3%bfgh`Oz`Z3y#$8njesaC+@1zFQ^=MABA+?E24Ve6*guCI<(t!M z5$->PeKFjtgnbd<6T%;)CEF{<0oE?pZ1qE`#_!j9_Xjhaer&T zo~q*+tE0cFvk%nS6LtQ)q_gw+51-El*0M2ozIo+YU3AH^72DO7Xj)q+pj9BTEF4(Q z(+GTxgG*5mn1t}#kL)X*SU1&qMnUU|+D#EyxwwI|R~J23fPt^#s$uA?Tz7$ItjxeA zOg!%T#lH+~WmR1#2rLl(FYA_C#BTEIrdV. -.tr \(*W- -.ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p' -.ie n \{\ -. ds -- \(*W- -. ds PI pi -. if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch -. if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch -. ds L" "" -. ds R" "" -. ds C` "" -. ds C' "" -'br\} -.el\{\ -. ds -- \|\(em\| -. ds PI \(*p -. ds L" `` -. ds R" '' -. ds C` -. ds C' -'br\} -.\" -.\" Escape single quotes in literal strings from groff's Unicode transform. -.ie \n(.g .ds Aq \(aq -.el .ds Aq ' -.\" -.\" If the F register is >0, we'll generate index entries on stderr for -.\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index -.\" entries marked with X<> in POD. Of course, you'll have to process the -.\" output yourself in some meaningful fashion. -.\" -.\" Avoid warning from groff about undefined register 'F'. -.de IX -.. -.nr rF 0 -.if \n(.g .if rF .nr rF 1 -.if (\n(rF:(\n(.g==0)) \{\ -. if \nF \{\ -. de IX -. tm Index:\\$1\t\\n%\t"\\$2" -.. -. if !\nF==2 \{\ -. nr % 0 -. nr F 2 -. \} -. \} -.\} -.rr rF -.\" -.\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2). -.\" Fear. Run. Save yourself. No user-serviceable parts. -. \" fudge factors for nroff and troff -.if n \{\ -. ds #H 0 -. ds #V .8m -. ds #F .3m -. ds #[ \f1 -. ds #] \fP -.\} -.if t \{\ -. ds #H ((1u-(\\\\n(.fu%2u))*.13m) -. ds #V .6m -. ds #F 0 -. ds #[ \& -. ds #] \& -.\} -. \" simple accents for nroff and troff -.if n \{\ -. ds ' \& -. ds ` \& -. ds ^ \& -. ds , \& -. ds ~ ~ -. ds / -.\} -.if t \{\ -. ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u" -. ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u' -. ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u' -. ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u' -. ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u' -. ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u' -.\} -. \" troff and (daisy-wheel) nroff accents -.ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V' -.ds 8 \h'\*(#H'\(*b\h'-\*(#H' -.ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#] -.ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H' -.ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u' -.ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#] -.ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#] -.ds ae a\h'-(\w'a'u*4/10)'e -.ds Ae A\h'-(\w'A'u*4/10)'E -. \" corrections for vroff -.if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u' -.if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u' -. \" for low resolution devices (crt and lpr) -.if \n(.H>23 .if \n(.V>19 \ -\{\ -. ds : e -. ds 8 ss -. ds o a -. ds d- d\h'-1'\(ga -. ds D- D\h'-1'\(hy -. ds th \o'bp' -. ds Th \o'LP' -. ds ae ae -. ds Ae AE -.\} -.rm #[ #] #H #V #F C -.\" ======================================================================== -.\" -.IX Title "LIBEV 3" -.TH LIBEV 3 "2020-03-12" "libev-4.31" "libev - high performance full featured event loop" -.\" For nroff, turn off justification. Always turn off hyphenation; it makes -.\" way too many mistakes in technical documents. -.if n .ad l -.nh -.SH "NAME" -libev \- a high performance full\-featured event loop written in C -.SH "SYNOPSIS" -.IX Header "SYNOPSIS" -.Vb 1 -\& #include -.Ve -.SS "\s-1EXAMPLE PROGRAM\s0" -.IX Subsection "EXAMPLE PROGRAM" -.Vb 2 -\& // a single header file is required -\& #include -\& -\& #include // for puts -\& -\& // every watcher type has its own typedef\*(Aqd struct -\& // with the name ev_TYPE -\& ev_io stdin_watcher; -\& ev_timer timeout_watcher; -\& -\& // all watcher callbacks have a similar signature -\& // this callback is called when data is readable on stdin -\& static void -\& stdin_cb (EV_P_ ev_io *w, int revents) -\& { -\& puts ("stdin ready"); -\& // for one\-shot events, one must manually stop the watcher -\& // with its corresponding stop function. -\& ev_io_stop (EV_A_ w); -\& -\& // this causes all nested ev_run\*(Aqs to stop iterating -\& ev_break (EV_A_ EVBREAK_ALL); -\& } -\& -\& // another callback, this time for a time\-out -\& static void -\& timeout_cb (EV_P_ ev_timer *w, int revents) -\& { -\& puts ("timeout"); -\& // this causes the innermost ev_run to stop iterating -\& ev_break (EV_A_ EVBREAK_ONE); -\& } -\& -\& int -\& main (void) -\& { -\& // use the default event loop unless you have special needs -\& struct ev_loop *loop = EV_DEFAULT; -\& -\& // initialise an io watcher, then start it -\& // this one will watch for stdin to become readable -\& ev_io_init (&stdin_watcher, stdin_cb, /*STDIN_FILENO*/ 0, EV_READ); -\& ev_io_start (loop, &stdin_watcher); -\& -\& // initialise a timer watcher, then start it -\& // simple non\-repeating 5.5 second timeout -\& ev_timer_init (&timeout_watcher, timeout_cb, 5.5, 0.); -\& ev_timer_start (loop, &timeout_watcher); -\& -\& // now wait for events to arrive -\& ev_run (loop, 0); -\& -\& // break was called, so exit -\& return 0; -\& } -.Ve -.SH "ABOUT THIS DOCUMENT" -.IX Header "ABOUT THIS DOCUMENT" -This document documents the libev software package. -.PP -The newest version of this document is also available as an html-formatted -web page you might find easier to navigate when reading it for the first -time: . -.PP -While this document tries to be as complete as possible in documenting -libev, its usage and the rationale behind its design, it is not a tutorial -on event-based programming, nor will it introduce event-based programming -with libev. -.PP -Familiarity with event based programming techniques in general is assumed -throughout this document. -.SH "WHAT TO READ WHEN IN A HURRY" -.IX Header "WHAT TO READ WHEN IN A HURRY" -This manual tries to be very detailed, but unfortunately, this also makes -it very long. If you just want to know the basics of libev, I suggest -reading \*(L"\s-1ANATOMY OF A WATCHER\*(R"\s0, then the \*(L"\s-1EXAMPLE PROGRAM\*(R"\s0 above and -look up the missing functions in \*(L"\s-1GLOBAL FUNCTIONS\*(R"\s0 and the \f(CW\*(C`ev_io\*(C'\fR and -\&\f(CW\*(C`ev_timer\*(C'\fR sections in \*(L"\s-1WATCHER TYPES\*(R"\s0. -.SH "ABOUT LIBEV" -.IX Header "ABOUT LIBEV" -Libev is an event loop: you register interest in certain events (such as a -file descriptor being readable or a timeout occurring), and it will manage -these event sources and provide your program with events. -.PP -To do this, it must take more or less complete control over your process -(or thread) by executing the \fIevent loop\fR handler, and will then -communicate events via a callback mechanism. -.PP -You register interest in certain events by registering so-called \fIevent -watchers\fR, which are relatively small C structures you initialise with the -details of the event, and then hand it over to libev by \fIstarting\fR the -watcher. -.SS "\s-1FEATURES\s0" -.IX Subsection "FEATURES" -Libev supports \f(CW\*(C`select\*(C'\fR, \f(CW\*(C`poll\*(C'\fR, the Linux-specific aio and \f(CW\*(C`epoll\*(C'\fR -interfaces, the BSD-specific \f(CW\*(C`kqueue\*(C'\fR and the Solaris-specific event port -mechanisms for file descriptor events (\f(CW\*(C`ev_io\*(C'\fR), the Linux \f(CW\*(C`inotify\*(C'\fR -interface (for \f(CW\*(C`ev_stat\*(C'\fR), Linux eventfd/signalfd (for faster and cleaner -inter-thread wakeup (\f(CW\*(C`ev_async\*(C'\fR)/signal handling (\f(CW\*(C`ev_signal\*(C'\fR)) relative -timers (\f(CW\*(C`ev_timer\*(C'\fR), absolute timers with customised rescheduling -(\f(CW\*(C`ev_periodic\*(C'\fR), synchronous signals (\f(CW\*(C`ev_signal\*(C'\fR), process status -change events (\f(CW\*(C`ev_child\*(C'\fR), and event watchers dealing with the event -loop mechanism itself (\f(CW\*(C`ev_idle\*(C'\fR, \f(CW\*(C`ev_embed\*(C'\fR, \f(CW\*(C`ev_prepare\*(C'\fR and -\&\f(CW\*(C`ev_check\*(C'\fR watchers) as well as file watchers (\f(CW\*(C`ev_stat\*(C'\fR) and even -limited support for fork events (\f(CW\*(C`ev_fork\*(C'\fR). -.PP -It also is quite fast (see this -benchmark comparing it to libevent -for example). -.SS "\s-1CONVENTIONS\s0" -.IX Subsection "CONVENTIONS" -Libev is very configurable. In this manual the default (and most common) -configuration will be described, which supports multiple event loops. For -more info about various configuration options please have a look at -\&\fB\s-1EMBED\s0\fR section in this manual. If libev was configured without support -for multiple event loops, then all functions taking an initial argument of -name \f(CW\*(C`loop\*(C'\fR (which is always of type \f(CW\*(C`struct ev_loop *\*(C'\fR) will not have -this argument. -.SS "\s-1TIME REPRESENTATION\s0" -.IX Subsection "TIME REPRESENTATION" -Libev represents time as a single floating point number, representing -the (fractional) number of seconds since the (\s-1POSIX\s0) epoch (in practice -somewhere near the beginning of 1970, details are complicated, don't -ask). This type is called \f(CW\*(C`ev_tstamp\*(C'\fR, which is what you should use -too. It usually aliases to the \f(CW\*(C`double\*(C'\fR type in C. When you need to do -any calculations on it, you should treat it as some floating point value. -.PP -Unlike the name component \f(CW\*(C`stamp\*(C'\fR might indicate, it is also used for -time differences (e.g. delays) throughout libev. -.SH "ERROR HANDLING" -.IX Header "ERROR HANDLING" -Libev knows three classes of errors: operating system errors, usage errors -and internal errors (bugs). -.PP -When libev catches an operating system error it cannot handle (for example -a system call indicating a condition libev cannot fix), it calls the callback -set via \f(CW\*(C`ev_set_syserr_cb\*(C'\fR, which is supposed to fix the problem or -abort. The default is to print a diagnostic message and to call \f(CW\*(C`abort -()\*(C'\fR. -.PP -When libev detects a usage error such as a negative timer interval, then -it will print a diagnostic message and abort (via the \f(CW\*(C`assert\*(C'\fR mechanism, -so \f(CW\*(C`NDEBUG\*(C'\fR will disable this checking): these are programming errors in -the libev caller and need to be fixed there. -.PP -Via the \f(CW\*(C`EV_FREQUENT\*(C'\fR macro you can compile in and/or enable extensive -consistency checking code inside libev that can be used to check for -internal inconsistencies, suually caused by application bugs. -.PP -Libev also has a few internal error-checking \f(CW\*(C`assert\*(C'\fRions. These do not -trigger under normal circumstances, as they indicate either a bug in libev -or worse. -.SH "GLOBAL FUNCTIONS" -.IX Header "GLOBAL FUNCTIONS" -These functions can be called anytime, even before initialising the -library in any way. -.IP "ev_tstamp ev_time ()" 4 -.IX Item "ev_tstamp ev_time ()" -Returns the current time as libev would use it. Please note that the -\&\f(CW\*(C`ev_now\*(C'\fR function is usually faster and also often returns the timestamp -you actually want to know. Also interesting is the combination of -\&\f(CW\*(C`ev_now_update\*(C'\fR and \f(CW\*(C`ev_now\*(C'\fR. -.IP "ev_sleep (ev_tstamp interval)" 4 -.IX Item "ev_sleep (ev_tstamp interval)" -Sleep for the given interval: The current thread will be blocked -until either it is interrupted or the given time interval has -passed (approximately \- it might return a bit earlier even if not -interrupted). Returns immediately if \f(CW\*(C`interval <= 0\*(C'\fR. -.Sp -Basically this is a sub-second-resolution \f(CW\*(C`sleep ()\*(C'\fR. -.Sp -The range of the \f(CW\*(C`interval\*(C'\fR is limited \- libev only guarantees to work -with sleep times of up to one day (\f(CW\*(C`interval <= 86400\*(C'\fR). -.IP "int ev_version_major ()" 4 -.IX Item "int ev_version_major ()" -.PD 0 -.IP "int ev_version_minor ()" 4 -.IX Item "int ev_version_minor ()" -.PD -You can find out the major and minor \s-1ABI\s0 version numbers of the library -you linked against by calling the functions \f(CW\*(C`ev_version_major\*(C'\fR and -\&\f(CW\*(C`ev_version_minor\*(C'\fR. If you want, you can compare against the global -symbols \f(CW\*(C`EV_VERSION_MAJOR\*(C'\fR and \f(CW\*(C`EV_VERSION_MINOR\*(C'\fR, which specify the -version of the library your program was compiled against. -.Sp -These version numbers refer to the \s-1ABI\s0 version of the library, not the -release version. -.Sp -Usually, it's a good idea to terminate if the major versions mismatch, -as this indicates an incompatible change. Minor versions are usually -compatible to older versions, so a larger minor version alone is usually -not a problem. -.Sp -Example: Make sure we haven't accidentally been linked against the wrong -version (note, however, that this will not detect other \s-1ABI\s0 mismatches, -such as \s-1LFS\s0 or reentrancy). -.Sp -.Vb 3 -\& assert (("libev version mismatch", -\& ev_version_major () == EV_VERSION_MAJOR -\& && ev_version_minor () >= EV_VERSION_MINOR)); -.Ve -.IP "unsigned int ev_supported_backends ()" 4 -.IX Item "unsigned int ev_supported_backends ()" -Return the set of all backends (i.e. their corresponding \f(CW\*(C`EV_BACKEND_*\*(C'\fR -value) compiled into this binary of libev (independent of their -availability on the system you are running on). See \f(CW\*(C`ev_default_loop\*(C'\fR for -a description of the set values. -.Sp -Example: make sure we have the epoll method, because yeah this is cool and -a must have and can we have a torrent of it please!!!11 -.Sp -.Vb 2 -\& assert (("sorry, no epoll, no sex", -\& ev_supported_backends () & EVBACKEND_EPOLL)); -.Ve -.IP "unsigned int ev_recommended_backends ()" 4 -.IX Item "unsigned int ev_recommended_backends ()" -Return the set of all backends compiled into this binary of libev and -also recommended for this platform, meaning it will work for most file -descriptor types. This set is often smaller than the one returned by -\&\f(CW\*(C`ev_supported_backends\*(C'\fR, as for example kqueue is broken on most BSDs -and will not be auto-detected unless you explicitly request it (assuming -you know what you are doing). This is the set of backends that libev will -probe for if you specify no backends explicitly. -.IP "unsigned int ev_embeddable_backends ()" 4 -.IX Item "unsigned int ev_embeddable_backends ()" -Returns the set of backends that are embeddable in other event loops. This -value is platform-specific but can include backends not available on the -current system. To find which embeddable backends might be supported on -the current system, you would need to look at \f(CW\*(C`ev_embeddable_backends () -& ev_supported_backends ()\*(C'\fR, likewise for recommended ones. -.Sp -See the description of \f(CW\*(C`ev_embed\*(C'\fR watchers for more info. -.IP "ev_set_allocator (void *(*cb)(void *ptr, long size) throw ())" 4 -.IX Item "ev_set_allocator (void *(*cb)(void *ptr, long size) throw ())" -Sets the allocation function to use (the prototype is similar \- the -semantics are identical to the \f(CW\*(C`realloc\*(C'\fR C89/SuS/POSIX function). It is -used to allocate and free memory (no surprises here). If it returns zero -when memory needs to be allocated (\f(CW\*(C`size != 0\*(C'\fR), the library might abort -or take some potentially destructive action. -.Sp -Since some systems (at least OpenBSD and Darwin) fail to implement -correct \f(CW\*(C`realloc\*(C'\fR semantics, libev will use a wrapper around the system -\&\f(CW\*(C`realloc\*(C'\fR and \f(CW\*(C`free\*(C'\fR functions by default. -.Sp -You could override this function in high-availability programs to, say, -free some memory if it cannot allocate memory, to use a special allocator, -or even to sleep a while and retry until some memory is available. -.Sp -Example: The following is the \f(CW\*(C`realloc\*(C'\fR function that libev itself uses -which should work with \f(CW\*(C`realloc\*(C'\fR and \f(CW\*(C`free\*(C'\fR functions of all kinds and -is probably a good basis for your own implementation. -.Sp -.Vb 5 -\& static void * -\& ev_realloc_emul (void *ptr, long size) EV_NOEXCEPT -\& { -\& if (size) -\& return realloc (ptr, size); -\& -\& free (ptr); -\& return 0; -\& } -.Ve -.Sp -Example: Replace the libev allocator with one that waits a bit and then -retries. -.Sp -.Vb 8 -\& static void * -\& persistent_realloc (void *ptr, size_t size) -\& { -\& if (!size) -\& { -\& free (ptr); -\& return 0; -\& } -\& -\& for (;;) -\& { -\& void *newptr = realloc (ptr, size); -\& -\& if (newptr) -\& return newptr; -\& -\& sleep (60); -\& } -\& } -\& -\& ... -\& ev_set_allocator (persistent_realloc); -.Ve -.IP "ev_set_syserr_cb (void (*cb)(const char *msg) throw ())" 4 -.IX Item "ev_set_syserr_cb (void (*cb)(const char *msg) throw ())" -Set the callback function to call on a retryable system call error (such -as failed select, poll, epoll_wait). The message is a printable string -indicating the system call or subsystem causing the problem. If this -callback is set, then libev will expect it to remedy the situation, no -matter what, when it returns. That is, libev will generally retry the -requested operation, or, if the condition doesn't go away, do bad stuff -(such as abort). -.Sp -Example: This is basically the same thing that libev does internally, too. -.Sp -.Vb 6 -\& static void -\& fatal_error (const char *msg) -\& { -\& perror (msg); -\& abort (); -\& } -\& -\& ... -\& ev_set_syserr_cb (fatal_error); -.Ve -.IP "ev_feed_signal (int signum)" 4 -.IX Item "ev_feed_signal (int signum)" -This function can be used to \*(L"simulate\*(R" a signal receive. It is completely -safe to call this function at any time, from any context, including signal -handlers or random threads. -.Sp -Its main use is to customise signal handling in your process, especially -in the presence of threads. For example, you could block signals -by default in all threads (and specifying \f(CW\*(C`EVFLAG_NOSIGMASK\*(C'\fR when -creating any loops), and in one thread, use \f(CW\*(C`sigwait\*(C'\fR or any other -mechanism to wait for signals, then \*(L"deliver\*(R" them to libev by calling -\&\f(CW\*(C`ev_feed_signal\*(C'\fR. -.SH "FUNCTIONS CONTROLLING EVENT LOOPS" -.IX Header "FUNCTIONS CONTROLLING EVENT LOOPS" -An event loop is described by a \f(CW\*(C`struct ev_loop *\*(C'\fR (the \f(CW\*(C`struct\*(C'\fR is -\&\fInot\fR optional in this case unless libev 3 compatibility is disabled, as -libev 3 had an \f(CW\*(C`ev_loop\*(C'\fR function colliding with the struct name). -.PP -The library knows two types of such loops, the \fIdefault\fR loop, which -supports child process events, and dynamically created event loops which -do not. -.IP "struct ev_loop *ev_default_loop (unsigned int flags)" 4 -.IX Item "struct ev_loop *ev_default_loop (unsigned int flags)" -This returns the \*(L"default\*(R" event loop object, which is what you should -normally use when you just need \*(L"the event loop\*(R". Event loop objects and -the \f(CW\*(C`flags\*(C'\fR parameter are described in more detail in the entry for -\&\f(CW\*(C`ev_loop_new\*(C'\fR. -.Sp -If the default loop is already initialised then this function simply -returns it (and ignores the flags. If that is troubling you, check -\&\f(CW\*(C`ev_backend ()\*(C'\fR afterwards). Otherwise it will create it with the given -flags, which should almost always be \f(CW0\fR, unless the caller is also the -one calling \f(CW\*(C`ev_run\*(C'\fR or otherwise qualifies as \*(L"the main program\*(R". -.Sp -If you don't know what event loop to use, use the one returned from this -function (or via the \f(CW\*(C`EV_DEFAULT\*(C'\fR macro). -.Sp -Note that this function is \fInot\fR thread-safe, so if you want to use it -from multiple threads, you have to employ some kind of mutex (note also -that this case is unlikely, as loops cannot be shared easily between -threads anyway). -.Sp -The default loop is the only loop that can handle \f(CW\*(C`ev_child\*(C'\fR watchers, -and to do this, it always registers a handler for \f(CW\*(C`SIGCHLD\*(C'\fR. If this is -a problem for your application you can either create a dynamic loop with -\&\f(CW\*(C`ev_loop_new\*(C'\fR which doesn't do that, or you can simply overwrite the -\&\f(CW\*(C`SIGCHLD\*(C'\fR signal handler \fIafter\fR calling \f(CW\*(C`ev_default_init\*(C'\fR. -.Sp -Example: This is the most typical usage. -.Sp -.Vb 2 -\& if (!ev_default_loop (0)) -\& fatal ("could not initialise libev, bad $LIBEV_FLAGS in environment?"); -.Ve -.Sp -Example: Restrict libev to the select and poll backends, and do not allow -environment settings to be taken into account: -.Sp -.Vb 1 -\& ev_default_loop (EVBACKEND_POLL | EVBACKEND_SELECT | EVFLAG_NOENV); -.Ve -.IP "struct ev_loop *ev_loop_new (unsigned int flags)" 4 -.IX Item "struct ev_loop *ev_loop_new (unsigned int flags)" -This will create and initialise a new event loop object. If the loop -could not be initialised, returns false. -.Sp -This function is thread-safe, and one common way to use libev with -threads is indeed to create one loop per thread, and using the default -loop in the \*(L"main\*(R" or \*(L"initial\*(R" thread. -.Sp -The flags argument can be used to specify special behaviour or specific -backends to use, and is usually specified as \f(CW0\fR (or \f(CW\*(C`EVFLAG_AUTO\*(C'\fR). -.Sp -The following flags are supported: -.RS 4 -.ie n .IP """EVFLAG_AUTO""" 4 -.el .IP "\f(CWEVFLAG_AUTO\fR" 4 -.IX Item "EVFLAG_AUTO" -The default flags value. Use this if you have no clue (it's the right -thing, believe me). -.ie n .IP """EVFLAG_NOENV""" 4 -.el .IP "\f(CWEVFLAG_NOENV\fR" 4 -.IX Item "EVFLAG_NOENV" -If this flag bit is or'ed into the flag value (or the program runs setuid -or setgid) then libev will \fInot\fR look at the environment variable -\&\f(CW\*(C`LIBEV_FLAGS\*(C'\fR. Otherwise (the default), this environment variable will -override the flags completely if it is found in the environment. This is -useful to try out specific backends to test their performance, to work -around bugs, or to make libev threadsafe (accessing environment variables -cannot be done in a threadsafe way, but usually it works if no other -thread modifies them). -.ie n .IP """EVFLAG_FORKCHECK""" 4 -.el .IP "\f(CWEVFLAG_FORKCHECK\fR" 4 -.IX Item "EVFLAG_FORKCHECK" -Instead of calling \f(CW\*(C`ev_loop_fork\*(C'\fR manually after a fork, you can also -make libev check for a fork in each iteration by enabling this flag. -.Sp -This works by calling \f(CW\*(C`getpid ()\*(C'\fR on every iteration of the loop, -and thus this might slow down your event loop if you do a lot of loop -iterations and little real work, but is usually not noticeable (on my -GNU/Linux system for example, \f(CW\*(C`getpid\*(C'\fR is actually a simple 5\-insn -sequence without a system call and thus \fIvery\fR fast, but my GNU/Linux -system also has \f(CW\*(C`pthread_atfork\*(C'\fR which is even faster). (Update: glibc -versions 2.25 apparently removed the \f(CW\*(C`getpid\*(C'\fR optimisation again). -.Sp -The big advantage of this flag is that you can forget about fork (and -forget about forgetting to tell libev about forking, although you still -have to ignore \f(CW\*(C`SIGPIPE\*(C'\fR) when you use this flag. -.Sp -This flag setting cannot be overridden or specified in the \f(CW\*(C`LIBEV_FLAGS\*(C'\fR -environment variable. -.ie n .IP """EVFLAG_NOINOTIFY""" 4 -.el .IP "\f(CWEVFLAG_NOINOTIFY\fR" 4 -.IX Item "EVFLAG_NOINOTIFY" -When this flag is specified, then libev will not attempt to use the -\&\fIinotify\fR \s-1API\s0 for its \f(CW\*(C`ev_stat\*(C'\fR watchers. Apart from debugging and -testing, this flag can be useful to conserve inotify file descriptors, as -otherwise each loop using \f(CW\*(C`ev_stat\*(C'\fR watchers consumes one inotify handle. -.ie n .IP """EVFLAG_SIGNALFD""" 4 -.el .IP "\f(CWEVFLAG_SIGNALFD\fR" 4 -.IX Item "EVFLAG_SIGNALFD" -When this flag is specified, then libev will attempt to use the -\&\fIsignalfd\fR \s-1API\s0 for its \f(CW\*(C`ev_signal\*(C'\fR (and \f(CW\*(C`ev_child\*(C'\fR) watchers. This \s-1API\s0 -delivers signals synchronously, which makes it both faster and might make -it possible to get the queued signal data. It can also simplify signal -handling with threads, as long as you properly block signals in your -threads that are not interested in handling them. -.Sp -Signalfd will not be used by default as this changes your signal mask, and -there are a lot of shoddy libraries and programs (glib's threadpool for -example) that can't properly initialise their signal masks. -.ie n .IP """EVFLAG_NOSIGMASK""" 4 -.el .IP "\f(CWEVFLAG_NOSIGMASK\fR" 4 -.IX Item "EVFLAG_NOSIGMASK" -When this flag is specified, then libev will avoid to modify the signal -mask. Specifically, this means you have to make sure signals are unblocked -when you want to receive them. -.Sp -This behaviour is useful when you want to do your own signal handling, or -want to handle signals only in specific threads and want to avoid libev -unblocking the signals. -.Sp -It's also required by \s-1POSIX\s0 in a threaded program, as libev calls -\&\f(CW\*(C`sigprocmask\*(C'\fR, whose behaviour is officially unspecified. -.ie n .IP """EVFLAG_NOTIMERFD""" 4 -.el .IP "\f(CWEVFLAG_NOTIMERFD\fR" 4 -.IX Item "EVFLAG_NOTIMERFD" -When this flag is specified, the libev will avoid using a \f(CW\*(C`timerfd\*(C'\fR to -detect time jumps. It will still be able to detect time jumps, but takes -longer and has a lower accuracy in doing so, but saves a file descriptor -per loop. -.Sp -The current implementation only tries to use a \f(CW\*(C`timerfd\*(C'\fR when the first -\&\f(CW\*(C`ev_periodic\*(C'\fR watcher is started and falls back on other methods if it -cannot be created, but this behaviour might change in the future. -.ie n .IP """EVBACKEND_SELECT"" (value 1, portable select backend)" 4 -.el .IP "\f(CWEVBACKEND_SELECT\fR (value 1, portable select backend)" 4 -.IX Item "EVBACKEND_SELECT (value 1, portable select backend)" -This is your standard \fBselect\fR\|(2) backend. Not \fIcompletely\fR standard, as -libev tries to roll its own fd_set with no limits on the number of fds, -but if that fails, expect a fairly low limit on the number of fds when -using this backend. It doesn't scale too well (O(highest_fd)), but its -usually the fastest backend for a low number of (low-numbered :) fds. -.Sp -To get good performance out of this backend you need a high amount of -parallelism (most of the file descriptors should be busy). If you are -writing a server, you should \f(CW\*(C`accept ()\*(C'\fR in a loop to accept as many -connections as possible during one iteration. You might also want to have -a look at \f(CW\*(C`ev_set_io_collect_interval ()\*(C'\fR to increase the amount of -readiness notifications you get per iteration. -.Sp -This backend maps \f(CW\*(C`EV_READ\*(C'\fR to the \f(CW\*(C`readfds\*(C'\fR set and \f(CW\*(C`EV_WRITE\*(C'\fR to the -\&\f(CW\*(C`writefds\*(C'\fR set (and to work around Microsoft Windows bugs, also onto the -\&\f(CW\*(C`exceptfds\*(C'\fR set on that platform). -.ie n .IP """EVBACKEND_POLL"" (value 2, poll backend, available everywhere except on windows)" 4 -.el .IP "\f(CWEVBACKEND_POLL\fR (value 2, poll backend, available everywhere except on windows)" 4 -.IX Item "EVBACKEND_POLL (value 2, poll backend, available everywhere except on windows)" -And this is your standard \fBpoll\fR\|(2) backend. It's more complicated -than select, but handles sparse fds better and has no artificial -limit on the number of fds you can use (except it will slow down -considerably with a lot of inactive fds). It scales similarly to select, -i.e. O(total_fds). See the entry for \f(CW\*(C`EVBACKEND_SELECT\*(C'\fR, above, for -performance tips. -.Sp -This backend maps \f(CW\*(C`EV_READ\*(C'\fR to \f(CW\*(C`POLLIN | POLLERR | POLLHUP\*(C'\fR, and -\&\f(CW\*(C`EV_WRITE\*(C'\fR to \f(CW\*(C`POLLOUT | POLLERR | POLLHUP\*(C'\fR. -.ie n .IP """EVBACKEND_EPOLL"" (value 4, Linux)" 4 -.el .IP "\f(CWEVBACKEND_EPOLL\fR (value 4, Linux)" 4 -.IX Item "EVBACKEND_EPOLL (value 4, Linux)" -Use the Linux-specific \fBepoll\fR\|(7) interface (for both pre\- and post\-2.6.9 -kernels). -.Sp -For few fds, this backend is a bit little slower than poll and select, but -it scales phenomenally better. While poll and select usually scale like -O(total_fds) where total_fds is the total number of fds (or the highest -fd), epoll scales either O(1) or O(active_fds). -.Sp -The epoll mechanism deserves honorable mention as the most misdesigned -of the more advanced event mechanisms: mere annoyances include silently -dropping file descriptors, requiring a system call per change per file -descriptor (and unnecessary guessing of parameters), problems with dup, -returning before the timeout value, resulting in additional iterations -(and only giving 5ms accuracy while select on the same platform gives -0.1ms) and so on. The biggest issue is fork races, however \- if a program -forks then \fIboth\fR parent and child process have to recreate the epoll -set, which can take considerable time (one syscall per file descriptor) -and is of course hard to detect. -.Sp -Epoll is also notoriously buggy \- embedding epoll fds \fIshould\fR work, -but of course \fIdoesn't\fR, and epoll just loves to report events for -totally \fIdifferent\fR file descriptors (even already closed ones, so -one cannot even remove them from the set) than registered in the set -(especially on \s-1SMP\s0 systems). Libev tries to counter these spurious -notifications by employing an additional generation counter and comparing -that against the events to filter out spurious ones, recreating the set -when required. Epoll also erroneously rounds down timeouts, but gives you -no way to know when and by how much, so sometimes you have to busy-wait -because epoll returns immediately despite a nonzero timeout. And last -not least, it also refuses to work with some file descriptors which work -perfectly fine with \f(CW\*(C`select\*(C'\fR (files, many character devices...). -.Sp -Epoll is truly the train wreck among event poll mechanisms, a frankenpoll, -cobbled together in a hurry, no thought to design or interaction with -others. Oh, the pain, will it ever stop... -.Sp -While stopping, setting and starting an I/O watcher in the same iteration -will result in some caching, there is still a system call per such -incident (because the same \fIfile descriptor\fR could point to a different -\&\fIfile description\fR now), so its best to avoid that. Also, \f(CW\*(C`dup ()\*(C'\fR'ed -file descriptors might not work very well if you register events for both -file descriptors. -.Sp -Best performance from this backend is achieved by not unregistering all -watchers for a file descriptor until it has been closed, if possible, -i.e. keep at least one watcher active per fd at all times. Stopping and -starting a watcher (without re-setting it) also usually doesn't cause -extra overhead. A fork can both result in spurious notifications as well -as in libev having to destroy and recreate the epoll object, which can -take considerable time and thus should be avoided. -.Sp -All this means that, in practice, \f(CW\*(C`EVBACKEND_SELECT\*(C'\fR can be as fast or -faster than epoll for maybe up to a hundred file descriptors, depending on -the usage. So sad. -.Sp -While nominally embeddable in other event loops, this feature is broken in -a lot of kernel revisions, but probably(!) works in current versions. -.Sp -This backend maps \f(CW\*(C`EV_READ\*(C'\fR and \f(CW\*(C`EV_WRITE\*(C'\fR in the same way as -\&\f(CW\*(C`EVBACKEND_POLL\*(C'\fR. -.ie n .IP """EVBACKEND_LINUXAIO"" (value 64, Linux)" 4 -.el .IP "\f(CWEVBACKEND_LINUXAIO\fR (value 64, Linux)" 4 -.IX Item "EVBACKEND_LINUXAIO (value 64, Linux)" -Use the Linux-specific Linux \s-1AIO\s0 (\fInot\fR \f(CWaio(7)\fR but \f(CWio_submit(2)\fR) event interface available in post\-4.18 kernels (but libev -only tries to use it in 4.19+). -.Sp -This is another Linux train wreck of an event interface. -.Sp -If this backend works for you (as of this writing, it was very -experimental), it is the best event interface available on Linux and might -be well worth enabling it \- if it isn't available in your kernel this will -be detected and this backend will be skipped. -.Sp -This backend can batch oneshot requests and supports a user-space ring -buffer to receive events. It also doesn't suffer from most of the design -problems of epoll (such as not being able to remove event sources from -the epoll set), and generally sounds too good to be true. Because, this -being the Linux kernel, of course it suffers from a whole new set of -limitations, forcing you to fall back to epoll, inheriting all its design -issues. -.Sp -For one, it is not easily embeddable (but probably could be done using -an event fd at some extra overhead). It also is subject to a system wide -limit that can be configured in \fI/proc/sys/fs/aio\-max\-nr\fR. If no \s-1AIO\s0 -requests are left, this backend will be skipped during initialisation, and -will switch to epoll when the loop is active. -.Sp -Most problematic in practice, however, is that not all file descriptors -work with it. For example, in Linux 5.1, \s-1TCP\s0 sockets, pipes, event fds, -files, \fI/dev/null\fR and many others are supported, but ttys do not work -properly (a known bug that the kernel developers don't care about, see -), so this is not -(yet?) a generic event polling interface. -.Sp -Overall, it seems the Linux developers just don't want it to have a -generic event handling mechanism other than \f(CW\*(C`select\*(C'\fR or \f(CW\*(C`poll\*(C'\fR. -.Sp -To work around all these problem, the current version of libev uses its -epoll backend as a fallback for file descriptor types that do not work. Or -falls back completely to epoll if the kernel acts up. -.Sp -This backend maps \f(CW\*(C`EV_READ\*(C'\fR and \f(CW\*(C`EV_WRITE\*(C'\fR in the same way as -\&\f(CW\*(C`EVBACKEND_POLL\*(C'\fR. -.ie n .IP """EVBACKEND_KQUEUE"" (value 8, most \s-1BSD\s0 clones)" 4 -.el .IP "\f(CWEVBACKEND_KQUEUE\fR (value 8, most \s-1BSD\s0 clones)" 4 -.IX Item "EVBACKEND_KQUEUE (value 8, most BSD clones)" -Kqueue deserves special mention, as at the time this backend was -implemented, it was broken on all BSDs except NetBSD (usually it doesn't -work reliably with anything but sockets and pipes, except on Darwin, -where of course it's completely useless). Unlike epoll, however, whose -brokenness is by design, these kqueue bugs can be (and mostly have been) -fixed without \s-1API\s0 changes to existing programs. For this reason it's not -being \*(L"auto-detected\*(R" on all platforms unless you explicitly specify it -in the flags (i.e. using \f(CW\*(C`EVBACKEND_KQUEUE\*(C'\fR) or libev was compiled on a -known-to-be-good (\-enough) system like NetBSD. -.Sp -You still can embed kqueue into a normal poll or select backend and use it -only for sockets (after having made sure that sockets work with kqueue on -the target platform). See \f(CW\*(C`ev_embed\*(C'\fR watchers for more info. -.Sp -It scales in the same way as the epoll backend, but the interface to the -kernel is more efficient (which says nothing about its actual speed, of -course). While stopping, setting and starting an I/O watcher does never -cause an extra system call as with \f(CW\*(C`EVBACKEND_EPOLL\*(C'\fR, it still adds up to -two event changes per incident. Support for \f(CW\*(C`fork ()\*(C'\fR is very bad (you -might have to leak fds on fork, but it's more sane than epoll) and it -drops fds silently in similarly hard-to-detect cases. -.Sp -This backend usually performs well under most conditions. -.Sp -While nominally embeddable in other event loops, this doesn't work -everywhere, so you might need to test for this. And since it is broken -almost everywhere, you should only use it when you have a lot of sockets -(for which it usually works), by embedding it into another event loop -(e.g. \f(CW\*(C`EVBACKEND_SELECT\*(C'\fR or \f(CW\*(C`EVBACKEND_POLL\*(C'\fR (but \f(CW\*(C`poll\*(C'\fR is of course -also broken on \s-1OS X\s0)) and, did I mention it, using it only for sockets. -.Sp -This backend maps \f(CW\*(C`EV_READ\*(C'\fR into an \f(CW\*(C`EVFILT_READ\*(C'\fR kevent with -\&\f(CW\*(C`NOTE_EOF\*(C'\fR, and \f(CW\*(C`EV_WRITE\*(C'\fR into an \f(CW\*(C`EVFILT_WRITE\*(C'\fR kevent with -\&\f(CW\*(C`NOTE_EOF\*(C'\fR. -.ie n .IP """EVBACKEND_DEVPOLL"" (value 16, Solaris 8)" 4 -.el .IP "\f(CWEVBACKEND_DEVPOLL\fR (value 16, Solaris 8)" 4 -.IX Item "EVBACKEND_DEVPOLL (value 16, Solaris 8)" -This is not implemented yet (and might never be, unless you send me an -implementation). According to reports, \f(CW\*(C`/dev/poll\*(C'\fR only supports sockets -and is not embeddable, which would limit the usefulness of this backend -immensely. -.ie n .IP """EVBACKEND_PORT"" (value 32, Solaris 10)" 4 -.el .IP "\f(CWEVBACKEND_PORT\fR (value 32, Solaris 10)" 4 -.IX Item "EVBACKEND_PORT (value 32, Solaris 10)" -This uses the Solaris 10 event port mechanism. As with everything on Solaris, -it's really slow, but it still scales very well (O(active_fds)). -.Sp -While this backend scales well, it requires one system call per active -file descriptor per loop iteration. For small and medium numbers of file -descriptors a \*(L"slow\*(R" \f(CW\*(C`EVBACKEND_SELECT\*(C'\fR or \f(CW\*(C`EVBACKEND_POLL\*(C'\fR backend -might perform better. -.Sp -On the positive side, this backend actually performed fully to -specification in all tests and is fully embeddable, which is a rare feat -among the OS-specific backends (I vastly prefer correctness over speed -hacks). -.Sp -On the negative side, the interface is \fIbizarre\fR \- so bizarre that -even sun itself gets it wrong in their code examples: The event polling -function sometimes returns events to the caller even though an error -occurred, but with no indication whether it has done so or not (yes, it's -even documented that way) \- deadly for edge-triggered interfaces where you -absolutely have to know whether an event occurred or not because you have -to re-arm the watcher. -.Sp -Fortunately libev seems to be able to work around these idiocies. -.Sp -This backend maps \f(CW\*(C`EV_READ\*(C'\fR and \f(CW\*(C`EV_WRITE\*(C'\fR in the same way as -\&\f(CW\*(C`EVBACKEND_POLL\*(C'\fR. -.ie n .IP """EVBACKEND_ALL""" 4 -.el .IP "\f(CWEVBACKEND_ALL\fR" 4 -.IX Item "EVBACKEND_ALL" -Try all backends (even potentially broken ones that wouldn't be tried -with \f(CW\*(C`EVFLAG_AUTO\*(C'\fR). Since this is a mask, you can do stuff such as -\&\f(CW\*(C`EVBACKEND_ALL & ~EVBACKEND_KQUEUE\*(C'\fR. -.Sp -It is definitely not recommended to use this flag, use whatever -\&\f(CW\*(C`ev_recommended_backends ()\*(C'\fR returns, or simply do not specify a backend -at all. -.ie n .IP """EVBACKEND_MASK""" 4 -.el .IP "\f(CWEVBACKEND_MASK\fR" 4 -.IX Item "EVBACKEND_MASK" -Not a backend at all, but a mask to select all backend bits from a -\&\f(CW\*(C`flags\*(C'\fR value, in case you want to mask out any backends from a flags -value (e.g. when modifying the \f(CW\*(C`LIBEV_FLAGS\*(C'\fR environment variable). -.RE -.RS 4 -.Sp -If one or more of the backend flags are or'ed into the flags value, -then only these backends will be tried (in the reverse order as listed -here). If none are specified, all backends in \f(CW\*(C`ev_recommended_backends -()\*(C'\fR will be tried. -.Sp -Example: Try to create a event loop that uses epoll and nothing else. -.Sp -.Vb 3 -\& struct ev_loop *epoller = ev_loop_new (EVBACKEND_EPOLL | EVFLAG_NOENV); -\& if (!epoller) -\& fatal ("no epoll found here, maybe it hides under your chair"); -.Ve -.Sp -Example: Use whatever libev has to offer, but make sure that kqueue is -used if available. -.Sp -.Vb 1 -\& struct ev_loop *loop = ev_loop_new (ev_recommended_backends () | EVBACKEND_KQUEUE); -.Ve -.Sp -Example: Similarly, on linux, you mgiht want to take advantage of the -linux aio backend if possible, but fall back to something else if that -isn't available. -.Sp -.Vb 1 -\& struct ev_loop *loop = ev_loop_new (ev_recommended_backends () | EVBACKEND_LINUXAIO); -.Ve -.RE -.IP "ev_loop_destroy (loop)" 4 -.IX Item "ev_loop_destroy (loop)" -Destroys an event loop object (frees all memory and kernel state -etc.). None of the active event watchers will be stopped in the normal -sense, so e.g. \f(CW\*(C`ev_is_active\*(C'\fR might still return true. It is your -responsibility to either stop all watchers cleanly yourself \fIbefore\fR -calling this function, or cope with the fact afterwards (which is usually -the easiest thing, you can just ignore the watchers and/or \f(CW\*(C`free ()\*(C'\fR them -for example). -.Sp -Note that certain global state, such as signal state (and installed signal -handlers), will not be freed by this function, and related watchers (such -as signal and child watchers) would need to be stopped manually. -.Sp -This function is normally used on loop objects allocated by -\&\f(CW\*(C`ev_loop_new\*(C'\fR, but it can also be used on the default loop returned by -\&\f(CW\*(C`ev_default_loop\*(C'\fR, in which case it is not thread-safe. -.Sp -Note that it is not advisable to call this function on the default loop -except in the rare occasion where you really need to free its resources. -If you need dynamically allocated loops it is better to use \f(CW\*(C`ev_loop_new\*(C'\fR -and \f(CW\*(C`ev_loop_destroy\*(C'\fR. -.IP "ev_loop_fork (loop)" 4 -.IX Item "ev_loop_fork (loop)" -This function sets a flag that causes subsequent \f(CW\*(C`ev_run\*(C'\fR iterations -to reinitialise the kernel state for backends that have one. Despite -the name, you can call it anytime you are allowed to start or stop -watchers (except inside an \f(CW\*(C`ev_prepare\*(C'\fR callback), but it makes most -sense after forking, in the child process. You \fImust\fR call it (or use -\&\f(CW\*(C`EVFLAG_FORKCHECK\*(C'\fR) in the child before resuming or calling \f(CW\*(C`ev_run\*(C'\fR. -.Sp -In addition, if you want to reuse a loop (via this function or -\&\f(CW\*(C`EVFLAG_FORKCHECK\*(C'\fR), you \fIalso\fR have to ignore \f(CW\*(C`SIGPIPE\*(C'\fR. -.Sp -Again, you \fIhave\fR to call it on \fIany\fR loop that you want to re-use after -a fork, \fIeven if you do not plan to use the loop in the parent\fR. This is -because some kernel interfaces *cough* \fIkqueue\fR *cough* do funny things -during fork. -.Sp -On the other hand, you only need to call this function in the child -process if and only if you want to use the event loop in the child. If -you just fork+exec or create a new loop in the child, you don't have to -call it at all (in fact, \f(CW\*(C`epoll\*(C'\fR is so badly broken that it makes a -difference, but libev will usually detect this case on its own and do a -costly reset of the backend). -.Sp -The function itself is quite fast and it's usually not a problem to call -it just in case after a fork. -.Sp -Example: Automate calling \f(CW\*(C`ev_loop_fork\*(C'\fR on the default loop when -using pthreads. -.Sp -.Vb 5 -\& static void -\& post_fork_child (void) -\& { -\& ev_loop_fork (EV_DEFAULT); -\& } -\& -\& ... -\& pthread_atfork (0, 0, post_fork_child); -.Ve -.IP "int ev_is_default_loop (loop)" 4 -.IX Item "int ev_is_default_loop (loop)" -Returns true when the given loop is, in fact, the default loop, and false -otherwise. -.IP "unsigned int ev_iteration (loop)" 4 -.IX Item "unsigned int ev_iteration (loop)" -Returns the current iteration count for the event loop, which is identical -to the number of times libev did poll for new events. It starts at \f(CW0\fR -and happily wraps around with enough iterations. -.Sp -This value can sometimes be useful as a generation counter of sorts (it -\&\*(L"ticks\*(R" the number of loop iterations), as it roughly corresponds with -\&\f(CW\*(C`ev_prepare\*(C'\fR and \f(CW\*(C`ev_check\*(C'\fR calls \- and is incremented between the -prepare and check phases. -.IP "unsigned int ev_depth (loop)" 4 -.IX Item "unsigned int ev_depth (loop)" -Returns the number of times \f(CW\*(C`ev_run\*(C'\fR was entered minus the number of -times \f(CW\*(C`ev_run\*(C'\fR was exited normally, in other words, the recursion depth. -.Sp -Outside \f(CW\*(C`ev_run\*(C'\fR, this number is zero. In a callback, this number is -\&\f(CW1\fR, unless \f(CW\*(C`ev_run\*(C'\fR was invoked recursively (or from another thread), -in which case it is higher. -.Sp -Leaving \f(CW\*(C`ev_run\*(C'\fR abnormally (setjmp/longjmp, cancelling the thread, -throwing an exception etc.), doesn't count as \*(L"exit\*(R" \- consider this -as a hint to avoid such ungentleman-like behaviour unless it's really -convenient, in which case it is fully supported. -.IP "unsigned int ev_backend (loop)" 4 -.IX Item "unsigned int ev_backend (loop)" -Returns one of the \f(CW\*(C`EVBACKEND_*\*(C'\fR flags indicating the event backend in -use. -.IP "ev_tstamp ev_now (loop)" 4 -.IX Item "ev_tstamp ev_now (loop)" -Returns the current \*(L"event loop time\*(R", which is the time the event loop -received events and started processing them. This timestamp does not -change as long as callbacks are being processed, and this is also the base -time used for relative timers. You can treat it as the timestamp of the -event occurring (or more correctly, libev finding out about it). -.IP "ev_now_update (loop)" 4 -.IX Item "ev_now_update (loop)" -Establishes the current time by querying the kernel, updating the time -returned by \f(CW\*(C`ev_now ()\*(C'\fR in the progress. This is a costly operation and -is usually done automatically within \f(CW\*(C`ev_run ()\*(C'\fR. -.Sp -This function is rarely useful, but when some event callback runs for a -very long time without entering the event loop, updating libev's idea of -the current time is a good idea. -.Sp -See also \*(L"The special problem of time updates\*(R" in the \f(CW\*(C`ev_timer\*(C'\fR section. -.IP "ev_suspend (loop)" 4 -.IX Item "ev_suspend (loop)" -.PD 0 -.IP "ev_resume (loop)" 4 -.IX Item "ev_resume (loop)" -.PD -These two functions suspend and resume an event loop, for use when the -loop is not used for a while and timeouts should not be processed. -.Sp -A typical use case would be an interactive program such as a game: When -the user presses \f(CW\*(C`^Z\*(C'\fR to suspend the game and resumes it an hour later it -would be best to handle timeouts as if no time had actually passed while -the program was suspended. This can be achieved by calling \f(CW\*(C`ev_suspend\*(C'\fR -in your \f(CW\*(C`SIGTSTP\*(C'\fR handler, sending yourself a \f(CW\*(C`SIGSTOP\*(C'\fR and calling -\&\f(CW\*(C`ev_resume\*(C'\fR directly afterwards to resume timer processing. -.Sp -Effectively, all \f(CW\*(C`ev_timer\*(C'\fR watchers will be delayed by the time spend -between \f(CW\*(C`ev_suspend\*(C'\fR and \f(CW\*(C`ev_resume\*(C'\fR, and all \f(CW\*(C`ev_periodic\*(C'\fR watchers -will be rescheduled (that is, they will lose any events that would have -occurred while suspended). -.Sp -After calling \f(CW\*(C`ev_suspend\*(C'\fR you \fBmust not\fR call \fIany\fR function on the -given loop other than \f(CW\*(C`ev_resume\*(C'\fR, and you \fBmust not\fR call \f(CW\*(C`ev_resume\*(C'\fR -without a previous call to \f(CW\*(C`ev_suspend\*(C'\fR. -.Sp -Calling \f(CW\*(C`ev_suspend\*(C'\fR/\f(CW\*(C`ev_resume\*(C'\fR has the side effect of updating the -event loop time (see \f(CW\*(C`ev_now_update\*(C'\fR). -.IP "bool ev_run (loop, int flags)" 4 -.IX Item "bool ev_run (loop, int flags)" -Finally, this is it, the event handler. This function usually is called -after you have initialised all your watchers and you want to start -handling events. It will ask the operating system for any new events, call -the watcher callbacks, and then repeat the whole process indefinitely: This -is why event loops are called \fIloops\fR. -.Sp -If the flags argument is specified as \f(CW0\fR, it will keep handling events -until either no event watchers are active anymore or \f(CW\*(C`ev_break\*(C'\fR was -called. -.Sp -The return value is false if there are no more active watchers (which -usually means \*(L"all jobs done\*(R" or \*(L"deadlock\*(R"), and true in all other cases -(which usually means " you should call \f(CW\*(C`ev_run\*(C'\fR again"). -.Sp -Please note that an explicit \f(CW\*(C`ev_break\*(C'\fR is usually better than -relying on all watchers to be stopped when deciding when a program has -finished (especially in interactive programs), but having a program -that automatically loops as long as it has to and no longer by virtue -of relying on its watchers stopping correctly, that is truly a thing of -beauty. -.Sp -This function is \fImostly\fR exception-safe \- you can break out of a -\&\f(CW\*(C`ev_run\*(C'\fR call by calling \f(CW\*(C`longjmp\*(C'\fR in a callback, throwing a \*(C+ -exception and so on. This does not decrement the \f(CW\*(C`ev_depth\*(C'\fR value, nor -will it clear any outstanding \f(CW\*(C`EVBREAK_ONE\*(C'\fR breaks. -.Sp -A flags value of \f(CW\*(C`EVRUN_NOWAIT\*(C'\fR will look for new events, will handle -those events and any already outstanding ones, but will not wait and -block your process in case there are no events and will return after one -iteration of the loop. This is sometimes useful to poll and handle new -events while doing lengthy calculations, to keep the program responsive. -.Sp -A flags value of \f(CW\*(C`EVRUN_ONCE\*(C'\fR will look for new events (waiting if -necessary) and will handle those and any already outstanding ones. It -will block your process until at least one new event arrives (which could -be an event internal to libev itself, so there is no guarantee that a -user-registered callback will be called), and will return after one -iteration of the loop. -.Sp -This is useful if you are waiting for some external event in conjunction -with something not expressible using other libev watchers (i.e. "roll your -own \f(CW\*(C`ev_run\*(C'\fR"). However, a pair of \f(CW\*(C`ev_prepare\*(C'\fR/\f(CW\*(C`ev_check\*(C'\fR watchers is -usually a better approach for this kind of thing. -.Sp -Here are the gory details of what \f(CW\*(C`ev_run\*(C'\fR does (this is for your -understanding, not a guarantee that things will work exactly like this in -future versions): -.Sp -.Vb 10 -\& \- Increment loop depth. -\& \- Reset the ev_break status. -\& \- Before the first iteration, call any pending watchers. -\& LOOP: -\& \- If EVFLAG_FORKCHECK was used, check for a fork. -\& \- If a fork was detected (by any means), queue and call all fork watchers. -\& \- Queue and call all prepare watchers. -\& \- If ev_break was called, goto FINISH. -\& \- If we have been forked, detach and recreate the kernel state -\& as to not disturb the other process. -\& \- Update the kernel state with all outstanding changes. -\& \- Update the "event loop time" (ev_now ()). -\& \- Calculate for how long to sleep or block, if at all -\& (active idle watchers, EVRUN_NOWAIT or not having -\& any active watchers at all will result in not sleeping). -\& \- Sleep if the I/O and timer collect interval say so. -\& \- Increment loop iteration counter. -\& \- Block the process, waiting for any events. -\& \- Queue all outstanding I/O (fd) events. -\& \- Update the "event loop time" (ev_now ()), and do time jump adjustments. -\& \- Queue all expired timers. -\& \- Queue all expired periodics. -\& \- Queue all idle watchers with priority higher than that of pending events. -\& \- Queue all check watchers. -\& \- Call all queued watchers in reverse order (i.e. check watchers first). -\& Signals and child watchers are implemented as I/O watchers, and will -\& be handled here by queueing them when their watcher gets executed. -\& \- If ev_break has been called, or EVRUN_ONCE or EVRUN_NOWAIT -\& were used, or there are no active watchers, goto FINISH, otherwise -\& continue with step LOOP. -\& FINISH: -\& \- Reset the ev_break status iff it was EVBREAK_ONE. -\& \- Decrement the loop depth. -\& \- Return. -.Ve -.Sp -Example: Queue some jobs and then loop until no events are outstanding -anymore. -.Sp -.Vb 4 -\& ... queue jobs here, make sure they register event watchers as long -\& ... as they still have work to do (even an idle watcher will do..) -\& ev_run (my_loop, 0); -\& ... jobs done or somebody called break. yeah! -.Ve -.IP "ev_break (loop, how)" 4 -.IX Item "ev_break (loop, how)" -Can be used to make a call to \f(CW\*(C`ev_run\*(C'\fR return early (but only after it -has processed all outstanding events). The \f(CW\*(C`how\*(C'\fR argument must be either -\&\f(CW\*(C`EVBREAK_ONE\*(C'\fR, which will make the innermost \f(CW\*(C`ev_run\*(C'\fR call return, or -\&\f(CW\*(C`EVBREAK_ALL\*(C'\fR, which will make all nested \f(CW\*(C`ev_run\*(C'\fR calls return. -.Sp -This \*(L"break state\*(R" will be cleared on the next call to \f(CW\*(C`ev_run\*(C'\fR. -.Sp -It is safe to call \f(CW\*(C`ev_break\*(C'\fR from outside any \f(CW\*(C`ev_run\*(C'\fR calls, too, in -which case it will have no effect. -.IP "ev_ref (loop)" 4 -.IX Item "ev_ref (loop)" -.PD 0 -.IP "ev_unref (loop)" 4 -.IX Item "ev_unref (loop)" -.PD -Ref/unref can be used to add or remove a reference count on the event -loop: Every watcher keeps one reference, and as long as the reference -count is nonzero, \f(CW\*(C`ev_run\*(C'\fR will not return on its own. -.Sp -This is useful when you have a watcher that you never intend to -unregister, but that nevertheless should not keep \f(CW\*(C`ev_run\*(C'\fR from -returning. In such a case, call \f(CW\*(C`ev_unref\*(C'\fR after starting, and \f(CW\*(C`ev_ref\*(C'\fR -before stopping it. -.Sp -As an example, libev itself uses this for its internal signal pipe: It -is not visible to the libev user and should not keep \f(CW\*(C`ev_run\*(C'\fR from -exiting if no event watchers registered by it are active. It is also an -excellent way to do this for generic recurring timers or from within -third-party libraries. Just remember to \fIunref after start\fR and \fIref -before stop\fR (but only if the watcher wasn't active before, or was active -before, respectively. Note also that libev might stop watchers itself -(e.g. non-repeating timers) in which case you have to \f(CW\*(C`ev_ref\*(C'\fR -in the callback). -.Sp -Example: Create a signal watcher, but keep it from keeping \f(CW\*(C`ev_run\*(C'\fR -running when nothing else is active. -.Sp -.Vb 4 -\& ev_signal exitsig; -\& ev_signal_init (&exitsig, sig_cb, SIGINT); -\& ev_signal_start (loop, &exitsig); -\& ev_unref (loop); -.Ve -.Sp -Example: For some weird reason, unregister the above signal handler again. -.Sp -.Vb 2 -\& ev_ref (loop); -\& ev_signal_stop (loop, &exitsig); -.Ve -.IP "ev_set_io_collect_interval (loop, ev_tstamp interval)" 4 -.IX Item "ev_set_io_collect_interval (loop, ev_tstamp interval)" -.PD 0 -.IP "ev_set_timeout_collect_interval (loop, ev_tstamp interval)" 4 -.IX Item "ev_set_timeout_collect_interval (loop, ev_tstamp interval)" -.PD -These advanced functions influence the time that libev will spend waiting -for events. Both time intervals are by default \f(CW0\fR, meaning that libev -will try to invoke timer/periodic callbacks and I/O callbacks with minimum -latency. -.Sp -Setting these to a higher value (the \f(CW\*(C`interval\*(C'\fR \fImust\fR be >= \f(CW0\fR) -allows libev to delay invocation of I/O and timer/periodic callbacks -to increase efficiency of loop iterations (or to increase power-saving -opportunities). -.Sp -The idea is that sometimes your program runs just fast enough to handle -one (or very few) event(s) per loop iteration. While this makes the -program responsive, it also wastes a lot of \s-1CPU\s0 time to poll for new -events, especially with backends like \f(CW\*(C`select ()\*(C'\fR which have a high -overhead for the actual polling but can deliver many events at once. -.Sp -By setting a higher \fIio collect interval\fR you allow libev to spend more -time collecting I/O events, so you can handle more events per iteration, -at the cost of increasing latency. Timeouts (both \f(CW\*(C`ev_periodic\*(C'\fR and -\&\f(CW\*(C`ev_timer\*(C'\fR) will not be affected. Setting this to a non-null value will -introduce an additional \f(CW\*(C`ev_sleep ()\*(C'\fR call into most loop iterations. The -sleep time ensures that libev will not poll for I/O events more often then -once per this interval, on average (as long as the host time resolution is -good enough). -.Sp -Likewise, by setting a higher \fItimeout collect interval\fR you allow libev -to spend more time collecting timeouts, at the expense of increased -latency/jitter/inexactness (the watcher callback will be called -later). \f(CW\*(C`ev_io\*(C'\fR watchers will not be affected. Setting this to a non-null -value will not introduce any overhead in libev. -.Sp -Many (busy) programs can usually benefit by setting the I/O collect -interval to a value near \f(CW0.1\fR or so, which is often enough for -interactive servers (of course not for games), likewise for timeouts. It -usually doesn't make much sense to set it to a lower value than \f(CW0.01\fR, -as this approaches the timing granularity of most systems. Note that if -you do transactions with the outside world and you can't increase the -parallelity, then this setting will limit your transaction rate (if you -need to poll once per transaction and the I/O collect interval is 0.01, -then you can't do more than 100 transactions per second). -.Sp -Setting the \fItimeout collect interval\fR can improve the opportunity for -saving power, as the program will \*(L"bundle\*(R" timer callback invocations that -are \*(L"near\*(R" in time together, by delaying some, thus reducing the number of -times the process sleeps and wakes up again. Another useful technique to -reduce iterations/wake\-ups is to use \f(CW\*(C`ev_periodic\*(C'\fR watchers and make sure -they fire on, say, one-second boundaries only. -.Sp -Example: we only need 0.1s timeout granularity, and we wish not to poll -more often than 100 times per second: -.Sp -.Vb 2 -\& ev_set_timeout_collect_interval (EV_DEFAULT_UC_ 0.1); -\& ev_set_io_collect_interval (EV_DEFAULT_UC_ 0.01); -.Ve -.IP "ev_invoke_pending (loop)" 4 -.IX Item "ev_invoke_pending (loop)" -This call will simply invoke all pending watchers while resetting their -pending state. Normally, \f(CW\*(C`ev_run\*(C'\fR does this automatically when required, -but when overriding the invoke callback this call comes handy. This -function can be invoked from a watcher \- this can be useful for example -when you want to do some lengthy calculation and want to pass further -event handling to another thread (you still have to make sure only one -thread executes within \f(CW\*(C`ev_invoke_pending\*(C'\fR or \f(CW\*(C`ev_run\*(C'\fR of course). -.IP "int ev_pending_count (loop)" 4 -.IX Item "int ev_pending_count (loop)" -Returns the number of pending watchers \- zero indicates that no watchers -are pending. -.IP "ev_set_invoke_pending_cb (loop, void (*invoke_pending_cb)(\s-1EV_P\s0))" 4 -.IX Item "ev_set_invoke_pending_cb (loop, void (*invoke_pending_cb)(EV_P))" -This overrides the invoke pending functionality of the loop: Instead of -invoking all pending watchers when there are any, \f(CW\*(C`ev_run\*(C'\fR will call -this callback instead. This is useful, for example, when you want to -invoke the actual watchers inside another context (another thread etc.). -.Sp -If you want to reset the callback, use \f(CW\*(C`ev_invoke_pending\*(C'\fR as new -callback. -.IP "ev_set_loop_release_cb (loop, void (*release)(\s-1EV_P\s0) throw (), void (*acquire)(\s-1EV_P\s0) throw ())" 4 -.IX Item "ev_set_loop_release_cb (loop, void (*release)(EV_P) throw (), void (*acquire)(EV_P) throw ())" -Sometimes you want to share the same loop between multiple threads. This -can be done relatively simply by putting mutex_lock/unlock calls around -each call to a libev function. -.Sp -However, \f(CW\*(C`ev_run\*(C'\fR can run an indefinite time, so it is not feasible -to wait for it to return. One way around this is to wake up the event -loop via \f(CW\*(C`ev_break\*(C'\fR and \f(CW\*(C`ev_async_send\*(C'\fR, another way is to set these -\&\fIrelease\fR and \fIacquire\fR callbacks on the loop. -.Sp -When set, then \f(CW\*(C`release\*(C'\fR will be called just before the thread is -suspended waiting for new events, and \f(CW\*(C`acquire\*(C'\fR is called just -afterwards. -.Sp -Ideally, \f(CW\*(C`release\*(C'\fR will just call your mutex_unlock function, and -\&\f(CW\*(C`acquire\*(C'\fR will just call the mutex_lock function again. -.Sp -While event loop modifications are allowed between invocations of -\&\f(CW\*(C`release\*(C'\fR and \f(CW\*(C`acquire\*(C'\fR (that's their only purpose after all), no -modifications done will affect the event loop, i.e. adding watchers will -have no effect on the set of file descriptors being watched, or the time -waited. Use an \f(CW\*(C`ev_async\*(C'\fR watcher to wake up \f(CW\*(C`ev_run\*(C'\fR when you want it -to take note of any changes you made. -.Sp -In theory, threads executing \f(CW\*(C`ev_run\*(C'\fR will be async-cancel safe between -invocations of \f(CW\*(C`release\*(C'\fR and \f(CW\*(C`acquire\*(C'\fR. -.Sp -See also the locking example in the \f(CW\*(C`THREADS\*(C'\fR section later in this -document. -.IP "ev_set_userdata (loop, void *data)" 4 -.IX Item "ev_set_userdata (loop, void *data)" -.PD 0 -.IP "void *ev_userdata (loop)" 4 -.IX Item "void *ev_userdata (loop)" -.PD -Set and retrieve a single \f(CW\*(C`void *\*(C'\fR associated with a loop. When -\&\f(CW\*(C`ev_set_userdata\*(C'\fR has never been called, then \f(CW\*(C`ev_userdata\*(C'\fR returns -\&\f(CW0\fR. -.Sp -These two functions can be used to associate arbitrary data with a loop, -and are intended solely for the \f(CW\*(C`invoke_pending_cb\*(C'\fR, \f(CW\*(C`release\*(C'\fR and -\&\f(CW\*(C`acquire\*(C'\fR callbacks described above, but of course can be (ab\-)used for -any other purpose as well. -.IP "ev_verify (loop)" 4 -.IX Item "ev_verify (loop)" -This function only does something when \f(CW\*(C`EV_VERIFY\*(C'\fR support has been -compiled in, which is the default for non-minimal builds. It tries to go -through all internal structures and checks them for validity. If anything -is found to be inconsistent, it will print an error message to standard -error and call \f(CW\*(C`abort ()\*(C'\fR. -.Sp -This can be used to catch bugs inside libev itself: under normal -circumstances, this function will never abort as of course libev keeps its -data structures consistent. -.SH "ANATOMY OF A WATCHER" -.IX Header "ANATOMY OF A WATCHER" -In the following description, uppercase \f(CW\*(C`TYPE\*(C'\fR in names stands for the -watcher type, e.g. \f(CW\*(C`ev_TYPE_start\*(C'\fR can mean \f(CW\*(C`ev_timer_start\*(C'\fR for timer -watchers and \f(CW\*(C`ev_io_start\*(C'\fR for I/O watchers. -.PP -A watcher is an opaque structure that you allocate and register to record -your interest in some event. To make a concrete example, imagine you want -to wait for \s-1STDIN\s0 to become readable, you would create an \f(CW\*(C`ev_io\*(C'\fR watcher -for that: -.PP -.Vb 5 -\& static void my_cb (struct ev_loop *loop, ev_io *w, int revents) -\& { -\& ev_io_stop (w); -\& ev_break (loop, EVBREAK_ALL); -\& } -\& -\& struct ev_loop *loop = ev_default_loop (0); -\& -\& ev_io stdin_watcher; -\& -\& ev_init (&stdin_watcher, my_cb); -\& ev_io_set (&stdin_watcher, STDIN_FILENO, EV_READ); -\& ev_io_start (loop, &stdin_watcher); -\& -\& ev_run (loop, 0); -.Ve -.PP -As you can see, you are responsible for allocating the memory for your -watcher structures (and it is \fIusually\fR a bad idea to do this on the -stack). -.PP -Each watcher has an associated watcher structure (called \f(CW\*(C`struct ev_TYPE\*(C'\fR -or simply \f(CW\*(C`ev_TYPE\*(C'\fR, as typedefs are provided for all watcher structs). -.PP -Each watcher structure must be initialised by a call to \f(CW\*(C`ev_init (watcher -*, callback)\*(C'\fR, which expects a callback to be provided. This callback is -invoked each time the event occurs (or, in the case of I/O watchers, each -time the event loop detects that the file descriptor given is readable -and/or writable). -.PP -Each watcher type further has its own \f(CW\*(C`ev_TYPE_set (watcher *, ...)\*(C'\fR -macro to configure it, with arguments specific to the watcher type. There -is also a macro to combine initialisation and setting in one call: \f(CW\*(C`ev_TYPE_init (watcher *, callback, ...)\*(C'\fR. -.PP -To make the watcher actually watch out for events, you have to start it -with a watcher-specific start function (\f(CW\*(C`ev_TYPE_start (loop, watcher -*)\*(C'\fR), and you can stop watching for events at any time by calling the -corresponding stop function (\f(CW\*(C`ev_TYPE_stop (loop, watcher *)\*(C'\fR. -.PP -As long as your watcher is active (has been started but not stopped) you -must not touch the values stored in it except when explicitly documented -otherwise. Most specifically you must never reinitialise it or call its -\&\f(CW\*(C`ev_TYPE_set\*(C'\fR macro. -.PP -Each and every callback receives the event loop pointer as first, the -registered watcher structure as second, and a bitset of received events as -third argument. -.PP -The received events usually include a single bit per event type received -(you can receive multiple events at the same time). The possible bit masks -are: -.ie n .IP """EV_READ""" 4 -.el .IP "\f(CWEV_READ\fR" 4 -.IX Item "EV_READ" -.PD 0 -.ie n .IP """EV_WRITE""" 4 -.el .IP "\f(CWEV_WRITE\fR" 4 -.IX Item "EV_WRITE" -.PD -The file descriptor in the \f(CW\*(C`ev_io\*(C'\fR watcher has become readable and/or -writable. -.ie n .IP """EV_TIMER""" 4 -.el .IP "\f(CWEV_TIMER\fR" 4 -.IX Item "EV_TIMER" -The \f(CW\*(C`ev_timer\*(C'\fR watcher has timed out. -.ie n .IP """EV_PERIODIC""" 4 -.el .IP "\f(CWEV_PERIODIC\fR" 4 -.IX Item "EV_PERIODIC" -The \f(CW\*(C`ev_periodic\*(C'\fR watcher has timed out. -.ie n .IP """EV_SIGNAL""" 4 -.el .IP "\f(CWEV_SIGNAL\fR" 4 -.IX Item "EV_SIGNAL" -The signal specified in the \f(CW\*(C`ev_signal\*(C'\fR watcher has been received by a thread. -.ie n .IP """EV_CHILD""" 4 -.el .IP "\f(CWEV_CHILD\fR" 4 -.IX Item "EV_CHILD" -The pid specified in the \f(CW\*(C`ev_child\*(C'\fR watcher has received a status change. -.ie n .IP """EV_STAT""" 4 -.el .IP "\f(CWEV_STAT\fR" 4 -.IX Item "EV_STAT" -The path specified in the \f(CW\*(C`ev_stat\*(C'\fR watcher changed its attributes somehow. -.ie n .IP """EV_IDLE""" 4 -.el .IP "\f(CWEV_IDLE\fR" 4 -.IX Item "EV_IDLE" -The \f(CW\*(C`ev_idle\*(C'\fR watcher has determined that you have nothing better to do. -.ie n .IP """EV_PREPARE""" 4 -.el .IP "\f(CWEV_PREPARE\fR" 4 -.IX Item "EV_PREPARE" -.PD 0 -.ie n .IP """EV_CHECK""" 4 -.el .IP "\f(CWEV_CHECK\fR" 4 -.IX Item "EV_CHECK" -.PD -All \f(CW\*(C`ev_prepare\*(C'\fR watchers are invoked just \fIbefore\fR \f(CW\*(C`ev_run\*(C'\fR starts to -gather new events, and all \f(CW\*(C`ev_check\*(C'\fR watchers are queued (not invoked) -just after \f(CW\*(C`ev_run\*(C'\fR has gathered them, but before it queues any callbacks -for any received events. That means \f(CW\*(C`ev_prepare\*(C'\fR watchers are the last -watchers invoked before the event loop sleeps or polls for new events, and -\&\f(CW\*(C`ev_check\*(C'\fR watchers will be invoked before any other watchers of the same -or lower priority within an event loop iteration. -.Sp -Callbacks of both watcher types can start and stop as many watchers as -they want, and all of them will be taken into account (for example, a -\&\f(CW\*(C`ev_prepare\*(C'\fR watcher might start an idle watcher to keep \f(CW\*(C`ev_run\*(C'\fR from -blocking). -.ie n .IP """EV_EMBED""" 4 -.el .IP "\f(CWEV_EMBED\fR" 4 -.IX Item "EV_EMBED" -The embedded event loop specified in the \f(CW\*(C`ev_embed\*(C'\fR watcher needs attention. -.ie n .IP """EV_FORK""" 4 -.el .IP "\f(CWEV_FORK\fR" 4 -.IX Item "EV_FORK" -The event loop has been resumed in the child process after fork (see -\&\f(CW\*(C`ev_fork\*(C'\fR). -.ie n .IP """EV_CLEANUP""" 4 -.el .IP "\f(CWEV_CLEANUP\fR" 4 -.IX Item "EV_CLEANUP" -The event loop is about to be destroyed (see \f(CW\*(C`ev_cleanup\*(C'\fR). -.ie n .IP """EV_ASYNC""" 4 -.el .IP "\f(CWEV_ASYNC\fR" 4 -.IX Item "EV_ASYNC" -The given async watcher has been asynchronously notified (see \f(CW\*(C`ev_async\*(C'\fR). -.ie n .IP """EV_CUSTOM""" 4 -.el .IP "\f(CWEV_CUSTOM\fR" 4 -.IX Item "EV_CUSTOM" -Not ever sent (or otherwise used) by libev itself, but can be freely used -by libev users to signal watchers (e.g. via \f(CW\*(C`ev_feed_event\*(C'\fR). -.ie n .IP """EV_ERROR""" 4 -.el .IP "\f(CWEV_ERROR\fR" 4 -.IX Item "EV_ERROR" -An unspecified error has occurred, the watcher has been stopped. This might -happen because the watcher could not be properly started because libev -ran out of memory, a file descriptor was found to be closed or any other -problem. Libev considers these application bugs. -.Sp -You best act on it by reporting the problem and somehow coping with the -watcher being stopped. Note that well-written programs should not receive -an error ever, so when your watcher receives it, this usually indicates a -bug in your program. -.Sp -Libev will usually signal a few \*(L"dummy\*(R" events together with an error, for -example it might indicate that a fd is readable or writable, and if your -callbacks is well-written it can just attempt the operation and cope with -the error from \fBread()\fR or \fBwrite()\fR. This will not work in multi-threaded -programs, though, as the fd could already be closed and reused for another -thing, so beware. -.SS "\s-1GENERIC WATCHER FUNCTIONS\s0" -.IX Subsection "GENERIC WATCHER FUNCTIONS" -.ie n .IP """ev_init"" (ev_TYPE *watcher, callback)" 4 -.el .IP "\f(CWev_init\fR (ev_TYPE *watcher, callback)" 4 -.IX Item "ev_init (ev_TYPE *watcher, callback)" -This macro initialises the generic portion of a watcher. The contents -of the watcher object can be arbitrary (so \f(CW\*(C`malloc\*(C'\fR will do). Only -the generic parts of the watcher are initialised, you \fIneed\fR to call -the type-specific \f(CW\*(C`ev_TYPE_set\*(C'\fR macro afterwards to initialise the -type-specific parts. For each type there is also a \f(CW\*(C`ev_TYPE_init\*(C'\fR macro -which rolls both calls into one. -.Sp -You can reinitialise a watcher at any time as long as it has been stopped -(or never started) and there are no pending events outstanding. -.Sp -The callback is always of type \f(CW\*(C`void (*)(struct ev_loop *loop, ev_TYPE *watcher, -int revents)\*(C'\fR. -.Sp -Example: Initialise an \f(CW\*(C`ev_io\*(C'\fR watcher in two steps. -.Sp -.Vb 3 -\& ev_io w; -\& ev_init (&w, my_cb); -\& ev_io_set (&w, STDIN_FILENO, EV_READ); -.Ve -.ie n .IP """ev_TYPE_set"" (ev_TYPE *watcher, [args])" 4 -.el .IP "\f(CWev_TYPE_set\fR (ev_TYPE *watcher, [args])" 4 -.IX Item "ev_TYPE_set (ev_TYPE *watcher, [args])" -This macro initialises the type-specific parts of a watcher. You need to -call \f(CW\*(C`ev_init\*(C'\fR at least once before you call this macro, but you can -call \f(CW\*(C`ev_TYPE_set\*(C'\fR any number of times. You must not, however, call this -macro on a watcher that is active (it can be pending, however, which is a -difference to the \f(CW\*(C`ev_init\*(C'\fR macro). -.Sp -Although some watcher types do not have type-specific arguments -(e.g. \f(CW\*(C`ev_prepare\*(C'\fR) you still need to call its \f(CW\*(C`set\*(C'\fR macro. -.Sp -See \f(CW\*(C`ev_init\*(C'\fR, above, for an example. -.ie n .IP """ev_TYPE_init"" (ev_TYPE *watcher, callback, [args])" 4 -.el .IP "\f(CWev_TYPE_init\fR (ev_TYPE *watcher, callback, [args])" 4 -.IX Item "ev_TYPE_init (ev_TYPE *watcher, callback, [args])" -This convenience macro rolls both \f(CW\*(C`ev_init\*(C'\fR and \f(CW\*(C`ev_TYPE_set\*(C'\fR macro -calls into a single call. This is the most convenient method to initialise -a watcher. The same limitations apply, of course. -.Sp -Example: Initialise and set an \f(CW\*(C`ev_io\*(C'\fR watcher in one step. -.Sp -.Vb 1 -\& ev_io_init (&w, my_cb, STDIN_FILENO, EV_READ); -.Ve -.ie n .IP """ev_TYPE_start"" (loop, ev_TYPE *watcher)" 4 -.el .IP "\f(CWev_TYPE_start\fR (loop, ev_TYPE *watcher)" 4 -.IX Item "ev_TYPE_start (loop, ev_TYPE *watcher)" -Starts (activates) the given watcher. Only active watchers will receive -events. If the watcher is already active nothing will happen. -.Sp -Example: Start the \f(CW\*(C`ev_io\*(C'\fR watcher that is being abused as example in this -whole section. -.Sp -.Vb 1 -\& ev_io_start (EV_DEFAULT_UC, &w); -.Ve -.ie n .IP """ev_TYPE_stop"" (loop, ev_TYPE *watcher)" 4 -.el .IP "\f(CWev_TYPE_stop\fR (loop, ev_TYPE *watcher)" 4 -.IX Item "ev_TYPE_stop (loop, ev_TYPE *watcher)" -Stops the given watcher if active, and clears the pending status (whether -the watcher was active or not). -.Sp -It is possible that stopped watchers are pending \- for example, -non-repeating timers are being stopped when they become pending \- but -calling \f(CW\*(C`ev_TYPE_stop\*(C'\fR ensures that the watcher is neither active nor -pending. If you want to free or reuse the memory used by the watcher it is -therefore a good idea to always call its \f(CW\*(C`ev_TYPE_stop\*(C'\fR function. -.IP "bool ev_is_active (ev_TYPE *watcher)" 4 -.IX Item "bool ev_is_active (ev_TYPE *watcher)" -Returns a true value iff the watcher is active (i.e. it has been started -and not yet been stopped). As long as a watcher is active you must not modify -it. -.IP "bool ev_is_pending (ev_TYPE *watcher)" 4 -.IX Item "bool ev_is_pending (ev_TYPE *watcher)" -Returns a true value iff the watcher is pending, (i.e. it has outstanding -events but its callback has not yet been invoked). As long as a watcher -is pending (but not active) you must not call an init function on it (but -\&\f(CW\*(C`ev_TYPE_set\*(C'\fR is safe), you must not change its priority, and you must -make sure the watcher is available to libev (e.g. you cannot \f(CW\*(C`free ()\*(C'\fR -it). -.IP "callback ev_cb (ev_TYPE *watcher)" 4 -.IX Item "callback ev_cb (ev_TYPE *watcher)" -Returns the callback currently set on the watcher. -.IP "ev_set_cb (ev_TYPE *watcher, callback)" 4 -.IX Item "ev_set_cb (ev_TYPE *watcher, callback)" -Change the callback. You can change the callback at virtually any time -(modulo threads). -.IP "ev_set_priority (ev_TYPE *watcher, int priority)" 4 -.IX Item "ev_set_priority (ev_TYPE *watcher, int priority)" -.PD 0 -.IP "int ev_priority (ev_TYPE *watcher)" 4 -.IX Item "int ev_priority (ev_TYPE *watcher)" -.PD -Set and query the priority of the watcher. The priority is a small -integer between \f(CW\*(C`EV_MAXPRI\*(C'\fR (default: \f(CW2\fR) and \f(CW\*(C`EV_MINPRI\*(C'\fR -(default: \f(CW\*(C`\-2\*(C'\fR). Pending watchers with higher priority will be invoked -before watchers with lower priority, but priority will not keep watchers -from being executed (except for \f(CW\*(C`ev_idle\*(C'\fR watchers). -.Sp -If you need to suppress invocation when higher priority events are pending -you need to look at \f(CW\*(C`ev_idle\*(C'\fR watchers, which provide this functionality. -.Sp -You \fImust not\fR change the priority of a watcher as long as it is active or -pending. -.Sp -Setting a priority outside the range of \f(CW\*(C`EV_MINPRI\*(C'\fR to \f(CW\*(C`EV_MAXPRI\*(C'\fR is -fine, as long as you do not mind that the priority value you query might -or might not have been clamped to the valid range. -.Sp -The default priority used by watchers when no priority has been set is -always \f(CW0\fR, which is supposed to not be too high and not be too low :). -.Sp -See \*(L"\s-1WATCHER PRIORITY MODELS\*(R"\s0, below, for a more thorough treatment of -priorities. -.IP "ev_invoke (loop, ev_TYPE *watcher, int revents)" 4 -.IX Item "ev_invoke (loop, ev_TYPE *watcher, int revents)" -Invoke the \f(CW\*(C`watcher\*(C'\fR with the given \f(CW\*(C`loop\*(C'\fR and \f(CW\*(C`revents\*(C'\fR. Neither -\&\f(CW\*(C`loop\*(C'\fR nor \f(CW\*(C`revents\*(C'\fR need to be valid as long as the watcher callback -can deal with that fact, as both are simply passed through to the -callback. -.IP "int ev_clear_pending (loop, ev_TYPE *watcher)" 4 -.IX Item "int ev_clear_pending (loop, ev_TYPE *watcher)" -If the watcher is pending, this function clears its pending status and -returns its \f(CW\*(C`revents\*(C'\fR bitset (as if its callback was invoked). If the -watcher isn't pending it does nothing and returns \f(CW0\fR. -.Sp -Sometimes it can be useful to \*(L"poll\*(R" a watcher instead of waiting for its -callback to be invoked, which can be accomplished with this function. -.IP "ev_feed_event (loop, ev_TYPE *watcher, int revents)" 4 -.IX Item "ev_feed_event (loop, ev_TYPE *watcher, int revents)" -Feeds the given event set into the event loop, as if the specified event -had happened for the specified watcher (which must be a pointer to an -initialised but not necessarily started event watcher). Obviously you must -not free the watcher as long as it has pending events. -.Sp -Stopping the watcher, letting libev invoke it, or calling -\&\f(CW\*(C`ev_clear_pending\*(C'\fR will clear the pending event, even if the watcher was -not started in the first place. -.Sp -See also \f(CW\*(C`ev_feed_fd_event\*(C'\fR and \f(CW\*(C`ev_feed_signal_event\*(C'\fR for related -functions that do not need a watcher. -.PP -See also the \*(L"\s-1ASSOCIATING CUSTOM DATA WITH A WATCHER\*(R"\s0 and \*(L"\s-1BUILDING YOUR -OWN COMPOSITE WATCHERS\*(R"\s0 idioms. -.SS "\s-1WATCHER STATES\s0" -.IX Subsection "WATCHER STATES" -There are various watcher states mentioned throughout this manual \- -active, pending and so on. In this section these states and the rules to -transition between them will be described in more detail \- and while these -rules might look complicated, they usually do \*(L"the right thing\*(R". -.IP "initialised" 4 -.IX Item "initialised" -Before a watcher can be registered with the event loop it has to be -initialised. This can be done with a call to \f(CW\*(C`ev_TYPE_init\*(C'\fR, or calls to -\&\f(CW\*(C`ev_init\*(C'\fR followed by the watcher-specific \f(CW\*(C`ev_TYPE_set\*(C'\fR function. -.Sp -In this state it is simply some block of memory that is suitable for -use in an event loop. It can be moved around, freed, reused etc. at -will \- as long as you either keep the memory contents intact, or call -\&\f(CW\*(C`ev_TYPE_init\*(C'\fR again. -.IP "started/running/active" 4 -.IX Item "started/running/active" -Once a watcher has been started with a call to \f(CW\*(C`ev_TYPE_start\*(C'\fR it becomes -property of the event loop, and is actively waiting for events. While in -this state it cannot be accessed (except in a few documented ways), moved, -freed or anything else \- the only legal thing is to keep a pointer to it, -and call libev functions on it that are documented to work on active watchers. -.IP "pending" 4 -.IX Item "pending" -If a watcher is active and libev determines that an event it is interested -in has occurred (such as a timer expiring), it will become pending. It will -stay in this pending state until either it is stopped or its callback is -about to be invoked, so it is not normally pending inside the watcher -callback. -.Sp -The watcher might or might not be active while it is pending (for example, -an expired non-repeating timer can be pending but no longer active). If it -is stopped, it can be freely accessed (e.g. by calling \f(CW\*(C`ev_TYPE_set\*(C'\fR), -but it is still property of the event loop at this time, so cannot be -moved, freed or reused. And if it is active the rules described in the -previous item still apply. -.Sp -It is also possible to feed an event on a watcher that is not active (e.g. -via \f(CW\*(C`ev_feed_event\*(C'\fR), in which case it becomes pending without being -active. -.IP "stopped" 4 -.IX Item "stopped" -A watcher can be stopped implicitly by libev (in which case it might still -be pending), or explicitly by calling its \f(CW\*(C`ev_TYPE_stop\*(C'\fR function. The -latter will clear any pending state the watcher might be in, regardless -of whether it was active or not, so stopping a watcher explicitly before -freeing it is often a good idea. -.Sp -While stopped (and not pending) the watcher is essentially in the -initialised state, that is, it can be reused, moved, modified in any way -you wish (but when you trash the memory block, you need to \f(CW\*(C`ev_TYPE_init\*(C'\fR -it again). -.SS "\s-1WATCHER PRIORITY MODELS\s0" -.IX Subsection "WATCHER PRIORITY MODELS" -Many event loops support \fIwatcher priorities\fR, which are usually small -integers that influence the ordering of event callback invocation -between watchers in some way, all else being equal. -.PP -In libev, watcher priorities can be set using \f(CW\*(C`ev_set_priority\*(C'\fR. See its -description for the more technical details such as the actual priority -range. -.PP -There are two common ways how these these priorities are being interpreted -by event loops: -.PP -In the more common lock-out model, higher priorities \*(L"lock out\*(R" invocation -of lower priority watchers, which means as long as higher priority -watchers receive events, lower priority watchers are not being invoked. -.PP -The less common only-for-ordering model uses priorities solely to order -callback invocation within a single event loop iteration: Higher priority -watchers are invoked before lower priority ones, but they all get invoked -before polling for new events. -.PP -Libev uses the second (only-for-ordering) model for all its watchers -except for idle watchers (which use the lock-out model). -.PP -The rationale behind this is that implementing the lock-out model for -watchers is not well supported by most kernel interfaces, and most event -libraries will just poll for the same events again and again as long as -their callbacks have not been executed, which is very inefficient in the -common case of one high-priority watcher locking out a mass of lower -priority ones. -.PP -Static (ordering) priorities are most useful when you have two or more -watchers handling the same resource: a typical usage example is having an -\&\f(CW\*(C`ev_io\*(C'\fR watcher to receive data, and an associated \f(CW\*(C`ev_timer\*(C'\fR to handle -timeouts. Under load, data might be received while the program handles -other jobs, but since timers normally get invoked first, the timeout -handler will be executed before checking for data. In that case, giving -the timer a lower priority than the I/O watcher ensures that I/O will be -handled first even under adverse conditions (which is usually, but not -always, what you want). -.PP -Since idle watchers use the \*(L"lock-out\*(R" model, meaning that idle watchers -will only be executed when no same or higher priority watchers have -received events, they can be used to implement the \*(L"lock-out\*(R" model when -required. -.PP -For example, to emulate how many other event libraries handle priorities, -you can associate an \f(CW\*(C`ev_idle\*(C'\fR watcher to each such watcher, and in -the normal watcher callback, you just start the idle watcher. The real -processing is done in the idle watcher callback. This causes libev to -continuously poll and process kernel event data for the watcher, but when -the lock-out case is known to be rare (which in turn is rare :), this is -workable. -.PP -Usually, however, the lock-out model implemented that way will perform -miserably under the type of load it was designed to handle. In that case, -it might be preferable to stop the real watcher before starting the -idle watcher, so the kernel will not have to process the event in case -the actual processing will be delayed for considerable time. -.PP -Here is an example of an I/O watcher that should run at a strictly lower -priority than the default, and which should only process data when no -other events are pending: -.PP -.Vb 2 -\& ev_idle idle; // actual processing watcher -\& ev_io io; // actual event watcher -\& -\& static void -\& io_cb (EV_P_ ev_io *w, int revents) -\& { -\& // stop the I/O watcher, we received the event, but -\& // are not yet ready to handle it. -\& ev_io_stop (EV_A_ w); -\& -\& // start the idle watcher to handle the actual event. -\& // it will not be executed as long as other watchers -\& // with the default priority are receiving events. -\& ev_idle_start (EV_A_ &idle); -\& } -\& -\& static void -\& idle_cb (EV_P_ ev_idle *w, int revents) -\& { -\& // actual processing -\& read (STDIN_FILENO, ...); -\& -\& // have to start the I/O watcher again, as -\& // we have handled the event -\& ev_io_start (EV_P_ &io); -\& } -\& -\& // initialisation -\& ev_idle_init (&idle, idle_cb); -\& ev_io_init (&io, io_cb, STDIN_FILENO, EV_READ); -\& ev_io_start (EV_DEFAULT_ &io); -.Ve -.PP -In the \*(L"real\*(R" world, it might also be beneficial to start a timer, so that -low-priority connections can not be locked out forever under load. This -enables your program to keep a lower latency for important connections -during short periods of high load, while not completely locking out less -important ones. -.SH "WATCHER TYPES" -.IX Header "WATCHER TYPES" -This section describes each watcher in detail, but will not repeat -information given in the last section. Any initialisation/set macros, -functions and members specific to the watcher type are explained. -.PP -Most members are additionally marked with either \fI[read\-only]\fR, meaning -that, while the watcher is active, you can look at the member and expect -some sensible content, but you must not modify it (you can modify it while -the watcher is stopped to your hearts content), or \fI[read\-write]\fR, which -means you can expect it to have some sensible content while the watcher is -active, but you can also modify it (within the same thread as the event -loop, i.e. without creating data races). Modifying it may not do something -sensible or take immediate effect (or do anything at all), but libev will -not crash or malfunction in any way. -.PP -In any case, the documentation for each member will explain what the -effects are, and if there are any additional access restrictions. -.ie n .SS """ev_io"" \- is this file descriptor readable or writable?" -.el .SS "\f(CWev_io\fP \- is this file descriptor readable or writable?" -.IX Subsection "ev_io - is this file descriptor readable or writable?" -I/O watchers check whether a file descriptor is readable or writable -in each iteration of the event loop, or, more precisely, when reading -would not block the process and writing would at least be able to write -some data. This behaviour is called level-triggering because you keep -receiving events as long as the condition persists. Remember you can stop -the watcher if you don't want to act on the event and neither want to -receive future events. -.PP -In general you can register as many read and/or write event watchers per -fd as you want (as long as you don't confuse yourself). Setting all file -descriptors to non-blocking mode is also usually a good idea (but not -required if you know what you are doing). -.PP -Another thing you have to watch out for is that it is quite easy to -receive \*(L"spurious\*(R" readiness notifications, that is, your callback might -be called with \f(CW\*(C`EV_READ\*(C'\fR but a subsequent \f(CW\*(C`read\*(C'\fR(2) will actually block -because there is no data. It is very easy to get into this situation even -with a relatively standard program structure. Thus it is best to always -use non-blocking I/O: An extra \f(CW\*(C`read\*(C'\fR(2) returning \f(CW\*(C`EAGAIN\*(C'\fR is far -preferable to a program hanging until some data arrives. -.PP -If you cannot run the fd in non-blocking mode (for example you should -not play around with an Xlib connection), then you have to separately -re-test whether a file descriptor is really ready with a known-to-be good -interface such as poll (fortunately in the case of Xlib, it already does -this on its own, so its quite safe to use). Some people additionally -use \f(CW\*(C`SIGALRM\*(C'\fR and an interval timer, just to be sure you won't block -indefinitely. -.PP -But really, best use non-blocking mode. -.PP -\fIThe special problem of disappearing file descriptors\fR -.IX Subsection "The special problem of disappearing file descriptors" -.PP -Some backends (e.g. kqueue, epoll, linuxaio) need to be told about closing -a file descriptor (either due to calling \f(CW\*(C`close\*(C'\fR explicitly or any other -means, such as \f(CW\*(C`dup2\*(C'\fR). The reason is that you register interest in some -file descriptor, but when it goes away, the operating system will silently -drop this interest. If another file descriptor with the same number then -is registered with libev, there is no efficient way to see that this is, -in fact, a different file descriptor. -.PP -To avoid having to explicitly tell libev about such cases, libev follows -the following policy: Each time \f(CW\*(C`ev_io_set\*(C'\fR is being called, libev -will assume that this is potentially a new file descriptor, otherwise -it is assumed that the file descriptor stays the same. That means that -you \fIhave\fR to call \f(CW\*(C`ev_io_set\*(C'\fR (or \f(CW\*(C`ev_io_init\*(C'\fR) when you change the -descriptor even if the file descriptor number itself did not change. -.PP -This is how one would do it normally anyway, the important point is that -the libev application should not optimise around libev but should leave -optimisations to libev. -.PP -\fIThe special problem of dup'ed file descriptors\fR -.IX Subsection "The special problem of dup'ed file descriptors" -.PP -Some backends (e.g. epoll), cannot register events for file descriptors, -but only events for the underlying file descriptions. That means when you -have \f(CW\*(C`dup ()\*(C'\fR'ed file descriptors or weirder constellations, and register -events for them, only one file descriptor might actually receive events. -.PP -There is no workaround possible except not registering events -for potentially \f(CW\*(C`dup ()\*(C'\fR'ed file descriptors, or to resort to -\&\f(CW\*(C`EVBACKEND_SELECT\*(C'\fR or \f(CW\*(C`EVBACKEND_POLL\*(C'\fR. -.PP -\fIThe special problem of files\fR -.IX Subsection "The special problem of files" -.PP -Many people try to use \f(CW\*(C`select\*(C'\fR (or libev) on file descriptors -representing files, and expect it to become ready when their program -doesn't block on disk accesses (which can take a long time on their own). -.PP -However, this cannot ever work in the \*(L"expected\*(R" way \- you get a readiness -notification as soon as the kernel knows whether and how much data is -there, and in the case of open files, that's always the case, so you -always get a readiness notification instantly, and your read (or possibly -write) will still block on the disk I/O. -.PP -Another way to view it is that in the case of sockets, pipes, character -devices and so on, there is another party (the sender) that delivers data -on its own, but in the case of files, there is no such thing: the disk -will not send data on its own, simply because it doesn't know what you -wish to read \- you would first have to request some data. -.PP -Since files are typically not-so-well supported by advanced notification -mechanism, libev tries hard to emulate \s-1POSIX\s0 behaviour with respect -to files, even though you should not use it. The reason for this is -convenience: sometimes you want to watch \s-1STDIN\s0 or \s-1STDOUT,\s0 which is -usually a tty, often a pipe, but also sometimes files or special devices -(for example, \f(CW\*(C`epoll\*(C'\fR on Linux works with \fI/dev/random\fR but not with -\&\fI/dev/urandom\fR), and even though the file might better be served with -asynchronous I/O instead of with non-blocking I/O, it is still useful when -it \*(L"just works\*(R" instead of freezing. -.PP -So avoid file descriptors pointing to files when you know it (e.g. use -libeio), but use them when it is convenient, e.g. for \s-1STDIN/STDOUT,\s0 or -when you rarely read from a file instead of from a socket, and want to -reuse the same code path. -.PP -\fIThe special problem of fork\fR -.IX Subsection "The special problem of fork" -.PP -Some backends (epoll, kqueue, linuxaio, iouring) do not support \f(CW\*(C`fork ()\*(C'\fR -at all or exhibit useless behaviour. Libev fully supports fork, but needs -to be told about it in the child if you want to continue to use it in the -child. -.PP -To support fork in your child processes, you have to call \f(CW\*(C`ev_loop_fork -()\*(C'\fR after a fork in the child, enable \f(CW\*(C`EVFLAG_FORKCHECK\*(C'\fR, or resort to -\&\f(CW\*(C`EVBACKEND_SELECT\*(C'\fR or \f(CW\*(C`EVBACKEND_POLL\*(C'\fR. -.PP -\fIThe special problem of \s-1SIGPIPE\s0\fR -.IX Subsection "The special problem of SIGPIPE" -.PP -While not really specific to libev, it is easy to forget about \f(CW\*(C`SIGPIPE\*(C'\fR: -when writing to a pipe whose other end has been closed, your program gets -sent a \s-1SIGPIPE,\s0 which, by default, aborts your program. For most programs -this is sensible behaviour, for daemons, this is usually undesirable. -.PP -So when you encounter spurious, unexplained daemon exits, make sure you -ignore \s-1SIGPIPE\s0 (and maybe make sure you log the exit status of your daemon -somewhere, as that would have given you a big clue). -.PP -\fIThe special problem of \f(BIaccept()\fIing when you can't\fR -.IX Subsection "The special problem of accept()ing when you can't" -.PP -Many implementations of the \s-1POSIX\s0 \f(CW\*(C`accept\*(C'\fR function (for example, -found in post\-2004 Linux) have the peculiar behaviour of not removing a -connection from the pending queue in all error cases. -.PP -For example, larger servers often run out of file descriptors (because -of resource limits), causing \f(CW\*(C`accept\*(C'\fR to fail with \f(CW\*(C`ENFILE\*(C'\fR but not -rejecting the connection, leading to libev signalling readiness on -the next iteration again (the connection still exists after all), and -typically causing the program to loop at 100% \s-1CPU\s0 usage. -.PP -Unfortunately, the set of errors that cause this issue differs between -operating systems, there is usually little the app can do to remedy the -situation, and no known thread-safe method of removing the connection to -cope with overload is known (to me). -.PP -One of the easiest ways to handle this situation is to just ignore it -\&\- when the program encounters an overload, it will just loop until the -situation is over. While this is a form of busy waiting, no \s-1OS\s0 offers an -event-based way to handle this situation, so it's the best one can do. -.PP -A better way to handle the situation is to log any errors other than -\&\f(CW\*(C`EAGAIN\*(C'\fR and \f(CW\*(C`EWOULDBLOCK\*(C'\fR, making sure not to flood the log with such -messages, and continue as usual, which at least gives the user an idea of -what could be wrong (\*(L"raise the ulimit!\*(R"). For extra points one could stop -the \f(CW\*(C`ev_io\*(C'\fR watcher on the listening fd \*(L"for a while\*(R", which reduces \s-1CPU\s0 -usage. -.PP -If your program is single-threaded, then you could also keep a dummy file -descriptor for overload situations (e.g. by opening \fI/dev/null\fR), and -when you run into \f(CW\*(C`ENFILE\*(C'\fR or \f(CW\*(C`EMFILE\*(C'\fR, close it, run \f(CW\*(C`accept\*(C'\fR, -close that fd, and create a new dummy fd. This will gracefully refuse -clients under typical overload conditions. -.PP -The last way to handle it is to simply log the error and \f(CW\*(C`exit\*(C'\fR, as -is often done with \f(CW\*(C`malloc\*(C'\fR failures, but this results in an easy -opportunity for a DoS attack. -.PP -\fIWatcher-Specific Functions\fR -.IX Subsection "Watcher-Specific Functions" -.IP "ev_io_init (ev_io *, callback, int fd, int events)" 4 -.IX Item "ev_io_init (ev_io *, callback, int fd, int events)" -.PD 0 -.IP "ev_io_set (ev_io *, int fd, int events)" 4 -.IX Item "ev_io_set (ev_io *, int fd, int events)" -.PD -Configures an \f(CW\*(C`ev_io\*(C'\fR watcher. The \f(CW\*(C`fd\*(C'\fR is the file descriptor to -receive events for and \f(CW\*(C`events\*(C'\fR is either \f(CW\*(C`EV_READ\*(C'\fR, \f(CW\*(C`EV_WRITE\*(C'\fR, both -\&\f(CW\*(C`EV_READ | EV_WRITE\*(C'\fR or \f(CW0\fR, to express the desire to receive the given -events. -.Sp -Note that setting the \f(CW\*(C`events\*(C'\fR to \f(CW0\fR and starting the watcher is -supported, but not specially optimized \- if your program sometimes happens -to generate this combination this is fine, but if it is easy to avoid -starting an io watcher watching for no events you should do so. -.IP "ev_io_modify (ev_io *, int events)" 4 -.IX Item "ev_io_modify (ev_io *, int events)" -Similar to \f(CW\*(C`ev_io_set\*(C'\fR, but only changes the requested events. Using this -might be faster with some backends, as libev can assume that the \f(CW\*(C`fd\*(C'\fR -still refers to the same underlying file description, something it cannot -do when using \f(CW\*(C`ev_io_set\*(C'\fR. -.IP "int fd [no\-modify]" 4 -.IX Item "int fd [no-modify]" -The file descriptor being watched. While it can be read at any time, you -must not modify this member even when the watcher is stopped \- always use -\&\f(CW\*(C`ev_io_set\*(C'\fR for that. -.IP "int events [no\-modify]" 4 -.IX Item "int events [no-modify]" -The set of events the fd is being watched for, among other flags. Remember -that this is a bit set \- to test for \f(CW\*(C`EV_READ\*(C'\fR, use \f(CW\*(C`w\->events & -EV_READ\*(C'\fR, and similarly for \f(CW\*(C`EV_WRITE\*(C'\fR. -.Sp -As with \f(CW\*(C`fd\*(C'\fR, you must not modify this member even when the watcher is -stopped, always use \f(CW\*(C`ev_io_set\*(C'\fR or \f(CW\*(C`ev_io_modify\*(C'\fR for that. -.PP -\fIExamples\fR -.IX Subsection "Examples" -.PP -Example: Call \f(CW\*(C`stdin_readable_cb\*(C'\fR when \s-1STDIN_FILENO\s0 has become, well -readable, but only once. Since it is likely line-buffered, you could -attempt to read a whole line in the callback. -.PP -.Vb 6 -\& static void -\& stdin_readable_cb (struct ev_loop *loop, ev_io *w, int revents) -\& { -\& ev_io_stop (loop, w); -\& .. read from stdin here (or from w\->fd) and handle any I/O errors -\& } -\& -\& ... -\& struct ev_loop *loop = ev_default_init (0); -\& ev_io stdin_readable; -\& ev_io_init (&stdin_readable, stdin_readable_cb, STDIN_FILENO, EV_READ); -\& ev_io_start (loop, &stdin_readable); -\& ev_run (loop, 0); -.Ve -.ie n .SS """ev_timer"" \- relative and optionally repeating timeouts" -.el .SS "\f(CWev_timer\fP \- relative and optionally repeating timeouts" -.IX Subsection "ev_timer - relative and optionally repeating timeouts" -Timer watchers are simple relative timers that generate an event after a -given time, and optionally repeating in regular intervals after that. -.PP -The timers are based on real time, that is, if you register an event that -times out after an hour and you reset your system clock to January last -year, it will still time out after (roughly) one hour. \*(L"Roughly\*(R" because -detecting time jumps is hard, and some inaccuracies are unavoidable (the -monotonic clock option helps a lot here). -.PP -The callback is guaranteed to be invoked only \fIafter\fR its timeout has -passed (not \fIat\fR, so on systems with very low-resolution clocks this -might introduce a small delay, see \*(L"the special problem of being too -early\*(R", below). If multiple timers become ready during the same loop -iteration then the ones with earlier time-out values are invoked before -ones of the same priority with later time-out values (but this is no -longer true when a callback calls \f(CW\*(C`ev_run\*(C'\fR recursively). -.PP -\fIBe smart about timeouts\fR -.IX Subsection "Be smart about timeouts" -.PP -Many real-world problems involve some kind of timeout, usually for error -recovery. A typical example is an \s-1HTTP\s0 request \- if the other side hangs, -you want to raise some error after a while. -.PP -What follows are some ways to handle this problem, from obvious and -inefficient to smart and efficient. -.PP -In the following, a 60 second activity timeout is assumed \- a timeout that -gets reset to 60 seconds each time there is activity (e.g. each time some -data or other life sign was received). -.IP "1. Use a timer and stop, reinitialise and start it on activity." 4 -.IX Item "1. Use a timer and stop, reinitialise and start it on activity." -This is the most obvious, but not the most simple way: In the beginning, -start the watcher: -.Sp -.Vb 2 -\& ev_timer_init (timer, callback, 60., 0.); -\& ev_timer_start (loop, timer); -.Ve -.Sp -Then, each time there is some activity, \f(CW\*(C`ev_timer_stop\*(C'\fR it, initialise it -and start it again: -.Sp -.Vb 3 -\& ev_timer_stop (loop, timer); -\& ev_timer_set (timer, 60., 0.); -\& ev_timer_start (loop, timer); -.Ve -.Sp -This is relatively simple to implement, but means that each time there is -some activity, libev will first have to remove the timer from its internal -data structure and then add it again. Libev tries to be fast, but it's -still not a constant-time operation. -.ie n .IP "2. Use a timer and re-start it with ""ev_timer_again"" inactivity." 4 -.el .IP "2. Use a timer and re-start it with \f(CWev_timer_again\fR inactivity." 4 -.IX Item "2. Use a timer and re-start it with ev_timer_again inactivity." -This is the easiest way, and involves using \f(CW\*(C`ev_timer_again\*(C'\fR instead of -\&\f(CW\*(C`ev_timer_start\*(C'\fR. -.Sp -To implement this, configure an \f(CW\*(C`ev_timer\*(C'\fR with a \f(CW\*(C`repeat\*(C'\fR value -of \f(CW60\fR and then call \f(CW\*(C`ev_timer_again\*(C'\fR at start and each time you -successfully read or write some data. If you go into an idle state where -you do not expect data to travel on the socket, you can \f(CW\*(C`ev_timer_stop\*(C'\fR -the timer, and \f(CW\*(C`ev_timer_again\*(C'\fR will automatically restart it if need be. -.Sp -That means you can ignore both the \f(CW\*(C`ev_timer_start\*(C'\fR function and the -\&\f(CW\*(C`after\*(C'\fR argument to \f(CW\*(C`ev_timer_set\*(C'\fR, and only ever use the \f(CW\*(C`repeat\*(C'\fR -member and \f(CW\*(C`ev_timer_again\*(C'\fR. -.Sp -At start: -.Sp -.Vb 3 -\& ev_init (timer, callback); -\& timer\->repeat = 60.; -\& ev_timer_again (loop, timer); -.Ve -.Sp -Each time there is some activity: -.Sp -.Vb 1 -\& ev_timer_again (loop, timer); -.Ve -.Sp -It is even possible to change the time-out on the fly, regardless of -whether the watcher is active or not: -.Sp -.Vb 2 -\& timer\->repeat = 30.; -\& ev_timer_again (loop, timer); -.Ve -.Sp -This is slightly more efficient then stopping/starting the timer each time -you want to modify its timeout value, as libev does not have to completely -remove and re-insert the timer from/into its internal data structure. -.Sp -It is, however, even simpler than the \*(L"obvious\*(R" way to do it. -.IP "3. Let the timer time out, but then re-arm it as required." 4 -.IX Item "3. Let the timer time out, but then re-arm it as required." -This method is more tricky, but usually most efficient: Most timeouts are -relatively long compared to the intervals between other activity \- in -our example, within 60 seconds, there are usually many I/O events with -associated activity resets. -.Sp -In this case, it would be more efficient to leave the \f(CW\*(C`ev_timer\*(C'\fR alone, -but remember the time of last activity, and check for a real timeout only -within the callback: -.Sp -.Vb 3 -\& ev_tstamp timeout = 60.; -\& ev_tstamp last_activity; // time of last activity -\& ev_timer timer; -\& -\& static void -\& callback (EV_P_ ev_timer *w, int revents) -\& { -\& // calculate when the timeout would happen -\& ev_tstamp after = last_activity \- ev_now (EV_A) + timeout; -\& -\& // if negative, it means we the timeout already occurred -\& if (after < 0.) -\& { -\& // timeout occurred, take action -\& } -\& else -\& { -\& // callback was invoked, but there was some recent -\& // activity. simply restart the timer to time out -\& // after "after" seconds, which is the earliest time -\& // the timeout can occur. -\& ev_timer_set (w, after, 0.); -\& ev_timer_start (EV_A_ w); -\& } -\& } -.Ve -.Sp -To summarise the callback: first calculate in how many seconds the -timeout will occur (by calculating the absolute time when it would occur, -\&\f(CW\*(C`last_activity + timeout\*(C'\fR, and subtracting the current time, \f(CW\*(C`ev_now -(EV_A)\*(C'\fR from that). -.Sp -If this value is negative, then we are already past the timeout, i.e. we -timed out, and need to do whatever is needed in this case. -.Sp -Otherwise, we now the earliest time at which the timeout would trigger, -and simply start the timer with this timeout value. -.Sp -In other words, each time the callback is invoked it will check whether -the timeout occurred. If not, it will simply reschedule itself to check -again at the earliest time it could time out. Rinse. Repeat. -.Sp -This scheme causes more callback invocations (about one every 60 seconds -minus half the average time between activity), but virtually no calls to -libev to change the timeout. -.Sp -To start the machinery, simply initialise the watcher and set -\&\f(CW\*(C`last_activity\*(C'\fR to the current time (meaning there was some activity just -now), then call the callback, which will \*(L"do the right thing\*(R" and start -the timer: -.Sp -.Vb 3 -\& last_activity = ev_now (EV_A); -\& ev_init (&timer, callback); -\& callback (EV_A_ &timer, 0); -.Ve -.Sp -When there is some activity, simply store the current time in -\&\f(CW\*(C`last_activity\*(C'\fR, no libev calls at all: -.Sp -.Vb 2 -\& if (activity detected) -\& last_activity = ev_now (EV_A); -.Ve -.Sp -When your timeout value changes, then the timeout can be changed by simply -providing a new value, stopping the timer and calling the callback, which -will again do the right thing (for example, time out immediately :). -.Sp -.Vb 3 -\& timeout = new_value; -\& ev_timer_stop (EV_A_ &timer); -\& callback (EV_A_ &timer, 0); -.Ve -.Sp -This technique is slightly more complex, but in most cases where the -time-out is unlikely to be triggered, much more efficient. -.IP "4. Wee, just use a double-linked list for your timeouts." 4 -.IX Item "4. Wee, just use a double-linked list for your timeouts." -If there is not one request, but many thousands (millions...), all -employing some kind of timeout with the same timeout value, then one can -do even better: -.Sp -When starting the timeout, calculate the timeout value and put the timeout -at the \fIend\fR of the list. -.Sp -Then use an \f(CW\*(C`ev_timer\*(C'\fR to fire when the timeout at the \fIbeginning\fR of -the list is expected to fire (for example, using the technique #3). -.Sp -When there is some activity, remove the timer from the list, recalculate -the timeout, append it to the end of the list again, and make sure to -update the \f(CW\*(C`ev_timer\*(C'\fR if it was taken from the beginning of the list. -.Sp -This way, one can manage an unlimited number of timeouts in O(1) time for -starting, stopping and updating the timers, at the expense of a major -complication, and having to use a constant timeout. The constant timeout -ensures that the list stays sorted. -.PP -So which method the best? -.PP -Method #2 is a simple no-brain-required solution that is adequate in most -situations. Method #3 requires a bit more thinking, but handles many cases -better, and isn't very complicated either. In most case, choosing either -one is fine, with #3 being better in typical situations. -.PP -Method #1 is almost always a bad idea, and buys you nothing. Method #4 is -rather complicated, but extremely efficient, something that really pays -off after the first million or so of active timers, i.e. it's usually -overkill :) -.PP -\fIThe special problem of being too early\fR -.IX Subsection "The special problem of being too early" -.PP -If you ask a timer to call your callback after three seconds, then -you expect it to be invoked after three seconds \- but of course, this -cannot be guaranteed to infinite precision. Less obviously, it cannot be -guaranteed to any precision by libev \- imagine somebody suspending the -process with a \s-1STOP\s0 signal for a few hours for example. -.PP -So, libev tries to invoke your callback as soon as possible \fIafter\fR the -delay has occurred, but cannot guarantee this. -.PP -A less obvious failure mode is calling your callback too early: many event -loops compare timestamps with a \*(L"elapsed delay >= requested delay\*(R", but -this can cause your callback to be invoked much earlier than you would -expect. -.PP -To see why, imagine a system with a clock that only offers full second -resolution (think windows if you can't come up with a broken enough \s-1OS\s0 -yourself). If you schedule a one-second timer at the time 500.9, then the -event loop will schedule your timeout to elapse at a system time of 500 -(500.9 truncated to the resolution) + 1, or 501. -.PP -If an event library looks at the timeout 0.1s later, it will see \*(L"501 >= -501\*(R" and invoke the callback 0.1s after it was started, even though a -one-second delay was requested \- this is being \*(L"too early\*(R", despite best -intentions. -.PP -This is the reason why libev will never invoke the callback if the elapsed -delay equals the requested delay, but only when the elapsed delay is -larger than the requested delay. In the example above, libev would only invoke -the callback at system time 502, or 1.1s after the timer was started. -.PP -So, while libev cannot guarantee that your callback will be invoked -exactly when requested, it \fIcan\fR and \fIdoes\fR guarantee that the requested -delay has actually elapsed, or in other words, it always errs on the \*(L"too -late\*(R" side of things. -.PP -\fIThe special problem of time updates\fR -.IX Subsection "The special problem of time updates" -.PP -Establishing the current time is a costly operation (it usually takes -at least one system call): \s-1EV\s0 therefore updates its idea of the current -time only before and after \f(CW\*(C`ev_run\*(C'\fR collects new events, which causes a -growing difference between \f(CW\*(C`ev_now ()\*(C'\fR and \f(CW\*(C`ev_time ()\*(C'\fR when handling -lots of events in one iteration. -.PP -The relative timeouts are calculated relative to the \f(CW\*(C`ev_now ()\*(C'\fR -time. This is usually the right thing as this timestamp refers to the time -of the event triggering whatever timeout you are modifying/starting. If -you suspect event processing to be delayed and you \fIneed\fR to base the -timeout on the current time, use something like the following to adjust -for it: -.PP -.Vb 1 -\& ev_timer_set (&timer, after + (ev_time () \- ev_now ()), 0.); -.Ve -.PP -If the event loop is suspended for a long time, you can also force an -update of the time returned by \f(CW\*(C`ev_now ()\*(C'\fR by calling \f(CW\*(C`ev_now_update -()\*(C'\fR, although that will push the event time of all outstanding events -further into the future. -.PP -\fIThe special problem of unsynchronised clocks\fR -.IX Subsection "The special problem of unsynchronised clocks" -.PP -Modern systems have a variety of clocks \- libev itself uses the normal -\&\*(L"wall clock\*(R" clock and, if available, the monotonic clock (to avoid time -jumps). -.PP -Neither of these clocks is synchronised with each other or any other clock -on the system, so \f(CW\*(C`ev_time ()\*(C'\fR might return a considerably different time -than \f(CW\*(C`gettimeofday ()\*(C'\fR or \f(CW\*(C`time ()\*(C'\fR. On a GNU/Linux system, for example, -a call to \f(CW\*(C`gettimeofday\*(C'\fR might return a second count that is one higher -than a directly following call to \f(CW\*(C`time\*(C'\fR. -.PP -The moral of this is to only compare libev-related timestamps with -\&\f(CW\*(C`ev_time ()\*(C'\fR and \f(CW\*(C`ev_now ()\*(C'\fR, at least if you want better precision than -a second or so. -.PP -One more problem arises due to this lack of synchronisation: if libev uses -the system monotonic clock and you compare timestamps from \f(CW\*(C`ev_time\*(C'\fR -or \f(CW\*(C`ev_now\*(C'\fR from when you started your timer and when your callback is -invoked, you will find that sometimes the callback is a bit \*(L"early\*(R". -.PP -This is because \f(CW\*(C`ev_timer\*(C'\fRs work in real time, not wall clock time, so -libev makes sure your callback is not invoked before the delay happened, -\&\fImeasured according to the real time\fR, not the system clock. -.PP -If your timeouts are based on a physical timescale (e.g. \*(L"time out this -connection after 100 seconds\*(R") then this shouldn't bother you as it is -exactly the right behaviour. -.PP -If you want to compare wall clock/system timestamps to your timers, then -you need to use \f(CW\*(C`ev_periodic\*(C'\fRs, as these are based on the wall clock -time, where your comparisons will always generate correct results. -.PP -\fIThe special problems of suspended animation\fR -.IX Subsection "The special problems of suspended animation" -.PP -When you leave the server world it is quite customary to hit machines that -can suspend/hibernate \- what happens to the clocks during such a suspend? -.PP -Some quick tests made with a Linux 2.6.28 indicate that a suspend freezes -all processes, while the clocks (\f(CW\*(C`times\*(C'\fR, \f(CW\*(C`CLOCK_MONOTONIC\*(C'\fR) continue -to run until the system is suspended, but they will not advance while the -system is suspended. That means, on resume, it will be as if the program -was frozen for a few seconds, but the suspend time will not be counted -towards \f(CW\*(C`ev_timer\*(C'\fR when a monotonic clock source is used. The real time -clock advanced as expected, but if it is used as sole clocksource, then a -long suspend would be detected as a time jump by libev, and timers would -be adjusted accordingly. -.PP -I would not be surprised to see different behaviour in different between -operating systems, \s-1OS\s0 versions or even different hardware. -.PP -The other form of suspend (job control, or sending a \s-1SIGSTOP\s0) will see a -time jump in the monotonic clocks and the realtime clock. If the program -is suspended for a very long time, and monotonic clock sources are in use, -then you can expect \f(CW\*(C`ev_timer\*(C'\fRs to expire as the full suspension time -will be counted towards the timers. When no monotonic clock source is in -use, then libev will again assume a timejump and adjust accordingly. -.PP -It might be beneficial for this latter case to call \f(CW\*(C`ev_suspend\*(C'\fR -and \f(CW\*(C`ev_resume\*(C'\fR in code that handles \f(CW\*(C`SIGTSTP\*(C'\fR, to at least get -deterministic behaviour in this case (you can do nothing against -\&\f(CW\*(C`SIGSTOP\*(C'\fR). -.PP -\fIWatcher-Specific Functions and Data Members\fR -.IX Subsection "Watcher-Specific Functions and Data Members" -.IP "ev_timer_init (ev_timer *, callback, ev_tstamp after, ev_tstamp repeat)" 4 -.IX Item "ev_timer_init (ev_timer *, callback, ev_tstamp after, ev_tstamp repeat)" -.PD 0 -.IP "ev_timer_set (ev_timer *, ev_tstamp after, ev_tstamp repeat)" 4 -.IX Item "ev_timer_set (ev_timer *, ev_tstamp after, ev_tstamp repeat)" -.PD -Configure the timer to trigger after \f(CW\*(C`after\*(C'\fR seconds (fractional and -negative values are supported). If \f(CW\*(C`repeat\*(C'\fR is \f(CW0.\fR, then it will -automatically be stopped once the timeout is reached. If it is positive, -then the timer will automatically be configured to trigger again \f(CW\*(C`repeat\*(C'\fR -seconds later, again, and again, until stopped manually. -.Sp -The timer itself will do a best-effort at avoiding drift, that is, if -you configure a timer to trigger every 10 seconds, then it will normally -trigger at exactly 10 second intervals. If, however, your program cannot -keep up with the timer (because it takes longer than those 10 seconds to -do stuff) the timer will not fire more than once per event loop iteration. -.IP "ev_timer_again (loop, ev_timer *)" 4 -.IX Item "ev_timer_again (loop, ev_timer *)" -This will act as if the timer timed out, and restarts it again if it is -repeating. It basically works like calling \f(CW\*(C`ev_timer_stop\*(C'\fR, updating the -timeout to the \f(CW\*(C`repeat\*(C'\fR value and calling \f(CW\*(C`ev_timer_start\*(C'\fR. -.Sp -The exact semantics are as in the following rules, all of which will be -applied to the watcher: -.RS 4 -.IP "If the timer is pending, the pending status is always cleared." 4 -.IX Item "If the timer is pending, the pending status is always cleared." -.PD 0 -.IP "If the timer is started but non-repeating, stop it (as if it timed out, without invoking it)." 4 -.IX Item "If the timer is started but non-repeating, stop it (as if it timed out, without invoking it)." -.ie n .IP "If the timer is repeating, make the ""repeat"" value the new timeout and start the timer, if necessary." 4 -.el .IP "If the timer is repeating, make the \f(CWrepeat\fR value the new timeout and start the timer, if necessary." 4 -.IX Item "If the timer is repeating, make the repeat value the new timeout and start the timer, if necessary." -.RE -.RS 4 -.PD -.Sp -This sounds a bit complicated, see \*(L"Be smart about timeouts\*(R", above, for a -usage example. -.RE -.IP "ev_tstamp ev_timer_remaining (loop, ev_timer *)" 4 -.IX Item "ev_tstamp ev_timer_remaining (loop, ev_timer *)" -Returns the remaining time until a timer fires. If the timer is active, -then this time is relative to the current event loop time, otherwise it's -the timeout value currently configured. -.Sp -That is, after an \f(CW\*(C`ev_timer_set (w, 5, 7)\*(C'\fR, \f(CW\*(C`ev_timer_remaining\*(C'\fR returns -\&\f(CW5\fR. When the timer is started and one second passes, \f(CW\*(C`ev_timer_remaining\*(C'\fR -will return \f(CW4\fR. When the timer expires and is restarted, it will return -roughly \f(CW7\fR (likely slightly less as callback invocation takes some time, -too), and so on. -.IP "ev_tstamp repeat [read\-write]" 4 -.IX Item "ev_tstamp repeat [read-write]" -The current \f(CW\*(C`repeat\*(C'\fR value. Will be used each time the watcher times out -or \f(CW\*(C`ev_timer_again\*(C'\fR is called, and determines the next timeout (if any), -which is also when any modifications are taken into account. -.PP -\fIExamples\fR -.IX Subsection "Examples" -.PP -Example: Create a timer that fires after 60 seconds. -.PP -.Vb 5 -\& static void -\& one_minute_cb (struct ev_loop *loop, ev_timer *w, int revents) -\& { -\& .. one minute over, w is actually stopped right here -\& } -\& -\& ev_timer mytimer; -\& ev_timer_init (&mytimer, one_minute_cb, 60., 0.); -\& ev_timer_start (loop, &mytimer); -.Ve -.PP -Example: Create a timeout timer that times out after 10 seconds of -inactivity. -.PP -.Vb 5 -\& static void -\& timeout_cb (struct ev_loop *loop, ev_timer *w, int revents) -\& { -\& .. ten seconds without any activity -\& } -\& -\& ev_timer mytimer; -\& ev_timer_init (&mytimer, timeout_cb, 0., 10.); /* note, only repeat used */ -\& ev_timer_again (&mytimer); /* start timer */ -\& ev_run (loop, 0); -\& -\& // and in some piece of code that gets executed on any "activity": -\& // reset the timeout to start ticking again at 10 seconds -\& ev_timer_again (&mytimer); -.Ve -.ie n .SS """ev_periodic"" \- to cron or not to cron?" -.el .SS "\f(CWev_periodic\fP \- to cron or not to cron?" -.IX Subsection "ev_periodic - to cron or not to cron?" -Periodic watchers are also timers of a kind, but they are very versatile -(and unfortunately a bit complex). -.PP -Unlike \f(CW\*(C`ev_timer\*(C'\fR, periodic watchers are not based on real time (or -relative time, the physical time that passes) but on wall clock time -(absolute time, the thing you can read on your calendar or clock). The -difference is that wall clock time can run faster or slower than real -time, and time jumps are not uncommon (e.g. when you adjust your -wrist-watch). -.PP -You can tell a periodic watcher to trigger after some specific point -in time: for example, if you tell a periodic watcher to trigger \*(L"in 10 -seconds\*(R" (by specifying e.g. \f(CW\*(C`ev_now () + 10.\*(C'\fR, that is, an absolute time -not a delay) and then reset your system clock to January of the previous -year, then it will take a year or more to trigger the event (unlike an -\&\f(CW\*(C`ev_timer\*(C'\fR, which would still trigger roughly 10 seconds after starting -it, as it uses a relative timeout). -.PP -\&\f(CW\*(C`ev_periodic\*(C'\fR watchers can also be used to implement vastly more complex -timers, such as triggering an event on each \*(L"midnight, local time\*(R", or -other complicated rules. This cannot easily be done with \f(CW\*(C`ev_timer\*(C'\fR -watchers, as those cannot react to time jumps. -.PP -As with timers, the callback is guaranteed to be invoked only when the -point in time where it is supposed to trigger has passed. If multiple -timers become ready during the same loop iteration then the ones with -earlier time-out values are invoked before ones with later time-out values -(but this is no longer true when a callback calls \f(CW\*(C`ev_run\*(C'\fR recursively). -.PP -\fIWatcher-Specific Functions and Data Members\fR -.IX Subsection "Watcher-Specific Functions and Data Members" -.IP "ev_periodic_init (ev_periodic *, callback, ev_tstamp offset, ev_tstamp interval, reschedule_cb)" 4 -.IX Item "ev_periodic_init (ev_periodic *, callback, ev_tstamp offset, ev_tstamp interval, reschedule_cb)" -.PD 0 -.IP "ev_periodic_set (ev_periodic *, ev_tstamp offset, ev_tstamp interval, reschedule_cb)" 4 -.IX Item "ev_periodic_set (ev_periodic *, ev_tstamp offset, ev_tstamp interval, reschedule_cb)" -.PD -Lots of arguments, let's sort it out... There are basically three modes of -operation, and we will explain them from simplest to most complex: -.RS 4 -.IP "\(bu" 4 -absolute timer (offset = absolute time, interval = 0, reschedule_cb = 0) -.Sp -In this configuration the watcher triggers an event after the wall clock -time \f(CW\*(C`offset\*(C'\fR has passed. It will not repeat and will not adjust when a -time jump occurs, that is, if it is to be run at January 1st 2011 then it -will be stopped and invoked when the system clock reaches or surpasses -this point in time. -.IP "\(bu" 4 -repeating interval timer (offset = offset within interval, interval > 0, reschedule_cb = 0) -.Sp -In this mode the watcher will always be scheduled to time out at the next -\&\f(CW\*(C`offset + N * interval\*(C'\fR time (for some integer N, which can also be -negative) and then repeat, regardless of any time jumps. The \f(CW\*(C`offset\*(C'\fR -argument is merely an offset into the \f(CW\*(C`interval\*(C'\fR periods. -.Sp -This can be used to create timers that do not drift with respect to the -system clock, for example, here is an \f(CW\*(C`ev_periodic\*(C'\fR that triggers each -hour, on the hour (with respect to \s-1UTC\s0): -.Sp -.Vb 1 -\& ev_periodic_set (&periodic, 0., 3600., 0); -.Ve -.Sp -This doesn't mean there will always be 3600 seconds in between triggers, -but only that the callback will be called when the system time shows a -full hour (\s-1UTC\s0), or more correctly, when the system time is evenly divisible -by 3600. -.Sp -Another way to think about it (for the mathematically inclined) is that -\&\f(CW\*(C`ev_periodic\*(C'\fR will try to run the callback in this mode at the next possible -time where \f(CW\*(C`time = offset (mod interval)\*(C'\fR, regardless of any time jumps. -.Sp -The \f(CW\*(C`interval\*(C'\fR \fI\s-1MUST\s0\fR be positive, and for numerical stability, the -interval value should be higher than \f(CW\*(C`1/8192\*(C'\fR (which is around 100 -microseconds) and \f(CW\*(C`offset\*(C'\fR should be higher than \f(CW0\fR and should have -at most a similar magnitude as the current time (say, within a factor of -ten). Typical values for offset are, in fact, \f(CW0\fR or something between -\&\f(CW0\fR and \f(CW\*(C`interval\*(C'\fR, which is also the recommended range. -.Sp -Note also that there is an upper limit to how often a timer can fire (\s-1CPU\s0 -speed for example), so if \f(CW\*(C`interval\*(C'\fR is very small then timing stability -will of course deteriorate. Libev itself tries to be exact to be about one -millisecond (if the \s-1OS\s0 supports it and the machine is fast enough). -.IP "\(bu" 4 -manual reschedule mode (offset ignored, interval ignored, reschedule_cb = callback) -.Sp -In this mode the values for \f(CW\*(C`interval\*(C'\fR and \f(CW\*(C`offset\*(C'\fR are both being -ignored. Instead, each time the periodic watcher gets scheduled, the -reschedule callback will be called with the watcher as first, and the -current time as second argument. -.Sp -\&\s-1NOTE:\s0 \fIThis callback \s-1MUST NOT\s0 stop or destroy any periodic watcher, ever, -or make \s-1ANY\s0 other event loop modifications whatsoever, unless explicitly -allowed by documentation here\fR. -.Sp -If you need to stop it, return \f(CW\*(C`now + 1e30\*(C'\fR (or so, fudge fudge) and stop -it afterwards (e.g. by starting an \f(CW\*(C`ev_prepare\*(C'\fR watcher, which is the -only event loop modification you are allowed to do). -.Sp -The callback prototype is \f(CW\*(C`ev_tstamp (*reschedule_cb)(ev_periodic -*w, ev_tstamp now)\*(C'\fR, e.g.: -.Sp -.Vb 5 -\& static ev_tstamp -\& my_rescheduler (ev_periodic *w, ev_tstamp now) -\& { -\& return now + 60.; -\& } -.Ve -.Sp -It must return the next time to trigger, based on the passed time value -(that is, the lowest time value larger than to the second argument). It -will usually be called just before the callback will be triggered, but -might be called at other times, too. -.Sp -\&\s-1NOTE:\s0 \fIThis callback must always return a time that is higher than or -equal to the passed \f(CI\*(C`now\*(C'\fI value\fR. -.Sp -This can be used to create very complex timers, such as a timer that -triggers on \*(L"next midnight, local time\*(R". To do this, you would calculate -the next midnight after \f(CW\*(C`now\*(C'\fR and return the timestamp value for -this. Here is a (completely untested, no error checking) example on how to -do this: -.Sp -.Vb 1 -\& #include -\& -\& static ev_tstamp -\& my_rescheduler (ev_periodic *w, ev_tstamp now) -\& { -\& time_t tnow = (time_t)now; -\& struct tm tm; -\& localtime_r (&tnow, &tm); -\& -\& tm.tm_sec = tm.tm_min = tm.tm_hour = 0; // midnight current day -\& ++tm.tm_mday; // midnight next day -\& -\& return mktime (&tm); -\& } -.Ve -.Sp -Note: this code might run into trouble on days that have more then two -midnights (beginning and end). -.RE -.RS 4 -.RE -.IP "ev_periodic_again (loop, ev_periodic *)" 4 -.IX Item "ev_periodic_again (loop, ev_periodic *)" -Simply stops and restarts the periodic watcher again. This is only useful -when you changed some parameters or the reschedule callback would return -a different time than the last time it was called (e.g. in a crond like -program when the crontabs have changed). -.IP "ev_tstamp ev_periodic_at (ev_periodic *)" 4 -.IX Item "ev_tstamp ev_periodic_at (ev_periodic *)" -When active, returns the absolute time that the watcher is supposed -to trigger next. This is not the same as the \f(CW\*(C`offset\*(C'\fR argument to -\&\f(CW\*(C`ev_periodic_set\*(C'\fR, but indeed works even in interval and manual -rescheduling modes. -.IP "ev_tstamp offset [read\-write]" 4 -.IX Item "ev_tstamp offset [read-write]" -When repeating, this contains the offset value, otherwise this is the -absolute point in time (the \f(CW\*(C`offset\*(C'\fR value passed to \f(CW\*(C`ev_periodic_set\*(C'\fR, -although libev might modify this value for better numerical stability). -.Sp -Can be modified any time, but changes only take effect when the periodic -timer fires or \f(CW\*(C`ev_periodic_again\*(C'\fR is being called. -.IP "ev_tstamp interval [read\-write]" 4 -.IX Item "ev_tstamp interval [read-write]" -The current interval value. Can be modified any time, but changes only -take effect when the periodic timer fires or \f(CW\*(C`ev_periodic_again\*(C'\fR is being -called. -.IP "ev_tstamp (*reschedule_cb)(ev_periodic *w, ev_tstamp now) [read\-write]" 4 -.IX Item "ev_tstamp (*reschedule_cb)(ev_periodic *w, ev_tstamp now) [read-write]" -The current reschedule callback, or \f(CW0\fR, if this functionality is -switched off. Can be changed any time, but changes only take effect when -the periodic timer fires or \f(CW\*(C`ev_periodic_again\*(C'\fR is being called. -.PP -\fIExamples\fR -.IX Subsection "Examples" -.PP -Example: Call a callback every hour, or, more precisely, whenever the -system time is divisible by 3600. The callback invocation times have -potentially a lot of jitter, but good long-term stability. -.PP -.Vb 5 -\& static void -\& clock_cb (struct ev_loop *loop, ev_periodic *w, int revents) -\& { -\& ... its now a full hour (UTC, or TAI or whatever your clock follows) -\& } -\& -\& ev_periodic hourly_tick; -\& ev_periodic_init (&hourly_tick, clock_cb, 0., 3600., 0); -\& ev_periodic_start (loop, &hourly_tick); -.Ve -.PP -Example: The same as above, but use a reschedule callback to do it: -.PP -.Vb 1 -\& #include -\& -\& static ev_tstamp -\& my_scheduler_cb (ev_periodic *w, ev_tstamp now) -\& { -\& return now + (3600. \- fmod (now, 3600.)); -\& } -\& -\& ev_periodic_init (&hourly_tick, clock_cb, 0., 0., my_scheduler_cb); -.Ve -.PP -Example: Call a callback every hour, starting now: -.PP -.Vb 4 -\& ev_periodic hourly_tick; -\& ev_periodic_init (&hourly_tick, clock_cb, -\& fmod (ev_now (loop), 3600.), 3600., 0); -\& ev_periodic_start (loop, &hourly_tick); -.Ve -.ie n .SS """ev_signal"" \- signal me when a signal gets signalled!" -.el .SS "\f(CWev_signal\fP \- signal me when a signal gets signalled!" -.IX Subsection "ev_signal - signal me when a signal gets signalled!" -Signal watchers will trigger an event when the process receives a specific -signal one or more times. Even though signals are very asynchronous, libev -will try its best to deliver signals synchronously, i.e. as part of the -normal event processing, like any other event. -.PP -If you want signals to be delivered truly asynchronously, just use -\&\f(CW\*(C`sigaction\*(C'\fR as you would do without libev and forget about sharing -the signal. You can even use \f(CW\*(C`ev_async\*(C'\fR from a signal handler to -synchronously wake up an event loop. -.PP -You can configure as many watchers as you like for the same signal, but -only within the same loop, i.e. you can watch for \f(CW\*(C`SIGINT\*(C'\fR in your -default loop and for \f(CW\*(C`SIGIO\*(C'\fR in another loop, but you cannot watch for -\&\f(CW\*(C`SIGINT\*(C'\fR in both the default loop and another loop at the same time. At -the moment, \f(CW\*(C`SIGCHLD\*(C'\fR is permanently tied to the default loop. -.PP -Only after the first watcher for a signal is started will libev actually -register something with the kernel. It thus coexists with your own signal -handlers as long as you don't register any with libev for the same signal. -.PP -If possible and supported, libev will install its handlers with -\&\f(CW\*(C`SA_RESTART\*(C'\fR (or equivalent) behaviour enabled, so system calls should -not be unduly interrupted. If you have a problem with system calls getting -interrupted by signals you can block all signals in an \f(CW\*(C`ev_check\*(C'\fR watcher -and unblock them in an \f(CW\*(C`ev_prepare\*(C'\fR watcher. -.PP -\fIThe special problem of inheritance over fork/execve/pthread_create\fR -.IX Subsection "The special problem of inheritance over fork/execve/pthread_create" -.PP -Both the signal mask (\f(CW\*(C`sigprocmask\*(C'\fR) and the signal disposition -(\f(CW\*(C`sigaction\*(C'\fR) are unspecified after starting a signal watcher (and after -stopping it again), that is, libev might or might not block the signal, -and might or might not set or restore the installed signal handler (but -see \f(CW\*(C`EVFLAG_NOSIGMASK\*(C'\fR). -.PP -While this does not matter for the signal disposition (libev never -sets signals to \f(CW\*(C`SIG_IGN\*(C'\fR, so handlers will be reset to \f(CW\*(C`SIG_DFL\*(C'\fR on -\&\f(CW\*(C`execve\*(C'\fR), this matters for the signal mask: many programs do not expect -certain signals to be blocked. -.PP -This means that before calling \f(CW\*(C`exec\*(C'\fR (from the child) you should reset -the signal mask to whatever \*(L"default\*(R" you expect (all clear is a good -choice usually). -.PP -The simplest way to ensure that the signal mask is reset in the child is -to install a fork handler with \f(CW\*(C`pthread_atfork\*(C'\fR that resets it. That will -catch fork calls done by libraries (such as the libc) as well. -.PP -In current versions of libev, the signal will not be blocked indefinitely -unless you use the \f(CW\*(C`signalfd\*(C'\fR \s-1API\s0 (\f(CW\*(C`EV_SIGNALFD\*(C'\fR). While this reduces -the window of opportunity for problems, it will not go away, as libev -\&\fIhas\fR to modify the signal mask, at least temporarily. -.PP -So I can't stress this enough: \fIIf you do not reset your signal mask when -you expect it to be empty, you have a race condition in your code\fR. This -is not a libev-specific thing, this is true for most event libraries. -.PP -\fIThe special problem of threads signal handling\fR -.IX Subsection "The special problem of threads signal handling" -.PP -\&\s-1POSIX\s0 threads has problematic signal handling semantics, specifically, -a lot of functionality (sigfd, sigwait etc.) only really works if all -threads in a process block signals, which is hard to achieve. -.PP -When you want to use sigwait (or mix libev signal handling with your own -for the same signals), you can tackle this problem by globally blocking -all signals before creating any threads (or creating them with a fully set -sigprocmask) and also specifying the \f(CW\*(C`EVFLAG_NOSIGMASK\*(C'\fR when creating -loops. Then designate one thread as \*(L"signal receiver thread\*(R" which handles -these signals. You can pass on any signals that libev might be interested -in by calling \f(CW\*(C`ev_feed_signal\*(C'\fR. -.PP -\fIWatcher-Specific Functions and Data Members\fR -.IX Subsection "Watcher-Specific Functions and Data Members" -.IP "ev_signal_init (ev_signal *, callback, int signum)" 4 -.IX Item "ev_signal_init (ev_signal *, callback, int signum)" -.PD 0 -.IP "ev_signal_set (ev_signal *, int signum)" 4 -.IX Item "ev_signal_set (ev_signal *, int signum)" -.PD -Configures the watcher to trigger on the given signal number (usually one -of the \f(CW\*(C`SIGxxx\*(C'\fR constants). -.IP "int signum [read\-only]" 4 -.IX Item "int signum [read-only]" -The signal the watcher watches out for. -.PP -\fIExamples\fR -.IX Subsection "Examples" -.PP -Example: Try to exit cleanly on \s-1SIGINT.\s0 -.PP -.Vb 5 -\& static void -\& sigint_cb (struct ev_loop *loop, ev_signal *w, int revents) -\& { -\& ev_break (loop, EVBREAK_ALL); -\& } -\& -\& ev_signal signal_watcher; -\& ev_signal_init (&signal_watcher, sigint_cb, SIGINT); -\& ev_signal_start (loop, &signal_watcher); -.Ve -.ie n .SS """ev_child"" \- watch out for process status changes" -.el .SS "\f(CWev_child\fP \- watch out for process status changes" -.IX Subsection "ev_child - watch out for process status changes" -Child watchers trigger when your process receives a \s-1SIGCHLD\s0 in response to -some child status changes (most typically when a child of yours dies or -exits). It is permissible to install a child watcher \fIafter\fR the child -has been forked (which implies it might have already exited), as long -as the event loop isn't entered (or is continued from a watcher), i.e., -forking and then immediately registering a watcher for the child is fine, -but forking and registering a watcher a few event loop iterations later or -in the next callback invocation is not. -.PP -Only the default event loop is capable of handling signals, and therefore -you can only register child watchers in the default event loop. -.PP -Due to some design glitches inside libev, child watchers will always be -handled at maximum priority (their priority is set to \f(CW\*(C`EV_MAXPRI\*(C'\fR by -libev) -.PP -\fIProcess Interaction\fR -.IX Subsection "Process Interaction" -.PP -Libev grabs \f(CW\*(C`SIGCHLD\*(C'\fR as soon as the default event loop is -initialised. This is necessary to guarantee proper behaviour even if the -first child watcher is started after the child exits. The occurrence -of \f(CW\*(C`SIGCHLD\*(C'\fR is recorded asynchronously, but child reaping is done -synchronously as part of the event loop processing. Libev always reaps all -children, even ones not watched. -.PP -\fIOverriding the Built-In Processing\fR -.IX Subsection "Overriding the Built-In Processing" -.PP -Libev offers no special support for overriding the built-in child -processing, but if your application collides with libev's default child -handler, you can override it easily by installing your own handler for -\&\f(CW\*(C`SIGCHLD\*(C'\fR after initialising the default loop, and making sure the -default loop never gets destroyed. You are encouraged, however, to use an -event-based approach to child reaping and thus use libev's support for -that, so other libev users can use \f(CW\*(C`ev_child\*(C'\fR watchers freely. -.PP -\fIStopping the Child Watcher\fR -.IX Subsection "Stopping the Child Watcher" -.PP -Currently, the child watcher never gets stopped, even when the -child terminates, so normally one needs to stop the watcher in the -callback. Future versions of libev might stop the watcher automatically -when a child exit is detected (calling \f(CW\*(C`ev_child_stop\*(C'\fR twice is not a -problem). -.PP -\fIWatcher-Specific Functions and Data Members\fR -.IX Subsection "Watcher-Specific Functions and Data Members" -.IP "ev_child_init (ev_child *, callback, int pid, int trace)" 4 -.IX Item "ev_child_init (ev_child *, callback, int pid, int trace)" -.PD 0 -.IP "ev_child_set (ev_child *, int pid, int trace)" 4 -.IX Item "ev_child_set (ev_child *, int pid, int trace)" -.PD -Configures the watcher to wait for status changes of process \f(CW\*(C`pid\*(C'\fR (or -\&\fIany\fR process if \f(CW\*(C`pid\*(C'\fR is specified as \f(CW0\fR). The callback can look -at the \f(CW\*(C`rstatus\*(C'\fR member of the \f(CW\*(C`ev_child\*(C'\fR watcher structure to see -the status word (use the macros from \f(CW\*(C`sys/wait.h\*(C'\fR and see your systems -\&\f(CW\*(C`waitpid\*(C'\fR documentation). The \f(CW\*(C`rpid\*(C'\fR member contains the pid of the -process causing the status change. \f(CW\*(C`trace\*(C'\fR must be either \f(CW0\fR (only -activate the watcher when the process terminates) or \f(CW1\fR (additionally -activate the watcher when the process is stopped or continued). -.IP "int pid [read\-only]" 4 -.IX Item "int pid [read-only]" -The process id this watcher watches out for, or \f(CW0\fR, meaning any process id. -.IP "int rpid [read\-write]" 4 -.IX Item "int rpid [read-write]" -The process id that detected a status change. -.IP "int rstatus [read\-write]" 4 -.IX Item "int rstatus [read-write]" -The process exit/trace status caused by \f(CW\*(C`rpid\*(C'\fR (see your systems -\&\f(CW\*(C`waitpid\*(C'\fR and \f(CW\*(C`sys/wait.h\*(C'\fR documentation for details). -.PP -\fIExamples\fR -.IX Subsection "Examples" -.PP -Example: \f(CW\*(C`fork()\*(C'\fR a new process and install a child handler to wait for -its completion. -.PP -.Vb 1 -\& ev_child cw; -\& -\& static void -\& child_cb (EV_P_ ev_child *w, int revents) -\& { -\& ev_child_stop (EV_A_ w); -\& printf ("process %d exited with status %x\en", w\->rpid, w\->rstatus); -\& } -\& -\& pid_t pid = fork (); -\& -\& if (pid < 0) -\& // error -\& else if (pid == 0) -\& { -\& // the forked child executes here -\& exit (1); -\& } -\& else -\& { -\& ev_child_init (&cw, child_cb, pid, 0); -\& ev_child_start (EV_DEFAULT_ &cw); -\& } -.Ve -.ie n .SS """ev_stat"" \- did the file attributes just change?" -.el .SS "\f(CWev_stat\fP \- did the file attributes just change?" -.IX Subsection "ev_stat - did the file attributes just change?" -This watches a file system path for attribute changes. That is, it calls -\&\f(CW\*(C`stat\*(C'\fR on that path in regular intervals (or when the \s-1OS\s0 says it changed) -and sees if it changed compared to the last time, invoking the callback -if it did. Starting the watcher \f(CW\*(C`stat\*(C'\fR's the file, so only changes that -happen after the watcher has been started will be reported. -.PP -The path does not need to exist: changing from \*(L"path exists\*(R" to \*(L"path does -not exist\*(R" is a status change like any other. The condition \*(L"path does not -exist\*(R" (or more correctly \*(L"path cannot be stat'ed\*(R") is signified by the -\&\f(CW\*(C`st_nlink\*(C'\fR field being zero (which is otherwise always forced to be at -least one) and all the other fields of the stat buffer having unspecified -contents. -.PP -The path \fImust not\fR end in a slash or contain special components such as -\&\f(CW\*(C`.\*(C'\fR or \f(CW\*(C`..\*(C'\fR. The path \fIshould\fR be absolute: If it is relative and -your working directory changes, then the behaviour is undefined. -.PP -Since there is no portable change notification interface available, the -portable implementation simply calls \f(CWstat(2)\fR regularly on the path -to see if it changed somehow. You can specify a recommended polling -interval for this case. If you specify a polling interval of \f(CW0\fR (highly -recommended!) then a \fIsuitable, unspecified default\fR value will be used -(which you can expect to be around five seconds, although this might -change dynamically). Libev will also impose a minimum interval which is -currently around \f(CW0.1\fR, but that's usually overkill. -.PP -This watcher type is not meant for massive numbers of stat watchers, -as even with OS-supported change notifications, this can be -resource-intensive. -.PP -At the time of this writing, the only OS-specific interface implemented -is the Linux inotify interface (implementing kqueue support is left as an -exercise for the reader. Note, however, that the author sees no way of -implementing \f(CW\*(C`ev_stat\*(C'\fR semantics with kqueue, except as a hint). -.PP -\fI\s-1ABI\s0 Issues (Largefile Support)\fR -.IX Subsection "ABI Issues (Largefile Support)" -.PP -Libev by default (unless the user overrides this) uses the default -compilation environment, which means that on systems with large file -support disabled by default, you get the 32 bit version of the stat -structure. When using the library from programs that change the \s-1ABI\s0 to -use 64 bit file offsets the programs will fail. In that case you have to -compile libev with the same flags to get binary compatibility. This is -obviously the case with any flags that change the \s-1ABI,\s0 but the problem is -most noticeably displayed with ev_stat and large file support. -.PP -The solution for this is to lobby your distribution maker to make large -file interfaces available by default (as e.g. FreeBSD does) and not -optional. Libev cannot simply switch on large file support because it has -to exchange stat structures with application programs compiled using the -default compilation environment. -.PP -\fIInotify and Kqueue\fR -.IX Subsection "Inotify and Kqueue" -.PP -When \f(CW\*(C`inotify (7)\*(C'\fR support has been compiled into libev and present at -runtime, it will be used to speed up change detection where possible. The -inotify descriptor will be created lazily when the first \f(CW\*(C`ev_stat\*(C'\fR -watcher is being started. -.PP -Inotify presence does not change the semantics of \f(CW\*(C`ev_stat\*(C'\fR watchers -except that changes might be detected earlier, and in some cases, to avoid -making regular \f(CW\*(C`stat\*(C'\fR calls. Even in the presence of inotify support -there are many cases where libev has to resort to regular \f(CW\*(C`stat\*(C'\fR polling, -but as long as kernel 2.6.25 or newer is used (2.6.24 and older have too -many bugs), the path exists (i.e. stat succeeds), and the path resides on -a local filesystem (libev currently assumes only ext2/3, jfs, reiserfs and -xfs are fully working) libev usually gets away without polling. -.PP -There is no support for kqueue, as apparently it cannot be used to -implement this functionality, due to the requirement of having a file -descriptor open on the object at all times, and detecting renames, unlinks -etc. is difficult. -.PP -\fI\f(CI\*(C`stat ()\*(C'\fI is a synchronous operation\fR -.IX Subsection "stat () is a synchronous operation" -.PP -Libev doesn't normally do any kind of I/O itself, and so is not blocking -the process. The exception are \f(CW\*(C`ev_stat\*(C'\fR watchers \- those call \f(CW\*(C`stat -()\*(C'\fR, which is a synchronous operation. -.PP -For local paths, this usually doesn't matter: unless the system is very -busy or the intervals between stat's are large, a stat call will be fast, -as the path data is usually in memory already (except when starting the -watcher). -.PP -For networked file systems, calling \f(CW\*(C`stat ()\*(C'\fR can block an indefinite -time due to network issues, and even under good conditions, a stat call -often takes multiple milliseconds. -.PP -Therefore, it is best to avoid using \f(CW\*(C`ev_stat\*(C'\fR watchers on networked -paths, although this is fully supported by libev. -.PP -\fIThe special problem of stat time resolution\fR -.IX Subsection "The special problem of stat time resolution" -.PP -The \f(CW\*(C`stat ()\*(C'\fR system call only supports full-second resolution portably, -and even on systems where the resolution is higher, most file systems -still only support whole seconds. -.PP -That means that, if the time is the only thing that changes, you can -easily miss updates: on the first update, \f(CW\*(C`ev_stat\*(C'\fR detects a change and -calls your callback, which does something. When there is another update -within the same second, \f(CW\*(C`ev_stat\*(C'\fR will be unable to detect unless the -stat data does change in other ways (e.g. file size). -.PP -The solution to this is to delay acting on a change for slightly more -than a second (or till slightly after the next full second boundary), using -a roughly one-second-delay \f(CW\*(C`ev_timer\*(C'\fR (e.g. \f(CW\*(C`ev_timer_set (w, 0., 1.02); -ev_timer_again (loop, w)\*(C'\fR). -.PP -The \f(CW.02\fR offset is added to work around small timing inconsistencies -of some operating systems (where the second counter of the current time -might be be delayed. One such system is the Linux kernel, where a call to -\&\f(CW\*(C`gettimeofday\*(C'\fR might return a timestamp with a full second later than -a subsequent \f(CW\*(C`time\*(C'\fR call \- if the equivalent of \f(CW\*(C`time ()\*(C'\fR is used to -update file times then there will be a small window where the kernel uses -the previous second to update file times but libev might already execute -the timer callback). -.PP -\fIWatcher-Specific Functions and Data Members\fR -.IX Subsection "Watcher-Specific Functions and Data Members" -.IP "ev_stat_init (ev_stat *, callback, const char *path, ev_tstamp interval)" 4 -.IX Item "ev_stat_init (ev_stat *, callback, const char *path, ev_tstamp interval)" -.PD 0 -.IP "ev_stat_set (ev_stat *, const char *path, ev_tstamp interval)" 4 -.IX Item "ev_stat_set (ev_stat *, const char *path, ev_tstamp interval)" -.PD -Configures the watcher to wait for status changes of the given -\&\f(CW\*(C`path\*(C'\fR. The \f(CW\*(C`interval\*(C'\fR is a hint on how quickly a change is expected to -be detected and should normally be specified as \f(CW0\fR to let libev choose -a suitable value. The memory pointed to by \f(CW\*(C`path\*(C'\fR must point to the same -path for as long as the watcher is active. -.Sp -The callback will receive an \f(CW\*(C`EV_STAT\*(C'\fR event when a change was detected, -relative to the attributes at the time the watcher was started (or the -last change was detected). -.IP "ev_stat_stat (loop, ev_stat *)" 4 -.IX Item "ev_stat_stat (loop, ev_stat *)" -Updates the stat buffer immediately with new values. If you change the -watched path in your callback, you could call this function to avoid -detecting this change (while introducing a race condition if you are not -the only one changing the path). Can also be useful simply to find out the -new values. -.IP "ev_statdata attr [read\-only]" 4 -.IX Item "ev_statdata attr [read-only]" -The most-recently detected attributes of the file. Although the type is -\&\f(CW\*(C`ev_statdata\*(C'\fR, this is usually the (or one of the) \f(CW\*(C`struct stat\*(C'\fR types -suitable for your system, but you can only rely on the POSIX-standardised -members to be present. If the \f(CW\*(C`st_nlink\*(C'\fR member is \f(CW0\fR, then there was -some error while \f(CW\*(C`stat\*(C'\fRing the file. -.IP "ev_statdata prev [read\-only]" 4 -.IX Item "ev_statdata prev [read-only]" -The previous attributes of the file. The callback gets invoked whenever -\&\f(CW\*(C`prev\*(C'\fR != \f(CW\*(C`attr\*(C'\fR, or, more precisely, one or more of these members -differ: \f(CW\*(C`st_dev\*(C'\fR, \f(CW\*(C`st_ino\*(C'\fR, \f(CW\*(C`st_mode\*(C'\fR, \f(CW\*(C`st_nlink\*(C'\fR, \f(CW\*(C`st_uid\*(C'\fR, -\&\f(CW\*(C`st_gid\*(C'\fR, \f(CW\*(C`st_rdev\*(C'\fR, \f(CW\*(C`st_size\*(C'\fR, \f(CW\*(C`st_atime\*(C'\fR, \f(CW\*(C`st_mtime\*(C'\fR, \f(CW\*(C`st_ctime\*(C'\fR. -.IP "ev_tstamp interval [read\-only]" 4 -.IX Item "ev_tstamp interval [read-only]" -The specified interval. -.IP "const char *path [read\-only]" 4 -.IX Item "const char *path [read-only]" -The file system path that is being watched. -.PP -\fIExamples\fR -.IX Subsection "Examples" -.PP -Example: Watch \f(CW\*(C`/etc/passwd\*(C'\fR for attribute changes. -.PP -.Vb 10 -\& static void -\& passwd_cb (struct ev_loop *loop, ev_stat *w, int revents) -\& { -\& /* /etc/passwd changed in some way */ -\& if (w\->attr.st_nlink) -\& { -\& printf ("passwd current size %ld\en", (long)w\->attr.st_size); -\& printf ("passwd current atime %ld\en", (long)w\->attr.st_mtime); -\& printf ("passwd current mtime %ld\en", (long)w\->attr.st_mtime); -\& } -\& else -\& /* you shalt not abuse printf for puts */ -\& puts ("wow, /etc/passwd is not there, expect problems. " -\& "if this is windows, they already arrived\en"); -\& } -\& -\& ... -\& ev_stat passwd; -\& -\& ev_stat_init (&passwd, passwd_cb, "/etc/passwd", 0.); -\& ev_stat_start (loop, &passwd); -.Ve -.PP -Example: Like above, but additionally use a one-second delay so we do not -miss updates (however, frequent updates will delay processing, too, so -one might do the work both on \f(CW\*(C`ev_stat\*(C'\fR callback invocation \fIand\fR on -\&\f(CW\*(C`ev_timer\*(C'\fR callback invocation). -.PP -.Vb 2 -\& static ev_stat passwd; -\& static ev_timer timer; -\& -\& static void -\& timer_cb (EV_P_ ev_timer *w, int revents) -\& { -\& ev_timer_stop (EV_A_ w); -\& -\& /* now it\*(Aqs one second after the most recent passwd change */ -\& } -\& -\& static void -\& stat_cb (EV_P_ ev_stat *w, int revents) -\& { -\& /* reset the one\-second timer */ -\& ev_timer_again (EV_A_ &timer); -\& } -\& -\& ... -\& ev_stat_init (&passwd, stat_cb, "/etc/passwd", 0.); -\& ev_stat_start (loop, &passwd); -\& ev_timer_init (&timer, timer_cb, 0., 1.02); -.Ve -.ie n .SS """ev_idle"" \- when you've got nothing better to do..." -.el .SS "\f(CWev_idle\fP \- when you've got nothing better to do..." -.IX Subsection "ev_idle - when you've got nothing better to do..." -Idle watchers trigger events when no other events of the same or higher -priority are pending (prepare, check and other idle watchers do not count -as receiving \*(L"events\*(R"). -.PP -That is, as long as your process is busy handling sockets or timeouts -(or even signals, imagine) of the same or higher priority it will not be -triggered. But when your process is idle (or only lower-priority watchers -are pending), the idle watchers are being called once per event loop -iteration \- until stopped, that is, or your process receives more events -and becomes busy again with higher priority stuff. -.PP -The most noteworthy effect is that as long as any idle watchers are -active, the process will not block when waiting for new events. -.PP -Apart from keeping your process non-blocking (which is a useful -effect on its own sometimes), idle watchers are a good place to do -\&\*(L"pseudo-background processing\*(R", or delay processing stuff to after the -event loop has handled all outstanding events. -.PP -\fIAbusing an \f(CI\*(C`ev_idle\*(C'\fI watcher for its side-effect\fR -.IX Subsection "Abusing an ev_idle watcher for its side-effect" -.PP -As long as there is at least one active idle watcher, libev will never -sleep unnecessarily. Or in other words, it will loop as fast as possible. -For this to work, the idle watcher doesn't need to be invoked at all \- the -lowest priority will do. -.PP -This mode of operation can be useful together with an \f(CW\*(C`ev_check\*(C'\fR watcher, -to do something on each event loop iteration \- for example to balance load -between different connections. -.PP -See \*(L"Abusing an ev_check watcher for its side-effect\*(R" for a longer -example. -.PP -\fIWatcher-Specific Functions and Data Members\fR -.IX Subsection "Watcher-Specific Functions and Data Members" -.IP "ev_idle_init (ev_idle *, callback)" 4 -.IX Item "ev_idle_init (ev_idle *, callback)" -Initialises and configures the idle watcher \- it has no parameters of any -kind. There is a \f(CW\*(C`ev_idle_set\*(C'\fR macro, but using it is utterly pointless, -believe me. -.PP -\fIExamples\fR -.IX Subsection "Examples" -.PP -Example: Dynamically allocate an \f(CW\*(C`ev_idle\*(C'\fR watcher, start it, and in the -callback, free it. Also, use no error checking, as usual. -.PP -.Vb 5 -\& static void -\& idle_cb (struct ev_loop *loop, ev_idle *w, int revents) -\& { -\& // stop the watcher -\& ev_idle_stop (loop, w); -\& -\& // now we can free it -\& free (w); -\& -\& // now do something you wanted to do when the program has -\& // no longer anything immediate to do. -\& } -\& -\& ev_idle *idle_watcher = malloc (sizeof (ev_idle)); -\& ev_idle_init (idle_watcher, idle_cb); -\& ev_idle_start (loop, idle_watcher); -.Ve -.ie n .SS """ev_prepare"" and ""ev_check"" \- customise your event loop!" -.el .SS "\f(CWev_prepare\fP and \f(CWev_check\fP \- customise your event loop!" -.IX Subsection "ev_prepare and ev_check - customise your event loop!" -Prepare and check watchers are often (but not always) used in pairs: -prepare watchers get invoked before the process blocks and check watchers -afterwards. -.PP -You \fImust not\fR call \f(CW\*(C`ev_run\*(C'\fR (or similar functions that enter the -current event loop) or \f(CW\*(C`ev_loop_fork\*(C'\fR from either \f(CW\*(C`ev_prepare\*(C'\fR or -\&\f(CW\*(C`ev_check\*(C'\fR watchers. Other loops than the current one are fine, -however. The rationale behind this is that you do not need to check -for recursion in those watchers, i.e. the sequence will always be -\&\f(CW\*(C`ev_prepare\*(C'\fR, blocking, \f(CW\*(C`ev_check\*(C'\fR so if you have one watcher of each -kind they will always be called in pairs bracketing the blocking call. -.PP -Their main purpose is to integrate other event mechanisms into libev and -their use is somewhat advanced. They could be used, for example, to track -variable changes, implement your own watchers, integrate net-snmp or a -coroutine library and lots more. They are also occasionally useful if -you cache some data and want to flush it before blocking (for example, -in X programs you might want to do an \f(CW\*(C`XFlush ()\*(C'\fR in an \f(CW\*(C`ev_prepare\*(C'\fR -watcher). -.PP -This is done by examining in each prepare call which file descriptors -need to be watched by the other library, registering \f(CW\*(C`ev_io\*(C'\fR watchers -for them and starting an \f(CW\*(C`ev_timer\*(C'\fR watcher for any timeouts (many -libraries provide exactly this functionality). Then, in the check watcher, -you check for any events that occurred (by checking the pending status -of all watchers and stopping them) and call back into the library. The -I/O and timer callbacks will never actually be called (but must be valid -nevertheless, because you never know, you know?). -.PP -As another example, the Perl Coro module uses these hooks to integrate -coroutines into libev programs, by yielding to other active coroutines -during each prepare and only letting the process block if no coroutines -are ready to run (it's actually more complicated: it only runs coroutines -with priority higher than or equal to the event loop and one coroutine -of lower priority, but only once, using idle watchers to keep the event -loop from blocking if lower-priority coroutines are active, thus mapping -low-priority coroutines to idle/background tasks). -.PP -When used for this purpose, it is recommended to give \f(CW\*(C`ev_check\*(C'\fR watchers -highest (\f(CW\*(C`EV_MAXPRI\*(C'\fR) priority, to ensure that they are being run before -any other watchers after the poll (this doesn't matter for \f(CW\*(C`ev_prepare\*(C'\fR -watchers). -.PP -Also, \f(CW\*(C`ev_check\*(C'\fR watchers (and \f(CW\*(C`ev_prepare\*(C'\fR watchers, too) should not -activate (\*(L"feed\*(R") events into libev. While libev fully supports this, they -might get executed before other \f(CW\*(C`ev_check\*(C'\fR watchers did their job. As -\&\f(CW\*(C`ev_check\*(C'\fR watchers are often used to embed other (non-libev) event -loops those other event loops might be in an unusable state until their -\&\f(CW\*(C`ev_check\*(C'\fR watcher ran (always remind yourself to coexist peacefully with -others). -.PP -\fIAbusing an \f(CI\*(C`ev_check\*(C'\fI watcher for its side-effect\fR -.IX Subsection "Abusing an ev_check watcher for its side-effect" -.PP -\&\f(CW\*(C`ev_check\*(C'\fR (and less often also \f(CW\*(C`ev_prepare\*(C'\fR) watchers can also be -useful because they are called once per event loop iteration. For -example, if you want to handle a large number of connections fairly, you -normally only do a bit of work for each active connection, and if there -is more work to do, you wait for the next event loop iteration, so other -connections have a chance of making progress. -.PP -Using an \f(CW\*(C`ev_check\*(C'\fR watcher is almost enough: it will be called on the -next event loop iteration. However, that isn't as soon as possible \- -without external events, your \f(CW\*(C`ev_check\*(C'\fR watcher will not be invoked. -.PP -This is where \f(CW\*(C`ev_idle\*(C'\fR watchers come in handy \- all you need is a -single global idle watcher that is active as long as you have one active -\&\f(CW\*(C`ev_check\*(C'\fR watcher. The \f(CW\*(C`ev_idle\*(C'\fR watcher makes sure the event loop -will not sleep, and the \f(CW\*(C`ev_check\*(C'\fR watcher makes sure a callback gets -invoked. Neither watcher alone can do that. -.PP -\fIWatcher-Specific Functions and Data Members\fR -.IX Subsection "Watcher-Specific Functions and Data Members" -.IP "ev_prepare_init (ev_prepare *, callback)" 4 -.IX Item "ev_prepare_init (ev_prepare *, callback)" -.PD 0 -.IP "ev_check_init (ev_check *, callback)" 4 -.IX Item "ev_check_init (ev_check *, callback)" -.PD -Initialises and configures the prepare or check watcher \- they have no -parameters of any kind. There are \f(CW\*(C`ev_prepare_set\*(C'\fR and \f(CW\*(C`ev_check_set\*(C'\fR -macros, but using them is utterly, utterly, utterly and completely -pointless. -.PP -\fIExamples\fR -.IX Subsection "Examples" -.PP -There are a number of principal ways to embed other event loops or modules -into libev. Here are some ideas on how to include libadns into libev -(there is a Perl module named \f(CW\*(C`EV::ADNS\*(C'\fR that does this, which you could -use as a working example. Another Perl module named \f(CW\*(C`EV::Glib\*(C'\fR embeds a -Glib main context into libev, and finally, \f(CW\*(C`Glib::EV\*(C'\fR embeds \s-1EV\s0 into the -Glib event loop). -.PP -Method 1: Add \s-1IO\s0 watchers and a timeout watcher in a prepare handler, -and in a check watcher, destroy them and call into libadns. What follows -is pseudo-code only of course. This requires you to either use a low -priority for the check watcher or use \f(CW\*(C`ev_clear_pending\*(C'\fR explicitly, as -the callbacks for the IO/timeout watchers might not have been called yet. -.PP -.Vb 2 -\& static ev_io iow [nfd]; -\& static ev_timer tw; -\& -\& static void -\& io_cb (struct ev_loop *loop, ev_io *w, int revents) -\& { -\& } -\& -\& // create io watchers for each fd and a timer before blocking -\& static void -\& adns_prepare_cb (struct ev_loop *loop, ev_prepare *w, int revents) -\& { -\& int timeout = 3600000; -\& struct pollfd fds [nfd]; -\& // actual code will need to loop here and realloc etc. -\& adns_beforepoll (ads, fds, &nfd, &timeout, timeval_from (ev_time ())); -\& -\& /* the callback is illegal, but won\*(Aqt be called as we stop during check */ -\& ev_timer_init (&tw, 0, timeout * 1e\-3, 0.); -\& ev_timer_start (loop, &tw); -\& -\& // create one ev_io per pollfd -\& for (int i = 0; i < nfd; ++i) -\& { -\& ev_io_init (iow + i, io_cb, fds [i].fd, -\& ((fds [i].events & POLLIN ? EV_READ : 0) -\& | (fds [i].events & POLLOUT ? EV_WRITE : 0))); -\& -\& fds [i].revents = 0; -\& ev_io_start (loop, iow + i); -\& } -\& } -\& -\& // stop all watchers after blocking -\& static void -\& adns_check_cb (struct ev_loop *loop, ev_check *w, int revents) -\& { -\& ev_timer_stop (loop, &tw); -\& -\& for (int i = 0; i < nfd; ++i) -\& { -\& // set the relevant poll flags -\& // could also call adns_processreadable etc. here -\& struct pollfd *fd = fds + i; -\& int revents = ev_clear_pending (iow + i); -\& if (revents & EV_READ ) fd\->revents |= fd\->events & POLLIN; -\& if (revents & EV_WRITE) fd\->revents |= fd\->events & POLLOUT; -\& -\& // now stop the watcher -\& ev_io_stop (loop, iow + i); -\& } -\& -\& adns_afterpoll (adns, fds, nfd, timeval_from (ev_now (loop)); -\& } -.Ve -.PP -Method 2: This would be just like method 1, but you run \f(CW\*(C`adns_afterpoll\*(C'\fR -in the prepare watcher and would dispose of the check watcher. -.PP -Method 3: If the module to be embedded supports explicit event -notification (libadns does), you can also make use of the actual watcher -callbacks, and only destroy/create the watchers in the prepare watcher. -.PP -.Vb 5 -\& static void -\& timer_cb (EV_P_ ev_timer *w, int revents) -\& { -\& adns_state ads = (adns_state)w\->data; -\& update_now (EV_A); -\& -\& adns_processtimeouts (ads, &tv_now); -\& } -\& -\& static void -\& io_cb (EV_P_ ev_io *w, int revents) -\& { -\& adns_state ads = (adns_state)w\->data; -\& update_now (EV_A); -\& -\& if (revents & EV_READ ) adns_processreadable (ads, w\->fd, &tv_now); -\& if (revents & EV_WRITE) adns_processwriteable (ads, w\->fd, &tv_now); -\& } -\& -\& // do not ever call adns_afterpoll -.Ve -.PP -Method 4: Do not use a prepare or check watcher because the module you -want to embed is not flexible enough to support it. Instead, you can -override their poll function. The drawback with this solution is that the -main loop is now no longer controllable by \s-1EV.\s0 The \f(CW\*(C`Glib::EV\*(C'\fR module uses -this approach, effectively embedding \s-1EV\s0 as a client into the horrible -libglib event loop. -.PP -.Vb 4 -\& static gint -\& event_poll_func (GPollFD *fds, guint nfds, gint timeout) -\& { -\& int got_events = 0; -\& -\& for (n = 0; n < nfds; ++n) -\& // create/start io watcher that sets the relevant bits in fds[n] and increment got_events -\& -\& if (timeout >= 0) -\& // create/start timer -\& -\& // poll -\& ev_run (EV_A_ 0); -\& -\& // stop timer again -\& if (timeout >= 0) -\& ev_timer_stop (EV_A_ &to); -\& -\& // stop io watchers again \- their callbacks should have set -\& for (n = 0; n < nfds; ++n) -\& ev_io_stop (EV_A_ iow [n]); -\& -\& return got_events; -\& } -.Ve -.ie n .SS """ev_embed"" \- when one backend isn't enough..." -.el .SS "\f(CWev_embed\fP \- when one backend isn't enough..." -.IX Subsection "ev_embed - when one backend isn't enough..." -This is a rather advanced watcher type that lets you embed one event loop -into another (currently only \f(CW\*(C`ev_io\*(C'\fR events are supported in the embedded -loop, other types of watchers might be handled in a delayed or incorrect -fashion and must not be used). -.PP -There are primarily two reasons you would want that: work around bugs and -prioritise I/O. -.PP -As an example for a bug workaround, the kqueue backend might only support -sockets on some platform, so it is unusable as generic backend, but you -still want to make use of it because you have many sockets and it scales -so nicely. In this case, you would create a kqueue-based loop and embed -it into your default loop (which might use e.g. poll). Overall operation -will be a bit slower because first libev has to call \f(CW\*(C`poll\*(C'\fR and then -\&\f(CW\*(C`kevent\*(C'\fR, but at least you can use both mechanisms for what they are -best: \f(CW\*(C`kqueue\*(C'\fR for scalable sockets and \f(CW\*(C`poll\*(C'\fR if you want it to work :) -.PP -As for prioritising I/O: under rare circumstances you have the case where -some fds have to be watched and handled very quickly (with low latency), -and even priorities and idle watchers might have too much overhead. In -this case you would put all the high priority stuff in one loop and all -the rest in a second one, and embed the second one in the first. -.PP -As long as the watcher is active, the callback will be invoked every -time there might be events pending in the embedded loop. The callback -must then call \f(CW\*(C`ev_embed_sweep (mainloop, watcher)\*(C'\fR to make a single -sweep and invoke their callbacks (the callback doesn't need to invoke the -\&\f(CW\*(C`ev_embed_sweep\*(C'\fR function directly, it could also start an idle watcher -to give the embedded loop strictly lower priority for example). -.PP -You can also set the callback to \f(CW0\fR, in which case the embed watcher -will automatically execute the embedded loop sweep whenever necessary. -.PP -Fork detection will be handled transparently while the \f(CW\*(C`ev_embed\*(C'\fR watcher -is active, i.e., the embedded loop will automatically be forked when the -embedding loop forks. In other cases, the user is responsible for calling -\&\f(CW\*(C`ev_loop_fork\*(C'\fR on the embedded loop. -.PP -Unfortunately, not all backends are embeddable: only the ones returned by -\&\f(CW\*(C`ev_embeddable_backends\*(C'\fR are, which, unfortunately, does not include any -portable one. -.PP -So when you want to use this feature you will always have to be prepared -that you cannot get an embeddable loop. The recommended way to get around -this is to have a separate variables for your embeddable loop, try to -create it, and if that fails, use the normal loop for everything. -.PP -\fI\f(CI\*(C`ev_embed\*(C'\fI and fork\fR -.IX Subsection "ev_embed and fork" -.PP -While the \f(CW\*(C`ev_embed\*(C'\fR watcher is running, forks in the embedding loop will -automatically be applied to the embedded loop as well, so no special -fork handling is required in that case. When the watcher is not running, -however, it is still the task of the libev user to call \f(CW\*(C`ev_loop_fork ()\*(C'\fR -as applicable. -.PP -\fIWatcher-Specific Functions and Data Members\fR -.IX Subsection "Watcher-Specific Functions and Data Members" -.IP "ev_embed_init (ev_embed *, callback, struct ev_loop *embedded_loop)" 4 -.IX Item "ev_embed_init (ev_embed *, callback, struct ev_loop *embedded_loop)" -.PD 0 -.IP "ev_embed_set (ev_embed *, struct ev_loop *embedded_loop)" 4 -.IX Item "ev_embed_set (ev_embed *, struct ev_loop *embedded_loop)" -.PD -Configures the watcher to embed the given loop, which must be -embeddable. If the callback is \f(CW0\fR, then \f(CW\*(C`ev_embed_sweep\*(C'\fR will be -invoked automatically, otherwise it is the responsibility of the callback -to invoke it (it will continue to be called until the sweep has been done, -if you do not want that, you need to temporarily stop the embed watcher). -.IP "ev_embed_sweep (loop, ev_embed *)" 4 -.IX Item "ev_embed_sweep (loop, ev_embed *)" -Make a single, non-blocking sweep over the embedded loop. This works -similarly to \f(CW\*(C`ev_run (embedded_loop, EVRUN_NOWAIT)\*(C'\fR, but in the most -appropriate way for embedded loops. -.IP "struct ev_loop *other [read\-only]" 4 -.IX Item "struct ev_loop *other [read-only]" -The embedded event loop. -.PP -\fIExamples\fR -.IX Subsection "Examples" -.PP -Example: Try to get an embeddable event loop and embed it into the default -event loop. If that is not possible, use the default loop. The default -loop is stored in \f(CW\*(C`loop_hi\*(C'\fR, while the embeddable loop is stored in -\&\f(CW\*(C`loop_lo\*(C'\fR (which is \f(CW\*(C`loop_hi\*(C'\fR in the case no embeddable loop can be -used). -.PP -.Vb 3 -\& struct ev_loop *loop_hi = ev_default_init (0); -\& struct ev_loop *loop_lo = 0; -\& ev_embed embed; -\& -\& // see if there is a chance of getting one that works -\& // (remember that a flags value of 0 means autodetection) -\& loop_lo = ev_embeddable_backends () & ev_recommended_backends () -\& ? ev_loop_new (ev_embeddable_backends () & ev_recommended_backends ()) -\& : 0; -\& -\& // if we got one, then embed it, otherwise default to loop_hi -\& if (loop_lo) -\& { -\& ev_embed_init (&embed, 0, loop_lo); -\& ev_embed_start (loop_hi, &embed); -\& } -\& else -\& loop_lo = loop_hi; -.Ve -.PP -Example: Check if kqueue is available but not recommended and create -a kqueue backend for use with sockets (which usually work with any -kqueue implementation). Store the kqueue/socket\-only event loop in -\&\f(CW\*(C`loop_socket\*(C'\fR. (One might optionally use \f(CW\*(C`EVFLAG_NOENV\*(C'\fR, too). -.PP -.Vb 3 -\& struct ev_loop *loop = ev_default_init (0); -\& struct ev_loop *loop_socket = 0; -\& ev_embed embed; -\& -\& if (ev_supported_backends () & ~ev_recommended_backends () & EVBACKEND_KQUEUE) -\& if ((loop_socket = ev_loop_new (EVBACKEND_KQUEUE)) -\& { -\& ev_embed_init (&embed, 0, loop_socket); -\& ev_embed_start (loop, &embed); -\& } -\& -\& if (!loop_socket) -\& loop_socket = loop; -\& -\& // now use loop_socket for all sockets, and loop for everything else -.Ve -.ie n .SS """ev_fork"" \- the audacity to resume the event loop after a fork" -.el .SS "\f(CWev_fork\fP \- the audacity to resume the event loop after a fork" -.IX Subsection "ev_fork - the audacity to resume the event loop after a fork" -Fork watchers are called when a \f(CW\*(C`fork ()\*(C'\fR was detected (usually because -whoever is a good citizen cared to tell libev about it by calling -\&\f(CW\*(C`ev_loop_fork\*(C'\fR). The invocation is done before the event loop blocks next -and before \f(CW\*(C`ev_check\*(C'\fR watchers are being called, and only in the child -after the fork. If whoever good citizen calling \f(CW\*(C`ev_default_fork\*(C'\fR cheats -and calls it in the wrong process, the fork handlers will be invoked, too, -of course. -.PP -\fIThe special problem of life after fork \- how is it possible?\fR -.IX Subsection "The special problem of life after fork - how is it possible?" -.PP -Most uses of \f(CW\*(C`fork ()\*(C'\fR consist of forking, then some simple calls to set -up/change the process environment, followed by a call to \f(CW\*(C`exec()\*(C'\fR. This -sequence should be handled by libev without any problems. -.PP -This changes when the application actually wants to do event handling -in the child, or both parent in child, in effect \*(L"continuing\*(R" after the -fork. -.PP -The default mode of operation (for libev, with application help to detect -forks) is to duplicate all the state in the child, as would be expected -when \fIeither\fR the parent \fIor\fR the child process continues. -.PP -When both processes want to continue using libev, then this is usually the -wrong result. In that case, usually one process (typically the parent) is -supposed to continue with all watchers in place as before, while the other -process typically wants to start fresh, i.e. without any active watchers. -.PP -The cleanest and most efficient way to achieve that with libev is to -simply create a new event loop, which of course will be \*(L"empty\*(R", and -use that for new watchers. This has the advantage of not touching more -memory than necessary, and thus avoiding the copy-on-write, and the -disadvantage of having to use multiple event loops (which do not support -signal watchers). -.PP -When this is not possible, or you want to use the default loop for -other reasons, then in the process that wants to start \*(L"fresh\*(R", call -\&\f(CW\*(C`ev_loop_destroy (EV_DEFAULT)\*(C'\fR followed by \f(CW\*(C`ev_default_loop (...)\*(C'\fR. -Destroying the default loop will \*(L"orphan\*(R" (not stop) all registered -watchers, so you have to be careful not to execute code that modifies -those watchers. Note also that in that case, you have to re-register any -signal watchers. -.PP -\fIWatcher-Specific Functions and Data Members\fR -.IX Subsection "Watcher-Specific Functions and Data Members" -.IP "ev_fork_init (ev_fork *, callback)" 4 -.IX Item "ev_fork_init (ev_fork *, callback)" -Initialises and configures the fork watcher \- it has no parameters of any -kind. There is a \f(CW\*(C`ev_fork_set\*(C'\fR macro, but using it is utterly pointless, -really. -.ie n .SS """ev_cleanup"" \- even the best things end" -.el .SS "\f(CWev_cleanup\fP \- even the best things end" -.IX Subsection "ev_cleanup - even the best things end" -Cleanup watchers are called just before the event loop is being destroyed -by a call to \f(CW\*(C`ev_loop_destroy\*(C'\fR. -.PP -While there is no guarantee that the event loop gets destroyed, cleanup -watchers provide a convenient method to install cleanup hooks for your -program, worker threads and so on \- you just to make sure to destroy the -loop when you want them to be invoked. -.PP -Cleanup watchers are invoked in the same way as any other watcher. Unlike -all other watchers, they do not keep a reference to the event loop (which -makes a lot of sense if you think about it). Like all other watchers, you -can call libev functions in the callback, except \f(CW\*(C`ev_cleanup_start\*(C'\fR. -.PP -\fIWatcher-Specific Functions and Data Members\fR -.IX Subsection "Watcher-Specific Functions and Data Members" -.IP "ev_cleanup_init (ev_cleanup *, callback)" 4 -.IX Item "ev_cleanup_init (ev_cleanup *, callback)" -Initialises and configures the cleanup watcher \- it has no parameters of -any kind. There is a \f(CW\*(C`ev_cleanup_set\*(C'\fR macro, but using it is utterly -pointless, I assure you. -.PP -Example: Register an atexit handler to destroy the default loop, so any -cleanup functions are called. -.PP -.Vb 5 -\& static void -\& program_exits (void) -\& { -\& ev_loop_destroy (EV_DEFAULT_UC); -\& } -\& -\& ... -\& atexit (program_exits); -.Ve -.ie n .SS """ev_async"" \- how to wake up an event loop" -.el .SS "\f(CWev_async\fP \- how to wake up an event loop" -.IX Subsection "ev_async - how to wake up an event loop" -In general, you cannot use an \f(CW\*(C`ev_loop\*(C'\fR from multiple threads or other -asynchronous sources such as signal handlers (as opposed to multiple event -loops \- those are of course safe to use in different threads). -.PP -Sometimes, however, you need to wake up an event loop you do not control, -for example because it belongs to another thread. This is what \f(CW\*(C`ev_async\*(C'\fR -watchers do: as long as the \f(CW\*(C`ev_async\*(C'\fR watcher is active, you can signal -it by calling \f(CW\*(C`ev_async_send\*(C'\fR, which is thread\- and signal safe. -.PP -This functionality is very similar to \f(CW\*(C`ev_signal\*(C'\fR watchers, as signals, -too, are asynchronous in nature, and signals, too, will be compressed -(i.e. the number of callback invocations may be less than the number of -\&\f(CW\*(C`ev_async_send\*(C'\fR calls). In fact, you could use signal watchers as a kind -of \*(L"global async watchers\*(R" by using a watcher on an otherwise unused -signal, and \f(CW\*(C`ev_feed_signal\*(C'\fR to signal this watcher from another thread, -even without knowing which loop owns the signal. -.PP -\fIQueueing\fR -.IX Subsection "Queueing" -.PP -\&\f(CW\*(C`ev_async\*(C'\fR does not support queueing of data in any way. The reason -is that the author does not know of a simple (or any) algorithm for a -multiple-writer-single-reader queue that works in all cases and doesn't -need elaborate support such as pthreads or unportable memory access -semantics. -.PP -That means that if you want to queue data, you have to provide your own -queue. But at least I can tell you how to implement locking around your -queue: -.IP "queueing from a signal handler context" 4 -.IX Item "queueing from a signal handler context" -To implement race-free queueing, you simply add to the queue in the signal -handler but you block the signal handler in the watcher callback. Here is -an example that does that for some fictitious \s-1SIGUSR1\s0 handler: -.Sp -.Vb 1 -\& static ev_async mysig; -\& -\& static void -\& sigusr1_handler (void) -\& { -\& sometype data; -\& -\& // no locking etc. -\& queue_put (data); -\& ev_async_send (EV_DEFAULT_ &mysig); -\& } -\& -\& static void -\& mysig_cb (EV_P_ ev_async *w, int revents) -\& { -\& sometype data; -\& sigset_t block, prev; -\& -\& sigemptyset (&block); -\& sigaddset (&block, SIGUSR1); -\& sigprocmask (SIG_BLOCK, &block, &prev); -\& -\& while (queue_get (&data)) -\& process (data); -\& -\& if (sigismember (&prev, SIGUSR1) -\& sigprocmask (SIG_UNBLOCK, &block, 0); -\& } -.Ve -.Sp -(Note: pthreads in theory requires you to use \f(CW\*(C`pthread_setmask\*(C'\fR -instead of \f(CW\*(C`sigprocmask\*(C'\fR when you use threads, but libev doesn't do it -either...). -.IP "queueing from a thread context" 4 -.IX Item "queueing from a thread context" -The strategy for threads is different, as you cannot (easily) block -threads but you can easily preempt them, so to queue safely you need to -employ a traditional mutex lock, such as in this pthread example: -.Sp -.Vb 2 -\& static ev_async mysig; -\& static pthread_mutex_t mymutex = PTHREAD_MUTEX_INITIALIZER; -\& -\& static void -\& otherthread (void) -\& { -\& // only need to lock the actual queueing operation -\& pthread_mutex_lock (&mymutex); -\& queue_put (data); -\& pthread_mutex_unlock (&mymutex); -\& -\& ev_async_send (EV_DEFAULT_ &mysig); -\& } -\& -\& static void -\& mysig_cb (EV_P_ ev_async *w, int revents) -\& { -\& pthread_mutex_lock (&mymutex); -\& -\& while (queue_get (&data)) -\& process (data); -\& -\& pthread_mutex_unlock (&mymutex); -\& } -.Ve -.PP -\fIWatcher-Specific Functions and Data Members\fR -.IX Subsection "Watcher-Specific Functions and Data Members" -.IP "ev_async_init (ev_async *, callback)" 4 -.IX Item "ev_async_init (ev_async *, callback)" -Initialises and configures the async watcher \- it has no parameters of any -kind. There is a \f(CW\*(C`ev_async_set\*(C'\fR macro, but using it is utterly pointless, -trust me. -.IP "ev_async_send (loop, ev_async *)" 4 -.IX Item "ev_async_send (loop, ev_async *)" -Sends/signals/activates the given \f(CW\*(C`ev_async\*(C'\fR watcher, that is, feeds -an \f(CW\*(C`EV_ASYNC\*(C'\fR event on the watcher into the event loop, and instantly -returns. -.Sp -Unlike \f(CW\*(C`ev_feed_event\*(C'\fR, this call is safe to do from other threads, -signal or similar contexts (see the discussion of \f(CW\*(C`EV_ATOMIC_T\*(C'\fR in the -embedding section below on what exactly this means). -.Sp -Note that, as with other watchers in libev, multiple events might get -compressed into a single callback invocation (another way to look at -this is that \f(CW\*(C`ev_async\*(C'\fR watchers are level-triggered: they are set on -\&\f(CW\*(C`ev_async_send\*(C'\fR, reset when the event loop detects that). -.Sp -This call incurs the overhead of at most one extra system call per event -loop iteration, if the event loop is blocked, and no syscall at all if -the event loop (or your program) is processing events. That means that -repeated calls are basically free (there is no need to avoid calls for -performance reasons) and that the overhead becomes smaller (typically -zero) under load. -.IP "bool = ev_async_pending (ev_async *)" 4 -.IX Item "bool = ev_async_pending (ev_async *)" -Returns a non-zero value when \f(CW\*(C`ev_async_send\*(C'\fR has been called on the -watcher but the event has not yet been processed (or even noted) by the -event loop. -.Sp -\&\f(CW\*(C`ev_async_send\*(C'\fR sets a flag in the watcher and wakes up the loop. When -the loop iterates next and checks for the watcher to have become active, -it will reset the flag again. \f(CW\*(C`ev_async_pending\*(C'\fR can be used to very -quickly check whether invoking the loop might be a good idea. -.Sp -Not that this does \fInot\fR check whether the watcher itself is pending, -only whether it has been requested to make this watcher pending: there -is a time window between the event loop checking and resetting the async -notification, and the callback being invoked. -.SH "OTHER FUNCTIONS" -.IX Header "OTHER FUNCTIONS" -There are some other functions of possible interest. Described. Here. Now. -.IP "ev_once (loop, int fd, int events, ev_tstamp timeout, callback, arg)" 4 -.IX Item "ev_once (loop, int fd, int events, ev_tstamp timeout, callback, arg)" -This function combines a simple timer and an I/O watcher, calls your -callback on whichever event happens first and automatically stops both -watchers. This is useful if you want to wait for a single event on an fd -or timeout without having to allocate/configure/start/stop/free one or -more watchers yourself. -.Sp -If \f(CW\*(C`fd\*(C'\fR is less than 0, then no I/O watcher will be started and the -\&\f(CW\*(C`events\*(C'\fR argument is being ignored. Otherwise, an \f(CW\*(C`ev_io\*(C'\fR watcher for -the given \f(CW\*(C`fd\*(C'\fR and \f(CW\*(C`events\*(C'\fR set will be created and started. -.Sp -If \f(CW\*(C`timeout\*(C'\fR is less than 0, then no timeout watcher will be -started. Otherwise an \f(CW\*(C`ev_timer\*(C'\fR watcher with after = \f(CW\*(C`timeout\*(C'\fR (and -repeat = 0) will be started. \f(CW0\fR is a valid timeout. -.Sp -The callback has the type \f(CW\*(C`void (*cb)(int revents, void *arg)\*(C'\fR and is -passed an \f(CW\*(C`revents\*(C'\fR set like normal event callbacks (a combination of -\&\f(CW\*(C`EV_ERROR\*(C'\fR, \f(CW\*(C`EV_READ\*(C'\fR, \f(CW\*(C`EV_WRITE\*(C'\fR or \f(CW\*(C`EV_TIMER\*(C'\fR) and the \f(CW\*(C`arg\*(C'\fR -value passed to \f(CW\*(C`ev_once\*(C'\fR. Note that it is possible to receive \fIboth\fR -a timeout and an io event at the same time \- you probably should give io -events precedence. -.Sp -Example: wait up to ten seconds for data to appear on \s-1STDIN_FILENO.\s0 -.Sp -.Vb 7 -\& static void stdin_ready (int revents, void *arg) -\& { -\& if (revents & EV_READ) -\& /* stdin might have data for us, joy! */; -\& else if (revents & EV_TIMER) -\& /* doh, nothing entered */; -\& } -\& -\& ev_once (STDIN_FILENO, EV_READ, 10., stdin_ready, 0); -.Ve -.IP "ev_feed_fd_event (loop, int fd, int revents)" 4 -.IX Item "ev_feed_fd_event (loop, int fd, int revents)" -Feed an event on the given fd, as if a file descriptor backend detected -the given events. -.IP "ev_feed_signal_event (loop, int signum)" 4 -.IX Item "ev_feed_signal_event (loop, int signum)" -Feed an event as if the given signal occurred. See also \f(CW\*(C`ev_feed_signal\*(C'\fR, -which is async-safe. -.SH "COMMON OR USEFUL IDIOMS (OR BOTH)" -.IX Header "COMMON OR USEFUL IDIOMS (OR BOTH)" -This section explains some common idioms that are not immediately -obvious. Note that examples are sprinkled over the whole manual, and this -section only contains stuff that wouldn't fit anywhere else. -.SS "\s-1ASSOCIATING CUSTOM DATA WITH A WATCHER\s0" -.IX Subsection "ASSOCIATING CUSTOM DATA WITH A WATCHER" -Each watcher has, by default, a \f(CW\*(C`void *data\*(C'\fR member that you can read -or modify at any time: libev will completely ignore it. This can be used -to associate arbitrary data with your watcher. If you need more data and -don't want to allocate memory separately and store a pointer to it in that -data member, you can also \*(L"subclass\*(R" the watcher type and provide your own -data: -.PP -.Vb 7 -\& struct my_io -\& { -\& ev_io io; -\& int otherfd; -\& void *somedata; -\& struct whatever *mostinteresting; -\& }; -\& -\& ... -\& struct my_io w; -\& ev_io_init (&w.io, my_cb, fd, EV_READ); -.Ve -.PP -And since your callback will be called with a pointer to the watcher, you -can cast it back to your own type: -.PP -.Vb 5 -\& static void my_cb (struct ev_loop *loop, ev_io *w_, int revents) -\& { -\& struct my_io *w = (struct my_io *)w_; -\& ... -\& } -.Ve -.PP -More interesting and less C\-conformant ways of casting your callback -function type instead have been omitted. -.SS "\s-1BUILDING YOUR OWN COMPOSITE WATCHERS\s0" -.IX Subsection "BUILDING YOUR OWN COMPOSITE WATCHERS" -Another common scenario is to use some data structure with multiple -embedded watchers, in effect creating your own watcher that combines -multiple libev event sources into one \*(L"super-watcher\*(R": -.PP -.Vb 6 -\& struct my_biggy -\& { -\& int some_data; -\& ev_timer t1; -\& ev_timer t2; -\& } -.Ve -.PP -In this case getting the pointer to \f(CW\*(C`my_biggy\*(C'\fR is a bit more -complicated: Either you store the address of your \f(CW\*(C`my_biggy\*(C'\fR struct in -the \f(CW\*(C`data\*(C'\fR member of the watcher (for woozies or \*(C+ coders), or you need -to use some pointer arithmetic using \f(CW\*(C`offsetof\*(C'\fR inside your watchers (for -real programmers): -.PP -.Vb 1 -\& #include -\& -\& static void -\& t1_cb (EV_P_ ev_timer *w, int revents) -\& { -\& struct my_biggy big = (struct my_biggy *) -\& (((char *)w) \- offsetof (struct my_biggy, t1)); -\& } -\& -\& static void -\& t2_cb (EV_P_ ev_timer *w, int revents) -\& { -\& struct my_biggy big = (struct my_biggy *) -\& (((char *)w) \- offsetof (struct my_biggy, t2)); -\& } -.Ve -.SS "\s-1AVOIDING FINISHING BEFORE RETURNING\s0" -.IX Subsection "AVOIDING FINISHING BEFORE RETURNING" -Often you have structures like this in event-based programs: -.PP -.Vb 4 -\& callback () -\& { -\& free (request); -\& } -\& -\& request = start_new_request (..., callback); -.Ve -.PP -The intent is to start some \*(L"lengthy\*(R" operation. The \f(CW\*(C`request\*(C'\fR could be -used to cancel the operation, or do other things with it. -.PP -It's not uncommon to have code paths in \f(CW\*(C`start_new_request\*(C'\fR that -immediately invoke the callback, for example, to report errors. Or you add -some caching layer that finds that it can skip the lengthy aspects of the -operation and simply invoke the callback with the result. -.PP -The problem here is that this will happen \fIbefore\fR \f(CW\*(C`start_new_request\*(C'\fR -has returned, so \f(CW\*(C`request\*(C'\fR is not set. -.PP -Even if you pass the request by some safer means to the callback, you -might want to do something to the request after starting it, such as -canceling it, which probably isn't working so well when the callback has -already been invoked. -.PP -A common way around all these issues is to make sure that -\&\f(CW\*(C`start_new_request\*(C'\fR \fIalways\fR returns before the callback is invoked. If -\&\f(CW\*(C`start_new_request\*(C'\fR immediately knows the result, it can artificially -delay invoking the callback by using a \f(CW\*(C`prepare\*(C'\fR or \f(CW\*(C`idle\*(C'\fR watcher for -example, or more sneakily, by reusing an existing (stopped) watcher and -pushing it into the pending queue: -.PP -.Vb 2 -\& ev_set_cb (watcher, callback); -\& ev_feed_event (EV_A_ watcher, 0); -.Ve -.PP -This way, \f(CW\*(C`start_new_request\*(C'\fR can safely return before the callback is -invoked, while not delaying callback invocation too much. -.SS "\s-1MODEL/NESTED EVENT LOOP INVOCATIONS AND EXIT CONDITIONS\s0" -.IX Subsection "MODEL/NESTED EVENT LOOP INVOCATIONS AND EXIT CONDITIONS" -Often (especially in \s-1GUI\s0 toolkits) there are places where you have -\&\fImodal\fR interaction, which is most easily implemented by recursively -invoking \f(CW\*(C`ev_run\*(C'\fR. -.PP -This brings the problem of exiting \- a callback might want to finish the -main \f(CW\*(C`ev_run\*(C'\fR call, but not the nested one (e.g. user clicked \*(L"Quit\*(R", but -a modal \*(L"Are you sure?\*(R" dialog is still waiting), or just the nested one -and not the main one (e.g. user clocked \*(L"Ok\*(R" in a modal dialog), or some -other combination: In these cases, a simple \f(CW\*(C`ev_break\*(C'\fR will not work. -.PP -The solution is to maintain \*(L"break this loop\*(R" variable for each \f(CW\*(C`ev_run\*(C'\fR -invocation, and use a loop around \f(CW\*(C`ev_run\*(C'\fR until the condition is -triggered, using \f(CW\*(C`EVRUN_ONCE\*(C'\fR: -.PP -.Vb 2 -\& // main loop -\& int exit_main_loop = 0; -\& -\& while (!exit_main_loop) -\& ev_run (EV_DEFAULT_ EVRUN_ONCE); -\& -\& // in a modal watcher -\& int exit_nested_loop = 0; -\& -\& while (!exit_nested_loop) -\& ev_run (EV_A_ EVRUN_ONCE); -.Ve -.PP -To exit from any of these loops, just set the corresponding exit variable: -.PP -.Vb 2 -\& // exit modal loop -\& exit_nested_loop = 1; -\& -\& // exit main program, after modal loop is finished -\& exit_main_loop = 1; -\& -\& // exit both -\& exit_main_loop = exit_nested_loop = 1; -.Ve -.SS "\s-1THREAD LOCKING EXAMPLE\s0" -.IX Subsection "THREAD LOCKING EXAMPLE" -Here is a fictitious example of how to run an event loop in a different -thread from where callbacks are being invoked and watchers are -created/added/removed. -.PP -For a real-world example, see the \f(CW\*(C`EV::Loop::Async\*(C'\fR perl module, -which uses exactly this technique (which is suited for many high-level -languages). -.PP -The example uses a pthread mutex to protect the loop data, a condition -variable to wait for callback invocations, an async watcher to notify the -event loop thread and an unspecified mechanism to wake up the main thread. -.PP -First, you need to associate some data with the event loop: -.PP -.Vb 6 -\& typedef struct { -\& mutex_t lock; /* global loop lock */ -\& ev_async async_w; -\& thread_t tid; -\& cond_t invoke_cv; -\& } userdata; -\& -\& void prepare_loop (EV_P) -\& { -\& // for simplicity, we use a static userdata struct. -\& static userdata u; -\& -\& ev_async_init (&u\->async_w, async_cb); -\& ev_async_start (EV_A_ &u\->async_w); -\& -\& pthread_mutex_init (&u\->lock, 0); -\& pthread_cond_init (&u\->invoke_cv, 0); -\& -\& // now associate this with the loop -\& ev_set_userdata (EV_A_ u); -\& ev_set_invoke_pending_cb (EV_A_ l_invoke); -\& ev_set_loop_release_cb (EV_A_ l_release, l_acquire); -\& -\& // then create the thread running ev_run -\& pthread_create (&u\->tid, 0, l_run, EV_A); -\& } -.Ve -.PP -The callback for the \f(CW\*(C`ev_async\*(C'\fR watcher does nothing: the watcher is used -solely to wake up the event loop so it takes notice of any new watchers -that might have been added: -.PP -.Vb 5 -\& static void -\& async_cb (EV_P_ ev_async *w, int revents) -\& { -\& // just used for the side effects -\& } -.Ve -.PP -The \f(CW\*(C`l_release\*(C'\fR and \f(CW\*(C`l_acquire\*(C'\fR callbacks simply unlock/lock the mutex -protecting the loop data, respectively. -.PP -.Vb 6 -\& static void -\& l_release (EV_P) -\& { -\& userdata *u = ev_userdata (EV_A); -\& pthread_mutex_unlock (&u\->lock); -\& } -\& -\& static void -\& l_acquire (EV_P) -\& { -\& userdata *u = ev_userdata (EV_A); -\& pthread_mutex_lock (&u\->lock); -\& } -.Ve -.PP -The event loop thread first acquires the mutex, and then jumps straight -into \f(CW\*(C`ev_run\*(C'\fR: -.PP -.Vb 4 -\& void * -\& l_run (void *thr_arg) -\& { -\& struct ev_loop *loop = (struct ev_loop *)thr_arg; -\& -\& l_acquire (EV_A); -\& pthread_setcanceltype (PTHREAD_CANCEL_ASYNCHRONOUS, 0); -\& ev_run (EV_A_ 0); -\& l_release (EV_A); -\& -\& return 0; -\& } -.Ve -.PP -Instead of invoking all pending watchers, the \f(CW\*(C`l_invoke\*(C'\fR callback will -signal the main thread via some unspecified mechanism (signals? pipe -writes? \f(CW\*(C`Async::Interrupt\*(C'\fR?) and then waits until all pending watchers -have been called (in a while loop because a) spurious wakeups are possible -and b) skipping inter-thread-communication when there are no pending -watchers is very beneficial): -.PP -.Vb 4 -\& static void -\& l_invoke (EV_P) -\& { -\& userdata *u = ev_userdata (EV_A); -\& -\& while (ev_pending_count (EV_A)) -\& { -\& wake_up_other_thread_in_some_magic_or_not_so_magic_way (); -\& pthread_cond_wait (&u\->invoke_cv, &u\->lock); -\& } -\& } -.Ve -.PP -Now, whenever the main thread gets told to invoke pending watchers, it -will grab the lock, call \f(CW\*(C`ev_invoke_pending\*(C'\fR and then signal the loop -thread to continue: -.PP -.Vb 4 -\& static void -\& real_invoke_pending (EV_P) -\& { -\& userdata *u = ev_userdata (EV_A); -\& -\& pthread_mutex_lock (&u\->lock); -\& ev_invoke_pending (EV_A); -\& pthread_cond_signal (&u\->invoke_cv); -\& pthread_mutex_unlock (&u\->lock); -\& } -.Ve -.PP -Whenever you want to start/stop a watcher or do other modifications to an -event loop, you will now have to lock: -.PP -.Vb 2 -\& ev_timer timeout_watcher; -\& userdata *u = ev_userdata (EV_A); -\& -\& ev_timer_init (&timeout_watcher, timeout_cb, 5.5, 0.); -\& -\& pthread_mutex_lock (&u\->lock); -\& ev_timer_start (EV_A_ &timeout_watcher); -\& ev_async_send (EV_A_ &u\->async_w); -\& pthread_mutex_unlock (&u\->lock); -.Ve -.PP -Note that sending the \f(CW\*(C`ev_async\*(C'\fR watcher is required because otherwise -an event loop currently blocking in the kernel will have no knowledge -about the newly added timer. By waking up the loop it will pick up any new -watchers in the next event loop iteration. -.SS "\s-1THREADS, COROUTINES, CONTINUATIONS, QUEUES... INSTEAD OF CALLBACKS\s0" -.IX Subsection "THREADS, COROUTINES, CONTINUATIONS, QUEUES... INSTEAD OF CALLBACKS" -While the overhead of a callback that e.g. schedules a thread is small, it -is still an overhead. If you embed libev, and your main usage is with some -kind of threads or coroutines, you might want to customise libev so that -doesn't need callbacks anymore. -.PP -Imagine you have coroutines that you can switch to using a function -\&\f(CW\*(C`switch_to (coro)\*(C'\fR, that libev runs in a coroutine called \f(CW\*(C`libev_coro\*(C'\fR -and that due to some magic, the currently active coroutine is stored in a -global called \f(CW\*(C`current_coro\*(C'\fR. Then you can build your own \*(L"wait for libev -event\*(R" primitive by changing \f(CW\*(C`EV_CB_DECLARE\*(C'\fR and \f(CW\*(C`EV_CB_INVOKE\*(C'\fR (note -the differing \f(CW\*(C`;\*(C'\fR conventions): -.PP -.Vb 2 -\& #define EV_CB_DECLARE(type) struct my_coro *cb; -\& #define EV_CB_INVOKE(watcher) switch_to ((watcher)\->cb) -.Ve -.PP -That means instead of having a C callback function, you store the -coroutine to switch to in each watcher, and instead of having libev call -your callback, you instead have it switch to that coroutine. -.PP -A coroutine might now wait for an event with a function called -\&\f(CW\*(C`wait_for_event\*(C'\fR. (the watcher needs to be started, as always, but it doesn't -matter when, or whether the watcher is active or not when this function is -called): -.PP -.Vb 6 -\& void -\& wait_for_event (ev_watcher *w) -\& { -\& ev_set_cb (w, current_coro); -\& switch_to (libev_coro); -\& } -.Ve -.PP -That basically suspends the coroutine inside \f(CW\*(C`wait_for_event\*(C'\fR and -continues the libev coroutine, which, when appropriate, switches back to -this or any other coroutine. -.PP -You can do similar tricks if you have, say, threads with an event queue \- -instead of storing a coroutine, you store the queue object and instead of -switching to a coroutine, you push the watcher onto the queue and notify -any waiters. -.PP -To embed libev, see \*(L"\s-1EMBEDDING\*(R"\s0, but in short, it's easiest to create two -files, \fImy_ev.h\fR and \fImy_ev.c\fR that include the respective libev files: -.PP -.Vb 4 -\& // my_ev.h -\& #define EV_CB_DECLARE(type) struct my_coro *cb; -\& #define EV_CB_INVOKE(watcher) switch_to ((watcher)\->cb) -\& #include "../libev/ev.h" -\& -\& // my_ev.c -\& #define EV_H "my_ev.h" -\& #include "../libev/ev.c" -.Ve -.PP -And then use \fImy_ev.h\fR when you would normally use \fIev.h\fR, and compile -\&\fImy_ev.c\fR into your project. When properly specifying include paths, you -can even use \fIev.h\fR as header file name directly. -.SH "LIBEVENT EMULATION" -.IX Header "LIBEVENT EMULATION" -Libev offers a compatibility emulation layer for libevent. It cannot -emulate the internals of libevent, so here are some usage hints: -.IP "\(bu" 4 -Only the libevent\-1.4.1\-beta \s-1API\s0 is being emulated. -.Sp -This was the newest libevent version available when libev was implemented, -and is still mostly unchanged in 2010. -.IP "\(bu" 4 -Use it by including , as usual. -.IP "\(bu" 4 -The following members are fully supported: ev_base, ev_callback, -ev_arg, ev_fd, ev_res, ev_events. -.IP "\(bu" 4 -Avoid using ev_flags and the EVLIST_*\-macros, while it is -maintained by libev, it does not work exactly the same way as in libevent (consider -it a private \s-1API\s0). -.IP "\(bu" 4 -Priorities are not currently supported. Initialising priorities -will fail and all watchers will have the same priority, even though there -is an ev_pri field. -.IP "\(bu" 4 -In libevent, the last base created gets the signals, in libev, the -base that registered the signal gets the signals. -.IP "\(bu" 4 -Other members are not supported. -.IP "\(bu" 4 -The libev emulation is \fInot\fR \s-1ABI\s0 compatible to libevent, you need -to use the libev header file and library. -.SH "\*(C+ SUPPORT" -.IX Header " SUPPORT" -.SS "C \s-1API\s0" -.IX Subsection "C API" -The normal C \s-1API\s0 should work fine when used from \*(C+: both ev.h and the -libev sources can be compiled as \*(C+. Therefore, code that uses the C \s-1API\s0 -will work fine. -.PP -Proper exception specifications might have to be added to callbacks passed -to libev: exceptions may be thrown only from watcher callbacks, all other -callbacks (allocator, syserr, loop acquire/release and periodic reschedule -callbacks) must not throw exceptions, and might need a \f(CW\*(C`noexcept\*(C'\fR -specification. If you have code that needs to be compiled as both C and -\&\*(C+ you can use the \f(CW\*(C`EV_NOEXCEPT\*(C'\fR macro for this: -.PP -.Vb 6 -\& static void -\& fatal_error (const char *msg) EV_NOEXCEPT -\& { -\& perror (msg); -\& abort (); -\& } -\& -\& ... -\& ev_set_syserr_cb (fatal_error); -.Ve -.PP -The only \s-1API\s0 functions that can currently throw exceptions are \f(CW\*(C`ev_run\*(C'\fR, -\&\f(CW\*(C`ev_invoke\*(C'\fR, \f(CW\*(C`ev_invoke_pending\*(C'\fR and \f(CW\*(C`ev_loop_destroy\*(C'\fR (the latter -because it runs cleanup watchers). -.PP -Throwing exceptions in watcher callbacks is only supported if libev itself -is compiled with a \*(C+ compiler or your C and \*(C+ environments allow -throwing exceptions through C libraries (most do). -.SS "\*(C+ \s-1API\s0" -.IX Subsection " API" -Libev comes with some simplistic wrapper classes for \*(C+ that mainly allow -you to use some convenience methods to start/stop watchers and also change -the callback model to a model using method callbacks on objects. -.PP -To use it, -.PP -.Vb 1 -\& #include -.Ve -.PP -This automatically includes \fIev.h\fR and puts all of its definitions (many -of them macros) into the global namespace. All \*(C+ specific things are -put into the \f(CW\*(C`ev\*(C'\fR namespace. It should support all the same embedding -options as \fIev.h\fR, most notably \f(CW\*(C`EV_MULTIPLICITY\*(C'\fR. -.PP -Care has been taken to keep the overhead low. The only data member the \*(C+ -classes add (compared to plain C\-style watchers) is the event loop pointer -that the watcher is associated with (or no additional members at all if -you disable \f(CW\*(C`EV_MULTIPLICITY\*(C'\fR when embedding libev). -.PP -Currently, functions, static and non-static member functions and classes -with \f(CW\*(C`operator ()\*(C'\fR can be used as callbacks. Other types should be easy -to add as long as they only need one additional pointer for context. If -you need support for other types of functors please contact the author -(preferably after implementing it). -.PP -For all this to work, your \*(C+ compiler either has to use the same calling -conventions as your C compiler (for static member functions), or you have -to embed libev and compile libev itself as \*(C+. -.PP -Here is a list of things available in the \f(CW\*(C`ev\*(C'\fR namespace: -.ie n .IP """ev::READ"", ""ev::WRITE"" etc." 4 -.el .IP "\f(CWev::READ\fR, \f(CWev::WRITE\fR etc." 4 -.IX Item "ev::READ, ev::WRITE etc." -These are just enum values with the same values as the \f(CW\*(C`EV_READ\*(C'\fR etc. -macros from \fIev.h\fR. -.ie n .IP """ev::tstamp"", ""ev::now""" 4 -.el .IP "\f(CWev::tstamp\fR, \f(CWev::now\fR" 4 -.IX Item "ev::tstamp, ev::now" -Aliases to the same types/functions as with the \f(CW\*(C`ev_\*(C'\fR prefix. -.ie n .IP """ev::io"", ""ev::timer"", ""ev::periodic"", ""ev::idle"", ""ev::sig"" etc." 4 -.el .IP "\f(CWev::io\fR, \f(CWev::timer\fR, \f(CWev::periodic\fR, \f(CWev::idle\fR, \f(CWev::sig\fR etc." 4 -.IX Item "ev::io, ev::timer, ev::periodic, ev::idle, ev::sig etc." -For each \f(CW\*(C`ev_TYPE\*(C'\fR watcher in \fIev.h\fR there is a corresponding class of -the same name in the \f(CW\*(C`ev\*(C'\fR namespace, with the exception of \f(CW\*(C`ev_signal\*(C'\fR -which is called \f(CW\*(C`ev::sig\*(C'\fR to avoid clashes with the \f(CW\*(C`signal\*(C'\fR macro -defined by many implementations. -.Sp -All of those classes have these methods: -.RS 4 -.IP "ev::TYPE::TYPE ()" 4 -.IX Item "ev::TYPE::TYPE ()" -.PD 0 -.IP "ev::TYPE::TYPE (loop)" 4 -.IX Item "ev::TYPE::TYPE (loop)" -.IP "ev::TYPE::~TYPE" 4 -.IX Item "ev::TYPE::~TYPE" -.PD -The constructor (optionally) takes an event loop to associate the watcher -with. If it is omitted, it will use \f(CW\*(C`EV_DEFAULT\*(C'\fR. -.Sp -The constructor calls \f(CW\*(C`ev_init\*(C'\fR for you, which means you have to call the -\&\f(CW\*(C`set\*(C'\fR method before starting it. -.Sp -It will not set a callback, however: You have to call the templated \f(CW\*(C`set\*(C'\fR -method to set a callback before you can start the watcher. -.Sp -(The reason why you have to use a method is a limitation in \*(C+ which does -not allow explicit template arguments for constructors). -.Sp -The destructor automatically stops the watcher if it is active. -.IP "w\->set (object *)" 4 -.IX Item "w->set (object *)" -This method sets the callback method to call. The method has to have a -signature of \f(CW\*(C`void (*)(ev_TYPE &, int)\*(C'\fR, it receives the watcher as -first argument and the \f(CW\*(C`revents\*(C'\fR as second. The object must be given as -parameter and is stored in the \f(CW\*(C`data\*(C'\fR member of the watcher. -.Sp -This method synthesizes efficient thunking code to call your method from -the C callback that libev requires. If your compiler can inline your -callback (i.e. it is visible to it at the place of the \f(CW\*(C`set\*(C'\fR call and -your compiler is good :), then the method will be fully inlined into the -thunking function, making it as fast as a direct C callback. -.Sp -Example: simple class declaration and watcher initialisation -.Sp -.Vb 4 -\& struct myclass -\& { -\& void io_cb (ev::io &w, int revents) { } -\& } -\& -\& myclass obj; -\& ev::io iow; -\& iow.set (&obj); -.Ve -.IP "w\->set (object *)" 4 -.IX Item "w->set (object *)" -This is a variation of a method callback \- leaving out the method to call -will default the method to \f(CW\*(C`operator ()\*(C'\fR, which makes it possible to use -functor objects without having to manually specify the \f(CW\*(C`operator ()\*(C'\fR all -the time. Incidentally, you can then also leave out the template argument -list. -.Sp -The \f(CW\*(C`operator ()\*(C'\fR method prototype must be \f(CW\*(C`void operator ()(watcher &w, -int revents)\*(C'\fR. -.Sp -See the method\-\f(CW\*(C`set\*(C'\fR above for more details. -.Sp -Example: use a functor object as callback. -.Sp -.Vb 7 -\& struct myfunctor -\& { -\& void operator() (ev::io &w, int revents) -\& { -\& ... -\& } -\& } -\& -\& myfunctor f; -\& -\& ev::io w; -\& w.set (&f); -.Ve -.IP "w\->set (void *data = 0)" 4 -.IX Item "w->set (void *data = 0)" -Also sets a callback, but uses a static method or plain function as -callback. The optional \f(CW\*(C`data\*(C'\fR argument will be stored in the watcher's -\&\f(CW\*(C`data\*(C'\fR member and is free for you to use. -.Sp -The prototype of the \f(CW\*(C`function\*(C'\fR must be \f(CW\*(C`void (*)(ev::TYPE &w, int)\*(C'\fR. -.Sp -See the method\-\f(CW\*(C`set\*(C'\fR above for more details. -.Sp -Example: Use a plain function as callback. -.Sp -.Vb 2 -\& static void io_cb (ev::io &w, int revents) { } -\& iow.set (); -.Ve -.IP "w\->set (loop)" 4 -.IX Item "w->set (loop)" -Associates a different \f(CW\*(C`struct ev_loop\*(C'\fR with this watcher. You can only -do this when the watcher is inactive (and not pending either). -.IP "w\->set ([arguments])" 4 -.IX Item "w->set ([arguments])" -Basically the same as \f(CW\*(C`ev_TYPE_set\*(C'\fR (except for \f(CW\*(C`ev::embed\*(C'\fR watchers>), -with the same arguments. Either this method or a suitable start method -must be called at least once. Unlike the C counterpart, an active watcher -gets automatically stopped and restarted when reconfiguring it with this -method. -.Sp -For \f(CW\*(C`ev::embed\*(C'\fR watchers this method is called \f(CW\*(C`set_embed\*(C'\fR, to avoid -clashing with the \f(CW\*(C`set (loop)\*(C'\fR method. -.Sp -For \f(CW\*(C`ev::io\*(C'\fR watchers there is an additional \f(CW\*(C`set\*(C'\fR method that acepts a -new event mask only, and internally calls \f(CW\*(C`ev_io_modfify\*(C'\fR. -.IP "w\->start ()" 4 -.IX Item "w->start ()" -Starts the watcher. Note that there is no \f(CW\*(C`loop\*(C'\fR argument, as the -constructor already stores the event loop. -.IP "w\->start ([arguments])" 4 -.IX Item "w->start ([arguments])" -Instead of calling \f(CW\*(C`set\*(C'\fR and \f(CW\*(C`start\*(C'\fR methods separately, it is often -convenient to wrap them in one call. Uses the same type of arguments as -the configure \f(CW\*(C`set\*(C'\fR method of the watcher. -.IP "w\->stop ()" 4 -.IX Item "w->stop ()" -Stops the watcher if it is active. Again, no \f(CW\*(C`loop\*(C'\fR argument. -.ie n .IP "w\->again () (""ev::timer"", ""ev::periodic"" only)" 4 -.el .IP "w\->again () (\f(CWev::timer\fR, \f(CWev::periodic\fR only)" 4 -.IX Item "w->again () (ev::timer, ev::periodic only)" -For \f(CW\*(C`ev::timer\*(C'\fR and \f(CW\*(C`ev::periodic\*(C'\fR, this invokes the corresponding -\&\f(CW\*(C`ev_TYPE_again\*(C'\fR function. -.ie n .IP "w\->sweep () (""ev::embed"" only)" 4 -.el .IP "w\->sweep () (\f(CWev::embed\fR only)" 4 -.IX Item "w->sweep () (ev::embed only)" -Invokes \f(CW\*(C`ev_embed_sweep\*(C'\fR. -.ie n .IP "w\->update () (""ev::stat"" only)" 4 -.el .IP "w\->update () (\f(CWev::stat\fR only)" 4 -.IX Item "w->update () (ev::stat only)" -Invokes \f(CW\*(C`ev_stat_stat\*(C'\fR. -.RE -.RS 4 -.RE -.PP -Example: Define a class with two I/O and idle watchers, start the I/O -watchers in the constructor. -.PP -.Vb 5 -\& class myclass -\& { -\& ev::io io ; void io_cb (ev::io &w, int revents); -\& ev::io io2 ; void io2_cb (ev::io &w, int revents); -\& ev::idle idle; void idle_cb (ev::idle &w, int revents); -\& -\& myclass (int fd) -\& { -\& io .set (this); -\& io2 .set (this); -\& idle.set (this); -\& -\& io.set (fd, ev::WRITE); // configure the watcher -\& io.start (); // start it whenever convenient -\& -\& io2.start (fd, ev::READ); // set + start in one call -\& } -\& }; -.Ve -.SH "OTHER LANGUAGE BINDINGS" -.IX Header "OTHER LANGUAGE BINDINGS" -Libev does not offer other language bindings itself, but bindings for a -number of languages exist in the form of third-party packages. If you know -any interesting language binding in addition to the ones listed here, drop -me a note. -.IP "Perl" 4 -.IX Item "Perl" -The \s-1EV\s0 module implements the full libev \s-1API\s0 and is actually used to test -libev. \s-1EV\s0 is developed together with libev. Apart from the \s-1EV\s0 core module, -there are additional modules that implement libev-compatible interfaces -to \f(CW\*(C`libadns\*(C'\fR (\f(CW\*(C`EV::ADNS\*(C'\fR, but \f(CW\*(C`AnyEvent::DNS\*(C'\fR is preferred nowadays), -\&\f(CW\*(C`Net::SNMP\*(C'\fR (\f(CW\*(C`Net::SNMP::EV\*(C'\fR) and the \f(CW\*(C`libglib\*(C'\fR event core (\f(CW\*(C`Glib::EV\*(C'\fR -and \f(CW\*(C`EV::Glib\*(C'\fR). -.Sp -It can be found and installed via \s-1CPAN,\s0 its homepage is at -. -.IP "Python" 4 -.IX Item "Python" -Python bindings can be found at . It -seems to be quite complete and well-documented. -.IP "Ruby" 4 -.IX Item "Ruby" -Tony Arcieri has written a ruby extension that offers access to a subset -of the libev \s-1API\s0 and adds file handle abstractions, asynchronous \s-1DNS\s0 and -more on top of it. It can be found via gem servers. Its homepage is at -. -.Sp -Roger Pack reports that using the link order \f(CW\*(C`\-lws2_32 \-lmsvcrt\-ruby\-190\*(C'\fR -makes rev work even on mingw. -.IP "Haskell" 4 -.IX Item "Haskell" -A haskell binding to libev is available at -. -.IP "D" 4 -.IX Item "D" -Leandro Lucarella has written a D language binding (\fIev.d\fR) for libev, to -be found at . -.IP "Ocaml" 4 -.IX Item "Ocaml" -Erkki Seppala has written Ocaml bindings for libev, to be found at -. -.IP "Lua" 4 -.IX Item "Lua" -Brian Maher has written a partial interface to libev for lua (at the -time of this writing, only \f(CW\*(C`ev_io\*(C'\fR and \f(CW\*(C`ev_timer\*(C'\fR), to be found at -. -.IP "Javascript" 4 -.IX Item "Javascript" -Node.js () uses libev as the underlying event library. -.IP "Others" 4 -.IX Item "Others" -There are others, and I stopped counting. -.SH "MACRO MAGIC" -.IX Header "MACRO MAGIC" -Libev can be compiled with a variety of options, the most fundamental -of which is \f(CW\*(C`EV_MULTIPLICITY\*(C'\fR. This option determines whether (most) -functions and callbacks have an initial \f(CW\*(C`struct ev_loop *\*(C'\fR argument. -.PP -To make it easier to write programs that cope with either variant, the -following macros are defined: -.ie n .IP """EV_A"", ""EV_A_""" 4 -.el .IP "\f(CWEV_A\fR, \f(CWEV_A_\fR" 4 -.IX Item "EV_A, EV_A_" -This provides the loop \fIargument\fR for functions, if one is required (\*(L"ev -loop argument\*(R"). The \f(CW\*(C`EV_A\*(C'\fR form is used when this is the sole argument, -\&\f(CW\*(C`EV_A_\*(C'\fR is used when other arguments are following. Example: -.Sp -.Vb 3 -\& ev_unref (EV_A); -\& ev_timer_add (EV_A_ watcher); -\& ev_run (EV_A_ 0); -.Ve -.Sp -It assumes the variable \f(CW\*(C`loop\*(C'\fR of type \f(CW\*(C`struct ev_loop *\*(C'\fR is in scope, -which is often provided by the following macro. -.ie n .IP """EV_P"", ""EV_P_""" 4 -.el .IP "\f(CWEV_P\fR, \f(CWEV_P_\fR" 4 -.IX Item "EV_P, EV_P_" -This provides the loop \fIparameter\fR for functions, if one is required (\*(L"ev -loop parameter\*(R"). The \f(CW\*(C`EV_P\*(C'\fR form is used when this is the sole parameter, -\&\f(CW\*(C`EV_P_\*(C'\fR is used when other parameters are following. Example: -.Sp -.Vb 2 -\& // this is how ev_unref is being declared -\& static void ev_unref (EV_P); -\& -\& // this is how you can declare your typical callback -\& static void cb (EV_P_ ev_timer *w, int revents) -.Ve -.Sp -It declares a parameter \f(CW\*(C`loop\*(C'\fR of type \f(CW\*(C`struct ev_loop *\*(C'\fR, quite -suitable for use with \f(CW\*(C`EV_A\*(C'\fR. -.ie n .IP """EV_DEFAULT"", ""EV_DEFAULT_""" 4 -.el .IP "\f(CWEV_DEFAULT\fR, \f(CWEV_DEFAULT_\fR" 4 -.IX Item "EV_DEFAULT, EV_DEFAULT_" -Similar to the other two macros, this gives you the value of the default -loop, if multiple loops are supported (\*(L"ev loop default\*(R"). The default loop -will be initialised if it isn't already initialised. -.Sp -For non-multiplicity builds, these macros do nothing, so you always have -to initialise the loop somewhere. -.ie n .IP """EV_DEFAULT_UC"", ""EV_DEFAULT_UC_""" 4 -.el .IP "\f(CWEV_DEFAULT_UC\fR, \f(CWEV_DEFAULT_UC_\fR" 4 -.IX Item "EV_DEFAULT_UC, EV_DEFAULT_UC_" -Usage identical to \f(CW\*(C`EV_DEFAULT\*(C'\fR and \f(CW\*(C`EV_DEFAULT_\*(C'\fR, but requires that the -default loop has been initialised (\f(CW\*(C`UC\*(C'\fR == unchecked). Their behaviour -is undefined when the default loop has not been initialised by a previous -execution of \f(CW\*(C`EV_DEFAULT\*(C'\fR, \f(CW\*(C`EV_DEFAULT_\*(C'\fR or \f(CW\*(C`ev_default_init (...)\*(C'\fR. -.Sp -It is often prudent to use \f(CW\*(C`EV_DEFAULT\*(C'\fR when initialising the first -watcher in a function but use \f(CW\*(C`EV_DEFAULT_UC\*(C'\fR afterwards. -.PP -Example: Declare and initialise a check watcher, utilising the above -macros so it will work regardless of whether multiple loops are supported -or not. -.PP -.Vb 5 -\& static void -\& check_cb (EV_P_ ev_timer *w, int revents) -\& { -\& ev_check_stop (EV_A_ w); -\& } -\& -\& ev_check check; -\& ev_check_init (&check, check_cb); -\& ev_check_start (EV_DEFAULT_ &check); -\& ev_run (EV_DEFAULT_ 0); -.Ve -.SH "EMBEDDING" -.IX Header "EMBEDDING" -Libev can (and often is) directly embedded into host -applications. Examples of applications that embed it include the Deliantra -Game Server, the \s-1EV\s0 perl module, the \s-1GNU\s0 Virtual Private Ethernet (gvpe) -and rxvt-unicode. -.PP -The goal is to enable you to just copy the necessary files into your -source directory without having to change even a single line in them, so -you can easily upgrade by simply copying (or having a checked-out copy of -libev somewhere in your source tree). -.SS "\s-1FILESETS\s0" -.IX Subsection "FILESETS" -Depending on what features you need you need to include one or more sets of files -in your application. -.PP -\fI\s-1CORE EVENT LOOP\s0\fR -.IX Subsection "CORE EVENT LOOP" -.PP -To include only the libev core (all the \f(CW\*(C`ev_*\*(C'\fR functions), with manual -configuration (no autoconf): -.PP -.Vb 2 -\& #define EV_STANDALONE 1 -\& #include "ev.c" -.Ve -.PP -This will automatically include \fIev.h\fR, too, and should be done in a -single C source file only to provide the function implementations. To use -it, do the same for \fIev.h\fR in all files wishing to use this \s-1API\s0 (best -done by writing a wrapper around \fIev.h\fR that you can include instead and -where you can put other configuration options): -.PP -.Vb 2 -\& #define EV_STANDALONE 1 -\& #include "ev.h" -.Ve -.PP -Both header files and implementation files can be compiled with a \*(C+ -compiler (at least, that's a stated goal, and breakage will be treated -as a bug). -.PP -You need the following files in your source tree, or in a directory -in your include path (e.g. in libev/ when using \-Ilibev): -.PP -.Vb 4 -\& ev.h -\& ev.c -\& ev_vars.h -\& ev_wrap.h -\& -\& ev_win32.c required on win32 platforms only -\& -\& ev_select.c only when select backend is enabled -\& ev_poll.c only when poll backend is enabled -\& ev_epoll.c only when the epoll backend is enabled -\& ev_linuxaio.c only when the linux aio backend is enabled -\& ev_iouring.c only when the linux io_uring backend is enabled -\& ev_kqueue.c only when the kqueue backend is enabled -\& ev_port.c only when the solaris port backend is enabled -.Ve -.PP -\&\fIev.c\fR includes the backend files directly when enabled, so you only need -to compile this single file. -.PP -\fI\s-1LIBEVENT COMPATIBILITY API\s0\fR -.IX Subsection "LIBEVENT COMPATIBILITY API" -.PP -To include the libevent compatibility \s-1API,\s0 also include: -.PP -.Vb 1 -\& #include "event.c" -.Ve -.PP -in the file including \fIev.c\fR, and: -.PP -.Vb 1 -\& #include "event.h" -.Ve -.PP -in the files that want to use the libevent \s-1API.\s0 This also includes \fIev.h\fR. -.PP -You need the following additional files for this: -.PP -.Vb 2 -\& event.h -\& event.c -.Ve -.PP -\fI\s-1AUTOCONF SUPPORT\s0\fR -.IX Subsection "AUTOCONF SUPPORT" -.PP -Instead of using \f(CW\*(C`EV_STANDALONE=1\*(C'\fR and providing your configuration in -whatever way you want, you can also \f(CW\*(C`m4_include([libev.m4])\*(C'\fR in your -\&\fIconfigure.ac\fR and leave \f(CW\*(C`EV_STANDALONE\*(C'\fR undefined. \fIev.c\fR will then -include \fIconfig.h\fR and configure itself accordingly. -.PP -For this of course you need the m4 file: -.PP -.Vb 1 -\& libev.m4 -.Ve -.SS "\s-1PREPROCESSOR SYMBOLS/MACROS\s0" -.IX Subsection "PREPROCESSOR SYMBOLS/MACROS" -Libev can be configured via a variety of preprocessor symbols you have to -define before including (or compiling) any of its files. The default in -the absence of autoconf is documented for every option. -.PP -Symbols marked with \*(L"(h)\*(R" do not change the \s-1ABI,\s0 and can have different -values when compiling libev vs. including \fIev.h\fR, so it is permissible -to redefine them before including \fIev.h\fR without breaking compatibility -to a compiled library. All other symbols change the \s-1ABI,\s0 which means all -users of libev and the libev code itself must be compiled with compatible -settings. -.IP "\s-1EV_COMPAT3\s0 (h)" 4 -.IX Item "EV_COMPAT3 (h)" -Backwards compatibility is a major concern for libev. This is why this -release of libev comes with wrappers for the functions and symbols that -have been renamed between libev version 3 and 4. -.Sp -You can disable these wrappers (to test compatibility with future -versions) by defining \f(CW\*(C`EV_COMPAT3\*(C'\fR to \f(CW0\fR when compiling your -sources. This has the additional advantage that you can drop the \f(CW\*(C`struct\*(C'\fR -from \f(CW\*(C`struct ev_loop\*(C'\fR declarations, as libev will provide an \f(CW\*(C`ev_loop\*(C'\fR -typedef in that case. -.Sp -In some future version, the default for \f(CW\*(C`EV_COMPAT3\*(C'\fR will become \f(CW0\fR, -and in some even more future version the compatibility code will be -removed completely. -.IP "\s-1EV_STANDALONE\s0 (h)" 4 -.IX Item "EV_STANDALONE (h)" -Must always be \f(CW1\fR if you do not use autoconf configuration, which -keeps libev from including \fIconfig.h\fR, and it also defines dummy -implementations for some libevent functions (such as logging, which is not -supported). It will also not define any of the structs usually found in -\&\fIevent.h\fR that are not directly supported by the libev core alone. -.Sp -In standalone mode, libev will still try to automatically deduce the -configuration, but has to be more conservative. -.IP "\s-1EV_USE_FLOOR\s0" 4 -.IX Item "EV_USE_FLOOR" -If defined to be \f(CW1\fR, libev will use the \f(CW\*(C`floor ()\*(C'\fR function for its -periodic reschedule calculations, otherwise libev will fall back on a -portable (slower) implementation. If you enable this, you usually have to -link against libm or something equivalent. Enabling this when the \f(CW\*(C`floor\*(C'\fR -function is not available will fail, so the safe default is to not enable -this. -.IP "\s-1EV_USE_MONOTONIC\s0" 4 -.IX Item "EV_USE_MONOTONIC" -If defined to be \f(CW1\fR, libev will try to detect the availability of the -monotonic clock option at both compile time and runtime. Otherwise no -use of the monotonic clock option will be attempted. If you enable this, -you usually have to link against librt or something similar. Enabling it -when the functionality isn't available is safe, though, although you have -to make sure you link against any libraries where the \f(CW\*(C`clock_gettime\*(C'\fR -function is hiding in (often \fI\-lrt\fR). See also \f(CW\*(C`EV_USE_CLOCK_SYSCALL\*(C'\fR. -.IP "\s-1EV_USE_REALTIME\s0" 4 -.IX Item "EV_USE_REALTIME" -If defined to be \f(CW1\fR, libev will try to detect the availability of the -real-time clock option at compile time (and assume its availability -at runtime if successful). Otherwise no use of the real-time clock -option will be attempted. This effectively replaces \f(CW\*(C`gettimeofday\*(C'\fR -by \f(CW\*(C`clock_get (CLOCK_REALTIME, ...)\*(C'\fR and will not normally affect -correctness. See the note about libraries in the description of -\&\f(CW\*(C`EV_USE_MONOTONIC\*(C'\fR, though. Defaults to the opposite value of -\&\f(CW\*(C`EV_USE_CLOCK_SYSCALL\*(C'\fR. -.IP "\s-1EV_USE_CLOCK_SYSCALL\s0" 4 -.IX Item "EV_USE_CLOCK_SYSCALL" -If defined to be \f(CW1\fR, libev will try to use a direct syscall instead -of calling the system-provided \f(CW\*(C`clock_gettime\*(C'\fR function. This option -exists because on GNU/Linux, \f(CW\*(C`clock_gettime\*(C'\fR is in \f(CW\*(C`librt\*(C'\fR, but \f(CW\*(C`librt\*(C'\fR -unconditionally pulls in \f(CW\*(C`libpthread\*(C'\fR, slowing down single-threaded -programs needlessly. Using a direct syscall is slightly slower (in -theory), because no optimised vdso implementation can be used, but avoids -the pthread dependency. Defaults to \f(CW1\fR on GNU/Linux with glibc 2.x or -higher, as it simplifies linking (no need for \f(CW\*(C`\-lrt\*(C'\fR). -.IP "\s-1EV_USE_NANOSLEEP\s0" 4 -.IX Item "EV_USE_NANOSLEEP" -If defined to be \f(CW1\fR, libev will assume that \f(CW\*(C`nanosleep ()\*(C'\fR is available -and will use it for delays. Otherwise it will use \f(CW\*(C`select ()\*(C'\fR. -.IP "\s-1EV_USE_EVENTFD\s0" 4 -.IX Item "EV_USE_EVENTFD" -If defined to be \f(CW1\fR, then libev will assume that \f(CW\*(C`eventfd ()\*(C'\fR is -available and will probe for kernel support at runtime. This will improve -\&\f(CW\*(C`ev_signal\*(C'\fR and \f(CW\*(C`ev_async\*(C'\fR performance and reduce resource consumption. -If undefined, it will be enabled if the headers indicate GNU/Linux + Glibc -2.7 or newer, otherwise disabled. -.IP "\s-1EV_USE_SIGNALFD\s0" 4 -.IX Item "EV_USE_SIGNALFD" -If defined to be \f(CW1\fR, then libev will assume that \f(CW\*(C`signalfd ()\*(C'\fR is -available and will probe for kernel support at runtime. This enables -the use of \s-1EVFLAG_SIGNALFD\s0 for faster and simpler signal handling. If -undefined, it will be enabled if the headers indicate GNU/Linux + Glibc -2.7 or newer, otherwise disabled. -.IP "\s-1EV_USE_TIMERFD\s0" 4 -.IX Item "EV_USE_TIMERFD" -If defined to be \f(CW1\fR, then libev will assume that \f(CW\*(C`timerfd ()\*(C'\fR is -available and will probe for kernel support at runtime. This allows -libev to detect time jumps accurately. If undefined, it will be enabled -if the headers indicate GNU/Linux + Glibc 2.8 or newer and define -\&\f(CW\*(C`TFD_TIMER_CANCEL_ON_SET\*(C'\fR, otherwise disabled. -.IP "\s-1EV_USE_EVENTFD\s0" 4 -.IX Item "EV_USE_EVENTFD" -If defined to be \f(CW1\fR, then libev will assume that \f(CW\*(C`eventfd ()\*(C'\fR is -available and will probe for kernel support at runtime. This will improve -\&\f(CW\*(C`ev_signal\*(C'\fR and \f(CW\*(C`ev_async\*(C'\fR performance and reduce resource consumption. -If undefined, it will be enabled if the headers indicate GNU/Linux + Glibc -2.7 or newer, otherwise disabled. -.IP "\s-1EV_USE_SELECT\s0" 4 -.IX Item "EV_USE_SELECT" -If undefined or defined to be \f(CW1\fR, libev will compile in support for the -\&\f(CW\*(C`select\*(C'\fR(2) backend. No attempt at auto-detection will be done: if no -other method takes over, select will be it. Otherwise the select backend -will not be compiled in. -.IP "\s-1EV_SELECT_USE_FD_SET\s0" 4 -.IX Item "EV_SELECT_USE_FD_SET" -If defined to \f(CW1\fR, then the select backend will use the system \f(CW\*(C`fd_set\*(C'\fR -structure. This is useful if libev doesn't compile due to a missing -\&\f(CW\*(C`NFDBITS\*(C'\fR or \f(CW\*(C`fd_mask\*(C'\fR definition or it mis-guesses the bitset layout -on exotic systems. This usually limits the range of file descriptors to -some low limit such as 1024 or might have other limitations (winsocket -only allows 64 sockets). The \f(CW\*(C`FD_SETSIZE\*(C'\fR macro, set before compilation, -configures the maximum size of the \f(CW\*(C`fd_set\*(C'\fR. -.IP "\s-1EV_SELECT_IS_WINSOCKET\s0" 4 -.IX Item "EV_SELECT_IS_WINSOCKET" -When defined to \f(CW1\fR, the select backend will assume that -select/socket/connect etc. don't understand file descriptors but -wants osf handles on win32 (this is the case when the select to -be used is the winsock select). This means that it will call -\&\f(CW\*(C`_get_osfhandle\*(C'\fR on the fd to convert it to an \s-1OS\s0 handle. Otherwise, -it is assumed that all these functions actually work on fds, even -on win32. Should not be defined on non\-win32 platforms. -.IP "\s-1EV_FD_TO_WIN32_HANDLE\s0(fd)" 4 -.IX Item "EV_FD_TO_WIN32_HANDLE(fd)" -If \f(CW\*(C`EV_SELECT_IS_WINSOCKET\*(C'\fR is enabled, then libev needs a way to map -file descriptors to socket handles. When not defining this symbol (the -default), then libev will call \f(CW\*(C`_get_osfhandle\*(C'\fR, which is usually -correct. In some cases, programs use their own file descriptor management, -in which case they can provide this function to map fds to socket handles. -.IP "\s-1EV_WIN32_HANDLE_TO_FD\s0(handle)" 4 -.IX Item "EV_WIN32_HANDLE_TO_FD(handle)" -If \f(CW\*(C`EV_SELECT_IS_WINSOCKET\*(C'\fR then libev maps handles to file descriptors -using the standard \f(CW\*(C`_open_osfhandle\*(C'\fR function. For programs implementing -their own fd to handle mapping, overwriting this function makes it easier -to do so. This can be done by defining this macro to an appropriate value. -.IP "\s-1EV_WIN32_CLOSE_FD\s0(fd)" 4 -.IX Item "EV_WIN32_CLOSE_FD(fd)" -If programs implement their own fd to handle mapping on win32, then this -macro can be used to override the \f(CW\*(C`close\*(C'\fR function, useful to unregister -file descriptors again. Note that the replacement function has to close -the underlying \s-1OS\s0 handle. -.IP "\s-1EV_USE_WSASOCKET\s0" 4 -.IX Item "EV_USE_WSASOCKET" -If defined to be \f(CW1\fR, libev will use \f(CW\*(C`WSASocket\*(C'\fR to create its internal -communication socket, which works better in some environments. Otherwise, -the normal \f(CW\*(C`socket\*(C'\fR function will be used, which works better in other -environments. -.IP "\s-1EV_USE_POLL\s0" 4 -.IX Item "EV_USE_POLL" -If defined to be \f(CW1\fR, libev will compile in support for the \f(CW\*(C`poll\*(C'\fR(2) -backend. Otherwise it will be enabled on non\-win32 platforms. It -takes precedence over select. -.IP "\s-1EV_USE_EPOLL\s0" 4 -.IX Item "EV_USE_EPOLL" -If defined to be \f(CW1\fR, libev will compile in support for the Linux -\&\f(CW\*(C`epoll\*(C'\fR(7) backend. Its availability will be detected at runtime, -otherwise another method will be used as fallback. This is the preferred -backend for GNU/Linux systems. If undefined, it will be enabled if the -headers indicate GNU/Linux + Glibc 2.4 or newer, otherwise disabled. -.IP "\s-1EV_USE_LINUXAIO\s0" 4 -.IX Item "EV_USE_LINUXAIO" -If defined to be \f(CW1\fR, libev will compile in support for the Linux aio -backend (\f(CW\*(C`EV_USE_EPOLL\*(C'\fR must also be enabled). If undefined, it will be -enabled on linux, otherwise disabled. -.IP "\s-1EV_USE_IOURING\s0" 4 -.IX Item "EV_USE_IOURING" -If defined to be \f(CW1\fR, libev will compile in support for the Linux -io_uring backend (\f(CW\*(C`EV_USE_EPOLL\*(C'\fR must also be enabled). Due to it's -current limitations it has to be requested explicitly. If undefined, it -will be enabled on linux, otherwise disabled. -.IP "\s-1EV_USE_KQUEUE\s0" 4 -.IX Item "EV_USE_KQUEUE" -If defined to be \f(CW1\fR, libev will compile in support for the \s-1BSD\s0 style -\&\f(CW\*(C`kqueue\*(C'\fR(2) backend. Its actual availability will be detected at runtime, -otherwise another method will be used as fallback. This is the preferred -backend for \s-1BSD\s0 and BSD-like systems, although on most BSDs kqueue only -supports some types of fds correctly (the only platform we found that -supports ptys for example was NetBSD), so kqueue might be compiled in, but -not be used unless explicitly requested. The best way to use it is to find -out whether kqueue supports your type of fd properly and use an embedded -kqueue loop. -.IP "\s-1EV_USE_PORT\s0" 4 -.IX Item "EV_USE_PORT" -If defined to be \f(CW1\fR, libev will compile in support for the Solaris -10 port style backend. Its availability will be detected at runtime, -otherwise another method will be used as fallback. This is the preferred -backend for Solaris 10 systems. -.IP "\s-1EV_USE_DEVPOLL\s0" 4 -.IX Item "EV_USE_DEVPOLL" -Reserved for future expansion, works like the \s-1USE\s0 symbols above. -.IP "\s-1EV_USE_INOTIFY\s0" 4 -.IX Item "EV_USE_INOTIFY" -If defined to be \f(CW1\fR, libev will compile in support for the Linux inotify -interface to speed up \f(CW\*(C`ev_stat\*(C'\fR watchers. Its actual availability will -be detected at runtime. If undefined, it will be enabled if the headers -indicate GNU/Linux + Glibc 2.4 or newer, otherwise disabled. -.IP "\s-1EV_NO_SMP\s0" 4 -.IX Item "EV_NO_SMP" -If defined to be \f(CW1\fR, libev will assume that memory is always coherent -between threads, that is, threads can be used, but threads never run on -different cpus (or different cpu cores). This reduces dependencies -and makes libev faster. -.IP "\s-1EV_NO_THREADS\s0" 4 -.IX Item "EV_NO_THREADS" -If defined to be \f(CW1\fR, libev will assume that it will never be called from -different threads (that includes signal handlers), which is a stronger -assumption than \f(CW\*(C`EV_NO_SMP\*(C'\fR, above. This reduces dependencies and makes -libev faster. -.IP "\s-1EV_ATOMIC_T\s0" 4 -.IX Item "EV_ATOMIC_T" -Libev requires an integer type (suitable for storing \f(CW0\fR or \f(CW1\fR) whose -access is atomic with respect to other threads or signal contexts. No -such type is easily found in the C language, so you can provide your own -type that you know is safe for your purposes. It is used both for signal -handler \*(L"locking\*(R" as well as for signal and thread safety in \f(CW\*(C`ev_async\*(C'\fR -watchers. -.Sp -In the absence of this define, libev will use \f(CW\*(C`sig_atomic_t volatile\*(C'\fR -(from \fIsignal.h\fR), which is usually good enough on most platforms. -.IP "\s-1EV_H\s0 (h)" 4 -.IX Item "EV_H (h)" -The name of the \fIev.h\fR header file used to include it. The default if -undefined is \f(CW"ev.h"\fR in \fIevent.h\fR, \fIev.c\fR and \fIev++.h\fR. This can be -used to virtually rename the \fIev.h\fR header file in case of conflicts. -.IP "\s-1EV_CONFIG_H\s0 (h)" 4 -.IX Item "EV_CONFIG_H (h)" -If \f(CW\*(C`EV_STANDALONE\*(C'\fR isn't \f(CW1\fR, this variable can be used to override -\&\fIev.c\fR's idea of where to find the \fIconfig.h\fR file, similarly to -\&\f(CW\*(C`EV_H\*(C'\fR, above. -.IP "\s-1EV_EVENT_H\s0 (h)" 4 -.IX Item "EV_EVENT_H (h)" -Similarly to \f(CW\*(C`EV_H\*(C'\fR, this macro can be used to override \fIevent.c\fR's idea -of how the \fIevent.h\fR header can be found, the default is \f(CW"event.h"\fR. -.IP "\s-1EV_PROTOTYPES\s0 (h)" 4 -.IX Item "EV_PROTOTYPES (h)" -If defined to be \f(CW0\fR, then \fIev.h\fR will not define any function -prototypes, but still define all the structs and other symbols. This is -occasionally useful if you want to provide your own wrapper functions -around libev functions. -.IP "\s-1EV_MULTIPLICITY\s0" 4 -.IX Item "EV_MULTIPLICITY" -If undefined or defined to \f(CW1\fR, then all event-loop-specific functions -will have the \f(CW\*(C`struct ev_loop *\*(C'\fR as first argument, and you can create -additional independent event loops. Otherwise there will be no support -for multiple event loops and there is no first event loop pointer -argument. Instead, all functions act on the single default loop. -.Sp -Note that \f(CW\*(C`EV_DEFAULT\*(C'\fR and \f(CW\*(C`EV_DEFAULT_\*(C'\fR will no longer provide a -default loop when multiplicity is switched off \- you always have to -initialise the loop manually in this case. -.IP "\s-1EV_MINPRI\s0" 4 -.IX Item "EV_MINPRI" -.PD 0 -.IP "\s-1EV_MAXPRI\s0" 4 -.IX Item "EV_MAXPRI" -.PD -The range of allowed priorities. \f(CW\*(C`EV_MINPRI\*(C'\fR must be smaller or equal to -\&\f(CW\*(C`EV_MAXPRI\*(C'\fR, but otherwise there are no non-obvious limitations. You can -provide for more priorities by overriding those symbols (usually defined -to be \f(CW\*(C`\-2\*(C'\fR and \f(CW2\fR, respectively). -.Sp -When doing priority-based operations, libev usually has to linearly search -all the priorities, so having many of them (hundreds) uses a lot of space -and time, so using the defaults of five priorities (\-2 .. +2) is usually -fine. -.Sp -If your embedding application does not need any priorities, defining these -both to \f(CW0\fR will save some memory and \s-1CPU.\s0 -.IP "\s-1EV_PERIODIC_ENABLE, EV_IDLE_ENABLE, EV_EMBED_ENABLE, EV_STAT_ENABLE, EV_PREPARE_ENABLE, EV_CHECK_ENABLE, EV_FORK_ENABLE, EV_SIGNAL_ENABLE, EV_ASYNC_ENABLE, EV_CHILD_ENABLE.\s0" 4 -.IX Item "EV_PERIODIC_ENABLE, EV_IDLE_ENABLE, EV_EMBED_ENABLE, EV_STAT_ENABLE, EV_PREPARE_ENABLE, EV_CHECK_ENABLE, EV_FORK_ENABLE, EV_SIGNAL_ENABLE, EV_ASYNC_ENABLE, EV_CHILD_ENABLE." -If undefined or defined to be \f(CW1\fR (and the platform supports it), then -the respective watcher type is supported. If defined to be \f(CW0\fR, then it -is not. Disabling watcher types mainly saves code size. -.IP "\s-1EV_FEATURES\s0" 4 -.IX Item "EV_FEATURES" -If you need to shave off some kilobytes of code at the expense of some -speed (but with the full \s-1API\s0), you can define this symbol to request -certain subsets of functionality. The default is to enable all features -that can be enabled on the platform. -.Sp -A typical way to use this symbol is to define it to \f(CW0\fR (or to a bitset -with some broad features you want) and then selectively re-enable -additional parts you want, for example if you want everything minimal, -but multiple event loop support, async and child watchers and the poll -backend, use this: -.Sp -.Vb 5 -\& #define EV_FEATURES 0 -\& #define EV_MULTIPLICITY 1 -\& #define EV_USE_POLL 1 -\& #define EV_CHILD_ENABLE 1 -\& #define EV_ASYNC_ENABLE 1 -.Ve -.Sp -The actual value is a bitset, it can be a combination of the following -values (by default, all of these are enabled): -.RS 4 -.ie n .IP "1 \- faster/larger code" 4 -.el .IP "\f(CW1\fR \- faster/larger code" 4 -.IX Item "1 - faster/larger code" -Use larger code to speed up some operations. -.Sp -Currently this is used to override some inlining decisions (enlarging the -code size by roughly 30% on amd64). -.Sp -When optimising for size, use of compiler flags such as \f(CW\*(C`\-Os\*(C'\fR with -gcc is recommended, as well as \f(CW\*(C`\-DNDEBUG\*(C'\fR, as libev contains a number of -assertions. -.Sp -The default is off when \f(CW\*(C`_\|_OPTIMIZE_SIZE_\|_\*(C'\fR is defined by your compiler -(e.g. gcc with \f(CW\*(C`\-Os\*(C'\fR). -.ie n .IP "2 \- faster/larger data structures" 4 -.el .IP "\f(CW2\fR \- faster/larger data structures" 4 -.IX Item "2 - faster/larger data structures" -Replaces the small 2\-heap for timer management by a faster 4\-heap, larger -hash table sizes and so on. This will usually further increase code size -and can additionally have an effect on the size of data structures at -runtime. -.Sp -The default is off when \f(CW\*(C`_\|_OPTIMIZE_SIZE_\|_\*(C'\fR is defined by your compiler -(e.g. gcc with \f(CW\*(C`\-Os\*(C'\fR). -.ie n .IP "4 \- full \s-1API\s0 configuration" 4 -.el .IP "\f(CW4\fR \- full \s-1API\s0 configuration" 4 -.IX Item "4 - full API configuration" -This enables priorities (sets \f(CW\*(C`EV_MAXPRI\*(C'\fR=2 and \f(CW\*(C`EV_MINPRI\*(C'\fR=\-2), and -enables multiplicity (\f(CW\*(C`EV_MULTIPLICITY\*(C'\fR=1). -.ie n .IP "8 \- full \s-1API\s0" 4 -.el .IP "\f(CW8\fR \- full \s-1API\s0" 4 -.IX Item "8 - full API" -This enables a lot of the \*(L"lesser used\*(R" \s-1API\s0 functions. See \f(CW\*(C`ev.h\*(C'\fR for -details on which parts of the \s-1API\s0 are still available without this -feature, and do not complain if this subset changes over time. -.ie n .IP "16 \- enable all optional watcher types" 4 -.el .IP "\f(CW16\fR \- enable all optional watcher types" 4 -.IX Item "16 - enable all optional watcher types" -Enables all optional watcher types. If you want to selectively enable -only some watcher types other than I/O and timers (e.g. prepare, -embed, async, child...) you can enable them manually by defining -\&\f(CW\*(C`EV_watchertype_ENABLE\*(C'\fR to \f(CW1\fR instead. -.ie n .IP "32 \- enable all backends" 4 -.el .IP "\f(CW32\fR \- enable all backends" 4 -.IX Item "32 - enable all backends" -This enables all backends \- without this feature, you need to enable at -least one backend manually (\f(CW\*(C`EV_USE_SELECT\*(C'\fR is a good choice). -.ie n .IP "64 \- enable OS-specific ""helper"" APIs" 4 -.el .IP "\f(CW64\fR \- enable OS-specific ``helper'' APIs" 4 -.IX Item "64 - enable OS-specific helper APIs" -Enable inotify, eventfd, signalfd and similar OS-specific helper APIs by -default. -.RE -.RS 4 -.Sp -Compiling with \f(CW\*(C`gcc \-Os \-DEV_STANDALONE \-DEV_USE_EPOLL=1 \-DEV_FEATURES=0\*(C'\fR -reduces the compiled size of libev from 24.7Kb code/2.8Kb data to 6.5Kb -code/0.3Kb data on my GNU/Linux amd64 system, while still giving you I/O -watchers, timers and monotonic clock support. -.Sp -With an intelligent-enough linker (gcc+binutils are intelligent enough -when you use \f(CW\*(C`\-Wl,\-\-gc\-sections \-ffunction\-sections\*(C'\fR) functions unused by -your program might be left out as well \- a binary starting a timer and an -I/O watcher then might come out at only 5Kb. -.RE -.IP "\s-1EV_API_STATIC\s0" 4 -.IX Item "EV_API_STATIC" -If this symbol is defined (by default it is not), then all identifiers -will have static linkage. This means that libev will not export any -identifiers, and you cannot link against libev anymore. This can be useful -when you embed libev, only want to use libev functions in a single file, -and do not want its identifiers to be visible. -.Sp -To use this, define \f(CW\*(C`EV_API_STATIC\*(C'\fR and include \fIev.c\fR in the file that -wants to use libev. -.Sp -This option only works when libev is compiled with a C compiler, as \*(C+ -doesn't support the required declaration syntax. -.IP "\s-1EV_AVOID_STDIO\s0" 4 -.IX Item "EV_AVOID_STDIO" -If this is set to \f(CW1\fR at compiletime, then libev will avoid using stdio -functions (printf, scanf, perror etc.). This will increase the code size -somewhat, but if your program doesn't otherwise depend on stdio and your -libc allows it, this avoids linking in the stdio library which is quite -big. -.Sp -Note that error messages might become less precise when this option is -enabled. -.IP "\s-1EV_NSIG\s0" 4 -.IX Item "EV_NSIG" -The highest supported signal number, +1 (or, the number of -signals): Normally, libev tries to deduce the maximum number of signals -automatically, but sometimes this fails, in which case it can be -specified. Also, using a lower number than detected (\f(CW32\fR should be -good for about any system in existence) can save some memory, as libev -statically allocates some 12\-24 bytes per signal number. -.IP "\s-1EV_PID_HASHSIZE\s0" 4 -.IX Item "EV_PID_HASHSIZE" -\&\f(CW\*(C`ev_child\*(C'\fR watchers use a small hash table to distribute workload by -pid. The default size is \f(CW16\fR (or \f(CW1\fR with \f(CW\*(C`EV_FEATURES\*(C'\fR disabled), -usually more than enough. If you need to manage thousands of children you -might want to increase this value (\fImust\fR be a power of two). -.IP "\s-1EV_INOTIFY_HASHSIZE\s0" 4 -.IX Item "EV_INOTIFY_HASHSIZE" -\&\f(CW\*(C`ev_stat\*(C'\fR watchers use a small hash table to distribute workload by -inotify watch id. The default size is \f(CW16\fR (or \f(CW1\fR with \f(CW\*(C`EV_FEATURES\*(C'\fR -disabled), usually more than enough. If you need to manage thousands of -\&\f(CW\*(C`ev_stat\*(C'\fR watchers you might want to increase this value (\fImust\fR be a -power of two). -.IP "\s-1EV_USE_4HEAP\s0" 4 -.IX Item "EV_USE_4HEAP" -Heaps are not very cache-efficient. To improve the cache-efficiency of the -timer and periodics heaps, libev uses a 4\-heap when this symbol is defined -to \f(CW1\fR. The 4\-heap uses more complicated (longer) code but has noticeably -faster performance with many (thousands) of watchers. -.Sp -The default is \f(CW1\fR, unless \f(CW\*(C`EV_FEATURES\*(C'\fR overrides it, in which case it -will be \f(CW0\fR. -.IP "\s-1EV_HEAP_CACHE_AT\s0" 4 -.IX Item "EV_HEAP_CACHE_AT" -Heaps are not very cache-efficient. To improve the cache-efficiency of the -timer and periodics heaps, libev can cache the timestamp (\fIat\fR) within -the heap structure (selected by defining \f(CW\*(C`EV_HEAP_CACHE_AT\*(C'\fR to \f(CW1\fR), -which uses 8\-12 bytes more per watcher and a few hundred bytes more code, -but avoids random read accesses on heap changes. This improves performance -noticeably with many (hundreds) of watchers. -.Sp -The default is \f(CW1\fR, unless \f(CW\*(C`EV_FEATURES\*(C'\fR overrides it, in which case it -will be \f(CW0\fR. -.IP "\s-1EV_VERIFY\s0" 4 -.IX Item "EV_VERIFY" -Controls how much internal verification (see \f(CW\*(C`ev_verify ()\*(C'\fR) will -be done: If set to \f(CW0\fR, no internal verification code will be compiled -in. If set to \f(CW1\fR, then verification code will be compiled in, but not -called. If set to \f(CW2\fR, then the internal verification code will be -called once per loop, which can slow down libev. If set to \f(CW3\fR, then the -verification code will be called very frequently, which will slow down -libev considerably. -.Sp -Verification errors are reported via C's \f(CW\*(C`assert\*(C'\fR mechanism, so if you -disable that (e.g. by defining \f(CW\*(C`NDEBUG\*(C'\fR) then no errors will be reported. -.Sp -The default is \f(CW1\fR, unless \f(CW\*(C`EV_FEATURES\*(C'\fR overrides it, in which case it -will be \f(CW0\fR. -.IP "\s-1EV_COMMON\s0" 4 -.IX Item "EV_COMMON" -By default, all watchers have a \f(CW\*(C`void *data\*(C'\fR member. By redefining -this macro to something else you can include more and other types of -members. You have to define it each time you include one of the files, -though, and it must be identical each time. -.Sp -For example, the perl \s-1EV\s0 module uses something like this: -.Sp -.Vb 3 -\& #define EV_COMMON \e -\& SV *self; /* contains this struct */ \e -\& SV *cb_sv, *fh /* note no trailing ";" */ -.Ve -.IP "\s-1EV_CB_DECLARE\s0 (type)" 4 -.IX Item "EV_CB_DECLARE (type)" -.PD 0 -.IP "\s-1EV_CB_INVOKE\s0 (watcher, revents)" 4 -.IX Item "EV_CB_INVOKE (watcher, revents)" -.IP "ev_set_cb (ev, cb)" 4 -.IX Item "ev_set_cb (ev, cb)" -.PD -Can be used to change the callback member declaration in each watcher, -and the way callbacks are invoked and set. Must expand to a struct member -definition and a statement, respectively. See the \fIev.h\fR header file for -their default definitions. One possible use for overriding these is to -avoid the \f(CW\*(C`struct ev_loop *\*(C'\fR as first argument in all cases, or to use -method calls instead of plain function calls in \*(C+. -.SS "\s-1EXPORTED API SYMBOLS\s0" -.IX Subsection "EXPORTED API SYMBOLS" -If you need to re-export the \s-1API\s0 (e.g. via a \s-1DLL\s0) and you need a list of -exported symbols, you can use the provided \fISymbol.*\fR files which list -all public symbols, one per line: -.PP -.Vb 2 -\& Symbols.ev for libev proper -\& Symbols.event for the libevent emulation -.Ve -.PP -This can also be used to rename all public symbols to avoid clashes with -multiple versions of libev linked together (which is obviously bad in -itself, but sometimes it is inconvenient to avoid this). -.PP -A sed command like this will create wrapper \f(CW\*(C`#define\*(C'\fR's that you need to -include before including \fIev.h\fR: -.PP -.Vb 1 -\& wrap.h -.Ve -.PP -This would create a file \fIwrap.h\fR which essentially looks like this: -.PP -.Vb 4 -\& #define ev_backend myprefix_ev_backend -\& #define ev_check_start myprefix_ev_check_start -\& #define ev_check_stop myprefix_ev_check_stop -\& ... -.Ve -.SS "\s-1EXAMPLES\s0" -.IX Subsection "EXAMPLES" -For a real-world example of a program the includes libev -verbatim, you can have a look at the \s-1EV\s0 perl module -(). It has the libev files in -the \fIlibev/\fR subdirectory and includes them in the \fI\s-1EV/EVAPI\s0.h\fR (public -interface) and \fI\s-1EV\s0.xs\fR (implementation) files. Only the \fI\s-1EV\s0.xs\fR file -will be compiled. It is pretty complex because it provides its own header -file. -.PP -The usage in rxvt-unicode is simpler. It has a \fIev_cpp.h\fR header file -that everybody includes and which overrides some configure choices: -.PP -.Vb 8 -\& #define EV_FEATURES 8 -\& #define EV_USE_SELECT 1 -\& #define EV_PREPARE_ENABLE 1 -\& #define EV_IDLE_ENABLE 1 -\& #define EV_SIGNAL_ENABLE 1 -\& #define EV_CHILD_ENABLE 1 -\& #define EV_USE_STDEXCEPT 0 -\& #define EV_CONFIG_H -\& -\& #include "ev++.h" -.Ve -.PP -And a \fIev_cpp.C\fR implementation file that contains libev proper and is compiled: -.PP -.Vb 2 -\& #include "ev_cpp.h" -\& #include "ev.c" -.Ve -.SH "INTERACTION WITH OTHER PROGRAMS, LIBRARIES OR THE ENVIRONMENT" -.IX Header "INTERACTION WITH OTHER PROGRAMS, LIBRARIES OR THE ENVIRONMENT" -.SS "\s-1THREADS AND COROUTINES\s0" -.IX Subsection "THREADS AND COROUTINES" -\fI\s-1THREADS\s0\fR -.IX Subsection "THREADS" -.PP -All libev functions are reentrant and thread-safe unless explicitly -documented otherwise, but libev implements no locking itself. This means -that you can use as many loops as you want in parallel, as long as there -are no concurrent calls into any libev function with the same loop -parameter (\f(CW\*(C`ev_default_*\*(C'\fR calls have an implicit default loop parameter, -of course): libev guarantees that different event loops share no data -structures that need any locking. -.PP -Or to put it differently: calls with different loop parameters can be done -concurrently from multiple threads, calls with the same loop parameter -must be done serially (but can be done from different threads, as long as -only one thread ever is inside a call at any point in time, e.g. by using -a mutex per loop). -.PP -Specifically to support threads (and signal handlers), libev implements -so-called \f(CW\*(C`ev_async\*(C'\fR watchers, which allow some limited form of -concurrency on the same event loop, namely waking it up \*(L"from the -outside\*(R". -.PP -If you want to know which design (one loop, locking, or multiple loops -without or something else still) is best for your problem, then I cannot -help you, but here is some generic advice: -.IP "\(bu" 4 -most applications have a main thread: use the default libev loop -in that thread, or create a separate thread running only the default loop. -.Sp -This helps integrating other libraries or software modules that use libev -themselves and don't care/know about threading. -.IP "\(bu" 4 -one loop per thread is usually a good model. -.Sp -Doing this is almost never wrong, sometimes a better-performance model -exists, but it is always a good start. -.IP "\(bu" 4 -other models exist, such as the leader/follower pattern, where one -loop is handed through multiple threads in a kind of round-robin fashion. -.Sp -Choosing a model is hard \- look around, learn, know that usually you can do -better than you currently do :\-) -.IP "\(bu" 4 -often you need to talk to some other thread which blocks in the -event loop. -.Sp -\&\f(CW\*(C`ev_async\*(C'\fR watchers can be used to wake them up from other threads safely -(or from signal contexts...). -.Sp -An example use would be to communicate signals or other events that only -work in the default loop by registering the signal watcher with the -default loop and triggering an \f(CW\*(C`ev_async\*(C'\fR watcher from the default loop -watcher callback into the event loop interested in the signal. -.PP -See also \*(L"\s-1THREAD LOCKING EXAMPLE\*(R"\s0. -.PP -\fI\s-1COROUTINES\s0\fR -.IX Subsection "COROUTINES" -.PP -Libev is very accommodating to coroutines (\*(L"cooperative threads\*(R"): -libev fully supports nesting calls to its functions from different -coroutines (e.g. you can call \f(CW\*(C`ev_run\*(C'\fR on the same loop from two -different coroutines, and switch freely between both coroutines running -the loop, as long as you don't confuse yourself). The only exception is -that you must not do this from \f(CW\*(C`ev_periodic\*(C'\fR reschedule callbacks. -.PP -Care has been taken to ensure that libev does not keep local state inside -\&\f(CW\*(C`ev_run\*(C'\fR, and other calls do not usually allow for coroutine switches as -they do not call any callbacks. -.SS "\s-1COMPILER WARNINGS\s0" -.IX Subsection "COMPILER WARNINGS" -Depending on your compiler and compiler settings, you might get no or a -lot of warnings when compiling libev code. Some people are apparently -scared by this. -.PP -However, these are unavoidable for many reasons. For one, each compiler -has different warnings, and each user has different tastes regarding -warning options. \*(L"Warn-free\*(R" code therefore cannot be a goal except when -targeting a specific compiler and compiler-version. -.PP -Another reason is that some compiler warnings require elaborate -workarounds, or other changes to the code that make it less clear and less -maintainable. -.PP -And of course, some compiler warnings are just plain stupid, or simply -wrong (because they don't actually warn about the condition their message -seems to warn about). For example, certain older gcc versions had some -warnings that resulted in an extreme number of false positives. These have -been fixed, but some people still insist on making code warn-free with -such buggy versions. -.PP -While libev is written to generate as few warnings as possible, -\&\*(L"warn-free\*(R" code is not a goal, and it is recommended not to build libev -with any compiler warnings enabled unless you are prepared to cope with -them (e.g. by ignoring them). Remember that warnings are just that: -warnings, not errors, or proof of bugs. -.SS "\s-1VALGRIND\s0" -.IX Subsection "VALGRIND" -Valgrind has a special section here because it is a popular tool that is -highly useful. Unfortunately, valgrind reports are very hard to interpret. -.PP -If you think you found a bug (memory leak, uninitialised data access etc.) -in libev, then check twice: If valgrind reports something like: -.PP -.Vb 3 -\& ==2274== definitely lost: 0 bytes in 0 blocks. -\& ==2274== possibly lost: 0 bytes in 0 blocks. -\& ==2274== still reachable: 256 bytes in 1 blocks. -.Ve -.PP -Then there is no memory leak, just as memory accounted to global variables -is not a memleak \- the memory is still being referenced, and didn't leak. -.PP -Similarly, under some circumstances, valgrind might report kernel bugs -as if it were a bug in libev (e.g. in realloc or in the poll backend, -although an acceptable workaround has been found here), or it might be -confused. -.PP -Keep in mind that valgrind is a very good tool, but only a tool. Don't -make it into some kind of religion. -.PP -If you are unsure about something, feel free to contact the mailing list -with the full valgrind report and an explanation on why you think this -is a bug in libev (best check the archives, too :). However, don't be -annoyed when you get a brisk \*(L"this is no bug\*(R" answer and take the chance -of learning how to interpret valgrind properly. -.PP -If you need, for some reason, empty reports from valgrind for your project -I suggest using suppression lists. -.SH "PORTABILITY NOTES" -.IX Header "PORTABILITY NOTES" -.SS "\s-1GNU/LINUX 32 BIT LIMITATIONS\s0" -.IX Subsection "GNU/LINUX 32 BIT LIMITATIONS" -GNU/Linux is the only common platform that supports 64 bit file/large file -interfaces but \fIdisables\fR them by default. -.PP -That means that libev compiled in the default environment doesn't support -files larger than 2GiB or so, which mainly affects \f(CW\*(C`ev_stat\*(C'\fR watchers. -.PP -Unfortunately, many programs try to work around this GNU/Linux issue -by enabling the large file \s-1API,\s0 which makes them incompatible with the -standard libev compiled for their system. -.PP -Likewise, libev cannot enable the large file \s-1API\s0 itself as this would -suddenly make it incompatible to the default compile time environment, -i.e. all programs not using special compile switches. -.SS "\s-1OS/X AND DARWIN BUGS\s0" -.IX Subsection "OS/X AND DARWIN BUGS" -The whole thing is a bug if you ask me \- basically any system interface -you touch is broken, whether it is locales, poll, kqueue or even the -OpenGL drivers. -.PP -\fI\f(CI\*(C`kqueue\*(C'\fI is buggy\fR -.IX Subsection "kqueue is buggy" -.PP -The kqueue syscall is broken in all known versions \- most versions support -only sockets, many support pipes. -.PP -Libev tries to work around this by not using \f(CW\*(C`kqueue\*(C'\fR by default on this -rotten platform, but of course you can still ask for it when creating a -loop \- embedding a socket-only kqueue loop into a select-based one is -probably going to work well. -.PP -\fI\f(CI\*(C`poll\*(C'\fI is buggy\fR -.IX Subsection "poll is buggy" -.PP -Instead of fixing \f(CW\*(C`kqueue\*(C'\fR, Apple replaced their (working) \f(CW\*(C`poll\*(C'\fR -implementation by something calling \f(CW\*(C`kqueue\*(C'\fR internally around the 10.5.6 -release, so now \f(CW\*(C`kqueue\*(C'\fR \fIand\fR \f(CW\*(C`poll\*(C'\fR are broken. -.PP -Libev tries to work around this by not using \f(CW\*(C`poll\*(C'\fR by default on -this rotten platform, but of course you can still ask for it when creating -a loop. -.PP -\fI\f(CI\*(C`select\*(C'\fI is buggy\fR -.IX Subsection "select is buggy" -.PP -All that's left is \f(CW\*(C`select\*(C'\fR, and of course Apple found a way to fuck this -one up as well: On \s-1OS/X,\s0 \f(CW\*(C`select\*(C'\fR actively limits the number of file -descriptors you can pass in to 1024 \- your program suddenly crashes when -you use more. -.PP -There is an undocumented \*(L"workaround\*(R" for this \- defining -\&\f(CW\*(C`_DARWIN_UNLIMITED_SELECT\*(C'\fR, which libev tries to use, so select \fIshould\fR -work on \s-1OS/X.\s0 -.SS "\s-1SOLARIS PROBLEMS AND WORKAROUNDS\s0" -.IX Subsection "SOLARIS PROBLEMS AND WORKAROUNDS" -\fI\f(CI\*(C`errno\*(C'\fI reentrancy\fR -.IX Subsection "errno reentrancy" -.PP -The default compile environment on Solaris is unfortunately so -thread-unsafe that you can't even use components/libraries compiled -without \f(CW\*(C`\-D_REENTRANT\*(C'\fR in a threaded program, which, of course, isn't -defined by default. A valid, if stupid, implementation choice. -.PP -If you want to use libev in threaded environments you have to make sure -it's compiled with \f(CW\*(C`_REENTRANT\*(C'\fR defined. -.PP -\fIEvent port backend\fR -.IX Subsection "Event port backend" -.PP -The scalable event interface for Solaris is called \*(L"event -ports\*(R". Unfortunately, this mechanism is very buggy in all major -releases. If you run into high \s-1CPU\s0 usage, your program freezes or you get -a large number of spurious wakeups, make sure you have all the relevant -and latest kernel patches applied. No, I don't know which ones, but there -are multiple ones to apply, and afterwards, event ports actually work -great. -.PP -If you can't get it to work, you can try running the program by setting -the environment variable \f(CW\*(C`LIBEV_FLAGS=3\*(C'\fR to only allow \f(CW\*(C`poll\*(C'\fR and -\&\f(CW\*(C`select\*(C'\fR backends. -.SS "\s-1AIX POLL BUG\s0" -.IX Subsection "AIX POLL BUG" -\&\s-1AIX\s0 unfortunately has a broken \f(CW\*(C`poll.h\*(C'\fR header. Libev works around -this by trying to avoid the poll backend altogether (i.e. it's not even -compiled in), which normally isn't a big problem as \f(CW\*(C`select\*(C'\fR works fine -with large bitsets on \s-1AIX,\s0 and \s-1AIX\s0 is dead anyway. -.SS "\s-1WIN32 PLATFORM LIMITATIONS AND WORKAROUNDS\s0" -.IX Subsection "WIN32 PLATFORM LIMITATIONS AND WORKAROUNDS" -\fIGeneral issues\fR -.IX Subsection "General issues" -.PP -Win32 doesn't support any of the standards (e.g. \s-1POSIX\s0) that libev -requires, and its I/O model is fundamentally incompatible with the \s-1POSIX\s0 -model. Libev still offers limited functionality on this platform in -the form of the \f(CW\*(C`EVBACKEND_SELECT\*(C'\fR backend, and only supports socket -descriptors. This only applies when using Win32 natively, not when using -e.g. cygwin. Actually, it only applies to the microsofts own compilers, -as every compiler comes with a slightly differently broken/incompatible -environment. -.PP -Lifting these limitations would basically require the full -re-implementation of the I/O system. If you are into this kind of thing, -then note that glib does exactly that for you in a very portable way (note -also that glib is the slowest event library known to man). -.PP -There is no supported compilation method available on windows except -embedding it into other applications. -.PP -Sensible signal handling is officially unsupported by Microsoft \- libev -tries its best, but under most conditions, signals will simply not work. -.PP -Not a libev limitation but worth mentioning: windows apparently doesn't -accept large writes: instead of resulting in a partial write, windows will -either accept everything or return \f(CW\*(C`ENOBUFS\*(C'\fR if the buffer is too large, -so make sure you only write small amounts into your sockets (less than a -megabyte seems safe, but this apparently depends on the amount of memory -available). -.PP -Due to the many, low, and arbitrary limits on the win32 platform and -the abysmal performance of winsockets, using a large number of sockets -is not recommended (and not reasonable). If your program needs to use -more than a hundred or so sockets, then likely it needs to use a totally -different implementation for windows, as libev offers the \s-1POSIX\s0 readiness -notification model, which cannot be implemented efficiently on windows -(due to Microsoft monopoly games). -.PP -A typical way to use libev under windows is to embed it (see the embedding -section for details) and use the following \fIevwrap.h\fR header file instead -of \fIev.h\fR: -.PP -.Vb 2 -\& #define EV_STANDALONE /* keeps ev from requiring config.h */ -\& #define EV_SELECT_IS_WINSOCKET 1 /* configure libev for windows select */ -\& -\& #include "ev.h" -.Ve -.PP -And compile the following \fIevwrap.c\fR file into your project (make sure -you do \fInot\fR compile the \fIev.c\fR or any other embedded source files!): -.PP -.Vb 2 -\& #include "evwrap.h" -\& #include "ev.c" -.Ve -.PP -\fIThe winsocket \f(CI\*(C`select\*(C'\fI function\fR -.IX Subsection "The winsocket select function" -.PP -The winsocket \f(CW\*(C`select\*(C'\fR function doesn't follow \s-1POSIX\s0 in that it -requires socket \fIhandles\fR and not socket \fIfile descriptors\fR (it is -also extremely buggy). This makes select very inefficient, and also -requires a mapping from file descriptors to socket handles (the Microsoft -C runtime provides the function \f(CW\*(C`_open_osfhandle\*(C'\fR for this). See the -discussion of the \f(CW\*(C`EV_SELECT_USE_FD_SET\*(C'\fR, \f(CW\*(C`EV_SELECT_IS_WINSOCKET\*(C'\fR and -\&\f(CW\*(C`EV_FD_TO_WIN32_HANDLE\*(C'\fR preprocessor symbols for more info. -.PP -The configuration for a \*(L"naked\*(R" win32 using the Microsoft runtime -libraries and raw winsocket select is: -.PP -.Vb 2 -\& #define EV_USE_SELECT 1 -\& #define EV_SELECT_IS_WINSOCKET 1 /* forces EV_SELECT_USE_FD_SET, too */ -.Ve -.PP -Note that winsockets handling of fd sets is O(n), so you can easily get a -complexity in the O(nX) range when using win32. -.PP -\fILimited number of file descriptors\fR -.IX Subsection "Limited number of file descriptors" -.PP -Windows has numerous arbitrary (and low) limits on things. -.PP -Early versions of winsocket's select only supported waiting for a maximum -of \f(CW64\fR handles (probably owning to the fact that all windows kernels -can only wait for \f(CW64\fR things at the same time internally; Microsoft -recommends spawning a chain of threads and wait for 63 handles and the -previous thread in each. Sounds great!). -.PP -Newer versions support more handles, but you need to define \f(CW\*(C`FD_SETSIZE\*(C'\fR -to some high number (e.g. \f(CW2048\fR) before compiling the winsocket select -call (which might be in libev or elsewhere, for example, perl and many -other interpreters do their own select emulation on windows). -.PP -Another limit is the number of file descriptors in the Microsoft runtime -libraries, which by default is \f(CW64\fR (there must be a hidden \fI64\fR -fetish or something like this inside Microsoft). You can increase this -by calling \f(CW\*(C`_setmaxstdio\*(C'\fR, which can increase this limit to \f(CW2048\fR -(another arbitrary limit), but is broken in many versions of the Microsoft -runtime libraries. This might get you to about \f(CW512\fR or \f(CW2048\fR sockets -(depending on windows version and/or the phase of the moon). To get more, -you need to wrap all I/O functions and provide your own fd management, but -the cost of calling select (O(nX)) will likely make this unworkable. -.SS "\s-1PORTABILITY REQUIREMENTS\s0" -.IX Subsection "PORTABILITY REQUIREMENTS" -In addition to a working ISO-C implementation and of course the -backend-specific APIs, libev relies on a few additional extensions: -.ie n .IP """void (*)(ev_watcher_type *, int revents)"" must have compatible calling conventions regardless of ""ev_watcher_type *""." 4 -.el .IP "\f(CWvoid (*)(ev_watcher_type *, int revents)\fR must have compatible calling conventions regardless of \f(CWev_watcher_type *\fR." 4 -.IX Item "void (*)(ev_watcher_type *, int revents) must have compatible calling conventions regardless of ev_watcher_type *." -Libev assumes not only that all watcher pointers have the same internal -structure (guaranteed by \s-1POSIX\s0 but not by \s-1ISO C\s0 for example), but it also -assumes that the same (machine) code can be used to call any watcher -callback: The watcher callbacks have different type signatures, but libev -calls them using an \f(CW\*(C`ev_watcher *\*(C'\fR internally. -.IP "null pointers and integer zero are represented by 0 bytes" 4 -.IX Item "null pointers and integer zero are represented by 0 bytes" -Libev uses \f(CW\*(C`memset\*(C'\fR to initialise structs and arrays to \f(CW0\fR bytes, and -relies on this setting pointers and integers to null. -.IP "pointer accesses must be thread-atomic" 4 -.IX Item "pointer accesses must be thread-atomic" -Accessing a pointer value must be atomic, it must both be readable and -writable in one piece \- this is the case on all current architectures. -.ie n .IP """sig_atomic_t volatile"" must be thread-atomic as well" 4 -.el .IP "\f(CWsig_atomic_t volatile\fR must be thread-atomic as well" 4 -.IX Item "sig_atomic_t volatile must be thread-atomic as well" -The type \f(CW\*(C`sig_atomic_t volatile\*(C'\fR (or whatever is defined as -\&\f(CW\*(C`EV_ATOMIC_T\*(C'\fR) must be atomic with respect to accesses from different -threads. This is not part of the specification for \f(CW\*(C`sig_atomic_t\*(C'\fR, but is -believed to be sufficiently portable. -.ie n .IP """sigprocmask"" must work in a threaded environment" 4 -.el .IP "\f(CWsigprocmask\fR must work in a threaded environment" 4 -.IX Item "sigprocmask must work in a threaded environment" -Libev uses \f(CW\*(C`sigprocmask\*(C'\fR to temporarily block signals. This is not -allowed in a threaded program (\f(CW\*(C`pthread_sigmask\*(C'\fR has to be used). Typical -pthread implementations will either allow \f(CW\*(C`sigprocmask\*(C'\fR in the \*(L"main -thread\*(R" or will block signals process-wide, both behaviours would -be compatible with libev. Interaction between \f(CW\*(C`sigprocmask\*(C'\fR and -\&\f(CW\*(C`pthread_sigmask\*(C'\fR could complicate things, however. -.Sp -The most portable way to handle signals is to block signals in all threads -except the initial one, and run the signal handling loop in the initial -thread as well. -.ie n .IP """long"" must be large enough for common memory allocation sizes" 4 -.el .IP "\f(CWlong\fR must be large enough for common memory allocation sizes" 4 -.IX Item "long must be large enough for common memory allocation sizes" -To improve portability and simplify its \s-1API,\s0 libev uses \f(CW\*(C`long\*(C'\fR internally -instead of \f(CW\*(C`size_t\*(C'\fR when allocating its data structures. On non-POSIX -systems (Microsoft...) this might be unexpectedly low, but is still at -least 31 bits everywhere, which is enough for hundreds of millions of -watchers. -.ie n .IP """double"" must hold a time value in seconds with enough accuracy" 4 -.el .IP "\f(CWdouble\fR must hold a time value in seconds with enough accuracy" 4 -.IX Item "double must hold a time value in seconds with enough accuracy" -The type \f(CW\*(C`double\*(C'\fR is used to represent timestamps. It is required to -have at least 51 bits of mantissa (and 9 bits of exponent), which is -good enough for at least into the year 4000 with millisecond accuracy -(the design goal for libev). This requirement is overfulfilled by -implementations using \s-1IEEE 754,\s0 which is basically all existing ones. -.Sp -With \s-1IEEE 754\s0 doubles, you get microsecond accuracy until at least the -year 2255 (and millisecond accuracy till the year 287396 \- by then, libev -is either obsolete or somebody patched it to use \f(CW\*(C`long double\*(C'\fR or -something like that, just kidding). -.PP -If you know of other additional requirements drop me a note. -.SH "ALGORITHMIC COMPLEXITIES" -.IX Header "ALGORITHMIC COMPLEXITIES" -In this section the complexities of (many of) the algorithms used inside -libev will be documented. For complexity discussions about backends see -the documentation for \f(CW\*(C`ev_default_init\*(C'\fR. -.PP -All of the following are about amortised time: If an array needs to be -extended, libev needs to realloc and move the whole array, but this -happens asymptotically rarer with higher number of elements, so O(1) might -mean that libev does a lengthy realloc operation in rare cases, but on -average it is much faster and asymptotically approaches constant time. -.IP "Starting and stopping timer/periodic watchers: O(log skipped_other_timers)" 4 -.IX Item "Starting and stopping timer/periodic watchers: O(log skipped_other_timers)" -This means that, when you have a watcher that triggers in one hour and -there are 100 watchers that would trigger before that, then inserting will -have to skip roughly seven (\f(CW\*(C`ld 100\*(C'\fR) of these watchers. -.IP "Changing timer/periodic watchers (by autorepeat or calling again): O(log skipped_other_timers)" 4 -.IX Item "Changing timer/periodic watchers (by autorepeat or calling again): O(log skipped_other_timers)" -That means that changing a timer costs less than removing/adding them, -as only the relative motion in the event queue has to be paid for. -.IP "Starting io/check/prepare/idle/signal/child/fork/async watchers: O(1)" 4 -.IX Item "Starting io/check/prepare/idle/signal/child/fork/async watchers: O(1)" -These just add the watcher into an array or at the head of a list. -.IP "Stopping check/prepare/idle/fork/async watchers: O(1)" 4 -.IX Item "Stopping check/prepare/idle/fork/async watchers: O(1)" -.PD 0 -.IP "Stopping an io/signal/child watcher: O(number_of_watchers_for_this_(fd/signal/pid % \s-1EV_PID_HASHSIZE\s0))" 4 -.IX Item "Stopping an io/signal/child watcher: O(number_of_watchers_for_this_(fd/signal/pid % EV_PID_HASHSIZE))" -.PD -These watchers are stored in lists, so they need to be walked to find the -correct watcher to remove. The lists are usually short (you don't usually -have many watchers waiting for the same fd or signal: one is typical, two -is rare). -.IP "Finding the next timer in each loop iteration: O(1)" 4 -.IX Item "Finding the next timer in each loop iteration: O(1)" -By virtue of using a binary or 4\-heap, the next timer is always found at a -fixed position in the storage array. -.IP "Each change on a file descriptor per loop iteration: O(number_of_watchers_for_this_fd)" 4 -.IX Item "Each change on a file descriptor per loop iteration: O(number_of_watchers_for_this_fd)" -A change means an I/O watcher gets started or stopped, which requires -libev to recalculate its status (and possibly tell the kernel, depending -on backend and whether \f(CW\*(C`ev_io_set\*(C'\fR was used). -.IP "Activating one watcher (putting it into the pending state): O(1)" 4 -.IX Item "Activating one watcher (putting it into the pending state): O(1)" -.PD 0 -.IP "Priority handling: O(number_of_priorities)" 4 -.IX Item "Priority handling: O(number_of_priorities)" -.PD -Priorities are implemented by allocating some space for each -priority. When doing priority-based operations, libev usually has to -linearly search all the priorities, but starting/stopping and activating -watchers becomes O(1) with respect to priority handling. -.IP "Sending an ev_async: O(1)" 4 -.IX Item "Sending an ev_async: O(1)" -.PD 0 -.IP "Processing ev_async_send: O(number_of_async_watchers)" 4 -.IX Item "Processing ev_async_send: O(number_of_async_watchers)" -.IP "Processing signals: O(max_signal_number)" 4 -.IX Item "Processing signals: O(max_signal_number)" -.PD -Sending involves a system call \fIiff\fR there were no other \f(CW\*(C`ev_async_send\*(C'\fR -calls in the current loop iteration and the loop is currently -blocked. Checking for async and signal events involves iterating over all -running async watchers or all signal numbers. -.SH "PORTING FROM LIBEV 3.X TO 4.X" -.IX Header "PORTING FROM LIBEV 3.X TO 4.X" -The major version 4 introduced some incompatible changes to the \s-1API.\s0 -.PP -At the moment, the \f(CW\*(C`ev.h\*(C'\fR header file provides compatibility definitions -for all changes, so most programs should still compile. The compatibility -layer might be removed in later versions of libev, so better update to the -new \s-1API\s0 early than late. -.ie n .IP """EV_COMPAT3"" backwards compatibility mechanism" 4 -.el .IP "\f(CWEV_COMPAT3\fR backwards compatibility mechanism" 4 -.IX Item "EV_COMPAT3 backwards compatibility mechanism" -The backward compatibility mechanism can be controlled by -\&\f(CW\*(C`EV_COMPAT3\*(C'\fR. See \*(L"\s-1PREPROCESSOR SYMBOLS/MACROS\*(R"\s0 in the \*(L"\s-1EMBEDDING\*(R"\s0 -section. -.ie n .IP """ev_default_destroy"" and ""ev_default_fork"" have been removed" 4 -.el .IP "\f(CWev_default_destroy\fR and \f(CWev_default_fork\fR have been removed" 4 -.IX Item "ev_default_destroy and ev_default_fork have been removed" -These calls can be replaced easily by their \f(CW\*(C`ev_loop_xxx\*(C'\fR counterparts: -.Sp -.Vb 2 -\& ev_loop_destroy (EV_DEFAULT_UC); -\& ev_loop_fork (EV_DEFAULT); -.Ve -.IP "function/symbol renames" 4 -.IX Item "function/symbol renames" -A number of functions and symbols have been renamed: -.Sp -.Vb 3 -\& ev_loop => ev_run -\& EVLOOP_NONBLOCK => EVRUN_NOWAIT -\& EVLOOP_ONESHOT => EVRUN_ONCE -\& -\& ev_unloop => ev_break -\& EVUNLOOP_CANCEL => EVBREAK_CANCEL -\& EVUNLOOP_ONE => EVBREAK_ONE -\& EVUNLOOP_ALL => EVBREAK_ALL -\& -\& EV_TIMEOUT => EV_TIMER -\& -\& ev_loop_count => ev_iteration -\& ev_loop_depth => ev_depth -\& ev_loop_verify => ev_verify -.Ve -.Sp -Most functions working on \f(CW\*(C`struct ev_loop\*(C'\fR objects don't have an -\&\f(CW\*(C`ev_loop_\*(C'\fR prefix, so it was removed; \f(CW\*(C`ev_loop\*(C'\fR, \f(CW\*(C`ev_unloop\*(C'\fR and -associated constants have been renamed to not collide with the \f(CW\*(C`struct -ev_loop\*(C'\fR anymore and \f(CW\*(C`EV_TIMER\*(C'\fR now follows the same naming scheme -as all other watcher types. Note that \f(CW\*(C`ev_loop_fork\*(C'\fR is still called -\&\f(CW\*(C`ev_loop_fork\*(C'\fR because it would otherwise clash with the \f(CW\*(C`ev_fork\*(C'\fR -typedef. -.ie n .IP """EV_MINIMAL"" mechanism replaced by ""EV_FEATURES""" 4 -.el .IP "\f(CWEV_MINIMAL\fR mechanism replaced by \f(CWEV_FEATURES\fR" 4 -.IX Item "EV_MINIMAL mechanism replaced by EV_FEATURES" -The preprocessor symbol \f(CW\*(C`EV_MINIMAL\*(C'\fR has been replaced by a different -mechanism, \f(CW\*(C`EV_FEATURES\*(C'\fR. Programs using \f(CW\*(C`EV_MINIMAL\*(C'\fR usually compile -and work, but the library code will of course be larger. -.SH "GLOSSARY" -.IX Header "GLOSSARY" -.IP "active" 4 -.IX Item "active" -A watcher is active as long as it has been started and not yet stopped. -See \*(L"\s-1WATCHER STATES\*(R"\s0 for details. -.IP "application" 4 -.IX Item "application" -In this document, an application is whatever is using libev. -.IP "backend" 4 -.IX Item "backend" -The part of the code dealing with the operating system interfaces. -.IP "callback" 4 -.IX Item "callback" -The address of a function that is called when some event has been -detected. Callbacks are being passed the event loop, the watcher that -received the event, and the actual event bitset. -.IP "callback/watcher invocation" 4 -.IX Item "callback/watcher invocation" -The act of calling the callback associated with a watcher. -.IP "event" 4 -.IX Item "event" -A change of state of some external event, such as data now being available -for reading on a file descriptor, time having passed or simply not having -any other events happening anymore. -.Sp -In libev, events are represented as single bits (such as \f(CW\*(C`EV_READ\*(C'\fR or -\&\f(CW\*(C`EV_TIMER\*(C'\fR). -.IP "event library" 4 -.IX Item "event library" -A software package implementing an event model and loop. -.IP "event loop" 4 -.IX Item "event loop" -An entity that handles and processes external events and converts them -into callback invocations. -.IP "event model" 4 -.IX Item "event model" -The model used to describe how an event loop handles and processes -watchers and events. -.IP "pending" 4 -.IX Item "pending" -A watcher is pending as soon as the corresponding event has been -detected. See \*(L"\s-1WATCHER STATES\*(R"\s0 for details. -.IP "real time" 4 -.IX Item "real time" -The physical time that is observed. It is apparently strictly monotonic :) -.IP "wall-clock time" 4 -.IX Item "wall-clock time" -The time and date as shown on clocks. Unlike real time, it can actually -be wrong and jump forwards and backwards, e.g. when you adjust your -clock. -.IP "watcher" 4 -.IX Item "watcher" -A data structure that describes interest in certain events. Watchers need -to be started (attached to an event loop) before they can receive events. -.SH "AUTHOR" -.IX Header "AUTHOR" -Marc Lehmann , with repeated corrections by Mikael -Magnusson and Emanuele Giaquinta, and minor corrections by many others. diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/module.modulemap b/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/module.modulemap deleted file mode 100644 index d5e34df3..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/module.modulemap +++ /dev/null @@ -1,4 +0,0 @@ -module Clibsodium { - header "sodium.h" - export * -} diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium.h deleted file mode 100644 index 610d6328..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium.h +++ /dev/null @@ -1,73 +0,0 @@ - -#ifndef sodium_H -#define sodium_H - -#include "sodium/version.h" - -#include "sodium/core.h" -#include "sodium/crypto_aead_aes256gcm.h" -#include "sodium/crypto_aead_aegis128l.h" -#include "sodium/crypto_aead_aegis256.h" -#include "sodium/crypto_aead_chacha20poly1305.h" -#include "sodium/crypto_aead_xchacha20poly1305.h" -#include "sodium/crypto_auth.h" -#include "sodium/crypto_auth_hmacsha256.h" -#include "sodium/crypto_auth_hmacsha512.h" -#include "sodium/crypto_auth_hmacsha512256.h" -#include "sodium/crypto_box.h" -#include "sodium/crypto_box_curve25519xsalsa20poly1305.h" -#include "sodium/crypto_core_hsalsa20.h" -#include "sodium/crypto_core_hchacha20.h" -#include "sodium/crypto_core_salsa20.h" -#include "sodium/crypto_core_salsa2012.h" -#include "sodium/crypto_core_salsa208.h" -#include "sodium/crypto_generichash.h" -#include "sodium/crypto_generichash_blake2b.h" -#include "sodium/crypto_hash.h" -#include "sodium/crypto_hash_sha256.h" -#include "sodium/crypto_hash_sha512.h" -#include "sodium/crypto_kdf.h" -#include "sodium/crypto_kdf_blake2b.h" -#include "sodium/crypto_kx.h" -#include "sodium/crypto_onetimeauth.h" -#include "sodium/crypto_onetimeauth_poly1305.h" -#include "sodium/crypto_pwhash.h" -#include "sodium/crypto_pwhash_argon2i.h" -#include "sodium/crypto_scalarmult.h" -#include "sodium/crypto_scalarmult_curve25519.h" -#include "sodium/crypto_secretbox.h" -#include "sodium/crypto_secretbox_xsalsa20poly1305.h" -#include "sodium/crypto_secretstream_xchacha20poly1305.h" -#include "sodium/crypto_shorthash.h" -#include "sodium/crypto_shorthash_siphash24.h" -#include "sodium/crypto_sign.h" -#include "sodium/crypto_sign_ed25519.h" -#include "sodium/crypto_stream.h" -#include "sodium/crypto_stream_chacha20.h" -#include "sodium/crypto_stream_salsa20.h" -#include "sodium/crypto_stream_xsalsa20.h" -#include "sodium/crypto_verify_16.h" -#include "sodium/crypto_verify_32.h" -#include "sodium/crypto_verify_64.h" -#include "sodium/randombytes.h" -#include "sodium/randombytes_internal_random.h" -#include "sodium/randombytes_sysrandom.h" -#include "sodium/runtime.h" -#include "sodium/utils.h" - -#ifndef SODIUM_LIBRARY_MINIMAL -# include "sodium/crypto_box_curve25519xchacha20poly1305.h" -# include "sodium/crypto_core_ed25519.h" -# include "sodium/crypto_core_ristretto255.h" -# include "sodium/crypto_kdf_hkdf_sha256.h" -# include "sodium/crypto_kdf_hkdf_sha512.h" -# include "sodium/crypto_scalarmult_ed25519.h" -# include "sodium/crypto_scalarmult_ristretto255.h" -# include "sodium/crypto_secretbox_xchacha20poly1305.h" -# include "sodium/crypto_pwhash_scryptsalsa208sha256.h" -# include "sodium/crypto_stream_salsa2012.h" -# include "sodium/crypto_stream_salsa208.h" -# include "sodium/crypto_stream_xchacha20.h" -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/core.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/core.h deleted file mode 100644 index dd088d2c..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/core.h +++ /dev/null @@ -1,28 +0,0 @@ - -#ifndef sodium_core_H -#define sodium_core_H - -#include "export.h" - -#ifdef __cplusplus -extern "C" { -#endif - -SODIUM_EXPORT -int sodium_init(void) - __attribute__ ((warn_unused_result)); - -/* ---- */ - -SODIUM_EXPORT -int sodium_set_misuse_handler(void (*handler)(void)); - -SODIUM_EXPORT -void sodium_misuse(void) - __attribute__ ((noreturn)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_aead_aegis128l.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_aead_aegis128l.h deleted file mode 100644 index ed8d2f2b..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_aead_aegis128l.h +++ /dev/null @@ -1,96 +0,0 @@ -#ifndef crypto_aead_aegis128l_H -#define crypto_aead_aegis128l_H - -#include -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -SODIUM_EXPORT -int crypto_aead_aegis128l_is_available(void); - -#define crypto_aead_aegis128l_KEYBYTES 16U -SODIUM_EXPORT -size_t crypto_aead_aegis128l_keybytes(void); - -#define crypto_aead_aegis128l_NSECBYTES 0U -SODIUM_EXPORT -size_t crypto_aead_aegis128l_nsecbytes(void); - -#define crypto_aead_aegis128l_NPUBBYTES 16U -SODIUM_EXPORT -size_t crypto_aead_aegis128l_npubbytes(void); - -#define crypto_aead_aegis128l_ABYTES 16U -SODIUM_EXPORT -size_t crypto_aead_aegis128l_abytes(void); - -#define crypto_aead_aegis128l_MESSAGEBYTES_MAX \ - SODIUM_MIN(SODIUM_SIZE_MAX - crypto_aead_aegis128l_ABYTES, \ - (1ULL << 61) - 1) -SODIUM_EXPORT -size_t crypto_aead_aegis128l_messagebytes_max(void); - -SODIUM_EXPORT -int crypto_aead_aegis128l_encrypt(unsigned char *c, - unsigned long long *clen_p, - const unsigned char *m, - unsigned long long mlen, - const unsigned char *ad, - unsigned long long adlen, - const unsigned char *nsec, - const unsigned char *npub, - const unsigned char *k) - __attribute__ ((nonnull(1, 8, 9))); - -SODIUM_EXPORT -int crypto_aead_aegis128l_decrypt(unsigned char *m, - unsigned long long *mlen_p, - unsigned char *nsec, - const unsigned char *c, - unsigned long long clen, - const unsigned char *ad, - unsigned long long adlen, - const unsigned char *npub, - const unsigned char *k) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(4, 8, 9))); - -SODIUM_EXPORT -int crypto_aead_aegis128l_encrypt_detached(unsigned char *c, - unsigned char *mac, - unsigned long long *maclen_p, - const unsigned char *m, - unsigned long long mlen, - const unsigned char *ad, - unsigned long long adlen, - const unsigned char *nsec, - const unsigned char *npub, - const unsigned char *k) - __attribute__ ((nonnull(1, 2, 9, 10))); - -SODIUM_EXPORT -int crypto_aead_aegis128l_decrypt_detached(unsigned char *m, - unsigned char *nsec, - const unsigned char *c, - unsigned long long clen, - const unsigned char *mac, - const unsigned char *ad, - unsigned long long adlen, - const unsigned char *npub, - const unsigned char *k) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(3, 5, 8, 9))); - -SODIUM_EXPORT -void crypto_aead_aegis128l_keygen(unsigned char k[crypto_aead_aegis128l_KEYBYTES]) - __attribute__ ((nonnull)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_aead_aegis256.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_aead_aegis256.h deleted file mode 100644 index 32e76896..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_aead_aegis256.h +++ /dev/null @@ -1,96 +0,0 @@ -#ifndef crypto_aead_aegis256_H -#define crypto_aead_aegis256_H - -#include -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -SODIUM_EXPORT -int crypto_aead_aegis256_is_available(void); - -#define crypto_aead_aegis256_KEYBYTES 32U -SODIUM_EXPORT -size_t crypto_aead_aegis256_keybytes(void); - -#define crypto_aead_aegis256_NSECBYTES 0U -SODIUM_EXPORT -size_t crypto_aead_aegis256_nsecbytes(void); - -#define crypto_aead_aegis256_NPUBBYTES 32U -SODIUM_EXPORT -size_t crypto_aead_aegis256_npubbytes(void); - -#define crypto_aead_aegis256_ABYTES 16U -SODIUM_EXPORT -size_t crypto_aead_aegis256_abytes(void); - -#define crypto_aead_aegis256_MESSAGEBYTES_MAX \ - SODIUM_MIN(SODIUM_SIZE_MAX - crypto_aead_aegis256_ABYTES, \ - (1ULL << 61) - 1) -SODIUM_EXPORT -size_t crypto_aead_aegis256_messagebytes_max(void); - -SODIUM_EXPORT -int crypto_aead_aegis256_encrypt(unsigned char *c, - unsigned long long *clen_p, - const unsigned char *m, - unsigned long long mlen, - const unsigned char *ad, - unsigned long long adlen, - const unsigned char *nsec, - const unsigned char *npub, - const unsigned char *k) - __attribute__ ((nonnull(1, 8, 9))); - -SODIUM_EXPORT -int crypto_aead_aegis256_decrypt(unsigned char *m, - unsigned long long *mlen_p, - unsigned char *nsec, - const unsigned char *c, - unsigned long long clen, - const unsigned char *ad, - unsigned long long adlen, - const unsigned char *npub, - const unsigned char *k) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(4, 8, 9))); - -SODIUM_EXPORT -int crypto_aead_aegis256_encrypt_detached(unsigned char *c, - unsigned char *mac, - unsigned long long *maclen_p, - const unsigned char *m, - unsigned long long mlen, - const unsigned char *ad, - unsigned long long adlen, - const unsigned char *nsec, - const unsigned char *npub, - const unsigned char *k) - __attribute__ ((nonnull(1, 2, 9, 10))); - -SODIUM_EXPORT -int crypto_aead_aegis256_decrypt_detached(unsigned char *m, - unsigned char *nsec, - const unsigned char *c, - unsigned long long clen, - const unsigned char *mac, - const unsigned char *ad, - unsigned long long adlen, - const unsigned char *npub, - const unsigned char *k) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(3, 5, 8, 9))); - -SODIUM_EXPORT -void crypto_aead_aegis256_keygen(unsigned char k[crypto_aead_aegis256_KEYBYTES]) - __attribute__ ((nonnull)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_aead_aes256gcm.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_aead_aes256gcm.h deleted file mode 100644 index 9baeb3f1..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_aead_aes256gcm.h +++ /dev/null @@ -1,179 +0,0 @@ -#ifndef crypto_aead_aes256gcm_H -#define crypto_aead_aes256gcm_H - -/* - * WARNING: Despite being the most popular AEAD construction due to its - * use in TLS, safely using AES-GCM in a different context is tricky. - * - * No more than ~ 350 GB of input data should be encrypted with a given key. - * This is for ~ 16 KB messages -- Actual figures vary according to - * message sizes. - * - * In addition, nonces are short and repeated nonces would totally destroy - * the security of this scheme. - * - * Nonces should thus come from atomic counters, which can be difficult to - * set up in a distributed environment. - * - * Unless you absolutely need AES-GCM, use crypto_aead_xchacha20poly1305_ietf_*() - * instead. It doesn't have any of these limitations. - * Or, if you don't need to authenticate additional data, just stick to - * crypto_secretbox(). - */ - -#include -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -SODIUM_EXPORT -int crypto_aead_aes256gcm_is_available(void); - -#define crypto_aead_aes256gcm_KEYBYTES 32U -SODIUM_EXPORT -size_t crypto_aead_aes256gcm_keybytes(void); - -#define crypto_aead_aes256gcm_NSECBYTES 0U -SODIUM_EXPORT -size_t crypto_aead_aes256gcm_nsecbytes(void); - -#define crypto_aead_aes256gcm_NPUBBYTES 12U -SODIUM_EXPORT -size_t crypto_aead_aes256gcm_npubbytes(void); - -#define crypto_aead_aes256gcm_ABYTES 16U -SODIUM_EXPORT -size_t crypto_aead_aes256gcm_abytes(void); - -#define crypto_aead_aes256gcm_MESSAGEBYTES_MAX \ - SODIUM_MIN(SODIUM_SIZE_MAX - crypto_aead_aes256gcm_ABYTES, \ - (16ULL * ((1ULL << 32) - 2ULL))) -SODIUM_EXPORT -size_t crypto_aead_aes256gcm_messagebytes_max(void); - -typedef struct CRYPTO_ALIGN(16) crypto_aead_aes256gcm_state_ { - unsigned char opaque[512]; -} crypto_aead_aes256gcm_state; - -SODIUM_EXPORT -size_t crypto_aead_aes256gcm_statebytes(void); - -SODIUM_EXPORT -int crypto_aead_aes256gcm_encrypt(unsigned char *c, - unsigned long long *clen_p, - const unsigned char *m, - unsigned long long mlen, - const unsigned char *ad, - unsigned long long adlen, - const unsigned char *nsec, - const unsigned char *npub, - const unsigned char *k) - __attribute__ ((nonnull(1, 8, 9))); - -SODIUM_EXPORT -int crypto_aead_aes256gcm_decrypt(unsigned char *m, - unsigned long long *mlen_p, - unsigned char *nsec, - const unsigned char *c, - unsigned long long clen, - const unsigned char *ad, - unsigned long long adlen, - const unsigned char *npub, - const unsigned char *k) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(4, 8, 9))); - -SODIUM_EXPORT -int crypto_aead_aes256gcm_encrypt_detached(unsigned char *c, - unsigned char *mac, - unsigned long long *maclen_p, - const unsigned char *m, - unsigned long long mlen, - const unsigned char *ad, - unsigned long long adlen, - const unsigned char *nsec, - const unsigned char *npub, - const unsigned char *k) - __attribute__ ((nonnull(1, 2, 9, 10))); - -SODIUM_EXPORT -int crypto_aead_aes256gcm_decrypt_detached(unsigned char *m, - unsigned char *nsec, - const unsigned char *c, - unsigned long long clen, - const unsigned char *mac, - const unsigned char *ad, - unsigned long long adlen, - const unsigned char *npub, - const unsigned char *k) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(3, 5, 8, 9))); - -/* -- Precomputation interface -- */ - -SODIUM_EXPORT -int crypto_aead_aes256gcm_beforenm(crypto_aead_aes256gcm_state *ctx_, - const unsigned char *k) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_aead_aes256gcm_encrypt_afternm(unsigned char *c, - unsigned long long *clen_p, - const unsigned char *m, - unsigned long long mlen, - const unsigned char *ad, - unsigned long long adlen, - const unsigned char *nsec, - const unsigned char *npub, - const crypto_aead_aes256gcm_state *ctx_) - __attribute__ ((nonnull(1, 8, 9))); - -SODIUM_EXPORT -int crypto_aead_aes256gcm_decrypt_afternm(unsigned char *m, - unsigned long long *mlen_p, - unsigned char *nsec, - const unsigned char *c, - unsigned long long clen, - const unsigned char *ad, - unsigned long long adlen, - const unsigned char *npub, - const crypto_aead_aes256gcm_state *ctx_) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(4, 8, 9))); - -SODIUM_EXPORT -int crypto_aead_aes256gcm_encrypt_detached_afternm(unsigned char *c, - unsigned char *mac, - unsigned long long *maclen_p, - const unsigned char *m, - unsigned long long mlen, - const unsigned char *ad, - unsigned long long adlen, - const unsigned char *nsec, - const unsigned char *npub, - const crypto_aead_aes256gcm_state *ctx_) - __attribute__ ((nonnull(1, 2, 9, 10))); - -SODIUM_EXPORT -int crypto_aead_aes256gcm_decrypt_detached_afternm(unsigned char *m, - unsigned char *nsec, - const unsigned char *c, - unsigned long long clen, - const unsigned char *mac, - const unsigned char *ad, - unsigned long long adlen, - const unsigned char *npub, - const crypto_aead_aes256gcm_state *ctx_) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(3, 5, 8, 9))); - -SODIUM_EXPORT -void crypto_aead_aes256gcm_keygen(unsigned char k[crypto_aead_aes256gcm_KEYBYTES]) - __attribute__ ((nonnull)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_aead_chacha20poly1305.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_aead_chacha20poly1305.h deleted file mode 100644 index 5d671df1..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_aead_chacha20poly1305.h +++ /dev/null @@ -1,180 +0,0 @@ -#ifndef crypto_aead_chacha20poly1305_H -#define crypto_aead_chacha20poly1305_H - -#include -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -/* -- IETF ChaCha20-Poly1305 construction with a 96-bit nonce and a 32-bit internal counter -- */ - -#define crypto_aead_chacha20poly1305_ietf_KEYBYTES 32U -SODIUM_EXPORT -size_t crypto_aead_chacha20poly1305_ietf_keybytes(void); - -#define crypto_aead_chacha20poly1305_ietf_NSECBYTES 0U -SODIUM_EXPORT -size_t crypto_aead_chacha20poly1305_ietf_nsecbytes(void); - -#define crypto_aead_chacha20poly1305_ietf_NPUBBYTES 12U - -SODIUM_EXPORT -size_t crypto_aead_chacha20poly1305_ietf_npubbytes(void); - -#define crypto_aead_chacha20poly1305_ietf_ABYTES 16U -SODIUM_EXPORT -size_t crypto_aead_chacha20poly1305_ietf_abytes(void); - -#define crypto_aead_chacha20poly1305_ietf_MESSAGEBYTES_MAX \ - SODIUM_MIN(SODIUM_SIZE_MAX - crypto_aead_chacha20poly1305_ietf_ABYTES, \ - (64ULL * ((1ULL << 32) - 1ULL))) -SODIUM_EXPORT -size_t crypto_aead_chacha20poly1305_ietf_messagebytes_max(void); - -SODIUM_EXPORT -int crypto_aead_chacha20poly1305_ietf_encrypt(unsigned char *c, - unsigned long long *clen_p, - const unsigned char *m, - unsigned long long mlen, - const unsigned char *ad, - unsigned long long adlen, - const unsigned char *nsec, - const unsigned char *npub, - const unsigned char *k) - __attribute__ ((nonnull(1, 8, 9))); - -SODIUM_EXPORT -int crypto_aead_chacha20poly1305_ietf_decrypt(unsigned char *m, - unsigned long long *mlen_p, - unsigned char *nsec, - const unsigned char *c, - unsigned long long clen, - const unsigned char *ad, - unsigned long long adlen, - const unsigned char *npub, - const unsigned char *k) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(4, 8, 9))); - -SODIUM_EXPORT -int crypto_aead_chacha20poly1305_ietf_encrypt_detached(unsigned char *c, - unsigned char *mac, - unsigned long long *maclen_p, - const unsigned char *m, - unsigned long long mlen, - const unsigned char *ad, - unsigned long long adlen, - const unsigned char *nsec, - const unsigned char *npub, - const unsigned char *k) - __attribute__ ((nonnull(1, 2, 9, 10))); - -SODIUM_EXPORT -int crypto_aead_chacha20poly1305_ietf_decrypt_detached(unsigned char *m, - unsigned char *nsec, - const unsigned char *c, - unsigned long long clen, - const unsigned char *mac, - const unsigned char *ad, - unsigned long long adlen, - const unsigned char *npub, - const unsigned char *k) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(3, 5, 8, 9))); - -SODIUM_EXPORT -void crypto_aead_chacha20poly1305_ietf_keygen(unsigned char k[crypto_aead_chacha20poly1305_ietf_KEYBYTES]) - __attribute__ ((nonnull)); - -/* -- Original ChaCha20-Poly1305 construction with a 64-bit nonce and a 64-bit internal counter -- */ - -#define crypto_aead_chacha20poly1305_KEYBYTES 32U -SODIUM_EXPORT -size_t crypto_aead_chacha20poly1305_keybytes(void); - -#define crypto_aead_chacha20poly1305_NSECBYTES 0U -SODIUM_EXPORT -size_t crypto_aead_chacha20poly1305_nsecbytes(void); - -#define crypto_aead_chacha20poly1305_NPUBBYTES 8U -SODIUM_EXPORT -size_t crypto_aead_chacha20poly1305_npubbytes(void); - -#define crypto_aead_chacha20poly1305_ABYTES 16U -SODIUM_EXPORT -size_t crypto_aead_chacha20poly1305_abytes(void); - -#define crypto_aead_chacha20poly1305_MESSAGEBYTES_MAX \ - (SODIUM_SIZE_MAX - crypto_aead_chacha20poly1305_ABYTES) -SODIUM_EXPORT -size_t crypto_aead_chacha20poly1305_messagebytes_max(void); - -SODIUM_EXPORT -int crypto_aead_chacha20poly1305_encrypt(unsigned char *c, - unsigned long long *clen_p, - const unsigned char *m, - unsigned long long mlen, - const unsigned char *ad, - unsigned long long adlen, - const unsigned char *nsec, - const unsigned char *npub, - const unsigned char *k) - __attribute__ ((nonnull(1, 8, 9))); - -SODIUM_EXPORT -int crypto_aead_chacha20poly1305_decrypt(unsigned char *m, - unsigned long long *mlen_p, - unsigned char *nsec, - const unsigned char *c, - unsigned long long clen, - const unsigned char *ad, - unsigned long long adlen, - const unsigned char *npub, - const unsigned char *k) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(4, 8, 9))); - -SODIUM_EXPORT -int crypto_aead_chacha20poly1305_encrypt_detached(unsigned char *c, - unsigned char *mac, - unsigned long long *maclen_p, - const unsigned char *m, - unsigned long long mlen, - const unsigned char *ad, - unsigned long long adlen, - const unsigned char *nsec, - const unsigned char *npub, - const unsigned char *k) - __attribute__ ((nonnull(1, 2, 9, 10))); - -SODIUM_EXPORT -int crypto_aead_chacha20poly1305_decrypt_detached(unsigned char *m, - unsigned char *nsec, - const unsigned char *c, - unsigned long long clen, - const unsigned char *mac, - const unsigned char *ad, - unsigned long long adlen, - const unsigned char *npub, - const unsigned char *k) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(3, 5, 8, 9))); - -SODIUM_EXPORT -void crypto_aead_chacha20poly1305_keygen(unsigned char k[crypto_aead_chacha20poly1305_KEYBYTES]) - __attribute__ ((nonnull)); - -/* Aliases */ - -#define crypto_aead_chacha20poly1305_IETF_KEYBYTES crypto_aead_chacha20poly1305_ietf_KEYBYTES -#define crypto_aead_chacha20poly1305_IETF_NSECBYTES crypto_aead_chacha20poly1305_ietf_NSECBYTES -#define crypto_aead_chacha20poly1305_IETF_NPUBBYTES crypto_aead_chacha20poly1305_ietf_NPUBBYTES -#define crypto_aead_chacha20poly1305_IETF_ABYTES crypto_aead_chacha20poly1305_ietf_ABYTES -#define crypto_aead_chacha20poly1305_IETF_MESSAGEBYTES_MAX crypto_aead_chacha20poly1305_ietf_MESSAGEBYTES_MAX - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_aead_xchacha20poly1305.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_aead_xchacha20poly1305.h deleted file mode 100644 index 6643b0cb..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_aead_xchacha20poly1305.h +++ /dev/null @@ -1,100 +0,0 @@ -#ifndef crypto_aead_xchacha20poly1305_H -#define crypto_aead_xchacha20poly1305_H - -#include -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -#define crypto_aead_xchacha20poly1305_ietf_KEYBYTES 32U -SODIUM_EXPORT -size_t crypto_aead_xchacha20poly1305_ietf_keybytes(void); - -#define crypto_aead_xchacha20poly1305_ietf_NSECBYTES 0U -SODIUM_EXPORT -size_t crypto_aead_xchacha20poly1305_ietf_nsecbytes(void); - -#define crypto_aead_xchacha20poly1305_ietf_NPUBBYTES 24U -SODIUM_EXPORT -size_t crypto_aead_xchacha20poly1305_ietf_npubbytes(void); - -#define crypto_aead_xchacha20poly1305_ietf_ABYTES 16U -SODIUM_EXPORT -size_t crypto_aead_xchacha20poly1305_ietf_abytes(void); - -#define crypto_aead_xchacha20poly1305_ietf_MESSAGEBYTES_MAX \ - (SODIUM_SIZE_MAX - crypto_aead_xchacha20poly1305_ietf_ABYTES) -SODIUM_EXPORT -size_t crypto_aead_xchacha20poly1305_ietf_messagebytes_max(void); - -SODIUM_EXPORT -int crypto_aead_xchacha20poly1305_ietf_encrypt(unsigned char *c, - unsigned long long *clen_p, - const unsigned char *m, - unsigned long long mlen, - const unsigned char *ad, - unsigned long long adlen, - const unsigned char *nsec, - const unsigned char *npub, - const unsigned char *k) - __attribute__ ((nonnull(1, 8, 9))); - -SODIUM_EXPORT -int crypto_aead_xchacha20poly1305_ietf_decrypt(unsigned char *m, - unsigned long long *mlen_p, - unsigned char *nsec, - const unsigned char *c, - unsigned long long clen, - const unsigned char *ad, - unsigned long long adlen, - const unsigned char *npub, - const unsigned char *k) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(4, 8, 9))); - -SODIUM_EXPORT -int crypto_aead_xchacha20poly1305_ietf_encrypt_detached(unsigned char *c, - unsigned char *mac, - unsigned long long *maclen_p, - const unsigned char *m, - unsigned long long mlen, - const unsigned char *ad, - unsigned long long adlen, - const unsigned char *nsec, - const unsigned char *npub, - const unsigned char *k) - __attribute__ ((nonnull(1, 2, 9, 10))); - -SODIUM_EXPORT -int crypto_aead_xchacha20poly1305_ietf_decrypt_detached(unsigned char *m, - unsigned char *nsec, - const unsigned char *c, - unsigned long long clen, - const unsigned char *mac, - const unsigned char *ad, - unsigned long long adlen, - const unsigned char *npub, - const unsigned char *k) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(3, 5, 8, 9))); - -SODIUM_EXPORT -void crypto_aead_xchacha20poly1305_ietf_keygen(unsigned char k[crypto_aead_xchacha20poly1305_ietf_KEYBYTES]) - __attribute__ ((nonnull)); - -/* Aliases */ - -#define crypto_aead_xchacha20poly1305_IETF_KEYBYTES crypto_aead_xchacha20poly1305_ietf_KEYBYTES -#define crypto_aead_xchacha20poly1305_IETF_NSECBYTES crypto_aead_xchacha20poly1305_ietf_NSECBYTES -#define crypto_aead_xchacha20poly1305_IETF_NPUBBYTES crypto_aead_xchacha20poly1305_ietf_NPUBBYTES -#define crypto_aead_xchacha20poly1305_IETF_ABYTES crypto_aead_xchacha20poly1305_ietf_ABYTES -#define crypto_aead_xchacha20poly1305_IETF_MESSAGEBYTES_MAX crypto_aead_xchacha20poly1305_ietf_MESSAGEBYTES_MAX - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_auth.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_auth.h deleted file mode 100644 index 540aee0e..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_auth.h +++ /dev/null @@ -1,46 +0,0 @@ -#ifndef crypto_auth_H -#define crypto_auth_H - -#include - -#include "crypto_auth_hmacsha512256.h" -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -#define crypto_auth_BYTES crypto_auth_hmacsha512256_BYTES -SODIUM_EXPORT -size_t crypto_auth_bytes(void); - -#define crypto_auth_KEYBYTES crypto_auth_hmacsha512256_KEYBYTES -SODIUM_EXPORT -size_t crypto_auth_keybytes(void); - -#define crypto_auth_PRIMITIVE "hmacsha512256" -SODIUM_EXPORT -const char *crypto_auth_primitive(void); - -SODIUM_EXPORT -int crypto_auth(unsigned char *out, const unsigned char *in, - unsigned long long inlen, const unsigned char *k) - __attribute__ ((nonnull(1, 4))); - -SODIUM_EXPORT -int crypto_auth_verify(const unsigned char *h, const unsigned char *in, - unsigned long long inlen, const unsigned char *k) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(1, 4))); - -SODIUM_EXPORT -void crypto_auth_keygen(unsigned char k[crypto_auth_KEYBYTES]) - __attribute__ ((nonnull)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_auth_hmacsha256.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_auth_hmacsha256.h deleted file mode 100644 index 3da864c7..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_auth_hmacsha256.h +++ /dev/null @@ -1,70 +0,0 @@ -#ifndef crypto_auth_hmacsha256_H -#define crypto_auth_hmacsha256_H - -#include -#include "crypto_hash_sha256.h" -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -#define crypto_auth_hmacsha256_BYTES 32U -SODIUM_EXPORT -size_t crypto_auth_hmacsha256_bytes(void); - -#define crypto_auth_hmacsha256_KEYBYTES 32U -SODIUM_EXPORT -size_t crypto_auth_hmacsha256_keybytes(void); - -SODIUM_EXPORT -int crypto_auth_hmacsha256(unsigned char *out, - const unsigned char *in, - unsigned long long inlen, - const unsigned char *k) __attribute__ ((nonnull(1, 4))); - -SODIUM_EXPORT -int crypto_auth_hmacsha256_verify(const unsigned char *h, - const unsigned char *in, - unsigned long long inlen, - const unsigned char *k) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(1, 4))); - -/* ------------------------------------------------------------------------- */ - -typedef struct crypto_auth_hmacsha256_state { - crypto_hash_sha256_state ictx; - crypto_hash_sha256_state octx; -} crypto_auth_hmacsha256_state; - -SODIUM_EXPORT -size_t crypto_auth_hmacsha256_statebytes(void); - -SODIUM_EXPORT -int crypto_auth_hmacsha256_init(crypto_auth_hmacsha256_state *state, - const unsigned char *key, - size_t keylen) __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_auth_hmacsha256_update(crypto_auth_hmacsha256_state *state, - const unsigned char *in, - unsigned long long inlen) - __attribute__ ((nonnull(1))); - -SODIUM_EXPORT -int crypto_auth_hmacsha256_final(crypto_auth_hmacsha256_state *state, - unsigned char *out) __attribute__ ((nonnull)); - - -SODIUM_EXPORT -void crypto_auth_hmacsha256_keygen(unsigned char k[crypto_auth_hmacsha256_KEYBYTES]) - __attribute__ ((nonnull)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_auth_hmacsha512.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_auth_hmacsha512.h deleted file mode 100644 index d992cb81..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_auth_hmacsha512.h +++ /dev/null @@ -1,68 +0,0 @@ -#ifndef crypto_auth_hmacsha512_H -#define crypto_auth_hmacsha512_H - -#include -#include "crypto_hash_sha512.h" -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -#define crypto_auth_hmacsha512_BYTES 64U -SODIUM_EXPORT -size_t crypto_auth_hmacsha512_bytes(void); - -#define crypto_auth_hmacsha512_KEYBYTES 32U -SODIUM_EXPORT -size_t crypto_auth_hmacsha512_keybytes(void); - -SODIUM_EXPORT -int crypto_auth_hmacsha512(unsigned char *out, - const unsigned char *in, - unsigned long long inlen, - const unsigned char *k) __attribute__ ((nonnull(1, 4))); - -SODIUM_EXPORT -int crypto_auth_hmacsha512_verify(const unsigned char *h, - const unsigned char *in, - unsigned long long inlen, - const unsigned char *k) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(1, 4))); - -/* ------------------------------------------------------------------------- */ - -typedef struct crypto_auth_hmacsha512_state { - crypto_hash_sha512_state ictx; - crypto_hash_sha512_state octx; -} crypto_auth_hmacsha512_state; - -SODIUM_EXPORT -size_t crypto_auth_hmacsha512_statebytes(void); - -SODIUM_EXPORT -int crypto_auth_hmacsha512_init(crypto_auth_hmacsha512_state *state, - const unsigned char *key, - size_t keylen) __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_auth_hmacsha512_update(crypto_auth_hmacsha512_state *state, - const unsigned char *in, - unsigned long long inlen) __attribute__ ((nonnull(1))); - -SODIUM_EXPORT -int crypto_auth_hmacsha512_final(crypto_auth_hmacsha512_state *state, - unsigned char *out) __attribute__ ((nonnull)); - -SODIUM_EXPORT -void crypto_auth_hmacsha512_keygen(unsigned char k[crypto_auth_hmacsha512_KEYBYTES]) - __attribute__ ((nonnull)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_auth_hmacsha512256.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_auth_hmacsha512256.h deleted file mode 100644 index 3fb52638..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_auth_hmacsha512256.h +++ /dev/null @@ -1,65 +0,0 @@ -#ifndef crypto_auth_hmacsha512256_H -#define crypto_auth_hmacsha512256_H - -#include -#include "crypto_auth_hmacsha512.h" -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -#define crypto_auth_hmacsha512256_BYTES 32U -SODIUM_EXPORT -size_t crypto_auth_hmacsha512256_bytes(void); - -#define crypto_auth_hmacsha512256_KEYBYTES 32U -SODIUM_EXPORT -size_t crypto_auth_hmacsha512256_keybytes(void); - -SODIUM_EXPORT -int crypto_auth_hmacsha512256(unsigned char *out, - const unsigned char *in, - unsigned long long inlen, - const unsigned char *k) __attribute__ ((nonnull(1, 4))); - -SODIUM_EXPORT -int crypto_auth_hmacsha512256_verify(const unsigned char *h, - const unsigned char *in, - unsigned long long inlen, - const unsigned char *k) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(1, 4))); - -/* ------------------------------------------------------------------------- */ - -typedef crypto_auth_hmacsha512_state crypto_auth_hmacsha512256_state; - -SODIUM_EXPORT -size_t crypto_auth_hmacsha512256_statebytes(void); - -SODIUM_EXPORT -int crypto_auth_hmacsha512256_init(crypto_auth_hmacsha512256_state *state, - const unsigned char *key, - size_t keylen) __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_auth_hmacsha512256_update(crypto_auth_hmacsha512256_state *state, - const unsigned char *in, - unsigned long long inlen) __attribute__ ((nonnull(1))); - -SODIUM_EXPORT -int crypto_auth_hmacsha512256_final(crypto_auth_hmacsha512256_state *state, - unsigned char *out) __attribute__ ((nonnull)); - -SODIUM_EXPORT -void crypto_auth_hmacsha512256_keygen(unsigned char k[crypto_auth_hmacsha512256_KEYBYTES]) - __attribute__ ((nonnull)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_box.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_box.h deleted file mode 100644 index 0008e020..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_box.h +++ /dev/null @@ -1,177 +0,0 @@ -#ifndef crypto_box_H -#define crypto_box_H - -/* - * THREAD SAFETY: crypto_box_keypair() is thread-safe, - * provided that sodium_init() was called before. - * - * Other functions are always thread-safe. - */ - -#include - -#include "crypto_box_curve25519xsalsa20poly1305.h" -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -#define crypto_box_SEEDBYTES crypto_box_curve25519xsalsa20poly1305_SEEDBYTES -SODIUM_EXPORT -size_t crypto_box_seedbytes(void); - -#define crypto_box_PUBLICKEYBYTES crypto_box_curve25519xsalsa20poly1305_PUBLICKEYBYTES -SODIUM_EXPORT -size_t crypto_box_publickeybytes(void); - -#define crypto_box_SECRETKEYBYTES crypto_box_curve25519xsalsa20poly1305_SECRETKEYBYTES -SODIUM_EXPORT -size_t crypto_box_secretkeybytes(void); - -#define crypto_box_NONCEBYTES crypto_box_curve25519xsalsa20poly1305_NONCEBYTES -SODIUM_EXPORT -size_t crypto_box_noncebytes(void); - -#define crypto_box_MACBYTES crypto_box_curve25519xsalsa20poly1305_MACBYTES -SODIUM_EXPORT -size_t crypto_box_macbytes(void); - -#define crypto_box_MESSAGEBYTES_MAX crypto_box_curve25519xsalsa20poly1305_MESSAGEBYTES_MAX -SODIUM_EXPORT -size_t crypto_box_messagebytes_max(void); - -#define crypto_box_PRIMITIVE "curve25519xsalsa20poly1305" -SODIUM_EXPORT -const char *crypto_box_primitive(void); - -SODIUM_EXPORT -int crypto_box_seed_keypair(unsigned char *pk, unsigned char *sk, - const unsigned char *seed) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_box_keypair(unsigned char *pk, unsigned char *sk) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_box_easy(unsigned char *c, const unsigned char *m, - unsigned long long mlen, const unsigned char *n, - const unsigned char *pk, const unsigned char *sk) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(1, 4, 5, 6))); - -SODIUM_EXPORT -int crypto_box_open_easy(unsigned char *m, const unsigned char *c, - unsigned long long clen, const unsigned char *n, - const unsigned char *pk, const unsigned char *sk) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(2, 4, 5, 6))); - -SODIUM_EXPORT -int crypto_box_detached(unsigned char *c, unsigned char *mac, - const unsigned char *m, unsigned long long mlen, - const unsigned char *n, const unsigned char *pk, - const unsigned char *sk) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(1, 2, 5, 6, 7))); - -SODIUM_EXPORT -int crypto_box_open_detached(unsigned char *m, const unsigned char *c, - const unsigned char *mac, - unsigned long long clen, - const unsigned char *n, - const unsigned char *pk, - const unsigned char *sk) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(2, 3, 5, 6, 7))); - -/* -- Precomputation interface -- */ - -#define crypto_box_BEFORENMBYTES crypto_box_curve25519xsalsa20poly1305_BEFORENMBYTES -SODIUM_EXPORT -size_t crypto_box_beforenmbytes(void); - -SODIUM_EXPORT -int crypto_box_beforenm(unsigned char *k, const unsigned char *pk, - const unsigned char *sk) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_box_easy_afternm(unsigned char *c, const unsigned char *m, - unsigned long long mlen, const unsigned char *n, - const unsigned char *k) __attribute__ ((nonnull(1, 4, 5))); - -SODIUM_EXPORT -int crypto_box_open_easy_afternm(unsigned char *m, const unsigned char *c, - unsigned long long clen, const unsigned char *n, - const unsigned char *k) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(2, 4, 5))); - -SODIUM_EXPORT -int crypto_box_detached_afternm(unsigned char *c, unsigned char *mac, - const unsigned char *m, unsigned long long mlen, - const unsigned char *n, const unsigned char *k) - __attribute__ ((nonnull(1, 2, 5, 6))); - -SODIUM_EXPORT -int crypto_box_open_detached_afternm(unsigned char *m, const unsigned char *c, - const unsigned char *mac, - unsigned long long clen, const unsigned char *n, - const unsigned char *k) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(2, 3, 5, 6))); - -/* -- Ephemeral SK interface -- */ - -#define crypto_box_SEALBYTES (crypto_box_PUBLICKEYBYTES + crypto_box_MACBYTES) -SODIUM_EXPORT -size_t crypto_box_sealbytes(void); - -SODIUM_EXPORT -int crypto_box_seal(unsigned char *c, const unsigned char *m, - unsigned long long mlen, const unsigned char *pk) - __attribute__ ((nonnull(1, 4))); - -SODIUM_EXPORT -int crypto_box_seal_open(unsigned char *m, const unsigned char *c, - unsigned long long clen, - const unsigned char *pk, const unsigned char *sk) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(2, 4, 5))); - -/* -- NaCl compatibility interface ; Requires padding -- */ - -#define crypto_box_ZEROBYTES crypto_box_curve25519xsalsa20poly1305_ZEROBYTES -SODIUM_EXPORT -size_t crypto_box_zerobytes(void) __attribute__ ((deprecated)); - -#define crypto_box_BOXZEROBYTES crypto_box_curve25519xsalsa20poly1305_BOXZEROBYTES -SODIUM_EXPORT -size_t crypto_box_boxzerobytes(void) __attribute__ ((deprecated)); - -SODIUM_EXPORT -int crypto_box(unsigned char *c, const unsigned char *m, - unsigned long long mlen, const unsigned char *n, - const unsigned char *pk, const unsigned char *sk) - __attribute__ ((deprecated)) __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(1, 4, 5, 6))); - -SODIUM_EXPORT -int crypto_box_open(unsigned char *m, const unsigned char *c, - unsigned long long clen, const unsigned char *n, - const unsigned char *pk, const unsigned char *sk) - __attribute__ ((deprecated)) __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(2, 4, 5, 6))); - -SODIUM_EXPORT -int crypto_box_afternm(unsigned char *c, const unsigned char *m, - unsigned long long mlen, const unsigned char *n, - const unsigned char *k) __attribute__ ((deprecated)) __attribute__ ((nonnull(1, 4, 5))); - -SODIUM_EXPORT -int crypto_box_open_afternm(unsigned char *m, const unsigned char *c, - unsigned long long clen, const unsigned char *n, - const unsigned char *k) - __attribute__ ((warn_unused_result)) __attribute__ ((deprecated)) __attribute__ ((nonnull(2, 4, 5))); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_box_curve25519xchacha20poly1305.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_box_curve25519xchacha20poly1305.h deleted file mode 100644 index 26a3d31e..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_box_curve25519xchacha20poly1305.h +++ /dev/null @@ -1,164 +0,0 @@ - -#ifndef crypto_box_curve25519xchacha20poly1305_H -#define crypto_box_curve25519xchacha20poly1305_H - -#include -#include "crypto_stream_xchacha20.h" -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -#define crypto_box_curve25519xchacha20poly1305_SEEDBYTES 32U -SODIUM_EXPORT -size_t crypto_box_curve25519xchacha20poly1305_seedbytes(void); - -#define crypto_box_curve25519xchacha20poly1305_PUBLICKEYBYTES 32U -SODIUM_EXPORT -size_t crypto_box_curve25519xchacha20poly1305_publickeybytes(void); - -#define crypto_box_curve25519xchacha20poly1305_SECRETKEYBYTES 32U -SODIUM_EXPORT -size_t crypto_box_curve25519xchacha20poly1305_secretkeybytes(void); - -#define crypto_box_curve25519xchacha20poly1305_BEFORENMBYTES 32U -SODIUM_EXPORT -size_t crypto_box_curve25519xchacha20poly1305_beforenmbytes(void); - -#define crypto_box_curve25519xchacha20poly1305_NONCEBYTES 24U -SODIUM_EXPORT -size_t crypto_box_curve25519xchacha20poly1305_noncebytes(void); - -#define crypto_box_curve25519xchacha20poly1305_MACBYTES 16U -SODIUM_EXPORT -size_t crypto_box_curve25519xchacha20poly1305_macbytes(void); - -#define crypto_box_curve25519xchacha20poly1305_MESSAGEBYTES_MAX \ - (crypto_stream_xchacha20_MESSAGEBYTES_MAX - crypto_box_curve25519xchacha20poly1305_MACBYTES) -SODIUM_EXPORT -size_t crypto_box_curve25519xchacha20poly1305_messagebytes_max(void); - -SODIUM_EXPORT -int crypto_box_curve25519xchacha20poly1305_seed_keypair(unsigned char *pk, - unsigned char *sk, - const unsigned char *seed) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_box_curve25519xchacha20poly1305_keypair(unsigned char *pk, - unsigned char *sk) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_box_curve25519xchacha20poly1305_easy(unsigned char *c, - const unsigned char *m, - unsigned long long mlen, - const unsigned char *n, - const unsigned char *pk, - const unsigned char *sk) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(1, 4, 5, 6))); - -SODIUM_EXPORT -int crypto_box_curve25519xchacha20poly1305_open_easy(unsigned char *m, - const unsigned char *c, - unsigned long long clen, - const unsigned char *n, - const unsigned char *pk, - const unsigned char *sk) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(2, 4, 5, 6))); - -SODIUM_EXPORT -int crypto_box_curve25519xchacha20poly1305_detached(unsigned char *c, - unsigned char *mac, - const unsigned char *m, - unsigned long long mlen, - const unsigned char *n, - const unsigned char *pk, - const unsigned char *sk) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(1, 2, 5, 6, 7))); - -SODIUM_EXPORT -int crypto_box_curve25519xchacha20poly1305_open_detached(unsigned char *m, - const unsigned char *c, - const unsigned char *mac, - unsigned long long clen, - const unsigned char *n, - const unsigned char *pk, - const unsigned char *sk) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(2, 3, 5, 6, 7))); - -/* -- Precomputation interface -- */ - -SODIUM_EXPORT -int crypto_box_curve25519xchacha20poly1305_beforenm(unsigned char *k, - const unsigned char *pk, - const unsigned char *sk) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_box_curve25519xchacha20poly1305_easy_afternm(unsigned char *c, - const unsigned char *m, - unsigned long long mlen, - const unsigned char *n, - const unsigned char *k) - __attribute__ ((nonnull(1, 4, 5))); - -SODIUM_EXPORT -int crypto_box_curve25519xchacha20poly1305_open_easy_afternm(unsigned char *m, - const unsigned char *c, - unsigned long long clen, - const unsigned char *n, - const unsigned char *k) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(2, 4, 5))); - -SODIUM_EXPORT -int crypto_box_curve25519xchacha20poly1305_detached_afternm(unsigned char *c, - unsigned char *mac, - const unsigned char *m, - unsigned long long mlen, - const unsigned char *n, - const unsigned char *k) - __attribute__ ((nonnull(1, 2, 5, 6))); - -SODIUM_EXPORT -int crypto_box_curve25519xchacha20poly1305_open_detached_afternm(unsigned char *m, - const unsigned char *c, - const unsigned char *mac, - unsigned long long clen, - const unsigned char *n, - const unsigned char *k) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(2, 3, 5, 6))); - -/* -- Ephemeral SK interface -- */ - -#define crypto_box_curve25519xchacha20poly1305_SEALBYTES \ - (crypto_box_curve25519xchacha20poly1305_PUBLICKEYBYTES + \ - crypto_box_curve25519xchacha20poly1305_MACBYTES) - -SODIUM_EXPORT -size_t crypto_box_curve25519xchacha20poly1305_sealbytes(void); - -SODIUM_EXPORT -int crypto_box_curve25519xchacha20poly1305_seal(unsigned char *c, - const unsigned char *m, - unsigned long long mlen, - const unsigned char *pk) - __attribute__ ((nonnull(1, 4))); - -SODIUM_EXPORT -int crypto_box_curve25519xchacha20poly1305_seal_open(unsigned char *m, - const unsigned char *c, - unsigned long long clen, - const unsigned char *pk, - const unsigned char *sk) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(2, 4, 5))); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_box_curve25519xsalsa20poly1305.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_box_curve25519xsalsa20poly1305.h deleted file mode 100644 index 2c9b5d6e..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_box_curve25519xsalsa20poly1305.h +++ /dev/null @@ -1,113 +0,0 @@ -#ifndef crypto_box_curve25519xsalsa20poly1305_H -#define crypto_box_curve25519xsalsa20poly1305_H - -#include -#include "crypto_stream_xsalsa20.h" -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -#define crypto_box_curve25519xsalsa20poly1305_SEEDBYTES 32U -SODIUM_EXPORT -size_t crypto_box_curve25519xsalsa20poly1305_seedbytes(void); - -#define crypto_box_curve25519xsalsa20poly1305_PUBLICKEYBYTES 32U -SODIUM_EXPORT -size_t crypto_box_curve25519xsalsa20poly1305_publickeybytes(void); - -#define crypto_box_curve25519xsalsa20poly1305_SECRETKEYBYTES 32U -SODIUM_EXPORT -size_t crypto_box_curve25519xsalsa20poly1305_secretkeybytes(void); - -#define crypto_box_curve25519xsalsa20poly1305_BEFORENMBYTES 32U -SODIUM_EXPORT -size_t crypto_box_curve25519xsalsa20poly1305_beforenmbytes(void); - -#define crypto_box_curve25519xsalsa20poly1305_NONCEBYTES 24U -SODIUM_EXPORT -size_t crypto_box_curve25519xsalsa20poly1305_noncebytes(void); - -#define crypto_box_curve25519xsalsa20poly1305_MACBYTES 16U -SODIUM_EXPORT -size_t crypto_box_curve25519xsalsa20poly1305_macbytes(void); - -/* Only for the libsodium API - The NaCl compatibility API would require BOXZEROBYTES extra bytes */ -#define crypto_box_curve25519xsalsa20poly1305_MESSAGEBYTES_MAX \ - (crypto_stream_xsalsa20_MESSAGEBYTES_MAX - crypto_box_curve25519xsalsa20poly1305_MACBYTES) -SODIUM_EXPORT -size_t crypto_box_curve25519xsalsa20poly1305_messagebytes_max(void); - -SODIUM_EXPORT -int crypto_box_curve25519xsalsa20poly1305_seed_keypair(unsigned char *pk, - unsigned char *sk, - const unsigned char *seed) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_box_curve25519xsalsa20poly1305_keypair(unsigned char *pk, - unsigned char *sk) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_box_curve25519xsalsa20poly1305_beforenm(unsigned char *k, - const unsigned char *pk, - const unsigned char *sk) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull)); - -/* -- NaCl compatibility interface ; Requires padding -- */ - -#define crypto_box_curve25519xsalsa20poly1305_BOXZEROBYTES 16U -SODIUM_EXPORT -size_t crypto_box_curve25519xsalsa20poly1305_boxzerobytes(void); - -#define crypto_box_curve25519xsalsa20poly1305_ZEROBYTES \ - (crypto_box_curve25519xsalsa20poly1305_BOXZEROBYTES + \ - crypto_box_curve25519xsalsa20poly1305_MACBYTES) -SODIUM_EXPORT -size_t crypto_box_curve25519xsalsa20poly1305_zerobytes(void) - __attribute__ ((deprecated)); - -SODIUM_EXPORT -int crypto_box_curve25519xsalsa20poly1305(unsigned char *c, - const unsigned char *m, - unsigned long long mlen, - const unsigned char *n, - const unsigned char *pk, - const unsigned char *sk) - __attribute__ ((deprecated)) __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(1, 4, 5, 6))); - -SODIUM_EXPORT -int crypto_box_curve25519xsalsa20poly1305_open(unsigned char *m, - const unsigned char *c, - unsigned long long clen, - const unsigned char *n, - const unsigned char *pk, - const unsigned char *sk) - __attribute__ ((deprecated)) __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(2, 4, 5, 6))); - -SODIUM_EXPORT -int crypto_box_curve25519xsalsa20poly1305_afternm(unsigned char *c, - const unsigned char *m, - unsigned long long mlen, - const unsigned char *n, - const unsigned char *k) - __attribute__ ((deprecated)) __attribute__ ((nonnull(1, 4, 5))); - -SODIUM_EXPORT -int crypto_box_curve25519xsalsa20poly1305_open_afternm(unsigned char *m, - const unsigned char *c, - unsigned long long clen, - const unsigned char *n, - const unsigned char *k) - __attribute__ ((deprecated)) __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(2, 4, 5))); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_core_ed25519.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_core_ed25519.h deleted file mode 100644 index 618a44f9..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_core_ed25519.h +++ /dev/null @@ -1,115 +0,0 @@ -#ifndef crypto_core_ed25519_H -#define crypto_core_ed25519_H - -#include -#include "export.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#define crypto_core_ed25519_BYTES 32 -SODIUM_EXPORT -size_t crypto_core_ed25519_bytes(void); - -#define crypto_core_ed25519_UNIFORMBYTES 32 -SODIUM_EXPORT -size_t crypto_core_ed25519_uniformbytes(void); - -#define crypto_core_ed25519_HASHBYTES 64 -SODIUM_EXPORT -size_t crypto_core_ed25519_hashbytes(void); - -#define crypto_core_ed25519_SCALARBYTES 32 -SODIUM_EXPORT -size_t crypto_core_ed25519_scalarbytes(void); - -#define crypto_core_ed25519_NONREDUCEDSCALARBYTES 64 -SODIUM_EXPORT -size_t crypto_core_ed25519_nonreducedscalarbytes(void); - -#define crypto_core_ed25519_H2CSHA256 1 -#define crypto_core_ed25519_H2CSHA512 2 - -SODIUM_EXPORT -int crypto_core_ed25519_is_valid_point(const unsigned char *p) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_core_ed25519_add(unsigned char *r, - const unsigned char *p, const unsigned char *q) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_core_ed25519_sub(unsigned char *r, - const unsigned char *p, const unsigned char *q) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_core_ed25519_from_uniform(unsigned char *p, const unsigned char *r) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_core_ed25519_from_string(unsigned char p[crypto_core_ed25519_BYTES], - const char *ctx, const unsigned char *msg, - size_t msg_len, int hash_alg) - __attribute__ ((nonnull(1))); - -SODIUM_EXPORT -int crypto_core_ed25519_from_string_ro(unsigned char p[crypto_core_ed25519_BYTES], - const char *ctx, const unsigned char *msg, - size_t msg_len, int hash_alg) - __attribute__ ((nonnull(1))); - -SODIUM_EXPORT -void crypto_core_ed25519_random(unsigned char *p) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -void crypto_core_ed25519_scalar_random(unsigned char *r) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_core_ed25519_scalar_invert(unsigned char *recip, const unsigned char *s) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -void crypto_core_ed25519_scalar_negate(unsigned char *neg, const unsigned char *s) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -void crypto_core_ed25519_scalar_complement(unsigned char *comp, const unsigned char *s) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -void crypto_core_ed25519_scalar_add(unsigned char *z, const unsigned char *x, - const unsigned char *y) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -void crypto_core_ed25519_scalar_sub(unsigned char *z, const unsigned char *x, - const unsigned char *y) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -void crypto_core_ed25519_scalar_mul(unsigned char *z, const unsigned char *x, - const unsigned char *y) - __attribute__ ((nonnull)); - -/* - * The interval `s` is sampled from should be at least 317 bits to ensure almost - * uniformity of `r` over `L`. - */ -SODIUM_EXPORT -void crypto_core_ed25519_scalar_reduce(unsigned char *r, const unsigned char *s) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_core_ed25519_scalar_is_canonical(const unsigned char *s) - __attribute__ ((nonnull)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_core_hchacha20.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_core_hchacha20.h deleted file mode 100644 index ece141b0..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_core_hchacha20.h +++ /dev/null @@ -1,36 +0,0 @@ -#ifndef crypto_core_hchacha20_H -#define crypto_core_hchacha20_H - -#include -#include "export.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#define crypto_core_hchacha20_OUTPUTBYTES 32U -SODIUM_EXPORT -size_t crypto_core_hchacha20_outputbytes(void); - -#define crypto_core_hchacha20_INPUTBYTES 16U -SODIUM_EXPORT -size_t crypto_core_hchacha20_inputbytes(void); - -#define crypto_core_hchacha20_KEYBYTES 32U -SODIUM_EXPORT -size_t crypto_core_hchacha20_keybytes(void); - -#define crypto_core_hchacha20_CONSTBYTES 16U -SODIUM_EXPORT -size_t crypto_core_hchacha20_constbytes(void); - -SODIUM_EXPORT -int crypto_core_hchacha20(unsigned char *out, const unsigned char *in, - const unsigned char *k, const unsigned char *c) - __attribute__ ((nonnull(1, 2, 3))); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_core_hsalsa20.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_core_hsalsa20.h deleted file mode 100644 index 4bf7a487..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_core_hsalsa20.h +++ /dev/null @@ -1,36 +0,0 @@ -#ifndef crypto_core_hsalsa20_H -#define crypto_core_hsalsa20_H - -#include -#include "export.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#define crypto_core_hsalsa20_OUTPUTBYTES 32U -SODIUM_EXPORT -size_t crypto_core_hsalsa20_outputbytes(void); - -#define crypto_core_hsalsa20_INPUTBYTES 16U -SODIUM_EXPORT -size_t crypto_core_hsalsa20_inputbytes(void); - -#define crypto_core_hsalsa20_KEYBYTES 32U -SODIUM_EXPORT -size_t crypto_core_hsalsa20_keybytes(void); - -#define crypto_core_hsalsa20_CONSTBYTES 16U -SODIUM_EXPORT -size_t crypto_core_hsalsa20_constbytes(void); - -SODIUM_EXPORT -int crypto_core_hsalsa20(unsigned char *out, const unsigned char *in, - const unsigned char *k, const unsigned char *c) - __attribute__ ((nonnull(1, 2, 3))); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_core_ristretto255.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_core_ristretto255.h deleted file mode 100644 index 5fc3a1be..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_core_ristretto255.h +++ /dev/null @@ -1,121 +0,0 @@ -#ifndef crypto_core_ristretto255_H -#define crypto_core_ristretto255_H - -#include -#include "export.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#define crypto_core_ristretto255_BYTES 32 -SODIUM_EXPORT -size_t crypto_core_ristretto255_bytes(void); - -#define crypto_core_ristretto255_HASHBYTES 64 -SODIUM_EXPORT -size_t crypto_core_ristretto255_hashbytes(void); - -#define crypto_core_ristretto255_SCALARBYTES 32 -SODIUM_EXPORT -size_t crypto_core_ristretto255_scalarbytes(void); - -#define crypto_core_ristretto255_NONREDUCEDSCALARBYTES 64 -SODIUM_EXPORT -size_t crypto_core_ristretto255_nonreducedscalarbytes(void); - -#define crypto_core_ristretto255_H2CSHA256 1 -#define crypto_core_ristretto255_H2CSHA512 2 - -SODIUM_EXPORT -int crypto_core_ristretto255_is_valid_point(const unsigned char *p) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_core_ristretto255_add(unsigned char *r, - const unsigned char *p, const unsigned char *q) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_core_ristretto255_sub(unsigned char *r, - const unsigned char *p, const unsigned char *q) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_core_ristretto255_from_hash(unsigned char *p, - const unsigned char *r) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_core_ristretto255_from_string(unsigned char p[crypto_core_ristretto255_BYTES], - const char *ctx, - const unsigned char *msg, - size_t msg_len, int hash_alg) - __attribute__ ((nonnull(1))); - -SODIUM_EXPORT -int crypto_core_ristretto255_from_string_ro(unsigned char p[crypto_core_ristretto255_BYTES], - const char *ctx, - const unsigned char *msg, - size_t msg_len, int hash_alg) - __attribute__ ((nonnull(1))); - -SODIUM_EXPORT -void crypto_core_ristretto255_random(unsigned char *p) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -void crypto_core_ristretto255_scalar_random(unsigned char *r) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_core_ristretto255_scalar_invert(unsigned char *recip, - const unsigned char *s) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -void crypto_core_ristretto255_scalar_negate(unsigned char *neg, - const unsigned char *s) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -void crypto_core_ristretto255_scalar_complement(unsigned char *comp, - const unsigned char *s) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -void crypto_core_ristretto255_scalar_add(unsigned char *z, - const unsigned char *x, - const unsigned char *y) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -void crypto_core_ristretto255_scalar_sub(unsigned char *z, - const unsigned char *x, - const unsigned char *y) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -void crypto_core_ristretto255_scalar_mul(unsigned char *z, - const unsigned char *x, - const unsigned char *y) - __attribute__ ((nonnull)); - -/* - * The interval `s` is sampled from should be at least 317 bits to ensure almost - * uniformity of `r` over `L`. - */ -SODIUM_EXPORT -void crypto_core_ristretto255_scalar_reduce(unsigned char *r, - const unsigned char *s) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_core_ristretto255_scalar_is_canonical(const unsigned char *s) - __attribute__ ((nonnull)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_core_salsa20.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_core_salsa20.h deleted file mode 100644 index bd79fd9f..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_core_salsa20.h +++ /dev/null @@ -1,36 +0,0 @@ -#ifndef crypto_core_salsa20_H -#define crypto_core_salsa20_H - -#include -#include "export.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#define crypto_core_salsa20_OUTPUTBYTES 64U -SODIUM_EXPORT -size_t crypto_core_salsa20_outputbytes(void); - -#define crypto_core_salsa20_INPUTBYTES 16U -SODIUM_EXPORT -size_t crypto_core_salsa20_inputbytes(void); - -#define crypto_core_salsa20_KEYBYTES 32U -SODIUM_EXPORT -size_t crypto_core_salsa20_keybytes(void); - -#define crypto_core_salsa20_CONSTBYTES 16U -SODIUM_EXPORT -size_t crypto_core_salsa20_constbytes(void); - -SODIUM_EXPORT -int crypto_core_salsa20(unsigned char *out, const unsigned char *in, - const unsigned char *k, const unsigned char *c) - __attribute__ ((nonnull(1, 2, 3))); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_core_salsa2012.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_core_salsa2012.h deleted file mode 100644 index 05957591..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_core_salsa2012.h +++ /dev/null @@ -1,36 +0,0 @@ -#ifndef crypto_core_salsa2012_H -#define crypto_core_salsa2012_H - -#include -#include "export.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#define crypto_core_salsa2012_OUTPUTBYTES 64U -SODIUM_EXPORT -size_t crypto_core_salsa2012_outputbytes(void); - -#define crypto_core_salsa2012_INPUTBYTES 16U -SODIUM_EXPORT -size_t crypto_core_salsa2012_inputbytes(void); - -#define crypto_core_salsa2012_KEYBYTES 32U -SODIUM_EXPORT -size_t crypto_core_salsa2012_keybytes(void); - -#define crypto_core_salsa2012_CONSTBYTES 16U -SODIUM_EXPORT -size_t crypto_core_salsa2012_constbytes(void); - -SODIUM_EXPORT -int crypto_core_salsa2012(unsigned char *out, const unsigned char *in, - const unsigned char *k, const unsigned char *c) - __attribute__ ((nonnull(1, 2, 3))); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_core_salsa208.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_core_salsa208.h deleted file mode 100644 index d2f216af..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_core_salsa208.h +++ /dev/null @@ -1,40 +0,0 @@ -#ifndef crypto_core_salsa208_H -#define crypto_core_salsa208_H - -#include -#include "export.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#define crypto_core_salsa208_OUTPUTBYTES 64U -SODIUM_EXPORT -size_t crypto_core_salsa208_outputbytes(void) - __attribute__ ((deprecated)); - -#define crypto_core_salsa208_INPUTBYTES 16U -SODIUM_EXPORT -size_t crypto_core_salsa208_inputbytes(void) - __attribute__ ((deprecated)); - -#define crypto_core_salsa208_KEYBYTES 32U -SODIUM_EXPORT -size_t crypto_core_salsa208_keybytes(void) - __attribute__ ((deprecated)); - -#define crypto_core_salsa208_CONSTBYTES 16U -SODIUM_EXPORT -size_t crypto_core_salsa208_constbytes(void) - __attribute__ ((deprecated)); - -SODIUM_EXPORT -int crypto_core_salsa208(unsigned char *out, const unsigned char *in, - const unsigned char *k, const unsigned char *c) - __attribute__ ((nonnull(1, 2, 3))); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_generichash.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_generichash.h deleted file mode 100644 index d897e5d2..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_generichash.h +++ /dev/null @@ -1,84 +0,0 @@ -#ifndef crypto_generichash_H -#define crypto_generichash_H - -#include - -#include "crypto_generichash_blake2b.h" -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -#define crypto_generichash_BYTES_MIN crypto_generichash_blake2b_BYTES_MIN -SODIUM_EXPORT -size_t crypto_generichash_bytes_min(void); - -#define crypto_generichash_BYTES_MAX crypto_generichash_blake2b_BYTES_MAX -SODIUM_EXPORT -size_t crypto_generichash_bytes_max(void); - -#define crypto_generichash_BYTES crypto_generichash_blake2b_BYTES -SODIUM_EXPORT -size_t crypto_generichash_bytes(void); - -#define crypto_generichash_KEYBYTES_MIN crypto_generichash_blake2b_KEYBYTES_MIN -SODIUM_EXPORT -size_t crypto_generichash_keybytes_min(void); - -#define crypto_generichash_KEYBYTES_MAX crypto_generichash_blake2b_KEYBYTES_MAX -SODIUM_EXPORT -size_t crypto_generichash_keybytes_max(void); - -#define crypto_generichash_KEYBYTES crypto_generichash_blake2b_KEYBYTES -SODIUM_EXPORT -size_t crypto_generichash_keybytes(void); - -#define crypto_generichash_PRIMITIVE "blake2b" -SODIUM_EXPORT -const char *crypto_generichash_primitive(void); - -/* - * Important when writing bindings for other programming languages: - * the state address should be 64-bytes aligned. - */ -typedef crypto_generichash_blake2b_state crypto_generichash_state; - -SODIUM_EXPORT -size_t crypto_generichash_statebytes(void); - -SODIUM_EXPORT -int crypto_generichash(unsigned char *out, size_t outlen, - const unsigned char *in, unsigned long long inlen, - const unsigned char *key, size_t keylen) - __attribute__ ((nonnull(1))); - -SODIUM_EXPORT -int crypto_generichash_init(crypto_generichash_state *state, - const unsigned char *key, - const size_t keylen, const size_t outlen) - __attribute__ ((nonnull(1))); - -SODIUM_EXPORT -int crypto_generichash_update(crypto_generichash_state *state, - const unsigned char *in, - unsigned long long inlen) - __attribute__ ((nonnull(1))); - -SODIUM_EXPORT -int crypto_generichash_final(crypto_generichash_state *state, - unsigned char *out, const size_t outlen) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -void crypto_generichash_keygen(unsigned char k[crypto_generichash_KEYBYTES]) - __attribute__ ((nonnull)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_generichash_blake2b.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_generichash_blake2b.h deleted file mode 100644 index ae3b52f7..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_generichash_blake2b.h +++ /dev/null @@ -1,122 +0,0 @@ -#ifndef crypto_generichash_blake2b_H -#define crypto_generichash_blake2b_H - -#include -#include -#include - -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -#ifdef __IBMC__ -# pragma pack(1) -#elif defined(__SUNPRO_C) || defined(__SUNPRO_CC) -# pragma pack(1) -#else -# pragma pack(push, 1) -#endif - -typedef struct CRYPTO_ALIGN(64) crypto_generichash_blake2b_state { - unsigned char opaque[384]; -} crypto_generichash_blake2b_state; - -#ifdef __IBMC__ -# pragma pack(pop) -#elif defined(__SUNPRO_C) || defined(__SUNPRO_CC) -# pragma pack() -#else -# pragma pack(pop) -#endif - -#define crypto_generichash_blake2b_BYTES_MIN 16U -SODIUM_EXPORT -size_t crypto_generichash_blake2b_bytes_min(void); - -#define crypto_generichash_blake2b_BYTES_MAX 64U -SODIUM_EXPORT -size_t crypto_generichash_blake2b_bytes_max(void); - -#define crypto_generichash_blake2b_BYTES 32U -SODIUM_EXPORT -size_t crypto_generichash_blake2b_bytes(void); - -#define crypto_generichash_blake2b_KEYBYTES_MIN 16U -SODIUM_EXPORT -size_t crypto_generichash_blake2b_keybytes_min(void); - -#define crypto_generichash_blake2b_KEYBYTES_MAX 64U -SODIUM_EXPORT -size_t crypto_generichash_blake2b_keybytes_max(void); - -#define crypto_generichash_blake2b_KEYBYTES 32U -SODIUM_EXPORT -size_t crypto_generichash_blake2b_keybytes(void); - -#define crypto_generichash_blake2b_SALTBYTES 16U -SODIUM_EXPORT -size_t crypto_generichash_blake2b_saltbytes(void); - -#define crypto_generichash_blake2b_PERSONALBYTES 16U -SODIUM_EXPORT -size_t crypto_generichash_blake2b_personalbytes(void); - -SODIUM_EXPORT -size_t crypto_generichash_blake2b_statebytes(void); - -SODIUM_EXPORT -int crypto_generichash_blake2b(unsigned char *out, size_t outlen, - const unsigned char *in, - unsigned long long inlen, - const unsigned char *key, size_t keylen) - __attribute__ ((nonnull(1))); - -SODIUM_EXPORT -int crypto_generichash_blake2b_salt_personal(unsigned char *out, size_t outlen, - const unsigned char *in, - unsigned long long inlen, - const unsigned char *key, - size_t keylen, - const unsigned char *salt, - const unsigned char *personal) - __attribute__ ((nonnull(1))); - -SODIUM_EXPORT -int crypto_generichash_blake2b_init(crypto_generichash_blake2b_state *state, - const unsigned char *key, - const size_t keylen, const size_t outlen) - __attribute__ ((nonnull(1))); - -SODIUM_EXPORT -int crypto_generichash_blake2b_init_salt_personal(crypto_generichash_blake2b_state *state, - const unsigned char *key, - const size_t keylen, const size_t outlen, - const unsigned char *salt, - const unsigned char *personal) - __attribute__ ((nonnull(1))); - -SODIUM_EXPORT -int crypto_generichash_blake2b_update(crypto_generichash_blake2b_state *state, - const unsigned char *in, - unsigned long long inlen) - __attribute__ ((nonnull(1))); - -SODIUM_EXPORT -int crypto_generichash_blake2b_final(crypto_generichash_blake2b_state *state, - unsigned char *out, - const size_t outlen) __attribute__ ((nonnull)); - -SODIUM_EXPORT -void crypto_generichash_blake2b_keygen(unsigned char k[crypto_generichash_blake2b_KEYBYTES]) - __attribute__ ((nonnull)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_hash.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_hash.h deleted file mode 100644 index 767d5480..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_hash.h +++ /dev/null @@ -1,40 +0,0 @@ -#ifndef crypto_hash_H -#define crypto_hash_H - -/* - * WARNING: Unless you absolutely need to use SHA512 for interoperability, - * purposes, you might want to consider crypto_generichash() instead. - * Unlike SHA512, crypto_generichash() is not vulnerable to length - * extension attacks. - */ - -#include - -#include "crypto_hash_sha512.h" -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -#define crypto_hash_BYTES crypto_hash_sha512_BYTES -SODIUM_EXPORT -size_t crypto_hash_bytes(void); - -SODIUM_EXPORT -int crypto_hash(unsigned char *out, const unsigned char *in, - unsigned long long inlen) __attribute__ ((nonnull(1))); - -#define crypto_hash_PRIMITIVE "sha512" -SODIUM_EXPORT -const char *crypto_hash_primitive(void) - __attribute__ ((warn_unused_result)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_hash_sha256.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_hash_sha256.h deleted file mode 100644 index c47982af..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_hash_sha256.h +++ /dev/null @@ -1,60 +0,0 @@ -#ifndef crypto_hash_sha256_H -#define crypto_hash_sha256_H - -/* - * WARNING: Unless you absolutely need to use SHA256 for interoperability, - * purposes, you might want to consider crypto_generichash() instead. - * Unlike SHA256, crypto_generichash() is not vulnerable to length - * extension attacks. - */ - -#include -#include -#include - -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -typedef struct crypto_hash_sha256_state { - uint32_t state[8]; - uint64_t count; - uint8_t buf[64]; -} crypto_hash_sha256_state; - -SODIUM_EXPORT -size_t crypto_hash_sha256_statebytes(void); - -#define crypto_hash_sha256_BYTES 32U -SODIUM_EXPORT -size_t crypto_hash_sha256_bytes(void); - -SODIUM_EXPORT -int crypto_hash_sha256(unsigned char *out, const unsigned char *in, - unsigned long long inlen) __attribute__ ((nonnull(1))); - -SODIUM_EXPORT -int crypto_hash_sha256_init(crypto_hash_sha256_state *state) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_hash_sha256_update(crypto_hash_sha256_state *state, - const unsigned char *in, - unsigned long long inlen) - __attribute__ ((nonnull(1))); - -SODIUM_EXPORT -int crypto_hash_sha256_final(crypto_hash_sha256_state *state, - unsigned char *out) - __attribute__ ((nonnull)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_hash_sha512.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_hash_sha512.h deleted file mode 100644 index 5b690fb2..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_hash_sha512.h +++ /dev/null @@ -1,60 +0,0 @@ -#ifndef crypto_hash_sha512_H -#define crypto_hash_sha512_H - -/* - * WARNING: Unless you absolutely need to use SHA512 for interoperability, - * purposes, you might want to consider crypto_generichash() instead. - * Unlike SHA512, crypto_generichash() is not vulnerable to length - * extension attacks. - */ - -#include -#include -#include - -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -typedef struct crypto_hash_sha512_state { - uint64_t state[8]; - uint64_t count[2]; - uint8_t buf[128]; -} crypto_hash_sha512_state; - -SODIUM_EXPORT -size_t crypto_hash_sha512_statebytes(void); - -#define crypto_hash_sha512_BYTES 64U -SODIUM_EXPORT -size_t crypto_hash_sha512_bytes(void); - -SODIUM_EXPORT -int crypto_hash_sha512(unsigned char *out, const unsigned char *in, - unsigned long long inlen) __attribute__ ((nonnull(1))); - -SODIUM_EXPORT -int crypto_hash_sha512_init(crypto_hash_sha512_state *state) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_hash_sha512_update(crypto_hash_sha512_state *state, - const unsigned char *in, - unsigned long long inlen) - __attribute__ ((nonnull(1))); - -SODIUM_EXPORT -int crypto_hash_sha512_final(crypto_hash_sha512_state *state, - unsigned char *out) - __attribute__ ((nonnull)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_kdf.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_kdf.h deleted file mode 100644 index ac2fc618..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_kdf.h +++ /dev/null @@ -1,53 +0,0 @@ -#ifndef crypto_kdf_H -#define crypto_kdf_H - -#include -#include - -#include "crypto_kdf_blake2b.h" -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -#define crypto_kdf_BYTES_MIN crypto_kdf_blake2b_BYTES_MIN -SODIUM_EXPORT -size_t crypto_kdf_bytes_min(void); - -#define crypto_kdf_BYTES_MAX crypto_kdf_blake2b_BYTES_MAX -SODIUM_EXPORT -size_t crypto_kdf_bytes_max(void); - -#define crypto_kdf_CONTEXTBYTES crypto_kdf_blake2b_CONTEXTBYTES -SODIUM_EXPORT -size_t crypto_kdf_contextbytes(void); - -#define crypto_kdf_KEYBYTES crypto_kdf_blake2b_KEYBYTES -SODIUM_EXPORT -size_t crypto_kdf_keybytes(void); - -#define crypto_kdf_PRIMITIVE "blake2b" -SODIUM_EXPORT -const char *crypto_kdf_primitive(void) - __attribute__ ((warn_unused_result)); - -SODIUM_EXPORT -int crypto_kdf_derive_from_key(unsigned char *subkey, size_t subkey_len, - uint64_t subkey_id, - const char ctx[crypto_kdf_CONTEXTBYTES], - const unsigned char key[crypto_kdf_KEYBYTES]) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -void crypto_kdf_keygen(unsigned char k[crypto_kdf_KEYBYTES]) - __attribute__ ((nonnull)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_kdf_blake2b.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_kdf_blake2b.h deleted file mode 100644 index 489c7c20..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_kdf_blake2b.h +++ /dev/null @@ -1,44 +0,0 @@ -#ifndef crypto_kdf_blake2b_H -#define crypto_kdf_blake2b_H - -#include -#include -#include - -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -#define crypto_kdf_blake2b_BYTES_MIN 16 -SODIUM_EXPORT -size_t crypto_kdf_blake2b_bytes_min(void); - -#define crypto_kdf_blake2b_BYTES_MAX 64 -SODIUM_EXPORT -size_t crypto_kdf_blake2b_bytes_max(void); - -#define crypto_kdf_blake2b_CONTEXTBYTES 8 -SODIUM_EXPORT -size_t crypto_kdf_blake2b_contextbytes(void); - -#define crypto_kdf_blake2b_KEYBYTES 32 -SODIUM_EXPORT -size_t crypto_kdf_blake2b_keybytes(void); - -SODIUM_EXPORT -int crypto_kdf_blake2b_derive_from_key(unsigned char *subkey, size_t subkey_len, - uint64_t subkey_id, - const char ctx[crypto_kdf_blake2b_CONTEXTBYTES], - const unsigned char key[crypto_kdf_blake2b_KEYBYTES]) - __attribute__ ((nonnull)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_kdf_hkdf_sha256.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_kdf_hkdf_sha256.h deleted file mode 100644 index 899a6316..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_kdf_hkdf_sha256.h +++ /dev/null @@ -1,48 +0,0 @@ -#ifndef crypto_kdf_hkdf_sha256_H -#define crypto_kdf_hkdf_sha256_H - -#include -#include -#include - -#include "crypto_kdf.h" -#include "crypto_auth_hmacsha256.h" -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -#define crypto_kdf_hkdf_sha256_KEYBYTES crypto_auth_hmacsha256_BYTES -SODIUM_EXPORT -size_t crypto_kdf_hkdf_sha256_keybytes(void); - -#define crypto_kdf_hkdf_sha256_BYTES_MIN 0U -SODIUM_EXPORT -size_t crypto_kdf_hkdf_sha256_bytes_min(void); - -#define crypto_kdf_hkdf_sha256_BYTES_MAX (0xff * crypto_auth_hmacsha256_BYTES) -SODIUM_EXPORT -size_t crypto_kdf_hkdf_sha256_bytes_max(void); - -SODIUM_EXPORT -int crypto_kdf_hkdf_sha256_extract(unsigned char prk[crypto_kdf_hkdf_sha256_KEYBYTES], - const unsigned char *salt, size_t salt_len, - const unsigned char *ikm, size_t ikm_len); - -SODIUM_EXPORT -void crypto_kdf_hkdf_sha256_keygen(unsigned char prk[crypto_kdf_hkdf_sha256_KEYBYTES]); - -SODIUM_EXPORT -int crypto_kdf_hkdf_sha256_expand(unsigned char *out, size_t out_len, - const char *ctx, size_t ctx_len, - const unsigned char prk[crypto_kdf_hkdf_sha256_KEYBYTES]); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_kdf_hkdf_sha512.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_kdf_hkdf_sha512.h deleted file mode 100644 index 3fa6868c..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_kdf_hkdf_sha512.h +++ /dev/null @@ -1,51 +0,0 @@ -#ifndef crypto_kdf_hkdf_sha512_H -#define crypto_kdf_hkdf_sha512_H - -#include -#include -#include - -#include "crypto_kdf.h" -#include "crypto_auth_hmacsha512.h" -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -#define crypto_kdf_hkdf_sha512_KEYBYTES crypto_auth_hmacsha512_BYTES -SODIUM_EXPORT -size_t crypto_kdf_hkdf_sha512_keybytes(void); - -#define crypto_kdf_hkdf_sha512_BYTES_MIN 0U -SODIUM_EXPORT -size_t crypto_kdf_hkdf_sha512_bytes_min(void); - -#define crypto_kdf_hkdf_sha512_BYTES_MAX (0xff * crypto_auth_hmacsha512_BYTES) -SODIUM_EXPORT -size_t crypto_kdf_hkdf_sha512_bytes_max(void); - -SODIUM_EXPORT -int crypto_kdf_hkdf_sha512_extract(unsigned char prk[crypto_kdf_hkdf_sha512_KEYBYTES], - const unsigned char *salt, size_t salt_len, - const unsigned char *ikm, size_t ikm_len) - __attribute__ ((nonnull(1))); - -SODIUM_EXPORT -void crypto_kdf_hkdf_sha512_keygen(unsigned char prk[crypto_kdf_hkdf_sha512_KEYBYTES]) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_kdf_hkdf_sha512_expand(unsigned char *out, size_t out_len, - const char *ctx, size_t ctx_len, - const unsigned char prk[crypto_kdf_hkdf_sha512_KEYBYTES]) - __attribute__ ((nonnull(1))); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_kx.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_kx.h deleted file mode 100644 index 347132c3..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_kx.h +++ /dev/null @@ -1,66 +0,0 @@ -#ifndef crypto_kx_H -#define crypto_kx_H - -#include - -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -#define crypto_kx_PUBLICKEYBYTES 32 -SODIUM_EXPORT -size_t crypto_kx_publickeybytes(void); - -#define crypto_kx_SECRETKEYBYTES 32 -SODIUM_EXPORT -size_t crypto_kx_secretkeybytes(void); - -#define crypto_kx_SEEDBYTES 32 -SODIUM_EXPORT -size_t crypto_kx_seedbytes(void); - -#define crypto_kx_SESSIONKEYBYTES 32 -SODIUM_EXPORT -size_t crypto_kx_sessionkeybytes(void); - -#define crypto_kx_PRIMITIVE "x25519blake2b" -SODIUM_EXPORT -const char *crypto_kx_primitive(void); - -SODIUM_EXPORT -int crypto_kx_seed_keypair(unsigned char pk[crypto_kx_PUBLICKEYBYTES], - unsigned char sk[crypto_kx_SECRETKEYBYTES], - const unsigned char seed[crypto_kx_SEEDBYTES]) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_kx_keypair(unsigned char pk[crypto_kx_PUBLICKEYBYTES], - unsigned char sk[crypto_kx_SECRETKEYBYTES]) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_kx_client_session_keys(unsigned char rx[crypto_kx_SESSIONKEYBYTES], - unsigned char tx[crypto_kx_SESSIONKEYBYTES], - const unsigned char client_pk[crypto_kx_PUBLICKEYBYTES], - const unsigned char client_sk[crypto_kx_SECRETKEYBYTES], - const unsigned char server_pk[crypto_kx_PUBLICKEYBYTES]) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(3, 4, 5))); - -SODIUM_EXPORT -int crypto_kx_server_session_keys(unsigned char rx[crypto_kx_SESSIONKEYBYTES], - unsigned char tx[crypto_kx_SESSIONKEYBYTES], - const unsigned char server_pk[crypto_kx_PUBLICKEYBYTES], - const unsigned char server_sk[crypto_kx_SECRETKEYBYTES], - const unsigned char client_pk[crypto_kx_PUBLICKEYBYTES]) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(3, 4, 5))); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_onetimeauth.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_onetimeauth.h deleted file mode 100644 index 7cd7b070..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_onetimeauth.h +++ /dev/null @@ -1,65 +0,0 @@ -#ifndef crypto_onetimeauth_H -#define crypto_onetimeauth_H - -#include - -#include "crypto_onetimeauth_poly1305.h" -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -typedef crypto_onetimeauth_poly1305_state crypto_onetimeauth_state; - -SODIUM_EXPORT -size_t crypto_onetimeauth_statebytes(void); - -#define crypto_onetimeauth_BYTES crypto_onetimeauth_poly1305_BYTES -SODIUM_EXPORT -size_t crypto_onetimeauth_bytes(void); - -#define crypto_onetimeauth_KEYBYTES crypto_onetimeauth_poly1305_KEYBYTES -SODIUM_EXPORT -size_t crypto_onetimeauth_keybytes(void); - -#define crypto_onetimeauth_PRIMITIVE "poly1305" -SODIUM_EXPORT -const char *crypto_onetimeauth_primitive(void); - -SODIUM_EXPORT -int crypto_onetimeauth(unsigned char *out, const unsigned char *in, - unsigned long long inlen, const unsigned char *k) - __attribute__ ((nonnull(1, 4))); - -SODIUM_EXPORT -int crypto_onetimeauth_verify(const unsigned char *h, const unsigned char *in, - unsigned long long inlen, const unsigned char *k) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(1, 4))); - -SODIUM_EXPORT -int crypto_onetimeauth_init(crypto_onetimeauth_state *state, - const unsigned char *key) __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_onetimeauth_update(crypto_onetimeauth_state *state, - const unsigned char *in, - unsigned long long inlen) - __attribute__ ((nonnull(1))); - -SODIUM_EXPORT -int crypto_onetimeauth_final(crypto_onetimeauth_state *state, - unsigned char *out) __attribute__ ((nonnull)); - -SODIUM_EXPORT -void crypto_onetimeauth_keygen(unsigned char k[crypto_onetimeauth_KEYBYTES]) - __attribute__ ((nonnull)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_onetimeauth_poly1305.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_onetimeauth_poly1305.h deleted file mode 100644 index f3e34d86..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_onetimeauth_poly1305.h +++ /dev/null @@ -1,72 +0,0 @@ -#ifndef crypto_onetimeauth_poly1305_H -#define crypto_onetimeauth_poly1305_H - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -#include -#include -#include - -#include - -#include "export.h" - -typedef struct CRYPTO_ALIGN(16) crypto_onetimeauth_poly1305_state { - unsigned char opaque[256]; -} crypto_onetimeauth_poly1305_state; - -SODIUM_EXPORT -size_t crypto_onetimeauth_poly1305_statebytes(void); - -#define crypto_onetimeauth_poly1305_BYTES 16U -SODIUM_EXPORT -size_t crypto_onetimeauth_poly1305_bytes(void); - -#define crypto_onetimeauth_poly1305_KEYBYTES 32U -SODIUM_EXPORT -size_t crypto_onetimeauth_poly1305_keybytes(void); - -SODIUM_EXPORT -int crypto_onetimeauth_poly1305(unsigned char *out, - const unsigned char *in, - unsigned long long inlen, - const unsigned char *k) - __attribute__ ((nonnull(1, 4))); - -SODIUM_EXPORT -int crypto_onetimeauth_poly1305_verify(const unsigned char *h, - const unsigned char *in, - unsigned long long inlen, - const unsigned char *k) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(1, 4))); - -SODIUM_EXPORT -int crypto_onetimeauth_poly1305_init(crypto_onetimeauth_poly1305_state *state, - const unsigned char *key) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_onetimeauth_poly1305_update(crypto_onetimeauth_poly1305_state *state, - const unsigned char *in, - unsigned long long inlen) - __attribute__ ((nonnull(1))); - -SODIUM_EXPORT -int crypto_onetimeauth_poly1305_final(crypto_onetimeauth_poly1305_state *state, - unsigned char *out) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -void crypto_onetimeauth_poly1305_keygen(unsigned char k[crypto_onetimeauth_poly1305_KEYBYTES]) - __attribute__ ((nonnull)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_pwhash.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_pwhash.h deleted file mode 100644 index 307265d3..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_pwhash.h +++ /dev/null @@ -1,147 +0,0 @@ -#ifndef crypto_pwhash_H -#define crypto_pwhash_H - -#include - -#include "crypto_pwhash_argon2i.h" -#include "crypto_pwhash_argon2id.h" -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -#define crypto_pwhash_ALG_ARGON2I13 crypto_pwhash_argon2i_ALG_ARGON2I13 -SODIUM_EXPORT -int crypto_pwhash_alg_argon2i13(void); - -#define crypto_pwhash_ALG_ARGON2ID13 crypto_pwhash_argon2id_ALG_ARGON2ID13 -SODIUM_EXPORT -int crypto_pwhash_alg_argon2id13(void); - -#define crypto_pwhash_ALG_DEFAULT crypto_pwhash_ALG_ARGON2ID13 -SODIUM_EXPORT -int crypto_pwhash_alg_default(void); - -#define crypto_pwhash_BYTES_MIN crypto_pwhash_argon2id_BYTES_MIN -SODIUM_EXPORT -size_t crypto_pwhash_bytes_min(void); - -#define crypto_pwhash_BYTES_MAX crypto_pwhash_argon2id_BYTES_MAX -SODIUM_EXPORT -size_t crypto_pwhash_bytes_max(void); - -#define crypto_pwhash_PASSWD_MIN crypto_pwhash_argon2id_PASSWD_MIN -SODIUM_EXPORT -size_t crypto_pwhash_passwd_min(void); - -#define crypto_pwhash_PASSWD_MAX crypto_pwhash_argon2id_PASSWD_MAX -SODIUM_EXPORT -size_t crypto_pwhash_passwd_max(void); - -#define crypto_pwhash_SALTBYTES crypto_pwhash_argon2id_SALTBYTES -SODIUM_EXPORT -size_t crypto_pwhash_saltbytes(void); - -#define crypto_pwhash_STRBYTES crypto_pwhash_argon2id_STRBYTES -SODIUM_EXPORT -size_t crypto_pwhash_strbytes(void); - -#define crypto_pwhash_STRPREFIX crypto_pwhash_argon2id_STRPREFIX -SODIUM_EXPORT -const char *crypto_pwhash_strprefix(void); - -#define crypto_pwhash_OPSLIMIT_MIN crypto_pwhash_argon2id_OPSLIMIT_MIN -SODIUM_EXPORT -unsigned long long crypto_pwhash_opslimit_min(void); - -#define crypto_pwhash_OPSLIMIT_MAX crypto_pwhash_argon2id_OPSLIMIT_MAX -SODIUM_EXPORT -unsigned long long crypto_pwhash_opslimit_max(void); - -#define crypto_pwhash_MEMLIMIT_MIN crypto_pwhash_argon2id_MEMLIMIT_MIN -SODIUM_EXPORT -size_t crypto_pwhash_memlimit_min(void); - -#define crypto_pwhash_MEMLIMIT_MAX crypto_pwhash_argon2id_MEMLIMIT_MAX -SODIUM_EXPORT -size_t crypto_pwhash_memlimit_max(void); - -#define crypto_pwhash_OPSLIMIT_INTERACTIVE crypto_pwhash_argon2id_OPSLIMIT_INTERACTIVE -SODIUM_EXPORT -unsigned long long crypto_pwhash_opslimit_interactive(void); - -#define crypto_pwhash_MEMLIMIT_INTERACTIVE crypto_pwhash_argon2id_MEMLIMIT_INTERACTIVE -SODIUM_EXPORT -size_t crypto_pwhash_memlimit_interactive(void); - -#define crypto_pwhash_OPSLIMIT_MODERATE crypto_pwhash_argon2id_OPSLIMIT_MODERATE -SODIUM_EXPORT -unsigned long long crypto_pwhash_opslimit_moderate(void); - -#define crypto_pwhash_MEMLIMIT_MODERATE crypto_pwhash_argon2id_MEMLIMIT_MODERATE -SODIUM_EXPORT -size_t crypto_pwhash_memlimit_moderate(void); - -#define crypto_pwhash_OPSLIMIT_SENSITIVE crypto_pwhash_argon2id_OPSLIMIT_SENSITIVE -SODIUM_EXPORT -unsigned long long crypto_pwhash_opslimit_sensitive(void); - -#define crypto_pwhash_MEMLIMIT_SENSITIVE crypto_pwhash_argon2id_MEMLIMIT_SENSITIVE -SODIUM_EXPORT -size_t crypto_pwhash_memlimit_sensitive(void); - -/* - * With this function, do not forget to store all parameters, including the - * algorithm identifier in order to produce deterministic output. - * The crypto_pwhash_* definitions, including crypto_pwhash_ALG_DEFAULT, - * may change. - */ -SODIUM_EXPORT -int crypto_pwhash(unsigned char * const out, unsigned long long outlen, - const char * const passwd, unsigned long long passwdlen, - const unsigned char * const salt, - unsigned long long opslimit, size_t memlimit, int alg) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull)); - -/* - * The output string already includes all the required parameters, including - * the algorithm identifier. The string is all that has to be stored in - * order to verify a password. - */ -SODIUM_EXPORT -int crypto_pwhash_str(char out[crypto_pwhash_STRBYTES], - const char * const passwd, unsigned long long passwdlen, - unsigned long long opslimit, size_t memlimit) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_pwhash_str_alg(char out[crypto_pwhash_STRBYTES], - const char * const passwd, unsigned long long passwdlen, - unsigned long long opslimit, size_t memlimit, int alg) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_pwhash_str_verify(const char *str, - const char * const passwd, - unsigned long long passwdlen) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_pwhash_str_needs_rehash(const char *str, - unsigned long long opslimit, size_t memlimit) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull)); - -#define crypto_pwhash_PRIMITIVE "argon2i" -SODIUM_EXPORT -const char *crypto_pwhash_primitive(void) - __attribute__ ((warn_unused_result)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_pwhash_argon2i.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_pwhash_argon2i.h deleted file mode 100644 index 91156ba0..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_pwhash_argon2i.h +++ /dev/null @@ -1,122 +0,0 @@ -#ifndef crypto_pwhash_argon2i_H -#define crypto_pwhash_argon2i_H - -#include -#include -#include - -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -#define crypto_pwhash_argon2i_ALG_ARGON2I13 1 -SODIUM_EXPORT -int crypto_pwhash_argon2i_alg_argon2i13(void); - -#define crypto_pwhash_argon2i_BYTES_MIN 16U -SODIUM_EXPORT -size_t crypto_pwhash_argon2i_bytes_min(void); - -#define crypto_pwhash_argon2i_BYTES_MAX SODIUM_MIN(SODIUM_SIZE_MAX, 4294967295U) -SODIUM_EXPORT -size_t crypto_pwhash_argon2i_bytes_max(void); - -#define crypto_pwhash_argon2i_PASSWD_MIN 0U -SODIUM_EXPORT -size_t crypto_pwhash_argon2i_passwd_min(void); - -#define crypto_pwhash_argon2i_PASSWD_MAX 4294967295U -SODIUM_EXPORT -size_t crypto_pwhash_argon2i_passwd_max(void); - -#define crypto_pwhash_argon2i_SALTBYTES 16U -SODIUM_EXPORT -size_t crypto_pwhash_argon2i_saltbytes(void); - -#define crypto_pwhash_argon2i_STRBYTES 128U -SODIUM_EXPORT -size_t crypto_pwhash_argon2i_strbytes(void); - -#define crypto_pwhash_argon2i_STRPREFIX "$argon2i$" -SODIUM_EXPORT -const char *crypto_pwhash_argon2i_strprefix(void); - -#define crypto_pwhash_argon2i_OPSLIMIT_MIN 3U -SODIUM_EXPORT -unsigned long long crypto_pwhash_argon2i_opslimit_min(void); - -#define crypto_pwhash_argon2i_OPSLIMIT_MAX 4294967295U -SODIUM_EXPORT -unsigned long long crypto_pwhash_argon2i_opslimit_max(void); - -#define crypto_pwhash_argon2i_MEMLIMIT_MIN 8192U -SODIUM_EXPORT -size_t crypto_pwhash_argon2i_memlimit_min(void); - -#define crypto_pwhash_argon2i_MEMLIMIT_MAX \ - ((SIZE_MAX >= 4398046510080U) ? 4398046510080U : (SIZE_MAX >= 2147483648U) ? 2147483648U : 32768U) -SODIUM_EXPORT -size_t crypto_pwhash_argon2i_memlimit_max(void); - -#define crypto_pwhash_argon2i_OPSLIMIT_INTERACTIVE 4U -SODIUM_EXPORT -unsigned long long crypto_pwhash_argon2i_opslimit_interactive(void); - -#define crypto_pwhash_argon2i_MEMLIMIT_INTERACTIVE 33554432U -SODIUM_EXPORT -size_t crypto_pwhash_argon2i_memlimit_interactive(void); - -#define crypto_pwhash_argon2i_OPSLIMIT_MODERATE 6U -SODIUM_EXPORT -unsigned long long crypto_pwhash_argon2i_opslimit_moderate(void); - -#define crypto_pwhash_argon2i_MEMLIMIT_MODERATE 134217728U -SODIUM_EXPORT -size_t crypto_pwhash_argon2i_memlimit_moderate(void); - -#define crypto_pwhash_argon2i_OPSLIMIT_SENSITIVE 8U -SODIUM_EXPORT -unsigned long long crypto_pwhash_argon2i_opslimit_sensitive(void); - -#define crypto_pwhash_argon2i_MEMLIMIT_SENSITIVE 536870912U -SODIUM_EXPORT -size_t crypto_pwhash_argon2i_memlimit_sensitive(void); - -SODIUM_EXPORT -int crypto_pwhash_argon2i(unsigned char * const out, - unsigned long long outlen, - const char * const passwd, - unsigned long long passwdlen, - const unsigned char * const salt, - unsigned long long opslimit, size_t memlimit, - int alg) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_pwhash_argon2i_str(char out[crypto_pwhash_argon2i_STRBYTES], - const char * const passwd, - unsigned long long passwdlen, - unsigned long long opslimit, size_t memlimit) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_pwhash_argon2i_str_verify(const char * str, - const char * const passwd, - unsigned long long passwdlen) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_pwhash_argon2i_str_needs_rehash(const char * str, - unsigned long long opslimit, size_t memlimit) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_pwhash_argon2id.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_pwhash_argon2id.h deleted file mode 100644 index e6f72a92..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_pwhash_argon2id.h +++ /dev/null @@ -1,122 +0,0 @@ -#ifndef crypto_pwhash_argon2id_H -#define crypto_pwhash_argon2id_H - -#include -#include -#include - -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -#define crypto_pwhash_argon2id_ALG_ARGON2ID13 2 -SODIUM_EXPORT -int crypto_pwhash_argon2id_alg_argon2id13(void); - -#define crypto_pwhash_argon2id_BYTES_MIN 16U -SODIUM_EXPORT -size_t crypto_pwhash_argon2id_bytes_min(void); - -#define crypto_pwhash_argon2id_BYTES_MAX SODIUM_MIN(SODIUM_SIZE_MAX, 4294967295U) -SODIUM_EXPORT -size_t crypto_pwhash_argon2id_bytes_max(void); - -#define crypto_pwhash_argon2id_PASSWD_MIN 0U -SODIUM_EXPORT -size_t crypto_pwhash_argon2id_passwd_min(void); - -#define crypto_pwhash_argon2id_PASSWD_MAX 4294967295U -SODIUM_EXPORT -size_t crypto_pwhash_argon2id_passwd_max(void); - -#define crypto_pwhash_argon2id_SALTBYTES 16U -SODIUM_EXPORT -size_t crypto_pwhash_argon2id_saltbytes(void); - -#define crypto_pwhash_argon2id_STRBYTES 128U -SODIUM_EXPORT -size_t crypto_pwhash_argon2id_strbytes(void); - -#define crypto_pwhash_argon2id_STRPREFIX "$argon2id$" -SODIUM_EXPORT -const char *crypto_pwhash_argon2id_strprefix(void); - -#define crypto_pwhash_argon2id_OPSLIMIT_MIN 1U -SODIUM_EXPORT -unsigned long long crypto_pwhash_argon2id_opslimit_min(void); - -#define crypto_pwhash_argon2id_OPSLIMIT_MAX 4294967295U -SODIUM_EXPORT -unsigned long long crypto_pwhash_argon2id_opslimit_max(void); - -#define crypto_pwhash_argon2id_MEMLIMIT_MIN 8192U -SODIUM_EXPORT -size_t crypto_pwhash_argon2id_memlimit_min(void); - -#define crypto_pwhash_argon2id_MEMLIMIT_MAX \ - ((SIZE_MAX >= 4398046510080U) ? 4398046510080U : (SIZE_MAX >= 2147483648U) ? 2147483648U : 32768U) -SODIUM_EXPORT -size_t crypto_pwhash_argon2id_memlimit_max(void); - -#define crypto_pwhash_argon2id_OPSLIMIT_INTERACTIVE 2U -SODIUM_EXPORT -unsigned long long crypto_pwhash_argon2id_opslimit_interactive(void); - -#define crypto_pwhash_argon2id_MEMLIMIT_INTERACTIVE 67108864U -SODIUM_EXPORT -size_t crypto_pwhash_argon2id_memlimit_interactive(void); - -#define crypto_pwhash_argon2id_OPSLIMIT_MODERATE 3U -SODIUM_EXPORT -unsigned long long crypto_pwhash_argon2id_opslimit_moderate(void); - -#define crypto_pwhash_argon2id_MEMLIMIT_MODERATE 268435456U -SODIUM_EXPORT -size_t crypto_pwhash_argon2id_memlimit_moderate(void); - -#define crypto_pwhash_argon2id_OPSLIMIT_SENSITIVE 4U -SODIUM_EXPORT -unsigned long long crypto_pwhash_argon2id_opslimit_sensitive(void); - -#define crypto_pwhash_argon2id_MEMLIMIT_SENSITIVE 1073741824U -SODIUM_EXPORT -size_t crypto_pwhash_argon2id_memlimit_sensitive(void); - -SODIUM_EXPORT -int crypto_pwhash_argon2id(unsigned char * const out, - unsigned long long outlen, - const char * const passwd, - unsigned long long passwdlen, - const unsigned char * const salt, - unsigned long long opslimit, size_t memlimit, - int alg) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_pwhash_argon2id_str(char out[crypto_pwhash_argon2id_STRBYTES], - const char * const passwd, - unsigned long long passwdlen, - unsigned long long opslimit, size_t memlimit) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_pwhash_argon2id_str_verify(const char * str, - const char * const passwd, - unsigned long long passwdlen) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_pwhash_argon2id_str_needs_rehash(const char * str, - unsigned long long opslimit, size_t memlimit) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_pwhash_scryptsalsa208sha256.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_pwhash_scryptsalsa208sha256.h deleted file mode 100644 index 1fd3692f..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_pwhash_scryptsalsa208sha256.h +++ /dev/null @@ -1,120 +0,0 @@ -#ifndef crypto_pwhash_scryptsalsa208sha256_H -#define crypto_pwhash_scryptsalsa208sha256_H - -#include -#include -#include - -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -#define crypto_pwhash_scryptsalsa208sha256_BYTES_MIN 16U -SODIUM_EXPORT -size_t crypto_pwhash_scryptsalsa208sha256_bytes_min(void); - -#define crypto_pwhash_scryptsalsa208sha256_BYTES_MAX \ - SODIUM_MIN(SODIUM_SIZE_MAX, 0x1fffffffe0ULL) -SODIUM_EXPORT -size_t crypto_pwhash_scryptsalsa208sha256_bytes_max(void); - -#define crypto_pwhash_scryptsalsa208sha256_PASSWD_MIN 0U -SODIUM_EXPORT -size_t crypto_pwhash_scryptsalsa208sha256_passwd_min(void); - -#define crypto_pwhash_scryptsalsa208sha256_PASSWD_MAX SODIUM_SIZE_MAX -SODIUM_EXPORT -size_t crypto_pwhash_scryptsalsa208sha256_passwd_max(void); - -#define crypto_pwhash_scryptsalsa208sha256_SALTBYTES 32U -SODIUM_EXPORT -size_t crypto_pwhash_scryptsalsa208sha256_saltbytes(void); - -#define crypto_pwhash_scryptsalsa208sha256_STRBYTES 102U -SODIUM_EXPORT -size_t crypto_pwhash_scryptsalsa208sha256_strbytes(void); - -#define crypto_pwhash_scryptsalsa208sha256_STRPREFIX "$7$" -SODIUM_EXPORT -const char *crypto_pwhash_scryptsalsa208sha256_strprefix(void); - -#define crypto_pwhash_scryptsalsa208sha256_OPSLIMIT_MIN 32768U -SODIUM_EXPORT -unsigned long long crypto_pwhash_scryptsalsa208sha256_opslimit_min(void); - -#define crypto_pwhash_scryptsalsa208sha256_OPSLIMIT_MAX 4294967295U -SODIUM_EXPORT -unsigned long long crypto_pwhash_scryptsalsa208sha256_opslimit_max(void); - -#define crypto_pwhash_scryptsalsa208sha256_MEMLIMIT_MIN 16777216U -SODIUM_EXPORT -size_t crypto_pwhash_scryptsalsa208sha256_memlimit_min(void); - -#define crypto_pwhash_scryptsalsa208sha256_MEMLIMIT_MAX \ - SODIUM_MIN(SIZE_MAX, 68719476736ULL) -SODIUM_EXPORT -size_t crypto_pwhash_scryptsalsa208sha256_memlimit_max(void); - -#define crypto_pwhash_scryptsalsa208sha256_OPSLIMIT_INTERACTIVE 524288U -SODIUM_EXPORT -unsigned long long crypto_pwhash_scryptsalsa208sha256_opslimit_interactive(void); - -#define crypto_pwhash_scryptsalsa208sha256_MEMLIMIT_INTERACTIVE 16777216U -SODIUM_EXPORT -size_t crypto_pwhash_scryptsalsa208sha256_memlimit_interactive(void); - -#define crypto_pwhash_scryptsalsa208sha256_OPSLIMIT_SENSITIVE 33554432U -SODIUM_EXPORT -unsigned long long crypto_pwhash_scryptsalsa208sha256_opslimit_sensitive(void); - -#define crypto_pwhash_scryptsalsa208sha256_MEMLIMIT_SENSITIVE 1073741824U -SODIUM_EXPORT -size_t crypto_pwhash_scryptsalsa208sha256_memlimit_sensitive(void); - -SODIUM_EXPORT -int crypto_pwhash_scryptsalsa208sha256(unsigned char * const out, - unsigned long long outlen, - const char * const passwd, - unsigned long long passwdlen, - const unsigned char * const salt, - unsigned long long opslimit, - size_t memlimit) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_pwhash_scryptsalsa208sha256_str(char out[crypto_pwhash_scryptsalsa208sha256_STRBYTES], - const char * const passwd, - unsigned long long passwdlen, - unsigned long long opslimit, - size_t memlimit) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_pwhash_scryptsalsa208sha256_str_verify(const char * str, - const char * const passwd, - unsigned long long passwdlen) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_pwhash_scryptsalsa208sha256_ll(const uint8_t * passwd, size_t passwdlen, - const uint8_t * salt, size_t saltlen, - uint64_t N, uint32_t r, uint32_t p, - uint8_t * buf, size_t buflen) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_pwhash_scryptsalsa208sha256_str_needs_rehash(const char * str, - unsigned long long opslimit, - size_t memlimit) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_scalarmult.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_scalarmult.h deleted file mode 100644 index 1c685853..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_scalarmult.h +++ /dev/null @@ -1,46 +0,0 @@ -#ifndef crypto_scalarmult_H -#define crypto_scalarmult_H - -#include - -#include "crypto_scalarmult_curve25519.h" -#include "export.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#define crypto_scalarmult_BYTES crypto_scalarmult_curve25519_BYTES -SODIUM_EXPORT -size_t crypto_scalarmult_bytes(void); - -#define crypto_scalarmult_SCALARBYTES crypto_scalarmult_curve25519_SCALARBYTES -SODIUM_EXPORT -size_t crypto_scalarmult_scalarbytes(void); - -#define crypto_scalarmult_PRIMITIVE "curve25519" -SODIUM_EXPORT -const char *crypto_scalarmult_primitive(void); - -SODIUM_EXPORT -int crypto_scalarmult_base(unsigned char *q, const unsigned char *n) - __attribute__ ((nonnull)); - -/* - * NOTE: Do not use the result of this function directly for key exchange. - * - * Hash the result with the public keys in order to compute a shared - * secret key: H(q || client_pk || server_pk) - * - * Or unless this is not an option, use the crypto_kx() API instead. - */ -SODIUM_EXPORT -int crypto_scalarmult(unsigned char *q, const unsigned char *n, - const unsigned char *p) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_scalarmult_curve25519.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_scalarmult_curve25519.h deleted file mode 100644 index 60e9d0c5..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_scalarmult_curve25519.h +++ /dev/null @@ -1,42 +0,0 @@ -#ifndef crypto_scalarmult_curve25519_H -#define crypto_scalarmult_curve25519_H - -#include - -#include "export.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#define crypto_scalarmult_curve25519_BYTES 32U -SODIUM_EXPORT -size_t crypto_scalarmult_curve25519_bytes(void); - -#define crypto_scalarmult_curve25519_SCALARBYTES 32U -SODIUM_EXPORT -size_t crypto_scalarmult_curve25519_scalarbytes(void); - -/* - * NOTE: Do not use the result of this function directly for key exchange. - * - * Hash the result with the public keys in order to compute a shared - * secret key: H(q || client_pk || server_pk) - * - * Or unless this is not an option, use the crypto_kx() API instead. - */ -SODIUM_EXPORT -int crypto_scalarmult_curve25519(unsigned char *q, const unsigned char *n, - const unsigned char *p) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_scalarmult_curve25519_base(unsigned char *q, - const unsigned char *n) - __attribute__ ((nonnull)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_scalarmult_ed25519.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_scalarmult_ed25519.h deleted file mode 100644 index 2dfa4d70..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_scalarmult_ed25519.h +++ /dev/null @@ -1,51 +0,0 @@ - -#ifndef crypto_scalarmult_ed25519_H -#define crypto_scalarmult_ed25519_H - -#include - -#include "export.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#define crypto_scalarmult_ed25519_BYTES 32U -SODIUM_EXPORT -size_t crypto_scalarmult_ed25519_bytes(void); - -#define crypto_scalarmult_ed25519_SCALARBYTES 32U -SODIUM_EXPORT -size_t crypto_scalarmult_ed25519_scalarbytes(void); - -/* - * NOTE: Do not use the result of this function directly for key exchange. - * - * Hash the result with the public keys in order to compute a shared - * secret key: H(q || client_pk || server_pk) - * - * Or unless this is not an option, use the crypto_kx() API instead. - */ -SODIUM_EXPORT -int crypto_scalarmult_ed25519(unsigned char *q, const unsigned char *n, - const unsigned char *p) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_scalarmult_ed25519_noclamp(unsigned char *q, const unsigned char *n, - const unsigned char *p) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_scalarmult_ed25519_base(unsigned char *q, const unsigned char *n) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_scalarmult_ed25519_base_noclamp(unsigned char *q, const unsigned char *n) - __attribute__ ((nonnull)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_scalarmult_ristretto255.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_scalarmult_ristretto255.h deleted file mode 100644 index 40a45cce..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_scalarmult_ristretto255.h +++ /dev/null @@ -1,43 +0,0 @@ - -#ifndef crypto_scalarmult_ristretto255_H -#define crypto_scalarmult_ristretto255_H - -#include - -#include "export.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#define crypto_scalarmult_ristretto255_BYTES 32U -SODIUM_EXPORT -size_t crypto_scalarmult_ristretto255_bytes(void); - -#define crypto_scalarmult_ristretto255_SCALARBYTES 32U -SODIUM_EXPORT -size_t crypto_scalarmult_ristretto255_scalarbytes(void); - -/* - * NOTE: Do not use the result of this function directly for key exchange. - * - * Hash the result with the public keys in order to compute a shared - * secret key: H(q || client_pk || server_pk) - * - * Or unless this is not an option, use the crypto_kx() API instead. - */ -SODIUM_EXPORT -int crypto_scalarmult_ristretto255(unsigned char *q, const unsigned char *n, - const unsigned char *p) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_scalarmult_ristretto255_base(unsigned char *q, - const unsigned char *n) - __attribute__ ((nonnull)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_secretbox.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_secretbox.h deleted file mode 100644 index 68024b45..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_secretbox.h +++ /dev/null @@ -1,94 +0,0 @@ -#ifndef crypto_secretbox_H -#define crypto_secretbox_H - -#include - -#include "crypto_secretbox_xsalsa20poly1305.h" -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -#define crypto_secretbox_KEYBYTES crypto_secretbox_xsalsa20poly1305_KEYBYTES -SODIUM_EXPORT -size_t crypto_secretbox_keybytes(void); - -#define crypto_secretbox_NONCEBYTES crypto_secretbox_xsalsa20poly1305_NONCEBYTES -SODIUM_EXPORT -size_t crypto_secretbox_noncebytes(void); - -#define crypto_secretbox_MACBYTES crypto_secretbox_xsalsa20poly1305_MACBYTES -SODIUM_EXPORT -size_t crypto_secretbox_macbytes(void); - -#define crypto_secretbox_PRIMITIVE "xsalsa20poly1305" -SODIUM_EXPORT -const char *crypto_secretbox_primitive(void); - -#define crypto_secretbox_MESSAGEBYTES_MAX crypto_secretbox_xsalsa20poly1305_MESSAGEBYTES_MAX -SODIUM_EXPORT -size_t crypto_secretbox_messagebytes_max(void); - -SODIUM_EXPORT -int crypto_secretbox_easy(unsigned char *c, const unsigned char *m, - unsigned long long mlen, const unsigned char *n, - const unsigned char *k) __attribute__ ((nonnull(1, 4, 5))); - -SODIUM_EXPORT -int crypto_secretbox_open_easy(unsigned char *m, const unsigned char *c, - unsigned long long clen, const unsigned char *n, - const unsigned char *k) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(2, 4, 5))); - -SODIUM_EXPORT -int crypto_secretbox_detached(unsigned char *c, unsigned char *mac, - const unsigned char *m, - unsigned long long mlen, - const unsigned char *n, - const unsigned char *k) - __attribute__ ((nonnull(1, 2, 5, 6))); - -SODIUM_EXPORT -int crypto_secretbox_open_detached(unsigned char *m, - const unsigned char *c, - const unsigned char *mac, - unsigned long long clen, - const unsigned char *n, - const unsigned char *k) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(2, 3, 5, 6))); - -SODIUM_EXPORT -void crypto_secretbox_keygen(unsigned char k[crypto_secretbox_KEYBYTES]) - __attribute__ ((nonnull)); - -/* -- NaCl compatibility interface ; Requires padding -- */ - -#define crypto_secretbox_ZEROBYTES crypto_secretbox_xsalsa20poly1305_ZEROBYTES -SODIUM_EXPORT -size_t crypto_secretbox_zerobytes(void) __attribute__ ((deprecated)); - -#define crypto_secretbox_BOXZEROBYTES crypto_secretbox_xsalsa20poly1305_BOXZEROBYTES -SODIUM_EXPORT -size_t crypto_secretbox_boxzerobytes(void) __attribute__ ((deprecated)); - -SODIUM_EXPORT -int crypto_secretbox(unsigned char *c, const unsigned char *m, - unsigned long long mlen, const unsigned char *n, - const unsigned char *k) - __attribute__ ((deprecated)) __attribute__ ((nonnull(1, 4, 5))); - -SODIUM_EXPORT -int crypto_secretbox_open(unsigned char *m, const unsigned char *c, - unsigned long long clen, const unsigned char *n, - const unsigned char *k) - __attribute__ ((deprecated)) __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(2, 4, 5))); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_secretbox_xchacha20poly1305.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_secretbox_xchacha20poly1305.h deleted file mode 100644 index 6ec674e3..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_secretbox_xchacha20poly1305.h +++ /dev/null @@ -1,70 +0,0 @@ -#ifndef crypto_secretbox_xchacha20poly1305_H -#define crypto_secretbox_xchacha20poly1305_H - -#include -#include "crypto_stream_xchacha20.h" -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -#define crypto_secretbox_xchacha20poly1305_KEYBYTES 32U -SODIUM_EXPORT -size_t crypto_secretbox_xchacha20poly1305_keybytes(void); - -#define crypto_secretbox_xchacha20poly1305_NONCEBYTES 24U -SODIUM_EXPORT -size_t crypto_secretbox_xchacha20poly1305_noncebytes(void); - -#define crypto_secretbox_xchacha20poly1305_MACBYTES 16U -SODIUM_EXPORT -size_t crypto_secretbox_xchacha20poly1305_macbytes(void); - -#define crypto_secretbox_xchacha20poly1305_MESSAGEBYTES_MAX \ - (crypto_stream_xchacha20_MESSAGEBYTES_MAX - crypto_secretbox_xchacha20poly1305_MACBYTES) -SODIUM_EXPORT -size_t crypto_secretbox_xchacha20poly1305_messagebytes_max(void); - -SODIUM_EXPORT -int crypto_secretbox_xchacha20poly1305_easy(unsigned char *c, - const unsigned char *m, - unsigned long long mlen, - const unsigned char *n, - const unsigned char *k) - __attribute__ ((nonnull(1, 4, 5))); - -SODIUM_EXPORT -int crypto_secretbox_xchacha20poly1305_open_easy(unsigned char *m, - const unsigned char *c, - unsigned long long clen, - const unsigned char *n, - const unsigned char *k) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(2, 4, 5))); - -SODIUM_EXPORT -int crypto_secretbox_xchacha20poly1305_detached(unsigned char *c, - unsigned char *mac, - const unsigned char *m, - unsigned long long mlen, - const unsigned char *n, - const unsigned char *k) - __attribute__ ((nonnull(1, 2, 5, 6))); - -SODIUM_EXPORT -int crypto_secretbox_xchacha20poly1305_open_detached(unsigned char *m, - const unsigned char *c, - const unsigned char *mac, - unsigned long long clen, - const unsigned char *n, - const unsigned char *k) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(2, 3, 5, 6))); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_secretbox_xsalsa20poly1305.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_secretbox_xsalsa20poly1305.h deleted file mode 100644 index 81bff3d6..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_secretbox_xsalsa20poly1305.h +++ /dev/null @@ -1,71 +0,0 @@ -#ifndef crypto_secretbox_xsalsa20poly1305_H -#define crypto_secretbox_xsalsa20poly1305_H - -#include -#include "crypto_stream_xsalsa20.h" -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -#define crypto_secretbox_xsalsa20poly1305_KEYBYTES 32U -SODIUM_EXPORT -size_t crypto_secretbox_xsalsa20poly1305_keybytes(void); - -#define crypto_secretbox_xsalsa20poly1305_NONCEBYTES 24U -SODIUM_EXPORT -size_t crypto_secretbox_xsalsa20poly1305_noncebytes(void); - -#define crypto_secretbox_xsalsa20poly1305_MACBYTES 16U -SODIUM_EXPORT -size_t crypto_secretbox_xsalsa20poly1305_macbytes(void); - -/* Only for the libsodium API - The NaCl compatibility API would require BOXZEROBYTES extra bytes */ -#define crypto_secretbox_xsalsa20poly1305_MESSAGEBYTES_MAX \ - (crypto_stream_xsalsa20_MESSAGEBYTES_MAX - crypto_secretbox_xsalsa20poly1305_MACBYTES) -SODIUM_EXPORT -size_t crypto_secretbox_xsalsa20poly1305_messagebytes_max(void); - -SODIUM_EXPORT -void crypto_secretbox_xsalsa20poly1305_keygen(unsigned char k[crypto_secretbox_xsalsa20poly1305_KEYBYTES]) - __attribute__ ((nonnull)); - -/* -- NaCl compatibility interface ; Requires padding -- */ - -#define crypto_secretbox_xsalsa20poly1305_BOXZEROBYTES 16U -SODIUM_EXPORT -size_t crypto_secretbox_xsalsa20poly1305_boxzerobytes(void) - __attribute__ ((deprecated)); - -#define crypto_secretbox_xsalsa20poly1305_ZEROBYTES \ - (crypto_secretbox_xsalsa20poly1305_BOXZEROBYTES + \ - crypto_secretbox_xsalsa20poly1305_MACBYTES) -SODIUM_EXPORT -size_t crypto_secretbox_xsalsa20poly1305_zerobytes(void) - __attribute__ ((deprecated)); - -SODIUM_EXPORT -int crypto_secretbox_xsalsa20poly1305(unsigned char *c, - const unsigned char *m, - unsigned long long mlen, - const unsigned char *n, - const unsigned char *k) - __attribute__ ((deprecated)) __attribute__ ((nonnull(1, 4, 5))); - -SODIUM_EXPORT -int crypto_secretbox_xsalsa20poly1305_open(unsigned char *m, - const unsigned char *c, - unsigned long long clen, - const unsigned char *n, - const unsigned char *k) - __attribute__ ((deprecated)) __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(2, 4, 5))); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_secretstream_xchacha20poly1305.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_secretstream_xchacha20poly1305.h deleted file mode 100644 index b22e4e93..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_secretstream_xchacha20poly1305.h +++ /dev/null @@ -1,108 +0,0 @@ -#ifndef crypto_secretstream_xchacha20poly1305_H -#define crypto_secretstream_xchacha20poly1305_H - -#include - -#include "crypto_aead_xchacha20poly1305.h" -#include "crypto_stream_chacha20.h" -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -#define crypto_secretstream_xchacha20poly1305_ABYTES \ - (1U + crypto_aead_xchacha20poly1305_ietf_ABYTES) -SODIUM_EXPORT -size_t crypto_secretstream_xchacha20poly1305_abytes(void); - -#define crypto_secretstream_xchacha20poly1305_HEADERBYTES \ - crypto_aead_xchacha20poly1305_ietf_NPUBBYTES -SODIUM_EXPORT -size_t crypto_secretstream_xchacha20poly1305_headerbytes(void); - -#define crypto_secretstream_xchacha20poly1305_KEYBYTES \ - crypto_aead_xchacha20poly1305_ietf_KEYBYTES -SODIUM_EXPORT -size_t crypto_secretstream_xchacha20poly1305_keybytes(void); - -#define crypto_secretstream_xchacha20poly1305_MESSAGEBYTES_MAX \ - SODIUM_MIN(SODIUM_SIZE_MAX - crypto_secretstream_xchacha20poly1305_ABYTES, \ - (64ULL * ((1ULL << 32) - 2ULL))) -SODIUM_EXPORT -size_t crypto_secretstream_xchacha20poly1305_messagebytes_max(void); - -#define crypto_secretstream_xchacha20poly1305_TAG_MESSAGE 0x00 -SODIUM_EXPORT -unsigned char crypto_secretstream_xchacha20poly1305_tag_message(void); - -#define crypto_secretstream_xchacha20poly1305_TAG_PUSH 0x01 -SODIUM_EXPORT -unsigned char crypto_secretstream_xchacha20poly1305_tag_push(void); - -#define crypto_secretstream_xchacha20poly1305_TAG_REKEY 0x02 -SODIUM_EXPORT -unsigned char crypto_secretstream_xchacha20poly1305_tag_rekey(void); - -#define crypto_secretstream_xchacha20poly1305_TAG_FINAL \ - (crypto_secretstream_xchacha20poly1305_TAG_PUSH | \ - crypto_secretstream_xchacha20poly1305_TAG_REKEY) -SODIUM_EXPORT -unsigned char crypto_secretstream_xchacha20poly1305_tag_final(void); - -typedef struct crypto_secretstream_xchacha20poly1305_state { - unsigned char k[crypto_stream_chacha20_ietf_KEYBYTES]; - unsigned char nonce[crypto_stream_chacha20_ietf_NONCEBYTES]; - unsigned char _pad[8]; -} crypto_secretstream_xchacha20poly1305_state; - -SODIUM_EXPORT -size_t crypto_secretstream_xchacha20poly1305_statebytes(void); - -SODIUM_EXPORT -void crypto_secretstream_xchacha20poly1305_keygen - (unsigned char k[crypto_secretstream_xchacha20poly1305_KEYBYTES]) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_secretstream_xchacha20poly1305_init_push - (crypto_secretstream_xchacha20poly1305_state *state, - unsigned char header[crypto_secretstream_xchacha20poly1305_HEADERBYTES], - const unsigned char k[crypto_secretstream_xchacha20poly1305_KEYBYTES]) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_secretstream_xchacha20poly1305_push - (crypto_secretstream_xchacha20poly1305_state *state, - unsigned char *c, unsigned long long *clen_p, - const unsigned char *m, unsigned long long mlen, - const unsigned char *ad, unsigned long long adlen, unsigned char tag) - __attribute__ ((nonnull(1))); - -SODIUM_EXPORT -int crypto_secretstream_xchacha20poly1305_init_pull - (crypto_secretstream_xchacha20poly1305_state *state, - const unsigned char header[crypto_secretstream_xchacha20poly1305_HEADERBYTES], - const unsigned char k[crypto_secretstream_xchacha20poly1305_KEYBYTES]) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_secretstream_xchacha20poly1305_pull - (crypto_secretstream_xchacha20poly1305_state *state, - unsigned char *m, unsigned long long *mlen_p, unsigned char *tag_p, - const unsigned char *c, unsigned long long clen, - const unsigned char *ad, unsigned long long adlen) - __attribute__ ((nonnull(1))); - -SODIUM_EXPORT -void crypto_secretstream_xchacha20poly1305_rekey - (crypto_secretstream_xchacha20poly1305_state *state); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_shorthash.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_shorthash.h deleted file mode 100644 index fecaa88b..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_shorthash.h +++ /dev/null @@ -1,41 +0,0 @@ -#ifndef crypto_shorthash_H -#define crypto_shorthash_H - -#include - -#include "crypto_shorthash_siphash24.h" -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -#define crypto_shorthash_BYTES crypto_shorthash_siphash24_BYTES -SODIUM_EXPORT -size_t crypto_shorthash_bytes(void); - -#define crypto_shorthash_KEYBYTES crypto_shorthash_siphash24_KEYBYTES -SODIUM_EXPORT -size_t crypto_shorthash_keybytes(void); - -#define crypto_shorthash_PRIMITIVE "siphash24" -SODIUM_EXPORT -const char *crypto_shorthash_primitive(void); - -SODIUM_EXPORT -int crypto_shorthash(unsigned char *out, const unsigned char *in, - unsigned long long inlen, const unsigned char *k) - __attribute__ ((nonnull(1, 4))); - -SODIUM_EXPORT -void crypto_shorthash_keygen(unsigned char k[crypto_shorthash_KEYBYTES]) - __attribute__ ((nonnull)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_shorthash_siphash24.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_shorthash_siphash24.h deleted file mode 100644 index 1e6f72a6..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_shorthash_siphash24.h +++ /dev/null @@ -1,50 +0,0 @@ -#ifndef crypto_shorthash_siphash24_H -#define crypto_shorthash_siphash24_H - -#include -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -/* -- 64-bit output -- */ - -#define crypto_shorthash_siphash24_BYTES 8U -SODIUM_EXPORT -size_t crypto_shorthash_siphash24_bytes(void); - -#define crypto_shorthash_siphash24_KEYBYTES 16U -SODIUM_EXPORT -size_t crypto_shorthash_siphash24_keybytes(void); - -SODIUM_EXPORT -int crypto_shorthash_siphash24(unsigned char *out, const unsigned char *in, - unsigned long long inlen, const unsigned char *k) - __attribute__ ((nonnull(1, 4))); - -#ifndef SODIUM_LIBRARY_MINIMAL -/* -- 128-bit output -- */ - -#define crypto_shorthash_siphashx24_BYTES 16U -SODIUM_EXPORT -size_t crypto_shorthash_siphashx24_bytes(void); - -#define crypto_shorthash_siphashx24_KEYBYTES 16U -SODIUM_EXPORT -size_t crypto_shorthash_siphashx24_keybytes(void); - -SODIUM_EXPORT -int crypto_shorthash_siphashx24(unsigned char *out, const unsigned char *in, - unsigned long long inlen, const unsigned char *k) - __attribute__ ((nonnull(1, 4))); -#endif - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_sign.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_sign.h deleted file mode 100644 index f5fafb12..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_sign.h +++ /dev/null @@ -1,107 +0,0 @@ -#ifndef crypto_sign_H -#define crypto_sign_H - -/* - * THREAD SAFETY: crypto_sign_keypair() is thread-safe, - * provided that sodium_init() was called before. - * - * Other functions, including crypto_sign_seed_keypair() are always thread-safe. - */ - -#include - -#include "crypto_sign_ed25519.h" -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -typedef crypto_sign_ed25519ph_state crypto_sign_state; - -SODIUM_EXPORT -size_t crypto_sign_statebytes(void); - -#define crypto_sign_BYTES crypto_sign_ed25519_BYTES -SODIUM_EXPORT -size_t crypto_sign_bytes(void); - -#define crypto_sign_SEEDBYTES crypto_sign_ed25519_SEEDBYTES -SODIUM_EXPORT -size_t crypto_sign_seedbytes(void); - -#define crypto_sign_PUBLICKEYBYTES crypto_sign_ed25519_PUBLICKEYBYTES -SODIUM_EXPORT -size_t crypto_sign_publickeybytes(void); - -#define crypto_sign_SECRETKEYBYTES crypto_sign_ed25519_SECRETKEYBYTES -SODIUM_EXPORT -size_t crypto_sign_secretkeybytes(void); - -#define crypto_sign_MESSAGEBYTES_MAX crypto_sign_ed25519_MESSAGEBYTES_MAX -SODIUM_EXPORT -size_t crypto_sign_messagebytes_max(void); - -#define crypto_sign_PRIMITIVE "ed25519" -SODIUM_EXPORT -const char *crypto_sign_primitive(void); - -SODIUM_EXPORT -int crypto_sign_seed_keypair(unsigned char *pk, unsigned char *sk, - const unsigned char *seed) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_sign_keypair(unsigned char *pk, unsigned char *sk) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_sign(unsigned char *sm, unsigned long long *smlen_p, - const unsigned char *m, unsigned long long mlen, - const unsigned char *sk) __attribute__ ((nonnull(1, 5))); - -SODIUM_EXPORT -int crypto_sign_open(unsigned char *m, unsigned long long *mlen_p, - const unsigned char *sm, unsigned long long smlen, - const unsigned char *pk) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(3, 5))); - -SODIUM_EXPORT -int crypto_sign_detached(unsigned char *sig, unsigned long long *siglen_p, - const unsigned char *m, unsigned long long mlen, - const unsigned char *sk) __attribute__ ((nonnull(1, 5))); - -SODIUM_EXPORT -int crypto_sign_verify_detached(const unsigned char *sig, - const unsigned char *m, - unsigned long long mlen, - const unsigned char *pk) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(1, 4))); - -SODIUM_EXPORT -int crypto_sign_init(crypto_sign_state *state); - -SODIUM_EXPORT -int crypto_sign_update(crypto_sign_state *state, - const unsigned char *m, unsigned long long mlen) - __attribute__ ((nonnull(1))); - -SODIUM_EXPORT -int crypto_sign_final_create(crypto_sign_state *state, unsigned char *sig, - unsigned long long *siglen_p, - const unsigned char *sk) - __attribute__ ((nonnull(1, 2, 4))); - -SODIUM_EXPORT -int crypto_sign_final_verify(crypto_sign_state *state, const unsigned char *sig, - const unsigned char *pk) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_sign_ed25519.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_sign_ed25519.h deleted file mode 100644 index 0fdac42d..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_sign_ed25519.h +++ /dev/null @@ -1,124 +0,0 @@ -#ifndef crypto_sign_ed25519_H -#define crypto_sign_ed25519_H - -#include -#include "crypto_hash_sha512.h" -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -typedef struct crypto_sign_ed25519ph_state { - crypto_hash_sha512_state hs; -} crypto_sign_ed25519ph_state; - -SODIUM_EXPORT -size_t crypto_sign_ed25519ph_statebytes(void); - -#define crypto_sign_ed25519_BYTES 64U -SODIUM_EXPORT -size_t crypto_sign_ed25519_bytes(void); - -#define crypto_sign_ed25519_SEEDBYTES 32U -SODIUM_EXPORT -size_t crypto_sign_ed25519_seedbytes(void); - -#define crypto_sign_ed25519_PUBLICKEYBYTES 32U -SODIUM_EXPORT -size_t crypto_sign_ed25519_publickeybytes(void); - -#define crypto_sign_ed25519_SECRETKEYBYTES (32U + 32U) -SODIUM_EXPORT -size_t crypto_sign_ed25519_secretkeybytes(void); - -#define crypto_sign_ed25519_MESSAGEBYTES_MAX (SODIUM_SIZE_MAX - crypto_sign_ed25519_BYTES) -SODIUM_EXPORT -size_t crypto_sign_ed25519_messagebytes_max(void); - -SODIUM_EXPORT -int crypto_sign_ed25519(unsigned char *sm, unsigned long long *smlen_p, - const unsigned char *m, unsigned long long mlen, - const unsigned char *sk) - __attribute__ ((nonnull(1, 5))); - -SODIUM_EXPORT -int crypto_sign_ed25519_open(unsigned char *m, unsigned long long *mlen_p, - const unsigned char *sm, unsigned long long smlen, - const unsigned char *pk) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(3, 5))); - -SODIUM_EXPORT -int crypto_sign_ed25519_detached(unsigned char *sig, - unsigned long long *siglen_p, - const unsigned char *m, - unsigned long long mlen, - const unsigned char *sk) - __attribute__ ((nonnull(1, 5))); - -SODIUM_EXPORT -int crypto_sign_ed25519_verify_detached(const unsigned char *sig, - const unsigned char *m, - unsigned long long mlen, - const unsigned char *pk) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(1, 4))); - -SODIUM_EXPORT -int crypto_sign_ed25519_keypair(unsigned char *pk, unsigned char *sk) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_sign_ed25519_seed_keypair(unsigned char *pk, unsigned char *sk, - const unsigned char *seed) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_sign_ed25519_pk_to_curve25519(unsigned char *curve25519_pk, - const unsigned char *ed25519_pk) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_sign_ed25519_sk_to_curve25519(unsigned char *curve25519_sk, - const unsigned char *ed25519_sk) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_sign_ed25519_sk_to_seed(unsigned char *seed, - const unsigned char *sk) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_sign_ed25519_sk_to_pk(unsigned char *pk, const unsigned char *sk) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_sign_ed25519ph_init(crypto_sign_ed25519ph_state *state) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_sign_ed25519ph_update(crypto_sign_ed25519ph_state *state, - const unsigned char *m, - unsigned long long mlen) - __attribute__ ((nonnull(1))); - -SODIUM_EXPORT -int crypto_sign_ed25519ph_final_create(crypto_sign_ed25519ph_state *state, - unsigned char *sig, - unsigned long long *siglen_p, - const unsigned char *sk) - __attribute__ ((nonnull(1, 2, 4))); - -SODIUM_EXPORT -int crypto_sign_ed25519ph_final_verify(crypto_sign_ed25519ph_state *state, - const unsigned char *sig, - const unsigned char *pk) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_stream.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_stream.h deleted file mode 100644 index 88dab5f6..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_stream.h +++ /dev/null @@ -1,59 +0,0 @@ -#ifndef crypto_stream_H -#define crypto_stream_H - -/* - * WARNING: This is just a stream cipher. It is NOT authenticated encryption. - * While it provides some protection against eavesdropping, it does NOT - * provide any security against active attacks. - * Unless you know what you're doing, what you are looking for is probably - * the crypto_box functions. - */ - -#include - -#include "crypto_stream_xsalsa20.h" -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -#define crypto_stream_KEYBYTES crypto_stream_xsalsa20_KEYBYTES -SODIUM_EXPORT -size_t crypto_stream_keybytes(void); - -#define crypto_stream_NONCEBYTES crypto_stream_xsalsa20_NONCEBYTES -SODIUM_EXPORT -size_t crypto_stream_noncebytes(void); - -#define crypto_stream_MESSAGEBYTES_MAX crypto_stream_xsalsa20_MESSAGEBYTES_MAX -SODIUM_EXPORT -size_t crypto_stream_messagebytes_max(void); - -#define crypto_stream_PRIMITIVE "xsalsa20" -SODIUM_EXPORT -const char *crypto_stream_primitive(void); - -SODIUM_EXPORT -int crypto_stream(unsigned char *c, unsigned long long clen, - const unsigned char *n, const unsigned char *k) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_stream_xor(unsigned char *c, const unsigned char *m, - unsigned long long mlen, const unsigned char *n, - const unsigned char *k) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -void crypto_stream_keygen(unsigned char k[crypto_stream_KEYBYTES]) - __attribute__ ((nonnull)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_stream_chacha20.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_stream_chacha20.h deleted file mode 100644 index 40889755..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_stream_chacha20.h +++ /dev/null @@ -1,106 +0,0 @@ -#ifndef crypto_stream_chacha20_H -#define crypto_stream_chacha20_H - -/* - * WARNING: This is just a stream cipher. It is NOT authenticated encryption. - * While it provides some protection against eavesdropping, it does NOT - * provide any security against active attacks. - * Unless you know what you're doing, what you are looking for is probably - * the crypto_box functions. - */ - -#include -#include -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -#define crypto_stream_chacha20_KEYBYTES 32U -SODIUM_EXPORT -size_t crypto_stream_chacha20_keybytes(void); - -#define crypto_stream_chacha20_NONCEBYTES 8U -SODIUM_EXPORT -size_t crypto_stream_chacha20_noncebytes(void); - -#define crypto_stream_chacha20_MESSAGEBYTES_MAX SODIUM_SIZE_MAX -SODIUM_EXPORT -size_t crypto_stream_chacha20_messagebytes_max(void); - -/* ChaCha20 with a 64-bit nonce and a 64-bit counter, as originally designed */ - -SODIUM_EXPORT -int crypto_stream_chacha20(unsigned char *c, unsigned long long clen, - const unsigned char *n, const unsigned char *k) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_stream_chacha20_xor(unsigned char *c, const unsigned char *m, - unsigned long long mlen, const unsigned char *n, - const unsigned char *k) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_stream_chacha20_xor_ic(unsigned char *c, const unsigned char *m, - unsigned long long mlen, - const unsigned char *n, uint64_t ic, - const unsigned char *k) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -void crypto_stream_chacha20_keygen(unsigned char k[crypto_stream_chacha20_KEYBYTES]) - __attribute__ ((nonnull)); - -/* ChaCha20 with a 96-bit nonce and a 32-bit counter (IETF) */ - -#define crypto_stream_chacha20_ietf_KEYBYTES 32U -SODIUM_EXPORT -size_t crypto_stream_chacha20_ietf_keybytes(void); - -#define crypto_stream_chacha20_ietf_NONCEBYTES 12U -SODIUM_EXPORT -size_t crypto_stream_chacha20_ietf_noncebytes(void); - -#define crypto_stream_chacha20_ietf_MESSAGEBYTES_MAX \ - SODIUM_MIN(SODIUM_SIZE_MAX, 64ULL * (1ULL << 32)) -SODIUM_EXPORT -size_t crypto_stream_chacha20_ietf_messagebytes_max(void); - -SODIUM_EXPORT -int crypto_stream_chacha20_ietf(unsigned char *c, unsigned long long clen, - const unsigned char *n, const unsigned char *k) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_stream_chacha20_ietf_xor(unsigned char *c, const unsigned char *m, - unsigned long long mlen, const unsigned char *n, - const unsigned char *k) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_stream_chacha20_ietf_xor_ic(unsigned char *c, const unsigned char *m, - unsigned long long mlen, - const unsigned char *n, uint32_t ic, - const unsigned char *k) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -void crypto_stream_chacha20_ietf_keygen(unsigned char k[crypto_stream_chacha20_ietf_KEYBYTES]) - __attribute__ ((nonnull)); - -/* Aliases */ - -#define crypto_stream_chacha20_IETF_KEYBYTES crypto_stream_chacha20_ietf_KEYBYTES -#define crypto_stream_chacha20_IETF_NONCEBYTES crypto_stream_chacha20_ietf_NONCEBYTES -#define crypto_stream_chacha20_IETF_MESSAGEBYTES_MAX crypto_stream_chacha20_ietf_MESSAGEBYTES_MAX - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_stream_salsa20.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_stream_salsa20.h deleted file mode 100644 index 45b3b3e3..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_stream_salsa20.h +++ /dev/null @@ -1,61 +0,0 @@ -#ifndef crypto_stream_salsa20_H -#define crypto_stream_salsa20_H - -/* - * WARNING: This is just a stream cipher. It is NOT authenticated encryption. - * While it provides some protection against eavesdropping, it does NOT - * provide any security against active attacks. - * Unless you know what you're doing, what you are looking for is probably - * the crypto_box functions. - */ - -#include -#include -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -#define crypto_stream_salsa20_KEYBYTES 32U -SODIUM_EXPORT -size_t crypto_stream_salsa20_keybytes(void); - -#define crypto_stream_salsa20_NONCEBYTES 8U -SODIUM_EXPORT -size_t crypto_stream_salsa20_noncebytes(void); - -#define crypto_stream_salsa20_MESSAGEBYTES_MAX SODIUM_SIZE_MAX -SODIUM_EXPORT -size_t crypto_stream_salsa20_messagebytes_max(void); - -SODIUM_EXPORT -int crypto_stream_salsa20(unsigned char *c, unsigned long long clen, - const unsigned char *n, const unsigned char *k) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_stream_salsa20_xor(unsigned char *c, const unsigned char *m, - unsigned long long mlen, const unsigned char *n, - const unsigned char *k) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_stream_salsa20_xor_ic(unsigned char *c, const unsigned char *m, - unsigned long long mlen, - const unsigned char *n, uint64_t ic, - const unsigned char *k) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -void crypto_stream_salsa20_keygen(unsigned char k[crypto_stream_salsa20_KEYBYTES]) - __attribute__ ((nonnull)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_stream_salsa2012.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_stream_salsa2012.h deleted file mode 100644 index 6c5d303c..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_stream_salsa2012.h +++ /dev/null @@ -1,53 +0,0 @@ -#ifndef crypto_stream_salsa2012_H -#define crypto_stream_salsa2012_H - -/* - * WARNING: This is just a stream cipher. It is NOT authenticated encryption. - * While it provides some protection against eavesdropping, it does NOT - * provide any security against active attacks. - * Unless you know what you're doing, what you are looking for is probably - * the crypto_box functions. - */ - -#include -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -#define crypto_stream_salsa2012_KEYBYTES 32U -SODIUM_EXPORT -size_t crypto_stream_salsa2012_keybytes(void); - -#define crypto_stream_salsa2012_NONCEBYTES 8U -SODIUM_EXPORT -size_t crypto_stream_salsa2012_noncebytes(void); - -#define crypto_stream_salsa2012_MESSAGEBYTES_MAX SODIUM_SIZE_MAX -SODIUM_EXPORT -size_t crypto_stream_salsa2012_messagebytes_max(void); - -SODIUM_EXPORT -int crypto_stream_salsa2012(unsigned char *c, unsigned long long clen, - const unsigned char *n, const unsigned char *k) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_stream_salsa2012_xor(unsigned char *c, const unsigned char *m, - unsigned long long mlen, const unsigned char *n, - const unsigned char *k) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -void crypto_stream_salsa2012_keygen(unsigned char k[crypto_stream_salsa2012_KEYBYTES]) - __attribute__ ((nonnull)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_stream_salsa208.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_stream_salsa208.h deleted file mode 100644 index d574f304..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_stream_salsa208.h +++ /dev/null @@ -1,56 +0,0 @@ -#ifndef crypto_stream_salsa208_H -#define crypto_stream_salsa208_H - -/* - * WARNING: This is just a stream cipher. It is NOT authenticated encryption. - * While it provides some protection against eavesdropping, it does NOT - * provide any security against active attacks. - * Unless you know what you're doing, what you are looking for is probably - * the crypto_box functions. - */ - -#include -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -#define crypto_stream_salsa208_KEYBYTES 32U -SODIUM_EXPORT -size_t crypto_stream_salsa208_keybytes(void) - __attribute__ ((deprecated)); - -#define crypto_stream_salsa208_NONCEBYTES 8U -SODIUM_EXPORT -size_t crypto_stream_salsa208_noncebytes(void) - __attribute__ ((deprecated)); - -#define crypto_stream_salsa208_MESSAGEBYTES_MAX SODIUM_SIZE_MAX - SODIUM_EXPORT -size_t crypto_stream_salsa208_messagebytes_max(void) - __attribute__ ((deprecated)); - -SODIUM_EXPORT -int crypto_stream_salsa208(unsigned char *c, unsigned long long clen, - const unsigned char *n, const unsigned char *k) - __attribute__ ((deprecated)) __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_stream_salsa208_xor(unsigned char *c, const unsigned char *m, - unsigned long long mlen, const unsigned char *n, - const unsigned char *k) - __attribute__ ((deprecated)) __attribute__ ((nonnull)); - -SODIUM_EXPORT -void crypto_stream_salsa208_keygen(unsigned char k[crypto_stream_salsa208_KEYBYTES]) - __attribute__ ((deprecated)) __attribute__ ((nonnull)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_stream_xchacha20.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_stream_xchacha20.h deleted file mode 100644 index c4002db0..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_stream_xchacha20.h +++ /dev/null @@ -1,61 +0,0 @@ -#ifndef crypto_stream_xchacha20_H -#define crypto_stream_xchacha20_H - -/* - * WARNING: This is just a stream cipher. It is NOT authenticated encryption. - * While it provides some protection against eavesdropping, it does NOT - * provide any security against active attacks. - * Unless you know what you're doing, what you are looking for is probably - * the crypto_box functions. - */ - -#include -#include -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -#define crypto_stream_xchacha20_KEYBYTES 32U -SODIUM_EXPORT -size_t crypto_stream_xchacha20_keybytes(void); - -#define crypto_stream_xchacha20_NONCEBYTES 24U -SODIUM_EXPORT -size_t crypto_stream_xchacha20_noncebytes(void); - -#define crypto_stream_xchacha20_MESSAGEBYTES_MAX SODIUM_SIZE_MAX -SODIUM_EXPORT -size_t crypto_stream_xchacha20_messagebytes_max(void); - -SODIUM_EXPORT -int crypto_stream_xchacha20(unsigned char *c, unsigned long long clen, - const unsigned char *n, const unsigned char *k) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_stream_xchacha20_xor(unsigned char *c, const unsigned char *m, - unsigned long long mlen, const unsigned char *n, - const unsigned char *k) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_stream_xchacha20_xor_ic(unsigned char *c, const unsigned char *m, - unsigned long long mlen, - const unsigned char *n, uint64_t ic, - const unsigned char *k) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -void crypto_stream_xchacha20_keygen(unsigned char k[crypto_stream_xchacha20_KEYBYTES]) - __attribute__ ((nonnull)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_stream_xsalsa20.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_stream_xsalsa20.h deleted file mode 100644 index 20034e34..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_stream_xsalsa20.h +++ /dev/null @@ -1,61 +0,0 @@ -#ifndef crypto_stream_xsalsa20_H -#define crypto_stream_xsalsa20_H - -/* - * WARNING: This is just a stream cipher. It is NOT authenticated encryption. - * While it provides some protection against eavesdropping, it does NOT - * provide any security against active attacks. - * Unless you know what you're doing, what you are looking for is probably - * the crypto_box functions. - */ - -#include -#include -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -#define crypto_stream_xsalsa20_KEYBYTES 32U -SODIUM_EXPORT -size_t crypto_stream_xsalsa20_keybytes(void); - -#define crypto_stream_xsalsa20_NONCEBYTES 24U -SODIUM_EXPORT -size_t crypto_stream_xsalsa20_noncebytes(void); - -#define crypto_stream_xsalsa20_MESSAGEBYTES_MAX SODIUM_SIZE_MAX -SODIUM_EXPORT -size_t crypto_stream_xsalsa20_messagebytes_max(void); - -SODIUM_EXPORT -int crypto_stream_xsalsa20(unsigned char *c, unsigned long long clen, - const unsigned char *n, const unsigned char *k) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_stream_xsalsa20_xor(unsigned char *c, const unsigned char *m, - unsigned long long mlen, const unsigned char *n, - const unsigned char *k) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_stream_xsalsa20_xor_ic(unsigned char *c, const unsigned char *m, - unsigned long long mlen, - const unsigned char *n, uint64_t ic, - const unsigned char *k) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -void crypto_stream_xsalsa20_keygen(unsigned char k[crypto_stream_xsalsa20_KEYBYTES]) - __attribute__ ((nonnull)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_verify_16.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_verify_16.h deleted file mode 100644 index 7b9c8077..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_verify_16.h +++ /dev/null @@ -1,23 +0,0 @@ -#ifndef crypto_verify_16_H -#define crypto_verify_16_H - -#include -#include "export.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#define crypto_verify_16_BYTES 16U -SODIUM_EXPORT -size_t crypto_verify_16_bytes(void); - -SODIUM_EXPORT -int crypto_verify_16(const unsigned char *x, const unsigned char *y) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_verify_32.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_verify_32.h deleted file mode 100644 index 9b0f4529..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_verify_32.h +++ /dev/null @@ -1,23 +0,0 @@ -#ifndef crypto_verify_32_H -#define crypto_verify_32_H - -#include -#include "export.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#define crypto_verify_32_BYTES 32U -SODIUM_EXPORT -size_t crypto_verify_32_bytes(void); - -SODIUM_EXPORT -int crypto_verify_32(const unsigned char *x, const unsigned char *y) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_verify_64.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_verify_64.h deleted file mode 100644 index c83b7302..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/crypto_verify_64.h +++ /dev/null @@ -1,23 +0,0 @@ -#ifndef crypto_verify_64_H -#define crypto_verify_64_H - -#include -#include "export.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#define crypto_verify_64_BYTES 64U -SODIUM_EXPORT -size_t crypto_verify_64_bytes(void); - -SODIUM_EXPORT -int crypto_verify_64(const unsigned char *x, const unsigned char *y) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/export.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/export.h deleted file mode 100644 index a0074fc9..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/export.h +++ /dev/null @@ -1,57 +0,0 @@ - -#ifndef sodium_export_H -#define sodium_export_H - -#include -#include -#include - -#if !defined(__clang__) && !defined(__GNUC__) -# ifdef __attribute__ -# undef __attribute__ -# endif -# define __attribute__(a) -#endif - -#ifdef SODIUM_STATIC -# define SODIUM_EXPORT -# define SODIUM_EXPORT_WEAK -#else -# if defined(_MSC_VER) -# ifdef SODIUM_DLL_EXPORT -# define SODIUM_EXPORT __declspec(dllexport) -# else -# define SODIUM_EXPORT __declspec(dllimport) -# endif -# else -# if defined(__SUNPRO_C) -# ifndef __GNU_C__ -# define SODIUM_EXPORT __attribute__ (visibility(__global)) -# else -# define SODIUM_EXPORT __attribute__ __global -# endif -# elif defined(_MSG_VER) -# define SODIUM_EXPORT extern __declspec(dllexport) -# else -# define SODIUM_EXPORT __attribute__ ((visibility ("default"))) -# endif -# endif -# if defined(__ELF__) && !defined(SODIUM_DISABLE_WEAK_FUNCTIONS) -# define SODIUM_EXPORT_WEAK SODIUM_EXPORT __attribute__((weak)) -# else -# define SODIUM_EXPORT_WEAK SODIUM_EXPORT -# endif -#endif - -#ifndef CRYPTO_ALIGN -# if defined(__INTEL_COMPILER) || defined(_MSC_VER) -# define CRYPTO_ALIGN(x) __declspec(align(x)) -# else -# define CRYPTO_ALIGN(x) __attribute__ ((aligned(x))) -# endif -#endif - -#define SODIUM_MIN(A, B) ((A) < (B) ? (A) : (B)) -#define SODIUM_SIZE_MAX SODIUM_MIN(UINT64_MAX, SIZE_MAX) - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/randombytes.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/randombytes.h deleted file mode 100644 index c83a4df5..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/randombytes.h +++ /dev/null @@ -1,72 +0,0 @@ - -#ifndef randombytes_H -#define randombytes_H - -#include -#include - -#include - -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -typedef struct randombytes_implementation { - const char *(*implementation_name)(void); /* required */ - uint32_t (*random)(void); /* required */ - void (*stir)(void); /* optional */ - uint32_t (*uniform)(const uint32_t upper_bound); /* optional, a default implementation will be used if NULL */ - void (*buf)(void * const buf, const size_t size); /* required */ - int (*close)(void); /* optional */ -} randombytes_implementation; - -#define randombytes_BYTES_MAX SODIUM_MIN(SODIUM_SIZE_MAX, 0xffffffffUL) - -#define randombytes_SEEDBYTES 32U -SODIUM_EXPORT -size_t randombytes_seedbytes(void); - -SODIUM_EXPORT -void randombytes_buf(void * const buf, const size_t size) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -void randombytes_buf_deterministic(void * const buf, const size_t size, - const unsigned char seed[randombytes_SEEDBYTES]) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -uint32_t randombytes_random(void); - -SODIUM_EXPORT -uint32_t randombytes_uniform(const uint32_t upper_bound); - -SODIUM_EXPORT -void randombytes_stir(void); - -SODIUM_EXPORT -int randombytes_close(void); - -SODIUM_EXPORT -int randombytes_set_implementation(const randombytes_implementation *impl) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -const char *randombytes_implementation_name(void); - -/* -- NaCl compatibility interface -- */ - -SODIUM_EXPORT -void randombytes(unsigned char * const buf, const unsigned long long buf_len) - __attribute__ ((nonnull)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/randombytes_internal_random.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/randombytes_internal_random.h deleted file mode 100644 index 2b2b7d6e..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/randombytes_internal_random.h +++ /dev/null @@ -1,22 +0,0 @@ - -#ifndef randombytes_internal_random_H -#define randombytes_internal_random_H - -#include "export.h" -#include "randombytes.h" - -#ifdef __cplusplus -extern "C" { -#endif - -SODIUM_EXPORT -extern struct randombytes_implementation randombytes_internal_implementation; - -/* Backwards compatibility with libsodium < 1.0.18 */ -#define randombytes_salsa20_implementation randombytes_internal_implementation - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/randombytes_sysrandom.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/randombytes_sysrandom.h deleted file mode 100644 index 9e27b674..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/randombytes_sysrandom.h +++ /dev/null @@ -1,19 +0,0 @@ - -#ifndef randombytes_sysrandom_H -#define randombytes_sysrandom_H - -#include "export.h" -#include "randombytes.h" - -#ifdef __cplusplus -extern "C" { -#endif - -SODIUM_EXPORT -extern struct randombytes_implementation randombytes_sysrandom_implementation; - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/runtime.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/runtime.h deleted file mode 100644 index c1cec853..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/runtime.h +++ /dev/null @@ -1,55 +0,0 @@ - -#ifndef sodium_runtime_H -#define sodium_runtime_H - -#include "export.h" - -#ifdef __cplusplus -extern "C" { -#endif - -SODIUM_EXPORT_WEAK -int sodium_runtime_has_neon(void); - -SODIUM_EXPORT_WEAK -int sodium_runtime_has_armcrypto(void); - -SODIUM_EXPORT_WEAK -int sodium_runtime_has_sse2(void); - -SODIUM_EXPORT_WEAK -int sodium_runtime_has_sse3(void); - -SODIUM_EXPORT_WEAK -int sodium_runtime_has_ssse3(void); - -SODIUM_EXPORT_WEAK -int sodium_runtime_has_sse41(void); - -SODIUM_EXPORT_WEAK -int sodium_runtime_has_avx(void); - -SODIUM_EXPORT_WEAK -int sodium_runtime_has_avx2(void); - -SODIUM_EXPORT_WEAK -int sodium_runtime_has_avx512f(void); - -SODIUM_EXPORT_WEAK -int sodium_runtime_has_pclmul(void); - -SODIUM_EXPORT_WEAK -int sodium_runtime_has_aesni(void); - -SODIUM_EXPORT_WEAK -int sodium_runtime_has_rdrand(void); - -/* ------------------------------------------------------------------------- */ - -int _sodium_runtime_get_cpu_features(void); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/utils.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/utils.h deleted file mode 100644 index f9b36979..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/utils.h +++ /dev/null @@ -1,179 +0,0 @@ - -#ifndef sodium_utils_H -#define sodium_utils_H - -#include - -#include "export.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#ifndef SODIUM_C99 -# if defined(__cplusplus) || !defined(__STDC_VERSION__) || __STDC_VERSION__ < 199901L -# define SODIUM_C99(X) -# else -# define SODIUM_C99(X) X -# endif -#endif - -SODIUM_EXPORT -void sodium_memzero(void * const pnt, const size_t len); - -SODIUM_EXPORT -void sodium_stackzero(const size_t len); - -/* - * WARNING: sodium_memcmp() must be used to verify if two secret keys - * are equal, in constant time. - * It returns 0 if the keys are equal, and -1 if they differ. - * This function is not designed for lexicographical comparisons. - */ -SODIUM_EXPORT -int sodium_memcmp(const void * const b1_, const void * const b2_, size_t len) - __attribute__ ((warn_unused_result)); - -/* - * sodium_compare() returns -1 if b1_ < b2_, 1 if b1_ > b2_ and 0 if b1_ == b2_ - * It is suitable for lexicographical comparisons, or to compare nonces - * and counters stored in little-endian format. - * However, it is slower than sodium_memcmp(). - */ -SODIUM_EXPORT -int sodium_compare(const unsigned char *b1_, const unsigned char *b2_, - size_t len) __attribute__ ((warn_unused_result)); - -SODIUM_EXPORT -int sodium_is_zero(const unsigned char *n, const size_t nlen); - -SODIUM_EXPORT -void sodium_increment(unsigned char *n, const size_t nlen); - -SODIUM_EXPORT -void sodium_add(unsigned char *a, const unsigned char *b, const size_t len); - -SODIUM_EXPORT -void sodium_sub(unsigned char *a, const unsigned char *b, const size_t len); - -SODIUM_EXPORT -char *sodium_bin2hex(char * const hex, const size_t hex_maxlen, - const unsigned char * const bin, const size_t bin_len) - __attribute__ ((nonnull(1))); - -SODIUM_EXPORT -int sodium_hex2bin(unsigned char * const bin, const size_t bin_maxlen, - const char * const hex, const size_t hex_len, - const char * const ignore, size_t * const bin_len, - const char ** const hex_end) - __attribute__ ((nonnull(1))); - -#define sodium_base64_VARIANT_ORIGINAL 1 -#define sodium_base64_VARIANT_ORIGINAL_NO_PADDING 3 -#define sodium_base64_VARIANT_URLSAFE 5 -#define sodium_base64_VARIANT_URLSAFE_NO_PADDING 7 - -/* - * Computes the required length to encode BIN_LEN bytes as a base64 string - * using the given variant. The computed length includes a trailing \0. - */ -#define sodium_base64_ENCODED_LEN(BIN_LEN, VARIANT) \ - (((BIN_LEN) / 3U) * 4U + \ - ((((BIN_LEN) - ((BIN_LEN) / 3U) * 3U) | (((BIN_LEN) - ((BIN_LEN) / 3U) * 3U) >> 1)) & 1U) * \ - (4U - (~((((VARIANT) & 2U) >> 1) - 1U) & (3U - ((BIN_LEN) - ((BIN_LEN) / 3U) * 3U)))) + 1U) - -SODIUM_EXPORT -size_t sodium_base64_encoded_len(const size_t bin_len, const int variant); - -SODIUM_EXPORT -char *sodium_bin2base64(char * const b64, const size_t b64_maxlen, - const unsigned char * const bin, const size_t bin_len, - const int variant) __attribute__ ((nonnull(1))); - -SODIUM_EXPORT -int sodium_base642bin(unsigned char * const bin, const size_t bin_maxlen, - const char * const b64, const size_t b64_len, - const char * const ignore, size_t * const bin_len, - const char ** const b64_end, const int variant) - __attribute__ ((nonnull(1))); - -SODIUM_EXPORT -int sodium_mlock(void * const addr, const size_t len) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int sodium_munlock(void * const addr, const size_t len) - __attribute__ ((nonnull)); - -/* WARNING: sodium_malloc() and sodium_allocarray() are not general-purpose - * allocation functions. - * - * They return a pointer to a region filled with 0xd0 bytes, immediately - * followed by a guard page. - * As a result, accessing a single byte after the requested allocation size - * will intentionally trigger a segmentation fault. - * - * A canary and an additional guard page placed before the beginning of the - * region may also kill the process if a buffer underflow is detected. - * - * The memory layout is: - * [unprotected region size (read only)][guard page (no access)][unprotected pages (read/write)][guard page (no access)] - * With the layout of the unprotected pages being: - * [optional padding][16-bytes canary][user region] - * - * However: - * - These functions are significantly slower than standard functions - * - Each allocation requires 3 or 4 additional pages - * - The returned address will not be aligned if the allocation size is not - * a multiple of the required alignment. For this reason, these functions - * are designed to store data, such as secret keys and messages. - * - * sodium_malloc() can be used to allocate any libsodium data structure. - * - * The crypto_generichash_state structure is packed and its length is - * either 357 or 361 bytes. For this reason, when using sodium_malloc() to - * allocate a crypto_generichash_state structure, padding must be added in - * order to ensure proper alignment. crypto_generichash_statebytes() - * returns the rounded up structure size, and should be preferred to sizeof(): - * state = sodium_malloc(crypto_generichash_statebytes()); - */ - -SODIUM_EXPORT -void *sodium_malloc(const size_t size) - __attribute__ ((malloc)); - -SODIUM_EXPORT -void *sodium_allocarray(size_t count, size_t size) - __attribute__ ((malloc)); - -SODIUM_EXPORT -void sodium_free(void *ptr); - -SODIUM_EXPORT -int sodium_mprotect_noaccess(void *ptr) __attribute__ ((nonnull)); - -SODIUM_EXPORT -int sodium_mprotect_readonly(void *ptr) __attribute__ ((nonnull)); - -SODIUM_EXPORT -int sodium_mprotect_readwrite(void *ptr) __attribute__ ((nonnull)); - -SODIUM_EXPORT -int sodium_pad(size_t *padded_buflen_p, unsigned char *buf, - size_t unpadded_buflen, size_t blocksize, size_t max_buflen) - __attribute__ ((nonnull(2))); - -SODIUM_EXPORT -int sodium_unpad(size_t *unpadded_buflen_p, const unsigned char *buf, - size_t padded_buflen, size_t blocksize) - __attribute__ ((nonnull(2))); - -/* -------- */ - -int _sodium_alloc_init(void); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/version.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/version.h deleted file mode 100644 index cc60e448..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/include/sodium/version.h +++ /dev/null @@ -1,33 +0,0 @@ - -#ifndef sodium_version_H -#define sodium_version_H - -#include "export.h" - -#define SODIUM_VERSION_STRING "1.0.18" - -#define SODIUM_LIBRARY_VERSION_MAJOR 11 -#define SODIUM_LIBRARY_VERSION_MINOR 0 -#define SODIUM_LIBRARY_MINIMAL 1 - -#ifdef __cplusplus -extern "C" { -#endif - -SODIUM_EXPORT -const char *sodium_version_string(void); - -SODIUM_EXPORT -int sodium_library_version_major(void); - -SODIUM_EXPORT -int sodium_library_version_minor(void); - -SODIUM_EXPORT -int sodium_library_minimal(void); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/module.modulemap b/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/module.modulemap deleted file mode 100644 index d5e34df3..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/module.modulemap +++ /dev/null @@ -1,4 +0,0 @@ -module Clibsodium { - header "sodium.h" - export * -} diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium.h deleted file mode 100644 index 610d6328..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium.h +++ /dev/null @@ -1,73 +0,0 @@ - -#ifndef sodium_H -#define sodium_H - -#include "sodium/version.h" - -#include "sodium/core.h" -#include "sodium/crypto_aead_aes256gcm.h" -#include "sodium/crypto_aead_aegis128l.h" -#include "sodium/crypto_aead_aegis256.h" -#include "sodium/crypto_aead_chacha20poly1305.h" -#include "sodium/crypto_aead_xchacha20poly1305.h" -#include "sodium/crypto_auth.h" -#include "sodium/crypto_auth_hmacsha256.h" -#include "sodium/crypto_auth_hmacsha512.h" -#include "sodium/crypto_auth_hmacsha512256.h" -#include "sodium/crypto_box.h" -#include "sodium/crypto_box_curve25519xsalsa20poly1305.h" -#include "sodium/crypto_core_hsalsa20.h" -#include "sodium/crypto_core_hchacha20.h" -#include "sodium/crypto_core_salsa20.h" -#include "sodium/crypto_core_salsa2012.h" -#include "sodium/crypto_core_salsa208.h" -#include "sodium/crypto_generichash.h" -#include "sodium/crypto_generichash_blake2b.h" -#include "sodium/crypto_hash.h" -#include "sodium/crypto_hash_sha256.h" -#include "sodium/crypto_hash_sha512.h" -#include "sodium/crypto_kdf.h" -#include "sodium/crypto_kdf_blake2b.h" -#include "sodium/crypto_kx.h" -#include "sodium/crypto_onetimeauth.h" -#include "sodium/crypto_onetimeauth_poly1305.h" -#include "sodium/crypto_pwhash.h" -#include "sodium/crypto_pwhash_argon2i.h" -#include "sodium/crypto_scalarmult.h" -#include "sodium/crypto_scalarmult_curve25519.h" -#include "sodium/crypto_secretbox.h" -#include "sodium/crypto_secretbox_xsalsa20poly1305.h" -#include "sodium/crypto_secretstream_xchacha20poly1305.h" -#include "sodium/crypto_shorthash.h" -#include "sodium/crypto_shorthash_siphash24.h" -#include "sodium/crypto_sign.h" -#include "sodium/crypto_sign_ed25519.h" -#include "sodium/crypto_stream.h" -#include "sodium/crypto_stream_chacha20.h" -#include "sodium/crypto_stream_salsa20.h" -#include "sodium/crypto_stream_xsalsa20.h" -#include "sodium/crypto_verify_16.h" -#include "sodium/crypto_verify_32.h" -#include "sodium/crypto_verify_64.h" -#include "sodium/randombytes.h" -#include "sodium/randombytes_internal_random.h" -#include "sodium/randombytes_sysrandom.h" -#include "sodium/runtime.h" -#include "sodium/utils.h" - -#ifndef SODIUM_LIBRARY_MINIMAL -# include "sodium/crypto_box_curve25519xchacha20poly1305.h" -# include "sodium/crypto_core_ed25519.h" -# include "sodium/crypto_core_ristretto255.h" -# include "sodium/crypto_kdf_hkdf_sha256.h" -# include "sodium/crypto_kdf_hkdf_sha512.h" -# include "sodium/crypto_scalarmult_ed25519.h" -# include "sodium/crypto_scalarmult_ristretto255.h" -# include "sodium/crypto_secretbox_xchacha20poly1305.h" -# include "sodium/crypto_pwhash_scryptsalsa208sha256.h" -# include "sodium/crypto_stream_salsa2012.h" -# include "sodium/crypto_stream_salsa208.h" -# include "sodium/crypto_stream_xchacha20.h" -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/core.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/core.h deleted file mode 100644 index dd088d2c..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/core.h +++ /dev/null @@ -1,28 +0,0 @@ - -#ifndef sodium_core_H -#define sodium_core_H - -#include "export.h" - -#ifdef __cplusplus -extern "C" { -#endif - -SODIUM_EXPORT -int sodium_init(void) - __attribute__ ((warn_unused_result)); - -/* ---- */ - -SODIUM_EXPORT -int sodium_set_misuse_handler(void (*handler)(void)); - -SODIUM_EXPORT -void sodium_misuse(void) - __attribute__ ((noreturn)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_aead_aegis128l.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_aead_aegis128l.h deleted file mode 100644 index ed8d2f2b..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_aead_aegis128l.h +++ /dev/null @@ -1,96 +0,0 @@ -#ifndef crypto_aead_aegis128l_H -#define crypto_aead_aegis128l_H - -#include -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -SODIUM_EXPORT -int crypto_aead_aegis128l_is_available(void); - -#define crypto_aead_aegis128l_KEYBYTES 16U -SODIUM_EXPORT -size_t crypto_aead_aegis128l_keybytes(void); - -#define crypto_aead_aegis128l_NSECBYTES 0U -SODIUM_EXPORT -size_t crypto_aead_aegis128l_nsecbytes(void); - -#define crypto_aead_aegis128l_NPUBBYTES 16U -SODIUM_EXPORT -size_t crypto_aead_aegis128l_npubbytes(void); - -#define crypto_aead_aegis128l_ABYTES 16U -SODIUM_EXPORT -size_t crypto_aead_aegis128l_abytes(void); - -#define crypto_aead_aegis128l_MESSAGEBYTES_MAX \ - SODIUM_MIN(SODIUM_SIZE_MAX - crypto_aead_aegis128l_ABYTES, \ - (1ULL << 61) - 1) -SODIUM_EXPORT -size_t crypto_aead_aegis128l_messagebytes_max(void); - -SODIUM_EXPORT -int crypto_aead_aegis128l_encrypt(unsigned char *c, - unsigned long long *clen_p, - const unsigned char *m, - unsigned long long mlen, - const unsigned char *ad, - unsigned long long adlen, - const unsigned char *nsec, - const unsigned char *npub, - const unsigned char *k) - __attribute__ ((nonnull(1, 8, 9))); - -SODIUM_EXPORT -int crypto_aead_aegis128l_decrypt(unsigned char *m, - unsigned long long *mlen_p, - unsigned char *nsec, - const unsigned char *c, - unsigned long long clen, - const unsigned char *ad, - unsigned long long adlen, - const unsigned char *npub, - const unsigned char *k) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(4, 8, 9))); - -SODIUM_EXPORT -int crypto_aead_aegis128l_encrypt_detached(unsigned char *c, - unsigned char *mac, - unsigned long long *maclen_p, - const unsigned char *m, - unsigned long long mlen, - const unsigned char *ad, - unsigned long long adlen, - const unsigned char *nsec, - const unsigned char *npub, - const unsigned char *k) - __attribute__ ((nonnull(1, 2, 9, 10))); - -SODIUM_EXPORT -int crypto_aead_aegis128l_decrypt_detached(unsigned char *m, - unsigned char *nsec, - const unsigned char *c, - unsigned long long clen, - const unsigned char *mac, - const unsigned char *ad, - unsigned long long adlen, - const unsigned char *npub, - const unsigned char *k) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(3, 5, 8, 9))); - -SODIUM_EXPORT -void crypto_aead_aegis128l_keygen(unsigned char k[crypto_aead_aegis128l_KEYBYTES]) - __attribute__ ((nonnull)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_aead_aegis256.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_aead_aegis256.h deleted file mode 100644 index 32e76896..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_aead_aegis256.h +++ /dev/null @@ -1,96 +0,0 @@ -#ifndef crypto_aead_aegis256_H -#define crypto_aead_aegis256_H - -#include -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -SODIUM_EXPORT -int crypto_aead_aegis256_is_available(void); - -#define crypto_aead_aegis256_KEYBYTES 32U -SODIUM_EXPORT -size_t crypto_aead_aegis256_keybytes(void); - -#define crypto_aead_aegis256_NSECBYTES 0U -SODIUM_EXPORT -size_t crypto_aead_aegis256_nsecbytes(void); - -#define crypto_aead_aegis256_NPUBBYTES 32U -SODIUM_EXPORT -size_t crypto_aead_aegis256_npubbytes(void); - -#define crypto_aead_aegis256_ABYTES 16U -SODIUM_EXPORT -size_t crypto_aead_aegis256_abytes(void); - -#define crypto_aead_aegis256_MESSAGEBYTES_MAX \ - SODIUM_MIN(SODIUM_SIZE_MAX - crypto_aead_aegis256_ABYTES, \ - (1ULL << 61) - 1) -SODIUM_EXPORT -size_t crypto_aead_aegis256_messagebytes_max(void); - -SODIUM_EXPORT -int crypto_aead_aegis256_encrypt(unsigned char *c, - unsigned long long *clen_p, - const unsigned char *m, - unsigned long long mlen, - const unsigned char *ad, - unsigned long long adlen, - const unsigned char *nsec, - const unsigned char *npub, - const unsigned char *k) - __attribute__ ((nonnull(1, 8, 9))); - -SODIUM_EXPORT -int crypto_aead_aegis256_decrypt(unsigned char *m, - unsigned long long *mlen_p, - unsigned char *nsec, - const unsigned char *c, - unsigned long long clen, - const unsigned char *ad, - unsigned long long adlen, - const unsigned char *npub, - const unsigned char *k) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(4, 8, 9))); - -SODIUM_EXPORT -int crypto_aead_aegis256_encrypt_detached(unsigned char *c, - unsigned char *mac, - unsigned long long *maclen_p, - const unsigned char *m, - unsigned long long mlen, - const unsigned char *ad, - unsigned long long adlen, - const unsigned char *nsec, - const unsigned char *npub, - const unsigned char *k) - __attribute__ ((nonnull(1, 2, 9, 10))); - -SODIUM_EXPORT -int crypto_aead_aegis256_decrypt_detached(unsigned char *m, - unsigned char *nsec, - const unsigned char *c, - unsigned long long clen, - const unsigned char *mac, - const unsigned char *ad, - unsigned long long adlen, - const unsigned char *npub, - const unsigned char *k) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(3, 5, 8, 9))); - -SODIUM_EXPORT -void crypto_aead_aegis256_keygen(unsigned char k[crypto_aead_aegis256_KEYBYTES]) - __attribute__ ((nonnull)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_aead_aes256gcm.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_aead_aes256gcm.h deleted file mode 100644 index 9baeb3f1..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_aead_aes256gcm.h +++ /dev/null @@ -1,179 +0,0 @@ -#ifndef crypto_aead_aes256gcm_H -#define crypto_aead_aes256gcm_H - -/* - * WARNING: Despite being the most popular AEAD construction due to its - * use in TLS, safely using AES-GCM in a different context is tricky. - * - * No more than ~ 350 GB of input data should be encrypted with a given key. - * This is for ~ 16 KB messages -- Actual figures vary according to - * message sizes. - * - * In addition, nonces are short and repeated nonces would totally destroy - * the security of this scheme. - * - * Nonces should thus come from atomic counters, which can be difficult to - * set up in a distributed environment. - * - * Unless you absolutely need AES-GCM, use crypto_aead_xchacha20poly1305_ietf_*() - * instead. It doesn't have any of these limitations. - * Or, if you don't need to authenticate additional data, just stick to - * crypto_secretbox(). - */ - -#include -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -SODIUM_EXPORT -int crypto_aead_aes256gcm_is_available(void); - -#define crypto_aead_aes256gcm_KEYBYTES 32U -SODIUM_EXPORT -size_t crypto_aead_aes256gcm_keybytes(void); - -#define crypto_aead_aes256gcm_NSECBYTES 0U -SODIUM_EXPORT -size_t crypto_aead_aes256gcm_nsecbytes(void); - -#define crypto_aead_aes256gcm_NPUBBYTES 12U -SODIUM_EXPORT -size_t crypto_aead_aes256gcm_npubbytes(void); - -#define crypto_aead_aes256gcm_ABYTES 16U -SODIUM_EXPORT -size_t crypto_aead_aes256gcm_abytes(void); - -#define crypto_aead_aes256gcm_MESSAGEBYTES_MAX \ - SODIUM_MIN(SODIUM_SIZE_MAX - crypto_aead_aes256gcm_ABYTES, \ - (16ULL * ((1ULL << 32) - 2ULL))) -SODIUM_EXPORT -size_t crypto_aead_aes256gcm_messagebytes_max(void); - -typedef struct CRYPTO_ALIGN(16) crypto_aead_aes256gcm_state_ { - unsigned char opaque[512]; -} crypto_aead_aes256gcm_state; - -SODIUM_EXPORT -size_t crypto_aead_aes256gcm_statebytes(void); - -SODIUM_EXPORT -int crypto_aead_aes256gcm_encrypt(unsigned char *c, - unsigned long long *clen_p, - const unsigned char *m, - unsigned long long mlen, - const unsigned char *ad, - unsigned long long adlen, - const unsigned char *nsec, - const unsigned char *npub, - const unsigned char *k) - __attribute__ ((nonnull(1, 8, 9))); - -SODIUM_EXPORT -int crypto_aead_aes256gcm_decrypt(unsigned char *m, - unsigned long long *mlen_p, - unsigned char *nsec, - const unsigned char *c, - unsigned long long clen, - const unsigned char *ad, - unsigned long long adlen, - const unsigned char *npub, - const unsigned char *k) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(4, 8, 9))); - -SODIUM_EXPORT -int crypto_aead_aes256gcm_encrypt_detached(unsigned char *c, - unsigned char *mac, - unsigned long long *maclen_p, - const unsigned char *m, - unsigned long long mlen, - const unsigned char *ad, - unsigned long long adlen, - const unsigned char *nsec, - const unsigned char *npub, - const unsigned char *k) - __attribute__ ((nonnull(1, 2, 9, 10))); - -SODIUM_EXPORT -int crypto_aead_aes256gcm_decrypt_detached(unsigned char *m, - unsigned char *nsec, - const unsigned char *c, - unsigned long long clen, - const unsigned char *mac, - const unsigned char *ad, - unsigned long long adlen, - const unsigned char *npub, - const unsigned char *k) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(3, 5, 8, 9))); - -/* -- Precomputation interface -- */ - -SODIUM_EXPORT -int crypto_aead_aes256gcm_beforenm(crypto_aead_aes256gcm_state *ctx_, - const unsigned char *k) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_aead_aes256gcm_encrypt_afternm(unsigned char *c, - unsigned long long *clen_p, - const unsigned char *m, - unsigned long long mlen, - const unsigned char *ad, - unsigned long long adlen, - const unsigned char *nsec, - const unsigned char *npub, - const crypto_aead_aes256gcm_state *ctx_) - __attribute__ ((nonnull(1, 8, 9))); - -SODIUM_EXPORT -int crypto_aead_aes256gcm_decrypt_afternm(unsigned char *m, - unsigned long long *mlen_p, - unsigned char *nsec, - const unsigned char *c, - unsigned long long clen, - const unsigned char *ad, - unsigned long long adlen, - const unsigned char *npub, - const crypto_aead_aes256gcm_state *ctx_) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(4, 8, 9))); - -SODIUM_EXPORT -int crypto_aead_aes256gcm_encrypt_detached_afternm(unsigned char *c, - unsigned char *mac, - unsigned long long *maclen_p, - const unsigned char *m, - unsigned long long mlen, - const unsigned char *ad, - unsigned long long adlen, - const unsigned char *nsec, - const unsigned char *npub, - const crypto_aead_aes256gcm_state *ctx_) - __attribute__ ((nonnull(1, 2, 9, 10))); - -SODIUM_EXPORT -int crypto_aead_aes256gcm_decrypt_detached_afternm(unsigned char *m, - unsigned char *nsec, - const unsigned char *c, - unsigned long long clen, - const unsigned char *mac, - const unsigned char *ad, - unsigned long long adlen, - const unsigned char *npub, - const crypto_aead_aes256gcm_state *ctx_) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(3, 5, 8, 9))); - -SODIUM_EXPORT -void crypto_aead_aes256gcm_keygen(unsigned char k[crypto_aead_aes256gcm_KEYBYTES]) - __attribute__ ((nonnull)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_aead_chacha20poly1305.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_aead_chacha20poly1305.h deleted file mode 100644 index 5d671df1..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_aead_chacha20poly1305.h +++ /dev/null @@ -1,180 +0,0 @@ -#ifndef crypto_aead_chacha20poly1305_H -#define crypto_aead_chacha20poly1305_H - -#include -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -/* -- IETF ChaCha20-Poly1305 construction with a 96-bit nonce and a 32-bit internal counter -- */ - -#define crypto_aead_chacha20poly1305_ietf_KEYBYTES 32U -SODIUM_EXPORT -size_t crypto_aead_chacha20poly1305_ietf_keybytes(void); - -#define crypto_aead_chacha20poly1305_ietf_NSECBYTES 0U -SODIUM_EXPORT -size_t crypto_aead_chacha20poly1305_ietf_nsecbytes(void); - -#define crypto_aead_chacha20poly1305_ietf_NPUBBYTES 12U - -SODIUM_EXPORT -size_t crypto_aead_chacha20poly1305_ietf_npubbytes(void); - -#define crypto_aead_chacha20poly1305_ietf_ABYTES 16U -SODIUM_EXPORT -size_t crypto_aead_chacha20poly1305_ietf_abytes(void); - -#define crypto_aead_chacha20poly1305_ietf_MESSAGEBYTES_MAX \ - SODIUM_MIN(SODIUM_SIZE_MAX - crypto_aead_chacha20poly1305_ietf_ABYTES, \ - (64ULL * ((1ULL << 32) - 1ULL))) -SODIUM_EXPORT -size_t crypto_aead_chacha20poly1305_ietf_messagebytes_max(void); - -SODIUM_EXPORT -int crypto_aead_chacha20poly1305_ietf_encrypt(unsigned char *c, - unsigned long long *clen_p, - const unsigned char *m, - unsigned long long mlen, - const unsigned char *ad, - unsigned long long adlen, - const unsigned char *nsec, - const unsigned char *npub, - const unsigned char *k) - __attribute__ ((nonnull(1, 8, 9))); - -SODIUM_EXPORT -int crypto_aead_chacha20poly1305_ietf_decrypt(unsigned char *m, - unsigned long long *mlen_p, - unsigned char *nsec, - const unsigned char *c, - unsigned long long clen, - const unsigned char *ad, - unsigned long long adlen, - const unsigned char *npub, - const unsigned char *k) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(4, 8, 9))); - -SODIUM_EXPORT -int crypto_aead_chacha20poly1305_ietf_encrypt_detached(unsigned char *c, - unsigned char *mac, - unsigned long long *maclen_p, - const unsigned char *m, - unsigned long long mlen, - const unsigned char *ad, - unsigned long long adlen, - const unsigned char *nsec, - const unsigned char *npub, - const unsigned char *k) - __attribute__ ((nonnull(1, 2, 9, 10))); - -SODIUM_EXPORT -int crypto_aead_chacha20poly1305_ietf_decrypt_detached(unsigned char *m, - unsigned char *nsec, - const unsigned char *c, - unsigned long long clen, - const unsigned char *mac, - const unsigned char *ad, - unsigned long long adlen, - const unsigned char *npub, - const unsigned char *k) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(3, 5, 8, 9))); - -SODIUM_EXPORT -void crypto_aead_chacha20poly1305_ietf_keygen(unsigned char k[crypto_aead_chacha20poly1305_ietf_KEYBYTES]) - __attribute__ ((nonnull)); - -/* -- Original ChaCha20-Poly1305 construction with a 64-bit nonce and a 64-bit internal counter -- */ - -#define crypto_aead_chacha20poly1305_KEYBYTES 32U -SODIUM_EXPORT -size_t crypto_aead_chacha20poly1305_keybytes(void); - -#define crypto_aead_chacha20poly1305_NSECBYTES 0U -SODIUM_EXPORT -size_t crypto_aead_chacha20poly1305_nsecbytes(void); - -#define crypto_aead_chacha20poly1305_NPUBBYTES 8U -SODIUM_EXPORT -size_t crypto_aead_chacha20poly1305_npubbytes(void); - -#define crypto_aead_chacha20poly1305_ABYTES 16U -SODIUM_EXPORT -size_t crypto_aead_chacha20poly1305_abytes(void); - -#define crypto_aead_chacha20poly1305_MESSAGEBYTES_MAX \ - (SODIUM_SIZE_MAX - crypto_aead_chacha20poly1305_ABYTES) -SODIUM_EXPORT -size_t crypto_aead_chacha20poly1305_messagebytes_max(void); - -SODIUM_EXPORT -int crypto_aead_chacha20poly1305_encrypt(unsigned char *c, - unsigned long long *clen_p, - const unsigned char *m, - unsigned long long mlen, - const unsigned char *ad, - unsigned long long adlen, - const unsigned char *nsec, - const unsigned char *npub, - const unsigned char *k) - __attribute__ ((nonnull(1, 8, 9))); - -SODIUM_EXPORT -int crypto_aead_chacha20poly1305_decrypt(unsigned char *m, - unsigned long long *mlen_p, - unsigned char *nsec, - const unsigned char *c, - unsigned long long clen, - const unsigned char *ad, - unsigned long long adlen, - const unsigned char *npub, - const unsigned char *k) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(4, 8, 9))); - -SODIUM_EXPORT -int crypto_aead_chacha20poly1305_encrypt_detached(unsigned char *c, - unsigned char *mac, - unsigned long long *maclen_p, - const unsigned char *m, - unsigned long long mlen, - const unsigned char *ad, - unsigned long long adlen, - const unsigned char *nsec, - const unsigned char *npub, - const unsigned char *k) - __attribute__ ((nonnull(1, 2, 9, 10))); - -SODIUM_EXPORT -int crypto_aead_chacha20poly1305_decrypt_detached(unsigned char *m, - unsigned char *nsec, - const unsigned char *c, - unsigned long long clen, - const unsigned char *mac, - const unsigned char *ad, - unsigned long long adlen, - const unsigned char *npub, - const unsigned char *k) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(3, 5, 8, 9))); - -SODIUM_EXPORT -void crypto_aead_chacha20poly1305_keygen(unsigned char k[crypto_aead_chacha20poly1305_KEYBYTES]) - __attribute__ ((nonnull)); - -/* Aliases */ - -#define crypto_aead_chacha20poly1305_IETF_KEYBYTES crypto_aead_chacha20poly1305_ietf_KEYBYTES -#define crypto_aead_chacha20poly1305_IETF_NSECBYTES crypto_aead_chacha20poly1305_ietf_NSECBYTES -#define crypto_aead_chacha20poly1305_IETF_NPUBBYTES crypto_aead_chacha20poly1305_ietf_NPUBBYTES -#define crypto_aead_chacha20poly1305_IETF_ABYTES crypto_aead_chacha20poly1305_ietf_ABYTES -#define crypto_aead_chacha20poly1305_IETF_MESSAGEBYTES_MAX crypto_aead_chacha20poly1305_ietf_MESSAGEBYTES_MAX - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_aead_xchacha20poly1305.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_aead_xchacha20poly1305.h deleted file mode 100644 index 6643b0cb..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_aead_xchacha20poly1305.h +++ /dev/null @@ -1,100 +0,0 @@ -#ifndef crypto_aead_xchacha20poly1305_H -#define crypto_aead_xchacha20poly1305_H - -#include -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -#define crypto_aead_xchacha20poly1305_ietf_KEYBYTES 32U -SODIUM_EXPORT -size_t crypto_aead_xchacha20poly1305_ietf_keybytes(void); - -#define crypto_aead_xchacha20poly1305_ietf_NSECBYTES 0U -SODIUM_EXPORT -size_t crypto_aead_xchacha20poly1305_ietf_nsecbytes(void); - -#define crypto_aead_xchacha20poly1305_ietf_NPUBBYTES 24U -SODIUM_EXPORT -size_t crypto_aead_xchacha20poly1305_ietf_npubbytes(void); - -#define crypto_aead_xchacha20poly1305_ietf_ABYTES 16U -SODIUM_EXPORT -size_t crypto_aead_xchacha20poly1305_ietf_abytes(void); - -#define crypto_aead_xchacha20poly1305_ietf_MESSAGEBYTES_MAX \ - (SODIUM_SIZE_MAX - crypto_aead_xchacha20poly1305_ietf_ABYTES) -SODIUM_EXPORT -size_t crypto_aead_xchacha20poly1305_ietf_messagebytes_max(void); - -SODIUM_EXPORT -int crypto_aead_xchacha20poly1305_ietf_encrypt(unsigned char *c, - unsigned long long *clen_p, - const unsigned char *m, - unsigned long long mlen, - const unsigned char *ad, - unsigned long long adlen, - const unsigned char *nsec, - const unsigned char *npub, - const unsigned char *k) - __attribute__ ((nonnull(1, 8, 9))); - -SODIUM_EXPORT -int crypto_aead_xchacha20poly1305_ietf_decrypt(unsigned char *m, - unsigned long long *mlen_p, - unsigned char *nsec, - const unsigned char *c, - unsigned long long clen, - const unsigned char *ad, - unsigned long long adlen, - const unsigned char *npub, - const unsigned char *k) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(4, 8, 9))); - -SODIUM_EXPORT -int crypto_aead_xchacha20poly1305_ietf_encrypt_detached(unsigned char *c, - unsigned char *mac, - unsigned long long *maclen_p, - const unsigned char *m, - unsigned long long mlen, - const unsigned char *ad, - unsigned long long adlen, - const unsigned char *nsec, - const unsigned char *npub, - const unsigned char *k) - __attribute__ ((nonnull(1, 2, 9, 10))); - -SODIUM_EXPORT -int crypto_aead_xchacha20poly1305_ietf_decrypt_detached(unsigned char *m, - unsigned char *nsec, - const unsigned char *c, - unsigned long long clen, - const unsigned char *mac, - const unsigned char *ad, - unsigned long long adlen, - const unsigned char *npub, - const unsigned char *k) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(3, 5, 8, 9))); - -SODIUM_EXPORT -void crypto_aead_xchacha20poly1305_ietf_keygen(unsigned char k[crypto_aead_xchacha20poly1305_ietf_KEYBYTES]) - __attribute__ ((nonnull)); - -/* Aliases */ - -#define crypto_aead_xchacha20poly1305_IETF_KEYBYTES crypto_aead_xchacha20poly1305_ietf_KEYBYTES -#define crypto_aead_xchacha20poly1305_IETF_NSECBYTES crypto_aead_xchacha20poly1305_ietf_NSECBYTES -#define crypto_aead_xchacha20poly1305_IETF_NPUBBYTES crypto_aead_xchacha20poly1305_ietf_NPUBBYTES -#define crypto_aead_xchacha20poly1305_IETF_ABYTES crypto_aead_xchacha20poly1305_ietf_ABYTES -#define crypto_aead_xchacha20poly1305_IETF_MESSAGEBYTES_MAX crypto_aead_xchacha20poly1305_ietf_MESSAGEBYTES_MAX - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_auth.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_auth.h deleted file mode 100644 index 540aee0e..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_auth.h +++ /dev/null @@ -1,46 +0,0 @@ -#ifndef crypto_auth_H -#define crypto_auth_H - -#include - -#include "crypto_auth_hmacsha512256.h" -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -#define crypto_auth_BYTES crypto_auth_hmacsha512256_BYTES -SODIUM_EXPORT -size_t crypto_auth_bytes(void); - -#define crypto_auth_KEYBYTES crypto_auth_hmacsha512256_KEYBYTES -SODIUM_EXPORT -size_t crypto_auth_keybytes(void); - -#define crypto_auth_PRIMITIVE "hmacsha512256" -SODIUM_EXPORT -const char *crypto_auth_primitive(void); - -SODIUM_EXPORT -int crypto_auth(unsigned char *out, const unsigned char *in, - unsigned long long inlen, const unsigned char *k) - __attribute__ ((nonnull(1, 4))); - -SODIUM_EXPORT -int crypto_auth_verify(const unsigned char *h, const unsigned char *in, - unsigned long long inlen, const unsigned char *k) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(1, 4))); - -SODIUM_EXPORT -void crypto_auth_keygen(unsigned char k[crypto_auth_KEYBYTES]) - __attribute__ ((nonnull)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_auth_hmacsha256.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_auth_hmacsha256.h deleted file mode 100644 index 3da864c7..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_auth_hmacsha256.h +++ /dev/null @@ -1,70 +0,0 @@ -#ifndef crypto_auth_hmacsha256_H -#define crypto_auth_hmacsha256_H - -#include -#include "crypto_hash_sha256.h" -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -#define crypto_auth_hmacsha256_BYTES 32U -SODIUM_EXPORT -size_t crypto_auth_hmacsha256_bytes(void); - -#define crypto_auth_hmacsha256_KEYBYTES 32U -SODIUM_EXPORT -size_t crypto_auth_hmacsha256_keybytes(void); - -SODIUM_EXPORT -int crypto_auth_hmacsha256(unsigned char *out, - const unsigned char *in, - unsigned long long inlen, - const unsigned char *k) __attribute__ ((nonnull(1, 4))); - -SODIUM_EXPORT -int crypto_auth_hmacsha256_verify(const unsigned char *h, - const unsigned char *in, - unsigned long long inlen, - const unsigned char *k) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(1, 4))); - -/* ------------------------------------------------------------------------- */ - -typedef struct crypto_auth_hmacsha256_state { - crypto_hash_sha256_state ictx; - crypto_hash_sha256_state octx; -} crypto_auth_hmacsha256_state; - -SODIUM_EXPORT -size_t crypto_auth_hmacsha256_statebytes(void); - -SODIUM_EXPORT -int crypto_auth_hmacsha256_init(crypto_auth_hmacsha256_state *state, - const unsigned char *key, - size_t keylen) __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_auth_hmacsha256_update(crypto_auth_hmacsha256_state *state, - const unsigned char *in, - unsigned long long inlen) - __attribute__ ((nonnull(1))); - -SODIUM_EXPORT -int crypto_auth_hmacsha256_final(crypto_auth_hmacsha256_state *state, - unsigned char *out) __attribute__ ((nonnull)); - - -SODIUM_EXPORT -void crypto_auth_hmacsha256_keygen(unsigned char k[crypto_auth_hmacsha256_KEYBYTES]) - __attribute__ ((nonnull)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_auth_hmacsha512.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_auth_hmacsha512.h deleted file mode 100644 index d992cb81..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_auth_hmacsha512.h +++ /dev/null @@ -1,68 +0,0 @@ -#ifndef crypto_auth_hmacsha512_H -#define crypto_auth_hmacsha512_H - -#include -#include "crypto_hash_sha512.h" -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -#define crypto_auth_hmacsha512_BYTES 64U -SODIUM_EXPORT -size_t crypto_auth_hmacsha512_bytes(void); - -#define crypto_auth_hmacsha512_KEYBYTES 32U -SODIUM_EXPORT -size_t crypto_auth_hmacsha512_keybytes(void); - -SODIUM_EXPORT -int crypto_auth_hmacsha512(unsigned char *out, - const unsigned char *in, - unsigned long long inlen, - const unsigned char *k) __attribute__ ((nonnull(1, 4))); - -SODIUM_EXPORT -int crypto_auth_hmacsha512_verify(const unsigned char *h, - const unsigned char *in, - unsigned long long inlen, - const unsigned char *k) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(1, 4))); - -/* ------------------------------------------------------------------------- */ - -typedef struct crypto_auth_hmacsha512_state { - crypto_hash_sha512_state ictx; - crypto_hash_sha512_state octx; -} crypto_auth_hmacsha512_state; - -SODIUM_EXPORT -size_t crypto_auth_hmacsha512_statebytes(void); - -SODIUM_EXPORT -int crypto_auth_hmacsha512_init(crypto_auth_hmacsha512_state *state, - const unsigned char *key, - size_t keylen) __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_auth_hmacsha512_update(crypto_auth_hmacsha512_state *state, - const unsigned char *in, - unsigned long long inlen) __attribute__ ((nonnull(1))); - -SODIUM_EXPORT -int crypto_auth_hmacsha512_final(crypto_auth_hmacsha512_state *state, - unsigned char *out) __attribute__ ((nonnull)); - -SODIUM_EXPORT -void crypto_auth_hmacsha512_keygen(unsigned char k[crypto_auth_hmacsha512_KEYBYTES]) - __attribute__ ((nonnull)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_auth_hmacsha512256.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_auth_hmacsha512256.h deleted file mode 100644 index 3fb52638..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_auth_hmacsha512256.h +++ /dev/null @@ -1,65 +0,0 @@ -#ifndef crypto_auth_hmacsha512256_H -#define crypto_auth_hmacsha512256_H - -#include -#include "crypto_auth_hmacsha512.h" -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -#define crypto_auth_hmacsha512256_BYTES 32U -SODIUM_EXPORT -size_t crypto_auth_hmacsha512256_bytes(void); - -#define crypto_auth_hmacsha512256_KEYBYTES 32U -SODIUM_EXPORT -size_t crypto_auth_hmacsha512256_keybytes(void); - -SODIUM_EXPORT -int crypto_auth_hmacsha512256(unsigned char *out, - const unsigned char *in, - unsigned long long inlen, - const unsigned char *k) __attribute__ ((nonnull(1, 4))); - -SODIUM_EXPORT -int crypto_auth_hmacsha512256_verify(const unsigned char *h, - const unsigned char *in, - unsigned long long inlen, - const unsigned char *k) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(1, 4))); - -/* ------------------------------------------------------------------------- */ - -typedef crypto_auth_hmacsha512_state crypto_auth_hmacsha512256_state; - -SODIUM_EXPORT -size_t crypto_auth_hmacsha512256_statebytes(void); - -SODIUM_EXPORT -int crypto_auth_hmacsha512256_init(crypto_auth_hmacsha512256_state *state, - const unsigned char *key, - size_t keylen) __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_auth_hmacsha512256_update(crypto_auth_hmacsha512256_state *state, - const unsigned char *in, - unsigned long long inlen) __attribute__ ((nonnull(1))); - -SODIUM_EXPORT -int crypto_auth_hmacsha512256_final(crypto_auth_hmacsha512256_state *state, - unsigned char *out) __attribute__ ((nonnull)); - -SODIUM_EXPORT -void crypto_auth_hmacsha512256_keygen(unsigned char k[crypto_auth_hmacsha512256_KEYBYTES]) - __attribute__ ((nonnull)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_box.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_box.h deleted file mode 100644 index 0008e020..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_box.h +++ /dev/null @@ -1,177 +0,0 @@ -#ifndef crypto_box_H -#define crypto_box_H - -/* - * THREAD SAFETY: crypto_box_keypair() is thread-safe, - * provided that sodium_init() was called before. - * - * Other functions are always thread-safe. - */ - -#include - -#include "crypto_box_curve25519xsalsa20poly1305.h" -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -#define crypto_box_SEEDBYTES crypto_box_curve25519xsalsa20poly1305_SEEDBYTES -SODIUM_EXPORT -size_t crypto_box_seedbytes(void); - -#define crypto_box_PUBLICKEYBYTES crypto_box_curve25519xsalsa20poly1305_PUBLICKEYBYTES -SODIUM_EXPORT -size_t crypto_box_publickeybytes(void); - -#define crypto_box_SECRETKEYBYTES crypto_box_curve25519xsalsa20poly1305_SECRETKEYBYTES -SODIUM_EXPORT -size_t crypto_box_secretkeybytes(void); - -#define crypto_box_NONCEBYTES crypto_box_curve25519xsalsa20poly1305_NONCEBYTES -SODIUM_EXPORT -size_t crypto_box_noncebytes(void); - -#define crypto_box_MACBYTES crypto_box_curve25519xsalsa20poly1305_MACBYTES -SODIUM_EXPORT -size_t crypto_box_macbytes(void); - -#define crypto_box_MESSAGEBYTES_MAX crypto_box_curve25519xsalsa20poly1305_MESSAGEBYTES_MAX -SODIUM_EXPORT -size_t crypto_box_messagebytes_max(void); - -#define crypto_box_PRIMITIVE "curve25519xsalsa20poly1305" -SODIUM_EXPORT -const char *crypto_box_primitive(void); - -SODIUM_EXPORT -int crypto_box_seed_keypair(unsigned char *pk, unsigned char *sk, - const unsigned char *seed) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_box_keypair(unsigned char *pk, unsigned char *sk) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_box_easy(unsigned char *c, const unsigned char *m, - unsigned long long mlen, const unsigned char *n, - const unsigned char *pk, const unsigned char *sk) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(1, 4, 5, 6))); - -SODIUM_EXPORT -int crypto_box_open_easy(unsigned char *m, const unsigned char *c, - unsigned long long clen, const unsigned char *n, - const unsigned char *pk, const unsigned char *sk) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(2, 4, 5, 6))); - -SODIUM_EXPORT -int crypto_box_detached(unsigned char *c, unsigned char *mac, - const unsigned char *m, unsigned long long mlen, - const unsigned char *n, const unsigned char *pk, - const unsigned char *sk) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(1, 2, 5, 6, 7))); - -SODIUM_EXPORT -int crypto_box_open_detached(unsigned char *m, const unsigned char *c, - const unsigned char *mac, - unsigned long long clen, - const unsigned char *n, - const unsigned char *pk, - const unsigned char *sk) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(2, 3, 5, 6, 7))); - -/* -- Precomputation interface -- */ - -#define crypto_box_BEFORENMBYTES crypto_box_curve25519xsalsa20poly1305_BEFORENMBYTES -SODIUM_EXPORT -size_t crypto_box_beforenmbytes(void); - -SODIUM_EXPORT -int crypto_box_beforenm(unsigned char *k, const unsigned char *pk, - const unsigned char *sk) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_box_easy_afternm(unsigned char *c, const unsigned char *m, - unsigned long long mlen, const unsigned char *n, - const unsigned char *k) __attribute__ ((nonnull(1, 4, 5))); - -SODIUM_EXPORT -int crypto_box_open_easy_afternm(unsigned char *m, const unsigned char *c, - unsigned long long clen, const unsigned char *n, - const unsigned char *k) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(2, 4, 5))); - -SODIUM_EXPORT -int crypto_box_detached_afternm(unsigned char *c, unsigned char *mac, - const unsigned char *m, unsigned long long mlen, - const unsigned char *n, const unsigned char *k) - __attribute__ ((nonnull(1, 2, 5, 6))); - -SODIUM_EXPORT -int crypto_box_open_detached_afternm(unsigned char *m, const unsigned char *c, - const unsigned char *mac, - unsigned long long clen, const unsigned char *n, - const unsigned char *k) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(2, 3, 5, 6))); - -/* -- Ephemeral SK interface -- */ - -#define crypto_box_SEALBYTES (crypto_box_PUBLICKEYBYTES + crypto_box_MACBYTES) -SODIUM_EXPORT -size_t crypto_box_sealbytes(void); - -SODIUM_EXPORT -int crypto_box_seal(unsigned char *c, const unsigned char *m, - unsigned long long mlen, const unsigned char *pk) - __attribute__ ((nonnull(1, 4))); - -SODIUM_EXPORT -int crypto_box_seal_open(unsigned char *m, const unsigned char *c, - unsigned long long clen, - const unsigned char *pk, const unsigned char *sk) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(2, 4, 5))); - -/* -- NaCl compatibility interface ; Requires padding -- */ - -#define crypto_box_ZEROBYTES crypto_box_curve25519xsalsa20poly1305_ZEROBYTES -SODIUM_EXPORT -size_t crypto_box_zerobytes(void) __attribute__ ((deprecated)); - -#define crypto_box_BOXZEROBYTES crypto_box_curve25519xsalsa20poly1305_BOXZEROBYTES -SODIUM_EXPORT -size_t crypto_box_boxzerobytes(void) __attribute__ ((deprecated)); - -SODIUM_EXPORT -int crypto_box(unsigned char *c, const unsigned char *m, - unsigned long long mlen, const unsigned char *n, - const unsigned char *pk, const unsigned char *sk) - __attribute__ ((deprecated)) __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(1, 4, 5, 6))); - -SODIUM_EXPORT -int crypto_box_open(unsigned char *m, const unsigned char *c, - unsigned long long clen, const unsigned char *n, - const unsigned char *pk, const unsigned char *sk) - __attribute__ ((deprecated)) __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(2, 4, 5, 6))); - -SODIUM_EXPORT -int crypto_box_afternm(unsigned char *c, const unsigned char *m, - unsigned long long mlen, const unsigned char *n, - const unsigned char *k) __attribute__ ((deprecated)) __attribute__ ((nonnull(1, 4, 5))); - -SODIUM_EXPORT -int crypto_box_open_afternm(unsigned char *m, const unsigned char *c, - unsigned long long clen, const unsigned char *n, - const unsigned char *k) - __attribute__ ((warn_unused_result)) __attribute__ ((deprecated)) __attribute__ ((nonnull(2, 4, 5))); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_box_curve25519xchacha20poly1305.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_box_curve25519xchacha20poly1305.h deleted file mode 100644 index 26a3d31e..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_box_curve25519xchacha20poly1305.h +++ /dev/null @@ -1,164 +0,0 @@ - -#ifndef crypto_box_curve25519xchacha20poly1305_H -#define crypto_box_curve25519xchacha20poly1305_H - -#include -#include "crypto_stream_xchacha20.h" -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -#define crypto_box_curve25519xchacha20poly1305_SEEDBYTES 32U -SODIUM_EXPORT -size_t crypto_box_curve25519xchacha20poly1305_seedbytes(void); - -#define crypto_box_curve25519xchacha20poly1305_PUBLICKEYBYTES 32U -SODIUM_EXPORT -size_t crypto_box_curve25519xchacha20poly1305_publickeybytes(void); - -#define crypto_box_curve25519xchacha20poly1305_SECRETKEYBYTES 32U -SODIUM_EXPORT -size_t crypto_box_curve25519xchacha20poly1305_secretkeybytes(void); - -#define crypto_box_curve25519xchacha20poly1305_BEFORENMBYTES 32U -SODIUM_EXPORT -size_t crypto_box_curve25519xchacha20poly1305_beforenmbytes(void); - -#define crypto_box_curve25519xchacha20poly1305_NONCEBYTES 24U -SODIUM_EXPORT -size_t crypto_box_curve25519xchacha20poly1305_noncebytes(void); - -#define crypto_box_curve25519xchacha20poly1305_MACBYTES 16U -SODIUM_EXPORT -size_t crypto_box_curve25519xchacha20poly1305_macbytes(void); - -#define crypto_box_curve25519xchacha20poly1305_MESSAGEBYTES_MAX \ - (crypto_stream_xchacha20_MESSAGEBYTES_MAX - crypto_box_curve25519xchacha20poly1305_MACBYTES) -SODIUM_EXPORT -size_t crypto_box_curve25519xchacha20poly1305_messagebytes_max(void); - -SODIUM_EXPORT -int crypto_box_curve25519xchacha20poly1305_seed_keypair(unsigned char *pk, - unsigned char *sk, - const unsigned char *seed) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_box_curve25519xchacha20poly1305_keypair(unsigned char *pk, - unsigned char *sk) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_box_curve25519xchacha20poly1305_easy(unsigned char *c, - const unsigned char *m, - unsigned long long mlen, - const unsigned char *n, - const unsigned char *pk, - const unsigned char *sk) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(1, 4, 5, 6))); - -SODIUM_EXPORT -int crypto_box_curve25519xchacha20poly1305_open_easy(unsigned char *m, - const unsigned char *c, - unsigned long long clen, - const unsigned char *n, - const unsigned char *pk, - const unsigned char *sk) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(2, 4, 5, 6))); - -SODIUM_EXPORT -int crypto_box_curve25519xchacha20poly1305_detached(unsigned char *c, - unsigned char *mac, - const unsigned char *m, - unsigned long long mlen, - const unsigned char *n, - const unsigned char *pk, - const unsigned char *sk) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(1, 2, 5, 6, 7))); - -SODIUM_EXPORT -int crypto_box_curve25519xchacha20poly1305_open_detached(unsigned char *m, - const unsigned char *c, - const unsigned char *mac, - unsigned long long clen, - const unsigned char *n, - const unsigned char *pk, - const unsigned char *sk) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(2, 3, 5, 6, 7))); - -/* -- Precomputation interface -- */ - -SODIUM_EXPORT -int crypto_box_curve25519xchacha20poly1305_beforenm(unsigned char *k, - const unsigned char *pk, - const unsigned char *sk) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_box_curve25519xchacha20poly1305_easy_afternm(unsigned char *c, - const unsigned char *m, - unsigned long long mlen, - const unsigned char *n, - const unsigned char *k) - __attribute__ ((nonnull(1, 4, 5))); - -SODIUM_EXPORT -int crypto_box_curve25519xchacha20poly1305_open_easy_afternm(unsigned char *m, - const unsigned char *c, - unsigned long long clen, - const unsigned char *n, - const unsigned char *k) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(2, 4, 5))); - -SODIUM_EXPORT -int crypto_box_curve25519xchacha20poly1305_detached_afternm(unsigned char *c, - unsigned char *mac, - const unsigned char *m, - unsigned long long mlen, - const unsigned char *n, - const unsigned char *k) - __attribute__ ((nonnull(1, 2, 5, 6))); - -SODIUM_EXPORT -int crypto_box_curve25519xchacha20poly1305_open_detached_afternm(unsigned char *m, - const unsigned char *c, - const unsigned char *mac, - unsigned long long clen, - const unsigned char *n, - const unsigned char *k) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(2, 3, 5, 6))); - -/* -- Ephemeral SK interface -- */ - -#define crypto_box_curve25519xchacha20poly1305_SEALBYTES \ - (crypto_box_curve25519xchacha20poly1305_PUBLICKEYBYTES + \ - crypto_box_curve25519xchacha20poly1305_MACBYTES) - -SODIUM_EXPORT -size_t crypto_box_curve25519xchacha20poly1305_sealbytes(void); - -SODIUM_EXPORT -int crypto_box_curve25519xchacha20poly1305_seal(unsigned char *c, - const unsigned char *m, - unsigned long long mlen, - const unsigned char *pk) - __attribute__ ((nonnull(1, 4))); - -SODIUM_EXPORT -int crypto_box_curve25519xchacha20poly1305_seal_open(unsigned char *m, - const unsigned char *c, - unsigned long long clen, - const unsigned char *pk, - const unsigned char *sk) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(2, 4, 5))); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_box_curve25519xsalsa20poly1305.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_box_curve25519xsalsa20poly1305.h deleted file mode 100644 index 2c9b5d6e..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_box_curve25519xsalsa20poly1305.h +++ /dev/null @@ -1,113 +0,0 @@ -#ifndef crypto_box_curve25519xsalsa20poly1305_H -#define crypto_box_curve25519xsalsa20poly1305_H - -#include -#include "crypto_stream_xsalsa20.h" -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -#define crypto_box_curve25519xsalsa20poly1305_SEEDBYTES 32U -SODIUM_EXPORT -size_t crypto_box_curve25519xsalsa20poly1305_seedbytes(void); - -#define crypto_box_curve25519xsalsa20poly1305_PUBLICKEYBYTES 32U -SODIUM_EXPORT -size_t crypto_box_curve25519xsalsa20poly1305_publickeybytes(void); - -#define crypto_box_curve25519xsalsa20poly1305_SECRETKEYBYTES 32U -SODIUM_EXPORT -size_t crypto_box_curve25519xsalsa20poly1305_secretkeybytes(void); - -#define crypto_box_curve25519xsalsa20poly1305_BEFORENMBYTES 32U -SODIUM_EXPORT -size_t crypto_box_curve25519xsalsa20poly1305_beforenmbytes(void); - -#define crypto_box_curve25519xsalsa20poly1305_NONCEBYTES 24U -SODIUM_EXPORT -size_t crypto_box_curve25519xsalsa20poly1305_noncebytes(void); - -#define crypto_box_curve25519xsalsa20poly1305_MACBYTES 16U -SODIUM_EXPORT -size_t crypto_box_curve25519xsalsa20poly1305_macbytes(void); - -/* Only for the libsodium API - The NaCl compatibility API would require BOXZEROBYTES extra bytes */ -#define crypto_box_curve25519xsalsa20poly1305_MESSAGEBYTES_MAX \ - (crypto_stream_xsalsa20_MESSAGEBYTES_MAX - crypto_box_curve25519xsalsa20poly1305_MACBYTES) -SODIUM_EXPORT -size_t crypto_box_curve25519xsalsa20poly1305_messagebytes_max(void); - -SODIUM_EXPORT -int crypto_box_curve25519xsalsa20poly1305_seed_keypair(unsigned char *pk, - unsigned char *sk, - const unsigned char *seed) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_box_curve25519xsalsa20poly1305_keypair(unsigned char *pk, - unsigned char *sk) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_box_curve25519xsalsa20poly1305_beforenm(unsigned char *k, - const unsigned char *pk, - const unsigned char *sk) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull)); - -/* -- NaCl compatibility interface ; Requires padding -- */ - -#define crypto_box_curve25519xsalsa20poly1305_BOXZEROBYTES 16U -SODIUM_EXPORT -size_t crypto_box_curve25519xsalsa20poly1305_boxzerobytes(void); - -#define crypto_box_curve25519xsalsa20poly1305_ZEROBYTES \ - (crypto_box_curve25519xsalsa20poly1305_BOXZEROBYTES + \ - crypto_box_curve25519xsalsa20poly1305_MACBYTES) -SODIUM_EXPORT -size_t crypto_box_curve25519xsalsa20poly1305_zerobytes(void) - __attribute__ ((deprecated)); - -SODIUM_EXPORT -int crypto_box_curve25519xsalsa20poly1305(unsigned char *c, - const unsigned char *m, - unsigned long long mlen, - const unsigned char *n, - const unsigned char *pk, - const unsigned char *sk) - __attribute__ ((deprecated)) __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(1, 4, 5, 6))); - -SODIUM_EXPORT -int crypto_box_curve25519xsalsa20poly1305_open(unsigned char *m, - const unsigned char *c, - unsigned long long clen, - const unsigned char *n, - const unsigned char *pk, - const unsigned char *sk) - __attribute__ ((deprecated)) __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(2, 4, 5, 6))); - -SODIUM_EXPORT -int crypto_box_curve25519xsalsa20poly1305_afternm(unsigned char *c, - const unsigned char *m, - unsigned long long mlen, - const unsigned char *n, - const unsigned char *k) - __attribute__ ((deprecated)) __attribute__ ((nonnull(1, 4, 5))); - -SODIUM_EXPORT -int crypto_box_curve25519xsalsa20poly1305_open_afternm(unsigned char *m, - const unsigned char *c, - unsigned long long clen, - const unsigned char *n, - const unsigned char *k) - __attribute__ ((deprecated)) __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(2, 4, 5))); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_core_ed25519.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_core_ed25519.h deleted file mode 100644 index 618a44f9..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_core_ed25519.h +++ /dev/null @@ -1,115 +0,0 @@ -#ifndef crypto_core_ed25519_H -#define crypto_core_ed25519_H - -#include -#include "export.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#define crypto_core_ed25519_BYTES 32 -SODIUM_EXPORT -size_t crypto_core_ed25519_bytes(void); - -#define crypto_core_ed25519_UNIFORMBYTES 32 -SODIUM_EXPORT -size_t crypto_core_ed25519_uniformbytes(void); - -#define crypto_core_ed25519_HASHBYTES 64 -SODIUM_EXPORT -size_t crypto_core_ed25519_hashbytes(void); - -#define crypto_core_ed25519_SCALARBYTES 32 -SODIUM_EXPORT -size_t crypto_core_ed25519_scalarbytes(void); - -#define crypto_core_ed25519_NONREDUCEDSCALARBYTES 64 -SODIUM_EXPORT -size_t crypto_core_ed25519_nonreducedscalarbytes(void); - -#define crypto_core_ed25519_H2CSHA256 1 -#define crypto_core_ed25519_H2CSHA512 2 - -SODIUM_EXPORT -int crypto_core_ed25519_is_valid_point(const unsigned char *p) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_core_ed25519_add(unsigned char *r, - const unsigned char *p, const unsigned char *q) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_core_ed25519_sub(unsigned char *r, - const unsigned char *p, const unsigned char *q) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_core_ed25519_from_uniform(unsigned char *p, const unsigned char *r) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_core_ed25519_from_string(unsigned char p[crypto_core_ed25519_BYTES], - const char *ctx, const unsigned char *msg, - size_t msg_len, int hash_alg) - __attribute__ ((nonnull(1))); - -SODIUM_EXPORT -int crypto_core_ed25519_from_string_ro(unsigned char p[crypto_core_ed25519_BYTES], - const char *ctx, const unsigned char *msg, - size_t msg_len, int hash_alg) - __attribute__ ((nonnull(1))); - -SODIUM_EXPORT -void crypto_core_ed25519_random(unsigned char *p) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -void crypto_core_ed25519_scalar_random(unsigned char *r) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_core_ed25519_scalar_invert(unsigned char *recip, const unsigned char *s) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -void crypto_core_ed25519_scalar_negate(unsigned char *neg, const unsigned char *s) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -void crypto_core_ed25519_scalar_complement(unsigned char *comp, const unsigned char *s) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -void crypto_core_ed25519_scalar_add(unsigned char *z, const unsigned char *x, - const unsigned char *y) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -void crypto_core_ed25519_scalar_sub(unsigned char *z, const unsigned char *x, - const unsigned char *y) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -void crypto_core_ed25519_scalar_mul(unsigned char *z, const unsigned char *x, - const unsigned char *y) - __attribute__ ((nonnull)); - -/* - * The interval `s` is sampled from should be at least 317 bits to ensure almost - * uniformity of `r` over `L`. - */ -SODIUM_EXPORT -void crypto_core_ed25519_scalar_reduce(unsigned char *r, const unsigned char *s) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_core_ed25519_scalar_is_canonical(const unsigned char *s) - __attribute__ ((nonnull)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_core_hchacha20.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_core_hchacha20.h deleted file mode 100644 index ece141b0..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_core_hchacha20.h +++ /dev/null @@ -1,36 +0,0 @@ -#ifndef crypto_core_hchacha20_H -#define crypto_core_hchacha20_H - -#include -#include "export.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#define crypto_core_hchacha20_OUTPUTBYTES 32U -SODIUM_EXPORT -size_t crypto_core_hchacha20_outputbytes(void); - -#define crypto_core_hchacha20_INPUTBYTES 16U -SODIUM_EXPORT -size_t crypto_core_hchacha20_inputbytes(void); - -#define crypto_core_hchacha20_KEYBYTES 32U -SODIUM_EXPORT -size_t crypto_core_hchacha20_keybytes(void); - -#define crypto_core_hchacha20_CONSTBYTES 16U -SODIUM_EXPORT -size_t crypto_core_hchacha20_constbytes(void); - -SODIUM_EXPORT -int crypto_core_hchacha20(unsigned char *out, const unsigned char *in, - const unsigned char *k, const unsigned char *c) - __attribute__ ((nonnull(1, 2, 3))); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_core_hsalsa20.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_core_hsalsa20.h deleted file mode 100644 index 4bf7a487..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_core_hsalsa20.h +++ /dev/null @@ -1,36 +0,0 @@ -#ifndef crypto_core_hsalsa20_H -#define crypto_core_hsalsa20_H - -#include -#include "export.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#define crypto_core_hsalsa20_OUTPUTBYTES 32U -SODIUM_EXPORT -size_t crypto_core_hsalsa20_outputbytes(void); - -#define crypto_core_hsalsa20_INPUTBYTES 16U -SODIUM_EXPORT -size_t crypto_core_hsalsa20_inputbytes(void); - -#define crypto_core_hsalsa20_KEYBYTES 32U -SODIUM_EXPORT -size_t crypto_core_hsalsa20_keybytes(void); - -#define crypto_core_hsalsa20_CONSTBYTES 16U -SODIUM_EXPORT -size_t crypto_core_hsalsa20_constbytes(void); - -SODIUM_EXPORT -int crypto_core_hsalsa20(unsigned char *out, const unsigned char *in, - const unsigned char *k, const unsigned char *c) - __attribute__ ((nonnull(1, 2, 3))); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_core_ristretto255.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_core_ristretto255.h deleted file mode 100644 index 5fc3a1be..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_core_ristretto255.h +++ /dev/null @@ -1,121 +0,0 @@ -#ifndef crypto_core_ristretto255_H -#define crypto_core_ristretto255_H - -#include -#include "export.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#define crypto_core_ristretto255_BYTES 32 -SODIUM_EXPORT -size_t crypto_core_ristretto255_bytes(void); - -#define crypto_core_ristretto255_HASHBYTES 64 -SODIUM_EXPORT -size_t crypto_core_ristretto255_hashbytes(void); - -#define crypto_core_ristretto255_SCALARBYTES 32 -SODIUM_EXPORT -size_t crypto_core_ristretto255_scalarbytes(void); - -#define crypto_core_ristretto255_NONREDUCEDSCALARBYTES 64 -SODIUM_EXPORT -size_t crypto_core_ristretto255_nonreducedscalarbytes(void); - -#define crypto_core_ristretto255_H2CSHA256 1 -#define crypto_core_ristretto255_H2CSHA512 2 - -SODIUM_EXPORT -int crypto_core_ristretto255_is_valid_point(const unsigned char *p) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_core_ristretto255_add(unsigned char *r, - const unsigned char *p, const unsigned char *q) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_core_ristretto255_sub(unsigned char *r, - const unsigned char *p, const unsigned char *q) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_core_ristretto255_from_hash(unsigned char *p, - const unsigned char *r) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_core_ristretto255_from_string(unsigned char p[crypto_core_ristretto255_BYTES], - const char *ctx, - const unsigned char *msg, - size_t msg_len, int hash_alg) - __attribute__ ((nonnull(1))); - -SODIUM_EXPORT -int crypto_core_ristretto255_from_string_ro(unsigned char p[crypto_core_ristretto255_BYTES], - const char *ctx, - const unsigned char *msg, - size_t msg_len, int hash_alg) - __attribute__ ((nonnull(1))); - -SODIUM_EXPORT -void crypto_core_ristretto255_random(unsigned char *p) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -void crypto_core_ristretto255_scalar_random(unsigned char *r) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_core_ristretto255_scalar_invert(unsigned char *recip, - const unsigned char *s) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -void crypto_core_ristretto255_scalar_negate(unsigned char *neg, - const unsigned char *s) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -void crypto_core_ristretto255_scalar_complement(unsigned char *comp, - const unsigned char *s) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -void crypto_core_ristretto255_scalar_add(unsigned char *z, - const unsigned char *x, - const unsigned char *y) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -void crypto_core_ristretto255_scalar_sub(unsigned char *z, - const unsigned char *x, - const unsigned char *y) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -void crypto_core_ristretto255_scalar_mul(unsigned char *z, - const unsigned char *x, - const unsigned char *y) - __attribute__ ((nonnull)); - -/* - * The interval `s` is sampled from should be at least 317 bits to ensure almost - * uniformity of `r` over `L`. - */ -SODIUM_EXPORT -void crypto_core_ristretto255_scalar_reduce(unsigned char *r, - const unsigned char *s) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_core_ristretto255_scalar_is_canonical(const unsigned char *s) - __attribute__ ((nonnull)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_core_salsa20.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_core_salsa20.h deleted file mode 100644 index bd79fd9f..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_core_salsa20.h +++ /dev/null @@ -1,36 +0,0 @@ -#ifndef crypto_core_salsa20_H -#define crypto_core_salsa20_H - -#include -#include "export.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#define crypto_core_salsa20_OUTPUTBYTES 64U -SODIUM_EXPORT -size_t crypto_core_salsa20_outputbytes(void); - -#define crypto_core_salsa20_INPUTBYTES 16U -SODIUM_EXPORT -size_t crypto_core_salsa20_inputbytes(void); - -#define crypto_core_salsa20_KEYBYTES 32U -SODIUM_EXPORT -size_t crypto_core_salsa20_keybytes(void); - -#define crypto_core_salsa20_CONSTBYTES 16U -SODIUM_EXPORT -size_t crypto_core_salsa20_constbytes(void); - -SODIUM_EXPORT -int crypto_core_salsa20(unsigned char *out, const unsigned char *in, - const unsigned char *k, const unsigned char *c) - __attribute__ ((nonnull(1, 2, 3))); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_core_salsa2012.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_core_salsa2012.h deleted file mode 100644 index 05957591..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_core_salsa2012.h +++ /dev/null @@ -1,36 +0,0 @@ -#ifndef crypto_core_salsa2012_H -#define crypto_core_salsa2012_H - -#include -#include "export.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#define crypto_core_salsa2012_OUTPUTBYTES 64U -SODIUM_EXPORT -size_t crypto_core_salsa2012_outputbytes(void); - -#define crypto_core_salsa2012_INPUTBYTES 16U -SODIUM_EXPORT -size_t crypto_core_salsa2012_inputbytes(void); - -#define crypto_core_salsa2012_KEYBYTES 32U -SODIUM_EXPORT -size_t crypto_core_salsa2012_keybytes(void); - -#define crypto_core_salsa2012_CONSTBYTES 16U -SODIUM_EXPORT -size_t crypto_core_salsa2012_constbytes(void); - -SODIUM_EXPORT -int crypto_core_salsa2012(unsigned char *out, const unsigned char *in, - const unsigned char *k, const unsigned char *c) - __attribute__ ((nonnull(1, 2, 3))); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_core_salsa208.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_core_salsa208.h deleted file mode 100644 index d2f216af..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_core_salsa208.h +++ /dev/null @@ -1,40 +0,0 @@ -#ifndef crypto_core_salsa208_H -#define crypto_core_salsa208_H - -#include -#include "export.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#define crypto_core_salsa208_OUTPUTBYTES 64U -SODIUM_EXPORT -size_t crypto_core_salsa208_outputbytes(void) - __attribute__ ((deprecated)); - -#define crypto_core_salsa208_INPUTBYTES 16U -SODIUM_EXPORT -size_t crypto_core_salsa208_inputbytes(void) - __attribute__ ((deprecated)); - -#define crypto_core_salsa208_KEYBYTES 32U -SODIUM_EXPORT -size_t crypto_core_salsa208_keybytes(void) - __attribute__ ((deprecated)); - -#define crypto_core_salsa208_CONSTBYTES 16U -SODIUM_EXPORT -size_t crypto_core_salsa208_constbytes(void) - __attribute__ ((deprecated)); - -SODIUM_EXPORT -int crypto_core_salsa208(unsigned char *out, const unsigned char *in, - const unsigned char *k, const unsigned char *c) - __attribute__ ((nonnull(1, 2, 3))); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_generichash.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_generichash.h deleted file mode 100644 index d897e5d2..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_generichash.h +++ /dev/null @@ -1,84 +0,0 @@ -#ifndef crypto_generichash_H -#define crypto_generichash_H - -#include - -#include "crypto_generichash_blake2b.h" -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -#define crypto_generichash_BYTES_MIN crypto_generichash_blake2b_BYTES_MIN -SODIUM_EXPORT -size_t crypto_generichash_bytes_min(void); - -#define crypto_generichash_BYTES_MAX crypto_generichash_blake2b_BYTES_MAX -SODIUM_EXPORT -size_t crypto_generichash_bytes_max(void); - -#define crypto_generichash_BYTES crypto_generichash_blake2b_BYTES -SODIUM_EXPORT -size_t crypto_generichash_bytes(void); - -#define crypto_generichash_KEYBYTES_MIN crypto_generichash_blake2b_KEYBYTES_MIN -SODIUM_EXPORT -size_t crypto_generichash_keybytes_min(void); - -#define crypto_generichash_KEYBYTES_MAX crypto_generichash_blake2b_KEYBYTES_MAX -SODIUM_EXPORT -size_t crypto_generichash_keybytes_max(void); - -#define crypto_generichash_KEYBYTES crypto_generichash_blake2b_KEYBYTES -SODIUM_EXPORT -size_t crypto_generichash_keybytes(void); - -#define crypto_generichash_PRIMITIVE "blake2b" -SODIUM_EXPORT -const char *crypto_generichash_primitive(void); - -/* - * Important when writing bindings for other programming languages: - * the state address should be 64-bytes aligned. - */ -typedef crypto_generichash_blake2b_state crypto_generichash_state; - -SODIUM_EXPORT -size_t crypto_generichash_statebytes(void); - -SODIUM_EXPORT -int crypto_generichash(unsigned char *out, size_t outlen, - const unsigned char *in, unsigned long long inlen, - const unsigned char *key, size_t keylen) - __attribute__ ((nonnull(1))); - -SODIUM_EXPORT -int crypto_generichash_init(crypto_generichash_state *state, - const unsigned char *key, - const size_t keylen, const size_t outlen) - __attribute__ ((nonnull(1))); - -SODIUM_EXPORT -int crypto_generichash_update(crypto_generichash_state *state, - const unsigned char *in, - unsigned long long inlen) - __attribute__ ((nonnull(1))); - -SODIUM_EXPORT -int crypto_generichash_final(crypto_generichash_state *state, - unsigned char *out, const size_t outlen) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -void crypto_generichash_keygen(unsigned char k[crypto_generichash_KEYBYTES]) - __attribute__ ((nonnull)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_generichash_blake2b.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_generichash_blake2b.h deleted file mode 100644 index ae3b52f7..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_generichash_blake2b.h +++ /dev/null @@ -1,122 +0,0 @@ -#ifndef crypto_generichash_blake2b_H -#define crypto_generichash_blake2b_H - -#include -#include -#include - -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -#ifdef __IBMC__ -# pragma pack(1) -#elif defined(__SUNPRO_C) || defined(__SUNPRO_CC) -# pragma pack(1) -#else -# pragma pack(push, 1) -#endif - -typedef struct CRYPTO_ALIGN(64) crypto_generichash_blake2b_state { - unsigned char opaque[384]; -} crypto_generichash_blake2b_state; - -#ifdef __IBMC__ -# pragma pack(pop) -#elif defined(__SUNPRO_C) || defined(__SUNPRO_CC) -# pragma pack() -#else -# pragma pack(pop) -#endif - -#define crypto_generichash_blake2b_BYTES_MIN 16U -SODIUM_EXPORT -size_t crypto_generichash_blake2b_bytes_min(void); - -#define crypto_generichash_blake2b_BYTES_MAX 64U -SODIUM_EXPORT -size_t crypto_generichash_blake2b_bytes_max(void); - -#define crypto_generichash_blake2b_BYTES 32U -SODIUM_EXPORT -size_t crypto_generichash_blake2b_bytes(void); - -#define crypto_generichash_blake2b_KEYBYTES_MIN 16U -SODIUM_EXPORT -size_t crypto_generichash_blake2b_keybytes_min(void); - -#define crypto_generichash_blake2b_KEYBYTES_MAX 64U -SODIUM_EXPORT -size_t crypto_generichash_blake2b_keybytes_max(void); - -#define crypto_generichash_blake2b_KEYBYTES 32U -SODIUM_EXPORT -size_t crypto_generichash_blake2b_keybytes(void); - -#define crypto_generichash_blake2b_SALTBYTES 16U -SODIUM_EXPORT -size_t crypto_generichash_blake2b_saltbytes(void); - -#define crypto_generichash_blake2b_PERSONALBYTES 16U -SODIUM_EXPORT -size_t crypto_generichash_blake2b_personalbytes(void); - -SODIUM_EXPORT -size_t crypto_generichash_blake2b_statebytes(void); - -SODIUM_EXPORT -int crypto_generichash_blake2b(unsigned char *out, size_t outlen, - const unsigned char *in, - unsigned long long inlen, - const unsigned char *key, size_t keylen) - __attribute__ ((nonnull(1))); - -SODIUM_EXPORT -int crypto_generichash_blake2b_salt_personal(unsigned char *out, size_t outlen, - const unsigned char *in, - unsigned long long inlen, - const unsigned char *key, - size_t keylen, - const unsigned char *salt, - const unsigned char *personal) - __attribute__ ((nonnull(1))); - -SODIUM_EXPORT -int crypto_generichash_blake2b_init(crypto_generichash_blake2b_state *state, - const unsigned char *key, - const size_t keylen, const size_t outlen) - __attribute__ ((nonnull(1))); - -SODIUM_EXPORT -int crypto_generichash_blake2b_init_salt_personal(crypto_generichash_blake2b_state *state, - const unsigned char *key, - const size_t keylen, const size_t outlen, - const unsigned char *salt, - const unsigned char *personal) - __attribute__ ((nonnull(1))); - -SODIUM_EXPORT -int crypto_generichash_blake2b_update(crypto_generichash_blake2b_state *state, - const unsigned char *in, - unsigned long long inlen) - __attribute__ ((nonnull(1))); - -SODIUM_EXPORT -int crypto_generichash_blake2b_final(crypto_generichash_blake2b_state *state, - unsigned char *out, - const size_t outlen) __attribute__ ((nonnull)); - -SODIUM_EXPORT -void crypto_generichash_blake2b_keygen(unsigned char k[crypto_generichash_blake2b_KEYBYTES]) - __attribute__ ((nonnull)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_hash.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_hash.h deleted file mode 100644 index 767d5480..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_hash.h +++ /dev/null @@ -1,40 +0,0 @@ -#ifndef crypto_hash_H -#define crypto_hash_H - -/* - * WARNING: Unless you absolutely need to use SHA512 for interoperability, - * purposes, you might want to consider crypto_generichash() instead. - * Unlike SHA512, crypto_generichash() is not vulnerable to length - * extension attacks. - */ - -#include - -#include "crypto_hash_sha512.h" -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -#define crypto_hash_BYTES crypto_hash_sha512_BYTES -SODIUM_EXPORT -size_t crypto_hash_bytes(void); - -SODIUM_EXPORT -int crypto_hash(unsigned char *out, const unsigned char *in, - unsigned long long inlen) __attribute__ ((nonnull(1))); - -#define crypto_hash_PRIMITIVE "sha512" -SODIUM_EXPORT -const char *crypto_hash_primitive(void) - __attribute__ ((warn_unused_result)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_hash_sha256.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_hash_sha256.h deleted file mode 100644 index c47982af..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_hash_sha256.h +++ /dev/null @@ -1,60 +0,0 @@ -#ifndef crypto_hash_sha256_H -#define crypto_hash_sha256_H - -/* - * WARNING: Unless you absolutely need to use SHA256 for interoperability, - * purposes, you might want to consider crypto_generichash() instead. - * Unlike SHA256, crypto_generichash() is not vulnerable to length - * extension attacks. - */ - -#include -#include -#include - -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -typedef struct crypto_hash_sha256_state { - uint32_t state[8]; - uint64_t count; - uint8_t buf[64]; -} crypto_hash_sha256_state; - -SODIUM_EXPORT -size_t crypto_hash_sha256_statebytes(void); - -#define crypto_hash_sha256_BYTES 32U -SODIUM_EXPORT -size_t crypto_hash_sha256_bytes(void); - -SODIUM_EXPORT -int crypto_hash_sha256(unsigned char *out, const unsigned char *in, - unsigned long long inlen) __attribute__ ((nonnull(1))); - -SODIUM_EXPORT -int crypto_hash_sha256_init(crypto_hash_sha256_state *state) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_hash_sha256_update(crypto_hash_sha256_state *state, - const unsigned char *in, - unsigned long long inlen) - __attribute__ ((nonnull(1))); - -SODIUM_EXPORT -int crypto_hash_sha256_final(crypto_hash_sha256_state *state, - unsigned char *out) - __attribute__ ((nonnull)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_hash_sha512.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_hash_sha512.h deleted file mode 100644 index 5b690fb2..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_hash_sha512.h +++ /dev/null @@ -1,60 +0,0 @@ -#ifndef crypto_hash_sha512_H -#define crypto_hash_sha512_H - -/* - * WARNING: Unless you absolutely need to use SHA512 for interoperability, - * purposes, you might want to consider crypto_generichash() instead. - * Unlike SHA512, crypto_generichash() is not vulnerable to length - * extension attacks. - */ - -#include -#include -#include - -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -typedef struct crypto_hash_sha512_state { - uint64_t state[8]; - uint64_t count[2]; - uint8_t buf[128]; -} crypto_hash_sha512_state; - -SODIUM_EXPORT -size_t crypto_hash_sha512_statebytes(void); - -#define crypto_hash_sha512_BYTES 64U -SODIUM_EXPORT -size_t crypto_hash_sha512_bytes(void); - -SODIUM_EXPORT -int crypto_hash_sha512(unsigned char *out, const unsigned char *in, - unsigned long long inlen) __attribute__ ((nonnull(1))); - -SODIUM_EXPORT -int crypto_hash_sha512_init(crypto_hash_sha512_state *state) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_hash_sha512_update(crypto_hash_sha512_state *state, - const unsigned char *in, - unsigned long long inlen) - __attribute__ ((nonnull(1))); - -SODIUM_EXPORT -int crypto_hash_sha512_final(crypto_hash_sha512_state *state, - unsigned char *out) - __attribute__ ((nonnull)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_kdf.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_kdf.h deleted file mode 100644 index ac2fc618..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_kdf.h +++ /dev/null @@ -1,53 +0,0 @@ -#ifndef crypto_kdf_H -#define crypto_kdf_H - -#include -#include - -#include "crypto_kdf_blake2b.h" -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -#define crypto_kdf_BYTES_MIN crypto_kdf_blake2b_BYTES_MIN -SODIUM_EXPORT -size_t crypto_kdf_bytes_min(void); - -#define crypto_kdf_BYTES_MAX crypto_kdf_blake2b_BYTES_MAX -SODIUM_EXPORT -size_t crypto_kdf_bytes_max(void); - -#define crypto_kdf_CONTEXTBYTES crypto_kdf_blake2b_CONTEXTBYTES -SODIUM_EXPORT -size_t crypto_kdf_contextbytes(void); - -#define crypto_kdf_KEYBYTES crypto_kdf_blake2b_KEYBYTES -SODIUM_EXPORT -size_t crypto_kdf_keybytes(void); - -#define crypto_kdf_PRIMITIVE "blake2b" -SODIUM_EXPORT -const char *crypto_kdf_primitive(void) - __attribute__ ((warn_unused_result)); - -SODIUM_EXPORT -int crypto_kdf_derive_from_key(unsigned char *subkey, size_t subkey_len, - uint64_t subkey_id, - const char ctx[crypto_kdf_CONTEXTBYTES], - const unsigned char key[crypto_kdf_KEYBYTES]) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -void crypto_kdf_keygen(unsigned char k[crypto_kdf_KEYBYTES]) - __attribute__ ((nonnull)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_kdf_blake2b.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_kdf_blake2b.h deleted file mode 100644 index 489c7c20..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_kdf_blake2b.h +++ /dev/null @@ -1,44 +0,0 @@ -#ifndef crypto_kdf_blake2b_H -#define crypto_kdf_blake2b_H - -#include -#include -#include - -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -#define crypto_kdf_blake2b_BYTES_MIN 16 -SODIUM_EXPORT -size_t crypto_kdf_blake2b_bytes_min(void); - -#define crypto_kdf_blake2b_BYTES_MAX 64 -SODIUM_EXPORT -size_t crypto_kdf_blake2b_bytes_max(void); - -#define crypto_kdf_blake2b_CONTEXTBYTES 8 -SODIUM_EXPORT -size_t crypto_kdf_blake2b_contextbytes(void); - -#define crypto_kdf_blake2b_KEYBYTES 32 -SODIUM_EXPORT -size_t crypto_kdf_blake2b_keybytes(void); - -SODIUM_EXPORT -int crypto_kdf_blake2b_derive_from_key(unsigned char *subkey, size_t subkey_len, - uint64_t subkey_id, - const char ctx[crypto_kdf_blake2b_CONTEXTBYTES], - const unsigned char key[crypto_kdf_blake2b_KEYBYTES]) - __attribute__ ((nonnull)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_kdf_hkdf_sha256.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_kdf_hkdf_sha256.h deleted file mode 100644 index 899a6316..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_kdf_hkdf_sha256.h +++ /dev/null @@ -1,48 +0,0 @@ -#ifndef crypto_kdf_hkdf_sha256_H -#define crypto_kdf_hkdf_sha256_H - -#include -#include -#include - -#include "crypto_kdf.h" -#include "crypto_auth_hmacsha256.h" -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -#define crypto_kdf_hkdf_sha256_KEYBYTES crypto_auth_hmacsha256_BYTES -SODIUM_EXPORT -size_t crypto_kdf_hkdf_sha256_keybytes(void); - -#define crypto_kdf_hkdf_sha256_BYTES_MIN 0U -SODIUM_EXPORT -size_t crypto_kdf_hkdf_sha256_bytes_min(void); - -#define crypto_kdf_hkdf_sha256_BYTES_MAX (0xff * crypto_auth_hmacsha256_BYTES) -SODIUM_EXPORT -size_t crypto_kdf_hkdf_sha256_bytes_max(void); - -SODIUM_EXPORT -int crypto_kdf_hkdf_sha256_extract(unsigned char prk[crypto_kdf_hkdf_sha256_KEYBYTES], - const unsigned char *salt, size_t salt_len, - const unsigned char *ikm, size_t ikm_len); - -SODIUM_EXPORT -void crypto_kdf_hkdf_sha256_keygen(unsigned char prk[crypto_kdf_hkdf_sha256_KEYBYTES]); - -SODIUM_EXPORT -int crypto_kdf_hkdf_sha256_expand(unsigned char *out, size_t out_len, - const char *ctx, size_t ctx_len, - const unsigned char prk[crypto_kdf_hkdf_sha256_KEYBYTES]); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_kdf_hkdf_sha512.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_kdf_hkdf_sha512.h deleted file mode 100644 index 3fa6868c..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_kdf_hkdf_sha512.h +++ /dev/null @@ -1,51 +0,0 @@ -#ifndef crypto_kdf_hkdf_sha512_H -#define crypto_kdf_hkdf_sha512_H - -#include -#include -#include - -#include "crypto_kdf.h" -#include "crypto_auth_hmacsha512.h" -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -#define crypto_kdf_hkdf_sha512_KEYBYTES crypto_auth_hmacsha512_BYTES -SODIUM_EXPORT -size_t crypto_kdf_hkdf_sha512_keybytes(void); - -#define crypto_kdf_hkdf_sha512_BYTES_MIN 0U -SODIUM_EXPORT -size_t crypto_kdf_hkdf_sha512_bytes_min(void); - -#define crypto_kdf_hkdf_sha512_BYTES_MAX (0xff * crypto_auth_hmacsha512_BYTES) -SODIUM_EXPORT -size_t crypto_kdf_hkdf_sha512_bytes_max(void); - -SODIUM_EXPORT -int crypto_kdf_hkdf_sha512_extract(unsigned char prk[crypto_kdf_hkdf_sha512_KEYBYTES], - const unsigned char *salt, size_t salt_len, - const unsigned char *ikm, size_t ikm_len) - __attribute__ ((nonnull(1))); - -SODIUM_EXPORT -void crypto_kdf_hkdf_sha512_keygen(unsigned char prk[crypto_kdf_hkdf_sha512_KEYBYTES]) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_kdf_hkdf_sha512_expand(unsigned char *out, size_t out_len, - const char *ctx, size_t ctx_len, - const unsigned char prk[crypto_kdf_hkdf_sha512_KEYBYTES]) - __attribute__ ((nonnull(1))); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_kx.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_kx.h deleted file mode 100644 index 347132c3..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_kx.h +++ /dev/null @@ -1,66 +0,0 @@ -#ifndef crypto_kx_H -#define crypto_kx_H - -#include - -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -#define crypto_kx_PUBLICKEYBYTES 32 -SODIUM_EXPORT -size_t crypto_kx_publickeybytes(void); - -#define crypto_kx_SECRETKEYBYTES 32 -SODIUM_EXPORT -size_t crypto_kx_secretkeybytes(void); - -#define crypto_kx_SEEDBYTES 32 -SODIUM_EXPORT -size_t crypto_kx_seedbytes(void); - -#define crypto_kx_SESSIONKEYBYTES 32 -SODIUM_EXPORT -size_t crypto_kx_sessionkeybytes(void); - -#define crypto_kx_PRIMITIVE "x25519blake2b" -SODIUM_EXPORT -const char *crypto_kx_primitive(void); - -SODIUM_EXPORT -int crypto_kx_seed_keypair(unsigned char pk[crypto_kx_PUBLICKEYBYTES], - unsigned char sk[crypto_kx_SECRETKEYBYTES], - const unsigned char seed[crypto_kx_SEEDBYTES]) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_kx_keypair(unsigned char pk[crypto_kx_PUBLICKEYBYTES], - unsigned char sk[crypto_kx_SECRETKEYBYTES]) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_kx_client_session_keys(unsigned char rx[crypto_kx_SESSIONKEYBYTES], - unsigned char tx[crypto_kx_SESSIONKEYBYTES], - const unsigned char client_pk[crypto_kx_PUBLICKEYBYTES], - const unsigned char client_sk[crypto_kx_SECRETKEYBYTES], - const unsigned char server_pk[crypto_kx_PUBLICKEYBYTES]) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(3, 4, 5))); - -SODIUM_EXPORT -int crypto_kx_server_session_keys(unsigned char rx[crypto_kx_SESSIONKEYBYTES], - unsigned char tx[crypto_kx_SESSIONKEYBYTES], - const unsigned char server_pk[crypto_kx_PUBLICKEYBYTES], - const unsigned char server_sk[crypto_kx_SECRETKEYBYTES], - const unsigned char client_pk[crypto_kx_PUBLICKEYBYTES]) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(3, 4, 5))); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_onetimeauth.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_onetimeauth.h deleted file mode 100644 index 7cd7b070..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_onetimeauth.h +++ /dev/null @@ -1,65 +0,0 @@ -#ifndef crypto_onetimeauth_H -#define crypto_onetimeauth_H - -#include - -#include "crypto_onetimeauth_poly1305.h" -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -typedef crypto_onetimeauth_poly1305_state crypto_onetimeauth_state; - -SODIUM_EXPORT -size_t crypto_onetimeauth_statebytes(void); - -#define crypto_onetimeauth_BYTES crypto_onetimeauth_poly1305_BYTES -SODIUM_EXPORT -size_t crypto_onetimeauth_bytes(void); - -#define crypto_onetimeauth_KEYBYTES crypto_onetimeauth_poly1305_KEYBYTES -SODIUM_EXPORT -size_t crypto_onetimeauth_keybytes(void); - -#define crypto_onetimeauth_PRIMITIVE "poly1305" -SODIUM_EXPORT -const char *crypto_onetimeauth_primitive(void); - -SODIUM_EXPORT -int crypto_onetimeauth(unsigned char *out, const unsigned char *in, - unsigned long long inlen, const unsigned char *k) - __attribute__ ((nonnull(1, 4))); - -SODIUM_EXPORT -int crypto_onetimeauth_verify(const unsigned char *h, const unsigned char *in, - unsigned long long inlen, const unsigned char *k) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(1, 4))); - -SODIUM_EXPORT -int crypto_onetimeauth_init(crypto_onetimeauth_state *state, - const unsigned char *key) __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_onetimeauth_update(crypto_onetimeauth_state *state, - const unsigned char *in, - unsigned long long inlen) - __attribute__ ((nonnull(1))); - -SODIUM_EXPORT -int crypto_onetimeauth_final(crypto_onetimeauth_state *state, - unsigned char *out) __attribute__ ((nonnull)); - -SODIUM_EXPORT -void crypto_onetimeauth_keygen(unsigned char k[crypto_onetimeauth_KEYBYTES]) - __attribute__ ((nonnull)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_onetimeauth_poly1305.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_onetimeauth_poly1305.h deleted file mode 100644 index f3e34d86..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_onetimeauth_poly1305.h +++ /dev/null @@ -1,72 +0,0 @@ -#ifndef crypto_onetimeauth_poly1305_H -#define crypto_onetimeauth_poly1305_H - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -#include -#include -#include - -#include - -#include "export.h" - -typedef struct CRYPTO_ALIGN(16) crypto_onetimeauth_poly1305_state { - unsigned char opaque[256]; -} crypto_onetimeauth_poly1305_state; - -SODIUM_EXPORT -size_t crypto_onetimeauth_poly1305_statebytes(void); - -#define crypto_onetimeauth_poly1305_BYTES 16U -SODIUM_EXPORT -size_t crypto_onetimeauth_poly1305_bytes(void); - -#define crypto_onetimeauth_poly1305_KEYBYTES 32U -SODIUM_EXPORT -size_t crypto_onetimeauth_poly1305_keybytes(void); - -SODIUM_EXPORT -int crypto_onetimeauth_poly1305(unsigned char *out, - const unsigned char *in, - unsigned long long inlen, - const unsigned char *k) - __attribute__ ((nonnull(1, 4))); - -SODIUM_EXPORT -int crypto_onetimeauth_poly1305_verify(const unsigned char *h, - const unsigned char *in, - unsigned long long inlen, - const unsigned char *k) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(1, 4))); - -SODIUM_EXPORT -int crypto_onetimeauth_poly1305_init(crypto_onetimeauth_poly1305_state *state, - const unsigned char *key) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_onetimeauth_poly1305_update(crypto_onetimeauth_poly1305_state *state, - const unsigned char *in, - unsigned long long inlen) - __attribute__ ((nonnull(1))); - -SODIUM_EXPORT -int crypto_onetimeauth_poly1305_final(crypto_onetimeauth_poly1305_state *state, - unsigned char *out) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -void crypto_onetimeauth_poly1305_keygen(unsigned char k[crypto_onetimeauth_poly1305_KEYBYTES]) - __attribute__ ((nonnull)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_pwhash.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_pwhash.h deleted file mode 100644 index 307265d3..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_pwhash.h +++ /dev/null @@ -1,147 +0,0 @@ -#ifndef crypto_pwhash_H -#define crypto_pwhash_H - -#include - -#include "crypto_pwhash_argon2i.h" -#include "crypto_pwhash_argon2id.h" -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -#define crypto_pwhash_ALG_ARGON2I13 crypto_pwhash_argon2i_ALG_ARGON2I13 -SODIUM_EXPORT -int crypto_pwhash_alg_argon2i13(void); - -#define crypto_pwhash_ALG_ARGON2ID13 crypto_pwhash_argon2id_ALG_ARGON2ID13 -SODIUM_EXPORT -int crypto_pwhash_alg_argon2id13(void); - -#define crypto_pwhash_ALG_DEFAULT crypto_pwhash_ALG_ARGON2ID13 -SODIUM_EXPORT -int crypto_pwhash_alg_default(void); - -#define crypto_pwhash_BYTES_MIN crypto_pwhash_argon2id_BYTES_MIN -SODIUM_EXPORT -size_t crypto_pwhash_bytes_min(void); - -#define crypto_pwhash_BYTES_MAX crypto_pwhash_argon2id_BYTES_MAX -SODIUM_EXPORT -size_t crypto_pwhash_bytes_max(void); - -#define crypto_pwhash_PASSWD_MIN crypto_pwhash_argon2id_PASSWD_MIN -SODIUM_EXPORT -size_t crypto_pwhash_passwd_min(void); - -#define crypto_pwhash_PASSWD_MAX crypto_pwhash_argon2id_PASSWD_MAX -SODIUM_EXPORT -size_t crypto_pwhash_passwd_max(void); - -#define crypto_pwhash_SALTBYTES crypto_pwhash_argon2id_SALTBYTES -SODIUM_EXPORT -size_t crypto_pwhash_saltbytes(void); - -#define crypto_pwhash_STRBYTES crypto_pwhash_argon2id_STRBYTES -SODIUM_EXPORT -size_t crypto_pwhash_strbytes(void); - -#define crypto_pwhash_STRPREFIX crypto_pwhash_argon2id_STRPREFIX -SODIUM_EXPORT -const char *crypto_pwhash_strprefix(void); - -#define crypto_pwhash_OPSLIMIT_MIN crypto_pwhash_argon2id_OPSLIMIT_MIN -SODIUM_EXPORT -unsigned long long crypto_pwhash_opslimit_min(void); - -#define crypto_pwhash_OPSLIMIT_MAX crypto_pwhash_argon2id_OPSLIMIT_MAX -SODIUM_EXPORT -unsigned long long crypto_pwhash_opslimit_max(void); - -#define crypto_pwhash_MEMLIMIT_MIN crypto_pwhash_argon2id_MEMLIMIT_MIN -SODIUM_EXPORT -size_t crypto_pwhash_memlimit_min(void); - -#define crypto_pwhash_MEMLIMIT_MAX crypto_pwhash_argon2id_MEMLIMIT_MAX -SODIUM_EXPORT -size_t crypto_pwhash_memlimit_max(void); - -#define crypto_pwhash_OPSLIMIT_INTERACTIVE crypto_pwhash_argon2id_OPSLIMIT_INTERACTIVE -SODIUM_EXPORT -unsigned long long crypto_pwhash_opslimit_interactive(void); - -#define crypto_pwhash_MEMLIMIT_INTERACTIVE crypto_pwhash_argon2id_MEMLIMIT_INTERACTIVE -SODIUM_EXPORT -size_t crypto_pwhash_memlimit_interactive(void); - -#define crypto_pwhash_OPSLIMIT_MODERATE crypto_pwhash_argon2id_OPSLIMIT_MODERATE -SODIUM_EXPORT -unsigned long long crypto_pwhash_opslimit_moderate(void); - -#define crypto_pwhash_MEMLIMIT_MODERATE crypto_pwhash_argon2id_MEMLIMIT_MODERATE -SODIUM_EXPORT -size_t crypto_pwhash_memlimit_moderate(void); - -#define crypto_pwhash_OPSLIMIT_SENSITIVE crypto_pwhash_argon2id_OPSLIMIT_SENSITIVE -SODIUM_EXPORT -unsigned long long crypto_pwhash_opslimit_sensitive(void); - -#define crypto_pwhash_MEMLIMIT_SENSITIVE crypto_pwhash_argon2id_MEMLIMIT_SENSITIVE -SODIUM_EXPORT -size_t crypto_pwhash_memlimit_sensitive(void); - -/* - * With this function, do not forget to store all parameters, including the - * algorithm identifier in order to produce deterministic output. - * The crypto_pwhash_* definitions, including crypto_pwhash_ALG_DEFAULT, - * may change. - */ -SODIUM_EXPORT -int crypto_pwhash(unsigned char * const out, unsigned long long outlen, - const char * const passwd, unsigned long long passwdlen, - const unsigned char * const salt, - unsigned long long opslimit, size_t memlimit, int alg) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull)); - -/* - * The output string already includes all the required parameters, including - * the algorithm identifier. The string is all that has to be stored in - * order to verify a password. - */ -SODIUM_EXPORT -int crypto_pwhash_str(char out[crypto_pwhash_STRBYTES], - const char * const passwd, unsigned long long passwdlen, - unsigned long long opslimit, size_t memlimit) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_pwhash_str_alg(char out[crypto_pwhash_STRBYTES], - const char * const passwd, unsigned long long passwdlen, - unsigned long long opslimit, size_t memlimit, int alg) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_pwhash_str_verify(const char *str, - const char * const passwd, - unsigned long long passwdlen) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_pwhash_str_needs_rehash(const char *str, - unsigned long long opslimit, size_t memlimit) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull)); - -#define crypto_pwhash_PRIMITIVE "argon2i" -SODIUM_EXPORT -const char *crypto_pwhash_primitive(void) - __attribute__ ((warn_unused_result)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_pwhash_argon2i.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_pwhash_argon2i.h deleted file mode 100644 index 91156ba0..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_pwhash_argon2i.h +++ /dev/null @@ -1,122 +0,0 @@ -#ifndef crypto_pwhash_argon2i_H -#define crypto_pwhash_argon2i_H - -#include -#include -#include - -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -#define crypto_pwhash_argon2i_ALG_ARGON2I13 1 -SODIUM_EXPORT -int crypto_pwhash_argon2i_alg_argon2i13(void); - -#define crypto_pwhash_argon2i_BYTES_MIN 16U -SODIUM_EXPORT -size_t crypto_pwhash_argon2i_bytes_min(void); - -#define crypto_pwhash_argon2i_BYTES_MAX SODIUM_MIN(SODIUM_SIZE_MAX, 4294967295U) -SODIUM_EXPORT -size_t crypto_pwhash_argon2i_bytes_max(void); - -#define crypto_pwhash_argon2i_PASSWD_MIN 0U -SODIUM_EXPORT -size_t crypto_pwhash_argon2i_passwd_min(void); - -#define crypto_pwhash_argon2i_PASSWD_MAX 4294967295U -SODIUM_EXPORT -size_t crypto_pwhash_argon2i_passwd_max(void); - -#define crypto_pwhash_argon2i_SALTBYTES 16U -SODIUM_EXPORT -size_t crypto_pwhash_argon2i_saltbytes(void); - -#define crypto_pwhash_argon2i_STRBYTES 128U -SODIUM_EXPORT -size_t crypto_pwhash_argon2i_strbytes(void); - -#define crypto_pwhash_argon2i_STRPREFIX "$argon2i$" -SODIUM_EXPORT -const char *crypto_pwhash_argon2i_strprefix(void); - -#define crypto_pwhash_argon2i_OPSLIMIT_MIN 3U -SODIUM_EXPORT -unsigned long long crypto_pwhash_argon2i_opslimit_min(void); - -#define crypto_pwhash_argon2i_OPSLIMIT_MAX 4294967295U -SODIUM_EXPORT -unsigned long long crypto_pwhash_argon2i_opslimit_max(void); - -#define crypto_pwhash_argon2i_MEMLIMIT_MIN 8192U -SODIUM_EXPORT -size_t crypto_pwhash_argon2i_memlimit_min(void); - -#define crypto_pwhash_argon2i_MEMLIMIT_MAX \ - ((SIZE_MAX >= 4398046510080U) ? 4398046510080U : (SIZE_MAX >= 2147483648U) ? 2147483648U : 32768U) -SODIUM_EXPORT -size_t crypto_pwhash_argon2i_memlimit_max(void); - -#define crypto_pwhash_argon2i_OPSLIMIT_INTERACTIVE 4U -SODIUM_EXPORT -unsigned long long crypto_pwhash_argon2i_opslimit_interactive(void); - -#define crypto_pwhash_argon2i_MEMLIMIT_INTERACTIVE 33554432U -SODIUM_EXPORT -size_t crypto_pwhash_argon2i_memlimit_interactive(void); - -#define crypto_pwhash_argon2i_OPSLIMIT_MODERATE 6U -SODIUM_EXPORT -unsigned long long crypto_pwhash_argon2i_opslimit_moderate(void); - -#define crypto_pwhash_argon2i_MEMLIMIT_MODERATE 134217728U -SODIUM_EXPORT -size_t crypto_pwhash_argon2i_memlimit_moderate(void); - -#define crypto_pwhash_argon2i_OPSLIMIT_SENSITIVE 8U -SODIUM_EXPORT -unsigned long long crypto_pwhash_argon2i_opslimit_sensitive(void); - -#define crypto_pwhash_argon2i_MEMLIMIT_SENSITIVE 536870912U -SODIUM_EXPORT -size_t crypto_pwhash_argon2i_memlimit_sensitive(void); - -SODIUM_EXPORT -int crypto_pwhash_argon2i(unsigned char * const out, - unsigned long long outlen, - const char * const passwd, - unsigned long long passwdlen, - const unsigned char * const salt, - unsigned long long opslimit, size_t memlimit, - int alg) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_pwhash_argon2i_str(char out[crypto_pwhash_argon2i_STRBYTES], - const char * const passwd, - unsigned long long passwdlen, - unsigned long long opslimit, size_t memlimit) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_pwhash_argon2i_str_verify(const char * str, - const char * const passwd, - unsigned long long passwdlen) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_pwhash_argon2i_str_needs_rehash(const char * str, - unsigned long long opslimit, size_t memlimit) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_pwhash_argon2id.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_pwhash_argon2id.h deleted file mode 100644 index e6f72a92..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_pwhash_argon2id.h +++ /dev/null @@ -1,122 +0,0 @@ -#ifndef crypto_pwhash_argon2id_H -#define crypto_pwhash_argon2id_H - -#include -#include -#include - -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -#define crypto_pwhash_argon2id_ALG_ARGON2ID13 2 -SODIUM_EXPORT -int crypto_pwhash_argon2id_alg_argon2id13(void); - -#define crypto_pwhash_argon2id_BYTES_MIN 16U -SODIUM_EXPORT -size_t crypto_pwhash_argon2id_bytes_min(void); - -#define crypto_pwhash_argon2id_BYTES_MAX SODIUM_MIN(SODIUM_SIZE_MAX, 4294967295U) -SODIUM_EXPORT -size_t crypto_pwhash_argon2id_bytes_max(void); - -#define crypto_pwhash_argon2id_PASSWD_MIN 0U -SODIUM_EXPORT -size_t crypto_pwhash_argon2id_passwd_min(void); - -#define crypto_pwhash_argon2id_PASSWD_MAX 4294967295U -SODIUM_EXPORT -size_t crypto_pwhash_argon2id_passwd_max(void); - -#define crypto_pwhash_argon2id_SALTBYTES 16U -SODIUM_EXPORT -size_t crypto_pwhash_argon2id_saltbytes(void); - -#define crypto_pwhash_argon2id_STRBYTES 128U -SODIUM_EXPORT -size_t crypto_pwhash_argon2id_strbytes(void); - -#define crypto_pwhash_argon2id_STRPREFIX "$argon2id$" -SODIUM_EXPORT -const char *crypto_pwhash_argon2id_strprefix(void); - -#define crypto_pwhash_argon2id_OPSLIMIT_MIN 1U -SODIUM_EXPORT -unsigned long long crypto_pwhash_argon2id_opslimit_min(void); - -#define crypto_pwhash_argon2id_OPSLIMIT_MAX 4294967295U -SODIUM_EXPORT -unsigned long long crypto_pwhash_argon2id_opslimit_max(void); - -#define crypto_pwhash_argon2id_MEMLIMIT_MIN 8192U -SODIUM_EXPORT -size_t crypto_pwhash_argon2id_memlimit_min(void); - -#define crypto_pwhash_argon2id_MEMLIMIT_MAX \ - ((SIZE_MAX >= 4398046510080U) ? 4398046510080U : (SIZE_MAX >= 2147483648U) ? 2147483648U : 32768U) -SODIUM_EXPORT -size_t crypto_pwhash_argon2id_memlimit_max(void); - -#define crypto_pwhash_argon2id_OPSLIMIT_INTERACTIVE 2U -SODIUM_EXPORT -unsigned long long crypto_pwhash_argon2id_opslimit_interactive(void); - -#define crypto_pwhash_argon2id_MEMLIMIT_INTERACTIVE 67108864U -SODIUM_EXPORT -size_t crypto_pwhash_argon2id_memlimit_interactive(void); - -#define crypto_pwhash_argon2id_OPSLIMIT_MODERATE 3U -SODIUM_EXPORT -unsigned long long crypto_pwhash_argon2id_opslimit_moderate(void); - -#define crypto_pwhash_argon2id_MEMLIMIT_MODERATE 268435456U -SODIUM_EXPORT -size_t crypto_pwhash_argon2id_memlimit_moderate(void); - -#define crypto_pwhash_argon2id_OPSLIMIT_SENSITIVE 4U -SODIUM_EXPORT -unsigned long long crypto_pwhash_argon2id_opslimit_sensitive(void); - -#define crypto_pwhash_argon2id_MEMLIMIT_SENSITIVE 1073741824U -SODIUM_EXPORT -size_t crypto_pwhash_argon2id_memlimit_sensitive(void); - -SODIUM_EXPORT -int crypto_pwhash_argon2id(unsigned char * const out, - unsigned long long outlen, - const char * const passwd, - unsigned long long passwdlen, - const unsigned char * const salt, - unsigned long long opslimit, size_t memlimit, - int alg) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_pwhash_argon2id_str(char out[crypto_pwhash_argon2id_STRBYTES], - const char * const passwd, - unsigned long long passwdlen, - unsigned long long opslimit, size_t memlimit) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_pwhash_argon2id_str_verify(const char * str, - const char * const passwd, - unsigned long long passwdlen) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_pwhash_argon2id_str_needs_rehash(const char * str, - unsigned long long opslimit, size_t memlimit) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_pwhash_scryptsalsa208sha256.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_pwhash_scryptsalsa208sha256.h deleted file mode 100644 index 1fd3692f..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_pwhash_scryptsalsa208sha256.h +++ /dev/null @@ -1,120 +0,0 @@ -#ifndef crypto_pwhash_scryptsalsa208sha256_H -#define crypto_pwhash_scryptsalsa208sha256_H - -#include -#include -#include - -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -#define crypto_pwhash_scryptsalsa208sha256_BYTES_MIN 16U -SODIUM_EXPORT -size_t crypto_pwhash_scryptsalsa208sha256_bytes_min(void); - -#define crypto_pwhash_scryptsalsa208sha256_BYTES_MAX \ - SODIUM_MIN(SODIUM_SIZE_MAX, 0x1fffffffe0ULL) -SODIUM_EXPORT -size_t crypto_pwhash_scryptsalsa208sha256_bytes_max(void); - -#define crypto_pwhash_scryptsalsa208sha256_PASSWD_MIN 0U -SODIUM_EXPORT -size_t crypto_pwhash_scryptsalsa208sha256_passwd_min(void); - -#define crypto_pwhash_scryptsalsa208sha256_PASSWD_MAX SODIUM_SIZE_MAX -SODIUM_EXPORT -size_t crypto_pwhash_scryptsalsa208sha256_passwd_max(void); - -#define crypto_pwhash_scryptsalsa208sha256_SALTBYTES 32U -SODIUM_EXPORT -size_t crypto_pwhash_scryptsalsa208sha256_saltbytes(void); - -#define crypto_pwhash_scryptsalsa208sha256_STRBYTES 102U -SODIUM_EXPORT -size_t crypto_pwhash_scryptsalsa208sha256_strbytes(void); - -#define crypto_pwhash_scryptsalsa208sha256_STRPREFIX "$7$" -SODIUM_EXPORT -const char *crypto_pwhash_scryptsalsa208sha256_strprefix(void); - -#define crypto_pwhash_scryptsalsa208sha256_OPSLIMIT_MIN 32768U -SODIUM_EXPORT -unsigned long long crypto_pwhash_scryptsalsa208sha256_opslimit_min(void); - -#define crypto_pwhash_scryptsalsa208sha256_OPSLIMIT_MAX 4294967295U -SODIUM_EXPORT -unsigned long long crypto_pwhash_scryptsalsa208sha256_opslimit_max(void); - -#define crypto_pwhash_scryptsalsa208sha256_MEMLIMIT_MIN 16777216U -SODIUM_EXPORT -size_t crypto_pwhash_scryptsalsa208sha256_memlimit_min(void); - -#define crypto_pwhash_scryptsalsa208sha256_MEMLIMIT_MAX \ - SODIUM_MIN(SIZE_MAX, 68719476736ULL) -SODIUM_EXPORT -size_t crypto_pwhash_scryptsalsa208sha256_memlimit_max(void); - -#define crypto_pwhash_scryptsalsa208sha256_OPSLIMIT_INTERACTIVE 524288U -SODIUM_EXPORT -unsigned long long crypto_pwhash_scryptsalsa208sha256_opslimit_interactive(void); - -#define crypto_pwhash_scryptsalsa208sha256_MEMLIMIT_INTERACTIVE 16777216U -SODIUM_EXPORT -size_t crypto_pwhash_scryptsalsa208sha256_memlimit_interactive(void); - -#define crypto_pwhash_scryptsalsa208sha256_OPSLIMIT_SENSITIVE 33554432U -SODIUM_EXPORT -unsigned long long crypto_pwhash_scryptsalsa208sha256_opslimit_sensitive(void); - -#define crypto_pwhash_scryptsalsa208sha256_MEMLIMIT_SENSITIVE 1073741824U -SODIUM_EXPORT -size_t crypto_pwhash_scryptsalsa208sha256_memlimit_sensitive(void); - -SODIUM_EXPORT -int crypto_pwhash_scryptsalsa208sha256(unsigned char * const out, - unsigned long long outlen, - const char * const passwd, - unsigned long long passwdlen, - const unsigned char * const salt, - unsigned long long opslimit, - size_t memlimit) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_pwhash_scryptsalsa208sha256_str(char out[crypto_pwhash_scryptsalsa208sha256_STRBYTES], - const char * const passwd, - unsigned long long passwdlen, - unsigned long long opslimit, - size_t memlimit) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_pwhash_scryptsalsa208sha256_str_verify(const char * str, - const char * const passwd, - unsigned long long passwdlen) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_pwhash_scryptsalsa208sha256_ll(const uint8_t * passwd, size_t passwdlen, - const uint8_t * salt, size_t saltlen, - uint64_t N, uint32_t r, uint32_t p, - uint8_t * buf, size_t buflen) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_pwhash_scryptsalsa208sha256_str_needs_rehash(const char * str, - unsigned long long opslimit, - size_t memlimit) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_scalarmult.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_scalarmult.h deleted file mode 100644 index 1c685853..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_scalarmult.h +++ /dev/null @@ -1,46 +0,0 @@ -#ifndef crypto_scalarmult_H -#define crypto_scalarmult_H - -#include - -#include "crypto_scalarmult_curve25519.h" -#include "export.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#define crypto_scalarmult_BYTES crypto_scalarmult_curve25519_BYTES -SODIUM_EXPORT -size_t crypto_scalarmult_bytes(void); - -#define crypto_scalarmult_SCALARBYTES crypto_scalarmult_curve25519_SCALARBYTES -SODIUM_EXPORT -size_t crypto_scalarmult_scalarbytes(void); - -#define crypto_scalarmult_PRIMITIVE "curve25519" -SODIUM_EXPORT -const char *crypto_scalarmult_primitive(void); - -SODIUM_EXPORT -int crypto_scalarmult_base(unsigned char *q, const unsigned char *n) - __attribute__ ((nonnull)); - -/* - * NOTE: Do not use the result of this function directly for key exchange. - * - * Hash the result with the public keys in order to compute a shared - * secret key: H(q || client_pk || server_pk) - * - * Or unless this is not an option, use the crypto_kx() API instead. - */ -SODIUM_EXPORT -int crypto_scalarmult(unsigned char *q, const unsigned char *n, - const unsigned char *p) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_scalarmult_curve25519.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_scalarmult_curve25519.h deleted file mode 100644 index 60e9d0c5..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_scalarmult_curve25519.h +++ /dev/null @@ -1,42 +0,0 @@ -#ifndef crypto_scalarmult_curve25519_H -#define crypto_scalarmult_curve25519_H - -#include - -#include "export.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#define crypto_scalarmult_curve25519_BYTES 32U -SODIUM_EXPORT -size_t crypto_scalarmult_curve25519_bytes(void); - -#define crypto_scalarmult_curve25519_SCALARBYTES 32U -SODIUM_EXPORT -size_t crypto_scalarmult_curve25519_scalarbytes(void); - -/* - * NOTE: Do not use the result of this function directly for key exchange. - * - * Hash the result with the public keys in order to compute a shared - * secret key: H(q || client_pk || server_pk) - * - * Or unless this is not an option, use the crypto_kx() API instead. - */ -SODIUM_EXPORT -int crypto_scalarmult_curve25519(unsigned char *q, const unsigned char *n, - const unsigned char *p) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_scalarmult_curve25519_base(unsigned char *q, - const unsigned char *n) - __attribute__ ((nonnull)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_scalarmult_ed25519.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_scalarmult_ed25519.h deleted file mode 100644 index 2dfa4d70..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_scalarmult_ed25519.h +++ /dev/null @@ -1,51 +0,0 @@ - -#ifndef crypto_scalarmult_ed25519_H -#define crypto_scalarmult_ed25519_H - -#include - -#include "export.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#define crypto_scalarmult_ed25519_BYTES 32U -SODIUM_EXPORT -size_t crypto_scalarmult_ed25519_bytes(void); - -#define crypto_scalarmult_ed25519_SCALARBYTES 32U -SODIUM_EXPORT -size_t crypto_scalarmult_ed25519_scalarbytes(void); - -/* - * NOTE: Do not use the result of this function directly for key exchange. - * - * Hash the result with the public keys in order to compute a shared - * secret key: H(q || client_pk || server_pk) - * - * Or unless this is not an option, use the crypto_kx() API instead. - */ -SODIUM_EXPORT -int crypto_scalarmult_ed25519(unsigned char *q, const unsigned char *n, - const unsigned char *p) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_scalarmult_ed25519_noclamp(unsigned char *q, const unsigned char *n, - const unsigned char *p) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_scalarmult_ed25519_base(unsigned char *q, const unsigned char *n) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_scalarmult_ed25519_base_noclamp(unsigned char *q, const unsigned char *n) - __attribute__ ((nonnull)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_scalarmult_ristretto255.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_scalarmult_ristretto255.h deleted file mode 100644 index 40a45cce..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_scalarmult_ristretto255.h +++ /dev/null @@ -1,43 +0,0 @@ - -#ifndef crypto_scalarmult_ristretto255_H -#define crypto_scalarmult_ristretto255_H - -#include - -#include "export.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#define crypto_scalarmult_ristretto255_BYTES 32U -SODIUM_EXPORT -size_t crypto_scalarmult_ristretto255_bytes(void); - -#define crypto_scalarmult_ristretto255_SCALARBYTES 32U -SODIUM_EXPORT -size_t crypto_scalarmult_ristretto255_scalarbytes(void); - -/* - * NOTE: Do not use the result of this function directly for key exchange. - * - * Hash the result with the public keys in order to compute a shared - * secret key: H(q || client_pk || server_pk) - * - * Or unless this is not an option, use the crypto_kx() API instead. - */ -SODIUM_EXPORT -int crypto_scalarmult_ristretto255(unsigned char *q, const unsigned char *n, - const unsigned char *p) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_scalarmult_ristretto255_base(unsigned char *q, - const unsigned char *n) - __attribute__ ((nonnull)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_secretbox.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_secretbox.h deleted file mode 100644 index 68024b45..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_secretbox.h +++ /dev/null @@ -1,94 +0,0 @@ -#ifndef crypto_secretbox_H -#define crypto_secretbox_H - -#include - -#include "crypto_secretbox_xsalsa20poly1305.h" -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -#define crypto_secretbox_KEYBYTES crypto_secretbox_xsalsa20poly1305_KEYBYTES -SODIUM_EXPORT -size_t crypto_secretbox_keybytes(void); - -#define crypto_secretbox_NONCEBYTES crypto_secretbox_xsalsa20poly1305_NONCEBYTES -SODIUM_EXPORT -size_t crypto_secretbox_noncebytes(void); - -#define crypto_secretbox_MACBYTES crypto_secretbox_xsalsa20poly1305_MACBYTES -SODIUM_EXPORT -size_t crypto_secretbox_macbytes(void); - -#define crypto_secretbox_PRIMITIVE "xsalsa20poly1305" -SODIUM_EXPORT -const char *crypto_secretbox_primitive(void); - -#define crypto_secretbox_MESSAGEBYTES_MAX crypto_secretbox_xsalsa20poly1305_MESSAGEBYTES_MAX -SODIUM_EXPORT -size_t crypto_secretbox_messagebytes_max(void); - -SODIUM_EXPORT -int crypto_secretbox_easy(unsigned char *c, const unsigned char *m, - unsigned long long mlen, const unsigned char *n, - const unsigned char *k) __attribute__ ((nonnull(1, 4, 5))); - -SODIUM_EXPORT -int crypto_secretbox_open_easy(unsigned char *m, const unsigned char *c, - unsigned long long clen, const unsigned char *n, - const unsigned char *k) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(2, 4, 5))); - -SODIUM_EXPORT -int crypto_secretbox_detached(unsigned char *c, unsigned char *mac, - const unsigned char *m, - unsigned long long mlen, - const unsigned char *n, - const unsigned char *k) - __attribute__ ((nonnull(1, 2, 5, 6))); - -SODIUM_EXPORT -int crypto_secretbox_open_detached(unsigned char *m, - const unsigned char *c, - const unsigned char *mac, - unsigned long long clen, - const unsigned char *n, - const unsigned char *k) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(2, 3, 5, 6))); - -SODIUM_EXPORT -void crypto_secretbox_keygen(unsigned char k[crypto_secretbox_KEYBYTES]) - __attribute__ ((nonnull)); - -/* -- NaCl compatibility interface ; Requires padding -- */ - -#define crypto_secretbox_ZEROBYTES crypto_secretbox_xsalsa20poly1305_ZEROBYTES -SODIUM_EXPORT -size_t crypto_secretbox_zerobytes(void) __attribute__ ((deprecated)); - -#define crypto_secretbox_BOXZEROBYTES crypto_secretbox_xsalsa20poly1305_BOXZEROBYTES -SODIUM_EXPORT -size_t crypto_secretbox_boxzerobytes(void) __attribute__ ((deprecated)); - -SODIUM_EXPORT -int crypto_secretbox(unsigned char *c, const unsigned char *m, - unsigned long long mlen, const unsigned char *n, - const unsigned char *k) - __attribute__ ((deprecated)) __attribute__ ((nonnull(1, 4, 5))); - -SODIUM_EXPORT -int crypto_secretbox_open(unsigned char *m, const unsigned char *c, - unsigned long long clen, const unsigned char *n, - const unsigned char *k) - __attribute__ ((deprecated)) __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(2, 4, 5))); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_secretbox_xchacha20poly1305.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_secretbox_xchacha20poly1305.h deleted file mode 100644 index 6ec674e3..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_secretbox_xchacha20poly1305.h +++ /dev/null @@ -1,70 +0,0 @@ -#ifndef crypto_secretbox_xchacha20poly1305_H -#define crypto_secretbox_xchacha20poly1305_H - -#include -#include "crypto_stream_xchacha20.h" -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -#define crypto_secretbox_xchacha20poly1305_KEYBYTES 32U -SODIUM_EXPORT -size_t crypto_secretbox_xchacha20poly1305_keybytes(void); - -#define crypto_secretbox_xchacha20poly1305_NONCEBYTES 24U -SODIUM_EXPORT -size_t crypto_secretbox_xchacha20poly1305_noncebytes(void); - -#define crypto_secretbox_xchacha20poly1305_MACBYTES 16U -SODIUM_EXPORT -size_t crypto_secretbox_xchacha20poly1305_macbytes(void); - -#define crypto_secretbox_xchacha20poly1305_MESSAGEBYTES_MAX \ - (crypto_stream_xchacha20_MESSAGEBYTES_MAX - crypto_secretbox_xchacha20poly1305_MACBYTES) -SODIUM_EXPORT -size_t crypto_secretbox_xchacha20poly1305_messagebytes_max(void); - -SODIUM_EXPORT -int crypto_secretbox_xchacha20poly1305_easy(unsigned char *c, - const unsigned char *m, - unsigned long long mlen, - const unsigned char *n, - const unsigned char *k) - __attribute__ ((nonnull(1, 4, 5))); - -SODIUM_EXPORT -int crypto_secretbox_xchacha20poly1305_open_easy(unsigned char *m, - const unsigned char *c, - unsigned long long clen, - const unsigned char *n, - const unsigned char *k) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(2, 4, 5))); - -SODIUM_EXPORT -int crypto_secretbox_xchacha20poly1305_detached(unsigned char *c, - unsigned char *mac, - const unsigned char *m, - unsigned long long mlen, - const unsigned char *n, - const unsigned char *k) - __attribute__ ((nonnull(1, 2, 5, 6))); - -SODIUM_EXPORT -int crypto_secretbox_xchacha20poly1305_open_detached(unsigned char *m, - const unsigned char *c, - const unsigned char *mac, - unsigned long long clen, - const unsigned char *n, - const unsigned char *k) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(2, 3, 5, 6))); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_secretbox_xsalsa20poly1305.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_secretbox_xsalsa20poly1305.h deleted file mode 100644 index 81bff3d6..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_secretbox_xsalsa20poly1305.h +++ /dev/null @@ -1,71 +0,0 @@ -#ifndef crypto_secretbox_xsalsa20poly1305_H -#define crypto_secretbox_xsalsa20poly1305_H - -#include -#include "crypto_stream_xsalsa20.h" -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -#define crypto_secretbox_xsalsa20poly1305_KEYBYTES 32U -SODIUM_EXPORT -size_t crypto_secretbox_xsalsa20poly1305_keybytes(void); - -#define crypto_secretbox_xsalsa20poly1305_NONCEBYTES 24U -SODIUM_EXPORT -size_t crypto_secretbox_xsalsa20poly1305_noncebytes(void); - -#define crypto_secretbox_xsalsa20poly1305_MACBYTES 16U -SODIUM_EXPORT -size_t crypto_secretbox_xsalsa20poly1305_macbytes(void); - -/* Only for the libsodium API - The NaCl compatibility API would require BOXZEROBYTES extra bytes */ -#define crypto_secretbox_xsalsa20poly1305_MESSAGEBYTES_MAX \ - (crypto_stream_xsalsa20_MESSAGEBYTES_MAX - crypto_secretbox_xsalsa20poly1305_MACBYTES) -SODIUM_EXPORT -size_t crypto_secretbox_xsalsa20poly1305_messagebytes_max(void); - -SODIUM_EXPORT -void crypto_secretbox_xsalsa20poly1305_keygen(unsigned char k[crypto_secretbox_xsalsa20poly1305_KEYBYTES]) - __attribute__ ((nonnull)); - -/* -- NaCl compatibility interface ; Requires padding -- */ - -#define crypto_secretbox_xsalsa20poly1305_BOXZEROBYTES 16U -SODIUM_EXPORT -size_t crypto_secretbox_xsalsa20poly1305_boxzerobytes(void) - __attribute__ ((deprecated)); - -#define crypto_secretbox_xsalsa20poly1305_ZEROBYTES \ - (crypto_secretbox_xsalsa20poly1305_BOXZEROBYTES + \ - crypto_secretbox_xsalsa20poly1305_MACBYTES) -SODIUM_EXPORT -size_t crypto_secretbox_xsalsa20poly1305_zerobytes(void) - __attribute__ ((deprecated)); - -SODIUM_EXPORT -int crypto_secretbox_xsalsa20poly1305(unsigned char *c, - const unsigned char *m, - unsigned long long mlen, - const unsigned char *n, - const unsigned char *k) - __attribute__ ((deprecated)) __attribute__ ((nonnull(1, 4, 5))); - -SODIUM_EXPORT -int crypto_secretbox_xsalsa20poly1305_open(unsigned char *m, - const unsigned char *c, - unsigned long long clen, - const unsigned char *n, - const unsigned char *k) - __attribute__ ((deprecated)) __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(2, 4, 5))); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_secretstream_xchacha20poly1305.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_secretstream_xchacha20poly1305.h deleted file mode 100644 index b22e4e93..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_secretstream_xchacha20poly1305.h +++ /dev/null @@ -1,108 +0,0 @@ -#ifndef crypto_secretstream_xchacha20poly1305_H -#define crypto_secretstream_xchacha20poly1305_H - -#include - -#include "crypto_aead_xchacha20poly1305.h" -#include "crypto_stream_chacha20.h" -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -#define crypto_secretstream_xchacha20poly1305_ABYTES \ - (1U + crypto_aead_xchacha20poly1305_ietf_ABYTES) -SODIUM_EXPORT -size_t crypto_secretstream_xchacha20poly1305_abytes(void); - -#define crypto_secretstream_xchacha20poly1305_HEADERBYTES \ - crypto_aead_xchacha20poly1305_ietf_NPUBBYTES -SODIUM_EXPORT -size_t crypto_secretstream_xchacha20poly1305_headerbytes(void); - -#define crypto_secretstream_xchacha20poly1305_KEYBYTES \ - crypto_aead_xchacha20poly1305_ietf_KEYBYTES -SODIUM_EXPORT -size_t crypto_secretstream_xchacha20poly1305_keybytes(void); - -#define crypto_secretstream_xchacha20poly1305_MESSAGEBYTES_MAX \ - SODIUM_MIN(SODIUM_SIZE_MAX - crypto_secretstream_xchacha20poly1305_ABYTES, \ - (64ULL * ((1ULL << 32) - 2ULL))) -SODIUM_EXPORT -size_t crypto_secretstream_xchacha20poly1305_messagebytes_max(void); - -#define crypto_secretstream_xchacha20poly1305_TAG_MESSAGE 0x00 -SODIUM_EXPORT -unsigned char crypto_secretstream_xchacha20poly1305_tag_message(void); - -#define crypto_secretstream_xchacha20poly1305_TAG_PUSH 0x01 -SODIUM_EXPORT -unsigned char crypto_secretstream_xchacha20poly1305_tag_push(void); - -#define crypto_secretstream_xchacha20poly1305_TAG_REKEY 0x02 -SODIUM_EXPORT -unsigned char crypto_secretstream_xchacha20poly1305_tag_rekey(void); - -#define crypto_secretstream_xchacha20poly1305_TAG_FINAL \ - (crypto_secretstream_xchacha20poly1305_TAG_PUSH | \ - crypto_secretstream_xchacha20poly1305_TAG_REKEY) -SODIUM_EXPORT -unsigned char crypto_secretstream_xchacha20poly1305_tag_final(void); - -typedef struct crypto_secretstream_xchacha20poly1305_state { - unsigned char k[crypto_stream_chacha20_ietf_KEYBYTES]; - unsigned char nonce[crypto_stream_chacha20_ietf_NONCEBYTES]; - unsigned char _pad[8]; -} crypto_secretstream_xchacha20poly1305_state; - -SODIUM_EXPORT -size_t crypto_secretstream_xchacha20poly1305_statebytes(void); - -SODIUM_EXPORT -void crypto_secretstream_xchacha20poly1305_keygen - (unsigned char k[crypto_secretstream_xchacha20poly1305_KEYBYTES]) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_secretstream_xchacha20poly1305_init_push - (crypto_secretstream_xchacha20poly1305_state *state, - unsigned char header[crypto_secretstream_xchacha20poly1305_HEADERBYTES], - const unsigned char k[crypto_secretstream_xchacha20poly1305_KEYBYTES]) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_secretstream_xchacha20poly1305_push - (crypto_secretstream_xchacha20poly1305_state *state, - unsigned char *c, unsigned long long *clen_p, - const unsigned char *m, unsigned long long mlen, - const unsigned char *ad, unsigned long long adlen, unsigned char tag) - __attribute__ ((nonnull(1))); - -SODIUM_EXPORT -int crypto_secretstream_xchacha20poly1305_init_pull - (crypto_secretstream_xchacha20poly1305_state *state, - const unsigned char header[crypto_secretstream_xchacha20poly1305_HEADERBYTES], - const unsigned char k[crypto_secretstream_xchacha20poly1305_KEYBYTES]) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_secretstream_xchacha20poly1305_pull - (crypto_secretstream_xchacha20poly1305_state *state, - unsigned char *m, unsigned long long *mlen_p, unsigned char *tag_p, - const unsigned char *c, unsigned long long clen, - const unsigned char *ad, unsigned long long adlen) - __attribute__ ((nonnull(1))); - -SODIUM_EXPORT -void crypto_secretstream_xchacha20poly1305_rekey - (crypto_secretstream_xchacha20poly1305_state *state); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_shorthash.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_shorthash.h deleted file mode 100644 index fecaa88b..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_shorthash.h +++ /dev/null @@ -1,41 +0,0 @@ -#ifndef crypto_shorthash_H -#define crypto_shorthash_H - -#include - -#include "crypto_shorthash_siphash24.h" -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -#define crypto_shorthash_BYTES crypto_shorthash_siphash24_BYTES -SODIUM_EXPORT -size_t crypto_shorthash_bytes(void); - -#define crypto_shorthash_KEYBYTES crypto_shorthash_siphash24_KEYBYTES -SODIUM_EXPORT -size_t crypto_shorthash_keybytes(void); - -#define crypto_shorthash_PRIMITIVE "siphash24" -SODIUM_EXPORT -const char *crypto_shorthash_primitive(void); - -SODIUM_EXPORT -int crypto_shorthash(unsigned char *out, const unsigned char *in, - unsigned long long inlen, const unsigned char *k) - __attribute__ ((nonnull(1, 4))); - -SODIUM_EXPORT -void crypto_shorthash_keygen(unsigned char k[crypto_shorthash_KEYBYTES]) - __attribute__ ((nonnull)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_shorthash_siphash24.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_shorthash_siphash24.h deleted file mode 100644 index 1e6f72a6..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_shorthash_siphash24.h +++ /dev/null @@ -1,50 +0,0 @@ -#ifndef crypto_shorthash_siphash24_H -#define crypto_shorthash_siphash24_H - -#include -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -/* -- 64-bit output -- */ - -#define crypto_shorthash_siphash24_BYTES 8U -SODIUM_EXPORT -size_t crypto_shorthash_siphash24_bytes(void); - -#define crypto_shorthash_siphash24_KEYBYTES 16U -SODIUM_EXPORT -size_t crypto_shorthash_siphash24_keybytes(void); - -SODIUM_EXPORT -int crypto_shorthash_siphash24(unsigned char *out, const unsigned char *in, - unsigned long long inlen, const unsigned char *k) - __attribute__ ((nonnull(1, 4))); - -#ifndef SODIUM_LIBRARY_MINIMAL -/* -- 128-bit output -- */ - -#define crypto_shorthash_siphashx24_BYTES 16U -SODIUM_EXPORT -size_t crypto_shorthash_siphashx24_bytes(void); - -#define crypto_shorthash_siphashx24_KEYBYTES 16U -SODIUM_EXPORT -size_t crypto_shorthash_siphashx24_keybytes(void); - -SODIUM_EXPORT -int crypto_shorthash_siphashx24(unsigned char *out, const unsigned char *in, - unsigned long long inlen, const unsigned char *k) - __attribute__ ((nonnull(1, 4))); -#endif - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_sign.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_sign.h deleted file mode 100644 index f5fafb12..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_sign.h +++ /dev/null @@ -1,107 +0,0 @@ -#ifndef crypto_sign_H -#define crypto_sign_H - -/* - * THREAD SAFETY: crypto_sign_keypair() is thread-safe, - * provided that sodium_init() was called before. - * - * Other functions, including crypto_sign_seed_keypair() are always thread-safe. - */ - -#include - -#include "crypto_sign_ed25519.h" -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -typedef crypto_sign_ed25519ph_state crypto_sign_state; - -SODIUM_EXPORT -size_t crypto_sign_statebytes(void); - -#define crypto_sign_BYTES crypto_sign_ed25519_BYTES -SODIUM_EXPORT -size_t crypto_sign_bytes(void); - -#define crypto_sign_SEEDBYTES crypto_sign_ed25519_SEEDBYTES -SODIUM_EXPORT -size_t crypto_sign_seedbytes(void); - -#define crypto_sign_PUBLICKEYBYTES crypto_sign_ed25519_PUBLICKEYBYTES -SODIUM_EXPORT -size_t crypto_sign_publickeybytes(void); - -#define crypto_sign_SECRETKEYBYTES crypto_sign_ed25519_SECRETKEYBYTES -SODIUM_EXPORT -size_t crypto_sign_secretkeybytes(void); - -#define crypto_sign_MESSAGEBYTES_MAX crypto_sign_ed25519_MESSAGEBYTES_MAX -SODIUM_EXPORT -size_t crypto_sign_messagebytes_max(void); - -#define crypto_sign_PRIMITIVE "ed25519" -SODIUM_EXPORT -const char *crypto_sign_primitive(void); - -SODIUM_EXPORT -int crypto_sign_seed_keypair(unsigned char *pk, unsigned char *sk, - const unsigned char *seed) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_sign_keypair(unsigned char *pk, unsigned char *sk) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_sign(unsigned char *sm, unsigned long long *smlen_p, - const unsigned char *m, unsigned long long mlen, - const unsigned char *sk) __attribute__ ((nonnull(1, 5))); - -SODIUM_EXPORT -int crypto_sign_open(unsigned char *m, unsigned long long *mlen_p, - const unsigned char *sm, unsigned long long smlen, - const unsigned char *pk) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(3, 5))); - -SODIUM_EXPORT -int crypto_sign_detached(unsigned char *sig, unsigned long long *siglen_p, - const unsigned char *m, unsigned long long mlen, - const unsigned char *sk) __attribute__ ((nonnull(1, 5))); - -SODIUM_EXPORT -int crypto_sign_verify_detached(const unsigned char *sig, - const unsigned char *m, - unsigned long long mlen, - const unsigned char *pk) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(1, 4))); - -SODIUM_EXPORT -int crypto_sign_init(crypto_sign_state *state); - -SODIUM_EXPORT -int crypto_sign_update(crypto_sign_state *state, - const unsigned char *m, unsigned long long mlen) - __attribute__ ((nonnull(1))); - -SODIUM_EXPORT -int crypto_sign_final_create(crypto_sign_state *state, unsigned char *sig, - unsigned long long *siglen_p, - const unsigned char *sk) - __attribute__ ((nonnull(1, 2, 4))); - -SODIUM_EXPORT -int crypto_sign_final_verify(crypto_sign_state *state, const unsigned char *sig, - const unsigned char *pk) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_sign_ed25519.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_sign_ed25519.h deleted file mode 100644 index 0fdac42d..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_sign_ed25519.h +++ /dev/null @@ -1,124 +0,0 @@ -#ifndef crypto_sign_ed25519_H -#define crypto_sign_ed25519_H - -#include -#include "crypto_hash_sha512.h" -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -typedef struct crypto_sign_ed25519ph_state { - crypto_hash_sha512_state hs; -} crypto_sign_ed25519ph_state; - -SODIUM_EXPORT -size_t crypto_sign_ed25519ph_statebytes(void); - -#define crypto_sign_ed25519_BYTES 64U -SODIUM_EXPORT -size_t crypto_sign_ed25519_bytes(void); - -#define crypto_sign_ed25519_SEEDBYTES 32U -SODIUM_EXPORT -size_t crypto_sign_ed25519_seedbytes(void); - -#define crypto_sign_ed25519_PUBLICKEYBYTES 32U -SODIUM_EXPORT -size_t crypto_sign_ed25519_publickeybytes(void); - -#define crypto_sign_ed25519_SECRETKEYBYTES (32U + 32U) -SODIUM_EXPORT -size_t crypto_sign_ed25519_secretkeybytes(void); - -#define crypto_sign_ed25519_MESSAGEBYTES_MAX (SODIUM_SIZE_MAX - crypto_sign_ed25519_BYTES) -SODIUM_EXPORT -size_t crypto_sign_ed25519_messagebytes_max(void); - -SODIUM_EXPORT -int crypto_sign_ed25519(unsigned char *sm, unsigned long long *smlen_p, - const unsigned char *m, unsigned long long mlen, - const unsigned char *sk) - __attribute__ ((nonnull(1, 5))); - -SODIUM_EXPORT -int crypto_sign_ed25519_open(unsigned char *m, unsigned long long *mlen_p, - const unsigned char *sm, unsigned long long smlen, - const unsigned char *pk) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(3, 5))); - -SODIUM_EXPORT -int crypto_sign_ed25519_detached(unsigned char *sig, - unsigned long long *siglen_p, - const unsigned char *m, - unsigned long long mlen, - const unsigned char *sk) - __attribute__ ((nonnull(1, 5))); - -SODIUM_EXPORT -int crypto_sign_ed25519_verify_detached(const unsigned char *sig, - const unsigned char *m, - unsigned long long mlen, - const unsigned char *pk) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(1, 4))); - -SODIUM_EXPORT -int crypto_sign_ed25519_keypair(unsigned char *pk, unsigned char *sk) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_sign_ed25519_seed_keypair(unsigned char *pk, unsigned char *sk, - const unsigned char *seed) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_sign_ed25519_pk_to_curve25519(unsigned char *curve25519_pk, - const unsigned char *ed25519_pk) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_sign_ed25519_sk_to_curve25519(unsigned char *curve25519_sk, - const unsigned char *ed25519_sk) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_sign_ed25519_sk_to_seed(unsigned char *seed, - const unsigned char *sk) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_sign_ed25519_sk_to_pk(unsigned char *pk, const unsigned char *sk) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_sign_ed25519ph_init(crypto_sign_ed25519ph_state *state) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_sign_ed25519ph_update(crypto_sign_ed25519ph_state *state, - const unsigned char *m, - unsigned long long mlen) - __attribute__ ((nonnull(1))); - -SODIUM_EXPORT -int crypto_sign_ed25519ph_final_create(crypto_sign_ed25519ph_state *state, - unsigned char *sig, - unsigned long long *siglen_p, - const unsigned char *sk) - __attribute__ ((nonnull(1, 2, 4))); - -SODIUM_EXPORT -int crypto_sign_ed25519ph_final_verify(crypto_sign_ed25519ph_state *state, - const unsigned char *sig, - const unsigned char *pk) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_stream.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_stream.h deleted file mode 100644 index 88dab5f6..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_stream.h +++ /dev/null @@ -1,59 +0,0 @@ -#ifndef crypto_stream_H -#define crypto_stream_H - -/* - * WARNING: This is just a stream cipher. It is NOT authenticated encryption. - * While it provides some protection against eavesdropping, it does NOT - * provide any security against active attacks. - * Unless you know what you're doing, what you are looking for is probably - * the crypto_box functions. - */ - -#include - -#include "crypto_stream_xsalsa20.h" -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -#define crypto_stream_KEYBYTES crypto_stream_xsalsa20_KEYBYTES -SODIUM_EXPORT -size_t crypto_stream_keybytes(void); - -#define crypto_stream_NONCEBYTES crypto_stream_xsalsa20_NONCEBYTES -SODIUM_EXPORT -size_t crypto_stream_noncebytes(void); - -#define crypto_stream_MESSAGEBYTES_MAX crypto_stream_xsalsa20_MESSAGEBYTES_MAX -SODIUM_EXPORT -size_t crypto_stream_messagebytes_max(void); - -#define crypto_stream_PRIMITIVE "xsalsa20" -SODIUM_EXPORT -const char *crypto_stream_primitive(void); - -SODIUM_EXPORT -int crypto_stream(unsigned char *c, unsigned long long clen, - const unsigned char *n, const unsigned char *k) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_stream_xor(unsigned char *c, const unsigned char *m, - unsigned long long mlen, const unsigned char *n, - const unsigned char *k) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -void crypto_stream_keygen(unsigned char k[crypto_stream_KEYBYTES]) - __attribute__ ((nonnull)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_stream_chacha20.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_stream_chacha20.h deleted file mode 100644 index 40889755..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_stream_chacha20.h +++ /dev/null @@ -1,106 +0,0 @@ -#ifndef crypto_stream_chacha20_H -#define crypto_stream_chacha20_H - -/* - * WARNING: This is just a stream cipher. It is NOT authenticated encryption. - * While it provides some protection against eavesdropping, it does NOT - * provide any security against active attacks. - * Unless you know what you're doing, what you are looking for is probably - * the crypto_box functions. - */ - -#include -#include -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -#define crypto_stream_chacha20_KEYBYTES 32U -SODIUM_EXPORT -size_t crypto_stream_chacha20_keybytes(void); - -#define crypto_stream_chacha20_NONCEBYTES 8U -SODIUM_EXPORT -size_t crypto_stream_chacha20_noncebytes(void); - -#define crypto_stream_chacha20_MESSAGEBYTES_MAX SODIUM_SIZE_MAX -SODIUM_EXPORT -size_t crypto_stream_chacha20_messagebytes_max(void); - -/* ChaCha20 with a 64-bit nonce and a 64-bit counter, as originally designed */ - -SODIUM_EXPORT -int crypto_stream_chacha20(unsigned char *c, unsigned long long clen, - const unsigned char *n, const unsigned char *k) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_stream_chacha20_xor(unsigned char *c, const unsigned char *m, - unsigned long long mlen, const unsigned char *n, - const unsigned char *k) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_stream_chacha20_xor_ic(unsigned char *c, const unsigned char *m, - unsigned long long mlen, - const unsigned char *n, uint64_t ic, - const unsigned char *k) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -void crypto_stream_chacha20_keygen(unsigned char k[crypto_stream_chacha20_KEYBYTES]) - __attribute__ ((nonnull)); - -/* ChaCha20 with a 96-bit nonce and a 32-bit counter (IETF) */ - -#define crypto_stream_chacha20_ietf_KEYBYTES 32U -SODIUM_EXPORT -size_t crypto_stream_chacha20_ietf_keybytes(void); - -#define crypto_stream_chacha20_ietf_NONCEBYTES 12U -SODIUM_EXPORT -size_t crypto_stream_chacha20_ietf_noncebytes(void); - -#define crypto_stream_chacha20_ietf_MESSAGEBYTES_MAX \ - SODIUM_MIN(SODIUM_SIZE_MAX, 64ULL * (1ULL << 32)) -SODIUM_EXPORT -size_t crypto_stream_chacha20_ietf_messagebytes_max(void); - -SODIUM_EXPORT -int crypto_stream_chacha20_ietf(unsigned char *c, unsigned long long clen, - const unsigned char *n, const unsigned char *k) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_stream_chacha20_ietf_xor(unsigned char *c, const unsigned char *m, - unsigned long long mlen, const unsigned char *n, - const unsigned char *k) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_stream_chacha20_ietf_xor_ic(unsigned char *c, const unsigned char *m, - unsigned long long mlen, - const unsigned char *n, uint32_t ic, - const unsigned char *k) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -void crypto_stream_chacha20_ietf_keygen(unsigned char k[crypto_stream_chacha20_ietf_KEYBYTES]) - __attribute__ ((nonnull)); - -/* Aliases */ - -#define crypto_stream_chacha20_IETF_KEYBYTES crypto_stream_chacha20_ietf_KEYBYTES -#define crypto_stream_chacha20_IETF_NONCEBYTES crypto_stream_chacha20_ietf_NONCEBYTES -#define crypto_stream_chacha20_IETF_MESSAGEBYTES_MAX crypto_stream_chacha20_ietf_MESSAGEBYTES_MAX - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_stream_salsa20.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_stream_salsa20.h deleted file mode 100644 index 45b3b3e3..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_stream_salsa20.h +++ /dev/null @@ -1,61 +0,0 @@ -#ifndef crypto_stream_salsa20_H -#define crypto_stream_salsa20_H - -/* - * WARNING: This is just a stream cipher. It is NOT authenticated encryption. - * While it provides some protection against eavesdropping, it does NOT - * provide any security against active attacks. - * Unless you know what you're doing, what you are looking for is probably - * the crypto_box functions. - */ - -#include -#include -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -#define crypto_stream_salsa20_KEYBYTES 32U -SODIUM_EXPORT -size_t crypto_stream_salsa20_keybytes(void); - -#define crypto_stream_salsa20_NONCEBYTES 8U -SODIUM_EXPORT -size_t crypto_stream_salsa20_noncebytes(void); - -#define crypto_stream_salsa20_MESSAGEBYTES_MAX SODIUM_SIZE_MAX -SODIUM_EXPORT -size_t crypto_stream_salsa20_messagebytes_max(void); - -SODIUM_EXPORT -int crypto_stream_salsa20(unsigned char *c, unsigned long long clen, - const unsigned char *n, const unsigned char *k) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_stream_salsa20_xor(unsigned char *c, const unsigned char *m, - unsigned long long mlen, const unsigned char *n, - const unsigned char *k) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_stream_salsa20_xor_ic(unsigned char *c, const unsigned char *m, - unsigned long long mlen, - const unsigned char *n, uint64_t ic, - const unsigned char *k) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -void crypto_stream_salsa20_keygen(unsigned char k[crypto_stream_salsa20_KEYBYTES]) - __attribute__ ((nonnull)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_stream_salsa2012.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_stream_salsa2012.h deleted file mode 100644 index 6c5d303c..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_stream_salsa2012.h +++ /dev/null @@ -1,53 +0,0 @@ -#ifndef crypto_stream_salsa2012_H -#define crypto_stream_salsa2012_H - -/* - * WARNING: This is just a stream cipher. It is NOT authenticated encryption. - * While it provides some protection against eavesdropping, it does NOT - * provide any security against active attacks. - * Unless you know what you're doing, what you are looking for is probably - * the crypto_box functions. - */ - -#include -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -#define crypto_stream_salsa2012_KEYBYTES 32U -SODIUM_EXPORT -size_t crypto_stream_salsa2012_keybytes(void); - -#define crypto_stream_salsa2012_NONCEBYTES 8U -SODIUM_EXPORT -size_t crypto_stream_salsa2012_noncebytes(void); - -#define crypto_stream_salsa2012_MESSAGEBYTES_MAX SODIUM_SIZE_MAX -SODIUM_EXPORT -size_t crypto_stream_salsa2012_messagebytes_max(void); - -SODIUM_EXPORT -int crypto_stream_salsa2012(unsigned char *c, unsigned long long clen, - const unsigned char *n, const unsigned char *k) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_stream_salsa2012_xor(unsigned char *c, const unsigned char *m, - unsigned long long mlen, const unsigned char *n, - const unsigned char *k) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -void crypto_stream_salsa2012_keygen(unsigned char k[crypto_stream_salsa2012_KEYBYTES]) - __attribute__ ((nonnull)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_stream_salsa208.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_stream_salsa208.h deleted file mode 100644 index d574f304..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_stream_salsa208.h +++ /dev/null @@ -1,56 +0,0 @@ -#ifndef crypto_stream_salsa208_H -#define crypto_stream_salsa208_H - -/* - * WARNING: This is just a stream cipher. It is NOT authenticated encryption. - * While it provides some protection against eavesdropping, it does NOT - * provide any security against active attacks. - * Unless you know what you're doing, what you are looking for is probably - * the crypto_box functions. - */ - -#include -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -#define crypto_stream_salsa208_KEYBYTES 32U -SODIUM_EXPORT -size_t crypto_stream_salsa208_keybytes(void) - __attribute__ ((deprecated)); - -#define crypto_stream_salsa208_NONCEBYTES 8U -SODIUM_EXPORT -size_t crypto_stream_salsa208_noncebytes(void) - __attribute__ ((deprecated)); - -#define crypto_stream_salsa208_MESSAGEBYTES_MAX SODIUM_SIZE_MAX - SODIUM_EXPORT -size_t crypto_stream_salsa208_messagebytes_max(void) - __attribute__ ((deprecated)); - -SODIUM_EXPORT -int crypto_stream_salsa208(unsigned char *c, unsigned long long clen, - const unsigned char *n, const unsigned char *k) - __attribute__ ((deprecated)) __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_stream_salsa208_xor(unsigned char *c, const unsigned char *m, - unsigned long long mlen, const unsigned char *n, - const unsigned char *k) - __attribute__ ((deprecated)) __attribute__ ((nonnull)); - -SODIUM_EXPORT -void crypto_stream_salsa208_keygen(unsigned char k[crypto_stream_salsa208_KEYBYTES]) - __attribute__ ((deprecated)) __attribute__ ((nonnull)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_stream_xchacha20.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_stream_xchacha20.h deleted file mode 100644 index c4002db0..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_stream_xchacha20.h +++ /dev/null @@ -1,61 +0,0 @@ -#ifndef crypto_stream_xchacha20_H -#define crypto_stream_xchacha20_H - -/* - * WARNING: This is just a stream cipher. It is NOT authenticated encryption. - * While it provides some protection against eavesdropping, it does NOT - * provide any security against active attacks. - * Unless you know what you're doing, what you are looking for is probably - * the crypto_box functions. - */ - -#include -#include -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -#define crypto_stream_xchacha20_KEYBYTES 32U -SODIUM_EXPORT -size_t crypto_stream_xchacha20_keybytes(void); - -#define crypto_stream_xchacha20_NONCEBYTES 24U -SODIUM_EXPORT -size_t crypto_stream_xchacha20_noncebytes(void); - -#define crypto_stream_xchacha20_MESSAGEBYTES_MAX SODIUM_SIZE_MAX -SODIUM_EXPORT -size_t crypto_stream_xchacha20_messagebytes_max(void); - -SODIUM_EXPORT -int crypto_stream_xchacha20(unsigned char *c, unsigned long long clen, - const unsigned char *n, const unsigned char *k) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_stream_xchacha20_xor(unsigned char *c, const unsigned char *m, - unsigned long long mlen, const unsigned char *n, - const unsigned char *k) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_stream_xchacha20_xor_ic(unsigned char *c, const unsigned char *m, - unsigned long long mlen, - const unsigned char *n, uint64_t ic, - const unsigned char *k) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -void crypto_stream_xchacha20_keygen(unsigned char k[crypto_stream_xchacha20_KEYBYTES]) - __attribute__ ((nonnull)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_stream_xsalsa20.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_stream_xsalsa20.h deleted file mode 100644 index 20034e34..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_stream_xsalsa20.h +++ /dev/null @@ -1,61 +0,0 @@ -#ifndef crypto_stream_xsalsa20_H -#define crypto_stream_xsalsa20_H - -/* - * WARNING: This is just a stream cipher. It is NOT authenticated encryption. - * While it provides some protection against eavesdropping, it does NOT - * provide any security against active attacks. - * Unless you know what you're doing, what you are looking for is probably - * the crypto_box functions. - */ - -#include -#include -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -#define crypto_stream_xsalsa20_KEYBYTES 32U -SODIUM_EXPORT -size_t crypto_stream_xsalsa20_keybytes(void); - -#define crypto_stream_xsalsa20_NONCEBYTES 24U -SODIUM_EXPORT -size_t crypto_stream_xsalsa20_noncebytes(void); - -#define crypto_stream_xsalsa20_MESSAGEBYTES_MAX SODIUM_SIZE_MAX -SODIUM_EXPORT -size_t crypto_stream_xsalsa20_messagebytes_max(void); - -SODIUM_EXPORT -int crypto_stream_xsalsa20(unsigned char *c, unsigned long long clen, - const unsigned char *n, const unsigned char *k) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_stream_xsalsa20_xor(unsigned char *c, const unsigned char *m, - unsigned long long mlen, const unsigned char *n, - const unsigned char *k) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_stream_xsalsa20_xor_ic(unsigned char *c, const unsigned char *m, - unsigned long long mlen, - const unsigned char *n, uint64_t ic, - const unsigned char *k) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -void crypto_stream_xsalsa20_keygen(unsigned char k[crypto_stream_xsalsa20_KEYBYTES]) - __attribute__ ((nonnull)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_verify_16.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_verify_16.h deleted file mode 100644 index 7b9c8077..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_verify_16.h +++ /dev/null @@ -1,23 +0,0 @@ -#ifndef crypto_verify_16_H -#define crypto_verify_16_H - -#include -#include "export.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#define crypto_verify_16_BYTES 16U -SODIUM_EXPORT -size_t crypto_verify_16_bytes(void); - -SODIUM_EXPORT -int crypto_verify_16(const unsigned char *x, const unsigned char *y) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_verify_32.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_verify_32.h deleted file mode 100644 index 9b0f4529..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_verify_32.h +++ /dev/null @@ -1,23 +0,0 @@ -#ifndef crypto_verify_32_H -#define crypto_verify_32_H - -#include -#include "export.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#define crypto_verify_32_BYTES 32U -SODIUM_EXPORT -size_t crypto_verify_32_bytes(void); - -SODIUM_EXPORT -int crypto_verify_32(const unsigned char *x, const unsigned char *y) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_verify_64.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_verify_64.h deleted file mode 100644 index c83b7302..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/crypto_verify_64.h +++ /dev/null @@ -1,23 +0,0 @@ -#ifndef crypto_verify_64_H -#define crypto_verify_64_H - -#include -#include "export.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#define crypto_verify_64_BYTES 64U -SODIUM_EXPORT -size_t crypto_verify_64_bytes(void); - -SODIUM_EXPORT -int crypto_verify_64(const unsigned char *x, const unsigned char *y) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/export.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/export.h deleted file mode 100644 index a0074fc9..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/export.h +++ /dev/null @@ -1,57 +0,0 @@ - -#ifndef sodium_export_H -#define sodium_export_H - -#include -#include -#include - -#if !defined(__clang__) && !defined(__GNUC__) -# ifdef __attribute__ -# undef __attribute__ -# endif -# define __attribute__(a) -#endif - -#ifdef SODIUM_STATIC -# define SODIUM_EXPORT -# define SODIUM_EXPORT_WEAK -#else -# if defined(_MSC_VER) -# ifdef SODIUM_DLL_EXPORT -# define SODIUM_EXPORT __declspec(dllexport) -# else -# define SODIUM_EXPORT __declspec(dllimport) -# endif -# else -# if defined(__SUNPRO_C) -# ifndef __GNU_C__ -# define SODIUM_EXPORT __attribute__ (visibility(__global)) -# else -# define SODIUM_EXPORT __attribute__ __global -# endif -# elif defined(_MSG_VER) -# define SODIUM_EXPORT extern __declspec(dllexport) -# else -# define SODIUM_EXPORT __attribute__ ((visibility ("default"))) -# endif -# endif -# if defined(__ELF__) && !defined(SODIUM_DISABLE_WEAK_FUNCTIONS) -# define SODIUM_EXPORT_WEAK SODIUM_EXPORT __attribute__((weak)) -# else -# define SODIUM_EXPORT_WEAK SODIUM_EXPORT -# endif -#endif - -#ifndef CRYPTO_ALIGN -# if defined(__INTEL_COMPILER) || defined(_MSC_VER) -# define CRYPTO_ALIGN(x) __declspec(align(x)) -# else -# define CRYPTO_ALIGN(x) __attribute__ ((aligned(x))) -# endif -#endif - -#define SODIUM_MIN(A, B) ((A) < (B) ? (A) : (B)) -#define SODIUM_SIZE_MAX SODIUM_MIN(UINT64_MAX, SIZE_MAX) - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/randombytes.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/randombytes.h deleted file mode 100644 index c83a4df5..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/randombytes.h +++ /dev/null @@ -1,72 +0,0 @@ - -#ifndef randombytes_H -#define randombytes_H - -#include -#include - -#include - -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -typedef struct randombytes_implementation { - const char *(*implementation_name)(void); /* required */ - uint32_t (*random)(void); /* required */ - void (*stir)(void); /* optional */ - uint32_t (*uniform)(const uint32_t upper_bound); /* optional, a default implementation will be used if NULL */ - void (*buf)(void * const buf, const size_t size); /* required */ - int (*close)(void); /* optional */ -} randombytes_implementation; - -#define randombytes_BYTES_MAX SODIUM_MIN(SODIUM_SIZE_MAX, 0xffffffffUL) - -#define randombytes_SEEDBYTES 32U -SODIUM_EXPORT -size_t randombytes_seedbytes(void); - -SODIUM_EXPORT -void randombytes_buf(void * const buf, const size_t size) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -void randombytes_buf_deterministic(void * const buf, const size_t size, - const unsigned char seed[randombytes_SEEDBYTES]) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -uint32_t randombytes_random(void); - -SODIUM_EXPORT -uint32_t randombytes_uniform(const uint32_t upper_bound); - -SODIUM_EXPORT -void randombytes_stir(void); - -SODIUM_EXPORT -int randombytes_close(void); - -SODIUM_EXPORT -int randombytes_set_implementation(const randombytes_implementation *impl) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -const char *randombytes_implementation_name(void); - -/* -- NaCl compatibility interface -- */ - -SODIUM_EXPORT -void randombytes(unsigned char * const buf, const unsigned long long buf_len) - __attribute__ ((nonnull)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/randombytes_internal_random.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/randombytes_internal_random.h deleted file mode 100644 index 2b2b7d6e..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/randombytes_internal_random.h +++ /dev/null @@ -1,22 +0,0 @@ - -#ifndef randombytes_internal_random_H -#define randombytes_internal_random_H - -#include "export.h" -#include "randombytes.h" - -#ifdef __cplusplus -extern "C" { -#endif - -SODIUM_EXPORT -extern struct randombytes_implementation randombytes_internal_implementation; - -/* Backwards compatibility with libsodium < 1.0.18 */ -#define randombytes_salsa20_implementation randombytes_internal_implementation - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/randombytes_sysrandom.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/randombytes_sysrandom.h deleted file mode 100644 index 9e27b674..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/randombytes_sysrandom.h +++ /dev/null @@ -1,19 +0,0 @@ - -#ifndef randombytes_sysrandom_H -#define randombytes_sysrandom_H - -#include "export.h" -#include "randombytes.h" - -#ifdef __cplusplus -extern "C" { -#endif - -SODIUM_EXPORT -extern struct randombytes_implementation randombytes_sysrandom_implementation; - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/runtime.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/runtime.h deleted file mode 100644 index c1cec853..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/runtime.h +++ /dev/null @@ -1,55 +0,0 @@ - -#ifndef sodium_runtime_H -#define sodium_runtime_H - -#include "export.h" - -#ifdef __cplusplus -extern "C" { -#endif - -SODIUM_EXPORT_WEAK -int sodium_runtime_has_neon(void); - -SODIUM_EXPORT_WEAK -int sodium_runtime_has_armcrypto(void); - -SODIUM_EXPORT_WEAK -int sodium_runtime_has_sse2(void); - -SODIUM_EXPORT_WEAK -int sodium_runtime_has_sse3(void); - -SODIUM_EXPORT_WEAK -int sodium_runtime_has_ssse3(void); - -SODIUM_EXPORT_WEAK -int sodium_runtime_has_sse41(void); - -SODIUM_EXPORT_WEAK -int sodium_runtime_has_avx(void); - -SODIUM_EXPORT_WEAK -int sodium_runtime_has_avx2(void); - -SODIUM_EXPORT_WEAK -int sodium_runtime_has_avx512f(void); - -SODIUM_EXPORT_WEAK -int sodium_runtime_has_pclmul(void); - -SODIUM_EXPORT_WEAK -int sodium_runtime_has_aesni(void); - -SODIUM_EXPORT_WEAK -int sodium_runtime_has_rdrand(void); - -/* ------------------------------------------------------------------------- */ - -int _sodium_runtime_get_cpu_features(void); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/utils.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/utils.h deleted file mode 100644 index f9b36979..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/utils.h +++ /dev/null @@ -1,179 +0,0 @@ - -#ifndef sodium_utils_H -#define sodium_utils_H - -#include - -#include "export.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#ifndef SODIUM_C99 -# if defined(__cplusplus) || !defined(__STDC_VERSION__) || __STDC_VERSION__ < 199901L -# define SODIUM_C99(X) -# else -# define SODIUM_C99(X) X -# endif -#endif - -SODIUM_EXPORT -void sodium_memzero(void * const pnt, const size_t len); - -SODIUM_EXPORT -void sodium_stackzero(const size_t len); - -/* - * WARNING: sodium_memcmp() must be used to verify if two secret keys - * are equal, in constant time. - * It returns 0 if the keys are equal, and -1 if they differ. - * This function is not designed for lexicographical comparisons. - */ -SODIUM_EXPORT -int sodium_memcmp(const void * const b1_, const void * const b2_, size_t len) - __attribute__ ((warn_unused_result)); - -/* - * sodium_compare() returns -1 if b1_ < b2_, 1 if b1_ > b2_ and 0 if b1_ == b2_ - * It is suitable for lexicographical comparisons, or to compare nonces - * and counters stored in little-endian format. - * However, it is slower than sodium_memcmp(). - */ -SODIUM_EXPORT -int sodium_compare(const unsigned char *b1_, const unsigned char *b2_, - size_t len) __attribute__ ((warn_unused_result)); - -SODIUM_EXPORT -int sodium_is_zero(const unsigned char *n, const size_t nlen); - -SODIUM_EXPORT -void sodium_increment(unsigned char *n, const size_t nlen); - -SODIUM_EXPORT -void sodium_add(unsigned char *a, const unsigned char *b, const size_t len); - -SODIUM_EXPORT -void sodium_sub(unsigned char *a, const unsigned char *b, const size_t len); - -SODIUM_EXPORT -char *sodium_bin2hex(char * const hex, const size_t hex_maxlen, - const unsigned char * const bin, const size_t bin_len) - __attribute__ ((nonnull(1))); - -SODIUM_EXPORT -int sodium_hex2bin(unsigned char * const bin, const size_t bin_maxlen, - const char * const hex, const size_t hex_len, - const char * const ignore, size_t * const bin_len, - const char ** const hex_end) - __attribute__ ((nonnull(1))); - -#define sodium_base64_VARIANT_ORIGINAL 1 -#define sodium_base64_VARIANT_ORIGINAL_NO_PADDING 3 -#define sodium_base64_VARIANT_URLSAFE 5 -#define sodium_base64_VARIANT_URLSAFE_NO_PADDING 7 - -/* - * Computes the required length to encode BIN_LEN bytes as a base64 string - * using the given variant. The computed length includes a trailing \0. - */ -#define sodium_base64_ENCODED_LEN(BIN_LEN, VARIANT) \ - (((BIN_LEN) / 3U) * 4U + \ - ((((BIN_LEN) - ((BIN_LEN) / 3U) * 3U) | (((BIN_LEN) - ((BIN_LEN) / 3U) * 3U) >> 1)) & 1U) * \ - (4U - (~((((VARIANT) & 2U) >> 1) - 1U) & (3U - ((BIN_LEN) - ((BIN_LEN) / 3U) * 3U)))) + 1U) - -SODIUM_EXPORT -size_t sodium_base64_encoded_len(const size_t bin_len, const int variant); - -SODIUM_EXPORT -char *sodium_bin2base64(char * const b64, const size_t b64_maxlen, - const unsigned char * const bin, const size_t bin_len, - const int variant) __attribute__ ((nonnull(1))); - -SODIUM_EXPORT -int sodium_base642bin(unsigned char * const bin, const size_t bin_maxlen, - const char * const b64, const size_t b64_len, - const char * const ignore, size_t * const bin_len, - const char ** const b64_end, const int variant) - __attribute__ ((nonnull(1))); - -SODIUM_EXPORT -int sodium_mlock(void * const addr, const size_t len) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int sodium_munlock(void * const addr, const size_t len) - __attribute__ ((nonnull)); - -/* WARNING: sodium_malloc() and sodium_allocarray() are not general-purpose - * allocation functions. - * - * They return a pointer to a region filled with 0xd0 bytes, immediately - * followed by a guard page. - * As a result, accessing a single byte after the requested allocation size - * will intentionally trigger a segmentation fault. - * - * A canary and an additional guard page placed before the beginning of the - * region may also kill the process if a buffer underflow is detected. - * - * The memory layout is: - * [unprotected region size (read only)][guard page (no access)][unprotected pages (read/write)][guard page (no access)] - * With the layout of the unprotected pages being: - * [optional padding][16-bytes canary][user region] - * - * However: - * - These functions are significantly slower than standard functions - * - Each allocation requires 3 or 4 additional pages - * - The returned address will not be aligned if the allocation size is not - * a multiple of the required alignment. For this reason, these functions - * are designed to store data, such as secret keys and messages. - * - * sodium_malloc() can be used to allocate any libsodium data structure. - * - * The crypto_generichash_state structure is packed and its length is - * either 357 or 361 bytes. For this reason, when using sodium_malloc() to - * allocate a crypto_generichash_state structure, padding must be added in - * order to ensure proper alignment. crypto_generichash_statebytes() - * returns the rounded up structure size, and should be preferred to sizeof(): - * state = sodium_malloc(crypto_generichash_statebytes()); - */ - -SODIUM_EXPORT -void *sodium_malloc(const size_t size) - __attribute__ ((malloc)); - -SODIUM_EXPORT -void *sodium_allocarray(size_t count, size_t size) - __attribute__ ((malloc)); - -SODIUM_EXPORT -void sodium_free(void *ptr); - -SODIUM_EXPORT -int sodium_mprotect_noaccess(void *ptr) __attribute__ ((nonnull)); - -SODIUM_EXPORT -int sodium_mprotect_readonly(void *ptr) __attribute__ ((nonnull)); - -SODIUM_EXPORT -int sodium_mprotect_readwrite(void *ptr) __attribute__ ((nonnull)); - -SODIUM_EXPORT -int sodium_pad(size_t *padded_buflen_p, unsigned char *buf, - size_t unpadded_buflen, size_t blocksize, size_t max_buflen) - __attribute__ ((nonnull(2))); - -SODIUM_EXPORT -int sodium_unpad(size_t *unpadded_buflen_p, const unsigned char *buf, - size_t padded_buflen, size_t blocksize) - __attribute__ ((nonnull(2))); - -/* -------- */ - -int _sodium_alloc_init(void); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/version.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/version.h deleted file mode 100644 index cc60e448..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/include/sodium/version.h +++ /dev/null @@ -1,33 +0,0 @@ - -#ifndef sodium_version_H -#define sodium_version_H - -#include "export.h" - -#define SODIUM_VERSION_STRING "1.0.18" - -#define SODIUM_LIBRARY_VERSION_MAJOR 11 -#define SODIUM_LIBRARY_VERSION_MINOR 0 -#define SODIUM_LIBRARY_MINIMAL 1 - -#ifdef __cplusplus -extern "C" { -#endif - -SODIUM_EXPORT -const char *sodium_version_string(void); - -SODIUM_EXPORT -int sodium_library_version_major(void); - -SODIUM_EXPORT -int sodium_library_version_minor(void); - -SODIUM_EXPORT -int sodium_library_minimal(void); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/lib/libsodium.27.dylib b/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/lib/libsodium.27.dylib deleted file mode 100755 index 3aff92266fd0135e043d39708110361e8a62ab72..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 437400 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 z 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

wL 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 duZ> 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 diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/lib/libsodium.a b/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios/lib/libsodium.a deleted file mode 100644 index a833e4dc34ffd8d011107efd6fbc0197aec78ce9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1359128 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ξ7B=!K(?g>~yTP?8XpU

ON*2k-_bW;qnvcrbx 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

pH#Q52vog)3S-Z`S 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

O@=eoR^V7aJ2ZH$BOZ{c0c`)Oqz*C&_ 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

dEB%#Os+~j)UW#B!9|F-QU!) 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%0DPh=Gl96^R zlC!`M1~y%Kw;Z_dY_OTdT|%CWh;Dt{4!_XelrD6;6oH?{}Oq@0OPG46Jg7X^&q6%9>xkj zD|UeS?EnquQcL!xE{xAnx%;!ot2n;)nC(HHbTP??e=GE|)`MOHf3V-y)2rJ}_!-2H zN6@Ls`4QvK07l{@O^c9!CGLUy`#ahFD)K z7R_;`K_8htE@8R{{RvhTOpk&8doB=h$O3$e%GQU9BmUq^_3Oo*V<;rGMQ|j{9Qk_r zx*4MZziu>?_fIk(Le?*afh0ixPP;Zu9uf4+^{h^W< z9c23ie|>5fqX_ZL(ITc%_7W@EacHQ_6mk7f3FU#@GzEUVwCDzPI#GIm>E-8R;Q8|3 z{cLcelM8E74bI^FJ^S-s;c?{g6tQT7&EO?x9|fCCv*7(lm+B?A>Ht@&kFH&TdU(;7 zuG{WFAGjJD<3C%4^-$$>IRv=w$+cNqf;iT^`mS5_ZJaaSpY7ijqwhl-C1*AVebzY+ zGFiX}bdT<(HLgOxDwX{jM*cYGDs~s&!aj`Aow6JT@BZz3X%Zj&!JiHeI-P_Mwf?<8 z)2nQ}S7u_Q{1X*^OY4xhPvD2nNDzR$e-d+;02QQ+pbEj{73XxH8lqtsqaIUO|3f_EGgHc!JQrO}!7`Kiuf^ z{SDU&=qNt*k|WULqbJ_oXV*r*-wD&*OW=R9d#qHJTuLVg_L;rP!Z}pAq5yN718ge$HU7on@XxY z&RQt(Bkrw@SRIS!8Io9@D+>I!PBSKbBY2YM6fVi8O88_tzNMHl@t&0RYeF<#Q7;^| zc0lnP`T}3NJjai?aj7Y`!gdaP^H5XR8`No}o&A*_ggPYS=Y~EmafH~o+0DAY1AfRc zQTVVDz78*yKNiw-V!BO4=;8uGq(1w0+;D(j_`-nP-&o+>L{^76S=65u`}KS7MV&%( zM^=F?bo6U6_t>|gugUQSywrN02aPVa>p;J~mcHK)zoFhVfL~w-o-?G-#XcPP_#AI* z-}c+k{T2ycF+77lieFEqJ|CeHW9K5%9OTs>PGoAY%R-(1z(>Pyd-wwQ6cZ*Vx2?B?^GpGMEb@Yqt8~*SM>uv7<-Bwr$I?blQ;Wb(ea&h|f zG67dAkxHO*rR;$&Xq+wb19@*oPFT}d#5Y^a+M4U-GDgEFm&Wm%UHCBItw-n;v@ZR7?-+k-fc_I|>n=?%;4XudRo41cv zK%YElIDWLa8~w=6o|jti!*>*=6t@?=*ShG(m-&;S)BO^WHNOpg-#2<)8^*DAxU~Bx;-?ws-12S6 z7jNwu4`Lq$UwEJCwWN)ZZ>*|{6`JrzAMTX3!MQYNC!Mzm@mTT2E^!+4!BYUUH4hmy|JU37*I!s4;uWB4mJ zDa}O0KnLVI$zivB75w?1$CJ+@ZipqE$T5K*_0!NnX9X)d$y*Zkz@8UBcssl>qcW?LWd;*Aqee=;9~zhRq`(rCr~6a?q&`vrV{ z{+zeo)_GlI>1xfLG@>ixd_M#6-6HtpnupMhtOttHpTSR}Kf{x;+z`)ibo$89R^-3? z-)t9@Lmff!whEUO&=1`%npCJj$GRUs6p#3oaqZ-_AFH6VHaDz7hUZ7HwQ=w%W!xXW1zmxEHSu!j(hU3hz7lV(aV>g??cIE+4Mw zVt-T)NY~inJs0}ZYx>s0&%JV8;3WcI3Fjpxd42SOu^ss2REhJ<(dn-~^1+|}YuH0X z!3S-AvF`xt_Fo9DT6#wSy4cI1nRxIKA8Yk8UY$ap&X;^|>jcp!Wl7?8{xrN#@nf20 z3-C{O^<0|fbHs^#Ke-O$TwNSDaZ><3CZB~vC!cbmPE~I(Sbjg^mRXS+JoBQWnP#yvEg!RNfQ%3W`S{*QcFqw5!AUcNm&x8)$}Fkanoh=H%*hmya8 zlPYjWmz=o;_ z9AP2J`;Me)04MqJN(~DlE;nYZunB~(EA0yZ=Lz`Wg!?SN+Ci7%6L{*Vu?D`{bxKmh z>MSHcuz1z=&ENxE#P>#lZ+|i3(bn*rMtpJ{{GD;$?cBzll*14GJ=}lC{ClR(=@=@W zEqYg1r(+?o;abEddlN)}GbL*QULzF<|h)o79$G-W#sf7q@L zee|*h#x0iOy%5=UbsrHQCLHheiq^mnYuGd!3%+utkbC#+4Bki7`*1}4F8Zi!U&gF} zPSG)x!21RJcq}ZAZOaAJTYkT2w5AO>(M8hkJbusW_29#D8|YYaYJA1`yI}!N>92v8 zCm-ik-^2B{`F~0AgO2G`-21r{ycTmZ`k68Ol0j7W1F@5MZ(6d+R^LAiGPGgk*3FjS zSL?LTjxupPKiNPjgwE^fp&7Xzd81y~(XND8`(A~ zV@H_B?qGbn(tK}+p%1mv)s7e?@Tkc|e}yOd^B?&8$pJpX*~t=)4(Rv;1E*zkO3=rr z|L)-3F7T|2lGbPa1V0|>{%BDXjpQj;ZQ?-wbooN;sWf@;q!e%98#)0`T)&=3xA(w)a-9+zec$ztw$OR_-1}SwDZLIt<;?JRtWjeh375N$WQGe zHr;YHf*(sttk85Z>Xq)P#agaJ9k5IO3SQ`xCexxFT)4h;;vJoGD z!u;6=)LnP63wy7^{k3f?(_3tg{(OOh&jdxlH;3@5*2$W(65>yR{E?xq{JYn zQ!FY?-lNXsr}D*Dbi^5@OM2hq>11WhSD_UY)YDyS*fRiLfa3avzXCh!!J3uu^YN^0PqhUf`=j~wnMHxnHx=$V<#d^hO z*TVmOA>wv!UkvcGdYIlPHTY_tvi#u#N<87y+MFuH}|FLHKa8r6;_; zL62DO_PbyfxzPIZ3eMl660qSZkC~r<2y}azTb~Y+N41P@_$#&bGc{X z2Nl_MqUPpJJpV02e$VZ|Jz8^7N5FUQDc_^C2d6X^E;~m<$68#jf334z%kUrhQEAM1)jvUy z8qqel|NSA7PI|QW=7@j7d8j1)w7n4dM&Y`aK+5WlVP2LFc0({;4MkwLcK)9C)xBv!2SF+H#$4OgBW#OKCNPg zKB1X?fkzPkIn8VG_<{G7FD>IfIY}e$pDZ+yaYKEi=PkpqGSvSG9xv*EUNPXZTINNP~`I95!Ji z3LIkCVAvW3ALZLf#lCS0(Oj56WE%s0Xt*^n<__xJ#fAB1p}*75n*6deNB>aYjd!%2z_TYfI^U22uY2Uqn)&y8imp1nA@w`r z$(;m_lR>yYugBll15YF#I-A0P9-&q;DH`hq-nLS30kR*0p(D-USLfe@Y-m*ZUL8MR z;AaOom1X1OZ)E*=?SJNFk;N~s@ek7$3$_N}2qw~~V-g*NmxDzb2nU)N{$T_zi8g4U zZJ_h2XvI*1IhV4s2}{tz4+Myruo%WHFzn}5;n!pn+Qgya7Gma7E4{>cAv1#4Aco~o z16v`#l#ywO)KiLzTd&@0WA@mSyk04<|NJ!$?os9uVF}ci;S5n;A0Qhd zy^eE-veXw>Gcj&vO(4IA883^vDPhyUprRwi7ZcY@3E|D+jARR5ao9&+DtK8fl_fB0 zP|h(-!G4mfx@GF&-|Ihb@$s?ISZYhnl4Ld}`UMqCm5==$GBuXsWs4e8{Ey#c)z=K6 z@CE8i>8Bd%ti8?~I>=U;%9&{qyixE!Z?V$>SMyM;p?0KM3rk$*&TIV2cIM{x3+wxh z?x^U~LvE|otrgc6W>NLnJ=EI2;P$5>3v>VHkx54F38&!|B)}0MAfdOE@P28DJ>z{#;jcG6Xhc%#cJkGlUf}i zl~|*Ej_{u1NM*w-u@+fY>W>r4|Hq$o38 zaKj3We?Ct2W@C8&w~r4>i?>vXHwKEm(U)vAka%w|@upI&CynckwAe63oVerh6Pa#= z&D#fK!tiBd_yjOLT$t|vb29-F{b}>VG8iaPZ7=o;!-9(h{`+xi(MIis`PvIECR2V4fn?6p5a|`5~?D%i(AX8^8pZSrV4U*7*HrfarUo0s*MV`ml8SG=6)+L=zvHWqKQaH4GeS%+yCC&e zrfVxB;O6{LxF|E-9RB$rW+av2@$Z=(!ThFi4fcvR2hI;dXRkQ^`oBg%gV&I(5REWE z$L}|lyz^^k9dRNvl&_2c+H@5?osH;q>I<^+J7E! zSX!(N(``3D=~zzxx;UGA6w}3F{>FTKFuaUY3JhQJwpaXZ8W-lYx=M_k6UQJ7{xiH- zDsBJVYBT0tTCCyUGwv`yHS_CGbAAnI6foU{<_F5xA?UOj!)^Xydx#V+`$kIqZIu|V zHh+cG`NwSi_eJJc9o6$D(+gvZnfhlt{KxvA|9GW%brqKJ|L4bpe9f5dE=)Hmrba8% zEsFVHSKu%<6c&KA_}gBw|G62gw3}FUA-=c)A*LsW1s6&E*W*xKZ!+95k5NpGM5YJ+ z1p2m0VQl+*#Tqepc38j?0WJXy9}I;P24%LH=0vJ>l< zmh1_{(&c*f&-%wAd{ZUyH2~jYlZwBc{~d`|{0aO-U$Q<;ywi?r+Fop$A~k}ckQT#Q z{a-gu$SG_ehag`chI{J#F81=7Uv>X;4g_$~RmcKMC(A4S|G8%V?^*PJ&!Yc&79~bZ z&aW4$6h#E;l~!hrPH>QBfss}bMK{=JZGn+!gppd z%l$=}XMpgI;$=%;d|7poR`IURBl|D##oLaei^?8O#A|Ag+CyuILQiBK7Z7|ZTr0U?7lK*ux z(^5R&Ff6Nia07h>^TUFRO#ka~q`1G?aS!6kt@NoVZu|)%L1?!B9Bya(feATxZgSdqAJZ$&Pz~7nkChwB(*5xdxhXH97@VA`wA4{ZyUS8f|=? zNYyDa&}=Z$?xafK+Y%!!Oa#7YrmhVR62lk6HJU|K(cD12h#);;tc#%t4$_J<68-0c zm=WF7f6wez9?Y+kGS9dj_cR8fl6xF~{a+(cP_>KAj&hrerb;^L8SDY9H#KfXO#QQX z2qKqt06myu!2L;?r&o%5{#o>SdZXrNwh!}*mGiIb=qCp01RG(gh*s8UVK>A z+~YmmPMAJk?m@zfk54J{%#S37F=~F*VJN=N&j|OwCf9iWv-3-?W`4Sh0(IkRG%+R( zMxt+x)<(@g7t;S;?(tUorylM>Ty6de^ie!fz`rl@&jPz?q+5hx#Df24<^RW0|L5al zyxe2|?c>cxYmGNRkV6JgXL;rI#1dB=+3#^%{8(gEAi($b< zsQ-SP5F_10Oj(dlQ56=RUK}+5<_iom&yeN(H1!dlZzPziQ%Rj4(%>5L|6E;(Mi?C3 z_8=Xs9CDm@es`QGp!Z4f%o3jIuiW^0eyL-=Yx><{IrpsxCHcLCyRE``2zoJ~Q-BY|>{@)TdVe z-z53}CdvOLN!DzgUn@NNqU0?3O_8FUA+1&PB^&{)sX<)9#%R+Mn8;?=rEke%>7;*~ znEmtfkfnGH2kD^iDxJe;{r~?=nE#Iu)>~<@xAy-979j=IWOyqukiDNl-tNQn{onD$ zeC7Oe$4^qUd4Y=_IvfMYwev$MVNRo633U5jAV)6Rn#0Fd9MC zEk~FL)NBvZ!pV4MS6y>{|TdrKBIO#KKQnWd*Cbg*!=JC4D)ik;R{5H*7*qX z|B&@Aa7kxd-?+{+pqAB{Ii1IQ+QqzUnR(ZodFGrlt2yU+a_nYa%2d2%7xA9jXo+H@ zbJV~j3ftdoY?bm|h_PP@P=4}s ziMg4@E}-1_%iqiUPw&)!YH$8FrsNRFI0F=B^hMG`pq=CUA9@4rocY{q>hx1%W1yE8 zdp?`lQ*2~9X0+#&eZuMv1)rY=o!)iE=q%v#0gl=L?-Dz0;kf5NVLyu-HYE8dB5n=ID(KCCe(OqFljwTnp!=MP$&;NY(tJ0X$j{Ex_ zx_wm~^L1l{#h-5?zH=%ra{Fr64+t-(&rigD_bB$Wu>Y<->Col4YigInxZ@t=;Q9S0 z(~3KizIxP#^ty>W6*f#W4Ljv9<7i^-8#~;S{&nMd6PoEaAdq;MgW7TbJKUYGN+aeR z_gGpy>U$JBUT^x1Bk-@-c*i~OfTm8Q^*_BI?^QH)628aLM8fLrDFpQ$r@@7n)QIraCF@O>tK`ts}2ia%Q#pZvPM0oNCWDjOGz zKVFS4_~!`aihFJD2v=&ce94iU{3=S}>WPf^nuM0^I@0H5_W6$A4agWe@_MiHo#LWD zgLZtjMn?8$9@>t**!7L`9>5(3d`>?#3T*a@`8;mwml*rsON@$lO*y>!+REvhv!HK` zjZOoFJB^Ik^~CQVi2*!+!1wn$zdri&9+ubsKOPGEZ29S^BpFn*2k7V_P`1<2KW+r| zc|rb-k|#c>n8sH{e>`IHWlY&i>x*8$2~Ph}u*AZv!fBw$=(8QF=CLmTDuG*h9|9$RRNMO7RUirg9N_+) zev^m50B3hzzy)4zB=7BNjj*(8nKyeF*>m5oY$BPA^uMd$WoF{#1yljr0~!SA|C)Lp2q+{1l>Z<4eUjtt&42@(|31tU z^wK}?j{*4o`^bOizfXDt5cZh)clu=?LV$?PjPbt>^Pj@Mw*pP?H2(Vspx@7AnA`Ty$ntIv##zBJnP5GeVB{}cQiAWIEMO#1)$|3l19CWp~iM!OyYwf?A< z<~6eu@&GQRISmy3(b`>$4B#Y#5s;i_5BxIvooV0iIdbLn!zSSIoz?j}Z!h_Qs@?5h z#{iG-(D%oRwJTXZU}WU??+p2+x(Eok8eRK$hWvwjdf^*Ii@jqq2Rg3nWVT~R6{zj+&Vq!Gq z0K{hO>fJ2=6!Eme)bVeFyS_Q`lhKdmjl0ZZcQx8@YC7Pb#UF@Y;@&Tpwognlt=40n zoJumOvTqn$uwMSKTXqM&ki9BST|zNU0j2iEHB4}nW_~X?I7!=5IR45Qj%6{lT7A() zo_&BYa|9f`fwzB#fcixKNX+Zzb@YrEu|%)B%3Rt;4nd1&Dp;akt$i@>V-VQDB=$h) zjVB}juJVA(14C;1wsDU85Q_Ba52O5}))QqmycQ1zr2$0LB64!{TV9c~_?u_QzV+ZZ zK6TryHm8rDt>woo{q0^#wOfzu?w6`LH#JdT4$v4t{1hx`teA)7<5Jug;*B)j&n13B zOp#8yoi=tf^_gQRmgzZ|d+RcJx-7r9=p%e^p=a#3s2`#yJ)N0d!@~v?eYHz%;#r{L&+g&yR{_-Qx3c`4 z^4{DFM@?%3g9Y1fYM12Sijz7R^FHUqGu(z8|N2w0Mi~0J6 zG*NNDBFJ^Add+o^esJbNTREM9iuH;tl6k>uoV(d-R zUZ2&IQ)>?qx_C$a$cjtU`SKEurr}zx2?-X%w5pP3KSF#X@@@si>1=JEa-3E_;ijy- z^isF4xHG)GRJZ;>tfjSgpBiC%PU&Lak}-?S5MHE0^^s01m}sQ>W+! zNf+;WD)S9$-1sDvRCc>w9+u2z^dMp^K zfHd}ObT}wSO&nxl{GbjYFDnuDOQ&+U;MaVm9EBa`VB*#eHb^(7s zd#-4??9;(Azfn;9fyAqLhy~@AH}M{tn1MQRq(>Uxu7q08qy-M%UL^iA0@ePmRvrzE zhrKN9UKS*Ns=_F#?Y$4utp)9V6Q3-9^4g<09JP=Nyl=*mo^LAwmJz>vBNvg?)}6RW zpcJz2btmicYj z7zdxRO{nacFq~n*Y||q)Pe%SIDa3>Is^a9y#e{tGWvwA0e>_(Hh z`VTD&g=O zPqV&DV36wdN19a3Xm0M6!(MzfCXtM>n2w1qlZ=w4qrUCozO+`g*?{hk6l?Y(7mZY_ zTey=Oc1Muqw+bdc#v-@cusJ=4;tzOk%i14PyX~gByNZvssR__emZ^3uj*v&ja#6Bxd@{Mf5 z-fXQ|hz{M@oFpf+j@$jDh+=$*nwvNaKT(gQ5x~vebv+v;OD7|LEm`m!%AP`oDR3|R zY8a5EQ_Eu+@92A0Xjz4IK76pkbgWg2?6s}9wBd4IezOfO6o@>Yz|%KIp#B8sDpKOx z+U3%Bm4kCN^K+lZ$?YqsHqXjSPc!z`Nux^98$+Qvz(GI|8760H z$68}V`3LDu$%hq**ttcy6qvu)`tZ6rb6B!bY48@pRZcW^uAbXlw;lk>eq2sBLHbbe zApz{AZI}21_ngYxraJa^IRwXMPkh7(w7XN!h@7_C@@oQZ|r~Ge1Ml_P) zh3q2vwruX>^o{rfz4?Y@#N^#OHJdiP;P>7hS8Li4C0g6J9;0 zVmu9~IQ|k1}s!74bU! zEVt}b5Sh}x-JwLeAkbf?=sRyr%F@6dmSgE#WXOp~hjDzmFkmG8gRT}UR5yE*9v!@7ThKiI>9$wokCZr8-G^(wGd7YV zD=ebj%qNC=V?&Vh8j~lK1UUVzx248&n4$2EEW!pKEDu3kG_*{*FELVT^*AIx>wHOA zUKPux+@)4k;4$&>oDR_U*C%zGoILlXPu-e3XDQd51@=*D?8pmE4mBa9w5~!+>6$!* z0!(L?Eer3~KcO!prxRYZjgZi&baTe!o^nZ7)iEbf!@jHb~^i(K@f z5exA>;8OvDSMaez)^G1KF>7dbX^uQeC=U&(ywu=;=H)54H%}u8S4uDnUD2L}dlj{A zBcSFhDtAPk%z8O3U)OO%FOK@5n~{*LJsj|_J4sS6^Xdk-ve~HGkYKQvGuOqLpMRU7 z^~7YEl>jpnEk7}>Xe2&$5Nex)%0|+#?gW-kNKuj{qBXgsTBbbyjz;u}Y#Q`(!ER{3 zr}fZ2*}&8`ubcFk_HJT$Veza7zFYen{YFU_7c&v{L$KV*jO%fE_@n8<`uT-Nn{3~u zIiD+?{`G_O6jj`7z2Uj8+m;HTVlwT{7D6#S?VpdqC5`1|s6W&zS;H4+(*_%z1TVgn zG(uF==hb~tKj@K5W}J8!_?8W<8_j<8Jz+C>pk;Rs`7z(&qUeM5G#-K0m}x~(zvR}? zh2ux}Jfpw{WZ{&1GXzOFK5nJdn5%|t%hhBs@j5O?Ne%@-O;>g$-qQvK>6ma@u5PZR z7VV`|pt?I`P@;kx5FkzcJ3rP@tv{}y3lDF>i1;) zdrilUJN|rHM;nm)jGe=#Oz1iZpn87xiI*oR$$bBL|Pu6M4aQ?>1nH#v(8LybW?1fa71YU4ga%3->>9Emb!m{Y2aUy~-Nhln$KnqZRE{ri zP}c@NCx;M1Vu8Eo#y}#^1EM)IEYgKd{_j$ly>rtyYt}F+FBT zxOR@B$K`ZYTw06InaE#}K=(_D`|2Fg1IDI`!>$IM9&|#faq#ESt=owC>o4F^0C*J< zaBUO*VtgMQdG}p$q4TJl8;2DoM#HH$orFnM;5bV<399n;iTo%id@l>sO8chP^M!`v z=YO2Z)$5<@&OB3W7b1EW|Jfq1Za-U_1OP8la}+KuU?42FY%zL36%Cf;mi1W7t$Jzh za|UPZN{Vb$p3b7i_W;}5hS?shIsLfuxX1X%l^hm<7i-H~UzJF52a?-GeS$&%e8a80 z%1h1jRTQu8;*{6Y4_kA=F5ZnMhRs~D>wk=;JS(<`hRWS1NK7W-WTdg|&M=$kjx#1m z90)aswczaC$RjC=!ofPHO1?WR2kQpEr6`dCv-oynT1p9m$9-3P^s#m+`d>$v=CT6S zedhfMRyFRn({UkuKY7{Ps4w;+3Lxuus@`=~4BncST)fCm;|e`^Z}PQ<AaOI zB=QqrB%L`Z`w^OVXFkBds>kBgngo6CS#iGo2sciD?ctO zPY<4d5utN+)?~zpx_3+0g8mkN;5K{A8!^yr-P7f)ZOhT$dCN-?qH|mR;TZ^L?WN^f z{Y>=dG@l)M7xl|kwQPm3fNV*~n^-fUJ?4;El`5SH*y%}`0wu}E)pQ%EU8ASs58zDo z_X@E}o5!C*$?H&xs7g5dY-ssOqvA2@)6xKRRp-$I54DbuKd^X4a1()nMsf=Mm?V+X zI0bXqoSMk_>9`H~wjTR)xazPiy=4!u!l4baIIgO7kd#6+ECqhlC{eA^W%u^OvbJCb z_rH1tvhK9iQUHBViMv>(up{&}Ae}^28P;Im74{((z2KqV4ariOYWj3iZ<{%KAi!{_ z3+&W;LV5mN4WB5puOQ?+#mrn$Qxtm_oJwT{TAbY@e;G1O43GEH9TMVbj{^br zSd*b*{sZfdV{ay0ughTkenZ;AF$lb|EeY`szc`_xI4+4+4&m+i2pwVOrX2L~y=Vo)>rTnXqG;Yi~WjR)MEoHN?La zq;%t*HwxkpJXm2n=}0#R$g62pF*#ggLG??s;tUaJ&86SVe?8Xnp&}R2Y*Y1H)E72m zZkILw)2}+oEIJexCd5(L3o%!hAj_J&PjE5zV*!b^X`*l959Dwe3uL{$)z1O0gR?|R z!G6l&J$hfAHf#!c$geJU>0Q>ee&w+Qz=uWJ1r#D6yrahhoop^o`>wPRA=#|Va&Dk8 z&JVt_{khYv>`1=qm#AMjlEU(F2RpEP&k)fZO}CsndQC|)o4Y?#M-?&CSJM2uYU8JC zZu&-c3PQu_L~APpip4xLw*j6b7pmFi6Ge6sLwBiPAt)fIX3@25-7B&Q9Sg0^^bcPo z3=;S{okatdQ=aQw1%p)E7ia>tAlCIUk{D+2j{KFq!hkI`1TI5xs&~|QtI-UzGH>l1 z_yXJ+Ku27V{T0mivzk!f$Uo^>d-Un;$#<6tnI?u@i_yYBoS{njlR4MP1-*QEE8rT+ znWM_|itHQTkki>`@L~D23zm$uR#5L*s}*4>qTzIQD6E+_{DOmY%?N;39m^ zU+?@qifyerarSDvDVF*~ug)01EkHQcA0t5oE+)M6laYP2!gQKO|6h$Q{U_YHxPyz` z6^!-g;w&$OZ+BHoE76!MSWUsrnFEqTTv}hM8hr4w7_wBIcphf_7$2&~o`?XYCt_v9 z36-PbxKMCZ3)n9=e{K+QqRZ~7_F%uOi6H$g-5y?@jZhS&DvzHR7pAV=BFk={#Uuh2 zUS~grU%CDbwpDrp&G$W2>oq!YYu~8{D+0(CC;p`%_ChT!_W{uL7JcO+Y-v|{!j{OR zRcg$aWg?_>w<*8m!Sy$F&!ctjxe}Fi<)x{^Z{)3tA(IGh(iPqM#`9(&im+K5_q6K7 zIo!>ba6{e@JKWF>sPPT2725h0THI-U(g@BMhB0=Mf2^mu2EFeg)^#sZ;-5~25)8A$ zSpa4jMbh5OoGcz6<`Hxo^7IZ~R-5o<&-c%v zA@$&>@(M$Vto~Urml87mDH-7Tr-%|s%GiT-M&J}Smki2jPb)diJf%j8Drv%$Mg_}i6j>?YHFY1h>! z&nORnu9-bsy~fi5C_jSN6kK-rENGU8c-26}+C6F%^6pHr!Wssa0|yE9Ah+cHBkt&K zz0DzId-BFtBw~g!X-077vm35>x*xj;yu1z_>@0X(2fl2D&JmY zty~02Qx`}&gWg+k^9sSmgA9!gPLY#}Ds^Hm~dKAg~KwVL{P?xy*UPwBX#i;Zr% zGEfvCT-rwFM>o5gmLJ)zyY0nUcOB>r^}Iur=OJo5fq`Q;%-M0v0nT>iF9$4wA}=Mi=NF^&}T_fA2btS4~h~Wtc$x2ZZn0uie%)b zlI)Y~po@o@pxZR=3-e2S>xX+Pzf zUiIv6EdQDfJD&b{I;sa#KTG(FzfE1YVs5Uly3*`Nesso;{=z}DT=XJ%;t3I`rZf$@v4eL$A0#~bt8;1VP-S7k;n1Jb=M$QBj_o1aX z73&4(Kr&Zk?iSzWKlBiDSVEhfY*-j@MQ{qR%0JBm5nz(??|wpUu<}DTm=(zU$Yvy| z`#)w6xw{rX-VClU!D+`MjVIfO#|sOsU%6vWIafjMs*hNCJH?03q1_pS#)k1vyA^)tduLL_tyA!O9r9R<@fkEDthKaJtlzS&y!3PI6TSo~ z%Ccu@dYRd00(`U81i8M&cCjFkk=9dv^ED$iigVag4~Uoz?Qqa!elIA&q*{AJMYS9~ zQGspV8p_)*knE<)Y;X943;dt!0{}PKlw&GCK1lT^0;*Z5THb8()Q%- z267H% zJq5QPQjU|=@@P(<-Q0tN>y9hnP3H;wD|%Po$RD-%f|5d>zNo6?Xh`vkWDxB}6;q6W z9$ZehpsN#<=HCvUkf{I*i2z>dSrge=-Ffd;v z9y=0cXtH2KPeg`ci6qu+lA?%Q?siR^f$i=Rr|w6%qX|&Y zE7Xn2q-#2jU2}T{J5eyc&vH=e$Bjz@&~&0d^^*(dj@?g5ka8BPIs&TH9h^wqH^N$C zzq&{>FXu0uohY=Zy!0r5R2qyf{*ynBXj;4Y9CSETS+K7x&*I@70TQa8NIs2Iq*IgL z1FnQ$M(g~~iXi*IA?9UA_G-2*8VXww-7I_sZwM+>2Bm^-x0Y$e{lHO_OAXR)LK=_p z-wJplNd@ixZQhv>%$9r;P>N^6)hy5vrgZDNQe#tbY39%~Hqji*8D&#hNw0#gB##s=(!jWf8fYF37$<~wRw3LrVHAT+>4R2`9!_nzPx7(@+4;3 zZLx+al!oub6QVJNPsZ0>dp#H^sUI=M3mK^r6~cRt`w<{NOi}i=cH1-j>Z@6AG{ke*0sn6gwl+3uF~n4?3H~17>KV9&7$~%IBog@nRg<%K*afcgxDY~E72y9v zB*CX!wvchbbMZh_Rh4?NDkZ&0GCd|avlwB zRSc@0f31w3pr#YEfccsJ5TGae^+O-7H{~lcpX7cbGU@wDkJvV>_Hg5)NJ;iEb~d&* zX~*O`m8VvsV-B|6Clcp+_)k|@klnbRcUzi+Y(2WXAf_Zef{_8Yjz5qD!N}js4p|Hz zLX_eZ%z~%*dn0ro%Y(ASa;#RZPQc2El&q1RiQHpgaE0XapqvQZA;vnRzwXu)mKHHk zWU4ykieUwTsckT5`2gfpW2TRhj8WWCyL>Z={en2R)+4`XKU2Y?D*;?#?m9p@1 z|MFhYOGq)>m62;Zzib1)l~N1^{M=%vK#>#Y!m5xI^SneITN`7BKH-82JFm*xE%tXF zAzbGAC6mXZehCn*lF3KaWpSH`?LB+F-KrQQ`l9X6(k*6Z1?k>*lLoYyUX&qM^Rt?l;VVgUVnPHdwy_#I zg7EL+^)0jfEsE!(!FR0SzBd+Rz}9+V1*Y;z3xFguw_#d{_2OMf>laAK0IE09EbRqYwY-;OwO=z>TStcpJo*)+cC zNzFhA`(UzWE3B*)ba#o?<;wE5T_vR%Sg=Vxx(u^ab&m@utdlDe`|Dc!gQIcJ*&)5~ z1A38Xx+pKK6p~jQw=6P7$tBltKJGwJ^KKqj6{RU>bK`9#SXk$lGb!f=Vai0D4#C9n zf4P62wBE~^06eq$w$ZUp=Xo|;@v?{7uz~4bEY*lclitncxc5I-&|h7yc6(lN>9@pC zO)kIgzuqzO5+@4s>NCS92!Z|I2a0n=@Z3UB+l>k0(!fhV6gG|t^|&f#gM}QYmHVJu zbZ^F0aB}*?No)w_#N!0_(b^nco!808KTTvu!%m(N^`%e=By8(rQ1F|{b}NqNzjSf= z$h9d~Vty?X$w)m8wWQ)-FH}zPHXZ;!X?XjPxSu0m%efm=E@T3ExvSUeM*kS@fm)W@&R^?qu_%MI1 zM+7Co=HoVk7h5s-WzM9+jp29g*~@S)6R8FQ0OxDAV1un>ko#UkLAa7V!^(bK7PvPc zu~Jx=S2gR4#?+Gv^LT*flM&{w7+#zQyTW<8*0B`ZnXT-y59xHsTcjhjW>$MwoT$?k;hiK|meHhFA@3CV(47>6gI=WldEHyC4l&Ps**@e|QTNg(@;J5kGWuSZ zXPO1iZG$5DnnnuOJNMKUp(c;L7tPv&oCaYpW28f&*1Uq)5fstJ2@kaKGW%Z0Ly?F%0wB^Tk$(v`9r(lM4(}QGF zzLqU}0T}rfb&AG|tbY(wd^lf`?~gXNP8@;(4Y5Ul%hlZGl;)P*W z*a}6)kgbJRTv|<@Mr^u@v+X6M(eb#3|6n2!nQdi(voQAXT=tuEwi9tN7i9oU4f&(8 zELVvSD`B(12&LUJ|8!@}U#&sc!WEjrL~;Z&nQ^Wx(zYE3@>p zFdh8kdsUtQ?Bp*{J2RBlqd~|jHe_rd>IbJ{Ol7&}1(3>2_UQ&c_~27bHs9VAhDzqD zw@T@W^RkqMmx&rd)EC=zRC%diYmcD{{=!;tGXvclJ%?`zOx-RE+C53Oda2WDHFC*B z)VIUh-0a#Olg?ye70Zn9AKf%BgwTWYi4@IGw85L2)HQM>j(}V@$H;lHql3R*#cCc; zP?R8crQa(;xUcV%k+&qU`zXnR&;3a!#WPgVF zT4S72;x^CJJ=lxA18i&Cq?c#4Z3s2f2ttHie+QZ-7L<4T>eej=t~h+Y7KZqW~m`MP)-F$do1NdcrGn>TMl)w1ew zmSQK%@x%^{R}1bzxyNnmq4l$hdE3U$=VZxQ*kIJRtupO}vZOO0Xf8HDCdoSZD3b}N zdGH{OB+N3?4LC(eq?~L(zIq3k8oY(}qpb{Y-AsX$Y%MAZ9`X}L^@$8Y7@Kh@4Yq9u znrF>*dXioMh-K~0sB|e}BIfOYBf2~l=IX+nJVIc9{7_A{gA?rZMIv&O4Cm|wfLXmq zwNIe-W(JJuSC`1e8Y_`$I>EhOP)L^{7FOJ5*R{nLCSIJFj{0F`fOJJ=-vT~-PL}Ua zm7kF1_^+pG|8`ec-L*X7U(1Au474CPF!qbc+;?Li6yWqdM5t+Xz`?1-VAQL^NyHUx z!DWMDY%m5rD7~rxzFhD-sPPh7$uf-g{qB+-e25 z`HMNx{-Tt84*a0ifV;q@Thu4Zu@4e)kMhge*Vet$z|6<|9!u0t>eNq}f%+GW$>?&$ z%ky%E65P&G=`Z83wr^Q!Sdt&rm{6NyR?}1o1auWC_&^Uqf2*=9fZ>x1$~0y4Iu+ya zD8t?Xoh3+-$63=NHGuGF?!F(t3BiViug_h>dyTG9-Gq1BCvMy0HoKJ68xrFSlN%m2 zd2N-KHhTFicevta%(#cg+$$i_W;Z+|-_UjeycJru9*k*E zBp4%#AM}({E`Z~!xXB@y0IRM0S4wH`$Y+-N=bieyU4ThnZiQvIQ#~wuw0ns?`LIg} z8RHrqxEeT~xRB^x(p97H7^#K`_yCi7C)e_6>kN=*mE<-MVR~h_?}1yKq8WG3#b!^w zOrNH?z~@_q$pBC+)!NQ6a`qMsixv*TBo+@1!m1qq+W)#v?07TC9tPu`7ob}czQ-dS zC?q(-ZJ#Wxu*7|Ph_(n0g0kJxIqlXJDIx5Zi-z3OrJ5;tV44h=^minJc0EJZ?6z0l zq~l$B2bV->J~e=KmXg`b!W~ZvVlr?AuvXyEH`UE~l12?)Hf0D6NSIMd zDG`H&>f+_9x~9tjtoxyyN!mN)6Yz0WNDh!8_iN?8p-lVtp!;Sz=MYNl!5O(2w|v(+!XiY+q8H#!sl1flvBr^Ax3@UU2Wcfss~1?_V2p3*vbLCb$0;Qzj+>sUN(oChO$*N<)4d0ZExN%-a zBuYG^fQbxz#==7vy8cp~ZK{tS&5^_L2GT^V-6-MR*t|_iaRE0YSH~&`D*DTn_HyY7 zi&YYbxonG0e=GNaD-3p?tt@(a4%y-4+**B^+`KUUz=w1yJG_{6uvsz6^SV|Y`>@83 z$XUsm3_II@bWi`n+evxq+@ce(U3T4#4rTIEUx}pts;*&HpB>?@JN;M>=)^U0$2-1u zXwcye>$cfCFpGt%RlP!K-Q=u8$whd`DlMst!G0DO*fxZh7X$aoWOK^2wsnBl`FQp5 zaQR|jfxoh5JIyd_^VE~0@lc4OIFcie2k;Hx4uXW3jdli1Zd<@(Ohy4StAiYGt~|CO zC@NoYBjOHUUrtL^wjnVOGB~LXh#5Z-urUc#HF^pzfM zRb>&`zM{D0hresH==fOS%9#A~RE;|e*?SI{92|cVvx#HHtF*0HFa3aVBKeRI!9as% zEc@jf3g;v0*sgK?^L_CLUhE;Jy7jNr@O|B@bV^B>b;+w1RI&wVkxN-oXzs^LIG|de#iX(0=8(S(oG@Zw3;=8t+Bb287D<-x6IJ zXs7f4(6dW?1M5DVn%oo#6+&@QrFu3(-GT(>=l1k?W)4!bfVLM4GTBxS2ooVu}qSr^3Q@2S#0eGFi!!b<{Vr(s1492xoH^UbzdiqKXcQh7P%f0z2wxy>?jSeQ=GA zrfJg9{1#nPJH^v_db^Suz{mZmMMPXSC_{j?n>m8W->8;b)w|mYK3WKn)@m}g3`fndW4fZgg5u{(+DYx7&ybvWsUDtl&u|n2Km)BHIxi&)n+|s1OCv~oa)()Vu<~^qYIv}bTvoIa=r%ekw~aLa+Vux zH{H0cQaO|2-%6-&^l5p7Fi+IUYZEhzVB&7{Ml`zX1dz!{Kq0)L$@ZgFt`IeAff|@Y zQ7w9~*(7IC=~0W{B)gfJCX+XJ(icKnnfaa*VSH4t3IA1i(=oPSt-HFfp**>P=OzMo z<@cu*j8lMY%ixn%kcFg{HB-xGS(2kDK&#Nsklp^`?6LeVy8}OV8@J_oJr94CUS+ z9U*$Y%2uAt!=41B;kP(}(&s9={27H%U)8eJyygZcv#JI?ahtBfm-{~57GdoDnIlo( zws8`tsY_NZbe=TV5({~2SO^mJE}n3`h?85B=l_ZGIJgjKa|}pCQ|PzFf>V}{KFTLa zu<~eE`PODt8*|Mo4c{ylCp^`!nHiwnNt(G!XOGGJqpKG?e`fC|8=2=0QbcIjaKayaYwXx06WYUY!5=yGHxgSB;) zl?!mFQU3-XWX8G|gXx87ap>L4{^j#$c}J`suM60VWaX|rYRo}dsJ8Obs`EB;&6ZjW z!?XqVlb2fJm&EvVctrSkZw^W31n#OB_jjhGo&*vU6QQvA>+v6v9G9~yH=E{`yjo`k zJIko9#{-oY`jlpnGS4Y<0K`IF<4GJ?fp|Zpk78&AGpK)3l3<1j3l`&@P;w-AQ#7DE zgZBcWAaxyE)&9c2I&L%kQpSA;>U?a=y$iqYxGuiOFMVJ&tjl52tg7z-QDExLUM5vP z5O!fw21f)dz{_?E>L^5@&6EdM>*rAgeal?kE<3tZ2C#Cf_JwHBI~e3xAiT-OZvKUR z^7`bd3(~%=@mvla=MHX68;WNsRlkYR+ppRXld|s;-DL#_p|F-e}1%jJxtlfR|}m;yYSX2m$AlRCox%<4@HX0?sq! zTs}|L5`_s|!$`90w(WKh7+3Q#v>0mv{@^*`-NMlxBfo-|&9w>p&J88D*D@Dy?a`c> zlrf;9CH4af){{3f{{+@4s0D>k=lBEp29P6%-NPzvwfsrnh1f(H0C?O~slw_F-c$$p~GZAy4EAT$cQlE&)`6pnVyd<<2 zb-Q!$V`6#h^wqYcvJdSf#}ko1va>m?2RCrWuChjd48x+4=~)H6D$4tgq<=^GV5$kb z&X1GpRwF7eP0LI;%Ja2x->Ev55g!V#W_6eO`W3s|yvFD29n47$a#d?K0t@Va4y?G7 z+X9izpOuC}*qFR48iBr3-XCBy#k@+jhjMPO@>^NtfbMfZg4@#g@jzAPFa3EuTw?v* zxCZU<9!b+@(l&x7S8tu;Qj_$Y{{UE$PqBL!oOOom*P3RXD(y*v@KTZSw}S&u-~*ESs}BzB!J-`WiGo}1gO>ad4W%T z&4=-!c~{+GTi{lE+-$e_6X$jEb-|}4HLwwLfX!)j?l&fjb`QDps3GF#bkt-MlpS}P z7F1QDLwyxPrX(xrx4a{Zh@KUS9;m~F@?`5rv3wX=KM@r^k#15$%4t4Au7+H| z-v!hFONC-IF?fAv$8mw$;9fB6N@-h^qSNwWw@ee%z({%sTgX$yZ~)b7e^%Uur0Fb| zo6QGqa)~KkbMk!hgDZD?c4K{!8gGkbRsA})hYVz7{7B#Eruhrb;aep73d2UM#CwAt zn0{3=DrgEFI!sgg1=k$j0$hOKRsiQI=&R2`?p*>pytv>8^!-svHeXmYD#;nfNmDA(f(`3FG(D;)1Yso$x{BK4ZxWWv(8u~6=T7Ir-OfQirtqU#_}#f4R+ zkZ!VZn_zyi|K9H#u`NUTo8n%JF4c2k`zZTto_>Cj*=GL9BNUmyB1EiU)c$%uOCX~# z-Gxo9>9|HZB;q;mY7%Y3b(l@ z%BN>H`S#CnNg0gxbDDyv(16G5?cy2@pm*Esqt(Y3c~6t@G`;{wTJ3h3@RDJ^$-#L| zQ8(Rw^wCyHp(Vh9oR6@!i$kmJnXG-~d7k}o2RD@N$iS$%hP|*`<{F>n6)1;;eWFj_ z5$#({d`w|-?xrNxkGg2rc#EuFc~-pdq9&n067U}6<~HV*jt};U{8g=~AZI-84{N~Z z=kdumK=!7JrRcIXpZ=t9#3ulrrq=ZA8v}HJvF@e+LS8#2>^XCD5B~0TkR}E0v7wCr zPtu+4$&D#xU-Ed28*JeUfIEXsmD|Gg&V%!`VC5%)F24f}X{l?2@Am2?L3#mi!mwtK z;(k!|6c9O_=nS5mw*rwBH7BhH77s|8k`%Mupbzcj#sF3euKJLOw#NIf_yaBFbe~+k z>H~W65X57ucaPfs#T;xAUu5b%lHGNvl#MYJhl^_I8~f=F?l6mV8w|zZ~I&5UjBz@M%+XCF@Lm= z5XfmJEZ03)1YQfb)!wU)hpB$^D=kcgsk1lOiRu?iy4x}2)ouOB=RgGMl~BQC!kVmm zSPWTj%Fu&GDFQ*T=Q zywppTv?zuF*Q22|ynoShEdfHOoAC?Y!aVpjg{0!5Dq#zc;cErXd%n;fBwho0?_sv! zC8E-=_AR_{7C`j%BzI|h0qwk=*GL*#0 zl!ITCW1n;7&MDO^c@I6(#}}U)vH=KRE`MJBVK=|em4opcRKEwglZmkfG%uT;qe*MK6ujzA$ED0A z(bU?DgyT;HeY|4UZYm)k2xjNr(9ACDpQ2dDQ_6iUe|Bl>U)Vroy{-!Ov^>3PY$Vc#VSWHfWUwn6ZpHnOSrlKRsh(J=;Qqg!(O zK3dOJQmEtDryH_fLb`8*Aeke21=x|fAUG|U6gV?g{W6F3V4>KHsZ>=>hVjK)c3No? zIN3_I(LU4(0Fk%sTwG2=&0Q~4u#KW~`nLBpeY2eZeQ4PW@^}oV!`F}F3|$zC`oTt_ zf8P)F`1xj1?csg8JbOxN2q!p4V4Pi>bhW<;`Y+d9B^0XK!D*BJQPo%h*O-l7ZWtt) zgHP~8|BIt9k4y8)-mfz)WHp&-JL7JQCUM8??$&8LO=7lwXWB8lQ41%=Tz zd`K6aXqmPmB17!4TM^)`jn$@H7(e>%sFvJ_e`E+xXlyA#OA*kRz={)UmfE&0M%^&* zQ5xFaW$<~z9JFuSU#mPYkB|Ba_s*Rn%O5ShBBxv;n$EA~H)FbX@WH?TENBT9Dg(Ss zO||Kc+QAGB_7To>PCFF9(V>Vg%3f_XjWLVL25Ob^)k5TR(iO%jZICtLgkDwfcqVPj zm3Ee8=t43^C1b*N zLd?h3hD;&CE28=Raq$s%Vuvd3sckI-h>;E0lcs6+V$@K)pgov))CBT<+<<%lu1|VF zgL|+-#;3yvsL|VS+N%Bx+gfVBWoj2AY*2Pv0iGCix*jx=$2zX$zG-mZsQ445av(sE z?*m;Aq86JQ(qhqJ*Bc}vAU4I1bB@}p{O>is3vD#9qiKtpm=IBaBjsr%Ie%M*a@$n; znaLoKQjW_9kxYf?%s_+2SWsmjwM;YCUdeL$*V_*B z)??W-`}~^rw6J$t(iV{&|X`dyRT-^e*Aa}5-z~M@}PExjdZHP3WYjy zTZxpc?6K%&tvce!YKqxAfogV@G3N1cPBTNEG)s^syr3KV@=?FmirO-U~}5{wdy^pBcVb5J0(RJuJ)+~ z_dtp}$F_188E(`EA^XB0#MNrE|suRWPKI^=`$5|%|@She&k2Mc7k)1;Ijii8PU z7Ry$6DBwL{CGjw+Z@$Sm)USHhFAonfC~B~-n^3=>;n;vvWUXY%^%@Q$;7@xyRCRAM)~t(n?ZYwbrtxG>CGfLIpN z3;4_s+3kyhw)+H+O;V|*AuSZ=l>*(!Q+un0Elz#Wm(0X~22e`(;SUf|?N^~EJ=83A zMa&nqy~QIPr@jliM%KMlJ~xO4&Nke<{Lx^8ZSJ*H1(tLio|k8N3VxZZ=-pM95($a9 ztoqQ$Vb)Lj#W%!#>@HW2Q)1EL);rUQ>PGTBZRonrbzU8BdA~ZK9<-Ut{t8{#%*=cP zu7}``;Z-=E(4$XR@)OSfP0ALv*@Pn1_`|tlN^r|T2I)^&SO%GL5-DMzCR1)>=&4zhMMy);+sqd&8K5&&VplY-_ zFV=2rgr)rM$!K_o;_!hyoB(@VpfaVL!%=AMt6i*}mTj@I}){?cFE2+ze$rCO4&b2^it zo8#(dKBF5pb2Ps3*-kEa84M#}-ITir;^tZQ)`6Zr#an$foaXsA7e~CgNFQzc>ro_@ zZV}z?wn~5t4)s^Xwxi;*|%piVN$3hoIZn!e~QwZx&hcq=AoV%nVlG4}I z`_@R#GhheJ;lzp-Z)}$cx_G~iTxihS-cJi;9k|2=!qwKY?0)*;fRe32G;G53{&!?r zd~*gS=e81EGNE;I5rjMtxLpO(f#1$GcM3USTR$(Jv8?UUIz~?Cb#WE*uVBiCeo{l8 zpRf&sDVhU1%WqSpQIR;BxV7u5B*Yq%_1gS?oauAzZyFO(xvjE2PO9yzAocGAImS+M zvU6js?WQ51xrB#J+1qezLb;)Y1Ul-E&8b(Q^8P9gz5sALTOI1yKsoC!E_B_b+1*nb z$np&o$TpzGO17cE(CPGRj0u_5H9a4B@6>eAZhmaS?43D$ehu>99lYgYR`QkCQ9H;V zI%b5A36v${z7nuJK6do>?Km&nrhy15*;D=!4YYfd(Bko|e6c&cF7w5h$_F)I0}?W0ZG=vw4W8n?jZL6!hj1~(%|E?}kZR|gD5C9-PF6qHYqRx_lFnVlf z426ukSx6EjbZvY%|N0apnA3Hx-W#;PPbiwof{ePcajF4RPY#0Wui`wruq20plt_7; zh#0rGA#_Q^Hl7E5D?yX{Z^*ol&A@XdxdLwK6GMEB^spG}&qN(li$ib9-zRDk&SAlV z&uL(c=|J@Vyw!+Q=lbZ2%6$<`d^LH<7R}f}@pr5q3^Cjcr~}9N??QOWsBb>(ohM&& znd5Eyg7#(%e}Pr97poy*PVjs8`6E2N=r4h?j7N9I(+d`GY+1r!{o~*%)ohPU)0cZ= z$~@Qn+FhBV#TMQ6q+%4~`C5FKN>**|pV=Re#`JQ$t_eY8(#OUFTsaKKT zUX`bLA`U)=ZafzFZ8fxgV1%K1C@hVY9TvV@q%_~}5>NXEeB?s@Lc-eB>vxq8DaRN| zQ#rOBY!##BzAmxbcqmWRnky`QtOZ6g*-jv%bL~ga5+}3$DuaoVcWhbsmD)BUf6WUD z-^NW`GQB_1Oe67*eQc=r2xxRGCTn8wIR*6|PC43Y1PM(I$tI=ea+vV{OS(_;+?4kK zP_r`VNT;k%4Heb~5sj-DXrfQ^oqWkb=U=rvPH(5?rk}JozAB>&JdrIPAvjDL!qJ={wTYe;97jz;J#R+&7<72S$g1bbwNseH zY8>gvk2hs;yHWJ`+w6H+Kx&o2ZsDyL(=!;I{E(VXEW2GTDxIhxRU6WafyOEqH62&Y z_^)ErAZ(1=4K*z`mnfJ%4vMTMZ7QGmQH54z6t4I34i3+0KHGPw_CNF>d^TKCknM%^jNnC0+ODpJql=z&D{dokT4RbHouzhP{_C5-hsEqlhRsySf=w^ch6 zzeFv)Dvh!)IamKBeT9 zl*V4>`Hp_%!p>32|Iu2UtX*1vPj%WeQEoFopRKYI z@s7BoZYh^T88WuB6tqsR3WKkjP3!H6JH`(0QKfuBrX`f8@Tpe)V{r_6D7T%Gz*ht_ zMk0UfEYIE`E(!ljaKd#j)<3i-4yrh8L}#E85o%3HN~_H790?4ufRnsQlT_FUzoKZ_ zoX%dZt%ozbU*g=Jyy#J=*28!Yc57lCCHtys0MpsWPsyvh^Fo}%Htl=#pXW&0`{1#3 z+wRr}l#C?vP_^uq$$S%0^TUh$U6jmFQEZfMvygI!hqqEryXAAEjPC>TSTWbBad#1f zz$&cW$4g|68rwvPA$2a~soMgKNIuZuW4aze2o_1aFFMoao!iy2o2T(W+iH*1ef(GF1{z)av8_fvUd*S2O`-)d(1f(8|c+|*H@t5uVklWi6r#>UAyUvi#|^;-Kjfp z!$>hgQrXi>XLM0zvYg7G@x%Qa zzY?w+^dU%4vvL{Ed?ihcCx%mGQ5w{dYu%m>W5sXkiocpx3}U05z9a4?rFm*QKf14B zH%xRpeYm+Y0jB9&R7i@ZJYG`j9&6s+Z}e(^9S6re^(25|!cA=2P7{64=UaPpH%|!? z9q;-q(zXh@zdy0KE9!IKJa@H2gktm`arWpz%~*)fSh$ziXl8d5LytI5sglrJ_AQzK zlP_z!Xocab7WO*=Ly>PIWtj-|Gtc!k-;wA|YU;kmXa*r)%o>Vd#k{FopM&_13)2>9 z6aZr%ACE9ei$;?dq-}Y0FY^)U4byrARqFf;$vCs0ET}V81SBzJfRp$Ta$&6VG}bX# z5Na*kbb4WUL?S#eAQi|AV^uH-vOccg@1sfsB>4K~6+(6mFG7fn>MV=pKuKE^k4SCt zKgs)x$n?4CAv4!yT`o@nI*C?q%Syc9=EJh?k%xVqKB&+9xRhI z>w94URY{TDsDb89$L=Dsa3H0pWN#yF=XClWTzD1MZPT1qpjbIATfh)O3{i}swUi|P zcWbZM?+5E`t*PGI#euR(zem`VLi13-a1n(R&8+$1{!=t3B(O34g$|^>^qM280)#q9 z;^O#AbgKCd&vN?{ZHEm4W>*mNCEbp6_y#A=uJ?%dq^q;#s&jqn6IB-sqL~#g3wcR4 z_j{Sx!VcC9sGU=?A5bkfpo8Za$>geZ`}=WbpkoyYW~Ir3O19_Skb;q8voa7vL&C(X zzH*+4D!4bnE3=&>u4`%);O z6GW>{a@rn7mS(9VV&+K(w-bb(GttsO@QzF6b%wdu#%}rAA!@CGT^X4pk|KE@|R}c>qQIuu0s(+%FVYlwjE#*rH32g+6qf zu!m*S>HUP(yTtqjPI?!N&ME>?S!~NKTGIFa3uD+I6>j@)D<64Cp-l6`Q@Ze;9@L>E zWyq;UI@l1uWCu^4bST?4sFiJ*Gi)AfE{v8aC!6*#2up_84X80v8;#H&1A9@i)NWMo zCdGcmrkqs{I0t%kP}}F!CYx@}W3+gkG`I)497LejG=m0+w-(i$Io-Tp%jWv} zj>X#CKM9+54<5aF5zk;Vx-lrLPJWc4Hu|G=M#v*=_IWAH<|hr@63mm>vP{vnl@<}y zZJR#l8jJ1p)0Tpg^q~1=qOrY~(@g*zfUy_vU5PHl*KWvq6DGa?Qe*B)I=L~yX z${8qOytSrZkI>vV z#JDV}RU>1JepKOh=<+Tht5~{x_{ZNXJ&8t7$Nc>)fyp10>1LEL=<#7E-U55eInr&X zc3-h5WRL->TmiLN%`&67qjv{2%%?u7yLN!o9KA>iAIIEwGACjnBn0|dAC3tC=)*8` z^V2~(+>d#XTb{1Id^ku7ze>%wd8alJY3JBL*4(}!+V8{w`*zk6TBD=ewIrOzQ98!v z7R5&}Sau}zFnXHB91BTr%n8zK3V=ZaER`P@Cccs@2i?{l>Yx2QCBB~2hly1E(nwlr z*V8RY$4dt2I615}U+X!dghl()C4DHe-GY0r`Q!t^Pl5Q%J`5l=a7*Ok~OEFRr?QLoMK`Dg{WX_6oXF0+7bJsu`lOT?$`V;=RHvOL0- zI_q!x2=A!ZS|j-b;%O9u*)~svgXW#}uvx@vp)mLE3~WH+HXE13u1Kad9B1D%a00YYAg57E;onu=Onn{#;y^1g=Om_r_mzFS$GOZBw|d61~nnxW!>O?y}Y zN;`E)whCCgxz~2)7ow{75psVDq<@0ezg@d*KauJ_^X`op1khXd?Mtc;r+4HH%sjur z4jRLB!Dx8TDJvGg<7|a{9+Vh4**4gC?C6hgD?0B}RtJ?1kia#n=!_izzw9!~N&l;~0&3MM7X7wm6!yMbElktvXHHRFG1- zNAq`ajLW9d8ubwjgL&a@ilA{3)+mhp?24e}K~E|dvN#})3N&}gNiA^A9b%iTRvZAw zUfD?~u;y*egQyHzmK&0YM2A0?Pf>H1bpK949nPhbPvh*xN6+E(f8fu6ql$=H1nwc`y2#-c) z-dY(br}XwYU}7->ahHrygGks7)d8mSdQY^oVsV+1`h-*Pn%HYyuH6m5!)LSg@1D$L zU4X2eLJfk6$4>XzTg|EG#)|e%Gwquto%B*)bwOC&+7ciXf*!Dro~8V`iSFY+%vLVS z`jO8R()hFnQ!3{qg&kf{8zx4UB!Ohz*M=6Bz{}jHJkZ4R*-bAE<95Jxemfy9g%vHH z!>f*)J`wc{0ESlbFPCS%F{iZ%y2+G;zB?Tz`U;u%e#)4dN{sRU4NF8k^*4MJ>6Ha> zEonRTL*}s$*5n*zUvRrfk}Ugu7sji0=H%x8T1BHvO+A2OLgS3ZOy%|m`>biO0!wa- zJds$N_bLOMNXXdE&S;tR>Bnbn#Q{^Gutu!EvfcIP}hBWz`hP=DL4BYOy1CCaOBQbE*$|@ zr?FvJ-!oICPei&P@*;EM$R&oyBjSHxQ_nU=ystf>3#*KRG4L{_EZ5vI*)^ESW6E=! zvgtJEe@chdj9%r{!_esGz6+^5vs5_-0%&!rB$0+YwSVg>fy5l{`U5{`k6BMGhP@Om zAv6rzUwcEzvA%MU!Tc;`)gq1ro^MI!Mqg_FVEngD$)fv3tRz%q4At zljP1<8cJf7+dOM1iGF)x7~cm{`a8L17+H5#fL3^_{rv|rRK$ZCUH$@YUy3xQ#x-wG zopGEL4RF}3g7m zJ9I%5$-_>h2#NOatm=#}cb^&Y*j=`7vDqq*6U(f^4S@F{Csl?dak}j~(P>MTXdmeE4jSPV^F5&_`V?8x^gfnP$6lsg zP)I`uMIkKk#3Fyekw;SfJJ~yS*(&>UFP`ymsNUVa@94l(rfAeDf*3_69Wa4R-S--j zZmZm$N6UJtay4$PplW-rs{TAEjU5y%*h7I3b!krg7D!eNp>rIKmwo1}I%}eS$!>0u zLp&s6>FsNC_HE|2y%v|?j(Npj#$kLW==)z6e52^CSC9_Eg zbsr>Wc#zUQR?q`P`ffCSc1I6BOck38eX5abd?X%+d-@-+-IlMrIjarTlLx@{-AAxj zy^k1!N7ZF7&bY&K3cY9nk=iteKZr)9Ye7RyH`9$#`RsIb%$E{Rd=YY({YB*#rK)gl zrnFj`skTHFLxRq+b?Zu)%{xOozL3)ZTvdM8Wgw-djWD6KO|Zp`<0(k%y0f)4k56FMwk3%_VOTFvhAPjpL_#6LiM zIQipHEz?%KYCPCk$c|Z3o5Ph#Hb(bE6JDhZ+^T;r9BkV@(;wW-2OW`Rt(00*=LZAa zFqqizjYGq&KI4&^>N~R)K_Vr$788f29seloU#(?pwj|j$O)iScwranWmta z^$OQ+5&PRrgygH^H}oH6BBabqc=Gvat7Nsy1TA<1dQi;VNUc9~0-*>buMqbisYbRg zjVvGe@o0ep8jd zg7D*4zU6~b#l7WnUDu4)lU~_l(O~C}s+Sq@f~N*cosyw!C7* z+Tv+0RMI76BFZp?s7MH5NCzS92;6Fc+6UBVR7RXHA1ElT1P86_3=@p-#AzR*cIgyU zw?lu6OVK#B8$&Ec(oA-mIV-6-rTyc-ztJbX9NBL(py}W<*wa9h{;pc&y_}lTPKG_1 z>VJV=YoDRn07mLwh*0Ikf+L|W%jhCx-8+X5K0-{(EBtgx-GYB}+8fA+xnZ-r`4))a zcOetRZW1nipDEUw^OpB)LqU5VFTQtUbpLr_$IDek7lNK@1c&NhaFljQkyG?i#OTe` z$=jca$YBP8_l=%T@i7G}@C)?eRPJ&TsMBTuyY#{G5{H4@ZQzFBeIGKM=UWkcercgr zNMo6AFOW(Ef(>_2#{Mmrnh{8dMzv^mqMms$zO&)^QYd{ppziJ5o9B>0_ARh&n7&2c zN2@AsUW6n*cf`u6xg!wo+75}gt)*Soc*b(##6s$zeu#p~+%(c(f)DAX9MN1EbElz` z%{;f4cW|}*V*{cCjxRbe%6(+rJ?~nrV-FkDojqpV}e3d7}XV5Dl!%l%i|@ zw??W_^*?5YJ5Kv|PzOG?L#Emce>g9BZg=-Y#AN=1;oE80K!l{*5g+b^G3=Bbe*DaZ zfdPG*z;3}bLKLBM&TItlMx5*?KXDQS-5{lTLF15(C;P?-aYQq7q+Kuykb|>HEtI+~ zL(&F$@nbI$Fm>wiLMK{xg0X?9!(TFluM0EJP6K=T%G(QBOhQta?)D%XpWy6z&2lp$l*Gg*<^GW$efp#kTtizk|$p$x%7W@xnN@@ zKKgx@E_w>Li&%b*FDpny!U7bUqOtu?jPM0zD5t7z{bQ$u7dg6fdcC^6ILPAC!OOpk zb$`Ol+~b+LTbzNcyY&?^-q_Mv5A?-`Y2p=(RdikIw|I%T%Ph23f=)p zf@xwN$p&mYS!RmDo99F(-M%u$)&Oi(be-T<)9?jlxb?hcb$zKIg0X@uJAImXyl)g2 z42_2~^soli;UCj!?<2)3MUG0SPMmAhI=1bPXc(9kT@{-R5j?E}q$kK6bYCe4DR5iS z_2$H)sT@C$r4gdZ+|tKYrk&Kdu-W$WNH^ur!TF8J!EC_83HdA%A>%BxgDTX1 zfO3kte{L-EtDgLA{3KR>;S!m$jtvI)Q}1m)VM|Rl%74IkIN85S-OrdFVY0qb&^h?+*j6UoSU0+GXLf+p% z-SSb-v7o9rr`hN|WzTP@CXu-35jtGbka>66+M0x-S(F38s=zF>P& zDa?QgYelnMucFU%=?Xc>sB0kiY#<vkEXT;_HRYVU5w3{jzG|27{`S5RpsBE zIS@cOAd;67wJDm~jw=w?s^*)Ely%$Qbuq2~)Fe<_h7(uO$Yg=astAbrnm3U@l~@`w zU&>D{>+?EBu$;jJ=5VefIvKFt!-OhUN=kG1Mnih=sDJ3sapYS06L!f9<&o=%EE8vl zh}%L-m1-bWiSLZPtbfJu=fyBZ2?=6(P~9*|l%Qjo7$R!_I$= zHDL(wM8wcF2?!l;f9Oh}sns;Y0>Rb`L+j*cQFrzVlJm+^iXuE&Oxi?wT|sTg1Egyt zWce~h8PaS3PLndAh(F;_X7!kSY^S);7ovn!9OVk#ZT~o)ICc=lN_;))bKjVM1H{n1 zMP$gOI-?l+VV)s7&ue%7X~BoRR$zj+Xkksmt@Frm8+q*6DldOPPs2qRX(40R1Tm3^ zf%(6D>Mr)%B$kn7oz4ufA)KoNQ?B-&6aX_qB(L z*q7bdHjH8;nZ%MIX{NlcfH5 zsD==iid6?u(3T0j$FAnoR!UdN)G=>6>9tD5<;G6u>Wt-KrI!pOgTKp(b|W1qO85=d z2O+ay7W&+S+>?t+wqL;_1yT9t=-0ekPjKd|*Fj~FTNi^sCp#?ojMwkm#l7Z%N6K>Trey~JP4>oX$qR}UKFvmiOme_(K)u$ovQLC$}{hlKG!JUU`KVUmf}ZGI#9wdYlGWIiR*8}ip!$5&%E*+K3-Fv%mEO>w+jbo z_bvNhsY>?IH`s(IOA>mN;Ng7Kab#04>E?L%eUL7|TK}>C!xU`R>S}IhUNLL#Ycl^s za~tIQbwvj=r?yg2YWv5o>-4wzoR2|F?wGgGA61nC)m2jC0=h3*JbEZz6W3DF{TR*a zDp_8}^_5T;!4_INx*KaC$^J{GN>f-W3PiSEXXIDp+qC=T;)3@u3SN`+7=wD?qv&Z+ zSDdfRVoyA~Hk_uB=XOutxj(&Pk1KsrmEW)Gw1$xSEAVHA^TALUL5Kge%jHD9vHnm5 z(#NiE#eeF6pfP7(^ML?lU&!BjN@RT;%0WOpzb0O)J7^;8+@Cd-x{}Lt+$BCIfeG{be1umaKKx2u z2Ad&kh8zzZG3R0upe)~#QNQ!wX)llilhk(rRq*&$(}>%`Tqt#upJiQvZH=F3hN2uvtQ?-tJe z4dD*BPy|Lt+{U>pL8-ccps6CqpH{r_q&LQ$<9tgVvUm>aa*5d{l2d>ZcuL9FCeO#@ zT++S2RwuP>%PbHD?;!l&>8cJdl!xzp|BX8T!0&+iu$k%MOjvLpZ#7Ym1!1^PMsfD4 z)D39s4%~;qX;X|o2VQOn0i~j?>vi5C{Jw9Sy&Uw!S;5dbL#8$P*^c)ofO^#^Pxxds z$GJIroD5Ea`?Yefku^$9pHY@JASzDNdl4&Am2ppZ;Jwbs34f;goSkOZfY?1bFyeWp zs>rT4W2uoTs<`vXsP4v?|Eu!SYG%e|jzs}+Kf_b`Gfy1;vDCu!ryhJD4mawkNIo3a zo=>DGYIN6x)3>B`JW4o2gaJ22 zlYar%U@05&sB|NV+-snlp$wNN&F^D{bk3NG#|d|~guH1^2mp6khMG@*)R1{sogyf| zwfK3VS+f>_QXDXuopmN}&QLD-_PY4yEbx9Mm!M%tCERb)t4~>=(GDdx`g$N9kUS#>tm49dl zUBZc%%pstA)^;hEsM&W~Ie%qTcLufE1vMAr!xqI_D_VXnuD~n@AIAZeu{?Ii=SAlO z;&C%tKt^e|b2_p{)kTI3jLwQe@DWRu1K{IiTm6Ky@(@#vifEs0)2AgWw@Ef08Rj&Oa394gd3HBn|`K?ePns>Ybg&a%3=aX*S_ zn?x<{rz+SGy@mHaWx50$7UN5atoYf=l#Al60UCZhbg`Dony0TiH|gg`-;~;wJoZL59YI1lNk~#|W)_mze-gg$0_py&q=TTqGqdsfYuAduW`#2F5 z)YO8?B%2plz7{4RB<-bcid47z2;iVpX?1uUTKnTma;DJ%*_?)QJiCrJ(&Y{`$NUb^SCLGN>Y%{au&ef z*8Z|gbA7_z(d1$doyiTi<|V=qG>SrbN!D-68SYT|-C$)D0d0?eFrGO+ZM}m}P*HNW zpiA5EZ>vaMwk_WFqBMJH^u9W`*)cltN1#5TZ2D?p5`z;-hQ-kh{LzR^>8s(OZk zHU673c~6!ColF{&C83*?x0CgL{hwqQ!hH*!_YtMXmWYq}j@mah`XouHzK|tbCY)35t!NcuqgI*c^bjAaSvGRh z?^d~5X4>TRcw`#;t%$1@O4>sGEVnj^G1T` zW&k%_h&#qYdsjnT>`0_!UPm<9v{Ul*ENHv_HWe4QjC^kmIoQQsx7VBg#yQ!Ehq0BV zm()jumTqw`ew^)>GR%woETG5ZI#*?eq}eyDW163Vs*k61ArBGmj2q};X5N5OY|MJ3 zC>prBlJXd%*}mVkC@g794cLp8?jl}@v#PXNoJrARZK1yN4QnvQN8(vDfJAKh5UlvL zq-sp1`L`MNz&@IF-IlqYZX#}&*9#XWP)iW*a z(1lRctzC?jHP(Kjgc<;Joh`KudM1A5XW?>NF?u#V8y`9<-z4G4%a=ASbwu1{N;n-n!=GPqN&Q-+n_^uO>%zndr zN1ESnoCCRR`P?CZ@3sSpjD*!t;b+u%Qx3&3jYr$Z_Sq=jj!REoD7(`lq${U#b^_NF zI7y`s!zS7(EE=AhjmE~F7p=l~K7l;Dq3xNNIbqisu*KN){r@xxCOvG7LDqyfO~oig z>ow4KwP2nd;->Ad$3uzn81!t)$krZ&{9{d4o;SrlO@;qZ{(gOu(L}TgttXc>=9SOD zR8^rHr0}znHVk=V0Jy>rG7W7eTvpl`dyYhZsV%)qW|8FhASkS$`ROtahsU=Og<+RL zU4K)+Pl_iCvDC6ie}V^*_*u3UXb38Xa=*Uzu~HS)Kl%8cdaI3t9e zid>1TgYR#Qo8<>Zpu#ofu@nZW7}{Hn&+rENNpSfvY8&!uB$I>nxx1>oDA1tm642vA zwXKdLHRs3c-z*c>grpvjNz82o3mNmm;!hg9MBE;S;nGWWg&mD5A!N5Z-BQEX1-L`1Ff~hCFc}_1$K7bAi=P||lgX;dQ<1-om&f>PpHL~IU^{q%-XY1-8^^c z^6;iZ_fbzN{0X_SYS=ZX`E5eY4+@<~fD^F3WD0OR!t*mPw%~H5C;MhvS=_d=^h+>u zjVUaI<_ii@;=+N3UJN#TLuT-x9v3ymUMK6|@|1^iwR?}wJ@^-HBWJi6HpFY1tOK}D|I^rDpSs@dM+6{|k32)T- zQDw)`6!?Ry%X^^nY!O*CHXpKe?(dKYufu+ZA$!}m@gNv8R(&-LG|+Z9n{TvlogsEoQzqt zgY;wVt0TvYSn=nUTQBZ)V4Cn`P0(&q5HI z4`?3HT^tr}=5mjtkweZStUOHT<)4b+W2*bIX2zs^8CCr9L-ut+QE)17quM?ew}+bQ zw4~dpU#KxU!Ax(Hl#B<^Se8~%YdYcBd)SuceYN6s=XCw92}Dh&=N|Gm z%{<@Pj0K0#M1r!iZ9pCyg-tKubZFowFJa@1<F=HTv?bGe zm!^I~C9@eZsiB^{nRXuGr1Oe2fEA}i#w{a1VrNXEvW5qd30{dsCOhCH(QGO2(?7cq-K1dTeqdxE=q( zYVRMzoySnxp9 zcSUy&D87t3m!12-&KFi`Zdk0+~O*;3Fw z8f=!xZeXn7#K1X@HVAT?#eRm?b=fXt+Om&DYQToL$uHW$8eo0?w5lP@M#lJ}*7t$H z7;z#nUYhMc9ZzM$PZN8u09ODPr4~k{7UB@8*TkKtV&X419u*89c9`pFA`{S@)U=r` zQ&lepwK#*|GqITizI9{ffMz1vZ;R^ z`M97VER=LS8PbIz9~vx+vR&~q2|RXF#@8#;lIv-}B#}y5EN`vGg*%iVxhh@o9Vj$0 zGGKT}0Rv0cw_a}deuRMe*8YFfXo`pYDBNTfFnnO$NL^fL<8idFNLN^hI3Z>|;wNPg zeGNkbxrvoNMWuCRR}MMxv5OW{1av_o$V#qVw0&XmLy+2G#t+x^}+!Cw8_)zAe{Gc_Tv{u)94c&Kz3UK8F!EK4X1^=)61LpA^($5lE zT}|e^BuFur8_O0PxBDZ$)0}b@crE?*O4{pLw<-SRt*_kTJ+*C{VAH0N=ngHmEoZIs zdw-T`)s>6QfPc6LCmEf`(qZ>h7Q?Y8jkhmK63@=Ks=+)VUYL>t`@9avXL+uFBr2}= z++4@6U3m^CPPdL5(q2!lESlajoStjc29;>V_QS0Uh-4HK)J6}FQPiT&qG)V~+?71~ z!C~dVc1o9{Ht|JIzUSx>ZiQ9NNEb(Byaoi+@IhG-92?!zxVTsz81ZZ+NlWv_I5^Z& zbG2QC5SDY}v!*&N7{cK8feUVT7P*-{87LVju$~0N1xfPE}#=L9H#gWf$pOvl;el*hv81b{O2%PwzbPIQ! z%iiNuKM<-RorT_MuMBDDq}ncMJjUENfFJz5?H121%JJ<`pTzR4C3?aK`m9buS!oH>B!W6xL_AfyrHBWx5>3+6a6=W|2InlEbQc=B2vZZv1 zl6qOYJid_5ryl5t*_XEW*L~YczjoP` zzRh9p&)dFT=-&3vV}F8v7yPHc`hW9}zt+Df{p)|bKecXr@y)@s*S{Y0Fa7#Z@alGl zul};*`vt!p|M$zEp#OUOr!W26{_!R0Md_DaX`fkB?tbf?_V73F_|mU^lG1lNr2V|} z+Culv>mU9Ey|MWx8~;zgwi$U*YV(^P#Cq(je;!G@IC`Y1^y{OKS9dwI{AG8-g5PfV zzyAzPy!vN*|JbkXg)d6&=T{)s;!nQwPun}@KVJHEz(l&W!|R`|vlhCovwQyx%^CQ! zlmD+@JLz7OI<0j>tqm`}3r%}H7P?;gb=c(}Z*SQbpF+zWK6UYT`^IJG zP^ruA^ljFAN>6>0_Hg_g_p-0Q^}h2L2fw<%)GT!W1)2FNw6^e5H~*i$adRCibvtl) zyY->)(`V8yzC06I_I1Qn?Oz?D{`&c&1;5Wxe|!o>&wYBx|J^r-f`&>Dg{*G34zoIQ zF>NpB;{CF(zpuXYg~P+TFP<)Re}O;t8I%zGnWz6Z-+KOQsMPa^XFII_Gj!(1wAY*; z`^vul&w%zzhZleS+p`6~zxDj`8I=0?Gavu9Z+#MnN_~>kcUq^GMqEvM$i1p4`}*3_ zoxeM*)ct*Mq5JQw51&EVo1gjlfBH|q@}W|{dxv*fSB9UBPP;e}ZBzbrjDya`Vc+Mr zFBkl5Isb-0xmO`a{bT=m6g^aW^vUWj>t?HS@o9Ts#h)twI^k@Fox{a?yZ{ ztK^qG`TTF?{J7ZA)VNQq`nc0eMWRpj=_NYTnUaIXq~%AJ`O6!(`2T2c^uJ!h=igYv zkB==+jsMoFkN+-GEc#xPQKrlMwCsX0X?54_0J+^G@K?Jk@VE1P{_kDouYIjj;;`GhB%yXOT%9FP2>JOEhJ%@(%sD_Ss z+=V~#DVM3S1(T;f*{YxV)Gc?>)0`P~I>~2s9py4x z*!Ick%Rtw?{7nzh%GMcsbhgj-+$m3b`ELJkIp(F*^r)1HUatHkf7h(o&?#B#TlHBR zi#g=W|#7lV7_&5!*ZEiT7LePqf_f5`D;-)u@wv(O6xP zbacb=aJgw)_`IIR@cCne`~?ZZIkCx8=X}f-l8vCXT77deeq6HMbf*?Kf#`N zUJ*-sR1wA7g#2Z@g-^vcOnvHyR{c{y7W;^97@la>nZ9i9t4M0OwtTeQv2FBoJ&mK+ z{v_l-|A$Z;%blhr+VomplvKn|%5K$VUTBq8Cbh|bR>>9Kk?VR?ku{G~{Pj;!b7Kpp z&Gl>3&-K486$KKrJ9LtZ9ch(Gr>3n?%QLsDxAiotx4%vCUu>b~$F@(KAJwLxKjtl& zD5h=p8J+FonbOLnPuKh$C1<>&_x7lw>%H9g`~2M&#)dw&aB7==;bY5uMH$99=c}3O z&tI>6`^ds)pUL^bH+a_VOP_yGIi_*msKwRQ&n_+)x%1+g%6EgpvW4I_77O|N?Id{F&+pC5gF`Rl9w zujN-&Uz?x${-ul8S2TU%AN<}|{x{0LfBzeNbZNDqsI-0Lo|~JhntOxlo4<>EW7V0} z0sZw=)%^!jTmCisM%jf=0)j7n74XY@-?!Y*k6u$Z9w@*93d+tFHEZ zCGEtBIX7#vJA?fvVeZs4+sMF*c^TUEl~+B!`zEsI)emP24{TgeoWGPS`Rc$Op*yu{ z^m%*Pj>eZuR(W6ZRh$W!NgwE+U0kbCt@e5x1ZgxAbGCu=S`EwzH@eCQTbf?cd@DCzBs#SW&7NKpVGcNTAqp>m15Wq z`0Y^wM&8~dpYMq$R42ujw{1vd_^V3!%j%X=S1|F95>Y=RilPz&TCM(P_R8n0cj_x@HpfsKiTD;%^-yN2VxB z((d0KB)<^k-o9{k#sOx4qZs-@DZ;<~C;b^7q@4$*bH=qHQlnu^Hp*embdEAM1&SDyUiAbGpq z|KmLJ3sX{DM^aoJYn$3)wI*X_b5cypcM+Gf0s3&RTFS7NZzFn=(5Xud;I@}2h5jd z#Wp65+hrWznHf6J5N*}UQhsS&*0g?;7(Ic2MFAh@$@_x*yRH6f@c{INgZv$N!=(Z}vdQKD2 z+v9Vg$G;oCK$>iPqcP!_(XYHMb^`#Nw)iG%Tt^$UF}^eH*ir!>zSUBAfZ0{DuTF}t zX~jRNG`&enV~T*<`asSr8woPTXV)+ILX(9ln0^V^6%;te=O&{WFrM zDrU_qUbe7k$;!EfdBsmJTUa(Pzc_En+`>^MdBqFnm5iFVWPVZc+_L`FrZB2)?`TRSQ;N(H3|bzDT0Ds1uM70*U2E-KPRJiB~ZiLSV40s01i z)h=ANV&2@6qGD)50kkbdP+;MQ2)@&9whB11eq`<-a~Bz=6-;?6)#k2>qBhz)Rncux zZ8piLRML!isJPjwqCZk6F`bgoDDGLxaIPawYf$IUee0QJ3s;A{I(Ou<$hpGtJN>?^ zZdiBt$VjiTW8WY9V)UEpnD??c6#VT&(EsId6uK5GpwbVMS-Y>bCaX=+37J5PaO!{F$_)r7;X z?7dv&z`$wDR~lQDdUaS`u#yXHptp1AChghzk{v^dj_H`dC%P1GIIT!aCr$e?NkpB) zFa`bxruCF!Dz3=M?BVSgYqUHrbAGB#IKh9cqTL+Kkdk)BZ>+*ljrr12;@Jy~z?V~q z=_!jAPTk>jFZE6y5v&x@@CDKLD|z7idBZtZsSj2f6YqaZ^~jC4&^LZwd7wTFjxTHu zd*#->unipUpU#GemDQXusXAjwU7M%gS#?i5gF9c9V*cG(B;eO#<#-x-r4ZA6qQp#8 z=UFWA-7HKYtJ{ZjReb|htL@q5V>i9 zen|)RW*eDoQ zgCi?p{i6`;p(eOup~SLi#!TkXI8&e%EpGI)41FJ;rj}WZTk!C4GJ5i6EPkAFV z{fNHD%NU1r14X%27MmU>gCGm(`&qKR(Yjc zwN}9dNaqLncjm#{CE&Is%6_y1bHyq9tqyF&M#>C_akZ2^`V=-| zGo^*Yq-~Tv=@d478>Lu&3Y-5DRX{MpIf*x}^4nk0<5YmuqGj|Hc=fbCw-CKlqhhRF zLQ1LFC*aZ&G*t4c3#mG&#f&)g0hi>D4LB9fen^fNwY7J0clwpkyi9E!SuX$l%P&D+q(stL!T+Zgk4TCL)r;-Idv zgNHtlEJPo0)QV;Ff(Zqf-)|mBi!?n%Oh&TtFG+7w_;VQ!)JW9c>{;bKvh z!WFd+&Y}w8Y>bw0NfTl|=5+y;A*J}HzNb8Mv{s%phen+WOYbLDR-q+1;}bha6wzTf zxJ4*Y_c9GHOWI-QEv)}?sm{vxDaUi{RvxbaV}!{mMJA7CI=$awHwxRa2nEq(q3i|@ zdNr@s$6Rxn4>x6}M8pzJ_QxIN*;$_LFd&<};`OsUc_I>eS$voPB4V~!k5#$}eiEQU znz#lP`m+TJ;j&)sCV6M=i*dIi`QEP-6WQjE-L(1s*iC zKNhf_GD|F2#0!-99P}$Vc$~u0w@~I_=ulfI?aWiygsqg~ap+esQrhjO=&@LnHn)Gz zQq3A)sl^Wcij<<^qIZ3_DWZA^bf{_If*2vg?1tyh`gQY;?f~C&bq1|fng-}l7U)-` zw8@^UA}}qZRx>zB_#C13*wi(NJi@1m+Ji;a7`Vjjx)45U&Xzw@Zs4*LyA(1Ry-O*R zS$3-6tbKR^wk{EXGaQo1#$nKB@)?|>P>01SS1H{G9c(Ccsx`jQV`}mKb(2X`zEDO# zGpYcKeA|Q{36)u%fqRZNneg-WMAEbxE`ACZV~&~d-fM}Z?Nz8ynZZQXfl-@;vJO|w z$G)+RL0 z!|kpW+OP;LFkZ99lNZV8g(vwL%D@!85yoZC)2>_R-GUw5C(fyAFfy@nuAI?LO>6% ztf4Pn#c1vao9dx0L0cV$%;~#AA859ZeRDT6r4%0#mg`MvP4EB+E_jqjj>~A>(3DX| zSRojUV4P8TF#MQz^>V}!^ze2CMCJ1?k!CHH67&WkjcwcAU$gSu7W?Ek)(!VxqCDq9 z&6kxc;I%`K@>tf8w<)?467Z)m(UnjlcGnh4k?5gj!u2pdL+j74!GU zba>_}X4KS?gtQPIBcG72fgp^dPVn|QzZI^dFNCGM0gq>#)S^JWCKC030UDHS+q&sl zrTFZyN*wjExzM7mIP_NNbQ+xf1s|OAyW|=LJ#+0)A2XgKnN!+Y80MOf5k4mGJ=!@n z96kZSHNuOlT1-1kG}cD8i+HHeCrN=qvS<|7R1sHK5`cH?g%mPV@ZWT$%-ph!XM-lVQCbJIgkZ;-FQyh<7}YL-egoad ziET7%uDbP9WIqNCWFtCYn{?Ia_J6@W5rg-%mVx(Jm=6mu!i|i$GrHYk&i${ClxbphWWts9lI>dQL5#b1Sf$?8BFWE(g6H0$s4!$Y6d-a1ly8=jBd{rgbwT`P z1$ij$RL4z+xN~ngk;6b(^jm;aE7naoqYAGSL1=!(nJ?G~v5WCX%`kq0Dj`Do|MJ zI-f{N#-p%ABa?}Y78xBfj59#>?d;yaq*VW2*ep+HWRd}b)>xbXWKw!jT}-pK+cVOQ zRN3JBu<>c2uZ6!70?xr#V(k782OP^!{p5#94+oqL0S^Zp{3jG}Osky%#}U8= zoDZr{z)87tb;#vc_#0miNLo8?Y9pT z%I5c{c=Vl#Cnm#4Fk)~d(7TakMi;VF??TqR2;)To>JeyMJeIBqctA@fD4rA?R{sJUpZ^7ks z2tDH_Lg>*$=ot!;#(Oq|p1dF;b|XZU*^AZ8PN-N?2(jo8RIGqI3ZVteB4o4{C~ED< zU_NS-7Z%ZUg1#~C1U5SM1bws~8Y?7K9dK~tIKe!&N#BjF$8)ju`rrfbL;>#E;1EdV zWYX|B6#hg@kPp$U@F5-@g@%{UWqiu#ng#F?tpY+1E`w&xhgjq(LBn&}M;Hn~zeziI z^D&?PxeN+#)`?^_z~U#W3(Tn-3d}LJ1?G>o7MS1Senj&W(lJZH)hdU0K*1~>g$kQ$ z-Ju|B9F@1VJu(x|oRo$z9y=RI?yRkeYwY{TPBuE6h9(;Yr@%Od$_D9=d?Sekjqjx0X`Of(oq`83q|MG8Sa)lUT>Id`jO){1h8afBHzrlho_GB`@Q- zl9wOpcytQUqM1lE(-Z%V znB(g-FObE!uZ5@ewY%i|Dp?S;VIebo>q4_qrvk`hpO=Z|`A1*SBOFvdfyB{#|5s@y z!bA4CjS|}X3Jmk$ccYi}&J~60qMPvWVyA&TM`<*eGB5~O?@J{h)lrKkf|j|pxF<(y z`3_PYzA_pPCBZVwLO@M0K`Vre#|W9F3Q`>-Wc0r_ZrYp%$jH@Y zUFgHe=mTGvZGGr8fVVIEg83E>)BM7Zw)&ohbiHIFV!`3tZjAw7>lrfOlAor zyA*@-DWCSm=9u!uFbFL+KMav97wIDUA~@hh`sSPP&|tKeDgaXLvcHMv+TYaIZ-;?S zJ~$22&nG$oRBwG&;Zv%^FOe)zI`}Lj%~UbdPyq=rN&p!K zIEVz6YJf-~0Fg>o07SY9m%oRKQ2>#SwL?WPK%_8)nT`TP>Hy3X1r=^+Di8Dg_A`K) zC>t^eJy92s=|To3{cmz0CFa-n)FD4R?~tGJQHZHM#^zTLV-Xg_WVS~`7Tr11u*00o z70oe@6q#eLEn$4FEiv~k2XF+)sT{hQ$~njIsV-vR$NWg#bkz?HYxMKPaRzcgf4Vu! z@42zi3G2Z!Bt3MNMLU?#S^D^0vh0PsWKGH+BqT})3=CL*l4_;`8I&vSD^d{Ba6nNQ zQ3?l`!8OIJnJF-BheJ9HQ;)%YFrL97YbbFiQ_akTY5P-ZX7(`RB0xBmsDF=C^fwH( zK;GvTBUen4K%>ANoPgp|tj(`1mVOvURWD_-pMufl{>&rxTL^6!St^HglP{Ii_z}(` zspsSh(w)k|Kh_5ffuB(LiTYT7#yyH+nfH_bx-Tf1q zM~4L+g{)9`CqOFq$kY*6Ecq`O{VWEjfnnwH3t%`~3CNe$;_-AGn^&cioTH5SznNFH z#_`KO9mOxTj^fvxfy`?1;G}`GQq)gAEpl+47I_Z8pEpKHo}b`>eJ8i`zLP5-p2>d^ zXAyo8mw8?-wJ>Ntf)Z!L+m|r_xHz>UG?`ak#UeYjcEc8tgm5J@Jr_U8=%Z$hvyIFi zXWKGoob8#Makiey;08ifH&44AoC9WE(@>W>r{ar({W~yG2r{8yf}>$&#l0Hh8X%?= z094*FL2MQWM-zHz1&&K^0^aI{%V*L7P$j_R{w^Ra9zdh*FqfZG0D!6j=JL@{QE(K+ zH2_q5q2d5kTmXbs&w~~mM#g|Y2}X|$p3_0k!kR3v6D^+{A(|~mh!Zu=*(aKVjTJPR z8I*&6nqSuTBs|t9`Hz~|bI!xVZH9;2Eb?rD8A=}vPWO{x>{t8k`ro+*lAOsP+&g8o8f*M94|8H?8A;{co!V6-f57}HG>HT!#ZB;_htB*?A;+_SLA3mEo@ln8f28B#P5d(A2t3v! zk90gk2|U~!vBQufezfD|C~oMx71!}x#dUqY6oQj;q(^{i!62lMxbO>Il>G|}>+c41 z@Cq@XyQ`VuR-)b}nO)cSb5Slvf&t=in3VH~-_?0yg zdyD%i&C|x+a{$a=WN&UmUV3I~Jb3BlBkfQ~JCg>50{hPuZ@Fi5QWexeF z@ZS;uf!%c)2(5_|z$Ak~2rQ`=oD~pQG@LWg4gg|K1jeotE7$;B4vS5&%7oC_0p|e_ z*by~*t-*OXKUPM+wgtaCLDu1d`7}Rge&UZcjL%(YDvw=QGyhH(DSpRBD}JZ5T-kJu z=@)&s>1UWN{H(9{WYk3RWV5dF%aXq4qg6=NA9RGxZa6P?lz%Qp zS%nDgA6SO&4?3$+i%r$@`BLc;LE=QrIGgNqfn}1VViC%Ecg8Ew3W@SIEKcSThE4*l zlvGEGeL2#|*a=cD@t7C?lK5o8!QZv*mOffS9h@c4nb`PHsp)r`0MZQNYdl$5y18jo z((9AI-j0ijQ(vjC%~w44WaU}6P}K!>^>Rgpb^G4)#ANCn>c_yex$pt_m#4t6t?Bh;9@ens(cA8uSGMqX9pIZAw4><@T?*Od1yh+msS~7X7nk3KD?O13O%J5 z3P9oGIl|6sv3ffUb8J7vHo+=d zD|Yf z`Y)2RZR@R{C6sf2%*V!vBU3(*#>O?g$cbJU&|1GXvijDP(Y(T996y~@m>oyXxGi~d z(kA@#c zWz}H2lbUhA-nka?JT6#>C3-V9uA&#~@LI||!PQmC`&>#GAGuENZ|4a*Bb)S^%~p95 zy$jy1U*C|`jE_o32KKqEWn%8=H_I`Bs7%2*$j_j1RN#XJ{-~|igu;9~2N#GiZpPkq zdLdUa7BdNF;t{3!7Z`=H0`sk^<7M}qGJE+}nJcm#rx>s4X*U}2Axf?-wtQ44C!2f? zCahcmeDkHkW0LKfk?_s+=$qRUM{SswDfCb7GK?yprxk{fd}+HvTG%KP9Fmks^ul-P z?bcBnr1D(Kp!eR1`!#B8aqSUy!$^A~f5>|#;TtC5*GUdTgvAgsaMz@rRt5L#r2f{3 zhIx(foBKJV56-i|Z?5t&YRwntJ6sd#H!y|IwbrZv40ss2t$eK5I$C}e-h)JxS_YRk zw4DvW1bJAZl(F#?C3uI|59nC}W!L38dY0{Qa+C21)s@Hhx%4wW;kx96K9^sZm@eaV z89c(<3Qnvz-T4TkMM3WOY&-CYFm7BBXF@Q7cRei9{iy5?!NUweLrz$DoM_Qr_u*MP zHED2Dw)=GFO%X@kkIPJ49#*WGV&Odwk1S{iicz&9Hx#(OH=*1>o`{DEy%LG#@j{Hh z7tb-0I#*wde<8#;?l?~r+e{o3@YgE`h7$a_KeD)Gl}@wH{-w?ok?OKf|}h zax;3{r`p&*8vtK*qSZs4=iv!YstnthRDB}jJU1P_rO!3=XJ50S?+{5s>d;T}4f|In zp_-*Ut}Z>>9*N6Cy~{YW?L11JH40BM;QSY+EC+%*}?p2yA1YO}~UXHz; zN61H6(8*atj)nJ_e3XrsV}Zg`7Tz?}OlO-(KKgreGtr-doE<7WMPsgc3Jl98{u&#G zV$QK)pnDtDBM;sm8}w?WAyH{oAKFs?2YdZ_Wo4_f?p9EnfR2+Kq82fx5UgNNu&OG| zkXK`&4hYJ_IJ4@49Rt5ie`X(E9x!!~+hiZ8CJfYaE(dEUfd5qIhX`=fX7u0D@5gbN zK4O)Yh=uPIHH0tg*C+?LO)8HeCQYEJby_k_K1aJgOne%+nCM&UAE_EA;Sz_#i73Ij z`vj=@vRxX}q(O4jxKA)QLv--?d~JzBKzhz07fKq2TpU8|BQz@WId!H{v9V*5RO$~4 zSo^nIeW90tOsH?Jopj-|#6gC5mdq11nVdV*_7#dCXwq1 z-vN0Vv=oeUGb0AhuNu~|WC~lvcA%h$w2)&N4LQ+ah*MLVhCpJh(THd?QA!pu8d-vk zS|DIfVswO*fJP6e=Z=OiDf}2K(_-t-+J&xIFDDAPZ6{l!X(IrxVt2lG26gA{$kEH zREf;4cTO$bZU1F5oes02g#N={TZAi;2Kax0Wkji+XWu)({}Z?DjdvJs*|u<+umlIE z-?lTf$qYomCUXL;gyl2_7VCLFTLpV`!8IJ9=$Hk2%)yAFlb~uyU2jekQ~&A-9)6B! zD{D@x>9<${REFS}>O#cJdh<5De=DizocM%wVgXil&xFhAWKxpHlhM;r!tZgIkj&AL zjit~JXqbcmd&lBDRC`0h?@37b&4+Gs2=4zLDn{i%!mk7>F2ns{K9KNx3KD*$8d7%~ zD%|9d@LLKAzqJ}j?pcs&N2UXrPGoEvHsQCTe&srsT*a`Ona(vY4J-!3(w7EjSxXbo z`hCG2o$Zkl?#%R=2M$jD&EY<`5`&LzUGSHX3(JEUA4>K~*km93>Fl$9zi~(Rd8DWW zh_r*85C~4x$1HmU!CLdkGUFixL77>-oM=Y4hL?f)I3cLc>Txo~2|;b^SU1U$Ajh#( zFvw?~G^0XeMFsX=745T3|CJ@@oGR5F&G^>66cV&d8#ywD;k^b4=3}s=(N#lf^&_2m zK|7rP0}kb+NjFycJj|igeB9^uli^_wWvQ$s@976Qly`g{;84a@t_?dG1Av@++f7Zk z@$S_>v5T4y)2c<2&>ExN@UqpTby5~&zc@#&9vzclUI(oeR2X2uP22g_x^L*k@C;zU zxe|1qe6}}6uoFgSDGcn@Z%^L&tJ}!~s|4?4`TgeBKCGf25sH&Bz*v01ShY*Ft_LI` z50)GwLr4-KJ8ho4&JYGrEdT)Bq?7uvI!@_>rPeo0VJt(DK+~ikmbi!`uA(cVCr&H7 zLP~DFe=ob}GiRty_+Q7U9=li!VNxN;YN%%II~_x(lhmB!!kH zlQu0Jpd=FGY+7)NP%gwuiLf z8y%eJ>0CCw$oA5~Zp&dQYx^5w+J~TL`ez!9=uL`kj`GK+v!qPz(0J=MM9M7FYWHQ= z3>^`K1$}@^F8d80j@NH@)L_>wLlf{99R_04g`o*~aKhc>7@A;(6W%7l@PwdUj>@Ie zJxeBYGhalJ3S((r#f$P`0h)B|s$)~d(_R@$s;c3OEuRC_q%jPl_)+eNVZH70y4}z% zupkI0b0+WkVj*-H5nQltyK)F!u%I}TyKc_~bOA-~o^Ag+v?tvSa&-ego5UU1CQ%29 zeEZPNix$3oZSZF6_B)66z;7|53rh~Ye0}f&{^H$J0~gjx*Ia%1&xOwHiSkd;^)P9q zsvYB6E$411N{vH^xfG;T)&#v{wC|bZWX)f`fxTQlfCGOUZyBD~ZjlgxCZG9`(90rK zC((y}3dTzu1Hbj)pQ2j}`}BD)CQoS?gb+WE7nGIny8gB?NR4r~&y;Yu!>~ja(=op1@w7&*9Aj4rL!IbVgQ4k^ztB-PfVfgIYE(3$?|r~fUID7fMr|22B|b3 zGibG^SDE>5C6;LgKIT$$2sw#w(9#!IDV|tkqc~5$=EbYjS?BcdxC<}=_caB#@CmGZ z1(z;N9X#|l7~U}5ab3rnRLWJ2X;j%&Z_kNP^>dSoRQ-aaPnG?y)m3hS6)plhdouPv zJppvw_2z45-+XO=>YbY)xIFZ=Gu}(`Mk_{vC!kqE%@@R1`L7PV@WO<~*WU5{>q7B^ z7v6o~g5kjnO_vl362o9Rg*{2W_uH{i#?{aHLIM8eDKN}mfaX~ltY*X;>i){F{aejQ z?W!7!{D7b`j1yHCEIA;^hI!S%w243N1yWKL-ZM}%4jjc!y$Hxt{u8~3+rQO{ym!j( z`j=KDR;C55Nb>etr&ffkvJIy6q`HBWot26oNZFZ4?f;uv5zWI|5zE6`5y-9$eidf-n;h1`g9NRJ{b8+$W#fI`Hn6=@78P5duwMQmdv z>+byjSu3*Zky;V^WB*1g!aPzdl7kH|#dr0s^3TCYonC6;6<|J|I_qvUaj?(qHAFJP znY;|GSBe#Q2y=KDrCw;F&aR0Ut3G=C`TAd&n*7KSFdsMs^MMAK59~to0nmXUo`CtE z%?G+tZv5)?@O%Jofi>^H%?E5gEqPBpI3Fl|a6TZs!ixfKKu8GNPxPnkF3NpKQ>FRX z?lN*8XsQNz)v*ho?hja-b;QL~i#MzTv&*Hn7Edk##fB2JA4#MstpJ;wUyFyr5*C_0 z!okeo<-ncI1TwAV3ZU3v8NC~jYuGWEKO#B^@I&ZBoAJBrrjn9p;Cv%+MUKC1!ux?C zVhV>Pt@MZjtObN2Tmp=z@m&)hO1x{*AAyzYuD+)Vj6SA~^^e00P)cddZ~&=7CM#!P ziux5T049Yv9e%IaNyIH<^7c( zT7`d3s%2##Xa>pZK+p`*323`Ebu;5oipJu99CNc9zP5UlrDjP8X_IB8gX_rhjFm#x zVcIJSr1f~3i}YhDmD;3cWKS2{kDXWP!WX|u-1FeyJmwxKD6)q$An zJFtM`@Miu2m*n2r)pq{Ph0uKdAQdY!vCR0#--sl$(u(YX?Ta2{rD~|FZo%b+d9dIQ zFyE=qYYJ+?SrrJA1P_Bx_*|3hu_e_cvU-p`*rXZ*4~Y8Quh|T9*Ls$q*1|5Oo}ZeG zGR!UETotPi@pgzo5<-)f@gN0Z@aAMyCa$zhK?UvxC}_wlaoETq4cbkih*;rdm?Ty$ z!Pff&vwuYzuqZ(!a=EGi^GYEdNHFq$dJ*-==G+shrFdZ26da~Oj8HqdNHDZnvDI@w z#!gAzZiuOK&(%(;na*-`IZvJQo8>Y(d*~p~Vqonw_Nv>P<%n9cbh9uT#3GLJWz#)X zz}VgG;4Yu;38eVxmLD*((vMTjfmPEW0n7j-<4}r0>W`8Sg0nJI5csp=GTTCdLX7Ap z;5{$KsnvW@53JHxZ=vj}^nb(Pb>}%5yj=D$$l%o~EZ78K^WM2rPT2`yl01>!f#rg3 zq;wl_brGA_6R0J{^MJjAbR#c9Mc14TY(B7grQ||noua+NQaV zR)wAT1bhh^XMux&Re|(x?Y2)Z)lUsust|WdCya5o)TtA$Sn6M2f(hRTU%NJi zZ0r~bf+SFmAYVg@l7B#%WM1s{c(OVJI7}c$va$+2&h2x4ON0;eB`vvSNku`kK%kWg z&&bL4>YZ979i1$MX|-yQI*zZs>UOn4hGE9LFvpLTHZdPMxc8=e0wvu3p`%OCY@;Xa>I@svz2$Ca=3X%Jp;6) zLzTmi?5NjTvF(YVH&Jy-Oal^=DkL!hQtc;l*-HdJ3nV6!Kw_f!cM_9z99CjNI1hso z6O^P01i8r?kefJg2#6!Y3$QnUDcSrn1Un=*sey{)AVuzl&}f_OQBOa4^BZAr|vVqMA2wLTuP)Aq901)6G+bmDp-|Lfnum> zS(y>`lL6l3_v{jWnJD8<9GgGoG`4xPr#thfjc>8})4T3${`3ttfBJhpn?HS{0)wXt zdM&Gb)k`6P%d~mRVwe-GC}lV#-$9gugeV9mU4!#~kTy-sxKTU)VVGpSdeyD8>fy9$ zVM2@b#se@35_~TEsvag%(h1-a9McoS4p!0DBTERS(IzblJ8vATz=)F4KJT@ z_k=J;pHBt}fHZj;DkL65h1ldNP$*zFakG#98bCtAcpKvA&SsGfwN<^Bd(O&GP|l$PuXc?GQs@c)FFQE`1nv)dvE-veju2voaJ+A{drlnXHDf2t?n&>qR_q?R{P^#f9k-%T}X7 zJ#YkM1K_xeorfc^U&4qjh|oq49G=~RpN9=uZfwz`O*5V(%RbKlSxN>8;EG+(IZpMH zZ-N-=O==K+mCE|u7Ro@~FH=sz+41f-wau?fZ4q{<@4qjnDBd*R9CLmiOS3#j^>W-I z=+jt6=4nLiwi`aD9OYk7o;)Gh=(%DhqwlE%feX+p=}icNePm~2B}K5~n3^I{%lFMC?{%>cCWA06L{G$f;-XjtK=&Z=w`g0A8F}3>|s_ zNDl#WC5nsR!nqjECjj%ZbR!TgAD^UVz66ftbYNbl0rOI^5-M_lYFYeDDADnDEu}pG z6?u)w*pP7`BS{6LN>!V@VSe%{EuIS6mb6b_JmDxW5pcDX)c;~^X>+SeU*rH@ry=V%h7zAieT({!BumuNU3n*TA6G7OL zHy~`O24Rb7P}p*?kmYVzU(_QHZqIcJTgqgtu%&n2|EREK!=r>PX^#@NI1c|uVM~*F z7Emc?5)WfF>+570@hU5Du_J+t9lY;pP#fsnJS$+tlzfS0D858QN^m^Or;zN=Bl1TR z?D}^L#X*jDOI^(d(oeJqv=snoGd+(4E^4|v2-GiBFH*nInpsE+6Iu`o1+{J^XZE_# zhe6waQT@W|{$Rfs=SDAR!Vm%eEU{pTuptHPM1iD%Gn|Lz0Oej{uT6Iz7VV_WU!20$ zzD)IU8DZ{N+pF|gi;y0hxs}7N2-!djvlX;3TNe*9R69TflL;c2%!|NKWg&+BEq%8G z6fllA_4z4)Y6dqVXfiK`r|VR~)PV}7P^Y;>mbP9ZYdA0uZG4s)-t??lnXO{>TR;s% z#c&G-)Gw=8^-JES=FZyM|C;)x9%3zwYK-$RsD431Th(ybXaJNjYd|dQa0NJr_ON&Z z&|3p2VN9Tep0>vnRRPXBp4!nown%{Fq z-G{(j>tFJh^J4*#L0=qD!8rTk!3Xp&&)r9J2-LCi#)!IafB^gr5P-j-v)HT#BrE>H zbYbYoE+9c%GOj?H8j+N7X{QGyzVt7ENOS}7aGt{;<5zzU41}D)=~(#~5z-wuex!HeytSZ{@uqUHkMVqk)#9~J-Z!K{ z-ly3w?~6Pj?+dr8GjYL`$B^wPMESTCw?Wn_hfR7fHUyMoYe@ zAI5ylr@#k41AOo^f5Ut|yMe{O`)`;pF@dFnE3YEV$Jr`kF<&OgX3S{!i+2I@we2Tb zF7GE2Tn-Q|!ww+Kmo^SzzWFW>V?OOUfO|S*7%>00G2g9mw)fAEvk1?RyN@9r#C+8& z%rTwI8K2JOkHmc0Khj0^AF$E(AO0QYJLcc#wjW5h`~Ckd<}-AI=;ll0f;slDSj?w^ zT{Bxt`A*E&>u-0t;y-}-ev`A9uYaimWi+fGY1qga!1qM#$1*uew%NeTAPuoM%jr}HB9>kC}_xAIjWIoABKILW`KRcP6N(pK&qPhK~>Gif2nHzkHJ38 z27cMLYJRD{nm+*hIDQ}l@c&EM(p6mf`S3TzPq5Z0oXU7s)6XM`jLfw!TVX*C)g@t zVPE<&;1FQbw51<_I(SF@EAP8V*!tbeHRiy zRG459mL>d0*w@5#!3?mAaPq1!lovpPFo3j>7qA+y||OWPA|~B;(up5HvI*V z4R-SXmTo%+UbRd7w;kD*1opX23{?D;am!Ktj0X=SRnQJ?3j$%)$6~(@Uk`)Tp8g3I zk2@1GJx55J%r}Vmo*P7p#&Cb>XL3Afrv7Jf>c1~U6A1HqJnK}uu&FA!n= zL1tskMBD1ziS)xefSI0$$j0VJkJvlU>;AMpP-6bnlkFJn!3sZ5R;~bjPum-y z@9FVG`kv+mNZ;dN^*s$M6rk@3>IQue+{*sTQ(%}Mfw%{$EcYN7YLWh9kU5|pIk4?y z6>M9nR+@uB>hnLt@&0e|x=ksAoNeDvw3H$IK4*J2Ss*F6&)NQ1tu!ju4|2BWZP&}V zvy)d0=%(JH&M5i<>fOGu2N=h6jAg=kj85YRbZni1bkeaIHwP!qHed2D3kBOv!DYR# zoww3_TG40qgAH?Bu^z*Ci|`J;Q**}{13Q9vVy(Poz-Kl9oi95DJDs$(RoPr%=R=Y~ zGK9V@IY7IrWDYARJEFO^`1Y`^iPOmEk+Q=Dj~44)4=A>10wEe{G}zZk4Xt6e0-Y;- zROJdcmya+fK1S{{X`tOE6>wnED&D3H@zRQMeenO3n5pp+P>2*~V#(Xyh`im-(f~%KJHAH{5qDTyB(2q z>vG^TsV+v&CnC=l2Wj-$3MoXlXiz7IN0w{A~DWnx7DcB($2e zKDQqkpJT?{6f4gML_3fZ#fJ8iWfr)oPwU|M=2+ZI4O5k_AbEATmnKdd*sk$#ri2z# zw`q^jk?^nxyx&5L$DDOX&jwxiN$a6P7rfwtRvgoVE;!JIpBazX$b21)x*&epr*XLc zPQQsMLWS75_~eXh+%gi0HloEhJrefru|5W>jMGWwCo&orXpvqcXrjJ~tEF^`b=}GElZBV z#T6I-dDYaPq&xvG2b}y9@0pSW? zvZ{CMB-pXiJ1t#cH&1Rn9BMDeUO&_e=Dps-)1dMoGRGcE|AG5q2CUFoc-Qtm(L?4k zeokjF+<{n0jP7%DI)nZ>Na^W)s;l;RT6o{-eYRG0hgx}FNH+B^J@TEqCSiCJo$TPc zXL%}NAWe3Zdt`ZrN`Vm=KeHjZOiRDuC94gPo-?LQYv7YV6%KJf)h>sLt9V)0yuh;0 zo>Pi`2R*o>in7}RVZm=?2ez35w1OiBN_*B7)?lClQb}4ZL}ZdZOgg3@q!$g8IZ6mZ z-%+42e-~7SJy5Y9D!fO-mOaM-xcq3K>?fgOCsZu4D~P6bAm{iQDzq5v0IO9XLnEU_ zh7qwlr__10{E+G}1ZFkBUPcO-k^)vn2j?QWV_i2htQ6m&%!mB34JPnF{zM1o9*a{_ zimE-D73rSG2Qs4yMAAlJ!ujc@nr`#(QvDvKL4%h2=7AHk8(say@qY5G-y|R}Sa?T+ z(WY^YBTEzCaPF6K$8`@D;oLN?Je@_zy#|Dgxe@GIbQcF@MaxHpb8QL9$2Uy5G& zb;YGpBTYk#hS-Y!5g%BEcP2R%7n$SBlKSktz5ASs3!8t7wZy^s>?|lQ6w4ik^JfPY z7nbD+$y&xE#YLTX4>N&PTr`OHG){PMQ`DV{Q*Rvi-~SZbpi(wYUFV|cbdhb{VGk6v zE^K{)($1ZrW={XwflYzd)xx=_!{VB)=hZ1+D zshJms!ty#SjYdh}pQE6L{|ZnS#-oK`DowOBn+_*14srRd&@as@$j36ukYft_nTYNvOd# z^^*au!qT)_w3dN-X)8c}R$IXeGBg2K-R711Y^@Dul^AGuBMlPcqi*ZucuR)1SU0lI zG?m@o=s@{!^X7U52`gwLdR$&@fX$5{82BFFJTl7#7u~W(a8I9b69r(?vmK8SpX9Jk~ zcmLikQC*UQD=_jcs!{@S3wW_w^LH!lArper-{Q6nVsrn#&!Y0R)#w+z{f+h8kbY?^ zuhGA6;PRjTjv41E&g9b`i1QrZqa%jERzpMaM zJv_b~pHaq{*28m=N6si~g%hDXZ$_Enu^zYB{mSO80{hf4u$?Z(IXGh)Wls-_Wa2B@ zv7gTm0e(^W%g(F^AK?q`^DMr&R)q%m^0hF)Pt7b5N6yOoZhGFBd|fG;eQe@eU+(%W zT#pvGn#Oy^`*H`K)UTzE8NUv^#H}yzC+^R9;KJ_@TsZOIg+Gpg);v#vVTk%Xs5$4r zIm|f}p!LQ6NS1I$l8N6-+HEyfTU@e+YOl6tk&yy&&P38E>GxRbc~t7TJ4s#{PEPt> z(xF*z1w>a0*L~C2>w6Xd4|{JO*3{Ltjh~YlGBO!v6GXs?$pKKn1W<9Ppw)sFFd`~W z7?CQ)su_^MF*u?{8`QScT1AT$`+!XVZ5(QYTBR*&RI1oI#1@sRwcpzN1k2E`|NO3B zpZEH%_qm>|CYy6k;$Catd+oi~y4NvRi7h#KO@@fGhRSj8{eStsYq9_MeL2E^{=OVx z_wO6^Of+8O3qQaO znq}Q6cg5~;sobq*Rxk_so%H?gwn;BjlFq-V@YaS>JOcm{bcaQitS7Gf(NYISq&(lF zl8k08lzFH`EJ+;68AZhKR4ESZ+)>2xYV{r&ijXy+%g(h?KYR)tja}RI2REturc~k>3{BQ} zyYdR|dDqR$3CSGI>nYuK*}hG*1<@!lXqy2ZIQi`7dZFz+e2f>nG&es0+`T&1^>%G@&63}#Cps> zfmtGqb0qs?%yLFxGYp>Nu(PF-|1bZ<{~!Dl8)7YSZyd~@0N}hKwzc7nD%)FY+{Bs& zsgcR?yqNFSM^$3 zmt15xQI~9BPK5P%ZQXQu(>$PxnPP6Jt$Q1&B$@{_AYO?|QYx@RE?BM-Z8ON(IA&BC zj89k~CZXB2g;wTjp{2Ms(>z_9Xw6An*oV-?B4?z*4R1)!W+#cuXk-7RFF017@+kD=X5C~2m|z!0}9N5_93+1fp+ z8b!INMp3ZS%@W}8h*>NwaIfgt?w;?albe6k9$_sAwyhtgvu1Z9Q+aszsfdVgMkmz$xC)mLnTU6oMY zdetli5M#_zqH82NIy`Vl45TIOmqUd|=FgS=TrCCf82U7k3E}K0(hE3G@}9EBljU?9_HPr0t4|2>2Ijq{PM_*wA%t zB(Niw`JqlF`;^Sl)54j&xLsGgSE+p&_Pm+ZQdMEFYgRzJninX_*?!ZgfllQI_F4kU z7+&r9@iF$&rr`#=@uw$>+sq#}f5?W3=8lFxHpZ&lOHKbsF^j zy>uLiANqyU2b8i(28Z$s?I#BV)=grP!Q*B8Da7@y$)81C)=p$NyTXc9;iv%ZOas3+ zq(R^ zRYBXRPBsu5jmdD0mgof!)J4cw3w_kRGDFf8`(bq{_h`!$RgT&f*Kr6k?vlh`vk)D0 zNahn7g@G$^=NJ>J<3>6J9O?Dk?I0{t78`rLaH||;U-E|ZXdhOQyGr6}r4_Scf_sHF zCNRd=oLbFV+!)mWtU*OAWr@w*-HY8_)n2uzY|R^Z)vi?}veVrw857_W;=ytGSe+bj zEw-W|MU@#W-W^-TNX^fb!JF#1)V8=(9VUBQT2yLS=g9vVh*4mVXLqc*Ax)pDfZc0I z;BWQ3<@Yijn4y7zBs6%;UD0p{_dxd+*v*Da|5mhF)ELo_P+IWzdKPXPUMO03xrlqQ z0>-Q$5NR6_bQlnK7irer7hRh$5>x35`_s&qY2!Cme2XA7*gEDa1K~l0JIc=i~?AxIpQ`r5ta!Z9Dl- zsc%Z&Sznkqs-5?bs!bF}t)FV8z17%NwKWhc07NTmyQ@|)qpcv#$juwoRkf-VD=oXRyK2c) z(T_;A(&bpSU$(kD(je7t$EsDiMb4Zk9SJTMHSI z=>3HZeN+{^i)tujq>Lynw2Uk(WGF@+EM!=sYv5hf8 zRpe5RuMB{JKXt+dDV@9&rs;OzD!`3So z;xGw18ao==9oOfqX}1*{rK09=6Tuh1+>j>6d5NOlz=CAa{AzSEQ+bKRN^AZTTV7&% zxkU9)I=XOWdwBc@6n)DI&c%5jL<`JwsXTD+y*bTaZ=ydrW8+wqJrjLQA6ZQwndzSA zL$du=NZEd?;k6H5A4^e6EY6E1P44@ANRCIj55k@K>F(L{_rmLzyXJ67e@E5lOF$f- z)ZbCLxXwL$G0j7B;0IqZZ@t?=g{#7H0+ei9i3@VaF zEnH>Q{NB}2<$`$u zAYF#x+`ZwO5e8NFiIi`m47H7u(AtMGR9t=0dvC!@)B2~Gw(hGdc-6YTt>e?J0-4>0 z_5i#~V~oXwI2wh7^_~|LP`)?enP|B0xFD}0$66jb5Sj0WaK0fF%@mol@$vUr%n4J5 z&lvjA5s_IUJ^|m2ZwSRVxL$+s@O+5;PVfdU-#lM>Qwp9Ke6yK-k|H}z49>3cMA`@F z5Im}+IrdD{4#^yt6W(@sMYq49Wy#08&`K=7Bf}#wh z0<#ILpaiQxidB$?RiMTycrHddYY9R+tC)dqu=IHg_`H+P5W_OyEGOAfwPxBG19N*> ziOFq!*<+I%1CFtPLrg(TR!GQPn8RZT_NZ)8Uv{dd6jYHl8|Yk1)QpsO&P?59`2w`C z2j=qvIf%`qd%OXloDI|ROvLP(VF580=v`Iw4Ju=7rR3FihKOZHDbf| z?jyuj)ugtTbzn5u&aUO%tM7`U-~fckj9U0_leqjq?^XLKGp9H&0O` zB#oD#3$cw5Pc%!X*Up*HOm{`ah0!dn2y*v$W;xZNogY3uZHg*7@=)4*?)2Fx$mqA6^BRKF_)X7%>IeYv!9=K9hdTt?Y#9Cc!Z&SuLoh zFnysZ>X>v4dMNr42>Joy_XAgM`vl={AvK1tyJEU*ex7#cP3D}Bx?_6g(At|&1S{-P7fd%? zu+m0c>WS%XJoyWR=~to=rdxNWIm|~1R_#L(rqh1az~$cr91k(2d~xe+S>`-bKP@%$O`wR7~E&YxM$DGhSy$q&8Ox5j;cc?Adaa0 z9hI4Y`I#5pHHRLfmYX1|8bKU4!rvAl(3b<6SA~E$E(P(W1BhCZ0{7gAsDan5n%qlW zOxO6$J^t?n;+FTjn=Wy`ja5?5jhoojbR|DoHCr!r2lw)ybblbzHU5cA*Ld!p%aB48 zlW_u@ZpDa5@)2daRzX73h|b`yxzoP!{;ydbbK{-ohwfWDKGofMdEtIrUhuSvA+XDo4(NB0}vqnYTagj`N8|*I~fLU*TR~g?e2=_4@Bj)azC*>h){*hNJj~_WN*%-f9KW)CK}!_$eVPRH^Pe z*EgHhXKrLCkNmGWRbJv5cShcIPEAV9-u8EM>U96sf0$EOg_!GOAp0-|vJg8jwu}+1 zyx9J%TzP+1-gK5&sg$$C3#mGcv|PxNn+92O(|Fx_JR2UA9nxdTRW7Dy3|#}0tMUyg zOs>{->NNRAat`DULs}og^MEr%g6xb8qYcp)_LTb4sc~^@IWBGb>nI6iDbZ%oXr>io z5xH|PLv`G|5#kXBRYUke6L+7KG>NUQ5Rg|ZNm3Q0gt%uPQ@Cg6Q@*!Yq`F(_?x?zB zad%XziD&wP=Fi=;zp}V%9$2CIzQn^(^-H3MqjKv4Q%USX&ROlkc;a;IqIjZ?o)u4= ztj~%!d`Mr!xsIBCKuuSmiMXg;98X+`&5f5$hX9a3dej6zAgT3(N*Ef5zJhftP7k-t z)`zubKyB^}eRsI#d?Q=zdX5NkJtzD2g$3#|K#l`c1+mbMLFXRhwLyVP3+=Thu2)5{ zj`Kv`E`TjJ$E*QtAyZg+qf&8JZ0R@Hd=10sk z49UETVuoej{$fVTM(Fm9>kB0F45+21n4zCvUCdA{s48ZZZ7MCW%)5-5%&6%++_=yL zmo024#?#!(!RC4cWB?ilcQrzFF{HBPv2w}09!97U^VM3 zJuVd)VP+CCLdys0w2-~n2M znr~=}Sqt6E=D`N53hyoDeFBfXeC0FEqt0Uw6jVO_(A0%dav0{`a%cs$BbX z2rh%&=1RGII0Dri$wKfE?@dQo;!NG9p>7*J(;e39=^&zKff$|vV%QE$++UnxG`Va- zoc$DWzk~^1+Estsrc7e?w|$Ftf-n6Rw0Z-b|D+wBAKGOt0N3vmXLHtjag}R?VCIuI{(_5Twr?fb_Wo>h9B~A&p*3 zCedq%Bzo;eEjPLv*)uY5l#d9n9!|LHRiZc*fpcaO0_Uv@^hp&9P@))ZE0rkr7Hn~( z45Jdol;0BxMUcgZU2)Yh6dcZZf*AnffdRm=7H`DxNb_*qrvYBLPxCioRSc*4bSI^X zR!S8=QL4zMR1r?8!V}-tUbYZWS`VUWKM0J{Xa7Z%ek;se{{v(;{xGcT05RSNl)eTi zeXYj;pet8rmH28i?>ddo&MK+HhT0!yGT)oJ8^@BnEJ!vmz~ z29cnLygtM~q*?```KxRLB>g))K+cXwD6Of10rGfU2TDV>A)s_?)@zim@%S&Iw5pIE zb$&I}9$DQDrFBd6VWmoyxK!B#r895K7Uu$ebneY=DD44+;~s*)L1{06XlpM(>6ss5 zloqn{M!DiVw)Wc?rDa>`k>y)$C_PzVWlRy+%DsmVKu!h`gq@5V_8iH|0X8S&e*j8f zjxg6JLs6^bh^|Jcj)WpRP&A7i#P04YXjTef{|>4br3tzjp$Q&jis)g40HyMSlTG%w51nIDI%aLe)JYq4XYQgo=;ok;ac~M(FbmHo|4t2xE?e5jNY55Kuaj z9qwh$d5zLl)uM)_9Vi`qTNBB)dNQV*#L(b=1EX~DVvN#tVHl+?9vG#c@sVF=euSaH zv>Zdj<^SN@Ze7E-jUMC$C>;nQItaw@U=aT%N;e7GDo;RvpAd9KY2A;Ir+Sr4tGwC+ zrDZkrT6Gn@Mpe}vrN4s*eJALF(zy?adrJ{Y%Tf_aH!Ra9H7&y^{ak=|OCF9eIJJ$S zP}=;6NN9azLut!7oX%Ug`h-Xz zp4r^#W^kt=kq)0@+zO;}sFHa&he{CwIaD)3Y&le_9e*j!B z9BHn%MuRUL-PIJ;j{vS)0j^tnn4;!4NLhrUTTpnbn<*+r8n}v)Jxo#klpg0?2&Nct z3Yntfg*xrX3v7zNj>M*D`IAU!|I_AFLpq0h!|X4pRige#G_- zu&#cM*e$n3ZL2yE+qwztO`3W;4Q+r-coPqk z_&3M|#T#Pd36g(n-sj4U6+q>5~KyI2{)E;ht=7GT7-4#S9D{UacD z)sO#!5Ib(Fx!yDd{NgEHO;LToK9BysJ#Y;6Fh$KYpzj{;V$}?H>1K-U@Syf7Jxr0D z!faTCOtI)kWQvjlnzSVcuqmFMicL|LL?$FBQKqO!WkwoPZKmjxPnqHg$`o6WDcfK@QK<9sXPgPuISIWyn}}JN`DxSleF%Ah%w^V$r!P7aqSJs zC1;G-srCr5O@U0jHBH^Nm%45APyGS0?|_KD3u1UHh<_8Yt6bVDw?UV0bLr}1i;ioq z2Y*gW3;w(ZV#^jYYt?h1WZ~TIhA+|1+OsGh;A-4W^%E$hOLhNBeKpmRW0=r_d$q9~dRb`>y}AvP$;k%pDQ`Qp;qWKiksZit-<{hQkBZxDM%FVPimC!Q&fM(jQbjyV(VjM zik2&yw2-UV6w}|vrl?;;CR8t?OwsZMGg5xM!^gfxnPP9s6yHOpxT3=p0kKoLHG^ut zc#YT%&qbGybs)C#7x;6|Aja0y7$b(y!ic@|2uAF)$r!OS24WvOq8CPNS1$Ik*JF%u zrf#EAw~amm3E?qEK}3I!Qp2l2{F{jFE^e!Q0bTy0S69R~-_~5W-k_yfZ}dQH!+G$r zPl1npsykwf#a4~DXX)9}C8XW&2(jZ=A;i91txsyL#)us$#)$ni#o+WZg+grWQZj+_ zjt#MiNf0PClOE&G#JeJ8&VbluRA2(^iU@GG1{C6M&9BGW_;M!J#`l$28zxE{Ln&>z zQ`+EB+9;q9yBTutTP+}(T0mgL-oyR(eC(&G=K8!;aE(*D4ilpZ5c>o-SAL?$FrjT1 zx3QLsA$&*N4Y7ZQ2mPGdW0**9Fk4=tVUqYK8YY#GG->3oc$mDGhKC7f1(_gOVe_%? zgO7dRHcZk-uEESQyPUC)ojDnX$y}<4EIMb@{fZE~qUJSX4-EP*BDU%Y_}CA?$9~Wa zvCSv-VNJCvaZ_y%#BN>Y<7chF_>cfSRXJ&y;hs{ zSW8FCz2{17io_{0!S$5Q$985%8lBnHu82<DM~M@N?Z8~Qpl->fX8dkX%DGu<+;jZJX;EF5t)^cOJ96B`B!4u!Y-9$6d9 zf-h8HLHB;mRL?n2ic{0 zW@oKwn{&Ya-W$)IFTS7NZ-3Y$s3Gyi0p0b61ZnNO?J;>v7sCYy;euCi!F;&jPq^R; zT)>zlt-S{q%(XkIwm0xZH^^IH3h3|S!Uy*pq=v7FiHss)M59Vl9 z&(rYqwju~mZ?$4Hy(M19fXaD<0X5?}g~KZ-9InMU{4;f14!+G$;R$tVO&|<+(L1&m zyt}hmHGp@*r(}TZiCZNQp{@Xq=V}YF-yow|pZi+!iHF54-s2vgV1x|T5zS|1G;<%i zUHH$N_YE;F;`N&M5f4C5DK!CH#b5ubR6Ux(>6M~>2GSPJlpJ# zdt&m1UD^~SOKDsn$ki+qP>g~{BP@2uB5aI;Lk8j8`syQ?QLyoJ49aASiyFv~Wl_EU z1@3k857adF0QdUVr=5Gfoa*%pRIks$x9N}K+bsKbX?gn3K`81$NM?;CdL4=Y)c%(u zBbAMEq4rxcNcFA!(OwjaZLm;O$is#Mt$@~Vq2VT@Ky zWJlhd$fou|MtE5nQC<{Ab9VH?7;R3*7#%(fFd9Pn!g|qUZ#OkUeb!#NIlw2o#;hYQ zb9;MbSZHaw0WV_?arhC_CH#mw71X&@fsieY=i3>w6@0sDnQFy^*oR~J5i=Bg`LaxC zen-W(lf6^Qw+ml8wB_{8p^V$)Fkj;4Ob|DWAg)Qnd@W}AFvbJa^b2ab2TjCXHHe>X zhG8SNe5&o4BW(b%$J5$%d}AP1OztXnqTx`4L_^I z4L|Geu2ibo;#?%0mE<7+_d|j_DBr3iT@A>PfkZqJlI9N!ihg#4%2wtt<5-#1h9q`v zdI}p=Zpgnc5to6nAEob69@SzJ5#t%K=(7Tf^rs<`i<36f2T~cBM?@%jQ|-qkC8;e% zjOOC1HO<8ac%6q=)0)2mG%RUF5DYUTA3|e9hEou3bIJs-q8Xf5%w6%s+S5DZiR}dt zar1rA4Ab}VnVhww--i|!h`p!bf(vupIT*|qCXKoX&)0+P-@0Or2?D)Hs}`tFf*mLKJdt>2SD*6-zABOUb%;Xw=8 zJ%Z^jE|X=IB04`WKSbxZU_`5nas==fRvX@7IF^fjH`tvgL=U3O5A^?uh4l!EtWmpO4wWCTZx$E_8eMr| zmE-RTAeB$Tnk5qL65zdw32eMm^bs9xF!@}CJ?RXLHwJM?U}je`uocb-22PBdL^V#n5X?ykgNW)r&ki{4Wy;s zKw9eE%_~XCHE>gMdw3=C0ybkm@=9FiA+JPMuT3kd$6m?9TZihDh?ORu}(Ue~S1y&fDRJzez^B2vlpoN4C!VPo#zUpUBo!X9O{>DY)2=WIwxhW*NIiQO1rMq~(TJ zOSIf!0KF&`ZJaQVK0=sFju7T~vBmExfjo@qjRyE{@Sxu!yOnYa{#yAhee(4NAk)%^ zl>nKR>8|{+^)886#Ui5+4W0O9o65iFi9P_h?NcOI=z9{cX!jb704F7X#^99i^IRIr z77q==++zBRF+?WUFUmw*sT(T{Rn>?fkTI|1qL!BehtF$fm|V)GW4QY}1*>NYK9Q2i zf`e4B`aDzAC(^szgHn^=GZe#KDJ3fepF^C}^@oqL}tb2w+FS>XTQP>#yV)xL5Mb|H1K(1F5_{`9dg0pCZgP zrU>(Xu%#dYnL3H$x~_S*u}(r|`jg&mHMaOiDz40>p`U-pV+TBTBx|jc};ejVL(*|NW2dFZZmO8&X2FtqU$uInk}V&sEN)$2v2mSHF%;6N#l|! z?+dG3#Frx>g>r8#JGl3Rl^j&F7l>3u+8Teud+m>3JBmM@C^Mywn@-F^v~utp5<-cKIT{ZT-vl zbY%W35bw!W0+7UjSQuzmU8fu1ctTS$!25(=g=*WYxPngbu_yjvdCQ)z@Ubs2;_u+2 z`rtpphtJ5?nJu7(mguhVA^VA4tG>prQC;f+AI9^-yx3Y{uDrH8e7uAQy^QVwAH=Wp zTdxp&G>k;>A^Kf@IQ(}EAG1ed_|X5M@;~?o1s|19>3b|sZSc`}C>Fyiw|-*5~c zr9Z?FIaK%cr+U4F>h;l7ulscF^~8AG>zw_#*W13uz5eT6tgPr+BVj);1H>@+B}C|U zhGNN603pR0x8gFR$!$}a+`yzET0K^$s8q-&os@0v8kIVAN6OztrI!73RO)ZN+bS>j zhJc0MU3d1Zue8@iFX(Ba7uxQp=ft1vTKO|}jqDk_+v&L#9%Sv^<18lNPjcre1UU?k<@rh%jojs1o3q#K3EGbdN zeBL{QSWx~7mWF8@aFuJT|CF-=EzA>jK`m>|x_!)xx;{KK=Yg+H3@N;gb%}FusHo>bXwNv!^!!@Px#Pd<5D0)3*y=6_x`up%| zUt^h}2M;{648qapm4X|-p?yu+hWrA3CWNai=2b#~`g{m)x6Fs|_U4Vc0>wNCSC`C( zaCOUkh;P>~fcSRBLWpli^IrUBbN%@e1NVGMH|K3UbkGRspb?Hewv=}HwiT@KwQ5%Q zc5~id!h>Fx^mN{Q?HJMPz~2;oZ4J+brFx)eKa0jCsF)p)VPpkTUeNS)#1Qz?!{#J~kKcDa&|MvZqI zI2H&$<_0$#0;9(Qv4hsFOfHkgV+Z=r-Uy3ze_~Xq_!FZ-!=D%xCd+9k!R5i97{c3D zV+j9!B!=*p_%_AX?fE>(eh`+=LFns2{F})|nF%q%6>rdja^HyQx-@?>wv~T;tc7`e zY>%b+%PnRP!xl(S*wSrj9-cshz=fFZOY?#!zPgk_uryaEt%Iexe1&7)n)e*h(p)tu z28AdnM%zUiN83?ZMjm~w`JR1kOY>%68i4J(mUr>eyyz}on(qzNt|8)I;f`id9i8_l zhTjuZNB=-|^b4w^pW==-Kgars{{!E)^%d67dnsFChD-yoPyqtD+A*W;{ykUw=(yII zIpZwMoN?Xe$|Sp5b%I@uD#5P1t8J`y%!~cRF<1VHV>eg(AUx>cxSn(6r;J<2Pr+Q7 zpM~a1-PD-F)l+H6)qXM#&y|(|YXAEK%CW0md6==sayXxIwWUAexsowLi08^*BJo_= zl35Aye07H%LsiF!Ltwl?`QY@X6%CNm;Up;KrZ{_4rm2xO&*Z>D^Bf~ZM(m2659@XM zf_RwwnrFFZC(JkfPFuh^8oK~i>U2mhI#9n5@-Pkp1;Amcs}P)Tju4#hcEJ}?vQ+@t zqlJQ_(oEEpEQF?blu#Ou5=sM5LMdcp(2n$N3*Ow^*MGpNAxn7?ss6iXm$VA4oJ<|VO!ll%)_hu;JbKrzqhOqm1N}P z@L`MTOOu0LwbMNA2`4qYcEalj_b(64P%8r0_$v;$(^AzshZ^0wl3Lw5hp$90xkE|_ z=M95Ph=KgUC92OIzS4bOViq}X7=~Iv#BCT_LZtAAmZ*MoxF{OPk3db~s0l>QhOiQ1 zJwL2O1+^@VFC6od?}J6%cgzzr#mP#NB^K#W0MU$?#imqRkSR4L;hcpg2sBwV{J;QI zs*tG5zb-k+NRyn*Py5=)?41I;NO)UG{v00k+%YeWjpjND%ym$E4CcD3AocxhG}oO> zL37>p9p(Y8JMdh`bHa1o&h z@> zuOs@xtgZM9^^^9ZFZ3B*jGZEJUm7hlUvq5TB)_w=k3houVHjdueD!71B-)%}y~Elo zf$=+owWT0|A{q#GjWYU!y<>{K`)Wo9r2Hpf_ATE0F9T+$H&_&~xlbQdwXU=;t=Zf3 z4RnlZYw^At-b4%SO}~wX6@-qPxHH`T5h)8yoP8_423@eNxX+NjME=>Wgvk9(nk-;~ z9Z}x9FVSK@-Osv~cxad%lTbYyVBS)c3LTJ&d<ktEo~SG<_QwR9@aG|OZ^2&}lCZu6LDbPJ6%yi=N=3hJ$30g0Hl?C0P*I={y}E#BfjY_KO$6*xLBFPN!-FkzD!wXaD(=^!H~ZrG zK7JdAql(`_i1xlslf`G*5z=b-*EVk_bOWC6Gz_3s_t|e3Meet&v8ejQ?=m}$-eurA zhTnolBQz@1eWpO;{4+{ ztKU@31LdbTsdAHiq@d@zq+%`dKT`YRnN7LP69dl zTBim@ggyzbxXB6^F1qhl`C+!3E=fMYnTpdiwugtw%sW9U3^X=xOjYa6WfmW1#gb@ zowp0V(A5lzO^Ls;T^h&k2aWG0#HYh;_gRJ z?z4^D`7!7G%(aSAAJIpgbQ0Q~jBzb{*y{dJy-X_i&aQCMEizSfmY3{#vmQ1^A8j6>T74%w?)nMf!#e=-zZdX_mB9n1eP|VHapS6TOFH+A@pAm7$H@C z8hYZu7HI5`#G);iqK!}~*v@1Jdm5UwZIDml-8z;;$0w6v=Nj_5gtl55hoF`QMB>@o z$|p>N;{rHEVb-qIa0B5B@tUKRe;BXgAc|&4wE+&Xm5Hcgy2R6(za)_=Xq^V@x6@Ly z(bEztDx~NRmK5cL7gqBcX5uvcOwSlEvpkTF&R8{T3HQR}!kp4`GEXpgi&S+%+9daS z7@AnP%BN{2yh&zbex@p?$AX9Y9qQo}Khti`yG4a3c};3tuU@7{speP&xbrgoX}urL z974~ zcDDKx(^~l>)Z+X3or;m@2eq+|pb1Vs9Tg)HiF4~xa4`~@I9HQuD@JlSQ6#%9T2UhQ zbH98F^0;{nb2wv0>#1VaJ5+U&A%aHn3iV!jDr|MiM-dxh+nF==XC{i_aL_7}-4(5F z6fbEM{}K0c&5VPY7K#Ne(?4cNO#LYBNs88Ngu{n&_Yn7&6bsr9#j*{T^o^1s0cb7K zII&@V#pw;KeR7-vu<+$AmhyKf;n5P5L2UX8N_fa(S&5r{iA{~V{}1K~#>?e|SA;!u zy-^*z>h?xr(>Wd?uKGGv>7AF7Yhm6g7yBZAqf%HqGs>!YV&+0FFCo5Pc%A5-OTO32 zbU+p@i(6bFtkFleY3$K%U*El9t!%X5i;08dM2)l2>8&^@;%TAvGCHNiP0}Mm8a?dO zyBC(0xb`dQMR8fV7wR3{LjL+xQQ{UseJX}4D;?bB)TcsXcwu#kyWLg&Xwyg{zlkOT zO6Zq#SPI>T3xexWL6DH!ogA9_Uq81YUp;&o-^HY45yM%-^xnUmebEy#Wc zZ2|Gdw&onL-!ddTx1X8$zT)aw*=V9#GPTWbq>=kFE&30RujDm&(wd4_a`9_a z#KuwAnITpO*Kl!(I7*%-qI;>;eSRL5P$90lndZ#QEg|!Fcovg92Gl+ssvw^99g|KZ z^ih#5Vn3E>D9u&2dRjW6y`~}$@^xyGSLzCwv&_5AgXY+j2Od;)`qi4UYT3|1}G9z1m3a1A!DDvj-L+280I>+*(?fq#!6j|8HBUB8B$<=Yhb6t}=))Wbk%~s~;&M98ssGEJ{r>`Y_DWf^W>7xn&Stx!8UmGW zoKHk;q?&tNw%s@gs!gQz(&zUOjM)iR_eL73J8sJf;sYMqS{LCJh%Ha zs0gJFO!-Y@v2YhsALT*t@wP~?*v*RmN`}M7J3#m6){Z_J(Z_pA!8>j$I=VN)^LJ8Z zW=X0@&O9QEItE-6 zAf+yHa0)cOZyXC3i7Oc?i7@5L9Uai9xNk;7q?}@)zK0i_OJGwqWerOyayJakBtF)Y z&1x2Gy&j~_5BiC4t*tt=|H|lxkAc?5$cQ#J{L8)JyCX}Sf@Y%9U(6LSYrkY9m>S+d zUwfY%B9QhPImsykrreZDwmCd*S`l;NefX7dBm4%Eiz{x;(xV^r*b9BjLI(PYNiyQD zj_K`Wkk2mnFJqlHR%C`v`@&;^@MYrbPA{BtV-91$k^i(T-Z;8eDBss zcUkL^e4CFgw7Kac^}j>zLFBiu|DP<9ix{u}f9-1;ov`g{0# z3xsXY!NT*&IV~CIoWIP+bYVec5ChQm9%dZ!cJeA$$GETSH=x)?evvHcd2`K`pS#E zSDn6c+Z@8a(^n4BCU*MDkKKx5{`yzOe53FDmGfEqMQzU#kI)7HJMcV0qcF2pyD<*w zGG7<0cx$j^jbz4O48%|#AVy)o%$$(#UPDV@9fm4n0}U|=tjdmp8x#XEa9WEhG~R7a zH(8&Hwi^fL2q$r?B-_bB`$gY7qcG44h_4}oDrQRy33uc- zbIkVRo{8ovx#@1rP;X|jiaX2A0&gIkwOq&bMf>}$p6PBW>69>M6nm7W4+i>UlvbesS*x%NLxxOZ_A@Y%+fd(D@6*)DJBXP^fj z1oXp?N?h}96LT5<8g}}ZP-PB^%1KUfLsgTZsNCoeFeT2~l$$1(&7C5y)&Tj<`#^qU zM>ad1iQ3k@#cn=O+_WB1GxV+%Y6fB|dtVa9c2p@uATki+VJ46rDyR9k-bB|lfp9Z} za5sVQFi?z?$`~Qtu7>dKdiY56%A>>HbU=Cc_^NnrtrRwpO1m8+7~m29J&qkMcKLD0 zDGhJLPN`Ggsbu7oN`mm2<11PMhff_KG#Z@ZW2pm26=tNYF21B|R1JYOr~)ytDrrOK z43TW0mai*{%HsL%{P;c{Omf#^?>Ef1WLCQGj$O}O(2{9@H@Z;^?q{0aZF;>mP_b`} z_DY9d=ZAPG+-q1iWn^-HbiE`Q)}hywmV%wEqtxmukJ9TT@k!%H#w?f&Fc)zRXHytI zPm9;OyJPP&-!;v%de~Tx>w+%qn@G1(s(tGaR3NM^;3*g$z(wazCYuU)Ddsb7Ys+q$ z+&2Gpu59^BwVuvrrmZ zHn}894!lPls!h&Mm^{p|r9-v7?m2DaTYdjhZH?)Js)bhnCT<378**nu1xIwc(CR+d zhc4D>Q$jqlPc1V2RF~E1?BXOnH=g){{w_Yd*yoYGX|ZX8HkWgy9-1%IzY76|^?7i1 zVUZRBnQ?{iCn;GZyeB0yg%8j{#bYUXRd7ezju?%b5TkLm@R5`(75*kAbA`|F*@Z^g zSU;H=6z|eCM|l6b>!Ja<@`J7OJg7qpIJsb=b#Tk5#b%cpSyI;kA&$64lF~DCp&(m6 z9W7)SO?-4@ad&T0B^NE4<3^)%H)6Jxv2BtwY#|3GyG54Iw&g4&2XOQ&I7+qK4gT~w zHugoIl=M5xwc9%wp+(}Iou;7EBbL$Rn5 zL{M$_5ZwH6RvOfyh0$79T&~87=(Ltwu4otD#ng<<&P?n6vhE z#~_JUt$LA__C+^CE%m5TWc4uAYLAveWT>Ls$WV1*d24PULsc!qhML1puy|oZ)m%3^ ztr|lasuC8#P$bFY@ub~1I=Zj){m0Y(`lR>xb>{9HuSuU*3m4CdzCAeIMxoY{Eo%Oz z$T$-bTc%sj$#3Wrph(oUvQ3`syO$#JZ|J}EWVc?5Xt=RI;r@Q19W^J2yq=!8Em>)U zp}2cBo4nb-#NsW>3(~|ftDc8v_O@}O9~u6HepdYg9~C62uXhQi;hQS&&|J5xEg@kt8L zUgP^0TXk+ZkgoyzF_7;9NoGRdXBnDZ9>9YP#A*So`Irp(vY+W2HACXs0KyHCAG-tZ zF(PEkMb|8okeRF;32?Dx!<5AWk~VY%IOJlzf)k{Yc8%^elw4QE=8}SY-Q&xDjbF^^ zQzKd5E#AP)36k~c5!c(qDZhuPVY7y#h?nY;w2(3A_&UBX4(d&+b4nkJBMoHRt&HiD zsfb<+?3F&0o^RdWFkJs(2O1Y3<`<`DlKGW;|ftng;(#pY)G?8LxT609Vh^R-Z9!*< ziC_8BUDaE7k`~AwxaCV1=VTZ7%ni>j@SQ6H7D-@rSCgGo3%tsSec7|SsunmozxzAY zqNt{SQ0<*63sRPNWS^+?=)}_bi12n) zJ&<`jB9_k9g67*E*|#O$nkT`~{F@TQ<4X9ObFQhJ{x0X|SeT4%#pVGeXY2}K}$;q}#%t8I=C`!u!ntU8d`TK`q`QkKD zT95Elhf5xpxj~6RT@TD}af6D2qM$4(t}H>FnnPuY@{_tWMEpxOW8&YH_gr4CK_Q%O znE2Na5-IivcTDoP#-F!DwI2Da z{6NTzjMM2E1s|0I)3M^HI9u^6yh7cx6+n~>;h(nB90w8gaV4-G1MYn6_mT8tzXR|( zByD&9#D@&`_}GWc_4v?-eCBsh`pmCV>gsXGhfMZ3=tGuz9PlBVJSu$1G5$xT;U1r( zE06e))gFg^$aas<;BN0veGmp|CS9t(!V5|s+|^JI?z$d4H`iF!!%#EdfO5Yzs&Bg) z>S%tD>(CyCI+6b_rl)R+#(}=O(r#jUYDpLlJ$R?ysmVr9ea)J`+(u8Gf-xxOjq5oN zu61-@+@kBt{`xd}!}Z(;*Iv)#H|jt5{{5N_uC5Ba;=0$H@zM6rdv&Zee;%nku4o{Z zpz3~U$$v;HK41Rg*eah){*7@X4aa#t?=N>IHr7J||5W-}WsnN*#QnNf@`$=0~?rKijxUmTdz% zpXTI;PqmxzVH`V(njwRam!1pTL7mUt72O-X^d)Pl?Q+evtcN!;Iv!Q?{)OV^^Z0A% zM|4}rsX5RyjB#H-vaOW5Ur0Q z^H+adxZ5jDxvXoLMtD^1%?DP^@k`zF*9?2EtCr`I*Y9-=hkogmW?kMRKx4i4(SkaN z5~?mo)vW`fYGa zHY06%HRe4VvzGQphhDE<`sz*R`zImZQetj}r-HR?h3zNqFXUT|68HcG@yC!TE%ZD>ECFs!SygF2+JYBwBsl|lHw z*g~#PxJ92?w*oBVtPidq%`=9?XH%E;yn!5H)5QO$oUcaJHrOiKy7D4V8Zb z>4s6mbc8c~C{DeY@6>WfMicRFp)3nXwGiZ2p-ry6sLKn z>gE1m2*pY7heC0F4K@#W8H`RU$w4fv>@Qs{b~Ub4C{A0t%Kv4$zO%j!GbJ01Z`*(6 z3Y(Hf85lsr%;1e=N~Z?XOxZ>`YRJ%Chv_jFEhmOU1$F&+qbL3TnyI`DV!7Id?q-__Y>%A3AJLGjf*4q05g!=Zr0#UxbugB7Y zd*6XzVDE=isBeH<>rAVwg=ux|8tO{`b2ZtUUPJVzcMtWIPXwCTc%Ye$XLSwr)n};0 z`V4)~P~XZ7mHA`T=g)ATr-YgZ%n7AVhp9ea>}IiB;zsqkX|~GWJlodi4Up~v#W6CJ zJLJXoIc^<&UYeoWq3+yJmZ95WL=AuSdC^wh(@@uQiXi$BepHEyzNJ=2-|`i_8sT-R zQ$|O|hDjwv{)R-9(Gfm0gdZ_<61d z5Y34ouFG8P!iSgejo+7|D~mu}%LQ>G6U5_W7o5@2I!9kvJVzxin$s<#<1w(Oe+LBL z-|>26bo}Dh%KzNW!u;H=TSiAKJP01xJ)=Xrm{s(NJ!Ev~4#Ys}A`wZi-5W_qsf+jL z;*1W_UUEr-ryJ z)&TeO&>&~s^MVkELgM*~%5U_e=+1mw!Q4!`&V_cJhw9{_tPlDYmxjT)jS{E>5k?pD zv!^N>^-GH$^U{Wxr`{Z;y&yFWRy7hM>8|{Ed>|ju@Gfhxd;0-mAK9_J_pM>HR_T&4 zqyx|%xV2=;4$(GHh}G&zi>78qjn$nMr(ullZRMst-E6_b7dcq>sSi+ zj%D2+ybD8e8)Xydwgtn@57fI@q3-MFQQMFW=|gm6RR)Otb3km(1hGCE=aD#{s4E%Z z+bK$s3(yxfScejV{5P-Yf5PACGNhH6XTh`cD7Lh;*13@Z`AXBEk`Gs z>(MopAO`C}4Ap@MQ_-=>)XdixUYn;9H_z*8GMcx6>wF|oW{>3eFd2(`E5E|s!mM!b zW->MNRbqHxcay0<$TD3=CSy5{Oh*3}y*4HZn~Y%rHW|fXa*ygTWis-UtlYYjHj`mQ zVv{+*dgZ?VQ03v*Ci5xlPxp#W4RN2cBpwH$;kC(pS(y8sEJJ(MC2km0tb0pa!dE1@ zey?B3N#Vy2)1|62=(efw$fw3Ltf~RJg&n)V?+s1--m;9jg>Rd@;;LDLJX#N_j&>M} zod);O7Flx`x=Ig{?)z8sBcFCYxp)THicgsS>N!m9ZCUh%RyPJP8sq%Zugm%Z8 z7Fa$fU)YCvU}K?wx|t8t;uaA5kdP+OD&xNg&~9zvjk=(0;f=i@fzZ7`5S?8g!P*x6 zIKkPjuFs(_TMqo4>w}UK|H1Xy=g~TIfro{;z@uxVwBj9l?aVAXY}U}bM@o|qfGz(9 zu;t%ib&HhV2M>Y=zUzgOG1QQ%m;rUPASv-n^4HVI2QnQ&K2ZEM*aFBLl2)rx!oCcE~El_0fzNTC89%Q>T#8!HrM!767-vxWae7BJ%jL4A)4 zL9ECGkyj+Nt6ml?G_DR8+8I_QgIJjh;=NK3E2@Qf_*suucU?|R}sf4M~EpPx~~D4J+k%qWy$d%0mq%jLMCEteaHGG_Fd>PyVMJ;j$;yl;xH<$C_m zmg|gRj9K;2yg&n5-%W{M$R7Q10yHfD-L5Tf>fnEUp)7}NLvXU@{tgqA5;v8)`HBD*scVq-^0Yr~Y5 z9M*==TGsEnpP6Z9^7(y#fBp9JeZ6>ko_n6d{oMC;U(bDC*ZX>3Z&?qW+tXN$lFw*{ zS^gvEjx>&GL5K6RG#)B&C`$($h%2$Ni*$JehXe z7$aQBkU-Q)%(3s3u4kxyX(L^V(lk@a<7netD$aD?5K!|!n~sySRN`K_n`b!WAeS;Y zrEVN8$whUB(*&nnz4PTWIiXFLVD!F})tRPh1Xn7T3gJ6zI1h+pX#-pgIYuAWOrb@* zWxa4NT!Y;YolW~DtbMhxNwA)=&?U{flH3J zlD6DMdq&Y@P`LJwvF~Lc`Zom|zRrVP8rEp<6X($I^@Ng!@Sl%Z-Y(iTSd(C`uC&9s z=78+H^~K=Irv`;vm!`cfnN7=dF)UMdTZfL0e9Awj`#N)Sn}Cb@YuIoOpuJPD5q9A@ zh)U}FZH?z%Hs&BoNZ}AFA;AT}!ywn(^vfZ;ln+s=3$U?nmN?@1E`G2`UCklTsjENNhI&Hisq7V4xy62UhzP1mND8@p<6i0yRFxciA_(uWSB1r?gM-I zbKkBE!`J!wXwECny&N|iy|83&q%CsQoWmaKgr!5DfOZpYnQO;6g}xMW(7w=Km2G4< zjWLMOAlLd#>}BX4gRl@U$bxMqB#2(=geCSx28R^*8aDQS!G@mM7f^%1>HhB}E!Di{ z+t|Lw{8+E~=0Rg^t{ql~UA2_MuAc;rHH84rPKb)JFr=5aR|7YK8}<$wqt3Ho-9Sv_ z+}Ai0c_lEBSK&wndCs2_NPO3@j$?2VzIFvT=6}mltNnu% z^6Vk0TKljU`+Lg<<*4`T#q9U%KjAsUKJZua|Hl0If19(vOV0qM`I-N~{+?T9qi}JC zHdoUSGo|1zEi309-sa*DI`;QBq%nlIdiM7g7>joe?C(0C;SV9Q7sq`M}BO!tH@zaD6 zRLXh5M_N7JkzWtQmKn2H>kNp z6BKS~neO>sDas@29Z^Doz$T}_`FXTKY593}m52+%TrKssxlk%4+HPiQbC^VLy1S|5 zZI(t^ulK~ia0X9fhf=(m=xljFR|*%G@{MF>v&ve*TtI$?A-HuG1hChN$&}_5)*`5KVj3L@# zx=^aMF1^?^iR<7-aKqjrqlqB&`2~s0mDNaOI`=DQWtSn5k?zrn3^1+RZj8~13>HP0 z%8Js9j1B@Ljwtb=bUW9@7(_-Mq4vo!El@O7z<4NEYH(15`?KiS2lHAfjlNK?kyP26I=!An0$ zlJBvbG`;A$+D|7e!V5d3OzlnB2-{(UJ1Rwp0R9`m&^v4`=3X`?fHj#ULGr*Emj%5h zNkG5wA16r%|HnxZKLq%Lf$^OWjPGV7Q}w|3-tjFMt$^`;frvn3CyUhj#M8}F1uN}= z@!fuEFOn&^Sv9(0?@3b2bpEn6Xp$7~f+k6wULE~jd!b2^a6AQ{B-!`t%ys~hcbsHu zhRSx?46{j6{q*{2>Uf${Kf@&H%5=@NR?~up>CMv!bKwl*B#E4588YO^Q_X(j8>t+I z*g0M)G_x+vcVRi_zX+ch2lV3sz#1L^^y6lkz7GSL?YBT?`>nKh=r1-C$ZV$qne9}H zxhL}to9hlijx$KvreC$0u!{WN`>H-4_NZTei_ z=DG~AFK38mNmk~q>1p$>85y%mObg!35YJMh0%Mzp@3VY4q~kE>81a7rtR`uuruOCM zD#pvt%~>4;*B~!MJ+O?|f66irMDA2zh9?3uym>0pq?sxP-0+iBu?s0>n-FI$)`~c5 zMJJ^R>XSHUZTn1|)j>6fFjX^0PZYWmI9FHdIcs&^kGH2pL)JLc$u(K=kE3vx95 z8chmH7f`PEy9otc11Ri6$f+azv&6fW1F2MdScjfcyVwvKEQ3ym8sN8%ze`r;^te6i zTeY;AjfX*aZ@FxYYu3!@If-?u4nB+NIm0!4R^ZvZirEr$dF(7$ zGA_z#>LLb=eFk2n)?~nt#>TX zc*|dK&KXp4>>NRQj=$@|S-46zI7P*CTGMlG^vlqd!n$>}xBQs$tn^QVO0HRv^Ri#u zENq@ZCAS|H|44jh+3Jm}WYY25{gSbv&9FIyHiLeJ&A;m-9qQAO_}W`bdF^d(C{*TB z&X;VWR4X@8dK(HQHjFHp1tUXZ!RTcu9O|Q`zzusF3R$(pf?sOEXw~@&8Lf&E1;Q)g$-rsT&YV6DGsVH(54(V{QB*f&y?8^NBFOK zQw5QXtk__n(+*~sds8D93s%Y(5&VFJYpYu?n; zLpu^T4%JdN4mJ0ts?Jc(t4{$>_bEzmZ>lHpwO?Kmx# zze8<)U@U6$j5!+bnmMS=)f;qe{sG$jqrT0>m0}NhrI|Oi`gC+#%@LaczJ@keofftc zkD3(Joffr)q5@-^%YW@36E9!My+HY2;7wIlDf85oKxZ!g!FvI@M`RiC)VNP8Ict2W>o6TJ#UM6g#W=aa5ckTFM|4?U7@pgB+pH*+AolTK7RkW<;hx%J{7?HXz+ z-}-h~eCsRRW>ex@d`<D;>%OJ=K-1aoM( zYfCx`L#cO!`9oRFa~t6A@AMU)1OM?)jK6$~{!#pinxN$zAG;dXbx!$b&10LlzR4(% z#hnQs`xy1xJnU{x2K(Y%z`ot5Y-G>aq)kV2n69}T@k1^@p(8!7~Odd zJ1L?21NR}^xoNHPPnr$J@Fx>6F<51E@d~nW>W?_Ii0-(EHmog;pBUBD>5bT z^LD|>;`G*sIWOH7qC4NC6tf#P6`_+e*{KPE9|aGg8trp6nXT{h_CPg?(i0z1y4+Tv zI^U!0WjAiBM0L($XC=gbEO`VcKbzZ`Dfy814V+w=-ufu#joVr{nRuU4!EV{qoLRDt zeu7<-ApFREmQ&WaCn9Tm+H_LX?%8`%18Dvi#!c1o^ zoX(*R!KV9V-?EeUkv*^yvY6d`n#Fo{{ajWLfMB?LOhVB*!hK3Ao*%9qPw&}*=lWzh zBVWHV5T_MO$AP{bc(%D)cp%XU{DL$*yIiMWoq(#D2%Cy&uu&X$#~7#Cz-1kEEwY_C z;aWyJ6FCyWxyZx3cnYj~tRC7VFOc~P8h}vtj6VR_>iI-);12mrGza|jQ^Ad2%Yn^h z41D>grf6h@~$OJThQh4mXKtlvIWSa1D0 ztbX#-QhxI5rLc;Ag3QD}eWI{r?-+6)#9STyB_i|`f1sQn@DHxAinX}H(nx{OQ>r8M zBrt)wnyF{5CVz(0ua{-x;hd9jo~wr1P;5qDWWXqQ#|hph;*Gr>Z){Hj%B>iWv%4K7 zgRjUs$pTHkZsHfz4?-7cZ%Bc4{Q+!*uV90-t`7?YbHu;Ix*mH$V6&$d5);+-VqHHO z*kQFUP)k`C_=%N1W0l4!a+Qh^xvH0yKK25^4{q4oN}oH+S#b_!#t`@+)^&l8bym($ zoONAz31?mByVAx;T=lH$SwJPS&RHL2@)~F9!E6vKfc!ok@!M2>m4j*euV1Ag9LbsI zoQ!31hr4T^B(dA&KPm?D!&da45VqCR-~g|1js}RA^Gw_UUfify9Ub;PduEu(B^G!b zT@t_n4kVAn6>(NUt3+0Uj0_-QPgelkEWI4|)~bM|eYM<5orQ|BP*Eln@iUuYFQd~+ z2U%(d$Wl8%mfCwcz>hn_y4D%iwa%Y7z?TMfSOo-WDFH#|4shjmQi5{3>{AE0b~`Dl z6j7O$c_Ml?>}SC-&!6$N#JV7SEs_0D?6KvcZY{yzP1-BmEz_+f)PwP0-K7Iiux`m< zoEB@r36=_3c#-2%crZKGIx$Fd2$$RG$onKHCnC9xp&(YmLzYNxrTuWZ9fAbC{&OU^ zn(xpBoLF>$WNHd9t87J^t7x-j5FxhkA((q&Qzr~q#7n(6&xmHBgW}E# zfoLUZA$TIchWNk;i1xTOXx3usZ;lY?0Wlu-)Wyj42%bu0Py;t(t{U8v1rpfo6~N{& z!3p;|YRAz+o{gbZYsd6rZ7=Rnj;ekHke)}M7}Uhq1uIpMZ9w%)FM}G~tQy_0w?S<} z8o%jlWZX#~gbZqff;;*R3C4{(lX2E|VgRtV57)D{H>QDcCrxkMx$`Z~FtH4$mZ}+y z4hAgfPvq>w8+$AXHTFg-YHW!WYHUj<)YxewQDe)Op~jB>6>sd5_yvp51thlsmt^c4 zv~d~^8;2-jMKn0VeJk3xgkKZ3Z;3F1Z4^Y%vro4p*q&#B%rmH?Z(Rf6QoTX(ZUgl3 z;i&H$$!8!-Mi*d?dCW!xL~doHB~+nd#Il2XYh(>#NQkK4<2%_or)B8_}@Nc@oCX9 zP_#p}Pa&TZql8PC#XiT0=*n>>IHsQDIi`jaAV7rx8}aXApayTRa6~~Bj|y{(Wsa%m zD;%XyRZ#q-6E=@IPJKl;mehYCTS~8~1&YESWk6AQHf%YH16%>@s$t9MO{l056`EKLEAy$0x2j&RxMu;co;#;cweMKTS3!2$e&^=at}LfTr`EX#lmBG#-){}(yz1A)Vy1Jv`JUL5w=7TS424y_u? z`Gka8;0PqtOrW4(_9meYgd4#Pds~52wWQESq`8ZSBhB5}DgfvbuDLVE=%7n40J`+j z09_&hbV;wd6XS5ry>1Y$xo6>;d)yB!>~25Q*k`>_V`tAojqQ01HMSxFZ)^?T*c&LQ zvEN&w-uZxEKpcuL=zjkKGBt=_LZ*gn*x*UcJZ=8Hq-O6jHMLhVRg5c{y$r+?p#8KHIk$}ox2DI!b6lf>V-LC_>`*po@HoSuy!3}#Gh`D7n_wy)cgK#CH{pB^v z5+seJg_xMJJ_|PxbDk2W@}BAp#M&dYG2Em2oDHRyaJs$Z$+(Wbh!amwScZtFi(G+t zn)@wHM?775wwV%C>eo)!DE8!BR}8c?a8CQsfOFbC?-l~02Ob>W?tD}6H0Ks89$2V> zZu+(Yn@j`F={+;UrZ~rkv0P#P(TV0C8kZ#qrY8y`K6g$6bRHBbT%kzh3PsVbYY|Rw zy$*zWYy!xo-TAiMfQYWUdeYBqeD7?3I{n{YH(`^;Pu8d_6x3Y?gi? z_@#UhmFb#I zJo(8me6bgJNyruVA(8O-KaTsCZ`_(U0iW$1#Amzoa*``)7c11d{@y zhb-UhjMBkyNu<9jl^LqQB(1qhss*oTfu~$~f!6J|Ou>R=8?&X7jhlGc23w2J{mV|b zxJ@WU2Og{;EAnaIq!kQ!pJ$*{-R09ctn#vIFmSBuC{=g)sQe=@V}nczvi$kxXQcU8 zUgp3Vr2QlTPr2lTTu}2mujeRM&}MQZ7ZBeVf0GLam>q?h9VM9^NzIN*&5ml!j@rzQ zh;PlFXLb~7c9djxBsDuKH95)<)R-K}1#KorAQbOuR&oLfc$wzp{=;@(@iS|0_DupD zVu>6K%cdB4T^*nd@w!SwJth90c`=^3FA+bK=RSXLJx`QOIz-PDl}8*RlmvU-(fvRJ zo~gpHes%%}yHGE?FahfjlO9CmcU%XEOwBfoweI_Yn0%~)Hd2i05zt2nyid`V4v;5O z=WVTEmTT*=E8a5tR37O(zks2^g5|NK;YF7)E3i(em~^FtJ~EP&#cbfnfNP192;s2` z%b^bB*>BTWt<d2{U|A^ zf*PyvvKp`YACE+1n+vq{0g8C7i3nDh0yrYEGDzx?H3#_26VpC>a$CAbk|j z$D(WHn{A{11fw>cEE<2ImRi@3#i#W-6Agq&H;G4q=*S7iCo;0p} zq1Xo8nWR44R+}RZoluQX3vs*x>g8^rpi5OlGZu$WY*@(ei|WN3#VYCRnYf35^UMv0 z7m7LpabsQrcp+`4Tp*xw>C~rM>(e61eh*%jtTX~O?ko}1s5lI&*0Zw=O45LYuH;1p z0TTU*#=}e0^+ydoI^Xsmg>9iVG;H?NXXHpN8MQGvwktcb6W`5_eNUc?VobJ?;=z+)Yi+7_vfv`f3h0IBCuBsvt4FhYnJU_ z=Cw{kwGP+UIs+L}KA$MVGek|oJK5-hiB(p*=L0ADr3&UKh) zJ%_9oy0jB_&#(AW6(JMks(hccNyks+cWnt>sSL~7|94~g0;TzM&@VR5vp0~%meSSxiv^Mf(Z zhx2VLfd@7xf@$eb7w}^9nqq+!rkVb7xP3A`i8RtTwu>D8i)R;gbHIqk(GUzoBsdFJ zy$eS%(0q>Adx+~uP6iNuQwMbIA3J%3YFqqQT`}Up4t*aVz&`7MbQSm^+rEWgC-1%l z@nZ!7XqW8_)(TErczE(mS)URNDBCmYlpGmkxn0AznGU3_+r%^B^~E7g4~(y0Ykd7j zpP9aX>0tEwr4xkYaSPoq;f?<=3^o2)8aA<~@mmK5^&K$U`1H`pS!Lntvx&g4-`Yne zWrnhtO^M+(iCbI4rRi2w2dV9_d`ABe!u0^l^OClPZ3foU=wiQoz2exs85&^+ovxii zjzF4BJeVgU?AB6NmRg11{GzyfDbFL)Bb4sG7q$4re^5t+{!QRy;vJyUQV0B#JvDly zc002%im*Fg3_`n~IK;>4y#*qftQkn9IAn9|kC1lpS2I)ks+RHUS<1`1;ww5VM%B^g`a)w*`zzvv!O78ls$vH(_<;`5^sq54pqifm&>nEzT7MBaLBpG zU-f*VUI+$yPO+b8qCvC2B$G9K^0_j`J?fK!4Fw>H?vGGMSX`iq%aCBU6J<{Fa(1T0 zU4DX2e-l9Qw10WNa7DBq8qP-jeKrX~8h`9tv;tngd(tuE>pwbTeErF0uV0M6elhcM zdDP|Pqo}nnzs4K?F@dwVr}2f~E_iqVXrIv613g_cxuJ#8fE2gqn51Y0xJT8&H=_a@ zhP6kreuS@w!mm5k@b!o;ep;Xx0{Z5FaQ(oDp9Tu!g&Sy&AIq4FFgi1hO7+z^RCAV{ zlE_b5ICWcHpWK2WnEN)o17L`Rw;cKEAL@$jJwv2)#l4H0WR>Pa zq{1O(t6&kak2TeS_|4^AMj<7CV-!;N?WRJSZvmfZ`Sr(6Z0k^um4lIfIuV72NDSL# zh^T|VU0o}9V$@G!ms`KKir1Lyr?!Pw5AB}}?r0S%xaCe~tAy8WSt0v1PM+6J8-##- z!OI`T6cZ)b_vIPQVr-WfbCh?wv`l*-PJg)^Nn&yp>WGq61jTS%`h_6O4dwH+)7wW9D`oJIrAIi>-(6z{@;e~!N=%&{Po}Oa=TZx zZ_GESwSVZR zcDxp4svX+~al~`nKD07134x(jQGBx54T_Ph{IC)3*VI;AYYVPoOd%Q~Y7aC-K3I#} zdxnVpez&AY*cPLZ7GJklujWlKA0nRQtHUay`M-dWszSZfj6#}P*dwGjHku0Qv~dK& zaMrYlRpdss^8(8QNI%`5i1br6$z+JUkK7g$+`QkYpGw;!hPrh3G1E`A_D9vuwGI?N z7p6aXQSt<~PZkl)Tu2xG3eyY0R%PI05B5V_Yg@a;Kp$LN(qm zGe%&LxMAkmdmK5c+`9;R6~~RoEo(1wIXvG1{H))i6vRqillL=S(Uw zdHrz~|U`ufMmqSrq@0?f7F%k9NHF(l9Xa`DHiE=FXp*QcU3RIz8+wRr@-n1&!1J zGnbU5jE?l0;l(949zbKF%m?*LNi0z@re}zZxE1rGOZ^Pv5Gmg5^}>3|X0st8*ryDl zZnA6`4MO_<&_1J(Za-oa($eXsLVC>$eZsFjIoLkh^ShRVXoy%up&?TLwaE}6$CupN zNL&7OkA9MV-~8k!QYFxCnS8>_4~;0AUw?>G2cK}xLD3WACw%^po*B%+paUqjQa^){ z7Nbvi=&7zN7f6~byC#7o792wTl0C)3WCnAjDdld4ILl1W@D6A>7Nrs zJ!_dU2425o$@j+B4>)Rk{eKMIgU?{H@Ym1!?lgbtnbf1We)7Z{e;m<7KRx_?&Y=+r z#;4zms*d})+FU!%^oF3L1nnNbkh<2D|9!9el!%6m6c{GlO{~ z*9!s6VCs&V&S08nq8W_l*WHr!oJF&fkR+xaL;VsB{)3(wjC}0=lZ7^2K0Py-@bcE# zKhriqLKBl23}@lDyi3A`lAq!ACA+@<)%g0)jjw;L+4S}6mZI0M`)=3n;veGP;EiAW z9cp|#aAox9C*tjd<-aT$+Vgbsv8#9XwK|$<$FO}lfUYg4EOrC!SVCQ5)Q&-mjM{O! zx2bkK*pH>k+5O!rs#wKu5o(F6Y8j26Imt6drPcneysNpJ&5F#7LPKQj4m3obF!?Wg zCi(4qs=wGMTxk^2cUSLC9#=oge2C1GJ+!YI8vOx;lyydQu183x6dG2-;jjStQkKjBBt7-uktcbLpz=rb6|$Z+!SpucSDeg7N^k~s17Y#0T$aRDYX zm=|kP&U_^NwxDN)RW$na-ygMqn2*tvYjzLqMZTCIQNdMJ?J>UowH?OS4>EgwI{y0f zkn;o2{j`54iRB-FmH3lb1K`gvID!=vOlTuRuFoIc2s~WAFnOUjd7nQM6@s@r^j*l! z?dNWypM>z!uXE0yU5)>g*R$@b^3G#8he)nF*@Y0%nq$BNuul9zBvzsw;!XWd+b{Z^ z8pBR0?9^AGpm8D%&~(+DywLlUlcTa+!n^POdAy`^okRG@%YFdqlOsr9XQ+#1sBqo4 zw*}!HU${A2w(S%o-*}FwqE&cMI>a86t9HW0iiE!oCHytFc3sA2*xRnXdpp-rQSz4Nkc_aH`Y{EP{_#MogsTTzj&@oCvnG=jS4FXnasfgizd;B#FTlk-U-S2*(`%Q6< zMklK|bcwqfw+59apneYqC%{V>1s$mpwM)2io+b5^r&0(Qb1(i*2J1OT`XP>|8lOmk z5a-{G%UfDENPdT(c06>w@~6LyT|dP|7saVt-X@rS8?*d4;_RQ$=%1a1&ljd{H zK|M{)T?L(~wyu{&RHy zeWw@1el_(s|FTO5mpe>pzj2zm;N{{uxikJcHMF)0ot6xz@kYXFf#1Msg}=aQ6FT6u z#4b23<{g|CxZ%zYZW)}`IUP>3KMJR1--grvc?ze6yn)lA|Ay0!!D%J;;k1g?a9Z~{ zIIZg*oc88VbecUptJPTsg^J`(xTJy!XR3Cp5BAuFW5~!Z9O1))_i)$Sg$+hve{abE z&+Y!6-D2sGY~m2eH_+enr#5faznN?RU-JC?0CkX_l3U*P|eSAdD~3TPgX zhEeB(+cXU{k6kQvwj$gRX=M2`hfx3+U&(a|$38mAVZETQfvtau4~a+bYt<2@9uu$a zu&^FH|Gpqskf8%LFJ!f-e%7I%zup_2xXos}vr>TLo^yeZlqJQA2GOZQ#9q-fp|U2H zI1@n6s^@&AiUnEgq{GFGMvh-3sY(p!r8YVd+a4kY?+M@90C%pz>>i2%9<7DnljuZF zlo9J3I-5#x=~O$V*(6$)VcQ8_U;~$UviPr92cs>A0lmM84P4_-f3CD?hsgXHft20M zDG1*@NrLUpi>AydzpS(~0XJ9d5GZNNXxiPd3h9t$$q*bWos4KDV@ig~#5R$w)@SoX zl$jNm#r=ZwQe-nLFDqe3M4F``L8MfhRYIbN40edt!V(WsEM!~SWaLP^j&wTm{fiYz4 z7UWv6o50*+O;(E=uVU=28wb4CvK#%oDZ7z_H_e)B*{0f|Muv4neJGFd%sa!ZF@$a@ ziNW;?IABT#FEGRr^=m4DyluL0Fo~W~SV(ZqC~<*_0Hg{Fs`F{6^{WO8ICzkQ^C~Fo zSTtQ4Hi#3eQrP^CAwxO!p=vWAHxH%)Sy+Prr%+_1{hL8QlBpeuLnQ3-Y;!W5hR~G? zi)#MhPog4LmW+BvPN=Z$75SAUVaszq@gpykl%=4!6CXzep3sCIOJSgR2yrgXp|e

N!23riJe)B=| z2Z?9;6KJo;R)4~Y5sm&b3vh$C(gNJzO|WY{cmOV$OhBZe=wONGdxM8aQVM8Y4upxG**h;V&bLH4l^^QiuvF!R-$mYq5A)7D# zLu?=S2V`@`dBo=Jz~&$1Ha~68wr#MN+Z^d@lsjf_1y^d^t+09in5c?+Wd(msVuj{g z@Qxog*ZyTx*B=QBtRr+LQoIUT8ry668rv^}$35_P!2i*L78kW!KQBrVg4G+)g1&RPPc_VLpG~rcQvQ80b zGYWMRy}2Xr{;25D>;6>Wv^=!P(O~}_1y0BQk@sMf0;j^QoZ`=NI}ANTg^s9)y!K~# zSSyeGc$7Q{;XXF3o{^i#xQP0~pvBP}HcfDh*@?kv!eT=DrYED)5iP)J;*5MJ_C?KJ z6sMdxo$gWVcj`x=IBgkMc!~SLuyqE4)A3Ki#eEzSV_JYX0EwTAQ^%RosD3bL`e$Hq zD$D`bGZ$RXTs54Es79&&WFsbnthzJ$M6eCo#F=V1WnIzSb{E2_ED6G?ILfc0HwwmS z>`WM^4ddCiE#ncK24B}K5nRXO^iqI@k!@JVcm+-`aV?DOloVB$>Me}M0EH4xpX}6L zR(2pSc(ezP73H@>XQyMpUtpG%vuW<=$O|URP@IaLqi%9%()Q1k<22W7^sj%FzpdMW z;kf7OelSrJ)+Q5*T1iVQ~Y#rqUlCzIIWz>KD_~Q?Xob)wTJE!+b`b* zyY>(x7^ll;Npx1vLU6j@g>75yg28Fe1cOHbnY8#>C{BAPSUut@EBYsle^d`Cez^AB zgwgH0Kzq9rIvvEy(Ez7b#}qg3`sq>&nheg=~Hx9J2Yf-C}$3Zph~Bjfl;^0h?RSMr_{e z%C^mS!{D^RC91Xl7;WTi)aH#YiLIK)l@wwZc548n_+fMHi=*ci_s08O{V(8jzk4a~ znH!td;)ca3$IZ4U$HG>|v9MLcY3gh#B?fGU5Hni^r#0?uT8+CJPOlUjY2Su$n$Qj5 zRB%V9*6%KiQ-KGJQ*payiRC*4r}$$=Ouyqs7@Tf0s-At?BkG+3r<;t<&#qQda5ouU zm|X)DsyMwcQ1?)Q)ArBg#kSF-pB5`{dOo7X!(i!dBeW)J`WJGjtpcZ#PkFAk^NJNX zU3EDjsrBk6S6dLBCe}UDIqj6b2dw0|y(z->{-xe^AUbuk749itM`%HDI{r<4wNY#Y zcQWcBJBpn*5IXY`ZRI!(C^33FyK&>(PSh7lk~q(FE;`-ZgTblxI_u{;Nw&`sEx_si z+2YBCodGq7hXlVw)21}r<~>ClP@I-~lzyncXw*Gh9-SuHg6K3Eh{KQ=wGN1%i&LLD z(x`EBB*bxZusD@;fb01+xSn6D;S}EjuIIbpdcLcQ(`Dd9%jT%zl>b??jB^d(^t1rN zX-Jx11uG54X~rBFr}^G&TY)!%)5t!}lFB|TPCszp8M(z&dMj}Hq5hqbyON^ngJy@3 z2T&;Cv~Lf8V;za|*w%w*k{11Wlf}g4d%-NLL+6QYomj9D#c8ou;==6+j z@?K~Em!DCb-uoQz!DwYnn>RXGBqg{^4yB+487wGH+e_>+{qzbxqC-gYxsh~EQ|a9A z=n!g7iyqMNoOow1iqnia)jn0cYhUF!UG)XH_)U-~2Li@v#@?TaQ_&FP)DUfBCPUj8 zi_>P2Uwn{=;1ncM!>Mmh_H)ZDVz^~iHa0qC=z$aI8LQ#6Cz9Q}4|45RD zsDxd+xiO5>4IvVp^bo|gOQYDf{ZSa4p7ycYoIS%-5Q4h)YM=3&uPQ5Qd>EUFGr>E4 zxc1y$+nH5G)2<99cVxRc0Gu-Pz@7|9bSk*=Z{k!MB8@s50$OB+U~!70lWRpZa*dEi zR*g;>-eAugcVni=-5870>LqMi^^*UA(}pGN#)FW}&%!pBR*CJqsvw(-rXeMmBvAT znF5@$4o(3$6;34AM!S%q=(KG)j8n;OVu^D}HnO0NY0TuL7-Mic%lPfW-sOoUSJCKn zmT~*SekBEWmhroVtQCnRfhy6d--4H(WHdU}4J+t&h#t*2rNC+XD!~eakuk<7PFIB$ z^f)MRiVLOOb4Wg^z-i;(+P66l9|4y~u0 z?^=74<;mWtUBr#X8LJvrpdRwqQ`L8^=TZ6`&|74yjr$hzk3{W7_EhrVF>jaodeH;>F27ovKiJyzpghkRQ??n=#_aZD#adW`+JQG~cGu0Z-Gs?mByc=B4yNy+n zz3ah=)-O`Sso)UtAdY(e5U4_@U1PAIwBrQr;i;LOfj zJFe}a-6IsI(v|EJ#Al|jk#7X-7~nnb;hE~i8ewF4WiS3n_C@2=)#aR&Copmhlu zEW*uUz{MYiL<0~oP9jZ=#njhXC56`V#s^@|rjCOC;7tKl^GT=sM4v&3-c zvnn`cKLICtqK?z*SawY%OLUGeMqK-`IJT`Y4ujL4 z)#EQ-rJ7YOMqPXFYQ{yPiISp!_1uerkm84H&*hJcJ7>A%<$7`l@!mLq)2L(xPVJuk zn>hWtSQ_;PZ1(VGF&3wmTypJ;jpQ21Mm3zWb!n*@-;J60?+ZhoUxbj4QmB zt*j8om0r6FDSp^o`{}smYVDVtg8u?ekF71`y-H-$+7huiwA?T=fK&b>2&a-i$+euFFiy*pV4TYC5KDaTA~tRoYogwlf=HO!0B+>w@{&yf;*hnA6gF-syMwFud!Ew)3KK+ z>5kE(SDaVi^jmCOl0lmT4aMo^%ao0d3Y=PADp=&$RIR{i=TpI}vMqUw96@yYlCYor z_axs7V4dTid3?wDPqp8I=yb7Tz=i5Je*00J7TyY+MyrU;Pewf?^Stj{zq19~9OXEz zccR&cHJweokNQIWH+2WdEt6(nz~I#FP4q$X4##Lj3!>BZ(B|Z-`&VZo+a7{nVozSN zW9WtQwkRpul<{YcA@4toyrQ02wSOPS;;_`^b4%U?|_l(w!Sm8yntoA+Z%5LfRk7u9CxC zf2~1r+7>2c-g`G?Gcs6&M=k>we*+RyAYh#O)%;AHGWO8GW-m0RsECG*PNm&`@gdz{ z!_aOuoJO{1Klgn@4EKGbf>TimI8g~rEjsN_VY6x>*S;hk!l_@a*nVa$?AnhbuKj$t zMCVdC;@V}YY+G&`2B)W)j80;US!+1z+N+s!I|G#!HO#2aY)J9Lwda~RiEGQ#G@gOz zbRpOga0C0H0;iRq{!N^YjgUt5hJzMa;aHsdz9!e=+sHMzHZ`1z?$E$iFf=CPCJh^% z3e&+RuIc{+r{Z*W(`Cr!y|B&KToT)_zXaKw@dUAXTm&eEi9l>#zmaX*yb*)b+_b_k z**f$M5va}c(@MWwRaWrRs=g3)!8?A~Tsz6B?-Ku8*@yoEPGuRTyu%r6T6qQ*r-Ux2 z9<9etGQwjgHJrYW09(XFNQf6BRB)P`$)@FIs^K*2E3IJ+9pF^3c`CpuZh%}{HUQ(a zBNN6cj-yo)%*jFSoobsh3A&~joIa!3$FKy2oNH)w`i$lf!&OpnpV7v} z8#Y7=8l6rbwRPyk=+U1Y>7()l*03?1cPEW>2qXaP$q96u~ zQ(qdT7C($qgBwOsEkzQ!nWp+Xm@*j-rYbnC1}CbHQNyV)PwW29>j0;$*APx+f&LXH zQ{hd~KE}W}ZQjSW?bwIll)qK0M6xvp6P@Nv2{JvJ(!WoE)0~_j(_>1Cs+?;xgu%I|?xhI^q&y%_v9YO(~rju6+ z-mtf$Lr5_7ifzFs&*b|kPQS!(54ufi6jL}-YF`P;Vpbxq{q!MF7IO%L)1Liv_f9FNcdtZUd++|Jy*bK? z{{4x2uR)3*u06MMV%G!bzioUd9mFnhiESwL1ZGB(y>4^-|HV?I$*ZJMV^)C{S*x%( zjhsoTwVFbyv7ACtP4?nVRxMCJnOrohGq; za}#89b_rth%vBPd{i_h0=N@6(79YXj6nq6ouHB}WuR?9!c&O@#)*U5<_>kzx6iD&I z=GxyThW>5x`<34*|AA!h>7%8*_ea>Yjw4u{a#CG-auQu+oJ1EjoPJ*=rF4L=rel=~ zP8*N1X^ltKaC)WIRJ#+xY2`%-rQGVgB%PS^H|7rdNbu+arXr@#BJp?vnLe+X8yL=;rHJo#d> z7z7*{E)5SG7G|wMar&|1+GEp?X*-Ui9x~uz@ZzkDt*2b%I1RXA8oRpXL*ZG}7y2&L zh@%X6-G7L|Y0ScXag;MIuMsW4sq<>d@q1^dJVS9By}Y2-Me?wEF^bdXV=vBKYcbuh zS{|LAaRJfkSs)HWV$?YxelAX5u9ikst(Fk0R%3A*xe;8?8^HCvK@F$)0dPI{g6p|g z6{l~(iQcYO!>Ra^R_jd&r}bSBPMHz@6@myDr`Bs=oEBHIZ7VAgoC@l+N@R6doSw@W zVpfwbtW@Ci+_fQQwMvSrb6OO$OF*H7)4qq5QU1kLvq>OTAMrA$AkjOn8O*XWDCU!H zeicTcIBl$`x^m6k!hMY#r`q3K(wl?dEa9OzExbI%#O!@~4`@^hwy^=5H1s~QT%u93 zl|Bg`EGSO>nuC^HDcSl9q6JH8bj;SQY3nY$h7KXOsFwwl4DW}{C{D+&X{h>m_qwSW zQi{~h11?@C9|$`j;OO*P^UuVoXq;JU$QUywV~iOVr@hPk<71X-IK?be!zt@d&hyAy zTH%qmRB+000w;1ZQ^P6u6g&4bl7 z1x|%4{!N^&iIqlq#7c-Bu~?k4PEcwY$0#+v$JB7jh%igNvdD}nT4aXBX~P*dt>Mi7 zz-jXtc1tg0bB_$j=CUVZ`@ScT%|)van^(q4bk4|a-guU6D>;k7Y3}K&r&_x#&MR!5 ze_Hf(in4-#`rgwVNb$qw+S?~(JQc*gJojI~Y45pGUe!5J_^7^gkeFitIBYn3Ft zMsUjb%Z$m{Wrm4PW6fgYa?e-2R^T+&EG{lzNx_XZi;v?2g(^;?zb(0~!0G1qTU}hE zM=xwq;506?^1Q*wJTnxh?eDiva#i4z)j_4XCO=i+wCQ_HqJIsA<_e#VjLE z&|mrn^@YueHcbV8`1G`3aEeR1(p2E(8uSeHkW1qBUwH8*=P=?S!7tHBneXcN%y%7% z)BWc^wrd?WE02>$r{1n0I)%g-A0Q4u;^*SDCr%pG8V9zxjl<%U^$)n7pMmT7nHo+R zH^B8=1Fq*9GnMGH51gnkP7SA$4_aN{Ae`n7LO8{x_*dAaz&QOS9>%Gp1}uoEL2z2x ztyO~ijKyjDwPv&TncP|hPTRE}n{_HFs@kVKHv0e+N;qBg%q?xn_pPT~J$U*l8t*B6 zKH}$Kmep2p+O=aaC=JDFQH|)c)_03l@o03q!}a;|=E1D@C{9IPIW1=2GplRS!4m$w zJk3Va;2bhoP@Kj*7pJ|{G^jy`Q2lMQjq&A{Wna)CBu>%jDKHM`eU1(mulW2+_$=*z ztP#F0&i0Cji%eHWza3(tki%%s;Se*P+8Wbzp+B7$$<#8VM+ikzjDz zQ=6D|-ObvCiQ=@kmYqd%S5oxX7G_O_6hB;huGn?G%y;Ti619V9#lpeJvQje+{owDuesTvk^Cf=cAvS*jZ2nqqbN)-V?f#b-oHj^ATc(Cvw<~PkD7m+V zr>qc5UTnDzDSp^o+ssq)(eAnio%$b$PHWmqd7oZ_!snM*oN{)1_T+5ylySCss^K&; zMM`l@kq{kIRB+nV#-=s3so~UrHa$1P8sJpCHwfS~(w16FaG*lbY4s}@r_MV`C9Iu1 zIN8e%qciKm=@^{4(=$>UUx{{JN0Yto^vo2ol7j0_7o;=+#Z;AKZ~JdtCn}okJu=7O zl4tbj%q|5^GdK6VGH9DaM{%k<&)~AB0;hu6g_WMo9~C(LJQRP+pT4!y6GW%ivnEn$ zfkEA1MTEoF`<~%L$J_?dX_e>9?&e!pCQ{|e-noBHT}A(8bMb4`LyEg1Z(o^G*yJh4 zY5gL4MM|69$z3FQvNz$D|0F6saDF!ir$x73PNF{aT!m;sbh#=lsve(*a z>vPYg-3_-V9`^`{!;l!&48+gH>8Mm`R5utj-6>d{3If6P z>;tZ6AF67ymt6p^=S|>x-b7cyseP)1XrHQvQ&|~_P|*Nz+GxKG;57H1e?{dz7^h29 zVVv%N3l>DYMQ|!SNGj1k#KR6sHNP;&y|xK}V6nA{;vpxcF(1hyen|>GV%O6Q_(z^wj3_bf)M$9UGl$ zKlTTk4r@3uAF1I~aFX|&RY3}8Rq(Kty`szDM3?Dm(P@4Mo9_g<_BVNuYoGoZl*N38 zUHcuxwR@$3vY0dkr>ys&Eap81r>EQ5XGsIr%hOPtR<{?PovN&;X)is?gA_kpdv1tV z^XG;LZY;GUd$$+BDSm|lr{c%|CQeVJNu$!!B*gSIEKY^%skQ86Y7Hw{4X2_H^i=WOEB%1M zY3}=bmw97tzA0>;|Nh10>&goL`;V7N_TU{qY_5IE%dfZc9~DayGP5+TShSRR>Nsxx|HIRE+P7)tKhWgBUr%tQ4ObArWOs;Z2(Rs_aU6J3aGW# zTVR~_e}r-Bdy`bczlq>fG{%BSu(!bAbbwxw&hNT+Q-RX~dS&_!B?WhYUX@-16skB~ z8@vAx1x|0CDV*;eJ^EFz0;iP))m;Yr%`H%zjy+qrz*~V+;b{X8@7^y8oQ9bF_0pe9 z_3#GK=|B7a+`4zls;^*0#1`seZ=q?`D-fM}c*lK>eD(5A6sPR#JV%SA1(Gh*Lw@d+ zzIu7gAk15iQ?7-DB)#0F?iT6`wO=hM-g{>htrRB zEaW)l{6XE|eeG-T8x*HCT?Th~?iTIo^5`_e8$_p&7?S|R0Z9B@oKD&(jT*U8LL9jf zi&Nnta6KOY*Yg22oQf7&r25aY06Q33sNmESoXB&d8cuN!NrtTuPWf&SPW9jUSGc`{ zak_3Jj8o|+upr_Sf>ZG$Qi<8MVR3n5rF-2|bO_6;nto6g(+|7$ zT^4Y38kYgeVloh%)_(=P_FS2F zUw?4Q{<|PLo#+E_YIR$I(~$0e6Q`FmKo8ms(1SJui&IGpwYKyjwMOtz4X5}Ti`1+N z3nsh50vny~_{OH~`1U_=y8j!y+#9m_@vV@}9}bA^B?FMn*_RQU+hj^~>@pFX7xlAk zkM(14+VJ&7*Y!>thfLJwjbA@@kv=FX#9#5X4Cf<-xN5#VeulfSxLdYVbPk| z0u-t^?Ymn4MS;_Hn$bT#(W7S!DscLusQn3}k($`pkSXh{0*YfXyKFi%%z_1vstAlnojT zPW_JJwDrr@K_BTL$Q{Z{k#YyEI1K|9-!kRV=@)QukLv~EFeFBO1>)!8bVaT-$|YAq zbjiiyR6;SREhQP$2uKF1(J7v8otib=8th^;0M$|?;h(wB1>3d51>1A6(J3PYoG8Rv z4W~Osaf)If*FI(!%+#1Gd<|a@Uvk7tSxuZF@#iPqGU6E|ccI6g~ zF5iT@_G+7xyBd@gH8yp-w6}nF{BZ5L%z#j%$M@=83_7xF0su}KPQc7avR5)A;9o37 zl5LVkUD_leUfP7kDbB~BR^(|=BlI*-P4+T!ty8b0Su;gx)>xc2+j3~lwq@#Fk-(NE z9jhRlUxIDkYjn@vZzyDQQ66IRiJL)3+Rcc~TkJTtGCR4=5HqReT zI2fd?;Ey&um*j)QTz_p>Gxl3mn{0EY~xns+CqA?tra7@{Txe06{EiwU*AC8j{ zeh=)?@(h#_JOkBmdTO(jQo30}EZwYvQ^8mcO)$3X&AJ4f!9sJ5qt-!B zA)MmQK{yruZcrON-vCPXa_y~Y#rV+36WS$}CvuT>rx&c5oQu|&=(NE4Sw^@)QQ&mrsD)fP zPMho}oYKB&?U0AybUZ&0M5mA#QwYQXNc>!!GV`QS%kw0}<#||~;*!Dj91E`JST&q7 z+QIew3|!C8RB@UCPLz?ShEvN6+7qrpI4w$qaB3MAP!SXcm;C1!s#O8g%NFAwtour;3b4{HyU`( zZl=98Z(UdTIk3lVWdw@T21mkWZ428@}g9VLFg|v?mOaCzXjt-&vUTdrT>b0$x(IMmMVrRcw zI@&e}PB&)&7k?NM4M4y+mC=4CPVr_osYQA=Otzj47N>$G0rC1vG@bO9sNqz6J@&KiFW|IsQW-CM5{Jf}gvBZ6*_57~rYSN` z(-bwFwiQSzCkrIRlLaa`Z38E2o1}(Q|9G3+y|w_S`t1--CFcxkIW;g&8(d+WCj6sa zBK!xzDLcc4S(j;p!RbO9>n$y=gjNMk7uwitktiv+3vEVjX#)yXoa%nntXJT4Y@3n( z)acQV%oI4a*~@h^Y)iF4ak{z9$Y81hr$s5r1Y|@g~O)Cc`bzA z(mN%@T=a>1weXHrtJ%uLfJfVnr%oB7H;Kh?7SHq^&K0C-n@kNgfBdN)I!hLOmhE#0 zrJ&RPwL;p|AoG;OrS+0X4HHcb%B$@XOL;fNMPI?EF0B_zef5Ww|1oEt`P?Z(woCvg z#gP)`EH&3jH5Of7AJMzO1Q;get447i0!W1`O85#dDMP%FdelTi* zDca!n#lL!s;08%-}rcHOw=E3z*k1&kQbNUb{GDC@#tphs(y{a7LO82Yv7_^w6~1+d5`X-I(2F zWB%fd*%>|N55FS=-?!H2Hod=^yT=>ZS?6 z>2S9#ci@KyM{3hdQbnTMmitBU6NmJG%G;Kw*{0Adp74`;h8gr^Cj6ucZw@^Pg`c#E z;3sR~Cq3*D&@1Wi6RsZ}dXkT~Fj(`8_5mSjs7W1hg>b6o(;AexjV z)-Cg8TZPKB;KSyib751VPy2!#HoF5p%o{n(=sSEE z6&yC4Ptf4A@TO${2G&qJLxy&!uasy5s*YC(XpJj`X5f2_g1$^VG&cO?6RXR{lAiS_}wGvuhbG~-5eBHPA{{&S>`-_pWDrSLpPTWiSagd1`SYt z{O4@ER7*P7$jQodZK77fT-|*Pi!oLfAJ|5+@y5xfJ3WN{7N-euHJosnD4I%1*1H>` zpVogp^MCyx68wL@!v8;BA-#ITikl$3VQH(eXUO^qk{beBjlDx+CJ1h@Mr-W)@xyCY zzrV*qsF{3QZJWUr*DF)630?kLk_LsfhW1)V&K>6UWy-zMIPiNCM#^NdPfil$(WcQShDxRJ>I2Ql&Lw zKm_jwvO2^6x~m}0eRh_Qy9W}NVenzZ z={L`0#9_WuI~j5BN^)I|2DcP!PLQHrJyhj`E~L~b7a~$J4*Nm{kvX`+q_Z@sMJh2w zZp3PJ7M{$*;bF{`-4C+Rvi-H@&FdRV4ZM^Fonw@7MRAkwBXW?to21id+U5FAkL&!t z(v2D6>JqW<`{C`!!Zu`uKJKieWzmIwCv^vEWu?1awr)ktcfLf-0dtI@(TMp~4+&f+ z56rw1Ivic^I4v=LFnx$l*AQfORaY;P87)e|fofMs<5k&zGG2VX-Ct*n5kJ~i?Rd|4 z@$ito*LBmq9@S>e3K9~-aoz=ZscSHUc+2x!d=&QuE?V{S;YVmXOye+SeGDWzoG+Ig zkVU8!Vnu_ly)w;Uc#)=smoxRSoKG3?E~$}#z473fM--Yz!Y}&EQejxF;ORHQ58?#j zdw2qYq+X-Z7=C>6#3Q_n7f~Izc}HZ%7c~VdH@&{%r$(=fTk3zmeIht~b3wQvE__RJ z_|~)GJG~-y{}`dsJf;qXZ@(G7D>$MuJEE#0V*lBQnwt@|AhY+$lTG0u_Q{hcQ1{#- zwwQ6%ezMTClb6zh$rM(bRGSVp|C)5dN0CfWH0Hk2!JGCEmv@wcF-d$kNf2M7(~A=I z_}Oc!$IRD8iSbNh8Vpg!6@M3tFop$M0EH&%93;8Y??0J7bHyWR)R8|zIhx~J5XsrvF{dg zRG1to_L{2egQ;Ae-(~JYKj-9KwCBn+Az_>{7Ie_U*5RgfzcHMwX`P$6lFRi!S<@oNerRGf-Ef65t!{9VDjjYz54y+Y`iHMs z(|V%!;O;nxF|AvoOf2{dN%B_8h0V31oHec4N5-d@(g4rPCeBVh zKw3RzP}?BWN+@77(6qBp#LA*U7BVe5HIEU!kU(4Dr;K0-M*Zx zB?ZW|@M?!}<)Le;wn+y#wIp3&Obee*m#`0ftCcmajW;=2s_Ber6?!*1rh{qCe9@bI zU{xe*T1VXWbIO}_0htyx9ZYL({s7LjR8jh5*0gkYS<{+V$4Sscf%@wi)3Qgs!%?jT zDr8#u4>>9)P$AQ*d9|L)b3St)%Uq{%&5c}HhwueX8Sk;CrH(nt$#UFf6#KGG{O$My zq+R|Zr;I*Mv6tH2Sj9T3SjDDIn9s>-VH9hQDO(s66-UL#La-<{GLDLv0cXQ!z}e!u zusA9i<11up>URso#?(RV=!X!y^5Kv;%ISc(;7*83K#W>1s z_qG6I@I#cThv?oYQ>#e`EF>_VtpmpQRdI3D_bMR%1?3?sABdCkfp{s(!v>Ux6G0HX zH>3Y9GA7H+UGxUNTtmIDj)z;RLCzBjQp7hQ9r7N zLmu=XJ2oH0>heMCavO+!#Rg*EK)Sm)17ts#0b(E5f!OG?kel!A!1f2?jS2$ZF+sq) z9Pt+B1MllMfbBdEK@SeRzaif6Y~W4CaQWYL!Dc2n3o;X*1p;+hAh6&J2&_8;0^jt6 z;1UT^?~@?#k8%*GJ_G`XJ_O=14}o|o3Bd*uINqoO;`29vxCdq75z2me9B}++HwI>q zu#$veJ(BQd9Y|=r0TQ~AgkOTgw7?!WI;F6)HUN48__mBvBJ8s{7XkNRwL`zNInwRAZw|EI|u?&}= z6Kb8ldQwXZSL5x7G`v@jl*hwGj!A*Ia?n%+#wI6Y2i

DbS}Z=((68 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Φ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≧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≶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⪚n5Ve0Xw7sxio!hxmSI9*3zSde2HghSm6e<)ixI4U_+SzR_vl zngW0D%USPf9`#2})tlZNGx!U95FQTPZ<~Z_;p)W`!pG8)$-+zFa`4haW;EVlu14_9 zAHoH}Jsf5{nRw|D{mD+@>A4wUu7ODj6OFcB7?xq~1)X|I0_dazi1bH6kAizP=m_Sd zzX&?H%RrBGqrV6GFt{H8J<5%aZ-BUV^(WA&d=$TG9K#Go8HT`p2y~irIQj^jc?8`T z?h~LxG*0?tA$+%cc*HXYbo&1I2hd4oVmvvZ(;kr=4V~f>>4l&Z4zfS!Bs-3dc6Q+RiMX#PU(p8&|b(;xapf->Ng^N7w9w|%>ms#KhJ|$%_kcbe?ngl%CeRrceE^xK_Hh98 z(Qfo9pp*L)=%d`|3qT(MH$4;|#ZL<68qle{M1zy3qXE=`PI9EUMEOu7-vBzr8-thP ztm-mWwA+=-4>!fBe;i z=e}m+f+zG7t8fw_7oWA|E;bgF#lljYS5Uz*PUQY4UR7%N#%*EA;su71Sgl~j3FgGh zCV#Oga?1>*1(yxS6Z`Sv%GsYka@L=BUdiH$0$!^wE-a`lE-gT*4ds=wMs0D@MfXVN zIzbV04HXpy<(0YRm1P%m7L?_4d{}xLi}NcM=NB(6%`GjiSSln@T2NY1z(*ZhoHzl& zD8a>r`Gys_xdr9ri^~O`@}*_ulZ&g;bNRC*60UwExrNAGC5*hX$`VN~mwQPropAVx zyjD5mMB*z8kVHQRQt}p;)>ZkIHMkPilw5tAuBD945g1EP6mUW}yTpGSbY^<&c%ds@ z;{S=@Z-hV8flK`73l!2r@Lb|wa|QpWui)Pa{}E8t+F{}+o~$H{p z30*sDFK?#qfH?wuHki=8v$pVNY9mbIYv9dP(yasGuH(&A6U-6dtAa`CRq|%45hn4K z@MdZeOsG~_`MjB$2~!KcB$)WyGJ!WA7y%P%Ulz-osbMgoYh?xVW@->j=xkXkn9x&W zzJt8U-OHP)IQv4nbPUd0kd7JC2oti7Sp^g7TTB(qIG80c$H6RuN$KVDW@;8pM7<@G zHy?9=!YB_wK*{ z?*8}RyP44rNPGeG_y2JLVNJcoWwi$Md3TzR2xF~ET%=Ar3N zK#sEyP=#93Z`XR#C>F*BbPJ$inK$g;aGR_rW?Qh(ouamrS<%R)(5(#6S^5Yj3snE)`)3+6#p96x)pE7$MmjO z^|Y>ebuXcRd1t6QUKe%CYop%ttA0Yi^>Fnxt>Rm@L<61YGAWRqNzvbLUMzus>c+Oj2!arJm@L= z@ZGMYM%i*^WN%gm=lu)VTXzZOizjhZ(qiHNglH2b84 z{9AN90c<^2ZT*eh16j2yR!VDgroL_J zTc(~Br^(<30yB=zptt=Q1dq@#ZR(q@88>)%!%^ITW*yD;I^%9gB5Zs|lB%JCqsZ`m SI62N{YS2FDO%7q3Qhx!ukD -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -SODIUM_EXPORT -int crypto_aead_aegis128l_is_available(void); - -#define crypto_aead_aegis128l_KEYBYTES 16U -SODIUM_EXPORT -size_t crypto_aead_aegis128l_keybytes(void); - -#define crypto_aead_aegis128l_NSECBYTES 0U -SODIUM_EXPORT -size_t crypto_aead_aegis128l_nsecbytes(void); - -#define crypto_aead_aegis128l_NPUBBYTES 16U -SODIUM_EXPORT -size_t crypto_aead_aegis128l_npubbytes(void); - -#define crypto_aead_aegis128l_ABYTES 16U -SODIUM_EXPORT -size_t crypto_aead_aegis128l_abytes(void); - -#define crypto_aead_aegis128l_MESSAGEBYTES_MAX \ - SODIUM_MIN(SODIUM_SIZE_MAX - crypto_aead_aegis128l_ABYTES, \ - (1ULL << 61) - 1) -SODIUM_EXPORT -size_t crypto_aead_aegis128l_messagebytes_max(void); - -SODIUM_EXPORT -int crypto_aead_aegis128l_encrypt(unsigned char *c, - unsigned long long *clen_p, - const unsigned char *m, - unsigned long long mlen, - const unsigned char *ad, - unsigned long long adlen, - const unsigned char *nsec, - const unsigned char *npub, - const unsigned char *k) - __attribute__ ((nonnull(1, 8, 9))); - -SODIUM_EXPORT -int crypto_aead_aegis128l_decrypt(unsigned char *m, - unsigned long long *mlen_p, - unsigned char *nsec, - const unsigned char *c, - unsigned long long clen, - const unsigned char *ad, - unsigned long long adlen, - const unsigned char *npub, - const unsigned char *k) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(4, 8, 9))); - -SODIUM_EXPORT -int crypto_aead_aegis128l_encrypt_detached(unsigned char *c, - unsigned char *mac, - unsigned long long *maclen_p, - const unsigned char *m, - unsigned long long mlen, - const unsigned char *ad, - unsigned long long adlen, - const unsigned char *nsec, - const unsigned char *npub, - const unsigned char *k) - __attribute__ ((nonnull(1, 2, 9, 10))); - -SODIUM_EXPORT -int crypto_aead_aegis128l_decrypt_detached(unsigned char *m, - unsigned char *nsec, - const unsigned char *c, - unsigned long long clen, - const unsigned char *mac, - const unsigned char *ad, - unsigned long long adlen, - const unsigned char *npub, - const unsigned char *k) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(3, 5, 8, 9))); - -SODIUM_EXPORT -void crypto_aead_aegis128l_keygen(unsigned char k[crypto_aead_aegis128l_KEYBYTES]) - __attribute__ ((nonnull)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_aead_aegis256.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_aead_aegis256.h deleted file mode 100644 index 32e76896..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_aead_aegis256.h +++ /dev/null @@ -1,96 +0,0 @@ -#ifndef crypto_aead_aegis256_H -#define crypto_aead_aegis256_H - -#include -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -SODIUM_EXPORT -int crypto_aead_aegis256_is_available(void); - -#define crypto_aead_aegis256_KEYBYTES 32U -SODIUM_EXPORT -size_t crypto_aead_aegis256_keybytes(void); - -#define crypto_aead_aegis256_NSECBYTES 0U -SODIUM_EXPORT -size_t crypto_aead_aegis256_nsecbytes(void); - -#define crypto_aead_aegis256_NPUBBYTES 32U -SODIUM_EXPORT -size_t crypto_aead_aegis256_npubbytes(void); - -#define crypto_aead_aegis256_ABYTES 16U -SODIUM_EXPORT -size_t crypto_aead_aegis256_abytes(void); - -#define crypto_aead_aegis256_MESSAGEBYTES_MAX \ - SODIUM_MIN(SODIUM_SIZE_MAX - crypto_aead_aegis256_ABYTES, \ - (1ULL << 61) - 1) -SODIUM_EXPORT -size_t crypto_aead_aegis256_messagebytes_max(void); - -SODIUM_EXPORT -int crypto_aead_aegis256_encrypt(unsigned char *c, - unsigned long long *clen_p, - const unsigned char *m, - unsigned long long mlen, - const unsigned char *ad, - unsigned long long adlen, - const unsigned char *nsec, - const unsigned char *npub, - const unsigned char *k) - __attribute__ ((nonnull(1, 8, 9))); - -SODIUM_EXPORT -int crypto_aead_aegis256_decrypt(unsigned char *m, - unsigned long long *mlen_p, - unsigned char *nsec, - const unsigned char *c, - unsigned long long clen, - const unsigned char *ad, - unsigned long long adlen, - const unsigned char *npub, - const unsigned char *k) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(4, 8, 9))); - -SODIUM_EXPORT -int crypto_aead_aegis256_encrypt_detached(unsigned char *c, - unsigned char *mac, - unsigned long long *maclen_p, - const unsigned char *m, - unsigned long long mlen, - const unsigned char *ad, - unsigned long long adlen, - const unsigned char *nsec, - const unsigned char *npub, - const unsigned char *k) - __attribute__ ((nonnull(1, 2, 9, 10))); - -SODIUM_EXPORT -int crypto_aead_aegis256_decrypt_detached(unsigned char *m, - unsigned char *nsec, - const unsigned char *c, - unsigned long long clen, - const unsigned char *mac, - const unsigned char *ad, - unsigned long long adlen, - const unsigned char *npub, - const unsigned char *k) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(3, 5, 8, 9))); - -SODIUM_EXPORT -void crypto_aead_aegis256_keygen(unsigned char k[crypto_aead_aegis256_KEYBYTES]) - __attribute__ ((nonnull)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_aead_aes256gcm.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_aead_aes256gcm.h deleted file mode 100644 index 9baeb3f1..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_aead_aes256gcm.h +++ /dev/null @@ -1,179 +0,0 @@ -#ifndef crypto_aead_aes256gcm_H -#define crypto_aead_aes256gcm_H - -/* - * WARNING: Despite being the most popular AEAD construction due to its - * use in TLS, safely using AES-GCM in a different context is tricky. - * - * No more than ~ 350 GB of input data should be encrypted with a given key. - * This is for ~ 16 KB messages -- Actual figures vary according to - * message sizes. - * - * In addition, nonces are short and repeated nonces would totally destroy - * the security of this scheme. - * - * Nonces should thus come from atomic counters, which can be difficult to - * set up in a distributed environment. - * - * Unless you absolutely need AES-GCM, use crypto_aead_xchacha20poly1305_ietf_*() - * instead. It doesn't have any of these limitations. - * Or, if you don't need to authenticate additional data, just stick to - * crypto_secretbox(). - */ - -#include -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -SODIUM_EXPORT -int crypto_aead_aes256gcm_is_available(void); - -#define crypto_aead_aes256gcm_KEYBYTES 32U -SODIUM_EXPORT -size_t crypto_aead_aes256gcm_keybytes(void); - -#define crypto_aead_aes256gcm_NSECBYTES 0U -SODIUM_EXPORT -size_t crypto_aead_aes256gcm_nsecbytes(void); - -#define crypto_aead_aes256gcm_NPUBBYTES 12U -SODIUM_EXPORT -size_t crypto_aead_aes256gcm_npubbytes(void); - -#define crypto_aead_aes256gcm_ABYTES 16U -SODIUM_EXPORT -size_t crypto_aead_aes256gcm_abytes(void); - -#define crypto_aead_aes256gcm_MESSAGEBYTES_MAX \ - SODIUM_MIN(SODIUM_SIZE_MAX - crypto_aead_aes256gcm_ABYTES, \ - (16ULL * ((1ULL << 32) - 2ULL))) -SODIUM_EXPORT -size_t crypto_aead_aes256gcm_messagebytes_max(void); - -typedef struct CRYPTO_ALIGN(16) crypto_aead_aes256gcm_state_ { - unsigned char opaque[512]; -} crypto_aead_aes256gcm_state; - -SODIUM_EXPORT -size_t crypto_aead_aes256gcm_statebytes(void); - -SODIUM_EXPORT -int crypto_aead_aes256gcm_encrypt(unsigned char *c, - unsigned long long *clen_p, - const unsigned char *m, - unsigned long long mlen, - const unsigned char *ad, - unsigned long long adlen, - const unsigned char *nsec, - const unsigned char *npub, - const unsigned char *k) - __attribute__ ((nonnull(1, 8, 9))); - -SODIUM_EXPORT -int crypto_aead_aes256gcm_decrypt(unsigned char *m, - unsigned long long *mlen_p, - unsigned char *nsec, - const unsigned char *c, - unsigned long long clen, - const unsigned char *ad, - unsigned long long adlen, - const unsigned char *npub, - const unsigned char *k) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(4, 8, 9))); - -SODIUM_EXPORT -int crypto_aead_aes256gcm_encrypt_detached(unsigned char *c, - unsigned char *mac, - unsigned long long *maclen_p, - const unsigned char *m, - unsigned long long mlen, - const unsigned char *ad, - unsigned long long adlen, - const unsigned char *nsec, - const unsigned char *npub, - const unsigned char *k) - __attribute__ ((nonnull(1, 2, 9, 10))); - -SODIUM_EXPORT -int crypto_aead_aes256gcm_decrypt_detached(unsigned char *m, - unsigned char *nsec, - const unsigned char *c, - unsigned long long clen, - const unsigned char *mac, - const unsigned char *ad, - unsigned long long adlen, - const unsigned char *npub, - const unsigned char *k) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(3, 5, 8, 9))); - -/* -- Precomputation interface -- */ - -SODIUM_EXPORT -int crypto_aead_aes256gcm_beforenm(crypto_aead_aes256gcm_state *ctx_, - const unsigned char *k) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_aead_aes256gcm_encrypt_afternm(unsigned char *c, - unsigned long long *clen_p, - const unsigned char *m, - unsigned long long mlen, - const unsigned char *ad, - unsigned long long adlen, - const unsigned char *nsec, - const unsigned char *npub, - const crypto_aead_aes256gcm_state *ctx_) - __attribute__ ((nonnull(1, 8, 9))); - -SODIUM_EXPORT -int crypto_aead_aes256gcm_decrypt_afternm(unsigned char *m, - unsigned long long *mlen_p, - unsigned char *nsec, - const unsigned char *c, - unsigned long long clen, - const unsigned char *ad, - unsigned long long adlen, - const unsigned char *npub, - const crypto_aead_aes256gcm_state *ctx_) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(4, 8, 9))); - -SODIUM_EXPORT -int crypto_aead_aes256gcm_encrypt_detached_afternm(unsigned char *c, - unsigned char *mac, - unsigned long long *maclen_p, - const unsigned char *m, - unsigned long long mlen, - const unsigned char *ad, - unsigned long long adlen, - const unsigned char *nsec, - const unsigned char *npub, - const crypto_aead_aes256gcm_state *ctx_) - __attribute__ ((nonnull(1, 2, 9, 10))); - -SODIUM_EXPORT -int crypto_aead_aes256gcm_decrypt_detached_afternm(unsigned char *m, - unsigned char *nsec, - const unsigned char *c, - unsigned long long clen, - const unsigned char *mac, - const unsigned char *ad, - unsigned long long adlen, - const unsigned char *npub, - const crypto_aead_aes256gcm_state *ctx_) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(3, 5, 8, 9))); - -SODIUM_EXPORT -void crypto_aead_aes256gcm_keygen(unsigned char k[crypto_aead_aes256gcm_KEYBYTES]) - __attribute__ ((nonnull)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_aead_chacha20poly1305.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_aead_chacha20poly1305.h deleted file mode 100644 index 5d671df1..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_aead_chacha20poly1305.h +++ /dev/null @@ -1,180 +0,0 @@ -#ifndef crypto_aead_chacha20poly1305_H -#define crypto_aead_chacha20poly1305_H - -#include -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -/* -- IETF ChaCha20-Poly1305 construction with a 96-bit nonce and a 32-bit internal counter -- */ - -#define crypto_aead_chacha20poly1305_ietf_KEYBYTES 32U -SODIUM_EXPORT -size_t crypto_aead_chacha20poly1305_ietf_keybytes(void); - -#define crypto_aead_chacha20poly1305_ietf_NSECBYTES 0U -SODIUM_EXPORT -size_t crypto_aead_chacha20poly1305_ietf_nsecbytes(void); - -#define crypto_aead_chacha20poly1305_ietf_NPUBBYTES 12U - -SODIUM_EXPORT -size_t crypto_aead_chacha20poly1305_ietf_npubbytes(void); - -#define crypto_aead_chacha20poly1305_ietf_ABYTES 16U -SODIUM_EXPORT -size_t crypto_aead_chacha20poly1305_ietf_abytes(void); - -#define crypto_aead_chacha20poly1305_ietf_MESSAGEBYTES_MAX \ - SODIUM_MIN(SODIUM_SIZE_MAX - crypto_aead_chacha20poly1305_ietf_ABYTES, \ - (64ULL * ((1ULL << 32) - 1ULL))) -SODIUM_EXPORT -size_t crypto_aead_chacha20poly1305_ietf_messagebytes_max(void); - -SODIUM_EXPORT -int crypto_aead_chacha20poly1305_ietf_encrypt(unsigned char *c, - unsigned long long *clen_p, - const unsigned char *m, - unsigned long long mlen, - const unsigned char *ad, - unsigned long long adlen, - const unsigned char *nsec, - const unsigned char *npub, - const unsigned char *k) - __attribute__ ((nonnull(1, 8, 9))); - -SODIUM_EXPORT -int crypto_aead_chacha20poly1305_ietf_decrypt(unsigned char *m, - unsigned long long *mlen_p, - unsigned char *nsec, - const unsigned char *c, - unsigned long long clen, - const unsigned char *ad, - unsigned long long adlen, - const unsigned char *npub, - const unsigned char *k) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(4, 8, 9))); - -SODIUM_EXPORT -int crypto_aead_chacha20poly1305_ietf_encrypt_detached(unsigned char *c, - unsigned char *mac, - unsigned long long *maclen_p, - const unsigned char *m, - unsigned long long mlen, - const unsigned char *ad, - unsigned long long adlen, - const unsigned char *nsec, - const unsigned char *npub, - const unsigned char *k) - __attribute__ ((nonnull(1, 2, 9, 10))); - -SODIUM_EXPORT -int crypto_aead_chacha20poly1305_ietf_decrypt_detached(unsigned char *m, - unsigned char *nsec, - const unsigned char *c, - unsigned long long clen, - const unsigned char *mac, - const unsigned char *ad, - unsigned long long adlen, - const unsigned char *npub, - const unsigned char *k) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(3, 5, 8, 9))); - -SODIUM_EXPORT -void crypto_aead_chacha20poly1305_ietf_keygen(unsigned char k[crypto_aead_chacha20poly1305_ietf_KEYBYTES]) - __attribute__ ((nonnull)); - -/* -- Original ChaCha20-Poly1305 construction with a 64-bit nonce and a 64-bit internal counter -- */ - -#define crypto_aead_chacha20poly1305_KEYBYTES 32U -SODIUM_EXPORT -size_t crypto_aead_chacha20poly1305_keybytes(void); - -#define crypto_aead_chacha20poly1305_NSECBYTES 0U -SODIUM_EXPORT -size_t crypto_aead_chacha20poly1305_nsecbytes(void); - -#define crypto_aead_chacha20poly1305_NPUBBYTES 8U -SODIUM_EXPORT -size_t crypto_aead_chacha20poly1305_npubbytes(void); - -#define crypto_aead_chacha20poly1305_ABYTES 16U -SODIUM_EXPORT -size_t crypto_aead_chacha20poly1305_abytes(void); - -#define crypto_aead_chacha20poly1305_MESSAGEBYTES_MAX \ - (SODIUM_SIZE_MAX - crypto_aead_chacha20poly1305_ABYTES) -SODIUM_EXPORT -size_t crypto_aead_chacha20poly1305_messagebytes_max(void); - -SODIUM_EXPORT -int crypto_aead_chacha20poly1305_encrypt(unsigned char *c, - unsigned long long *clen_p, - const unsigned char *m, - unsigned long long mlen, - const unsigned char *ad, - unsigned long long adlen, - const unsigned char *nsec, - const unsigned char *npub, - const unsigned char *k) - __attribute__ ((nonnull(1, 8, 9))); - -SODIUM_EXPORT -int crypto_aead_chacha20poly1305_decrypt(unsigned char *m, - unsigned long long *mlen_p, - unsigned char *nsec, - const unsigned char *c, - unsigned long long clen, - const unsigned char *ad, - unsigned long long adlen, - const unsigned char *npub, - const unsigned char *k) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(4, 8, 9))); - -SODIUM_EXPORT -int crypto_aead_chacha20poly1305_encrypt_detached(unsigned char *c, - unsigned char *mac, - unsigned long long *maclen_p, - const unsigned char *m, - unsigned long long mlen, - const unsigned char *ad, - unsigned long long adlen, - const unsigned char *nsec, - const unsigned char *npub, - const unsigned char *k) - __attribute__ ((nonnull(1, 2, 9, 10))); - -SODIUM_EXPORT -int crypto_aead_chacha20poly1305_decrypt_detached(unsigned char *m, - unsigned char *nsec, - const unsigned char *c, - unsigned long long clen, - const unsigned char *mac, - const unsigned char *ad, - unsigned long long adlen, - const unsigned char *npub, - const unsigned char *k) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(3, 5, 8, 9))); - -SODIUM_EXPORT -void crypto_aead_chacha20poly1305_keygen(unsigned char k[crypto_aead_chacha20poly1305_KEYBYTES]) - __attribute__ ((nonnull)); - -/* Aliases */ - -#define crypto_aead_chacha20poly1305_IETF_KEYBYTES crypto_aead_chacha20poly1305_ietf_KEYBYTES -#define crypto_aead_chacha20poly1305_IETF_NSECBYTES crypto_aead_chacha20poly1305_ietf_NSECBYTES -#define crypto_aead_chacha20poly1305_IETF_NPUBBYTES crypto_aead_chacha20poly1305_ietf_NPUBBYTES -#define crypto_aead_chacha20poly1305_IETF_ABYTES crypto_aead_chacha20poly1305_ietf_ABYTES -#define crypto_aead_chacha20poly1305_IETF_MESSAGEBYTES_MAX crypto_aead_chacha20poly1305_ietf_MESSAGEBYTES_MAX - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_aead_xchacha20poly1305.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_aead_xchacha20poly1305.h deleted file mode 100644 index 6643b0cb..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_aead_xchacha20poly1305.h +++ /dev/null @@ -1,100 +0,0 @@ -#ifndef crypto_aead_xchacha20poly1305_H -#define crypto_aead_xchacha20poly1305_H - -#include -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -#define crypto_aead_xchacha20poly1305_ietf_KEYBYTES 32U -SODIUM_EXPORT -size_t crypto_aead_xchacha20poly1305_ietf_keybytes(void); - -#define crypto_aead_xchacha20poly1305_ietf_NSECBYTES 0U -SODIUM_EXPORT -size_t crypto_aead_xchacha20poly1305_ietf_nsecbytes(void); - -#define crypto_aead_xchacha20poly1305_ietf_NPUBBYTES 24U -SODIUM_EXPORT -size_t crypto_aead_xchacha20poly1305_ietf_npubbytes(void); - -#define crypto_aead_xchacha20poly1305_ietf_ABYTES 16U -SODIUM_EXPORT -size_t crypto_aead_xchacha20poly1305_ietf_abytes(void); - -#define crypto_aead_xchacha20poly1305_ietf_MESSAGEBYTES_MAX \ - (SODIUM_SIZE_MAX - crypto_aead_xchacha20poly1305_ietf_ABYTES) -SODIUM_EXPORT -size_t crypto_aead_xchacha20poly1305_ietf_messagebytes_max(void); - -SODIUM_EXPORT -int crypto_aead_xchacha20poly1305_ietf_encrypt(unsigned char *c, - unsigned long long *clen_p, - const unsigned char *m, - unsigned long long mlen, - const unsigned char *ad, - unsigned long long adlen, - const unsigned char *nsec, - const unsigned char *npub, - const unsigned char *k) - __attribute__ ((nonnull(1, 8, 9))); - -SODIUM_EXPORT -int crypto_aead_xchacha20poly1305_ietf_decrypt(unsigned char *m, - unsigned long long *mlen_p, - unsigned char *nsec, - const unsigned char *c, - unsigned long long clen, - const unsigned char *ad, - unsigned long long adlen, - const unsigned char *npub, - const unsigned char *k) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(4, 8, 9))); - -SODIUM_EXPORT -int crypto_aead_xchacha20poly1305_ietf_encrypt_detached(unsigned char *c, - unsigned char *mac, - unsigned long long *maclen_p, - const unsigned char *m, - unsigned long long mlen, - const unsigned char *ad, - unsigned long long adlen, - const unsigned char *nsec, - const unsigned char *npub, - const unsigned char *k) - __attribute__ ((nonnull(1, 2, 9, 10))); - -SODIUM_EXPORT -int crypto_aead_xchacha20poly1305_ietf_decrypt_detached(unsigned char *m, - unsigned char *nsec, - const unsigned char *c, - unsigned long long clen, - const unsigned char *mac, - const unsigned char *ad, - unsigned long long adlen, - const unsigned char *npub, - const unsigned char *k) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(3, 5, 8, 9))); - -SODIUM_EXPORT -void crypto_aead_xchacha20poly1305_ietf_keygen(unsigned char k[crypto_aead_xchacha20poly1305_ietf_KEYBYTES]) - __attribute__ ((nonnull)); - -/* Aliases */ - -#define crypto_aead_xchacha20poly1305_IETF_KEYBYTES crypto_aead_xchacha20poly1305_ietf_KEYBYTES -#define crypto_aead_xchacha20poly1305_IETF_NSECBYTES crypto_aead_xchacha20poly1305_ietf_NSECBYTES -#define crypto_aead_xchacha20poly1305_IETF_NPUBBYTES crypto_aead_xchacha20poly1305_ietf_NPUBBYTES -#define crypto_aead_xchacha20poly1305_IETF_ABYTES crypto_aead_xchacha20poly1305_ietf_ABYTES -#define crypto_aead_xchacha20poly1305_IETF_MESSAGEBYTES_MAX crypto_aead_xchacha20poly1305_ietf_MESSAGEBYTES_MAX - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_auth.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_auth.h deleted file mode 100644 index 540aee0e..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_auth.h +++ /dev/null @@ -1,46 +0,0 @@ -#ifndef crypto_auth_H -#define crypto_auth_H - -#include - -#include "crypto_auth_hmacsha512256.h" -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -#define crypto_auth_BYTES crypto_auth_hmacsha512256_BYTES -SODIUM_EXPORT -size_t crypto_auth_bytes(void); - -#define crypto_auth_KEYBYTES crypto_auth_hmacsha512256_KEYBYTES -SODIUM_EXPORT -size_t crypto_auth_keybytes(void); - -#define crypto_auth_PRIMITIVE "hmacsha512256" -SODIUM_EXPORT -const char *crypto_auth_primitive(void); - -SODIUM_EXPORT -int crypto_auth(unsigned char *out, const unsigned char *in, - unsigned long long inlen, const unsigned char *k) - __attribute__ ((nonnull(1, 4))); - -SODIUM_EXPORT -int crypto_auth_verify(const unsigned char *h, const unsigned char *in, - unsigned long long inlen, const unsigned char *k) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(1, 4))); - -SODIUM_EXPORT -void crypto_auth_keygen(unsigned char k[crypto_auth_KEYBYTES]) - __attribute__ ((nonnull)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_auth_hmacsha256.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_auth_hmacsha256.h deleted file mode 100644 index 3da864c7..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_auth_hmacsha256.h +++ /dev/null @@ -1,70 +0,0 @@ -#ifndef crypto_auth_hmacsha256_H -#define crypto_auth_hmacsha256_H - -#include -#include "crypto_hash_sha256.h" -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -#define crypto_auth_hmacsha256_BYTES 32U -SODIUM_EXPORT -size_t crypto_auth_hmacsha256_bytes(void); - -#define crypto_auth_hmacsha256_KEYBYTES 32U -SODIUM_EXPORT -size_t crypto_auth_hmacsha256_keybytes(void); - -SODIUM_EXPORT -int crypto_auth_hmacsha256(unsigned char *out, - const unsigned char *in, - unsigned long long inlen, - const unsigned char *k) __attribute__ ((nonnull(1, 4))); - -SODIUM_EXPORT -int crypto_auth_hmacsha256_verify(const unsigned char *h, - const unsigned char *in, - unsigned long long inlen, - const unsigned char *k) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(1, 4))); - -/* ------------------------------------------------------------------------- */ - -typedef struct crypto_auth_hmacsha256_state { - crypto_hash_sha256_state ictx; - crypto_hash_sha256_state octx; -} crypto_auth_hmacsha256_state; - -SODIUM_EXPORT -size_t crypto_auth_hmacsha256_statebytes(void); - -SODIUM_EXPORT -int crypto_auth_hmacsha256_init(crypto_auth_hmacsha256_state *state, - const unsigned char *key, - size_t keylen) __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_auth_hmacsha256_update(crypto_auth_hmacsha256_state *state, - const unsigned char *in, - unsigned long long inlen) - __attribute__ ((nonnull(1))); - -SODIUM_EXPORT -int crypto_auth_hmacsha256_final(crypto_auth_hmacsha256_state *state, - unsigned char *out) __attribute__ ((nonnull)); - - -SODIUM_EXPORT -void crypto_auth_hmacsha256_keygen(unsigned char k[crypto_auth_hmacsha256_KEYBYTES]) - __attribute__ ((nonnull)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_auth_hmacsha512.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_auth_hmacsha512.h deleted file mode 100644 index d992cb81..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_auth_hmacsha512.h +++ /dev/null @@ -1,68 +0,0 @@ -#ifndef crypto_auth_hmacsha512_H -#define crypto_auth_hmacsha512_H - -#include -#include "crypto_hash_sha512.h" -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -#define crypto_auth_hmacsha512_BYTES 64U -SODIUM_EXPORT -size_t crypto_auth_hmacsha512_bytes(void); - -#define crypto_auth_hmacsha512_KEYBYTES 32U -SODIUM_EXPORT -size_t crypto_auth_hmacsha512_keybytes(void); - -SODIUM_EXPORT -int crypto_auth_hmacsha512(unsigned char *out, - const unsigned char *in, - unsigned long long inlen, - const unsigned char *k) __attribute__ ((nonnull(1, 4))); - -SODIUM_EXPORT -int crypto_auth_hmacsha512_verify(const unsigned char *h, - const unsigned char *in, - unsigned long long inlen, - const unsigned char *k) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(1, 4))); - -/* ------------------------------------------------------------------------- */ - -typedef struct crypto_auth_hmacsha512_state { - crypto_hash_sha512_state ictx; - crypto_hash_sha512_state octx; -} crypto_auth_hmacsha512_state; - -SODIUM_EXPORT -size_t crypto_auth_hmacsha512_statebytes(void); - -SODIUM_EXPORT -int crypto_auth_hmacsha512_init(crypto_auth_hmacsha512_state *state, - const unsigned char *key, - size_t keylen) __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_auth_hmacsha512_update(crypto_auth_hmacsha512_state *state, - const unsigned char *in, - unsigned long long inlen) __attribute__ ((nonnull(1))); - -SODIUM_EXPORT -int crypto_auth_hmacsha512_final(crypto_auth_hmacsha512_state *state, - unsigned char *out) __attribute__ ((nonnull)); - -SODIUM_EXPORT -void crypto_auth_hmacsha512_keygen(unsigned char k[crypto_auth_hmacsha512_KEYBYTES]) - __attribute__ ((nonnull)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_auth_hmacsha512256.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_auth_hmacsha512256.h deleted file mode 100644 index 3fb52638..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_auth_hmacsha512256.h +++ /dev/null @@ -1,65 +0,0 @@ -#ifndef crypto_auth_hmacsha512256_H -#define crypto_auth_hmacsha512256_H - -#include -#include "crypto_auth_hmacsha512.h" -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -#define crypto_auth_hmacsha512256_BYTES 32U -SODIUM_EXPORT -size_t crypto_auth_hmacsha512256_bytes(void); - -#define crypto_auth_hmacsha512256_KEYBYTES 32U -SODIUM_EXPORT -size_t crypto_auth_hmacsha512256_keybytes(void); - -SODIUM_EXPORT -int crypto_auth_hmacsha512256(unsigned char *out, - const unsigned char *in, - unsigned long long inlen, - const unsigned char *k) __attribute__ ((nonnull(1, 4))); - -SODIUM_EXPORT -int crypto_auth_hmacsha512256_verify(const unsigned char *h, - const unsigned char *in, - unsigned long long inlen, - const unsigned char *k) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(1, 4))); - -/* ------------------------------------------------------------------------- */ - -typedef crypto_auth_hmacsha512_state crypto_auth_hmacsha512256_state; - -SODIUM_EXPORT -size_t crypto_auth_hmacsha512256_statebytes(void); - -SODIUM_EXPORT -int crypto_auth_hmacsha512256_init(crypto_auth_hmacsha512256_state *state, - const unsigned char *key, - size_t keylen) __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_auth_hmacsha512256_update(crypto_auth_hmacsha512256_state *state, - const unsigned char *in, - unsigned long long inlen) __attribute__ ((nonnull(1))); - -SODIUM_EXPORT -int crypto_auth_hmacsha512256_final(crypto_auth_hmacsha512256_state *state, - unsigned char *out) __attribute__ ((nonnull)); - -SODIUM_EXPORT -void crypto_auth_hmacsha512256_keygen(unsigned char k[crypto_auth_hmacsha512256_KEYBYTES]) - __attribute__ ((nonnull)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_box.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_box.h deleted file mode 100644 index 0008e020..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_box.h +++ /dev/null @@ -1,177 +0,0 @@ -#ifndef crypto_box_H -#define crypto_box_H - -/* - * THREAD SAFETY: crypto_box_keypair() is thread-safe, - * provided that sodium_init() was called before. - * - * Other functions are always thread-safe. - */ - -#include - -#include "crypto_box_curve25519xsalsa20poly1305.h" -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -#define crypto_box_SEEDBYTES crypto_box_curve25519xsalsa20poly1305_SEEDBYTES -SODIUM_EXPORT -size_t crypto_box_seedbytes(void); - -#define crypto_box_PUBLICKEYBYTES crypto_box_curve25519xsalsa20poly1305_PUBLICKEYBYTES -SODIUM_EXPORT -size_t crypto_box_publickeybytes(void); - -#define crypto_box_SECRETKEYBYTES crypto_box_curve25519xsalsa20poly1305_SECRETKEYBYTES -SODIUM_EXPORT -size_t crypto_box_secretkeybytes(void); - -#define crypto_box_NONCEBYTES crypto_box_curve25519xsalsa20poly1305_NONCEBYTES -SODIUM_EXPORT -size_t crypto_box_noncebytes(void); - -#define crypto_box_MACBYTES crypto_box_curve25519xsalsa20poly1305_MACBYTES -SODIUM_EXPORT -size_t crypto_box_macbytes(void); - -#define crypto_box_MESSAGEBYTES_MAX crypto_box_curve25519xsalsa20poly1305_MESSAGEBYTES_MAX -SODIUM_EXPORT -size_t crypto_box_messagebytes_max(void); - -#define crypto_box_PRIMITIVE "curve25519xsalsa20poly1305" -SODIUM_EXPORT -const char *crypto_box_primitive(void); - -SODIUM_EXPORT -int crypto_box_seed_keypair(unsigned char *pk, unsigned char *sk, - const unsigned char *seed) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_box_keypair(unsigned char *pk, unsigned char *sk) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_box_easy(unsigned char *c, const unsigned char *m, - unsigned long long mlen, const unsigned char *n, - const unsigned char *pk, const unsigned char *sk) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(1, 4, 5, 6))); - -SODIUM_EXPORT -int crypto_box_open_easy(unsigned char *m, const unsigned char *c, - unsigned long long clen, const unsigned char *n, - const unsigned char *pk, const unsigned char *sk) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(2, 4, 5, 6))); - -SODIUM_EXPORT -int crypto_box_detached(unsigned char *c, unsigned char *mac, - const unsigned char *m, unsigned long long mlen, - const unsigned char *n, const unsigned char *pk, - const unsigned char *sk) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(1, 2, 5, 6, 7))); - -SODIUM_EXPORT -int crypto_box_open_detached(unsigned char *m, const unsigned char *c, - const unsigned char *mac, - unsigned long long clen, - const unsigned char *n, - const unsigned char *pk, - const unsigned char *sk) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(2, 3, 5, 6, 7))); - -/* -- Precomputation interface -- */ - -#define crypto_box_BEFORENMBYTES crypto_box_curve25519xsalsa20poly1305_BEFORENMBYTES -SODIUM_EXPORT -size_t crypto_box_beforenmbytes(void); - -SODIUM_EXPORT -int crypto_box_beforenm(unsigned char *k, const unsigned char *pk, - const unsigned char *sk) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_box_easy_afternm(unsigned char *c, const unsigned char *m, - unsigned long long mlen, const unsigned char *n, - const unsigned char *k) __attribute__ ((nonnull(1, 4, 5))); - -SODIUM_EXPORT -int crypto_box_open_easy_afternm(unsigned char *m, const unsigned char *c, - unsigned long long clen, const unsigned char *n, - const unsigned char *k) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(2, 4, 5))); - -SODIUM_EXPORT -int crypto_box_detached_afternm(unsigned char *c, unsigned char *mac, - const unsigned char *m, unsigned long long mlen, - const unsigned char *n, const unsigned char *k) - __attribute__ ((nonnull(1, 2, 5, 6))); - -SODIUM_EXPORT -int crypto_box_open_detached_afternm(unsigned char *m, const unsigned char *c, - const unsigned char *mac, - unsigned long long clen, const unsigned char *n, - const unsigned char *k) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(2, 3, 5, 6))); - -/* -- Ephemeral SK interface -- */ - -#define crypto_box_SEALBYTES (crypto_box_PUBLICKEYBYTES + crypto_box_MACBYTES) -SODIUM_EXPORT -size_t crypto_box_sealbytes(void); - -SODIUM_EXPORT -int crypto_box_seal(unsigned char *c, const unsigned char *m, - unsigned long long mlen, const unsigned char *pk) - __attribute__ ((nonnull(1, 4))); - -SODIUM_EXPORT -int crypto_box_seal_open(unsigned char *m, const unsigned char *c, - unsigned long long clen, - const unsigned char *pk, const unsigned char *sk) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(2, 4, 5))); - -/* -- NaCl compatibility interface ; Requires padding -- */ - -#define crypto_box_ZEROBYTES crypto_box_curve25519xsalsa20poly1305_ZEROBYTES -SODIUM_EXPORT -size_t crypto_box_zerobytes(void) __attribute__ ((deprecated)); - -#define crypto_box_BOXZEROBYTES crypto_box_curve25519xsalsa20poly1305_BOXZEROBYTES -SODIUM_EXPORT -size_t crypto_box_boxzerobytes(void) __attribute__ ((deprecated)); - -SODIUM_EXPORT -int crypto_box(unsigned char *c, const unsigned char *m, - unsigned long long mlen, const unsigned char *n, - const unsigned char *pk, const unsigned char *sk) - __attribute__ ((deprecated)) __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(1, 4, 5, 6))); - -SODIUM_EXPORT -int crypto_box_open(unsigned char *m, const unsigned char *c, - unsigned long long clen, const unsigned char *n, - const unsigned char *pk, const unsigned char *sk) - __attribute__ ((deprecated)) __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(2, 4, 5, 6))); - -SODIUM_EXPORT -int crypto_box_afternm(unsigned char *c, const unsigned char *m, - unsigned long long mlen, const unsigned char *n, - const unsigned char *k) __attribute__ ((deprecated)) __attribute__ ((nonnull(1, 4, 5))); - -SODIUM_EXPORT -int crypto_box_open_afternm(unsigned char *m, const unsigned char *c, - unsigned long long clen, const unsigned char *n, - const unsigned char *k) - __attribute__ ((warn_unused_result)) __attribute__ ((deprecated)) __attribute__ ((nonnull(2, 4, 5))); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_box_curve25519xchacha20poly1305.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_box_curve25519xchacha20poly1305.h deleted file mode 100644 index 26a3d31e..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_box_curve25519xchacha20poly1305.h +++ /dev/null @@ -1,164 +0,0 @@ - -#ifndef crypto_box_curve25519xchacha20poly1305_H -#define crypto_box_curve25519xchacha20poly1305_H - -#include -#include "crypto_stream_xchacha20.h" -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -#define crypto_box_curve25519xchacha20poly1305_SEEDBYTES 32U -SODIUM_EXPORT -size_t crypto_box_curve25519xchacha20poly1305_seedbytes(void); - -#define crypto_box_curve25519xchacha20poly1305_PUBLICKEYBYTES 32U -SODIUM_EXPORT -size_t crypto_box_curve25519xchacha20poly1305_publickeybytes(void); - -#define crypto_box_curve25519xchacha20poly1305_SECRETKEYBYTES 32U -SODIUM_EXPORT -size_t crypto_box_curve25519xchacha20poly1305_secretkeybytes(void); - -#define crypto_box_curve25519xchacha20poly1305_BEFORENMBYTES 32U -SODIUM_EXPORT -size_t crypto_box_curve25519xchacha20poly1305_beforenmbytes(void); - -#define crypto_box_curve25519xchacha20poly1305_NONCEBYTES 24U -SODIUM_EXPORT -size_t crypto_box_curve25519xchacha20poly1305_noncebytes(void); - -#define crypto_box_curve25519xchacha20poly1305_MACBYTES 16U -SODIUM_EXPORT -size_t crypto_box_curve25519xchacha20poly1305_macbytes(void); - -#define crypto_box_curve25519xchacha20poly1305_MESSAGEBYTES_MAX \ - (crypto_stream_xchacha20_MESSAGEBYTES_MAX - crypto_box_curve25519xchacha20poly1305_MACBYTES) -SODIUM_EXPORT -size_t crypto_box_curve25519xchacha20poly1305_messagebytes_max(void); - -SODIUM_EXPORT -int crypto_box_curve25519xchacha20poly1305_seed_keypair(unsigned char *pk, - unsigned char *sk, - const unsigned char *seed) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_box_curve25519xchacha20poly1305_keypair(unsigned char *pk, - unsigned char *sk) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_box_curve25519xchacha20poly1305_easy(unsigned char *c, - const unsigned char *m, - unsigned long long mlen, - const unsigned char *n, - const unsigned char *pk, - const unsigned char *sk) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(1, 4, 5, 6))); - -SODIUM_EXPORT -int crypto_box_curve25519xchacha20poly1305_open_easy(unsigned char *m, - const unsigned char *c, - unsigned long long clen, - const unsigned char *n, - const unsigned char *pk, - const unsigned char *sk) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(2, 4, 5, 6))); - -SODIUM_EXPORT -int crypto_box_curve25519xchacha20poly1305_detached(unsigned char *c, - unsigned char *mac, - const unsigned char *m, - unsigned long long mlen, - const unsigned char *n, - const unsigned char *pk, - const unsigned char *sk) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(1, 2, 5, 6, 7))); - -SODIUM_EXPORT -int crypto_box_curve25519xchacha20poly1305_open_detached(unsigned char *m, - const unsigned char *c, - const unsigned char *mac, - unsigned long long clen, - const unsigned char *n, - const unsigned char *pk, - const unsigned char *sk) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(2, 3, 5, 6, 7))); - -/* -- Precomputation interface -- */ - -SODIUM_EXPORT -int crypto_box_curve25519xchacha20poly1305_beforenm(unsigned char *k, - const unsigned char *pk, - const unsigned char *sk) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_box_curve25519xchacha20poly1305_easy_afternm(unsigned char *c, - const unsigned char *m, - unsigned long long mlen, - const unsigned char *n, - const unsigned char *k) - __attribute__ ((nonnull(1, 4, 5))); - -SODIUM_EXPORT -int crypto_box_curve25519xchacha20poly1305_open_easy_afternm(unsigned char *m, - const unsigned char *c, - unsigned long long clen, - const unsigned char *n, - const unsigned char *k) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(2, 4, 5))); - -SODIUM_EXPORT -int crypto_box_curve25519xchacha20poly1305_detached_afternm(unsigned char *c, - unsigned char *mac, - const unsigned char *m, - unsigned long long mlen, - const unsigned char *n, - const unsigned char *k) - __attribute__ ((nonnull(1, 2, 5, 6))); - -SODIUM_EXPORT -int crypto_box_curve25519xchacha20poly1305_open_detached_afternm(unsigned char *m, - const unsigned char *c, - const unsigned char *mac, - unsigned long long clen, - const unsigned char *n, - const unsigned char *k) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(2, 3, 5, 6))); - -/* -- Ephemeral SK interface -- */ - -#define crypto_box_curve25519xchacha20poly1305_SEALBYTES \ - (crypto_box_curve25519xchacha20poly1305_PUBLICKEYBYTES + \ - crypto_box_curve25519xchacha20poly1305_MACBYTES) - -SODIUM_EXPORT -size_t crypto_box_curve25519xchacha20poly1305_sealbytes(void); - -SODIUM_EXPORT -int crypto_box_curve25519xchacha20poly1305_seal(unsigned char *c, - const unsigned char *m, - unsigned long long mlen, - const unsigned char *pk) - __attribute__ ((nonnull(1, 4))); - -SODIUM_EXPORT -int crypto_box_curve25519xchacha20poly1305_seal_open(unsigned char *m, - const unsigned char *c, - unsigned long long clen, - const unsigned char *pk, - const unsigned char *sk) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(2, 4, 5))); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_box_curve25519xsalsa20poly1305.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_box_curve25519xsalsa20poly1305.h deleted file mode 100644 index 2c9b5d6e..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_box_curve25519xsalsa20poly1305.h +++ /dev/null @@ -1,113 +0,0 @@ -#ifndef crypto_box_curve25519xsalsa20poly1305_H -#define crypto_box_curve25519xsalsa20poly1305_H - -#include -#include "crypto_stream_xsalsa20.h" -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -#define crypto_box_curve25519xsalsa20poly1305_SEEDBYTES 32U -SODIUM_EXPORT -size_t crypto_box_curve25519xsalsa20poly1305_seedbytes(void); - -#define crypto_box_curve25519xsalsa20poly1305_PUBLICKEYBYTES 32U -SODIUM_EXPORT -size_t crypto_box_curve25519xsalsa20poly1305_publickeybytes(void); - -#define crypto_box_curve25519xsalsa20poly1305_SECRETKEYBYTES 32U -SODIUM_EXPORT -size_t crypto_box_curve25519xsalsa20poly1305_secretkeybytes(void); - -#define crypto_box_curve25519xsalsa20poly1305_BEFORENMBYTES 32U -SODIUM_EXPORT -size_t crypto_box_curve25519xsalsa20poly1305_beforenmbytes(void); - -#define crypto_box_curve25519xsalsa20poly1305_NONCEBYTES 24U -SODIUM_EXPORT -size_t crypto_box_curve25519xsalsa20poly1305_noncebytes(void); - -#define crypto_box_curve25519xsalsa20poly1305_MACBYTES 16U -SODIUM_EXPORT -size_t crypto_box_curve25519xsalsa20poly1305_macbytes(void); - -/* Only for the libsodium API - The NaCl compatibility API would require BOXZEROBYTES extra bytes */ -#define crypto_box_curve25519xsalsa20poly1305_MESSAGEBYTES_MAX \ - (crypto_stream_xsalsa20_MESSAGEBYTES_MAX - crypto_box_curve25519xsalsa20poly1305_MACBYTES) -SODIUM_EXPORT -size_t crypto_box_curve25519xsalsa20poly1305_messagebytes_max(void); - -SODIUM_EXPORT -int crypto_box_curve25519xsalsa20poly1305_seed_keypair(unsigned char *pk, - unsigned char *sk, - const unsigned char *seed) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_box_curve25519xsalsa20poly1305_keypair(unsigned char *pk, - unsigned char *sk) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_box_curve25519xsalsa20poly1305_beforenm(unsigned char *k, - const unsigned char *pk, - const unsigned char *sk) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull)); - -/* -- NaCl compatibility interface ; Requires padding -- */ - -#define crypto_box_curve25519xsalsa20poly1305_BOXZEROBYTES 16U -SODIUM_EXPORT -size_t crypto_box_curve25519xsalsa20poly1305_boxzerobytes(void); - -#define crypto_box_curve25519xsalsa20poly1305_ZEROBYTES \ - (crypto_box_curve25519xsalsa20poly1305_BOXZEROBYTES + \ - crypto_box_curve25519xsalsa20poly1305_MACBYTES) -SODIUM_EXPORT -size_t crypto_box_curve25519xsalsa20poly1305_zerobytes(void) - __attribute__ ((deprecated)); - -SODIUM_EXPORT -int crypto_box_curve25519xsalsa20poly1305(unsigned char *c, - const unsigned char *m, - unsigned long long mlen, - const unsigned char *n, - const unsigned char *pk, - const unsigned char *sk) - __attribute__ ((deprecated)) __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(1, 4, 5, 6))); - -SODIUM_EXPORT -int crypto_box_curve25519xsalsa20poly1305_open(unsigned char *m, - const unsigned char *c, - unsigned long long clen, - const unsigned char *n, - const unsigned char *pk, - const unsigned char *sk) - __attribute__ ((deprecated)) __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(2, 4, 5, 6))); - -SODIUM_EXPORT -int crypto_box_curve25519xsalsa20poly1305_afternm(unsigned char *c, - const unsigned char *m, - unsigned long long mlen, - const unsigned char *n, - const unsigned char *k) - __attribute__ ((deprecated)) __attribute__ ((nonnull(1, 4, 5))); - -SODIUM_EXPORT -int crypto_box_curve25519xsalsa20poly1305_open_afternm(unsigned char *m, - const unsigned char *c, - unsigned long long clen, - const unsigned char *n, - const unsigned char *k) - __attribute__ ((deprecated)) __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(2, 4, 5))); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_core_ed25519.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_core_ed25519.h deleted file mode 100644 index 618a44f9..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_core_ed25519.h +++ /dev/null @@ -1,115 +0,0 @@ -#ifndef crypto_core_ed25519_H -#define crypto_core_ed25519_H - -#include -#include "export.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#define crypto_core_ed25519_BYTES 32 -SODIUM_EXPORT -size_t crypto_core_ed25519_bytes(void); - -#define crypto_core_ed25519_UNIFORMBYTES 32 -SODIUM_EXPORT -size_t crypto_core_ed25519_uniformbytes(void); - -#define crypto_core_ed25519_HASHBYTES 64 -SODIUM_EXPORT -size_t crypto_core_ed25519_hashbytes(void); - -#define crypto_core_ed25519_SCALARBYTES 32 -SODIUM_EXPORT -size_t crypto_core_ed25519_scalarbytes(void); - -#define crypto_core_ed25519_NONREDUCEDSCALARBYTES 64 -SODIUM_EXPORT -size_t crypto_core_ed25519_nonreducedscalarbytes(void); - -#define crypto_core_ed25519_H2CSHA256 1 -#define crypto_core_ed25519_H2CSHA512 2 - -SODIUM_EXPORT -int crypto_core_ed25519_is_valid_point(const unsigned char *p) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_core_ed25519_add(unsigned char *r, - const unsigned char *p, const unsigned char *q) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_core_ed25519_sub(unsigned char *r, - const unsigned char *p, const unsigned char *q) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_core_ed25519_from_uniform(unsigned char *p, const unsigned char *r) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_core_ed25519_from_string(unsigned char p[crypto_core_ed25519_BYTES], - const char *ctx, const unsigned char *msg, - size_t msg_len, int hash_alg) - __attribute__ ((nonnull(1))); - -SODIUM_EXPORT -int crypto_core_ed25519_from_string_ro(unsigned char p[crypto_core_ed25519_BYTES], - const char *ctx, const unsigned char *msg, - size_t msg_len, int hash_alg) - __attribute__ ((nonnull(1))); - -SODIUM_EXPORT -void crypto_core_ed25519_random(unsigned char *p) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -void crypto_core_ed25519_scalar_random(unsigned char *r) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_core_ed25519_scalar_invert(unsigned char *recip, const unsigned char *s) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -void crypto_core_ed25519_scalar_negate(unsigned char *neg, const unsigned char *s) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -void crypto_core_ed25519_scalar_complement(unsigned char *comp, const unsigned char *s) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -void crypto_core_ed25519_scalar_add(unsigned char *z, const unsigned char *x, - const unsigned char *y) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -void crypto_core_ed25519_scalar_sub(unsigned char *z, const unsigned char *x, - const unsigned char *y) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -void crypto_core_ed25519_scalar_mul(unsigned char *z, const unsigned char *x, - const unsigned char *y) - __attribute__ ((nonnull)); - -/* - * The interval `s` is sampled from should be at least 317 bits to ensure almost - * uniformity of `r` over `L`. - */ -SODIUM_EXPORT -void crypto_core_ed25519_scalar_reduce(unsigned char *r, const unsigned char *s) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_core_ed25519_scalar_is_canonical(const unsigned char *s) - __attribute__ ((nonnull)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_core_hchacha20.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_core_hchacha20.h deleted file mode 100644 index ece141b0..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_core_hchacha20.h +++ /dev/null @@ -1,36 +0,0 @@ -#ifndef crypto_core_hchacha20_H -#define crypto_core_hchacha20_H - -#include -#include "export.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#define crypto_core_hchacha20_OUTPUTBYTES 32U -SODIUM_EXPORT -size_t crypto_core_hchacha20_outputbytes(void); - -#define crypto_core_hchacha20_INPUTBYTES 16U -SODIUM_EXPORT -size_t crypto_core_hchacha20_inputbytes(void); - -#define crypto_core_hchacha20_KEYBYTES 32U -SODIUM_EXPORT -size_t crypto_core_hchacha20_keybytes(void); - -#define crypto_core_hchacha20_CONSTBYTES 16U -SODIUM_EXPORT -size_t crypto_core_hchacha20_constbytes(void); - -SODIUM_EXPORT -int crypto_core_hchacha20(unsigned char *out, const unsigned char *in, - const unsigned char *k, const unsigned char *c) - __attribute__ ((nonnull(1, 2, 3))); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_core_hsalsa20.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_core_hsalsa20.h deleted file mode 100644 index 4bf7a487..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_core_hsalsa20.h +++ /dev/null @@ -1,36 +0,0 @@ -#ifndef crypto_core_hsalsa20_H -#define crypto_core_hsalsa20_H - -#include -#include "export.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#define crypto_core_hsalsa20_OUTPUTBYTES 32U -SODIUM_EXPORT -size_t crypto_core_hsalsa20_outputbytes(void); - -#define crypto_core_hsalsa20_INPUTBYTES 16U -SODIUM_EXPORT -size_t crypto_core_hsalsa20_inputbytes(void); - -#define crypto_core_hsalsa20_KEYBYTES 32U -SODIUM_EXPORT -size_t crypto_core_hsalsa20_keybytes(void); - -#define crypto_core_hsalsa20_CONSTBYTES 16U -SODIUM_EXPORT -size_t crypto_core_hsalsa20_constbytes(void); - -SODIUM_EXPORT -int crypto_core_hsalsa20(unsigned char *out, const unsigned char *in, - const unsigned char *k, const unsigned char *c) - __attribute__ ((nonnull(1, 2, 3))); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_core_ristretto255.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_core_ristretto255.h deleted file mode 100644 index 5fc3a1be..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_core_ristretto255.h +++ /dev/null @@ -1,121 +0,0 @@ -#ifndef crypto_core_ristretto255_H -#define crypto_core_ristretto255_H - -#include -#include "export.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#define crypto_core_ristretto255_BYTES 32 -SODIUM_EXPORT -size_t crypto_core_ristretto255_bytes(void); - -#define crypto_core_ristretto255_HASHBYTES 64 -SODIUM_EXPORT -size_t crypto_core_ristretto255_hashbytes(void); - -#define crypto_core_ristretto255_SCALARBYTES 32 -SODIUM_EXPORT -size_t crypto_core_ristretto255_scalarbytes(void); - -#define crypto_core_ristretto255_NONREDUCEDSCALARBYTES 64 -SODIUM_EXPORT -size_t crypto_core_ristretto255_nonreducedscalarbytes(void); - -#define crypto_core_ristretto255_H2CSHA256 1 -#define crypto_core_ristretto255_H2CSHA512 2 - -SODIUM_EXPORT -int crypto_core_ristretto255_is_valid_point(const unsigned char *p) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_core_ristretto255_add(unsigned char *r, - const unsigned char *p, const unsigned char *q) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_core_ristretto255_sub(unsigned char *r, - const unsigned char *p, const unsigned char *q) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_core_ristretto255_from_hash(unsigned char *p, - const unsigned char *r) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_core_ristretto255_from_string(unsigned char p[crypto_core_ristretto255_BYTES], - const char *ctx, - const unsigned char *msg, - size_t msg_len, int hash_alg) - __attribute__ ((nonnull(1))); - -SODIUM_EXPORT -int crypto_core_ristretto255_from_string_ro(unsigned char p[crypto_core_ristretto255_BYTES], - const char *ctx, - const unsigned char *msg, - size_t msg_len, int hash_alg) - __attribute__ ((nonnull(1))); - -SODIUM_EXPORT -void crypto_core_ristretto255_random(unsigned char *p) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -void crypto_core_ristretto255_scalar_random(unsigned char *r) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_core_ristretto255_scalar_invert(unsigned char *recip, - const unsigned char *s) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -void crypto_core_ristretto255_scalar_negate(unsigned char *neg, - const unsigned char *s) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -void crypto_core_ristretto255_scalar_complement(unsigned char *comp, - const unsigned char *s) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -void crypto_core_ristretto255_scalar_add(unsigned char *z, - const unsigned char *x, - const unsigned char *y) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -void crypto_core_ristretto255_scalar_sub(unsigned char *z, - const unsigned char *x, - const unsigned char *y) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -void crypto_core_ristretto255_scalar_mul(unsigned char *z, - const unsigned char *x, - const unsigned char *y) - __attribute__ ((nonnull)); - -/* - * The interval `s` is sampled from should be at least 317 bits to ensure almost - * uniformity of `r` over `L`. - */ -SODIUM_EXPORT -void crypto_core_ristretto255_scalar_reduce(unsigned char *r, - const unsigned char *s) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_core_ristretto255_scalar_is_canonical(const unsigned char *s) - __attribute__ ((nonnull)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_core_salsa20.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_core_salsa20.h deleted file mode 100644 index bd79fd9f..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_core_salsa20.h +++ /dev/null @@ -1,36 +0,0 @@ -#ifndef crypto_core_salsa20_H -#define crypto_core_salsa20_H - -#include -#include "export.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#define crypto_core_salsa20_OUTPUTBYTES 64U -SODIUM_EXPORT -size_t crypto_core_salsa20_outputbytes(void); - -#define crypto_core_salsa20_INPUTBYTES 16U -SODIUM_EXPORT -size_t crypto_core_salsa20_inputbytes(void); - -#define crypto_core_salsa20_KEYBYTES 32U -SODIUM_EXPORT -size_t crypto_core_salsa20_keybytes(void); - -#define crypto_core_salsa20_CONSTBYTES 16U -SODIUM_EXPORT -size_t crypto_core_salsa20_constbytes(void); - -SODIUM_EXPORT -int crypto_core_salsa20(unsigned char *out, const unsigned char *in, - const unsigned char *k, const unsigned char *c) - __attribute__ ((nonnull(1, 2, 3))); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_core_salsa2012.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_core_salsa2012.h deleted file mode 100644 index 05957591..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_core_salsa2012.h +++ /dev/null @@ -1,36 +0,0 @@ -#ifndef crypto_core_salsa2012_H -#define crypto_core_salsa2012_H - -#include -#include "export.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#define crypto_core_salsa2012_OUTPUTBYTES 64U -SODIUM_EXPORT -size_t crypto_core_salsa2012_outputbytes(void); - -#define crypto_core_salsa2012_INPUTBYTES 16U -SODIUM_EXPORT -size_t crypto_core_salsa2012_inputbytes(void); - -#define crypto_core_salsa2012_KEYBYTES 32U -SODIUM_EXPORT -size_t crypto_core_salsa2012_keybytes(void); - -#define crypto_core_salsa2012_CONSTBYTES 16U -SODIUM_EXPORT -size_t crypto_core_salsa2012_constbytes(void); - -SODIUM_EXPORT -int crypto_core_salsa2012(unsigned char *out, const unsigned char *in, - const unsigned char *k, const unsigned char *c) - __attribute__ ((nonnull(1, 2, 3))); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_core_salsa208.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_core_salsa208.h deleted file mode 100644 index d2f216af..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_core_salsa208.h +++ /dev/null @@ -1,40 +0,0 @@ -#ifndef crypto_core_salsa208_H -#define crypto_core_salsa208_H - -#include -#include "export.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#define crypto_core_salsa208_OUTPUTBYTES 64U -SODIUM_EXPORT -size_t crypto_core_salsa208_outputbytes(void) - __attribute__ ((deprecated)); - -#define crypto_core_salsa208_INPUTBYTES 16U -SODIUM_EXPORT -size_t crypto_core_salsa208_inputbytes(void) - __attribute__ ((deprecated)); - -#define crypto_core_salsa208_KEYBYTES 32U -SODIUM_EXPORT -size_t crypto_core_salsa208_keybytes(void) - __attribute__ ((deprecated)); - -#define crypto_core_salsa208_CONSTBYTES 16U -SODIUM_EXPORT -size_t crypto_core_salsa208_constbytes(void) - __attribute__ ((deprecated)); - -SODIUM_EXPORT -int crypto_core_salsa208(unsigned char *out, const unsigned char *in, - const unsigned char *k, const unsigned char *c) - __attribute__ ((nonnull(1, 2, 3))); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_generichash.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_generichash.h deleted file mode 100644 index d897e5d2..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_generichash.h +++ /dev/null @@ -1,84 +0,0 @@ -#ifndef crypto_generichash_H -#define crypto_generichash_H - -#include - -#include "crypto_generichash_blake2b.h" -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -#define crypto_generichash_BYTES_MIN crypto_generichash_blake2b_BYTES_MIN -SODIUM_EXPORT -size_t crypto_generichash_bytes_min(void); - -#define crypto_generichash_BYTES_MAX crypto_generichash_blake2b_BYTES_MAX -SODIUM_EXPORT -size_t crypto_generichash_bytes_max(void); - -#define crypto_generichash_BYTES crypto_generichash_blake2b_BYTES -SODIUM_EXPORT -size_t crypto_generichash_bytes(void); - -#define crypto_generichash_KEYBYTES_MIN crypto_generichash_blake2b_KEYBYTES_MIN -SODIUM_EXPORT -size_t crypto_generichash_keybytes_min(void); - -#define crypto_generichash_KEYBYTES_MAX crypto_generichash_blake2b_KEYBYTES_MAX -SODIUM_EXPORT -size_t crypto_generichash_keybytes_max(void); - -#define crypto_generichash_KEYBYTES crypto_generichash_blake2b_KEYBYTES -SODIUM_EXPORT -size_t crypto_generichash_keybytes(void); - -#define crypto_generichash_PRIMITIVE "blake2b" -SODIUM_EXPORT -const char *crypto_generichash_primitive(void); - -/* - * Important when writing bindings for other programming languages: - * the state address should be 64-bytes aligned. - */ -typedef crypto_generichash_blake2b_state crypto_generichash_state; - -SODIUM_EXPORT -size_t crypto_generichash_statebytes(void); - -SODIUM_EXPORT -int crypto_generichash(unsigned char *out, size_t outlen, - const unsigned char *in, unsigned long long inlen, - const unsigned char *key, size_t keylen) - __attribute__ ((nonnull(1))); - -SODIUM_EXPORT -int crypto_generichash_init(crypto_generichash_state *state, - const unsigned char *key, - const size_t keylen, const size_t outlen) - __attribute__ ((nonnull(1))); - -SODIUM_EXPORT -int crypto_generichash_update(crypto_generichash_state *state, - const unsigned char *in, - unsigned long long inlen) - __attribute__ ((nonnull(1))); - -SODIUM_EXPORT -int crypto_generichash_final(crypto_generichash_state *state, - unsigned char *out, const size_t outlen) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -void crypto_generichash_keygen(unsigned char k[crypto_generichash_KEYBYTES]) - __attribute__ ((nonnull)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_generichash_blake2b.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_generichash_blake2b.h deleted file mode 100644 index ae3b52f7..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_generichash_blake2b.h +++ /dev/null @@ -1,122 +0,0 @@ -#ifndef crypto_generichash_blake2b_H -#define crypto_generichash_blake2b_H - -#include -#include -#include - -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -#ifdef __IBMC__ -# pragma pack(1) -#elif defined(__SUNPRO_C) || defined(__SUNPRO_CC) -# pragma pack(1) -#else -# pragma pack(push, 1) -#endif - -typedef struct CRYPTO_ALIGN(64) crypto_generichash_blake2b_state { - unsigned char opaque[384]; -} crypto_generichash_blake2b_state; - -#ifdef __IBMC__ -# pragma pack(pop) -#elif defined(__SUNPRO_C) || defined(__SUNPRO_CC) -# pragma pack() -#else -# pragma pack(pop) -#endif - -#define crypto_generichash_blake2b_BYTES_MIN 16U -SODIUM_EXPORT -size_t crypto_generichash_blake2b_bytes_min(void); - -#define crypto_generichash_blake2b_BYTES_MAX 64U -SODIUM_EXPORT -size_t crypto_generichash_blake2b_bytes_max(void); - -#define crypto_generichash_blake2b_BYTES 32U -SODIUM_EXPORT -size_t crypto_generichash_blake2b_bytes(void); - -#define crypto_generichash_blake2b_KEYBYTES_MIN 16U -SODIUM_EXPORT -size_t crypto_generichash_blake2b_keybytes_min(void); - -#define crypto_generichash_blake2b_KEYBYTES_MAX 64U -SODIUM_EXPORT -size_t crypto_generichash_blake2b_keybytes_max(void); - -#define crypto_generichash_blake2b_KEYBYTES 32U -SODIUM_EXPORT -size_t crypto_generichash_blake2b_keybytes(void); - -#define crypto_generichash_blake2b_SALTBYTES 16U -SODIUM_EXPORT -size_t crypto_generichash_blake2b_saltbytes(void); - -#define crypto_generichash_blake2b_PERSONALBYTES 16U -SODIUM_EXPORT -size_t crypto_generichash_blake2b_personalbytes(void); - -SODIUM_EXPORT -size_t crypto_generichash_blake2b_statebytes(void); - -SODIUM_EXPORT -int crypto_generichash_blake2b(unsigned char *out, size_t outlen, - const unsigned char *in, - unsigned long long inlen, - const unsigned char *key, size_t keylen) - __attribute__ ((nonnull(1))); - -SODIUM_EXPORT -int crypto_generichash_blake2b_salt_personal(unsigned char *out, size_t outlen, - const unsigned char *in, - unsigned long long inlen, - const unsigned char *key, - size_t keylen, - const unsigned char *salt, - const unsigned char *personal) - __attribute__ ((nonnull(1))); - -SODIUM_EXPORT -int crypto_generichash_blake2b_init(crypto_generichash_blake2b_state *state, - const unsigned char *key, - const size_t keylen, const size_t outlen) - __attribute__ ((nonnull(1))); - -SODIUM_EXPORT -int crypto_generichash_blake2b_init_salt_personal(crypto_generichash_blake2b_state *state, - const unsigned char *key, - const size_t keylen, const size_t outlen, - const unsigned char *salt, - const unsigned char *personal) - __attribute__ ((nonnull(1))); - -SODIUM_EXPORT -int crypto_generichash_blake2b_update(crypto_generichash_blake2b_state *state, - const unsigned char *in, - unsigned long long inlen) - __attribute__ ((nonnull(1))); - -SODIUM_EXPORT -int crypto_generichash_blake2b_final(crypto_generichash_blake2b_state *state, - unsigned char *out, - const size_t outlen) __attribute__ ((nonnull)); - -SODIUM_EXPORT -void crypto_generichash_blake2b_keygen(unsigned char k[crypto_generichash_blake2b_KEYBYTES]) - __attribute__ ((nonnull)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_hash.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_hash.h deleted file mode 100644 index 767d5480..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_hash.h +++ /dev/null @@ -1,40 +0,0 @@ -#ifndef crypto_hash_H -#define crypto_hash_H - -/* - * WARNING: Unless you absolutely need to use SHA512 for interoperability, - * purposes, you might want to consider crypto_generichash() instead. - * Unlike SHA512, crypto_generichash() is not vulnerable to length - * extension attacks. - */ - -#include - -#include "crypto_hash_sha512.h" -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -#define crypto_hash_BYTES crypto_hash_sha512_BYTES -SODIUM_EXPORT -size_t crypto_hash_bytes(void); - -SODIUM_EXPORT -int crypto_hash(unsigned char *out, const unsigned char *in, - unsigned long long inlen) __attribute__ ((nonnull(1))); - -#define crypto_hash_PRIMITIVE "sha512" -SODIUM_EXPORT -const char *crypto_hash_primitive(void) - __attribute__ ((warn_unused_result)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_hash_sha256.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_hash_sha256.h deleted file mode 100644 index c47982af..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_hash_sha256.h +++ /dev/null @@ -1,60 +0,0 @@ -#ifndef crypto_hash_sha256_H -#define crypto_hash_sha256_H - -/* - * WARNING: Unless you absolutely need to use SHA256 for interoperability, - * purposes, you might want to consider crypto_generichash() instead. - * Unlike SHA256, crypto_generichash() is not vulnerable to length - * extension attacks. - */ - -#include -#include -#include - -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -typedef struct crypto_hash_sha256_state { - uint32_t state[8]; - uint64_t count; - uint8_t buf[64]; -} crypto_hash_sha256_state; - -SODIUM_EXPORT -size_t crypto_hash_sha256_statebytes(void); - -#define crypto_hash_sha256_BYTES 32U -SODIUM_EXPORT -size_t crypto_hash_sha256_bytes(void); - -SODIUM_EXPORT -int crypto_hash_sha256(unsigned char *out, const unsigned char *in, - unsigned long long inlen) __attribute__ ((nonnull(1))); - -SODIUM_EXPORT -int crypto_hash_sha256_init(crypto_hash_sha256_state *state) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_hash_sha256_update(crypto_hash_sha256_state *state, - const unsigned char *in, - unsigned long long inlen) - __attribute__ ((nonnull(1))); - -SODIUM_EXPORT -int crypto_hash_sha256_final(crypto_hash_sha256_state *state, - unsigned char *out) - __attribute__ ((nonnull)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_hash_sha512.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_hash_sha512.h deleted file mode 100644 index 5b690fb2..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_hash_sha512.h +++ /dev/null @@ -1,60 +0,0 @@ -#ifndef crypto_hash_sha512_H -#define crypto_hash_sha512_H - -/* - * WARNING: Unless you absolutely need to use SHA512 for interoperability, - * purposes, you might want to consider crypto_generichash() instead. - * Unlike SHA512, crypto_generichash() is not vulnerable to length - * extension attacks. - */ - -#include -#include -#include - -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -typedef struct crypto_hash_sha512_state { - uint64_t state[8]; - uint64_t count[2]; - uint8_t buf[128]; -} crypto_hash_sha512_state; - -SODIUM_EXPORT -size_t crypto_hash_sha512_statebytes(void); - -#define crypto_hash_sha512_BYTES 64U -SODIUM_EXPORT -size_t crypto_hash_sha512_bytes(void); - -SODIUM_EXPORT -int crypto_hash_sha512(unsigned char *out, const unsigned char *in, - unsigned long long inlen) __attribute__ ((nonnull(1))); - -SODIUM_EXPORT -int crypto_hash_sha512_init(crypto_hash_sha512_state *state) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_hash_sha512_update(crypto_hash_sha512_state *state, - const unsigned char *in, - unsigned long long inlen) - __attribute__ ((nonnull(1))); - -SODIUM_EXPORT -int crypto_hash_sha512_final(crypto_hash_sha512_state *state, - unsigned char *out) - __attribute__ ((nonnull)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_kdf.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_kdf.h deleted file mode 100644 index ac2fc618..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_kdf.h +++ /dev/null @@ -1,53 +0,0 @@ -#ifndef crypto_kdf_H -#define crypto_kdf_H - -#include -#include - -#include "crypto_kdf_blake2b.h" -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -#define crypto_kdf_BYTES_MIN crypto_kdf_blake2b_BYTES_MIN -SODIUM_EXPORT -size_t crypto_kdf_bytes_min(void); - -#define crypto_kdf_BYTES_MAX crypto_kdf_blake2b_BYTES_MAX -SODIUM_EXPORT -size_t crypto_kdf_bytes_max(void); - -#define crypto_kdf_CONTEXTBYTES crypto_kdf_blake2b_CONTEXTBYTES -SODIUM_EXPORT -size_t crypto_kdf_contextbytes(void); - -#define crypto_kdf_KEYBYTES crypto_kdf_blake2b_KEYBYTES -SODIUM_EXPORT -size_t crypto_kdf_keybytes(void); - -#define crypto_kdf_PRIMITIVE "blake2b" -SODIUM_EXPORT -const char *crypto_kdf_primitive(void) - __attribute__ ((warn_unused_result)); - -SODIUM_EXPORT -int crypto_kdf_derive_from_key(unsigned char *subkey, size_t subkey_len, - uint64_t subkey_id, - const char ctx[crypto_kdf_CONTEXTBYTES], - const unsigned char key[crypto_kdf_KEYBYTES]) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -void crypto_kdf_keygen(unsigned char k[crypto_kdf_KEYBYTES]) - __attribute__ ((nonnull)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_kdf_blake2b.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_kdf_blake2b.h deleted file mode 100644 index 489c7c20..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_kdf_blake2b.h +++ /dev/null @@ -1,44 +0,0 @@ -#ifndef crypto_kdf_blake2b_H -#define crypto_kdf_blake2b_H - -#include -#include -#include - -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -#define crypto_kdf_blake2b_BYTES_MIN 16 -SODIUM_EXPORT -size_t crypto_kdf_blake2b_bytes_min(void); - -#define crypto_kdf_blake2b_BYTES_MAX 64 -SODIUM_EXPORT -size_t crypto_kdf_blake2b_bytes_max(void); - -#define crypto_kdf_blake2b_CONTEXTBYTES 8 -SODIUM_EXPORT -size_t crypto_kdf_blake2b_contextbytes(void); - -#define crypto_kdf_blake2b_KEYBYTES 32 -SODIUM_EXPORT -size_t crypto_kdf_blake2b_keybytes(void); - -SODIUM_EXPORT -int crypto_kdf_blake2b_derive_from_key(unsigned char *subkey, size_t subkey_len, - uint64_t subkey_id, - const char ctx[crypto_kdf_blake2b_CONTEXTBYTES], - const unsigned char key[crypto_kdf_blake2b_KEYBYTES]) - __attribute__ ((nonnull)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_kdf_hkdf_sha256.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_kdf_hkdf_sha256.h deleted file mode 100644 index 899a6316..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_kdf_hkdf_sha256.h +++ /dev/null @@ -1,48 +0,0 @@ -#ifndef crypto_kdf_hkdf_sha256_H -#define crypto_kdf_hkdf_sha256_H - -#include -#include -#include - -#include "crypto_kdf.h" -#include "crypto_auth_hmacsha256.h" -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -#define crypto_kdf_hkdf_sha256_KEYBYTES crypto_auth_hmacsha256_BYTES -SODIUM_EXPORT -size_t crypto_kdf_hkdf_sha256_keybytes(void); - -#define crypto_kdf_hkdf_sha256_BYTES_MIN 0U -SODIUM_EXPORT -size_t crypto_kdf_hkdf_sha256_bytes_min(void); - -#define crypto_kdf_hkdf_sha256_BYTES_MAX (0xff * crypto_auth_hmacsha256_BYTES) -SODIUM_EXPORT -size_t crypto_kdf_hkdf_sha256_bytes_max(void); - -SODIUM_EXPORT -int crypto_kdf_hkdf_sha256_extract(unsigned char prk[crypto_kdf_hkdf_sha256_KEYBYTES], - const unsigned char *salt, size_t salt_len, - const unsigned char *ikm, size_t ikm_len); - -SODIUM_EXPORT -void crypto_kdf_hkdf_sha256_keygen(unsigned char prk[crypto_kdf_hkdf_sha256_KEYBYTES]); - -SODIUM_EXPORT -int crypto_kdf_hkdf_sha256_expand(unsigned char *out, size_t out_len, - const char *ctx, size_t ctx_len, - const unsigned char prk[crypto_kdf_hkdf_sha256_KEYBYTES]); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_kdf_hkdf_sha512.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_kdf_hkdf_sha512.h deleted file mode 100644 index 3fa6868c..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_kdf_hkdf_sha512.h +++ /dev/null @@ -1,51 +0,0 @@ -#ifndef crypto_kdf_hkdf_sha512_H -#define crypto_kdf_hkdf_sha512_H - -#include -#include -#include - -#include "crypto_kdf.h" -#include "crypto_auth_hmacsha512.h" -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -#define crypto_kdf_hkdf_sha512_KEYBYTES crypto_auth_hmacsha512_BYTES -SODIUM_EXPORT -size_t crypto_kdf_hkdf_sha512_keybytes(void); - -#define crypto_kdf_hkdf_sha512_BYTES_MIN 0U -SODIUM_EXPORT -size_t crypto_kdf_hkdf_sha512_bytes_min(void); - -#define crypto_kdf_hkdf_sha512_BYTES_MAX (0xff * crypto_auth_hmacsha512_BYTES) -SODIUM_EXPORT -size_t crypto_kdf_hkdf_sha512_bytes_max(void); - -SODIUM_EXPORT -int crypto_kdf_hkdf_sha512_extract(unsigned char prk[crypto_kdf_hkdf_sha512_KEYBYTES], - const unsigned char *salt, size_t salt_len, - const unsigned char *ikm, size_t ikm_len) - __attribute__ ((nonnull(1))); - -SODIUM_EXPORT -void crypto_kdf_hkdf_sha512_keygen(unsigned char prk[crypto_kdf_hkdf_sha512_KEYBYTES]) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_kdf_hkdf_sha512_expand(unsigned char *out, size_t out_len, - const char *ctx, size_t ctx_len, - const unsigned char prk[crypto_kdf_hkdf_sha512_KEYBYTES]) - __attribute__ ((nonnull(1))); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_kx.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_kx.h deleted file mode 100644 index 347132c3..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_kx.h +++ /dev/null @@ -1,66 +0,0 @@ -#ifndef crypto_kx_H -#define crypto_kx_H - -#include - -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -#define crypto_kx_PUBLICKEYBYTES 32 -SODIUM_EXPORT -size_t crypto_kx_publickeybytes(void); - -#define crypto_kx_SECRETKEYBYTES 32 -SODIUM_EXPORT -size_t crypto_kx_secretkeybytes(void); - -#define crypto_kx_SEEDBYTES 32 -SODIUM_EXPORT -size_t crypto_kx_seedbytes(void); - -#define crypto_kx_SESSIONKEYBYTES 32 -SODIUM_EXPORT -size_t crypto_kx_sessionkeybytes(void); - -#define crypto_kx_PRIMITIVE "x25519blake2b" -SODIUM_EXPORT -const char *crypto_kx_primitive(void); - -SODIUM_EXPORT -int crypto_kx_seed_keypair(unsigned char pk[crypto_kx_PUBLICKEYBYTES], - unsigned char sk[crypto_kx_SECRETKEYBYTES], - const unsigned char seed[crypto_kx_SEEDBYTES]) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_kx_keypair(unsigned char pk[crypto_kx_PUBLICKEYBYTES], - unsigned char sk[crypto_kx_SECRETKEYBYTES]) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_kx_client_session_keys(unsigned char rx[crypto_kx_SESSIONKEYBYTES], - unsigned char tx[crypto_kx_SESSIONKEYBYTES], - const unsigned char client_pk[crypto_kx_PUBLICKEYBYTES], - const unsigned char client_sk[crypto_kx_SECRETKEYBYTES], - const unsigned char server_pk[crypto_kx_PUBLICKEYBYTES]) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(3, 4, 5))); - -SODIUM_EXPORT -int crypto_kx_server_session_keys(unsigned char rx[crypto_kx_SESSIONKEYBYTES], - unsigned char tx[crypto_kx_SESSIONKEYBYTES], - const unsigned char server_pk[crypto_kx_PUBLICKEYBYTES], - const unsigned char server_sk[crypto_kx_SECRETKEYBYTES], - const unsigned char client_pk[crypto_kx_PUBLICKEYBYTES]) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(3, 4, 5))); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_onetimeauth.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_onetimeauth.h deleted file mode 100644 index 7cd7b070..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_onetimeauth.h +++ /dev/null @@ -1,65 +0,0 @@ -#ifndef crypto_onetimeauth_H -#define crypto_onetimeauth_H - -#include - -#include "crypto_onetimeauth_poly1305.h" -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -typedef crypto_onetimeauth_poly1305_state crypto_onetimeauth_state; - -SODIUM_EXPORT -size_t crypto_onetimeauth_statebytes(void); - -#define crypto_onetimeauth_BYTES crypto_onetimeauth_poly1305_BYTES -SODIUM_EXPORT -size_t crypto_onetimeauth_bytes(void); - -#define crypto_onetimeauth_KEYBYTES crypto_onetimeauth_poly1305_KEYBYTES -SODIUM_EXPORT -size_t crypto_onetimeauth_keybytes(void); - -#define crypto_onetimeauth_PRIMITIVE "poly1305" -SODIUM_EXPORT -const char *crypto_onetimeauth_primitive(void); - -SODIUM_EXPORT -int crypto_onetimeauth(unsigned char *out, const unsigned char *in, - unsigned long long inlen, const unsigned char *k) - __attribute__ ((nonnull(1, 4))); - -SODIUM_EXPORT -int crypto_onetimeauth_verify(const unsigned char *h, const unsigned char *in, - unsigned long long inlen, const unsigned char *k) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(1, 4))); - -SODIUM_EXPORT -int crypto_onetimeauth_init(crypto_onetimeauth_state *state, - const unsigned char *key) __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_onetimeauth_update(crypto_onetimeauth_state *state, - const unsigned char *in, - unsigned long long inlen) - __attribute__ ((nonnull(1))); - -SODIUM_EXPORT -int crypto_onetimeauth_final(crypto_onetimeauth_state *state, - unsigned char *out) __attribute__ ((nonnull)); - -SODIUM_EXPORT -void crypto_onetimeauth_keygen(unsigned char k[crypto_onetimeauth_KEYBYTES]) - __attribute__ ((nonnull)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_onetimeauth_poly1305.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_onetimeauth_poly1305.h deleted file mode 100644 index f3e34d86..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_onetimeauth_poly1305.h +++ /dev/null @@ -1,72 +0,0 @@ -#ifndef crypto_onetimeauth_poly1305_H -#define crypto_onetimeauth_poly1305_H - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -#include -#include -#include - -#include - -#include "export.h" - -typedef struct CRYPTO_ALIGN(16) crypto_onetimeauth_poly1305_state { - unsigned char opaque[256]; -} crypto_onetimeauth_poly1305_state; - -SODIUM_EXPORT -size_t crypto_onetimeauth_poly1305_statebytes(void); - -#define crypto_onetimeauth_poly1305_BYTES 16U -SODIUM_EXPORT -size_t crypto_onetimeauth_poly1305_bytes(void); - -#define crypto_onetimeauth_poly1305_KEYBYTES 32U -SODIUM_EXPORT -size_t crypto_onetimeauth_poly1305_keybytes(void); - -SODIUM_EXPORT -int crypto_onetimeauth_poly1305(unsigned char *out, - const unsigned char *in, - unsigned long long inlen, - const unsigned char *k) - __attribute__ ((nonnull(1, 4))); - -SODIUM_EXPORT -int crypto_onetimeauth_poly1305_verify(const unsigned char *h, - const unsigned char *in, - unsigned long long inlen, - const unsigned char *k) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(1, 4))); - -SODIUM_EXPORT -int crypto_onetimeauth_poly1305_init(crypto_onetimeauth_poly1305_state *state, - const unsigned char *key) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_onetimeauth_poly1305_update(crypto_onetimeauth_poly1305_state *state, - const unsigned char *in, - unsigned long long inlen) - __attribute__ ((nonnull(1))); - -SODIUM_EXPORT -int crypto_onetimeauth_poly1305_final(crypto_onetimeauth_poly1305_state *state, - unsigned char *out) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -void crypto_onetimeauth_poly1305_keygen(unsigned char k[crypto_onetimeauth_poly1305_KEYBYTES]) - __attribute__ ((nonnull)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_pwhash.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_pwhash.h deleted file mode 100644 index 307265d3..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_pwhash.h +++ /dev/null @@ -1,147 +0,0 @@ -#ifndef crypto_pwhash_H -#define crypto_pwhash_H - -#include - -#include "crypto_pwhash_argon2i.h" -#include "crypto_pwhash_argon2id.h" -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -#define crypto_pwhash_ALG_ARGON2I13 crypto_pwhash_argon2i_ALG_ARGON2I13 -SODIUM_EXPORT -int crypto_pwhash_alg_argon2i13(void); - -#define crypto_pwhash_ALG_ARGON2ID13 crypto_pwhash_argon2id_ALG_ARGON2ID13 -SODIUM_EXPORT -int crypto_pwhash_alg_argon2id13(void); - -#define crypto_pwhash_ALG_DEFAULT crypto_pwhash_ALG_ARGON2ID13 -SODIUM_EXPORT -int crypto_pwhash_alg_default(void); - -#define crypto_pwhash_BYTES_MIN crypto_pwhash_argon2id_BYTES_MIN -SODIUM_EXPORT -size_t crypto_pwhash_bytes_min(void); - -#define crypto_pwhash_BYTES_MAX crypto_pwhash_argon2id_BYTES_MAX -SODIUM_EXPORT -size_t crypto_pwhash_bytes_max(void); - -#define crypto_pwhash_PASSWD_MIN crypto_pwhash_argon2id_PASSWD_MIN -SODIUM_EXPORT -size_t crypto_pwhash_passwd_min(void); - -#define crypto_pwhash_PASSWD_MAX crypto_pwhash_argon2id_PASSWD_MAX -SODIUM_EXPORT -size_t crypto_pwhash_passwd_max(void); - -#define crypto_pwhash_SALTBYTES crypto_pwhash_argon2id_SALTBYTES -SODIUM_EXPORT -size_t crypto_pwhash_saltbytes(void); - -#define crypto_pwhash_STRBYTES crypto_pwhash_argon2id_STRBYTES -SODIUM_EXPORT -size_t crypto_pwhash_strbytes(void); - -#define crypto_pwhash_STRPREFIX crypto_pwhash_argon2id_STRPREFIX -SODIUM_EXPORT -const char *crypto_pwhash_strprefix(void); - -#define crypto_pwhash_OPSLIMIT_MIN crypto_pwhash_argon2id_OPSLIMIT_MIN -SODIUM_EXPORT -unsigned long long crypto_pwhash_opslimit_min(void); - -#define crypto_pwhash_OPSLIMIT_MAX crypto_pwhash_argon2id_OPSLIMIT_MAX -SODIUM_EXPORT -unsigned long long crypto_pwhash_opslimit_max(void); - -#define crypto_pwhash_MEMLIMIT_MIN crypto_pwhash_argon2id_MEMLIMIT_MIN -SODIUM_EXPORT -size_t crypto_pwhash_memlimit_min(void); - -#define crypto_pwhash_MEMLIMIT_MAX crypto_pwhash_argon2id_MEMLIMIT_MAX -SODIUM_EXPORT -size_t crypto_pwhash_memlimit_max(void); - -#define crypto_pwhash_OPSLIMIT_INTERACTIVE crypto_pwhash_argon2id_OPSLIMIT_INTERACTIVE -SODIUM_EXPORT -unsigned long long crypto_pwhash_opslimit_interactive(void); - -#define crypto_pwhash_MEMLIMIT_INTERACTIVE crypto_pwhash_argon2id_MEMLIMIT_INTERACTIVE -SODIUM_EXPORT -size_t crypto_pwhash_memlimit_interactive(void); - -#define crypto_pwhash_OPSLIMIT_MODERATE crypto_pwhash_argon2id_OPSLIMIT_MODERATE -SODIUM_EXPORT -unsigned long long crypto_pwhash_opslimit_moderate(void); - -#define crypto_pwhash_MEMLIMIT_MODERATE crypto_pwhash_argon2id_MEMLIMIT_MODERATE -SODIUM_EXPORT -size_t crypto_pwhash_memlimit_moderate(void); - -#define crypto_pwhash_OPSLIMIT_SENSITIVE crypto_pwhash_argon2id_OPSLIMIT_SENSITIVE -SODIUM_EXPORT -unsigned long long crypto_pwhash_opslimit_sensitive(void); - -#define crypto_pwhash_MEMLIMIT_SENSITIVE crypto_pwhash_argon2id_MEMLIMIT_SENSITIVE -SODIUM_EXPORT -size_t crypto_pwhash_memlimit_sensitive(void); - -/* - * With this function, do not forget to store all parameters, including the - * algorithm identifier in order to produce deterministic output. - * The crypto_pwhash_* definitions, including crypto_pwhash_ALG_DEFAULT, - * may change. - */ -SODIUM_EXPORT -int crypto_pwhash(unsigned char * const out, unsigned long long outlen, - const char * const passwd, unsigned long long passwdlen, - const unsigned char * const salt, - unsigned long long opslimit, size_t memlimit, int alg) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull)); - -/* - * The output string already includes all the required parameters, including - * the algorithm identifier. The string is all that has to be stored in - * order to verify a password. - */ -SODIUM_EXPORT -int crypto_pwhash_str(char out[crypto_pwhash_STRBYTES], - const char * const passwd, unsigned long long passwdlen, - unsigned long long opslimit, size_t memlimit) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_pwhash_str_alg(char out[crypto_pwhash_STRBYTES], - const char * const passwd, unsigned long long passwdlen, - unsigned long long opslimit, size_t memlimit, int alg) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_pwhash_str_verify(const char *str, - const char * const passwd, - unsigned long long passwdlen) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_pwhash_str_needs_rehash(const char *str, - unsigned long long opslimit, size_t memlimit) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull)); - -#define crypto_pwhash_PRIMITIVE "argon2i" -SODIUM_EXPORT -const char *crypto_pwhash_primitive(void) - __attribute__ ((warn_unused_result)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_pwhash_argon2i.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_pwhash_argon2i.h deleted file mode 100644 index 91156ba0..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_pwhash_argon2i.h +++ /dev/null @@ -1,122 +0,0 @@ -#ifndef crypto_pwhash_argon2i_H -#define crypto_pwhash_argon2i_H - -#include -#include -#include - -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -#define crypto_pwhash_argon2i_ALG_ARGON2I13 1 -SODIUM_EXPORT -int crypto_pwhash_argon2i_alg_argon2i13(void); - -#define crypto_pwhash_argon2i_BYTES_MIN 16U -SODIUM_EXPORT -size_t crypto_pwhash_argon2i_bytes_min(void); - -#define crypto_pwhash_argon2i_BYTES_MAX SODIUM_MIN(SODIUM_SIZE_MAX, 4294967295U) -SODIUM_EXPORT -size_t crypto_pwhash_argon2i_bytes_max(void); - -#define crypto_pwhash_argon2i_PASSWD_MIN 0U -SODIUM_EXPORT -size_t crypto_pwhash_argon2i_passwd_min(void); - -#define crypto_pwhash_argon2i_PASSWD_MAX 4294967295U -SODIUM_EXPORT -size_t crypto_pwhash_argon2i_passwd_max(void); - -#define crypto_pwhash_argon2i_SALTBYTES 16U -SODIUM_EXPORT -size_t crypto_pwhash_argon2i_saltbytes(void); - -#define crypto_pwhash_argon2i_STRBYTES 128U -SODIUM_EXPORT -size_t crypto_pwhash_argon2i_strbytes(void); - -#define crypto_pwhash_argon2i_STRPREFIX "$argon2i$" -SODIUM_EXPORT -const char *crypto_pwhash_argon2i_strprefix(void); - -#define crypto_pwhash_argon2i_OPSLIMIT_MIN 3U -SODIUM_EXPORT -unsigned long long crypto_pwhash_argon2i_opslimit_min(void); - -#define crypto_pwhash_argon2i_OPSLIMIT_MAX 4294967295U -SODIUM_EXPORT -unsigned long long crypto_pwhash_argon2i_opslimit_max(void); - -#define crypto_pwhash_argon2i_MEMLIMIT_MIN 8192U -SODIUM_EXPORT -size_t crypto_pwhash_argon2i_memlimit_min(void); - -#define crypto_pwhash_argon2i_MEMLIMIT_MAX \ - ((SIZE_MAX >= 4398046510080U) ? 4398046510080U : (SIZE_MAX >= 2147483648U) ? 2147483648U : 32768U) -SODIUM_EXPORT -size_t crypto_pwhash_argon2i_memlimit_max(void); - -#define crypto_pwhash_argon2i_OPSLIMIT_INTERACTIVE 4U -SODIUM_EXPORT -unsigned long long crypto_pwhash_argon2i_opslimit_interactive(void); - -#define crypto_pwhash_argon2i_MEMLIMIT_INTERACTIVE 33554432U -SODIUM_EXPORT -size_t crypto_pwhash_argon2i_memlimit_interactive(void); - -#define crypto_pwhash_argon2i_OPSLIMIT_MODERATE 6U -SODIUM_EXPORT -unsigned long long crypto_pwhash_argon2i_opslimit_moderate(void); - -#define crypto_pwhash_argon2i_MEMLIMIT_MODERATE 134217728U -SODIUM_EXPORT -size_t crypto_pwhash_argon2i_memlimit_moderate(void); - -#define crypto_pwhash_argon2i_OPSLIMIT_SENSITIVE 8U -SODIUM_EXPORT -unsigned long long crypto_pwhash_argon2i_opslimit_sensitive(void); - -#define crypto_pwhash_argon2i_MEMLIMIT_SENSITIVE 536870912U -SODIUM_EXPORT -size_t crypto_pwhash_argon2i_memlimit_sensitive(void); - -SODIUM_EXPORT -int crypto_pwhash_argon2i(unsigned char * const out, - unsigned long long outlen, - const char * const passwd, - unsigned long long passwdlen, - const unsigned char * const salt, - unsigned long long opslimit, size_t memlimit, - int alg) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_pwhash_argon2i_str(char out[crypto_pwhash_argon2i_STRBYTES], - const char * const passwd, - unsigned long long passwdlen, - unsigned long long opslimit, size_t memlimit) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_pwhash_argon2i_str_verify(const char * str, - const char * const passwd, - unsigned long long passwdlen) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_pwhash_argon2i_str_needs_rehash(const char * str, - unsigned long long opslimit, size_t memlimit) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_pwhash_argon2id.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_pwhash_argon2id.h deleted file mode 100644 index e6f72a92..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_pwhash_argon2id.h +++ /dev/null @@ -1,122 +0,0 @@ -#ifndef crypto_pwhash_argon2id_H -#define crypto_pwhash_argon2id_H - -#include -#include -#include - -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -#define crypto_pwhash_argon2id_ALG_ARGON2ID13 2 -SODIUM_EXPORT -int crypto_pwhash_argon2id_alg_argon2id13(void); - -#define crypto_pwhash_argon2id_BYTES_MIN 16U -SODIUM_EXPORT -size_t crypto_pwhash_argon2id_bytes_min(void); - -#define crypto_pwhash_argon2id_BYTES_MAX SODIUM_MIN(SODIUM_SIZE_MAX, 4294967295U) -SODIUM_EXPORT -size_t crypto_pwhash_argon2id_bytes_max(void); - -#define crypto_pwhash_argon2id_PASSWD_MIN 0U -SODIUM_EXPORT -size_t crypto_pwhash_argon2id_passwd_min(void); - -#define crypto_pwhash_argon2id_PASSWD_MAX 4294967295U -SODIUM_EXPORT -size_t crypto_pwhash_argon2id_passwd_max(void); - -#define crypto_pwhash_argon2id_SALTBYTES 16U -SODIUM_EXPORT -size_t crypto_pwhash_argon2id_saltbytes(void); - -#define crypto_pwhash_argon2id_STRBYTES 128U -SODIUM_EXPORT -size_t crypto_pwhash_argon2id_strbytes(void); - -#define crypto_pwhash_argon2id_STRPREFIX "$argon2id$" -SODIUM_EXPORT -const char *crypto_pwhash_argon2id_strprefix(void); - -#define crypto_pwhash_argon2id_OPSLIMIT_MIN 1U -SODIUM_EXPORT -unsigned long long crypto_pwhash_argon2id_opslimit_min(void); - -#define crypto_pwhash_argon2id_OPSLIMIT_MAX 4294967295U -SODIUM_EXPORT -unsigned long long crypto_pwhash_argon2id_opslimit_max(void); - -#define crypto_pwhash_argon2id_MEMLIMIT_MIN 8192U -SODIUM_EXPORT -size_t crypto_pwhash_argon2id_memlimit_min(void); - -#define crypto_pwhash_argon2id_MEMLIMIT_MAX \ - ((SIZE_MAX >= 4398046510080U) ? 4398046510080U : (SIZE_MAX >= 2147483648U) ? 2147483648U : 32768U) -SODIUM_EXPORT -size_t crypto_pwhash_argon2id_memlimit_max(void); - -#define crypto_pwhash_argon2id_OPSLIMIT_INTERACTIVE 2U -SODIUM_EXPORT -unsigned long long crypto_pwhash_argon2id_opslimit_interactive(void); - -#define crypto_pwhash_argon2id_MEMLIMIT_INTERACTIVE 67108864U -SODIUM_EXPORT -size_t crypto_pwhash_argon2id_memlimit_interactive(void); - -#define crypto_pwhash_argon2id_OPSLIMIT_MODERATE 3U -SODIUM_EXPORT -unsigned long long crypto_pwhash_argon2id_opslimit_moderate(void); - -#define crypto_pwhash_argon2id_MEMLIMIT_MODERATE 268435456U -SODIUM_EXPORT -size_t crypto_pwhash_argon2id_memlimit_moderate(void); - -#define crypto_pwhash_argon2id_OPSLIMIT_SENSITIVE 4U -SODIUM_EXPORT -unsigned long long crypto_pwhash_argon2id_opslimit_sensitive(void); - -#define crypto_pwhash_argon2id_MEMLIMIT_SENSITIVE 1073741824U -SODIUM_EXPORT -size_t crypto_pwhash_argon2id_memlimit_sensitive(void); - -SODIUM_EXPORT -int crypto_pwhash_argon2id(unsigned char * const out, - unsigned long long outlen, - const char * const passwd, - unsigned long long passwdlen, - const unsigned char * const salt, - unsigned long long opslimit, size_t memlimit, - int alg) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_pwhash_argon2id_str(char out[crypto_pwhash_argon2id_STRBYTES], - const char * const passwd, - unsigned long long passwdlen, - unsigned long long opslimit, size_t memlimit) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_pwhash_argon2id_str_verify(const char * str, - const char * const passwd, - unsigned long long passwdlen) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_pwhash_argon2id_str_needs_rehash(const char * str, - unsigned long long opslimit, size_t memlimit) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_pwhash_scryptsalsa208sha256.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_pwhash_scryptsalsa208sha256.h deleted file mode 100644 index 1fd3692f..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_pwhash_scryptsalsa208sha256.h +++ /dev/null @@ -1,120 +0,0 @@ -#ifndef crypto_pwhash_scryptsalsa208sha256_H -#define crypto_pwhash_scryptsalsa208sha256_H - -#include -#include -#include - -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -#define crypto_pwhash_scryptsalsa208sha256_BYTES_MIN 16U -SODIUM_EXPORT -size_t crypto_pwhash_scryptsalsa208sha256_bytes_min(void); - -#define crypto_pwhash_scryptsalsa208sha256_BYTES_MAX \ - SODIUM_MIN(SODIUM_SIZE_MAX, 0x1fffffffe0ULL) -SODIUM_EXPORT -size_t crypto_pwhash_scryptsalsa208sha256_bytes_max(void); - -#define crypto_pwhash_scryptsalsa208sha256_PASSWD_MIN 0U -SODIUM_EXPORT -size_t crypto_pwhash_scryptsalsa208sha256_passwd_min(void); - -#define crypto_pwhash_scryptsalsa208sha256_PASSWD_MAX SODIUM_SIZE_MAX -SODIUM_EXPORT -size_t crypto_pwhash_scryptsalsa208sha256_passwd_max(void); - -#define crypto_pwhash_scryptsalsa208sha256_SALTBYTES 32U -SODIUM_EXPORT -size_t crypto_pwhash_scryptsalsa208sha256_saltbytes(void); - -#define crypto_pwhash_scryptsalsa208sha256_STRBYTES 102U -SODIUM_EXPORT -size_t crypto_pwhash_scryptsalsa208sha256_strbytes(void); - -#define crypto_pwhash_scryptsalsa208sha256_STRPREFIX "$7$" -SODIUM_EXPORT -const char *crypto_pwhash_scryptsalsa208sha256_strprefix(void); - -#define crypto_pwhash_scryptsalsa208sha256_OPSLIMIT_MIN 32768U -SODIUM_EXPORT -unsigned long long crypto_pwhash_scryptsalsa208sha256_opslimit_min(void); - -#define crypto_pwhash_scryptsalsa208sha256_OPSLIMIT_MAX 4294967295U -SODIUM_EXPORT -unsigned long long crypto_pwhash_scryptsalsa208sha256_opslimit_max(void); - -#define crypto_pwhash_scryptsalsa208sha256_MEMLIMIT_MIN 16777216U -SODIUM_EXPORT -size_t crypto_pwhash_scryptsalsa208sha256_memlimit_min(void); - -#define crypto_pwhash_scryptsalsa208sha256_MEMLIMIT_MAX \ - SODIUM_MIN(SIZE_MAX, 68719476736ULL) -SODIUM_EXPORT -size_t crypto_pwhash_scryptsalsa208sha256_memlimit_max(void); - -#define crypto_pwhash_scryptsalsa208sha256_OPSLIMIT_INTERACTIVE 524288U -SODIUM_EXPORT -unsigned long long crypto_pwhash_scryptsalsa208sha256_opslimit_interactive(void); - -#define crypto_pwhash_scryptsalsa208sha256_MEMLIMIT_INTERACTIVE 16777216U -SODIUM_EXPORT -size_t crypto_pwhash_scryptsalsa208sha256_memlimit_interactive(void); - -#define crypto_pwhash_scryptsalsa208sha256_OPSLIMIT_SENSITIVE 33554432U -SODIUM_EXPORT -unsigned long long crypto_pwhash_scryptsalsa208sha256_opslimit_sensitive(void); - -#define crypto_pwhash_scryptsalsa208sha256_MEMLIMIT_SENSITIVE 1073741824U -SODIUM_EXPORT -size_t crypto_pwhash_scryptsalsa208sha256_memlimit_sensitive(void); - -SODIUM_EXPORT -int crypto_pwhash_scryptsalsa208sha256(unsigned char * const out, - unsigned long long outlen, - const char * const passwd, - unsigned long long passwdlen, - const unsigned char * const salt, - unsigned long long opslimit, - size_t memlimit) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_pwhash_scryptsalsa208sha256_str(char out[crypto_pwhash_scryptsalsa208sha256_STRBYTES], - const char * const passwd, - unsigned long long passwdlen, - unsigned long long opslimit, - size_t memlimit) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_pwhash_scryptsalsa208sha256_str_verify(const char * str, - const char * const passwd, - unsigned long long passwdlen) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_pwhash_scryptsalsa208sha256_ll(const uint8_t * passwd, size_t passwdlen, - const uint8_t * salt, size_t saltlen, - uint64_t N, uint32_t r, uint32_t p, - uint8_t * buf, size_t buflen) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_pwhash_scryptsalsa208sha256_str_needs_rehash(const char * str, - unsigned long long opslimit, - size_t memlimit) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_scalarmult.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_scalarmult.h deleted file mode 100644 index 1c685853..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_scalarmult.h +++ /dev/null @@ -1,46 +0,0 @@ -#ifndef crypto_scalarmult_H -#define crypto_scalarmult_H - -#include - -#include "crypto_scalarmult_curve25519.h" -#include "export.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#define crypto_scalarmult_BYTES crypto_scalarmult_curve25519_BYTES -SODIUM_EXPORT -size_t crypto_scalarmult_bytes(void); - -#define crypto_scalarmult_SCALARBYTES crypto_scalarmult_curve25519_SCALARBYTES -SODIUM_EXPORT -size_t crypto_scalarmult_scalarbytes(void); - -#define crypto_scalarmult_PRIMITIVE "curve25519" -SODIUM_EXPORT -const char *crypto_scalarmult_primitive(void); - -SODIUM_EXPORT -int crypto_scalarmult_base(unsigned char *q, const unsigned char *n) - __attribute__ ((nonnull)); - -/* - * NOTE: Do not use the result of this function directly for key exchange. - * - * Hash the result with the public keys in order to compute a shared - * secret key: H(q || client_pk || server_pk) - * - * Or unless this is not an option, use the crypto_kx() API instead. - */ -SODIUM_EXPORT -int crypto_scalarmult(unsigned char *q, const unsigned char *n, - const unsigned char *p) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_scalarmult_curve25519.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_scalarmult_curve25519.h deleted file mode 100644 index 60e9d0c5..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_scalarmult_curve25519.h +++ /dev/null @@ -1,42 +0,0 @@ -#ifndef crypto_scalarmult_curve25519_H -#define crypto_scalarmult_curve25519_H - -#include - -#include "export.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#define crypto_scalarmult_curve25519_BYTES 32U -SODIUM_EXPORT -size_t crypto_scalarmult_curve25519_bytes(void); - -#define crypto_scalarmult_curve25519_SCALARBYTES 32U -SODIUM_EXPORT -size_t crypto_scalarmult_curve25519_scalarbytes(void); - -/* - * NOTE: Do not use the result of this function directly for key exchange. - * - * Hash the result with the public keys in order to compute a shared - * secret key: H(q || client_pk || server_pk) - * - * Or unless this is not an option, use the crypto_kx() API instead. - */ -SODIUM_EXPORT -int crypto_scalarmult_curve25519(unsigned char *q, const unsigned char *n, - const unsigned char *p) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_scalarmult_curve25519_base(unsigned char *q, - const unsigned char *n) - __attribute__ ((nonnull)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_scalarmult_ed25519.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_scalarmult_ed25519.h deleted file mode 100644 index 2dfa4d70..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_scalarmult_ed25519.h +++ /dev/null @@ -1,51 +0,0 @@ - -#ifndef crypto_scalarmult_ed25519_H -#define crypto_scalarmult_ed25519_H - -#include - -#include "export.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#define crypto_scalarmult_ed25519_BYTES 32U -SODIUM_EXPORT -size_t crypto_scalarmult_ed25519_bytes(void); - -#define crypto_scalarmult_ed25519_SCALARBYTES 32U -SODIUM_EXPORT -size_t crypto_scalarmult_ed25519_scalarbytes(void); - -/* - * NOTE: Do not use the result of this function directly for key exchange. - * - * Hash the result with the public keys in order to compute a shared - * secret key: H(q || client_pk || server_pk) - * - * Or unless this is not an option, use the crypto_kx() API instead. - */ -SODIUM_EXPORT -int crypto_scalarmult_ed25519(unsigned char *q, const unsigned char *n, - const unsigned char *p) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_scalarmult_ed25519_noclamp(unsigned char *q, const unsigned char *n, - const unsigned char *p) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_scalarmult_ed25519_base(unsigned char *q, const unsigned char *n) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_scalarmult_ed25519_base_noclamp(unsigned char *q, const unsigned char *n) - __attribute__ ((nonnull)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_scalarmult_ristretto255.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_scalarmult_ristretto255.h deleted file mode 100644 index 40a45cce..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_scalarmult_ristretto255.h +++ /dev/null @@ -1,43 +0,0 @@ - -#ifndef crypto_scalarmult_ristretto255_H -#define crypto_scalarmult_ristretto255_H - -#include - -#include "export.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#define crypto_scalarmult_ristretto255_BYTES 32U -SODIUM_EXPORT -size_t crypto_scalarmult_ristretto255_bytes(void); - -#define crypto_scalarmult_ristretto255_SCALARBYTES 32U -SODIUM_EXPORT -size_t crypto_scalarmult_ristretto255_scalarbytes(void); - -/* - * NOTE: Do not use the result of this function directly for key exchange. - * - * Hash the result with the public keys in order to compute a shared - * secret key: H(q || client_pk || server_pk) - * - * Or unless this is not an option, use the crypto_kx() API instead. - */ -SODIUM_EXPORT -int crypto_scalarmult_ristretto255(unsigned char *q, const unsigned char *n, - const unsigned char *p) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_scalarmult_ristretto255_base(unsigned char *q, - const unsigned char *n) - __attribute__ ((nonnull)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_secretbox.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_secretbox.h deleted file mode 100644 index 68024b45..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_secretbox.h +++ /dev/null @@ -1,94 +0,0 @@ -#ifndef crypto_secretbox_H -#define crypto_secretbox_H - -#include - -#include "crypto_secretbox_xsalsa20poly1305.h" -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -#define crypto_secretbox_KEYBYTES crypto_secretbox_xsalsa20poly1305_KEYBYTES -SODIUM_EXPORT -size_t crypto_secretbox_keybytes(void); - -#define crypto_secretbox_NONCEBYTES crypto_secretbox_xsalsa20poly1305_NONCEBYTES -SODIUM_EXPORT -size_t crypto_secretbox_noncebytes(void); - -#define crypto_secretbox_MACBYTES crypto_secretbox_xsalsa20poly1305_MACBYTES -SODIUM_EXPORT -size_t crypto_secretbox_macbytes(void); - -#define crypto_secretbox_PRIMITIVE "xsalsa20poly1305" -SODIUM_EXPORT -const char *crypto_secretbox_primitive(void); - -#define crypto_secretbox_MESSAGEBYTES_MAX crypto_secretbox_xsalsa20poly1305_MESSAGEBYTES_MAX -SODIUM_EXPORT -size_t crypto_secretbox_messagebytes_max(void); - -SODIUM_EXPORT -int crypto_secretbox_easy(unsigned char *c, const unsigned char *m, - unsigned long long mlen, const unsigned char *n, - const unsigned char *k) __attribute__ ((nonnull(1, 4, 5))); - -SODIUM_EXPORT -int crypto_secretbox_open_easy(unsigned char *m, const unsigned char *c, - unsigned long long clen, const unsigned char *n, - const unsigned char *k) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(2, 4, 5))); - -SODIUM_EXPORT -int crypto_secretbox_detached(unsigned char *c, unsigned char *mac, - const unsigned char *m, - unsigned long long mlen, - const unsigned char *n, - const unsigned char *k) - __attribute__ ((nonnull(1, 2, 5, 6))); - -SODIUM_EXPORT -int crypto_secretbox_open_detached(unsigned char *m, - const unsigned char *c, - const unsigned char *mac, - unsigned long long clen, - const unsigned char *n, - const unsigned char *k) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(2, 3, 5, 6))); - -SODIUM_EXPORT -void crypto_secretbox_keygen(unsigned char k[crypto_secretbox_KEYBYTES]) - __attribute__ ((nonnull)); - -/* -- NaCl compatibility interface ; Requires padding -- */ - -#define crypto_secretbox_ZEROBYTES crypto_secretbox_xsalsa20poly1305_ZEROBYTES -SODIUM_EXPORT -size_t crypto_secretbox_zerobytes(void) __attribute__ ((deprecated)); - -#define crypto_secretbox_BOXZEROBYTES crypto_secretbox_xsalsa20poly1305_BOXZEROBYTES -SODIUM_EXPORT -size_t crypto_secretbox_boxzerobytes(void) __attribute__ ((deprecated)); - -SODIUM_EXPORT -int crypto_secretbox(unsigned char *c, const unsigned char *m, - unsigned long long mlen, const unsigned char *n, - const unsigned char *k) - __attribute__ ((deprecated)) __attribute__ ((nonnull(1, 4, 5))); - -SODIUM_EXPORT -int crypto_secretbox_open(unsigned char *m, const unsigned char *c, - unsigned long long clen, const unsigned char *n, - const unsigned char *k) - __attribute__ ((deprecated)) __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(2, 4, 5))); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_secretbox_xchacha20poly1305.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_secretbox_xchacha20poly1305.h deleted file mode 100644 index 6ec674e3..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_secretbox_xchacha20poly1305.h +++ /dev/null @@ -1,70 +0,0 @@ -#ifndef crypto_secretbox_xchacha20poly1305_H -#define crypto_secretbox_xchacha20poly1305_H - -#include -#include "crypto_stream_xchacha20.h" -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -#define crypto_secretbox_xchacha20poly1305_KEYBYTES 32U -SODIUM_EXPORT -size_t crypto_secretbox_xchacha20poly1305_keybytes(void); - -#define crypto_secretbox_xchacha20poly1305_NONCEBYTES 24U -SODIUM_EXPORT -size_t crypto_secretbox_xchacha20poly1305_noncebytes(void); - -#define crypto_secretbox_xchacha20poly1305_MACBYTES 16U -SODIUM_EXPORT -size_t crypto_secretbox_xchacha20poly1305_macbytes(void); - -#define crypto_secretbox_xchacha20poly1305_MESSAGEBYTES_MAX \ - (crypto_stream_xchacha20_MESSAGEBYTES_MAX - crypto_secretbox_xchacha20poly1305_MACBYTES) -SODIUM_EXPORT -size_t crypto_secretbox_xchacha20poly1305_messagebytes_max(void); - -SODIUM_EXPORT -int crypto_secretbox_xchacha20poly1305_easy(unsigned char *c, - const unsigned char *m, - unsigned long long mlen, - const unsigned char *n, - const unsigned char *k) - __attribute__ ((nonnull(1, 4, 5))); - -SODIUM_EXPORT -int crypto_secretbox_xchacha20poly1305_open_easy(unsigned char *m, - const unsigned char *c, - unsigned long long clen, - const unsigned char *n, - const unsigned char *k) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(2, 4, 5))); - -SODIUM_EXPORT -int crypto_secretbox_xchacha20poly1305_detached(unsigned char *c, - unsigned char *mac, - const unsigned char *m, - unsigned long long mlen, - const unsigned char *n, - const unsigned char *k) - __attribute__ ((nonnull(1, 2, 5, 6))); - -SODIUM_EXPORT -int crypto_secretbox_xchacha20poly1305_open_detached(unsigned char *m, - const unsigned char *c, - const unsigned char *mac, - unsigned long long clen, - const unsigned char *n, - const unsigned char *k) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(2, 3, 5, 6))); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_secretbox_xsalsa20poly1305.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_secretbox_xsalsa20poly1305.h deleted file mode 100644 index 81bff3d6..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_secretbox_xsalsa20poly1305.h +++ /dev/null @@ -1,71 +0,0 @@ -#ifndef crypto_secretbox_xsalsa20poly1305_H -#define crypto_secretbox_xsalsa20poly1305_H - -#include -#include "crypto_stream_xsalsa20.h" -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -#define crypto_secretbox_xsalsa20poly1305_KEYBYTES 32U -SODIUM_EXPORT -size_t crypto_secretbox_xsalsa20poly1305_keybytes(void); - -#define crypto_secretbox_xsalsa20poly1305_NONCEBYTES 24U -SODIUM_EXPORT -size_t crypto_secretbox_xsalsa20poly1305_noncebytes(void); - -#define crypto_secretbox_xsalsa20poly1305_MACBYTES 16U -SODIUM_EXPORT -size_t crypto_secretbox_xsalsa20poly1305_macbytes(void); - -/* Only for the libsodium API - The NaCl compatibility API would require BOXZEROBYTES extra bytes */ -#define crypto_secretbox_xsalsa20poly1305_MESSAGEBYTES_MAX \ - (crypto_stream_xsalsa20_MESSAGEBYTES_MAX - crypto_secretbox_xsalsa20poly1305_MACBYTES) -SODIUM_EXPORT -size_t crypto_secretbox_xsalsa20poly1305_messagebytes_max(void); - -SODIUM_EXPORT -void crypto_secretbox_xsalsa20poly1305_keygen(unsigned char k[crypto_secretbox_xsalsa20poly1305_KEYBYTES]) - __attribute__ ((nonnull)); - -/* -- NaCl compatibility interface ; Requires padding -- */ - -#define crypto_secretbox_xsalsa20poly1305_BOXZEROBYTES 16U -SODIUM_EXPORT -size_t crypto_secretbox_xsalsa20poly1305_boxzerobytes(void) - __attribute__ ((deprecated)); - -#define crypto_secretbox_xsalsa20poly1305_ZEROBYTES \ - (crypto_secretbox_xsalsa20poly1305_BOXZEROBYTES + \ - crypto_secretbox_xsalsa20poly1305_MACBYTES) -SODIUM_EXPORT -size_t crypto_secretbox_xsalsa20poly1305_zerobytes(void) - __attribute__ ((deprecated)); - -SODIUM_EXPORT -int crypto_secretbox_xsalsa20poly1305(unsigned char *c, - const unsigned char *m, - unsigned long long mlen, - const unsigned char *n, - const unsigned char *k) - __attribute__ ((deprecated)) __attribute__ ((nonnull(1, 4, 5))); - -SODIUM_EXPORT -int crypto_secretbox_xsalsa20poly1305_open(unsigned char *m, - const unsigned char *c, - unsigned long long clen, - const unsigned char *n, - const unsigned char *k) - __attribute__ ((deprecated)) __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(2, 4, 5))); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_secretstream_xchacha20poly1305.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_secretstream_xchacha20poly1305.h deleted file mode 100644 index b22e4e93..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_secretstream_xchacha20poly1305.h +++ /dev/null @@ -1,108 +0,0 @@ -#ifndef crypto_secretstream_xchacha20poly1305_H -#define crypto_secretstream_xchacha20poly1305_H - -#include - -#include "crypto_aead_xchacha20poly1305.h" -#include "crypto_stream_chacha20.h" -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -#define crypto_secretstream_xchacha20poly1305_ABYTES \ - (1U + crypto_aead_xchacha20poly1305_ietf_ABYTES) -SODIUM_EXPORT -size_t crypto_secretstream_xchacha20poly1305_abytes(void); - -#define crypto_secretstream_xchacha20poly1305_HEADERBYTES \ - crypto_aead_xchacha20poly1305_ietf_NPUBBYTES -SODIUM_EXPORT -size_t crypto_secretstream_xchacha20poly1305_headerbytes(void); - -#define crypto_secretstream_xchacha20poly1305_KEYBYTES \ - crypto_aead_xchacha20poly1305_ietf_KEYBYTES -SODIUM_EXPORT -size_t crypto_secretstream_xchacha20poly1305_keybytes(void); - -#define crypto_secretstream_xchacha20poly1305_MESSAGEBYTES_MAX \ - SODIUM_MIN(SODIUM_SIZE_MAX - crypto_secretstream_xchacha20poly1305_ABYTES, \ - (64ULL * ((1ULL << 32) - 2ULL))) -SODIUM_EXPORT -size_t crypto_secretstream_xchacha20poly1305_messagebytes_max(void); - -#define crypto_secretstream_xchacha20poly1305_TAG_MESSAGE 0x00 -SODIUM_EXPORT -unsigned char crypto_secretstream_xchacha20poly1305_tag_message(void); - -#define crypto_secretstream_xchacha20poly1305_TAG_PUSH 0x01 -SODIUM_EXPORT -unsigned char crypto_secretstream_xchacha20poly1305_tag_push(void); - -#define crypto_secretstream_xchacha20poly1305_TAG_REKEY 0x02 -SODIUM_EXPORT -unsigned char crypto_secretstream_xchacha20poly1305_tag_rekey(void); - -#define crypto_secretstream_xchacha20poly1305_TAG_FINAL \ - (crypto_secretstream_xchacha20poly1305_TAG_PUSH | \ - crypto_secretstream_xchacha20poly1305_TAG_REKEY) -SODIUM_EXPORT -unsigned char crypto_secretstream_xchacha20poly1305_tag_final(void); - -typedef struct crypto_secretstream_xchacha20poly1305_state { - unsigned char k[crypto_stream_chacha20_ietf_KEYBYTES]; - unsigned char nonce[crypto_stream_chacha20_ietf_NONCEBYTES]; - unsigned char _pad[8]; -} crypto_secretstream_xchacha20poly1305_state; - -SODIUM_EXPORT -size_t crypto_secretstream_xchacha20poly1305_statebytes(void); - -SODIUM_EXPORT -void crypto_secretstream_xchacha20poly1305_keygen - (unsigned char k[crypto_secretstream_xchacha20poly1305_KEYBYTES]) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_secretstream_xchacha20poly1305_init_push - (crypto_secretstream_xchacha20poly1305_state *state, - unsigned char header[crypto_secretstream_xchacha20poly1305_HEADERBYTES], - const unsigned char k[crypto_secretstream_xchacha20poly1305_KEYBYTES]) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_secretstream_xchacha20poly1305_push - (crypto_secretstream_xchacha20poly1305_state *state, - unsigned char *c, unsigned long long *clen_p, - const unsigned char *m, unsigned long long mlen, - const unsigned char *ad, unsigned long long adlen, unsigned char tag) - __attribute__ ((nonnull(1))); - -SODIUM_EXPORT -int crypto_secretstream_xchacha20poly1305_init_pull - (crypto_secretstream_xchacha20poly1305_state *state, - const unsigned char header[crypto_secretstream_xchacha20poly1305_HEADERBYTES], - const unsigned char k[crypto_secretstream_xchacha20poly1305_KEYBYTES]) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_secretstream_xchacha20poly1305_pull - (crypto_secretstream_xchacha20poly1305_state *state, - unsigned char *m, unsigned long long *mlen_p, unsigned char *tag_p, - const unsigned char *c, unsigned long long clen, - const unsigned char *ad, unsigned long long adlen) - __attribute__ ((nonnull(1))); - -SODIUM_EXPORT -void crypto_secretstream_xchacha20poly1305_rekey - (crypto_secretstream_xchacha20poly1305_state *state); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_shorthash.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_shorthash.h deleted file mode 100644 index fecaa88b..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_shorthash.h +++ /dev/null @@ -1,41 +0,0 @@ -#ifndef crypto_shorthash_H -#define crypto_shorthash_H - -#include - -#include "crypto_shorthash_siphash24.h" -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -#define crypto_shorthash_BYTES crypto_shorthash_siphash24_BYTES -SODIUM_EXPORT -size_t crypto_shorthash_bytes(void); - -#define crypto_shorthash_KEYBYTES crypto_shorthash_siphash24_KEYBYTES -SODIUM_EXPORT -size_t crypto_shorthash_keybytes(void); - -#define crypto_shorthash_PRIMITIVE "siphash24" -SODIUM_EXPORT -const char *crypto_shorthash_primitive(void); - -SODIUM_EXPORT -int crypto_shorthash(unsigned char *out, const unsigned char *in, - unsigned long long inlen, const unsigned char *k) - __attribute__ ((nonnull(1, 4))); - -SODIUM_EXPORT -void crypto_shorthash_keygen(unsigned char k[crypto_shorthash_KEYBYTES]) - __attribute__ ((nonnull)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_shorthash_siphash24.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_shorthash_siphash24.h deleted file mode 100644 index 1e6f72a6..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_shorthash_siphash24.h +++ /dev/null @@ -1,50 +0,0 @@ -#ifndef crypto_shorthash_siphash24_H -#define crypto_shorthash_siphash24_H - -#include -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -/* -- 64-bit output -- */ - -#define crypto_shorthash_siphash24_BYTES 8U -SODIUM_EXPORT -size_t crypto_shorthash_siphash24_bytes(void); - -#define crypto_shorthash_siphash24_KEYBYTES 16U -SODIUM_EXPORT -size_t crypto_shorthash_siphash24_keybytes(void); - -SODIUM_EXPORT -int crypto_shorthash_siphash24(unsigned char *out, const unsigned char *in, - unsigned long long inlen, const unsigned char *k) - __attribute__ ((nonnull(1, 4))); - -#ifndef SODIUM_LIBRARY_MINIMAL -/* -- 128-bit output -- */ - -#define crypto_shorthash_siphashx24_BYTES 16U -SODIUM_EXPORT -size_t crypto_shorthash_siphashx24_bytes(void); - -#define crypto_shorthash_siphashx24_KEYBYTES 16U -SODIUM_EXPORT -size_t crypto_shorthash_siphashx24_keybytes(void); - -SODIUM_EXPORT -int crypto_shorthash_siphashx24(unsigned char *out, const unsigned char *in, - unsigned long long inlen, const unsigned char *k) - __attribute__ ((nonnull(1, 4))); -#endif - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_sign.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_sign.h deleted file mode 100644 index f5fafb12..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_sign.h +++ /dev/null @@ -1,107 +0,0 @@ -#ifndef crypto_sign_H -#define crypto_sign_H - -/* - * THREAD SAFETY: crypto_sign_keypair() is thread-safe, - * provided that sodium_init() was called before. - * - * Other functions, including crypto_sign_seed_keypair() are always thread-safe. - */ - -#include - -#include "crypto_sign_ed25519.h" -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -typedef crypto_sign_ed25519ph_state crypto_sign_state; - -SODIUM_EXPORT -size_t crypto_sign_statebytes(void); - -#define crypto_sign_BYTES crypto_sign_ed25519_BYTES -SODIUM_EXPORT -size_t crypto_sign_bytes(void); - -#define crypto_sign_SEEDBYTES crypto_sign_ed25519_SEEDBYTES -SODIUM_EXPORT -size_t crypto_sign_seedbytes(void); - -#define crypto_sign_PUBLICKEYBYTES crypto_sign_ed25519_PUBLICKEYBYTES -SODIUM_EXPORT -size_t crypto_sign_publickeybytes(void); - -#define crypto_sign_SECRETKEYBYTES crypto_sign_ed25519_SECRETKEYBYTES -SODIUM_EXPORT -size_t crypto_sign_secretkeybytes(void); - -#define crypto_sign_MESSAGEBYTES_MAX crypto_sign_ed25519_MESSAGEBYTES_MAX -SODIUM_EXPORT -size_t crypto_sign_messagebytes_max(void); - -#define crypto_sign_PRIMITIVE "ed25519" -SODIUM_EXPORT -const char *crypto_sign_primitive(void); - -SODIUM_EXPORT -int crypto_sign_seed_keypair(unsigned char *pk, unsigned char *sk, - const unsigned char *seed) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_sign_keypair(unsigned char *pk, unsigned char *sk) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_sign(unsigned char *sm, unsigned long long *smlen_p, - const unsigned char *m, unsigned long long mlen, - const unsigned char *sk) __attribute__ ((nonnull(1, 5))); - -SODIUM_EXPORT -int crypto_sign_open(unsigned char *m, unsigned long long *mlen_p, - const unsigned char *sm, unsigned long long smlen, - const unsigned char *pk) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(3, 5))); - -SODIUM_EXPORT -int crypto_sign_detached(unsigned char *sig, unsigned long long *siglen_p, - const unsigned char *m, unsigned long long mlen, - const unsigned char *sk) __attribute__ ((nonnull(1, 5))); - -SODIUM_EXPORT -int crypto_sign_verify_detached(const unsigned char *sig, - const unsigned char *m, - unsigned long long mlen, - const unsigned char *pk) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(1, 4))); - -SODIUM_EXPORT -int crypto_sign_init(crypto_sign_state *state); - -SODIUM_EXPORT -int crypto_sign_update(crypto_sign_state *state, - const unsigned char *m, unsigned long long mlen) - __attribute__ ((nonnull(1))); - -SODIUM_EXPORT -int crypto_sign_final_create(crypto_sign_state *state, unsigned char *sig, - unsigned long long *siglen_p, - const unsigned char *sk) - __attribute__ ((nonnull(1, 2, 4))); - -SODIUM_EXPORT -int crypto_sign_final_verify(crypto_sign_state *state, const unsigned char *sig, - const unsigned char *pk) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_sign_ed25519.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_sign_ed25519.h deleted file mode 100644 index 0fdac42d..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_sign_ed25519.h +++ /dev/null @@ -1,124 +0,0 @@ -#ifndef crypto_sign_ed25519_H -#define crypto_sign_ed25519_H - -#include -#include "crypto_hash_sha512.h" -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -typedef struct crypto_sign_ed25519ph_state { - crypto_hash_sha512_state hs; -} crypto_sign_ed25519ph_state; - -SODIUM_EXPORT -size_t crypto_sign_ed25519ph_statebytes(void); - -#define crypto_sign_ed25519_BYTES 64U -SODIUM_EXPORT -size_t crypto_sign_ed25519_bytes(void); - -#define crypto_sign_ed25519_SEEDBYTES 32U -SODIUM_EXPORT -size_t crypto_sign_ed25519_seedbytes(void); - -#define crypto_sign_ed25519_PUBLICKEYBYTES 32U -SODIUM_EXPORT -size_t crypto_sign_ed25519_publickeybytes(void); - -#define crypto_sign_ed25519_SECRETKEYBYTES (32U + 32U) -SODIUM_EXPORT -size_t crypto_sign_ed25519_secretkeybytes(void); - -#define crypto_sign_ed25519_MESSAGEBYTES_MAX (SODIUM_SIZE_MAX - crypto_sign_ed25519_BYTES) -SODIUM_EXPORT -size_t crypto_sign_ed25519_messagebytes_max(void); - -SODIUM_EXPORT -int crypto_sign_ed25519(unsigned char *sm, unsigned long long *smlen_p, - const unsigned char *m, unsigned long long mlen, - const unsigned char *sk) - __attribute__ ((nonnull(1, 5))); - -SODIUM_EXPORT -int crypto_sign_ed25519_open(unsigned char *m, unsigned long long *mlen_p, - const unsigned char *sm, unsigned long long smlen, - const unsigned char *pk) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(3, 5))); - -SODIUM_EXPORT -int crypto_sign_ed25519_detached(unsigned char *sig, - unsigned long long *siglen_p, - const unsigned char *m, - unsigned long long mlen, - const unsigned char *sk) - __attribute__ ((nonnull(1, 5))); - -SODIUM_EXPORT -int crypto_sign_ed25519_verify_detached(const unsigned char *sig, - const unsigned char *m, - unsigned long long mlen, - const unsigned char *pk) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(1, 4))); - -SODIUM_EXPORT -int crypto_sign_ed25519_keypair(unsigned char *pk, unsigned char *sk) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_sign_ed25519_seed_keypair(unsigned char *pk, unsigned char *sk, - const unsigned char *seed) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_sign_ed25519_pk_to_curve25519(unsigned char *curve25519_pk, - const unsigned char *ed25519_pk) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_sign_ed25519_sk_to_curve25519(unsigned char *curve25519_sk, - const unsigned char *ed25519_sk) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_sign_ed25519_sk_to_seed(unsigned char *seed, - const unsigned char *sk) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_sign_ed25519_sk_to_pk(unsigned char *pk, const unsigned char *sk) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_sign_ed25519ph_init(crypto_sign_ed25519ph_state *state) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_sign_ed25519ph_update(crypto_sign_ed25519ph_state *state, - const unsigned char *m, - unsigned long long mlen) - __attribute__ ((nonnull(1))); - -SODIUM_EXPORT -int crypto_sign_ed25519ph_final_create(crypto_sign_ed25519ph_state *state, - unsigned char *sig, - unsigned long long *siglen_p, - const unsigned char *sk) - __attribute__ ((nonnull(1, 2, 4))); - -SODIUM_EXPORT -int crypto_sign_ed25519ph_final_verify(crypto_sign_ed25519ph_state *state, - const unsigned char *sig, - const unsigned char *pk) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_stream.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_stream.h deleted file mode 100644 index 88dab5f6..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_stream.h +++ /dev/null @@ -1,59 +0,0 @@ -#ifndef crypto_stream_H -#define crypto_stream_H - -/* - * WARNING: This is just a stream cipher. It is NOT authenticated encryption. - * While it provides some protection against eavesdropping, it does NOT - * provide any security against active attacks. - * Unless you know what you're doing, what you are looking for is probably - * the crypto_box functions. - */ - -#include - -#include "crypto_stream_xsalsa20.h" -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -#define crypto_stream_KEYBYTES crypto_stream_xsalsa20_KEYBYTES -SODIUM_EXPORT -size_t crypto_stream_keybytes(void); - -#define crypto_stream_NONCEBYTES crypto_stream_xsalsa20_NONCEBYTES -SODIUM_EXPORT -size_t crypto_stream_noncebytes(void); - -#define crypto_stream_MESSAGEBYTES_MAX crypto_stream_xsalsa20_MESSAGEBYTES_MAX -SODIUM_EXPORT -size_t crypto_stream_messagebytes_max(void); - -#define crypto_stream_PRIMITIVE "xsalsa20" -SODIUM_EXPORT -const char *crypto_stream_primitive(void); - -SODIUM_EXPORT -int crypto_stream(unsigned char *c, unsigned long long clen, - const unsigned char *n, const unsigned char *k) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_stream_xor(unsigned char *c, const unsigned char *m, - unsigned long long mlen, const unsigned char *n, - const unsigned char *k) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -void crypto_stream_keygen(unsigned char k[crypto_stream_KEYBYTES]) - __attribute__ ((nonnull)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_stream_chacha20.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_stream_chacha20.h deleted file mode 100644 index 40889755..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_stream_chacha20.h +++ /dev/null @@ -1,106 +0,0 @@ -#ifndef crypto_stream_chacha20_H -#define crypto_stream_chacha20_H - -/* - * WARNING: This is just a stream cipher. It is NOT authenticated encryption. - * While it provides some protection against eavesdropping, it does NOT - * provide any security against active attacks. - * Unless you know what you're doing, what you are looking for is probably - * the crypto_box functions. - */ - -#include -#include -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -#define crypto_stream_chacha20_KEYBYTES 32U -SODIUM_EXPORT -size_t crypto_stream_chacha20_keybytes(void); - -#define crypto_stream_chacha20_NONCEBYTES 8U -SODIUM_EXPORT -size_t crypto_stream_chacha20_noncebytes(void); - -#define crypto_stream_chacha20_MESSAGEBYTES_MAX SODIUM_SIZE_MAX -SODIUM_EXPORT -size_t crypto_stream_chacha20_messagebytes_max(void); - -/* ChaCha20 with a 64-bit nonce and a 64-bit counter, as originally designed */ - -SODIUM_EXPORT -int crypto_stream_chacha20(unsigned char *c, unsigned long long clen, - const unsigned char *n, const unsigned char *k) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_stream_chacha20_xor(unsigned char *c, const unsigned char *m, - unsigned long long mlen, const unsigned char *n, - const unsigned char *k) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_stream_chacha20_xor_ic(unsigned char *c, const unsigned char *m, - unsigned long long mlen, - const unsigned char *n, uint64_t ic, - const unsigned char *k) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -void crypto_stream_chacha20_keygen(unsigned char k[crypto_stream_chacha20_KEYBYTES]) - __attribute__ ((nonnull)); - -/* ChaCha20 with a 96-bit nonce and a 32-bit counter (IETF) */ - -#define crypto_stream_chacha20_ietf_KEYBYTES 32U -SODIUM_EXPORT -size_t crypto_stream_chacha20_ietf_keybytes(void); - -#define crypto_stream_chacha20_ietf_NONCEBYTES 12U -SODIUM_EXPORT -size_t crypto_stream_chacha20_ietf_noncebytes(void); - -#define crypto_stream_chacha20_ietf_MESSAGEBYTES_MAX \ - SODIUM_MIN(SODIUM_SIZE_MAX, 64ULL * (1ULL << 32)) -SODIUM_EXPORT -size_t crypto_stream_chacha20_ietf_messagebytes_max(void); - -SODIUM_EXPORT -int crypto_stream_chacha20_ietf(unsigned char *c, unsigned long long clen, - const unsigned char *n, const unsigned char *k) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_stream_chacha20_ietf_xor(unsigned char *c, const unsigned char *m, - unsigned long long mlen, const unsigned char *n, - const unsigned char *k) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_stream_chacha20_ietf_xor_ic(unsigned char *c, const unsigned char *m, - unsigned long long mlen, - const unsigned char *n, uint32_t ic, - const unsigned char *k) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -void crypto_stream_chacha20_ietf_keygen(unsigned char k[crypto_stream_chacha20_ietf_KEYBYTES]) - __attribute__ ((nonnull)); - -/* Aliases */ - -#define crypto_stream_chacha20_IETF_KEYBYTES crypto_stream_chacha20_ietf_KEYBYTES -#define crypto_stream_chacha20_IETF_NONCEBYTES crypto_stream_chacha20_ietf_NONCEBYTES -#define crypto_stream_chacha20_IETF_MESSAGEBYTES_MAX crypto_stream_chacha20_ietf_MESSAGEBYTES_MAX - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_stream_salsa20.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_stream_salsa20.h deleted file mode 100644 index 45b3b3e3..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_stream_salsa20.h +++ /dev/null @@ -1,61 +0,0 @@ -#ifndef crypto_stream_salsa20_H -#define crypto_stream_salsa20_H - -/* - * WARNING: This is just a stream cipher. It is NOT authenticated encryption. - * While it provides some protection against eavesdropping, it does NOT - * provide any security against active attacks. - * Unless you know what you're doing, what you are looking for is probably - * the crypto_box functions. - */ - -#include -#include -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -#define crypto_stream_salsa20_KEYBYTES 32U -SODIUM_EXPORT -size_t crypto_stream_salsa20_keybytes(void); - -#define crypto_stream_salsa20_NONCEBYTES 8U -SODIUM_EXPORT -size_t crypto_stream_salsa20_noncebytes(void); - -#define crypto_stream_salsa20_MESSAGEBYTES_MAX SODIUM_SIZE_MAX -SODIUM_EXPORT -size_t crypto_stream_salsa20_messagebytes_max(void); - -SODIUM_EXPORT -int crypto_stream_salsa20(unsigned char *c, unsigned long long clen, - const unsigned char *n, const unsigned char *k) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_stream_salsa20_xor(unsigned char *c, const unsigned char *m, - unsigned long long mlen, const unsigned char *n, - const unsigned char *k) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_stream_salsa20_xor_ic(unsigned char *c, const unsigned char *m, - unsigned long long mlen, - const unsigned char *n, uint64_t ic, - const unsigned char *k) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -void crypto_stream_salsa20_keygen(unsigned char k[crypto_stream_salsa20_KEYBYTES]) - __attribute__ ((nonnull)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_stream_salsa2012.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_stream_salsa2012.h deleted file mode 100644 index 6c5d303c..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_stream_salsa2012.h +++ /dev/null @@ -1,53 +0,0 @@ -#ifndef crypto_stream_salsa2012_H -#define crypto_stream_salsa2012_H - -/* - * WARNING: This is just a stream cipher. It is NOT authenticated encryption. - * While it provides some protection against eavesdropping, it does NOT - * provide any security against active attacks. - * Unless you know what you're doing, what you are looking for is probably - * the crypto_box functions. - */ - -#include -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -#define crypto_stream_salsa2012_KEYBYTES 32U -SODIUM_EXPORT -size_t crypto_stream_salsa2012_keybytes(void); - -#define crypto_stream_salsa2012_NONCEBYTES 8U -SODIUM_EXPORT -size_t crypto_stream_salsa2012_noncebytes(void); - -#define crypto_stream_salsa2012_MESSAGEBYTES_MAX SODIUM_SIZE_MAX -SODIUM_EXPORT -size_t crypto_stream_salsa2012_messagebytes_max(void); - -SODIUM_EXPORT -int crypto_stream_salsa2012(unsigned char *c, unsigned long long clen, - const unsigned char *n, const unsigned char *k) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_stream_salsa2012_xor(unsigned char *c, const unsigned char *m, - unsigned long long mlen, const unsigned char *n, - const unsigned char *k) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -void crypto_stream_salsa2012_keygen(unsigned char k[crypto_stream_salsa2012_KEYBYTES]) - __attribute__ ((nonnull)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_stream_salsa208.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_stream_salsa208.h deleted file mode 100644 index d574f304..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_stream_salsa208.h +++ /dev/null @@ -1,56 +0,0 @@ -#ifndef crypto_stream_salsa208_H -#define crypto_stream_salsa208_H - -/* - * WARNING: This is just a stream cipher. It is NOT authenticated encryption. - * While it provides some protection against eavesdropping, it does NOT - * provide any security against active attacks. - * Unless you know what you're doing, what you are looking for is probably - * the crypto_box functions. - */ - -#include -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -#define crypto_stream_salsa208_KEYBYTES 32U -SODIUM_EXPORT -size_t crypto_stream_salsa208_keybytes(void) - __attribute__ ((deprecated)); - -#define crypto_stream_salsa208_NONCEBYTES 8U -SODIUM_EXPORT -size_t crypto_stream_salsa208_noncebytes(void) - __attribute__ ((deprecated)); - -#define crypto_stream_salsa208_MESSAGEBYTES_MAX SODIUM_SIZE_MAX - SODIUM_EXPORT -size_t crypto_stream_salsa208_messagebytes_max(void) - __attribute__ ((deprecated)); - -SODIUM_EXPORT -int crypto_stream_salsa208(unsigned char *c, unsigned long long clen, - const unsigned char *n, const unsigned char *k) - __attribute__ ((deprecated)) __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_stream_salsa208_xor(unsigned char *c, const unsigned char *m, - unsigned long long mlen, const unsigned char *n, - const unsigned char *k) - __attribute__ ((deprecated)) __attribute__ ((nonnull)); - -SODIUM_EXPORT -void crypto_stream_salsa208_keygen(unsigned char k[crypto_stream_salsa208_KEYBYTES]) - __attribute__ ((deprecated)) __attribute__ ((nonnull)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_stream_xchacha20.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_stream_xchacha20.h deleted file mode 100644 index c4002db0..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_stream_xchacha20.h +++ /dev/null @@ -1,61 +0,0 @@ -#ifndef crypto_stream_xchacha20_H -#define crypto_stream_xchacha20_H - -/* - * WARNING: This is just a stream cipher. It is NOT authenticated encryption. - * While it provides some protection against eavesdropping, it does NOT - * provide any security against active attacks. - * Unless you know what you're doing, what you are looking for is probably - * the crypto_box functions. - */ - -#include -#include -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -#define crypto_stream_xchacha20_KEYBYTES 32U -SODIUM_EXPORT -size_t crypto_stream_xchacha20_keybytes(void); - -#define crypto_stream_xchacha20_NONCEBYTES 24U -SODIUM_EXPORT -size_t crypto_stream_xchacha20_noncebytes(void); - -#define crypto_stream_xchacha20_MESSAGEBYTES_MAX SODIUM_SIZE_MAX -SODIUM_EXPORT -size_t crypto_stream_xchacha20_messagebytes_max(void); - -SODIUM_EXPORT -int crypto_stream_xchacha20(unsigned char *c, unsigned long long clen, - const unsigned char *n, const unsigned char *k) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_stream_xchacha20_xor(unsigned char *c, const unsigned char *m, - unsigned long long mlen, const unsigned char *n, - const unsigned char *k) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_stream_xchacha20_xor_ic(unsigned char *c, const unsigned char *m, - unsigned long long mlen, - const unsigned char *n, uint64_t ic, - const unsigned char *k) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -void crypto_stream_xchacha20_keygen(unsigned char k[crypto_stream_xchacha20_KEYBYTES]) - __attribute__ ((nonnull)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_stream_xsalsa20.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_stream_xsalsa20.h deleted file mode 100644 index 20034e34..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_stream_xsalsa20.h +++ /dev/null @@ -1,61 +0,0 @@ -#ifndef crypto_stream_xsalsa20_H -#define crypto_stream_xsalsa20_H - -/* - * WARNING: This is just a stream cipher. It is NOT authenticated encryption. - * While it provides some protection against eavesdropping, it does NOT - * provide any security against active attacks. - * Unless you know what you're doing, what you are looking for is probably - * the crypto_box functions. - */ - -#include -#include -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -#define crypto_stream_xsalsa20_KEYBYTES 32U -SODIUM_EXPORT -size_t crypto_stream_xsalsa20_keybytes(void); - -#define crypto_stream_xsalsa20_NONCEBYTES 24U -SODIUM_EXPORT -size_t crypto_stream_xsalsa20_noncebytes(void); - -#define crypto_stream_xsalsa20_MESSAGEBYTES_MAX SODIUM_SIZE_MAX -SODIUM_EXPORT -size_t crypto_stream_xsalsa20_messagebytes_max(void); - -SODIUM_EXPORT -int crypto_stream_xsalsa20(unsigned char *c, unsigned long long clen, - const unsigned char *n, const unsigned char *k) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_stream_xsalsa20_xor(unsigned char *c, const unsigned char *m, - unsigned long long mlen, const unsigned char *n, - const unsigned char *k) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_stream_xsalsa20_xor_ic(unsigned char *c, const unsigned char *m, - unsigned long long mlen, - const unsigned char *n, uint64_t ic, - const unsigned char *k) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -void crypto_stream_xsalsa20_keygen(unsigned char k[crypto_stream_xsalsa20_KEYBYTES]) - __attribute__ ((nonnull)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_verify_16.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_verify_16.h deleted file mode 100644 index 7b9c8077..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_verify_16.h +++ /dev/null @@ -1,23 +0,0 @@ -#ifndef crypto_verify_16_H -#define crypto_verify_16_H - -#include -#include "export.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#define crypto_verify_16_BYTES 16U -SODIUM_EXPORT -size_t crypto_verify_16_bytes(void); - -SODIUM_EXPORT -int crypto_verify_16(const unsigned char *x, const unsigned char *y) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_verify_32.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_verify_32.h deleted file mode 100644 index 9b0f4529..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_verify_32.h +++ /dev/null @@ -1,23 +0,0 @@ -#ifndef crypto_verify_32_H -#define crypto_verify_32_H - -#include -#include "export.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#define crypto_verify_32_BYTES 32U -SODIUM_EXPORT -size_t crypto_verify_32_bytes(void); - -SODIUM_EXPORT -int crypto_verify_32(const unsigned char *x, const unsigned char *y) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_verify_64.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_verify_64.h deleted file mode 100644 index c83b7302..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/crypto_verify_64.h +++ /dev/null @@ -1,23 +0,0 @@ -#ifndef crypto_verify_64_H -#define crypto_verify_64_H - -#include -#include "export.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#define crypto_verify_64_BYTES 64U -SODIUM_EXPORT -size_t crypto_verify_64_bytes(void); - -SODIUM_EXPORT -int crypto_verify_64(const unsigned char *x, const unsigned char *y) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/export.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/export.h deleted file mode 100644 index a0074fc9..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/export.h +++ /dev/null @@ -1,57 +0,0 @@ - -#ifndef sodium_export_H -#define sodium_export_H - -#include -#include -#include - -#if !defined(__clang__) && !defined(__GNUC__) -# ifdef __attribute__ -# undef __attribute__ -# endif -# define __attribute__(a) -#endif - -#ifdef SODIUM_STATIC -# define SODIUM_EXPORT -# define SODIUM_EXPORT_WEAK -#else -# if defined(_MSC_VER) -# ifdef SODIUM_DLL_EXPORT -# define SODIUM_EXPORT __declspec(dllexport) -# else -# define SODIUM_EXPORT __declspec(dllimport) -# endif -# else -# if defined(__SUNPRO_C) -# ifndef __GNU_C__ -# define SODIUM_EXPORT __attribute__ (visibility(__global)) -# else -# define SODIUM_EXPORT __attribute__ __global -# endif -# elif defined(_MSG_VER) -# define SODIUM_EXPORT extern __declspec(dllexport) -# else -# define SODIUM_EXPORT __attribute__ ((visibility ("default"))) -# endif -# endif -# if defined(__ELF__) && !defined(SODIUM_DISABLE_WEAK_FUNCTIONS) -# define SODIUM_EXPORT_WEAK SODIUM_EXPORT __attribute__((weak)) -# else -# define SODIUM_EXPORT_WEAK SODIUM_EXPORT -# endif -#endif - -#ifndef CRYPTO_ALIGN -# if defined(__INTEL_COMPILER) || defined(_MSC_VER) -# define CRYPTO_ALIGN(x) __declspec(align(x)) -# else -# define CRYPTO_ALIGN(x) __attribute__ ((aligned(x))) -# endif -#endif - -#define SODIUM_MIN(A, B) ((A) < (B) ? (A) : (B)) -#define SODIUM_SIZE_MAX SODIUM_MIN(UINT64_MAX, SIZE_MAX) - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/randombytes.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/randombytes.h deleted file mode 100644 index c83a4df5..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/randombytes.h +++ /dev/null @@ -1,72 +0,0 @@ - -#ifndef randombytes_H -#define randombytes_H - -#include -#include - -#include - -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -typedef struct randombytes_implementation { - const char *(*implementation_name)(void); /* required */ - uint32_t (*random)(void); /* required */ - void (*stir)(void); /* optional */ - uint32_t (*uniform)(const uint32_t upper_bound); /* optional, a default implementation will be used if NULL */ - void (*buf)(void * const buf, const size_t size); /* required */ - int (*close)(void); /* optional */ -} randombytes_implementation; - -#define randombytes_BYTES_MAX SODIUM_MIN(SODIUM_SIZE_MAX, 0xffffffffUL) - -#define randombytes_SEEDBYTES 32U -SODIUM_EXPORT -size_t randombytes_seedbytes(void); - -SODIUM_EXPORT -void randombytes_buf(void * const buf, const size_t size) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -void randombytes_buf_deterministic(void * const buf, const size_t size, - const unsigned char seed[randombytes_SEEDBYTES]) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -uint32_t randombytes_random(void); - -SODIUM_EXPORT -uint32_t randombytes_uniform(const uint32_t upper_bound); - -SODIUM_EXPORT -void randombytes_stir(void); - -SODIUM_EXPORT -int randombytes_close(void); - -SODIUM_EXPORT -int randombytes_set_implementation(const randombytes_implementation *impl) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -const char *randombytes_implementation_name(void); - -/* -- NaCl compatibility interface -- */ - -SODIUM_EXPORT -void randombytes(unsigned char * const buf, const unsigned long long buf_len) - __attribute__ ((nonnull)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/randombytes_internal_random.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/randombytes_internal_random.h deleted file mode 100644 index 2b2b7d6e..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/randombytes_internal_random.h +++ /dev/null @@ -1,22 +0,0 @@ - -#ifndef randombytes_internal_random_H -#define randombytes_internal_random_H - -#include "export.h" -#include "randombytes.h" - -#ifdef __cplusplus -extern "C" { -#endif - -SODIUM_EXPORT -extern struct randombytes_implementation randombytes_internal_implementation; - -/* Backwards compatibility with libsodium < 1.0.18 */ -#define randombytes_salsa20_implementation randombytes_internal_implementation - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/randombytes_sysrandom.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/randombytes_sysrandom.h deleted file mode 100644 index 9e27b674..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/randombytes_sysrandom.h +++ /dev/null @@ -1,19 +0,0 @@ - -#ifndef randombytes_sysrandom_H -#define randombytes_sysrandom_H - -#include "export.h" -#include "randombytes.h" - -#ifdef __cplusplus -extern "C" { -#endif - -SODIUM_EXPORT -extern struct randombytes_implementation randombytes_sysrandom_implementation; - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/runtime.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/runtime.h deleted file mode 100644 index c1cec853..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/runtime.h +++ /dev/null @@ -1,55 +0,0 @@ - -#ifndef sodium_runtime_H -#define sodium_runtime_H - -#include "export.h" - -#ifdef __cplusplus -extern "C" { -#endif - -SODIUM_EXPORT_WEAK -int sodium_runtime_has_neon(void); - -SODIUM_EXPORT_WEAK -int sodium_runtime_has_armcrypto(void); - -SODIUM_EXPORT_WEAK -int sodium_runtime_has_sse2(void); - -SODIUM_EXPORT_WEAK -int sodium_runtime_has_sse3(void); - -SODIUM_EXPORT_WEAK -int sodium_runtime_has_ssse3(void); - -SODIUM_EXPORT_WEAK -int sodium_runtime_has_sse41(void); - -SODIUM_EXPORT_WEAK -int sodium_runtime_has_avx(void); - -SODIUM_EXPORT_WEAK -int sodium_runtime_has_avx2(void); - -SODIUM_EXPORT_WEAK -int sodium_runtime_has_avx512f(void); - -SODIUM_EXPORT_WEAK -int sodium_runtime_has_pclmul(void); - -SODIUM_EXPORT_WEAK -int sodium_runtime_has_aesni(void); - -SODIUM_EXPORT_WEAK -int sodium_runtime_has_rdrand(void); - -/* ------------------------------------------------------------------------- */ - -int _sodium_runtime_get_cpu_features(void); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/utils.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/utils.h deleted file mode 100644 index f9b36979..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/utils.h +++ /dev/null @@ -1,179 +0,0 @@ - -#ifndef sodium_utils_H -#define sodium_utils_H - -#include - -#include "export.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#ifndef SODIUM_C99 -# if defined(__cplusplus) || !defined(__STDC_VERSION__) || __STDC_VERSION__ < 199901L -# define SODIUM_C99(X) -# else -# define SODIUM_C99(X) X -# endif -#endif - -SODIUM_EXPORT -void sodium_memzero(void * const pnt, const size_t len); - -SODIUM_EXPORT -void sodium_stackzero(const size_t len); - -/* - * WARNING: sodium_memcmp() must be used to verify if two secret keys - * are equal, in constant time. - * It returns 0 if the keys are equal, and -1 if they differ. - * This function is not designed for lexicographical comparisons. - */ -SODIUM_EXPORT -int sodium_memcmp(const void * const b1_, const void * const b2_, size_t len) - __attribute__ ((warn_unused_result)); - -/* - * sodium_compare() returns -1 if b1_ < b2_, 1 if b1_ > b2_ and 0 if b1_ == b2_ - * It is suitable for lexicographical comparisons, or to compare nonces - * and counters stored in little-endian format. - * However, it is slower than sodium_memcmp(). - */ -SODIUM_EXPORT -int sodium_compare(const unsigned char *b1_, const unsigned char *b2_, - size_t len) __attribute__ ((warn_unused_result)); - -SODIUM_EXPORT -int sodium_is_zero(const unsigned char *n, const size_t nlen); - -SODIUM_EXPORT -void sodium_increment(unsigned char *n, const size_t nlen); - -SODIUM_EXPORT -void sodium_add(unsigned char *a, const unsigned char *b, const size_t len); - -SODIUM_EXPORT -void sodium_sub(unsigned char *a, const unsigned char *b, const size_t len); - -SODIUM_EXPORT -char *sodium_bin2hex(char * const hex, const size_t hex_maxlen, - const unsigned char * const bin, const size_t bin_len) - __attribute__ ((nonnull(1))); - -SODIUM_EXPORT -int sodium_hex2bin(unsigned char * const bin, const size_t bin_maxlen, - const char * const hex, const size_t hex_len, - const char * const ignore, size_t * const bin_len, - const char ** const hex_end) - __attribute__ ((nonnull(1))); - -#define sodium_base64_VARIANT_ORIGINAL 1 -#define sodium_base64_VARIANT_ORIGINAL_NO_PADDING 3 -#define sodium_base64_VARIANT_URLSAFE 5 -#define sodium_base64_VARIANT_URLSAFE_NO_PADDING 7 - -/* - * Computes the required length to encode BIN_LEN bytes as a base64 string - * using the given variant. The computed length includes a trailing \0. - */ -#define sodium_base64_ENCODED_LEN(BIN_LEN, VARIANT) \ - (((BIN_LEN) / 3U) * 4U + \ - ((((BIN_LEN) - ((BIN_LEN) / 3U) * 3U) | (((BIN_LEN) - ((BIN_LEN) / 3U) * 3U) >> 1)) & 1U) * \ - (4U - (~((((VARIANT) & 2U) >> 1) - 1U) & (3U - ((BIN_LEN) - ((BIN_LEN) / 3U) * 3U)))) + 1U) - -SODIUM_EXPORT -size_t sodium_base64_encoded_len(const size_t bin_len, const int variant); - -SODIUM_EXPORT -char *sodium_bin2base64(char * const b64, const size_t b64_maxlen, - const unsigned char * const bin, const size_t bin_len, - const int variant) __attribute__ ((nonnull(1))); - -SODIUM_EXPORT -int sodium_base642bin(unsigned char * const bin, const size_t bin_maxlen, - const char * const b64, const size_t b64_len, - const char * const ignore, size_t * const bin_len, - const char ** const b64_end, const int variant) - __attribute__ ((nonnull(1))); - -SODIUM_EXPORT -int sodium_mlock(void * const addr, const size_t len) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int sodium_munlock(void * const addr, const size_t len) - __attribute__ ((nonnull)); - -/* WARNING: sodium_malloc() and sodium_allocarray() are not general-purpose - * allocation functions. - * - * They return a pointer to a region filled with 0xd0 bytes, immediately - * followed by a guard page. - * As a result, accessing a single byte after the requested allocation size - * will intentionally trigger a segmentation fault. - * - * A canary and an additional guard page placed before the beginning of the - * region may also kill the process if a buffer underflow is detected. - * - * The memory layout is: - * [unprotected region size (read only)][guard page (no access)][unprotected pages (read/write)][guard page (no access)] - * With the layout of the unprotected pages being: - * [optional padding][16-bytes canary][user region] - * - * However: - * - These functions are significantly slower than standard functions - * - Each allocation requires 3 or 4 additional pages - * - The returned address will not be aligned if the allocation size is not - * a multiple of the required alignment. For this reason, these functions - * are designed to store data, such as secret keys and messages. - * - * sodium_malloc() can be used to allocate any libsodium data structure. - * - * The crypto_generichash_state structure is packed and its length is - * either 357 or 361 bytes. For this reason, when using sodium_malloc() to - * allocate a crypto_generichash_state structure, padding must be added in - * order to ensure proper alignment. crypto_generichash_statebytes() - * returns the rounded up structure size, and should be preferred to sizeof(): - * state = sodium_malloc(crypto_generichash_statebytes()); - */ - -SODIUM_EXPORT -void *sodium_malloc(const size_t size) - __attribute__ ((malloc)); - -SODIUM_EXPORT -void *sodium_allocarray(size_t count, size_t size) - __attribute__ ((malloc)); - -SODIUM_EXPORT -void sodium_free(void *ptr); - -SODIUM_EXPORT -int sodium_mprotect_noaccess(void *ptr) __attribute__ ((nonnull)); - -SODIUM_EXPORT -int sodium_mprotect_readonly(void *ptr) __attribute__ ((nonnull)); - -SODIUM_EXPORT -int sodium_mprotect_readwrite(void *ptr) __attribute__ ((nonnull)); - -SODIUM_EXPORT -int sodium_pad(size_t *padded_buflen_p, unsigned char *buf, - size_t unpadded_buflen, size_t blocksize, size_t max_buflen) - __attribute__ ((nonnull(2))); - -SODIUM_EXPORT -int sodium_unpad(size_t *unpadded_buflen_p, const unsigned char *buf, - size_t padded_buflen, size_t blocksize) - __attribute__ ((nonnull(2))); - -/* -------- */ - -int _sodium_alloc_init(void); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/version.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/version.h deleted file mode 100644 index cc60e448..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/include/sodium/version.h +++ /dev/null @@ -1,33 +0,0 @@ - -#ifndef sodium_version_H -#define sodium_version_H - -#include "export.h" - -#define SODIUM_VERSION_STRING "1.0.18" - -#define SODIUM_LIBRARY_VERSION_MAJOR 11 -#define SODIUM_LIBRARY_VERSION_MINOR 0 -#define SODIUM_LIBRARY_MINIMAL 1 - -#ifdef __cplusplus -extern "C" { -#endif - -SODIUM_EXPORT -const char *sodium_version_string(void); - -SODIUM_EXPORT -int sodium_library_version_major(void); - -SODIUM_EXPORT -int sodium_library_version_minor(void); - -SODIUM_EXPORT -int sodium_library_minimal(void); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/lib/libsodium.27.dylib b/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/lib/libsodium.27.dylib deleted file mode 100755 index 3aff92266fd0135e043d39708110361e8a62ab72..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 437400 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 z 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

wL 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 duZ> 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 diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/lib/libsodium.a b/client/3rd/ShadowSocks/ShadowSocks/libsodium/ios64/lib/libsodium.a deleted file mode 100644 index a833e4dc34ffd8d011107efd6fbc0197aec78ce9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1359128 zcmeFa3w%`7)i%E8!ptO@Oa=%V$i)+a7?t28gqU!#lMG-`S|g&Om1ZUvNHmu*2@tT= z$psP>eS=0#TWtr63e>hy(T`U9H6f@G(MF3l@=}|~#b~jjpn}!qM&Mzm=?6uZj`@YXUd+)VR>O5CnX~kvHX_=Q~*#!TUnUigsH9L29ZnhxIwq=4L zu`_M9oNUmtX4$fGMR8|zaq-M+Zus_sg^Pr1u3EZm;R1%sHi5ARCo{I|dok===P{Oh zz|7tk7#q1DmOVLxvBJyZSXM4$_I@k7n&WGiGIsn4D|;O7^bf6UU@q{c@oZK;V-@ui z*k4i^Yya<9b}#T$3G{G07f5>d0+&A!%jR(RH$alVhP!Jx#!r>#7js<9v6SO&9Dl^| zS&pj{7#oU@Vb=qz z92aq1$??|?)Cm z4abd$kGq|*pL2YJBhyOs=^U@+cn8NF9N*;_rIY06bFAceKgX9jp5&OSm*fjMR&#uq z;~tL3fX=;)ojXoK2ggQ^TRFbN(O{6|GC8i~*vWA>(EB&We$VkzBMK~D!>;03&GBxI z+c>_$afD-xN%D6Q$Hl<*Z)wm<)Xs{ydKF@${YIXhys#-Dw=#5l;HO8rI2i8^_;r{3FNlv1m`9YFIAE zRU9AUxQ`>VNOG5OEavzS$5%Lh#__^9Nxqol0~}xB_$5b^8TI=a4NK-YhvStTkMnry zW2E#<=9t6r+Z^#|5z|}7{oT&d%kepmYq{J#9QT9X_?Ctp;rKU>+c>|E<3Wy}a{LMU zrS?mr*|Qw~$niAC$?+0@9&l)JG+PQhwIZ6;bL`~!49B;CT{Y3{LypmtB=xp zj;);j10IiuI6lkq4;(+@Xh6IuzG)m6a4hHO;rJ7dzvcJ@!s*x;!*+6fnd7;Mc)o9s zVei6S_~RIMF?TQIc#6}%$K6i@-BD(?4mj{-410;YhdAEP>8H6nK8dk}Vl&I)Sj6#G zjt_8r8t82_vwn{6a{Pkh#AJz|&T%fstAUN1&CJcQg<}`Tr#bH9c$nj9jtO|Mk^fo1 z?&r-~^p z6#P+qrg6ORLdJUTv#?x_*K(}qcz7zx<$MeK8%H5ca_4g_;dn2{r#ZgO@f(g8PLupy z%W)mYM>xL3@i@l`=S%Y09Ixf*=GevYHyjUeoHiZ(REdSn<5O!6jz;7!#q(aC&rfjdk@KA+yGSaZ zB#!er7ISRj_*0J0b3DlL?;H~@mh@zCypm%X$F&^q<@igE{Tzolo(2x$A!42(;WUni zf%JZ$&5-bXj_W{o4_nw`?w-%(Z{%1HdeL=pYy-#UnRuV5i(`*)+{)>{<2cCi1jlnA zNB(DV+{yjz=XeFD9|yW0ienQmkWCDB)JTZH*(y>@wXh0a};Jt@>c^*r{h>D$J;nQ$njSkCuAdE z&a<*t;a+aFvX3~<1l>8?%I0$X4#)aj>Ah~(Y&?g)Yh~@+U2rM-<0dQn1E-&Wo8I?| zIsG)JC+A51HgI}AcR#`1PVT;)V=VNOo}X~{ZjMJeYT=LKF^yvxkLT?iyEyLP_&bh& z;`lK~1L8;Noyzetj>|dLa%|)HV~!bf@mwev&jt}sdapgsF*Z+f&*XR=$M19Wa(tcR z=N!+SBl(-l@g|P9aooyLi*Vf&#v;!m>)P?`6OI$+OYTgLH*)*|#~*Us1r#0}&-QYBkK;*> z=F2303dbCv^Oxh9gX1!e^&B^H^jwZ{*}8c41b08r@lB4Oa=ahu>i&8H(|=3S`&vHQ z4dx-<;W!!einqqI85}R?cq7MSTy8zw3Fl8>_i+4*({JW-Q3aA-FXtz6_uqj%{S(+Z zhzDUd$BQ|C4#&kDf5H9Vz}>4jHgWth$LBb{#PKxz(R=wsyM&n>7jrD(css|3I6lqs zHI7F)e#3Dx(n)$>;PHBshj*CcagIxQy0)QQic9O(xf^PWUFEJa{99F7pP7|gRqQHR z*HB&`j(bb_y3zQn%4@>;t}d^ycdaTHH56C78pFxexL21%45p^OyfmCZ*6f_{i6CZ# zG;p?h5{Nm56p&b?1c-d~_?K3=@RwzC*H*2|oMoG>nvM{mvU0H`12Z$6RB>5(0|F^8 z8%4alW-Lm%)L4~PmN%>%Tbe}4u_a6?dPWf$TM|X}|42I3t6507i25NLQs>kqBUeCm zKVfQP7~wHi%`ql#Oes6VM2$5)VS0&1^@OW+d|^aYD`sTbFf}ubC)KJMS@z5VP%phO zA*hvM7}3Zj8OBqX@(d>(T0vJgRQS6yIEsUw4MYk}F{cJJJfgYlDyu6SD%X?;>ReM^ zSGjUsAg!X>Ra%c8dv;DZx>{8HzKT~?*0`#|`mL;~YzWI#Pmn@)aIsO^6zuv2SA+B@ z4jaU3cNt{DvLock?941xZ=grW5#ol=5#ol;5n@Kn5iSr?+B`>yJxY#{NQ4|AcH|rh zS54rP1_dgW)*m?%h?q4b5Gi+vKUxNHnFx7A5~F7mNkz^nk_gJIl3M?G5WkCED;vt| zYN~zJh-f9{D{Je@!w>`WPZY0hTwh*S8_GaNxLuWX0lLwYLj}Y3XQaNSwx%?w1rfQ{ ztr!8z1l8n(_B14p!EaS%X-HWS3teAbc|#ahc^MUONV@9F%gaI&rk*b$gF^~bCaNZ( z+*R-I6G@r~s*;o~K3xGhAHWIkHzX+0U)b>K%N0GVlzFbI(83|H(CjH)UALw@YxeBS zyvBN0RlQiD1OeUwkWDfaeZxBbs-bv|tFEE48iST#QHoMfY~>I{*6Nx{JY4X+QS%s-7Ntj#Ra{fP z3PYvvp(C4$>#JQ==z;3W%JJk04yCdliA1fgL{e0_wKYOuP#|tSG(FB zD&)>|XHt2&F)#}b+sB)w!kb0D!sWl4xM4EKUnrqk{k-B5SG`JUAt7M{4GFQX67{jX zp`jK%wpjIo$~lA|6ypHCT9WEZ#b*HqSb=rdM^`O8nTvYq&jAGy6+4t(S6;Td)Ia8y zTAcjG>U;PElF=?}>Kk~X__SV-L?vFbB1?pfDuOiBu5JjUfzKUcX4%?7(oCERkI*;K&%W}<;6qE4tnEIvP!C4x0Gj< zM9N~NMA)s34aJq!?yBaE?mPqVVWTzk(*$ zQ$_5GxiYD$sxVYiM1E-ED6k>Q;SeW6)W8mj8hHsURi!f3sF9bTsNGVwvRJMGV$=e9 zCl#)ut5{D%fxbOw)j*swT`UCB(zLHi{gTS3^z@ ztYsn*(;RhSD~ zuSdyapRNd*?URvno%au_X)CL(sd0rqhq)K`TCpc|)vc;Q(^wXwQhsbz)z+-?HK>5HuM9&jc2%t^=4r^pOo&>&sg(M*fCo>Ya#=v} z3er$#A>s>(`b=Do|M>e6&Jel7jLI%{W|r0t=Ie2gR1YX2eR{EFO0tL#bw;4-Z{CkIj6)0LzS=c62CN~kq2C!g7e9##- z%TZusZ$%2>@bynAG?rjTX-EonqgBB&EJ}^JDJg^_rNyUFISCV-$$p{8tw|B)=xLE# zON7FeMIvPLXe~;tt6`dyRF5OJ6;UKoV-W>ZTT4iw5g!_UrdoRdx2$}n3(FS4T6z5s z&BU+`V=V2#C!{!R0?%PfUFE8V-(X#Rfg7KKs{Te4+bEd|8G+X_WMU z?ZFC0Xm%)=($Bz%DcJsHOB%0c+QJUv)%}DY%!kI`ACy|E{oJq_pcDz07YZ5Gl#AOq zu)^(+f=p3gqnBRyX-Pcf?JR($d?oWULe}IJtZ>Wkei4Vri_E1nSf2<4?Ft6qR1k`YQYRCe?t z4)GJQ%tNHZRDuw>a3znfsoYgv9J=2#XiKhCEMcW9V8~D&)cK9#gS;L1#@g3 z6f1b6cnDMeVG{xQ&^i!SI_&neQDSu_Np`Oudur>-5ξ7B=!K(?g>~yTP?8XpU

ON*2k-_bW;qnvcrbx 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

pH#Q52vog)3S-Z`S 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

O@=eoR^V7aJ2ZH$BOZ{c0c`)Oqz*C&_ z9i{%KO5QWiJXH|t^6MNEIf1<$e|zodzwrK-Vj-im+wzW2XfC1ybsRmDj_BA)*HQ0D zAKI@Wr%djeVb)S#O3z$$^LCq^sb@RsX}``epC-L)pImdFCw;{t($cTZFlSQ_Sku`@ zgS1cki1STx&ZeCHL-$5ypFr0~eWt$Jw-P&Ibc3`%s^2@J@1wJVg|tb}ETnz%!?4gP zPyQNwcI}1o)^ab+K8cQ){4=n&tWz6q4Rl~{QolR@dFq-LT^pj-$eTQ1iGA)u8c#!GY*}yP3FF3Mo8G{GicLs(+JIo(6gEJ z<1zM(ne^jx_jpWXd-hCdO%WIZUwzKH7oOvMig>a;N%)4fBDFDjs-qR@qTK?=^aisAM&~v9Q z&J1;?H-mG-#lafKChSYFTxMBg(wp1TSI#c`(EOY{CmkG@s&?`2L2RMHasAT+vY%Gk z8tPM;V_!!6J=(50syQop3J!Z{|iS1L&o0VVk7sAJ( zb7!w`g^sm>*XZC1eICJZe*?pP1%`W^{r%TvDdy#6wd}$8>T&kqz2=~<*=7a%J$>Y0 zxQEc;xup!e!X7XYJ)Qw&ADIL4nlLV2`-=#M`wR?slzc6ir=m&w$d}K2O~2M_E@F+B zb8iZ5oR4po$?PBVvHf`(-+-s_b=d)(&g1Oa(`b*McHrm0nnwLkfq%QW)6mQKz&vwp zBeMNRd?@?2 z;>Xx8%AvEOg`(F}DC;Q)$Em#cC~sG!JhfTnsl6&MT>hKrW-H#+!EyN0qE8hUX4?ks zo(*l(wIdkS*BTOfn8I_f{!%j(Q$F6dP zj$aKe{EaKLwWNu;t>hzURjpanDFrN&!g%Jg7baPLaHn*nl1Q7x`d1&Nl5Y}pq9$Kh zFWG*BIda0`C6nokTCO*m$ybUNCEGR7DLr$Pd9oE+b$v^Zc|APFQRct`?oCrY(6OUn zyG7g|PJIdB?4w}2;n0h1t~hfabtSuF!Dm%wLbEvYXosZ0X6VxOO=HZXV5<+oV%Lwy z7c<`x-O5@oY8eO55QjZNEVwVu!EKwNF(0$`pWyy6&TF6G`Y5<=5#>A$t$U0z{y?4y zgh#=36SG*!O6#~;8x~CwdZ*#M!S|`Cs`VO{qh)#i_v9cKY&+} z&nI|R=81eT2@8Pjn5&Jg<9F#SAN@4e<#BM8uB+ikG;W%A#rQ^l4Qz)@9Y4ng_$|xv zx#`8%gfN|h37Mx+9Rvs0fik(}CspqD^c6_lNrH{7b$1UxeYzNo9@guly8@Qty3~~@0*bv*5gV#D< znE{4;4{QfLP(8ge%{L<0ZU^bUf*f;a1lO&thwEOaZBbmeFoMHsBe<^SKY{CNo$|uC zuJS^8VO$sdPvE+f4sK-b33oAe!3eGso)fkUg6%|a>*KoMkKnpfypwR;Dc(`@w?3{@ zT-Z)JtRo}1?vVz#&VXj^du8^oS`Z$Gb`78N*fl?h_3nXgjS9=*yx=(bk1OE0W8;v) zt(pC+BVe}NIr3kez*$VLa~5*}&qd<@NIcg#g6F;h&wT-&I}e^aLcboPkADo$efh>^ zfheAP5Snt>(|E<5(3>JpqV=V0d5S&e0Q@}iotYoSbmx$*eCF6%{5Yn2Q1lSH80@zx ze z>=(wxnt!W6j|)5TFVWRjeX>874Y>T;{1~n~i@Yd`>pnwX6t>6uHm>^|j4V7Cu1~nG zv4h7xjJ(H#--GSG0^6NK78J#HpCe;Jr_I53FJRN`_~&%6o!Tf|*T|BeG5N#!fHpV8 zbGpy>!5mB%#dEvBcGG_*raK$KbYFq#LSVY_!fovLO~G|;aNRTD1->g`Jp)#_1-(UR zxBVG%Ih(!qR&a)VFRx&)y%pSa>m7~2c=#=eV7kA9>9$5NT{)O;Z9PmU-&2bsn66D} zGjm}C({(NV7);m9oD#tulc+x#tS#&@l{WBQ2fHhK+UbH^@Z87Xxn|&n_syh^x#sb! zeSs*R8&dYMIizBZ9YvvS)uEo|C+Hs)Hp}-d@Vv6DjZ8cy5P-`Fz%n zDBg>d@B1D+CoCsS_m9DIjlgpsd<)MNgF%H0iou^hh3B?22cvjy2XnDLo|B9#iszna zfafN1FJJWt&w-()alZxiIe2c|kKwt*!2Ei6?!|g|PI#>$o_h)`HXnTU2Qb`(2%ekB z^)$-3mwRJ*{$cL76PD|c8feG$(NXv@pgkREV=MCYj^H`r%!_!AwjxW7;<@$YKX8u` z+Q2jGd5@2Iw-~}h$Q5(AJ`X;Utc{Y02Tzj* zc&=Fl&o%vCJa@9okidz0c`4a%Y+d%Vk8c+%B^VvNXx)ehkY^WX~=BK`gh2 zdazlgzLcKOf{2{%4bEHAew~H==3eA<*^ZoUCu!-|W?^%9QBLgySyZxRaM~oO9lK3CI1D0C7h{jf{ts+Z1H>*>f{lE+<=$NejutIkQj zgySyZxJx+h5{|osfb{kXIr#c?OFTdj-Ot-g+p-vR7a z56vwMS=jg;f653QUQ-zQ?482Ut@tPT;xE`PY$yyB;-BO(;uVDQUGfS3M-JkDP`=7%vMz0)mJARtG@-2`A{Eu|y z+mS>2#+zPjRd?X;q8<9(JJ7Yfw@()O?fTAq*!H?BddjEK*O&j16X@C=#izzGd~S3= zkG(Ux>+%(VF0=hPHU`z`q<26EJ%~Pe2%Y0D=w%mCP8W2tZ}^SsNV7k^Aq`#994CD{ zHakibz$-Juf#;_-Lx{k`}4M?clOhP`)H?ON-**Iw(p?C`SQO3c(z;!Hc^^C)@8 zB!;RBevic8dEDHy#KM;n+nwJ%QR+p93ZDkKT=5S+M=aa0{?eYr)g&7G>m?@CXoLFj zbq~i^{peanKlp~U5kO3wuZ=IgZCH#p+{6|d*LmBlHToRt$-p;V`jCO2{g58g2kAe2 zF21_gDEgu0Qg>iu-8IB~WWbXk=k8Y(-Oas89d7PR_Eq8wT}w=(?5p**8wzKNltbZ5 zk#nSe;RvW&Ne(&sT;+yi!5hm^ODsdR#4^BXFphB(MIHcpf6phxxyi=dcU@UvgN_<5(r_zYP~?2ikuK{tn@+>`41F ziT&KDkiVY3Nxqv_^h?Tjb1zaZhcCDg?u^w+nETKSiERiZPYrd#tx!q-%6JFesqX=} zG0WN4p86gn&&UFD?FJh0s^n~-9VzG1hUA{er46G@U!`2Q^^0OS(>-4y`wro!FY>P& z^-Uo@LgEv{DdP_YX*3BAzEXfC`D5s>`NLasv(R8Eo(+)D0oWEqRgp z(N0%<_v>Qd+aN#E4YYTwt(9jta;)&-L>0au&4aAi{cr*~S-w-tCbO@EfXw2j| za?*dR4xN^u)^$?!*2titPjGysqL(B8K1bH9;JXha4^j~FFC5tV~R>V-Cn9!*@+z8I$-K|X{F1y1r0q`(`}8lLea zgSX)vv8VMz7-L&^7b{A#=Xu^k7-Lp=sH4a|F0rSf)^Ox>p!;ZlgX@F;L5!dB;-j6+ zayQ=dMBb;1oHKRAPMNW%k`qMoR0Ml!lZ96V9uee7tvB95MfKDrNL&Qt2QF)gS*^2q%k9jv@WChc z2%d}s@OSQC>eNT%L>kA6h*OaB(Q%$_jJt!_0DB>esgFFdo77a~uEEPgf1FATvB6TO z)xB)?H|l;zEXS;#_0%u>)>Hp7d!(^%JoU;xxi+2HZ$pO?W42v5+*PNZ%D2Wb;=8_7 z+w#3Biq$ip_NmW3pLV6Z48MOVFCzwEze92XNn0_-zV-BHnLWnX7gfHcxTiJB9nJe* zhu{CiZkJquo=hmbF6_8@hCfmuGZ zWQZntu*b76o0t}ZpE*3pkVA#UAWOd9hOO(0>w4MLeQTUQ&P_=icHpKvHQ~*dTr3Ub zB~N3US2o<>(yxS{p#gq|1Mo9cPH_JCmYh%Qy~ME|koeWP^D-Nd|8jjLa$Bx#*qY^% zzNLBV*iQ_812OoO#NaF5nEuV2zlxvT8>c^**l6LAs3ktSiumXn;-lNbA7Q0EiSw@{ zW>(r9JNKE)&YTwlFT5S@rp5gCair7`FIz>tY&G$*5?|qqkyYkJ8`x3!O=>qe^*Pas zt{hZ`kF_Wzo#7{}wuP?h{G9b{HL_^zJWGjD4i7wAjm#T6@9E5%HgMCye^}kFtr4$# z%I4_enD|)V8b!IT3tIwjuUi$QjJQ8g>6HdA;eU51u`i9(``FXT{jM|&{&jZ6_wS!>PLtxbR;Ndz9Mm+*XeG~q#A(U@pJDcmO z!KnMesQv!ZTJ2AK;yJkUPWfVS^DUpg3%1a}36uHGC;u@RE|g&P8{${@fxm?NWEb(P zwZ)1)1FnID`vUpKTdmU3*%Bv~ZVPeG9K4j1kbE|M9vC2_Yi`IaSK zb|&BOd2s*C3Btc3v8`Vi=Pd;T8@ZUlz&@Up8ZhKqa$QI~?hfkznEV&Qha$WuQujsP z6Em;d44&-_atBJx>`b1o8B_eV!Hu$%Tn&vpE8yM_XD6}W%Y~a-kh{E6g#% zrC-F}ZdK1vPvyWU?R#%L?)T_1*{Ab7 zj;+<+a;}#n&&RP+-Hc;J_hQ)2aPg!NUuq+swUBsE;aDjo)^jqkYQ5p=$@g-sOd^JM zG~+NF-kr(B&<<42Y!_tYU8MLEci855&Wun=2Axzm|+c^ z4zE&2G`M5Lzy$d0qCH3FD0(mQa&)5)k{_)XxjK5%4`j6`8eB4BU?Ti`->Nr&Q>K6~ zy7x^~>t`wY0P3F?2yW%r^ZgRk`vlj_Ok^v4XpKI%c*cPXz;;Am2WLR zK1*;b+diFMZB%tM>Or2{4Zww@Nt7*1>Q7tzHyv)Y#ir(N?EuMumQQ9 z$l|%g;ySo@;asU>+)PEr3?|p}f%}{CtE}dj@TpwFn}=+#L$=o<+iTz$swF0UC^$Nw zItGKSyBhOU_!XF^3Z@BX-)g>l!8s9}w;K6S)=Ri2!#u~(;bG`SId&X99)@o0`bXi_ zL*5{tWPc6gWHE8AlR5{e;3rQFV<3ZLsbEEiaOdTdH-h77V8||TEY^Ux-$EXh1_rAZ z^l#UoAT6yX`#LeUlb(PFueV)W%p5+yb1=DLg4Ia$cx&|W z^TgM_O8o6>%=5c&yq1{TF8mjMyk6APljEJJqaWvV;l6|yuM79u6`h^|??FdoZYnZ0 zgl$cyQ214d*S$&jRd%v3PPK5Jo%0TWHx7WC4+{PPho1po2lD(54N>$sp66L`ml2Pf z=hP2@9}}6|NxWhMI5N@(2L*VxzQ4)!(~vj(7vgbSyM6f7;9AMPlwT#3`B@qKjV8vm zfN>Lu$F;E~9(TGIi~94c5HDOe#>=k)Ca9m_QX&(y#F4x7_SY~jo zV7Ea|35TBG#b3*{BHSvC*fD>=r}jTsMutSrz1;z)HXPYS)^ttv=RU54V{adr@JWS?IMY7yRNs(4 zIRBqEfy$$&O0i!JQ%3o)qu43i!OM3MJ8o`<9qoSDaWmKv?lE+v$aUdY7VMae3{FAz z3NN1zI|^Fb@3?n@=k3Z=)}8$$Q=e4?1mv9k+lTL)1qp_sU6BkNaUq zAII`&!H)ke5u7XiNbq9E5Tj3m9ZSGvB5xwVXve^gQ3iJOVm;bk2X+)3mrC1T_+dvd zs2_HeoPieX55lpWsFM4}EgXNxz>b1-MaD;f$9huNb{}@6u638ej;UZ%qfM~s6|p0A z`FL7-QrGs&U`N5gf)#s#P5;+o$5vp+@0(!9GB0*4y9(^s6Pf12j=hj=SBo7>1v}D? z4?7C~aT@Ji4m&0YcD&ETj!OkQ-fLpVR|Pvh+!Q;$=f#dmV8<7bWlO!-@oO)3{Mw5h z*HO=Qj&Gt4;qL3gR%}*b&Ya_gO#eC_2@L9fb$z7}!yGgN}h6qsqU7t2PQQN#R_MZpOKs65Eh43EZ8v(jBrKXWj}ttD`LliCU)%l#}=@o zttocAI)1(@V@H#p?;>_=%Fnk4e!k?(@bmqS8>jxS#*Lp~`~Pvkj*!^7x7WbYXH5@j zf*EIE3*0iS@AU_;2kyfjD3~tRn>R!3fs&*Aq@O)d@@Dw#ftBb*$pJ8eZLQ6*YLXwW zOJRL3nYF#9xNd{G3XEQe+!A|WF|sI@d2r<$iheEjzUx>^i)jl~8abEO3daw!!n6fe7`DKV znd4vYwFQ3SwFSQ7#dNPAPn+5TH&C}PSB3C93%|F?xm;`50z>_5fu&wspxm3-0@oRK zzHg2GQ3tZzXA69#5!aO(HbCJ*UP@k9a%s5FUB(vJ;1*k8q}LW$Vc7i+*u)m782i4b zJ<}Fw^V$O8OlN*0bDS&L0mV)ze8!WyL|l<`*~ib<6xT(7>&meQ3Ll@?19xB#j8S)i ztIDuRon}2-<_cTjNbCc)6PsWuyosH`b`OK?gm>A8?ZhTH36AUmj9JqrSgty~*lsS^ zu8=wef4+)M?L7nARj5VS^29C}4n`8YpkTYL^hI(_o7fJ!7uasD7u((AwF{1*+yiXa z0Jck`jd9oodvI*(jo9lrmY++`3Zoxl@3VMD7+Zxt*S zgMK#F$J}CbTL&I9?RX~kQoPtp@>2*F6HaKK4Nq{L=+YAGYmzVGDE0NAu5I8knfLaj zuI=D4(~cLzKH>c{?Rv+t3rhJoc0oDrpGaz3`3DBi8?b2G zP`FFS!Mp6@n2g7K?9B#`sdqi6+RM9KgI%!tDe_tvJbmSGB}RZrBGgham+3}ceLKffY0u#4!!9@$nX$?e4Da$r)<}cYO3EQY!Eot0w0VN< z0>s|8QJn~`t6pn|OBos3J{ZpBU^th9;9L%d?>dnAk8m{yYhoAN!Z~%FBH(AH9_)hK zsb`xXwo9kJYOxD)O;`FOw##;2Z0EBJ26C@Ho1o&g307hgtjsoTf|XvIU=a6m7_8Ua zCV1Ge2?m*Vz#*)I`#Ac*P{L>S%Qitcm%(-NUTVRD@}6o3UTPQ20NYJ&vMHn9n^Ufz;Tu(>@@#^2R&^<9eVcEQyLPaSigL*TmA*y04&m0%+~ zj7`wsL%tyv9={Rf)G)dFmSE3|%rv?Bu9Qz>5_XmR%h&{0!^PM2kMZQxFmc`UUfyMc z(;0i?3+xwMSHyYIIq}W%Xz>7S6!!DCg zV~Sx1#J|O`14ekB_wow*bM%Q#5Zk`nvvFE_CVg6pbm_92E%uo2rewFg$QMlAL_vE40>B6r^XKVN?qoLA#r_Z^81qmFgo zqu@LzHi;9q80`@2zK2=&UCOZ|toxp0-FE@U-lzN)Tgi=9@3q}+z|Un5{w|UitwH#g zS@Z3TZ(KTla`~(;hIUO-$Fk;l0_=5grJ@%P4OUNrzv94r*Nr0Y1?#X|@KJo6b=b$p z1ge|yQ4|bluJ6XN&Kt`*Zwy<7ZK%i1+S{9~nf1mm>{@)aNV&&19^*N)T+vU^Uh&W* z>Q7RSEsWOUX!E*J!L%X%6y&~O4fgRdvbGaX8{#_=@7^W8gmC=sq)w^pLvq|peQQ}a zmHcRS#g2{-V;}klUFyqU7E4>#-j>8Q&ZrN3C;6<7g6~q{eU&_BbE*GYcwaw+*Lf%H%QZXckL2MvW%N&Se(Y8s8=b^H zX;0dZcYkcGA;)<>VhvaFmMKb%TXJXg2Iu%Vov#Bw38!-%_-+?Ioq~&Z(I3ghA!}Ht zX;1c@rajqrC+|fg!H^%)XNxl7^>O6Xn9CY)NPF^||{J6a;=EH?oF#;JXzu2t_xufRG}8;MzSS`2R=7xElB;_l8mt(g;T z8@@k^``AMK*BD>hX@4$QOwL(H`}6#4c1_oNrA~_*{E5vj(pc|3&bpGwuX227r(v@@ zR)C$JI=52a^WZUAgDa=LBJh~32}h$_WSu$M@E?q3ty!>_*x7_*G#b1Z2^MjH#kR@X zEb}aKQczzRbv+0E6i)fA)b%|0)ASb<-z{u~tSd{oJM~MsJM~Msp8BO+PyJFB8;j&S zkTu^`@@;|b27~Qn{j?_Esn_7&GnlpeA+lzVyz$R}RtOKb*mDZu;Fh&mGyhpI`+WJ& zHsLcG%rWVQqHYHpiLY8O{7ct?tx~~O1 zQyZh`XOTsTG)ORs=qi zxt(CTQnrSzZlt1brB7vkc+SE7)vR$~kHhu{KJ(>23j(9s!EraRJqJeX!2d(|GIn5& zBsp2mv6UQX4gA-^Wj$?CZXK+3u8ri&Nb<-$VqdaTPqitY2=Xl+J2Dho-1o)jVq~4j z%#jv_kC|zcv-ssf3vk!9^V#G~yO@~^Es-&0+T_acEk3Fwcx`e)UYlHC(_CnIO>?0g z?J-0XTc3=fI^LUMlLMy-W;hDolr_bp3Er}S*ThB_c}Xrb$$hqn@hADuMBb;1j~e4G zq(i7$HE@_Fa<2-XGoSy#LFO6r@G+A)NQ?6fuf0zE#csiGW-vZ9b$v!^F6L0~ZhSZR z_C5mkkZGKRZ>yN(sJrhdKTMGN=TFL&x&@wJd+Tk*4K zutlt@U&%i5FLvYjEj-6n=*CjyS{br#-yElYEAw^vMsH=l&NJ~GrTwkf#i&yZA4_l$ zZM;WL4dWXDYZ>1v_%7lG1IO{b$~TV8z>XrYX>^;>*9zT3}0s>x7upz+lnnk)_8{*Yq8RP z1^&#DtNbyT%qx9d$&yo3%2Sc~g1M$rzflGcuK^DWAHD3Cer~1ya@L9utaa+cv6rwP ztS0Ne8;rT;3x-`z){f1*Khq39ZCN{BXB?l#{TcS?rL48!@3)V+^mxWfl+&s{%02tm zcPnkTX^Qw8@>9xgbIG}BWlopuJH|Y8pV#+L)^+FNKWNNTz4}$=<;<}?vaVB4f9Enj z-(+l-u_p6u2lC)?-Yv{+yReMfR#()Z{C>*J**515=CvOYb4obdbl zu(loPU9TPjwjDk|_vI$98Oi;QCiky5KY87l0Y-lEqpksZJ@FF_#pD5AIzZpP^;XxL z+)w4!5w2dmFKfB!cX|NZ(m`;`gJq@<={pyu?^wZmTxV5E6(zv6PDxM?gK3Veqz)yz zw3ju}RY|UJ^u6l@wx*L{;_+6=6`tsN+8S88g6%%u#c|$2CC`69&z~3oSGf}5YEU9w z)2vahBCE}Hi062e=UC6PYv9=(cQ7@0%?4+BAzY>gR$kML*8U)lLr2(N2%f*3RCarJb8FK)Wz?<{F45a$JRzFqrqR*06~d4RSjVD9amk%t*Qomw~KVUH+sbMk&4{c+BY z`D_c==3sly#rAv{9CHL*HvKQ9%%?-i?Uzixy*=v7#PfW7Pnf!t_?|@0``b8&+KOv3 zY@zNLTMW7)!7bQ5p7XBfyaeMsupd~^PMrxHmt4DI(|noyB`fZVP#2KTp#-NC%bq238Lef+Kv zbu^fj+<9)n`nzc32yJYnjd!d;?uF!GjYT&0x;+wqut;Rs*XlH<1AXIA+k!{ifjj>! zGJ^TQvq}g#Nr^2nWX6`_XTjWVbai`gc?-vDDU02$1N#P(XDSTec!}pipEqK^p&YAA zuxgW#+k;0$sJBoqA$Q)pY^&SZwCBohb%mrVT6nBQ3yV_pb}wXUJ=SGwz1lnV2hYyg z@z4d{58H)oPw*a2@*d)l$MMMEKFHR-$k3U{;yh&Y4djgJPp+7Iu}M8OJwTn!c^hmt z_iWC6{mCfxdtyfJ!&a52w08HirFj01pYYyka^80J#V4bQ1tH%Kbxyao=J|0PJKe7T zh#)su1pDHQXZjI(Yv-s)^<#9|Yh1s8Yrf?DeZ={9&e_IXF-pB>P82aaN$iXFe2g7n z*IiM>;zg-rxc2y$AfV%bM&tPaBC-Bk+%lP)FMm*q7+}8yH~Y*l6_wa6m5C zABq)Ur6_ejWAX^&=m}&=kBSY&Q>~Hi0_IbBWfjFIc%DndkDu~E{!eA!0git|c`D}@ zly4ySY_NM7F$LIR-6O~~X0_UgS7_t8jpMz_*BAF1AECBIjy+mF!qtv#QP~KWH7rnz z&J5C``YL*-p}AW7*qgPEeVzJA-pMK6$!5N*ms$5&%6iY=n3sRboctVf*(1zr_ppC2 z`%5|J2XONyTd?~FF!N7O2CBQkhqIXz9N}HeWde}}v-DHz7^FT!AHSiE>Et&5in?F)j)}L4H+zsd`7^|h z9sFrmam>%(7u$dQx>!>}Jn27fEI#?=oE^EPn~GNi#Jd;p9j)XYEFk7#K|m|6YvXx| z^4r8nEDmsB!)W7??@01^*aL%zr)=YKP_E0cXq~YM*!iwvC|8vYas{(}w|tPRDww>R zuLW!N_wAZvD6xg@o!YgXv$R1LyQ|BnY;82MS>)nJR<;2-+VvKP>slq&_15fA^>4FF z@#Wl%{npMi4OL&I+#mcY_ue1;nLIUKoyha)PaNf7=Ggs-qZ~6eLG4O>Uox`vDeToh z5li(N@1Zqv^1O|gbjd+}=c@KfuTNm+OUL!7NQ9IU?`F=s%o;+(iF?Pfb80!*Zb8$15 z8%lrDd&L{;R)sQW0VC$n-xc_^5})T@fjyg8E6;<>ou&LB^X9J-1d9iH3aNK2m`wbX z<=ur6Q!$R1iVSd@o}aCaQd+qlQ<7ZQTfOn*Ly*+SX!qG*|*k8`y?h!%Iup zzF$7dRm8XbW%+F`y*$U2RB^X!5@UPF&(n95gGEL#?gW!O1a|3Vjd2xkz1fxDFHo)D zI@0yo)?u!vIIn16pc?y)Rg2$i(-Id2XtwtQwa5>Hw6?YhuV=MM9M+XOd_LCrH@jqg zC7d>y6O_u_=sAwtj?eOr?KZ*K4%Z^Ea$4BB8@u$((Xg$Ql5qWhw2ib6 zqc7a!{$Z?d%X26t-o;R#oy7>@;@2 zrRa++OVNC`QeM|&)4 zwa(Sjlpxnz0SW3pMX+!y*Mqm;tf7;@x~*IVR$FNv+sA1Kom#qp|KqHRHa^0lJ#Yy(^+jtL;&L5CFftr%;O zrTJ`$hc})xHlk8_?hpJiSbMm;U7Oe?gmII@_{nA*Wig%xFwVX*aO#Dr9{yX{XXTiU za~NN<0<|BRkNh0$-2QVx;Pw-YwMy)}`&gT{@!&<5A$5B zY6JDOdCzfPVdlPe=|zK%xG9%aU<0!;8_jr$7y}Ea7*mTKHy+Q3g z+$K2al3kN|2@;Z!dC|ieT61piLJv9{BI}AB&`kIG%j<}+=q3H3|zFf;`U5y8hWfvxeu>S9p?-w>zN(Iz8Fsoc0Xxr zIyQbeXPOZw_I0tWQ=P$-yD<3!KpA>%^9Gm;lxY_bzOC~5}h z`|SOLu=m%VvFg?5t$NkZR{i8nx%!FhT=L5@{zft$;S$)6O=UgylrHFgiB0Z;&L7-4 zR-Fd705L|M(?fFgGHgvRFy^9oHe!ET#Ms+RY}atG+L?j5de!J$y=F|Vew6e6&X|p| zrnoO~-e-(m6>fqCu*)ot$=a)M6DY*2&BXrt1Zzfp^Bf#c^fb&MH!%H~hEGBiw$8q^ z{}{IGI9r_O32e@N^IEH)GB12(fqOQlV z3v1QfK&vlF^iCvEXAILZ= z?5C&_Q(NCIuIP(-uFQJIl*sgQFh!yK2dju|uM4&5^^rFHXpBuSV{W{adGhnv^h>y2 zxEiKlOP4V_1slBBA0yaTfeer}*+|aYCbD8cAjhIS137k#`JUYC9UMCb)_*@Mz&O@Z z{L|Q9#~A5K9Ldn0Hu1&r)baiwf%~8@?Su)3L7t*N0slci+Usgd^a#(w_sEQ+4+g1{ zk9GA!fodK0{PQBOrUa>V*xmaxzZo+*K+R;1GIScp`#7|&%s+1J$@h+oX+UlsL9X>= z{&O93ny$=A>iQ_U_@5l@9j=K_O5FtU75Nh1@c`cOSMXW{63_LOT02HK3#7|e` zb}fFn;_vHQ4>&r;yC#6W&{z`~Vy+3G@7?0NE9(RK_;(4Pg8cW%>U^({uE@j2*e>e7 zV&26zHodl;O|R-?)AwT&?hNNlI=O3Wdygc(>!L5mLGolv4sF38W)AHU#CPq$<{qOS z9(Wt^U9sN0i{FrUG1i-RF$NuJ^7Dv)RT%f(nR|W~9l01kEEhgm2e9{FnnT;n?|3nX z_73<#W5}URer|j@B!_m-EU=p`dewIJi9g3WZ0D?t@jN3uP4j4*ITN4bTaf2o$oJv% zY2L@$M225{S69{>$2xXcr|x69^TJV0E%*tKg{#ukk|z9chM{x46sa!&2uHodx!&4}@; z>CYHC5?7>fZ58-1UUF%3{XSc~ffM&F?^smH+QoivdH=UL`tdzE2F~jQmaG3~j$VBr zhxq-?>XG5#yaaGwa;{#1ZaUNkoYyW_Ux)t6pxl$~BZBdcPIbghSe08^~x?sE* zFkYl!Jot%N7r!KzHW)AVwm|Htf$G^cQH{B@XCP;ekmoxQtmnYKa28wM6L~h3IS)3( z1aMtE+c>tdY-8981|tVH-^wU3*BxLmvCWBp?XiDEYbTL;!Vz!^nfEyIE&iTB;`eD& zY@<30{PIOYk1PFz0jh@8M49gKY@EYWLT0C-lK4H2S~AkxM(lbLLEr zUKO0HUkC*=a$YK9wGf%KuURhbM>!_8_fE4@j9l6iu)X%2y_dN_ijhnEeb(~AXkT#g z`>f|h(g!n_wwZ6c(_i+IOFM;c;Rk$_TC27FBeYaFr<@kM+I`Mma%po695}ce`L>(n z(oR9HiCtWBY5VeOlS>|bh zR&61dHrUQ5Z$u}SF;?Hh78+?_eaQn$U0{8mPp#HTZ5K^U+({+e{x_ z@STHWAK-^!_~?S?qB;I1J{yLQ?r6bX8{vry!bcaMUn^LRa!70Ox3y~%n0wxm5};Ot zuV!LLzU2Yp>3aujk}KOkm$r^Po63B30`tgO%80?gw8kZ7>pe&y3>-LmB#U)-YoCf4D*}?N;tuFqpg>!Fl4V zEB{MbyO#GRD^F`6h9GeUG6{{5%-Ho_cVg z*aPapcrw=}_TMjVKglgzTC(4V=}N(LGN1TWn684cxC1%&t@U5VbjOo_$8`UH$8-js z>vYXUJjWb$?7WLU8~!$78DCWgkY7ivCZ4Nh{7i^x#B++|)aH7z%T}$F{S}#2M`DUB zY-_OjIkEQ*!0uNSoUK2u!|8f}7{R+C3@WY7P{x8Oe>%ACp0~m2V*zgB1;sP&5e3kzfz=+R*5ykE&81Xef zjQD(Wj5u8|;@*o54Hovr{HordLx&D55?k03#wjZ9G0iK)X#dCAOa|JEnxq;xh zAvt<0ug&kQ*!-r0=cZmAo~v~c+r)Z8{5=8KZft4|@vME2Av5l`sa34&iXHGj%ih0t#l@zlPmR+0FyA)YGVOn+tq=R;Z?yG&?6ntO&pcmje)x2H`Y_j*wpz0D zoi*%yiGFsz?=EZS6Puy%f;PAHN%>ozkF4j4pUy|bXUSTc*apSkHx@42xx{Vl_$7N^ zFjy{>F&YV$8xEEm36{GbESD!(&Z7Eo++;9-tj$aY0}SmMtHxu0!r#?%ddx*Ehkehm z_jShJHz-Z)f2`+@2FpzV%jI9ha#J(4S-;U>`;M-v0xt^3GuoKo}@40C6Gx1zc!E*yr;7+uI z;e=;Kfj3j|ocs@FtyJ(FYf$v*U$^=FpMmG*$$Bm}ngK1?{Ptt>Q&QRvt6LskH1|q2 zzhrc18{}cT{~~xUubIsc+uG%Aej%5&`Ars^A8WdgAYbZ{SC_N-g&+qc{=P-KANI#p z*!^0v`PFoCz}Jbbu?3r-f#+Cvz68%@E4qQ_Sj#o=9QLz=ti}FjJcqsQ*V+88jOUEC z+>sa8awQhOiQNwz+GzI!kDC9n`(by zF zCpN<7HopninAfhnrm4;EpIl?u{MuZ!`5npDkJn~jTo-P@o_Her;<|7rFk*%mBlZ9z z_HF?qp2^lL&u7EU84fq6xh{ORT@LY}qW9OUj$c?8_Q!}byclr?7;)*Zz=*M|3CCT{ zny?om&Hy7W{TDD|jCVa)Fkh_V(O>$eshe}%Q+e>+Ab{;P)guPWldPX3&&pRh5Phy)|XseOTeopM%)cXO!C8syTORWX19nD zS$`ambOnrWY?{MLnExXilnr8d8$%i8>w_^k`SaG7=C z<~G0Eyz9=ldDoqNHovRFi0wkJj1fzTFRUQeaEGPEbzv7=6|%nQf~(?})`kC7o8Mw& z*azejGS-E`h(*Y|_YAV@8bVCFygJ){LXnX;yr#gzhTX7e)(ea+kIu5-!EdslxFL~ z{|=0pczKMt(qUl4LH`Oy{3qk{0P^n$Kju5XW5oZxK7juvG2#j2*BOa>2P2-Bu@c&d z5#uE%IOFD`%`c^?&2K4qPW8icZ-D2Pd+}TaetzF(>j(E_n`^lL%+?Pd$i8$9cO`hv zeG$(IC+C?R+4|WE){OCQtijju5_jcw z{91X=pNN8I-K-{Rv}kQ?~w7X*QglrjMW4{MPyT_+6FF zZ&r#9lb@4$13et7OX@EkdMuoGTt^8+^wNW21`gUifk^PAPw&u=(w zPxIor+i3gItHN`MCZ3ydsh{64>YD1sU&E0>R;4u3dPBVW$zyI`{;Ea=J zkyVX;evE-h$gmOMW&_WGtsdpL6YOl@IWW~_ZGP?$Z6P?!@bkm=CY-^BpWoVGt*`}~ z-x6fmLS)QqeEZ@DShF%5e?V-0`O@Z>ypI6&A?lD=_FLFigDnU1e<=MKLLYNE=N`@x zKfjulUYlQk@$;jv#QHSBb3=SKzi+{F32FfMa}YaV0{_oW@aE{jmUa-^TA~lnVKa;H z;W_;33_rgEg6F=wGM>Y3*l6>^SFpLC-w@*RoBH|r@Ely6Q_c7fe?Pz4eBw8->lr>2 z_`lYJKMk8-{}z1xy#9T{(NXWU|M`6VF53L;2A;G3D|imhm0CDggr}y8xru@2=J>^R ztd+Qqop5x7Os0_z}bAx0ASz zIO00Uli-ZU=C_lWj<{wq9TIop%h^NUiO*;;reo#R#&no*9K=d_O7Pb;>uVvV!+muz z9p&Dbj`GHs4yiN3eOWxW_LpNiD!efr75L4{*k0p}=~&Y&rsG%J{NTo^h8xGgbMWI- zO$cekbBcxB;4*FuKR>Yril1M^r8d6_*!*UBZGNozUSjh*5@}xBDXOW>Z;8+5m(*zU zs~ecDA01+1M9DY4Z+N!8e`L0qZ+s#7#usMmr(D^(@VcK~f<7kQv@;w&R?3iie>38ymt<&4FOOyPov^elnb!57cegE@NxxJTlBB{t5NZ#)zn5CJam zn{=4wrV@at{u4`QXk; zjk(58=4X==+@kjI<{FoLU!DDPjZXjz&dAnlW@YQmbB+I%7^Uy>gwr$8^8|HBuJHsT z*LZ@FgL?+|m_khNh5zv88ZYqW8c*`eHNM-(HJ*Yk`OJSr`{f#kFRp*IT8|$7lQ-9R zcj}T{;M3cyom|9y#}G$Aoo23a$t&*5H7;@Jl51Qz^d#@MnR`5kSWq+9_-^BPdqbv@^BkFa zNv`pc#H#YHA89Gq_-MtOYh3cTNt~|aZ1d$BmsoUPu5t3i#|l5`rMbpGL6&@bujCr% zdBRI1F+>s{8wO8NW3KU=%v|Gr{t~6u5i4DnAo*oC5x2Wd4JY5}cgV29vB~5bw`hMu zUX+cESL;G0@4+6m>;d-oQ1n)`b2mB7Q#d|!8pk`4Z=B;ppWrx{svPuqFQL2sy}) z8yuA6F(CH#_{|c_9_$7r~`guk>g*SO0+*SMLRoLu0Z+raM!@8@|EhiLF`f$J~k z8vlk|6XRy)8~;Y#5D{yfAEsa*fxmaq4p|>u#((qzt#hUt|jio4RVbbvxv9+sDs) zW9Zz#bvIhrZ)N|udCJfs6DRh~x7b4`rzz2k{tysT7@l$swvi!2CZ_jI4^)b7`cXMv z`P0v%B%bA#zueugGv^NaORIi0pE&jVqv3KQ&$*L4=jpU9`GO{r=e!o|;v~_-FWG-=L#}>gQ?4Eho=XD5)iuCFQk$#44u?cBoDzAQ zKc4drgvM#&k9fzZX!z%&)lcAO{Ptc4ym}6`ANIdj9teSlEkrFKRy#Y=Zul6!Obqu< z_(#OwaJkjSHrWk_65B+!3Gi;LQ{!o4DSYXFg+E<5^Te0%lc!46jrWG4i$c{tw6m0U z`qIuT*e36uAnlZ@3nquEDjbtzraIu`D^>5A70Nb*I$FE`M7{8fc=}Pd)R{>AQf~rn zd}R%EzYJF)oRglH;44g{jl8lQ#mo72pN6Y)BYYmGuq}?3zG1Jti#n*w-H$q`+w&*t zSV0|e)FB*+lI!y=zU!yqaf27i^D_KyFTzW=v1~&zd{XX*sAnv72#?<5ws`j#>KS3y z0bfc597T~vpIdW%1lO+M`MiP-d;uLe9iFE=I7JqeeNimmq1=n`ZIYXvZIWjJ+>R@# zcLiL0Vk_GQw~E-sB8lOa9D~9eLtb#UL2Lur;sXM|z3`RP!%rbxzvZ`D)e647DP_Z4 z+t_wz+b|yBl9f9-8{6>efr4DoJ4BcA%NhqKlvixSx12RW3;d1+&j8ORMd;oJ}K%}Z{LJnCOSdolD! z{`W>!9VuI1yg-TfT#H=F<2eP>t~{e7$|sm-9#P=KqHZbgpl&HE z)cvNSxZ!j5bU=(Pw^gJ!xk``clF|vp=?8_!_;qQXs17QOPxv7FI=;& zXd}=T=>98u?+BOkz34aL@x2%QmNH#* zU5aNf`c3xjMZaD657Bigo~O_|5*oYfJH{~G{7~}2)+Uk0MZu|`eBgvTDMSbwR82W8L zvN%EN5PXHK^yxPlUwsVy20x0S-{6cf^c#IM>L%91&~FKz(T09Ad0kBXw&AMun{Q4d zIxV$eUgj_9H6Pac)p`wmmdh9x{U&QfcfID#)mZhrUi)3IAsc?zYrpHY-}Tz> z^R?gSYd(AA@AI|a=WD;u*M6U`U9?C3K41IY4*6f%4tc_`BQ&)|N`8ucti7FLU30u`6w{t4_1l?&CGyr%H~$cyj!iIZce~-jL(51`l#IYrk6*<->PbqqMUg$-3iq zS^o>re@+-b|GR!It@)jxU0===qdxMdoHY7j)_KC{N6e~IMnBAU&3?qu5A&Rh{V;Q{ zw3Op+faJIfb{3KUCC5!jEakbDl90}_eVTpG z@LR}lQDz(R;)Ga~+tdG`T*Lj3NdHTlk=3@4QYFAy;vj!b+c0NI2HQGvc`RT})S2@3 zlyUqdr_EqX*Tt;aF2**!%0Ye`$LcIC?89s=g4{Pf)@5nE3bVEL{6ECCgDo8vH&_A} z*Klq=|0At|i)$^Rs~oGX+G5HXl%*aw|0gSfi}B;&m`(edvWv3OMtj=mN*V#E4I-!@bYbR4Qkp3In5la2XY^Sw1}Z{9|O6ML0WtM54NOp4Z!VrkRlx!3aC zE#wgj;d!?USa)MrwnuHDtKR0hr=}d7GB4%rVdGN98_z!7(rqz(=!>7VgsckT*(>BA zvXFZygy-Fs|LyqSmH)o$<-I9$=V#8Pj?=9Y9Hi*E$|IoNCr zmRNc$#x}i}Jg2L|{hmX(@f^zN%ht^9e{Onh^XJf{4)1daH=e`5lJ1L|UTchfo13`-1PkiH@pAgCEXQrmHx{2pY`0(-*EpU zO1gJ$q0L`>_rrhH{f7p&Y4+|N&F+0vN%z}Y=*KU<`w_q4-tR2w{zMCH{^Grl`gQjn z()_y*Yj*E>@0Unw%UQT}r8P2{iNHy?(~%X)51$t1q{qg?lPqx@|u_Y2V- zkweY_U(jt+0({99% zF*QpcpNsEW=PW%R`8U|od2y80zLPR!Ty7Mi#|cQduycb?O3qyA<6rH>)I+ z`=~5HN0C=gI95u$xqp25-R#~RK#}Cs6F!#P$f;LjbClMkN2zPbt=B+qJ@VDM8pxwp zX9+7kY6&lu+|*STdueS(uvXW{uGO~-(W<-{Npv+iqf2UH=o`=6r}KHe}XxYI<#R8Qr7~@B0ejKKC!lDyhNe^^$fOt4*%)(@!D1tNjI= zXm@jF&2Xn4&^Sh#>gaUd!64%ugc$F@mk;rZ`RWQBCv;Scyf@e91&L9V*N78wUl zeHFRtQk6^n1GDfAOa<%sd;_D`DTjRc>M#DXy@JO zclX67IP~4=t@_TnhVg=L;8?3tay`dRfzLlC=i%7-mXh=Qe>^gf|4)+-@0rXCl;L& z_#9{)dsmJv57z#Kk3s91_$drm^y~0fC?NhMJ5o`fB~B%Xc#L-vi3cIR;wAj3Uc-lC zFFq8k$$MVM{{cS@H|y@6cgdUbkS)mY;jY5pehYr$*|c>tZM{VOD)nwu#9uMa^Af&f zcZ?1vpE5aRBrn@!h1{-RP_IR8&AR*NPlT&av;V7j1^aI!Q>gkbilhKEba?Uf<@fg08 z$E8Bwa2ltK-UKDHa1^DB= zNWJ1WSb)#t$K3PV+_U(vw5G0T>d7lsu}6jKP2~E9)3(ucN=4A8RKg?W9u8XJK65RS7$fAJDK=U{0X0m8ora-9!}yY?CL}r zSL9`{!vA42xpjZS*WnDlx__D(AbEnx(;S6=6FwdIZ`?O4%Gmch{u{FIb^JFze=<^i zo%8PHorIA8VG!@=;nWDJ%Tq->L~Gj1q;C8Y4IjnM)Gx)Xi>y!UPs9H<>!|Pt3 zkpjl7JHnxgE_n=pjypz2s(JWx42g{3Tj8A&*OMLTP@lx7<5hfS>=wo-J{@;3-szJk z3tuAf0jwp~fS3i3#3npO4hsC?+~VUQepxr*m+=vPN=fuZa<`H5+jGJ2y&(4>z86w{ z%JAz*ao4tS>i5_}J(AyDd+oOn_wm5L*L{I^cn9qaq)qW(yq<9*KK7z-^UA*Q z^Iwefi2twn=FP=-Z7lwa1&rAT8FzVi1*#8lO;%a9;lF6#il4`lHd<9MKJE170REC+ zvi*v!_$_u6zr}9{Y76mOT-n<6TaS+(Y7EtYTU zr`}Hen~|aFeqtJe`M$VU!+%j^&>i^tuE!7X9ekoX;R|*x{#X9~i!1T{y8}+Myiwum zOUS~HXe*vvh`YvEXm6{!;^A;Li9YPkSB#uk)yVffQ^VCkaG}Y2JAmw4i0rh(Ln?Bp z6ZsV7e7sR{3_mSs>FDX8ZrQ&;O_%KRYd>HX%^oX1knS~#trz7`l z$S35Z_$+r4Sy;BYSY%HC@=@f_0>d}*3-vH^;RyFGjHO93 zro28MgON|NuR4af1!65~h_w(u#YtW5t zMJ{=DqvYVZmi^bUuM++EGIIM>f4$f)SQ8(<5`8HBt_3eVMjiQFzXH8p#kVVYR2NaMN7hPiPtl8cUcD&yCS%|DM$kDc z_(tfH*LQz|k+0W{EEL_CZ|K5kwxS!YY$ac0Alo(`pKg4Z=OAOz-Y-=3@p}4nV(k@l zq8nYf3|+W^?KfVXxD%at13EDi9hJ`h&g`#ZT>c4p*&6-V8Tq}4aq$$-=H6)$jGLzV z@bf35%zZo?Lr3zQUPm7q=kY9MUln6_5c;Hwci-Hf(WeV%^L=JLVNv&^^JX(HUVkz| zeG*wYe-ir`i%+5lJ(D8UKMSAX?f8?xknImh!8+;q;+e@UL*=prfaHuN8ThL=Rj=xam&y;!~(c^iu^jW=Qe zMBj@4{&j}_i}Og1LgBvIpJDP5pF$3a@4mn86Tkgyi68AmJgMltof0?3coeymW%`eM ze17}nH#hX2j4h|(x4*tv;*zsQ1*qb$pO3y9FV}7z;yU0m^AgIA3&M z2Xx<&kps2EPi<45Ns1!xYm^#GUg1BFa1iS$e*5@b-=*+g6;*uPFMuH>Z{1IPlbhP4 zsO!;v9pR%EU*#+#rXa~Zitm3Jc=T!XOh@wJNq)Ro+KQts^q!l0^~9q4@<)WLe@5oL zc$)(mxlY|VTA{tI>H=ic_4Hxa7<{ZbZ+Ct;`C-G=D&AMA66$#f`6zlVAD(s5Rr0?h zGHeBUFQ0KE`bxgPK-!gWQ2g4&MS#J^s2m8qK~R%AKfHM-B!f%_Hw+X49}GOQ!A zF<-u0{OfIAJta6>WHYkPbC~;<@?oCG3S{s`^q!PAQn!>v?@dJZEk}-YK$eQ$D=I7X z>OE=8r}uom`;rS3j&Gg?b_7oa^-J#0a_Waez|;MyFv`TqK2=7Uyp_m6?C6Hxll<7G z-YYZoUOM~;qVwt)Yjb@%&lnT8xJ1rfPUp>Srt|g<9Hm)^DLxQ7QVSsV_*kbgS`YXD zYI@wOb$}0{YRny)%*7&zGY*!RWAxmM#FoEAocY7-dx(8iYJir+d}Q~-Rx)^miluzkxoB{)qIBry#~yTG^iBWQ)apo_XLR^w?X} zyP0;LMz57qFY92Q2dOX5s4Izis5#FQUieP5ooaj!g7cUc!gEHRZ_hct*_Viyc$K&b zso%~Rsz*mf(oO^KZZqGAeQQN=cb?x8BMwdc^Mmozx3ZNuG#lGM&t|wOL@!ivzUYPH zQ}5KOT%)zB1Vuk^;x0|FcOsq^WZNzmUqhxNhFIjL1`3i{xlrd37Uj>UlM16MDd}r2p?AGoDEjj*TGC zDcXC7xEeWjjy5HK`#Z$p+?*U@9DfEK){$fL&}miJxGaHD?6-IZuzwcqjk8(YV>mXO z_Vy6__c`)HVs$=8?%y}d0mo{oI%1$1>yyU#c@P|NehBsv^g$YWUTiZj5?3VuUnI^b zc0>sGA4`t;jm6!S2)BH*xg7s9?L7^i9mP3M(w^XvSDCwjD|shnrd$Khi|#BU{{Kbp zmwKr4YwDz}vU0c)Vm%V8+6#=5%ke)`uUY5U#MW&wcm-d=)**GggslUd!Sj(e7>C@S zlwU%w8Rg+leF66x5Y2pzxkIn=FN)RyVv6}*zpxJV~PKK(ic`=awlg`6PA`V7=0U#8foO29EvS5*0}F4Y^-Z9X^rt+rgTMaN?M{utZw`bj7Mt#;!@Uc2!d*o{wm?Zz$nk)(+qNrB@R zeMrvU|Nm;IM_aU$!>!uY_>w4dttD+(SMc{8>B2e|z9%oFTa=>ECz!Lh&%oa2FxIqW zy{2urv!o8&(1K>`S>5_&u^tr0dU#jy3s@D(npWuhSz7qtv$ZJJe0l|DYweR7LFfDKc^mLb#Q%`#i7>FRXzD%$bVV03hfz4{SNBy;;r9-&p{Wn z{+>b9@4zpli|MB#Yh(C!3}$_AFzb7Rc`i+!!#sQ>=55aGdaJC{IU3jLd}~JH*OAX! z8$JTYv+!U4YKw0{*Ktj+YrbC8R_2pr`sLQHNKCmh||ZXGz|vP6LLQ^s)@l zdu)A$SRiKxgFTkr*J(c{|ueG2?MJd-|)ohg5xVo{WmmY&V}`Rg-fe5uCx z`pocmSvP+}=B|!TeV5f7U#ThQ4d0hi-mi=U@p+MFlf^Y-QwMa+_n!Brw2hCBGiBMZbzUDG<2t{7 zE_*JkMBbn8-K}QKN`ITbzg4pSW^oL@T%Uby@1spiYucrc-Mr7p-9lfj-e+52w7uNu zr^2%h=h>#F959|~lW*9s&+=?jX=8x2LtiKJtu!5LSNK-&KWi>Cy7A1VzfIb^%(G4Z zettpc$vG?ZTQ59+b_v!8|ou!wU zogf4PlCTAg3azM}1V{+`?luF8N+8HGsHlWR&=F}6VjP{Ze%FXHj&xdvnTv6Frk!_0 zBMLSN^0tD@TuvY;*@0I_Xa#*g_vvnkh>rR^dtxIX_5pe5p~Xgkz4#dO&1;)* zBgfQOdd0ZSjJ4Kb#qRJK@b=-u-C?YeS2xy$J)PTRFVt~Jm@AG+DRRe#^#7B?`v2Ty z^&I;Dqq_b-)^!y9f2)?@Yu7BkW-ZRwq?vtfrbORSQ({el)@LpJ16Oj*WZdK7Qn`wb%^QY`|?d#$qREtFaCdbe@D9eLeH$Uw{_SEw|)3Xw}Ezq zW1wvPX>V(d*lKp*W-rVdY2O@KBU@#ks%vB5z9PaA(Sz6g9! z=sq>0cFRuFj00b;j@o~EL8AM!*%rdAJhOov?Cvv5liX*DqpHl{0JA|jKxbf!smm#I zuR^y!YULz5d%_vm56(2q>8?1n!hgr<754<@I8_9t@a}KE;!8B;67(p zA}6zV)!V#xfcO50-tVnRHnjsiU66FDLW?l0C9i|#YsBf5|~;h+CF(Z)V$ z60e@UBdq9kxmZ&T=4UUQm6L|Br&iHT$!f5^$5xVOFg)1J@X1d{v!4Z=@=4M-#{1)u zuX?b4`x)|kB_5uG{E*2BW8W>x`%GM%x{I<;>HqD{HrlbiSTF`>taTKlTcH z7F=G0ynH+L+L~#F$F{0*yuZ#7$30HP@O~=qHo+B|;USvPIp!fV2>-qiJllkRpf5OI z_NaAh@t$U6-|_g5p<}G4JnN9Fm@l|n*n`c+y}NfEI+Vu>la*y?vD@Yx?yjQE@2Ab5 zq0Kkb=6m=iyU6=B%5jvs{)0NFvFArRdbD4%w*CRu)l2(!q3%~9bKi*mY8W!|U*Vl! zHAQ*;3h(^EJvQ|Ydm22Tb!D#=_D6sxyJ{Zs;L84rjPcq%$Tr9vaQ1LJ?9;-2X)nxA zhNqOh4P$k_rw`w#Pgg5^t5v;-tiBbwb}Ra#qr|^Fq>FXHId5fe_@lxP(GM=4!uoys z!42@%_mx}KjquR2ca6x!@9}L<&ZW=rZLdIIA^SxPp-w|?vMbr!ZX)HLHJootJzn8^ zyvw(+?t8WRd1Sx+wCUjbz12^n+iJ(XweIEWJ(Q&x{$nfOV=L`_jB?z<_h%1mzG=Gm z1iGxTdfffh8~9ewTuqzvADZkV-5USlv$XefwD(8c{}F2UyO9Is+{Rzh#=oMiy`g$% z5#E*X58%%0I6LD5bj4rX7p2}qkH4HY_$%E09kj{%A;R~gTZ4OQzd~cr6!tWNe_~G> z&kpK$@+N67_NQV0?;$giRVMsz2K$1`z8O0R-^zb=if_Kvkm30+{JSIZlMVNH=BJ~%CvZI92{>M|4SL)b`xbQyEs|hM7iSkmbsctT3{FY zMFajLbt7CWPcQbDGH*P?d~ulh0?yo5q$Rk-K2fG#*~Dle1Se_AgC_Z#5!QYXNkuo>+LmJmCQOFaA-Pp*}$V&*fkFsPY|nH94Cm z#yg0z$zDK9Dc4lel6_sUuk(FMUc(J(uAlSn8|)+b2IngLns;m2f3nsl``enl?eHjn z;GNC9lVddbZqw3Sn~8rn+|yY0*Z&jom%u$8{3-jx(mzgCzN^eX$t3I@!ZP4L-c|m& znQ(aT!{=v_&pYakei`i1@vf@BF;o4Tv%K!6+z0sIe$Cll2iYU@Xl15)9bUGH^IZQ# z-<17<{zQM3^BoS5ulPlWbVXfVwYc+SUglfR;l0)9XoP!Tjn0X^eTXk@kmi}o_u349 zOPxHM;d9HV+br5s{Ih7=w7S>fFHGz;N!p}`9h*0v=d0lx3HO+Y^EiB?=+|E(AN1Ae z->u%?q8AtUZ_&S_1MuEXeZ+q|brF9IeM9_`X1Qkent1+m{twY98j14&|I8}JgkIz| z3q5=``8eVFo`C~pte~vB;5MbK27S-Mo2i#@od$T5LinL)_%@Av8{zgP4=3D6Ho74* zdBtOwBRJa3STvux%N%D7o-w$$)TI$$KVxt;wlr|rV)I`P|2_xq{iE(q_Zy6hN74)3 ztGFNHYFPG`GBM`mS;XTE_8NO5e zCgG*zIb6ElA85~>q%ZqMu7+dpL4KY0j%-A?)@riVNZ4xf(&Mp5miRZrXoFkY(A2AO|*3abatOv>q*}OLOi*h%k zyFHw+Qa?Mj!L(+W*g`a{esGu(TvnuM*en{bX*B4zf@?ls;jae=%)#y`o->;gIKOEf z=hv=Z(Nzs3Y#;l_Vh8Kl$G)=I#Cr2N|4DRO`OApMxIZ3TR>7EWBVO6EWYq$q#4XV6Pqh zlk9~xh;Inb<}$G-7Va^eUmhHO-sQ=v zKVhS=L+Q)C{o3Jf@Rv($h}*9n;bx78YYxw39`tdMr>h;i1qm;M)0A(f|L1&Pkx%Bx zJi~wAgubVS`K5*Vg+0DpYxQ@rQ=ol$N*I$3&^`)t~TvIv(y6iH_@-e2DlUcU)}vw zLyo5RwN0C~{f9ca&*r^)#@F(`Uz5DYl8@HhE$L zhy1IrZrHc_>TKlf9>~?X$XiV>#j-!@l~soO*ALU~UpFip9w--_*5oJtQQ|kQzIu}> zYX70yVS2g$JY%75-`I{l;~)AgVh{J-s(srfxMg3vXS42g4<&3M`27lSysVd- z!??O7;b-nF@O4-4wVajo^tDUeP4v@d`e_Yg%G|sdPK|kvaRV#p&#?L?=y(-^HjpJ8(^W*(~`y~WI7)#K$1CfUa> zS`Vuxy)yDyNt%+@!pejAE#5mS)6t>s(d}qj8Sex?!5v}qwO=8(d*7sfZx+Sy4rlUE z$E~Efm^nC@&n|U(wHBxzAFYRPmogJ?CSyGMbMHc#OZfNZGM2P$)&i~QD7KP5ysYOq zdJ4N{r#wh^U43T&(>qr6lmD9kK8|}S|9+d*MYr`H zXTIEvz3cU}<9VLxJ-%2AI4H+V#`kQK#=fktsCyXqha&gg3y!&dwgLI&4fSM2y!t&h zMH`C^>i7apx6k_9A~SoOv}B)l$uom|H1@;HAP@0hNBZKwj`YPp zls)dmKa_p$#9z-GZ$%DWNxx~MoU(81I_8=V=6yL|dYvOy$r#^JJEZDm&P2D0evST9 zAJUO+4Xtr$n-Lr6m=zmnpB)?6i%eOEO!9*3(|BUB5;@tgtzV*@=FhYzv&RBVpu`HXi$-c1takmw4b^z(NZ%=g3BTm~a zEpR(y=_1C=d#Tf1)UhA;*6Ff$eza-@GY_C#{V8i7;`Jt;oRidCB75g^HhMn#BFY>` zJ)($bCf*I)Kf6i`+okpHgXp|Ng_eTIX6_!@A_R^&YJjEAw5F`aV>&|8CzaA$bh(Eo}%5!(cClWw2* zJaS??|H&F`JD%6=7UMl@!Pm0?Jv^SLZMMz>dMg;KWiNdhr(0*Sru*8^IY|}hlcqa4 z%OTO*p08sQPkV`+fi65!7f<_DVYkiG4la@K0rW+Y>4W$)I8M7rSFlSV{k5F2_AdIW z`SMgVefZEs_g3)x zfXh86e&vm*0)jw7!gSv}rucP1;@PyfxzZp=aK?++%G^I8T_ z&Qa9AhIXu=U(TbSj)gZE2WKGto;d*AeSkdDR6ThOyfQ@{BM;lKZuBg24Gz5AHQr9AtX$Hl)v|2J)(4b)%!$MiI@N8_Jf03WsxE^I4!m~ZMi@f>Hh zGVjS)#{BJ>z}zQiyvZ4HGMBx{I4}N<)Jyyusi*#&JoM+}A$}RZ#Kvuvj9;Ynj6QzV zRW~h-4dl`X*7QhKjW>#Hk~6Mh2e^!TGgvGeyR}g~pDX=}{vw#UjJZ+zSkptyi>}x} z%Z6C=mb~W+;WOS7{Mi6bdq(iuHuN?4KUO7y!%vmycHZN#e>uLngmackXtUj_WBWz! z#`jACNB&+CNCLZk*jN(y=x9kG7W_7Vc`2KDk+t|berxiS1P*O0;r#MAZ2R{p(Y2pC zSQ0qtFX8-hzlwvyd4sWLEjVs3W6eOuv7_L)j-k7 zA&(gKXU4M3TfuQF#9mjvKXyrc|M%t!j_X1mGNxm%!vDhAn%-ZLrlfTj^Nrv)Npn7P zkc=OR*rCYyu$MAeu|@eEGS~~$FO~hIIX~0$XX;olHoxGwU_QIlr{K8v=0@w`Uh

dEB%#Os+~j)UW#B!9|F-QU!) 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%0DPh=Gl96^R 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

N!23riJe)B=| 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

DbS}Z=((68 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Φ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≧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≶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⪚n5Ve0Xw7sxio!hxmSI9*3zSde2HghSm6e<)ixI4U_+SzR_vl zngW0D%USPf9`#2})tlZNGx!U95FQTPZ<~Z_;p)W`!pG8)$-+zFa`4haW;EVlu14_9 zAHoH}Jsf5{nRw|D{mD+@>A4wUu7ODj6OFcB7?xq~1)X|I0_dazi1bH6kAizP=m_Sd zzX&?H%RrBGqrV6GFt{H8J<5%aZ-BUV^(WA&d=$TG9K#Go8HT`p2y~irIQj^jc?8`T z?h~LxG*0?tA$+%cc*HXYbo&1I2hd4oVmvvZ(;kr=4V~f>>4l&Z4zfS!Bs-3dc6Q+RiMX#PU(p8&|b(;xapf->Ng^N7w9w|%>ms#KhJ|$%_kcbe?ngl%CeRrceE^xK_Hh98 z(Qfo9pp*L)=%d`|3qT(MH$4;|#ZL<68qle{M1zy3qXE=`PI9EUMEOu7-vBzr8-thP ztm-mWwA+=-4>!fBe;i z=e}m+f+zG7t8fw_7oWA|E;bgF#lljYS5Uz*PUQY4UR7%N#%*EA;su71Sgl~j3FgGh zCV#Oga?1>*1(yxS6Z`Sv%GsYka@L=BUdiH$0$!^wE-a`lE-gT*4ds=wMs0D@MfXVN zIzbV04HXpy<(0YRm1P%m7L?_4d{}xLi}NcM=NB(6%`GjiSSln@T2NY1z(*ZhoHzl& zD8a>r`Gys_xdr9ri^~O`@}*_ulZ&g;bNRC*60UwExrNAGC5*hX$`VN~mwQPropAVx zyjD5mMB*z8kVHQRQt}p;)>ZkIHMkPilw5tAuBD945g1EP6mUW}yTpGSbY^<&c%ds@ z;{S=@Z-hV8flK`73l!2r@Lb|wa|QpWui)Pa{}E8t+F{}+o~$H{p z30*sDFK?#qfH?wuHki=8v$pVNY9mbIYv9dP(yasGuH(&A6U-6dtAa`CRq|%45hn4K z@MdZeOsG~_`MjB$2~!KcB$)WyGJ!WA7y%P%Ulz-osbMgoYh?xVW@->j=xkXkn9x&W zzJt8U-OHP)IQv4nbPUd0kd7JC2oti7Sp^g7TTB(qIG80c$H6RuN$KVDW@;8pM7<@G zHy?9=!YB_wK*{ z?*8}RyP44rNPGeG_y2JLVNJcoWwi$Md3TzR2xF~ET%=Ar3N zK#sEyP=#93Z`XR#C>F*BbPJ$inK$g;aGR_rW?Qh(ouamrS<%R)(5(#6S^5Yj3snE)`)3+6#p96x)pE7$MmjO z^|Y>ebuXcRd1t6QUKe%CYop%ttA0Yi^>Fnxt>Rm@L<61YGAWRqNzvbLUMzus>c+Oj2!arJm@L= z@ZGMYM%i*^WN%gm=lu)VTXzZOizjhZ(qiHNglH2b84 z{9AN90c<^2ZT*eh16j2yR!VDgroL_J zTc(~Br^(<30yB=zptt=Q1dq@#ZR(q@88>)%!%^ITW*yD;I^%9gB5Zs|lB%JCqsZ`m SI62N{YS2FDO%7q3Qhx!ukD - - - - AvailableLibraries - - - HeadersPath - Headers - LibraryIdentifier - ios-arm64 - LibraryPath - libsodium.a - SupportedArchitectures - - arm64 - - SupportedPlatform - ios - - - CFBundlePackageType - XFWK - XCFrameworkFormatVersion - 1.0 - - diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/module.modulemap b/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/module.modulemap deleted file mode 100644 index d5e34df3..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/module.modulemap +++ /dev/null @@ -1,4 +0,0 @@ -module Clibsodium { - header "sodium.h" - export * -} diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium.h deleted file mode 100644 index 610d6328..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium.h +++ /dev/null @@ -1,73 +0,0 @@ - -#ifndef sodium_H -#define sodium_H - -#include "sodium/version.h" - -#include "sodium/core.h" -#include "sodium/crypto_aead_aes256gcm.h" -#include "sodium/crypto_aead_aegis128l.h" -#include "sodium/crypto_aead_aegis256.h" -#include "sodium/crypto_aead_chacha20poly1305.h" -#include "sodium/crypto_aead_xchacha20poly1305.h" -#include "sodium/crypto_auth.h" -#include "sodium/crypto_auth_hmacsha256.h" -#include "sodium/crypto_auth_hmacsha512.h" -#include "sodium/crypto_auth_hmacsha512256.h" -#include "sodium/crypto_box.h" -#include "sodium/crypto_box_curve25519xsalsa20poly1305.h" -#include "sodium/crypto_core_hsalsa20.h" -#include "sodium/crypto_core_hchacha20.h" -#include "sodium/crypto_core_salsa20.h" -#include "sodium/crypto_core_salsa2012.h" -#include "sodium/crypto_core_salsa208.h" -#include "sodium/crypto_generichash.h" -#include "sodium/crypto_generichash_blake2b.h" -#include "sodium/crypto_hash.h" -#include "sodium/crypto_hash_sha256.h" -#include "sodium/crypto_hash_sha512.h" -#include "sodium/crypto_kdf.h" -#include "sodium/crypto_kdf_blake2b.h" -#include "sodium/crypto_kx.h" -#include "sodium/crypto_onetimeauth.h" -#include "sodium/crypto_onetimeauth_poly1305.h" -#include "sodium/crypto_pwhash.h" -#include "sodium/crypto_pwhash_argon2i.h" -#include "sodium/crypto_scalarmult.h" -#include "sodium/crypto_scalarmult_curve25519.h" -#include "sodium/crypto_secretbox.h" -#include "sodium/crypto_secretbox_xsalsa20poly1305.h" -#include "sodium/crypto_secretstream_xchacha20poly1305.h" -#include "sodium/crypto_shorthash.h" -#include "sodium/crypto_shorthash_siphash24.h" -#include "sodium/crypto_sign.h" -#include "sodium/crypto_sign_ed25519.h" -#include "sodium/crypto_stream.h" -#include "sodium/crypto_stream_chacha20.h" -#include "sodium/crypto_stream_salsa20.h" -#include "sodium/crypto_stream_xsalsa20.h" -#include "sodium/crypto_verify_16.h" -#include "sodium/crypto_verify_32.h" -#include "sodium/crypto_verify_64.h" -#include "sodium/randombytes.h" -#include "sodium/randombytes_internal_random.h" -#include "sodium/randombytes_sysrandom.h" -#include "sodium/runtime.h" -#include "sodium/utils.h" - -#ifndef SODIUM_LIBRARY_MINIMAL -# include "sodium/crypto_box_curve25519xchacha20poly1305.h" -# include "sodium/crypto_core_ed25519.h" -# include "sodium/crypto_core_ristretto255.h" -# include "sodium/crypto_kdf_hkdf_sha256.h" -# include "sodium/crypto_kdf_hkdf_sha512.h" -# include "sodium/crypto_scalarmult_ed25519.h" -# include "sodium/crypto_scalarmult_ristretto255.h" -# include "sodium/crypto_secretbox_xchacha20poly1305.h" -# include "sodium/crypto_pwhash_scryptsalsa208sha256.h" -# include "sodium/crypto_stream_salsa2012.h" -# include "sodium/crypto_stream_salsa208.h" -# include "sodium/crypto_stream_xchacha20.h" -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/core.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/core.h deleted file mode 100644 index dd088d2c..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/core.h +++ /dev/null @@ -1,28 +0,0 @@ - -#ifndef sodium_core_H -#define sodium_core_H - -#include "export.h" - -#ifdef __cplusplus -extern "C" { -#endif - -SODIUM_EXPORT -int sodium_init(void) - __attribute__ ((warn_unused_result)); - -/* ---- */ - -SODIUM_EXPORT -int sodium_set_misuse_handler(void (*handler)(void)); - -SODIUM_EXPORT -void sodium_misuse(void) - __attribute__ ((noreturn)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_aead_aegis128l.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_aead_aegis128l.h deleted file mode 100644 index ed8d2f2b..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_aead_aegis128l.h +++ /dev/null @@ -1,96 +0,0 @@ -#ifndef crypto_aead_aegis128l_H -#define crypto_aead_aegis128l_H - -#include -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -SODIUM_EXPORT -int crypto_aead_aegis128l_is_available(void); - -#define crypto_aead_aegis128l_KEYBYTES 16U -SODIUM_EXPORT -size_t crypto_aead_aegis128l_keybytes(void); - -#define crypto_aead_aegis128l_NSECBYTES 0U -SODIUM_EXPORT -size_t crypto_aead_aegis128l_nsecbytes(void); - -#define crypto_aead_aegis128l_NPUBBYTES 16U -SODIUM_EXPORT -size_t crypto_aead_aegis128l_npubbytes(void); - -#define crypto_aead_aegis128l_ABYTES 16U -SODIUM_EXPORT -size_t crypto_aead_aegis128l_abytes(void); - -#define crypto_aead_aegis128l_MESSAGEBYTES_MAX \ - SODIUM_MIN(SODIUM_SIZE_MAX - crypto_aead_aegis128l_ABYTES, \ - (1ULL << 61) - 1) -SODIUM_EXPORT -size_t crypto_aead_aegis128l_messagebytes_max(void); - -SODIUM_EXPORT -int crypto_aead_aegis128l_encrypt(unsigned char *c, - unsigned long long *clen_p, - const unsigned char *m, - unsigned long long mlen, - const unsigned char *ad, - unsigned long long adlen, - const unsigned char *nsec, - const unsigned char *npub, - const unsigned char *k) - __attribute__ ((nonnull(1, 8, 9))); - -SODIUM_EXPORT -int crypto_aead_aegis128l_decrypt(unsigned char *m, - unsigned long long *mlen_p, - unsigned char *nsec, - const unsigned char *c, - unsigned long long clen, - const unsigned char *ad, - unsigned long long adlen, - const unsigned char *npub, - const unsigned char *k) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(4, 8, 9))); - -SODIUM_EXPORT -int crypto_aead_aegis128l_encrypt_detached(unsigned char *c, - unsigned char *mac, - unsigned long long *maclen_p, - const unsigned char *m, - unsigned long long mlen, - const unsigned char *ad, - unsigned long long adlen, - const unsigned char *nsec, - const unsigned char *npub, - const unsigned char *k) - __attribute__ ((nonnull(1, 2, 9, 10))); - -SODIUM_EXPORT -int crypto_aead_aegis128l_decrypt_detached(unsigned char *m, - unsigned char *nsec, - const unsigned char *c, - unsigned long long clen, - const unsigned char *mac, - const unsigned char *ad, - unsigned long long adlen, - const unsigned char *npub, - const unsigned char *k) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(3, 5, 8, 9))); - -SODIUM_EXPORT -void crypto_aead_aegis128l_keygen(unsigned char k[crypto_aead_aegis128l_KEYBYTES]) - __attribute__ ((nonnull)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_aead_aegis256.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_aead_aegis256.h deleted file mode 100644 index 32e76896..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_aead_aegis256.h +++ /dev/null @@ -1,96 +0,0 @@ -#ifndef crypto_aead_aegis256_H -#define crypto_aead_aegis256_H - -#include -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -SODIUM_EXPORT -int crypto_aead_aegis256_is_available(void); - -#define crypto_aead_aegis256_KEYBYTES 32U -SODIUM_EXPORT -size_t crypto_aead_aegis256_keybytes(void); - -#define crypto_aead_aegis256_NSECBYTES 0U -SODIUM_EXPORT -size_t crypto_aead_aegis256_nsecbytes(void); - -#define crypto_aead_aegis256_NPUBBYTES 32U -SODIUM_EXPORT -size_t crypto_aead_aegis256_npubbytes(void); - -#define crypto_aead_aegis256_ABYTES 16U -SODIUM_EXPORT -size_t crypto_aead_aegis256_abytes(void); - -#define crypto_aead_aegis256_MESSAGEBYTES_MAX \ - SODIUM_MIN(SODIUM_SIZE_MAX - crypto_aead_aegis256_ABYTES, \ - (1ULL << 61) - 1) -SODIUM_EXPORT -size_t crypto_aead_aegis256_messagebytes_max(void); - -SODIUM_EXPORT -int crypto_aead_aegis256_encrypt(unsigned char *c, - unsigned long long *clen_p, - const unsigned char *m, - unsigned long long mlen, - const unsigned char *ad, - unsigned long long adlen, - const unsigned char *nsec, - const unsigned char *npub, - const unsigned char *k) - __attribute__ ((nonnull(1, 8, 9))); - -SODIUM_EXPORT -int crypto_aead_aegis256_decrypt(unsigned char *m, - unsigned long long *mlen_p, - unsigned char *nsec, - const unsigned char *c, - unsigned long long clen, - const unsigned char *ad, - unsigned long long adlen, - const unsigned char *npub, - const unsigned char *k) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(4, 8, 9))); - -SODIUM_EXPORT -int crypto_aead_aegis256_encrypt_detached(unsigned char *c, - unsigned char *mac, - unsigned long long *maclen_p, - const unsigned char *m, - unsigned long long mlen, - const unsigned char *ad, - unsigned long long adlen, - const unsigned char *nsec, - const unsigned char *npub, - const unsigned char *k) - __attribute__ ((nonnull(1, 2, 9, 10))); - -SODIUM_EXPORT -int crypto_aead_aegis256_decrypt_detached(unsigned char *m, - unsigned char *nsec, - const unsigned char *c, - unsigned long long clen, - const unsigned char *mac, - const unsigned char *ad, - unsigned long long adlen, - const unsigned char *npub, - const unsigned char *k) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(3, 5, 8, 9))); - -SODIUM_EXPORT -void crypto_aead_aegis256_keygen(unsigned char k[crypto_aead_aegis256_KEYBYTES]) - __attribute__ ((nonnull)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_aead_aes256gcm.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_aead_aes256gcm.h deleted file mode 100644 index 9baeb3f1..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_aead_aes256gcm.h +++ /dev/null @@ -1,179 +0,0 @@ -#ifndef crypto_aead_aes256gcm_H -#define crypto_aead_aes256gcm_H - -/* - * WARNING: Despite being the most popular AEAD construction due to its - * use in TLS, safely using AES-GCM in a different context is tricky. - * - * No more than ~ 350 GB of input data should be encrypted with a given key. - * This is for ~ 16 KB messages -- Actual figures vary according to - * message sizes. - * - * In addition, nonces are short and repeated nonces would totally destroy - * the security of this scheme. - * - * Nonces should thus come from atomic counters, which can be difficult to - * set up in a distributed environment. - * - * Unless you absolutely need AES-GCM, use crypto_aead_xchacha20poly1305_ietf_*() - * instead. It doesn't have any of these limitations. - * Or, if you don't need to authenticate additional data, just stick to - * crypto_secretbox(). - */ - -#include -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -SODIUM_EXPORT -int crypto_aead_aes256gcm_is_available(void); - -#define crypto_aead_aes256gcm_KEYBYTES 32U -SODIUM_EXPORT -size_t crypto_aead_aes256gcm_keybytes(void); - -#define crypto_aead_aes256gcm_NSECBYTES 0U -SODIUM_EXPORT -size_t crypto_aead_aes256gcm_nsecbytes(void); - -#define crypto_aead_aes256gcm_NPUBBYTES 12U -SODIUM_EXPORT -size_t crypto_aead_aes256gcm_npubbytes(void); - -#define crypto_aead_aes256gcm_ABYTES 16U -SODIUM_EXPORT -size_t crypto_aead_aes256gcm_abytes(void); - -#define crypto_aead_aes256gcm_MESSAGEBYTES_MAX \ - SODIUM_MIN(SODIUM_SIZE_MAX - crypto_aead_aes256gcm_ABYTES, \ - (16ULL * ((1ULL << 32) - 2ULL))) -SODIUM_EXPORT -size_t crypto_aead_aes256gcm_messagebytes_max(void); - -typedef struct CRYPTO_ALIGN(16) crypto_aead_aes256gcm_state_ { - unsigned char opaque[512]; -} crypto_aead_aes256gcm_state; - -SODIUM_EXPORT -size_t crypto_aead_aes256gcm_statebytes(void); - -SODIUM_EXPORT -int crypto_aead_aes256gcm_encrypt(unsigned char *c, - unsigned long long *clen_p, - const unsigned char *m, - unsigned long long mlen, - const unsigned char *ad, - unsigned long long adlen, - const unsigned char *nsec, - const unsigned char *npub, - const unsigned char *k) - __attribute__ ((nonnull(1, 8, 9))); - -SODIUM_EXPORT -int crypto_aead_aes256gcm_decrypt(unsigned char *m, - unsigned long long *mlen_p, - unsigned char *nsec, - const unsigned char *c, - unsigned long long clen, - const unsigned char *ad, - unsigned long long adlen, - const unsigned char *npub, - const unsigned char *k) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(4, 8, 9))); - -SODIUM_EXPORT -int crypto_aead_aes256gcm_encrypt_detached(unsigned char *c, - unsigned char *mac, - unsigned long long *maclen_p, - const unsigned char *m, - unsigned long long mlen, - const unsigned char *ad, - unsigned long long adlen, - const unsigned char *nsec, - const unsigned char *npub, - const unsigned char *k) - __attribute__ ((nonnull(1, 2, 9, 10))); - -SODIUM_EXPORT -int crypto_aead_aes256gcm_decrypt_detached(unsigned char *m, - unsigned char *nsec, - const unsigned char *c, - unsigned long long clen, - const unsigned char *mac, - const unsigned char *ad, - unsigned long long adlen, - const unsigned char *npub, - const unsigned char *k) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(3, 5, 8, 9))); - -/* -- Precomputation interface -- */ - -SODIUM_EXPORT -int crypto_aead_aes256gcm_beforenm(crypto_aead_aes256gcm_state *ctx_, - const unsigned char *k) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_aead_aes256gcm_encrypt_afternm(unsigned char *c, - unsigned long long *clen_p, - const unsigned char *m, - unsigned long long mlen, - const unsigned char *ad, - unsigned long long adlen, - const unsigned char *nsec, - const unsigned char *npub, - const crypto_aead_aes256gcm_state *ctx_) - __attribute__ ((nonnull(1, 8, 9))); - -SODIUM_EXPORT -int crypto_aead_aes256gcm_decrypt_afternm(unsigned char *m, - unsigned long long *mlen_p, - unsigned char *nsec, - const unsigned char *c, - unsigned long long clen, - const unsigned char *ad, - unsigned long long adlen, - const unsigned char *npub, - const crypto_aead_aes256gcm_state *ctx_) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(4, 8, 9))); - -SODIUM_EXPORT -int crypto_aead_aes256gcm_encrypt_detached_afternm(unsigned char *c, - unsigned char *mac, - unsigned long long *maclen_p, - const unsigned char *m, - unsigned long long mlen, - const unsigned char *ad, - unsigned long long adlen, - const unsigned char *nsec, - const unsigned char *npub, - const crypto_aead_aes256gcm_state *ctx_) - __attribute__ ((nonnull(1, 2, 9, 10))); - -SODIUM_EXPORT -int crypto_aead_aes256gcm_decrypt_detached_afternm(unsigned char *m, - unsigned char *nsec, - const unsigned char *c, - unsigned long long clen, - const unsigned char *mac, - const unsigned char *ad, - unsigned long long adlen, - const unsigned char *npub, - const crypto_aead_aes256gcm_state *ctx_) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(3, 5, 8, 9))); - -SODIUM_EXPORT -void crypto_aead_aes256gcm_keygen(unsigned char k[crypto_aead_aes256gcm_KEYBYTES]) - __attribute__ ((nonnull)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_aead_chacha20poly1305.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_aead_chacha20poly1305.h deleted file mode 100644 index 5d671df1..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_aead_chacha20poly1305.h +++ /dev/null @@ -1,180 +0,0 @@ -#ifndef crypto_aead_chacha20poly1305_H -#define crypto_aead_chacha20poly1305_H - -#include -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -/* -- IETF ChaCha20-Poly1305 construction with a 96-bit nonce and a 32-bit internal counter -- */ - -#define crypto_aead_chacha20poly1305_ietf_KEYBYTES 32U -SODIUM_EXPORT -size_t crypto_aead_chacha20poly1305_ietf_keybytes(void); - -#define crypto_aead_chacha20poly1305_ietf_NSECBYTES 0U -SODIUM_EXPORT -size_t crypto_aead_chacha20poly1305_ietf_nsecbytes(void); - -#define crypto_aead_chacha20poly1305_ietf_NPUBBYTES 12U - -SODIUM_EXPORT -size_t crypto_aead_chacha20poly1305_ietf_npubbytes(void); - -#define crypto_aead_chacha20poly1305_ietf_ABYTES 16U -SODIUM_EXPORT -size_t crypto_aead_chacha20poly1305_ietf_abytes(void); - -#define crypto_aead_chacha20poly1305_ietf_MESSAGEBYTES_MAX \ - SODIUM_MIN(SODIUM_SIZE_MAX - crypto_aead_chacha20poly1305_ietf_ABYTES, \ - (64ULL * ((1ULL << 32) - 1ULL))) -SODIUM_EXPORT -size_t crypto_aead_chacha20poly1305_ietf_messagebytes_max(void); - -SODIUM_EXPORT -int crypto_aead_chacha20poly1305_ietf_encrypt(unsigned char *c, - unsigned long long *clen_p, - const unsigned char *m, - unsigned long long mlen, - const unsigned char *ad, - unsigned long long adlen, - const unsigned char *nsec, - const unsigned char *npub, - const unsigned char *k) - __attribute__ ((nonnull(1, 8, 9))); - -SODIUM_EXPORT -int crypto_aead_chacha20poly1305_ietf_decrypt(unsigned char *m, - unsigned long long *mlen_p, - unsigned char *nsec, - const unsigned char *c, - unsigned long long clen, - const unsigned char *ad, - unsigned long long adlen, - const unsigned char *npub, - const unsigned char *k) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(4, 8, 9))); - -SODIUM_EXPORT -int crypto_aead_chacha20poly1305_ietf_encrypt_detached(unsigned char *c, - unsigned char *mac, - unsigned long long *maclen_p, - const unsigned char *m, - unsigned long long mlen, - const unsigned char *ad, - unsigned long long adlen, - const unsigned char *nsec, - const unsigned char *npub, - const unsigned char *k) - __attribute__ ((nonnull(1, 2, 9, 10))); - -SODIUM_EXPORT -int crypto_aead_chacha20poly1305_ietf_decrypt_detached(unsigned char *m, - unsigned char *nsec, - const unsigned char *c, - unsigned long long clen, - const unsigned char *mac, - const unsigned char *ad, - unsigned long long adlen, - const unsigned char *npub, - const unsigned char *k) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(3, 5, 8, 9))); - -SODIUM_EXPORT -void crypto_aead_chacha20poly1305_ietf_keygen(unsigned char k[crypto_aead_chacha20poly1305_ietf_KEYBYTES]) - __attribute__ ((nonnull)); - -/* -- Original ChaCha20-Poly1305 construction with a 64-bit nonce and a 64-bit internal counter -- */ - -#define crypto_aead_chacha20poly1305_KEYBYTES 32U -SODIUM_EXPORT -size_t crypto_aead_chacha20poly1305_keybytes(void); - -#define crypto_aead_chacha20poly1305_NSECBYTES 0U -SODIUM_EXPORT -size_t crypto_aead_chacha20poly1305_nsecbytes(void); - -#define crypto_aead_chacha20poly1305_NPUBBYTES 8U -SODIUM_EXPORT -size_t crypto_aead_chacha20poly1305_npubbytes(void); - -#define crypto_aead_chacha20poly1305_ABYTES 16U -SODIUM_EXPORT -size_t crypto_aead_chacha20poly1305_abytes(void); - -#define crypto_aead_chacha20poly1305_MESSAGEBYTES_MAX \ - (SODIUM_SIZE_MAX - crypto_aead_chacha20poly1305_ABYTES) -SODIUM_EXPORT -size_t crypto_aead_chacha20poly1305_messagebytes_max(void); - -SODIUM_EXPORT -int crypto_aead_chacha20poly1305_encrypt(unsigned char *c, - unsigned long long *clen_p, - const unsigned char *m, - unsigned long long mlen, - const unsigned char *ad, - unsigned long long adlen, - const unsigned char *nsec, - const unsigned char *npub, - const unsigned char *k) - __attribute__ ((nonnull(1, 8, 9))); - -SODIUM_EXPORT -int crypto_aead_chacha20poly1305_decrypt(unsigned char *m, - unsigned long long *mlen_p, - unsigned char *nsec, - const unsigned char *c, - unsigned long long clen, - const unsigned char *ad, - unsigned long long adlen, - const unsigned char *npub, - const unsigned char *k) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(4, 8, 9))); - -SODIUM_EXPORT -int crypto_aead_chacha20poly1305_encrypt_detached(unsigned char *c, - unsigned char *mac, - unsigned long long *maclen_p, - const unsigned char *m, - unsigned long long mlen, - const unsigned char *ad, - unsigned long long adlen, - const unsigned char *nsec, - const unsigned char *npub, - const unsigned char *k) - __attribute__ ((nonnull(1, 2, 9, 10))); - -SODIUM_EXPORT -int crypto_aead_chacha20poly1305_decrypt_detached(unsigned char *m, - unsigned char *nsec, - const unsigned char *c, - unsigned long long clen, - const unsigned char *mac, - const unsigned char *ad, - unsigned long long adlen, - const unsigned char *npub, - const unsigned char *k) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(3, 5, 8, 9))); - -SODIUM_EXPORT -void crypto_aead_chacha20poly1305_keygen(unsigned char k[crypto_aead_chacha20poly1305_KEYBYTES]) - __attribute__ ((nonnull)); - -/* Aliases */ - -#define crypto_aead_chacha20poly1305_IETF_KEYBYTES crypto_aead_chacha20poly1305_ietf_KEYBYTES -#define crypto_aead_chacha20poly1305_IETF_NSECBYTES crypto_aead_chacha20poly1305_ietf_NSECBYTES -#define crypto_aead_chacha20poly1305_IETF_NPUBBYTES crypto_aead_chacha20poly1305_ietf_NPUBBYTES -#define crypto_aead_chacha20poly1305_IETF_ABYTES crypto_aead_chacha20poly1305_ietf_ABYTES -#define crypto_aead_chacha20poly1305_IETF_MESSAGEBYTES_MAX crypto_aead_chacha20poly1305_ietf_MESSAGEBYTES_MAX - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_aead_xchacha20poly1305.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_aead_xchacha20poly1305.h deleted file mode 100644 index 6643b0cb..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_aead_xchacha20poly1305.h +++ /dev/null @@ -1,100 +0,0 @@ -#ifndef crypto_aead_xchacha20poly1305_H -#define crypto_aead_xchacha20poly1305_H - -#include -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -#define crypto_aead_xchacha20poly1305_ietf_KEYBYTES 32U -SODIUM_EXPORT -size_t crypto_aead_xchacha20poly1305_ietf_keybytes(void); - -#define crypto_aead_xchacha20poly1305_ietf_NSECBYTES 0U -SODIUM_EXPORT -size_t crypto_aead_xchacha20poly1305_ietf_nsecbytes(void); - -#define crypto_aead_xchacha20poly1305_ietf_NPUBBYTES 24U -SODIUM_EXPORT -size_t crypto_aead_xchacha20poly1305_ietf_npubbytes(void); - -#define crypto_aead_xchacha20poly1305_ietf_ABYTES 16U -SODIUM_EXPORT -size_t crypto_aead_xchacha20poly1305_ietf_abytes(void); - -#define crypto_aead_xchacha20poly1305_ietf_MESSAGEBYTES_MAX \ - (SODIUM_SIZE_MAX - crypto_aead_xchacha20poly1305_ietf_ABYTES) -SODIUM_EXPORT -size_t crypto_aead_xchacha20poly1305_ietf_messagebytes_max(void); - -SODIUM_EXPORT -int crypto_aead_xchacha20poly1305_ietf_encrypt(unsigned char *c, - unsigned long long *clen_p, - const unsigned char *m, - unsigned long long mlen, - const unsigned char *ad, - unsigned long long adlen, - const unsigned char *nsec, - const unsigned char *npub, - const unsigned char *k) - __attribute__ ((nonnull(1, 8, 9))); - -SODIUM_EXPORT -int crypto_aead_xchacha20poly1305_ietf_decrypt(unsigned char *m, - unsigned long long *mlen_p, - unsigned char *nsec, - const unsigned char *c, - unsigned long long clen, - const unsigned char *ad, - unsigned long long adlen, - const unsigned char *npub, - const unsigned char *k) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(4, 8, 9))); - -SODIUM_EXPORT -int crypto_aead_xchacha20poly1305_ietf_encrypt_detached(unsigned char *c, - unsigned char *mac, - unsigned long long *maclen_p, - const unsigned char *m, - unsigned long long mlen, - const unsigned char *ad, - unsigned long long adlen, - const unsigned char *nsec, - const unsigned char *npub, - const unsigned char *k) - __attribute__ ((nonnull(1, 2, 9, 10))); - -SODIUM_EXPORT -int crypto_aead_xchacha20poly1305_ietf_decrypt_detached(unsigned char *m, - unsigned char *nsec, - const unsigned char *c, - unsigned long long clen, - const unsigned char *mac, - const unsigned char *ad, - unsigned long long adlen, - const unsigned char *npub, - const unsigned char *k) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(3, 5, 8, 9))); - -SODIUM_EXPORT -void crypto_aead_xchacha20poly1305_ietf_keygen(unsigned char k[crypto_aead_xchacha20poly1305_ietf_KEYBYTES]) - __attribute__ ((nonnull)); - -/* Aliases */ - -#define crypto_aead_xchacha20poly1305_IETF_KEYBYTES crypto_aead_xchacha20poly1305_ietf_KEYBYTES -#define crypto_aead_xchacha20poly1305_IETF_NSECBYTES crypto_aead_xchacha20poly1305_ietf_NSECBYTES -#define crypto_aead_xchacha20poly1305_IETF_NPUBBYTES crypto_aead_xchacha20poly1305_ietf_NPUBBYTES -#define crypto_aead_xchacha20poly1305_IETF_ABYTES crypto_aead_xchacha20poly1305_ietf_ABYTES -#define crypto_aead_xchacha20poly1305_IETF_MESSAGEBYTES_MAX crypto_aead_xchacha20poly1305_ietf_MESSAGEBYTES_MAX - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_auth.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_auth.h deleted file mode 100644 index 540aee0e..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_auth.h +++ /dev/null @@ -1,46 +0,0 @@ -#ifndef crypto_auth_H -#define crypto_auth_H - -#include - -#include "crypto_auth_hmacsha512256.h" -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -#define crypto_auth_BYTES crypto_auth_hmacsha512256_BYTES -SODIUM_EXPORT -size_t crypto_auth_bytes(void); - -#define crypto_auth_KEYBYTES crypto_auth_hmacsha512256_KEYBYTES -SODIUM_EXPORT -size_t crypto_auth_keybytes(void); - -#define crypto_auth_PRIMITIVE "hmacsha512256" -SODIUM_EXPORT -const char *crypto_auth_primitive(void); - -SODIUM_EXPORT -int crypto_auth(unsigned char *out, const unsigned char *in, - unsigned long long inlen, const unsigned char *k) - __attribute__ ((nonnull(1, 4))); - -SODIUM_EXPORT -int crypto_auth_verify(const unsigned char *h, const unsigned char *in, - unsigned long long inlen, const unsigned char *k) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(1, 4))); - -SODIUM_EXPORT -void crypto_auth_keygen(unsigned char k[crypto_auth_KEYBYTES]) - __attribute__ ((nonnull)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_auth_hmacsha256.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_auth_hmacsha256.h deleted file mode 100644 index 3da864c7..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_auth_hmacsha256.h +++ /dev/null @@ -1,70 +0,0 @@ -#ifndef crypto_auth_hmacsha256_H -#define crypto_auth_hmacsha256_H - -#include -#include "crypto_hash_sha256.h" -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -#define crypto_auth_hmacsha256_BYTES 32U -SODIUM_EXPORT -size_t crypto_auth_hmacsha256_bytes(void); - -#define crypto_auth_hmacsha256_KEYBYTES 32U -SODIUM_EXPORT -size_t crypto_auth_hmacsha256_keybytes(void); - -SODIUM_EXPORT -int crypto_auth_hmacsha256(unsigned char *out, - const unsigned char *in, - unsigned long long inlen, - const unsigned char *k) __attribute__ ((nonnull(1, 4))); - -SODIUM_EXPORT -int crypto_auth_hmacsha256_verify(const unsigned char *h, - const unsigned char *in, - unsigned long long inlen, - const unsigned char *k) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(1, 4))); - -/* ------------------------------------------------------------------------- */ - -typedef struct crypto_auth_hmacsha256_state { - crypto_hash_sha256_state ictx; - crypto_hash_sha256_state octx; -} crypto_auth_hmacsha256_state; - -SODIUM_EXPORT -size_t crypto_auth_hmacsha256_statebytes(void); - -SODIUM_EXPORT -int crypto_auth_hmacsha256_init(crypto_auth_hmacsha256_state *state, - const unsigned char *key, - size_t keylen) __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_auth_hmacsha256_update(crypto_auth_hmacsha256_state *state, - const unsigned char *in, - unsigned long long inlen) - __attribute__ ((nonnull(1))); - -SODIUM_EXPORT -int crypto_auth_hmacsha256_final(crypto_auth_hmacsha256_state *state, - unsigned char *out) __attribute__ ((nonnull)); - - -SODIUM_EXPORT -void crypto_auth_hmacsha256_keygen(unsigned char k[crypto_auth_hmacsha256_KEYBYTES]) - __attribute__ ((nonnull)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_auth_hmacsha512.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_auth_hmacsha512.h deleted file mode 100644 index d992cb81..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_auth_hmacsha512.h +++ /dev/null @@ -1,68 +0,0 @@ -#ifndef crypto_auth_hmacsha512_H -#define crypto_auth_hmacsha512_H - -#include -#include "crypto_hash_sha512.h" -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -#define crypto_auth_hmacsha512_BYTES 64U -SODIUM_EXPORT -size_t crypto_auth_hmacsha512_bytes(void); - -#define crypto_auth_hmacsha512_KEYBYTES 32U -SODIUM_EXPORT -size_t crypto_auth_hmacsha512_keybytes(void); - -SODIUM_EXPORT -int crypto_auth_hmacsha512(unsigned char *out, - const unsigned char *in, - unsigned long long inlen, - const unsigned char *k) __attribute__ ((nonnull(1, 4))); - -SODIUM_EXPORT -int crypto_auth_hmacsha512_verify(const unsigned char *h, - const unsigned char *in, - unsigned long long inlen, - const unsigned char *k) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(1, 4))); - -/* ------------------------------------------------------------------------- */ - -typedef struct crypto_auth_hmacsha512_state { - crypto_hash_sha512_state ictx; - crypto_hash_sha512_state octx; -} crypto_auth_hmacsha512_state; - -SODIUM_EXPORT -size_t crypto_auth_hmacsha512_statebytes(void); - -SODIUM_EXPORT -int crypto_auth_hmacsha512_init(crypto_auth_hmacsha512_state *state, - const unsigned char *key, - size_t keylen) __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_auth_hmacsha512_update(crypto_auth_hmacsha512_state *state, - const unsigned char *in, - unsigned long long inlen) __attribute__ ((nonnull(1))); - -SODIUM_EXPORT -int crypto_auth_hmacsha512_final(crypto_auth_hmacsha512_state *state, - unsigned char *out) __attribute__ ((nonnull)); - -SODIUM_EXPORT -void crypto_auth_hmacsha512_keygen(unsigned char k[crypto_auth_hmacsha512_KEYBYTES]) - __attribute__ ((nonnull)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_auth_hmacsha512256.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_auth_hmacsha512256.h deleted file mode 100644 index 3fb52638..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_auth_hmacsha512256.h +++ /dev/null @@ -1,65 +0,0 @@ -#ifndef crypto_auth_hmacsha512256_H -#define crypto_auth_hmacsha512256_H - -#include -#include "crypto_auth_hmacsha512.h" -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -#define crypto_auth_hmacsha512256_BYTES 32U -SODIUM_EXPORT -size_t crypto_auth_hmacsha512256_bytes(void); - -#define crypto_auth_hmacsha512256_KEYBYTES 32U -SODIUM_EXPORT -size_t crypto_auth_hmacsha512256_keybytes(void); - -SODIUM_EXPORT -int crypto_auth_hmacsha512256(unsigned char *out, - const unsigned char *in, - unsigned long long inlen, - const unsigned char *k) __attribute__ ((nonnull(1, 4))); - -SODIUM_EXPORT -int crypto_auth_hmacsha512256_verify(const unsigned char *h, - const unsigned char *in, - unsigned long long inlen, - const unsigned char *k) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(1, 4))); - -/* ------------------------------------------------------------------------- */ - -typedef crypto_auth_hmacsha512_state crypto_auth_hmacsha512256_state; - -SODIUM_EXPORT -size_t crypto_auth_hmacsha512256_statebytes(void); - -SODIUM_EXPORT -int crypto_auth_hmacsha512256_init(crypto_auth_hmacsha512256_state *state, - const unsigned char *key, - size_t keylen) __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_auth_hmacsha512256_update(crypto_auth_hmacsha512256_state *state, - const unsigned char *in, - unsigned long long inlen) __attribute__ ((nonnull(1))); - -SODIUM_EXPORT -int crypto_auth_hmacsha512256_final(crypto_auth_hmacsha512256_state *state, - unsigned char *out) __attribute__ ((nonnull)); - -SODIUM_EXPORT -void crypto_auth_hmacsha512256_keygen(unsigned char k[crypto_auth_hmacsha512256_KEYBYTES]) - __attribute__ ((nonnull)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_box.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_box.h deleted file mode 100644 index 0008e020..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_box.h +++ /dev/null @@ -1,177 +0,0 @@ -#ifndef crypto_box_H -#define crypto_box_H - -/* - * THREAD SAFETY: crypto_box_keypair() is thread-safe, - * provided that sodium_init() was called before. - * - * Other functions are always thread-safe. - */ - -#include - -#include "crypto_box_curve25519xsalsa20poly1305.h" -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -#define crypto_box_SEEDBYTES crypto_box_curve25519xsalsa20poly1305_SEEDBYTES -SODIUM_EXPORT -size_t crypto_box_seedbytes(void); - -#define crypto_box_PUBLICKEYBYTES crypto_box_curve25519xsalsa20poly1305_PUBLICKEYBYTES -SODIUM_EXPORT -size_t crypto_box_publickeybytes(void); - -#define crypto_box_SECRETKEYBYTES crypto_box_curve25519xsalsa20poly1305_SECRETKEYBYTES -SODIUM_EXPORT -size_t crypto_box_secretkeybytes(void); - -#define crypto_box_NONCEBYTES crypto_box_curve25519xsalsa20poly1305_NONCEBYTES -SODIUM_EXPORT -size_t crypto_box_noncebytes(void); - -#define crypto_box_MACBYTES crypto_box_curve25519xsalsa20poly1305_MACBYTES -SODIUM_EXPORT -size_t crypto_box_macbytes(void); - -#define crypto_box_MESSAGEBYTES_MAX crypto_box_curve25519xsalsa20poly1305_MESSAGEBYTES_MAX -SODIUM_EXPORT -size_t crypto_box_messagebytes_max(void); - -#define crypto_box_PRIMITIVE "curve25519xsalsa20poly1305" -SODIUM_EXPORT -const char *crypto_box_primitive(void); - -SODIUM_EXPORT -int crypto_box_seed_keypair(unsigned char *pk, unsigned char *sk, - const unsigned char *seed) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_box_keypair(unsigned char *pk, unsigned char *sk) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_box_easy(unsigned char *c, const unsigned char *m, - unsigned long long mlen, const unsigned char *n, - const unsigned char *pk, const unsigned char *sk) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(1, 4, 5, 6))); - -SODIUM_EXPORT -int crypto_box_open_easy(unsigned char *m, const unsigned char *c, - unsigned long long clen, const unsigned char *n, - const unsigned char *pk, const unsigned char *sk) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(2, 4, 5, 6))); - -SODIUM_EXPORT -int crypto_box_detached(unsigned char *c, unsigned char *mac, - const unsigned char *m, unsigned long long mlen, - const unsigned char *n, const unsigned char *pk, - const unsigned char *sk) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(1, 2, 5, 6, 7))); - -SODIUM_EXPORT -int crypto_box_open_detached(unsigned char *m, const unsigned char *c, - const unsigned char *mac, - unsigned long long clen, - const unsigned char *n, - const unsigned char *pk, - const unsigned char *sk) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(2, 3, 5, 6, 7))); - -/* -- Precomputation interface -- */ - -#define crypto_box_BEFORENMBYTES crypto_box_curve25519xsalsa20poly1305_BEFORENMBYTES -SODIUM_EXPORT -size_t crypto_box_beforenmbytes(void); - -SODIUM_EXPORT -int crypto_box_beforenm(unsigned char *k, const unsigned char *pk, - const unsigned char *sk) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_box_easy_afternm(unsigned char *c, const unsigned char *m, - unsigned long long mlen, const unsigned char *n, - const unsigned char *k) __attribute__ ((nonnull(1, 4, 5))); - -SODIUM_EXPORT -int crypto_box_open_easy_afternm(unsigned char *m, const unsigned char *c, - unsigned long long clen, const unsigned char *n, - const unsigned char *k) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(2, 4, 5))); - -SODIUM_EXPORT -int crypto_box_detached_afternm(unsigned char *c, unsigned char *mac, - const unsigned char *m, unsigned long long mlen, - const unsigned char *n, const unsigned char *k) - __attribute__ ((nonnull(1, 2, 5, 6))); - -SODIUM_EXPORT -int crypto_box_open_detached_afternm(unsigned char *m, const unsigned char *c, - const unsigned char *mac, - unsigned long long clen, const unsigned char *n, - const unsigned char *k) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(2, 3, 5, 6))); - -/* -- Ephemeral SK interface -- */ - -#define crypto_box_SEALBYTES (crypto_box_PUBLICKEYBYTES + crypto_box_MACBYTES) -SODIUM_EXPORT -size_t crypto_box_sealbytes(void); - -SODIUM_EXPORT -int crypto_box_seal(unsigned char *c, const unsigned char *m, - unsigned long long mlen, const unsigned char *pk) - __attribute__ ((nonnull(1, 4))); - -SODIUM_EXPORT -int crypto_box_seal_open(unsigned char *m, const unsigned char *c, - unsigned long long clen, - const unsigned char *pk, const unsigned char *sk) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(2, 4, 5))); - -/* -- NaCl compatibility interface ; Requires padding -- */ - -#define crypto_box_ZEROBYTES crypto_box_curve25519xsalsa20poly1305_ZEROBYTES -SODIUM_EXPORT -size_t crypto_box_zerobytes(void) __attribute__ ((deprecated)); - -#define crypto_box_BOXZEROBYTES crypto_box_curve25519xsalsa20poly1305_BOXZEROBYTES -SODIUM_EXPORT -size_t crypto_box_boxzerobytes(void) __attribute__ ((deprecated)); - -SODIUM_EXPORT -int crypto_box(unsigned char *c, const unsigned char *m, - unsigned long long mlen, const unsigned char *n, - const unsigned char *pk, const unsigned char *sk) - __attribute__ ((deprecated)) __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(1, 4, 5, 6))); - -SODIUM_EXPORT -int crypto_box_open(unsigned char *m, const unsigned char *c, - unsigned long long clen, const unsigned char *n, - const unsigned char *pk, const unsigned char *sk) - __attribute__ ((deprecated)) __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(2, 4, 5, 6))); - -SODIUM_EXPORT -int crypto_box_afternm(unsigned char *c, const unsigned char *m, - unsigned long long mlen, const unsigned char *n, - const unsigned char *k) __attribute__ ((deprecated)) __attribute__ ((nonnull(1, 4, 5))); - -SODIUM_EXPORT -int crypto_box_open_afternm(unsigned char *m, const unsigned char *c, - unsigned long long clen, const unsigned char *n, - const unsigned char *k) - __attribute__ ((warn_unused_result)) __attribute__ ((deprecated)) __attribute__ ((nonnull(2, 4, 5))); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_box_curve25519xchacha20poly1305.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_box_curve25519xchacha20poly1305.h deleted file mode 100644 index 26a3d31e..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_box_curve25519xchacha20poly1305.h +++ /dev/null @@ -1,164 +0,0 @@ - -#ifndef crypto_box_curve25519xchacha20poly1305_H -#define crypto_box_curve25519xchacha20poly1305_H - -#include -#include "crypto_stream_xchacha20.h" -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -#define crypto_box_curve25519xchacha20poly1305_SEEDBYTES 32U -SODIUM_EXPORT -size_t crypto_box_curve25519xchacha20poly1305_seedbytes(void); - -#define crypto_box_curve25519xchacha20poly1305_PUBLICKEYBYTES 32U -SODIUM_EXPORT -size_t crypto_box_curve25519xchacha20poly1305_publickeybytes(void); - -#define crypto_box_curve25519xchacha20poly1305_SECRETKEYBYTES 32U -SODIUM_EXPORT -size_t crypto_box_curve25519xchacha20poly1305_secretkeybytes(void); - -#define crypto_box_curve25519xchacha20poly1305_BEFORENMBYTES 32U -SODIUM_EXPORT -size_t crypto_box_curve25519xchacha20poly1305_beforenmbytes(void); - -#define crypto_box_curve25519xchacha20poly1305_NONCEBYTES 24U -SODIUM_EXPORT -size_t crypto_box_curve25519xchacha20poly1305_noncebytes(void); - -#define crypto_box_curve25519xchacha20poly1305_MACBYTES 16U -SODIUM_EXPORT -size_t crypto_box_curve25519xchacha20poly1305_macbytes(void); - -#define crypto_box_curve25519xchacha20poly1305_MESSAGEBYTES_MAX \ - (crypto_stream_xchacha20_MESSAGEBYTES_MAX - crypto_box_curve25519xchacha20poly1305_MACBYTES) -SODIUM_EXPORT -size_t crypto_box_curve25519xchacha20poly1305_messagebytes_max(void); - -SODIUM_EXPORT -int crypto_box_curve25519xchacha20poly1305_seed_keypair(unsigned char *pk, - unsigned char *sk, - const unsigned char *seed) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_box_curve25519xchacha20poly1305_keypair(unsigned char *pk, - unsigned char *sk) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_box_curve25519xchacha20poly1305_easy(unsigned char *c, - const unsigned char *m, - unsigned long long mlen, - const unsigned char *n, - const unsigned char *pk, - const unsigned char *sk) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(1, 4, 5, 6))); - -SODIUM_EXPORT -int crypto_box_curve25519xchacha20poly1305_open_easy(unsigned char *m, - const unsigned char *c, - unsigned long long clen, - const unsigned char *n, - const unsigned char *pk, - const unsigned char *sk) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(2, 4, 5, 6))); - -SODIUM_EXPORT -int crypto_box_curve25519xchacha20poly1305_detached(unsigned char *c, - unsigned char *mac, - const unsigned char *m, - unsigned long long mlen, - const unsigned char *n, - const unsigned char *pk, - const unsigned char *sk) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(1, 2, 5, 6, 7))); - -SODIUM_EXPORT -int crypto_box_curve25519xchacha20poly1305_open_detached(unsigned char *m, - const unsigned char *c, - const unsigned char *mac, - unsigned long long clen, - const unsigned char *n, - const unsigned char *pk, - const unsigned char *sk) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(2, 3, 5, 6, 7))); - -/* -- Precomputation interface -- */ - -SODIUM_EXPORT -int crypto_box_curve25519xchacha20poly1305_beforenm(unsigned char *k, - const unsigned char *pk, - const unsigned char *sk) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_box_curve25519xchacha20poly1305_easy_afternm(unsigned char *c, - const unsigned char *m, - unsigned long long mlen, - const unsigned char *n, - const unsigned char *k) - __attribute__ ((nonnull(1, 4, 5))); - -SODIUM_EXPORT -int crypto_box_curve25519xchacha20poly1305_open_easy_afternm(unsigned char *m, - const unsigned char *c, - unsigned long long clen, - const unsigned char *n, - const unsigned char *k) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(2, 4, 5))); - -SODIUM_EXPORT -int crypto_box_curve25519xchacha20poly1305_detached_afternm(unsigned char *c, - unsigned char *mac, - const unsigned char *m, - unsigned long long mlen, - const unsigned char *n, - const unsigned char *k) - __attribute__ ((nonnull(1, 2, 5, 6))); - -SODIUM_EXPORT -int crypto_box_curve25519xchacha20poly1305_open_detached_afternm(unsigned char *m, - const unsigned char *c, - const unsigned char *mac, - unsigned long long clen, - const unsigned char *n, - const unsigned char *k) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(2, 3, 5, 6))); - -/* -- Ephemeral SK interface -- */ - -#define crypto_box_curve25519xchacha20poly1305_SEALBYTES \ - (crypto_box_curve25519xchacha20poly1305_PUBLICKEYBYTES + \ - crypto_box_curve25519xchacha20poly1305_MACBYTES) - -SODIUM_EXPORT -size_t crypto_box_curve25519xchacha20poly1305_sealbytes(void); - -SODIUM_EXPORT -int crypto_box_curve25519xchacha20poly1305_seal(unsigned char *c, - const unsigned char *m, - unsigned long long mlen, - const unsigned char *pk) - __attribute__ ((nonnull(1, 4))); - -SODIUM_EXPORT -int crypto_box_curve25519xchacha20poly1305_seal_open(unsigned char *m, - const unsigned char *c, - unsigned long long clen, - const unsigned char *pk, - const unsigned char *sk) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(2, 4, 5))); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_box_curve25519xsalsa20poly1305.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_box_curve25519xsalsa20poly1305.h deleted file mode 100644 index 2c9b5d6e..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_box_curve25519xsalsa20poly1305.h +++ /dev/null @@ -1,113 +0,0 @@ -#ifndef crypto_box_curve25519xsalsa20poly1305_H -#define crypto_box_curve25519xsalsa20poly1305_H - -#include -#include "crypto_stream_xsalsa20.h" -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -#define crypto_box_curve25519xsalsa20poly1305_SEEDBYTES 32U -SODIUM_EXPORT -size_t crypto_box_curve25519xsalsa20poly1305_seedbytes(void); - -#define crypto_box_curve25519xsalsa20poly1305_PUBLICKEYBYTES 32U -SODIUM_EXPORT -size_t crypto_box_curve25519xsalsa20poly1305_publickeybytes(void); - -#define crypto_box_curve25519xsalsa20poly1305_SECRETKEYBYTES 32U -SODIUM_EXPORT -size_t crypto_box_curve25519xsalsa20poly1305_secretkeybytes(void); - -#define crypto_box_curve25519xsalsa20poly1305_BEFORENMBYTES 32U -SODIUM_EXPORT -size_t crypto_box_curve25519xsalsa20poly1305_beforenmbytes(void); - -#define crypto_box_curve25519xsalsa20poly1305_NONCEBYTES 24U -SODIUM_EXPORT -size_t crypto_box_curve25519xsalsa20poly1305_noncebytes(void); - -#define crypto_box_curve25519xsalsa20poly1305_MACBYTES 16U -SODIUM_EXPORT -size_t crypto_box_curve25519xsalsa20poly1305_macbytes(void); - -/* Only for the libsodium API - The NaCl compatibility API would require BOXZEROBYTES extra bytes */ -#define crypto_box_curve25519xsalsa20poly1305_MESSAGEBYTES_MAX \ - (crypto_stream_xsalsa20_MESSAGEBYTES_MAX - crypto_box_curve25519xsalsa20poly1305_MACBYTES) -SODIUM_EXPORT -size_t crypto_box_curve25519xsalsa20poly1305_messagebytes_max(void); - -SODIUM_EXPORT -int crypto_box_curve25519xsalsa20poly1305_seed_keypair(unsigned char *pk, - unsigned char *sk, - const unsigned char *seed) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_box_curve25519xsalsa20poly1305_keypair(unsigned char *pk, - unsigned char *sk) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_box_curve25519xsalsa20poly1305_beforenm(unsigned char *k, - const unsigned char *pk, - const unsigned char *sk) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull)); - -/* -- NaCl compatibility interface ; Requires padding -- */ - -#define crypto_box_curve25519xsalsa20poly1305_BOXZEROBYTES 16U -SODIUM_EXPORT -size_t crypto_box_curve25519xsalsa20poly1305_boxzerobytes(void); - -#define crypto_box_curve25519xsalsa20poly1305_ZEROBYTES \ - (crypto_box_curve25519xsalsa20poly1305_BOXZEROBYTES + \ - crypto_box_curve25519xsalsa20poly1305_MACBYTES) -SODIUM_EXPORT -size_t crypto_box_curve25519xsalsa20poly1305_zerobytes(void) - __attribute__ ((deprecated)); - -SODIUM_EXPORT -int crypto_box_curve25519xsalsa20poly1305(unsigned char *c, - const unsigned char *m, - unsigned long long mlen, - const unsigned char *n, - const unsigned char *pk, - const unsigned char *sk) - __attribute__ ((deprecated)) __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(1, 4, 5, 6))); - -SODIUM_EXPORT -int crypto_box_curve25519xsalsa20poly1305_open(unsigned char *m, - const unsigned char *c, - unsigned long long clen, - const unsigned char *n, - const unsigned char *pk, - const unsigned char *sk) - __attribute__ ((deprecated)) __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(2, 4, 5, 6))); - -SODIUM_EXPORT -int crypto_box_curve25519xsalsa20poly1305_afternm(unsigned char *c, - const unsigned char *m, - unsigned long long mlen, - const unsigned char *n, - const unsigned char *k) - __attribute__ ((deprecated)) __attribute__ ((nonnull(1, 4, 5))); - -SODIUM_EXPORT -int crypto_box_curve25519xsalsa20poly1305_open_afternm(unsigned char *m, - const unsigned char *c, - unsigned long long clen, - const unsigned char *n, - const unsigned char *k) - __attribute__ ((deprecated)) __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(2, 4, 5))); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_core_ed25519.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_core_ed25519.h deleted file mode 100644 index 618a44f9..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_core_ed25519.h +++ /dev/null @@ -1,115 +0,0 @@ -#ifndef crypto_core_ed25519_H -#define crypto_core_ed25519_H - -#include -#include "export.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#define crypto_core_ed25519_BYTES 32 -SODIUM_EXPORT -size_t crypto_core_ed25519_bytes(void); - -#define crypto_core_ed25519_UNIFORMBYTES 32 -SODIUM_EXPORT -size_t crypto_core_ed25519_uniformbytes(void); - -#define crypto_core_ed25519_HASHBYTES 64 -SODIUM_EXPORT -size_t crypto_core_ed25519_hashbytes(void); - -#define crypto_core_ed25519_SCALARBYTES 32 -SODIUM_EXPORT -size_t crypto_core_ed25519_scalarbytes(void); - -#define crypto_core_ed25519_NONREDUCEDSCALARBYTES 64 -SODIUM_EXPORT -size_t crypto_core_ed25519_nonreducedscalarbytes(void); - -#define crypto_core_ed25519_H2CSHA256 1 -#define crypto_core_ed25519_H2CSHA512 2 - -SODIUM_EXPORT -int crypto_core_ed25519_is_valid_point(const unsigned char *p) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_core_ed25519_add(unsigned char *r, - const unsigned char *p, const unsigned char *q) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_core_ed25519_sub(unsigned char *r, - const unsigned char *p, const unsigned char *q) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_core_ed25519_from_uniform(unsigned char *p, const unsigned char *r) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_core_ed25519_from_string(unsigned char p[crypto_core_ed25519_BYTES], - const char *ctx, const unsigned char *msg, - size_t msg_len, int hash_alg) - __attribute__ ((nonnull(1))); - -SODIUM_EXPORT -int crypto_core_ed25519_from_string_ro(unsigned char p[crypto_core_ed25519_BYTES], - const char *ctx, const unsigned char *msg, - size_t msg_len, int hash_alg) - __attribute__ ((nonnull(1))); - -SODIUM_EXPORT -void crypto_core_ed25519_random(unsigned char *p) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -void crypto_core_ed25519_scalar_random(unsigned char *r) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_core_ed25519_scalar_invert(unsigned char *recip, const unsigned char *s) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -void crypto_core_ed25519_scalar_negate(unsigned char *neg, const unsigned char *s) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -void crypto_core_ed25519_scalar_complement(unsigned char *comp, const unsigned char *s) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -void crypto_core_ed25519_scalar_add(unsigned char *z, const unsigned char *x, - const unsigned char *y) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -void crypto_core_ed25519_scalar_sub(unsigned char *z, const unsigned char *x, - const unsigned char *y) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -void crypto_core_ed25519_scalar_mul(unsigned char *z, const unsigned char *x, - const unsigned char *y) - __attribute__ ((nonnull)); - -/* - * The interval `s` is sampled from should be at least 317 bits to ensure almost - * uniformity of `r` over `L`. - */ -SODIUM_EXPORT -void crypto_core_ed25519_scalar_reduce(unsigned char *r, const unsigned char *s) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_core_ed25519_scalar_is_canonical(const unsigned char *s) - __attribute__ ((nonnull)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_core_hchacha20.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_core_hchacha20.h deleted file mode 100644 index ece141b0..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_core_hchacha20.h +++ /dev/null @@ -1,36 +0,0 @@ -#ifndef crypto_core_hchacha20_H -#define crypto_core_hchacha20_H - -#include -#include "export.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#define crypto_core_hchacha20_OUTPUTBYTES 32U -SODIUM_EXPORT -size_t crypto_core_hchacha20_outputbytes(void); - -#define crypto_core_hchacha20_INPUTBYTES 16U -SODIUM_EXPORT -size_t crypto_core_hchacha20_inputbytes(void); - -#define crypto_core_hchacha20_KEYBYTES 32U -SODIUM_EXPORT -size_t crypto_core_hchacha20_keybytes(void); - -#define crypto_core_hchacha20_CONSTBYTES 16U -SODIUM_EXPORT -size_t crypto_core_hchacha20_constbytes(void); - -SODIUM_EXPORT -int crypto_core_hchacha20(unsigned char *out, const unsigned char *in, - const unsigned char *k, const unsigned char *c) - __attribute__ ((nonnull(1, 2, 3))); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_core_hsalsa20.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_core_hsalsa20.h deleted file mode 100644 index 4bf7a487..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_core_hsalsa20.h +++ /dev/null @@ -1,36 +0,0 @@ -#ifndef crypto_core_hsalsa20_H -#define crypto_core_hsalsa20_H - -#include -#include "export.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#define crypto_core_hsalsa20_OUTPUTBYTES 32U -SODIUM_EXPORT -size_t crypto_core_hsalsa20_outputbytes(void); - -#define crypto_core_hsalsa20_INPUTBYTES 16U -SODIUM_EXPORT -size_t crypto_core_hsalsa20_inputbytes(void); - -#define crypto_core_hsalsa20_KEYBYTES 32U -SODIUM_EXPORT -size_t crypto_core_hsalsa20_keybytes(void); - -#define crypto_core_hsalsa20_CONSTBYTES 16U -SODIUM_EXPORT -size_t crypto_core_hsalsa20_constbytes(void); - -SODIUM_EXPORT -int crypto_core_hsalsa20(unsigned char *out, const unsigned char *in, - const unsigned char *k, const unsigned char *c) - __attribute__ ((nonnull(1, 2, 3))); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_core_ristretto255.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_core_ristretto255.h deleted file mode 100644 index 5fc3a1be..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_core_ristretto255.h +++ /dev/null @@ -1,121 +0,0 @@ -#ifndef crypto_core_ristretto255_H -#define crypto_core_ristretto255_H - -#include -#include "export.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#define crypto_core_ristretto255_BYTES 32 -SODIUM_EXPORT -size_t crypto_core_ristretto255_bytes(void); - -#define crypto_core_ristretto255_HASHBYTES 64 -SODIUM_EXPORT -size_t crypto_core_ristretto255_hashbytes(void); - -#define crypto_core_ristretto255_SCALARBYTES 32 -SODIUM_EXPORT -size_t crypto_core_ristretto255_scalarbytes(void); - -#define crypto_core_ristretto255_NONREDUCEDSCALARBYTES 64 -SODIUM_EXPORT -size_t crypto_core_ristretto255_nonreducedscalarbytes(void); - -#define crypto_core_ristretto255_H2CSHA256 1 -#define crypto_core_ristretto255_H2CSHA512 2 - -SODIUM_EXPORT -int crypto_core_ristretto255_is_valid_point(const unsigned char *p) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_core_ristretto255_add(unsigned char *r, - const unsigned char *p, const unsigned char *q) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_core_ristretto255_sub(unsigned char *r, - const unsigned char *p, const unsigned char *q) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_core_ristretto255_from_hash(unsigned char *p, - const unsigned char *r) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_core_ristretto255_from_string(unsigned char p[crypto_core_ristretto255_BYTES], - const char *ctx, - const unsigned char *msg, - size_t msg_len, int hash_alg) - __attribute__ ((nonnull(1))); - -SODIUM_EXPORT -int crypto_core_ristretto255_from_string_ro(unsigned char p[crypto_core_ristretto255_BYTES], - const char *ctx, - const unsigned char *msg, - size_t msg_len, int hash_alg) - __attribute__ ((nonnull(1))); - -SODIUM_EXPORT -void crypto_core_ristretto255_random(unsigned char *p) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -void crypto_core_ristretto255_scalar_random(unsigned char *r) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_core_ristretto255_scalar_invert(unsigned char *recip, - const unsigned char *s) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -void crypto_core_ristretto255_scalar_negate(unsigned char *neg, - const unsigned char *s) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -void crypto_core_ristretto255_scalar_complement(unsigned char *comp, - const unsigned char *s) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -void crypto_core_ristretto255_scalar_add(unsigned char *z, - const unsigned char *x, - const unsigned char *y) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -void crypto_core_ristretto255_scalar_sub(unsigned char *z, - const unsigned char *x, - const unsigned char *y) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -void crypto_core_ristretto255_scalar_mul(unsigned char *z, - const unsigned char *x, - const unsigned char *y) - __attribute__ ((nonnull)); - -/* - * The interval `s` is sampled from should be at least 317 bits to ensure almost - * uniformity of `r` over `L`. - */ -SODIUM_EXPORT -void crypto_core_ristretto255_scalar_reduce(unsigned char *r, - const unsigned char *s) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_core_ristretto255_scalar_is_canonical(const unsigned char *s) - __attribute__ ((nonnull)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_core_salsa20.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_core_salsa20.h deleted file mode 100644 index bd79fd9f..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_core_salsa20.h +++ /dev/null @@ -1,36 +0,0 @@ -#ifndef crypto_core_salsa20_H -#define crypto_core_salsa20_H - -#include -#include "export.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#define crypto_core_salsa20_OUTPUTBYTES 64U -SODIUM_EXPORT -size_t crypto_core_salsa20_outputbytes(void); - -#define crypto_core_salsa20_INPUTBYTES 16U -SODIUM_EXPORT -size_t crypto_core_salsa20_inputbytes(void); - -#define crypto_core_salsa20_KEYBYTES 32U -SODIUM_EXPORT -size_t crypto_core_salsa20_keybytes(void); - -#define crypto_core_salsa20_CONSTBYTES 16U -SODIUM_EXPORT -size_t crypto_core_salsa20_constbytes(void); - -SODIUM_EXPORT -int crypto_core_salsa20(unsigned char *out, const unsigned char *in, - const unsigned char *k, const unsigned char *c) - __attribute__ ((nonnull(1, 2, 3))); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_core_salsa2012.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_core_salsa2012.h deleted file mode 100644 index 05957591..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_core_salsa2012.h +++ /dev/null @@ -1,36 +0,0 @@ -#ifndef crypto_core_salsa2012_H -#define crypto_core_salsa2012_H - -#include -#include "export.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#define crypto_core_salsa2012_OUTPUTBYTES 64U -SODIUM_EXPORT -size_t crypto_core_salsa2012_outputbytes(void); - -#define crypto_core_salsa2012_INPUTBYTES 16U -SODIUM_EXPORT -size_t crypto_core_salsa2012_inputbytes(void); - -#define crypto_core_salsa2012_KEYBYTES 32U -SODIUM_EXPORT -size_t crypto_core_salsa2012_keybytes(void); - -#define crypto_core_salsa2012_CONSTBYTES 16U -SODIUM_EXPORT -size_t crypto_core_salsa2012_constbytes(void); - -SODIUM_EXPORT -int crypto_core_salsa2012(unsigned char *out, const unsigned char *in, - const unsigned char *k, const unsigned char *c) - __attribute__ ((nonnull(1, 2, 3))); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_core_salsa208.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_core_salsa208.h deleted file mode 100644 index d2f216af..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_core_salsa208.h +++ /dev/null @@ -1,40 +0,0 @@ -#ifndef crypto_core_salsa208_H -#define crypto_core_salsa208_H - -#include -#include "export.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#define crypto_core_salsa208_OUTPUTBYTES 64U -SODIUM_EXPORT -size_t crypto_core_salsa208_outputbytes(void) - __attribute__ ((deprecated)); - -#define crypto_core_salsa208_INPUTBYTES 16U -SODIUM_EXPORT -size_t crypto_core_salsa208_inputbytes(void) - __attribute__ ((deprecated)); - -#define crypto_core_salsa208_KEYBYTES 32U -SODIUM_EXPORT -size_t crypto_core_salsa208_keybytes(void) - __attribute__ ((deprecated)); - -#define crypto_core_salsa208_CONSTBYTES 16U -SODIUM_EXPORT -size_t crypto_core_salsa208_constbytes(void) - __attribute__ ((deprecated)); - -SODIUM_EXPORT -int crypto_core_salsa208(unsigned char *out, const unsigned char *in, - const unsigned char *k, const unsigned char *c) - __attribute__ ((nonnull(1, 2, 3))); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_generichash.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_generichash.h deleted file mode 100644 index d897e5d2..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_generichash.h +++ /dev/null @@ -1,84 +0,0 @@ -#ifndef crypto_generichash_H -#define crypto_generichash_H - -#include - -#include "crypto_generichash_blake2b.h" -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -#define crypto_generichash_BYTES_MIN crypto_generichash_blake2b_BYTES_MIN -SODIUM_EXPORT -size_t crypto_generichash_bytes_min(void); - -#define crypto_generichash_BYTES_MAX crypto_generichash_blake2b_BYTES_MAX -SODIUM_EXPORT -size_t crypto_generichash_bytes_max(void); - -#define crypto_generichash_BYTES crypto_generichash_blake2b_BYTES -SODIUM_EXPORT -size_t crypto_generichash_bytes(void); - -#define crypto_generichash_KEYBYTES_MIN crypto_generichash_blake2b_KEYBYTES_MIN -SODIUM_EXPORT -size_t crypto_generichash_keybytes_min(void); - -#define crypto_generichash_KEYBYTES_MAX crypto_generichash_blake2b_KEYBYTES_MAX -SODIUM_EXPORT -size_t crypto_generichash_keybytes_max(void); - -#define crypto_generichash_KEYBYTES crypto_generichash_blake2b_KEYBYTES -SODIUM_EXPORT -size_t crypto_generichash_keybytes(void); - -#define crypto_generichash_PRIMITIVE "blake2b" -SODIUM_EXPORT -const char *crypto_generichash_primitive(void); - -/* - * Important when writing bindings for other programming languages: - * the state address should be 64-bytes aligned. - */ -typedef crypto_generichash_blake2b_state crypto_generichash_state; - -SODIUM_EXPORT -size_t crypto_generichash_statebytes(void); - -SODIUM_EXPORT -int crypto_generichash(unsigned char *out, size_t outlen, - const unsigned char *in, unsigned long long inlen, - const unsigned char *key, size_t keylen) - __attribute__ ((nonnull(1))); - -SODIUM_EXPORT -int crypto_generichash_init(crypto_generichash_state *state, - const unsigned char *key, - const size_t keylen, const size_t outlen) - __attribute__ ((nonnull(1))); - -SODIUM_EXPORT -int crypto_generichash_update(crypto_generichash_state *state, - const unsigned char *in, - unsigned long long inlen) - __attribute__ ((nonnull(1))); - -SODIUM_EXPORT -int crypto_generichash_final(crypto_generichash_state *state, - unsigned char *out, const size_t outlen) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -void crypto_generichash_keygen(unsigned char k[crypto_generichash_KEYBYTES]) - __attribute__ ((nonnull)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_generichash_blake2b.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_generichash_blake2b.h deleted file mode 100644 index ae3b52f7..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_generichash_blake2b.h +++ /dev/null @@ -1,122 +0,0 @@ -#ifndef crypto_generichash_blake2b_H -#define crypto_generichash_blake2b_H - -#include -#include -#include - -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -#ifdef __IBMC__ -# pragma pack(1) -#elif defined(__SUNPRO_C) || defined(__SUNPRO_CC) -# pragma pack(1) -#else -# pragma pack(push, 1) -#endif - -typedef struct CRYPTO_ALIGN(64) crypto_generichash_blake2b_state { - unsigned char opaque[384]; -} crypto_generichash_blake2b_state; - -#ifdef __IBMC__ -# pragma pack(pop) -#elif defined(__SUNPRO_C) || defined(__SUNPRO_CC) -# pragma pack() -#else -# pragma pack(pop) -#endif - -#define crypto_generichash_blake2b_BYTES_MIN 16U -SODIUM_EXPORT -size_t crypto_generichash_blake2b_bytes_min(void); - -#define crypto_generichash_blake2b_BYTES_MAX 64U -SODIUM_EXPORT -size_t crypto_generichash_blake2b_bytes_max(void); - -#define crypto_generichash_blake2b_BYTES 32U -SODIUM_EXPORT -size_t crypto_generichash_blake2b_bytes(void); - -#define crypto_generichash_blake2b_KEYBYTES_MIN 16U -SODIUM_EXPORT -size_t crypto_generichash_blake2b_keybytes_min(void); - -#define crypto_generichash_blake2b_KEYBYTES_MAX 64U -SODIUM_EXPORT -size_t crypto_generichash_blake2b_keybytes_max(void); - -#define crypto_generichash_blake2b_KEYBYTES 32U -SODIUM_EXPORT -size_t crypto_generichash_blake2b_keybytes(void); - -#define crypto_generichash_blake2b_SALTBYTES 16U -SODIUM_EXPORT -size_t crypto_generichash_blake2b_saltbytes(void); - -#define crypto_generichash_blake2b_PERSONALBYTES 16U -SODIUM_EXPORT -size_t crypto_generichash_blake2b_personalbytes(void); - -SODIUM_EXPORT -size_t crypto_generichash_blake2b_statebytes(void); - -SODIUM_EXPORT -int crypto_generichash_blake2b(unsigned char *out, size_t outlen, - const unsigned char *in, - unsigned long long inlen, - const unsigned char *key, size_t keylen) - __attribute__ ((nonnull(1))); - -SODIUM_EXPORT -int crypto_generichash_blake2b_salt_personal(unsigned char *out, size_t outlen, - const unsigned char *in, - unsigned long long inlen, - const unsigned char *key, - size_t keylen, - const unsigned char *salt, - const unsigned char *personal) - __attribute__ ((nonnull(1))); - -SODIUM_EXPORT -int crypto_generichash_blake2b_init(crypto_generichash_blake2b_state *state, - const unsigned char *key, - const size_t keylen, const size_t outlen) - __attribute__ ((nonnull(1))); - -SODIUM_EXPORT -int crypto_generichash_blake2b_init_salt_personal(crypto_generichash_blake2b_state *state, - const unsigned char *key, - const size_t keylen, const size_t outlen, - const unsigned char *salt, - const unsigned char *personal) - __attribute__ ((nonnull(1))); - -SODIUM_EXPORT -int crypto_generichash_blake2b_update(crypto_generichash_blake2b_state *state, - const unsigned char *in, - unsigned long long inlen) - __attribute__ ((nonnull(1))); - -SODIUM_EXPORT -int crypto_generichash_blake2b_final(crypto_generichash_blake2b_state *state, - unsigned char *out, - const size_t outlen) __attribute__ ((nonnull)); - -SODIUM_EXPORT -void crypto_generichash_blake2b_keygen(unsigned char k[crypto_generichash_blake2b_KEYBYTES]) - __attribute__ ((nonnull)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_hash.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_hash.h deleted file mode 100644 index 767d5480..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_hash.h +++ /dev/null @@ -1,40 +0,0 @@ -#ifndef crypto_hash_H -#define crypto_hash_H - -/* - * WARNING: Unless you absolutely need to use SHA512 for interoperability, - * purposes, you might want to consider crypto_generichash() instead. - * Unlike SHA512, crypto_generichash() is not vulnerable to length - * extension attacks. - */ - -#include - -#include "crypto_hash_sha512.h" -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -#define crypto_hash_BYTES crypto_hash_sha512_BYTES -SODIUM_EXPORT -size_t crypto_hash_bytes(void); - -SODIUM_EXPORT -int crypto_hash(unsigned char *out, const unsigned char *in, - unsigned long long inlen) __attribute__ ((nonnull(1))); - -#define crypto_hash_PRIMITIVE "sha512" -SODIUM_EXPORT -const char *crypto_hash_primitive(void) - __attribute__ ((warn_unused_result)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_hash_sha256.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_hash_sha256.h deleted file mode 100644 index c47982af..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_hash_sha256.h +++ /dev/null @@ -1,60 +0,0 @@ -#ifndef crypto_hash_sha256_H -#define crypto_hash_sha256_H - -/* - * WARNING: Unless you absolutely need to use SHA256 for interoperability, - * purposes, you might want to consider crypto_generichash() instead. - * Unlike SHA256, crypto_generichash() is not vulnerable to length - * extension attacks. - */ - -#include -#include -#include - -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -typedef struct crypto_hash_sha256_state { - uint32_t state[8]; - uint64_t count; - uint8_t buf[64]; -} crypto_hash_sha256_state; - -SODIUM_EXPORT -size_t crypto_hash_sha256_statebytes(void); - -#define crypto_hash_sha256_BYTES 32U -SODIUM_EXPORT -size_t crypto_hash_sha256_bytes(void); - -SODIUM_EXPORT -int crypto_hash_sha256(unsigned char *out, const unsigned char *in, - unsigned long long inlen) __attribute__ ((nonnull(1))); - -SODIUM_EXPORT -int crypto_hash_sha256_init(crypto_hash_sha256_state *state) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_hash_sha256_update(crypto_hash_sha256_state *state, - const unsigned char *in, - unsigned long long inlen) - __attribute__ ((nonnull(1))); - -SODIUM_EXPORT -int crypto_hash_sha256_final(crypto_hash_sha256_state *state, - unsigned char *out) - __attribute__ ((nonnull)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_hash_sha512.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_hash_sha512.h deleted file mode 100644 index 5b690fb2..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_hash_sha512.h +++ /dev/null @@ -1,60 +0,0 @@ -#ifndef crypto_hash_sha512_H -#define crypto_hash_sha512_H - -/* - * WARNING: Unless you absolutely need to use SHA512 for interoperability, - * purposes, you might want to consider crypto_generichash() instead. - * Unlike SHA512, crypto_generichash() is not vulnerable to length - * extension attacks. - */ - -#include -#include -#include - -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -typedef struct crypto_hash_sha512_state { - uint64_t state[8]; - uint64_t count[2]; - uint8_t buf[128]; -} crypto_hash_sha512_state; - -SODIUM_EXPORT -size_t crypto_hash_sha512_statebytes(void); - -#define crypto_hash_sha512_BYTES 64U -SODIUM_EXPORT -size_t crypto_hash_sha512_bytes(void); - -SODIUM_EXPORT -int crypto_hash_sha512(unsigned char *out, const unsigned char *in, - unsigned long long inlen) __attribute__ ((nonnull(1))); - -SODIUM_EXPORT -int crypto_hash_sha512_init(crypto_hash_sha512_state *state) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_hash_sha512_update(crypto_hash_sha512_state *state, - const unsigned char *in, - unsigned long long inlen) - __attribute__ ((nonnull(1))); - -SODIUM_EXPORT -int crypto_hash_sha512_final(crypto_hash_sha512_state *state, - unsigned char *out) - __attribute__ ((nonnull)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_kdf.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_kdf.h deleted file mode 100644 index ac2fc618..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_kdf.h +++ /dev/null @@ -1,53 +0,0 @@ -#ifndef crypto_kdf_H -#define crypto_kdf_H - -#include -#include - -#include "crypto_kdf_blake2b.h" -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -#define crypto_kdf_BYTES_MIN crypto_kdf_blake2b_BYTES_MIN -SODIUM_EXPORT -size_t crypto_kdf_bytes_min(void); - -#define crypto_kdf_BYTES_MAX crypto_kdf_blake2b_BYTES_MAX -SODIUM_EXPORT -size_t crypto_kdf_bytes_max(void); - -#define crypto_kdf_CONTEXTBYTES crypto_kdf_blake2b_CONTEXTBYTES -SODIUM_EXPORT -size_t crypto_kdf_contextbytes(void); - -#define crypto_kdf_KEYBYTES crypto_kdf_blake2b_KEYBYTES -SODIUM_EXPORT -size_t crypto_kdf_keybytes(void); - -#define crypto_kdf_PRIMITIVE "blake2b" -SODIUM_EXPORT -const char *crypto_kdf_primitive(void) - __attribute__ ((warn_unused_result)); - -SODIUM_EXPORT -int crypto_kdf_derive_from_key(unsigned char *subkey, size_t subkey_len, - uint64_t subkey_id, - const char ctx[crypto_kdf_CONTEXTBYTES], - const unsigned char key[crypto_kdf_KEYBYTES]) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -void crypto_kdf_keygen(unsigned char k[crypto_kdf_KEYBYTES]) - __attribute__ ((nonnull)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_kdf_blake2b.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_kdf_blake2b.h deleted file mode 100644 index 489c7c20..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_kdf_blake2b.h +++ /dev/null @@ -1,44 +0,0 @@ -#ifndef crypto_kdf_blake2b_H -#define crypto_kdf_blake2b_H - -#include -#include -#include - -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -#define crypto_kdf_blake2b_BYTES_MIN 16 -SODIUM_EXPORT -size_t crypto_kdf_blake2b_bytes_min(void); - -#define crypto_kdf_blake2b_BYTES_MAX 64 -SODIUM_EXPORT -size_t crypto_kdf_blake2b_bytes_max(void); - -#define crypto_kdf_blake2b_CONTEXTBYTES 8 -SODIUM_EXPORT -size_t crypto_kdf_blake2b_contextbytes(void); - -#define crypto_kdf_blake2b_KEYBYTES 32 -SODIUM_EXPORT -size_t crypto_kdf_blake2b_keybytes(void); - -SODIUM_EXPORT -int crypto_kdf_blake2b_derive_from_key(unsigned char *subkey, size_t subkey_len, - uint64_t subkey_id, - const char ctx[crypto_kdf_blake2b_CONTEXTBYTES], - const unsigned char key[crypto_kdf_blake2b_KEYBYTES]) - __attribute__ ((nonnull)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_kdf_hkdf_sha256.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_kdf_hkdf_sha256.h deleted file mode 100644 index 899a6316..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_kdf_hkdf_sha256.h +++ /dev/null @@ -1,48 +0,0 @@ -#ifndef crypto_kdf_hkdf_sha256_H -#define crypto_kdf_hkdf_sha256_H - -#include -#include -#include - -#include "crypto_kdf.h" -#include "crypto_auth_hmacsha256.h" -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -#define crypto_kdf_hkdf_sha256_KEYBYTES crypto_auth_hmacsha256_BYTES -SODIUM_EXPORT -size_t crypto_kdf_hkdf_sha256_keybytes(void); - -#define crypto_kdf_hkdf_sha256_BYTES_MIN 0U -SODIUM_EXPORT -size_t crypto_kdf_hkdf_sha256_bytes_min(void); - -#define crypto_kdf_hkdf_sha256_BYTES_MAX (0xff * crypto_auth_hmacsha256_BYTES) -SODIUM_EXPORT -size_t crypto_kdf_hkdf_sha256_bytes_max(void); - -SODIUM_EXPORT -int crypto_kdf_hkdf_sha256_extract(unsigned char prk[crypto_kdf_hkdf_sha256_KEYBYTES], - const unsigned char *salt, size_t salt_len, - const unsigned char *ikm, size_t ikm_len); - -SODIUM_EXPORT -void crypto_kdf_hkdf_sha256_keygen(unsigned char prk[crypto_kdf_hkdf_sha256_KEYBYTES]); - -SODIUM_EXPORT -int crypto_kdf_hkdf_sha256_expand(unsigned char *out, size_t out_len, - const char *ctx, size_t ctx_len, - const unsigned char prk[crypto_kdf_hkdf_sha256_KEYBYTES]); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_kdf_hkdf_sha512.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_kdf_hkdf_sha512.h deleted file mode 100644 index 3fa6868c..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_kdf_hkdf_sha512.h +++ /dev/null @@ -1,51 +0,0 @@ -#ifndef crypto_kdf_hkdf_sha512_H -#define crypto_kdf_hkdf_sha512_H - -#include -#include -#include - -#include "crypto_kdf.h" -#include "crypto_auth_hmacsha512.h" -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -#define crypto_kdf_hkdf_sha512_KEYBYTES crypto_auth_hmacsha512_BYTES -SODIUM_EXPORT -size_t crypto_kdf_hkdf_sha512_keybytes(void); - -#define crypto_kdf_hkdf_sha512_BYTES_MIN 0U -SODIUM_EXPORT -size_t crypto_kdf_hkdf_sha512_bytes_min(void); - -#define crypto_kdf_hkdf_sha512_BYTES_MAX (0xff * crypto_auth_hmacsha512_BYTES) -SODIUM_EXPORT -size_t crypto_kdf_hkdf_sha512_bytes_max(void); - -SODIUM_EXPORT -int crypto_kdf_hkdf_sha512_extract(unsigned char prk[crypto_kdf_hkdf_sha512_KEYBYTES], - const unsigned char *salt, size_t salt_len, - const unsigned char *ikm, size_t ikm_len) - __attribute__ ((nonnull(1))); - -SODIUM_EXPORT -void crypto_kdf_hkdf_sha512_keygen(unsigned char prk[crypto_kdf_hkdf_sha512_KEYBYTES]) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_kdf_hkdf_sha512_expand(unsigned char *out, size_t out_len, - const char *ctx, size_t ctx_len, - const unsigned char prk[crypto_kdf_hkdf_sha512_KEYBYTES]) - __attribute__ ((nonnull(1))); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_kx.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_kx.h deleted file mode 100644 index 347132c3..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_kx.h +++ /dev/null @@ -1,66 +0,0 @@ -#ifndef crypto_kx_H -#define crypto_kx_H - -#include - -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -#define crypto_kx_PUBLICKEYBYTES 32 -SODIUM_EXPORT -size_t crypto_kx_publickeybytes(void); - -#define crypto_kx_SECRETKEYBYTES 32 -SODIUM_EXPORT -size_t crypto_kx_secretkeybytes(void); - -#define crypto_kx_SEEDBYTES 32 -SODIUM_EXPORT -size_t crypto_kx_seedbytes(void); - -#define crypto_kx_SESSIONKEYBYTES 32 -SODIUM_EXPORT -size_t crypto_kx_sessionkeybytes(void); - -#define crypto_kx_PRIMITIVE "x25519blake2b" -SODIUM_EXPORT -const char *crypto_kx_primitive(void); - -SODIUM_EXPORT -int crypto_kx_seed_keypair(unsigned char pk[crypto_kx_PUBLICKEYBYTES], - unsigned char sk[crypto_kx_SECRETKEYBYTES], - const unsigned char seed[crypto_kx_SEEDBYTES]) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_kx_keypair(unsigned char pk[crypto_kx_PUBLICKEYBYTES], - unsigned char sk[crypto_kx_SECRETKEYBYTES]) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_kx_client_session_keys(unsigned char rx[crypto_kx_SESSIONKEYBYTES], - unsigned char tx[crypto_kx_SESSIONKEYBYTES], - const unsigned char client_pk[crypto_kx_PUBLICKEYBYTES], - const unsigned char client_sk[crypto_kx_SECRETKEYBYTES], - const unsigned char server_pk[crypto_kx_PUBLICKEYBYTES]) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(3, 4, 5))); - -SODIUM_EXPORT -int crypto_kx_server_session_keys(unsigned char rx[crypto_kx_SESSIONKEYBYTES], - unsigned char tx[crypto_kx_SESSIONKEYBYTES], - const unsigned char server_pk[crypto_kx_PUBLICKEYBYTES], - const unsigned char server_sk[crypto_kx_SECRETKEYBYTES], - const unsigned char client_pk[crypto_kx_PUBLICKEYBYTES]) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(3, 4, 5))); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_onetimeauth.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_onetimeauth.h deleted file mode 100644 index 7cd7b070..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_onetimeauth.h +++ /dev/null @@ -1,65 +0,0 @@ -#ifndef crypto_onetimeauth_H -#define crypto_onetimeauth_H - -#include - -#include "crypto_onetimeauth_poly1305.h" -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -typedef crypto_onetimeauth_poly1305_state crypto_onetimeauth_state; - -SODIUM_EXPORT -size_t crypto_onetimeauth_statebytes(void); - -#define crypto_onetimeauth_BYTES crypto_onetimeauth_poly1305_BYTES -SODIUM_EXPORT -size_t crypto_onetimeauth_bytes(void); - -#define crypto_onetimeauth_KEYBYTES crypto_onetimeauth_poly1305_KEYBYTES -SODIUM_EXPORT -size_t crypto_onetimeauth_keybytes(void); - -#define crypto_onetimeauth_PRIMITIVE "poly1305" -SODIUM_EXPORT -const char *crypto_onetimeauth_primitive(void); - -SODIUM_EXPORT -int crypto_onetimeauth(unsigned char *out, const unsigned char *in, - unsigned long long inlen, const unsigned char *k) - __attribute__ ((nonnull(1, 4))); - -SODIUM_EXPORT -int crypto_onetimeauth_verify(const unsigned char *h, const unsigned char *in, - unsigned long long inlen, const unsigned char *k) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(1, 4))); - -SODIUM_EXPORT -int crypto_onetimeauth_init(crypto_onetimeauth_state *state, - const unsigned char *key) __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_onetimeauth_update(crypto_onetimeauth_state *state, - const unsigned char *in, - unsigned long long inlen) - __attribute__ ((nonnull(1))); - -SODIUM_EXPORT -int crypto_onetimeauth_final(crypto_onetimeauth_state *state, - unsigned char *out) __attribute__ ((nonnull)); - -SODIUM_EXPORT -void crypto_onetimeauth_keygen(unsigned char k[crypto_onetimeauth_KEYBYTES]) - __attribute__ ((nonnull)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_onetimeauth_poly1305.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_onetimeauth_poly1305.h deleted file mode 100644 index f3e34d86..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_onetimeauth_poly1305.h +++ /dev/null @@ -1,72 +0,0 @@ -#ifndef crypto_onetimeauth_poly1305_H -#define crypto_onetimeauth_poly1305_H - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -#include -#include -#include - -#include - -#include "export.h" - -typedef struct CRYPTO_ALIGN(16) crypto_onetimeauth_poly1305_state { - unsigned char opaque[256]; -} crypto_onetimeauth_poly1305_state; - -SODIUM_EXPORT -size_t crypto_onetimeauth_poly1305_statebytes(void); - -#define crypto_onetimeauth_poly1305_BYTES 16U -SODIUM_EXPORT -size_t crypto_onetimeauth_poly1305_bytes(void); - -#define crypto_onetimeauth_poly1305_KEYBYTES 32U -SODIUM_EXPORT -size_t crypto_onetimeauth_poly1305_keybytes(void); - -SODIUM_EXPORT -int crypto_onetimeauth_poly1305(unsigned char *out, - const unsigned char *in, - unsigned long long inlen, - const unsigned char *k) - __attribute__ ((nonnull(1, 4))); - -SODIUM_EXPORT -int crypto_onetimeauth_poly1305_verify(const unsigned char *h, - const unsigned char *in, - unsigned long long inlen, - const unsigned char *k) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(1, 4))); - -SODIUM_EXPORT -int crypto_onetimeauth_poly1305_init(crypto_onetimeauth_poly1305_state *state, - const unsigned char *key) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_onetimeauth_poly1305_update(crypto_onetimeauth_poly1305_state *state, - const unsigned char *in, - unsigned long long inlen) - __attribute__ ((nonnull(1))); - -SODIUM_EXPORT -int crypto_onetimeauth_poly1305_final(crypto_onetimeauth_poly1305_state *state, - unsigned char *out) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -void crypto_onetimeauth_poly1305_keygen(unsigned char k[crypto_onetimeauth_poly1305_KEYBYTES]) - __attribute__ ((nonnull)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_pwhash.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_pwhash.h deleted file mode 100644 index 307265d3..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_pwhash.h +++ /dev/null @@ -1,147 +0,0 @@ -#ifndef crypto_pwhash_H -#define crypto_pwhash_H - -#include - -#include "crypto_pwhash_argon2i.h" -#include "crypto_pwhash_argon2id.h" -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -#define crypto_pwhash_ALG_ARGON2I13 crypto_pwhash_argon2i_ALG_ARGON2I13 -SODIUM_EXPORT -int crypto_pwhash_alg_argon2i13(void); - -#define crypto_pwhash_ALG_ARGON2ID13 crypto_pwhash_argon2id_ALG_ARGON2ID13 -SODIUM_EXPORT -int crypto_pwhash_alg_argon2id13(void); - -#define crypto_pwhash_ALG_DEFAULT crypto_pwhash_ALG_ARGON2ID13 -SODIUM_EXPORT -int crypto_pwhash_alg_default(void); - -#define crypto_pwhash_BYTES_MIN crypto_pwhash_argon2id_BYTES_MIN -SODIUM_EXPORT -size_t crypto_pwhash_bytes_min(void); - -#define crypto_pwhash_BYTES_MAX crypto_pwhash_argon2id_BYTES_MAX -SODIUM_EXPORT -size_t crypto_pwhash_bytes_max(void); - -#define crypto_pwhash_PASSWD_MIN crypto_pwhash_argon2id_PASSWD_MIN -SODIUM_EXPORT -size_t crypto_pwhash_passwd_min(void); - -#define crypto_pwhash_PASSWD_MAX crypto_pwhash_argon2id_PASSWD_MAX -SODIUM_EXPORT -size_t crypto_pwhash_passwd_max(void); - -#define crypto_pwhash_SALTBYTES crypto_pwhash_argon2id_SALTBYTES -SODIUM_EXPORT -size_t crypto_pwhash_saltbytes(void); - -#define crypto_pwhash_STRBYTES crypto_pwhash_argon2id_STRBYTES -SODIUM_EXPORT -size_t crypto_pwhash_strbytes(void); - -#define crypto_pwhash_STRPREFIX crypto_pwhash_argon2id_STRPREFIX -SODIUM_EXPORT -const char *crypto_pwhash_strprefix(void); - -#define crypto_pwhash_OPSLIMIT_MIN crypto_pwhash_argon2id_OPSLIMIT_MIN -SODIUM_EXPORT -unsigned long long crypto_pwhash_opslimit_min(void); - -#define crypto_pwhash_OPSLIMIT_MAX crypto_pwhash_argon2id_OPSLIMIT_MAX -SODIUM_EXPORT -unsigned long long crypto_pwhash_opslimit_max(void); - -#define crypto_pwhash_MEMLIMIT_MIN crypto_pwhash_argon2id_MEMLIMIT_MIN -SODIUM_EXPORT -size_t crypto_pwhash_memlimit_min(void); - -#define crypto_pwhash_MEMLIMIT_MAX crypto_pwhash_argon2id_MEMLIMIT_MAX -SODIUM_EXPORT -size_t crypto_pwhash_memlimit_max(void); - -#define crypto_pwhash_OPSLIMIT_INTERACTIVE crypto_pwhash_argon2id_OPSLIMIT_INTERACTIVE -SODIUM_EXPORT -unsigned long long crypto_pwhash_opslimit_interactive(void); - -#define crypto_pwhash_MEMLIMIT_INTERACTIVE crypto_pwhash_argon2id_MEMLIMIT_INTERACTIVE -SODIUM_EXPORT -size_t crypto_pwhash_memlimit_interactive(void); - -#define crypto_pwhash_OPSLIMIT_MODERATE crypto_pwhash_argon2id_OPSLIMIT_MODERATE -SODIUM_EXPORT -unsigned long long crypto_pwhash_opslimit_moderate(void); - -#define crypto_pwhash_MEMLIMIT_MODERATE crypto_pwhash_argon2id_MEMLIMIT_MODERATE -SODIUM_EXPORT -size_t crypto_pwhash_memlimit_moderate(void); - -#define crypto_pwhash_OPSLIMIT_SENSITIVE crypto_pwhash_argon2id_OPSLIMIT_SENSITIVE -SODIUM_EXPORT -unsigned long long crypto_pwhash_opslimit_sensitive(void); - -#define crypto_pwhash_MEMLIMIT_SENSITIVE crypto_pwhash_argon2id_MEMLIMIT_SENSITIVE -SODIUM_EXPORT -size_t crypto_pwhash_memlimit_sensitive(void); - -/* - * With this function, do not forget to store all parameters, including the - * algorithm identifier in order to produce deterministic output. - * The crypto_pwhash_* definitions, including crypto_pwhash_ALG_DEFAULT, - * may change. - */ -SODIUM_EXPORT -int crypto_pwhash(unsigned char * const out, unsigned long long outlen, - const char * const passwd, unsigned long long passwdlen, - const unsigned char * const salt, - unsigned long long opslimit, size_t memlimit, int alg) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull)); - -/* - * The output string already includes all the required parameters, including - * the algorithm identifier. The string is all that has to be stored in - * order to verify a password. - */ -SODIUM_EXPORT -int crypto_pwhash_str(char out[crypto_pwhash_STRBYTES], - const char * const passwd, unsigned long long passwdlen, - unsigned long long opslimit, size_t memlimit) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_pwhash_str_alg(char out[crypto_pwhash_STRBYTES], - const char * const passwd, unsigned long long passwdlen, - unsigned long long opslimit, size_t memlimit, int alg) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_pwhash_str_verify(const char *str, - const char * const passwd, - unsigned long long passwdlen) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_pwhash_str_needs_rehash(const char *str, - unsigned long long opslimit, size_t memlimit) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull)); - -#define crypto_pwhash_PRIMITIVE "argon2i" -SODIUM_EXPORT -const char *crypto_pwhash_primitive(void) - __attribute__ ((warn_unused_result)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_pwhash_argon2i.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_pwhash_argon2i.h deleted file mode 100644 index 91156ba0..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_pwhash_argon2i.h +++ /dev/null @@ -1,122 +0,0 @@ -#ifndef crypto_pwhash_argon2i_H -#define crypto_pwhash_argon2i_H - -#include -#include -#include - -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -#define crypto_pwhash_argon2i_ALG_ARGON2I13 1 -SODIUM_EXPORT -int crypto_pwhash_argon2i_alg_argon2i13(void); - -#define crypto_pwhash_argon2i_BYTES_MIN 16U -SODIUM_EXPORT -size_t crypto_pwhash_argon2i_bytes_min(void); - -#define crypto_pwhash_argon2i_BYTES_MAX SODIUM_MIN(SODIUM_SIZE_MAX, 4294967295U) -SODIUM_EXPORT -size_t crypto_pwhash_argon2i_bytes_max(void); - -#define crypto_pwhash_argon2i_PASSWD_MIN 0U -SODIUM_EXPORT -size_t crypto_pwhash_argon2i_passwd_min(void); - -#define crypto_pwhash_argon2i_PASSWD_MAX 4294967295U -SODIUM_EXPORT -size_t crypto_pwhash_argon2i_passwd_max(void); - -#define crypto_pwhash_argon2i_SALTBYTES 16U -SODIUM_EXPORT -size_t crypto_pwhash_argon2i_saltbytes(void); - -#define crypto_pwhash_argon2i_STRBYTES 128U -SODIUM_EXPORT -size_t crypto_pwhash_argon2i_strbytes(void); - -#define crypto_pwhash_argon2i_STRPREFIX "$argon2i$" -SODIUM_EXPORT -const char *crypto_pwhash_argon2i_strprefix(void); - -#define crypto_pwhash_argon2i_OPSLIMIT_MIN 3U -SODIUM_EXPORT -unsigned long long crypto_pwhash_argon2i_opslimit_min(void); - -#define crypto_pwhash_argon2i_OPSLIMIT_MAX 4294967295U -SODIUM_EXPORT -unsigned long long crypto_pwhash_argon2i_opslimit_max(void); - -#define crypto_pwhash_argon2i_MEMLIMIT_MIN 8192U -SODIUM_EXPORT -size_t crypto_pwhash_argon2i_memlimit_min(void); - -#define crypto_pwhash_argon2i_MEMLIMIT_MAX \ - ((SIZE_MAX >= 4398046510080U) ? 4398046510080U : (SIZE_MAX >= 2147483648U) ? 2147483648U : 32768U) -SODIUM_EXPORT -size_t crypto_pwhash_argon2i_memlimit_max(void); - -#define crypto_pwhash_argon2i_OPSLIMIT_INTERACTIVE 4U -SODIUM_EXPORT -unsigned long long crypto_pwhash_argon2i_opslimit_interactive(void); - -#define crypto_pwhash_argon2i_MEMLIMIT_INTERACTIVE 33554432U -SODIUM_EXPORT -size_t crypto_pwhash_argon2i_memlimit_interactive(void); - -#define crypto_pwhash_argon2i_OPSLIMIT_MODERATE 6U -SODIUM_EXPORT -unsigned long long crypto_pwhash_argon2i_opslimit_moderate(void); - -#define crypto_pwhash_argon2i_MEMLIMIT_MODERATE 134217728U -SODIUM_EXPORT -size_t crypto_pwhash_argon2i_memlimit_moderate(void); - -#define crypto_pwhash_argon2i_OPSLIMIT_SENSITIVE 8U -SODIUM_EXPORT -unsigned long long crypto_pwhash_argon2i_opslimit_sensitive(void); - -#define crypto_pwhash_argon2i_MEMLIMIT_SENSITIVE 536870912U -SODIUM_EXPORT -size_t crypto_pwhash_argon2i_memlimit_sensitive(void); - -SODIUM_EXPORT -int crypto_pwhash_argon2i(unsigned char * const out, - unsigned long long outlen, - const char * const passwd, - unsigned long long passwdlen, - const unsigned char * const salt, - unsigned long long opslimit, size_t memlimit, - int alg) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_pwhash_argon2i_str(char out[crypto_pwhash_argon2i_STRBYTES], - const char * const passwd, - unsigned long long passwdlen, - unsigned long long opslimit, size_t memlimit) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_pwhash_argon2i_str_verify(const char * str, - const char * const passwd, - unsigned long long passwdlen) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_pwhash_argon2i_str_needs_rehash(const char * str, - unsigned long long opslimit, size_t memlimit) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_pwhash_argon2id.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_pwhash_argon2id.h deleted file mode 100644 index e6f72a92..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_pwhash_argon2id.h +++ /dev/null @@ -1,122 +0,0 @@ -#ifndef crypto_pwhash_argon2id_H -#define crypto_pwhash_argon2id_H - -#include -#include -#include - -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -#define crypto_pwhash_argon2id_ALG_ARGON2ID13 2 -SODIUM_EXPORT -int crypto_pwhash_argon2id_alg_argon2id13(void); - -#define crypto_pwhash_argon2id_BYTES_MIN 16U -SODIUM_EXPORT -size_t crypto_pwhash_argon2id_bytes_min(void); - -#define crypto_pwhash_argon2id_BYTES_MAX SODIUM_MIN(SODIUM_SIZE_MAX, 4294967295U) -SODIUM_EXPORT -size_t crypto_pwhash_argon2id_bytes_max(void); - -#define crypto_pwhash_argon2id_PASSWD_MIN 0U -SODIUM_EXPORT -size_t crypto_pwhash_argon2id_passwd_min(void); - -#define crypto_pwhash_argon2id_PASSWD_MAX 4294967295U -SODIUM_EXPORT -size_t crypto_pwhash_argon2id_passwd_max(void); - -#define crypto_pwhash_argon2id_SALTBYTES 16U -SODIUM_EXPORT -size_t crypto_pwhash_argon2id_saltbytes(void); - -#define crypto_pwhash_argon2id_STRBYTES 128U -SODIUM_EXPORT -size_t crypto_pwhash_argon2id_strbytes(void); - -#define crypto_pwhash_argon2id_STRPREFIX "$argon2id$" -SODIUM_EXPORT -const char *crypto_pwhash_argon2id_strprefix(void); - -#define crypto_pwhash_argon2id_OPSLIMIT_MIN 1U -SODIUM_EXPORT -unsigned long long crypto_pwhash_argon2id_opslimit_min(void); - -#define crypto_pwhash_argon2id_OPSLIMIT_MAX 4294967295U -SODIUM_EXPORT -unsigned long long crypto_pwhash_argon2id_opslimit_max(void); - -#define crypto_pwhash_argon2id_MEMLIMIT_MIN 8192U -SODIUM_EXPORT -size_t crypto_pwhash_argon2id_memlimit_min(void); - -#define crypto_pwhash_argon2id_MEMLIMIT_MAX \ - ((SIZE_MAX >= 4398046510080U) ? 4398046510080U : (SIZE_MAX >= 2147483648U) ? 2147483648U : 32768U) -SODIUM_EXPORT -size_t crypto_pwhash_argon2id_memlimit_max(void); - -#define crypto_pwhash_argon2id_OPSLIMIT_INTERACTIVE 2U -SODIUM_EXPORT -unsigned long long crypto_pwhash_argon2id_opslimit_interactive(void); - -#define crypto_pwhash_argon2id_MEMLIMIT_INTERACTIVE 67108864U -SODIUM_EXPORT -size_t crypto_pwhash_argon2id_memlimit_interactive(void); - -#define crypto_pwhash_argon2id_OPSLIMIT_MODERATE 3U -SODIUM_EXPORT -unsigned long long crypto_pwhash_argon2id_opslimit_moderate(void); - -#define crypto_pwhash_argon2id_MEMLIMIT_MODERATE 268435456U -SODIUM_EXPORT -size_t crypto_pwhash_argon2id_memlimit_moderate(void); - -#define crypto_pwhash_argon2id_OPSLIMIT_SENSITIVE 4U -SODIUM_EXPORT -unsigned long long crypto_pwhash_argon2id_opslimit_sensitive(void); - -#define crypto_pwhash_argon2id_MEMLIMIT_SENSITIVE 1073741824U -SODIUM_EXPORT -size_t crypto_pwhash_argon2id_memlimit_sensitive(void); - -SODIUM_EXPORT -int crypto_pwhash_argon2id(unsigned char * const out, - unsigned long long outlen, - const char * const passwd, - unsigned long long passwdlen, - const unsigned char * const salt, - unsigned long long opslimit, size_t memlimit, - int alg) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_pwhash_argon2id_str(char out[crypto_pwhash_argon2id_STRBYTES], - const char * const passwd, - unsigned long long passwdlen, - unsigned long long opslimit, size_t memlimit) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_pwhash_argon2id_str_verify(const char * str, - const char * const passwd, - unsigned long long passwdlen) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_pwhash_argon2id_str_needs_rehash(const char * str, - unsigned long long opslimit, size_t memlimit) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_pwhash_scryptsalsa208sha256.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_pwhash_scryptsalsa208sha256.h deleted file mode 100644 index 1fd3692f..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_pwhash_scryptsalsa208sha256.h +++ /dev/null @@ -1,120 +0,0 @@ -#ifndef crypto_pwhash_scryptsalsa208sha256_H -#define crypto_pwhash_scryptsalsa208sha256_H - -#include -#include -#include - -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -#define crypto_pwhash_scryptsalsa208sha256_BYTES_MIN 16U -SODIUM_EXPORT -size_t crypto_pwhash_scryptsalsa208sha256_bytes_min(void); - -#define crypto_pwhash_scryptsalsa208sha256_BYTES_MAX \ - SODIUM_MIN(SODIUM_SIZE_MAX, 0x1fffffffe0ULL) -SODIUM_EXPORT -size_t crypto_pwhash_scryptsalsa208sha256_bytes_max(void); - -#define crypto_pwhash_scryptsalsa208sha256_PASSWD_MIN 0U -SODIUM_EXPORT -size_t crypto_pwhash_scryptsalsa208sha256_passwd_min(void); - -#define crypto_pwhash_scryptsalsa208sha256_PASSWD_MAX SODIUM_SIZE_MAX -SODIUM_EXPORT -size_t crypto_pwhash_scryptsalsa208sha256_passwd_max(void); - -#define crypto_pwhash_scryptsalsa208sha256_SALTBYTES 32U -SODIUM_EXPORT -size_t crypto_pwhash_scryptsalsa208sha256_saltbytes(void); - -#define crypto_pwhash_scryptsalsa208sha256_STRBYTES 102U -SODIUM_EXPORT -size_t crypto_pwhash_scryptsalsa208sha256_strbytes(void); - -#define crypto_pwhash_scryptsalsa208sha256_STRPREFIX "$7$" -SODIUM_EXPORT -const char *crypto_pwhash_scryptsalsa208sha256_strprefix(void); - -#define crypto_pwhash_scryptsalsa208sha256_OPSLIMIT_MIN 32768U -SODIUM_EXPORT -unsigned long long crypto_pwhash_scryptsalsa208sha256_opslimit_min(void); - -#define crypto_pwhash_scryptsalsa208sha256_OPSLIMIT_MAX 4294967295U -SODIUM_EXPORT -unsigned long long crypto_pwhash_scryptsalsa208sha256_opslimit_max(void); - -#define crypto_pwhash_scryptsalsa208sha256_MEMLIMIT_MIN 16777216U -SODIUM_EXPORT -size_t crypto_pwhash_scryptsalsa208sha256_memlimit_min(void); - -#define crypto_pwhash_scryptsalsa208sha256_MEMLIMIT_MAX \ - SODIUM_MIN(SIZE_MAX, 68719476736ULL) -SODIUM_EXPORT -size_t crypto_pwhash_scryptsalsa208sha256_memlimit_max(void); - -#define crypto_pwhash_scryptsalsa208sha256_OPSLIMIT_INTERACTIVE 524288U -SODIUM_EXPORT -unsigned long long crypto_pwhash_scryptsalsa208sha256_opslimit_interactive(void); - -#define crypto_pwhash_scryptsalsa208sha256_MEMLIMIT_INTERACTIVE 16777216U -SODIUM_EXPORT -size_t crypto_pwhash_scryptsalsa208sha256_memlimit_interactive(void); - -#define crypto_pwhash_scryptsalsa208sha256_OPSLIMIT_SENSITIVE 33554432U -SODIUM_EXPORT -unsigned long long crypto_pwhash_scryptsalsa208sha256_opslimit_sensitive(void); - -#define crypto_pwhash_scryptsalsa208sha256_MEMLIMIT_SENSITIVE 1073741824U -SODIUM_EXPORT -size_t crypto_pwhash_scryptsalsa208sha256_memlimit_sensitive(void); - -SODIUM_EXPORT -int crypto_pwhash_scryptsalsa208sha256(unsigned char * const out, - unsigned long long outlen, - const char * const passwd, - unsigned long long passwdlen, - const unsigned char * const salt, - unsigned long long opslimit, - size_t memlimit) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_pwhash_scryptsalsa208sha256_str(char out[crypto_pwhash_scryptsalsa208sha256_STRBYTES], - const char * const passwd, - unsigned long long passwdlen, - unsigned long long opslimit, - size_t memlimit) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_pwhash_scryptsalsa208sha256_str_verify(const char * str, - const char * const passwd, - unsigned long long passwdlen) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_pwhash_scryptsalsa208sha256_ll(const uint8_t * passwd, size_t passwdlen, - const uint8_t * salt, size_t saltlen, - uint64_t N, uint32_t r, uint32_t p, - uint8_t * buf, size_t buflen) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_pwhash_scryptsalsa208sha256_str_needs_rehash(const char * str, - unsigned long long opslimit, - size_t memlimit) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_scalarmult.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_scalarmult.h deleted file mode 100644 index 1c685853..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_scalarmult.h +++ /dev/null @@ -1,46 +0,0 @@ -#ifndef crypto_scalarmult_H -#define crypto_scalarmult_H - -#include - -#include "crypto_scalarmult_curve25519.h" -#include "export.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#define crypto_scalarmult_BYTES crypto_scalarmult_curve25519_BYTES -SODIUM_EXPORT -size_t crypto_scalarmult_bytes(void); - -#define crypto_scalarmult_SCALARBYTES crypto_scalarmult_curve25519_SCALARBYTES -SODIUM_EXPORT -size_t crypto_scalarmult_scalarbytes(void); - -#define crypto_scalarmult_PRIMITIVE "curve25519" -SODIUM_EXPORT -const char *crypto_scalarmult_primitive(void); - -SODIUM_EXPORT -int crypto_scalarmult_base(unsigned char *q, const unsigned char *n) - __attribute__ ((nonnull)); - -/* - * NOTE: Do not use the result of this function directly for key exchange. - * - * Hash the result with the public keys in order to compute a shared - * secret key: H(q || client_pk || server_pk) - * - * Or unless this is not an option, use the crypto_kx() API instead. - */ -SODIUM_EXPORT -int crypto_scalarmult(unsigned char *q, const unsigned char *n, - const unsigned char *p) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_scalarmult_curve25519.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_scalarmult_curve25519.h deleted file mode 100644 index 60e9d0c5..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_scalarmult_curve25519.h +++ /dev/null @@ -1,42 +0,0 @@ -#ifndef crypto_scalarmult_curve25519_H -#define crypto_scalarmult_curve25519_H - -#include - -#include "export.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#define crypto_scalarmult_curve25519_BYTES 32U -SODIUM_EXPORT -size_t crypto_scalarmult_curve25519_bytes(void); - -#define crypto_scalarmult_curve25519_SCALARBYTES 32U -SODIUM_EXPORT -size_t crypto_scalarmult_curve25519_scalarbytes(void); - -/* - * NOTE: Do not use the result of this function directly for key exchange. - * - * Hash the result with the public keys in order to compute a shared - * secret key: H(q || client_pk || server_pk) - * - * Or unless this is not an option, use the crypto_kx() API instead. - */ -SODIUM_EXPORT -int crypto_scalarmult_curve25519(unsigned char *q, const unsigned char *n, - const unsigned char *p) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_scalarmult_curve25519_base(unsigned char *q, - const unsigned char *n) - __attribute__ ((nonnull)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_scalarmult_ed25519.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_scalarmult_ed25519.h deleted file mode 100644 index 2dfa4d70..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_scalarmult_ed25519.h +++ /dev/null @@ -1,51 +0,0 @@ - -#ifndef crypto_scalarmult_ed25519_H -#define crypto_scalarmult_ed25519_H - -#include - -#include "export.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#define crypto_scalarmult_ed25519_BYTES 32U -SODIUM_EXPORT -size_t crypto_scalarmult_ed25519_bytes(void); - -#define crypto_scalarmult_ed25519_SCALARBYTES 32U -SODIUM_EXPORT -size_t crypto_scalarmult_ed25519_scalarbytes(void); - -/* - * NOTE: Do not use the result of this function directly for key exchange. - * - * Hash the result with the public keys in order to compute a shared - * secret key: H(q || client_pk || server_pk) - * - * Or unless this is not an option, use the crypto_kx() API instead. - */ -SODIUM_EXPORT -int crypto_scalarmult_ed25519(unsigned char *q, const unsigned char *n, - const unsigned char *p) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_scalarmult_ed25519_noclamp(unsigned char *q, const unsigned char *n, - const unsigned char *p) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_scalarmult_ed25519_base(unsigned char *q, const unsigned char *n) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_scalarmult_ed25519_base_noclamp(unsigned char *q, const unsigned char *n) - __attribute__ ((nonnull)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_scalarmult_ristretto255.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_scalarmult_ristretto255.h deleted file mode 100644 index 40a45cce..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_scalarmult_ristretto255.h +++ /dev/null @@ -1,43 +0,0 @@ - -#ifndef crypto_scalarmult_ristretto255_H -#define crypto_scalarmult_ristretto255_H - -#include - -#include "export.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#define crypto_scalarmult_ristretto255_BYTES 32U -SODIUM_EXPORT -size_t crypto_scalarmult_ristretto255_bytes(void); - -#define crypto_scalarmult_ristretto255_SCALARBYTES 32U -SODIUM_EXPORT -size_t crypto_scalarmult_ristretto255_scalarbytes(void); - -/* - * NOTE: Do not use the result of this function directly for key exchange. - * - * Hash the result with the public keys in order to compute a shared - * secret key: H(q || client_pk || server_pk) - * - * Or unless this is not an option, use the crypto_kx() API instead. - */ -SODIUM_EXPORT -int crypto_scalarmult_ristretto255(unsigned char *q, const unsigned char *n, - const unsigned char *p) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_scalarmult_ristretto255_base(unsigned char *q, - const unsigned char *n) - __attribute__ ((nonnull)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_secretbox.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_secretbox.h deleted file mode 100644 index 68024b45..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_secretbox.h +++ /dev/null @@ -1,94 +0,0 @@ -#ifndef crypto_secretbox_H -#define crypto_secretbox_H - -#include - -#include "crypto_secretbox_xsalsa20poly1305.h" -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -#define crypto_secretbox_KEYBYTES crypto_secretbox_xsalsa20poly1305_KEYBYTES -SODIUM_EXPORT -size_t crypto_secretbox_keybytes(void); - -#define crypto_secretbox_NONCEBYTES crypto_secretbox_xsalsa20poly1305_NONCEBYTES -SODIUM_EXPORT -size_t crypto_secretbox_noncebytes(void); - -#define crypto_secretbox_MACBYTES crypto_secretbox_xsalsa20poly1305_MACBYTES -SODIUM_EXPORT -size_t crypto_secretbox_macbytes(void); - -#define crypto_secretbox_PRIMITIVE "xsalsa20poly1305" -SODIUM_EXPORT -const char *crypto_secretbox_primitive(void); - -#define crypto_secretbox_MESSAGEBYTES_MAX crypto_secretbox_xsalsa20poly1305_MESSAGEBYTES_MAX -SODIUM_EXPORT -size_t crypto_secretbox_messagebytes_max(void); - -SODIUM_EXPORT -int crypto_secretbox_easy(unsigned char *c, const unsigned char *m, - unsigned long long mlen, const unsigned char *n, - const unsigned char *k) __attribute__ ((nonnull(1, 4, 5))); - -SODIUM_EXPORT -int crypto_secretbox_open_easy(unsigned char *m, const unsigned char *c, - unsigned long long clen, const unsigned char *n, - const unsigned char *k) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(2, 4, 5))); - -SODIUM_EXPORT -int crypto_secretbox_detached(unsigned char *c, unsigned char *mac, - const unsigned char *m, - unsigned long long mlen, - const unsigned char *n, - const unsigned char *k) - __attribute__ ((nonnull(1, 2, 5, 6))); - -SODIUM_EXPORT -int crypto_secretbox_open_detached(unsigned char *m, - const unsigned char *c, - const unsigned char *mac, - unsigned long long clen, - const unsigned char *n, - const unsigned char *k) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(2, 3, 5, 6))); - -SODIUM_EXPORT -void crypto_secretbox_keygen(unsigned char k[crypto_secretbox_KEYBYTES]) - __attribute__ ((nonnull)); - -/* -- NaCl compatibility interface ; Requires padding -- */ - -#define crypto_secretbox_ZEROBYTES crypto_secretbox_xsalsa20poly1305_ZEROBYTES -SODIUM_EXPORT -size_t crypto_secretbox_zerobytes(void) __attribute__ ((deprecated)); - -#define crypto_secretbox_BOXZEROBYTES crypto_secretbox_xsalsa20poly1305_BOXZEROBYTES -SODIUM_EXPORT -size_t crypto_secretbox_boxzerobytes(void) __attribute__ ((deprecated)); - -SODIUM_EXPORT -int crypto_secretbox(unsigned char *c, const unsigned char *m, - unsigned long long mlen, const unsigned char *n, - const unsigned char *k) - __attribute__ ((deprecated)) __attribute__ ((nonnull(1, 4, 5))); - -SODIUM_EXPORT -int crypto_secretbox_open(unsigned char *m, const unsigned char *c, - unsigned long long clen, const unsigned char *n, - const unsigned char *k) - __attribute__ ((deprecated)) __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(2, 4, 5))); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_secretbox_xchacha20poly1305.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_secretbox_xchacha20poly1305.h deleted file mode 100644 index 6ec674e3..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_secretbox_xchacha20poly1305.h +++ /dev/null @@ -1,70 +0,0 @@ -#ifndef crypto_secretbox_xchacha20poly1305_H -#define crypto_secretbox_xchacha20poly1305_H - -#include -#include "crypto_stream_xchacha20.h" -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -#define crypto_secretbox_xchacha20poly1305_KEYBYTES 32U -SODIUM_EXPORT -size_t crypto_secretbox_xchacha20poly1305_keybytes(void); - -#define crypto_secretbox_xchacha20poly1305_NONCEBYTES 24U -SODIUM_EXPORT -size_t crypto_secretbox_xchacha20poly1305_noncebytes(void); - -#define crypto_secretbox_xchacha20poly1305_MACBYTES 16U -SODIUM_EXPORT -size_t crypto_secretbox_xchacha20poly1305_macbytes(void); - -#define crypto_secretbox_xchacha20poly1305_MESSAGEBYTES_MAX \ - (crypto_stream_xchacha20_MESSAGEBYTES_MAX - crypto_secretbox_xchacha20poly1305_MACBYTES) -SODIUM_EXPORT -size_t crypto_secretbox_xchacha20poly1305_messagebytes_max(void); - -SODIUM_EXPORT -int crypto_secretbox_xchacha20poly1305_easy(unsigned char *c, - const unsigned char *m, - unsigned long long mlen, - const unsigned char *n, - const unsigned char *k) - __attribute__ ((nonnull(1, 4, 5))); - -SODIUM_EXPORT -int crypto_secretbox_xchacha20poly1305_open_easy(unsigned char *m, - const unsigned char *c, - unsigned long long clen, - const unsigned char *n, - const unsigned char *k) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(2, 4, 5))); - -SODIUM_EXPORT -int crypto_secretbox_xchacha20poly1305_detached(unsigned char *c, - unsigned char *mac, - const unsigned char *m, - unsigned long long mlen, - const unsigned char *n, - const unsigned char *k) - __attribute__ ((nonnull(1, 2, 5, 6))); - -SODIUM_EXPORT -int crypto_secretbox_xchacha20poly1305_open_detached(unsigned char *m, - const unsigned char *c, - const unsigned char *mac, - unsigned long long clen, - const unsigned char *n, - const unsigned char *k) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(2, 3, 5, 6))); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_secretbox_xsalsa20poly1305.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_secretbox_xsalsa20poly1305.h deleted file mode 100644 index 81bff3d6..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_secretbox_xsalsa20poly1305.h +++ /dev/null @@ -1,71 +0,0 @@ -#ifndef crypto_secretbox_xsalsa20poly1305_H -#define crypto_secretbox_xsalsa20poly1305_H - -#include -#include "crypto_stream_xsalsa20.h" -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -#define crypto_secretbox_xsalsa20poly1305_KEYBYTES 32U -SODIUM_EXPORT -size_t crypto_secretbox_xsalsa20poly1305_keybytes(void); - -#define crypto_secretbox_xsalsa20poly1305_NONCEBYTES 24U -SODIUM_EXPORT -size_t crypto_secretbox_xsalsa20poly1305_noncebytes(void); - -#define crypto_secretbox_xsalsa20poly1305_MACBYTES 16U -SODIUM_EXPORT -size_t crypto_secretbox_xsalsa20poly1305_macbytes(void); - -/* Only for the libsodium API - The NaCl compatibility API would require BOXZEROBYTES extra bytes */ -#define crypto_secretbox_xsalsa20poly1305_MESSAGEBYTES_MAX \ - (crypto_stream_xsalsa20_MESSAGEBYTES_MAX - crypto_secretbox_xsalsa20poly1305_MACBYTES) -SODIUM_EXPORT -size_t crypto_secretbox_xsalsa20poly1305_messagebytes_max(void); - -SODIUM_EXPORT -void crypto_secretbox_xsalsa20poly1305_keygen(unsigned char k[crypto_secretbox_xsalsa20poly1305_KEYBYTES]) - __attribute__ ((nonnull)); - -/* -- NaCl compatibility interface ; Requires padding -- */ - -#define crypto_secretbox_xsalsa20poly1305_BOXZEROBYTES 16U -SODIUM_EXPORT -size_t crypto_secretbox_xsalsa20poly1305_boxzerobytes(void) - __attribute__ ((deprecated)); - -#define crypto_secretbox_xsalsa20poly1305_ZEROBYTES \ - (crypto_secretbox_xsalsa20poly1305_BOXZEROBYTES + \ - crypto_secretbox_xsalsa20poly1305_MACBYTES) -SODIUM_EXPORT -size_t crypto_secretbox_xsalsa20poly1305_zerobytes(void) - __attribute__ ((deprecated)); - -SODIUM_EXPORT -int crypto_secretbox_xsalsa20poly1305(unsigned char *c, - const unsigned char *m, - unsigned long long mlen, - const unsigned char *n, - const unsigned char *k) - __attribute__ ((deprecated)) __attribute__ ((nonnull(1, 4, 5))); - -SODIUM_EXPORT -int crypto_secretbox_xsalsa20poly1305_open(unsigned char *m, - const unsigned char *c, - unsigned long long clen, - const unsigned char *n, - const unsigned char *k) - __attribute__ ((deprecated)) __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(2, 4, 5))); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_secretstream_xchacha20poly1305.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_secretstream_xchacha20poly1305.h deleted file mode 100644 index b22e4e93..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_secretstream_xchacha20poly1305.h +++ /dev/null @@ -1,108 +0,0 @@ -#ifndef crypto_secretstream_xchacha20poly1305_H -#define crypto_secretstream_xchacha20poly1305_H - -#include - -#include "crypto_aead_xchacha20poly1305.h" -#include "crypto_stream_chacha20.h" -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -#define crypto_secretstream_xchacha20poly1305_ABYTES \ - (1U + crypto_aead_xchacha20poly1305_ietf_ABYTES) -SODIUM_EXPORT -size_t crypto_secretstream_xchacha20poly1305_abytes(void); - -#define crypto_secretstream_xchacha20poly1305_HEADERBYTES \ - crypto_aead_xchacha20poly1305_ietf_NPUBBYTES -SODIUM_EXPORT -size_t crypto_secretstream_xchacha20poly1305_headerbytes(void); - -#define crypto_secretstream_xchacha20poly1305_KEYBYTES \ - crypto_aead_xchacha20poly1305_ietf_KEYBYTES -SODIUM_EXPORT -size_t crypto_secretstream_xchacha20poly1305_keybytes(void); - -#define crypto_secretstream_xchacha20poly1305_MESSAGEBYTES_MAX \ - SODIUM_MIN(SODIUM_SIZE_MAX - crypto_secretstream_xchacha20poly1305_ABYTES, \ - (64ULL * ((1ULL << 32) - 2ULL))) -SODIUM_EXPORT -size_t crypto_secretstream_xchacha20poly1305_messagebytes_max(void); - -#define crypto_secretstream_xchacha20poly1305_TAG_MESSAGE 0x00 -SODIUM_EXPORT -unsigned char crypto_secretstream_xchacha20poly1305_tag_message(void); - -#define crypto_secretstream_xchacha20poly1305_TAG_PUSH 0x01 -SODIUM_EXPORT -unsigned char crypto_secretstream_xchacha20poly1305_tag_push(void); - -#define crypto_secretstream_xchacha20poly1305_TAG_REKEY 0x02 -SODIUM_EXPORT -unsigned char crypto_secretstream_xchacha20poly1305_tag_rekey(void); - -#define crypto_secretstream_xchacha20poly1305_TAG_FINAL \ - (crypto_secretstream_xchacha20poly1305_TAG_PUSH | \ - crypto_secretstream_xchacha20poly1305_TAG_REKEY) -SODIUM_EXPORT -unsigned char crypto_secretstream_xchacha20poly1305_tag_final(void); - -typedef struct crypto_secretstream_xchacha20poly1305_state { - unsigned char k[crypto_stream_chacha20_ietf_KEYBYTES]; - unsigned char nonce[crypto_stream_chacha20_ietf_NONCEBYTES]; - unsigned char _pad[8]; -} crypto_secretstream_xchacha20poly1305_state; - -SODIUM_EXPORT -size_t crypto_secretstream_xchacha20poly1305_statebytes(void); - -SODIUM_EXPORT -void crypto_secretstream_xchacha20poly1305_keygen - (unsigned char k[crypto_secretstream_xchacha20poly1305_KEYBYTES]) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_secretstream_xchacha20poly1305_init_push - (crypto_secretstream_xchacha20poly1305_state *state, - unsigned char header[crypto_secretstream_xchacha20poly1305_HEADERBYTES], - const unsigned char k[crypto_secretstream_xchacha20poly1305_KEYBYTES]) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_secretstream_xchacha20poly1305_push - (crypto_secretstream_xchacha20poly1305_state *state, - unsigned char *c, unsigned long long *clen_p, - const unsigned char *m, unsigned long long mlen, - const unsigned char *ad, unsigned long long adlen, unsigned char tag) - __attribute__ ((nonnull(1))); - -SODIUM_EXPORT -int crypto_secretstream_xchacha20poly1305_init_pull - (crypto_secretstream_xchacha20poly1305_state *state, - const unsigned char header[crypto_secretstream_xchacha20poly1305_HEADERBYTES], - const unsigned char k[crypto_secretstream_xchacha20poly1305_KEYBYTES]) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_secretstream_xchacha20poly1305_pull - (crypto_secretstream_xchacha20poly1305_state *state, - unsigned char *m, unsigned long long *mlen_p, unsigned char *tag_p, - const unsigned char *c, unsigned long long clen, - const unsigned char *ad, unsigned long long adlen) - __attribute__ ((nonnull(1))); - -SODIUM_EXPORT -void crypto_secretstream_xchacha20poly1305_rekey - (crypto_secretstream_xchacha20poly1305_state *state); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_shorthash.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_shorthash.h deleted file mode 100644 index fecaa88b..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_shorthash.h +++ /dev/null @@ -1,41 +0,0 @@ -#ifndef crypto_shorthash_H -#define crypto_shorthash_H - -#include - -#include "crypto_shorthash_siphash24.h" -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -#define crypto_shorthash_BYTES crypto_shorthash_siphash24_BYTES -SODIUM_EXPORT -size_t crypto_shorthash_bytes(void); - -#define crypto_shorthash_KEYBYTES crypto_shorthash_siphash24_KEYBYTES -SODIUM_EXPORT -size_t crypto_shorthash_keybytes(void); - -#define crypto_shorthash_PRIMITIVE "siphash24" -SODIUM_EXPORT -const char *crypto_shorthash_primitive(void); - -SODIUM_EXPORT -int crypto_shorthash(unsigned char *out, const unsigned char *in, - unsigned long long inlen, const unsigned char *k) - __attribute__ ((nonnull(1, 4))); - -SODIUM_EXPORT -void crypto_shorthash_keygen(unsigned char k[crypto_shorthash_KEYBYTES]) - __attribute__ ((nonnull)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_shorthash_siphash24.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_shorthash_siphash24.h deleted file mode 100644 index 1e6f72a6..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_shorthash_siphash24.h +++ /dev/null @@ -1,50 +0,0 @@ -#ifndef crypto_shorthash_siphash24_H -#define crypto_shorthash_siphash24_H - -#include -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -/* -- 64-bit output -- */ - -#define crypto_shorthash_siphash24_BYTES 8U -SODIUM_EXPORT -size_t crypto_shorthash_siphash24_bytes(void); - -#define crypto_shorthash_siphash24_KEYBYTES 16U -SODIUM_EXPORT -size_t crypto_shorthash_siphash24_keybytes(void); - -SODIUM_EXPORT -int crypto_shorthash_siphash24(unsigned char *out, const unsigned char *in, - unsigned long long inlen, const unsigned char *k) - __attribute__ ((nonnull(1, 4))); - -#ifndef SODIUM_LIBRARY_MINIMAL -/* -- 128-bit output -- */ - -#define crypto_shorthash_siphashx24_BYTES 16U -SODIUM_EXPORT -size_t crypto_shorthash_siphashx24_bytes(void); - -#define crypto_shorthash_siphashx24_KEYBYTES 16U -SODIUM_EXPORT -size_t crypto_shorthash_siphashx24_keybytes(void); - -SODIUM_EXPORT -int crypto_shorthash_siphashx24(unsigned char *out, const unsigned char *in, - unsigned long long inlen, const unsigned char *k) - __attribute__ ((nonnull(1, 4))); -#endif - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_sign.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_sign.h deleted file mode 100644 index f5fafb12..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_sign.h +++ /dev/null @@ -1,107 +0,0 @@ -#ifndef crypto_sign_H -#define crypto_sign_H - -/* - * THREAD SAFETY: crypto_sign_keypair() is thread-safe, - * provided that sodium_init() was called before. - * - * Other functions, including crypto_sign_seed_keypair() are always thread-safe. - */ - -#include - -#include "crypto_sign_ed25519.h" -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -typedef crypto_sign_ed25519ph_state crypto_sign_state; - -SODIUM_EXPORT -size_t crypto_sign_statebytes(void); - -#define crypto_sign_BYTES crypto_sign_ed25519_BYTES -SODIUM_EXPORT -size_t crypto_sign_bytes(void); - -#define crypto_sign_SEEDBYTES crypto_sign_ed25519_SEEDBYTES -SODIUM_EXPORT -size_t crypto_sign_seedbytes(void); - -#define crypto_sign_PUBLICKEYBYTES crypto_sign_ed25519_PUBLICKEYBYTES -SODIUM_EXPORT -size_t crypto_sign_publickeybytes(void); - -#define crypto_sign_SECRETKEYBYTES crypto_sign_ed25519_SECRETKEYBYTES -SODIUM_EXPORT -size_t crypto_sign_secretkeybytes(void); - -#define crypto_sign_MESSAGEBYTES_MAX crypto_sign_ed25519_MESSAGEBYTES_MAX -SODIUM_EXPORT -size_t crypto_sign_messagebytes_max(void); - -#define crypto_sign_PRIMITIVE "ed25519" -SODIUM_EXPORT -const char *crypto_sign_primitive(void); - -SODIUM_EXPORT -int crypto_sign_seed_keypair(unsigned char *pk, unsigned char *sk, - const unsigned char *seed) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_sign_keypair(unsigned char *pk, unsigned char *sk) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_sign(unsigned char *sm, unsigned long long *smlen_p, - const unsigned char *m, unsigned long long mlen, - const unsigned char *sk) __attribute__ ((nonnull(1, 5))); - -SODIUM_EXPORT -int crypto_sign_open(unsigned char *m, unsigned long long *mlen_p, - const unsigned char *sm, unsigned long long smlen, - const unsigned char *pk) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(3, 5))); - -SODIUM_EXPORT -int crypto_sign_detached(unsigned char *sig, unsigned long long *siglen_p, - const unsigned char *m, unsigned long long mlen, - const unsigned char *sk) __attribute__ ((nonnull(1, 5))); - -SODIUM_EXPORT -int crypto_sign_verify_detached(const unsigned char *sig, - const unsigned char *m, - unsigned long long mlen, - const unsigned char *pk) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(1, 4))); - -SODIUM_EXPORT -int crypto_sign_init(crypto_sign_state *state); - -SODIUM_EXPORT -int crypto_sign_update(crypto_sign_state *state, - const unsigned char *m, unsigned long long mlen) - __attribute__ ((nonnull(1))); - -SODIUM_EXPORT -int crypto_sign_final_create(crypto_sign_state *state, unsigned char *sig, - unsigned long long *siglen_p, - const unsigned char *sk) - __attribute__ ((nonnull(1, 2, 4))); - -SODIUM_EXPORT -int crypto_sign_final_verify(crypto_sign_state *state, const unsigned char *sig, - const unsigned char *pk) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_sign_ed25519.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_sign_ed25519.h deleted file mode 100644 index 0fdac42d..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_sign_ed25519.h +++ /dev/null @@ -1,124 +0,0 @@ -#ifndef crypto_sign_ed25519_H -#define crypto_sign_ed25519_H - -#include -#include "crypto_hash_sha512.h" -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -typedef struct crypto_sign_ed25519ph_state { - crypto_hash_sha512_state hs; -} crypto_sign_ed25519ph_state; - -SODIUM_EXPORT -size_t crypto_sign_ed25519ph_statebytes(void); - -#define crypto_sign_ed25519_BYTES 64U -SODIUM_EXPORT -size_t crypto_sign_ed25519_bytes(void); - -#define crypto_sign_ed25519_SEEDBYTES 32U -SODIUM_EXPORT -size_t crypto_sign_ed25519_seedbytes(void); - -#define crypto_sign_ed25519_PUBLICKEYBYTES 32U -SODIUM_EXPORT -size_t crypto_sign_ed25519_publickeybytes(void); - -#define crypto_sign_ed25519_SECRETKEYBYTES (32U + 32U) -SODIUM_EXPORT -size_t crypto_sign_ed25519_secretkeybytes(void); - -#define crypto_sign_ed25519_MESSAGEBYTES_MAX (SODIUM_SIZE_MAX - crypto_sign_ed25519_BYTES) -SODIUM_EXPORT -size_t crypto_sign_ed25519_messagebytes_max(void); - -SODIUM_EXPORT -int crypto_sign_ed25519(unsigned char *sm, unsigned long long *smlen_p, - const unsigned char *m, unsigned long long mlen, - const unsigned char *sk) - __attribute__ ((nonnull(1, 5))); - -SODIUM_EXPORT -int crypto_sign_ed25519_open(unsigned char *m, unsigned long long *mlen_p, - const unsigned char *sm, unsigned long long smlen, - const unsigned char *pk) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(3, 5))); - -SODIUM_EXPORT -int crypto_sign_ed25519_detached(unsigned char *sig, - unsigned long long *siglen_p, - const unsigned char *m, - unsigned long long mlen, - const unsigned char *sk) - __attribute__ ((nonnull(1, 5))); - -SODIUM_EXPORT -int crypto_sign_ed25519_verify_detached(const unsigned char *sig, - const unsigned char *m, - unsigned long long mlen, - const unsigned char *pk) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(1, 4))); - -SODIUM_EXPORT -int crypto_sign_ed25519_keypair(unsigned char *pk, unsigned char *sk) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_sign_ed25519_seed_keypair(unsigned char *pk, unsigned char *sk, - const unsigned char *seed) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_sign_ed25519_pk_to_curve25519(unsigned char *curve25519_pk, - const unsigned char *ed25519_pk) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_sign_ed25519_sk_to_curve25519(unsigned char *curve25519_sk, - const unsigned char *ed25519_sk) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_sign_ed25519_sk_to_seed(unsigned char *seed, - const unsigned char *sk) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_sign_ed25519_sk_to_pk(unsigned char *pk, const unsigned char *sk) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_sign_ed25519ph_init(crypto_sign_ed25519ph_state *state) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_sign_ed25519ph_update(crypto_sign_ed25519ph_state *state, - const unsigned char *m, - unsigned long long mlen) - __attribute__ ((nonnull(1))); - -SODIUM_EXPORT -int crypto_sign_ed25519ph_final_create(crypto_sign_ed25519ph_state *state, - unsigned char *sig, - unsigned long long *siglen_p, - const unsigned char *sk) - __attribute__ ((nonnull(1, 2, 4))); - -SODIUM_EXPORT -int crypto_sign_ed25519ph_final_verify(crypto_sign_ed25519ph_state *state, - const unsigned char *sig, - const unsigned char *pk) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_stream.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_stream.h deleted file mode 100644 index 88dab5f6..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_stream.h +++ /dev/null @@ -1,59 +0,0 @@ -#ifndef crypto_stream_H -#define crypto_stream_H - -/* - * WARNING: This is just a stream cipher. It is NOT authenticated encryption. - * While it provides some protection against eavesdropping, it does NOT - * provide any security against active attacks. - * Unless you know what you're doing, what you are looking for is probably - * the crypto_box functions. - */ - -#include - -#include "crypto_stream_xsalsa20.h" -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -#define crypto_stream_KEYBYTES crypto_stream_xsalsa20_KEYBYTES -SODIUM_EXPORT -size_t crypto_stream_keybytes(void); - -#define crypto_stream_NONCEBYTES crypto_stream_xsalsa20_NONCEBYTES -SODIUM_EXPORT -size_t crypto_stream_noncebytes(void); - -#define crypto_stream_MESSAGEBYTES_MAX crypto_stream_xsalsa20_MESSAGEBYTES_MAX -SODIUM_EXPORT -size_t crypto_stream_messagebytes_max(void); - -#define crypto_stream_PRIMITIVE "xsalsa20" -SODIUM_EXPORT -const char *crypto_stream_primitive(void); - -SODIUM_EXPORT -int crypto_stream(unsigned char *c, unsigned long long clen, - const unsigned char *n, const unsigned char *k) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_stream_xor(unsigned char *c, const unsigned char *m, - unsigned long long mlen, const unsigned char *n, - const unsigned char *k) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -void crypto_stream_keygen(unsigned char k[crypto_stream_KEYBYTES]) - __attribute__ ((nonnull)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_stream_chacha20.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_stream_chacha20.h deleted file mode 100644 index 40889755..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_stream_chacha20.h +++ /dev/null @@ -1,106 +0,0 @@ -#ifndef crypto_stream_chacha20_H -#define crypto_stream_chacha20_H - -/* - * WARNING: This is just a stream cipher. It is NOT authenticated encryption. - * While it provides some protection against eavesdropping, it does NOT - * provide any security against active attacks. - * Unless you know what you're doing, what you are looking for is probably - * the crypto_box functions. - */ - -#include -#include -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -#define crypto_stream_chacha20_KEYBYTES 32U -SODIUM_EXPORT -size_t crypto_stream_chacha20_keybytes(void); - -#define crypto_stream_chacha20_NONCEBYTES 8U -SODIUM_EXPORT -size_t crypto_stream_chacha20_noncebytes(void); - -#define crypto_stream_chacha20_MESSAGEBYTES_MAX SODIUM_SIZE_MAX -SODIUM_EXPORT -size_t crypto_stream_chacha20_messagebytes_max(void); - -/* ChaCha20 with a 64-bit nonce and a 64-bit counter, as originally designed */ - -SODIUM_EXPORT -int crypto_stream_chacha20(unsigned char *c, unsigned long long clen, - const unsigned char *n, const unsigned char *k) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_stream_chacha20_xor(unsigned char *c, const unsigned char *m, - unsigned long long mlen, const unsigned char *n, - const unsigned char *k) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_stream_chacha20_xor_ic(unsigned char *c, const unsigned char *m, - unsigned long long mlen, - const unsigned char *n, uint64_t ic, - const unsigned char *k) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -void crypto_stream_chacha20_keygen(unsigned char k[crypto_stream_chacha20_KEYBYTES]) - __attribute__ ((nonnull)); - -/* ChaCha20 with a 96-bit nonce and a 32-bit counter (IETF) */ - -#define crypto_stream_chacha20_ietf_KEYBYTES 32U -SODIUM_EXPORT -size_t crypto_stream_chacha20_ietf_keybytes(void); - -#define crypto_stream_chacha20_ietf_NONCEBYTES 12U -SODIUM_EXPORT -size_t crypto_stream_chacha20_ietf_noncebytes(void); - -#define crypto_stream_chacha20_ietf_MESSAGEBYTES_MAX \ - SODIUM_MIN(SODIUM_SIZE_MAX, 64ULL * (1ULL << 32)) -SODIUM_EXPORT -size_t crypto_stream_chacha20_ietf_messagebytes_max(void); - -SODIUM_EXPORT -int crypto_stream_chacha20_ietf(unsigned char *c, unsigned long long clen, - const unsigned char *n, const unsigned char *k) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_stream_chacha20_ietf_xor(unsigned char *c, const unsigned char *m, - unsigned long long mlen, const unsigned char *n, - const unsigned char *k) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_stream_chacha20_ietf_xor_ic(unsigned char *c, const unsigned char *m, - unsigned long long mlen, - const unsigned char *n, uint32_t ic, - const unsigned char *k) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -void crypto_stream_chacha20_ietf_keygen(unsigned char k[crypto_stream_chacha20_ietf_KEYBYTES]) - __attribute__ ((nonnull)); - -/* Aliases */ - -#define crypto_stream_chacha20_IETF_KEYBYTES crypto_stream_chacha20_ietf_KEYBYTES -#define crypto_stream_chacha20_IETF_NONCEBYTES crypto_stream_chacha20_ietf_NONCEBYTES -#define crypto_stream_chacha20_IETF_MESSAGEBYTES_MAX crypto_stream_chacha20_ietf_MESSAGEBYTES_MAX - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_stream_salsa20.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_stream_salsa20.h deleted file mode 100644 index 45b3b3e3..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_stream_salsa20.h +++ /dev/null @@ -1,61 +0,0 @@ -#ifndef crypto_stream_salsa20_H -#define crypto_stream_salsa20_H - -/* - * WARNING: This is just a stream cipher. It is NOT authenticated encryption. - * While it provides some protection against eavesdropping, it does NOT - * provide any security against active attacks. - * Unless you know what you're doing, what you are looking for is probably - * the crypto_box functions. - */ - -#include -#include -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -#define crypto_stream_salsa20_KEYBYTES 32U -SODIUM_EXPORT -size_t crypto_stream_salsa20_keybytes(void); - -#define crypto_stream_salsa20_NONCEBYTES 8U -SODIUM_EXPORT -size_t crypto_stream_salsa20_noncebytes(void); - -#define crypto_stream_salsa20_MESSAGEBYTES_MAX SODIUM_SIZE_MAX -SODIUM_EXPORT -size_t crypto_stream_salsa20_messagebytes_max(void); - -SODIUM_EXPORT -int crypto_stream_salsa20(unsigned char *c, unsigned long long clen, - const unsigned char *n, const unsigned char *k) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_stream_salsa20_xor(unsigned char *c, const unsigned char *m, - unsigned long long mlen, const unsigned char *n, - const unsigned char *k) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_stream_salsa20_xor_ic(unsigned char *c, const unsigned char *m, - unsigned long long mlen, - const unsigned char *n, uint64_t ic, - const unsigned char *k) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -void crypto_stream_salsa20_keygen(unsigned char k[crypto_stream_salsa20_KEYBYTES]) - __attribute__ ((nonnull)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_stream_salsa2012.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_stream_salsa2012.h deleted file mode 100644 index 6c5d303c..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_stream_salsa2012.h +++ /dev/null @@ -1,53 +0,0 @@ -#ifndef crypto_stream_salsa2012_H -#define crypto_stream_salsa2012_H - -/* - * WARNING: This is just a stream cipher. It is NOT authenticated encryption. - * While it provides some protection against eavesdropping, it does NOT - * provide any security against active attacks. - * Unless you know what you're doing, what you are looking for is probably - * the crypto_box functions. - */ - -#include -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -#define crypto_stream_salsa2012_KEYBYTES 32U -SODIUM_EXPORT -size_t crypto_stream_salsa2012_keybytes(void); - -#define crypto_stream_salsa2012_NONCEBYTES 8U -SODIUM_EXPORT -size_t crypto_stream_salsa2012_noncebytes(void); - -#define crypto_stream_salsa2012_MESSAGEBYTES_MAX SODIUM_SIZE_MAX -SODIUM_EXPORT -size_t crypto_stream_salsa2012_messagebytes_max(void); - -SODIUM_EXPORT -int crypto_stream_salsa2012(unsigned char *c, unsigned long long clen, - const unsigned char *n, const unsigned char *k) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_stream_salsa2012_xor(unsigned char *c, const unsigned char *m, - unsigned long long mlen, const unsigned char *n, - const unsigned char *k) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -void crypto_stream_salsa2012_keygen(unsigned char k[crypto_stream_salsa2012_KEYBYTES]) - __attribute__ ((nonnull)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_stream_salsa208.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_stream_salsa208.h deleted file mode 100644 index d574f304..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_stream_salsa208.h +++ /dev/null @@ -1,56 +0,0 @@ -#ifndef crypto_stream_salsa208_H -#define crypto_stream_salsa208_H - -/* - * WARNING: This is just a stream cipher. It is NOT authenticated encryption. - * While it provides some protection against eavesdropping, it does NOT - * provide any security against active attacks. - * Unless you know what you're doing, what you are looking for is probably - * the crypto_box functions. - */ - -#include -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -#define crypto_stream_salsa208_KEYBYTES 32U -SODIUM_EXPORT -size_t crypto_stream_salsa208_keybytes(void) - __attribute__ ((deprecated)); - -#define crypto_stream_salsa208_NONCEBYTES 8U -SODIUM_EXPORT -size_t crypto_stream_salsa208_noncebytes(void) - __attribute__ ((deprecated)); - -#define crypto_stream_salsa208_MESSAGEBYTES_MAX SODIUM_SIZE_MAX - SODIUM_EXPORT -size_t crypto_stream_salsa208_messagebytes_max(void) - __attribute__ ((deprecated)); - -SODIUM_EXPORT -int crypto_stream_salsa208(unsigned char *c, unsigned long long clen, - const unsigned char *n, const unsigned char *k) - __attribute__ ((deprecated)) __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_stream_salsa208_xor(unsigned char *c, const unsigned char *m, - unsigned long long mlen, const unsigned char *n, - const unsigned char *k) - __attribute__ ((deprecated)) __attribute__ ((nonnull)); - -SODIUM_EXPORT -void crypto_stream_salsa208_keygen(unsigned char k[crypto_stream_salsa208_KEYBYTES]) - __attribute__ ((deprecated)) __attribute__ ((nonnull)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_stream_xchacha20.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_stream_xchacha20.h deleted file mode 100644 index c4002db0..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_stream_xchacha20.h +++ /dev/null @@ -1,61 +0,0 @@ -#ifndef crypto_stream_xchacha20_H -#define crypto_stream_xchacha20_H - -/* - * WARNING: This is just a stream cipher. It is NOT authenticated encryption. - * While it provides some protection against eavesdropping, it does NOT - * provide any security against active attacks. - * Unless you know what you're doing, what you are looking for is probably - * the crypto_box functions. - */ - -#include -#include -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -#define crypto_stream_xchacha20_KEYBYTES 32U -SODIUM_EXPORT -size_t crypto_stream_xchacha20_keybytes(void); - -#define crypto_stream_xchacha20_NONCEBYTES 24U -SODIUM_EXPORT -size_t crypto_stream_xchacha20_noncebytes(void); - -#define crypto_stream_xchacha20_MESSAGEBYTES_MAX SODIUM_SIZE_MAX -SODIUM_EXPORT -size_t crypto_stream_xchacha20_messagebytes_max(void); - -SODIUM_EXPORT -int crypto_stream_xchacha20(unsigned char *c, unsigned long long clen, - const unsigned char *n, const unsigned char *k) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_stream_xchacha20_xor(unsigned char *c, const unsigned char *m, - unsigned long long mlen, const unsigned char *n, - const unsigned char *k) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_stream_xchacha20_xor_ic(unsigned char *c, const unsigned char *m, - unsigned long long mlen, - const unsigned char *n, uint64_t ic, - const unsigned char *k) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -void crypto_stream_xchacha20_keygen(unsigned char k[crypto_stream_xchacha20_KEYBYTES]) - __attribute__ ((nonnull)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_stream_xsalsa20.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_stream_xsalsa20.h deleted file mode 100644 index 20034e34..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_stream_xsalsa20.h +++ /dev/null @@ -1,61 +0,0 @@ -#ifndef crypto_stream_xsalsa20_H -#define crypto_stream_xsalsa20_H - -/* - * WARNING: This is just a stream cipher. It is NOT authenticated encryption. - * While it provides some protection against eavesdropping, it does NOT - * provide any security against active attacks. - * Unless you know what you're doing, what you are looking for is probably - * the crypto_box functions. - */ - -#include -#include -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -#define crypto_stream_xsalsa20_KEYBYTES 32U -SODIUM_EXPORT -size_t crypto_stream_xsalsa20_keybytes(void); - -#define crypto_stream_xsalsa20_NONCEBYTES 24U -SODIUM_EXPORT -size_t crypto_stream_xsalsa20_noncebytes(void); - -#define crypto_stream_xsalsa20_MESSAGEBYTES_MAX SODIUM_SIZE_MAX -SODIUM_EXPORT -size_t crypto_stream_xsalsa20_messagebytes_max(void); - -SODIUM_EXPORT -int crypto_stream_xsalsa20(unsigned char *c, unsigned long long clen, - const unsigned char *n, const unsigned char *k) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_stream_xsalsa20_xor(unsigned char *c, const unsigned char *m, - unsigned long long mlen, const unsigned char *n, - const unsigned char *k) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int crypto_stream_xsalsa20_xor_ic(unsigned char *c, const unsigned char *m, - unsigned long long mlen, - const unsigned char *n, uint64_t ic, - const unsigned char *k) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -void crypto_stream_xsalsa20_keygen(unsigned char k[crypto_stream_xsalsa20_KEYBYTES]) - __attribute__ ((nonnull)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_verify_16.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_verify_16.h deleted file mode 100644 index 7b9c8077..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_verify_16.h +++ /dev/null @@ -1,23 +0,0 @@ -#ifndef crypto_verify_16_H -#define crypto_verify_16_H - -#include -#include "export.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#define crypto_verify_16_BYTES 16U -SODIUM_EXPORT -size_t crypto_verify_16_bytes(void); - -SODIUM_EXPORT -int crypto_verify_16(const unsigned char *x, const unsigned char *y) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_verify_32.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_verify_32.h deleted file mode 100644 index 9b0f4529..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_verify_32.h +++ /dev/null @@ -1,23 +0,0 @@ -#ifndef crypto_verify_32_H -#define crypto_verify_32_H - -#include -#include "export.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#define crypto_verify_32_BYTES 32U -SODIUM_EXPORT -size_t crypto_verify_32_bytes(void); - -SODIUM_EXPORT -int crypto_verify_32(const unsigned char *x, const unsigned char *y) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_verify_64.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_verify_64.h deleted file mode 100644 index c83b7302..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/crypto_verify_64.h +++ /dev/null @@ -1,23 +0,0 @@ -#ifndef crypto_verify_64_H -#define crypto_verify_64_H - -#include -#include "export.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#define crypto_verify_64_BYTES 64U -SODIUM_EXPORT -size_t crypto_verify_64_bytes(void); - -SODIUM_EXPORT -int crypto_verify_64(const unsigned char *x, const unsigned char *y) - __attribute__ ((warn_unused_result)) __attribute__ ((nonnull)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/export.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/export.h deleted file mode 100644 index a0074fc9..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/export.h +++ /dev/null @@ -1,57 +0,0 @@ - -#ifndef sodium_export_H -#define sodium_export_H - -#include -#include -#include - -#if !defined(__clang__) && !defined(__GNUC__) -# ifdef __attribute__ -# undef __attribute__ -# endif -# define __attribute__(a) -#endif - -#ifdef SODIUM_STATIC -# define SODIUM_EXPORT -# define SODIUM_EXPORT_WEAK -#else -# if defined(_MSC_VER) -# ifdef SODIUM_DLL_EXPORT -# define SODIUM_EXPORT __declspec(dllexport) -# else -# define SODIUM_EXPORT __declspec(dllimport) -# endif -# else -# if defined(__SUNPRO_C) -# ifndef __GNU_C__ -# define SODIUM_EXPORT __attribute__ (visibility(__global)) -# else -# define SODIUM_EXPORT __attribute__ __global -# endif -# elif defined(_MSG_VER) -# define SODIUM_EXPORT extern __declspec(dllexport) -# else -# define SODIUM_EXPORT __attribute__ ((visibility ("default"))) -# endif -# endif -# if defined(__ELF__) && !defined(SODIUM_DISABLE_WEAK_FUNCTIONS) -# define SODIUM_EXPORT_WEAK SODIUM_EXPORT __attribute__((weak)) -# else -# define SODIUM_EXPORT_WEAK SODIUM_EXPORT -# endif -#endif - -#ifndef CRYPTO_ALIGN -# if defined(__INTEL_COMPILER) || defined(_MSC_VER) -# define CRYPTO_ALIGN(x) __declspec(align(x)) -# else -# define CRYPTO_ALIGN(x) __attribute__ ((aligned(x))) -# endif -#endif - -#define SODIUM_MIN(A, B) ((A) < (B) ? (A) : (B)) -#define SODIUM_SIZE_MAX SODIUM_MIN(UINT64_MAX, SIZE_MAX) - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/randombytes.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/randombytes.h deleted file mode 100644 index c83a4df5..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/randombytes.h +++ /dev/null @@ -1,72 +0,0 @@ - -#ifndef randombytes_H -#define randombytes_H - -#include -#include - -#include - -#include "export.h" - -#ifdef __cplusplus -# ifdef __GNUC__ -# pragma GCC diagnostic ignored "-Wlong-long" -# endif -extern "C" { -#endif - -typedef struct randombytes_implementation { - const char *(*implementation_name)(void); /* required */ - uint32_t (*random)(void); /* required */ - void (*stir)(void); /* optional */ - uint32_t (*uniform)(const uint32_t upper_bound); /* optional, a default implementation will be used if NULL */ - void (*buf)(void * const buf, const size_t size); /* required */ - int (*close)(void); /* optional */ -} randombytes_implementation; - -#define randombytes_BYTES_MAX SODIUM_MIN(SODIUM_SIZE_MAX, 0xffffffffUL) - -#define randombytes_SEEDBYTES 32U -SODIUM_EXPORT -size_t randombytes_seedbytes(void); - -SODIUM_EXPORT -void randombytes_buf(void * const buf, const size_t size) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -void randombytes_buf_deterministic(void * const buf, const size_t size, - const unsigned char seed[randombytes_SEEDBYTES]) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -uint32_t randombytes_random(void); - -SODIUM_EXPORT -uint32_t randombytes_uniform(const uint32_t upper_bound); - -SODIUM_EXPORT -void randombytes_stir(void); - -SODIUM_EXPORT -int randombytes_close(void); - -SODIUM_EXPORT -int randombytes_set_implementation(const randombytes_implementation *impl) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -const char *randombytes_implementation_name(void); - -/* -- NaCl compatibility interface -- */ - -SODIUM_EXPORT -void randombytes(unsigned char * const buf, const unsigned long long buf_len) - __attribute__ ((nonnull)); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/randombytes_internal_random.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/randombytes_internal_random.h deleted file mode 100644 index 2b2b7d6e..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/randombytes_internal_random.h +++ /dev/null @@ -1,22 +0,0 @@ - -#ifndef randombytes_internal_random_H -#define randombytes_internal_random_H - -#include "export.h" -#include "randombytes.h" - -#ifdef __cplusplus -extern "C" { -#endif - -SODIUM_EXPORT -extern struct randombytes_implementation randombytes_internal_implementation; - -/* Backwards compatibility with libsodium < 1.0.18 */ -#define randombytes_salsa20_implementation randombytes_internal_implementation - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/randombytes_sysrandom.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/randombytes_sysrandom.h deleted file mode 100644 index 9e27b674..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/randombytes_sysrandom.h +++ /dev/null @@ -1,19 +0,0 @@ - -#ifndef randombytes_sysrandom_H -#define randombytes_sysrandom_H - -#include "export.h" -#include "randombytes.h" - -#ifdef __cplusplus -extern "C" { -#endif - -SODIUM_EXPORT -extern struct randombytes_implementation randombytes_sysrandom_implementation; - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/runtime.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/runtime.h deleted file mode 100644 index c1cec853..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/runtime.h +++ /dev/null @@ -1,55 +0,0 @@ - -#ifndef sodium_runtime_H -#define sodium_runtime_H - -#include "export.h" - -#ifdef __cplusplus -extern "C" { -#endif - -SODIUM_EXPORT_WEAK -int sodium_runtime_has_neon(void); - -SODIUM_EXPORT_WEAK -int sodium_runtime_has_armcrypto(void); - -SODIUM_EXPORT_WEAK -int sodium_runtime_has_sse2(void); - -SODIUM_EXPORT_WEAK -int sodium_runtime_has_sse3(void); - -SODIUM_EXPORT_WEAK -int sodium_runtime_has_ssse3(void); - -SODIUM_EXPORT_WEAK -int sodium_runtime_has_sse41(void); - -SODIUM_EXPORT_WEAK -int sodium_runtime_has_avx(void); - -SODIUM_EXPORT_WEAK -int sodium_runtime_has_avx2(void); - -SODIUM_EXPORT_WEAK -int sodium_runtime_has_avx512f(void); - -SODIUM_EXPORT_WEAK -int sodium_runtime_has_pclmul(void); - -SODIUM_EXPORT_WEAK -int sodium_runtime_has_aesni(void); - -SODIUM_EXPORT_WEAK -int sodium_runtime_has_rdrand(void); - -/* ------------------------------------------------------------------------- */ - -int _sodium_runtime_get_cpu_features(void); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/utils.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/utils.h deleted file mode 100644 index f9b36979..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/utils.h +++ /dev/null @@ -1,179 +0,0 @@ - -#ifndef sodium_utils_H -#define sodium_utils_H - -#include - -#include "export.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#ifndef SODIUM_C99 -# if defined(__cplusplus) || !defined(__STDC_VERSION__) || __STDC_VERSION__ < 199901L -# define SODIUM_C99(X) -# else -# define SODIUM_C99(X) X -# endif -#endif - -SODIUM_EXPORT -void sodium_memzero(void * const pnt, const size_t len); - -SODIUM_EXPORT -void sodium_stackzero(const size_t len); - -/* - * WARNING: sodium_memcmp() must be used to verify if two secret keys - * are equal, in constant time. - * It returns 0 if the keys are equal, and -1 if they differ. - * This function is not designed for lexicographical comparisons. - */ -SODIUM_EXPORT -int sodium_memcmp(const void * const b1_, const void * const b2_, size_t len) - __attribute__ ((warn_unused_result)); - -/* - * sodium_compare() returns -1 if b1_ < b2_, 1 if b1_ > b2_ and 0 if b1_ == b2_ - * It is suitable for lexicographical comparisons, or to compare nonces - * and counters stored in little-endian format. - * However, it is slower than sodium_memcmp(). - */ -SODIUM_EXPORT -int sodium_compare(const unsigned char *b1_, const unsigned char *b2_, - size_t len) __attribute__ ((warn_unused_result)); - -SODIUM_EXPORT -int sodium_is_zero(const unsigned char *n, const size_t nlen); - -SODIUM_EXPORT -void sodium_increment(unsigned char *n, const size_t nlen); - -SODIUM_EXPORT -void sodium_add(unsigned char *a, const unsigned char *b, const size_t len); - -SODIUM_EXPORT -void sodium_sub(unsigned char *a, const unsigned char *b, const size_t len); - -SODIUM_EXPORT -char *sodium_bin2hex(char * const hex, const size_t hex_maxlen, - const unsigned char * const bin, const size_t bin_len) - __attribute__ ((nonnull(1))); - -SODIUM_EXPORT -int sodium_hex2bin(unsigned char * const bin, const size_t bin_maxlen, - const char * const hex, const size_t hex_len, - const char * const ignore, size_t * const bin_len, - const char ** const hex_end) - __attribute__ ((nonnull(1))); - -#define sodium_base64_VARIANT_ORIGINAL 1 -#define sodium_base64_VARIANT_ORIGINAL_NO_PADDING 3 -#define sodium_base64_VARIANT_URLSAFE 5 -#define sodium_base64_VARIANT_URLSAFE_NO_PADDING 7 - -/* - * Computes the required length to encode BIN_LEN bytes as a base64 string - * using the given variant. The computed length includes a trailing \0. - */ -#define sodium_base64_ENCODED_LEN(BIN_LEN, VARIANT) \ - (((BIN_LEN) / 3U) * 4U + \ - ((((BIN_LEN) - ((BIN_LEN) / 3U) * 3U) | (((BIN_LEN) - ((BIN_LEN) / 3U) * 3U) >> 1)) & 1U) * \ - (4U - (~((((VARIANT) & 2U) >> 1) - 1U) & (3U - ((BIN_LEN) - ((BIN_LEN) / 3U) * 3U)))) + 1U) - -SODIUM_EXPORT -size_t sodium_base64_encoded_len(const size_t bin_len, const int variant); - -SODIUM_EXPORT -char *sodium_bin2base64(char * const b64, const size_t b64_maxlen, - const unsigned char * const bin, const size_t bin_len, - const int variant) __attribute__ ((nonnull(1))); - -SODIUM_EXPORT -int sodium_base642bin(unsigned char * const bin, const size_t bin_maxlen, - const char * const b64, const size_t b64_len, - const char * const ignore, size_t * const bin_len, - const char ** const b64_end, const int variant) - __attribute__ ((nonnull(1))); - -SODIUM_EXPORT -int sodium_mlock(void * const addr, const size_t len) - __attribute__ ((nonnull)); - -SODIUM_EXPORT -int sodium_munlock(void * const addr, const size_t len) - __attribute__ ((nonnull)); - -/* WARNING: sodium_malloc() and sodium_allocarray() are not general-purpose - * allocation functions. - * - * They return a pointer to a region filled with 0xd0 bytes, immediately - * followed by a guard page. - * As a result, accessing a single byte after the requested allocation size - * will intentionally trigger a segmentation fault. - * - * A canary and an additional guard page placed before the beginning of the - * region may also kill the process if a buffer underflow is detected. - * - * The memory layout is: - * [unprotected region size (read only)][guard page (no access)][unprotected pages (read/write)][guard page (no access)] - * With the layout of the unprotected pages being: - * [optional padding][16-bytes canary][user region] - * - * However: - * - These functions are significantly slower than standard functions - * - Each allocation requires 3 or 4 additional pages - * - The returned address will not be aligned if the allocation size is not - * a multiple of the required alignment. For this reason, these functions - * are designed to store data, such as secret keys and messages. - * - * sodium_malloc() can be used to allocate any libsodium data structure. - * - * The crypto_generichash_state structure is packed and its length is - * either 357 or 361 bytes. For this reason, when using sodium_malloc() to - * allocate a crypto_generichash_state structure, padding must be added in - * order to ensure proper alignment. crypto_generichash_statebytes() - * returns the rounded up structure size, and should be preferred to sizeof(): - * state = sodium_malloc(crypto_generichash_statebytes()); - */ - -SODIUM_EXPORT -void *sodium_malloc(const size_t size) - __attribute__ ((malloc)); - -SODIUM_EXPORT -void *sodium_allocarray(size_t count, size_t size) - __attribute__ ((malloc)); - -SODIUM_EXPORT -void sodium_free(void *ptr); - -SODIUM_EXPORT -int sodium_mprotect_noaccess(void *ptr) __attribute__ ((nonnull)); - -SODIUM_EXPORT -int sodium_mprotect_readonly(void *ptr) __attribute__ ((nonnull)); - -SODIUM_EXPORT -int sodium_mprotect_readwrite(void *ptr) __attribute__ ((nonnull)); - -SODIUM_EXPORT -int sodium_pad(size_t *padded_buflen_p, unsigned char *buf, - size_t unpadded_buflen, size_t blocksize, size_t max_buflen) - __attribute__ ((nonnull(2))); - -SODIUM_EXPORT -int sodium_unpad(size_t *unpadded_buflen_p, const unsigned char *buf, - size_t padded_buflen, size_t blocksize) - __attribute__ ((nonnull(2))); - -/* -------- */ - -int _sodium_alloc_init(void); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/version.h b/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/version.h deleted file mode 100644 index cc60e448..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/Headers/sodium/version.h +++ /dev/null @@ -1,33 +0,0 @@ - -#ifndef sodium_version_H -#define sodium_version_H - -#include "export.h" - -#define SODIUM_VERSION_STRING "1.0.18" - -#define SODIUM_LIBRARY_VERSION_MAJOR 11 -#define SODIUM_LIBRARY_VERSION_MINOR 0 -#define SODIUM_LIBRARY_MINIMAL 1 - -#ifdef __cplusplus -extern "C" { -#endif - -SODIUM_EXPORT -const char *sodium_version_string(void); - -SODIUM_EXPORT -int sodium_library_version_major(void); - -SODIUM_EXPORT -int sodium_library_version_minor(void); - -SODIUM_EXPORT -int sodium_library_minimal(void); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/libsodium.a b/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/Clibsodium.xcframework/ios-arm64/libsodium.a deleted file mode 100644 index 6698ea1d7e1411973b08f4365078aee133923ff8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1359128 zcmeFa3w%`7)i%E8!ptO@Oa=%V$i)+a7?t28gqU!#lMG-`S|g&Om1ZUvNHmu*2@tT= z$psP>eS=0#TWtr63e>hy(T`U9H6f@G(MF3Fd8tk0VzgMJpn}!qM&Mzm=?6uZj`@YXUd+)VR>O5CnX~kvHX_=Q~*#!TUnUigsH9OCid8r`Gwq=4L zu`_M9oa}74X4$fGMR8|zaq-M+Zus_sg^Pr1u3EZm;R1%sHi5ARCo{I|dok===P{Oh z(9GT!7#qGImOVLxvBJyZSXM4$_I@k7n&WGiGB)yrl|2r3`iE9FFc)~!cs47av5NW$ z>@TT|wf}c4yBBz>1bR503naaJfy*C=WplXu8z9MF!`(F;jz8k~ zEXUOej19)eu(Jwgv9Q_PUCi-zju%@Q>zJlx zm*-3AZQ$tTxCH$EWm>k1;~gBkIPT>5XO3TTOc*cuo5gVj$J;qR%<V;z>`y^~j_-2( zhT}%W$KB4@&pE!qk!dCRbdJ|@yo2Koj_-1e(n<33IaYGKpX19MPjXDvOY(&rt2sW* zaSzAiK<8e@&K)PAgJUDdtsLLsXfQ}}nH*Pg?Buu`==~dGzvpB6D<6>a@w>0d#QRt^`(XcffAL6)+;{lFeaZHJpm<)Xs{ydKF@${YIXhys#-Dw=#5l;HO8rI2i8^_;r{3FNlv1m`9YFIAE zRU9AUxQ`>VNOG5OEavzS$5%Lh#__^9Nxqol0~}xB_$5b^8TI=a4NK-YhvStTM|eE- zF;aRabIjrRZH{=fi0Lik{%+^!<@g-OwOsBVj{8Axd`rWQa{L>|ZJgi7@es#PIsOFw zQu`&*>{*U~-6unk@yMS`p3aId*bxp zj;);j10IiuI6lkq4;(+@Xh6IuzG)m6a4hHO;rJ7dzvcJ@!s*x;!*+6fnd7;Mc)o9s zVei6S_~RIMF?TQIc#6}%$K6i@-BD(?4mj{-410;Y2RYu)>8H6nK8dk}Vl&I)Sj6#G zjt_8r8t82_vwn{6a{Pkh#AJz|&T%fstAUN1&CJcQg<}`Tr#bH9c!c9=jtO|Mk^fo1 z?&r-~^p z6#P+qrg6ORLdJUTv#?x_*K(}qcw{Qd<$MeK8%H5ca_4g_;dn2{r#ZgO@f(g8PLupy z%W)mYM>xL3afIW9^CkIgj@NQ@bL`^y8;%D#PMeN?s>H(PaV+Jyf#VY#_j5eWG35fu zUm?eOj$V#0a{Q2Ee7Yq6EsiA|H*kD{{<9LAM36AGL zj{MK!xRd+a&+!UQ9|5`_ienQmkWCDB)JTZH*(y>@wXgDI0~~Q`Ky7Z({Zen<82%tm9>AxlEeJvmD z2J;Z_aGVT!#arXq433v`ypiK^F1H@;g!3n`dpLf@={Iw^r~*l^m-7?3`|rS>{t4_H z#Dg%KhZM<8vHe;&>YV=)HWRUBXO`i#e8Xyq)7i9G~X+ z8pmTCzu`C;=_I``@OZt+!#l!pgyT}4u5Bon;?lZx?uOc8SGlVU|5jDjXJ+MA6}w8- zHI&zf2#&B{q?$sp`gQ=-6FAXP1Y(XM1tbL{-qTz{AJnPwN>jfXW3?}rXxhCtXwR~z|0IMRa{oyfI!O2 zMiDQs8H-XbHCCmS4@`mPAqgKax)MY8Fy1qJGGR)H!v@$Q4lC zPng;mMtF=>bBxIwQ_9XTQDaR{m|mh$J>hB{Ul>uogt*~zgt%dIgqRU?gbRd}HqQ}akCG!K5+O&39XUtB zRTKE6L4iu8^+%2bB4!NXQjv3tB!V)lq}D$k#P4F)%7*f~ znrdG)B3eoL%G$c}FvP(86UA#A*O%AThBA;5ZdYYpfNnJ9P{FYM8L6+Sttky^K}4=~ zD@MRFK{Yv{Jq?Lt@LN?`8d6roLf2PU-VlaWUPc8RlCJvl^0Lr`spm_`;E)29iKg66GAhjwLL0q*JMUoHqN=PLZ!C#oR z7r{qJvm8bCOiM6AvyBi^gccpqSD3~=ik~y8EsCmATwhyOxw^Wz6uob8MOG=E0dpM13r8 zXsAVxEmpmtat`4K#W;YkmZbVp@mYWYR$$%r(Nzmi=AvHub3j2v#SW#{m6xq9^^duw z7AL>4`W`-kWVFkg`UajTKCKrdQHhtV$Pyu=iXaWOs~f_o;7`b)$Z=};xXA)xqb3W4 ziJ8m}8!;{r7%$mZxGadSjU0zpTi?k;5vjt#;R8lvi9=zS7^_ac&4fe#s5iB2`v3D!ufCsv&ve6jK6<<@AP;bGzzX ziU+?Ob5X}A{@r*}!)s}MLvdxbyQ;jpyariOS&Ql&9M@44$+cItXW*4Hd|+zbiR39_ zXlqPWE;vGgE|nU0EWVtXqConVms#9rj(I8K3`fzCaqG2#!8|F#U^YlB89FR zDu~Lil_C;ae#pO~3O3vU(=;HdstNN-3GpzmjUq?o)sWKz zYne#IG)G<7c=Gs%WJPUFIlW`KFr(}%6a_7)HY+)SRa40csG3Sfq|hlRl?9^o7n-9= zu1d2~vV+=#k|j@D${n?m=UccPwWn6|rJ9#Mm4St)=0B+6tBQopW?wiF^IItuHsj^h z>rwL9rz=8c`()%?=lz3f+RAEcYFweuVeZAfR_qB~b*pM?vWmkOko?@{f-5WW&R$(! zU0b&fU1DwNEojLhA{a_lu2;Opa=(<>mFlcDAk*RsUMcZb6{-_UjJ0K$*bwJgLPEs) zU<9rh<@)kfG#CjSb@6zWHejkfC=rx7Aw)UX17$14*Xv>_5{g$?NjvA(xz+}&tMpCz z2k9$|tdO(SG?s;^lpkAFwKc1J4Jx4QE5neBT~(`!c^Wb?6QWjcDy6rMR$l)@ zGcjz#7)yKb$*5EvKQFXc{Jby~#U~K9e)#HIgomC_MkRWFUTF0EyfD%8351QFTqQ#@ zT;_xZ8~TF58(7%NtMVA2E*HIKaQTnc6BA#(hJ&M8u|W^2&;B(SU+8`kUzXud8YMko zd$58LnjH$J^fNGG3budQlE$lEFD ztZ@6IAXC)W=%v?vS`rU=I}2bbU&;K8kTrP)E8OzCUqof4-OmhIRQHor>VhwUie+WF zbbLH{tBFd!1nmCshZL}PM8%tLkBAB{?A8vy`e2dKiYG)qLV2mlsuy60WP}n8l^wl^ zL;OT6^APDUl^{eeT*;$rDtA>Ehwk?b+L9|3OIYa&7&4Rxb$+9Gp%--Qx2p1Q!5o_h z#R}di9>SD=*hD}+v<`%o4!b>VlvtfflHIGvp4z%{#6PH|g^j$*^w22LZg8y%n&TRS z2cAb`jTMD)CP^mwpk!Cn)-?pY%GJx1pqWuWJ+zwmyad+>A48>+_3`Q}-4uhY?64vF zB_f3F6Y}R?p0T3y)8z-tb_lsGTa^>`cs6yfdjb}toz;vZZL2Lu&&P8JQ zc0d6K_D@7n$vTm&zVlKHLaJ$@c}4zci)F~9KKB*8`BEY))=TAwASnu(2^D3fYzdR6 z>wl%SCn>5^HI^G22mv(zBQK$eM=1%4UT1pC;xhI%1u?iyCOmz z;vx8C)M}GoCbVApd20QVB0~{^S~1BfRIQ&f(=8^@KRQ%RW`yb_>ya`_sYjlz3@ETM zRh`h*A%_y;T{RGYV^?KMYsIZ1kQaz}M#{c6fJ?xaLYB&?v;lvOD=me;MWp-mdas~}VAUR}Hr zS}B^ zTvuIETO|&1>&n;A0zB=1bir(*s-f1uARbN_6X~VZ?lH^KjEW@8QzLFEmw!_vU3GOX zypeMfkBiT}vaZ};nJQuOFK%G;v0;-yA^6;6zfg;2%(Y38RXPKuX}5%*>#nP9C@*b* z)tsxe6mwFc9K0D~3rCedy4W}>`613)v=)D4t5??qsCT>kl>h_y(pv(e0&4oKG&tfZ58+nUD7dm8jND)(-$nYtYuN*!Fal;NVg5<(j())8N z%#jFw0hO0u9)^5COqiMy#15OuvRs%V4PuX~CQ{x*7ugwykFbIpDIgLHA6*4^G$nzN zRW^2URTR6(g4;U7nWLGP%*yc}7cEHVMd#+_ggGyIc5aSzT(sbfMn5I@Sgwq~a-3NU z-E{r_%a8tUW=uoB>7Sl{XmJblgR#lD+eNPE4EfhSK_Us{2bb(N;y2x*K45V%Z3V^; zeiaulTey6g?D8XyWD_saM=H0)^T_F$N8(8Ti;GJt8)zFGCl(hkS#sUC{SvaCZmUEq z;_>rK1pX>6F0C%Bs;mj8Z;KhqbEO}c&lsHR@RguehZY6{o^H94<`;o zpANsfkzRvD3y3j}BxF()qL48-vk&eB+=Gyh1$Iw@8|4&(-$l6TB0chrGL{ON7-w>6 zJxhCZ#c$)J(Kkhu-7>PT?jyPeZm5lax941n0zO+ayHtoR& zAAjtNKi=_!KkU5fZ)-mO^U14XuJ$ZJ+*1+B8<7by+Eg)p=Rn@rl(sp)U%%L3&C0t^ z(`r6{oN023{_YZwb)mN4zLGu3`l0tufw4GX)>KoJP_{uoaq8Aq{5#ybr6YdAlJ-q8 zt*uL}+4XvFk=C1_=}NP=-(_2P-Np-rBvV%!Yl&YDzgMFGIuY;0<`SRh2bz+PX>4t7XWP1TqsL}kXKGuM-j?HO zTU%&c>usy+F!m(B+napQle{-IX`e=b_hYVjxCD|G8k##^0jbzR1uq}_<{mL$phq12>9k-T@cHRKxCrW@-j zbU#Qpu4`;tSD~x-wB=N^xxK~)whzg7rR>!RhlY^Alq0E0gPIgX>2+UZ)_1h6N49hs z*PGgIU5;#l661Pba;$CZZN_?Nu4q|TXhaYw!DeJ~%IjN_hLOFRln*r~W247NS!!yV z%S=efy4u|9WWd(vJ5#btk-hX z7I$L6Fe1bqwOKx}#X;LK7Wa|Wa)fm`a=ZKHb?WRp;n$Ja?Z|r=6i4C#N8Tpg{1;m0 z?d+YuRhKuQo5S493boZ8mcKeJ&;||F1C}9s+^}ECuD-cDo966y%ML9j+< zMc#huwj8y`A$v!P;_SISx_QWoo%y+kGjBA8*&~g+7K{9c}R!bdzc;gNaSgN`WU)n5R zGV5o^3ajNMnh!Q#JvG_`M!F-hO&fa-1wB!v?Cd_>Sq5E>6$53MO%sRj>-Xm5R zecsl-d95udJJf{vt&TY;#7!tlR1%*T=CXWhwS0u&Slq|RG<)1pAHh@_HP|{Jg+&9JLzEZEcBIb|*S4?<0TgmTE6W<6~Q#Y9_QI z)rlz6R^7ZFRM9>Zic}Nqai11Zr8;4c8?sscB3AE@ks_Pr)(0ovkvrnFLVCqCJm+wZun z2aN*1DNhnx(K=e@4{G2=P|Aq z|5p!M>hVMn>CcFiDXB{=uQ_M@zVCyNYj-70|K0AR_3KmaA3E?Wcixh}Z+!Lrlk=wc zJ+ZHMOQlz9&Ns4Xjr~emY0>sLW8|P-~HZJ?YNU+R%<8bt@0Jb!A8S$h}x~wZ- z@=IfU``Vq&-7PE8{iu+a0;BeVYozhf00d zt!AlnL{pq)Etv~ASvx%)=q*Eo&0 zRTwX=K+zd5^|YZp-A+8NjB8GfgW9#8wqiW_67cA4Ti4YzgZlSD%V+c?(3SLW!NVzO zpZNcfD+%L+Jx$4bU52+isGE~IyS!a}xoF{Hk9-LN{i=EHe%;*eKJ&|!ZSLi5b?%l1 zJm8&e4GC=x-nPlFUlaFNh6ZNA6X-A+m|(%PWR{Sge5jWmt8e0Y-;{D_FzLup@`sv~ zl?hj)-mThRs z-Pbp_+c6&*^40EnM;vq8;q2S=Vl-0PwifZh0}?}ruBMv~<3WPvif-4I*866D%8{XS z4-6&0iwG1>p4;6re`iZ#YhUgru?ySPOAn9zx_SEwcixK8kJEUoICPl&-!EB?JL5hY zlpcrF^?Y7rsj*rP+r-D@py7i-%aJ0>DO=im$6YkaIWTnYaSX6hllNe(mYO`AdfrOm z5%fy)cj@vvTk`fTe*vYB#9~OXzOZdAdJ?uykjC0|DTRWg-8?y}E~`*TYudDV^BW7i z*7UM@nOOz*cBKBSU0AKT`@U~q|IiB>cFlq-h3lkQrL|bpgY_LuhcF3MQ(BSH0P~ab zhK%wWoJ3M8&c)GsZU)Y_SY20>fyq5Gq*ftiU}8>g)C?Rv3fIi6yqU9XIL@4y*H-1x?=>v9RYNab<>+=DzzMoefx30NU%^dz zvIIBjUXGhCLJF7n(d_s5N$+@vaZkscf?K@E6Td`x{EhdO^6R& zE08Dafyk3zQ~vXn-@w@u-=d*9*Eh`;hK=1e;*K44wzTb0ofkY4s4gX~SSlx&usSC- za~zYDlbzwBZXlzwwmy%VzCy_*zLTKwOL;K#%u;!MIgswli7;$mR)pirc@c&$Wkwig zaBhSVld>aVv5!_Or7NSfG?QgusvbGQ)N+Sql*3vtqqgK`mXT3iS6=06M2}2sD|FC9 zJ+6S8I?6O8C9QAQCU`2UXwu+vz4V86l_%n4!MGGO>G9wda5bIB11;C z3%1y@VpmBeD|6Lh*2!Ips9c4w5%@1@KqWSHKM}t;T}Ek?r;wobLRUEd=)%P-9A6lP zpFRqI2KZ>28D1couffC7$A>xqwsKgbh&fcOgc z-^q=!syu&pH{5aXBd4F9ndFwQ?c6P=k66SPxWLWaE$8oI?&kT(UWQwtF6_bW!EGUU zB|@HA54RE_^L-6AoPw~646=rxZQG&!g}BlY)H|`NVroA#FbJgIm6A9V`|?wP5wWgCvOazCzsvyjHH`hf9U#0 z=gGV9Fc#~{KR8eB0OV<&+>3c~>J$Fy^W^%Vd2-nuJWmcfq7g7p-i`><801Xm$!|cPbatNn z>^%9|d2*T^@lT_johLs#PmYC^v-9Lw20A-W{?DB!eDX}s!xI{zh=VhaC1L4DO~Eo3o%@_}D&32z^piyfc)*_r zUKz6+&D-lrW=XoGq2e58;lgv{wE7;f1>E@Ln`T0y{;nE~a>|;-_q4NfO9VdKP|;{1=7Bj*23eah;`v%;!79q>81D)o^8*tM*vP}Oem;WJXO8MtOr}yZcxYg#!*MN>W z@}J{1G<1%fHbu%4O^VrN={tkO^vyDyvkfE1JCaH-9W zQ*7iM2%VNDt}hG1u;n~ZXNQ{?C(XgRpsqp6hA^|@m}osaFOHh+o9_-g@6D&X!t&*L zVLqQ5FjqzT1^S0896w!RhvomH^Wx$>ING>;iSyowosAQQfXaDsao!t^U7p{2llThv zDRN_ED$m!o!L6JZr*tUi#kX>|oIZ+*a$bBDcgy*EId}7XV!d!HqOUeDuGSV*X0??~ zH4NL=R>Se-#u|nnc1oOw{V$ji$9%Xv!7a{mkG5|-GbcC8CQ7Q!hs);2@`0@3=f&xH z@1$BT;KoJ!#}5P)lt}jd8^lWuT^`;tWH&t*=_Y-2jdfnUpFH6reWa4UVNDaREM#6> z`~(DX#4C6|x~xa8e}&Pqq&kkaAN>H2mzP)g<)iA8mqO(D1@3Qe)R5yf8A%; z{F%BGoEmhn%^H(u z>3g~r21B?Yqd28<8(JAb*x4pRV8jRqb`#k#C!&ef_NSn?Cl&$*VNTGwt@T zTiE6k$frB(?5PqhTXqb2cNBSdnCIKJ82f1rn|Sy8X>7X|HUUR;6UDeSAU+iZY;!x} zBZXUlaPzlAw?CXw%Ib5J)fWiwvwvAxor}CaM~v^V?wl*NvG)5g7t`^DmTeZxjhBPJ z%qB%BGpWpnb(2IrO8=j$l%s0h`2VSFhp%@(oqp=4pWeYtfBC1Ev4h&MSCPS%K1IsrcQ>Fame~Lo8>k~eFL>+3hNZ& zEA|zV-Am`&8n*KQW7&hKUvhg*V4ev`PrO8v!aR)jBJ}}MTEey6L4@=5Z8stBzKcA( z5qWt7@^m@c?)BThaYSmnnjM{X_K5@SpW13A)89QUpS>}xW2fIkULWS^zMrvY@eYfw z*E0dXcj6uM)^_bre?U4-|)rc8%*lg0Kn1??8LLYu|%MVb4{-(R-Fx_GH= zie)azsMU$Hbzt;5!1#K$2hTM%d$7Sf);}%Uf${ZiS)PTFXIhVBHzv!Y0F{^0j;u9Z zny)yM_3;-_xyQ6Vo*>zg?eW=>l|-;3D^c2!z0{8g-zlKc1GA>KOLk;wWJi|9?Z`I4 zj%?2o>z>{u&3#rju3qo7_atf3i>`jKNiaVuL^lh=*tG6gYTepdLaynWaUO@R@~(8( zryESSO@Dvwl#+r3t@rW6cRW1q=e2Xbc`T~S6rX#t)8#SUwYS4M?%Nv@gh#zQl63j; z3-Sl9?QF8OH>aDLy-(_+s*fg^9u*ADzj@TG&yUw%ZPovvJi*kw`%!aizI7a&_ne=; zZAL-CK;Grn&Z()Mspqd2gmD}7+Wtpq>_)b2v+yHv3Ab(QV6mpNR&8gk+9FuB*-aX^ zA+bH5z3yzu7kacsiS1K0uRC?F^q$F8&Ur>+D^2u&(NHjyJ#Yu&tXcEc$hWmX8N5)vy|X zofWgfis1wdjYQLi!!WMnmRGR1@ta+V7Dw>j1v{uFvhxWx*C8vovu14nG&8o+JkL09 zj@7JvxYuw)<=;`-cd)7dMk`s-z!iqFwn$c~J;`Kbpl;IXZd*%sr)~A_wmP9LX8^{! zZEL$=S!!&oXjubm1ACCUESVZ;QU+6#4-F+94)64?DF z7}qz#u2pyIHe)?ZRbjgeV_F2kMwl?13Im*^y-g_xoiN-@@%U`N+`Duh=;>&KO)OcN z!t}x01{+!!?mA<4!*Uqbs?MY%spkzgrM!#ZJ!JO_yPku+DI*>@llKlKA0nBQ0R#aG zOk1~*$tx^fPilk@$=-qtj#LeX+tFqw#L(zgHo`P)$ux? ziLdDWY<2plRVT}5RAF=j2G4oy4pwMCk2Q4nZqqt7!+5@or{~Bor5aVKYnqJ5jqPdC z=`nTWB;Cj!&bMN2n(Qj^!owzRvM03f?y@BnW~CNQk8kR>z1Zsgp;Q05F7w6KsqNDq z@3JnL*lO>x6+JLJf7iySJ?GDRvvp{~#;D!rFA-+u@1CxIM?duD^!SHtg*3(WFR{zK zBF;4aKKsT^@ll%Wg06@E+PnNGZGZUlpJA1G`#o)+K{I|zy>wfd@ z?HgWoeY$p&<-gu=O*a31<@=?xmcKUp-Bis&+tyw_g{dEB+j`N#L1|`IqNRIMA4qaW zTm4gec8z)avfdJpICqCE!xil;9A|M_H5!_6G>N46o{s2g4@a3inAo+86ffJjY-Xxq zl9gf7&?Aya)!?Jg2dR2%iYr*v-uW}enV4^mm{d(GFks>s;rmq$Y<d_`FefB$v-5D^c^$V%kc z_iu^ai=WVCClaIFxNxJP96u4HKqQ>+;nThWZ1h9mc9wE znOo|o&C<7T(oauM%gK2@=b`5=eR|GwS?A7ruKSr^Uu}86X=>%8OI@YU+)}?d?c(~M zC7!?Sf46O~17$o>?+|T!u{6b&ZDR3Gdw#r-9~Ez!oCXT!K*s;xZg|W#amb*X+`4mG~i@IK$yJtNKVlD66DJ=Htmi2Znb(^DQHA^nbSeVPH2 zCeEHyO+E8oZ*O`7)CIS@&1r^>pxRDrhBhT6Sxn9OZy8OqV-u~$h1jEXIao!f^9yp* z414j@eY$t!ifhvDNl1!?;JE0RHV9s^NEY0ntzVF4SOh_9Q^6nZNl1XY-UZQjXCE4v z@3g%t=zF_0Lksn`D}_x72{ESTrU}uVStZUHg2`}2`m$GfOt;uFuQV{1z}PuR^F;kZ zF;DQkV$1dyHd!-u_LuNT>5Gj{H9TW(vTjPS79p6o4To6o4U5c42xYLR<${DME3Y;k zNvLTw*}BSwjqDMfc4KUNy5PA%Tap1?E`hP{0OdTVB~gE#uZuU0cO*Bl_=chZjhOpk z^8Udpp7$@t-G{t~ak`ZEUuh=#^WNJd=l%Ys0sHTH-rwQN`>!>h@Vq~2EL^x^*^A@u zy;mxWNzqqM+?0?WhunU``0nF3loj#3pB??$|9Rxa7suVt1|H-D)S^N$9ca`}jLHhz!>x(;6OxRfI$3 zq~F8_igf9GoFhFEK} zbL83HGP`3idtcU-f_a&_z^Unr-LFAY-D5RhYMPR8Xn#+GqsN50d5*PbhUO_$9GAe@ zDn)oS{t7K)BbBjvwO(7aKmTfD8f4Vkq_36MYlIT$#%-3 zYuV*_b9_r5mG#opA2qvlTCGmYMXs1MZF*vkFf~h%tHX7!n|JcymNnhXt3%y}3e*9y zI#|a&Vdm8J8&)OO6t%>dS59sh5^AjPGW;^6CS=;D;u$d8tIJ7f$v&_$s(rj}p*G(( zT+|f1Ux?jnxAZ$vNrn@aHq@fV(Zl2Dq}?9h&plq>&z>H!Qn&=h{_#4o z{U53m)ThYjPtc3XvUsbwFO=dE$}@!Lp=Y4|r0V`mJ|6Wga(FuYUMBTt^ix$vjuRfC zI3CHiu)rHGj7aegzt0#woG;wa^!no+!rSlXDbu7D-&+Nw8R-+x=g{0AwaxR0$2<~s ziaqJE9*j=E^?A?4Kg1OFzUrBDz+CakYo2qDncLrZ-81>5dD|Pm_atqMJ@Cc>PfBO( zsi)rY2#>}l+$VJ*;&~o_fnMy(by6JY9rZqRBzR?2-K$LP*(>HWV_lG=xsfMnLo8U7M5T^a5jpkEC7ouCt6PS+05kxlFw(1|b8-{$mpgXmg}8A)%H z4tb}LzZi6iPbTQf_?fe!O>c01_QmPilP{|7-w(TEqS zm=quGrt@ZQM!uoV&Z9gn#_{CJ6IqIbw_eI;5&KRX7SBzns$5x4=l##bK_PVwGu^hz zT)z1|=mRpGT3aKEyH+<;6w8}B#S`uQhr81e>XD?S&mgIX!oPIACwpuMM+Im7B~k;GEMHS|k4ec~)c~dM8>)A8vPbpy zDEC?con2%vs=b};B{=e;Ft28+yuj3{M=~J9h;=r&FOs9>>+)oRdO))Gh+&AaktOA> zHL~6SFQY4$oB9}(`WpOLWaW-;46-WLUm8jvkIqj&_a$N5*jw;ozsC zhohIHhoh6Douj}JAo|nm>vhL^u>2(9f z{l)`Ey>3rbf7HGxqxMwHS223s)|hQEPXha6_r(s-JQrPuP>+=7XTC>nq*b<$d^^ZJ zKyK8b18ARg-GSdq_g>=TmhBha#8q+fnc+|BjN z{W4f0U+%{TxV)R^&u!e@$lc4hyNkP@<@)4)ayHkui}Szc@?P$yc0%!y`|X4952x>X z5b;;KTZ8z=gWUWWBA@^HLH<8Lekt`)J}KR`LHzrJ+)oF&%EVus!;ySy_{I-+p}Xkr#B$(t5&<} z@OjSBb4Q-;kYC$J@pFdaVlfBL42%*)SaG%N9PK0U(qxJ+MBl83c!qJd_+Ra8WB%?b z=U-6Ba>sne=RIW2&dwF+QakUVF}PCt4txmyULZY&o#>;PAjO2%|013DATG>6#zTJS zxtjCeVL6^3bdf$%>A@f|lL&g|A&@UR|DdM6L3Toa;P(e*J+#h5*8zYYNK0*yM}E(3_jVQ6K_zbg{)??^c%L}0dzXc zA@F7XG2U9ZNmNf$%Z-Td;x`j@q7Vtr}^#L#q$M% zXi}K`>=kT)%{B@IfQXHqD{KfPJ)Rpgs zoH>$;GY9Cb1GTymxt{#<&n#fvUY+UG?bX>C*q`4dNNe^5XYd`<-{C>_@3KG7LE%KS zKR+-g`*TyX@VGhZ>W*t-FW=Dp<>M!cf8@E--gJ5KWJ8Cy+o~&! z&wj8}Xm3t1UG%EWs(++jpMT*5ZTixsM(t8(q2M{B*O))G@Qn}k5)u$htFx~o);F{Q6)$FdEc-NH))37e~@32MxTw#ko^z!gX zLh^&XgSBfe%V~M*dnYcz8L>hD=wXdiEWSDHh> zXEb4qer!;hHj-#CMxT@tVvO$GQW9i@eXZqQoxTT26>v+&(CfP61x)zxi|n}{Yn@`3 zCMcv?3>`QGujfB)z*`(9FFYcN zth9?Z#M&f9@C*h*d?O~&DJk-WsQqzvkEBS78!YJ`m{X7NJn%!4A=oC|({a}wZ`yTC zfFfVSuAMyJVr7VgM--wEhldXb<-_bNomPXL7DM?=4W;pd%mkglXs*c@v9~%WcWQ#P zeSVR7Hw!Y9e_`As!D0vQUJ7lrm07$z+KvN4(SiSiWYSh?hM6F;*^WPJvwikE6KB6O zA$^|tU;CX2T~70W;a$`2j(Y_2LDTMTz#+3^Li#N8-90eVcEC*AiVrd`h28euu-neP zJj>zfFLX9%m5^0-M1x7l%o_jajt6!xX-zcWkiKt0 zykk-HtnqGJ*%sTxRHGv&Iyt2^otxdAANLdQt1ZG}ZihSE1Z(1tyEWt6d)cN0!E9>Q z{LI*L?S(5+?%Gl5@#IfV_;Jfq)8btRJl1B-@OeWO6<%()J2m?Hfj{-W^PFtV>WXS@U-YRPUtX6NRSnFG3gvHJ)2I%D5!zUp%Gy<{kB z{?d5@W{?G?q8TJvwq}m#?#*m*=}K<%lTNk#GOuO4j_f8)x^ImfbMm+>Z-3pn%Vp^y zW5-q@Ax9YQF`JwZ+GW$$bM`ZycjL}^Tk!oHK#XiDFmJrzoaeHAvaj1=S4l>Xf7B-AnXIVomDr?YO6)&6s~5H|l(+<$~c)g(ZLB2KC<`)aMP% zt+MOOY_JX&&j1+d?QmWBP}}ahDMHnChL?^xXGASTp0+yKmzU4`@suiF?>cr*YFOKt zTO(DNPE?rhw znSbH1CgqUE82zUin#_UB_Ljjoot7VEP!i*|@itcyQ)Bo2tcAtCXhB~RQ{}`@q^7Ap zrZ~~(?Uq5GK=nwqSP%bUJ6rp|!_L+m-X?X^zsg?qCD_*vE-3Iy-;<}dBiXC|*;HYF z#A7-h)#dz^C;GmaT^+ynn7uIv+`sWyei?JB=y^y=-5}>Mo8;-b9x~ZLk|CQy*>;a?1!*lh7dOeu zws>1XC!5bA-1H76(x>5D@Su}zVL5J#g8mBVWGhO~9`Yya83Y|mo$OBB7jZgmc%*?b z`F{pCt#8WuCxcG$?7^*!=eI#8JtuH0^)!M$1GHph6!A$9>E8-EmR4CI=){-lZ*V&8 zvsTjo4m#=ef_|YwJ{=iG@p%PwWqfV|o#ej?lHUkAy`PBt=eQoSfqf8k0dCsQN$b9H zddc=S74B<5C%#PoBj{;x*MmM)LH`o;3*deL^yvzEDk==gJr6qRll3@29}o8-&?#Or zo%Zumxzav1szV|j8Bz&4{=^GGiFEE{WP?fHK|)>q7<)=XZ7@T&LlldfNrE?^1e*AS zSYnpe)|D4m$U7_KZ8g#!qCl@|hLDltAZrUThYaH_cw>ulb53M0V~~`0h>bziw?}I% zva*HD7-XfLT4N9l-t0F9FVg<3pbwaHe?hx*cs*%s;B3{6Rk8v;#J zRl^Z?i1C1Yn~&72UB+hd7g9|EO#VW+K{kIOeDx+Zs^wo`qYAd`Q*T!CRw{8Xzc~8rPVF<<>P8VX1kIMKZX3jm3}Dz`~iJg==E6X4Se+ zZ7iZdWGm00Ru)l{WbPT<&ZLSQWLm2*EBjBgCwmyrTZ|VlItjdpPFDqP{0!mi@m!~? z2TY9DLil?yE~Bdqx0?TS?n9b>AkHSqn8w}MqeSD|3^Nep z<&0CvXTl>K$^M7jJsfuek-tm2C7i#N(>s9_F1`aqtjI05zhA;Xx#jkH zJ?G2qdmZOXsbTC5&X?OK$&r7#J>aM4mfOz^&X?Qk-#K4ypD%+?e&lNjLA6QuvEApIMH+&JznAUxl;@koP%;D@cxQ@CfQPau+3 zRjZXS!zMoZ@#ziwF!o7A3RxcPj7d0*4M~`Y`o>0M(tQSoA7R3i#x(zAqYl;F{a4y; zgh^cRi}0B8GnmKdGqdo0TBiIG7e$d~)C$gECv**>JEon`@zR&Lw)(!rwKT$)xRxrv#Pwo7 zqJ5_zjvTQQx={QQ*ZouRC9eCY@-K1Sg)eb!U1D8QuP>a#qU-hEqUQWodzAT+JgqH# zVb;oorD<%TbK{MZyC$DBXqO5a@e5cFq9hWR^Dkg|@YSMpyKXldKKmW4v){pr@Et5? z)^2JfaUOkzJ;8beAE2^Y-ov-41`H>ymJfO?)i%pekL9>6&Xd=w!&coq)|%Jv$ldA4 z+o_rNf@97u-Tcm$c?=(*`s;uJ-?AEVT3D~;s4ecqfMG<4J8Gk^WI@|87Wa|Wa>V~- ztex=dNbGjxJ?zNsb|fBf93&fi`HU9l?*Ujzho5zk>DZ)o3?`J=Y^-udOR*A_o>ww*=$A{CL zkDa1w(@3VH^I7pQ>te3%;*3vE9ku9ie4dKFUxg2G<+kNi&?loB7(SHs;g%#;l7i1Z zz2r(h$WovLDS8Q?t-{x;>`5Q?(r2iSY>7RVnv5XWJZ4&NGOo*QtHYIw&OlRr$rNo}|60NyA%Gj^Jxpn&mBSHVwids|&v)S)T5GzE z^Wb#1)iq)Tx@C5kvB6}_!;gWsTPut?%XL3UF#dqGuSZrOdwFICfA{NAe0nPBpfly& zUIZGuuPOOmgzo$9lvC&Wib`1gEQAD2ziTs=)n%m?9|y(;J)Cp?tWjRb;1Xa61y{2yI}~~`LvxzPC>g8uUJ^5-C)xe zS>m6|OR#rXgkM$9{o~?$&!0#7&VEtm>=$MJ9bc58(ft40UzE8st69iTGrf}4++j;I zEuPifkvq%0*o%#cT5L=-V`E|gHYQ$4ACy@%t8Xyr6|-h)T2s{C_IqCYZep-d*LD_o?2On(eI?z` z;-=@;65OPFIc~ZL(cz0bQ^-yGfataI_qb^%j@0M-`5?(B4X|PSrWb3Hp|@c1DLD-% zoZ~lMjK!OD$#j|-#*4DJqlNe~{d~|7Wp){EdJf3+Owh3kz!u}CxDcIouUrW_O$e0W zrtoF??}45QcLQ#L(@FjgF5d~7QvN>B=}GiBZrVj8>wgq<$}74kZK8g9-N!|{PO5>( zTRMD=;ppx<#pF?Oz$wUdPPaT8suXh9RaRFvRIVvk5EVa*1778o3~BOANeK`w4&_TT zm_gefM&Bxcm|vm@MzIZm(j+EQUQQKHBbQSdK=dUufT~a%n9u+zK1~>2SVcfeYw!y6 zl42?&Dm&%%pS5ypl9EmxLBPf7+^mI<3l$R5I8ADuAcy#;eOGi*E5Q}Q7esP+J{qTZ zg^OQ0xQIiB07MJTpztu4mO;G=8tD>>A8@``LW75+lcSxZz!5<52BX$WDp(X8%Jn!W zXtW+TgP6E<#8zw8cje?o3NR^<7}+u){NQO?J2b2mV| zF2#T1%jL9+yXAcQA$QB=1W{350Mhj~ZlcK-^}0%Tdyv~Vn=dwMsfh*B)cTu13Arl> zq>5bztCHGcKueceZGd$61F@t}AIRM&^oe_g_C@Ju9ySUt#`!fTagNRjod)OWupQ_}I!qe-X}Y(yB%dnQYd&ca&wr85EgHnxF?6=fdpha- zp&>d0ho5N_k1$Rs+&#xMSK)k`U*No=Utoj7&I+wP?-he*sYw%c#c&JD!x_Gx^cdK( z^HSL-B{2KB5a-dPV{mz1ljM%ZxlI_w#YcZ|+kKUb*yg|BoSIt}vdzbJ(L07&L0$Y} z_-)rlz4{^iT%n1&yHXo<_mvuZ-i%51+*>r}E3TZxa!updC**GkGL$b`evZ_$k7|7R zAHxbsI- z)8nt*P_#|!{kb{%+M=Axt(_(5CTH3&&3muuxIX%^bWd|nR{FyHlGM&eS$mSHP_v;+ zpPK%NHer#+RMIxy+I*9^TDx6ycD1&xj-5R%YBwEmV{3Dd>9nY`tF`mC_T}wzogNA7^mNz3&oiYz?_akZ9RyoY-AIDOvMzIm-JSZT+) z{rpzP94xtS!ooY2^nG5K%krt!@==kcn#FyLRd;*bQ6bJV_l1_ZJ2i7V9l2dPJG|rY z1g!k`W4Ycj2ipO5Hs$p==CxFMV6FXCo|kC7sq z<>ZLv(*eVKMRCWR7HF=v#eIMv*r3La9R&S-d7ZlXJ9~3`9P`-_iyINQLJZ*q{QS5f zA@2Pm%Sr4+z%~ba+-Cx`#q~^SMV{yqpX|-;cU;zkEe!Zgd6L+Qy$mh$2Q_eFSHj#~ zBs0&8Ac%6=Cdb_F-YLUEIA2R zV7@20N;pS5*b=LEuvOhn6_VK2*t;gORaSj|hruhZ{L=dzR(_iW^F(b4)_-4Y?al3o zay&X?qQT{yZhFm@UvXEIV^;h`?W%$SlHDe*QS0VZw9xvwv#qY8rJ=EHUBB*95B^$W zU8rLNmi6N1jx~1UdZ)2r!0>_9Sm!aqrW*gN2QBpir#~Z7rlc;hyy2Yj`@Ro8uHE&W z%YQfU(MaRHmRE0n?s~ZHc!Rrg{@7SJ&W%Sa{yc~YE~9z-u1oN4il5Sa(V!>wt(4Y$ z=@pj93X|Y{g zIuK=8l5Ok3yMM0LI^pyM_dr$Ixr#$=C`xbZURACx=Q;~#PmMR~JyPKCj416$ywxg* zFVDUxJ#gpw8cmTD6#gShH(xaeQG$S7q*9c2?OrDZj)>wylpZ}d28qjsLz)^vaF1mr zZ4tHZ_;qm zm5mhG*%j-vE7oUMtQ#saN-*PFwAdjmDPL1wmG5>}l?$a+u9{T>=9}v)Yik5)c}hqZ zsTrBGY_^%UnOS)=XW1~V#?nlCvzy(91E%JJdxZ42OwA>LKmO;Or-N5b-^w$3JEo8D zt#>7l<{sr0Yw8d6@x%D1m-lyEZPCvF3Fi(Nm}K2sTkD=#y}G`^ zU01uRuDrh9Ppz!Sx@bdfUFG`nGCy^7O%VQj&ivzq zO}%$DO>D_rp5IVnHA=&e{WxD}Q^AJa zOBPH?UzXmm()yECdwL3SQqQzm?&hCZw0fK~5{1)88VujTVJGuTY_D2P`D-^`v3rp@ zdYZo1ThQX%Ggwq$HP6hpK6&$=o+5b7%1*fJ2Cd8cs8gHE3>UF%(;ypuz1#I}dwvtn zP+3-E#i=hbIQ8XaLrm-c$KKn(MOEeh<98mI8E_Z|L>=Y9i%($-Haw`1Sa$%8iV9sT z+H#peNG#M5EYY3@1_h1U(b$bzw?DL2=GR&(x3$*qHUnm)WMo!+i?0hl6tz}V)>>Qn ze}C@7aAz1E+;#W$ef{FRxP0b(&N-j+aL+yG+ZpnB$*BuahKeHdp+=J@^tXp2qE+J@Gfl&&851HtaIH=d)8F-TsFDlVddQDaC_|M$fDB7Jmpd% zi%?`?zS`W?mquBndN{3hta{S4=#;CwA^lfVQy-X^=^3XCsqN5N!ZaWaO_4=SX_?(n zfP_!zzq-lc=-K2Bb6bDYv!*KCnFV!6dyjg;uB{yZa!PMY;`c3L1Ai(t@ShC3x($FEzfPKFS5LlYTxiZ$fqJoLieWuF;9@YjVelO@33F#A@eRtuxh=r`RtQTln=o zq)8}?*{%*VcNz1LW8NaD(Yc}0lb~82wEUgc$G$OK+GXrkp@B+nH0LSWDyL6A@_=)` zJLt>C38z~RM_5(kn6m3TgMMg!VB*Q1$yNGePq=YkJ1g6|mxgrNv)$|WQ5KoZ_9+p_ zA{AMvt!jEN5r;273;=){6VsNqnbu0VSJ%I5uY)rj$!_HVr{o6Da{2nScgJtZTv|P z8!POMNpbn{td7A*NIIZaH0CvRyd7uSB$n^_xZcB7X^iI1FFly|zeaw~Gk zi3zVWMKgHTPX^b#^*ft+d$?0Y-S%bcq79dtbjgL*X;7QA*c1;1OMH=z8P_gPi@Z%J z(z9lr=2l@)dERV%JX}R-Id`KSI;+s~+;`ihw*J+XFQVd9K3dR9<)eKpwNO6SVt9o1 z5X#t|y`wU7W9D@=ZnGrK#nu#FAxKs_r=p=vxYO}^-Sm$S=S_R7)m2 zZW0qsan3-Oh{PR9&~Iv-mv!WpshS#PmDRr0V$J|!2|rz1D_zjsq(dttYZjymRo-UG zepPIv!oF!jL{_u(3H{uJ@uu9l95hPVWHwLLEQBQXca>k4qE2g2PwG=V z`iXf$YjSUJC|}T~HQ(h3+OO?&|IT6fDEKV9(_!32(RfElsQd8?XdNr9!Kt6@#~emI zE*BTgbNRT)5v9(>QY5&82#f?h1{x14?a@o&6o>DOpcIg1MNBI(R>N`=+-@xv|6=4YoA3<%z z$A|oQ@PX4{CV)?8o+LSQ!KeJDgHH%BDgL$KQ+?-wFRyPY_~fVa5IOZv4UqX#oMIA_j`Eu$1Kf@-16w z9~t1SzZ94FyH=!3MUJcpfEmo7g>0JM;I)I&=dS2ZG*+;^`#8f8Kgw=yDL|) zBIo<+Rgs4XdQt*)i1XCq6R=N6W%O(Q0w3)x{((bw3rV84U&xAyjzJGR+)oP)D1GVT zr$eCu#Q(wbF&-3kEuALNrO}|6ZxYp@nC}wLLJsD$#M7Xd zUlPgQF7o5;Lz91>=-&;BHEp5`l;qV3bZHSN5PR4s;+J{gkN z0ZQTR0$sWvl;rIdDV-lDd5yR!Kv*Z%gOa}%?M(g(P|CMdX!k@~-w;0=l;m;(T}pF3 z))k3#bMdF?hM%Zgq>UnVh}0@lPNb|zLHKl{W|sD#j-aE^$#O<>R`b0^t=g?=*6ab@ zquZ<7r^AblwoTg(%gQ@Kc82T@fzFm-S8zSOi_jAy$A^B0!tnZ9&=1Hx>gPXBezcv0 zSG(WOPx^8QAIeP;($iX$@SRe>eH3i+OHL<-OZ}cj0EH7JcLOf+i_aVLp6HjJ!*!w` zZOpqxqCDw2gO^V)Js01=Pdv#z2anu8!_Pk-5#{0HhJ%!x>Gg}x`T6(yrGL%O9}v1p z%NSueA2gWeHE*DN`tk|zpGc(X+MCipLjQa{XcPhG>Nm;AyuLPP{U$+SwjV;>h<}0j zdC^-Ic}2w#zcr*cs=pvf{fIc1$|Z?GBZS(@&EGEfH6iO;Ss%-(17>MHG>QLjMxQu; z9BxudGD~g<94<5^Tqqo_YpT%YB^<8gr}qc`JE;&nVjOOXIKD_YT+-i^L^1~G`4}39 zE6HJLV1<+HlMB9q|A)ij*2W2GPKinPiuE2SN#G2J!?la!AS(_cjnf1iZq7yLhr@Lt zK8GwZT=Va#9q`i_m^Tw+Bbc;rn}>@Wz5CNe<2&Xyo`Rg81E!I%hYWCMJWUm-LcpO# zo>QrT!wm)A%mD0M7%+gUVQ{$0k>hZY_dp!35;$BHE;X*8fp}b%;{5Trz*1gtJT7FO zHy#&hhQ;F|4v)t*3N|nQn5p9ZxT*C59yf6NcyYNuvG(akdnv@W>Q?n*bay(3!sT9v z{(LR)lh*(%s`g?<2gT*K5-v9g{a*tczazlq;-2;J*iYbcy_jJ?T&~C;8kf5e?^o|bxfS3mQ66B0TbZq7llX$*a!-i3T$H~Fzj<7)xBN0(F2W=%^k6tu2KZ;P zx%$IhStx5J%4`8vbw7`DroJ4w9=c)bfoEeX*_D;!i^(s;|pQsvESva$GKb2&C_K=Yz|=4fE)Tv>06gTy6>)Z%AD3{vmL=iW~*2 zP}Tlp$IQp8U!O4L^dsBPF*{B?44ns`@|IXzTTu0v!K}IsG3o>rEy8oxXhq`*IV9?w&ZPTVwneDPL9vB z6wCx3HzedxV`R_+8}qg(8_QTWDDt+5TK0|*t4T3sXUsxQw?WXPG>Xj~wdAUZeZMhg z6q`G$Ny!}6Yc!O(HMcj0ow%@?lt!_+quAVk0h`MzuEfh8z2p7g#OA(N_`D38`(9!4 zzZ;wTBEARWt(QZKU`5GebFUeI%{?>_n`;_?&3)U!zenSfB^-~?AYZcZ0^sn^_qql-t3-8UWz+w2TSJ3yh0O zH%4(?{DAs@8>9OGVRWkrqkHC7BU>UM44+J?sCw3r87W|NJ=L1)%w1-SfYH5AbNfL7 zqwBs(!ss@q8fV=u!0Gn%V|3FAqdQx7lIeZZUHn%8LYlu?gpgX^(~PMHMz__A(LJWW z?mZbsw}POo!01K;-x@7pbnQMEUFKrK=yIA59#y0`S=G9kB?3m*{&1Cm(d~MoQNZZB zmxjDAV00gpFuI?K7+p_5jBbU9(Y;HC(d`CC*Ck+d@9oFvD&k9T*Ia7c$f_!4RtOkf z$HP@TMz>GI=++0u=sJ8cy3b6^?2%)1A8m@fwI8D!_KSfSUH7}d=r)c2F6FdxmZMc{ z;LoH6evL4?du15iH#$Q8-0XwVbxRoCD#GYCdNI2EFBwLc<1xCmtuNl%98{)D7TOmW zU9ri5(G^+kJWIsriY@&5UJ;{v(hvxv`#&N^_oNJ?y8sy7Rso~iC&TFe*!;}IlZt6o z`tB#X1&l89%aCJ)(RGU$-Q>U+UFHEFjP4(AJzFEk=-$3*Ypo2UTQm@(%UlhN?q&(2 zdom%nO2X)--@mOv#OOA(7kV+eGhS#6eklL33yIPF!HdyVwGW5UwPIXK3BQdny6<=~ zx(&eSzUjs2mfXmm>Bs1ry%^n&ff(HeFGd$zKHjkvTktgYVcb(h5hz&5&ph@EIZikC zmm*Hrawb^!*8gYY9usi7?tPA%UcS_{Ma1bo^(kk2_D;g;-dNL}Cctj3 zO6Rn;rcMEy+|a@V1EZ}`d)Nq7VfuF|ky}y=?JU5v`6l(R-hM}6YY-zIbR(i3U~X=# z6OHUj>#X$<>eyOr)OQE~9REn6) zIjQ~SJ726WO5uamg+DM>mx?=3ZKa6Cr9i14NKh32y7qU3!D0wKVI){x%8zdDuy!)# zcb88vXm^kbB~KxsW&?EyKR}XSIixNj$@Fgup-&7JD&#uI{U3xa_5?B1+b?9r?8oZT zJSn+R+^*0P!q+kBE1CF7O==`iEP;3@#-mqLA4gaja)X7le5hcb8EY%y`<%!lqNfEH zoG52N_%tzmFx+ml7~TdMz>N+_&mW*iSl=MwMR>6$oGKYDM_o%(1-di=lyJL|poH7i zfldJZ9yt&mmGHZSQ|%P}?V_LXyM(W81SNUf1-f)CDCLtQ^0P&L1}MoTyLKdZ8Ysy% zihi}|C;TqS?F1#cM+LfcHz>)i75UX7|87u{YX>E{MW7@%PxN!3Bqu|lO9>}R;W|)~ z*Nr<(;avhrFPJA~YJTBSqBY!R0`TqcJw=1YS=p=Bv)!JHZ9q_sP zG;Ym);CA=x+H~!}?H<*3YP-PS6S6mCA8@ z_%;c*EBW6=yAWEA@L8MY<5UUFkVP*1SCFxwz1{UBV?(9+Kny z{Cg1~4}ZK-&g|J*%jlz$qxE3O@u7q1#2 zZkG~>=-dFaxftTNo*cB;A~;u?i{(uw2K~#pUGHoh5V7lbF9zavQw4pvJQ$Z9&OTpS z+T1xp%%O3+G8MXf7yVcD=-TNcE1ZPimHb-p=)$AVyOG-IJ1agM5`MQ4hZ*@S&J({Y z$+2UwCKoRiMDPyyKOBCygkCh^P6>o*5bG^^2aw_LyLohI6pj_^>i|Xz!zfdML!JCM zEI@MkIP`BiF3d-82$kv4btAqRTnyX%8ln$=s{#6Axv;dUkJhu?)H zI@THq4B-F_Bl45!(CybN+U@jY^f=uaHYM}S`Qj75x$(b&_fr6y2z;V*IBa6f*%9dr z{k?$aYjnP!(d7J}j3&NZgX22|++illVFB*2b!g0CmM`Y;Mc@H_+a>z!h;)G>9oo6x zt>K>O)-ul!uDJ)7q;vQ_NzW(GADN!db6F$96Xv6XoiCnn4xYdN6rL~<4KpO3u;D*~ zC(LWCdNNthS+3_{gD)QhY_OPz4X%8Ujej*SlDpy<$A!cPXS*6$^;VR55ncjzVLTYM zz&NVYa}+l?YJu_gQQRQ3a7x-pnI6OE9hy;{p5Eu;U)JeanWO90&tb1(rn!|J9!*iW zL!IxqO$8lSlS|o0X@;N7tZ*JzyCFdgGgr_df2u@w(uxka1<|iA@G7*Qmc%b_jFasP~v%1SG5@A-BDehHkRQBKYzR*eXgOf zfjGkvV+Hdw8wD9OjFJ^f&sJEc%zlR@vy~*<%daH<+g?6>5RuA*8AQU@ESigPH6^^T zF}JDX)wuXAf;PRKyQhfYm!~tU!c|33Vb{lI$JdIX7iZ;D75MyEP)RQ3t&VKAC>~%U zt;`)$;T2^Qc4w@hV~@ZqOD07CegY+(mXpD+CkeopMRUzpPpDB^1hh-zCoZdi7@YB} zZlT@<0F3+3tW63%9$^zeffqkG^G>CW#h8!0q;k;2!|Tuke8|eooX!2OFvAG-6w1<` z?W#=Pn0ZkR(V2vP2(rqpd*xYiau^;8;bXLbND&M93T7C{jDCep!qJZ(t}En zrcuwC7+48?9`&ktG%n+y0Loc1c`8B)Ve|EDQEOgNSCM{hbR<;erIM;V(jxfVhx3mF zdma=bF3=o(o}Y`?pg#S&@*dNg@_@hDtxe;Azxi)%h52qr@aur#+~Y7*3Kc_rNmt%R zQ0P75KQq#FN&6ghqjGVP;Cx)tW`NzR0^$5@7qUVeF6#qw2{u|)2BA*H{8J(Zfe~OEA)JgH@gU`YrqVTQP zQt;`s>rC+RX+(&hz%X}$Pw6e-Q~r{ihrq|DDP}47*t_(`-vvH>ZY>9&ZlKgMLH^9FSe7WvB+M^`-uY)hiC!K-hNGIMH@X7mtI2yn03OU5aFNjJzB=}{hKuXN-GDIYyw~P>%LmA7FHh!576-G&gPBBPfh7P6V0(NGw zPBWO;K&hl|Ge{cBY`BgiMG!XtQvilrU9{qkl?BiQ2{?`b8lvC+eTN@1_SV z6w}9m@B}0x*NzMLkpban5KefMHc-^Hl<)OX-#fbZI;&$)my&|9j+1@_IojeV0&~A@ZkzQh8WVk{1nnVfEA%m6WPg8CtLWE>{`W<{)Q_u0KiZymWVxN>Q9F~vPu?%}E4shLliaKD$o-f2 z`LhsF9`5i9Kj-Ja#?ODqFa2Qn3mQg;hO|(OA;Bv{1yW*Z796Sw{nOx3u>wO}2A>6l zd2{5b7Ama>UkNN!3iVsK4OM0l#3D^a{-5YH=9+21f^$$BILR;JTY?1ki1pLi#rPzT zM4Itp#p68&;9HiJuPs}#YPnbbk_GuoL=T80hu*u$^@-&Zd;=${f`Xy--Q6!HWJR3I z7>s#Cx#93K|0T*fB?|eO*p7qA91btzlJGKOJ&kw)q#{d-wuZztho2BRuJeRxXI-%q#kdh&!RMbaIH zDPO?Z_|s)~l-*gJJbQLhdPTXdwA_|#wy!Q-4@*F^8M#U*HR?mJwdbP}DhAWsh#(x1 zf~nRWUQ?}$hcMN;SZ=EI)i%^;Gb_|Bc}h+&TeMOA(3Bn3_;;eZ$rTxqyQOYS^^RQQ zl5%y({1<)RwQ&s{)_Hq8qb5_+ zt5vYDna*U-CyS+?p-rZ8Mx|X7Ra;0_HFuk6puOC9(q;I{XgJOr13hCjeC#%?G?Ss# z)8>9doYm=VS!sJ9Uy-p7rbt!u>zx@4ZqR2Pn$s{CYBew(0}O`ZPW6%HP{YT(Sx?+G zm^3}6*O`+hB1r6&=hFi zQ-L3Wqj(UqqS{;MHNdWGWqNZf*@yKSS1n}?$~4$NT}<{*bM$~z7!T4d4|Aw_hy*Pk zpk7HCr_WA`GtbbsaJg)C4>!Z8T*HnHv8B0+GUJTeZMkfHW&8~NL4?**Xb6QCQ)m-H zNyfjyBrn<;rMQUcl_FpbrAA9Y6_r1FM``dXlsed^8z`6(47a!f_!W99Pb%GT$>*w|P#Lt8}U^ zcy5(zZHoTN#&&apGNrXy|AxLbGc`qj^;=*pOlj?oeqFDaGPN@JVC@5MJp0BIpFXhr z!DrfEtxG&zx~jf)ePhm}JC}5Jo__z9BW(w}dKU&?j3Mi3yyMcF_n45f_?mSvjh%0A z$eO>mm5jJ|v{ro>eV{3{*Am;}iTN-trZ+C;m?vg@>Itjiqr9*lHtZynD+&h7n;n(f z_3<@!tM<-{nl(D@hInmRzI}UZ8qB)yaAH!gQpJ*-rr2HuZOy)gA)U6rwe6VO=WWLv zuA1M7={hUT)k1jK?YLL2uX^$fPw7Z*EZWm^K~|3e|3Hju{Y& zm$fCvyB#nZQ`-k5#k<;_9rrlKe5CE{xYrT(mDaTNKF3&xE`Lp}W5R>fM7$$-#UJns zTj+Kws}k4m@NY191%0Y%rbuwV2c>T%e*z_F0JR%ADV%qD1$-fSlJl~tar}Xq` zj>;~@F9)CEJ&p@oD_(vL`1Gv*5tjtVpz{A-l-~iqT>f5B{z>rV@;ks!0q-BUl5tVK z1nW?#h5Qon0An@i&38Qb1YNltd^&m~#m@$x@+$>jUe0{*F9H8P@F|@Xzebe*jGz2R zMftDz$!`On+UGR*^740sPvuwP{>aNe7M+Ja@6853M9i1kCl>q}@Lvx8bdgW>%?2OC z7*hm(m@Gb-y80RX<>1p8E0zB~@TpIdLlK1bp#s7Y45XOqrK+D!_huG8?)HDNE+{W9 zF5)*CWIX#Fg{3Q&Nt+n5fb!yHWyNa)1QZtEy1J}*)k=R!t5&aC=3_MxAIS?ypNW4& z@B^_|+LrmpTnWR|w&jA*f|a%kS@G;;D^{*py8@=D%huc1t}dX=sD88`W4Eo4S9|b} zm4l@?FBtI;#CC$*+Y~eaEcM-FN;J{WZq%& z8y3NWTY5>qxPGXLbgTK^BJDg8)3-0nLwq~4JVa{!0mAybvpl-DqYg)e%Y=G)e!^F+^+j zcfkT)kjy_sDvFw0Km#y8GWY-cNkMMJ)fJ{NUni})1`DSNk=$V6;(Rw~ILoIVJbnBy z;pSn&(}oG>h6&FR!!ciz8_+&W1irM891xyAO!zIsgjLEz(AjIz(y}DJN1^q#z_hqgCcm(U>qSYUQ|}zkx?M zA3FuY1yi`pPe;87_d|uEa7&n zBpmKK#3#ShKk%K6_e;-{RrE{!|4Y#?^|yCLe;Oz`!Y7kFjy!Nr<03yx9=Iy}Cco4l z-WL5*|Ed?uBRvlbkcQ&x_|(F}m;BOrpb^tc&xc!#FGd&auOm*p$moE4c)gDG^V6bR z9{zK9l5g^I`IkeUDEgj$yXgd0p7KU4_BIu z`Gt;8NdHR5hwXh^@Zm~p8m3g3+~iZRxMJ{$FJFuJ1Pn2E{xfL;}(!P%@Z(P|_we+nfZbRWgsaN-~@0kV2xg+3A7x49ON> z#kTVG5(q00{>q4Fn_-1VpFWh-${$>T?fu^<;(pAO22S!z_$zT98!`SW2V*)pl1Cyt zFp1I2KPE&65y=gQmy+bz>B|jV1;+ZJ+;DiQz2ZQBN)*y7)_X9S!{MbGsbR^9ZQFrK zo3A=1b8!q8TU3ZP9Yh$*eeqHp;&TY2$W%lJ{8Z%*O!|$GO&?V9aFL^rA9Rs?Iw$i_ z;id4+h;#>?El@$1jv6|3+%=37C(PtdO8 zD$Onwq27vbt792QgdTEFO(p#}6L$5e#v^>(t`o51cTzQ$j|crZyC|&!I4w%oJAwNa zE#aD};J&5na)s`13I(%-Y!v=*mtZIHn;WyAK3kCGV=wWPN)4GR$X4zu;F#wgXP70& zQPv*FM?-Ff>`1xY$8$~v?47DmPc?KHp{`kqt^Rc)IfZIw$ybnj26DfKJe)=1%iDwe zj;n$O)YYBIY^D1C>vdg#vSs65pq|ctyO7jIRG0r3?o}4Yd{Kz|gx(!NSi4@dZyfH` zag~nRHF6~P=myA`ivA(oBL(i!!29D?2z@b7-?AyCzBRDDE5&ax4yG zp)Rhij;U9KTAns?I?I3QbM&{p%4F)}dVkF4BgY(dPmz#XRGMRZi7ERIOi9XoGCp=G!jGRtENG=N@xh#?H ziKT3a3Sgh+!tbdEajvXO+XcN2Sy3HXX**QF%B2A*2I!m@A7uQH4eRM3Y*AmI0SKux zd4?|;pz8K!MPV1V+L_L%=K;qAtQHVbfJg1%(ME*Z!fvU`7qo@s9}WfD+MAWOw{-}h zmO1QWy8&RRlO3AxP>jBzKz|AVxYFDzegoGF`#QsheVu1ulEMICJJD=d$%H`&YIK4N z`t{y0qFEjUT<(kXA+Q zuDq!-HMI#c^z5lZK`gL|PAz-NKn_3p1^` zW~GhYvaH21?Vx&!aeQH>J2zfwi`x>sz?_<$g5ewT1!W+G1`{dmm9ymDJ}#e|1E&ONpZP`m!8WAd+L=}j?evZ_HRDwIrH}$zdvx_ zp`P`}X2&j8M9HCb&Cq(3IMu3`i zL(3jU!6KO61@M&#>WpHyYjg}|UykQkp#=*yNYX~s6!6E?WNVuPVBc%kGD|#&=7J``P&>tQKP0=}`_xD8K z8mX9Ho0V4GT9?UBk>w3*^a5P>jKh$k&m`mx=EPggL3}i46wtDO&DN>rw^!7ywQKLf zw3t(4w`(`pRY2a@*_w&%;fB*LLytLZl{xH0pP?_$kYd~)a|}~$)2infaLz zMmeR<6rZcBQoI!uTxNm<8!PBo8LM8vmzTaliRC>?pk}_zEp}&etyng7WR=ypqU&=u z5~_RNf?}U(Ry&GZgCaNIUAYZ*10ziB$@=V$DrTZslX{EM@~bSdCQ~)9CST3zmoP1k zV6ho$70dW-4k`A zEnE<*HiDB1&g(Uig#Y2&g+N9A`Bg5_p38~Z9A?_$8GFy+f0`yK^3n4!JxE=H&>~-LhKobCd9vP&tlOtoM!b$Cba7GsT#f> z_Ql5F>tM%>uZPLhp5USWQ8iu^k*s+mNoZ%c0ySELvfz7}0QzG-(Zm~9JG2jI8#>lI zLfqOm``wPv6WU(xK1AUif%?kv3xKFb>J!wDufqgNeJ&Rl&87Lc$PuNsauXBodeBJF z6`=Th%Y)sBFNM=@icfB%7>9mS!_&fz76DD*)BPqMeSaW6fxiAM%1#9jD*9DEkx>!n3`rFv1m z&w)=sUfM^aHkRZ|Ajx^)(>;**_{oFZ_JQJ_o}lMUwk1$hywPC8LcBsYFuJ73FtOsl3oNiX-##n?_P$rLM(GM{-@Dly99tmsW$4ytSYdkLGHUmnwvpngzNP zgb(iqMHU*jNE=1!5UEw9oJd)bg7E3oDsyU@T2-fTDe9rpr&?L7tb>Z5v&!$44yg9& zQgy3Ng6>uCQ@hn_)y|;ZLCvsx)f;p=h}1kYk05h7?uWkr6V6B4zx@hv2{yveBCi>l?e1+PpEeu3IxLN9pD4SkY=VpYI&r>^3#n3xfl+CQ9ve6m)%~ltmO8B z<#*W1ioB)mpLe7(dxPX_9WS##zE3s0;grZXgistQJc=Wk|L;X~oG+eZZfbfmKpt?` zkkS=}VndYL5@oYpd9khZLg6_YXmJZi;~Y83kFlD@YwvS3QhQN)Q4YzYpKVyA(>fM{ z97H5H9G*jx!(k94M|KH^a>L;{a%pi7cS<14-F%@$PXIC;o+C|cH>;SI^pRm$Vruac zLljPI3BfZR1miLs-pXY5q6k03f=iL9NN)IPjOoUU5Qhgp5T1kN)4LsA=j*;-y${#{ z1uz7#&vcjS=^t8|tskp`-@5$NhHY{z2jMU9eYGFUFenbWRIVe*-@p=$nDdIPHKlaLf{J%%I7~fjOY&`-0Dae;F5+@O# zWWm&R#Xokns@!ZbW* z^zL{*n1pZ95l4hcFbN8X_Ini&6%L_*s8Fte=s+7fz-E?VE&?6WhLj67q)hGMY-D@5 zBXcHWF{!64WDZ*O%9vtCUAe7{sWR)TxT`1XZH-Tw9IU>IyDnI>CBn|`O>sS08!@Ax zwt0Ekz0Q(aUATd}^hc{Avc+)k3grxC(AY&!Fc;fQZ5ONaf>pM1wPmK>VoH5qqg>47 z)H(j54vyb0U>RtQFp6au#WHwNDm#HyshQJIv(BvD06>SeW*v|eUNlFih-IiGEJGHL zUtsnqy0z}fOhkt^s&)!<)~d4U+|Mg+c#s~=$-1(fn)L#}gpejRYppeNO#H@CgA8vH z4S2}=K)W!p$KqnTDq{~?VwrUnBF@Eb);b8ELI9HrS529zW^DuZpa^Vor%qeuEgO$C zVPm>H(H{neY1nH3oI!QgH2@)^ttfFKIq)*Ruos+RKkSJ)SQ-63HyOn^HWUP=QH!co zIBM3~Ysw{QfVwmh?B&DC*cMy#yG^0p5P}-nq5(WP*%Z3JDYhLz5=-p+*4QJK$p;l~ zm7|e1(*SkZP~u$UsM)}@C}O*@Kh_l5(qoWgUa*1IQW^V+1=3<2vvq{onUn8a!_--B+T$%dLWU9S-cVPHGA}z%qf6JD=EM zQHBqDV%jSSM%39u8n3(LG2W5{Lr%sLcYrSj6FS@WQu2rwLeA5sRu zq2!}zhzo{>C<=z5DCW{mhgs=j#^kMJCn>v~q19i}prK+{vau>4q(UN@goD64Ifr7hxaj3QYnOJOLtIc3C)S#Chi0)-?Z$5wmk=kTVm!;x z4hAM>hH+?3i<_$6W)$>I1Zz3C47cmx_}wZVn7}ibZpEf0r@8sUVqMAe!pu9A!M7=t zR``S^e1#)!+%s&1ANO)!1%YsIOD0J>9Hx z2J9&rjcR9+zS_DsuGww(T>1v}oKsaK|o*-Xq{Fs8b0Qc_+dWG@J<(%<}S(SGJ8SSy;7)H(j@NlE4i z1S|}Vyj?J+G--DJ?r_yq*mEj5>S($(xVkcg({(W@oB{E&LZ2<(?@mK%!|c5cV#SU& z-ZlqqU}G630o1>(rZPc4=YmS|tmCp+ms^IT01cnwLbXLmdbF| z0#qfx4XO=KJ}%a#L#mA`^vPlsUv9dulAP!pKk?`r8S%-UPYL+g`{2I~&^I%lkN9_qa?-(*RPgv4YTvP|*Q+W=Ee20ur@;?yy^)f!i?*pI8y%QJZBb8H! z^#wlnF|XjF`bm7k9+1Bim$$xUnk$12i|KBpa+ECTJdee5p2DCTT$9L_ii}w@&dJ^6jRdzpi4PWWT|0A z3c~xwV=SuD_(a(xJi|Ci`&sO+l(fPD;KmC^bZ}juiJR}eQ zy`Mkc&wtp@f4iUGXU~zIejkQ+X!UaCPqU9f78*jlqpmkPalHxwe8(xDINlK{&~B|b z9?7%zwVop7?G-7H`mb6(8FcFvEs1qU(j~LS4OQAyWs~Nlnp0+{r4M$VJ}G%lig2Lb zZ~v9*Ft`!{X*-q)biUq7PdiJc5$APz2NBrb{~feZ2Vzs&abT1y@kuYu`kYgE4`3JEVe$et$CD{%)#Ru4V#3!tEJW zp0xch#4jkw&As6o;Wzz1IYsz=N@NvH7k>;whTGrmm?|a|??WCoI;qGzXL{GDVu%or zvJ=_{qpoa!H~wPbJU&IHwOj@KRMZ9xoGy%07<0Yn^=WRPi{wyTjIZbI==`_u8GQxz zB7OIAcRFLw3g_~b{dsQzd<@azw71F*f_Ap8A4|iFx58JX66^%TXMP%Iqa#^dH9o%(~UFdJ>K)@fpsQ)BAz`* zy8kEY!JzL@{RgEZx7~wV)9>W_;Pn`f=soOw_Q8+RbF7Tx$5(oP)K*U2YH3qnsWB#} zZ&Ot3rw8dK#;WfxbXW%^DKUi?sJdsbD!rvw{T`(k2Cw$E%b;@cFbYEXU?iP<#$$87EJ}IMNT$jH9NOv@QjQo!7S3 zbZB~qjTD>)?a0DW*7SB&v!(|}+F@(OZ1~a@)(1ra_)SOJH9c(Dr`E6vc)Ja!aORZa zg!LK?W%$t;cH)9$NmqLNWc!&*DR!k zxhGXqM~d3*f%1pT+`tErk_R$I1dBj>ob$UC@Z#w4yuB1BqY?d(IG5FBk#-0uh3Hjr zN2w{&a9TOA6{D|tOG;n$89wASQJn6h+`al1qFghW2&c81;s!$54@q8Y{xS3KnX z`;7rT+LHfR&D(!1_#*1ur1wsJ^Zf1`?myM{mHDpN-*~!L-+9>_=R3cI3W0gg9{RNS zrf0?<>iNj_O-6##^VidNmumj&r33S(Sq)Vd{U(~l8HR08S#xG<%kqTR4J>2f+7;#< z7i$v~N{)QIqiFAh9g**>o3(D&C)1%lfEtwJV_6N*3~*hwN2PYd&+MM>(T^`oPDbvjpre>V^WP!=O>}0xiBn;r+$IN8^k4_T$bmi~~zXj^|PFetqv7 zo*;&UESBd{Wp};N-L2$5H})6ro!eL26}&0q{`*y!p1xPu(tt=fD&Duhi@HUwT7in! z`KDn&@d`~vlZ=e_H50{)h*F2l#rMskN{B+a340(nNHj^p9>kjzjjIxR@Ck8L$HJ(N z1;eP0g%uY9f1sLM)v?*5Yw37^)gRNf^nqB-tuFOJed`o+ivCasEDvSF6j3Bh5f#D| z(c!J_Mm9O3p|OrPH1z(lwof__-qPOLa`?lA>D#qic5J?CBiSaJ{=n|`2UgWLD*sO# zAfi1_X>XdowN*!2-8xROXbuL(l<;F68#DjD$-x3g5Ty37i&RrhNogi*)lUzta+;F3 zNk+Bmnyad-uz?>9?u^jtW&7P$Y~aVH<^h?o47=kw9n3^*;M-W?+nSUYjn~zYMrNvJ z)7UC&M@1%d1DNAoD_9(IVVC2;OG>!aytb*s z6BoZl%!4rDajXTD@smJZ;r)vFPHh``!5{?6%oC zTWCL=@(kkh^we5NH$v{s0Sy6Jrcl^TK4BQ=QC2~}1Ih3yYwaZVHg8$YV-=dL2_Z4j z%2qVnc$Dd6XkDYT)gBEf1~3OMw_KNi10?|3u{mm5Yl0%F z(80m8Xp*tb4rK&m5cx|@NK%(E-)cT&Hd6U3QN|VKE5nNrZa{d7R+|E41#9&!?%-P_ zVbQ5=f_{qsbLF2x8&hO^Y37y_7iSmDs~n2U?rH6Ir_qS3g{QY1JF;?Wxa zdeDWSDa3@6!s$1~C-+;#p>VpAanTC|VKxqfPvcQBE|bV7%*jXKV|~QjgG-J%`3`)- zmi!8r0T;>9K~69VKL!5Z;fj;-e+E95hRk1Z$uTFH;8XuUiYpP9R35UlMQy7<#VH?2 zz61PA;5UL#>7@9706zx)%fP3)O7YvlCrryPz^68n_&wlL`c>e|^9@6TQ~7@jew-|R z68O|+`@omCTM_sdf&Ur!Gi34a2cP_rxJT1PKDG06;M0CoI{4Tc@s_^}d^7yZz^D32 z_0r=b|7`fTfuAblTSWc=KmMKIQ@roMr}9d2c7dM+f1*mrN8*0~KIOXPeEdl~o??=RrX+kYkabHP6iKBgRRzB|At%+D0`7wTVp`=ej|1$-(eId3@yFOTh^ zmjgTtU(N(ihW{9RN7AeLVHTbD9a$2&I{Co>FQOzKsZ(BJo1K*GyKO9nmoKxG+R9em zQMy*PYg$lfD=+pH8~{T!M4iN~>N4A^qSb;~t%AZkZXH?Wr1Qo@6;KRY2D4oSCFQo# za$B-_WYP!Iqf#MCv9B&&pOj*rJu+$hzWzu>`s1wzZ@-aeKC+lz!v`aa?rWl9WNCz> z*tqX?%#Va8M@_tEsqV}4}Gl3`QhOPLhEEhjaLti07sNSZ-Wmue!`{EMoKtzbtGg= zf!}yD!qn1$BSjBfO7RB!3^`JYVTvaX5K`=Ztp)zKO^Pv$Jo%_2B^g2}AAMx~b7Zm3 zL!fu$k;*wt)qIDZ5hn5-dq$W@y6gPtFv2wbqt6Hvcn6aa#z*U%ZxU$$8etCpBaram z1sZ}zC{Suge)%FUghcXF#GTfn?pRV|)#&SpPmb1(fx`Fkq0mb)NO(39krM@DmFeqp zh6&FV!`qMyOWgtGqxC+y!NR-5aGelsK>jC(2|qnd_?cnCzaJ)CjY^RltbF=m!Xt+X zj~*tR^j6{hGqD3S4%7__3`k-%DBd4R9Rgiy2gQ3uq7@XkB=;79&R+tG_rJspP>N4_ ztw5I=K}jy1K_IzjkqA0066t-8;_Vga(w(3rw*eG?x%C2_Uk6HZ*Md@f>`U-+slQP9 zs9%vh4wUj?h450sB~$(c)FQd0?+Smp^bddY`_R@Tw-c1)9u?@)y`XrXP22&>f>wi) z+#*nlXBFtud{Bx<-w5JB>AAqSmqf_q;~@>7f47jI#x2rDkvc?b6)7iDR-}wbyCDZZ zHExkMiqs)et4KMKvLXfH)2UU~q7t>r6wLw*t>{#ADYQz5vKr9n?aD^w4$wa38Rc1} zR#~rVAcb10eJZzCv6fcZrS67$Ek{swP%Ylv8D^~--yKjO$t}QrCET=x+gwHAGXE0t zqwh&L%op)n?!T78aY?w!rzl+J&!KSSEa4>M;3u55G#)4spZwDJk|g@~i3KFRSQIWj zpHF~Ke(8DApseJt72`iH#+RNac=>SY`JuBz6kmFt9~aY0veDV`8S|_Y^LP8julDoPfna(14Je1) zPe#b)eln^p_j{q&!z`5i=kbxI^Ia>AG?nkNY^15=tC^9e@h*Qxnm}5A@awpdChA|v zjWmUKAv@9p(zV}9e)iuz$2*1}xZ>a;n2-3H)3!v(5S%B|u{W(LEZt+?g0{mYQy-|i9A9&?K^o4iasf$^`NzsR{r7{X~?MNabL zv+zH4{(@J~fV3o!M7H4rE(eO0vV(}^a2^2`uve^FE;9VjUr2IRh~a1PeO&Iu;(A%b zoxkY8{6mh76R3?UID{Kczn+3V?!%oD2vZp^{uqP|cmASRlxG#wm!RD+#W8KzEFcQ! zQ|0Mk(EbRIT9KW<=tg`FT#8I0ixd($CFf(r4?KJ){>7Wv##ON7WZ?(ae&wI5#nwQGd~@ zg&n(PYC6_NOLzWk1o@{Z#q%BbEu14T@#!h72j!voCgAPA#&0xLB<0VlRL`&~B`yUn zDu-%dSwelwQfrcxMgPx~MbI~B!g-XhvzV>d3)@!pZ74t9$zH;f6|o(>`;_W0l;fBs z<8a=?gzN0(OuAHWp-#+JfX5b7y?8(L?H$J%3a>wf*;>fR!^yUvtW7RwwoZ|Ui*58! z7_(;r^6N$V@xjd2Noccw;M@tT<(@hItITJ(Xm*t?I&M{Wjq;h^d0e_Khzak-J@YM_ zOivS0 zTaqWXRm+&6+Df@qX_U9czuH#9JxtN~w$()3kMGb{-8BQ-s=LO5_REsBpK9p#^SQVG zeEZ$3Qhbq_@<@OCDHU74Q$_LZ*ZSSLCFpO9cRFtxa9+m-Ta$RcxBhTfzrDz_1(_HN zNWbI(uYO6oCv?edj=JFADm|MR+g!`wFBJ7y4jV5-xKGkF2pzaIixjL~T_8=!$+PD$ zQt+&0Oi4j$@hUcBK5MSH^;RY)IV&)iUlEk=s7hRV~gAY0g_R&bFxc;srb6H)q~7Wm>Sh>!NGIr|15~XnXVI_gXgQ zm9@;B&z?J?&Q(u(apUiw)os3_ATHv%o8l9)j?YY;(Xvf>wNk_U{mP$b2S0R4c4tcZ zIYrKEm&92vFGq-K~MeVff#}^)Q?Ff14iQ35GCfzJc_Lm$NGHq?d z!z|O2&bTfMGS@MRqv$bUW&eamVmbp568QOvK- zx)e(P>Y(~hHLqRewRLGTd}%a%3d@H~*yqsuha&}Sn1jrk?NPvXVp@ZWL-KYQKU8Gk zh)Eq8;S_NFIG2##Z+LS=Y6C|PNnEHy5)D0chqaBN%;n6FjLUIZCudZ+p;u3$@qGf!XAdXGta4^z7VO@ZbW8`J5hj`i_aGJtH2 zJ?0^MzwMP|pRm_!PT8tzQoEnG-S8W_;gf-Hnlh9TW@u{NSyRU7%F$wEz))3D0j;fC z*dJccz(8?VQz+^S1HVia%n~AB(%K4@t+47Wn*5E6Zu4gCpvHG1dHGO^WJm2MUnu*@ z4l}H5kKwdYu7z}hYFB8&2|@F)OJQZgS<*NApPUgs#ca}{!BM%7V3@Z<^NrVVu|4c# z&H$U7*bEwxaotA4*Bx|(5$21JS@e!=#r(A zc1*|-CUQ>vVmfKZ;iR2MQy4-=Jo9Kkxtuw?>G6;%w$q-kv}-KP%DiWpG$*U8N@X^O z>b{{UDo(?xbNIt~^brRr{7g32q zy6unopUuAa(4m4orKcx-?sBB)G_!(*P2;K*=FXhuoZk5`zPQmxH_t?7-j3PkEj?Fb z#g0Emx84!6INJ0Yqq$P}R%P6-XwG`snWEby6S8T^U;2_rf|380Wn`A)P}g@o6%PKh zm+&?3FwTB$RnHJkuu(%W%yyh$J084CsdVsO`j>`-Zb1_c1gSZ^bh13#uEANoSq*v} zeOu#r7D^TO>yle0^VvCgmU|-f?sm1cU^5&kWzp`oE@RXVMlS8D1qs1A2cij%q>XF1 zTC5yQ+{k6fA5Md zt^;Q;`si}zSy{rLK~Vcezne$0IN{*$(Gd_Yh^V`kKu zhnL>zte9`qub%UEQ~2UJrSqRz@Nw$Xi7(dv{I>f)d9L~jlyX#2@2H~QQANEM;-K7> zv#av7R&$jrf2!{F*;OvYq_kXU|sQwL3b--%4EhJIrI(Xf}_7PT*S#f8CO+cI87$@LSWz&uq`OZ@wPv3RnIU=CPGp-m`%Z zR!qAgUSB?~pg8EAZJVBliC~;NV}I~Ou3cq*aiyTDcUoR&Rk$h}C-`>$$TH4PKR#=< zchy#Ig?`+ersklS$#u_0@#=k5S4Qr&3QB)><>~f2?tl3*(_?cBt&#qe?uDIXqvk2D_*ku{ z2j#6+T)bqBRX7IcF*R15YLAFk#cWyLkkzDZIyYz9+p_Q_PpyZz)t;Z(*IBiKDQ2Ulx#OCZupvwt+l*t5*>G%+Ptn%$ln3UO zDet<<1czcySGV>K2Ih=IBBq(n{?^*PdQ;^qF_RClVIQ)p`{rHd^28psXnuUM`||`# za^7>>EiGZX>Gw44xMYGZqm+xcD2zuYT>4#ErMp$5j)=sEYvZh(Ak!SSoz*$QomIF; zXAj#93-tz^dSvy7D-G|uBPCx)lc9t6X(;T7$8g!|{oQt)dTilhKI05|w*7AM9pGa6 zxnOV2p;L$wn9urIDH=tgei;n2psF@F?AY`g4eX2(mFk)@vTIHampd${+t zH{$@P5$9DKkJMNvlv>8UeA)M&#I6>xxZiVQs89A~qE9kGx9r>)sbw~W>f&^cXTu(E z9P^yHlvBS#2UCTILN%+g#on5>M~QBhnk)9qhc9=v+MVg$RbZxFXYR5aUSe^3uZ@Hi za2O7+jP6v0&DFn5ygcwC_25nFQzf8-;HM(0FDs#~B~j=uil{Trgq==UnIBXsRnjW?CH0eBmN}XuP!x5?BzDL3SG2Wapg&6 z#y}@GB2+xFDGvm22HA#Xw^iq4oKG&F!(Tsey_K5#>gwE}9&U3&{_Vl2q z$Nc!@C1-#8O84rIHvQ72y|c~z*TbR5xvX0ArT$QH1*HNSY{?jhE;YT)X;@RI;z4C(kZSK`%?L)OWsb6n=@-Mfrea#9>P!PAc zApVm>LCUZwEl+kmY-VIL2*1ju)W<~Ce zk5ccaIf0hfH*1oNFD9xc>OS~Q(}W$RhumQ;FBbP{Z674>*hF&?IU6f%noEbO@%qEm z*M}xfWp?QAP%E2jJySGUF{?C%G-S=+LReuK}MX zegZR6{t~|leDZ&Z%Ud3l^JVZUJ%KmJOYu>jx4@@(EckNyAB*zmf-je^!doW!^T3zO zCom_Kr$inf^5=km5%`th&j6)zGOTb&llV{h@d-Q$ya?|ooR5!;o&lfQi+E}o{{`^r zz5pxYZBHuLpG7|2yM6erqWrnw%jLt%AJ+U46n*Tp7PO$?);m@$D=3&HZNUcESH%wP zEbQCzR}%j}c_hiO9V;D(8ccXWaaq~wGT$SY{U@xXV`AmSYiHTbE7E4In3IZfV1Kxv zz*b&fT(-8LZ0#!X@Q!RdS+1g8&h}B!E)VEe(O$aZ*5b7*Ru<2aj$-*qr#g||;sES` z(kXtw^nmA0#Pg|xG!gDgY0<2tVH#41l|1b6Im+ac;v)X=+$B%UXp<23SHMLmhXSF)QWq3z_YFV_Pv=lkk`mxsvozz?`#{y9i@ED%3%4&Hm_t<^I7 zdZ7bKy>Pe&lkVCu?JC~3T(s|qp2FM$disR_vyw!bJhJ4d6+QnyvBOF67)LS1(P--9 zh)*tFAOphlh6$(h48Y(emV#o)&Mgt>{31}irRG`%I{y|>470iU0-c`=O6jseDIF)! z`D8!%|7Y(_;G?Rt{ohkn87gzdj0_D#ndb;7w03s_3K#}aakg9LDGYK^a0m$qic&$P zgX8IU|B8)J9HaIh5c}x+H)9x*6z~|F`uUiYF$@nxO567T{hg|U7{_~WzxTTTk9;Wh z+57CX_da`A`?uC!YaKn;GaUY^J0brDb`6KWYDt*Rb1ev=?wy(vvU_zpPUJG|OAd#_ z-_{Vab#;1&kS(y&>xAqSo&FFB%Ohb)B%Dadme?tmQ2CQ1>9SMMbFw#3D7ylMHIeW= zLOoYbsQMlx%pjad2qfrqPb3@|39pTW9SMOcosP35D*s+W<=-9&*F?g%BH_!C@EJlq zH;T|lIFwNBmA!=8)iV-yB;?<~w&CzsEeX|5FCklZr_GGF>Xn^`>U}*DzD%g+1Z4<+ z^#Y;lDR-U5tYVx&MDE?lNMc z^Y^t#JUU+mWt2avk9!TzC@$%~{&q#~FOI~gMdIrs@nD1JCn?UHi0b2}G>DH?oM&Ca zJ^Tq;)Q=C>eI|BPUv???o0As(8^A@qsL{JYe0YPn#((! zgZP04aXnlA`8ylLjeEm;`UU;;`rFjEK5!7d5#5i_r57=mV!i`{ba4^X7?I8M`}Fo3 zU=Pq)7-D><4Hq^tO8Ie=@tsFiXn1%0&MlQ1xivAoLynv@YU23G7pwzDPZ}|L)Tq&; zI!~H1>Vb))zx@hhoiE={{JA^c_bBxLyl1uDg?qU3l|T9Vk$pI77vKy`=lq}fSibX^ zWQ_b_HxT(gLks6GYB$j9>J}|}bj>I2%C5SR-?i&i-7y&Gk>CBQURNrmf!#m^q}}^( zqsQcTz3};l@BMy*qj28Bsor5*M2mmuFZaI-^cx2H(av8quGHvHH-7H-8&*CNE=c96 z+McW8jYo75W6a|J3xD_CJ8}H|qyKIA#QdwAw1)NrYa->`7kOfDsYm^S4TQrxz7B^MOZfKHPuU~n{xLib zpGF?*xilRAb}1KQKV^?#ED1l~0$QuT7R%zDY2n)vA7wSaH7g)G*d>f}GDQAsMaaI)9~8KreZ%3Jcw;j)t8(^fp?qj7=71@qOb4TIpM{zE6QUFc9d_q|M%+SiCf05NbKqgsE@zt6T9PY zQ_|2m_hEmMj{V7Hd^;k8Z&zgUJ&o9fd;1w7FZ$(P7h}k8nWypjwk-<-yRcbEoSA7R z&D>>n>|PM)%osf#D%<(Y*JV5ZMEEk{JQp|E!wzb5_vOk|$Yi8Z1d_lAL&Q$Z<%oMYT z@`|`$?8>qqU|er2*=>%zBg@=Fp57%{+;el!WAC5oHD4uvZ^L69n7P^XqiTlX8hZeXG?yT*_m*B?G648 zgaN`D`n?nVn?}7p>c44bqFFF=tGSLguBUz1aqqE`B=c4JE{AT78x5aOk3v&@mqO&{;X$I-2k%*&~?cRlYLq`Xvjs&$Gs=DR(1 zAEohrZ;@X#tBX6$zKK5dxznvb@mz2EGvDpDNAT`Gx7!*)KPc{IzK-x_nFr`spW9dh0I_24d;ASLVzJ z#L<_stvSFPJ>KPpz#-=E(Kbba6L%Mc+@xg_pF4A{`TR_mSxfxz)$xJNq#f>Kgx;CC z#>^dVn17yWm^Sp_qj3r5yU>G@lC9?7?n^XFOA^gnSSLFNCz<_OH($6LS#ynC`>@+f zm|=Te&8!NesU72LVoh>4wx?0g4C;A-a$lrO<)7xxwcjZTnpMM6%_SwN=7ZF8eprI} z5cS+eJs(X-H1DRKn|QXAe1{)QrHw}DcjWuz;RNapnwu_9h5orHuZi^tWly87ha=^` zICDGkT>FKYK651Hf9j64Zl~-q?l`*}WxiLtp<;>A)Vh}EtDrA;cyg_~DB~edBl~X3 z$o6Dg4^l=iPr5yhGWNK0tmm1_y*$nAf7g7b%=OHjJ(RVUGU~1_2=(%$*!h&vg6FGh zHdc&;e)gq|Aw1tpdo=x0N*R-QKFyP3pTDLc^!&^Z=$Bk`E^BiMzh2wcS7@Dj>ARDz z#yr!MP<`qqj3;bl?T6lJ4fe0uTv6%DwboG<^u!us#1R@6^PkW~m~Ag(4X3!9+dlFy zgT8vxvrMhqWvttD!f}L^o30Kl`%BNjThOSNSqphzmhE)2UJuaDgS0oc)Mv((Za0^* zrYc!$8Ks%#^wJ&XjM8+o&Yfaya>v`Zm25L_FG({iT{+evBiqg{*n?Y^Se$ zj4ShP6lgf(VvgjtgDzyJl~yR zP4hIh^WBY^gN+EG3zXfGwRQ{lZ>rf*fnU(a+i_Up_(theh}Ypn=d z6E-caG2=^<%?z$92W8RzEVEn5db8WW81t$UkGZ;JjrsmPhWSp3VV?Y|Um!Gdhxy^y zbo0xZ>86+czS5Z=@q|rjOJl-Dgt->Bk)dU-99!$AEp;63qA=M!+{OsqLiznE|8Ry8 z>Q5bqy!KwhtV=UOA?9>SNsU?8%?PEGB%5^|jL_ZW zzkOmHv>?{JhB3KjVl(qv#^rZh|L#Gr*_Z1w1z~&kx}!-(=$GtqiCiZL zTa*UP)Y4S*RD3~*xo@4zC?C&*G%Up~W~^CL_Q?(fAzh#BRuHOWPb_E5i`m0o=b2jY!!}Qh zE$n<0`Yx;j<|2$Gj3;k3duy^)%Usj?6>jd&bBWOXwp^cT(pER~9P4BO^K5O|C+51cX678yN72`hvc5*q_p=R`9Rr5w4W5euPvjY_5n&%+7BnHz z!5j-&7YEtzW`Q|km|s5TR#&&rIt`YABeGkv=6voL>pJr1v9?%G_HfoLWs|lQTCmxi zV|eU?U?R$=tj*3|@2S~dk>_Aj+UcxW!+sfzJdFMIRq(Q&*}yZ@VQru;6lU#~&e~jC z0k*M*5kElwQRE@7b&_XBk?(0R#s=P<{8o^s^@S?;R2X$F4{W9KYKL^=7^L z7^6Hw)sLLf4uX}|BxISsV1d7L%@Ds!_sEma?-YIfG`6gdvVJ$xk5%CKHqf%7-pzcduuxTLSxH@R(>=t-F(StY_}|NnJqmrRIKZ1UB+onA)!^+^^7qn0N-Zb{L9P)g@Iyujt#-3@NXK(GvzO1xd$}}ib`x)h0 z8D*&s4gZ2YWh68@qbz7<4AgVk_Bq~Xq`|u5eXhDAJ)9P-Vjs-5vdeauhLhIZPA^M` zCrJfUWit+}StHfn%X_vkeC8?MM{`JhJ~gAQ8dfJKn z?Z|)R>X^VJXxu~4xJ8utEM>k;nX4(Y9pMpZ@sr#?0?nI89-BPxk|#h~T^m>69nv~+ z-Hz}GbnkNKxy|Mg=<~JYOCbLdXs?&+!_ZzY?~=f~xTrsc`eUfW!!tF^^J?b(v2LC~ z&CE}@Zf33#PG${ugLbxdXy+%a-)8j5C#>0KChuu2V*FNt%g#Y#bRBRfSWmdU_F0G4 zWLjq(+L>v84$e6X{ah5>4K2&Gyo^h+C&?PbwNAa4&6+1`1h7z{>Mmvjs6$k`x;}h9@-Sg7|jLy#W7}JK)W^jVei~DFcfr< zJ#j7cFOIQT#~g}d%nio81+>k@9th8EkEz)J1`&2lG)F>z;M46_DU-5E+sc~XY;J@n zjbpzQ#*BkLzXEN&zGe+;E!K(^-R3#Iq6qJjEPfU~w#Ip;in$@azKVIWL~T<(_|rn# zw3v7-G<*zsDBtoy)5nl+JG^Zb?@oS)Zo-4vLu%GSOMKRmdUW#{)}O&o_*L}>+53XE z8!Li^X{J##*neM5fqy-H?B>2`>&yIFx@O({6c{redXxce>kj?v0qu*0MrA{ngduaG zC!dwBGvk`Lp_^`Kq06D0Uy|?P2`=*^=;jzOOlwb^^$@s5bn{D|oi@QRUjkdMnve$F zTnpWFvF^4(H`Ab*hPeoupmlveG;Sm`PV4+x%0FaeSNsIW4%Uf^w~_G9TlX#=YkD5_plU zvhC)rL-ky?{TyX3fkr+@8>ipla?;KPchbM2n`_P9PFi!@Rpw$Z@v&ECGdA!QjLW0! zCnLOuIg9;7a|k}yekHh(`Qx(I(!V}o|KOSmS6rHTiuefDQ(UmnKcuFw{|e&k_`SkU z<2D!nC{el@N8hxhz3Kc$!*h*=cUl2MzB}t<5w!ey)|vLZ z+o^jlW#S>wzMuM)Hp5x7Dzln6d<5??S9}cbRaLXe+55WDmbvViJ1O%j+76Fs_hh{& z{~fd`pY^f>-fKE#k96u%I`SjR&Zi%;Sl>S0Q}ta<+w*8gzB|*-q%4E7#s3}BIMh^C zR1uB>JLNNe`N0hp8ryy3^|9t!@a~dlAf+bs5M~o1|DkR9!R-|-vKcp?-^+T_T3bt~ z{ZV^kD|ov;%+1}!@<^7@Mm|Be-T)18t-zJ zIZN53v5uI>Iq+2Pu(m0mveuZ)8+!)$fw8kzQ~xxcJH$AzfS*3Y7}T++u7M?(^sO-3$0c#* zUrVa!r&##gjpiGqSCanW%uVK>N5_MM;>}T|apG^S>7`ZXZFj?eF|S?(FTQ9XR{=AM z_nlt4k$bV`!)4pdmx|NOzs{^OE2qYpO^N??S{nRwtocY8p(n#K8RJENFWY$=r6>JxFC+S=JsUdYG+C|nc{V(m3fe>!6%okH!B8v z;OR5$Gt8Mo(6c?v#UMQA^iq$ROMQ~P3oAWXx*qurY4Fw$m#IwESw)?3q%}r9AFQZF zR-ku0bVnR>tGPXf_nrpbX6;%dq1y-O`>|yk&3VmY&CzAC&K{(GuL{E7GnZOdv$rtE zH4bCgPv_9*l4p*BmaVV7&cBQJJbtf{rt$b9?jk*VkU2UD+8^ZiKG!P)<3G<*qRwnQWNv5uf&NK0+7IH?`iQ-d^-w zF8hRJQJs(_g|zp18d)LsKk@W0(k8`Uq)m!H#C?s2*6BOcp|Q~YhsZBE))(v*n(r@A zc4tp2<*|Q(@j|S(pi`b?XUea5E^EPUR@UyRkWA-&$`h49wL9W4c36Or?Cd$32gBJYgua}g24(8m?pfpt*=P$n`XACxydh? z&s((x{>#ZD{%j3#@dSOq7#pB>DWx&U2R2-wd94^f(Yzj{Uq$+B^ix%1m${lTc?aG= zbV0Jv50Hg^0IluIJADQZqn>kQt^#aM|qTWj7j(51CzpMlOPt(*Flu~grKJuG1%VT5zgFL*3?tL^4(cZ6}n zRg@`yPyMX*yOZ$|##lvPj|OAxWR7(ksOO-y(77e-zh|LwIIeQiR??43+eN$coV4cl z8qs9RL8HjQ7+t{_`xvjnm~`_r<0$^x$5;&mV@O86hW-tY19CGr?@XU-O;$1v+mSnH z|9OSDu%3A3k@YY}DtnHH_KH6n#2$D(d*GS>)-UiG?>vTaI7DCU1aI#Gdp^LvJe@uE zdG^g0*f$&UXOHo|)1Y0IoK1=TP698~!JiExe;x9!K|E839H|x@T!-A~18}kS{s-8b zqZno|b%=+ngGUn|_Y(I_?k`XpGO!BL2I(3Z`9Q8ubc+x4p-ltHcN{+LcjWD;YxuOb zT#HX@%X@w1NnGBZck9eP(24z^74@{_Imy0~zyspdlEE-Z;1@Ua(FI*>O5S+#`Xbn% zHTUzmf00+qwT?KvT7tdYo#^mtN8r_p;A@UJyjp_8s~v$?>t4H?v(YfGHXdGW0K8f| zWM7gsA-m!_g>%7FLXUMEUQKB_>(Tkoc;;aTu*X2=K{4}Fyqb8qVpk0OT`XZUhgVaY zc(uWdbvtBYk~fc!@K{k^?I?4{k6iV*!>b|Vf>%>r#~ogcIJ}w@cX+k13`}voQ!(uj ze>Q=34d{_(PT;z_c7T5(VN!5_e+YcqQ{Tg@b%OubIgw;gtsGu0Il`;e`~M2%(ed*ua*$u)wcXhUXAmN3%uHvpXAk!b_>h6jv(XuPw{GT zvu^HuiC6n4=he2tt0n#fuNLO5dcv>#G_O_zolJ&T+xjECT7t7z-a)-p(5vs~)oLQV z+SUlKmiQCAS^|5Nc(r7BwJkrvtHH}Tyc&8G7kD*zybHYA)(EerGNZiOmI$x51zs(h z{zJT44YVLR!mDkCS4+IatNp9@ATh%_~+2JxrQl4a3Z6eRNp$^Hf`bGMpA8k-Pp8Dn@!_t|N z&f_H0(mN$ne|z3zKDqE{>YTv2{|(fc;7YJ9 z_@EkomGIe*Jhzizisl8Fn>t zl1|7KIwMzj6y72oS)zd~aSrD|G4SEB@Z+sH_i6)=o(F&4jXd4C_W-hnXK(YN7vw_^ zXtO!v9xu8-Ueo1qA%Bgxb!NdCioFVX?e1HB=G(|{Z>Q}e??KO$cj?Xjk=%b4*~yZj z$mN)8(mmij%l;#L)P{7%03IugdVJLJ7IN^pA^g@iaC_Sn#g6HL}fm!SyzYdku0dzobkI9=Giv$1>|inl0I!rl6fcT zFOEr}zG`#Pge1af9q0qno@hBsSf?A28(qaZUdkNpAsWS5sASD?%$GxqE$y(fm_s_p zI>&sfVxFF3en}>G8)Yf3w$G(3XFaoqIq#z^o@b3iPoN`V`6qQy)()PL{xdK1T) zcQwdN-k|(cWP-~nU-V=m<&$oWqx=EPY0;4R(32L%*ndw#4|OjWAsdo@RY!Dnr8j#!b_DOl%=-O#7q$c*Z#DY2 z{wMNs%)I0^ziQw0x&Sn`I#gZu-!D(|4yG-Wjk)^=7r7ewS+CW|%KT?(>l078&l}0J zewElVCSVk}_|`+la;>Gsi;abQJ(Us{U-^hqBo^8NJo#7 z5ZwMH6t~uy2rZOgt{OHzI7ZbK~`J8?)a-~;m97bIk9~jr!8yMd{0UM0#pjq|j z+eT-;{pj~X*2nG8eEW{g1~xd-D`|@jPBJz)ZLz`eVuRBT8=Q97;IzjErwALII-a!_ zxX(`UqiHieW>?XFXry%E z3t5XJpsmHw*go7F1+5qjo%oFVhsbx#NMdcfk*UU7?0wF@r#uJa&qmjtGZNVlJi~d)pIF;}WSvKCO3J|x`JB6t(mo4KmVQk>XNj*;-yf-Oqi7BJ zrK_TSHkPxSyv$7G8=2DSvxcKn@+x&Nr|w#w*}^laJR|+uQS{k>n(B&U(2z9F8&0Cz zsP!gWf-c0hj~!=kV-K{tK(GD~iA$y&K-SFqvye9vCKGaQ#r?L(jlJoaW@E0$q4(Z| z&_3BC&?wm7|K~GT1>TvHa~|8QXL|EZhnM?!cD(YcdxzH7_$#jujBDRFP|UnufS!D3 zo=am64ynD-KecvVT zx(6&z*7+{Xq5IG$%*S467T1pv#+RWd+$`B_T$XI!!=6=wF8=S>vp(d^?{Vbn(j^49 z+K1Q!+K}%{=FUCBp!cEk!+z4+Xv{drJM*UvV?DQNCKxW$IddD~=uB=lufP`QAmcla zGG5~Oxshk$%eI=nW{GBenecDCbsy&e2k4tCQrXAor(E{xcZPW#z3xNKGwAm-*FPAZ zWZKO4Xxe$w@<+&aCW&Y0+hK{0JWYDrjj6Yav*})(^Fqg11I-;wCJZ*4eNX31mqY7( z!L=2qz<k8b-{eS1)BJPQ=s^gsM1=1$z8eNCU&NX_iJU4>p9w4t|y^gN*yRm^pu8(r&l*D@^ z@*XbgPNl8VL-UZo1vqUlXJKu@YKNO+Ljs0t3zlmIzR3sgoMX(-p$Gm2<9?hue3E&a zO&;l158;gZOLX!c<}5#j^WjsRH4X9j?B%RubfoP%&XUmAv+6k8k$uvaoZ-kOqO$fQ z+2uLsHw!pxmcI3No~uMJ5Zz$HR4bM9#AVP0+(+5PvN3|DSkQzNPnx6iEIb1b$$3*2 zp@&d*4(Z|ZCuoLj90xIHiWpnzZcEQPjq7pz+F_4yEWRLAO&d>ezU1glJ7-+zQFHF( z#5p6=`PT`~qntSBXNq@(HtF0+I9+y86PZiJJ(5kGITe8~bk=ng4C0T_`x~L@QQM~$ z^j#i(xPU%=l>WTJq4%i~{puiVD8;U0z7JyF>}T#j3f&(~`7!8uASx&u%y{2|u zMG$z6X%Q>L!r#x)TtmSjk&p$zV>;v`|^m(~wZKaI* z_E0YOMSG|Kee7)&YaUUbvtH}tKjFG@t&PBh#IQZout#TKyO@1JIO_s7V~?mGuYbMx zz>nu0*SauJ#a@tzj!f~D1%VWFZYG1#rieB}j~5coBFy8xFXvrlODH{a?e80Tri%Ri zxTk%+ANQC3BEgY2EM-kfS9U4ub5m2%SY!l@Q{^vGp{2QK7ef!$dC@O}CgdT*C@24Z+T%`4 zFh8Yzt)T~wehu^?E>}AL=%7;9XStcoolM6rQfZ%3uP^)iZ90VshA|#~FacQFS-*pb z>%5k|)Y17J7>O4XFM@U#u}*~tj$q#a{sRa2>@?^}Th^QxeS5Df(@fx*Wnh6s!Y2qP z6CUUHX1{3x>+1UhZ?P|X*pt`so5jxspBMwb*h>2wSmt_YXJ6=MJp7YnEb;JCpMrJT za4swvPaDoN)t8bbjfHPq%RVy(zV46ghuVWQHrJEhm$Z1w371hFDMLE+Dr1N9e7{JU z{U|eBp3k{I5}gg{m0eFLTd2A0XW|v(C{wZ@Fdx^oVfhwwNBX&~nMaaI^ySQ2@xIhC z61k4j;;2VyaZWvPtX~iNpY)>ERcz#59Cb)mRmFXSI?*MzTVuE7j4?J`iua`+#l`C@ z9!EWj$5D^sv=_a?=JrO?AE!)}7vx?(YtVp4E~jkSqI5=%!@g&=L#`v)#z5*3pIJmb zvVlyb9{5koOFdfiH((PZK2y5j%inw;@cQcMfj8#dett?sCN&Gp_6od?_xen8M{S|M z74&E&xa};s?HRYP`c`n4K9sTlg@On{uQt{Bvz8T?{ zy|n}V<@7^}XfolG?u6=<*rOhyk9xQgt9!yH_i`my|I+2HcHS?-(=PMe(bMZPE<1vL zeY=@_o9`Dl6g7O0r)ZDbueQIzwb~zTdxFP1e*$sl%<}eJ`?-dW@LsOK4aAobXZ|>C z7k{lj+y5hSu;IwT4!g74RZL z{_F1%bD_(!`QOMhRXnqlwZEz9cWwTq_xUz7LN@=RLx)&X@y&k7=0Dz^?(7kJ*dwwd zdqg&}V;2}Eygw{vZPwo(Wb+UH_|E>I{p6?jhdt~M+3XM5KWl%G&HocWVDsO$fzAH} z;)T$j{>;DjKg;Gn`v+|Pu~nzu`ZoV-*~8YcPs;{#6!cseX%u?|{002B_P!YFkKhy8 zyB(al$Mjv6jego5?B24mmlofWEju!6F7yms#xvr}W4>ea-x*q5-{!w7xJ)+x_kqjm z+x!m)n-yaxGn;+*Bx5z3eOd8W9Gic|f5_%Pn|Tqo`EP;!or}Hu`)vM2A0>kUll=#5 z{$1a;`A^9H37dcH;^@1EHvfh6@#W0l8|kmhnd7}1*!+`@uYx^hequIq5!w7_%ccQ4 z{aQyqbRF37+cy7hySLJichtA}&!d4yQjQw;xV_hILE#pu?DL?sshd z-QQ#LpH04~%|HFm^OEDg!t=6Q+y_0pX!DQ$Bjc_$P2c~6Z2q(V!#4kC;4`CpN7(j1 zJ7W94$NZCH`=1@L{omu*{@1a8TuvWfO`ps5{{`&U-(Ws3W1gS5!W;MyzPAzj${(To z`YxF9sNzk1#hH+WmhSvHS1Ov$9(*CGX(}Q%t@I>)8JP{bAYu*P4ee zPcd(&>_rW1|5eAgZU0kD>4pyFJvg&-Z2$lI6Sn`-d6w<}i7WaBdU?E#{lDx?zHR@X zV$R{5VkPZ-g?98pzq&L1_fxk2Q@~Qv9ex2UwGeDo-|k;F|6ib=FPnet8wh2a9=7?H zETlK~{`fwzcA$$b8q$^b!R{RXIhD|b&15E_n^3lr@OE1J>DlHE*8dyWU#%fbMJB6# zT{x*LXL~Nr`qr^dJ*?jtXw9dz?=!Gn8_p?Yn}3FT_oE*?1HItWtg(5tXDDmzcGg@z z`dNoKpUC8X4)=8q)0?xFhf0`Vqr!VbBhDupb5_v=y<-C%BkfFt@?NtVIgHlZT%-Zw*J}35ci;an$5ZCo_eX{iVn6*!r_pHp|vuy2r?K4omkK zna*KkPt(v>e`289Jd6(WICR(#dyLQu>imE@S5jxx)<1}?{|RJHvh`1eH$8#=wB$!8 zkQu#88ShVYV>jV8zhcgRJjG@Hjd}lf-m%$3=*43XHkfC=W9$DHci7e+{pcUH^}og& zw)ICYl?wm%9b13oQs1`quf=95#XRMatv`D0$dzQ5BwPP-+4>`&a%}yP@m#R=M_<~p z1-(VK{=2@{)_*c1oe*!tIKeZe2e)*meUqqhD}F*nng8^N-epH{6+AyB^Irjc1;a5}Py+^{YB0LCKul5YQj?WWeB%SMvj&$bQN4d~f zTlDi}?fQz7;Gg~U_0tjgaenYd|9($G;Pf?#fm7&BJPqHrfVC~V0NK`EhwelhZ0KUS zj^nx;eiL>!>k#nsDzPY>G;z8RqY>G1>>+8y=Tx)-i9L^l$L>vL8AGuYU+Tu@TsPRYc^?_$j_ylvIE+Z z4sF4%FG7Q7LF1(NH5A+Z`)^4#Z^xz|&$FauVhA>GV%0NU)DPzk6%IB8Y9(o@*zW> zP1<7Wc_WfHkNu{QanEP(5ndg}y9r+n=UtzPar^?6Gw`*t8N1`}+L$0GvTEUvWFsRRIN9UA zCK)t)kLG5rkz;Gj`+|?8-;@Dn$^>V;$T|O5VGZbEE9hrKI}=CV4}C7>{)60KK>e~W zxnOGoy1p$nn= zI_pbf%}zwdRP4y`b>5kZEq!^q*`0FI}&w{eNr50l6Rc|Kag+ z<~i~`$yr;oe>=X17@PVwCGv?PTNc@r=)ATS`@7`1t-w(7Gtd`2BblY-xjF{`KXHDW zetDfwX)^i_TXs-Ufk_k|`ZztR@-Oe^M$>{%r9%V!?Rj%5eyvAz!g$@_0| zbY;>VTKYP))Pj}@&&Kh~<0sp@0?L&y57~b?z5vo$kMwU4thA0WkMKZJLSSFNMC4mW zNd5pOfj_mbMngZxh<-u`WIuN+*WIB7vQfSo8j;J|mA(H+Y)BiErwRA&DO(3Ebwf+t z=4A3b^~-c~68Uv*B&;M_D(v(sGZlVa2SZ`j0vVZn(OxZd6c9zAZpwuwRsI`EB?&nSOUVv{drius@Brp`Uy1NC(rUn<1Y4 z^B9-oyFj#bk3&o451^6N2wIej9dFN((o+i4(pqf#u*J0|v&KX>6(0ocJ3*O`LjP8h z_6F}ZNHmvx>qt95J@PrFw99Fu@N*vZ3d_7gUx~IZrmi*YAsUlTlqX(6bW`P54o@>* z<$4k{R5W!qVbmwUeaMzN(Z{XWztRXNL+eIC>&`f|bRD!*cHrPc_VtzQ<*T4uZ$q~Z zveplYXXkA6Gv@PLXsIwP_8Np)g!q);d}B=HEb|u16|V-L;rLrw!JMsR4zFa+uY&IB zjIxe)>zqV7qSL6S(v@XBKwZ+68cI1jD-=Br!snr%h2O9(q@fE*x$=4A=vlGur2ka` zpLLctp8yjaqTTXiGo8AE=vs`XKKXyRl{#o6WlD!I6W#=!E&4d?IE{OzI+0Rm+DU0vMqTN8A+=MZRU&t9nr9@nbwnZ zX{KSTDLKv=Z1D6BQ=pAi*sM$Tzn(T~Y)A0^`QWrdXoF-KEsz=Jp(7?aepqh5w!-CO zPgR-7)-}d!(UTBPiTVWSgnjyn2oKnjv5sfH$X`%*u*!4TAMZrR@;U5}H_`UD$)~mP zHtSV;!yb6%syoo_WF7>ei$V0y-e#Rtu@}A#zbkv#S}^V#%t?*QIoe-|Z1Xnqi+_{u z!aUX+Ws|lJ9J9^D{|+)xY(eR_x8X0Jg6{01?}cwx!fRGJ^d$}*V$Lae*Msmui&!Ii zZaU9NKW{qq$*0X8WH`avO%=>V>v7^MdFCqekQbi-_&y*X`hYx_ru^8XZ*$IVHlq70 z8Ny!Csox|9PD7`rX>X$c4$+rtgXphgmyW${Wo=*o0r1Ek?gt|5s=O{_<-b^Um9 zoRhYQ`R&vp{{Tbc%6or9RC107yScpKE6r*0XQ4i{v>^t$I*+_dh7cw{{Xx* z{jN2m@mSA1kB-OVjD^M{H$LniK(y^4Xxaz-R`ELlf4G4DsO=GNrs97k2EQvSnEU90 zTPv9RqF>$ceV}+Z=(gfJ**g^9sl9|g4b!+xbQ)6ZRPtnyeNjp>Q#J(6Bj;5F9o`$aa_S#(b$B`#O9o_$#KfevEHYS zT*?gl>QEW->&2R4fBC>^hkRuy&Uk9QGH#P)Lr(b`GvrVB0EqbHVE@$ftJqJm;dgBR z!)=spy4ol@pgQrXpg84eJe_t?p6t=j@}9E&f0;51;MZjP|7gVa-;uAf=0w9zvgXo| z3$LM0VWJ(>DSyAS8L#MgF2*;`RMwxH{p}?0U%tkZKdejkaTpbzl|#-j}?#hA!W-C zgmA?k>bvT0twa0_(N70iD_Yx{H>>HZ`nX~Q<0PyR#T6-@6iZm+U;|w7=zkPf-03s_ zNV#kJg#7@5&sKFMtK?dyjn&u88^pkS=yMxOWD7@Pq8VKbJ>)oc#01AH^3@ z9&IOk^hWmROfYm7xLLk?X0RVWMc54Nn+q16#C|RQ>=E{CM;Gf|`Fcxo_%rEg`MEv@ zeipks?Vbx?@$=fS^ZIm zN0VMAx*6cMV)nG~`Js<6opZ!g!Z3d(yZnayS(K-0%UFx2I@N$blb+Zqhd+Z4bNDlr z+t`xtwqoQhMaZ)2^Jmh%YEN0?DXRng*?6vB=bYM480F6 z76)Frj-RlLFpK!JL##pZ;_}^=30~;|-hLabC|>4m@FaYi!=H(d5q~DWR{YtaJMd*L zycglm_JB9Syxc|pEC?PEKR2B-k|=+6!S@>bw0J=AXRE+_vWwaSmJ=Vi2kiC+JjLhq zy=?7vv!9Ev6Mw%H46zix?o;@)Rp1vr_Z-iOuX~RA#5afevz-;<#g`J_9pTT&YgI+~ zGx3toQ7-wdxzs0nh|l29UW50m&!5R}o5ME~M$ZQ2S8v`B@n`+~qrf2Nz(cFpOE&SV z;`%{+0z~<<1@!Y%;6C|C6W{Y8eA>tGX@4dC6VhKQ+YNt~1)qfvUVONH3V*m7pKkB} zHvR&CX2YLtgg@gR{8<(J8T`xz{*1i$#@FM|@P+oh{2Bh@9R7?mgqyP*zF~>OpYd%9 zc=AQ?hr)7_QLp4IAEDi$B{0e-?j%KT{oNNm~h@*aQCT5PZ(_VB|y8HCK2UKJT}kMP zy%b+j(v$25eZCsB(Q@lQZrg)e?Q$I?!{cZj%Gs2%`{s@1z+L00Bj}ShuK7aN+>rhyJ z5o@s$pQqXzGV1YXnXHu`;?Lf3cszWK(f0cM*$b>OJ@dTQYlJ_OU*{-)CLU3`1i2CZ z%m?ps3O{M`UnYKRHSghTz@I7p1?5Hgvt5)Yy9)7V`>AgYWr{z0G{T?FW^IZ;dxduq zfA%Kt(U3no4S)6u;}zx4eDG(IPw|x{$A6{tF7xq0njhye<*T_8zs-_4?&Az?2jhMk znTpQQdPi*kTS4nui$7zI#&ey;b!X=C8R*_wXqkMVUQN4Xf1FF6M%-)68QL$44fr#B z>yhWLQ~90%`PX89EdDI-0)Ms!{!IEU%7;(Bsmw!Y;YI#zJ^Y!6wdnXgjPPeW;Lp<8 z+YR;kvlK_}yUiSSfj>(#Q=qZp&t{Rfk9yvuKb6)Z!Z+&- zEy%e133&!*X`I1rmmgo!e0C@1rpnhDnj`nU(__lUQ2bf+46S#>PumFAUT5a#LC*I* zgq`3&T3z7JE}o%9`Lk!?X~dJwgQuzG>}-tWtgN&9!4BawH1yt`Gqg`#pTzWy66MR5v8jw8Ez~1rm)Nx zdvEwB$#b8D51Y$gFBziF=0-!Gr%{Jw)oqCD`$|2COP-TK9kd@Gt;mx7muZ z-GW_QC&DLdZt%;tH;L=lSzDXI6rGWK_o1(^qtE3}Y%FbAfh=+fGRgb7_bhrAOW5C@ zEv7<*w2zfYrpS_4a6)s&wA1l6#Gx>0wIf6_V*}nZ0 z<@%|koVHa_H#S1n82XU;#GbU(oIu&r=+AQINjJ*T_mCt5lnt%MYpKdXu7-{UXTI_F zYffC>LQ1lV!8Fplm_XefxPJroNA0j(aO|S9++p2Q`c?faz3L|ki}}f(rVst6bHY~C z8SUGh5xph#?GyB^Y#*MYZ`B9#CE=xw(^zLtpU|gE(A}w^pXTyjqmTnv&^O^Z8$MH* z!x_L_#)AFL-pQDcWZteIzxw74`uZ{6oBX7yPq#2;>Qjv&vPX^C5O5=XO4-hysP7@^ zS&h?N+OGc8ynmc`&|F>0v$6qPN}Y;tBCpQ&$d7$0@>s^9A9=L@`x%!a@}bLZTa;Ce zElhxN%2`Xu3+xHZVLupAXTTcBl2uZG9X zJue&Zmpw0D`^pvA{v`Da80h2wS9~RWGbf&J!R2Dt-Uxg4#@M+x!Tz`@cF4a7eBCF0 z;aA^dSG)?Fh0n2B&^P|H)?{DY4%_1P*cI!$ei!YDjX;X*j5*czuq?29|1 zSCZVozIY;I^9H}4XJ5=bLC5lk?2G3zA0A_#G_)_4ALH24_pvX|K_4&2(N~sz@j}kY z<}zoO@SMH_w19o7zJ0OISY?kkhw;_C`L2EO``8!fpr4R)!M=D7b3@-TtKpfSV_(cS zR~*|;?Ok7kyBFL3dM4eg4hH>>l}eT+p~&9;hg8=Bh&*NZ9p0Bw{``c&q>>>R`X*ta`& z#rZeKm@O!C2fl~pb2y(+W2$kKUGag4U2!b5JPx|P6kW;SFYvJpmXcj@ciQ&=?>C)y zdjXvBA{Ybz(N-3IQQ&he_S|}Q#hK^;M(m2OkzQsE-~B*G2>Ea)#-i?BPoOiHN4nY% zP_F#yzd*T;y!sk`CAcorVeHzzaP6<`LKN*`L+Bklyk71AlP7{?TTVVmNuj!kiY##i5BI*P7Rdr#s;o8sT7jo1*QE9%$~qmSgo(PeVt zj{H4rQ>=CiBNRn!iiBK-i{uLhvsC0A!Bk+lu@t z+Xgx|#V6Q9<)3I9Jj+{P^iyDT&LyjdU{`#slh1q_zG4W!lgx`8^t^=;&+-%9pMW1C zzKKeAYeiTX(~E-39-3Cw}bi2*8g;{MgO9?DRL^B$-%d@z4Y>CP9^&`D0qmcU6FQd%N z^Y^~TwTm>$e8dy@di@WVJDqZ8IAvuo-|xu@*XP7@h)3$*AFV5!y82LVZ^|#^-8MM& z{a1XUHS~iv9xNd~xP8aofvBzbK*mkB-h&u7uu=6Bc`2sF_#I>XG+*TlO>=t$e$=8q z&^mU%F7PDd>C9usRP)%IiT(k8(BuQF#oXSNZF@35dy+QSU1`wYdHkaDQ2qFg$Ft+? zjfwPO5`E~tFgD)$-%p>@?0g- zj2-*Puj^%V?&aQ+3H-FM+9sURs;1~Pzn}A<}0fh7UO~gMzIpIIE&$=n=`Uj@sqweSW(rb-hy0wO@ zT7L8l$45jX{|Hyuhh867*oWR+SJZ!AEdKN20?<7FW|!B0jP;S|PV{$lC;LaW4*RT| zaODsCtov748$aq>Z%+FiXYuK{cN6v~#;pG%fpy)^CBCO16hP-bVon$S{hOgG zQ)RS|H5PVYzmQxk7P{gkUd~VX@bfUVdB}5m+&AA0?KFN|&raWb)4k5)UEZ0zCq2o_ zyN*BEbGzH*^+4k?2axuEWf`ZJef7=IAZ?LvMC^|i zR;pd@nA3g!_RY{e>`~!&xZLT73IC;jxcpzbANF363JnU=?OAaJl}|uF4tH~f_QqdU zIqT7N*Uo-){k2cDCas?*X z|MMAzq5Y2(hQ`6q3`QPtvaB$4WKLm7I(R3#WCaeaE({%fw=i@HInbwnDGYtKzA$tM zxlkwKEeMZ$5|&Tp*~9Y+L;L)Np)*;b{)BdM zd{;G&Z%J)54=qKvuV*ah&#`7E-%Z0`ij~QC)6U-PG4=h_^Q$iltV9l^Z>6rBxdC6q zG068bIZw#I501_ik_Z#+3Fv$mqx;<%J=1RJnCe?Qk{|3{pAksqO#MX9IO>R_ju`G` zQpX1Bh(WH-c_X^rN?VBzc;=8;CvB0+bIuXg5l^)zBg2n=f3*W=m6Ac=C&uc``6YV4 z_{Gk0@~`0iGWZ6#&ayN423xqUjnu_A!Jh^@JN4lYi~8>8oHKl8L3t6G$??_LoZ+8P z=ZnSo`|5_z!U}Xz7E!;RS;Tom_>5Hb(PrAIcqV%0;kv4*3tb4(^xcu5_&d%=&b^Bd zJ!}u9%kva^%J(CKx*GdKosXYfVT7LN43zVD>v`IwwEY!)8<0AcwwgMX_PO5(z0Z3p z?S1N1T08KNm*2EtHTE1C)-cW+*5FUpPdypz(W6qmgNyMQA>1^+Rl3Gm3N%TnQi}>e>I=TYif4FSJL_C3qyyOGMBBwP!eT5%zQ2ac|-E3FaW~mG@{u z=yhy3Qu*fUFyzmb=xoZ4XH997$aTEEcOKXtyWsG>=JqV=-c*KPQO=C!QTOh$U7Wol zPsV=S;2bdvdve8Zr98z?BWo?5*~CnOuirbTAcQRo_V%^TJm}20ETpV8Wx3c9D%heC(7DUmOV3e0(b2g7Ot_LHUXgQ@;`~XO0e|UzH}`SB1=>_Ox?0^GGtjf$)gK zpf5%FhWR@4MrVWNU_i~O;)uVcqbr&Qj-50@TT7an)g^y52O^&@CVvq!{F<^xtk-0# zrtCx3NV1(w+5*8AcWc2t=}n~e6wN?3i4Q`hA7xG) zow?pjZ0|9VbJ|B4?`mk*JnA`0pC6rOgf>CLo~6F!oS%wkeHOZ4-5Q6U*+w&QXsmhk z79(^ObSd$UIP>V;M(7;0E&Hw*e2#K|0{7oc3LNE`r1o*NFAn|gSe}hDPeTh2(e|UH z9qq^aVyAMfLt0=f>tAxbHPE$f(6}nT1NjN`XFlQ4DMn~M*GJ)f7tpS9+WHvz{y@G& z>ODHv2qjYP(LVUTocSSXjrdOUdVDK*ID1`h9=s8|LawjiUOVnR%zJ$~fN#93e1IRx82aES>w; z4G72K6RcunAhpaj%{R?=H}msy=H?UVRgYy}dOO8m@Uy40O3}3=U780Ddt9OY{sQ#V z*YRC)H{YqdH85f3PIG>{4164Bn4fxv23{}uz)bF%%QsDP&CmMW5(wgVFZGw1=7Efx z15b0#cZB+%E_vTP{d7U7%dc}xNEA#-WAvpqZ_3CQT^T#eIK0_ETBz#W&!P! zABF`^dGgobvuiJuw}yLZ_6c;v=7y|gqtjWwcp z8tX;(r_g@Ir_laNXrJTHg7+E8T&SkJIm`$7IMrS_E-&8HzNq=qP!@DJ%@sO0cGjx-qdBfn+gFT*hdE1XTj(N0 z4y0$Ep7kpS$IXdbxF1|7{(V1K?sNppwc)(*L=opI=tZ8Y~THA2EppF^9DnMP=O zgr3cyACIzU%%C5izt>|T+p}jtYl^@S`08`kz3?38Q^b?)iNZIm71`}%Iks3?%#lp{ z)L$|JXQ79g*tUHR?VC=W*>_>D2Mu%VyP#*!-y6diVUI-{l=eJj;rk7JSJ`jL#&rjA z;i7b~+}4V5_&UkJcZ22@7z<1o4BMJgPu6Y1P}n|FmvGKk(=H3lfQE+a+DKioPP(v> zlTUsh99B2b13J4o7cS_MT1|(DLW*jw6kC zfSx;bab~D9z3H4AE(+E-Hep|arC6EO+n<^q4g-CbUm6Z&7~9 zUkIOo&Yii!6*}4mUZaC6bS{G7{sxBo3JmuI`}?oUQq0TCYT1MF)#L2Jd(44dv&{DttPeqgVk}se6ntq+v zT*w+P=iX%6I1k?}lh{AzVf*t8z5!3+>#_qnoyXX-r_vrj?ZD50HI@3G2LE<(r=gee zp?UhcMrIrG$2ZMl9eik}7Bn(Xu&)=CZ8i&Be6IxlWk_L`Iheh#s8=IGwIdauMuy#m zI>SD1;_Y(wNBLl=5#0gDMRAwr*ktN{8tet_u%=M=La>)?^U}dt+9%V&S&H8TpQN~a zsA#_h>w=N0D^7srPC)DA^QOirFO%|wsZ`!B^BJ(Ap7G%mNqevlpDK#Kg+8m|Z=uhs z_z?DO#gDRIltX7l3q`LdQ`XZCj#GK>Q{K)dAqWl!|z}Pjv%4>SXV0g!cvuDq~R+vsSGb$@@hn$CQwmrlh4IW~FHExh;7;jCC6P9f^{+lkCErBo zL`}Z1Ub6irbL6V}pc^9Fc~Bg}#M+?%R; zpkqhCb_=;bjQSG5*+;;3!=M*iU2*1K>PmLUg3qeVgl2K(kq$|LP0*zqn#Pz%z*ZlD z#cmjfFJ`_Yx`nk~)G`j9Ar50oYy|d^$~F0LdtmtTK70* z{DC~<36Fs5CU8BG_7u~`(d2oAJPE>doRuW-u1ER_+tJpUxuy}pbc@+D_k#srWe;6k z`T=$bxn@h==OCE0C+`^o)A9XmD+H!HcyB>S-{xjdwN8MM^c`&J5S;`=X%9Tfw{cF^ zeh9B3pHJ|t%oF)w5*7g4F;^Q~$L`iyKKf~_%VXdwU01`8XxudKit&y9I@k`GI)07~ z@LQJSbJL5j31K=16EaVuItUJ~18YWc-3f3VbJ#us7IfC6gX`pn%43}X|H;p8F+NpJ zfJt>7<+VG2>!cs5d8hU1V!jqSxNhqOTqioW3_2%V*Ou_;0OsS3(7RiH9NQi2H#ATV zZtHku4*DWF=BHr0HzL^XGtbR|ZTMn4LLY6zk6YTc*$%FI^G9&qR&Yl(7~}vrupzc9 z2d{O!G6M|xKG+U=pn7^{nr}w1-FDJ_1v%!92(DXG57)gx+oHH`K?H}@MsQute*)Ll zI^~6NUFC)H!niK@pTKn|9Nfs<6YgT{f)QLNJSS`y1lx(;*2i_hAHj7ec_-nxlf0wm zZ+%>+xUijcSVu%~-J=a~odM0-`|7M;wIDnO?HV@w@oRq&>)i|88X1+ATRrPnhrw*Qv*o`yfwP!g=Pc#|o{Pl)k$A3g1kZg1p8EnkcOE=CPfs`P{L!_;F14kmwC~S}QZCrN_j4V7C zu1~nGv4h7xioC}|--GSG0^6NM78J#H=a4a>)8=5i7qMw}{Bt_kPHhyfYh=mKnEc^< zNShntIo;>`U=F5>;<=q*yJE?aoGEJp7hKFx}t5bXy{rt{hCarXHq~@2Q0m zOxLEgnYkc>>AIGF0;X$bPLAM?iPWDA))w}dLL2z5gWZ)q?NmW7c(2WC>o zT=Up9zCaYu4KDk{9Nep!IY79fQ!Zin`+&zCJlD*@bLGhYy0AA2+lfy-37$LY$k7yU zZg-*X`@nNx9_rr-M%X1Eeh!|KpHbmC#cwKWMxJ!X&uBaLVbT4QU^&qn;kqcE>r7cw zz=)(H5f*t5S6&q>}p#ley)Zx7||j+FOpJh$D! zd_HS?6z@gK_k9nZ6P6RE`^Vt9M&P**zlGA= z#dA+Kz;hG0m#=z+=fF@?x!;2N96UGn$M9TYU|u~u_fkDPC%o1W&pizmn+HDo0~l_6 z1kX+2dMahy$GtH;{|NWn3Cndz4YcF>$VmJc(4G#ou@(7xMev+(=0!Y5Tal$k@!UG{ z@4wdwt>>9_yvHZJTMXerYKZfNdu;&*4 zAeP%rJ=m;LU&>X`f{2{%P0m}=ew~H=<{sp9*^ZoU2WjcoWnpu8QBL;;?YoHQ#FwU6 zlOlL-;(rRysk|tjiU{j{7e7{PPF3wTathUIjV!EICO$?9Hb{7$_K zFM`ajjyBYn)rsGT%Idc9UW#vvV7fP{L-9AMBT8dm2P6I?G2M4?oGbPcj%y&ByM*H| z;kZjU?h=l>gySyZxD%IfoO9lK3CI1D0C7h{jf{ts+Z1H>*>f{lE+<=$Neju ztIkfogySyZxJx+h5{|osfb{kXIr#c{{6Tdj-Ot-gVc z-+t^?56&qJS=jg;d)f#cT3s0W{N2LPZTKho;xE`PtS<}|;-BPk;uVDQUGgdZM-JeB zP`<}-yM$a5`8-AL*@-2`A z{Eu|y+mS>1#G77hRk!2sq8<9(+tIbWuXh&u?fTAq*!H?BddjEJ*O&j1+%(VF0*|O8-r?e(mSAo9z>r!gwAmn^sJFU{5Rboe@9(|WKl-WOHSE2sYS&udz4lt)RSB<-9bVR3iJ3Y|oM~r# z9wqOX#87p??~(XBkDGgzSol(6yYsszO1AJRkm zApM8W#aH(lML)D$>JDtIyM~yL40sac-2JMeySX>1!_9rkzDj(dYl&%;eYM_pL*Y!3 zawvQ$a*ot59064;$stFdtK4ubcw-rAiDjskSOz!^#xZW9$b;b^rcvU{tmMUT5Z5@k zGrsf0%Snu+@Qgf3d&7z4ZOuD-gf<5e%lmE`T)z1FHhAM1YKUj3BbM_u#_wKY+J3_S zUuFF6nJT;^$sUzD9-zIMa~$eC@>f(6Tlfn65>L(fTFsnJzFqPv*Si!wlYTu!4Cgbp zAa^Exc#t^Gr)`0rr^wOKk39FU!TG$G^Ph*GqP)MN))OCiA91Rm&$JVl`ZZh@H8D-yxip z9ch0iv7Z|i^4HTh$#>I=eo6Um?nTPw@C6sbov~U8b03-^u?>Obsi97|6)Ndp8SkJw z^*sPLW;y%XQ{RK+8CgKC-9RH=m7EQ<>U#iw1?u+%(3a$B44@q;=g@|fb7;dj4mW~vocN_mn{AcsD};kz z{DkZ9r4Qp>hx3jlcg_O(Q4%eEYU8QLKfjRvO@ZSG|8w^g$;-?46T!YO@yUk=nKn1T z-TtlmG+gZ^JO{a-caS5JQ{iTgeTppk{sGBL#PcKvP$6+sb=kB@ZlIw(gAKlfx*_Da zB`;Dx+Ubh#eq9WF8{|j2f%a~-wesvnjuk$fsKOVdd5{&mA5I`A%XezoWcKw}^ki}w zjhP%rPWo@vq0q zl!q&N9&yp*@q?eqJw3raX0WXtsOTB|ugy^Op7bk&zV_j~_M8{Owi-_C5dK#uz>Q6x zL%5GP&a-pgy=*VEQ}luSKVp;Zc6eH%$<4T3z0gL{qls(U7vt0;$cJ#Dz)Ajr6nH~g z!!w>_@HU(y_OyNoV{Gg0Vns>zJkNUwW6TN-9FW43QP;*-4sjnOrs!GXGV2OPXwP;K zUJdd>5!=v}yjiFId8;O|))L<&vDU}%`|m|AEr}^QoG@J5j^97Aw(jl32z-zeYsMZK zKKR5Q!INu zHdyMkx|hxVM&0j-<(Sp8p893qdg@?xh;O+aad&X9;EIs zFw2LQ4ACSH_IUPX6VqbwGlvHma;T6PWXadtuytK=T`!xuZ;kWExhaXm4%~F7CcOEQ zi=~0Q~b`Xqu2#oq3JY0vts7Ju4Z^HjIgz{}{ zXLDUO7jJO_8)DPJsZzU9+*!4?`gVKU$O>_@(wph_;z%`I?Um)Ljt5rHWTjIphZ6WTNe8V#*1gM>f$CdaCI8BMkg{O@;%!|Bv zJr|SPpHqwYa+3@FB&{6TMV9+wcz1G#;)+Jdb}T(V&-+5!Lyw~?m&r|oyqexV~W2vxKWmptD%u+1>F1L>?HP^`Q1L5y<6==F0`X= zg*isJ^o!Wrt?C)-sT>%keeaFO{T@9g`*fa%oTJlsi4m9YL%!i%@T|yj$qRCtx*Owi ziOHSVv9;P;&h>KS`8Zapn{lk@UJTnAE}j(POKrrn7836%94m#ydQK)*tv6gf`Cg8d zNyN~OW*mmYyEB;>+ChxRMc~&d;MenB{CWobnonKhz^{@+Z5(xu1;3^$f?pNSThOq!L1y7zF&fRpWvFAiEO10t~^e2iqW(B+=ym+Dm zkIzAWl~)K40OdAtx5X33DSApc=60!R#L!CaJq!KnWwp31^hwGCs87n^3wZJp4L+Et z@~y?kX9;eFJCFIEV7;DT$X@W$h<@w^j!cD@Ms%D)JCe&pp$#eTV}2s#eaug!JeWG+ zuyuFk+57Y4b%#H%r#IHNCwzdth_{vdh^8Hr|HX_SK5p=maUnjUvSqSG_rJ?Mzc zO+}`Lu&wD73cm{Rx;F{G%1-vhsTR(&bKU{)#sP5iLBT)Z@H61+K%U>BA&MTy^E?ag zGU9RbocbZ~VW>%2@^EPOf z%M7j+>^8_L;m{Mj_-naVgj=N%JLV7g)cyy{$dJgnw>#j}h9kSkny#t-+{cx0?Ck?n zp6KJ$eK`&Gjm*_5drR5mS>D&lsSD?_@A$hx%JzR)mE))2QMuJ>8D-Q*9fD5KpP0=l|0tPKqumcXZU#HTJ%)}Hxi0+5f*q5Q z!70dI;pOvTN5PH4H}`9><4hlBMBcvg@4$@6Qv=H(TZL=o--Q{^Pmk7SBD2l5HqzF= z0W+d6mijOwI^(|*W|Xlpv18;_;YQ(C79N+)25yW5H&(zkCb$tkRq)!x_VIA_tyiCI zC zaX;+n<5(Uo*zvz5f^(%G30~|NV)RL{V+puSb3BQfd1O zKkNtw^}~*mGth$lK{%EZRdV0Bh2!rS*io>q$oL5GSWoKO?!%7MweB+5F%@iTve_x8>?jymuwpN;>Hk{n*b40UeG}|h=EaU>SAiXSBGY`>u@|!KYO!Of zU`N{VVMpOVPNTicVaEi)j`x|^aj9U(drj>4s$j>5n_|cJyx1`b?Dzt*Y^fJJe(lAM zUwg6RI_lZZ@lDhr+eKml|FXloPM0+06W&g3+Mnl)_@&D!Hy0;?AQ(r zDcG?+IIM{HDvt(5a?n_)-c zSjMLAIci`>IF}9V7|wU%&$(=3M<3_1k4soMUHo~M1v{pJ5w6I)?8nb{MeI1x#ExD6 z*aCL6HN}os$Io|V>}c}yUBr$}`T6$1&zF1|e!kyvGtc>uxx>fccd_4z?e6%7YqVI}ycRoP zJZ*l$e7FyGzzZ(cEWNny6=a&v7WiqSEl{w&*aB@vT`x0#F>QfLBj@s3;rKyTn6|(Q z!xs24bNuVQw!lxkw!l}snC=ziX;WL^2I}_Zst|r>;rBKOhwJY=N&d;<{491}I#}OUdg>E)Dm&%h&=N++qui^x6U|47=X}o7e&s zW8e3*XW9a7URxlX>CA6rj&mhDpx6n8&v;Uoh%0g~`}p~q;<^ZMT{-qZ;o}o~;12A8 zG3qXGRT(y^)2wI9Twx0wiG9F!ViPQdH?cF=?qRT<@GkqXo!A5?!I3?HF>Bfc%T=cr z+sy^r6;g-b&sVXjy=P#%3bhDZp4bJ$!AN2k6l}MZzDTZV6Wd|;0^7~?V!M01cEJ&p zdw}g4z;%e2C9nZvGiWhrHehR^2!U^rO;R&u2U0Q;DP4Yz?rM@22wGBKb z^WL7+wH-WW+VNu8C%k{AUGF${K`9@{E-1%++<#z3>iZhrzi>mxcB8He@Tb^-dQg{O zUuiSSSi`=^yL^oGD(2+wW2{#h$9b+&&c}8W#k-Y#Zsz!@=*epOITl@+4!>ZjcPyoM zi)ge93U}!^c$Zxqlku33z1iR~^{(esdwG{@unSf{MP3Vor>`8Y#0W4+gjx#b5}v+N zu$K5+gtBikGC(-@!v9jv|BdQu?1JD3PXlA54jClJjxo;akX2#W1?8C71r44)#>unD ztcmT##{}MG#=zGc>m}_7PhY;GZ|8U_?HN3M*agQTGgeuG;a%Ry8flPPNjW4a7%n}B zHczl!fY|#ssuRI=)obl=DI-JM2gA7>4CitXoXf%RT?aD%5w7N7P3(eOIH#^t1pLg@ zgI#bt^=$LQcInhtEp|b!=}LdZcG=F0?R<8@KcF!64HPID~a@A4eY;O8Crv*(M0*GPq9OOD$MX-c#+sOYMRgV7tkUc0u7? z7Q3KeykBP*lswQ)Y=Yp(CN@FV%UiMuHn#`L_`4dezDsf4F1Y&OsblVQ2wb-sTb$s! z5^Q9Lu?ZS{$T!5o<2Qnw8YWlY66|@AnI>1?mGWs!!mg5k8Jpm0xcIvMF`k?nCa!zl z%e!oFI%98qf&GH(ia0MiC%#!ejf=Rh#Nh0^3{T%x+5^S@>9YrJZLF^ao<74Kc#)@X z*k$r*Ofl?$__r8#zzEOtUS2_ejy|yoV%v9{_CV7XSVwvIWpZkWJrFyfVGopXT)}gd zas|&=%Kr}TDNW`!3+v`;^~eE4k6?y|%jz__^%C-$nAG zH34l4U>$Y~K8laC z4*U3+Ky@=dih=>n_1!qud1G1UjbW>>4fVKLdwY{Lv)=fHU5l?4DfjrsV?1Y;EBXoA zD;}Ce{YmPvh0$6ZZC*Djm^Q?pg4`FZ!9G4l)^_4)LwqOV-Mhq>5RTuS)G2j+NRE4{ zZ!PPlk{`{k*wOJ}>_h*cOMUsvVrlEz+mg73d{wju&V;|&tn+c!W6y&tA0H!jHTZ#P zL(cmMe@Zjg8TEnhB%jq$@Lejruad`XF7;mv@9T%~I`5=?xn?K*kvtryjQ&Z^kKO8H zqm$St?MeIb?vIT%)DGDV4TOYV%`;2a;P^L5}S;dHJ8-|fPuQ*iMv`XjkG zWDV;y?a98=v?u%SK8~Ckb6EopX-|H$ zya>&=);k#=3R&m%`6)^sji0d9Eke(qVcb-+E-3Tw8pcmuMz~hZ`rs`cB$vi|bs|1J zzI^|Wqo$RUv{hR=p_6kvB6yWYGV}rEV3wZJlIZTqBV(JE=lwym}`^NdgR?HKE zioj`Qj)sW!zELB7RfM}}gH`@Z;G zjI0xxIntu=F*9v)7QZ}b0q(kXKAW6r7c+CAB{HT=n_L;b#YdF{uT3tyt55$9pqua^N(<3`fD6vZi=6!CN-)n%L+fFUf@_xz83c{v`jI$oq8h zQDeM?bO=?e1`g9i?p5J)=JP)|$UI{nK4vlpX>p$6wbzNi*e&?Y49171uFpu##T?4r zjqe8E-bcV5@@+i=jye=PLMyp8Ue%Z*bi@Bq#&9=q*Rf*O)UTJkXyKmv#cmwGh3B{m-B^lTD?`@po8#1PWxg)o=&j7xc_yBtw7>Pb76COT2(sJ9{` zS%+Y~)bt@1`6}P|6mPv#sQ10Th79s_2d|oK?LY^9T^w`n~cpe)?}XTKps5KyM?)J7q%1G*5PAV=(6Z%$s0e&lIWVmuWAW> zEGFk0|F=kaDSnqee@ND}eHgY{wdnq9+exf#XOYL(xWRw!;VLzTD(BBe~zvEVI!qtoSWi2=TP7h#PItXrgu*~!!edogT9V>W`>#Rztq6E0sDGBOfFwK#b z)S*O|_Od3rD#;a&zIUC#)^rj~Jl-m~!V_IjTLVj1u-(VIIL@4LrMJJhS6GpQGUHdhmGz`1}~y{5aVB>hqY#yPD=P zPxR(7Pjs1i%oAN^9&_&D4aVtm`nM9<=eFp`r%UpgA6&zjTFd+X1b?f~c*p->JZ-S( z|2*?^!n*}`pY_lCeUrsrn`Ti){anzc=*L;P+R5QL+Ue2R+S&WFv~v>%Xcwk#e0QDg z{$27;e=e|Yzc4j`{ec`0;=Ewaw`)Jn3enO#5771m%)Pxc@-U;PQ|pF2>=8w7PTudM zKhD`PpKSr#9Bj|I*q#rAV~&8!rvIgs`E)3`{gTPIw?}=Mc%F~%2~(F6-;>CBe;eme zTX9W>Ez})ji$PZ;xCOh%bKdowmtdR+_5%yrsWXA&l51CNnlF>TWW`+(>H_ka90co0 zj6@(lv>oC@ur-IMOaD@a+z%65C9x_A+|^%lw{qk3y-yEVNr_S?u9I^$GU8-S9_=a z;MqAl9=gE$VY`s+3Esm=-a{PnI35|?2ie*e89EbLoQG__ft)e@$rW=iHmRqk2dJ|- zZ-dR|p3S+hKN+QdPt3@D*sAiB*6x0`6wlxB6W%*b&fBiO_+&J(AmrPj&gs_HJU@S$X6`w~5W0|RUv8?Al- z4#?&DL$Ttk6s7KGOdeqzJ%KFgQL&+Tsx{JGzTQdxUxI z9`^5Le<|nu0B+u73wHkiX8!5PKy^3xa5i&-BfN{*%m-ed6~i-W?fC)xd*;a?^>ysL zyTG`+co(l@>;3%67}gM4ds;Im?KdkzO=O;x+p9_y54IAokae0qV21 z5YJw00GpZrFQ!dW)Cta ze}>qxgFo#mj`{ifV*8I@7i&t0C;i8b#V5a{3Q}K#`c=rOnqm{ga1;jio2x!H1 zZ9Fegew!GH#Q_d%7;QZA9Z4P!dteaplx;i?%5@nQtur^sN%d6@FOTr0NM zr#NTtbn?UT&T_cEeRQ0muIEYsBR&YKI(E?4Hfo2A-l%LD=Cp zDpJR{>bKL0^~4sx7dwHRCvgCMz_S~b1a}&E))LGdRGup~-!F*UlV@!w#*WwlV_iaQ zE^g*>L+MX?uXtnKs!--EV8k5yy8^#f;`7`quxAr%<#~{~vy>lX-uzX9VDUgtA@z<0 zlZl_Qyt`0hD#j60kpXVg^Ru;4N-Ni6N|Nh(Yq;xRr!4IZ?<21`I`1KV(G zcxegS_sd7Qiuks_EWgdAm*=>WD(-eoVr&ojdHRlWu*e9;onVrOz%IS4F|OjRH@out z1*-L1N4h@SI?VMH=M@bMRAaxfYVmt*TH>Mr&Gvqv7WrY2*48%R^{h6D!@5$3&&L}7 zW|yq5gwrN-f>N0qJ;!mo{3rG$pFTOdDjGH&m))-Dn>kjc*h?pIe(hSP#`UE#Z(`0? zI+=OaQ7{|0ytEz9Pp%ovPwGHFxuV|;)*P$tS_tD^Nl6;^+zeL81w-U$V22{X5$7g+#(oROt(<2AI|OJy+AKwukP z*Jq~Loh7LY_6Nb=9SgP>Z2ULg@mb!n-6j~@;aUV%P77OiW0#&e8n%^E60ZM` zwvqN>^o4ueKaBNlc@Cw-ySPr#*LR<{o>ju;-sor_pearZ@k22N{$0OJA=h5qs!D!> zoyP9B6n&9pDVon#%8NSYYGHiGo%uc6*11}m66AU-AVJ-y2o`STdhqs}HFOeKx0S2FYAelS`#9~OQ%e`{f1Fj(#z$DR z2d=?x0p_g-^R5B&z5wRkZjE-8SQYwWqb~v4Bc6fU8cUdK8}H%K`Gd4HYpBc0w~#l? zsXw4NTvM|GwQ-Iht(@;lzM~%H!(8QTqr5R*k9y}_sXtBMA$Y!!c?a|1(y*RJyg2Wm z6=N;3G@mW;@Wyk-MpP=#{eeFQYY%s~YZJSKFm7@fKiQ0WvZ%-q*5y{NLFoAJ(1cgodIX5<=v9EJGi9`BK>SNG1k*?J zn2@U<%+J-^a_rF5T>bF$T>UzZ^*~2-LRTCmhD&0?s`}*WmHl(|M6hHlFy$HibI;}F z>Ob9|s}Dkk-h#|rjJ;`6dXVbE-ZT`va0>hCYSu!Bfgc*MfgfYN@R&0|jbW_>n=bjO zH>kab+a#x<=L9}s=|-Mx;UI`WUWc&_W$W-vLO123r-mYXharbeU-K}}5m&S}6g|G0 zT;0Ra>Bq2V9dia!e*oviQ2&?IFR>Xh)Gx6bG45jO8q8Yq3%)fUbcL+dPDXc#&F5i@ z-8}?5f-lGWP;3ch9Ixlz>ideVkTq)VuaG*=PKeTCzy@YpU(uHM0n2&;{pGxA;63ac z*gmKaeS^$%A6=>FL$LA7`d}&dHw+s;HZ=Mp_l3QI{$N+|yl?c6^>OTdJ+p(@7vqV+ z?k83WZXPtoanhcWLzkCM)JaoO?F}j zMa|%RpS^z&_Ws&4R=xVXRj>Nls-L_mS3i-ROMY3#-$=$ITmsv%sjSDI(gocwvB_P~ z`GY&hs?*>WAjZgZdPuHbhOOxZ##|K7M(j_E7<-$E?HUeNJ2Nm>uNs}J*Nn;4k8SV9ls+o`d6wo`xCZ2BtsL@JWcm z*4dZ#AH#MXXN&VZfz7#ZUTgJJ=7q0JaHwmDYg}>@IS;2R`fIeY_ffmLkYk(v;82%v zto+8-Z0(Y((fvMihmV*?Hn0v61)hBj8@BmB(Q|5sQ~!wd6SLgLa~*9zft~Fmuy0@5 zo{5bvk$Fuk`t=cgZbhG@{0j9+IoKAA&u?qBgm|=5)1CSe=8Zm|-(%pIPSo`nJ|FCN zUq@X};A=wNoya3A!goiO1r$W!zu;6La`dtGgb9^qN|9+`3U z!5~%gv95k7P_4tBe_rI(lpwVZyL*4;H)AFTsF}=BhEC&nABWbJ`Nyq2`QDK+4am(S z$hDr#f39Or)0H_%T^~gk|C6J=!!_|qshc3aB46S=9>6>P3SNsq;<>(3YsUzOL7-Zj zt?1q8S6BMlf%DpOp5)N3#=dXlT+ugN$OA7-^=mS{po(Eeqppz|A9G|*iXezw}Kci(DWqlwY|1RNEkpDheo$vM06?xbg z+eQ6X%)8jerq{N!=~bO<`hIM}o#C8GCwFaa?~%lJUG(KRNSdJb9d@GO8FL~~d&_{W`P4j5`>NEX0B+hCu?^1MS1M3~O|K$l+&Z*tordRi| z88Kcp{TV|?;))cmtpXp$OD=7$-)DO^4cm^V;R=>(E~rlzXy$L@?fw9KEtO2aFevukKb= z7mODJ#)}k;2R{+(;+N#o2IIxv7Kj}+P(8aQsxg=L4CKra@_Z+P^&Hq2&SJ}ZBG0BW z=fQ@U0IrK?8^<=5Z46t%VC2B&TNwrBx&sU*wmI>yJ@$`i?Ibc!I08-~^BzaO#orT1 z{61}pZ4aG!7McA-p2+Y-&tHuk)Z#;X`CQtgurYu;-6OF%2o`HOmv(~t46=L1{ekNF z0?DPF=sAl_miGQe8!zHR`w4A`Z^Yx+WW_h*F>JCvf8A=Z-blE1e0~>qz`1j|T-xG` zB0julkoTg8_YaKJzVqJ440M~=93Mx|`QrC=@ZKoaqkXxwB?q>j(*CPtJ~4{ zVd(xnVBPg#+{eM~k}vylF#Mf&3EsmO=6sI+J=_U>unpl??fx3>gg)4WM*p`sa%m@c z&Ya27tAca&3!z{}&P!#i79x}OHOr;_D96P1-f4D-0Y&sts> z?F%k`pY^;*`e5eLHuG(F`paH&X{Ycl{D6;AYqhq2gq8~Dl+$8YyU*E6E^Us10|$2_ z-*%H++9}92v5QMCZC_q(a%qF@{Bvoq5w00*qT*BgJ{UI|yQt|?YhmBTT-v?nq!?wH z52S;`sx9Qw2HW}Mjp)QO#_D_6LL&{VFL_|83#{++sTJKD1@@Bi3p{@*zreeYa!>H5 zlxxrzg~-@4>JxqW9yYy5=5M0I*I>(wVm@cq*EBcx3p_)!KC}Mjxw<7z|7+y7f$gYQ z>>-!r()PvfFTbW}9{4UF-75Okx6bIZm(+Y_)ocI3{9%Jt-vUR?*KpHhAd?1n3&%$x zTnz<>$ow!ATq3@pq3oNCJdkG;!FiLB5oNthKinmLxwKzsmP>mw@=30#2H#C&K6*=g zo9UwqzH@Nw1N<-yA6@WVG{@h>XT$K(9WA(PBRp|I_~_#EYXz%O4rwj^wsvg-bI)5+ z0@P~o)lBTjw>&^ReeYmRa%KDH($-S(`CSOdYdVE%4*o||M-<0`xIU5N z8aS~!BTUo4g4H9LTciKn=&2Rp$dAB?2Cf758MqFd=bHz5E&ovs1IEJx*KN#^1FyeAB;ue*q(| z1S5WuqyO|7WBIBuVrxH)XyU&qV57@pL=#7L0viUWfd9aXpi1 z+Ev5$fKKZHj=P8veR%P=U_`MYMiYlG7%}BHW5nhdt|u7uw_wC=UW~X6jNK9j{Z$yT zUDTB^Vm^9#Dl&HZZ^wugei(7v|HT+_y%!^H03)sk8~y-BT;Rosuk!x_81XqUqS*Ze zBfjQ`5ub045vL1A-20!55nKP;F{0~V!H9Dhiv`HJg}-CO|C{Z8rp+(%B1UAMdqs>` zjQm>a#fU27=SWl|MvRwy-CTds=9kvg=GO;2*WVA%-GmOz_QP{Cz;m;_cy11OuAl`x zHxN8GBu8)MwfUVDo8NTs+|;YXbG0sFn^;eXzb63OjZLi~p0y7$WXAnAwTg9Ju><~R z+57r17Zw{?ALhj~?iX8M0`-eMPHbIbTb6ivvBybll&rnRdj8DXr`YTLZG94(FZMr) zt$K_(dmM2Yh7FIoxY+dcsZm-V=G$glrv1;f^Pgm$k6>F6d*2J-vtv#$ z7;E0O*m6F=<`+soGT<=!z-#l9*!Lpv+wq(fd>c$W*OPJtcEWn>Jr`|$CZ6jlcy2%n z+=+HDobb#j@Ma30lmEf2l?t9?4T?Vf>o&jtGw|FzSmy8Z=gFI~aUj)zPHM99)Tf4l?FXXZ|zsX|rV@>xFT))}5afWw-?wP@ z!~VDmyI)H-znV@C_&TvQwqWx!@Eq&Tm*BZ z@tm=iJM!XMuEgRuvHO8T8|{AJQS(1`KWvZwc0YyjnZ_8b>J*NhWJ%^CFrFJ3D0UiI z{}EfYj8U;yi?7HaI2y$l_hI~4LfLj^ThoK_*&F%ShaYnj1>4UR*LVk-YrI|m*uokw zaY6oTypfr|eT`S*_5Ig)Bl(=GQ6OwA)RHzSQRTNtRw+ znq}Jj#75ZM<~QLQ^V*fyG`0EtlWPo{Uz>|Iza!cD@!IT*>%tA#6HjDcTo>*HM$GVH z#2#S8-YsCnGue9O`E0m3!{O#M*M-lv%OM_A^!|F)@eAw1{uptF7bDI9BQE_F7%`SL z;kc_=6ZT@n8DPYv{{lvg@va98MvT1zMm#?~N}J)uh%;E9S$aP)0>)bFl`&$B-+FM| zW!8gz81ZrR#>-xeIO7T!QPzTE{nmoxudo*UZ^wwlf7KBGRYm;Q$)B_J6E@}&kzmA_ z9Af<~>KN=SS=d*aW5kzz7%}u0Fk&zmF#(L2{GWpnU49sG33%1Sh`YgvNq!h{HyDxF z>=rR1>yHDHu7DAfu80v|@LLxyy6n2JKSoTtqRnrK-@5P%msuCS)aI9TS)1Pyzjfgk zF0(G&+~#+icis6m@4B{ua8>-$y70eh z^IMDz`+$5x#=0;Vu?SiACi#bqb>V*#Mts)0E^P2Qff0+4Z!aM0oOnB#UHm@>M!Xf9-#ITvyvNVxH>|nMFJEkayRU5X`$deH z(rjJ$-+>VmFOLydIt+|B=wHEz|73g~K>i)!$9(5^jQGFT2k^fnMm&N1IwNuKV8rt> zRze#wV!Y%8XWU%0`K2_q`7H&{seX9w4e;D@FP^Kw&+pr8{otN#a}D>O+4|uF*_W>2 zt_07yFXB1j!sd5^_*_kp`k5Yz4R?>j}DcT4_#m*P2c^B8ze zasgfH+b4XS!dvC@?K_Rn(e*Zb`|u}x#qjNudl%onR-XNvBDGHqo1f(C*>3Fn9vh?N z=J~!wo1f(7`4u+53E;VW#^_Y=+#2xQ+HC#&KeFKgV+^9_Q^0dp@LZwS=2z&o`8|g2 zUyaT0)MwfHr`YSRXYD8y|G!oE?saB8X;7N@=i5D}KVi&m%GQ4>&4#nn^zjp$-#R}Z zzpJwO%~JFc^e5ko=SI-})J8n_9e6I$56^uEo+C#OcEU?-e&B`yiC4gLaGCjRezThT z`3T~odIYdCdHYs6osAD++8?@~NRF4h+O{Dx82 zRD3PP&u=(&O~dxulAm95JQwA~b5Z{ao?C9eGM<}-zMO+Rg!^I(9A;m`Y3A?e_n)2< zoN@9jvZ~R~k1;R_88!mkY~VSt)uSADf}IUK2d28L&Cea8Ed+-dety{AgfrOi^IIFN z6}DjWTY@ZGh>UrSZ(sZXYgUHi4~We#U)ubV_Yt5zL>&^#ehb@bu;pO>52Zgt=wmMD z+`~EI=U21RYxCH!<+s z9KX1ZwG!8{6OPU}I7Q;rgPX+WXL4sgM;yYT4SsPQ1;4@OSI|;i$4)pp{quzrKVsPY zb`sYSM_dPa5}fha{B{!45!WoHL*g!cIeX|k@fj_~bgaDEm<}_JgIFm~3I4ifeJ#Xv zxUVjzqud+QQQjESA$3N$FN^2a{&Gx5g*T?70>4=q+iScr9c!A!bo^?YAKW zk{WG(bpx~YqeD!LDEY?s4bRs1kIXjnjV~nM_`+=clq*{oUiZ^W(C5Y3x&=OuT*^1I z70&mAqqFq`W3q`Qu&aM%-?0L4=bUWa4hK#M{5O)<5#G5*WxkL-UQ4jJQI zVrQ`r_~jX|F!PLq<@SMV?Zg2ImxK5uJBS6spS>~HxZ9ie`%GS#R!iR{-mI4U4u$hV zWS$$2Guh{c;3q{2AA?W@%i{dZi&ldCpQU z^|o8fJ(z9oq0MBYUOCUmW4>I`tH6Cy@4=<$1pL9pZ@LBy7>a+mSwB4W(m(D?%9ZFg z$q8n*VYZp?%{89iJlDAD%{BgpqMy4T9GI7l?-g^8>5Mbt1SQvaDs?%~;nHqf?!kdB zAKW>qG1vIX{A_Z9Tht!jT;r1OtFwQu@d;qT8QFTxtZcn`uJOMTqx4;#aC#;|0E4<4JzG#&;XJ##68*pZSkyzg*++#r2O?>(Rr1 z^5z=vPF<2~yglcZL`So2IoEg)Hfb~0c!K9JGP*I>IPIIc#*>K2jPd3g-%ZTY4&f;A zB=F4Oe{v@fYboVEMy~M$Z?5rZGuJqJut~0Q`X})p-Kp(a5muwGPSzVR`ff4-ffkKvku92?BBOn9***LY8OvW_P>_3p%5U)VH2 z>qR`e5kE^j z$K~>kC%DUqT{Gi3{PK+lORTOp-#8deWRGzDima*ub2jE1PrgN~1LJ}FJax%(9=;X5 zz4%aKLfZNMM_rn098C5sTn2Ru*>(^v1@ik4OLr<^D0#+-(KcegcB}7W$L~c9w!~i@ zAqV+!gM*Sh2E^VTzgc40qdmgq7!8+~@Rv5`8h82U8aH#3lMCE)8~FX;{X9?N5Doq< zaQ($xq;TX-oT)y$;&L53@8fyO*WaHixMPsMLbAqRP9+G{cA_(-lF z4K^KPV$-T4K^JkUI7;>5oB7JKOAG$ne`9|B?u!&9!oHZo+$#Pq)DflAR$ zKPty7fBJcp#IxM;m%ICQ=G;MlY1Oah6Q_QEG+a*PId_uhJe{^BU(iJIoY#U~oa8w- z%H%nBlH=TopG7stQ=eOyS=%W_tA^XAYo(juOdle*dkCZvBH2v#(tcSiGlk&-DQl z{t0o?a8y^FApZ1BuKor4YtF-A@^h~KCHs$U$kmT*%GG1Rb4g&hx(0YiYIF71;gBeX zQzDP^$8+9+&^S%}5$_lk4gY+!`U(7u-`?whSI?pL!~XZm10nFRg{TF@YG+5<4Ijgo ziQ(P}|A_b-F1Om)CcEKKVw=b|0p5*uYCLT$g)jZD@TUuBp7;`e@>Hq1@!n8$QK;I7 zc9zmkU)p&E+vMF7q@7ZA!Q@a?g=2EeR0n)~rRqJiLfM8;M{D<=s26?_Pe1CGIuog1 z>P?`HudIRYm*FaebJFt?e1&PWkyo~(csbwh({NR8gwNv?w#CuXH|&*nQ3rLo`%wpV zd;UZnE2txmI)o!pa(%wVcl|UxZty~RUWVW8MR@5pmTf48Ps;re^^Bzs;n92C7VjQI zJtNFI;7h51qbSnob8D`T;Mx^DpI6X(odP4X;& z+i?Z;u7HbAY-QWvRuQ{cBr)8QV^DZw$P3Okh;1NSd_ds07rv5u_$h?zxBOPCTEVwB zrEHjM8{6(|8)gLR$7TiU^>YG=rOMS0RWOEjz`^t_<7rQ>e(ayQdcy(6+L2s+Ie2|7 z_o_-C&Sgxv6ufqJIk1Zt#^d0cal%@^gWU4-S|c54@IbVVfQ^VKAbJwm9|9p z%e?c?u(#7M_%2&}^57@3!PB_|{-Ai;IXiunmRPa3I1j#=zWB09o&#fy(QbcYTjhSv zgJT#Q?(^Up^ZtYnQg|I(c|Kwuh<)81&$(8c)srZ7z<;?G+x~Uvh%DYGoITXNk!y(6 z$0v?hdiPoEWm5i*x~2RbbxZj!Y}Zm2KiCAhp0T_P9eEwPY!`i#u^dEQ*Alb6QHk}O z#CMPN19zq2&zLr>ZOU82P9fXgoIfv9XM2b^;IF{l8)^3$cv(NBot3otCGEe2{*m!0 z<8l|AobX6`zEXnWh>Z2DAa8?=aVO*JP2~A}_#z)-d}WanBZq6o!`YWD+wv^eL06!D zU`ZhJNVfPB9z_3s#dagxC%L9AbHz@~8&8hDLn{Uct{oP|Hx;EmhAen#lmq$WK>ln& z{)8ZZLR7e8-LcH?uf5H#!cFXnVZMKa{$#<`BfLO&@XhQehr~*JrG-o4TI5n3ZN$@t zd`mogI1i91qe9h>Xk#aB#8dzEaMt={Q3Ct>Acqn;FKsL`1GxbwocjU3dC9GjNBs+E zFNXfe|K7-|BW3H07bx+bYmrNNJf~pVm1lH>yd1IggY_KVM;LvLb)SS&S8{2H%sT`} z<3q@&VCr4Lb)ArNGQaALd|H595&q6V>J(YEg0^C4YXbbaC$N)9`2_RKBMN+2)Gg&5 z)GcL&y5Ce3H+;^X4#><5`zrII~zJa6^xKt@Jy!Yxk|>Szm7Y^9PXli+wG^{$T85U-*z|Zw;1rV zAdW$E)9@&p!Po&qwv@ zw_V5);U4$tH@O#iZtzu;izU{>x8*K2{P}(QP4t=Qw*;?#lewTzzs0ny-|jZ`+k5|_ zep`!P`v|?Zi><^Th<^Jk`mGt#9pQ4m7yTwYzW1Wv zQl^WpOY!VQzsbJ6=(h|1A-XQb^Avh#Jo`kywe{+^6t8|W_-bjh9eM`dXwPi)*+=NN zA86+%+F4I|Kl*Jn`Yqx9NPN`F;lhnT&uvu`Cxo+&H27=Gg$xpG5wYO8O zYw!2wD>(@#cBL(L)oIq+eZ0o|RLSudPmVt`r-^ah8*)6>;6bit?RSf!eE2SFly=r5 zS$Etn>wf|I&k5t_f7h?2HNO+I>&uy9)JOi5lSV(xI!_q=h*@>Y=!e;^*^fB-VV-lb zA7<{AmU7$;kQ{fx&LZ-ETveXCK`HYcg97YBWIdF8dB*yvGIwsK3?Z6vf36>ssuPo9OSQQ8|Ey@U|UBnj|HrW zI#b@BGLE0*v>9yax|lWF#n`4-ImmD0Se>PXeVDC9ko%^`x-6|%VYb$u|A)ACu%*M| z220@L8qUqD)tz_a1_&Kb?CB@!mr^_YmT}2RrqrFD7^1Vr=xQBo9$)*w>j|_F0NTENz-R z_gbF2g*-wbJnwb^>u&7I_NXm%)!RJx)Rco$=B2znY+TBCe>eU=;2keA z)-JZYD6`O#vDj@1m9eubl;;r|sN9~<_{(Sf-8N@r|HA z2b+z-5=)Q8*rpeg=X6!L-*X5zo3&-a{rJUqKjJss`<*4-pJ<`YU%dBG zzwX{cnt%6U&F=l~lJ0M|(2rld_d9>Xy^ksBzPW`qfAQY${#EyGxBTIDJ2KCX%(El& zGL*<7@)sL2FU*j6_my-zMvh+MD@6u3%3toiiTw5Z=EIPASwVw-V6V7n6@^RU!X-@*iKyRgU+AwGzs=DfY$WAY4^0 z$M_E~>8kL**|i4B_<=6Q&wrI2{ovDWq1<0>48HckN=Ycs$f7t)DhuYbPF;X+m!ezd zW|f3;AC(2@DDvtF$4ZGe_m3~Xo86lOD3Y9d!pCwOIrVC6j?$X+D0L0F^%}^nN4{ED z19|l7EMcWbE#ak-o4U$kFRjf8*6RA$wfc4;T9p?giLNGRbV*GNedC$?be{3dcvtDj zdVE$FvtECRp59-uKJ!4qhRm8yO|NY(qnp&>eP1Em=l&&GB{lfGUeYdOwaGPp`YD8W zwZC8!?QYJj8Sc~r8plXe9i7fQ7-YPI5aS*A@*!R^UtNKNTy@GS`~m+beu1|;$W=Gk zBICfRuOe4ns&c7+U>3fCsbC$SZ{PrY1I2G}$i#>74-7H<1D|c;AK1As-%L>(uYX_? z?Yukv?!Nd0hrT<#Ro^++FkbKt9BWlduIJb(@cGB&JRCdUQgWXEk4Fab|7r5!J(GEX z^4uj0GpjZP6eZvjIClP`%tZVGTj3A*A$^!LOws30I^B2Q0rIDK^Mvo?-2Fz`#O{@p z_fgM&TY{Ne#mJ$UNV%1_oJ>x|R*lEa^HV4%8pk&~l%jirmFRz-Q;wfz{1jaHc~oN# zzw^YhWCs_e1}Y_Q202UKy@p(Uk@$1YDADw-D?$vVf+o^4HhjGrIIp=YXSNFb0tHx*jLW5mX z@jG}8p976!@5-^|!P=kjF=#y#KZW6nejWY_1;n3ZM=I*G#Hj=kkMT|-@gT%kyo4Xs zYxq#?#fO45dC%+kKj5d~X5HQME_qWPvIQAF+*SD7Z^2JIo3?JIt(T}@rQVH-_$$VF zUc#5`j?v-dQzoa3b0n?S$F^ZiE#C4_J0+x;2*G6-8Cs(Jv|a`GWxKQ zT+2zs`10ILTShzhOGq9f$#1;?zl$i=(q;W!&UuD9 z9>bS1nK~qYa}sq(Ugu1FRwQ<#BR(tmC6c?WLVZDra_4Y;4L-m>Ifze~oj8^V+7b@45Vm&m2-kP|gI0Ay z(GMovsU03OT05S7m)6k#ZeuJhV|*=VY<g>jMCleovKjBkR!*^2K!$};4 zU7aZ7ioEPq_&;nWx9(5)I-J2*_fIneBu_ATnxpVtf`C6D3HamVOLH4lG|A(0V$E4)+Uda@%O>XZ0%yo%3^-NG2fr{fOB zJALwG;Y%bwfVIRL5VPQs*o4Q(L4iMK*ax`Eg<)AuCF@L#;1 z7`2V~(w)YCQT$6JH?80J*E4R!$6oYp zUfDN({)=%Q@&6Uyyt(+Ujm3YlfHC_Z<1X*6K=lEx$tue>{1@$8@$*>HMym?Or=7kW zz+du9wqLOozr~K?xA^TqZ6SV(D_fg>i;|D;u~CY8C%#s%KJ|r4aEYouWik9KtJd7C z#qv%4)Z3|lGcr`&PfSBF-xv34_%DhKx&vR|_4on4gHKc^e8H~8|H|KgaV5Tgcfe_u zH!56x30e3NZN-xdan~3N?QK<8JRGhj(TCmnijfnm8u`9wYPdQGE;M;>2atUWk)3vU zNJS2HBA=rC?}Uuoh!10);ln8Vf_NABKJuLKCB=uaRD3TDA4VyQ43(Gbai|h$NK8hS#VE9IUp&mvq9O2%je1vDRQ3>{J!pBg`o2XmL zk~c@>y_>$g&T3SLqVxLf!HXyAdNLagT%Xdp^d!ypIp#QJx1_)3cTOBRRg6 z`lb9Fv4XY44Hp`*g5-ijUJ5rt8k~9KkV6vRlTMzr!Hj`?#zT5~s4B4wwT!v3(Q|K< zu{24>l-K8DF!D+ERmTvwK&(X#u@>UTI2Ql^CVH{cD6KkMF*xlGd3ECfK@}BR+pZ*@{A9{QYeH8!8 z6m%GMd*aYz;_Lr7b!=dKKSUkxqZg}))q0v|D86s6^E^ctF5sO<;cNIdbuFVFb9}dU z-$#GMSD$)3@x(Yqq7S9twcv%vs3V{2SD@Fc_;w|a>LSYZ$XdzmDS9!_s~6?oWb7N? z2s&p4-w1v3`tENq^7Xorg`ykt4P6+`R&=A4t>lXgWZTB$(~S@F9Aqro`-Q4LUQeG+ zti6IxbfXKGp$j*#{l=>kccK$-KqqFRqte;mnf+Ca%ReD6TciIvBfl3hE}r7q+&e9T zann>Ee*R>XxsPXK=t!Q^>*zz{Jf5ZOt77a9LZ4Le?wk8F`gGxJzR#>DEb4xA-fYIj z>rY0gPa-SlPhuZq@k#WcXHum4XW=uv9e)ydJeD~u>SO3Y!FhHI5q7Pep^7-!F z@Ft%^Plu69qw4}9OEU(j1T)2r2iqinIn0$5b>V-)>&j`xh7@+2AhueA7K z@J&1Pm+Q^+Cl-S^jh;YvTd98* z=Zo&^fbKgoa-eqjscq^rNm1l|jZ$ODEBxmX4q`pUZy%rQyA+8W{)lk( z&&a$NZ*w3c*Qq;4E3~&&U4V?bo<8gvgO4@m?amJ;KWw;K#rrB%LOl;5A4RX_!?P~B zO8$35hOI#FXx$Ty@|-a<;al^$WqaJ zMP;R4y(ew?^q$XmUvh!M@y)Zqj^L@Fe#!k=PW^BQc)C9oMwvL-r^+akw-OnM9o^7- zk{{dDdu4{+ONSppbY2}}ZLUw}8DruWm&m!x>Abnkbl$#!qcjUK#Ro!1Y5~L^AL}$m z>j57?O^>I-qch0liP_~?$3BUPn`E6#^4vcOPQZO z!@Fw$ugF;2L_Nqjayv_`eXM5`^%xk9{%)lIH_&I%ACcbi6vP-yE8A0?Y_Yh{GY?#Z z9(#*=H`C73=(Td{WgX1(Aob-LbtN$mHRpN43*U*hQ;qLIa31qQc+SZ4?K#Ic`x5aI zuM#&Q_1hUk_2{Tb+G*h3ZRQ)XZ>=cq&huMh#G#3QelULeR<;s{W@8)Z*$g*@=!GiI z7rk(N>YZAZYqVCCpy&rq+@%Tjjzrek!PQP;)&~%e{x;?JDA&g*`ZMTviLZM`^nI&n z;&y}hhHS>Z!`xF)E1R+JM~Zp~c^?=TtX3j}?19LiVD6o7vN9AN9^Q$dzeQfB6<~bcvs+?{9;Cji1gCy8 z_ySqxeuz4UfiudvpJ(PI8~dJ_vj;8)-XZrS=N#vLh+*`60H?qQ#3!wQV}KY&Pg+?; z@%6-`$T*X+a=ai%>&~|u(bvWp2}1|jjCjmk+| zi^LhljtJrYW63eUvADYu;g)YUm*an?y{Eymqd4bD+7mqTDsvZbCGVunlxyI5(Va!a z|G&unQV(^0O`Wt=Rt`5ptVd#1dx24MIsRwrHS7GE*t#tSui#7AI;4)5uyuelcs|kw zEtH2`+dv+~~h& z;nI+JvKsD*^>lYF_al5ZZgd{!x!veIDZ7X#lXC6!L7L!~x(&Hn;nr=%u5OB2g-s%i zeKM}Xx9%!l-Ahrof>+WR7wN>vr(dUFUv&PckQ3xspMjd>%M=?`2{=aTiYmX=CHrdo z{6RZ*LeVRk?|s3!K3sKFaMiqdnPNkc^Q-t?1V80_?f8O+j6SU~F_FZv3;({vxW9#t zl=N=hUOD4zBOAIMf=tswe*o`7di$p*;hs-$DIdy!AWq zIp|{6-!q8%9r%TGG5u6zZ4BRz!L08MW_@ok&!x$8n1_$Vyv>u3Z_P;j zI`Ua-!$-h)7XIsBZSgJWIXT<={kl6A4R^YDk5w>2||=il`)C%HwvzC5fK z6hQ|Yk{;jlEXh07X~6K3 zUX}rRuPq}=+NBTB)5e7q^&T;*r2U8idWQj_Mb~|QXGzDI1N1)Q?k?&5)&RXzT6j^v z>M*jCB+||*k@3NZXD>dc3;rmj``;~DZJ}>fYvbbh!$})UxmQ7K39%ap+ z2R<6jpNIHJ$@5s&!nl4fTKJdDHpN#;#;c5L|92^Uolm><-t*p+w(-$%rYsw_&g-LN zT<6!%WzS`m$ouoXyVZ2LG*w@TLEERMmK>$9)zeY9z5O}q55oA(*HTj;CR`)mu0 zwwD|IRCu=GJloWi1I9CL@(ug-S)OewZ48ih=<8&@m8N6u3f~I;XU%0sH=eolw@G`K zdA8}_575U-yWZzIx3%f}^qk@+Z~XcyzEA$ow<}|#rRVFwcj1?w?VGgwg|tmyxB9o& ztgp-P*OGhmf3|Ppzg2?lyP9Xak2WlAyw4Vy<^OD(`x*Ry?7ew-R7KkVeY!hKXXzzo zCkTOnBy0hrLMv(~0TRN#yUl>25(u&kDk@eYzVWqN6^~ICK4;{^MMys!pBSPMxan{k`w1Y6{sH zh;83t+V*_iaa*Wu*P*j6LwBu@2c60rFFJVUn_Kv%W3UU$mV85P>+BwCTVwFu8nF|g zZN+9UJk}o1l`+;#+PS)2!0|!Oz#s5e;OD%p8hLhtHjl?c+aTr*oU^g*pxibHyZ4Y=*bSnLFCHP&GUcRl`m{PN67n_B-;M zpS3+m7yMas40j>!e2sViVsu-Lebz3(FYo5#-iTXI_b(>*??`uF=$V!FwhkNNwhtfa zHqef643w=u?QN|QTg?vK?1fn)?OTIC!6?rXXyZiMzdvn^-KDfE{yeQeHW=vtY2#1E z7l987-KS>MZrN#?ap23 z+~@2{ErgoqQ%s^fkIx|jXB1h!F{l%JM(S4?SL>F=={PQ0t z+Sn&e;?=WvgcZFm7i+4){OpCZa?%j?)GE3uSq;|r*h=yYh6lSDKKbcr_OpOfK1mwK zcz-P;old6XPeLu z^abb39<^>Q-qVciJ0AZrbd2?sXB~1C^96Scd$8HKclWMChw@lqva$>K})<3|ydTHM-)cq=C?i1u^RN=dJ7we^mG(`oZN> zSies{xB=e!zH+O&5guCht`WKTJ-+S9x%3&n?G@-NWWR_Z)M>~~b|rh;O{CnjhVyNy z$18k~clj39eXmwOkLq{_KIx zH%<4RK$kUEkGsEm1K;YIt7&uoLz8`^TjM``miB&*_Wp?bKSJ$(H*%ny+xSb`_*b;G zH&pK|!n+dw0o-{VXJ>qXuK0`lqSSln@t4yEe}&t>gEm<|MEHJmYj98PS7_{+!k$L( zPwYwK*+KnI-X!hC{xt0WJ!D3*%7p*TU|(?AH)99kTlud}@y)jyGCcpqe|Bo7iT;kh z#boo|!#;7poW-6B>>u|c`{$iv@64@~vHh|rwT<%rjdxF@bKl2%+paOG8n{jiJaayI zxv6_Qa-zt2BD)EPBD$FcT*qG2+@88AuE&rGMV7mRFc(*U+U#aH@6p^h))l&r)3+t8 z2j#sVSzqMV8q#mc)zl{H@d{;mCLSJ~vfM@)Zl^r2!?zcsXLuW3K_lO3*50?PXE83M z!Py*Oub-jlc7t;2JJt8YEfm53X0tC#nHKMjgX1mZe<|bJZlY{u7bmNmC|CU6GFOvH z3+zI_XuyA@ZiH*)>Bat1=8b2VFAg(bz?u7sv;>#fr)p-iT7}J6tI1N+#2iwjnOz2> z!PkR(2IX^*#=|Ria`uYG{-w$Atwv;OEr5>I6AKTRCmbOE#Xl-D)Cb7_x%?|1RlWnS zCTG*ccn487*$ZeX<(f)bvabvFb-qu@Yq%lJ^>f~RgMB35;9P}Y^KLEsPuALGe_NBc z9UkQmytA2ia*QV5ZCaXZGx6_+dm79B`hOz+61b;>KV^Sd`p3!2ca`}knS{MVSO)yZ zyUIT|6Atfv`1~yLc}Km`FM~Zg-c|KCW~yIvme<{s`vCvjuQ}W6AbVsUt;|%f!^<{t zp6j3Jo3cO9pXjf0zQY0X6~E|^uBfZ47I&V^%Y5rOytf)1jd1U)(K)fV5Amf9(mZqd zUYp@>sgq|jd~O+an?-wye->?BXJ(!pIOD2 z(2Klgp@+{VA17SjGjO1c6_j-s+@_S(pzm3DGxZX#(*SQ$2tV`;-=>joBiz2^;e;E> zMmJ<8uXyZo1V@`0i{>+Tnd7X%GY0pTx-{bJXAG{!mIf|cZ2rsP-{-)+f7IRSeuHuG zNP3}r757724a?qACdRxx3wlDvJ(&xO;i;*Urx=c!Hup9zlXF;2p5n?~w5#ULhL19{ z=Swzxl=z*p*CYO1+IbZD$ljsFaC*|d#qfF3-x}e%#oq`=FaFh}DgM>uFa8|T5Py!I zhskTI+bQ3T_uo`S%ooxIxqQ1k(j7%V=t;UV=E~kx@~y-BN3JFx@vkNy*k&WoqT1~bZ30qBGdOY^X68~m+T=8#) zYZkwW{k?4L`DLeXOhC`AmzngRrah0r&2ObW@6asXMR38#m`~=zN6TKdkD$W?%X!w3 z7y2K@))>Va2KIk`O<9F&gNJ*b=LYyKNmFz~<+O#Fa|9FUBjy3g`kB0)^+0(co7bj( zQSN4Rw}%r}>Sw1mnAQvvTZo3$4-PYe%ZfA&n?(aQjRxITaLwl{{Po~~IoKV=b7oTl z=Qpk6{Mz*^x~hSM?PLE~>|j0n*jE;tSZ_Y(KZ#B&e;M%@_s4_FDj4%^#4B5ttXkj} zZNzP*4*ARE|6=d%&sO;Jmc6Uy@Nc{L*LA*;J-F9VH?XI7FKLSXM0%brFH;KQYkaLwQ+yEh-KC3_#qTqgF!!aaub%Y(zu zyF6L-Cu|gUD1EuNUpw3l{&I;8ar?C++^q3%&Ec8MgFY_ubhTr*AmL?jn)1!`|D5kD z^2r>TXZY`%(D&3ZzqByFu*a8ct^O`{$}*=g4#+-VQjRj_q1+zvO7wS)38I_MfeXzU z*Jyfu*vtnSkhc%x-aYK*2M*2efxF=$)7DKUxN~+1LcC#n*78+O8myv zS8p;!?LSmIOfUDJXDrn18{4sG{6n8b?BTv!wQsw~y*c?Fx9n^8Y}UQ*p@a{LGyNzU~UXma~$czIKVbiGJElKdoU*nVT1*Jd82xnHx@3vq$rgXtj~~ zqT?ZrvzJ~~JB^%S#QwT-jB%dD?5kTn9-S<6sh{y9&ydXAsWHzn?tuA`-MGhl=Q1Bx zFt4?9w#RYK_K^QYY_2|?oaA1QO@n1f40*(;o#^y-8l%g~%wrX#x0pGsdc2&$ zB>UJ!>tWTTS4KW7NmJ5VSa}e?#d}9(Iy%%nx*bg`)GY1Fr*`-de)&kYzqxJCZQfA`KWQ<3D?p-Kz3IE<)#*((pTA&pj#a7aX zm-QS+Phr>Wlt=2Oc~(*$yHWFQ(#uC0?4!KW6hoNgC;3w^=B=%aArfyUa~c1i=dXKddI4M@?Z1c$8j&^-)|iq8)zO+ z-<%v9*uHeJ+tcSRcR3hwFgnW1(R21io{>HB`y$`e^i5`uQ_fHY5B>4RJKcM+C0a>e zlXZsJ7wM;JftmVedEZA5yM+FFA9kU! z=(gVD%$IwycfEdgJkK+|#}{h>2j!T__?~Uj*q8Mcbr0kIP~^UQ!7hWM;2f_O1O%Jo~G@tm+F5+{u^uQo}y!ztFMUkx4`+d=J=2 z+@}_Ew#>fQX~#@&@L6~7Q1ZT)Gt}A7ll=YaKF(oxAQN?=T*3YL*dGr6lcXnp_FD69 z#U9Cm40UROGjNi9J2h;>w$eTgeDfisbq|Jq8OZH{g;2?&Omh96md1jE0#(tO?&w3l}}&l-?NrLNcUtO1!+GezmoveErYcpH7BKRV&(FE#0yrj74^ z2ettY^6AevXq%x0?!`vnN@UD2v}4(|VnwuSE7k&^Ge#vYh*52$ zwZK*6^Wyv{-B$YfpYeQ0oV!2Iw_X|pMu<_z87ogRmSs~m*%!7y?zRHX4j|q3?TPMr z#A%zQ1#V|7UBsAqFLk<$I`-qG`d@J;Vw(VN z((MzUM^0?#KUsrq$Md?~V!UT9_*(YAhsX1@&DME9Zv|tu?4>W`bn7hEbYB}fC#eE` z(sUJ$7vVo3U(=^zm_xB z-bG(EU!JPVDZ3fl5{R$MDT`wRtxIA9jZckpk3x1YLw0Z5G0E-XfAI|9{09D^4AzXojX8+@{lTPi zUdsT=Ig0w%(2f=K%X#$EvG4}t;0&bSGY5dX50FQiswc03SEi_An>l?_=LZ*}%ZKtzJ1hM*pAavy%25^hx0p;LtsXo^l4p zV83~7^G!V` zp5v@m<~ZYZ!fn55)njWdD@kWtNa>h060GDxZ28(55w>FCBbERL=Uj#FkF*iydYkG)z z(G?qL*$|7~lJ|Tee8zi%KO4Yl&j?=IhQ0>>$EqZ7_^A@z&U+m8FUL2RaL!T*ZMIu= zY`@6e_Nnp1R8%qKo9W4pOg5L%(FJ&_?vKC**Z%v+(z@cp=oL?S?ZT}u6 zy7p5CO9ChTC7fUGS8;GSZ!p%Z1;_1WtQp8Sb`%`fF*F)3Gg`HSqbm! zlqt@0AK&`Dxh93(x7VxVII*40!b2*z3yo$1aKQ|K41|ab3tm#&qme_+L0%)B7vZl(g<*z7hN; zY0hU3lJO%EI}{lo_EH8bwkW?t277_}rLvzi=VyBUOdadR<`*0n%x9PS6dd>7+-N=A zOCA#MUcEo2Vk<>@;5hjQTETIND-!hn^*r-u>I$E_oV8WIB5!#|&g7JRX#cF2k2Jt> z@7^Ax+d16_j??qQu0`V9i>*sN|APEGpMc}6oS!IXUJf)_J(--Jcs=vWad6y|ceo?YiS4Bvw1CT zP?np3oDD7lySKko64=6Ak_s*zM7}l5EvewrsZ+bCz1RVEyjT+Whp!~?`M#3C9^zer z%xz~~&H>_GhRpreBxGuAYTtq<78|T;>^yDkGwa9x>LF}BXLrlud8}9F>JrK`h;keU zhn0|jHf3pmuXb3}aBA7e*@6cIf3IAguDct+a~d{e=);)f@B^ebk+ibmD}v{od_daulD79b z?6U^LK|Y5~nD}Q?Z}HEj&f+(dW-j^`!O?QAiJA1|ADAF%q3Z~q%~DU=b&|Gs)ADYF zX`W5XKhXU%sfYMyQU`h7K>5YrK>5Wl{a@xQnHzH{r_7IL`fdw-NBWUDk3Mmu$nHJI zwG>}o?ZpX$Ln9Nw19vj%rd0BfnCo7(BpGO*I`a@s%8(ltt!=Zn9 zYv^xd`2Ph5JWs!yz*w=dFq&t`SoD!3#&Y3G7NJkj7|*kjH-+C@$ygPbR-|zHJkjYBJ-+!((GqGGk%?anacKzNT^~#pvrB z9%EdZG9gOmUrVoxR!z^D-D~*IM`g#T@r*4=jG3{FX>vY!HDk;g{`;na7svU3{Wr{4 zFEDrAP5e*6fR(&6i+U`jZl4n8Q}EqM;++D^p%d|(0waA27R%tQ0^#ybfQ6DwNxBYb z5H@}%{A1mN>)%2*l%)4>WM()dqqmfCRro2f8*Tyr$#*d$H@1MW#2sJ1k3JW#>n6&O zZREVmGX8zevErV^-Q+zEmJ@7q94sfil;{LUff3izPusw9$H9fzDS3{A9Z~L zS?QyK>qhlXRegE(Fk@eM3~b4X4Yc(^cJ0T7Y@#urf4BrYTj6)%dfQ%_)hDhA?kfJNiNm`whmLnQFvjcuI%EDyEkOwnzLI~B{>l8v zSU`K&z%;q^?Pl6>E`56*ef^`Q?Ars6ItWfxWEru;Uw}?>!7vNFN4=Whw1VqCP*vo! zl5nTS`Y3dWtISr_2(P<3(V~v%7%z%(QNc&Y;ov0=Ige=L+4KZUY4F77Fk=H4uRppjIX|R7 z-*zziFZo{k^|>&~v!8!L_v`aJe(Ep&6L8d0Ue+Cx-cIz)q@mB1HctZ>FP}7J{1qK> zzUb^I<9`073f|eze?|ZG?x$Yjucw~y)ZT66A@R48hu~H#0=k}ui>~Mj9phThFu%0pE=O5In1-sUoL>-n!#}mAsiPAj%xwOwSnX0+=-); zIkP;3<0gRH!Z@x7{I&sq6?a(!-x0!a?-BMsVS?WR;5YVgsENZSHi7f`KBm7^kBd>C z&}U?w(cvewz|<+x=)#dN!EZx;8pWAbU1~l9>)gONG1`=X-EytEuR_Ok`g$Xgl|*mG zS~Bjb+*7#2K~dH_DSN8urqB&N#(cdPo8A+(N$ym}#;IVdG{(G>wC#|eMyt>0L$VIy zGy2bc6>^5TtY?z-M}lK^<4^a>*_x7$tnHC?l9JwCeAkEJ2~*&3kq_;aP?r*@4bn!NsY+yJ!A4o9VPCe{B@)Q4ilwIfO z>3hNRQr@bTcVzAIr?iQzGv0)~@muw8SKmS3a1CVrlHN~8yM&9IQ$Nb}i6S?PF!)N&+vWdd+_5Op_4Q%QyMwvoA;zvj zjE~2i-P9wDBNHe~1!WLUbOL!Vpd2#Zh+gElGxO}3<^AEC69;9gwyUgejr5&{RL(s5 zK#g;B1GmBL4$jo^o9JKK7=!ZRtAh3;vEF?2E8;%JIDQPhjm$m4XWhNy$$KHVn=y_2 z{hV3;mOlRc0sJF#;2*$0G9D$7p7=$dlLznJ%vgC0JSg(0*r$lRvzIYs9BD1!jA_C- zWBe`BJ}7B>e-Gy=+{y3ZJjH+hndN5E+|3+|-ih=Cza{GUZ47D6XHAC42;)d=0qZg( z&u!@IL`L3*?oRyss7Fv{mUAj?-hA3s{Q0!0_`~vx;5S+S5XNsc^cU$vX6CcA_^tL* z9ly<$KE)MYqjeU)y%ZB@sikkd9@7cGajqzAoxve{sq4!c$${51_^vqnl1Q^eG$NOb9gpE@?oqH zEVYp56Ui?Z%pe$QqTsg?F-qo>))CS0fUj{5FSx5uoO>nn!zfM8BHyJ-yMo`g#kyV0 zL*x6$fHToyQr6eGKf-*nhIy~4PmEj6EH5X{u^fxLT=3g$$@5jd$GJ1hb^HdF6#Oi{TuLG7`y!;gxz)$w*j11OPzL7hYzS%Z|)zKXn~=)17M^6rbJHw zO!Ofb$-!D2;X2yEVFR$8k-pIZj?=l9+2h>xb?@pjrSK}Ew?yBe-P z6U^2Eo)UizoX0r~m*p89!f?!?q$6jRBL{%L+QDbS4TbUBT=HoJ)3t-qblnMZO$T^W z=2+Gsdpf2E%T|H@x&yo><*a}Ql=I5PE!a(TBxkYP?A2H2VQ1o^@5x*&bF*N#wIS># z{P8IC4uai8FDYZ5$geGa#=L{bt?zRog9vtO1V`mE$K}D#wHC-(q0ev7A-@ma@X3eN-Y`U9$e4??a}}za}|!j*zx2v@g_aN9L$aCHaOprUluU`ndl zPgv6MG|nrRb3C!_p^bj0>xshWl?TrnzeBehVg04P4lt<061>%qc}4J>aBTgVTj1)v z>nWF%Mb0=E?z2u$kG%`%8(ZPiaV_>a*aKY~;I{~V`_b{+jf`b8m}6%}@LL4GeNX&WJm}l;+XBYE z#q_Nu5&RaxZ*iXgar}1e55#Y)8S@@uZgz1YgGBIK1izJqu>Du?+Y|H;#TfQf2)|7Z z^KbN-?||Qq!N0X!fPXvQiGMo`$2JcC#1Q}17UJI&VX|M-_vPOXhWNMlkadrmvT8nm zNDC}Q-m8Fv`yBa1EikD$ra0uH{~rH#FvP#ThYZ`{!VX2};j+l%Rq_xV#~GSBHzr(^ zoVA_qU4o1dM;kUxeb-=-#&%@b;hbzofcDTTxZb0)6BF~^Z zmVLD{mB^%R@Nnzk;e?|P@^$|z9uAurf*f3*M0ct1c9XThg?KpO2fr5&H$KF}!D;C{9DLS?aA^N+ z9uEHNf0~Eu$RFeG%)_1K;NT8}yxVyk9DJgL4}@=9Cvz=Vn2+=JL>&C{Fms9S#JREX!Tg&txDmKg0^t4Vhb0g8sXXo zFn-^jx7y)IM%leOHscMacn0-{MupN9_}Ez({yyF!l%og ziE!&7`!cbItA{6(bmt4VN7{G5L4~>W!@6!$c(9;7+yFQ~Y41lUm%Q@`I(uo`4n4gf z7bZMjFg@YT#2$|KXKm0qkaXkB| zu_SQxXbEG_ZuC-S)-&u@qT>kL!KI<2=zxTZn!7!lGEU7+dwn zz&j_qv4czD zF6$exH>7V=!w08;tx~aB0cWAxPVshZPhy|C*VSc{V#y6P@TT(vL>>l;&*! z$EBfnl<+jL(1Gh^U4ZPP`ih>;FTgR9)?@IrW^fy8D?G{QPeng2I4cEQg&x)W0{Kh6 zsnqf9sj`={=tYC+-c7onfk~&`C^##PI?)D#N5EFWy_-mn{UsL~?Ve_ETQd7G$$pjF zNk0|+v*--}ME>&5pD2&uJURDV{0Atf_#459cZbrwn=(whF;)+M9J}tv>fc2Fo8mbM zZcAaF4P(N`vG-1At`&SIdej|YJkina2w}d%*V^0%$ydS-lCQ)&NxtGgNxtG2EGOfd zzR!3FAHGf5ZwABN4~E+g#;ZVwx>(||o;N}6>=FL)i_wABm!gqHqXQ?;)1j7!u$zmr zCJ4`t?rJ0D+*p{-T9=mUXp2=PGxa@I^u4f?F?JS3{uSRen^+MQ9^s1sm4eC_CO@}J$ z+gVSf>rls{Kb;S@Wh@S1x1f$xu$!y_Jf}mI^)X_19K?2_L)F&^cG98Npc6SCyUG5} zoo(R6{-~w6-#22nX1>`d`dHJx=s>fd{)G)(^LaLKU)Q19(3{5S`p~WDQ${m3c?QTD zQqiH>(3=MJtNR#Ve4_IV=~rFo9(5fm-+T?a$TdCKmsfPC3q*$+h0Zhsohdq0u-hV@ zJJCCuu~8HoI49$h+YozBcUp{&lCUOAtgc60jsEmu3v0c=Y-BrKlsqY*dqGY4)9wL%SC%S(6a`y9J^Pqo5D8h=FocF=Emqi z%TfAjtBi*ObZ#yey66@h(X&2}zVmSM1ov3*iJO0YEck0Z zxNHmkui@H>ZVQ-8{&@@dto?FXt1Wx1r|Dsd=qz)o`@^EA#>T%D8~+nvz5d`A!80;O ziC%Rt>yH{u)|%%Bu~!ASuKn^fWkp}x;Yem*4AGw=|B?O%@SoVa*>t_6jdx}3pUBzh z(OEw&X|=JoT6Egz$vww(J*usf9(7+xk80Q7Sx=cnk2+RQk9{-9dp+1z!YpUg-6vSj z+kx)0fwkD-@AAz$RjHTYMp-`y_N30@uO~0@kJHm-45NOJ48`7qZyM|e*v0al+r=&$ zyf={fk8pIcat=pOcPhG78Oy@D)qT`eAM40VbgK(w4F%6-J%#wirUkvR=X~9&^bz6W z%6r6oW&iNjlZ<7bN9*I7tdD8>l75mkGSHkqQeVH?gigY6|0~0c_ty?U(?DvtYOu<_8!+@VjXK%?bV06*Xrw8WnF9MHLdQF;F{JP z)8f94L`(fxTAYgs$l&@Bd+ zRF8|r)-9HOWL{GZPhiu9ZQG}eW7EN8>Dab4p0%Ni(rxJO3)#4_F2Z|*js-8w;Z+M? z1s|4*9eW!4iVEi@eB1GtlHC7bTuq%4OFpscFnDh|cr5*=G3-|nv~9bOyv4Rn?C5R? z*`SGyoA7r*J2k;->{-BflQe(9Kk`j>bknF~+6{vL(mm6ur|@+5owaLwO$j%7Uq#Ti zPHfR6-V@+0!Eld%2RphQ-ddexme!|^}Y#`V#4g0xi*XvxK_fMuNr(Rfkw>!++ zosav(URrRU*v<*|yFIq zn@ua2M_1FI9_ozy{+aDu5cdUb=U&5hE{yxcb}o$j#CGlixDTu;xUV!jg!{mOg8RN| zJNN2&wsWszI~R-X+-um*$r^jG8aOa$JGTqlxoGyGc}>%lb!=XkIlxH9Pey6v1`z4LA61ow%}+=cArbl$F- zvF(ZIz+s)Ydj;Ok7~<{x$QIxWu-vh%N$z&ATpifvL$I9iS8pH#{SGYm$k24LS@kwx zH)jQF2{yKZwZwi-)&O>Z<<95rTCwG7gL@JzH-PbaAY-@upTe!R>sZcKQ+FBb1;JC+ zE7LeP1$$s@?}Q5!J;Luvf1^`yo!x8Kc{Mxl%Gy7%e-+HLpJ${6z6tYmvd&a^wR1e( zn<1V~?8^ji1#Q^EYhQ&od}JuLdZcSTo33Cmu}QOo8oU@a93Em3gt9>C`wtXR6 zwrzU4j6u|I!!Tr1=4~B!fk*4WavkK;2$su-*AyMbF>u)+cuwKsHiG3u4&I2JoNh}@ zUB&+0d(b>wrCFkpF zp9kZGb+zYXyl-145z*8BFVxd!F%EX8Z|6h@wx7j#|6D)21B~}=`q}d_UPL$Bd5y${ zaNZAHBk^z0%@$ws?Km$VoL4}f8WR1Vu|^`In?1{wb$pjK692d8W{VlyN}?mWS$MGj zb-LNn(O=cgJ{7`wwYlG}o1Mv5$@lE4(u-YxVNXV z<_g_xs?NuW&U2T#e45D0aAU}*->jdlho6)EM1%TS(anA`F_trKgnN_yMs|_5=w;=c zNYR~2+USX^IZt|;=w&5+(VeoUlJ(d@y)1i_g75#CUiJn0sOVbn3Z;7&>9(PB{uDm$ zZPJ!!4IAJibscI@k9+wv;n9Te`)2*@FW}13(9sHi_b1kE2X(ady8oZ)Xdk~msG|+* zXXU&h(anmUHVy7eILv>lqrFOWv{vGZj<)`SI@++^UT0nHchb@Nq5`e^qL3k?B0AcL zj#gji`ki&OwK?C2;m+!4{~i@+Zlr%jbhJ8W7tzrM_bk!ZO#G{Kv`3@9uA^P@9dxuG zM+I6=(pNv{LOzl86JZ@~TfVG)J*T5R^3nu%8@!(AYDG_b!ZrTFdfE+~kp}k`*3;I7 z^tA2YqNhDyN81+S^};&ZI&`$h(Ah@xwEqS@Z7kR>p_88028Y*gM4Wtrbya0T=9>Znfq-MO_D-?YccpWyFyqhtN1Jx+FnbhMHEP5v+2 z-=w(5x37=gz&u(_e|jS7KZCoQb>6xP?Bc$0T}5PnlXLcX|5QgC+@tPm_ITe*NBaZz zHyOX`hwX2&nQ`tpu$_ks*(I_*HnKieY)ZbizsU~z$BT?%FGU6SH<=aY@8~mU*T?od z%il%zH;L?T@}uu>(vPt$pE7cxi$zeVud1@YT#`bPz0*n$v#yDEg=q|b!$Tc@?L5&RaxZ$CPI zd*2jj{ksX>m??taBKYn5;kV+h-;UponF1{z)3;8VBK#X`HEw6E#8TEuMD`c{AKG8| z%lm&A|7HTe#WFW1aMgB;;5XU#AhN&k*ZH?}`bQS{t$PT+C5QPp`b-$Vu^uA4w@C!Q zMey5?j^AA1w++m()e-y_*Rj~F>f|=a|IVNNCdw{ z@Y@CP+YennBl^?t zr$4Pt`F8yFr7_TA0>8yZ@LL4G{R{BhLq8C|C4=A6nVYk?kU=8&ErQ=Jh~N6qKl*{+ z@`i0L8 zfz~e#fo4+#zeVud_r!0-mT$*zHpaeW@LPHWzeVudzW~44ejt9!0l)QOZtlm03=-kr zBK+G0@!Jsk$5o7B*M{(0&IS0li2juG2qOB^e;a=DfZw)(-?kef_HPmUx9@5H7XR(| z?IlB?rIx<+x*?)Jjp$GR=k=#YSN^d5L;Q?+2My@PxR602_$`9pE{NZb(mz@m!;Tq( z`qR%>hSr~U=HGfm__qjt`}gs0H!_yZV2+&?!EX`%?fdd?=5NPu3mE$r)3=sH@LPm` z`xo$UFa1FLwwf{TA?9WmS8aR*zeV(?7uKIXLH|&UVNZqdn?Ho#q|b!)r?uzKPmS#V z7TN#pN7tVwFqYYvW0NEJErQ>E2!6YN*j&z@$>S=kD|MO0U03E3dA6xLV_yz^t4{>K zMey6d0KYx)1Myn{W8M(v=Bv1h%@O<-!EYDFZzc4P(Tri^L-@@T=HKWuVf`>S#$| z$nxFlwo0?Qy>hpj$$LjUC4ocRN&>4YHKo{7`Pjjdz;S;`plO*;H7`q0Z!CL9)#PQU zx@8$^+=>J0q)Q8QT$!dOuSiobRKBI&o|2-j=Un(aQ=I4e%GcGsvtw1R$?W~Jes*uB zN6x*^GbD4jdL0IfC&2mbW<$KUxzeXvDic)uvc0NfS)wX4SUsHe>-~%~=f|#iN3~xe z`DLgNmBqci@__P>NmElvv&@j{nM%HQO_#HQQ@t-#rs-k7Snk80?5$p&piY_+Y9zgm z%Du{5_inYM+g_QdMjOnY*5@?pmPFj{-YxiBmhD$>P@b)o@2I-VGL)IJ{;o1Z()3Oy zZShYg|IcS@fyLt`uVk-(`9Z=Z{r&hQZPKgrRVNtYJgu9xKx4J!VN#>c=25HXv3_|X z?^!(Sm+#fzt6QF~`^S>^9YZ9~WbZig4yIijO53ETZ6@s_PiTSWWl@B8_qy@7FMCzh zk^hMeTHul8QYWkDk>&fSE~PnMb_b6?@d09&u``(d_-=Mf#PmB=C=YB>~?G zO)a6%q6hZ8w_>NdojyA<%S<_AytnggS7oZ|Fh+ZB2rk`pZ*Q_KG*vI)k0NS*_GG&n&Hr_ts^pO4Finr+Z(mw1?c$-Xlw#fd}^1S6g}3 zu|x~Z)Vh0f$ba~;uYR@|wtt_#PAah=22PgYMtF z{AJyrv%;?X6SYKdMO}UM?-*Y@IJ?tDn*B*{?6PF)YViypJtt>klfG9YuXW_3k&pN{ z@omMwiEpYuClB#UdK&pin2U5^a zV+oJ;v|gnJ`YnH5b&Pigd;?+?k)^sf}V%h8J67t+jyZ@GP zDr>XwSGgMoS@78MS&F)Wx?M+I z`*Lr&RtxmUJ&j>pX6(S=cxbD zSh??0FD$pI6z-q&(*kzf$I_jFcG~!pmkQm-3@P5NhD^^V3C@7HJ$$Ej{*{wg;VEc{>iCwU7(Z$ZiTwX2Pg@^npiFm1d)l&s?uxp7)dNUJ#;~Yv#CltEoQ&o4iP7>-f;X?Ou3E+^d8ehs8EEAk)VYi=t$eq(Yn}AR z1aDh+J$+Bx5NDu*JlkSJ{`{c7%wYGl^$WW57^BK$+}l3h{cxpUJ={B){?Og~$z*4s zKYeCgWmmP=kmwm#`8RcRwlmN%w5u9K|EV|Fy&pX>*8OIs^l`iA&C2)H@10qC_=(jM z+=G^P)58ZX|3EdGl4|VEZu+y0mGYn1J$nps-bYrXs3S9+fkBl~^31bw#an7Hdmh-0 zN!~@2C24rFa*}>MecDO-4O$k@H1EzzNlWwWto%T2(z@wkGf7v%)y_b6Wwbo=tXxs6J~EkVaw>P}))(S(vm!lrpaz?Z*BGAZO%Z^Zs(&i z#%ShfHM48RxWh|>VMjKUxo7QtwfYvqE9%~;ZhXV}XoV$O%_8nPWPPdG4Ev;H0muGwQcw<~^ zx#xxC)|SoP+|6HVfg?BWyjttpYg|(wW0iJd!?0}J4GUIY?Ub$X*|JdUUG?-+Dhstso&Qtt`u%CT@z8Zgk z?tl4gdMQEw+4x;`f8kmGMd!UA%>UeTi~jsve&(+`i^a?V`AQoQ}MUwMmSpedF%zX`W9Nj$}cU0G2^P{6O z#zl91cHD2H630E;^|#z(LU+@+MBbOMnqdZOZ{qbJUT@+B?=hjfNx%0a&i$l0f_O#5 z8$rC_JtlNFjgvA-*cjs8LcCkLJ~OUZkGGk-#FM*8zmFx3mHbx`Z`C)%dzJj;opHqN zsh97WaXt0&$z94PcPZa9{lYX}oFNu7ai>i9eDIeO? zXm%CTe`aZhvND6IZ}HBcyF%Q~LOmReNO;f<1}3~n53kq5gYILvi=4#{=AAOT(a@J~ zTGjn(?ZlzeUrv#KO8%!&7i$;g8O(j>a(Vc^35J9+@JQb=jAe<2#IolNiSpk~s^fVF zm)U6Un@8U$gW&i_HZCZyVuHsI;m){*hds=kVW@ceNK}USH(T<$p5CJN#oN-WkS! zx4OHzAeVo!tAz7^b|t(w|LkA763%}dO?V&v?GH&Km+uuT@fZVQCC^f)BROf=qp{?h zI|lc~_iWFdAoqpb3-7u7Ca1%FjeT++b;&Tq)#T1}I#T8RTjg#qxT4(Yc)J_#&T~4_ z2)|^Z({VuZxzp*0k+klSJ8AJ9V=gY=UP_%U#4DxF7TzCDo!3*&QtBE-_yp=2)y-Z| zNbaYIMp4geB%FF) zLwF(e%wf4Fq|HKiQDr$a--!Nm`AEMVo??(Q zT1_alsEtmOI(f@*|M8+sRWiNM-|8gp5IBx6iiwv&ykz1f5ieRDFS4lP#D8+`NdJW5 zOm*j%#eP?jRlRuo2>*c_iin>^{4C;U5I>ptNyI0gV)7|6spEy2DwR5I;hm=ZDEIEu zCH@$}yx`IVFs2b4-4#x%0U04%OXRKvKDe>SpM9pppO=wI+7{KXf0F8H&QO;uOao(@ zRbh0Rx<4vQ9g4|NhoX{IVQiARKPFloingeyV@&Gh*i2=JvZ_PKOQU*QRWq{PghCVL z%T&#jqZxT|^nhsP>Tgl415K*6f2JChPk6ExD2z)c?IhABy(kN5n@F4YqOB^>$KWo^ z%;Guu#w7DRiRaNgw~)7qyff9FSkggmYeohd)jLr&7x2B{Iv%0i!ku*t%~Ip8%21D7 znXEb-N$Pi3MyvX(EGl6ro13Ou`evz?TsWbA$!cxiB-N4^t!nyO)EoUwdcRl& zr*}9mO+6EzrCv$MP)6{1BYAALrm0$67V>q5x?ZEdO!<{7$5Zj>NX_JXhId{`NF#2R zs)hFu8C>Gb55*}Yj*&8!5mxN3cyt2(M!v}{_zxq47u{6x=q;MjcbM;U*pyh)hHTk* zsZli|tBO2#Q-M*PB#!`TTt7RFa|6xlWVNMdhI;;nWVJgdS$&LL=^t-Ydkd1(wri5qzH6gZ;-F~tA+qTMDMs~S zx-;-0_oK*BkLuxF`Zu{b;|F33{O_j*I$jb4=&6vK{HHNrrFMsIKc%J_*J6;X&u9`Gf z+w?Q*l@>M7VNDRqa4{r%{O@ZIZ0}#mZT0`XI1I6#er#0xK0vB)6#uI?oCodZnCN+KOuj668TuwtM){7 z@TPe6E8?D<_A8fzJRZ<8eScOq`5gTZIuoxG_*zZw72jG^`z8}f99%fR<-48;Xc_~hN#Y4^JZ@ou4J z_btSKm_9mU%0`!+vfV=1o0RpJA^+cuc3&g@g;Q6%DtPBJV}h>&f6P>utDNt+)M)le zKPd=(hs)(#ljgLL|0Lg|iGRfWlZrODxKLiA`k_ck{wTRcnn`jaKFl zt4+$imGO$~$}IAdeoDyNG)cW&e1*GqA|0IR<}G>R%M2Irg6^_TLe&IR;FyPhMoz91|yK7Y&${ zRZxFsw156ZnqyX)=2&-Tq<>x)&2eit%`xvxp?_Xa%~5e?l)vH<&2d{_%`y7SaDT-> z%~5t{jDPN>n&b8>G)D{b``jxv$Lwn~NBo&0|J)+Em-*+8)EwrC7fm+*?Bas*GTdK` z@RyI1`&fVZB+YU2G|iEFy3}8O19#fcJav`pj-P6dQKyUjb8eCQX#bqsHAfuvESr!# zx$neo1#{=(r;KyvbElqpQyHUauiTq63(9{+I+VHmZn=;0m)|G%iT?8Cn&ZsU@!<1u z;PkQJ^)cY~(a7s%Zg6~+j^}Gl;Q2Vh<9VJyyhP$#!1GqO;26R4SD2lSJs}Lt|5($+ z+#}ds@UCF@G;rX+6mYL#=nSXBO88Y>osRk4!NJ*rF^Shp?)HNGT&Lr6iPs;zDdB_U zZZ8;onbVOkIC`klkwkc}VNOR?2(Jq+&K)lJIEdHdz_C#wydD?A>v7;%!6|~-FS&{G z4hv#-y}Znig4<&xom=H@FX&tDbc~cV<~belgy$_pW+A){8HMY3-JWg$I}*FB#kjrk07Rxr_3$juu|IM zr?kZz*9K*=SSc&*&`r{y9lDXmXxd@9yiYqM5MD+*j3&Glyje;+=xNdpl4fb8+{?GO zfJw_~hkKhF|v zsK1kR=2Cwr_4kR~fGnDaOz;SLTvX(|a>r*Gc`bwkBSe_20+GS3<5N3Y=$oYuq~o55HoxOUA7_M(; z?rkJ)263Z^i){e$ntNptH;uRn#03jp>~u9JXn{QBljdGAJVQs%d+jD;&BMLX`4R5R zk5Qusn3QXPQO8INrv@>R15C7&@;MDLYNf%XMo`8FQ)5&dIKdObT3xj`-%7%bgpJTK zQnarboYNc3_n{H@6EW_3o_9E6)G_Ycu8C3k*C2v`Ny)RCNt9 z&S~)VW8lXo{x$Q|$6QVH`6S}rjBHa#TFw;)rA?_~TtFv;+?2+%Ci;BV)W=;1z<_C5 znr~+%ag0{wG}+V~(h{sEGMmJg|FSKo(482A%WTT%(%X*QDOaO~tMx+Vwo`e|*Y1 z*E-@bp8DqTP8r`={OD_a&tuoJZcr+E(hQe{Iv<%9{O;)aeHOm?x~W0G#c1(uB&`qW zLpwrp(SzXrZiMAc{k5wX=`IAjyZA0c`Ie*b|Ay}_GVw_2_%QzGLjP4Y{yg&P!t+w@ zEz2n@ZB%B^Tt2Wrx@Vt{yys1Kx!RZWKVN22cU+Ome~L`c|BG&1Pxo2UXje$XKY$e-+qj5KA21TQ5w(wVn|_}bp|Xw z4eF2NBV$=+Ppf+OR)ca(e@u_Rl{la9tv;DxRd-IZDd}sE(I=~nNj_J96S8Znx|4T5 zN1y-sJR@=recP1i!tTPSw=w;4C3#{u;oC&JeX`s{TB)*sgzGV5n(whtzuu&2z7eF8 zHvK`@5ZdRLxVs?3V7>9Eq_vW^$)Mbi88dwE;LiGTYW2Odt?CQXc9^>Pni#j2Q;#_M z%)`A5^c$<{cAruG`W~zL;2xV2S@na^zdWap`01BZpK$FVuO&;3>KfYPq_Lat=t6^< z-OZ|EyTR@8pH+3W!M7RJ{^3UTCj4P9^0rS4%8H9hOz4)Qe0lI7NrYD*4@vtjEKWrR zPx6)V-TpwCu~+cjHpHMT)a4TDXGSJFip)|l^&wX}oWwnpW98Iex+YFv>DoB0$~AoI zM%Nzt-T?a6AK_HoVEs3^?!ScpqOVo;N9GqnA$QHfeG78eEaZsZxHltr_5KcWmqwl%W8q-(7|b^e z%3)QmkKx*GHfoL@$Tl~}XpZ~A7$}q+1CjS`wrUQ;B<-Ss5LYu-hgpRilxw%82lZU1^*Av4aiwW_nFmN)t9vi`#%8(evGcp zjE>1{U|i?gvijmvn{o{M5A#g)&<&eSRnOo*6w-@t+RQV;&iZqV`=2K48LnXbn5w69 z@Dr~4bE2ybZ;m+^e>3rUcJ}$^sH#H}hfCsb$}#OfMEt{q2j7padYX5_{!N=ryl>)t zQz(7%Df0M@l%H!Q}Fp_L(ornFh4VX6ZwVXOa2l+ zWK)_W<&C9$v7z`z@{1zBaCxyOAn&u!H*2By4WalN@#VRu`-64Ybltb){}%c+(YuQs zz+o;4dn`sCSEKcPI~vV`0BFk?+P?8hjdjHy3ne&M{r z_5HE^GDe5<{4v@$oYxPnugpQ=H2xFID|6U?a{0n#3%CD&+IV_6=Ra%y5zG;8GwE+z zR{!Kw9M~@p+$Yzy26OAnnl=S&h}~Tgcu{QaYIR#XiH|)V+`SQOX#!(Lfi9`)WWYOWH=qS6Q0mj?)HMjY^TG8 zKe3nG@#o6jTwv)BA4|ApklgJBmdoUBF0c-DI_e0w4wJjRz~*#1I`G?u%N>8I({TcB zwu88@z*$0#E_ZW5 z6TGW!UMT&A!Sr{*H(Kuu#lI&QKdRE{*g)Ny?3E&8za{nDgj>q}8@W^NDb9OSfA4f`gIgBc znLXIfi0y>+kJtrC8viAC()f$q%>}ld!E&d+%ALI4k#g^LIu1(Qy>iFS=}o6&2>ieG zEvMsM34cfK_JS^db2_e<@CK*jJ;Jk&I34$)7qB)t9q&uLHo4}A--}k`3Z-45S@FYm9l6lzPEU< z0**@jt$2S$|2u$4E5?eZJn!P+FDm0oQoNb%naX>1Xt4z zr!b3a0N*U1G9HIZ+=qYQHCD9`uHkp^B?GTCsF%@!*XwShdIdhGLwED-&;vh0{Cc>g z%@ggDqu@(c!nNs~)(e}s;_WJ1d10^-k})V-i! zl5O%^#IHt2ZqYQy)-$DkOO)m?nKg$6uEUZj_tAcfU2{aGXpVL`7)yrci0+Dx{B)t; zk}da9eoHUS5tFMq#-1MTxAd3$7{6tZ=7_zF=U(f;^bHAi3KR={J8Mn9fVj-PtO&l3(vxE;7y z+A0qHc-%tahYJ01cglT~KkgplpdU9^ihjI=Iddd)=LqJ|;moDQ%&|r2$BjBqW5(82 z?5SH!D<`#n`P3w_dxn#&vXsvq`pBHQL$?{Mqw{-gh!)4PJfsD*C~a$UCHAmgu+63X%<}=+Lm+OZ^Hkp3w9iiGsj@>O{Rx8#PgT?v z`V$k;O$EmI+iRn$w)Fo0*?aTosH$|~`&3m@sj5sBGlvKXh#?GtTxOx$42)rN0KuVc zriKva7a3G!5S&s`n;S*DPcJWnh$qLOzKFKRyS$8HNK(ib1W}hAfDeeiMQJ-Be4Q)}u!UOP+QWmadg!;)Fdd1qPU|6m{Yh)WH90na_*teFWb!Z68<+^BFe^beJl45Qg6VfA&WIWyGQYz+dn~T zeeW(Ujc3!jAB*p49Db-1@VnbGK1t2Pw)FYsUi^l!8N=@DOKY5-h#zhL`(o4!_>eAL z9*urGQD3_JFt&ryD)`=b0XsIiw#XW9JZiP-zq5uKy=k`(?Z)HJoXGiC@c#4552+R7 zUFu@`xJVyMsh`2-EHTh-BJK7Mw7axTyK9%b)V27N_MyEQRy*xG)GbxJOYz~T&ej2YtU>n?{?P6`S6fcV=3{Xp?sE zTbicWb^D4)^$cy&7j0JaF8;He305ev`UQMprCviHQm>&8smIcu)D^xdO>wCw@srx1 zD8??uqARr3nKtb!oIGpSoBGFTJ!sdx;vo3hZJfiG`whjdH{sW<Sq`lW^#a~K(ABA(Tr;wK@|tG{&jKc=ta)Z|{Y>^Nk(4~F?OfF~5{`7yG^jE2_T^6pcSaC>w=^>Z8gnjhfJ>is2^^!FK-{+n5 zn`#VZ{Ku^A^g+PU4*WE40j~D3SJ&fLD*gO{b3QNYUr}|SRQAS<6)vuKFz&V`>-W&c z5?g|CFKrC8rRswj<1t{aKjXaFX4eM-FUPFyjb8&lUL{I@9G~jF)(~SozRZi*&pW*P zO1=1lE~cHyw6T_bc+8fd-%mTY``a)EGLD{%fp+!&_-OaSx4J?}HU9L-9(4`piGqK( zus6iV+RK0WmJ0l_Ypk)9amIAuQs7Tu$BjSYDZV+{8m%u-l8sjUS>24U)%357r?gYY zH&L1SQZ0UZG2egxpPix{W23!?OU3RYn)Y9<8sTxvK4fohW8WOkRkQ<6>=B?Fw&#ay z_UaK@%&w7I^t%O`#8!A2yMP_UOE^Y(obmy1!-L?7Tkz8zgpck9U`d{P6*x-8|1ou; zO>K{T`@^>O`b*%0_aBN<@3HZ{E8JX5)&I2O19k8sw|VVT&i>@ur}*}M`+uVS&w)#( za;8BURqwQ?szCt{cMF-{f>Ti1M_vR zNc9EU>kqH4a(&SJDD{tAA2>UbGFttkEk#cxf6hlMqSQ&YB%QN6V=eZtA+`|xA~-gY zel9N>t0f)&6#SQ@55PxT_RCk+Bt40KZ^2JH$(CY#jjyuo<*)HumiixQPwGjwcE&Mq zk?he#p0(PnMv}DQ-CO#hHD2$x!j8>n2P1)fGGIjo?<5(Q*$2o5`epWn)IXwaseeS< zQh$#2jzTLgv7Zy={i+X3g%ih5u zub}-s^z}j|`;9$!%)7gE2mYhe*jK=YF--}h1a~V5lpTy*_R$plLpOnIXR^k5_l2oL zdGAqtLx)gq_U3suv4@8K-l~0W_OoBDpxjTt5Al3Q=u~g$)TN2zw6|FIqj$LR<#wy< z!7Fc1a;YzXS3X*PP`y0ash(KwRJSwc_~pCQ_z4!3?}M&j4+Y%hDGA0RYqEZql4MNf zTWeUSKH#9f;GP8fNTd(ePG^pc_288)lfv1rhtx~-kx2WAzj4w}rFv#^xSGWEq$w^n znY!b5;p$rO&&$BrW6;&3jAt!$YzzIxF&_Ef2Yj@JmCChPHx z<1PBV2>p=yMd-(KjIV-rg}yxj?F-Vb-r%w`d_x~_&=%mCHDTSHCM^Wk^*H+S(^m`Y zDD-ugNlTBKv@lLT8lbldZSN#*Lm_b`ZU!%Q0~ejI+GqL@E3_^2Dx6pgF8V9LXZ;*F zdp3UD4d8Hmxr{^DNr-QHCGBTI4|UqdjzHIGU+RwPBcIX+mht;BUsu>UR4d9R7Rc~b`1W=hJ9+hL{CX*4#IINCj}LB3x0=B{ z&%P_PD@9$kZ-{pKk&o3Uw~W?yQ7D)_FyI}$;iq90)BQATApQJ-er}r{VhV3d9-*NdC zp}ny-a1gK|G^`XnwFn$2@dQ2qM|v&MdNgzHg@(0SQYjTmJ7p}TpN8#Z-<>4}$5e2M z_in3t7`nBsYOLo2$}Gw^*^fQ*6fMg|TpsquUg%c^^y>)p>oD|d$8xLs_VV4(Ei3T9 z8`@=scI|FMyR7QQM|MNE_Ns#ygh01KOuF?xbmOz@(5-I+bn9E_OzI*(-TH6v|F!8> z$Q8QPX~kZ3kIiPh4?Q{t-TIDx+CLnn)={^HN2)K<-hgR;n{G`5cU%t8t!eOBJD>~k zws>N;Bp3-RLaxxQ9qePFThrJhvZs^iw=Lb0echIBNnPmHSF|U5N?W=$4O+7Y`fzQ! z6=K5AWn%ICJi4{#pQKxR)xE_25xOPxO6ZovG?0BIbZc#ZZmn%Yw*BpXq+3gX@ng`GrNH=~19a=%D|G9C+IPGoK(`#% zp<6r$zWFiTS^}=9fNs4_A3?g+|2`-ET%}tB@JkW8l@89C20qx#x;zekc#H9%(}GX* z(=GWgbgQBb-I`|7Es?Q;bnC!1>6Y;0BI^a|7P6P#mTpzR3kV;5ZMr4x3*9x&o6GZ6N^fq*B z7JK0ObW37V{C&D5Jafv)A=)hPQv`8=Vs{MH!if#k{CcEjTQ^#J06ZW1hcViNti@Jn z@DAv&JR1cqtL0tGfE?c^T>q5o?#rXJ11mpP53YpfJyM|-W!hEGBX+d}9?~}(d(+;b z>a)P~d2rR6!$QyzpC_itI&9n*`#G5o-nfiaj%BI3=>|@{iTo z%Tv@U;)@-|zIitHCGO3|J0r9bc*pL&?X+*F{e83_O8cSeHyy&YrPz_rwxE+BcF7CB zmH1ntlb|j7Sx08Oc~k9F}$12+Nq4V2j>LKVP46YR3cLu>?7y z1o_^47FhsWPyOsl#aFd5if4%S{(Qk=tCo+F4@zLZydU=Cy(0f7)ClgC$75lS^m^ky<6SF!;tKH-sbYo7+5y)rt zqZD$_#cC;^57)w99;p?=w?#pFtk8)=@H?!leh8kYpi7Fn5MBa7QeP)VTW`j&kiHiZv!^$G&ZK|Q?`(&^FCFVvpF@`a@(!2!G`v9z=L;>j zI<(`Wr~0i!Jxn{%x4P77o{c0n*+<~PZ0Hl`81OhQb3A8|Ki)z{$foZzBFkW#y2!h; zG#lAKbVj}D`+-N21;6Nh=zH-aCro}jo^hG{IAaq2`$NVr^=H`+CGaS7Si=k0dbaWn zXTTHa@l8G>L)s$77=7_QCup0vZtyH|^ut*6IQo$Kc-oixc-oixQN}3sR@QH>HPUER zqIHP_mO)#Kh%e@E?^D|QB+y=RpuH1;_WbRS540bLOkwtiJR$9u6N9QniPTTBPv)~< zHnLY*h%wbVif`Dg_@cpK62q|kSBlybnkahH*6J~ya>|nGah_Jnmj8*@n%`j`L!+vp zSI@%Z$@3-fit~w$CVO!{anZ_wt7xvBM{X=(&xG;Zd1OX8>nR6*?&RJ=_zSr=o_h=7 zC)R<3xfEPfa=%?|?r+tO!&gkaFGT%_u}qpAs#fv*m|o&PU}p@W@UM1t zCw#$v#$Cm=X3nVR@Qm2!&!OJZJ4~BO8}oQ(F>O4+bKNM#*S{P8o4P5!9*n6w9QhdRj{1?CZaK`K88$x)_!E<*}Udm8>`TRc>F6C!x0rwM#r*)~5#3yU7euq8# zVOz9*sY8zMJM88^Gj%jE`gzVKkJw^NeU0FP+D}Fh@97wLM*%l<05?Rjhpfg^&@|Cg zO6neoVU@%53lYQZ*JV%D`_(=9RUTEYYM41Zl@$Cgh1|JCfZ zv+OOwZ-R$Kr&MV6OMErzi`bI|ePh*8Tt9?sxS@${}Hp4pf_sj8RwW?$?drMD7^>cAIZ0uF@K|=i=&~DpWm6|>jB-&f@aDb^Q}fTam&W^ z!N-LDvTjLLTj?iyaI*Ra*L&r)gARU5oU>H54x8FquH_Kptd71)ELPr+HeP3Z0zb2f zBk46`twrf$p^?(|7-(hzb6(86)Gf^+UYnKctQX_zfgB=nE3+7vj3tXPN-WB=W_z;! zF~+tl?d|5C+ZeZ!_n}W7*6`f$aawnDh=OZ4i_m+bQ$&_BdeWy!TNs1XpEcW$)}N() zskfSKM(fB~w8#4?eW`oFgM5cB`{FF^dBIf&iCGt zp_DFDu0Mu6JrH?a+EL)mq^(KxQA=z)k4NF!jg@k5sGZ zBaMlSCtL6)-*lXBlQx#ohSZmG4>{1do3{M4y;|Lk4z8cHQzi7*qFdm%MR!SGdV;Bo zN-*xC&kDwqj_ma|d+`nSCb~M~LE4$my>ul}pGf~>XlD`q4dA_7Xs0_ege9O$$b%lw zfQJy++D-d;RaK>9ZBe?#W-)*jJ&SpTMzMF3DczI_lvc_PMqSul+PPaNY9iWbV46@w{?v*0Rsd24_wHLkWQP%#;+nlES^gP$@q0I@%;eX`%y|nod`ruDk*RSS< zs_j-*qJs{{E@q!Pa1raq{A2&1--Ql35no31PV9?z#BY^z30apz>R0SFIfoGa=yTqh zQgkT9{dID!gCWnnz%%#Im*f$>MfCH?@3+t|`e!2v{#oRI(RW^Ee~CWn1Z#~xM*joX zL{5KE*4}%x)EtMozx;ZFNwk|}W1pFQC3F69(5xrJr?LO^WcWC_f5O~<$$ABQ^mJ0F zddB-+1vZ-NCB;r6S)IL38|PaL}>L_G&S8onJ8KVDKEd6`WD8#b`~><4X*GbO;RaZ|3gKLq&{Scn7`#=3KS<9sV?Zu{%XnuU~; zDbtZbJ0gSb0dMXFCWpeq7r>7Pb@?Chehq7QVRX29lyzOtvv1$+M22vxjnHGx+n~Lo zHZ86Bu`@8SKljR0n4b{xjq}CCr#fA8S+5 z3Dd_O&Y|;^5aV;kvi?QE$4Z2-jJ=&wum)LK- zir;G{_8TLlP3$%fSR9qnoHG|wKZO0pX!h4_?6cX_MP>odSH202@LIwv)7Y2k?8{Bi zjc%-SC)W67-hGVo#K$=wJR>qD?~9&mCb4*DLrYFc{AuoYj>8TOnaZ7#qT0cUHzzsN zFz`)AstcP5_T6oq9U$+g-xf(5=njzcN{|g(=}Y(+H|RFQ^i^9ep+XW!krk zYKXOGtO18Dz?NVSduc80t|3-z2soJdFX&-s@;`HsqIG@8q8;R0BGD;C@m?!) zGhc}|(nR*=41-vJ#JWC2d}QMFum?vfP9w`IdoRp5U;P2Pa&+V7+KGHdY$|AA7i12H z>{rDB%*nc0j2`I7<$os660^dX#e91BMS$y$Qi|=uT~cyplSnCc3rUnJ(i1y}i zZ!Xun!CT5bktx`h#$4`|@a{9TarK^jXM{12dsW<%>xa4Te=pj+CvoLve>m80UD8vC z<8*`8GALG)IP(qv10S59qaiDKB(8CKc&;Y#gni=_-%ZF&-7WapTU;KO#qH^0jr1^2 zp!X<`#6y~`gnM#XcW9C)hrM!gO{5k>J(>SKDSJ`QrJP5(27YBN{7Pr=UuayodNcSh z1Kg3(!3n-`vWE_+ad(hofc1HYwLJbCbi=Ht=%!DxH$*4RKBcr%hEgU`CK`{iFCJ%) zZ)FedXK!w2fAoR>=yPYd+E4gA_I=|0PW3W-|2_KnWUfQ~Z~C~OJ|@t99XQhJ3Ri2v zlXA}TXP*CP3TKJ%QSb1M@TmP5J30lU5943NnN}+Ap1~%g9q&sFVLA8R4vbWccBtEF zuVzd*_d6I{*w1p#v_tGBIA>^2{~I`O45fcLH$H<7cnali@G$YNz^zG?VU)tV?JQj* zHVoJ)RDd@nrtoIFP3J7sAby(3ALPrs*cZ)Ud@~taZ^qS!F^T>|&aW%J-Cvr=+2}qS z?S;shwA~QB{U+YYbEl|s_MDCmzcXbR@r++i?5k~!?x($COT4^_ya%g^fpwu~j5ZZr z!lN#`sVC^e*?pfo(MNE;e+fF6a1ZDA(8NEZ5BO+GD03`4EcQiwQ@YZQGKn&gGJ!Il zGR~;Q7GV?ZZ=n5J^c#I>KkZJ5L4e-W7OGuDHxP4|O+A0B;yaIi;5>SScj)WLZ^G2` z=nVc$f9H9>ZhwS!o;JQiSCR0Lojqh%-{;-W9<;H>HpWt+emK|8n%L3XRH-fbim#gI zm-2rGz1`85BFDc_`ggK{f0 zbqnF5N|6UBD9~p-s*DFim*KCUhIXIqiiaqlZzpqeL$? zQTmP0o9FxWDkgu)`@asn-*sS$Ds;RFdM0?Z4BGZAu-d?U_oA$Z7rGs~5e0szL|4Cx zJ-nJdyc<1qK65#Qx$F!-ax=V05aw57qc#~^wNt?8=fGxXbVb?di7J4r{lL@(_P@}x zzTEG}{fVqm9&2=&`#$bt%UIS988j6+v)>qBT8J3J#4o3?Dub%xT9oY5-KGZ|ASXhaP1m(;PdFl}J+fJ1CCjN55@ zGO^Y>@=PrE<+*a!X(wle5_4Z*1bqeZ&|{6X?-tc$d#j;+q558UEwNGhJ$#toMoBT; z=&juL6g7sn7F6BlQ7CVt6xuJk%Ji>S)>tpEtU18^+L*hSnd2?cyxWs^(`k1L{OttZgVyUqxIcz#d1A*! zdtw{1)O!TGMmabAfO$v8=GzuAAHokWVy-vKnHlp34$&XrEM5Vg@C~4}>1${^lxH50 z^#FIuS^OSb7&wRc@aXo^z`MENo{roXIb7!T9J0LVYof7519sq5tVS!c&bgr}YBYT> z^xo#_Mfqmc?PkpPjm&QY`@IJ`?2hQK^Vz$fvv0p(-@XEk%S%du9~6FR54@61t>Ntd zDE0%3(G4s?FHnx|F%KME4lD^D4NU7p7~3Y``)R(ho_Lrc*x`g?hjW@ee1<*To3=X9 zme_>G!&5Dx&84(CfaeDCTs!t?Dtolq<}CY;Jvt2>dy%~etj2S#Mx`_mS5)_A*`b7A&yKiVya|B$>RA;68;6vP5Ma;Dh;j{1@@ zirwBt#(4(%_G{YrvabizzR<_|nTl@^eMqcTbPjqlcvk`MitWyytM|Z{$@%&r_M^+} z2R*$J7J#|Ou^X%hr+piMNr|B^XVv>`p~h#d!!~#|8CwP4E4Ef*)A};svX61EWiM^R z&QQkvGS8IrtgQbOWbSCr7t*jBgh$ogSKun?%07_wZ*``q=jda8)i}?2%3X)Yc@9v% z#xD~1>cp=S__~Sjbg|w~@e5_o+S#*DKC`&YjJ3gWl}TCv0KZV-oieTbB2!m-GJ&aPuJTPNUsr*u1<455sz4 z`?E zFe!SbQ24Z1V_H>p=``TuceJynD&I3h%ES4d&nX3WZ3So5@OywceIEVtdi2cifV=(- z?s^y9#};%U?=iQ_IfGom*(3Wv{{!p!C(ck_;!I_W(q6~*)cBUO(f5&0jy;ruUC763 z(!-RTk?ufF_z>OFO94E!9(&bqfi2MqT?D>N`_#kxN}sc~*FU3;3f>v`{h}Jt7e0ut z_F?q4*x~BmFs>8y`yKeJ1^jh}vC1A?3|}Pue~LZ`yHtHSE3WBus! zLHe9Ve_QzO=fEwT+3CmmU*WANm1kr<B{NqeU#_Xg(n73THA&zf6wd@IBL=G=aYPVmQb`x&~zYt8Mafw}$g zM|1lfZJgnqAJ47qzfS^l`x$dv&D>Tnw`YDdw`cx=xy5cnKknUMdWLxj&aL1HnOnIh zu(X&tU&P%1bZ%pr+j#%JZ8Nt*hfcA7+s^Gw@WJ2Tw>8Xd>~-e0<{EPw`wz|S3go{< z$bLVb+eOF`*P2^7*S*L(1^2DUHs7)apUb?nZr9tlGJi|izcuJpug-0l9%jz1oH76W zeLI~wUBiAA+;E0c@Q&bwPVf`Gf!99p2hYPdtcO=v3V*Tae!o8IIC*+LB8Si2$OiW! z6AVTM`8Dzf_Fb$kX9&;&!H?K@QKq8bXs1iubJ456M*gI2BVM6&ODQKi8m2zp3L8>QW7VSi+@j$$toCHg%6%ljpkc03cMKS?`txE94V2Re$TL7d6w z57oq`#>_cI|B};7bV%pIr9ZcR4w*^xOXrZ8%zA%+oiU*+BtISP6^eeaZ;I(-(god& zlWSrJqG$BdUhSQ&ZL{5Qxqc5i!N-P_pZx~ElTcgvMe6k#ztPU#dcSt=8)9Z7qlBYZ z$foR0SqV=H?{Np-8k*-PaCzHm7EYvzqk@)?C08SL@A)D$%go+6#SFTAP9)4Ax+ zI`WS2w0Y>wraH;bzcsL-RzsxC5P86#i@@$k5SIPIm=q3|1;26>gc%wd#nTJ>4!=S(MN^zjst&+ z2+Az)2v1MS+xQhS_XnBxM#kU5x5O~#3Ue|gpx3rC@A>df$ftTfeAEdET;#&5Qo;MY!}sz|Cf}~1gX@95QsCfeo=u1L z66@Q@WnN_+Rx_p&-pgaYIcGDh%!!<#S(zWHcjTM=^~0tP4!xQYLA!4Ha4N&!X=N%(Lk01YXEzWuyTg!Mtdh$dTD*{eWo$+?{-VoJ%vmR^uRN zJlK#JCCs_tPfw2&b-uKN>@D-T4Ou*fGL7F}=AaW}v9k6TX6BG+dKb7#_6)WfT%W`B zQ^dLyJko{!N79Gr>_^j|?5$?-q|}?io1&+PK&K@22y{$RZy^>=72he>s`zH}8P-hd z-5E;|zm0?>gT*O20Cflct9IW8xLrOnU|1rNU2AP?Ty$&@O@IR=KIY1tcBEj zFb-*3a9)II_a@gW)EI2vdSLe?dM>g5X+?i!+7WT~Ds~9boWDx_oGrBMFyAKEynLIP zixZqFwh!CY|IoJlS8r|enz+lN8GM_kbf8avOzP-m5-0^9#!_ZbUK)3! zcBWl>?F(?>277+_7pEv6x0H_~Z&e{UqJB7jP0-l}= zbJ;5|7C)v~)xsPo=xQv?L3*fNwQ#2X0eKJI==*n)ClOi9u<#9;p`mIn@Hsm)1^e*| zHQR1icTq2)?%-PmPN7fwA^59Z->n1=u|=VMvB4Qdf8DyvI0#DRf5gntxp@)W|+^t%H#z`b+ksoHv|jKl=OLN1yU7p_0E9-JHOu;1~8J z^ildNXaBvH&9|~1!F3xdYsERx`oJ2=TD68M3wK@ketc{GJ=%26|1QI)owwbqouE8< zD#!O0Wj#3~8^{;gk^i0GfLFxhuNmU+3ex)A8d`mrxKFs^{A@#GYb#Q&fMs^tMS;Tkgv@L6G zo_7umQO)xu@U*PAz@@-v5H`mHkH_J+>X#=1i^s14i;39a9EWeMQU5$O7Ck~N{-?;X zrcX?Tddn=knu1NmN6hg6d{a&^$M|m=DFTbLLdiRd-PNoR)nMLs6xs17-K&;R_roG( z02Ys30~RZ@{IJ;V@JH8y#du?a35(=kX1zbWOJFhHSPU#KY6FY935#MU<%h*>tn<8E zehQ1;TYdfx9XbmZ6FCA#gUw>?4Bw%kYELo8f=V=iyhRUPb*1%mF`QmnZkD zxZeUC3EWkiunR4u4}q(>W*>r=kC^oqWF&#R7UU&?H+iPoyoL`Q?F-zQw3PeXXqU5X z!)x{>`KTqIaFj8RJ_OF@(T53V$W&67yxLNKCIEK=bF!Yp1=a#^C;X=gdq0A^n*%iQ zbO%38G-ZX*{Bp6a`=SyVEOgbcjuMMPVDSL3co3LtWUn=`&#uzNYr!IV4-*#m1B+ol z6BhRai(&r;SoGuCt8`IdQFs-BMb63YvNK=Tf<-%Yu`MiC0E_kjUG(F?vB0ty_-soT z%YoUs{p4B)V;k_iAHKnh98>}CAo;of8Caaj+O?&NvQC00gRuBj%_OZ5nc(Y16SY~$ zW4=8(K7mg!a4EF%J$?n`pC3iOfCz9~Ch_GReA}FrsV0ohS^236qY*2UnHT8u$`i8Z zjjBfy&3e@%ifL<<>6-yh!nwT(kGyZfBk%j^V4_(MCuh3UE0H6s zkZS~9N&@eAXv0zcnF*f-=r@COaTNMalP=PaJl~x@P52}ayVU2&<0KJ~TsL;idmHX9as1K(^hiGJ&;}6p_7>m@;m^3&{KLdS``b@LkFnuO{ zNIgg!M`4RM6gxS=n_l$1{&AXn1AAN<19T7CD?I91Xs^_tp>3%@W72nQe!;t@JlO_5 zi@^yp)_(;)p9}j1KF6B0R`}Lm;8Wo77x;v~1}7lX{L}C$eCywX&mYT_*P@?s#B~0J zmlgW!mn;7_@UmCv=lmbi&$G}?;cx%@Z_v*Y^27*_Te9+#e~5n0f|eCsgMNAf^waY* z=%?7q`Dt!j`gv8Z90iTL7X2&<(9e=<(9gNN$gL36u+8YZk6@E3#q|@ThBDC30KTUqt)MfbT zr__ah%Kaey6yEk1x$^&Ca;5OB$N7m~X9RL%VVc;E9#I>SqddrGA`^O$&-^l>Uk0p1 z1{{rC>E}ClnmnTDb-EyD=7IOoof!?tN{z@(qQCLC@$=-$a8vJst~MZ7HX(yGBab<- z7ZH63>4549b*2xchg>m1EJf26Y4iccNb}Vt#e_)^YNm zYX!)ax%?MjEQRur~?1?Lmg@f{j2X_5&`~G@SK3%Q-mIUtD?^t z6N3HY2iT^%u}4CmLtV}x3Xpq5pVJk)fb?&Jx>eCXh;DT!x>eB;gd0u7HIZxK*m%iV zRZzDYiQSi9juUy?t`EbW<>sUq^O~JD6=^e|TdhPUZ!1H3k{$o-Lh_z_20>0-E-y+w7y4Ba@44L=* zy49=toCU0dtdHncS5wM*$lBzE`1Lv8bEYeCxcXo_=j128H1(X1bi-bzJN7bXv3sm$ ze(Hwj_{Q{6_%21g@Ru>#^DB<4YgQzxb=YIxL@bofk66`V=;4N=gOjxpJFC}}2;GA% zrN}?X;gmMLd7{EOX1pQi(mjCjEMT{ZGmsK&n48}TC8j{Q+WcOKb_=rSO~|1`X?qxL zcjpYOxs&4ShfU1g+#Aom`?)rOdM0*Ql6N=@Tbcp*Ne;qqaxglI40IJv$_DHnouWg; z#?i%hIr*+g`j$M}HlDZee0Ti3nmL#5j*nOKy|jfbW_RYJBXlSYnJ$L%Jif=V=KllO z>yf89V5`NqV&jxz1o8#zlH+I#cJ@zlCa5VcqmeUQ*?W!H#$tDBe9fFTs>8J*)gQCh zu=z(nuofG{M$WT4+g#Xsx1+rzgSpeoIj{4>S(NDqB0Aq9p4Y8zy$YXTY*aY|v zH0GC5G0(=tkJQ9WZNvzN)<6JN@bzQp1U>@hjhl(%oFCQz^I7Z*@kMYmXSZW# zumL-#a_pUQx!#d8%`u#(cH~S`&Iot&oSZ4{=2dbZ&Td7gS{T@%Gql)wpVU^5cA|3-}Wr;h@GmNv&1ykUi_xT{x+Sxz`2bvg)`<> z=5GpT%TiAVH|2)dRIAsEkF`}V;Tzo84sf1hOlEA^;4jW8^~vV=EXHcy7eB|w$HBr&qm%{V0va_>25>s996McL5pM(qIq>o0JQCFlODpBTKM zll90+Vy-IqWV~8Bae&2=^Pk_0%kdRv7w{*M}9RcrCtiBuvhu{*3}zABlg%9FtSDx0P9BtBBR?#r^@+qaVGyYVxbmhC|W)Bk<=xBs?%yIF5*9P!##`Eh5A#0dxf!z?Y zcn9%yeH|ZIFK6TOzb9i|fIS8_s-|7_@4gT1a4-%Zqan` z@9WsXHt?(EnF9K7V@o7UoEmtG1j0ZUIoUhFBO=jN#51t(shX?wNpOMqkxH&?LwT63q zcjox|c2l%WYlKI92D*@^E0cY`!4`5P=u5R>4|%hw*9Cm5ti*-RQ-&{8!h6ld|9+nM-b1_3LBrQE7ps_)O603u z$a9Z^+tz^pKIPe$p|RqF@G|svZ%iV#Je)@pv!)w#DVLZvQ$mvDzVR~pU2jYr_CZPP z%Q*I7h#o>**tIc9?7a|T0I#~^bIzjN#N}`0Tv+O|KjCfgPy0lDmYkh#;y8p5Ur2o5 zLWnig%6mhg-P7EO*q$VE-HKh54f~Vh>Z8s?>{=4x587e-7NXxo8$)8+0ed0FP1q$U z?oe=asJajwE%e07_)45{*b*JbC!Mos-WS^zuO-FY`>YqXFp2b;f<3&qlrjl1>P5lVu6Bj!heA5Not#hphJZv$~@r`9&8AnHW+ivX7?(ENO z@Mk{l-vkaFN*{t_@e$K!fU90fvZ&SYKour#wd)o1aXK0N2M?81Q4CBfax(^TFAU4+m+AGO*sYQGPI7xR^$=(w? zM;ACY#V8QjOmJ#unA*5~v{q0(!6Sa|CG4>U-qD`(_;6(7+p&RtR?9vMSMZgE&&Xwe zg_BRAmVGF^g#{iXy?xSHP4+bSSoUfmxT>4%Uw-hDm9n=>_@OVVoW&j&IxG8D=xaTE zN5cih*LJ@u?8%co*}rQ~j=dHy(suuKKqkqxD&r*&Z38^A)1th4EnoOt@rB>x`n$gH zvZue#w;j1O(M7!baN^xZXn(cY)_rNSm0cu%@dff5Uiyh2{Ee4K+?1oa@TVTtD_0wX z-+N<5sMgdQo7F*z?+|m?$Q%Ouo<_c%HSo;lSHiE1U;S3ACN{N_Q@hqip1*v{x;pxk zv6ywP$^RhkuC*nQ=P%y8Ps|u{^GH3xU+3Mnb@(Uhk`pk_e}A*T9?Y#LIUD5}XFXtOAb&HondRm#E}6mmgc zJ3r80A0Ew|jv|*pfyNx0c?+c9>&73*k3Jis04uKSXh3)jjwu*&W%PYcN{pZtWi zy#9ZP%b!e+ga2_3tpC2i|Nnc}z$gC`+{7N7HO-%YplFXj|G@0t{`>=TqLEq1Kk($u z(OPkqTPrChrc^il1$k%Qw4s;1=P;?;gM2;#G2ylPAE_CCy5%Z5#Q~ZEARyjeOncGXn6^a`<4W>;sXr zS`Hs7)q#ta!_XY+@F1Sq=Jl%5ZRjRmB}cTtQZ=;03%-XB)~k`><=aFj@Z)x*4QcDg z?MNHamSc>v?q6+7+8G00Xi;R3N8+0gT?2PjGd|HTL?M4!Q!k;0+(IM1;Ks{%0~71{#+2mNG@Ql?~r^F5+9@? zvp{Rg9;LNR$?-j7bs(2?DHhoA@?YTR5OPXGrb~0$9LOzQOu3~i|2_N{n%9sSu8pKF za0L%hRzHO}92<5u9!ru zefqdWAIqqpA?9dOpxq?e9S~@D89JKadsp*E91P@-AP>Wp{1KAJA(%g+%8YM)6uKz+ zB91~A#TP4%w*2`c@PEHe;_tN0AAyfJa*D(ezh3@`8fdxr$kf1Bn0}Y^A@xP{A@yJk z?(64|zz!XGPjW{@qmLH*)x+oAc?w&KQS<|D&_~dZ3m;qd zgfYwF(oI?}IKZUmiK+|OXgsd?ilOmh!zwu=8p#=vL;R~oaz;p5#JyllnT2!?i6!1Pcf`y1>pqVzTHCtlVH zZ1ICRBP8~=V?7?|U0;km89YLhb}d$gJN=$D)kzvPTK%ih=v{i=X|9f5uw zhJO8$Gvb$=5x?Y&@aH=EC1=FdTu1*>&WJX2s~((_{F|X>&WL8@k=VY&v?k}>>C%7H-cC}#st%jQexFqo6jtS{}=ly^ym7ymBhX$rnbZ*_UDTDKz%ciE8=(`3%`jRew?YC#qK7UFX9|_IFd8M)wNB|h&dy*#l-u5lYJ#Q zBbE~L`&IT=eaAq~h%V^txc?%$4$0T>BKOy$??|{;>^l;Se%zB>1V@R7)KT&>;Qv)a zd?d*kAu(TDu<7|*c_V7jvy_e{?m;ucO|(iBpy@Syb(w7C;MUEh~0lPZ^RNaZv=Uhm>-Fin810{a}uM7Z;<-a_%@ed zpB2m-A>R?q8zDN=e>QK#TZ~cS9G0_&5?ieWdl|`J`p@Q#_>%EUd%;|B3N|yf*r#k{ zugqo7SjdA^UcIxl7MqIN&5ADv8BF#Lb~$F8GSN9_dxLo+Zudy+vX=cn%p0+eJySlE z+}G@*g=XFe;EVWk;uEZJEe7}&AMh}qi@~@0YTgK*zmhj%_jU6|M4)>Y{n}6RM)dws z-U!ZP62J#P$Qu#;)4UOh_lKByBa+B#E_ov&|HH1j!5x#qhmtqq2zG>5@t; zxK_@HCeD_wn=_(QAZJ9_)tnKRn8QohqO~%o-}TP%ePDCz-(h2RDUqBJ#9Wf|%v#Ps zcG`%aN36RT;)4ZqM##ONpEKeEGfsfmf&a~%5#e%9{7>YJ=qYw(*pP=wToY`_v3--e z#6oGoHqEqSWlu%%6Wk`aIGVB$d|b?Ur2enujQE0_5#@oL5!=Y2aGIPEhry$gGvdse zYv+vk0DSw;q98`5nKwdW%n*-;HYN7Ih#Bav|A;;Djv}l25ISvt-iQ?aW6l%4#)j_|&MbntBZ7G%ME{;*=8ho8BDNsYfZE{BJC1(U{$Qt}OXT(>W%`LrO z@&k3Uqmo>L?zc8J+9`12&dj1x)jVGQ9`^SIoB`eEUm1EqP^x+d~&Wf zMeJ$dyMuXaa>xVm6z`P@O$*oy1oPXN_+*P!E4mRIEzZU#Th}77${>r)Z59~B-DVMt}&l%WY z>(Vt7+l;Quat2}(*0t*cfpS5hoD(Pu1LgEUIXO_?7bqtM%JG5nwm>;LP>u+cLjq+^ zpd1`12L#GKfwEVi>>en)1j?HNWm=$24U|cNGA>ZM17$>@bOg!}f0=osazkdQa(h=L zXQ1cCRd-9+#ac&2cI>(6Q#8xALd|tE-|#cFlz6~#;C>bb`-`a zu4Q3kl8J20`MB;vzRu#>Xs$_o?yl$_MicvMB-eh=wPK!o4IlhS>`%o%0h?1wzfVjt z&%B15RFWKL`X$W9_hk;(DuL51e)IW%TlHAaPRc0k;4Hx7?by8h8QZSQ*mk*Xk(J)u z81(~ez`nx9>%29h@~kzwvel|o)>9B4h>0?Ym?+DchZW2NF;~fNoJwxpc9eookEr()#;7Xsq_)h7!*9i_-a97>-<8Aa zeG8(A!+4a~(s9I=-l^s-Q)okBE#k1lZLd$`n#AYs%-Qo=Y!0VEKemwPS^js%wsHsG zCGk8ZFQc4I_r?BlAUPTPa`rrsbI&c%NXfxO+RUjcM5B? zkyutX&MzzIcMmc1?8ws5$f9oI>YWpR2xLaF5ATHEl*FYzJ5BLP3^_ON1!KGIVSd+w zGbIMB>7T*a+~j85#o9^isBHF%*kodNOKj_zFYN?py0J5|L^;Nuw5|G;@l%LJ;}P%u|D}+n+`k_0uQ0+CnN{0 z*q3gk{}IG5Ovi3`6Z`&U_I)Tkm>XGM?2tDxuAA7`irc@hMV7i9d*Th)@^8Zael71j z#ygU8K%tH4z=YU~<}nXa-^@7n@|@Txzsz{{@gD1ANG$bNm{0P4;74|d7=}mjcawDu zH98Y-P-3CW9O6@Av~G83J@E$_jV+1zhTvC0j*qHR$?qZd&CgQbNk3EQM`DmQZFOn~ z>1#H9ftSe9?ozS$)En`^D5Edz6^%ynw2NM=N#KoVL~kT;*Cjnp-H~rQB7P;cYn~YF zWZgX68$@}x`OFAU3gr^)J_l1;us=`7{=D{-g3T5=*|7hs-`d;AS;# z$nzcXrNGaLHt0iO107&CZPSn5k#=dHHj~Y|l{Q+@LG@(aEwm$kM;qx!V!3akUwP+I zd4?E{7Bl~;_$3jGj&>!EXfOHzHuZG+W=!})qvYVSi57mIc6ze1FjIYD2YOzh(g^D13LcExJ;CuzC)* zs%NcHmFKMP%JbG3Xp>TD+ACW8_KCm_{#IA*6UD~YiM`?#`$YZ+?GtBpwP;S|s(qr2 z_v9X#3;A~cw?5d_?`Jjn(Z>cask5w`{OIF@{r1UMZIXN2;z#+v({ID<|4!wGMOH^w z|8;*`@;_*wTxeCg*4iASu!)XSlvOvpYP;u}`Op6P@NeKt?}I6`&A^wb~dG`$O9fy{G zbzc-Rca-`N&;4MVFQlV3~5j}w^; zek~b&f8O*&atX+JgWtbXLC2kDb%1{y>IvjqiB&6jj2sb0+q`Gu6Cpm7R_IBh`T)t=Kvy69-rFo*l>kED`#ZcqQ*y2(&)?hG>)C-^Mq*jE=Y$ehOkoEpdv) zPg#6GNAg`oT&qM67=cVC*P`e{@G^dN_~3Lf6y)q+t~4jS9X^dZJ`R)$Wd~ywdS?Z= zj)3m37XL=*zQAf1^n8xK`0>(~*gv``wQha2LjJ#MOSrt#x^}SX7qti24cO7Ynz2Na zoMCSaU#uytMH&7t;qWyP@N7LOvna(MQ`RpZ`Y5?hB%gug;26ex!+GZfyqRx$3_22G zSMyxEIZpLk-uXSc*59#yZscb8CiEFc)Ia<#hP9LD4yno<@^#TBzC`9)3=FJYI`b+x zQr2P$bF(_sf&HU{oEHB4B+wrCkRPsHHgdn<#;NrGsMCp`3;uz;yZ=T9u@2j=T_Wp9 zY<&7!6M?@Je4!28_y%!8{dpfc7`4os@E~HJC;m;nSQBrIQA$y&Lp!bG;=e%1&8t@aai@K^T4V<{WJL zbF~uI>gW0$i@(yl$Y?%fv@Bax<;A~@(l}%FL=CX0-&`22U7nBKmNl~SYh<=^ONwVc zbnkB3PhgPn8lpdJ)2YB*e=Hx0xr!-eRGkNJXLZw=Av;TfWz&bwSkPObVo6<=oed@U<2$CrkWd_DMWS#^$QZ}lXP%R9s) zI*Xy~)i>Fz=h>@oT4Km0=%{=$Jyh-d;!rKq66(p=J4`z{PVp7+u8;jHvP^*`+0z?5 z+XuWd$71&^hxV_5kA5B=npl#akNJO$|KZjc&qDq$<-hnFN5d1kiSLjE52ErPzk|wF z+M2%NQ}qLU@D*#a=bX~6^0^yQRcRAk<{83S``#NA;u$K$%8!;DV8qHlte#GZHghD+ zK))_N4KvWSzmnocHnkge_?ww4QUf}lIOARJlgG{Y9s1)f2`+UQdB7`pHiK9=XWA?3 zo#a5S;Vi!owDrq7+~m+ZM4n_9dGsRH{>09aJilKtW^%$96S0Fp2d$F>1{-OYx(A=j zFz_(rqF>3EZP)GSkJp>GE;=moY%N0Omb_MLX-nqfG|$Ue!pO-XI<7G6y`^o* z-6Z<0edt!~@LYnk?eJe>(`-k_5P^c;)_dvxknSd<3aet3#abZ4#6+_{=!)+{LdWtpGbVdqwon2`hjO- z3zUXU&=lgFOeMxiruQ zVv>oMkVKA#WWI&_@KNFeUhp@3z=eMhzv}tOjL-fmL0y0x`C}jO>CjUL{R&?yez^7U zBJ&x`v%lgRJ|r*mj$glW3?FroLx1W6F225#86SBG;jNR2JtFox_<-}i#Ai>(=ZKsK zy7<3K-mL=WS>mUN4#I_ARpwpd9Z5daY^#GY$T}RsKhJ`{oIR-bVTSI=tt@u=~L+XrljsB=NhpKj5P9Hq@k}k2~4yCBS9U-5!#hJ zeMe|F8{Nr9U_*G^jlj9+uF_4JUvv#0n{^BQ%6$v{%6-vKNPP;|ML$8j6yu1r&$mwD z887{10W+&uVg9>zfY_&j+tGjm!1b- zGPw%S=j>yyM9)c{L1P&BFrEB&d9>RZy;&%2W}ruVAHCat@~^#*ey#mOagzJVc!_x@ zSDyY7b571O<9@~=_0Q<30Hys(X_xlp+`PShKmAGlefF}{-)ApN{Uz#o_}kI1UI%}- zk3P)YwPw4Y&~7_*HP7y{S!i4Q4W(^z`k8I}`?{aLr2anp(%<$Wvwj9VvWdAtr{tT- zcgorIOFSdr`!I9$9Q*eHTb!Y;l>CA1^!I?{9l-FPRvyHLEY-M=e(s^q&)7GDlTLHK z{RGz~-V5}Ts-IGCU5Nf~kD~oIICuj%`7_3~oBv1o|1|eouy1;r|1F7%@ApCz2 zKh84}|7#-USjIJ)aSi2uF8AkB7Ew0#57p)})*{9_jb~=_Obq4uc8V{F{~_Fq;a(TY zdYjl764wR$sfJH-;pv@v1GY$+*e4RN2HiwFWqbYNqG8$&@2Aj-6eAwH%r4;hr=VX| z;1=jMHc63`ir$Ppl;9Tf5$TTV5Aly~XJkPaM(}(lJWLrpgxJWEe}^)LGK4aYXT7D8 zV@mK)H=ZBI^Yz$sofCS4JybR^bs9F0&`e!DIHfV4cx+PMn&TTSwEXx~deHtZfY@mtNW7CQAgG%6Ikh_!L#Pv)JW=)s1e1Is|J79B+f za<=er!?6RA`f%(*6l`7P+DvQ)c0y-nU^DPCJcVNNmtn?Gt`Fl{2JJ|Wzzo_1U(klX z&Ed%8@_t63%?#S~x988}D(6;@V^bp6%rh6x*YY^uT8lna`sqyDf)6BDxA1Yp;OoRr zWLSW&yP1BZezVz+@WEnxB7C3pV>cd$e>CgxidWn8`vlwJ8`J5}#GBAd;i-o~FQtAn z{Yd?0`jNVwexz=vAE`eMjGOlZ?Fyf@mcHRz_44igv^VzuhbBJ9C5%ICAjg33pT;iq zb-j-^4!jSaiEdtaglJvc+*jN7dT%Y0zMnE_Ta;R6@|j*gpUL?hG*9o!oQQ5`1Ltr- zdM10x(U}|$l;WTKQ+gJmnK3?~V~yC4*RFYb@P%90hd zUW3m)^6S^844Y``)@x5W)?FYDl3%X%U%L_~V-G&Z=z)X|*4l^>V7BX*ef@HBAhuaR zhRq4fDIZA;n}+R-C(Kno*}C&rxoh?e9w~6Ha_tF6xi-yqBrPG!VZL`09swr#5KL*OyJT zsdw|vq8V;V1sa*GuSG81fvr-1#wa;r6S1|z#>q(Fyj^m{N{(K!uaX?STd?<%^YDGZ zfcQ|#IrxVHd$jQ!_VE*FgYoD~XhZTc(;oVGe{9D>+LK)N@yLmc7ds~Z*{&0LQFxLs zXh-q_$AL2x@JEyM!C5+R3*RI(Uvhbniv?L;^n-^e%ZLTZ9s%da8}O3)LHOHB_}v1N z)>ye7Yc#`~h&`>yAWhJTgXFpsoj){!lALYiOP4%==$%X(Sm94Y(Z32k8fx;Nts~DF#3ab4 z976dTF!mV#ALswJ{tLAI?C%=c+l+ra^mZL*ZtQbUAMkTu@bG&0tsVCy!sj8Y^2}Yo z9j3|IoakHnvyUgT-v_YIWF8KSJqbFRCBTu$nNG!7nMVDoNzug7h$aW{PW8leMK##> zrP#WWcNn|RB>2EY$^=TMF^e;ZhICy3Og95FW~xfl#fx?Lt{kW z8UegWe$a1O6NxccLjKK5@HY~F5M3OAe0A9TCb(i3y+~ALc zz-1)98=1sYJqwQ{vBonk?XW9K`TvM}^ROJhcYXMJ=H_{hlt?5=8B!=A5oHcVWU5eP zhzyYuMG}g~Sg5CmkU1eDQA$cwh7uYyk*G}Xx$^Pddw+lXx8L_T-aoeEaP-{My4QW* zYhA;6o!7NG*OFuNRf22GVLSChdr>>ezR#@3#y$L)@7!6R zh;cEPO?VdbwgK}N_s^Y(dCTg#HexP5=4jhLV-Q?zS7twXD$c+jB@98eWF8qLy|*hP3BaL@k*&fd(}CIb}7dE z$53jou5xH^t#)X)fqwe>(V_iYlS6xV=&wL*ufkte%lX4ahxYeZ9op|k_<;r1ptJw8R!zpCDko;iv+tb7RVSW#b|0$&p#a!r+;yuG|tOW*I2Mp8<@~|J|B5FfH zSIMWhZ>M%M39#4IIzs)vRH<@)h7W@L0uRYONLD*?StB@7`s?2?729yAMymz z*X5AQ3~!9aT6JtY8f(>kUrg=(BiLF)sM)jW1@^P{?_is?kM_W|QovlUPo(y$SauH{ zu%W;A$m+a@6wk?OhD-6x?7G}dI-T2*u(A9s*gcigcf-#5({@&8n}6D8^~7YQAL1a7 z!6Ron-v`@f;FDv%rB_B{z2(kl0!I_i1FmLz!(3|5$Ng9=HXrw6``RG;8*xvzuMy9{ za%0$j=9e;C*9Yy^9s_p+cEa}?4(%Pc9oj$UI<(goV4R^IC&Lj`Py<^I7!JOnl-0zR z1Fqw1st*}_UtEXx_~U^?`%&cU6#%K~1%`5cp$z)@ zNPKRXocKP@J*!FhD}%bD0>lJ#(_>+ep|(?Jd_W!X5B9rdt$ll7{@qxH(O<&$7xaN~ z{(Iv7i-3Lo@zcuDpEB5z>gjKlQ5ym|Z0uTfIrKi$ zXG+*t01Sr3IFxbzePA;0HMMYzJ&QVckD55feBdJSMa=gi7fl>Poh{VnjDlXQhi#&O znw?Agi#mPUdPmgm!@5pZxX)6qqO@L{*$591Bg2|{uxskoQ41QftYMNi){Q6;=ecR2 zjyy@OVeSil zD%9=UTjiOq)a-|!*9C(%i7gWb~zJ0}0}i`d=x7L0?#d<0f6m&uclo!At{ z%wPKi@3}$$kF62~+{qm6Fd31HHSY7^mofPniFwFmfiH4pKEhUE^6evR7$&#=uFcHk zU>)qPkFdcyZ5C#a!QP3)IrYG-UsE$Hh2JN$Y*&%4(i_18ZlwJY-!1h%@Uu05e9ocj*w9EFf zYnkpq`%-1((*_{MQx$FBJ_$Z2;}New?zugDT*Pq@r_o^TN$qi8wjJ_MP1+E&>&4}C z?yEq%?3@bpCzJkgQJY{ZvbtRT(f$hL=U2ztx7$N!qYbGS^7KET?x-VlH+b3Uj<~-i z;%APyFWWZ8J7wF(c!z8|6z#L^P_*x@)TMLZf7Gx?4msB8c^7Bj?udLF#`E^ZdOahN zZ!;hGy(4nm**-_eamGC|#(QMjMtFye3%V80hd7gTE1nN=rF2%`UKKH(3Ms}heA6oV zDUy-E&{$n)dlHDfkbBH!b?y~VH*&LmJB!J^iykNOhJQUDF)_A&0T0-wpQ5019RLCF9Z9V+0Or}yJxH~;UgZ@1NC$3s$eJJ zSZ(KdE|EL&_pdKnmxvm<-{?=wryAT2_}TWr%_{sthIz3#P%rq~*cZa~Z4Mb$87hdW zILGEY?BxFoFYJ)pmBp%(fh(~1l;M_WyB3_o@|jG* znS9X6nG|7-$p>O{;4b~_>?N$uz9nqt%zwC&b@=-hoJnKkCiDOY>i$2RMH9&VUXb_C z;CHr8RR(WTSsa9G zEE!{pP&ZP-(``$BzUyi7{G`t^f@hyialS22Cel<8|J0Pud>;Gd<>zGVn}vN#;}Y4m=(E^7`i-;l0lDo@3v?`elrM{qr0(Nx*Ncn3fkznWi4r6inKV19yu)lzB zq4qd<`-q>j-z*M8*nbCYb76--ej+Z9JOS7&h}(4L0kGKoTNYEpHskBFZN{r-I>`&R zo*`l=chCkqewVe4_&t-iAuJw_vDGPy(I%74Z(-Z8Z7!~Fg1z%6uRss`SX>@)I^-41 zM;wlwbC;ciF?a{}P{~Ig0M@q;LHkV@kL-NLTL{ImDBL>=*RdP`b{)$BVB6e(wNr}N zzAoZ$jFW-9na)1&5r>Db2HU{}*NBJ4H>inj3M0zxdYD7y%mt%4D0zD%aGuE$@GMe2^>TY|NqM6f5qmLG%$7$ zW9^mM$v-CEHgHu@ml$LIEyfs=!%P-xb7(x{+En7$Umoi5Dsbuk;ol^OPVMB<)kq zzhO6~DE-6r&jB9u_t{xKE6ZhNYegvn8}b1rc@fx93$P&xYQ{KW&an6*lT%FRvU$~j z{-ki^a;3nB;4|a`56Z2T>f)L8z?sv|Z5-htX?F6IRJ5?T4vUp=cIG1n0$&xrJO?oi zBj80!DGf>blDcZq`o`&@GV%urCh#QehwL#y4QxQ^rdu#Xc2a zTi$r50i=@R4ZL$bFwT)=x^o-$Z6$8XJzVpS!_VDDnvr8*L(PWm^b)pLa3J^>owk_i zP9vNPIgnBbJu*+ID*gdIa+YJdldxZr6jL(c?^kdY#jiVY71NzHz|`b`gC~Q3XJITS zP6lso6@20^R@B}GUoLPySKMOE{3SVYOD|wY@bjwSKZS$u@e(??dZntkS|0g&i1$B$ zUS@tsHseYFU+ERBD6WQYb>3_+-tiE;W8F54we&mS2{3yReU<9K&rJdb;}7my7V_PH zDRIT+SU>9u`foa0Ra~P??HPE6bo9m4k1MW$AC!(hEP*duGZ^cR!MANP7D(oU1GftP z&m!pY2wYnOA1wmc)rhD)5?FHtaOMy^V+@|}Z$7FG?l}RopcgDVu+lJ?i!}Bx$ zekb-vVSfq!=HqX(HhdVw(wpJS$aCe>o8gZD!;&`3Gap1Hy&1ky=Qey9wk-o3xLN(r zZ*z6ySKkv1#;`Rxav26F;_I^zDoc>NKt z1{Nx<1D1mIz7XHhz+XM-KYmjB8Q1{qIKzPIMfUAyz)NC2nmG@CKKwOir!YU8)lF)I z55;~nJem323^U#dxo8MkC&BghuvJ+;AB+1e#aQm$TS3g`sxSV_{4*c^+O3jAYe`C| zX4_wR*Qu+Kd;V9iGMRP)|C!wT&wAAYyf#I&=Z5&t3dDaxkfWr8d6f=%(E)ie0XeiM z5K}$Lo8AVFTI5W~j{5_3#f>6Q$z#}pYtXOL@SpF(cFe*!=*QMm!ghCzk7Dd&a+_dF zzwMO6-6t~M0plE8hAnY|n`LK+bx)W~QO0#GxURArK+opH3Ha!$GM?)8n6e?I}MV=VBa2$zik+Yn!pOSO-0TeumBbt zU5yyuv#Iik%g7^6`3QMEa)?hdJ{f9O!FF6VS@uuvCTvB-62OVo?BrE!L#&47a&7~U zMu77)aC{)*i-W+)EXK8nN1~WyOZ%`N1|QGDXiNkLR<2G_zk!>dj=7<8Aq1!zj}ht#5l6xQb>D&&%`*g ztlk{kX6s@xj_d=p&9+&*jBOjCZ5A`V4~*o$b78Lw(=TBD zvbs<#U)2}$B^T|(E=v;0*V#6W#8ZvK1T zf|{gG%zUx#6Kh}-6a1OKGDC^Z3hrA5~yD z1mEZ1bBe+c-(|Vy#gLf;@f|d$%3>_Yit{kn*;t4I9tu1$y$G_c zWdhEFd}EwxnhO3S-aD&NMmWy&lNEHwNEZ#nvNgnPoADiCYr!_l5mzF&h;ceEq8*l# z#%xd{T=$>z!mxf0_A&eLq4+Iwi`e=)i*c>UKn55m^K;by$u%j4pMzXw+=uaK*cwas z@LifzSxj3F_}@dZ(ok8%>tx09xSshedmtCiAm0l)x2Qb@Uj^HJ^Yc0}MRRP&u;cJ= zmg1XFz&2Z#l5OK#N*}`hW4IH;{8=2F`8skq-kAsHpwa2qu$&@!wl9BdWMBNA0KJ|H zd*z(tO35eWcvwQWAD0i5Btrk^kJc5da^*W^f+b`^qm!aU3D+|F1=t#NI6u;*Q@`_( zXS_MB(Mm~j2FK7h=zP`4`e0!59A)Hos6--HEwV3hBWuseNt|Ij)LfL8)Gmgth_UlF zksH$jER5wQFGrU#C}?lnUFe?zPXAY+epYm7-k+eV(1K^>!-ELx?Yim=VA9je?B=nNt$fOcGh%%kMZyU5HdsxR zXh9Yqg534Su_ZWGl_-z|L+>AkJl0>Pg1QIbd_XQK0)f7)_(e0p0;!dPba+v@q-z#D`vu`I0Sn@40|90vJEx;)3XC0 z+aTYDp#6BPSz(8J*zokFV$9F-<+7-~kSjhKgj|2jLskQ)Obzl6a;ij)?UNPv;PFvw zs1V2W(`}jl0Dsa0eP^|A+|h5wKM4cg@BuP64w%E`{G!-U@JgzH@$Sc*X1o+_^wS+} zgaPO9KpSXFYKwld{6ZV_)d>A-1;1tnun)G*=qz9#sLLRY=;Wt?(+VD0HsrH0bU_vD zym@GA1=?XUe+=HmEVSi@c4|J&MN)xln`|dY*xH>_fmagjlo`M&H{o{>{tf~TB!l_~M!uQ@nQJ&KUOM%-|<*nHA_)k1^e_lYH4WC1-Aih@z7QY&efW&D1L!@8_0>lx+&V} zaliziKk>Uu`rysr2I6BxbTT5T$0aW-(b*!@^tNcIji(u>hP+b%}? zo!fX0wtWfPNuBrBLYrtO?cgB;{!NDo&w9Bj!8=eOo zcOYWJ->OGTz9P?P&}BCQw?VL~A@JnEa zfjh<(5BA{V{pm_!TXnt<@S)SKAzLu+Q9Ff;XHY;p;FvFv2RG*t-WzhW7s+9aJ`~$5 zkVX5s;y~2)dWLVLh2w+V<-~f}XS76KtcQM11@Ai>^BCMTaJoh5m(V9RuNa@_8{{Ul z4gYNGroWYE*hBY;tY%6DawqrUU2V&AkJQ9pZ_JN<$T4Hbm_9avoNA3#mkfj~;-jC8 zcLw_ta-B`BS2Q z?8eUZw{f3EkYO#b)!BB--704%l%lpGa4T3&j2OZu4f3bq6humcy9MkR8_21#IRbX9Gwod2Y^RNEXP6e)i zi*uP?{IizlA1wciqcEld{}Xs@ea}BR&j;8wY=7r{|8QH8P!JQ3`~JBn%a{Js)}Q;a zKKwcF&vooxf9#Lnq4NK4b_2Tf=O3`(|MJhIW`FeEv|i^&XMNf6xhcN+fwphJun8|* z)9vKfD5@-0uK)dC|26#A&EJjxwq4q}txUiE`I{ItQ~l8d9^G87X=|Fyq28GsuY_s= z-LO0Eooyqc-&fw|4>Av5?lk>a)hpjYpG1c$uRLc(it%{e!4LA^l!<|Hv|XE``}fwPwfi>08gN zEi2v-U3D2QFW*Wuz~y9E>;M6cAC_3uzJX|XjQw+g4N*d1iMA<_%?%&E^fDdJC2PIA z6;G`=v?aQC`%_mwElF9wU7*IHba(3kCAd|$BQS5BVvWLf27Nea7R8xxy`p+mdm5;gq7Ep zcymc?_Q`i^f`F`UoRS%p!KIN?kH7jDL}ctRQ0>BRE}4h7?rL1kBg5qy1s+(5Fula- zWY$&=eQp}`enD?8O`)mXwxYU^$L^q`pMd;dzA(HxX)1@pw)WZbshme~aU;^TJBSR2 z9KLk;tB`huT~wTf?|I|mfe+H5e7c=Dao-aUE_qMTyB0WIM8%nfJ+HfQNW-Cb>5vf| zdKkL*^sRY(x?nUQ}A_Jv6)Af@1H(vDB)1T#cQ0L zWjyLXC$>1Lf@q^+UjEhB9P0bZaH3=ife@X2;k!gc7T(FHcPddZ#$nF5L&GV)l&a}m85(=&BeFFuWR40q`&(?(g*O^G3g{H^OZ{X`;a?Cs41Y&jxQ^lfNZ zj`4f07Q(cbm+~VynV-nH1>yh zZJ{Nf;*OX3r^jKO*A=Mq@`QBo|x6%t;TC|( ze0wHKb|&8QaPv40g!6<{6}1vo!GDoa|I^05%d>w!_uu8)vo~i1McGz17lv>nmQDE~ z_;-2N$8btVUz@z_i4T6R-Ft?&{@>-_zlpoe|1J;z{rJDj$A3TGP}J(7=dI>ma`;=q z>-N{EiSu9nsnpqfhNS!?vMHL;Z|p}dxo526&Jz*+&KWjOeiGzehsU0raMAyoynDXF zF7`(?pGKu!`Q=c+r8RmR<+`|wsCmGIDdyTDdb+*CJ9CeKlAm1~>2-=jQwoo2=I!7R zKh-Yf^)&&#xUA~hoWiBOhZoJ7c|%BZ*NabGOy<&NnWmW+r93((D8HB7$|u3dC!*x* z0&=TUpM4JF`+rN$9+UmC`}!mvDG8EJ-i{WMe%z7$&VBgw^XM48_pv;3HyEH&8zQ9J zI!gp{0{k5?ty^9nA@%HdnCGyCOQ9cDe3>_aOS48j_+qt=OR~S$+^hZ0qmkqL#rvHj zdLNWNN$o6A#D>O(R80|08Td8#NxSHOO}<;M&|LemkxveyPnx=rGt&<*Ejzr3L(8no z2V~CSQ&wN!8#4?9bTVpV@D(AERqyIi9ovX@`g^{gsL7!{f&I35j^vZ}JH2}gB6+l8 zd>wc306tyr?={$Z2`WHkwW|r5h_>~d^jY$WsH9mEvs<3?zou8Bhri-4f;<`&DNvg9 zLr98wX}c5_^T@&~|KN)_F6HYB*USO(QEI)nrNL7~Q|-D*2X!GTYjtmoZYCOBa$NmD zB~gW;`Z%tHM|v>{4@+A))b^ue-#S$h-QV^0QSu8eZC8*@yD&~f_v-K77x{3h>tPFT zrB{3^J=NW$FrQ0hBc0~e?&47K<#KgfwSTit|)&9!Wi&o&;e5V70gt zYEJS3I{QUA{O(IGSq^J1S)<6K2k(SN+N1asVcu|Vk{Z!0*9P$qYXMnLF0h&PLO=^@ z)K>T?a7d8j9(o+(b6@3HnNj|HGHXpd<4eZ9Xp_|64$}MPFy_uIEx#{i%%AHasf+7UrWhMns3I<;dnB z(falU>s+=8XxQxbO6@@$x<4X0zxP-UU8`R)(L!ECb_;&&)-V;(n%M_=!&d`MUMx+U zds{%y2ae9jnoD$d|Esud!91$@eW}D*Q%FM!FPJB2bLr^$e!_z5MDE|-uQ>dZORrv^ zo1A))DDIu^qNF1n+CA;*RAGmZiXG-W)!izhN!hDctqJ7Oo`pR$a`zK0Idi%XK0i$w zn-Tg6^J0`xu8Zp!A&F!I1v768sq}22{m+A3*cbdmuRjZDW|zG5#!L~(^=`XxB9Bke z7qX_;eMe%e~D4dYEtvy^H2H0!nQR)DLQGUQ^qeoGk`2d(t%efaH~EO1e4~hZJ#zW@eG89{cn=@i zZJUVZj>_s^w?;@?)vJ@JgGbio!w#4mb7+@HzIre0kZ$YOYCLk{(vu%Ge$&c@w42}Y zcCHzR_8Rz~HQB(U_rcv)$ikj+5t}PotmMU?Dl};)~DzUi%4 zzno9I3us4PQ|iDmd`kbkeXQee4vjKb>b|8N-^WfTNpBCIn%nfEre5Wc)|Nq2qVPUy zhYhJ-pidON!TtPqELvV@a&`MPeLkheEZQ*Bg-7?44_qnYmDP6f?d8utp0N1MqeV8cQQc4+aG+MKkzgDAy72zvKCKecp0SdM!#CmY)LJ~5pu(qX zzOv=Qi5%*2{=<&LNE|6o2rri6K8E|f_NKw_d(<>`)@&4V>NB#3>YUqLnw~m+u?GCY z{x#bVm5$@k&ye#AAJuWFwL|W_cMj|o-)+ZNorGU#5Z`nPa^u78@ph@OKl+AhoU``e zQ~hu8#w#%b^1Q5bY{f+m4K50evYaY{Ulemydjpr|iDkB(AI%{SZ*kkD9enB#Ukd4> zD59QYVm5AihWGq_q0!1r9=TTN4!QnbK;M!#)N^0+sA=!Vq2?g*j2Wu%tb3G@ChiD} zP3{N(u4UToqp+8A51hO)_ZXl0%{XijHD5r|?lm$O;xV2E^-hiU6p(4Kq%a3|!s>9- zrFysvP3u{chYHr7fh@ycL1g%^ZsN8aK~*sEAJAei=T_OF&l^Xm2Pk#Q5&# zYbgW0HQMdr=<Hi>o(>R=qt|vqP3k{p#z&BH_p6zYShE6Z$z|ySq;zzIT6l z6G2)n{O|zf{nz`8Xmg(V(4T8XG{9NyyJVk$nl&GV?CwV7GoaqCP(wtEA3Z4?ZcjA% z{>1GA&3V-O`lns|77iJUwQZjhkK{Kdz7PHYKOwaL)KxbH)Ms6_rV;%1YyGd^xITkV zCIfUMJz-}}FE)stsKuwvLgNb?ZwTnFOPcBaLN2vf^uM;~44)>Q{aKm=yRg^b*&Y|~ z2uW^;C?pB~&#n27vKN1W|9Ho7EbpG!2$s;nkG%>$mvZ#@$_Pf@WS17Xe@wc-2 z;z!tB6%xPx&bv3?1+@2uK~DU00r{1d zM~*oNe@j>5`(c=X^u;sv+C~$_IvCwdM$s=lE47mox{4^_-iLdYv0N(nRrX~J-hbk^ z*B#ODt_@!+eIx_tEwbk)Fx|sC4wD~*qZr+tg>xC%JeuO9Ex0y>R zZz#kfgik&1&p*ER0NQgG#nh!ke)b4Y&W+dA^yOZH97~%yvpKduhjg<0Sq!|%q42s0aS-f->tpM*Re|SxSR@*7#EMHv z7DFe6mjWlyuRJ((1n`Blk^&{@-{@VH1DDteXvIOJ9VaZ|zpPw+WT*v)9^IQ#ON!9j z7XGSlctVP(s91A%7>^Du_^o^342QBqT)&U@7gEBn>y1P5pjXQSRxS{6C`WNs-6s_h zy|KNPy;zk;OH{^B9ytVZ@yj9e8RE~2LQvc|WT^J$3lJfA5RMB4=kXWv8bbKCun<>*8H=IAb1HHgS@vYT@C zTt3BU?9VZD=F%LOee>$k|8AMu6_b03Xnk$MtE=6C@60Iwstf-iN?zf>X}niw{de~( zVb?k&E}Jw0^6zMM@=u;GhisIF&M!2DUnP^s83j98cFVNu#mix*MI8V733i^5vA>7E zH=l~+OZIAFzSi6i3qFQ%UGFws+k8ETj^4SwY&h&CrCWhRx(*jno1Ff$ucvr4_l)A{ z>Dz^5Qol2JHRR~ckhx!m;eDPya4c#>kdPi94N9`+a%pl}(26TaIxbV{Tb2m$NktEA+VK+FKoj@o%M?H6>3(sH6I8VS$KF z=yMj8-sjQR?62kau=8_{9f^W@Ls5R~riPUXs3+|YxOI(3vZqg*?|3F8%W=9g!!j^# zDv$M790Gr*@mgQI=X|=7nSOTbH6h({dG$)VoJYE62F&ku5((RzMwPFG-M=~Ms^ESb zk5oo%Zl94Xgk86Jdgc#4=}p{vQ~`3NV_U$^zK&d4B1yLU7R;x`rY37*pkMM;LR{a} z2D0Ys1fJ-50nuaI}D4xqUs| zxKKdO4|c6`GlX3gF(%M_1&3b6TIRRyfPK0_`&tj+w~y_u6*~f9#~&?L;M$;{DDfF@ z!KE`lmmhj{4D!v?RI)EyL_^2FYkUm5HOnJSG+>s1qGk@6pr_5J+_s~`cMjr`{F%2h zDO2&nlcGoLh5cyZe)4F_N*>L3Dp~3PJT%JX;lUK(BcpzkHhsnT<3x>}=p&+%#<8_O zpAp?$b;=dBz^H`xWXcUq_&3RY*Bu1`HNif|xAr)Pt_;2LHrAL+x#2E5S10jk{I8PX zn(!a(qhfw-Pkc|vXI}KU$<%gggi5t{JgQx1U|h>y8Cn?`e9!;Wb*6)F2&h;rUfkJ)Ada! zH|u2ZX!A<%WkoW4n(uY`Yg-5O+3RHU9XGi2;q8OwVm#0HHjSAr19+rxH@r?0dO7)Q zkFtnm9D37dQFmcH!y&rFI6U8D#H9a z`}XyC;0aRi1HI1X@@e&C!_z0O@Tg$flbBvL(C2oNM=OVM=}XEI>D6WdjrLA2?)e(u zv)l9IJ@#-&Pi3y^!nquhiPKoTro?!Mq(xJOg}E|db~{caXX(lrhX>A1|sr&^ENQ`5cKH<-Lw~qd{TU^J^K3? z0j&fhPvpD`<Ut{yU7VB)| z(>$vw3#U7Zh;wa__Y%lgOUJKcrb3S@=#EXco5>?>zR9w_BjKOl&>p)-jZ3Xluf5iV z|GlxytD+b^i>MZtNFNoCdS>Z{*OyWKY*SHdNXY;?BT@Cu~tjga%h^)D6L8M z0?H6XIfnti^7g*1JQ;qpZ`rEbweX*PR1IZ9fAPujb+38f0y%WS=kXL1Wjt@C{ILiS z4rE1>_WAllo@&v`v7b?-qM)+S0C9_Mi2?WeEd}1Ga3^KRL-=(o)-^1EK3_IR=gx&& z_^!%cd!{yU$mxLQh+eQ?GUbz|J&z>#l^zj8j{@JHr5_QtkVA7^i*rh|8O z@<`R7V&{e*9ICDfoHjw0OHZ9!Z`eH&kfX!>dP98wD`96>zQ_Eqy)Y?B`?8SoLM{Xp z6%grtDeSp!uz(U|yrxf|$fKjba!Y@pIK_zyTa`;Q`Shxf`H1m{1oUzDjT~!?H`#GB zZ`s*!>9xz&wei1zBPl3mRXjyJWyPW;aVP|P(B{e}cSI0%v-e(pPzAX?O0YC0O-Qye z>2ihEJSs2Pa``dr#6i(Rr&Ux5DDAfa|03`o`YmeVWkK$YE>(2rVLmO~yYbsDKGiv2 ztU8A0t2`$cwxf>7H$Xb+0_^Cps5I>oTlg=tHdgnm7Sihp+P_yyIHa5%= zv_2R|=Lg-XZF)}hOm4xBE+~Ew*X>K{*0};wY|w6*;lrm*y;hw|h(R1gX^g9*nUH=I zb!2A4K2>%Jj$INeq}kh5dbd5qycATFS0nymsbP12Jmlxy(i@&i_t2h4>f!G>LMppj z>EVI-kayYbUBz4Y8J9SV8-NFxP{QWQB0fzS85Qv(MnrdZiVmjZyK1V6eLD0YH{EQV zy4Z1PY}dD47gqzXIpH*|!-Pkr=jPs>palOu`oVWg;N@MfOtBHezPg@gXZmHDfU3Q8 zzb}4;c-60SCqz!L|I7~e(=Y-asna%A=K)c;o$-s(@qFs<{%iLPB+6WN2v|0o&nL}I z)-5IX_!OWU9sdJ(UFE{W;o4t;vyDz|FB^^TG{4+?F#PTI2syWQ*vSvOZM;)ZFCv4` zts>J$7=O<%Y_z%t`M7^b(=x<4oHnJD{ftHYW_!(GyN6ur2)%Er=g6aVFCxpFp+CCZ zS#O_w3I22Q$AjNb3n|<9-IdF*qe@@4KZkPzQF%=Jov@IV+HC*b;du`UQ{HN8g$F(V0tgd;j)S z#r^oj-9~K~g1Ddg**QZNiD-_jFw#|*Xuj>%uR)OCGJ!=q!a0b)UDM8Aaa>4kJL9$& zW>~6rpN8UhweGhIAh{A4plb(bQ}#k>8bwjlwM~c{|f@g z{xsr}gSX~TS3@o>IJwZ?0rNJrputwbj!%ZCmj`UZxae`+e`X5iO>CS?jwkH>qj&B5 z*KFidwP<15YuMR`oL+W(D2BYPIlehG3h(pqDUU_Fxm2pSPxArf%Kk1VhR#L&)n{AP z^Y~x^Z9ALi{|fk-`<@>M!j^F8*gRgbFUDch%C*TeVP~DZ6*zA>;@dNP`;PdA`LNA; z!;j?w@Fxb<+XThKPTgFvzZ>k5jCUEkSEs_RE4zAjCSOE1j?e9X(-nTRc1+}oF z^T(QM{X%>*ZG)$I80P3}#=Jctpgqri3mWwVRJL{y-{lgQ^bYK+bOr8` zTPv|it%M8MZgM%tQ9xa57l$}QuWCQ^A9W;%PrI*96iK&3zE?%fu`S}z82yjO9ENk~ z0zuAcc6rvtz0nke{cUySEgpS8newgHFDH+M1x zZZ~;D;H1HbQ%;d7>@ysGkaW=5?3e0XD!KX0{_SblF~8b=xZVZsl`*zU-U}j$?xp2L zTs}=ct`YS$Uqm*AcW3uRJi}MVvbY-fuh!Y57v>5gQs2~YZQ}vpppz}0G|u8s#=a*p z`!z5x0`BlXuN2Z0-!1ClW{5A<`yX@L$DuQ4EFZlv6;Q|ZYk|vvCtqx@IG782ZLH0p z?2ZbI*JJ+l&!dyrzUvk&vsuj-7i7JSuDP>jByg1pKeJPnHai+@5|O z+cF$_@x+NaPEczRl`CqhpfBGT%pY(9ezxtvb1ps1__VX)u8Yu5NJTdlxQ6JTW!Q>! zkKsR_y|O*%KJXZ`na{g@mI`Qn_!PBb=*dZzy;jJF@Mzwa3)T$_I5e!Q*!D|f_SBJJE3AKS(uZmeHZg)!#+2Mb-7QXwh(By^wbB%q7e!jA-jm+{i) z`^~IY4vi4a`*D01?8%`DOFo4lZdd%n&NGoqZLc0Y2JA;Y&IE--G{P_UvmBo?72_h? z?7gWchc=;dx`7gpqPksJWg*8S-s|TIYDaiX;I?m1 z^z}G@gF{yPcdyojpICO)S8kp)hcsIY*H$m&(kUAQmsX6sF(#Au>o;?0+3O?aFMdL= z#-&GXpDLtZ=fCcHu$xESeG_k`+HuHt?!@=m9|d$xY1kgVDUTG>63Q)rOP=`PArQR7 zdmV6U;5e>;j(jegy5}p0o<*)#?23Np9!>LH3H&k4Um#Whf91vRj@!Swz|U%(P zpNuT4p5K7pJ80a$bv5+kj2;t1FM#(EaU&>8H&sY#&r0V6kA@x;3=2}keR+CUfB#73 zlYzD-f6yQSEesOLT3K=_pYjj`}Db*3xD;1+AlX3#ElfQn$%w* zUeowKBr7|UL&@{MS9L}FsYNEHBpUpX9La?`iv!>%BwmkBfL$DaO#ji=SOZj{a%hkmSx?VZ>-1tT|Zn;!gwjJlQHTCKQVUo6lKL= z4)xpiFw=WJ6?9;>H_*Tc~@<((-?2l!yN22 zA>TufJy{KV$$VF&R~qz!liBPp3&A_;r4rz691c7@Tla3sJ;dAG!+#HJCMw93{CYZJ}c`b?XK6%<}Sq)3C2S?l1Zr zJ6J?q+lP_}*!SfK66B z4}gQVb-QV>8vbj6le4Wi;>>a?YR*oU0-Et8^V{Qd0&3V5q+bnxCqltCI-p5Fu@~)b zS*;=(N%LZY;`y|aGxr+!GBYQLCH*~l^d+v=BXbmonl@YS zl!yHNw#xI9Y8m9juT0%Dt^!(iuDT%*fw?X1o)as%TynWQJcC;Y`8qHnZFK~XUeykr z6xADnGOgn}gD`((tp__U!1z4Z-PUdYYXQA^Tc>Y`=U5;3+u0qwsSc6T!oX@S-7$8F z`*M>@H|IUgxqgvPrWum78eixq4=t6gLfCmv=39-r0Q}(a6H>Zu}HbZ)o9kN^&?@3#EPgR6XsFKr4taSPvJn#zid4&ZaY1_d4a&Y{!h ztH*rV3jUeP0K+1T)9m;l)g9n7$vYh1I|24b()}RiQp{`9vW$Bt@P0=7-1Hf{1$evX z$(XFGB67Gg@QhZVfP7_ZyH+_MK4&R+QF0n~D!-fmlLwgJL*?57%0(1(C};S%Tp?|= z*>bi9c+3L-E;rrpi)h%G14TVF5kJ;DI?B%-cxS`7J)1spX}4Y1@TZj`NyXkRVV9#z|KB*V@MJ0|&aw2;Xg{r>FUEs$d z$BzSo$BzJiXyDdUQeD{jXJ6jl4;=9DAx}MX^vhyon7rX3=;c={Qf^Pf;u%46>( znQuLsux_DvSBFD@2xi#W{j{B0!D!?O5NE<(?FYx0&na-Pb z3+YOYzxDnZd>S(_dTIY1L|-E;{EoeVUsLgL!VvJ^Mql|9S@sNg+A?2B3F2E5EE-*% zvk?FFi#!~UcE)NRFqGBe(Blc>L0Z#^oczy(OY8ZRM$f}2n@4p&6f1|r?^tf&{CqIt zn<)ily?wOcw|uqq+Y0<*<2awi)4+e}{{F(ZF9H$8PtWLC3I55g;IDdP#C$q1wC@T{ z@D&sl+?y63g8x+z&@^O%fZlFc{$%SX5p`c}w0q@v#EUrkaeHt)(OdG_9`@Yr(`sjG zVK3cx7{JeiyslrukuKN`o}z#9wVMfC>g{9hXKRgkLv2(FANXpmV^+?%jY3*GW4-GQ zKLJG>ZN@k1)reGZTYF!M9=$J<`hmBkWr2Ph3ShC*F7J+Nn<{rDsB&7 zr3?LZxzCcBKVZi^$cd_w#u06`*`-j0@B4G>n9Y}9Pjz|u;9AUM*yZor_ato=QI8je z+1bE*Pnw_FwEZE6cFao-4Za9Hr)cSX&I91 zIM(cS0^|GVfyN|d_*=_+PZ$Wl^{BJh%dT8}E?VHa|y zU%k{0zrAHt>g5>VMmZPO?+O9m@O=Mii+z%W^euj(>38Vu7AvzMI|blR#AxYARs*-* z>397x^yAYlWe=TzgBZ^$EghaBpm_^RAJncD(V0A9vpf6?=QDk8+;9NC?Q(GIfDb&{ zU-MpL({bpTlWVaQ3F0yDxW6J0H}I?aay7*W_Q%0752G;8I>x<7{U!%Ix?M3oR}Ffi zcjJp);NN=Ai2C{lIH+^e*QcI{x2PAzWFb+O-p~H3$-y{&IAM@c-yV=NUZ)q#zAB`! zOfJWc2mO-jXQ_ucP~@GK(nG+dKOV9gq6Ix*n>=%&ZGeE(N(2**fhW*c_~^Csc@g~x zxb|if@JG`NYfBn^1i;_UzZ@*fBmKId!#v=iLwgx~*#*BjbkwMU>w!xi41Rj`=R6_3 zGb-u22L9iUdEEYX14QK3J0owHtdPd@wt3xx9TmJw?i;57alXabQ}r%E-%Pu4a6E7X zrz`OaI#uwW0xH774)N%hw@LK|E$~=Jme*?x6VkPS_LoMGo9nl3J8rNMahmg{C#tVN zFM6(4U7ZHILlAp+TNw0)gMV2t;3D4T)mqH6 z?3O-xn5bkes>NPLN8YEuVt6RPuaWuyyW&e$mfyI5<-Ayt((*5!7uO# z%(wO_o&=s`jb+J|kC!K(7aD&HgY)ND{Yex@EwLdoNhHFdXB=<&ghO8>xtHA3wRb5ptOG;-uW@ z4A{f+wrfv+0iQKPNnXE)kThevx*i7Z*}Ao=`UK&lP#4VJYYS=!_Te@Xy)L=E6Rg*5B3K+(kt1CYhY7 zcLQ%=$p^1BHfaCz-swq@2ThBXZaSKVI9XYS`)M-~>8W?fb^(rfSYgEI*LsMD1qF&4 z-vGZWPWo1_Dx|LqZZ6&AjX2zWqos}KAs;=Pe=2$a7jY^$G97l%jrdi)JUqaQ$nq?W zfWO;J$*!Ls;GaU$YU$tGsUPCiYx)!o{EBf(ug}!y0@st&IjB1DXkTv2NP{k168@s* zYV^-lW=mX@p@5$DczI&U0@%6s_vM0a12>-XJbx4X(V>BNYo1C3^!{5puS@{@C-v&V zaNtA_{bJLM`#^qw@I7@C~>1Sl`kGOBCvUo-U{GR$v_9poL z@~)T1mBIc~TXrSOZ99*~CFW+Fo&vlfz=|*Gg}A`>cK6-#T*{;Jc{zi5)c9oej3;PM z?|t`u_Tb(3G|#`~7Y6;ovq%cDLXp;%q!5+ieBxVe>}xO|a=E$u`~httwU!JxY+)y& zTbrg7?oJWXmmxY2_ree6syy299`UkWp)?1lgZ&!@+Y4{1sE#JnELiK#R28rT5@aDGN47dZi zG5yK2Ot;5EN?%v)>jnJm#4Eq+!zs^*ekYeuVkLbw`_le}$WW?*1-ONRdlJZFi?4Zgcj*+;z6_8|NM!!i|Q%wR(HT zrlh9u^JhCfns@dfN9*NNh;ReVvUyaStgG2G$PgCOrOrd)_dysS@0=oV)}eCf6Ey_pswTDSI^Xu=-w5$xN?E<(HE!?&L}6$cz?s@}bK zBJl7^#@oune_na+;~6=~>%%eWuZp2x4o<%uQ~N?hOCQ)dS?YuLXZgYM08d1(?tFJN z!aO;?KVkOaReTc89p5o#9r`(Gmh^rP#NUdJ1X)do{3{>wxeRh3&GyKhrA5GXyFU*Y zg>jQA(Fqt91|Ce#-3h}}U_VrfG!vnRK3WZIt-8*o`@-a2&tWGdYUbxmgZ@|QEhln~ z;*i7O7vbZcBA%09{Cn&gJ{>t48na&xyc6v$Eze+gDBV%>x!0FZmr@^gHDUgR`u?Sn z!|*=5qc?GY``v4wa&#K>W!>_KF`P6$+4t@-X9C94jdeF7bPW){$hbJh0`tZpcx!(0 zH=_P4w6)wT1+*ru)k9#yqtCkvO>?JlXrI=J!-^Q6x|Y&jO3=GkoYzmBFTUboT{skQ;F2hzp9{9)A?lD%FkS zKf-_UaDB66-ZK&HEcDl2cbiD=tE=|nTzsEOd7F03%VB1l4o})mv_T?05cM1A*&{w&NIeqL zE>?Voz0jp^g71Cgb)00X}kRj&xC4>=d!?iUl8B5-{Sl!X*r*IZIkoqDS~~yuDNz-5^%umd878eg8Y5q zmO4wwLDANGM;m&AN3_IC_!RMhCBZfUW^u@CYAWvZJi7nV8veQAhDFErJV3nqaw9#Nh!!k~ zSN}c&dPx1-H8bE#O>v)t8V>WRsq3O%0Y0!Vr6btx3%DX#EH4}+WFeNH#j$(0A+u7AXe3&00H#QALbc>r-^ zx7)Y8VJEnn36H8Fe)Lmqwu8xg;EQ{E{X9O8PghR`d_5b+oL!Q~m6}#`eK1g)j>~y;SDGs?0ySq?D1-N{q)gCqY1xBm-9o+;u zvZGkra0TLdI|4>eKaJ<9e|W^h%}+?%Cs&0xtwQ`|f99ytLOvOqJ-2Z|{*n9Pb%VwN z?+bYn>FN6&euKM=bJb47dCvvMP1w()mkz6D)~WMp_U@P4U&;&UdgaAgV}K7inb!CE z)dv0I+Fbsj1m9(V{*NdgkAl62J`C{(eqZ@!c_`v2ihY9za&H0eEY5Lnd?}>8^SZhZ z!1w;y(`nT7SHMqm(q-s_h$ic77~(OEOUYKPpFEEO?`gjOsr>_ZFGIh&olNA>Mz#4? zZLk}@T-bWf2J=I@@pHcc5qK{r5{3+hocpHRJ!bR=;ALZM{vY<m z=l=X(J+J;R_TJdm<+{%4IKIPiT%D_N9!`+-xVF=T)O&m+j}PM<*C?JCM!uP}R;#N) zh)NP)isvj#p_AO>Pwt%u-?H0ma?Nx2L1yPJRVzZDvD~d9mdVaagy;S$Qf+9&{QZfm z{qSo|_^Fg16oAic!f~^07~)%+Z~YTl7V>H7?2Wh1gp_y>9t;9Lc>b$@=}(;J=KAbj zRfxZQVJa+t_riC*u#W2;{2IK^_E*HQAzw;fN7=9pI8uH6L!NKQTYBF6$$Np9>1kZz zvIzBqa-XlLLl4kdzE#={y!$6vwzW-GEF?31U2{nQeAvnsOUlDgZ$+&t3rJ^>IU7ff zn~CrVhHW#r(+WH#FUK^1FJAw0@uFem8)Z6T)rX+h-}HFay`cwwMvqvYSHQQN9E~Mg zuCb77-JybRj$)-h?Dl?!uoCE$>&zvlBQ$wq(KfTgW??h;U3o z#~r)6Q%OSezF*Iy<`h^WcYReNd3w|?uHGET6PXy>`(;cn19es_#Y1rzwErfKGg zSI1LZD@Tn{7r3SKf;ITOZwED-R+)px6IZb~yoHdBKMw@uNCD4vJzH;t@jMv3KQ9sI z{M>@3@QFFhW7RLctS;cx`;XoURH05IC#$UJ1>%HNmRVREja*qk+j|M|K04HXGBcY- zHYu*T6Ac`eXgsH&%#Hlzm__4hITm7c*RXm_m_fMpWcUx>g8s9=a6gL>bdWjMpyL;j zhjslhGX{SiVCXY<1aW=!yJxkQqR_AZX0jQ}6Y@^2JO3PfJ~o;yPoG1_l-QejrA&cN z$_L-}mjid6TyU+{*&aO2;DKP9S@4;=qp#{g&z;?p>X~^JdEMe2V=J((f|tsE+|$A! zeeG6-wr#-Yx30EM-K3IBpJ`l<(5EV0H@$d)$+mXUe8@D;^;>soccD-Jves?^=7(cYN2Nyj$2~_yz2b^^~4Q29XhgoZRG@w zbPoJ_TL_#bzvwhaeJ<|bI+`sBxKemy8Gm~>=CONX0~_$!*Ty56b<3y(F95Wb1;25X zGA?EHoe=jQZ8aW}^LT{qVhM1QUKaGW$*QmA1 z$DV+PyZTqh(Y%pL{#@AEz5?gIa?ShG<&E&gwfU@z^kERbnS1OCajYb{dd6ENft4Jc ztJ9w4CFE}I;lK@J46=$NnN1dYiaTwnVLte zFS-x@u~SOX+zX?yPV#dPO*c`-p=#ez`Qe;NuWh zUR4U;%gjF0@IdfQCG3C2qYSC!Sx~*rZb|I(SNlD7o`SzfE@xrccI;30h&@lh|J$h< zcK8-UZ`Ch;@Ed-|Yx^Gut$9KximaFJT-pkqvny{Kds^#dpTMQec*qWP`pOvJTw_jL}f$94MS+BrBs;v6U}bJfK9C^%x- zU}=MSlGL#B5P%MLFFY{gH~~+4`|9K!=-L-sSVkhj8(VyFO|XJq(3ls#x)gO|0zG$x zf!~%~v@1M4Mk9`gc9w)94{05F@8I9(yl{eepOL{``j07>))C*<#*a(Iq!tnEY$7^KLvP)K(GKK+eS)^5;q>uS?FUL)V(vH7l8{RH)cyJVS3@Yg#vTq{+% z#!7N;$=EV->BLo)Pby{sl{m+1-stiNKUre2Q=^JOu3Dy(_DnhvOW48dYXIGe;e4TE zJM^P1gHy|uq0js63+v3I5>sWZ-R+532T{6BbGXi{8QqbRF6b?bx5jfvQOPlVkwt01 zL6dLQi(Ph7i0kDaLC;d)$MjzyX4(y3i(23S^_gPC7!gyk5%D zNy{#clflqMjb5p3Fp32ZzHMuq-VVO$;V??Vrc!1s1f*?uBf`*0WL_tl$Tq9bC40vdnOusEzi3fCj^a9 zS1G0pfa)#o9H!E4DJ?{0fq z2wu17Z~ag+oixhiz7MH~kAnKQ#`6cAlnM9i*&$yu6|3K24E=i2cP?jHBrEy;jN7&1 z5c~z9^5^T=5N}lL21kGwk1ZdT7S#l9Ja6C@i~Z!FH*_)QIh{y9YHt|_Z~mCek{w}} zd^n#c>m!PI;J-2XfH(NMoAvA_EQA;zSygzyZ1PWUCM1PVbfW4B@PA{$-bo7l z8&!|}x^Vtx#QOb8XhGiq1-?B&@C)yVesd~HfkC#jvzBKe?v9?Y@1H3^eNG9_{o0q% zVJUCjK@NcN^3Ak#+4jdNfzuoK$;>_AK(Jf){i_R_xQ}ZHZ z+_$$AvZ>SCK!g{;}S?7x^r={Ce9A)Ej>Av6eXro&I^WLHiLZ$&=doD-t@j z_lGoTf8@6&^oM`Bw}W@Rm8gFVJpG!fd*-~rtNan=lSc4`JaK2{6@cfw>QJ_C>^k~h zFa`G=0dE*vcijAx0F8`Aw#*#Hy4{&rC&G)o@%QztGVLzZ^R8Qy;B%TnMjvplQAHj_ zapA7tsr2jPfk&94G4j75Wg@*OEE!0#Kf zY4XUhz-QfK_|OaEGx*_S{YgR8X>xmS2>l2?`!s(@3hrNd{GhXhEtQ=7o1Mf9JvvIx zVju&4gsb++ds|N+4-kkdutr>x_kX~GvHpoGb7hq zf3pz9wv^)w<5|dERz-?y8jUR3zU4_wH+UjLyT;H3sEhq-vga{yYNwwm^=djKgOTrx)5lwY7y#Eww`&PfctwD#oYHk5qb9Kz1Ahr>pslIhaYM~ z{45a93-P6q*QW+Ef>h8Sp_KFS6LIjp?7T-#6e6C~H%VaA1l)c9Bk$Ss(9PZWZwm}-quzT{-pfP6 zsAIk7C53Q6Rvv@yuyq5Hd!4WZummi^^b@4;XDT)u{P z4-g#_u>;Kusl<=*W-!+T`{7ga`0{8%yvmK#&O+B|vdt= z^!tz)O!_@dC9*4jer6y(r?&6AZ~Op08tI*Pt(KzxW#KjRNX&270ba$skE!s5oYSUf zgSSbjvdPH8Ii;IL=WKw_t*NkD1^D-JV8^KynRxyb-?K*=z&~3yc-XEYBh$1S?R;({z>o` zcW<2LQwgRMo&4pTf(EE}P^t(mfL~Q>MD5RB=&0XpV>U-qS%{8#&tLxy(An>N@!KIw zAw}-B92asZ(!Ua@%L656;`A` z|4BINeH%P;;W%?g#|r4Y_DZ&q#_$#0^l{ORs85~jgle)~kakvD}L zdOEu!I)X-8lO!(6k3$!FlznM{lMt?eW&C*Q3yE+3Z1ivp{NT)Gt9QZR6Wi29R6kG% z_m7Q#z9647a!3&803T+td(F!$-pB*(BCXd8K!2R@+1}z0om7#ZQ-&S$r_R4*7I}H$ zk;F`8W#mV43qCD3h7NcpuJh$-22qgOUbX!f>Q!cUhzo;{*vh^*^cpYL>-v=|A1#G1 zNqZ=u(vOuiNxFIRVn3-&WV_vmAKoEqWv(jDIaQZTQkpdQ~@?p8bS{UR&-+FV8C0p31`Qo#?me~sm7?uBm3H!imx`Pt0E zZ{Zz}sHB8;@AZS{sH+_hO{j*y$Ff|yZ$z68J|s`SW-0u*%lp%Mk@vk+t8Hp8gx|~a zYRL)kPdm7y_Fhz_5-Sm_Gb*T~xGvgZzwa)Ect+imG2Mjwzs}LT7(Dcc;^b03;5y!n! zR?*?l*pb3>e=~4;4CPSui`C#;{7+odtt6z1_sHUB81G{N*JSf=P{|&@s9Wce-{0B% zMS2a+hxD}$nJrtn%bUdu31aad1VQG#LH~3{+^~QYz=|m!TuCnwa^wWc) z3zm(6r&}A~df*|Q+~xc+Zsm*kUdNp;10R*F{Hj~J$RmUv$#6Cr0v~tKg2Rv>sH-{# z-A8`2rQ}0}7vh0M>W=4^8}PX;9UHc)!*71L{m}vFY2R#r6utr9l2!Vc^VLV-#W@?n zYI#;7`7LsJ81nPG2S5-)_Y3&o^HQN1_&Oqf+5mnBE~oC}jtm<4^;_w#Ya7nt)&8sZ zZ$VvLW7kpZ0sQ}O7gis}hMibB_$37Srt5}a4JYK8*Unnkmgmz5Z?Uy|%0=MJDyIdW z@NYcLrAUMvppYzz_>>d!Bk`oS*B-e;Po+4?WBU_ZmP^r{$nQRXOvxVG3m@?o_TXht zQJ;}I8VIRX4|ye{7ebM*b>2+7F@^YZQsCrPoOdD(JDt8AM4h{)siq8k zpOzeVCL~qSpTKz=mClBG>Hu9EE$|h;-#^xsDn;L?j2(j!@RzL+DnFvO4*C2*+j|}^ z_-ogfI7lQwAD{9~XkLLj!R_brX`hg9#7>#!e}PY2Og-4ro<{DeE}RtELLm#1?}ZA# zM_uK~lW!g6z=y4ixT^-=)RjsWL+M-4BT`HAD}@P(d41WjG97&s#C8@o0XN?b_^HA8 zOD9?TLfcXiS1KsYDaDrvxj3~lx&eG7_hfar{|I=!JB@OrZn+L(q4!;={KZttXw#Eq#Q|PXTTdzeI!N*V~bjA^U zLS}kdR0I4NjfSkTJ@C_=UoiD&dm8jlX8S;WJ%#LfyJ=DHCg^=9Ra|!K!#^SG9u~6! zx=9uN&o}66e~ctp3UlZrmGAY>aupV`#-FBBl?A>nRYAubdB!S{v4hzvSkJbP{%!)# z7_K3W#3J|Z>PQOd+Zic&xDR^Dt^KS!cCe7K^PCq|k;guA7r7!0 zUdv@yq`{yzbeojiOI5)0)fca%^lWA&J_W08wkrc~RV1A-!FtW(;$18i3Z8cEvVJe{ z_aXLEuP*1|9BCqF^|}dJYBt-e48Dk6|M;=XFKDFa{>;ib@X>?Oe3^alNqAExtg_)3 zIe3u$quy`ej-yVc8aN*dcQKBA;YGg=X_gO6@Hiq8F;(U`Pxt#ipEzI-ebRQW@trJq z78TQ;4k7r-4P&Ch5!a7azQ4cFiAvH-WVMr)LZ4h9IDH@a&}W<8_mwzjOgyFz5279= zK%TG8=mpMolf}N#*#BD$4H%KvsnAn)-gCAEFX+*2dlh)^+{5!eTgTz2RNAZjtAbA6 zEqr}?NY#gvO7se^Kb&{b8BXo zB>sSplKIWyt0d~8o{0)`RHFVnMJo9u*4^XV&HE*Muudyi)2?o$li@}8GqiBNAK?}K zwj=@dq+PV<(}v)Aucq!{NB!RxAKf)Qz!AdB&g@Nl1)e0!)G}KH{pVg*OL#`pNv-tJ z98K`oLA|-H*{-NhH13t!rcNV)S_+C9y@XiDt9SZ=Pl)0wJoW4ocrHP&=U40D=Xl6$ zxV@4=?B3YqPCp}ijFP(Z)VkC=3>`oZ% zJBaxWf6;z(`V#i9qDuCyZ>U2y?#lSwP9Xztrxx>ok6h}b!R;afzqM{oj7$vT?=ZJR zDdwTB-av_yppS*C`-kh&gbbZo=C{l-3@9# zs(`~BE*$DU4IkvCNZJ|Tg5#NwPrOFrF0<4}LJ+u2((jF&6Z}l2Nl!$@kxx5py>21} zzt2nEO2?9u(2=`1zns_(U*XmV)TGbImztvAy?}1AKCCEUC;VaF+Z@)Z=0i7UFIG(u zhHiFP4sVkJ-!Tz8qraX`g1`S_%Y<&u^`k^n0{NtDgW!I3;H|xZYF5MWEkyRWz01LQ zFkmA2ctiqu_cOJXdWZ*ece>6t^Pr#O$xj6lvNZD1Z7ZMHYV<*HtPpF5{%dK$`P$z$9~x8~PIvXJ)fwu(?^ z_`P$RuU*4TeDva`KSG&I@7(V zbMEsGd$$GaN4VagxrK#9Z^=Dy7{1=FN7=bqj@?^RSApLY z>Ufd&8u3A5$;Tx#sO$Q8#@6}OR`4S;E>~&@E6Lb*BXI9k=mkEJZ>4h4_lENAR_J9G zvhnz_Hr`Ge*?l*js|RszigowXPd{j6?#ecGU7UkjV|&h=xk@Ep)RdC8#?Xn+bJ-30 z{dBUCf8&=`aq#;n2ktE2#2}l$1eU3U|XHKAHm1W_QJO+_dDuU*I$r! zMw~9*d$HP220mS{Zxx>|!M_?RDSJ19g}5Enk+6n8A)UjOks*ydG05YI9{jaUKReu5 zf6z(bUm5c$Tlhry_$}h**IUbtxH81GgpJhewl>gr%Fidz<={uOIRC_aJu7K6%V5a> zU&NjH#OpV3#45ABR}`-x?@}a;C#W+r5NwS*7|Tio$3+w}f5Fenan~^l`h|D*llu{< ztKhwb2)`dew{cp6*t66w7kNUb=TvZk#RX-fbm({>KHDI{V#v)ut0ee z@~@*GU;Qn``pI6)TMa&+HDwo7&KLUY?wG`GGZw1{P9$_8Vo9y(@DJA5fc-zd^M(DO9 zY?+V2dk8p%#&!e$R%Y3@B>?Z`?y}=OeUX(ojxA`Ld4~Qpl*11;bD&?WpP#CV1L~A+ zT&w!>0KDZ-zwE7ubN9I#U8bRPb|tboFDM4DIr#S-%?5pWD(ve=ktcCE?sL>x16=Z) zYg+^SL#1&Zo9+MyFO^BZv=REXk)Yk{Jxjm?c!n~#n&9u_w9;E0gZ_+Jve9M0Zxeib z4!2rT3H<}-@|GdgW4UbV`Y;DxuEHc?ohI^ynp*jM@Mi1Q9W%(>!yqmBn)XY9*D}sW z)UG`QTvnnkAHl@@bWSf(M;>`?EPRxP|C;{l%<4g2z}4hpW{&aMdDyAY44<2dSNFDu z&cD`1e*YHKr)}BF6<7{FHFc4jd)_tlLEwEk@ZN+$K6d-tW)Bo=p({x}pwoXt?|YN1p8i#cm1KW8*+1|T^)#2Bch9^)UzosFz16YkgCiJq zBm?^T*~ZKjOiuJWNFi|n6X;*LdSekEfzFc6am*1uqDI5KogB!6p8lafNP@rRS%q^u z+alS+hu2rH;63=-jbA3MewCXOk1%9eHk2LOX%Ug$f?&mVKtqt&Bx$c%PvO|4Io>=+i zH&o)~zW49e3F!7wP5ab=0|g}d>*_bqNx<#Fv7>b8oxRJ2u7Th7bv(PH3%aV)(j-Hk z6R7Ko){8QV1Ml)~wtgexwpGl>g&W}Gv1xPAJ5&T+vKom@WO|1=2g+#b6e1F*;9~v4mv|*L6gLL z?1$))LbLeY@Ryv9JZ}u#R=H={MqTj#?YZ0bWdk4ca>)c3V;@^BoL#)W0D0-d!P?C-%W>1zQ8YN`oxNR7xLY8M`>v|pI>S$5>^Aw z)xR($`6`)0ZiyDv*4x29p^?q`13oti%87}aLKIR;O=s)`kNVwT?)&>IG@|3p7I@wn z=W^4#x<;&@>FXS=e2@WHZJy2jc?SM@^t)Bq5eC_@lz-Jj_=VWntAbfWs6Gz&k9q1vVLVpCe zV;%#&R(KB}u7~Q!3juFl@pvDsI7%T^2Q6NYLa*25T)v^+3phHqLjU(wLKdh>P7H^z z66fkIj?Tan5eiZF6~R9=y->+#UyJ&=qCF)N!|1n^ualXJJj>(Yw%4pm;8*hMk5nMP zEj``Yf4YqjwIZ7(@+W}DSKi=uUWNMJVdvJ(N0FzH^ria{*UyHm@cq;Qzest`7B|Ev z!sg)P2mJkRQ0?7^JE&XBR}Z%aU#8agDs2;mP!Y&qySb-#Y+SE8;c=x~r^+87H7 zW}cBxKMy}i$<3yWt*qoi=f~xS#pt6I8gJ06OefoKWizzF*LL$28L83WqYrIYJ+~iy z6{hddA|F9dKA7}}F$$ z>~~_($$d%`vibd*^zJ$6W;qot<-X`|;kaepE!3$;3hla=3}1O*V9&QsEA;tU)m^4~ z9{3?{VSEBV{N@(~G@RiZmb~_ITaFL<754oYs{sy`Ba+oG|IYU<;g~!<1izD8@b3yC z@DLgIw)%oE-Th))%*#xiyI;uez9{&2y%Q>yGQhK?stfFcFMVM;UnbLuLV{S$J3fLZ z_t?Mg-fQR;6=y@%y~la`K+FD->^Pm=$nw4)1wYB+19ZbZXTj@gBpQdOQAp%TiTB&E ze?NDw>RFC+Lvz1C0~7i1s~^LndFH@T)2l76d7>|f@AQViHK?DkSl*|79e!H1#dGI& zVO^ipiCc#Kv3Rewn+y1nx}n!C$7R6tg^q4sg#3QLev8ozaO0~WUr!tGH_w{Y48O^+ zkfQD|-Hkrz2fsXG?6EU+t^<*K=R)YDQf2){vsd6%R$A3>EM*X$^VUpJ@P!Tb{2#h- z4!EieG2`9wdm@|-*P791y!`_I(IEIU0&PY1pG1Gg53}E1cEES?+97hm8}tG6+@Z-Y z1-@Qf_x^sw8NZm&RT;i^2PNy}4gwB@F)T)Js(v@HmeOy#fwD zWg&lgl?MZ}(6>rsm^p+0mKxnieF@#SEtd08rx+nCcwRRa0Pj6E4!pJH0+oo_tju4d zM46VEd>2gaq>LzPneBEL?{ADP6mCKJePoo1c8EhJTpNL0C~3 z=iV^IrN9;W;r>BWWe!2iV@jr}h(79BYwfqc<3QiVl=q`WIq=m9i(Id`fb++9#`Yo` z_`9Ota`XK$Yx*|yK0J@Uk)JXtugcNCklUB~YXp5n@;!NM1AqfKF6?ebTpwRh@L&LW zk!R$%XM7iYa@L#G`Zl8P6U}T*6?Dr=6+=&hRvKYAUQjNQM*fxjOaBt|t`(`C^|?3) z#*DJcN<-0C)=FX3?i?yv+xaZ#+!pAVeQs5ko*+M%eIUJUC3K5ZKi0~%<2?!ap)&8* zv5+sNXMY^RI$EKx8Po>6A)}?4wafy#S8S_L@-iCP5M~f$5RHACFa1PF5%sMJ=N@h? zgr4_g)BADg7~fvsUHTUIV@#CohK4(ycYqnP8vH@;UXcw>*TDllesXvT@LzzPfBSI?KIB&^{;#^xSKz_E?NSTS2U6PAgz+2u=GgM9ZK=p_2HrLM z976rsJ5kmxz+L92YiWG`$m>_|ZLeE|es~XNsavfWgiSh0d{iHO>Z`R?WtI|hD0Mo~ zs1M^Syh)E8=h8xI!`ZVCl!GIGJn|esf8fyt!l#gj_-33K&6`1-e$=AZB?JH3_a2k4 zvV^2Pms2ao{_o^@DY>?kLJnj&Sm_V2lBBy2{^%|QzpJxt2M$iMe@xnU8}#9`fqG59 zfj4w7esOyrz#wk&(`0G{KC;c~AzMx0M`_aC*!ULu#pjAv{+H;7wEX3<-{3*ZhmzP# z&a;qxRjHpM`{1it^RdTN3hzz0$+1Js4fPYkM=KOQBR{#kbzB5`+2{L@4k%4RKUCgU z;*fy%Vf^{k5T}Z|zl#-=wxcw1Yv|ODN7JZ-dmtFwum`$G=pQL<6q*P)s<2HG_&755 z?nwsEm1i;Tkpy0*VjI7GJNWQ%_7U0_d>{OY$Tu~?pY!lrt&te|TY9AY{O$xEddKtr z%gM+S+3U3rJw{#QaF=2gbl&}(T8+E1SxMYmd-3pSLXux_%2~cdKcb>F<~hhaU-MhL zk4VBNdeEOmGaGuItZ5goJmR?rxqW933lYs2QIKqdpM5_WarL5*2YQ=i^WmFm?)|${ zX(RL}cQ$wBa`c%>rcCbyUnrX;xr)skzMF;WHzFK?Yr1r8m0W;l>RdJ^iGlCc^-UPRCw4u`{@|-x8@Q~4gIGy^a_w6q z=uOK@rs=t+=sV?}(n;V`T^QyjCZSFxeM+&8*B2oEybx<$SA@Kp+e>ekA@Hw&%FZfX zoR6-r|Cj-fQ+pSM?Vo{u`1jRaDb&3h*Cm*4vH_1V^W$%?DEi6#*y+#<9Nh73pBg`W zxJvg~T`%4MUo3Gxr3rbUrAwTCq-*WIyHaCp`i~2knqQZIOI?2Rzzn zVe@lYQ#z?Cb_>XXZC)DX2 zSs1#@4(}lu@T%9jgno0kE_eCj`@3wu(taD!hy3s$)$1+v0oes(VB zU&lAwpqt$CzP-F@74lkz;yW7f;ppFulhU~Zzm~fHvh%?6eXjy`tZYUfvK@?$Md06b zmoK*8<_o`<&d-P4&;>d|me#G#1737EWUzKW#w9)}`a1H4H>*`dG;scwP|Qj2Haf8r z|D$q7n6ov?~6QY?Q*CH!Ua^63~~Pd(#bc2jipKbCUq2VW?}Igy1Ir4y;3 zi}(D;@ZOm^+m>16Wqa@0e?0HXN^ZGuTU&pml9@iLe&BuRK9w6+J7AtK9Wyp)f}Y^2 z_*c$R0e+`@@gG;?Ac!?>*qIRwU84M{DqWmTKDhs$DOW(Bw99|#?~AA;i|?U)CI@^P zPH!q!Cg9cev@+jzdI^Cj|uLYGg|c+RS((QU@?!^Cnd+3ksaDwz@fUTg($!5)wH$xId! zmfmi74Y=aj9+#j>;ClT8&$@H+@bg7=C8(}rC5yKVKhe5HB|TbaWop4MPR3@Xb*a!v zb};8C-yfUZhhPiztG;4E_A#i6!YkKN5tcR=l(5Uf#(CQ z*Lys-fZzJ|bDtb>C2w}FB2_-&kzH$EJydW86OMzDG~xfA^oR|q{^_zeCfucRuxgqw7^ zHQ)WI#Y&{!OGL5(=deUh$>#2dZzm_ge&1{G^-7u5o1h<=1Qzi=dxCwfZZ`5j6LrPT zH+lJVkzbhZFLpMd6RDQ{OKyna{4Ki@_PYl26kS^H0sd#^rc+DNV*M*py1lCvp> zSYIm^&2gncADKNaVY&zX304(MkAeStE)a3Z0(^_g)`yBC{@_dX>&2a8C?vH-a3ste z`Fi=f8KWnJY`3ncr8dFmaW?u^co^!s>^mvqKjGtw`|yH*KNXdKM3H`oe!;b+A)z~w zmt3C?t-yXy{dDO?%R0- zp^_IJWcvhveQFn@2=UC(BBoLH5-ZtpXsFB-as5yU<$>HZ1%AA==mvEzDI z`SRcWY;dBJ3u{sh&fxq#`}1Dmapdt7v1o(M;3a1t1)EH>;QdFJ>Ls`809UGyu3dq8 zc+r=x+wMRgxEdSdKU;mmHiq<{y66orDjy z{=Goct8BbiW@4oL6BT|->yWrl;D^rTCBM1f3|{OLZ~gJz;0v#Jb8+5e5c|#h^ty0v zO!f`6+4(Vui>B9BUOJ83Zu`GSnZfAWxrOL4IKNQS~Tzg3!KAy$|3& z-01WD4c7|jC_eR)BhcfcC*Iv>*G9kJ3Dez6;D54vtW=gQnZ3%wIaImi(~-C! z_;P;NE8h`Aeq)_0lr#$;#h8732JWNpnZAT7c*h&U?`s!7L!Y$kLdhQ$(eI|m!^<$6 zN~%20S}5@&?yZej9gF7~l31QA3jDTCGbVi_c#`K7F3F}!_+&c1rI<4Do|N@#LNr}b zFC4XYK=B*;0$;j3$B(#isVTO?b`E^=P*d0&)M=!h{gobsIwa%ghCVKFgxI**&APt> ze#kLV_^=Yb4lk8I7SeQLx=lpr;sQdXKKpjuaDZRN5gRB-xkIU&Oz*_ z+v4d)A^GshEM5>T4d2jNgBzDcRG`CU-=sz9QHVcNTlgu#`@p=p!bGut(=XlgkMTua zR8P0B7Z={!a4}Th4!m1;i&BsY0*AXZr~fl`^o#2o{_qRyZSMfxR#*u-&8EQNHChaE zar*Q!0aq%KN}zM4?13(5oGtPLd2dEeSkqU;H(T*g^RVamJI7lE&ziB4_`@ryicG`} zv)D=n=;hV=Eq9Nf1`j44I{D)UbZ;I$2J;Va)XG}|%#*15Q1%qP{S3O5-2GjT;rH5h zZs65bxee2(OA{6kOGfgZFt%%o~ zw~tmppFC(dezdq7{m9Oqms<^gw0^92cyBUrFNKPQ|%>0)2b zPFWs@UZPZ7P_+-bev@zFT?Ocux_cJ3MFJO<9P`+8(GNasbNlGV6NFhBZ&acNC=*w->zEy6DH3`IDj3{SuKizYTrgH+o$g#<6y|wEHLGry1wm z@@>c$Z|xZmVjl%xc%SLDq>Yeotg4C?n(#*-?v%B`xin`dowo_`SnlFrm!bcPSY;<4ak z_$xLk%|ygN2jn}+VYhu1{P~~9lg}b*DOz!7i z0X{l1%5aH>j`=R#>Yaip{DdRS{lllJ#K87uTOaV^jT29QG9QD#VVjfEXvO^$1n2Dg z1$=(~oVVWAd0k}bYR#QAqATNkKLhdIBKYK*htQ3z2a3|4!B3(;!;`Vx5YKOP`pD2$ z>Z^Gst(Sn!L#Y^{9h5_U7ZltT>96Kp&XC5&l#ddAxH5b-qud-}v`ZKJZTCBdfMfdFWHorNAG}f3N14vk*beMenCQ=|ueA8||*|@V&KHWaUnw9wzc;?>qTo>+BGPeqjPG zAFk+Pe^d@g*Vy7c7y8p{`qskFy>eaPB?4aw=Orb1ee{8`9r)x_iSx|S>90QW!JqzX z*h56Y2W@__?*QudUkI*RdPe}d*vp}rc<>P)YxOc-okE|^mwa#Q1kopDN#b_?G`vso zW13|P@K1O3T$<){#EE@Bxenu8T^u)YQvg0DpM^swpK_s2Rc|m@em~-tUHZ#L@H}~C z??Qjwq?0vgyE@b(Fz+kIJv5xb=e)DZU2lZ`k9=99>lb5QzCAs+mpyy{`oK_33%?g5OBGBI;ub z6ql78VIj%;j-+Y;C;9P84GSVJH)gD`352gJ?F#?r3HacI`z*iOL6_nacan>EF?g%c-8gI-~(L5_eOzle=*|G*6^D~d~zK8opIjn+{T@h!w>yE+<(XXd#29m z7%HAFLLORsYTz~aT4vG4<8-9&*>zgA(ltAQ&O$IH;zWKhY zvyJC13pw$7qt(JKYxx4UCb^=UTf|l%oqF@>pZr9 z*sczJ^s)xVEtcZF5ZQKh9}yoW9Pjmt*1!*I*fbjpzH+6Id-v=N-bd8?a76ts`lxJQ z#;kx&(J_?3`vv=WEG&*~%LUY1e!pn6rVTjJMbhp(e$VRl;KOno=vZ=Ue8u>?VF6C* zuYs2*ALmuy!}YiMe@XF!j_Fj~`?(an7IQNCnKAs5K~(nxv6FajTC&Mj-#-j8v|;7e z&6eO->$J~~GI2aV*+40T&g@n@T`lH)@S_$KOX7+Xi*c5H*2=Pl95 zPwgT$-EuX8A4^KC&~!2CmF}smtT}D@Iw9gtFzxiuEO7*K@+Y( z{M$T=Qh9j zdZ6BM@2e8vK_B)9Klp}u-?XARv4Ka;{|l1KhBS8ftS(_^1b%Oa~-?)d$el?eT}s$-VP5U z@16=%vq%6gOr9`z8^rr^7L|`@1<;73Op9UvX6P{jOS1z);omw^!ZqWDK7HHXNU9<( zHbi^1uZDlrRq6m`!4Uesq|MwvID!7h?ILP-j^RB|%AM-*i5Q0_;+1|1{;8S8m7@|g zvhn=5{Ke<+p~jl->I3he&3K3Q`{L%onw9YL@vLo6wFMvhqxtojMS;*ak{&#q*V~TW2sM^gM1Q>Hs>w>< z;kVhZ{VEiCVf?x;zO&%9Z4JhD6%8^OICI?A)+UE1)G z1jr4&>^uv7QSo~BnpE_kZYvbFMjZRA8z)mtLth&akMCDdH~LFu@}n>d^2gcin0)XB zjfGSE8b9GnJ@>fu(HwM8{+P>VL*Pl}&uNZW;e8nm&t?76SP92;zEC=Ni8#t>J=#v_ zQ=i7SivsWc@<^>e4IJCNy-%!v1obXI*1b@#qvP;z_-O{;-ZAyzdJpg->D>&vPaYw~ zdc|kg!vB3C;&yId4DhphnBFHf_-dZA{NW9U9xYLlTMc~ctKE_q0iRZ`<(4@?_;9kN zC%nEvk67;ZyI>Z&LW2U=)wq+;AIAl42C-if<7X6ZmZ6U0J56G~-;YV!q(KAne^s6scWor;0>gK|VE^V4*B@e#; zpmpp^`Cih4!O zwCz0Dr(w}6B;qr0&aYcCWsJCbsFEe+dOh}ygWSNtG1S9`zkE{#p2Xl$*GLO^iPW;e znI3H#(KfgL{UMT0dbIcEh=0O)s3iTgy%70E;kuUN(D!+(Ur%vA#ru4jfvMl(QLnC5 z9Weu)p?l_pa&i-VaF%gZEDr@Y>!+{MfQ|dr%K}(u>u7XLfx?zk{+f z*UNx=9(gG4X@s7usyDjo9s|CUVV#075A+@2ElJ`+y+p((+4Mue{rojIIy=CF7@bf%lXzE#p2pNh9x{EHsgELw%&@EyJ)f)c*+{FY16^G2pUV z=2kI-3_j>v=V}F?*>V3r>Iv|-h52Tozthi}{Jo8Rd2zR8 z#>r(Y#DXdCOBZ|z#W`5_lMVJEhv^6BN$jVp{c%<7=)dthtv(05Z7}_Alz$Cy_t^Hv z=HrOV%fl5J%Ygs4j2hnt&!sM>T0@OT|4`qJceI_rvnMz@-;e^Yd*sfV`S*K@t~$LT z^*iFpodk}PLAXD!$KTfjPb3~Xo5Fw|p;j^}8tVn#wo-5bvLAw>BhBDf=ih^DXjJ)L z9Y0{;X9qZyW#i*-Wc_&Uf97S8#V@b%57QP4wg%t`Ceo;55*>t>gGCw$2bviEVFWIT zHfW%2p!2F|#ZZDdm$I@6OVGj(1c;fi7{)9x?B`YC*JKmg#G&FAV&+mSy~KDSGlJJ3 zhUHKLTOq%ck!gt3Q;LdPu#lpHV$^ECf_>3aPa1IDP$|@$;=d{~4eU~f&eLL-WCr73 zeZgr_{0lcYo}AiswhFN?YpySt@v+fZYD>+MWHu)H1r-&xFsOZQjgkAm^80IIVw!9`IC|!h$V`A9PIe2+(-=f*5eBMaQ2K{ms9X-Cu#UEXl z2(#^?wK0Pa`}pY@uV7hbSg&<1l|M3s5|DXFS|ZvkI6lkASSFfHz3FR+@$l~8^}*@J zigkFx&7ph37&JWTeO_5Mnqem{$lDhGkuQ`))vly2W05*3Eg{*)tX%37lBNNiNjyse0u8>|)0Cxx>}i3V7x<)9 z8iJ@`LE%diBIGo1is&x6nfWzG`3f&AVQ&pkCO-qDm>!8t7hZ;!0#hTE>0-w4atLx| zV|dvyeMz&lSf{;2BSos&K%zQLyfKZdr&qkKN_;p?te@h-^mbut*fHJM8194(ANNgU zY6LKR6_~DOO#E9znc?HWbdh3Iid6@S52lHc^!d-e2@r4Wo&U+3N{L2$vEg3v{xq&J zY4L_YiB?JgH2{}&2=Z`YxZ`T`R|xWAW1Q0e_eHA3-=}f4r%Ak_NW2M8`*yh2afgo+8y0iJrjuA+7G^Cg<=V5-n+B!)aX2X&4-d5d&OJ zB0!yu>6XaQ*cId&#qktzeYfV*O06b zjW9sR?>Cja^J`}vaUwI6uZ#fNbQL|Fjp%ji3$YZO(7)0*|9=^kJpZgKsRn8BL20qt ze;#mHTC5GzZ8tyZSWf@CIGcME)5T%_#(aD*yo^%{3}5oLSNv@n7v{9ON{pNn#~=*; zGrU+TZU5YAGv-}dtl{4??l3)$=CP3uB9!`e!@*$NHcDc%^uC6_)Y;=f{J5&6w^kOgAZ} zMk~`Tiuqqx;4n567J#()+g`E%xf!gqn^<)rzPJG)rYD947fJos<4|31GTbqbQA~|Q zrU(86`nF18Z2Nn~8ZmcvSilkiE&&W54246GOUZvOIjXw?=AC&eYJNG{aaCi>1aiHy z6YH0j>Lk=oC?O8jQ3ejMg^eYJpmnM%uwt zEi%Z<{Y9B)fbfpuv#sj;dc$g9p@YFw(4~>fn}= z|8+CdQas-|;_tr%Xa zPCJ#C`zztWP&n~&dlOzHo>;bGdHEu>s z{j+!oBA0alJ(yy^{YjapSBiW7S@d~&qvmI}5A%za^RMgZCkE*R8)2!4R@P`^BwLNN z8mK+o<2~F?m_AnI@ zF(wU0qHm4XM$JDL(*IuW@mBh$9_~S0ZT<@MQ9Mz=zc2F70=sFXTZCc6g8ygb|Ho4Q z=i_6%+++XkDd)$^Ruu)@+?$D?Iw5fm zq<@>3{qysXrFabo>7ef_ox^AS|Nl&w|Bn#XTWPVk_WuPIAqCZBcq=fFy`Mqe?!)x` z-|@wK<_x$bE!IPk0QzhB7sx^`iiAHPk#UNR>ALG5?F8c?!vN5#@+bLioO{Uv?!a0vgPu-k{qQ2ynlo&t+64!bI ziAjnC@Fu>VhX7Jy{b}M~C_MP~ZJOBos`;M}QpBqbxbX$D+&9R6k@Ol!l5`0S1@H)f z(*K4XZvKOI6Pe!10C!Y(J0{@gsed7?PW|Pb|11w8O!)qP3_AZu2}uukZ_j_rB5;h? zXdzNZ8Ho-f_SGO)`Cr5FKhX!-MK9s`ie$-!`+sth)*zjBq&KxXtwx#=HEZV+t(y5T z8bQ@9N0$)i7?#vo5a^6-|TkLxtlXvO_=Xd{Jd zH9|k0srs6HTi1*Y+OB5TO zqXq^F1_}xa1quqOGhV=;(K%{hplGO|U|^`A@cx{6-uHjr_s@rqe%$Wg-fOSD*IM7b z*4n@QcE^GMhC^$#{}aFpz^4C?1^<8T?|%mGfWy9^o{}9bRR1}E_W*$RzoF)9&>`K< zEE_*PwI5;B&A@JID7w^ak2F^SRg5>8HlV zKrb)$d^WSE*vNFuXwND8gw-7iK0ggQz3Yt8S-|H59JK-7C3f1vanFCoM(l^j_Gg$3 z>^ig`bhH2Ip5a|#mX5oI9?e?RntpvE!s4f*XZB8`yTXzjO)hwcK@p~(|M~1!r7@=+ z_xC+?`>HtR>&6I+Ki@=r=Tuze_SLQ*5MEB7pNReLQS4`7|6P01q04dC)Gmi{$34iw z^ZQSx6?Y_k^{5T$brX3iY?x*mcFJMK(Zt#}cDN_~>&EjYG}CWDAn`5-wd4MGxI15! zM$9?xv9x&9_b7I}-t-$s;9s%vj(gq#O`S;Ve|kUOt7z&Ze2=5aWy=T?PE7yP>{u@c zuM*R5B0=$9vBN*x1Flh{uUY{2%7c#21AwjX|K0=N1GLic=e`etZ;5#d*q_#S|__JcD4x61E7Q)l+xwf~=T>hC4t`%M1y<=3SZf3`F}`E`8*t}hBz zHZB%_yc%8b&k@QM_uAYMuGC`rk|Q_yRg}Wj6B+L{2`$@oq|eLj^Bun%kTG=R^kh~>l^1ifIANOoPKH)*z6VadEC@5G4{Wg7!~iDa(MN%mD4w8 zLEjh~odybb8X2+ciQhjG19<*`@9%Yfee~x&EU*24JQViX^3zdCGN@(`(9uJnY^S4t z+z9IPg8UmLPkc}@jjxLSc*Nw(n6j7F7rlNHoc^O=mubg0|Jdhbk&-4Q(_s2K^f9>$b-ssDiGyn8N0F`3?ukI2kCyW3O z&c8P$1YAx#3_J}y_eWD3Aaf4T5%5Zc(?F5YXFF8QV_yJN0=M!$1WNv>w)MBGKokHt z!2LV@CJ%uD&hET`3+R3S?^NtJ0*J>PUICIuEPz6wk3R_e5dQxo%@@BkW(H zF94^N(bIpY->khM;PgWvIqi22{?3YjUOx|gXjB3e{XTofPmR7I{5H1s|I$DA?MLI! z_5cBc)BlHlg@oB2^vgbk01=xR<9{3GKZSp91)APz{Pzz)zss-4 zNFZ<9#OSlrJ4L_q|JChRpBWi_X|(GhQ1S==C-^x)mKuz)1!pAUVw*_+|7v)4tzxUh)G~ zyW78x0UqC>?~fI0SF(J-$jI;C8S+bY5fE@Sy7uo3`3Lv(z!$qL0A4->9yR)XdHk5L z+6%PxXQN#YfucXi8}wd{1_t|oEj9<)Y(dsUpegkqWkO6`klnBXYQ{9bTylD4IA{FN~r%VKD? z`l5?G`v76)2sn5HZ~qJd^@;qEnAgqg=ov3!iC%S;xwMTOf)>wIutdFD`(WP3Ah3Z+ z?19i5Pe%S-%nn+>b6;JP9Hy8%a2+5+r5-(w;tKuFI97HYNEazpfP~>DOk{0F%QYdrMNG|8)>?q zOZOysy> zS^R3TtY^U6TGJQxt^fF@D{Q-}gQgu1gsSsb2~?#_uEiNwz}4LH#0F6QRpPO$90)M* z>IYNEE&uVb^8zPx zDpbz9d6XQ&10?mYM0u?vp~h4-NWIp0;t(< zW%)Vfy}1{Tn$`ve3+A6{TZ84fW`%bUb-g+3H19|UO-fHmj3_N5580|6pZS%1n1^Do z1g7MaNiI)NpQ01Fa|$%T#9xqe9Rb9T{@@S1LH8x3%zED24KF7t-$JE#M>Ro0Fr7Jg zm%%5ViVTC#pvpF^2g3pl(lh-p)4`5=Y7@dGTC36cL~SM#o%xg@Kgc~bTmv);C%Zn; z`sRRWPslgW)!T6`Vbl%e}L6qoaj7YZ#SKeQXPU9 z^Ysg9qT+x>kn2+Qn(H9_;LL-zaykPQ>lIlf^Mchlcgg##@H0=Udyt^^R3RBLnf2e3 z$-x-BKC36E)*d2s@s9kF6_=><MIau0C>PU}9+M5} zHTp_I^FDw>t|1GH^#kqyQJrBs*mkA5C=eEOU7DB-K5Wt7)FNWr{j}&;F6&VM9E!!J zPSFdJF5dN2<{Q+w@kuDD>~_68ESb&dLBv>q+Ivc4%jL(dDlWAgYpZL#vi>*JczSlp zQqHUdiE`(mU?8KSL7XLPzYXCh%$Dju4vJVkayHp^wA(mj*+P}wnIIKzV3rbld^jQmkjm|K3EU5N2eAClA3|Bedj1+v}#;b9TQz986{0eecQu*X{~Cr0o@-d*6c+t z8mU&da3?qHjv&i#6-<1LMQ*iWb9xTNAMo6kwLhkI+f8+M6(4I=WxXxF+l|bGrls># zL9Pnl4_e3FicPDp;tzDctIjT1@3ng?kq^B}%VY?LK5P%I-Wj^zg731in|XqWeO8?0 z8`*@t*;=y@9lEhONls=RxBE#E#rP04H*pqzq8>>jfSbGPdNxXyPDcJ(vfw$CJ%tQY z;9mIEFd$2(md7&Q(f6#-vI^^b_+W+USgRJ>GhhuQ~?-$;(1?OzN8K?FkqA|c*l%`X_~pCh(DGbR%v4R%1+`Zvmg zi`A$IUSgq8It3~aaGmR6O~*?&(~E;5Bz=LC+gDI+o|TuLX6&t#MwOyBhC*|IgMc71 zOwQDfwZ@3@57L{G4=WO}bBl5*Fn_Q0;dOK7uweFBw3E2Px^up=BS0j-aI>Z^s{a zDJJ_phvDoN^P)@av!#z%+SWHi&Lg1wG;Zh??7=^@o^7bxPkRjzsW8rMP z8zwtONoy$ExV&!xB}`V33$3Tqh}A5Zp+D+}#oAmpXO-1tK$GOpCNdu4*SdsG`QL<$ zXe7f6*+ueg+1$tJ8}SEv^9{*}$-8%IHf?yp@4Y>)*0du^w6Ij1P&O^W;!blM%o%yfoW3XJQuk{44M1GGnQ-?gga3VY zwi!+9!4C64`3dF0i(nT*e`wlRn`Mt%E(Ib`@}qv>2oIT~Ls;Oo-3F2!Y29|q+o>$( z9pS%SMfCGJDFSrAfu+f=zU37eCZc;P9kSs?7L#|MS9RHdDHZ6P^QDciHKb5jqrURe+wR^f z;&u30ZrQ0IGNpaHLy2-hpubGfcixzkrGY&x$I`dRkQ0#(q(;E47L}fG%y$Q-wYo@3Ly1-(u2J z5pj)^Td-<(ZD=z?6%*0F`6rmC4PRygSlTc0wD%J^viDO?Q@kXbn!Kkh&mg`xvv+=9 zU6&4jCIznuDPP|Uw3v2|hPy#(`>Ph)pukvZjDxW^6^v~JD8L4HDtg_+uKB(VaG48PwF-~dG1S}x;1ysQm#1*?4#7!kr$dAYC=e9U4@p? zHF*dHn9eL)7T&FYLSIHsC%kAIA)!&}=8VZb<&v(dV@}`@f26x`q2)y6ucTlZO{0?* zx#&Y97UFxrrve18;A4lZ-`;0p*3jzG9C?yZ9vV`4slfrw%TsV~o<^>SLiuH%MY9Q8vtBOzIPIN)D*lB8bd)eUZCvr)An!C)_Eu8T82 z|29MGiODi60cIvzeqvhDNPOxb)HVl|jih1S2`rzGq9jX1YjR1oOnLkrjp!5EH0b4m z-Ozqd>!E$JfvIg?H|a6$-Nf+1;#m)TxAr&sjgl@dW+Li`V7ZeS*W>c=N7IG%^9zqQ z*}hA2K36*Z>j&v6s<_vB!*gA?Efqk;WZIoAgkpNyKOcij8q3L0f2dcohA+;h4K_Ln zUVJHOgs7;`tNWsU&?A@3IPoy>EgM)jn*Hi~!e;V7%kCWVW4^;h(Ff~kJOZsT(~6>g z$*rLa$B*uLMu82;!YTJ=2$FJq+)Al2R}I;gtI1&EbzF{;914J%uIx&@rwt6!G2yga z-CRj6+DoTEb$7_1LK$`k@eyp2dsbw#qB16TuoXZ0&hcifMyp1^HJ7ptuq0=G~KmMd*WOp8ooPtt}q;Z z$E@;F*KD*7V~viT5p3jhKWOb%?FN0W%hK&$cMo$8CF8&MP=&N1d>a69HTWsxE*jSD zhFc>Bw=a*U7_pDODbCq?;SFPkw2nhFc$rgJovB&;0gBc7S|T#F7N^)ip70BePh;KT z%k60xb}Ls25%oPTnQa+N69dAPEMv05tGz8}j=Cy)v&C^SgKai-8tqt-`$T@8tkoQ3 zutA(iW9I@JjK|Ul(nW3-?f3%XPRS)0Ebjt)TDikziD-;djx@gV7bAN!J&3qttNM4 zdd!e;?Homq%jv4Pv=*N;k-s8=?w1nx)j6UEj7=4XT@5-t=!8<^;LoF5w-NK#U%;gR z@G2tU+9v$P_&zxD?z`eb=TSE|4l7EGhEs1k36rY8ah7xvRORgx`B6~#UKXg8_D!wl z3k}E5|2UJY*FV>td8XJdMD#BHvqfIrezrCV0A8ZzC|p{=Kv-_sV)TG28Z5~z>#>+y z_0rtu49?h<6xpaeokflB0k*ddvpraI`f=rPkMWNyIV=J%)|R)vDv{(4B)5zD1cUzh zhFf`+mzw9RC|=#gDX*m;w&sFeycy!tW9?G(zm6`= zWd*AH%=;6pYTRw7<3jj;^0K#4U+hH`K-TY6z3ZwNyfrPkc#)mP6?*XAr~z5(Y%%il!RtZS=v>@{d`$WS`#x&PARa1FZ zeq2X)l(*$QC+*^-bqv1USh%ptQXRXP)}(~~jtiir3>_aSi!9%?plBF`$^y#GDHgohq zfZ0! z>^7Zei$`|QSo}3vBGBR*K2c_0LCATEnYp5-DE2NmmC6dVIJ-ywGGv+<9`B_)B*f7k z2LkM|CPT&i2i6_O-b}b&m%;e`hO~ua5Rk_f>e$7q0=pS{;*d;H_deA+3No9ll6H6vIOryI+$8+EKI zn*rVi`V`jeLR=2?)rX?*@1eCH1RNo^(ZqYhw6xcV;C!t-FYewmVaGJr-gBc*66vQ8Ru)=oIk!}uX&B486wb{OTU-@daUI`MJ}S*rs}t- zFKou#E^GX!Uv-jMbSNxLh@-Fu;9~5@0upP}MBl_8$l)>;$a;ILp95S6 zXNi=8{glId^u9W6*c9@RUtR9fyR2#b%3}$D4~w)5C`3SbM~??O*<7CXU1=jivRRqs z+(2WTAADu|bEjL`k$lxJQNM5`h2`T8c3}6OA)+~&ZaH=Inv!NVcYmgiDq^Our1^K% z#!uJW^o{Hkgoe|J)>Z}-i+N^l13X7ARI|$`itHqY?oz)(P(V=4qHEc@S7Z}97FwI> zAHGN!B=B`Qiv}#GJlDAj2C23$&;)8htm|VWG0fl{`73*c0b6PaT!!FO@2K%sqZwvp z-r70v1-LVSj<_KEE12zPHKD$df6}w|=+oPi?=BNEO$@mfqlJMuLzVI;bFPyMdinBJ zz%`UJN0sRn**Cr+r?b!C!}4nvEE#F7px(1oW!w4(tLB^@Y)(sY?9=MFa|`z^J%R1O zMfjY*-uZhJ+gf$v?A3NtEcJhDo4d}q2Q<%uwQQe+#upam)%qC!G2d0LHb*|J-j*_p(sjK9zQQGOkKN0mfb#! zNdzps&VCBNa{U`@tMmk#?|Z1$Yjon)zEclY1duIG{7XUXg<4wf1EA|I`pQMv(ysD^ zEs;m7)R-^JL`dmwQ+~;V>u>6wN9){kB`WL6OH+s6$XgXdCK24EE4uZK=gmSCVY4>w zY1N5yxSK8EhP)wmxS<t3Y9Kb;IE z7-omF0L(Coq`j9pSv)?>Bj`5d=^ebRHsQ^l@1>P&w-EV~-7+3Mm?G!Ci~3^sfcq73 z++%Pe6BidaxS|reKnDFDdk3d-n*i%+wVdU|^ynIh1AG=`!DL2P1+r*2QcLUv6^0U7{j*>$C1m_lGQjgs5haq8u?Opnz$t9VljvicoaAms{(p*-QzlvF z?6B6kHG-%)9dKvqmuMXk{S|ww3o6H!$&JuwgLj?qw^wOPZ?JQy!^a-0l$&}wAl+|| zTvlyXuE(v?Sd9LbE6Falsyo*ttNW!1`-U7?7u*Atr_L>G0)XyOV=~fPpoPAbXDuyc zw|^DS<;8j^+$~RbMU#C|GDV+=#3_jD29WPvjOJ;&D#vh>87vDC;dwjj{DSxP-9U0bD zzP-p=xd@V`E|7Evy|>`z6@rTg86b1dM80k5E$%GFWx)-Nh z8{KkcpeR7Nw2jP-KeAhQ+l#aAI?x;Hd50*^L)3Tz1IKQdv*VTnobAeA5NOK3 zP98Op#=027M)}w(1$KDL&k7}prsR4>{=FJIJRx~z)x_b_gQ&yu7*XePiO6eT`b7k3@pW(s!| z$;eG5+f&^6TzpYfd1JSfK-^p_R4;GQe~tP!O0xdA|A7anw_T><;{vSP)}iG26j8y` ze#$ky>e=5|{xutRJpJ*=ACcI-Wrsa;bGcN<_uNl)R1cx!ROeQGP++5lx5)|-X}u2v5>4E>wC;R!%60n<5+oCzrI zLrZTe)(g&oWUk2EExyZt=pp8?gf=_burT0?;1pn$f0_p(z$E40{e;?J<%euAE0Fn- z%}7%Bf6N|ocP)Ut8C+k2(~d_PPqq(_7ZzH-a>txF3xd zdKVnHAyt*83tYes4m=dh<95HTCt;h@RpQv^RJame9A<7C51eFQB}#&km47~Ali*8 zrWgS|xSVduUw=QCn868cr>%#2#~)DI4eIxzTVEJvIAe=`$(xDd#9W-0<*L&)bWGIv zt<%V@6{;eA0sy{C*cPUcRzIZ()+<}I`xiAq&*sw5V2|CzRx6y7^@gNe|8iS667`FA z!mEpxl?ZNOpk~qKp>`c~bKD^aGA%=!P=QLjn(oXUJ4s-&0dD@RVD@(=84{jK@sD9! zp;>9k3x_KyE4Gh(D|NB%n#{Lj=@#-CCt&P`<&wKm#UEd4wkl->6}j3F`0_hV>l%?@ zV7^E^b|lKsWWk1>hz!FLNvzo z061a^vI-ZHlk>jDDO;6(uu*QMZj`MjzJ)mxbOH68Fr5mB2F+Ch%cvj%+ubEj-H&ib z6QG_~s2h_>*K``Y=JpD9qF{WV<)GA$8W@n zrzX7zTnWF7*7=_mLH2<|%*&4K)ofcd6t*C`S@;Ux5LBoPN(J3+Ez^qofuksw8l>HX zG#=x>74Sro3fleKyfYz~E%_#(6wijMS)e0K>DG0n#-`%Z%%Nv&qB)k!mpHbNRszAw zH_T(HB)a9(Pr0HDQEgrZH^9Ttb1@+Pz>#+nJe$61^YSiC7qlU{7b9i!iF&_%dCwN) zNzAm{VhvL$4d00;L}Ln{jIX=)dN5E@KVpm*KG=Nl2w&CrrXLH#q+5XJ^>BBmNuM3~ z+gq+^d8UB(3}lK*QvyI;DN-Mi>W)p%Nu_!njW66kcsF9KYmp5Ir5SZ|W#ZOIPa>+0 zeUJt?GFVG+=Yurk(Fud6q!$iih^bf;{5`A>)GQ;(@5DD)nMjN`7@;%bdTKwy<2!NYas?XiYCKwxU_ue3MCYY`M#}o<1zW(MX;^`E}eqq zJQ~`n7*sv~S{Xe-O($jn^E3S+Ku`4Rhdx|y%2#GS$^ArR()X1fv29rG;l@XilI&sZ zY;14Rj>&Z@Ppw499BjK!B+m8lpRTYVyKz15wloLXdUSa~Oi6kKBLi+7e;^5hk-wK6 zvKT&uD8(t51yAw!M(9442W5%nSgl%}fRz&|StC0WxyQiZ3d!d|IT5-;jCDqT-K{As zEn=X^RCUM|!wLdZ+hEZ00m!My*# zFS={<+k7^?7eai{$X1H=vrDotMb$|UmZW7hCL95YGE7DNfKX(!^+D&m+(zcIwb%hG zW#Q%i<-MSnkYctgBiD9**#>?qr5FnMxy4R_A}7v;RUs+nd5Jo zV>NUH;orsUTW0xN6wgP4?^wZoZ!E}wt@XqTOy!dn07+(U!?Y0V#k4Z!DP)=SXnFR?h>ubmE~=_N=h@ZV3T}w8D^>K9v4tpCs!o)*R}QsN8_He zLwex{^dir6QC?UnB(FGbS!9foORnL3+<~Cx-8`-;N>k3}#@kA;u+A-KQqB#+l!-VU zf{Ek*a{oMOy_YiqcxLr&qhp=U^K7=_We>Gs1Jk`&su7JQy_?H%?|-hKzq(xQ_PpZK zZ;7FrTz=huy<_AhP88(TXNFG@0{g!Y6z7WIxrLy%8xzE(ftP?NY#bBnaaGI)3pq|J z_d&Pl-i)i@EiN{Yg4Yo{8}cGk$N1+zhIitGl$oW6^2g+IdFG!t3Y{jTSTyUaiBj`ZMm^V?Rx^R<6qW^rhP2Ne4t_$CARZ#RP&bvvV)3%Da;A zVg6c=2ugy@$87{Jwqo$hoJoZn!|&R&m*HF{QVj$E&ev?g23yG>_q~RKa3y<&mHoIZ zaBo0jrLZusYStHxsV5cY@c_*yBg|bfyf_bbh4XZ+V=1;XTiInF(&>=5NJnVRtoE)v zhXfhH9|GXjy0=^%VxIZ3eaNe#?xj!Uacb{n z^t~?6Gz*^F21W8UjTEkT?x`(8O&)tMnzaSTPw{T^#W6sO%O|(#1b1HIjQAydJT&RS z>@}jF1;*!V)eIU#xAsmA5IHpncI-$4Be~AwjqDf8>KR*l^9YD(%a84nH_swZ!3^uB z2g#;}v`DzjbKAFG&4i`ApUa5` ztD=V5%xc;HLM53G>Us|@FV)N@uDb(9v9bLcg&Cz3h)d_L30^8UdUH9__OV+J4KWeL z3&X6i6^e`@TMMtaw3^JFbC*oo*$^e)e z@<(M^t`Z+sNInu_pcee<0xdmNwQ%pD0ncK+Bue|_Lnq!--Rc1v?avP0tQt(pfZZEb zX6b2RI{3%;syqSM$zPy$W+<&kgOF8h$k;&C4^G9H%5u*OAeEWy(+z&`!Ka#RzP&39 zmCRLdmC_UEWho0U6E%XUFShHb@>0Ln9zzxUg|*;j2D&$T4&M@(x?L8udy;JRQm55w zXgEuv)Yvf2A0l99Dk@I3l2Y#ZH#vi5(cP7Tkk!kK5Km>t_}7wvC<7$&$0M!KiOrW!ej6NoPRNTx@_$l6CM= zCKFEc;6WNmm}RCLaEg#fIoW`G^$svKcnj@ETN&QEnF1-B)tF-%i5h$=~Bc*%-aD+ba^Vw)rC2Eguwpzp_*(5C)nwWMC2wJ&e;h7 zvwDwepFr)+3>ed|E|H5hRwC1Mf_uH7kS;?kthmjtYl|;Tyf`r(^~1^l>59s}1$_9N zEZ?6hKOxKUUr*Kk?XIx8Yk9)ImI)CVXhCpb>=%)_@5VkT!0CI4P}AywgHwyas8@xP zh%4HH%Lc{RU<`UtdQ|~{^E}!jf);ljw9p`N(6TbWtj$bZ@3~M`BpOHzCkAf3_r9XI z)e3O)7jvThMJf3l_(7`ycY#Z{s85z-A0*-)<(IRst$U||nUDEBmZ+W7sh=_f^)DEc z(dCMl=j99~xSgfaU&di=-?GxMBtNP#p*F>=rl}GL=qgh1fgXbXR%KTJ!zUM%Y0Btz zD#qbahP?wiOOPUuv!+FA0O8TxeLsE^f(;8_pSyo_Y!;Z zVV4jx#x*){HE=v}A<@00t47~3QVkLC0VefMuI1C#86eLp$!#FQ^vZDG1GhLuGwz;? z&7ORjK239h&$kMb0ial_wVh++>@64;EgXbNEFKz!RXP5(|86Lf9=A4Y{XFHB<1wG#N1I???pgdWNjo zZLhpZ$Gh|nE{V{5Y5?mjC9~oEtVg2sfZC&lJDwE8WZ(*5t-zsgs+;p9jT*dc$`Bfm zFr$=GA_fW7#miN7O_u>!_d_|8w0FoS;Nz;093VsP*UEiEnfC8N_sw+9A(YsIGjcI* z{URFxzOe$P8z3RrzN9*hpHMFYpY+q_DM~-R;NE!yBdvtqzc%I;#PbGBZvQK$OiKQX z+EUF(X^ts-V#|>@ns>ExUB6M}?aP|G(Mmkj3 z^IUk_o*DDLCN#h^K7||1L?;8v`VquqeeRt&_jT>v-I6)kKU%w_nMzTURmXxGz9|`T zvtpFzb*(z~ zVT~V=vyw9zcDDcMp8kcmlk(KLMJHgp?7ABr%H*ZK5=s44UBj$CJHlOe`mr9+iEHGJ zcYN*8pu-#1ZL@V?77JCYdWF)u$ytYzi|~+DT2dE-{VXo9Z3r(f2JV%~=9Fn|>j1Cw z@#^E@^2NXce`U>fnqk)FsV7I{p%6uJBu5?(;2Xdl1PL)4?F^XQwt&Z&i~?p>2RYtc zd2B;aRKDOw#2voAoR+F=Lt-9ea8er(GkzjqV-l!p^b~aPHbZ$F^_F1j{J;YUKkgtH zI>IIARu@<t*LNq`W_)k?SZUZ6d-;;BRzTwPF>z^QrxY<2*|4Hg+y<>Tv1M8BN z!4S>dDPU>H&kw5MW^>jOmW-J7Pe$N-nD=&8h)C6KBTWW;9W3>SgMR~3EDBYu3li*i z!Yv!B$|ACTMRCgyf7fQw@v*{{G5P1I8g~}5_Z%=eIQ}GN6UT~IXtCti`?^=@l#(#(l2e)Z zUYje>hQuFO3oMS$CFIyw9lJXDG9PX{Dvhz~?)u@3TI{|pOrA&AeHeGaB zWQg7~L1yvu_kcCe;c zoal`tYYMh2%q`X%fVgT>4Av(i_46=|n= z+JM@Y0KnPOZ6ZFk2c!IsuGvRtxjb;|UO!e}6J*!6(MGz(AZFWR1DR#m9Ke%IfQ#D5 zhwQ&3euT{GqKm)w3JL5c_pU7d&CV3c2k)iZsxcl3rQ_&rk2gJBu7zzR-v6C zyZaH^Z5P{>jQhi))cv&e)WNlFNthn3YLH^PLC_lry6Mo)R%gp_ft@)@%`&R>BWMqC za@+z$>1QYAY#Wa|6IcPoDXTS*0G5M72$wu$wl_7{YGDrsV#dX8L#=B$WmNT zVajgStS9Y--ET*tCldW-z{Vtfuy;`a6@XI_+yz(d(!u)WaMtnBs{0+)%qQ#6<;YA1 zYwId27vNB%{tZ6JjCC&t(+kt$(7TuY%jeJXj#xcj7qAz}%3XQXn1ixVZRMp^=WXVi zEwvbiX$$NpFSW!kiSg<1i16{=9Foil+*L8|?@UQO2_z^cLSggQ<3A!fE@xG4Hq9-0 zwayB5mQh`g2P!Z0Da{~do>S%kh=sbwlQ^&f@qS1j#n1|7Q2(SP!3+}?EXF&bN>Wn{e^#Z+-CTtjQbAM`Pi0w7k=GwU3`yU`oL;fm&2r4Ro?-kz|@<) zOsak$?82lBjtEwOm+cnRQHVgBDG#pJ&!YVC7Wp3(=r=Fvzh$c$1CY z{0sZ!^~qBgqtI^T|i%wSy1tMWJ}nne98EjS9G z{08m{4DrcTVHeTI-~x&n7;>W=S|Gn^(dBe)@LmNq_VlEDl)lZtLGNv zwr^cq#kYjioY!)ycpQ<1LACvRl_39M643kspm@dxq^AV&_nhgI5Y`IEj2v57JO@VKeU(PrZ0 zw5vuj*{x8lzMPon*R^!%`p))CR&ZQ*|sOJ``Tf>Mry3D|WYejnCIRn3Edhs@7}-7TEtB zSaBz}1tOb2D-DIPF?m-s0)3~vKfq>+d6jAp<=kH7x3b6q-RFP=x25spfvU`3`tx|W z#QM8&4cg;9lBUn3Z3IoO-a5ynCh0l<0k9;WV)rgM>kQeiHO)Fz+LHw3jatte>p_-1 z$`OJ0BJS>K)T{Sp0Zu^Pbw}!4&;~u%cI}>rR94ST@+u2#Lw?YmqCS&3=4xh&FvqNA z9?L+AlJ7ZXYeiN5$1xu#N($?(3SC&g3dLw*@cPb<;{vt8yve9P-WJQM`gLp%8OX@^k-pJQ^B0`Mw@CCAhK*Q> z_Xa&M{izOZOik~55x zrhZD7RmYJuyr>^8a6W|>H*SI{iIQXc$oY>nZQ8kYnYs_6a;-wMv->)^ti*___fg-5 z)-*paF@%EFxV0OpD34BB=%%RUNwx7i%nOcM`evGZmeW!Rgf4%v98wLVq)6~b(`o`i zri(!YFBNZG=kNUH`gr#v~q1*#4?0E746QK`8*Fm0& z3#&>Y-DKl7!Te(Xz27%tTZZ&E#l03?s^`M?QTEw9{rn=c&HR%`C^CUXh*-g>{q=s9 zKt^G@3!B=*{9Lr&c98CM4op_!SrvLWo32A{CAm*(F6@DQuuvI1fF`fI*(Pe8s{Yl}7PXIhkt?Ah}2Iv4|-An(4ymn03bLQqA{N3vyO$yv& zLmB^{q&wY{8&k@@{}sUDjUih4GOL8@L^p^r>y2})Gt6*!MVDG!i~;7VzsT}O>pTvaHAjLi5mx& z6<+hp<(gS{Ugu7B@8+<`;{rO@;&ID}igHbS#T}R82~T?u!Y8R_i2~2RsGSSu3ZQ_V zV$}ENo+T#P{^TECc2qW$IHQ+3lfC`_tNA)1%MX38v}D6h?Q0hf@drp}G33X1Y$rT%syORn@=CzKiW70(_P5Zz{14HLxQFy( z{%9W|kkd?9u6wWuycTY&y;mI%Q~l;wT9^t`XK%0*)i0KGw`0hw+xnBwfe6wop@PYT zHCgwt7_#1!p$Co1mxSshH)I$O<}@w+$N(L8g(rlJ-`?@2Qe-^3GuQUQ;MTbk+-|UQ zo9^Z&E8!$3FH3Sl~Av7g=BwNO!$kaq7iS);2yZkB0pKCr;1 z-n966sh28gQ49mFM?-6P|Dxqu0)$RC;}^VzdGKorNySA~!WJIG*9x5Xe4#x^yax2% z!)(DzM5SNtTX^9tfavQP0-Rr@IJ*qWW!gUI#O+Es zG35m*2frxCKIh7vQ>s_;9(tsYFFrS90}#Gk{=EFdZhoID2je%Weh+dd6JrZ#UN${P zllYJeq%t|dd$%T!Q+cUzRxkij%t12n9;k(uiyUKXMKVj*5(w_Ns+(maT2Ar0qFK%y zU}=!#(suadUCXU`MydNdRs8GXj%blXRs5ap{!nIh^KF_xLV5BEutokMP@G<+d}#_^ zI9QJJlYF$CNh@G0lJLJitI=Erj?Dge(;astfDia%ejK3m5;|B&W07#~V(IKCc-5Vb zOPNceskIjg$DauLc*U&UR6;%w%+9@`nO)XDMX`>jl>1u#?9$f1uz|>WT@~!fZ%!%; zOA&Qlk-An@T&j0uu|FgYJun*g@S6zsfcNnXn-L4GvQJqXwX$myHVp&$;vsr6Fpfq84X)yv&?9y7LEIJ-9KYJU^-U#_`IC{(qB(F37W_Pzv+i4QB^*hs!*^Qd0xW|2u+Grw* zsdm&rf(ix{6pR>9P>9;90RyRa)PRD41P~MyA}A>QZhrssdHKBeJ@?+{Jm)#j;feee zld66AkS;pWGHpdfhS+1bBEVZ4t4+Bue)Qc@Ex8f@$Pk{;*iwR)BA_vW6(`gzwQXCB zx?$j>G_nDMDzRO;v??F4prP!+gb(?BO9!2 zpY(zT_h5yLPlpdsqqpI-Rs9*ZwbXvg)GkKYpzO8+JTd5WJ!mA4bzI4P)8M{Q@h3{< zK!70M2f7|aEjBl##iGNmH%LT4Y>FS}9JN>Z-)npq+Gt`&(-t)`A)@|9%F{@4{;9A{Q63)339u0FcmmAe(vSCA zEWZ~@ld#N-uOP|Hv6h|kg`-jeS!)R4mvUJr5j`z^ARcM<4Q3}(mScKsRwK-H)E&J$iNf_K)NROEp_mVDQuW;|647w4(8^@Z^FH9Q|JZz^ZT!fN08J?$r6^af~ z6PLwq*^+1*(^GHk5JJ=iH%QzcE+|5od9K!>~v9CBDwTYBY4^(+tGkxr!y|y@aU(KTZ`0*4ZT!4S&LG271=~ROi z3U%bR5-C~PW6{f6b;Oa?6ti~%)$A%`%;V#nW`;azmLPL*B6t~MjYJtVinkpPR9N0F zi*mZ@2bJc1SIDIv7;omNyAM>W(v>7PzyN17tC<_gEvcVkR8hPI{#DRpeB#o8KFOw? zxx?faB)Rz&{p~4P*CvpdeHO?jr!v+Op*M~A2mVp?*7&jHJpeH*ujg%+1QwuIm9cYsDz^8^DS=3e9+i#$2I~uk+ zYXhDCDCYO{AlSb~-pi-?KE`CkLyq~+zA0VRIuR>3H zs9Efam@jI3i$^+6eHV0%tb3_^ZV(NeZMb>)qrnE-+-s={Ea^BrFVFH6{4!V3yQ?lG z5)yM+^`Vc$te^CYZ;1QYU9KLd#G=Kmccv57jpTXS&~=^bygJ_Uesw@SXfu`l6}qsQ znfV4>55XP7t8hG_N1v|bC!GD8lr3tr6T|R58#knGxpr%6=JUl7uVX*9@+e`o3+q3c zA1R}n^!fkPl^7fM-~U(WRZ+-w4t1299;&9g%Rr{6Bp=wv#^&6->+Ua244Vga$7wbUu3#% z(~_bQ>pVx^Y@pJ1HpIP|Nb{G(UFV(RP8v7NJs&q0?KG<$t?_sKrN6ilo{O7GwIpBX zbS6PJ$JNh#MmKEcXnfNUYS?6eBdMQIQPoxK3H#q3&{A$n?^_+oqiZN_))V8tG~vG^?ia?Trzg z-FVDtlGm(eyP3HIgLp2KMY?b5x>=x&%Frp#-66 z@+`J8o|M060@1U_2v?&v6IT+dE7KoyZP=BWLHw+ag)WTTaAowT5Z0j%X=*Y!cS%Jg zrLU>?t&yB(zz&+ji4`s0*e(%t@qQh-(4e=ypBBhEaES|qtF2|({q(~DC0m1N*o5i* z@5r?H<_t{EZ6&&7LhI%t2zelIy9%TOznyFD6mr70eqKCdS=*y^jGWHv;wt7}!ITaC zq=q~{VH*ZhGzWB+-=;{TB5^cvYu8mth&3kbwfX%x)92dXG$x{QTV;EkRNGfU>fZ@+ zjGg3U=f+suO+!F)2@jjHx8c}?azhCTbkrZ4Q?Eef{Z$-%0pNDFI@Ga&a@Jj3=( zyQege$ zB!Cu{F~~!ZTQ`;;XwvLx2rm-H!W*>PR#$f!Ef#$KU0tHu*nj3A06=_P(u0vioh1Qb z^w`cA3K?~?kR(Xx+W2t(^(ja&r|Vq3H)wyKP&AbV8FgdhR0F1-90b*0#d&sNNe%-k zk@7eZF>Y@|=#q$SJP-UDjnhWHxkVKLO7i8`hhhu)OGPt+uw z!-55$)4&+hf$0Bvs}ZTr_0boV`y!b5YVwdRnz4i8?^rz;Vz?Pl2afUIh47S7-+b6R zPrl|d$J_P=?adhe0;^;%Rzt#^;P>wHM|gVCUjk(rkM4}87cAh|vV_6<$H7yo*&dmu zFZafjd9L}jyD~+MZEXh`9dVhr7$DBLTi#bo41xdG(^(A1SQ7X0J?&8Lj}%FW(Zd^4 zuOh#_Do^u79DEGjcr5VSYH0hw2t)NySQ;xkEPS^}X};ejp7ss+$c6lcgte>J?Ez%_y#G6Fn<9j+%se-i-1w=J(NQG(;g zr4eTmQ&1N`3->}-9mVcp9*5goWc~uldK!=IckfSmQiipo2qM3ILhW%BoG5^HDa>0G z=8~Z*{z@~w`f^VoDdZ9{%i*U~q@Kmm1BveUV!BDHyiN~)!`OmL80&Ld_Ka6mbHWO4 zt9B-SiCTJ98f!zBfr{qcO-J!!WDn*NGMU&M-vsqx2#c=K4%sZpEr|X_PRc$?XNh!E z03a=H~+-810 zTV*BU9dSq9QZ9!wWNc?CXq{XY246Ls*4q=|GaZ>5}e%jZTJ-v{KeVy;u; z?ji_*Ram=^m&hD7wuur$>RiZEw*?rHe4xR{bUlI)ERuL%bf(Qax2t70Pve2M)gG(M zN8}#Vt)Zq|d{4CHGLEZd?;OStM6!eSm~$>R(5vyTuRy@~e>JTb#6~-PN8C+H^VD{J zbYH`6nCN!;aC2n>Ow+fhkQ7aMyrk4U*1Wsl=+*u@4vu;1NdU!!o7l9SCi~{o)BHu>JG7;)$p6hGABhj1G)P0T73_`w`H59>$c~iGO2k{>l zrY+Ja0LDH(9$}IejV3Qh+w$mM<|EP@ru7J_)cF^Zab`bRP-m(LNMgtUC-EWV!dT~N ztYfes)LORb^uq9nM0j98Dv%k*s$ddieO$laN0kOh@b%3rgzOq#gb*3kSr*HIlC~%w zk=o*alJ^&p>2uRVX0FS+T%H1S60P2rm3YC;hh^Q#)6X5yR_nCYRHKKuS-^-bUKa>GVCg@G7j^ra7%Zv2t3rfFXhyq8LMK zDM|kC)?TsS57ygSQ@yu~17(wbkFY6)=AnS$A_^&*S@XmFr)W+{U}O3V9Y}lWHAhqh z2z8Le#qpQuRP!C4<@P7q4jTl_t{~=1x*h584Njb0?-B1wS7*yr=lawqsxBBrGb>yc z@{(-s_cF1C9jqBpJEvqnpjvJ~2hTB*$yMq0_v6e!$0`!cN|ObZY|pzP1tZ61Wgv!z zgo#&y^`5RYp=$AzBy|w#wZTfMk-9j%W}=vH6};${%BNk;EJt7jT`;=LKOfm-Yvq-`$IV^=2k zrBFgAh*q8Cv^|V44?s1L2b3F z0O$9uS_(TW^hZJq6asvLEN={*af6$g`mX0vRq!iO=4;8y=Ga0ZI5O^uDpe7c<~Yz0E+rylemMqUns69!Lm27MVBB8 zedsn}56h<0`w6XgiTMkh^ez~kRRp54*p^$gr0@L~#;`#u-1gsAKJt)4ndXP5bm2Wc zs6$E0kW-CxupxfQ4xT*eP_}JQE88+>*gV!;7%fpwHtk^$mJG2QP-CPv8lgP~_M&2` z-KgG8iv5aBIjbCS4)o}tw$G_eHr{#v4$Q-QL#4=L5}UdCHT$zm^)uhZf({1bwPbZV_vnj z>nDE z8TPo8Gf={KYfTGrUb^Ktx$Z45{t9vMN|j&A$s-rad(Nr%1Nx0psNgWSKtWg*n`}Dr z1hVOfaamHUM#dQZsKV{g`3Tg^fZe(7LwkW6QtJ^0D}ftDnBkvd?i;7x~)CbKl^z~d_AcT6RG;8 zk+jsVr(2SamkiKxa#(A=)^kJ&i}t5W`cP!M1@~O@$p?a;0`ZxB7(i;^mdM4)BQ!vO z^#!0N6D|wIqPoyi^zL&|cx_KuJi7CuUYp(cJnA!L zd4wx<*5C9I-chf$M)C*5(kxXeg-m1mF z!Spvrd%_V1IvY;{guDT3=1AW^3^L&XD| z_OJq!cIuLB6|i=5ukFk)L{;x2tvjl{WzUZp#=(Ull2Q=LRJ;zW)VGTkLEdub7RM* z#uB6}oyYr-uLrmYu4K_h&~R867lQZfmrq zn5q(Y+=+;n1;|=hr@Af@AqnZpYy#*rv`Hi_9_7MKiRhVyBB+a{QS!#f`l-jwuKC#< zaVUx3MPwKrfhV5yL9dV~gS2{06(unK;7S;2y^lb!YsV)MT_S|P?8L*EW0uFjwWu{| zrt`8aDGgXv)CP;R;q8r4B*xMN4=8DzrPx#smNZ#C(`}t-9NLYv6b4L&C`0>^$ezr$F+v)K$GRmuvVvUlw zG0i0+NHJ#GwMtR|pxAKS)k^t@3M46tf} zc~#GSwG7+YXh)F1Hza)0)4q(0u_2ZgQ*w%j`_HwLVBi^TOQ}LE|EVSmaX=guXzr4eTHu;H#5P&2 zH~@~lvXf9?&D)v>Q5m!>HzW~>4u344qUJ8?{+)t4oJ()L1|dALu!G76?N*FIDCs=V z(|wCj=AIjqJHA~XC{JiAzx}ZBR(@mAxjVP2>y#b%MBD28?E)1833|Q1XAf4_X7<^U z{88^OppN_(o8XC4&)->%n0)S_?7l6@v7X5-b^?X*m%?KvjoIFsmC#9{>EE*YZ+k+2)815D@jo@i&q;xZ@o38&ySvDdm>yBmOq&t~i2 zJ(744m7+BZu&>7~Bvg0Q-^B|sjaYwWyX`MNu$iMtEM#d!WQKjzC5g;-Xfw8Pl*B5xdDc)8{r1E#z7M4IcXG`zvhJ(^t?*R)`wwKOhzB*g`~}>;6lqM2 zYu=tZ<2WfA;ILT>zskgt$G(t<>?%L8qz*@M3t;4pv(OJE)BEzPzJ4GIG>JcCsEC`u#kEHr{vUlvVRrcpzJmcX|y}Nzi(SfN<(Wp}dF^Wt&U;>%C z?=>XdR=GWomi1EQYTQ~u)%ILf{drItJ1APPhXNt$(wz7$kgOU)=QtWK`^;H&)@!Safjy=deH(RwP_B25RFRLf`*uGrW>R3+3Dz*FD0J%BIGdpi^?rZ zRpH!BX|*&{ZHX#|1f65+)|D`ucZPO+A*TVjs{F3YKup6z_N3&BO1iWQj(uSf%;3w6 zw7VmgjVZtW=#na-+Z(ah@gJ>FT4$2nnD6hTTMnEA9q#!ibXdL?e$jNan%(7}=$0yp ze}MRK^2ecCrmc9@c(AjO9kZl1hbxtAjP8jhyh<6kRsUQ#*tUJ9Ke(9>IwH$jDYd4~ z4+gklFtOnqhlX2y#v?V=cV;VsL`rTgCJs$I{!!S!TFcgKNwRI4TojdWNtTj_G_Tz< zO+hj16|UVP_P3b`$ydj3=s(ItNST-L$_A?`m? zjci>SSw8aP;U1R@B(EE2t3k2(u_-@qYi*A-jMX?l&%iDNXBX&gG>h)b**N;+_apv0 zD;AZMp%8kSCoO$;V3Sv=A)>_jg28R<_ukOlVyer=2<$lUbt+n-XD(Nj2I!@Q(;0&h zoDvsyX*lPhjOsI{*_bL#roq=Ke!k#+-m#@Pcte2gAAL0qd5X!K7mXW2OsdyywwIdx zrYe60;m5Ch%Lk>3d&}jzt{JZ_G) z(kZBJhyE6qqH$_BhFFZGnd~%kR#J0H`^SHOqfdG{vfpMv)4^x3r-3H@UA4%2IW?u7 z40|%w{{p?%K0~tsjMTjlp~{H`M?zhe(M8C*cMczXgqW6B`00|m1^?!>H;@l=!)AB$ zEfB%)LMDjaBwYGFQ>-=TE$`Weg7!XMeDB8S{`10)m#c~{1U=OV4%NTlDD9FWr|6}K z(VMB0w?7k+!wdxP8$F%kV+vN_7wE&O+~p)tr_BI%>4W7Z4g1Nt<9-GXU^C_?9)*$Cc^IN48r;v@*VK}z$2#vvO|_KgwZh-T(UyI>R`2WOL7 zD0N$gqz&@o&uU73Wu=s8j&e;__QNX+zp#eK4AI zQK)jSmA2!>eS(dPPFa>V*^o#zhnqs7iONF z2KG`5TdaY(I{8ONKEQtDq_ynP96vRHZN3hX!*w*X$>=bUIWI3EYi@rfPrgoa>Hp|* z!Ny8_^!qGb^b~FvvHTieR*;B<1t>H{WBZ>N;S0)8PF36b$4&_^a&+hPdUbnokj15g zmwy-Q{)Cyi$1`=eI0IRC>nmiuvBx(M0JeCz;N67^uY=Nk6Xp$7pj#M=oyvS~`);v# z#M@|2d#H&|5$4p0!4r+F5K}#~2|}5#WZ4*F_v$melzsEQePO6A1SSu-XD1O{F0(+K zpQmcnV!}^I*d?;hnaUxU1~)+<@}TA&`iuYz$?3yl6ElzXQMl@&@i3NkQp`iSJmo1A zyaSR1)5JWI4cKD``;S0)e>v_xS`cgpzV+C1u`ZV!) z-zY8^8V_gaVGXLoKc>^(M~YR79FwK8##v~|Iox3f zRjB;{s8+3kxnsm zy`7(YPST-8;DQ^Z`82SU=R~;Wp7gUT-cQPpw)6g(Leu2Zp3g$*m#|qFeb^tmzLJWC zyuX3E<)fZsK~-^1v(bCXp5IVSB5}_nbhxA;^X{^>MFIC3`-F#dEv4p%ZeOz{@dhz} zuOxVvy!GYD%v@xPnY85mFu_=P(uRQwtXKMT(*r@~)IM07dSf^-jgg+)us9JDyFM0| zJeB=d39H#q_~>X18}IE~-U95I`6+#}C{u(b)|z-YxTo|A z#zVzYm;n>kie|Z9MW5-?6>^YK*Ff&sKtR-HoiLLgO>GVA--?jC7@IR4fuO}OjtT3l z%D+2vAb@f}BrhduQ#7?5S0Juc%{Lb*>$bh?Vp{*HNuah2C$6HA$pV#C5fJk=Zz6vx zu{319l%HDG=XH!=IfDtz;ao>_GGM!h3016=l;-e_hVf~^;Z*2&MJ?(7vL=ar=tMR>B9w2AV%g4&P= zNY_Zn@@0xLq}c$RCS^bof5M^6>M{A)PH~|xL>!Gj_ zh@pFn$dF5QMltlmJVSP#*Y5n&f)9JGzyxp6!kUI#=aJzy^4POgUjBfdhKn%LLdLEM zVj>R%^MCo&UF^3>EF;T0oh81ShtcqnZnkMO^0Nn)R!8Nr2hd_)eb*j2+0fj-r}jDT zYY!E%KS7e{_(vLs@wS}=AbRU)uaA~ioI)_ETwx~a?>(#YsIA2493}TQ7?tviKBQ|V zN&WFq4IwTSs}7=|EfaW;UCpVjl&+GgW8QYsYn6)2jh)Wb8Oy^;FBwP%f0q;OMmkWG z@EfcTLT14%^tlJQCl{4$zk)>yqVmnruX(qg;LKOAgUTScE(U>4c3AKkuiv+ed*>4} zAU-?c+@T9Zm-xn(E6@YEU|5WJ5KxQK6g1zxC}M3Bn;F)lb8M$ORpm{TXWlKxt#gU| z8&THkTs2z_K6)p7u2H_hj_Ot|#gCqJpoCx62DgtA*WZQ}mql%#dF45Lyrw*v10aNN z7Y@+wTlT+FmF%N$unAF?B=ji3!}+M=$fjV@&GGL0AYFj9{$u}#DcG#l)!fd!V%FT( zWd4WdHputuiVkK@ZKa~r_K#iH>2LEnAA^|OF>j$iswxGltE9#SbYHS~^iaGeuBD>; zF`Cs?vb>DzE1@oeEwprWH`YLs{g+IYrm$2Lh-|&i$gjw^Y4^*;1@B=Lye8=}2KB&4 z(bJ%=IA58?o_Ka`I87tZ?Vh}Ie|p6pSNfzXzhBj94I%Yc;Li-_gP|~j4*zMF%ZYkp z{hxgMfH`O}tch&_vj|OViI64e}uSvLydB*H>mXy0#+Rpl@tFL=ICGY$A*?z2~+$k!I9IYcPR0u=)|U2kC70*8OMFfO6Xy5%2(LnX z_?5a0Hbd47IUYD-&c!4^S-vHse&@f_ULXf1sqX-);PI`d5xs~0!ukw3i4CBz@1|56 zV$AEFJ`hodvte5GQ=V;_GvCzw&@{MNHsC`RCR?)BiK|;%>o%wp!HvJomz^vSm{5@3 zEu8xs!X0p-2#k)njdNFmQgs1AQ$>zHt$5=}Z;U&~`IbCn@f_6U60=PtrvN4Jl#;Ja zo{!17qCA z;_Owa8_?DrxDSKVrWkz=yxb51N<~}O>%2qwecv{FIp~SAf}wMUOl$J99q&&7^{P>x z@X2V7b93}K8Jq<7Yvo=eYm}NkqbzMeRGg;wB37g-dA@i;} zMNocg@$*8nW-S7xIAAh6>rCF9prHC3~IFtYA(iyEsC{PwES9Jfmsedjsq%VdF+nQ zi_Qnc<7TvgjM8rBbYzXHiwqeUofU=PBbF)$z{knR!=yV@EXJS}bG6+y&EX7w>}6gX z7eZ@d7E^H1&JS@x!_4!OpuN2lk40AHIYLtl4Y@|W^54TMkv>MmD}70Cv7UzQ*`SuF z`-Gz3fB^s|+IqC((K`)V61{}TT@c1_*=?N4a5IeooB%wR{6jDaH!1-){Y)48$nxIV z?&J;)&2!Xvhaul&xhOoHk9}yJ-hwNv{5(G~a>o^BnI>cLTpXe)cEE z_9fo4;JWZsvkyXdycT2~giBIS1aD)FXNo8L)?`S7D&KKYZgI4O;wt(qs+8NDt{@Je zKKdtNFa=eZYw`NcBK?8g(Bn%Ie;%jP_OT%WK?|DBUa9nbGz#BA0&rec7P#3H5D(3` zOwo{VhjfN#L3I+_3yRaz)PaVzr!!KNnL5h`VZ`OenN_5c*1}@yQwI9`NQ>T{=~wm8 zc(txjG5HNl*Yb*;q5&_SL?*kv(j?m~WnJKzn=8_zIL91&G6(MVhl-WwaZ?_Zq#&K; zEP%hQ{biZv`h>ls$;BKxlN)Z$ON1e46ovAVtlyS1+@bQj!OAEC+8+O4Jac^7dIz7N zqU3Brm$u>GR*|}FTfFT>Y4+0SeRXcLV|3z=K&y0~ahQbNvU%Zpqq)18s zHf2a@~AxpMQ zIM>8Dria%w;wa^%6wHx){3>AM?hjh)z06p66t&;CGCuFlf(P2ezk%g&|KJ3*U#PBU zV2+?HtT$lI<)Kxp<0D&#=%h|^@aFlrabgZ)y6baZ2cu`>9JbWEoWx`u-44|L#_NPE zN5h3#4R*k^q=fEQVG0EnqeDyjCA#~0=0)G>^;A;KHto_2R`%P&~Lm_T;L5q^=ZyLt}ofn=XMYkMvpCf?mq5g33i`-YLe%~2R zI zY~-fjt#Y-@v{xC!FAG`DsG9}Q4?>ngRM!LC>)5RU)0;Ji{Lv#_XDJ_~&3*2|lze$2=*obJEo zjReun0B*PtcZ`Mhu72n3K##|DuF4Eavu{|(G(Q7XA5ZB*9wOWsH_*k*yaA=y znDt0eG;nn# zXIk2!3!$i6yBI5Lto=j@H2~;3TWTBhO#I5v!sQxe_8!*Iwqb)8X;A@aAsYshWK@IIv`}Fi)l(SkUpw`n;vf;183^s&(*yjf zy&T7HA;-w#8IW~6o56`yu*Vs<zp&(D#TuJ? zCnRj)x~vsJH2#la_QJS2j1DD{{jN_cc7iqE+|5d#FYB@S#dj9d=R+@@tBB?CT_+%! z{f76BG{4_C2Xfi+xkCWoZ3hw=39F&PXH9ExKakG7BPvr)Vqm!7;(cBe&1S5D>Z z1gZ;E}I3jd+}{rV)MiD(sCPcCW9 zE1!X>szNtN;b$dn81lvdaD^Xa8rn>_th6!q9Etu?TY8nuBFXVVP*_3p(`6hEk8dLi z!!Com{-%JR6i<-ajNh3jW_s4&OtX+mCbNRZtY!sWx%!S0NNXgnpI`ZFSthIrNj)HwnA->zGUkQFpEP)hxIGTTrI+doI~r9&$eMfk!Ua>j z^MZ-deBwM46j4cp+ktFJ0wk8Nzb!^CJN~iKC(gu>(l6E~`AjV&pAXKX9_&QBf#_Iq z-Cp$p#>;Lo#``i4?E3s>B0jyySn^Ps8!2%`e|PvQC-@0E2Vj`T8!Cj~?95-r8<+BR zN4+4f<3K;lNptv>hQTa0>EiBc;7OJ|CTJ(1pVdXFrvLp0Vd-y(JAeOOMBQ=I_A+U66(gnNWBw&otM+#nPMce=2=b%EUUT@8 z@hiaQX?^AxpVngAoy|4h3gX4y)wl;>U751*M+nzIbF6nwK1)h19C;IY&r5%&dU&M- zdf+_XH>Bt3Q_7-JTyj}9q#?BWkOxAct0Z*LCK3nW6TkbFjxzE0`xgwAPlXVE<%Rn=6c?dJZkbEZqk&4E2n zuj09QOGCYWmyU|P+KRFgAlU0+aB7Yk%m)X*L zHlf+MU^dMo?avwP&Ha zdG6BX;Z29`qn=Xu6LMqKuxn8B+k~1Q6grUrCt!Wa6ySJ-=VxAQ!R1O%_RX}ixNT+W zmtf=?Q&%9oj7&^G91 zdRbNYsG{5MkIYP9?Of%_j`}1&eSV3S;tX_j#5wY_LM9Nk8y3qF z-l+4V%8sKevLcv6{O0t)I`2WK#79C!)&_z>AM{i-DaRM)c5QgQpjLMgw{U?Rbb3Fd zmgi|A1Uj{6?2rW)2?6DGnBlUe-+!fcXqMuCgBxTG+3#px%H#AykkWI&#NiC?f#fh5 zcN}m@uS3whj&|Ck%h~~W`F`dv(IsO_M^1zdid_sGLLf$GQS_CDBjATkv|{|~OAh=6 zqyLF2;IwsnC*o}~b-&F@@^#Aoh_dY0wD+^xl=wX{UoKuV&_hRq>gDk}sGIXBD>Oei z8M9~y>G$HSVj2UT#!n@2KNZ2pRQF}gj7j-2s`%xH?CXM};8fs7wS6pZ z4>i?kNw-nIP-Aq0ncgNT84sYbEUlu}bi%Rsur15`YQ^iwZ&8@T!s)`Ud+xPN&m^4l zS!C>DWj6nw#VqOyoy=)z%&XGSD4^|~)F%nH1w0h?-8% zJ>+kidA_q53l5=)1Z8F0fIKz|n_j@_(7;b#!p0fPpV>|r^ zOes-`UDj)?e+x=c?lYDHJmjsq4OhOk`)P5GoKzsm`ed?0MUbjfC7s4R6FO>W=0hK~ zdq){~9}6qqPI_WHv@Z!OFXpvV#oimEa`)jOrICVCu2DLC3s{~h$}up+uzZUrq+3d( zPRoc*nA9kV#{+GA7|AMv6XrFNIt%ffHFzQ>O-FwWr?wQC{c^cO8%j2X7NdZe-jplX zSvsfglw^kQ1gUb+V5t_}{^)XFEEr1)!ymJ4Pu$6rF0oLvLYRM9>Xq3wF1aMXA}^{g zrc2-p%K-Hy;iTe%KGSZl^C~FGk-ypAyaFfn1-@r;shtjnPp?b{ZdkBjpy*>CPgcRQ zrJ#E>*esFVz*xbFfpZ*f5ac$C{S2+^vR%luWgm;wfDLhzU$lcY!20}YRYRDKjPXUS z?*oA`;zVG)G~0hVp2~)wCiY$dt^h7dEsRJl#353zi91il#9wYaDi}WOFxS&WCZIW~ zX){}O&m0Y`M`@-VMdDl5MukNwrvXVir^}=sc zzu|5C02#;q0B}3L2Eu~t*-YPy6*}V;K~Vt+Y);V{$KY8%;P(x zpCz)on#_4gkYX-3mMu7L_eXrEIpr$wTKeskwAZt4Q~b+YU%AD5YTGu!rcEQ!9a?N# z&RXa9{w&j~D;Jvq|8NgZGCGf?!|tgphGS0}Z(o!oo}F=3gLy){FeL}}c^!_=@?8H& zR9x@5xsG4E@*GZ_ZXGwIy`EfIG`(dwJ=drWD$$DVhg%mA$tWhMjUFDOs70Mc(bx{T zD|z&T!^(l}lrBeY;)|Yq&(R~?3agrtE{@1}4G5^=gR&wxHoB#8aj`rw;@L`)mgbFd zaHyr`YP$*{Ea%2&O?6r@jEOziS&=Z1qq!l#gGF`x!V`;%8qGIPpK} z7VbEgy~nA3AXGy-3%%1`8Pd*4wO!D7jJaK^n?$}oAw5S zttEV$#$8=sL@DhapVWvr;D>|5B^{{T9T3WTt#W-j!0BP;DRR37$xGEFUgB*8uJ^-n z$M@jDCv4&|yztM-VD>92W4-KzeM`rMDS83zUxG$zp8QzT{cN==$X*C?qGuzdqI#EP zOX(6N^|E$(d?B4rG1ZES@74#DutMVzR*sDK;+~$t-#@9`Z}WDW|2~)PXI|Xgem4G3 z*5`Bo^hMhJvM=y=|NJE}>N5xO-Fw~(E%$uVte~($t6ly-h3|@aQM&7v-=D4HzWUlO z?c#{t?A@>J=T;yN3wxmf3x3eRKdhiZb5?u&--Yifcu~5iXywn=C7*n=FKzFy`?i&S z?XoLC^hi_b*GC_(?s91P%kG2) zzuoYE{~4Ni_0RVHv0vK@UzFO50 zGw^38|6jj$(!D5kTI+^d8(w@Dn)Z4ubiMTJu+7yy4xjvWZ|Q>H-m)(~g_b*f>f-PA zjmyrVQkUK7+pPDLp86*3;rKW1WnX{medjL@eszDTS?K-?GV@btZQ-YG{y%-=<~mgB zcHr=K>qFtE&!k;^c_y;#>xiq`zdA(y_47vyexIZM_!Nqs`}C0iyKfE!4V4}WS>0|O zW_9Lb+Fs7Z`(-ps~DE0AYKK^ar`XmmO`Xs0Cv`#IJxSIBmdsR{P z^|hrte|K1^`}^QR_up9`K7+D1KlAhd^q+p^L#2NA4)3zA3_ly4c5x!wru^#|2c3<> zzRzu6F8JAU{tbb0uR@Oc$NuvudZ_g1lhs|;%~t2))AqiKKUMy9!r2Tvhl}-g|6Ay` zo9=}`X9gfA{D1xD3F=VkiRaIDThoWmrTjnY-UTkI>TMg|d-lwpf!WNA9A{vF;h+wR zI1DJDpnEt79^#;8XhZ{|qM3|{ifFcHhLd<`@DzD!L^L%kEGsOi89>8A8_i0MXfQJT zXF4jCmF0J@Jz(17|9PM1?fstj`~1bd_gZ@o%-Z{2>%P{#u4|>UonBIEOe$J)+fUAT z$b0N6`DIT&|64gfE;ckZ?h~s%?(|ZT=u>@qiOzJUv$If7}#{?%|n?PGVyOTI^k*z%;R`2HX{?HN3zM-}Y8O~CiqEl7!NNJ|;ns!thJJVZ3wkhMW)I=i8;JZaZd++%U$#|XGWb)@>yL+dD2UrCBx*lt;5FjG!7g4whKR| z#U(wqeRBFT&~-0=(?hhfb;cf@?Xx|1%9CEc+do{6c_}qLDrKUVD?iEKH7hoBO4j;T zeb&ZePtgm8nGHJA`37Z0(*E$}VRF^Bu*Z5D!_t?#@-v=uof%s`W#+zC{mlJpFVQQB zj~~`$ettN+BI(tfpGL^FUL$Ass7B8D+?D_2*RD^*_D*@?{Z{=GEw{WxA97|j>Lgz@ zR#zk)-LO1dZrT<;uctA5{um*DL4t5jZ1U7OpS9}eeEz1l=*!kw@91n_ywg;X^ltM{ zu;-mu#L^yBMDaEuf7x!~Q?U(GpZcLy|J0AgKB60jCz^GpFPr-+l3K1UA1!xm8~t2Q zFE{=^f47CPp^q(`+NNLl*fL*HhH=jM zYNq=0*DK#Xvhdkwa(?g)o^|`u=O0v#X`DA|adq{xiwj2Xym+Saont}u@4S8VwP%;C z_UpP_S>1JI(!1|n{BcR?Cw{?YU-^CW+m&}e#3OXof+f20k-K_CRZZhX_fUoWovL>|23EBW{1zCZq{KBA<$dPzyc$lX`dtKK^wRR7-RM_*t5 z`fC4c`Bl}|=BK`Y>EiVjO`rG&zxS2@jk53G{{|mjS}iClZ6CSk=BBFV-k|#C?;_t= zb!K%ye|=ST|AEw&f6cy8cHxtN;7eZx{PN!SEjRR|*Hl**t?3>4@~>yAKIjjs|KO*i zZ#;K>b>Q90Rn>Q|q<;9@#T#qyd=eP^+gE}2e*6Bzd$@|J7U&pmxEU8$Te!jX7M{9M zFIuDEhE!K`ho@Ox=Qs?~PDQY9mx4dO&nh;k%B!n&<)PtwT{5a$J%j68z20oBh*%Ru z&8@Dc7NoWLUUF2%b_NBH>k1OD?rRI=L{?V|mR2W+*AIE2x;-?wzI~|r=(_YZ!Jhl7 zt36*yJ27I;&6@1aVE;*&J2lNVGO%J^hIW1BRgdq!iR^jx!`Z?E8y6JkFXc+UI&eqm zPHh@}-d?t&@#T_L-q(B;X98x@2l{6h*KORr>GvC ze|g8HSAIAieKNH1NZgH-mfJ01*u(!6f=CYS;<-YRHr;;oBh9U&FRZ;AqBx}2Hl{?Z zIJ^F7?p*1K*h%W`XE!WJp6mO0)1Sj#yDzrBhVNI){j^nM6G*@e-BzTZhPz zDT$BD!V~eU~Y^tqQT8 z(**SP_+04m?}jgsCL7;qOgLurD{qV406?cLzR4Qb(FSdd?@T+kRKSOCwG>l5ol+Z-PZ8gSqW;eszhsKt{_e`r=sjHHG6eGT+5?ynMz6C#9 zrNFR!I2H$_DUzxwnM<)cO%bBsP+NO8*(^~O#7C+VH<^O=9aMdXuiyOG6E8OF=izYw zjO3|`S@VjQEi78Ha&BQ>@zcu|md(pA&Ra6Ka8yZN@q&3JqvkD{UsODI-m~+Tlq_4g zV9BWBc_qt>myF6QC@7w{Y}q5KM&&JD{HW@c3rh+|qyfY)cJGYdS=oh5uEk2|SNyVUT^+p3Ht^s$TbtpE z{N!G@J`L*j@XDS3>K*;9R`h))bOUiO>I~xVGe!N4jGn(r$@bFHD)2DmquIJ$ZL!Dj z@eRg=t!)M(0R5i50e!eX{Jpah3?t#l?~HFSj^70xkw`Ebcss@#Esx8bpK23M@E@yaHwQDMq@D2_t1wh!zOj#l5>&(nf95fk zt%yyqCQ;*L7DlfhX`wSDL_3^?oTM|9&a+NBgLa;sqcgGz_A?jg3?0#Kb}O(~$7C+< z#z>V^Yd6Hvl&`c&FY4!xM`y8@Mg8UR>{+6?pF4p)s~7i|Po$~4G-=)z%G8W&rIDcmr5 zq-dr7=mHawON+|*ab3LD-07lHOJ4#r-WBtgb!|^+MP=5;m&7J`v4-K; z4vmdp(t*9%Mkd?1bd=z(NhG6Jz&qWJ6_VD#^Fc(1$WMa1W3KS5^As5N79aUt7VCFD zQ1_SLsYh-Z!Wc%duURoY%rj;0)|6VWV)`X7;-yyvoq09dx?q(tjFVTxcpVVjb-u&r z&9}jKK5`#;=@ah^ylME&75D}T!Dan;SZ6Y~z{YPdB^IPo8$?_y(|QUMPOrXJtv{<*NHgPP1sX9`e&8&h^^bDZ zg#rKI$VyoMD8zcG39eWuu`HS~lX*1G6lg_@8~rRp-^Zt^WftQWJbavtp1c{0A17;4 zY>tv1XBZ*bw14vq-{Um%WN2IvV~nsqyM^)KG+o&YX2h0P$3f*jHJH!F#{K9aH%6M6 zU6@WkqVMrC#-~re$CD;@s(fnh$3u^SWC!9@Z8IBgVm;2A1@3U1U3&)^wp{1mG}pGUNMxpMmS8gH9b zUg=h?RWJe4`9c1jdGK~gxS;nw&t8Du9Uxtl=e!UA7xsEz(ECr1Obx!0)-FHvQb^b` z?GRB6QxV&Rd0$o#*;|d2HczBxYJ!Qc6(F@}89fDFJ+03zL@(8- z7%P{MQY!WdxU>WfmAvXgst#%~BMyDQCHZ3mPKC1{66SNFU=Yj?BBWZCPBYu?vS6=r zrb>s;vAZnVt4veb2;;Pd6SMm*Dvw1=y%SWn_Bp#!#MBt8_k!AWako^d0q{Ta9Ns_d z<;?Kb%VeWuy`Lp9yZ~GOrU?)4Oe8b23NZ0oCYexo9F$?eb-k1h5e~c9)y(q29V&T1}Pn)e`^gQ$-)klrKyq)ASO7A$JAq$(#WBO|@ zStyLruYxxqr*cdIrLAR3R~eOK2`DwJR=Rpql%FIhOJZrnHLe^S3i~7yx+bx#%B`9S zVul#oj2e~g+!%?=uM(GfH|&%}Uha-<*2gJ_qHbWCf`(1=HZ-zo!g1&}#(bPstN5ol zsB7%tp${Yr(FYv0Vi~<)LILLYn+Y!ncd@iiD6n&;o=NMaCY>qmr8p51JBJgY!opN0 zta*YDZZ)iDbF0Ol_$-iQK!Pv`$?5mXi3ia#Lf{# zbl44U5lYm(OvB5PcG!6f>%Uy8v+{k)@f^FA$1A`XVRA~5$)lN0@3+{E!gee|K{Qz? zyMcpV&8zh>*IeeqP1z|Cu|$*oaYuP}mS;N*$R@9N{VY$Oh=g7iA0~i^m@U?0m2QHc z1gMZEu0e(VY=J_!tXI29-dX!%+^tBy_bbIjw)tZ>t$u`>IdQlH^F9(x98{_q{;Tjh z*Q5831+1sc5(^gb0%bl2{R$2qr?B)blsOnW)D}uR^At8=E2VfG`qhh+cKa!MEY_sW z?ccLhv&L6yu|vNirD(Y5UEghrs2&0xY8tp8M#wO`;rX+E-Mpha!1r98L2H$!0Xmcg z`V}c{vgfJ@Ov|X%3{Db0N2onEbxk6V@M)s< z!xi(fZ|trZTZ&&&&Ve2TO(lIPtqu-63ccXO)S_y?X2lZED2h~FfToK`)g3r+Nc4&i z?~Cbk%QeT;$fXvH44||S%^5v9cYb<)YLV2xSzF?HN(Dfd zBS!RayK99uECLIR*R1j6MKXHfNq&YhFhy^Kahdb9D@Qt3@pH0*$s-aoIH+)|JQxa` z3~x?Ht2~ZD2SC!=QV78Ij$)iPBoftC^G=;0HC7{VbeYgVC_Sd=yM5xhm$9 z5aM98n)x_{=u1{JpM??!)6~q_P(u2+nh_5r(%^7@C{Z_0ZE^$84r-}dD|wkDRi)4p zoNfMyhL}EaJ{KOA2Xa2P4^{S)lEfp!pn3C_xKFl6RW8}p3<14X7u1G zcO>~*tA(d6m!_$7C!|-06g2R+)dtL+G;XSdnu&2TJ*+fOi$xBBf~(CP3U(|E3MTz( z5j~kpcwxNqWRo%OO;xIhjX!mSFz`J*d~F}ucqd3^N!$PfbL3`xrl-s@7tW0-q%E@m zt3dBTi@lgiW-ctiwxyD`bp_ZflgZ550&L%8Qgyfh3!Fll;BaUvsrsZq;fLjzrW^8IsX~O_~ry^j#~b%%8#KGf*){8$=YYtDwv&-fCt>b_bR|H;8Det)T4l zp~7!Y2exEU5K+Cmf>KD$$Q(qb5t$}rEEQA%j}aD6xiKZIS+U=9B#aYH;4P@@Ci9(dYaOw^8CUvN*v;61Hn;5`=R!vc(OBO~sNZnqfp!bB?4 zq_w-ce-<)jnpho~aHYLuyHHrA z5Pw-g9*R5Fanm90+*?j$GZ);ncs|6P>Qk6^=rCv8S$7J>9rIom$Z0eGyK(1q{~rG~ z;fiTzSHWurSR>VZI$;jhFv{BkWtHM!8qO5kA*_8L!#&f3w#3whBS~mUz5cg=bMTcIyZ^%h$MRD@`C-z-0cS(N!vP2X2?ZR}YG=T4 z1h4_;gDMnoQtn(Ga`_eh#+L(<){dK+i2_cR#|a2HlE^F+aL&3z!7d4df=NHlJ$bSx z1e}!ehTZ}@;d{Js?6Xpi_3Ipz0vD#B>r^ZtKHSiM}L-p^7p-P(eD%&s! zJ{y7`4nA#CQq2%DFiFS=9)tV9*z)Vj|!%)WuAEvQM@i6!L6++Kj za5)`9&$x*Ydh`%_hC-zAo(-WVFNlcU2vKGBVl}f9DwY&NEII@gE8vboXaTbb8Lb71 zT01hBkJ{vgMKqnDZ;U&EjgCD*AFYSR3Q1K59NaigFpq80cVp}ETx`8Q_y9anfO|GL z1X4MfG&~N4KhYB8Lo_RVh(|}E;pKA~pYpk80enQOfY5`>pjq=F7I{k0@SOG$h62!U z(hlBy%%^`YgTkA2B3TWv_=)NQbLxfyb4+c4`J=4`=C`;X(L9B8%u;Z*${`+5FiS_F z!lqhxD99Q|v_)Tk8`?JHKDdh@TJUh984D*Kc0B7-WLev6veY{JZ;n^~4&^Ys^LNKv zCPR+LM6-^U9>qGIVvN)AcyceTeZv=2zw4J&e*^sZUSJ*XG;%ys$it3DEJQwsj1ie? z>J)ZZ0*=>iqO_5KFH_u3{oV1#0lvLyqRd<1@)^-7Y+OPpQTQuV@FuC5?NXR5O#~EG z0hx$lP~j&#g)NyMN;K`Qr4+NELaRlFLB@=X1sVG!*6}Q#(l-)6#YWSgKGN|d_4;nf z%XqHjKAnZ;m<@%D&xS&?l+=R5Z9oGyc%T(|AP=ESVQI9@ zFFP9M_&UuCWHIh*;c0#CF8RJn76ffr$PC}Q(5%#{0P@)9Wukfh(HHax2bE7CaWvom zRho(LkbQ2Wg!aAy!#w!i=w-cgMd7;WCOo{@X&}#08V#ll3{D%v?uyGaNk z8G(I?Ay`zi)U97o?AC9FAL%l;lI;o^Aftw1n*j{b`N2@|Y#53Pn(0tb5G#k9Hm3nH za&=i3`YJ!e zVm#;hG1hS7W-iP;gv$!@Vdha=8K+ZzMUy%eGO=JJdjSJ&ry&Tw1Rk;oFjEs$Kmv>s zK!yPhB7vnEAW{fGq>>c?k*>n!@1bH8K%`^sP!S9eDGXtzqX3aQ05e5Fg&Ug6!#uzJ z3}7b8h73Ya)CFX^kbz16n;b}q`Sm?@$j{C@r5KblP-y;?M z4MQ!E_qoN$6_X^;C~yZSptuxk^DB#`ABIuYOPTDaV05`Z^N9TxLK{Yw$|2q4OXW0v zgtJKMIk|##r*iO*^#McRClr37KGvUc4=21B^Z9mlCN7;a4HfE-p+fAGDNrb24pdBc z|AgkzVL?YBD-_-dkjgzWb;K1*{tHGwi@|ANSh@TH7|vD#@};$SJRQg8Rp}(>C}aL_ z=2fk6{IX9+@k_0v_%&xBvzk0OY2d6B^^;GF9Gs^`p2P3wjZu>4CwO4r$?d%FxmP44RLi#M$unWefl=POS({=9O2m$PTUDutg*xT**w&#ZNN&s9ED| zBeTcZw#*r4dnRX`t*0`$fl$@W({2anfLYfx)TPd;_@ZF{4onn+OemP(XjoZsuZFk= zh$#gCm3K@Ko5jJ=gdSRfwRtpsIkmd^A)P z97S;r0M%ZoH~If(g%an{bU$BLSdHxkzLXU16Xn< z&|o$ztwZq*rDkLCx7o3(cZI^I4$rZCh37jUXY_%;f|OD@L%Q_=LEZZ9XgDTygX2Ym zuUXC~M}gx_n}!Ol$50`5+7u`hn9uNLxSs~ciwrvZu;Urt1;?v*8su}$V1mK0j@LT= zA2}Xg!!HxB<(J}X|K@lGA8~)>J(0t3@9&N`HlWXKSb&{3EZ}dBmmO~rX2<`{@j6P8 z;~65w$njLSS;yll{V8y~3-Pv*m*Q<(y5eombjKsd>qL&H+wnKYn;QT=SAfhs zFu`g_3?_o(4FSY-0uYw>n9#pF-c`U`?Ql6A0jlw#L|;Dus_&q}8vxaud>EF@$6p^EkB$mn(gNw>3Db(zl=Bn zkM+nS9nVk#4>w2bFyx3I?RYtg8~Sd=bv##bU7s(7;N%?X5ujQy2w@1q2oi=M1z1fS413vFpSNHUO8yViT+~A#`@Y zc>n}(l!S7Cxb+}+Y&Ci*i_+t&@a~GP*V;9!UztcsE-?7n(-{~w@ zHeF--Mc-}u8D+3z)brj1DqQ&|nj1@oLe`N#NtgHO8q_6pC6;kyF9bvN@&Wj!8 zpNmmeAwv5HmZAHD&T7Ci`4qnPjP0gtFe9@d~s;qPz`@lX--p zlRzsa)sbRfjx;iMf|N@<=Ec7xKACXvcWt|+kCspeXUTIWHa=8p`kf|#G=umWPga(0 zZW@*J`sA;-<6`2}SL$o?70*3cdDbmdbwORdTv1`&zV|#anR>qX0Dg&4kQka*Ca zIlx62S&zZGSt=p8n9Qy!UqZ`k(TwfcfrV#Cj}9z6tH?keT2S+)RYsK=eTttCFQ%|U zPbr21kT?h9`J|V*Ie8skH90*UUYm0=Ej$7lzP*BUXLiccEG~GL$Ek#EU0YlhEm7co zNA+B@^q`(AUw$fUry_>$&S)iI3LJ2Ip^bFc%^u#@gYLNiMrH%!+X2SUqUSb1{&$u} zJd)SUc=kuQMl{+vR0JB~b5z2zq>*;s5%VkafFbWwptF)bo-kpKu=851-VVbY+Yhl# zu!`0SNhio(MfAb1@abZZyW+$TK`@{ z6eH}yGtB%H4Fw^$)Z%enlV#U}x7e!;Kti$e*MI{V^l;ku*QtZQrbE#JnO}#5;jr(P z2Yi&lck6}TtrS-$B{E` zOP-vx3I9Bv`^xUQ^mnFQS6joX>Nk=;vVR=h;%Pp`<3@`k$vpce{Un@;7H5%j?VIpa zoXJtq-%1v0$(zy*n!_5jlB)=2P6mB}xm}5r8czmYP`LHMiRZcTi)pS9j~4Zi&uCx3 zWiWhMHQ4T?X56oLu7y003l?ID-i(c_=*2p`mNHLpbye~{mlDQDuG9P5d4kT!CcS2} zRh~reg176}H)J*AqtcOqeJ*R6m^=E-a!ep9Q*aLQGpHOD_+WuQYO6J&FyGF>1tN@_ zv3H$b$W@HROv0IXL}~s7Mq#YLe5>ks*?p(XUcOc4ifqRz#%p@ojYfQkl52}CAJxgp zCSQXID^~#De5vr5WV>c0d~-ee=Jv!<8|GyS{gb;4qsr%Lg&`zg+OCimHp&EtBqb8P z@LhVlb<_r_JeM-)y?5e%jT&2AdxYIE(w@j4@}5cfhDrE!lEV;TF+>d9HEE|+!Tma^ zzcr#^UL*YGe$MEF^DOY2t9*=F^TqiN*F^daOyP5_H7fuE9)@l!A1k(wmS2VUAQ7dO z!KDptX9F-n9+oI&Y&=B?-r@BFdX_-hb-9k7WjmbQWPCz(Fwgc#p#)3mSrARISJj1+MQ+C^wKN;-NyXL}Gco z5aaK~bBv_U)z{)*2r-U3&J)Ep69)ynb|r-hopzxH1Hw`t@*=CZD{@&b7^rs+ahYC;8m}{N_!?KCL z#)hGob8Hys-bVGvgZIYVsU#Nluv zN^tHz0cyT%m&P<{kQ_Dc6U@yJ9Xvi?TcQwYHmPUHB|#lLP&jykIBj> zn2b(pp&6zVfrU|mdIjIfF0{Y|V!90$yd4NG(#tV>yq4x20FS1RIjs1QSyYX_N9~ z7K3L2=AX)OD0s3aOKp_5lk$}^K=}$rl&=vQiluy=M3gVrEw7G!fbw0Od>J(t-y#IHeC#zK)c4>%<6bDP0id zE0>c|?ZQ&N3OE^N7boQl1TBcb6|f|67(6VN@^uX#o)1GWOZn;vD9%S0Sjv|}GrRy@ zK$I^$a7F&`Nt6gOBr02Bv>?|SnC6X@7vS`cDoprt_NVq?fN8D-wR6HRMcG_jv4&NG zHzn(Tp-K!KEG{|RVZzeGgb91Y9R}_uT9|;3a&UN?vV{qGqZ|g_CY>@Yzh=KE~hIK5N!WOX|C@3N=SPIMUJ)Rd+nkQi$;A{tGUl0}S0 zmSCe62$+)?9U(ZlJvqv1;mKgP<#nNKL>yGQ1LMBK!dt&Wg-yUum+I9;4mF1S3}W!5(CE{SE#HZYIB zn6nL4BD3qAQww+7f0<0D!>lNw|M1rq;fkaI{$F4jQEKPe_YUy?#4UT{9fn)BEu1DS z!NKXb?F?-)0}-&voB%6fIgNqEdY;c#!5&?34F@PXX2BkFFrw%rs2Wn&o72S9zj}g) zpCj7Jn$v3fEtUY4A^4@b5b?6!yiM=lN-8=hK4G0$fK}Zy;c_~el;rVb^mLT)dmJVt zb2MaQDf9yxCLzGyu{aOa-jMKn5)yv%p_?3n`@e^ZQ8|$CD}jp3aDSK&B>bL&gkPzK z)ZK;(H#sEymO{dBtp<{N7G&Cy=|H9v8JmVp_^qg4xy~h5F|1~$bInTwi@~t;rNLR& z(!{fVUvNifd!&RrGkxZPgOh)AxX-P`;A2}C{3YbV@?ge?l6?|3*~fl5`>fw@+|hj= zDJlUX?I0%vf)n*I%N{|n);zMzcnCpIW>zmJnh~zyWnex|2&%JsoJ?^-P}@4zO>!j2 zaV!-K@|h>isL)tZfxTBn`z+IcWyv|GN_9swzI88!1TE7>j*MY=uR((O7%XXY)lgdf zNM~Nq4(I=XLpf>Eja5Dmb0{?*_qqLKc$h<3Dr?Dm`aurm9iIm{lyQ}7!%oHkAm`q8 zQ`2p{d-YH3qUOW2YSARL#%MRZZ1rfJlm*!@&QYsJ$0V57L2CsS1{iSDcD}Xl8+tK3 z0~m0w1f3_J?Tr!agwa_F1AFz`lXw2=cJja~!8=)gzqz#!tLR6B;$#dk79TKH?NY7l z0ZGV%CCA7Rl0?W(nUQ~F@3^$k-P%TOfHG%1KBF5-x*=!)ox z)5@-plAAC2S=ts9U>h4@!M}YHX!eI=5RdsyP7N{J7%(GiQi?@Q;xS)x2=ce4BVoI&w^i9SKV3kIfTBPuAW=i@S zFqC0z*%#9w$~BEEn~wQ3igGRE%C>NQX6me%PrC>a2-l{BO$!GoNx;2<(4c~Wlpsy}3b5l-Nr%1wdwDYHI9hb; zAj(#Noi=a5qY20lL<3tH?~IjM#`G1yS_>>geyK&qf{engKrs@_kxVLkLfFF_)sXf$ z^wEK?3I|U%zmOTyVy$#={HC`_5;;5u*WhTj!_k zAuaeu2Pb+umrXCSy>zhKa#+gR{)U+LA?TU@nFb?zlVY2r{PF25DN{Q%-ntEuGRw5u zec3fbM+9L(AK;S9euIbO_1hga*mcX$1pGyZf!K6mXhI&Ga5p)ICRpKww@ENOA!wJQ za_Mx>lF8i67g40bSejSyqI_6@CLO!#*i`YfSB8?RYWQNy=KwWn41*|slsjTrZ@av1 zH*^au2*Syn$$P$72wg@57p&W^96}c?D9+@r+j9Y3K#{v=+rJL&Nq2)>-N4T#aR;_Z z)PW-3K6LYRfl0z?FAH0CSc=y!6g|*T(S6}{fp)-4;{8My2 zOd6?b$GBF@xf_a7;}Bvl1!@=+?qMecp@7QyK;##LwdeW#zlBzikXsW8CdCB^>TBEYXfD zxB>SME=-PAC#J5PpRPs{=2*Fro3acYOc4 zQ2gM9cOST5c<@5gC53{-FqlqZPm=Hbc5IY!^>e;ZfPZ-k4D%PDc~%Ci8S#d?zw&GU zRx?t&s>UKeAgB!EMAZdL4hXVgUNtan;*WcQl$3?{3>1w6N3l~c0`ipqL@(m@Z?z)t zowB?Br4@;lX+bNJyuH?`72&FEgDE|!ZXji6rQ!!tb|zB$|E5+%^RQOL@~~C}@^BAo zMIie82d&6m!+=%!`OY5HGjMNaG>K`UZ^SSz9#(26ji5OHcn8Usob|I1nt z+Zf5ZJO6*yitKu%R>c0;ztM^?kJO6fV8cuCU45(kb1+h;ms)rQn2)E@#}} zk&JLAFGK5=t-ct|G2TC8D4+yXDqJSF^62kTq{VBVPav#!E zX+E~QjNAvBszF|L?82w}1J-68aWU264eP+{a;dGwlS@Fcp#<$m5@|{+z~<)H;-RpF zg=UX%Ff({LaAz}tOl!FUC^lF|?*`-=b`0i^hz0bvN20OM(V*Mx@>@0#>SVCA~2@2LW#k7;B5<1ho1Qd%<{K&p_* z${CoV{>pc(!b_7P+W;B^#TKnxi;;2w&HXaRl^MUb^H%KZ0Nsq%4j)9UELam9__Sqt zf8~c(;h&RgS=k4gL9#j!G=p>k+OAFA%s7;yvG^ay-0X(0tsZ5mSrS6pWLfFpI*CcyvNi~VA9%K(Tsm8zqqCWR)HpASto+YTYuuG}u zrzWEeb4xf^#p*-69b%A#(4=KNNI@99Ia!s7D=kw{fx7_;8uCgUHgZUVc2g)KRyY|Z ziB(Im_5Q%@Uy%kZN)U-$t}4L1Qb-39jQpQoL_M-O_e5$b9vC(ShiMQa)J`rE3~g3y z_1urKQ@saSUZiq>h@+iqLwV(EQ|)Rh@*Vj zbWas9c6U3t%cpw+DSo=;2aK%r;}mmX)ig)|GXTjrlwy$jqvV6&tPB+d{;asnwosrD zBf1HA&x>(tHDA;NtMt`dD7z~C-!ORHc}@l|mpu$Jc(n=(HUZeYckYx^b^@3rPh@vs zxu6><-3DA;#OCz`YDw`tV6PzE$cs?XHKzlc4{Tm3xe%FWka-rFB4m~Z5espaCApKjr?bA#3Q^OYdIeRNGcu}Wy5+FOL6g7o4+Yflcj)p1+ z^hf8x$YC{kMf+nIuUu?aO+F%Y!9WZu(7`Utu3ckq^j98hMfAzsQ@jP3kHc$^{fQa_ z{C(c@6~oK753KUfV%J5EhoUtC{Zy7X`ED{=KFOOZ#GTR!W85uu>Vzwn`q!6W!uP?~ zu1z5uJ4S*a36vwq*N~#*A5bQl7rQ;4tj+)q6Nr(ltU`}-`<&kr;lq4MOKw?GQP3<9 zXl24Pa#A&m<7_tZO&`XgZZ6P*rMH({g+cHdCHvbKOE2|ESomKV2}(7 zPLxiLLt|7+Pp88WHDfD>b+~IUbzA0_;ydpPFq}^@`LUw9D8!)Lup`H8a|vEdm`vfR9zC&fW)K`iOD38m?-|8#AF?Zm6#CD z!=S_jC20adZn6gCCJr0|;>hp<>Pa} zOo#!giL*-$2Tg`wE>l#~4OGce=v2;wQ;@}}`^+y>Qb^!3ZQimN<^(HB84k&J5Tzg?3W7=3;QSw?O%pS2)Q*1`CRwjubt|oU zIBi;(&|41UOcdl0i0N6M@DC zLKHOU2;kfq;Aq6ibsc00{TF%KyR_zC?18z=^M4~x`cS}OYZLyNv2-&a1Xdo*0wklp zTWi2`wFW)wR-jx`v3x$zr#CY^;$a!2fkLG12uT}_7$9m&0tDuW*fxw+LRtfO(%89f zM2o?VNH_$?lWqivAv;uvBD7E7>{#uHE9JJ#uBy~ib{d&XF#ospkc%U2@25vvgz1r) zN0dN;hDZj3VfmX{3popc%&>zu79Uy1vI6UC+`DEXAit7?Q^>k(9)!A*ue0(uupVv!qVY#m&oe-ll0gEvV%Kwy zQ~l(dAclIA8iZe^vOc$kGEn!+lv8kay!%aU^XpPugk9?U@5?EQH_bQ4oS(jvI;~%@g4G5(|iRHyA_!_Fx3};PALp>>RG&FLIKp9C`A^47bg}& zhh6~ELx5a~;^Mb(E{5|7z`QKo2t>=rC#jh)fnzxxn3rk5yi}}&iX5O?7C#e8bi7?l zX%9d}UL!I#WE{vyQo*QF)h2J4pL|M-r-HU6?Ne4-0AdPNBaG!v2UPg>x!r_EcvGf) zBqo~3C|Ol6nnEcC0h$xnt++32!9mypiWlBQ z5VqtE2wSQ_*kT$Kwj3;Exf|9O^~i(UbDhGLG8rpu>7DmKDs0*CC}B(5ql7Jv!~ap( z(qx_mRLYse!&uGwI$1`%$_iZUNZ?`z?|T~520Ay-3K%gZUt$@GFAVG- z{Luuv{@p@xkmKD_SF?fi6DX|M1Vg_ELb9JNC7)hAZg$X=V3WOxtG{$)18M!J1O%Q zr?9mzQ@vb9m^;??Dm~UBq{n7%<*+M4HqgRs1ue|h#e)ph4iLd)f(Rz_A}~~0h+%(A z-|YYejN?sxehQ$P!Ho!-%!}daI#n=rpn@sXX)ckat(V9e4$MOvpJj$OJ!@8GtC;;3 zP{U9$+=2o1%PLm=lDDb3v$poXrhci1SPP>X<2($iU(nE2H5@h?042;C5DPn80nVX4 zEZzY0)&NQv6DVQm*Abk9jW2r7LB*4B2L*7hO@WLS88b3=wl1PTF$y5n`}%+b@8P-T z_ncApAu!kam;B}YSU_aZ7Y9@@&c1l?0sYH!_t6{zb*#KGqV5|Y0Dl7n;BV+GHmd>2 ziobB3^LIGlcN{BX$H_n4SX4*HT0D|tGueeUDX3wTpoU?&nH?8d|1>^or4HYip1$bY0bR(wm}IMjnZoa8W{)OR_cA!l$pRz60AbjOV!>76)lE$C#tsT}NMJYQk8c!ma8|TrlM^B$V0Pj)XGGDN|8lUjr00s|fRPwu)HHmkF{NGur*)UBG;8 z`-zsz`-udX14PTP0|@h_jYF7kzRSayPkRpFo(>rX%>Ql7cWa#O{qy52!t>+qV~7Va zU-b%eOy_dOr*ruuF<~+hP#T zn90uZ(cqZYW~8c7b|O^`)4l-;8uC_-YUJ66VIQX%U|+D)fHNA9s-}KWRrB#*s+#{} zuurprU$(89U#hR>55PW-AILyFKnCI=9)x}4L0l6K;+pV)LD*-BxB2CRvL-+N{ws6B zzFn)#F?Lp619}<+`?7Ci8HKl5*vE+xJGil+U_h|%E~sn(_6?|NAo{9)WMNK$iFr{FS(pdis zM3{e&*;q5twmNqr{qPQ8rsrX@vzB={xsiE~F1qjs_TVO9--sn)&e;HLD{)0yHc|PT z4$;Cg<%kycVPK!v_s$0Y2@PgYgC|0RCuXA5qWK;)_#WY;qSoIvvXi5oVm7C{$VZyvoozK&JR3_RjOVKdldxm_PMoI|h5O!q1bHD?s1V z_6F#CdOVT7r+ER=_c&O6Ps0iY=zD^?LEi(nvj6fF80JSH?m;TcJqU(cr2iOX4yZ>C zY&%&6+g7TT=3tQe{LgT_|69CnQ_3J`+xHVKWeC5|*`7@nNDA(Awm()Yjf(Yyob7qr z^)l}4gCv9z2HW%3W zkYtbyp>InL(5@<(!wSldXs#{3J#1^@H1c_*>~O)O#d_BRiY=Nzh(;O>_H|N2YnZJ- z=L#QHxx&rmBg~19k^4*2_)T3yN(W!bT>Omy6%XNJJThF&`=%k^9|U+LAnaf{b%@fqOx{Q~0Rn*ho!A!wf$oQg_7D~bB2F{f})0}F{ zlA~~O1xCP5+BhLqMZ!C8PfA2ncbOcCO6uU1!fJgCcC7SHOBdM9lN%3*+RL%m5A}k1ulMjYs62?wvB%PX;C`3^D|8m#wY^XD zkhzSX(-{nRAXXBi``nz)pnnchdU~Jgsy&_--gkPRtySHjR-PAjwuM~MFVAy z5`xfo6e!H!1(jhBRP2We@6oVj&v5`QKN=|eNvPNf6-(?2qG=t-Ievx;Ee1QlY8A-P z$Y_yaMC{HfbsjB0q&f_NSq-q4kpiZqfR)j~xk&C<*Ubzo#dj$4A%ARx2|SQL(ZRXL z;*^x4YL8|`y65qM%%}p9v=Nwae!8iq+dRBfzej1%pyj@K;Dqc(SATK5pFHa~3CIf; z-qB#RX54-zmpTA*a0V6ymaim+aG8?h0)nc!@zFd zc+paXjXj;zaQb3~@dEb6Q@z z-Jz9G$5f(eR!_^^2TN-!rm;K9`mhYaWne`Hw zg*$g$ajDcu)6k+JwxWN;2Ug*oNlwK@=J>LtK09ykKBwZs=HFs1ad1963yKTHa);sk z*+IpHWjR8!mhnh&Q77KROkfok4dOkG6CT_Yb?4&L8^`_kKgBkvl#Nr@xhOhaWLtOG z0|l)MTVJ5Gb0?^o)4z6LQ=oOVaBhYDi$WoAL4#pe5IwlJ9MU#0kV;jI9CmPj3Ua}r z#GPqs=7piKybepF(n84V+8`UeolSLXUM4 zYOqcHWI(I1G_4k`WuRW#3Xq@GRGQJcij)ubUdoyn7x36Gx!6Sg}nrJP7Gx z74uy?RLLoO+^9%KBe!4&K659e2SMrLC()WvR6X3Ael;4pg#f}ydnxMThUHY-TBr0Yo3GD;I~&wwgRw?MEvCs=t~+)`T#$; zWu+~>RhMM{5{I1&xk)yH2>*OW!q>86c$e(Rz|UPccA?4pBn?Es3+E&k1Lss)7APQ^bKaMj+`sR$sC;cT`UP))WBoRy zU)suR^zR$E{HMQT#(9b}`LqY(JjeIwh#|1m5Rt`A1|oPbu1E$Vxbsk4F{Q@~?>alZ zEOBZNk1xk(lyRo@@Lc4PGs;@wL@3XjQD%6o$1QfhvU#h(K6MOir;Bk8&X`8o)59W} z_=pEe!BeGfTvgv+};1o;N06SBhpIoA}n3 zyFLroqXn*}@t*O%+<_kIse`!gQ6@cRQ7PCR(wk7J-U&r@I+qCO95 z&N*-na}EV)eX&21C7h9D;`fqvTaDEgm#m@MtF2jNq=1|=ku*yBJ(hYNm3r<@l2?Y4 zlfIX9Xx3W+(Urn=-!%66|HIy!hc$I|ZR6);hKx*x*#r@AVsZc!FacB?DrmK!1&oM_ z6Go&;v1$fna14%U(FV0GwN}w$#XevYKpThJpjK&%8kH)x4zWe0YVEi7KEX2d>p#Ei z*XO;y>wT^#tI6h^lepK~_g;JNweD3eIp!*{B`2@R5OLN}IqtpxFW+}9_8-45NBGa* zmm}={eWRX<#%p}x2e_fUYacfTyBxk6|C?8L`VH_;rSj}!aM6d?+4dc)t=D<>g&Lp9 zZlY|4%Dj)9WoKKK_3kJQ5WKx3Q}%U?H^c2`4ugz8L%{zDSUAK_3Sv!qCfd@lPJKC& zG4zjgq9c+19PMkxxPcvs^hf61aZUavR{3@WE9p0pSK&tEw%ELWvMqO{2Fv)bW#?XJ z+{;19gN`4<)5+E9vT06>E7u&9#t#C1Pf>cEJU z=X+F=(X53s50!`|i6c3qh!~zK#etnWidbH)-XnuNSW?_Xrl|~`bPv})Zs$W7`D0n) zDz*0!b}mVuYfqHc&z9-#c_G{h#xgBRbZp0b6*RC50Vp*mpLo9a}^lImwBk z$r^80Uco)@x_LPvnWK3;v@|qK3>87M;Ol$dw7l$)T*yEftb!!g#844!FPp{Cd|9a5 zo5tH~OMsXH&9fQ|GL+D=t}lIDYhiiGep~KCT4<5RfgXzzVh(QSX*9H0TZY8Xed%MN z8phgy;Czq$Bcv8c8RgJA7)f^W4$ZMGvUlXbd@10ySI!6FRWqfB7f=pW&Za zkNGDsON4QbWPglV&IoLV!E+pTwp8-}<)8TfgMVT}tR?P^gZUExoHxX_HoQ?~duxrG zSkpkYwl_>{V4%&79ae_7qhU}~x&KQ>n$F;$DEBX7rs)k1v&#LqGSeyz4s*)=^~~$4 zUTf=;iwq~~k`2s>upY0in+|W92UIar%nh}5Zv&M?^MD4#D^W>G1$M{<%T=On200tY zj4Ffi2@Av|G`qIY%3Lk96xU{&r)v|fIf)DV5V~08j5N66O^K~Wd=BHv!Q2{hV4PZz3U<0#0z4iui-iU56&>5%^WAiE^N-pitOdcg^}}@5>`tT{O`)xS5q3;@ zyUX92LxVdJc0Ac`bYpzZfJk~mAaiGktBoHiR36ufO)7fiOnw_<80_;tm1VNjLWUzx z&4{he=e2DOHFHx!n+C9IVhm2{p=PIyQ1cb<$Vs~CE80iP-G@mSJ`i?Zq~NIby&@ni z9g}%UIjsJwHxoXC4f+DRSbxqXbSam-~)eAk4FHNoE1W>Q>NT zQRO=h?FeSOF${1j5AQw|5%KLP1jPBc3|2WNM?F&jfxXIWG&emE5yJO!GnBFVifyo~ z63Sbznxz0@j9E%_jYLO>2M&pWw1oX~sPM@Axw4IFlE*>x%a(wJ*b-H?vx*Dhzhb3TRjJ0!2C7ZyGhwsrEKEkGfZ8NV;M_tS;pqZJDCVQM=+g4nf9UlK5*D zqJs{}d_toza3$^>V?uS@NQZzUy`H-rghk3?W3Lx(m80xS-jE*c!zyxDNnEY8VpdFW zuh7N>#`v03t67U1qZ)uUsEDO3vAMf@vAe6}N7wTeV`x_c#K0(?R|I4&Qn zlLM~BRy3rjGK0mtW2+dc`I$0!QyrJu7MH5SWN%B0N)78A`9A|O3heRhjx{%==`$6u zdkqQvt)931UZw*xG%%2a29LQb8t&j8=-vXm*^ueqiZ+WHBN`G)3*KJO!cD^qMe8mX zaW8gUKHKP?qjtAFiZ&?icHl%HHi54xIs;tmLxGjVITf~&-hsr6m5$0a(xiawHGPue zv*o0i2Q@jwo+`0>JTQeyNPmVh!S~se>;%7x6TtQMHOo) z%|?%SVz1mI-Y|Q&zK{*qC_v1SftW7=kwvf_br4QiDU9NUS!vDY{{&PUG~D276*>Y@ zuWsdA)M8cPp6y1aXNu0q^q@%DEpcrHZ3gbe*u%Fi8et%ZUTx5F?W>7sE3Mu9+wf`v zaseQP4(b&IC^o92MN9a1TxsPgTAo=6JLxVj(3ZKzvxIvA*ybD}Z;qiV?5tuWh@3{L zafKakNT&CW8F`wKMh|v_fu#mgjwWGf@m0$hD!uigw0+-%mZ6+2Jj|0OBy)r}d(TZj zY}}b6aPY~@K1}Y)5lDUJZ9XjD)uC6%nOj!!FXr3ysyDsgzCiD1Q%3rz7T*kdSh-EF zfs_4xJ*w=w=yiQ-@mbdL7(_m_@q%>W{)Fkn3{E(OI7d*@M^F2l`~VymC|$Ue zC;ut+P02fpd6pbM2nXF|B4YM16y<)QO1b~sfb4=kbK|pFq?n^5NwI5Z)h7C~r)DR1 zQ|)(slm1q<^Zrq_iQ=gBQ?0bO8oR2t24V$(Xk~48)hcGR6{H!td84|jR+VCfcRSrl^zBFu^TpvhcQ)3>V&&lCHvEq~sWNq33X2p+0(R zAwv?qzmTDis)Bb>4TX%95v7Hek!6Jp#mIw&3`=wkyo){$@1mLuF|XpQ(LyfNqFUG% z$VI%0T#8pwIXo}+2MAx@_wgd7ngv0OAaLNg%BxnMWu={H{4E*{mq=>NNETZ)HH~!G zdgVeKCP7DIM?<^g`kXcGwqm1H)EsUi_~Mrv(&RWVQPdk)kSv;CjZS7NFOgVj&3|Ic zOH419s2)m37p`m%kN<$8Z&|^)IPZgKfq5>K2kyN$r}^tm^e1O*9E-ANqL1k#tLY;% z-Sd1%w%-aV+ix|z_QC68DN2dOd9kF)eV-4>@hJB}xHCW9J$wFMc-?Z>94_hasQP>f zh~ty`J1Q5~xo0n?d1#K@gqCAQ5GTq()T-fcIX)hm&qD^ll@1{O^BCH{Y6NlnNPmn$ zMbfB+tE`&eyBexoaF72&E55&}yP?X~x3L`Sxbg8_4OOwms&Tp4-B53?(XA4Ip_2QN zp+W|v%P^d~H+(a~pz1!6@=cVXws8_#`%s38t1o)*EqG~K|1{IqeRTz|TGzLAe7aR2 zv)j-ffOlz(v6v7?qmZ!P^MV4(_a;0O4fh=vhu^W6~6H-w^@B6BuA{yvL2 zVao6sLq9qqGE2lK;Jfh+q4);ZYY-lu50T#q-oWLX=Sy!&!4rdTHnUGsWT%P2*)^U> z`v4t+N0l_ko{8EanFDje+ivkhUWSAmlbXHNulh5XDL#hQnK}>|DvCMOsAec!Yt#&h zTeX^DajSxB+$$;O(5GXCzx1uq@94%HIyo;k;wJN_{oR>E75!?ByREe47rQctR`}QG z_w-;6HTk#HAm-4-M~FGJG9ix{kJ63|AL9VkI{O6404nY1Xr0rAag!`4dOEmJ1M>jn z86SA0KiB~lG5tTgKSJ_phrO3f{`7_5{DBokCDRAI6rAqgL05DwcI%Y4A1^n*m4Q`I zlz~)WHenT%U=>KQ3evC&)K~@2#Ykr@K}cs6Gtdo|K5qe^ck&rxSO%QsBs;3sOgm#> zZZ9h_xvejIY;t43F&1!$DTv7m37HFXcnrZFl`ZPaPSuoxDzat+ook7jk@C)&sk6ZBQAI}{N}JD}J{zSx zLeZLvV7ew}gcm#{H%fzAb^xZg?%?Ues{qsIS$6; zNNBP|LlZ`QMYJA4KS2C`;L2^EAp9+)#_)AlOqb2i)9$>4pnd+K5X%F};l^e}ORlN;JZB>&`TX`6$7veJH|o+LC&wvv1&BbA7Xwk@F^%YffQ$ z%%E$(Mh747u<=Q6hSdtsq9V?~?ctq%`O2b4+NHmEYc4l!ctp=0FGU2pgad&4M|ZNm zxRb?kU*JRT=<}|0N1ylLwHjV~JAr$ydyWrT;l31u`>YuE>{;3H+Uu_QwA|lOb*Kcy z5w*XgG7~UA^P;=v&|}nc6GT-bh~q~1+ad(|azOK{5D>?uAii_}QA<+bo*NN0@VZr# zd#Q`*8o#;6|Ghxm@_u*ICGNMeO6s|B6T6zO!t4CUjCEr4`jN=KauGg&)stw zQix(QPGHlm7!gT6qDUn{AIUPg$DGcpvNmwoDo#}|oEP#ceeIXAW zAMbWWb3teb!j&obhN1>^gJR0^P?hc)6Qy!a`OcZLu zOi^~im1l9;!oJT^y5I_8i2gfV0q_4GaK$t-YT+}h=2}JD)42!l#TMjh57Pew$qR#BeJLt(!$Gr{W3laST7e2{i? zHL`k(QHIN~vgwg>9>iDzVFN7$a<)PtXA4zg<^0+Y<-}OUC{dqB@RaE3^bosnU*A^O6eQeQeXE^aNyrA>bwC4np@+6)@a zv|=nGcMfK#j+-|^Ji?%A2tR1z?vs)xvDFm<@@geXs)Cdd_v~W|_w0Pi_ZEv(cPrf; zRd+1zj!HH0OkdFaxqJ3k7I)19D>UDicsQzlN%U}3Ze3t1iCxG!t6dmRoQ_=-Pt?(~ z;)#>>S@DJs>5DkmQPU5o=?XLv7qyGyi3_p0@v`X<01`-#n&1Z{wSG_uLj%!Qux`ca z;g;F@u+|Ky&7Gm|4%eJ-WQ$$T5kao!WZ%B9KwSpNae%5I7TPiB++(~pC~#?^z4pZQ zstDF`p2*t;u;u2MHGnN-3M+3^D$a^6{RW$_VHiD98b+C~rkQ7DT(_BT(M4>&ddhs? z1@rx>!+d{WZi+X2VtU*3Nl}XFllWBAC!DlSBmC*8ov?am?L;*2o*P=%cy4Hem#RRK zd9auvnO9NFu*}sfn=TmwbT?d^z*BW8Hxo}#f-8|r3IFGmr;`$HJyhW z7n1cntM6eTyKC3K*Qj!MyM`^RJJ@;E}7TE2sL7UTR}UN4{PskgjRTvb#MTlbWNzDGXZ_!ThrQd>9Z=my^w8Qg5yQ~G^`h9|Y?fuBt)`Jsx z#V$`NA%SN@0=NZ4|GBJ160(A|P(mWc4Jd|H`6l10d6VDO{Wc$h^tl6&K6gOfecCjn z(QC;hdJU08uidESMpq+yMh1@Z5#iOt33t6p6sIC^&P+n!ymf&-sbT?26r*jW62;zv zEsm67RHB&jdm^C-viPtot~!Q-!#Phd13)}5065m-jTjzj9*+Aozzg?j{zj~d;Z&dQ zq*T#Lsp2O}71@+3!YNgF;@jHG76MA^K{V|Lfl>PGzlhRrg_-MrfXv1phIJhv#`}QM z*8ruj^%x+u>wGAE2|?Ij@w=h)I4Ey5F097@k-kH3*@y;+8R%JH3G}5pjrjnXw9|3#Em z71E>5uZG$qtGl7JZizmuRH+h|Dtn-G=55*HT%eE6z1a<=J%DiBL-02!?IjRx?FA@3 z^Fxf%LU!ILSDeSzejB5-Y%4voe5(zmCkw2MDFR!$_wWJ8$smHTlX1hIBUw4X=4AX2 zKg)D z8KDU%e}<&!FF=X83)l#!564ERx<@3G-lL3A@ew`J_>s*BeZIj)xC|R%%yBTnW}6WL zN=LH8z05hUQM#&H)UdPzrGsy4BH30?#*~v78r*MSlrCP3QMxV+qqM~Xqx3UA^6Six zFf^E!V`#YiAAH-bYxuU&gS-Hx13^RwffybP;@?E+CP7=}3Fz+=g03j7`w{X~uaaq% zS9_qetcG5zuA)V3-B^#k0k70Yn9#!=n6i|W=hSy&qe zN*hNgZ8TBZ_=VEOI}}i#Uk*TR2GMjG1P1Dr?0?Ulei&)4&xS0)?8vTT#P|W!HY#Q3 z%1e8U5!w`C8*8Z0N*gNdHb!p2gKkCk7$fBu=o$CX7ztj1#)$H+I?Z?&kCB`xJVsid z5DCOHn>*bM?ldIQ;d6{zfm9AvG7slaDMBEJYDS1Hhe~xk@n?k9rFpNhy2AUvh}FbT z;89-#kNR3StTw!-4>LjW7}JU#SZ(?p640IzK~R#bt4Cb|{aYgZ8?4?U6g?LskNOqH z>a&2==P*_$zo0zo2jEdZv|)8MWOIHA*_>!WShRGv$iLnl1NljPT`GgSQGva zfa`@L&Gpu3@P(thnxgs~QH^HB4dNZ7V!O)xc1Vir$sGb9U_4Fu=*ay8aVy6l*Vjo~* zzxq3j5nF%8x5ZGmjs6|dBx9a~h<*WL_)8G~CSpfBw^jCbhU}JZ1+fy>YOX5_Xlcp< zO%K1?g;`4qm^Fle+0CyW0S_AC+yk+jV#%@R5MnoFBgAei*C!S2#fYtR#)y4-lELZx zBnq*E$B+r}V{FB-WVbP5$K+6mZ3Y5{cr(AlwXVS38gLnRD}(CR=f7cX{QfT1Mlz+1 zm6SH3DQ)bbwDB#4*e~}2VypH6=;VXIh#d}uBLCI~$mz-E`f-!NBc9xKm>8$q=f#e< z&y|n2@9x#mzI1M5z3*(Lz3<#@nB>8O@+S8fCene-mQiS!=o-;53Er+rQ*WoC4Uh?M z;$ag12AQCELr%HYLz$5`huVfo`g&@ZoaAG~ZXX82 zNa=;V>y$#Y2eQ&WZ`3M#w1rnaNshMgWMi0-(LsF?=z-NRk1n&B?pOtBpv)IOz$ zDUwr|4U3Q|7X64!QF1_&w&Vad#j{hfDaw+_gyba36cwq=NMowa6n*k3Q#?VLVhb|G z+a0C|h<(7`+Q03#BQ&Ajo6BT|3$|+?Q!y%j}f{PH_bsk1+!+vI@^g|nBZ|!AeZ0}`5>^vbxY*QpgY}elav7LYWAB5P= z)6MmY>EIeq?`n$bR4Ah`k(*0Sd%;QUn5g& zeT+=eaz&FCauu6m`rFtP^^3@a>P3_(TE1XL%8z&W*w-ji>`j^Cd&m@5beJL_b}F}K zP|X*w5xe2J=<=}+#8&>|;mt!ieq4#Xk0W zj1kV%Z8Yk((MKR5Jmx5f=+9AVcom3$6S3XJZIv&e%U|^BirD7cn(NjZv^49D9*Au? z4?gxO@Uc&IM{Kd!suA}rJzKhjwEG<)cKj-Y*q5vINv+iwu_MJ8v7e?GoL;6-h;3a; zCUD-dAvQ4y0;OisWBi$TSES4t5W9>DOn_Yx0q)j-LfozS^;jEU&cxdIz7lK0L}_Cv zr44sV8$3!I1r%a8L+*X61w>N|2#nZ!xc{Dy{WR5FpO*@*acb9LVl)9_pWx=oPxKfj zwC&Ry_e9`vLga z54s_?`J_Iqsa7R!s_lW;tt;h=+gFf5?JK$=_9f`wOX9yl?C->)NMGb*3yYDD{R<%W zeT>+-t0^D*75Lb%Y>53_Y-PL@+YsC8j1gNg86$S?SgAynGZsgH{Lk1G$x)i?+h>4l zJfo{As$B(nbUQ&VX(#A`*h4+r3VL~3HN8B$nPR5Wz|B1et4T!~GQI7KG7p0fGa&g@8|Gn?8K@d=|$aT{fdQ;;dX*(q&aoEd|t(~_$CU5CtxZogM@Cq)N4;TCi z7hHi07?Y&6_uzuLb|=;L242k)&kK-a8Bcd*Xot7Ham%^zUC-$&5>FYu3aQkF9Q^IU z9Ifhk8lK)(1mWqeR*a^%#OoMPIgc=)W;~~Gcm;*SwHSwgrf$o@w;3utp)RcngyAlF z$M%AEcQ&gA@J{%Y3~)Vhs{|s{6~OUaZ6Wp>WHjq@UrRpmu(-v0+`|)$kij~l`K*j) z?nAc=|9SJiA;v{~Um|L#j^JsB=-~GZ(W%Z2mkR~HM7;(6a>fASTRn*HRD55|^0{5> z{l#W_TIFW#bzltYm7+3IOu4tR%^q{I4cs}|=1ZZ~DlIp(S^?4Wh-$j^Cw-W;MJ2Yj z=&vqO8rkA}GR0yuYeFQTKHlB__nQU=U0~xX` zs@K23y>9-2n#LaBUf=q(bFY_Ey?%k}^*Q)9{ZV|IW#29>PyaaxMLh_~tg%F|LlJ=5 z|59Y6vQaM7eoF?azLh`Pi$bvt7K#da*l?g+iLfx+BUdYi$>~<u3$f5EXJ4MZSNZJ=0?US6V=eF3A(XCRDLuM^~*S}#CebT1+BhJOdVeRzQ*dG(>W7(q{TVDg*O~2qkZ-{kWtg zwWWyBTwJxLx!3@&^YCg~^H+d|C9Md8VP@n*XpG2k3c_tpnc!74gY$~HE1p<;dS^Vb zy#OL^zAu_#`aV9Bvv&0R(82<-_cUB^s9;yT;Q?nJXL~^zG>ryvhy~)y({RPfmg4jea(}b{z^xBD7RM()kC#+;?9kzI=jY{z==>IpXmwGJ0RF;i!#ix88PEiF_XF4+aBOfhmm8e2mM2ny zq?f1R!poMKa%6nzg}CS~CvO_Za9zl^cYS+u5^5gZ*0^>lV zD=(~a{5=7r@<~{;M50{+yf-m{jdzMZqN5EapGz2+H{8R(d@BdzdHQgK=lWnTgy*7C zd|T@ne4DHBp@hyk1)|*qqV+t8e>1W@GuK>yf4PBse|cB0gcJ(%w0{b6)qnQ%NLBqi-JU7@;j0>>UBM5Euw@crtsQFL5}5 zhG^8{1$$fc<3)q%c81TOH7Zo6`ZVywIH%?-FmJvIt-pI zrsFlkWXtIW2LQKyisTA?PvRBrUV{p+T5iOn)(k$mIG(nTRWOV}+rr8W99C=9OI3@>1aNdCd%yOSyCmcYmi~^-RGh zQZiX^kP23xXNvkndY5}pY7%^gV%RICWQE{!2v$E*&>UV?l}$@(OePl{^FYN}l;YIR0@UmA5Bf2*v1A zgt^8PVcrk66eJ*1CsAD2HSadoNvKSJ(z~t37XN64grh*$2V{`z1E`r<*O7&U0wL{7 zXN5l?KUta%%WP{I-WYuf8>3J0GW)4FUS?lkVQ^|$VcQse1RJA|Y|CuxO1#Y8`x9Pf zbGC~ymw48EDY1W@XNhV=$rrj24%NC5B`4s&|Iz*Bo;7nrN{F^~!6hmuTD7Z@d&2d5 zcs=GCzmhrG$r{6*>fKhw3$$1? zyuc>tAXFE6ZgeZZU$lkUFS_*|&lIbXIg^0NPELvq?NBbHU4Qo-Jkg~SVjVTnZ4efj zoM56${1s1hr(vS|8c%dBzvGF{aF@Qvde=75eIU%$R0yewF75#}(fJ4AiLSH;Pjn$^ zTr%Z-VU>&cawMcs?yY49_nxqlgKG8yk%~xL<8OGc{js#PudDWocf)((Pvpme@#JQK z;sSec>1>HMlwc0L|ua{80KAP%vpU%CW7>|3Mvmf_*+qbyaf4z&96+LSt?B`{G7zV$D z2;I(5EO`nbq&VYNTxK-6Z7P!+m^4JI$LbW73i+gyvdvwiQm5`n`MappvVV?B{jGOf z<>lTGu+Y2f&Yty^_PXc=Jx%mN+x_&M_>)~Lf5xtnJ!5w}J-5Pxti5}j#RU9G?mUGc zXWkacs1+#}Rp9$hn*) zC90UuduI>}%3s0KFpUGQa&7gWa#o;)d7>_;WvyAak9kqohll1o@U@8{g_m{2K=u_K zng_og(z55W?lVtFtJlI{XY;HD`7esR)q|)SR-5qn)?v8oaZEiM(p9ZN~+#oGyvjC64#U?0!n|VIuvQ)i( zcF5Nv&YWo(ssipqoq0gJ&VZ)VKu27&r8eGTXNjlCHC27o{_Fdc179DIEmZ!Th+OL< zA80B1H36=v_xo`XadFhfc*E}aw@te_DW=^fcon5~ie7)XrZk>-KB^Q&ucxfHtVvma zA71TiEHm`rfoGOMIQqO&aKksWuPNJ*U!c!~aCODJN(fM&58>^W`4HaTyir%6mZkZ49?fL}}->z5)@$G2di{EUnKVM?to-gU8U2=WTO-TFGX{974stuo*jViQ{Prnd4)qgsnk# zkz}A9wWX9k1+o+&T0^!Hp;ATT$^jIKv(7Kh$Wzu-;K>yhrVX^K{j0zQhVpM4O6QjapISnPaJopns zc-v|W;lGc>5dIS1rr5eYpC{Q5!tyx?eLaYOGr1@;Ax6034O&p{8!=s%=1<19@{fkE?$}!-Nj4uy@A>_MEon<(G04i z^Zvx}dxGldAE=IgL3Q*~+|lOeSU>T9;M=yo!uokHWh=~(X&@FVKp^hZ2bGDZmTT=`2R zo-122DKJhdj5jDBoZhse0a7}g1f|>*XOGG>HPYsp99U?cW2DH4U9t0F zy-r^c4|8AhEcfh$`KI4#3pht(7r;uL4#`Ca>K8&D#zCL}I4pG)g7eK0g7e)j_(Dpy z3Lty5P;gY5iJFpy&=ijnO2bh?X#h$ng=`Gkk-lxgoBLX6oBMW64b^{)xNR+{nT#;p0TRz9GMnA_c>X9wsALq&CZZ~jqw*xCGc-UQ%{teq@Db=vL z&vy+(tNZlvtuAxNqt(4W#}4O+UIx?s4onxV?%&!0sTn(LtNVv}cy%9q7q9O3mKCCs zjGP=kY%zUlajCkUzLY^|`}Wy3b3@BIgamPz#8-4MR(a6#mc>)sGGrMFaT}s3{yZfymhq zRzj@jhn1+HmZkB9V_x!ou&Dcvd19tGSxK_QA{`1Knh~?ulu8RSrN$(jv(N;ACX0q2 z7=TI@5_S34B_|nal9TyqUmKadQ(zYfZ!5{4!-JkX=B2UGTql9K4r-6VTvrvOzMqZe zx|1nruDia&JfL+4p6hr{c&-~d!D1H;BaI}n9CTZ{vOlq-;$eK2b7G!7H73SB*2=lXQ7#nr7ViJm=G2T)% z92$rFSqnz^Ijuml00E6K?EbQUd8d8=xKpGD&rcn&@&ZdFG4S!jMR z^?3DlL|>S-6@Q_A(q8n1KBJ4VQzY(7qh;o6j;)*IcUJZhNLW7%LyU{BzHFLAn^UZJ zSbHTferK?@6eLhY1HrCQMt`t(OtE)g&FFxX{{+mw#hd?S!0hw}ivl+H>4U1)mG-4I zdz-$2j!|tb-gm>BXraC7x6!bI&~X!YhTA_PWr2yaZ^hT33$_*a8Pb=?Kf9F>xxY!1 z1x&Cb%6s=ETI{F$S=SN|4YOkss%HbtTZ&Sl15$CXSfQ~M8j~$WN@!FP7*L1e=dm1V{Lm|zqBJY?=I_zOc4)|X&h+L@bfp^>IH?BG}IwyTz` z1r_B`DmqE2=-2JI$12~ZRFnlO3iP2@7w{}lCwaVyfL$u+*Ys_8uw_ogSH(=l{aW;9 zUp(K(Z{u)O@jD37-nVJ8_$)g@S`Gi&=Iw-T!1JAk0krBq`|YC0{dP4LRiF4>W~b4+ z3|zCbCm(8=)sI{((MhTo z(@C(+HtMRZ9TIevJ~bVi$}&4_Dp$c&O8bUu9kl!S!2dnOGbkn^egb}bUBUGAwtpSWdytzAC-ywj|51@1NhyxwLF(?M;KLGjnN8^ykh&q)LqkI!ym+ws2O z&5^$IcEK0AnnAHC@i(?h@bhr)wZ>EGGE|Gune0o7E<8SMXI0k4!yA~O- zaoEv)wvjtO=A56oR#ECB`iPS}bFG2*5yzzddtN$iqv{BwJ6|r4Yi1;cvyw(SxcO}) zN28$WjmvzhKl9YC!<ke(gdQ-~QN@mg)2$L%afAO6Y#6kSDn{ai z>W<{tWxbD!k?erOhN(MKzUy3!(VC5L_)zX1;{K9iLHnUtw&9Y#Q8FX| ztwkCqHq5U$y@9n)j#B^@zP!a!{thKPT7oi&Omou!*u6$()00(a_zKc5RK+X>BcAC)uLuAm-U&v$uB_Z<#GAl~`)w+7vYWUC z+3%n&Al}&4oCEe-hJ@$#Gc(^;TpcSLO;k&!w)u@Ta$m+Jz*2J`Jy>iGgN>athe@|*)nD*E+aR& zk3@BDG%JLwungPM=rn;9(xk8yZEbX#%nE5$SUB4ooswB0?O;GVfa_sZzhz9cO| z1KY);(r3pJNvElwV&N-@1?YVb7mCY5A&FsBrLJ_$VZ zE36q3Rm~Pe6|R;MV_4DJa2ClcbIacVMM8?eJ2p6E?DN<0)1i2Svf=wyySZA|Qj+Ic zJ}gi3gN46vU%=K49L4uTpbq>rsO&)JSbnsF*}X+y>bP^=T4J7wYV_PnJ=azNp>a+yNB&GyTgjd0 zcAo|nq11sXzlkgs?n3ILJP1DC76}%+SFW=(MKctcuy&K$4x~?_eOaB zPO8i-NfpVNN5r_RQf>+mV}Ffyj|h&!$T24E9vPef(8gTW?omPuZHz^`M=#9PMhBDw zQNKdyqk3ww5%u2|^_4nSy1j%4Yb4|;*i{%JC~@?Yzb}sm7b4zq5}X;rygI1dvD!_? zfQtg8)I|J8pKtC}_ zM%>jgy`2p5+2#Ia%rpRw%yRz<{ANM9e-(a{Rqk(KUMIwB>!ueOuGJy3ZSa4t)d3aj z#Iiw`5$pDMb*aF*?K!B0V%=Us{hQ|~(f5V0Z~%uQ7=37DGW5hu2|;XgM85ZET;tD= z=G}{EdwhZm`)QEx z-5TjGYdw;0^Rb0CH+`i3cgQ`6{Py+#lSOh7ADH|wmbj!j}0Sq)Z<;ze`7WY-}G+jpsHT(RwdWH*}=$L zcTOSDly#IPoRY@M7PUBclx=7Wt)>9vo#9Y zli4b^d?JJ`;-%f$AZ;Wkd+mK&MVZxZt)0G-_KiZ==_@l??{)ghxWTQRzH;a;b?;7J zd6D<3(^qbrL)drv$|2gsPG9-4TT#qk|H_ze^qs$QK5M_I?OEax+5lh&o=0dDX4Yyq z#vxti>w*<;4VJ8t%=n9e7|H|0DD0P+6Y||_XbG&tP-SeOAtr%U*->zVVju=iYf**9 zyUpn)>vPd|u@ByN>tJ2_~-=zC`r23i5}HDpl5YzgC#h24i$0L9f@FO&0t0tP$tvXf4|i;U66Zopf-i_!taWfS-JBu za6;zL@In)PN#;4dnDW9S7`?aBQ=n`SmA{LQ6M!by{$~mIE^Y!o+xT*?`BE?2C{=$a-F zZe|efCJ-J5ijh(oBc$8a5WZaxABkRhbl95?DDNI$70<1e!Uj@lw_^kYJi@=nv7^N< zKMpyi;f>fSb;>)HjGR(Q5I%E!MN8oDsRM*YgHwDgb>OJNjFi>ImvoJ)A+QEjAO=zNB$G7a!XH)_HCOtZU9ueSy& z_KneA>Co%^5D$fW4a=sCOzw}amn6eF^qSIAu#Hm8|!gh(1m>y=~ha$ZykaPgtY}c1;Ycl=={lKQvol0XnF7EG4fB?nv7aqj3{rG_Dptl9Hvu-=t)&@EJb4 z&?p=0Co_ZMUApE7?_YOaG$2=guyvjXb!Y)67fiGcZW*=M>{263>KY)#5!XmkdS)&Z zWXq?cg$$#KkB%(v?oF!XqD6DuXmsvI%(gPNO>%}Uqe(lV<GNvg;#twR2dCR8)LODd z&EFImXCh+Dbn7|!4SfO>iMm#{$&-EeQbhg@{kNX%)=Lo$H})so-!HVI<^++~(-XHP zD{U|ocdurXH~W`Zyk&VonmA_F^YF~xHg5DI!=KR4s$XC{(t4wy(cQ6zjjxKn{lf-P zMc?21;MX%9m(Ls_$&Y@~@u=*%`Bw^87*X%Vu zN#WUReE(vr&MgP>HDEsm@?9XwOz8V8L$k{Rc#wfuEr2y2lObRBGkv3GNL(90xFPam zci=rnglxI!nq?9)la(U@F1Bo#vRFXUhK>M-T&!1cf>hG3(Y=O}>#EpXQgE+(eEF~O zi#dI2B0@!Efo!{# zF?})>(QARd(udOXt=k)h>p$#3q``F`9uZ_hMG8y}OWTlLe2_l<>|b=>^Q*>ZdflIV zSCri_ex8>V-YmU5et}n;qfM`seU$Tm(eLQctM>+{6!uqfHodl+%I*y3_}ldQc+9+dJ9j|0@(w%eCgtx>;j*;;n@Ygb49=+39RmFvXg3oS2?jSdv;gV0w?Ep zf2Ud$)$|Xl-E*-%-abguud8Zx+pZfX=aS=lsP>0(i!1uo=s)VF+Fbh}OTQkfHQ37^ zBh|hYiBwy(Ep5qLNVTm4uxcCYoW_mEsx?$u8JD}LHfR1ZWu)x04%O~X|IAaExWJ}b z&BxQne@(yKNwv{Wrbl_#^muf<@_8AlhLi%JfP%^T>)&I zvG2tjj%nZJyh4-IQ<$WPhxO2Yr~bWo;(Gl`9274(*;a`;s2?3gX&FG1k0U96|1d0H zoF+=^5uWOB$>TCNC^4w(f%z?NP*G46lqJQLC8$$#s4P)_QkRB^f5~P{{JZj=%gZ$= zgwqWZ{~AIfptv1eTA4tV$^}bbWIDbv+-N9L{Ivl*>nf~jJN&eRO^OmUA zBY%}22$_*_Iz6M{qjF$6RvZ;)D}IGnsC%{oh>{`v(^i_}Afi651lD7~osa!Kl78%W z0A7cr?e3rWkl`L5`;fUFANr8b{0>T=`Bh3?Jr4Ph$sPxN$Wo63K4gv{Y}{RiK_U$ep0Re@Jr_j)rv+WvX3ju-7hWq4@t%6%U>K@<&(+3F>a*cIM3((#V&AZ10O2<szxdy}@^sJ> z?aFhKqxZ(3l(}X|nNx|=M~XCg1CFD5fN*sAv*Hi!v`fcqg#z0~>W}YR!FlVqO~{vzx<;j7P<7EPx|qb~8SVV@FXlWbpCQb74EE^SQgCd!v`WWG%H_uDO==@J2?*qiWv2P~3bT ze+~VJZVOozH<6`tk8qO}w`36e5@?5lTkJ<2QnuKSMNFO~5_D?}#M^(vv!$@@8TarE zV`!L;XoCp*MBZf?ZR3|M6>sR?hj{$pA{3OL3t~tn-42D;TG2K4A!eV~ih}Z6;2j^L z^-*O0>W>R|d!;Ftbq&)9kE*@-z^XZZseAsKVb68d@?7%zy{_TVFTK*N%X(xtNz3F^^lTELtv_C)Dt6FVS)ZVAE;LK6dKk+0b7or2% z3(}m!4DB@MxZsZUS#6<4J;>e{)f~kOF6-MyiJ0lcv(2Fm?I#q5b#-=7hZI)rh6ArM z2>%yb$n_5sSfXEjiFGgGV0L&!Y{_8Hh}g}8Igr`~N3;f_#w?>LA=d)VwzNJG6`Qr8 z@^2vBFlv~NaHbE%sTcE|TJFebBHk^OWdW%cB0gkUKt=ngNOa8z9WjJHTt`fyN9c$g zdbkdU;&`(1ngpy|qkz>_$4&J>ja(1Z$n~=Bp*XU&>g$FAGR;t+?iz|?^n?e&1G|Uf zG|yDM+#d{~IO+XRD9*3J<^eB*(Mcsah=rB?rK`oR#+3@iX-il6zf9M6*0*7%WTWwI z`>$MKQ_?5{18A5Typc@l)L@z^+bBm38M^B*J?5h2#Bivft{-poq~BjNm6t&*SG&;N z4A~|K^}VV*C1V9j*eBA5wXFS7cW%wKPNBZN_T^#ruZNgZ)@^u<)^t zC@cI;N31V=0-?T!Sb>)*HnI0v2=(oK5u$v(e?W1)w_<6Byw1m3dtZQ1-`-as%D4CR zSXyxJI}i-){g4Xv4RC9nX?3+Qt*%`|eFp}z8oKr$TbZFUe~kM48Se9xQ1gH}q15Rx)#r=dEOtxWs6IE%R{5J}+xol#(p{i9 zMuu{Syx2a+t)tINGgLd&og2zBbUTcw;jca~+RA$x>UvHQL?6PBDpAq5)avM4zJgaH zye@Uh=*ZYGsf5Vikccum!iR?NBZf|b*Al+*YP^e`;rnn9KL)tiRfo;wp9oX)jZI2u z`9T4qIT6HlnTuWc@Djf9`%-je5r}KKAZ}!Wc%1BlGdf!5=nISIsKiBcx@B}c2KMyt zfZ+Q(UXP59U));xpSxL@pSyL-=xBup!2`QzbZ8f|iaxQ2j1Jv_7)V_tBI&hzBk3r0 z@%~(#(IMJP?g`$j#z00EvvPrtn#$z&9o1?TBq^7~DMq(u0l^>4}?3j= zOX1$Jtows^VMuPHYy#c3V7U2#dKW9yef>OY8?qsNh>onv0I`1#h^?6*)<@$!66X_j zB?EjrMJaLt`oae5P(qOZ<`w-<_&Z&Ov@-K7nASoPsg&(u@+`>CHcCL8vB2exdcLpa z=tOfpx~3AuU_FSTIuKzhIyRY_`TD|Z^Hk#Id0kCL^EPmuj|9r>k^CMeV{vcgSGZf4 z74F?kre?lM3=iyXGW7>prt8RLEXR?_=-;B(#w1~rF)Y9)qc}|NQ5~jCMt+i&TX)iC zGK@%UG6z_%-1i@T ziX_+X^-DP^{PRZIf4AHEWPZ>mk+A z4r7sACFW?ayG$NN?HSs9o%pNzIoiiA8B{CO#k=orS*SQk`=-N$Zl!8>^DibRbd8i&yhE>@nMH@q8hZCgY4QQE z<=+6d{2Q!pk<$C%LGZwLy-+fS8d4QAppF(KC4Nc%dK&parX$D)ioYg1th`2`Na+?2 z94TF~Smj^2n93?LpCtEKPpYX%X;R39k~xo$t6#EK53E@XXLbxas-g3x@g+;&slnk( z@()%yH0b{Fhen50-cW62zTj7imxbxbX6AM1;d3bWJGFi}-K|>X*|PR~-GHpvK=HEJ zjlr-)L;VcNEC!gVKuD|11-R|;Z9wGaG!@j6PF+iMh9@_!5ivP4Tr{ z&mY=yoiU6ts~(ycXhAHE1+juY)z{J*H;gfN)?0989}vrLL;LD|Aikb86({urr?p&Qmkh zP)z4$h)StZ4izy|QDjLhNirqmJQ5w8=Fnl*TBfvwmMK}WtQ?jiyE7GHV@F79!<3dB z)`rkp*6+HXnQ3P7`F($X{r2;Hy?A<_d!EDn-1l`~&wXFl`+8sB14QjD>!EXd8mm$A z8O<=uf8^Ye#xX7EaDJA?Lj?|H>0kqKC3gI&E|%@JUKR{cQWdQElvcucdQ(vS25W;S z({3AMgbNuGh&qWm_MOu847D$9q)SnnW-56cZJbNRna&#mYW`=_adMVQ+$(qU42K-# zQU<5gjiV*GsLpVj;FPO(zI-MpwCNIz-j}jE(^QS%O65`^d}j^k0dXvCfQuo==);;R zw1~H?7tV!iu=}C2Y2SpkuNF25)-x8mq*<5zqMl9jb17cKN6Z?qn0OZy{Z#p5&Pi*% z!X-!2mb+-rD4Glk*Zwi~z3fB(reMR@d9X{v8tr}J92&l!P|^_o^AXG2MY{%T63o?= zb~x7@ke#=_7+m?(pm6Kbw6`U*X_+pDWy)^r(9w}k`Nwo$XHISta8Z8^8_of=cM3Mb zE<6WONqxVq@!ZSC97G8z96}`|xBz$<3rBgk_4+Zf>4}#N^CiK3 zU@w2}+m&JXIzJ!HdBwSx<7T55mh6qRMXs82*h8JLbm$Y%ZlW!7?Kr2#JowmzXspe(!|JfBmU7tjlc2Gt5a8JfQ85;V^z!y<;6`x6-a%v3c{Z#Y zh>4v08fPM}1Saw-oQWLB%#rho(+*7T?K&oMVgWFbZ`U)C(=(9&N*-quGqz%bx?QF> z(9-AF%otl~QXrpWGjps86&Ov4`A-Eu)6V&wS}#7&`BMUk?;6%|3{Jw=t^mjUZ&_-! ze~?0+JtS3YANFE@Z`q(6^?tpW{eJx?JZIPk{!0Gem>>UdbM|-X8K5*j^B>sXbE|9= zF3!;AY8qmu6x^j{<=n&DT>L@D{{DtEhVWL;{@wy(@vedWUFS3W!Djt9VQu1DLz~Ng zu-P~+#iW3K+D0`_gbIvp-ugz;O*`x+-z5HDV8LYp{dgBNPnV6k|4<>7-eY|vB(Oey znlOS&IWPDK#QYz7CyZbL{W#pP+8Sk!M%uc|^SITEf45Q!H(-{H*;E1SgRdHzbYlgbjf^h36Y?@kk z%K26oO10Ld7n>$=9oz_R*jr>Y5rjU!Ad$JU8i`Eje&wv}G9)t6JvxyArghtmF*=dK zq6kx2QF@WlL14rYB|emH=eih!$jBqqJ~^fZiilPp%3p9skI1}bb$ON@5bg_$v-~Cu zp17lCgY^=xH0$fzYT_*a3OaJYFiGOah@uk5<^7=R5lFEfX}QX)`;le`;6QPN5^ti! zH;3hNFUBA&US2H+_@$(Hov;`tNxoj42b85@2?h}wFgWKYySTLGD1!)T$~e1;TdX&D z=_g6@J$93(7hPBT>4ZgiVTY8dy$Ks(J8W=Ar3ewge*+kLhpolj%fBML3!>c$*&>($Vkm5Y*;aJl^KS)j+JDrf>7c&sDZf zpX=LPmm&7$4ACsf%Dgo_ZQeB_V^)c2!J8T4S!z^ZZ1eDamM@2N9OfJ&{x5*lB+b;+ zzWiLpc=@?GtApSgPkIltu7mQ(gKR6pJryq99=M4hpTi! zj;3FuNkQoX%JqIXp@3@ug?$J)b%cMGc-L|um1+;`&{Jv`8$yF+(CJVE{MPYz$;zA_ zw`YATmp;2>WzOk-@4n#7QK#iNxK5r`&pEO9oB%FhjRK>umg4G~jipg4;grBR+%-8) zt}*D8+20#a$#HYd7N+G?^#ilVb_OIFMG^^2cXF-N_IqBj(BPlrCU95bf!d&5Wa%1q_l);wBsKf}89 zj^!C|`3ufDgG!E_BS_EjcU?FOSIGvasCZ6mdd`i08M;zfx32bRv_M_q-iO(!sy>XRHI)1xfGB&gsHiyt=(66xhcYUNoeL50fduu7Lz0D1U z%3R9%l1-FqsOD!0!I$t59RZ*hg zm?{ycA6nsq8?7|Q#U9Pabw(@ECE{MiC8?>QFtLW{#_$MfKW;Eut*QxiV|bbrNNS{R z3@<1!FJx zlFt33XO};g6dGn!>e`wijKGkh69!?~7%N(kcrb5ze_U7$e$@Kdq6OR|v{+p!eAOKo zr+pN!IX@djD0)73XU<92l-Y)_`f{Jn6UwHrp$wfXbx9$`LG=aNl*5K!za8_LG8^Iu z|21!_Ad-<48w_;X!3=Y6YUEH2er9+gRad#K%0Nmx4F1d>>;l-^QKmxj&7?tVl%+k(B`Vs z!ZzYjlY+X_qP9>}U~F^wul-}<U1Ob3 zhM$#)7&cMwM?i6oeYRshrh` zw<({qd%UT)-G~9~#@m#4F+3ag`zoc!`zrCFN74;62P)xa4up5oiAo1@DqA?WUi_n7 zLoMZ7-wum!eTCa>N_>mYso>UcT#`A|8Ejxv;L^pjr9vgKhKmLjFmv7NOia${kw4CE(SHrr_DgUf_Z1dJP z83nSqGvQ+&qkfx*-Ob5hUz`irxBHZh>=~Q1>1YnqHJ2lP$mJ(=q$j?nZD9M$!OYzk znYjg^nNMz0nH|bh-=Ujez$v$~JJ2XM~ zf!m&Qjk|U(E3@P^EuS5nr(KiSp0kEMA)&*$^fsk{ov?|XS+bfwk3A_ttUGz*TwW&k zO`ZZy#?o8cDZjcwRh$R3Pzu@Fxt{3cRqU7qd3p)D^ToN*nSy&c1#mJaJ@NOPOm<{K zhljL0r%~fQ!zRlYScNV56KBRQwCzsx(>}J<&%0MTlvzLHnM*TaSd~a?= zrsRFzE;w17-uf`-rQ1Su=X;c5cEhG3baEy;H6ie$;2~6_eXb_6^?lwRs76tG;v-6z z+X__Ydz8KG#!Z!|&ROiNgxHTIkKp8Ib2~F7AM(C|lPl9(ALYDpTMH)>?^7z+Et{G% zOV-g(uxk>8AGyzR${P1XWNnXJneh0tLFY5eM*YyWaQnR(jeF*1*-lzH^6@u=?5RVT z>8yp*In*K8bieFdcJe;52UbEBvzt$|SkJDX%jy9T40n%7C|XCjPf5k|!?ok-Jv;DR zpDbtO>sJQiv|{Nv(6lCaLP&E@_Q!x!TisSAW<1`z%tfQ_) zwlgPO%V=jJMn8&{tkwl;DeD41vC?O((l|w~QZXV|^|I2(ULg3v4SQSZb7wg#&Y{d00zbsMF7UC= z${C8Yt_v^Wtm}MN+8Bweo^?G7s6^H|>!VCw<19Ux4Pph5-=`yfo64_pFirpUs}zJI zIrE&8u}to8ckPoTcDwvX#Xx@8ivAPAwt5;I;1$l%0P%93i95iH8x^ag!@g(F3=_G; z0*|9h0yw~dWlw`4b2D(x48jfFLa;AjsSSuG~&aP;Qrf>Hybn zCnc34D$_DgM9+r(EI8)*GrpEs7lf}RvLA{)wmj6WCHT8Zdxg7Yy0wIQFdnSCbN~w0 zEg6i{Vl6nqQXva3a(oI8X2)7525AoAayuP)p9JMZB)2gX#7cO`63MN!A1=2;kf7Ip zj^tMJ9lC%Mi!P8%O#x<=t!Q%1Yv7`Yz7Q;7^};AYHKgL|?-0-L=8 z*c>J};a*4WI9kZFF|=y!m|m>y#U08~)sFzu^XL5de-*FG%)U@>5V&gzQq|Pmf_S= zHG|Q?fCc@DoPBs>k0qhT-bh7_EwMt4ZRvy>J8dLtZ222?I$^DK~g26gnUYXDrTHz?k1 zfIdDP^?f7x3}ngZ0?aXw*@%FsfLlcv)IgLv10c!nB-o6R0c>>!X(Wz8B~)2w*?$Mg z0lu>~Uo{DD3sx#`5&V?5K3O$IACukFd`C*qd?zzsHNnj?&<%TIP?b-`DqlngcQOji z;BT(cc;8!t;~_6wd&B?1L+-Uxk-`rD+lMSZ zEjk8@cBu9#6=Qt5vInD&f)RR2N)Nld>s1RTy{#^{z;O!NTD5&C5VQ#U^ zG4*_fqx7i?il21C<}t^qujs~-`Y&Wl={2=LQTU?_C<@PpEk|*HD}Y@!Y#F@?6*Z!w zYfyw;sfEo&*-BleffclnWs86(eG$z(r0*GI8rbp&pf>*a#8t<+D_AM~jo>Hz%{(QM zw8{mNm%IFjz`k=X3b(;X@ovEt?>$hw_i@FmysJ~Z>7aPi^@{hNOK0|deYy*I%n+n& zIfHP;JIxXuH1E&B(2N^5M9mufX07Hoi3&dBAh))-+J4>_wr zq8bE`AWEx9rok^bfM2jaEnPuKTML_I8L&abnl{+O>J&&QrRwUq!t-%|6 z0|hnqdrQ|Lg&_DZITaV4{tfp{Xc zE93?cKyH9IDqAEHP}$3XmK}ux?F72}bwGE&u6NFccW@)PVQ&L5w~Xd~9_4Hhu0*uI zyhd4qq>;1`6EoIl;Ra&PQ^HivIN2OL}A3|&PjmIgCd116p37+DB5)` z!s)Ho0nv|y02youkimwSn@+^1fjIpb5T_rb^){UdRzlk@hPGX7V{SUBcq3+4y!j8N z6V)5BHV7%+byJYyO8r2F$+XV z(iw*<-XlZFc=9c#RN$fc=nN8tJTyF28H&1y>S-E5L|Qr%0LI@=W;Om8`O5JXLw^bBlMY|26?*SXt1hjXt0Q1S%0A^aBpn>@T_CXKwjX^KQ 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�-1U&oJf7#i&?vKx4?W5PV7DdBlVYF%#yvk1%$+a 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

  • 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�`r!|;$Nx3*LV_JI~|L*?f5kCg9uS%VjOOWbJ^; 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¨Z)DtTI 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 z zxTt;oT;x7^Y)49C+lR5O;#D1blm?}BE{8pQrijIu&|qv}yxpgL`YVhLyua`cXoN3< z7;(qMAmgj^Smync24-=*ojElzh*|t8#)TE*KZvz%dyg}|HiHe``niGm!l*ND^J|RT zQ2rw&s6!6pUWDmBLI*$PXVfy=FDR`(E_z?0lKx5f z2e_cujGS?6ye{bdr!~ytpK6Tn+W{eRg*F_uuXwDu=s4Pu%A-@-s(}?3A)gmUp)N%8 z)qS~WvmCTt_S0vI@J!{%&lJU>tC_|r+Rqr|dn}%1-><-P&)?7d7-3QBxF9+;U1~G6 z&(C?-!(Xmsk*)^mbI1q%a-Z($uaHMyICJ1X(RQN+=CE9E;fs@Kk7?}atqf|-!i>+Q z=QJ4$VG{QNmMys{Q-beK%sf{G-~k-VQjOQr|6lbF-&;{rgf!w^lbiD;?Ygf#VB78tJ#WeMbyp4j>jfG$o&{|{A(w<#C`E>(EGeQdb{iYImFS*f!}fhhb2HXtD$fH<@caI+&Ml_#^&Y~pe!Yf1Mc8`Oy* zHmIu0ut8M?vO&Gvg{nWu%aXiliCwZb)bXSZb-bbt^AajGM@QU|{@7!?W4m^Tp57gMqW^MA9XY5>B;FFRmu1w?C?_?BH4M~dytg}+DTzY? z4i%3h*0la{14GpjV&C(VYQz(}L!qJrSumN55&UEuGwQ3L4$*3;Z87k%eQX>t#__Qq z1!{5h#e(T=U^nr)y~`GQoXPbY9iHh{!^SQ{Eg0HxZv%IlN8)=iWWwvLuR=%QrpZua zG|a+HPyO0*!;C`iyH>+@nTAbh3Znt)AEAa35z!-HhEp{$GJE2Poz4;WH$O5B?RJg( z8!2*BS-2dYSB&(q&SN5)*>e2X#S)}|DRqnbes&}8>E0_57=k7d1hTscj9{mVIMMKt4J-18Hyr5J+BIq zqPynQc`mDZ@l&t)?@(_jm{&E2y~BrnYzrGvhhZI*7LJ8V#yT$32Mv=Q(5WaZaumWo zDF}ns(@#+VoB4f7JLSj1`RW`m2z%FIM#`&fVJDFV(-)|T@qd%zR)?&()y31}@3a_* zrxOZD^T3Yjf%=*Cj{1$~r-E)$JVR<-`})Tn@zb+&f_2t!aMsVjOoHLc7!iFV6sU@% z!)7h!C}jZGJNfgY_o^5=ugwPkwAo<4MV<}9?WA5+exT^d@|r*B(Z3A^zrMids|k-o z4$T$54k#QV-K1SypZR0?xrRDW#zM~{9w-LSi1}^kfK?QPLLu;Z?V!?=h3HKknFl0A z#KZLoU(>ewPt~^il+4Lp&iTT`c}!As*bK`}%%ER?+#;57uk!K$_#Trd>g(8l;V{Uh zAq34;J3B~I^Z^(2S7r2c%z=8_V>z?E98~5q21Zhri-qIe%gxd)Iavp|%mZvzorhFv zb)R2!r05@6%pYAYI<)ET@<2D%tOKsOP(gg~a>Ejnzr{SrgrP`(SJmD!P^+7@lM}kR zth$bj{n9#kkUL+UhMcS>&n%=2M%cZcxjQ-W0%hHAGhv@Gw8}`Ua9zhZMvIDM?t*SG zETcJSoUEg?ux2v%T1X!VfDm4^dYaZU>P-kE*jwdsDPeF+%G*DL&SXhJ^xrW%_2@sxJOd5JSZ$qQCk4_%jPK`HHN!NUKkFgg z#ZXU8da45zQ`6GlmXpzTxsiay-DyT^pXkwli5=147Q=>HK^EY{3K$rTT;@?u8j6^5F#t9M>Vii9 zLLqYjO~Rit`|TMRJkaId=*c|6W#SRTy`-2L3gPGUa&hoNZS_G9;k&unb)Hz+8xepDhR#&0M@utJ3X=VPT z-xDNG>lHE>Z>8{~ztbo(@R}rnYZw28dyGA_KOtF^e$rn4mM`wr;@E-yaoF2`lrXLf z*5X-_6R~wE_tZEI)t6KGesp)-TWlOj!bl=90WvTYo!ekETvlT|juNl?$Gz%`eM^YP z`Ri|&lR|+ed846Ltgms_SF3w|5oZcIg}v*FYcG!dGqzqx1V=fwI-R@Yy8W?88OMPm z_V`y>U!Vec&swp56VuMd^-0?J+xyLo8x@IreYbRQ*p0@Cd(V#4;>77j5}TP(=vnKn zzaNbDwR9N4VQ>acK;?$}d>p(RpxV$$G#drzs3**Kt@Z2W!%L4rY@w!b+LTkIdh8lH zNWO>TB+gd-EP^!dcEXz(yz))IahRr8E8 zGhf@cm_Kpi$b%!v|0XT*Kf0zR{{Q}?opF?&s(6x}$85VXSu&6X9S799&6| zpqVWE%GG8R!)9dkN|eG_=6lRpY&^cp^!WATLquJ(Cv@@?>V)86!msT~uI)*#v?uA6 z=a#*p`v0U+#aY-R`aO}@oHW<6PQBfttzcFa%w;n?ywRO5&agNJC9=NCjCP)R9mvo+ zt77qFtT$CYVeuR`Gm=OfvGxRLr!P)!T<#W=BDG~dvL%O1vs)eua`)vM9}jXfw^_Z{ zJ!Z*^bXQ~xxA9wF{p|!(;riQ*2ZH=F68a_>@1B-0fd84ry$9E1Gy2H76w?Il>vaPD zms1}9UE*@*wcO8^#pT{Roqpd(V?OqZT1%gUmzg}>+TMig4)G`a78C_e8`PS!=@%tE zo+O6h;WtJ&>Pz*VsUO%QWNr~6Sj3GVeTK*P4SI*|)>;?&{bSNe_+QdVkN+Us-nVo= zV;KSAa>98Kr<=`NEX36!0?RN0bh;nkyD(MqTYN8USO&_pT1$4eM5bmTu;z=bf) zU~>@|I1LX`x!S`HIdgnpfkSqaLi0IIv*e>c%5F{J7z@gzILhwb<)M>F)qtdso-v9j z`4Vd?V$wH#Cw`MmEfdt7f6k&+-`D7y(APDy*w`RsQ5$jxaS zAQ)=QKm8#C1wt2yQZ&l$)pz?uiRp*3gBXG%@1+?J;R8c6JVV({T9cTDypZ2eQa^kz zb|s_rfr`gPAEk2k^)5Mry9-Kn@a;UKZL*9-WVHFB_)17D<^eU7<8|4+5U210HI(Bm z_0OU8_`n?h6gzPhNYKVSfSlvplE0xckbe;*6t%it2dJD@`0PNy#8R z1fT~$+_A_YNZhg-iHrur&tO~d!lrm~!Dg-2cR`LDvNMJy_17Q#07(f_GW17DJ>3{4 zG7Up08ltzud?MB^6^Bl|@folX4DRm%gq|5cU;Dl6Bono_xDjdRMXb=5Wa=DrfD zeXAkz`Tf{NzD^V0$Y)mD+=D%SWBcs}V8?aalKp8NKI0!u+%y;-Fv0MEZ8IzpSYJ1F zR3}fqrM={*pUX+ z@FqfL+e(DRK<q zG{bINiDM~}do0fCZ)L-ykf#%Tj`~sYNnNSOoQ2S8&ujgH&I08C>8@67lrcNf*e$sD zr8ZlFyVlhT69o}kHZe?#0)|Uk`h`Y*#h}rYXl>)$Lpp_2ui)tPwFwqe`W7HCMe_=gxfm1CFP`S0qt}(nHD+a1^j_OigC@tS3)F(0_v)U3oUVljE zb~JzCN`#JmO$6Fo@khY#4~O4iaXTER>>ZOkLbvImjX&E0TLn2H8#B2_tBES$jkoc+ zoX+j_+jdy>!FJ=)o}^TF-oyO6yf{|#qNBH%%MNz;MQxc@tJPagOR?W_H@TSw#+qKy z=jN@eTaGiP6{G8T{x%Cp*1DVg<69y-O>wTxR*}(bjSidWYjCY~@z(NxYt@&i{V;XE z-&$$0a7r8LQ@!Xi$rbZ5o3h$2!}^z+^wRx1CN7Hl*J8IFbC8(}sZ(2FC?nnFMW-N& zQxpms*iRjyIb*7#`M70c0%4LYK8y#X@Kp6%#3!ZiH zjvhj!GNbtSOYv`$<}t8Y zp&kuml3l?Qy|*N9|0J1$FssVTN;<$hyCqXPAC;2tmxWaNjh;UN5_RzR6_5TzA9fiOq$KHze)_(cQnLFT%4# zpJ2SnWSpe+_n8JAy`pg!+jL#tma)MPVnpZ@t*QJzJQXLS&!h)^Wb8Y_JQ%4NH-m2y znFUXusAFz2MIolc{1Fq}a`QbN6Emxu)xH#;j9%+0D6K??~-gQ0$ ztcBdhn}UDHiH+7+YVUDpU6xL@k$>q(uQM}MF73|@*}E*|k;Yq{m5kxA)@@05Sq{LW z$qq~@gX~0ONuR#dd%NRi6I0qNTHFl3k@1FmIy81$3wLL$rl4H2yNTOpU~Xo;8-kJ4 zK=?*yM`$*WXR|&WhH9c=A16I*7nf5%_SZC(MJ1u8=~7K=JAFQy&}+|lW;9*rxJhm} zPyM`dPru$^#t?NaaffrIoZU9)DXjg7k2>LaL>xWfICx`h)Y`lm#s>7WJbvd|aB!Af zF)xc^L~3u8`ke-=wgvNtKJ_Ld=m_0R&u@+;wz%7w<7iOUQ7s0RQ(ulDtUbhZM_B5U z(n<=PXvq?v-ana5E%0Z!ZIy^$%rneefRWl;r1U9YtSgg}Js4MCwmh8J^3bcvb-zvC zyf1mnW6AYflN&ZAKX^~_*1M9o-IClmJNcpGEv`?n2r*f&He)^Yiq@QQTsRD~`us*; z!OMacC*<$hj;2Dy&LB)Qtuy74MuK34sJUGs*{6^&Hz*{1Dv3`ec}^usQAiviN-BLS z$!`@B-xP(UhaMA*Wob=6<}}b+oMgw;f=@wja^ha5D@T_w#d6v>x2<2FVDT*3V#lCv zz|a)-7+!bn-f+g1?&7thwU20ow(Fu!XxN)fW`s7IYj+#F)D`@G+vf6Kv7wtsTnhCa zsh@Akb;a46Q!RBN+6lK6jF$i;Y2~x1>lr zlt^x~l+(Ccic}y)%2XnqmLm1Bv4}KDM>&0><`gC66xT(O?vNraQX=IiQ1Q;N;}B_+ z6lsx8E}lDD$|AC@mR3t@OrbN15id3$N zN2D3XLdk!qw!HA|@A}LsU-sp`$ph}d}$sx-6<22lfWNHy($4m0F z87_2!5ijP3Rf_@YvNBO=?pa_HUhH3$_tS1%0vBP4g3P zq*9fv3UcH-0o&$Yp7I?|CY25$Z6xP7wRaNTb{G1+?#gNzWg>mO8byh_Mb~- z_YN=nUa9Q$7nl9@X5(XW`U|A=^QAdUUejG;lHKm{*beK0d!EoILuWPZujI9uF;6fG zvHLAEDm~r`bv}^y_;1B0`JEllk(I0n?aN8Fk^)sC+?6}bRk8pe%+WAytvJi_?S?r3D&yOF~obO z&CN={1K)1ch?(|-{F`|8O>SN=gwn=G#Hv!f(CvEI5X~&M9kY*?H>07ke|DIp1%=xF z?k(=#Uz@7<3fz+`<{4%lpt`2W?MHiwPv$kx|04dVz|vOXg8ga0exNY~)8nU}BL)!u(=xzYTWZ^dR!?8MqhW$&tEjOH z$6YQHV>gS-Y<`{RsZ$Lh6At;@K&`#8Ii{wT{h49hwzYhnZ=vgmzWI9XoJygF4c~i8 z{GI!yMiW(A;A~B0*1EnesnDy!yg0R?m^&V-(KKDh>nFu6cj(la+3DcY$PS#ku1>q) z+(4>Y)aQ_1OrB2uR9j+N7qx|!C_~OTLz=XX70lmb!7Ap&GumK)1v|qr-ojG5uH|L* zGm^R=-9wggCdd`^6HALP*cI|i%RpbKE3DsQTsy`U{>Sj-!*Q<2ha>V%O>)J&7SR-* z;u_l@(RC`z75AT!XHvi8;{O(HT~y>sY#f!5eUB^Y^r(SFB*iZ|QVRqzL{cHsOy3`9 z9yo+QREx>SMRbL@$Pt{1%SQtrt{ZfagJAjqY0sy=ja0*lhUm$C1e(c!bhf$y7kw8A zPl75ORF>N6Zd{ZG;U%>_z*BlOuBiP8Zv=fB@I*&yf#?jc;sxNt;r|{ki-ML~PwnUgy+OfKd)@>*<+lNNDz8*8;O_*U+68L;q&MAazRQ89u|aAM=-F23D}bl? zj{+Z9U$R6?`92AJV7?;oL`Ui+0^9##;3I&40eI?9HQ#0>omYpY(*nE+bccbbc2emN z08iyP2K-QYF!&%&B=zrmz|*->r9YRiHx2l}ei;Ki z)h7#hDwj%sy@J0v08j0o4m^I$9l%q&5txjRQfyxf6p-d z0^q6L$?QPjb94vr)IJ-4SKG&kflRU?RNu|OtMw)P_kgE0{c+&wnV0ef{s#*Fxd1%F zGfWHc(nJqhst3{2Kzj~&Di7h*`r?*(0eH%f%0$nZM30U*0zA=8z=f_D!uJAC^`U2a zC>`oJI8uv66CCEWJ{*r3XYooHO@pzv<;AOut2PcP>c3FLDZn_JBKlOiZq=%dMb#Tu zm8_{Of)0LXRoQyj11Kvh{lE(%5|Tt#&e zl~whvUS3tU3RPG9#iganUG=&WHLLUXzN-H}_TB|9syh82KWAo`8DN0nq7H(15HFab z!$k#!Is=+yWN21a7Be7*rHEptX4`>5K&2W>i#E3gvlcB{GAe5OwF8)uxkl=?Y`NRu zEi89Kvt8>~+wc9H%P`!;zW?3*?|0YFYtB5M=lNXD=YBiS=Xur@=dCDQ;;l9z_dZ1o z*K(4xFaF6=xhA_5Ot8A#c{8g(~DC+W-tjf>NS#jU$oE1xQa#!3} zxY$$h@)fn5!WFi>JRF-Vu_|=Z=(eJ8*}DGd_pe&ITB)=mo03u7WrGqpFVzfe&hq89 zBK*s7uCgsH&KFfrfOcOY+{Bv6TU~@B{H0TqL<|iiuV|fEL(-p@16q!UrldfT`ITm9M3?VBaPHvYU6qa=&3VK z9Q5(`UnTa9CPNrZyFHCeSL9(SsK*oLY|*TiKp%IfL>DJpSo_4kOLi{;#9Fpb_%KYo zWMqdv;Z3r8E&TKs9@`_)B-6jd-6Ij?f0F-6X0!zQ#83Ky$jJHZ!t&jUlGGznagT+!G_gGq8!O$WN zrjL87>@JpXKklmsaerwL_mi@F;{fm9L8~^HYWnM^ev@cr2oo!TKIvZwcPs|uvH|g` ztSkwpWddR$m^D*^X*?j-h*_x;OsmFwlMv30Km?BgP6m7%5LJ=YD8aN^*?pJnUM9N> zvU`#2zD#z{lHD_9_hdjUO5>6M!S@t58W5R?;{fTsl<0WCV@NFaBXI`-(N^PPkyvbe z;!J?3+N>}MrWpV!o$ZK((s@*ZY1;tDfnEuS1$*2wK#IQr5KSyDRd!DT#KtsE4@lu@ zqe<~ygeSt?fb_m&5=`4C(_MgZ_%#5M|CeO?E*ak@;{xC$xSM5sq6E|EgDR!R07&_~ zfR|7{ssB*C`vA$k5s=bB2ak!soq+gd?T}!a1CZRyB$y@uPJzFfAYy|U*NS#R<+cNm z;-hwjwj=808xJvlYk>paxeSor&rA3+>R&{sc1Gb$faLC$-lKKN&?!TDFJ7s&%8-{K zCqqVtZg?VpE*UyyD9F$%LtciQ3>g`^kq%h3E*UyyD9F$%LtciQ3<1P&8g(i^Q=?wH zK_In$K29IC`k2nG>(r@KM}6CUq0G;(+E1lw4LlgAQVBt2K`K>a(Az;!*B8f@eE{@I5xvO4yuY zk2XYk58fSzxU+*tanlQkt#5ZS2HLnO`@z*KF3YcS-ZHpnW&4N28Sf-g1RmV8k@ZmI zT_U3Q+5-_LdWBN?dvli9mM-)7mv?sExTHO>*O3RDrM)9G4=QI+-9fzTS=^X)JBizF zM%s0GsB+GJqWD$XO!myk-S^p6E%wBU{jbL^ZUa3S_J?@a0H*!p!# zR{g1RRg)42&_lQ;e^v3)6@`jq)&AtF(p=7Pcwp%8vE934i`4Ev!64ZM3In6yG*!@p zDMvJyD_3>2?4RNjqYRQ^AGxZRmRqXCLunwhOHQAJ$#E(O;9zn~u~rmKmwbBrVz2mQ zXAc-uZYiCT!<>=;^E91~U&0J3w^XSIISv7**R&ikqWt7Ju1AW;kelciGn<#(QZxMP zK_}0&_Dcp%QC|dX1f*nV;~_)-=%M)K*TeRcjRPS>S(aAFWRqmINsxnVFv8;}nJ2|3 z_mGoy6xBdy;psm?PSynE>9XWx{R7km(zk<4stZgi)?`L8J{I5df=3v`9P4T|JKkEX zapD^~$)b7~;UgBxvZw?#uZqRJZl?2!&OqHdC@>R+XZ5-Ee5?Z((W4-W3!V#??1bD4nC<@J4t6T3;foQB)Z-xXY+`hK2%hWxH6?u^Nh4YLa%F)hcUz`OW z{u)|_;|`B8JUGiyIw!{H%i~L}kuiF0LaBB1e~~IRT0ScLO0=A6h+&d4MwBoU4>mLO4c*2` zOI*bdjaZBGS&tiyV&F>`PmRd0j1wz?$jd~_W09AMeNq$4%n{VT)MVDrAy-K?*)%|W zudkNa7xoJ4-&=IhKI~@JYjfB@EGyPOF)l1NS>wnR@jMmhx`yPgUDkrnqhtk zJEGmtwq zNHn}G@&lM=m7tcFAtyrsa@XoqQeS!nIGx`rhOBfRi}o&>7klB)6OIu?*+-W4!s$GY z&U+)|ePMAg{3*hzhsy;r6IMDeRPr}g#=Xmn+?DcKB)bDhW?2sPHP3lPpO#FGbzoO& z=Y3q|w(Ozz>@$~nKtsA@6eT!hm(g^n9WHXH^m$ehXgaZ z#+%JklR!&}PfU<}_tGy@Y+F`rOEBlG%3q?Kg;2r#e?AY1l8RT5TdE-AG?CClRY>M? z&qIiTjSR&nMj0)B*P)SA5FO;doSaMRnNi}Q$$(5N5~VCNwVm5gA+ zL8hHDcL_7tdB{SVX<$xCfN7^&Y?m;Dormypx$|-yE>6m?vpc^%vONa=q_XLG9#Rkg z2r8BlWwi}BZSLzwAw=A43~j>0Oxc;K<6>CDzI5bqodv-L~JbmuodRL5<+rfz%* zXn5`|k#wd!i@02*14H}Zc_(y{kl)Jl4?eb()qil0%74pQ!~uEsTdW)T@A-|)_v53P zS8AXOg~FjC7i?0IKmC?kJpM!YV*PbL5Be#p)#)@oqKj8p&R3zq5~CoDSp% zy%_TR=b&z{gZ_fd-KcBv+>7ewN4xr??^o!d&%hUY4gBEl4}S)zt23<`5wXSBb^@*TzI7OLxR>Loks{39O?W$!J;Fb zpAuYqr1LX2C5PG&^q`nf{@>b}t$&4nk-tIr%4C$iTjfgY@OPzgkzAomC8W8vz=LF5 z3)~NQsEqpo4+K6;#sh`4&K3*lehBVF`p&#(Nuf4KX*~0RY)3lJd??$I)-y+BJJNgR z_p%*nKJ%$$Kl7O-Wjx|QyZeapa0coB7;W%xcuYFz13+6`3Vj2^KVN_34mI?PAU_?? zv0JHcC~dJ)6|rTLYWS8tfG+|*1U*Kh;^%y~^CI*JpbXC3Q;>Ysy#>kFvA%QOzbBUZ z&{pU?IcGr|IQZj_!<6z-p?n^P{-6tZM}P03xE?~ASD}9{MY}qHHnjy$CmsXZ)^a@1 zw=gG5ZeuoTV~DH&Hg(Q3xpiN!3`}-AWZ+5lV-Y6XhRH0kW z;Ms!bGnMa`XU07{{704FmuCSdLg&M0Du0poENEYVR`s238gwc6T?hD(SAWEYA*=xX z@qOx#NUPW%VLyw0W<{S&fB2y~9&N=I8C}?`e{QWpAMJqd2Q8ujm_NCOi7P8w z4|T%FPdz-Iiuvxc4v$Tel7)R9B@4NiP_mHgtz=<;E7G=!lbE^_MpcSR7D7qMLa3r- zp$bYC_GK9>n<81$!C)@zV6c!rp0OD#aX<70I4f2;bgmIN4JGlR(UAvP4g&vA+oDKc0F(tpL+?NSi0S+SChEfJWlYboobxPOpK^X zXNEdIv6{3*KiyZPb|#6`9u*9c+Am4sk&TxSOe&Db>w_67Oj!yf12<%(G_a{}L(2f9 zM%z;v$Um1v979ku(?p_)zZSI&Kw|=gv`eC!|7;9A=@GGed3qDB$ie~ zJE@Ohd_}Rw(ahBlYfK~bHOyh{@n8}p$SZ;bwGrDgMVWzIfXk|m4uB+E?gb{9_A>PG zg9iD~a^5sHjGbrLU)I4t=3A0bl05W+^rsN0N|k zp?}XbEqtcp$Y-CW+<8~v8#!N_ABcLQ>8|s8znv2F>gTrbvlAviedmc0A%eEj&1gi< zPhQZv9DV^|DyAGM6pe}r5Tdt7&eSr*I3pSj_!~3!%ySLpJf~~KvRA&~*XAj_xR;T9 z7BGh0$C}m&42NLSmZXg_%|B;w<-^O_f5nHF95mCxKD;!Vzfy#pJ--nC{{sY_W!;j$ zYUYaNwxxyAl_3&@wzPN+^p34qg`0efAqb60D9uiZ(enwVOl*wa1z=7zWVIbMCpRay zxD9Ovdj_9qn9KgwoUBc1F^)KBU=uPN2f2xlRB6V>#!Q|1>#0w^K5g&x*As>%zFz<8 zoAVyY{CVwxx8~dOUcI;Yx|j*Y&qa)J{aXt``xELqRCALksDS1JO_(MihVfaz`Ixee zr)~|IHE-y~dBfkG7d6C`ZSlD&cnl9!lfE(VDP6#)v2KE9?j6yq5BN2Gd5b>hja){( z{EqmtlGp1@`}j|%YW`G?{XT>m40Sk~vozY#HEpj%*T3|XJ|Hu_<_>jD(^`uuo;Mmb_9a1OF8C||Bg$tT!HCLp!a(1RXpmMxk2tCUz^_!{X-A2fvVj;2YR*o5W zmOVVA%pka;g%ShFrh1)Y<}yCJ;!NR8Nd}`1*FXf$h9+i5wqItBF@aH4K#-Om;)+am zc+B?M6|eV>@ouBu<@+mPwbqguEre2hM>)NaVV^Gy)!)PTw*)j#APGCX2I9KnAhRxG zfkr)~)Y3l7oE;xqb|+*)WvWW8ZO)dFLg~nD%|-TX|HbAHx=a>-O>RNE)$iB5VVa2z zH%!~n%xlMKrhm{C*;J%HPM%y`)0n-^S2geR?{dRiwaszMLA8lVT zzAN2dbEeh(sZBk~taAF43W4DpAR0k4i#fJ8P?iVgBw-e(C}jEzCdmc;CMW7d(RWfy(c>l5@(s>}_%UOmcQR1r{V)eDJVu;mdd4TKx* z7;7rz>}1Tv<62TPKYOBP z^k{Q?!oIRF<@+9EMpEn@$p?-4!vpU*8SpPPO*W?oqSJd@AO=!He6<{79X z4zVb`kc5cPWqtI)+oD$=^J_YBi{aVV>(B=8h%PJHn{Kq57e-fEOfMN*Im0c6eCP5B z+QhckhqQzjd|K}O)VMZ672j^GYAP2XkR#VDrmefLK99cI)}Zv&rj>HBxSEEdufA0% z_toTf>Z_m2eRY)XF7q*7I})-*7LYW=NEF!N2z_qX`0KQPTyi+hHv{dqOkfThRGlBY z9IOdlrG#fHv^F7J(^l7!qFw=UU1dz;6tnsub?V243nT_luPQ3!wbd5pkHhy&HQLe4 zj4JnWXMowxyfwvI#B0$tIfLsXHr%RZSKr%y+G#+?Q%CtV4mAm=ad7XtKYb)1&!t=MXnJEr!~s{(cbt92jHx@=*s~VxXNO4A zTFafL(b0wl`W3deGW4yNHb#dw^BdcSmfxVC-PUv`?}vPkM!p}O^b#9UYl&>&*ZS1> zs3scYjEhSOO3eQIi!yiz`c}N7$+zTCLfA~l2XBO}Et&MIMO@Lfp9Lb7Mkdbaysg!J zhu_=$)3;7CHu^Mg^p|>62GhVdt`Ym3s-#48E7i%pjoi96NN(FDxAgF;3@ydkWQ4T1 z{rtOKVGZ#OyxA_4a!Jda8`qd(_02x&H~0c|o>=m(yb)GNFYYPNndF+0jwR7XuaWIoI)=bX&HT6?W91^f%3bz2 z|JFw9Vn!3l8Wxk}z*qb+3c5lv-!ys;m+PZ3uI8$i4pVJqjma8m0NyuQqbe%Bf%_)i zIA8BB!|^}FJj&1oK;nLDODqWoD7^5e$)-p+*~vYiF(Z6Ql+hH0D% zBV(i{98%YcTGCN_8Cj8wi_)F5H8Vco#y1t&j|`>JbYfH5jG9+92l;oINgsrpQHy9k zG&+`9CW!-P(z32izfLCWuP}CYjUv|r!G6yQMgAJ|+JuXc#ig%g3QD-|XNlEj31+5k z(vs{Rbg85)^RaC0P}s8P7A@%-HvO1!hZb1ojcA9hCF;Zj&$D-SPGplXhTiD&8lP?F z>_y|5jF$4ZiUKf(j%VKY(Y(P|t4Ay2=}lHO##1du(NVFc!g@Q|V#i}VJ*Hjxv}S1J zq@Rze#&~*n$gZLKwMK~LDi7HCN`xAsv8?W)`iHF4rHstllUf6k=%nHNXjqlW?-XY<%>iof5}N-K~AS7C+#}N+i~{WFyuxjJ(AR( z;Ml(v{*NRdwSM3nUNL;x_`6OlRF?(39=3PoOKdZoK5?{KKd6tIAHFR7LIz2Pfmz8( z-@qh>lW%-tvmX@cB<$uo*uaF5OnXLpUc^HKXBHj|=RJho(6@9G5n<>%IGw4!i)S33 zSUhADce0azGH3D7dW`(g_c4(XgkzY$!A=}933!6>D0E-EgP2b;@L+2%(n;vXDA4Jh zBpiq43Gz=uK&FBYHf5#|4}GIk=(9i{27Ch^g)xQVp}VHUiSrm9dXMNI^fjQ52Tq34 zN_1A*Ig1P{_kxD9x`s+MZ`HaY$iTp-^nBa$9IubcIZGj&LX-|+TMd4D*#o{dciVE- zf*)jQ-awcC<*4&kKp=%2vCIX7TOxFEqh~-xIDkm)@5cGSOfNk$FdUSXA-c&^Czy*%F|#Y*W=Dti?>YDhBwRm?QV z@AjQ)l!;?r0#Y6jZg4EB+KlN|GJ8A4dl+>MR917$l zD6Z*%Yc=XHQ=~@Ssy?W0Q)|@KnjIRaMx%a7U$1YVu>S{-H=oW8y>ROLaLjh>S$D`mc5{@!a_!n;Lg+EU?;!^k#XnY+hUa#qkwDG!Nll zPKt=P^uo!_+ug%#BX=d-o4d>rspst{`5Kp}gI^}MPLHc#$_*+{B=P_!-eMY zEU;E(IelG7U+=ic9sEcT^WSZH$ETFLci-@i$D1z4w{&&hipBYIlsP$B zS+~&OAe&4%eZ(I{rm< z`i0sZjCb}K@($h^7+<&qk!%7HPlo?w*vT{1MGG6({!OY5YGGBcW5xd`mP-H_Z{sGH+6N@JhV-go;V|;ejmV<$CaE%-Q`TczdKf zZ{W{D7{u`=9)~X@gkb$EhP#;aHvF;(qeA}GyMJh5wtfx%uM0>w`PH+0N~SbSAdQS; z2+P0u8!hq%J`>~(d_ouB_#4vnSMcz-!OPR39=hkadYD))kaw|%XD`0)oj*77?7<&q zR$ApUs0RQ0$12m7zo|@LHlYmKRbd~DREK`aq6~j{AOq=3M>;LwIoVgM;=faKe zAnj6JW6kccs!*0Fe-2^E9p#4f2qCo)V_{WEWdQjCDWHL8%7VC?#W;U>;5VrM?m9+W zq%I0x9>$ReSZb8&b})ZCWq)}0PcpO@@Ju7j%>PaH(tero#OeMrZNl0sQFuSnQf;u{2ghFDR`ZLj*(dH~a^Bb8r&GdbI@(r%C(W+VDrQG49 z8^X&uefsmSK@|V|J9MR7XWYBNnwk8{XwxWbL6km|&Gi$q{iuqFCuTGn;FSxTjQ;+$ z6<`Fp!WmO!#Z^sc>b>NJ&30=-Gj-e`K~un+{*^o~4d9Q-h=6|g9U0K_9?_nWQl(CN zo3yH@?NX<-si!kVj1jCe%b_6LdMRz(CDV^)%y4Byw8>w;Q#}gK#o+G14)>*kH>K`s zNrA#_M@B?vMoMc7_;?~jb=ssW-Kq9y#TIqXL& zYMBn!A4JmT$xcb~QF}@?V$O(wW_rAWS?jIa`+t)L-z9z7q-GME6lOB8Ntvh}UGuMO zLX9mm8Z6Tr?J1Y4vMX#-|0p&o$MzFc#X4?OD>x&gBln4l#yg`U4@2#`m6Wfy+q#u} z>x&%~MFpfFeC=AOImc~x-8u#r=xT}7;CID*Aq2nCvoAQCe!F=>E7frjP91_R#Gcr}1)j|gT+Rn|I0DbMX-^mf&$Nd z3cq6q7xZ~{;02Tn6Z8#JrcQOKXKc%eC~FzPXwu5;sXH=K+AyJHfI~Fxs6BOCODc1( zk$6Ct)oV|1LEkb#7rFvrKg|R!HwK<>3;e5~1NxWjz^~jy|5^y_;E3{_Iq)CVk*!ai z6g#qDVAPe2Z<}D|{)Iid0HZ<0RIocIS73=UwZ3ANNwicRd)(90-ofSn!l8mv=BZfi@?i$hD1P1N_gG1CtMR8HZDz0K` z8yLYW?ys(xY6ds9eGMd9@V!{EJ1tSoY?M2C#IcS@MJ9$*x30Eg6;rtm2{2XMhk*`} zfTvu}j(TOSt{Boe9O7~muVA_u4x{DCj>rQgQ5Z1YHBmy5pj(TgD6khbss+U3sDKy{ z608whQRJ+E*bp#K)A;Rmiq!l0S0%OoxL|VdFA?QO2fLfx?(34!kV>syQc(%fU@({Uew%j zZYWe}2WUc>yX%_@B$eBv_)ip0*+bfs-;zg`6E$aJU*h41Ew!d|StjkyYNIK%G%sDq z(m&=~x;IN-4c=HwcD1i1F}i51hCZGB^Y~#iAT%Ug6dLk+N$T0Lzxnid>i z9S2k#2>Mp0J-Wsck)@6>zz>cBc=EG*Xw^LhJ^cK+bY(!H177fB*l=dXt|G@yTL8}f z1rRt+ZLLTOx_0W@mJsPsOtY9d>p0)ku1(Iwi}4c#gD~RoHKsorb=To72xN4y^%+evg)iE->1dzfd0XoMgmFq|5Ci-+CJGIo)GKbF_J9QRCxKvFFN ziAIIjMc@3u;s9@M-*9N)4*i24LtkJ-15Q71``Su3v7$0>nF?=vQeWA}h^nk58pZaz z7bC%$K*{1nB9E6IxMjFTFCcroND{p@nwIqTcGaDaOl4F8{746g9J1gu`Mn6F95fs_ z!8pJ^{MM5hY%g!8CTB%5tQ8)*z0D8L3q(19CS{}*%*ag!6UUg9yUa#rF?g2UT7!`> zi64H%@Cgj*a=s;r&f{5^Qdc?dz_@knUpx|BUz`l_PM><(wN4YNBm>-kGQX8 z3c^{Z?%|C~=YC#O5bFE*D4ZrN3H6Pwyk?Y8GB&dH@UA&e4SRFhL%$Q--wW42Nyz&x zh39{L!yoPnZZiaiT0^6M2pKzzPfV_w-1frZ)Vj&`4ct+Hht7;QzBK0-*M8mbj^X$> z{E?;e@A!VIec|5sLZa9!!f3AWME^^8qHjT;7>pnMn5sDA zF}*5Sn`oF*f6#1Bho)!4A%i*ts-Lq+^>cY*OIPFpk>$BH(^{I4OI*!MABcG|Z$fc= zp8t%eBTlV#g5mk9AtEDm(%yt=Z_QKr|6B7r)7YvAprJ8!Ulo&WJ{o)-8>6eDF_pgA z*f?qUR{YUavkx~+5`#789!}RbJz_HHp=Z;yt;q-$CSNG~EY>#hs(7f>)M%P`!vVoK z6+y&!asWd$k|H?zJ~VTiDjxjRS7oa-A2T&W^a})m4Kv)g;A7W8Hc_`N=)SCNqK(3P zE8tBGzL(#yi(kb&a$ETr(rh|L(CEl8rQ5aw>NE+HX_YoTG%& zpzzvOb!@vMSe?gO%x3#E;~}v1C6jV8b2)U7@nE$61YhLy8>6#{$ZZw^S1&T2DatTH z-<*9u_=Puub<26MDgOE*C>I4w7aM+(_1R}C)PF+SMIA8(C9cJHCed`flv8Je+q2Yc5`xug;70Yli?z_gJmjnuN>=q+O%ucVM8%uKz<@Wc zQ(YN2sn$LsK3POBs?P)>8ZnrCzR`YfyHK!kDFySPyl2|LC%2bH^tVSFwALrA9|<^H z#taR?<^YV>U&R5MTHu_gDJ+k#OCQ^fKGAH}7W&T7&Px9B5YPj}Y`Wb7}9D9_4c zj%wYqCc|uKGIUI-9%JkbsEj{mECO3`mjNu!^T6UP>EKnDLMJdAG>zLxiubNH=kiJ5 z3(Yij@jhS2&yUXz-cWTjG{(*WA6(?Nl3;yHKuIZB=vqSz3(SwEN5()?cd3=vuHe~t zs56ddz?eA3SE>G!sD3crg@FGrb}n?$#zHkZMvDuTRFhI#vY9swEqz~j|3Y{u zrtJ6jk2n}<#>Z|bzY8Vhcb{=#qVl`$^mxUyZNPYDe;(a`JS&ke8Z$&bK>r{7T8kQm zfT#RBoxc%+jv8uhhlGfW)P~3qZ(tK3_}wm2Sy5YSL;2wIQNO%_G~Qe!PcR?DUl<@M z6^jELO+*;Qo$Sh*Zy3VRnr=Iu@pxz_!*C2^0Uh6UnRoEu`>BV1E9f+?9l=99e2V{7 zpcDRQJmFsSD$wa&w8o}zivL>B$zL?+=xQRJcmtb2C!WC+(CPi;pXlwNQ`y}JI(=ss z>ByKHbXu$40(yWK{V$+Xx#fXQWv2N58g#;!_KN3QnO@Y3{-aF4zZcyHEsWkr^3SQx zl=z{eQGD-a(7oR~4D@LDbAZmt{>efYD2ZO*i+&sE#5+KS>W|{5h5OGyr+A45RHCB* z%RndIf>=CM=c0e?8}@=u<#sb3B|TK&q$rT+cl4q+gHCP7h6lScPy8Rt{?R>p#PcVa zzOEOY6b@4S#8>70-oJoO{cs~5a#zy%H<|u$FFH_>_fw7XL0{mgt@Qh8w-*EAByiRA z?@yxU;0tojilY3&Nw6%1QZ5QGDPH_f@Ccdqd`=eWiQ<2f_&-JB$(&@CVSN8D>&c9o zQ)pYB->=7hiD33zIzT3%@TvbGdCOK5=l5h#?Pdw>N%ydO_RwOsTom@rie{9-qO3@15chRI01^)L|Mtt`vl!=)>!JEK-ARfJRzN;PgZZ_OyTYfN33qtyUaW5FeU0x@|kv4HNe$QGf!L-$Yn0K>^B$&1s5bKM$MSwU+%~~kI zv;}|^E?a_WS%4Id4i*8^CIVt!%8Hd>+Gs$`OIg^OF}N=hrubBLJ&qSOqu=_+mhc&nm$*y7PebNZbNIdT+J_)69Sr??gcIKU#umCP0dp z3Y+|2M4=LX0g(K4Nigj!;7HKhW!MNv{&oOzfR%vJfU5y1Uj=}AgkLPdG%FzLJ8O{y z(-r_y_$)wrZ>9v(I6zc-992Augq#Vc#R8)3iTvSk3q;*fJ_GR%YG<@Gqb!Jcn2f_M z&?V8eP8kX^w91f|Atyrsu_#Cmq)xTCK&M({RjJ&nlPaC6U2_byHqBA|w`vaJU+^jO z(Wx$KzK6X_a{&npKw`c5(Ss>bcoajtQp8`r5B|vf0uQ+(Z=(6Nj3>!qW-GYl%ydwE z$hdQ?M4cjzhNWt`T7ge(2#l>9!WAKoO#_qpt! z+8@PF`i{tKl5t1mB~dUU)7X zz1=_V<<3YmFeyPPT)bj=?m8%C?OuGy)IRebxcO5;$o)v#e@M0qG$TV)s_-6e|c{H z;>G!kCoNyG_`YTNAopEoi&qw=_0-@Z7U85R%54S-^;~O^&_vM{GD{^i;S!ma7Ns8X zrc!`-6oq(wViIiqS8?|`N_>~u6T*z9GT^<5`1tx1$e|X_NgZIFad* zyDu8!>io4dX~?Gcy#$4>KqWo}2Nb;QbdTVYeE*8ydW<1t`iW0+kpBnc`&Z(jag&Td z1M(%z7`V~gCC;wk)2CsM_L`)}4Z|GM2*?9^^W_tr9x@7)u*?7V<|p2PywiR-{U`7f z)3|wA{KR@mKHf}^e7sSYkdHUYTRvWME3&hRlkSd!pIFZ=-lz$UCi!^LC(3FZVIf&% zkdHSr%VhX^DUlpzU%UodQ zZzCo>d*thC!+U=(|DgE(Po_Kp1r`_L7*b$C)ei+01}_B`d+3|xwakH%$m`cqH@fn@ z@XGhXf64d4Y_zq(z8C)QR$jrHOS!NZy~SK=)W_(X0F3`7$}3iK(&n7b_{Bj5bxmja zbk>dYOWK}^a|=P5>S!ZHQ}IGPWO_sLgME{Dww?e;{>do*B&_?N6g$wlIo|aWQ3pO- zlkcn2f@890!2uf<9Qf~N6+%n!{~D#{iO4JM{}h8+MBFbaIIR_E|D>34gk$lftUD;E zH?Ay#^Oi4OwzQBIzvAIwpEYq`$@|h92D+E~KVM%aOqtqudD%w}|CRNnRQ|p1sVen+ zN^-ukzWfhaUv~6bUru`Q4|jE(KlY2CZT!G?e%hj|fBE^|pZ_^x(uaRs`ul~scK)L` zu(hC%%U9Ny$83?1CQa8PY}$_;h*jgyt2Mry1F1P_ul+< z+1F)oS@~=7msyG+uZPQ9W-Gj#lQq|H(yE1v6{&IY(5VYmqzNgL66v}On^7<3jmsoK0SzdN8Ld4bOmGz}u{Nh>Ezw`PsB`GE066cr2sMx#n zmiJv?_Llo1?vZF6%}F_@eNv^@x?7@l|5xMV6d6uldn>qdeyQxaF8BP>D!+^3qbM8k zF%94K=wp{aKrw@zUn=pKDFZNqa*!&aef|eKzjP2Y6^ydJtj9;rOPRssmaHY_D;V!` zqa^A%N%kA8a*4tQGX@XsaeAMJIyh-B%Z-xc^LU?!(q5IGU_8Xb)gwaSmt(x-M{H~L zmE>}uG(&!PpsBYUivLP?l!c_L8#<3Z8P=aIRgFD9o1Hl? zoVm`qd!oP@q2Z;Jn|HGk;m#M82xs1=M7Zho5a#H1t8<0MsjuO4!_#ftDrj^On>@*> z*o$%Iitd&x5-QAe{qr&;R0w*u9$II!BODfHsN2BYW49Pws_clWQf8d8JJ;4h; z&Z%6cYN9I~oaCeD2|mec;S*-U0qWL4nv`8Fsb%(Lh?{6&)5CpJnP?F-x zfTW0&o?+_#C7BIZQA46L8q;Oh^T;I-kxC?BIjG;SgJpYj_#T zL>=)`Q*vv@)h}hTm=!|VGGaAWHsuQmu%GFgFGwPd$ceW&Vs`;Z- z6v?U_mn_H)hw|Yn0@L|@6V-( z%^*;21}A()w2hHl#Z^+P5HdAVi(0tkJ8B-RpypMvyt?UA^BjmTP*I-`c^2I^4JE-!F3bW^jhk z(xs)w?9kGCO0(zvi@poL`O=aZkACX?UHHTNDW9%8CVv->n$IrDme#j)ZpSdyxJH{` zSFE|54p3}eOJ-8n-J3aq#_==SCl^b0k^V}j?%m*{QJn76?& zfCV-$l3a8X`1VGNkBD<3&5GErns&ggVywWsV>>mn(7}rSy3>~XctX3x+b`{J4&v_a zyPHkm&!BCAw9a0FySt~~1s_y0NM7C!{*8rDA?but%4zA-U#S^4NZl{}X8JK5N@SFLll(W(>uW#`l zokpGV$M{#UW+EP~M7a^C3GzeEZxV8#%SRT;pAo!pN0$GaGbkCow2tODcc-9fvVGb%Z2c75& z?8**IH0~SmCuq-$9?@)zT4LTrvmitoHKzb%m|5>K-W2O(O{}x@iJQE-11> z3WILVMIS_azfh5*uUKh<{DO*g)g=>22bw$Z8yCiOb#7}-B-HCc7yHV>8kwV;<)?&A!ntoq|zd7yI#dV%rU>ytE>ROH)Mpw zCK|T54w@%sB(~HWe`{!&p9I23&{i}%AwwAGif&O<>|r(UOd%=q`KOww6+L6va~$)ydK^&_@`*=)6I9Fm;!G#tw*} zQKvZ}Z6+hx(So6jv2oH_j&k>w#v)DF-8{`*G1{3SrB=Z~+CU8IdU2S#4F6UCYX6u; zJa>%yNq-R(m6#1KzyFB5QvO0UO(M@Y)dlUImAa$)ObRo4?o{`2tLnaQ-Ny}Ta_IQW z#`PDc-s47XNqHZoB`J&(+l3OA&KMPUwdmeOOCs31-|g*3Ni+0Opsn%RO~zPJ7X+P; ziFZJm*LAVn20?vDm+5>^@Hwq3Fg_&ce$Z7qDh1!|`dZ^=!T))Et823m@T$JkxkU(S z((AWY3BiY@r2*n0-jXeV;P zSUhADce0azGPUqCPO^&r#Eg#yKPu>y7z#^yCpzhb_&w;jZy?@9q`s>7|3;37zB5o5 zg-(3w`!Cpl=18+?90Z%k=tQ^o^iXK0gGV#!kim zPSB%)(|rKWi{1h{mA^mA&%4~dkmHF5-8&u~Isq;3ZU7zkV#N5VUdRxS&~=C(ZDtxB zGkb9Y(Sf~ube~@+(!tZd+Ll+4zgT8rzoh5>9T(^KjOmiT`ghFDUjlU;h0FVQ?UPj7 zlGXXE2J?MMPrcKeb6LJG>1k@M?j@XUmvEy?p81z>Uyjv??QY3O&T`w@{?mul-<@CR%{&j5`OE!2C>KG`4}?m& zNL=uFio$|krPinRm1~s!CsXm>ziXd*zqGghU6s~)xe1n=%^=<{?W<41FVFj>eR((8 z0aB;5*#VqAjdmb+rPU7LE;ZW$9J|}?03Lcb+yT5vEw{(L54s&g=D+QJDJSMy-pWgM z@n5Eka}o%cb$S|JMmY)gakmcQE)3%C9K_uI8X38*D zhI$#&LKRVI-S{KulA%+Ef()%P!A>2v` z%&oFJC5}u9;uFJ5DD$%H?w0ZKfaK1}IJGmvT{3=~99~96c_rlTlnGO0cMdc%cjF;< zr9FqhPPo!O$Q$8GdpaQFO8ea{<4Sw4ka4AbLbryJHMlU$-+SR6JxaYM`Q9V>K>p;} zeIRFfmK?}gnal=q@1Af5^5L292K1mzcmsKmW<0Meqy4Wjq&aJ#NR&m6JiQO(O<6Py z;!TOovlSS`zY^```d8LVJ+EHU6fCpJ55hG+z_jkYdKst$dS`7Qf4#FL-U0R8ItAB$ zynHKEY}Mj@&?z#5l*lHf=+PR8Uq3!2af);yRJsqkO4;i4b0<`ByVSixIBK40O}nk3_G@Xy0eo-uDTMocuc z*RQ`0JZ@+Q-h5kRr-$m8;u87a0Dp@4u|@OI_bUQ+e|L8v^biF>ACVEdgMy)ZC}j5! zcFopr)LQ64((JjYR`2;*t%43Eb`NAe?WrAS*^T!(=CJ&?^z5+@zi4J%X~B4+qs)a^ zFE|+3JJhN=va4V}u2$D+qec~WL}=>NQC#7P2%ox4@IQr|WNy?%I_HjyteN|6X0qoo0w!jl58P6dDhA2JQ^v(nO9f zbVt46!Bvr?3a3X-DP-X;_?IJ$Dc*hHPTx4Q?)k{X!Uc%84Eauq z95wfOz>~w6x}%XXg+mbM3&_KMH!o9HT5bu28VjX5mWn_zrE~NZazz@~$XL7v`M?L-ld91dv9AzP^5DT|CMzENYymF5}UDPNJ<)-wZ>UJuc^UG5kFS`+THt9@1V4 zJJn@6>hhewPn`?tF9(h4y&3P=2)k5f;|eQam->Xc&;dKuCDr+<2=qs}E*Zq*_E*(e zF&?->HFa*3e}`Ji3&z21Cx*>J`<;nCoPoTj*R`I1@W^gFX7=u9j3Z2Qvk|TnyqUp> zdll*|0q>!-zKVLCg>mOF`mI9CK;F*7|2X(j`YQEP1z&)AOM)AXC1t3$Fw~oZmm=>; z2pbJ|W!y=Go!UbQ+6~p)K;upe$~+H!DGz-=7yX?_nNhw4m5_#h2({>v4mYYpR_Ti< z1I1npJ#>2TmqI4Zx3%`$FXG#jV?4%edahyhUs^<+a-=tIKF0oem;Yy zz58$CyD%T&UEcZHZI8HU#GG@E=`|nOz2+mky3Pmn(($A`A3fQ3K6(M|z+J9o{vtU9sg72qo*++A+5(BNBc)UlyQsZpXLGPBT6T=Vek293Fgb^K);;% zi1PB!osWiIdOkv4Paxl(`RF~&M<@fzKjqmoAKB&k2yMtShCPb;s6w8Po|WgL52X3% z>!)cx8rye1dXlMIjebt^(W`R(=A*uqxv2&HPnnOdrTGYH`yb6mREP2yCeBC5k2oJ8 zZx3NU3P+tD)iMnk0n7rLgF02=;vBRRV}Cs6p!t|T=3{(%9CHx0$#{$*`y*rK&PQ4+ zMZZkl5{zeBeXhw=OCrc{!iziFvLsaUNq(b8p~oaE~Q|67|Di8bC6t* zNtjok!y4kJ=4r6JeC;)#_Rb5f2ZtbiuOWTPdQicY^`Q5Bs^mpk4|?ZiDb1&HUe0~c z-4@rPEpoo{oQk&CfjV%bEgn~!Jag)Cw8swnth!NXL#G~3uS>^xe)`#rIvU^4wal!` z!~AeQaxCV?gu;->=(%}-#~)?tV$dFGjXV!|ptVgr*4Npv(_Co8TE+r9%_-5C7rH8Z z>S_@GEYN5k-HCV1guM**GPL(=VW;-+F6NWjuxk-7&1EN_RM)vOr8Oq4DcoCVP90b1 zeos@^fbm*Den{sl<%h;+H|*f2o9~^!jxBuM343~7H1c!e$(ePt0Xv2XX`hc1(oQ@* z3*%NsT><9a_b+4qrFHbRXv?&g9%%km>iHi&|MnVZpF=+Sn}6ME%)c34^DpXKnRCVR z@tTV}phuRE@d=ZMq8MVI@Qd#*pp$t4inS%IK#ZA6e-*u zy5WZh`pnT`NI&ywn(5}{&6Ce@!SU(Euf_h6VOf>hM;|a`)U?|iXV&Eo=I(v3VeF2nRsn_duE1`g@+N14B3VubS z-aksC97eh}yxGyG+_HT!{LQyvvkzTI$IEelrWi7hjoH{+&hxE3cyqZ==)cN}KZ& zZo*-4aNuV;=w4!SrKp7zH~My|XW%*?u58pp^Qh-e-DxhUqm8cib#(=vaR*+=4m{65 zo3f;kyUd=#XmDpQ6>61Tq_Q*_mnWgql(b@lp@x}DgVk=%$olO=Q~ zu=mwIQtyrXhed%TVvq;-paXgLlXBb zvvHRaDsNx1B%@4lYq83ndQzR*)KD%t)JU4)$}ogs?R&9>VOt57SU6S6GrQhNEZVW#!KH4$X)HL(vdGR%CUz%{$Sj~rJ%+q}2 zQ~R@wQw!7UZ_vNx+dMYQH1(^ejY3nIEws_Mc_=nV|19~a-}I7SCCW#we>?4o&pR&s zZNj3!$A8mtJ|*qZ_lwT1Soo)?556w??$as#Ux!m0SQU?)OU8`raHn)fRT`HoH zt=8)4BO@=8>7Lv6$;m-R`j#k&B!Tp2uBkV2O!sHoMCi{P^%1^o(w9jDhN0VQKim0~ z(ChZvD;vWXNZ+u#y)CxCDKH$uNDwK#oEmSict9%`$^uIPL zw~b|-@X+n;p3s-oDk2&2khpeh=Ju?d{p=@;KKWDY z7wrcY9c*ttbo$zqQA>AT_2rz65C8V%-;R0srGpO_Ze!H{&iCKwzD=lRzNr6>^tfrl ze0*Y;JP!x-)T4uA93sBdxZa)>eF;tA=Nq~Uo&*$sC@7Y&DQ%K|3zd2?uu zR#@Pd7<>h7mtDl2XNB)A_ zZ~AnT>50f+hi!{{tYxN8PZ~LO8Lyegu3lZ_5{S4P z#8jIjAi`*w$5dn;`zU(2dO4IjmZ_58J^o1GP2tOMQ;rMcXX_3aUbm@7#rj#F;7qj_ zW4SPBE_^gln4#BRb@g=SPekm(8o}y3enPmKh<>f`aieM{C@sQhQ!R6mZL~w>Wf2rM z?i0ew_iYo=8#xSP`IH z32=Ld%@g2OXyufmxy!Q3LtUt!RPBjo=u62;G|r9g(k)6f_gJ3u1h_*#sa*-c40~yY z5}<9P`|2rff6Y6G0xp(Tto+o+1TCDmv!qjzgHFYR`~>J!JZ^Yd1>~@B6_DJ3azfhO zI2Kgz45%jL7)MBH;AWMn(6RAm4oV*L^lwc+X_@d+^F%g2`&>%P1fzP$$i#grAm^Hl z+I{@H721puL>ysQ${QAJSYkd#J~uVh>)@#K%b0CgV7Mn9icPcQ8{g%OamJrTw+eUq zz0;<$wQe-DKkxR(ZMx7>E2lm0*wTsz`gB)|cHiVO3u}llo;DA0 z)wA;gZy}_^O^7A%HbUOvwLa!$eC#YjuFGZ+COL^H^({9suWI)5?|weyI}T;Ps3fSF zfA>8_e!{}z z6Ht+AYCt=K%icu;g0@?MT}tg?8Q(ZF8#jX`=jY?MD$Y$yp}tn4{&MS63e|FtX4oPG zYWE7Xr{j6WnY~vtY%QES;T$$JCp_LvX^k&>*co@N!A}QGs0M3HqhMIuE?nH?geqDC zXuKiUZr_4&14AKW|AYQef%+ZZjf}^Ys**PcTvSyeAFm*rPcY%N7pq!ER$=f;{=SI@ zEq9kL&v`u5E)qWs2ztV5v{?fRCZTZ}= zf!#OGvVNxPR{Hz4eg=l@nM?yOw8p5{R0LECdT8=(5jFY#y>?CBJ||VI%XLkue=^kg zilue&(cex}N-KSIBY#2(5bSI3QtFr6>Qj^@dr!^3=KQ9(YY1(F0^_YdI zxmm%!i=D@x3){d0iO=R$s3+6Aqfr4tfni&Tn40}P3nFisM?MqPq9Yp>7McF?wb?T( zB2>dz`)%drP`v9v)3TO4{=E=9EPU%weR4vTi8Dgiw0hik!G_6?{k>_DPtKVym{Ex# zG2!*sH{BY0^*gI9O}j?sq(oakdGuF{tmaei-8xra{r!mv!@}0jb~TL5c~kf(Q8m|O zyC0M6W>x1G#+dwsvEfo3vruInNLsDWUbia-Ln68xqkS-Bk*?jr1!EHw=j834x?Yfws8BPvV{SyC zi0(lA&2J|u&Q`?vD4a+5`U%Y^JwwCGAr0>|~65R`Z0W@a3*ydi3;N7;R_2!sal@NAy?=+rY2gjyabfg?^vVxZQcfUzi(fv))O+ z=KK)9$A4vfYQx4uCnszhn-e|tTfg7Ff9n$8pJSb2wdSHu4cf6!0I`Wkq=e*($V3Ur z6OmLPCx$G1^V97M-%Qco`Lub%(;8uSMGg{Pd446^o;Xk8U>|~sUJ*Pl`nT!A*a;e zsC3uPCpX@z1o%4wbST}`vF>L|0DdtPaZ9~^>(*w4Dl9JbAFD(Y8@^?c63yJPjqc-0 zfNdWgQUdV#rT$Zu01Lyfzf%ct``E@H!$noeuR_)DxNXN4X|>QG{RH)d_k7C(Di?j^ zXKfeSw!g@f2k7srA*5@24Uo#5b%Zd(ULd6CIzp14+{rxh)z;fpyij;*J-u1)hbXJZ zhofs(UTdf#RpsL&9xr)PUh^KJS~nLd!xhG-S)I^B~C7gANvmNO^#>cTCU0b z1YyUEYYV z#Z4zy`fKhEk1rCSB)!@2jJ2S8R&mXYE}Q1PGXT?^X^FR-`x|Ct-U z!Z^}ue77X_V8)$J%Ze%=*1{Ql4ll?p(!I%qp4l37od1h~@r^;W;ywbelJ^mx_|+VN z{GYyi33KQ@}V-x1r9gR|$^< zI!tS6B{GDcT~Q!!9^8)2Gp1+dyWqPdoB5^n*he+f?S)Hm<-1bErF$fX2mnvhzk1TgwHDbY;K zEK;au|0bVMC7QOW4w|fG-Z9Mi%?S>N9@887o z)m-?07!1FOMuYem}Hjki>f;V=c>z1An!c|5OtAt6_rnguL`+N`x|5TCP02UKFX zGnCID$9U6U$&t5pg4h&SJ|9Hwnn|OzY*hAk8}yTklsy(da?c_qfExieD*?W1I_?SZkY{iA_onk6szX1i z%@fV&`XVJ7Zj-z8VI`V5qYSM!jJw!)y4<5n{ikF6`+w|R3tW^{+JEQ5%y1iqiwbgk z@k%Nwc{&$TiI~^z6h0jOhaB|4SUr5L4|DT=UBInPnW$MpCwC<=v-up>Gb^2 zbhG+B-OVb}MptP`6FC_2G^emMllC$!jhd>Z zmC#J>5c7f5@M_FEV|!BI$ZFJi8nAe_RE;8HfJc)C6*46!P6Y- z5$5}cQS(xvy)-abQJ#jhIPGPf=WpuV8zR?0dx;UWm*GRc)p*6MV|nd`^_v*u&ucGX zoc7|wX)jhzduidcmo7nj!BT_MULMtp+KbkI;he#JwU-MwwEBzM%LBf=_TuN%UQDac zJG{60^4bf$HM1Pri)ljD9#Iw5Vi7{x%O>X$|`5q7#A?6}cd+~K>FU>{9vKT>o$qaUCFE_YoFN0Gs zc(JlUPcH7YV14duy*`lEh#^1dF+?pea>V`3T|QV%DixgPlS?_`7eq9smGrm;dQCbp zeNi2H{Cd^%UK;=QSluja^o+mfsfnDX^La?%SZEz@nfI)xr3dG@lXnDgj(a#q>0r+B zv5A5;4hekmM)X_ry3JU6EXUI0uw&`bc}+`?j?0!Fnw|HHOAp;Nm!(JGx|ALi=-_T}r_~>1i9_;k@n5m*hlkd9p zFik(9clZ=x>Cp*Yr&OKra%We$#n0Tenwj3J-`Hiq;_l568?y`0(>7!sY=opU7Ob)4 zW1X;OdjJ$ocqZ|lvw6=uR`H(R@NBkjyc3>^m^-VVc9TBr7$4)-)A-osS2aGX_c1d@ zm#s4%R`u?{KXGMbn!PnhRIZygbV_S6c5&<4&rUzLPF&X}xkopN47!{D6e2Qof?=)5 z@J;I}2gCJP!|>7k(0blM&2*2}$V3%TGf1o2AS580>mD8G@QHk60xSAhZgG!}bol57 zO-vAdWVgD%;T?-%^FD6aJjULPVUrz%Vbk~+d$jt43MDOBgJ0(q#&z3CM+{p`jy7LT zl?+=$jwatf&^Q?3MGn==G-fW{#;xlz)-T@ugxwG9fH&Ak52#i!HuSZ7RKZ(i?H-jOC*qfCbNO|OvN%=stH59iuW zTSC6g?CIJ=)~94MrUpDwd3tzI~r%qrv^t4+ux8Hmx+kP0EJ~}LY9{N-J zjoNK9Pr9Q?Z2!IGiM@w+<=U~3Y@BfMu$$Y4Ei2Ddn+j*YTxM<#7)?X*a~qzWpV=KM zc^f{`>2InMZe2xNI*}f>-?!}gZsxPO_Rj#urg5VkI7Gi7bG+|vY@1;riH*EjM#({F z2T#f!-lp+yIJ~=O8O^W4dxzXjx9!VE#O1>M?n}kxf*s40NT_)kBO}F42g?JGVx;Cb z9azVr#8UUVU8L%6HEd&I#|VL+_u3#I5~Z1YR*m@&>kO0E zf>GK{Q|dO|QB}xqutjf)*|c%L<^IO9iymv5Z;#es>eg+tG2OSnoSK6@HaT+EikuDG z^laU;D_7aijGYjj-B^CnW9JbpHFsbleyl<|bVqN^jiYVYQ+Skf?BE=4@{Vo1gAcYB zj#H0r+W&S?!~Vq8>)qS(vDAEH6u;E8A)bUW0lN_CQ=gGz#K+!ny!q4{IJ*i{o9-DCbhsav;%|FI1Ag)McsJxjAp4$nYH)#HFU? zmE|i%2DU<6YFawh*+r_p!eyz+hAt`+qsbWUTxwe0KH4rauuEK)nwg@khCC{sgzw><;3TrYE_jCcF8vr6$Ik z7olAV3(7ARZ|=atoJD6`xbnUH3Ss>j6#mDc$9-ivSbw&ySXi93kPjaArD5~YNAudE zzr$Wsff8Lgb{x8LB)HG4%sp3e&y3Q1_vg%N=B)PM+?N&!OQkQb3w;r3(3)!7%8YX; zD8E(>f7`rST&r3uPUc%o^vgY+3%_giJgiSG>9jt*3F}if+V90YeS|yzb3MO)q;tpO zI+Yf$@?(tmpt)hgnGx;W??)}(p8Og$BuD2d|6QS3!wy$?YpV2_YnpR)X`K_=V`pK* znn~45TD*@*u$*nxcui6T1)ex&uSm12(D4Ur?BgVRun0D={C5Gs5v-BW_It%)d~Jab z&_O2)kGp4gFED;Zw|x=xcl3$9I`KR1(!ZDMCl70 zxOS^Be|dIHe7`YV+0zwdL�pk`j_bc7XwicOqB?S2%;AET{?SXZ_$0B<$kK3`Aa*mP|>`{Wi{nAer>dhZqM}-9Hib^7^J+2o)~!IBHxZ^ttg>jO6NdE|%+xmCl#)O11t|K6wsF zURLkaJsr<~8ZMhw!QqO^9Rd(6M5m_!FNU+r{2K)SBn)Pl6E5>VMgumUT)bD}PoN0^ zkHCnL`O=5{F~&xzU}DUV>Og#cFl{jXG1YA0&AaPhV(yAs36pTcieO?+i_#13d4icP znurW@M$`nDn5&`+a6SujN7QlbX_MKDa$&m9xWJpqpTI;OGrD;*xdSGp-_DzN*Tcjd z5M_jktVWH4N%`zWBoyufZ{FPrlk#^=Fxv$41R|$=1i+;9(;*2mN$!|VGIDt{c|J^d zWsrUVGg$|d;!onuyG<}5XN6ucb%MzXCJfGBD$OmBNV9UK(yaM%S(0v=Tz0{;*Yi71 zsq}((ueU_n?R~*pivOQ@%Vq7}9p1-aZV9#pZ{sievLO*yT(jSj8yV6G^+`BluI>iG zjW30{=V`&M7uNcdNLT+EecX&NHT1=s>NDd1l(#TGGyRUf4qrjPV6qpGnnBQFP*HLgkp_^R4@6p` zAdH}t2rgm9a7MySI{z3Vmsl!SW#Q6nEL>tJ%l)a+_EoojDx5fLiMV5qaE|GY1L>M@ zCGf7a%o}5~0pbNyOC}(_w45t8n>V#Ee?G2PY>YNx0!vSSxL({fm=0~E6zPah-}@5L zWf(pBF~jm9NWVSq+R%8i(nq4+4ugq!{`TrXCL zM@Na{v0;$J@ZflaVa4IT>ivsCd>xZ`mQKXi-*YuwFYS#y_ZcCQrdj>Pc6D5@K%pLN zLNpB-Jg!&4Y)2gkHN*!P2?O&B9*lfaA0}FG*CD(Pb_z^unhv;W?PJXRXW@FufS=+4 z92ZaExp)Cz#T%F{YGAg=eg>vjaPP<<-EPKBw_6Du5H0Wn&b3H5JTDorRWPM<7+QsCk|0?eF=z#bqxh8KZt;EKDG z1#F8T;N~R4KXFmy?8(5dngU#~DRAEh_sZ~Lz+ZCW?9>AT{rSB^N=Xyo?B+%;5tye)Z!#k}=8rhYgb5ucW$Q zlBt1R1#AuIFdQbC8(~I3R$9o9@Ms7_!w<40`Rx_bW#MOoov_88FX&DpJTV>c!$g_{ z7$^H2Vt;KS%zFAVu@M1Jpv%*jnMS1kG_X$JKbTK~->JaR^97CKnT)X{4|a;(RYKMoutlfWN@JQ`pp{>i|~vk3eZ$jj~Nk+c6BeBS~`PKkVtf*uV18NC`SzHLF*+4}=FG!VVADu2mJCDt zi@-aaYljSEY$A-c7T~pbxnQh`eFbe(BG}7;m*T`&yE1kQR$ahYn~k~nCd|nhn44z- zV{ImI&txvRXTKD_+E42T*NU&E2-WTGl`5_ z!hPqW$k}&67nqN}J|FHaa6gVZUxNO8E8H|!zX1H8m(izJqQ1%hPME}(ia9XF93EbO9S%$ z)l5DgFQQy0K&L!xMti*z^ZVV<4Q>(g5HFs#2eYA0oVo$< z-!Ml_2mKJnghL3kFl_W}D#sxjJ5ZLhm~W^&2m8?tI-wh!f^N`^IfU@1PC_?`K>kQK z7y;cN0`0F$&<(nv8>FCas9YmyjDVfyq-jVy6LuP>BrdwaFw~1UrjfoQVrYr7wsZ3q zu(FWH2cR1ecH2BRV7GZN^GMF;?!B0_5M`nH?;PeRZO8~tAF$rLKZ)jeaekq?5a%Mo z{E9(+i0)x%XX_wq(H()dwg<8n-6PQ6d?9PmJrZq>#>-CREz-iQOT<`3SZt&Zi21$_ zI?HhAF8$^4pP4@m@<)1&YyPM$i1|Aw)O#iBodsSg=`0+s8p^}rj)~*2Kd-a!`ol0_ z#FAbJ%vsd^Yat_NGmt&$g-X-~=}n+N21=`33q)X!hVcC5JJBruWh;U@hi3vGn(E5)+B zi#|YYc^4Mk!%GSAh8$ z`hX2_4Z@uN_DnuMU&7?|tYIYzj8!DhzoK4ZV5jsG&}L`APW%_qFH8teb9w-D2m|7Z zgI+KuAe{6{@o#%H$9-aEk zq>`r)7qzh^$V(Q&1TKQk6&_cjMZO4wkMeJaNoli~AG(CJ8!>NM1YXi-4$@eK^eaK5 zIJRS6Abm#EFLN=kkiOHOKEvzQSJ!7cWz4$&Tg$1+lRd?`t3UP zXW-VY#P1`&6mA{H`TlY1_WlcT>%6C?ezaK{I9;P)=3ry&Wo(cQVAfSyajSPlf^r#d zQZ0}H2W;S)^M0;5AHb~Z4?A(7A!%_nv2}T*(zFBrsb?+IDpwT9%JtS|K+I#>ado&M z?6Bnc0A`)er%S8;JAk$ZFzduNqg5_fSqW~@WL=i7TxPSD)hX?C7500k(8CcS?GpBQ zW5`)_Kqd?q#2<14)Oly{cw?Kw?2-mbgcAo?Cai6tIPiNlo_fH-eY_@LD(!@W|EWF_=yBTz=VeM56KKw0 zE4EjIBDFjjbWsEu8>5fyxlrJD2S2R`9SzzFJbqj*t)}IjBYS;OBo)( ztcwU~9l)#`z^ucS=TU~DqVmFpB~fL06-&xWq71pYWkg<9SWytQ02gp(-k8Q_r_KvFb=p+`t_ys_tED_LPTuB~GHkfn{csJz z(ry3rp=Z|aZhy5l>XV|9df9Kct=aX=JPyh3t+vA_x~IF-r$o%J8MAIR25f)%%^cnY zop%YSWjeIdOx7(VQ*maF^oC5;cHLnW^PAyJPRdJ1m03}HEd>WsR+>@*lv}kvOU#Nt z#|)Os&DwzUTh=s(o|a~8n=!RUwkM96R!c>9;?>Ec?usZ1a$rmltVH{?l>n^^9jUl+ zy>R%c(GuDHH*Ln-HRhwheqonr-M$Z2{8m7oXjSj9J!P45>zbV$fIz|RijM&(ap4%S zC58l^kVbg@$&0gx;8@>;8vs|=&}su*owN~P6PY<31Xp((z$V7Tsw_AP+2+x?rFP2X z`T0FOuEbxBz_Ck{X>nW>9Qp1z)9WKWI1H!ezhm0g0FUmxj2%S>eI;{=XlJ^KSZ;a% zuyxFDn5Dx41$=-&w`MOKS{n`A5wDpMA~n)Y<}FfZN9?l`ybJK^G_rY_@8|`X0o|Y~ z&%q+hK$hEU4u(4;_I1*kJC5P@x|1RUGnhYJ$Kevxtg6BJMLykpFr2g;GmYOtM}G-B z&pz08uaFEggih*lam}xMPDC=e+Xe7WKjeuLA+T+TOAlmT^SNw80NY%JmO5(G!iLHy>3WvRn4A3SyB#FhY%VfR5q9yCRRvcv32u;QEqytss z{$aijYLhBDQ*3RzaZjul>yQOtoK>vD!^2V?49}~gZ6X5`_4FemLnas;5R2~&D|ayb zQ59|PW!H@F?$thF>RPQIhr{>gz^eDhy=*(>Idy7`iV!vova0ZB=+O6f1_IMa9Z^q? z)UAa6B^_ZSNB%H6>3wo!9Zrcy;>>2QBh@A+JTSv#bqMj|z{ffIJ`@o(-J ze8E3Eq8=!FQvX?WM*GH5gugezKfCc!5Uav`fzq`O01)DN=Dn+>L&WpU&-!-U;efYb z;y3OW;STD6RAB`a#TF-0g+AWzCDD5akSYLOSM!9^+aCYe0nytIZ{j9oJ9IhZzLlLc z;$_kMIK0=u`+29gY0_h_h~7N{O2!K+kIt=Y$JgK>blZb;Vty?kw6q0{5M88Y@NY4A z#&V88-r?nSCrNq&g(x}x(7Oa+>E^B&^YT31769qJBx_BCBbjr2%R44=j$qEQ`g&dW zSyX^rUb=R$s@r$3PU{mPTLQq+P)T-OkDKR{Zv($^;Z{1-u9Ap{+HK)Cm5PVjdjOxv zA9c5fcQ~lMGmI&%BHZAQhBdE=XT@veL*^0KB%O_Chh;4nqp3?bHWNCftO}rpBeyn+ z49#ogLn=fD(=dHgm{^Nr{O0$3krJ4#Q>@Is-)>A}hb_<^sbiag&K5j}U?cz76#ziV z#$XOZa=)1z=HOZ6b1o*pKF%DQ`Nef>qC$WVQr~?L_#oz#D$mz|B{|}x5%?hY)(ON^ zHHe)a?(U(#8}?%(0D#s207&*cz!ck%*{1q6D;rd6dS-Z54-T5{rNJq8+jSc*s#g0o ze%tF|eho+38`@5d9WBrJ_=`vUrB8p=>#>`N7ivssNgD2CG}lyY836$zghavy(+{T{ zIBo^cJ<}$L&-|EtND^jY`wZtv{6*{ciQXxj2|~0;cg)4R@+It&&b5&4; zEWFY8qKCQd_JV0Ir;h$|(9Ctuw)<%z<|dN`G7s`hh=k)g&M}8`gzt4YHjOSVvyL{F zm3uApt2rE!rmdf;_}de{g#JXJb-&>@NQT(x z>!KeXD)y3RTp2!*?i3l!FM(lYW>60Ye8nZx>N$e&v(Q8t#d$w*7;Hb{@1TC=H(x83 z&-~{k1HoYt7@%pqOKwlQFnsI6AbG{f(CNzXolCkA{zxIE((WvbF19XEEKEa&C@OvI z%?>JnC!8|5?tHaa#OA{;GO@cb>~m!p?_@}6cVS@ToauHDgL1bt+fn-Fzvvc-rLT)~ zw5m6pMQn<5kx5UxQ;1Wkh+?aH)5)NTcVVdci<2SOg(2l#XSzmW2tVz)(pma@WoyLJ zOWt>Yw-z~zXnxc5CH%$@}(Br1gw)ePsWSfl7t^E@Q zFIEmHObIlKq%QwSjd2U~ga>nTul=EJ^cDb%Hv3O49X`3m`9t2XCtzkdI{B$I zzz@G6ETg*OCL6&w0etDbwX;uvkHEnFrfwZRY3vk944nnKYxPRPmdHwfccXdw2pkN> zV_^AnFCw0V8)*M5+{16Ub?9x5btrHv1nl&5iLyRrIS+dH4 zcRkEUoOp-MwP>7gIQvNI4EF_(JuN_Re5~{MW|AggA}_w0(9Dz{6I8d~@F!#8ml+KoqIGdER@&kZCsI$FEWO&YY4Q>mj9pfnW#$F)0iT{D3f zredwybhwkC)puj9IzL~lK)p8&vL^;Ft7z+By;ghI=ps#vl0NHh+G!3%g8>fW^U%s) zRZ0xLPy)6xr>6nbaE(;s58^rIIwIY? zIiL@>R5d!NJ2mt5B9ftbOk}YLL1+i`p{EEzxVK8C6r*`oGrvb+&7a3Srki+)W zTnEDo1ag>iubo%32us}LnK@BFShP6+6V1^{?_##$fXBxRg8~Ka@VuF3ErMh0aZSS1 z!VO_u(N1dkF^_P;n-h}q#5`rH`7w`^MT2abqtxBRkg`IU2Pl~);89{8KuAg8UMF0+ znj4Wg>VY(V2t$f2?mFV;0m`j8$tAa1A1A{xSB9^h3=+VkbCW5hTj%3U_Y-1J?iA($ zDvbGhemthqGk!F>5ml1Tk3B?X{alJz+v=1Fu+q7CfQ#lvCxgkAVVeuXSQiG#EN8l% z#PDRjClsvX9?=pYPMT*q5GSLi5tQV%77k=GI)NPB2j?lga&6d6+PbV07S z4ZdZT$j}6aSH%>H*ENd_&3DO%=vUUY4yjn#a5HrM%)!w0bzaTIgR?una0`Dju-g2D z1}na19}Y_X2Q5tq5q{hp5OI{|0Eu5FO$ZZ#AlM}N!Y>`jfB^sloYq!F{Ts0Jkit3N zP7=w`W>0b`X>B^fpYX#TTk~v328by@n>%jG!U|6Wg}WzhodYxd zxT<^H%dz4zDR|c1qR!MY-Pqg$sG!+S2(ipy_j^R|6Vr_n(#vmldYgj(;_&XCj`{#1 zX_nKwDR_Oh$bA9c;I6*I>D?K8Q-SDhnqh1PK3Vmh0Qs8p+K_2jDx3z~;`4H>k46XX z&4lRcQ#@bA;2Fd@YI%o35k-<7N+BjyEAKTm8(T_`D}vf%N7P_ijRdyh^B738$3$wd zI{3gWjgSrcTNvl~o_7r891n4hmhi|G7Su=8$w}#+)nBRZWOrEW%zpx&-&&x7_ExQW zv+zQ-DQ*s7VpcQQBn%;F(e8&84j9BAhKtl*pL7Qmxa=(Lx^Y16zIzVmV4Dsr8oOy) zmFE}{o-fkZ%Yk$_d&EAy1IRt#=sO~V?gk#xluI|uS8IG&1PmPP9^Kn(TQi=Oz5MX? zz~$5W0++9#9-EzGSG_s}z>uZt!P)6ptxw5X83Cxnuk~N70wnqr3+MUyT|^B0TA$LG zYg?chJb31vtUaACdaY@^4yex08c=i*d9XG2IuT<~7VAJBY->$)P~+UAD`}gEHYz$Z zA_s}9&-4xa-XMo~c&zna2SdDjbeqUvyGa`;GE{#(opUGpQi$=35Qx8oMHhj!cw*3pjf7VI`%{|SfI z`a^?-Hkx$Pyve)w;dt6`I(U62dDaY0v0&rL2z0zbGctA`AIo~&AZ z+psy-)#K{S>mN3p7`A8Cp(t2y_6~eLy}L2S6KI1nnIhV6NkOMHC^BfCxpBLE^w2v~ zOJ=`8IP~!ZiT06*Ltpqv$YTHahz)~POGO;|x5rHO^C~7_^w@RJ&S$kd+X$~!f0`Em zF<%b)EfKqY35C7T1%>_hkuFPD$s?}=dYl)eKJQTntm7S2RRCsO=NvBbNA3~5EqA&{ zo8W!i#k*+x>!P=8zB|x;kDHhcPVTZBPKw@^yWOMf;LW;tS8l&3ddsriqxZpE2k+>| zuy2ZOiz(Q)*cegOgWb$O)B&Q*4@z`h%0BsuRK?S=vosHJxctqlqF1~%Hn($3{pjq7 zOrR-BQSz030n7`p-=2Qc%c;c>$%bb;wyezCr~{f_wJMaL+-o|T(e&#%$IZXx95&AJ zFdT{H?>;i6tm~1@ISr54?>-w?6>(2&@7J}CHvgI1(MQDIw$jn&zg*Sjp#H`^S}!(X zQ+5L`wBRq_=-Jd+Maalp6aFF3Z<82JoqKeR$e_#pLz&3HKI#GsI`eF*gJFYvbSJfW z?#>$OTDm-2u{fCI(XKZ)#B5ytvXF#qlRJMS4%ZL!o+uRpv-$jHI5&{gJ^C8$_al3Z zSHUQLGo0eFJhuE8?Vi(6)#=J$4@#$BIXH$2Vz3+*ejuP^Yzw)KdWu@x`>42E*}0J0 z@8_th%`SsL>sjsx0wl=Do^#2qt;orc;L6b9!tjC%gTC0AZUHg)9F*}t5O6}-XXbt& zpu*@%9HQF4ocn=*sHPGZne5oi{XoDK@iP~h$PPFebU<5lAo3q~Vfel!pg6;&5H*gP`1dY-|L_GB{={NNq zFcV;oBqAQspX>sZ3e$-&qlkcq!qLZO%m}1|4~+)}q7zPKIOv2^nT(gx5a|;@ zr`?-5c)dhA;zP_fll%h<&yzAx$g$uRi1f5_$7V9BPfScc?u?QDu1MU zzYM64AcgwkCh^~${6a95E*ZE4w(yEM&CTP;*&=e&&jP8Wl!OSb7`ZFz)UOVr5}Cgu zLM0W-fn0edfJztnI>q)=HS9oDycCJl1@%ir5)-h(cm@a3BCUl5z}KMj|1A3(&egeysOdJ6Dj_>yxDmwzmMY>KB2=9T!HXaL5O zi}yQXUX96DivQnXfpkoBTyp|uFZ&&9il8W%%}B%*mvR-kkug@N&z*hT8w9sj z@NX2{I>G&*;La4>50D!L*9-1LNYmB5octjx5#Q}a@^^8UlRqj@#A_Q3f5Md%+v8-| z$t|{DptEsqvAz2X{vdPD2l!9n#r9eYH=K^=u|Dna#!mnsW$eU+1U@u}OIco?7n@yV zh%%NIEyt(I6SIjBUCKqx{p*WEi7vx5QA1-nZ%%(raBX-z+427oj92t@2w_Awk?BR3 z<(_NBp%j8U;uGC4O)hrS=YqnDoYLGpfta10k#XBit|54P6DiSn#QgED%l}^uH&Tq} zjKE6sK!49jcw)T9gOLO{k2I0d8lV79H<R@`}&BRL&(dnf}GowchGiH`t%N(EVslr?{Uf$jS-AoFPWrVuCJ3KPyRcMb=IX#vdIM&qe)q*x0V%HDk`nZ+hmhW__KH$GS$T$ z>J>fe;yU$GopOaDOYg+i#yfjI7!LTpXVq;BQn%o{28Us-@p6m-@Sjv z`1soUoB#I7$|A+@|9tlRbDy|9@cj8bLC<{s_?t&!|C+VHqC1Lt#Y7(tQ1#I)`yoL6et!RF968bk86Zd@=+aJwwIEiJiLmfT)hTVYh*r&2CYw;GMg z6-L?8N~@8z2DSUDKdDo9X?;qxKBs!rJ(=n_O>5|fIItWMde9J-uU#|cfMrTYTH;<= z(g90SwQNdzPry>W^1cG)qymUgImu*&T#b6=(n#gfUN=O$%w)}0Sr-Rd%Nnf98_eTA z>rsE!ss75Y{zNNV(AF4&L#*xG{}YA~oNpaCQnoSd#n-mk9y0$LjsTy{P{w2Xb+F}tF(A$;-yCn$Ge>W z??zg*SBJEA5%sEbCYBPQH%Su7N zZ2JZD%WeOFep&b*reA&}=$Bif$6Mcjc6mdx&k_Cjl`j>~dg&vw8Zw70UeV&p#9G}w~bMBK*z*-_Mf0*PJnD@(=>&rKOGZ$ z;G|>zfx=x?$1JZX%QF;@7nG0jg7P7{FI7eaJ(J?4XF%WN~3j3Jld2zIniREc&No-VpVNp@kf}+x#MNm26<=E2v-|Cy<{-wBID7t?w z`lh%Z5c9{^=H>tYKkjGJU2i{kKXc)Kn7;V|uWye3Zms&wqt7;d_ubMX_ZTi-{B+|B z?S=6#jm&@LwZFf!a_aau=jW{Pmfr9IR-n)62K3AUJ##?MbO8by&@+9`WvVYUnaoN6 zqSCJemDa_8LIv7zmT^ln0Ns{IFrd;|?Vb1GM&kRHu=$U&c=vDR1g?S};Wrg?@1InhLfQ&E8%NOl^ zl@V8kb3otZE8|zcpZOE|CMq3&_ys+;v}i$|VM(9u%mICquigQD6B<+mzQy@Z)i?Ry z&toPhO}FMX4Y~N2!JAsX`fFfl*i$XB$2WbK|KO3X6$AR_z&Dy*p&v@Z^3#K+G+C1O zT7s)v2K3DVeRDwHEG#Wg1WLVDI9VzDelF@B;|1Mgyh!Myj11_T_-+7ti0gjlzn#9B zHz9_8Kfl8MCVU(}pAYDp1N!ELn?2{4GXBH$&1>4<9RK!$f&I;aGeHCTCT_VII1@yd zJ`SF6O0OQ!H~Z+DKVyHBl#u~_^WRY4oOsFinuev7+`041Ki4E5r@HyS);GoPGsW*A zMfbq>npZv_^h=&UANXGL>gUhjzxwx@w;f-*Y5yU=VEJ$VV^-S7Nn<4DA^!Gcu@V(~mDCkvxN59(lnw;+8s$CA82NJ4)J4@`kzxgZwUQ^UB zFWb)Sqh9{6^-J-*xu{=??q7?3DSl@u=1;88zUKeO?==U`pI=?S{Pfzt*Bo2)+7bR( zP#1SBXh6>#&@%^qKX<(#eBfNrzuotm@t6oRg~_l#JySS;-b6vKs%KvFe&*#0=fL-x zd}aKb{eCX$o0okdF`#b>ovV*Apl|+Xey=I&o7eEY=77FA@V(~1_nJ|L+*~?nI`I4X z|BK(x|0(+BHGi);pl^z5$iMmbnxekh7hkilx;e1FDOC7?zWJZ2Z(cjTW>e_+0esB? z4EKTaK?C|`=-G(S?uh>v`sTk9U-NQpbKv)MQUClG>~BsK0NOd2b_bsOPvReG1^9Ok zUlUb1F(x+u$_Sf+r^{EHxMTC1Pk+F1WP5<_d%a@<-!73p4Pdt^hA&*BRT%MIc3no0`_nRKP6Zk?E zd6gA{14efCyc@FSIo+b|m=F)eN7px{Cos%y(njNZvtzWWjToA?!=uwW!Bfh1EGK#Qoc{_ys5iS}%okITDDZCv0d9vd_%3E4e z?yQi$@pbo!uNU!A{Tq9LA4Z{_xT@zaMduefE|FgK{!s!##*;aY zH#K5IWx-KESWpbMk-UyQdQ{DE!O;NMg;|_2{=z72DaM0CW#h%sRB8x^k)RVg=q#ng1@6^!j&Ha^1xO zIrDtxJCF$`0kxm#MR+pP;>OAH|qC8{LTT$P-;$W$}CnbXY8j7hWGJuv0sb#BZ$_dv-- zl`nHtQquU=I!|eb5zEqSaW#`wox9p(uQCdH?$c}!q&|_zBwkPOb@b^Y} z)hMrQU1u7zPQsYpqHuN}W@5Le?xK5o&D@V9wz7|dP5V{Xxo;L_vP_UkC&>i)h*UFs zDIeq(^U0Web~7e5UT?f!cs=oY;C08V!mGrq!0U!rj#q|PidV8b9Az0yGR4~_)g|t5 zV+bm-J`nOI6XSGUqKsJwJ6C_`9s!-Q0J>AKK5;m+j+N;y+TEGGC=VxN#22HJF!L_R zm|a~cCxtWp@Z-epvAX3d?*PAWcim#i4?oVMc*swMbi#d^#f{(pIPcRRe;ksCcqsk| zAwJZ1Y`2U-y9n5oBGC3q87^;VxBK6fGKqXV$e)DSzgMc;|D=M6!9~3DL^%yYI~XkI z}F62Q9S)PXZ z{e5Z3V=D5Rf-<)5KzL-2slRaZ%g8tSH|n4AYeJn+yU;^Ue z!7x^r12Z*)=et_Cs@Q7_mzvIpL;imDL-(MFY7^6sF4dnObm_9Z3N|^J)%F)GyS$>X zjN!jQh%PBD$;o3QlG(^5NIrf-cExq9_Eu(mZr;-IOZa^74#D0}*0L8Y$^Y5qcD>&^ z0dwomy$>c64dj~cw+`X&w?6H--@2@y`>o4d@3(%f4W(Mc^4}fD4r_C#`>i(&$NknD zh70#wuf_e=r!zDM4u(ilO@8up?F>dSlFc;8ZE|I5fLX`B8X}3T@6zZqPaV`fHf(0Y zcd7z~)xBv=-Tl?e2UkTr=H8(BUCJSQT~>nEg*G{JgP*+4BsV?3?YgbiuMgS0re>)A z4s*V-A$*YhQ1wCE%rd5XeHe2%S7nM%)YxXnGu<1!7>}d5YgyLM_pnhf@1Ez8YVuWO z?h3H#Od8v**Ws>G%e39)T!c?*R_`#mxqC_fd{}34i@Z(h|Cf(-D$S1g8O#U6Z}J_P z@k6z?`hrI47g!shKQW9bFHey8uUEYoY|*iu#)J?{3ae2izV(P%cii_`wOndmxk|5* zdPxUcG%BrB;-{8xW6XiKFfA&LF8xn)^nnt?YF~}%F<|XtaBe~e49*(WOLZ+V$#l|4 zo$MgfEvpK7%Mf-jCFFQx$a|)+gAt*}8@&(V?rU@CS&0_cR#=xuDotADa+P&yq&41T zU6!s~X0w*nDed&r&wHj&++W=;VZnaZ5cVDuhO4a)MTDM3Z1#}O#?XW25T;zET-snQ zV``Ryw?Kw?h*BWCFVec$W?fcijo)Xjz^&psC8K5zhJM)S{Z?~mJ7S|4yx)rmp_?(p zNL0%zt?`-G6$Q%50@(_caxrc(Z&2Dp4kE*iAw2tu2pl@;hrPjCk)T|Li#Q5ozlp>x z;@0H_vT~C(zQAgxrud+^IR4B;u z1Z$bi8n3mM;gXOYbZ5wN<{dWVup#WY-uqBW*q4&9?ygYS+a+P|vA9A!^b?5>oF^JX zP!X`4m4qHlQNwb<5b~bc`yE~Qp_FiDYZydvusP&#Bgbe%jf8bLYjy|f*BakoU8Ys8 zfDrW7Wk}s2f#dqvgVbPrO!5LzJtGSOUk?uuL zOJu4O+tL#D;<9u}(t)(e`((-WmL!JmKkra{l8Kw*)l9ScjMnFThoXn|Iipp7r1e2; z{1xt}nTE84rk137nQkw5(}J7Q61RYo7JNJ{5m&h5_VvBZ$=hU!9kR(#m^FwN7uA2J zS0gsWfUE1fbUxkANcOc%*=wGBENzNCEx02sp$3;c ziTlzL>(YX|(-PZSP{!Z}S<>E=Db=`_MW(0XpU+e?UFy#v6V|7T@##U9jA}769hRhH z5KC(kGEmzx8Dc>sxJ+Isjyd6&C9wf9rv9_Xw+vj)x{j+ryBJIliE?U z(~?oYdz+IESQ0x(2vZIqb%zA(ihO=-DUjKHOxH6bY(DXtX-rSEVyniKCwnH4+R^pD zWD}y=Pno>WlGtCBeWp==ruDgEd8<)Cs+27j+`*H$*E|(1`9Mn&#E#~)m&!i*(zc}Y z`BJ0qVSGO7RG;fm@X}*YJIQFz?XqOxs6LYxY)2$AT>F#I(J}>4>QLHqCgMj`=i)^ z9bNJmIwl0tGNplQdrd9W1soD6YIx)nRk70KWvXGV6%AISh8y2(R%1FwdkgM9T8i0( z!DUAu(?A`9arHe+6HM5L5uqo{VTV(~m}Qm11Yy)FO*F96$Xr=xEeoUwF4qM^7v-7V#dLkwyXg|E2az!*fG&uI$vN{`Hkk#!{(6pbm7RxhyBeR zHcW*Wx~&yPYq=O3=7>g`FV3374jMw zKP<7!Ob|<*6?4Q2NXBGc!5ox?b(%vlN+0Y}yG|DEjhNcPK2AYwVWx>Hn(X4UEQ{-` zD^1E3m9TR&7p9K_<$ZP;oXaAu%ZwCexeiGXu5G%X zQf-;i-++I6+vg)B!F0M#+06;|v}A^q1Un70UB*jBd(6C0V7_7zn~!~H zHBIZm&on2rrA@U%`GK9AdNBU)wIp{+;DkOiWgmq}vOy~#%GBDlDNW5oyIT^vWx8V| ziUepESDv%J;#9BmJ?gX2H1z6EdMI_rbRS%!VA2hiF1cM=cTjQ4*W|{o@*XGqo~oXy zljs>=Rx(th_$3>_r)WH!8hH*XT!-T8O!X<~IS{qc=OZ2IDohB&&Dyv*uK~^JCueG# z`l}97ji6|eHtVXs(xksHEn#1O?5J6z8k6bi4#hW_>MwixQy?W!07!qM%lsT_0~E!t zpftw#AOokGs9zwG3y$Kj>aX;qhM_s3xgrTB%yr(cl_edMahe7+YRvD;Ts20tJ*aJ& zXr=1&%rhwo&<)TYYAs2pWl2yuVCU3VG^#1bWnpkaxkXQerCm0;+7bc_8qZ#8Y*TA3 zQ<-VW5Jfdqlq>7Kb9|uvqN#tbS6_e7 zf0aI!%?MO%ZO{bzSLLLdG6Mbb9@S|dI-jAkxu;Bss2e4JTOP4>lxohzl$vMUnFGz&z%U(f914c(!~!3pZn;{#Yvw& zz3I$n+Hc4Dy!86#e_V7RO?s%)_hW_?eg=qPmZs@bl=M(qj(EOb^@aBXu3@&lr9G%;R=K9NTQM|4c1eB;r)pv~oqALk zc8ZuPD%ZDWP1R5@Y(hw|i%8`voTf=lw-_901;h@T||AF`F>5I+$2p44G$b4AF3(P9`jW!uxSc(wq_L*HJ#}; zACmb!dgG{oJLH9W{zDX&?J!h~zJwT1mX`TMtk0_nm0}a)vH0p*=j) z?N)F-cb9yErA2;xTKe^GWlTGUUk)g6{kzf9$C?e&qG8*@x!BG;Y|1wVW_Og#-n6Nu zc+uv}Jg4xGgB;?50s8wyM=l z4YgAbA85<__V>}$;p10TEMIrz>rLDUF)w6RB~{EGbdpUl<5Z@Q)~=BJ07-I9T0(V8 zZ7R2^RNk=Ii{Bi<^cLrpime>%LxtpP-MC z!-ca()*96AtNx@;-KF&@(fXX~!G?l5PSYCtAvU=pLJu0k^0jM76~mUqUK!T*(0Hb_ z_XI4}EAJ~%PAb3w8{>xO8TnXK8^`3mG#Xbt9Z*ogV8Q~ed~1Py$r z_Ursk?KZTrvaobEt;Q?Jy(~7J9d52&x9;dPn z)ISURh0j;^vb@5D1r_DYa8>otTDD#qS<7k`X{&Ti%_^x`F5ChQ&A5xLhzTTjH5Y)#+%kaiOrrlV}x5qq_z?6V7vyFVeW+KFTars2PY#B zl(4BmnjE>!<%E$rKwGxFTqBQbg(YFvBRuVD`Rj(*2e&&l%xRPnZL#roIdnY>{AbKXf3 zq@Sy8Gp6ay&EwKc@_G&ITBTllg!O8!ku+Abf$Z=($^_=v4y@9PiQ(Nf$gy&)3pn9T2`e{h4(Z`zNnDvJlEG*MhsCU73p*m zNv36lJmPgXsZX$Gu8tY5NQbJ~q1fH@XtPy0EvC&a+$&gfn~r&2-llVV%EKDS3^7SS zx!r*WT3(kPHlwX>j-pzD z-`1I;qNT;rMWv<2=;9^i6~?mCg>G#v>86^{isq^ z0M*DY?L+3(;Hx*{BbSVFM6NqTS6ym9sA*(@oour{8FEldty9 zcW*HN_Eyc{n;KaiQkVzk)rXLR3e0--{f6Tv)t7pPPqEYMaI<=cL3T1U-vCk#f-phK zuox{OmtEiK7CAV&ZdGVZ0_W^;TQeAfZIPsC6J!-_mPN-+b=E?#@i8BwnDYGpQgjsqputb$9@yZW+dTbz{$IL9{s5uBbPlvEI zNF>l>*wbhggU~9PcU6^F7ck91tApjYBQ6DHLaMdZjFC;h$L0}pLUTZhPOHBil{*fd zw(WX!+BqJd>X@M#=+ka!hj*>MvHOo+m2BZ%ihJt*7}b)HPQ8gA)6!x3%V%(X%op}) zk(RlUiUqYyKxXrxtdv0+=74GLn(_%yFh`=(JgwUy$?^E(q3dG3m(1H}Z@`?98}jjv zapoAeD(|+!U=#J@2{aaUD$p)9Dse1&T02XZImXfIY{FQiqrr+BiyF~z`LSqwoncMv z2~9hVMFG=|Lsz{xr!r*KUk#P_torX;EA^ROA+kY=`?RlVRLk*CL$<&i{A0-$nTvl~ z`j_yVx)guaqV=Bguy}T_i7Cjb^E}9)QlnXuuVotgnP$~(j7*zu@$sr?HR*L4FU_r; zCd^aZShRY&9Yx_D1IsW$u=&fUadLuKnbyckxySK4X}Vx?mDQ+*BI<|o=9&~5dn0pM zuSxPSlt7iHEz)(HCo$-WVR{)Hr<*5XbZpTnyOh#!`AViXFmR@-DkV*EXpe-OXJ{T0 z=ObDYOp81zM~!6acbqz?m>v)~C-CF8301ys(=nzE+o_*s_H|=04x`sMDU4dx4R-Jt zSbmLkX*}~}d^|a)y!ylw`{_@|L+wJ0#{>3hkq3qR{ST$?^7aE^W& zO;4BQX)(*4HezDcnqk#GUwNs%c+=$jzISBGw~hw!mt;~OBZ zUHt)cDj&tK8pkk$QHCLK9|E1`9F9H$XC6WKhWiBQ5RHRASqR_l8Xob?0iC`-{sDB7 znHWzN=(I;9M?xJ-vv62M{_`T&Cj!-ll%5Q@w_0=@99H-NucNTp*IWh7xjt%5a?8YWuQ~O#Qb!D zPTz*sf===f={=wihx;+mhY56sMIS)sseK#(eY6XG3h3lM1^Or#`U22Lz)cUuNAZ(_ zxf*mTFVW!S>1Y78ppzUaE>S+z$Txsa@kZgL__%lwen03W|2cRa;X!W}=(qQwzYh9X z(C)@d?OlxLf)IXnpYY#-PI^o&-Z(Kl1}7~NqjX=v>zZzYK!3FlT?hIY(2n3G`HAV? z3p$N&=kZc}93AnO3-oXM&{qm{8D!!b9>JKq(J;4zj8?j zMdMR5{%f=B?EEDqIoa9KSLEV}6goPF`yYEP;kmEbxZrX9#44Ob$i`=F*`>z3l4w{8 zbMneL#);hj_-jfH-?%L-DqUbGiq;Bdj9^Z@V)B=YBD=&;oOi`=Jh2}yuAKe(BWL}2 z=My8e2I`mab9tG9v^jdVf+LHqXbLya}CS0v-8TzO3MVEvLz+tlZ~s= zv-z_m60UwE+4;y_1&o}MiXurimwQPzopAVxyjD8mMB*#*kVHQRQgTX*a-(DV3Bk9j zs|SP7qxn!j4KnJI%y{t=&+#tA%Z|(B2(7ixVVWy6r7H*ITaO3HR=QGJ-jCY8;%sq9M{6(6=wtD=xD&5CbVBH!f=i)&YWv*KG7->A4Y z^;7vpqY@(&T2+5S5n4ijL0sEazu}w>>&n3{Z44RNG=w2?bdchV>}wgxc$VlG!Hm5& zE-wE9OWc)nc1i2IY`_(GCkkf#H6}~VQ5<(gON?llNE4Ir{HL5F6w6C`A|7Z&mp%d= zM?tuAK&1X$^7IIb=xiA(n9x(BzJt8U-OHQFIQv4nbQI28kd7JE028u~ zS_u>CTT~^?7??#c$H6RsN$KVCW^x8hM7<@QHy?_GN#RGpq;vvcj)a@`Hi+&86KyJL z2ignK8w9fs=6JXZU=m+0OiD-3o5}NGQu zp`%X2jD|_~VUQeJVS0kk&YQ^xU}CMDv5z;Cao~v7p;6Dk{GZOQ7__M(dH+Ng!HRgF*aD?L7eVRI2cY!BJy5P^0hH^Ux3rK0r9RfNpgXv@DJe!;fG+N{ zAP0&XFF=e?Z-BWexRzxR_mO#yTF&4r!iP?SvF_l9mCLk*)`e~fT@-ppXig{y^=Gmg z<*2@#(|UeE>jT};S=~wM&xID3km{I{=L`QI)e2jS~ zxJNvu((Ze;E%Unu8McDhbKk2I;dh14|6QiOi=yvD^ydX13%)D(BXm;!zF?eXGlWAgkSM)j$ItX4@%H(m>$jF(r-HDwc6^*^bX3Qd-% z5|UjU^R{VpvH^2|EF3A#GzlZrVgV1As?{1&)JJPrmXwUPRHNB{rREUZgBhHH8; zn}TA!qa?!4$8arc%|w;vh}&ptjc9+JrZi4gZ7M3v+0<0am10<4Ee#nl=nC_rf*V+> zER~AIQgO0UEj|vRU}&LjA`R6$Y@n)EVXd+@XZqWwzh(Ma37SdVKw!qf8H~0+gWwSu y)26@a*to&N8xGKV`AO& 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 z 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

    wL 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�-1U&oJf7#i&?vKx4?W5PV7DdBlVYF%#yvk1%$+a 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 duZ> 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 diff --git a/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/libsodium.a b/client/3rd/ShadowSocks/ShadowSocks/libsodium/lib/libsodium.a deleted file mode 100644 index 6698ea1d7e1411973b08f4365078aee133923ff8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1359128 zcmeFa3w%`7)i%E8!ptO@Oa=%V$i)+a7?t28gqU!#lMG-`S|g&Om1ZUvNHmu*2@tT= z$psP>eS=0#TWtr63e>hy(T`U9H6f@G(MF3Fd8tk0VzgMJpn}!qM&Mzm=?6uZj`@YXUd+)VR>O5CnX~kvHX_=Q~*#!TUnUigsH9OCid8r`Gwq=4L zu`_M9oa}74X4$fGMR8|zaq-M+Zus_sg^Pr1u3EZm;R1%sHi5ARCo{I|dok===P{Oh z(9GT!7#qGImOVLxvBJyZSXM4$_I@k7n&WGiGB)yrl|2r3`iE9FFc)~!cs47av5NW$ z>@TT|wf}c4yBBz>1bR503naaJfy*C=WplXu8z9MF!`(F;jz8k~ zEXUOej19)eu(Jwgv9Q_PUCi-zju%@Q>zJlx zm*-3AZQ$tTxCH$EWm>k1;~gBkIPT>5XO3TTOc*cuo5gVj$J;qR%<V;z>`y^~j_-2( zhT}%W$KB4@&pE!qk!dCRbdJ|@yo2Koj_-1e(n<33IaYGKpX19MPjXDvOY(&rt2sW* zaSzAiK<8e@&K)PAgJUDdtsLLsXfQ}}nH*Pg?Buu`==~dGzvpB6D<6>a@w>0d#QRt^`(XcffAL6)+;{lFeaZHJpm<)Xs{ydKF@${YIXhys#-Dw=#5l;HO8rI2i8^_;r{3FNlv1m`9YFIAE zRU9AUxQ`>VNOG5OEavzS$5%Lh#__^9Nxqol0~}xB_$5b^8TI=a4NK-YhvStTM|eE- zF;aRabIjrRZH{=fi0Lik{%+^!<@g-OwOsBVj{8Axd`rWQa{L>|ZJgi7@es#PIsOFw zQu`&*>{*U~-6unk@yMS`p3aId*bxp zj;);j10IiuI6lkq4;(+@Xh6IuzG)m6a4hHO;rJ7dzvcJ@!s*x;!*+6fnd7;Mc)o9s zVei6S_~RIMF?TQIc#6}%$K6i@-BD(?4mj{-410;Y2RYu)>8H6nK8dk}Vl&I)Sj6#G zjt_8r8t82_vwn{6a{Pkh#AJz|&T%fstAUN1&CJcQg<}`Tr#bH9c!c9=jtO|Mk^fo1 z?&r-~^p z6#P+qrg6ORLdJUTv#?x_*K(}qcw{Qd<$MeK8%H5ca_4g_;dn2{r#ZgO@f(g8PLupy z%W)mYM>xL3afIW9^CkIgj@NQ@bL`^y8;%D#PMeN?s>H(PaV+Jyf#VY#_j5eWG35fu zUm?eOj$V#0a{Q2Ee7Yq6EsiA|H*kD{{<9LAM36AGL zj{MK!xRd+a&+!UQ9|5`_ienQmkWCDB)JTZH*(y>@wXgDI0~~Q`Ky7Z({Zen<82%tm9>AxlEeJvmD z2J;Z_aGVT!#arXq433v`ypiK^F1H@;g!3n`dpLf@={Iw^r~*l^m-7?3`|rS>{t4_H z#Dg%KhZM<8vHe;&>YV=)HWRUBXO`i#e8Xyq)7i9G~X+ z8pmTCzu`C;=_I``@OZt+!#l!pgyT}4u5Bon;?lZx?uOc8SGlVU|5jDjXJ+MA6}w8- zHI&zf2#&B{q?$sp`gQ=-6FAXP1Y(XM1tbL{-qTz{AJnPwN>jfXW3?}rXxhCtXwR~z|0IMRa{oyfI!O2 zMiDQs8H-XbHCCmS4@`mPAqgKax)MY8Fy1qJGGR)H!v@$Q4lC zPng;mMtF=>bBxIwQ_9XTQDaR{m|mh$J>hB{Ul>uogt*~zgt%dIgqRU?gbRd}HqQ}akCG!K5+O&39XUtB zRTKE6L4iu8^+%2bB4!NXQjv3tB!V)lq}D$k#P4F)%7*f~ znrdG)B3eoL%G$c}FvP(86UA#A*O%AThBA;5ZdYYpfNnJ9P{FYM8L6+Sttky^K}4=~ zD@MRFK{Yv{Jq?Lt@LN?`8d6roLf2PU-VlaWUPc8RlCJvl^0Lr`spm_`;E)29iKg66GAhjwLL0q*JMUoHqN=PLZ!C#oR z7r{qJvm8bCOiM6AvyBi^gccpqSD3~=ik~y8EsCmATwhyOxw^Wz6uob8MOG=E0dpM13r8 zXsAVxEmpmtat`4K#W;YkmZbVp@mYWYR$$%r(Nzmi=AvHub3j2v#SW#{m6xq9^^duw z7AL>4`W`-kWVFkg`UajTKCKrdQHhtV$Pyu=iXaWOs~f_o;7`b)$Z=};xXA)xqb3W4 ziJ8m}8!;{r7%$mZxGadSjU0zpTi?k;5vjt#;R8lvi9=zS7^_ac&4fe#s5iB2`v3D!ufCsv&ve6jK6<<@AP;bGzzX ziU+?Ob5X}A{@r*}!)s}MLvdxbyQ;jpyariOS&Ql&9M@44$+cItXW*4Hd|+zbiR39_ zXlqPWE;vGgE|nU0EWVtXqConVms#9rj(I8K3`fzCaqG2#!8|F#U^YlB89FR zDu~Lil_C;ae#pO~3O3vU(=;HdstNN-3GpzmjUq?o)sWKz zYne#IG)G<7c=Gs%WJPUFIlW`KFr(}%6a_7)HY+)SRa40csG3Sfq|hlRl?9^o7n-9= zu1d2~vV+=#k|j@D${n?m=UccPwWn6|rJ9#Mm4St)=0B+6tBQopW?wiF^IItuHsj^h z>rwL9rz=8c`()%?=lz3f+RAEcYFweuVeZAfR_qB~b*pM?vWmkOko?@{f-5WW&R$(! zU0b&fU1DwNEojLhA{a_lu2;Opa=(<>mFlcDAk*RsUMcZb6{-_UjJ0K$*bwJgLPEs) zU<9rh<@)kfG#CjSb@6zWHejkfC=rx7Aw)UX17$14*Xv>_5{g$?NjvA(xz+}&tMpCz z2k9$|tdO(SG?s;^lpkAFwKc1J4Jx4QE5neBT~(`!c^Wb?6QWjcDy6rMR$l)@ zGcjz#7)yKb$*5EvKQFXc{Jby~#U~K9e)#HIgomC_MkRWFUTF0EyfD%8351QFTqQ#@ zT;_xZ8~TF58(7%NtMVA2E*HIKaQTnc6BA#(hJ&M8u|W^2&;B(SU+8`kUzXud8YMko zd$58LnjH$J^fNGG3budQlE$lEFD ztZ@6IAXC)W=%v?vS`rU=I}2bbU&;K8kTrP)E8OzCUqof4-OmhIRQHor>VhwUie+WF zbbLH{tBFd!1nmCshZL}PM8%tLkBAB{?A8vy`e2dKiYG)qLV2mlsuy60WP}n8l^wl^ zL;OT6^APDUl^{eeT*;$rDtA>Ehwk?b+L9|3OIYa&7&4Rxb$+9Gp%--Qx2p1Q!5o_h z#R}di9>SD=*hD}+v<`%o4!b>VlvtfflHIGvp4z%{#6PH|g^j$*^w22LZg8y%n&TRS z2cAb`jTMD)CP^mwpk!Cn)-?pY%GJx1pqWuWJ+zwmyad+>A48>+_3`Q}-4uhY?64vF zB_f3F6Y}R?p0T3y)8z-tb_lsGTa^>`cs6yfdjb}toz;vZZL2Lu&&P8JQ zc0d6K_D@7n$vTm&zVlKHLaJ$@c}4zci)F~9KKB*8`BEY))=TAwASnu(2^D3fYzdR6 z>wl%SCn>5^HI^G22mv(zBQK$eM=1%4UT1pC;xhI%1u?iyCOmz z;vx8C)M}GoCbVApd20QVB0~{^S~1BfRIQ&f(=8^@KRQ%RW`yb_>ya`_sYjlz3@ETM zRh`h*A%_y;T{RGYV^?KMYsIZ1kQaz}M#{c6fJ?xaLYB&?v;lvOD=me;MWp-mdas~}VAUR}Hr zS}B^ zTvuIETO|&1>&n;A0zB=1bir(*s-f1uARbN_6X~VZ?lH^KjEW@8QzLFEmw!_vU3GOX zypeMfkBiT}vaZ};nJQuOFK%G;v0;-yA^6;6zfg;2%(Y38RXPKuX}5%*>#nP9C@*b* z)tsxe6mwFc9K0D~3rCedy4W}>`613)v=)D4t5??qsCT>kl>h_y(pv(e0&4oKG&tfZ58+nUD7dm8jND)(-$nYtYuN*!Fal;NVg5<(j())8N z%#jFw0hO0u9)^5COqiMy#15OuvRs%V4PuX~CQ{x*7ugwykFbIpDIgLHA6*4^G$nzN zRW^2URTR6(g4;U7nWLGP%*yc}7cEHVMd#+_ggGyIc5aSzT(sbfMn5I@Sgwq~a-3NU z-E{r_%a8tUW=uoB>7Sl{XmJblgR#lD+eNPE4EfhSK_Us{2bb(N;y2x*K45V%Z3V^; zeiaulTey6g?D8XyWD_saM=H0)^T_F$N8(8Ti;GJt8)zFGCl(hkS#sUC{SvaCZmUEq z;_>rK1pX>6F0C%Bs;mj8Z;KhqbEO}c&lsHR@RguehZY6{o^H94<`;o zpANsfkzRvD3y3j}BxF()qL48-vk&eB+=Gyh1$Iw@8|4&(-$l6TB0chrGL{ON7-w>6 zJxhCZ#c$)J(Kkhu-7>PT?jyPeZm5lax941n0zO+ayHtoR& zAAjtNKi=_!KkU5fZ)-mO^U14XuJ$ZJ+*1+B8<7by+Eg)p=Rn@rl(sp)U%%L3&C0t^ z(`r6{oN023{_YZwb)mN4zLGu3`l0tufw4GX)>KoJP_{uoaq8Aq{5#ybr6YdAlJ-q8 zt*uL}+4XvFk=C1_=}NP=-(_2P-Np-rBvV%!Yl&YDzgMFGIuY;0<`SRh2bz+PX>4t7XWP1TqsL}kXKGuM-j?HO zTU%&c>usy+F!m(B+napQle{-IX`e=b_hYVjxCD|G8k##^0jbzR1uq}_<{mL$phq12>9k-T@cHRKxCrW@-j zbU#Qpu4`;tSD~x-wB=N^xxK~)whzg7rR>!RhlY^Alq0E0gPIgX>2+UZ)_1h6N49hs z*PGgIU5;#l661Pba;$CZZN_?Nu4q|TXhaYw!DeJ~%IjN_hLOFRln*r~W247NS!!yV z%S=efy4u|9WWd(vJ5#btk-hX z7I$L6Fe1bqwOKx}#X;LK7Wa|Wa)fm`a=ZKHb?WRp;n$Ja?Z|r=6i4C#N8Tpg{1;m0 z?d+YuRhKuQo5S493boZ8mcKeJ&;||F1C}9s+^}ECuD-cDo966y%ML9j+< zMc#huwj8y`A$v!P;_SISx_QWoo%y+kGjBA8*&~g+7K{9c}R!bdzc;gNaSgN`WU)n5R zGV5o^3ajNMnh!Q#JvG_`M!F-hO&fa-1wB!v?Cd_>Sq5E>6$53MO%sRj>-Xm5R zecsl-d95udJJf{vt&TY;#7!tlR1%*T=CXWhwS0u&Slq|RG<)1pAHh@_HP|{Jg+&9JLzEZEcBIb|*S4?<0TgmTE6W<6~Q#Y9_QI z)rlz6R^7ZFRM9>Zic}Nqai11Zr8;4c8?sscB3AE@ks_Pr)(0ovkvrnFLVCqCJm+wZun z2aN*1DNhnx(K=e@4{G2=P|Aq z|5p!M>hVMn>CcFiDXB{=uQ_M@zVCyNYj-70|K0AR_3KmaA3E?Wcixh}Z+!Lrlk=wc zJ+ZHMOQlz9&Ns4Xjr~emY0>sLW8|P-~HZJ?YNU+R%<8bt@0Jb!A8S$h}x~wZ- z@=IfU``Vq&-7PE8{iu+a0;BeVYozhf00d zt!AlnL{pq)Etv~ASvx%)=q*Eo&0 zRTwX=K+zd5^|YZp-A+8NjB8GfgW9#8wqiW_67cA4Ti4YzgZlSD%V+c?(3SLW!NVzO zpZNcfD+%L+Jx$4bU52+isGE~IyS!a}xoF{Hk9-LN{i=EHe%;*eKJ&|!ZSLi5b?%l1 zJm8&e4GC=x-nPlFUlaFNh6ZNA6X-A+m|(%PWR{Sge5jWmt8e0Y-;{D_FzLup@`sv~ zl?hj)-mThRs z-Pbp_+c6&*^40EnM;vq8;q2S=Vl-0PwifZh0}?}ruBMv~<3WPvif-4I*866D%8{XS z4-6&0iwG1>p4;6re`iZ#YhUgru?ySPOAn9zx_SEwcixK8kJEUoICPl&-!EB?JL5hY zlpcrF^?Y7rsj*rP+r-D@py7i-%aJ0>DO=im$6YkaIWTnYaSX6hllNe(mYO`AdfrOm z5%fy)cj@vvTk`fTe*vYB#9~OXzOZdAdJ?uykjC0|DTRWg-8?y}E~`*TYudDV^BW7i z*7UM@nOOz*cBKBSU0AKT`@U~q|IiB>cFlq-h3lkQrL|bpgY_LuhcF3MQ(BSH0P~ab zhK%wWoJ3M8&c)GsZU)Y_SY20>fyq5Gq*ftiU}8>g)C?Rv3fIi6yqU9XIL@4y*H-1x?=>v9RYNab<>+=DzzMoefx30NU%^dz zvIIBjUXGhCLJF7n(d_s5N$+@vaZkscf?K@E6Td`x{EhdO^6R& zE08Dafyk3zQ~vXn-@w@u-=d*9*Eh`;hK=1e;*K44wzTb0ofkY4s4gX~SSlx&usSC- za~zYDlbzwBZXlzwwmy%VzCy_*zLTKwOL;K#%u;!MIgswli7;$mR)pirc@c&$Wkwig zaBhSVld>aVv5!_Or7NSfG?QgusvbGQ)N+Sql*3vtqqgK`mXT3iS6=06M2}2sD|FC9 zJ+6S8I?6O8C9QAQCU`2UXwu+vz4V86l_%n4!MGGO>G9wda5bIB11;C z3%1y@VpmBeD|6Lh*2!Ips9c4w5%@1@KqWSHKM}t;T}Ek?r;wobLRUEd=)%P-9A6lP zpFRqI2KZ>28D1couffC7$A>xqwsKgbh&fcOgc z-^q=!syu&pH{5aXBd4F9ndFwQ?c6P=k66SPxWLWaE$8oI?&kT(UWQwtF6_bW!EGUU zB|@HA54RE_^L-6AoPw~646=rxZQG&!g}BlY)H|`NVroA#FbJgIm6A9V`|?wP5wWgCvOazCzsvyjHH`hf9U#0 z=gGV9Fc#~{KR8eB0OV<&+>3c~>J$Fy^W^%Vd2-nuJWmcfq7g7p-i`><801Xm$!|cPbatNn z>^%9|d2*T^@lT_johLs#PmYC^v-9Lw20A-W{?DB!eDX}s!xI{zh=VhaC1L4DO~Eo3o%@_}D&32z^piyfc)*_r zUKz6+&D-lrW=XoGq2e58;lgv{wE7;f1>E@Ln`T0y{;nE~a>|;-_q4NfO9VdKP|;{1=7Bj*23eah;`v%;!79q>81D)o^8*tM*vP}Oem;WJXO8MtOr}yZcxYg#!*MN>W z@}J{1G<1%fHbu%4O^VrN={tkO^vyDyvkfE1JCaH-9W zQ*7iM2%VNDt}hG1u;n~ZXNQ{?C(XgRpsqp6hA^|@m}osaFOHh+o9_-g@6D&X!t&*L zVLqQ5FjqzT1^S0896w!RhvomH^Wx$>ING>;iSyowosAQQfXaDsao!t^U7p{2llThv zDRN_ED$m!o!L6JZr*tUi#kX>|oIZ+*a$bBDcgy*EId}7XV!d!HqOUeDuGSV*X0??~ zH4NL=R>Se-#u|nnc1oOw{V$ji$9%Xv!7a{mkG5|-GbcC8CQ7Q!hs);2@`0@3=f&xH z@1$BT;KoJ!#}5P)lt}jd8^lWuT^`;tWH&t*=_Y-2jdfnUpFH6reWa4UVNDaREM#6> z`~(DX#4C6|x~xa8e}&Pqq&kkaAN>H2mzP)g<)iA8mqO(D1@3Qe)R5yf8A%; z{F%BGoEmhn%^H(u z>3g~r21B?Yqd28<8(JAb*x4pRV8jRqb`#k#C!&ef_NSn?Cl&$*VNTGwt@T zTiE6k$frB(?5PqhTXqb2cNBSdnCIKJ82f1rn|Sy8X>7X|HUUR;6UDeSAU+iZY;!x} zBZXUlaPzlAw?CXw%Ib5J)fWiwvwvAxor}CaM~v^V?wl*NvG)5g7t`^DmTeZxjhBPJ z%qB%BGpWpnb(2IrO8=j$l%s0h`2VSFhp%@(oqp=4pWeYtfBC1Ev4h&MSCPS%K1IsrcQ>Fame~Lo8>k~eFL>+3hNZ& zEA|zV-Am`&8n*KQW7&hKUvhg*V4ev`PrO8v!aR)jBJ}}MTEey6L4@=5Z8stBzKcA( z5qWt7@^m@c?)BThaYSmnnjM{X_K5@SpW13A)89QUpS>}xW2fIkULWS^zMrvY@eYfw z*E0dXcj6uM)^_bre?U4-|)rc8%*lg0Kn1??8LLYu|%MVb4{-(R-Fx_GH= zie)azsMU$Hbzt;5!1#K$2hTM%d$7Sf);}%Uf${ZiS)PTFXIhVBHzv!Y0F{^0j;u9Z zny)yM_3;-_xyQ6Vo*>zg?eW=>l|-;3D^c2!z0{8g-zlKc1GA>KOLk;wWJi|9?Z`I4 zj%?2o>z>{u&3#rju3qo7_atf3i>`jKNiaVuL^lh=*tG6gYTepdLaynWaUO@R@~(8( zryESSO@Dvwl#+r3t@rW6cRW1q=e2Xbc`T~S6rX#t)8#SUwYS4M?%Nv@gh#zQl63j; z3-Sl9?QF8OH>aDLy-(_+s*fg^9u*ADzj@TG&yUw%ZPovvJi*kw`%!aizI7a&_ne=; zZAL-CK;Grn&Z()Mspqd2gmD}7+Wtpq>_)b2v+yHv3Ab(QV6mpNR&8gk+9FuB*-aX^ zA+bH5z3yzu7kacsiS1K0uRC?F^q$F8&Ur>+D^2u&(NHjyJ#Yu&tXcEc$hWmX8N5)vy|X zofWgfis1wdjYQLi!!WMnmRGR1@ta+V7Dw>j1v{uFvhxWx*C8vovu14nG&8o+JkL09 zj@7JvxYuw)<=;`-cd)7dMk`s-z!iqFwn$c~J;`Kbpl;IXZd*%sr)~A_wmP9LX8^{! zZEL$=S!!&oXjubm1ACCUESVZ;QU+6#4-F+94)64?DF z7}qz#u2pyIHe)?ZRbjgeV_F2kMwl?13Im*^y-g_xoiN-@@%U`N+`Duh=;>&KO)OcN z!t}x01{+!!?mA<4!*Uqbs?MY%spkzgrM!#ZJ!JO_yPku+DI*>@llKlKA0nBQ0R#aG zOk1~*$tx^fPilk@$=-qtj#LeX+tFqw#L(zgHo`P)$ux? ziLdDWY<2plRVT}5RAF=j2G4oy4pwMCk2Q4nZqqt7!+5@or{~Bor5aVKYnqJ5jqPdC z=`nTWB;Cj!&bMN2n(Qj^!owzRvM03f?y@BnW~CNQk8kR>z1Zsgp;Q05F7w6KsqNDq z@3JnL*lO>x6+JLJf7iySJ?GDRvvp{~#;D!rFA-+u@1CxIM?duD^!SHtg*3(WFR{zK zBF;4aKKsT^@ll%Wg06@E+PnNGZGZUlpJA1G`#o)+K{I|zy>wfd@ z?HgWoeY$p&<-gu=O*a31<@=?xmcKUp-Bis&+tyw_g{dEB+j`N#L1|`IqNRIMA4qaW zTm4gec8z)avfdJpICqCE!xil;9A|M_H5!_6G>N46o{s2g4@a3inAo+86ffJjY-Xxq zl9gf7&?Aya)!?Jg2dR2%iYr*v-uW}enV4^mm{d(GFks>s;rmq$Y<d_`FefB$v-5D^c^$V%kc z_iu^ai=WVCClaIFxNxJP96u4HKqQ>+;nThWZ1h9mc9wE znOo|o&C<7T(oauM%gK2@=b`5=eR|GwS?A7ruKSr^Uu}86X=>%8OI@YU+)}?d?c(~M zC7!?Sf46O~17$o>?+|T!u{6b&ZDR3Gdw#r-9~Ez!oCXT!K*s;xZg|W#amb*X+`4mG~i@IK$yJtNKVlD66DJ=Htmi2Znb(^DQHA^nbSeVPH2 zCeEHyO+E8oZ*O`7)CIS@&1r^>pxRDrhBhT6Sxn9OZy8OqV-u~$h1jEXIao!f^9yp* z414j@eY$t!ifhvDNl1!?;JE0RHV9s^NEY0ntzVF4SOh_9Q^6nZNl1XY-UZQjXCE4v z@3g%t=zF_0Lksn`D}_x72{ESTrU}uVStZUHg2`}2`m$GfOt;uFuQV{1z}PuR^F;kZ zF;DQkV$1dyHd!-u_LuNT>5Gj{H9TW(vTjPS79p6o4To6o4U5c42xYLR<${DME3Y;k zNvLTw*}BSwjqDMfc4KUNy5PA%Tap1?E`hP{0OdTVB~gE#uZuU0cO*Bl_=chZjhOpk z^8Udpp7$@t-G{t~ak`ZEUuh=#^WNJd=l%Ys0sHTH-rwQN`>!>h@Vq~2EL^x^*^A@u zy;mxWNzqqM+?0?WhunU``0nF3loj#3pB??$|9Rxa7suVt1|H-D)S^N$9ca`}jLHhz!>x(;6OxRfI$3 zq~F8_igf9GoFhFEK} zbL83HGP`3idtcU-f_a&_z^Unr-LFAY-D5RhYMPR8Xn#+GqsN50d5*PbhUO_$9GAe@ zDn)oS{t7K)BbBjvwO(7aKmTfD8f4Vkq_36MYlIT$#%-3 zYuV*_b9_r5mG#opA2qvlTCGmYMXs1MZF*vkFf~h%tHX7!n|JcymNnhXt3%y}3e*9y zI#|a&Vdm8J8&)OO6t%>dS59sh5^AjPGW;^6CS=;D;u$d8tIJ7f$v&_$s(rj}p*G(( zT+|f1Ux?jnxAZ$vNrn@aHq@fV(Zl2Dq}?9h&plq>&z>H!Qn&=h{_#4o z{U53m)ThYjPtc3XvUsbwFO=dE$}@!Lp=Y4|r0V`mJ|6Wga(FuYUMBTt^ix$vjuRfC zI3CHiu)rHGj7aegzt0#woG;wa^!no+!rSlXDbu7D-&+Nw8R-+x=g{0AwaxR0$2<~s ziaqJE9*j=E^?A?4Kg1OFzUrBDz+CakYo2qDncLrZ-81>5dD|Pm_atqMJ@Cc>PfBO( zsi)rY2#>}l+$VJ*;&~o_fnMy(by6JY9rZqRBzR?2-K$LP*(>HWV_lG=xsfMnLo8U7M5T^a5jpkEC7ouCt6PS+05kxlFw(1|b8-{$mpgXmg}8A)%H z4tb}LzZi6iPbTQf_?fe!O>c01_QmPilP{|7-w(TEqS zm=quGrt@ZQM!uoV&Z9gn#_{CJ6IqIbw_eI;5&KRX7SBzns$5x4=l##bK_PVwGu^hz zT)z1|=mRpGT3aKEyH+<;6w8}B#S`uQhr81e>XD?S&mgIX!oPIACwpuMM+Im7B~k;GEMHS|k4ec~)c~dM8>)A8vPbpy zDEC?con2%vs=b};B{=e;Ft28+yuj3{M=~J9h;=r&FOs9>>+)oRdO))Gh+&AaktOA> zHL~6SFQY4$oB9}(`WpOLWaW-;46-WLUm8jvkIqj&_a$N5*jw;ozsC zhohIHhoh6Douj}JAo|nm>vhL^u>2(9f z{l)`Ey>3rbf7HGxqxMwHS223s)|hQEPXha6_r(s-JQrPuP>+=7XTC>nq*b<$d^^ZJ zKyK8b18ARg-GSdq_g>=TmhBha#8q+fnc+|BjN z{W4f0U+%{TxV)R^&u!e@$lc4hyNkP@<@)4)ayHkui}Szc@?P$yc0%!y`|X4952x>X z5b;;KTZ8z=gWUWWBA@^HLH<8Lekt`)J}KR`LHzrJ+)oF&%EVus!;ySy_{I-+p}Xkr#B$(t5&<} z@OjSBb4Q-;kYC$J@pFdaVlfBL42%*)SaG%N9PK0U(qxJ+MBl83c!qJd_+Ra8WB%?b z=U-6Ba>sne=RIW2&dwF+QakUVF}PCt4txmyULZY&o#>;PAjO2%|013DATG>6#zTJS zxtjCeVL6^3bdf$%>A@f|lL&g|A&@UR|DdM6L3Toa;P(e*J+#h5*8zYYNK0*yM}E(3_jVQ6K_zbg{)??^c%L}0dzXc zA@F7XG2U9ZNmNf$%Z-Td;x`j@q7Vtr}^#L#q$M% zXi}K`>=kT)%{B@IfQXHqD{KfPJ)Rpgs zoH>$;GY9Cb1GTymxt{#<&n#fvUY+UG?bX>C*q`4dNNe^5XYd`<-{C>_@3KG7LE%KS zKR+-g`*TyX@VGhZ>W*t-FW=Dp<>M!cf8@E--gJ5KWJ8Cy+o~&! z&wj8}Xm3t1UG%EWs(++jpMT*5ZTixsM(t8(q2M{B*O))G@Qn}k5)u$htFx~o);F{Q6)$FdEc-NH))37e~@32MxTw#ko^z!gX zLh^&XgSBfe%V~M*dnYcz8L>hD=wXdiEWSDHh> zXEb4qer!;hHj-#CMxT@tVvO$GQW9i@eXZqQoxTT26>v+&(CfP61x)zxi|n}{Yn@`3 zCMcv?3>`QGujfB)z*`(9FFYcN zth9?Z#M&f9@C*h*d?O~&DJk-WsQqzvkEBS78!YJ`m{X7NJn%!4A=oC|({a}wZ`yTC zfFfVSuAMyJVr7VgM--wEhldXb<-_bNomPXL7DM?=4W;pd%mkglXs*c@v9~%WcWQ#P zeSVR7Hw!Y9e_`As!D0vQUJ7lrm07$z+KvN4(SiSiWYSh?hM6F;*^WPJvwikE6KB6O zA$^|tU;CX2T~70W;a$`2j(Y_2LDTMTz#+3^Li#N8-90eVcEC*AiVrd`h28euu-neP zJj>zfFLX9%m5^0-M1x7l%o_jajt6!xX-zcWkiKt0 zykk-HtnqGJ*%sTxRHGv&Iyt2^otxdAANLdQt1ZG}ZihSE1Z(1tyEWt6d)cN0!E9>Q z{LI*L?S(5+?%Gl5@#IfV_;Jfq)8btRJl1B-@OeWO6<%()J2m?Hfj{-W^PFtV>WXS@U-YRPUtX6NRSnFG3gvHJ)2I%D5!zUp%Gy<{kB z{?d5@W{?G?q8TJvwq}m#?#*m*=}K<%lTNk#GOuO4j_f8)x^ImfbMm+>Z-3pn%Vp^y zW5-q@Ax9YQF`JwZ+GW$$bM`ZycjL}^Tk!oHK#XiDFmJrzoaeHAvaj1=S4l>Xf7B-AnXIVomDr?YO6)&6s~5H|l(+<$~c)g(ZLB2KC<`)aMP% zt+MOOY_JX&&j1+d?QmWBP}}ahDMHnChL?^xXGASTp0+yKmzU4`@suiF?>cr*YFOKt zTO(DNPE?rhw znSbH1CgqUE82zUin#_UB_Ljjoot7VEP!i*|@itcyQ)Bo2tcAtCXhB~RQ{}`@q^7Ap zrZ~~(?Uq5GK=nwqSP%bUJ6rp|!_L+m-X?X^zsg?qCD_*vE-3Iy-;<}dBiXC|*;HYF z#A7-h)#dz^C;GmaT^+ynn7uIv+`sWyei?JB=y^y=-5}>Mo8;-b9x~ZLk|CQy*>;a?1!*lh7dOeu zws>1XC!5bA-1H76(x>5D@Su}zVL5J#g8mBVWGhO~9`Yya83Y|mo$OBB7jZgmc%*?b z`F{pCt#8WuCxcG$?7^*!=eI#8JtuH0^)!M$1GHph6!A$9>E8-EmR4CI=){-lZ*V&8 zvsTjo4m#=ef_|YwJ{=iG@p%PwWqfV|o#ej?lHUkAy`PBt=eQoSfqf8k0dCsQN$b9H zddc=S74B<5C%#PoBj{;x*MmM)LH`o;3*deL^yvzEDk==gJr6qRll3@29}o8-&?#Or zo%Zumxzav1szV|j8Bz&4{=^GGiFEE{WP?fHK|)>q7<)=XZ7@T&LlldfNrE?^1e*AS zSYnpe)|D4m$U7_KZ8g#!qCl@|hLDltAZrUThYaH_cw>ulb53M0V~~`0h>bziw?}I% zva*HD7-XfLT4N9l-t0F9FVg<3pbwaHe?hx*cs*%s;B3{6Rk8v;#J zRl^Z?i1C1Yn~&72UB+hd7g9|EO#VW+K{kIOeDx+Zs^wo`qYAd`Q*T!CRw{8Xzc~8rPVF<<>P8VX1kIMKZX3jm3}Dz`~iJg==E6X4Se+ zZ7iZdWGm00Ru)l{WbPT<&ZLSQWLm2*EBjBgCwmyrTZ|VlItjdpPFDqP{0!mi@m!~? z2TY9DLil?yE~Bdqx0?TS?n9b>AkHSqn8w}MqeSD|3^Nep z<&0CvXTl>K$^M7jJsfuek-tm2C7i#N(>s9_F1`aqtjI05zhA;Xx#jkH zJ?G2qdmZOXsbTC5&X?OK$&r7#J>aM4mfOz^&X?Qk-#K4ypD%+?e&lNjLA6QuvEApIMH+&JznAUxl;@koP%;D@cxQ@CfQPau+3 zRjZXS!zMoZ@#ziwF!o7A3RxcPj7d0*4M~`Y`o>0M(tQSoA7R3i#x(zAqYl;F{a4y; zgh^cRi}0B8GnmKdGqdo0TBiIG7e$d~)C$gECv**>JEon`@zR&Lw)(!rwKT$)xRxrv#Pwo7 zqJ5_zjvTQQx={QQ*ZouRC9eCY@-K1Sg)eb!U1D8QuP>a#qU-hEqUQWodzAT+JgqH# zVb;oorD<%TbK{MZyC$DBXqO5a@e5cFq9hWR^Dkg|@YSMpyKXldKKmW4v){pr@Et5? z)^2JfaUOkzJ;8beAE2^Y-ov-41`H>ymJfO?)i%pekL9>6&Xd=w!&coq)|%Jv$ldA4 z+o_rNf@97u-Tcm$c?=(*`s;uJ-?AEVT3D~;s4ecqfMG<4J8Gk^WI@|87Wa|Wa>V~- ztex=dNbGjxJ?zNsb|fBf93&fi`HU9l?*Ujzho5zk>DZ)o3?`J=Y^-udOR*A_o>ww*=$A{CL zkDa1w(@3VH^I7pQ>te3%;*3vE9ku9ie4dKFUxg2G<+kNi&?loB7(SHs;g%#;l7i1Z zz2r(h$WovLDS8Q?t-{x;>`5Q?(r2iSY>7RVnv5XWJZ4&NGOo*QtHYIw&OlRr$rNo}|60NyA%Gj^Jxpn&mBSHVwids|&v)S)T5GzE z^Wb#1)iq)Tx@C5kvB6}_!;gWsTPut?%XL3UF#dqGuSZrOdwFICfA{NAe0nPBpfly& zUIZGuuPOOmgzo$9lvC&Wib`1gEQAD2ziTs=)n%m?9|y(;J)Cp?tWjRb;1Xa61y{2yI}~~`LvxzPC>g8uUJ^5-C)xe zS>m6|OR#rXgkM$9{o~?$&!0#7&VEtm>=$MJ9bc58(ft40UzE8st69iTGrf}4++j;I zEuPifkvq%0*o%#cT5L=-V`E|gHYQ$4ACy@%t8Xyr6|-h)T2s{C_IqCYZep-d*LD_o?2On(eI?z` z;-=@;65OPFIc~ZL(cz0bQ^-yGfataI_qb^%j@0M-`5?(B4X|PSrWb3Hp|@c1DLD-% zoZ~lMjK!OD$#j|-#*4DJqlNe~{d~|7Wp){EdJf3+Owh3kz!u}CxDcIouUrW_O$e0W zrtoF??}45QcLQ#L(@FjgF5d~7QvN>B=}GiBZrVj8>wgq<$}74kZK8g9-N!|{PO5>( zTRMD=;ppx<#pF?Oz$wUdPPaT8suXh9RaRFvRIVvk5EVa*1778o3~BOANeK`w4&_TT zm_gefM&Bxcm|vm@MzIZm(j+EQUQQKHBbQSdK=dUufT~a%n9u+zK1~>2SVcfeYw!y6 zl42?&Dm&%%pS5ypl9EmxLBPf7+^mI<3l$R5I8ADuAcy#;eOGi*E5Q}Q7esP+J{qTZ zg^OQ0xQIiB07MJTpztu4mO;G=8tD>>A8@``LW75+lcSxZz!5<52BX$WDp(X8%Jn!W zXtW+TgP6E<#8zw8cje?o3NR^<7}+u){NQO?J2b2mV| zF2#T1%jL9+yXAcQA$QB=1W{350Mhj~ZlcK-^}0%Tdyv~Vn=dwMsfh*B)cTu13Arl> zq>5bztCHGcKueceZGd$61F@t}AIRM&^oe_g_C@Ju9ySUt#`!fTagNRjod)OWupQ_}I!qe-X}Y(yB%dnQYd&ca&wr85EgHnxF?6=fdpha- zp&>d0ho5N_k1$Rs+&#xMSK)k`U*No=Utoj7&I+wP?-he*sYw%c#c&JD!x_Gx^cdK( z^HSL-B{2KB5a-dPV{mz1ljM%ZxlI_w#YcZ|+kKUb*yg|BoSIt}vdzbJ(L07&L0$Y} z_-)rlz4{^iT%n1&yHXo<_mvuZ-i%51+*>r}E3TZxa!updC**GkGL$b`evZ_$k7|7R zAHxbsI- z)8nt*P_#|!{kb{%+M=Axt(_(5CTH3&&3muuxIX%^bWd|nR{FyHlGM&eS$mSHP_v;+ zpPK%NHer#+RMIxy+I*9^TDx6ycD1&xj-5R%YBwEmV{3Dd>9nY`tF`mC_T}wzogNA7^mNz3&oiYz?_akZ9RyoY-AIDOvMzIm-JSZT+) z{rpzP94xtS!ooY2^nG5K%krt!@==kcn#FyLRd;*bQ6bJV_l1_ZJ2i7V9l2dPJG|rY z1g!k`W4Ycj2ipO5Hs$p==CxFMV6FXCo|kC7sq z<>ZLv(*eVKMRCWR7HF=v#eIMv*r3La9R&S-d7ZlXJ9~3`9P`-_iyINQLJZ*q{QS5f zA@2Pm%Sr4+z%~ba+-Cx`#q~^SMV{yqpX|-;cU;zkEe!Zgd6L+Qy$mh$2Q_eFSHj#~ zBs0&8Ac%6=Cdb_F-YLUEIA2R zV7@20N;pS5*b=LEuvOhn6_VK2*t;gORaSj|hruhZ{L=dzR(_iW^F(b4)_-4Y?al3o zay&X?qQT{yZhFm@UvXEIV^;h`?W%$SlHDe*QS0VZw9xvwv#qY8rJ=EHUBB*95B^$W zU8rLNmi6N1jx~1UdZ)2r!0>_9Sm!aqrW*gN2QBpir#~Z7rlc;hyy2Yj`@Ro8uHE&W z%YQfU(MaRHmRE0n?s~ZHc!Rrg{@7SJ&W%Sa{yc~YE~9z-u1oN4il5Sa(V!>wt(4Y$ z=@pj93X|Y{g zIuK=8l5Ok3yMM0LI^pyM_dr$Ixr#$=C`xbZURACx=Q;~#PmMR~JyPKCj416$ywxg* zFVDUxJ#gpw8cmTD6#gShH(xaeQG$S7q*9c2?OrDZj)>wylpZ}d28qjsLz)^vaF1mr zZ4tHZ_;qm zm5mhG*%j-vE7oUMtQ#saN-*PFwAdjmDPL1wmG5>}l?$a+u9{T>=9}v)Yik5)c}hqZ zsTrBGY_^%UnOS)=XW1~V#?nlCvzy(91E%JJdxZ42OwA>LKmO;Or-N5b-^w$3JEo8D zt#>7l<{sr0Yw8d6@x%D1m-lyEZPCvF3Fi(Nm}K2sTkD=#y}G`^ zU01uRuDrh9Ppz!Sx@bdfUFG`nGCy^7O%VQj&ivzq zO}%$DO>D_rp5IVnHA=&e{WxD}Q^AJa zOBPH?UzXmm()yECdwL3SQqQzm?&hCZw0fK~5{1)88VujTVJGuTY_D2P`D-^`v3rp@ zdYZo1ThQX%Ggwq$HP6hpK6&$=o+5b7%1*fJ2Cd8cs8gHE3>UF%(;ypuz1#I}dwvtn zP+3-E#i=hbIQ8XaLrm-c$KKn(MOEeh<98mI8E_Z|L>=Y9i%($-Haw`1Sa$%8iV9sT z+H#peNG#M5EYY3@1_h1U(b$bzw?DL2=GR&(x3$*qHUnm)WMo!+i?0hl6tz}V)>>Qn ze}C@7aAz1E+;#W$ef{FRxP0b(&N-j+aL+yG+ZpnB$*BuahKeHdp+=J@^tXp2qE+J@Gfl&&851HtaIH=d)8F-TsFDlVddQDaC_|M$fDB7Jmpd% zi%?`?zS`W?mquBndN{3hta{S4=#;CwA^lfVQy-X^=^3XCsqN5N!ZaWaO_4=SX_?(n zfP_!zzq-lc=-K2Bb6bDYv!*KCnFV!6dyjg;uB{yZa!PMY;`c3L1Ai(t@ShC3x($FEzfPKFS5LlYTxiZ$fqJoLieWuF;9@YjVelO@33F#A@eRtuxh=r`RtQTln=o zq)8}?*{%*VcNz1LW8NaD(Yc}0lb~82wEUgc$G$OK+GXrkp@B+nH0LSWDyL6A@_=)` zJLt>C38z~RM_5(kn6m3TgMMg!VB*Q1$yNGePq=YkJ1g6|mxgrNv)$|WQ5KoZ_9+p_ zA{AMvt!jEN5r;273;=){6VsNqnbu0VSJ%I5uY)rj$!_HVr{o6Da{2nScgJtZTv|P z8!POMNpbn{td7A*NIIZaH0CvRyd7uSB$n^_xZcB7X^iI1FFly|zeaw~Gk zi3zVWMKgHTPX^b#^*ft+d$?0Y-S%bcq79dtbjgL*X;7QA*c1;1OMH=z8P_gPi@Z%J z(z9lr=2l@)dERV%JX}R-Id`KSI;+s~+;`ihw*J+XFQVd9K3dR9<)eKpwNO6SVt9o1 z5X#t|y`wU7W9D@=ZnGrK#nu#FAxKs_r=p=vxYO}^-Sm$S=S_R7)m2 zZW0qsan3-Oh{PR9&~Iv-mv!WpshS#PmDRr0V$J|!2|rz1D_zjsq(dttYZjymRo-UG zepPIv!oF!jL{_u(3H{uJ@uu9l95hPVWHwLLEQBQXca>k4qE2g2PwG=V z`iXf$YjSUJC|}T~HQ(h3+OO?&|IT6fDEKV9(_!32(RfElsQd8?XdNr9!Kt6@#~emI zE*BTgbNRT)5v9(>QY5&82#f?h1{x14?a@o&6o>DOpcIg1MNBI(R>N`=+-@xv|6=4YoA3<%z z$A|oQ@PX4{CV)?8o+LSQ!KeJDgHH%BDgL$KQ+?-wFRyPY_~fVa5IOZv4UqX#oMIA_j`Eu$1Kf@-16w z9~t1SzZ94FyH=!3MUJcpfEmo7g>0JM;I)I&=dS2ZG*+;^`#8f8Kgw=yDL|) zBIo<+Rgs4XdQt*)i1XCq6R=N6W%O(Q0w3)x{((bw3rV84U&xAyjzJGR+)oP)D1GVT zr$eCu#Q(wbF&-3kEuALNrO}|6ZxYp@nC}wLLJsD$#M7Xd zUlPgQF7o5;Lz91>=-&;BHEp5`l;qV3bZHSN5PR4s;+J{gkN z0ZQTR0$sWvl;rIdDV-lDd5yR!Kv*Z%gOa}%?M(g(P|CMdX!k@~-w;0=l;m;(T}pF3 z))k3#bMdF?hM%Zgq>UnVh}0@lPNb|zLHKl{W|sD#j-aE^$#O<>R`b0^t=g?=*6ab@ zquZ<7r^AblwoTg(%gQ@Kc82T@fzFm-S8zSOi_jAy$A^B0!tnZ9&=1Hx>gPXBezcv0 zSG(WOPx^8QAIeP;($iX$@SRe>eH3i+OHL<-OZ}cj0EH7JcLOf+i_aVLp6HjJ!*!w` zZOpqxqCDw2gO^V)Js01=Pdv#z2anu8!_Pk-5#{0HhJ%!x>Gg}x`T6(yrGL%O9}v1p z%NSueA2gWeHE*DN`tk|zpGc(X+MCipLjQa{XcPhG>Nm;AyuLPP{U$+SwjV;>h<}0j zdC^-Ic}2w#zcr*cs=pvf{fIc1$|Z?GBZS(@&EGEfH6iO;Ss%-(17>MHG>QLjMxQu; z9BxudGD~g<94<5^Tqqo_YpT%YB^<8gr}qc`JE;&nVjOOXIKD_YT+-i^L^1~G`4}39 zE6HJLV1<+HlMB9q|A)ij*2W2GPKinPiuE2SN#G2J!?la!AS(_cjnf1iZq7yLhr@Lt zK8GwZT=Va#9q`i_m^Tw+Bbc;rn}>@Wz5CNe<2&Xyo`Rg81E!I%hYWCMJWUm-LcpO# zo>QrT!wm)A%mD0M7%+gUVQ{$0k>hZY_dp!35;$BHE;X*8fp}b%;{5Trz*1gtJT7FO zHy#&hhQ;F|4v)t*3N|nQn5p9ZxT*C59yf6NcyYNuvG(akdnv@W>Q?n*bay(3!sT9v z{(LR)lh*(%s`g?<2gT*K5-v9g{a*tczazlq;-2;J*iYbcy_jJ?T&~C;8kf5e?^o|bxfS3mQ66B0TbZq7llX$*a!-i3T$H~Fzj<7)xBN0(F2W=%^k6tu2KZ;P zx%$IhStx5J%4`8vbw7`DroJ4w9=c)bfoEeX*_D;!i^(s;|pQsvESva$GKb2&C_K=Yz|=4fE)Tv>06gTy6>)Z%AD3{vmL=iW~*2 zP}Tlp$IQp8U!O4L^dsBPF*{B?44ns`@|IXzTTu0v!K}IsG3o>rEy8oxXhq`*IV9?w&ZPTVwneDPL9vB z6wCx3HzedxV`R_+8}qg(8_QTWDDt+5TK0|*t4T3sXUsxQw?WXPG>Xj~wdAUZeZMhg z6q`G$Ny!}6Yc!O(HMcj0ow%@?lt!_+quAVk0h`MzuEfh8z2p7g#OA(N_`D38`(9!4 zzZ;wTBEARWt(QZKU`5GebFUeI%{?>_n`;_?&3)U!zenSfB^-~?AYZcZ0^sn^_qql-t3-8UWz+w2TSJ3yh0O zH%4(?{DAs@8>9OGVRWkrqkHC7BU>UM44+J?sCw3r87W|NJ=L1)%w1-SfYH5AbNfL7 zqwBs(!ss@q8fV=u!0Gn%V|3FAqdQx7lIeZZUHn%8LYlu?gpgX^(~PMHMz__A(LJWW z?mZbsw}POo!01K;-x@7pbnQMEUFKrK=yIA59#y0`S=G9kB?3m*{&1Cm(d~MoQNZZB zmxjDAV00gpFuI?K7+p_5jBbU9(Y;HC(d`CC*Ck+d@9oFvD&k9T*Ia7c$f_!4RtOkf z$HP@TMz>GI=++0u=sJ8cy3b6^?2%)1A8m@fwI8D!_KSfSUH7}d=r)c2F6FdxmZMc{ z;LoH6evL4?du15iH#$Q8-0XwVbxRoCD#GYCdNI2EFBwLc<1xCmtuNl%98{)D7TOmW zU9ri5(G^+kJWIsriY@&5UJ;{v(hvxv`#&N^_oNJ?y8sy7Rso~iC&TFe*!;}IlZt6o z`tB#X1&l89%aCJ)(RGU$-Q>U+UFHEFjP4(AJzFEk=-$3*Ypo2UTQm@(%UlhN?q&(2 zdom%nO2X)--@mOv#OOA(7kV+eGhS#6eklL33yIPF!HdyVwGW5UwPIXK3BQdny6<=~ zx(&eSzUjs2mfXmm>Bs1ry%^n&ff(HeFGd$zKHjkvTktgYVcb(h5hz&5&ph@EIZikC zmm*Hrawb^!*8gYY9usi7?tPA%UcS_{Ma1bo^(kk2_D;g;-dNL}Cctj3 zO6Rn;rcMEy+|a@V1EZ}`d)Nq7VfuF|ky}y=?JU5v`6l(R-hM}6YY-zIbR(i3U~X=# z6OHUj>#X$<>eyOr)OQE~9REn6) zIjQ~SJ726WO5uamg+DM>mx?=3ZKa6Cr9i14NKh32y7qU3!D0wKVI){x%8zdDuy!)# zcb88vXm^kbB~KxsW&?EyKR}XSIixNj$@Fgup-&7JD&#uI{U3xa_5?B1+b?9r?8oZT zJSn+R+^*0P!q+kBE1CF7O==`iEP;3@#-mqLA4gaja)X7le5hcb8EY%y`<%!lqNfEH zoG52N_%tzmFx+ml7~TdMz>N+_&mW*iSl=MwMR>6$oGKYDM_o%(1-di=lyJL|poH7i zfldJZ9yt&mmGHZSQ|%P}?V_LXyM(W81SNUf1-f)CDCLtQ^0P&L1}MoTyLKdZ8Ysy% zihi}|C;TqS?F1#cM+LfcHz>)i75UX7|87u{YX>E{MW7@%PxN!3Bqu|lO9>}R;W|)~ z*Nr<(;avhrFPJA~YJTBSqBY!R0`TqcJw=1YS=p=Bv)!JHZ9q_sP zG;Ym);CA=x+H~!}?H<*3YP-PS6S6mCA8@ z_%;c*EBW6=yAWEA@L8MY<5UUFkVP*1SCFxwz1{UBV?(9+Kny z{Cg1~4}ZK-&g|J*%jlz$qxE3O@u7q1#2 zZkG~>=-dFaxftTNo*cB;A~;u?i{(uw2K~#pUGHoh5V7lbF9zavQw4pvJQ$Z9&OTpS z+T1xp%%O3+G8MXf7yVcD=-TNcE1ZPimHb-p=)$AVyOG-IJ1agM5`MQ4hZ*@S&J({Y z$+2UwCKoRiMDPyyKOBCygkCh^P6>o*5bG^^2aw_LyLohI6pj_^>i|Xz!zfdML!JCM zEI@MkIP`BiF3d-82$kv4btAqRTnyX%8ln$=s{#6Axv;dUkJhu?)H zI@THq4B-F_Bl45!(CybN+U@jY^f=uaHYM}S`Qj75x$(b&_fr6y2z;V*IBa6f*%9dr z{k?$aYjnP!(d7J}j3&NZgX22|++illVFB*2b!g0CmM`Y;Mc@H_+a>z!h;)G>9oo6x zt>K>O)-ul!uDJ)7q;vQ_NzW(GADN!db6F$96Xv6XoiCnn4xYdN6rL~<4KpO3u;D*~ zC(LWCdNNthS+3_{gD)QhY_OPz4X%8Ujej*SlDpy<$A!cPXS*6$^;VR55ncjzVLTYM zz&NVYa}+l?YJu_gQQRQ3a7x-pnI6OE9hy;{p5Eu;U)JeanWO90&tb1(rn!|J9!*iW zL!IxqO$8lSlS|o0X@;N7tZ*JzyCFdgGgr_df2u@w(uxka1<|iA@G7*Qmc%b_jFasP~v%1SG5@A-BDehHkRQBKYzR*eXgOf zfjGkvV+Hdw8wD9OjFJ^f&sJEc%zlR@vy~*<%daH<+g?6>5RuA*8AQU@ESigPH6^^T zF}JDX)wuXAf;PRKyQhfYm!~tU!c|33Vb{lI$JdIX7iZ;D75MyEP)RQ3t&VKAC>~%U zt;`)$;T2^Qc4w@hV~@ZqOD07CegY+(mXpD+CkeopMRUzpPpDB^1hh-zCoZdi7@YB} zZlT@<0F3+3tW63%9$^zeffqkG^G>CW#h8!0q;k;2!|Tuke8|eooX!2OFvAG-6w1<` z?W#=Pn0ZkR(V2vP2(rqpd*xYiau^;8;bXLbND&M93T7C{jDCep!qJZ(t}En zrcuwC7+48?9`&ktG%n+y0Loc1c`8B)Ve|EDQEOgNSCM{hbR<;erIM;V(jxfVhx3mF zdma=bF3=o(o}Y`?pg#S&@*dNg@_@hDtxe;Azxi)%h52qr@aur#+~Y7*3Kc_rNmt%R zQ0P75KQq#FN&6ghqjGVP;Cx)tW`NzR0^$5@7qUVeF6#qw2{u|)2BA*H{8J(Zfe~OEA)JgH@gU`YrqVTQP zQt;`s>rC+RX+(&hz%X}$Pw6e-Q~r{ihrq|DDP}47*t_(`-vvH>ZY>9&ZlKgMLH^9FSe7WvB+M^`-uY)hiC!K-hNGIMH@X7mtI2yn03OU5aFNjJzB=}{hKuXN-GDIYyw~P>%LmA7FHh!576-G&gPBBPfh7P6V0(NGw zPBWO;K&hl|Ge{cBY`BgiMG!XtQvilrU9{qkl?BiQ2{?`b8lvC+eTN@1_SV z6w}9m@B}0x*NzMLkpban5KefMHc-^Hl<)OX-#fbZI;&$)my&|9j+1@_IojeV0&~A@ZkzQh8WVk{1nnVfEA%m6WPg8CtLWE>{`W<{)Q_u0KiZymWVxN>Q9F~vPu?%}E4shLliaKD$o-f2 z`LhsF9`5i9Kj-Ja#?ODqFa2Qn3mQg;hO|(OA;Bv{1yW*Z796Sw{nOx3u>wO}2A>6l zd2{5b7Ama>UkNN!3iVsK4OM0l#3D^a{-5YH=9+21f^$$BILR;JTY?1ki1pLi#rPzT zM4Itp#p68&;9HiJuPs}#YPnbbk_GuoL=T80hu*u$^@-&Zd;=${f`Xy--Q6!HWJR3I z7>s#Cx#93K|0T*fB?|eO*p7qA91btzlJGKOJ&kw)q#{d-wuZztho2BRuJeRxXI-%q#kdh&!RMbaIH zDPO?Z_|s)~l-*gJJbQLhdPTXdwA_|#wy!Q-4@*F^8M#U*HR?mJwdbP}DhAWsh#(x1 zf~nRWUQ?}$hcMN;SZ=EI)i%^;Gb_|Bc}h+&TeMOA(3Bn3_;;eZ$rTxqyQOYS^^RQQ zl5%y({1<)RwQ&s{)_Hq8qb5_+ zt5vYDna*U-CyS+?p-rZ8Mx|X7Ra;0_HFuk6puOC9(q;I{XgJOr13hCjeC#%?G?Ss# z)8>9doYm=VS!sJ9Uy-p7rbt!u>zx@4ZqR2Pn$s{CYBew(0}O`ZPW6%HP{YT(Sx?+G zm^3}6*O`+hB1r6&=hFi zQ-L3Wqj(UqqS{;MHNdWGWqNZf*@yKSS1n}?$~4$NT}<{*bM$~z7!T4d4|Aw_hy*Pk zpk7HCr_WA`GtbbsaJg)C4>!Z8T*HnHv8B0+GUJTeZMkfHW&8~NL4?**Xb6QCQ)m-H zNyfjyBrn<;rMQUcl_FpbrAA9Y6_r1FM``dXlsed^8z`6(47a!f_!W99Pb%GT$>*w|P#Lt8}U^ zcy5(zZHoTN#&&apGNrXy|AxLbGc`qj^;=*pOlj?oeqFDaGPN@JVC@5MJp0BIpFXhr z!DrfEtxG&zx~jf)ePhm}JC}5Jo__z9BW(w}dKU&?j3Mi3yyMcF_n45f_?mSvjh%0A z$eO>mm5jJ|v{ro>eV{3{*Am;}iTN-trZ+C;m?vg@>Itjiqr9*lHtZynD+&h7n;n(f z_3<@!tM<-{nl(D@hInmRzI}UZ8qB)yaAH!gQpJ*-rr2HuZOy)gA)U6rwe6VO=WWLv zuA1M7={hUT)k1jK?YLL2uX^$fPw7Z*EZWm^K~|3e|3Hju{Y& zm$fCvyB#nZQ`-k5#k<;_9rrlKe5CE{xYrT(mDaTNKF3&xE`Lp}W5R>fM7$$-#UJns zTj+Kws}k4m@NY191%0Y%rbuwV2c>T%e*z_F0JR%ADV%qD1$-fSlJl~tar}Xq` zj>;~@F9)CEJ&p@oD_(vL`1Gv*5tjtVpz{A-l-~iqT>f5B{z>rV@;ks!0q-BUl5tVK z1nW?#h5Qon0An@i&38Qb1YNltd^&m~#m@$x@+$>jUe0{*F9H8P@F|@Xzebe*jGz2R zMftDz$!`On+UGR*^740sPvuwP{>aNe7M+Ja@6853M9i1kCl>q}@Lvx8bdgW>%?2OC z7*hm(m@Gb-y80RX<>1p8E0zB~@TpIdLlK1bp#s7Y45XOqrK+D!_huG8?)HDNE+{W9 zF5)*CWIX#Fg{3Q&Nt+n5fb!yHWyNa)1QZtEy1J}*)k=R!t5&aC=3_MxAIS?ypNW4& z@B^_|+LrmpTnWR|w&jA*f|a%kS@G;;D^{*py8@=D%huc1t}dX=sD88`W4Eo4S9|b} zm4l@?FBtI;#CC$*+Y~eaEcM-FN;J{WZq%& z8y3NWTY5>qxPGXLbgTK^BJDg8)3-0nLwq~4JVa{!0mAybvpl-DqYg)e%Y=G)e!^F+^+j zcfkT)kjy_sDvFw0Km#y8GWY-cNkMMJ)fJ{NUni})1`DSNk=$V6;(Rw~ILoIVJbnBy z;pSn&(}oG>h6&FR!!ciz8_+&W1irM891xyAO!zIsgjLEz(AjIz(y}DJN1^q#z_hqgCcm(U>qSYUQ|}zkx?M zA3FuY1yi`pPe;87_d|uEa7&n zBpmKK#3#ShKk%K6_e;-{RrE{!|4Y#?^|yCLe;Oz`!Y7kFjy!Nr<03yx9=Iy}Cco4l z-WL5*|Ed?uBRvlbkcQ&x_|(F}m;BOrpb^tc&xc!#FGd&auOm*p$moE4c)gDG^V6bR z9{zK9l5g^I`IkeUDEgj$yXgd0p7KU4_BIu z`Gt;8NdHR5hwXh^@Zm~p8m3g3+~iZRxMJ{$FJFuJ1Pn2E{xfL;}(!P%@Z(P|_we+nfZbRWgsaN-~@0kV2xg+3A7x49ON> z#kTVG5(q00{>q4Fn_-1VpFWh-${$>T?fu^<;(pAO22S!z_$zT98!`SW2V*)pl1Cyt zFp1I2KPE&65y=gQmy+bz>B|jV1;+ZJ+;DiQz2ZQBN)*y7)_X9S!{MbGsbR^9ZQFrK zo3A=1b8!q8TU3ZP9Yh$*eeqHp;&TY2$W%lJ{8Z%*O!|$GO&?V9aFL^rA9Rs?Iw$i_ z;id4+h;#>?El@$1jv6|3+%=37C(PtdO8 zD$Onwq27vbt792QgdTEFO(p#}6L$5e#v^>(t`o51cTzQ$j|crZyC|&!I4w%oJAwNa zE#aD};J&5na)s`13I(%-Y!v=*mtZIHn;WyAK3kCGV=wWPN)4GR$X4zu;F#wgXP70& zQPv*FM?-Ff>`1xY$8$~v?47DmPc?KHp{`kqt^Rc)IfZIw$ybnj26DfKJe)=1%iDwe zj;n$O)YYBIY^D1C>vdg#vSs65pq|ctyO7jIRG0r3?o}4Yd{Kz|gx(!NSi4@dZyfH` zag~nRHF6~P=myA`ivA(oBL(i!!29D?2z@b7-?AyCzBRDDE5&ax4yG zp)Rhij;U9KTAns?I?I3QbM&{p%4F)}dVkF4BgY(dPmz#XRGMRZi7ERIOi9XoGCp=G!jGRtENG=N@xh#?H ziKT3a3Sgh+!tbdEajvXO+XcN2Sy3HXX**QF%B2A*2I!m@A7uQH4eRM3Y*AmI0SKux zd4?|;pz8K!MPV1V+L_L%=K;qAtQHVbfJg1%(ME*Z!fvU`7qo@s9}WfD+MAWOw{-}h zmO1QWy8&RRlO3AxP>jBzKz|AVxYFDzegoGF`#QsheVu1ulEMICJJD=d$%H`&YIK4N z`t{y0qFEjUT<(kXA+Q zuDq!-HMI#c^z5lZK`gL|PAz-NKn_3p1^` zW~GhYvaH21?Vx&!aeQH>J2zfwi`x>sz?_<$g5ewT1!W+G1`{dmm9ymDJ}#e|1E&ONpZP`m!8WAd+L=}j?evZ_HRDwIrH}$zdvx_ zp`P`}X2&j8M9HCb&Cq(3IMu3`i zL(3jU!6KO61@M&#>WpHyYjg}|UykQkp#=*yNYX~s6!6E?WNVuPVBc%kGD|#&=7J``P&>tQKP0=}`_xD8K z8mX9Ho0V4GT9?UBk>w3*^a5P>jKh$k&m`mx=EPggL3}i46wtDO&DN>rw^!7ywQKLf zw3t(4w`(`pRY2a@*_w&%;fB*LLytLZl{xH0pP?_$kYd~)a|}~$)2infaLz zMmeR<6rZcBQoI!uTxNm<8!PBo8LM8vmzTaliRC>?pk}_zEp}&etyng7WR=ypqU&=u z5~_RNf?}U(Ry&GZgCaNIUAYZ*10ziB$@=V$DrTZslX{EM@~bSdCQ~)9CST3zmoP1k zV6ho$70dW-4k`A zEnE<*HiDB1&g(Uig#Y2&g+N9A`Bg5_p38~Z9A?_$8GFy+f0`yK^3n4!JxE=H&>~-LhKobCd9vP&tlOtoM!b$Cba7GsT#f> z_Ql5F>tM%>uZPLhp5USWQ8iu^k*s+mNoZ%c0ySELvfz7}0QzG-(Zm~9JG2jI8#>lI zLfqOm``wPv6WU(xK1AUif%?kv3xKFb>J!wDufqgNeJ&Rl&87Lc$PuNsauXBodeBJF z6`=Th%Y)sBFNM=@icfB%7>9mS!_&fz76DD*)BPqMeSaW6fxiAM%1#9jD*9DEkx>!n3`rFv1m z&w)=sUfM^aHkRZ|Ajx^)(>;**_{oFZ_JQJ_o}lMUwk1$hywPC8LcBsYFuJ73FtOsl3oNiX-##n?_P$rLM(GM{-@Dly99tmsW$4ytSYdkLGHUmnwvpngzNP zgb(iqMHU*jNE=1!5UEw9oJd)bg7E3oDsyU@T2-fTDe9rpr&?L7tb>Z5v&!$44yg9& zQgy3Ng6>uCQ@hn_)y|;ZLCvsx)f;p=h}1kYk05h7?uWkr6V6B4zx@hv2{yveBCi>l?e1+PpEeu3IxLN9pD4SkY=VpYI&r>^3#n3xfl+CQ9ve6m)%~ltmO8B z<#*W1ioB)mpLe7(dxPX_9WS##zE3s0;grZXgistQJc=Wk|L;X~oG+eZZfbfmKpt?` zkkS=}VndYL5@oYpd9khZLg6_YXmJZi;~Y83kFlD@YwvS3QhQN)Q4YzYpKVyA(>fM{ z97H5H9G*jx!(k94M|KH^a>L;{a%pi7cS<14-F%@$PXIC;o+C|cH>;SI^pRm$Vruac zLljPI3BfZR1miLs-pXY5q6k03f=iL9NN)IPjOoUU5Qhgp5T1kN)4LsA=j*;-y${#{ z1uz7#&vcjS=^t8|tskp`-@5$NhHY{z2jMU9eYGFUFenbWRIVe*-@p=$nDdIPHKlaLf{J%%I7~fjOY&`-0Dae;F5+@O# zWWm&R#Xokns@!ZbW* z^zL{*n1pZ95l4hcFbN8X_Ini&6%L_*s8Fte=s+7fz-E?VE&?6WhLj67q)hGMY-D@5 zBXcHWF{!64WDZ*O%9vtCUAe7{sWR)TxT`1XZH-Tw9IU>IyDnI>CBn|`O>sS08!@Ax zwt0Ekz0Q(aUATd}^hc{Avc+)k3grxC(AY&!Fc;fQZ5ONaf>pM1wPmK>VoH5qqg>47 z)H(j54vyb0U>RtQFp6au#WHwNDm#HyshQJIv(BvD06>SeW*v|eUNlFih-IiGEJGHL zUtsnqy0z}fOhkt^s&)!<)~d4U+|Mg+c#s~=$-1(fn)L#}gpejRYppeNO#H@CgA8vH z4S2}=K)W!p$KqnTDq{~?VwrUnBF@Eb);b8ELI9HrS529zW^DuZpa^Vor%qeuEgO$C zVPm>H(H{neY1nH3oI!QgH2@)^ttfFKIq)*Ruos+RKkSJ)SQ-63HyOn^HWUP=QH!co zIBM3~Ysw{QfVwmh?B&DC*cMy#yG^0p5P}-nq5(WP*%Z3JDYhLz5=-p+*4QJK$p;l~ zm7|e1(*SkZP~u$UsM)}@C}O*@Kh_l5(qoWgUa*1IQW^V+1=3<2vvq{onUn8a!_--B+T$%dLWU9S-cVPHGA}z%qf6JD=EM zQHBqDV%jSSM%39u8n3(LG2W5{Lr%sLcYrSj6FS@WQu2rwLeA5sRu zq2!}zhzo{>C<=z5DCW{mhgs=j#^kMJCn>v~q19i}prK+{vau>4q(UN@goD64Ifr7hxaj3QYnOJOLtIc3C)S#Chi0)-?Z$5wmk=kTVm!;x z4hAM>hH+?3i<_$6W)$>I1Zz3C47cmx_}wZVn7}ibZpEf0r@8sUVqMAe!pu9A!M7=t zR``S^e1#)!+%s&1ANO)!1%YsIOD0J>9Hx z2J9&rjcR9+zS_DsuGww(T>1v}oKsaK|o*-Xq{Fs8b0Qc_+dWG@J<(%<}S(SGJ8SSy;7)H(j@NlE4i z1S|}Vyj?J+G--DJ?r_yq*mEj5>S($(xVkcg({(W@oB{E&LZ2<(?@mK%!|c5cV#SU& z-ZlqqU}G630o1>(rZPc4=YmS|tmCp+ms^IT01cnwLbXLmdbF| z0#qfx4XO=KJ}%a#L#mA`^vPlsUv9dulAP!pKk?`r8S%-UPYL+g`{2I~&^I%lkN9_qa?-(*RPgv4YTvP|*Q+W=Ee20ur@;?yy^)f!i?*pI8y%QJZBb8H! z^#wlnF|XjF`bm7k9+1Bim$$xUnk$12i|KBpa+ECTJdee5p2DCTT$9L_ii}w@&dJ^6jRdzpi4PWWT|0A z3c~xwV=SuD_(a(xJi|Ci`&sO+l(fPD;KmC^bZ}juiJR}eQ zy`Mkc&wtp@f4iUGXU~zIejkQ+X!UaCPqU9f78*jlqpmkPalHxwe8(xDINlK{&~B|b z9?7%zwVop7?G-7H`mb6(8FcFvEs1qU(j~LS4OQAyWs~Nlnp0+{r4M$VJ}G%lig2Lb zZ~v9*Ft`!{X*-q)biUq7PdiJc5$APz2NBrb{~feZ2Vzs&abT1y@kuYu`kYgE4`3JEVe$et$CD{%)#Ru4V#3!tEJW zp0xch#4jkw&As6o;Wzz1IYsz=N@NvH7k>;whTGrmm?|a|??WCoI;qGzXL{GDVu%or zvJ=_{qpoa!H~wPbJU&IHwOj@KRMZ9xoGy%07<0Yn^=WRPi{wyTjIZbI==`_u8GQxz zB7OIAcRFLw3g_~b{dsQzd<@azw71F*f_Ap8A4|iFx58JX66^%TXMP%Iqa#^dH9o%(~UFdJ>K)@fpsQ)BAz`* zy8kEY!JzL@{RgEZx7~wV)9>W_;Pn`f=soOw_Q8+RbF7Tx$5(oP)K*U2YH3qnsWB#} zZ&Ot3rw8dK#;WfxbXW%^DKUi?sJdsbD!rvw{T`(k2Cw$E%b;@cFbYEXU?iP<#$$87EJ}IMNT$jH9NOv@QjQo!7S3 zbZB~qjTD>)?a0DW*7SB&v!(|}+F@(OZ1~a@)(1ra_)SOJH9c(Dr`E6vc)Ja!aORZa zg!LK?W%$t;cH)9$NmqLNWc!&*DR!k zxhGXqM~d3*f%1pT+`tErk_R$I1dBj>ob$UC@Z#w4yuB1BqY?d(IG5FBk#-0uh3Hjr zN2w{&a9TOA6{D|tOG;n$89wASQJn6h+`al1qFghW2&c81;s!$54@q8Y{xS3KnX z`;7rT+LHfR&D(!1_#*1ur1wsJ^Zf1`?myM{mHDpN-*~!L-+9>_=R3cI3W0gg9{RNS zrf0?<>iNj_O-6##^VidNmumj&r33S(Sq)Vd{U(~l8HR08S#xG<%kqTR4J>2f+7;#< z7i$v~N{)QIqiFAh9g**>o3(D&C)1%lfEtwJV_6N*3~*hwN2PYd&+MM>(T^`oPDbvjpre>V^WP!=O>}0xiBn;r+$IN8^k4_T$bmi~~zXj^|PFetqv7 zo*;&UESBd{Wp};N-L2$5H})6ro!eL26}&0q{`*y!p1xPu(tt=fD&Duhi@HUwT7in! z`KDn&@d`~vlZ=e_H50{)h*F2l#rMskN{B+a340(nNHj^p9>kjzjjIxR@Ck8L$HJ(N z1;eP0g%uY9f1sLM)v?*5Yw37^)gRNf^nqB-tuFOJed`o+ivCasEDvSF6j3Bh5f#D| z(c!J_Mm9O3p|OrPH1z(lwof__-qPOLa`?lA>D#qic5J?CBiSaJ{=n|`2UgWLD*sO# zAfi1_X>XdowN*!2-8xROXbuL(l<;F68#DjD$-x3g5Ty37i&RrhNogi*)lUzta+;F3 zNk+Bmnyad-uz?>9?u^jtW&7P$Y~aVH<^h?o47=kw9n3^*;M-W?+nSUYjn~zYMrNvJ z)7UC&M@1%d1DNAoD_9(IVVC2;OG>!aytb*s z6BoZl%!4rDajXTD@smJZ;r)vFPHh``!5{?6%oC zTWCL=@(kkh^we5NH$v{s0Sy6Jrcl^TK4BQ=QC2~}1Ih3yYwaZVHg8$YV-=dL2_Z4j z%2qVnc$Dd6XkDYT)gBEf1~3OMw_KNi10?|3u{mm5Yl0%F z(80m8Xp*tb4rK&m5cx|@NK%(E-)cT&Hd6U3QN|VKE5nNrZa{d7R+|E41#9&!?%-P_ zVbQ5=f_{qsbLF2x8&hO^Y37y_7iSmDs~n2U?rH6Ir_qS3g{QY1JF;?Wxa zdeDWSDa3@6!s$1~C-+;#p>VpAanTC|VKxqfPvcQBE|bV7%*jXKV|~QjgG-J%`3`)- zmi!8r0T;>9K~69VKL!5Z;fj;-e+E95hRk1Z$uTFH;8XuUiYpP9R35UlMQy7<#VH?2 zz61PA;5UL#>7@9706zx)%fP3)O7YvlCrryPz^68n_&wlL`c>e|^9@6TQ~7@jew-|R z68O|+`@omCTM_sdf&Ur!Gi34a2cP_rxJT1PKDG06;M0CoI{4Tc@s_^}d^7yZz^D32 z_0r=b|7`fTfuAblTSWc=KmMKIQ@roMr}9d2c7dM+f1*mrN8*0~KIOXPeEdl~o??=RrX+kYkabHP6iKBgRRzB|At%+D0`7wTVp`=ej|1$-(eId3@yFOTh^ zmjgTtU(N(ihW{9RN7AeLVHTbD9a$2&I{Co>FQOzKsZ(BJo1K*GyKO9nmoKxG+R9em zQMy*PYg$lfD=+pH8~{T!M4iN~>N4A^qSb;~t%AZkZXH?Wr1Qo@6;KRY2D4oSCFQo# za$B-_WYP!Iqf#MCv9B&&pOj*rJu+$hzWzu>`s1wzZ@-aeKC+lz!v`aa?rWl9WNCz> z*tqX?%#Va8M@_tEsqV}4}Gl3`QhOPLhEEhjaLti07sNSZ-Wmue!`{EMoKtzbtGg= zf!}yD!qn1$BSjBfO7RB!3^`JYVTvaX5K`=Ztp)zKO^Pv$Jo%_2B^g2}AAMx~b7Zm3 zL!fu$k;*wt)qIDZ5hn5-dq$W@y6gPtFv2wbqt6Hvcn6aa#z*U%ZxU$$8etCpBaram z1sZ}zC{Suge)%FUghcXF#GTfn?pRV|)#&SpPmb1(fx`Fkq0mb)NO(39krM@DmFeqp zh6&FV!`qMyOWgtGqxC+y!NR-5aGelsK>jC(2|qnd_?cnCzaJ)CjY^RltbF=m!Xt+X zj~*tR^j6{hGqD3S4%7__3`k-%DBd4R9Rgiy2gQ3uq7@XkB=;79&R+tG_rJspP>N4_ ztw5I=K}jy1K_IzjkqA0066t-8;_Vga(w(3rw*eG?x%C2_Uk6HZ*Md@f>`U-+slQP9 zs9%vh4wUj?h450sB~$(c)FQd0?+Smp^bddY`_R@Tw-c1)9u?@)y`XrXP22&>f>wi) z+#*nlXBFtud{Bx<-w5JB>AAqSmqf_q;~@>7f47jI#x2rDkvc?b6)7iDR-}wbyCDZZ zHExkMiqs)et4KMKvLXfH)2UU~q7t>r6wLw*t>{#ADYQz5vKr9n?aD^w4$wa38Rc1} zR#~rVAcb10eJZzCv6fcZrS67$Ek{swP%Ylv8D^~--yKjO$t}QrCET=x+gwHAGXE0t zqwh&L%op)n?!T78aY?w!rzl+J&!KSSEa4>M;3u55G#)4spZwDJk|g@~i3KFRSQIWj zpHF~Ke(8DApseJt72`iH#+RNac=>SY`JuBz6kmFt9~aY0veDV`8S|_Y^LP8julDoPfna(14Je1) zPe#b)eln^p_j{q&!z`5i=kbxI^Ia>AG?nkNY^15=tC^9e@h*Qxnm}5A@awpdChA|v zjWmUKAv@9p(zV}9e)iuz$2*1}xZ>a;n2-3H)3!v(5S%B|u{W(LEZt+?g0{mYQy-|i9A9&?K^o4iasf$^`NzsR{r7{X~?MNabL zv+zH4{(@J~fV3o!M7H4rE(eO0vV(}^a2^2`uve^FE;9VjUr2IRh~a1PeO&Iu;(A%b zoxkY8{6mh76R3?UID{Kczn+3V?!%oD2vZp^{uqP|cmASRlxG#wm!RD+#W8KzEFcQ! zQ|0Mk(EbRIT9KW<=tg`FT#8I0ixd($CFf(r4?KJ){>7Wv##ON7WZ?(ae&wI5#nwQGd~@ zg&n(PYC6_NOLzWk1o@{Z#q%BbEu14T@#!h72j!voCgAPA#&0xLB<0VlRL`&~B`yUn zDu-%dSwelwQfrcxMgPx~MbI~B!g-XhvzV>d3)@!pZ74t9$zH;f6|o(>`;_W0l;fBs z<8a=?gzN0(OuAHWp-#+JfX5b7y?8(L?H$J%3a>wf*;>fR!^yUvtW7RwwoZ|Ui*58! z7_(;r^6N$V@xjd2Noccw;M@tT<(@hItITJ(Xm*t?I&M{Wjq;h^d0e_Khzak-J@YM_ zOivS0 zTaqWXRm+&6+Df@qX_U9czuH#9JxtN~w$()3kMGb{-8BQ-s=LO5_REsBpK9p#^SQVG zeEZ$3Qhbq_@<@OCDHU74Q$_LZ*ZSSLCFpO9cRFtxa9+m-Ta$RcxBhTfzrDz_1(_HN zNWbI(uYO6oCv?edj=JFADm|MR+g!`wFBJ7y4jV5-xKGkF2pzaIixjL~T_8=!$+PD$ zQt+&0Oi4j$@hUcBK5MSH^;RY)IV&)iUlEk=s7hRV~gAY0g_R&bFxc;srb6H)q~7Wm>Sh>!NGIr|15~XnXVI_gXgQ zm9@;B&z?J?&Q(u(apUiw)os3_ATHv%o8l9)j?YY;(Xvf>wNk_U{mP$b2S0R4c4tcZ zIYrKEm&92vFGq-K~MeVff#}^)Q?Ff14iQ35GCfzJc_Lm$NGHq?d z!z|O2&bTfMGS@MRqv$bUW&eamVmbp568QOvK- zx)e(P>Y(~hHLqRewRLGTd}%a%3d@H~*yqsuha&}Sn1jrk?NPvXVp@ZWL-KYQKU8Gk zh)Eq8;S_NFIG2##Z+LS=Y6C|PNnEHy5)D0chqaBN%;n6FjLUIZCudZ+p;u3$@qGf!XAdXGta4^z7VO@ZbW8`J5hj`i_aGJtH2 zJ?0^MzwMP|pRm_!PT8tzQoEnG-S8W_;gf-Hnlh9TW@u{NSyRU7%F$wEz))3D0j;fC z*dJccz(8?VQz+^S1HVia%n~AB(%K4@t+47Wn*5E6Zu4gCpvHG1dHGO^WJm2MUnu*@ z4l}H5kKwdYu7z}hYFB8&2|@F)OJQZgS<*NApPUgs#ca}{!BM%7V3@Z<^NrVVu|4c# z&H$U7*bEwxaotA4*Bx|(5$21JS@e!=#r(A zc1*|-CUQ>vVmfKZ;iR2MQy4-=Jo9Kkxtuw?>G6;%w$q-kv}-KP%DiWpG$*U8N@X^O z>b{{UDo(?xbNIt~^brRr{7g32q zy6unopUuAa(4m4orKcx-?sBB)G_!(*P2;K*=FXhuoZk5`zPQmxH_t?7-j3PkEj?Fb z#g0Emx84!6INJ0Yqq$P}R%P6-XwG`snWEby6S8T^U;2_rf|380Wn`A)P}g@o6%PKh zm+&?3FwTB$RnHJkuu(%W%yyh$J084CsdVsO`j>`-Zb1_c1gSZ^bh13#uEANoSq*v} zeOu#r7D^TO>yle0^VvCgmU|-f?sm1cU^5&kWzp`oE@RXVMlS8D1qs1A2cij%q>XF1 zTC5yQ+{k6fA5Md zt^;Q;`si}zSy{rLK~Vcezne$0IN{*$(Gd_Yh^V`kKu zhnL>zte9`qub%UEQ~2UJrSqRz@Nw$Xi7(dv{I>f)d9L~jlyX#2@2H~QQANEM;-K7> zv#av7R&$jrf2!{F*;OvYq_kXU|sQwL3b--%4EhJIrI(Xf}_7PT*S#f8CO+cI87$@LSWz&uq`OZ@wPv3RnIU=CPGp-m`%Z zR!qAgUSB?~pg8EAZJVBliC~;NV}I~Ou3cq*aiyTDcUoR&Rk$h}C-`>$$TH4PKR#=< zchy#Ig?`+ersklS$#u_0@#=k5S4Qr&3QB)><>~f2?tl3*(_?cBt&#qe?uDIXqvk2D_*ku{ z2j#6+T)bqBRX7IcF*R15YLAFk#cWyLkkzDZIyYz9+p_Q_PpyZz)t;Z(*IBiKDQ2Ulx#OCZupvwt+l*t5*>G%+Ptn%$ln3UO zDet<<1czcySGV>K2Ih=IBBq(n{?^*PdQ;^qF_RClVIQ)p`{rHd^28psXnuUM`||`# za^7>>EiGZX>Gw44xMYGZqm+xcD2zuYT>4#ErMp$5j)=sEYvZh(Ak!SSoz*$QomIF; zXAj#93-tz^dSvy7D-G|uBPCx)lc9t6X(;T7$8g!|{oQt)dTilhKI05|w*7AM9pGa6 zxnOV2p;L$wn9urIDH=tgei;n2psF@F?AY`g4eX2(mFk)@vTIHampd${+t zH{$@P5$9DKkJMNvlv>8UeA)M&#I6>xxZiVQs89A~qE9kGx9r>)sbw~W>f&^cXTu(E z9P^yHlvBS#2UCTILN%+g#on5>M~QBhnk)9qhc9=v+MVg$RbZxFXYR5aUSe^3uZ@Hi za2O7+jP6v0&DFn5ygcwC_25nFQzf8-;HM(0FDs#~B~j=uil{Trgq==UnIBXsRnjW?CH0eBmN}XuP!x5?BzDL3SG2Wapg&6 z#y}@GB2+xFDGvm22HA#Xw^iq4oKG&F!(Tsey_K5#>gwE}9&U3&{_Vl2q z$Nc!@C1-#8O84rIHvQ72y|c~z*TbR5xvX0ArT$QH1*HNSY{?jhE;YT)X;@RI;z4C(kZSK`%?L)OWsb6n=@-Mfrea#9>P!PAc zApVm>LCUZwEl+kmY-VIL2*1ju)W<~Ce zk5ccaIf0hfH*1oNFD9xc>OS~Q(}W$RhumQ;FBbP{Z674>*hF&?IU6f%noEbO@%qEm z*M}xfWp?QAP%E2jJySGUF{?C%G-S=+LReuK}MX zegZR6{t~|leDZ&Z%Ud3l^JVZUJ%KmJOYu>jx4@@(EckNyAB*zmf-je^!doW!^T3zO zCom_Kr$inf^5=km5%`th&j6)zGOTb&llV{h@d-Q$ya?|ooR5!;o&lfQi+E}o{{`^r zz5pxYZBHuLpG7|2yM6erqWrnw%jLt%AJ+U46n*Tp7PO$?);m@$D=3&HZNUcESH%wP zEbQCzR}%j}c_hiO9V;D(8ccXWaaq~wGT$SY{U@xXV`AmSYiHTbE7E4In3IZfV1Kxv zz*b&fT(-8LZ0#!X@Q!RdS+1g8&h}B!E)VEe(O$aZ*5b7*Ru<2aj$-*qr#g||;sES` z(kXtw^nmA0#Pg|xG!gDgY0<2tVH#41l|1b6Im+ac;v)X=+$B%UXp<23SHMLmhXSF)QWq3z_YFV_Pv=lkk`mxsvozz?`#{y9i@ED%3%4&Hm_t<^I7 zdZ7bKy>Pe&lkVCu?JC~3T(s|qp2FM$disR_vyw!bJhJ4d6+QnyvBOF67)LS1(P--9 zh)*tFAOphlh6$(h48Y(emV#o)&Mgt>{31}irRG`%I{y|>470iU0-c`=O6jseDIF)! z`D8!%|7Y(_;G?Rt{ohkn87gzdj0_D#ndb;7w03s_3K#}aakg9LDGYK^a0m$qic&$P zgX8IU|B8)J9HaIh5c}x+H)9x*6z~|F`uUiYF$@nxO567T{hg|U7{_~WzxTTTk9;Wh z+57CX_da`A`?uC!YaKn;GaUY^J0brDb`6KWYDt*Rb1ev=?wy(vvU_zpPUJG|OAd#_ z-_{Vab#;1&kS(y&>xAqSo&FFB%Ohb)B%Dadme?tmQ2CQ1>9SMMbFw#3D7ylMHIeW= zLOoYbsQMlx%pjad2qfrqPb3@|39pTW9SMOcosP35D*s+W<=-9&*F?g%BH_!C@EJlq zH;T|lIFwNBmA!=8)iV-yB;?<~w&CzsEeX|5FCklZr_GGF>Xn^`>U}*DzD%g+1Z4<+ z^#Y;lDR-U5tYVx&MDE?lNMc z^Y^t#JUU+mWt2avk9!TzC@$%~{&q#~FOI~gMdIrs@nD1JCn?UHi0b2}G>DH?oM&Ca zJ^Tq;)Q=C>eI|BPUv???o0As(8^A@qsL{JYe0YPn#((! zgZP04aXnlA`8ylLjeEm;`UU;;`rFjEK5!7d5#5i_r57=mV!i`{ba4^X7?I8M`}Fo3 zU=Pq)7-D><4Hq^tO8Ie=@tsFiXn1%0&MlQ1xivAoLynv@YU23G7pwzDPZ}|L)Tq&; zI!~H1>Vb))zx@hhoiE={{JA^c_bBxLyl1uDg?qU3l|T9Vk$pI77vKy`=lq}fSibX^ zWQ_b_HxT(gLks6GYB$j9>J}|}bj>I2%C5SR-?i&i-7y&Gk>CBQURNrmf!#m^q}}^( zqsQcTz3};l@BMy*qj28Bsor5*M2mmuFZaI-^cx2H(av8quGHvHH-7H-8&*CNE=c96 z+McW8jYo75W6a|J3xD_CJ8}H|qyKIA#QdwAw1)NrYa->`7kOfDsYm^S4TQrxz7B^MOZfKHPuU~n{xLib zpGF?*xilRAb}1KQKV^?#ED1l~0$QuT7R%zDY2n)vA7wSaH7g)G*d>f}GDQAsMaaI)9~8KreZ%3Jcw;j)t8(^fp?qj7=71@qOb4TIpM{zE6QUFc9d_q|M%+SiCf05NbKqgsE@zt6T9PY zQ_|2m_hEmMj{V7Hd^;k8Z&zgUJ&o9fd;1w7FZ$(P7h}k8nWypjwk-<-yRcbEoSA7R z&D>>n>|PM)%osf#D%<(Y*JV5ZMEEk{JQp|E!wzb5_vOk|$Yi8Z1d_lAL&Q$Z<%oMYT z@`|`$?8>qqU|er2*=>%zBg@=Fp57%{+;el!WAC5oHD4uvZ^L69n7P^XqiTlX8hZeXG?yT*_m*B?G648 zgaN`D`n?nVn?}7p>c44bqFFF=tGSLguBUz1aqqE`B=c4JE{AT78x5aOk3v&@mqO&{;X$I-2k%*&~?cRlYLq`Xvjs&$Gs=DR(1 zAEohrZ;@X#tBX6$zKK5dxznvb@mz2EGvDpDNAT`Gx7!*)KPc{IzK-x_nFr`spW9dh0I_24d;ASLVzJ z#L<_stvSFPJ>KPpz#-=E(Kbba6L%Mc+@xg_pF4A{`TR_mSxfxz)$xJNq#f>Kgx;CC z#>^dVn17yWm^Sp_qj3r5yU>G@lC9?7?n^XFOA^gnSSLFNCz<_OH($6LS#ynC`>@+f zm|=Te&8!NesU72LVoh>4wx?0g4C;A-a$lrO<)7xxwcjZTnpMM6%_SwN=7ZF8eprI} z5cS+eJs(X-H1DRKn|QXAe1{)QrHw}DcjWuz;RNapnwu_9h5orHuZi^tWly87ha=^` zICDGkT>FKYK651Hf9j64Zl~-q?l`*}WxiLtp<;>A)Vh}EtDrA;cyg_~DB~edBl~X3 z$o6Dg4^l=iPr5yhGWNK0tmm1_y*$nAf7g7b%=OHjJ(RVUGU~1_2=(%$*!h&vg6FGh zHdc&;e)gq|Aw1tpdo=x0N*R-QKFyP3pTDLc^!&^Z=$Bk`E^BiMzh2wcS7@Dj>ARDz z#yr!MP<`qqj3;bl?T6lJ4fe0uTv6%DwboG<^u!us#1R@6^PkW~m~Ag(4X3!9+dlFy zgT8vxvrMhqWvttD!f}L^o30Kl`%BNjThOSNSqphzmhE)2UJuaDgS0oc)Mv((Za0^* zrYc!$8Ks%#^wJ&XjM8+o&Yfaya>v`Zm25L_FG({iT{+evBiqg{*n?Y^Se$ zj4ShP6lgf(VvgjtgDzyJl~yR zP4hIh^WBY^gN+EG3zXfGwRQ{lZ>rf*fnU(a+i_Up_(theh}Ypn=d z6E-caG2=^<%?z$92W8RzEVEn5db8WW81t$UkGZ;JjrsmPhWSp3VV?Y|Um!Gdhxy^y zbo0xZ>86+czS5Z=@q|rjOJl-Dgt->Bk)dU-99!$AEp;63qA=M!+{OsqLiznE|8Ry8 z>Q5bqy!KwhtV=UOA?9>SNsU?8%?PEGB%5^|jL_ZW zzkOmHv>?{JhB3KjVl(qv#^rZh|L#Gr*_Z1w1z~&kx}!-(=$GtqiCiZL zTa*UP)Y4S*RD3~*xo@4zC?C&*G%Up~W~^CL_Q?(fAzh#BRuHOWPb_E5i`m0o=b2jY!!}Qh zE$n<0`Yx;j<|2$Gj3;k3duy^)%Usj?6>jd&bBWOXwp^cT(pER~9P4BO^K5O|C+51cX678yN72`hvc5*q_p=R`9Rr5w4W5euPvjY_5n&%+7BnHz z!5j-&7YEtzW`Q|km|s5TR#&&rIt`YABeGkv=6voL>pJr1v9?%G_HfoLWs|lQTCmxi zV|eU?U?R$=tj*3|@2S~dk>_Aj+UcxW!+sfzJdFMIRq(Q&*}yZ@VQru;6lU#~&e~jC z0k*M*5kElwQRE@7b&_XBk?(0R#s=P<{8o^s^@S?;R2X$F4{W9KYKL^=7^L z7^6Hw)sLLf4uX}|BxISsV1d7L%@Ds!_sEma?-YIfG`6gdvVJ$xk5%CKHqf%7-pzcduuxTLSxH@R(>=t-F(StY_}|NnJqmrRIKZ1UB+onA)!^+^^7qn0N-Zb{L9P)g@Iyujt#-3@NXK(GvzO1xd$}}ib`x)h0 z8D*&s4gZ2YWh68@qbz7<4AgVk_Bq~Xq`|u5eXhDAJ)9P-Vjs-5vdeauhLhIZPA^M` zCrJfUWit+}StHfn%X_vkeC8?MM{`JhJ~gAQ8dfJKn z?Z|)R>X^VJXxu~4xJ8utEM>k;nX4(Y9pMpZ@sr#?0?nI89-BPxk|#h~T^m>69nv~+ z-Hz}GbnkNKxy|Mg=<~JYOCbLdXs?&+!_ZzY?~=f~xTrsc`eUfW!!tF^^J?b(v2LC~ z&CE}@Zf33#PG${ugLbxdXy+%a-)8j5C#>0KChuu2V*FNt%g#Y#bRBRfSWmdU_F0G4 zWLjq(+L>v84$e6X{ah5>4K2&Gyo^h+C&?PbwNAa4&6+1`1h7z{>Mmvjs6$k`x;}h9@-Sg7|jLy#W7}JK)W^jVei~DFcfr< zJ#j7cFOIQT#~g}d%nio81+>k@9th8EkEz)J1`&2lG)F>z;M46_DU-5E+sc~XY;J@n zjbpzQ#*BkLzXEN&zGe+;E!K(^-R3#Iq6qJjEPfU~w#Ip;in$@azKVIWL~T<(_|rn# zw3v7-G<*zsDBtoy)5nl+JG^Zb?@oS)Zo-4vLu%GSOMKRmdUW#{)}O&o_*L}>+53XE z8!Li^X{J##*neM5fqy-H?B>2`>&yIFx@O({6c{redXxce>kj?v0qu*0MrA{ngduaG zC!dwBGvk`Lp_^`Kq06D0Uy|?P2`=*^=;jzOOlwb^^$@s5bn{D|oi@QRUjkdMnve$F zTnpWFvF^4(H`Ab*hPeoupmlveG;Sm`PV4+x%0FaeSNsIW4%Uf^w~_G9TlX#=YkD5_plU zvhC)rL-ky?{TyX3fkr+@8>ipla?;KPchbM2n`_P9PFi!@Rpw$Z@v&ECGdA!QjLW0! zCnLOuIg9;7a|k}yekHh(`Qx(I(!V}o|KOSmS6rHTiuefDQ(UmnKcuFw{|e&k_`SkU z<2D!nC{el@N8hxhz3Kc$!*h*=cUl2MzB}t<5w!ey)|vLZ z+o^jlW#S>wzMuM)Hp5x7Dzln6d<5??S9}cbRaLXe+55WDmbvViJ1O%j+76Fs_hh{& z{~fd`pY^f>-fKE#k96u%I`SjR&Zi%;Sl>S0Q}ta<+w*8gzB|*-q%4E7#s3}BIMh^C zR1uB>JLNNe`N0hp8ryy3^|9t!@a~dlAf+bs5M~o1|DkR9!R-|-vKcp?-^+T_T3bt~ z{ZV^kD|ov;%+1}!@<^7@Mm|Be-T)18t-zJ zIZN53v5uI>Iq+2Pu(m0mveuZ)8+!)$fw8kzQ~xxcJH$AzfS*3Y7}T++u7M?(^sO-3$0c#* zUrVa!r&##gjpiGqSCanW%uVK>N5_MM;>}T|apG^S>7`ZXZFj?eF|S?(FTQ9XR{=AM z_nlt4k$bV`!)4pdmx|NOzs{^OE2qYpO^N??S{nRwtocY8p(n#K8RJENFWY$=r6>JxFC+S=JsUdYG+C|nc{V(m3fe>!6%okH!B8v z;OR5$Gt8Mo(6c?v#UMQA^iq$ROMQ~P3oAWXx*qurY4Fw$m#IwESw)?3q%}r9AFQZF zR-ku0bVnR>tGPXf_nrpbX6;%dq1y-O`>|yk&3VmY&CzAC&K{(GuL{E7GnZOdv$rtE zH4bCgPv_9*l4p*BmaVV7&cBQJJbtf{rt$b9?jk*VkU2UD+8^ZiKG!P)<3G<*qRwnQWNv5uf&NK0+7IH?`iQ-d^-w zF8hRJQJs(_g|zp18d)LsKk@W0(k8`Uq)m!H#C?s2*6BOcp|Q~YhsZBE))(v*n(r@A zc4tp2<*|Q(@j|S(pi`b?XUea5E^EPUR@UyRkWA-&$`h49wL9W4c36Or?Cd$32gBJYgua}g24(8m?pfpt*=P$n`XACxydh? z&s((x{>#ZD{%j3#@dSOq7#pB>DWx&U2R2-wd94^f(Yzj{Uq$+B^ix%1m${lTc?aG= zbV0Jv50Hg^0IluIJADQZqn>kQt^#aM|qTWj7j(51CzpMlOPt(*Flu~grKJuG1%VT5zgFL*3?tL^4(cZ6}n zRg@`yPyMX*yOZ$|##lvPj|OAxWR7(ksOO-y(77e-zh|LwIIeQiR??43+eN$coV4cl z8qs9RL8HjQ7+t{_`xvjnm~`_r<0$^x$5;&mV@O86hW-tY19CGr?@XU-O;$1v+mSnH z|9OSDu%3A3k@YY}DtnHH_KH6n#2$D(d*GS>)-UiG?>vTaI7DCU1aI#Gdp^LvJe@uE zdG^g0*f$&UXOHo|)1Y0IoK1=TP698~!JiExe;x9!K|E839H|x@T!-A~18}kS{s-8b zqZno|b%=+ngGUn|_Y(I_?k`XpGO!BL2I(3Z`9Q8ubc+x4p-ltHcN{+LcjWD;YxuOb zT#HX@%X@w1NnGBZck9eP(24z^74@{_Imy0~zyspdlEE-Z;1@Ua(FI*>O5S+#`Xbn% zHTUzmf00+qwT?KvT7tdYo#^mtN8r_p;A@UJyjp_8s~v$?>t4H?v(YfGHXdGW0K8f| zWM7gsA-m!_g>%7FLXUMEUQKB_>(Tkoc;;aTu*X2=K{4}Fyqb8qVpk0OT`XZUhgVaY zc(uWdbvtBYk~fc!@K{k^?I?4{k6iV*!>b|Vf>%>r#~ogcIJ}w@cX+k13`}voQ!(uj ze>Q=34d{_(PT;z_c7T5(VN!5_e+YcqQ{Tg@b%OubIgw;gtsGu0Il`;e`~M2%(ed*ua*$u)wcXhUXAmN3%uHvpXAk!b_>h6jv(XuPw{GT zvu^HuiC6n4=he2tt0n#fuNLO5dcv>#G_O_zolJ&T+xjECT7t7z-a)-p(5vs~)oLQV z+SUlKmiQCAS^|5Nc(r7BwJkrvtHH}Tyc&8G7kD*zybHYA)(EerGNZiOmI$x51zs(h z{zJT44YVLR!mDkCS4+IatNp9@ATh%_~+2JxrQl4a3Z6eRNp$^Hf`bGMpA8k-Pp8Dn@!_t|N z&f_H0(mN$ne|z3zKDqE{>YTv2{|(fc;7YJ9 z_@EkomGIe*Jhzizisl8Fn>t zl1|7KIwMzj6y72oS)zd~aSrD|G4SEB@Z+sH_i6)=o(F&4jXd4C_W-hnXK(YN7vw_^ zXtO!v9xu8-Ueo1qA%Bgxb!NdCioFVX?e1HB=G(|{Z>Q}e??KO$cj?Xjk=%b4*~yZj z$mN)8(mmij%l;#L)P{7%03IugdVJLJ7IN^pA^g@iaC_Sn#g6HL}fm!SyzYdku0dzobkI9=Giv$1>|inl0I!rl6fcT zFOEr}zG`#Pge1af9q0qno@hBsSf?A28(qaZUdkNpAsWS5sASD?%$GxqE$y(fm_s_p zI>&sfVxFF3en}>G8)Yf3w$G(3XFaoqIq#z^o@b3iPoN`V`6qQy)()PL{xdK1T) zcQwdN-k|(cWP-~nU-V=m<&$oWqx=EPY0;4R(32L%*ndw#4|OjWAsdo@RY!Dnr8j#!b_DOl%=-O#7q$c*Z#DY2 z{wMNs%)I0^ziQw0x&Sn`I#gZu-!D(|4yG-Wjk)^=7r7ewS+CW|%KT?(>l078&l}0J zewElVCSVk}_|`+la;>Gsi;abQJ(Us{U-^hqBo^8NJo#7 z5ZwMH6t~uy2rZOgt{OHzI7ZbK~`J8?)a-~;m97bIk9~jr!8yMd{0UM0#pjq|j z+eT-;{pj~X*2nG8eEW{g1~xd-D`|@jPBJz)ZLz`eVuRBT8=Q97;IzjErwALII-a!_ zxX(`UqiHieW>?XFXry%E z3t5XJpsmHw*go7F1+5qjo%oFVhsbx#NMdcfk*UU7?0wF@r#uJa&qmjtGZNVlJi~d)pIF;}WSvKCO3J|x`JB6t(mo4KmVQk>XNj*;-yf-Oqi7BJ zrK_TSHkPxSyv$7G8=2DSvxcKn@+x&Nr|w#w*}^laJR|+uQS{k>n(B&U(2z9F8&0Cz zsP!gWf-c0hj~!=kV-K{tK(GD~iA$y&K-SFqvye9vCKGaQ#r?L(jlJoaW@E0$q4(Z| z&_3BC&?wm7|K~GT1>TvHa~|8QXL|EZhnM?!cD(YcdxzH7_$#jujBDRFP|UnufS!D3 zo=am64ynD-KecvVT zx(6&z*7+{Xq5IG$%*S467T1pv#+RWd+$`B_T$XI!!=6=wF8=S>vp(d^?{Vbn(j^49 z+K1Q!+K}%{=FUCBp!cEk!+z4+Xv{drJM*UvV?DQNCKxW$IddD~=uB=lufP`QAmcla zGG5~Oxshk$%eI=nW{GBenecDCbsy&e2k4tCQrXAor(E{xcZPW#z3xNKGwAm-*FPAZ zWZKO4Xxe$w@<+&aCW&Y0+hK{0JWYDrjj6Yav*})(^Fqg11I-;wCJZ*4eNX31mqY7( z!L=2qz<k8b-{eS1)BJPQ=s^gsM1=1$z8eNCU&NX_iJU4>p9w4t|y^gN*yRm^pu8(r&l*D@^ z@*XbgPNl8VL-UZo1vqUlXJKu@YKNO+Ljs0t3zlmIzR3sgoMX(-p$Gm2<9?hue3E&a zO&;l158;gZOLX!c<}5#j^WjsRH4X9j?B%RubfoP%&XUmAv+6k8k$uvaoZ-kOqO$fQ z+2uLsHw!pxmcI3No~uMJ5Zz$HR4bM9#AVP0+(+5PvN3|DSkQzNPnx6iEIb1b$$3*2 zp@&d*4(Z|ZCuoLj90xIHiWpnzZcEQPjq7pz+F_4yEWRLAO&d>ezU1glJ7-+zQFHF( z#5p6=`PT`~qntSBXNq@(HtF0+I9+y86PZiJJ(5kGITe8~bk=ng4C0T_`x~L@QQM~$ z^j#i(xPU%=l>WTJq4%i~{puiVD8;U0z7JyF>}T#j3f&(~`7!8uASx&u%y{2|u zMG$z6X%Q>L!r#x)TtmSjk&p$zV>;v`|^m(~wZKaI* z_E0YOMSG|Kee7)&YaUUbvtH}tKjFG@t&PBh#IQZout#TKyO@1JIO_s7V~?mGuYbMx zz>nu0*SauJ#a@tzj!f~D1%VWFZYG1#rieB}j~5coBFy8xFXvrlODH{a?e80Tri%Ri zxTk%+ANQC3BEgY2EM-kfS9U4ub5m2%SY!l@Q{^vGp{2QK7ef!$dC@O}CgdT*C@24Z+T%`4 zFh8Yzt)T~wehu^?E>}AL=%7;9XStcoolM6rQfZ%3uP^)iZ90VshA|#~FacQFS-*pb z>%5k|)Y17J7>O4XFM@U#u}*~tj$q#a{sRa2>@?^}Th^QxeS5Df(@fx*Wnh6s!Y2qP z6CUUHX1{3x>+1UhZ?P|X*pt`so5jxspBMwb*h>2wSmt_YXJ6=MJp7YnEb;JCpMrJT za4swvPaDoN)t8bbjfHPq%RVy(zV46ghuVWQHrJEhm$Z1w371hFDMLE+Dr1N9e7{JU z{U|eBp3k{I5}gg{m0eFLTd2A0XW|v(C{wZ@Fdx^oVfhwwNBX&~nMaaI^ySQ2@xIhC z61k4j;;2VyaZWvPtX~iNpY)>ERcz#59Cb)mRmFXSI?*MzTVuE7j4?J`iua`+#l`C@ z9!EWj$5D^sv=_a?=JrO?AE!)}7vx?(YtVp4E~jkSqI5=%!@g&=L#`v)#z5*3pIJmb zvVlyb9{5koOFdfiH((PZK2y5j%inw;@cQcMfj8#dett?sCN&Gp_6od?_xen8M{S|M z74&E&xa};s?HRYP`c`n4K9sTlg@On{uQt{Bvz8T?{ zy|n}V<@7^}XfolG?u6=<*rOhyk9xQgt9!yH_i`my|I+2HcHS?-(=PMe(bMZPE<1vL zeY=@_o9`Dl6g7O0r)ZDbueQIzwb~zTdxFP1e*$sl%<}eJ`?-dW@LsOK4aAobXZ|>C z7k{lj+y5hSu;IwT4!g74RZL z{_F1%bD_(!`QOMhRXnqlwZEz9cWwTq_xUz7LN@=RLx)&X@y&k7=0Dz^?(7kJ*dwwd zdqg&}V;2}Eygw{vZPwo(Wb+UH_|E>I{p6?jhdt~M+3XM5KWl%G&HocWVDsO$fzAH} z;)T$j{>;DjKg;Gn`v+|Pu~nzu`ZoV-*~8YcPs;{#6!cseX%u?|{002B_P!YFkKhy8 zyB(al$Mjv6jego5?B24mmlofWEju!6F7yms#xvr}W4>ea-x*q5-{!w7xJ)+x_kqjm z+x!m)n-yaxGn;+*Bx5z3eOd8W9Gic|f5_%Pn|Tqo`EP;!or}Hu`)vM2A0>kUll=#5 z{$1a;`A^9H37dcH;^@1EHvfh6@#W0l8|kmhnd7}1*!+`@uYx^hequIq5!w7_%ccQ4 z{aQyqbRF37+cy7hySLJichtA}&!d4yQjQw;xV_hILE#pu?DL?sshd z-QQ#LpH04~%|HFm^OEDg!t=6Q+y_0pX!DQ$Bjc_$P2c~6Z2q(V!#4kC;4`CpN7(j1 zJ7W94$NZCH`=1@L{omu*{@1a8TuvWfO`ps5{{`&U-(Ws3W1gS5!W;MyzPAzj${(To z`YxF9sNzk1#hH+WmhSvHS1Ov$9(*CGX(}Q%t@I>)8JP{bAYu*P4ee zPcd(&>_rW1|5eAgZU0kD>4pyFJvg&-Z2$lI6Sn`-d6w<}i7WaBdU?E#{lDx?zHR@X zV$R{5VkPZ-g?98pzq&L1_fxk2Q@~Qv9ex2UwGeDo-|k;F|6ib=FPnet8wh2a9=7?H zETlK~{`fwzcA$$b8q$^b!R{RXIhD|b&15E_n^3lr@OE1J>DlHE*8dyWU#%fbMJB6# zT{x*LXL~Nr`qr^dJ*?jtXw9dz?=!Gn8_p?Yn}3FT_oE*?1HItWtg(5tXDDmzcGg@z z`dNoKpUC8X4)=8q)0?xFhf0`Vqr!VbBhDupb5_v=y<-C%BkfFt@?NtVIgHlZT%-Zw*J}35ci;an$5ZCo_eX{iVn6*!r_pHp|vuy2r?K4omkK zna*KkPt(v>e`289Jd6(WICR(#dyLQu>imE@S5jxx)<1}?{|RJHvh`1eH$8#=wB$!8 zkQu#88ShVYV>jV8zhcgRJjG@Hjd}lf-m%$3=*43XHkfC=W9$DHci7e+{pcUH^}og& zw)ICYl?wm%9b13oQs1`quf=95#XRMatv`D0$dzQ5BwPP-+4>`&a%}yP@m#R=M_<~p z1-(VK{=2@{)_*c1oe*!tIKeZe2e)*meUqqhD}F*nng8^N-epH{6+AyB^Irjc1;a5}Py+^{YB0LCKul5YQj?WWeB%SMvj&$bQN4d~f zTlDi}?fQz7;Gg~U_0tjgaenYd|9($G;Pf?#fm7&BJPqHrfVC~V0NK`EhwelhZ0KUS zj^nx;eiL>!>k#nsDzPY>G;z8RqY>G1>>+8y=Tx)-i9L^l$L>vL8AGuYU+Tu@TsPRYc^?_$j_ylvIE+Z z4sF4%FG7Q7LF1(NH5A+Z`)^4#Z^xz|&$FauVhA>GV%0NU)DPzk6%IB8Y9(o@*zW> zP1<7Wc_WfHkNu{QanEP(5ndg}y9r+n=UtzPar^?6Gw`*t8N1`}+L$0GvTEUvWFsRRIN9UA zCK)t)kLG5rkz;Gj`+|?8-;@Dn$^>V;$T|O5VGZbEE9hrKI}=CV4}C7>{)60KK>e~W zxnOGoy1p$nn= zI_pbf%}zwdRP4y`b>5kZEq!^q*`0FI}&w{eNr50l6Rc|Kag+ z<~i~`$yr;oe>=X17@PVwCGv?PTNc@r=)ATS`@7`1t-w(7Gtd`2BblY-xjF{`KXHDW zetDfwX)^i_TXs-Ufk_k|`ZztR@-Oe^M$>{%r9%V!?Rj%5eyvAz!g$@_0| zbY;>VTKYP))Pj}@&&Kh~<0sp@0?L&y57~b?z5vo$kMwU4thA0WkMKZJLSSFNMC4mW zNd5pOfj_mbMngZxh<-u`WIuN+*WIB7vQfSo8j;J|mA(H+Y)BiErwRA&DO(3Ebwf+t z=4A3b^~-c~68Uv*B&;M_D(v(sGZlVa2SZ`j0vVZn(OxZd6c9zAZpwuwRsI`EB?&nSOUVv{drius@Brp`Uy1NC(rUn<1Y4 z^B9-oyFj#bk3&o451^6N2wIej9dFN((o+i4(pqf#u*J0|v&KX>6(0ocJ3*O`LjP8h z_6F}ZNHmvx>qt95J@PrFw99Fu@N*vZ3d_7gUx~IZrmi*YAsUlTlqX(6bW`P54o@>* z<$4k{R5W!qVbmwUeaMzN(Z{XWztRXNL+eIC>&`f|bRD!*cHrPc_VtzQ<*T4uZ$q~Z zveplYXXkA6Gv@PLXsIwP_8Np)g!q);d}B=HEb|u16|V-L;rLrw!JMsR4zFa+uY&IB zjIxe)>zqV7qSL6S(v@XBKwZ+68cI1jD-=Br!snr%h2O9(q@fE*x$=4A=vlGur2ka` zpLLctp8yjaqTTXiGo8AE=vs`XKKXyRl{#o6WlD!I6W#=!E&4d?IE{OzI+0Rm+DU0vMqTN8A+=MZRU&t9nr9@nbwnZ zX{KSTDLKv=Z1D6BQ=pAi*sM$Tzn(T~Y)A0^`QWrdXoF-KEsz=Jp(7?aepqh5w!-CO zPgR-7)-}d!(UTBPiTVWSgnjyn2oKnjv5sfH$X`%*u*!4TAMZrR@;U5}H_`UD$)~mP zHtSV;!yb6%syoo_WF7>ei$V0y-e#Rtu@}A#zbkv#S}^V#%t?*QIoe-|Z1Xnqi+_{u z!aUX+Ws|lJ9J9^D{|+)xY(eR_x8X0Jg6{01?}cwx!fRGJ^d$}*V$Lae*Msmui&!Ii zZaU9NKW{qq$*0X8WH`avO%=>V>v7^MdFCqekQbi-_&y*X`hYx_ru^8XZ*$IVHlq70 z8Ny!Csox|9PD7`rX>X$c4$+rtgXphgmyW${Wo=*o0r1Ek?gt|5s=O{_<-b^Um9 zoRhYQ`R&vp{{Tbc%6or9RC107yScpKE6r*0XQ4i{v>^t$I*+_dh7cw{{Xx* z{jN2m@mSA1kB-OVjD^M{H$LniK(y^4Xxaz-R`ELlf4G4DsO=GNrs97k2EQvSnEU90 zTPv9RqF>$ceV}+Z=(gfJ**g^9sl9|g4b!+xbQ)6ZRPtnyeNjp>Q#J(6Bj;5F9o`$aa_S#(b$B`#O9o_$#KfevEHYS zT*?gl>QEW->&2R4fBC>^hkRuy&Uk9QGH#P)Lr(b`GvrVB0EqbHVE@$ftJqJm;dgBR z!)=spy4ol@pgQrXpg84eJe_t?p6t=j@}9E&f0;51;MZjP|7gVa-;uAf=0w9zvgXo| z3$LM0VWJ(>DSyAS8L#MgF2*;`RMwxH{p}?0U%tkZKdejkaTpbzl|#-j}?#hA!W-C zgmA?k>bvT0twa0_(N70iD_Yx{H>>HZ`nX~Q<0PyR#T6-@6iZm+U;|w7=zkPf-03s_ zNV#kJg#7@5&sKFMtK?dyjn&u88^pkS=yMxOWD7@Pq8VKbJ>)oc#01AH^3@ z9&IOk^hWmROfYm7xLLk?X0RVWMc54Nn+q16#C|RQ>=E{CM;Gf|`Fcxo_%rEg`MEv@ zeipks?Vbx?@$=fS^ZIm zN0VMAx*6cMV)nG~`Js<6opZ!g!Z3d(yZnayS(K-0%UFx2I@N$blb+Zqhd+Z4bNDlr z+t`xtwqoQhMaZ)2^Jmh%YEN0?DXRng*?6vB=bYM480F6 z76)Frj-RlLFpK!JL##pZ;_}^=30~;|-hLabC|>4m@FaYi!=H(d5q~DWR{YtaJMd*L zycglm_JB9Syxc|pEC?PEKR2B-k|=+6!S@>bw0J=AXRE+_vWwaSmJ=Vi2kiC+JjLhq zy=?7vv!9Ev6Mw%H46zix?o;@)Rp1vr_Z-iOuX~RA#5afevz-;<#g`J_9pTT&YgI+~ zGx3toQ7-wdxzs0nh|l29UW50m&!5R}o5ME~M$ZQ2S8v`B@n`+~qrf2Nz(cFpOE&SV z;`%{+0z~<<1@!Y%;6C|C6W{Y8eA>tGX@4dC6VhKQ+YNt~1)qfvUVONH3V*m7pKkB} zHvR&CX2YLtgg@gR{8<(J8T`xz{*1i$#@FM|@P+oh{2Bh@9R7?mgqyP*zF~>OpYd%9 zc=AQ?hr)7_QLp4IAEDi$B{0e-?j%KT{oNNm~h@*aQCT5PZ(_VB|y8HCK2UKJT}kMP zy%b+j(v$25eZCsB(Q@lQZrg)e?Q$I?!{cZj%Gs2%`{s@1z+L00Bj}ShuK7aN+>rhyJ z5o@s$pQqXzGV1YXnXHu`;?Lf3cszWK(f0cM*$b>OJ@dTQYlJ_OU*{-)CLU3`1i2CZ z%m?ps3O{M`UnYKRHSghTz@I7p1?5Hgvt5)Yy9)7V`>AgYWr{z0G{T?FW^IZ;dxduq zfA%Kt(U3no4S)6u;}zx4eDG(IPw|x{$A6{tF7xq0njhye<*T_8zs-_4?&Az?2jhMk znTpQQdPi*kTS4nui$7zI#&ey;b!X=C8R*_wXqkMVUQN4Xf1FF6M%-)68QL$44fr#B z>yhWLQ~90%`PX89EdDI-0)Ms!{!IEU%7;(Bsmw!Y;YI#zJ^Y!6wdnXgjPPeW;Lp<8 z+YR;kvlK_}yUiSSfj>(#Q=qZp&t{Rfk9yvuKb6)Z!Z+&- zEy%e133&!*X`I1rmmgo!e0C@1rpnhDnj`nU(__lUQ2bf+46S#>PumFAUT5a#LC*I* zgq`3&T3z7JE}o%9`Lk!?X~dJwgQuzG>}-tWtgN&9!4BawH1yt`Gqg`#pTzWy66MR5v8jw8Ez~1rm)Nx zdvEwB$#b8D51Y$gFBziF=0-!Gr%{Jw)oqCD`$|2COP-TK9kd@Gt;mx7muZ z-GW_QC&DLdZt%;tH;L=lSzDXI6rGWK_o1(^qtE3}Y%FbAfh=+fGRgb7_bhrAOW5C@ zEv7<*w2zfYrpS_4a6)s&wA1l6#Gx>0wIf6_V*}nZ0 z<@%|koVHa_H#S1n82XU;#GbU(oIu&r=+AQINjJ*T_mCt5lnt%MYpKdXu7-{UXTI_F zYffC>LQ1lV!8Fplm_XefxPJroNA0j(aO|S9++p2Q`c?faz3L|ki}}f(rVst6bHY~C z8SUGh5xph#?GyB^Y#*MYZ`B9#CE=xw(^zLtpU|gE(A}w^pXTyjqmTnv&^O^Z8$MH* z!x_L_#)AFL-pQDcWZteIzxw74`uZ{6oBX7yPq#2;>Qjv&vPX^C5O5=XO4-hysP7@^ zS&h?N+OGc8ynmc`&|F>0v$6qPN}Y;tBCpQ&$d7$0@>s^9A9=L@`x%!a@}bLZTa;Ce zElhxN%2`Xu3+xHZVLupAXTTcBl2uZG9X zJue&Zmpw0D`^pvA{v`Da80h2wS9~RWGbf&J!R2Dt-Uxg4#@M+x!Tz`@cF4a7eBCF0 z;aA^dSG)?Fh0n2B&^P|H)?{DY4%_1P*cI!$ei!YDjX;X*j5*czuq?29|1 zSCZVozIY;I^9H}4XJ5=bLC5lk?2G3zA0A_#G_)_4ALH24_pvX|K_4&2(N~sz@j}kY z<}zoO@SMH_w19o7zJ0OISY?kkhw;_C`L2EO``8!fpr4R)!M=D7b3@-TtKpfSV_(cS zR~*|;?Ok7kyBFL3dM4eg4hH>>l}eT+p~&9;hg8=Bh&*NZ9p0Bw{``c&q>>>R`X*ta`& z#rZeKm@O!C2fl~pb2y(+W2$kKUGag4U2!b5JPx|P6kW;SFYvJpmXcj@ciQ&=?>C)y zdjXvBA{Ybz(N-3IQQ&he_S|}Q#hK^;M(m2OkzQsE-~B*G2>Ea)#-i?BPoOiHN4nY% zP_F#yzd*T;y!sk`CAcorVeHzzaP6<`LKN*`L+Bklyk71AlP7{?TTVVmNuj!kiY##i5BI*P7Rdr#s;o8sT7jo1*QE9%$~qmSgo(PeVt zj{H4rQ>=CiBNRn!iiBK-i{uLhvsC0A!Bk+lu@t z+Xgx|#V6Q9<)3I9Jj+{P^iyDT&LyjdU{`#slh1q_zG4W!lgx`8^t^=;&+-%9pMW1C zzKKeAYeiTX(~E-39-3Cw}bi2*8g;{MgO9?DRL^B$-%d@z4Y>CP9^&`D0qmcU6FQd%N z^Y^~TwTm>$e8dy@di@WVJDqZ8IAvuo-|xu@*XP7@h)3$*AFV5!y82LVZ^|#^-8MM& z{a1XUHS~iv9xNd~xP8aofvBzbK*mkB-h&u7uu=6Bc`2sF_#I>XG+*TlO>=t$e$=8q z&^mU%F7PDd>C9usRP)%IiT(k8(BuQF#oXSNZF@35dy+QSU1`wYdHkaDQ2qFg$Ft+? zjfwPO5`E~tFgD)$-%p>@?0g- zj2-*Puj^%V?&aQ+3H-FM+9sURs;1~Pzn}A<}0fh7UO~gMzIpIIE&$=n=`Uj@sqweSW(rb-hy0wO@ zT7L8l$45jX{|Hyuhh867*oWR+SJZ!AEdKN20?<7FW|!B0jP;S|PV{$lC;LaW4*RT| zaODsCtov748$aq>Z%+FiXYuK{cN6v~#;pG%fpy)^CBCO16hP-bVon$S{hOgG zQ)RS|H5PVYzmQxk7P{gkUd~VX@bfUVdB}5m+&AA0?KFN|&raWb)4k5)UEZ0zCq2o_ zyN*BEbGzH*^+4k?2axuEWf`ZJef7=IAZ?LvMC^|i zR;pd@nA3g!_RY{e>`~!&xZLT73IC;jxcpzbANF363JnU=?OAaJl}|uF4tH~f_QqdU zIqT7N*Uo-){k2cDCas?*X z|MMAzq5Y2(hQ`6q3`QPtvaB$4WKLm7I(R3#WCaeaE({%fw=i@HInbwnDGYtKzA$tM zxlkwKEeMZ$5|&Tp*~9Y+L;L)Np)*;b{)BdM zd{;G&Z%J)54=qKvuV*ah&#`7E-%Z0`ij~QC)6U-PG4=h_^Q$iltV9l^Z>6rBxdC6q zG068bIZw#I501_ik_Z#+3Fv$mqx;<%J=1RJnCe?Qk{|3{pAksqO#MX9IO>R_ju`G` zQpX1Bh(WH-c_X^rN?VBzc;=8;CvB0+bIuXg5l^)zBg2n=f3*W=m6Ac=C&uc``6YV4 z_{Gk0@~`0iGWZ6#&ayN423xqUjnu_A!Jh^@JN4lYi~8>8oHKl8L3t6G$??_LoZ+8P z=ZnSo`|5_z!U}Xz7E!;RS;Tom_>5Hb(PrAIcqV%0;kv4*3tb4(^xcu5_&d%=&b^Bd zJ!}u9%kva^%J(CKx*GdKosXYfVT7LN43zVD>v`IwwEY!)8<0AcwwgMX_PO5(z0Z3p z?S1N1T08KNm*2EtHTE1C)-cW+*5FUpPdypz(W6qmgNyMQA>1^+Rl3Gm3N%TnQi}>e>I=TYif4FSJL_C3qyyOGMBBwP!eT5%zQ2ac|-E3FaW~mG@{u z=yhy3Qu*fUFyzmb=xoZ4XH997$aTEEcOKXtyWsG>=JqV=-c*KPQO=C!QTOh$U7Wol zPsV=S;2bdvdve8Zr98z?BWo?5*~CnOuirbTAcQRo_V%^TJm}20ETpV8Wx3c9D%heC(7DUmOV3e0(b2g7Ot_LHUXgQ@;`~XO0e|UzH}`SB1=>_Ox?0^GGtjf$)gK zpf5%FhWR@4MrVWNU_i~O;)uVcqbr&Qj-50@TT7an)g^y52O^&@CVvq!{F<^xtk-0# zrtCx3NV1(w+5*8AcWc2t=}n~e6wN?3i4Q`hA7xG) zow?pjZ0|9VbJ|B4?`mk*JnA`0pC6rOgf>CLo~6F!oS%wkeHOZ4-5Q6U*+w&QXsmhk z79(^ObSd$UIP>V;M(7;0E&Hw*e2#K|0{7oc3LNE`r1o*NFAn|gSe}hDPeTh2(e|UH z9qq^aVyAMfLt0=f>tAxbHPE$f(6}nT1NjN`XFlQ4DMn~M*GJ)f7tpS9+WHvz{y@G& z>ODHv2qjYP(LVUTocSSXjrdOUdVDK*ID1`h9=s8|LawjiUOVnR%zJ$~fN#93e1IRx82aES>w; z4G72K6RcunAhpaj%{R?=H}msy=H?UVRgYy}dOO8m@Uy40O3}3=U780Ddt9OY{sQ#V z*YRC)H{YqdH85f3PIG>{4164Bn4fxv23{}uz)bF%%QsDP&CmMW5(wgVFZGw1=7Efx z15b0#cZB+%E_vTP{d7U7%dc}xNEA#-WAvpqZ_3CQT^T#eIK0_ETBz#W&!P! zABF`^dGgobvuiJuw}yLZ_6c;v=7y|gqtjWwcp z8tX;(r_g@Ir_laNXrJTHg7+E8T&SkJIm`$7IMrS_E-&8HzNq=qP!@DJ%@sO0cGjx-qdBfn+gFT*hdE1XTj(N0 z4y0$Ep7kpS$IXdbxF1|7{(V1K?sNppwc)(*L=opI=tZ8Y~THA2EppF^9DnMP=O zgr3cyACIzU%%C5izt>|T+p}jtYl^@S`08`kz3?38Q^b?)iNZIm71`}%Iks3?%#lp{ z)L$|JXQ79g*tUHR?VC=W*>_>D2Mu%VyP#*!-y6diVUI-{l=eJj;rk7JSJ`jL#&rjA z;i7b~+}4V5_&UkJcZ22@7z<1o4BMJgPu6Y1P}n|FmvGKk(=H3lfQE+a+DKioPP(v> zlTUsh99B2b13J4o7cS_MT1|(DLW*jw6kC zfSx;bab~D9z3H4AE(+E-Hep|arC6EO+n<^q4g-CbUm6Z&7~9 zUkIOo&Yii!6*}4mUZaC6bS{G7{sxBo3JmuI`}?oUQq0TCYT1MF)#L2Jd(44dv&{DttPeqgVk}se6ntq+v zT*w+P=iX%6I1k?}lh{AzVf*t8z5!3+>#_qnoyXX-r_vrj?ZD50HI@3G2LE<(r=gee zp?UhcMrIrG$2ZMl9eik}7Bn(Xu&)=CZ8i&Be6IxlWk_L`Iheh#s8=IGwIdauMuy#m zI>SD1;_Y(wNBLl=5#0gDMRAwr*ktN{8tet_u%=M=La>)?^U}dt+9%V&S&H8TpQN~a zsA#_h>w=N0D^7srPC)DA^QOirFO%|wsZ`!B^BJ(Ap7G%mNqevlpDK#Kg+8m|Z=uhs z_z?DO#gDRIltX7l3q`LdQ`XZCj#GK>Q{K)dAqWl!|z}Pjv%4>SXV0g!cvuDq~R+vsSGb$@@hn$CQwmrlh4IW~FHExh;7;jCC6P9f^{+lkCErBo zL`}Z1Ub6irbL6V}pc^9Fc~Bg}#M+?%R; zpkqhCb_=;bjQSG5*+;;3!=M*iU2*1K>PmLUg3qeVgl2K(kq$|LP0*zqn#Pz%z*ZlD z#cmjfFJ`_Yx`nk~)G`j9Ar50oYy|d^$~F0LdtmtTK70* z{DC~<36Fs5CU8BG_7u~`(d2oAJPE>doRuW-u1ER_+tJpUxuy}pbc@+D_k#srWe;6k z`T=$bxn@h==OCE0C+`^o)A9XmD+H!HcyB>S-{xjdwN8MM^c`&J5S;`=X%9Tfw{cF^ zeh9B3pHJ|t%oF)w5*7g4F;^Q~$L`iyKKf~_%VXdwU01`8XxudKit&y9I@k`GI)07~ z@LQJSbJL5j31K=16EaVuItUJ~18YWc-3f3VbJ#us7IfC6gX`pn%43}X|H;p8F+NpJ zfJt>7<+VG2>!cs5d8hU1V!jqSxNhqOTqioW3_2%V*Ou_;0OsS3(7RiH9NQi2H#ATV zZtHku4*DWF=BHr0HzL^XGtbR|ZTMn4LLY6zk6YTc*$%FI^G9&qR&Yl(7~}vrupzc9 z2d{O!G6M|xKG+U=pn7^{nr}w1-FDJ_1v%!92(DXG57)gx+oHH`K?H}@MsQute*)Ll zI^~6NUFC)H!niK@pTKn|9Nfs<6YgT{f)QLNJSS`y1lx(;*2i_hAHj7ec_-nxlf0wm zZ+%>+xUijcSVu%~-J=a~odM0-`|7M;wIDnO?HV@w@oRq&>)i|88X1+ATRrPnhrw*Qv*o`yfwP!g=Pc#|o{Pl)k$A3g1kZg1p8EnkcOE=CPfs`P{L!_;F14kmwC~S}QZCrN_j4V7C zu1~nGv4h7xioC}|--GSG0^6NM78J#H=a4a>)8=5i7qMw}{Bt_kPHhyfYh=mKnEc^< zNShntIo;>`U=F5>;<=q*yJE?aoGEJp7hKFx}t5bXy{rt{hCarXHq~@2Q0m zOxLEgnYkc>>AIGF0;X$bPLAM?iPWDA))w}dLL2z5gWZ)q?NmW7c(2WC>o zT=Up9zCaYu4KDk{9Nep!IY79fQ!Zin`+&zCJlD*@bLGhYy0AA2+lfy-37$LY$k7yU zZg-*X`@nNx9_rr-M%X1Eeh!|KpHbmC#cwKWMxJ!X&uBaLVbT4QU^&qn;kqcE>r7cw zz=)(H5f*t5S6&q>}p#ley)Zx7||j+FOpJh$D! zd_HS?6z@gK_k9nZ6P6RE`^Vt9M&P**zlGA= z#dA+Kz;hG0m#=z+=fF@?x!;2N96UGn$M9TYU|u~u_fkDPC%o1W&pizmn+HDo0~l_6 z1kX+2dMahy$GtH;{|NWn3Cndz4YcF>$VmJc(4G#ou@(7xMev+(=0!Y5Tal$k@!UG{ z@4wdwt>>9_yvHZJTMXerYKZfNdu;&*4 zAeP%rJ=m;LU&>X`f{2{%P0m}=ew~H=<{sp9*^ZoU2WjcoWnpu8QBL;;?YoHQ#FwU6 zlOlL-;(rRysk|tjiU{j{7e7{PPF3wTathUIjV!EICO$?9Hb{7$_K zFM`ajjyBYn)rsGT%Idc9UW#vvV7fP{L-9AMBT8dm2P6I?G2M4?oGbPcj%y&ByM*H| z;kZjU?h=l>gySyZxD%IfoO9lK3CI1D0C7h{jf{ts+Z1H>*>f{lE+<=$Neju ztIkfogySyZxJx+h5{|osfb{kXIr#c{{6Tdj-Ot-gVc z-+t^?56&qJS=jg;d)f#cT3s0W{N2LPZTKho;xE`PtS<}|;-BPk;uVDQUGgdZM-JeB zP`<}-yM$a5`8-AL*@-2`A z{Eu|y+mS>1#G77hRk!2sq8<9(+tIbWuXh&u?fTAq*!H?BddjEJ*O&j1+%(VF0*|O8-r?e(mSAo9z>r!gwAmn^sJFU{5Rboe@9(|WKl-WOHSE2sYS&udz4lt)RSB<-9bVR3iJ3Y|oM~r# z9wqOX#87p??~(XBkDGgzSol(6yYsszO1AJRkm zApM8W#aH(lML)D$>JDtIyM~yL40sac-2JMeySX>1!_9rkzDj(dYl&%;eYM_pL*Y!3 zawvQ$a*ot59064;$stFdtK4ubcw-rAiDjskSOz!^#xZW9$b;b^rcvU{tmMUT5Z5@k zGrsf0%Snu+@Qgf3d&7z4ZOuD-gf<5e%lmE`T)z1FHhAM1YKUj3BbM_u#_wKY+J3_S zUuFF6nJT;^$sUzD9-zIMa~$eC@>f(6Tlfn65>L(fTFsnJzFqPv*Si!wlYTu!4Cgbp zAa^Exc#t^Gr)`0rr^wOKk39FU!TG$G^Ph*GqP)MN))OCiA91Rm&$JVl`ZZh@H8D-yxip z9ch0iv7Z|i^4HTh$#>I=eo6Um?nTPw@C6sbov~U8b03-^u?>Obsi97|6)Ndp8SkJw z^*sPLW;y%XQ{RK+8CgKC-9RH=m7EQ<>U#iw1?u+%(3a$B44@q;=g@|fb7;dj4mW~vocN_mn{AcsD};kz z{DkZ9r4Qp>hx3jlcg_O(Q4%eEYU8QLKfjRvO@ZSG|8w^g$;-?46T!YO@yUk=nKn1T z-TtlmG+gZ^JO{a-caS5JQ{iTgeTppk{sGBL#PcKvP$6+sb=kB@ZlIw(gAKlfx*_Da zB`;Dx+Ubh#eq9WF8{|j2f%a~-wesvnjuk$fsKOVdd5{&mA5I`A%XezoWcKw}^ki}w zjhP%rPWo@vq0q zl!q&N9&yp*@q?eqJw3raX0WXtsOTB|ugy^Op7bk&zV_j~_M8{Owi-_C5dK#uz>Q6x zL%5GP&a-pgy=*VEQ}luSKVp;Zc6eH%$<4T3z0gL{qls(U7vt0;$cJ#Dz)Ajr6nH~g z!!w>_@HU(y_OyNoV{Gg0Vns>zJkNUwW6TN-9FW43QP;*-4sjnOrs!GXGV2OPXwP;K zUJdd>5!=v}yjiFId8;O|))L<&vDU}%`|m|AEr}^QoG@J5j^97Aw(jl32z-zeYsMZK zKKR5Q!INu zHdyMkx|hxVM&0j-<(Sp8p893qdg@?xh;O+aad&X9;EIs zFw2LQ4ACSH_IUPX6VqbwGlvHma;T6PWXadtuytK=T`!xuZ;kWExhaXm4%~F7CcOEQ zi=~0Q~b`Xqu2#oq3JY0vts7Ju4Z^HjIgz{}{ zXLDUO7jJO_8)DPJsZzU9+*!4?`gVKU$O>_@(wph_;z%`I?Um)Ljt5rHWTjIphZ6WTNe8V#*1gM>f$CdaCI8BMkg{O@;%!|Bv zJr|SPpHqwYa+3@FB&{6TMV9+wcz1G#;)+Jdb}T(V&-+5!Lyw~?m&r|oyqexV~W2vxKWmptD%u+1>F1L>?HP^`Q1L5y<6==F0`X= zg*isJ^o!Wrt?C)-sT>%keeaFO{T@9g`*fa%oTJlsi4m9YL%!i%@T|yj$qRCtx*Owi ziOHSVv9;P;&h>KS`8Zapn{lk@UJTnAE}j(POKrrn7836%94m#ydQK)*tv6gf`Cg8d zNyN~OW*mmYyEB;>+ChxRMc~&d;MenB{CWobnonKhz^{@+Z5(xu1;3^$f?pNSThOq!L1y7zF&fRpWvFAiEO10t~^e2iqW(B+=ym+Dm zkIzAWl~)K40OdAtx5X33DSApc=60!R#L!CaJq!KnWwp31^hwGCs87n^3wZJp4L+Et z@~y?kX9;eFJCFIEV7;DT$X@W$h<@w^j!cD@Ms%D)JCe&pp$#eTV}2s#eaug!JeWG+ zuyuFk+57Y4b%#H%r#IHNCwzdth_{vdh^8Hr|HX_SK5p=maUnjUvSqSG_rJ?Mzc zO+}`Lu&wD73cm{Rx;F{G%1-vhsTR(&bKU{)#sP5iLBT)Z@H61+K%U>BA&MTy^E?ag zGU9RbocbZ~VW>%2@^EPOf z%M7j+>^8_L;m{Mj_-naVgj=N%JLV7g)cyy{$dJgnw>#j}h9kSkny#t-+{cx0?Ck?n zp6KJ$eK`&Gjm*_5drR5mS>D&lsSD?_@A$hx%JzR)mE))2QMuJ>8D-Q*9fD5KpP0=l|0tPKqumcXZU#HTJ%)}Hxi0+5f*q5Q z!70dI;pOvTN5PH4H}`9><4hlBMBcvg@4$@6Qv=H(TZL=o--Q{^Pmk7SBD2l5HqzF= z0W+d6mijOwI^(|*W|Xlpv18;_;YQ(C79N+)25yW5H&(zkCb$tkRq)!x_VIA_tyiCI zC zaX;+n<5(Uo*zvz5f^(%G30~|NV)RL{V+puSb3BQfd1O zKkNtw^}~*mGth$lK{%EZRdV0Bh2!rS*io>q$oL5GSWoKO?!%7MweB+5F%@iTve_x8>?jymuwpN;>Hk{n*b40UeG}|h=EaU>SAiXSBGY`>u@|!KYO!Of zU`N{VVMpOVPNTicVaEi)j`x|^aj9U(drj>4s$j>5n_|cJyx1`b?Dzt*Y^fJJe(lAM zUwg6RI_lZZ@lDhr+eKml|FXloPM0+06W&g3+Mnl)_@&D!Hy0;?AQ(r zDcG?+IIM{HDvt(5a?n_)-c zSjMLAIci`>IF}9V7|wU%&$(=3M<3_1k4soMUHo~M1v{pJ5w6I)?8nb{MeI1x#ExD6 z*aCL6HN}os$Io|V>}c}yUBr$}`T6$1&zF1|e!kyvGtc>uxx>fccd_4z?e6%7YqVI}ycRoP zJZ*l$e7FyGzzZ(cEWNny6=a&v7WiqSEl{w&*aB@vT`x0#F>QfLBj@s3;rKyTn6|(Q z!xs24bNuVQw!lxkw!l}snC=ziX;WL^2I}_Zst|r>;rBKOhwJY=N&d;<{491}I#}OUdg>E)Dm&%h&=N++qui^x6U|47=X}o7e&s zW8e3*XW9a7URxlX>CA6rj&mhDpx6n8&v;Uoh%0g~`}p~q;<^ZMT{-qZ;o}o~;12A8 zG3qXGRT(y^)2wI9Twx0wiG9F!ViPQdH?cF=?qRT<@GkqXo!A5?!I3?HF>Bfc%T=cr z+sy^r6;g-b&sVXjy=P#%3bhDZp4bJ$!AN2k6l}MZzDTZV6Wd|;0^7~?V!M01cEJ&p zdw}g4z;%e2C9nZvGiWhrHehR^2!U^rO;R&u2U0Q;DP4Yz?rM@22wGBKb z^WL7+wH-WW+VNu8C%k{AUGF${K`9@{E-1%++<#z3>iZhrzi>mxcB8He@Tb^-dQg{O zUuiSSSi`=^yL^oGD(2+wW2{#h$9b+&&c}8W#k-Y#Zsz!@=*epOITl@+4!>ZjcPyoM zi)ge93U}!^c$Zxqlku33z1iR~^{(esdwG{@unSf{MP3Vor>`8Y#0W4+gjx#b5}v+N zu$K5+gtBikGC(-@!v9jv|BdQu?1JD3PXlA54jClJjxo;akX2#W1?8C71r44)#>unD ztcmT##{}MG#=zGc>m}_7PhY;GZ|8U_?HN3M*agQTGgeuG;a%Ry8flPPNjW4a7%n}B zHczl!fY|#ssuRI=)obl=DI-JM2gA7>4CitXoXf%RT?aD%5w7N7P3(eOIH#^t1pLg@ zgI#bt^=$LQcInhtEp|b!=}LdZcG=F0?R<8@KcF!64HPID~a@A4eY;O8Crv*(M0*GPq9OOD$MX-c#+sOYMRgV7tkUc0u7? z7Q3KeykBP*lswQ)Y=Yp(CN@FV%UiMuHn#`L_`4dezDsf4F1Y&OsblVQ2wb-sTb$s! z5^Q9Lu?ZS{$T!5o<2Qnw8YWlY66|@AnI>1?mGWs!!mg5k8Jpm0xcIvMF`k?nCa!zl z%e!oFI%98qf&GH(ia0MiC%#!ejf=Rh#Nh0^3{T%x+5^S@>9YrJZLF^ao<74Kc#)@X z*k$r*Ofl?$__r8#zzEOtUS2_ejy|yoV%v9{_CV7XSVwvIWpZkWJrFyfVGopXT)}gd zas|&=%Kr}TDNW`!3+v`;^~eE4k6?y|%jz__^%C-$nAG zH34l4U>$Y~K8laC z4*U3+Ky@=dih=>n_1!qud1G1UjbW>>4fVKLdwY{Lv)=fHU5l?4DfjrsV?1Y;EBXoA zD;}Ce{YmPvh0$6ZZC*Djm^Q?pg4`FZ!9G4l)^_4)LwqOV-Mhq>5RTuS)G2j+NRE4{ zZ!PPlk{`{k*wOJ}>_h*cOMUsvVrlEz+mg73d{wju&V;|&tn+c!W6y&tA0H!jHTZ#P zL(cmMe@Zjg8TEnhB%jq$@Lejruad`XF7;mv@9T%~I`5=?xn?K*kvtryjQ&Z^kKO8H zqm$St?MeIb?vIT%)DGDV4TOYV%`;2a;P^L5}S;dHJ8-|fPuQ*iMv`XjkG zWDV;y?a98=v?u%SK8~Ckb6EopX-|H$ zya>&=);k#=3R&m%`6)^sji0d9Eke(qVcb-+E-3Tw8pcmuMz~hZ`rs`cB$vi|bs|1J zzI^|Wqo$RUv{hR=p_6kvB6yWYGV}rEV3wZJlIZTqBV(JE=lwym}`^NdgR?HKE zioj`Qj)sW!zELB7RfM}}gH`@Z;G zjI0xxIntu=F*9v)7QZ}b0q(kXKAW6r7c+CAB{HT=n_L;b#YdF{uT3tyt55$9pqua^N(<3`fD6vZi=6!CN-)n%L+fFUf@_xz83c{v`jI$oq8h zQDeM?bO=?e1`g9i?p5J)=JP)|$UI{nK4vlpX>p$6wbzNi*e&?Y49171uFpu##T?4r zjqe8E-bcV5@@+i=jye=PLMyp8Ue%Z*bi@Bq#&9=q*Rf*O)UTJkXyKmv#cmwGh3B{m-B^lTD?`@po8#1PWxg)o=&j7xc_yBtw7>Pb76COT2(sJ9{` zS%+Y~)bt@1`6}P|6mPv#sQ10Th79s_2d|oK?LY^9T^w`n~cpe)?}XTKps5KyM?)J7q%1G*5PAV=(6Z%$s0e&lIWVmuWAW> zEGFk0|F=kaDSnqee@ND}eHgY{wdnq9+exf#XOYL(xWRw!;VLzTD(BBe~zvEVI!qtoSWi2=TP7h#PItXrgu*~!!edogT9V>W`>#Rztq6E0sDGBOfFwK#b z)S*O|_Od3rD#;a&zIUC#)^rj~Jl-m~!V_IjTLVj1u-(VIIL@4LrMJJhS6GpQGUHdhmGz`1}~y{5aVB>hqY#yPD=P zPxR(7Pjs1i%oAN^9&_&D4aVtm`nM9<=eFp`r%UpgA6&zjTFd+X1b?f~c*p->JZ-S( z|2*?^!n*}`pY_lCeUrsrn`Ti){anzc=*L;P+R5QL+Ue2R+S&WFv~v>%Xcwk#e0QDg z{$27;e=e|Yzc4j`{ec`0;=Ewaw`)Jn3enO#5771m%)Pxc@-U;PQ|pF2>=8w7PTudM zKhD`PpKSr#9Bj|I*q#rAV~&8!rvIgs`E)3`{gTPIw?}=Mc%F~%2~(F6-;>CBe;eme zTX9W>Ez})ji$PZ;xCOh%bKdowmtdR+_5%yrsWXA&l51CNnlF>TWW`+(>H_ka90co0 zj6@(lv>oC@ur-IMOaD@a+z%65C9x_A+|^%lw{qk3y-yEVNr_S?u9I^$GU8-S9_=a z;MqAl9=gE$VY`s+3Esm=-a{PnI35|?2ie*e89EbLoQG__ft)e@$rW=iHmRqk2dJ|- zZ-dR|p3S+hKN+QdPt3@D*sAiB*6x0`6wlxB6W%*b&fBiO_+&J(AmrPj&gs_HJU@S$X6`w~5W0|RUv8?Al- z4#?&DL$Ttk6s7KGOdeqzJ%KFgQL&+Tsx{JGzTQdxUxI z9`^5Le<|nu0B+u73wHkiX8!5PKy^3xa5i&-BfN{*%m-ed6~i-W?fC)xd*;a?^>ysL zyTG`+co(l@>;3%67}gM4ds;Im?KdkzO=O;x+p9_y54IAokae0qV21 z5YJw00GpZrFQ!dW)Cta ze}>qxgFo#mj`{ifV*8I@7i&t0C;i8b#V5a{3Q}K#`c=rOnqm{ga1;jio2x!H1 zZ9Fegew!GH#Q_d%7;QZA9Z4P!dteaplx;i?%5@nQtur^sN%d6@FOTr0NM zr#NTtbn?UT&T_cEeRQ0muIEYsBR&YKI(E?4Hfo2A-l%LD=Cp zDpJR{>bKL0^~4sx7dwHRCvgCMz_S~b1a}&E))LGdRGup~-!F*UlV@!w#*WwlV_iaQ zE^g*>L+MX?uXtnKs!--EV8k5yy8^#f;`7`quxAr%<#~{~vy>lX-uzX9VDUgtA@z<0 zlZl_Qyt`0hD#j60kpXVg^Ru;4N-Ni6N|Nh(Yq;xRr!4IZ?<21`I`1KV(G zcxegS_sd7Qiuks_EWgdAm*=>WD(-eoVr&ojdHRlWu*e9;onVrOz%IS4F|OjRH@out z1*-L1N4h@SI?VMH=M@bMRAaxfYVmt*TH>Mr&Gvqv7WrY2*48%R^{h6D!@5$3&&L}7 zW|yq5gwrN-f>N0qJ;!mo{3rG$pFTOdDjGH&m))-Dn>kjc*h?pIe(hSP#`UE#Z(`0? zI+=OaQ7{|0ytEz9Pp%ovPwGHFxuV|;)*P$tS_tD^Nl6;^+zeL81w-U$V22{X5$7g+#(oROt(<2AI|OJy+AKwukP z*Jq~Loh7LY_6Nb=9SgP>Z2ULg@mb!n-6j~@;aUV%P77OiW0#&e8n%^E60ZM` zwvqN>^o4ueKaBNlc@Cw-ySPr#*LR<{o>ju;-sor_pearZ@k22N{$0OJA=h5qs!D!> zoyP9B6n&9pDVon#%8NSYYGHiGo%uc6*11}m66AU-AVJ-y2o`STdhqs}HFOeKx0S2FYAelS`#9~OQ%e`{f1Fj(#z$DR z2d=?x0p_g-^R5B&z5wRkZjE-8SQYwWqb~v4Bc6fU8cUdK8}H%K`Gd4HYpBc0w~#l? zsXw4NTvM|GwQ-Iht(@;lzM~%H!(8QTqr5R*k9y}_sXtBMA$Y!!c?a|1(y*RJyg2Wm z6=N;3G@mW;@Wyk-MpP=#{eeFQYY%s~YZJSKFm7@fKiQ0WvZ%-q*5y{NLFoAJ(1cgodIX5<=v9EJGi9`BK>SNG1k*?J zn2@U<%+J-^a_rF5T>bF$T>UzZ^*~2-LRTCmhD&0?s`}*WmHl(|M6hHlFy$HibI;}F z>Ob9|s}Dkk-h#|rjJ;`6dXVbE-ZT`va0>hCYSu!Bfgc*MfgfYN@R&0|jbW_>n=bjO zH>kab+a#x<=L9}s=|-Mx;UI`WUWc&_W$W-vLO123r-mYXharbeU-K}}5m&S}6g|G0 zT;0Ra>Bq2V9dia!e*oviQ2&?IFR>Xh)Gx6bG45jO8q8Yq3%)fUbcL+dPDXc#&F5i@ z-8}?5f-lGWP;3ch9Ixlz>ideVkTq)VuaG*=PKeTCzy@YpU(uHM0n2&;{pGxA;63ac z*gmKaeS^$%A6=>FL$LA7`d}&dHw+s;HZ=Mp_l3QI{$N+|yl?c6^>OTdJ+p(@7vqV+ z?k83WZXPtoanhcWLzkCM)JaoO?F}j zMa|%RpS^z&_Ws&4R=xVXRj>Nls-L_mS3i-ROMY3#-$=$ITmsv%sjSDI(gocwvB_P~ z`GY&hs?*>WAjZgZdPuHbhOOxZ##|K7M(j_E7<-$E?HUeNJ2Nm>uNs}J*Nn;4k8SV9ls+o`d6wo`xCZ2BtsL@JWcm z*4dZ#AH#MXXN&VZfz7#ZUTgJJ=7q0JaHwmDYg}>@IS;2R`fIeY_ffmLkYk(v;82%v zto+8-Z0(Y((fvMihmV*?Hn0v61)hBj8@BmB(Q|5sQ~!wd6SLgLa~*9zft~Fmuy0@5 zo{5bvk$Fuk`t=cgZbhG@{0j9+IoKAA&u?qBgm|=5)1CSe=8Zm|-(%pIPSo`nJ|FCN zUq@X};A=wNoya3A!goiO1r$W!zu;6La`dtGgb9^qN|9+`3U z!5~%gv95k7P_4tBe_rI(lpwVZyL*4;H)AFTsF}=BhEC&nABWbJ`Nyq2`QDK+4am(S z$hDr#f39Or)0H_%T^~gk|C6J=!!_|qshc3aB46S=9>6>P3SNsq;<>(3YsUzOL7-Zj zt?1q8S6BMlf%DpOp5)N3#=dXlT+ugN$OA7-^=mS{po(Eeqppz|A9G|*iXezw}Kci(DWqlwY|1RNEkpDheo$vM06?xbg z+eQ6X%)8jerq{N!=~bO<`hIM}o#C8GCwFaa?~%lJUG(KRNSdJb9d@GO8FL~~d&_{W`P4j5`>NEX0B+hCu?^1MS1M3~O|K$l+&Z*tordRi| z88Kcp{TV|?;))cmtpXp$OD=7$-)DO^4cm^V;R=>(E~rlzXy$L@?fw9KEtO2aFevukKb= z7mODJ#)}k;2R{+(;+N#o2IIxv7Kj}+P(8aQsxg=L4CKra@_Z+P^&Hq2&SJ}ZBG0BW z=fQ@U0IrK?8^<=5Z46t%VC2B&TNwrBx&sU*wmI>yJ@$`i?Ibc!I08-~^BzaO#orT1 z{61}pZ4aG!7McA-p2+Y-&tHuk)Z#;X`CQtgurYu;-6OF%2o`HOmv(~t46=L1{ekNF z0?DPF=sAl_miGQe8!zHR`w4A`Z^Yx+WW_h*F>JCvf8A=Z-blE1e0~>qz`1j|T-xG` zB0julkoTg8_YaKJzVqJ440M~=93Mx|`QrC=@ZKoaqkXxwB?q>j(*CPtJ~4{ zVd(xnVBPg#+{eM~k}vylF#Mf&3EsmO=6sI+J=_U>unpl??fx3>gg)4WM*p`sa%m@c z&Ya27tAca&3!z{}&P!#i79x}OHOr;_D96P1-f4D-0Y&sts> z?F%k`pY^;*`e5eLHuG(F`paH&X{Ycl{D6;AYqhq2gq8~Dl+$8YyU*E6E^Us10|$2_ z-*%H++9}92v5QMCZC_q(a%qF@{Bvoq5w00*qT*BgJ{UI|yQt|?YhmBTT-v?nq!?wH z52S;`sx9Qw2HW}Mjp)QO#_D_6LL&{VFL_|83#{++sTJKD1@@Bi3p{@*zreeYa!>H5 zlxxrzg~-@4>JxqW9yYy5=5M0I*I>(wVm@cq*EBcx3p_)!KC}Mjxw<7z|7+y7f$gYQ z>>-!r()PvfFTbW}9{4UF-75Okx6bIZm(+Y_)ocI3{9%Jt-vUR?*KpHhAd?1n3&%$x zTnz<>$ow!ATq3@pq3oNCJdkG;!FiLB5oNthKinmLxwKzsmP>mw@=30#2H#C&K6*=g zo9UwqzH@Nw1N<-yA6@WVG{@h>XT$K(9WA(PBRp|I_~_#EYXz%O4rwj^wsvg-bI)5+ z0@P~o)lBTjw>&^ReeYmRa%KDH($-S(`CSOdYdVE%4*o||M-<0`xIU5N z8aS~!BTUo4g4H9LTciKn=&2Rp$dAB?2Cf758MqFd=bHz5E&ovs1IEJx*KN#^1FyeAB;ue*q(| z1S5WuqyO|7WBIBuVrxH)XyU&qV57@pL=#7L0viUWfd9aXpi1 z+Ev5$fKKZHj=P8veR%P=U_`MYMiYlG7%}BHW5nhdt|u7uw_wC=UW~X6jNK9j{Z$yT zUDTB^Vm^9#Dl&HZZ^wugei(7v|HT+_y%!^H03)sk8~y-BT;Rosuk!x_81XqUqS*Ze zBfjQ`5ub045vL1A-20!55nKP;F{0~V!H9Dhiv`HJg}-CO|C{Z8rp+(%B1UAMdqs>` zjQm>a#fU27=SWl|MvRwy-CTds=9kvg=GO;2*WVA%-GmOz_QP{Cz;m;_cy11OuAl`x zHxN8GBu8)MwfUVDo8NTs+|;YXbG0sFn^;eXzb63OjZLi~p0y7$WXAnAwTg9Ju><~R z+57r17Zw{?ALhj~?iX8M0`-eMPHbIbTb6ivvBybll&rnRdj8DXr`YTLZG94(FZMr) zt$K_(dmM2Yh7FIoxY+dcsZm-V=G$glrv1;f^Pgm$k6>F6d*2J-vtv#$ z7;E0O*m6F=<`+soGT<=!z-#l9*!Lpv+wq(fd>c$W*OPJtcEWn>Jr`|$CZ6jlcy2%n z+=+HDobb#j@Ma30lmEf2l?t9?4T?Vf>o&jtGw|FzSmy8Z=gFI~aUj)zPHM99)Tf4l?FXXZ|zsX|rV@>xFT))}5afWw-?wP@ z!~VDmyI)H-znV@C_&TvQwqWx!@Eq&Tm*BZ z@tm=iJM!XMuEgRuvHO8T8|{AJQS(1`KWvZwc0YyjnZ_8b>J*NhWJ%^CFrFJ3D0UiI z{}EfYj8U;yi?7HaI2y$l_hI~4LfLj^ThoK_*&F%ShaYnj1>4UR*LVk-YrI|m*uokw zaY6oTypfr|eT`S*_5Ig)Bl(=GQ6OwA)RHzSQRTNtRw+ znq}Jj#75ZM<~QLQ^V*fyG`0EtlWPo{Uz>|Iza!cD@!IT*>%tA#6HjDcTo>*HM$GVH z#2#S8-YsCnGue9O`E0m3!{O#M*M-lv%OM_A^!|F)@eAw1{uptF7bDI9BQE_F7%`SL z;kc_=6ZT@n8DPYv{{lvg@va98MvT1zMm#?~N}J)uh%;E9S$aP)0>)bFl`&$B-+FM| zW!8gz81ZrR#>-xeIO7T!QPzTE{nmoxudo*UZ^wwlf7KBGRYm;Q$)B_J6E@}&kzmA_ z9Af<~>KN=SS=d*aW5kzz7%}u0Fk&zmF#(L2{GWpnU49sG33%1Sh`YgvNq!h{HyDxF z>=rR1>yHDHu7DAfu80v|@LLxyy6n2JKSoTtqRnrK-@5P%msuCS)aI9TS)1Pyzjfgk zF0(G&+~#+icis6m@4B{ua8>-$y70eh z^IMDz`+$5x#=0;Vu?SiACi#bqb>V*#Mts)0E^P2Qff0+4Z!aM0oOnB#UHm@>M!Xf9-#ITvyvNVxH>|nMFJEkayRU5X`$deH z(rjJ$-+>VmFOLydIt+|B=wHEz|73g~K>i)!$9(5^jQGFT2k^fnMm&N1IwNuKV8rt> zRze#wV!Y%8XWU%0`K2_q`7H&{seX9w4e;D@FP^Kw&+pr8{otN#a}D>O+4|uF*_W>2 zt_07yFXB1j!sd5^_*_kp`k5Yz4R?>j}DcT4_#m*P2c^B8ze zasgfH+b4XS!dvC@?K_Rn(e*Zb`|u}x#qjNudl%onR-XNvBDGHqo1f(C*>3Fn9vh?N z=J~!wo1f(7`4u+53E;VW#^_Y=+#2xQ+HC#&KeFKgV+^9_Q^0dp@LZwS=2z&o`8|g2 zUyaT0)MwfHr`YSRXYD8y|G!oE?saB8X;7N@=i5D}KVi&m%GQ4>&4#nn^zjp$-#R}Z zzpJwO%~JFc^e5ko=SI-})J8n_9e6I$56^uEo+C#OcEU?-e&B`yiC4gLaGCjRezThT z`3T~odIYdCdHYs6osAD++8?@~NRF4h+O{Dx82 zRD3PP&u=(&O~dxulAm95JQwA~b5Z{ao?C9eGM<}-zMO+Rg!^I(9A;m`Y3A?e_n)2< zoN@9jvZ~R~k1;R_88!mkY~VSt)uSADf}IUK2d28L&Cea8Ed+-dety{AgfrOi^IIFN z6}DjWTY@ZGh>UrSZ(sZXYgUHi4~We#U)ubV_Yt5zL>&^#ehb@bu;pO>52Zgt=wmMD z+`~EI=U21RYxCH!<+s z9KX1ZwG!8{6OPU}I7Q;rgPX+WXL4sgM;yYT4SsPQ1;4@OSI|;i$4)pp{quzrKVsPY zb`sYSM_dPa5}fha{B{!45!WoHL*g!cIeX|k@fj_~bgaDEm<}_JgIFm~3I4ifeJ#Xv zxUVjzqud+QQQjESA$3N$FN^2a{&Gx5g*T?70>4=q+iScr9c!A!bo^?YAKW zk{WG(bpx~YqeD!LDEY?s4bRs1kIXjnjV~nM_`+=clq*{oUiZ^W(C5Y3x&=OuT*^1I z70&mAqqFq`W3q`Qu&aM%-?0L4=bUWa4hK#M{5O)<5#G5*WxkL-UQ4jJQI zVrQ`r_~jX|F!PLq<@SMV?Zg2ImxK5uJBS6spS>~HxZ9ie`%GS#R!iR{-mI4U4u$hV zWS$$2Guh{c;3q{2AA?W@%i{dZi&ldCpQU z^|o8fJ(z9oq0MBYUOCUmW4>I`tH6Cy@4=<$1pL9pZ@LBy7>a+mSwB4W(m(D?%9ZFg z$q8n*VYZp?%{89iJlDAD%{BgpqMy4T9GI7l?-g^8>5Mbt1SQvaDs?%~;nHqf?!kdB zAKW>qG1vIX{A_Z9Tht!jT;r1OtFwQu@d;qT8QFTxtZcn`uJOMTqx4;#aC#;|0E4<4JzG#&;XJ##68*pZSkyzg*++#r2O?>(Rr1 z^5z=vPF<2~yglcZL`So2IoEg)Hfb~0c!K9JGP*I>IPIIc#*>K2jPd3g-%ZTY4&f;A zB=F4Oe{v@fYboVEMy~M$Z?5rZGuJqJut~0Q`X})p-Kp(a5muwGPSzVR`ff4-ffkKvku92?BBOn9***LY8OvW_P>_3p%5U)VH2 z>qR`e5kE^j z$K~>kC%DUqT{Gi3{PK+lORTOp-#8deWRGzDima*ub2jE1PrgN~1LJ}FJax%(9=;X5 zz4%aKLfZNMM_rn098C5sTn2Ru*>(^v1@ik4OLr<^D0#+-(KcegcB}7W$L~c9w!~i@ zAqV+!gM*Sh2E^VTzgc40qdmgq7!8+~@Rv5`8h82U8aH#3lMCE)8~FX;{X9?N5Doq< zaQ($xq;TX-oT)y$;&L53@8fyO*WaHixMPsMLbAqRP9+G{cA_(-lF z4K^KPV$-T4K^JkUI7;>5oB7JKOAG$ne`9|B?u!&9!oHZo+$#Pq)DflAR$ zKPty7fBJcp#IxM;m%ICQ=G;MlY1Oah6Q_QEG+a*PId_uhJe{^BU(iJIoY#U~oa8w- z%H%nBlH=TopG7stQ=eOyS=%W_tA^XAYo(juOdle*dkCZvBH2v#(tcSiGlk&-DQl z{t0o?a8y^FApZ1BuKor4YtF-A@^h~KCHs$U$kmT*%GG1Rb4g&hx(0YiYIF71;gBeX zQzDP^$8+9+&^S%}5$_lk4gY+!`U(7u-`?whSI?pL!~XZm10nFRg{TF@YG+5<4Ijgo ziQ(P}|A_b-F1Om)CcEKKVw=b|0p5*uYCLT$g)jZD@TUuBp7;`e@>Hq1@!n8$QK;I7 zc9zmkU)p&E+vMF7q@7ZA!Q@a?g=2EeR0n)~rRqJiLfM8;M{D<=s26?_Pe1CGIuog1 z>P?`HudIRYm*FaebJFt?e1&PWkyo~(csbwh({NR8gwNv?w#CuXH|&*nQ3rLo`%wpV zd;UZnE2txmI)o!pa(%wVcl|UxZty~RUWVW8MR@5pmTf48Ps;re^^Bzs;n92C7VjQI zJtNFI;7h51qbSnob8D`T;Mx^DpI6X(odP4X;& z+i?Z;u7HbAY-QWvRuQ{cBr)8QV^DZw$P3Okh;1NSd_ds07rv5u_$h?zxBOPCTEVwB zrEHjM8{6(|8)gLR$7TiU^>YG=rOMS0RWOEjz`^t_<7rQ>e(ayQdcy(6+L2s+Ie2|7 z_o_-C&Sgxv6ufqJIk1Zt#^d0cal%@^gWU4-S|c54@IbVVfQ^VKAbJwm9|9p z%e?c?u(#7M_%2&}^57@3!PB_|{-Ai;IXiunmRPa3I1j#=zWB09o&#fy(QbcYTjhSv zgJT#Q?(^Up^ZtYnQg|I(c|Kwuh<)81&$(8c)srZ7z<;?G+x~Uvh%DYGoITXNk!y(6 z$0v?hdiPoEWm5i*x~2RbbxZj!Y}Zm2KiCAhp0T_P9eEwPY!`i#u^dEQ*Alb6QHk}O z#CMPN19zq2&zLr>ZOU82P9fXgoIfv9XM2b^;IF{l8)^3$cv(NBot3otCGEe2{*m!0 z<8l|AobX6`zEXnWh>Z2DAa8?=aVO*JP2~A}_#z)-d}WanBZq6o!`YWD+wv^eL06!D zU`ZhJNVfPB9z_3s#dagxC%L9AbHz@~8&8hDLn{Uct{oP|Hx;EmhAen#lmq$WK>ln& z{)8ZZLR7e8-LcH?uf5H#!cFXnVZMKa{$#<`BfLO&@XhQehr~*JrG-o4TI5n3ZN$@t zd`mogI1i91qe9h>Xk#aB#8dzEaMt={Q3Ct>Acqn;FKsL`1GxbwocjU3dC9GjNBs+E zFNXfe|K7-|BW3H07bx+bYmrNNJf~pVm1lH>yd1IggY_KVM;LvLb)SS&S8{2H%sT`} z<3q@&VCr4Lb)ArNGQaALd|H595&q6V>J(YEg0^C4YXbbaC$N)9`2_RKBMN+2)Gg&5 z)GcL&y5Ce3H+;^X4#><5`zrII~zJa6^xKt@Jy!Yxk|>Szm7Y^9PXli+wG^{$T85U-*z|Zw;1rV zAdW$E)9@&p!Po&qwv@ zw_V5);U4$tH@O#iZtzu;izU{>x8*K2{P}(QP4t=Qw*;?#lewTzzs0ny-|jZ`+k5|_ zep`!P`v|?Zi><^Th<^Jk`mGt#9pQ4m7yTwYzW1Wv zQl^WpOY!VQzsbJ6=(h|1A-XQb^Avh#Jo`kywe{+^6t8|W_-bjh9eM`dXwPi)*+=NN zA86+%+F4I|Kl*Jn`Yqx9NPN`F;lhnT&uvu`Cxo+&H27=Gg$xpG5wYO8O zYw!2wD>(@#cBL(L)oIq+eZ0o|RLSudPmVt`r-^ah8*)6>;6bit?RSf!eE2SFly=r5 zS$Etn>wf|I&k5t_f7h?2HNO+I>&uy9)JOi5lSV(xI!_q=h*@>Y=!e;^*^fB-VV-lb zA7<{AmU7$;kQ{fx&LZ-ETveXCK`HYcg97YBWIdF8dB*yvGIwsK3?Z6vf36>ssuPo9OSQQ8|Ey@U|UBnj|HrW zI#b@BGLE0*v>9yax|lWF#n`4-ImmD0Se>PXeVDC9ko%^`x-6|%VYb$u|A)ACu%*M| z220@L8qUqD)tz_a1_&Kb?CB@!mr^_YmT}2RrqrFD7^1Vr=xQBo9$)*w>j|_F0NTENz-R z_gbF2g*-wbJnwb^>u&7I_NXm%)!RJx)Rco$=B2znY+TBCe>eU=;2keA z)-JZYD6`O#vDj@1m9eubl;;r|sN9~<_{(Sf-8N@r|HA z2b+z-5=)Q8*rpeg=X6!L-*X5zo3&-a{rJUqKjJss`<*4-pJ<`YU%dBG zzwX{cnt%6U&F=l~lJ0M|(2rld_d9>Xy^ksBzPW`qfAQY${#EyGxBTIDJ2KCX%(El& zGL*<7@)sL2FU*j6_my-zMvh+MD@6u3%3toiiTw5Z=EIPASwVw-V6V7n6@^RU!X-@*iKyRgU+AwGzs=DfY$WAY4^0 z$M_E~>8kL**|i4B_<=6Q&wrI2{ovDWq1<0>48HckN=Ycs$f7t)DhuYbPF;X+m!ezd zW|f3;AC(2@DDvtF$4ZGe_m3~Xo86lOD3Y9d!pCwOIrVC6j?$X+D0L0F^%}^nN4{ED z19|l7EMcWbE#ak-o4U$kFRjf8*6RA$wfc4;T9p?giLNGRbV*GNedC$?be{3dcvtDj zdVE$FvtECRp59-uKJ!4qhRm8yO|NY(qnp&>eP1Em=l&&GB{lfGUeYdOwaGPp`YD8W zwZC8!?QYJj8Sc~r8plXe9i7fQ7-YPI5aS*A@*!R^UtNKNTy@GS`~m+beu1|;$W=Gk zBICfRuOe4ns&c7+U>3fCsbC$SZ{PrY1I2G}$i#>74-7H<1D|c;AK1As-%L>(uYX_? z?Yukv?!Nd0hrT<#Ro^++FkbKt9BWlduIJb(@cGB&JRCdUQgWXEk4Fab|7r5!J(GEX z^4uj0GpjZP6eZvjIClP`%tZVGTj3A*A$^!LOws30I^B2Q0rIDK^Mvo?-2Fz`#O{@p z_fgM&TY{Ne#mJ$UNV%1_oJ>x|R*lEa^HV4%8pk&~l%jirmFRz-Q;wfz{1jaHc~oN# zzw^YhWCs_e1}Y_Q202UKy@p(Uk@$1YDADw-D?$vVf+o^4HhjGrIIp=YXSNFb0tHx*jLW5mX z@jG}8p976!@5-^|!P=kjF=#y#KZW6nejWY_1;n3ZM=I*G#Hj=kkMT|-@gT%kyo4Xs zYxq#?#fO45dC%+kKj5d~X5HQME_qWPvIQAF+*SD7Z^2JIo3?JIt(T}@rQVH-_$$VF zUc#5`j?v-dQzoa3b0n?S$F^ZiE#C4_J0+x;2*G6-8Cs(Jv|a`GWxKQ zT+2zs`10ILTShzhOGq9f$#1;?zl$i=(q;W!&UuD9 z9>bS1nK~qYa}sq(Ugu1FRwQ<#BR(tmC6c?WLVZDra_4Y;4L-m>Ifze~oj8^V+7b@45Vm&m2-kP|gI0Ay z(GMovsU03OT05S7m)6k#ZeuJhV|*=VY<g>jMCleovKjBkR!*^2K!$};4 zU7aZ7ioEPq_&;nWx9(5)I-J2*_fIneBu_ATnxpVtf`C6D3HamVOLH4lG|A(0V$E4)+Uda@%O>XZ0%yo%3^-NG2fr{fOB zJALwG;Y%bwfVIRL5VPQs*o4Q(L4iMK*ax`Eg<)AuCF@L#;1 z7`2V~(w)YCQT$6JH?80J*E4R!$6oYp zUfDN({)=%Q@&6Uyyt(+Ujm3YlfHC_Z<1X*6K=lEx$tue>{1@$8@$*>HMym?Or=7kW zz+du9wqLOozr~K?xA^TqZ6SV(D_fg>i;|D;u~CY8C%#s%KJ|r4aEYouWik9KtJd7C z#qv%4)Z3|lGcr`&PfSBF-xv34_%DhKx&vR|_4on4gHKc^e8H~8|H|KgaV5Tgcfe_u zH!56x30e3NZN-xdan~3N?QK<8JRGhj(TCmnijfnm8u`9wYPdQGE;M;>2atUWk)3vU zNJS2HBA=rC?}Uuoh!10);ln8Vf_NABKJuLKCB=uaRD3TDA4VyQ43(Gbai|h$NK8hS#VE9IUp&mvq9O2%je1vDRQ3>{J!pBg`o2XmL zk~c@>y_>$g&T3SLqVxLf!HXyAdNLagT%Xdp^d!ypIp#QJx1_)3cTOBRRg6 z`lb9Fv4XY44Hp`*g5-ijUJ5rt8k~9KkV6vRlTMzr!Hj`?#zT5~s4B4wwT!v3(Q|K< zu{24>l-K8DF!D+ERmTvwK&(X#u@>UTI2Ql^CVH{cD6KkMF*xlGd3ECfK@}BR+pZ*@{A9{QYeH8!8 z6m%GMd*aYz;_Lr7b!=dKKSUkxqZg}))q0v|D86s6^E^ctF5sO<;cNIdbuFVFb9}dU z-$#GMSD$)3@x(Yqq7S9twcv%vs3V{2SD@Fc_;w|a>LSYZ$XdzmDS9!_s~6?oWb7N? z2s&p4-w1v3`tENq^7Xorg`ykt4P6+`R&=A4t>lXgWZTB$(~S@F9Aqro`-Q4LUQeG+ zti6IxbfXKGp$j*#{l=>kccK$-KqqFRqte;mnf+Ca%ReD6TciIvBfl3hE}r7q+&e9T zann>Ee*R>XxsPXK=t!Q^>*zz{Jf5ZOt77a9LZ4Le?wk8F`gGxJzR#>DEb4xA-fYIj z>rY0gPa-SlPhuZq@k#WcXHum4XW=uv9e)ydJeD~u>SO3Y!FhHI5q7Pep^7-!F z@Ft%^Plu69qw4}9OEU(j1T)2r2iqinIn0$5b>V-)>&j`xh7@+2AhueA7K z@J&1Pm+Q^+Cl-S^jh;YvTd98* z=Zo&^fbKgoa-eqjscq^rNm1l|jZ$ODEBxmX4q`pUZy%rQyA+8W{)lk( z&&a$NZ*w3c*Qq;4E3~&&U4V?bo<8gvgO4@m?amJ;KWw;K#rrB%LOl;5A4RX_!?P~B zO8$35hOI#FXx$Ty@|-a<;al^$WqaJ zMP;R4y(ew?^q$XmUvh!M@y)Zqj^L@Fe#!k=PW^BQc)C9oMwvL-r^+akw-OnM9o^7- zk{{dDdu4{+ONSppbY2}}ZLUw}8DruWm&m!x>Abnkbl$#!qcjUK#Ro!1Y5~L^AL}$m z>j57?O^>I-qch0liP_~?$3BUPn`E6#^4vcOPQZO z!@Fw$ugF;2L_Nqjayv_`eXM5`^%xk9{%)lIH_&I%ACcbi6vP-yE8A0?Y_Yh{GY?#Z z9(#*=H`C73=(Td{WgX1(Aob-LbtN$mHRpN43*U*hQ;qLIa31qQc+SZ4?K#Ic`x5aI zuM#&Q_1hUk_2{Tb+G*h3ZRQ)XZ>=cq&huMh#G#3QelULeR<;s{W@8)Z*$g*@=!GiI z7rk(N>YZAZYqVCCpy&rq+@%Tjjzrek!PQP;)&~%e{x;?JDA&g*`ZMTviLZM`^nI&n z;&y}hhHS>Z!`xF)E1R+JM~Zp~c^?=TtX3j}?19LiVD6o7vN9AN9^Q$dzeQfB6<~bcvs+?{9;Cji1gCy8 z_ySqxeuz4UfiudvpJ(PI8~dJ_vj;8)-XZrS=N#vLh+*`60H?qQ#3!wQV}KY&Pg+?; z@%6-`$T*X+a=ai%>&~|u(bvWp2}1|jjCjmk+| zi^LhljtJrYW63eUvADYu;g)YUm*an?y{Eymqd4bD+7mqTDsvZbCGVunlxyI5(Va!a z|G&unQV(^0O`Wt=Rt`5ptVd#1dx24MIsRwrHS7GE*t#tSui#7AI;4)5uyuelcs|kw zEtH2`+dv+~~h& z;nI+JvKsD*^>lYF_al5ZZgd{!x!veIDZ7X#lXC6!L7L!~x(&Hn;nr=%u5OB2g-s%i zeKM}Xx9%!l-Ahrof>+WR7wN>vr(dUFUv&PckQ3xspMjd>%M=?`2{=aTiYmX=CHrdo z{6RZ*LeVRk?|s3!K3sKFaMiqdnPNkc^Q-t?1V80_?f8O+j6SU~F_FZv3;({vxW9#t zl=N=hUOD4zBOAIMf=tswe*o`7di$p*;hs-$DIdy!AWq zIp|{6-!q8%9r%TGG5u6zZ4BRz!L08MW_@ok&!x$8n1_$Vyv>u3Z_P;j zI`Ua-!$-h)7XIsBZSgJWIXT<={kl6A4R^YDk5w>2||=il`)C%HwvzC5fK z6hQ|Yk{;jlEXh07X~6K3 zUX}rRuPq}=+NBTB)5e7q^&T;*r2U8idWQj_Mb~|QXGzDI1N1)Q?k?&5)&RXzT6j^v z>M*jCB+||*k@3NZXD>dc3;rmj``;~DZJ}>fYvbbh!$})UxmQ7K39%ap+ z2R<6jpNIHJ$@5s&!nl4fTKJdDHpN#;#;c5L|92^Uolm><-t*p+w(-$%rYsw_&g-LN zT<6!%WzS`m$ouoXyVZ2LG*w@TLEERMmK>$9)zeY9z5O}q55oA(*HTj;CR`)mu0 zwwD|IRCu=GJloWi1I9CL@(ug-S)OewZ48ih=<8&@m8N6u3f~I;XU%0sH=eolw@G`K zdA8}_575U-yWZzIx3%f}^qk@+Z~XcyzEA$ow<}|#rRVFwcj1?w?VGgwg|tmyxB9o& ztgp-P*OGhmf3|Ppzg2?lyP9Xak2WlAyw4Vy<^OD(`x*Ry?7ew-R7KkVeY!hKXXzzo zCkTOnBy0hrLMv(~0TRN#yUl>25(u&kDk@eYzVWqN6^~ICK4;{^MMys!pBSPMxan{k`w1Y6{sH zh;83t+V*_iaa*Wu*P*j6LwBu@2c60rFFJVUn_Kv%W3UU$mV85P>+BwCTVwFu8nF|g zZN+9UJk}o1l`+;#+PS)2!0|!Oz#s5e;OD%p8hLhtHjl?c+aTr*oU^g*pxibHyZ4Y=*bSnLFCHP&GUcRl`m{PN67n_B-;M zpS3+m7yMas40j>!e2sViVsu-Lebz3(FYo5#-iTXI_b(>*??`uF=$V!FwhkNNwhtfa zHqef643w=u?QN|QTg?vK?1fn)?OTIC!6?rXXyZiMzdvn^-KDfE{yeQeHW=vtY2#1E z7l987-KS>MZrN#?ap23 z+~@2{ErgoqQ%s^fkIx|jXB1h!F{l%JM(S4?SL>F=={PQ0t z+Sn&e;?=WvgcZFm7i+4){OpCZa?%j?)GE3uSq;|r*h=yYh6lSDKKbcr_OpOfK1mwK zcz-P;old6XPeLu z^abb39<^>Q-qVciJ0AZrbd2?sXB~1C^96Scd$8HKclWMChw@lqva$>K})<3|ydTHM-)cq=C?i1u^RN=dJ7we^mG(`oZN> zSies{xB=e!zH+O&5guCht`WKTJ-+S9x%3&n?G@-NWWR_Z)M>~~b|rh;O{CnjhVyNy z$18k~clj39eXmwOkLq{_KIx zH%<4RK$kUEkGsEm1K;YIt7&uoLz8`^TjM``miB&*_Wp?bKSJ$(H*%ny+xSb`_*b;G zH&pK|!n+dw0o-{VXJ>qXuK0`lqSSln@t4yEe}&t>gEm<|MEHJmYj98PS7_{+!k$L( zPwYwK*+KnI-X!hC{xt0WJ!D3*%7p*TU|(?AH)99kTlud}@y)jyGCcpqe|Bo7iT;kh z#boo|!#;7poW-6B>>u|c`{$iv@64@~vHh|rwT<%rjdxF@bKl2%+paOG8n{jiJaayI zxv6_Qa-zt2BD)EPBD$FcT*qG2+@88AuE&rGMV7mRFc(*U+U#aH@6p^h))l&r)3+t8 z2j#sVSzqMV8q#mc)zl{H@d{;mCLSJ~vfM@)Zl^r2!?zcsXLuW3K_lO3*50?PXE83M z!Py*Oub-jlc7t;2JJt8YEfm53X0tC#nHKMjgX1mZe<|bJZlY{u7bmNmC|CU6GFOvH z3+zI_XuyA@ZiH*)>Bat1=8b2VFAg(bz?u7sv;>#fr)p-iT7}J6tI1N+#2iwjnOz2> z!PkR(2IX^*#=|Ria`uYG{-w$Atwv;OEr5>I6AKTRCmbOE#Xl-D)Cb7_x%?|1RlWnS zCTG*ccn487*$ZeX<(f)bvabvFb-qu@Yq%lJ^>f~RgMB35;9P}Y^KLEsPuALGe_NBc z9UkQmytA2ia*QV5ZCaXZGx6_+dm79B`hOz+61b;>KV^Sd`p3!2ca`}knS{MVSO)yZ zyUIT|6Atfv`1~yLc}Km`FM~Zg-c|KCW~yIvme<{s`vCvjuQ}W6AbVsUt;|%f!^<{t zp6j3Jo3cO9pXjf0zQY0X6~E|^uBfZ47I&V^%Y5rOytf)1jd1U)(K)fV5Amf9(mZqd zUYp@>sgq|jd~O+an?-wye->?BXJ(!pIOD2 z(2Klgp@+{VA17SjGjO1c6_j-s+@_S(pzm3DGxZX#(*SQ$2tV`;-=>joBiz2^;e;E> zMmJ<8uXyZo1V@`0i{>+Tnd7X%GY0pTx-{bJXAG{!mIf|cZ2rsP-{-)+f7IRSeuHuG zNP3}r757724a?qACdRxx3wlDvJ(&xO;i;*Urx=c!Hup9zlXF;2p5n?~w5#ULhL19{ z=Swzxl=z*p*CYO1+IbZD$ljsFaC*|d#qfF3-x}e%#oq`=FaFh}DgM>uFa8|T5Py!I zhskTI+bQ3T_uo`S%ooxIxqQ1k(j7%V=t;UV=E~kx@~y-BN3JFx@vkNy*k&WoqT1~bZ30qBGdOY^X68~m+T=8#) zYZkwW{k?4L`DLeXOhC`AmzngRrah0r&2ObW@6asXMR38#m`~=zN6TKdkD$W?%X!w3 z7y2K@))>Va2KIk`O<9F&gNJ*b=LYyKNmFz~<+O#Fa|9FUBjy3g`kB0)^+0(co7bj( zQSN4Rw}%r}>Sw1mnAQvvTZo3$4-PYe%ZfA&n?(aQjRxITaLwl{{Po~~IoKV=b7oTl z=Qpk6{Mz*^x~hSM?PLE~>|j0n*jE;tSZ_Y(KZ#B&e;M%@_s4_FDj4%^#4B5ttXkj} zZNzP*4*ARE|6=d%&sO;Jmc6Uy@Nc{L*LA*;J-F9VH?XI7FKLSXM0%brFH;KQYkaLwQ+yEh-KC3_#qTqgF!!aaub%Y(zu zyF6L-Cu|gUD1EuNUpw3l{&I;8ar?C++^q3%&Ec8MgFY_ubhTr*AmL?jn)1!`|D5kD z^2r>TXZY`%(D&3ZzqByFu*a8ct^O`{$}*=g4#+-VQjRj_q1+zvO7wS)38I_MfeXzU z*Jyfu*vtnSkhc%x-aYK*2M*2efxF=$)7DKUxN~+1LcC#n*78+O8myv zS8p;!?LSmIOfUDJXDrn18{4sG{6n8b?BTv!wQsw~y*c?Fx9n^8Y}UQ*p@a{LGyNzU~UXma~$czIKVbiGJElKdoU*nVT1*Jd82xnHx@3vq$rgXtj~~ zqT?ZrvzJ~~JB^%S#QwT-jB%dD?5kTn9-S<6sh{y9&ydXAsWHzn?tuA`-MGhl=Q1Bx zFt4?9w#RYK_K^QYY_2|?oaA1QO@n1f40*(;o#^y-8l%g~%wrX#x0pGsdc2&$ zB>UJ!>tWTTS4KW7NmJ5VSa}e?#d}9(Iy%%nx*bg`)GY1Fr*`-de)&kYzqxJCZQfA`KWQ<3D?p-Kz3IE<)#*((pTA&pj#a7aX zm-QS+Phr>Wlt=2Oc~(*$yHWFQ(#uC0?4!KW6hoNgC;3w^=B=%aArfyUa~c1i=dXKddI4M@?Z1c$8j&^-)|iq8)zO+ z-<%v9*uHeJ+tcSRcR3hwFgnW1(R21io{>HB`y$`e^i5`uQ_fHY5B>4RJKcM+C0a>e zlXZsJ7wM;JftmVedEZA5yM+FFA9kU! z=(gVD%$IwycfEdgJkK+|#}{h>2j!T__?~Uj*q8Mcbr0kIP~^UQ!7hWM;2f_O1O%Jo~G@tm+F5+{u^uQo}y!ztFMUkx4`+d=J=2 z+@}_Ew#>fQX~#@&@L6~7Q1ZT)Gt}A7ll=YaKF(oxAQN?=T*3YL*dGr6lcXnp_FD69 z#U9Cm40UROGjNi9J2h;>w$eTgeDfisbq|Jq8OZH{g;2?&Omh96md1jE0#(tO?&w3l}}&l-?NrLNcUtO1!+GezmoveErYcpH7BKRV&(FE#0yrj74^ z2ettY^6AevXq%x0?!`vnN@UD2v}4(|VnwuSE7k&^Ge#vYh*52$ zwZK*6^Wyv{-B$YfpYeQ0oV!2Iw_X|pMu<_z87ogRmSs~m*%!7y?zRHX4j|q3?TPMr z#A%zQ1#V|7UBsAqFLk<$I`-qG`d@J;Vw(VN z((MzUM^0?#KUsrq$Md?~V!UT9_*(YAhsX1@&DME9Zv|tu?4>W`bn7hEbYB}fC#eE` z(sUJ$7vVo3U(=^zm_xB z-bG(EU!JPVDZ3fl5{R$MDT`wRtxIA9jZckpk3x1YLw0Z5G0E-XfAI|9{09D^4AzXojX8+@{lTPi zUdsT=Ig0w%(2f=K%X#$EvG4}t;0&bSGY5dX50FQiswc03SEi_An>l?_=LZ*}%ZKtzJ1hM*pAavy%25^hx0p;LtsXo^l4p zV83~7^G!V` zp5v@m<~ZYZ!fn55)njWdD@kWtNa>h060GDxZ28(55w>FCBbERL=Uj#FkF*iydYkG)z z(G?qL*$|7~lJ|Tee8zi%KO4Yl&j?=IhQ0>>$EqZ7_^A@z&U+m8FUL2RaL!T*ZMIu= zY`@6e_Nnp1R8%qKo9W4pOg5L%(FJ&_?vKC**Z%v+(z@cp=oL?S?ZT}u6 zy7p5CO9ChTC7fUGS8;GSZ!p%Z1;_1WtQp8Sb`%`fF*F)3Gg`HSqbm! zlqt@0AK&`Dxh93(x7VxVII*40!b2*z3yo$1aKQ|K41|ab3tm#&qme_+L0%)B7vZl(g<*z7hN; zY0hU3lJO%EI}{lo_EH8bwkW?t277_}rLvzi=VyBUOdadR<`*0n%x9PS6dd>7+-N=A zOCA#MUcEo2Vk<>@;5hjQTETIND-!hn^*r-u>I$E_oV8WIB5!#|&g7JRX#cF2k2Jt> z@7^Ax+d16_j??qQu0`V9i>*sN|APEGpMc}6oS!IXUJf)_J(--Jcs=vWad6y|ceo?YiS4Bvw1CT zP?np3oDD7lySKko64=6Ak_s*zM7}l5EvewrsZ+bCz1RVEyjT+Whp!~?`M#3C9^zer z%xz~~&H>_GhRpreBxGuAYTtq<78|T;>^yDkGwa9x>LF}BXLrlud8}9F>JrK`h;keU zhn0|jHf3pmuXb3}aBA7e*@6cIf3IAguDct+a~d{e=);)f@B^ebk+ibmD}v{od_daulD79b z?6U^LK|Y5~nD}Q?Z}HEj&f+(dW-j^`!O?QAiJA1|ADAF%q3Z~q%~DU=b&|Gs)ADYF zX`W5XKhXU%sfYMyQU`h7K>5YrK>5Wl{a@xQnHzH{r_7IL`fdw-NBWUDk3Mmu$nHJI zwG>}o?ZpX$Ln9Nw19vj%rd0BfnCo7(BpGO*I`a@s%8(ltt!=Zn9 zYv^xd`2Ph5JWs!yz*w=dFq&t`SoD!3#&Y3G7NJkj7|*kjH-+C@$ygPbR-|zHJkjYBJ-+!((GqGGk%?anacKzNT^~#pvrB z9%EdZG9gOmUrVoxR!z^D-D~*IM`g#T@r*4=jG3{FX>vY!HDk;g{`;na7svU3{Wr{4 zFEDrAP5e*6fR(&6i+U`jZl4n8Q}EqM;++D^p%d|(0waA27R%tQ0^#ybfQ6DwNxBYb z5H@}%{A1mN>)%2*l%)4>WM()dqqmfCRro2f8*Tyr$#*d$H@1MW#2sJ1k3JW#>n6&O zZREVmGX8zevErV^-Q+zEmJ@7q94sfil;{LUff3izPusw9$H9fzDS3{A9Z~L zS?QyK>qhlXRegE(Fk@eM3~b4X4Yc(^cJ0T7Y@#urf4BrYTj6)%dfQ%_)hDhA?kfJNiNm`whmLnQFvjcuI%EDyEkOwnzLI~B{>l8v zSU`K&z%;q^?Pl6>E`56*ef^`Q?Ars6ItWfxWEru;Uw}?>!7vNFN4=Whw1VqCP*vo! zl5nTS`Y3dWtISr_2(P<3(V~v%7%z%(QNc&Y;ov0=Ige=L+4KZUY4F77Fk=H4uRppjIX|R7 z-*zziFZo{k^|>&~v!8!L_v`aJe(Ep&6L8d0Ue+Cx-cIz)q@mB1HctZ>FP}7J{1qK> zzUb^I<9`073f|eze?|ZG?x$Yjucw~y)ZT66A@R48hu~H#0=k}ui>~Mj9phThFu%0pE=O5In1-sUoL>-n!#}mAsiPAj%xwOwSnX0+=-); zIkP;3<0gRH!Z@x7{I&sq6?a(!-x0!a?-BMsVS?WR;5YVgsENZSHi7f`KBm7^kBd>C z&}U?w(cvewz|<+x=)#dN!EZx;8pWAbU1~l9>)gONG1`=X-EytEuR_Ok`g$Xgl|*mG zS~Bjb+*7#2K~dH_DSN8urqB&N#(cdPo8A+(N$ym}#;IVdG{(G>wC#|eMyt>0L$VIy zGy2bc6>^5TtY?z-M}lK^<4^a>*_x7$tnHC?l9JwCeAkEJ2~*&3kq_;aP?r*@4bn!NsY+yJ!A4o9VPCe{B@)Q4ilwIfO z>3hNRQr@bTcVzAIr?iQzGv0)~@muw8SKmS3a1CVrlHN~8yM&9IQ$Nb}i6S?PF!)N&+vWdd+_5Op_4Q%QyMwvoA;zvj zjE~2i-P9wDBNHe~1!WLUbOL!Vpd2#Zh+gElGxO}3<^AEC69;9gwyUgejr5&{RL(s5 zK#g;B1GmBL4$jo^o9JKK7=!ZRtAh3;vEF?2E8;%JIDQPhjm$m4XWhNy$$KHVn=y_2 z{hV3;mOlRc0sJF#;2*$0G9D$7p7=$dlLznJ%vgC0JSg(0*r$lRvzIYs9BD1!jA_C- zWBe`BJ}7B>e-Gy=+{y3ZJjH+hndN5E+|3+|-ih=Cza{GUZ47D6XHAC42;)d=0qZg( z&u!@IL`L3*?oRyss7Fv{mUAj?-hA3s{Q0!0_`~vx;5S+S5XNsc^cU$vX6CcA_^tL* z9ly<$KE)MYqjeU)y%ZB@sikkd9@7cGajqzAoxve{sq4!c$${51_^vqnl1Q^eG$NOb9gpE@?oqH zEVYp56Ui?Z%pe$QqTsg?F-qo>))CS0fUj{5FSx5uoO>nn!zfM8BHyJ-yMo`g#kyV0 zL*x6$fHToyQr6eGKf-*nhIy~4PmEj6EH5X{u^fxLT=3g$$@5jd$GJ1hb^HdF6#Oi{TuLG7`y!;gxz)$w*j11OPzL7hYzS%Z|)zKXn~=)17M^6rbJHw zO!Ofb$-!D2;X2yEVFR$8k-pIZj?=l9+2h>xb?@pjrSK}Ew?yBe-P z6U^2Eo)UizoX0r~m*p89!f?!?q$6jRBL{%L+QDbS4TbUBT=HoJ)3t-qblnMZO$T^W z=2+Gsdpf2E%T|H@x&yo><*a}Ql=I5PE!a(TBxkYP?A2H2VQ1o^@5x*&bF*N#wIS># z{P8IC4uai8FDYZ5$geGa#=L{bt?zRog9vtO1V`mE$K}D#wHC-(q0ev7A-@ma@X3eN-Y`U9$e4??a}}za}|!j*zx2v@g_aN9L$aCHaOprUluU`ndl zPgv6MG|nrRb3C!_p^bj0>xshWl?TrnzeBehVg04P4lt<061>%qc}4J>aBTgVTj1)v z>nWF%Mb0=E?z2u$kG%`%8(ZPiaV_>a*aKY~;I{~V`_b{+jf`b8m}6%}@LL4GeNX&WJm}l;+XBYE z#q_Nu5&RaxZ*iXgar}1e55#Y)8S@@uZgz1YgGBIK1izJqu>Du?+Y|H;#TfQf2)|7Z z^KbN-?||Qq!N0X!fPXvQiGMo`$2JcC#1Q}17UJI&VX|M-_vPOXhWNMlkadrmvT8nm zNDC}Q-m8Fv`yBa1EikD$ra0uH{~rH#FvP#ThYZ`{!VX2};j+l%Rq_xV#~GSBHzr(^ zoVA_qU4o1dM;kUxeb-=-#&%@b;hbzofcDTTxZb0)6BF~^Z zmVLD{mB^%R@Nnzk;e?|P@^$|z9uAurf*f3*M0ct1c9XThg?KpO2fr5&H$KF}!D;C{9DLS?aA^N+ z9uEHNf0~Eu$RFeG%)_1K;NT8}yxVyk9DJgL4}@=9Cvz=Vn2+=JL>&C{Fms9S#JREX!Tg&txDmKg0^t4Vhb0g8sXXo zFn-^jx7y)IM%leOHscMacn0-{MupN9_}Ez({yyF!l%og ziE!&7`!cbItA{6(bmt4VN7{G5L4~>W!@6!$c(9;7+yFQ~Y41lUm%Q@`I(uo`4n4gf z7bZMjFg@YT#2$|KXKm0qkaXkB| zu_SQxXbEG_ZuC-S)-&u@qT>kL!KI<2=zxTZn!7!lGEU7+dwn zz&j_qv4czD zF6$exH>7V=!w08;tx~aB0cWAxPVshZPhy|C*VSc{V#y6P@TT(vL>>l;&*! z$EBfnl<+jL(1Gh^U4ZPP`ih>;FTgR9)?@IrW^fy8D?G{QPeng2I4cEQg&x)W0{Kh6 zsnqf9sj`={=tYC+-c7onfk~&`C^##PI?)D#N5EFWy_-mn{UsL~?Ve_ETQd7G$$pjF zNk0|+v*--}ME>&5pD2&uJURDV{0Atf_#459cZbrwn=(whF;)+M9J}tv>fc2Fo8mbM zZcAaF4P(N`vG-1At`&SIdej|YJkina2w}d%*V^0%$ydS-lCQ)&NxtGgNxtG2EGOfd zzR!3FAHGf5ZwABN4~E+g#;ZVwx>(||o;N}6>=FL)i_wABm!gqHqXQ?;)1j7!u$zmr zCJ4`t?rJ0D+*p{-T9=mUXp2=PGxa@I^u4f?F?JS3{uSRen^+MQ9^s1sm4eC_CO@}J$ z+gVSf>rls{Kb;S@Wh@S1x1f$xu$!y_Jf}mI^)X_19K?2_L)F&^cG98Npc6SCyUG5} zoo(R6{-~w6-#22nX1>`d`dHJx=s>fd{)G)(^LaLKU)Q19(3{5S`p~WDQ${m3c?QTD zQqiH>(3=MJtNR#Ve4_IV=~rFo9(5fm-+T?a$TdCKmsfPC3q*$+h0Zhsohdq0u-hV@ zJJCCuu~8HoI49$h+YozBcUp{&lCUOAtgc60jsEmu3v0c=Y-BrKlsqY*dqGY4)9wL%SC%S(6a`y9J^Pqo5D8h=FocF=Emqi z%TfAjtBi*ObZ#yey66@h(X&2}zVmSM1ov3*iJO0YEck0Z zxNHmkui@H>ZVQ-8{&@@dto?FXt1Wx1r|Dsd=qz)o`@^EA#>T%D8~+nvz5d`A!80;O ziC%Rt>yH{u)|%%Bu~!ASuKn^fWkp}x;Yem*4AGw=|B?O%@SoVa*>t_6jdx}3pUBzh z(OEw&X|=JoT6Egz$vww(J*usf9(7+xk80Q7Sx=cnk2+RQk9{-9dp+1z!YpUg-6vSj z+kx)0fwkD-@AAz$RjHTYMp-`y_N30@uO~0@kJHm-45NOJ48`7qZyM|e*v0al+r=&$ zyf={fk8pIcat=pOcPhG78Oy@D)qT`eAM40VbgK(w4F%6-J%#wirUkvR=X~9&^bz6W z%6r6oW&iNjlZ<7bN9*I7tdD8>l75mkGSHkqQeVH?gigY6|0~0c_ty?U(?DvtYOu<_8!+@VjXK%?bV06*Xrw8WnF9MHLdQF;F{JP z)8f94L`(fxTAYgs$l&@Bd+ zRF8|r)-9HOWL{GZPhiu9ZQG}eW7EN8>Dab4p0%Ni(rxJO3)#4_F2Z|*js-8w;Z+M? z1s|4*9eW!4iVEi@eB1GtlHC7bTuq%4OFpscFnDh|cr5*=G3-|nv~9bOyv4Rn?C5R? z*`SGyoA7r*J2k;->{-BflQe(9Kk`j>bknF~+6{vL(mm6ur|@+5owaLwO$j%7Uq#Ti zPHfR6-V@+0!Eld%2RphQ-ddexme!|^}Y#`V#4g0xi*XvxK_fMuNr(Rfkw>!++ zosav(URrRU*v<*|yFIq zn@ua2M_1FI9_ozy{+aDu5cdUb=U&5hE{yxcb}o$j#CGlixDTu;xUV!jg!{mOg8RN| zJNN2&wsWszI~R-X+-um*$r^jG8aOa$JGTqlxoGyGc}>%lb!=XkIlxH9Pey6v1`z4LA61ow%}+=cArbl$F- zvF(ZIz+s)Ydj;Ok7~<{x$QIxWu-vh%N$z&ATpifvL$I9iS8pH#{SGYm$k24LS@kwx zH)jQF2{yKZwZwi-)&O>Z<<95rTCwG7gL@JzH-PbaAY-@upTe!R>sZcKQ+FBb1;JC+ zE7LeP1$$s@?}Q5!J;Luvf1^`yo!x8Kc{Mxl%Gy7%e-+HLpJ${6z6tYmvd&a^wR1e( zn<1V~?8^ji1#Q^EYhQ&od}JuLdZcSTo33Cmu}QOo8oU@a93Em3gt9>C`wtXR6 zwrzU4j6u|I!!Tr1=4~B!fk*4WavkK;2$su-*AyMbF>u)+cuwKsHiG3u4&I2JoNh}@ zUB&+0d(b>wrCFkpF zp9kZGb+zYXyl-145z*8BFVxd!F%EX8Z|6h@wx7j#|6D)21B~}=`q}d_UPL$Bd5y${ zaNZAHBk^z0%@$ws?Km$VoL4}f8WR1Vu|^`In?1{wb$pjK692d8W{VlyN}?mWS$MGj zb-LNn(O=cgJ{7`wwYlG}o1Mv5$@lE4(u-YxVNXV z<_g_xs?NuW&U2T#e45D0aAU}*->jdlho6)EM1%TS(anA`F_trKgnN_yMs|_5=w;=c zNYR~2+USX^IZt|;=w&5+(VeoUlJ(d@y)1i_g75#CUiJn0sOVbn3Z;7&>9(PB{uDm$ zZPJ!!4IAJibscI@k9+wv;n9Te`)2*@FW}13(9sHi_b1kE2X(ady8oZ)Xdk~msG|+* zXXU&h(anmUHVy7eILv>lqrFOWv{vGZj<)`SI@++^UT0nHchb@Nq5`e^qL3k?B0AcL zj#gji`ki&OwK?C2;m+!4{~i@+Zlr%jbhJ8W7tzrM_bk!ZO#G{Kv`3@9uA^P@9dxuG zM+I6=(pNv{LOzl86JZ@~TfVG)J*T5R^3nu%8@!(AYDG_b!ZrTFdfE+~kp}k`*3;I7 z^tA2YqNhDyN81+S^};&ZI&`$h(Ah@xwEqS@Z7kR>p_88028Y*gM4Wtrbya0T=9>Znfq-MO_D-?YccpWyFyqhtN1Jx+FnbhMHEP5v+2 z-=w(5x37=gz&u(_e|jS7KZCoQb>6xP?Bc$0T}5PnlXLcX|5QgC+@tPm_ITe*NBaZz zHyOX`hwX2&nQ`tpu$_ks*(I_*HnKieY)ZbizsU~z$BT?%FGU6SH<=aY@8~mU*T?od z%il%zH;L?T@}uu>(vPt$pE7cxi$zeVud1@YT#`bPz0*n$v#yDEg=q|b!$Tc@?L5&RaxZ$CPI zd*2jj{ksX>m??taBKYn5;kV+h-;UponF1{z)3;8VBK#X`HEw6E#8TEuMD`c{AKG8| z%lm&A|7HTe#WFW1aMgB;;5XU#AhN&k*ZH?}`bQS{t$PT+C5QPp`b-$Vu^uA4w@C!Q zMey5?j^AA1w++m()e-y_*Rj~F>f|=a|IVNNCdw{ z@Y@CP+YennBl^?t zr$4Pt`F8yFr7_TA0>8yZ@LL4G{R{BhLq8C|C4=A6nVYk?kU=8&ErQ=Jh~N6qKl*{+ z@`i0L8 zfz~e#fo4+#zeVud_r!0-mT$*zHpaeW@LPHWzeVudzW~44ejt9!0l)QOZtlm03=-kr zBK+G0@!Jsk$5o7B*M{(0&IS0li2juG2qOB^e;a=DfZw)(-?kef_HPmUx9@5H7XR(| z?IlB?rIx<+x*?)Jjp$GR=k=#YSN^d5L;Q?+2My@PxR602_$`9pE{NZb(mz@m!;Tq( z`qR%>hSr~U=HGfm__qjt`}gs0H!_yZV2+&?!EX`%?fdd?=5NPu3mE$r)3=sH@LPm` z`xo$UFa1FLwwf{TA?9WmS8aR*zeV(?7uKIXLH|&UVNZqdn?Ho#q|b!)r?uzKPmS#V z7TN#pN7tVwFqYYvW0NEJErQ>E2!6YN*j&z@$>S=kD|MO0U03E3dA6xLV_yz^t4{>K zMey6d0KYx)1Myn{W8M(v=Bv1h%@O<-!EYDFZzc4P(Tri^L-@@T=HKWuVf`>S#$| z$nxFlwo0?Qy>hpj$$LjUC4ocRN&>4YHKo{7`Pjjdz;S;`plO*;H7`q0Z!CL9)#PQU zx@8$^+=>J0q)Q8QT$!dOuSiobRKBI&o|2-j=Un(aQ=I4e%GcGsvtw1R$?W~Jes*uB zN6x*^GbD4jdL0IfC&2mbW<$KUxzeXvDic)uvc0NfS)wX4SUsHe>-~%~=f|#iN3~xe z`DLgNmBqci@__P>NmElvv&@j{nM%HQO_#HQQ@t-#rs-k7Snk80?5$p&piY_+Y9zgm z%Du{5_inYM+g_QdMjOnY*5@?pmPFj{-YxiBmhD$>P@b)o@2I-VGL)IJ{;o1Z()3Oy zZShYg|IcS@fyLt`uVk-(`9Z=Z{r&hQZPKgrRVNtYJgu9xKx4J!VN#>c=25HXv3_|X z?^!(Sm+#fzt6QF~`^S>^9YZ9~WbZig4yIijO53ETZ6@s_PiTSWWl@B8_qy@7FMCzh zk^hMeTHul8QYWkDk>&fSE~PnMb_b6?@d09&u``(d_-=Mf#PmB=C=YB>~?G zO)a6%q6hZ8w_>NdojyA<%S<_AytnggS7oZ|Fh+ZB2rk`pZ*Q_KG*vI)k0NS*_GG&n&Hr_ts^pO4Finr+Z(mw1?c$-Xlw#fd}^1S6g}3 zu|x~Z)Vh0f$ba~;uYR@|wtt_#PAah=22PgYMtF z{AJyrv%;?X6SYKdMO}UM?-*Y@IJ?tDn*B*{?6PF)YViypJtt>klfG9YuXW_3k&pN{ z@omMwiEpYuClB#UdK&pin2U5^a zV+oJ;v|gnJ`YnH5b&Pigd;?+?k)^sf}V%h8J67t+jyZ@GP zDr>XwSGgMoS@78MS&F)Wx?M+I z`*Lr&RtxmUJ&j>pX6(S=cxbD zSh??0FD$pI6z-q&(*kzf$I_jFcG~!pmkQm-3@P5NhD^^V3C@7HJ$$Ej{*{wg;VEc{>iCwU7(Z$ZiTwX2Pg@^npiFm1d)l&s?uxp7)dNUJ#;~Yv#CltEoQ&o4iP7>-f;X?Ou3E+^d8ehs8EEAk)VYi=t$eq(Yn}AR z1aDh+J$+Bx5NDu*JlkSJ{`{c7%wYGl^$WW57^BK$+}l3h{cxpUJ={B){?Og~$z*4s zKYeCgWmmP=kmwm#`8RcRwlmN%w5u9K|EV|Fy&pX>*8OIs^l`iA&C2)H@10qC_=(jM z+=G^P)58ZX|3EdGl4|VEZu+y0mGYn1J$nps-bYrXs3S9+fkBl~^31bw#an7Hdmh-0 zN!~@2C24rFa*}>MecDO-4O$k@H1EzzNlWwWto%T2(z@wkGf7v%)y_b6Wwbo=tXxs6J~EkVaw>P}))(S(vm!lrpaz?Z*BGAZO%Z^Zs(&i z#%ShfHM48RxWh|>VMjKUxo7QtwfYvqE9%~;ZhXV}XoV$O%_8nPWPPdG4Ev;H0muGwQcw<~^ zx#xxC)|SoP+|6HVfg?BWyjttpYg|(wW0iJd!?0}J4GUIY?Ub$X*|JdUUG?-+Dhstso&Qtt`u%CT@z8Zgk z?tl4gdMQEw+4x;`f8kmGMd!UA%>UeTi~jsve&(+`i^a?V`AQoQ}MUwMmSpedF%zX`W9Nj$}cU0G2^P{6O z#zl91cHD2H630E;^|#z(LU+@+MBbOMnqdZOZ{qbJUT@+B?=hjfNx%0a&i$l0f_O#5 z8$rC_JtlNFjgvA-*cjs8LcCkLJ~OUZkGGk-#FM*8zmFx3mHbx`Z`C)%dzJj;opHqN zsh97WaXt0&$z94PcPZa9{lYX}oFNu7ai>i9eDIeO? zXm%CTe`aZhvND6IZ}HBcyF%Q~LOmReNO;f<1}3~n53kq5gYILvi=4#{=AAOT(a@J~ zTGjn(?ZlzeUrv#KO8%!&7i$;g8O(j>a(Vc^35J9+@JQb=jAe<2#IolNiSpk~s^fVF zm)U6Un@8U$gW&i_HZCZyVuHsI;m){*hds=kVW@ceNK}USH(T<$p5CJN#oN-WkS! zx4OHzAeVo!tAz7^b|t(w|LkA763%}dO?V&v?GH&Km+uuT@fZVQCC^f)BROf=qp{?h zI|lc~_iWFdAoqpb3-7u7Ca1%FjeT++b;&Tq)#T1}I#T8RTjg#qxT4(Yc)J_#&T~4_ z2)|^Z({VuZxzp*0k+klSJ8AJ9V=gY=UP_%U#4DxF7TzCDo!3*&QtBE-_yp=2)y-Z| zNbaYIMp4geB%FF) zLwF(e%wf4Fq|HKiQDr$a--!Nm`AEMVo??(Q zT1_alsEtmOI(f@*|M8+sRWiNM-|8gp5IBx6iiwv&ykz1f5ieRDFS4lP#D8+`NdJW5 zOm*j%#eP?jRlRuo2>*c_iin>^{4C;U5I>ptNyI0gV)7|6spEy2DwR5I;hm=ZDEIEu zCH@$}yx`IVFs2b4-4#x%0U04%OXRKvKDe>SpM9pppO=wI+7{KXf0F8H&QO;uOao(@ zRbh0Rx<4vQ9g4|NhoX{IVQiARKPFloingeyV@&Gh*i2=JvZ_PKOQU*QRWq{PghCVL z%T&#jqZxT|^nhsP>Tgl415K*6f2JChPk6ExD2z)c?IhABy(kN5n@F4YqOB^>$KWo^ z%;Guu#w7DRiRaNgw~)7qyff9FSkggmYeohd)jLr&7x2B{Iv%0i!ku*t%~Ip8%21D7 znXEb-N$Pi3MyvX(EGl6ro13Ou`evz?TsWbA$!cxiB-N4^t!nyO)EoUwdcRl& zr*}9mO+6EzrCv$MP)6{1BYAALrm0$67V>q5x?ZEdO!<{7$5Zj>NX_JXhId{`NF#2R zs)hFu8C>Gb55*}Yj*&8!5mxN3cyt2(M!v}{_zxq47u{6x=q;MjcbM;U*pyh)hHTk* zsZli|tBO2#Q-M*PB#!`TTt7RFa|6xlWVNMdhI;;nWVJgdS$&LL=^t-Ydkd1(wri5qzH6gZ;-F~tA+qTMDMs~S zx-;-0_oK*BkLuxF`Zu{b;|F33{O_j*I$jb4=&6vK{HHNrrFMsIKc%J_*J6;X&u9`Gf z+w?Q*l@>M7VNDRqa4{r%{O@ZIZ0}#mZT0`XI1I6#er#0xK0vB)6#uI?oCodZnCN+KOuj668TuwtM){7 z@TPe6E8?D<_A8fzJRZ<8eScOq`5gTZIuoxG_*zZw72jG^`z8}f99%fR<-48;Xc_~hN#Y4^JZ@ou4J z_btSKm_9mU%0`!+vfV=1o0RpJA^+cuc3&g@g;Q6%DtPBJV}h>&f6P>utDNt+)M)le zKPd=(hs)(#ljgLL|0Lg|iGRfWlZrODxKLiA`k_ck{wTRcnn`jaKFl zt4+$imGO$~$}IAdeoDyNG)cW&e1*GqA|0IR<}G>R%M2Irg6^_TLe&IR;FyPhMoz91|yK7Y&${ zRZxFsw156ZnqyX)=2&-Tq<>x)&2eit%`xvxp?_Xa%~5e?l)vH<&2d{_%`y7SaDT-> z%~5t{jDPN>n&b8>G)D{b``jxv$Lwn~NBo&0|J)+Em-*+8)EwrC7fm+*?Bas*GTdK` z@RyI1`&fVZB+YU2G|iEFy3}8O19#fcJav`pj-P6dQKyUjb8eCQX#bqsHAfuvESr!# zx$neo1#{=(r;KyvbElqpQyHUauiTq63(9{+I+VHmZn=;0m)|G%iT?8Cn&ZsU@!<1u z;PkQJ^)cY~(a7s%Zg6~+j^}Gl;Q2Vh<9VJyyhP$#!1GqO;26R4SD2lSJs}Lt|5($+ z+#}ds@UCF@G;rX+6mYL#=nSXBO88Y>osRk4!NJ*rF^Shp?)HNGT&Lr6iPs;zDdB_U zZZ8;onbVOkIC`klkwkc}VNOR?2(Jq+&K)lJIEdHdz_C#wydD?A>v7;%!6|~-FS&{G z4hv#-y}Znig4<&xom=H@FX&tDbc~cV<~belgy$_pW+A){8HMY3-JWg$I}*FB#kjrk07Rxr_3$juu|IM zr?kZz*9K*=SSc&*&`r{y9lDXmXxd@9yiYqM5MD+*j3&Glyje;+=xNdpl4fb8+{?GO zfJw_~hkKhF|v zsK1kR=2Cwr_4kR~fGnDaOz;SLTvX(|a>r*Gc`bwkBSe_20+GS3<5N3Y=$oYuq~o55HoxOUA7_M(; z?rkJ)263Z^i){e$ntNptH;uRn#03jp>~u9JXn{QBljdGAJVQs%d+jD;&BMLX`4R5R zk5Qusn3QXPQO8INrv@>R15C7&@;MDLYNf%XMo`8FQ)5&dIKdObT3xj`-%7%bgpJTK zQnarboYNc3_n{H@6EW_3o_9E6)G_Ycu8C3k*C2v`Ny)RCNt9 z&S~)VW8lXo{x$Q|$6QVH`6S}rjBHa#TFw;)rA?_~TtFv;+?2+%Ci;BV)W=;1z<_C5 znr~+%ag0{wG}+V~(h{sEGMmJg|FSKo(482A%WTT%(%X*QDOaO~tMx+Vwo`e|*Y1 z*E-@bp8DqTP8r`={OD_a&tuoJZcr+E(hQe{Iv<%9{O;)aeHOm?x~W0G#c1(uB&`qW zLpwrp(SzXrZiMAc{k5wX=`IAjyZA0c`Ie*b|Ay}_GVw_2_%QzGLjP4Y{yg&P!t+w@ zEz2n@ZB%B^Tt2Wrx@Vt{yys1Kx!RZWKVN22cU+Ome~L`c|BG&1Pxo2UXje$XKY$e-+qj5KA21TQ5w(wVn|_}bp|Xw z4eF2NBV$=+Ppf+OR)ca(e@u_Rl{la9tv;DxRd-IZDd}sE(I=~nNj_J96S8Znx|4T5 zN1y-sJR@=recP1i!tTPSw=w;4C3#{u;oC&JeX`s{TB)*sgzGV5n(whtzuu&2z7eF8 zHvK`@5ZdRLxVs?3V7>9Eq_vW^$)Mbi88dwE;LiGTYW2Odt?CQXc9^>Pni#j2Q;#_M z%)`A5^c$<{cAruG`W~zL;2xV2S@na^zdWap`01BZpK$FVuO&;3>KfYPq_Lat=t6^< z-OZ|EyTR@8pH+3W!M7RJ{^3UTCj4P9^0rS4%8H9hOz4)Qe0lI7NrYD*4@vtjEKWrR zPx6)V-TpwCu~+cjHpHMT)a4TDXGSJFip)|l^&wX}oWwnpW98Iex+YFv>DoB0$~AoI zM%Nzt-T?a6AK_HoVEs3^?!ScpqOVo;N9GqnA$QHfeG78eEaZsZxHltr_5KcWmqwl%W8q-(7|b^e z%3)QmkKx*GHfoL@$Tl~}XpZ~A7$}q+1CjS`wrUQ;B<-Ss5LYu-hgpRilxw%82lZU1^*Av4aiwW_nFmN)t9vi`#%8(evGcp zjE>1{U|i?gvijmvn{o{M5A#g)&<&eSRnOo*6w-@t+RQV;&iZqV`=2K48LnXbn5w69 z@Dr~4bE2ybZ;m+^e>3rUcJ}$^sH#H}hfCsb$}#OfMEt{q2j7padYX5_{!N=ryl>)t zQz(7%Df0M@l%H!Q}Fp_L(ornFh4VX6ZwVXOa2l+ zWK)_W<&C9$v7z`z@{1zBaCxyOAn&u!H*2By4WalN@#VRu`-64Ybltb){}%c+(YuQs zz+o;4dn`sCSEKcPI~vV`0BFk?+P?8hjdjHy3ne&M{r z_5HE^GDe5<{4v@$oYxPnugpQ=H2xFID|6U?a{0n#3%CD&+IV_6=Ra%y5zG;8GwE+z zR{!Kw9M~@p+$Yzy26OAnnl=S&h}~Tgcu{QaYIR#XiH|)V+`SQOX#!(Lfi9`)WWYOWH=qS6Q0mj?)HMjY^TG8 zKe3nG@#o6jTwv)BA4|ApklgJBmdoUBF0c-DI_e0w4wJjRz~*#1I`G?u%N>8I({TcB zwu88@z*$0#E_ZW5 z6TGW!UMT&A!Sr{*H(Kuu#lI&QKdRE{*g)Ny?3E&8za{nDgj>q}8@W^NDb9OSfA4f`gIgBc znLXIfi0y>+kJtrC8viAC()f$q%>}ld!E&d+%ALI4k#g^LIu1(Qy>iFS=}o6&2>ieG zEvMsM34cfK_JS^db2_e<@CK*jJ;Jk&I34$)7qB)t9q&uLHo4}A--}k`3Z-45S@FYm9l6lzPEU< z0**@jt$2S$|2u$4E5?eZJn!P+FDm0oQoNb%naX>1Xt4z zr!b3a0N*U1G9HIZ+=qYQHCD9`uHkp^B?GTCsF%@!*XwShdIdhGLwED-&;vh0{Cc>g z%@ggDqu@(c!nNs~)(e}s;_WJ1d10^-k})V-i! zl5O%^#IHt2ZqYQy)-$DkOO)m?nKg$6uEUZj_tAcfU2{aGXpVL`7)yrci0+Dx{B)t; zk}da9eoHUS5tFMq#-1MTxAd3$7{6tZ=7_zF=U(f;^bHAi3KR={J8Mn9fVj-PtO&l3(vxE;7y z+A0qHc-%tahYJ01cglT~KkgplpdU9^ihjI=Iddd)=LqJ|;moDQ%&|r2$BjBqW5(82 z?5SH!D<`#n`P3w_dxn#&vXsvq`pBHQL$?{Mqw{-gh!)4PJfsD*C~a$UCHAmgu+63X%<}=+Lm+OZ^Hkp3w9iiGsj@>O{Rx8#PgT?v z`V$k;O$EmI+iRn$w)Fo0*?aTosH$|~`&3m@sj5sBGlvKXh#?GtTxOx$42)rN0KuVc zriKva7a3G!5S&s`n;S*DPcJWnh$qLOzKFKRyS$8HNK(ib1W}hAfDeeiMQJ-Be4Q)}u!UOP+QWmadg!;)Fdd1qPU|6m{Yh)WH90na_*teFWb!Z68<+^BFe^beJl45Qg6VfA&WIWyGQYz+dn~T zeeW(Ujc3!jAB*p49Db-1@VnbGK1t2Pw)FYsUi^l!8N=@DOKY5-h#zhL`(o4!_>eAL z9*urGQD3_JFt&ryD)`=b0XsIiw#XW9JZiP-zq5uKy=k`(?Z)HJoXGiC@c#4552+R7 zUFu@`xJVyMsh`2-EHTh-BJK7Mw7axTyK9%b)V27N_MyEQRy*xG)GbxJOYz~T&ej2YtU>n?{?P6`S6fcV=3{Xp?sE zTbicWb^D4)^$cy&7j0JaF8;He305ev`UQMprCviHQm>&8smIcu)D^xdO>wCw@srx1 zD8??uqARr3nKtb!oIGpSoBGFTJ!sdx;vo3hZJfiG`whjdH{sW<Sq`lW^#a~K(ABA(Tr;wK@|tG{&jKc=ta)Z|{Y>^Nk(4~F?OfF~5{`7yG^jE2_T^6pcSaC>w=^>Z8gnjhfJ>is2^^!FK-{+n5 zn`#VZ{Ku^A^g+PU4*WE40j~D3SJ&fLD*gO{b3QNYUr}|SRQAS<6)vuKFz&V`>-W&c z5?g|CFKrC8rRswj<1t{aKjXaFX4eM-FUPFyjb8&lUL{I@9G~jF)(~SozRZi*&pW*P zO1=1lE~cHyw6T_bc+8fd-%mTY``a)EGLD{%fp+!&_-OaSx4J?}HU9L-9(4`piGqK( zus6iV+RK0WmJ0l_Ypk)9amIAuQs7Tu$BjSYDZV+{8m%u-l8sjUS>24U)%357r?gYY zH&L1SQZ0UZG2egxpPix{W23!?OU3RYn)Y9<8sTxvK4fohW8WOkRkQ<6>=B?Fw&#ay z_UaK@%&w7I^t%O`#8!A2yMP_UOE^Y(obmy1!-L?7Tkz8zgpck9U`d{P6*x-8|1ou; zO>K{T`@^>O`b*%0_aBN<@3HZ{E8JX5)&I2O19k8sw|VVT&i>@ur}*}M`+uVS&w)#( za;8BURqwQ?szCt{cMF-{f>Ti1M_vR zNc9EU>kqH4a(&SJDD{tAA2>UbGFttkEk#cxf6hlMqSQ&YB%QN6V=eZtA+`|xA~-gY zel9N>t0f)&6#SQ@55PxT_RCk+Bt40KZ^2JH$(CY#jjyuo<*)HumiixQPwGjwcE&Mq zk?he#p0(PnMv}DQ-CO#hHD2$x!j8>n2P1)fGGIjo?<5(Q*$2o5`epWn)IXwaseeS< zQh$#2jzTLgv7Zy={i+X3g%ih5u zub}-s^z}j|`;9$!%)7gE2mYhe*jK=YF--}h1a~V5lpTy*_R$plLpOnIXR^k5_l2oL zdGAqtLx)gq_U3suv4@8K-l~0W_OoBDpxjTt5Al3Q=u~g$)TN2zw6|FIqj$LR<#wy< z!7Fc1a;YzXS3X*PP`y0ash(KwRJSwc_~pCQ_z4!3?}M&j4+Y%hDGA0RYqEZql4MNf zTWeUSKH#9f;GP8fNTd(ePG^pc_288)lfv1rhtx~-kx2WAzj4w}rFv#^xSGWEq$w^n znY!b5;p$rO&&$BrW6;&3jAt!$YzzIxF&_Ef2Yj@JmCChPHx z<1PBV2>p=yMd-(KjIV-rg}yxj?F-Vb-r%w`d_x~_&=%mCHDTSHCM^Wk^*H+S(^m`Y zDD-ugNlTBKv@lLT8lbldZSN#*Lm_b`ZU!%Q0~ejI+GqL@E3_^2Dx6pgF8V9LXZ;*F zdp3UD4d8Hmxr{^DNr-QHCGBTI4|UqdjzHIGU+RwPBcIX+mht;BUsu>UR4d9R7Rc~b`1W=hJ9+hL{CX*4#IINCj}LB3x0=B{ z&%P_PD@9$kZ-{pKk&o3Uw~W?yQ7D)_FyI}$;iq90)BQATApQJ-er}r{VhV3d9-*NdC zp}ny-a1gK|G^`XnwFn$2@dQ2qM|v&MdNgzHg@(0SQYjTmJ7p}TpN8#Z-<>4}$5e2M z_in3t7`nBsYOLo2$}Gw^*^fQ*6fMg|TpsquUg%c^^y>)p>oD|d$8xLs_VV4(Ei3T9 z8`@=scI|FMyR7QQM|MNE_Ns#ygh01KOuF?xbmOz@(5-I+bn9E_OzI*(-TH6v|F!8> z$Q8QPX~kZ3kIiPh4?Q{t-TIDx+CLnn)={^HN2)K<-hgR;n{G`5cU%t8t!eOBJD>~k zws>N;Bp3-RLaxxQ9qePFThrJhvZs^iw=Lb0echIBNnPmHSF|U5N?W=$4O+7Y`fzQ! z6=K5AWn%ICJi4{#pQKxR)xE_25xOPxO6ZovG?0BIbZc#ZZmn%Yw*BpXq+3gX@ng`GrNH=~19a=%D|G9C+IPGoK(`#% zp<6r$zWFiTS^}=9fNs4_A3?g+|2`-ET%}tB@JkW8l@89C20qx#x;zekc#H9%(}GX* z(=GWgbgQBb-I`|7Es?Q;bnC!1>6Y;0BI^a|7P6P#mTpzR3kV;5ZMr4x3*9x&o6GZ6N^fq*B z7JK0ObW37V{C&D5Jafv)A=)hPQv`8=Vs{MH!if#k{CcEjTQ^#J06ZW1hcViNti@Jn z@DAv&JR1cqtL0tGfE?c^T>q5o?#rXJ11mpP53YpfJyM|-W!hEGBX+d}9?~}(d(+;b z>a)P~d2rR6!$QyzpC_itI&9n*`#G5o-nfiaj%BI3=>|@{iTo z%Tv@U;)@-|zIitHCGO3|J0r9bc*pL&?X+*F{e83_O8cSeHyy&YrPz_rwxE+BcF7CB zmH1ntlb|j7Sx08Oc~k9F}$12+Nq4V2j>LKVP46YR3cLu>?7y z1o_^47FhsWPyOsl#aFd5if4%S{(Qk=tCo+F4@zLZydU=Cy(0f7)ClgC$75lS^m^ky<6SF!;tKH-sbYo7+5y)rt zqZD$_#cC;^57)w99;p?=w?#pFtk8)=@H?!leh8kYpi7Fn5MBa7QeP)VTW`j&kiHiZv!^$G&ZK|Q?`(&^FCFVvpF@`a@(!2!G`v9z=L;>j zI<(`Wr~0i!Jxn{%x4P77o{c0n*+<~PZ0Hl`81OhQb3A8|Ki)z{$foZzBFkW#y2!h; zG#lAKbVj}D`+-N21;6Nh=zH-aCro}jo^hG{IAaq2`$NVr^=H`+CGaS7Si=k0dbaWn zXTTHa@l8G>L)s$77=7_QCup0vZtyH|^ut*6IQo$Kc-oixc-oixQN}3sR@QH>HPUER zqIHP_mO)#Kh%e@E?^D|QB+y=RpuH1;_WbRS540bLOkwtiJR$9u6N9QniPTTBPv)~< zHnLY*h%wbVif`Dg_@cpK62q|kSBlybnkahH*6J~ya>|nGah_Jnmj8*@n%`j`L!+vp zSI@%Z$@3-fit~w$CVO!{anZ_wt7xvBM{X=(&xG;Zd1OX8>nR6*?&RJ=_zSr=o_h=7 zC)R<3xfEPfa=%?|?r+tO!&gkaFGT%_u}qpAs#fv*m|o&PU}p@W@UM1t zCw#$v#$Cm=X3nVR@Qm2!&!OJZJ4~BO8}oQ(F>O4+bKNM#*S{P8o4P5!9*n6w9QhdRj{1?CZaK`K88$x)_!E<*}Udm8>`TRc>F6C!x0rwM#r*)~5#3yU7euq8# zVOz9*sY8zMJM88^Gj%jE`gzVKkJw^NeU0FP+D}Fh@97wLM*%l<05?Rjhpfg^&@|Cg zO6neoVU@%53lYQZ*JV%D`_(=9RUTEYYM41Zl@$Cgh1|JCfZ zv+OOwZ-R$Kr&MV6OMErzi`bI|ePh*8Tt9?sxS@${}Hp4pf_sj8RwW?$?drMD7^>cAIZ0uF@K|=i=&~DpWm6|>jB-&f@aDb^Q}fTam&W^ z!N-LDvTjLLTj?iyaI*Ra*L&r)gARU5oU>H54x8FquH_Kptd71)ELPr+HeP3Z0zb2f zBk46`twrf$p^?(|7-(hzb6(86)Gf^+UYnKctQX_zfgB=nE3+7vj3tXPN-WB=W_z;! zF~+tl?d|5C+ZeZ!_n}W7*6`f$aawnDh=OZ4i_m+bQ$&_BdeWy!TNs1XpEcW$)}N() zskfSKM(fB~w8#4?eW`oFgM5cB`{FF^dBIf&iCGt zp_DFDu0Mu6JrH?a+EL)mq^(KxQA=z)k4NF!jg@k5sGZ zBaMlSCtL6)-*lXBlQx#ohSZmG4>{1do3{M4y;|Lk4z8cHQzi7*qFdm%MR!SGdV;Bo zN-*xC&kDwqj_ma|d+`nSCb~M~LE4$my>ul}pGf~>XlD`q4dA_7Xs0_ege9O$$b%lw zfQJy++D-d;RaK>9ZBe?#W-)*jJ&SpTMzMF3DczI_lvc_PMqSul+PPaNY9iWbV46@w{?v*0Rsd24_wHLkWQP%#;+nlES^gP$@q0I@%;eX`%y|nod`ruDk*RSS< zs_j-*qJs{{E@q!Pa1raq{A2&1--Ql35no31PV9?z#BY^z30apz>R0SFIfoGa=yTqh zQgkT9{dID!gCWnnz%%#Im*f$>MfCH?@3+t|`e!2v{#oRI(RW^Ee~CWn1Z#~xM*joX zL{5KE*4}%x)EtMozx;ZFNwk|}W1pFQC3F69(5xrJr?LO^WcWC_f5O~<$$ABQ^mJ0F zddB-+1vZ-NCB;r6S)IL38|PaL}>L_G&S8onJ8KVDKEd6`WD8#b`~><4X*GbO;RaZ|3gKLq&{Scn7`#=3KS<9sV?Zu{%XnuU~; zDbtZbJ0gSb0dMXFCWpeq7r>7Pb@?Chehq7QVRX29lyzOtvv1$+M22vxjnHGx+n~Lo zHZ86Bu`@8SKljR0n4b{xjq}CCr#fA8S+5 z3Dd_O&Y|;^5aV;kvi?QE$4Z2-jJ=&wum)LK- zir;G{_8TLlP3$%fSR9qnoHG|wKZO0pX!h4_?6cX_MP>odSH202@LIwv)7Y2k?8{Bi zjc%-SC)W67-hGVo#K$=wJR>qD?~9&mCb4*DLrYFc{AuoYj>8TOnaZ7#qT0cUHzzsN zFz`)AstcP5_T6oq9U$+g-xf(5=njzcN{|g(=}Y(+H|RFQ^i^9ep+XW!krk zYKXOGtO18Dz?NVSduc80t|3-z2soJdFX&-s@;`HsqIG@8q8;R0BGD;C@m?!) zGhc}|(nR*=41-vJ#JWC2d}QMFum?vfP9w`IdoRp5U;P2Pa&+V7+KGHdY$|AA7i12H z>{rDB%*nc0j2`I7<$os660^dX#e91BMS$y$Qi|=uT~cyplSnCc3rUnJ(i1y}i zZ!Xun!CT5bktx`h#$4`|@a{9TarK^jXM{12dsW<%>xa4Te=pj+CvoLve>m80UD8vC z<8*`8GALG)IP(qv10S59qaiDKB(8CKc&;Y#gni=_-%ZF&-7WapTU;KO#qH^0jr1^2 zp!X<`#6y~`gnM#XcW9C)hrM!gO{5k>J(>SKDSJ`QrJP5(27YBN{7Pr=UuayodNcSh z1Kg3(!3n-`vWE_+ad(hofc1HYwLJbCbi=Ht=%!DxH$*4RKBcr%hEgU`CK`{iFCJ%) zZ)FedXK!w2fAoR>=yPYd+E4gA_I=|0PW3W-|2_KnWUfQ~Z~C~OJ|@t99XQhJ3Ri2v zlXA}TXP*CP3TKJ%QSb1M@TmP5J30lU5943NnN}+Ap1~%g9q&sFVLA8R4vbWccBtEF zuVzd*_d6I{*w1p#v_tGBIA>^2{~I`O45fcLH$H<7cnali@G$YNz^zG?VU)tV?JQj* zHVoJ)RDd@nrtoIFP3J7sAby(3ALPrs*cZ)Ud@~taZ^qS!F^T>|&aW%J-Cvr=+2}qS z?S;shwA~QB{U+YYbEl|s_MDCmzcXbR@r++i?5k~!?x($COT4^_ya%g^fpwu~j5ZZr z!lN#`sVC^e*?pfo(MNE;e+fF6a1ZDA(8NEZ5BO+GD03`4EcQiwQ@YZQGKn&gGJ!Il zGR~;Q7GV?ZZ=n5J^c#I>KkZJ5L4e-W7OGuDHxP4|O+A0B;yaIi;5>SScj)WLZ^G2` z=nVc$f9H9>ZhwS!o;JQiSCR0Lojqh%-{;-W9<;H>HpWt+emK|8n%L3XRH-fbim#gI zm-2rGz1`85BFDc_`ggK{f0 zbqnF5N|6UBD9~p-s*DFim*KCUhIXIqiiaqlZzpqeL$? zQTmP0o9FxWDkgu)`@asn-*sS$Ds;RFdM0?Z4BGZAu-d?U_oA$Z7rGs~5e0szL|4Cx zJ-nJdyc<1qK65#Qx$F!-ax=V05aw57qc#~^wNt?8=fGxXbVb?di7J4r{lL@(_P@}x zzTEG}{fVqm9&2=&`#$bt%UIS988j6+v)>qBT8J3J#4o3?Dub%xT9oY5-KGZ|ASXhaP1m(;PdFl}J+fJ1CCjN55@ zGO^Y>@=PrE<+*a!X(wle5_4Z*1bqeZ&|{6X?-tc$d#j;+q558UEwNGhJ$#toMoBT; z=&juL6g7sn7F6BlQ7CVt6xuJk%Ji>S)>tpEtU18^+L*hSnd2?cyxWs^(`k1L{OttZgVyUqxIcz#d1A*! zdtw{1)O!TGMmabAfO$v8=GzuAAHokWVy-vKnHlp34$&XrEM5Vg@C~4}>1${^lxH50 z^#FIuS^OSb7&wRc@aXo^z`MENo{roXIb7!T9J0LVYof7519sq5tVS!c&bgr}YBYT> z^xo#_Mfqmc?PkpPjm&QY`@IJ`?2hQK^Vz$fvv0p(-@XEk%S%du9~6FR54@61t>Ntd zDE0%3(G4s?FHnx|F%KME4lD^D4NU7p7~3Y``)R(ho_Lrc*x`g?hjW@ee1<*To3=X9 zme_>G!&5Dx&84(CfaeDCTs!t?Dtolq<}CY;Jvt2>dy%~etj2S#Mx`_mS5)_A*`b7A&yKiVya|B$>RA;68;6vP5Ma;Dh;j{1@@ zirwBt#(4(%_G{YrvabizzR<_|nTl@^eMqcTbPjqlcvk`MitWyytM|Z{$@%&r_M^+} z2R*$J7J#|Ou^X%hr+piMNr|B^XVv>`p~h#d!!~#|8CwP4E4Ef*)A};svX61EWiM^R z&QQkvGS8IrtgQbOWbSCr7t*jBgh$ogSKun?%07_wZ*``q=jda8)i}?2%3X)Yc@9v% z#xD~1>cp=S__~Sjbg|w~@e5_o+S#*DKC`&YjJ3gWl}TCv0KZV-oieTbB2!m-GJ&aPuJTPNUsr*u1<455sz4 z`?E zFe!SbQ24Z1V_H>p=``TuceJynD&I3h%ES4d&nX3WZ3So5@OywceIEVtdi2cifV=(- z?s^y9#};%U?=iQ_IfGom*(3Wv{{!p!C(ck_;!I_W(q6~*)cBUO(f5&0jy;ruUC763 z(!-RTk?ufF_z>OFO94E!9(&bqfi2MqT?D>N`_#kxN}sc~*FU3;3f>v`{h}Jt7e0ut z_F?q4*x~BmFs>8y`yKeJ1^jh}vC1A?3|}Pue~LZ`yHtHSE3WBus! zLHe9Ve_QzO=fEwT+3CmmU*WANm1kr<B{NqeU#_Xg(n73THA&zf6wd@IBL=G=aYPVmQb`x&~zYt8Mafw}$g zM|1lfZJgnqAJ47qzfS^l`x$dv&D>Tnw`YDdw`cx=xy5cnKknUMdWLxj&aL1HnOnIh zu(X&tU&P%1bZ%pr+j#%JZ8Nt*hfcA7+s^Gw@WJ2Tw>8Xd>~-e0<{EPw`wz|S3go{< z$bLVb+eOF`*P2^7*S*L(1^2DUHs7)apUb?nZr9tlGJi|izcuJpug-0l9%jz1oH76W zeLI~wUBiAA+;E0c@Q&bwPVf`Gf!99p2hYPdtcO=v3V*Tae!o8IIC*+LB8Si2$OiW! z6AVTM`8Dzf_Fb$kX9&;&!H?K@QKq8bXs1iubJ456M*gI2BVM6&ODQKi8m2zp3L8>QW7VSi+@j$$toCHg%6%ljpkc03cMKS?`txE94V2Re$TL7d6w z57oq`#>_cI|B};7bV%pIr9ZcR4w*^xOXrZ8%zA%+oiU*+BtISP6^eeaZ;I(-(god& zlWSrJqG$BdUhSQ&ZL{5Qxqc5i!N-P_pZx~ElTcgvMe6k#ztPU#dcSt=8)9Z7qlBYZ z$foR0SqV=H?{Np-8k*-PaCzHm7EYvzqk@)?C08SL@A)D$%go+6#SFTAP9)4Ax+ zI`WS2w0Y>wraH;bzcsL-RzsxC5P86#i@@$k5SIPIm=q3|1;26>gc%wd#nTJ>4!=S(MN^zjst&+ z2+Az)2v1MS+xQhS_XnBxM#kU5x5O~#3Ue|gpx3rC@A>df$ftTfeAEdET;#&5Qo;MY!}sz|Cf}~1gX@95QsCfeo=u1L z66@Q@WnN_+Rx_p&-pgaYIcGDh%!!<#S(zWHcjTM=^~0tP4!xQYLA!4Ha4N&!X=N%(Lk01YXEzWuyTg!Mtdh$dTD*{eWo$+?{-VoJ%vmR^uRN zJlK#JCCs_tPfw2&b-uKN>@D-T4Ou*fGL7F}=AaW}v9k6TX6BG+dKb7#_6)WfT%W`B zQ^dLyJko{!N79Gr>_^j|?5$?-q|}?io1&+PK&K@22y{$RZy^>=72he>s`zH}8P-hd z-5E;|zm0?>gT*O20Cflct9IW8xLrOnU|1rNU2AP?Ty$&@O@IR=KIY1tcBEj zFb-*3a9)II_a@gW)EI2vdSLe?dM>g5X+?i!+7WT~Ds~9boWDx_oGrBMFyAKEynLIP zixZqFwh!CY|IoJlS8r|enz+lN8GM_kbf8avOzP-m5-0^9#!_ZbUK)3! zcBWl>?F(?>277+_7pEv6x0H_~Z&e{UqJB7jP0-l}= zbJ;5|7C)v~)xsPo=xQv?L3*fNwQ#2X0eKJI==*n)ClOi9u<#9;p`mIn@Hsm)1^e*| zHQR1icTq2)?%-PmPN7fwA^59Z->n1=u|=VMvB4Qdf8DyvI0#DRf5gntxp@)W|+^t%H#z`b+ksoHv|jKl=OLN1yU7p_0E9-JHOu;1~8J z^ildNXaBvH&9|~1!F3xdYsERx`oJ2=TD68M3wK@ketc{GJ=%26|1QI)owwbqouE8< zD#!O0Wj#3~8^{;gk^i0GfLFxhuNmU+3ex)A8d`mrxKFs^{A@#GYb#Q&fMs^tMS;Tkgv@L6G zo_7umQO)xu@U*PAz@@-v5H`mHkH_J+>X#=1i^s14i;39a9EWeMQU5$O7Ck~N{-?;X zrcX?Tddn=knu1NmN6hg6d{a&^$M|m=DFTbLLdiRd-PNoR)nMLs6xs17-K&;R_roG( z02Ys30~RZ@{IJ;V@JH8y#du?a35(=kX1zbWOJFhHSPU#KY6FY935#MU<%h*>tn<8E zehQ1;TYdfx9XbmZ6FCA#gUw>?4Bw%kYELo8f=V=iyhRUPb*1%mF`QmnZkD zxZeUC3EWkiunR4u4}q(>W*>r=kC^oqWF&#R7UU&?H+iPoyoL`Q?F-zQw3PeXXqU5X z!)x{>`KTqIaFj8RJ_OF@(T53V$W&67yxLNKCIEK=bF!Yp1=a#^C;X=gdq0A^n*%iQ zbO%38G-ZX*{Bp6a`=SyVEOgbcjuMMPVDSL3co3LtWUn=`&#uzNYr!IV4-*#m1B+ol z6BhRai(&r;SoGuCt8`IdQFs-BMb63YvNK=Tf<-%Yu`MiC0E_kjUG(F?vB0ty_-soT z%YoUs{p4B)V;k_iAHKnh98>}CAo;of8Caaj+O?&NvQC00gRuBj%_OZ5nc(Y16SY~$ zW4=8(K7mg!a4EF%J$?n`pC3iOfCz9~Ch_GReA}FrsV0ohS^236qY*2UnHT8u$`i8Z zjjBfy&3e@%ifL<<>6-yh!nwT(kGyZfBk%j^V4_(MCuh3UE0H6s zkZS~9N&@eAXv0zcnF*f-=r@COaTNMalP=PaJl~x@P52}ayVU2&<0KJ~TsL;idmHX9as1K(^hiGJ&;}6p_7>m@;m^3&{KLdS``b@LkFnuO{ zNIgg!M`4RM6gxS=n_l$1{&AXn1AAN<19T7CD?I91Xs^_tp>3%@W72nQe!;t@JlO_5 zi@^yp)_(;)p9}j1KF6B0R`}Lm;8Wo77x;v~1}7lX{L}C$eCywX&mYT_*P@?s#B~0J zmlgW!mn;7_@UmCv=lmbi&$G}?;cx%@Z_v*Y^27*_Te9+#e~5n0f|eCsgMNAf^waY* z=%?7q`Dt!j`gv8Z90iTL7X2&<(9e=<(9gNN$gL36u+8YZk6@E3#q|@ThBDC30KTUqt)MfbT zr__ah%Kaey6yEk1x$^&Ca;5OB$N7m~X9RL%VVc;E9#I>SqddrGA`^O$&-^l>Uk0p1 z1{{rC>E}ClnmnTDb-EyD=7IOoof!?tN{z@(qQCLC@$=-$a8vJst~MZ7HX(yGBab<- z7ZH63>4549b*2xchg>m1EJf26Y4iccNb}Vt#e_)^YNm zYX!)ax%?MjEQRur~?1?Lmg@f{j2X_5&`~G@SK3%Q-mIUtD?^t z6N3HY2iT^%u}4CmLtV}x3Xpq5pVJk)fb?&Jx>eCXh;DT!x>eB;gd0u7HIZxK*m%iV zRZzDYiQSi9juUy?t`EbW<>sUq^O~JD6=^e|TdhPUZ!1H3k{$o-Lh_z_20>0-E-y+w7y4Ba@44L=* zy49=toCU0dtdHncS5wM*$lBzE`1Lv8bEYeCxcXo_=j128H1(X1bi-bzJN7bXv3sm$ ze(Hwj_{Q{6_%21g@Ru>#^DB<4YgQzxb=YIxL@bofk66`V=;4N=gOjxpJFC}}2;GA% zrN}?X;gmMLd7{EOX1pQi(mjCjEMT{ZGmsK&n48}TC8j{Q+WcOKb_=rSO~|1`X?qxL zcjpYOxs&4ShfU1g+#Aom`?)rOdM0*Ql6N=@Tbcp*Ne;qqaxglI40IJv$_DHnouWg; z#?i%hIr*+g`j$M}HlDZee0Ti3nmL#5j*nOKy|jfbW_RYJBXlSYnJ$L%Jif=V=KllO z>yf89V5`NqV&jxz1o8#zlH+I#cJ@zlCa5VcqmeUQ*?W!H#$tDBe9fFTs>8J*)gQCh zu=z(nuofG{M$WT4+g#Xsx1+rzgSpeoIj{4>S(NDqB0Aq9p4Y8zy$YXTY*aY|v zH0GC5G0(=tkJQ9WZNvzN)<6JN@bzQp1U>@hjhl(%oFCQz^I7Z*@kMYmXSZW# zumL-#a_pUQx!#d8%`u#(cH~S`&Iot&oSZ4{=2dbZ&Td7gS{T@%Gql)wpVU^5cA|3-}Wr;h@GmNv&1ykUi_xT{x+Sxz`2bvg)`<> z=5GpT%TiAVH|2)dRIAsEkF`}V;Tzo84sf1hOlEA^;4jW8^~vV=EXHcy7eB|w$HBr&qm%{V0va_>25>s996McL5pM(qIq>o0JQCFlODpBTKM zll90+Vy-IqWV~8Bae&2=^Pk_0%kdRv7w{*M}9RcrCtiBuvhu{*3}zABlg%9FtSDx0P9BtBBR?#r^@+qaVGyYVxbmhC|W)Bk<=xBs?%yIF5*9P!##`Eh5A#0dxf!z?Y zcn9%yeH|ZIFK6TOzb9i|fIS8_s-|7_@4gT1a4-%Zqan` z@9WsXHt?(EnF9K7V@o7UoEmtG1j0ZUIoUhFBO=jN#51t(shX?wNpOMqkxH&?LwT63q zcjox|c2l%WYlKI92D*@^E0cY`!4`5P=u5R>4|%hw*9Cm5ti*-RQ-&{8!h6ld|9+nM-b1_3LBrQE7ps_)O603u z$a9Z^+tz^pKIPe$p|RqF@G|svZ%iV#Je)@pv!)w#DVLZvQ$mvDzVR~pU2jYr_CZPP z%Q*I7h#o>**tIc9?7a|T0I#~^bIzjN#N}`0Tv+O|KjCfgPy0lDmYkh#;y8p5Ur2o5 zLWnig%6mhg-P7EO*q$VE-HKh54f~Vh>Z8s?>{=4x587e-7NXxo8$)8+0ed0FP1q$U z?oe=asJajwE%e07_)45{*b*JbC!Mos-WS^zuO-FY`>YqXFp2b;f<3&qlrjl1>P5lVu6Bj!heA5Not#hphJZv$~@r`9&8AnHW+ivX7?(ENO z@Mk{l-vkaFN*{t_@e$K!fU90fvZ&SYKour#wd)o1aXK0N2M?81Q4CBfax(^TFAU4+m+AGO*sYQGPI7xR^$=(w? zM;ACY#V8QjOmJ#unA*5~v{q0(!6Sa|CG4>U-qD`(_;6(7+p&RtR?9vMSMZgE&&Xwe zg_BRAmVGF^g#{iXy?xSHP4+bSSoUfmxT>4%Uw-hDm9n=>_@OVVoW&j&IxG8D=xaTE zN5cih*LJ@u?8%co*}rQ~j=dHy(suuKKqkqxD&r*&Z38^A)1th4EnoOt@rB>x`n$gH zvZue#w;j1O(M7!baN^xZXn(cY)_rNSm0cu%@dff5Uiyh2{Ee4K+?1oa@TVTtD_0wX z-+N<5sMgdQo7F*z?+|m?$Q%Ouo<_c%HSo;lSHiE1U;S3ACN{N_Q@hqip1*v{x;pxk zv6ywP$^RhkuC*nQ=P%y8Ps|u{^GH3xU+3Mnb@(Uhk`pk_e}A*T9?Y#LIUD5}XFXtOAb&HondRm#E}6mmgc zJ3r80A0Ew|jv|*pfyNx0c?+c9>&73*k3Jis04uKSXh3)jjwu*&W%PYcN{pZtWi zy#9ZP%b!e+ga2_3tpC2i|Nnc}z$gC`+{7N7HO-%YplFXj|G@0t{`>=TqLEq1Kk($u z(OPkqTPrChrc^il1$k%Qw4s;1=P;?;gM2;#G2ylPAE_CCy5%Z5#Q~ZEARyjeOncGXn6^a`<4W>;sXr zS`Hs7)q#ta!_XY+@F1Sq=Jl%5ZRjRmB}cTtQZ=;03%-XB)~k`><=aFj@Z)x*4QcDg z?MNHamSc>v?q6+7+8G00Xi;R3N8+0gT?2PjGd|HTL?M4!Q!k;0+(IM1;Ks{%0~71{#+2mNG@Ql?~r^F5+9@? zvp{Rg9;LNR$?-j7bs(2?DHhoA@?YTR5OPXGrb~0$9LOzQOu3~i|2_N{n%9sSu8pKF za0L%hRzHO}92<5u9!ru zefqdWAIqqpA?9dOpxq?e9S~@D89JKadsp*E91P@-AP>Wp{1KAJA(%g+%8YM)6uKz+ zB91~A#TP4%w*2`c@PEHe;_tN0AAyfJa*D(ezh3@`8fdxr$kf1Bn0}Y^A@xP{A@yJk z?(64|zz!XGPjW{@qmLH*)x+oAc?w&KQS<|D&_~dZ3m;qd zgfYwF(oI?}IKZUmiK+|OXgsd?ilOmh!zwu=8p#=vL;R~oaz;p5#JyllnT2!?i6!1Pcf`y1>pqVzTHCtlVH zZ1ICRBP8~=V?7?|U0;km89YLhb}d$gJN=$D)kzvPTK%ih=v{i=X|9f5uw zhJO8$Gvb$=5x?Y&@aH=EC1=FdTu1*>&WJX2s~((_{F|X>&WL8@k=VY&v?k}>>C%7H-cC}#st%jQexFqo6jtS{}=ly^ym7ymBhX$rnbZ*_UDTDKz%ciE8=(`3%`jRew?YC#qK7UFX9|_IFd8M)wNB|h&dy*#l-u5lYJ#Q zBbE~L`&IT=eaAq~h%V^txc?%$4$0T>BKOy$??|{;>^l;Se%zB>1V@R7)KT&>;Qv)a zd?d*kAu(TDu<7|*c_V7jvy_e{?m;ucO|(iBpy@Syb(w7C;MUEh~0lPZ^RNaZv=Uhm>-Fin810{a}uM7Z;<-a_%@ed zpB2m-A>R?q8zDN=e>QK#TZ~cS9G0_&5?ieWdl|`J`p@Q#_>%EUd%;|B3N|yf*r#k{ zugqo7SjdA^UcIxl7MqIN&5ADv8BF#Lb~$F8GSN9_dxLo+Zudy+vX=cn%p0+eJySlE z+}G@*g=XFe;EVWk;uEZJEe7}&AMh}qi@~@0YTgK*zmhj%_jU6|M4)>Y{n}6RM)dws z-U!ZP62J#P$Qu#;)4UOh_lKByBa+B#E_ov&|HH1j!5x#qhmtqq2zG>5@t; zxK_@HCeD_wn=_(QAZJ9_)tnKRn8QohqO~%o-}TP%ePDCz-(h2RDUqBJ#9Wf|%v#Ps zcG`%aN36RT;)4ZqM##ONpEKeEGfsfmf&a~%5#e%9{7>YJ=qYw(*pP=wToY`_v3--e z#6oGoHqEqSWlu%%6Wk`aIGVB$d|b?Ur2enujQE0_5#@oL5!=Y2aGIPEhry$gGvdse zYv+vk0DSw;q98`5nKwdW%n*-;HYN7Ih#Bav|A;;Djv}l25ISvt-iQ?aW6l%4#)j_|&MbntBZ7G%ME{;*=8ho8BDNsYfZE{BJC1(U{$Qt}OXT(>W%`LrO z@&k3Uqmo>L?zc8J+9`12&dj1x)jVGQ9`^SIoB`eEUm1EqP^x+d~&Wf zMeJ$dyMuXaa>xVm6z`P@O$*oy1oPXN_+*P!E4mRIEzZU#Th}77${>r)Z59~B-DVMt}&l%WY z>(Vt7+l;Quat2}(*0t*cfpS5hoD(Pu1LgEUIXO_?7bqtM%JG5nwm>;LP>u+cLjq+^ zpd1`12L#GKfwEVi>>en)1j?HNWm=$24U|cNGA>ZM17$>@bOg!}f0=osazkdQa(h=L zXQ1cCRd-9+#ac&2cI>(6Q#8xALd|tE-|#cFlz6~#;C>bb`-`a zu4Q3kl8J20`MB;vzRu#>Xs$_o?yl$_MicvMB-eh=wPK!o4IlhS>`%o%0h?1wzfVjt z&%B15RFWKL`X$W9_hk;(DuL51e)IW%TlHAaPRc0k;4Hx7?by8h8QZSQ*mk*Xk(J)u z81(~ez`nx9>%29h@~kzwvel|o)>9B4h>0?Ym?+DchZW2NF;~fNoJwxpc9eookEr()#;7Xsq_)h7!*9i_-a97>-<8Aa zeG8(A!+4a~(s9I=-l^s-Q)okBE#k1lZLd$`n#AYs%-Qo=Y!0VEKemwPS^js%wsHsG zCGk8ZFQc4I_r?BlAUPTPa`rrsbI&c%NXfxO+RUjcM5B? zkyutX&MzzIcMmc1?8ws5$f9oI>YWpR2xLaF5ATHEl*FYzJ5BLP3^_ON1!KGIVSd+w zGbIMB>7T*a+~j85#o9^isBHF%*kodNOKj_zFYN?py0J5|L^;Nuw5|G;@l%LJ;}P%u|D}+n+`k_0uQ0+CnN{0 z*q3gk{}IG5Ovi3`6Z`&U_I)Tkm>XGM?2tDxuAA7`irc@hMV7i9d*Th)@^8Zael71j z#ygU8K%tH4z=YU~<}nXa-^@7n@|@Txzsz{{@gD1ANG$bNm{0P4;74|d7=}mjcawDu zH98Y-P-3CW9O6@Av~G83J@E$_jV+1zhTvC0j*qHR$?qZd&CgQbNk3EQM`DmQZFOn~ z>1#H9ftSe9?ozS$)En`^D5Edz6^%ynw2NM=N#KoVL~kT;*Cjnp-H~rQB7P;cYn~YF zWZgX68$@}x`OFAU3gr^)J_l1;us=`7{=D{-g3T5=*|7hs-`d;AS;# z$nzcXrNGaLHt0iO107&CZPSn5k#=dHHj~Y|l{Q+@LG@(aEwm$kM;qx!V!3akUwP+I zd4?E{7Bl~;_$3jGj&>!EXfOHzHuZG+W=!})qvYVSi57mIc6ze1FjIYD2YOzh(g^D13LcExJ;CuzC)* zs%NcHmFKMP%JbG3Xp>TD+ACW8_KCm_{#IA*6UD~YiM`?#`$YZ+?GtBpwP;S|s(qr2 z_v9X#3;A~cw?5d_?`Jjn(Z>cask5w`{OIF@{r1UMZIXN2;z#+v({ID<|4!wGMOH^w z|8;*`@;_*wTxeCg*4iASu!)XSlvOvpYP;u}`Op6P@NeKt?}I6`&A^wb~dG`$O9fy{G zbzc-Rca-`N&;4MVFQlV3~5j}w^; zek~b&f8O*&atX+JgWtbXLC2kDb%1{y>IvjqiB&6jj2sb0+q`Gu6Cpm7R_IBh`T)t=Kvy69-rFo*l>kED`#ZcqQ*y2(&)?hG>)C-^Mq*jE=Y$ehOkoEpdv) zPg#6GNAg`oT&qM67=cVC*P`e{@G^dN_~3Lf6y)q+t~4jS9X^dZJ`R)$Wd~ywdS?Z= zj)3m37XL=*zQAf1^n8xK`0>(~*gv``wQha2LjJ#MOSrt#x^}SX7qti24cO7Ynz2Na zoMCSaU#uytMH&7t;qWyP@N7LOvna(MQ`RpZ`Y5?hB%gug;26ex!+GZfyqRx$3_22G zSMyxEIZpLk-uXSc*59#yZscb8CiEFc)Ia<#hP9LD4yno<@^#TBzC`9)3=FJYI`b+x zQr2P$bF(_sf&HU{oEHB4B+wrCkRPsHHgdn<#;NrGsMCp`3;uz;yZ=T9u@2j=T_Wp9 zY<&7!6M?@Je4!28_y%!8{dpfc7`4os@E~HJC;m;nSQBrIQA$y&Lp!bG;=e%1&8t@aai@K^T4V<{WJL zbF~uI>gW0$i@(yl$Y?%fv@Bax<;A~@(l}%FL=CX0-&`22U7nBKmNl~SYh<=^ONwVc zbnkB3PhgPn8lpdJ)2YB*e=Hx0xr!-eRGkNJXLZw=Av;TfWz&bwSkPObVo6<=oed@U<2$CrkWd_DMWS#^$QZ}lXP%R9s) zI*Xy~)i>Fz=h>@oT4Km0=%{=$Jyh-d;!rKq66(p=J4`z{PVp7+u8;jHvP^*`+0z?5 z+XuWd$71&^hxV_5kA5B=npl#akNJO$|KZjc&qDq$<-hnFN5d1kiSLjE52ErPzk|wF z+M2%NQ}qLU@D*#a=bX~6^0^yQRcRAk<{83S``#NA;u$K$%8!;DV8qHlte#GZHghD+ zK))_N4KvWSzmnocHnkge_?ww4QUf}lIOARJlgG{Y9s1)f2`+UQdB7`pHiK9=XWA?3 zo#a5S;Vi!owDrq7+~m+ZM4n_9dGsRH{>09aJilKtW^%$96S0Fp2d$F>1{-OYx(A=j zFz_(rqF>3EZP)GSkJp>GE;=moY%N0Omb_MLX-nqfG|$Ue!pO-XI<7G6y`^o* z-6Z<0edt!~@LYnk?eJe>(`-k_5P^c;)_dvxknSd<3aet3#abZ4#6+_{=!)+{LdWtpGbVdqwon2`hjO- z3zUXU&=lgFOeMxiruQ zVv>oMkVKA#WWI&_@KNFeUhp@3z=eMhzv}tOjL-fmL0y0x`C}jO>CjUL{R&?yez^7U zBJ&x`v%lgRJ|r*mj$glW3?FroLx1W6F225#86SBG;jNR2JtFox_<-}i#Ai>(=ZKsK zy7<3K-mL=WS>mUN4#I_ARpwpd9Z5daY^#GY$T}RsKhJ`{oIR-bVTSI=tt@u=~L+XrljsB=NhpKj5P9Hq@k}k2~4yCBS9U-5!#hJ zeMe|F8{Nr9U_*G^jlj9+uF_4JUvv#0n{^BQ%6$v{%6-vKNPP;|ML$8j6yu1r&$mwD z887{10W+&uVg9>zfY_&j+tGjm!1b- zGPw%S=j>yyM9)c{L1P&BFrEB&d9>RZy;&%2W}ruVAHCat@~^#*ey#mOagzJVc!_x@ zSDyY7b571O<9@~=_0Q<30Hys(X_xlp+`PShKmAGlefF}{-)ApN{Uz#o_}kI1UI%}- zk3P)YwPw4Y&~7_*HP7y{S!i4Q4W(^z`k8I}`?{aLr2anp(%<$Wvwj9VvWdAtr{tT- zcgorIOFSdr`!I9$9Q*eHTb!Y;l>CA1^!I?{9l-FPRvyHLEY-M=e(s^q&)7GDlTLHK z{RGz~-V5}Ts-IGCU5Nf~kD~oIICuj%`7_3~oBv1o|1|eouy1;r|1F7%@ApCz2 zKh84}|7#-USjIJ)aSi2uF8AkB7Ew0#57p)})*{9_jb~=_Obq4uc8V{F{~_Fq;a(TY zdYjl764wR$sfJH-;pv@v1GY$+*e4RN2HiwFWqbYNqG8$&@2Aj-6eAwH%r4;hr=VX| z;1=jMHc63`ir$Ppl;9Tf5$TTV5Aly~XJkPaM(}(lJWLrpgxJWEe}^)LGK4aYXT7D8 zV@mK)H=ZBI^Yz$sofCS4JybR^bs9F0&`e!DIHfV4cx+PMn&TTSwEXx~deHtZfY@mtNW7CQAgG%6Ikh_!L#Pv)JW=)s1e1Is|J79B+f za<=er!?6RA`f%(*6l`7P+DvQ)c0y-nU^DPCJcVNNmtn?Gt`Fl{2JJ|Wzzo_1U(klX z&Ed%8@_t63%?#S~x988}D(6;@V^bp6%rh6x*YY^uT8lna`sqyDf)6BDxA1Yp;OoRr zWLSW&yP1BZezVz+@WEnxB7C3pV>cd$e>CgxidWn8`vlwJ8`J5}#GBAd;i-o~FQtAn z{Yd?0`jNVwexz=vAE`eMjGOlZ?Fyf@mcHRz_44igv^VzuhbBJ9C5%ICAjg33pT;iq zb-j-^4!jSaiEdtaglJvc+*jN7dT%Y0zMnE_Ta;R6@|j*gpUL?hG*9o!oQQ5`1Ltr- zdM10x(U}|$l;WTKQ+gJmnK3?~V~yC4*RFYb@P%90hd zUW3m)^6S^844Y``)@x5W)?FYDl3%X%U%L_~V-G&Z=z)X|*4l^>V7BX*ef@HBAhuaR zhRq4fDIZA;n}+R-C(Kno*}C&rxoh?e9w~6Ha_tF6xi-yqBrPG!VZL`09swr#5KL*OyJT zsdw|vq8V;V1sa*GuSG81fvr-1#wa;r6S1|z#>q(Fyj^m{N{(K!uaX?STd?<%^YDGZ zfcQ|#IrxVHd$jQ!_VE*FgYoD~XhZTc(;oVGe{9D>+LK)N@yLmc7ds~Z*{&0LQFxLs zXh-q_$AL2x@JEyM!C5+R3*RI(Uvhbniv?L;^n-^e%ZLTZ9s%da8}O3)LHOHB_}v1N z)>ye7Yc#`~h&`>yAWhJTgXFpsoj){!lALYiOP4%==$%X(Sm94Y(Z32k8fx;Nts~DF#3ab4 z976dTF!mV#ALswJ{tLAI?C%=c+l+ra^mZL*ZtQbUAMkTu@bG&0tsVCy!sj8Y^2}Yo z9j3|IoakHnvyUgT-v_YIWF8KSJqbFRCBTu$nNG!7nMVDoNzug7h$aW{PW8leMK##> zrP#WWcNn|RB>2EY$^=TMF^e;ZhICy3Og95FW~xfl#fx?Lt{kW z8UegWe$a1O6NxccLjKK5@HY~F5M3OAe0A9TCb(i3y+~ALc zz-1)98=1sYJqwQ{vBonk?XW9K`TvM}^ROJhcYXMJ=H_{hlt?5=8B!=A5oHcVWU5eP zhzyYuMG}g~Sg5CmkU1eDQA$cwh7uYyk*G}Xx$^Pddw+lXx8L_T-aoeEaP-{My4QW* zYhA;6o!7NG*OFuNRf22GVLSChdr>>ezR#@3#y$L)@7!6R zh;cEPO?VdbwgK}N_s^Y(dCTg#HexP5=4jhLV-Q?zS7twXD$c+jB@98eWF8qLy|*hP3BaL@k*&fd(}CIb}7dE z$53jou5xH^t#)X)fqwe>(V_iYlS6xV=&wL*ufkte%lX4ahxYeZ9op|k_<;r1ptJw8R!zpCDko;iv+tb7RVSW#b|0$&p#a!r+;yuG|tOW*I2Mp8<@~|J|B5FfH zSIMWhZ>M%M39#4IIzs)vRH<@)h7W@L0uRYONLD*?StB@7`s?2?729yAMymz z*X5AQ3~!9aT6JtY8f(>kUrg=(BiLF)sM)jW1@^P{?_is?kM_W|QovlUPo(y$SauH{ zu%W;A$m+a@6wk?OhD-6x?7G}dI-T2*u(A9s*gcigcf-#5({@&8n}6D8^~7YQAL1a7 z!6Ron-v`@f;FDv%rB_B{z2(kl0!I_i1FmLz!(3|5$Ng9=HXrw6``RG;8*xvzuMy9{ za%0$j=9e;C*9Yy^9s_p+cEa}?4(%Pc9oj$UI<(goV4R^IC&Lj`Py<^I7!JOnl-0zR z1Fqw1st*}_UtEXx_~U^?`%&cU6#%K~1%`5cp$z)@ zNPKRXocKP@J*!FhD}%bD0>lJ#(_>+ep|(?Jd_W!X5B9rdt$ll7{@qxH(O<&$7xaN~ z{(Iv7i-3Lo@zcuDpEB5z>gjKlQ5ym|Z0uTfIrKi$ zXG+*t01Sr3IFxbzePA;0HMMYzJ&QVckD55feBdJSMa=gi7fl>Poh{VnjDlXQhi#&O znw?Agi#mPUdPmgm!@5pZxX)6qqO@L{*$591Bg2|{uxskoQ41QftYMNi){Q6;=ecR2 zjyy@OVeSil zD%9=UTjiOq)a-|!*9C(%i7gWb~zJ0}0}i`d=x7L0?#d<0f6m&uclo!At{ z%wPKi@3}$$kF62~+{qm6Fd31HHSY7^mofPniFwFmfiH4pKEhUE^6evR7$&#=uFcHk zU>)qPkFdcyZ5C#a!QP3)IrYG-UsE$Hh2JN$Y*&%4(i_18ZlwJY-!1h%@Uu05e9ocj*w9EFf zYnkpq`%-1((*_{MQx$FBJ_$Z2;}New?zugDT*Pq@r_o^TN$qi8wjJ_MP1+E&>&4}C z?yEq%?3@bpCzJkgQJY{ZvbtRT(f$hL=U2ztx7$N!qYbGS^7KET?x-VlH+b3Uj<~-i z;%APyFWWZ8J7wF(c!z8|6z#L^P_*x@)TMLZf7Gx?4msB8c^7Bj?udLF#`E^ZdOahN zZ!;hGy(4nm**-_eamGC|#(QMjMtFye3%V80hd7gTE1nN=rF2%`UKKH(3Ms}heA6oV zDUy-E&{$n)dlHDfkbBH!b?y~VH*&LmJB!J^iykNOhJQUDF)_A&0T0-wpQ5019RLCF9Z9V+0Or}yJxH~;UgZ@1NC$3s$eJJ zSZ(KdE|EL&_pdKnmxvm<-{?=wryAT2_}TWr%_{sthIz3#P%rq~*cZa~Z4Mb$87hdW zILGEY?BxFoFYJ)pmBp%(fh(~1l;M_WyB3_o@|jG* znS9X6nG|7-$p>O{;4b~_>?N$uz9nqt%zwC&b@=-hoJnKkCiDOY>i$2RMH9&VUXb_C z;CHr8RR(WTSsa9G zEE!{pP&ZP-(``$BzUyi7{G`t^f@hyialS22Cel<8|J0Pud>;Gd<>zGVn}vN#;}Y4m=(E^7`i-;l0lDo@3v?`elrM{qr0(Nx*Ncn3fkznWi4r6inKV19yu)lzB zq4qd<`-q>j-z*M8*nbCYb76--ej+Z9JOS7&h}(4L0kGKoTNYEpHskBFZN{r-I>`&R zo*`l=chCkqewVe4_&t-iAuJw_vDGPy(I%74Z(-Z8Z7!~Fg1z%6uRss`SX>@)I^-41 zM;wlwbC;ciF?a{}P{~Ig0M@q;LHkV@kL-NLTL{ImDBL>=*RdP`b{)$BVB6e(wNr}N zzAoZ$jFW-9na)1&5r>Db2HU{}*NBJ4H>inj3M0zxdYD7y%mt%4D0zD%aGuE$@GMe2^>TY|NqM6f5qmLG%$7$ zW9^mM$v-CEHgHu@ml$LIEyfs=!%P-xb7(x{+En7$Umoi5Dsbuk;ol^OPVMB<)kq zzhO6~DE-6r&jB9u_t{xKE6ZhNYegvn8}b1rc@fx93$P&xYQ{KW&an6*lT%FRvU$~j z{-ki^a;3nB;4|a`56Z2T>f)L8z?sv|Z5-htX?F6IRJ5?T4vUp=cIG1n0$&xrJO?oi zBj80!DGf>blDcZq`o`&@GV%urCh#QehwL#y4QxQ^rdu#Xc2a zTi$r50i=@R4ZL$bFwT)=x^o-$Z6$8XJzVpS!_VDDnvr8*L(PWm^b)pLa3J^>owk_i zP9vNPIgnBbJu*+ID*gdIa+YJdldxZr6jL(c?^kdY#jiVY71NzHz|`b`gC~Q3XJITS zP6lso6@20^R@B}GUoLPySKMOE{3SVYOD|wY@bjwSKZS$u@e(??dZntkS|0g&i1$B$ zUS@tsHseYFU+ERBD6WQYb>3_+-tiE;W8F54we&mS2{3yReU<9K&rJdb;}7my7V_PH zDRIT+SU>9u`foa0Ra~P??HPE6bo9m4k1MW$AC!(hEP*duGZ^cR!MANP7D(oU1GftP z&m!pY2wYnOA1wmc)rhD)5?FHtaOMy^V+@|}Z$7FG?l}RopcgDVu+lJ?i!}Bx$ zekb-vVSfq!=HqX(HhdVw(wpJS$aCe>o8gZD!;&`3Gap1Hy&1ky=Qey9wk-o3xLN(r zZ*z6ySKkv1#;`Rxav26F;_I^zDoc>NKt z1{Nx<1D1mIz7XHhz+XM-KYmjB8Q1{qIKzPIMfUAyz)NC2nmG@CKKwOir!YU8)lF)I z55;~nJem323^U#dxo8MkC&BghuvJ+;AB+1e#aQm$TS3g`sxSV_{4*c^+O3jAYe`C| zX4_wR*Qu+Kd;V9iGMRP)|C!wT&wAAYyf#I&=Z5&t3dDaxkfWr8d6f=%(E)ie0XeiM z5K}$Lo8AVFTI5W~j{5_3#f>6Q$z#}pYtXOL@SpF(cFe*!=*QMm!ghCzk7Dd&a+_dF zzwMO6-6t~M0plE8hAnY|n`LK+bx)W~QO0#GxURArK+opH3Ha!$GM?)8n6e?I}MV=VBa2$zik+Yn!pOSO-0TeumBbt zU5yyuv#Iik%g7^6`3QMEa)?hdJ{f9O!FF6VS@uuvCTvB-62OVo?BrE!L#&47a&7~U zMu77)aC{)*i-W+)EXK8nN1~WyOZ%`N1|QGDXiNkLR<2G_zk!>dj=7<8Aq1!zj}ht#5l6xQb>D&&%`*g ztlk{kX6s@xj_d=p&9+&*jBOjCZ5A`V4~*o$b78Lw(=TBD zvbs<#U)2}$B^T|(E=v;0*V#6W#8ZvK1T zf|{gG%zUx#6Kh}-6a1OKGDC^Z3hrA5~yD z1mEZ1bBe+c-(|Vy#gLf;@f|d$%3>_Yit{kn*;t4I9tu1$y$G_c zWdhEFd}EwxnhO3S-aD&NMmWy&lNEHwNEZ#nvNgnPoADiCYr!_l5mzF&h;ceEq8*l# z#%xd{T=$>z!mxf0_A&eLq4+Iwi`e=)i*c>UKn55m^K;by$u%j4pMzXw+=uaK*cwas z@LifzSxj3F_}@dZ(ok8%>tx09xSshedmtCiAm0l)x2Qb@Uj^HJ^Yc0}MRRP&u;cJ= zmg1XFz&2Z#l5OK#N*}`hW4IH;{8=2F`8skq-kAsHpwa2qu$&@!wl9BdWMBNA0KJ|H zd*z(tO35eWcvwQWAD0i5Btrk^kJc5da^*W^f+b`^qm!aU3D+|F1=t#NI6u;*Q@`_( zXS_MB(Mm~j2FK7h=zP`4`e0!59A)Hos6--HEwV3hBWuseNt|Ij)LfL8)Gmgth_UlF zksH$jER5wQFGrU#C}?lnUFe?zPXAY+epYm7-k+eV(1K^>!-ELx?Yim=VA9je?B=nNt$fOcGh%%kMZyU5HdsxR zXh9Yqg534Su_ZWGl_-z|L+>AkJl0>Pg1QIbd_XQK0)f7)_(e0p0;!dPba+v@q-z#D`vu`I0Sn@40|90vJEx;)3XC0 z+aTYDp#6BPSz(8J*zokFV$9F-<+7-~kSjhKgj|2jLskQ)Obzl6a;ij)?UNPv;PFvw zs1V2W(`}jl0Dsa0eP^|A+|h5wKM4cg@BuP64w%E`{G!-U@JgzH@$Sc*X1o+_^wS+} zgaPO9KpSXFYKwld{6ZV_)d>A-1;1tnun)G*=qz9#sLLRY=;Wt?(+VD0HsrH0bU_vD zym@GA1=?XUe+=HmEVSi@c4|J&MN)xln`|dY*xH>_fmagjlo`M&H{o{>{tf~TB!l_~M!uQ@nQJ&KUOM%-|<*nHA_)k1^e_lYH4WC1-Aih@z7QY&efW&D1L!@8_0>lx+&V} zaliziKk>Uu`rysr2I6BxbTT5T$0aW-(b*!@^tNcIji(u>hP+b%}? zo!fX0wtWfPNuBrBLYrtO?cgB;{!NDo&w9Bj!8=eOo zcOYWJ->OGTz9P?P&}BCQw?VL~A@JnEa zfjh<(5BA{V{pm_!TXnt<@S)SKAzLu+Q9Ff;XHY;p;FvFv2RG*t-WzhW7s+9aJ`~$5 zkVX5s;y~2)dWLVLh2w+V<-~f}XS76KtcQM11@Ai>^BCMTaJoh5m(V9RuNa@_8{{Ul z4gYNGroWYE*hBY;tY%6DawqrUU2V&AkJQ9pZ_JN<$T4Hbm_9avoNA3#mkfj~;-jC8 zcLw_ta-B`BS2Q z?8eUZw{f3EkYO#b)!BB--704%l%lpGa4T3&j2OZu4f3bq6humcy9MkR8_21#IRbX9Gwod2Y^RNEXP6e)i zi*uP?{IizlA1wciqcEld{}Xs@ea}BR&j;8wY=7r{|8QH8P!JQ3`~JBn%a{Js)}Q;a zKKwcF&vooxf9#Lnq4NK4b_2Tf=O3`(|MJhIW`FeEv|i^&XMNf6xhcN+fwphJun8|* z)9vKfD5@-0uK)dC|26#A&EJjxwq4q}txUiE`I{ItQ~l8d9^G87X=|Fyq28GsuY_s= z-LO0Eooyqc-&fw|4>Av5?lk>a)hpjYpG1c$uRLc(it%{e!4LA^l!<|Hv|XE``}fwPwfi>08gN zEi2v-U3D2QFW*Wuz~y9E>;M6cAC_3uzJX|XjQw+g4N*d1iMA<_%?%&E^fDdJC2PIA z6;G`=v?aQC`%_mwElF9wU7*IHba(3kCAd|$BQS5BVvWLf27Nea7R8xxy`p+mdm5;gq7Ep zcymc?_Q`i^f`F`UoRS%p!KIN?kH7jDL}ctRQ0>BRE}4h7?rL1kBg5qy1s+(5Fula- zWY$&=eQp}`enD?8O`)mXwxYU^$L^q`pMd;dzA(HxX)1@pw)WZbshme~aU;^TJBSR2 z9KLk;tB`huT~wTf?|I|mfe+H5e7c=Dao-aUE_qMTyB0WIM8%nfJ+HfQNW-Cb>5vf| zdKkL*^sRY(x?nUQ}A_Jv6)Af@1H(vDB)1T#cQ0L zWjyLXC$>1Lf@q^+UjEhB9P0bZaH3=ife@X2;k!gc7T(FHcPddZ#$nF5L&GV)l&a}m85(=&BeFFuWR40q`&(?(g*O^G3g{H^OZ{X`;a?Cs41Y&jxQ^lfNZ zj`4f07Q(cbm+~VynV-nH1>yh zZJ{Nf;*OX3r^jKO*A=Mq@`QBo|x6%t;TC|( ze0wHKb|&8QaPv40g!6<{6}1vo!GDoa|I^05%d>w!_uu8)vo~i1McGz17lv>nmQDE~ z_;-2N$8btVUz@z_i4T6R-Ft?&{@>-_zlpoe|1J;z{rJDj$A3TGP}J(7=dI>ma`;=q z>-N{EiSu9nsnpqfhNS!?vMHL;Z|p}dxo526&Jz*+&KWjOeiGzehsU0raMAyoynDXF zF7`(?pGKu!`Q=c+r8RmR<+`|wsCmGIDdyTDdb+*CJ9CeKlAm1~>2-=jQwoo2=I!7R zKh-Yf^)&&#xUA~hoWiBOhZoJ7c|%BZ*NabGOy<&NnWmW+r93((D8HB7$|u3dC!*x* z0&=TUpM4JF`+rN$9+UmC`}!mvDG8EJ-i{WMe%z7$&VBgw^XM48_pv;3HyEH&8zQ9J zI!gp{0{k5?ty^9nA@%HdnCGyCOQ9cDe3>_aOS48j_+qt=OR~S$+^hZ0qmkqL#rvHj zdLNWNN$o6A#D>O(R80|08Td8#NxSHOO}<;M&|LemkxveyPnx=rGt&<*Ejzr3L(8no z2V~CSQ&wN!8#4?9bTVpV@D(AERqyIi9ovX@`g^{gsL7!{f&I35j^vZ}JH2}gB6+l8 zd>wc306tyr?={$Z2`WHkwW|r5h_>~d^jY$WsH9mEvs<3?zou8Bhri-4f;<`&DNvg9 zLr98wX}c5_^T@&~|KN)_F6HYB*USO(QEI)nrNL7~Q|-D*2X!GTYjtmoZYCOBa$NmD zB~gW;`Z%tHM|v>{4@+A))b^ue-#S$h-QV^0QSu8eZC8*@yD&~f_v-K77x{3h>tPFT zrB{3^J=NW$FrQ0hBc0~e?&47K<#KgfwSTit|)&9!Wi&o&;e5V70gt zYEJS3I{QUA{O(IGSq^J1S)<6K2k(SN+N1asVcu|Vk{Z!0*9P$qYXMnLF0h&PLO=^@ z)K>T?a7d8j9(o+(b6@3HnNj|HGHXpd<4eZ9Xp_|64$}MPFy_uIEx#{i%%AHasf+7UrWhMns3I<;dnB z(falU>s+=8XxQxbO6@@$x<4X0zxP-UU8`R)(L!ECb_;&&)-V;(n%M_=!&d`MUMx+U zds{%y2ae9jnoD$d|Esud!91$@eW}D*Q%FM!FPJB2bLr^$e!_z5MDE|-uQ>dZORrv^ zo1A))DDIu^qNF1n+CA;*RAGmZiXG-W)!izhN!hDctqJ7Oo`pR$a`zK0Idi%XK0i$w zn-Tg6^J0`xu8Zp!A&F!I1v768sq}22{m+A3*cbdmuRjZDW|zG5#!L~(^=`XxB9Bke z7qX_;eMe%e~D4dYEtvy^H2H0!nQR)DLQGUQ^qeoGk`2d(t%efaH~EO1e4~hZJ#zW@eG89{cn=@i zZJUVZj>_s^w?;@?)vJ@JgGbio!w#4mb7+@HzIre0kZ$YOYCLk{(vu%Ge$&c@w42}Y zcCHzR_8Rz~HQB(U_rcv)$ikj+5t}PotmMU?Dl};)~DzUi%4 zzno9I3us4PQ|iDmd`kbkeXQee4vjKb>b|8N-^WfTNpBCIn%nfEre5Wc)|Nq2qVPUy zhYhJ-pidON!TtPqELvV@a&`MPeLkheEZQ*Bg-7?44_qnYmDP6f?d8utp0N1MqeV8cQQc4+aG+MKkzgDAy72zvKCKecp0SdM!#CmY)LJ~5pu(qX zzOv=Qi5%*2{=<&LNE|6o2rri6K8E|f_NKw_d(<>`)@&4V>NB#3>YUqLnw~m+u?GCY z{x#bVm5$@k&ye#AAJuWFwL|W_cMj|o-)+ZNorGU#5Z`nPa^u78@ph@OKl+AhoU``e zQ~hu8#w#%b^1Q5bY{f+m4K50evYaY{Ulemydjpr|iDkB(AI%{SZ*kkD9enB#Ukd4> zD59QYVm5AihWGq_q0!1r9=TTN4!QnbK;M!#)N^0+sA=!Vq2?g*j2Wu%tb3G@ChiD} zP3{N(u4UToqp+8A51hO)_ZXl0%{XijHD5r|?lm$O;xV2E^-hiU6p(4Kq%a3|!s>9- zrFysvP3u{chYHr7fh@ycL1g%^ZsN8aK~*sEAJAei=T_OF&l^Xm2Pk#Q5&# zYbgW0HQMdr=<Hi>o(>R=qt|vqP3k{p#z&BH_p6zYShE6Z$z|ySq;zzIT6l z6G2)n{O|zf{nz`8Xmg(V(4T8XG{9NyyJVk$nl&GV?CwV7GoaqCP(wtEA3Z4?ZcjA% z{>1GA&3V-O`lns|77iJUwQZjhkK{Kdz7PHYKOwaL)KxbH)Ms6_rV;%1YyGd^xITkV zCIfUMJz-}}FE)stsKuwvLgNb?ZwTnFOPcBaLN2vf^uM;~44)>Q{aKm=yRg^b*&Y|~ z2uW^;C?pB~&#n27vKN1W|9Ho7EbpG!2$s;nkG%>$mvZ#@$_Pf@WS17Xe@wc-2 z;z!tB6%xPx&bv3?1+@2uK~DU00r{1d zM~*oNe@j>5`(c=X^u;sv+C~$_IvCwdM$s=lE47mox{4^_-iLdYv0N(nRrX~J-hbk^ z*B#ODt_@!+eIx_tEwbk)Fx|sC4wD~*qZr+tg>xC%JeuO9Ex0y>R zZz#kfgik&1&p*ER0NQgG#nh!ke)b4Y&W+dA^yOZH97~%yvpKduhjg<0Sq!|%q42s0aS-f->tpM*Re|SxSR@*7#EMHv z7DFe6mjWlyuRJ((1n`Blk^&{@-{@VH1DDteXvIOJ9VaZ|zpPw+WT*v)9^IQ#ON!9j z7XGSlctVP(s91A%7>^Du_^o^342QBqT)&U@7gEBn>y1P5pjXQSRxS{6C`WNs-6s_h zy|KNPy;zk;OH{^B9ytVZ@yj9e8RE~2LQvc|WT^J$3lJfA5RMB4=kXWv8bbKCun<>*8H=IAb1HHgS@vYT@C zTt3BU?9VZD=F%LOee>$k|8AMu6_b03Xnk$MtE=6C@60Iwstf-iN?zf>X}niw{de~( zVb?k&E}Jw0^6zMM@=u;GhisIF&M!2DUnP^s83j98cFVNu#mix*MI8V733i^5vA>7E zH=l~+OZIAFzSi6i3qFQ%UGFws+k8ETj^4SwY&h&CrCWhRx(*jno1Ff$ucvr4_l)A{ z>Dz^5Qol2JHRR~ckhx!m;eDPya4c#>kdPi94N9`+a%pl}(26TaIxbV{Tb2m$NktEA+VK+FKoj@o%M?H6>3(sH6I8VS$KF z=yMj8-sjQR?62kau=8_{9f^W@Ls5R~riPUXs3+|YxOI(3vZqg*?|3F8%W=9g!!j^# zDv$M790Gr*@mgQI=X|=7nSOTbH6h({dG$)VoJYE62F&ku5((RzMwPFG-M=~Ms^ESb zk5oo%Zl94Xgk86Jdgc#4=}p{vQ~`3NV_U$^zK&d4B1yLU7R;x`rY37*pkMM;LR{a} z2D0Ys1fJ-50nuaI}D4xqUs| zxKKdO4|c6`GlX3gF(%M_1&3b6TIRRyfPK0_`&tj+w~y_u6*~f9#~&?L;M$;{DDfF@ z!KE`lmmhj{4D!v?RI)EyL_^2FYkUm5HOnJSG+>s1qGk@6pr_5J+_s~`cMjr`{F%2h zDO2&nlcGoLh5cyZe)4F_N*>L3Dp~3PJT%JX;lUK(BcpzkHhsnT<3x>}=p&+%#<8_O zpAp?$b;=dBz^H`xWXcUq_&3RY*Bu1`HNif|xAr)Pt_;2LHrAL+x#2E5S10jk{I8PX zn(!a(qhfw-Pkc|vXI}KU$<%gggi5t{JgQx1U|h>y8Cn?`e9!;Wb*6)F2&h;rUfkJ)Ada! zH|u2ZX!A<%WkoW4n(uY`Yg-5O+3RHU9XGi2;q8OwVm#0HHjSAr19+rxH@r?0dO7)Q zkFtnm9D37dQFmcH!y&rFI6U8D#H9a z`}XyC;0aRi1HI1X@@e&C!_z0O@Tg$flbBvL(C2oNM=OVM=}XEI>D6WdjrLA2?)e(u zv)l9IJ@#-&Pi3y^!nquhiPKoTro?!Mq(xJOg}E|db~{caXX(lrhX>A1|sr&^ENQ`5cKH<-Lw~qd{TU^J^K3? z0j&fhPvpD`<Ut{yU7VB)| z(>$vw3#U7Zh;wa__Y%lgOUJKcrb3S@=#EXco5>?>zR9w_BjKOl&>p)-jZ3Xluf5iV z|GlxytD+b^i>MZtNFNoCdS>Z{*OyWKY*SHdNXY;?BT@Cu~tjga%h^)D6L8M z0?H6XIfnti^7g*1JQ;qpZ`rEbweX*PR1IZ9fAPujb+38f0y%WS=kXL1Wjt@C{ILiS z4rE1>_WAllo@&v`v7b?-qM)+S0C9_Mi2?WeEd}1Ga3^KRL-=(o)-^1EK3_IR=gx&& z_^!%cd!{yU$mxLQh+eQ?GUbz|J&z>#l^zj8j{@JHr5_QtkVA7^i*rh|8O z@<`R7V&{e*9ICDfoHjw0OHZ9!Z`eH&kfX!>dP98wD`96>zQ_Eqy)Y?B`?8SoLM{Xp z6%grtDeSp!uz(U|yrxf|$fKjba!Y@pIK_zyTa`;Q`Shxf`H1m{1oUzDjT~!?H`#GB zZ`s*!>9xz&wei1zBPl3mRXjyJWyPW;aVP|P(B{e}cSI0%v-e(pPzAX?O0YC0O-Qye z>2ihEJSs2Pa``dr#6i(Rr&Ux5DDAfa|03`o`YmeVWkK$YE>(2rVLmO~yYbsDKGiv2 ztU8A0t2`$cwxf>7H$Xb+0_^Cps5I>oTlg=tHdgnm7Sihp+P_yyIHa5%= zv_2R|=Lg-XZF)}hOm4xBE+~Ew*X>K{*0};wY|w6*;lrm*y;hw|h(R1gX^g9*nUH=I zb!2A4K2>%Jj$INeq}kh5dbd5qycATFS0nymsbP12Jmlxy(i@&i_t2h4>f!G>LMppj z>EVI-kayYbUBz4Y8J9SV8-NFxP{QWQB0fzS85Qv(MnrdZiVmjZyK1V6eLD0YH{EQV zy4Z1PY}dD47gqzXIpH*|!-Pkr=jPs>palOu`oVWg;N@MfOtBHezPg@gXZmHDfU3Q8 zzb}4;c-60SCqz!L|I7~e(=Y-asna%A=K)c;o$-s(@qFs<{%iLPB+6WN2v|0o&nL}I z)-5IX_!OWU9sdJ(UFE{W;o4t;vyDz|FB^^TG{4+?F#PTI2syWQ*vSvOZM;)ZFCv4` zts>J$7=O<%Y_z%t`M7^b(=x<4oHnJD{ftHYW_!(GyN6ur2)%Er=g6aVFCxpFp+CCZ zS#O_w3I22Q$AjNb3n|<9-IdF*qe@@4KZkPzQF%=Jov@IV+HC*b;du`UQ{HN8g$F(V0tgd;j)S z#r^oj-9~K~g1Ddg**QZNiD-_jFw#|*Xuj>%uR)OCGJ!=q!a0b)UDM8Aaa>4kJL9$& zW>~6rpN8UhweGhIAh{A4plb(bQ}#k>8bwjlwM~c{|f@g z{xsr}gSX~TS3@o>IJwZ?0rNJrputwbj!%ZCmj`UZxae`+e`X5iO>CS?jwkH>qj&B5 z*KFidwP<15YuMR`oL+W(D2BYPIlehG3h(pqDUU_Fxm2pSPxArf%Kk1VhR#L&)n{AP z^Y~x^Z9ALi{|fk-`<@>M!j^F8*gRgbFUDch%C*TeVP~DZ6*zA>;@dNP`;PdA`LNA; z!;j?w@Fxb<+XThKPTgFvzZ>k5jCUEkSEs_RE4zAjCSOE1j?e9X(-nTRc1+}oF z^T(QM{X%>*ZG)$I80P3}#=Jctpgqri3mWwVRJL{y-{lgQ^bYK+bOr8` zTPv|it%M8MZgM%tQ9xa57l$}QuWCQ^A9W;%PrI*96iK&3zE?%fu`S}z82yjO9ENk~ z0zuAcc6rvtz0nke{cUySEgpS8newgHFDH+M1x zZZ~;D;H1HbQ%;d7>@ysGkaW=5?3e0XD!KX0{_SblF~8b=xZVZsl`*zU-U}j$?xp2L zTs}=ct`YS$Uqm*AcW3uRJi}MVvbY-fuh!Y57v>5gQs2~YZQ}vpppz}0G|u8s#=a*p z`!z5x0`BlXuN2Z0-!1ClW{5A<`yX@L$DuQ4EFZlv6;Q|ZYk|vvCtqx@IG782ZLH0p z?2ZbI*JJ+l&!dyrzUvk&vsuj-7i7JSuDP>jByg1pKeJPnHai+@5|O z+cF$_@x+NaPEczRl`CqhpfBGT%pY(9ezxtvb1ps1__VX)u8Yu5NJTdlxQ6JTW!Q>! zkKsR_y|O*%KJXZ`na{g@mI`Qn_!PBb=*dZzy;jJF@Mzwa3)T$_I5e!Q*!D|f_SBJJE3AKS(uZmeHZg)!#+2Mb-7QXwh(By^wbB%q7e!jA-jm+{i) z`^~IY4vi4a`*D01?8%`DOFo4lZdd%n&NGoqZLc0Y2JA;Y&IE--G{P_UvmBo?72_h? z?7gWchc=;dx`7gpqPksJWg*8S-s|TIYDaiX;I?m1 z^z}G@gF{yPcdyojpICO)S8kp)hcsIY*H$m&(kUAQmsX6sF(#Au>o;?0+3O?aFMdL= z#-&GXpDLtZ=fCcHu$xESeG_k`+HuHt?!@=m9|d$xY1kgVDUTG>63Q)rOP=`PArQR7 zdmV6U;5e>;j(jegy5}p0o<*)#?23Np9!>LH3H&k4Um#Whf91vRj@!Swz|U%(P zpNuT4p5K7pJ80a$bv5+kj2;t1FM#(EaU&>8H&sY#&r0V6kA@x;3=2}keR+CUfB#73 zlYzD-f6yQSEesOLT3K=_pYjj`}Db*3xD;1+AlX3#ElfQn$%w* zUeowKBr7|UL&@{MS9L}FsYNEHBpUpX9La?`iv!>%BwmkBfL$DaO#ji=SOZj{a%hkmSx?VZ>-1tT|Zn;!gwjJlQHTCKQVUo6lKL= z4)xpiFw=WJ6?9;>H_*Tc~@<((-?2l!yN22 zA>TufJy{KV$$VF&R~qz!liBPp3&A_;r4rz691c7@Tla3sJ;dAG!+#HJCMw93{CYZJ}c`b?XK6%<}Sq)3C2S?l1Zr zJ6J?q+lP_}*!SfK66B z4}gQVb-QV>8vbj6le4Wi;>>a?YR*oU0-Et8^V{Qd0&3V5q+bnxCqltCI-p5Fu@~)b zS*;=(N%LZY;`y|aGxr+!GBYQLCH*~l^d+v=BXbmonl@YS zl!yHNw#xI9Y8m9juT0%Dt^!(iuDT%*fw?X1o)as%TynWQJcC;Y`8qHnZFK~XUeykr z6xADnGOgn}gD`((tp__U!1z4Z-PUdYYXQA^Tc>Y`=U5;3+u0qwsSc6T!oX@S-7$8F z`*M>@H|IUgxqgvPrWum78eixq4=t6gLfCmv=39-r0Q}(a6H>Zu}HbZ)o9kN^&?@3#EPgR6XsFKr4taSPvJn#zid4&ZaY1_d4a&Y{!h ztH*rV3jUeP0K+1T)9m;l)g9n7$vYh1I|24b()}RiQp{`9vW$Bt@P0=7-1Hf{1$evX z$(XFGB67Gg@QhZVfP7_ZyH+_MK4&R+QF0n~D!-fmlLwgJL*?57%0(1(C};S%Tp?|= z*>bi9c+3L-E;rrpi)h%G14TVF5kJ;DI?B%-cxS`7J)1spX}4Y1@TZj`NyXkRVV9#z|KB*V@MJ0|&aw2;Xg{r>FUEs$d z$BzSo$BzJiXyDdUQeD{jXJ6jl4;=9DAx}MX^vhyon7rX3=;c={Qf^Pf;u%46>( znQuLsux_DvSBFD@2xi#W{j{B0!D!?O5NE<(?FYx0&na-Pb z3+YOYzxDnZd>S(_dTIY1L|-E;{EoeVUsLgL!VvJ^Mql|9S@sNg+A?2B3F2E5EE-*% zvk?FFi#!~UcE)NRFqGBe(Blc>L0Z#^oczy(OY8ZRM$f}2n@4p&6f1|r?^tf&{CqIt zn<)ily?wOcw|uqq+Y0<*<2awi)4+e}{{F(ZF9H$8PtWLC3I55g;IDdP#C$q1wC@T{ z@D&sl+?y63g8x+z&@^O%fZlFc{$%SX5p`c}w0q@v#EUrkaeHt)(OdG_9`@Yr(`sjG zVK3cx7{JeiyslrukuKN`o}z#9wVMfC>g{9hXKRgkLv2(FANXpmV^+?%jY3*GW4-GQ zKLJG>ZN@k1)reGZTYF!M9=$J<`hmBkWr2Ph3ShC*F7J+Nn<{rDsB&7 zr3?LZxzCcBKVZi^$cd_w#u06`*`-j0@B4G>n9Y}9Pjz|u;9AUM*yZor_ato=QI8je z+1bE*Pnw_FwEZE6cFao-4Za9Hr)cSX&I91 zIM(cS0^|GVfyN|d_*=_+PZ$Wl^{BJh%dT8}E?VHa|y zU%k{0zrAHt>g5>VMmZPO?+O9m@O=Mii+z%W^euj(>38Vu7AvzMI|blR#AxYARs*-* z>397x^yAYlWe=TzgBZ^$EghaBpm_^RAJncD(V0A9vpf6?=QDk8+;9NC?Q(GIfDb&{ zU-MpL({bpTlWVaQ3F0yDxW6J0H}I?aay7*W_Q%0752G;8I>x<7{U!%Ix?M3oR}Ffi zcjJp);NN=Ai2C{lIH+^e*QcI{x2PAzWFb+O-p~H3$-y{&IAM@c-yV=NUZ)q#zAB`! zOfJWc2mO-jXQ_ucP~@GK(nG+dKOV9gq6Ix*n>=%&ZGeE(N(2**fhW*c_~^Csc@g~x zxb|if@JG`NYfBn^1i;_UzZ@*fBmKId!#v=iLwgx~*#*BjbkwMU>w!xi41Rj`=R6_3 zGb-u22L9iUdEEYX14QK3J0owHtdPd@wt3xx9TmJw?i;57alXabQ}r%E-%Pu4a6E7X zrz`OaI#uwW0xH774)N%hw@LK|E$~=Jme*?x6VkPS_LoMGo9nl3J8rNMahmg{C#tVN zFM6(4U7ZHILlAp+TNw0)gMV2t;3D4T)mqH6 z?3O-xn5bkes>NPLN8YEuVt6RPuaWuyyW&e$mfyI5<-Ayt((*5!7uO# z%(wO_o&=s`jb+J|kC!K(7aD&HgY)ND{Yex@EwLdoNhHFdXB=<&ghO8>xtHA3wRb5ptOG;-uW@ z4A{f+wrfv+0iQKPNnXE)kThevx*i7Z*}Ao=`UK&lP#4VJYYS=!_Te@Xy)L=E6Rg*5B3K+(kt1CYhY7 zcLQ%=$p^1BHfaCz-swq@2ThBXZaSKVI9XYS`)M-~>8W?fb^(rfSYgEI*LsMD1qF&4 z-vGZWPWo1_Dx|LqZZ6&AjX2zWqos}KAs;=Pe=2$a7jY^$G97l%jrdi)JUqaQ$nq?W zfWO;J$*!Ls;GaU$YU$tGsUPCiYx)!o{EBf(ug}!y0@st&IjB1DXkTv2NP{k168@s* zYV^-lW=mX@p@5$DczI&U0@%6s_vM0a12>-XJbx4X(V>BNYo1C3^!{5puS@{@C-v&V zaNtA_{bJLM`#^qw@I7@C~>1Sl`kGOBCvUo-U{GR$v_9poL z@~)T1mBIc~TXrSOZ99*~CFW+Fo&vlfz=|*Gg}A`>cK6-#T*{;Jc{zi5)c9oej3;PM z?|t`u_Tb(3G|#`~7Y6;ovq%cDLXp;%q!5+ieBxVe>}xO|a=E$u`~httwU!JxY+)y& zTbrg7?oJWXmmxY2_ree6syy299`UkWp)?1lgZ&!@+Y4{1sE#JnELiK#R28rT5@aDGN47dZi zG5yK2Ot;5EN?%v)>jnJm#4Eq+!zs^*ekYeuVkLbw`_le}$WW?*1-ONRdlJZFi?4Zgcj*+;z6_8|NM!!i|Q%wR(HT zrlh9u^JhCfns@dfN9*NNh;ReVvUyaStgG2G$PgCOrOrd)_dysS@0=oV)}eCf6Ey_pswTDSI^Xu=-w5$xN?E<(HE!?&L}6$cz?s@}bK zBJl7^#@oune_na+;~6=~>%%eWuZp2x4o<%uQ~N?hOCQ)dS?YuLXZgYM08d1(?tFJN z!aO;?KVkOaReTc89p5o#9r`(Gmh^rP#NUdJ1X)do{3{>wxeRh3&GyKhrA5GXyFU*Y zg>jQA(Fqt91|Ce#-3h}}U_VrfG!vnRK3WZIt-8*o`@-a2&tWGdYUbxmgZ@|QEhln~ z;*i7O7vbZcBA%09{Cn&gJ{>t48na&xyc6v$Eze+gDBV%>x!0FZmr@^gHDUgR`u?Sn z!|*=5qc?GY``v4wa&#K>W!>_KF`P6$+4t@-X9C94jdeF7bPW){$hbJh0`tZpcx!(0 zH=_P4w6)wT1+*ru)k9#yqtCkvO>?JlXrI=J!-^Q6x|Y&jO3=GkoYzmBFTUboT{skQ;F2hzp9{9)A?lD%FkS zKf-_UaDB66-ZK&HEcDl2cbiD=tE=|nTzsEOd7F03%VB1l4o})mv_T?05cM1A*&{w&NIeqL zE>?Voz0jp^g71Cgb)00X}kRj&xC4>=d!?iUl8B5-{Sl!X*r*IZIkoqDS~~yuDNz-5^%umd878eg8Y5q zmO4wwLDANGM;m&AN3_IC_!RMhCBZfUW^u@CYAWvZJi7nV8veQAhDFErJV3nqaw9#Nh!!k~ zSN}c&dPx1-H8bE#O>v)t8V>WRsq3O%0Y0!Vr6btx3%DX#EH4}+WFeNH#j$(0A+u7AXe3&00H#QALbc>r-^ zx7)Y8VJEnn36H8Fe)Lmqwu8xg;EQ{E{X9O8PghR`d_5b+oL!Q~m6}#`eK1g)j>~y;SDGs?0ySq?D1-N{q)gCqY1xBm-9o+;u zvZGkra0TLdI|4>eKaJ<9e|W^h%}+?%Cs&0xtwQ`|f99ytLOvOqJ-2Z|{*n9Pb%VwN z?+bYn>FN6&euKM=bJb47dCvvMP1w()mkz6D)~WMp_U@P4U&;&UdgaAgV}K7inb!CE z)dv0I+Fbsj1m9(V{*NdgkAl62J`C{(eqZ@!c_`v2ihY9za&H0eEY5Lnd?}>8^SZhZ z!1w;y(`nT7SHMqm(q-s_h$ic77~(OEOUYKPpFEEO?`gjOsr>_ZFGIh&olNA>Mz#4? zZLk}@T-bWf2J=I@@pHcc5qK{r5{3+hocpHRJ!bR=;ALZM{vY<m z=l=X(J+J;R_TJdm<+{%4IKIPiT%D_N9!`+-xVF=T)O&m+j}PM<*C?JCM!uP}R;#N) zh)NP)isvj#p_AO>Pwt%u-?H0ma?Nx2L1yPJRVzZDvD~d9mdVaagy;S$Qf+9&{QZfm z{qSo|_^Fg16oAic!f~^07~)%+Z~YTl7V>H7?2Wh1gp_y>9t;9Lc>b$@=}(;J=KAbj zRfxZQVJa+t_riC*u#W2;{2IK^_E*HQAzw;fN7=9pI8uH6L!NKQTYBF6$$Np9>1kZz zvIzBqa-XlLLl4kdzE#={y!$6vwzW-GEF?31U2{nQeAvnsOUlDgZ$+&t3rJ^>IU7ff zn~CrVhHW#r(+WH#FUK^1FJAw0@uFem8)Z6T)rX+h-}HFay`cwwMvqvYSHQQN9E~Mg zuCb77-JybRj$)-h?Dl?!uoCE$>&zvlBQ$wq(KfTgW??h;U3o z#~r)6Q%OSezF*Iy<`h^WcYReNd3w|?uHGET6PXy>`(;cn19es_#Y1rzwErfKGg zSI1LZD@Tn{7r3SKf;ITOZwED-R+)px6IZb~yoHdBKMw@uNCD4vJzH;t@jMv3KQ9sI z{M>@3@QFFhW7RLctS;cx`;XoURH05IC#$UJ1>%HNmRVREja*qk+j|M|K04HXGBcY- zHYu*T6Ac`eXgsH&%#Hlzm__4hITm7c*RXm_m_fMpWcUx>g8s9=a6gL>bdWjMpyL;j zhjslhGX{SiVCXY<1aW=!yJxkQqR_AZX0jQ}6Y@^2JO3PfJ~o;yPoG1_l-QejrA&cN z$_L-}mjid6TyU+{*&aO2;DKP9S@4;=qp#{g&z;?p>X~^JdEMe2V=J((f|tsE+|$A! zeeG6-wr#-Yx30EM-K3IBpJ`l<(5EV0H@$d)$+mXUe8@D;^;>soccD-Jves?^=7(cYN2Nyj$2~_yz2b^^~4Q29XhgoZRG@w zbPoJ_TL_#bzvwhaeJ<|bI+`sBxKemy8Gm~>=CONX0~_$!*Ty56b<3y(F95Wb1;25X zGA?EHoe=jQZ8aW}^LT{qVhM1QUKaGW$*QmA1 z$DV+PyZTqh(Y%pL{#@AEz5?gIa?ShG<&E&gwfU@z^kERbnS1OCajYb{dd6ENft4Jc ztJ9w4CFE}I;lK@J46=$NnN1dYiaTwnVLte zFS-x@u~SOX+zX?yPV#dPO*c`-p=#ez`Qe;NuWh zUR4U;%gjF0@IdfQCG3C2qYSC!Sx~*rZb|I(SNlD7o`SzfE@xrccI;30h&@lh|J$h< zcK8-UZ`Ch;@Ed-|Yx^Gut$9KximaFJT-pkqvny{Kds^#dpTMQec*qWP`pOvJTw_jL}f$94MS+BrBs;v6U}bJfK9C^%x- zU}=MSlGL#B5P%MLFFY{gH~~+4`|9K!=-L-sSVkhj8(VyFO|XJq(3ls#x)gO|0zG$x zf!~%~v@1M4Mk9`gc9w)94{05F@8I9(yl{eepOL{``j07>))C*<#*a(Iq!tnEY$7^KLvP)K(GKK+eS)^5;q>uS?FUL)V(vH7l8{RH)cyJVS3@Yg#vTq{+% z#!7N;$=EV->BLo)Pby{sl{m+1-stiNKUre2Q=^JOu3Dy(_DnhvOW48dYXIGe;e4TE zJM^P1gHy|uq0js63+v3I5>sWZ-R+532T{6BbGXi{8QqbRF6b?bx5jfvQOPlVkwt01 zL6dLQi(Ph7i0kDaLC;d)$MjzyX4(y3i(23S^_gPC7!gyk5%D zNy{#clflqMjb5p3Fp32ZzHMuq-VVO$;V??Vrc!1s1f*?uBf`*0WL_tl$Tq9bC40vdnOusEzi3fCj^a9 zS1G0pfa)#o9H!E4DJ?{0fq z2wu17Z~ag+oixhiz7MH~kAnKQ#`6cAlnM9i*&$yu6|3K24E=i2cP?jHBrEy;jN7&1 z5c~z9^5^T=5N}lL21kGwk1ZdT7S#l9Ja6C@i~Z!FH*_)QIh{y9YHt|_Z~mCek{w}} zd^n#c>m!PI;J-2XfH(NMoAvA_EQA;zSygzyZ1PWUCM1PVbfW4B@PA{$-bo7l z8&!|}x^Vtx#QOb8XhGiq1-?B&@C)yVesd~HfkC#jvzBKe?v9?Y@1H3^eNG9_{o0q% zVJUCjK@NcN^3Ak#+4jdNfzuoK$;>_AK(Jf){i_R_xQ}ZHZ z+_$$AvZ>SCK!g{;}S?7x^r={Ce9A)Ej>Av6eXro&I^WLHiLZ$&=doD-t@j z_lGoTf8@6&^oM`Bw}W@Rm8gFVJpG!fd*-~rtNan=lSc4`JaK2{6@cfw>QJ_C>^k~h zFa`G=0dE*vcijAx0F8`Aw#*#Hy4{&rC&G)o@%QztGVLzZ^R8Qy;B%TnMjvplQAHj_ zapA7tsr2jPfk&94G4j75Wg@*OEE!0#Kf zY4XUhz-QfK_|OaEGx*_S{YgR8X>xmS2>l2?`!s(@3hrNd{GhXhEtQ=7o1Mf9JvvIx zVju&4gsb++ds|N+4-kkdutr>x_kX~GvHpoGb7hq zf3pz9wv^)w<5|dERz-?y8jUR3zU4_wH+UjLyT;H3sEhq-vga{yYNwwm^=djKgOTrx)5lwY7y#Eww`&PfctwD#oYHk5qb9Kz1Ahr>pslIhaYM~ z{45a93-P6q*QW+Ef>h8Sp_KFS6LIjp?7T-#6e6C~H%VaA1l)c9Bk$Ss(9PZWZwm}-quzT{-pfP6 zsAIk7C53Q6Rvv@yuyq5Hd!4WZummi^^b@4;XDT)u{P z4-g#_u>;Kusl<=*W-!+T`{7ga`0{8%yvmK#&O+B|vdt= z^!tz)O!_@dC9*4jer6y(r?&6AZ~Op08tI*Pt(KzxW#KjRNX&270ba$skE!s5oYSUf zgSSbjvdPH8Ii;IL=WKw_t*NkD1^D-JV8^KynRxyb-?K*=z&~3yc-XEYBh$1S?R;({z>o` zcW<2LQwgRMo&4pTf(EE}P^t(mfL~Q>MD5RB=&0XpV>U-qS%{8#&tLxy(An>N@!KIw zAw}-B92asZ(!Ua@%L656;`A` z|4BINeH%P;;W%?g#|r4Y_DZ&q#_$#0^l{ORs85~jgle)~kakvD}L zdOEu!I)X-8lO!(6k3$!FlznM{lMt?eW&C*Q3yE+3Z1ivp{NT)Gt9QZR6Wi29R6kG% z_m7Q#z9647a!3&803T+td(F!$-pB*(BCXd8K!2R@+1}z0om7#ZQ-&S$r_R4*7I}H$ zk;F`8W#mV43qCD3h7NcpuJh$-22qgOUbX!f>Q!cUhzo;{*vh^*^cpYL>-v=|A1#G1 zNqZ=u(vOuiNxFIRVn3-&WV_vmAKoEqWv(jDIaQZTQkpdQ~@?p8bS{UR&-+FV8C0p31`Qo#?me~sm7?uBm3H!imx`Pt0E zZ{Zz}sHB8;@AZS{sH+_hO{j*y$Ff|yZ$z68J|s`SW-0u*%lp%Mk@vk+t8Hp8gx|~a zYRL)kPdm7y_Fhz_5-Sm_Gb*T~xGvgZzwa)Ect+imG2Mjwzs}LT7(Dcc;^b03;5y!n! zR?*?l*pb3>e=~4;4CPSui`C#;{7+odtt6z1_sHUB81G{N*JSf=P{|&@s9Wce-{0B% zMS2a+hxD}$nJrtn%bUdu31aad1VQG#LH~3{+^~QYz=|m!TuCnwa^wWc) z3zm(6r&}A~df*|Q+~xc+Zsm*kUdNp;10R*F{Hj~J$RmUv$#6Cr0v~tKg2Rv>sH-{# z-A8`2rQ}0}7vh0M>W=4^8}PX;9UHc)!*71L{m}vFY2R#r6utr9l2!Vc^VLV-#W@?n zYI#;7`7LsJ81nPG2S5-)_Y3&o^HQN1_&Oqf+5mnBE~oC}jtm<4^;_w#Ya7nt)&8sZ zZ$VvLW7kpZ0sQ}O7gis}hMibB_$37Srt5}a4JYK8*Unnkmgmz5Z?Uy|%0=MJDyIdW z@NYcLrAUMvppYzz_>>d!Bk`oS*B-e;Po+4?WBU_ZmP^r{$nQRXOvxVG3m@?o_TXht zQJ;}I8VIRX4|ye{7ebM*b>2+7F@^YZQsCrPoOdD(JDt8AM4h{)siq8k zpOzeVCL~qSpTKz=mClBG>Hu9EE$|h;-#^xsDn;L?j2(j!@RzL+DnFvO4*C2*+j|}^ z_-ogfI7lQwAD{9~XkLLj!R_brX`hg9#7>#!e}PY2Og-4ro<{DeE}RtELLm#1?}ZA# zM_uK~lW!g6z=y4ixT^-=)RjsWL+M-4BT`HAD}@P(d41WjG97&s#C8@o0XN?b_^HA8 zOD9?TLfcXiS1KsYDaDrvxj3~lx&eG7_hfar{|I=!JB@OrZn+L(q4!;={KZttXw#Eq#Q|PXTTdzeI!N*V~bjA^U zLS}kdR0I4NjfSkTJ@C_=UoiD&dm8jlX8S;WJ%#LfyJ=DHCg^=9Ra|!K!#^SG9u~6! zx=9uN&o}66e~ctp3UlZrmGAY>aupV`#-FBBl?A>nRYAubdB!S{v4hzvSkJbP{%!)# z7_K3W#3J|Z>PQOd+Zic&xDR^Dt^KS!cCe7K^PCq|k;guA7r7!0 zUdv@yq`{yzbeojiOI5)0)fca%^lWA&J_W08wkrc~RV1A-!FtW(;$18i3Z8cEvVJe{ z_aXLEuP*1|9BCqF^|}dJYBt-e48Dk6|M;=XFKDFa{>;ib@X>?Oe3^alNqAExtg_)3 zIe3u$quy`ej-yVc8aN*dcQKBA;YGg=X_gO6@Hiq8F;(U`Pxt#ipEzI-ebRQW@trJq z78TQ;4k7r-4P&Ch5!a7azQ4cFiAvH-WVMr)LZ4h9IDH@a&}W<8_mwzjOgyFz5279= zK%TG8=mpMolf}N#*#BD$4H%KvsnAn)-gCAEFX+*2dlh)^+{5!eTgTz2RNAZjtAbA6 zEqr}?NY#gvO7se^Kb&{b8BXo zB>sSplKIWyt0d~8o{0)`RHFVnMJo9u*4^XV&HE*Muudyi)2?o$li@}8GqiBNAK?}K zwj=@dq+PV<(}v)Aucq!{NB!RxAKf)Qz!AdB&g@Nl1)e0!)G}KH{pVg*OL#`pNv-tJ z98K`oLA|-H*{-NhH13t!rcNV)S_+C9y@XiDt9SZ=Pl)0wJoW4ocrHP&=U40D=Xl6$ zxV@4=?B3YqPCp}ijFP(Z)VkC=3>`oZ% zJBaxWf6;z(`V#i9qDuCyZ>U2y?#lSwP9Xztrxx>ok6h}b!R;afzqM{oj7$vT?=ZJR zDdwTB-av_yppS*C`-kh&gbbZo=C{l-3@9# zs(`~BE*$DU4IkvCNZJ|Tg5#NwPrOFrF0<4}LJ+u2((jF&6Z}l2Nl!$@kxx5py>21} zzt2nEO2?9u(2=`1zns_(U*XmV)TGbImztvAy?}1AKCCEUC;VaF+Z@)Z=0i7UFIG(u zhHiFP4sVkJ-!Tz8qraX`g1`S_%Y<&u^`k^n0{NtDgW!I3;H|xZYF5MWEkyRWz01LQ zFkmA2ctiqu_cOJXdWZ*ece>6t^Pr#O$xj6lvNZD1Z7ZMHYV<*HtPpF5{%dK$`P$z$9~x8~PIvXJ)fwu(?^ z_`P$RuU*4TeDva`KSG&I@7(V zbMEsGd$$GaN4VagxrK#9Z^=Dy7{1=FN7=bqj@?^RSApLY z>Ufd&8u3A5$;Tx#sO$Q8#@6}OR`4S;E>~&@E6Lb*BXI9k=mkEJZ>4h4_lENAR_J9G zvhnz_Hr`Ge*?l*js|RszigowXPd{j6?#ecGU7UkjV|&h=xk@Ep)RdC8#?Xn+bJ-30 z{dBUCf8&=`aq#;n2ktE2#2}l$1eU3U|XHKAHm1W_QJO+_dDuU*I$r! zMw~9*d$HP220mS{Zxx>|!M_?RDSJ19g}5Enk+6n8A)UjOks*ydG05YI9{jaUKReu5 zf6z(bUm5c$Tlhry_$}h**IUbtxH81GgpJhewl>gr%Fidz<={uOIRC_aJu7K6%V5a> zU&NjH#OpV3#45ABR}`-x?@}a;C#W+r5NwS*7|Tio$3+w}f5Fenan~^l`h|D*llu{< ztKhwb2)`dew{cp6*t66w7kNUb=TvZk#RX-fbm({>KHDI{V#v)ut0ee z@~@*GU;Qn``pI6)TMa&+HDwo7&KLUY?wG`GGZw1{P9$_8Vo9y(@DJA5fc-zd^M(DO9 zY?+V2dk8p%#&!e$R%Y3@B>?Z`?y}=OeUX(ojxA`Ld4~Qpl*11;bD&?WpP#CV1L~A+ zT&w!>0KDZ-zwE7ubN9I#U8bRPb|tboFDM4DIr#S-%?5pWD(ve=ktcCE?sL>x16=Z) zYg+^SL#1&Zo9+MyFO^BZv=REXk)Yk{Jxjm?c!n~#n&9u_w9;E0gZ_+Jve9M0Zxeib z4!2rT3H<}-@|GdgW4UbV`Y;DxuEHc?ohI^ynp*jM@Mi1Q9W%(>!yqmBn)XY9*D}sW z)UG`QTvnnkAHl@@bWSf(M;>`?EPRxP|C;{l%<4g2z}4hpW{&aMdDyAY44<2dSNFDu z&cD`1e*YHKr)}BF6<7{FHFc4jd)_tlLEwEk@ZN+$K6d-tW)Bo=p({x}pwoXt?|YN1p8i#cm1KW8*+1|T^)#2Bch9^)UzosFz16YkgCiJq zBm?^T*~ZKjOiuJWNFi|n6X;*LdSekEfzFc6am*1uqDI5KogB!6p8lafNP@rRS%q^u z+alS+hu2rH;63=-jbA3MewCXOk1%9eHk2LOX%Ug$f?&mVKtqt&Bx$c%PvO|4Io>=+i zH&o)~zW49e3F!7wP5ab=0|g}d>*_bqNx<#Fv7>b8oxRJ2u7Th7bv(PH3%aV)(j-Hk z6R7Ko){8QV1Ml)~wtgexwpGl>g&W}Gv1xPAJ5&T+vKom@WO|1=2g+#b6e1F*;9~v4mv|*L6gLL z?1$))LbLeY@Ryv9JZ}u#R=H={MqTj#?YZ0bWdk4ca>)c3V;@^BoL#)W0D0-d!P?C-%W>1zQ8YN`oxNR7xLY8M`>v|pI>S$5>^Aw z)xR($`6`)0ZiyDv*4x29p^?q`13oti%87}aLKIR;O=s)`kNVwT?)&>IG@|3p7I@wn z=W^4#x<;&@>FXS=e2@WHZJy2jc?SM@^t)Bq5eC_@lz-Jj_=VWntAbfWs6Gz&k9q1vVLVpCe zV;%#&R(KB}u7~Q!3juFl@pvDsI7%T^2Q6NYLa*25T)v^+3phHqLjU(wLKdh>P7H^z z66fkIj?Tan5eiZF6~R9=y->+#UyJ&=qCF)N!|1n^ualXJJj>(Yw%4pm;8*hMk5nMP zEj``Yf4YqjwIZ7(@+W}DSKi=uUWNMJVdvJ(N0FzH^ria{*UyHm@cq;Qzest`7B|Ev z!sg)P2mJkRQ0?7^JE&XBR}Z%aU#8agDs2;mP!Y&qySb-#Y+SE8;c=x~r^+87H7 zW}cBxKMy}i$<3yWt*qoi=f~xS#pt6I8gJ06OefoKWizzF*LL$28L83WqYrIYJ+~iy z6{hddA|F9dKA7}}F$$ z>~~_($$d%`vibd*^zJ$6W;qot<-X`|;kaepE!3$;3hla=3}1O*V9&QsEA;tU)m^4~ z9{3?{VSEBV{N@(~G@RiZmb~_ITaFL<754oYs{sy`Ba+oG|IYU<;g~!<1izD8@b3yC z@DLgIw)%oE-Th))%*#xiyI;uez9{&2y%Q>yGQhK?stfFcFMVM;UnbLuLV{S$J3fLZ z_t?Mg-fQR;6=y@%y~la`K+FD->^Pm=$nw4)1wYB+19ZbZXTj@gBpQdOQAp%TiTB&E ze?NDw>RFC+Lvz1C0~7i1s~^LndFH@T)2l76d7>|f@AQViHK?DkSl*|79e!H1#dGI& zVO^ipiCc#Kv3Rewn+y1nx}n!C$7R6tg^q4sg#3QLev8ozaO0~WUr!tGH_w{Y48O^+ zkfQD|-Hkrz2fsXG?6EU+t^<*K=R)YDQf2){vsd6%R$A3>EM*X$^VUpJ@P!Tb{2#h- z4!EieG2`9wdm@|-*P791y!`_I(IEIU0&PY1pG1Gg53}E1cEES?+97hm8}tG6+@Z-Y z1-@Qf_x^sw8NZm&RT;i^2PNy}4gwB@F)T)Js(v@HmeOy#fwD zWg&lgl?MZ}(6>rsm^p+0mKxnieF@#SEtd08rx+nCcwRRa0Pj6E4!pJH0+oo_tju4d zM46VEd>2gaq>LzPneBEL?{ADP6mCKJePoo1c8EhJTpNL0C~3 z=iV^IrN9;W;r>BWWe!2iV@jr}h(79BYwfqc<3QiVl=q`WIq=m9i(Id`fb++9#`Yo` z_`9Ota`XK$Yx*|yK0J@Uk)JXtugcNCklUB~YXp5n@;!NM1AqfKF6?ebTpwRh@L&LW zk!R$%XM7iYa@L#G`Zl8P6U}T*6?Dr=6+=&hRvKYAUQjNQM*fxjOaBt|t`(`C^|?3) z#*DJcN<-0C)=FX3?i?yv+xaZ#+!pAVeQs5ko*+M%eIUJUC3K5ZKi0~%<2?!ap)&8* zv5+sNXMY^RI$EKx8Po>6A)}?4wafy#S8S_L@-iCP5M~f$5RHACFa1PF5%sMJ=N@h? zgr4_g)BADg7~fvsUHTUIV@#CohK4(ycYqnP8vH@;UXcw>*TDllesXvT@LzzPfBSI?KIB&^{;#^xSKz_E?NSTS2U6PAgz+2u=GgM9ZK=p_2HrLM z976rsJ5kmxz+L92YiWG`$m>_|ZLeE|es~XNsavfWgiSh0d{iHO>Z`R?WtI|hD0Mo~ zs1M^Syh)E8=h8xI!`ZVCl!GIGJn|esf8fyt!l#gj_-33K&6`1-e$=AZB?JH3_a2k4 zvV^2Pms2ao{_o^@DY>?kLJnj&Sm_V2lBBy2{^%|QzpJxt2M$iMe@xnU8}#9`fqG59 zfj4w7esOyrz#wk&(`0G{KC;c~AzMx0M`_aC*!ULu#pjAv{+H;7wEX3<-{3*ZhmzP# z&a;qxRjHpM`{1it^RdTN3hzz0$+1Js4fPYkM=KOQBR{#kbzB5`+2{L@4k%4RKUCgU z;*fy%Vf^{k5T}Z|zl#-=wxcw1Yv|ODN7JZ-dmtFwum`$G=pQL<6q*P)s<2HG_&755 z?nwsEm1i;Tkpy0*VjI7GJNWQ%_7U0_d>{OY$Tu~?pY!lrt&te|TY9AY{O$xEddKtr z%gM+S+3U3rJw{#QaF=2gbl&}(T8+E1SxMYmd-3pSLXux_%2~cdKcb>F<~hhaU-MhL zk4VBNdeEOmGaGuItZ5goJmR?rxqW933lYs2QIKqdpM5_WarL5*2YQ=i^WmFm?)|${ zX(RL}cQ$wBa`c%>rcCbyUnrX;xr)skzMF;WHzFK?Yr1r8m0W;l>RdJ^iGlCc^-UPRCw4u`{@|-x8@Q~4gIGy^a_w6q z=uOK@rs=t+=sV?}(n;V`T^QyjCZSFxeM+&8*B2oEybx<$SA@Kp+e>ekA@Hw&%FZfX zoR6-r|Cj-fQ+pSM?Vo{u`1jRaDb&3h*Cm*4vH_1V^W$%?DEi6#*y+#<9Nh73pBg`W zxJvg~T`%4MUo3Gxr3rbUrAwTCq-*WIyHaCp`i~2knqQZIOI?2Rzzn zVe@lYQ#z?Cb_>XXZC)DX2 zSs1#@4(}lu@T%9jgno0kE_eCj`@3wu(taD!hy3s$)$1+v0oes(VB zU&lAwpqt$CzP-F@74lkz;yW7f;ppFulhU~Zzm~fHvh%?6eXjy`tZYUfvK@?$Md06b zmoK*8<_o`<&d-P4&;>d|me#G#1737EWUzKW#w9)}`a1H4H>*`dG;scwP|Qj2Haf8r z|D$q7n6ov?~6QY?Q*CH!Ua^63~~Pd(#bc2jipKbCUq2VW?}Igy1Ir4y;3 zi}(D;@ZOm^+m>16Wqa@0e?0HXN^ZGuTU&pml9@iLe&BuRK9w6+J7AtK9Wyp)f}Y^2 z_*c$R0e+`@@gG;?Ac!?>*qIRwU84M{DqWmTKDhs$DOW(Bw99|#?~AA;i|?U)CI@^P zPH!q!Cg9cev@+jzdI^Cj|uLYGg|c+RS((QU@?!^Cnd+3ksaDwz@fUTg($!5)wH$xId! zmfmi74Y=aj9+#j>;ClT8&$@H+@bg7=C8(}rC5yKVKhe5HB|TbaWop4MPR3@Xb*a!v zb};8C-yfUZhhPiztG;4E_A#i6!YkKN5tcR=l(5Uf#(CQ z*Lys-fZzJ|bDtb>C2w}FB2_-&kzH$EJydW86OMzDG~xfA^oR|q{^_zeCfucRuxgqw7^ zHQ)WI#Y&{!OGL5(=deUh$>#2dZzm_ge&1{G^-7u5o1h<=1Qzi=dxCwfZZ`5j6LrPT zH+lJVkzbhZFLpMd6RDQ{OKyna{4Ki@_PYl26kS^H0sd#^rc+DNV*M*py1lCvp> zSYIm^&2gncADKNaVY&zX304(MkAeStE)a3Z0(^_g)`yBC{@_dX>&2a8C?vH-a3ste z`Fi=f8KWnJY`3ncr8dFmaW?u^co^!s>^mvqKjGtw`|yH*KNXdKM3H`oe!;b+A)z~w zmt3C?t-yXy{dDO?%R0- zp^_IJWcvhveQFn@2=UC(BBoLH5-ZtpXsFB-as5yU<$>HZ1%AA==mvEzDI z`SRcWY;dBJ3u{sh&fxq#`}1Dmapdt7v1o(M;3a1t1)EH>;QdFJ>Ls`809UGyu3dq8 zc+r=x+wMRgxEdSdKU;mmHiq<{y66orDjy z{=Goct8BbiW@4oL6BT|->yWrl;D^rTCBM1f3|{OLZ~gJz;0v#Jb8+5e5c|#h^ty0v zO!f`6+4(Vui>B9BUOJ83Zu`GSnZfAWxrOL4IKNQS~Tzg3!KAy$|3& z-01WD4c7|jC_eR)BhcfcC*Iv>*G9kJ3Dez6;D54vtW=gQnZ3%wIaImi(~-C! z_;P;NE8h`Aeq)_0lr#$;#h8732JWNpnZAT7c*h&U?`s!7L!Y$kLdhQ$(eI|m!^<$6 zN~%20S}5@&?yZej9gF7~l31QA3jDTCGbVi_c#`K7F3F}!_+&c1rI<4Do|N@#LNr}b zFC4XYK=B*;0$;j3$B(#isVTO?b`E^=P*d0&)M=!h{gobsIwa%ghCVKFgxI**&APt> ze#kLV_^=Yb4lk8I7SeQLx=lpr;sQdXKKpjuaDZRN5gRB-xkIU&Oz*_ z+v4d)A^GshEM5>T4d2jNgBzDcRG`CU-=sz9QHVcNTlgu#`@p=p!bGut(=XlgkMTua zR8P0B7Z={!a4}Th4!m1;i&BsY0*AXZr~fl`^o#2o{_qRyZSMfxR#*u-&8EQNHChaE zar*Q!0aq%KN}zM4?13(5oGtPLd2dEeSkqU;H(T*g^RVamJI7lE&ziB4_`@ryicG`} zv)D=n=;hV=Eq9Nf1`j44I{D)UbZ;I$2J;Va)XG}|%#*15Q1%qP{S3O5-2GjT;rH5h zZs65bxee2(OA{6kOGfgZFt%%o~ zw~tmppFC(dezdq7{m9Oqms<^gw0^92cyBUrFNKPQ|%>0)2b zPFWs@UZPZ7P_+-bev@zFT?Ocux_cJ3MFJO<9P`+8(GNasbNlGV6NFhBZ&acNC=*w->zEy6DH3`IDj3{SuKizYTrgH+o$g#<6y|wEHLGry1wm z@@>c$Z|xZmVjl%xc%SLDq>Yeotg4C?n(#*-?v%B`xin`dowo_`SnlFrm!bcPSY;<4ak z_$xLk%|ygN2jn}+VYhu1{P~~9lg}b*DOz!7i z0X{l1%5aH>j`=R#>Yaip{DdRS{lllJ#K87uTOaV^jT29QG9QD#VVjfEXvO^$1n2Dg z1$=(~oVVWAd0k}bYR#QAqATNkKLhdIBKYK*htQ3z2a3|4!B3(;!;`Vx5YKOP`pD2$ z>Z^Gst(Sn!L#Y^{9h5_U7ZltT>96Kp&XC5&l#ddAxH5b-qud-}v`ZKJZTCBdfMfdFWHorNAG}f3N14vk*beMenCQ=|ueA8||*|@V&KHWaUnw9wzc;?>qTo>+BGPeqjPG zAFk+Pe^d@g*Vy7c7y8p{`qskFy>eaPB?4aw=Orb1ee{8`9r)x_iSx|S>90QW!JqzX z*h56Y2W@__?*QudUkI*RdPe}d*vp}rc<>P)YxOc-okE|^mwa#Q1kopDN#b_?G`vso zW13|P@K1O3T$<){#EE@Bxenu8T^u)YQvg0DpM^swpK_s2Rc|m@em~-tUHZ#L@H}~C z??Qjwq?0vgyE@b(Fz+kIJv5xb=e)DZU2lZ`k9=99>lb5QzCAs+mpyy{`oK_33%?g5OBGBI;ub z6ql78VIj%;j-+Y;C;9P84GSVJH)gD`352gJ?F#?r3HacI`z*iOL6_nacan>EF?g%c-8gI-~(L5_eOzle=*|G*6^D~d~zK8opIjn+{T@h!w>yE+<(XXd#29m z7%HAFLLORsYTz~aT4vG4<8-9&*>zgA(ltAQ&O$IH;zWKhY zvyJC13pw$7qt(JKYxx4UCb^=UTf|l%oqF@>pZr9 z*sczJ^s)xVEtcZF5ZQKh9}yoW9Pjmt*1!*I*fbjpzH+6Id-v=N-bd8?a76ts`lxJQ z#;kx&(J_?3`vv=WEG&*~%LUY1e!pn6rVTjJMbhp(e$VRl;KOno=vZ=Ue8u>?VF6C* zuYs2*ALmuy!}YiMe@XF!j_Fj~`?(an7IQNCnKAs5K~(nxv6FajTC&Mj-#-j8v|;7e z&6eO->$J~~GI2aV*+40T&g@n@T`lH)@S_$KOX7+Xi*c5H*2=Pl95 zPwgT$-EuX8A4^KC&~!2CmF}smtT}D@Iw9gtFzxiuEO7*K@+Y( z{M$T=Qh9j zdZ6BM@2e8vK_B)9Klp}u-?XARv4Ka;{|l1KhBS8ftS(_^1b%Oa~-?)d$el?eT}s$-VP5U z@16=%vq%6gOr9`z8^rr^7L|`@1<;73Op9UvX6P{jOS1z);omw^!ZqWDK7HHXNU9<( zHbi^1uZDlrRq6m`!4Uesq|MwvID!7h?ILP-j^RB|%AM-*i5Q0_;+1|1{;8S8m7@|g zvhn=5{Ke<+p~jl->I3he&3K3Q`{L%onw9YL@vLo6wFMvhqxtojMS;*ak{&#q*V~TW2sM^gM1Q>Hs>w>< z;kVhZ{VEiCVf?x;zO&%9Z4JhD6%8^OICI?A)+UE1)G z1jr4&>^uv7QSo~BnpE_kZYvbFMjZRA8z)mtLth&akMCDdH~LFu@}n>d^2gcin0)XB zjfGSE8b9GnJ@>fu(HwM8{+P>VL*Pl}&uNZW;e8nm&t?76SP92;zEC=Ni8#t>J=#v_ zQ=i7SivsWc@<^>e4IJCNy-%!v1obXI*1b@#qvP;z_-O{;-ZAyzdJpg->D>&vPaYw~ zdc|kg!vB3C;&yId4DhphnBFHf_-dZA{NW9U9xYLlTMc~ctKE_q0iRZ`<(4@?_;9kN zC%nEvk67;ZyI>Z&LW2U=)wq+;AIAl42C-if<7X6ZmZ6U0J56G~-;YV!q(KAne^s6scWor;0>gK|VE^V4*B@e#; zpmpp^`Cih4!O zwCz0Dr(w}6B;qr0&aYcCWsJCbsFEe+dOh}ygWSNtG1S9`zkE{#p2Xl$*GLO^iPW;e znI3H#(KfgL{UMT0dbIcEh=0O)s3iTgy%70E;kuUN(D!+(Ur%vA#ru4jfvMl(QLnC5 z9Weu)p?l_pa&i-VaF%gZEDr@Y>!+{MfQ|dr%K}(u>u7XLfx?zk{+f z*UNx=9(gG4X@s7usyDjo9s|CUVV#075A+@2ElJ`+y+p((+4Mue{rojIIy=CF7@bf%lXzE#p2pNh9x{EHsgELw%&@EyJ)f)c*+{FY16^G2pUV z=2kI-3_j>v=V}F?*>V3r>Iv|-h52Tozthi}{Jo8Rd2zR8 z#>r(Y#DXdCOBZ|z#W`5_lMVJEhv^6BN$jVp{c%<7=)dthtv(05Z7}_Alz$Cy_t^Hv z=HrOV%fl5J%Ygs4j2hnt&!sM>T0@OT|4`qJceI_rvnMz@-;e^Yd*sfV`S*K@t~$LT z^*iFpodk}PLAXD!$KTfjPb3~Xo5Fw|p;j^}8tVn#wo-5bvLAw>BhBDf=ih^DXjJ)L z9Y0{;X9qZyW#i*-Wc_&Uf97S8#V@b%57QP4wg%t`Ceo;55*>t>gGCw$2bviEVFWIT zHfW%2p!2F|#ZZDdm$I@6OVGj(1c;fi7{)9x?B`YC*JKmg#G&FAV&+mSy~KDSGlJJ3 zhUHKLTOq%ck!gt3Q;LdPu#lpHV$^ECf_>3aPa1IDP$|@$;=d{~4eU~f&eLL-WCr73 zeZgr_{0lcYo}AiswhFN?YpySt@v+fZYD>+MWHu)H1r-&xFsOZQjgkAm^80IIVw!9`IC|!h$V`A9PIe2+(-=f*5eBMaQ2K{ms9X-Cu#UEXl z2(#^?wK0Pa`}pY@uV7hbSg&<1l|M3s5|DXFS|ZvkI6lkASSFfHz3FR+@$l~8^}*@J zigkFx&7ph37&JWTeO_5Mnqem{$lDhGkuQ`))vly2W05*3Eg{*)tX%37lBNNiNjyse0u8>|)0Cxx>}i3V7x<)9 z8iJ@`LE%diBIGo1is&x6nfWzG`3f&AVQ&pkCO-qDm>!8t7hZ;!0#hTE>0-w4atLx| zV|dvyeMz&lSf{;2BSos&K%zQLyfKZdr&qkKN_;p?te@h-^mbut*fHJM8194(ANNgU zY6LKR6_~DOO#E9znc?HWbdh3Iid6@S52lHc^!d-e2@r4Wo&U+3N{L2$vEg3v{xq&J zY4L_YiB?JgH2{}&2=Z`YxZ`T`R|xWAW1Q0e_eHA3-=}f4r%Ak_NW2M8`*yh2afgo+8y0iJrjuA+7G^Cg<=V5-n+B!)aX2X&4-d5d&OJ zB0!yu>6XaQ*cId&#qktzeYfV*O06b zjW9sR?>Cja^J`}vaUwI6uZ#fNbQL|Fjp%ji3$YZO(7)0*|9=^kJpZgKsRn8BL20qt ze;#mHTC5GzZ8tyZSWf@CIGcME)5T%_#(aD*yo^%{3}5oLSNv@n7v{9ON{pNn#~=*; zGrU+TZU5YAGv-}dtl{4??l3)$=CP3uB9!`e!@*$NHcDc%^uC6_)Y;=f{J5&6w^kOgAZ} zMk~`Tiuqqx;4n567J#()+g`E%xf!gqn^<)rzPJG)rYD947fJos<4|31GTbqbQA~|Q zrU(86`nF18Z2Nn~8ZmcvSilkiE&&W54246GOUZvOIjXw?=AC&eYJNG{aaCi>1aiHy z6YH0j>Lk=oC?O8jQ3ejMg^eYJpmnM%uwt zEi%Z<{Y9B)fbfpuv#sj;dc$g9p@YFw(4~>fn}= z|8+CdQas-|;_tr%Xa zPCJ#C`zztWP&n~&dlOzHo>;bGdHEu>s z{j+!oBA0alJ(yy^{YjapSBiW7S@d~&qvmI}5A%za^RMgZCkE*R8)2!4R@P`^BwLNN z8mK+o<2~F?m_AnI@ zF(wU0qHm4XM$JDL(*IuW@mBh$9_~S0ZT<@MQ9Mz=zc2F70=sFXTZCc6g8ygb|Ho4Q z=i_6%+++XkDd)$^Ruu)@+?$D?Iw5fm zq<@>3{qysXrFabo>7ef_ox^AS|Nl&w|Bn#XTWPVk_WuPIAqCZBcq=fFy`Mqe?!)x` z-|@wK<_x$bE!IPk0QzhB7sx^`iiAHPk#UNR>ALG5?F8c?!vN5#@+bLioO{Uv?!a0vgPu-k{qQ2ynlo&t+64!bI ziAjnC@Fu>VhX7Jy{b}M~C_MP~ZJOBos`;M}QpBqbxbX$D+&9R6k@Ol!l5`0S1@H)f z(*K4XZvKOI6Pe!10C!Y(J0{@gsed7?PW|Pb|11w8O!)qP3_AZu2}uukZ_j_rB5;h? zXdzNZ8Ho-f_SGO)`Cr5FKhX!-MK9s`ie$-!`+sth)*zjBq&KxXtwx#=HEZV+t(y5T z8bQ@9N0$)i7?#vo5a^6-|TkLxtlXvO_=Xd{Jd zH9|k0srs6HTi1*Y+OB5TO zqXq^F1_}xa1quqOGhV=;(K%{hplGO|U|^`A@cx{6-uHjr_s@rqe%$Wg-fOSD*IM7b z*4n@QcE^GMhC^$#{}aFpz^4C?1^<8T?|%mGfWy9^o{}9bRR1}E_W*$RzoF)9&>`K< zEE_*PwI5;B&A@JID7w^ak2F^SRg5>8HlV zKrb)$d^WSE*vNFuXwND8gw-7iK0ggQz3Yt8S-|H59JK-7C3f1vanFCoM(l^j_Gg$3 z>^ig`bhH2Ip5a|#mX5oI9?e?RntpvE!s4f*XZB8`yTXzjO)hwcK@p~(|M~1!r7@=+ z_xC+?`>HtR>&6I+Ki@=r=Tuze_SLQ*5MEB7pNReLQS4`7|6P01q04dC)Gmi{$34iw z^ZQSx6?Y_k^{5T$brX3iY?x*mcFJMK(Zt#}cDN_~>&EjYG}CWDAn`5-wd4MGxI15! zM$9?xv9x&9_b7I}-t-$s;9s%vj(gq#O`S;Ve|kUOt7z&Ze2=5aWy=T?PE7yP>{u@c zuM*R5B0=$9vBN*x1Flh{uUY{2%7c#21AwjX|K0=N1GLic=e`etZ;5#d*q_#S|__JcD4x61E7Q)l+xwf~=T>hC4t`%M1y<=3SZf3`F}`E`8*t}hBz zHZB%_yc%8b&k@QM_uAYMuGC`rk|Q_yRg}Wj6B+L{2`$@oq|eLj^Bun%kTG=R^kh~>l^1ifIANOoPKH)*z6VadEC@5G4{Wg7!~iDa(MN%mD4w8 zLEjh~odybb8X2+ciQhjG19<*`@9%Yfee~x&EU*24JQViX^3zdCGN@(`(9uJnY^S4t z+z9IPg8UmLPkc}@jjxLSc*Nw(n6j7F7rlNHoc^O=mubg0|Jdhbk&-4Q(_s2K^f9>$b-ssDiGyn8N0F`3?ukI2kCyW3O z&c8P$1YAx#3_J}y_eWD3Aaf4T5%5Zc(?F5YXFF8QV_yJN0=M!$1WNv>w)MBGKokHt z!2LV@CJ%uD&hET`3+R3S?^NtJ0*J>PUICIuEPz6wk3R_e5dQxo%@@BkW(H zF94^N(bIpY->khM;PgWvIqi22{?3YjUOx|gXjB3e{XTofPmR7I{5H1s|I$DA?MLI! z_5cBc)BlHlg@oB2^vgbk01=xR<9{3GKZSp91)APz{Pzz)zss-4 zNFZ<9#OSlrJ4L_q|JChRpBWi_X|(GhQ1S==C-^x)mKuz)1!pAUVw*_+|7v)4tzxUh)G~ zyW78x0UqC>?~fI0SF(J-$jI;C8S+bY5fE@Sy7uo3`3Lv(z!$qL0A4->9yR)XdHk5L z+6%PxXQN#YfucXi8}wd{1_t|oEj9<)Y(dsUpegkqWkO6`klnBXYQ{9bTylD4IA{FN~r%VKD? z`l5?G`v76)2sn5HZ~qJd^@;qEnAgqg=ov3!iC%S;xwMTOf)>wIutdFD`(WP3Ah3Z+ z?19i5Pe%S-%nn+>b6;JP9Hy8%a2+5+r5-(w;tKuFI97HYNEazpfP~>DOk{0F%QYdrMNG|8)>?q zOZOysy> zS^R3TtY^U6TGJQxt^fF@D{Q-}gQgu1gsSsb2~?#_uEiNwz}4LH#0F6QRpPO$90)M* z>IYNEE&uVb^8zPx zDpbz9d6XQ&10?mYM0u?vp~h4-NWIp0;t(< zW%)Vfy}1{Tn$`ve3+A6{TZ84fW`%bUb-g+3H19|UO-fHmj3_N5580|6pZS%1n1^Do z1g7MaNiI)NpQ01Fa|$%T#9xqe9Rb9T{@@S1LH8x3%zED24KF7t-$JE#M>Ro0Fr7Jg zm%%5ViVTC#pvpF^2g3pl(lh-p)4`5=Y7@dGTC36cL~SM#o%xg@Kgc~bTmv);C%Zn; z`sRRWPslgW)!T6`Vbl%e}L6qoaj7YZ#SKeQXPU9 z^Ysg9qT+x>kn2+Qn(H9_;LL-zaykPQ>lIlf^Mchlcgg##@H0=Udyt^^R3RBLnf2e3 z$-x-BKC36E)*d2s@s9kF6_=><MIau0C>PU}9+M5} zHTp_I^FDw>t|1GH^#kqyQJrBs*mkA5C=eEOU7DB-K5Wt7)FNWr{j}&;F6&VM9E!!J zPSFdJF5dN2<{Q+w@kuDD>~_68ESb&dLBv>q+Ivc4%jL(dDlWAgYpZL#vi>*JczSlp zQqHUdiE`(mU?8KSL7XLPzYXCh%$Dju4vJVkayHp^wA(mj*+P}wnIIKzV3rbld^jQmkjm|K3EU5N2eAClA3|Bedj1+v}#;b9TQz986{0eecQu*X{~Cr0o@-d*6c+t z8mU&da3?qHjv&i#6-<1LMQ*iWb9xTNAMo6kwLhkI+f8+M6(4I=WxXxF+l|bGrls># zL9Pnl4_e3FicPDp;tzDctIjT1@3ng?kq^B}%VY?LK5P%I-Wj^zg731in|XqWeO8?0 z8`*@t*;=y@9lEhONls=RxBE#E#rP04H*pqzq8>>jfSbGPdNxXyPDcJ(vfw$CJ%tQY z;9mIEFd$2(md7&Q(f6#-vI^^b_+W+USgRJ>GhhuQ~?-$;(1?OzN8K?FkqA|c*l%`X_~pCh(DGbR%v4R%1+`Zvmg zi`A$IUSgq8It3~aaGmR6O~*?&(~E;5Bz=LC+gDI+o|TuLX6&t#MwOyBhC*|IgMc71 zOwQDfwZ@3@57L{G4=WO}bBl5*Fn_Q0;dOK7uweFBw3E2Px^up=BS0j-aI>Z^s{a zDJJ_phvDoN^P)@av!#z%+SWHi&Lg1wG;Zh??7=^@o^7bxPkRjzsW8rMP z8zwtONoy$ExV&!xB}`V33$3Tqh}A5Zp+D+}#oAmpXO-1tK$GOpCNdu4*SdsG`QL<$ zXe7f6*+ueg+1$tJ8}SEv^9{*}$-8%IHf?yp@4Y>)*0du^w6Ij1P&O^W;!blM%o%yfoW3XJQuk{44M1GGnQ-?gga3VY zwi!+9!4C64`3dF0i(nT*e`wlRn`Mt%E(Ib`@}qv>2oIT~Ls;Oo-3F2!Y29|q+o>$( z9pS%SMfCGJDFSrAfu+f=zU37eCZc;P9kSs?7L#|MS9RHdDHZ6P^QDciHKb5jqrURe+wR^f z;&u30ZrQ0IGNpaHLy2-hpubGfcixzkrGY&x$I`dRkQ0#(q(;E47L}fG%y$Q-wYo@3Ly1-(u2J z5pj)^Td-<(ZD=z?6%*0F`6rmC4PRygSlTc0wD%J^viDO?Q@kXbn!Kkh&mg`xvv+=9 zU6&4jCIznuDPP|Uw3v2|hPy#(`>Ph)pukvZjDxW^6^v~JD8L4HDtg_+uKB(VaG48PwF-~dG1S}x;1ysQm#1*?4#7!kr$dAYC=e9U4@p? zHF*dHn9eL)7T&FYLSIHsC%kAIA)!&}=8VZb<&v(dV@}`@f26x`q2)y6ucTlZO{0?* zx#&Y97UFxrrve18;A4lZ-`;0p*3jzG9C?yZ9vV`4slfrw%TsV~o<^>SLiuH%MY9Q8vtBOzIPIN)D*lB8bd)eUZCvr)An!C)_Eu8T82 z|29MGiODi60cIvzeqvhDNPOxb)HVl|jih1S2`rzGq9jX1YjR1oOnLkrjp!5EH0b4m z-Ozqd>!E$JfvIg?H|a6$-Nf+1;#m)TxAr&sjgl@dW+Li`V7ZeS*W>c=N7IG%^9zqQ z*}hA2K36*Z>j&v6s<_vB!*gA?Efqk;WZIoAgkpNyKOcij8q3L0f2dcohA+;h4K_Ln zUVJHOgs7;`tNWsU&?A@3IPoy>EgM)jn*Hi~!e;V7%kCWVW4^;h(Ff~kJOZsT(~6>g z$*rLa$B*uLMu82;!YTJ=2$FJq+)Al2R}I;gtI1&EbzF{;914J%uIx&@rwt6!G2yga z-CRj6+DoTEb$7_1LK$`k@eyp2dsbw#qB16TuoXZ0&hcifMyp1^HJ7ptuq0=G~KmMd*WOp8ooPtt}q;Z z$E@;F*KD*7V~viT5p3jhKWOb%?FN0W%hK&$cMo$8CF8&MP=&N1d>a69HTWsxE*jSD zhFc>Bw=a*U7_pDODbCq?;SFPkw2nhFc$rgJovB&;0gBc7S|T#F7N^)ip70BePh;KT z%k60xb}Ls25%oPTnQa+N69dAPEMv05tGz8}j=Cy)v&C^SgKai-8tqt-`$T@8tkoQ3 zutA(iW9I@JjK|Ul(nW3-?f3%XPRS)0Ebjt)TDikziD-;djx@gV7bAN!J&3qttNM4 zdd!e;?Homq%jv4Pv=*N;k-s8=?w1nx)j6UEj7=4XT@5-t=!8<^;LoF5w-NK#U%;gR z@G2tU+9v$P_&zxD?z`eb=TSE|4l7EGhEs1k36rY8ah7xvRORgx`B6~#UKXg8_D!wl z3k}E5|2UJY*FV>td8XJdMD#BHvqfIrezrCV0A8ZzC|p{=Kv-_sV)TG28Z5~z>#>+y z_0rtu49?h<6xpaeokflB0k*ddvpraI`f=rPkMWNyIV=J%)|R)vDv{(4B)5zD1cUzh zhFf`+mzw9RC|=#gDX*m;w&sFeycy!tW9?G(zm6`= zWd*AH%=;6pYTRw7<3jj;^0K#4U+hH`K-TY6z3ZwNyfrPkc#)mP6?*XAr~z5(Y%%il!RtZS=v>@{d`$WS`#x&PARa1FZ zeq2X)l(*$QC+*^-bqv1USh%ptQXRXP)}(~~jtiir3>_aSi!9%?plBF`$^y#GDHgohq zfZ0! z>^7Zei$`|QSo}3vBGBR*K2c_0LCATEnYp5-DE2NmmC6dVIJ-ywGGv+<9`B_)B*f7k z2LkM|CPT&i2i6_O-b}b&m%;e`hO~ua5Rk_f>e$7q0=pS{;*d;H_deA+3No9ll6H6vIOryI+$8+EKI zn*rVi`V`jeLR=2?)rX?*@1eCH1RNo^(ZqYhw6xcV;C!t-FYewmVaGJr-gBc*66vQ8Ru)=oIk!}uX&B486wb{OTU-@daUI`MJ}S*rs}t- zFKou#E^GX!Uv-jMbSNxLh@-Fu;9~5@0upP}MBl_8$l)>;$a;ILp95S6 zXNi=8{glId^u9W6*c9@RUtR9fyR2#b%3}$D4~w)5C`3SbM~??O*<7CXU1=jivRRqs z+(2WTAADu|bEjL`k$lxJQNM5`h2`T8c3}6OA)+~&ZaH=Inv!NVcYmgiDq^Our1^K% z#!uJW^o{Hkgoe|J)>Z}-i+N^l13X7ARI|$`itHqY?oz)(P(V=4qHEc@S7Z}97FwI> zAHGN!B=B`Qiv}#GJlDAj2C23$&;)8htm|VWG0fl{`73*c0b6PaT!!FO@2K%sqZwvp z-r70v1-LVSj<_KEE12zPHKD$df6}w|=+oPi?=BNEO$@mfqlJMuLzVI;bFPyMdinBJ zz%`UJN0sRn**Cr+r?b!C!}4nvEE#F7px(1oW!w4(tLB^@Y)(sY?9=MFa|`z^J%R1O zMfjY*-uZhJ+gf$v?A3NtEcJhDo4d}q2Q<%uwQQe+#upam)%qC!G2d0LHb*|J-j*_p(sjK9zQQGOkKN0mfb#! zNdzps&VCBNa{U`@tMmk#?|Z1$Yjon)zEclY1duIG{7XUXg<4wf1EA|I`pQMv(ysD^ zEs;m7)R-^JL`dmwQ+~;V>u>6wN9){kB`WL6OH+s6$XgXdCK24EE4uZK=gmSCVY4>w zY1N5yxSK8EhP)wmxS<t3Y9Kb;IE z7-omF0L(Coq`j9pSv)?>Bj`5d=^ebRHsQ^l@1>P&w-EV~-7+3Mm?G!Ci~3^sfcq73 z++%Pe6BidaxS|reKnDFDdk3d-n*i%+wVdU|^ynIh1AG=`!DL2P1+r*2QcLUv6^0U7{j*>$C1m_lGQjgs5haq8u?Opnz$t9VljvicoaAms{(p*-QzlvF z?6B6kHG-%)9dKvqmuMXk{S|ww3o6H!$&JuwgLj?qw^wOPZ?JQy!^a-0l$&}wAl+|| zTvlyXuE(v?Sd9LbE6Falsyo*ttNW!1`-U7?7u*Atr_L>G0)XyOV=~fPpoPAbXDuyc zw|^DS<;8j^+$~RbMU#C|GDV+=#3_jD29WPvjOJ;&D#vh>87vDC;dwjj{DSxP-9U0bD zzP-p=xd@V`E|7Evy|>`z6@rTg86b1dM80k5E$%GFWx)-Nh z8{KkcpeR7Nw2jP-KeAhQ+l#aAI?x;Hd50*^L)3Tz1IKQdv*VTnobAeA5NOK3 zP98Op#=027M)}w(1$KDL&k7}prsR4>{=FJIJRx~z)x_b_gQ&yu7*XePiO6eT`b7k3@pW(s!| z$;eG5+f&^6TzpYfd1JSfK-^p_R4;GQe~tP!O0xdA|A7anw_T><;{vSP)}iG26j8y` ze#$ky>e=5|{xutRJpJ*=ACcI-Wrsa;bGcN<_uNl)R1cx!ROeQGP++5lx5)|-X}u2v5>4E>wC;R!%60n<5+oCzrI zLrZTe)(g&oWUk2EExyZt=pp8?gf=_burT0?;1pn$f0_p(z$E40{e;?J<%euAE0Fn- z%}7%Bf6N|ocP)Ut8C+k2(~d_PPqq(_7ZzH-a>txF3xd zdKVnHAyt*83tYes4m=dh<95HTCt;h@RpQv^RJame9A<7C51eFQB}#&km47~Ali*8 zrWgS|xSVduUw=QCn868cr>%#2#~)DI4eIxzTVEJvIAe=`$(xDd#9W-0<*L&)bWGIv zt<%V@6{;eA0sy{C*cPUcRzIZ()+<}I`xiAq&*sw5V2|CzRx6y7^@gNe|8iS667`FA z!mEpxl?ZNOpk~qKp>`c~bKD^aGA%=!P=QLjn(oXUJ4s-&0dD@RVD@(=84{jK@sD9! zp;>9k3x_KyE4Gh(D|NB%n#{Lj=@#-CCt&P`<&wKm#UEd4wkl->6}j3F`0_hV>l%?@ zV7^E^b|lKsWWk1>hz!FLNvzo z061a^vI-ZHlk>jDDO;6(uu*QMZj`MjzJ)mxbOH68Fr5mB2F+Ch%cvj%+ubEj-H&ib z6QG_~s2h_>*K``Y=JpD9qF{WV<)GA$8W@n zrzX7zTnWF7*7=_mLH2<|%*&4K)ofcd6t*C`S@;Ux5LBoPN(J3+Ez^qofuksw8l>HX zG#=x>74Sro3fleKyfYz~E%_#(6wijMS)e0K>DG0n#-`%Z%%Nv&qB)k!mpHbNRszAw zH_T(HB)a9(Pr0HDQEgrZH^9Ttb1@+Pz>#+nJe$61^YSiC7qlU{7b9i!iF&_%dCwN) zNzAm{VhvL$4d00;L}Ln{jIX=)dN5E@KVpm*KG=Nl2w&CrrXLH#q+5XJ^>BBmNuM3~ z+gq+^d8UB(3}lK*QvyI;DN-Mi>W)p%Nu_!njW66kcsF9KYmp5Ir5SZ|W#ZOIPa>+0 zeUJt?GFVG+=Yurk(Fud6q!$iih^bf;{5`A>)GQ;(@5DD)nMjN`7@;%bdTKwy<2!NYas?XiYCKwxU_ue3MCYY`M#}o<1zW(MX;^`E}eqq zJQ~`n7*sv~S{Xe-O($jn^E3S+Ku`4Rhdx|y%2#GS$^ArR()X1fv29rG;l@XilI&sZ zY;14Rj>&Z@Ppw499BjK!B+m8lpRTYVyKz15wloLXdUSa~Oi6kKBLi+7e;^5hk-wK6 zvKT&uD8(t51yAw!M(9442W5%nSgl%}fRz&|StC0WxyQiZ3d!d|IT5-;jCDqT-K{As zEn=X^RCUM|!wLdZ+hEZ00m!My*# zFS={<+k7^?7eai{$X1H=vrDotMb$|UmZW7hCL95YGE7DNfKX(!^+D&m+(zcIwb%hG zW#Q%i<-MSnkYctgBiD9**#>?qr5FnMxy4R_A}7v;RUs+nd5Jo zV>NUH;orsUTW0xN6wgP4?^wZoZ!E}wt@XqTOy!dn07+(U!?Y0V#k4Z!DP)=SXnFR?h>ubmE~=_N=h@ZV3T}w8D^>K9v4tpCs!o)*R}QsN8_He zLwex{^dir6QC?UnB(FGbS!9foORnL3+<~Cx-8`-;N>k3}#@kA;u+A-KQqB#+l!-VU zf{Ek*a{oMOy_YiqcxLr&qhp=U^K7=_We>Gs1Jk`&su7JQy_?H%?|-hKzq(xQ_PpZK zZ;7FrTz=huy<_AhP88(TXNFG@0{g!Y6z7WIxrLy%8xzE(ftP?NY#bBnaaGI)3pq|J z_d&Pl-i)i@EiN{Yg4Yo{8}cGk$N1+zhIitGl$oW6^2g+IdFG!t3Y{jTSTyUaiBj`ZMm^V?Rx^R<6qW^rhP2Ne4t_$CARZ#RP&bvvV)3%Da;A zVg6c=2ugy@$87{Jwqo$hoJoZn!|&R&m*HF{QVj$E&ev?g23yG>_q~RKa3y<&mHoIZ zaBo0jrLZusYStHxsV5cY@c_*yBg|bfyf_bbh4XZ+V=1;XTiInF(&>=5NJnVRtoE)v zhXfhH9|GXjy0=^%VxIZ3eaNe#?xj!Uacb{n z^t~?6Gz*^F21W8UjTEkT?x`(8O&)tMnzaSTPw{T^#W6sO%O|(#1b1HIjQAydJT&RS z>@}jF1;*!V)eIU#xAsmA5IHpncI-$4Be~AwjqDf8>KR*l^9YD(%a84nH_swZ!3^uB z2g#;}v`DzjbKAFG&4i`ApUa5` ztD=V5%xc;HLM53G>Us|@FV)N@uDb(9v9bLcg&Cz3h)d_L30^8UdUH9__OV+J4KWeL z3&X6i6^e`@TMMtaw3^JFbC*oo*$^e)e z@<(M^t`Z+sNInu_pcee<0xdmNwQ%pD0ncK+Bue|_Lnq!--Rc1v?avP0tQt(pfZZEb zX6b2RI{3%;syqSM$zPy$W+<&kgOF8h$k;&C4^G9H%5u*OAeEWy(+z&`!Ka#RzP&39 zmCRLdmC_UEWho0U6E%XUFShHb@>0Ln9zzxUg|*;j2D&$T4&M@(x?L8udy;JRQm55w zXgEuv)Yvf2A0l99Dk@I3l2Y#ZH#vi5(cP7Tkk!kK5Km>t_}7wvC<7$&$0M!KiOrW!ej6NoPRNTx@_$l6CM= zCKFEc;6WNmm}RCLaEg#fIoW`G^$svKcnj@ETN&QEnF1-B)tF-%i5h$=~Bc*%-aD+ba^Vw)rC2Eguwpzp_*(5C)nwWMC2wJ&e;h7 zvwDwepFr)+3>ed|E|H5hRwC1Mf_uH7kS;?kthmjtYl|;Tyf`r(^~1^l>59s}1$_9N zEZ?6hKOxKUUr*Kk?XIx8Yk9)ImI)CVXhCpb>=%)_@5VkT!0CI4P}AywgHwyas8@xP zh%4HH%Lc{RU<`UtdQ|~{^E}!jf);ljw9p`N(6TbWtj$bZ@3~M`BpOHzCkAf3_r9XI z)e3O)7jvThMJf3l_(7`ycY#Z{s85z-A0*-)<(IRst$U||nUDEBmZ+W7sh=_f^)DEc z(dCMl=j99~xSgfaU&di=-?GxMBtNP#p*F>=rl}GL=qgh1fgXbXR%KTJ!zUM%Y0Btz zD#qbahP?wiOOPUuv!+FA0O8TxeLsE^f(;8_pSyo_Y!;Z zVV4jx#x*){HE=v}A<@00t47~3QVkLC0VefMuI1C#86eLp$!#FQ^vZDG1GhLuGwz;? z&7ORjK239h&$kMb0ial_wVh++>@64;EgXbNEFKz!RXP5(|86Lf9=A4Y{XFHB<1wG#N1I???pgdWNjo zZLhpZ$Gh|nE{V{5Y5?mjC9~oEtVg2sfZC&lJDwE8WZ(*5t-zsgs+;p9jT*dc$`Bfm zFr$=GA_fW7#miN7O_u>!_d_|8w0FoS;Nz;093VsP*UEiEnfC8N_sw+9A(YsIGjcI* z{URFxzOe$P8z3RrzN9*hpHMFYpY+q_DM~-R;NE!yBdvtqzc%I;#PbGBZvQK$OiKQX z+EUF(X^ts-V#|>@ns>ExUB6M}?aP|G(Mmkj3 z^IUk_o*DDLCN#h^K7||1L?;8v`VquqeeRt&_jT>v-I6)kKU%w_nMzTURmXxGz9|`T zvtpFzb*(z~ zVT~V=vyw9zcDDcMp8kcmlk(KLMJHgp?7ABr%H*ZK5=s44UBj$CJHlOe`mr9+iEHGJ zcYN*8pu-#1ZL@V?77JCYdWF)u$ytYzi|~+DT2dE-{VXo9Z3r(f2JV%~=9Fn|>j1Cw z@#^E@^2NXce`U>fnqk)FsV7I{p%6uJBu5?(;2Xdl1PL)4?F^XQwt&Z&i~?p>2RYtc zd2B;aRKDOw#2voAoR+F=Lt-9ea8er(GkzjqV-l!p^b~aPHbZ$F^_F1j{J;YUKkgtH zI>IIARu@<t*LNq`W_)k?SZUZ6d-;;BRzTwPF>z^QrxY<2*|4Hg+y<>Tv1M8BN z!4S>dDPU>H&kw5MW^>jOmW-J7Pe$N-nD=&8h)C6KBTWW;9W3>SgMR~3EDBYu3li*i z!Yv!B$|ACTMRCgyf7fQw@v*{{G5P1I8g~}5_Z%=eIQ}GN6UT~IXtCti`?^=@l#(#(l2e)Z zUYje>hQuFO3oMS$CFIyw9lJXDG9PX{Dvhz~?)u@3TI{|pOrA&AeHeGaB zWQg7~L1yvu_kcCe;c zoal`tYYMh2%q`X%fVgT>4Av(i_46=|n= z+JM@Y0KnPOZ6ZFk2c!IsuGvRtxjb;|UO!e}6J*!6(MGz(AZFWR1DR#m9Ke%IfQ#D5 zhwQ&3euT{GqKm)w3JL5c_pU7d&CV3c2k)iZsxcl3rQ_&rk2gJBu7zzR-v6C zyZaH^Z5P{>jQhi))cv&e)WNlFNthn3YLH^PLC_lry6Mo)R%gp_ft@)@%`&R>BWMqC za@+z$>1QYAY#Wa|6IcPoDXTS*0G5M72$wu$wl_7{YGDrsV#dX8L#=B$WmNT zVajgStS9Y--ET*tCldW-z{Vtfuy;`a6@XI_+yz(d(!u)WaMtnBs{0+)%qQ#6<;YA1 zYwId27vNB%{tZ6JjCC&t(+kt$(7TuY%jeJXj#xcj7qAz}%3XQXn1ixVZRMp^=WXVi zEwvbiX$$NpFSW!kiSg<1i16{=9Foil+*L8|?@UQO2_z^cLSggQ<3A!fE@xG4Hq9-0 zwayB5mQh`g2P!Z0Da{~do>S%kh=sbwlQ^&f@qS1j#n1|7Q2(SP!3+}?EXF&bN>Wn{e^#Z+-CTtjQbAM`Pi0w7k=GwU3`yU`oL;fm&2r4Ro?-kz|@<) zOsak$?82lBjtEwOm+cnRQHVgBDG#pJ&!YVC7Wp3(=r=Fvzh$c$1CY z{0sZ!^~qBgqtI^T|i%wSy1tMWJ}nne98EjS9G z{08m{4DrcTVHeTI-~x&n7;>W=S|Gn^(dBe)@LmNq_VlEDl)lZtLGNv zwr^cq#kYjioY!)ycpQ<1LACvRl_39M643kspm@dxq^AV&_nhgI5Y`IEj2v57JO@VKeU(PrZ0 zw5vuj*{x8lzMPon*R^!%`p))CR&ZQ*|sOJ``Tf>Mry3D|WYejnCIRn3Edhs@7}-7TEtB zSaBz}1tOb2D-DIPF?m-s0)3~vKfq>+d6jAp<=kH7x3b6q-RFP=x25spfvU`3`tx|W z#QM8&4cg;9lBUn3Z3IoO-a5ynCh0l<0k9;WV)rgM>kQeiHO)Fz+LHw3jatte>p_-1 z$`OJ0BJS>K)T{Sp0Zu^Pbw}!4&;~u%cI}>rR94ST@+u2#Lw?YmqCS&3=4xh&FvqNA z9?L+AlJ7ZXYeiN5$1xu#N($?(3SC&g3dLw*@cPb<;{vt8yve9P-WJQM`gLp%8OX@^k-pJQ^B0`Mw@CCAhK*Q> z_Xa&M{izOZOik~55x zrhZD7RmYJuyr>^8a6W|>H*SI{iIQXc$oY>nZQ8kYnYs_6a;-wMv->)^ti*___fg-5 z)-*paF@%EFxV0OpD34BB=%%RUNwx7i%nOcM`evGZmeW!Rgf4%v98wLVq)6~b(`o`i zri(!YFBNZG=kNUH`gr#v~q1*#4?0E746QK`8*Fm0& z3#&>Y-DKl7!Te(Xz27%tTZZ&E#l03?s^`M?QTEw9{rn=c&HR%`C^CUXh*-g>{q=s9 zKt^G@3!B=*{9Lr&c98CM4op_!SrvLWo32A{CAm*(F6@DQuuvI1fF`fI*(Pe8s{Yl}7PXIhkt?Ah}2Iv4|-An(4ymn03bLQqA{N3vyO$yv& zLmB^{q&wY{8&k@@{}sUDjUih4GOL8@L^p^r>y2})Gt6*!MVDG!i~;7VzsT}O>pTvaHAjLi5mx& z6<+hp<(gS{Ugu7B@8+<`;{rO@;&ID}igHbS#T}R82~T?u!Y8R_i2~2RsGSSu3ZQ_V zV$}ENo+T#P{^TECc2qW$IHQ+3lfC`_tNA)1%MX38v}D6h?Q0hf@drp}G33X1Y$rT%syORn@=CzKiW70(_P5Zz{14HLxQFy( z{%9W|kkd?9u6wWuycTY&y;mI%Q~l;wT9^t`XK%0*)i0KGw`0hw+xnBwfe6wop@PYT zHCgwt7_#1!p$Co1mxSshH)I$O<}@w+$N(L8g(rlJ-`?@2Qe-^3GuQUQ;MTbk+-|UQ zo9^Z&E8!$3FH3Sl~Av7g=BwNO!$kaq7iS);2yZkB0pKCr;1 z-n966sh28gQ49mFM?-6P|Dxqu0)$RC;}^VzdGKorNySA~!WJIG*9x5Xe4#x^yax2% z!)(DzM5SNtTX^9tfavQP0-Rr@IJ*qWW!gUI#O+Es zG35m*2frxCKIh7vQ>s_;9(tsYFFrS90}#Gk{=EFdZhoID2je%Weh+dd6JrZ#UN${P zllYJeq%t|dd$%T!Q+cUzRxkij%t12n9;k(uiyUKXMKVj*5(w_Ns+(maT2Ar0qFK%y zU}=!#(suadUCXU`MydNdRs8GXj%blXRs5ap{!nIh^KF_xLV5BEutokMP@G<+d}#_^ zI9QJJlYF$CNh@G0lJLJitI=Erj?Dge(;astfDia%ejK3m5;|B&W07#~V(IKCc-5Vb zOPNceskIjg$DauLc*U&UR6;%w%+9@`nO)XDMX`>jl>1u#?9$f1uz|>WT@~!fZ%!%; zOA&Qlk-An@T&j0uu|FgYJun*g@S6zsfcNnXn-L4GvQJqXwX$myHVp&$;vsr6Fpfq84X)yv&?9y7LEIJ-9KYJU^-U#_`IC{(qB(F37W_Pzv+i4QB^*hs!*^Qd0xW|2u+Grw* zsdm&rf(ix{6pR>9P>9;90RyRa)PRD41P~MyA}A>QZhrssdHKBeJ@?+{Jm)#j;feee zld66AkS;pWGHpdfhS+1bBEVZ4t4+Bue)Qc@Ex8f@$Pk{;*iwR)BA_vW6(`gzwQXCB zx?$j>G_nDMDzRO;v??F4prP!+gb(?BO9!2 zpY(zT_h5yLPlpdsqqpI-Rs9*ZwbXvg)GkKYpzO8+JTd5WJ!mA4bzI4P)8M{Q@h3{< zK!70M2f7|aEjBl##iGNmH%LT4Y>FS}9JN>Z-)npq+Gt`&(-t)`A)@|9%F{@4{;9A{Q63)339u0FcmmAe(vSCA zEWZ~@ld#N-uOP|Hv6h|kg`-jeS!)R4mvUJr5j`z^ARcM<4Q3}(mScKsRwK-H)E&J$iNf_K)NROEp_mVDQuW;|647w4(8^@Z^FH9Q|JZz^ZT!fN08J?$r6^af~ z6PLwq*^+1*(^GHk5JJ=iH%QzcE+|5od9K!>~v9CBDwTYBY4^(+tGkxr!y|y@aU(KTZ`0*4ZT!4S&LG271=~ROi z3U%bR5-C~PW6{f6b;Oa?6ti~%)$A%`%;V#nW`;azmLPL*B6t~MjYJtVinkpPR9N0F zi*mZ@2bJc1SIDIv7;omNyAM>W(v>7PzyN17tC<_gEvcVkR8hPI{#DRpeB#o8KFOw? zxx?faB)Rz&{p~4P*CvpdeHO?jr!v+Op*M~A2mVp?*7&jHJpeH*ujg%+1QwuIm9cYsDz^8^DS=3e9+i#$2I~uk+ zYXhDCDCYO{AlSb~-pi-?KE`CkLyq~+zA0VRIuR>3H zs9Efam@jI3i$^+6eHV0%tb3_^ZV(NeZMb>)qrnE-+-s={Ea^BrFVFH6{4!V3yQ?lG z5)yM+^`Vc$te^CYZ;1QYU9KLd#G=Kmccv57jpTXS&~=^bygJ_Uesw@SXfu`l6}qsQ znfV4>55XP7t8hG_N1v|bC!GD8lr3tr6T|R58#knGxpr%6=JUl7uVX*9@+e`o3+q3c zA1R}n^!fkPl^7fM-~U(WRZ+-w4t1299;&9g%Rr{6Bp=wv#^&6->+Ua244Vga$7wbUu3#% z(~_bQ>pVx^Y@pJ1HpIP|Nb{G(UFV(RP8v7NJs&q0?KG<$t?_sKrN6ilo{O7GwIpBX zbS6PJ$JNh#MmKEcXnfNUYS?6eBdMQIQPoxK3H#q3&{A$n?^_+oqiZN_))V8tG~vG^?ia?Trzg z-FVDtlGm(eyP3HIgLp2KMY?b5x>=x&%Frp#-66 z@+`J8o|M060@1U_2v?&v6IT+dE7KoyZP=BWLHw+ag)WTTaAowT5Z0j%X=*Y!cS%Jg zrLU>?t&yB(zz&+ji4`s0*e(%t@qQh-(4e=ypBBhEaES|qtF2|({q(~DC0m1N*o5i* z@5r?H<_t{EZ6&&7LhI%t2zelIy9%TOznyFD6mr70eqKCdS=*y^jGWHv;wt7}!ITaC zq=q~{VH*ZhGzWB+-=;{TB5^cvYu8mth&3kbwfX%x)92dXG$x{QTV;EkRNGfU>fZ@+ zjGg3U=f+suO+!F)2@jjHx8c}?azhCTbkrZ4Q?Eef{Z$-%0pNDFI@Ga&a@Jj3=( zyQege$ zB!Cu{F~~!ZTQ`;;XwvLx2rm-H!W*>PR#$f!Ef#$KU0tHu*nj3A06=_P(u0vioh1Qb z^w`cA3K?~?kR(Xx+W2t(^(ja&r|Vq3H)wyKP&AbV8FgdhR0F1-90b*0#d&sNNe%-k zk@7eZF>Y@|=#q$SJP-UDjnhWHxkVKLO7i8`hhhu)OGPt+uw z!-55$)4&+hf$0Bvs}ZTr_0boV`y!b5YVwdRnz4i8?^rz;Vz?Pl2afUIh47S7-+b6R zPrl|d$J_P=?adhe0;^;%Rzt#^;P>wHM|gVCUjk(rkM4}87cAh|vV_6<$H7yo*&dmu zFZafjd9L}jyD~+MZEXh`9dVhr7$DBLTi#bo41xdG(^(A1SQ7X0J?&8Lj}%FW(Zd^4 zuOh#_Do^u79DEGjcr5VSYH0hw2t)NySQ;xkEPS^}X};ejp7ss+$c6lcgte>J?Ez%_y#G6Fn<9j+%se-i-1w=J(NQG(;g zr4eTmQ&1N`3->}-9mVcp9*5goWc~uldK!=IckfSmQiipo2qM3ILhW%BoG5^HDa>0G z=8~Z*{z@~w`f^VoDdZ9{%i*U~q@Kmm1BveUV!BDHyiN~)!`OmL80&Ld_Ka6mbHWO4 zt9B-SiCTJ98f!zBfr{qcO-J!!WDn*NGMU&M-vsqx2#c=K4%sZpEr|X_PRc$?XNh!E z03a=H~+-810 zTV*BU9dSq9QZ9!wWNc?CXq{XY246Ls*4q=|GaZ>5}e%jZTJ-v{KeVy;u; z?ji_*Ram=^m&hD7wuur$>RiZEw*?rHe4xR{bUlI)ERuL%bf(Qax2t70Pve2M)gG(M zN8}#Vt)Zq|d{4CHGLEZd?;OStM6!eSm~$>R(5vyTuRy@~e>JTb#6~-PN8C+H^VD{J zbYH`6nCN!;aC2n>Ow+fhkQ7aMyrk4U*1Wsl=+*u@4vu;1NdU!!o7l9SCi~{o)BHu>JG7;)$p6hGABhj1G)P0T73_`w`H59>$c~iGO2k{>l zrY+Ja0LDH(9$}IejV3Qh+w$mM<|EP@ru7J_)cF^Zab`bRP-m(LNMgtUC-EWV!dT~N ztYfes)LORb^uq9nM0j98Dv%k*s$ddieO$laN0kOh@b%3rgzOq#gb*3kSr*HIlC~%w zk=o*alJ^&p>2uRVX0FS+T%H1S60P2rm3YC;hh^Q#)6X5yR_nCYRHKKuS-^-bUKa>GVCg@G7j^ra7%Zv2t3rfFXhyq8LMK zDM|kC)?TsS57ygSQ@yu~17(wbkFY6)=AnS$A_^&*S@XmFr)W+{U}O3V9Y}lWHAhqh z2z8Le#qpQuRP!C4<@P7q4jTl_t{~=1x*h584Njb0?-B1wS7*yr=lawqsxBBrGb>yc z@{(-s_cF1C9jqBpJEvqnpjvJ~2hTB*$yMq0_v6e!$0`!cN|ObZY|pzP1tZ61Wgv!z zgo#&y^`5RYp=$AzBy|w#wZTfMk-9j%W}=vH6};${%BNk;EJt7jT`;=LKOfm-Yvq-`$IV^=2k zrBFgAh*q8Cv^|V44?s1L2b3F z0O$9uS_(TW^hZJq6asvLEN={*af6$g`mX0vRq!iO=4;8y=Ga0ZI5O^uDpe7c<~Yz0E+rylemMqUns69!Lm27MVBB8 zedsn}56h<0`w6XgiTMkh^ez~kRRp54*p^$gr0@L~#;`#u-1gsAKJt)4ndXP5bm2Wc zs6$E0kW-CxupxfQ4xT*eP_}JQE88+>*gV!;7%fpwHtk^$mJG2QP-CPv8lgP~_M&2` z-KgG8iv5aBIjbCS4)o}tw$G_eHr{#v4$Q-QL#4=L5}UdCHT$zm^)uhZf({1bwPbZV_vnj z>nDE z8TPo8Gf={KYfTGrUb^Ktx$Z45{t9vMN|j&A$s-rad(Nr%1Nx0psNgWSKtWg*n`}Dr z1hVOfaamHUM#dQZsKV{g`3Tg^fZe(7LwkW6QtJ^0D}ftDnBkvd?i;7x~)CbKl^z~d_AcT6RG;8 zk+jsVr(2SamkiKxa#(A=)^kJ&i}t5W`cP!M1@~O@$p?a;0`ZxB7(i;^mdM4)BQ!vO z^#!0N6D|wIqPoyi^zL&|cx_KuJi7CuUYp(cJnA!L zd4wx<*5C9I-chf$M)C*5(kxXeg-m1mF z!Spvrd%_V1IvY;{guDT3=1AW^3^L&XD| z_OJq!cIuLB6|i=5ukFk)L{;x2tvjl{WzUZp#=(Ull2Q=LRJ;zW)VGTkLEdub7RM* z#uB6}oyYr-uLrmYu4K_h&~R867lQZfmrq zn5q(Y+=+;n1;|=hr@Af@AqnZpYy#*rv`Hi_9_7MKiRhVyBB+a{QS!#f`l-jwuKC#< zaVUx3MPwKrfhV5yL9dV~gS2{06(unK;7S;2y^lb!YsV)MT_S|P?8L*EW0uFjwWu{| zrt`8aDGgXv)CP;R;q8r4B*xMN4=8DzrPx#smNZ#C(`}t-9NLYv6b4L&C`0>^$ezr$F+v)K$GRmuvVvUlw zG0i0+NHJ#GwMtR|pxAKS)k^t@3M46tf} zc~#GSwG7+YXh)F1Hza)0)4q(0u_2ZgQ*w%j`_HwLVBi^TOQ}LE|EVSmaX=guXzr4eTHu;H#5P&2 zH~@~lvXf9?&D)v>Q5m!>HzW~>4u344qUJ8?{+)t4oJ()L1|dALu!G76?N*FIDCs=V z(|wCj=AIjqJHA~XC{JiAzx}ZBR(@mAxjVP2>y#b%MBD28?E)1833|Q1XAf4_X7<^U z{88^OppN_(o8XC4&)->%n0)S_?7l6@v7X5-b^?X*m%?KvjoIFsmC#9{>EE*YZ+k+2)815D@jo@i&q;xZ@o38&ySvDdm>yBmOq&t~i2 zJ(744m7+BZu&>7~Bvg0Q-^B|sjaYwWyX`MNu$iMtEM#d!WQKjzC5g;-Xfw8Pl*B5xdDc)8{r1E#z7M4IcXG`zvhJ(^t?*R)`wwKOhzB*g`~}>;6lqM2 zYu=tZ<2WfA;ILT>zskgt$G(t<>?%L8qz*@M3t;4pv(OJE)BEzPzJ4GIG>JcCsEC`u#kEHr{vUlvVRrcpzJmcX|y}Nzi(SfN<(Wp}dF^Wt&U;>%C z?=>XdR=GWomi1EQYTQ~u)%ILf{drItJ1APPhXNt$(wz7$kgOU)=QtWK`^;H&)@!Safjy=deH(RwP_B25RFRLf`*uGrW>R3+3Dz*FD0J%BIGdpi^?rZ zRpH!BX|*&{ZHX#|1f65+)|D`ucZPO+A*TVjs{F3YKup6z_N3&BO1iWQj(uSf%;3w6 zw7VmgjVZtW=#na-+Z(ah@gJ>FT4$2nnD6hTTMnEA9q#!ibXdL?e$jNan%(7}=$0yp ze}MRK^2ecCrmc9@c(AjO9kZl1hbxtAjP8jhyh<6kRsUQ#*tUJ9Ke(9>IwH$jDYd4~ z4+gklFtOnqhlX2y#v?V=cV;VsL`rTgCJs$I{!!S!TFcgKNwRI4TojdWNtTj_G_Tz< zO+hj16|UVP_P3b`$ydj3=s(ItNST-L$_A?`m? zjci>SSw8aP;U1R@B(EE2t3k2(u_-@qYi*A-jMX?l&%iDNXBX&gG>h)b**N;+_apv0 zD;AZMp%8kSCoO$;V3Sv=A)>_jg28R<_ukOlVyer=2<$lUbt+n-XD(Nj2I!@Q(;0&h zoDvsyX*lPhjOsI{*_bL#roq=Ke!k#+-m#@Pcte2gAAL0qd5X!K7mXW2OsdyywwIdx zrYe60;m5Ch%Lk>3d&}jzt{JZ_G) z(kZBJhyE6qqH$_BhFFZGnd~%kR#J0H`^SHOqfdG{vfpMv)4^x3r-3H@UA4%2IW?u7 z40|%w{{p?%K0~tsjMTjlp~{H`M?zhe(M8C*cMczXgqW6B`00|m1^?!>H;@l=!)AB$ zEfB%)LMDjaBwYGFQ>-=TE$`Weg7!XMeDB8S{`10)m#c~{1U=OV4%NTlDD9FWr|6}K z(VMB0w?7k+!wdxP8$F%kV+vN_7wE&O+~p)tr_BI%>4W7Z4g1Nt<9-GXU^C_?9)*$Cc^IN48r;v@*VK}z$2#vvO|_KgwZh-T(UyI>R`2WOL7 zD0N$gqz&@o&uU73Wu=s8j&e;__QNX+zp#eK4AI zQK)jSmA2!>eS(dPPFa>V*^o#zhnqs7iONF z2KG`5TdaY(I{8ONKEQtDq_ynP96vRHZN3hX!*w*X$>=bUIWI3EYi@rfPrgoa>Hp|* z!Ny8_^!qGb^b~FvvHTieR*;B<1t>H{WBZ>N;S0)8PF36b$4&_^a&+hPdUbnokj15g zmwy-Q{)Cyi$1`=eI0IRC>nmiuvBx(M0JeCz;N67^uY=Nk6Xp$7pj#M=oyvS~`);v# z#M@|2d#H&|5$4p0!4r+F5K}#~2|}5#WZ4*F_v$melzsEQePO6A1SSu-XD1O{F0(+K zpQmcnV!}^I*d?;hnaUxU1~)+<@}TA&`iuYz$?3yl6ElzXQMl@&@i3NkQp`iSJmo1A zyaSR1)5JWI4cKD``;S0)e>v_xS`cgpzV+C1u`ZV!) z-zY8^8V_gaVGXLoKc>^(M~YR79FwK8##v~|Iox3f zRjB;{s8+3kxnsm zy`7(YPST-8;DQ^Z`82SU=R~;Wp7gUT-cQPpw)6g(Leu2Zp3g$*m#|qFeb^tmzLJWC zyuX3E<)fZsK~-^1v(bCXp5IVSB5}_nbhxA;^X{^>MFIC3`-F#dEv4p%ZeOz{@dhz} zuOxVvy!GYD%v@xPnY85mFu_=P(uRQwtXKMT(*r@~)IM07dSf^-jgg+)us9JDyFM0| zJeB=d39H#q_~>X18}IE~-U95I`6+#}C{u(b)|z-YxTo|A z#zVzYm;n>kie|Z9MW5-?6>^YK*Ff&sKtR-HoiLLgO>GVA--?jC7@IR4fuO}OjtT3l z%D+2vAb@f}BrhduQ#7?5S0Juc%{Lb*>$bh?Vp{*HNuah2C$6HA$pV#C5fJk=Zz6vx zu{319l%HDG=XH!=IfDtz;ao>_GGM!h3016=l;-e_hVf~^;Z*2&MJ?(7vL=ar=tMR>B9w2AV%g4&P= zNY_Zn@@0xLq}c$RCS^bof5M^6>M{A)PH~|xL>!Gj_ zh@pFn$dF5QMltlmJVSP#*Y5n&f)9JGzyxp6!kUI#=aJzy^4POgUjBfdhKn%LLdLEM zVj>R%^MCo&UF^3>EF;T0oh81ShtcqnZnkMO^0Nn)R!8Nr2hd_)eb*j2+0fj-r}jDT zYY!E%KS7e{_(vLs@wS}=AbRU)uaA~ioI)_ETwx~a?>(#YsIA2493}TQ7?tviKBQ|V zN&WFq4IwTSs}7=|EfaW;UCpVjl&+GgW8QYsYn6)2jh)Wb8Oy^;FBwP%f0q;OMmkWG z@EfcTLT14%^tlJQCl{4$zk)>yqVmnruX(qg;LKOAgUTScE(U>4c3AKkuiv+ed*>4} zAU-?c+@T9Zm-xn(E6@YEU|5WJ5KxQK6g1zxC}M3Bn;F)lb8M$ORpm{TXWlKxt#gU| z8&THkTs2z_K6)p7u2H_hj_Ot|#gCqJpoCx62DgtA*WZQ}mql%#dF45Lyrw*v10aNN z7Y@+wTlT+FmF%N$unAF?B=ji3!}+M=$fjV@&GGL0AYFj9{$u}#DcG#l)!fd!V%FT( zWd4WdHputuiVkK@ZKa~r_K#iH>2LEnAA^|OF>j$iswxGltE9#SbYHS~^iaGeuBD>; zF`Cs?vb>DzE1@oeEwprWH`YLs{g+IYrm$2Lh-|&i$gjw^Y4^*;1@B=Lye8=}2KB&4 z(bJ%=IA58?o_Ka`I87tZ?Vh}Ie|p6pSNfzXzhBj94I%Yc;Li-_gP|~j4*zMF%ZYkp z{hxgMfH`O}tch&_vj|OViI64e}uSvLydB*H>mXy0#+Rpl@tFL=ICGY$A*?z2~+$k!I9IYcPR0u=)|U2kC70*8OMFfO6Xy5%2(LnX z_?5a0Hbd47IUYD-&c!4^S-vHse&@f_ULXf1sqX-);PI`d5xs~0!ukw3i4CBz@1|56 zV$AEFJ`hodvte5GQ=V;_GvCzw&@{MNHsC`RCR?)BiK|;%>o%wp!HvJomz^vSm{5@3 zEu8xs!X0p-2#k)njdNFmQgs1AQ$>zHt$5=}Z;U&~`IbCn@f_6U60=PtrvN4Jl#;Ja zo{!17qCA z;_Owa8_?DrxDSKVrWkz=yxb51N<~}O>%2qwecv{FIp~SAf}wMUOl$J99q&&7^{P>x z@X2V7b93}K8Jq<7Yvo=eYm}NkqbzMeRGg;wB37g-dA@i;} zMNocg@$*8nW-S7xIAAh6>rCF9prHC3~IFtYA(iyEsC{PwES9Jfmsedjsq%VdF+nQ zi_Qnc<7TvgjM8rBbYzXHiwqeUofU=PBbF)$z{knR!=yV@EXJS}bG6+y&EX7w>}6gX z7eZ@d7E^H1&JS@x!_4!OpuN2lk40AHIYLtl4Y@|W^54TMkv>MmD}70Cv7UzQ*`SuF z`-Gz3fB^s|+IqC((K`)V61{}TT@c1_*=?N4a5IeooB%wR{6jDaH!1-){Y)48$nxIV z?&J;)&2!Xvhaul&xhOoHk9}yJ-hwNv{5(G~a>o^BnI>cLTpXe)cEE z_9fo4;JWZsvkyXdycT2~giBIS1aD)FXNo8L)?`S7D&KKYZgI4O;wt(qs+8NDt{@Je zKKdtNFa=eZYw`NcBK?8g(Bn%Ie;%jP_OT%WK?|DBUa9nbGz#BA0&rec7P#3H5D(3` zOwo{VhjfN#L3I+_3yRaz)PaVzr!!KNnL5h`VZ`OenN_5c*1}@yQwI9`NQ>T{=~wm8 zc(txjG5HNl*Yb*;q5&_SL?*kv(j?m~WnJKzn=8_zIL91&G6(MVhl-WwaZ?_Zq#&K; zEP%hQ{biZv`h>ls$;BKxlN)Z$ON1e46ovAVtlyS1+@bQj!OAEC+8+O4Jac^7dIz7N zqU3Brm$u>GR*|}FTfFT>Y4+0SeRXcLV|3z=K&y0~ahQbNvU%Zpqq)18s zHf2a@~AxpMQ zIM>8Dria%w;wa^%6wHx){3>AM?hjh)z06p66t&;CGCuFlf(P2ezk%g&|KJ3*U#PBU zV2+?HtT$lI<)Kxp<0D&#=%h|^@aFlrabgZ)y6baZ2cu`>9JbWEoWx`u-44|L#_NPE zN5h3#4R*k^q=fEQVG0EnqeDyjCA#~0=0)G>^;A;KHto_2R`%P&~Lm_T;L5q^=ZyLt}ofn=XMYkMvpCf?mq5g33i`-YLe%~2R zI zY~-fjt#Y-@v{xC!FAG`DsG9}Q4?>ngRM!LC>)5RU)0;Ji{Lv#_XDJ_~&3*2|lze$2=*obJEo zjReun0B*PtcZ`Mhu72n3K##|DuF4Eavu{|(G(Q7XA5ZB*9wOWsH_*k*yaA=y znDt0eG;nn# zXIk2!3!$i6yBI5Lto=j@H2~;3TWTBhO#I5v!sQxe_8!*Iwqb)8X;A@aAsYshWK@IIv`}Fi)l(SkUpw`n;vf;183^s&(*yjf zy&T7HA;-w#8IW~6o56`yu*Vs<zp&(D#TuJ? zCnRj)x~vsJH2#la_QJS2j1DD{{jN_cc7iqE+|5d#FYB@S#dj9d=R+@@tBB?CT_+%! z{f76BG{4_C2Xfi+xkCWoZ3hw=39F&PXH9ExKakG7BPvr)Vqm!7;(cBe&1S5D>Z z1gZ;E}I3jd+}{rV)MiD(sCPcCW9 zE1!X>szNtN;b$dn81lvdaD^Xa8rn>_th6!q9Etu?TY8nuBFXVVP*_3p(`6hEk8dLi z!!Com{-%JR6i<-ajNh3jW_s4&OtX+mCbNRZtY!sWx%!S0NNXgnpI`ZFSthIrNj)HwnA->zGUkQFpEP)hxIGTTrI+doI~r9&$eMfk!Ua>j z^MZ-deBwM46j4cp+ktFJ0wk8Nzb!^CJN~iKC(gu>(l6E~`AjV&pAXKX9_&QBf#_Iq z-Cp$p#>;Lo#``i4?E3s>B0jyySn^Ps8!2%`e|PvQC-@0E2Vj`T8!Cj~?95-r8<+BR zN4+4f<3K;lNptv>hQTa0>EiBc;7OJ|CTJ(1pVdXFrvLp0Vd-y(JAeOOMBQ=I_A+U66(gnNWBw&otM+#nPMce=2=b%EUUT@8 z@hiaQX?^AxpVngAoy|4h3gX4y)wl;>U751*M+nzIbF6nwK1)h19C;IY&r5%&dU&M- zdf+_XH>Bt3Q_7-JTyj}9q#?BWkOxAct0Z*LCK3nW6TkbFjxzE0`xgwAPlXVE<%Rn=6c?dJZkbEZqk&4E2n zuj09QOGCYWmyU|P+KRFgAlU0+aB7Yk%m)X*L zHlf+MU^dMo?avwP&Ha zdG6BX;Z29`qn=Xu6LMqKuxn8B+k~1Q6grUrCt!Wa6ySJ-=VxAQ!R1O%_RX}ixNT+W zmtf=?Q&%9oj7&^G91 zdRbNYsG{5MkIYP9?Of%_j`}1&eSV3S;tX_j#5wY_LM9Nk8y3qF z-l+4V%8sKevLcv6{O0t)I`2WK#79C!)&_z>AM{i-DaRM)c5QgQpjLMgw{U?Rbb3Fd zmgi|A1Uj{6?2rW)2?6DGnBlUe-+!fcXqMuCgBxTG+3#px%H#AykkWI&#NiC?f#fh5 zcN}m@uS3whj&|Ck%h~~W`F`dv(IsO_M^1zdid_sGLLf$GQS_CDBjATkv|{|~OAh=6 zqyLF2;IwsnC*o}~b-&F@@^#Aoh_dY0wD+^xl=wX{UoKuV&_hRq>gDk}sGIXBD>Oei z8M9~y>G$HSVj2UT#!n@2KNZ2pRQF}gj7j-2s`%xH?CXM};8fs7wS6pZ z4>i?kNw-nIP-Aq0ncgNT84sYbEUlu}bi%Rsur15`YQ^iwZ&8@T!s)`Ud+xPN&m^4l zS!C>DWj6nw#VqOyoy=)z%&XGSD4^|~)F%nH1w0h?-8% zJ>+kidA_q53l5=)1Z8F0fIKz|n_j@_(7;b#!p0fPpV>|r^ zOes-`UDj)?e+x=c?lYDHJmjsq4OhOk`)P5GoKzsm`ed?0MUbjfC7s4R6FO>W=0hK~ zdq){~9}6qqPI_WHv@Z!OFXpvV#oimEa`)jOrICVCu2DLC3s{~h$}up+uzZUrq+3d( zPRoc*nA9kV#{+GA7|AMv6XrFNIt%ffHFzQ>O-FwWr?wQC{c^cO8%j2X7NdZe-jplX zSvsfglw^kQ1gUb+V5t_}{^)XFEEr1)!ymJ4Pu$6rF0oLvLYRM9>Xq3wF1aMXA}^{g zrc2-p%K-Hy;iTe%KGSZl^C~FGk-ypAyaFfn1-@r;shtjnPp?b{ZdkBjpy*>CPgcRQ zrJ#E>*esFVz*xbFfpZ*f5ac$C{S2+^vR%luWgm;wfDLhzU$lcY!20}YRYRDKjPXUS z?*oA`;zVG)G~0hVp2~)wCiY$dt^h7dEsRJl#353zi91il#9wYaDi}WOFxS&WCZIW~ zX){}O&m0Y`M`@-VMdDl5MukNwrvXVir^}=sc zzu|5C02#;q0B}3L2Eu~t*-YPy6*}V;K~Vt+Y);V{$KY8%;P(x zpCz)on#_4gkYX-3mMu7L_eXrEIpr$wTKeskwAZt4Q~b+YU%AD5YTGu!rcEQ!9a?N# z&RXa9{w&j~D;Jvq|8NgZGCGf?!|tgphGS0}Z(o!oo}F=3gLy){FeL}}c^!_=@?8H& zR9x@5xsG4E@*GZ_ZXGwIy`EfIG`(dwJ=drWD$$DVhg%mA$tWhMjUFDOs70Mc(bx{T zD|z&T!^(l}lrBeY;)|Yq&(R~?3agrtE{@1}4G5^=gR&wxHoB#8aj`rw;@L`)mgbFd zaHyr`YP$*{Ea%2&O?6r@jEOziS&=Z1qq!l#gGF`x!V`;%8qGIPpK} z7VbEgy~nA3AXGy-3%%1`8Pd*4wO!D7jJaK^n?$}oAw5S zttEV$#$8=sL@DhapVWvr;D>|5B^{{T9T3WTt#W-j!0BP;DRR37$xGEFUgB*8uJ^-n z$M@jDCv4&|yztM-VD>92W4-KzeM`rMDS83zUxG$zp8QzT{cN==$X*C?qGuzdqI#EP zOX(6N^|E$(d?B4rG1ZES@74#DutMVzR*sDK;+~$t-#@9`Z}WDW|2~)PXI|Xgem4G3 z*5`Bo^hMhJvM=y=|NJE}>N5xO-Fw~(E%$uVte~($t6ly-h3|@aQM&7v-=D4HzWUlO z?c#{t?A@>J=T;yN3wxmf3x3eRKdhiZb5?u&--Yifcu~5iXywn=C7*n=FKzFy`?i&S z?XoLC^hi_b*GC_(?s91P%kG2) zzuoYE{~4Ni_0RVHv0vK@UzFO50 zGw^38|6jj$(!D5kTI+^d8(w@Dn)Z4ubiMTJu+7yy4xjvWZ|Q>H-m)(~g_b*f>f-PA zjmyrVQkUK7+pPDLp86*3;rKW1WnX{medjL@eszDTS?K-?GV@btZQ-YG{y%-=<~mgB zcHr=K>qFtE&!k;^c_y;#>xiq`zdA(y_47vyexIZM_!Nqs`}C0iyKfE!4V4}WS>0|O zW_9Lb+Fs7Z`(-ps~DE0AYKK^ar`XmmO`Xs0Cv`#IJxSIBmdsR{P z^|hrte|K1^`}^QR_up9`K7+D1KlAhd^q+p^L#2NA4)3zA3_ly4c5x!wru^#|2c3<> zzRzu6F8JAU{tbb0uR@Oc$NuvudZ_g1lhs|;%~t2))AqiKKUMy9!r2Tvhl}-g|6Ay` zo9=}`X9gfA{D1xD3F=VkiRaIDThoWmrTjnY-UTkI>TMg|d-lwpf!WNA9A{vF;h+wR zI1DJDpnEt79^#;8XhZ{|qM3|{ifFcHhLd<`@DzD!L^L%kEGsOi89>8A8_i0MXfQJT zXF4jCmF0J@Jz(17|9PM1?fstj`~1bd_gZ@o%-Z{2>%P{#u4|>UonBIEOe$J)+fUAT z$b0N6`DIT&|64gfE;ckZ?h~s%?(|ZT=u>@qiOzJUv$If7}#{?%|n?PGVyOTI^k*z%;R`2HX{?HN3zM-}Y8O~CiqEl7!NNJ|;ns!thJJVZ3wkhMW)I=i8;JZaZd++%U$#|XGWb)@>yL+dD2UrCBx*lt;5FjG!7g4whKR| z#U(wqeRBFT&~-0=(?hhfb;cf@?Xx|1%9CEc+do{6c_}qLDrKUVD?iEKH7hoBO4j;T zeb&ZePtgm8nGHJA`37Z0(*E$}VRF^Bu*Z5D!_t?#@-v=uof%s`W#+zC{mlJpFVQQB zj~~`$ettN+BI(tfpGL^FUL$Ass7B8D+?D_2*RD^*_D*@?{Z{=GEw{WxA97|j>Lgz@ zR#zk)-LO1dZrT<;uctA5{um*DL4t5jZ1U7OpS9}eeEz1l=*!kw@91n_ywg;X^ltM{ zu;-mu#L^yBMDaEuf7x!~Q?U(GpZcLy|J0AgKB60jCz^GpFPr-+l3K1UA1!xm8~t2Q zFE{=^f47CPp^q(`+NNLl*fL*HhH=jM zYNq=0*DK#Xvhdkwa(?g)o^|`u=O0v#X`DA|adq{xiwj2Xym+Saont}u@4S8VwP%;C z_UpP_S>1JI(!1|n{BcR?Cw{?YU-^CW+m&}e#3OXof+f20k-K_CRZZhX_fUoWovL>|23EBW{1zCZq{KBA<$dPzyc$lX`dtKK^wRR7-RM_*t5 z`fC4c`Bl}|=BK`Y>EiVjO`rG&zxS2@jk53G{{|mjS}iClZ6CSk=BBFV-k|#C?;_t= zb!K%ye|=ST|AEw&f6cy8cHxtN;7eZx{PN!SEjRR|*Hl**t?3>4@~>yAKIjjs|KO*i zZ#;K>b>Q90Rn>Q|q<;9@#T#qyd=eP^+gE}2e*6Bzd$@|J7U&pmxEU8$Te!jX7M{9M zFIuDEhE!K`ho@Ox=Qs?~PDQY9mx4dO&nh;k%B!n&<)PtwT{5a$J%j68z20oBh*%Ru z&8@Dc7NoWLUUF2%b_NBH>k1OD?rRI=L{?V|mR2W+*AIE2x;-?wzI~|r=(_YZ!Jhl7 zt36*yJ27I;&6@1aVE;*&J2lNVGO%J^hIW1BRgdq!iR^jx!`Z?E8y6JkFXc+UI&eqm zPHh@}-d?t&@#T_L-q(B;X98x@2l{6h*KORr>GvC ze|g8HSAIAieKNH1NZgH-mfJ01*u(!6f=CYS;<-YRHr;;oBh9U&FRZ;AqBx}2Hl{?Z zIJ^F7?p*1K*h%W`XE!WJp6mO0)1Sj#yDzrBhVNI){j^nM6G*@e-BzTZhPz zDT$BD!V~eU~Y^tqQT8 z(**SP_+04m?}jgsCL7;qOgLurD{qV406?cLzR4Qb(FSdd?@T+kRKSOCwG>l5ol+Z-PZ8gSqW;eszhsKt{_e`r=sjHHG6eGT+5?ynMz6C#9 zrNFR!I2H$_DUzxwnM<)cO%bBsP+NO8*(^~O#7C+VH<^O=9aMdXuiyOG6E8OF=izYw zjO3|`S@VjQEi78Ha&BQ>@zcu|md(pA&Ra6Ka8yZN@q&3JqvkD{UsODI-m~+Tlq_4g zV9BWBc_qt>myF6QC@7w{Y}q5KM&&JD{HW@c3rh+|qyfY)cJGYdS=oh5uEk2|SNyVUT^+p3Ht^s$TbtpE z{N!G@J`L*j@XDS3>K*;9R`h))bOUiO>I~xVGe!N4jGn(r$@bFHD)2DmquIJ$ZL!Dj z@eRg=t!)M(0R5i50e!eX{Jpah3?t#l?~HFSj^70xkw`Ebcss@#Esx8bpK23M@E@yaHwQDMq@D2_t1wh!zOj#l5>&(nf95fk zt%yyqCQ;*L7DlfhX`wSDL_3^?oTM|9&a+NBgLa;sqcgGz_A?jg3?0#Kb}O(~$7C+< z#z>V^Yd6Hvl&`c&FY4!xM`y8@Mg8UR>{+6?pF4p)s~7i|Po$~4G-=)z%G8W&rIDcmr5 zq-dr7=mHawON+|*ab3LD-07lHOJ4#r-WBtgb!|^+MP=5;m&7J`v4-K; z4vmdp(t*9%Mkd?1bd=z(NhG6Jz&qWJ6_VD#^Fc(1$WMa1W3KS5^As5N79aUt7VCFD zQ1_SLsYh-Z!Wc%duURoY%rj;0)|6VWV)`X7;-yyvoq09dx?q(tjFVTxcpVVjb-u&r z&9}jKK5`#;=@ah^ylME&75D}T!Dan;SZ6Y~z{YPdB^IPo8$?_y(|QUMPOrXJtv{<*NHgPP1sX9`e&8&h^^bDZ zg#rKI$VyoMD8zcG39eWuu`HS~lX*1G6lg_@8~rRp-^Zt^WftQWJbavtp1c{0A17;4 zY>tv1XBZ*bw14vq-{Um%WN2IvV~nsqyM^)KG+o&YX2h0P$3f*jHJH!F#{K9aH%6M6 zU6@WkqVMrC#-~re$CD;@s(fnh$3u^SWC!9@Z8IBgVm;2A1@3U1U3&)^wp{1mG}pGUNMxpMmS8gH9b zUg=h?RWJe4`9c1jdGK~gxS;nw&t8Du9Uxtl=e!UA7xsEz(ECr1Obx!0)-FHvQb^b` z?GRB6QxV&Rd0$o#*;|d2HczBxYJ!Qc6(F@}89fDFJ+03zL@(8- z7%P{MQY!WdxU>WfmAvXgst#%~BMyDQCHZ3mPKC1{66SNFU=Yj?BBWZCPBYu?vS6=r zrb>s;vAZnVt4veb2;;Pd6SMm*Dvw1=y%SWn_Bp#!#MBt8_k!AWako^d0q{Ta9Ns_d z<;?Kb%VeWuy`Lp9yZ~GOrU?)4Oe8b23NZ0oCYexo9F$?eb-k1h5e~c9)y(q29V&T1}Pn)e`^gQ$-)klrKyq)ASO7A$JAq$(#WBO|@ zStyLruYxxqr*cdIrLAR3R~eOK2`DwJR=Rpql%FIhOJZrnHLe^S3i~7yx+bx#%B`9S zVul#oj2e~g+!%?=uM(GfH|&%}Uha-<*2gJ_qHbWCf`(1=HZ-zo!g1&}#(bPstN5ol zsB7%tp${Yr(FYv0Vi~<)LILLYn+Y!ncd@iiD6n&;o=NMaCY>qmr8p51JBJgY!opN0 zta*YDZZ)iDbF0Ol_$-iQK!Pv`$?5mXi3ia#Lf{# zbl44U5lYm(OvB5PcG!6f>%Uy8v+{k)@f^FA$1A`XVRA~5$)lN0@3+{E!gee|K{Qz? zyMcpV&8zh>*IeeqP1z|Cu|$*oaYuP}mS;N*$R@9N{VY$Oh=g7iA0~i^m@U?0m2QHc z1gMZEu0e(VY=J_!tXI29-dX!%+^tBy_bbIjw)tZ>t$u`>IdQlH^F9(x98{_q{;Tjh z*Q5831+1sc5(^gb0%bl2{R$2qr?B)blsOnW)D}uR^At8=E2VfG`qhh+cKa!MEY_sW z?ccLhv&L6yu|vNirD(Y5UEghrs2&0xY8tp8M#wO`;rX+E-Mpha!1r98L2H$!0Xmcg z`V}c{vgfJ@Ov|X%3{Db0N2onEbxk6V@M)s< z!xi(fZ|trZTZ&&&&Ve2TO(lIPtqu-63ccXO)S_y?X2lZED2h~FfToK`)g3r+Nc4&i z?~Cbk%QeT;$fXvH44||S%^5v9cYb<)YLV2xSzF?HN(Dfd zBS!RayK99uECLIR*R1j6MKXHfNq&YhFhy^Kahdb9D@Qt3@pH0*$s-aoIH+)|JQxa` z3~x?Ht2~ZD2SC!=QV78Ij$)iPBoftC^G=;0HC7{VbeYgVC_Sd=yM5xhm$9 z5aM98n)x_{=u1{JpM??!)6~q_P(u2+nh_5r(%^7@C{Z_0ZE^$84r-}dD|wkDRi)4p zoNfMyhL}EaJ{KOA2Xa2P4^{S)lEfp!pn3C_xKFl6RW8}p3<14X7u1G zcO>~*tA(d6m!_$7C!|-06g2R+)dtL+G;XSdnu&2TJ*+fOi$xBBf~(CP3U(|E3MTz( z5j~kpcwxNqWRo%OO;xIhjX!mSFz`J*d~F}ucqd3^N!$PfbL3`xrl-s@7tW0-q%E@m zt3dBTi@lgiW-ctiwxyD`bp_ZflgZ550&L%8Qgyfh3!Fll;BaUvsrsZq;fLjzrW^8IsX~O_~ry^j#~b%%8#KGf*){8$=YYtDwv&-fCt>b_bR|H;8Det)T4l zp~7!Y2exEU5K+Cmf>KD$$Q(qb5t$}rEEQA%j}aD6xiKZIS+U=9B#aYH;4P@@Ci9(dYaOw^8CUvN*v;61Hn;5`=R!vc(OBO~sNZnqfp!bB?4 zq_w-ce-<)jnpho~aHYLuyHHrA z5Pw-g9*R5Fanm90+*?j$GZ);ncs|6P>Qk6^=rCv8S$7J>9rIom$Z0eGyK(1q{~rG~ z;fiTzSHWurSR>VZI$;jhFv{BkWtHM!8qO5kA*_8L!#&f3w#3whBS~mUz5cg=bMTcIyZ^%h$MRD@`C-z-0cS(N!vP2X2?ZR}YG=T4 z1h4_;gDMnoQtn(Ga`_eh#+L(<){dK+i2_cR#|a2HlE^F+aL&3z!7d4df=NHlJ$bSx z1e}!ehTZ}@;d{Js?6Xpi_3Ipz0vD#B>r^ZtKHSiM}L-p^7p-P(eD%&s! zJ{y7`4nA#CQq2%DFiFS=9)tV9*z)Vj|!%)WuAEvQM@i6!L6++Kj za5)`9&$x*Ydh`%_hC-zAo(-WVFNlcU2vKGBVl}f9DwY&NEII@gE8vboXaTbb8Lb71 zT01hBkJ{vgMKqnDZ;U&EjgCD*AFYSR3Q1K59NaigFpq80cVp}ETx`8Q_y9anfO|GL z1X4MfG&~N4KhYB8Lo_RVh(|}E;pKA~pYpk80enQOfY5`>pjq=F7I{k0@SOG$h62!U z(hlBy%%^`YgTkA2B3TWv_=)NQbLxfyb4+c4`J=4`=C`;X(L9B8%u;Z*${`+5FiS_F z!lqhxD99Q|v_)Tk8`?JHKDdh@TJUh984D*Kc0B7-WLev6veY{JZ;n^~4&^Ys^LNKv zCPR+LM6-^U9>qGIVvN)AcyceTeZv=2zw4J&e*^sZUSJ*XG;%ys$it3DEJQwsj1ie? z>J)ZZ0*=>iqO_5KFH_u3{oV1#0lvLyqRd<1@)^-7Y+OPpQTQuV@FuC5?NXR5O#~EG z0hx$lP~j&#g)NyMN;K`Qr4+NELaRlFLB@=X1sVG!*6}Q#(l-)6#YWSgKGN|d_4;nf z%XqHjKAnZ;m<@%D&xS&?l+=R5Z9oGyc%T(|AP=ESVQI9@ zFFP9M_&UuCWHIh*;c0#CF8RJn76ffr$PC}Q(5%#{0P@)9Wukfh(HHax2bE7CaWvom zRho(LkbQ2Wg!aAy!#w!i=w-cgMd7;WCOo{@X&}#08V#ll3{D%v?uyGaNk z8G(I?Ay`zi)U97o?AC9FAL%l;lI;o^Aftw1n*j{b`N2@|Y#53Pn(0tb5G#k9Hm3nH za&=i3`YJ!e zVm#;hG1hS7W-iP;gv$!@Vdha=8K+ZzMUy%eGO=JJdjSJ&ry&Tw1Rk;oFjEs$Kmv>s zK!yPhB7vnEAW{fGq>>c?k*>n!@1bH8K%`^sP!S9eDGXtzqX3aQ05e5Fg&Ug6!#uzJ z3}7b8h73Ya)CFX^kbz16n;b}q`Sm?@$j{C@r5KblP-y;?M z4MQ!E_qoN$6_X^;C~yZSptuxk^DB#`ABIuYOPTDaV05`Z^N9TxLK{Yw$|2q4OXW0v zgtJKMIk|##r*iO*^#McRClr37KGvUc4=21B^Z9mlCN7;a4HfE-p+fAGDNrb24pdBc z|AgkzVL?YBD-_-dkjgzWb;K1*{tHGwi@|ANSh@TH7|vD#@};$SJRQg8Rp}(>C}aL_ z=2fk6{IX9+@k_0v_%&xBvzk0OY2d6B^^;GF9Gs^`p2P3wjZu>4CwO4r$?d%FxmP44RLi#M$unWefl=POS({=9O2m$PTUDutg*xT**w&#ZNN&s9ED| zBeTcZw#*r4dnRX`t*0`$fl$@W({2anfLYfx)TPd;_@ZF{4onn+OemP(XjoZsuZFk= zh$#gCm3K@Ko5jJ=gdSRfwRtpsIkmd^A)P z97S;r0M%ZoH~If(g%an{bU$BLSdHxkzLXU16Xn< z&|o$ztwZq*rDkLCx7o3(cZI^I4$rZCh37jUXY_%;f|OD@L%Q_=LEZZ9XgDTygX2Ym zuUXC~M}gx_n}!Ol$50`5+7u`hn9uNLxSs~ciwrvZu;Urt1;?v*8su}$V1mK0j@LT= zA2}Xg!!HxB<(J}X|K@lGA8~)>J(0t3@9&N`HlWXKSb&{3EZ}dBmmO~rX2<`{@j6P8 z;~65w$njLSS;yll{V8y~3-Pv*m*Q<(y5eombjKsd>qL&H+wnKYn;QT=SAfhs zFu`g_3?_o(4FSY-0uYw>n9#pF-c`U`?Ql6A0jlw#L|;Dus_&q}8vxaud>EF@$6p^EkB$mn(gNw>3Db(zl=Bn zkM+nS9nVk#4>w2bFyx3I?RYtg8~Sd=bv##bU7s(7;N%?X5ujQy2w@1q2oi=M1z1fS413vFpSNHUO8yViT+~A#`@Y zc>n}(l!S7Cxb+}+Y&Ci*i_+t&@a~GP*V;9!UztcsE-?7n(-{~w@ zHeF--Mc-}u8D+3z)brj1DqQ&|nj1@oLe`N#NtgHO8q_6pC6;kyF9bvN@&Wj!8 zpNmmeAwv5HmZAHD&T7Ci`4qnPjP0gtFe9@d~s;qPz`@lX--p zlRzsa)sbRfjx;iMf|N@<=Ec7xKACXvcWt|+kCspeXUTIWHa=8p`kf|#G=umWPga(0 zZW@*J`sA;-<6`2}SL$o?70*3cdDbmdbwORdTv1`&zV|#anR>qX0Dg&4kQka*Ca zIlx62S&zZGSt=p8n9Qy!UqZ`k(TwfcfrV#Cj}9z6tH?keT2S+)RYsK=eTttCFQ%|U zPbr21kT?h9`J|V*Ie8skH90*UUYm0=Ej$7lzP*BUXLiccEG~GL$Ek#EU0YlhEm7co zNA+B@^q`(AUw$fUry_>$&S)iI3LJ2Ip^bFc%^u#@gYLNiMrH%!+X2SUqUSb1{&$u} zJd)SUc=kuQMl{+vR0JB~b5z2zq>*;s5%VkafFbWwptF)bo-kpKu=851-VVbY+Yhl# zu!`0SNhio(MfAb1@abZZyW+$TK`@{ z6eH}yGtB%H4Fw^$)Z%enlV#U}x7e!;Kti$e*MI{V^l;ku*QtZQrbE#JnO}#5;jr(P z2Yi&lck6}TtrS-$B{E` zOP-vx3I9Bv`^xUQ^mnFQS6joX>Nk=;vVR=h;%Pp`<3@`k$vpce{Un@;7H5%j?VIpa zoXJtq-%1v0$(zy*n!_5jlB)=2P6mB}xm}5r8czmYP`LHMiRZcTi)pS9j~4Zi&uCx3 zWiWhMHQ4T?X56oLu7y003l?ID-i(c_=*2p`mNHLpbye~{mlDQDuG9P5d4kT!CcS2} zRh~reg176}H)J*AqtcOqeJ*R6m^=E-a!ep9Q*aLQGpHOD_+WuQYO6J&FyGF>1tN@_ zv3H$b$W@HROv0IXL}~s7Mq#YLe5>ks*?p(XUcOc4ifqRz#%p@ojYfQkl52}CAJxgp zCSQXID^~#De5vr5WV>c0d~-ee=Jv!<8|GyS{gb;4qsr%Lg&`zg+OCimHp&EtBqb8P z@LhVlb<_r_JeM-)y?5e%jT&2AdxYIE(w@j4@}5cfhDrE!lEV;TF+>d9HEE|+!Tma^ zzcr#^UL*YGe$MEF^DOY2t9*=F^TqiN*F^daOyP5_H7fuE9)@l!A1k(wmS2VUAQ7dO z!KDptX9F-n9+oI&Y&=B?-r@BFdX_-hb-9k7WjmbQWPCz(Fwgc#p#)3mSrARISJj1+MQ+C^wKN;-NyXL}Gco z5aaK~bBv_U)z{)*2r-U3&J)Ep69)ynb|r-hopzxH1Hw`t@*=CZD{@&b7^rs+ahYC;8m}{N_!?KCL z#)hGob8Hys-bVGvgZIYVsU#Nluv zN^tHz0cyT%m&P<{kQ_Dc6U@yJ9Xvi?TcQwYHmPUHB|#lLP&jykIBj> zn2b(pp&6zVfrU|mdIjIfF0{Y|V!90$yd4NG(#tV>yq4x20FS1RIjs1QSyYX_N9~ z7K3L2=AX)OD0s3aOKp_5lk$}^K=}$rl&=vQiluy=M3gVrEw7G!fbw0Od>J(t-y#IHeC#zK)c4>%<6bDP0id zE0>c|?ZQ&N3OE^N7boQl1TBcb6|f|67(6VN@^uX#o)1GWOZn;vD9%S0Sjv|}GrRy@ zK$I^$a7F&`Nt6gOBr02Bv>?|SnC6X@7vS`cDoprt_NVq?fN8D-wR6HRMcG_jv4&NG zHzn(Tp-K!KEG{|RVZzeGgb91Y9R}_uT9|;3a&UN?vV{qGqZ|g_CY>@Yzh=KE~hIK5N!WOX|C@3N=SPIMUJ)Rd+nkQi$;A{tGUl0}S0 zmSCe62$+)?9U(ZlJvqv1;mKgP<#nNKL>yGQ1LMBK!dt&Wg-yUum+I9;4mF1S3}W!5(CE{SE#HZYIB zn6nL4BD3qAQww+7f0<0D!>lNw|M1rq;fkaI{$F4jQEKPe_YUy?#4UT{9fn)BEu1DS z!NKXb?F?-)0}-&voB%6fIgNqEdY;c#!5&?34F@PXX2BkFFrw%rs2Wn&o72S9zj}g) zpCj7Jn$v3fEtUY4A^4@b5b?6!yiM=lN-8=hK4G0$fK}Zy;c_~el;rVb^mLT)dmJVt zb2MaQDf9yxCLzGyu{aOa-jMKn5)yv%p_?3n`@e^ZQ8|$CD}jp3aDSK&B>bL&gkPzK z)ZK;(H#sEymO{dBtp<{N7G&Cy=|H9v8JmVp_^qg4xy~h5F|1~$bInTwi@~t;rNLR& z(!{fVUvNifd!&RrGkxZPgOh)AxX-P`;A2}C{3YbV@?ge?l6?|3*~fl5`>fw@+|hj= zDJlUX?I0%vf)n*I%N{|n);zMzcnCpIW>zmJnh~zyWnex|2&%JsoJ?^-P}@4zO>!j2 zaV!-K@|h>isL)tZfxTBn`z+IcWyv|GN_9swzI88!1TE7>j*MY=uR((O7%XXY)lgdf zNM~Nq4(I=XLpf>Eja5Dmb0{?*_qqLKc$h<3Dr?Dm`aurm9iIm{lyQ}7!%oHkAm`q8 zQ`2p{d-YH3qUOW2YSARL#%MRZZ1rfJlm*!@&QYsJ$0V57L2CsS1{iSDcD}Xl8+tK3 z0~m0w1f3_J?Tr!agwa_F1AFz`lXw2=cJja~!8=)gzqz#!tLR6B;$#dk79TKH?NY7l z0ZGV%CCA7Rl0?W(nUQ~F@3^$k-P%TOfHG%1KBF5-x*=!)ox z)5@-plAAC2S=ts9U>h4@!M}YHX!eI=5RdsyP7N{J7%(GiQi?@Q;xS)x2=ce4BVoI&w^i9SKV3kIfTBPuAW=i@S zFqC0z*%#9w$~BEEn~wQ3igGRE%C>NQX6me%PrC>a2-l{BO$!GoNx;2<(4c~Wlpsy}3b5l-Nr%1wdwDYHI9hb; zAj(#Noi=a5qY20lL<3tH?~IjM#`G1yS_>>geyK&qf{engKrs@_kxVLkLfFF_)sXf$ z^wEK?3I|U%zmOTyVy$#={HC`_5;;5u*WhTj!_k zAuaeu2Pb+umrXCSy>zhKa#+gR{)U+LA?TU@nFb?zlVY2r{PF25DN{Q%-ntEuGRw5u zec3fbM+9L(AK;S9euIbO_1hga*mcX$1pGyZf!K6mXhI&Ga5p)ICRpKww@ENOA!wJQ za_Mx>lF8i67g40bSejSyqI_6@CLO!#*i`YfSB8?RYWQNy=KwWn41*|slsjTrZ@av1 zH*^au2*Syn$$P$72wg@57p&W^96}c?D9+@r+j9Y3K#{v=+rJL&Nq2)>-N4T#aR;_Z z)PW-3K6LYRfl0z?FAH0CSc=y!6g|*T(S6}{fp)-4;{8My2 zOd6?b$GBF@xf_a7;}Bvl1!@=+?qMecp@7QyK;##LwdeW#zlBzikXsW8CdCB^>TBEYXfD zxB>SME=-PAC#J5PpRPs{=2*Fro3acYOc4 zQ2gM9cOST5c<@5gC53{-FqlqZPm=Hbc5IY!^>e;ZfPZ-k4D%PDc~%Ci8S#d?zw&GU zRx?t&s>UKeAgB!EMAZdL4hXVgUNtan;*WcQl$3?{3>1w6N3l~c0`ipqL@(m@Z?z)t zowB?Br4@;lX+bNJyuH?`72&FEgDE|!ZXji6rQ!!tb|zB$|E5+%^RQOL@~~C}@^BAo zMIie82d&6m!+=%!`OY5HGjMNaG>K`UZ^SSz9#(26ji5OHcn8Usob|I1nt z+Zf5ZJO6*yitKu%R>c0;ztM^?kJO6fV8cuCU45(kb1+h;ms)rQn2)E@#}} zk&JLAFGK5=t-ct|G2TC8D4+yXDqJSF^62kTq{VBVPav#!E zX+E~QjNAvBszF|L?82w}1J-68aWU264eP+{a;dGwlS@Fcp#<$m5@|{+z~<)H;-RpF zg=UX%Ff({LaAz}tOl!FUC^lF|?*`-=b`0i^hz0bvN20OM(V*Mx@>@0#>SVCA~2@2LW#k7;B5<1ho1Qd%<{K&p_* z${CoV{>pc(!b_7P+W;B^#TKnxi;;2w&HXaRl^MUb^H%KZ0Nsq%4j)9UELam9__Sqt zf8~c(;h&RgS=k4gL9#j!G=p>k+OAFA%s7;yvG^ay-0X(0tsZ5mSrS6pWLfFpI*CcyvNi~VA9%K(Tsm8zqqCWR)HpASto+YTYuuG}u zrzWEeb4xf^#p*-69b%A#(4=KNNI@99Ia!s7D=kw{fx7_;8uCgUHgZUVc2g)KRyY|Z ziB(Im_5Q%@Uy%kZN)U-$t}4L1Qb-39jQpQoL_M-O_e5$b9vC(ShiMQa)J`rE3~g3y z_1urKQ@saSUZiq>h@+iqLwV(EQ|)Rh@*Vj zbWas9c6U3t%cpw+DSo=;2aK%r;}mmX)ig)|GXTjrlwy$jqvV6&tPB+d{;asnwosrD zBf1HA&x>(tHDA;NtMt`dD7z~C-!ORHc}@l|mpu$Jc(n=(HUZeYckYx^b^@3rPh@vs zxu6><-3DA;#OCz`YDw`tV6PzE$cs?XHKzlc4{Tm3xe%FWka-rFB4m~Z5espaCApKjr?bA#3Q^OYdIeRNGcu}Wy5+FOL6g7o4+Yflcj)p1+ z^hf8x$YC{kMf+nIuUu?aO+F%Y!9WZu(7`Utu3ckq^j98hMfAzsQ@jP3kHc$^{fQa_ z{C(c@6~oK753KUfV%J5EhoUtC{Zy7X`ED{=KFOOZ#GTR!W85uu>Vzwn`q!6W!uP?~ zu1z5uJ4S*a36vwq*N~#*A5bQl7rQ;4tj+)q6Nr(ltU`}-`<&kr;lq4MOKw?GQP3<9 zXl24Pa#A&m<7_tZO&`XgZZ6P*rMH({g+cHdCHvbKOE2|ESomKV2}(7 zPLxiLLt|7+Pp88WHDfD>b+~IUbzA0_;ydpPFq}^@`LUw9D8!)Lup`H8a|vEdm`vfR9zC&fW)K`iOD38m?-|8#AF?Zm6#CD z!=S_jC20adZn6gCCJr0|;>hp<>Pa} zOo#!giL*-$2Tg`wE>l#~4OGce=v2;wQ;@}}`^+y>Qb^!3ZQimN<^(HB84k&J5Tzg?3W7=3;QSw?O%pS2)Q*1`CRwjubt|oU zIBi;(&|41UOcdl0i0N6M@DC zLKHOU2;kfq;Aq6ibsc00{TF%KyR_zC?18z=^M4~x`cS}OYZLyNv2-&a1Xdo*0wklp zTWi2`wFW)wR-jx`v3x$zr#CY^;$a!2fkLG12uT}_7$9m&0tDuW*fxw+LRtfO(%89f zM2o?VNH_$?lWqivAv;uvBD7E7>{#uHE9JJ#uBy~ib{d&XF#ospkc%U2@25vvgz1r) zN0dN;hDZj3VfmX{3popc%&>zu79Uy1vI6UC+`DEXAit7?Q^>k(9)!A*ue0(uupVv!qVY#m&oe-ll0gEvV%Kwy zQ~l(dAclIA8iZe^vOc$kGEn!+lv8kay!%aU^XpPugk9?U@5?EQH_bQ4oS(jvI;~%@g4G5(|iRHyA_!_Fx3};PALp>>RG&FLIKp9C`A^47bg}& zhh6~ELx5a~;^Mb(E{5|7z`QKo2t>=rC#jh)fnzxxn3rk5yi}}&iX5O?7C#e8bi7?l zX%9d}UL!I#WE{vyQo*QF)h2J4pL|M-r-HU6?Ne4-0AdPNBaG!v2UPg>x!r_EcvGf) zBqo~3C|Ol6nnEcC0h$xnt++32!9mypiWlBQ z5VqtE2wSQ_*kT$Kwj3;Exf|9O^~i(UbDhGLG8rpu>7DmKDs0*CC}B(5ql7Jv!~ap( z(qx_mRLYse!&uGwI$1`%$_iZUNZ?`z?|T~520Ay-3K%gZUt$@GFAVG- z{Luuv{@p@xkmKD_SF?fi6DX|M1Vg_ELb9JNC7)hAZg$X=V3WOxtG{$)18M!J1O%Q zr?9mzQ@vb9m^;??Dm~UBq{n7%<*+M4HqgRs1ue|h#e)ph4iLd)f(Rz_A}~~0h+%(A z-|YYejN?sxehQ$P!Ho!-%!}daI#n=rpn@sXX)ckat(V9e4$MOvpJj$OJ!@8GtC;;3 zP{U9$+=2o1%PLm=lDDb3v$poXrhci1SPP>X<2($iU(nE2H5@h?042;C5DPn80nVX4 zEZzY0)&NQv6DVQm*Abk9jW2r7LB*4B2L*7hO@WLS88b3=wl1PTF$y5n`}%+b@8P-T z_ncApAu!kam;B}YSU_aZ7Y9@@&c1l?0sYH!_t6{zb*#KGqV5|Y0Dl7n;BV+GHmd>2 ziobB3^LIGlcN{BX$H_n4SX4*HT0D|tGueeUDX3wTpoU?&nH?8d|1>^or4HYip1$bY0bR(wm}IMjnZoa8W{)OR_cA!l$pRz60AbjOV!>76)lE$C#tsT}NMJYQk8c!ma8|TrlM^B$V0Pj)XGGDN|8lUjr00s|fRPwu)HHmkF{NGur*)UBG;8 z`-zsz`-udX14PTP0|@h_jYF7kzRSayPkRpFo(>rX%>Ql7cWa#O{qy52!t>+qV~7Va zU-b%eOy_dOr*ruuF<~+hP#T zn90uZ(cqZYW~8c7b|O^`)4l-;8uC_-YUJ66VIQX%U|+D)fHNA9s-}KWRrB#*s+#{} zuurprU$(89U#hR>55PW-AILyFKnCI=9)x}4L0l6K;+pV)LD*-BxB2CRvL-+N{ws6B zzFn)#F?Lp619}<+`?7Ci8HKl5*vE+xJGil+U_h|%E~sn(_6?|NAo{9)WMNK$iFr{FS(pdis zM3{e&*;q5twmNqr{qPQ8rsrX@vzB={xsiE~F1qjs_TVO9--sn)&e;HLD{)0yHc|PT z4$;Cg<%kycVPK!v_s$0Y2@PgYgC|0RCuXA5qWK;)_#WY;qSoIvvXi5oVm7C{$VZyvoozK&JR3_RjOVKdldxm_PMoI|h5O!q1bHD?s1V z_6F#CdOVT7r+ER=_c&O6Ps0iY=zD^?LEi(nvj6fF80JSH?m;TcJqU(cr2iOX4yZ>C zY&%&6+g7TT=3tQe{LgT_|69CnQ_3J`+xHVKWeC5|*`7@nNDA(Awm()Yjf(Yyob7qr z^)l}4gCv9z2HW%3W zkYtbyp>InL(5@<(!wSldXs#{3J#1^@H1c_*>~O)O#d_BRiY=Nzh(;O>_H|N2YnZJ- z=L#QHxx&rmBg~19k^4*2_)T3yN(W!bT>Omy6%XNJJThF&`=%k^9|U+LAnaf{b%@fqOx{Q~0Rn*ho!A!wf$oQg_7D~bB2F{f})0}F{ zlA~~O1xCP5+BhLqMZ!C8PfA2ncbOcCO6uU1!fJgCcC7SHOBdM9lN%3*+RL%m5A}k1ulMjYs62?wvB%PX;C`3^D|8m#wY^XD zkhzSX(-{nRAXXBi``nz)pnnchdU~Jgsy&_--gkPRtySHjR-PAjwuM~MFVAy z5`xfo6e!H!1(jhBRP2We@6oVj&v5`QKN=|eNvPNf6-(?2qG=t-Ievx;Ee1QlY8A-P z$Y_yaMC{HfbsjB0q&f_NSq-q4kpiZqfR)j~xk&C<*Ubzo#dj$4A%ARx2|SQL(ZRXL z;*^x4YL8|`y65qM%%}p9v=Nwae!8iq+dRBfzej1%pyj@K;Dqc(SATK5pFHa~3CIf; z-qB#RX54-zmpTA*a0V6ymaim+aG8?h0)nc!@zFd zc+paXjXj;zaQb3~@dEb6Q@z z-Jz9G$5f(eR!_^^2TN-!rm;K9`mhYaWne`Hw zg*$g$ajDcu)6k+JwxWN;2Ug*oNlwK@=J>LtK09ykKBwZs=HFs1ad1963yKTHa);sk z*+IpHWjR8!mhnh&Q77KROkfok4dOkG6CT_Yb?4&L8^`_kKgBkvl#Nr@xhOhaWLtOG z0|l)MTVJ5Gb0?^o)4z6LQ=oOVaBhYDi$WoAL4#pe5IwlJ9MU#0kV;jI9CmPj3Ua}r z#GPqs=7piKybepF(n84V+8`UeolSLXUM4 zYOqcHWI(I1G_4k`WuRW#3Xq@GRGQJcij)ubUdoyn7x36Gx!6Sg}nrJP7Gx z74uy?RLLoO+^9%KBe!4&K659e2SMrLC()WvR6X3Ael;4pg#f}ydnxMThUHY-TBr0Yo3GD;I~&wwgRw?MEvCs=t~+)`T#$; zWu+~>RhMM{5{I1&xk)yH2>*OW!q>86c$e(Rz|UPccA?4pBn?Es3+E&k1Lss)7APQ^bKaMj+`sR$sC;cT`UP))WBoRy zU)suR^zR$E{HMQT#(9b}`LqY(JjeIwh#|1m5Rt`A1|oPbu1E$Vxbsk4F{Q@~?>alZ zEOBZNk1xk(lyRo@@Lc4PGs;@wL@3XjQD%6o$1QfhvU#h(K6MOir;Bk8&X`8o)59W} z_=pEe!BeGfTvgv+};1o;N06SBhpIoA}n3 zyFLroqXn*}@t*O%+<_kIse`!gQ6@cRQ7PCR(wk7J-U&r@I+qCO95 z&N*-na}EV)eX&21C7h9D;`fqvTaDEgm#m@MtF2jNq=1|=ku*yBJ(hYNm3r<@l2?Y4 zlfIX9Xx3W+(Urn=-!%66|HIy!hc$I|ZR6);hKx*x*#r@AVsZc!FacB?DrmK!1&oM_ z6Go&;v1$fna14%U(FV0GwN}w$#XevYKpThJpjK&%8kH)x4zWe0YVEi7KEX2d>p#Ei z*XO;y>wT^#tI6h^lepK~_g;JNweD3eIp!*{B`2@R5OLN}IqtpxFW+}9_8-45NBGa* zmm}={eWRX<#%p}x2e_fUYacfTyBxk6|C?8L`VH_;rSj}!aM6d?+4dc)t=D<>g&Lp9 zZlY|4%Dj)9WoKKK_3kJQ5WKx3Q}%U?H^c2`4ugz8L%{zDSUAK_3Sv!qCfd@lPJKC& zG4zjgq9c+19PMkxxPcvs^hf61aZUavR{3@WE9p0pSK&tEw%ELWvMqO{2Fv)bW#?XJ z+{;19gN`4<)5+E9vT06>E7u&9#t#C1Pf>cEJU z=X+F=(X53s50!`|i6c3qh!~zK#etnWidbH)-XnuNSW?_Xrl|~`bPv})Zs$W7`D0n) zDz*0!b}mVuYfqHc&z9-#c_G{h#xgBRbZp0b6*RC50Vp*mpLo9a}^lImwBk z$r^80Uco)@x_LPvnWK3;v@|qK3>87M;Ol$dw7l$)T*yEftb!!g#844!FPp{Cd|9a5 zo5tH~OMsXH&9fQ|GL+D=t}lIDYhiiGep~KCT4<5RfgXzzVh(QSX*9H0TZY8Xed%MN z8phgy;Czq$Bcv8c8RgJA7)f^W4$ZMGvUlXbd@10ySI!6FRWqfB7f=pW&Za zkNGDsON4QbWPglV&IoLV!E+pTwp8-}<)8TfgMVT}tR?P^gZUExoHxX_HoQ?~duxrG zSkpkYwl_>{V4%&79ae_7qhU}~x&KQ>n$F;$DEBX7rs)k1v&#LqGSeyz4s*)=^~~$4 zUTf=;iwq~~k`2s>upY0in+|W92UIar%nh}5Zv&M?^MD4#D^W>G1$M{<%T=On200tY zj4Ffi2@Av|G`qIY%3Lk96xU{&r)v|fIf)DV5V~08j5N66O^K~Wd=BHv!Q2{hV4PZz3U<0#0z4iui-iU56&>5%^WAiE^N-pitOdcg^}}@5>`tT{O`)xS5q3;@ zyUX92LxVdJc0Ac`bYpzZfJk~mAaiGktBoHiR36ufO)7fiOnw_<80_;tm1VNjLWUzx z&4{he=e2DOHFHx!n+C9IVhm2{p=PIyQ1cb<$Vs~CE80iP-G@mSJ`i?Zq~NIby&@ni z9g}%UIjsJwHxoXC4f+DRSbxqXbSam-~)eAk4FHNoE1W>Q>NT zQRO=h?FeSOF${1j5AQw|5%KLP1jPBc3|2WNM?F&jfxXIWG&emE5yJO!GnBFVifyo~ z63Sbznxz0@j9E%_jYLO>2M&pWw1oX~sPM@Axw4IFlE*>x%a(wJ*b-H?vx*Dhzhb3TRjJ0!2C7ZyGhwsrEKEkGfZ8NV;M_tS;pqZJDCVQM=+g4nf9UlK5*D zqJs{}d_toza3$^>V?uS@NQZzUy`H-rghk3?W3Lx(m80xS-jE*c!zyxDNnEY8VpdFW zuh7N>#`v03t67U1qZ)uUsEDO3vAMf@vAe6}N7wTeV`x_c#K0(?R|I4&Qn zlLM~BRy3rjGK0mtW2+dc`I$0!QyrJu7MH5SWN%B0N)78A`9A|O3heRhjx{%==`$6u zdkqQvt)931UZw*xG%%2a29LQb8t&j8=-vXm*^ueqiZ+WHBN`G)3*KJO!cD^qMe8mX zaW8gUKHKP?qjtAFiZ&?icHl%HHi54xIs;tmLxGjVITf~&-hsr6m5$0a(xiawHGPue zv*o0i2Q@jwo+`0>JTQeyNPmVh!S~se>;%7x6TtQMHOo) z%|?%SVz1mI-Y|Q&zK{*qC_v1SftW7=kwvf_br4QiDU9NUS!vDY{{&PUG~D276*>Y@ zuWsdA)M8cPp6y1aXNu0q^q@%DEpcrHZ3gbe*u%Fi8et%ZUTx5F?W>7sE3Mu9+wf`v zaseQP4(b&IC^o92MN9a1TxsPgTAo=6JLxVj(3ZKzvxIvA*ybD}Z;qiV?5tuWh@3{L zafKakNT&CW8F`wKMh|v_fu#mgjwWGf@m0$hD!uigw0+-%mZ6+2Jj|0OBy)r}d(TZj zY}}b6aPY~@K1}Y)5lDUJZ9XjD)uC6%nOj!!FXr3ysyDsgzCiD1Q%3rz7T*kdSh-EF zfs_4xJ*w=w=yiQ-@mbdL7(_m_@q%>W{)Fkn3{E(OI7d*@M^F2l`~VymC|$Ue zC;ut+P02fpd6pbM2nXF|B4YM16y<)QO1b~sfb4=kbK|pFq?n^5NwI5Z)h7C~r)DR1 zQ|)(slm1q<^Zrq_iQ=gBQ?0bO8oR2t24V$(Xk~48)hcGR6{H!td84|jR+VCfcRSrl^zBFu^TpvhcQ)3>V&&lCHvEq~sWNq33X2p+0(R zAwv?qzmTDis)Bb>4TX%95v7Hek!6Jp#mIw&3`=wkyo){$@1mLuF|XpQ(LyfNqFUG% z$VI%0T#8pwIXo}+2MAx@_wgd7ngv0OAaLNg%BxnMWu={H{4E*{mq=>NNETZ)HH~!G zdgVeKCP7DIM?<^g`kXcGwqm1H)EsUi_~Mrv(&RWVQPdk)kSv;CjZS7NFOgVj&3|Ic zOH419s2)m37p`m%kN<$8Z&|^)IPZgKfq5>K2kyN$r}^tm^e1O*9E-ANqL1k#tLY;% z-Sd1%w%-aV+ix|z_QC68DN2dOd9kF)eV-4>@hJB}xHCW9J$wFMc-?Z>94_hasQP>f zh~ty`J1Q5~xo0n?d1#K@gqCAQ5GTq()T-fcIX)hm&qD^ll@1{O^BCH{Y6NlnNPmn$ zMbfB+tE`&eyBexoaF72&E55&}yP?X~x3L`Sxbg8_4OOwms&Tp4-B53?(XA4Ip_2QN zp+W|v%P^d~H+(a~pz1!6@=cVXws8_#`%s38t1o)*EqG~K|1{IqeRTz|TGzLAe7aR2 zv)j-ffOlz(v6v7?qmZ!P^MV4(_a;0O4fh=vhu^W6~6H-w^@B6BuA{yvL2 zVao6sLq9qqGE2lK;Jfh+q4);ZYY-lu50T#q-oWLX=Sy!&!4rdTHnUGsWT%P2*)^U> z`v4t+N0l_ko{8EanFDje+ivkhUWSAmlbXHNulh5XDL#hQnK}>|DvCMOsAec!Yt#&h zTeX^DajSxB+$$;O(5GXCzx1uq@94%HIyo;k;wJN_{oR>E75!?ByREe47rQctR`}QG z_w-;6HTk#HAm-4-M~FGJG9ix{kJ63|AL9VkI{O6404nY1Xr0rAag!`4dOEmJ1M>jn z86SA0KiB~lG5tTgKSJ_phrO3f{`7_5{DBokCDRAI6rAqgL05DwcI%Y4A1^n*m4Q`I zlz~)WHenT%U=>KQ3evC&)K~@2#Ykr@K}cs6Gtdo|K5qe^ck&rxSO%QsBs;3sOgm#> zZZ9h_xvejIY;t43F&1!$DTv7m37HFXcnrZFl`ZPaPSuoxDzat+ook7jk@C)&sk6ZBQAI}{N}JD}J{zSx zLeZLvV7ew}gcm#{H%fzAb^xZg?%?Ues{qsIS$6; zNNBP|LlZ`QMYJA4KS2C`;L2^EAp9+)#_)AlOqb2i)9$>4pnd+K5X%F};l^e}ORlN;JZB>&`TX`6$7veJH|o+LC&wvv1&BbA7Xwk@F^%YffQ$ z%%E$(Mh747u<=Q6hSdtsq9V?~?ctq%`O2b4+NHmEYc4l!ctp=0FGU2pgad&4M|ZNm zxRb?kU*JRT=<}|0N1ylLwHjV~JAr$ydyWrT;l31u`>YuE>{;3H+Uu_QwA|lOb*Kcy z5w*XgG7~UA^P;=v&|}nc6GT-bh~q~1+ad(|azOK{5D>?uAii_}QA<+bo*NN0@VZr# zd#Q`*8o#;6|Ghxm@_u*ICGNMeO6s|B6T6zO!t4CUjCEr4`jN=KauGg&)stw zQix(QPGHlm7!gT6qDUn{AIUPg$DGcpvNmwoDo#}|oEP#ceeIXAW zAMbWWb3teb!j&obhN1>^gJR0^P?hc)6Qy!a`OcZLu zOi^~im1l9;!oJT^y5I_8i2gfV0q_4GaK$t-YT+}h=2}JD)42!l#TMjh57Pew$qR#BeJLt(!$Gr{W3laST7e2{i? zHL`k(QHIN~vgwg>9>iDzVFN7$a<)PtXA4zg<^0+Y<-}OUC{dqB@RaE3^bosnU*A^O6eQeQeXE^aNyrA>bwC4np@+6)@a zv|=nGcMfK#j+-|^Ji?%A2tR1z?vs)xvDFm<@@geXs)Cdd_v~W|_w0Pi_ZEv(cPrf; zRd+1zj!HH0OkdFaxqJ3k7I)19D>UDicsQzlN%U}3Ze3t1iCxG!t6dmRoQ_=-Pt?(~ z;)#>>S@DJs>5DkmQPU5o=?XLv7qyGyi3_p0@v`X<01`-#n&1Z{wSG_uLj%!Qux`ca z;g;F@u+|Ky&7Gm|4%eJ-WQ$$T5kao!WZ%B9KwSpNae%5I7TPiB++(~pC~#?^z4pZQ zstDF`p2*t;u;u2MHGnN-3M+3^D$a^6{RW$_VHiD98b+C~rkQ7DT(_BT(M4>&ddhs? z1@rx>!+d{WZi+X2VtU*3Nl}XFllWBAC!DlSBmC*8ov?am?L;*2o*P=%cy4Hem#RRK zd9auvnO9NFu*}sfn=TmwbT?d^z*BW8Hxo}#f-8|r3IFGmr;`$HJyhW z7n1cntM6eTyKC3K*Qj!MyM`^RJJ@;E}7TE2sL7UTR}UN4{PskgjRTvb#MTlbWNzDGXZ_!ThrQd>9Z=my^w8Qg5yQ~G^`h9|Y?fuBt)`Jsx z#V$`NA%SN@0=NZ4|GBJ160(A|P(mWc4Jd|H`6l10d6VDO{Wc$h^tl6&K6gOfecCjn z(QC;hdJU08uidESMpq+yMh1@Z5#iOt33t6p6sIC^&P+n!ymf&-sbT?26r*jW62;zv zEsm67RHB&jdm^C-viPtot~!Q-!#Phd13)}5065m-jTjzj9*+Aozzg?j{zj~d;Z&dQ zq*T#Lsp2O}71@+3!YNgF;@jHG76MA^K{V|Lfl>PGzlhRrg_-MrfXv1phIJhv#`}QM z*8ruj^%x+u>wGAE2|?Ij@w=h)I4Ey5F097@k-kH3*@y;+8R%JH3G}5pjrjnXw9|3#Em z71E>5uZG$qtGl7JZizmuRH+h|Dtn-G=55*HT%eE6z1a<=J%DiBL-02!?IjRx?FA@3 z^Fxf%LU!ILSDeSzejB5-Y%4voe5(zmCkw2MDFR!$_wWJ8$smHTlX1hIBUw4X=4AX2 zKg)D z8KDU%e}<&!FF=X83)l#!564ERx<@3G-lL3A@ew`J_>s*BeZIj)xC|R%%yBTnW}6WL zN=LH8z05hUQM#&H)UdPzrGsy4BH30?#*~v78r*MSlrCP3QMxV+qqM~Xqx3UA^6Six zFf^E!V`#YiAAH-bYxuU&gS-Hx13^RwffybP;@?E+CP7=}3Fz+=g03j7`w{X~uaaq% zS9_qetcG5zuA)V3-B^#k0k70Yn9#!=n6i|W=hSy&qe zN*hNgZ8TBZ_=VEOI}}i#Uk*TR2GMjG1P1Dr?0?Ulei&)4&xS0)?8vTT#P|W!HY#Q3 z%1e8U5!w`C8*8Z0N*gNdHb!p2gKkCk7$fBu=o$CX7ztj1#)$H+I?Z?&kCB`xJVsid z5DCOHn>*bM?ldIQ;d6{zfm9AvG7slaDMBEJYDS1Hhe~xk@n?k9rFpNhy2AUvh}FbT z;89-#kNR3StTw!-4>LjW7}JU#SZ(?p640IzK~R#bt4Cb|{aYgZ8?4?U6g?LskNOqH z>a&2==P*_$zo0zo2jEdZv|)8MWOIHA*_>!WShRGv$iLnl1NljPT`GgSQGva zfa`@L&Gpu3@P(thnxgs~QH^HB4dNZ7V!O)xc1Vir$sGb9U_4Fu=*ay8aVy6l*Vjo~* zzxq3j5nF%8x5ZGmjs6|dBx9a~h<*WL_)8G~CSpfBw^jCbhU}JZ1+fy>YOX5_Xlcp< zO%K1?g;`4qm^Fle+0CyW0S_AC+yk+jV#%@R5MnoFBgAei*C!S2#fYtR#)y4-lELZx zBnq*E$B+r}V{FB-WVbP5$K+6mZ3Y5{cr(AlwXVS38gLnRD}(CR=f7cX{QfT1Mlz+1 zm6SH3DQ)bbwDB#4*e~}2VypH6=;VXIh#d}uBLCI~$mz-E`f-!NBc9xKm>8$q=f#e< z&y|n2@9x#mzI1M5z3*(Lz3<#@nB>8O@+S8fCene-mQiS!=o-;53Er+rQ*WoC4Uh?M z;$ag12AQCELr%HYLz$5`huVfo`g&@ZoaAG~ZXX82 zNa=;V>y$#Y2eQ&WZ`3M#w1rnaNshMgWMi0-(LsF?=z-NRk1n&B?pOtBpv)IOz$ zDUwr|4U3Q|7X64!QF1_&w&Vad#j{hfDaw+_gyba36cwq=NMowa6n*k3Q#?VLVhb|G z+a0C|h<(7`+Q03#BQ&Ajo6BT|3$|+?Q!y%j}f{PH_bsk1+!+vI@^g|nBZ|!AeZ0}`5>^vbxY*QpgY}elav7LYWAB5P= z)6MmY>EIeq?`n$bR4Ah`k(*0Sd%;QUn5g& zeT+=eaz&FCauu6m`rFtP^^3@a>P3_(TE1XL%8z&W*w-ji>`j^Cd&m@5beJL_b}F}K zP|X*w5xe2J=<=}+#8&>|;mt!ieq4#Xk0W zj1kV%Z8Yk((MKR5Jmx5f=+9AVcom3$6S3XJZIv&e%U|^BirD7cn(NjZv^49D9*Au? z4?gxO@Uc&IM{Kd!suA}rJzKhjwEG<)cKj-Y*q5vINv+iwu_MJ8v7e?GoL;6-h;3a; zCUD-dAvQ4y0;OisWBi$TSES4t5W9>DOn_Yx0q)j-LfozS^;jEU&cxdIz7lK0L}_Cv zr44sV8$3!I1r%a8L+*X61w>N|2#nZ!xc{Dy{WR5FpO*@*acb9LVl)9_pWx=oPxKfj zwC&Ry_e9`vLga z54s_?`J_Iqsa7R!s_lW;tt;h=+gFf5?JK$=_9f`wOX9yl?C->)NMGb*3yYDD{R<%W zeT>+-t0^D*75Lb%Y>53_Y-PL@+YsC8j1gNg86$S?SgAynGZsgH{Lk1G$x)i?+h>4l zJfo{As$B(nbUQ&VX(#A`*h4+r3VL~3HN8B$nPR5Wz|B1et4T!~GQI7KG7p0fGa&g@8|Gn?8K@d=|$aT{fdQ;;dX*(q&aoEd|t(~_$CU5CtxZogM@Cq)N4;TCi z7hHi07?Y&6_uzuLb|=;L242k)&kK-a8Bcd*Xot7Ham%^zUC-$&5>FYu3aQkF9Q^IU z9Ifhk8lK)(1mWqeR*a^%#OoMPIgc=)W;~~Gcm;*SwHSwgrf$o@w;3utp)RcngyAlF z$M%AEcQ&gA@J{%Y3~)Vhs{|s{6~OUaZ6Wp>WHjq@UrRpmu(-v0+`|)$kij~l`K*j) z?nAc=|9SJiA;v{~Um|L#j^JsB=-~GZ(W%Z2mkR~HM7;(6a>fASTRn*HRD55|^0{5> z{l#W_TIFW#bzltYm7+3IOu4tR%^q{I4cs}|=1ZZ~DlIp(S^?4Wh-$j^Cw-W;MJ2Yj z=&vqO8rkA}GR0yuYeFQTKHlB__nQU=U0~xX` zs@K23y>9-2n#LaBUf=q(bFY_Ey?%k}^*Q)9{ZV|IW#29>PyaaxMLh_~tg%F|LlJ=5 z|59Y6vQaM7eoF?azLh`Pi$bvt7K#da*l?g+iLfx+BUdYi$>~<u3$f5EXJ4MZSNZJ=0?US6V=eF3A(XCRDLuM^~*S}#CebT1+BhJOdVeRzQ*dG(>W7(q{TVDg*O~2qkZ-{kWtg zwWWyBTwJxLx!3@&^YCg~^H+d|C9Md8VP@n*XpG2k3c_tpnc!74gY$~HE1p<;dS^Vb zy#OL^zAu_#`aV9Bvv&0R(82<-_cUB^s9;yT;Q?nJXL~^zG>ryvhy~)y({RPfmg4jea(}b{z^xBD7RM()kC#+;?9kzI=jY{z==>IpXmwGJ0RF;i!#ix88PEiF_XF4+aBOfhmm8e2mM2ny zq?f1R!poMKa%6nzg}CS~CvO_Za9zl^cYS+u5^5gZ*0^>lV zD=(~a{5=7r@<~{;M50{+yf-m{jdzMZqN5EapGz2+H{8R(d@BdzdHQgK=lWnTgy*7C zd|T@ne4DHBp@hyk1)|*qqV+t8e>1W@GuK>yf4PBse|cB0gcJ(%w0{b6)qnQ%NLBqi-JU7@;j0>>UBM5Euw@crtsQFL5}5 zhG^8{1$$fc<3)q%c81TOH7Zo6`ZVywIH%?-FmJvIt-pI zrsFlkWXtIW2LQKyisTA?PvRBrUV{p+T5iOn)(k$mIG(nTRWOV}+rr8W99C=9OI3@>1aNdCd%yOSyCmcYmi~^-RGh zQZiX^kP23xXNvkndY5}pY7%^gV%RICWQE{!2v$E*&>UV?l}$@(OePl{^FYN}l;YIR0@UmA5Bf2*v1A zgt^8PVcrk66eJ*1CsAD2HSadoNvKSJ(z~t37XN64grh*$2V{`z1E`r<*O7&U0wL{7 zXN5l?KUta%%WP{I-WYuf8>3J0GW)4FUS?lkVQ^|$VcQse1RJA|Y|CuxO1#Y8`x9Pf zbGC~ymw48EDY1W@XNhV=$rrj24%NC5B`4s&|Iz*Bo;7nrN{F^~!6hmuTD7Z@d&2d5 zcs=GCzmhrG$r{6*>fKhw3$$1? zyuc>tAXFE6ZgeZZU$lkUFS_*|&lIbXIg^0NPELvq?NBbHU4Qo-Jkg~SVjVTnZ4efj zoM56${1s1hr(vS|8c%dBzvGF{aF@Qvde=75eIU%$R0yewF75#}(fJ4AiLSH;Pjn$^ zTr%Z-VU>&cawMcs?yY49_nxqlgKG8yk%~xL<8OGc{js#PudDWocf)((Pvpme@#JQK z;sSec>1>HMlwc0L|ua{80KAP%vpU%CW7>|3Mvmf_*+qbyaf4z&96+LSt?B`{G7zV$D z2;I(5EO`nbq&VYNTxK-6Z7P!+m^4JI$LbW73i+gyvdvwiQm5`n`MappvVV?B{jGOf z<>lTGu+Y2f&Yty^_PXc=Jx%mN+x_&M_>)~Lf5xtnJ!5w}J-5Pxti5}j#RU9G?mUGc zXWkacs1+#}Rp9$hn*) zC90UuduI>}%3s0KFpUGQa&7gWa#o;)d7>_;WvyAak9kqohll1o@U@8{g_m{2K=u_K zng_og(z55W?lVtFtJlI{XY;HD`7esR)q|)SR-5qn)?v8oaZEiM(p9ZN~+#oGyvjC64#U?0!n|VIuvQ)i( zcF5Nv&YWo(ssipqoq0gJ&VZ)VKu27&r8eGTXNjlCHC27o{_Fdc179DIEmZ!Th+OL< zA80B1H36=v_xo`XadFhfc*E}aw@te_DW=^fcon5~ie7)XrZk>-KB^Q&ucxfHtVvma zA71TiEHm`rfoGOMIQqO&aKksWuPNJ*U!c!~aCODJN(fM&58>^W`4HaTyir%6mZkZ49?fL}}->z5)@$G2di{EUnKVM?to-gU8U2=WTO-TFGX{974stuo*jViQ{Prnd4)qgsnk# zkz}A9wWX9k1+o+&T0^!Hp;ATT$^jIKv(7Kh$Wzu-;K>yhrVX^K{j0zQhVpM4O6QjapISnPaJopns zc-v|W;lGc>5dIS1rr5eYpC{Q5!tyx?eLaYOGr1@;Ax6034O&p{8!=s%=1<19@{fkE?$}!-Nj4uy@A>_MEon<(G04i z^Zvx}dxGldAE=IgL3Q*~+|lOeSU>T9;M=yo!uokHWh=~(X&@FVKp^hZ2bGDZmTT=`2R zo-122DKJhdj5jDBoZhse0a7}g1f|>*XOGG>HPYsp99U?cW2DH4U9t0F zy-r^c4|8AhEcfh$`KI4#3pht(7r;uL4#`Ca>K8&D#zCL}I4pG)g7eK0g7e)j_(Dpy z3Lty5P;gY5iJFpy&=ijnO2bh?X#h$ng=`Gkk-lxgoBLX6oBMW64b^{)xNR+{nT#;p0TRz9GMnA_c>X9wsALq&CZZ~jqw*xCGc-UQ%{teq@Db=vL z&vy+(tNZlvtuAxNqt(4W#}4O+UIx?s4onxV?%&!0sTn(LtNVv}cy%9q7q9O3mKCCs zjGP=kY%zUlajCkUzLY^|`}Wy3b3@BIgamPz#8-4MR(a6#mc>)sGGrMFaT}s3{yZfymhq zRzj@jhn1+HmZkB9V_x!ou&Dcvd19tGSxK_QA{`1Knh~?ulu8RSrN$(jv(N;ACX0q2 z7=TI@5_S34B_|nal9TyqUmKadQ(zYfZ!5{4!-JkX=B2UGTql9K4r-6VTvrvOzMqZe zx|1nruDia&JfL+4p6hr{c&-~d!D1H;BaI}n9CTZ{vOlq-;$eK2b7G!7H73SB*2=lXQ7#nr7ViJm=G2T)% z92$rFSqnz^Ijuml00E6K?EbQUd8d8=xKpGD&rcn&@&ZdFG4S!jMR z^?3DlL|>S-6@Q_A(q8n1KBJ4VQzY(7qh;o6j;)*IcUJZhNLW7%LyU{BzHFLAn^UZJ zSbHTferK?@6eLhY1HrCQMt`t(OtE)g&FFxX{{+mw#hd?S!0hw}ivl+H>4U1)mG-4I zdz-$2j!|tb-gm>BXraC7x6!bI&~X!YhTA_PWr2yaZ^hT33$_*a8Pb=?Kf9F>xxY!1 z1x&Cb%6s=ETI{F$S=SN|4YOkss%HbtTZ&Sl15$CXSfQ~M8j~$WN@!FP7*L1e=dm1V{Lm|zqBJY?=I_zOc4)|X&h+L@bfp^>IH?BG}IwyTz` z1r_B`DmqE2=-2JI$12~ZRFnlO3iP2@7w{}lCwaVyfL$u+*Ys_8uw_ogSH(=l{aW;9 zUp(K(Z{u)O@jD37-nVJ8_$)g@S`Gi&=Iw-T!1JAk0krBq`|YC0{dP4LRiF4>W~b4+ z3|zCbCm(8=)sI{((MhTo z(@C(+HtMRZ9TIevJ~bVi$}&4_Dp$c&O8bUu9kl!S!2dnOGbkn^egb}bUBUGAwtpSWdytzAC-ywj|51@1NhyxwLF(?M;KLGjnN8^ykh&q)LqkI!ym+ws2O z&5^$IcEK0AnnAHC@i(?h@bhr)wZ>EGGE|Gune0o7E<8SMXI0k4!yA~O- zaoEv)wvjtO=A56oR#ECB`iPS}bFG2*5yzzddtN$iqv{BwJ6|r4Yi1;cvyw(SxcO}) zN28$WjmvzhKl9YC!<ke(gdQ-~QN@mg)2$L%afAO6Y#6kSDn{ai z>W<{tWxbD!k?erOhN(MKzUy3!(VC5L_)zX1;{K9iLHnUtw&9Y#Q8FX| ztwkCqHq5U$y@9n)j#B^@zP!a!{thKPT7oi&Omou!*u6$()00(a_zKc5RK+X>BcAC)uLuAm-U&v$uB_Z<#GAl~`)w+7vYWUC z+3%n&Al}&4oCEe-hJ@$#Gc(^;TpcSLO;k&!w)u@Ta$m+Jz*2J`Jy>iGgN>athe@|*)nD*E+aR& zk3@BDG%JLwungPM=rn;9(xk8yZEbX#%nE5$SUB4ooswB0?O;GVfa_sZzhz9cO| z1KY);(r3pJNvElwV&N-@1?YVb7mCY5A&FsBrLJ_$VZ zE36q3Rm~Pe6|R;MV_4DJa2ClcbIacVMM8?eJ2p6E?DN<0)1i2Svf=wyySZA|Qj+Ic zJ}gi3gN46vU%=K49L4uTpbq>rsO&)JSbnsF*}X+y>bP^=T4J7wYV_PnJ=azNp>a+yNB&GyTgjd0 zcAo|nq11sXzlkgs?n3ILJP1DC76}%+SFW=(MKctcuy&K$4x~?_eOaB zPO8i-NfpVNN5r_RQf>+mV}Ffyj|h&!$T24E9vPef(8gTW?omPuZHz^`M=#9PMhBDw zQNKdyqk3ww5%u2|^_4nSy1j%4Yb4|;*i{%JC~@?Yzb}sm7b4zq5}X;rygI1dvD!_? zfQtg8)I|J8pKtC}_ zM%>jgy`2p5+2#Ia%rpRw%yRz<{ANM9e-(a{Rqk(KUMIwB>!ueOuGJy3ZSa4t)d3aj z#Iiw`5$pDMb*aF*?K!B0V%=Us{hQ|~(f5V0Z~%uQ7=37DGW5hu2|;XgM85ZET;tD= z=G}{EdwhZm`)QEx z-5TjGYdw;0^Rb0CH+`i3cgQ`6{Py+#lSOh7ADH|wmbj!j}0Sq)Z<;ze`7WY-}G+jpsHT(RwdWH*}=$L zcTOSDly#IPoRY@M7PUBclx=7Wt)>9vo#9Y zli4b^d?JJ`;-%f$AZ;Wkd+mK&MVZxZt)0G-_KiZ==_@l??{)ghxWTQRzH;a;b?;7J zd6D<3(^qbrL)drv$|2gsPG9-4TT#qk|H_ze^qs$QK5M_I?OEax+5lh&o=0dDX4Yyq z#vxti>w*<;4VJ8t%=n9e7|H|0DD0P+6Y||_XbG&tP-SeOAtr%U*->zVVju=iYf**9 zyUpn)>vPd|u@ByN>tJ2_~-=zC`r23i5}HDpl5YzgC#h24i$0L9f@FO&0t0tP$tvXf4|i;U66Zopf-i_!taWfS-JBu za6;zL@In)PN#;4dnDW9S7`?aBQ=n`SmA{LQ6M!by{$~mIE^Y!o+xT*?`BE?2C{=$a-F zZe|efCJ-J5ijh(oBc$8a5WZaxABkRhbl95?DDNI$70<1e!Uj@lw_^kYJi@=nv7^N< zKMpyi;f>fSb;>)HjGR(Q5I%E!MN8oDsRM*YgHwDgb>OJNjFi>ImvoJ)A+QEjAO=zNB$G7a!XH)_HCOtZU9ueSy& z_KneA>Co%^5D$fW4a=sCOzw}amn6eF^qSIAu#Hm8|!gh(1m>y=~ha$ZykaPgtY}c1;Ycl=={lKQvol0XnF7EG4fB?nv7aqj3{rG_Dptl9Hvu-=t)&@EJb4 z&?p=0Co_ZMUApE7?_YOaG$2=guyvjXb!Y)67fiGcZW*=M>{263>KY)#5!XmkdS)&Z zWXq?cg$$#KkB%(v?oF!XqD6DuXmsvI%(gPNO>%}Uqe(lV<GNvg;#twR2dCR8)LODd z&EFImXCh+Dbn7|!4SfO>iMm#{$&-EeQbhg@{kNX%)=Lo$H})so-!HVI<^++~(-XHP zD{U|ocdurXH~W`Zyk&VonmA_F^YF~xHg5DI!=KR4s$XC{(t4wy(cQ6zjjxKn{lf-P zMc?21;MX%9m(Ls_$&Y@~@u=*%`Bw^87*X%Vu zN#WUReE(vr&MgP>HDEsm@?9XwOz8V8L$k{Rc#wfuEr2y2lObRBGkv3GNL(90xFPam zci=rnglxI!nq?9)la(U@F1Bo#vRFXUhK>M-T&!1cf>hG3(Y=O}>#EpXQgE+(eEF~O zi#dI2B0@!Efo!{# zF?})>(QARd(udOXt=k)h>p$#3q``F`9uZ_hMG8y}OWTlLe2_l<>|b=>^Q*>ZdflIV zSCri_ex8>V-YmU5et}n;qfM`seU$Tm(eLQctM>+{6!uqfHodl+%I*y3_}ldQc+9+dJ9j|0@(w%eCgtx>;j*;;n@Ygb49=+39RmFvXg3oS2?jSdv;gV0w?Ep zf2Ud$)$|Xl-E*-%-abguud8Zx+pZfX=aS=lsP>0(i!1uo=s)VF+Fbh}OTQkfHQ37^ zBh|hYiBwy(Ep5qLNVTm4uxcCYoW_mEsx?$u8JD}LHfR1ZWu)x04%O~X|IAaExWJ}b z&BxQne@(yKNwv{Wrbl_#^muf<@_8AlhLi%JfP%^T>)&I zvG2tjj%nZJyh4-IQ<$WPhxO2Yr~bWo;(Gl`9274(*;a`;s2?3gX&FG1k0U96|1d0H zoF+=^5uWOB$>TCNC^4w(f%z?NP*G46lqJQLC8$$#s4P)_QkRB^f5~P{{JZj=%gZ$= zgwqWZ{~AIfptv1eTA4tV$^}bbWIDbv+-N9L{Ivl*>nf~jJN&eRO^OmUA zBY%}22$_*_Iz6M{qjF$6RvZ;)D}IGnsC%{oh>{`v(^i_}Afi651lD7~osa!Kl78%W z0A7cr?e3rWkl`L5`;fUFANr8b{0>T=`Bh3?Jr4Ph$sPxN$Wo63K4gv{Y}{RiK_U$ep0Re@Jr_j)rv+WvX3ju-7hWq4@t%6%U>K@<&(+3F>a*cIM3((#V&AZ10O2<szxdy}@^sJ> z?aFhKqxZ(3l(}X|nNx|=M~XCg1CFD5fN*sAv*Hi!v`fcqg#z0~>W}YR!FlVqO~{vzx<;j7P<7EPx|qb~8SVV@FXlWbpCQb74EE^SQgCd!v`WWG%H_uDO==@J2?*qiWv2P~3bT ze+~VJZVOozH<6`tk8qO}w`36e5@?5lTkJ<2QnuKSMNFO~5_D?}#M^(vv!$@@8TarE zV`!L;XoCp*MBZf?ZR3|M6>sR?hj{$pA{3OL3t~tn-42D;TG2K4A!eV~ih}Z6;2j^L z^-*O0>W>R|d!;Ftbq&)9kE*@-z^XZZseAsKVb68d@?7%zy{_TVFTK*N%X(xtNz3F^^lTELtv_C)Dt6FVS)ZVAE;LK6dKk+0b7or2% z3(}m!4DB@MxZsZUS#6<4J;>e{)f~kOF6-MyiJ0lcv(2Fm?I#q5b#-=7hZI)rh6ArM z2>%yb$n_5sSfXEjiFGgGV0L&!Y{_8Hh}g}8Igr`~N3;f_#w?>LA=d)VwzNJG6`Qr8 z@^2vBFlv~NaHbE%sTcE|TJFebBHk^OWdW%cB0gkUKt=ngNOa8z9WjJHTt`fyN9c$g zdbkdU;&`(1ngpy|qkz>_$4&J>ja(1Z$n~=Bp*XU&>g$FAGR;t+?iz|?^n?e&1G|Uf zG|yDM+#d{~IO+XRD9*3J<^eB*(Mcsah=rB?rK`oR#+3@iX-il6zf9M6*0*7%WTWwI z`>$MKQ_?5{18A5Typc@l)L@z^+bBm38M^B*J?5h2#Bivft{-poq~BjNm6t&*SG&;N z4A~|K^}VV*C1V9j*eBA5wXFS7cW%wKPNBZN_T^#ruZNgZ)@^u<)^t zC@cI;N31V=0-?T!Sb>)*HnI0v2=(oK5u$v(e?W1)w_<6Byw1m3dtZQ1-`-as%D4CR zSXyxJI}i-){g4Xv4RC9nX?3+Qt*%`|eFp}z8oKr$TbZFUe~kM48Se9xQ1gH}q15Rx)#r=dEOtxWs6IE%R{5J}+xol#(p{i9 zMuu{Syx2a+t)tINGgLd&og2zBbUTcw;jca~+RA$x>UvHQL?6PBDpAq5)avM4zJgaH zye@Uh=*ZYGsf5Vikccum!iR?NBZf|b*Al+*YP^e`;rnn9KL)tiRfo;wp9oX)jZI2u z`9T4qIT6HlnTuWc@Djf9`%-je5r}KKAZ}!Wc%1BlGdf!5=nISIsKiBcx@B}c2KMyt zfZ+Q(UXP59U));xpSxL@pSyL-=xBup!2`QzbZ8f|iaxQ2j1Jv_7)V_tBI&hzBk3r0 z@%~(#(IMJP?g`$j#z00EvvPrtn#$z&9o1?TBq^7~DMq(u0l^>4}?3j= zOX1$Jtows^VMuPHYy#c3V7U2#dKW9yef>OY8?qsNh>onv0I`1#h^?6*)<@$!66X_j zB?EjrMJaLt`oae5P(qOZ<`w-<_&Z&Ov@-K7nASoPsg&(u@+`>CHcCL8vB2exdcLpa z=tOfpx~3AuU_FSTIuKzhIyRY_`TD|Z^Hk#Id0kCL^EPmuj|9r>k^CMeV{vcgSGZf4 z74F?kre?lM3=iyXGW7>prt8RLEXR?_=-;B(#w1~rF)Y9)qc}|NQ5~jCMt+i&TX)iC zGK@%UG6z_%-1i@T ziX_+X^-DP^{PRZIf4AHEWPZ>mk+A z4r7sACFW?ayG$NN?HSs9o%pNzIoiiA8B{CO#k=orS*SQk`=-N$Zl!8>^DibRbd8i&yhE>@nMH@q8hZCgY4QQE z<=+6d{2Q!pk<$C%LGZwLy-+fS8d4QAppF(KC4Nc%dK&parX$D)ioYg1th`2`Na+?2 z94TF~Smj^2n93?LpCtEKPpYX%X;R39k~xo$t6#EK53E@XXLbxas-g3x@g+;&slnk( z@()%yH0b{Fhen50-cW62zTj7imxbxbX6AM1;d3bWJGFi}-K|>X*|PR~-GHpvK=HEJ zjlr-)L;VcNEC!gVKuD|11-R|;Z9wGaG!@j6PF+iMh9@_!5ivP4Tr{ z&mY=yoiU6ts~(ycXhAHE1+juY)z{J*H;gfN)?0989}vrLL;LD|Aikb86({urr?p&Qmkh zP)z4$h)StZ4izy|QDjLhNirqmJQ5w8=Fnl*TBfvwmMK}WtQ?jiyE7GHV@F79!<3dB z)`rkp*6+HXnQ3P7`F($X{r2;Hy?A<_d!EDn-1l`~&wXFl`+8sB14QjD>!EXd8mm$A z8O<=uf8^Ye#xX7EaDJA?Lj?|H>0kqKC3gI&E|%@JUKR{cQWdQElvcucdQ(vS25W;S z({3AMgbNuGh&qWm_MOu847D$9q)SnnW-56cZJbNRna&#mYW`=_adMVQ+$(qU42K-# zQU<5gjiV*GsLpVj;FPO(zI-MpwCNIz-j}jE(^QS%O65`^d}j^k0dXvCfQuo==);;R zw1~H?7tV!iu=}C2Y2SpkuNF25)-x8mq*<5zqMl9jb17cKN6Z?qn0OZy{Z#p5&Pi*% z!X-!2mb+-rD4Glk*Zwi~z3fB(reMR@d9X{v8tr}J92&l!P|^_o^AXG2MY{%T63o?= zb~x7@ke#=_7+m?(pm6Kbw6`U*X_+pDWy)^r(9w}k`Nwo$XHISta8Z8^8_of=cM3Mb zE<6WONqxVq@!ZSC97G8z96}`|xBz$<3rBgk_4+Zf>4}#N^CiK3 zU@w2}+m&JXIzJ!HdBwSx<7T55mh6qRMXs82*h8JLbm$Y%ZlW!7?Kr2#JowmzXspe(!|JfBmU7tjlc2Gt5a8JfQ85;V^z!y<;6`x6-a%v3c{Z#Y zh>4v08fPM}1Saw-oQWLB%#rho(+*7T?K&oMVgWFbZ`U)C(=(9&N*-quGqz%bx?QF> z(9-AF%otl~QXrpWGjps86&Ov4`A-Eu)6V&wS}#7&`BMUk?;6%|3{Jw=t^mjUZ&_-! ze~?0+JtS3YANFE@Z`q(6^?tpW{eJx?JZIPk{!0Gem>>UdbM|-X8K5*j^B>sXbE|9= zF3!;AY8qmu6x^j{<=n&DT>L@D{{DtEhVWL;{@wy(@vedWUFS3W!Djt9VQu1DLz~Ng zu-P~+#iW3K+D0`_gbIvp-ugz;O*`x+-z5HDV8LYp{dgBNPnV6k|4<>7-eY|vB(Oey znlOS&IWPDK#QYz7CyZbL{W#pP+8Sk!M%uc|^SITEf45Q!H(-{H*;E1SgRdHzbYlgbjf^h36Y?@kk z%K26oO10Ld7n>$=9oz_R*jr>Y5rjU!Ad$JU8i`Eje&wv}G9)t6JvxyArghtmF*=dK zq6kx2QF@WlL14rYB|emH=eih!$jBqqJ~^fZiilPp%3p9skI1}bb$ON@5bg_$v-~Cu zp17lCgY^=xH0$fzYT_*a3OaJYFiGOah@uk5<^7=R5lFEfX}QX)`;le`;6QPN5^ti! zH;3hNFUBA&US2H+_@$(Hov;`tNxoj42b85@2?h}wFgWKYySTLGD1!)T$~e1;TdX&D z=_g6@J$93(7hPBT>4ZgiVTY8dy$Ks(J8W=Ar3ewge*+kLhpolj%fBML3!>c$*&>($Vkm5Y*;aJl^KS)j+JDrf>7c&sDZf zpX=LPmm&7$4ACsf%Dgo_ZQeB_V^)c2!J8T4S!z^ZZ1eDamM@2N9OfJ&{x5*lB+b;+ zzWiLpc=@?GtApSgPkIltu7mQ(gKR6pJryq99=M4hpTi! zj;3FuNkQoX%JqIXp@3@ug?$J)b%cMGc-L|um1+;`&{Jv`8$yF+(CJVE{MPYz$;zA_ zw`YATmp;2>WzOk-@4n#7QK#iNxK5r`&pEO9oB%FhjRK>umg4G~jipg4;grBR+%-8) zt}*D8+20#a$#HYd7N+G?^#ilVb_OIFMG^^2cXF-N_IqBj(BPlrCU95bf!d&5Wa%1q_l);wBsKf}89 zj^!C|`3ufDgG!E_BS_EjcU?FOSIGvasCZ6mdd`i08M;zfx32bRv_M_q-iO(!sy>XRHI)1xfGB&gsHiyt=(66xhcYUNoeL50fduu7Lz0D1U z%3R9%l1-FqsOD!0!I$t59RZ*hg zm?{ycA6nsq8?7|Q#U9Pabw(@ECE{MiC8?>QFtLW{#_$MfKW;Eut*QxiV|bbrNNS{R z3@<1!FJx zlFt33XO};g6dGn!>e`wijKGkh69!?~7%N(kcrb5ze_U7$e$@Kdq6OR|v{+p!eAOKo zr+pN!IX@djD0)73XU<92l-Y)_`f{Jn6UwHrp$wfXbx9$`LG=aNl*5K!za8_LG8^Iu z|21!_Ad-<48w_;X!3=Y6YUEH2er9+gRad#K%0Nmx4F1d>>;l-^QKmxj&7?tVl%+k(B`Vs z!ZzYjlY+X_qP9>}U~F^wul-}<U1Ob3 zhM$#)7&cMwM?i6oeYRshrh` zw<({qd%UT)-G~9~#@m#4F+3ag`zoc!`zrCFN74;62P)xa4up5oiAo1@DqA?WUi_n7 zLoMZ7-wum!eTCa>N_>mYso>UcT#`A|8Ejxv;L^pjr9vgKhKmLjFmv7NOia${kw4CE(SHrr_DgUf_Z1dJP z83nSqGvQ+&qkfx*-Ob5hUz`irxBHZh>=~Q1>1YnqHJ2lP$mJ(=q$j?nZD9M$!OYzk znYjg^nNMz0nH|bh-=Ujez$v$~JJ2XM~ zf!m&Qjk|U(E3@P^EuS5nr(KiSp0kEMA)&*$^fsk{ov?|XS+bfwk3A_ttUGz*TwW&k zO`ZZy#?o8cDZjcwRh$R3Pzu@Fxt{3cRqU7qd3p)D^ToN*nSy&c1#mJaJ@NOPOm<{K zhljL0r%~fQ!zRlYScNV56KBRQwCzsx(>}J<&%0MTlvzLHnM*TaSd~a?= zrsRFzE;w17-uf`-rQ1Su=X;c5cEhG3baEy;H6ie$;2~6_eXb_6^?lwRs76tG;v-6z z+X__Ydz8KG#!Z!|&ROiNgxHTIkKp8Ib2~F7AM(C|lPl9(ALYDpTMH)>?^7z+Et{G% zOV-g(uxk>8AGyzR${P1XWNnXJneh0tLFY5eM*YyWaQnR(jeF*1*-lzH^6@u=?5RVT z>8yp*In*K8bieFdcJe;52UbEBvzt$|SkJDX%jy9T40n%7C|XCjPf5k|!?ok-Jv;DR zpDbtO>sJQiv|{Nv(6lCaLP&E@_Q!x!TisSAW<1`z%tfQ_) zwlgPO%V=jJMn8&{tkwl;DeD41vC?O((l|w~QZXV|^|I2(ULg3v4SQSZb7wg#&Y{d00zbsMF7UC= z${C8Yt_v^Wtm}MN+8Bweo^?G7s6^H|>!VCw<19Ux4Pph5-=`yfo64_pFirpUs}zJI zIrE&8u}to8ckPoTcDwvX#Xx@8ivAPAwt5;I;1$l%0P%93i95iH8x^ag!@g(F3=_G; z0*|9h0yw~dWlw`4b2D(x48jfFLa;AjsSSuG~&aP;Qrf>Hybn zCnc34D$_DgM9+r(EI8)*GrpEs7lf}RvLA{)wmj6WCHT8Zdxg7Yy0wIQFdnSCbN~w0 zEg6i{Vl6nqQXva3a(oI8X2)7525AoAayuP)p9JMZB)2gX#7cO`63MN!A1=2;kf7Ip zj^tMJ9lC%Mi!P8%O#x<=t!Q%1Yv7`Yz7Q;7^};AYHKgL|?-0-L=8 z*c>J};a*4WI9kZFF|=y!m|m>y#U08~)sFzu^XL5de-*FG%)U@>5V&gzQq|Pmf_S= zHG|Q?fCc@DoPBs>k0qhT-bh7_EwMt4ZRvy>J8dLtZ222?I$^DK~g26gnUYXDrTHz?k1 zfIdDP^?f7x3}ngZ0?aXw*@%FsfLlcv)IgLv10c!nB-o6R0c>>!X(Wz8B~)2w*?$Mg z0lu>~Uo{DD3sx#`5&V?5K3O$IACukFd`C*qd?zzsHNnj?&<%TIP?b-`DqlngcQOji z;BT(cc;8!t;~_6wd&B?1L+-Uxk-`rD+lMSZ zEjk8@cBu9#6=Qt5vInD&f)RR2N)Nld>s1RTy{#^{z;O!NTD5&C5VQ#U^ zG4*_fqx7i?il21C<}t^qujs~-`Y&Wl={2=LQTU?_C<@PpEk|*HD}Y@!Y#F@?6*Z!w zYfyw;sfEo&*-BleffclnWs86(eG$z(r0*GI8rbp&pf>*a#8t<+D_AM~jo>Hz%{(QM zw8{mNm%IFjz`k=X3b(;X@ovEt?>$hw_i@FmysJ~Z>7aPi^@{hNOK0|deYy*I%n+n& zIfHP;JIxXuH1E&B(2N^5M9mufX07Hoi3&dBAh))-+J4>_wr zq8bE`AWEx9rok^bfM2jaEnPuKTML_I8L&abnl{+O>J&&QrRwUq!t-%|6 z0|hnqdrQ|Lg&_DZITaV4{tfp{Xc zE93?cKyH9IDqAEHP}$3XmK}ux?F72}bwGE&u6NFccW@)PVQ&L5w~Xd~9_4Hhu0*uI zyhd4qq>;1`6EoIl;Ra&PQ^HivIN2OL}A3|&PjmIgCd116p37+DB5)` z!s)Ho0nv|y02youkimwSn@+^1fjIpb5T_rb^){UdRzlk@hPGX7V{SUBcq3+4y!j8N z6V)5BHV7%+byJYyO8r2F$+XV z(iw*<-XlZFc=9c#RN$fc=nN8tJTyF28H&1y>S-E5L|Qr%0LI@=W;Om8`O5JXLw^bBlMY|26?*SXt1hjXt0Q1S%0A^aBpn>@T_CXKwjX^KQ z#9RRF^JVKd!aMSB6It@x)vuxdL47t*H!xa%kBHzy>jvjH?H*R!XGm)&<}C zJ{!0Z;@lRWExFFqaPDK+0Ocm+2MIcoOOEHLf(~#WDRblfj^t{CD}XmSxEd0OKqe7# z%PGgyHm#$y6HP(>gei#lc{FVP5W{5T5z9&X8WnY+qE}EPepvyV7h0#jivF0d=SP9f z(hmf`ln(;)K+ZqLby)o{PD}Y=+$S^w&o*hC)^AcV)^F0h8e6H-6ChhwD&IqDqxZB= z!#TMhXzu+H<+}0$(!CY`$Px%2aosyvf$Lr&Q2mR5>Yqijuhdd3#&D^6%Jnu^Jnt%f z9TT4?KN*HE_5v>nx#B(~5+47@asTp-Tk|I1v%Q1(Y?oe6awY9zCiz1_v%bKCRKT2I zQb6>O<(r*RIv6gA^jD=aLlu~$HCIWs;1wMkFZf8=FskV!$7Ki~X} zH2=!W95{otpCsTZmzB(o!_*-@$4QH|MA zo7oZZt=aR;jzZ0jlFW{zW=EwaM;U?|lOwsH&EyD#;yukuP9Om<)12IY*zPNSX6?SY%uU>#!8gNXc&>j06d*@m&!eLoPBk5$k{icviR`UrvdDcaHj z@@OJeD-P=n`fH)(I7pu9VP6Mv}6a4ICM8EpZYd zJXT>j)PX$vZ5peUx>USP?Fh~Ufg_7g>a$Ws{mZ@#aLGLhB8C3+K%OF4E+>uBUQ(f3 zimlKsgEC|rna!rR3~(Udx1Zq>t`RuLt}?af?q*7PfwHIe`OH8PAIOk+A^}7(q$%Yz z0o~oLY$tK}Vor_C8-w?yv_5B|fe`5?@hA|zIbxBdKIg=Y1r9CXFKpz8 z`*qaJrk)0u<8amsMzvyx#25UNh4561Q7o>tRC4w3ihe6ePc9ua&8j#SH zyr>{RqCe4ic!|3HsG&#a+y0}lEwqM)&7S&<9H}LvHYUe*Wk+`6yVS#k%fTp15DKB)La|&g+}t7h1_ z4)d(%kkvw$cH-{&6GQCo#8FJ&|=j&^lG1FQ;br4DF* zFy{GizKtdDz~)3SE&b^NUTj`dEU>~f(_ap^Po^i4M*7Bfk;8xS?4oWC7|}Qyf`Nzx zXThp>;V1^0&k=hMaUIFY0K#wTfUf;xCy!8Vi~p)CMm*S|@8bj5XC08P0zYKixA5!a z-IpMKtUv(mvYo+N!D$N*Po633Q-T3ydq$m-BZDlrYxp+PfwXm-cqY8QIHc);@%3ws zum9*X)7LK@j9$NVf{;9Jq5CDg@gIhv#y?BLCiXOb>%gGC14bL49y&RzEPQ=75g7Jc z`^cosP!_W(F}x;mYiqbP-HPfUwH=nv=pRD39$oBkZ8l zwNuCuNRx>N^F)N*TFS~&tMHp&6n8J>c|>}I(%tu>7N7VJ>WI+437ky415{e-fPb>5 zMvv5PXEsI=cE^iBX!jF`_&B|{KqQkj1E~~;Y>xdA(k}jLW=dbxGG0APd3jfSMTdoa z@3ampyMy29TOm-|R+z7^->exR#dVQ<%qqNY^LL%gI)}_2jJhIb9C`?ABNpk14t;r* z68hY#uTNO57$id-#^$u}vyVNSbccF26h@G;XK;6VEahF|4N>2r%9!eM`4!5Sd&M0N zIrsRho=?;Z!9dR`_7hDsX!e(6vW8DSSH`$UeNwQY03^}<5$Xtw3p8;V63lj@%t>C( z&a}A8PtfUa0w|vLFV7dQi1tIn*{HwICP7H!k9~_)!0UHUI%a(RM@NjWKiTZ{i}BYl zW?n9jx}1Czwf5!Lc;i1Na2EG8zVO=x4-WwC6Z(3fr)wrRv@jZw;`SVq6s-XFs59?`{53-m%j-y9IG9~kk|Kw-Ra1I_Vc8FLXvXQol9z8Z&W z&azVy`AG|>ZmTQQs}tyw8GBHRKlVi(Q9c)Q--dSp43Y4bBVYYPU9r7qh?K6lcX5-f z(tLVYXwh?`bq3^>(^HC8gu>Bw$SRK{gc5RtwII2-05tU@VYH4WWUDA^V(^H z5Rfl;`J7l7>-N75TyT+?by}M zim6mwK>3vt`D?Fzqph#ynT=7&n#qY<32TXC(Cas6eq(%nACuSr+t5Au7+sIQ{`*~S z_p0`d`3AN2uioe(DYH!UQ#Sp@)W6;vpH8-Or^yb0z*#FKn=SVc7d7Z6fasCSxCNK*@Yg!INnQz4x; zjzAdBnijE&+^BY5V0i%Pr~4C;eyS#!43YPd+hT&7_Z#(7X?w&_m+n4h`l;6bsM@*K zf#T=F^d~P$p1}6WBBGfK>B3)OdLh`V41DaN|9JK52OrUwwrFx$Q8#IfOJz*%H1tKN z#`|T)XsloY{()ew;0)NgT%fIf?Ptxz3pZr9s1llc=Pk8yE5k>Rs4{_??6V5p(dSd*9&mYn=gE<&<0L517 zXE4%Y^a&3=)pg|pNpoe_B#^{{L#SV}r&yTGV2(7U+|3Zj8D}sFPfx8K6FbywjM6Io zbAqU6Ei=Zz>vt^q-uU_fM~$!lkD+_;8B7-b`dQzd<}W>ydKA}Bo_OPrBbw-^hriD` zG$O(H^qW!DaX(j^YsZ=15OkE_UHJ;MW5&?iXN}rXGfDr6BwxskGS!ad2gKO(A1;0w zfRU-46cSs-P7uwz!w=tdedi(C-#PCGW%H%6XiT^tMg1~74l9T-43W0F_lzb|-=BMi z$nm5B6P~KSFdrfn?BSQNd4%slND1rD-!=;Ao!A~BopRSuKP05#D=6>@58tY`ucD3G z@yFLlKaKZB`bpB?WQed%Ixl^zy=2r+MYFeESjSmtuAe+kQ&%&+`!}qEPxz6d&2xKZ zFpuPVA%Gc7-BHsSO!G`MgVFrDTe6Fjhwl4?JwdIt>ZlE1Ys7s96F=&xd zJ5KjD)s6@Iu~a#`zgtBWtN1NKEpb&XqwzB*dB&);+P{@|HFvXFk(p6wh^*a#hR72p z|7Fi4zkN^j7aN5ujY9hF>b=S1>PMLmk$JL*_H{#}KY)<3&WO(S2I(O7&=BDUkxYij@Y|_Bxz)w@=qGydmsKxpQhl>#@D~L!}$6^X0K1j zU!NXwe&D&E_U|OI`~$EOe-di|{22yEu!4dKZDh#x`J)?whszfxFZ3qw^Jk($@OFp3 z3%R-d+)eb85Pte~&iS*e@t^W~)?HQJc?{Db+;luEjx-vQ1|@ByzW2nBlwN{=j(mlzZ-rF|MRc=-7j>% zDbCU8WHpB_aaZHkpwa}?@4?^%cnPDRBUPey30Kauq@MCr3ISv8#ox(bJ?BV2#PL+) z6Dbhl{JU{^OX~*7@9@)(hpt!t^p~;gr?}{%ICab01k-P0mLEr){SzAfv$OD7V;ANg z#>M9()N~eCsCw!8c$J*%w$^B! z;65d&r>VKCpfmNBgu!4*m<&y=w=Q3tuDYPKBZ0kjDA+mYfg@lHoMoNH{I<8#t}-7dUM~ z2b`AJ1*gTlgVO>x+}Xh`gVQ>v!)f+M;k4}AaN0jl;k1x9a9Z@=aN03At>iwORplmkb=`y0-u#J9vxjH3I?JF?k=zNFR50O8)lT)n9=mW18QFy+d|2=v?s~hh!3gZ{ zEg9gs-QTlYEFF?f90K_U`g{J==FR#ylMSF;1IU)F%QbMvvh@bCD;x3){9p14Fi~Cs z%>&Xf>U?mUrh(?Mi>1z1gc~A_EPv)O3IO9Pxh~<@M<+R~7xXo-^)K-u@#uZ6I-=BL z;0Qwc7eYNs@tM9VU4JHZQV;1W+3{}tE-(>*RAE7NJ`J^g)nEY!4{~r` z1!WzJrc1*Habi^po8K{HD5pMDZ3g7#!Bij%YY^ZRij1^>Gw4S$wIgwegk7F(PNvfk zx>8|L%^&u7j=;kQ^V&}QnykM>vFt7CW`*Y^7jkC z#*Mxpz?Qg=UMc^|)hbCg0RfDmdD8@tW1!BEW1#X&$T1)ssqdETgbv6ta0=}7I>wsP zQH{fuR(SM0YqG9yLxcT= zfEoWE_}^4=*NczI=n!PyqnB4KQ+dEN1lUi<^%3?RGSunW#GZJTFId~BNq!a1s9-mTQ$_4M z;nWJ}6#xbreo?ShY!xIO*)AfCYL^pnPA^{$cDH1dJN7GgjJuXdxK?Eqv}ja&UF#_F zW5O7B>~{%lS_vWU+HdbEM(1_18fd_RSxo~L%p)sD3h(B%cKz1=9zQR8v z^k+S!lerfQ&;<*TeSk-AYIb!4vzy8bz?sv!Y=`*`xBZdOU}$7b)K&S)PJaWn6wW9` zRV%G01Xi-waX-hwv*|dr`575OUT#?+$V;g$29THG-bi7kOhFn^QH%zJG7!H&gf1ZM z+m%m9OPN5eIOL!MzpR+>uR(1EPdgGbW$gB^%yre0h?R7gYEIfGy6VUMqspxll)=4p z)o~fSZtEwy>Ia#271CAfoRO|t5phiGf^=2&Hl(WvAG8*4_T#!rG%h3bAHA*$nT`;N zF9zfJzE|{R@lWIK3NaT;#gWUW2IE+*&rn-N??!FO8Ln%59O`@xZ~R?&;}5|bKODcH z^Rk-*KVnldw&z1Wjs-2<^zTKUG~~O!3CmF1Jf3S8FH}?Px%t3jV4gU;j~){%qOo2hax@#DB>-}tDGiQG7V6O@p;XFN2J{WC}JEC0t&-;u1Ua& z>zab_h@f~hE@@#zYnO##8dOx_3PlQ6D1ua+2#*Myf{18(;DNmJwh5h6vUVcYKcN0& zDFB}q>vg^r;%C-1-WXZQmqC(P*jS=WotnaX7%=fiJ~re06UAhxCq9-4dK3f@{|N|S z)XJ$$M}qmn1qo){q+<#%B$$O?Bf*r!wOTAYfD5K(W=72%FH2{X&+yL}TrdaXf;koh z^GzgL0*Sdj2qNtz*{%XFe;lYhJPH@n9k`hK;MiF(2m=Q3PaLS6fCH7QAgz(mddVQ9 zBkCrh3pz8s9r(2GK};(Pa4}8#{@)YRvYoCo=VS<$n~NzB^yl8IVPr-17E|TCELmnN z<>3KyG1Vkw2-bZfrmT7Nqex6ePm!1kf9$e+kHl2H85dKP{a(&|otOsXdfY71iD~{U zTui@n$1%#2Kum|=3v7EL=N8_U2l2L?jJM_2cv}v@+j96ET;CSr`qmT2Bu3*GDA5I^ zeU94+Y0D;4E2@U+^lj?oe@)-2zk8gxE|>jmm$|-O@!3lI5!J$*pXgidx1%Z?6I4rj z>D!aJ?1tT+=-V^79UG8XZ*W6mo%-3a&Jjqg>-OMceZJMA`&(SB6)S;5Rxj4eKgY#7 z0vGFzb|BW%bYhKF=d1>*c}m)L!ZUy&i_b9<6a)VW-O92Giu1GzDn%sZF!Q4GS4Ts@ zQfdll3%+>ul(1_++&nMEO0ZT0#cSjc(X>Vhza1LUevvSe{D3d8M{VPZg;pU2+v&8NXnqP22MM82z$BJy3%A6=GbYLWizzy-6&b+0%} zCzyxwJdW(u3Fh$_9e7?Rm=PeDu6n`jnHIc>&KP~hNslEQJwCBL+_xPtej_2gK{I7q zY>?vbGkQGVsp)pn&+mt>sM88b_GHo@b~y#ML5e+tJYm7O&qjVgrF_i;{9x6WArK%8 zna&1MBb-$ndvT4cWh$Evi83AFNUL_UOk1=rbySk*6an&UUffK)@=fvOuk?$?8XSAD9_X?k!)2~GVkYTdqWz)#!Qzi+n$EyVPGimZMQJwZlARu)wh=5mQJ5tQt73 zvSF~k9Y~EtyennWNmR)XK^yo-2#z=Bi>WZ77E;L?D%q(_5<*?5gTnFf(B>UXX~UQA z#3I><`b$D9+-`6J4~p(A5L9fqG3dR$2)qDVrcf&lP%&Egb85?f=35UA>bS(W7FlPr z>PI8HTq8BywOJ5JU8A99yS7LosjC&ZS#Bif9p7e>zY5VjevJ&6Z1)z&+!X32jJio# zAaT=q`lZ=(YI#?McJ)HLcz-%jYnZ@+Xv2#h+Bb6)m%&pYl#Qq~cnW-{#Nzp~05cbU zVV9}7vdxmN9KpQ9OcGcpsXb(|oDmo+hJ-C9we?To`p9O(%I%K0o-)V&XFj6ifIP

  • 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�`r!|;$Nx3*LV_JI~|L*?f5kCg9uS%VjOOWbJ^; z>G`dqzfd`kQ{}h=R+?wEsho>J=DL7@f(=wTFE0rw*>KOwNe?z#f~3m%<1VV41@)=} zyTpY!Z851)Y+uZ|GCPgUJqDt@{(ANqYFuLr;497lypep#g~7DNY&@1y5iD&nUk}0o zLEopo97a?MTTBDCnD34;*p7d4bOE-QrviO`5-RKKUD#sgtf^OB+9mFtXp1R)_G!+% zCb_W-Z81MMo?_@K7jp9!Q;3zv*`G?bcBQIlIG$1{#uC?B^vUu>!_DItkE|27n7MiN zst|DpEo?Cb3&%Ew-@5q;|A7)Lhst;BX#IQZY*djy9jAG;c8} zR*#-$p3YKei|KlXwn=+JF}usnsCkPiHX}c71dboXE#`>b;ubS)X+W-Y@F8q51?qNk zt{utNo@+9B=Ues{>Q(c0x7cC|)b%nK_6#_@iKtr&>O>4Jx0nKT5oW#@sG}{W>kk5T zy)e7W)HQE01?q6xLgy&r7IWQhaf`Vd)NK}8QL?bb6sUWZbL~sE;;aQ*%nkeNRpnCI z30q8oy58o(h=9YJiMlsHort037E_=u%FOo$b+pBF9T2GNz0&+AnY!jJra;|gKkhv` zx)HXR@9h@1m|uXpe6dFhTTFqv!<_42vNcNBVs7{|nwUhLu*DRp>uWBI3OJlk)cpYJ z?i|F(%MXFN7&G4&)X^5x^{zl&-<9V7lBsLnVhYqnwBv4rI&q81E3w72zl*cP1T!X> zs=@7l9c3}b48oQ%Ies*qzhviBJF)Ix67u{uI&o2j?ZLYLSWUeuLOe>Sc6(uEZ`r=> zbvn!u&YOhK3~$Hv&GCJY(yl6c{tv=w%|JS>NjO=r8Y~?{$X#jr=Nx-78OJZ^O6xyN zVFuo_D^0KG%x6(E(=mtb5YAKPEej}ZK2MneuskG8|2t>@8=_`lh5NeeZ|Kk4<^}%+ zL}>rZe3EF|Zg(6O@{=Xx=UlyNg-BDLCRK@jjJ4eu#cf`{mCRl;Yrp0J=n)QbfsSPs(7-21Kj3)48^)W$xwN+ zf?cA*-sURR+e1TFvfs${W(Qa}ilV5`O*S+jsvYNveAG>%!s)2@eF;>!qb}&-JsbS@ zaPlTI!)dT9_$Y-RE)ZqAP&$P6qgge_*R~q%{yN#P)92-!D^wn5ro7Z7)X}#>9pNyh zv27h`RqV}V%LuBYiyx)fM%=rOJXPjjr8>GHoZEzC1=z%s5#exCXdKc0T+iI@_Tfa< zQ{$@FQ#ZR#pI)od#rtrc+Ny*14rsji^654SzH{?i_Iovzgu#&cF`{@i~V()XR zSDViuVyVm1ai!3lrW&e0#*q^3V|rI_eX(~Tmpt|iaE}-2%IZp%sk`XUy`5!`y7ao8 z`Am(|l}7P&CAq>&rf#T;?VG|+qG_w-bc$(`T-z6L=y->^IF&gT)cu7)QwlMBU1RO0(ECnOjBj*DqB%EQDq(r>Ru!2BIvMS;`no_KJt+Qx2_d+(+t&T z(7*gZ-RkO+E<<-{l82rF?uVqU_avFR^!D7q<#rsjl(Ex;;+6+AN+&VKt}=Cxso2RW zyl}iy@=1zGJYK=-E4LMODJt`$pl%OQH(#Lcv2&`-X6l}5Mcu=O>Q5?IS5KC;?5u51 z7drD)Siq0=Ela`Wv5mASK9`~Dd;O7q1IAl*({x`21bM{^~n)X$XsV9H@wr&N# z@UabBiw;IA7mhu*ZP&ZqAwtte_ZG8J73RJ|V1{&WCBTIqB_8Zhg4{Xrh!MUCcv-wN z@X|xBhJFwbPbpr1yp?$S;3ZvF!Xt&#Zy`QhH(nkuJrs|&cx-q4KwRiH5n#k?Kyb1( z-w|-aJqR!D4GGR*PZtSz0Q}?dLf1-jeA4+51iu9@;gj(^4mf0;nbmlSUrvT+0#0fM zHsGc2$Z-4=bW6>Fi!uqp7PVOohNLy4tz}e^e?`^^bw^>85KmC!Fl*(!tc+Q!7B6ib zRaTHBK<}l_NeFmiSw?2m|5BsvZS+grrS++82HWU$x|73M_sC+K$Z{V4wL&H_M9yV% zynEOu|DUFF$>t^W3y#`k%ZK3f@LMOQ zZTw5g58B)&{J=9BZ%cnB`H@>$A4d=PTk7E<9eSXr`Jvw}{de@>+@swxv(nb2FI{|> zYMQp40XkrWZutQ1G^8M=S&0mOw^SJeeK9ej{ueQwe2Qi1-p(L{^*%*br;D%t* zr@{31hwc?IOte*50{L7Ddr6^PkO0}=^GN5G(lLlD%ifY4u3&Risf68QHFVx+pz}rx zn}!~+ZRiQxqh95=suV?e&~1}}<;ix?mV~@idYPK?eidQU0UHn4FG}_PYAN1lfQ<(1 zx>5uEII8_OmE3-8YWDvO+1(o`t0u_rx?w|+%F6;fjz7Y`ueS*{9+{?VUd*ANyqKn& z!OWq5LZ8ep$op;RdbvFmF7&(Hp6d~QW0q(54cK!1d7W1{(x6PV0xlEE;%5POJHb{Y z;g|E>4fMRDu=(+D--ZnJ3I$X74s^djCuijsf~*qRdJWkBr7}>Y3%DpP*?$%Bh~X`9 zeulb5`|*DZWh2_BYzJGha{QKQ#X1Y1dcrquJvkobI}YVM7Ui9YavuZP=h5Z2l}fQb zs+d!^o>ai*G*h&%m$^Iw>7eiCP{S)s`PV2T4P>c^j$2Q{?qn5ncN)|WR(a*&NOy_S zA|F!wFlClbRF%1>WsO-Om<`A z>sBi8vImG>t<;_daW=nkC}(OXKQ3Sn{Wu;k+6Be=h3dN>`jphZg|>xuBKvPpINH&l zQP0ogU4>T;!)PM3JvYjk>R#5DV^T=%sGmtFH#cPK>055J7s181F!uPnl|fS5=qR~j z+o5)bIn>|1aboxvPnr&0MEbABLx&UEIMvHfQk{GWo2D1gUcQ!S7us%{Zw8>BpT~E< z5c-GMj^>~!|IF$WZw6DbS+X-UZ3PpV(5B>>~+ftS; z5%U7A-{b!cS-KnyrvE8fI*cjzw>NqNQgnf}zPx{OkBPoLCj3{2j+18J-g$b$(E+>0 zFr110=n1O9w9!74S;mznZBY7#g)2;TTWxIh0Kq1yCOA^I|Ko}nR5m|b1U?j{_HcRo9$+HquB&cX}OLWmGtn297RJ!l{u;8 zITVh`#Emp@TBUlVN9D* zvs$}x1&nIiHm-zFX6eSIg&Jq)zq>krZtD!gTD2^X9H&I-Q+iTI@a+N^@XWY#FS8@*4-%fsBnScih|5r(il2mP?PYUEGj2 zJ>Ti`QV`RnjxE)!-UnjxR+nzH25wxQp0dAjG{pCN`>kD zIaw?1++3b{Yf!2gIb@y*BS7dy?E7X5$B3UjQnP;nH zhr(Xk4y6gnVNR@)9R?$61qnlHfz2N4Oc;Gwo)<|X@WUQBIZXJY%}Vw)RA=BcgT@Zf31E!X46d$^Ssa3N&0Jb>aUXY=S@D> zc@lSX2IZnmV7t-<`u{Y}9`x7~8zsNMCO*0odkb{A~UMW$UJ> zbkpzFP5)oDZt6-@SlGnWoIPS6uVmdCC#0+EG)(7A<2IZ@4>@Zxa!yTf*4{gk){MtK z+i<=b?ELq|zi(v&*}d?Se6?`p(2*-MBI%2g#S+Zx^$2%vNNYUStw&s?r>9ZFk0lgz~%nLL)z0IM4uzd04WAq1v-aNdz0gEo&sVO1(P> zK85wZWNiu)ea1sK@#>nB(4cXCCcWT{uW{&*VPoDCjGjKZ{^Hl~JoZ(PPdQVLB{`1O=v>Lh6hiDhw}&WS4*(uN zW7$;YVpd_nZ}IF2aoR`BX>VX~;%WmF|2bXxkq})JFPt=CVUNcnaO$R`&#|l#zqJA+ z(ODSL>s79WB)&M?0PswAOJa}EvmGfXVjfKls2Vr%&oONZ;gj+?bFq~H zcAmk5^+G~~wH${KHXOW}7(5Ch{(AiDYzq|uR1Q;*SwR@x95oa6u1=$AL)c8mXuVC4 zktMY&7w`=>mUEB0!%OdGkH8O2M`s$>y3H*fg73rB~t2Hy7pPiYyXfD4Zed)4! zix=^tO&mTk|CJ`swna zXrNC5OxhY?(sn9L+UB3CH4YvVlVGb(v}DJmkrIJ_T{Ub)nr9!<@oEk137O)DA1l8M;$B6bt{-oMG7L6jsrwmdfM)A8tEtjKG6Uak(?5 zjwPc~{YQoSCybru9TLi@#+<^yPyEz$AMx+mHEdT{bR^GQ1m4*`3mVJ7Pi@}?e(LUv zk|3b3AnpmfZ!!l7X4@u+(uQzr1NU*e8Gdcxt37HgvplawZ!lN`k_XjWxH-mid?%Oh zY-=xWnVnx7R5o7+8*H|2w&A)|%R+x<&*X&ldtIUc{VT4TBNnjWAG0vO^iQ4{1YRhY znOPfD@l7y{+|6O4=H*;DUAo)?b`X-rpLg~!c(wllUi}^F(#Z)Lbs7aMFfw4aP-I(@ z{*ZkfLd0w*aOhQ8xJqUY`0|zD%MZ)5lqv$X%K}9^Z|<4vqqW8grM6VV!_ch>nH%W~ zQFl-9c7N)bWq~oiV+GAiKZgsE&nb2YXbNLZ{Iu5P2f<`_l3jQTT9`#cbzHFq|cx~dlh6ZU;M zY(tfG$!tQhf{;`!5|H?)AtaswQSi-=Ro6p!0w#>1;$X96q;L3)imxn3ODX(_yZx(= zDxNrK)*mzmE-K71idO#yZ?zm{mLU8X-{G=Ne>fJ(6GoEq1i$W*dBfK_3>?<{^INBW zv~DvD?eV&dR7VfXhTtD~9b`OGr@-9d1*m^0RZgo@M)@4GKvRHd;`O5r2a!H32-fwC z`&5gz**Z3`rAIm#N@irRh3lCP+;p@hoeC&Vt&h>>5W9-d4m{wtYgx$nk#@?o3Zh(wWn7L4acHo&FBjao8M9OESXKx$8(6%%v)Tp%Uldm%j)9WbloxuVn2ZoPIcM@*VGtB|Fw3>o$R2W(>x#_kuWm-`TyNQC z>X^YcI(ffB-V|@sprDxnRLSzDA)nYq7~eM4A~r}CnFPdjkt zH;0+Uuq6ni_9obwWNJND8UJY0z2$Y5Ic(F{dfl+TYcqW5HN*Uot;0XDtq>pLgDb~R z@O%xXZ&Kg+6?s@W|ohq4@MbG>IX8 zHhL%??NZt9u$2WkHZ%f^;u4(r;8Fo6ez^#|Ep0^F04IL8M7)$vhz~q30NxG$RJ21w#mrZ4bXNeUJiUgO=%x5X=WW0>@E^fTWh3KJE5&_tHDI)B zlHu(Er}8A5SF}fx;X!~?S$&R|)717QkE5 ze+_WT{~rOT0bIa?? znI*=UbI-7)sVm#S=iD!m6nIyvS=d<2dt$YaH;~$rPf;>!**br%Y@6N5B20<4p+-X7 z20EwB_wF)i`QNhn8Fd%aCt8ij*p_)WC+ojysIx`GX`LC7U$k}0xhsa)blT9;+;-YT z7b;zBJ#vWDd}aylM+QnQw{-(*9oVJ?-7}CHLz{p$ZRp;icc+sp`(DlHUzkU2)sW=x zAh*<#WUrXdc{27kV7V)B)`Ap>Lm9j=q5ZgXOeqWa_iwDAIo$VlM7a^X zQF7gI4e(dMrSN?coXQt#fXGC+M9)E#AJ%Y@JK;hHb)*e0)=H5yCu0pE^HHna@KaK! z!-gYm!`Ea^VQ+bfB{(U$vV2cxArW9YEgFPc=+@(=wkctzBCBe<45WK;~PW zg738CqvjA!e!1Nbk;3J6_LdYbxBGM{TyE#Ir=;|9yE`q#m)rR|DO_&XA(CHihl3Cw zf6Wicg0%Gi86hqG54Qb6m(*$WfRT_JZCGHruqwXwK;SGd6Z-fF&XUTlgJPfM@JJ}<6; z?!rV9^(MCLZ6r?E)?zxxU>5BjjZ~@N}(;9)~kWLLR-)JsBmEcE8CC- zzkjpESp1g8eFl90{RZ-Po(J*$4;(O9up7&_<@-;|OkI#3lNOn|c+uQu?*F^(!_vOX zfU$t#@#3L@KnfAJiojSn8-01>Y2r~MDT7&3(CxAOnfcuEi9BQhE=Xp*jeAhMAo zKM&&nm+?4-#K?|Jh>W0(`yl@R3TXp=QA+2=Ab-E-LHz$aq;lgWB-O|#hF`{tNk%FH z%6{|H1HUl8;K4`<{(n02CI2eKCzm4A9Fhk==0Ro^Jb^%TFL?mMPjw^B?fCWEpBu9d zgV&Y?&nze9i5_C!dTdPUel5 z7!&D}U{YB~KK-e|W|PvSD{s%`Qm* z-2`)Mz|XB2g;(J1F8V?V`?E+#-$nENSS9hY^U5|j6zmc$Y<0E8aZTwT0UmJy5Ao)= z#Y6dXGdBjEM;zjfmh+9a0C@z2q1;%bnCFHO<|ee9!f@0Ly(3ud6&AMDh?oC8fd@YU zbsCSlHG_}(s9<{pt)iqQ&vY635}i%_J3Q05Xw<)nXWD<1B7Un^e3>D}f3P-iyl2eR zyhQ8KkkFBS8w(8Pt%^C-+SmR0gwc8Y2W-sL+`x#ih{EWnDw2!%_p3qZCSE+dis_c< z!OvOG6?ZGk#lJ6ecNO~kP1s!Em0LE!khP4n7{}O>c7!tPr!vt;`4~l#x*zuku9J49 zT40Fw^8IPT$;Ae5-;g70;_8IlRE2oZ3fY zNYF)RY;)zAm&3jYW9K}}UJ?0|d!m#5&Y%1{x6*IrR&r{oXN_PMfjKTq_u*Mr*^kY!W~=Fmd%M8fB6a5e%pzycR0jpqe#9BeJLo$rzQce128A zO;~M-i^?!lT8?ST`&ef5G0>W-jcpjks3gUDqasP4d)%)JKL5LIn5y4x!~7>~!z7`t zJ;*jp9=}|&4a5H5Wful{3)PxpvTd=UT3bvu(+6Bx{jwQwT#YRS3zh;bSURv^#RD)N zELeR;_p5Su`as8a3$=UHk)d!Y9Hg2=0xi%P0imnOcjZ`#?jS3ghw zxVomkVYCO`pZ=fBhlQmk_%@~pyb^SN#zpL7l=E$)Sv6QB;@S44W`Rqh#KO3I8NX1( z`0w&$d6w=xGJ#{l_88mkV#kHmj?A$6d8YVs%c4Woqgm*=DzN)?4_R^48HUSveN0An zs&aR=+H!E$)T5SdtY>y51BRS2MyAU9vv{yHWP_!FSHqsiZ1pC;RPZ@$1h5VqMV(;e z!@f+N9|A6ou0gdirjall0vjXhNkRP`1M3aBECEMJz-NPoy)f8IyPfRyOmIsC5ike9jRdT=k5bQu zD%gGWtzl#FEwb@)vXdn-5c+#EZ6I}vAJCHFlaZSFr8ahDaYvKak)T}Ij_kO> zSS_hA=Efwkopieq)dNvWG$(V^sm8R@FkoxfWmty0lnvZTybqcTSmH2(B_SIe4(vP_tp&Xn4o=Z9cxgzeAIFL)l$QYzRD`7kKH%&yv_}V3##L1rxYstfv?FEEF`o2 z-LOEX1xp3m*JB%oHS?n_;l(ozk*DH39W4nD@l8y|FWg02DGj|};{8{A6V$eiG;!j& zgqMy^ZsDaCEghpYhXW+&J0O=w8u^%p;?Y`)#bRav;B>AT3@B#xzV4!bhR~W@vOP& zi*PGFTeuFDlhHxweS();=cHz(-zS1_!YbcS-gQ&>uM@T=Rld2sbMsB-#Q)}{b*lr< zJ6G3oPN{&}To~Uep;`Z$(pgkQ_X`)x=zcMTLi*SDsrO5I?{bnWU%JMo_8~w2)9z&H z+!tq?;=)`m1h`j4c%&09*65jsMK`4qF8WqvDO~X0MABI|#+yi! zkz6NS?4cs}!KLsL32u{I8WSj-hfCkTKb7@y04SZnHRy|^1f~e{6NwCeAveCZsVWO#!q8% z%k;Tz{1nzQoYqn;{dexW9?;dAM>e@}&jRB@R_g2pvu0;3nDs>JyiDeP9Y*MDcdlYu z_Wt{(6MOM*y$xzf(%j{#OXu7V_kC}C{@weY=m7(xV|aSn=y|fP6b5#Qxuf~Ur>(vx znv^Xx0rPnA(0p~aRYeKl=6`w7;!hi;!6W<8=Y%^2d6NIF_dQyvrxHFwsqHV$jp)HP zc$**Gr{I=w-lDk@WY(-{qh?HN4rXLL=!?Pwy+o}ZiQHz`gYJ*~B)SU2#UxwX;A=)C z{dmy*(e6kw;zcQbH)C52t^E(WKgy#EAbM!}T8WipK zYj0UjSKqq*R>NHD8)3GWe(0*yUWvbTd)jS1^Zg#U+S?OPXWY77`I4f;6(0Us8fMA) zo42R2x5u4^J|O4<3fSKb`TbJa0s3~@@4tw9AvM1LwRE4>75a4C%9m#T{r2sE+g0qT z8?%(iGlx7QzfY>6hlwo$t#|J60+=S!SA^De01XGPps(ma2BQ#YZBR0A{fu&v>3xX- zy-H@w~<>2d1HD84^}vJ-VhiF%^kN(TC( z0{4fYekmP~G8OLmp!3NMJz@xNx&d8LH=uLrhL@yEEL74b20c;;Z>9Um0=-`?^U)6N z6Z?%;Wl1pfbN`0PrbAs>{{=4OJp=W1=^@i0+#xRbQS(v|#t#2}po#7h2_M}>-g;s7v0W%`7~6$PH;e_iVLUp)a0XhLwt6xuTr?(S+w)=- zNnv)ghV7A<82&+F;HIL$V3eRD{3f!*0H&|?$bKkny@i4i9X1J!?+KK7xJ9>uSX z+Hm^ph_Cy%TQad>?1njs^p_gA!Txc)ZhlPN%-o1wD{w`*A>5YBB)&|O+Y}7X2%j4CRwy8<&)BTnUvk2RCN%nl&a3 z*5`r(n~zC zJv~Q$_Sjg(uCB#7&QLVBAJ4pt4VG!HqL6MH|^O5Ymv-`-E1 z5-MV64y2)>j%YYq@8POp_tr~9?FVX>4EjdK=aO6hwXB?pL5;+r4c98;a;pZvnh@*+ z5_E*B!F5$bQPFt`aXWHiff#X*VUId7dDs z>uxf`BAXGF`a8oEOnheD{RB2`t*Jt&jc<5JpN_XE|l zvQBO5%B*7&Oyj0yP|$C#Cdw8exln+n9{BgddJ zliIJuxn(%UEH|(+pN<5R=b0-va;jXW0|&X`U>;VFlY7qVgD*7cZgH}jd=sa-c`}Q`0dK0u8|CnB!Vv>G#IxCm z^V!Gvd z><6>W(k3xeM?d!&l?GL<4|5OmPo~CvH`8k>?@=_$x|)=qgkqmd&6F`D<$)nNM;8{3d z5GV7^Jtq%=7d;sqXNZRm`CS#|Iy~S6zGHM^-`&;acQf%gb_Ay+qF*uS!GueEaY`c2 z3;fa~oC4UW`4X|)`)o&=_6cXR$z#5wkIf{E-ZhyyrRU0gD&{k*kCYx)W9?8ID8pG? z6X;Z}GJS%)1_x_-qQkH&9GnT|*zx3n9Z&4A18h`QSObX}Q#J<^0Jf92Xt;`j#LYDY!g`sY1m0rzPSWR@8p^p`y*i+OnDteDzep0cO! z(;iHL_vf=xYPYS7H6(Gr@nmO*_Wqabc1rZ+{B|3+RR?&oGh+8W_e|6B=PS?rWyQ_l z;OFV4J@dQnP5A}8{<)3L=Xz%2&P@r7pLz`$Own+SW!3fDBlN;*f`Gu2DPe>1 zFDzpO83Z^Z6F2#Rn^@1F={#0I$pV)?Ef2)<0|_BCp0Lfy(|`#+%0og6q8=PEK-34< zT}3_d?#s4$L?QbbEzb3dZ|Sy0uN5TevH5BrZd2-?szXct%H@n197ci5%xqis`B)`} z?not};qZb>7x=iw*tv6*YvTKU8R?q%`LU~WToU%!&aQ6PgiWm*kg%dd7za}(*t4tY z>{kqH0LK1~eJ>s1oOg~P@#~(x&laCOOJi{-hO8FBY!3M_ykK6SmcbC)Y(wD%Kdw4s z7Uo$gMj_kZNPWgbVYEdK48GtYgIsRQ1takw^tNSntJXUoBZe>7Ff;Nxmc>E0i~4Y# zPoTaL`5>T-^mP(HJ=G{@8iCT{hwLziK6oK06%0tXUO-WdZ|`qoII~RaAi z%!@pNL*i4P{Fz)YtkT=_>Wwj{l}2I0Sj-3g(U{un9r*eqDEAPYcEbfaok})JI+ZM} zt0Lf;U;QQf;b-HoFF!Hv_O7_wyW+0?ckGH=f-?EPdskdsP_@1hExum8%1~x_u8BKg zR*vK1Ms*m*mrid!!gZ*dr(;{3H*JfXk9~51o$B(u@sWz{)ryH>mcl~Di z$jILudHt;=n$JteX1=gAh0ZQpIBrVb{?QW-{?FbSN6HANywD~aCPgou`rwQUzqivIs0?5*MrsD*TgY|@`nyrh{CZ}RlB zew?{Usia**^h?nX@@{)sJ8h_U8$b`xn;_O69__O|4QR)hv;aLFv0LKIGa!EgWcKib z$k*%fVs6tOAh**74QskpSjDZw>K*w)JGuN7iyb>BtC_B3`8!Kz**^ZgrQ&-UgODM{ zCE7VCP~()G97nq;KR%X#jehw!4J}TOJ%jP+dtN_6XO@M@4U4+evy-`?j_GP_Tr|>A zO;6GZXfct@>x#~WXEn1G)!0OsR2BG~_UhEQ6e)NI1&_A{f5az9Jsbasqq$V#xIi4s zZ5%k!4|@=wz#c>`j)iL4qrw?zW}n8XF_9OJ)X_0ZQ26Uozl-K0Ij z233~^rmafG@lZ{pDq@u79m8gbsjoNz;pQd=82P;NFvSao?XjU=m0{ywXwO2?jbUZVfcdN+#uV{mT8zewofym|Dykv0C->*xjiw z%Vbu0?&#T86$%dgBaXoB631QOkgXvOKlwO_Y`kQw&mG0r9j2$Y5vuysWwl*VgMAcrYFTRp-y(AanMfo7aqC7w)0wABpdz3tX}A3WRg{+*>> z>B(x3CBx<~83FBpQ_+^#K7w$__4lg1B}PvaUE_PCO7IOb4g1(hX*D=e@hj{!U7lTw z(lvj0nMtoquL*vsJE#1m?I_v!=h>v09UvA`dl~PhBAA6DXvU7#5!lfhbR_13g&nw3 za;qL2Sx4zRbK)9t?wEYKVqWk*FYz3}=QTUupo}qUjrXfQPb|k_d|{lPXSdvC3=%TK z$jl2K>qDpUne^u8H6Q#<;;wwco45~hwJ*y*+$xlRMc0|S|M-~B`TNAoY`JUsuLKD? zZR7SPzfyhRD^0KZ!mk*duM3hHmi<%Z^t=fo^9R- zwZAia|H->m`+KubpLehJ4`yGhH^;V`{kE&azG^l5|6H9BbILrr*5_Q)pUol7J~x~C z=-ZN`UA5l;Vn^r^(%V$=zLMM8s3bg7+qE1&as(&fM<-R0!%DQU?CXt!PIxNs$?2f87N?67@d}eE$wS<(-tCdqg~)IO2?74Lp{~nJK_iIElYT#6RGI ze+zipRs1;c!=3ow2c8r|4e(T6NDfX($IZgFU0^>49z$b0{yOl~p?VE?X;(AlvljxB zAJ*Fr{;9}g;Azm=4Lt2)mgGkQPp6=L2|VqJl<>*GQ$6uUS#;h7y&CvX;6s7ei~JPt zc9B2EnIHIH0e=Vh9s+)%6aPuzF|1~afF~VF@zVJDEbx?%JAkKf0v>X{1s;FQQQ-0F z_H@dTX_Sv|0#9>KLi+K(fxr`gy9@sq;OTu&1MmF4(ZHifFxP-rNOBNw4Db{mISDUh zEc|qe+i>I?>iElH@K3{@IC1}E|NVX|QnFTyN3Uf@L=Mi9x;Z~RZ^hco>|2sk3I-?V zq~zsoN^>7vqPq*9my(q)q+oFIc(Gekb8^#HWx7e*x}3bM%(d92?e^sy9PZMG?WRM> zaB#SjVUHyDhTWx^Kwz z4Z*h}JvVn?h0o%__NZpg|y<6JD&r%QaBB! z{~NC8cbp9!PWK~iAo>>y9N;%-GW#nFH#~N2acg=?fg8G{4>GfdU~ntJt})yQkW_|y zvQ1~Wq1&qhl*W)OZWC#*$nK>$Slmjnr^QJfxJi>;+R&_asgh0@O5_lHc6oNCFqFWd z7*~k;qklDUoKxjSKGm}R_1~dFR=DbrL1jy4fcBRnX^~q*YdhG}-C2r*S2tIsu%e%e z7(B9pszf^RaWG}FLewVx-?hIw5st7*T0vb1>T1~C|1FClbhgN$Pu1UvcySGAAl5;dfD?ef zj(4PR7ev?vcnAE^fM7|Yat=6;@(WPeD8gD1nnh?5p;3f-5i%m|MqnYl2x~=X7NJRm zMiJ^o$cV7pmJVg32x~=X7NJRmMiJ^o2tXo~Dp^#tLViGgQ2vTsA-}4)uDBtTi52+o zY!~<_n8^-MvUe)QGts5;@G$W^(H|f`zMW*x)PZMbKkN+zJ3+}l>32j2PV$c>I)2l7k$k?btVFP1~*9>^!ZRKLw4zoakriTsj&*(>r(_4%?G zzf?c{MS7Z;0Fp!UlSF^MC@)_0uMznr{qYA;UWG`1M+~nQ{WL2>@+5suvqt1coe*5C z=$GodL6p}GNDgFyU#jn8MSe+t&lTyCzNUIY@}>HlhG+6hP6fKN|1#dk*-x`M&VD*C z*V+F$1UdW1x%k(D=u97_={Jex@Npuh&l(&c%%|7-r1?E@JxhnLog8I!!X1{?FP?A4F${ zoEiF(oaCn&WBQ?q72FTCn?5JXA$jx|h6ZUEN%)a=(~=xo(IrQ#AkI#V#*P}wZu+7a zz(`9na4TKp*|3iPL)lG_8*AhJR1C6zyd&&jPea*FbJXC$)r#rFk$SX4k2#L~qgj2p zeyr%j2}7b`_PZ%(@Fq6|5#^~Y?vjx zXuIw654W4vOETcF`s~{|kcOZ1*4h|Bc=BA7Lv^Hq+Zhn`tB2OnWoy zS->A_GyRu;km zY6BjW1%?#K*-3^ZcD%v}bx4N1wAJ9YAun_LigcJ>bvdq_KUj&oUuW&B++SZX5F6HsponD9o4Vz{=;gAum~wf2JkN^-pbfpq51dI>xXC{l9_#jM*VmeJ6V8DhaQ9i&5>uE1j zj%~zY8zqp1Rq%;!hS4J+!o$Ia=jp_XCfL}J2R{Z+afjYu23S~GzQS;$UyMtA4H%V> zXhP%3lpwL8WTY^7^QGICeiIk94 zh9~C2h!kg79FyZPh-hk6t_N&1sUFWz&CY=7xN5c;w&j9Jf0%0HO%I6OWUgGnRjv;d zjQ01HPNf4ux;0P0BgJnUPvvKXr>;rgoV+kjpOn5aJu4U`Y-_- z9ua9UOfyWIK4)5_0W&x_QoMY2nO>O&yQ#u)oIDUVR4I7g-lUEj78a?lYJ|yD989LP zI9hxuY^bVWLlt%J^f+^Cf~jnJDp^QnK0eN}a!OvrO7FS+=udM(!gf!bJX|oUn(^!D zvm2I_kx}IT~ZvDouz|44m*pivvQiBQJQdeyCG(a{JGgFN_lnQjD@grNmIo& zLLVqoYkm;}%PhqjvJaWQs7n;SpM*0?!7}TH`UUOw6MC<$VY(M;w#(wCjuz?<`Zf4Y zHp3~Z`?oZl670YeRPJ^0)?dv@!ab#caum^x*%SOPAnAP+7NNKk}kAq$!H zh!4|(qEXESRTxujmVd5FxL$1b_?s%DyTq*8%5Cr3Zua~+cd+{jv-e9}YxfSb&zoFt zca_=qB*&euHv4_Zg*ELo`(NTRSl&Fk&yytE3~4$6vB^Gz>LAs9y2gy2X#75FeG{)-|W zDy|=1jSo5*e6$sb!b$RHiTHFEya{+RP}v2%WS~MXve+DZYn+r*M*-B;aYuDhGHf(*hoHQh-Mkf>Vfi zK>(h~K!vu)6!lIFbWJk5=XO4D8@mJRvb4VyAe-2Te3E;otBlkDm_1QZ90m2N^btN97AT5>z4EW zMkf950q!qD+Hvka&cO{=q}!ke+YJ7nvKdKpXEfqkfd}8ZVXvX?Y%1&w?rb5P>#(~x z9F^D|hrJfNWe}_JE$Fwh9&xUv?qAhjbg}EqT}1Yp<<@`%Mt64GH1~4saXHn{A>;f3 zymq-#H62puP>gno_If&`$RRo17?L8RGOyTe>J{q?WdE@GsbeXEEE zHztwlwoM?uy|dYvlL5#7DZ>rwaKWKV)ZdACX^+hSI(4MTxeHGnA#(2MdV%Vm9ySEs zFa$kHq@y22Zb16uZFsloOB#Z{YzVrv58K`QrwtK4YY2M&5Oisux4ZZ&h6rCh1bwea zzX3Ry-3HzNLrx8delGQI`?D@U9~0fle~$e4N&67vUHlgEL$b85aHfm@Me<|7 zDD4x>hM)H1OXY@60}%G-Q^Miu@gu*aSKh-j`Ni_f97Ed3FV%|*kzcB3^nHoGjD*3_ z=?CPO>cJyoc&S`hivBbkJF^0i_>)9`i6}2#^!JGT`Jz8U^iw*>(O{p#>&XLmMGPy={4GHMf_4d!K2`p>cte1F6p^>B3;sJ>p-V4lA~|u?Ee|w-`T&-#s38YI@8Cy z_^Ez4)5UTwMTd*>hU{9q?h((F8sJ-ny`@QlbMKIh1>7XTxm)L!X(+1%M}L`Oa@m3H z=>NEtZ|^C)=eV_Hg0Khw$C)NL=Z{;v1Ltnx25!?YjTT7AK(hpwv71{d1ADD* zS?%A|-feZuYM1KN6L-sOm-|DQ?UJSL_|RhQoIlVGz&SHT3xL5(y1Q~InFeI#ug$r& zNr3Co)cPN77cj#><^gan_o?-J6Ui!oVg9pr0f98L31@~LBq#aN_xOLZ3!wf4 zIg&?@`@(ILgXqba2`@S9lgCiU{e5bZ9P}{+*QJm`+MpPX9XXU;z*;F?q_E+xxyZ9& z9sh^23%EAX#`~!lWG&6$-og!K7jW(lTVNyF8*X|_pPJobC#2|(D|d{0mu zb^*zE+9sKancC0-`0>YN;Od}cyt6l+lkp?xCH`mAV%~e|q|m{u=y*`?;L<<4cd@8PPDa-&I{Elvr93_%S>5y|8TX-*r_Ntv=jxhklK? zL%*Kss^OU7!i`Yne5Ui{Wrz7~OGp`)V!Q4R=52YOP8apc#N8-j- zrxcW9D4~a+<4lzY0^ea&3mL`;zZNDKUgyC{gJ}%f;9#b4n60!0w@tBwr!Qc-ZFa*b z@Q|%dcMj$~s4GrE@r3(wD%Y?=EEF^1gAvUl6Gq&SYZfqMInp8fnQiKxg5t@P@af1u z%7nz|1q_*ToIiryU;UHxE~X(!u02VK@y9#_xke!vB`KPYRO*+cU;E><9X%NANgDo2 zhHH|}&R4receFZis*9*x9uw>RL_K(=&{fnq)j(0&0isg(D{XIVPt}7V4{BZRF?!^^ zGP5whVb7@fi{Di!8u2oe3i^I=hc@iMBno8-@)!=^?yEgNVOay7?HSef(jg=hxoIR8 zWZAZ5Yo314#l&Xp;RSM8Ey#`}Wu@qZEHDELhi~`6m2PwY`;a_Vq%^ujH~D0vSuQgn zghSMGn=w|ze480qIEebUYwBpdu*c1w@;~uG1um)jFt% zEqLy-Uw!1T;CUg&f9dk#;Yat`7;q@%bFNj3Wa+;vD}p^}&sy{++rg^w_WKA0a}jDD6S2X1j~(SaeZ zOFDp+Yj+kkLx#OoyhB`AIw0szfvu_B0H5x4jM;rYG(1jV6h4P2T|e5EefN ze!z7}2Ljw%{2=@-Eq)H%!s15=TkCkY0q-5)u;>}&y%4d3PP@YW74wCwe<)w_0~S&D zlWEqyYd8>NR-V|-mcxL zhwgWJNv z=3kSZC?p}|R_VbzbZ7pM^iZBi)^60Pv(=v^fn`qhXT9FGs3lxwBk%Q0Xnfx6aosb+ z_$#yOAD-I{2hE;4ybkK?&ECK8YSkVx`&hhs^%k>lgBKV2irKH-D=hS|+5fy(g5Rs= z;g`KK*w@S>Z+ac~d&?ZW&zsxbU>@J;T`=qqh}~v|Lz_=vNf1Q~X;kiBmt&_8U=n^* zIF{o_j$jymfs}B#x4=g$Or3!AEk(4QPCUd?}2xg z|0eL{{}4ZCtCUkB{}mVh&w!`*lpzD1txs4e2*T@J@H!Dc%LPAM#FI6Tvz(>CkAs}Y zfTuDpz1Id2U+se52fQA9uL6&aZg&3TBEHiFe-8Li@R5}dg_Go4MZ6jX#Th>e1%^(O zmzvNZz>fv~I`EW#())UYiTr-32YM&`RN(1*L;z1~Y0`Tw0-oy5{lMSh#GeN| z`8NVT(Fy-7@RYvifOjspzXl#j5}X461^Hk+4m_owa735zjUt{F&7JY^3RXv7vx2TT zNNFakBjFbz{GZ-$?}oGC(Ez(6$E`U7ZIVDsOJ9|;AuGSXJo}ELLD8<(Hjdp#{n;hF zE5Cg|R)2Q9;UH#5zz$|@qaI!tLeXEt5;DgiqGmFdKgCf&J3xobdm1*PjAbDvAA((h0~QiZ(-Q zGxIj&xm+4VL2af2c*A%gLpC znsDvV4>eNimzIIHNsjs(5$U?k(m_Mr9)u`XZWoHZb`OppV1Ogl;{jGc5@A3HdkuGq z0iVGZdB1n23?0-G$zJpa8V)%~10uIq$bq38qyeGq0-dU{OX}^R-Lu%GNOjqr2sdrh_hFJn;Dbs|Fj4ZPN%lr+5MlgaI(EPb%o&2 zY3uJqyf~3QkZzmamL}Q<(y2>E&YgU{Ky^<7Y;$M7=m6s1Rb+lf^(O?=Z2sk5b5G~qTYBvcR}=tgaP^A zEz-x^;DGQ7bl1t%;)jvJ06N*lkgLUSFgn>wk#qO`>EJztOCmnNc}BoHU>`Le5JUQK z8a^Uz;gYF#HDI0jp$!Jr{;ef;|`cTYx9I#{sdmIs6#l1i&Ofl0)Sm zaGoA72dJc%B-o8e2{wwbR)l5|nnY+6pD45}{FqdJ!@r?6### z*(kzV5t>D45}{FqdJzJU2-txoB&lSzvI8=e?3nC0{x`~71f6CM7a;YTi9^wXgpSX8T?Ej4X;F0#7zu@BU zCO@Viq3yVj;F1^~bw_YC4MB9N9)Bo|?!Tsa)QMOVro-9%Rw1RmU?&EDr8 z4ItdwHjT1tkRYxo=L{NX$p#tJ_jV2B$eDrGX^xy3NV5+xT?I-xGcbslK9>M4Ug`Sh z0ex^+J}M~AU3pi!b8g&{kp$tRxrVoAjC~a5%3;qQw;c9?f@@H_aHnCWE010LEqLs5 zq_L)3Ar6LqV>Rh^oS`nu8FW0BCfKjJGkJ4NTtq~=CW|VG^npMn%Q@VQBisu$&3;La z%^M+5MTPuh?c!$6i4yM5ac38ow=yLwC3h_*M{Txo|5>}Z44PAiGed8Zll+(k7N)h) z)C%s0-j_38C(C3ZH;{LsP|YSi2CvLBAAF0L_+!{&sN& z@Kaxhn5hpF1wSq8hG8v4i?)vPGZ{Z}#794pPfH&CB7pw~x*G5aHcfy?HGT@SaBqzS zS8mANm_B{x%!oPtESsJ~`f1f6_D9@3@+k7;2U#`+%$LRP_KrQEogNUy1upWMzI1y+ zPD|*x_+gdR+L+z4v{vqDfIe=)cKv(o^raPnlfx$0L=+x*0=W- z^=Vrbd&VB9z`u(Xbu|IQl6F*kR~$&v#^)&#rZHZMM8ozDKXXh_M_|5J%E`dJpK-=I zMHNn9_u5Bam8_J0j;z0JrF7d$>9&v8kYPRt`?O zuiT9LamW$a$l#ugP}Oz0YT%!H9y1X1Fal zfIq9$i~0y%bKy@2v~LDfyqV%gb|+C#Le5 zfvU}|s)E|eO?VazIB@d*#v`g|cylUq3si*Pr^@G4bMVkrxjsWRYq`8AP*uci--4__ z_TtkFX8G{~Y)5p+kdK=XsZU2KT>#K)Hykm^Q`ET8L%)kY^B4v_0J2n|)p~40I-ys$ zRMhS>a`KdMBf1Ndg(Qb|KjP0(DzgVL>H0^)hFzdUS&wSo<Xv}7vF4EGL^mTd zk%ur0*%O4v)M(b9Po{gyYE6)#>@+>DjB+<*rO$o1UGY zm$^DSJU2amLvD6>N?KZOdS2cjsBqjJI~aP?zhuX_a(dbIsBzqa>1C#{aokA&L!^3P zE$)7h;qC`D?tX~H-4Ba!_ruf$kfJ zz0I3(Ptn0;=gwU{|HuceZ5MhMcw&10fAswiG{ly6g3?g$*a9X)y+I*665TGR9c?Lk z+t3+1$hVg+!ERmME-g(vJL8*DfFIwfS0Di4X(%VjBsF);ixYOo-HNsz;i&BpcAK)l zQ-+zc%!&?WhJLMC^(P|0rK@e{q0=r=Qla#F6F(v+;YV>T$B!IA(%&>SOzwC1(YWw5 zel%>g>1YQXC{f?z>}@>jL>|fmYT#&nW*B7At~T0rChZm^{3PJV0yh)CQ2dCWcJ0x$ zHqC7O1V0*sNpc{pD-D8nyn^u3gK^|;&dFc5!by}})+ zw}ls8+_o!%z9g2jR<4X-!f}8TF1W$*ENf@Y2v4EQZo)Iy<;}r`HU=g<9UH5{*QGwj zgom%qP0vaxfL6^~w=yLkx8US4;c1z9DX9oRhuwzLRC79zt5UL{e$&%Py{=msz9Bnh zV@hTg@gXvss?JMW6ONrDbeGP&h?$sU3}3Y|GcPkWGb=NHb9iPp-4vb|o{@z&yv_W(L60CKjD-9Y(N8Ogb$lYGokg;P4PO_!D#N$Dg35S(YW zL8VEAMiJ^o2ta&T_q4r&3LfWmO%g=wn9v=9V~OtM{|C`go27Zg1{eR=Z`!=15d#lSce^g`c3nTbM=_9cbb`ZJ1;+T z@O$j1N6t1x>B+gAS63iRY_7;nUln0+99K8!d3C~suHN>AXiIs)fLdas(f{MiY|naX zLEt36G%rt(+z*|XpE1_PPx2_*a}U`XHq-{Qjbi)1Vg>X|dTvTq#4G`^V#Tug%f+-1 z!YIly2~>tLp+%>uwo{HiI$a&j zqi5&k+tIG+J0i;K7CE|H(q|7SJ`A;PP%};_XdEJ0I zR`etNLdzafM+lEU*nPXMq5kiy+4`F+WH|Rtj`QCXI9JZ2{<}E#sqf=FPj|~1E612W zz(~Jl5^J>5uUy#|eD<0f~>GT!2a7L7P@n2EH;kd@VuYT#o9{948bc-wO}qnXSYjhD{1)hIz7{lf784$=EzPz&e>7yvjNFc2^ZPzM+cs0R!M91l1FFbr@K z;8ehHKm%X|;0(Z-fKh;R0HXot0V1ChVgTa-=L04HE(A;hybmxLa0%ctzy|@B13nD+ z2;ifDCcqTHG{AJg48TmlEWovZIe_Z{^8q&i765JrME);ijdLdX1rJ+@_xI$?OFf4( zkqe8MIkn?tr+ehGL#V)ey-@G`@MG}%em?_?FY^aV{8ae);}?J*i(d$STKvAZFjh~T zi#Zd&H{`=_Vw2VVwdGGo*OosM-CeFe{QaL9Yi;=-qwC7gMc1n49BwFo_-2DV;AZO> z^U~fb_O0Kp%dO|W|9&^)!z~^Q83%mx>U&;etpBWHtlzF1S>G%7JaoA#=B=x8&&fN# zi#u}}-!D9KZB(_VarY||I-Y%kHSWIrbH<8qoOn&nwQrXXZ_APgwC!U2+cq<*w!b$s z)}P9iZU2z_9LkV$J9^(_teJB4j>|7I)-`g?jw?K4&5{T0SS%mC$4+3?$P!I=%;~ilX`J96=UsY{HnIdG*$0m4fRuekJu7V{{E8p_=Say{N)J@f12^C>XXY4#TB0BFZ%fL zzJ(0mD_0y+fS!f3NUs!i@KsaQymik{>c`6!ZI@nWte5^^v|3*_S_MDe{St4qRxn)K zrMDSt?~_KWg7s><^angQ8?AkNjMjJ-G~`*I1>yFSKd9|6tJtBydtE}F9T5CpZP!pX z`eeGcKIC6-mC@QM=h}K-Gg@0^T-&vA!|M;p0;>8JG1iT8MOB(y(cb!=araso*Pc++ z#%tP)yFX<#?Td@NctfjkcNe2=kHNc4V>FhNc=ym^C6DjfFsX0^|1RrknN)m|pH}!0 zKW)wko?|r)iwphuSZm3d1)!f|m6ipdE&HzI%(hV@_?3*Z;maa5|32$$fzAT&D89Lv z_~e$j!t;E&W)y$2_#=UDBJyog5W|Ne?k1MCK=(B?|GnhQV)$1f9KN|_F?e>}#qb~g zv*b)3!oR+F6#r+|zhQE*nt!0kk3Y%yTc#Cv@O^W+`bUaR^B30p@sG=O4Uga(?alS$ z3laW}T!!a5-`(>C%URa2V;a_Up4t=2cv~jnc~WQ7otm0wqMfqyMp$B!#|kN=#NH}pZylPFVKnOBvfnB&U} zefc;>ZjlwY@_P&4=a(h>@}DyS4f#b~{ENw2eoc{2iTaCClR@Lxwu~zVNY*53C9VhloVm&Mz zWN@AD?OBPum-`^^QO2j?neALq)!G?TH51RFgex4*Pb&P7e+Tt*#&9*CiSqw0Xlp>* zNw71nDh+Ud=c1}~;O<8GttwRUoh2T;1>bvT;k*3Fl6O$nd>XDH?CYQx6w8sfftG^e zX5a%GP64-u)mTp9J1l@K8T`u%m3$WR|LPvbx~T9Z-_CkByjrZ_^HIM}0e`Hx1#(Ub z-{3gnI|X^i5f^=vb0u=Yf3Boi@Gmc91%GT|6XkV7erLy?4wC&O^yqhaXBMHZWf!yj zi4rBh81*={xQRbga*|I4@26`R>(?t8>+8seQ>?$`b>u}Xh_Y>Q=ZSIW z3F-H@^hEmBOR~SfJC+rC3bH@Jd)|<kqPySi(2_zb2$F$>qhGfth(yHB98A{WVAj|=*1sK z9zIamM(@#(hq$h)9;)BN`nTuF6jjv51GMU8ylos8A1 z2=YcVR!z}Iz>PrK&ht#sC_bb3Jl{Kxv1SyH;(NUr>)+8ASzFu*{3w1s+M+zPPh%10 zlaY*d7Q&51xJd}N3Gf?##<~U1SEd-Pq)Ts%FC5zECB%uA-!TL0CsOMMXjMhX}jc0{rP3PG?SMRX- z(I>ZDd4Q`=fNsP7a?4fZZ6eA&(+uF*C#@!pgdZ77ctg_ z2-7#)XuUF;WI@h7Mr#)0xZ*AP$02RtPh>|}u8fqPM_DFyw(jZmCqIWYdRlss*O#H^ zc0gVtXc;JX2@^QJ7v-WCW%e@qGl8sU6_xKRFF#N}f}Y<79(BQ=p3&#IY%yAW=ow|~ zGU^6H&z6Ptp2+8g6GjN%M^oa>CqidxO4^~@H4PL`3fjSGXom=&igs`s+NQ-(I)T0) z^(4D+v_Lz6I+R`bXMR@{wG)~K57hlv(SB06KJ=fwpaWh)8@eFKm!HZi8t(8j%jlcUEbQWwmTCD7i1UeMI{tFx@cK=_RX?KT z-$YywJvy3y3$%slpxw_{8$er_spT)D4;EUe<+mW+D*=CxG#EbV=ALv=4 z<*(imP_IRMra{~0f%Y&EZQXllS1&)nSTCTh?Lb@JhPJ&0?ej-yuQLHJ&t|NT<9Q9z znTfnf1y3G$-ay;^658|EkPnBEF9CR826;f=fkj`6zKs?6PVHqVGsr*uKg*T-ZO*HSItsgVl2DR-?|1}Sq(jP7{4!3mj4F$B>L@Il+9N<@2|QB|NZU8-Fnj1cuquL z;4#+A(vG;6!2eih+n&`ZQ;G9b`~&cNbtG090cD+uRT(mEl^5evHBC06${YFj4*G5H z7kThK&~MO*78dz>5q;$phHbdG$Y{++9J3KNj!{=#Lf<;G(1SmRFcZ**Zbo0k`Ul23 z1??!pHk1}B_^pL4{6w^)F9xdklSLZ--J(Hf7-**H$}OowrmRO@Is`s2XRjV{!7FggS6hs_%_s` zUqZM#^h>^k-cCXOhf&zKZDFqo-|6OP}2{91!P@o&%$Z+w{H-$a|d=}|R*9O)=X@!{Ws+%@S6 zKImr2nbF^toQW>!;0yEA{M{v;{Ns=N@Dcb9CsA)tGk%s&7+J$hXxk%XN=qy=qG44> z*B*LaiGE2e-eo`fKORW`O2)&&AnkgF!S_~E8O4&v$cDI%)2PpKODy;?o7nIIWba4b zgqQg6<4e?hI`oIFf3Ism-dGNx-|ErPv`3JKFlNZBKtBNEO-nV}|17z>;V}AnRrtd!$RTM@@U5a+j`{S&la(7xEOtp5hI42)YY?+>WY#CRqfW&SbL0~6}NdenjZ zqIdW_=!b)Vy)XOMAH;Jn^nN|kbr5Mh0{+*)|1$Vr1piLJD!?mmde-j*PZfB!fu{mI zQ}K>hBhlBudrw7wI28TzIO-PzevS5fgM7HBIslp zi~gRZi>aT1yhnYmhAyDGT#dR+eE<{Ur2fDnW`yNxB>EMMy5Snyhc(do*U+|*{=O#Y zeE5GQ`q5?x^f8HoeoyRd+>;797uR5}V-zm{o7_D!B{uN{&2G2T- z_rDZ*4of_%jn?0=epQ{IukU;x^~@%tQ>3ryJiVu<#Q0s}J0-hUK^HtWNy%TyGg{ZO zUR66#HsjG}ZUels&S;&_dRO()^CqJ;4$qTOFRnapw8r4M4Rx>`Iv}a&B)=v?30 zU%^;u7s>;4s%00-Mmy@)X5glk1PJ|?X(eZAEZGnR+$O}WDe)KZnvydD{?#HCzkt

    XH{h)#0x&JDW?10c(vWLcgpJd3{486NZ14eN#Rr=Mj#;`tI` z{16YqTKo_X`Hv#c$bS@hM*bzjxAzm|_CfBGs6R&`8?r1koG}@A+zv(Heno zdwBjx{;NOOo_qE@SRdNavL_;bB(FVnVowbEBU(2pQUg*{o*>z=|&^| z@sRO0_-MRG{hkoeWAK}VzL5-cEykfyz-Qq11b(OSrIQzPjmM)NBqVE8|q&lv$6gq`9n7^|J-OT`1|+Rr(+&= z3VVxs;qS$~Z~dJc>R*|?vHn%?JSq2V`y?)~K1c4|MsvxfjJhqA@oD><=1%3Bw$CtU zdP&Y5dXn+oQNw6=lrrp&GDfyzC8OB!SJtyFK<3@{`U5lTXCmA~2=~T{S@jzkP1|oU z|9hF$wRy`%x7FV{y?zp-Y+Hmm=K4D$>ob{AZS|Pfu4lq_TtPmr!TfM0>v?F3JZy&= z^Ui3)4qd)8sNR$4?>fhQB&(NP_0y+Lmv{@6; z&zl(N#ovK`Um*JR%T3<=pV04^AosBR34M>vX=tzIiiRMJRbFI*EEQ;{Uu0B(%7)j_ zXQOud0OY<1x!X{`DpB7g`b4BDG|-b*B8~-!<6ZQFR_nYG&wH5T^W@K=pIBh>LVWM> zE7Lpyr8ra#Dx^n}6M=U;iayDUkdN%a5n&V!X^1Nn za|~&SoBZ*RP5yYuCjTkStI}LGR$Ebb|A_GqWT3A^b5hu*)=-A}O#K$pg;UW^r69h; zsNZW4KlNpjAfMWlM96;(^?M5B1CRdp8D8CSipDDqkAdFEu72JdYa=OG8=<*kV{qW& zNobF#-h@r!_(`a1UieKyowAKT7FJQ6Jb1^<`a`JCj4pIBt;5tc%dn=3F)+#x>dn%F z@}J(MwbMzgZEf`)mb((l;_k3G&!@h7d_LA=U0K}Rb7YL{W)B$46jne~S%?%s;gf%xV3=nH>+*ClUxp4+SthsSB z0I}xAMFBK&-iO8Gu-GaR?hUmt+B{p#!m^)p#@)fe}~*MG$NR9(OK-uj!YwrUgl3etBz z1^r6j`OD75Ri^;gU@ZD2pb708^;=_TO^M~&IX%lC!g!|-;~n(bs-9py+iA`pYo=AN zu$uO2Kp&ZJ`(eN-GVk_-cSO}^5N-CH`h!?+ua(PA*WpKLJoNJB`qxm8UYT7`UyHhI zkw1Ks^v-GMnI`BNE!G@lSY!AC{)>X%ISaiL;8yPhLGL`A=FOjn-kA@*a~^tUONI|0 z54|%=&^x10cQMyKK<}J|-U)!-`4D<%xLsek(>p<=cLY7t2EFEm_@H+(JON4XP#o^` z&WEDj8SbQaMmXu6k3_u#y(H+Jvo3lk$Vu;fBK&UN ziWl`zf4y@KdIvK4>79|H-ua`bcSsMB-uXz>JHti2^P#AB0z|!Y_FtlRdSCXc?_0rG zN$+&atD}4N%bw~M%lN_afjTD!I*0VpcaJ{^9kL9%S1pgNc<$-n?oX~Bf3)l9gU^+J`LnCEL)Xb&b9$!7 zFI@c2vVX|4YkFM6xTf#C=guq7O+WhGwp5Q1D;6GST+^$Ff23u(Zr8SRV;BE>*RT8@ za!tQWa!Xv_$Cd8-ey;S78%KImngj6b#wJIi{}{vE7BA+98RiDs40BuThPkP?Fw9ML zHq1TQinKkU$C)yKx4d$&6;}=hcKGQ70%Tf6>9*-inem_M>a*VW8Urw3wMtXU8OMXVglN_ zqh&ES_BK7Gc($!OVc3J|If^GzQBy)5^Lhu4@NNUyf=u4;k%q@m8!Q5Uj7QO?8 zX>`&=!HAEo!LA5-8QmasB1T7sY37gdnfIx-aFy$q3kHk@ zsx9`{(N=CTsPZ5=qkMCM3Q@pLz6_Zha;lDO?oP5HeJrOcFbn3BT;*J6Q$a%|Oe41( zB#X$+%tv}1?s~#iMJHoI{(}wa?Fq&+*)8gIm+FGAvcB-bsu3Ro51+BYCt@^s_!r)5 zWa3bsKUA)=6_^Zpqp$fMW_+#hENwhXM6#zy}(?ylqVd3(#FnJ=zuzUWe3P1f|7G)$A` zQ-kkcyOg*V>{Em0GHxC0QhvtxUejtWG5g}8Y>6s*c;2gm~tn-((uQEN<~XkXfnep%t)NJg*_6tqr5t(p^jnn zKyaThflKSl0@aK`+T5&#O^>?%T#wp|36yr!a^@)5tVWi`7$v&}geA6*#`0z-dsLG4 z)V2qm??`H44F^8hc||5OAqX~O!fltE5{8c%p-`B~CpfJNw{FFU`EZWC(0YwI^ut|+ zW1KFEGU{O6I`6#`42KzM(djk9HAzq7_>W&3fs4iu2Ce~42Cg#cnxw>Ej4Cf1Rx9_2 z2n%BOU6Mcfb(gC6TzPV%_nSwuQlf8+ySun-#@U$JyPsL^`+QCL@m}9O+R77u-@2@^ zN>P62sl<<$ge};;y!YJXQ%&E5%f?PiovOJvF3a!b?B4gcTNLuYk>+vl{-7uyl0*KD z`|w1$XDMvwVqzXkye!GI)OzSv89W5G^3fggd988ts^#-K3aW8S-{Y_pPk;%#YDhTQKY`Q*BHQQVXlkprA8X48bn;sCm$y~Vt?NuNeOqku5P9?qDt@)ZXv^=#H zX7P2p4&ncW6dhXimeSz16y--XanRXw_6h%wH%IM_i`p)qd)rV~bJgT~t=ra2`F^VR z{admoTdTQf5Sp)U<>hY8rDV-b!?;hbrU+L&_KduWZc%7(3wl_g!M&klR_T9dUv+(e;71ZuWK%%oNdg zdgc@-yAIH$jvE#hsjg~-p>7;3ceSwGT?)(HDp>AD-8((b+?rr2o1VJz^)-2!kB_sg zoRSx@(t9pH`qP|{u-y|U51%#b?O8vc@$2cc8F*t&>PHMp7UID)G>DMf%18Ko6F=OB&RNfj;erxD)cbfGN?MD50uY+4iyOfmGWp* zrkZ9J_!K?PK?Q@qB0;#KCl5G92XoeF9kVwkW^eqGz4KG{E?B?!-bn#*?683E8IMoL z7-Y$>vcs1YdjuNq7j7EGfeqEn-iN=kDYSd`F7ymo=C?N{bnpGY3=ju#aix1>BlgBQ zOMD_=Vcp)uqk9)M?M*tp_r9LJi@yrcrjKLNb}6epJdh5_ReO}ayQNot&()Z)?yWyt z{u@Kc-~Gni6EmvMFye-H^b-HVh!IB`hoxyp9`PIbMx+0@uR`87jA#k@{;M&A{6&m7 z>y~oK4JD>mmmIXODX2DP)WN1vM`8ji?0-$Vnls95W~&_`J#?@UX8y#7$aQL`~CMN#_Iv4bCUe_H3c*o=IfLEj+_W!7ryy!K&i;+`+!1Zy(c+( zl+m)*-}vPt_cGcdy>FH<`1;CVGx8mKZ)?pGjbbY0>4?DP44H0D%UZWCXWH5gdHFfH z>sFJsyaT%-J9k}H*0kIW+4-4k)2E3RpALFv-p2Hm`Rj6Fj-TeQ(El_h>zCgg)*jD} z%UR1E@rnIS7A7ns{d8S5Cz2GZ83zphO{~wPj`$p7oYz8bZmKCz&ndg+-HfTJI5JMT zjV&`VJma$K0=viIjpP20R1&G$2MY)rq&8M>!5n%`&SA!$*k7`4W8 zV@+s6xgjd_T+B9;PfK@&NflH!E3n+ZEI5w)XG%>^Y59z(Fc6KJvjS0e*K#7JaaYYg zi@A;JP~#IZ+ot$l>OMjt=k2o*|8CZRSQC1){4R)&sL)ST2Hm~nT)Dg)T(YIzHm;;P zUxCZ$agV@dyh9mu$}~Kor%R6*YlkQH2+4WKuvLgLwI@J`F|aCT+w9t{KZ%N>D2{kM zB&41h`ELTd>`^nZ$8qOUYkD+Wnnq}RDY?ZxBZRm()g!i-)#ZZyU2R#zz6qRivW#86 z)l@t7h&h=&Gnp^+fd{#7nT&EEYdlQqveF%mI`dQ@Z?FaMs1}&-;eM(=Hs2VdeKzsx ziTf_J;AvXm&9aqz;73uh&PU99^QV@SgSiTJ?xOylF1& z*=7oFG(8i;m5t#3Kla`RE~+a3AHR3*a2a42MnN3}@ghFp12~`}D%j;gMWe)r3R}w= z1VdAtlnkw{I}FNLtczwvZrhHowd7Vy))d4(lyhO z>7RtqKS-y-54_m$*IdcX%oK%Tg1If!SZ_I5D7jrTMb8e)bF9Yku4IoYza~(pZ|3+C zT}rHAjt?`{$DZ7aMCleFP3;ODRigWj)31r#5hwKM8td5D(HYEP(HVBiCFl~2olPk_ zLY<;c8m{YJ5*4A{AJF*Y(=X%rEgjpYX`fr-C>IWkZ9hG2N)a@%%#A|lf|5LA#cNa$V9a+yhkPK{exG@M9uliN7T>H%S2UAh)wp^RLlLw{nUIth1n`mcO{RJ ziTcIf7PY1pFOrEeJ`k=F<$P_YOw?n0#;8OsT{uLpsq3yU^fsR~X)-$djlz?Q?o)}n ze%v)OQ8%mz-}Zp8(lufBda-$tky+5W^JdqCIqSuU45qZ?cyXo<*WX$`xvgXV?3rB)e$oA^liec;rs9wH zj6S$$LhA7&4Og9SUOZoK4A3?R`jbUheVw&<)4|Q0^Zdd`OG|V^@?O3F&CoGJCv81` zBqKZfrNy&nR<+c2FZ_TX8vDT94^QWfdF=RvpGPffUY`BfX2;G)7S)!Pqz+jg1d8JK zOxl0^h<)DjmzK|-dAQ}!-bEkqBdiZB{qS_xn5ULb(xzAJtIYe{xGpC1jjT=U?s!l# z)t0rbtNqjk|HL|z?4Mj0{~3i(uhYrCXI+a7?^stXhdbBh$o@xOye=Smj{8tIyYUzB1{1cXwa`?2RUiLdIW#lu>>uc_{ z2a88{d}g>e)Vx&3gzB5ijj4fW9n>yw)Sq@Ot_snoH?&3R(;M5S1;1FJFFPrvZkL#+K`77!pk4b}PlVaCtXWzd%gudB-_s@g;rh0r|zqe+mJ*0!FE_u*YZ!rkdQj;BV-dkPj!%=QcQ3(^WcQ-pFe?DJV z92qIj+s&lme`0=zeqN&BDQ8QzcI=&>X!H!vxmM?KEv!2<)>FYe{X_?DFLWHr1+bQG zhp)NzpV~hz)@<75(Y$l)*T?y(VpRG>Ngq=$+||uL-w<+Y{^DT45twKm{i3y`OLOGd z{hAh!J>=~L8{JVyJtf_ff)ndeTymL5^VPAa@AzqDp7NgEA=B$!cXw&eFNrXl>Y01G zD!yG3F~!t!y%e{C-L*0xb?Goq%W{dk@6Si@2p{lumQj&z&6YyuzLUGzt()`Oy?Q1z3t4ALd?(ROw5TP@UM|~1FwQjWXpq`&}^WQau{A529b#X6RE6n&)8+Sx>gq+hY_QcI&9rlnO-Qu3Oc@5?E+C*CTi$ zd)$!Jq4u~Lse8(~AyIqS?2;Vb*bo~j9z-*h=I~})ArqR-x8=c`&zsE_#=*)S$MNPD z3Yp(5NnIpM;^|OV{#9ZF2PmXja=nI)9*Zu7IMv*t4Eo9!n z|LKm!h-?*k8{O*Y_UtxK`Ih6q@75hVU|~2tZ?09mcndvS?SvOI_8OlG;mvIThw|o5 zkfPyHG39q3k6IqI~puF36z7i_9oZF?;1>Gw^V{ZA)b z+BG*FpIjO=t&HIw+{5Zy7(P*&m}Y%EVtW{$STixL;qi!oP#!bG%@cK&lagnco!Jqp zTNy+F;eqXpVZ{32q`W{=>P>AE(_?>Sgc(13+_puFJrj?%|0-hpzCG-dPi%6s`V$)7 zY!aEKL(v5c_gjfwe%~|YtbU)#{fGF;pl>JJeBW~b;2j#VWOB1-p2btp{8V?v?=tlT zT7H*vayt8T*N!7gBaSc9nx85i%bSg&r#zK?a&ip4ZrZM=k4lCeheql(E zJAMJZbe|jogIa-#j={kpqkleAJ+L+zHygR#^3l9>n&4tuK@@}T1HCvMy z72aSL!h_sqGu=eG<d&rwthy8N$QOncai6Mz~9!*H1Ky6w!^+o${y2@WX z{1Xm(BUcyEU2 z6Ib)L{Hc*{`-_Fl?&RIlKZj&LErcIw%h z{$y+TkqOsor_S2V9PLD9JsTdBy6)PJ+Sx-oKFZcqH&JCRMrF<2Exmp&+pO->$I@#y)+HTvz1)2`G_lR2p_^PE zniX$F-L0S6m6ZOeBP6ZfO*a<}gOm-8B+#tew^KCVKpmYc~orn{leIe!L0! z+VOy{54!o=vz|oQ1+aql^0gbKnb{$D(akEF@NqYPXOlk0&3s(Qa0WinGAFJ5LoTJuHBevJy&sP0@1zzLR z%4_^h$#A^J&r9t2IpcYAS%}Hq_9Fm}OKit|$53{SsYSah+tb4BnvQN|n6my8zOMdA zl>5y4sHdN!p31IO>Iwf*Ph!??cC3cz{bBXwI^P|0Bx`-N$<6pG;O)g5-E*?z{p(5i zuABd3)+6yIw_8T57rTv@VALc$={}eJqz6e>i3j8$I^MuvZzw$fqhXwxs-F0(bKK zqk0Q>cd|4zj>~ucLT@p@%8cBpcQv#yBY4yPf0(pxO>c)hUTRc6yedJp$1GxvVI zXZ5Shj)rlZiQlKUm`anSz2mr?qGV}}>s4l7#ssdIw+Ohc7Py+*lBHYQUd6$!rWWSu z2D;fJamyIlB3>W1GOyD9&bV^+W@EX1%ykV6AE~!gD_)*kW@D%D+p@y=GB%9AR{=-jfr@~) z7kEl8)%V%ovFu>ibh!iSO)UY%%!sZ6X~OveS3J7X%C7s^M}=MX1MUWKhauWjXBD`} z**1J@+V!W!O140dDXrUOU-O~c&W_@fZQEmbr=6kFGt&5dPjG?!HdBjxn9C&a8hs&3 z`O;MUJ7gsl2;2=d1(Hc;u5RE)bgy>JtVO66;O8Ge=~@DpLCMW>{UWopd}0GL_jxT> z+dNcX$SxRe^WFjtAeu28q1y|%jaiRs{|tGU#wJVi0T@|~#yD!%dqg}rhh~Nsq<3Wp zCQHXhwJ>uF1+M2wM8^T}m*^Je=4}F3_Jv(9JjN$W%K_N5N#I)E10XOsSvnox!mP0& zcm6iImC@}Ux;;*}Cj@Rqx~<_y{I(HS@y-VVIMZ^p1iWIkK^ku2w{Z)3XFkuFEM|#? zSL%yfg}AGEXH+0(T5pyb5GVOs$+iz|eLs8POSE&0-r|9`n&C_la@`$W}IoV>;Sx+Q{rIqEK65UpPtgMVLH{ipPbyFQ8S*c|roIN{viA9Z)>%Zlu%OlHxS#!0`gT={6kU3V<)`uoC$%1Ht5)<&ciSrrag)gO{c}=<^!f9vgTY}@#%&{v?uox@Y~q{$9-y_o_C!}5d)pl> z`$+j@WOW(|f7ME8cL41x?Z~drDk9~pVO~tv{_W9S&Wva9y;;w$-Z zB}5p7aZHG|zMO;OI<0;oCp7c)G`JvrAVnVw#F`?bF4T(LTa@#q*Y;~sSHJY3h{i#vdSlPkM*H>}c2G6;_dXTw(P0%iTu=GYi zQ*(f|8LKy=Uid}m@fkU9S^PqIeM0$tLYB8I4hcL89rlNR#NShXH$b5s*NEfj@`>SCVCOwXMPuZTnCvVNT zJZ({)F5o)vE_GPZQn%)@JpFrl#&Js`ik6rjTN3@=5@FoZvD=qUdTD85z_R3d%Tl&4 zoBh(VxwkJptYj0`ylb4gA>QTP_+}fHY2P=`v+&Eb+)KY?)xG9y-(K@U;UlNriY_Vs z#=>U=H|{c-c&tCPA?u8JqqNqOQoTdKKHkZOD0w4jt1+<2yN{RVQ-tkT-&s)H~EIv-nn)w#@Q^Z#R2)r{cHImbc9E+70UNRIM#g z-kqA%(cs;kvJN{Z(UzHQd%C)hSKk;T6ZK4+kEr}kg{a}*sYHn(_sB$@&Wu-yDv6Dd ziMq+OT_q~9N<&1og*>Jb)wzACOq9DlLM6&$3zmsWJ&1i#dB@Wlz0^)bnJceTiK=Ou zBop;vTd-PFrNseqO^v!4^{Ld9;g2#=N3&8@qTb0EE)%uY~|_rwShm9 ziRxlUs6_QhAu>^OJAFirE|rPu3cOh*s)w5@6BXMYq7qfzr4TjNtr8^;^~gj$QsE;C zwyI>J9uO+knp#xN$u%|feU+%fL!g^vuPAnT+p^1X_&CQX*w#+BS>$CUiHk#$7vUtXG^hr^tPFHzT~-2=a@Ex4={t+-(1^`gJ*1+IU;W!=9j94#uB=~fZQ{(AB;gfq5IC1b7;TnUBhJ8k0mB}U#E|V(dNvs!@H+q(5RL+z=0-K2hX5yfW_#&X@t*-a8E|q`F9c^Hr*+ngPcW5! zuWXfUl(`9Tw8gi?FCWZ$sA9}>)!Gd(^h>7FWmCSz*3GLnZ-BktRU0=I7Hvu_fU(_M z*RS1Ndg+`ljUgL1Rv5->*A&TIWSI2bRGMfruT53Ys$Qdv396z8^WE>g-$T$?go&EOVqd7EKWSUGa6mrNvCZQCkmq1=$} z2N{g^9SJp6wwyY(j~Ug~1KD}@rSLY-W!CDdz7OtKt?F}LSg-wKycOFY?5){;C8$-a zfcw|2n#V;d*O%ym+P$1A>DyyhU9`)h|Mz$QZHBIoLf{8u4MvT=j^O0V5HnD`c?{O^ zus?l1RvyFF_bC2NUGOmmCe$Gj#=HbQe2k3=9mo%3-FlDW-&7Bu(mTEI3NO42KBZ5M zQqtF8Lcv%mpMMO!v0MpbApG=r`1q*E)hT{@J!r*zlIv9b^g{R;-*PRApPmmNkCMAw z@zZnRBWw9wWBBPJ!WcGlNj?;QI)-DJUYa*R_f7PT1CcD*tS|l>1cXsEO<}ShsFAn| zPNQ*ZYBjjC^(;hM3t7!_i$=3NpVj0n$A?%ht4YhzXwpP27eB?U@z6Jxbdrre8eC)%nLy?-zcmUzizW6j`MXX6gv4 zjFYfQ?LDzmg?k6e3nP3}*(L0P%X37(2^qQJ$W`m=TUV_vzID|a*w63H|01L7WtH+n zY>@j?aLeu1P0IPADYE(T8O-{uyoKgf@L_r!XO7At_3Tk4o2E&N0XtwHxmXya%M^cr-o_6gf6^tvb$XS=8t&sDL={*c6*gP zw2b79lD$jW`&RSmf-ESxRxf=@=)(J@?0r`aQPRBUO?uS(+!yAgKrU(Tn+$Kmx#T;; z)MAjvaKIGfc`?k8>qGH40F+0;?4b!`620MS;1isXX$|i}SP$QV$xB4Lh2Vc4E^;*3 z(?$6ce2`{E?7;5(Cgxc8Vir2$nkT+>FtU#L_g68b6YkR!XV|OWwlEBaBxz_UrXRBZ zy>?x3>OZa`yTw71J|ujyCv9gw%lQ8L<(+^dyhInPTjt?(SATnFCUi(Mo;0isC{Z^{JL>WHxI2vf$C(zCO9z>bN8?}7 zO}wI;XogsQy!afv9HxX(H70?HXf_gv=a-$rg z4risdakG0ffx^xPm*I;x(rAQ+C8=8a>sC_o`mEIY!IGQ9KC~G=$uo4c@n7c|&UG1} zYB`WbAZb{#&{0ZtbF#*QkC<*D>}jn}qRSZc(vjbg58=zs7a%nY9%;_-{?A-;dsJZH+rzx=iP)B42cA1eCo zjZ;1t`DwM3nyO_4Wj>ZQ3U6~``lA()GL@4?;f?H%By}$f5u{Q0faA9eDFr%t-y`rCZUK5IqHO!C7TrL;-zBMq6O4UjLGg>GW4vo?Vzl%jd zpZ*)< zb6MCYcpdR_SJUXyE*S8VO%viroo*oI^W)Hpx5u3J(DAqbU}M&pmSE(Y{fJ{uYu;F| z;vk0DvcR&MCArwvo7W}YqX*VbvH}8{jIU1x~%;2?T*w|ypdVyZCSIP!D z&2b{wRP|CY9q4-p=uvc{YV0e|V!*>dg?HK<*Kj-o=jM($**@wW5Rel&r_Pan*b!CH zlv*VZqV)~4TAJpZ;L=)i4$H?02i_(t*hl{D<^Qn09bWFO!heO1U2?fFBTgqKmoqpR z(+%&x>0r!R7(>Ff*)p$O{uX@gdzY|IYSb}L3^lRw!oI9gftvW?bwFcCXN$f`WSuR( zf+v21vg6xdUyETTYp49pxDw;j5VpFa5oc&B8}@>~3v_G>_w&LRpS~PM>LP8(P2%klyu_2T$#Z zcu~-<3EBa{dgEyZtfXM0))5doWvwhPK%@DOb}V=Sp6slGytn3)3!v|~gY%gd!|l;J zmndo?Ovwe7Xpl57&xmb7hVbbdOqC;`G528b#Si%OkE612kf^+mcN_Ad?>Xhb&vycH zs@F;ZkMYIsbyDDS6aiO+aepCv@JmuDEnU$lkfL*OQQ5S&NRE7(OH2fW8v`Gor3~$D zVe0YmuGDzKA$)S{fP<}18He_!X!%F8c_rYqhd}#R`0P-4LR0Xa3OM#jnIc^Nyrt&> z9|PE(xMFds`TP~|IE3lDp5j&bdB7(k{0Cg|e(-U4(3uFok1NFsXF<*%eZ_PlF=b z)?#C>plEYxzg@fkA(Lp}-Kb0OiTYNNALplUgj#olb699w@DdnXON%xSj^bZ^gJWK- z{svDq;6AC+N&W8sZM+_O^io`S<-KogZ)Fgi9IcPx@Rs*=72cqCyt*L1>JssLFA-mc zc+6kxi4OQT(HKZ!8uKVD!3W*E#p{b+U-0_yhUPVs)>Sc*sOm3j9c7bAW&VCwU6_#cK#bu`IQSgqg5-mqGq zgi7&h{Z%6DmmCLM4m!N}y-1h9l*cM?1_sUUVsG0e@*ePY8@!|+!d)1QWSObpV;}TA z+Z0tve1K^w%ErEYzZ4%}W^ziZg5Hl0pb}BE8i&OfY%KG#00!Fsx6s=mQ0dCteX>u3 zDsc6lN|QI7u&P;b>4mdzxU5TMfCcY;wOYgD2VTQ z@qgm2$9~!Pf|uea^my|Vy=_&7#T8zA#)J9;-v z21|i)VxOTNd1EZ|@e>G-F3O*V6DscqJ9RIg>$j&5d!+Inf3Lqs4uj8tGE`fV^wbe7 z@*ux#vvvJuYqHt4asAe$Y33P>KSSUVG#o7&Gk*X>;0Zj@{}w}lDsWJSK<;L3&U_}A zHulRiD#RfD&u3}O@$-|{n6lPsUAor1$=o!@JE9moR^H&RL1RVbdyNlDup<^Pa*a&q z6%&M4Ob`yT&2LF=q?aU2(iV%R|4k!FqZ5?h%Kgi9Z zjd>emq%C=D?OO)hN4L*Dku?X~`E6d)S!sQD^gV`l&tS6R#Ydfa5c>t z%;+Ju=i8aEE|6q1sAm4!9BC)AW--laAfT#gHgPJN=3wK_`#AR06As0`S5#}(Y!tzi z`R~e`VS6l0Bt8JD;&4XlX;wr&Elsmv!U${%@IczKz$lp2%GL4h*yVHcx0(&-uzv{t z2L8+D7hyH&V@p^Wf*!+rU4~BxC#=(G*n~f>u(NH3^>zH$X2aKv@e5Rikr)UA+HK5E zC+5d^#GQxCyEmkjL!LD1G8D^2eT zW0r)$Oeai#{?BYvg1MLK2-PagJ%L?_6#^{)!pkk1SjB*(u`weeTx+cn1#U^MQ0<5x zuWR{_8I9Z{f>{$J8;#uMW!7xnI%VoxFKs-3>y$q=efa68N7EjB=)*HJ-K5&AHw4c3;9Yih+*|l9M7DiR23rNbe5bMBde8kf($`%hyJSL0(276i86?? z>Ry7)En25(WRTW;aM6%yd6K*|^JVqL_!~G`*h7$!i1KAyV+47R&---MCxtxI?Rd5j zN=1vfenuo0sZ5}V;V+D}>}Gy;_aiunYxaa$4|eIUFoc?>Vk$ac4ra*}h7gPd|Jw~P z;!ANWI&U8O<^S787k5r87na27UY%B6Eyn2@DhHZ!r`07O#fA z#VPZrHF=_6)w5&b>_M+NfAYrDZ#?$#PoCWMRO?Gs2_LO5+1s?$m9wvQ`N@+XomzRk z<+anD^MfX#{{Al;U8E0rf2POuL6{!XgL&p+%#y*=X$MI+NZh*KING>S>70svQ zZ`W$f%d-Od($wJ0D5wxj@k=uFnRW75YZX-H4&pXZ+~PiQ{&`aZdX_kzA6jndiqCX` zt&jBdLG5Mg@bP&i6890GW8NqQe9addVaVJW=rnGXf@=a>y0!vSVe)K%55`3?(MyxX zb;$f;OdjGM)haUs^CS556}=ID9DHR~>5T_Sks61;2RPUVka4gt;A6r(2{>(d5(9|p zhdv>Q`O^Y8g;Q}+Iu(8va1wx{uXakK!dVbbcpGu~=N|?57{HvkVsWYX>3~!IPvG*; zKOb<~_-VpLlc$Qm)|<~;fT{VAV$^+r)Ba00F52u+@%IBh0pTFfJKhT?{1(7zb7U&u z#KcnZJ%Cer^8tqph72eCF2JcR$Z2uO_>=)0F`XLVqwW4h??)oGwfgVXt-7^nYagDD zx{0@{WMj$dqJg8f6>U;9hAzkryMGst++bZjaDE$LE7N+5QrM~u*0Kw-wQX9vVQuMJ z*vQqH)<|G*k~&%xd7Nd)v5upP*t}Sm29$>6sp=)1-GxcG`C8n zb!z`&6MLCcDvqx?d|Sl6nBMldFwR%!7e@KF$c3?LlME2kuT3t*@HNVXQT?Cvf@Zle z3Dx+8&;c9fLNujiR`qL|+*Q=$=}mx^%<9!iOaiubp|Hn5RV`(Dg4Krq32QfQo|R}$ zG&2cB=wb;Q3)V3S2^%&Qt+$pX;J$IStlGDkN$}ciO(4!-g3Y>la}j`Rtn1g_Qc_fy z0Ik1`s}pW7v2KBufwcgIBtSdwmZH*x&4srnK&1(zRu3uZa zHDPVZ`n4rRn-hxH78VwjB!B~1x^{H}6}vuRi**x_OExBK+IV|OAvUBFHdsrGeHmK| z)-r|GO?Rv%C#EUZ6H{DzipY4sm*z@He9@AC=<%6Bw1S$_(s0q{IWAx1> z`rxMvxZ%gsjeL&+=iOf4<@F`6Z}Iw~*B87#JUM-!#!N*p&mc2@zFae4#D`P)4!@>& zzwl!e#@wv(5mxmJ|ANA(ER`>i*Dw4qg)u*<`}_#Xd^fe8mw3Z!yOYcV@#Rz(jQy@TV3JYEYVrx)XZTBi~*jxY1>)x;kpWJld6296GY=BYND90*xG7$8+Gx+Bpjzhpd z+{>X;$I=TStNKqt1E8ognf@c^0GPhf9<<295vw;8($J*_i#8M#VF)Ws+_16mb_{jpRp|+w$pN{P z7u8dmF|eM}tmIT^E0Mbde{xlkb@SGLpPo`4tux_NJtZ|v%W=B!>dEeM`IM!!&W2O< zlqBeh#uDHHKIPziMKvFr_r*O(YrsL=rTB^+v>t|gPw|)tT4xX9F2z@Dqjf!;B;Rqv zbJC+b1z(-@8N0_JP8kD&FzWZ}Db)fWKY1dcM{PlXmd>eTz@x-K;Llg2r7~UACiE!; zA?hFOzUKmueSOOaoIz*8S#*)mCmIQzrKl&qZQ^%-i8EunaenN-IL)EYIrh*O7o2k$ z)#KslOh@gZGhDzS4*E+VU~jEv_&?V&%<|D}#6N!tzeO|bpZGM8!;J`gxM7Fdx#36? zaftB$g)q~>EcS5hQ@7!0i9>i4((_MMnt`UHYLA?-m^-ZG{<^Y z1tM=9$_PSR21EZ$Be&(}Xv-et^#$_izMw6m2W(5VUGDL=%W(Vs``+%;E>y3>eeL4k zCe$9(E=1>92ep9-v=hE^2B-zoV>oo*@Tx?d2w)D^Y9hS-CS2|}PG7$X|EJP#BKoBN z0{us&g+(9nAgt1IkGEYV&G7s7<0{Y$zo1=F_EP`0t#z!tpv^K+=X9Rqw|6c=eJ(`3 z=Ag|MK<7>)w-@DsZGL)1_p0rcB{H8Cpr4~{h7vEn6ZIX7_Bw;}mw^}I&u(9dmz+Lx ze+awXi5LE|*zNy@vj-=G;N&sRAfa%(HazZN1#V|6_E$#?&8?~msc6nMy414=TZc%Q zvzQDcpCJ@zUHX@Wwk41X*4p>bp@BP$`jDiT7_HT)-83{$NS$8&xO3?ERnEFwHr@TJ z*zpyy%(~g%y|SY2>&HJ|wNKh9ve`=_nT4(=^gGOX*BL}QDWh|eRtVyX#+i#J2M9Wc zc+*6EhH3cMJXH2_T+++hpxQ??iq0Nw*<8`tyP~uAKhoKYfXh!@SPtFO(IrgcdqKNj{YdXY|BIAGeP>Ws#3ovc~w1nAB~?kymv5 z6<1bPiG#IpF3(oxbo;2&`$KU;Wn)7$Q;tKeV&2~$>d7G07My+g+J5;&#n|YU-t#VP zm3I_7kbHAZWr{hltk|&y>MY`wQzrjIr%Za{XzyV2nc-)T=0nLzy^Lra(DL63O2m>?p}AT9^Met;;eV z=S2#6%viUkt$`mqRMO^4>m0E`Zq4#2=ZDn(f#NA!9vvTPTpvFvR#zT+?=a>Tqc)?O zx74-Q~+z3LH=hu0%wuEKw<MqFYd+R7s-4j%@I<)&WmT~!K^}xRAQAYXzlK@qo?vv&?g^Pp7h6Cl-O)hBjKL@iA zk`Omf$CorPL>Y-FPrCodqN39)gFyMxsE;{~h^kXu3!QE`FB0F1&nk5F6HD-&ZJ85& zHJNg{B8qTD6yZO679_gxR^h)v6hWF^F7SWRY0N(nm=iip9=x~zd(M9>!dMcnT_o$K z(q2oAto}>*}syST6RMXzxv>`*x4>aaBo0w(st=W57^Y+Z2I;~GUID}ix zW|&h?2ti+`>h;qKEM(jKm6202rdIA>3wxtDyUJs6j5j4gj8^L?3@z8qK0Y$}*RhpR z=BxE3#)A6T`WDX)@s>zP2$Zy?CZ(Qr;%K-yN0jF0MaCVLW@aty#QtF#!~N!GvK}fM zp`EM4nOK3^2I(2@me*_B`KjTK5BZNnc0_3mIN~jMOy^ng_R~)G9JFEY+F*>}Qm)QB zEb6!o&4L|yMW@$1o>&dablL{Xajt4#QEJtJpK`-t-@QP}0r9J%4`$eG&uL$A+LP?C zYJR5$s$wrRLM&Gpoe{=Eoy7+IN zdyTJswI`T>IA(f8n@(i;h@7CdWQ_<#WVG*UCU?I%dx-jRvVdQ9*!1^3$1oN z8|o%e<_LxXxv-5?2zZOCjmGF!msZyDDVY7fL?H4W9zv>8mT z$>!|p)72k_&N}V+ae>WYMDzlFrgk>0@Hg0+OisJ$k=vSWSpr{Z%W^%Ze|ZS<8iCsQ zfWO7U7rNdU8qEzWpKN+EuQhqB^TaE$-?-76h?YO3<~XD?Yl8Ny;ESHPQ8>u{S!1m= zgg%KHjK>rII*gBXxy7H2%jah^HyGU+Y-M4yy9Nm-<#}2y4@!|ZY|Ls@d;ZrR{R`fg z;A@xuDDBZwz4vcB)O%>a(pa?J4pCOKJ}inmvUqQ+HQuNlC+=FIvAQ%yP2fr7aU1do zfG>-`FpmY+yPZ<#&viX@KLrqu^qIHAhqy#Mtp})oG-EkI?{F?IT3O`dB1isETslI6 z!$LL_93`I41p*F*MX)niTvXUsZ@5>X*qdPW#!W@5ioME2GHyTXuWH7nn~JO( zR(TOum2Ff7cQ%&Dwtua+mlm&5m62AhEm>RYwWo;eh}(G4Y*wvZ?Ts5Sr`v6X)>5!Z zWht8hG1jatfvkgk+^uSdSk;bJ3su>yGM`PQYwhOSNouFB_>L@Rvr4VI!HR_h#o9Gn z2To7yJhd(_Fp8^2Y}mM^=!Y63Rv+X7$sL7*IDq($`Y8Pj{`U3*l`Yz*Blt}E_OY?7 zKI{cuLCs^p_MyI@8rSr81{EK|F#S3edV?A{U}j2p7!*bB5B(lj?GS20pSYG>Z$9ee zE^#4_ED7YR$V+#Mi{wDP!dI~ubPHe1h5drw_y0n1A!aYeJEW0Utcu^+v_NNe3VELjoDd#~hk) z0zS#*)WgSom{0~En-vL#@Q1+9@y3%)dJNkMR3ha^_B`O<)CwQ-PQp?6nA;Po;ZwO5 zC4T)%#lLAed@45wKIWl>H2A2WgehLQ0H5eNkH;arF8D;(Y517G658MsJ#}8V1fS^5 zgHLo#hfj2w75^p+d}PUsUSII~@MO4_Gfz*|a;G&OO@~Iyo#!NNg;vW|^LzOkTB9@~ zvA^69Js-&lsd50Se!m+29mS(=RlYtM=<*NOQ5dbQ^676tnB;I&M}H}-_K!{8c(p&! z8iwN4_J0atN~5}L1pLD!((51oBM|+=mVV)X_6t-0^v5sn7bX#7|9Gl@|L~c9;h*;l z)3f;F4MC>H;5anQ`!FsX*csm-tE>m0gnoe~6f$9}PLU{w(OEBX7WdvMs zv{rTY>3}lWcWd*0RM6f6IW)0V*uk7Wh9ZOx=YzNQ1h`7 z#~-c&W6ogiQgTSxFp=GR-b}i^&wa5xFC~XmM->Yvc%RpUj|L(!AJ2>3V{+aaRRZJS z8Rfr-^^-$#0iWQ6OeEGJOy4&~e6-LUMRiAGKRFt&>7xAU+l$)ghq~^?e}JqC>?LP0 zyO&G7@)MZLB0eX17Yxl7$o*K$Nsb}{GBJt_2?P0yd+uhCHUsh*jj|lf_f0HhU^vKX zXaNgA91j^7b~ol_pY7$&5zJTlC?`(CEboS#%@=oh?i?Y0h3BuH$ckUlbrq}oXDssm_RjgBVIFA7hTKRN+jvH&6rrFTRn7?E{8P-R15ZGMKGkZ6M3QWVyi5E*d1LyTj(ftjn{{?73pi;ooJ=VayN+ zeYlffqro%`TZuzOcBGLPM_(}la>WS9AVxrL`HDIWTg*t}tfyNsF1SV@m7n z#X2c0#i)o8NryAGYDii{cbqvTiX4oF?2TvM6m;c6s2g)7nUbJ2ROXXQwIT4SffyKJUH^DD@jI98^NyvUYmD|?p5wn_k& zZvZol{0O(*=HO)mZK4bl^pJLGtu5UTWs;2ZHgGD+DEJe>oA=d`0OM8|GfaM^{W%Si(N`@LfU} zZ01}sS&>_`rD#1E{OgN^)$6S|2iB|ZDk!?qLc9!3fZaUk*(N5>N}Oh%h}RFs%cqyy zR>bKbF2dx->6jVi%<}&tlNGc_pvof9Agh(_m;XdFsXF)o@qC*?gEC~kc9m&t4$j&h z!nYn6n-h|`?68pf$_yU7`Gw%~XYvlC2%!Op5{TAgd!nDyHi`ifTWnm9EE%hym={oO zrDL@9l{1o!_m)Jm3X#J0%s*x2LH4C#sxlTP>CVIgfn zh~{8)h1<#QfjG$6)n=VN>9ldB#r(RUhh2)}02~Te;#D?Hm1GX?fe*fN7wtLG-cc%Uv^SKCi^|EzMUH&% z6PPaV~K)xa5}{FU)&WktO6X91_}FG@@Ok>JGhejRY) zozKEW+iNl$`0oQAjqoyD6tBWHAfC4ON^tq}_#*+I09XaC@wf<|$`!r%v`OT{2OQR> zWL~}-aH3bue;eSF5k7-!k{3?-JO+3I!g|yR$oA!b9B>M!0#51Fa=!z7D#EJ)PxON) zXcat?3GmN9AMk0w`#s>;4)Nu4AK)~GeGGWKAN(-jMudln4q>L4r%pM=20ar&|UdwZnHTJbWd)MBYis!;>7lm_mUYLY<+k@-Pt zo%ZdPYU%+CRQjcgGDrbx$Gi;G-ky0G$iA+58Myv^^D@xY&Urbg{d(tRBvHC&e**$O z@e2PADvx%3Z~u*Q7P+Vb4ELB3`Z|J>Yr_S8&;{}GMg-!#iwDdkecf1OO73FuB)2eF z{Pau2ll;SA>4~2|SbXj!;`0zsaug=`m^%}+@G(~=v>;Q=sq32+|E9z6N$$c0pX4oy z75Mr>#lLAfe3H8m;8S|4Z2Wi+!sNTXzRT-NUf<&NMXxV-eRy&@Emv5)UduJJEo>|D zVe-)e{_+;I4kLLBmEU<9NdDnmipTmxlr@kjfGeeC=}MrAVck#niTm z;w~jeB6#VNH;<5y>yr7Y!beJ>t5)?rcO%cNz~A%I)J7k8gSbn{k)$Rmi9O!7sz{zR5*|>D$>g8+C~J!C#Jq=6bp)fBOFR zmV6w8JY8)6R)cSs^>p87_WRjPmaB(ohT7HYH1uO`&@E zzA5n7`HhjVO*0a5D^ZYNi3ZLn&=><*nn2i-2|V-_#~=Czc7HyHe9YI7lj(+SnI3N) z_oY9wClfYfexYH$>b$}BY<$-*&fTNY{ZkXpEdL$kX*^kqJswpSMs63-(hj)tUy1j@ zxhS+(ByG3s?c^e_)`W_Cuzyp1C+fmO=@3tGvhA91dzvS_9G3%^l>TKFGb;`4NM%y~ z8req8@I&vRAB-j08|o9@vMEk3BMaxQk6=<2`!yrwzH%0FJK4aebiOpOZ=>3_DKLn8 z{Au|r5bZ_z#-U7B$+uX;?(Q4_ZsNl4Q_?E-j_5xtC~0(@IO~Z$;;eX9x2Sdx&W8^~ z_(5;@L4-pP-scVPLpTiKN4?=k5e`TAfH!;q;SmTw?hQYVa1_Fayx~I#k4E@uZ}@3u zmIu#m_tw+%jBciXSky4npU=`9bMfe_Jo8j-W@b+<7un+iY(FmQr&Mnp-a2d7h)?ZD zU#;a<^vLfR`sz{iQ;fogi{~@Do#-#MjujX5Su1SvDDUFU=#w|0Z>~fi{So@=jZd84 zxB@a(y|$F7ZO(6e0dXvFG{EJM2JhLOkPAb-e(&IqeS^My9)0<1^yMD(WwMh*efg_P z^ySTD2Whmlv{=K;x_&{g%$glbb+wc^X&qv5IUvj^3picm<{P*kU z1m~jBpOn7b$wkTi9Q&2kk8qTi5>M%rey;ZMiZss%DV_RBrvvSUyeWUBpO29HxY}ns z9l!}>j-U^uD!2+QYQI;?pgyhGcghK5me9NAU-mcDe~Fg3-hQ3)M@H$_{opcQminx{ zeVXNlqrW3P&M>0qapSW<9uvG_wDr&_s8bK#`F8moBbm7oec!(j@!S2GndgOQA<>no zIqyNd+E2d<6ptK{`)V)Dg1%axrSw%SEH2VlNBH_Gi*dDoUsdM_bjHIEqOVe)T!#N! z(H{otx3TEA=x@8fy>lM=U^e<<7W!l+`ep|D?aT6fBDW{%K;jjdKS4d$sh{kh=gzIq zD(5_T@lZB}MXzu1`pB=3^S3=^#HKIp-DduPqn?If-EvtnfzgUgV24j8aMK_%ft&ng z0$*tX#XAM%Jl5nfEwb&Y`^omy{i^M$U9dgXk!!4KjAr*3ncynM=+beTVejk2{d%s^ zZiK90wICH@huYI2?i;hH=C0VrM_>JFT&B~xaNih><-4m>nRaIV*S8IS@(&-Le`vgA zOk160ddm{sOAb-UnHZtf*u_0#^fB2Jn>?a$by9@3(Jl)5QHu_g8K+lp?TqW1ApXR} z?d3MX*m=LCk+Qh8_r_b#ZP(p7{)0P47G#<bBOeX%{bNBjx`>LL<@`%d@nB~B z{0i>j_jTn<^*V{WcjgZHJUsux|U#Jm4XG<6}iSMa*aPsuF+D|Lj!5}p#8;-cDs4G|TZ$d>QRkIgnbz3olQ2ld3auG2jr&KzGL@%&)bWNCP#2jyrKD|G>Wq)Wl$Y>u0+gYt_%qiEX zMte+KUz1tfHdx<+>6@IuJ5qhQb!No;V}CSL5CfZCFIz{QVq%a9p6F$J%sUw|r^M)g zG(@)|=l!AY$Bse~&==Ef(*1dCB%}x*X z8lGrBolE~doA0opPArZYrogQ&fn~1BJMdpN-X)vm2~0!KR=KGxkl;0eIG}zO{=4=v%KFq=l8i_a`w)dV7b~&iIlgs`-!6KvF-UYMeXwh-1!P zZq{M@TpUVvv?&cI%i+Yl!&x}qZFa9oH#%)k3_B;cK1lkY&6^v81L)HCa$+m@|NL=h zF^tg>s*7NPNS>A5sTJ7au2W(T^`fho<9t!DGz|i*Ih^^VD^Ej4(zI(CoQ8KVr0N~k zZ{^OGEgjA{qDsC-q!?@1M;iDslO^msk<2T8On8M@W7I?PRk$}O!)!Gh3LA~OS1ZJa z%~Nux#oET}-kfGPyJ{a6avHUnL!AZX!jSNao%_Tb&5~<$PX<+tjrem##!zQa!;Jma z+5?T_^-H&3V>-BVUmg&ODF6R}t+Yj9x*>kYukCBhf3)(gci)wdU;ChR>#Wmvx4+Wa zWg6uZhrRjpbNM$v{-+PmZL0tFrJo*aPntc&(eUm^cdh4tedOgiV_mu((@eCPhK~&w zWMTuNA{6eL0t+x7yw?%PYDB~<+i~%*c@}?^)iQ2?1YD%Im38Qj+OYzI{Wpdsh=gO^ zb~i_fvMw*<%WB_!Gh9j{!i31HCFi}UngFdRCn5;4n)FSNxnEX)b{4U09>vQp0y3`G zoUm{*2|lW>dusY9BVJ|iKCFn--na*0eZNBI%{OYa60ihZ$}`U1bP8#Z znJ9y(<_{d?H!5L4hEY{)S$C#C+E-evj2IEr`_K*@E`Xs&Sw*k6Ha5J}K;QPr%17I4 z&8IEUz0Lv5S0VFm*gf%i&iRK9rRO5^9)|thu}}sNzu*i(Q6{ubZ1s-MN?HKR)=MSew)|hwB!6XW;8q5JWm5$V9x+1n%0`DvioJq!5 z17}K=ScKUuSoH>O=?Or#cSx11bd|T6DmT?&A#0z4k^K{o;S0CnBQsafLd!vAQ5b#N zN{hT^JIuE7Z&yQcCrdf2bXI*+D$X8t;)Kd8_UHar?9VMhANzm%D7;0cDxtF>vPy_A zFqgZk8g%8Ee4K7kWUG0sJ-Mk)*Q#$y##wkFbQaz`9FAvtL+{u;cAC~%r5zt1my+`P zl!tyd^V!+IOCB-pcXiJlSz`FWK4$HKrPkHY-MV>U+~m!_j2c(_fBQH*jCXxxYD?n< zItmW5s*=lYjAyKZV%tfTyQRTW8_&+JVj^;5BXmRNBkaXL%4U`Z?vA)7sX&?@tK;`X zX@ka;20jygY_+N}j;I zVTdxa5zKuwKw1SwrgVU^GwnvJJZ}FzL(pbH!uc9qx%~vsZqofdBc3lTtoxgl8zX5f z$a)V`Y$(q-_)Av%evA0rtl|eNvP>yLg}}VvaE^TPRq?qdKD$fnzF8@60?HkryyfgL z&3<~;H!`AMTH2c3Wgo-uZ`+z>i;m-Wzzmz^sRpuv76uz=qjDN7#-GpBIgdp*@5!Fe z?|UQTxv|lWb!@DbZ5!46)^e{AHjB*`eNDBRs4)2Wlx)JXYT4>0sxJ@KS9!I@((Jau z0NRvUQUqofs*`tQ8Wp>NG|6dAY<&4pSCed3E;}|tz?`w1ePF@Fh^$!=E?NO*eKjm2 za&PvMz4LY&*J&kP)+jp@z1h~vuBB(1HsmgsGXtgtop`Fp%;D{U_nInTZ*aepome^~ zY5lsopO{RL(6(<6&Tsp1llwOBGe4#o(IK83!ZpDPVcl{&tN^~ru#OdctZqlBZhDW- z@}OucF*_E*G9W+3lq4L0g*U^n`Z>-Sj3bqCyf2&-^d12k#l|35D!e)%PG5nCC2Maj z!mtNdH@hwPTfJO-+0yKxzpczL(~KO)WNwBtByChuDy$lE)AF}32!3H>S(}CO3D!0U zq4}{E?&*;!!oC!pG=zIhlVQ$xTvt4DdQLYJnUp%764?S?UC3=?(DUjX0y9#qb4-IZ zxGA7-M%i|kq0{vhx5ithIDE=}!<&XT#RYl;uWfMai`l=GTe&mOavGC2x7zJh+qhOo zs$@r}3(#jyH>0hJ!oy6 z#>HxXX^3Yk-WRU5huvtUzae}~im-#o%s(S(MD*rinHj@B!QXld5*5gaYL!F<4G|^Q zus(@ubM2I`-sx|SY4pGrYOG3`_QM{qra0z?1(DAgK@0b z(WINbF>kv~SLy9PE6Yce58*n{TJ?@?x=ibcmHR*6ahimShkhSNXiJuw6hO4I_>RHPRO6W+we4$5K^JiF#MXDrpfCe zJZ}{k<^)4y#1h%Aqxb!*wU1E-MT?jbk;4w%yC9ZcL2>7a9QJGaQro*~>+S=*ZiYsz z*uP6;46{=^Em~=M9I_hp{cFwE-fODP95E#OLH@5^x_)H|`1?%bJ{Yi+Nt;xhF|=Y- zk~tbZd-AZuu0X#0?0mf*Ryy5F0}@OnsaycwK-l<95!&2w5-c6ox9d%48DR&;N0Cd? z0aj4opr4dnQzYH%dDB(izQZ*XFY;Mf`*g-@8(cpM_{7i{+AJBG(Q9X#9J5T0AzU`v zswY1ql8ZGZnd!AkwgeQzbS1r(6~k(h@p^dQP-p1do;Rh?Gv!HbLmbpe%-jvGI@dS+ zqR>VdhTM-9Jnk7*KC>%jA18v$g90;OzZWmFCG_TuJ#UMjIV#4B!W^c;${h&CfT+A* z((uEtg^m>6^zJGp)deIv&0(h)KGDXh<3r2#je5MVjc@h7uWbS5w)dHDm{1FzpK(Yi zY!^l#x4tYxUq4%Yn6~Xn9#kXVdFHDCbFG6n?pd#l31^rQM?D5~u#xVlb6CB>OK ze#gWfHk7a;GMK`skG7nYbnaLNZ`w@fb_O*;ed^ZHOWFUAy?23+qB{G4XLdHbo3KeX z5MhBNOt={+!A*#mNT|CBV8EymX^U2xO-LZo00Dw>5uIEh0Rjz(HVU+q{&viCjcQjYut8E#Lo{nX{RlY%a96zwi6Z`DOC#dCqg5bD1+|&Ybf< z&v|@|d%@713&IdGPZA8ZV~Q6H_1p|^)jjrdu6B%MniaX#IjxM_Y);y#KGB!!uK56u zzWnlfXl2k8Ro$i$?)EUXeZE`yeQ!DTb}G*mUT?m4FOT0PaY^#tksMLMCb9Rj5*E=z zn7xNE(HEv2`v`J+PI_4q+b5&X6W+DmhsE_2X6PZFAcrkQISH4e9J~AT;AC!x6!dm* z!Tu+uknJIJU9U<*nnJ50{wxh`4c+tUpQYjFLK{E*ixmBN==pd4DvhYXN2Kg%uh3ud zi}nhcKw^kfV>?yFqDeK;E>pCXf8T1AYYjw6}=v4@>u5@F_n@;A`{q zDfm=!;y?ozDKh@h0!KZez7kq6ysRBO{{NIC5@tFJ} z@acY=&?YBp`0s-ch#Z#${$veb#H*>LLiz?gnEMBp^KowUkl`%l+Rp}@y>YMnoeB{@E8&2o89;QM87qfh17v`5NpshXr z(E@HM>$aAtlmSh~21rZIMj&Kx_a<=zN-HMp0&S}5rKr7_)0NHWsl_S8vD5jB@)t8p zy@kuOwU&B&Zal>+ii%jZz=GhSVwSI-qv4j71USRH+uG0RdOmlzvIY4$dHKt(A_5xJ zRY>bm`+X~LNzOuclxyE3Xr3%(8$q{aCiU`@(RbyY_L3FTkN=VlVkJY@tz?fH+oz!J z+v_gB`UA$hlT-VqE}OXeR!U#*#CD7McTbGlOVz4cii-LuFW-i~Zaif5=If$#5m_JA z$F!-z_zZ0NTQLsMO);ebdmg#ioliFP2tCTH7MTNeRVndW%&9HCJ zsITL?3iV2RU@fhy1#NlkqmGNT3eV_s0|d~W$~Br(SZ9A z-vT-s)C)QabieA~4T|rMc=~?D_hr1K(jt}4RcVGw<3LGY2ks}yp8>_K¨Z)DtTI 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

    b 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%0DY$n`%c7kXO5!i=#;{bV`STsvLx9-f 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%0AF}-?!M^Jdg@mR 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 I!fx0dG`_i%9`+x@9kkg*3VWz>YO(N^8Mul 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 HH`)FVg~Ks@ diff --git a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/bin/libmbedcrypto-x86_64.a b/client/3rd/ShadowSocks/ShadowSocks/mbedtls/bin/libmbedcrypto-x86_64.a deleted file mode 100644 index 44e1590612fa80c0e743f3d9cdb27b559fc08cb4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 546720 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

    iSNc0&x(=u-jdyE0>Gyo; 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�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 T5J@S~P7EZp2ZWerKvDc3xqR%| diff --git a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/bin/libmbedtls-armv7.a b/client/3rd/ShadowSocks/ShadowSocks/mbedtls/bin/libmbedtls-armv7.a deleted file mode 100644 index da569ccff509b8a4cb7d3f1a62fd012eda7d9989..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 228672 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

    VIhV7G*a&`zTneS`(;2Mb$2NCRIEHSAZzhzq?$ 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%0D5%0C{x6m)HrmvEJD3|YF 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 diff --git a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/bin/libmbedtls-armv7s.a b/client/3rd/ShadowSocks/ShadowSocks/mbedtls/bin/libmbedtls-armv7s.a deleted file mode 100644 index cc4abbd175fdf9cba00a0359d632973c617c3d2b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 229280 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∓6{r_IG-Y(T>LT^r$Kn~(Bo58`gvBE~h+X5wGr%sM4f-x&_r_277)9|M!td+U z`#X4!pzFj>SUke*h9{Nt!hY}`i$}POBAx(#A?n?SCxk8^KVk6*=Ng_Wc=EtG7LV`* zipK9|rpq^!>FZfT{o*gN-=Z7L^mPb}Pxw4`_2&+J7r_JAz5WRwpeU~G_&r6vFT=9~ zT{C{d;t{SlJS*8>w}ERd9^s7?#WfeH{bf4-k5K<#;7dX`6@Ovz2`3o7lkg>iCs=&K zw?FCfZA2=*{7?FNX7#dRUP2@IXD};*H7UE6x_qf_&tE| z96TxLX5l9+9^q+*=O{cgz*8(9;Rh?-xb7kq*Nv65%fV&%ZlSxjl6DQB@MYPF>jr#R zz!zl)t3BbjD8GiM-N-ilb-(h<8qNpkcHr;bzX)%lsNDd5EgYnh-w?Wd{Dj3ToNL;x z3NnwtIaa&Eiz&VE@V=)ff%EXW5a$7ODfkJCM|h^;;r&t9Z14<=M>v6^arYq=*Nxxv z^<;6dhPZeq<-7KKz7ApW317zUIjP|j-ho~HTvWn+ICwjDuiwI3DdMTZZwdAITtZhhx)^@Kic5H- z;R(P~1}?UEgwrYN=jD&P@`RDC$X@sxKJM%JRj1GQYB~1{=;}W1>kt;da5Z+tm9vri z1#lI1FHYeQ|nn|9$wMrT!`SCZfClF+LAz_=InL%#HUVe0M&^ zevaLXSGawd8}G@Fnz)e%;obgG_dWN#2F|PKnm-zU&n;X>QTx^Sz0H19@P~{Wx+?sH z`P(gAhF$IDGq0lHjo7{Rg>xz5S%sh8|VcxuYbgickmVF;n%G)=Y4-M$H;_u~AxXSS5Vy_0rEI#4&lwNpN2k0K9$*w^z4Jm0M4bIItsKkVxeR-D57u#0DIl>HIB7rVzR zTt-pe0{AIUKfo`9E+0QHZ^F5TrwV%>ILG1O;8_-r@MOv%czTz(aqVB?>-q8b_?$g_2hp`J@pTA`Pk1MG^(U=@&%=XTv3va! z&Zj6(+4$-A3w{Yt4!SJ-yx%hr&M-WU@T>qYwRnVQQw0J zeYb6~8&}I>H?BYB`9&+brp58NgzK;?j!f(g;H}ubxP(KLUgFBbPxF57S9vapE*C#< z9SE;7JX_&e4bHT9gqKjX4(`9;#&zulcRc?Qz8mOdo_wKe#824C7r55&Wbr(r9$aJb2(PAS-mk<@^Ze)dWuaS+pEvJ?ml&Sy z*q4GASv_%#w)+5!ARf~K*-z4r&eU1E~%UtB^ z5LQ2gmtj}`n|N-p9Gs5b%ZG3ZMSPQy>dyrH761FVuSr1n;Q4regl|9Z@?C)M?(>}g zv3q>N0~GO`!mo)qjuF>sbba^|XzbYbabEg+oa3M_)fx?2%cc^2_JmU9nW1x)+4*&-D>0_qn~W#jfHNzR~GVKh7-fNKj6JQ zy2}fBF9TM)!soCn4}3no>jL;Jb}ui&Cn&wNa~QvlPClaq58tKqb>k;29^rk4XYQ9d zpMdvTJi;v$&BsQh=65yzf85FMSaDxmgRTmHVetu<8NPh@qTr1dpKuOEd>KgPcOL#P zb@KZ*@GU?$7k^>#3C}Wo-S8!YlPo^r(;syCb|QP>Yy6D+^eMhFACkcJbbZ_Y(LV zc5gg{`zYegL*f?BK)!)I`T_U)cR5n|Sn>gPz5m-5_9t|UJ`i8;!t=0;cQ5t@;JMhn zc7*%qyFAC|^SxK%`z+TdedvzO=XEkOgTtA{BDJ_?w9{L z-=jmf89#5`3ooXqKXZ&c{H)vlfoFX^Wvr98{*>qK==MG9>k!sB2)AKZdkYz-J>VVK zz4nEhD9T42ey>pPr|>kO+lrsCc!aAAPcA&w;F!fDoP%BQmhI&E1vneK7r*cdW3R@Z z3C^(W!e{2WarDjOdj)U8&vn@;bjRoMy#lb}5I%xk@y}p>90ec3?)67_7e)Qqj^7_p z?-%gwK-Y|)uy};)4bMt=wt;Ic9^n{8^C->8iO61f@4VmFQvpvU*F*Q-&-wQKz7ApW z3SY&pc!o58!B?<*@d@vvh<684an|FXL;d6MZ9`X!zp(g(Hyge+Tu*NSZ?gD=*HOfm zffV0j{FSeXTo0wAOT*vGpKz+-Ylm+>IK|=BSzyH_ zd=tC+bqSu^soa-f_xdS(fg+wW_@xmK-@EP_K-Z6-uy}-z8=lEpKj32)k8nFh{cA;v zuMz*n%*$Pz|C-S?;4dsb;Tpr24PPy|+Ts(QL~;7}yL>;Bb@~w3K@-s3`(3`DY1Xaq zP3%tp;JN*~^bh-R|G-x$imMaZOI&;K*ZaH`@U^3B!{2+qC){HA(#dBlxXI!ZuAzu; zGgAA10RPkQ6~Y%nmyf@&`YD`i_^RN`1Ls(L!YLGnCp-ly-m`OEc@(MschB|p^uYIP z_z$ByIM>%9EPmm=*wx>8%*%b?UD&<;3vZ){XDfc+qTW+n@6@5&f}gN>gky$>@1J+^ zn`6F+#Uq?c5l<$5I^X|bJJ$>7R^aEI|Am(to@RJ5z)LJ1;r-9JJUgG^c{d5nd!6eT zbgj?uyc?`|gqyIdAIq4JE#Pg~y?zO=r6`_k{BBZj2Ru3GvhWiYkMMHCvkjh=;AIw% zZ~{d<_fvQu!v_Bb`SGE;klK=4z3}imcRlB*m&*0g zesp`}XLy8L4bNik4|alEEFR%{isIRXUn})y!m}A&6hC3bBOEe3#qgAZ0~U|)-S@fk z=mJuFC*SAt>AJEX-HG?b`GnuXuKrACo*e@p#_sh`xQe3wZN%>>=FMMnJz0jX7(Zdf zCA`k?MB&K?ueErDGbx(qNl5V};;-kex8a+DE&+e<`K$2#Ic{8M;q!s-&WXn*e07e? zcMhq3_Tzt>JSA`Ab4=(?;xDZDgpV1%sf_b+@LLw2a3@9a?J;r(QoK#nyAID9cw5kI zqn@yMg|`~sRa#%*Ef%kE9;FwaRq~_WR(MvU%aott5ng6^n&4RuPPcf3@4eTJ=lXkn zJ-yWHhvz0be$TT*Sn&v7!mjb-_g}gO!56T5<0;%kd5C^)L8^Z-{B>W|#r&v37s21V zPZTaTd?D-`!G#u|@G6RUmgA>&v*GKkH+0MJ^VX5@BEz!-o+aRg7LV{Oig*(7(|oUk zX9~Im{Ji-ud_URD3wV6syUFqX313QfuOoYr;_Jr09KP?ucNpD4{Dt}3Exgz8&0`+! z1MjlJ1H)p%&!&cRK9oze?W0)F42-nZdNL^lCHVetsxeUBT@Ie6~B zhkflm@py!XqqKEi#JhuDXXA^!!wBS=o);dbin zgXbQ+`_b*8p0Id@TMh4G`nwa{V(|*Eqg;h28^5=y_b2|Wl4k5jI}vmHO(zs-At`zLhG_<8qp!u7_! z1p78{tz{RkqOe_r1IBM1ej#-EmY?uCipD1wsrXmnzlX$R@8LX#E)#!YLLi${2h;pv5E8aUD75q|KLJI;5I%I{UA;=A;e zujd3jm*5>lci|~thp>2s&tO+P58xdD_ha|s6Fxyve!KBgKBpYyyn*f@eqMfs_Zs^w z?EApGEW2>jW1Udj!4 zw&SOD^hwP-bj|pA>q>YVcCDiV>`mZ$?B2Q(j#3oQI{ZG%y#IIn^3kouPgvt5oNeN% z`3CD3oMpu$yp-~9@GL+oZz=dMrhX#%O+}ZCzp(g(XBfUC@XZ8Iv-pG)DL3J{^rSoP zgKsi_o@D+!86S7yGsb=s`vAD#vJ3Z8G~Ne{-}FwN`=Hxr`3di(Xnfj`ioXSat)ql* zbN`9134d>03D;rQcw};4-2mQ--5Vd_%@pM|fS=aUd*BJ7%g4`KSHii5rwX1taE`?z zypp1EUWQbD7a|qkT;u?ug0EV3;R_Va@9jwCd8_eX*2VQVx-FK!@MenQkKm_u^m~k33|%RH z-ntSl#IAhu8@*k{;Pu$O{0iq%ob`U-xc;W>u? z0Q_^ovn_t%p?C3a0Ghdi7?ck*5FbtZfqyVljS*!#f8uzTxFcppV^ z@w>=94ftukZb#RMpRmSFxE8zm$?q(8)q`uWd;J!UQpB?kzfIJeMtk|_*5W5D9^q`m zQv**9ILqP@UP}1|JPVK~k;%v_$eG9=Bc~%ZPKogR6yERA&J=VB@Cd6N;rr9wc+b*~ z4}5oeJYL~b*tJjJ>E`{;bgnb7d;7NVQDdL@9p3MNk63o$0~F1xR^yk7-%fNbmY;AF zMf0Emsd-R~RQ#K%r*)gWkLQ8tHc`)8$HJx9mES_1TSUMi>|VZw^C`-A7Jgc{AA%a5Y8iF=k{b@~6~GLh_g}oPa!wd@#*@UwIq(_uv~y>4%K|ywUd= z{V}8OL=ND$6L|r-1$hoxg;YCpkY|xe$e$r6BgLO!^bdZ=)!#r$e-SDFvqpacDgI8R z_?wa9uSJsHaKy;<$O-&@PLh$+kpF=F&Qv$g{DxWAy{SCso*K`y@D*dfi2W+~vSk-O zNl~5;8NbPY&HE2@otB^Q0gC3u9{jXlKJi_ipQ3BS&)YwRTd->$r1O5H72Jf~n-{|M z6pdGnkyS=UkXlC@ky=Lqq~?D%eA+*AXfFp{7JS}*Dx6{3Yoxsu;H6f3!V4*y|0&2J z}_Pd@RUpq*B9P4Eb-U&3{!oy@=BItRSfYDai2 zcI_vj9)4#Lyav0szX)d;`zGw!;FXqLIGu8kIOZC^9r(>dH^=f5o=wrbOhRg2PD3jG zNz~JR-pqC8WONg$=k4#p_a1ZeG(h|h9wT3m#q%V5gQ9UekDvDQ4tOr28^F)o--S;Z zo{4Ro$H09SkMLU*&BKF8&BI+rZa1W3@+ZhlBbOPu0I7MO zij-fn(a$h40jYU>cd{$5AvOLNksANgNR9tVq{ja^Qu#YFnR!OP4|6?o6y2f8%rmgY zUwA)u&8w7e^4tpCj@_GQ!p+z<-V6SQ>ltt(c5nQJYmI#=_IhxQWfzW74id+D<5!4Z zA-X)vPdJyN{VLnYl}OEp45a2m8d7(E z#o`m5Y4{GoHyb>|;uB7wi0|e*UB1D0^0_|Zc?rHDbeG=A=lV>1!UNcquY2&F2cN<2 zKM7l@cjvV?daMpKH(O_mrg!f!A%yQa1BL#A*ANZdi+0dfZy=PzYtv> z{=)q27G7=mwqRcaUS;tKFQ@4GXOWS!kaQ=UXyo-tZaagM+;%>pJfOQYDc+9o0Cp!2 zv~wPO2K#Uxzy~ObcaP!uiu#YP&EgSmF+AzmTft2hk8mAD@s%1m!N{xcaP?b}YNzxa zzMe-Jr`Nepj-U&@!`C6Kya=zyuJ|H*$s0HiyBDwUJc@Xd@l!q@fhPssEd0Fu3QsdU zN8y^n~wey|=-RcB>AJ&YU@Jj58r=E7Rz{|0F z@d>9wXVX=e2E*@Lm?ab$`iqJG%NucrR=Cg|}cA-)h?53f_#};})^A=is?Jk^AY1d>-HM2oGUbKd!=a4Lpe5>zD9(%74PshwMcj z!T%f7|9kk3qC14Yu;LQlZ}?KM9|X5se8Sb(PvD=yeOe8;3cIlC3$LeWKh8xGR(QFQ z3y>JX$w>8U20Y)U-dEw7iEbJ^!r~F0Wa8)}j>+JORvg0j9(LOqLiWOU{$aOY-+}KU zx`Bt|{SrQfU3r;^{WQ1_yO$^7o!B)#|A~DUxD~rMUczM*wUck!d6xGC0d(uEc7$_G zJJs;yg0ro5gj2Cs)6OdD&j+Vq7v^ub@C1tH&&>(EKSci;ezzy^d};#k4~?JjAa=!n zopy%6m#};N5#C8ro}2N@q23XAwxesrPgv~<*BYKI?DgOpi$}PWqImM~`#AM}j^BE8 zx%df-M|hRt*@}HNIMd=0o=#CbiTG(hc{lGrrl3o}&)Z*w??2@B>nuDz@ZE>v{Sv;4 zealSxk;M6%iFO6Mu;LItk9`Nvp5Jo^3E-bt7N$hLDwb=W?C$J04E_@JsAI}V@ z&fxz|0`JEzEW2Ij@Jj5$vI{T7p27XVq{q0P0?)@T zEW2GLzU}B5@fYTAw{WfD%fem{ zuCe%piz$CiT$i;z{oD^k?{eNpoDraXRxt{--$pxjCMZ$~$}$Tl%x~ z(dai-^I0DHDgR6J*jvo;WPDZ-tMsX9{J$QizYWhb=jf;Of#;n0>el5rz;jpWXMKrv zZQ|V3#5K8Tw`v)4!T7W@;NLJYU;ZT5N9?nzdvz6KZ}L3(CEnYbc=mjO`>biM&%|cN zn*o-8RV#a|iEYK7^ZgR`BQt3I8_*f4@*kkxp zzv*vz=VM}CNv^J&w&wmmc`#!gt>s?J#5}!@d1-R8e?RXon4@ZU@iu<<+Z^lvin^yf z!@n2)4=J}CcXHfl^hY^9X~ymf{DN@fnVkyN{~j}5No72fVZDg+20ph;ACq3=ew2A4eUzNMZDLqJZ2x20 zJwo3(H#+I0XL*!#S;izD#%Z8@KU)v73C}{hH7Be&a(m-yazM?vJu&&HQO% zPk7k0HS=lbGX@TSH~Uq-;cTyGj!ky?JBjVIIbK3AOFSNqPnw)ZSW_>W++O2&ve9p; z;&TZmhtoIHFEhStsat9ECpf-p=3YNOohF7eUuADG;~PN#usI&gXTLRbum9^@cbUFl z-r)27sTqrE^zSt>x3mAe!n1qjJoH)a>z{Owcd&4J%s8e7dA?~lGpYL-Ge!&9|MhNE zb?0p1Gv8(%4SvjduHxupjm$UWbAKV{FO#43U*=lG=mT?^OD3K@#IN&~I8(E^jxn+A ze93)hD*bl$cD*;!@zO%_Y5LelA9KvQnE0yC_ZKE7onfvwO%9uxSMyDrM@ zHhnooU*2!>JjmYl7bXwY^yS+ow$}N)PciMTc%J)A_?ec@U&J~tw2uFk9C|)?;PH<6 zEXMHhRND3Qb1k2TnR}jI_Xpl_vZa5RetG)8p)cO?e_KAhw;k3u5v}KQl3aPmZ!nj< z<8G_1eycA(X0CcZ|G}7g$H%N=y>ImN>C6G|_#Z4Ez5n#|=HAoE;TtGD{iDnc@AxxT zySJ>mCoKM2_7Kni0psf(KW^3Sx9VQ7`rB^hjc5DAb;DN7FI)USwfHYsb=$0Xb`pRW z!^7{0AODAybDozB`y916S!%=js1@^jt(d!6M;`woD_7N4{7+fq{;yVSZ(8lX--`dg ztYf|V@c93q6~mhrPuSx5XDj~MRy;wAXQCC)Ig6*&;?X-xuiZk6=Ob2sd7e1zbJWVM zpTv1}KWZKSlXd(fYhCDhpXdKAOaFJ)di<6Z!}C_V&sbyhyfsh0%HHL1`ur6YrT&Uw zMMX(@nZKx7JD@~p1%`eL0PQC9}PxI3&wQ` z`6C6KGqRQx| zplN|!LYrhoB`4BCzilZk=j>2XQspoFQcT`W9A$Rm8fjMJquO%LxxcY` z1$hk>(C={r^(=N!5hk>mE41X!T{n&Dq0XdHlU3(x!cwqVakXGJ$`EHod3x0GjnMHL zVKW;V{FRY-4fS=DO4D_$Q+xw@Em{y6Ls3x7;tO*%6dpw$uUAxB!lusL4E{!!iXfxS zwassH8Dmq%3QNl4eTuxwk}vZIEYT)tyPaPKcuoUSfyq zkE&?f6^B_u@mN$*XRdJ#&fE(ZRO!5?%gnLW#x;zYvVKlJ<8!zzl$4EcbvN&E+iOG~h9*m52Q0&TgakOB=SnKd`jBj>#AMXNciGYXAZibgFY^2@^evDRoV{x=R?2q8?ceaQKSH>X^i7k%8<(xeo zXt!uzOE~#=v*2AB7?oYaiKV!pw6u_Z#ly5u?cBu04eGB`r=m>SVxa){BjuVU8)Bij zC%dDY_z^1SWIkGNPUfT4I+>5wnUncA>gUG#5-U*@l$ylq{1Okw>4|gF@Xktc+lcO0 zY=|3%yB{qZPg_)|D>CQO+_}<=mDp~&8+Nt}mg)$DSQVT*{%*)4+hnI6?grtGG`fqS z5Uq&JO^Ls-ve;Fa8xdFGjlJDN&+~as=G5Ve}qb0#7!g$mYfyk&Embk;~|Ig4VX zd2=vYKEgkqZ|8y}P9%d^tZR#rMrVDQ_3R8-Q7memf2^296+iKeGT4j5y~&F=Ll4JM zIg@p?-b~ifYE9PBIx|_vQ9n1lx8eT%8JX~IXKcxo!?|K*(fS4FSGcRj8Q6+i?Q10#(2_IXX`Al zh?NzDE!uHrihrz!vmBHqT|nzDH=f1e%RY0Sc&&uH_+c-1_7qf91jD*>apueLi78GZ zH%l$(Y^-htF5W^sK5?IMjjZJEo8E)60xHGr!;!gEdMHv^QLy1Rdko*tjpG^*$w|W~ zB3YfeQc$WSg$c-MNP6#KjC1}SCpw*$-IZ8eTCyP&8|7!_k?ZB{9&UT?BQ zDqY@;^&Y9whB{K?+^mjNImzG&lyiDj^mbgs<2Z_k89$1}eOfS5>71aPj0|(SPYXu6 zG4(k)jr4QIz`6RTb7ic_+H}p~$f`!E;4Q-t~&kQ|@4T zkCo!-aL-~RV{*=2p25Bp+E7^_rr{*eh7*5$E7qgo2-jxiqug|cTpcFJhcXc8sJr>7{K51sR< zPNSUL%IG-?J3nTtC*d2ojx$fHBf(K#X2<_6UR)TAuH=Lpi&mED4B|c}8rinv;9Vxf zLcuaF^=VjB!#VKc9Nv@64rv}Jj6*i+fr!7TaHNywqjPIM#^S`Hn|xJqma26buU81} z3C6N{W2Ebp5mxs!>+Z$QgIj0G#>Zg{lQ{_(p68b=`Yo*tTgPd|v57^aO)C!e`zu*_ V6(!HRq@$~`b!c1Q{YoN#{|ohm98>@R diff --git a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/bin/libmbedtls-i386.a b/client/3rd/ShadowSocks/ShadowSocks/mbedtls/bin/libmbedtls-i386.a deleted file mode 100644 index db377f6b329dcada26e0e2e7b25f25fd8cce614b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 272112 zcmcG14SZZhx%X+afwZJ-&L)P#i~^*292`ojS!_*BIern|9@uY?3}Y_lj!@t z`^(9kGxN+d&(}QjdFGrlzp|;S=EDvFP|(XKR#cpQ^>yV7B9|6l{qd`oL>4&sb%prfafaUKIRBx;b9H#7 z4y$#zR)-Jh@F|3y=Q~cX4u7S?H+ATYQ|a%~VTleuti#1RT&2TxI=mm@#&XB`mJWM# zcu0qD>+tyT3hpo9;i1~`PB>qM({*@0(u=NhoNILWSsgy2!vz}dMjd`mhmYy-866(b z;XibE;!&!c3w2nn!?im6ybiyu!=LEzO&uP0w8}pbbWd*_=bW#fm+7!shmYv+X&t_* z!|??w|0z2Bhz@Vi;Tj#@t-~jDxJQS7)M0pn!gGNR7wNE0hj;7nDIMF}mJ=wZb;r(K7S>TstHf1$%c9VT?XEjoNrhrie1unvzuMwLHZhnMNF zT8GbTJ-?vZ~;boi_e59#oKbU3+C;h&|$%aDKjCdXNzpJ!+p*@ z+@-_my4)Y>=adeQo}}=fuERw-tkGeI4xiBBGdg@lhXXncAFJh{!}&T~ro%Nl{E7~L zsKejt@b5aD99DQ1X})IY=Sy_BT!(9Q_(dH)sly-Z@DDm1(&49pZ{yYDox61SxDKDw z;V*S~T#=Ty4$E{{p~DUxep!d#*Wp2g6{}Z7t6S=tE2^U_T31yxHr3X*RIF%S8Jtkn z)DoN!t!fNTSlw8gBcXX!a6(fwtBmGoOGQgfQ?$9Jp{_cUs~*vnRaMbOD+A+J)Yki; zsv7F+qg6hzl}*v87g=q6tq-OtT6K#ThA|Z_wX35Itv=Z1sJ~d!y`rw6>SiwrM%Opg z2c)z%*F~e2B%7P-Dyk~0YN8chVl(lpY-wepy_{s?QFMkDPjtoV$~6_y`j)2JXmc)* zEVczhZDUQeskybbg;X}IuBf$y9|+KlLh3E;`+-`UqsAa9Ac~4A z3(8N2KfS(kwWa?c49&Hu5jR&<*7=C7t8Mla!y(VfKhX_KY1n65O1ZY+zNG0*xrG*jct$x!|Id5%(?tId2s9#wjexXWWa&p)l zZMr4e6u=?L(d@T0Rn|8*HZ-+lnMO-()y;s*W>zO;GpiFCE1Q~qB; zmhAc`7$^u3x3ab_uz*bE3ZmSqd(9Oq8=5L$7|pc}f%H(OK{%>c_^O)7q`Ia83a?xp zz?n&^sA^dgn7q1Tb!|PGgqFH!5G7*cmGv#PkWXV>Wsu4QWJP85>dLB$y4uxt6QQaX zWFM`sYPzkFtyHugp49KVC|tA-jSXmB1E`FyX+dhV8ad%AP@AGvo>tH;W@Tkv-HOU= zmjUz{rxWa@NkUz8Rb|y};Iuxv3I2YQwGdQr!ZC zkmb)s^@y#gS`h%=6s@ezZiih-jmD!V9lC+NRz>{{7iH!JY>YP5HUxrYHE7I?hKw~p zwc!Cwm~`c#f+~a$B3Ks269rbO=6b6K=E}$Q$pKWgG_}@ORkpw$Yl2M~`VI7MaER5> zm6fe^Edi_`G272m$4JQb^VKNgmT1Mz(c65eq&BL$8q|E+$*qmm;KIw`%4kbf4a#e@ zdvBD=%DUF(nhJF4vQs?$M8dKs;c?{NGMK#Lwia|^DsQQ*t;V*?+M5a^C&9J8{n zc2y1fX$`9z>!PUe{>-MG@JRr6;u-6(PB0Fb*fYu!D50S>_AXY#BW889BzIbAtRP3E+IY-tXJb;b&Bde$6J8;Zs};2k*^xC3%`MqO2!hw3;sgwg<~pctCerqHQ+B5xOmCMnFyB4y!??|^RvmVsHoCI zah2+)gETyiq!!?^e>T2~3hC6Mr>`I?DlRWyj9GF6-wPb1`+#FFB1(aSWw%dt986{M=aN!U5oH6xA-(+kylk56I7`6%kj9~) z90yaDHRgUAZZIY0R8;}{_^=>{=$(To4DOMfZlDy*D!6z@>VJjftdWjTFvXw+qkVyD>NKq@TjS z*2Eley0ca!7uOX4jh zq4<)L0u)z>;)+rq6fDAwW;{`T_`<#64qC>#9t!KmiW^=`ed(V^j)ad{dA1Q|_+$t2 zy!zT}VgpkXktvDD5hVLT9jA{8Bd8%Es5U_5?VmQ z5|99{kL-{2Ouezcu?1ROQZgBQO@Vl)rfPs@Y>N0c1gxwi z(Wcl5R>bkZ7(OO^a+#6OV#}Tnh&z6BM9m3ogWte?Ss zCpwri`=#W@nZT$-llL4^K2JM7>wCPVf+EG*-fUBcaUX$ziXfoL5YUv=Wy50?P?E)V zB|CnPFvCMUq?7@6SPr!1q~87qAr1jfxRkqjk>YS{G6-DvoFstu@ExLW)~1BO#QMUq zAt&5%3}RvmEWG}43d-=@86nR?Lh^ewiacTWS>gPCavq;k0{%i-Je%r$Eod8?K|Bh{ zjE&zs;LMPCB}oh>PO&)}i96l}Ut%P2`JX|3)d;8~QxhVx@XpZO(Mq_=Uji~GsTO1| zhz*?_zWZ!S-5dM4aFVTvCpO-(AGy*X%h|;&`Wbi78IwA@UDbAO$fxP(=dN*a(Rune zh>NW)cEaob2f5NJD{0Zz&>j_J+UVPsQ3T@P^F-gzi0YG~`pG3Q>ulB2%`X4DU#3!o zOGO;@A|vPjYb*Q9&{(bPgHVMkIMJqDgvagBxhVe+jDh}t-M~!C0kN$L@;;Yh&5_<` za73RYx#@FOVM$Os=--R@nF62F`6@aG$@`TfpE8!_^o@5Q3GwEM8wxTl5xjVIOC;^@ z*F5FD{;!sIYp(KQU4^-dJkKpM(WV5IC?8}S%%0G?9?DnR$JB{HPT%k8&y-o>SH3s9 zee6YRuAM)ddiI_y2dSF@Rp;Dp&dC6Zp=C539>FaQ0(7aBb5clE$g)r@g$mWjYV#cb zqdLtYSE#~e1&O32%-p=+9?bfL$?oAeJ*4SJ=kB&9z`MWgF;u@6-u)TvtN zpQU1bg^h!q=(eSF2=NF!#$9?DTv3F5& zg5X+Hci$#3TF`CmL>gyF>1t=mTh!g0&hos&W0mD?kb1_DwMm)MuR`f@X}L{v$bxlS zEy~u`sRij3Ln29+FTxnDIg7nb=Pq2yer9FYU0|c^yuTj0(QQTOH80p4N!1znMv2$SKq7miqit(7} zARxWPvnVS0J(|5Z2Nox)A9MxO%w;JO4}UV#3NJFzmTDd z2(nEn!rNX!f2zH@X)vI@vd7;v`>es-32ao<_ARMzs$!_KK=lrPfKslA-f@R3`1y_^dpX$^g*=Ry!xixB%*v@pLzQhLVq_SKWFW*ir zdB@@yKt%Q?;xD1LB__nn2Yth(5(pyI^Cmb06s9T)OTcp|^(11XRpnO9L}Yui?NK5a z#l{9eSsMH7oZiR|fK)lXd}~_r_U(H0(fgveYCoGT6OXCS*2^HmCji+W1>^tiXCP3tBTK< z)_g|s^l7cdve1Tv;^Jw|6CFZbRO}Q_D?N7&qKX~hS~i3KubbiAQd!p;EpAw8GFKO4 zTR`)S;@akmCSpRdxU>|2#ivcH#-oF+ZnHk@)YcMm1GV0{Hahyw@ipz!@gut8O zSM0b(Og63ooSk%uBUj}Tm80FabFwrExai6)$8FzcZxT3=R z5a&KQlH~;6qW?Z}MEJb;*n;-)ADx7vC4Mf##YiK+j!9d%K6EGCKl3fa)dnq-cQ^gg z_4#*(VtGtogR2Yal!KdY<$s9je?D@AG6_oGh3H~5MU;=5et8D}K}5Hqg{Q3CbPN9w zqDwJkq}<$eEB_S4vtgqQ-E=GeT*Mb+T7&X*(=~q+F+U5HOd5QTvxW2G_8Hm!TQ*tg+*iwd46hyC_v!Th zqn$0+Tj@W>vymU+u|M7|m(MrgV!0Pv@m%oY{(6>s3__OsqobTH5yKDCA3=YK@lnJt zv*N#jej4Lf*s!ZqeO zTV`7LuEn$AmwbEx&#s*D{72MH^82IlnfN{+Mmm-~OV6;1?pNVIKm(Twg z=gofu;zW*Cd?_-Yk9hp$@4-E*4kqedJWOARXG0&KQAgZ#sMKMn1o=aob+|!?Yjjwx z!^JwBufyp&q%UWF1QMc}IW34d7JQPQ^LUSoZPI_}d$tpNZ-w!LMJi*M_ew?%@4LY4 zJS6d+ZPIRi&$j3deP4|5RDI9(?OI%f=P!v%-#Xi@`$|V&7_hVU)zXG<-{LF*)*ZB~Ud)DJeUI%A> z*5%VtzWsv>b$_F+gD(M&5NId`4pc*DGkg=G_~WDeMq3BxyDja&F$Z|T)Y@Znx^2&_2Vk0UABS4x+#}nBL%$<#*{~b)>UHz z3+)x#R4vGeM}}m~$D$LFp?G9CeJP?jf;{LOHWmXUbw6x5;ED~6dxpg9LKY{y zpgSJv)3MO9vy1wX*nY0EM~d`Flc+JsPDTzOC`^46D1`HjSTG;(vW>Bs7v3V2}ODn(v>I^k>Oa+ z!W&-H>$b6hg5FRG6)f_SL3aeev%6wF1zv^8I&W-XnMYsGpbTtKu=I79`g%v}Yk!cw z{(xDA-pB!R5vZ?&f%-ZWTU&@RJL`IHge?ySoE`=4R|?!G3S7r24Nk|~3amt~-pFC4 zz#2o$9E>jYQ@h=NssD34V<7Kox#p?H>bT?G`e zwUZ$=_8?3tqzfHdCv`(00r=XWCpE7S;IF`}T zbEM=Uqd){1OJW0 z4@}x(c!#YDEF;PK5l`;peVeMDiSl8t155qyV8Xf{R&4CYIss@n4ZJ}1NyP@>sZgeJ zXmmBGVNU9=STBzCgOrzAZm6O|Gn}|*+;|9 zJAXm{29IBO=kM{Q!)ScT8wI69b}GdyFl0+Y&-NrHf@3|?ZRVAK75>pgxZB;>7_U7H zccB};@6+bK2vmushjoLQv9;7EftTH_wP-4n^@LIm=3Ho4Jb=a`-en2WQ`1Sw+~ROM zO(AunJY5j(&~V#X+DxW6k`i)L1Op}o*qhoxD0alGE(tV2`L7#bTVdLZ#Q>zCdp7jN zJC-0i_8kAae5QoYCs@lnm@9m3S9nIpT;9!y?8UVU*H&B);p#-v8cFJ?QNc0R zZI^Z&TRRNr!IlWKJ-4m=DO-liF&6ar8kn=K~jX*rPy&QeKgDDE@NLR zl1fBU>w2hX*tE5e z+w+rTIM|-izebh9Uu>?~)_E3~W*mEbtoLmEQa|NttBy?ds0Y=$#@G)Bi1nkF#E&*4 zzheBqT|K#Rn{julN_OMeYi6GSKR1qz)qlgj?6^T#?n;Tuz%7SuM|^SH1L8REd9@F2 zIpSXS#g(E9%25J-E-j@nI6oW*pBy0BaFf-ulWQ%b6RXi8BePxsc#dD$G;Tne$jX;S zV;F?oMP|OVMx=$Hf03OpZ3EJ#pu&p`eQ8^fHZXMLh{)2H)`PS%^f^SPzO+81wd6=+ zQ@9mrB4b~^DUc*L1BeWLXM!vi{e79sI|1tGTaPr3pj@eIHw@k+p?S9JJ@4)4(683>7QqJI7ZY#sfn zNk7C~`Nwp*$D&R=hWIezKdi%TsNbBPX+~I#@B)OVAv_i##&DB%02%jx$vwhT^gaC$`C>f%&mj#@zq3@|)6dP* z_w;Yw29L5g&|HQXOqbvSnEYnp#@xTxx~J?-{HHDWUs&;+yE8CPSTKcF{O_#zpIi42 zSuodG@$Xvq3G4n%3!W?2_>0XvUhs1;*^W10 z5t1psc?Za<`WCDj*wgK59RV-r)mKW2y?$VGMVSSkC&Ltd%nTX1m3tOUguF55;EWEO zSK(AJ8Lyk-tyMf|@p<2FB!qek(5BJ1BtW3-<9E26Kwk0MYR+@ma=e#!?%cUJjg7zM z6ZzJmoQC7B1_ZAMNPAtZ?3MH7LBC=6Vb%wRa2ImHMapk1>jB;H)67qYvyH`-kOd}QbX>u{`Dvi?Uhpmzcv+o zpjmb2@(mu+!waDQ^3NR`%UISo+XeqALss;IkEC9~KXhe#%R+6~awT^KoV!w^ZL6=3 zH?~UD$aQuXCarIons;$X@34Gcs4K+2E~L%7xFFn7f~+J1+rt@C817)VUSjYX z9%730rtTQCmKVml@d{Zg_ChH30tVixL}O9BFWy)XUmS`Tq<(G&&M*fj{Rxw!6o9d= zP^_!e8Z4Fq1Oosy+w%xA65GNWlpJ4J%?!KPsDhaX2^cC70b#%}7dNRo!ecJ-;^i`@ zCK^yOOta||@|Sb2@Df2>m{`1==sSs$H*KA`v8J6;CmG6Jc}Vt<%HCVH9Pk+3iJH=U z`7^B}7^H<=-eE`|>nXX>J5#Yh=7yl}Ii!p8AwGRSCWFGmy%9D!C}lvQDu8<3m7Nrg zpuacL$21v=wto$GiO3<@k9LR>6WyO8vCw@#bq@tX_v~I^8)G8UA1_EZ$b(X3zfokr zSCNIFNF*zqadj}Zb`ZKi-w{RjC!Bea!En-j5;N@=3&j6ELTH=pPjfy(4XBfn`H;4} z4J1^oS&y`pY(ES2ie>kwmjb|2{3bl6n$c1BjnGv-?$C;@?ZdcTG20J;fLU4wM3IQ} z#XDI`L~TYCNRTPWLdz`M0OXowzRc_QyQVmg*vK61i00Lgku_aHe}21);gA-0L{Y%9 zT~yBk66%kwS;Y!JAP0Q4Hzul+ni$6~VO2ahv`gjgRx3 zBo)8QQ~+C1zr_e%$5XyD&W$TWi}fTfI}Q)BRt#_#t~4NSIpQi6Y8Q@ueg1Nd*SBEI zDs)-n%PD}Li|ZiLNT0j+Zo&FIrY*s>4H_k#{Y>Fm$x1lWGtaAp9so7{;V22nqiVIv`AsBV;=F+MsSu zx)CAApscrqBY!ZZNzWieyFFYSPAgRCik=h%8AeX?Zjp7C*#K4bKGX`e`moITlYQI z{buW4k2Mj4pL?LC+gp?|Mb@EM*8ZKW6TRfb#q3i;)Jcr!QwJ4-K66ksd*I%a6|o6u zHO}GlZwEr>p0KhP$aL;q8s#t*~fF($3|A+*sz8wvk&Loxy6~^Xy;4&qfFh8o0 za|pQD)A07gM?NQm<<8Z#*(4fUBs%ux>ziA6D?k6)5*t86CwV~SvvC-BhS@m0=XFd* z-U1N68x@&2Hq24`<9s+qJg;NwRMbHXM0)tLo%OS68f{$i$T^O)8F?3=3(kCp;Z#8q ze=eF)$0emWX9F4fH4e#*fACc`=6)J(ig5YQ+L&{p_%3HZLhezt$0gJ;FVe%N)YcIm z$MjRoTT^gmxLpk! zh7;(948>nSzmh9Q1**S=T{md3u_&~bLjt^gTt3t*?Dn>iVBWfPNONtCldy)M_`|Ar zvTX(^lJ3Be9GP&27Srjth^x(k=Oym&WE*TEBLRI zo_R9<5_A$T9}R2KHpz#h6Paw`fMmExUet3ks0Adz|!|G|_Oh z<)X2Ak>BEdMB0|AHD-~ z)lRwu|G+r4o~8-mp7kKjNeA4sVw%-M+`1Zb`SH>7zk-=V-b`sjjJxwV6K6`JE5<$k zyIAeRPNbi^*yT3X^$)T-IvVtSfpKOR=2dZh3HRS(h^qwGbX+$(=rbXlj0>*7`3}Oz zaove4fomT%$Iah-+xb8tO|`)v$yordcST&o=Poe;hk7n%v@+X%mcYdx;J zaNUlp3D+&So_EyRRRQkbgNtp-H*r0I`?x;O)fol#f4r(6dh5HX7JRjG&xIYtD7}wdjPREsx>&v)4iwl2F zJFX;dZo?JF)r#v82N%Nm2;ss}&m3n4u48e{!Zi(72-jv@pTYI4gRU;F4Y*%}s}olX zu89u(FTy-r-@^UVxbDaGc|3ms*EZbm#I*_6eRzHd*XMEnbzEP?{dW*1aovOa`*D38 z*H%1lK}a9F0oUEQ--K%`t^}TsMtB^q^Kjjb=X_itT!nZZkLy0%--YXaxF+B_staug zu6ejF!gV38?>TCp{49j5X{;0Da2?Zy5Z5!f--YXJT;IjD9oI};{7vYB-A&Du%d+!u zF+W3I{7vj~oXY{nN!sy0PdVo;3(&9fV&ECXN`jI+kk5x1&;Wd0QUgkCj0RD z_0bHt7XiomY4hucTMxKFz~OI1e(wa_`#&J-f*yRftbxKQ0NfRTn}++5?BHm?H3II; z5#X5ry@0zHaK`RUd44`718xW4Y+ecLhdTpszts4sUxUvM5iP#*e*tIg&rUb@gqz+4 zKYFq%mt~tYJ0x5w;4TN8u|GTA+!O8=z%>BQ=+~tA`M4EuUj&@dZ!WmI0QW<{8T}eK zJ4CV4ZVUnreba1|OnbI(g4_IDAUR{&K;w z9WMo(@h=9>@XCvbtop>%jRpA>6j(w3!0cY&l;PcCmeV_)w8GFtJNBSQE+%$wE zmHQ~tp9P$;({XsV%QSj>1o6KHoUzkfaPtB8F5qZalwU5m4`E(YA`fFr(<@-)op9S1K zfHQWQ3vMFH-2pgbrv?tu9(|CeR{%%9n};h1jxe;7|JHDP&INaD7vzCLja{*iY2)QR zf8j334{-FS#Fqxh3Ia7KQ);JyvG*8ses;e>H7}S{s}nhj8`tW4M_XI43$oL4IFM=I(eVO zH4kvaH4@xcyD)hPIMZ$!d^XQOA!F}Pj{?VbW()9b0Gw&Ja^c$wxUY@^M|>RHcLC1W zpTXysALj@D061fRx!~>w+(a0G@h=9>&+k2eI|p#a{&K-39IOWdZW_Xon*fKu zoN&zl4O|HT8T+Hn*tGGUzi;CD4&aRa<$`+>a6bba=_ibV^ULokq`d<;V}H5eHUjP> zD3|z1uYtp@ODFH|#Wf#r#{P1_J<)}2_<%F^XW(p}iSL_$`^+eCw3n{|?hAm!pNC&R zzHb0-=O}Q*_W1PsxDb?U z>?If61%NvPaK>J8!F>^MR{+lFBNyDmfNKSu(MK-0Ie^;?I3vGYaOVN82XIDyL2#7c zHeA04oT4!E(M&aA35Ow zdmZ46ehr*oe)j?Hvw$=D4T7T__yo)x)d!NLgtUw!ecYcF52 zaMs07hxTv9$VA^^;qn;S%U90`X8$c5vQi_0U67F~X^E%uy3aDm4n2^V-Q;&p+?BD?bz zz)T_wA|qSCRhP^Wro47^)##??0kJr>l;8mo2`hv3N-hg3(8xScR&id_$$|| z=jg<_pre=Vg633dHUY#sGOZ)1(?#c3CjEw+NUsr4OcqQ4)qybD`v9e=JPXDWR8AO6 z?xP|Z0YKO6U=m!QXQp zMCUU;4`86_jb>M#^Z-(_(tU#Tq+1N*R(STL`^Dx-v@&PsltgU<*|}WX@gzxUL3wn7 zwi!2%M9r z2k$5xxv<1L3cb12Y7y#J?Bc7h^o}@u1bNZ}i14Hb2+ETlARJG+m0!%jlW1kmk*NK3 zb}rY)dy=HIpgcN3`*=5xs|$-v5alJt1+vIBb{LE)m%u%ke5!Xb1?t>Q^(&iAzME)< zn7;C}V91EC_$-(JiDbb92qX)}!XskM0MXjFbTws> z4??r?xPTTL#yC9GxPZhsl7d`7VjM|JfrjEK({C(r8bRg~(60H6DuB6>afzS;KrBQ- zATI9#V)tQlK`oR<@IKH$LHS_(qGET+wT2w^Dhnn+V_7f(oMpiTu#^R3;Sot@0a!?~ z0bJ=>Xpmt9KntA_v!_T8MxT8L0}`XpzCD0}YV$zYN;7kF2h|Oy`sCM#|DRO1Zd@7e z?(xO(Y==d@xMC~@e8?BK9B~_baeU9}Dqq}UOkQ%o6Mk;FoG;}s=X+@{m$8!xE$kf4+QMk+ueD!ly5-2WbOH z6MlVZeMl?C>)67#mB#lRAcTCJ1h|FonBe#2R}qoM#rOyCuMkV(S0kP8u`vBg#QgM*3kL+@4jcxFHIZ_r`24(ID|vJMB{ zqu_dU_=pZ$bht=|B|01iW5jzvhud`6u0x#nFX?l1Sg6DPA{D<|hnsX*r^5w0oT|ga zVFkZWhg)=byAGG=aHbAJIy`i&%C|#@8+2H$!}&U#tV5jJFZA~4@DUxh=x~t^OLRC4 zqZ0mgxJ`%cI=o(ob97j!!+sbO^X=B*CLPx4aDfh|>hSPH1;0;+TXcB44wvX~rVe== zD)Aqhpu!zG+@Qm19nRO`WF7LXA?EARA99nH!&uN@I?s1txJ`%cI^@|A zjGv>!LLK&_4l;hX4matrPKOJ0I8}#-0ZjOPI^3ee+jY1^hck5;(%~U2uHZJbLx&r5 zSgphPI-IP-0n}l__vr8u9rDZ~#xK%gi4OT<3*!&yaGMU>b$GoF=jf0JqY}QKP6Xj@ z9d6Pg&j(`s0v+<)3qBu)V_~>Yhg)=byAGG=aHbByj=*m~2o#|;I;_^=Vja%c;dC9s zZ3sL936WRM;HM9~T;J0_zRP>afIbgZ+Tr<9^rP=V2EJe0hqweT-k0Hm-<5l|W3@V- z?bmrap6wvpCBn0v+^+B07M`i^5y*SkNLIg!=GMl>hNhNiHBPwa8?sfIH$QPoJipK0 zQj6Cjz3-#)TpJq_$r(Hr2FABE$&0Y&WmkD$*D9kG@3vNCeemAGfzxOjRuc`r2jry! z@8a4-RPg)uI4-}kZWK6m;Ei1bj>K6RZHm@c;Z&SlgbEq8IN-(x@RQ(Aw+j(YqnY<} zaTJdG8}0qv^Upnh_5}j1-_Nb9wO`B4dM_7t?#R2i#bSfb23O%)?>eZy4}AgH2Sd0O zxtN!~vAmbN8lu)aO;vX+WWALNxVl3{x{!aWdZ^;KQ)Gs zX}Cdi?7j~>Lq89HU%l_j!lvLV*o{5Q2-kFDO&bXC=bqccy3C6zJqs6oO0HiBc!E@q z_hWhPN{adTf-K(c(}#KE4(Fxda2vGFco`56^YLb7As%=V#yvPY;#m;Mw^BE5hw_r0 z&*FcgRlNvlzKTXR@D()mbvoq57Xj7RuHhJaJcSihBn%OQ`(2+0!jqKTQTW7@h9BL^M%Xz0pGL&DIo8RxH%2KtI}MMI(ueh9SyhZi4| zH{K8Ea<;P^eZR5W+$TDv>f_tNuaDz5HRi}S>)p?aengJ!=}K-F@oqf+7NR&1>lz=A z9NdL#Y#p8@-<0h=3JQv=zow4Uqme2so~5@l0h`iTjNPvA4(1&Pb& z;$Sp=?h+_1CO}G{^Kmqbsp%c zxOM*x7DHD$UCph^FpX6cdm1#MbseuVcZN|J+gI7MZI&nb~_8lX~0jwk#%jxrq@%>R%GIVMDrrD~aLoj*0!xi_&E zyzC0F(Gy_`uHQKwr|ZKO#nf@Mo0dTLP=T-RxJg;@rkZ>Uy$Wbqxrk{(r)^kNx@%^3 zk(OYNGi+Wf*pjQ2=PT2WVFP8y>< zFy$7Ro7hkK3QWC-1JA9T^&=3=@swdyh`dwsT15KDVuh1-JTG!cw~|SmPl#3{b^S+4 za32%!#e>{%bI@jw1@4i^*x-85{T&OweV307uIGxe!3|tFHn_u!#s*jTv9ZCGe0*$h z^FKj2xANUBmCvY$b?Z=ouX>CIVfsj)`3sM~JmiGeUnItOs5@0K?FeqOeA1yD(W~v*l=>Jl>qAg6@Q(FdFQ3uQoY1q9 z=R{)sv2I`kvP-`RgL-_i97B*-Yd8e?>1uYa_9GR+J_f->zReCQI}@+sW9bx9StBc) z8r=3G&MSyr$&G@)^9|t7DF}Y})z$kQf>;D`9{Qd@9b2>J_;C9$X_6KPgZl5Phr~jh z#tL=uBu$Koc5Nf!;SEc5Y8ejVMNf0yI>v|ZRwI>NhUFt9$(1X;C1{YrX93z}Ve)Tp zD!IlnQu!KM<3z;GeQtfO+=V9hE}i>+Z36`RNgPcgRXoM?)9FN(3);@5mKLa}q4WOBTY&u(jlUjT2wLCjs46QK&q<|o?N zX=JTgKhS?*1Nz-pf{d)vS_%ggk`Z`<(4*}Z|>pmUbsyjIDH!R{)Y(6dK zmgHH6;8IY6+R?Tidg#OCnl9%yx~TG9$$P~@fJw-JlbaC2b1a{Ts^DHvT( zg%pY*g%U_%dg>v3AD)C{zGs7+1(yPOYAuqevU{PjSug-vsP-iJ4Sa;fmyPf4o04e7 z-7R_De=M3XsP04Ee=IQf`4a}wtrx%36VTpVW9c(BQBjjvIDcI?hvBjAVidzk1NBKd z(pC)G$Q{OrM^eA~6Ule!nVDu&cjrsU2ZoZny-3v6m|o&Yu(eXk$0fmdo7r#_Cn z#=wtEQo7WYYO@k>iiX8XwHc$)yz+jS+WN178E`0PIiDWh87k=R!*KObVkyqHJ|n!d z@VE(kaU``I4ZWVTpSTN!@0caI+)De1#y?Zze*{L5N_#rP${etw zPbGKDdq|hJyIk?}5S)bKM^8cbfj%caW*OdU3O>dv`1^%GK|Dr0r}@NFV#Jd&5Yz4o z6?8^^8QvNBrA!UciY?_?$bD~%AO42VzXz??K6S`?7H(#?OX#=C%89?c=hnJ zN8_`7dFN9rLZoLe2?waK?*Z3podsSb8Y-!fA=te(PBN zzx@%Fk~4jsfRry7csht|+GI)$spb;|FCvT9(_H8YQw%}}x|F2DJRkw%ZxX0GFN^2K z@L2#?J^@o9Hvw__CPgu3!(kbuou;vvMS7+rU2Etz8Vj0|e8JY(F+idx+ICMc=HI$2 z`G9Ef?q2~>a{W8}|NQ@Gq&E~KJ~cn_FeMQChZBzU2DsS0b{S9n!DCME8sdzpqC4x( z)c?rNSnthvGSsgeY+`MHtaln}=iGp@e{7>TOHe42kR#AfM1=b--!qgnGmA=U4hEXX zI16&#tL9+F>{foxqS;N}(Vy{W)ew|B8^ulnDxAz+nTaVqpYQfDbN6jtGx(QS_(Q-? zqw*k*|41f8InyQO&E}UPXkzxe)1Pvd#1Ht0w^%W%5VlW%2|uYj;-AXjAyH|*k9WW z&;XAc0ff=Eul(GzGLM_`uaxo!Su~~q*Y#|`jhY2C=e5iH-|ZkiMW9c{@87M~aFTbu zx&+<2JI<{@*866z#Q*oi@d;yi@v9c$_Wl9Fx$O+>&^4a7(Bg~Z`pK&R=^$WiO%b?V z44^~@3qadJ>}?+>_CO?u4U$eGVRu~5!KzQvli2hj4ulN;3E}o4!LQ4k818tM&#E{4 z!lj_8W00h<=WbE5Q7GyBG$}#-78qT{MWwn2l2;%Ms{KfZe@(`SE#AS;o2Rc5O2)?7 z(Zs}F;J1k-n6vT3rzr0P)QFV7aoxz2zsIKhB0uHaCWeyKZ0Z6Lpv}fT9tGJpKE<%{ z#;;)GA_j*uqL(Rzm;#pR$HH(sR_-!t%J-@1X!C_MOuugdAd5)v!pwr#P;%2T!_ZOT zrQ-+0!NF8xyki%1q{aCK><3GTkz+h23CSnL0`B_`SRJ=F-jPzk$cV0S-a46v?C57C z#;Qq4RgaJIe#XIoVe2`h$=)jR;z1gWwoHhi)D{U2_b;}ekMfDAAlw0WCjECQ7~}Ay z&;f59f+ZECw!lk>UH>ZzywC{lbP%T%*Z~EupP>DeO|YkGL1+0ODBT8Sxj>kN^#C0; zD%FquJ5+znP~G@T57qk-pZ=3A#yp=`3w#7(z%zrSFN^g?L*UE5@DNCwNN4Nk z#hevvl|i&VgJ=`<^GA3_X+l)b-&hsoU+iPwqYtplR|0xF4#H{yh`R&&&Qy~fG;-y2 zny|da3c@H>iv3JdRU^rJ^lLiyDe%~u$yj4}n`L9@8f>9SDHXO_n3Ph*|NZB`BVK-b zS#mf2+#}xoN6{9^QM_Zj5X;)ehV?Q4k`=~s`Y~Gvxt&X=DQ&#Bv=t~V{duxX*9rcU zvdvUa_6N+8q>)TM|Q6IVOw zl1a&)nZGXsbm|lWiD@Uqu#@)-RA$O8bp$WJB_rEC*;9XFq)WjeJb6kI(tIU7O(0K6 z0%etSzbYx#Rg_Fx7*cDcFvEO(uB7ou)UbOEWI|0bVThbei6e0bR1g5V)DiY_E-$d=!IXl z!%gft5p|ev<3ZYdh<9wkfB8gDM*QCZM%wOI5QcYlDVRi3a6Lyvs;`oeyr!q}SBO2J z=8T)*t2yOBDk8=1%jFm(WqZEy%RyaW|2v<^*h?+Q@XYRA4cmOGX>MZS@^#&^(yZLB zUL832vg%_8l$P7i9&1YbB64e|_IZ@{E~J-i#hRiNxNP~l7o|XPqlx<|RnsHuqlBlH zU`a8=4ZH9lg|6jAfOJGVK7nEw!H(ZY@{Aq7^Is^{?)-COK^m8Fzq>(-8Q{zyW{jDd zLflx^B%ig)-q&7i*nb$fHT%G)+-D+rn7k!7liM~KiJ_$(F>m$FQw@1vz$ng0B^ zE=snZsCf>TgKZuTpbU3B{3*l1bJ#|VvAhhELJC!8&;u5F+xC+M{AloIz$?bD22+#V z!BV1=pxovnH;LB0$p?h7yZ3>P}*gC{lKh+pD&=#?~Ih)Y~_O_I??hVou@$#R`4! ze|`iR)V2evFLf-iOZOl9Y(yhi+0*atthA7nd5~O~K>`gssh55fgrp2f=~MU*m-ZWc z#{t%gmmTyr)%2C<=71U1!Tt#Vg+JM*0dil)cwc;F$0CrXOgL}11eFz zJ^li>&b%-_Zz%xPBK|&EdBNKc*r>HH56do`sC4zTOXsiErR@4Q^z@|BQ_o8oJ@NG- z;aZq6I|at;Vz5&H%p9`$*&=|OH9fzYMSeDupDn`AA&Vt!BR`PE$yS~7OUOxiZH;y3 zsUq0b9dj-2GR(ZQH^U5bYi3-#eZ%7j?1`}-8WcMe3hG{V=H0I5;SivPo!s}j{!7N|I6U3d@qcIRicsO9z>mYF(NBGZP z;^*5?>3L8hi?SRcUf)ube%eDR09{A;nxS+DF!3ELb|?ljBGgkrN-VA=4ru-T_AI5p z0k(W@l~j)LSfj`>Q1OPL;%r4l8{RH7OXwb_oBb{!rnbm7>(yWOP#A7;_js7LmHt;# z+z*grq|bscknh^d`(X1;d(BPD$Hik=L5SCLumLiG|oc&#-K2t}fY=%xqrg0p}>@P;#R%+WA8=nyYC(4nt?xBI|%f zZ%_C!7`Jfz#^4~+Li5ysb({Cu$W9hyE){>s!Z1Am!|^tT-}FcYOstt7>lJY|&R@4@ z8JYn~WAXfTFYv5`ED6moL5DTOjbtTA_H)AXje#O0W6+sBYXEnRF(%ZkA!u4*cRs4RDX{TA=BUE1E%9AiCX!9xp*#T z!=k{UNPv>*)b|_3e3qgk;j^7NB}r_&fp8!cS(Zwn6XGhr0i@(Ip-G0bAn9CWGc*HO zv_PV+xMr&-M&8` z+`c~_3c?*vn`(gfs8J5qV~jh;ZtYDHqgN3R8Rz$LlIS*ncB67VN#a1Y0_3oFeHW;D z4pdpz22cJF8Nv=szS1`yyG=gil%Zg~55z6zrkusBG{p>csbU^LG2AMueJT1Q+I3>z zPW->*HKJ7KWK^#H&fIAQ39s>Yl6zGT6vdgD4R?p>tsuYx$z%5$b%(OeH?Q3HQ;6w5 zh}&1{Q18KWGhfPmNv0oilX}JWD)rVJN=UuKsv0`6l_n@F{eX)J)B1WH*lJBil<7k` zWqOy9>6Ra4WIA4qL)xd@avNEufz4GJ%J{dNt2}1@cbcmQ?F#eU^RBO%3QwkcQMyw6 zx7Pfc`5C`q8rElNtY-yy$oVD7wf%u}9-ly2xhNjdJ8rcpJ|;u)O=1H7hIia%BYgHb zR2$Xjb}QWlSLCYO-(^T19nTV5c7bqRmP zIJ+Q+$%RMP>mCavx@lO=G9M5`R2RmL=rv>Sr|~g4>J?y|)Pu7F>(z-wIc7<`WF&Fh z?u;aU3G`W#NMYkM+{4IkHOV%9Yl4COxs!o8hs>V17#hmeBm226vtNJTm6_VD;A;78 zj~k%JfuP0v{L1k5C^A#a_{p$nzVC&l?Dv&!jJI+GnY{ZfIIraTk3rYTrCo`gw?}~D zf_Up-Z)8^+_DqxbTNW{9M{i_13+Rn(V-R1uwKuYbcbV43rtN5WLb1Sc!kBdZ|Mn~e zwaXezJ(Aog1auxZPYcStbPFZBn^%t^E;E?=E|6dw71R_v0CgqH zyI2@sG%BDlrK12*hmPz=yv(1-mXF@Z<`S@HG_JV3a~9O1rhSmtNu2=XqTBxvNo>V3 zOgyqR5!oC|;bt>36D<9rr0U6;X7!LLTf{>+3b8=W%m77~lG4;~6PAVY)08g~%+N}P zUwg_zAwW?of1fGTr0(5yiPEJO4jbZZYbB&?gEVN?+F((V1HVZ%4>9R0aSa5asJjLL4 zZf*Co!RYP|H#2HIb{EFWHzwM|%bB%+V+H3%YmZl|9GSw$WM25x^Ggd-0Oe{xpUf@{ zq8=vOzT~kVn}$aX4gdU})M;Aj+qm`4C-o&a3Zl;8^Rz&M=973rr>oO%3qF}o;tS)D zyFH)Om+VxOecwZwZP`y4%Bq3M%qN8vDs118Dc+EK){}Xo5YwGf)9yhP<$NICJ~;|g zN_zTv48`s;#r}DRD)v59sD~gjS`MegF%2mt%+e(szzzxyJviyix6{gTbNRUL*NY}# zJ%;z=yI(Ib_p()eP=L!qvVolt`P{%hfZj-~>nNEcmIC%oQ7jxB$Az7FvRBE>gpGlb z9~wqVEJj|2gwdHY>ijjOZ#VrAuiK*W1tC|RzkN!%e7^r8$76{>@{FcJ+{wW$?tx&4 zNUxNFATg{Y)`;lvUQV6q!5s&OWFl*5a%~3v+}^Sp<>?pbGHPij3UEq7}n3` z#+zyqtpn!1F43yCP$IrDQ{_dbx{>>{q2eAd)@j5lD0@Fjf#&cSgC_f8WVfdq7vS(J zzVD3*=2GJT*ijTA>obOEVRZEVGt^FIaWroCpc$UBil*o=2}%D3|Iil>mGCL`%kM%O z<^9Qf-#QbHC4MWLS6LT&%WGSuG7Ka)Zk_?5buOg!lR+RLSin@wLPneB zv1+?wvr~Zk;svQsAVyB;J3KEk6u#qlKx6JcQ9d*Su3|9OJ%KLogAzNC?37a5Ze^)% zJ0z7!8zuVgsvG?7cTgu(3p}LHav9n~)ZVATSXaJ%GQ*HQfoZ4{JTcKdoWY-xH&V8| z;B3CKb7Kh1zI2FU7Rgcb0rfi{Oe>*5f$;)$5S-S3Y+$;nO;oR?{$bG`JK0+OD92Ji zchRe(et4oBbd&7-@)>N22 z8U4DL*LX17`t3BBPXy-lR|Vy;*6;8h2ZdQr<2+9&97ZaIc8zldJggNyOoi+8z{I7) zAbMT*fE1|#gLJU&TiU`kds-9I?JDVCKZAR-6(V|;{#B)Lq}(|gEj60!#HrZ3vtBEYjJjizr< z&u0!w|5_r{`-6jfLIrv7=qkr+-yB;G*pFfK4q?<=f32rUN;bJGG$iO+mDiKx&J&n{ zE)mVUTf0}9_akioj{Y*<#^v!L$WG(6Zd z0MqGDW3visYmn&-=zgv;9rRWd3lGAUGgfSy&if2S`6w-YyqJ#S1T`9_V^jA@@&#hW zbbkJIOuh>1!WLCJ=pFM=V}dCW%{>3gIg%SPz@GA+?W zv90krwNH5k8bD+qcb>ou<&>voF+uG?#$4__h34|!X_Ph0WjM=RU_c|9N10K^nypl@ z^8K>^OZ)!V&{3vAhr?Ip)u2ZftlI?!-3*{h-ylM@Ts(woJssnD@}`aVq-8Y?Xz)1G z5$mC&rhoo-+sjO^^ypaM(bBOOdw4@g2gjc-ri9P*aBSDFD#P&ypU5S^d`o}|-9psz zU;(Z&=u%&U04qlpV3t@c;UdlIa+5hu`*_+<2$8%hA)XyRnf(Ct98Y%spU5*TC+?Y! zDEp_<894=={$$%Ej{t0Wb{GM?@zq@N3|aD2=!QC@FC{M5H^Q>|tP_4qStY0-SYHkSYS4G@=2&Fu zFb=*DCV>ajaX~|k_F3g5%=2+A^iWAYqhK|~bJfSX2t5&xi+)KPZ#p-}cysd%?| zMCNPYkPjG*r~vEk5D)`6FVKJ4{ZXF*Wsh&DXP$P0u?L13wiTHvo+6L)S0~FuWu=(8 zOtu|>_sUch+nWAlD$1X}L|FxOH_@REWyYW`&ZAMIGdO|9bzW~8oDTqJ`nRG-t7iwJ zu%2*U(4Z|uZ|C2YxhGmT3rZ;JJnD%kCAN0Z)TW!HP|U&z|DEG$vYdq(448kx_pUPY zFTZ~bVo(zadO9<3B4Ibd_(_1GyaF?ikeN}E{t=IZFXI?jP0&Mu)FHashj7Dj*+JA6 zoJthmBQuU4KY@yRvKX(f{#Cu64U5LKRtQk8WVfOlb>R`_au4`HG{%@Jx?4rxeVs&O(4rXrZ83#lJ`rGB(Q}5^#fnsj%!q@teU}1H z>U<=@x5_zk&B#oVY!}2E|4PKrw>tH9@Ghq_@`jvIHHhPI-UxWR}J!nBShF-i|mfKX6txZXK%a9_39^EoJ?kl*wUXZ)j^2w)M`qpIF*TEd^?}9h|@Z zykKD=iH$sj5#}eH1Wa>%0NL&;e?yVfsgLP4pR3T;_wK{O9S!jC+G zUmKM?ha7I3h8fke8!PPT8?pbzEM6?kKM7q3PI@E!?3bhGW`}_oA{vhMgl>2-X#AC# z{=w1`zGu+R0}1JC%{*E6>*KKD9Cp{yA*c$`B-n{extS?T3)yarG*gx0=|?gyxhRt% zQjoWim05BYN#WUZT&eHrobAgA%9+69CQEDX@xRFJ*69C&GnN{C6NblHH5ItUq_Z`R zJ%pAk{TQ-AY;w-!eYj7r$G_NG?qLbz4o!`$lR-Gk<-bK_t8kP3lno$Ap5OzlxGG-@`V>j3*yoCCxX2(A?d za5dWc3OjG?kRC=SZC(UNYJC`zk*;uA5i8I4F+9uoBNkvrN!P$_NadOJpe&JzMqicO zh4QA*U~KJS>md$5CBzM)FUd7n(;zkL5l0FI+3L#wUpiqE`577%2cf@Nma)# zqGWgRw31|)1)Q&7JE>l+OD`5uz!xf%>T%;66octi(&I))O7XXr1-ky$=C9W9SFVtf zKXjhdvPH&N)cgUu8ztT<=MFHG!4HXe=r~agFrv3(-&8^af3i>wPomCWqgpUm8cUDQ z)I^16x5-har@j;Ahhu4aU|qiy*!==#4N}n69gu0z7D>SZU5cFtHB^b-ubR>n-E|oO z$_w$54*`m>;A$P+I1iBGqai#ROM-1pyz?NQjP#k3#>Hek9p47YBiWT>36@gL{BUdl z?h1c}R6B6-Q$dB$+n&hVRz0PG#?<(V!z8?d1z^k&<1SP*yBjU?+Y|P7M&70?SqSS!1Fq|Rdd=X~} z?NzWP%9iI-QC8n6H4cy>IbR_UdkV45@TaDbJ)c*FAV|Ljv~D4ZPBDkJE|#TtZhqk? z+;g;oO*lAnw^QH;bt-#sEF#qmToAIf2nz&+opy5F`7{Y)r#)!@$*)P1sdHxo3Bm9_ z(=x#!{p-0PK=Aq)eK{wieTLEBU?T{niTaiX7BEWWnX2cT{{)lTaA;iIr3fp+WRk8- z>=wJ#sW4H17w|aR1PI3BG$_4!9q%AJIZyhZt98(k61Ig`Dz{Wqb z0Gu>IYo3qe;JaUkGZ1egX06Vd6#?N@aTrzM3oO*`#lHsyv#Ux$?Gw4cz!dcpDQ2}c zuU{<+1q=`O*lhG{BpWV<_hexx3c%27W4ObM;lwNqa{@5zwK0?l28t49$=wX-dn{ejQehuj^JM2GYvJ~hlZ=Tk140@zH3$CfN=UyQ)czU%A(<(O$Yi%#;=Y%n0gfr=Ms4^sjTIBq zY7P$d5^GCRFLe_sBz#}YR@G~cnx45ErcgdPK2DtJ6@vUQ#0K({op+&MDPq&`s?%WC zj?HA#)Q;7_Wmx5BUbX)y8^?kcOF>g~L05VUddgD}GGv$Z4ZEZ~t0Xp#tb7oZ>$QKM z)O%)?)5I7;7;1Z+<+z;`y9wGs^xWFN6-i-JlB)m zbir(CK4a%TS#ldkoAHOS9&dXuKDfLfUhaCz0+^NQ53oOF>`7WN<%8N-g+%`wRHb1L zQ*TX!b#KH7Fxj>S9oLMs#6RhY{a0C&DXq^SJ4r)poPI{6g*qp>JFmuSpsI5?-a0^` zzqP%=xxgbz6c4GW(=G4`NRqmz%@~~@e38#v)(TS=v#WRGwvj<)Mlw^V-8t)^Yp}Z$ zih4nY4ym_7>h(c!+uRF^FNo?@ZlIIw=s&nCADpf9=>cjo?~l=AzhB9 zW_Pi9pCAPeC(1B&t=eO#O!a@|ecMGwV|{k@pZ$_FAd?}CU9_6;f^O+{3eS9nFE27# z7U&D{4wmPAvc6>JYY;-RZS#9`Y4lRp{;`RjTQbmBPv4JXq@fD$+}9~X5j=9FJE`#VZ z5)31g*TnZwEWK@f&9PLI?(LVlLdnNSDr4rhQ@GIxnr_8YyVItepFQqx8 zY5^jyRCyk^ke6~wzQz=Cwl0MI(vu7enL@aYw_okGrL8?=Uf|rtK1ANy!aRIjt+hzM znpGI|b{6Ms51`WHG-^~{ELtAIUikv-l`q6z`66g8vq}CdopcNK2P9pUyfKnWnrxNa z03=!^^!GB)+HsL61Ir7TF8Az=FO*#vNbtojDZm0rk?wE0n}zWGphdpdasL0+*8-t= z810K)UCZ=*iaXTeDhy|8kHj(FqcKBLs6Y0yar#&AUNS!@Ul7OludAG@y4q-cOL22c zWlQv;;%U`RO=W#`b4}&Vc&cuwk2H(bM2mISnrK~JgHzv7 zeAUM;D{gFRxTUr_TJ2Od)UT{v)!G!TE?!-^2G>muO~toFo0{<@^y1p)VvTlYF#wy9 zqp7&H8DA$aw!aLnaPSlAm92Fx&C_QXYNg1Tf>@)xsQ6RUsxO*WeS<^RRz>ThO<<^^ z3CuLC_GMF%#Vc-Wi8lL^@F8_YV0Cd_wEk=nh|T8A;tT{?M(MRHZvzhvH`hjsTN;pD z58jnbHI*vS7g|?9I)&7;w|^jdx*?I`vbmQ5Xo-%{LCyPCFG*Xk=*%cnWo1i2UU6Z9D(0N?DaXkCeK&_fSU z#Olhry5RgMBMLdzR<@9MmyKZH=Gs;Dl`XL23J9YCc3-o)dDJ|ujg1XWEz#-U+ZtOcT56*86=Q*?X}}8rwz(zRRM8x*YKpduR!U`EuT%h-{vmS2;mWG&vN}|s0O^2&5wjCnj6TO!spB_gDgZJCZR@}<^f0%s8J<0KRwz_cRqOgodNeA-N`N`JF@wwa zvK}qe&wx>hz?<1T?hsr8ai_HV$ttBG8|yQR4+Ot*FpQ~co2?V zv*=-<+|mV+C5_I|MhLAOePvl=Xl^7@i`r>yu0g+5hDr?3EU&DCb=f{wnD>)4qJ>CZoi&lEYedGz#3D)-<`T)|{*(<=KQjaUPGUaM7LT6Lv8nxM{honJN|rr-jty}5Ql zZQUZP{lgYe{nT`57<@2XZ|(fyPIY8{S@{ybvd|*YZWpkP)yi(>N$P_POl4hA9q*bC{$WY{urSjYBt4+bNhNJ!~NH z^3c4ps%m(KVNiw)TZVi7AR~G@BJ>>Pm7e1=xM{17^5_r&D zsw3raeq#6-_xLia&^GF7YU*k|nYDOmZE*VKsFC>*a@@F}s^0I$d=P5r)>IlPuc$1A z^2%x&(XZ9jl$J*tnrt1}rCk4+iDqMEU2}Css5Szv!Z7OVBejm(qr3j0rUE@wQ**r| zG$ZJ-8Ufr`>5y*Kyef8-Fu9wWtKjb4QuPZ;ffd6)uP!pOpnN@9W~ULJIH@>PURGZ= zw>sjY5`pJOnzYcis5T43RACM!hCALfDy31PV?$Th+hsGUDKxCUaX~2t+_gE}>%7&jd3fBOhA#JpgBz0bEvSKdPom*!v=M z3#={plL+hF<{~pf8^Vteyt%%>u1%|Fx7tM}2JA$+Wx8x> z-6>Zhvp%bmyi}KKYzKa50I{t!RxMRc<)9_)(Fxn69-*KkQKM$M72ibLr%IaI`lC~#0*HCLCi`=1`8h?nt>zVADsvf0SQ&gQ|cdU+1Lr(_(F(On^)mUEE;G0iW z$rM)g=sn3{sm1-}VzINglfwl$`SD}*O;|pTIJs`xcC7mS2MaX5w84(E3%j;<+PYDW z^Fu6$+i7zybez8dlTBmJMUHbU)_rZb7Hl-0A1K>787yH@(k|PH7Fxo~TyJI)nYw6yW0B$eRb_34V!S*`G`3KJJLp@J=k{If3f3K2jE(e7OW5Kp2;s~>2xP&S$2 zA)RL1b0!>_-`eZag1kw$=Q4c^{u0gUG~1w?ciHW|@5qZv{%j=Y;oVENM>l`6mk(B) zJvb`EwwWpaK_n;eiUixKo3HT?MA8QQjeatnW}9{MHE%nRG!So!vhBKg7H|8QkBdv# zj@^9C8*vW+&M~-*NnY^@$UPEygMOM$vu(R&!?#0frL$>BpNi}A*v{R2@I}1UNE^91 zotE})@FJag)Oi9IMY7!o%O#Mv^JnQa+kY^x6M5ZuQ$qYe0Ou~`?cJJAi$4hD?ML2_ zpQqE}7Xo<$KxfPw>9qKVK;B5?UB4}J-c;nZ{34wee-S8GiM+&H=`{U@Edy<-6?v6! zr_=NwZXR@cht_EV>BT$JX|de^-cICIBTsxvAa57)`u{4O7T*%c+mE~o^+w2f2CLE?SYdb7wkDUlhz+ zLweX@5T6vFw~_RI6Odiw+=;w>zfGsbM_J{l?|sN?-<3|&SGn{oeRCVC_=9wse#_0* zct;{{#P8B+`mbQ#ROA)?KAjdnX3-S+kv9o>^k>0xt;nnVFr5~^W|bqaYmm1QdGv2? zIm-`pB7fH((rNK^R$0>Ag}jk}>}faOSp?sKuDN-UllWOX03GMi51JgO4)KkPz4 zn+mu$7orbD`1C?2@qG*adx+cc-vHbcz*TAZ%aH$3)WcU4fbR!5^6_D_lX%p^y9;p} z@0w=#VZhBqNIpg({}v1W%m925WWf-ppl_3txT{ssAJK>%MZ^tW#{Yo7nSlE_!t)S* zyU|J9YQaB%xD9`shATySLd!)w*9PDwA`NY|;C;O9PrN^Da1uw}uK3smL7qU|;AQ+f z8mo+-xyDj)v5x42D1zZ{6@7C~h zkU!6Yzb*hj5pZbZ1qtv@`Bv0Bi7^Hq{r$~|yZ8~W0vyb~_Y8!r@8QTl*@7P&fIkv& z;{dl2WzR*}QRgI%)A0X;MiNEb;AecPhPxc;g%;d|0NfZ2*Bj}FS#arEKfaG^m0V9C z{bOwpr1RYX+)aR^JeMQ=9Sd$k0B!`}FuX3<1RT`YBQ;Lq0S!L|X%8Z9!q*}HVGF)00DleOsQ(jncnNT@+@K2hCta=v4eLvY8#;^^01ib8dLhK{ zz2Jj#jE50^A0f*xD@XgY$}dFREuO`oW#Wz{OgF@_&XsR@ji(3lP$P=18}W?%YojC z5K`_h>vDgc1Ao0-)#pmgu~LW|{EW|=qwr5e`ZsR&;4Tip9j)R1TIwX`*!U2)@%`~e zMgLiZw9`_A{s_MXA>kjr!AXo?uJ~d8Lx|h(DL6~Qy>`8a z_XwnQB5vRq|CWYZg!DcdAJcCNz&-gjh41#SdHCMIe6|H~gOBm+G~9(q|J5?ZAJaz# z;3|+t{w7@K;d=-J!*Pfke2gEf;r@QDlXyboV|q8@HrxQD5#Qftd-$fzcAP&WZr~XI z8U6_OU8FZ_d`y2h0QWBD`Gi|{jfd|{q&!JCL1yo`4MZam;38vZEc_tyBCe?$QOB&0$01>G}LxDg@gd~=3JXYF*y z`3B;K4&$RV+>uCsTiZ9&^8;`bkEpI+_ZJppMyLfqhGyj{aZke<+ZnO+)z z``0vuw--Y4`@5?=yo0WCoL?hu@G|~1{u(G3Lc&)eze3|@et7`?xhoai=qsJXBn|hA z68JL24PM5F0h}-yoafK@PAVTV?IRIZ5fWH!OqX9Pr>07mbq5e(^!1Vj@SYHW>jOBr!Gg~qEAc)#$zM-v5dWRU z*S8S2>6GenYpJM)X z0r>L)N4NjIOEmnk$Uo15FATu{y9l}j{6>UmdIhr)lJE12 zFb=TfJO^=`&ij`ry|f`b6YzNmS?>2=aS}T%dcQ^7F8A%PD7d9af7ya-3cwu+xO0K; zy^Ed13l`klh}-yHzF6ty8%TfHg2NYkeQ=8bHwO5IAf&$kGTyK6KOt`8eHWcB?deIR z+xmVi02c=w_1z00`F(4glW4T~cpY&Y?+fD;-WbxqX2G=u;OYT)KJcB4ka)YtI*Az; z{2vjw@xBix2=^4yr&w@_0Ng6TQLcGNx9wt10PYIF(Jl%Q(k`BcO|pKMU*sgdWZ_?g zxXs7K8t!*6>3E z@Fxf0|BEt|bH{~Ve?vTPB5vdT5z^S-Jc5vX+>HFq79Y(4_+kw=6zSj7aIe6iPPX6} z@2%lJyue9(-GbYNxS>zDm!V|J71iN&Ivj(L{2Uu7Ul=I=4;Tr{Kd-~M4$nh~uDoEd zj(-AWF#Z8T!v8>rs}Pb-&1gTL^AWfCoTA}R)!`peh~?Iuhw;7k|CHw`#CKZp1mbsE z@;`#OjrS6bXAshDJ$)$v_bH4Uqzm3S*Q-y``x)XkzIA|OeJ)2x{;orQu|70x7!&{ZTGkt_rp7Gv*BmX-`I*I*J z5AGer4IRS0gvl<3papXg67MC*ueabY3cwEm9P4!-28o1!`y6k5g!tY-+{Vw(W}-;J z9Y}xI!n+~>cOBr+r4~#_h%UT6BmVagxADJ*LF+`oZ9s^wt>7_)7-AKy z(Bbt6ixIyVA@$K8XK? z83@BV3?ZD3_|XXA`V0OCl{f+6Z*}-0LUefrk087n;VOja$_knhQcqtQfpNOU-x$Pg zc~1l!_41!H{q?jDaT_jK{dJhayAmPsRt@vRmm_ZD zy;8&f>U0JF{ONx9A0TeSKL|MTe-T2~&-m4oh;2uc4;mwd5Vz?(J6Per3+c7DXunm6 zdA$vX`1OFR0w1F^{E^82+X@dpKLEe&RE77+Q=Pgp0r+7WzMqCqo#Z5*vfw{L+{XXPNs6EEA|yYzB0pxqFA2cU)bL|8{ISTNZ^0J^ z;6FZ5;qO97{D~8t#AFNp5yWkN4h&LozaHeT&vy~G;cnM(6OkUW@Le2$8>ZoU2k@m& z@Z)>p1Vy(E>9!r+8h|U-a63VGi~NV&g#ypwP&J|95bmgg=FSAq23 z-sy8^DVf-09+ry-2k|c zj#KbIIu83#7X0&w+j#E*9QC|Z!{c7K#3>g1!*WjXnk~U0v!9jbCKT1;(J5@ZZP1e|Gy7Vc)vBk zN&N8^&ra?`+~)sQz*PdiLc{Mo#z}n3f`1Ef8~(;))c(vF2+7aik9HER7JN72HvC6N zD>=6zq?}J8-)=XL1>kSi@RuSy2k@uq_zAlF{-gZ;(cclb>7|ZRbY4UHG>fm!0NiaF zt`zAuKi3A}CTX}+kbaDX?}Pwc9}V|We1N%N=@SBQ zBLG)N`Ut;{@U|lr{;Q6}d4Z)K{>g|NK8U9XaBL3)b-1@c#kcBkjSd&=@2sx zDZjIy3fJkd86o8>?uYeui#|S@lJ|8(OcpBZf_^?v<3Gt;x>QZ037AH5h3k$H1Z#?;Li@ge;IJJyCV_OPPXMa zi6#sFHN+t6YtC9Yaj`RE@{`I~`hqoZS5%~*re6|jM2_EMmJ&JHPLb66Z zO>tlc7N23nZMlk}C!ok1t;3KG`{|Hp1({DhG2E`hjXHcnhxh5QMTgZooUOx2I^-Ej z;u)mFd>!sXBGY&4aGMS{=uqn+ZQTfkPl+9`sl2|2V8vS`TLc9^mB>h{0?bM=XrbT zNS?2DoVRsZp07Vsr}JEWRHySi{WoaslleyoP)x%V0Rndja6YZ#t$k7)cn-~N<-=DBv( zKY8GJ_78Pgo>@Ou>xXC6zmcb4ct*WhKl5z*qnbCKNk3QP=T?eP01{hN^8JkPV9`&#&)0iOouRtx4UR{E(H{8lUdD;Cc~ExJFoc%ES4 zJYYSquw*&fD*HpL?1?svl|ItKlV|B6Wu@0zWzV&qcUtf{7JSIkA@yN&a*@T`+ZGQq ztg`(rovgNK&9a`WEj)8Ay=}MfG{VLV-A66>FIhalZlzyoJ=a+Lzi!c;Yt`K!EV_TP z%6@3^|6fbSJ{HcXRrU<)`DzR1E~{+P;^A=%{v8YcDGO%2#V5bQZS=6m!ue-Q50_cb zqb!_PSny7%c@xfiqqdZ<0;~H&tarxD`?hWYLgA%xzSZwoMf`85m*Smol`C&=;ax&` z^2(GTDOOIs1%I6k}j8JGv+!TDYR_X?=Y4A&2MAPVO}K@=9;qtL`#TfCww-G6a`m#YwG%T;BA zw;BXXXU;bkM+2Hy-P~ANic2!;n|*d7@4af1!|Tv;{fBKwwqd&2Hey;Pfm9*B-ktfy zcGsL?|K{yWv1TQ|ddIeuuZZ$(ZLhiDwe_mnDqq6+ffQWiG%Aq9cW>=CVqNOOT*jP= z$lT`nrFd5s*UR7@7h4H<6*ADEJpQO$``Qhc65qFPDr;zJ^k8c$&hL>X%o{+@A!rrh zb{W3p>LL~Pt#{}}gXNWxa=c$E?~vQtw?#OlT=zl(k6`dEc|Rxi8}Duog~<4-uM6Q` zMc}5ejC-X8d}3KWE-LWlHkRQf_0pP1O?gcq$1A5UT7rrr7KmN1k#b~sO4jhw1~MqC zN4np8$Q=_dk1*@FuN`G^yf}#DJ>UfR$jTFloxgQiQwgCb%{m& z0)n!d>X#7K1GDR)roPI{fHllR6UR*yu6o!|f@#uFdL%*;l*e^6io9HC;i93Ox^aL% zf1Zz>#`zv?r5tFps=g9;WHjRvIKI1$7spA)4@Z=WuwufWt4gSRVDK_++IYp?%K#QO zZoXP?CDvC3Qh2F}55yBxE|jp!R+Ki^SK#G;JL&u$X`*gtdCfTEyFwr6dETAIfF-?bMDBH z_ZxM=c^6%9;YH_Ngv9eljzWgY9yN001*1oYLg$@7dW?deb2tg93yjXj%w7H7{Lf$h zi|LGmsg%qcFr9HaIe`eNc(IvGAj$siLLt5%%#h{z$FlsDmNs#8@BT_lXNG5Eoy7j- zW8T5?EVBXgju12RoE8TBm8u~;9GZzwE}3@KbQcTDv+N!cwth%ii94kLrX{5IV`9{ST$zgR6x%B?t0LuejTs-$+Nazlj#(0$#-P-8jAv zxW|p)QwDNLc^D z4(O|y=P->o#`m*omi{IAk^#AxAhXamZ~^}yZEhW?|Kw@|fnySW^GGh$S^6^mopLGq z`39_itgl6F5Rzd}{m`h=$q6W^uQ(pWFJEYLfy^+M?M6Sw=w2O z3%a(WWMjZ?;^CdKj?dtDz(>ixuJCqn0PSz1a$tSSw`Q=X9b!*hEylNYLgte=xIh6` zwjae~%eP8BZ;Nh5?MPLRAA)Mmi#KoUQQK$2w55^KiGx0|M3--O8yy>Q>buAzr~F_} zUO->TA0bmPC~H@I)FaU|=YRf(=DY<}E8i`F!N^B|HvPVT->vGo*QVd+o9EoVTRXy? zYyCX!0Fj+@Z0@OGP!VtWT*0JJeyvZJG9L##zK3TxWOrp)#j3vY;S znZvJHB&)y-Yo~=}#6RQvD)=W}mukn|@BioD<{>Tq2CD#dr+y<53{a15+BC#R1kzd% zXODrO3)hKAKNWM+w&UqDq}%t%aIcGdCHT2;?6|p4V&8MK2L4!gm@b^=&B=DROz7XZ ze}tF=_cn|{(rDyK`9R)GEp7a^+yr5)(vU`v;8%>t_aPzFYG`Q!s6AoE)W0mEeGHk105%!Kb7Q*k*0_e35 z(jj-jM|eij-jC`K`!PPaPvIz89v{kc(|?P)`U%p}i5J|4umJzC*UPa>L0E^UBE)fs zf`4GI*3f0S=kZ5+7a}D6*AOB8wK*Q#8({K&q!W&Nuh_mTxCr4f2v0?bVDO|JmFI5<92um&O0^H?to7wfP>hqPm+vo0A9(;;nwaRd^wcRv~l^k^-3 zeqKM*ZXZXS>9oz=c$R%Alw623K9j~NCLJM?Bz+`89z!5ZC&Ix9`ONn54&n&p*NOkl z^BO#u=ew=v|5z|ntmnDb^TihYEbDo!1#_SETyMd6^BZq=fTcOyDvenymR~dG2NyU4 zi=_oBzqW`F-Bp^3w;EgBbddDWO8;X4UiO z%`FcA2k&JX0UV^g;Z2-LP(@u2uW-p{zf3a z0^yinL9cM6^n26r$KM(H59|t$Gnts>Hw<_(RlSU5Ff#VWGWgO>%NAgf&v)mTk>UXv zKQ2Q$MwzjeU3lPB@@0(tP#9AXBFC^gFZmRcFw@DujOKuRG?>1P7*;Wt^BUi$ z-Q00>M38_fd_r+IAni}A4zy>t;NSkRj$p(LcoOFpC|q1DgIPRGb-&|lf9G&7fZXo} zt52YUEz0*8CHB}`Y;U%4}3+`94Q$+)G(jSaE@YN@N9u{*2cpZc5#_0+d zYR)A67K1#py4FkDs*}DcN%+Q=*h9;kw1ba;U;L~{Il0{+J0uLOT{@YjgH+wsRSEXI4zPx1E- z{{Dc!{rDS&+UMD|HvIAXQT#g_>E7a#tSw<}V@3BykWAu_D?Tk~{_*x3SD=x!d<*|~ zg`Z$fS2)2Svx<24oTz942Ha4Qd{n!wlJH`RXiz-%;v}aa-~TzImiQ{6)xHk2vVLJ| z2nm?a+w~D5@`b5CW2)#il8TP-dilKL`i{0`;@hOj-VeKo#U)`@OZ+(@ckfn^)1Pez zZilmEHhY}f^ndX2o0ww6!Y-G;GF-05yf(vU%`UMSy+O(nGP?gu=0n6SM!EZm%C)#0 zGNHffHjzkZaf5(>t4Vjjyc~#XF>=&xT3zrgl`_Z9r|7rh`PQ7i`!ldsY_ql*vnpa+ zC)!wb9DnNjBEgF0NG+g0 z(+)#YisWmH`U}yAz)8e#65a1{GGBAjPA7v;swr~#=A*T2!Zz)8kC&k^fauu9;Zasn zaM00K#*M6xjJ8p0Sa1}UF8M|uN>j|PmKHwYms$vqqKW+KU-IbL36|U@!%oykWVZuK z+G{Ijf}$&qfZ*V_r;dm6R$yhQ2#!{NRQ3>*bcf;aM$k3Yb?FI$yQ6Kf*Dn8iCDP(d z$PI7T%1RDLq5qACh?A=E5PSYfiN!;_e!LQ@XUEI|7}kP2+L}C;76?mB$k{~gwYLK( zrN{+{eu;gq9;SW6x<=>cc0kCkk< zKH--}6@krqkIg)=*|8}mNm%cS9&%H9iuCDOHh=2X&Er`AwLHt66o#Mr%i`jGNE}Af zOMyp0a#(ZdE$KPK$VC<-C;A!rp~Xm1&Zgb{W6QzPt-Ut=DZlT2^_-j0)4gPKxO1Q8 zP&M|pi=^tH&uUMf>p2R6J|$@uh)nOb>BIb3GoBXa_WgU#+feeM%f>eYM9DXRv}phn zFdv|a^t8kKTz`de;TqwNmIM!+CtpuTV?|_gZ?2K9is2ud@Az>mcB5Qj>nthYI`Vg@ zGdS`RKq{*un6^Ybxt91YnY1l&-9J2L@54K8x_mp!M>pkQB#(!bJDSbR-^y6YN>#9< zog0maqO3_F26<-TJ~F%DtjA3{Op+$pN%@j=woWRp*Vv}jM>qGy_uHpov!kmhpIub) zuYcFRG|(Dyq9Bpcm!?cbtw&K*R10@)9>n`~W=KI7&3meH!|U0wmCwEd2{4xM_Ti|I z?N~WK?F%%(z8D6HZA?%krE4Dwl2!v8PKKocX6VKH6M=4h=urmtqUihn1{-hAkG|F) zf<`xE1E6P*Y&jG#&@b7^GJq@YFZv(f(cY4;>Y`Z67a^rprxalWDWBgR@7N4-Xbdai zRaL!V!$;-3s&eArlbn|LgEF$%a0!Kh;@T=ybBomry=jWa!WY|#QTWC5h&VdhDhVm@ z(0@##96-W&9DXO0{pd;5!ZLg-vkBkIoH=A5G%^TMg_0ld6{%2=MW`Hv`IjL~zJ)AS zGQQxQlJ6X|fw+Qo0tABH#i_hzr=4l!U8x8kTy5WEQU;_(X}}^^1I#1}tdzPatO7_y zvOAKz)vaX?6?%RkcT}LFLnxj+LWvhE9=~GKKv=JgwCsTfp{O9JFr9q=uT%z{Skb9! zYbjKChhlDPwDVMu9T(pI1v++a{)+9k0k83ERTxiED%}%)i&D}5tdDLQj18R(W5@|a zV|$(pfNoSLwtA@dqA}P3R}az7{<e7y7VW?fTxX#ZbmgKf<%Dtz*{?ot~TD% z@I5{78L$&>K6MW6z=jeUddbGZ7xS<$v;iAT7|G^hE9r|WYo<}wY>+j|8V~JT%6i^a zR&L2g@oXD1=KL30h|C+NtO&bC++7cICvH zH!$si{M@vpTcbFem% z!n%M+tOxlYWyP_;;20Lb;iQ%VM|AlHh#K(h*{2N62HS7CJ?+2J-^a^;v+}aUlztec zT@&aC@6sQPR+h3$EM*rhMf&OWu~~>rJt~JC^|t8pZM_O_8zSOwgZ1Qwcfpd_;O^k+ zK@1SPzu@d+rD3bLB~%L7ER#CE6;Ww_xh1<~GO{g$N!>$Cb`yO5&lD6Kg3oR8ZDTZo zovIORi7wxgQ+OL@IjDs#{f!IRk{jNsB|7xE!6Qb5OF_`IiqrfejIl)6DXn5l1`!?$ zim>-%ZF^%dAONpy6B$NZdMpn&;et_&-0&7`d!thy7v52L`+HJ+JNA~LLb&upA7KB~ z2v`PojDX=I$qh8R!!{N~w6SzXmv>@@b+~A_Gq3Qr0XF^Il1{L2=(hj5Vc~<6$HHdF zo#M7YSGW`Z+a@!e`VOzp#nBsdMB%k!K5Jv)&J0?AJE--gpdsA1zK=O>EWB1PMU>z{ z%`e*}v8b1{5vIy!e`_q<8tu#*7w-H59ndZ#S)L_XvLETTceKqxm)F)=*!mX4Qv*0j ziY75H8IT)D%PVYM5KKF~ur&v6%~$q_!dAWr>PssqY`q@N&6kFi=dQd!8kT$-f;5gR zY<)eLHn^}grRIV5P$Y|$}e^M>Mi7p<21rH=U zsW*v*=V;dAJO^}db&$z_%HnNzba^*usx@tyI^Tuo)M`KZwyfkoG34iiJQfY1p{x{l zOaR+h&<;`@M2ds`6d%h<@iRm5Q+zH$^?;Z`iMYRmVzP<*-lds|e+TU^^*9T9+TNO# z_~9^j84N8Z@hqAhG$}Kw(Ihp_PwMYkNgZuS6(~8mSkT@M9~XTc(=t9}qhB4)On-e} z(EkbS+7k8nHo*hK;K6WI6m2tjnt^iGLxE2Qq%mTzLJ&H>4wy)2O;&q!MhmUJKZgmDE*+)WU<1I-Zl|3@x3vJ*3o9j5{OxHA!*a z+n!-MbS^6cY-^HU@RknJ#wRs#6sr{8Tc!rv~S|}m$9aI^8 zpbU078w47I1mVsaaOOpK=SKJUDr^hPS=zGl{gC1NG%$T z0=f+lc`hrF#|)88zw?OvPBE{DRO*OG2Gm(3>q&HXR-#WCqEjuR5u50Y0MUtvN0&c= zYBxSY4}Ws*u-lGZ?avw_fBL|a3}}=+i&00HCxG#6MGNgAxe=fl%z|5`#w>VkN>?~Z zM5qT$C@^oHJRp|W-Vt8Y73NL}vS|d!UK1CplSFa)@mr5C| zqUK?y+EI+5wdDicGa$<4$d2D+Dd4K?TRur)Yp(zP%t(5i5)WBW(cTqXHsV2!=bQce zX!lgHPxZP6Ht!!TQXpy9DH-sJo zq0If+6hmQ#P;g7UmbJuGQ{oiG6IOJ(pR0>k<9&l2dNRqCb`Bu;8co$?7G15Fwp}W4u1S`VRk!KcL!7(FB==#*x{P(TkTKe=_!y7TUn2?2<8Um-$(VPB z{s*6?r8(wmXjV$7c4gW;Sr%j3Cu$gHqSZJ&usclvo zygs}4l4SzPo%rr&EG#z2l?Bz8HE&m117W^DwWDKmbaPI}tQ~mcY8F-jq3SWwO|nsy zbvvO2c;okrP2P1ExshrBLM)`w#M$(B+3j63x7B8D9Fe>tNbX-pBsZXw!J_BsEIY`X zi7!(N?Yt+)=PN$@rN_kUC?CK5PyGLtKM)t1G|+u*eC#1wR`fHcFx-`)g}-4l^b`;p zN%A)Bmsibf?PwwMf?Ct*J>cn9XrAnTQKM6c-t%T3gUt*ay<>AUP&jfczOY6~W(Z~| zzQZp5>m8&BF1Wgx8{X{>koL#`=|7jV=Jqfny!#+&U*^6R$%t5-v#CPoo8dF z6u<3L%xhxzHgObibjPf{U2WaSCn(6rrcXuU>Lg1bb}#vkZqDmiy@x6Cf5+OJ%AM4y95;F1Lg{|1}^5TaTw(;bW!Ww=y!RSt!R9FbQ52|R0KPl%&a31;2mvy$up1W zo1+ND3S9avr*{k3F$Laz%P!DrnZYVCgZ9bf5$#%#>ZWaXspHA183wiin}!sgQ+R7r z_+30c+NCz{$45K+aXgLocnxX4rp#Lei4|k0%4t&3AoPzo!jXqQEkC|`C+o_7FZsmJ zTSxZaH6skTV1g$CkN_R+?67;6)rq&2GNT%9W|R&sO2WVGSXGjg^h z(hthuBCoVLx>z`p)~Fd+ss-|pn0FIo^r(jrSJ_DR|AKtlNN($aq<;oZrrAiI?}6mb z9!Q2|KytN>q*jn{* zVUrzFBqsk0zy$GPLk}sVsM(Z@2I|Du@I9tGAgJ-ookUW$@tsTKl0^xDli%U+Y^OzpnX4Ti^eE z12qpz;Y^Co$J2pn_PYS#`H2k8{uM)XFLb8q+0A~jP46z!Qw~BkdtQl21{RNB(IpJL zz-IAdrwDH!uck*;b?R&G@t37ZWx9so?9b!&m!HFJi_Pusp9i>o_pqSKKOw&Vi{{>& z(#wAt+Q^+YS62vEx{aWF2}!+qZN}GO=V4*D58KE#=n{Z<+Uh=S(NEBEbn$@P!nQi1 z62}q4QMFFG-d(S={s|dQ8uPy0$yE~D`#$T^MoKH$;a(|s`B4ltFHWmMDkgHtw= zE}?~4mXktJ9mRucfi4ex|0muy8|{otUI^szw*6p|vEdRkc_$#IWa`c1Zt=Kec-Mdw z0eAABTLBbT{+i>a_-cU~Fa#Y|o{aK$03se<=PRE4DHC0~&k~7fPg4?x0+d$vpd?Th zrLQYWm|Vx>7KY?>q^sH+0+v1D#}eLUVgzET7HG$)s`U&+Vxmwk_WRY(9T*6RXH&td!ZdMgtrbk)yE$ z^3|O{SsEP(2&p@(crurXE~QUjgW4tmo%X1DXq(-z`=I9+!~O|MT86z2y{vQ=AlT9N z1T+i*I@;FaA^Ng3y+ZYtglM~?ErE>G$wHXTi&azwj10>VvK0zUEH1cSCZd>{F-Us+ zIT?N3n?E1?^nBaq2(oD}4fX?4as>P(-M8G56Ez?Qi|A8q7*^=Gc!cS3{>=wpCa z`4RU>_ITVtgG2FqD4DE}$P9&-(g+9X3E&Q#ECQ~~a56ITM%Aj=Ru*e}7)ayG*Tud~ zy~SRjZq*1ex>;VJaqK~2+Ztv|84!#~6eof6Z~{0V!^eKqQG7L>B%TJK)el7F4oZHo z1qtpbIYaMvCKYv%LGKW%%M5x~0h`a-qtZ0jfogo6RO6~~#3#;LUDBge*M*ap9WPUh zP@Uwu+VW?01H{u7){kV$qKag&juAoY_~cb`NHzGzq;bJ3lZb;)pk?H4CV9G&zXhBJ z)!|hY2iGC5Np^KORXCKfh8jU!(xcH9`;1q{KKhhtkulyrz@i(iTRax$UFg=GO!Jwm(%Zlp#?0#EACqD&Ov1VC zlu2_BF89LTGBU7Wk6Axv`D*^h$YF)8>|az4CdJ3Ok$iJY)mBUx)pqd~Bie5uT4uH{ zH*DX#2|5q&13D*Fp{Kw-wocp~&mFOn-5o!dCDq-Sd%u>KpMwRs9*IRS$!=K{ zqHo!)mVLa1Yvq+*5lN^RoZCb{Lw^OpcvJRC zcqq1g0O&}X;*n{JM^XG2DT7P5cIg|rxOg1irR3l{lxoixtJ=HtLYBKLq^o=f>KF4H zQ@yNmCgJdK3Z^dNV2)gYxZYtNg@dBooc8dm<~8?ivJYPF1KT8D3ql_d4SR!)y_)snG<13pV2e`vdM#`_s#3GF{+hatt1MsjQU zJe(8_SSegk-xkBW{8)td`gM1EXAJO>gLTr(R-J%VG`LtRiTz=|g&gaPSAMp!UbV{o!sEND+K zr?<(G{;?E{a2?WB?l6dkCBe)s?KPv{VZ#4jytR&(!1WDQg(tT{;j;dS`wxaB`3(28 zSKQO{6X~8F#}SImm?s;*`R2>wdb;F>0^Ni%uB09rbWpD6$+V-rNTKCWpc;>0+L%&{|O*6`q+;~NoBk1n)TyXyfzz6hl$h1uh`6s5BTgGuBtUnIJkVdw!mJ| zoC4%V)Uep7Yb%4vS~gp$v_B1Nzd4;XVyAdq!t6r8lSlj<0>r?BYolqq(%ssK@Ht#7=QH=Q1Mix zs^Q*+Z6{`Hic_$bY9yE>HSZGdFvK%S@Ssg^9_Z<&_>xflf=%%eBIB~ti9lqUB0m=+ z-lH2YZJPDX121|C53u|FgR%QPo86ayM6;U@A}PLar!<9erCex}$!VQ}3q}7on&RgO zU4t3#k&crpCKJ+#toFlk5+@SLRT!#eA-MHmvc6~&eB%XI)vrE&+A?J#*=EMntKV;r7SWYw7dC* zP3Sg{(7Q4n`hqt8E|Jm3F9ITC;~m5ltdfBM$inVHtK>H}yYD{l>SYLsq!z%WRFz;K z=ALX-a`CxYHFeM``GZY*wnzF&p{jb$gY+1up@fk*&`BP&$LO}n{{A_y$KX{+mK#0v z9%HYK@or%3Q9DbKXn6f19_UjW^ZCTA#x86gsjcF9+09}`w-^yjh_bi_WID;_>`iC) z!CV9H8g+fqx@TP`a>ztrfMm82QGw0-zI86|#$fcQzV}RFJJyiL*?&WxCjy-+gqL3Y7$d^dKtvJnli61h z?+^ACiPZUzX!o)tA#Utweh^Z`?;3?(Gk*KTV*Ed=Gxp-5$tZn6NAupU@CIHf(J^Z+ zt52;MJ)D_?iwy_EMU;n8_gL6bvvWqUuyckm#R%4NPIM#Y=mW+tJiRyv%R8tlu>WAZ zT^MUA1!I}1h7Hx{pP>T1RjIBp&!#x3_u)k2C7sOT@&p%N6eegckN46@9X6vhUY56J zKo7=O3GMbpm!Smfa6^U}&{cLFjuaL);0^rLe3G%a!L!V6+Kv{%zzZ%A!BONwGro64 zZSjc;Gj^+Zwh?vf4_U<WD-qebAgXO+8_#eR&LlB4(aFA_I zZ|VlNi>{eh_MrU%r3n9J0b9$Xm3WUf{6sW~hbMrBV5xu7&ze>C$0dSSiF(1OjFWks zc@y>!q*-R9`OgnLY50{vVG>hAT>6lQ!GzotGXeIZTC)q1RZdQrbQ zQZ$W?wr_07Y=$?D;s5tg!_m!$^SOi1D>gYrP=$AP3R>wGFX^Uo)WXUD9=%p8Du9F} zd*Z8v&Gw08Gh3(nv900nJjp8WMsbwKQtv?bn5JgBov$?@qkqqg-jd;+_jF72K}JvT z!!Q=bN^8#yPEUHK_KlTvM>ib~TXQ$GxG&HmSAq(=;?h5Of_7%FE4f;jG5#Q0;8p9c zoqZEX^w{hotw~+s*JrJ89!-=H(e)^74<|h%~}dW{JkjN75kgJo#s0HdH7pty#b?>Lx|4_FsxWoI;(@h6C zVm;seJx@1Smog+}oU9C+_8jdVX1pUdF#5Y6*^u{aS~rtDq|%cS44Z@8qQxMQ6%17) zXWRKnqtqh+<@MDx!+Y_Zx*h-FBP^Jh@xYT}IurG0vr_*7$_e$a zc+}6!Og#ipLtSqZdhaLOw`vb_{egWy_8zMO@LCGSqOgXZ4OKRpR72H5?epJFv?t#F zjp0=3S(t-lR_Pl?sH(?kCHqBT`ch~3wxVj?GI^krtqpugbKVQz%C;Isr;WrUKO?jo zX)py29!~%^?tAQ}l^i1=$P$N%`|0vi6-Y|q4@LJXd?}0z(mDx-p9i`rETy6yxl+tP zf9*+O`?TKylT^)P-&Il&y_!*?>ku8ZH?cIEF9tw3A(LU9c@MFeHhiszNj9WLb3@A7 z&x>}CG3~`yT|M0CeirxD(*7Q`wC8lz(k;Vm`E2jXeKC>m)ki6xGV5`=Veu3K&)1@c zlyiW>J`Z8qAZ)M@evCvg%RA6HCD<2Tz7L=9(Jq7C5jO#?>C*)$i)xY?g6{O>w)yW8 zl|F zL#p}?8kxA2&{uNfIuCD);B8-U-U$#ikNwdkx*pVkF|y^bD7*cQ$=LpY&vk%oc7h8? zaSfQ;Cw9l%k2#IC_5=LyS*2ZTJOe1TRsfbw+j>%DLnDHQ_d>(y6YqA#6^Eq!6Q!3M z=an+L#+0I64{jRH^ex+X`tLnu{4j9Z<$N6N#nDuSn@fyfULf2ImbVQy~ z^F>EAIa)(>i&%b-_i3#D0{YeJ>giy67p_!BxgSP3M67&hHhmQveZBvPXXVEV8~yH7 z4R=g?ag$wtp8w3okJ~E1z)WG_6a1gK!mc$8TyHTT=Vk4IUZMFyK!LEv`BYcYViXmZ zFKHO5fivIw)1mOUelQhuWmf)b41XKH?I~!S=E5C_9&Y$kTYx+r2qoCe@-$U;W(!YN z-`aA=1HSsT^_eI9K7#)<>$BDH+t1=xnS(WOKEm*;*2Xly7#zU-=s~(#R^_V~Yy&m# z(=TqrUymZ%C#xHQy)WI}k6j;jQTyX^kv09u;)i7n!GlOMA(U!$U@N+K8U`_pcF7IX zcyLm0^g?+-8ecW-RMb-Y;^7{DoWD?|(hB=$=vlr`MVKa-eu!ha{ymAzBN47M;mzjO zNyMipwhP6UJ4w-0D9~~jCe&?XdvNz;R_slROj1R6&~7i8@w1Mr+VJ&fP+S=APG2zsb|kQVptGWp47X zm@WEizB{W%-ZdI|3aEquG#CH-=-%|&vkZkk7H^^j#4GWCtVK1ESjm14*`zhd4ZbV3 zuvua7le`=xyl*9Pyz2UWQg)&n9tI@LT8#yy14+#XgD`g7=44ViBEK4`*+#Um&S;94 zH|ozosv+sgs)U+KqNt3DcMIK^zW1Id_T;^yx4{LTWBIsfIzPGUK^ZUb_=-$2$Axzn zwmu{v*!$aUzEP;iY*6X?aAQ*Xe)Q6q4Z2d1|9b>X2Egh&F&ypeiuI2*?*+~Je7WB` z`6W=6!I5&rU`{$?NPNex=tch~N zs7rhdj*Cg@_7ho}gOPpS#Vz8h^tp>45{GGmpWaWd0m%yq#!VPdc(>XpKuSob=&wz< z+>Q2eXFEZDQ%|`24zL>i4j1mM&c;0mcd}IBJ}g8GiSEu5muD;#IjOy3Z&txRrk9$c z3c^dD(L;CBvvRk|aF=6o7ZV~JQzt)Ot!$-ro}g#H=Z@;t5Qs_YMLHUJu-2-xQr>1L z-vJUvFX~$xLb={hUacvk2OJLqoG|Nly%LY;lCWE5QtneJ7^#?)2UUvM>47&`B`HBh zAIi$;uMMLgz^)9Vm85`G2h2Q_6HRhGL8>cYx36YJoHB^pEX3mBO1RX)FUIaCuhM{c z@KCLX!0GE@E!*Dzmv4<)^T}ywnp8JQ9bhxX`Ra5BKI4l07yYrM1KKSecnt>nYxo3v zJ<(o2*sXB6i@?(6+rPm!pCk?1)^?~7nDy#}*cOvG0Z_{*wEdzvGD%6o9PGyN0Tjx8 z`Sux@f5lsJPDM21z@)@z{s<6PZdBEpTlUnfWv@16-@-TnH3WInsR|^*RT|&b%5&G` zWR-BzKAzZ=_c1de+xhTDSl9V123k5FSqwMERgOe)*=h&ZWivv=8AZIFIJqV@3`J8H z2tWJi>FsYLQ`d2HK*c}*mUP?ts61Jua;5noD;0j% zN)-05RiM%vg;Q8|M=iqZ!}j;3PL;JzOpG<=Znw5e1)+37!Tr9(i z8)Vv#M&yhO?=$V^08*Wla_CqU$^)j<&tce@+0edajUQjyll55I5L{nJ2^TaaCtsGJ zFf%~DZ~b5GXUzrPc*}{WfbcBqmI`^E}n!sSN;J@ zSW22Jlr)-s)UeAwF9H+xp8+N=qjNO!3qX(w^>PXu#hR;3$JS$!+ znE+r!1NZ8W9}-{Q9sJ(9w=X9XGw#bN$t%eqCC_xc@>EOmo#0rt zh&Zsu%k}@9;amA4MiMWj;7u|~L5u^@p6?kBBYOKi!$cfP<#L$bw>yN}SFqoJFR|q5 zew#y)QXrw*XU7u|HhM5&&$Wd;o}8$oQSSDes?mpu!*!*$L0&)vbfxdFR5glPf?J4g z32eW~{dpPJQ|NWsR=oQ?m22tW1ypEwb42f0395j+@s^Dz*{s-u$yWFRVP!g4LEH0s zUVkiyv}C^irZ8&(f_2nF63LtJ!GO*jcRTcee#hnj-#hX^GUm@Z00YgwhvLp8pN^4D zjVu@ZLJPWVw=kx&to;|aY+cW?DdoNV(pWKwZN<=tIAWo(VK5a~`ttl|hV>-3zOaUd zk$97Iz5Xie5cW}J>#-sfZ@CC_6wi9>D*J({vhUm(s4~=q#ch!HKpvd>m^+J`SVY|| zCe;K3VoxQq9b|pXmIo)F;LiNQG#X*{VE7qtSv@G5Fa<`KcRCI#3^wvD(fooU2DbAI z+umwfu>I_{2D)rNx<7O`z^M{-YmQz-loiE*Xg?Ft2&%6P8wk$Py@?w+UCGT39uDTe z?P~T(2ct0V!#7}YsX``YVdghPl$D!RS!0Z{z6ZnyQOK7Ll9yFkhibnVQgfNo6-g~) z29)I1|31haZ^=C&Tm8>4BE2IM`>b_*-2X54jwJCgJFyQIsiT`gSu=+*gJV}q-_r{t z0EFoLy~(78w4`@0 zGm!316i(R(wU=~{dPmRGzzN-klT2c_n=>76*u_OPGShxPnc)~S(>s{IBR^(3^B9m2 z4ATnKvsq?zXEVO`Bcl%vU$EMv-yNd>(G8qAA<14EU=j>5urzQWy8HlC2Oe?KoixD; zt&rk!y#$+wn6jw;(ykA0e-(WUPg=tQVP0yJTz`}Z`>W4GG4Yn8verZ`OkDQ+1FQyjPfSkbU%`t1qp@A9oZpg zn_%v!NZ#Z&I>T-hUsQGR-UPhLVq7bc_T!shCfNcZ8Kw%jbzjT-|7D#p8E@|e%Z<0Z zGZ30_rwMig{LECsi!ExJfbm}HXiOxePW@KoqMLJEHgtLD0>p~uYjm`tS3ywFWw0Vx zudyN=$-)=5FpI$FcDs4iQ{f#)iFU-ex-H{61V#!BBOlzV8KcXU@p_Y5ei%$~?aAw(ZlNUx zPt9@2l-!0aGbKgsgOE(4xnWEXLcv7uoci|5&F6~lKI8$e=j^fYjM*grd^0#qhr7OJBp^+DYFo>uP{X0ZHStriHIx!3tUslKQlW|8Fnt!?9et_(B@L$0z6?qu2l}ld=aG28Ki$%req}2 zGl4YT29?P>Ta(Afo|Vs=!d~%wk9^ov?7o9;SADiTxHk0&(CL?79PTa6%8wl#n?6X} zGdtXoD9aU{_UQ6T_ME%?G;6=6ZERS0cDd6S zX;>I(2sJj9HATjThE_P0WwjNJm1PSMtEj7uI90U^%c`p?6a)b-{z|C6tf4UyDzC1J z)Ha1GBh}S)PR-m%MN@TSDKXEBG?iDDR@K%wH#rTF^16l!0F_ll8XUVwXyJJyLN$@b z#KMQhT;=-UE4kLtRr{d0lk~5;j)V)s78)ZD_^Vp%piP ztNQA)C6S7dVsAvKqN=gHtf8W+cD~`bysowh;x+ap>}ts4x(8_w#$_*?WTlOfo5+7? zSY&a1q`V1S4XqgNOcd=FQ@Npe4Q2Cdz)V>aqzKj4HH8|R>+9?drmVUe72X66Lp4>kRW;2uMlGT7=E;7H zq|R-unqOPi)Z7p$Evuei*HG0|S<~19gKbaw zntH<3lr476A_NLz!Wk8P)QXiUQ^cC zL?;m`Z-_MYz++4RQZ2}kT~=LRYn5rPT~J%M$V!2Tr~uUhpi8K*cK&d-!bsIZ(7tTK z)Tx(Fm^h_$#>5$4g*PfgtFCWAWkf>rV9ImL$`^RRGpEid4VO%td2Q+R@Ri}qubMe| z!pzB6U0FK$%FC__d0@WG5D|wenn^e0t81q^GQX^Ri9c~fXl_HKYypAm=FJPa4IS7m zGlBP;SLaEMmWF16BEz6V*vjyXsHJ5?rn*Hi^Mj(JQPcMhQydO=V4oqYDKv(vYC|yo znz~x>+uQ`qwGr^kx~>T|Hx-7-eF;pvOWT8bRH9F%j&gB19myod)NoP}A zRl2C53=O!!0WW94rpqgPC>&hRtCRetk%l^B);>)bkWhwp=Lzj^?CfYVfuku)$6>cL z7`c*Lajb^@L~%`_GGnjoG}zEH6oi7OUwJtgs#{ovz5#4_SfSF&Iyfd{Sl)mu z0M!fu;l7%xYB=hvZVq7ajW-UVJ(QP~S4Mm-3WH7b9;K+2#sF@E4ntaZXy)h6gK&mo z(4?CqjcaZMvcdS8YanAYSW_G_``fS&0!?{R zF*|dNdNIDEt$Q_JQ(p!1s9)lmLPcdwX$|Iu?54_U8l6eSC1XRgLn@r6!^=%L8?6K5 zM%~NHV3%XrPQ$MvM#D3qXFiO#OmVjtZO_Op(kW-m~vaDz(z+s>wyDysTbE zQ=SOmb$+DDsL8D(yEib+)n7-MAY|4as%!teZ9>&BK#z$B)UEAK=sXXBYYpLpmN};j( z=DF1vCuJ$>))|cu4y+ut&AEs&zA2s^h@}WG8lkq7`T&THLxC&}g`6IY)i*9EMK6aT zT$5)v0)-6S$DnIg^CPRc_BD};(t5NM53Q2gmunyhl%cYOpl%LY?cfw{VP z?mE+B!E({~ICmEJpeVW}O;$x+q_Ot&Cgo6M+!k!f9;;cobX!1eWD#7Q8fELDv~9|I zG_E>Dw{2u7g!MP`dr>`LtyTRx5pWj*KR0bJBKxrz+}q)`R_a%Tg~(U1tQ~Q3-85&2 zYusS!JE+Qp9ZAj%JQxCg9$dnY&!kL=nsMovT;_9kq&dM;pMm)^!# zKg)5#;LnEZyvA|HE7UFxXLirDBBWgzD7)%9$B`HFEFJW}-f{Tun9X134UWSb#_@A$ ztSWV!Q-W}F9A~9~d2rLp9OwQ(+FqnR7D!t&*Kr;Xq)jV#oCVl`@bNOwaUKcKom1&J zmjvL}EN~no^9N}4>tEedFVm2AU7+l`I>)J3MclF>Bw*8%KR2xiY5X#gT^~i*J$h6@ zxNv)$9OoB-vYpM2vp$g4vQX*Nrm=33<7^4SEq0uj0%=7{9A{@BEwt2ec%3zVE-!O% zZNxytY@N0&bDWw$*}X{PwXHVXnp+&_oq)V8D{wX&Hg4PLsy4^rP7r=BUF`G7FK6j= zCudoHPXB(r^V*R+5UGRkH>W(EmNq)!$o$q`mlgn})MlG@^R4pRk$m7g z=``E7n;*VC?+(}!W!j6sWr=i}ZQae+y!Auc8eEaVHt*)?vgCaP@;h`;aHTCQvScykT3?Y5E+O-sMV$PSWd2r|Em#JT2cY z(tACfrVk3{(Kd%{OQ*#b1?UX`{9@!~swdvi_Av73n}Rr}B5n6u>2y7^+&nx|*OkZ{ zy*-^4UuDr_{k9@+4D#r++;Ud^CXhey-E>;~msOT{JCV0`M>;KjEReSgd2@c5PK!Sa zHerPEvR?DC`YMj~$;^2E;ta85;D{myiHXNGc>$Qz9}mBjA_ z%C#bI_HWW@`ahSRu0!6tcl~eEY4L-BavPDi4tey4b~);FC-Nq}pH9;+x_MSx-jDpe z-RU%aq?@n(2z4;9H|+nTbXxqSMRyH+DEwQ&EeOv+__a1C@#%vofbQj<6^^sI6?KX9 zhE^xh9QV?z5q}0{4BRJC$C&}R?;!;Hy>CRg9PvVgEZ=>blPFLfwBY?C;&%BT-=^Rm z2*BMFfICyeJ0U@IFHF^NJ2%)ZybR{Bn*&I=a+?V-b!<_+g8a zSgrB@0R7P}#0|fUKii`4o`jI{eRiuSAM-y&+=gF$tJY%xt~vmBnT8vT^jj_ZCkEhR zpm8DSUU`d?Sft?&EQ8-f+|XtGJiuK9xV}g)wcv6CaG#*E#sh8>Ldx^Va!(%Oc@S|M z?^POZL;&uz0Nk}GOZw+5a}vE)tNN^WB@B z#2@eT%0G;_UH(qMvA&n;a#IkVh4^C_n?R)ntq6&yY^jr&{tboaOr(7caf65P=Pg+VN!(@dVVrh0;x0bK|BJu#0JjI>4G7Ob$a04*bP{uPxi>K8%R$_fWBdmE z5pHa=lNhbxK5K%lBW~arkK>PeyIO}&p;55h9gR-nFkNm6(pDgD$}xVjhC9&UB;+M> z=%WN3$3GD_aEyQ0pzL7-(zoBE^v3k(0&w339898MHp0;e3z5IYg6|uE|MVt>_l=vJ z#0wVO&k(oimjI6PoPqQQEVv;7xLm;fKi0kn&gv=s|4uV8G2>1dgfM6+`BSTivL@y- z(NMOrEwxihk`Rhe>rQuW?(KFNDStz|#$s6}e=-qfs%=762w5$IcK2Rp*B}fF?o#-;RN5Ea-1UNIsTb8fa*-;2%NU=HpJl zoddW!gsk5fA$z&3Vd*%Ll&g}w`qZfaTeS<#BKUB0Eekt@imy2 z5q|U~freu={4_X6XCZFj86OHb%Hu!{zile?+=BlKaT|WY)IgvHcxNIc{&SGODXHW~ zd?S4DJplJRz-_x&!Ed@4cEEyv192PwI1P6q(wACr1ATD2YPi2o2{gnlxQ&S0_+A80 zCfx>ErG%hvfvp14F3tY zzQ)DJ^tFf^e2fpp|6zbzi%u{A;e3QFchT?Ma<4$~CLnIgF@A!E+uH|M;)A;%u*5fG zT%e&|^VoUX*KE{8m;f_Q4()gMGIN~<^D8Lc#(MUJ?NVq;exc87oxTY~)xF-;| z@kKS<1xU}c=#KTlE&YwcH|IBjhIj8!{a{Wt^cHc0kMW6sV?9nly73p7eyk7fK)}rg z+_-ZU{ITZ-8k#MrVK*QA*+$)G1I)qyeIIvzk6(RXL9r-`puH?e}VLtdzf34u~p%o9@ zD#UHPw`#cQNH_MM_@?^cPS(1B_m$h-S8n}C)h>S= ziFRG=%6SRm9{hm29QcMKB;Lc2{|~EO%6#x|Lbimv?QE~UBoS}1%H4>#O=pxYcL>r? z(Qqf7iZx3Mj`2dku|K?jR-mD-Uh&QJO^6$OjITZmYbAiY2_gBp1o@`@nSY@Vegxo% z_YkBXVAJ=(?Fu-`xwT5c-%}N6*m9f8$L)yQe9Q&hWx#tW!s8Gghx|J&`2Ifl{Wadt zM+6$e7Tl+Z+j!p|fiV*J8W582>yW?Jf}i1ouK^tS?yKQd?~44cR(t08;M<2Q{LKi7|F+>?e(Djo`MF-hhcx{D$hY~~%Lg9-9Qpa6 zQps^;rB{y25x4Q*1~{oF((U$~?1LKxILh%bgvSH_XQu}mR$6jTBW~l}c)G&-XQbb6 z!8Q2cZU)>*z&8ZpaR>{LZ|mz1r+M+FPg8hbM7pi7D|~PbfTO-vASA!tkw44gV|O3? z*CB;>eF*b<3vMmqcDkodW+=!)+giw|NjZco~1|6h;3Lq#M72=@0ne>H$Z;B8qS(!lMzAkKF2spNT1nEZZOrPU}y8v*M%N__Rmz#&6e_MFt zh}(Fl4N-VcM*5=`+zCFo0|8eJd{3d%4CRfya0cLNS4x%gIuF#W~D5R%S;fHUJV<ZchQi_w7$fqt0pS>gs}Q0q z7ylXIZxAj-h$%?%bRC|F@I1s%LWr(b+y@~{W$`XL{18SHCa(BRgug}jSA;M*#ZwT1 zWO3*?Z+%Zj+~%(ga8m&H#2{sVPacH%npK|@5Vzrb0gmkGJ%fa`=2VfYe4>cyXq z!Md$gZYkn6{~sQ$;9fX7&~U2-*MztY_bA}lFDGmGQ+@C!`QY<3+?_{x?b)q}Uv1Gz zB5ul}+{0DKH&Xyw-Tr<);>s@}H^}#Iz+=ak* zj)vbC`CnS_dm{do6)#5o9V@=84__Ye3X^~_;?E;;crF$ca~lyeeiXF zn*+FGG<*^AKe6C<@xlKKvY=kQhmiQ2dVBTu3B+xF9@cR4kiN{q8}`ASuHgp&t;VBFL4a99a&jXI|PiXj?ksr3;<39L<0Y~|jAFRslg;3hH4Eu>zxpu^D zI*nxtE{XI37Tk?KxFH&@C(`pRxE?;Zw+~YIo;)bf@b-LHj(+AzqjC)`{2p}cNOsdLc@1K{uB#-`vG3O?;fD=E=T$(3$D=z zH%7w^Lb_Rpq&^(ugX`?2@cpe_|tswWg7moeHH%o`vw|LwcytxZsT7HILfn5!%sl| zz83uXKKMZzepd~@r6=~uW3D{kN8HBW)KlSKjF9!c68Udi@Y8(or)l`THT;+R1R9>R z;QxcTjlXkmh4-z!z54YU;x^n|z|p>kkbb{~?_?j`fg0boy}bCoLfpo8_g;$bEFavJ zKDZ*lk?vcim`7N2Uqjr+_iU-ccRSMUesYTsZaCnGuLsgEvG5i7;J(>Y;oG>U7vJ9y zx9N`8a3>-CYzyDRbzeBUB& zs_%>40}TZh+zP~Px($G%e$^t~mf!V0xT63^zvBB6+S!T5EftH%ovxA9*C zIN~3TbQ}L!KDdJbNBo}$72cIW%!e(!%MrKn9tAks-5v;u|NcF&-(|tygSZVpbPqY3 zT3m>be7{{BXt>UT-+;Ic|6H-ci_e^T_+IFPn+Z7Dfk`^7)a8BwxN|K02l>kJEwGRl&czEAU!$ z-ef%L%CiM<69B&);ZX>$)#c6woK0t>uiR(5DE#Yp@xrY|+{XVT;HCrbTn#@Q`E?dQ zr~2Se)NtFn1{yA~;J!lK#@p6a(SIK4HlNS<;O^6KS0epz3*R&!+(f{!9fu%&Ukh%K z5AHC)u|2+qFT-|RU*K)WwTRn%E(09f@fL(^zwyZbH0sL#JRkf^`3i1HexTv+8g4tl zZ$sSRWjqGBi-7Mk4Sy!`U$)>wKKOxvyB_cdBfJjb9tc^FR2Q84M*J;=mmpk)km--> za0$YxNRR9I)jFK0L!PI;7WpUX_<=h7E0A1?^s5j~LO2B>>yJ;tHLS4s#3#Qz^|~E( zqaL1vZ~#KA@dSQ}aJu5RV5|-+b;x=FbwQa9i*(5I(@fu@!wouIsl$hKxJZX#9r6q~ z%Z<@tg%11cu$K-Cb+{G4gm2R!&#E)tq(h#KXS`mAJOj@-<-u^Y4$F0Tqz-%Put0|$ zkOLkIHtTSm4xiHDQXMYP;Vd0O_EK)74u|Tnj}A+9h(O>{kl%=p(9w1r{ z-F-nn^BtxF*hr>NM?*afIq;e9EG>m?<1^n?`lo*8J4zwo7WlIRffs>ao~v;N6@8u0 zd>1LKpSft+j5Mb6-J`cPUA}Ylp2ov>jh+QhQg$5lLqGG~qI-1N=J9wZOF#2nqT@85 ze1~X1oz8cMZqqpV&d_k3-aHxScVGvJfBY1j71d?=-p)7;Q;xy=I{nP|bpCG2&ct_@ zH9X(T*`e|CeH^w4afb20c9S}y^YF8GeCB&M>vUPZZv&PT{OmwrPmHsK;rlfR{NtMr=2S%!K|)AFy61_B=dXAotZL1!v( z@|pU#JH})_^KW0sM?VG*x1KQ`IO$uUCkAGB&@#`DSm~41xF|S>f;R*6HF!49N$_Bv zM_aVsx1Rq5y)rOYSv^>$w{NVn zzqIQ9u$BH7i|zqd*_g!}@1HZWI>_ST2dloXSam$a!a36_`;7%N%z7Sb(Y?chpJ2fp zYRM#E@&ALx&jl9G&slhuS$KA}c)P%o$s{ZNd5fQbTmYwDbJj0+d)}e0F)!LW*9$l) zcpYEA#B1Yl-zs);4GO+ijhm!+$%i7VE~?OP_SWdvcyR-R%~Y;jUDjNy=Dn7o#*f5Y z7hv7_<-#aba`OW&NU6E>DmP0BCTo@|#S0$%;NCO^=eZNfEub>9T&3ZHC>C}CMBNi` z8SaK~3oHE2y&E;WSIo^-sB`72vijZk8eWWqD;+XQXV15reDbuJS52w8eC7;ZFX(6w zmBGGuP;^L8Rmv z(uEhyyr>56)n7KFW+LHC29$deZY;ocYi=4@HtL9r_^ce=l(4Tev5bz(hqNTzaXl z(XlEmb;@={ghSuCu*6AW8Rs@RxhxIWnRs%qnt;ncYA(I-(utS)a@=yN*FxeKS|D~a zBZMwSc9viCSHOoo&q&B zR9yD)DVNmn&Pp%u)-6vpGtrN0Fwl7+czcD|jOoazk%pUoEwSksZmdx;QxP&P3Z?ER zRjjx;?PkRI>1IHgCc|Lhx*JDi>~{V%>2?{3po#LhfJ5;rx8_J^uq!Ax`MB6UoLqI0 zo532eE$p%s1DX^Ryl^T_Q3Z^fX=BHYH*N;_B=W1!OjaT;D)OfA@<0J0H`1K+5mX;` z%lU;pb2{&dbMrwgGigvpnh4boNZd;8t--}b&1}`3a%STeE;Q-{Tmxnq1u7wKk8}|! zG0SC>N{+lo*Ud&1*hB3smovMEqt9N3a=eetElp5=ThblKVm>Hd=UO0Z5YaTe*|xT; z)}a*8hj4qIm%0dH0;*@ht_cE=Li z;s*ftSJzCQcJW11&?KE8NWziuHrCUD=qLf$J3V(5>xtV#s%e#0_)3nPcX3-Y+ zx+h1*{)>&A3>l~GE03HU)VH<4-vD1SAgXKL8mjdqDsG#|<2av_XS4`1sw(it?n6#;S_?``dT_ z`2o|j0H$j)XT%gy*0lm{OB)R*v%8T=Il!VLIVqb5KYvrT+>)yT8Yaj>vF%N_yx_8+E&&R>n_--LqY&615@%q6ZYPa#6L#mucqe0Dd@YjIy&yHO9l3qrlTHZ z*dKEW0TR>MDXN638>$$XI1v-uETZ~6*t;Bo!YISDY4T@eiYc$~#PYfR zdIC?jW|D7S;v1WVxOd+93Ivg~;==x=DlEcH?mJR%;K%pLAM;H%l*hkP=W`|eFb0sx zyGQ)81D}@wSE7oP;;}`1#>X3Q=Q}Rxm#?(U;g?4#SbUQ+fN#^Jw+IYBQMOBv8~Z50 zNTK;axq^B@Wz^zhfT&$?o{iy;%&WqOXK=r~^BrT>MSmYH+S>qBdSOyOI57Gn1^gCh z`W%4!rIZ?hM1v2F}S>{=#rNz^VY>f8(IrkjX>&HGL3HmZiw^Ky7=(m9Z2Q( z0B%u|-(Y=+p#WL@5W~g@KYK)#N`yAXLz~iEK~7d}cFW@<4hvb{DqMzW*22GK;n3!I zXdSqSG~=tXYxD!!xdH1hiRv|ps&&=}P9UZt5!2P*lX(`d+6b+n_(&#oG)oCRJjsY6`69Y;=f6b5TOiP4%`Lz_P$S;+a#6xZP zjqtm$s5(CXj?eLJN`y8=n!7+oDAfug_*U2)e37}1oeW=Gi8N8Zj?Q+7&Nibm><3jP zeb+@g4+$ofI(7u`_3`xml9{5?^MW9JtV*QM&YP}PdHC>XaCy8QDY|vHfKoztmtOdM zQWY58VtvAj4M`zFsduCXY{w@V0IypGt{&+F>_;I`zuPx z(E2z(pZv7TaTL}JAE3d#JnV47{wk!Pf$T4jZQ^G(*E^pV+Z3zBC)hUT16^nX>LBXT zoEWz`F{ceQ6V+&4&mn_OppE%)s&@J6Oh;tR zH2GwO{$`DQgBZE^yeSPAbl_I}4rn$#Z^d_FF4$?R&^6umlMixj#Rs1FDdKqt3m2XJ z@Uh~m!XdRp6^tka5kru!5CC9^Q3JT?7EoWMEsRMDJ2O^oPH4IEHA5_%6sSs6wAT1JMBM=Os(zMoZscD^EnJBon z9;F^pS$rpFywxoLk!B?+o$~P_5q#JOBIt;;6bZ=JRZIC{BUiG0@HyzC%_rUX z&3a>BO5O2q=Pb)l8llg!a9@IzJ)?2*~ z25NnzrAMTt1PxH9RIptP7)nNp>c=ay_2cG5 zXr=Vy=KpIyp74!ZH#z|L*jL~l82G3fJ=??hvU55vx|P|tuaG8JR?QxAQlBEjBeBzw z;CANruSpa}2t!rTki6i6eS`pG{qi6h-Ep;}(JrzO8wfBoiqC@RZ+=4I=n$<9ZNv9? zLfaypU4oG_1Re~c!&h&+7+JutbXa^j3d0_4Q`azXiGfnhtNf~|q6h%*%w+>s zf910Q_^^6@2A)GiO*%y#OVFjLjx8S+c3Y>OyL5vK1AD--;43nx18N2@ndYLkd^{ck z>1O-@LcSUZGir0W23fGeph4SIFc=T1e&CCKP+`1sJbrC!v^{{Y?xk-Qe6$1{insH_ zkdVvB@zUXKyO3%_o>3K?-yl=E)LLCi;b>AZ&9ErJ_H-X9V2p_x19V?gB34@Lu`9-( zhTQp&gCtn|twJAZuG9&YDgk+{^->T@Q3WIX>?7KHq-konH}DqaOJqCntuk>pFpWSx ztS_Sm(zq!Oj(q_?8ClNp0_8Cq7y>u5jzhhCkP1D)@y?NEf00sAffEZ1$kKnus*p`1 zf93e)nFRbfX*@@AsxPe#bDW|0Z{MZK{o&`Ns9UxTY1O{6)?AT?;!-K@p1^zj7 z+mQAbU)g#%1LXqd!fim>P+wXJ^zT=`G&c1SEkT)H9 zB5y0N743qou1_I^?2GT$VFf}=&x?;k2;9ZJ5aK9#F(=J1o5inV3RQye1cYeD;u7e= z{s=$EB!c+vMhFM9xJ<`igg!C72qEDIVc~#bGjxyXry^weH{ph(UlkvYkm;{rp@eWV z5iF_BXF4f@z9nR9>Bpr^_A=`xI`{VE?FhJBm2?&6@%uoBen0vWKj7#%!nb(3G$^DK=z72;PBoE*32 zOeKx0Cg3|MdK+4$@Y4%!im%4p5a4pY*^A5EBioscE@y|vV7F>3Yq~DSR*uxv&Czx7 z?{IiGF&r`ZHUONpSl`ZoMyjCg%ISrEy{P?j*MSENIQE2rgSl?3*MX;9|=re&brTe9P&hpn;kr!w}9z%3p=RZMrW*vA?H&vd7r}6Z>Ks9WHcO7^lc3W{} zKM~^3zn0AMPr{)7XLr*>6`aj(P0ciXUgpXP(*~+MKaN!IJTZJr5BK7LiFf{LYOpys z!HI&8ieaONx$$=37>sBGaM-k6h@W25?){5AjxB-BK0bcVns$HUzyOibe2iI`7kE%H z;jr~nYuZD9nHN}z!E)`Ja&5+I5kJFZKo|xG4Z_k;z}%+!p}|4?+xWh z&OI8xiG_PYFo_=V>WaD4F?!t;4VeDP@WJT$&|qT`}dH!Z4e4d|hk^Y>y zO_+6c2;T)%7U7dfm~*dE;2-8zEOs(lH(CD~oRnna2XL7ZQOYmgSc0ytpX&?V=U5S* z(`SRM!j>OQ+SqP}f+g#B97=4T9pGU2actYkj_{Umgs$WpnN_r_k6SoW;1=#rvhfD| z?i9DT+xTs6&pw*if=3bCeMjyjwhBvlq7~um**ICh(0(jigbG&#pINuYBB;UR=!0qC zv3^udB27G5jV9`jUZZudQK;14Oe*-0c#`c?+cL&!lSG&|mS_2}I2|d^hsEc~ax`Yl zLnBS~po1CYO17lZ@tCU3QcrEzc}@4>W|!3FSHP1@hQSA#jUQkSi-w2@09>$RgVUV- zQC@&XBm$~A>7uqqN1!nC(s2BBw9Fgrji^@w&x12f7IF|2S!zAOU+a3zfi$9~mxv6Qm~1|jy240A@?;;~*7@3}| z71r~`Tt%K2qZOC6|i8peveiuG&_DYhhi87433=`Pa7e-fQl zrNlj=CaXnFL}d~yRBa@ERZrH;sgw5$-l#=MIdFq~>Ho(XU2WHB8`rB<-Bpd2VDz(E zK(D0q2AioH(CO2I+{$W2{gPF7x}B}4bBv-c29;!0qsGfRTWe>mV(KbFgc?n+B1ojU z%z`Qd6vqzO@g1p97U-6o(EBK8T@@ks6b4+Q)ID~iIyX9+r*tv#yeL|0|AY)=wbD{r z&8b>Yw?e3!Y`qYrX(Uc{{y(VQ?RF!b%hh+gk-mW+AWBOfxpRQ=YXE_gGD_Ye79?JV zifN6OR?*`k{ZdDxw_(9U3qp4Y(O`B6seg0-EEw*wFc`&5Ez7_(0Q7}Rs(M#xbu~(( zah*|`GkwDiaZ#433o~&2ij5SNMw(fuS+ddG=R?D0NF69>Tr9nOwKmO~g`o}x#t~d8 zhaJ-nT10UQjV*&S4RAZKe51h=mB2%(#48Ka^okAE*}z)n1!MXA%APK~tWqm~k!U>m ziSp9K(@Yug#y3~@?EAV?N)4ab))bz_H3BJ4?$TVbP}yDVY9=e~tno*OqC%=BiRn;l3NA4c{aPN3 zVxsEtXt_WV9&MM9D7s>S7>%*Ynda;Pqil)2!wmMyQqN)~mX1Xr5nh9eN80jae`Xgn zkM6IcmWffNEg$8@Tk>9yCufkHFEt@khx{`N;>qdcBRb6i${z+6r!Xq4M`o3vLD>Ct zRmw}^(ZR@0)1xtIMJg>JIq~Qu78eqcRXr0zLP6%U$1^wEuIKw$fi|W3_)6s`1!vB( ze?-|dU;p$A2MSb}Q#h6wvPnq^M*+oK^3N!ZCn=|&6wkmc;$d1M%3rT|P*EW*!v0b5 zy!g2*9thP_>ZimLLD`?xAC9I1(uE(6l2(6chqaadpgJRL;R;6$Fv}_p&a05PbP?^b zvDb<4%evT;4FrwJ>nMV}YBV7qxk2kZFHPs_j>S2Jp zBU6@f=Ek2GXC{%b@wm?iHjnGG-5DEeTbiV0X}AsXBmY<8m)OML|F4hu4J57`WtP!+ z(&yrZw^`A}1F3s};74V#_@tQRAPcEDq^OvJ_*RqBmGcXYvH~B4V)%Pmu@>-WU+j z22bk5;)&#JYJIXlpTn{^htnw?JobleJ~RL`YS(aCPtI$l_5_mP?mUxI+s@%91t=V& zjF!UuB&y01RlRruwTcJyctjQFsltb0LrRWSCPPb6iPVNqF-41(qX1*85NnP0M2wgc z@&rUJ=>i^I>H`wV#r=s~aw5&c#2qAjq&d&mSLgz#uJE9r$XL=wke6I6wB2r&`W1lW z=vPr@-XW5QgGW6x^L7zZy}(N{DLB<(uGD`&;UrWl`!OCh>guHyyQ!B66P2=6OD(UQ z4oT`SEQQmQN!GLF!-BkZNe3uZ&rB_iytq81*Pxj+#VZ7{5${BavHn_rL`L7kw^YP+ zs!;tmQWL5rb))GMpmeSWG}o?SgX0Wn5I8f>fSz01j?D*W^>;HhN)E&%=O6YZ$jx1w z4?S487q%C<0Nj~fTU(5_{yFW`=srF=3Udo$^o7cYb}fOPTY|a9&EY<;w@uCyBqgpO zjzgv3ofh_|z=uk18+g_N8EfYrXb=yMH1~H2I;DR|kwN0llKCMrAqY1o^%}vIdaRL5 zR3-=J2Ek0e-0}|D8~vD>Bkg;sKPPp*hmftU4!XfYOKRcI??V~&R7fMuC0@w}q?}Q> zFaE8YM{49pB*K0TAjzmy%AYTU9v2ivenMna^z`QJ`KfD|9;MqX^a?^5Nk27wbg zYQ+HB<*XRAS=JZ0d-i4}k9Bdx1V{J_;>c=QKQy}f!@ryc{gRK4uKp7-#Ze+GiVx%3 zN#oiLv})I|zx)mz>IHz=9ZJr$+5HIymg2IE>R++ZMx&}uTn>&$w;(_AJb&T3$}$4` z$Uv2mP|}XQ{TaGNc)Vw!%^oZAv8y0s#gT4}4))Y&Pu3`F@B8+jPEKa;+ssVGM7=N( zyIQT6q95?cRpxrm-eg64Z)_dW>%|#p=4&(}^6Z%Q_hAwpI+K_diw>%eJO6%QN-n%t z@RdY<2m~u$jwe%)r?v5eFxT5J#UuG_3o9!PlGR+ihWwo7;t9zNcx*}P9>FN& z{5?h}&hb$6gGi@4&n4>5mri%0 zx7O_M((3mSv&Vua1>BgN8<_9N+vc7qr1oQ_KyKSMRPr-w&+?)!y+|UIVUkh>LR!>F z>-9rQA+wvDAwE?Ulhgc>Bg3cp=va>jC1wp-Qk7xY)JsMwD%~I=qkfXg3g}c}doS4l z6!vuA=blS;YgS?Uet(cveKiqQW+toA>ISgj?(RD^we6iWp!iRJus`_A;ScV;t1?~N zlhMJd7OCeyBy>rrY$3`)JBdf%1m1oOUgAx=? z1O3!KfKM(aRY2x1W)XV2c(K9tB?*l59jQ;+$VJb5g-w2Oj+Wz3>NR9xi;8%-=4#cA zdx^3{Ai2q;$j5y{0K-Kfb&Hf9s7u!=H=R)|zu-508Z1I0DRmc7Bo_-7m&MfCz>rKz zJzBVgiBg$BM-WIvjJI|?oTP%tYK@LTG4KPAkxxTHWx>cWFz7aF>I0Vym%{t>TW#e)|qoKh+`KMXgwmNWJG7iN$G)Pg0G`x z=u8imPgWuyOYg*z(MbCP!%ynW*Z&~3KCpifKvd}kl^wK#jM$Yb+J`Gpe$N+KlxB}i7e8L!tGh-Bm9vQ+YliCIsQFS_dy!aBI)1He;A3R*ksd3u9eIpZ{j4EOudkaz1smYxoj6-udpZG)S*=mcl zw!PvKP~>_3`s|gg4atfrxjJ3ABHCnZ5ZU z@g}uFBn7#@CNZ+84TPxK#ZVnBJKY-3ky2JQ`^dCL9Z;!4iLg=#kAa~2CpRy0vKAvG87O`dV9~0zIoiPqyVP{Jjhfs`Kx$F%#U0pJ^%Vw(N*7jUN zC^miV1}Pyc;%m6>T@^FRaG~VD$#GJCt+Ce&_Sgzy&t(mI_^d%0+3(?H?~R=7?P=I+ zdmW9h>h=~MQMW``RoY_&C>$DrWq`3wxyOH5PZsc>OAMTpS@z(`uaz8O55^*=2td*U z;J=JUJn}q$efEG!$xxVLKas2n&SY%O-zoVox8{=ktw#O2N_{NJhmGVv-Qb|B7j&@_ z3It2v1 zE$~Rr7QlBy)IxOxs8k``S|S?YF#yyTWdP0tAjg(Eq=-NKzrMpOcM^;+-5D?ctCzn; z8OBie;bDZ@yK?$2cc948rUjslcm3HcIOtR_u{PC6k)~!?E6mOh#II>LCTVyc%U&bV zw#b~KuEFSU1TK}RYVV78z1t!!U9eK-+=p^ACW1G@DC435T)P%5o`-hc^U#)= zlFwJ`+tWOr2Ld=Thhw@Z-p<9iym(dnT3@U`@~|JqG7(i~mteF69FqB2LnEz4iJ9$@ zwOta`DS_S`Ddk2S9D6RIyv?bP3xR}Sp^o(RT;d2hIEv84asLcOvzm2W8(Etd zpV=M*Ynw7tlxTz|+ZWf@M4HR9Y$;u76Hl#26HEeckR}d&?&CYc{s6tn5%eK6`JD5P0u6q@_y3_Id@@fQVNj$~_`s7q-;?A29 zVv4kX%PW)m8}qS6c>~E<=bIdQzJAM=0yNh-&2d+umcsm($pBseD#MtjR+SLxjfj%y z7K5wn+cqv+qW2kGzXGn-&{kPm{|<8>+A^Hn7&VE%!^if0c}3MQ+?4Y=?8`hK_F*}( zKVY!8z2stFBG|?FtwF7@UM~kdahCBqEa^*qMx(Xc1e z$Ei}SLIPC4;+ABia8Um&Ilx$Mm`3C4>Ax^BLz&fg$b>!p-%U_bPlnWnfiZZaPl9iH z+R4`8_lb)=d2OrG3=~h#)$MQOz$YWS)0iKb#!O`~ zeczK$(~Rra>fVbETQ>lRDE{)^>~Gih;qMib5;Q+4YlKAMB3>-kk^Y4#P$r;KfSt7+ zWYI_kfGiY9HnUc=PQzPA78UE-&El;;cvIKJD2Z(iCn2$q;7f>+t;G#85MeO-N0Fgp zXZCmpwa7YKD<*cf_uGHP+IBOls@*rAN(4MiSj}RY7UJ3mTGy&qXTna}zeTbCZ&`3w{>JGS{Eu9{~O|a0`^lMORlDQpZ zR^yp%XdhpPRa3(a^r;XB`Y&=THw{)P2P;EDO4Em~Tv1uPe zPDYoUD=exptnL&Q@pp-;!u(}KC4Hk1mpR3kB9^s};8jp*kaAxiDa^km%&g4LA~O5g zhH<1{5TCE2ARNv5(SFCzyg4?Z2?aCz-Bd7}(T3Gh1GZtlw4rXv*;rC>YN1_;+-7(j ziL+at48l|%BE=1$Yx@7L#=hT5`zw+5J}H7=?LrP6(Moc7Rz?DgdQi9;{ID04kD*~2 zJ`%Ix9UFKTmv%}zld&^ip@TCCYa6bykhLT2=1l+!;p*WQaP?&Tg}KgT{lhPF7V-LfV1Zpe+u5*RlM7?44+1ArtI=X^ zM`GsO@<|tXY#wtPS<@TK7w&lon;*86V9+B8@pKzf`w*xE=PChqN=5%5Ji0?pOIx1Y zA+}ZIIdn)Z$D!cdQUQ}hgJzyJG7+y7>qyq`E0rBBmBnRbL>+G=7VUL7gIlJvegn}M zA?(-8=D>;^TewqI)^i6M>O0WLA0t;`GS>Gc@nzTBO%3DY*z0|F!!s4|g%`DehvMGF zt>7)vnHQ|PKuEP4JVmeO!gGMZbG3sf5$j|XRdr+A)iX`cMD3`R4_zyi@^pWpTp~>b z#DILVQ#KK15-c^0CtkQKjCAfDjP?@7Iuf{P4xE+-qsqF<7?W=t!Ic__V+!A_bkARK zmdeIXwZ6b=w*_=E7<17H3~s+`E;sIys=p$oGzNpR+MUK-;w09I32u) z$uuG8_N1<*&KA1DZmEnzTdg6{VP_cGA@;2rFJ)t9*(X_eQ#+n#J+{Iwq@#dIKL#@d zmc@yRVxdO2gA#bYzP615S1IU8p3Y&G(E6b7Q#@La&db^UXE^N-Mr<7&hz^M*-wIjp zvFw-Wj)6$iqhK!(Ox~lp#PH3|BmEOE@hxjWgy%Lwoohqik(k3_rX?g{?FvGgljIjT#$@r~3d~ znusiv^A2M7lo<;}(j6eYjSv$WAyMC(Bsemv9)yV%S;;b|nL~=U4|5zSqhuo7$O62w zScLvKO#s%e+6KIow*ivOpDUQF3;WF{X5JC4=Kpy20iJsw?VZGhtnHCwIU#wAFc}Yl zNtzYg=ai<=K4*ly8QXjBv)VJb+4AFxDTQiLFOR>aE$*#R*=TOWrZkDnA5fs0Kk^~NoBdsl#Zy< zWKn#Va`9cbA3Ks2#6RtkTT2Zzg77Aa5g5;cm6cBAy`%9*%d@#mc|7{dTlR*-VIth^ zeZZ*R3*%S8wBZ=hdCN;Mdb}WjvDHIFwzV7;jXw2`XV6FH0h z*AzPk#aONK3K`XCh7&RJfW&wuxDt)x>XlARgsCKn!g$qIxm#GAKT#Y(Gqh_V3TvB< zA*Qep(9RIIDyt6c7k63uz7F)mz;5fS7 zq-rH>6aWT($Pg7zgjsR%MNs}sRbG(k-q>ase+&g(F74iUyW#R!aA_7-e+L<%H%3wg zxGtLe1yEv=l8eSwvTQ6k$z2q*2Q;6>GV6SjC@vPvh%mBBd>U!MNDJH_BG2YAEq+?b zP)s|%C=k~+ehatM)V7L880RZtP{+fYLD9b4+Toh+mIL8ja_wYy)!8v3;7*7Vr})OM5ZDPa@_;w|VMJHr=Q z`5Kc-j`?lLJ4D<~8_0m=8Yz!~jPoN5S{}jW{jKMbuAndh!q*x$NG1hfZa^7Wgkfx=-UX;+U~ExpEnftu3eQ4^?QQT(H`Ch8sT*A;MN3WH)P>mQPVJt| zqAqQZ%-N2i=tzOyo+vMpC8ORNeLj3Xl!s~v9s$bF_dt6_{)#6 z!fMG#{0;B=2`*=MZ(T1z!PK27fJGfz(dcPH8*X3v89F3Ma^)zUm{2`M`*Sy?bZGKY z!SZWh;S{+R&ZF4`5zC^2tM*}EPwKbk6#Lm^k>V;TLh_RQzTuA@RG~A7(Y9=oq z{)O$mm96+T9u4tl1?$#?m}eRJU5r`QO70dcaO+5t==3Lenh~W<-WuaKC$_eh)4A6= z8fjv$fw)SU1ou_6CoW4v>0=!*-MM6q2Uprban({9mTjQ89cjGkM`>Vb1~&@%mlxdi zKKlb8kvSz;{Qnh5VDBHRpO6Q5!pZ6)kTA1Caq>rubt{HLCVM$Em8llF!8zm8wI zY%{cuK(3C!7C0X2rUIoSspB7IOTirUhYWOA7k6Cyk@d-#U=Q!U+{R_=+h&97(?{6U z8)TEd47f!073%7S)DM%9P*tB?Cg^UN17_p+_>kU&6o!k6D|}z7YmAGXX@Sz zD2}%l6q_?OOGAyUh^!KdIeS&ADg&X^+bnHp%&EgPSUDPQJUj4SNYE!Xc0w6;>k1}0 z;=TW{s|BC<;)&gxczDeRuT+GiBU$lc@$J#BQs>EKs4KQ2;k{88637 z5!T5v-a65f=vmTI^~rjnAA1<|@qLm|v+$K^+r)v_=p@Fc0LsbqhCR0 zB!v3IPc%2xt)SBDo9bF(p~r<4_6sgAd@Rcg|4xQJ=13oJMslp`Q$AmTyF_ptrIf$e z^JCXkK76FPo8NW6@;f$#Bc*R4C1Ql2IBgHKd|FuhF->o5+<%=!lkyo-v@l^~s9kcT zY`7&%HaSgWYPSa+Z7b&nHYxDF@?WY#@?9D0O6I~{Nz3=gIQ>U9&g94a=hFmZlGzf()Hbim2v-tK_k zJm3+%>Q%zHXgY4?G@2I=HSyW$9OV`LWS*8UyB>P)rb!9jA|#|k$G zn^4$1_vDdlMU%sNEHS4sF|#RA-I%Cq%&%&~lIG*_(1L^<2F4L(`auaCTE>D_BD4T6 zfyf1&Ykx zQS_InmJm~GXpus=Xh>*D@Wy_Ed#5&|xE#eE4p+#c!7o~Ah3ohIetlnf) zSaTB(Ep^buLk)OVYma{xB3wEs$4f#qKUc^q|0oQyk}$j?G2FWm91lGdnez}_D2#Nd z{X=ZX10WCLuQ$ER>fLlRvv|A@|50^lHB1Og+Tm8LqVwSLMSuI%C!1tUYdnkkhTcn} zYjh=aktLK$FZZntTzX71vYKr=!}pfcp_+?aBU^Ptq6(60$T^PP0afgo+WZH0jEAyy z3}+mBC`-q9g*=&=#O*+$<;m~8BtlDvgzoqm9piN(W5+lPh)l=e(Ph)x$>X%3=t7C@ zWi!o+wDh4E#UN&DsU1t{f3Aaqf?W61i+gFx! zoq=rtI3i-{g794}H&X__?!qya)Eqa{=(L&+x~iP|*L_NbUGG*v{ch%q8q9GsA9E6Z z#FN{3KXg~F$g$ne1zywc2?$pFQ29ag;l#mC58Qhgj0F}(wG!lbQmZ|UPY)f6EFG&-)DWJ_6oilrCR696 z1OUO93(4Zu?R`JrcSF3YjjNUNJ=I9MJhBPrR%{HY&yKXr#Gq;Nt*zIpTC@i`k~ z?*#Ud}|*|}c?OZeg5!Y_i|!(=r*mjrUR^(O8# z&)kGY8qoag$$%A=nR_~m;(uU%)uve0n=eSKHpg3o4}3Gf>diO*g`clm(5OEIx%}c` zsM~klKDRj%H0Fg{tbcgUJE#LkO$}TPd+K3u>R4U7<6Vb^9Wew|cZ*?)G>KmktlIz% zNj}UtEZ>k}vxAZ6bYi_EBDZoj_Sh?D6L92o{#NogUwwBQ(el~ZMu!jYBCYmhqi|Qh zn%t?mt`ujfO#kXea%%fmcMBF-4=6#|PhK*DV712RjeHQTY+JISLNo44J`S_&f*6meNE;0}&v zHKN6tx!d$R1^gm}<;#RAaWzjUk7$tl88o8Ho9twN{q!6+9;9WcEk4S7+}>`w^QH7a|-0P9-v!dqb=($oYHxWBUb3fn%cC;iP~ z%6%SE%iQ2xHPm7STQ&23@Uz`MODkap%Qn-PcjA~e^jkhj`vbUOpVFlV=PdnCQ~G?A zPJg}KX%xQYwlg(6w#2DnT!>~9@kihnbypksZQA&9~UP&wRTc|=7L<<1U^8bFg#^-I#jS@{TV~b)&hTK_BEC;%mDwv8-BS=cR`7b(R9QhvLwpuKl;>qRr*#Y& zwvFLUi$w@VkXY^=A^bUZ>pr4q{b7_9*33R-{spU^?+2&ORn%e{FOnHap8i><6^2qcnR6A7WC{ zW!k0!|1)I@e_OIikT(94NS!ulX)8e&Pn?4WIj2j@M}^&ZmQF?UyKT@0PsUm`Z5=5i zt)m_?mSvf?b}Ir^|Fm`5tx7{O&0)Rn#iADlEp2j0VmNpj-j!cUrq84Lu{s0{XILH6 z;#O*~PA&24#6+BXs@S#R!8hYA5HC&z=LhRBa-sHZ$wm=I{r<}kh062W-%us&>9TYd zbw7|5veo^*g-)MegtzZAcCS?nzOz)fV7A@sLx|J#`LhKdrUV`73&28pxR=ojGZ_&&!81+^qG0KqxIVDA<(Gx|u2$3~I^~*V-}9uOv}Lnf5_K#Xyi z7bmJWCZG5Qvzz3?!yX5JnGW*}@N7JtW-25ha-F1xmw4qYiB3TjpGP;(<$2v;5pnWS zj7`P?q4G)aU6R!)c$vxSEk-ENj-u4Qmr%hsChriwnoa~?M8vZ%ICV6OZ@u&FVVM?S zZWP*t`r!C2eJEK8(g$KWd)8jTy7^87=dR{Bk$r-7(^xhD`2$FtFc{F_t!GdP{#jsnJ zjUsc};9Si#$@H41=txr-55>WGx@i;TW8p3q^G%^>NI)E64J4CU)xOOLYlPy5Cg%04 zspjf}2-+(u*5xvIc|{RDM=`=O$#ykF`P+U%PRjo=l;4=|wmrv4txYr&)B$CMv%Yih z)bEO%R5}fnX%-dro-Tx34$+QRmB68hyx`mt6{*DuiE<2)`rZDWpwq=ns|qYSCqe_# zM;rZ;+6*rrGOW$oyw$Aj4GuyygV_yu(pNVqtom>|2+(y z3X9Hl4jmldn4luMRV+H7hARFnY6lr=Z)194R15>RYI}Q(G#5lTVbZK) z6k`cTj!14vKJm^i942pk7<~XoBu~w@y40Tx+1>LbFs2UE;xD!uh!D(}~I9Wwva0=#D;DSf^T+Z;g_EYyg&rrDe0d0yu>% zn3mlhB^&YzpxOrMFm;%avkuct9bQCXN&tUZUM)5ATlYLBPm}U(jF)brkj8o%SzIf< z4#;;wL`c6A?l|dUh1<>*;p^BbDzCMCsG<)$S&0_vCCs2mC5xP7ibyOdMer`OVqmsn zAaUgg>e`i+_-#F9gkW=Y&t~g;!&Yk@dYv2rrM^VkWyewG8@4aj2bfZie$PhgjlyOcV72 zt5`U|H}krxQ+6tXBR?2%&}z&n3`Wn82>PEQRYd)9WMJ#>V+Qf+i0E&kvVfC@$^xwi z=}le_#_U#c-o%d6w1IX083daQ!EnSjFP2{rl1_Ed>DbvsPet#$4i zq_b*l_PNb?kX{JME?kMo+AevNvU)xxuWxp7yll98YA&q6NkErIS<*Ik$aqY$VW#G! z>i{NfDhJfhS(b(Iw+xvokb$Jb7`@Y%In-#w#k?^I8+XZDq#5JGP*uGoBzmlmMZHIC z#sF-q6^lrP)JXaQ3D#3&SgFG|RFIyM6JFR{Y+vy`_K5n){^q=2OBoC&LM=AR7@dwt zb3X4^%3Qkp%%Y60(lbzwE^@7K&>4Vdm%dBLwez(l`*cW$911~lp)YxKAr6MLXC&f% zCNcrviEH&ym-W9{l*EEDOS0Qxw(T{2d0$W-&;lW>qmjz$*t*7x;6UY2#nXtI|5$@ zhasnx-yJ@p)5v>E<;2Pl7Ltz6P0!iWgG9iQ>fIYC85R~JU%_{?kGA$-BkeLN=RA$? z!RbY2SZTaU3=tx!R9BO0XH236)Ppj*N%?s5;z5+t*8$C-#JhnYCcb%~$>OBHe!oK2 zAEp@#xn4$;YhtvJ6K|%4Z1-BoHg@A433=HMw?9Na%8yrX&fc5%H&y=E?^)$G+iEi6 zSWQM8tGPZIQ{-oXe0IbK8^lRL>^8FYA=3v#9Bh2wG)ox`Qp2r&%0}-5wId9*gK|)N z5^^RrHqm;t2i82%F?CWR%p~>xv7es_fQro74EwD(^D~n;XK?E&lfuN6b@Ui)IE&8l zj~*Q;6iD-C39a~VeCS^>U7xHMLB|$S&@_74Y)m<680&U`(2?bj7rLn$TK&sky(h>x z^_UZu2TWu(wka_5svIoiMCYl9wa+laN-58aboLEKDJr=hPwB>=J-Pt_lSesJ@@pfL zD{zobT4iu+`J{3{K+>2aD>qY#=R0%@s7#oq^1pb_HQ0PB#8pM=+EqmDk;g;pw0u{g zJU12AMOyN?4&H3aaPI!3E~6L4cMnGY;H2PKvqo_PP$a6>@D=;@d9Nqyk7xi&@0#$E z>-CzjPaZGll*be!j|nLH6Y}^3!~P98lh$_g=+ywK{i8>N|t&Vcqb_T-cX*QDPvZU=G`6|_W{H$dmGR; z>_7yUR}|(sdmmV;3@#thy$e@>IHNQ$1-R}68vIKyzbonOaZqg1$eVXz^EI*gR_5`J zK)oum6MQc)e6PG#NsN4tB|dU7I5KNI%>E%pWd_s6!#}$jzzRSo{GO%V*QExdU!

    $?-A#v0PiFpv_?%dm^k}mYILFbB56SprcnbZee`yPvB9ao*-(U#~saD z*AIj&>u18zw=2ZKNGK}^AIxPY7iv2(6eWr3yYlf@AT&rK;5dA)#_3;G#CYM!!x5v)} zk2USG4C>;Si67`5H_z1GM^8&HY?nA7b_S`)r28&YVFQY{)6q zmOsO4p-o|f0CFzMG}F0>?t&s9i+`KZ?RqD;L!ax^bGBQ1V!4wGA9>vJfz$J-!Qs^~ z&zoLNTGf=mgsi}>1SJ(3Qm{M?($~s?zkq%t(Vl7(Cv>H zV^{3fC7Oz6EMqLTgH}y%MpY5F}L3Mf?yhJ`L)I3 zo9vo?tl)$OiY5y0u$2huP&D!9ISBJlGErDhzb*1xi%rvyHHSP&t=$`qu-`cmkNtJF zK=U6y`9P~en)g6TPJAAT&chY+vKD_;D+1Bf?G#2w*~dj`W_`wN(9S+)$#d9V7_hg#Ze_vTWSfx*@GnIwLAZ2lt-@i$%0VbLi0-n2Us1wb|4pDz)vsGuPZQ~h{_G! zS(JJ%ey2ky{yKi=av}Wd_^7Xipsx)(@BBi)^Nx)_oX>t87L~((Z8*xgpx@$QUBdbG z*WJi8>Kk=mQJRDF*Fk?_^f&J;{r}gIjXK@X!fdxR>P}K}&GhG?T7=Oj&w0}K(f>LU zCHKdl9qHGo`_Z}hrf>3V)NRgAt{dsssC)M7_||XoYt;Rued4Z>evP^Zzm9MCCcj4A zDZ>MUBmGd~uOq+w*1){o=jtwf)2REEee8jeerUb+sb@#}HR_)6kJ&%cuTl4+f9%1L zevLZU*M=|S2OelXcbS`qK*fC-HZZUGoOtOQZ{`@=D6RVO{MBYbsWiO)0IYE-tB5 z3|19wD63dmUQKXnJKb~8a)4Iyq_7wLQ z!;i3Z{hTJ#Y|;jEE40CQLhf&74ApFGmu?R;^Rz#7rm>j_4q0L+cDX^`O1|9i*o6k$ zt&Ux(!L^5yKhSBqBdpvwW42M3gw^dA0!X^Tl@xC`-@jiB!7SUSv6^NcY@Z~;bkPpu z^QNN6?zH>AZR4J$#^#PQ&ug(9ABpT)GMS6+iWOEqYg(K!haHW*RfM5n)8z3{G^5Sq zTN!Ofs4E4jbR5-k(F-~oZb~a~*-UpOanZ*1mK!C{-AVJC+ouZyn_U{dw68PVpI8-Q zbH0+|n|KfkaM-C{e~qUn#2;>7+8W|^ZFZl2k#d7>Y8>=Zr``@!qAo9w&ipU{jSk21NY^0S{;a4~<<12=0ENTxsRRY)14G!K5#Gdh1~D|RZQM}_UB`geryj8wXAoWuuYUUWEts> zpp5iE>|QPJGNu)yo3FR7Zsle(+Ai)>1B0IGS+rqvH7Q6iFScB7<=z0UM>F+I(2LCEGgBV#4Y`w>QXX>9G5NIS zxxSEJyePaC^4N>~nVr4jvYm|G551vOoKl02m-R3W1=?YR@l;-fos<9i5#Qg4wu{X z9{|^;Usfp)EUefH-@GtMk1*<|c<*Oy35 z+jQNT75twu{X8JVIv(+%p*CgD*>+E}=11IzllQrTS6-j~1dzvtTfcu#otvf*gLbZn z-EnIe_EH1Ca5T3+I5~Wgev;)-c04v{_Q{_uBu`2FJI2#(dgE8A1x%f3S4LuC?nj({ z$_rr`o9EGPKP;_jwdKq48Ho)cpD(vr!mZZT)-xXT?TpD8u6d_5;oI-lWK@W=^lz50 zF7+lfg?`%RnBjQ1KQnRM=u%_P_^cH{&$)u@>RSuD^pj37{*r__w~0}Awh38%jm*@- zu$LTJjz0GnLToRmUtm1F(^>4vk8(i6Z9hUKoDtKjy0=`ei_ z93OtLdG2Y=Kl*+*uzV^X-p1cJ=sw#Ma@sSs?Q>1V)bh{WrPK0uv+a+2?fUo3*v46y zdVQs)UjH@Q5enulbn+v*j?ndj!6B|2oWMJuwD_#hP@ ztY^lpKHTZ%S8~yLlboIFvwte+&9Rg4r0q)9S8KSKV?oD->!l~{M9>q(xMP3HCvMOv zPukg_@lOEfYT;+!r{H2f3tH}&0=j*Dy6^6ZITQ3BPhNkY|F=HfGwztWt;_gH0Z$r^ zKKi#cp_bk!Ohmo79_>GV?u zqC4&1rZ!u1Ci*51?lf!dxtny<)b8x>C&%2RUkY4}y{28kO&t?+NGt|>6cs5h1MVSFWTG?&ULbOo6+-J_=*X& zk1lbiLXlaVMa!+ItZmjT^odWkH?!HVYp?GzVMd>wqkkiG&UkH1RBDNs!5j6(tuu75 zYd?E#Zlr~iEM(lhWt#W5DLI*We|w~O^4>MC31cIym80*^4fdpP`}0a#%X(v6v_~gb z%tONz_Q;Xi71Dkg9E#X4$4Tcr(>n#a%{cARzWAJQ>W4+)(YIzrz4w5y{cA(izykvN z55rN1a9F?dm*?z<4Lc7CF6^3@p87|86zz_uUvMC#^_2GeI1k>P;CwT9H~4{P>VJSm ztcDh`p*1fuI1?{CmJ_bWvTO8F7bw;-`i{_hMbTfwtq*!5^wH_v5f%)}$)c3BUO zkYfkOZC=JFPbyMt zZuaSRi!q{mnI*V!>{OXz;3uw^t#zDnsW-URKXE|U;`@z$xzE}JOdl|l26X#RX8~nZxi0NVWfV`Y(5t5&@;`GdN^&maHjqaynJyd;Dq@Y<|~IY zadeB2bm$gu^q_Ro^wI(Lc+g<<@9%O-IZ1cg0RGJl4K;TStm%I((LCg(up#Z_Alt+BbT&@vNO5 z;AE_e4Tc-*T)~EoM{}($3vdLq%#i-^<&+S8$CJh zpOl^1(^rx`8Lx+!5KQ;pw!SenAYu*y0NA z{PC|>HEW8Wx_9hqiypCB_B%Soa=f~k{981I=25G-#QjS)yAYcF61e$W#%g~`I`l$9 zKJo=MUDvx}^nu3FskUZ|)>ARHs{}8say6*JffPK#kKqyCHWl+!^8~%)k-o7lg7>vo ze-R#neL)uyWlXXT2xs`?+=IPa#{OAzUAv>rULKMry>`*A*L= z)iNmjV0P^(Anxw#)}=lA^3qAwhb#ThZ(iNjKc$>fYiCS&18{#T=CF<7ILZ65L$ut_ zVi+#x_3FTRjt0)XsTerRZ9V-N4rWS8UmcVy77b`IBzLl-wH^ApqFAl%)&l(v^u~!a z7TmpM3El&EX6L>2h->oRRj=7%BJizHo_oxIs`gC!3|ZI6cyI6KYE0|28nHBQ#?e#@ zyCdPvg89Y9ye;^6FkYV*<#zZMdIYU$Eid!t%Gw4W4KD0?O*9@2ZR+`(81h2ofcPDH z0R>0a6tNX2jdRU32ho?z0bKOLHXj#}fm>Q~1R>!nDJUkyN4SXnS_2}&E3Yz!!hw?T z1j7}YB-~TIX!}9x@8|<3`O|RG`!vEEfuEw#&jT)yo;3YX1Koy;%Ba%k0#9vpJ1z=W z@x+5n<+=;kXa!ICk_JV5M3(9v9)Pa}p2|^&i`D@(oy`ip7q~$BM}enxVK**n3yFR* zv>yUb2cuu%A}xt3o~$=fIeKte6+FX3%b`LK)Ol@+AovP+swdS!i;L2sh@_g6>Pwms z)pn2)grBqsZUID}-av7RidL*!y}YPs%0+D7Q=q*>x>5sz%FAjm&<>|~fKCI$IASa> zuPQ1ktEyU4rN)wY$cxHW6Bl_Y@rr+FRWlSQ#iBH&uVJgoRzZ>8 z6sN5sV@ic$IC9;pb(K@dAn}wnutc|_a?J(`x+w7}%hyzvPD#DA9zQw8RF%nHRRu)+ z@2HmQT_tH2RDDW)i_{9sHC97qw)wy+4}}EOIiS)*!9%r{jYJNswu~IP-a|B=?BB{h`QOp0=#Poa)WaZ=9$xuUodhNsI)$*}aA*03r=%g$`ikm`k_xEh*_eWXP_eqKI;Fg#w6tt> z3e0IjuVo5lTbZ)HxC+Fp*Q8XfS+}|r8h27w71xvxC0txm!ITzPZKzo7T#llAi>8wR zhs_^3dKfNn3Z5CjQwIGq7lofuFr{*=i^7-E6b|Qr!iJczi{l@($l)ULA1VDznlj*$ zWpGjY4uoU2NGSxwtdzf4hFJxGc*yhfWtf!*h$7_Y$}lSf5OQ%Tv4EI4Qu-ogcu;|{ zfS5T_1~3Im;eg~ni>ZxZ8_G@b4*=pTU5W^ZSuDi?h*>Sgg3O>pBHtv#EXo|SQT|yF z17-~ZViwN-K!#bz05MDD_sTG<8xT#G-zCE=A0R59e^7>52LRDz`K>a{Y5~NAm%mqr zSxb=^@H`$=+ zPVT{fXL46E!>D@qsGQ_dQ7O{1r|QijTf~9>nTlV;I3x#sB2u_l@sCyf&5Hl8prQD! zivN#_->3NfioZwkzo7X06n`G2$1+;=xjIAP=z~EeoK{})YiP-agI*@dAENljD}I$e zn*8WfRqxgw#0m8Oh5Q%`svfN$4D&czSfe$vyY&I=WaU!7;(QT*z>0#b<{ zKyo+XpW>_YRtEe;qdFcpfqt6r1O2pf3G~+u^G_V+A5xm9tdvZVyj(%`9jz+ZS;(s* z=%j4{Q&h64tZEJ6&oB2wi6|@TkY8RyX#+3}6}YSp1<9+ks&r4)YgQ>Qn8S7ORpu1j zJgsOZBf}Z0&O8Y_q&rXYr4MC5byTF`DlfC3N@-0~QU-+9J=mX>(i*ZuEBT;{PiiHs zx|dwJrRX*#y6qe5>r0(xQ}p{?q_3~4Y)D(*$o6V!Vqw&%bOsF@Dv9w zL-Es2TfGQ>wf1UvDtS?QbX$mlx118tG9m%hK_A{_?bWK~z_K*tlp;$0z_CtrT@XUf z+rMoEy{Hi5u*29=praMg3+dAgB#7Ft}k;dWyY--~NIuAM$G4Wl#>!)?4` z3q^KsUntiy)6*dnT%%!Lz%t@(Asox3Qy8o)r9S|CV0zdGt|b{_M%QrH`-%)P<#V~~ z0MelJy8bb8dVSna@4`nxNq5_Dd1Ol0fjX%A|BNVO5G%a!G*sVDL^*<3<^?s3XamC2 z;}Hg&+7?(v#fahdZPj*YK_0{F8W49U&oa}g4n{z#KkNd(KzWgE;XKG=Gq9^m`Kxg- zguEE$Lvqx|&9WTzh4yPD`@U-VqXAl{vh7N=JX+226CI}Vf3Rf%^;$;Ny44jJ!VbQ$Blivo@JzSM;}Kgdg) zX^3~{NydABkhr%_`-4Qqc<)vi@7TSyw>v#-H(F@7Th8W9lHW3<*6yr1<9gxU7RDtw+L& z5D`4!$?9X_owKuJP8-o=Hs@q?5oT^<4vG0ex^I9Jj(X;FL-<({bsl>lC!+`42=7|V zAK1d)VJx5FAHs)&=65BL!Vd;1cX3u7B&%~~F=JPh$#!&kj!*1@Rqce>P8ZqLgc$h| zn8b9DVa(p*I0mxooBnBLx{VuZ>t{d=-gY_Bdf&Kq|K-H#Jsb1tt0A(^*U#vIweb24 zm$T0aG5dBlt}kKSvHn<9IKSDjv8BF>Y1jxWqt^O$d|ObO$JA3J0$R3 zp?`M7o=AxAgJ3`IeTW{~4hesM+@J_AY>4B1&Q2@o*YOQV=8FX_e0#*r@z-` z{=^$L2q|LRJIsTaM)3P&KRCWn9CxIQ$)1U?QRMuZ54^KKw0842Y2yISxOKe=e`U9uR(iG47Z!=&b6=r8 zJr4=sCpy^mdAkQQv&Wb~fhG`IVf47LFj0O}L~X)|I_shjv!Nf|!U$5T0yEj?-8ycM zkzNvM1O`syfF0(q7=5@!N|jKIPh)y|lcq|PUNIqcxKWP0KaE z39MZ~nEbnYgNEh!RY##9u^bE~bxXoM8jXMmc%1=P2qV&A)4>dZB8U=(DtNTTDN5fD zsbEqCKf7tP9t{;x!AXmE#4=W;ix?xd=gEk78J`10>85A-PhH5sG zdi3W6iNyip<<`;R`QFB$3G)wWb2Q_b8w)g>3(UGN?R$28=jV5XHo#J=-5z_gGHDi< zo%(xA!W-X8j|^XUSB^8WJ*NC*`}e;8m$I~$zi|G6hnSwYTWe9`Yhvct#LWK{V&->X zSYJuZyorB86*K4lSBaRHz~I#K@*%m3@kU{$yY)%GQPcMj&-{l`;{$Nm+)SO{z{U+EjQg8^+^F=o9p=9m(2@RxpdRd7MVDbCPJIqKeXWIR zv}8k7p>r1$@UV0Cda`zQxVbn=XLlT(+!*FCrbPPoVd$0=3gJwHgNP>+M*(jK&CbO< z3@rmjYHyZAH3_G^hgjrZ3U@nf#rJ?UQ~=Yyg=e2(n;@s51uvh6giDMNZ(M$=l|8IK zZ0Q**&N^l(0G-3az9`Y@K$jN|KESokP=AAcElEy39t+lEt2KY-(py`>47eS*+)7)C zkOZz&^H`*Lv(aropdYW#jc_|G&!{B#DkO);T!y4lIKx^^>?z9JZv`_tS4C`u@m@a) z8#UkP_8-tcfXeK&TT7YJN0`yc>M5o{{0tzcQaFg;?=Q^gk5 zcHXIXfKk_iWQ}%6OzgL(BSE?8D{Z&(ro~LQNE{_p9(>zD{5+|jux((puV#szM&?hu zALd5aO}G5n(K3Fau{gADy7j%nrtCtl7+-jfO6fyjXnU$74z~E8>zi%q%l@@FS;d{##j{ltkiuMjIrA>#`^U~EEr1nI4sNyL}91V zrK8d1bPSEI@6hP_HubLO4owMi9;pwA{ZeHWz1lV$uW!J3bgc3eXiZd?{|RZVMLDSa z65FbwHMqg?OEG9`Ncrv;MC&UdP0#+DIOc3f+u<&dNRHT7Y0CmuN9o%twapIv(cF-a zi^gLiE^-8Et~x_RaP+a4UheM)q>qO5QIVV)PWMDl?gh{wE9s*n(b0=tVk3PCc<@d! zcjF@F3c|C%|3$%94#S@WJ^{Gz;^J`;y%F@moE-lrz|n3`#Y0IkgAZ)XGq@-p6+Z=d zd<$iMk84T*{yV@=hyO!d=>hm1z(dJ11I5=;xSCEE@H2tG6L<<&@#lai=8;C=Z2@?j zR`wqRp7K}e9l%pL-v>UhoYlZn+Y%cqwVz5a0#7_Q_&6u^fr|ej@HC%{1D@g$p4#~d z;Hgh10Z-r1Rr;ra2Ll!}6?kG|Q0Y5>r}EG#LoE-(Gt8fXC%U_U$I>O!1OGAb3Gi0| z5AP7(g3PGgXQaXfyBevgVEb7bce2?-VtCAJq$%JAVmH&i3 z`^lgFhBJ(w|3oP91B0DsN@|h95L;fny0j8pn`=rd)~za{WH0)z7>KAWD_&ow=BS8( z7OjLe(B;l`MJvjRYt~hjDVE74)7;=4f=O#71&Mc5%0o3u?c7jaTwPuS2GTXF(~6uG z%kM2JDXSiCwp^uNS+=^Ys$#hmrKGa>-m`hn=Hiz}-yNA9dC2VH5= zs&zGBXQmzwWWc&GblqwSSDIVy;o_1tRcfD-G4o6IyTWfA*xS-)`L!}Wbk2Mu_slj%EC0A**sWAeEn>vE7a=fYJ-)O+8k-pi8Q)7L@AvYB5 zYRBBL2v-_(MHh}MdDI2){S6D3$DP{n$`F%Ao{GD8+^8Wm5|lBdq5>u?nfqT2xHuIx zX5fUVQcI<#zp~Pcx#-X5aUmCd(Xb~(ntq4={@-J-XSz{&>=oeq0kawa6A|xzK+2z_vH-Jc0I7WC3UmNczDoh|%P*8+)?z@aUx9+pSMYg&6kkwa zrVO)^0EwOl#4kTqhFMlXqPHl}B*QEtAa-IYXE8b`d{BWO$S~^|AeE~Z5TyA>Wti0k zs0F?akn%gAgtsc;`vEDvy$Wmw#B-Iu3lO|%DNTSRSFjThTgenJAWqRKjeywlr8EG> z0@eZYfFj^^fcFC?0G0z%zNLUvE{6=WmI6|~ixrp;NcrZ;Fe_KVXDBdThFMlXs%I1+ zrAIqaz^pzQ>U|1qR-mXrhXMr!@(Ki?_1hyCdyEM%j$RlWa z@ZYOBrqO85XwKq(7uU=gG&{K_{5Nu5{2%0e_&>{uT7#xddl3Jv+5`A+(eB6pF>N3I zk7|4I->vPzzo@Iz88m0KXK_EMJ*_2HFUS!LIeMN*ZlDQ}+z-f)D|3SE-=g?ce&jCl zLk@ulBzH{ltMkn-fus0>5`P2vwG7j%(BG=~-&6d*r}zjzrT9N5Khjs{r#Pj&jY>Ej zS1En9JkOIqp#0B}KOn!KkskwEb3n_bYxM{K~Bq<@I5HdX59btB3iu!~8UF1=2q; z%uh$t!0?H~{1g@#PV;J@pWeF#`WFqOXNsha&yZXI?M%Roe$g4|Jnm9k+aXB|yaO&> zv+DeTYAEgVn;6hu`q(!_fARharMU1!07Sq(55DD98=W<4aLBv*!`Jy(-)viZKHfLl zM4yj#b^H7C^jCQVyC}jH&v?v;8|2|w+M6P6WoXF0z%!9_0vhT(xu335NJctlD{lxG z>C^}nv?R|mBrk*ebXDF(mUF@X2y!g}`}3iqoF8|}{(C6o;t{4&Q06wK=v#Lz&cAuV zjk!fP-LW8N@y*{_P-Mdc1UEi)sv_^gOD=Urx^3F@SvFfb&ri3d0+(i^fK;1pMmlga z5F`=u!{lRB%~WgTbpQC}hhLkNN0y#jOoa^1aSV?Oj$Rq{20qXd_WU1g#Y#@3IB?(` zmK>%;+RsSo5#nm)W9o<)j?$Bo#QP+gGqHIP38?N$@-b>Ts6MJwiYR%9SLsUfCu+Hz z^sW<5i#6qP?n?3}rkKXmcH7gZ!U?Qg?3TQuiT?ZFfecBr- zAJ?%v4Uj)+QQDh`X^+zi|0trxKy=D*_5x88}eEXFLlhfKyS z^!_4}wIDyk3bTgatKt7F7-;2fG5UpGEoOfMF#wWDyecsOi!26EHzWp-eHk%;>_9Pq z&Mq|WgS`C8H7(I7i2+2C7(k>d2G9U8fVzAOU#(?f=*_xQDA#Ki2{$1gvG9*U-;G^5 zL1xAo{JN8I%T)RD%OhJip?Fr+0cZVKIi0uUv=#UvE(Pr3atX~fk zPGbEAaNvU7)obw4N6ojyaWEIv&GLx;ZgCtLqS_sMD1jJAVM(fQHw;?Eo@Y2+kGSO= z(y2BY)|YelCD*ToNhz?(w$<10WEKhqyD9@)1@)WCVTFo=O{=wFq-`4FT9u<8ONc#& z!bse*!o<0BGe!J7p~YZ1?lEryKepElZF8F(h8mb?vKXqsRw4a^PrDk^ zgM@!x!jPqu2mzK-!X-;7*)rSSiFGrx{yOD%hvp>pvD$JJ14{_wHuNTBh4DfMRzr9# znLh8UoQI|TghpWCG<{%u`<@faB$3O@WSDL5KHX|11`#o}U_#4Wim4t1qJ;5rrl$*z zVEvPSjtEc>iSxa$;GdmKKUD;MP z+3+0MK)J@6c8xXdU%{GIfU$Tb*0ctGox+;N{_nDWg1U`2YSP_~#p8|H>25x6ys;gi zV4CUX=5E_$&9shI(;rM7+3C|vw;l%KrfD60v9Fle#7mem>Dbtu_gKpXrc5RwkN?SR zXf)TTtT{CEX))(@=sTlLzE-wa$F{ z%0O-;ZFCMa8U@okX==YhT;vE63xto5a4P`m__zs>=6wnyr-swLirWgB1o-hTo#AoO zS%*zxn4bf0g?}zC9QkDS3gC&SkXSeFz=ikgL-;<0el2i;^k)=&!!W!Boki~weu|6o zp?v9u{6q!+n_>8D;3?fd;-a&qO1}hnicja}z`IYf{@h5KnZ(meLLgwv;dEJ;ViUAYd{H z(VR*SQw6z;!jonECBxH|a9V5OE{dNi*Fh49G;N2BFaI|F9%fSCI8V`Z2{ zb327o|4=x!1BC++%o6d3pWdNBL4mviDG)z>pG>d!DX>|Aq5>TX6corS5I~C0YUCmC zA`%PyK1<&T>3gU8zWYAKUq>4PxW-}O#4kYKL+j*V<_KV*KbXR`45PlE?x64hKYdT6 z@1^SdW?Dn(`=;t1!VP`DRQrY4ILS}#OO8m%ua27>+>>7&CqGld)p4;z@l$`0tHMR} z>bN+m`0uAcIMUNc;pwuMnWXqL75@&!FLfYr7R8^dgb#hH8Mc6({}81H4Cm_{Ii|W4 zj~Ghp_lN=VOgv(cG!>5=BCn@c`w8rl%c%6(Oa1sY(xhLFMQz%MMYv=DRvlSIT-v4L zAz=8bLEpsAYmighot9$cla7!JBjD?t^bt+!$#43-EG>0rMuzmkY}og*bu|^0)#nw; zjr6@t`q0A51Bjl7T0D=Ja*%?R9FJ#Ea*AL5UPh4I)qXEqN*`e0C_T!S2LpvPwlDf# zc6t484kaC$-^ht3`CKOZF8;sL_cunVm%3*jo&p}b3mp0qpPQlGR>2k(Exxf(og{!O zSIT$065fFF1-ju)ex>huzf;n4%$8I6_hIP;rcL)K->Onl(yIg%73JsOdE0ravC0HO z=Mr*r=F9L>|447mDrfQXnxb{9p}V&f=?zUmQk)x=n94Ze(VlcGB2PO1z+F(~>wu8k z8Wjupo+m7jzt<5l#q+{X;tqogL5~CjzvoeWy6C($LAeL`MvlJKsXD`UL${d*-}2t( z*nLQ3rvnlgf%?`|x^p?q;eL+Uhp{K=L?gXuEuQ!@101tGD3jSf@x%LfFl^9k-~-!! zQJT=H*5WBTgIaqhA|74ySmXOHEHS@F{J{LE3{<{z9DDflZ?jLI{+8zHukPcX{;Gr7 z{wb%~cN*pV4COdCkG?@NJE1S_K+7m0<3U`>tnrqU^MqM|lLio8t!GXpoIAI8063$L zS!hf!-p&AibzctB&3^jxZ`+?nKHDk3%jNkQ@;t5NNxI<%=E!+hYmm2|Is725Nfp%@ zA-F2p;9EbOBh2~;dG1fh4{l`5lRiLM?qP#(xdnN@kFa|ZZV7%5Y21T&pK`(bCVhSG zS5!tS`+EpCvOyt6HaO%`Wu?BL`uC&nj8Q^HV4V}R%&FplIy0y<=%qTcXe%mz5ToP~ z#bg-2YrI{JLv4@^8VIgSG?S3FS{9>1n~n6TO-G`gh`LW?jkiK3?e-wh2hytJsF{=X z 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�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 z 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 YtG*dJe-k!|f+-EmsYFaCz_1Aa3zgo}2mk;8 diff --git a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/bin/libmbedcrypto-armv7.a b/client/3rd/ShadowSocks/ShadowSocks/mbedtls/bin/libmbedcrypto-armv7.a deleted file mode 100644 index 17f1e2c6dbfde63e72acc1e9cf3c471199076033..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 406936 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

  • 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%0DZsU;no9z*B$z?KS=T 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 diff --git a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/bin/libmbedx509-armv7.a b/client/3rd/ShadowSocks/ShadowSocks/mbedtls/bin/libmbedx509-armv7.a deleted file mode 100644 index c13ddd6656ca0f94604038cb3db4bc42fd365de8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 81040 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

    `w|l%s<7;#@eYs*=FQ6wA2AF1!4)yz}Xhc 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½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%0AVtB>&qXWjcE$L8M$=l8S-A~Ao&3G?GZ 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 CKsmPn diff --git a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/bin/libmbedx509-x86_64.a b/client/3rd/ShadowSocks/ShadowSocks/mbedtls/bin/libmbedx509-x86_64.a deleted file mode 100644 index f6b59773e4694c30b79e217eae89c008dcc40327..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 110080 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 diff --git a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/.gitignore b/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/.gitignore deleted file mode 100644 index bf67d02e..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -Makefile -*.sln -*.vcxproj -mbedtls/check_config diff --git a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/CMakeLists.txt b/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/CMakeLists.txt deleted file mode 100644 index 985a3530..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/CMakeLists.txt +++ /dev/null @@ -1,11 +0,0 @@ -option(INSTALL_MBEDTLS_HEADERS "Install mbed TLS headers." ON) - -if(INSTALL_MBEDTLS_HEADERS) - - file(GLOB headers "mbedtls/*.h") - - install(FILES ${headers} - DESTINATION include/mbedtls - PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ WORLD_READ) - -endif(INSTALL_MBEDTLS_HEADERS) diff --git a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/LICENSE b/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/LICENSE deleted file mode 100644 index 546a8e63..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/LICENSE +++ /dev/null @@ -1,2 +0,0 @@ -Unless specifically indicated otherwise in a file, files are licensed -under the Apache 2.0 license, as can be found in: apache-2.0.txt diff --git a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/aes.h b/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/aes.h deleted file mode 100644 index a36e825a..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/aes.h +++ /dev/null @@ -1,297 +0,0 @@ -/** - * \file aes.h - * - * \brief AES block cipher - * - * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * This file is part of mbed TLS (https://tls.mbed.org) - */ -#ifndef MBEDTLS_AES_H -#define MBEDTLS_AES_H - -#if !defined(MBEDTLS_CONFIG_FILE) -#include "config.h" -#else -#include MBEDTLS_CONFIG_FILE -#endif - -#include -#include - -/* padlock.c and aesni.c rely on these values! */ -#define MBEDTLS_AES_ENCRYPT 1 -#define MBEDTLS_AES_DECRYPT 0 - -#define MBEDTLS_ERR_AES_INVALID_KEY_LENGTH -0x0020 /**< Invalid key length. */ -#define MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH -0x0022 /**< Invalid data input length. */ - -#if !defined(MBEDTLS_AES_ALT) -// Regular implementation -// - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * \brief AES context structure - * - * \note buf is able to hold 32 extra bytes, which can be used: - * - for alignment purposes if VIA padlock is used, and/or - * - to simplify key expansion in the 256-bit case by - * generating an extra round key - */ -typedef struct -{ - int nr; /*!< number of rounds */ - uint32_t *rk; /*!< AES round keys */ - uint32_t buf[68]; /*!< unaligned data */ -} -mbedtls_aes_context; - -/** - * \brief Initialize AES context - * - * \param ctx AES context to be initialized - */ -void mbedtls_aes_init( mbedtls_aes_context *ctx ); - -/** - * \brief Clear AES context - * - * \param ctx AES context to be cleared - */ -void mbedtls_aes_free( mbedtls_aes_context *ctx ); - -/** - * \brief AES key schedule (encryption) - * - * \param ctx AES context to be initialized - * \param key encryption key - * \param keybits must be 128, 192 or 256 - * - * \return 0 if successful, or MBEDTLS_ERR_AES_INVALID_KEY_LENGTH - */ -int mbedtls_aes_setkey_enc( mbedtls_aes_context *ctx, const unsigned char *key, - unsigned int keybits ); - -/** - * \brief AES key schedule (decryption) - * - * \param ctx AES context to be initialized - * \param key decryption key - * \param keybits must be 128, 192 or 256 - * - * \return 0 if successful, or MBEDTLS_ERR_AES_INVALID_KEY_LENGTH - */ -int mbedtls_aes_setkey_dec( mbedtls_aes_context *ctx, const unsigned char *key, - unsigned int keybits ); - -/** - * \brief AES-ECB block encryption/decryption - * - * \param ctx AES context - * \param mode MBEDTLS_AES_ENCRYPT or MBEDTLS_AES_DECRYPT - * \param input 16-byte input block - * \param output 16-byte output block - * - * \return 0 if successful - */ -int mbedtls_aes_crypt_ecb( mbedtls_aes_context *ctx, - int mode, - const unsigned char input[16], - unsigned char output[16] ); - -#if defined(MBEDTLS_CIPHER_MODE_CBC) -/** - * \brief AES-CBC buffer encryption/decryption - * Length should be a multiple of the block - * size (16 bytes) - * - * \note Upon exit, the content of the IV is updated so that you can - * call the function same function again on the following - * block(s) of data and get the same result as if it was - * encrypted in one call. This allows a "streaming" usage. - * If on the other hand you need to retain the contents of the - * IV, you should either save it manually or use the cipher - * module instead. - * - * \param ctx AES context - * \param mode MBEDTLS_AES_ENCRYPT or MBEDTLS_AES_DECRYPT - * \param length length of the input data - * \param iv initialization vector (updated after use) - * \param input buffer holding the input data - * \param output buffer holding the output data - * - * \return 0 if successful, or MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH - */ -int mbedtls_aes_crypt_cbc( mbedtls_aes_context *ctx, - int mode, - size_t length, - unsigned char iv[16], - const unsigned char *input, - unsigned char *output ); -#endif /* MBEDTLS_CIPHER_MODE_CBC */ - -#if defined(MBEDTLS_CIPHER_MODE_CFB) -/** - * \brief AES-CFB128 buffer encryption/decryption. - * - * Note: Due to the nature of CFB you should use the same key schedule for - * both encryption and decryption. So a context initialized with - * mbedtls_aes_setkey_enc() for both MBEDTLS_AES_ENCRYPT and MBEDTLS_AES_DECRYPT. - * - * \note Upon exit, the content of the IV is updated so that you can - * call the function same function again on the following - * block(s) of data and get the same result as if it was - * encrypted in one call. This allows a "streaming" usage. - * If on the other hand you need to retain the contents of the - * IV, you should either save it manually or use the cipher - * module instead. - * - * \param ctx AES context - * \param mode MBEDTLS_AES_ENCRYPT or MBEDTLS_AES_DECRYPT - * \param length length of the input data - * \param iv_off offset in IV (updated after use) - * \param iv initialization vector (updated after use) - * \param input buffer holding the input data - * \param output buffer holding the output data - * - * \return 0 if successful - */ -int mbedtls_aes_crypt_cfb128( mbedtls_aes_context *ctx, - int mode, - size_t length, - size_t *iv_off, - unsigned char iv[16], - const unsigned char *input, - unsigned char *output ); - -/** - * \brief AES-CFB8 buffer encryption/decryption. - * - * Note: Due to the nature of CFB you should use the same key schedule for - * both encryption and decryption. So a context initialized with - * mbedtls_aes_setkey_enc() for both MBEDTLS_AES_ENCRYPT and MBEDTLS_AES_DECRYPT. - * - * \note Upon exit, the content of the IV is updated so that you can - * call the function same function again on the following - * block(s) of data and get the same result as if it was - * encrypted in one call. This allows a "streaming" usage. - * If on the other hand you need to retain the contents of the - * IV, you should either save it manually or use the cipher - * module instead. - * - * \param ctx AES context - * \param mode MBEDTLS_AES_ENCRYPT or MBEDTLS_AES_DECRYPT - * \param length length of the input data - * \param iv initialization vector (updated after use) - * \param input buffer holding the input data - * \param output buffer holding the output data - * - * \return 0 if successful - */ -int mbedtls_aes_crypt_cfb8( mbedtls_aes_context *ctx, - int mode, - size_t length, - unsigned char iv[16], - const unsigned char *input, - unsigned char *output ); -#endif /*MBEDTLS_CIPHER_MODE_CFB */ - -#if defined(MBEDTLS_CIPHER_MODE_CTR) -/** - * \brief AES-CTR buffer encryption/decryption - * - * Warning: You have to keep the maximum use of your counter in mind! - * - * Note: Due to the nature of CTR you should use the same key schedule for - * both encryption and decryption. So a context initialized with - * mbedtls_aes_setkey_enc() for both MBEDTLS_AES_ENCRYPT and MBEDTLS_AES_DECRYPT. - * - * \param ctx AES context - * \param length The length of the data - * \param nc_off The offset in the current stream_block (for resuming - * within current cipher stream). The offset pointer to - * should be 0 at the start of a stream. - * \param nonce_counter The 128-bit nonce and counter. - * \param stream_block The saved stream-block for resuming. Is overwritten - * by the function. - * \param input The input data stream - * \param output The output data stream - * - * \return 0 if successful - */ -int mbedtls_aes_crypt_ctr( mbedtls_aes_context *ctx, - size_t length, - size_t *nc_off, - unsigned char nonce_counter[16], - unsigned char stream_block[16], - const unsigned char *input, - unsigned char *output ); -#endif /* MBEDTLS_CIPHER_MODE_CTR */ - -/** - * \brief Internal AES block encryption function - * (Only exposed to allow overriding it, - * see MBEDTLS_AES_ENCRYPT_ALT) - * - * \param ctx AES context - * \param input Plaintext block - * \param output Output (ciphertext) block - */ -void mbedtls_aes_encrypt( mbedtls_aes_context *ctx, - const unsigned char input[16], - unsigned char output[16] ); - -/** - * \brief Internal AES block decryption function - * (Only exposed to allow overriding it, - * see MBEDTLS_AES_DECRYPT_ALT) - * - * \param ctx AES context - * \param input Ciphertext block - * \param output Output (plaintext) block - */ -void mbedtls_aes_decrypt( mbedtls_aes_context *ctx, - const unsigned char input[16], - unsigned char output[16] ); - -#ifdef __cplusplus -} -#endif - -#else /* MBEDTLS_AES_ALT */ -#include "aes_alt.h" -#endif /* MBEDTLS_AES_ALT */ - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * \brief Checkup routine - * - * \return 0 if successful, or 1 if the test failed - */ -int mbedtls_aes_self_test( int verbose ); - -#ifdef __cplusplus -} -#endif - -#endif /* aes.h */ diff --git a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/aesni.h b/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/aesni.h deleted file mode 100644 index b1b7f1cd..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/aesni.h +++ /dev/null @@ -1,111 +0,0 @@ -/** - * \file aesni.h - * - * \brief AES-NI for hardware AES acceleration on some Intel processors - * - * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * This file is part of mbed TLS (https://tls.mbed.org) - */ -#ifndef MBEDTLS_AESNI_H -#define MBEDTLS_AESNI_H - -#include "aes.h" - -#define MBEDTLS_AESNI_AES 0x02000000u -#define MBEDTLS_AESNI_CLMUL 0x00000002u - -#if defined(MBEDTLS_HAVE_ASM) && defined(__GNUC__) && \ - ( defined(__amd64__) || defined(__x86_64__) ) && \ - ! defined(MBEDTLS_HAVE_X86_64) -#define MBEDTLS_HAVE_X86_64 -#endif - -#if defined(MBEDTLS_HAVE_X86_64) - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * \brief AES-NI features detection routine - * - * \param what The feature to detect - * (MBEDTLS_AESNI_AES or MBEDTLS_AESNI_CLMUL) - * - * \return 1 if CPU has support for the feature, 0 otherwise - */ -int mbedtls_aesni_has_support( unsigned int what ); - -/** - * \brief AES-NI AES-ECB block en(de)cryption - * - * \param ctx AES context - * \param mode MBEDTLS_AES_ENCRYPT or MBEDTLS_AES_DECRYPT - * \param input 16-byte input block - * \param output 16-byte output block - * - * \return 0 on success (cannot fail) - */ -int mbedtls_aesni_crypt_ecb( mbedtls_aes_context *ctx, - int mode, - const unsigned char input[16], - unsigned char output[16] ); - -/** - * \brief GCM multiplication: c = a * b in GF(2^128) - * - * \param c Result - * \param a First operand - * \param b Second operand - * - * \note Both operands and result are bit strings interpreted as - * elements of GF(2^128) as per the GCM spec. - */ -void mbedtls_aesni_gcm_mult( unsigned char c[16], - const unsigned char a[16], - const unsigned char b[16] ); - -/** - * \brief Compute decryption round keys from encryption round keys - * - * \param invkey Round keys for the equivalent inverse cipher - * \param fwdkey Original round keys (for encryption) - * \param nr Number of rounds (that is, number of round keys minus one) - */ -void mbedtls_aesni_inverse_key( unsigned char *invkey, - const unsigned char *fwdkey, int nr ); - -/** - * \brief Perform key expansion (for encryption) - * - * \param rk Destination buffer where the round keys are written - * \param key Encryption key - * \param bits Key size in bits (must be 128, 192 or 256) - * - * \return 0 if successful, or MBEDTLS_ERR_AES_INVALID_KEY_LENGTH - */ -int mbedtls_aesni_setkey_enc( unsigned char *rk, - const unsigned char *key, - size_t bits ); - -#ifdef __cplusplus -} -#endif - -#endif /* MBEDTLS_HAVE_X86_64 */ - -#endif /* MBEDTLS_AESNI_H */ diff --git a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/arc4.h b/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/arc4.h deleted file mode 100644 index 5fc5395a..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/arc4.h +++ /dev/null @@ -1,113 +0,0 @@ -/** - * \file arc4.h - * - * \brief The ARCFOUR stream cipher - * - * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * This file is part of mbed TLS (https://tls.mbed.org) - */ -#ifndef MBEDTLS_ARC4_H -#define MBEDTLS_ARC4_H - -#if !defined(MBEDTLS_CONFIG_FILE) -#include "config.h" -#else -#include MBEDTLS_CONFIG_FILE -#endif - -#include - -#if !defined(MBEDTLS_ARC4_ALT) -// Regular implementation -// - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * \brief ARC4 context structure - */ -typedef struct -{ - int x; /*!< permutation index */ - int y; /*!< permutation index */ - unsigned char m[256]; /*!< permutation table */ -} -mbedtls_arc4_context; - -/** - * \brief Initialize ARC4 context - * - * \param ctx ARC4 context to be initialized - */ -void mbedtls_arc4_init( mbedtls_arc4_context *ctx ); - -/** - * \brief Clear ARC4 context - * - * \param ctx ARC4 context to be cleared - */ -void mbedtls_arc4_free( mbedtls_arc4_context *ctx ); - -/** - * \brief ARC4 key schedule - * - * \param ctx ARC4 context to be setup - * \param key the secret key - * \param keylen length of the key, in bytes - */ -void mbedtls_arc4_setup( mbedtls_arc4_context *ctx, const unsigned char *key, - unsigned int keylen ); - -/** - * \brief ARC4 cipher function - * - * \param ctx ARC4 context - * \param length length of the input data - * \param input buffer holding the input data - * \param output buffer for the output data - * - * \return 0 if successful - */ -int mbedtls_arc4_crypt( mbedtls_arc4_context *ctx, size_t length, const unsigned char *input, - unsigned char *output ); - -#ifdef __cplusplus -} -#endif - -#else /* MBEDTLS_ARC4_ALT */ -#include "arc4_alt.h" -#endif /* MBEDTLS_ARC4_ALT */ - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * \brief Checkup routine - * - * \return 0 if successful, or 1 if the test failed - */ -int mbedtls_arc4_self_test( int verbose ); - -#ifdef __cplusplus -} -#endif - -#endif /* arc4.h */ diff --git a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/asn1.h b/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/asn1.h deleted file mode 100644 index 082832c8..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/asn1.h +++ /dev/null @@ -1,342 +0,0 @@ -/** - * \file asn1.h - * - * \brief Generic ASN.1 parsing - * - * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * This file is part of mbed TLS (https://tls.mbed.org) - */ -#ifndef MBEDTLS_ASN1_H -#define MBEDTLS_ASN1_H - -#if !defined(MBEDTLS_CONFIG_FILE) -#include "config.h" -#else -#include MBEDTLS_CONFIG_FILE -#endif - -#include - -#if defined(MBEDTLS_BIGNUM_C) -#include "bignum.h" -#endif - -/** - * \addtogroup asn1_module - * \{ - */ - -/** - * \name ASN1 Error codes - * These error codes are OR'ed to X509 error codes for - * higher error granularity. - * ASN1 is a standard to specify data structures. - * \{ - */ -#define MBEDTLS_ERR_ASN1_OUT_OF_DATA -0x0060 /**< Out of data when parsing an ASN1 data structure. */ -#define MBEDTLS_ERR_ASN1_UNEXPECTED_TAG -0x0062 /**< ASN1 tag was of an unexpected value. */ -#define MBEDTLS_ERR_ASN1_INVALID_LENGTH -0x0064 /**< Error when trying to determine the length or invalid length. */ -#define MBEDTLS_ERR_ASN1_LENGTH_MISMATCH -0x0066 /**< Actual length differs from expected length. */ -#define MBEDTLS_ERR_ASN1_INVALID_DATA -0x0068 /**< Data is invalid. (not used) */ -#define MBEDTLS_ERR_ASN1_ALLOC_FAILED -0x006A /**< Memory allocation failed */ -#define MBEDTLS_ERR_ASN1_BUF_TOO_SMALL -0x006C /**< Buffer too small when writing ASN.1 data structure. */ - -/* \} name */ - -/** - * \name DER constants - * These constants comply with DER encoded the ANS1 type tags. - * DER encoding uses hexadecimal representation. - * An example DER sequence is:\n - * - 0x02 -- tag indicating INTEGER - * - 0x01 -- length in octets - * - 0x05 -- value - * Such sequences are typically read into \c ::mbedtls_x509_buf. - * \{ - */ -#define MBEDTLS_ASN1_BOOLEAN 0x01 -#define MBEDTLS_ASN1_INTEGER 0x02 -#define MBEDTLS_ASN1_BIT_STRING 0x03 -#define MBEDTLS_ASN1_OCTET_STRING 0x04 -#define MBEDTLS_ASN1_NULL 0x05 -#define MBEDTLS_ASN1_OID 0x06 -#define MBEDTLS_ASN1_UTF8_STRING 0x0C -#define MBEDTLS_ASN1_SEQUENCE 0x10 -#define MBEDTLS_ASN1_SET 0x11 -#define MBEDTLS_ASN1_PRINTABLE_STRING 0x13 -#define MBEDTLS_ASN1_T61_STRING 0x14 -#define MBEDTLS_ASN1_IA5_STRING 0x16 -#define MBEDTLS_ASN1_UTC_TIME 0x17 -#define MBEDTLS_ASN1_GENERALIZED_TIME 0x18 -#define MBEDTLS_ASN1_UNIVERSAL_STRING 0x1C -#define MBEDTLS_ASN1_BMP_STRING 0x1E -#define MBEDTLS_ASN1_PRIMITIVE 0x00 -#define MBEDTLS_ASN1_CONSTRUCTED 0x20 -#define MBEDTLS_ASN1_CONTEXT_SPECIFIC 0x80 -/* \} name */ -/* \} addtogroup asn1_module */ - -/** Returns the size of the binary string, without the trailing \\0 */ -#define MBEDTLS_OID_SIZE(x) (sizeof(x) - 1) - -/** - * Compares an mbedtls_asn1_buf structure to a reference OID. - * - * Only works for 'defined' oid_str values (MBEDTLS_OID_HMAC_SHA1), you cannot use a - * 'unsigned char *oid' here! - */ -#define MBEDTLS_OID_CMP(oid_str, oid_buf) \ - ( ( MBEDTLS_OID_SIZE(oid_str) != (oid_buf)->len ) || \ - memcmp( (oid_str), (oid_buf)->p, (oid_buf)->len) != 0 ) - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * \name Functions to parse ASN.1 data structures - * \{ - */ - -/** - * Type-length-value structure that allows for ASN1 using DER. - */ -typedef struct mbedtls_asn1_buf -{ - int tag; /**< ASN1 type, e.g. MBEDTLS_ASN1_UTF8_STRING. */ - size_t len; /**< ASN1 length, in octets. */ - unsigned char *p; /**< ASN1 data, e.g. in ASCII. */ -} -mbedtls_asn1_buf; - -/** - * Container for ASN1 bit strings. - */ -typedef struct mbedtls_asn1_bitstring -{ - size_t len; /**< ASN1 length, in octets. */ - unsigned char unused_bits; /**< Number of unused bits at the end of the string */ - unsigned char *p; /**< Raw ASN1 data for the bit string */ -} -mbedtls_asn1_bitstring; - -/** - * Container for a sequence of ASN.1 items - */ -typedef struct mbedtls_asn1_sequence -{ - mbedtls_asn1_buf buf; /**< Buffer containing the given ASN.1 item. */ - struct mbedtls_asn1_sequence *next; /**< The next entry in the sequence. */ -} -mbedtls_asn1_sequence; - -/** - * Container for a sequence or list of 'named' ASN.1 data items - */ -typedef struct mbedtls_asn1_named_data -{ - mbedtls_asn1_buf oid; /**< The object identifier. */ - mbedtls_asn1_buf val; /**< The named value. */ - struct mbedtls_asn1_named_data *next; /**< The next entry in the sequence. */ - unsigned char next_merged; /**< Merge next item into the current one? */ -} -mbedtls_asn1_named_data; - -/** - * \brief Get the length of an ASN.1 element. - * Updates the pointer to immediately behind the length. - * - * \param p The position in the ASN.1 data - * \param end End of data - * \param len The variable that will receive the value - * - * \return 0 if successful, MBEDTLS_ERR_ASN1_OUT_OF_DATA on reaching - * end of data, MBEDTLS_ERR_ASN1_INVALID_LENGTH if length is - * unparseable. - */ -int mbedtls_asn1_get_len( unsigned char **p, - const unsigned char *end, - size_t *len ); - -/** - * \brief Get the tag and length of the tag. Check for the requested tag. - * Updates the pointer to immediately behind the tag and length. - * - * \param p The position in the ASN.1 data - * \param end End of data - * \param len The variable that will receive the length - * \param tag The expected tag - * - * \return 0 if successful, MBEDTLS_ERR_ASN1_UNEXPECTED_TAG if tag did - * not match requested tag, or another specific ASN.1 error code. - */ -int mbedtls_asn1_get_tag( unsigned char **p, - const unsigned char *end, - size_t *len, int tag ); - -/** - * \brief Retrieve a boolean ASN.1 tag and its value. - * Updates the pointer to immediately behind the full tag. - * - * \param p The position in the ASN.1 data - * \param end End of data - * \param val The variable that will receive the value - * - * \return 0 if successful or a specific ASN.1 error code. - */ -int mbedtls_asn1_get_bool( unsigned char **p, - const unsigned char *end, - int *val ); - -/** - * \brief Retrieve an integer ASN.1 tag and its value. - * Updates the pointer to immediately behind the full tag. - * - * \param p The position in the ASN.1 data - * \param end End of data - * \param val The variable that will receive the value - * - * \return 0 if successful or a specific ASN.1 error code. - */ -int mbedtls_asn1_get_int( unsigned char **p, - const unsigned char *end, - int *val ); - -/** - * \brief Retrieve a bitstring ASN.1 tag and its value. - * Updates the pointer to immediately behind the full tag. - * - * \param p The position in the ASN.1 data - * \param end End of data - * \param bs The variable that will receive the value - * - * \return 0 if successful or a specific ASN.1 error code. - */ -int mbedtls_asn1_get_bitstring( unsigned char **p, const unsigned char *end, - mbedtls_asn1_bitstring *bs); - -/** - * \brief Retrieve a bitstring ASN.1 tag without unused bits and its - * value. - * Updates the pointer to the beginning of the bit/octet string. - * - * \param p The position in the ASN.1 data - * \param end End of data - * \param len Length of the actual bit/octect string in bytes - * - * \return 0 if successful or a specific ASN.1 error code. - */ -int mbedtls_asn1_get_bitstring_null( unsigned char **p, const unsigned char *end, - size_t *len ); - -/** - * \brief Parses and splits an ASN.1 "SEQUENCE OF " - * Updated the pointer to immediately behind the full sequence tag. - * - * \param p The position in the ASN.1 data - * \param end End of data - * \param cur First variable in the chain to fill - * \param tag Type of sequence - * - * \return 0 if successful or a specific ASN.1 error code. - */ -int mbedtls_asn1_get_sequence_of( unsigned char **p, - const unsigned char *end, - mbedtls_asn1_sequence *cur, - int tag); - -#if defined(MBEDTLS_BIGNUM_C) -/** - * \brief Retrieve a MPI value from an integer ASN.1 tag. - * Updates the pointer to immediately behind the full tag. - * - * \param p The position in the ASN.1 data - * \param end End of data - * \param X The MPI that will receive the value - * - * \return 0 if successful or a specific ASN.1 or MPI error code. - */ -int mbedtls_asn1_get_mpi( unsigned char **p, - const unsigned char *end, - mbedtls_mpi *X ); -#endif /* MBEDTLS_BIGNUM_C */ - -/** - * \brief Retrieve an AlgorithmIdentifier ASN.1 sequence. - * Updates the pointer to immediately behind the full - * AlgorithmIdentifier. - * - * \param p The position in the ASN.1 data - * \param end End of data - * \param alg The buffer to receive the OID - * \param params The buffer to receive the params (if any) - * - * \return 0 if successful or a specific ASN.1 or MPI error code. - */ -int mbedtls_asn1_get_alg( unsigned char **p, - const unsigned char *end, - mbedtls_asn1_buf *alg, mbedtls_asn1_buf *params ); - -/** - * \brief Retrieve an AlgorithmIdentifier ASN.1 sequence with NULL or no - * params. - * Updates the pointer to immediately behind the full - * AlgorithmIdentifier. - * - * \param p The position in the ASN.1 data - * \param end End of data - * \param alg The buffer to receive the OID - * - * \return 0 if successful or a specific ASN.1 or MPI error code. - */ -int mbedtls_asn1_get_alg_null( unsigned char **p, - const unsigned char *end, - mbedtls_asn1_buf *alg ); - -/** - * \brief Find a specific named_data entry in a sequence or list based on - * the OID. - * - * \param list The list to seek through - * \param oid The OID to look for - * \param len Size of the OID - * - * \return NULL if not found, or a pointer to the existing entry. - */ -mbedtls_asn1_named_data *mbedtls_asn1_find_named_data( mbedtls_asn1_named_data *list, - const char *oid, size_t len ); - -/** - * \brief Free a mbedtls_asn1_named_data entry - * - * \param entry The named data entry to free - */ -void mbedtls_asn1_free_named_data( mbedtls_asn1_named_data *entry ); - -/** - * \brief Free all entries in a mbedtls_asn1_named_data list - * Head will be set to NULL - * - * \param head Pointer to the head of the list of named data entries to free - */ -void mbedtls_asn1_free_named_data_list( mbedtls_asn1_named_data **head ); - -#ifdef __cplusplus -} -#endif - -#endif /* asn1.h */ diff --git a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/asn1write.h b/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/asn1write.h deleted file mode 100644 index 73ff32b6..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/asn1write.h +++ /dev/null @@ -1,239 +0,0 @@ -/** - * \file asn1write.h - * - * \brief ASN.1 buffer writing functionality - * - * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * This file is part of mbed TLS (https://tls.mbed.org) - */ -#ifndef MBEDTLS_ASN1_WRITE_H -#define MBEDTLS_ASN1_WRITE_H - -#include "asn1.h" - -#define MBEDTLS_ASN1_CHK_ADD(g, f) do { if( ( ret = f ) < 0 ) return( ret ); else \ - g += ret; } while( 0 ) - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * \brief Write a length field in ASN.1 format - * Note: function works backwards in data buffer - * - * \param p reference to current position pointer - * \param start start of the buffer (for bounds-checking) - * \param len the length to write - * - * \return the length written or a negative error code - */ -int mbedtls_asn1_write_len( unsigned char **p, unsigned char *start, size_t len ); - -/** - * \brief Write a ASN.1 tag in ASN.1 format - * Note: function works backwards in data buffer - * - * \param p reference to current position pointer - * \param start start of the buffer (for bounds-checking) - * \param tag the tag to write - * - * \return the length written or a negative error code - */ -int mbedtls_asn1_write_tag( unsigned char **p, unsigned char *start, - unsigned char tag ); - -/** - * \brief Write raw buffer data - * Note: function works backwards in data buffer - * - * \param p reference to current position pointer - * \param start start of the buffer (for bounds-checking) - * \param buf data buffer to write - * \param size length of the data buffer - * - * \return the length written or a negative error code - */ -int mbedtls_asn1_write_raw_buffer( unsigned char **p, unsigned char *start, - const unsigned char *buf, size_t size ); - -#if defined(MBEDTLS_BIGNUM_C) -/** - * \brief Write a big number (MBEDTLS_ASN1_INTEGER) in ASN.1 format - * Note: function works backwards in data buffer - * - * \param p reference to current position pointer - * \param start start of the buffer (for bounds-checking) - * \param X the MPI to write - * - * \return the length written or a negative error code - */ -int mbedtls_asn1_write_mpi( unsigned char **p, unsigned char *start, const mbedtls_mpi *X ); -#endif /* MBEDTLS_BIGNUM_C */ - -/** - * \brief Write a NULL tag (MBEDTLS_ASN1_NULL) with zero data in ASN.1 format - * Note: function works backwards in data buffer - * - * \param p reference to current position pointer - * \param start start of the buffer (for bounds-checking) - * - * \return the length written or a negative error code - */ -int mbedtls_asn1_write_null( unsigned char **p, unsigned char *start ); - -/** - * \brief Write an OID tag (MBEDTLS_ASN1_OID) and data in ASN.1 format - * Note: function works backwards in data buffer - * - * \param p reference to current position pointer - * \param start start of the buffer (for bounds-checking) - * \param oid the OID to write - * \param oid_len length of the OID - * - * \return the length written or a negative error code - */ -int mbedtls_asn1_write_oid( unsigned char **p, unsigned char *start, - const char *oid, size_t oid_len ); - -/** - * \brief Write an AlgorithmIdentifier sequence in ASN.1 format - * Note: function works backwards in data buffer - * - * \param p reference to current position pointer - * \param start start of the buffer (for bounds-checking) - * \param oid the OID of the algorithm - * \param oid_len length of the OID - * \param par_len length of parameters, which must be already written. - * If 0, NULL parameters are added - * - * \return the length written or a negative error code - */ -int mbedtls_asn1_write_algorithm_identifier( unsigned char **p, unsigned char *start, - const char *oid, size_t oid_len, - size_t par_len ); - -/** - * \brief Write a boolean tag (MBEDTLS_ASN1_BOOLEAN) and value in ASN.1 format - * Note: function works backwards in data buffer - * - * \param p reference to current position pointer - * \param start start of the buffer (for bounds-checking) - * \param boolean 0 or 1 - * - * \return the length written or a negative error code - */ -int mbedtls_asn1_write_bool( unsigned char **p, unsigned char *start, int boolean ); - -/** - * \brief Write an int tag (MBEDTLS_ASN1_INTEGER) and value in ASN.1 format - * Note: function works backwards in data buffer - * - * \param p reference to current position pointer - * \param start start of the buffer (for bounds-checking) - * \param val the integer value - * - * \return the length written or a negative error code - */ -int mbedtls_asn1_write_int( unsigned char **p, unsigned char *start, int val ); - -/** - * \brief Write a printable string tag (MBEDTLS_ASN1_PRINTABLE_STRING) and - * value in ASN.1 format - * Note: function works backwards in data buffer - * - * \param p reference to current position pointer - * \param start start of the buffer (for bounds-checking) - * \param text the text to write - * \param text_len length of the text - * - * \return the length written or a negative error code - */ -int mbedtls_asn1_write_printable_string( unsigned char **p, unsigned char *start, - const char *text, size_t text_len ); - -/** - * \brief Write an IA5 string tag (MBEDTLS_ASN1_IA5_STRING) and - * value in ASN.1 format - * Note: function works backwards in data buffer - * - * \param p reference to current position pointer - * \param start start of the buffer (for bounds-checking) - * \param text the text to write - * \param text_len length of the text - * - * \return the length written or a negative error code - */ -int mbedtls_asn1_write_ia5_string( unsigned char **p, unsigned char *start, - const char *text, size_t text_len ); - -/** - * \brief Write a bitstring tag (MBEDTLS_ASN1_BIT_STRING) and - * value in ASN.1 format - * Note: function works backwards in data buffer - * - * \param p reference to current position pointer - * \param start start of the buffer (for bounds-checking) - * \param buf the bitstring - * \param bits the total number of bits in the bitstring - * - * \return the length written or a negative error code - */ -int mbedtls_asn1_write_bitstring( unsigned char **p, unsigned char *start, - const unsigned char *buf, size_t bits ); - -/** - * \brief Write an octet string tag (MBEDTLS_ASN1_OCTET_STRING) and - * value in ASN.1 format - * Note: function works backwards in data buffer - * - * \param p reference to current position pointer - * \param start start of the buffer (for bounds-checking) - * \param buf data buffer to write - * \param size length of the data buffer - * - * \return the length written or a negative error code - */ -int mbedtls_asn1_write_octet_string( unsigned char **p, unsigned char *start, - const unsigned char *buf, size_t size ); - -/** - * \brief Create or find a specific named_data entry for writing in a - * sequence or list based on the OID. If not already in there, - * a new entry is added to the head of the list. - * Warning: Destructive behaviour for the val data! - * - * \param list Pointer to the location of the head of the list to seek - * through (will be updated in case of a new entry) - * \param oid The OID to look for - * \param oid_len Size of the OID - * \param val Data to store (can be NULL if you want to fill it by hand) - * \param val_len Minimum length of the data buffer needed - * - * \return NULL if if there was a memory allocation error, or a pointer - * to the new / existing entry. - */ -mbedtls_asn1_named_data *mbedtls_asn1_store_named_data( mbedtls_asn1_named_data **list, - const char *oid, size_t oid_len, - const unsigned char *val, - size_t val_len ); - -#ifdef __cplusplus -} -#endif - -#endif /* MBEDTLS_ASN1_WRITE_H */ diff --git a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/base64.h b/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/base64.h deleted file mode 100644 index 352c652d..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/base64.h +++ /dev/null @@ -1,88 +0,0 @@ -/** - * \file base64.h - * - * \brief RFC 1521 base64 encoding/decoding - * - * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * This file is part of mbed TLS (https://tls.mbed.org) - */ -#ifndef MBEDTLS_BASE64_H -#define MBEDTLS_BASE64_H - -#include - -#define MBEDTLS_ERR_BASE64_BUFFER_TOO_SMALL -0x002A /**< Output buffer too small. */ -#define MBEDTLS_ERR_BASE64_INVALID_CHARACTER -0x002C /**< Invalid character in input. */ - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * \brief Encode a buffer into base64 format - * - * \param dst destination buffer - * \param dlen size of the destination buffer - * \param olen number of bytes written - * \param src source buffer - * \param slen amount of data to be encoded - * - * \return 0 if successful, or MBEDTLS_ERR_BASE64_BUFFER_TOO_SMALL. - * *olen is always updated to reflect the amount - * of data that has (or would have) been written. - * If that length cannot be represented, then no data is - * written to the buffer and *olen is set to the maximum - * length representable as a size_t. - * - * \note Call this function with dlen = 0 to obtain the - * required buffer size in *olen - */ -int mbedtls_base64_encode( unsigned char *dst, size_t dlen, size_t *olen, - const unsigned char *src, size_t slen ); - -/** - * \brief Decode a base64-formatted buffer - * - * \param dst destination buffer (can be NULL for checking size) - * \param dlen size of the destination buffer - * \param olen number of bytes written - * \param src source buffer - * \param slen amount of data to be decoded - * - * \return 0 if successful, MBEDTLS_ERR_BASE64_BUFFER_TOO_SMALL, or - * MBEDTLS_ERR_BASE64_INVALID_CHARACTER if the input data is - * not correct. *olen is always updated to reflect the amount - * of data that has (or would have) been written. - * - * \note Call this function with *dst = NULL or dlen = 0 to obtain - * the required buffer size in *olen - */ -int mbedtls_base64_decode( unsigned char *dst, size_t dlen, size_t *olen, - const unsigned char *src, size_t slen ); - -/** - * \brief Checkup routine - * - * \return 0 if successful, or 1 if the test failed - */ -int mbedtls_base64_self_test( int verbose ); - -#ifdef __cplusplus -} -#endif - -#endif /* base64.h */ diff --git a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/bignum.h b/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/bignum.h deleted file mode 100644 index 146224a2..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/bignum.h +++ /dev/null @@ -1,716 +0,0 @@ -/** - * \file bignum.h - * - * \brief Multi-precision integer library - * - * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * This file is part of mbed TLS (https://tls.mbed.org) - */ -#ifndef MBEDTLS_BIGNUM_H -#define MBEDTLS_BIGNUM_H - -#if !defined(MBEDTLS_CONFIG_FILE) -#include "config.h" -#else -#include MBEDTLS_CONFIG_FILE -#endif - -#include -#include - -#if defined(MBEDTLS_FS_IO) -#include -#endif - -#define MBEDTLS_ERR_MPI_FILE_IO_ERROR -0x0002 /**< An error occurred while reading from or writing to a file. */ -#define MBEDTLS_ERR_MPI_BAD_INPUT_DATA -0x0004 /**< Bad input parameters to function. */ -#define MBEDTLS_ERR_MPI_INVALID_CHARACTER -0x0006 /**< There is an invalid character in the digit string. */ -#define MBEDTLS_ERR_MPI_BUFFER_TOO_SMALL -0x0008 /**< The buffer is too small to write to. */ -#define MBEDTLS_ERR_MPI_NEGATIVE_VALUE -0x000A /**< The input arguments are negative or result in illegal output. */ -#define MBEDTLS_ERR_MPI_DIVISION_BY_ZERO -0x000C /**< The input argument for division is zero, which is not allowed. */ -#define MBEDTLS_ERR_MPI_NOT_ACCEPTABLE -0x000E /**< The input arguments are not acceptable. */ -#define MBEDTLS_ERR_MPI_ALLOC_FAILED -0x0010 /**< Memory allocation failed. */ - -#define MBEDTLS_MPI_CHK(f) do { if( ( ret = f ) != 0 ) goto cleanup; } while( 0 ) - -/* - * Maximum size MPIs are allowed to grow to in number of limbs. - */ -#define MBEDTLS_MPI_MAX_LIMBS 10000 - -#if !defined(MBEDTLS_MPI_WINDOW_SIZE) -/* - * Maximum window size used for modular exponentiation. Default: 6 - * Minimum value: 1. Maximum value: 6. - * - * Result is an array of ( 2 << MBEDTLS_MPI_WINDOW_SIZE ) MPIs used - * for the sliding window calculation. (So 64 by default) - * - * Reduction in size, reduces speed. - */ -#define MBEDTLS_MPI_WINDOW_SIZE 6 /**< Maximum windows size used. */ -#endif /* !MBEDTLS_MPI_WINDOW_SIZE */ - -#if !defined(MBEDTLS_MPI_MAX_SIZE) -/* - * Maximum size of MPIs allowed in bits and bytes for user-MPIs. - * ( Default: 512 bytes => 4096 bits, Maximum tested: 2048 bytes => 16384 bits ) - * - * Note: Calculations can results temporarily in larger MPIs. So the number - * of limbs required (MBEDTLS_MPI_MAX_LIMBS) is higher. - */ -#define MBEDTLS_MPI_MAX_SIZE 1024 /**< Maximum number of bytes for usable MPIs. */ -#endif /* !MBEDTLS_MPI_MAX_SIZE */ - -#define MBEDTLS_MPI_MAX_BITS ( 8 * MBEDTLS_MPI_MAX_SIZE ) /**< Maximum number of bits for usable MPIs. */ - -/* - * When reading from files with mbedtls_mpi_read_file() and writing to files with - * mbedtls_mpi_write_file() the buffer should have space - * for a (short) label, the MPI (in the provided radix), the newline - * characters and the '\0'. - * - * By default we assume at least a 10 char label, a minimum radix of 10 - * (decimal) and a maximum of 4096 bit numbers (1234 decimal chars). - * Autosized at compile time for at least a 10 char label, a minimum radix - * of 10 (decimal) for a number of MBEDTLS_MPI_MAX_BITS size. - * - * This used to be statically sized to 1250 for a maximum of 4096 bit - * numbers (1234 decimal chars). - * - * Calculate using the formula: - * MBEDTLS_MPI_RW_BUFFER_SIZE = ceil(MBEDTLS_MPI_MAX_BITS / ln(10) * ln(2)) + - * LabelSize + 6 - */ -#define MBEDTLS_MPI_MAX_BITS_SCALE100 ( 100 * MBEDTLS_MPI_MAX_BITS ) -#define MBEDTLS_LN_2_DIV_LN_10_SCALE100 332 -#define MBEDTLS_MPI_RW_BUFFER_SIZE ( ((MBEDTLS_MPI_MAX_BITS_SCALE100 + MBEDTLS_LN_2_DIV_LN_10_SCALE100 - 1) / MBEDTLS_LN_2_DIV_LN_10_SCALE100) + 10 + 6 ) - -/* - * Define the base integer type, architecture-wise. - * - * 32-bit integers can be forced on 64-bit arches (eg. for testing purposes) - * by defining MBEDTLS_HAVE_INT32 and undefining MBEDTLS_HAVE_ASM - */ -#if ( ! defined(MBEDTLS_HAVE_INT32) && \ - defined(_MSC_VER) && defined(_M_AMD64) ) - #define MBEDTLS_HAVE_INT64 - typedef int64_t mbedtls_mpi_sint; - typedef uint64_t mbedtls_mpi_uint; -#else - #if ( ! defined(MBEDTLS_HAVE_INT32) && \ - defined(__GNUC__) && ( \ - defined(__amd64__) || defined(__x86_64__) || \ - defined(__ppc64__) || defined(__powerpc64__) || \ - defined(__ia64__) || defined(__alpha__) || \ - (defined(__sparc__) && defined(__arch64__)) || \ - defined(__s390x__) || defined(__mips64) ) ) - #define MBEDTLS_HAVE_INT64 - typedef int64_t mbedtls_mpi_sint; - typedef uint64_t mbedtls_mpi_uint; - typedef unsigned int mbedtls_t_udbl __attribute__((mode(TI))); - #define MBEDTLS_HAVE_UDBL - #else - #define MBEDTLS_HAVE_INT32 - typedef int32_t mbedtls_mpi_sint; - typedef uint32_t mbedtls_mpi_uint; - typedef uint64_t mbedtls_t_udbl; - #define MBEDTLS_HAVE_UDBL - #endif /* !MBEDTLS_HAVE_INT32 && __GNUC__ && 64-bit platform */ -#endif /* !MBEDTLS_HAVE_INT32 && _MSC_VER && _M_AMD64 */ - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * \brief MPI structure - */ -typedef struct -{ - int s; /*!< integer sign */ - size_t n; /*!< total # of limbs */ - mbedtls_mpi_uint *p; /*!< pointer to limbs */ -} -mbedtls_mpi; - -/** - * \brief Initialize one MPI (make internal references valid) - * This just makes it ready to be set or freed, - * but does not define a value for the MPI. - * - * \param X One MPI to initialize. - */ -void mbedtls_mpi_init( mbedtls_mpi *X ); - -/** - * \brief Unallocate one MPI - * - * \param X One MPI to unallocate. - */ -void mbedtls_mpi_free( mbedtls_mpi *X ); - -/** - * \brief Enlarge to the specified number of limbs - * - * \param X MPI to grow - * \param nblimbs The target number of limbs - * - * \return 0 if successful, - * MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed - */ -int mbedtls_mpi_grow( mbedtls_mpi *X, size_t nblimbs ); - -/** - * \brief Resize down, keeping at least the specified number of limbs - * - * \param X MPI to shrink - * \param nblimbs The minimum number of limbs to keep - * - * \return 0 if successful, - * MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed - */ -int mbedtls_mpi_shrink( mbedtls_mpi *X, size_t nblimbs ); - -/** - * \brief Copy the contents of Y into X - * - * \param X Destination MPI - * \param Y Source MPI - * - * \return 0 if successful, - * MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed - */ -int mbedtls_mpi_copy( mbedtls_mpi *X, const mbedtls_mpi *Y ); - -/** - * \brief Swap the contents of X and Y - * - * \param X First MPI value - * \param Y Second MPI value - */ -void mbedtls_mpi_swap( mbedtls_mpi *X, mbedtls_mpi *Y ); - -/** - * \brief Safe conditional assignement X = Y if assign is 1 - * - * \param X MPI to conditionally assign to - * \param Y Value to be assigned - * \param assign 1: perform the assignment, 0: keep X's original value - * - * \return 0 if successful, - * MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed, - * - * \note This function is equivalent to - * if( assign ) mbedtls_mpi_copy( X, Y ); - * except that it avoids leaking any information about whether - * the assignment was done or not (the above code may leak - * information through branch prediction and/or memory access - * patterns analysis). - */ -int mbedtls_mpi_safe_cond_assign( mbedtls_mpi *X, const mbedtls_mpi *Y, unsigned char assign ); - -/** - * \brief Safe conditional swap X <-> Y if swap is 1 - * - * \param X First mbedtls_mpi value - * \param Y Second mbedtls_mpi value - * \param assign 1: perform the swap, 0: keep X and Y's original values - * - * \return 0 if successful, - * MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed, - * - * \note This function is equivalent to - * if( assign ) mbedtls_mpi_swap( X, Y ); - * except that it avoids leaking any information about whether - * the assignment was done or not (the above code may leak - * information through branch prediction and/or memory access - * patterns analysis). - */ -int mbedtls_mpi_safe_cond_swap( mbedtls_mpi *X, mbedtls_mpi *Y, unsigned char assign ); - -/** - * \brief Set value from integer - * - * \param X MPI to set - * \param z Value to use - * - * \return 0 if successful, - * MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed - */ -int mbedtls_mpi_lset( mbedtls_mpi *X, mbedtls_mpi_sint z ); - -/** - * \brief Get a specific bit from X - * - * \param X MPI to use - * \param pos Zero-based index of the bit in X - * - * \return Either a 0 or a 1 - */ -int mbedtls_mpi_get_bit( const mbedtls_mpi *X, size_t pos ); - -/** - * \brief Set a bit of X to a specific value of 0 or 1 - * - * \note Will grow X if necessary to set a bit to 1 in a not yet - * existing limb. Will not grow if bit should be set to 0 - * - * \param X MPI to use - * \param pos Zero-based index of the bit in X - * \param val The value to set the bit to (0 or 1) - * - * \return 0 if successful, - * MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed, - * MBEDTLS_ERR_MPI_BAD_INPUT_DATA if val is not 0 or 1 - */ -int mbedtls_mpi_set_bit( mbedtls_mpi *X, size_t pos, unsigned char val ); - -/** - * \brief Return the number of zero-bits before the least significant - * '1' bit - * - * Note: Thus also the zero-based index of the least significant '1' bit - * - * \param X MPI to use - */ -size_t mbedtls_mpi_lsb( const mbedtls_mpi *X ); - -/** - * \brief Return the number of bits up to and including the most - * significant '1' bit' - * - * Note: Thus also the one-based index of the most significant '1' bit - * - * \param X MPI to use - */ -size_t mbedtls_mpi_bitlen( const mbedtls_mpi *X ); - -/** - * \brief Return the total size in bytes - * - * \param X MPI to use - */ -size_t mbedtls_mpi_size( const mbedtls_mpi *X ); - -/** - * \brief Import from an ASCII string - * - * \param X Destination MPI - * \param radix Input numeric base - * \param s Null-terminated string buffer - * - * \return 0 if successful, or a MBEDTLS_ERR_MPI_XXX error code - */ -int mbedtls_mpi_read_string( mbedtls_mpi *X, int radix, const char *s ); - -/** - * \brief Export into an ASCII string - * - * \param X Source MPI - * \param radix Output numeric base - * \param buf Buffer to write the string to - * \param buflen Length of buf - * \param olen Length of the string written, including final NUL byte - * - * \return 0 if successful, or a MBEDTLS_ERR_MPI_XXX error code. - * *olen is always updated to reflect the amount - * of data that has (or would have) been written. - * - * \note Call this function with buflen = 0 to obtain the - * minimum required buffer size in *olen. - */ -int mbedtls_mpi_write_string( const mbedtls_mpi *X, int radix, - char *buf, size_t buflen, size_t *olen ); - -#if defined(MBEDTLS_FS_IO) -/** - * \brief Read X from an opened file - * - * \param X Destination MPI - * \param radix Input numeric base - * \param fin Input file handle - * - * \return 0 if successful, MBEDTLS_ERR_MPI_BUFFER_TOO_SMALL if - * the file read buffer is too small or a - * MBEDTLS_ERR_MPI_XXX error code - */ -int mbedtls_mpi_read_file( mbedtls_mpi *X, int radix, FILE *fin ); - -/** - * \brief Write X into an opened file, or stdout if fout is NULL - * - * \param p Prefix, can be NULL - * \param X Source MPI - * \param radix Output numeric base - * \param fout Output file handle (can be NULL) - * - * \return 0 if successful, or a MBEDTLS_ERR_MPI_XXX error code - * - * \note Set fout == NULL to print X on the console. - */ -int mbedtls_mpi_write_file( const char *p, const mbedtls_mpi *X, int radix, FILE *fout ); -#endif /* MBEDTLS_FS_IO */ - -/** - * \brief Import X from unsigned binary data, big endian - * - * \param X Destination MPI - * \param buf Input buffer - * \param buflen Input buffer size - * - * \return 0 if successful, - * MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed - */ -int mbedtls_mpi_read_binary( mbedtls_mpi *X, const unsigned char *buf, size_t buflen ); - -/** - * \brief Export X into unsigned binary data, big endian. - * Always fills the whole buffer, which will start with zeros - * if the number is smaller. - * - * \param X Source MPI - * \param buf Output buffer - * \param buflen Output buffer size - * - * \return 0 if successful, - * MBEDTLS_ERR_MPI_BUFFER_TOO_SMALL if buf isn't large enough - */ -int mbedtls_mpi_write_binary( const mbedtls_mpi *X, unsigned char *buf, size_t buflen ); - -/** - * \brief Left-shift: X <<= count - * - * \param X MPI to shift - * \param count Amount to shift - * - * \return 0 if successful, - * MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed - */ -int mbedtls_mpi_shift_l( mbedtls_mpi *X, size_t count ); - -/** - * \brief Right-shift: X >>= count - * - * \param X MPI to shift - * \param count Amount to shift - * - * \return 0 if successful, - * MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed - */ -int mbedtls_mpi_shift_r( mbedtls_mpi *X, size_t count ); - -/** - * \brief Compare unsigned values - * - * \param X Left-hand MPI - * \param Y Right-hand MPI - * - * \return 1 if |X| is greater than |Y|, - * -1 if |X| is lesser than |Y| or - * 0 if |X| is equal to |Y| - */ -int mbedtls_mpi_cmp_abs( const mbedtls_mpi *X, const mbedtls_mpi *Y ); - -/** - * \brief Compare signed values - * - * \param X Left-hand MPI - * \param Y Right-hand MPI - * - * \return 1 if X is greater than Y, - * -1 if X is lesser than Y or - * 0 if X is equal to Y - */ -int mbedtls_mpi_cmp_mpi( const mbedtls_mpi *X, const mbedtls_mpi *Y ); - -/** - * \brief Compare signed values - * - * \param X Left-hand MPI - * \param z The integer value to compare to - * - * \return 1 if X is greater than z, - * -1 if X is lesser than z or - * 0 if X is equal to z - */ -int mbedtls_mpi_cmp_int( const mbedtls_mpi *X, mbedtls_mpi_sint z ); - -/** - * \brief Unsigned addition: X = |A| + |B| - * - * \param X Destination MPI - * \param A Left-hand MPI - * \param B Right-hand MPI - * - * \return 0 if successful, - * MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed - */ -int mbedtls_mpi_add_abs( mbedtls_mpi *X, const mbedtls_mpi *A, const mbedtls_mpi *B ); - -/** - * \brief Unsigned subtraction: X = |A| - |B| - * - * \param X Destination MPI - * \param A Left-hand MPI - * \param B Right-hand MPI - * - * \return 0 if successful, - * MBEDTLS_ERR_MPI_NEGATIVE_VALUE if B is greater than A - */ -int mbedtls_mpi_sub_abs( mbedtls_mpi *X, const mbedtls_mpi *A, const mbedtls_mpi *B ); - -/** - * \brief Signed addition: X = A + B - * - * \param X Destination MPI - * \param A Left-hand MPI - * \param B Right-hand MPI - * - * \return 0 if successful, - * MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed - */ -int mbedtls_mpi_add_mpi( mbedtls_mpi *X, const mbedtls_mpi *A, const mbedtls_mpi *B ); - -/** - * \brief Signed subtraction: X = A - B - * - * \param X Destination MPI - * \param A Left-hand MPI - * \param B Right-hand MPI - * - * \return 0 if successful, - * MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed - */ -int mbedtls_mpi_sub_mpi( mbedtls_mpi *X, const mbedtls_mpi *A, const mbedtls_mpi *B ); - -/** - * \brief Signed addition: X = A + b - * - * \param X Destination MPI - * \param A Left-hand MPI - * \param b The integer value to add - * - * \return 0 if successful, - * MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed - */ -int mbedtls_mpi_add_int( mbedtls_mpi *X, const mbedtls_mpi *A, mbedtls_mpi_sint b ); - -/** - * \brief Signed subtraction: X = A - b - * - * \param X Destination MPI - * \param A Left-hand MPI - * \param b The integer value to subtract - * - * \return 0 if successful, - * MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed - */ -int mbedtls_mpi_sub_int( mbedtls_mpi *X, const mbedtls_mpi *A, mbedtls_mpi_sint b ); - -/** - * \brief Baseline multiplication: X = A * B - * - * \param X Destination MPI - * \param A Left-hand MPI - * \param B Right-hand MPI - * - * \return 0 if successful, - * MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed - */ -int mbedtls_mpi_mul_mpi( mbedtls_mpi *X, const mbedtls_mpi *A, const mbedtls_mpi *B ); - -/** - * \brief Baseline multiplication: X = A * b - * - * \param X Destination MPI - * \param A Left-hand MPI - * \param b The unsigned integer value to multiply with - * - * \note b is unsigned - * - * \return 0 if successful, - * MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed - */ -int mbedtls_mpi_mul_int( mbedtls_mpi *X, const mbedtls_mpi *A, mbedtls_mpi_uint b ); - -/** - * \brief Division by mbedtls_mpi: A = Q * B + R - * - * \param Q Destination MPI for the quotient - * \param R Destination MPI for the rest value - * \param A Left-hand MPI - * \param B Right-hand MPI - * - * \return 0 if successful, - * MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed, - * MBEDTLS_ERR_MPI_DIVISION_BY_ZERO if B == 0 - * - * \note Either Q or R can be NULL. - */ -int mbedtls_mpi_div_mpi( mbedtls_mpi *Q, mbedtls_mpi *R, const mbedtls_mpi *A, const mbedtls_mpi *B ); - -/** - * \brief Division by int: A = Q * b + R - * - * \param Q Destination MPI for the quotient - * \param R Destination MPI for the rest value - * \param A Left-hand MPI - * \param b Integer to divide by - * - * \return 0 if successful, - * MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed, - * MBEDTLS_ERR_MPI_DIVISION_BY_ZERO if b == 0 - * - * \note Either Q or R can be NULL. - */ -int mbedtls_mpi_div_int( mbedtls_mpi *Q, mbedtls_mpi *R, const mbedtls_mpi *A, mbedtls_mpi_sint b ); - -/** - * \brief Modulo: R = A mod B - * - * \param R Destination MPI for the rest value - * \param A Left-hand MPI - * \param B Right-hand MPI - * - * \return 0 if successful, - * MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed, - * MBEDTLS_ERR_MPI_DIVISION_BY_ZERO if B == 0, - * MBEDTLS_ERR_MPI_NEGATIVE_VALUE if B < 0 - */ -int mbedtls_mpi_mod_mpi( mbedtls_mpi *R, const mbedtls_mpi *A, const mbedtls_mpi *B ); - -/** - * \brief Modulo: r = A mod b - * - * \param r Destination mbedtls_mpi_uint - * \param A Left-hand MPI - * \param b Integer to divide by - * - * \return 0 if successful, - * MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed, - * MBEDTLS_ERR_MPI_DIVISION_BY_ZERO if b == 0, - * MBEDTLS_ERR_MPI_NEGATIVE_VALUE if b < 0 - */ -int mbedtls_mpi_mod_int( mbedtls_mpi_uint *r, const mbedtls_mpi *A, mbedtls_mpi_sint b ); - -/** - * \brief Sliding-window exponentiation: X = A^E mod N - * - * \param X Destination MPI - * \param A Left-hand MPI - * \param E Exponent MPI - * \param N Modular MPI - * \param _RR Speed-up MPI used for recalculations - * - * \return 0 if successful, - * MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed, - * MBEDTLS_ERR_MPI_BAD_INPUT_DATA if N is negative or even or - * if E is negative - * - * \note _RR is used to avoid re-computing R*R mod N across - * multiple calls, which speeds up things a bit. It can - * be set to NULL if the extra performance is unneeded. - */ -int mbedtls_mpi_exp_mod( mbedtls_mpi *X, const mbedtls_mpi *A, const mbedtls_mpi *E, const mbedtls_mpi *N, mbedtls_mpi *_RR ); - -/** - * \brief Fill an MPI X with size bytes of random - * - * \param X Destination MPI - * \param size Size in bytes - * \param f_rng RNG function - * \param p_rng RNG parameter - * - * \return 0 if successful, - * MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed - */ -int mbedtls_mpi_fill_random( mbedtls_mpi *X, size_t size, - int (*f_rng)(void *, unsigned char *, size_t), - void *p_rng ); - -/** - * \brief Greatest common divisor: G = gcd(A, B) - * - * \param G Destination MPI - * \param A Left-hand MPI - * \param B Right-hand MPI - * - * \return 0 if successful, - * MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed - */ -int mbedtls_mpi_gcd( mbedtls_mpi *G, const mbedtls_mpi *A, const mbedtls_mpi *B ); - -/** - * \brief Modular inverse: X = A^-1 mod N - * - * \param X Destination MPI - * \param A Left-hand MPI - * \param N Right-hand MPI - * - * \return 0 if successful, - * MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed, - * MBEDTLS_ERR_MPI_BAD_INPUT_DATA if N is negative or nil - MBEDTLS_ERR_MPI_NOT_ACCEPTABLE if A has no inverse mod N - */ -int mbedtls_mpi_inv_mod( mbedtls_mpi *X, const mbedtls_mpi *A, const mbedtls_mpi *N ); - -/** - * \brief Miller-Rabin primality test - * - * \param X MPI to check - * \param f_rng RNG function - * \param p_rng RNG parameter - * - * \return 0 if successful (probably prime), - * MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed, - * MBEDTLS_ERR_MPI_NOT_ACCEPTABLE if X is not prime - */ -int mbedtls_mpi_is_prime( const mbedtls_mpi *X, - int (*f_rng)(void *, unsigned char *, size_t), - void *p_rng ); - -/** - * \brief Prime number generation - * - * \param X Destination MPI - * \param nbits Required size of X in bits - * ( 3 <= nbits <= MBEDTLS_MPI_MAX_BITS ) - * \param dh_flag If 1, then (X-1)/2 will be prime too - * \param f_rng RNG function - * \param p_rng RNG parameter - * - * \return 0 if successful (probably prime), - * MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed, - * MBEDTLS_ERR_MPI_BAD_INPUT_DATA if nbits is < 3 - */ -int mbedtls_mpi_gen_prime( mbedtls_mpi *X, size_t nbits, int dh_flag, - int (*f_rng)(void *, unsigned char *, size_t), - void *p_rng ); - -/** - * \brief Checkup routine - * - * \return 0 if successful, or 1 if the test failed - */ -int mbedtls_mpi_self_test( int verbose ); - -#ifdef __cplusplus -} -#endif - -#endif /* bignum.h */ diff --git a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/blowfish.h b/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/blowfish.h deleted file mode 100644 index 34626eef..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/blowfish.h +++ /dev/null @@ -1,203 +0,0 @@ -/** - * \file blowfish.h - * - * \brief Blowfish block cipher - * - * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * This file is part of mbed TLS (https://tls.mbed.org) - */ -#ifndef MBEDTLS_BLOWFISH_H -#define MBEDTLS_BLOWFISH_H - -#if !defined(MBEDTLS_CONFIG_FILE) -#include "config.h" -#else -#include MBEDTLS_CONFIG_FILE -#endif - -#include -#include - -#define MBEDTLS_BLOWFISH_ENCRYPT 1 -#define MBEDTLS_BLOWFISH_DECRYPT 0 -#define MBEDTLS_BLOWFISH_MAX_KEY_BITS 448 -#define MBEDTLS_BLOWFISH_MIN_KEY_BITS 32 -#define MBEDTLS_BLOWFISH_ROUNDS 16 /**< Rounds to use. When increasing this value, make sure to extend the initialisation vectors */ -#define MBEDTLS_BLOWFISH_BLOCKSIZE 8 /* Blowfish uses 64 bit blocks */ - -#define MBEDTLS_ERR_BLOWFISH_INVALID_KEY_LENGTH -0x0016 /**< Invalid key length. */ -#define MBEDTLS_ERR_BLOWFISH_INVALID_INPUT_LENGTH -0x0018 /**< Invalid data input length. */ - -#if !defined(MBEDTLS_BLOWFISH_ALT) -// Regular implementation -// - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * \brief Blowfish context structure - */ -typedef struct -{ - uint32_t P[MBEDTLS_BLOWFISH_ROUNDS + 2]; /*!< Blowfish round keys */ - uint32_t S[4][256]; /*!< key dependent S-boxes */ -} -mbedtls_blowfish_context; - -/** - * \brief Initialize Blowfish context - * - * \param ctx Blowfish context to be initialized - */ -void mbedtls_blowfish_init( mbedtls_blowfish_context *ctx ); - -/** - * \brief Clear Blowfish context - * - * \param ctx Blowfish context to be cleared - */ -void mbedtls_blowfish_free( mbedtls_blowfish_context *ctx ); - -/** - * \brief Blowfish key schedule - * - * \param ctx Blowfish context to be initialized - * \param key encryption key - * \param keybits must be between 32 and 448 bits - * - * \return 0 if successful, or MBEDTLS_ERR_BLOWFISH_INVALID_KEY_LENGTH - */ -int mbedtls_blowfish_setkey( mbedtls_blowfish_context *ctx, const unsigned char *key, - unsigned int keybits ); - -/** - * \brief Blowfish-ECB block encryption/decryption - * - * \param ctx Blowfish context - * \param mode MBEDTLS_BLOWFISH_ENCRYPT or MBEDTLS_BLOWFISH_DECRYPT - * \param input 8-byte input block - * \param output 8-byte output block - * - * \return 0 if successful - */ -int mbedtls_blowfish_crypt_ecb( mbedtls_blowfish_context *ctx, - int mode, - const unsigned char input[MBEDTLS_BLOWFISH_BLOCKSIZE], - unsigned char output[MBEDTLS_BLOWFISH_BLOCKSIZE] ); - -#if defined(MBEDTLS_CIPHER_MODE_CBC) -/** - * \brief Blowfish-CBC buffer encryption/decryption - * Length should be a multiple of the block - * size (8 bytes) - * - * \note Upon exit, the content of the IV is updated so that you can - * call the function same function again on the following - * block(s) of data and get the same result as if it was - * encrypted in one call. This allows a "streaming" usage. - * If on the other hand you need to retain the contents of the - * IV, you should either save it manually or use the cipher - * module instead. - * - * \param ctx Blowfish context - * \param mode MBEDTLS_BLOWFISH_ENCRYPT or MBEDTLS_BLOWFISH_DECRYPT - * \param length length of the input data - * \param iv initialization vector (updated after use) - * \param input buffer holding the input data - * \param output buffer holding the output data - * - * \return 0 if successful, or - * MBEDTLS_ERR_BLOWFISH_INVALID_INPUT_LENGTH - */ -int mbedtls_blowfish_crypt_cbc( mbedtls_blowfish_context *ctx, - int mode, - size_t length, - unsigned char iv[MBEDTLS_BLOWFISH_BLOCKSIZE], - const unsigned char *input, - unsigned char *output ); -#endif /* MBEDTLS_CIPHER_MODE_CBC */ - -#if defined(MBEDTLS_CIPHER_MODE_CFB) -/** - * \brief Blowfish CFB buffer encryption/decryption. - * - * \note Upon exit, the content of the IV is updated so that you can - * call the function same function again on the following - * block(s) of data and get the same result as if it was - * encrypted in one call. This allows a "streaming" usage. - * If on the other hand you need to retain the contents of the - * IV, you should either save it manually or use the cipher - * module instead. - * - * \param ctx Blowfish context - * \param mode MBEDTLS_BLOWFISH_ENCRYPT or MBEDTLS_BLOWFISH_DECRYPT - * \param length length of the input data - * \param iv_off offset in IV (updated after use) - * \param iv initialization vector (updated after use) - * \param input buffer holding the input data - * \param output buffer holding the output data - * - * \return 0 if successful - */ -int mbedtls_blowfish_crypt_cfb64( mbedtls_blowfish_context *ctx, - int mode, - size_t length, - size_t *iv_off, - unsigned char iv[MBEDTLS_BLOWFISH_BLOCKSIZE], - const unsigned char *input, - unsigned char *output ); -#endif /*MBEDTLS_CIPHER_MODE_CFB */ - -#if defined(MBEDTLS_CIPHER_MODE_CTR) -/** - * \brief Blowfish-CTR buffer encryption/decryption - * - * Warning: You have to keep the maximum use of your counter in mind! - * - * \param ctx Blowfish context - * \param length The length of the data - * \param nc_off The offset in the current stream_block (for resuming - * within current cipher stream). The offset pointer to - * should be 0 at the start of a stream. - * \param nonce_counter The 64-bit nonce and counter. - * \param stream_block The saved stream-block for resuming. Is overwritten - * by the function. - * \param input The input data stream - * \param output The output data stream - * - * \return 0 if successful - */ -int mbedtls_blowfish_crypt_ctr( mbedtls_blowfish_context *ctx, - size_t length, - size_t *nc_off, - unsigned char nonce_counter[MBEDTLS_BLOWFISH_BLOCKSIZE], - unsigned char stream_block[MBEDTLS_BLOWFISH_BLOCKSIZE], - const unsigned char *input, - unsigned char *output ); -#endif /* MBEDTLS_CIPHER_MODE_CTR */ - -#ifdef __cplusplus -} -#endif - -#else /* MBEDTLS_BLOWFISH_ALT */ -#include "blowfish_alt.h" -#endif /* MBEDTLS_BLOWFISH_ALT */ - -#endif /* blowfish.h */ diff --git a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/bn_mul.h b/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/bn_mul.h deleted file mode 100644 index 003f605b..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/bn_mul.h +++ /dev/null @@ -1,875 +0,0 @@ -/** - * \file bn_mul.h - * - * \brief Multi-precision integer library - * - * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * This file is part of mbed TLS (https://tls.mbed.org) - */ -/* - * Multiply source vector [s] with b, add result - * to destination vector [d] and set carry c. - * - * Currently supports: - * - * . IA-32 (386+) . AMD64 / EM64T - * . IA-32 (SSE2) . Motorola 68000 - * . PowerPC, 32-bit . MicroBlaze - * . PowerPC, 64-bit . TriCore - * . SPARC v8 . ARM v3+ - * . Alpha . MIPS32 - * . C, longlong . C, generic - */ -#ifndef MBEDTLS_BN_MUL_H -#define MBEDTLS_BN_MUL_H - -#include "bignum.h" - -#if defined(MBEDTLS_HAVE_ASM) - -#ifndef asm -#define asm __asm -#endif - -/* armcc5 --gnu defines __GNUC__ but doesn't support GNU's extended asm */ -#if defined(__GNUC__) && \ - ( !defined(__ARMCC_VERSION) || __ARMCC_VERSION >= 6000000 ) -#if defined(__i386__) - -#define MULADDC_INIT \ - asm( \ - "movl %%ebx, %0 \n\t" \ - "movl %5, %%esi \n\t" \ - "movl %6, %%edi \n\t" \ - "movl %7, %%ecx \n\t" \ - "movl %8, %%ebx \n\t" - -#define MULADDC_CORE \ - "lodsl \n\t" \ - "mull %%ebx \n\t" \ - "addl %%ecx, %%eax \n\t" \ - "adcl $0, %%edx \n\t" \ - "addl (%%edi), %%eax \n\t" \ - "adcl $0, %%edx \n\t" \ - "movl %%edx, %%ecx \n\t" \ - "stosl \n\t" - -#if defined(MBEDTLS_HAVE_SSE2) - -#define MULADDC_HUIT \ - "movd %%ecx, %%mm1 \n\t" \ - "movd %%ebx, %%mm0 \n\t" \ - "movd (%%edi), %%mm3 \n\t" \ - "paddq %%mm3, %%mm1 \n\t" \ - "movd (%%esi), %%mm2 \n\t" \ - "pmuludq %%mm0, %%mm2 \n\t" \ - "movd 4(%%esi), %%mm4 \n\t" \ - "pmuludq %%mm0, %%mm4 \n\t" \ - "movd 8(%%esi), %%mm6 \n\t" \ - "pmuludq %%mm0, %%mm6 \n\t" \ - "movd 12(%%esi), %%mm7 \n\t" \ - "pmuludq %%mm0, %%mm7 \n\t" \ - "paddq %%mm2, %%mm1 \n\t" \ - "movd 4(%%edi), %%mm3 \n\t" \ - "paddq %%mm4, %%mm3 \n\t" \ - "movd 8(%%edi), %%mm5 \n\t" \ - "paddq %%mm6, %%mm5 \n\t" \ - "movd 12(%%edi), %%mm4 \n\t" \ - "paddq %%mm4, %%mm7 \n\t" \ - "movd %%mm1, (%%edi) \n\t" \ - "movd 16(%%esi), %%mm2 \n\t" \ - "pmuludq %%mm0, %%mm2 \n\t" \ - "psrlq $32, %%mm1 \n\t" \ - "movd 20(%%esi), %%mm4 \n\t" \ - "pmuludq %%mm0, %%mm4 \n\t" \ - "paddq %%mm3, %%mm1 \n\t" \ - "movd 24(%%esi), %%mm6 \n\t" \ - "pmuludq %%mm0, %%mm6 \n\t" \ - "movd %%mm1, 4(%%edi) \n\t" \ - "psrlq $32, %%mm1 \n\t" \ - "movd 28(%%esi), %%mm3 \n\t" \ - "pmuludq %%mm0, %%mm3 \n\t" \ - "paddq %%mm5, %%mm1 \n\t" \ - "movd 16(%%edi), %%mm5 \n\t" \ - "paddq %%mm5, %%mm2 \n\t" \ - "movd %%mm1, 8(%%edi) \n\t" \ - "psrlq $32, %%mm1 \n\t" \ - "paddq %%mm7, %%mm1 \n\t" \ - "movd 20(%%edi), %%mm5 \n\t" \ - "paddq %%mm5, %%mm4 \n\t" \ - "movd %%mm1, 12(%%edi) \n\t" \ - "psrlq $32, %%mm1 \n\t" \ - "paddq %%mm2, %%mm1 \n\t" \ - "movd 24(%%edi), %%mm5 \n\t" \ - "paddq %%mm5, %%mm6 \n\t" \ - "movd %%mm1, 16(%%edi) \n\t" \ - "psrlq $32, %%mm1 \n\t" \ - "paddq %%mm4, %%mm1 \n\t" \ - "movd 28(%%edi), %%mm5 \n\t" \ - "paddq %%mm5, %%mm3 \n\t" \ - "movd %%mm1, 20(%%edi) \n\t" \ - "psrlq $32, %%mm1 \n\t" \ - "paddq %%mm6, %%mm1 \n\t" \ - "movd %%mm1, 24(%%edi) \n\t" \ - "psrlq $32, %%mm1 \n\t" \ - "paddq %%mm3, %%mm1 \n\t" \ - "movd %%mm1, 28(%%edi) \n\t" \ - "addl $32, %%edi \n\t" \ - "addl $32, %%esi \n\t" \ - "psrlq $32, %%mm1 \n\t" \ - "movd %%mm1, %%ecx \n\t" - -#define MULADDC_STOP \ - "emms \n\t" \ - "movl %4, %%ebx \n\t" \ - "movl %%ecx, %1 \n\t" \ - "movl %%edi, %2 \n\t" \ - "movl %%esi, %3 \n\t" \ - : "=m" (t), "=m" (c), "=m" (d), "=m" (s) \ - : "m" (t), "m" (s), "m" (d), "m" (c), "m" (b) \ - : "eax", "ecx", "edx", "esi", "edi" \ - ); - -#else - -#define MULADDC_STOP \ - "movl %4, %%ebx \n\t" \ - "movl %%ecx, %1 \n\t" \ - "movl %%edi, %2 \n\t" \ - "movl %%esi, %3 \n\t" \ - : "=m" (t), "=m" (c), "=m" (d), "=m" (s) \ - : "m" (t), "m" (s), "m" (d), "m" (c), "m" (b) \ - : "eax", "ecx", "edx", "esi", "edi" \ - ); -#endif /* SSE2 */ -#endif /* i386 */ - -#if defined(__amd64__) || defined (__x86_64__) - -#define MULADDC_INIT \ - asm( \ - "movq %3, %%rsi \n\t" \ - "movq %4, %%rdi \n\t" \ - "movq %5, %%rcx \n\t" \ - "movq %6, %%rbx \n\t" \ - "xorq %%r8, %%r8 \n\t" - -#define MULADDC_CORE \ - "movq (%%rsi), %%rax \n\t" \ - "mulq %%rbx \n\t" \ - "addq $8, %%rsi \n\t" \ - "addq %%rcx, %%rax \n\t" \ - "movq %%r8, %%rcx \n\t" \ - "adcq $0, %%rdx \n\t" \ - "nop \n\t" \ - "addq %%rax, (%%rdi) \n\t" \ - "adcq %%rdx, %%rcx \n\t" \ - "addq $8, %%rdi \n\t" - -#define MULADDC_STOP \ - "movq %%rcx, %0 \n\t" \ - "movq %%rdi, %1 \n\t" \ - "movq %%rsi, %2 \n\t" \ - : "=m" (c), "=m" (d), "=m" (s) \ - : "m" (s), "m" (d), "m" (c), "m" (b) \ - : "rax", "rcx", "rdx", "rbx", "rsi", "rdi", "r8" \ - ); - -#endif /* AMD64 */ - -#if defined(__mc68020__) || defined(__mcpu32__) - -#define MULADDC_INIT \ - asm( \ - "movl %3, %%a2 \n\t" \ - "movl %4, %%a3 \n\t" \ - "movl %5, %%d3 \n\t" \ - "movl %6, %%d2 \n\t" \ - "moveq #0, %%d0 \n\t" - -#define MULADDC_CORE \ - "movel %%a2@+, %%d1 \n\t" \ - "mulul %%d2, %%d4:%%d1 \n\t" \ - "addl %%d3, %%d1 \n\t" \ - "addxl %%d0, %%d4 \n\t" \ - "moveq #0, %%d3 \n\t" \ - "addl %%d1, %%a3@+ \n\t" \ - "addxl %%d4, %%d3 \n\t" - -#define MULADDC_STOP \ - "movl %%d3, %0 \n\t" \ - "movl %%a3, %1 \n\t" \ - "movl %%a2, %2 \n\t" \ - : "=m" (c), "=m" (d), "=m" (s) \ - : "m" (s), "m" (d), "m" (c), "m" (b) \ - : "d0", "d1", "d2", "d3", "d4", "a2", "a3" \ - ); - -#define MULADDC_HUIT \ - "movel %%a2@+, %%d1 \n\t" \ - "mulul %%d2, %%d4:%%d1 \n\t" \ - "addxl %%d3, %%d1 \n\t" \ - "addxl %%d0, %%d4 \n\t" \ - "addl %%d1, %%a3@+ \n\t" \ - "movel %%a2@+, %%d1 \n\t" \ - "mulul %%d2, %%d3:%%d1 \n\t" \ - "addxl %%d4, %%d1 \n\t" \ - "addxl %%d0, %%d3 \n\t" \ - "addl %%d1, %%a3@+ \n\t" \ - "movel %%a2@+, %%d1 \n\t" \ - "mulul %%d2, %%d4:%%d1 \n\t" \ - "addxl %%d3, %%d1 \n\t" \ - "addxl %%d0, %%d4 \n\t" \ - "addl %%d1, %%a3@+ \n\t" \ - "movel %%a2@+, %%d1 \n\t" \ - "mulul %%d2, %%d3:%%d1 \n\t" \ - "addxl %%d4, %%d1 \n\t" \ - "addxl %%d0, %%d3 \n\t" \ - "addl %%d1, %%a3@+ \n\t" \ - "movel %%a2@+, %%d1 \n\t" \ - "mulul %%d2, %%d4:%%d1 \n\t" \ - "addxl %%d3, %%d1 \n\t" \ - "addxl %%d0, %%d4 \n\t" \ - "addl %%d1, %%a3@+ \n\t" \ - "movel %%a2@+, %%d1 \n\t" \ - "mulul %%d2, %%d3:%%d1 \n\t" \ - "addxl %%d4, %%d1 \n\t" \ - "addxl %%d0, %%d3 \n\t" \ - "addl %%d1, %%a3@+ \n\t" \ - "movel %%a2@+, %%d1 \n\t" \ - "mulul %%d2, %%d4:%%d1 \n\t" \ - "addxl %%d3, %%d1 \n\t" \ - "addxl %%d0, %%d4 \n\t" \ - "addl %%d1, %%a3@+ \n\t" \ - "movel %%a2@+, %%d1 \n\t" \ - "mulul %%d2, %%d3:%%d1 \n\t" \ - "addxl %%d4, %%d1 \n\t" \ - "addxl %%d0, %%d3 \n\t" \ - "addl %%d1, %%a3@+ \n\t" \ - "addxl %%d0, %%d3 \n\t" - -#endif /* MC68000 */ - -#if defined(__powerpc64__) || defined(__ppc64__) - -#if defined(__MACH__) && defined(__APPLE__) - -#define MULADDC_INIT \ - asm( \ - "ld r3, %3 \n\t" \ - "ld r4, %4 \n\t" \ - "ld r5, %5 \n\t" \ - "ld r6, %6 \n\t" \ - "addi r3, r3, -8 \n\t" \ - "addi r4, r4, -8 \n\t" \ - "addic r5, r5, 0 \n\t" - -#define MULADDC_CORE \ - "ldu r7, 8(r3) \n\t" \ - "mulld r8, r7, r6 \n\t" \ - "mulhdu r9, r7, r6 \n\t" \ - "adde r8, r8, r5 \n\t" \ - "ld r7, 8(r4) \n\t" \ - "addze r5, r9 \n\t" \ - "addc r8, r8, r7 \n\t" \ - "stdu r8, 8(r4) \n\t" - -#define MULADDC_STOP \ - "addze r5, r5 \n\t" \ - "addi r4, r4, 8 \n\t" \ - "addi r3, r3, 8 \n\t" \ - "std r5, %0 \n\t" \ - "std r4, %1 \n\t" \ - "std r3, %2 \n\t" \ - : "=m" (c), "=m" (d), "=m" (s) \ - : "m" (s), "m" (d), "m" (c), "m" (b) \ - : "r3", "r4", "r5", "r6", "r7", "r8", "r9" \ - ); - - -#else /* __MACH__ && __APPLE__ */ - -#define MULADDC_INIT \ - asm( \ - "ld %%r3, %3 \n\t" \ - "ld %%r4, %4 \n\t" \ - "ld %%r5, %5 \n\t" \ - "ld %%r6, %6 \n\t" \ - "addi %%r3, %%r3, -8 \n\t" \ - "addi %%r4, %%r4, -8 \n\t" \ - "addic %%r5, %%r5, 0 \n\t" - -#define MULADDC_CORE \ - "ldu %%r7, 8(%%r3) \n\t" \ - "mulld %%r8, %%r7, %%r6 \n\t" \ - "mulhdu %%r9, %%r7, %%r6 \n\t" \ - "adde %%r8, %%r8, %%r5 \n\t" \ - "ld %%r7, 8(%%r4) \n\t" \ - "addze %%r5, %%r9 \n\t" \ - "addc %%r8, %%r8, %%r7 \n\t" \ - "stdu %%r8, 8(%%r4) \n\t" - -#define MULADDC_STOP \ - "addze %%r5, %%r5 \n\t" \ - "addi %%r4, %%r4, 8 \n\t" \ - "addi %%r3, %%r3, 8 \n\t" \ - "std %%r5, %0 \n\t" \ - "std %%r4, %1 \n\t" \ - "std %%r3, %2 \n\t" \ - : "=m" (c), "=m" (d), "=m" (s) \ - : "m" (s), "m" (d), "m" (c), "m" (b) \ - : "r3", "r4", "r5", "r6", "r7", "r8", "r9" \ - ); - -#endif /* __MACH__ && __APPLE__ */ - -#elif defined(__powerpc__) || defined(__ppc__) /* end PPC64/begin PPC32 */ - -#if defined(__MACH__) && defined(__APPLE__) - -#define MULADDC_INIT \ - asm( \ - "lwz r3, %3 \n\t" \ - "lwz r4, %4 \n\t" \ - "lwz r5, %5 \n\t" \ - "lwz r6, %6 \n\t" \ - "addi r3, r3, -4 \n\t" \ - "addi r4, r4, -4 \n\t" \ - "addic r5, r5, 0 \n\t" - -#define MULADDC_CORE \ - "lwzu r7, 4(r3) \n\t" \ - "mullw r8, r7, r6 \n\t" \ - "mulhwu r9, r7, r6 \n\t" \ - "adde r8, r8, r5 \n\t" \ - "lwz r7, 4(r4) \n\t" \ - "addze r5, r9 \n\t" \ - "addc r8, r8, r7 \n\t" \ - "stwu r8, 4(r4) \n\t" - -#define MULADDC_STOP \ - "addze r5, r5 \n\t" \ - "addi r4, r4, 4 \n\t" \ - "addi r3, r3, 4 \n\t" \ - "stw r5, %0 \n\t" \ - "stw r4, %1 \n\t" \ - "stw r3, %2 \n\t" \ - : "=m" (c), "=m" (d), "=m" (s) \ - : "m" (s), "m" (d), "m" (c), "m" (b) \ - : "r3", "r4", "r5", "r6", "r7", "r8", "r9" \ - ); - -#else /* __MACH__ && __APPLE__ */ - -#define MULADDC_INIT \ - asm( \ - "lwz %%r3, %3 \n\t" \ - "lwz %%r4, %4 \n\t" \ - "lwz %%r5, %5 \n\t" \ - "lwz %%r6, %6 \n\t" \ - "addi %%r3, %%r3, -4 \n\t" \ - "addi %%r4, %%r4, -4 \n\t" \ - "addic %%r5, %%r5, 0 \n\t" - -#define MULADDC_CORE \ - "lwzu %%r7, 4(%%r3) \n\t" \ - "mullw %%r8, %%r7, %%r6 \n\t" \ - "mulhwu %%r9, %%r7, %%r6 \n\t" \ - "adde %%r8, %%r8, %%r5 \n\t" \ - "lwz %%r7, 4(%%r4) \n\t" \ - "addze %%r5, %%r9 \n\t" \ - "addc %%r8, %%r8, %%r7 \n\t" \ - "stwu %%r8, 4(%%r4) \n\t" - -#define MULADDC_STOP \ - "addze %%r5, %%r5 \n\t" \ - "addi %%r4, %%r4, 4 \n\t" \ - "addi %%r3, %%r3, 4 \n\t" \ - "stw %%r5, %0 \n\t" \ - "stw %%r4, %1 \n\t" \ - "stw %%r3, %2 \n\t" \ - : "=m" (c), "=m" (d), "=m" (s) \ - : "m" (s), "m" (d), "m" (c), "m" (b) \ - : "r3", "r4", "r5", "r6", "r7", "r8", "r9" \ - ); - -#endif /* __MACH__ && __APPLE__ */ - -#endif /* PPC32 */ - -/* - * The Sparc64 assembly is reported to be broken. - * Disable it for now, until we're able to fix it. - */ -#if 0 && defined(__sparc__) && defined(__sparc64__) - -#define MULADDC_INIT \ - asm( \ - "ldx %3, %%o0 \n\t" \ - "ldx %4, %%o1 \n\t" \ - "ld %5, %%o2 \n\t" \ - "ld %6, %%o3 \n\t" - -#define MULADDC_CORE \ - "ld [%%o0], %%o4 \n\t" \ - "inc 4, %%o0 \n\t" \ - "ld [%%o1], %%o5 \n\t" \ - "umul %%o3, %%o4, %%o4 \n\t" \ - "addcc %%o4, %%o2, %%o4 \n\t" \ - "rd %%y, %%g1 \n\t" \ - "addx %%g1, 0, %%g1 \n\t" \ - "addcc %%o4, %%o5, %%o4 \n\t" \ - "st %%o4, [%%o1] \n\t" \ - "addx %%g1, 0, %%o2 \n\t" \ - "inc 4, %%o1 \n\t" - - #define MULADDC_STOP \ - "st %%o2, %0 \n\t" \ - "stx %%o1, %1 \n\t" \ - "stx %%o0, %2 \n\t" \ - : "=m" (c), "=m" (d), "=m" (s) \ - : "m" (s), "m" (d), "m" (c), "m" (b) \ - : "g1", "o0", "o1", "o2", "o3", "o4", \ - "o5" \ - ); -#endif /* SPARCv9 */ - -#if defined(__sparc__) && !defined(__sparc64__) - -#define MULADDC_INIT \ - asm( \ - "ld %3, %%o0 \n\t" \ - "ld %4, %%o1 \n\t" \ - "ld %5, %%o2 \n\t" \ - "ld %6, %%o3 \n\t" - -#define MULADDC_CORE \ - "ld [%%o0], %%o4 \n\t" \ - "inc 4, %%o0 \n\t" \ - "ld [%%o1], %%o5 \n\t" \ - "umul %%o3, %%o4, %%o4 \n\t" \ - "addcc %%o4, %%o2, %%o4 \n\t" \ - "rd %%y, %%g1 \n\t" \ - "addx %%g1, 0, %%g1 \n\t" \ - "addcc %%o4, %%o5, %%o4 \n\t" \ - "st %%o4, [%%o1] \n\t" \ - "addx %%g1, 0, %%o2 \n\t" \ - "inc 4, %%o1 \n\t" - -#define MULADDC_STOP \ - "st %%o2, %0 \n\t" \ - "st %%o1, %1 \n\t" \ - "st %%o0, %2 \n\t" \ - : "=m" (c), "=m" (d), "=m" (s) \ - : "m" (s), "m" (d), "m" (c), "m" (b) \ - : "g1", "o0", "o1", "o2", "o3", "o4", \ - "o5" \ - ); - -#endif /* SPARCv8 */ - -#if defined(__microblaze__) || defined(microblaze) - -#define MULADDC_INIT \ - asm( \ - "lwi r3, %3 \n\t" \ - "lwi r4, %4 \n\t" \ - "lwi r5, %5 \n\t" \ - "lwi r6, %6 \n\t" \ - "andi r7, r6, 0xffff \n\t" \ - "bsrli r6, r6, 16 \n\t" - -#define MULADDC_CORE \ - "lhui r8, r3, 0 \n\t" \ - "addi r3, r3, 2 \n\t" \ - "lhui r9, r3, 0 \n\t" \ - "addi r3, r3, 2 \n\t" \ - "mul r10, r9, r6 \n\t" \ - "mul r11, r8, r7 \n\t" \ - "mul r12, r9, r7 \n\t" \ - "mul r13, r8, r6 \n\t" \ - "bsrli r8, r10, 16 \n\t" \ - "bsrli r9, r11, 16 \n\t" \ - "add r13, r13, r8 \n\t" \ - "add r13, r13, r9 \n\t" \ - "bslli r10, r10, 16 \n\t" \ - "bslli r11, r11, 16 \n\t" \ - "add r12, r12, r10 \n\t" \ - "addc r13, r13, r0 \n\t" \ - "add r12, r12, r11 \n\t" \ - "addc r13, r13, r0 \n\t" \ - "lwi r10, r4, 0 \n\t" \ - "add r12, r12, r10 \n\t" \ - "addc r13, r13, r0 \n\t" \ - "add r12, r12, r5 \n\t" \ - "addc r5, r13, r0 \n\t" \ - "swi r12, r4, 0 \n\t" \ - "addi r4, r4, 4 \n\t" - -#define MULADDC_STOP \ - "swi r5, %0 \n\t" \ - "swi r4, %1 \n\t" \ - "swi r3, %2 \n\t" \ - : "=m" (c), "=m" (d), "=m" (s) \ - : "m" (s), "m" (d), "m" (c), "m" (b) \ - : "r3", "r4" "r5", "r6", "r7", "r8", \ - "r9", "r10", "r11", "r12", "r13" \ - ); - -#endif /* MicroBlaze */ - -#if defined(__tricore__) - -#define MULADDC_INIT \ - asm( \ - "ld.a %%a2, %3 \n\t" \ - "ld.a %%a3, %4 \n\t" \ - "ld.w %%d4, %5 \n\t" \ - "ld.w %%d1, %6 \n\t" \ - "xor %%d5, %%d5 \n\t" - -#define MULADDC_CORE \ - "ld.w %%d0, [%%a2+] \n\t" \ - "madd.u %%e2, %%e4, %%d0, %%d1 \n\t" \ - "ld.w %%d0, [%%a3] \n\t" \ - "addx %%d2, %%d2, %%d0 \n\t" \ - "addc %%d3, %%d3, 0 \n\t" \ - "mov %%d4, %%d3 \n\t" \ - "st.w [%%a3+], %%d2 \n\t" - -#define MULADDC_STOP \ - "st.w %0, %%d4 \n\t" \ - "st.a %1, %%a3 \n\t" \ - "st.a %2, %%a2 \n\t" \ - : "=m" (c), "=m" (d), "=m" (s) \ - : "m" (s), "m" (d), "m" (c), "m" (b) \ - : "d0", "d1", "e2", "d4", "a2", "a3" \ - ); - -#endif /* TriCore */ - -#if defined(__arm__) - -#if defined(__thumb__) && !defined(__thumb2__) - -#define MULADDC_INIT \ - asm( \ - "ldr r0, %3 \n\t" \ - "ldr r1, %4 \n\t" \ - "ldr r2, %5 \n\t" \ - "ldr r3, %6 \n\t" \ - "lsr r7, r3, #16 \n\t" \ - "mov r9, r7 \n\t" \ - "lsl r7, r3, #16 \n\t" \ - "lsr r7, r7, #16 \n\t" \ - "mov r8, r7 \n\t" - -#define MULADDC_CORE \ - "ldmia r0!, {r6} \n\t" \ - "lsr r7, r6, #16 \n\t" \ - "lsl r6, r6, #16 \n\t" \ - "lsr r6, r6, #16 \n\t" \ - "mov r4, r8 \n\t" \ - "mul r4, r6 \n\t" \ - "mov r3, r9 \n\t" \ - "mul r6, r3 \n\t" \ - "mov r5, r9 \n\t" \ - "mul r5, r7 \n\t" \ - "mov r3, r8 \n\t" \ - "mul r7, r3 \n\t" \ - "lsr r3, r6, #16 \n\t" \ - "add r5, r5, r3 \n\t" \ - "lsr r3, r7, #16 \n\t" \ - "add r5, r5, r3 \n\t" \ - "add r4, r4, r2 \n\t" \ - "mov r2, #0 \n\t" \ - "adc r5, r2 \n\t" \ - "lsl r3, r6, #16 \n\t" \ - "add r4, r4, r3 \n\t" \ - "adc r5, r2 \n\t" \ - "lsl r3, r7, #16 \n\t" \ - "add r4, r4, r3 \n\t" \ - "adc r5, r2 \n\t" \ - "ldr r3, [r1] \n\t" \ - "add r4, r4, r3 \n\t" \ - "adc r2, r5 \n\t" \ - "stmia r1!, {r4} \n\t" - -#define MULADDC_STOP \ - "str r2, %0 \n\t" \ - "str r1, %1 \n\t" \ - "str r0, %2 \n\t" \ - : "=m" (c), "=m" (d), "=m" (s) \ - : "m" (s), "m" (d), "m" (c), "m" (b) \ - : "r0", "r1", "r2", "r3", "r4", "r5", \ - "r6", "r7", "r8", "r9", "cc" \ - ); - -#else - -#define MULADDC_INIT \ - asm( \ - "ldr r0, %3 \n\t" \ - "ldr r1, %4 \n\t" \ - "ldr r2, %5 \n\t" \ - "ldr r3, %6 \n\t" - -#define MULADDC_CORE \ - "ldr r4, [r0], #4 \n\t" \ - "mov r5, #0 \n\t" \ - "ldr r6, [r1] \n\t" \ - "umlal r2, r5, r3, r4 \n\t" \ - "adds r7, r6, r2 \n\t" \ - "adc r2, r5, #0 \n\t" \ - "str r7, [r1], #4 \n\t" - -#define MULADDC_STOP \ - "str r2, %0 \n\t" \ - "str r1, %1 \n\t" \ - "str r0, %2 \n\t" \ - : "=m" (c), "=m" (d), "=m" (s) \ - : "m" (s), "m" (d), "m" (c), "m" (b) \ - : "r0", "r1", "r2", "r3", "r4", "r5", \ - "r6", "r7", "cc" \ - ); - -#endif /* Thumb */ - -#endif /* ARMv3 */ - -#if defined(__alpha__) - -#define MULADDC_INIT \ - asm( \ - "ldq $1, %3 \n\t" \ - "ldq $2, %4 \n\t" \ - "ldq $3, %5 \n\t" \ - "ldq $4, %6 \n\t" - -#define MULADDC_CORE \ - "ldq $6, 0($1) \n\t" \ - "addq $1, 8, $1 \n\t" \ - "mulq $6, $4, $7 \n\t" \ - "umulh $6, $4, $6 \n\t" \ - "addq $7, $3, $7 \n\t" \ - "cmpult $7, $3, $3 \n\t" \ - "ldq $5, 0($2) \n\t" \ - "addq $7, $5, $7 \n\t" \ - "cmpult $7, $5, $5 \n\t" \ - "stq $7, 0($2) \n\t" \ - "addq $2, 8, $2 \n\t" \ - "addq $6, $3, $3 \n\t" \ - "addq $5, $3, $3 \n\t" - -#define MULADDC_STOP \ - "stq $3, %0 \n\t" \ - "stq $2, %1 \n\t" \ - "stq $1, %2 \n\t" \ - : "=m" (c), "=m" (d), "=m" (s) \ - : "m" (s), "m" (d), "m" (c), "m" (b) \ - : "$1", "$2", "$3", "$4", "$5", "$6", "$7" \ - ); -#endif /* Alpha */ - -#if defined(__mips__) && !defined(__mips64) - -#define MULADDC_INIT \ - asm( \ - "lw $10, %3 \n\t" \ - "lw $11, %4 \n\t" \ - "lw $12, %5 \n\t" \ - "lw $13, %6 \n\t" - -#define MULADDC_CORE \ - "lw $14, 0($10) \n\t" \ - "multu $13, $14 \n\t" \ - "addi $10, $10, 4 \n\t" \ - "mflo $14 \n\t" \ - "mfhi $9 \n\t" \ - "addu $14, $12, $14 \n\t" \ - "lw $15, 0($11) \n\t" \ - "sltu $12, $14, $12 \n\t" \ - "addu $15, $14, $15 \n\t" \ - "sltu $14, $15, $14 \n\t" \ - "addu $12, $12, $9 \n\t" \ - "sw $15, 0($11) \n\t" \ - "addu $12, $12, $14 \n\t" \ - "addi $11, $11, 4 \n\t" - -#define MULADDC_STOP \ - "sw $12, %0 \n\t" \ - "sw $11, %1 \n\t" \ - "sw $10, %2 \n\t" \ - : "=m" (c), "=m" (d), "=m" (s) \ - : "m" (s), "m" (d), "m" (c), "m" (b) \ - : "$9", "$10", "$11", "$12", "$13", "$14", "$15" \ - ); - -#endif /* MIPS */ -#endif /* GNUC */ - -#if (defined(_MSC_VER) && defined(_M_IX86)) || defined(__WATCOMC__) - -#define MULADDC_INIT \ - __asm mov esi, s \ - __asm mov edi, d \ - __asm mov ecx, c \ - __asm mov ebx, b - -#define MULADDC_CORE \ - __asm lodsd \ - __asm mul ebx \ - __asm add eax, ecx \ - __asm adc edx, 0 \ - __asm add eax, [edi] \ - __asm adc edx, 0 \ - __asm mov ecx, edx \ - __asm stosd - -#if defined(MBEDTLS_HAVE_SSE2) - -#define EMIT __asm _emit - -#define MULADDC_HUIT \ - EMIT 0x0F EMIT 0x6E EMIT 0xC9 \ - EMIT 0x0F EMIT 0x6E EMIT 0xC3 \ - EMIT 0x0F EMIT 0x6E EMIT 0x1F \ - EMIT 0x0F EMIT 0xD4 EMIT 0xCB \ - EMIT 0x0F EMIT 0x6E EMIT 0x16 \ - EMIT 0x0F EMIT 0xF4 EMIT 0xD0 \ - EMIT 0x0F EMIT 0x6E EMIT 0x66 EMIT 0x04 \ - EMIT 0x0F EMIT 0xF4 EMIT 0xE0 \ - EMIT 0x0F EMIT 0x6E EMIT 0x76 EMIT 0x08 \ - EMIT 0x0F EMIT 0xF4 EMIT 0xF0 \ - EMIT 0x0F EMIT 0x6E EMIT 0x7E EMIT 0x0C \ - EMIT 0x0F EMIT 0xF4 EMIT 0xF8 \ - EMIT 0x0F EMIT 0xD4 EMIT 0xCA \ - EMIT 0x0F EMIT 0x6E EMIT 0x5F EMIT 0x04 \ - EMIT 0x0F EMIT 0xD4 EMIT 0xDC \ - EMIT 0x0F EMIT 0x6E EMIT 0x6F EMIT 0x08 \ - EMIT 0x0F EMIT 0xD4 EMIT 0xEE \ - EMIT 0x0F EMIT 0x6E EMIT 0x67 EMIT 0x0C \ - EMIT 0x0F EMIT 0xD4 EMIT 0xFC \ - EMIT 0x0F EMIT 0x7E EMIT 0x0F \ - EMIT 0x0F EMIT 0x6E EMIT 0x56 EMIT 0x10 \ - EMIT 0x0F EMIT 0xF4 EMIT 0xD0 \ - EMIT 0x0F EMIT 0x73 EMIT 0xD1 EMIT 0x20 \ - EMIT 0x0F EMIT 0x6E EMIT 0x66 EMIT 0x14 \ - EMIT 0x0F EMIT 0xF4 EMIT 0xE0 \ - EMIT 0x0F EMIT 0xD4 EMIT 0xCB \ - EMIT 0x0F EMIT 0x6E EMIT 0x76 EMIT 0x18 \ - EMIT 0x0F EMIT 0xF4 EMIT 0xF0 \ - EMIT 0x0F EMIT 0x7E EMIT 0x4F EMIT 0x04 \ - EMIT 0x0F EMIT 0x73 EMIT 0xD1 EMIT 0x20 \ - EMIT 0x0F EMIT 0x6E EMIT 0x5E EMIT 0x1C \ - EMIT 0x0F EMIT 0xF4 EMIT 0xD8 \ - EMIT 0x0F EMIT 0xD4 EMIT 0xCD \ - EMIT 0x0F EMIT 0x6E EMIT 0x6F EMIT 0x10 \ - EMIT 0x0F EMIT 0xD4 EMIT 0xD5 \ - EMIT 0x0F EMIT 0x7E EMIT 0x4F EMIT 0x08 \ - EMIT 0x0F EMIT 0x73 EMIT 0xD1 EMIT 0x20 \ - EMIT 0x0F EMIT 0xD4 EMIT 0xCF \ - EMIT 0x0F EMIT 0x6E EMIT 0x6F EMIT 0x14 \ - EMIT 0x0F EMIT 0xD4 EMIT 0xE5 \ - EMIT 0x0F EMIT 0x7E EMIT 0x4F EMIT 0x0C \ - EMIT 0x0F EMIT 0x73 EMIT 0xD1 EMIT 0x20 \ - EMIT 0x0F EMIT 0xD4 EMIT 0xCA \ - EMIT 0x0F EMIT 0x6E EMIT 0x6F EMIT 0x18 \ - EMIT 0x0F EMIT 0xD4 EMIT 0xF5 \ - EMIT 0x0F EMIT 0x7E EMIT 0x4F EMIT 0x10 \ - EMIT 0x0F EMIT 0x73 EMIT 0xD1 EMIT 0x20 \ - EMIT 0x0F EMIT 0xD4 EMIT 0xCC \ - EMIT 0x0F EMIT 0x6E EMIT 0x6F EMIT 0x1C \ - EMIT 0x0F EMIT 0xD4 EMIT 0xDD \ - EMIT 0x0F EMIT 0x7E EMIT 0x4F EMIT 0x14 \ - EMIT 0x0F EMIT 0x73 EMIT 0xD1 EMIT 0x20 \ - EMIT 0x0F EMIT 0xD4 EMIT 0xCE \ - EMIT 0x0F EMIT 0x7E EMIT 0x4F EMIT 0x18 \ - EMIT 0x0F EMIT 0x73 EMIT 0xD1 EMIT 0x20 \ - EMIT 0x0F EMIT 0xD4 EMIT 0xCB \ - EMIT 0x0F EMIT 0x7E EMIT 0x4F EMIT 0x1C \ - EMIT 0x83 EMIT 0xC7 EMIT 0x20 \ - EMIT 0x83 EMIT 0xC6 EMIT 0x20 \ - EMIT 0x0F EMIT 0x73 EMIT 0xD1 EMIT 0x20 \ - EMIT 0x0F EMIT 0x7E EMIT 0xC9 - -#define MULADDC_STOP \ - EMIT 0x0F EMIT 0x77 \ - __asm mov c, ecx \ - __asm mov d, edi \ - __asm mov s, esi \ - -#else - -#define MULADDC_STOP \ - __asm mov c, ecx \ - __asm mov d, edi \ - __asm mov s, esi \ - -#endif /* SSE2 */ -#endif /* MSVC */ - -#endif /* MBEDTLS_HAVE_ASM */ - -#if !defined(MULADDC_CORE) -#if defined(MBEDTLS_HAVE_UDBL) - -#define MULADDC_INIT \ -{ \ - mbedtls_t_udbl r; \ - mbedtls_mpi_uint r0, r1; - -#define MULADDC_CORE \ - r = *(s++) * (mbedtls_t_udbl) b; \ - r0 = (mbedtls_mpi_uint) r; \ - r1 = (mbedtls_mpi_uint)( r >> biL ); \ - r0 += c; r1 += (r0 < c); \ - r0 += *d; r1 += (r0 < *d); \ - c = r1; *(d++) = r0; - -#define MULADDC_STOP \ -} - -#else -#define MULADDC_INIT \ -{ \ - mbedtls_mpi_uint s0, s1, b0, b1; \ - mbedtls_mpi_uint r0, r1, rx, ry; \ - b0 = ( b << biH ) >> biH; \ - b1 = ( b >> biH ); - -#define MULADDC_CORE \ - s0 = ( *s << biH ) >> biH; \ - s1 = ( *s >> biH ); s++; \ - rx = s0 * b1; r0 = s0 * b0; \ - ry = s1 * b0; r1 = s1 * b1; \ - r1 += ( rx >> biH ); \ - r1 += ( ry >> biH ); \ - rx <<= biH; ry <<= biH; \ - r0 += rx; r1 += (r0 < rx); \ - r0 += ry; r1 += (r0 < ry); \ - r0 += c; r1 += (r0 < c); \ - r0 += *d; r1 += (r0 < *d); \ - c = r1; *(d++) = r0; - -#define MULADDC_STOP \ -} - -#endif /* C (generic) */ -#endif /* C (longlong) */ - -#endif /* bn_mul.h */ diff --git a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/camellia.h b/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/camellia.h deleted file mode 100644 index 0424d623..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/camellia.h +++ /dev/null @@ -1,235 +0,0 @@ -/** - * \file camellia.h - * - * \brief Camellia block cipher - * - * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * This file is part of mbed TLS (https://tls.mbed.org) - */ -#ifndef MBEDTLS_CAMELLIA_H -#define MBEDTLS_CAMELLIA_H - -#if !defined(MBEDTLS_CONFIG_FILE) -#include "config.h" -#else -#include MBEDTLS_CONFIG_FILE -#endif - -#include -#include - -#define MBEDTLS_CAMELLIA_ENCRYPT 1 -#define MBEDTLS_CAMELLIA_DECRYPT 0 - -#define MBEDTLS_ERR_CAMELLIA_INVALID_KEY_LENGTH -0x0024 /**< Invalid key length. */ -#define MBEDTLS_ERR_CAMELLIA_INVALID_INPUT_LENGTH -0x0026 /**< Invalid data input length. */ - -#if !defined(MBEDTLS_CAMELLIA_ALT) -// Regular implementation -// - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * \brief CAMELLIA context structure - */ -typedef struct -{ - int nr; /*!< number of rounds */ - uint32_t rk[68]; /*!< CAMELLIA round keys */ -} -mbedtls_camellia_context; - -/** - * \brief Initialize CAMELLIA context - * - * \param ctx CAMELLIA context to be initialized - */ -void mbedtls_camellia_init( mbedtls_camellia_context *ctx ); - -/** - * \brief Clear CAMELLIA context - * - * \param ctx CAMELLIA context to be cleared - */ -void mbedtls_camellia_free( mbedtls_camellia_context *ctx ); - -/** - * \brief CAMELLIA key schedule (encryption) - * - * \param ctx CAMELLIA context to be initialized - * \param key encryption key - * \param keybits must be 128, 192 or 256 - * - * \return 0 if successful, or MBEDTLS_ERR_CAMELLIA_INVALID_KEY_LENGTH - */ -int mbedtls_camellia_setkey_enc( mbedtls_camellia_context *ctx, const unsigned char *key, - unsigned int keybits ); - -/** - * \brief CAMELLIA key schedule (decryption) - * - * \param ctx CAMELLIA context to be initialized - * \param key decryption key - * \param keybits must be 128, 192 or 256 - * - * \return 0 if successful, or MBEDTLS_ERR_CAMELLIA_INVALID_KEY_LENGTH - */ -int mbedtls_camellia_setkey_dec( mbedtls_camellia_context *ctx, const unsigned char *key, - unsigned int keybits ); - -/** - * \brief CAMELLIA-ECB block encryption/decryption - * - * \param ctx CAMELLIA context - * \param mode MBEDTLS_CAMELLIA_ENCRYPT or MBEDTLS_CAMELLIA_DECRYPT - * \param input 16-byte input block - * \param output 16-byte output block - * - * \return 0 if successful - */ -int mbedtls_camellia_crypt_ecb( mbedtls_camellia_context *ctx, - int mode, - const unsigned char input[16], - unsigned char output[16] ); - -#if defined(MBEDTLS_CIPHER_MODE_CBC) -/** - * \brief CAMELLIA-CBC buffer encryption/decryption - * Length should be a multiple of the block - * size (16 bytes) - * - * \note Upon exit, the content of the IV is updated so that you can - * call the function same function again on the following - * block(s) of data and get the same result as if it was - * encrypted in one call. This allows a "streaming" usage. - * If on the other hand you need to retain the contents of the - * IV, you should either save it manually or use the cipher - * module instead. - * - * \param ctx CAMELLIA context - * \param mode MBEDTLS_CAMELLIA_ENCRYPT or MBEDTLS_CAMELLIA_DECRYPT - * \param length length of the input data - * \param iv initialization vector (updated after use) - * \param input buffer holding the input data - * \param output buffer holding the output data - * - * \return 0 if successful, or - * MBEDTLS_ERR_CAMELLIA_INVALID_INPUT_LENGTH - */ -int mbedtls_camellia_crypt_cbc( mbedtls_camellia_context *ctx, - int mode, - size_t length, - unsigned char iv[16], - const unsigned char *input, - unsigned char *output ); -#endif /* MBEDTLS_CIPHER_MODE_CBC */ - -#if defined(MBEDTLS_CIPHER_MODE_CFB) -/** - * \brief CAMELLIA-CFB128 buffer encryption/decryption - * - * Note: Due to the nature of CFB you should use the same key schedule for - * both encryption and decryption. So a context initialized with - * mbedtls_camellia_setkey_enc() for both MBEDTLS_CAMELLIA_ENCRYPT and CAMELLIE_DECRYPT. - * - * \note Upon exit, the content of the IV is updated so that you can - * call the function same function again on the following - * block(s) of data and get the same result as if it was - * encrypted in one call. This allows a "streaming" usage. - * If on the other hand you need to retain the contents of the - * IV, you should either save it manually or use the cipher - * module instead. - * - * \param ctx CAMELLIA context - * \param mode MBEDTLS_CAMELLIA_ENCRYPT or MBEDTLS_CAMELLIA_DECRYPT - * \param length length of the input data - * \param iv_off offset in IV (updated after use) - * \param iv initialization vector (updated after use) - * \param input buffer holding the input data - * \param output buffer holding the output data - * - * \return 0 if successful, or - * MBEDTLS_ERR_CAMELLIA_INVALID_INPUT_LENGTH - */ -int mbedtls_camellia_crypt_cfb128( mbedtls_camellia_context *ctx, - int mode, - size_t length, - size_t *iv_off, - unsigned char iv[16], - const unsigned char *input, - unsigned char *output ); -#endif /* MBEDTLS_CIPHER_MODE_CFB */ - -#if defined(MBEDTLS_CIPHER_MODE_CTR) -/** - * \brief CAMELLIA-CTR buffer encryption/decryption - * - * Warning: You have to keep the maximum use of your counter in mind! - * - * Note: Due to the nature of CTR you should use the same key schedule for - * both encryption and decryption. So a context initialized with - * mbedtls_camellia_setkey_enc() for both MBEDTLS_CAMELLIA_ENCRYPT and MBEDTLS_CAMELLIA_DECRYPT. - * - * \param ctx CAMELLIA context - * \param length The length of the data - * \param nc_off The offset in the current stream_block (for resuming - * within current cipher stream). The offset pointer to - * should be 0 at the start of a stream. - * \param nonce_counter The 128-bit nonce and counter. - * \param stream_block The saved stream-block for resuming. Is overwritten - * by the function. - * \param input The input data stream - * \param output The output data stream - * - * \return 0 if successful - */ -int mbedtls_camellia_crypt_ctr( mbedtls_camellia_context *ctx, - size_t length, - size_t *nc_off, - unsigned char nonce_counter[16], - unsigned char stream_block[16], - const unsigned char *input, - unsigned char *output ); -#endif /* MBEDTLS_CIPHER_MODE_CTR */ - -#ifdef __cplusplus -} -#endif - -#else /* MBEDTLS_CAMELLIA_ALT */ -#include "camellia_alt.h" -#endif /* MBEDTLS_CAMELLIA_ALT */ - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * \brief Checkup routine - * - * \return 0 if successful, or 1 if the test failed - */ -int mbedtls_camellia_self_test( int verbose ); - -#ifdef __cplusplus -} -#endif - -#endif /* camellia.h */ diff --git a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/ccm.h b/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/ccm.h deleted file mode 100644 index ef75839b..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/ccm.h +++ /dev/null @@ -1,141 +0,0 @@ -/** - * \file ccm.h - * - * \brief Counter with CBC-MAC (CCM) for 128-bit block ciphers - * - * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * This file is part of mbed TLS (https://tls.mbed.org) - */ -#ifndef MBEDTLS_CCM_H -#define MBEDTLS_CCM_H - -#include "cipher.h" - -#define MBEDTLS_ERR_CCM_BAD_INPUT -0x000D /**< Bad input parameters to function. */ -#define MBEDTLS_ERR_CCM_AUTH_FAILED -0x000F /**< Authenticated decryption failed. */ - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * \brief CCM context structure - */ -typedef struct { - mbedtls_cipher_context_t cipher_ctx; /*!< cipher context used */ -} -mbedtls_ccm_context; - -/** - * \brief Initialize CCM context (just makes references valid) - * Makes the context ready for mbedtls_ccm_setkey() or - * mbedtls_ccm_free(). - * - * \param ctx CCM context to initialize - */ -void mbedtls_ccm_init( mbedtls_ccm_context *ctx ); - -/** - * \brief CCM initialization (encryption and decryption) - * - * \param ctx CCM context to be initialized - * \param cipher cipher to use (a 128-bit block cipher) - * \param key encryption key - * \param keybits key size in bits (must be acceptable by the cipher) - * - * \return 0 if successful, or a cipher specific error code - */ -int mbedtls_ccm_setkey( mbedtls_ccm_context *ctx, - mbedtls_cipher_id_t cipher, - const unsigned char *key, - unsigned int keybits ); - -/** - * \brief Free a CCM context and underlying cipher sub-context - * - * \param ctx CCM context to free - */ -void mbedtls_ccm_free( mbedtls_ccm_context *ctx ); - -/** - * \brief CCM buffer encryption - * - * \param ctx CCM context - * \param length length of the input data in bytes - * \param iv nonce (initialization vector) - * \param iv_len length of IV in bytes - * must be 2, 3, 4, 5, 6, 7 or 8 - * \param add additional data - * \param add_len length of additional data in bytes - * must be less than 2^16 - 2^8 - * \param input buffer holding the input data - * \param output buffer for holding the output data - * must be at least 'length' bytes wide - * \param tag buffer for holding the tag - * \param tag_len length of the tag to generate in bytes - * must be 4, 6, 8, 10, 14 or 16 - * - * \note The tag is written to a separate buffer. To get the tag - * concatenated with the output as in the CCM spec, use - * tag = output + length and make sure the output buffer is - * at least length + tag_len wide. - * - * \return 0 if successful - */ -int mbedtls_ccm_encrypt_and_tag( mbedtls_ccm_context *ctx, size_t length, - const unsigned char *iv, size_t iv_len, - const unsigned char *add, size_t add_len, - const unsigned char *input, unsigned char *output, - unsigned char *tag, size_t tag_len ); - -/** - * \brief CCM buffer authenticated decryption - * - * \param ctx CCM context - * \param length length of the input data - * \param iv initialization vector - * \param iv_len length of IV - * \param add additional data - * \param add_len length of additional data - * \param input buffer holding the input data - * \param output buffer for holding the output data - * \param tag buffer holding the tag - * \param tag_len length of the tag - * - * \return 0 if successful and authenticated, - * MBEDTLS_ERR_CCM_AUTH_FAILED if tag does not match - */ -int mbedtls_ccm_auth_decrypt( mbedtls_ccm_context *ctx, size_t length, - const unsigned char *iv, size_t iv_len, - const unsigned char *add, size_t add_len, - const unsigned char *input, unsigned char *output, - const unsigned char *tag, size_t tag_len ); - -#if defined(MBEDTLS_SELF_TEST) && defined(MBEDTLS_AES_C) -/** - * \brief Checkup routine - * - * \return 0 if successful, or 1 if the test failed - */ -int mbedtls_ccm_self_test( int verbose ); -#endif /* MBEDTLS_SELF_TEST && MBEDTLS_AES_C */ - -#ifdef __cplusplus -} -#endif - -#endif /* MBEDTLS_CCM_H */ diff --git a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/certs.h b/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/certs.h deleted file mode 100644 index ca49086e..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/certs.h +++ /dev/null @@ -1,99 +0,0 @@ -/** - * \file certs.h - * - * \brief Sample certificates and DHM parameters for testing - * - * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * This file is part of mbed TLS (https://tls.mbed.org) - */ -#ifndef MBEDTLS_CERTS_H -#define MBEDTLS_CERTS_H - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -#if defined(MBEDTLS_PEM_PARSE_C) -/* Concatenation of all CA certificates in PEM format if available */ -extern const char mbedtls_test_cas_pem[]; -extern const size_t mbedtls_test_cas_pem_len; -#endif - -/* List of all CA certificates, terminated by NULL */ -extern const char * mbedtls_test_cas[]; -extern const size_t mbedtls_test_cas_len[]; - -/* - * Convenience for users who just want a certificate: - * RSA by default, or ECDSA if RSA is not available - */ -extern const char * mbedtls_test_ca_crt; -extern const size_t mbedtls_test_ca_crt_len; -extern const char * mbedtls_test_ca_key; -extern const size_t mbedtls_test_ca_key_len; -extern const char * mbedtls_test_ca_pwd; -extern const size_t mbedtls_test_ca_pwd_len; -extern const char * mbedtls_test_srv_crt; -extern const size_t mbedtls_test_srv_crt_len; -extern const char * mbedtls_test_srv_key; -extern const size_t mbedtls_test_srv_key_len; -extern const char * mbedtls_test_cli_crt; -extern const size_t mbedtls_test_cli_crt_len; -extern const char * mbedtls_test_cli_key; -extern const size_t mbedtls_test_cli_key_len; - -#if defined(MBEDTLS_ECDSA_C) -extern const char mbedtls_test_ca_crt_ec[]; -extern const size_t mbedtls_test_ca_crt_ec_len; -extern const char mbedtls_test_ca_key_ec[]; -extern const size_t mbedtls_test_ca_key_ec_len; -extern const char mbedtls_test_ca_pwd_ec[]; -extern const size_t mbedtls_test_ca_pwd_ec_len; -extern const char mbedtls_test_srv_crt_ec[]; -extern const size_t mbedtls_test_srv_crt_ec_len; -extern const char mbedtls_test_srv_key_ec[]; -extern const size_t mbedtls_test_srv_key_ec_len; -extern const char mbedtls_test_cli_crt_ec[]; -extern const size_t mbedtls_test_cli_crt_ec_len; -extern const char mbedtls_test_cli_key_ec[]; -extern const size_t mbedtls_test_cli_key_ec_len; -#endif - -#if defined(MBEDTLS_RSA_C) -extern const char mbedtls_test_ca_crt_rsa[]; -extern const size_t mbedtls_test_ca_crt_rsa_len; -extern const char mbedtls_test_ca_key_rsa[]; -extern const size_t mbedtls_test_ca_key_rsa_len; -extern const char mbedtls_test_ca_pwd_rsa[]; -extern const size_t mbedtls_test_ca_pwd_rsa_len; -extern const char mbedtls_test_srv_crt_rsa[]; -extern const size_t mbedtls_test_srv_crt_rsa_len; -extern const char mbedtls_test_srv_key_rsa[]; -extern const size_t mbedtls_test_srv_key_rsa_len; -extern const char mbedtls_test_cli_crt_rsa[]; -extern const size_t mbedtls_test_cli_crt_rsa_len; -extern const char mbedtls_test_cli_key_rsa[]; -extern const size_t mbedtls_test_cli_key_rsa_len; -#endif - -#ifdef __cplusplus -} -#endif - -#endif /* certs.h */ diff --git a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/check_config.h b/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/check_config.h deleted file mode 100644 index 8dadbe1c..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/check_config.h +++ /dev/null @@ -1,529 +0,0 @@ -/** - * \file check_config.h - * - * \brief Consistency checks for configuration options - * - * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * This file is part of mbed TLS (https://tls.mbed.org) - */ - -/* - * It is recommended to include this file from your config.h - * in order to catch dependency issues early. - */ - -#ifndef MBEDTLS_CHECK_CONFIG_H -#define MBEDTLS_CHECK_CONFIG_H - -/* - * We assume CHAR_BIT is 8 in many places. In practice, this is true on our - * target platforms, so not an issue, but let's just be extra sure. - */ -#include -#if CHAR_BIT != 8 -#error "mbed TLS requires a platform with 8-bit chars" -#endif - -#if defined(_WIN32) -#if !defined(MBEDTLS_PLATFORM_C) -#error "MBEDTLS_PLATFORM_C is required on Windows" -#endif - -/* Fix the config here. Not convenient to put an #ifdef _WIN32 in config.h as - * it would confuse config.pl. */ -#if !defined(MBEDTLS_PLATFORM_SNPRINTF_ALT) && \ - !defined(MBEDTLS_PLATFORM_SNPRINTF_MACRO) -#define MBEDTLS_PLATFORM_SNPRINTF_ALT -#endif -#endif /* _WIN32 */ - -#if defined(TARGET_LIKE_MBED) && \ - ( defined(MBEDTLS_NET_C) || defined(MBEDTLS_TIMING_C) ) -#error "The NET and TIMING modules are not available for mbed OS - please use the network and timing functions provided by mbed OS" -#endif - -#if defined(MBEDTLS_DEPRECATED_WARNING) && \ - !defined(__GNUC__) && !defined(__clang__) -#error "MBEDTLS_DEPRECATED_WARNING only works with GCC and Clang" -#endif - -#if defined(MBEDTLS_HAVE_TIME_DATE) && !defined(MBEDTLS_HAVE_TIME) -#error "MBEDTLS_HAVE_TIME_DATE without MBEDTLS_HAVE_TIME does not make sense" -#endif - -#if defined(MBEDTLS_AESNI_C) && !defined(MBEDTLS_HAVE_ASM) -#error "MBEDTLS_AESNI_C defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_CTR_DRBG_C) && !defined(MBEDTLS_AES_C) -#error "MBEDTLS_CTR_DRBG_C defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_DHM_C) && !defined(MBEDTLS_BIGNUM_C) -#error "MBEDTLS_DHM_C defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_ECDH_C) && !defined(MBEDTLS_ECP_C) -#error "MBEDTLS_ECDH_C defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_ECDSA_C) && \ - ( !defined(MBEDTLS_ECP_C) || \ - !defined(MBEDTLS_ASN1_PARSE_C) || \ - !defined(MBEDTLS_ASN1_WRITE_C) ) -#error "MBEDTLS_ECDSA_C defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_ECDSA_DETERMINISTIC) && !defined(MBEDTLS_HMAC_DRBG_C) -#error "MBEDTLS_ECDSA_DETERMINISTIC defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_ECP_C) && ( !defined(MBEDTLS_BIGNUM_C) || ( \ - !defined(MBEDTLS_ECP_DP_SECP192R1_ENABLED) && \ - !defined(MBEDTLS_ECP_DP_SECP224R1_ENABLED) && \ - !defined(MBEDTLS_ECP_DP_SECP256R1_ENABLED) && \ - !defined(MBEDTLS_ECP_DP_SECP384R1_ENABLED) && \ - !defined(MBEDTLS_ECP_DP_SECP521R1_ENABLED) && \ - !defined(MBEDTLS_ECP_DP_BP256R1_ENABLED) && \ - !defined(MBEDTLS_ECP_DP_BP384R1_ENABLED) && \ - !defined(MBEDTLS_ECP_DP_BP512R1_ENABLED) && \ - !defined(MBEDTLS_ECP_DP_SECP192K1_ENABLED) && \ - !defined(MBEDTLS_ECP_DP_SECP224K1_ENABLED) && \ - !defined(MBEDTLS_ECP_DP_SECP256K1_ENABLED) ) ) -#error "MBEDTLS_ECP_C defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_ENTROPY_C) && (!defined(MBEDTLS_SHA512_C) && \ - !defined(MBEDTLS_SHA256_C)) -#error "MBEDTLS_ENTROPY_C defined, but not all prerequisites" -#endif -#if defined(MBEDTLS_ENTROPY_C) && defined(MBEDTLS_SHA512_C) && \ - defined(MBEDTLS_CTR_DRBG_ENTROPY_LEN) && (MBEDTLS_CTR_DRBG_ENTROPY_LEN > 64) -#error "MBEDTLS_CTR_DRBG_ENTROPY_LEN value too high" -#endif -#if defined(MBEDTLS_ENTROPY_C) && \ - ( !defined(MBEDTLS_SHA512_C) || defined(MBEDTLS_ENTROPY_FORCE_SHA256) ) \ - && defined(MBEDTLS_CTR_DRBG_ENTROPY_LEN) && (MBEDTLS_CTR_DRBG_ENTROPY_LEN > 32) -#error "MBEDTLS_CTR_DRBG_ENTROPY_LEN value too high" -#endif -#if defined(MBEDTLS_ENTROPY_C) && \ - defined(MBEDTLS_ENTROPY_FORCE_SHA256) && !defined(MBEDTLS_SHA256_C) -#error "MBEDTLS_ENTROPY_FORCE_SHA256 defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_GCM_C) && ( \ - !defined(MBEDTLS_AES_C) && !defined(MBEDTLS_CAMELLIA_C) ) -#error "MBEDTLS_GCM_C defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_HAVEGE_C) && !defined(MBEDTLS_TIMING_C) -#error "MBEDTLS_HAVEGE_C defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_HMAC_DRBG_C) && !defined(MBEDTLS_MD_C) -#error "MBEDTLS_HMAC_DRBG_C defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED) && \ - ( !defined(MBEDTLS_ECDH_C) || !defined(MBEDTLS_X509_CRT_PARSE_C) ) -#error "MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) && \ - ( !defined(MBEDTLS_ECDH_C) || !defined(MBEDTLS_X509_CRT_PARSE_C) ) -#error "MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED) && !defined(MBEDTLS_DHM_C) -#error "MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED) && \ - !defined(MBEDTLS_ECDH_C) -#error "MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED) && \ - ( !defined(MBEDTLS_DHM_C) || !defined(MBEDTLS_RSA_C) || \ - !defined(MBEDTLS_X509_CRT_PARSE_C) || !defined(MBEDTLS_PKCS1_V15) ) -#error "MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) && \ - ( !defined(MBEDTLS_ECDH_C) || !defined(MBEDTLS_RSA_C) || \ - !defined(MBEDTLS_X509_CRT_PARSE_C) || !defined(MBEDTLS_PKCS1_V15) ) -#error "MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED) && \ - ( !defined(MBEDTLS_ECDH_C) || !defined(MBEDTLS_ECDSA_C) || \ - !defined(MBEDTLS_X509_CRT_PARSE_C) ) -#error "MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED) && \ - ( !defined(MBEDTLS_RSA_C) || !defined(MBEDTLS_X509_CRT_PARSE_C) || \ - !defined(MBEDTLS_PKCS1_V15) ) -#error "MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED) && \ - ( !defined(MBEDTLS_RSA_C) || !defined(MBEDTLS_X509_CRT_PARSE_C) || \ - !defined(MBEDTLS_PKCS1_V15) ) -#error "MBEDTLS_KEY_EXCHANGE_RSA_ENABLED defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_MEMORY_BUFFER_ALLOC_C) && \ - ( !defined(MBEDTLS_PLATFORM_C) || !defined(MBEDTLS_PLATFORM_MEMORY) ) -#error "MBEDTLS_MEMORY_BUFFER_ALLOC_C defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_PADLOCK_C) && !defined(MBEDTLS_HAVE_ASM) -#error "MBEDTLS_PADLOCK_C defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_PEM_PARSE_C) && !defined(MBEDTLS_BASE64_C) -#error "MBEDTLS_PEM_PARSE_C defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_PEM_WRITE_C) && !defined(MBEDTLS_BASE64_C) -#error "MBEDTLS_PEM_WRITE_C defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_PK_C) && \ - ( !defined(MBEDTLS_RSA_C) && !defined(MBEDTLS_ECP_C) ) -#error "MBEDTLS_PK_C defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_PK_PARSE_C) && !defined(MBEDTLS_PK_C) -#error "MBEDTLS_PK_PARSE_C defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_PK_WRITE_C) && !defined(MBEDTLS_PK_C) -#error "MBEDTLS_PK_WRITE_C defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_PKCS11_C) && !defined(MBEDTLS_PK_C) -#error "MBEDTLS_PKCS11_C defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_PLATFORM_EXIT_ALT) && !defined(MBEDTLS_PLATFORM_C) -#error "MBEDTLS_PLATFORM_EXIT_ALT defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_PLATFORM_EXIT_MACRO) && !defined(MBEDTLS_PLATFORM_C) -#error "MBEDTLS_PLATFORM_EXIT_MACRO defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_PLATFORM_EXIT_MACRO) &&\ - ( defined(MBEDTLS_PLATFORM_STD_EXIT) ||\ - defined(MBEDTLS_PLATFORM_EXIT_ALT) ) -#error "MBEDTLS_PLATFORM_EXIT_MACRO and MBEDTLS_PLATFORM_STD_EXIT/MBEDTLS_PLATFORM_EXIT_ALT cannot be defined simultaneously" -#endif - -#if defined(MBEDTLS_PLATFORM_FPRINTF_ALT) && !defined(MBEDTLS_PLATFORM_C) -#error "MBEDTLS_PLATFORM_FPRINTF_ALT defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_PLATFORM_FPRINTF_MACRO) && !defined(MBEDTLS_PLATFORM_C) -#error "MBEDTLS_PLATFORM_FPRINTF_MACRO defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_PLATFORM_FPRINTF_MACRO) &&\ - ( defined(MBEDTLS_PLATFORM_STD_FPRINTF) ||\ - defined(MBEDTLS_PLATFORM_FPRINTF_ALT) ) -#error "MBEDTLS_PLATFORM_FPRINTF_MACRO and MBEDTLS_PLATFORM_STD_FPRINTF/MBEDTLS_PLATFORM_FPRINTF_ALT cannot be defined simultaneously" -#endif - -#if defined(MBEDTLS_PLATFORM_FREE_MACRO) &&\ - ( !defined(MBEDTLS_PLATFORM_C) || !defined(MBEDTLS_PLATFORM_MEMORY) ) -#error "MBEDTLS_PLATFORM_FREE_MACRO defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_PLATFORM_FREE_MACRO) &&\ - defined(MBEDTLS_PLATFORM_STD_FREE) -#error "MBEDTLS_PLATFORM_FREE_MACRO and MBEDTLS_PLATFORM_STD_FREE cannot be defined simultaneously" -#endif - -#if defined(MBEDTLS_PLATFORM_FREE_MACRO) && !defined(MBEDTLS_PLATFORM_CALLOC_MACRO) -#error "MBEDTLS_PLATFORM_CALLOC_MACRO must be defined if MBEDTLS_PLATFORM_FREE_MACRO is" -#endif - -#if defined(MBEDTLS_PLATFORM_CALLOC_MACRO) &&\ - ( !defined(MBEDTLS_PLATFORM_C) || !defined(MBEDTLS_PLATFORM_MEMORY) ) -#error "MBEDTLS_PLATFORM_CALLOC_MACRO defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_PLATFORM_CALLOC_MACRO) &&\ - defined(MBEDTLS_PLATFORM_STD_CALLOC) -#error "MBEDTLS_PLATFORM_CALLOC_MACRO and MBEDTLS_PLATFORM_STD_CALLOC cannot be defined simultaneously" -#endif - -#if defined(MBEDTLS_PLATFORM_CALLOC_MACRO) && !defined(MBEDTLS_PLATFORM_FREE_MACRO) -#error "MBEDTLS_PLATFORM_FREE_MACRO must be defined if MBEDTLS_PLATFORM_CALLOC_MACRO is" -#endif - -#if defined(MBEDTLS_PLATFORM_MEMORY) && !defined(MBEDTLS_PLATFORM_C) -#error "MBEDTLS_PLATFORM_MEMORY defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_PLATFORM_PRINTF_ALT) && !defined(MBEDTLS_PLATFORM_C) -#error "MBEDTLS_PLATFORM_PRINTF_ALT defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_PLATFORM_PRINTF_MACRO) && !defined(MBEDTLS_PLATFORM_C) -#error "MBEDTLS_PLATFORM_PRINTF_MACRO defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_PLATFORM_PRINTF_MACRO) &&\ - ( defined(MBEDTLS_PLATFORM_STD_PRINTF) ||\ - defined(MBEDTLS_PLATFORM_PRINTF_ALT) ) -#error "MBEDTLS_PLATFORM_PRINTF_MACRO and MBEDTLS_PLATFORM_STD_PRINTF/MBEDTLS_PLATFORM_PRINTF_ALT cannot be defined simultaneously" -#endif - -#if defined(MBEDTLS_PLATFORM_SNPRINTF_ALT) && !defined(MBEDTLS_PLATFORM_C) -#error "MBEDTLS_PLATFORM_SNPRINTF_ALT defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_PLATFORM_SNPRINTF_MACRO) && !defined(MBEDTLS_PLATFORM_C) -#error "MBEDTLS_PLATFORM_SNPRINTF_MACRO defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_PLATFORM_SNPRINTF_MACRO) &&\ - ( defined(MBEDTLS_PLATFORM_STD_SNPRINTF) ||\ - defined(MBEDTLS_PLATFORM_SNPRINTF_ALT) ) -#error "MBEDTLS_PLATFORM_SNPRINTF_MACRO and MBEDTLS_PLATFORM_STD_SNPRINTF/MBEDTLS_PLATFORM_SNPRINTF_ALT cannot be defined simultaneously" -#endif - -#if defined(MBEDTLS_PLATFORM_STD_MEM_HDR) &&\ - !defined(MBEDTLS_PLATFORM_NO_STD_FUNCTIONS) -#error "MBEDTLS_PLATFORM_STD_MEM_HDR defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_PLATFORM_STD_CALLOC) && !defined(MBEDTLS_PLATFORM_MEMORY) -#error "MBEDTLS_PLATFORM_STD_CALLOC defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_PLATFORM_STD_CALLOC) && !defined(MBEDTLS_PLATFORM_MEMORY) -#error "MBEDTLS_PLATFORM_STD_CALLOC defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_PLATFORM_STD_FREE) && !defined(MBEDTLS_PLATFORM_MEMORY) -#error "MBEDTLS_PLATFORM_STD_FREE defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_PLATFORM_STD_EXIT) &&\ - !defined(MBEDTLS_PLATFORM_EXIT_ALT) -#error "MBEDTLS_PLATFORM_STD_EXIT defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_PLATFORM_STD_FPRINTF) &&\ - !defined(MBEDTLS_PLATFORM_FPRINTF_ALT) -#error "MBEDTLS_PLATFORM_STD_FPRINTF defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_PLATFORM_STD_PRINTF) &&\ - !defined(MBEDTLS_PLATFORM_PRINTF_ALT) -#error "MBEDTLS_PLATFORM_STD_PRINTF defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_PLATFORM_STD_SNPRINTF) &&\ - !defined(MBEDTLS_PLATFORM_SNPRINTF_ALT) -#error "MBEDTLS_PLATFORM_STD_SNPRINTF defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_RSA_C) && ( !defined(MBEDTLS_BIGNUM_C) || \ - !defined(MBEDTLS_OID_C) ) -#error "MBEDTLS_RSA_C defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_X509_RSASSA_PSS_SUPPORT) && \ - ( !defined(MBEDTLS_RSA_C) || !defined(MBEDTLS_PKCS1_V21) ) -#error "MBEDTLS_X509_RSASSA_PSS_SUPPORT defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_SSL_PROTO_SSL3) && ( !defined(MBEDTLS_MD5_C) || \ - !defined(MBEDTLS_SHA1_C) ) -#error "MBEDTLS_SSL_PROTO_SSL3 defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_SSL_PROTO_TLS1) && ( !defined(MBEDTLS_MD5_C) || \ - !defined(MBEDTLS_SHA1_C) ) -#error "MBEDTLS_SSL_PROTO_TLS1 defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_SSL_PROTO_TLS1_1) && ( !defined(MBEDTLS_MD5_C) || \ - !defined(MBEDTLS_SHA1_C) ) -#error "MBEDTLS_SSL_PROTO_TLS1_1 defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_SSL_PROTO_TLS1_2) && ( !defined(MBEDTLS_SHA1_C) && \ - !defined(MBEDTLS_SHA256_C) && !defined(MBEDTLS_SHA512_C) ) -#error "MBEDTLS_SSL_PROTO_TLS1_2 defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_SSL_PROTO_DTLS) && \ - !defined(MBEDTLS_SSL_PROTO_TLS1_1) && \ - !defined(MBEDTLS_SSL_PROTO_TLS1_2) -#error "MBEDTLS_SSL_PROTO_DTLS defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_SSL_CLI_C) && !defined(MBEDTLS_SSL_TLS_C) -#error "MBEDTLS_SSL_CLI_C defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_SSL_TLS_C) && ( !defined(MBEDTLS_CIPHER_C) || \ - !defined(MBEDTLS_MD_C) ) -#error "MBEDTLS_SSL_TLS_C defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_SSL_SRV_C) && !defined(MBEDTLS_SSL_TLS_C) -#error "MBEDTLS_SSL_SRV_C defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_SSL_TLS_C) && (!defined(MBEDTLS_SSL_PROTO_SSL3) && \ - !defined(MBEDTLS_SSL_PROTO_TLS1) && !defined(MBEDTLS_SSL_PROTO_TLS1_1) && \ - !defined(MBEDTLS_SSL_PROTO_TLS1_2)) -#error "MBEDTLS_SSL_TLS_C defined, but no protocols are active" -#endif - -#if defined(MBEDTLS_SSL_TLS_C) && (defined(MBEDTLS_SSL_PROTO_SSL3) && \ - defined(MBEDTLS_SSL_PROTO_TLS1_1) && !defined(MBEDTLS_SSL_PROTO_TLS1)) -#error "Illegal protocol selection" -#endif - -#if defined(MBEDTLS_SSL_TLS_C) && (defined(MBEDTLS_SSL_PROTO_TLS1) && \ - defined(MBEDTLS_SSL_PROTO_TLS1_2) && !defined(MBEDTLS_SSL_PROTO_TLS1_1)) -#error "Illegal protocol selection" -#endif - -#if defined(MBEDTLS_SSL_TLS_C) && (defined(MBEDTLS_SSL_PROTO_SSL3) && \ - defined(MBEDTLS_SSL_PROTO_TLS1_2) && (!defined(MBEDTLS_SSL_PROTO_TLS1) || \ - !defined(MBEDTLS_SSL_PROTO_TLS1_1))) -#error "Illegal protocol selection" -#endif - -#if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY) && !defined(MBEDTLS_SSL_PROTO_DTLS) -#error "MBEDTLS_SSL_DTLS_HELLO_VERIFY defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_SSL_DTLS_CLIENT_PORT_REUSE) && \ - !defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY) -#error "MBEDTLS_SSL_DTLS_CLIENT_PORT_REUSE defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY) && \ - ( !defined(MBEDTLS_SSL_TLS_C) || !defined(MBEDTLS_SSL_PROTO_DTLS) ) -#error "MBEDTLS_SSL_DTLS_ANTI_REPLAY defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_SSL_DTLS_BADMAC_LIMIT) && \ - ( !defined(MBEDTLS_SSL_TLS_C) || !defined(MBEDTLS_SSL_PROTO_DTLS) ) -#error "MBEDTLS_SSL_DTLS_BADMAC_LIMIT defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC) && \ - !defined(MBEDTLS_SSL_PROTO_TLS1) && \ - !defined(MBEDTLS_SSL_PROTO_TLS1_1) && \ - !defined(MBEDTLS_SSL_PROTO_TLS1_2) -#error "MBEDTLS_SSL_ENCRYPT_THEN_MAC defined, but not all prerequsites" -#endif - -#if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET) && \ - !defined(MBEDTLS_SSL_PROTO_TLS1) && \ - !defined(MBEDTLS_SSL_PROTO_TLS1_1) && \ - !defined(MBEDTLS_SSL_PROTO_TLS1_2) -#error "MBEDTLS_SSL_EXTENDED_MASTER_SECRET defined, but not all prerequsites" -#endif - -#if defined(MBEDTLS_SSL_TICKET_C) && !defined(MBEDTLS_CIPHER_C) -#error "MBEDTLS_SSL_TICKET_C defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_SSL_CBC_RECORD_SPLITTING) && \ - !defined(MBEDTLS_SSL_PROTO_SSL3) && !defined(MBEDTLS_SSL_PROTO_TLS1) -#error "MBEDTLS_SSL_CBC_RECORD_SPLITTING defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION) && \ - !defined(MBEDTLS_X509_CRT_PARSE_C) -#error "MBEDTLS_SSL_SERVER_NAME_INDICATION defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_THREADING_PTHREAD) -#if !defined(MBEDTLS_THREADING_C) || defined(MBEDTLS_THREADING_IMPL) -#error "MBEDTLS_THREADING_PTHREAD defined, but not all prerequisites" -#endif -#define MBEDTLS_THREADING_IMPL -#endif - -#if defined(MBEDTLS_THREADING_ALT) -#if !defined(MBEDTLS_THREADING_C) || defined(MBEDTLS_THREADING_IMPL) -#error "MBEDTLS_THREADING_ALT defined, but not all prerequisites" -#endif -#define MBEDTLS_THREADING_IMPL -#endif - -#if defined(MBEDTLS_THREADING_C) && !defined(MBEDTLS_THREADING_IMPL) -#error "MBEDTLS_THREADING_C defined, single threading implementation required" -#endif -#undef MBEDTLS_THREADING_IMPL - -#if defined(MBEDTLS_VERSION_FEATURES) && !defined(MBEDTLS_VERSION_C) -#error "MBEDTLS_VERSION_FEATURES defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_X509_USE_C) && ( !defined(MBEDTLS_BIGNUM_C) || \ - !defined(MBEDTLS_OID_C) || !defined(MBEDTLS_ASN1_PARSE_C) || \ - !defined(MBEDTLS_PK_PARSE_C) ) -#error "MBEDTLS_X509_USE_C defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_X509_CREATE_C) && ( !defined(MBEDTLS_BIGNUM_C) || \ - !defined(MBEDTLS_OID_C) || !defined(MBEDTLS_ASN1_WRITE_C) || \ - !defined(MBEDTLS_PK_WRITE_C) ) -#error "MBEDTLS_X509_CREATE_C defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_X509_CRT_PARSE_C) && ( !defined(MBEDTLS_X509_USE_C) ) -#error "MBEDTLS_X509_CRT_PARSE_C defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_X509_CRL_PARSE_C) && ( !defined(MBEDTLS_X509_USE_C) ) -#error "MBEDTLS_X509_CRL_PARSE_C defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_X509_CSR_PARSE_C) && ( !defined(MBEDTLS_X509_USE_C) ) -#error "MBEDTLS_X509_CSR_PARSE_C defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_X509_CRT_WRITE_C) && ( !defined(MBEDTLS_X509_CREATE_C) ) -#error "MBEDTLS_X509_CRT_WRITE_C defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_X509_CSR_WRITE_C) && ( !defined(MBEDTLS_X509_CREATE_C) ) -#error "MBEDTLS_X509_CSR_WRITE_C defined, but not all prerequisites" -#endif - -/* - * Avoid warning from -pedantic. This is a convenient place for this - * workaround since this is included by every single file before the - * #if defined(MBEDTLS_xxx_C) that results in emtpy translation units. - */ -typedef int mbedtls_iso_c_forbids_empty_translation_units; - -#endif /* MBEDTLS_CHECK_CONFIG_H */ diff --git a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/cipher.h b/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/cipher.h deleted file mode 100644 index 70000f5e..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/cipher.h +++ /dev/null @@ -1,698 +0,0 @@ -/** - * \file cipher.h - * - * \brief Generic cipher wrapper. - * - * \author Adriaan de Jong - * - * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * This file is part of mbed TLS (https://tls.mbed.org) - */ - -#ifndef MBEDTLS_CIPHER_H -#define MBEDTLS_CIPHER_H - -#if !defined(MBEDTLS_CONFIG_FILE) -#include "config.h" -#else -#include MBEDTLS_CONFIG_FILE -#endif - -#include - -#if defined(MBEDTLS_GCM_C) || defined(MBEDTLS_CCM_C) -#define MBEDTLS_CIPHER_MODE_AEAD -#endif - -#if defined(MBEDTLS_CIPHER_MODE_CBC) -#define MBEDTLS_CIPHER_MODE_WITH_PADDING -#endif - -#if defined(MBEDTLS_ARC4_C) -#define MBEDTLS_CIPHER_MODE_STREAM -#endif - -#if ( defined(__ARMCC_VERSION) || defined(_MSC_VER) ) && \ - !defined(inline) && !defined(__cplusplus) -#define inline __inline -#endif - -#define MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE -0x6080 /**< The selected feature is not available. */ -#define MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA -0x6100 /**< Bad input parameters to function. */ -#define MBEDTLS_ERR_CIPHER_ALLOC_FAILED -0x6180 /**< Failed to allocate memory. */ -#define MBEDTLS_ERR_CIPHER_INVALID_PADDING -0x6200 /**< Input data contains invalid padding and is rejected. */ -#define MBEDTLS_ERR_CIPHER_FULL_BLOCK_EXPECTED -0x6280 /**< Decryption of block requires a full block. */ -#define MBEDTLS_ERR_CIPHER_AUTH_FAILED -0x6300 /**< Authentication failed (for AEAD modes). */ - -#define MBEDTLS_CIPHER_VARIABLE_IV_LEN 0x01 /**< Cipher accepts IVs of variable length */ -#define MBEDTLS_CIPHER_VARIABLE_KEY_LEN 0x02 /**< Cipher accepts keys of variable length */ - -#ifdef __cplusplus -extern "C" { -#endif - -typedef enum { - MBEDTLS_CIPHER_ID_NONE = 0, - MBEDTLS_CIPHER_ID_NULL, - MBEDTLS_CIPHER_ID_AES, - MBEDTLS_CIPHER_ID_DES, - MBEDTLS_CIPHER_ID_3DES, - MBEDTLS_CIPHER_ID_CAMELLIA, - MBEDTLS_CIPHER_ID_BLOWFISH, - MBEDTLS_CIPHER_ID_ARC4, -} mbedtls_cipher_id_t; - -typedef enum { - MBEDTLS_CIPHER_NONE = 0, - MBEDTLS_CIPHER_NULL, - MBEDTLS_CIPHER_AES_128_ECB, - MBEDTLS_CIPHER_AES_192_ECB, - MBEDTLS_CIPHER_AES_256_ECB, - MBEDTLS_CIPHER_AES_128_CBC, - MBEDTLS_CIPHER_AES_192_CBC, - MBEDTLS_CIPHER_AES_256_CBC, - MBEDTLS_CIPHER_AES_128_CFB128, - MBEDTLS_CIPHER_AES_192_CFB128, - MBEDTLS_CIPHER_AES_256_CFB128, - MBEDTLS_CIPHER_AES_128_CTR, - MBEDTLS_CIPHER_AES_192_CTR, - MBEDTLS_CIPHER_AES_256_CTR, - MBEDTLS_CIPHER_AES_128_GCM, - MBEDTLS_CIPHER_AES_192_GCM, - MBEDTLS_CIPHER_AES_256_GCM, - MBEDTLS_CIPHER_CAMELLIA_128_ECB, - MBEDTLS_CIPHER_CAMELLIA_192_ECB, - MBEDTLS_CIPHER_CAMELLIA_256_ECB, - MBEDTLS_CIPHER_CAMELLIA_128_CBC, - MBEDTLS_CIPHER_CAMELLIA_192_CBC, - MBEDTLS_CIPHER_CAMELLIA_256_CBC, - MBEDTLS_CIPHER_CAMELLIA_128_CFB128, - MBEDTLS_CIPHER_CAMELLIA_192_CFB128, - MBEDTLS_CIPHER_CAMELLIA_256_CFB128, - MBEDTLS_CIPHER_CAMELLIA_128_CTR, - MBEDTLS_CIPHER_CAMELLIA_192_CTR, - MBEDTLS_CIPHER_CAMELLIA_256_CTR, - MBEDTLS_CIPHER_CAMELLIA_128_GCM, - MBEDTLS_CIPHER_CAMELLIA_192_GCM, - MBEDTLS_CIPHER_CAMELLIA_256_GCM, - MBEDTLS_CIPHER_DES_ECB, - MBEDTLS_CIPHER_DES_CBC, - MBEDTLS_CIPHER_DES_EDE_ECB, - MBEDTLS_CIPHER_DES_EDE_CBC, - MBEDTLS_CIPHER_DES_EDE3_ECB, - MBEDTLS_CIPHER_DES_EDE3_CBC, - MBEDTLS_CIPHER_BLOWFISH_ECB, - MBEDTLS_CIPHER_BLOWFISH_CBC, - MBEDTLS_CIPHER_BLOWFISH_CFB64, - MBEDTLS_CIPHER_BLOWFISH_CTR, - MBEDTLS_CIPHER_ARC4_128, - MBEDTLS_CIPHER_AES_128_CCM, - MBEDTLS_CIPHER_AES_192_CCM, - MBEDTLS_CIPHER_AES_256_CCM, - MBEDTLS_CIPHER_CAMELLIA_128_CCM, - MBEDTLS_CIPHER_CAMELLIA_192_CCM, - MBEDTLS_CIPHER_CAMELLIA_256_CCM, -} mbedtls_cipher_type_t; - -typedef enum { - MBEDTLS_MODE_NONE = 0, - MBEDTLS_MODE_ECB, - MBEDTLS_MODE_CBC, - MBEDTLS_MODE_CFB, - MBEDTLS_MODE_OFB, /* Unused! */ - MBEDTLS_MODE_CTR, - MBEDTLS_MODE_GCM, - MBEDTLS_MODE_STREAM, - MBEDTLS_MODE_CCM, -} mbedtls_cipher_mode_t; - -typedef enum { - MBEDTLS_PADDING_PKCS7 = 0, /**< PKCS7 padding (default) */ - MBEDTLS_PADDING_ONE_AND_ZEROS, /**< ISO/IEC 7816-4 padding */ - MBEDTLS_PADDING_ZEROS_AND_LEN, /**< ANSI X.923 padding */ - MBEDTLS_PADDING_ZEROS, /**< zero padding (not reversible!) */ - MBEDTLS_PADDING_NONE, /**< never pad (full blocks only) */ -} mbedtls_cipher_padding_t; - -typedef enum { - MBEDTLS_OPERATION_NONE = -1, - MBEDTLS_DECRYPT = 0, - MBEDTLS_ENCRYPT, -} mbedtls_operation_t; - -enum { - /** Undefined key length */ - MBEDTLS_KEY_LENGTH_NONE = 0, - /** Key length, in bits (including parity), for DES keys */ - MBEDTLS_KEY_LENGTH_DES = 64, - /** Key length, in bits (including parity), for DES in two key EDE */ - MBEDTLS_KEY_LENGTH_DES_EDE = 128, - /** Key length, in bits (including parity), for DES in three-key EDE */ - MBEDTLS_KEY_LENGTH_DES_EDE3 = 192, -}; - -/** Maximum length of any IV, in bytes */ -#define MBEDTLS_MAX_IV_LENGTH 16 -/** Maximum block size of any cipher, in bytes */ -#define MBEDTLS_MAX_BLOCK_LENGTH 16 - -/** - * Base cipher information (opaque struct). - */ -typedef struct mbedtls_cipher_base_t mbedtls_cipher_base_t; - -/** - * Cipher information. Allows cipher functions to be called in a generic way. - */ -typedef struct { - /** Full cipher identifier (e.g. MBEDTLS_CIPHER_AES_256_CBC) */ - mbedtls_cipher_type_t type; - - /** Cipher mode (e.g. MBEDTLS_MODE_CBC) */ - mbedtls_cipher_mode_t mode; - - /** Cipher key length, in bits (default length for variable sized ciphers) - * (Includes parity bits for ciphers like DES) */ - unsigned int key_bitlen; - - /** Name of the cipher */ - const char * name; - - /** IV/NONCE size, in bytes. - * For cipher that accept many sizes: recommended size */ - unsigned int iv_size; - - /** Flags for variable IV size, variable key size, etc. */ - int flags; - - /** block size, in bytes */ - unsigned int block_size; - - /** Base cipher information and functions */ - const mbedtls_cipher_base_t *base; - -} mbedtls_cipher_info_t; - -/** - * Generic cipher context. - */ -typedef struct { - /** Information about the associated cipher */ - const mbedtls_cipher_info_t *cipher_info; - - /** Key length to use */ - int key_bitlen; - - /** Operation that the context's key has been initialised for */ - mbedtls_operation_t operation; - -#if defined(MBEDTLS_CIPHER_MODE_WITH_PADDING) - /** Padding functions to use, if relevant for cipher mode */ - void (*add_padding)( unsigned char *output, size_t olen, size_t data_len ); - int (*get_padding)( unsigned char *input, size_t ilen, size_t *data_len ); -#endif - - /** Buffer for data that hasn't been encrypted yet */ - unsigned char unprocessed_data[MBEDTLS_MAX_BLOCK_LENGTH]; - - /** Number of bytes that still need processing */ - size_t unprocessed_len; - - /** Current IV or NONCE_COUNTER for CTR-mode */ - unsigned char iv[MBEDTLS_MAX_IV_LENGTH]; - - /** IV size in bytes (for ciphers with variable-length IVs) */ - size_t iv_size; - - /** Cipher-specific context */ - void *cipher_ctx; -} mbedtls_cipher_context_t; - -/** - * \brief Returns the list of ciphers supported by the generic cipher module. - * - * \return a statically allocated array of ciphers, the last entry - * is 0. - */ -const int *mbedtls_cipher_list( void ); - -/** - * \brief Returns the cipher information structure associated - * with the given cipher name. - * - * \param cipher_name Name of the cipher to search for. - * - * \return the cipher information structure associated with the - * given cipher_name, or NULL if not found. - */ -const mbedtls_cipher_info_t *mbedtls_cipher_info_from_string( const char *cipher_name ); - -/** - * \brief Returns the cipher information structure associated - * with the given cipher type. - * - * \param cipher_type Type of the cipher to search for. - * - * \return the cipher information structure associated with the - * given cipher_type, or NULL if not found. - */ -const mbedtls_cipher_info_t *mbedtls_cipher_info_from_type( const mbedtls_cipher_type_t cipher_type ); - -/** - * \brief Returns the cipher information structure associated - * with the given cipher id, key size and mode. - * - * \param cipher_id Id of the cipher to search for - * (e.g. MBEDTLS_CIPHER_ID_AES) - * \param key_bitlen Length of the key in bits - * \param mode Cipher mode (e.g. MBEDTLS_MODE_CBC) - * - * \return the cipher information structure associated with the - * given cipher_type, or NULL if not found. - */ -const mbedtls_cipher_info_t *mbedtls_cipher_info_from_values( const mbedtls_cipher_id_t cipher_id, - int key_bitlen, - const mbedtls_cipher_mode_t mode ); - -/** - * \brief Initialize a cipher_context (as NONE) - */ -void mbedtls_cipher_init( mbedtls_cipher_context_t *ctx ); - -/** - * \brief Free and clear the cipher-specific context of ctx. - * Freeing ctx itself remains the responsibility of the - * caller. - */ -void mbedtls_cipher_free( mbedtls_cipher_context_t *ctx ); - -/** - * \brief Initialises and fills the cipher context structure with - * the appropriate values. - * - * \note Currently also clears structure. In future versions you - * will be required to call mbedtls_cipher_init() on the structure - * first. - * - * \param ctx context to initialise. May not be NULL. - * \param cipher_info cipher to use. - * - * \return 0 on success, - * MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA on parameter failure, - * MBEDTLS_ERR_CIPHER_ALLOC_FAILED if allocation of the - * cipher-specific context failed. - */ -int mbedtls_cipher_setup( mbedtls_cipher_context_t *ctx, const mbedtls_cipher_info_t *cipher_info ); - -/** - * \brief Returns the block size of the given cipher. - * - * \param ctx cipher's context. Must have been initialised. - * - * \return size of the cipher's blocks, or 0 if ctx has not been - * initialised. - */ -static inline unsigned int mbedtls_cipher_get_block_size( const mbedtls_cipher_context_t *ctx ) -{ - if( NULL == ctx || NULL == ctx->cipher_info ) - return 0; - - return ctx->cipher_info->block_size; -} - -/** - * \brief Returns the mode of operation for the cipher. - * (e.g. MBEDTLS_MODE_CBC) - * - * \param ctx cipher's context. Must have been initialised. - * - * \return mode of operation, or MBEDTLS_MODE_NONE if ctx - * has not been initialised. - */ -static inline mbedtls_cipher_mode_t mbedtls_cipher_get_cipher_mode( const mbedtls_cipher_context_t *ctx ) -{ - if( NULL == ctx || NULL == ctx->cipher_info ) - return MBEDTLS_MODE_NONE; - - return ctx->cipher_info->mode; -} - -/** - * \brief Returns the size of the cipher's IV/NONCE in bytes. - * - * \param ctx cipher's context. Must have been initialised. - * - * \return If IV has not been set yet: (recommended) IV size - * (0 for ciphers not using IV/NONCE). - * If IV has already been set: actual size. - */ -static inline int mbedtls_cipher_get_iv_size( const mbedtls_cipher_context_t *ctx ) -{ - if( NULL == ctx || NULL == ctx->cipher_info ) - return 0; - - if( ctx->iv_size != 0 ) - return (int) ctx->iv_size; - - return (int) ctx->cipher_info->iv_size; -} - -/** - * \brief Returns the type of the given cipher. - * - * \param ctx cipher's context. Must have been initialised. - * - * \return type of the cipher, or MBEDTLS_CIPHER_NONE if ctx has - * not been initialised. - */ -static inline mbedtls_cipher_type_t mbedtls_cipher_get_type( const mbedtls_cipher_context_t *ctx ) -{ - if( NULL == ctx || NULL == ctx->cipher_info ) - return MBEDTLS_CIPHER_NONE; - - return ctx->cipher_info->type; -} - -/** - * \brief Returns the name of the given cipher, as a string. - * - * \param ctx cipher's context. Must have been initialised. - * - * \return name of the cipher, or NULL if ctx was not initialised. - */ -static inline const char *mbedtls_cipher_get_name( const mbedtls_cipher_context_t *ctx ) -{ - if( NULL == ctx || NULL == ctx->cipher_info ) - return 0; - - return ctx->cipher_info->name; -} - -/** - * \brief Returns the key length of the cipher. - * - * \param ctx cipher's context. Must have been initialised. - * - * \return cipher's key length, in bits, or - * MBEDTLS_KEY_LENGTH_NONE if ctx has not been - * initialised. - */ -static inline int mbedtls_cipher_get_key_bitlen( const mbedtls_cipher_context_t *ctx ) -{ - if( NULL == ctx || NULL == ctx->cipher_info ) - return MBEDTLS_KEY_LENGTH_NONE; - - return (int) ctx->cipher_info->key_bitlen; -} - -/** - * \brief Returns the operation of the given cipher. - * - * \param ctx cipher's context. Must have been initialised. - * - * \return operation (MBEDTLS_ENCRYPT or MBEDTLS_DECRYPT), - * or MBEDTLS_OPERATION_NONE if ctx has not been - * initialised. - */ -static inline mbedtls_operation_t mbedtls_cipher_get_operation( const mbedtls_cipher_context_t *ctx ) -{ - if( NULL == ctx || NULL == ctx->cipher_info ) - return MBEDTLS_OPERATION_NONE; - - return ctx->operation; -} - -/** - * \brief Set the key to use with the given context. - * - * \param ctx generic cipher context. May not be NULL. Must have been - * initialised using cipher_context_from_type or - * cipher_context_from_string. - * \param key The key to use. - * \param key_bitlen key length to use, in bits. - * \param operation Operation that the key will be used for, either - * MBEDTLS_ENCRYPT or MBEDTLS_DECRYPT. - * - * \returns 0 on success, MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA if - * parameter verification fails or a cipher specific - * error code. - */ -int mbedtls_cipher_setkey( mbedtls_cipher_context_t *ctx, const unsigned char *key, - int key_bitlen, const mbedtls_operation_t operation ); - -#if defined(MBEDTLS_CIPHER_MODE_WITH_PADDING) -/** - * \brief Set padding mode, for cipher modes that use padding. - * (Default: PKCS7 padding.) - * - * \param ctx generic cipher context - * \param mode padding mode - * - * \returns 0 on success, MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE - * if selected padding mode is not supported, or - * MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA if the cipher mode - * does not support padding. - */ -int mbedtls_cipher_set_padding_mode( mbedtls_cipher_context_t *ctx, mbedtls_cipher_padding_t mode ); -#endif /* MBEDTLS_CIPHER_MODE_WITH_PADDING */ - -/** - * \brief Set the initialization vector (IV) or nonce - * - * \param ctx generic cipher context - * \param iv IV to use (or NONCE_COUNTER for CTR-mode ciphers) - * \param iv_len IV length for ciphers with variable-size IV; - * discarded by ciphers with fixed-size IV. - * - * \returns 0 on success, or MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA - * - * \note Some ciphers don't use IVs nor NONCE. For these - * ciphers, this function has no effect. - */ -int mbedtls_cipher_set_iv( mbedtls_cipher_context_t *ctx, - const unsigned char *iv, size_t iv_len ); - -/** - * \brief Finish preparation of the given context - * - * \param ctx generic cipher context - * - * \returns 0 on success, MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA - * if parameter verification fails. - */ -int mbedtls_cipher_reset( mbedtls_cipher_context_t *ctx ); - -#if defined(MBEDTLS_GCM_C) -/** - * \brief Add additional data (for AEAD ciphers). - * Currently only supported with GCM. - * Must be called exactly once, after mbedtls_cipher_reset(). - * - * \param ctx generic cipher context - * \param ad Additional data to use. - * \param ad_len Length of ad. - * - * \return 0 on success, or a specific error code. - */ -int mbedtls_cipher_update_ad( mbedtls_cipher_context_t *ctx, - const unsigned char *ad, size_t ad_len ); -#endif /* MBEDTLS_GCM_C */ - -/** - * \brief Generic cipher update function. Encrypts/decrypts - * using the given cipher context. Writes as many block - * size'd blocks of data as possible to output. Any data - * that cannot be written immediately will either be added - * to the next block, or flushed when cipher_final is - * called. - * Exception: for MBEDTLS_MODE_ECB, expects single block - * in size (e.g. 16 bytes for AES) - * - * \param ctx generic cipher context - * \param input buffer holding the input data - * \param ilen length of the input data - * \param output buffer for the output data. Should be able to hold at - * least ilen + block_size. Cannot be the same buffer as - * input! - * \param olen length of the output data, will be filled with the - * actual number of bytes written. - * - * \returns 0 on success, MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA if - * parameter verification fails, - * MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE on an - * unsupported mode for a cipher or a cipher specific - * error code. - * - * \note If the underlying cipher is GCM, all calls to this - * function, except the last one before mbedtls_cipher_finish(), - * must have ilen a multiple of the block size. - */ -int mbedtls_cipher_update( mbedtls_cipher_context_t *ctx, const unsigned char *input, - size_t ilen, unsigned char *output, size_t *olen ); - -/** - * \brief Generic cipher finalisation function. If data still - * needs to be flushed from an incomplete block, data - * contained within it will be padded with the size of - * the last block, and written to the output buffer. - * - * \param ctx Generic cipher context - * \param output buffer to write data to. Needs block_size available. - * \param olen length of the data written to the output buffer. - * - * \returns 0 on success, MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA if - * parameter verification fails, - * MBEDTLS_ERR_CIPHER_FULL_BLOCK_EXPECTED if decryption - * expected a full block but was not provided one, - * MBEDTLS_ERR_CIPHER_INVALID_PADDING on invalid padding - * while decrypting or a cipher specific error code. - */ -int mbedtls_cipher_finish( mbedtls_cipher_context_t *ctx, - unsigned char *output, size_t *olen ); - -#if defined(MBEDTLS_GCM_C) -/** - * \brief Write tag for AEAD ciphers. - * Currently only supported with GCM. - * Must be called after mbedtls_cipher_finish(). - * - * \param ctx Generic cipher context - * \param tag buffer to write the tag - * \param tag_len Length of the tag to write - * - * \return 0 on success, or a specific error code. - */ -int mbedtls_cipher_write_tag( mbedtls_cipher_context_t *ctx, - unsigned char *tag, size_t tag_len ); - -/** - * \brief Check tag for AEAD ciphers. - * Currently only supported with GCM. - * Must be called after mbedtls_cipher_finish(). - * - * \param ctx Generic cipher context - * \param tag Buffer holding the tag - * \param tag_len Length of the tag to check - * - * \return 0 on success, or a specific error code. - */ -int mbedtls_cipher_check_tag( mbedtls_cipher_context_t *ctx, - const unsigned char *tag, size_t tag_len ); -#endif /* MBEDTLS_GCM_C */ - -/** - * \brief Generic all-in-one encryption/decryption - * (for all ciphers except AEAD constructs). - * - * \param ctx generic cipher context - * \param iv IV to use (or NONCE_COUNTER for CTR-mode ciphers) - * \param iv_len IV length for ciphers with variable-size IV; - * discarded by ciphers with fixed-size IV. - * \param input buffer holding the input data - * \param ilen length of the input data - * \param output buffer for the output data. Should be able to hold at - * least ilen + block_size. Cannot be the same buffer as - * input! - * \param olen length of the output data, will be filled with the - * actual number of bytes written. - * - * \note Some ciphers don't use IVs nor NONCE. For these - * ciphers, use iv = NULL and iv_len = 0. - * - * \returns 0 on success, or - * MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA, or - * MBEDTLS_ERR_CIPHER_FULL_BLOCK_EXPECTED if decryption - * expected a full block but was not provided one, or - * MBEDTLS_ERR_CIPHER_INVALID_PADDING on invalid padding - * while decrypting, or - * a cipher specific error code. - */ -int mbedtls_cipher_crypt( mbedtls_cipher_context_t *ctx, - const unsigned char *iv, size_t iv_len, - const unsigned char *input, size_t ilen, - unsigned char *output, size_t *olen ); - -#if defined(MBEDTLS_CIPHER_MODE_AEAD) -/** - * \brief Generic autenticated encryption (AEAD ciphers). - * - * \param ctx generic cipher context - * \param iv IV to use (or NONCE_COUNTER for CTR-mode ciphers) - * \param iv_len IV length for ciphers with variable-size IV; - * discarded by ciphers with fixed-size IV. - * \param ad Additional data to authenticate. - * \param ad_len Length of ad. - * \param input buffer holding the input data - * \param ilen length of the input data - * \param output buffer for the output data. - * Should be able to hold at least ilen. - * \param olen length of the output data, will be filled with the - * actual number of bytes written. - * \param tag buffer for the authentication tag - * \param tag_len desired tag length - * - * \returns 0 on success, or - * MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA, or - * a cipher specific error code. - */ -int mbedtls_cipher_auth_encrypt( mbedtls_cipher_context_t *ctx, - const unsigned char *iv, size_t iv_len, - const unsigned char *ad, size_t ad_len, - const unsigned char *input, size_t ilen, - unsigned char *output, size_t *olen, - unsigned char *tag, size_t tag_len ); - -/** - * \brief Generic autenticated decryption (AEAD ciphers). - * - * \param ctx generic cipher context - * \param iv IV to use (or NONCE_COUNTER for CTR-mode ciphers) - * \param iv_len IV length for ciphers with variable-size IV; - * discarded by ciphers with fixed-size IV. - * \param ad Additional data to be authenticated. - * \param ad_len Length of ad. - * \param input buffer holding the input data - * \param ilen length of the input data - * \param output buffer for the output data. - * Should be able to hold at least ilen. - * \param olen length of the output data, will be filled with the - * actual number of bytes written. - * \param tag buffer holding the authentication tag - * \param tag_len length of the authentication tag - * - * \returns 0 on success, or - * MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA, or - * MBEDTLS_ERR_CIPHER_AUTH_FAILED if data isn't authentic, - * or a cipher specific error code. - * - * \note If the data is not authentic, then the output buffer - * is zeroed out to prevent the unauthentic plaintext to - * be used by mistake, making this interface safer. - */ -int mbedtls_cipher_auth_decrypt( mbedtls_cipher_context_t *ctx, - const unsigned char *iv, size_t iv_len, - const unsigned char *ad, size_t ad_len, - const unsigned char *input, size_t ilen, - unsigned char *output, size_t *olen, - const unsigned char *tag, size_t tag_len ); -#endif /* MBEDTLS_CIPHER_MODE_AEAD */ - -#ifdef __cplusplus -} -#endif - -#endif /* MBEDTLS_CIPHER_H */ diff --git a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/cipher_internal.h b/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/cipher_internal.h deleted file mode 100644 index 6c58bcc5..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/cipher_internal.h +++ /dev/null @@ -1,109 +0,0 @@ -/** - * \file cipher_internal.h - * - * \brief Cipher wrappers. - * - * \author Adriaan de Jong - * - * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * This file is part of mbed TLS (https://tls.mbed.org) - */ -#ifndef MBEDTLS_CIPHER_WRAP_H -#define MBEDTLS_CIPHER_WRAP_H - -#if !defined(MBEDTLS_CONFIG_FILE) -#include "config.h" -#else -#include MBEDTLS_CONFIG_FILE -#endif - -#include "cipher.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * Base cipher information. The non-mode specific functions and values. - */ -struct mbedtls_cipher_base_t -{ - /** Base Cipher type (e.g. MBEDTLS_CIPHER_ID_AES) */ - mbedtls_cipher_id_t cipher; - - /** Encrypt using ECB */ - int (*ecb_func)( void *ctx, mbedtls_operation_t mode, - const unsigned char *input, unsigned char *output ); - -#if defined(MBEDTLS_CIPHER_MODE_CBC) - /** Encrypt using CBC */ - int (*cbc_func)( void *ctx, mbedtls_operation_t mode, size_t length, - unsigned char *iv, const unsigned char *input, - unsigned char *output ); -#endif - -#if defined(MBEDTLS_CIPHER_MODE_CFB) - /** Encrypt using CFB (Full length) */ - int (*cfb_func)( void *ctx, mbedtls_operation_t mode, size_t length, size_t *iv_off, - unsigned char *iv, const unsigned char *input, - unsigned char *output ); -#endif - -#if defined(MBEDTLS_CIPHER_MODE_CTR) - /** Encrypt using CTR */ - int (*ctr_func)( void *ctx, size_t length, size_t *nc_off, - unsigned char *nonce_counter, unsigned char *stream_block, - const unsigned char *input, unsigned char *output ); -#endif - -#if defined(MBEDTLS_CIPHER_MODE_STREAM) - /** Encrypt using STREAM */ - int (*stream_func)( void *ctx, size_t length, - const unsigned char *input, unsigned char *output ); -#endif - - /** Set key for encryption purposes */ - int (*setkey_enc_func)( void *ctx, const unsigned char *key, - unsigned int key_bitlen ); - - /** Set key for decryption purposes */ - int (*setkey_dec_func)( void *ctx, const unsigned char *key, - unsigned int key_bitlen); - - /** Allocate a new context */ - void * (*ctx_alloc_func)( void ); - - /** Free the given context */ - void (*ctx_free_func)( void *ctx ); - -}; - -typedef struct -{ - mbedtls_cipher_type_t type; - const mbedtls_cipher_info_t *info; -} mbedtls_cipher_definition_t; - -extern const mbedtls_cipher_definition_t mbedtls_cipher_definitions[]; - -extern int mbedtls_cipher_supported[]; - -#ifdef __cplusplus -} -#endif - -#endif /* MBEDTLS_CIPHER_WRAP_H */ diff --git a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/compat-1.3.h b/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/compat-1.3.h deleted file mode 100644 index 1ddfff8c..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/compat-1.3.h +++ /dev/null @@ -1,2633 +0,0 @@ -/** - * \file config.h - * - * \brief Compatibility names (set of defines) - * - * \deprecated Use the new names directly instead - * - * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * This file is part of mbed TLS (https://tls.mbed.org) - */ - -#if ! defined(MBEDTLS_DEPRECATED_REMOVED) - -#if defined(MBEDTLS_DEPRECATED_WARNING) -#warning "Including compat-1.3.h is deprecated" -#endif - -#ifndef MBEDTLS_COMPAT13_H -#define MBEDTLS_COMPAT13_H - -/* - * config.h options - */ -#if defined MBEDTLS_AESNI_C -#define POLARSSL_AESNI_C MBEDTLS_AESNI_C -#endif -#if defined MBEDTLS_AES_ALT -#define POLARSSL_AES_ALT MBEDTLS_AES_ALT -#endif -#if defined MBEDTLS_AES_C -#define POLARSSL_AES_C MBEDTLS_AES_C -#endif -#if defined MBEDTLS_AES_ROM_TABLES -#define POLARSSL_AES_ROM_TABLES MBEDTLS_AES_ROM_TABLES -#endif -#if defined MBEDTLS_ARC4_ALT -#define POLARSSL_ARC4_ALT MBEDTLS_ARC4_ALT -#endif -#if defined MBEDTLS_ARC4_C -#define POLARSSL_ARC4_C MBEDTLS_ARC4_C -#endif -#if defined MBEDTLS_ASN1_PARSE_C -#define POLARSSL_ASN1_PARSE_C MBEDTLS_ASN1_PARSE_C -#endif -#if defined MBEDTLS_ASN1_WRITE_C -#define POLARSSL_ASN1_WRITE_C MBEDTLS_ASN1_WRITE_C -#endif -#if defined MBEDTLS_BASE64_C -#define POLARSSL_BASE64_C MBEDTLS_BASE64_C -#endif -#if defined MBEDTLS_BIGNUM_C -#define POLARSSL_BIGNUM_C MBEDTLS_BIGNUM_C -#endif -#if defined MBEDTLS_BLOWFISH_ALT -#define POLARSSL_BLOWFISH_ALT MBEDTLS_BLOWFISH_ALT -#endif -#if defined MBEDTLS_BLOWFISH_C -#define POLARSSL_BLOWFISH_C MBEDTLS_BLOWFISH_C -#endif -#if defined MBEDTLS_CAMELLIA_ALT -#define POLARSSL_CAMELLIA_ALT MBEDTLS_CAMELLIA_ALT -#endif -#if defined MBEDTLS_CAMELLIA_C -#define POLARSSL_CAMELLIA_C MBEDTLS_CAMELLIA_C -#endif -#if defined MBEDTLS_CAMELLIA_SMALL_MEMORY -#define POLARSSL_CAMELLIA_SMALL_MEMORY MBEDTLS_CAMELLIA_SMALL_MEMORY -#endif -#if defined MBEDTLS_CCM_C -#define POLARSSL_CCM_C MBEDTLS_CCM_C -#endif -#if defined MBEDTLS_CERTS_C -#define POLARSSL_CERTS_C MBEDTLS_CERTS_C -#endif -#if defined MBEDTLS_CIPHER_C -#define POLARSSL_CIPHER_C MBEDTLS_CIPHER_C -#endif -#if defined MBEDTLS_CIPHER_MODE_CBC -#define POLARSSL_CIPHER_MODE_CBC MBEDTLS_CIPHER_MODE_CBC -#endif -#if defined MBEDTLS_CIPHER_MODE_CFB -#define POLARSSL_CIPHER_MODE_CFB MBEDTLS_CIPHER_MODE_CFB -#endif -#if defined MBEDTLS_CIPHER_MODE_CTR -#define POLARSSL_CIPHER_MODE_CTR MBEDTLS_CIPHER_MODE_CTR -#endif -#if defined MBEDTLS_CIPHER_NULL_CIPHER -#define POLARSSL_CIPHER_NULL_CIPHER MBEDTLS_CIPHER_NULL_CIPHER -#endif -#if defined MBEDTLS_CIPHER_PADDING_ONE_AND_ZEROS -#define POLARSSL_CIPHER_PADDING_ONE_AND_ZEROS MBEDTLS_CIPHER_PADDING_ONE_AND_ZEROS -#endif -#if defined MBEDTLS_CIPHER_PADDING_PKCS7 -#define POLARSSL_CIPHER_PADDING_PKCS7 MBEDTLS_CIPHER_PADDING_PKCS7 -#endif -#if defined MBEDTLS_CIPHER_PADDING_ZEROS -#define POLARSSL_CIPHER_PADDING_ZEROS MBEDTLS_CIPHER_PADDING_ZEROS -#endif -#if defined MBEDTLS_CIPHER_PADDING_ZEROS_AND_LEN -#define POLARSSL_CIPHER_PADDING_ZEROS_AND_LEN MBEDTLS_CIPHER_PADDING_ZEROS_AND_LEN -#endif -#if defined MBEDTLS_CTR_DRBG_C -#define POLARSSL_CTR_DRBG_C MBEDTLS_CTR_DRBG_C -#endif -#if defined MBEDTLS_DEBUG_C -#define POLARSSL_DEBUG_C MBEDTLS_DEBUG_C -#endif -#if defined MBEDTLS_DEPRECATED_REMOVED -#define POLARSSL_DEPRECATED_REMOVED MBEDTLS_DEPRECATED_REMOVED -#endif -#if defined MBEDTLS_DEPRECATED_WARNING -#define POLARSSL_DEPRECATED_WARNING MBEDTLS_DEPRECATED_WARNING -#endif -#if defined MBEDTLS_DES_ALT -#define POLARSSL_DES_ALT MBEDTLS_DES_ALT -#endif -#if defined MBEDTLS_DES_C -#define POLARSSL_DES_C MBEDTLS_DES_C -#endif -#if defined MBEDTLS_DHM_C -#define POLARSSL_DHM_C MBEDTLS_DHM_C -#endif -#if defined MBEDTLS_ECDH_C -#define POLARSSL_ECDH_C MBEDTLS_ECDH_C -#endif -#if defined MBEDTLS_ECDSA_C -#define POLARSSL_ECDSA_C MBEDTLS_ECDSA_C -#endif -#if defined MBEDTLS_ECDSA_DETERMINISTIC -#define POLARSSL_ECDSA_DETERMINISTIC MBEDTLS_ECDSA_DETERMINISTIC -#endif -#if defined MBEDTLS_ECP_C -#define POLARSSL_ECP_C MBEDTLS_ECP_C -#endif -#if defined MBEDTLS_ECP_DP_BP256R1_ENABLED -#define POLARSSL_ECP_DP_BP256R1_ENABLED MBEDTLS_ECP_DP_BP256R1_ENABLED -#endif -#if defined MBEDTLS_ECP_DP_BP384R1_ENABLED -#define POLARSSL_ECP_DP_BP384R1_ENABLED MBEDTLS_ECP_DP_BP384R1_ENABLED -#endif -#if defined MBEDTLS_ECP_DP_BP512R1_ENABLED -#define POLARSSL_ECP_DP_BP512R1_ENABLED MBEDTLS_ECP_DP_BP512R1_ENABLED -#endif -#if defined MBEDTLS_ECP_DP_CURVE25519_ENABLED -#define POLARSSL_ECP_DP_M255_ENABLED MBEDTLS_ECP_DP_CURVE25519_ENABLED -#endif -#if defined MBEDTLS_ECP_DP_SECP192K1_ENABLED -#define POLARSSL_ECP_DP_SECP192K1_ENABLED MBEDTLS_ECP_DP_SECP192K1_ENABLED -#endif -#if defined MBEDTLS_ECP_DP_SECP192R1_ENABLED -#define POLARSSL_ECP_DP_SECP192R1_ENABLED MBEDTLS_ECP_DP_SECP192R1_ENABLED -#endif -#if defined MBEDTLS_ECP_DP_SECP224K1_ENABLED -#define POLARSSL_ECP_DP_SECP224K1_ENABLED MBEDTLS_ECP_DP_SECP224K1_ENABLED -#endif -#if defined MBEDTLS_ECP_DP_SECP224R1_ENABLED -#define POLARSSL_ECP_DP_SECP224R1_ENABLED MBEDTLS_ECP_DP_SECP224R1_ENABLED -#endif -#if defined MBEDTLS_ECP_DP_SECP256K1_ENABLED -#define POLARSSL_ECP_DP_SECP256K1_ENABLED MBEDTLS_ECP_DP_SECP256K1_ENABLED -#endif -#if defined MBEDTLS_ECP_DP_SECP256R1_ENABLED -#define POLARSSL_ECP_DP_SECP256R1_ENABLED MBEDTLS_ECP_DP_SECP256R1_ENABLED -#endif -#if defined MBEDTLS_ECP_DP_SECP384R1_ENABLED -#define POLARSSL_ECP_DP_SECP384R1_ENABLED MBEDTLS_ECP_DP_SECP384R1_ENABLED -#endif -#if defined MBEDTLS_ECP_DP_SECP521R1_ENABLED -#define POLARSSL_ECP_DP_SECP521R1_ENABLED MBEDTLS_ECP_DP_SECP521R1_ENABLED -#endif -#if defined MBEDTLS_ECP_FIXED_POINT_OPTIM -#define POLARSSL_ECP_FIXED_POINT_OPTIM MBEDTLS_ECP_FIXED_POINT_OPTIM -#endif -#if defined MBEDTLS_ECP_MAX_BITS -#define POLARSSL_ECP_MAX_BITS MBEDTLS_ECP_MAX_BITS -#endif -#if defined MBEDTLS_ECP_NIST_OPTIM -#define POLARSSL_ECP_NIST_OPTIM MBEDTLS_ECP_NIST_OPTIM -#endif -#if defined MBEDTLS_ECP_WINDOW_SIZE -#define POLARSSL_ECP_WINDOW_SIZE MBEDTLS_ECP_WINDOW_SIZE -#endif -#if defined MBEDTLS_ENABLE_WEAK_CIPHERSUITES -#define POLARSSL_ENABLE_WEAK_CIPHERSUITES MBEDTLS_ENABLE_WEAK_CIPHERSUITES -#endif -#if defined MBEDTLS_ENTROPY_C -#define POLARSSL_ENTROPY_C MBEDTLS_ENTROPY_C -#endif -#if defined MBEDTLS_ENTROPY_FORCE_SHA256 -#define POLARSSL_ENTROPY_FORCE_SHA256 MBEDTLS_ENTROPY_FORCE_SHA256 -#endif -#if defined MBEDTLS_ERROR_C -#define POLARSSL_ERROR_C MBEDTLS_ERROR_C -#endif -#if defined MBEDTLS_ERROR_STRERROR_BC -#define POLARSSL_ERROR_STRERROR_BC MBEDTLS_ERROR_STRERROR_BC -#endif -#if defined MBEDTLS_ERROR_STRERROR_DUMMY -#define POLARSSL_ERROR_STRERROR_DUMMY MBEDTLS_ERROR_STRERROR_DUMMY -#endif -#if defined MBEDTLS_FS_IO -#define POLARSSL_FS_IO MBEDTLS_FS_IO -#endif -#if defined MBEDTLS_GCM_C -#define POLARSSL_GCM_C MBEDTLS_GCM_C -#endif -#if defined MBEDTLS_GENPRIME -#define POLARSSL_GENPRIME MBEDTLS_GENPRIME -#endif -#if defined MBEDTLS_HAVEGE_C -#define POLARSSL_HAVEGE_C MBEDTLS_HAVEGE_C -#endif -#if defined MBEDTLS_HAVE_ASM -#define POLARSSL_HAVE_ASM MBEDTLS_HAVE_ASM -#endif -#if defined MBEDTLS_HAVE_SSE2 -#define POLARSSL_HAVE_SSE2 MBEDTLS_HAVE_SSE2 -#endif -#if defined MBEDTLS_HAVE_TIME -#define POLARSSL_HAVE_TIME MBEDTLS_HAVE_TIME -#endif -#if defined MBEDTLS_HMAC_DRBG_C -#define POLARSSL_HMAC_DRBG_C MBEDTLS_HMAC_DRBG_C -#endif -#if defined MBEDTLS_HMAC_DRBG_MAX_INPUT -#define POLARSSL_HMAC_DRBG_MAX_INPUT MBEDTLS_HMAC_DRBG_MAX_INPUT -#endif -#if defined MBEDTLS_HMAC_DRBG_MAX_REQUEST -#define POLARSSL_HMAC_DRBG_MAX_REQUEST MBEDTLS_HMAC_DRBG_MAX_REQUEST -#endif -#if defined MBEDTLS_HMAC_DRBG_MAX_SEED_INPUT -#define POLARSSL_HMAC_DRBG_MAX_SEED_INPUT MBEDTLS_HMAC_DRBG_MAX_SEED_INPUT -#endif -#if defined MBEDTLS_HMAC_DRBG_RESEED_INTERVAL -#define POLARSSL_HMAC_DRBG_RESEED_INTERVAL MBEDTLS_HMAC_DRBG_RESEED_INTERVAL -#endif -#if defined MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED -#define POLARSSL_KEY_EXCHANGE_DHE_PSK_ENABLED MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED -#endif -#if defined MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED -#define POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED -#endif -#if defined MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED -#define POLARSSL_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED -#endif -#if defined MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED -#define POLARSSL_KEY_EXCHANGE_ECDHE_PSK_ENABLED MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED -#endif -#if defined MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED -#define POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED -#endif -#if defined MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED -#define POLARSSL_KEY_EXCHANGE_ECDH_ECDSA_ENABLED MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED -#endif -#if defined MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED -#define POLARSSL_KEY_EXCHANGE_ECDH_RSA_ENABLED MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED -#endif -#if defined MBEDTLS_KEY_EXCHANGE_PSK_ENABLED -#define POLARSSL_KEY_EXCHANGE_PSK_ENABLED MBEDTLS_KEY_EXCHANGE_PSK_ENABLED -#endif -#if defined MBEDTLS_KEY_EXCHANGE_RSA_ENABLED -#define POLARSSL_KEY_EXCHANGE_RSA_ENABLED MBEDTLS_KEY_EXCHANGE_RSA_ENABLED -#endif -#if defined MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED -#define POLARSSL_KEY_EXCHANGE_RSA_PSK_ENABLED MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED -#endif -#if defined MBEDTLS_MD2_ALT -#define POLARSSL_MD2_ALT MBEDTLS_MD2_ALT -#endif -#if defined MBEDTLS_MD2_C -#define POLARSSL_MD2_C MBEDTLS_MD2_C -#endif -#if defined MBEDTLS_MD2_PROCESS_ALT -#define POLARSSL_MD2_PROCESS_ALT MBEDTLS_MD2_PROCESS_ALT -#endif -#if defined MBEDTLS_MD4_ALT -#define POLARSSL_MD4_ALT MBEDTLS_MD4_ALT -#endif -#if defined MBEDTLS_MD4_C -#define POLARSSL_MD4_C MBEDTLS_MD4_C -#endif -#if defined MBEDTLS_MD4_PROCESS_ALT -#define POLARSSL_MD4_PROCESS_ALT MBEDTLS_MD4_PROCESS_ALT -#endif -#if defined MBEDTLS_MD5_ALT -#define POLARSSL_MD5_ALT MBEDTLS_MD5_ALT -#endif -#if defined MBEDTLS_MD5_C -#define POLARSSL_MD5_C MBEDTLS_MD5_C -#endif -#if defined MBEDTLS_MD5_PROCESS_ALT -#define POLARSSL_MD5_PROCESS_ALT MBEDTLS_MD5_PROCESS_ALT -#endif -#if defined MBEDTLS_MD_C -#define POLARSSL_MD_C MBEDTLS_MD_C -#endif -#if defined MBEDTLS_MEMORY_ALIGN_MULTIPLE -#define POLARSSL_MEMORY_ALIGN_MULTIPLE MBEDTLS_MEMORY_ALIGN_MULTIPLE -#endif -#if defined MBEDTLS_MEMORY_BACKTRACE -#define POLARSSL_MEMORY_BACKTRACE MBEDTLS_MEMORY_BACKTRACE -#endif -#if defined MBEDTLS_MEMORY_BUFFER_ALLOC_C -#define POLARSSL_MEMORY_BUFFER_ALLOC_C MBEDTLS_MEMORY_BUFFER_ALLOC_C -#endif -#if defined MBEDTLS_MEMORY_C -#define POLARSSL_MEMORY_C MBEDTLS_MEMORY_C -#endif -#if defined MBEDTLS_MEMORY_DEBUG -#define POLARSSL_MEMORY_DEBUG MBEDTLS_MEMORY_DEBUG -#endif -#if defined MBEDTLS_MPI_MAX_SIZE -#define POLARSSL_MPI_MAX_SIZE MBEDTLS_MPI_MAX_SIZE -#endif -#if defined MBEDTLS_MPI_WINDOW_SIZE -#define POLARSSL_MPI_WINDOW_SIZE MBEDTLS_MPI_WINDOW_SIZE -#endif -#if defined MBEDTLS_NET_C -#define POLARSSL_NET_C MBEDTLS_NET_C -#endif -#if defined MBEDTLS_NO_DEFAULT_ENTROPY_SOURCES -#define POLARSSL_NO_DEFAULT_ENTROPY_SOURCES MBEDTLS_NO_DEFAULT_ENTROPY_SOURCES -#endif -#if defined MBEDTLS_NO_PLATFORM_ENTROPY -#define POLARSSL_NO_PLATFORM_ENTROPY MBEDTLS_NO_PLATFORM_ENTROPY -#endif -#if defined MBEDTLS_OID_C -#define POLARSSL_OID_C MBEDTLS_OID_C -#endif -#if defined MBEDTLS_PADLOCK_C -#define POLARSSL_PADLOCK_C MBEDTLS_PADLOCK_C -#endif -#if defined MBEDTLS_PBKDF2_C -#define POLARSSL_PBKDF2_C MBEDTLS_PBKDF2_C -#endif -#if defined MBEDTLS_PEM_PARSE_C -#define POLARSSL_PEM_PARSE_C MBEDTLS_PEM_PARSE_C -#endif -#if defined MBEDTLS_PEM_WRITE_C -#define POLARSSL_PEM_WRITE_C MBEDTLS_PEM_WRITE_C -#endif -#if defined MBEDTLS_PKCS11_C -#define POLARSSL_PKCS11_C MBEDTLS_PKCS11_C -#endif -#if defined MBEDTLS_PKCS12_C -#define POLARSSL_PKCS12_C MBEDTLS_PKCS12_C -#endif -#if defined MBEDTLS_PKCS1_V15 -#define POLARSSL_PKCS1_V15 MBEDTLS_PKCS1_V15 -#endif -#if defined MBEDTLS_PKCS1_V21 -#define POLARSSL_PKCS1_V21 MBEDTLS_PKCS1_V21 -#endif -#if defined MBEDTLS_PKCS5_C -#define POLARSSL_PKCS5_C MBEDTLS_PKCS5_C -#endif -#if defined MBEDTLS_PK_C -#define POLARSSL_PK_C MBEDTLS_PK_C -#endif -#if defined MBEDTLS_PK_PARSE_C -#define POLARSSL_PK_PARSE_C MBEDTLS_PK_PARSE_C -#endif -#if defined MBEDTLS_PK_PARSE_EC_EXTENDED -#define POLARSSL_PK_PARSE_EC_EXTENDED MBEDTLS_PK_PARSE_EC_EXTENDED -#endif -#if defined MBEDTLS_PK_RSA_ALT_SUPPORT -#define POLARSSL_PK_RSA_ALT_SUPPORT MBEDTLS_PK_RSA_ALT_SUPPORT -#endif -#if defined MBEDTLS_PK_WRITE_C -#define POLARSSL_PK_WRITE_C MBEDTLS_PK_WRITE_C -#endif -#if defined MBEDTLS_PLATFORM_C -#define POLARSSL_PLATFORM_C MBEDTLS_PLATFORM_C -#endif -#if defined MBEDTLS_PLATFORM_EXIT_ALT -#define POLARSSL_PLATFORM_EXIT_ALT MBEDTLS_PLATFORM_EXIT_ALT -#endif -#if defined MBEDTLS_PLATFORM_EXIT_MACRO -#define POLARSSL_PLATFORM_EXIT_MACRO MBEDTLS_PLATFORM_EXIT_MACRO -#endif -#if defined MBEDTLS_PLATFORM_FPRINTF_ALT -#define POLARSSL_PLATFORM_FPRINTF_ALT MBEDTLS_PLATFORM_FPRINTF_ALT -#endif -#if defined MBEDTLS_PLATFORM_FPRINTF_MACRO -#define POLARSSL_PLATFORM_FPRINTF_MACRO MBEDTLS_PLATFORM_FPRINTF_MACRO -#endif -#if defined MBEDTLS_PLATFORM_FREE_MACRO -#define POLARSSL_PLATFORM_FREE_MACRO MBEDTLS_PLATFORM_FREE_MACRO -#endif -#if defined MBEDTLS_PLATFORM_MEMORY -#define POLARSSL_PLATFORM_MEMORY MBEDTLS_PLATFORM_MEMORY -#endif -#if defined MBEDTLS_PLATFORM_NO_STD_FUNCTIONS -#define POLARSSL_PLATFORM_NO_STD_FUNCTIONS MBEDTLS_PLATFORM_NO_STD_FUNCTIONS -#endif -#if defined MBEDTLS_PLATFORM_PRINTF_ALT -#define POLARSSL_PLATFORM_PRINTF_ALT MBEDTLS_PLATFORM_PRINTF_ALT -#endif -#if defined MBEDTLS_PLATFORM_PRINTF_MACRO -#define POLARSSL_PLATFORM_PRINTF_MACRO MBEDTLS_PLATFORM_PRINTF_MACRO -#endif -#if defined MBEDTLS_PLATFORM_SNPRINTF_ALT -#define POLARSSL_PLATFORM_SNPRINTF_ALT MBEDTLS_PLATFORM_SNPRINTF_ALT -#endif -#if defined MBEDTLS_PLATFORM_SNPRINTF_MACRO -#define POLARSSL_PLATFORM_SNPRINTF_MACRO MBEDTLS_PLATFORM_SNPRINTF_MACRO -#endif -#if defined MBEDTLS_PLATFORM_STD_EXIT -#define POLARSSL_PLATFORM_STD_EXIT MBEDTLS_PLATFORM_STD_EXIT -#endif -#if defined MBEDTLS_PLATFORM_STD_FPRINTF -#define POLARSSL_PLATFORM_STD_FPRINTF MBEDTLS_PLATFORM_STD_FPRINTF -#endif -#if defined MBEDTLS_PLATFORM_STD_FREE -#define POLARSSL_PLATFORM_STD_FREE MBEDTLS_PLATFORM_STD_FREE -#endif -#if defined MBEDTLS_PLATFORM_STD_MALLOC -#define POLARSSL_PLATFORM_STD_MALLOC MBEDTLS_PLATFORM_STD_MALLOC -#endif -#if defined MBEDTLS_PLATFORM_STD_MEM_HDR -#define POLARSSL_PLATFORM_STD_MEM_HDR MBEDTLS_PLATFORM_STD_MEM_HDR -#endif -#if defined MBEDTLS_PLATFORM_STD_PRINTF -#define POLARSSL_PLATFORM_STD_PRINTF MBEDTLS_PLATFORM_STD_PRINTF -#endif -#if defined MBEDTLS_PLATFORM_STD_SNPRINTF -#define POLARSSL_PLATFORM_STD_SNPRINTF MBEDTLS_PLATFORM_STD_SNPRINTF -#endif -#if defined MBEDTLS_PSK_MAX_LEN -#define POLARSSL_PSK_MAX_LEN MBEDTLS_PSK_MAX_LEN -#endif -#if defined MBEDTLS_REMOVE_ARC4_CIPHERSUITES -#define POLARSSL_REMOVE_ARC4_CIPHERSUITES MBEDTLS_REMOVE_ARC4_CIPHERSUITES -#endif -#if defined MBEDTLS_RIPEMD160_ALT -#define POLARSSL_RIPEMD160_ALT MBEDTLS_RIPEMD160_ALT -#endif -#if defined MBEDTLS_RIPEMD160_C -#define POLARSSL_RIPEMD160_C MBEDTLS_RIPEMD160_C -#endif -#if defined MBEDTLS_RIPEMD160_PROCESS_ALT -#define POLARSSL_RIPEMD160_PROCESS_ALT MBEDTLS_RIPEMD160_PROCESS_ALT -#endif -#if defined MBEDTLS_RSA_C -#define POLARSSL_RSA_C MBEDTLS_RSA_C -#endif -#if defined MBEDTLS_RSA_NO_CRT -#define POLARSSL_RSA_NO_CRT MBEDTLS_RSA_NO_CRT -#endif -#if defined MBEDTLS_SELF_TEST -#define POLARSSL_SELF_TEST MBEDTLS_SELF_TEST -#endif -#if defined MBEDTLS_SHA1_ALT -#define POLARSSL_SHA1_ALT MBEDTLS_SHA1_ALT -#endif -#if defined MBEDTLS_SHA1_C -#define POLARSSL_SHA1_C MBEDTLS_SHA1_C -#endif -#if defined MBEDTLS_SHA1_PROCESS_ALT -#define POLARSSL_SHA1_PROCESS_ALT MBEDTLS_SHA1_PROCESS_ALT -#endif -#if defined MBEDTLS_SHA256_ALT -#define POLARSSL_SHA256_ALT MBEDTLS_SHA256_ALT -#endif -#if defined MBEDTLS_SHA256_C -#define POLARSSL_SHA256_C MBEDTLS_SHA256_C -#endif -#if defined MBEDTLS_SHA256_PROCESS_ALT -#define POLARSSL_SHA256_PROCESS_ALT MBEDTLS_SHA256_PROCESS_ALT -#endif -#if defined MBEDTLS_SHA512_ALT -#define POLARSSL_SHA512_ALT MBEDTLS_SHA512_ALT -#endif -#if defined MBEDTLS_SHA512_C -#define POLARSSL_SHA512_C MBEDTLS_SHA512_C -#endif -#if defined MBEDTLS_SHA512_PROCESS_ALT -#define POLARSSL_SHA512_PROCESS_ALT MBEDTLS_SHA512_PROCESS_ALT -#endif -#if defined MBEDTLS_SSL_AEAD_RANDOM_IV -#define POLARSSL_SSL_AEAD_RANDOM_IV MBEDTLS_SSL_AEAD_RANDOM_IV -#endif -#if defined MBEDTLS_SSL_ALERT_MESSAGES -#define POLARSSL_SSL_ALERT_MESSAGES MBEDTLS_SSL_ALERT_MESSAGES -#endif -#if defined MBEDTLS_SSL_ALL_ALERT_MESSAGES -#define POLARSSL_SSL_ALL_ALERT_MESSAGES MBEDTLS_SSL_ALL_ALERT_MESSAGES -#endif -#if defined MBEDTLS_SSL_ALPN -#define POLARSSL_SSL_ALPN MBEDTLS_SSL_ALPN -#endif -#if defined MBEDTLS_SSL_CACHE_C -#define POLARSSL_SSL_CACHE_C MBEDTLS_SSL_CACHE_C -#endif -#if defined MBEDTLS_SSL_CBC_RECORD_SPLITTING -#define POLARSSL_SSL_CBC_RECORD_SPLITTING MBEDTLS_SSL_CBC_RECORD_SPLITTING -#endif -#if defined MBEDTLS_SSL_CLI_C -#define POLARSSL_SSL_CLI_C MBEDTLS_SSL_CLI_C -#endif -#if defined MBEDTLS_SSL_COOKIE_C -#define POLARSSL_SSL_COOKIE_C MBEDTLS_SSL_COOKIE_C -#endif -#if defined MBEDTLS_SSL_COOKIE_TIMEOUT -#define POLARSSL_SSL_COOKIE_TIMEOUT MBEDTLS_SSL_COOKIE_TIMEOUT -#endif -#if defined MBEDTLS_SSL_DEBUG_ALL -#define POLARSSL_SSL_DEBUG_ALL MBEDTLS_SSL_DEBUG_ALL -#endif -#if defined MBEDTLS_SSL_DISABLE_RENEGOTIATION -#define POLARSSL_SSL_DISABLE_RENEGOTIATION MBEDTLS_SSL_DISABLE_RENEGOTIATION -#endif -#if defined MBEDTLS_SSL_DTLS_ANTI_REPLAY -#define POLARSSL_SSL_DTLS_ANTI_REPLAY MBEDTLS_SSL_DTLS_ANTI_REPLAY -#endif -#if defined MBEDTLS_SSL_DTLS_BADMAC_LIMIT -#define POLARSSL_SSL_DTLS_BADMAC_LIMIT MBEDTLS_SSL_DTLS_BADMAC_LIMIT -#endif -#if defined MBEDTLS_SSL_DTLS_HELLO_VERIFY -#define POLARSSL_SSL_DTLS_HELLO_VERIFY MBEDTLS_SSL_DTLS_HELLO_VERIFY -#endif -#if defined MBEDTLS_SSL_ENCRYPT_THEN_MAC -#define POLARSSL_SSL_ENCRYPT_THEN_MAC MBEDTLS_SSL_ENCRYPT_THEN_MAC -#endif -#if defined MBEDTLS_SSL_EXTENDED_MASTER_SECRET -#define POLARSSL_SSL_EXTENDED_MASTER_SECRET MBEDTLS_SSL_EXTENDED_MASTER_SECRET -#endif -#if defined MBEDTLS_SSL_FALLBACK_SCSV -#define POLARSSL_SSL_FALLBACK_SCSV MBEDTLS_SSL_FALLBACK_SCSV -#endif -#if defined MBEDTLS_SSL_HW_RECORD_ACCEL -#define POLARSSL_SSL_HW_RECORD_ACCEL MBEDTLS_SSL_HW_RECORD_ACCEL -#endif -#if defined MBEDTLS_SSL_MAX_FRAGMENT_LENGTH -#define POLARSSL_SSL_MAX_FRAGMENT_LENGTH MBEDTLS_SSL_MAX_FRAGMENT_LENGTH -#endif -#if defined MBEDTLS_SSL_PROTO_DTLS -#define POLARSSL_SSL_PROTO_DTLS MBEDTLS_SSL_PROTO_DTLS -#endif -#if defined MBEDTLS_SSL_PROTO_SSL3 -#define POLARSSL_SSL_PROTO_SSL3 MBEDTLS_SSL_PROTO_SSL3 -#endif -#if defined MBEDTLS_SSL_PROTO_TLS1 -#define POLARSSL_SSL_PROTO_TLS1 MBEDTLS_SSL_PROTO_TLS1 -#endif -#if defined MBEDTLS_SSL_PROTO_TLS1_1 -#define POLARSSL_SSL_PROTO_TLS1_1 MBEDTLS_SSL_PROTO_TLS1_1 -#endif -#if defined MBEDTLS_SSL_PROTO_TLS1_2 -#define POLARSSL_SSL_PROTO_TLS1_2 MBEDTLS_SSL_PROTO_TLS1_2 -#endif -#if defined MBEDTLS_SSL_RENEGOTIATION -#define POLARSSL_SSL_RENEGOTIATION MBEDTLS_SSL_RENEGOTIATION -#endif -#if defined MBEDTLS_SSL_SERVER_NAME_INDICATION -#define POLARSSL_SSL_SERVER_NAME_INDICATION MBEDTLS_SSL_SERVER_NAME_INDICATION -#endif -#if defined MBEDTLS_SSL_SESSION_TICKETS -#define POLARSSL_SSL_SESSION_TICKETS MBEDTLS_SSL_SESSION_TICKETS -#endif -#if defined MBEDTLS_SSL_SRV_C -#define POLARSSL_SSL_SRV_C MBEDTLS_SSL_SRV_C -#endif -#if defined MBEDTLS_SSL_SRV_RESPECT_CLIENT_PREFERENCE -#define POLARSSL_SSL_SRV_RESPECT_CLIENT_PREFERENCE MBEDTLS_SSL_SRV_RESPECT_CLIENT_PREFERENCE -#endif -#if defined MBEDTLS_SSL_SRV_SUPPORT_SSLV2_CLIENT_HELLO -#define POLARSSL_SSL_SRV_SUPPORT_SSLV2_CLIENT_HELLO MBEDTLS_SSL_SRV_SUPPORT_SSLV2_CLIENT_HELLO -#endif -#if defined MBEDTLS_SSL_TLS_C -#define POLARSSL_SSL_TLS_C MBEDTLS_SSL_TLS_C -#endif -#if defined MBEDTLS_SSL_TRUNCATED_HMAC -#define POLARSSL_SSL_TRUNCATED_HMAC MBEDTLS_SSL_TRUNCATED_HMAC -#endif -#if defined MBEDTLS_THREADING_ALT -#define POLARSSL_THREADING_ALT MBEDTLS_THREADING_ALT -#endif -#if defined MBEDTLS_THREADING_C -#define POLARSSL_THREADING_C MBEDTLS_THREADING_C -#endif -#if defined MBEDTLS_THREADING_PTHREAD -#define POLARSSL_THREADING_PTHREAD MBEDTLS_THREADING_PTHREAD -#endif -#if defined MBEDTLS_TIMING_ALT -#define POLARSSL_TIMING_ALT MBEDTLS_TIMING_ALT -#endif -#if defined MBEDTLS_TIMING_C -#define POLARSSL_TIMING_C MBEDTLS_TIMING_C -#endif -#if defined MBEDTLS_VERSION_C -#define POLARSSL_VERSION_C MBEDTLS_VERSION_C -#endif -#if defined MBEDTLS_VERSION_FEATURES -#define POLARSSL_VERSION_FEATURES MBEDTLS_VERSION_FEATURES -#endif -#if defined MBEDTLS_X509_ALLOW_EXTENSIONS_NON_V3 -#define POLARSSL_X509_ALLOW_EXTENSIONS_NON_V3 MBEDTLS_X509_ALLOW_EXTENSIONS_NON_V3 -#endif -#if defined MBEDTLS_X509_ALLOW_UNSUPPORTED_CRITICAL_EXTENSION -#define POLARSSL_X509_ALLOW_UNSUPPORTED_CRITICAL_EXTENSION MBEDTLS_X509_ALLOW_UNSUPPORTED_CRITICAL_EXTENSION -#endif -#if defined MBEDTLS_X509_CHECK_EXTENDED_KEY_USAGE -#define POLARSSL_X509_CHECK_EXTENDED_KEY_USAGE MBEDTLS_X509_CHECK_EXTENDED_KEY_USAGE -#endif -#if defined MBEDTLS_X509_CHECK_KEY_USAGE -#define POLARSSL_X509_CHECK_KEY_USAGE MBEDTLS_X509_CHECK_KEY_USAGE -#endif -#if defined MBEDTLS_X509_CREATE_C -#define POLARSSL_X509_CREATE_C MBEDTLS_X509_CREATE_C -#endif -#if defined MBEDTLS_X509_CRL_PARSE_C -#define POLARSSL_X509_CRL_PARSE_C MBEDTLS_X509_CRL_PARSE_C -#endif -#if defined MBEDTLS_X509_CRT_PARSE_C -#define POLARSSL_X509_CRT_PARSE_C MBEDTLS_X509_CRT_PARSE_C -#endif -#if defined MBEDTLS_X509_CRT_WRITE_C -#define POLARSSL_X509_CRT_WRITE_C MBEDTLS_X509_CRT_WRITE_C -#endif -#if defined MBEDTLS_X509_CSR_PARSE_C -#define POLARSSL_X509_CSR_PARSE_C MBEDTLS_X509_CSR_PARSE_C -#endif -#if defined MBEDTLS_X509_CSR_WRITE_C -#define POLARSSL_X509_CSR_WRITE_C MBEDTLS_X509_CSR_WRITE_C -#endif -#if defined MBEDTLS_X509_MAX_INTERMEDIATE_CA -#define POLARSSL_X509_MAX_INTERMEDIATE_CA MBEDTLS_X509_MAX_INTERMEDIATE_CA -#endif -#if defined MBEDTLS_X509_RSASSA_PSS_SUPPORT -#define POLARSSL_X509_RSASSA_PSS_SUPPORT MBEDTLS_X509_RSASSA_PSS_SUPPORT -#endif -#if defined MBEDTLS_X509_USE_C -#define POLARSSL_X509_USE_C MBEDTLS_X509_USE_C -#endif -#if defined MBEDTLS_XTEA_ALT -#define POLARSSL_XTEA_ALT MBEDTLS_XTEA_ALT -#endif -#if defined MBEDTLS_XTEA_C -#define POLARSSL_XTEA_C MBEDTLS_XTEA_C -#endif -#if defined MBEDTLS_ZLIB_SUPPORT -#define POLARSSL_ZLIB_SUPPORT MBEDTLS_ZLIB_SUPPORT -#endif - -/* - * Misc names (macros, types, functions, enum constants...) - */ -#define AES_DECRYPT MBEDTLS_AES_DECRYPT -#define AES_ENCRYPT MBEDTLS_AES_ENCRYPT -#define ASN1_BIT_STRING MBEDTLS_ASN1_BIT_STRING -#define ASN1_BMP_STRING MBEDTLS_ASN1_BMP_STRING -#define ASN1_BOOLEAN MBEDTLS_ASN1_BOOLEAN -#define ASN1_CHK_ADD MBEDTLS_ASN1_CHK_ADD -#define ASN1_CONSTRUCTED MBEDTLS_ASN1_CONSTRUCTED -#define ASN1_CONTEXT_SPECIFIC MBEDTLS_ASN1_CONTEXT_SPECIFIC -#define ASN1_GENERALIZED_TIME MBEDTLS_ASN1_GENERALIZED_TIME -#define ASN1_IA5_STRING MBEDTLS_ASN1_IA5_STRING -#define ASN1_INTEGER MBEDTLS_ASN1_INTEGER -#define ASN1_NULL MBEDTLS_ASN1_NULL -#define ASN1_OCTET_STRING MBEDTLS_ASN1_OCTET_STRING -#define ASN1_OID MBEDTLS_ASN1_OID -#define ASN1_PRIMITIVE MBEDTLS_ASN1_PRIMITIVE -#define ASN1_PRINTABLE_STRING MBEDTLS_ASN1_PRINTABLE_STRING -#define ASN1_SEQUENCE MBEDTLS_ASN1_SEQUENCE -#define ASN1_SET MBEDTLS_ASN1_SET -#define ASN1_T61_STRING MBEDTLS_ASN1_T61_STRING -#define ASN1_UNIVERSAL_STRING MBEDTLS_ASN1_UNIVERSAL_STRING -#define ASN1_UTC_TIME MBEDTLS_ASN1_UTC_TIME -#define ASN1_UTF8_STRING MBEDTLS_ASN1_UTF8_STRING -#define BADCERT_CN_MISMATCH MBEDTLS_X509_BADCERT_CN_MISMATCH -#define BADCERT_EXPIRED MBEDTLS_X509_BADCERT_EXPIRED -#define BADCERT_FUTURE MBEDTLS_X509_BADCERT_FUTURE -#define BADCERT_MISSING MBEDTLS_X509_BADCERT_MISSING -#define BADCERT_NOT_TRUSTED MBEDTLS_X509_BADCERT_NOT_TRUSTED -#define BADCERT_OTHER MBEDTLS_X509_BADCERT_OTHER -#define BADCERT_REVOKED MBEDTLS_X509_BADCERT_REVOKED -#define BADCERT_SKIP_VERIFY MBEDTLS_X509_BADCERT_SKIP_VERIFY -#define BADCRL_EXPIRED MBEDTLS_X509_BADCRL_EXPIRED -#define BADCRL_FUTURE MBEDTLS_X509_BADCRL_FUTURE -#define BADCRL_NOT_TRUSTED MBEDTLS_X509_BADCRL_NOT_TRUSTED -#define BLOWFISH_BLOCKSIZE MBEDTLS_BLOWFISH_BLOCKSIZE -#define BLOWFISH_DECRYPT MBEDTLS_BLOWFISH_DECRYPT -#define BLOWFISH_ENCRYPT MBEDTLS_BLOWFISH_ENCRYPT -#define BLOWFISH_MAX_KEY MBEDTLS_BLOWFISH_MAX_KEY_BITS -#define BLOWFISH_MIN_KEY MBEDTLS_BLOWFISH_MIN_KEY_BITS -#define BLOWFISH_ROUNDS MBEDTLS_BLOWFISH_ROUNDS -#define CAMELLIA_DECRYPT MBEDTLS_CAMELLIA_DECRYPT -#define CAMELLIA_ENCRYPT MBEDTLS_CAMELLIA_ENCRYPT -#define COLLECT_SIZE MBEDTLS_HAVEGE_COLLECT_SIZE -#define CTR_DRBG_BLOCKSIZE MBEDTLS_CTR_DRBG_BLOCKSIZE -#define CTR_DRBG_ENTROPY_LEN MBEDTLS_CTR_DRBG_ENTROPY_LEN -#define CTR_DRBG_KEYBITS MBEDTLS_CTR_DRBG_KEYBITS -#define CTR_DRBG_KEYSIZE MBEDTLS_CTR_DRBG_KEYSIZE -#define CTR_DRBG_MAX_INPUT MBEDTLS_CTR_DRBG_MAX_INPUT -#define CTR_DRBG_MAX_REQUEST MBEDTLS_CTR_DRBG_MAX_REQUEST -#define CTR_DRBG_MAX_SEED_INPUT MBEDTLS_CTR_DRBG_MAX_SEED_INPUT -#define CTR_DRBG_PR_OFF MBEDTLS_CTR_DRBG_PR_OFF -#define CTR_DRBG_PR_ON MBEDTLS_CTR_DRBG_PR_ON -#define CTR_DRBG_RESEED_INTERVAL MBEDTLS_CTR_DRBG_RESEED_INTERVAL -#define CTR_DRBG_SEEDLEN MBEDTLS_CTR_DRBG_SEEDLEN -#define DEPRECATED MBEDTLS_DEPRECATED -#define DES_DECRYPT MBEDTLS_DES_DECRYPT -#define DES_ENCRYPT MBEDTLS_DES_ENCRYPT -#define DES_KEY_SIZE MBEDTLS_DES_KEY_SIZE -#define ENTROPY_BLOCK_SIZE MBEDTLS_ENTROPY_BLOCK_SIZE -#define ENTROPY_MAX_GATHER MBEDTLS_ENTROPY_MAX_GATHER -#define ENTROPY_MAX_SEED_SIZE MBEDTLS_ENTROPY_MAX_SEED_SIZE -#define ENTROPY_MAX_SOURCES MBEDTLS_ENTROPY_MAX_SOURCES -#define ENTROPY_MIN_HARDCLOCK MBEDTLS_ENTROPY_MIN_HARDCLOCK -#define ENTROPY_MIN_HAVEGE MBEDTLS_ENTROPY_MIN_HAVEGE -#define ENTROPY_MIN_PLATFORM MBEDTLS_ENTROPY_MIN_PLATFORM -#define ENTROPY_SOURCE_MANUAL MBEDTLS_ENTROPY_SOURCE_MANUAL -#define EXT_AUTHORITY_KEY_IDENTIFIER MBEDTLS_X509_EXT_AUTHORITY_KEY_IDENTIFIER -#define EXT_BASIC_CONSTRAINTS MBEDTLS_X509_EXT_BASIC_CONSTRAINTS -#define EXT_CERTIFICATE_POLICIES MBEDTLS_X509_EXT_CERTIFICATE_POLICIES -#define EXT_CRL_DISTRIBUTION_POINTS MBEDTLS_X509_EXT_CRL_DISTRIBUTION_POINTS -#define EXT_EXTENDED_KEY_USAGE MBEDTLS_X509_EXT_EXTENDED_KEY_USAGE -#define EXT_FRESHEST_CRL MBEDTLS_X509_EXT_FRESHEST_CRL -#define EXT_INIHIBIT_ANYPOLICY MBEDTLS_X509_EXT_INIHIBIT_ANYPOLICY -#define EXT_ISSUER_ALT_NAME MBEDTLS_X509_EXT_ISSUER_ALT_NAME -#define EXT_KEY_USAGE MBEDTLS_X509_EXT_KEY_USAGE -#define EXT_NAME_CONSTRAINTS MBEDTLS_X509_EXT_NAME_CONSTRAINTS -#define EXT_NS_CERT_TYPE MBEDTLS_X509_EXT_NS_CERT_TYPE -#define EXT_POLICY_CONSTRAINTS MBEDTLS_X509_EXT_POLICY_CONSTRAINTS -#define EXT_POLICY_MAPPINGS MBEDTLS_X509_EXT_POLICY_MAPPINGS -#define EXT_SUBJECT_ALT_NAME MBEDTLS_X509_EXT_SUBJECT_ALT_NAME -#define EXT_SUBJECT_DIRECTORY_ATTRS MBEDTLS_X509_EXT_SUBJECT_DIRECTORY_ATTRS -#define EXT_SUBJECT_KEY_IDENTIFIER MBEDTLS_X509_EXT_SUBJECT_KEY_IDENTIFIER -#define GCM_DECRYPT MBEDTLS_GCM_DECRYPT -#define GCM_ENCRYPT MBEDTLS_GCM_ENCRYPT -#define KU_CRL_SIGN MBEDTLS_X509_KU_CRL_SIGN -#define KU_DATA_ENCIPHERMENT MBEDTLS_X509_KU_DATA_ENCIPHERMENT -#define KU_DIGITAL_SIGNATURE MBEDTLS_X509_KU_DIGITAL_SIGNATURE -#define KU_KEY_AGREEMENT MBEDTLS_X509_KU_KEY_AGREEMENT -#define KU_KEY_CERT_SIGN MBEDTLS_X509_KU_KEY_CERT_SIGN -#define KU_KEY_ENCIPHERMENT MBEDTLS_X509_KU_KEY_ENCIPHERMENT -#define KU_NON_REPUDIATION MBEDTLS_X509_KU_NON_REPUDIATION -#define LN_2_DIV_LN_10_SCALE100 MBEDTLS_LN_2_DIV_LN_10_SCALE100 -#define MD_CONTEXT_T_INIT MBEDTLS_MD_CONTEXT_T_INIT -#define MEMORY_VERIFY_ALLOC MBEDTLS_MEMORY_VERIFY_ALLOC -#define MEMORY_VERIFY_ALWAYS MBEDTLS_MEMORY_VERIFY_ALWAYS -#define MEMORY_VERIFY_FREE MBEDTLS_MEMORY_VERIFY_FREE -#define MEMORY_VERIFY_NONE MBEDTLS_MEMORY_VERIFY_NONE -#define MPI_CHK MBEDTLS_MPI_CHK -#define NET_PROTO_TCP MBEDTLS_NET_PROTO_TCP -#define NET_PROTO_UDP MBEDTLS_NET_PROTO_UDP -#define NS_CERT_TYPE_EMAIL MBEDTLS_X509_NS_CERT_TYPE_EMAIL -#define NS_CERT_TYPE_EMAIL_CA MBEDTLS_X509_NS_CERT_TYPE_EMAIL_CA -#define NS_CERT_TYPE_OBJECT_SIGNING MBEDTLS_X509_NS_CERT_TYPE_OBJECT_SIGNING -#define NS_CERT_TYPE_OBJECT_SIGNING_CA MBEDTLS_X509_NS_CERT_TYPE_OBJECT_SIGNING_CA -#define NS_CERT_TYPE_RESERVED MBEDTLS_X509_NS_CERT_TYPE_RESERVED -#define NS_CERT_TYPE_SSL_CA MBEDTLS_X509_NS_CERT_TYPE_SSL_CA -#define NS_CERT_TYPE_SSL_CLIENT MBEDTLS_X509_NS_CERT_TYPE_SSL_CLIENT -#define NS_CERT_TYPE_SSL_SERVER MBEDTLS_X509_NS_CERT_TYPE_SSL_SERVER -#define OID_ANSI_X9_62 MBEDTLS_OID_ANSI_X9_62 -#define OID_ANSI_X9_62_FIELD_TYPE MBEDTLS_OID_ANSI_X9_62_FIELD_TYPE -#define OID_ANSI_X9_62_PRIME_FIELD MBEDTLS_OID_ANSI_X9_62_PRIME_FIELD -#define OID_ANSI_X9_62_SIG MBEDTLS_OID_ANSI_X9_62_SIG -#define OID_ANSI_X9_62_SIG_SHA2 MBEDTLS_OID_ANSI_X9_62_SIG_SHA2 -#define OID_ANY_EXTENDED_KEY_USAGE MBEDTLS_OID_ANY_EXTENDED_KEY_USAGE -#define OID_AT MBEDTLS_OID_AT -#define OID_AT_CN MBEDTLS_OID_AT_CN -#define OID_AT_COUNTRY MBEDTLS_OID_AT_COUNTRY -#define OID_AT_DN_QUALIFIER MBEDTLS_OID_AT_DN_QUALIFIER -#define OID_AT_GENERATION_QUALIFIER MBEDTLS_OID_AT_GENERATION_QUALIFIER -#define OID_AT_GIVEN_NAME MBEDTLS_OID_AT_GIVEN_NAME -#define OID_AT_INITIALS MBEDTLS_OID_AT_INITIALS -#define OID_AT_LOCALITY MBEDTLS_OID_AT_LOCALITY -#define OID_AT_ORGANIZATION MBEDTLS_OID_AT_ORGANIZATION -#define OID_AT_ORG_UNIT MBEDTLS_OID_AT_ORG_UNIT -#define OID_AT_POSTAL_ADDRESS MBEDTLS_OID_AT_POSTAL_ADDRESS -#define OID_AT_POSTAL_CODE MBEDTLS_OID_AT_POSTAL_CODE -#define OID_AT_PSEUDONYM MBEDTLS_OID_AT_PSEUDONYM -#define OID_AT_SERIAL_NUMBER MBEDTLS_OID_AT_SERIAL_NUMBER -#define OID_AT_STATE MBEDTLS_OID_AT_STATE -#define OID_AT_SUR_NAME MBEDTLS_OID_AT_SUR_NAME -#define OID_AT_TITLE MBEDTLS_OID_AT_TITLE -#define OID_AT_UNIQUE_IDENTIFIER MBEDTLS_OID_AT_UNIQUE_IDENTIFIER -#define OID_AUTHORITY_KEY_IDENTIFIER MBEDTLS_OID_AUTHORITY_KEY_IDENTIFIER -#define OID_BASIC_CONSTRAINTS MBEDTLS_OID_BASIC_CONSTRAINTS -#define OID_CERTICOM MBEDTLS_OID_CERTICOM -#define OID_CERTIFICATE_POLICIES MBEDTLS_OID_CERTIFICATE_POLICIES -#define OID_CLIENT_AUTH MBEDTLS_OID_CLIENT_AUTH -#define OID_CMP MBEDTLS_OID_CMP -#define OID_CODE_SIGNING MBEDTLS_OID_CODE_SIGNING -#define OID_COUNTRY_US MBEDTLS_OID_COUNTRY_US -#define OID_CRL_DISTRIBUTION_POINTS MBEDTLS_OID_CRL_DISTRIBUTION_POINTS -#define OID_CRL_NUMBER MBEDTLS_OID_CRL_NUMBER -#define OID_DES_CBC MBEDTLS_OID_DES_CBC -#define OID_DES_EDE3_CBC MBEDTLS_OID_DES_EDE3_CBC -#define OID_DIGEST_ALG_MD2 MBEDTLS_OID_DIGEST_ALG_MD2 -#define OID_DIGEST_ALG_MD4 MBEDTLS_OID_DIGEST_ALG_MD4 -#define OID_DIGEST_ALG_MD5 MBEDTLS_OID_DIGEST_ALG_MD5 -#define OID_DIGEST_ALG_SHA1 MBEDTLS_OID_DIGEST_ALG_SHA1 -#define OID_DIGEST_ALG_SHA224 MBEDTLS_OID_DIGEST_ALG_SHA224 -#define OID_DIGEST_ALG_SHA256 MBEDTLS_OID_DIGEST_ALG_SHA256 -#define OID_DIGEST_ALG_SHA384 MBEDTLS_OID_DIGEST_ALG_SHA384 -#define OID_DIGEST_ALG_SHA512 MBEDTLS_OID_DIGEST_ALG_SHA512 -#define OID_DOMAIN_COMPONENT MBEDTLS_OID_DOMAIN_COMPONENT -#define OID_ECDSA_SHA1 MBEDTLS_OID_ECDSA_SHA1 -#define OID_ECDSA_SHA224 MBEDTLS_OID_ECDSA_SHA224 -#define OID_ECDSA_SHA256 MBEDTLS_OID_ECDSA_SHA256 -#define OID_ECDSA_SHA384 MBEDTLS_OID_ECDSA_SHA384 -#define OID_ECDSA_SHA512 MBEDTLS_OID_ECDSA_SHA512 -#define OID_EC_ALG_ECDH MBEDTLS_OID_EC_ALG_ECDH -#define OID_EC_ALG_UNRESTRICTED MBEDTLS_OID_EC_ALG_UNRESTRICTED -#define OID_EC_BRAINPOOL_V1 MBEDTLS_OID_EC_BRAINPOOL_V1 -#define OID_EC_GRP_BP256R1 MBEDTLS_OID_EC_GRP_BP256R1 -#define OID_EC_GRP_BP384R1 MBEDTLS_OID_EC_GRP_BP384R1 -#define OID_EC_GRP_BP512R1 MBEDTLS_OID_EC_GRP_BP512R1 -#define OID_EC_GRP_SECP192K1 MBEDTLS_OID_EC_GRP_SECP192K1 -#define OID_EC_GRP_SECP192R1 MBEDTLS_OID_EC_GRP_SECP192R1 -#define OID_EC_GRP_SECP224K1 MBEDTLS_OID_EC_GRP_SECP224K1 -#define OID_EC_GRP_SECP224R1 MBEDTLS_OID_EC_GRP_SECP224R1 -#define OID_EC_GRP_SECP256K1 MBEDTLS_OID_EC_GRP_SECP256K1 -#define OID_EC_GRP_SECP256R1 MBEDTLS_OID_EC_GRP_SECP256R1 -#define OID_EC_GRP_SECP384R1 MBEDTLS_OID_EC_GRP_SECP384R1 -#define OID_EC_GRP_SECP521R1 MBEDTLS_OID_EC_GRP_SECP521R1 -#define OID_EMAIL_PROTECTION MBEDTLS_OID_EMAIL_PROTECTION -#define OID_EXTENDED_KEY_USAGE MBEDTLS_OID_EXTENDED_KEY_USAGE -#define OID_FRESHEST_CRL MBEDTLS_OID_FRESHEST_CRL -#define OID_GOV MBEDTLS_OID_GOV -#define OID_HMAC_SHA1 MBEDTLS_OID_HMAC_SHA1 -#define OID_ID_CE MBEDTLS_OID_ID_CE -#define OID_INIHIBIT_ANYPOLICY MBEDTLS_OID_INIHIBIT_ANYPOLICY -#define OID_ISO_CCITT_DS MBEDTLS_OID_ISO_CCITT_DS -#define OID_ISO_IDENTIFIED_ORG MBEDTLS_OID_ISO_IDENTIFIED_ORG -#define OID_ISO_ITU_COUNTRY MBEDTLS_OID_ISO_ITU_COUNTRY -#define OID_ISO_ITU_US_ORG MBEDTLS_OID_ISO_ITU_US_ORG -#define OID_ISO_MEMBER_BODIES MBEDTLS_OID_ISO_MEMBER_BODIES -#define OID_ISSUER_ALT_NAME MBEDTLS_OID_ISSUER_ALT_NAME -#define OID_KEY_USAGE MBEDTLS_OID_KEY_USAGE -#define OID_KP MBEDTLS_OID_KP -#define OID_MGF1 MBEDTLS_OID_MGF1 -#define OID_NAME_CONSTRAINTS MBEDTLS_OID_NAME_CONSTRAINTS -#define OID_NETSCAPE MBEDTLS_OID_NETSCAPE -#define OID_NS_BASE_URL MBEDTLS_OID_NS_BASE_URL -#define OID_NS_CA_POLICY_URL MBEDTLS_OID_NS_CA_POLICY_URL -#define OID_NS_CA_REVOCATION_URL MBEDTLS_OID_NS_CA_REVOCATION_URL -#define OID_NS_CERT MBEDTLS_OID_NS_CERT -#define OID_NS_CERT_SEQUENCE MBEDTLS_OID_NS_CERT_SEQUENCE -#define OID_NS_CERT_TYPE MBEDTLS_OID_NS_CERT_TYPE -#define OID_NS_COMMENT MBEDTLS_OID_NS_COMMENT -#define OID_NS_DATA_TYPE MBEDTLS_OID_NS_DATA_TYPE -#define OID_NS_RENEWAL_URL MBEDTLS_OID_NS_RENEWAL_URL -#define OID_NS_REVOCATION_URL MBEDTLS_OID_NS_REVOCATION_URL -#define OID_NS_SSL_SERVER_NAME MBEDTLS_OID_NS_SSL_SERVER_NAME -#define OID_OCSP_SIGNING MBEDTLS_OID_OCSP_SIGNING -#define OID_OIW_SECSIG MBEDTLS_OID_OIW_SECSIG -#define OID_OIW_SECSIG_ALG MBEDTLS_OID_OIW_SECSIG_ALG -#define OID_OIW_SECSIG_SHA1 MBEDTLS_OID_OIW_SECSIG_SHA1 -#define OID_ORGANIZATION MBEDTLS_OID_ORGANIZATION -#define OID_ORG_ANSI_X9_62 MBEDTLS_OID_ORG_ANSI_X9_62 -#define OID_ORG_CERTICOM MBEDTLS_OID_ORG_CERTICOM -#define OID_ORG_DOD MBEDTLS_OID_ORG_DOD -#define OID_ORG_GOV MBEDTLS_OID_ORG_GOV -#define OID_ORG_NETSCAPE MBEDTLS_OID_ORG_NETSCAPE -#define OID_ORG_OIW MBEDTLS_OID_ORG_OIW -#define OID_ORG_RSA_DATA_SECURITY MBEDTLS_OID_ORG_RSA_DATA_SECURITY -#define OID_ORG_TELETRUST MBEDTLS_OID_ORG_TELETRUST -#define OID_PKCS MBEDTLS_OID_PKCS -#define OID_PKCS1 MBEDTLS_OID_PKCS1 -#define OID_PKCS12 MBEDTLS_OID_PKCS12 -#define OID_PKCS12_PBE MBEDTLS_OID_PKCS12_PBE -#define OID_PKCS12_PBE_SHA1_DES2_EDE_CBC MBEDTLS_OID_PKCS12_PBE_SHA1_DES2_EDE_CBC -#define OID_PKCS12_PBE_SHA1_DES3_EDE_CBC MBEDTLS_OID_PKCS12_PBE_SHA1_DES3_EDE_CBC -#define OID_PKCS12_PBE_SHA1_RC2_128_CBC MBEDTLS_OID_PKCS12_PBE_SHA1_RC2_128_CBC -#define OID_PKCS12_PBE_SHA1_RC2_40_CBC MBEDTLS_OID_PKCS12_PBE_SHA1_RC2_40_CBC -#define OID_PKCS12_PBE_SHA1_RC4_128 MBEDTLS_OID_PKCS12_PBE_SHA1_RC4_128 -#define OID_PKCS12_PBE_SHA1_RC4_40 MBEDTLS_OID_PKCS12_PBE_SHA1_RC4_40 -#define OID_PKCS1_MD2 MBEDTLS_OID_PKCS1_MD2 -#define OID_PKCS1_MD4 MBEDTLS_OID_PKCS1_MD4 -#define OID_PKCS1_MD5 MBEDTLS_OID_PKCS1_MD5 -#define OID_PKCS1_RSA MBEDTLS_OID_PKCS1_RSA -#define OID_PKCS1_SHA1 MBEDTLS_OID_PKCS1_SHA1 -#define OID_PKCS1_SHA224 MBEDTLS_OID_PKCS1_SHA224 -#define OID_PKCS1_SHA256 MBEDTLS_OID_PKCS1_SHA256 -#define OID_PKCS1_SHA384 MBEDTLS_OID_PKCS1_SHA384 -#define OID_PKCS1_SHA512 MBEDTLS_OID_PKCS1_SHA512 -#define OID_PKCS5 MBEDTLS_OID_PKCS5 -#define OID_PKCS5_PBES2 MBEDTLS_OID_PKCS5_PBES2 -#define OID_PKCS5_PBE_MD2_DES_CBC MBEDTLS_OID_PKCS5_PBE_MD2_DES_CBC -#define OID_PKCS5_PBE_MD2_RC2_CBC MBEDTLS_OID_PKCS5_PBE_MD2_RC2_CBC -#define OID_PKCS5_PBE_MD5_DES_CBC MBEDTLS_OID_PKCS5_PBE_MD5_DES_CBC -#define OID_PKCS5_PBE_MD5_RC2_CBC MBEDTLS_OID_PKCS5_PBE_MD5_RC2_CBC -#define OID_PKCS5_PBE_SHA1_DES_CBC MBEDTLS_OID_PKCS5_PBE_SHA1_DES_CBC -#define OID_PKCS5_PBE_SHA1_RC2_CBC MBEDTLS_OID_PKCS5_PBE_SHA1_RC2_CBC -#define OID_PKCS5_PBKDF2 MBEDTLS_OID_PKCS5_PBKDF2 -#define OID_PKCS5_PBMAC1 MBEDTLS_OID_PKCS5_PBMAC1 -#define OID_PKCS9 MBEDTLS_OID_PKCS9 -#define OID_PKCS9_CSR_EXT_REQ MBEDTLS_OID_PKCS9_CSR_EXT_REQ -#define OID_PKCS9_EMAIL MBEDTLS_OID_PKCS9_EMAIL -#define OID_PKIX MBEDTLS_OID_PKIX -#define OID_POLICY_CONSTRAINTS MBEDTLS_OID_POLICY_CONSTRAINTS -#define OID_POLICY_MAPPINGS MBEDTLS_OID_POLICY_MAPPINGS -#define OID_PRIVATE_KEY_USAGE_PERIOD MBEDTLS_OID_PRIVATE_KEY_USAGE_PERIOD -#define OID_RSASSA_PSS MBEDTLS_OID_RSASSA_PSS -#define OID_RSA_COMPANY MBEDTLS_OID_RSA_COMPANY -#define OID_RSA_SHA_OBS MBEDTLS_OID_RSA_SHA_OBS -#define OID_SERVER_AUTH MBEDTLS_OID_SERVER_AUTH -#define OID_SIZE MBEDTLS_OID_SIZE -#define OID_SUBJECT_ALT_NAME MBEDTLS_OID_SUBJECT_ALT_NAME -#define OID_SUBJECT_DIRECTORY_ATTRS MBEDTLS_OID_SUBJECT_DIRECTORY_ATTRS -#define OID_SUBJECT_KEY_IDENTIFIER MBEDTLS_OID_SUBJECT_KEY_IDENTIFIER -#define OID_TELETRUST MBEDTLS_OID_TELETRUST -#define OID_TIME_STAMPING MBEDTLS_OID_TIME_STAMPING -#define PADLOCK_ACE MBEDTLS_PADLOCK_ACE -#define PADLOCK_ALIGN16 MBEDTLS_PADLOCK_ALIGN16 -#define PADLOCK_PHE MBEDTLS_PADLOCK_PHE -#define PADLOCK_PMM MBEDTLS_PADLOCK_PMM -#define PADLOCK_RNG MBEDTLS_PADLOCK_RNG -#define PKCS12_DERIVE_IV MBEDTLS_PKCS12_DERIVE_IV -#define PKCS12_DERIVE_KEY MBEDTLS_PKCS12_DERIVE_KEY -#define PKCS12_DERIVE_MAC_KEY MBEDTLS_PKCS12_DERIVE_MAC_KEY -#define PKCS12_PBE_DECRYPT MBEDTLS_PKCS12_PBE_DECRYPT -#define PKCS12_PBE_ENCRYPT MBEDTLS_PKCS12_PBE_ENCRYPT -#define PKCS5_DECRYPT MBEDTLS_PKCS5_DECRYPT -#define PKCS5_ENCRYPT MBEDTLS_PKCS5_ENCRYPT -#define POLARSSL_AESNI_AES MBEDTLS_AESNI_AES -#define POLARSSL_AESNI_CLMUL MBEDTLS_AESNI_CLMUL -#define POLARSSL_AESNI_H MBEDTLS_AESNI_H -#define POLARSSL_AES_H MBEDTLS_AES_H -#define POLARSSL_ARC4_H MBEDTLS_ARC4_H -#define POLARSSL_ASN1_H MBEDTLS_ASN1_H -#define POLARSSL_ASN1_WRITE_H MBEDTLS_ASN1_WRITE_H -#define POLARSSL_BASE64_H MBEDTLS_BASE64_H -#define POLARSSL_BIGNUM_H MBEDTLS_BIGNUM_H -#define POLARSSL_BLOWFISH_H MBEDTLS_BLOWFISH_H -#define POLARSSL_BN_MUL_H MBEDTLS_BN_MUL_H -#define POLARSSL_CAMELLIA_H MBEDTLS_CAMELLIA_H -#define POLARSSL_CCM_H MBEDTLS_CCM_H -#define POLARSSL_CERTS_H MBEDTLS_CERTS_H -#define POLARSSL_CHECK_CONFIG_H MBEDTLS_CHECK_CONFIG_H -#define POLARSSL_CIPHERSUITE_NODTLS MBEDTLS_CIPHERSUITE_NODTLS -#define POLARSSL_CIPHERSUITE_SHORT_TAG MBEDTLS_CIPHERSUITE_SHORT_TAG -#define POLARSSL_CIPHERSUITE_WEAK MBEDTLS_CIPHERSUITE_WEAK -#define POLARSSL_CIPHER_AES_128_CBC MBEDTLS_CIPHER_AES_128_CBC -#define POLARSSL_CIPHER_AES_128_CCM MBEDTLS_CIPHER_AES_128_CCM -#define POLARSSL_CIPHER_AES_128_CFB128 MBEDTLS_CIPHER_AES_128_CFB128 -#define POLARSSL_CIPHER_AES_128_CTR MBEDTLS_CIPHER_AES_128_CTR -#define POLARSSL_CIPHER_AES_128_ECB MBEDTLS_CIPHER_AES_128_ECB -#define POLARSSL_CIPHER_AES_128_GCM MBEDTLS_CIPHER_AES_128_GCM -#define POLARSSL_CIPHER_AES_192_CBC MBEDTLS_CIPHER_AES_192_CBC -#define POLARSSL_CIPHER_AES_192_CCM MBEDTLS_CIPHER_AES_192_CCM -#define POLARSSL_CIPHER_AES_192_CFB128 MBEDTLS_CIPHER_AES_192_CFB128 -#define POLARSSL_CIPHER_AES_192_CTR MBEDTLS_CIPHER_AES_192_CTR -#define POLARSSL_CIPHER_AES_192_ECB MBEDTLS_CIPHER_AES_192_ECB -#define POLARSSL_CIPHER_AES_192_GCM MBEDTLS_CIPHER_AES_192_GCM -#define POLARSSL_CIPHER_AES_256_CBC MBEDTLS_CIPHER_AES_256_CBC -#define POLARSSL_CIPHER_AES_256_CCM MBEDTLS_CIPHER_AES_256_CCM -#define POLARSSL_CIPHER_AES_256_CFB128 MBEDTLS_CIPHER_AES_256_CFB128 -#define POLARSSL_CIPHER_AES_256_CTR MBEDTLS_CIPHER_AES_256_CTR -#define POLARSSL_CIPHER_AES_256_ECB MBEDTLS_CIPHER_AES_256_ECB -#define POLARSSL_CIPHER_AES_256_GCM MBEDTLS_CIPHER_AES_256_GCM -#define POLARSSL_CIPHER_ARC4_128 MBEDTLS_CIPHER_ARC4_128 -#define POLARSSL_CIPHER_BLOWFISH_CBC MBEDTLS_CIPHER_BLOWFISH_CBC -#define POLARSSL_CIPHER_BLOWFISH_CFB64 MBEDTLS_CIPHER_BLOWFISH_CFB64 -#define POLARSSL_CIPHER_BLOWFISH_CTR MBEDTLS_CIPHER_BLOWFISH_CTR -#define POLARSSL_CIPHER_BLOWFISH_ECB MBEDTLS_CIPHER_BLOWFISH_ECB -#define POLARSSL_CIPHER_CAMELLIA_128_CBC MBEDTLS_CIPHER_CAMELLIA_128_CBC -#define POLARSSL_CIPHER_CAMELLIA_128_CCM MBEDTLS_CIPHER_CAMELLIA_128_CCM -#define POLARSSL_CIPHER_CAMELLIA_128_CFB128 MBEDTLS_CIPHER_CAMELLIA_128_CFB128 -#define POLARSSL_CIPHER_CAMELLIA_128_CTR MBEDTLS_CIPHER_CAMELLIA_128_CTR -#define POLARSSL_CIPHER_CAMELLIA_128_ECB MBEDTLS_CIPHER_CAMELLIA_128_ECB -#define POLARSSL_CIPHER_CAMELLIA_128_GCM MBEDTLS_CIPHER_CAMELLIA_128_GCM -#define POLARSSL_CIPHER_CAMELLIA_192_CBC MBEDTLS_CIPHER_CAMELLIA_192_CBC -#define POLARSSL_CIPHER_CAMELLIA_192_CCM MBEDTLS_CIPHER_CAMELLIA_192_CCM -#define POLARSSL_CIPHER_CAMELLIA_192_CFB128 MBEDTLS_CIPHER_CAMELLIA_192_CFB128 -#define POLARSSL_CIPHER_CAMELLIA_192_CTR MBEDTLS_CIPHER_CAMELLIA_192_CTR -#define POLARSSL_CIPHER_CAMELLIA_192_ECB MBEDTLS_CIPHER_CAMELLIA_192_ECB -#define POLARSSL_CIPHER_CAMELLIA_192_GCM MBEDTLS_CIPHER_CAMELLIA_192_GCM -#define POLARSSL_CIPHER_CAMELLIA_256_CBC MBEDTLS_CIPHER_CAMELLIA_256_CBC -#define POLARSSL_CIPHER_CAMELLIA_256_CCM MBEDTLS_CIPHER_CAMELLIA_256_CCM -#define POLARSSL_CIPHER_CAMELLIA_256_CFB128 MBEDTLS_CIPHER_CAMELLIA_256_CFB128 -#define POLARSSL_CIPHER_CAMELLIA_256_CTR MBEDTLS_CIPHER_CAMELLIA_256_CTR -#define POLARSSL_CIPHER_CAMELLIA_256_ECB MBEDTLS_CIPHER_CAMELLIA_256_ECB -#define POLARSSL_CIPHER_CAMELLIA_256_GCM MBEDTLS_CIPHER_CAMELLIA_256_GCM -#define POLARSSL_CIPHER_DES_CBC MBEDTLS_CIPHER_DES_CBC -#define POLARSSL_CIPHER_DES_ECB MBEDTLS_CIPHER_DES_ECB -#define POLARSSL_CIPHER_DES_EDE3_CBC MBEDTLS_CIPHER_DES_EDE3_CBC -#define POLARSSL_CIPHER_DES_EDE3_ECB MBEDTLS_CIPHER_DES_EDE3_ECB -#define POLARSSL_CIPHER_DES_EDE_CBC MBEDTLS_CIPHER_DES_EDE_CBC -#define POLARSSL_CIPHER_DES_EDE_ECB MBEDTLS_CIPHER_DES_EDE_ECB -#define POLARSSL_CIPHER_H MBEDTLS_CIPHER_H -#define POLARSSL_CIPHER_ID_3DES MBEDTLS_CIPHER_ID_3DES -#define POLARSSL_CIPHER_ID_AES MBEDTLS_CIPHER_ID_AES -#define POLARSSL_CIPHER_ID_ARC4 MBEDTLS_CIPHER_ID_ARC4 -#define POLARSSL_CIPHER_ID_BLOWFISH MBEDTLS_CIPHER_ID_BLOWFISH -#define POLARSSL_CIPHER_ID_CAMELLIA MBEDTLS_CIPHER_ID_CAMELLIA -#define POLARSSL_CIPHER_ID_DES MBEDTLS_CIPHER_ID_DES -#define POLARSSL_CIPHER_ID_NONE MBEDTLS_CIPHER_ID_NONE -#define POLARSSL_CIPHER_ID_NULL MBEDTLS_CIPHER_ID_NULL -#define POLARSSL_CIPHER_MODE_AEAD MBEDTLS_CIPHER_MODE_AEAD -#define POLARSSL_CIPHER_MODE_STREAM MBEDTLS_CIPHER_MODE_STREAM -#define POLARSSL_CIPHER_MODE_WITH_PADDING MBEDTLS_CIPHER_MODE_WITH_PADDING -#define POLARSSL_CIPHER_NONE MBEDTLS_CIPHER_NONE -#define POLARSSL_CIPHER_NULL MBEDTLS_CIPHER_NULL -#define POLARSSL_CIPHER_VARIABLE_IV_LEN MBEDTLS_CIPHER_VARIABLE_IV_LEN -#define POLARSSL_CIPHER_VARIABLE_KEY_LEN MBEDTLS_CIPHER_VARIABLE_KEY_LEN -#define POLARSSL_CIPHER_WRAP_H MBEDTLS_CIPHER_WRAP_H -#define POLARSSL_CONFIG_H MBEDTLS_CONFIG_H -#define POLARSSL_CTR_DRBG_H MBEDTLS_CTR_DRBG_H -#define POLARSSL_DEBUG_H MBEDTLS_DEBUG_H -#define POLARSSL_DEBUG_LOG_FULL MBEDTLS_DEBUG_LOG_FULL -#define POLARSSL_DEBUG_LOG_RAW MBEDTLS_DEBUG_LOG_RAW -#define POLARSSL_DECRYPT MBEDTLS_DECRYPT -#define POLARSSL_DES_H MBEDTLS_DES_H -#define POLARSSL_DHM_H MBEDTLS_DHM_H -#define POLARSSL_DHM_RFC2409_MODP_1024_G MBEDTLS_DHM_RFC2409_MODP_1024_G -#define POLARSSL_DHM_RFC2409_MODP_1024_P MBEDTLS_DHM_RFC2409_MODP_1024_P -#define POLARSSL_DHM_RFC3526_MODP_2048_G MBEDTLS_DHM_RFC3526_MODP_2048_G -#define POLARSSL_DHM_RFC3526_MODP_2048_P MBEDTLS_DHM_RFC3526_MODP_2048_P -#define POLARSSL_DHM_RFC3526_MODP_3072_G MBEDTLS_DHM_RFC3526_MODP_3072_G -#define POLARSSL_DHM_RFC3526_MODP_3072_P MBEDTLS_DHM_RFC3526_MODP_3072_P -#define POLARSSL_DHM_RFC5114_MODP_1024_G MBEDTLS_DHM_RFC5114_MODP_1024_G -#define POLARSSL_DHM_RFC5114_MODP_1024_P MBEDTLS_DHM_RFC5114_MODP_1024_P -#define POLARSSL_DHM_RFC5114_MODP_2048_G MBEDTLS_DHM_RFC5114_MODP_2048_G -#define POLARSSL_DHM_RFC5114_MODP_2048_P MBEDTLS_DHM_RFC5114_MODP_2048_P -#define POLARSSL_ECDH_H MBEDTLS_ECDH_H -#define POLARSSL_ECDH_OURS MBEDTLS_ECDH_OURS -#define POLARSSL_ECDH_THEIRS MBEDTLS_ECDH_THEIRS -#define POLARSSL_ECDSA_H MBEDTLS_ECDSA_H -#define POLARSSL_ECP_DP_BP256R1 MBEDTLS_ECP_DP_BP256R1 -#define POLARSSL_ECP_DP_BP384R1 MBEDTLS_ECP_DP_BP384R1 -#define POLARSSL_ECP_DP_BP512R1 MBEDTLS_ECP_DP_BP512R1 -#define POLARSSL_ECP_DP_M255 MBEDTLS_ECP_DP_CURVE25519 -#define POLARSSL_ECP_DP_MAX MBEDTLS_ECP_DP_MAX -#define POLARSSL_ECP_DP_NONE MBEDTLS_ECP_DP_NONE -#define POLARSSL_ECP_DP_SECP192K1 MBEDTLS_ECP_DP_SECP192K1 -#define POLARSSL_ECP_DP_SECP192R1 MBEDTLS_ECP_DP_SECP192R1 -#define POLARSSL_ECP_DP_SECP224K1 MBEDTLS_ECP_DP_SECP224K1 -#define POLARSSL_ECP_DP_SECP224R1 MBEDTLS_ECP_DP_SECP224R1 -#define POLARSSL_ECP_DP_SECP256K1 MBEDTLS_ECP_DP_SECP256K1 -#define POLARSSL_ECP_DP_SECP256R1 MBEDTLS_ECP_DP_SECP256R1 -#define POLARSSL_ECP_DP_SECP384R1 MBEDTLS_ECP_DP_SECP384R1 -#define POLARSSL_ECP_DP_SECP521R1 MBEDTLS_ECP_DP_SECP521R1 -#define POLARSSL_ECP_H MBEDTLS_ECP_H -#define POLARSSL_ECP_MAX_BYTES MBEDTLS_ECP_MAX_BYTES -#define POLARSSL_ECP_MAX_PT_LEN MBEDTLS_ECP_MAX_PT_LEN -#define POLARSSL_ECP_PF_COMPRESSED MBEDTLS_ECP_PF_COMPRESSED -#define POLARSSL_ECP_PF_UNCOMPRESSED MBEDTLS_ECP_PF_UNCOMPRESSED -#define POLARSSL_ECP_TLS_NAMED_CURVE MBEDTLS_ECP_TLS_NAMED_CURVE -#define POLARSSL_ENCRYPT MBEDTLS_ENCRYPT -#define POLARSSL_ENTROPY_H MBEDTLS_ENTROPY_H -#define POLARSSL_ENTROPY_POLL_H MBEDTLS_ENTROPY_POLL_H -#define POLARSSL_ENTROPY_SHA256_ACCUMULATOR MBEDTLS_ENTROPY_SHA256_ACCUMULATOR -#define POLARSSL_ENTROPY_SHA512_ACCUMULATOR MBEDTLS_ENTROPY_SHA512_ACCUMULATOR -#define POLARSSL_ERROR_H MBEDTLS_ERROR_H -#define POLARSSL_ERR_AES_INVALID_INPUT_LENGTH MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH -#define POLARSSL_ERR_AES_INVALID_KEY_LENGTH MBEDTLS_ERR_AES_INVALID_KEY_LENGTH -#define POLARSSL_ERR_ASN1_BUF_TOO_SMALL MBEDTLS_ERR_ASN1_BUF_TOO_SMALL -#define POLARSSL_ERR_ASN1_INVALID_DATA MBEDTLS_ERR_ASN1_INVALID_DATA -#define POLARSSL_ERR_ASN1_INVALID_LENGTH MBEDTLS_ERR_ASN1_INVALID_LENGTH -#define POLARSSL_ERR_ASN1_LENGTH_MISMATCH MBEDTLS_ERR_ASN1_LENGTH_MISMATCH -#define POLARSSL_ERR_ASN1_MALLOC_FAILED MBEDTLS_ERR_ASN1_ALLOC_FAILED -#define POLARSSL_ERR_ASN1_OUT_OF_DATA MBEDTLS_ERR_ASN1_OUT_OF_DATA -#define POLARSSL_ERR_ASN1_UNEXPECTED_TAG MBEDTLS_ERR_ASN1_UNEXPECTED_TAG -#define POLARSSL_ERR_BASE64_BUFFER_TOO_SMALL MBEDTLS_ERR_BASE64_BUFFER_TOO_SMALL -#define POLARSSL_ERR_BASE64_INVALID_CHARACTER MBEDTLS_ERR_BASE64_INVALID_CHARACTER -#define POLARSSL_ERR_BLOWFISH_INVALID_INPUT_LENGTH MBEDTLS_ERR_BLOWFISH_INVALID_INPUT_LENGTH -#define POLARSSL_ERR_BLOWFISH_INVALID_KEY_LENGTH MBEDTLS_ERR_BLOWFISH_INVALID_KEY_LENGTH -#define POLARSSL_ERR_CAMELLIA_INVALID_INPUT_LENGTH MBEDTLS_ERR_CAMELLIA_INVALID_INPUT_LENGTH -#define POLARSSL_ERR_CAMELLIA_INVALID_KEY_LENGTH MBEDTLS_ERR_CAMELLIA_INVALID_KEY_LENGTH -#define POLARSSL_ERR_CCM_AUTH_FAILED MBEDTLS_ERR_CCM_AUTH_FAILED -#define POLARSSL_ERR_CCM_BAD_INPUT MBEDTLS_ERR_CCM_BAD_INPUT -#define POLARSSL_ERR_CIPHER_ALLOC_FAILED MBEDTLS_ERR_CIPHER_ALLOC_FAILED -#define POLARSSL_ERR_CIPHER_AUTH_FAILED MBEDTLS_ERR_CIPHER_AUTH_FAILED -#define POLARSSL_ERR_CIPHER_BAD_INPUT_DATA MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA -#define POLARSSL_ERR_CIPHER_FEATURE_UNAVAILABLE MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE -#define POLARSSL_ERR_CIPHER_FULL_BLOCK_EXPECTED MBEDTLS_ERR_CIPHER_FULL_BLOCK_EXPECTED -#define POLARSSL_ERR_CIPHER_INVALID_PADDING MBEDTLS_ERR_CIPHER_INVALID_PADDING -#define POLARSSL_ERR_CTR_DRBG_ENTROPY_SOURCE_FAILED MBEDTLS_ERR_CTR_DRBG_ENTROPY_SOURCE_FAILED -#define POLARSSL_ERR_CTR_DRBG_FILE_IO_ERROR MBEDTLS_ERR_CTR_DRBG_FILE_IO_ERROR -#define POLARSSL_ERR_CTR_DRBG_INPUT_TOO_BIG MBEDTLS_ERR_CTR_DRBG_INPUT_TOO_BIG -#define POLARSSL_ERR_CTR_DRBG_REQUEST_TOO_BIG MBEDTLS_ERR_CTR_DRBG_REQUEST_TOO_BIG -#define POLARSSL_ERR_DES_INVALID_INPUT_LENGTH MBEDTLS_ERR_DES_INVALID_INPUT_LENGTH -#define POLARSSL_ERR_DHM_BAD_INPUT_DATA MBEDTLS_ERR_DHM_BAD_INPUT_DATA -#define POLARSSL_ERR_DHM_CALC_SECRET_FAILED MBEDTLS_ERR_DHM_CALC_SECRET_FAILED -#define POLARSSL_ERR_DHM_FILE_IO_ERROR MBEDTLS_ERR_DHM_FILE_IO_ERROR -#define POLARSSL_ERR_DHM_INVALID_FORMAT MBEDTLS_ERR_DHM_INVALID_FORMAT -#define POLARSSL_ERR_DHM_MAKE_PARAMS_FAILED MBEDTLS_ERR_DHM_MAKE_PARAMS_FAILED -#define POLARSSL_ERR_DHM_MAKE_PUBLIC_FAILED MBEDTLS_ERR_DHM_MAKE_PUBLIC_FAILED -#define POLARSSL_ERR_DHM_MALLOC_FAILED MBEDTLS_ERR_DHM_ALLOC_FAILED -#define POLARSSL_ERR_DHM_READ_PARAMS_FAILED MBEDTLS_ERR_DHM_READ_PARAMS_FAILED -#define POLARSSL_ERR_DHM_READ_PUBLIC_FAILED MBEDTLS_ERR_DHM_READ_PUBLIC_FAILED -#define POLARSSL_ERR_ECP_BAD_INPUT_DATA MBEDTLS_ERR_ECP_BAD_INPUT_DATA -#define POLARSSL_ERR_ECP_BUFFER_TOO_SMALL MBEDTLS_ERR_ECP_BUFFER_TOO_SMALL -#define POLARSSL_ERR_ECP_FEATURE_UNAVAILABLE MBEDTLS_ERR_ECP_FEATURE_UNAVAILABLE -#define POLARSSL_ERR_ECP_INVALID_KEY MBEDTLS_ERR_ECP_INVALID_KEY -#define POLARSSL_ERR_ECP_MALLOC_FAILED MBEDTLS_ERR_ECP_ALLOC_FAILED -#define POLARSSL_ERR_ECP_RANDOM_FAILED MBEDTLS_ERR_ECP_RANDOM_FAILED -#define POLARSSL_ERR_ECP_SIG_LEN_MISMATCH MBEDTLS_ERR_ECP_SIG_LEN_MISMATCH -#define POLARSSL_ERR_ECP_VERIFY_FAILED MBEDTLS_ERR_ECP_VERIFY_FAILED -#define POLARSSL_ERR_ENTROPY_FILE_IO_ERROR MBEDTLS_ERR_ENTROPY_FILE_IO_ERROR -#define POLARSSL_ERR_ENTROPY_MAX_SOURCES MBEDTLS_ERR_ENTROPY_MAX_SOURCES -#define POLARSSL_ERR_ENTROPY_NO_SOURCES_DEFINED MBEDTLS_ERR_ENTROPY_NO_SOURCES_DEFINED -#define POLARSSL_ERR_ENTROPY_SOURCE_FAILED MBEDTLS_ERR_ENTROPY_SOURCE_FAILED -#define POLARSSL_ERR_GCM_AUTH_FAILED MBEDTLS_ERR_GCM_AUTH_FAILED -#define POLARSSL_ERR_GCM_BAD_INPUT MBEDTLS_ERR_GCM_BAD_INPUT -#define POLARSSL_ERR_HMAC_DRBG_ENTROPY_SOURCE_FAILED MBEDTLS_ERR_HMAC_DRBG_ENTROPY_SOURCE_FAILED -#define POLARSSL_ERR_HMAC_DRBG_FILE_IO_ERROR MBEDTLS_ERR_HMAC_DRBG_FILE_IO_ERROR -#define POLARSSL_ERR_HMAC_DRBG_INPUT_TOO_BIG MBEDTLS_ERR_HMAC_DRBG_INPUT_TOO_BIG -#define POLARSSL_ERR_HMAC_DRBG_REQUEST_TOO_BIG MBEDTLS_ERR_HMAC_DRBG_REQUEST_TOO_BIG -#define POLARSSL_ERR_MD2_FILE_IO_ERROR MBEDTLS_ERR_MD2_FILE_IO_ERROR -#define POLARSSL_ERR_MD4_FILE_IO_ERROR MBEDTLS_ERR_MD4_FILE_IO_ERROR -#define POLARSSL_ERR_MD5_FILE_IO_ERROR MBEDTLS_ERR_MD5_FILE_IO_ERROR -#define POLARSSL_ERR_MD_ALLOC_FAILED MBEDTLS_ERR_MD_ALLOC_FAILED -#define POLARSSL_ERR_MD_BAD_INPUT_DATA MBEDTLS_ERR_MD_BAD_INPUT_DATA -#define POLARSSL_ERR_MD_FEATURE_UNAVAILABLE MBEDTLS_ERR_MD_FEATURE_UNAVAILABLE -#define POLARSSL_ERR_MD_FILE_IO_ERROR MBEDTLS_ERR_MD_FILE_IO_ERROR -#define POLARSSL_ERR_MPI_BAD_INPUT_DATA MBEDTLS_ERR_MPI_BAD_INPUT_DATA -#define POLARSSL_ERR_MPI_BUFFER_TOO_SMALL MBEDTLS_ERR_MPI_BUFFER_TOO_SMALL -#define POLARSSL_ERR_MPI_DIVISION_BY_ZERO MBEDTLS_ERR_MPI_DIVISION_BY_ZERO -#define POLARSSL_ERR_MPI_FILE_IO_ERROR MBEDTLS_ERR_MPI_FILE_IO_ERROR -#define POLARSSL_ERR_MPI_INVALID_CHARACTER MBEDTLS_ERR_MPI_INVALID_CHARACTER -#define POLARSSL_ERR_MPI_MALLOC_FAILED MBEDTLS_ERR_MPI_ALLOC_FAILED -#define POLARSSL_ERR_MPI_NEGATIVE_VALUE MBEDTLS_ERR_MPI_NEGATIVE_VALUE -#define POLARSSL_ERR_MPI_NOT_ACCEPTABLE MBEDTLS_ERR_MPI_NOT_ACCEPTABLE -#define POLARSSL_ERR_NET_ACCEPT_FAILED MBEDTLS_ERR_NET_ACCEPT_FAILED -#define POLARSSL_ERR_NET_BIND_FAILED MBEDTLS_ERR_NET_BIND_FAILED -#define POLARSSL_ERR_NET_CONNECT_FAILED MBEDTLS_ERR_NET_CONNECT_FAILED -#define POLARSSL_ERR_NET_CONN_RESET MBEDTLS_ERR_NET_CONN_RESET -#define POLARSSL_ERR_NET_LISTEN_FAILED MBEDTLS_ERR_NET_LISTEN_FAILED -#define POLARSSL_ERR_NET_RECV_FAILED MBEDTLS_ERR_NET_RECV_FAILED -#define POLARSSL_ERR_NET_SEND_FAILED MBEDTLS_ERR_NET_SEND_FAILED -#define POLARSSL_ERR_NET_SOCKET_FAILED MBEDTLS_ERR_NET_SOCKET_FAILED -#define POLARSSL_ERR_NET_TIMEOUT MBEDTLS_ERR_SSL_TIMEOUT -#define POLARSSL_ERR_NET_UNKNOWN_HOST MBEDTLS_ERR_NET_UNKNOWN_HOST -#define POLARSSL_ERR_NET_WANT_READ MBEDTLS_ERR_SSL_WANT_READ -#define POLARSSL_ERR_NET_WANT_WRITE MBEDTLS_ERR_SSL_WANT_WRITE -#define POLARSSL_ERR_OID_BUF_TOO_SMALL MBEDTLS_ERR_OID_BUF_TOO_SMALL -#define POLARSSL_ERR_OID_NOT_FOUND MBEDTLS_ERR_OID_NOT_FOUND -#define POLARSSL_ERR_PADLOCK_DATA_MISALIGNED MBEDTLS_ERR_PADLOCK_DATA_MISALIGNED -#define POLARSSL_ERR_PBKDF2_BAD_INPUT_DATA MBEDTLS_ERR_PBKDF2_BAD_INPUT_DATA -#define POLARSSL_ERR_PEM_BAD_INPUT_DATA MBEDTLS_ERR_PEM_BAD_INPUT_DATA -#define POLARSSL_ERR_PEM_FEATURE_UNAVAILABLE MBEDTLS_ERR_PEM_FEATURE_UNAVAILABLE -#define POLARSSL_ERR_PEM_INVALID_DATA MBEDTLS_ERR_PEM_INVALID_DATA -#define POLARSSL_ERR_PEM_INVALID_ENC_IV MBEDTLS_ERR_PEM_INVALID_ENC_IV -#define POLARSSL_ERR_PEM_MALLOC_FAILED MBEDTLS_ERR_PEM_ALLOC_FAILED -#define POLARSSL_ERR_PEM_NO_HEADER_FOOTER_PRESENT MBEDTLS_ERR_PEM_NO_HEADER_FOOTER_PRESENT -#define POLARSSL_ERR_PEM_PASSWORD_MISMATCH MBEDTLS_ERR_PEM_PASSWORD_MISMATCH -#define POLARSSL_ERR_PEM_PASSWORD_REQUIRED MBEDTLS_ERR_PEM_PASSWORD_REQUIRED -#define POLARSSL_ERR_PEM_UNKNOWN_ENC_ALG MBEDTLS_ERR_PEM_UNKNOWN_ENC_ALG -#define POLARSSL_ERR_PKCS12_BAD_INPUT_DATA MBEDTLS_ERR_PKCS12_BAD_INPUT_DATA -#define POLARSSL_ERR_PKCS12_FEATURE_UNAVAILABLE MBEDTLS_ERR_PKCS12_FEATURE_UNAVAILABLE -#define POLARSSL_ERR_PKCS12_PASSWORD_MISMATCH MBEDTLS_ERR_PKCS12_PASSWORD_MISMATCH -#define POLARSSL_ERR_PKCS12_PBE_INVALID_FORMAT MBEDTLS_ERR_PKCS12_PBE_INVALID_FORMAT -#define POLARSSL_ERR_PKCS5_BAD_INPUT_DATA MBEDTLS_ERR_PKCS5_BAD_INPUT_DATA -#define POLARSSL_ERR_PKCS5_FEATURE_UNAVAILABLE MBEDTLS_ERR_PKCS5_FEATURE_UNAVAILABLE -#define POLARSSL_ERR_PKCS5_INVALID_FORMAT MBEDTLS_ERR_PKCS5_INVALID_FORMAT -#define POLARSSL_ERR_PKCS5_PASSWORD_MISMATCH MBEDTLS_ERR_PKCS5_PASSWORD_MISMATCH -#define POLARSSL_ERR_PK_BAD_INPUT_DATA MBEDTLS_ERR_PK_BAD_INPUT_DATA -#define POLARSSL_ERR_PK_FEATURE_UNAVAILABLE MBEDTLS_ERR_PK_FEATURE_UNAVAILABLE -#define POLARSSL_ERR_PK_FILE_IO_ERROR MBEDTLS_ERR_PK_FILE_IO_ERROR -#define POLARSSL_ERR_PK_INVALID_ALG MBEDTLS_ERR_PK_INVALID_ALG -#define POLARSSL_ERR_PK_INVALID_PUBKEY MBEDTLS_ERR_PK_INVALID_PUBKEY -#define POLARSSL_ERR_PK_KEY_INVALID_FORMAT MBEDTLS_ERR_PK_KEY_INVALID_FORMAT -#define POLARSSL_ERR_PK_KEY_INVALID_VERSION MBEDTLS_ERR_PK_KEY_INVALID_VERSION -#define POLARSSL_ERR_PK_MALLOC_FAILED MBEDTLS_ERR_PK_ALLOC_FAILED -#define POLARSSL_ERR_PK_PASSWORD_MISMATCH MBEDTLS_ERR_PK_PASSWORD_MISMATCH -#define POLARSSL_ERR_PK_PASSWORD_REQUIRED MBEDTLS_ERR_PK_PASSWORD_REQUIRED -#define POLARSSL_ERR_PK_SIG_LEN_MISMATCH MBEDTLS_ERR_PK_SIG_LEN_MISMATCH -#define POLARSSL_ERR_PK_TYPE_MISMATCH MBEDTLS_ERR_PK_TYPE_MISMATCH -#define POLARSSL_ERR_PK_UNKNOWN_NAMED_CURVE MBEDTLS_ERR_PK_UNKNOWN_NAMED_CURVE -#define POLARSSL_ERR_PK_UNKNOWN_PK_ALG MBEDTLS_ERR_PK_UNKNOWN_PK_ALG -#define POLARSSL_ERR_RIPEMD160_FILE_IO_ERROR MBEDTLS_ERR_RIPEMD160_FILE_IO_ERROR -#define POLARSSL_ERR_RSA_BAD_INPUT_DATA MBEDTLS_ERR_RSA_BAD_INPUT_DATA -#define POLARSSL_ERR_RSA_INVALID_PADDING MBEDTLS_ERR_RSA_INVALID_PADDING -#define POLARSSL_ERR_RSA_KEY_CHECK_FAILED MBEDTLS_ERR_RSA_KEY_CHECK_FAILED -#define POLARSSL_ERR_RSA_KEY_GEN_FAILED MBEDTLS_ERR_RSA_KEY_GEN_FAILED -#define POLARSSL_ERR_RSA_OUTPUT_TOO_LARGE MBEDTLS_ERR_RSA_OUTPUT_TOO_LARGE -#define POLARSSL_ERR_RSA_PRIVATE_FAILED MBEDTLS_ERR_RSA_PRIVATE_FAILED -#define POLARSSL_ERR_RSA_PUBLIC_FAILED MBEDTLS_ERR_RSA_PUBLIC_FAILED -#define POLARSSL_ERR_RSA_RNG_FAILED MBEDTLS_ERR_RSA_RNG_FAILED -#define POLARSSL_ERR_RSA_VERIFY_FAILED MBEDTLS_ERR_RSA_VERIFY_FAILED -#define POLARSSL_ERR_SHA1_FILE_IO_ERROR MBEDTLS_ERR_SHA1_FILE_IO_ERROR -#define POLARSSL_ERR_SHA256_FILE_IO_ERROR MBEDTLS_ERR_SHA256_FILE_IO_ERROR -#define POLARSSL_ERR_SHA512_FILE_IO_ERROR MBEDTLS_ERR_SHA512_FILE_IO_ERROR -#define POLARSSL_ERR_SSL_BAD_HS_CERTIFICATE MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE -#define POLARSSL_ERR_SSL_BAD_HS_CERTIFICATE_REQUEST MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE_REQUEST -#define POLARSSL_ERR_SSL_BAD_HS_CERTIFICATE_VERIFY MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE_VERIFY -#define POLARSSL_ERR_SSL_BAD_HS_CHANGE_CIPHER_SPEC MBEDTLS_ERR_SSL_BAD_HS_CHANGE_CIPHER_SPEC -#define POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO -#define POLARSSL_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE -#define POLARSSL_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE_CS MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE_CS -#define POLARSSL_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE_RP MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE_RP -#define POLARSSL_ERR_SSL_BAD_HS_FINISHED MBEDTLS_ERR_SSL_BAD_HS_FINISHED -#define POLARSSL_ERR_SSL_BAD_HS_NEW_SESSION_TICKET MBEDTLS_ERR_SSL_BAD_HS_NEW_SESSION_TICKET -#define POLARSSL_ERR_SSL_BAD_HS_PROTOCOL_VERSION MBEDTLS_ERR_SSL_BAD_HS_PROTOCOL_VERSION -#define POLARSSL_ERR_SSL_BAD_HS_SERVER_HELLO MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO -#define POLARSSL_ERR_SSL_BAD_HS_SERVER_HELLO_DONE MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO_DONE -#define POLARSSL_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE -#define POLARSSL_ERR_SSL_BAD_INPUT_DATA MBEDTLS_ERR_SSL_BAD_INPUT_DATA -#define POLARSSL_ERR_SSL_BUFFER_TOO_SMALL MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL -#define POLARSSL_ERR_SSL_CA_CHAIN_REQUIRED MBEDTLS_ERR_SSL_CA_CHAIN_REQUIRED -#define POLARSSL_ERR_SSL_CERTIFICATE_REQUIRED MBEDTLS_ERR_SSL_CERTIFICATE_REQUIRED -#define POLARSSL_ERR_SSL_CERTIFICATE_TOO_LARGE MBEDTLS_ERR_SSL_CERTIFICATE_TOO_LARGE -#define POLARSSL_ERR_SSL_COMPRESSION_FAILED MBEDTLS_ERR_SSL_COMPRESSION_FAILED -#define POLARSSL_ERR_SSL_CONN_EOF MBEDTLS_ERR_SSL_CONN_EOF -#define POLARSSL_ERR_SSL_COUNTER_WRAPPING MBEDTLS_ERR_SSL_COUNTER_WRAPPING -#define POLARSSL_ERR_SSL_FATAL_ALERT_MESSAGE MBEDTLS_ERR_SSL_FATAL_ALERT_MESSAGE -#define POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE -#define POLARSSL_ERR_SSL_HELLO_VERIFY_REQUIRED MBEDTLS_ERR_SSL_HELLO_VERIFY_REQUIRED -#define POLARSSL_ERR_SSL_HW_ACCEL_FAILED MBEDTLS_ERR_SSL_HW_ACCEL_FAILED -#define POLARSSL_ERR_SSL_HW_ACCEL_FALLTHROUGH MBEDTLS_ERR_SSL_HW_ACCEL_FALLTHROUGH -#define POLARSSL_ERR_SSL_INTERNAL_ERROR MBEDTLS_ERR_SSL_INTERNAL_ERROR -#define POLARSSL_ERR_SSL_INVALID_MAC MBEDTLS_ERR_SSL_INVALID_MAC -#define POLARSSL_ERR_SSL_INVALID_RECORD MBEDTLS_ERR_SSL_INVALID_RECORD -#define POLARSSL_ERR_SSL_MALLOC_FAILED MBEDTLS_ERR_SSL_ALLOC_FAILED -#define POLARSSL_ERR_SSL_NO_CIPHER_CHOSEN MBEDTLS_ERR_SSL_NO_CIPHER_CHOSEN -#define POLARSSL_ERR_SSL_NO_CLIENT_CERTIFICATE MBEDTLS_ERR_SSL_NO_CLIENT_CERTIFICATE -#define POLARSSL_ERR_SSL_NO_RNG MBEDTLS_ERR_SSL_NO_RNG -#define POLARSSL_ERR_SSL_NO_USABLE_CIPHERSUITE MBEDTLS_ERR_SSL_NO_USABLE_CIPHERSUITE -#define POLARSSL_ERR_SSL_PEER_CLOSE_NOTIFY MBEDTLS_ERR_SSL_PEER_CLOSE_NOTIFY -#define POLARSSL_ERR_SSL_PEER_VERIFY_FAILED MBEDTLS_ERR_SSL_PEER_VERIFY_FAILED -#define POLARSSL_ERR_SSL_PK_TYPE_MISMATCH MBEDTLS_ERR_SSL_PK_TYPE_MISMATCH -#define POLARSSL_ERR_SSL_PRIVATE_KEY_REQUIRED MBEDTLS_ERR_SSL_PRIVATE_KEY_REQUIRED -#define POLARSSL_ERR_SSL_SESSION_TICKET_EXPIRED MBEDTLS_ERR_SSL_SESSION_TICKET_EXPIRED -#define POLARSSL_ERR_SSL_UNEXPECTED_MESSAGE MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE -#define POLARSSL_ERR_SSL_UNKNOWN_CIPHER MBEDTLS_ERR_SSL_UNKNOWN_CIPHER -#define POLARSSL_ERR_SSL_UNKNOWN_IDENTITY MBEDTLS_ERR_SSL_UNKNOWN_IDENTITY -#define POLARSSL_ERR_SSL_WAITING_SERVER_HELLO_RENEGO MBEDTLS_ERR_SSL_WAITING_SERVER_HELLO_RENEGO -#define POLARSSL_ERR_THREADING_BAD_INPUT_DATA MBEDTLS_ERR_THREADING_BAD_INPUT_DATA -#define POLARSSL_ERR_THREADING_FEATURE_UNAVAILABLE MBEDTLS_ERR_THREADING_FEATURE_UNAVAILABLE -#define POLARSSL_ERR_THREADING_MUTEX_ERROR MBEDTLS_ERR_THREADING_MUTEX_ERROR -#define POLARSSL_ERR_X509_BAD_INPUT_DATA MBEDTLS_ERR_X509_BAD_INPUT_DATA -#define POLARSSL_ERR_X509_CERT_UNKNOWN_FORMAT MBEDTLS_ERR_X509_CERT_UNKNOWN_FORMAT -#define POLARSSL_ERR_X509_CERT_VERIFY_FAILED MBEDTLS_ERR_X509_CERT_VERIFY_FAILED -#define POLARSSL_ERR_X509_FEATURE_UNAVAILABLE MBEDTLS_ERR_X509_FEATURE_UNAVAILABLE -#define POLARSSL_ERR_X509_FILE_IO_ERROR MBEDTLS_ERR_X509_FILE_IO_ERROR -#define POLARSSL_ERR_X509_INVALID_ALG MBEDTLS_ERR_X509_INVALID_ALG -#define POLARSSL_ERR_X509_INVALID_DATE MBEDTLS_ERR_X509_INVALID_DATE -#define POLARSSL_ERR_X509_INVALID_EXTENSIONS MBEDTLS_ERR_X509_INVALID_EXTENSIONS -#define POLARSSL_ERR_X509_INVALID_FORMAT MBEDTLS_ERR_X509_INVALID_FORMAT -#define POLARSSL_ERR_X509_INVALID_NAME MBEDTLS_ERR_X509_INVALID_NAME -#define POLARSSL_ERR_X509_INVALID_SERIAL MBEDTLS_ERR_X509_INVALID_SERIAL -#define POLARSSL_ERR_X509_INVALID_SIGNATURE MBEDTLS_ERR_X509_INVALID_SIGNATURE -#define POLARSSL_ERR_X509_INVALID_VERSION MBEDTLS_ERR_X509_INVALID_VERSION -#define POLARSSL_ERR_X509_MALLOC_FAILED MBEDTLS_ERR_X509_ALLOC_FAILED -#define POLARSSL_ERR_X509_SIG_MISMATCH MBEDTLS_ERR_X509_SIG_MISMATCH -#define POLARSSL_ERR_X509_UNKNOWN_OID MBEDTLS_ERR_X509_UNKNOWN_OID -#define POLARSSL_ERR_X509_UNKNOWN_SIG_ALG MBEDTLS_ERR_X509_UNKNOWN_SIG_ALG -#define POLARSSL_ERR_X509_UNKNOWN_VERSION MBEDTLS_ERR_X509_UNKNOWN_VERSION -#define POLARSSL_ERR_XTEA_INVALID_INPUT_LENGTH MBEDTLS_ERR_XTEA_INVALID_INPUT_LENGTH -#define POLARSSL_GCM_H MBEDTLS_GCM_H -#define POLARSSL_HAVEGE_H MBEDTLS_HAVEGE_H -#define POLARSSL_HAVE_INT32 MBEDTLS_HAVE_INT32 -#define POLARSSL_HAVE_INT64 MBEDTLS_HAVE_INT64 -#define POLARSSL_HAVE_UDBL MBEDTLS_HAVE_UDBL -#define POLARSSL_HAVE_X86 MBEDTLS_HAVE_X86 -#define POLARSSL_HAVE_X86_64 MBEDTLS_HAVE_X86_64 -#define POLARSSL_HMAC_DRBG_H MBEDTLS_HMAC_DRBG_H -#define POLARSSL_HMAC_DRBG_PR_OFF MBEDTLS_HMAC_DRBG_PR_OFF -#define POLARSSL_HMAC_DRBG_PR_ON MBEDTLS_HMAC_DRBG_PR_ON -#define POLARSSL_KEY_EXCHANGE_DHE_PSK MBEDTLS_KEY_EXCHANGE_DHE_PSK -#define POLARSSL_KEY_EXCHANGE_DHE_RSA MBEDTLS_KEY_EXCHANGE_DHE_RSA -#define POLARSSL_KEY_EXCHANGE_ECDHE_ECDSA MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA -#define POLARSSL_KEY_EXCHANGE_ECDHE_PSK MBEDTLS_KEY_EXCHANGE_ECDHE_PSK -#define POLARSSL_KEY_EXCHANGE_ECDHE_RSA MBEDTLS_KEY_EXCHANGE_ECDHE_RSA -#define POLARSSL_KEY_EXCHANGE_ECDH_ECDSA MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA -#define POLARSSL_KEY_EXCHANGE_ECDH_RSA MBEDTLS_KEY_EXCHANGE_ECDH_RSA -#define POLARSSL_KEY_EXCHANGE_NONE MBEDTLS_KEY_EXCHANGE_NONE -#define POLARSSL_KEY_EXCHANGE_PSK MBEDTLS_KEY_EXCHANGE_PSK -#define POLARSSL_KEY_EXCHANGE_RSA MBEDTLS_KEY_EXCHANGE_RSA -#define POLARSSL_KEY_EXCHANGE_RSA_PSK MBEDTLS_KEY_EXCHANGE_RSA_PSK -#define POLARSSL_KEY_EXCHANGE__SOME__ECDHE_ENABLED MBEDTLS_KEY_EXCHANGE__SOME__ECDHE_ENABLED -#define POLARSSL_KEY_EXCHANGE__SOME__PSK_ENABLED MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED -#define POLARSSL_KEY_EXCHANGE__WITH_CERT__ENABLED MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED -#define POLARSSL_KEY_LENGTH_DES MBEDTLS_KEY_LENGTH_DES -#define POLARSSL_KEY_LENGTH_DES_EDE MBEDTLS_KEY_LENGTH_DES_EDE -#define POLARSSL_KEY_LENGTH_DES_EDE3 MBEDTLS_KEY_LENGTH_DES_EDE3 -#define POLARSSL_KEY_LENGTH_NONE MBEDTLS_KEY_LENGTH_NONE -#define POLARSSL_MAX_BLOCK_LENGTH MBEDTLS_MAX_BLOCK_LENGTH -#define POLARSSL_MAX_IV_LENGTH MBEDTLS_MAX_IV_LENGTH -#define POLARSSL_MD2_H MBEDTLS_MD2_H -#define POLARSSL_MD4_H MBEDTLS_MD4_H -#define POLARSSL_MD5_H MBEDTLS_MD5_H -#define POLARSSL_MD_H MBEDTLS_MD_H -#define POLARSSL_MD_MAX_SIZE MBEDTLS_MD_MAX_SIZE -#define POLARSSL_MD_MD2 MBEDTLS_MD_MD2 -#define POLARSSL_MD_MD4 MBEDTLS_MD_MD4 -#define POLARSSL_MD_MD5 MBEDTLS_MD_MD5 -#define POLARSSL_MD_NONE MBEDTLS_MD_NONE -#define POLARSSL_MD_RIPEMD160 MBEDTLS_MD_RIPEMD160 -#define POLARSSL_MD_SHA1 MBEDTLS_MD_SHA1 -#define POLARSSL_MD_SHA224 MBEDTLS_MD_SHA224 -#define POLARSSL_MD_SHA256 MBEDTLS_MD_SHA256 -#define POLARSSL_MD_SHA384 MBEDTLS_MD_SHA384 -#define POLARSSL_MD_SHA512 MBEDTLS_MD_SHA512 -#define POLARSSL_MD_WRAP_H MBEDTLS_MD_WRAP_H -#define POLARSSL_MEMORY_BUFFER_ALLOC_H MBEDTLS_MEMORY_BUFFER_ALLOC_H -#define POLARSSL_MEMORY_H MBEDTLS_MEMORY_H -#define POLARSSL_MODE_CBC MBEDTLS_MODE_CBC -#define POLARSSL_MODE_CCM MBEDTLS_MODE_CCM -#define POLARSSL_MODE_CFB MBEDTLS_MODE_CFB -#define POLARSSL_MODE_CTR MBEDTLS_MODE_CTR -#define POLARSSL_MODE_ECB MBEDTLS_MODE_ECB -#define POLARSSL_MODE_GCM MBEDTLS_MODE_GCM -#define POLARSSL_MODE_NONE MBEDTLS_MODE_NONE -#define POLARSSL_MODE_OFB MBEDTLS_MODE_OFB -#define POLARSSL_MODE_STREAM MBEDTLS_MODE_STREAM -#define POLARSSL_MPI_MAX_BITS MBEDTLS_MPI_MAX_BITS -#define POLARSSL_MPI_MAX_BITS_SCALE100 MBEDTLS_MPI_MAX_BITS_SCALE100 -#define POLARSSL_MPI_MAX_LIMBS MBEDTLS_MPI_MAX_LIMBS -#define POLARSSL_MPI_RW_BUFFER_SIZE MBEDTLS_MPI_RW_BUFFER_SIZE -#define POLARSSL_NET_H MBEDTLS_NET_H -#define POLARSSL_NET_LISTEN_BACKLOG MBEDTLS_NET_LISTEN_BACKLOG -#define POLARSSL_OID_H MBEDTLS_OID_H -#define POLARSSL_OPERATION_NONE MBEDTLS_OPERATION_NONE -#define POLARSSL_PADDING_NONE MBEDTLS_PADDING_NONE -#define POLARSSL_PADDING_ONE_AND_ZEROS MBEDTLS_PADDING_ONE_AND_ZEROS -#define POLARSSL_PADDING_PKCS7 MBEDTLS_PADDING_PKCS7 -#define POLARSSL_PADDING_ZEROS MBEDTLS_PADDING_ZEROS -#define POLARSSL_PADDING_ZEROS_AND_LEN MBEDTLS_PADDING_ZEROS_AND_LEN -#define POLARSSL_PADLOCK_H MBEDTLS_PADLOCK_H -#define POLARSSL_PBKDF2_H MBEDTLS_PBKDF2_H -#define POLARSSL_PEM_H MBEDTLS_PEM_H -#define POLARSSL_PKCS11_H MBEDTLS_PKCS11_H -#define POLARSSL_PKCS12_H MBEDTLS_PKCS12_H -#define POLARSSL_PKCS5_H MBEDTLS_PKCS5_H -#define POLARSSL_PK_DEBUG_ECP MBEDTLS_PK_DEBUG_ECP -#define POLARSSL_PK_DEBUG_MAX_ITEMS MBEDTLS_PK_DEBUG_MAX_ITEMS -#define POLARSSL_PK_DEBUG_MPI MBEDTLS_PK_DEBUG_MPI -#define POLARSSL_PK_DEBUG_NONE MBEDTLS_PK_DEBUG_NONE -#define POLARSSL_PK_ECDSA MBEDTLS_PK_ECDSA -#define POLARSSL_PK_ECKEY MBEDTLS_PK_ECKEY -#define POLARSSL_PK_ECKEY_DH MBEDTLS_PK_ECKEY_DH -#define POLARSSL_PK_H MBEDTLS_PK_H -#define POLARSSL_PK_NONE MBEDTLS_PK_NONE -#define POLARSSL_PK_RSA MBEDTLS_PK_RSA -#define POLARSSL_PK_RSASSA_PSS MBEDTLS_PK_RSASSA_PSS -#define POLARSSL_PK_RSA_ALT MBEDTLS_PK_RSA_ALT -#define POLARSSL_PK_WRAP_H MBEDTLS_PK_WRAP_H -#define POLARSSL_PLATFORM_H MBEDTLS_PLATFORM_H -#define POLARSSL_PREMASTER_SIZE MBEDTLS_PREMASTER_SIZE -#define POLARSSL_RIPEMD160_H MBEDTLS_RIPEMD160_H -#define POLARSSL_RSA_H MBEDTLS_RSA_H -#define POLARSSL_SHA1_H MBEDTLS_SHA1_H -#define POLARSSL_SHA256_H MBEDTLS_SHA256_H -#define POLARSSL_SHA512_H MBEDTLS_SHA512_H -#define POLARSSL_SSL_CACHE_H MBEDTLS_SSL_CACHE_H -#define POLARSSL_SSL_CIPHERSUITES_H MBEDTLS_SSL_CIPHERSUITES_H -#define POLARSSL_SSL_COOKIE_H MBEDTLS_SSL_COOKIE_H -#define POLARSSL_SSL_H MBEDTLS_SSL_H -#define POLARSSL_THREADING_H MBEDTLS_THREADING_H -#define POLARSSL_THREADING_IMPL MBEDTLS_THREADING_IMPL -#define POLARSSL_TIMING_H MBEDTLS_TIMING_H -#define POLARSSL_VERSION_H MBEDTLS_VERSION_H -#define POLARSSL_VERSION_MAJOR MBEDTLS_VERSION_MAJOR -#define POLARSSL_VERSION_MINOR MBEDTLS_VERSION_MINOR -#define POLARSSL_VERSION_NUMBER MBEDTLS_VERSION_NUMBER -#define POLARSSL_VERSION_PATCH MBEDTLS_VERSION_PATCH -#define POLARSSL_VERSION_STRING MBEDTLS_VERSION_STRING -#define POLARSSL_VERSION_STRING_FULL MBEDTLS_VERSION_STRING_FULL -#define POLARSSL_X509_CRL_H MBEDTLS_X509_CRL_H -#define POLARSSL_X509_CRT_H MBEDTLS_X509_CRT_H -#define POLARSSL_X509_CSR_H MBEDTLS_X509_CSR_H -#define POLARSSL_X509_H MBEDTLS_X509_H -#define POLARSSL_XTEA_H MBEDTLS_XTEA_H -#define RSA_CRYPT MBEDTLS_RSA_CRYPT -#define RSA_PKCS_V15 MBEDTLS_RSA_PKCS_V15 -#define RSA_PKCS_V21 MBEDTLS_RSA_PKCS_V21 -#define RSA_PRIVATE MBEDTLS_RSA_PRIVATE -#define RSA_PUBLIC MBEDTLS_RSA_PUBLIC -#define RSA_SALT_LEN_ANY MBEDTLS_RSA_SALT_LEN_ANY -#define RSA_SIGN MBEDTLS_RSA_SIGN -#define SSL_ALERT_LEVEL_FATAL MBEDTLS_SSL_ALERT_LEVEL_FATAL -#define SSL_ALERT_LEVEL_WARNING MBEDTLS_SSL_ALERT_LEVEL_WARNING -#define SSL_ALERT_MSG_ACCESS_DENIED MBEDTLS_SSL_ALERT_MSG_ACCESS_DENIED -#define SSL_ALERT_MSG_BAD_CERT MBEDTLS_SSL_ALERT_MSG_BAD_CERT -#define SSL_ALERT_MSG_BAD_RECORD_MAC MBEDTLS_SSL_ALERT_MSG_BAD_RECORD_MAC -#define SSL_ALERT_MSG_CERT_EXPIRED MBEDTLS_SSL_ALERT_MSG_CERT_EXPIRED -#define SSL_ALERT_MSG_CERT_REVOKED MBEDTLS_SSL_ALERT_MSG_CERT_REVOKED -#define SSL_ALERT_MSG_CERT_UNKNOWN MBEDTLS_SSL_ALERT_MSG_CERT_UNKNOWN -#define SSL_ALERT_MSG_CLOSE_NOTIFY MBEDTLS_SSL_ALERT_MSG_CLOSE_NOTIFY -#define SSL_ALERT_MSG_DECODE_ERROR MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR -#define SSL_ALERT_MSG_DECOMPRESSION_FAILURE MBEDTLS_SSL_ALERT_MSG_DECOMPRESSION_FAILURE -#define SSL_ALERT_MSG_DECRYPTION_FAILED MBEDTLS_SSL_ALERT_MSG_DECRYPTION_FAILED -#define SSL_ALERT_MSG_DECRYPT_ERROR MBEDTLS_SSL_ALERT_MSG_DECRYPT_ERROR -#define SSL_ALERT_MSG_EXPORT_RESTRICTION MBEDTLS_SSL_ALERT_MSG_EXPORT_RESTRICTION -#define SSL_ALERT_MSG_HANDSHAKE_FAILURE MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE -#define SSL_ALERT_MSG_ILLEGAL_PARAMETER MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER -#define SSL_ALERT_MSG_INAPROPRIATE_FALLBACK MBEDTLS_SSL_ALERT_MSG_INAPROPRIATE_FALLBACK -#define SSL_ALERT_MSG_INSUFFICIENT_SECURITY MBEDTLS_SSL_ALERT_MSG_INSUFFICIENT_SECURITY -#define SSL_ALERT_MSG_INTERNAL_ERROR MBEDTLS_SSL_ALERT_MSG_INTERNAL_ERROR -#define SSL_ALERT_MSG_NO_APPLICATION_PROTOCOL MBEDTLS_SSL_ALERT_MSG_NO_APPLICATION_PROTOCOL -#define SSL_ALERT_MSG_NO_CERT MBEDTLS_SSL_ALERT_MSG_NO_CERT -#define SSL_ALERT_MSG_NO_RENEGOTIATION MBEDTLS_SSL_ALERT_MSG_NO_RENEGOTIATION -#define SSL_ALERT_MSG_PROTOCOL_VERSION MBEDTLS_SSL_ALERT_MSG_PROTOCOL_VERSION -#define SSL_ALERT_MSG_RECORD_OVERFLOW MBEDTLS_SSL_ALERT_MSG_RECORD_OVERFLOW -#define SSL_ALERT_MSG_UNEXPECTED_MESSAGE MBEDTLS_SSL_ALERT_MSG_UNEXPECTED_MESSAGE -#define SSL_ALERT_MSG_UNKNOWN_CA MBEDTLS_SSL_ALERT_MSG_UNKNOWN_CA -#define SSL_ALERT_MSG_UNKNOWN_PSK_IDENTITY MBEDTLS_SSL_ALERT_MSG_UNKNOWN_PSK_IDENTITY -#define SSL_ALERT_MSG_UNRECOGNIZED_NAME MBEDTLS_SSL_ALERT_MSG_UNRECOGNIZED_NAME -#define SSL_ALERT_MSG_UNSUPPORTED_CERT MBEDTLS_SSL_ALERT_MSG_UNSUPPORTED_CERT -#define SSL_ALERT_MSG_UNSUPPORTED_EXT MBEDTLS_SSL_ALERT_MSG_UNSUPPORTED_EXT -#define SSL_ALERT_MSG_USER_CANCELED MBEDTLS_SSL_ALERT_MSG_USER_CANCELED -#define SSL_ANTI_REPLAY_DISABLED MBEDTLS_SSL_ANTI_REPLAY_DISABLED -#define SSL_ANTI_REPLAY_ENABLED MBEDTLS_SSL_ANTI_REPLAY_ENABLED -#define SSL_ARC4_DISABLED MBEDTLS_SSL_ARC4_DISABLED -#define SSL_ARC4_ENABLED MBEDTLS_SSL_ARC4_ENABLED -#define SSL_BUFFER_LEN MBEDTLS_SSL_BUFFER_LEN -#define SSL_CACHE_DEFAULT_MAX_ENTRIES MBEDTLS_SSL_CACHE_DEFAULT_MAX_ENTRIES -#define SSL_CACHE_DEFAULT_TIMEOUT MBEDTLS_SSL_CACHE_DEFAULT_TIMEOUT -#define SSL_CBC_RECORD_SPLITTING_DISABLED MBEDTLS_SSL_CBC_RECORD_SPLITTING_DISABLED -#define SSL_CBC_RECORD_SPLITTING_ENABLED MBEDTLS_SSL_CBC_RECORD_SPLITTING_ENABLED -#define SSL_CERTIFICATE_REQUEST MBEDTLS_SSL_CERTIFICATE_REQUEST -#define SSL_CERTIFICATE_VERIFY MBEDTLS_SSL_CERTIFICATE_VERIFY -#define SSL_CERT_TYPE_ECDSA_SIGN MBEDTLS_SSL_CERT_TYPE_ECDSA_SIGN -#define SSL_CERT_TYPE_RSA_SIGN MBEDTLS_SSL_CERT_TYPE_RSA_SIGN -#define SSL_CHANNEL_INBOUND MBEDTLS_SSL_CHANNEL_INBOUND -#define SSL_CHANNEL_OUTBOUND MBEDTLS_SSL_CHANNEL_OUTBOUND -#define SSL_CIPHERSUITES MBEDTLS_SSL_CIPHERSUITES -#define SSL_CLIENT_CERTIFICATE MBEDTLS_SSL_CLIENT_CERTIFICATE -#define SSL_CLIENT_CHANGE_CIPHER_SPEC MBEDTLS_SSL_CLIENT_CHANGE_CIPHER_SPEC -#define SSL_CLIENT_FINISHED MBEDTLS_SSL_CLIENT_FINISHED -#define SSL_CLIENT_HELLO MBEDTLS_SSL_CLIENT_HELLO -#define SSL_CLIENT_KEY_EXCHANGE MBEDTLS_SSL_CLIENT_KEY_EXCHANGE -#define SSL_COMPRESSION_ADD MBEDTLS_SSL_COMPRESSION_ADD -#define SSL_COMPRESS_DEFLATE MBEDTLS_SSL_COMPRESS_DEFLATE -#define SSL_COMPRESS_NULL MBEDTLS_SSL_COMPRESS_NULL -#define SSL_DEBUG_BUF MBEDTLS_SSL_DEBUG_BUF -#define SSL_DEBUG_CRT MBEDTLS_SSL_DEBUG_CRT -#define SSL_DEBUG_ECP MBEDTLS_SSL_DEBUG_ECP -#define SSL_DEBUG_MPI MBEDTLS_SSL_DEBUG_MPI -#define SSL_DEBUG_MSG MBEDTLS_SSL_DEBUG_MSG -#define SSL_DEBUG_RET MBEDTLS_SSL_DEBUG_RET -#define SSL_DEFAULT_TICKET_LIFETIME MBEDTLS_SSL_DEFAULT_TICKET_LIFETIME -#define SSL_DTLS_TIMEOUT_DFL_MAX MBEDTLS_SSL_DTLS_TIMEOUT_DFL_MAX -#define SSL_DTLS_TIMEOUT_DFL_MIN MBEDTLS_SSL_DTLS_TIMEOUT_DFL_MIN -#define SSL_EMPTY_RENEGOTIATION_INFO MBEDTLS_SSL_EMPTY_RENEGOTIATION_INFO -#define SSL_ETM_DISABLED MBEDTLS_SSL_ETM_DISABLED -#define SSL_ETM_ENABLED MBEDTLS_SSL_ETM_ENABLED -#define SSL_EXTENDED_MS_DISABLED MBEDTLS_SSL_EXTENDED_MS_DISABLED -#define SSL_EXTENDED_MS_ENABLED MBEDTLS_SSL_EXTENDED_MS_ENABLED -#define SSL_FALLBACK_SCSV MBEDTLS_SSL_FALLBACK_SCSV -#define SSL_FLUSH_BUFFERS MBEDTLS_SSL_FLUSH_BUFFERS -#define SSL_HANDSHAKE_OVER MBEDTLS_SSL_HANDSHAKE_OVER -#define SSL_HANDSHAKE_WRAPUP MBEDTLS_SSL_HANDSHAKE_WRAPUP -#define SSL_HASH_MD5 MBEDTLS_SSL_HASH_MD5 -#define SSL_HASH_NONE MBEDTLS_SSL_HASH_NONE -#define SSL_HASH_SHA1 MBEDTLS_SSL_HASH_SHA1 -#define SSL_HASH_SHA224 MBEDTLS_SSL_HASH_SHA224 -#define SSL_HASH_SHA256 MBEDTLS_SSL_HASH_SHA256 -#define SSL_HASH_SHA384 MBEDTLS_SSL_HASH_SHA384 -#define SSL_HASH_SHA512 MBEDTLS_SSL_HASH_SHA512 -#define SSL_HELLO_REQUEST MBEDTLS_SSL_HELLO_REQUEST -#define SSL_HS_CERTIFICATE MBEDTLS_SSL_HS_CERTIFICATE -#define SSL_HS_CERTIFICATE_REQUEST MBEDTLS_SSL_HS_CERTIFICATE_REQUEST -#define SSL_HS_CERTIFICATE_VERIFY MBEDTLS_SSL_HS_CERTIFICATE_VERIFY -#define SSL_HS_CLIENT_HELLO MBEDTLS_SSL_HS_CLIENT_HELLO -#define SSL_HS_CLIENT_KEY_EXCHANGE MBEDTLS_SSL_HS_CLIENT_KEY_EXCHANGE -#define SSL_HS_FINISHED MBEDTLS_SSL_HS_FINISHED -#define SSL_HS_HELLO_REQUEST MBEDTLS_SSL_HS_HELLO_REQUEST -#define SSL_HS_HELLO_VERIFY_REQUEST MBEDTLS_SSL_HS_HELLO_VERIFY_REQUEST -#define SSL_HS_NEW_SESSION_TICKET MBEDTLS_SSL_HS_NEW_SESSION_TICKET -#define SSL_HS_SERVER_HELLO MBEDTLS_SSL_HS_SERVER_HELLO -#define SSL_HS_SERVER_HELLO_DONE MBEDTLS_SSL_HS_SERVER_HELLO_DONE -#define SSL_HS_SERVER_KEY_EXCHANGE MBEDTLS_SSL_HS_SERVER_KEY_EXCHANGE -#define SSL_INITIAL_HANDSHAKE MBEDTLS_SSL_INITIAL_HANDSHAKE -#define SSL_IS_CLIENT MBEDTLS_SSL_IS_CLIENT -#define SSL_IS_FALLBACK MBEDTLS_SSL_IS_FALLBACK -#define SSL_IS_NOT_FALLBACK MBEDTLS_SSL_IS_NOT_FALLBACK -#define SSL_IS_SERVER MBEDTLS_SSL_IS_SERVER -#define SSL_LEGACY_ALLOW_RENEGOTIATION MBEDTLS_SSL_LEGACY_ALLOW_RENEGOTIATION -#define SSL_LEGACY_BREAK_HANDSHAKE MBEDTLS_SSL_LEGACY_BREAK_HANDSHAKE -#define SSL_LEGACY_NO_RENEGOTIATION MBEDTLS_SSL_LEGACY_NO_RENEGOTIATION -#define SSL_LEGACY_RENEGOTIATION MBEDTLS_SSL_LEGACY_RENEGOTIATION -#define SSL_MAC_ADD MBEDTLS_SSL_MAC_ADD -#define SSL_MAJOR_VERSION_3 MBEDTLS_SSL_MAJOR_VERSION_3 -#define SSL_MAX_CONTENT_LEN MBEDTLS_SSL_MAX_CONTENT_LEN -#define SSL_MAX_FRAG_LEN_1024 MBEDTLS_SSL_MAX_FRAG_LEN_1024 -#define SSL_MAX_FRAG_LEN_2048 MBEDTLS_SSL_MAX_FRAG_LEN_2048 -#define SSL_MAX_FRAG_LEN_4096 MBEDTLS_SSL_MAX_FRAG_LEN_4096 -#define SSL_MAX_FRAG_LEN_512 MBEDTLS_SSL_MAX_FRAG_LEN_512 -#define SSL_MAX_FRAG_LEN_INVALID MBEDTLS_SSL_MAX_FRAG_LEN_INVALID -#define SSL_MAX_FRAG_LEN_NONE MBEDTLS_SSL_MAX_FRAG_LEN_NONE -#define SSL_MAX_MAJOR_VERSION MBEDTLS_SSL_MAX_MAJOR_VERSION -#define SSL_MAX_MINOR_VERSION MBEDTLS_SSL_MAX_MINOR_VERSION -#define SSL_MINOR_VERSION_0 MBEDTLS_SSL_MINOR_VERSION_0 -#define SSL_MINOR_VERSION_1 MBEDTLS_SSL_MINOR_VERSION_1 -#define SSL_MINOR_VERSION_2 MBEDTLS_SSL_MINOR_VERSION_2 -#define SSL_MINOR_VERSION_3 MBEDTLS_SSL_MINOR_VERSION_3 -#define SSL_MIN_MAJOR_VERSION MBEDTLS_SSL_MIN_MAJOR_VERSION -#define SSL_MIN_MINOR_VERSION MBEDTLS_SSL_MIN_MINOR_VERSION -#define SSL_MSG_ALERT MBEDTLS_SSL_MSG_ALERT -#define SSL_MSG_APPLICATION_DATA MBEDTLS_SSL_MSG_APPLICATION_DATA -#define SSL_MSG_CHANGE_CIPHER_SPEC MBEDTLS_SSL_MSG_CHANGE_CIPHER_SPEC -#define SSL_MSG_HANDSHAKE MBEDTLS_SSL_MSG_HANDSHAKE -#define SSL_PADDING_ADD MBEDTLS_SSL_PADDING_ADD -#define SSL_RENEGOTIATION MBEDTLS_SSL_RENEGOTIATION -#define SSL_RENEGOTIATION_DISABLED MBEDTLS_SSL_RENEGOTIATION_DISABLED -#define SSL_RENEGOTIATION_DONE MBEDTLS_SSL_RENEGOTIATION_DONE -#define SSL_RENEGOTIATION_ENABLED MBEDTLS_SSL_RENEGOTIATION_ENABLED -#define SSL_RENEGOTIATION_NOT_ENFORCED MBEDTLS_SSL_RENEGOTIATION_NOT_ENFORCED -#define SSL_RENEGOTIATION_PENDING MBEDTLS_SSL_RENEGOTIATION_PENDING -#define SSL_RENEGO_MAX_RECORDS_DEFAULT MBEDTLS_SSL_RENEGO_MAX_RECORDS_DEFAULT -#define SSL_RETRANS_FINISHED MBEDTLS_SSL_RETRANS_FINISHED -#define SSL_RETRANS_PREPARING MBEDTLS_SSL_RETRANS_PREPARING -#define SSL_RETRANS_SENDING MBEDTLS_SSL_RETRANS_SENDING -#define SSL_RETRANS_WAITING MBEDTLS_SSL_RETRANS_WAITING -#define SSL_SECURE_RENEGOTIATION MBEDTLS_SSL_SECURE_RENEGOTIATION -#define SSL_SERVER_CERTIFICATE MBEDTLS_SSL_SERVER_CERTIFICATE -#define SSL_SERVER_CHANGE_CIPHER_SPEC MBEDTLS_SSL_SERVER_CHANGE_CIPHER_SPEC -#define SSL_SERVER_FINISHED MBEDTLS_SSL_SERVER_FINISHED -#define SSL_SERVER_HELLO MBEDTLS_SSL_SERVER_HELLO -#define SSL_SERVER_HELLO_DONE MBEDTLS_SSL_SERVER_HELLO_DONE -#define SSL_SERVER_HELLO_VERIFY_REQUEST_SENT MBEDTLS_SSL_SERVER_HELLO_VERIFY_REQUEST_SENT -#define SSL_SERVER_KEY_EXCHANGE MBEDTLS_SSL_SERVER_KEY_EXCHANGE -#define SSL_SERVER_NEW_SESSION_TICKET MBEDTLS_SSL_SERVER_NEW_SESSION_TICKET -#define SSL_SESSION_TICKETS_DISABLED MBEDTLS_SSL_SESSION_TICKETS_DISABLED -#define SSL_SESSION_TICKETS_ENABLED MBEDTLS_SSL_SESSION_TICKETS_ENABLED -#define SSL_SIG_ANON MBEDTLS_SSL_SIG_ANON -#define SSL_SIG_ECDSA MBEDTLS_SSL_SIG_ECDSA -#define SSL_SIG_RSA MBEDTLS_SSL_SIG_RSA -#define SSL_TRANSPORT_DATAGRAM MBEDTLS_SSL_TRANSPORT_DATAGRAM -#define SSL_TRANSPORT_STREAM MBEDTLS_SSL_TRANSPORT_STREAM -#define SSL_TRUNCATED_HMAC_LEN MBEDTLS_SSL_TRUNCATED_HMAC_LEN -#define SSL_TRUNC_HMAC_DISABLED MBEDTLS_SSL_TRUNC_HMAC_DISABLED -#define SSL_TRUNC_HMAC_ENABLED MBEDTLS_SSL_TRUNC_HMAC_ENABLED -#define SSL_VERIFY_DATA_MAX_LEN MBEDTLS_SSL_VERIFY_DATA_MAX_LEN -#define SSL_VERIFY_NONE MBEDTLS_SSL_VERIFY_NONE -#define SSL_VERIFY_OPTIONAL MBEDTLS_SSL_VERIFY_OPTIONAL -#define SSL_VERIFY_REQUIRED MBEDTLS_SSL_VERIFY_REQUIRED -#define TLS_DHE_PSK_WITH_3DES_EDE_CBC_SHA MBEDTLS_TLS_DHE_PSK_WITH_3DES_EDE_CBC_SHA -#define TLS_DHE_PSK_WITH_AES_128_CBC_SHA MBEDTLS_TLS_DHE_PSK_WITH_AES_128_CBC_SHA -#define TLS_DHE_PSK_WITH_AES_128_CBC_SHA256 MBEDTLS_TLS_DHE_PSK_WITH_AES_128_CBC_SHA256 -#define TLS_DHE_PSK_WITH_AES_128_CCM MBEDTLS_TLS_DHE_PSK_WITH_AES_128_CCM -#define TLS_DHE_PSK_WITH_AES_128_CCM_8 MBEDTLS_TLS_DHE_PSK_WITH_AES_128_CCM_8 -#define TLS_DHE_PSK_WITH_AES_128_GCM_SHA256 MBEDTLS_TLS_DHE_PSK_WITH_AES_128_GCM_SHA256 -#define TLS_DHE_PSK_WITH_AES_256_CBC_SHA MBEDTLS_TLS_DHE_PSK_WITH_AES_256_CBC_SHA -#define TLS_DHE_PSK_WITH_AES_256_CBC_SHA384 MBEDTLS_TLS_DHE_PSK_WITH_AES_256_CBC_SHA384 -#define TLS_DHE_PSK_WITH_AES_256_CCM MBEDTLS_TLS_DHE_PSK_WITH_AES_256_CCM -#define TLS_DHE_PSK_WITH_AES_256_CCM_8 MBEDTLS_TLS_DHE_PSK_WITH_AES_256_CCM_8 -#define TLS_DHE_PSK_WITH_AES_256_GCM_SHA384 MBEDTLS_TLS_DHE_PSK_WITH_AES_256_GCM_SHA384 -#define TLS_DHE_PSK_WITH_CAMELLIA_128_CBC_SHA256 MBEDTLS_TLS_DHE_PSK_WITH_CAMELLIA_128_CBC_SHA256 -#define TLS_DHE_PSK_WITH_CAMELLIA_128_GCM_SHA256 MBEDTLS_TLS_DHE_PSK_WITH_CAMELLIA_128_GCM_SHA256 -#define TLS_DHE_PSK_WITH_CAMELLIA_256_CBC_SHA384 MBEDTLS_TLS_DHE_PSK_WITH_CAMELLIA_256_CBC_SHA384 -#define TLS_DHE_PSK_WITH_CAMELLIA_256_GCM_SHA384 MBEDTLS_TLS_DHE_PSK_WITH_CAMELLIA_256_GCM_SHA384 -#define TLS_DHE_PSK_WITH_NULL_SHA MBEDTLS_TLS_DHE_PSK_WITH_NULL_SHA -#define TLS_DHE_PSK_WITH_NULL_SHA256 MBEDTLS_TLS_DHE_PSK_WITH_NULL_SHA256 -#define TLS_DHE_PSK_WITH_NULL_SHA384 MBEDTLS_TLS_DHE_PSK_WITH_NULL_SHA384 -#define TLS_DHE_PSK_WITH_RC4_128_SHA MBEDTLS_TLS_DHE_PSK_WITH_RC4_128_SHA -#define TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA MBEDTLS_TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA -#define TLS_DHE_RSA_WITH_AES_128_CBC_SHA MBEDTLS_TLS_DHE_RSA_WITH_AES_128_CBC_SHA -#define TLS_DHE_RSA_WITH_AES_128_CBC_SHA256 MBEDTLS_TLS_DHE_RSA_WITH_AES_128_CBC_SHA256 -#define TLS_DHE_RSA_WITH_AES_128_CCM MBEDTLS_TLS_DHE_RSA_WITH_AES_128_CCM -#define TLS_DHE_RSA_WITH_AES_128_CCM_8 MBEDTLS_TLS_DHE_RSA_WITH_AES_128_CCM_8 -#define TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 MBEDTLS_TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 -#define TLS_DHE_RSA_WITH_AES_256_CBC_SHA MBEDTLS_TLS_DHE_RSA_WITH_AES_256_CBC_SHA -#define TLS_DHE_RSA_WITH_AES_256_CBC_SHA256 MBEDTLS_TLS_DHE_RSA_WITH_AES_256_CBC_SHA256 -#define TLS_DHE_RSA_WITH_AES_256_CCM MBEDTLS_TLS_DHE_RSA_WITH_AES_256_CCM -#define TLS_DHE_RSA_WITH_AES_256_CCM_8 MBEDTLS_TLS_DHE_RSA_WITH_AES_256_CCM_8 -#define TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 MBEDTLS_TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 -#define TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA -#define TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256 MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256 -#define TLS_DHE_RSA_WITH_CAMELLIA_128_GCM_SHA256 MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_128_GCM_SHA256 -#define TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA -#define TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256 MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256 -#define TLS_DHE_RSA_WITH_CAMELLIA_256_GCM_SHA384 MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_256_GCM_SHA384 -#define TLS_DHE_RSA_WITH_DES_CBC_SHA MBEDTLS_TLS_DHE_RSA_WITH_DES_CBC_SHA -#define TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA MBEDTLS_TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA -#define TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA -#define TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 -#define TLS_ECDHE_ECDSA_WITH_AES_128_CCM MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_CCM -#define TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8 MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8 -#define TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 -#define TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA -#define TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384 MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384 -#define TLS_ECDHE_ECDSA_WITH_AES_256_CCM MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_CCM -#define TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8 MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8 -#define TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 -#define TLS_ECDHE_ECDSA_WITH_CAMELLIA_128_CBC_SHA256 MBEDTLS_TLS_ECDHE_ECDSA_WITH_CAMELLIA_128_CBC_SHA256 -#define TLS_ECDHE_ECDSA_WITH_CAMELLIA_128_GCM_SHA256 MBEDTLS_TLS_ECDHE_ECDSA_WITH_CAMELLIA_128_GCM_SHA256 -#define TLS_ECDHE_ECDSA_WITH_CAMELLIA_256_CBC_SHA384 MBEDTLS_TLS_ECDHE_ECDSA_WITH_CAMELLIA_256_CBC_SHA384 -#define TLS_ECDHE_ECDSA_WITH_CAMELLIA_256_GCM_SHA384 MBEDTLS_TLS_ECDHE_ECDSA_WITH_CAMELLIA_256_GCM_SHA384 -#define TLS_ECDHE_ECDSA_WITH_NULL_SHA MBEDTLS_TLS_ECDHE_ECDSA_WITH_NULL_SHA -#define TLS_ECDHE_ECDSA_WITH_RC4_128_SHA MBEDTLS_TLS_ECDHE_ECDSA_WITH_RC4_128_SHA -#define TLS_ECDHE_PSK_WITH_3DES_EDE_CBC_SHA MBEDTLS_TLS_ECDHE_PSK_WITH_3DES_EDE_CBC_SHA -#define TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA MBEDTLS_TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA -#define TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256 MBEDTLS_TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256 -#define TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA MBEDTLS_TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA -#define TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA384 MBEDTLS_TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA384 -#define TLS_ECDHE_PSK_WITH_CAMELLIA_128_CBC_SHA256 MBEDTLS_TLS_ECDHE_PSK_WITH_CAMELLIA_128_CBC_SHA256 -#define TLS_ECDHE_PSK_WITH_CAMELLIA_256_CBC_SHA384 MBEDTLS_TLS_ECDHE_PSK_WITH_CAMELLIA_256_CBC_SHA384 -#define TLS_ECDHE_PSK_WITH_NULL_SHA MBEDTLS_TLS_ECDHE_PSK_WITH_NULL_SHA -#define TLS_ECDHE_PSK_WITH_NULL_SHA256 MBEDTLS_TLS_ECDHE_PSK_WITH_NULL_SHA256 -#define TLS_ECDHE_PSK_WITH_NULL_SHA384 MBEDTLS_TLS_ECDHE_PSK_WITH_NULL_SHA384 -#define TLS_ECDHE_PSK_WITH_RC4_128_SHA MBEDTLS_TLS_ECDHE_PSK_WITH_RC4_128_SHA -#define TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA MBEDTLS_TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA -#define TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA MBEDTLS_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA -#define TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 MBEDTLS_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 -#define TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 MBEDTLS_TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 -#define TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA MBEDTLS_TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA -#define TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 MBEDTLS_TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 -#define TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 MBEDTLS_TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 -#define TLS_ECDHE_RSA_WITH_CAMELLIA_128_CBC_SHA256 MBEDTLS_TLS_ECDHE_RSA_WITH_CAMELLIA_128_CBC_SHA256 -#define TLS_ECDHE_RSA_WITH_CAMELLIA_128_GCM_SHA256 MBEDTLS_TLS_ECDHE_RSA_WITH_CAMELLIA_128_GCM_SHA256 -#define TLS_ECDHE_RSA_WITH_CAMELLIA_256_CBC_SHA384 MBEDTLS_TLS_ECDHE_RSA_WITH_CAMELLIA_256_CBC_SHA384 -#define TLS_ECDHE_RSA_WITH_CAMELLIA_256_GCM_SHA384 MBEDTLS_TLS_ECDHE_RSA_WITH_CAMELLIA_256_GCM_SHA384 -#define TLS_ECDHE_RSA_WITH_NULL_SHA MBEDTLS_TLS_ECDHE_RSA_WITH_NULL_SHA -#define TLS_ECDHE_RSA_WITH_RC4_128_SHA MBEDTLS_TLS_ECDHE_RSA_WITH_RC4_128_SHA -#define TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA MBEDTLS_TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA -#define TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA -#define TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256 MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256 -#define TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256 MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256 -#define TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA -#define TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384 MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384 -#define TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384 MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384 -#define TLS_ECDH_ECDSA_WITH_CAMELLIA_128_CBC_SHA256 MBEDTLS_TLS_ECDH_ECDSA_WITH_CAMELLIA_128_CBC_SHA256 -#define TLS_ECDH_ECDSA_WITH_CAMELLIA_128_GCM_SHA256 MBEDTLS_TLS_ECDH_ECDSA_WITH_CAMELLIA_128_GCM_SHA256 -#define TLS_ECDH_ECDSA_WITH_CAMELLIA_256_CBC_SHA384 MBEDTLS_TLS_ECDH_ECDSA_WITH_CAMELLIA_256_CBC_SHA384 -#define TLS_ECDH_ECDSA_WITH_CAMELLIA_256_GCM_SHA384 MBEDTLS_TLS_ECDH_ECDSA_WITH_CAMELLIA_256_GCM_SHA384 -#define TLS_ECDH_ECDSA_WITH_NULL_SHA MBEDTLS_TLS_ECDH_ECDSA_WITH_NULL_SHA -#define TLS_ECDH_ECDSA_WITH_RC4_128_SHA MBEDTLS_TLS_ECDH_ECDSA_WITH_RC4_128_SHA -#define TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA MBEDTLS_TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA -#define TLS_ECDH_RSA_WITH_AES_128_CBC_SHA MBEDTLS_TLS_ECDH_RSA_WITH_AES_128_CBC_SHA -#define TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256 MBEDTLS_TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256 -#define TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256 MBEDTLS_TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256 -#define TLS_ECDH_RSA_WITH_AES_256_CBC_SHA MBEDTLS_TLS_ECDH_RSA_WITH_AES_256_CBC_SHA -#define TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384 MBEDTLS_TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384 -#define TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384 MBEDTLS_TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384 -#define TLS_ECDH_RSA_WITH_CAMELLIA_128_CBC_SHA256 MBEDTLS_TLS_ECDH_RSA_WITH_CAMELLIA_128_CBC_SHA256 -#define TLS_ECDH_RSA_WITH_CAMELLIA_128_GCM_SHA256 MBEDTLS_TLS_ECDH_RSA_WITH_CAMELLIA_128_GCM_SHA256 -#define TLS_ECDH_RSA_WITH_CAMELLIA_256_CBC_SHA384 MBEDTLS_TLS_ECDH_RSA_WITH_CAMELLIA_256_CBC_SHA384 -#define TLS_ECDH_RSA_WITH_CAMELLIA_256_GCM_SHA384 MBEDTLS_TLS_ECDH_RSA_WITH_CAMELLIA_256_GCM_SHA384 -#define TLS_ECDH_RSA_WITH_NULL_SHA MBEDTLS_TLS_ECDH_RSA_WITH_NULL_SHA -#define TLS_ECDH_RSA_WITH_RC4_128_SHA MBEDTLS_TLS_ECDH_RSA_WITH_RC4_128_SHA -#define TLS_EXT_ALPN MBEDTLS_TLS_EXT_ALPN -#define TLS_EXT_ENCRYPT_THEN_MAC MBEDTLS_TLS_EXT_ENCRYPT_THEN_MAC -#define TLS_EXT_EXTENDED_MASTER_SECRET MBEDTLS_TLS_EXT_EXTENDED_MASTER_SECRET -#define TLS_EXT_MAX_FRAGMENT_LENGTH MBEDTLS_TLS_EXT_MAX_FRAGMENT_LENGTH -#define TLS_EXT_RENEGOTIATION_INFO MBEDTLS_TLS_EXT_RENEGOTIATION_INFO -#define TLS_EXT_SERVERNAME MBEDTLS_TLS_EXT_SERVERNAME -#define TLS_EXT_SERVERNAME_HOSTNAME MBEDTLS_TLS_EXT_SERVERNAME_HOSTNAME -#define TLS_EXT_SESSION_TICKET MBEDTLS_TLS_EXT_SESSION_TICKET -#define TLS_EXT_SIG_ALG MBEDTLS_TLS_EXT_SIG_ALG -#define TLS_EXT_SUPPORTED_ELLIPTIC_CURVES MBEDTLS_TLS_EXT_SUPPORTED_ELLIPTIC_CURVES -#define TLS_EXT_SUPPORTED_POINT_FORMATS MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS -#define TLS_EXT_SUPPORTED_POINT_FORMATS_PRESENT MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS_PRESENT -#define TLS_EXT_TRUNCATED_HMAC MBEDTLS_TLS_EXT_TRUNCATED_HMAC -#define TLS_PSK_WITH_3DES_EDE_CBC_SHA MBEDTLS_TLS_PSK_WITH_3DES_EDE_CBC_SHA -#define TLS_PSK_WITH_AES_128_CBC_SHA MBEDTLS_TLS_PSK_WITH_AES_128_CBC_SHA -#define TLS_PSK_WITH_AES_128_CBC_SHA256 MBEDTLS_TLS_PSK_WITH_AES_128_CBC_SHA256 -#define TLS_PSK_WITH_AES_128_CCM MBEDTLS_TLS_PSK_WITH_AES_128_CCM -#define TLS_PSK_WITH_AES_128_CCM_8 MBEDTLS_TLS_PSK_WITH_AES_128_CCM_8 -#define TLS_PSK_WITH_AES_128_GCM_SHA256 MBEDTLS_TLS_PSK_WITH_AES_128_GCM_SHA256 -#define TLS_PSK_WITH_AES_256_CBC_SHA MBEDTLS_TLS_PSK_WITH_AES_256_CBC_SHA -#define TLS_PSK_WITH_AES_256_CBC_SHA384 MBEDTLS_TLS_PSK_WITH_AES_256_CBC_SHA384 -#define TLS_PSK_WITH_AES_256_CCM MBEDTLS_TLS_PSK_WITH_AES_256_CCM -#define TLS_PSK_WITH_AES_256_CCM_8 MBEDTLS_TLS_PSK_WITH_AES_256_CCM_8 -#define TLS_PSK_WITH_AES_256_GCM_SHA384 MBEDTLS_TLS_PSK_WITH_AES_256_GCM_SHA384 -#define TLS_PSK_WITH_CAMELLIA_128_CBC_SHA256 MBEDTLS_TLS_PSK_WITH_CAMELLIA_128_CBC_SHA256 -#define TLS_PSK_WITH_CAMELLIA_128_GCM_SHA256 MBEDTLS_TLS_PSK_WITH_CAMELLIA_128_GCM_SHA256 -#define TLS_PSK_WITH_CAMELLIA_256_CBC_SHA384 MBEDTLS_TLS_PSK_WITH_CAMELLIA_256_CBC_SHA384 -#define TLS_PSK_WITH_CAMELLIA_256_GCM_SHA384 MBEDTLS_TLS_PSK_WITH_CAMELLIA_256_GCM_SHA384 -#define TLS_PSK_WITH_NULL_SHA MBEDTLS_TLS_PSK_WITH_NULL_SHA -#define TLS_PSK_WITH_NULL_SHA256 MBEDTLS_TLS_PSK_WITH_NULL_SHA256 -#define TLS_PSK_WITH_NULL_SHA384 MBEDTLS_TLS_PSK_WITH_NULL_SHA384 -#define TLS_PSK_WITH_RC4_128_SHA MBEDTLS_TLS_PSK_WITH_RC4_128_SHA -#define TLS_RSA_PSK_WITH_3DES_EDE_CBC_SHA MBEDTLS_TLS_RSA_PSK_WITH_3DES_EDE_CBC_SHA -#define TLS_RSA_PSK_WITH_AES_128_CBC_SHA MBEDTLS_TLS_RSA_PSK_WITH_AES_128_CBC_SHA -#define TLS_RSA_PSK_WITH_AES_128_CBC_SHA256 MBEDTLS_TLS_RSA_PSK_WITH_AES_128_CBC_SHA256 -#define TLS_RSA_PSK_WITH_AES_128_GCM_SHA256 MBEDTLS_TLS_RSA_PSK_WITH_AES_128_GCM_SHA256 -#define TLS_RSA_PSK_WITH_AES_256_CBC_SHA MBEDTLS_TLS_RSA_PSK_WITH_AES_256_CBC_SHA -#define TLS_RSA_PSK_WITH_AES_256_CBC_SHA384 MBEDTLS_TLS_RSA_PSK_WITH_AES_256_CBC_SHA384 -#define TLS_RSA_PSK_WITH_AES_256_GCM_SHA384 MBEDTLS_TLS_RSA_PSK_WITH_AES_256_GCM_SHA384 -#define TLS_RSA_PSK_WITH_CAMELLIA_128_CBC_SHA256 MBEDTLS_TLS_RSA_PSK_WITH_CAMELLIA_128_CBC_SHA256 -#define TLS_RSA_PSK_WITH_CAMELLIA_128_GCM_SHA256 MBEDTLS_TLS_RSA_PSK_WITH_CAMELLIA_128_GCM_SHA256 -#define TLS_RSA_PSK_WITH_CAMELLIA_256_CBC_SHA384 MBEDTLS_TLS_RSA_PSK_WITH_CAMELLIA_256_CBC_SHA384 -#define TLS_RSA_PSK_WITH_CAMELLIA_256_GCM_SHA384 MBEDTLS_TLS_RSA_PSK_WITH_CAMELLIA_256_GCM_SHA384 -#define TLS_RSA_PSK_WITH_NULL_SHA MBEDTLS_TLS_RSA_PSK_WITH_NULL_SHA -#define TLS_RSA_PSK_WITH_NULL_SHA256 MBEDTLS_TLS_RSA_PSK_WITH_NULL_SHA256 -#define TLS_RSA_PSK_WITH_NULL_SHA384 MBEDTLS_TLS_RSA_PSK_WITH_NULL_SHA384 -#define TLS_RSA_PSK_WITH_RC4_128_SHA MBEDTLS_TLS_RSA_PSK_WITH_RC4_128_SHA -#define TLS_RSA_WITH_3DES_EDE_CBC_SHA MBEDTLS_TLS_RSA_WITH_3DES_EDE_CBC_SHA -#define TLS_RSA_WITH_AES_128_CBC_SHA MBEDTLS_TLS_RSA_WITH_AES_128_CBC_SHA -#define TLS_RSA_WITH_AES_128_CBC_SHA256 MBEDTLS_TLS_RSA_WITH_AES_128_CBC_SHA256 -#define TLS_RSA_WITH_AES_128_CCM MBEDTLS_TLS_RSA_WITH_AES_128_CCM -#define TLS_RSA_WITH_AES_128_CCM_8 MBEDTLS_TLS_RSA_WITH_AES_128_CCM_8 -#define TLS_RSA_WITH_AES_128_GCM_SHA256 MBEDTLS_TLS_RSA_WITH_AES_128_GCM_SHA256 -#define TLS_RSA_WITH_AES_256_CBC_SHA MBEDTLS_TLS_RSA_WITH_AES_256_CBC_SHA -#define TLS_RSA_WITH_AES_256_CBC_SHA256 MBEDTLS_TLS_RSA_WITH_AES_256_CBC_SHA256 -#define TLS_RSA_WITH_AES_256_CCM MBEDTLS_TLS_RSA_WITH_AES_256_CCM -#define TLS_RSA_WITH_AES_256_CCM_8 MBEDTLS_TLS_RSA_WITH_AES_256_CCM_8 -#define TLS_RSA_WITH_AES_256_GCM_SHA384 MBEDTLS_TLS_RSA_WITH_AES_256_GCM_SHA384 -#define TLS_RSA_WITH_CAMELLIA_128_CBC_SHA MBEDTLS_TLS_RSA_WITH_CAMELLIA_128_CBC_SHA -#define TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256 MBEDTLS_TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256 -#define TLS_RSA_WITH_CAMELLIA_128_GCM_SHA256 MBEDTLS_TLS_RSA_WITH_CAMELLIA_128_GCM_SHA256 -#define TLS_RSA_WITH_CAMELLIA_256_CBC_SHA MBEDTLS_TLS_RSA_WITH_CAMELLIA_256_CBC_SHA -#define TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256 MBEDTLS_TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256 -#define TLS_RSA_WITH_CAMELLIA_256_GCM_SHA384 MBEDTLS_TLS_RSA_WITH_CAMELLIA_256_GCM_SHA384 -#define TLS_RSA_WITH_DES_CBC_SHA MBEDTLS_TLS_RSA_WITH_DES_CBC_SHA -#define TLS_RSA_WITH_NULL_MD5 MBEDTLS_TLS_RSA_WITH_NULL_MD5 -#define TLS_RSA_WITH_NULL_SHA MBEDTLS_TLS_RSA_WITH_NULL_SHA -#define TLS_RSA_WITH_NULL_SHA256 MBEDTLS_TLS_RSA_WITH_NULL_SHA256 -#define TLS_RSA_WITH_RC4_128_MD5 MBEDTLS_TLS_RSA_WITH_RC4_128_MD5 -#define TLS_RSA_WITH_RC4_128_SHA MBEDTLS_TLS_RSA_WITH_RC4_128_SHA -#define UL64 MBEDTLS_UL64 -#define X509_CRT_VERSION_1 MBEDTLS_X509_CRT_VERSION_1 -#define X509_CRT_VERSION_2 MBEDTLS_X509_CRT_VERSION_2 -#define X509_CRT_VERSION_3 MBEDTLS_X509_CRT_VERSION_3 -#define X509_FORMAT_DER MBEDTLS_X509_FORMAT_DER -#define X509_FORMAT_PEM MBEDTLS_X509_FORMAT_PEM -#define X509_MAX_DN_NAME_SIZE MBEDTLS_X509_MAX_DN_NAME_SIZE -#define X509_RFC5280_MAX_SERIAL_LEN MBEDTLS_X509_RFC5280_MAX_SERIAL_LEN -#define X509_RFC5280_UTC_TIME_LEN MBEDTLS_X509_RFC5280_UTC_TIME_LEN -#define XTEA_DECRYPT MBEDTLS_XTEA_DECRYPT -#define XTEA_ENCRYPT MBEDTLS_XTEA_ENCRYPT -#define _asn1_bitstring mbedtls_asn1_bitstring -#define _asn1_buf mbedtls_asn1_buf -#define _asn1_named_data mbedtls_asn1_named_data -#define _asn1_sequence mbedtls_asn1_sequence -#define _ssl_cache_context mbedtls_ssl_cache_context -#define _ssl_cache_entry mbedtls_ssl_cache_entry -#define _ssl_ciphersuite_t mbedtls_ssl_ciphersuite_t -#define _ssl_context mbedtls_ssl_context -#define _ssl_flight_item mbedtls_ssl_flight_item -#define _ssl_handshake_params mbedtls_ssl_handshake_params -#define _ssl_key_cert mbedtls_ssl_key_cert -#define _ssl_premaster_secret mbedtls_ssl_premaster_secret -#define _ssl_session mbedtls_ssl_session -#define _ssl_ticket_keys mbedtls_ssl_ticket_keys -#define _ssl_transform mbedtls_ssl_transform -#define _x509_crl mbedtls_x509_crl -#define _x509_crl_entry mbedtls_x509_crl_entry -#define _x509_crt mbedtls_x509_crt -#define _x509_csr mbedtls_x509_csr -#define _x509_time mbedtls_x509_time -#define _x509write_cert mbedtls_x509write_cert -#define _x509write_csr mbedtls_x509write_csr -#define aes_context mbedtls_aes_context -#define aes_crypt_cbc mbedtls_aes_crypt_cbc -#define aes_crypt_cfb128 mbedtls_aes_crypt_cfb128 -#define aes_crypt_cfb8 mbedtls_aes_crypt_cfb8 -#define aes_crypt_ctr mbedtls_aes_crypt_ctr -#define aes_crypt_ecb mbedtls_aes_crypt_ecb -#define aes_free mbedtls_aes_free -#define aes_init mbedtls_aes_init -#define aes_self_test mbedtls_aes_self_test -#define aes_setkey_dec mbedtls_aes_setkey_dec -#define aes_setkey_enc mbedtls_aes_setkey_enc -#define aesni_crypt_ecb mbedtls_aesni_crypt_ecb -#define aesni_gcm_mult mbedtls_aesni_gcm_mult -#define aesni_inverse_key mbedtls_aesni_inverse_key -#define aesni_setkey_enc mbedtls_aesni_setkey_enc -#define aesni_supports mbedtls_aesni_has_support -#define alarmed mbedtls_timing_alarmed -#define arc4_context mbedtls_arc4_context -#define arc4_crypt mbedtls_arc4_crypt -#define arc4_free mbedtls_arc4_free -#define arc4_init mbedtls_arc4_init -#define arc4_self_test mbedtls_arc4_self_test -#define arc4_setup mbedtls_arc4_setup -#define asn1_bitstring mbedtls_asn1_bitstring -#define asn1_buf mbedtls_asn1_buf -#define asn1_find_named_data mbedtls_asn1_find_named_data -#define asn1_free_named_data mbedtls_asn1_free_named_data -#define asn1_free_named_data_list mbedtls_asn1_free_named_data_list -#define asn1_get_alg mbedtls_asn1_get_alg -#define asn1_get_alg_null mbedtls_asn1_get_alg_null -#define asn1_get_bitstring mbedtls_asn1_get_bitstring -#define asn1_get_bitstring_null mbedtls_asn1_get_bitstring_null -#define asn1_get_bool mbedtls_asn1_get_bool -#define asn1_get_int mbedtls_asn1_get_int -#define asn1_get_len mbedtls_asn1_get_len -#define asn1_get_mpi mbedtls_asn1_get_mpi -#define asn1_get_sequence_of mbedtls_asn1_get_sequence_of -#define asn1_get_tag mbedtls_asn1_get_tag -#define asn1_named_data mbedtls_asn1_named_data -#define asn1_sequence mbedtls_asn1_sequence -#define asn1_store_named_data mbedtls_asn1_store_named_data -#define asn1_write_algorithm_identifier mbedtls_asn1_write_algorithm_identifier -#define asn1_write_bitstring mbedtls_asn1_write_bitstring -#define asn1_write_bool mbedtls_asn1_write_bool -#define asn1_write_ia5_string mbedtls_asn1_write_ia5_string -#define asn1_write_int mbedtls_asn1_write_int -#define asn1_write_len mbedtls_asn1_write_len -#define asn1_write_mpi mbedtls_asn1_write_mpi -#define asn1_write_null mbedtls_asn1_write_null -#define asn1_write_octet_string mbedtls_asn1_write_octet_string -#define asn1_write_oid mbedtls_asn1_write_oid -#define asn1_write_printable_string mbedtls_asn1_write_printable_string -#define asn1_write_raw_buffer mbedtls_asn1_write_raw_buffer -#define asn1_write_tag mbedtls_asn1_write_tag -#define base64_decode mbedtls_base64_decode -#define base64_encode mbedtls_base64_encode -#define base64_self_test mbedtls_base64_self_test -#define blowfish_context mbedtls_blowfish_context -#define blowfish_crypt_cbc mbedtls_blowfish_crypt_cbc -#define blowfish_crypt_cfb64 mbedtls_blowfish_crypt_cfb64 -#define blowfish_crypt_ctr mbedtls_blowfish_crypt_ctr -#define blowfish_crypt_ecb mbedtls_blowfish_crypt_ecb -#define blowfish_free mbedtls_blowfish_free -#define blowfish_init mbedtls_blowfish_init -#define blowfish_setkey mbedtls_blowfish_setkey -#define camellia_context mbedtls_camellia_context -#define camellia_crypt_cbc mbedtls_camellia_crypt_cbc -#define camellia_crypt_cfb128 mbedtls_camellia_crypt_cfb128 -#define camellia_crypt_ctr mbedtls_camellia_crypt_ctr -#define camellia_crypt_ecb mbedtls_camellia_crypt_ecb -#define camellia_free mbedtls_camellia_free -#define camellia_init mbedtls_camellia_init -#define camellia_self_test mbedtls_camellia_self_test -#define camellia_setkey_dec mbedtls_camellia_setkey_dec -#define camellia_setkey_enc mbedtls_camellia_setkey_enc -#define ccm_auth_decrypt mbedtls_ccm_auth_decrypt -#define ccm_context mbedtls_ccm_context -#define ccm_encrypt_and_tag mbedtls_ccm_encrypt_and_tag -#define ccm_free mbedtls_ccm_free -#define ccm_init mbedtls_ccm_init -#define ccm_self_test mbedtls_ccm_self_test -#define cipher_auth_decrypt mbedtls_cipher_auth_decrypt -#define cipher_auth_encrypt mbedtls_cipher_auth_encrypt -#define cipher_base_t mbedtls_cipher_base_t -#define cipher_check_tag mbedtls_cipher_check_tag -#define cipher_context_t mbedtls_cipher_context_t -#define cipher_crypt mbedtls_cipher_crypt -#define cipher_definition_t mbedtls_cipher_definition_t -#define cipher_definitions mbedtls_cipher_definitions -#define cipher_finish mbedtls_cipher_finish -#define cipher_free mbedtls_cipher_free -#define cipher_free_ctx mbedtls_cipher_free_ctx -#define cipher_get_block_size mbedtls_cipher_get_block_size -#define cipher_get_cipher_mode mbedtls_cipher_get_cipher_mode -#define cipher_get_iv_size mbedtls_cipher_get_iv_size -#define cipher_get_key_size mbedtls_cipher_get_key_bitlen -#define cipher_get_name mbedtls_cipher_get_name -#define cipher_get_operation mbedtls_cipher_get_operation -#define cipher_get_type mbedtls_cipher_get_type -#define cipher_id_t mbedtls_cipher_id_t -#define cipher_info_from_string mbedtls_cipher_info_from_string -#define cipher_info_from_type mbedtls_cipher_info_from_type -#define cipher_info_from_values mbedtls_cipher_info_from_values -#define cipher_info_t mbedtls_cipher_info_t -#define cipher_init mbedtls_cipher_init -#define cipher_init_ctx mbedtls_cipher_setup -#define cipher_list mbedtls_cipher_list -#define cipher_mode_t mbedtls_cipher_mode_t -#define cipher_padding_t mbedtls_cipher_padding_t -#define cipher_reset mbedtls_cipher_reset -#define cipher_self_test mbedtls_cipher_self_test -#define cipher_set_iv mbedtls_cipher_set_iv -#define cipher_set_padding_mode mbedtls_cipher_set_padding_mode -#define cipher_setkey mbedtls_cipher_setkey -#define cipher_type_t mbedtls_cipher_type_t -#define cipher_update mbedtls_cipher_update -#define cipher_update_ad mbedtls_cipher_update_ad -#define cipher_write_tag mbedtls_cipher_write_tag -#define ctr_drbg_context mbedtls_ctr_drbg_context -#define ctr_drbg_free mbedtls_ctr_drbg_free -#define ctr_drbg_init mbedtls_ctr_drbg_init -#define ctr_drbg_init_entropy_len mbedtls_ctr_drbg_init_entropy_len -#define ctr_drbg_random mbedtls_ctr_drbg_random -#define ctr_drbg_random_with_add mbedtls_ctr_drbg_random_with_add -#define ctr_drbg_reseed mbedtls_ctr_drbg_reseed -#define ctr_drbg_self_test mbedtls_ctr_drbg_self_test -#define ctr_drbg_set_entropy_len mbedtls_ctr_drbg_set_entropy_len -#define ctr_drbg_set_prediction_resistance mbedtls_ctr_drbg_set_prediction_resistance -#define ctr_drbg_set_reseed_interval mbedtls_ctr_drbg_set_reseed_interval -#define ctr_drbg_update mbedtls_ctr_drbg_update -#define ctr_drbg_update_seed_file mbedtls_ctr_drbg_update_seed_file -#define ctr_drbg_write_seed_file mbedtls_ctr_drbg_write_seed_file -#define debug_fmt mbedtls_debug_fmt -#define debug_print_buf mbedtls_debug_print_buf -#define debug_print_crt mbedtls_debug_print_crt -#define debug_print_ecp mbedtls_debug_print_ecp -#define debug_print_mpi mbedtls_debug_print_mpi -#define debug_print_msg mbedtls_debug_print_msg -#define debug_print_ret mbedtls_debug_print_ret -#define debug_set_log_mode mbedtls_debug_set_log_mode -#define debug_set_threshold mbedtls_debug_set_threshold -#define des3_context mbedtls_des3_context -#define des3_crypt_cbc mbedtls_des3_crypt_cbc -#define des3_crypt_ecb mbedtls_des3_crypt_ecb -#define des3_free mbedtls_des3_free -#define des3_init mbedtls_des3_init -#define des3_set2key_dec mbedtls_des3_set2key_dec -#define des3_set2key_enc mbedtls_des3_set2key_enc -#define des3_set3key_dec mbedtls_des3_set3key_dec -#define des3_set3key_enc mbedtls_des3_set3key_enc -#define des_context mbedtls_des_context -#define des_crypt_cbc mbedtls_des_crypt_cbc -#define des_crypt_ecb mbedtls_des_crypt_ecb -#define des_free mbedtls_des_free -#define des_init mbedtls_des_init -#define des_key_check_key_parity mbedtls_des_key_check_key_parity -#define des_key_check_weak mbedtls_des_key_check_weak -#define des_key_set_parity mbedtls_des_key_set_parity -#define des_self_test mbedtls_des_self_test -#define des_setkey_dec mbedtls_des_setkey_dec -#define des_setkey_enc mbedtls_des_setkey_enc -#define dhm_calc_secret mbedtls_dhm_calc_secret -#define dhm_context mbedtls_dhm_context -#define dhm_free mbedtls_dhm_free -#define dhm_init mbedtls_dhm_init -#define dhm_make_params mbedtls_dhm_make_params -#define dhm_make_public mbedtls_dhm_make_public -#define dhm_parse_dhm mbedtls_dhm_parse_dhm -#define dhm_parse_dhmfile mbedtls_dhm_parse_dhmfile -#define dhm_read_params mbedtls_dhm_read_params -#define dhm_read_public mbedtls_dhm_read_public -#define dhm_self_test mbedtls_dhm_self_test -#define ecdh_calc_secret mbedtls_ecdh_calc_secret -#define ecdh_compute_shared mbedtls_ecdh_compute_shared -#define ecdh_context mbedtls_ecdh_context -#define ecdh_free mbedtls_ecdh_free -#define ecdh_gen_public mbedtls_ecdh_gen_public -#define ecdh_get_params mbedtls_ecdh_get_params -#define ecdh_init mbedtls_ecdh_init -#define ecdh_make_params mbedtls_ecdh_make_params -#define ecdh_make_public mbedtls_ecdh_make_public -#define ecdh_read_params mbedtls_ecdh_read_params -#define ecdh_read_public mbedtls_ecdh_read_public -#define ecdh_self_test mbedtls_ecdh_self_test -#define ecdh_side mbedtls_ecdh_side -#define ecdsa_context mbedtls_ecdsa_context -#define ecdsa_free mbedtls_ecdsa_free -#define ecdsa_from_keypair mbedtls_ecdsa_from_keypair -#define ecdsa_genkey mbedtls_ecdsa_genkey -#define ecdsa_info mbedtls_ecdsa_info -#define ecdsa_init mbedtls_ecdsa_init -#define ecdsa_read_signature mbedtls_ecdsa_read_signature -#define ecdsa_self_test mbedtls_ecdsa_self_test -#define ecdsa_sign mbedtls_ecdsa_sign -#define ecdsa_sign_det mbedtls_ecdsa_sign_det -#define ecdsa_verify mbedtls_ecdsa_verify -#define ecdsa_write_signature mbedtls_ecdsa_write_signature -#define ecdsa_write_signature_det mbedtls_ecdsa_write_signature_det -#define eckey_info mbedtls_eckey_info -#define eckeydh_info mbedtls_eckeydh_info -#define ecp_add mbedtls_ecp_add -#define ecp_check_privkey mbedtls_ecp_check_privkey -#define ecp_check_pub_priv mbedtls_ecp_check_pub_priv -#define ecp_check_pubkey mbedtls_ecp_check_pubkey -#define ecp_copy mbedtls_ecp_copy -#define ecp_curve_info mbedtls_ecp_curve_info -#define ecp_curve_info_from_grp_id mbedtls_ecp_curve_info_from_grp_id -#define ecp_curve_info_from_name mbedtls_ecp_curve_info_from_name -#define ecp_curve_info_from_tls_id mbedtls_ecp_curve_info_from_tls_id -#define ecp_curve_list mbedtls_ecp_curve_list -#define ecp_gen_key mbedtls_ecp_gen_key -#define ecp_gen_keypair mbedtls_ecp_gen_keypair -#define ecp_group mbedtls_ecp_group -#define ecp_group_copy mbedtls_ecp_group_copy -#define ecp_group_free mbedtls_ecp_group_free -#define ecp_group_id mbedtls_ecp_group_id -#define ecp_group_init mbedtls_ecp_group_init -#define ecp_group_read_string mbedtls_ecp_group_read_string -#define ecp_grp_id_list mbedtls_ecp_grp_id_list -#define ecp_is_zero mbedtls_ecp_is_zero -#define ecp_keypair mbedtls_ecp_keypair -#define ecp_keypair_free mbedtls_ecp_keypair_free -#define ecp_keypair_init mbedtls_ecp_keypair_init -#define ecp_mul mbedtls_ecp_mul -#define ecp_point mbedtls_ecp_point -#define ecp_point_free mbedtls_ecp_point_free -#define ecp_point_init mbedtls_ecp_point_init -#define ecp_point_read_binary mbedtls_ecp_point_read_binary -#define ecp_point_read_string mbedtls_ecp_point_read_string -#define ecp_point_write_binary mbedtls_ecp_point_write_binary -#define ecp_self_test mbedtls_ecp_self_test -#define ecp_set_zero mbedtls_ecp_set_zero -#define ecp_sub mbedtls_ecp_sub -#define ecp_tls_read_group mbedtls_ecp_tls_read_group -#define ecp_tls_read_point mbedtls_ecp_tls_read_point -#define ecp_tls_write_group mbedtls_ecp_tls_write_group -#define ecp_tls_write_point mbedtls_ecp_tls_write_point -#define ecp_use_known_dp mbedtls_ecp_group_load -#define entropy_add_source mbedtls_entropy_add_source -#define entropy_context mbedtls_entropy_context -#define entropy_free mbedtls_entropy_free -#define entropy_func mbedtls_entropy_func -#define entropy_gather mbedtls_entropy_gather -#define entropy_init mbedtls_entropy_init -#define entropy_self_test mbedtls_entropy_self_test -#define entropy_update_manual mbedtls_entropy_update_manual -#define entropy_update_seed_file mbedtls_entropy_update_seed_file -#define entropy_write_seed_file mbedtls_entropy_write_seed_file -#define error_strerror mbedtls_strerror -#define f_source_ptr mbedtls_entropy_f_source_ptr -#define gcm_auth_decrypt mbedtls_gcm_auth_decrypt -#define gcm_context mbedtls_gcm_context -#define gcm_crypt_and_tag mbedtls_gcm_crypt_and_tag -#define gcm_finish mbedtls_gcm_finish -#define gcm_free mbedtls_gcm_free -#define gcm_init mbedtls_gcm_init -#define gcm_self_test mbedtls_gcm_self_test -#define gcm_starts mbedtls_gcm_starts -#define gcm_update mbedtls_gcm_update -#define get_timer mbedtls_timing_get_timer -#define hardclock mbedtls_timing_hardclock -#define hardclock_poll mbedtls_hardclock_poll -#define havege_free mbedtls_havege_free -#define havege_init mbedtls_havege_init -#define havege_poll mbedtls_havege_poll -#define havege_random mbedtls_havege_random -#define havege_state mbedtls_havege_state -#define hmac_drbg_context mbedtls_hmac_drbg_context -#define hmac_drbg_free mbedtls_hmac_drbg_free -#define hmac_drbg_init mbedtls_hmac_drbg_init -#define hmac_drbg_init_buf mbedtls_hmac_drbg_init_buf -#define hmac_drbg_random mbedtls_hmac_drbg_random -#define hmac_drbg_random_with_add mbedtls_hmac_drbg_random_with_add -#define hmac_drbg_reseed mbedtls_hmac_drbg_reseed -#define hmac_drbg_self_test mbedtls_hmac_drbg_self_test -#define hmac_drbg_set_entropy_len mbedtls_hmac_drbg_set_entropy_len -#define hmac_drbg_set_prediction_resistance mbedtls_hmac_drbg_set_prediction_resistance -#define hmac_drbg_set_reseed_interval mbedtls_hmac_drbg_set_reseed_interval -#define hmac_drbg_update mbedtls_hmac_drbg_update -#define hmac_drbg_update_seed_file mbedtls_hmac_drbg_update_seed_file -#define hmac_drbg_write_seed_file mbedtls_hmac_drbg_write_seed_file -#define hr_time mbedtls_timing_hr_time -#define key_exchange_type_t mbedtls_key_exchange_type_t -#define md mbedtls_md -#define md2 mbedtls_md2 -#define md2_context mbedtls_md2_context -#define md2_file mbedtls_md2_file -#define md2_finish mbedtls_md2_finish -#define md2_free mbedtls_md2_free -#define md2_hmac mbedtls_md2_hmac -#define md2_hmac_finish mbedtls_md2_hmac_finish -#define md2_hmac_reset mbedtls_md2_hmac_reset -#define md2_hmac_starts mbedtls_md2_hmac_starts -#define md2_hmac_update mbedtls_md2_hmac_update -#define md2_info mbedtls_md2_info -#define md2_init mbedtls_md2_init -#define md2_process mbedtls_md2_process -#define md2_self_test mbedtls_md2_self_test -#define md2_starts mbedtls_md2_starts -#define md2_update mbedtls_md2_update -#define md4 mbedtls_md4 -#define md4_context mbedtls_md4_context -#define md4_file mbedtls_md4_file -#define md4_finish mbedtls_md4_finish -#define md4_free mbedtls_md4_free -#define md4_hmac mbedtls_md4_hmac -#define md4_hmac_finish mbedtls_md4_hmac_finish -#define md4_hmac_reset mbedtls_md4_hmac_reset -#define md4_hmac_starts mbedtls_md4_hmac_starts -#define md4_hmac_update mbedtls_md4_hmac_update -#define md4_info mbedtls_md4_info -#define md4_init mbedtls_md4_init -#define md4_process mbedtls_md4_process -#define md4_self_test mbedtls_md4_self_test -#define md4_starts mbedtls_md4_starts -#define md4_update mbedtls_md4_update -#define md5 mbedtls_md5 -#define md5_context mbedtls_md5_context -#define md5_file mbedtls_md5_file -#define md5_finish mbedtls_md5_finish -#define md5_free mbedtls_md5_free -#define md5_hmac mbedtls_md5_hmac -#define md5_hmac_finish mbedtls_md5_hmac_finish -#define md5_hmac_reset mbedtls_md5_hmac_reset -#define md5_hmac_starts mbedtls_md5_hmac_starts -#define md5_hmac_update mbedtls_md5_hmac_update -#define md5_info mbedtls_md5_info -#define md5_init mbedtls_md5_init -#define md5_process mbedtls_md5_process -#define md5_self_test mbedtls_md5_self_test -#define md5_starts mbedtls_md5_starts -#define md5_update mbedtls_md5_update -#define md_context_t mbedtls_md_context_t -#define md_file mbedtls_md_file -#define md_finish mbedtls_md_finish -#define md_free mbedtls_md_free -#define md_free_ctx mbedtls_md_free_ctx -#define md_get_name mbedtls_md_get_name -#define md_get_size mbedtls_md_get_size -#define md_get_type mbedtls_md_get_type -#define md_hmac mbedtls_md_hmac -#define md_hmac_finish mbedtls_md_hmac_finish -#define md_hmac_reset mbedtls_md_hmac_reset -#define md_hmac_starts mbedtls_md_hmac_starts -#define md_hmac_update mbedtls_md_hmac_update -#define md_info_from_string mbedtls_md_info_from_string -#define md_info_from_type mbedtls_md_info_from_type -#define md_info_t mbedtls_md_info_t -#define md_init mbedtls_md_init -#define md_init_ctx mbedtls_md_init_ctx -#define md_list mbedtls_md_list -#define md_process mbedtls_md_process -#define md_starts mbedtls_md_starts -#define md_type_t mbedtls_md_type_t -#define md_update mbedtls_md_update -#define memory_buffer_alloc_cur_get mbedtls_memory_buffer_alloc_cur_get -#define memory_buffer_alloc_free mbedtls_memory_buffer_alloc_free -#define memory_buffer_alloc_init mbedtls_memory_buffer_alloc_init -#define memory_buffer_alloc_max_get mbedtls_memory_buffer_alloc_max_get -#define memory_buffer_alloc_max_reset mbedtls_memory_buffer_alloc_max_reset -#define memory_buffer_alloc_self_test mbedtls_memory_buffer_alloc_self_test -#define memory_buffer_alloc_status mbedtls_memory_buffer_alloc_status -#define memory_buffer_alloc_verify mbedtls_memory_buffer_alloc_verify -#define memory_buffer_set_verify mbedtls_memory_buffer_set_verify -#define memory_set_own mbedtls_memory_set_own -#define mpi mbedtls_mpi -#define mpi_add_abs mbedtls_mpi_add_abs -#define mpi_add_int mbedtls_mpi_add_int -#define mpi_add_mpi mbedtls_mpi_add_mpi -#define mpi_cmp_abs mbedtls_mpi_cmp_abs -#define mpi_cmp_int mbedtls_mpi_cmp_int -#define mpi_cmp_mpi mbedtls_mpi_cmp_mpi -#define mpi_copy mbedtls_mpi_copy -#define mpi_div_int mbedtls_mpi_div_int -#define mpi_div_mpi mbedtls_mpi_div_mpi -#define mpi_exp_mod mbedtls_mpi_exp_mod -#define mpi_fill_random mbedtls_mpi_fill_random -#define mpi_free mbedtls_mpi_free -#define mpi_gcd mbedtls_mpi_gcd -#define mpi_gen_prime mbedtls_mpi_gen_prime -#define mpi_get_bit mbedtls_mpi_get_bit -#define mpi_grow mbedtls_mpi_grow -#define mpi_init mbedtls_mpi_init -#define mpi_inv_mod mbedtls_mpi_inv_mod -#define mpi_is_prime mbedtls_mpi_is_prime -#define mpi_lsb mbedtls_mpi_lsb -#define mpi_lset mbedtls_mpi_lset -#define mpi_mod_int mbedtls_mpi_mod_int -#define mpi_mod_mpi mbedtls_mpi_mod_mpi -#define mpi_msb mbedtls_mpi_bitlen -#define mpi_mul_int mbedtls_mpi_mul_int -#define mpi_mul_mpi mbedtls_mpi_mul_mpi -#define mpi_read_binary mbedtls_mpi_read_binary -#define mpi_read_file mbedtls_mpi_read_file -#define mpi_read_string mbedtls_mpi_read_string -#define mpi_safe_cond_assign mbedtls_mpi_safe_cond_assign -#define mpi_safe_cond_swap mbedtls_mpi_safe_cond_swap -#define mpi_self_test mbedtls_mpi_self_test -#define mpi_set_bit mbedtls_mpi_set_bit -#define mpi_shift_l mbedtls_mpi_shift_l -#define mpi_shift_r mbedtls_mpi_shift_r -#define mpi_shrink mbedtls_mpi_shrink -#define mpi_size mbedtls_mpi_size -#define mpi_sub_abs mbedtls_mpi_sub_abs -#define mpi_sub_int mbedtls_mpi_sub_int -#define mpi_sub_mpi mbedtls_mpi_sub_mpi -#define mpi_swap mbedtls_mpi_swap -#define mpi_write_binary mbedtls_mpi_write_binary -#define mpi_write_file mbedtls_mpi_write_file -#define mpi_write_string mbedtls_mpi_write_string -#define net_accept mbedtls_net_accept -#define net_bind mbedtls_net_bind -#define net_close mbedtls_net_free -#define net_connect mbedtls_net_connect -#define net_recv mbedtls_net_recv -#define net_recv_timeout mbedtls_net_recv_timeout -#define net_send mbedtls_net_send -#define net_set_block mbedtls_net_set_block -#define net_set_nonblock mbedtls_net_set_nonblock -#define net_usleep mbedtls_net_usleep -#define oid_descriptor_t mbedtls_oid_descriptor_t -#define oid_get_attr_short_name mbedtls_oid_get_attr_short_name -#define oid_get_cipher_alg mbedtls_oid_get_cipher_alg -#define oid_get_ec_grp mbedtls_oid_get_ec_grp -#define oid_get_extended_key_usage mbedtls_oid_get_extended_key_usage -#define oid_get_md_alg mbedtls_oid_get_md_alg -#define oid_get_numeric_string mbedtls_oid_get_numeric_string -#define oid_get_oid_by_ec_grp mbedtls_oid_get_oid_by_ec_grp -#define oid_get_oid_by_md mbedtls_oid_get_oid_by_md -#define oid_get_oid_by_pk_alg mbedtls_oid_get_oid_by_pk_alg -#define oid_get_oid_by_sig_alg mbedtls_oid_get_oid_by_sig_alg -#define oid_get_pk_alg mbedtls_oid_get_pk_alg -#define oid_get_pkcs12_pbe_alg mbedtls_oid_get_pkcs12_pbe_alg -#define oid_get_sig_alg mbedtls_oid_get_sig_alg -#define oid_get_sig_alg_desc mbedtls_oid_get_sig_alg_desc -#define oid_get_x509_ext_type mbedtls_oid_get_x509_ext_type -#define operation_t mbedtls_operation_t -#define padlock_supports mbedtls_padlock_has_support -#define padlock_xcryptcbc mbedtls_padlock_xcryptcbc -#define padlock_xcryptecb mbedtls_padlock_xcryptecb -#define pbkdf2_hmac mbedtls_pbkdf2_hmac -#define pbkdf2_self_test mbedtls_pbkdf2_self_test -#define pem_context mbedtls_pem_context -#define pem_free mbedtls_pem_free -#define pem_init mbedtls_pem_init -#define pem_read_buffer mbedtls_pem_read_buffer -#define pem_write_buffer mbedtls_pem_write_buffer -#define pk_can_do mbedtls_pk_can_do -#define pk_check_pair mbedtls_pk_check_pair -#define pk_context mbedtls_pk_context -#define pk_debug mbedtls_pk_debug -#define pk_debug_item mbedtls_pk_debug_item -#define pk_debug_type mbedtls_pk_debug_type -#define pk_decrypt mbedtls_pk_decrypt -#define pk_ec mbedtls_pk_ec -#define pk_encrypt mbedtls_pk_encrypt -#define pk_free mbedtls_pk_free -#define pk_get_len mbedtls_pk_get_len -#define pk_get_name mbedtls_pk_get_name -#define pk_get_size mbedtls_pk_get_bitlen -#define pk_get_type mbedtls_pk_get_type -#define pk_info_from_type mbedtls_pk_info_from_type -#define pk_info_t mbedtls_pk_info_t -#define pk_init mbedtls_pk_init -#define pk_init_ctx mbedtls_pk_setup -#define pk_init_ctx_rsa_alt mbedtls_pk_setup_rsa_alt -#define pk_load_file mbedtls_pk_load_file -#define pk_parse_key mbedtls_pk_parse_key -#define pk_parse_keyfile mbedtls_pk_parse_keyfile -#define pk_parse_public_key mbedtls_pk_parse_public_key -#define pk_parse_public_keyfile mbedtls_pk_parse_public_keyfile -#define pk_parse_subpubkey mbedtls_pk_parse_subpubkey -#define pk_rsa mbedtls_pk_rsa -#define pk_rsa_alt_decrypt_func mbedtls_pk_rsa_alt_decrypt_func -#define pk_rsa_alt_key_len_func mbedtls_pk_rsa_alt_key_len_func -#define pk_rsa_alt_sign_func mbedtls_pk_rsa_alt_sign_func -#define pk_rsassa_pss_options mbedtls_pk_rsassa_pss_options -#define pk_sign mbedtls_pk_sign -#define pk_type_t mbedtls_pk_type_t -#define pk_verify mbedtls_pk_verify -#define pk_verify_ext mbedtls_pk_verify_ext -#define pk_write_key_der mbedtls_pk_write_key_der -#define pk_write_key_pem mbedtls_pk_write_key_pem -#define pk_write_pubkey mbedtls_pk_write_pubkey -#define pk_write_pubkey_der mbedtls_pk_write_pubkey_der -#define pk_write_pubkey_pem mbedtls_pk_write_pubkey_pem -#define pkcs11_context mbedtls_pkcs11_context -#define pkcs11_decrypt mbedtls_pkcs11_decrypt -#define pkcs11_priv_key_free mbedtls_pkcs11_priv_key_free -#define pkcs11_priv_key_init mbedtls_pkcs11_priv_key_bind -#define pkcs11_sign mbedtls_pkcs11_sign -#define pkcs11_x509_cert_init mbedtls_pkcs11_x509_cert_bind -#define pkcs12_derivation mbedtls_pkcs12_derivation -#define pkcs12_pbe mbedtls_pkcs12_pbe -#define pkcs12_pbe_sha1_rc4_128 mbedtls_pkcs12_pbe_sha1_rc4_128 -#define pkcs5_pbes2 mbedtls_pkcs5_pbes2 -#define pkcs5_pbkdf2_hmac mbedtls_pkcs5_pbkdf2_hmac -#define pkcs5_self_test mbedtls_pkcs5_self_test -#define platform_entropy_poll mbedtls_platform_entropy_poll -#define platform_set_exit mbedtls_platform_set_exit -#define platform_set_fprintf mbedtls_platform_set_fprintf -#define platform_set_malloc_free mbedtls_platform_set_malloc_free -#define platform_set_printf mbedtls_platform_set_printf -#define platform_set_snprintf mbedtls_platform_set_snprintf -#define polarssl_exit mbedtls_exit -#define polarssl_fprintf mbedtls_fprintf -#define polarssl_free mbedtls_free -#define polarssl_malloc mbedtls_malloc -#define polarssl_mutex_free mbedtls_mutex_free -#define polarssl_mutex_init mbedtls_mutex_init -#define polarssl_mutex_lock mbedtls_mutex_lock -#define polarssl_mutex_unlock mbedtls_mutex_unlock -#define polarssl_printf mbedtls_printf -#define polarssl_snprintf mbedtls_snprintf -#define polarssl_strerror mbedtls_strerror -#define ripemd160 mbedtls_ripemd160 -#define ripemd160_context mbedtls_ripemd160_context -#define ripemd160_file mbedtls_ripemd160_file -#define ripemd160_finish mbedtls_ripemd160_finish -#define ripemd160_free mbedtls_ripemd160_free -#define ripemd160_hmac mbedtls_ripemd160_hmac -#define ripemd160_hmac_finish mbedtls_ripemd160_hmac_finish -#define ripemd160_hmac_reset mbedtls_ripemd160_hmac_reset -#define ripemd160_hmac_starts mbedtls_ripemd160_hmac_starts -#define ripemd160_hmac_update mbedtls_ripemd160_hmac_update -#define ripemd160_info mbedtls_ripemd160_info -#define ripemd160_init mbedtls_ripemd160_init -#define ripemd160_process mbedtls_ripemd160_process -#define ripemd160_self_test mbedtls_ripemd160_self_test -#define ripemd160_starts mbedtls_ripemd160_starts -#define ripemd160_update mbedtls_ripemd160_update -#define rsa_alt_context mbedtls_rsa_alt_context -#define rsa_alt_info mbedtls_rsa_alt_info -#define rsa_check_privkey mbedtls_rsa_check_privkey -#define rsa_check_pub_priv mbedtls_rsa_check_pub_priv -#define rsa_check_pubkey mbedtls_rsa_check_pubkey -#define rsa_context mbedtls_rsa_context -#define rsa_copy mbedtls_rsa_copy -#define rsa_decrypt_func mbedtls_rsa_decrypt_func -#define rsa_free mbedtls_rsa_free -#define rsa_gen_key mbedtls_rsa_gen_key -#define rsa_info mbedtls_rsa_info -#define rsa_init mbedtls_rsa_init -#define rsa_key_len_func mbedtls_rsa_key_len_func -#define rsa_pkcs1_decrypt mbedtls_rsa_pkcs1_decrypt -#define rsa_pkcs1_encrypt mbedtls_rsa_pkcs1_encrypt -#define rsa_pkcs1_sign mbedtls_rsa_pkcs1_sign -#define rsa_pkcs1_verify mbedtls_rsa_pkcs1_verify -#define rsa_private mbedtls_rsa_private -#define rsa_public mbedtls_rsa_public -#define rsa_rsaes_oaep_decrypt mbedtls_rsa_rsaes_oaep_decrypt -#define rsa_rsaes_oaep_encrypt mbedtls_rsa_rsaes_oaep_encrypt -#define rsa_rsaes_pkcs1_v15_decrypt mbedtls_rsa_rsaes_pkcs1_v15_decrypt -#define rsa_rsaes_pkcs1_v15_encrypt mbedtls_rsa_rsaes_pkcs1_v15_encrypt -#define rsa_rsassa_pkcs1_v15_sign mbedtls_rsa_rsassa_pkcs1_v15_sign -#define rsa_rsassa_pkcs1_v15_verify mbedtls_rsa_rsassa_pkcs1_v15_verify -#define rsa_rsassa_pss_sign mbedtls_rsa_rsassa_pss_sign -#define rsa_rsassa_pss_verify mbedtls_rsa_rsassa_pss_verify -#define rsa_rsassa_pss_verify_ext mbedtls_rsa_rsassa_pss_verify_ext -#define rsa_self_test mbedtls_rsa_self_test -#define rsa_set_padding mbedtls_rsa_set_padding -#define rsa_sign_func mbedtls_rsa_sign_func -#define safer_memcmp mbedtls_ssl_safer_memcmp -#define set_alarm mbedtls_set_alarm -#define sha1 mbedtls_sha1 -#define sha1_context mbedtls_sha1_context -#define sha1_file mbedtls_sha1_file -#define sha1_finish mbedtls_sha1_finish -#define sha1_free mbedtls_sha1_free -#define sha1_hmac mbedtls_sha1_hmac -#define sha1_hmac_finish mbedtls_sha1_hmac_finish -#define sha1_hmac_reset mbedtls_sha1_hmac_reset -#define sha1_hmac_starts mbedtls_sha1_hmac_starts -#define sha1_hmac_update mbedtls_sha1_hmac_update -#define sha1_info mbedtls_sha1_info -#define sha1_init mbedtls_sha1_init -#define sha1_process mbedtls_sha1_process -#define sha1_self_test mbedtls_sha1_self_test -#define sha1_starts mbedtls_sha1_starts -#define sha1_update mbedtls_sha1_update -#define sha224_info mbedtls_sha224_info -#define sha256 mbedtls_sha256 -#define sha256_context mbedtls_sha256_context -#define sha256_file mbedtls_sha256_file -#define sha256_finish mbedtls_sha256_finish -#define sha256_free mbedtls_sha256_free -#define sha256_hmac mbedtls_sha256_hmac -#define sha256_hmac_finish mbedtls_sha256_hmac_finish -#define sha256_hmac_reset mbedtls_sha256_hmac_reset -#define sha256_hmac_starts mbedtls_sha256_hmac_starts -#define sha256_hmac_update mbedtls_sha256_hmac_update -#define sha256_info mbedtls_sha256_info -#define sha256_init mbedtls_sha256_init -#define sha256_process mbedtls_sha256_process -#define sha256_self_test mbedtls_sha256_self_test -#define sha256_starts mbedtls_sha256_starts -#define sha256_update mbedtls_sha256_update -#define sha384_info mbedtls_sha384_info -#define sha512 mbedtls_sha512 -#define sha512_context mbedtls_sha512_context -#define sha512_file mbedtls_sha512_file -#define sha512_finish mbedtls_sha512_finish -#define sha512_free mbedtls_sha512_free -#define sha512_hmac mbedtls_sha512_hmac -#define sha512_hmac_finish mbedtls_sha512_hmac_finish -#define sha512_hmac_reset mbedtls_sha512_hmac_reset -#define sha512_hmac_starts mbedtls_sha512_hmac_starts -#define sha512_hmac_update mbedtls_sha512_hmac_update -#define sha512_info mbedtls_sha512_info -#define sha512_init mbedtls_sha512_init -#define sha512_process mbedtls_sha512_process -#define sha512_self_test mbedtls_sha512_self_test -#define sha512_starts mbedtls_sha512_starts -#define sha512_update mbedtls_sha512_update -#define source_state mbedtls_entropy_source_state -#define ssl_cache_context mbedtls_ssl_cache_context -#define ssl_cache_entry mbedtls_ssl_cache_entry -#define ssl_cache_free mbedtls_ssl_cache_free -#define ssl_cache_get mbedtls_ssl_cache_get -#define ssl_cache_init mbedtls_ssl_cache_init -#define ssl_cache_set mbedtls_ssl_cache_set -#define ssl_cache_set_max_entries mbedtls_ssl_cache_set_max_entries -#define ssl_cache_set_timeout mbedtls_ssl_cache_set_timeout -#define ssl_check_cert_usage mbedtls_ssl_check_cert_usage -#define ssl_ciphersuite_from_id mbedtls_ssl_ciphersuite_from_id -#define ssl_ciphersuite_from_string mbedtls_ssl_ciphersuite_from_string -#define ssl_ciphersuite_t mbedtls_ssl_ciphersuite_t -#define ssl_ciphersuite_uses_ec mbedtls_ssl_ciphersuite_uses_ec -#define ssl_ciphersuite_uses_psk mbedtls_ssl_ciphersuite_uses_psk -#define ssl_close_notify mbedtls_ssl_close_notify -#define ssl_context mbedtls_ssl_context -#define ssl_cookie_check mbedtls_ssl_cookie_check -#define ssl_cookie_check_t mbedtls_ssl_cookie_check_t -#define ssl_cookie_ctx mbedtls_ssl_cookie_ctx -#define ssl_cookie_free mbedtls_ssl_cookie_free -#define ssl_cookie_init mbedtls_ssl_cookie_init -#define ssl_cookie_set_timeout mbedtls_ssl_cookie_set_timeout -#define ssl_cookie_setup mbedtls_ssl_cookie_setup -#define ssl_cookie_write mbedtls_ssl_cookie_write -#define ssl_cookie_write_t mbedtls_ssl_cookie_write_t -#define ssl_curve_is_acceptable mbedtls_ssl_curve_is_acceptable -#define ssl_derive_keys mbedtls_ssl_derive_keys -#define ssl_dtls_replay_check mbedtls_ssl_dtls_replay_check -#define ssl_dtls_replay_update mbedtls_ssl_dtls_replay_update -#define ssl_fetch_input mbedtls_ssl_fetch_input -#define ssl_flight_item mbedtls_ssl_flight_item -#define ssl_flush_output mbedtls_ssl_flush_output -#define ssl_free mbedtls_ssl_free -#define ssl_get_alpn_protocol mbedtls_ssl_get_alpn_protocol -#define ssl_get_bytes_avail mbedtls_ssl_get_bytes_avail -#define ssl_get_ciphersuite mbedtls_ssl_get_ciphersuite -#define ssl_get_ciphersuite_id mbedtls_ssl_get_ciphersuite_id -#define ssl_get_ciphersuite_name mbedtls_ssl_get_ciphersuite_name -#define ssl_get_ciphersuite_sig_pk_alg mbedtls_ssl_get_ciphersuite_sig_pk_alg -#define ssl_get_peer_cert mbedtls_ssl_get_peer_cert -#define ssl_get_record_expansion mbedtls_ssl_get_record_expansion -#define ssl_get_session mbedtls_ssl_get_session -#define ssl_get_verify_result mbedtls_ssl_get_verify_result -#define ssl_get_version mbedtls_ssl_get_version -#define ssl_handshake mbedtls_ssl_handshake -#define ssl_handshake_client_step mbedtls_ssl_handshake_client_step -#define ssl_handshake_free mbedtls_ssl_handshake_free -#define ssl_handshake_params mbedtls_ssl_handshake_params -#define ssl_handshake_server_step mbedtls_ssl_handshake_server_step -#define ssl_handshake_step mbedtls_ssl_handshake_step -#define ssl_handshake_wrapup mbedtls_ssl_handshake_wrapup -#define ssl_hdr_len mbedtls_ssl_hdr_len -#define ssl_hs_hdr_len mbedtls_ssl_hs_hdr_len -#define ssl_hw_record_activate mbedtls_ssl_hw_record_activate -#define ssl_hw_record_finish mbedtls_ssl_hw_record_finish -#define ssl_hw_record_init mbedtls_ssl_hw_record_init -#define ssl_hw_record_read mbedtls_ssl_hw_record_read -#define ssl_hw_record_reset mbedtls_ssl_hw_record_reset -#define ssl_hw_record_write mbedtls_ssl_hw_record_write -#define ssl_init mbedtls_ssl_init -#define ssl_key_cert mbedtls_ssl_key_cert -#define ssl_legacy_renegotiation mbedtls_ssl_conf_legacy_renegotiation -#define ssl_list_ciphersuites mbedtls_ssl_list_ciphersuites -#define ssl_md_alg_from_hash mbedtls_ssl_md_alg_from_hash -#define ssl_optimize_checksum mbedtls_ssl_optimize_checksum -#define ssl_own_cert mbedtls_ssl_own_cert -#define ssl_own_key mbedtls_ssl_own_key -#define ssl_parse_certificate mbedtls_ssl_parse_certificate -#define ssl_parse_change_cipher_spec mbedtls_ssl_parse_change_cipher_spec -#define ssl_parse_finished mbedtls_ssl_parse_finished -#define ssl_pk_alg_from_sig mbedtls_ssl_pk_alg_from_sig -#define ssl_pkcs11_decrypt mbedtls_ssl_pkcs11_decrypt -#define ssl_pkcs11_key_len mbedtls_ssl_pkcs11_key_len -#define ssl_pkcs11_sign mbedtls_ssl_pkcs11_sign -#define ssl_psk_derive_premaster mbedtls_ssl_psk_derive_premaster -#define ssl_read mbedtls_ssl_read -#define ssl_read_record mbedtls_ssl_read_record -#define ssl_read_version mbedtls_ssl_read_version -#define ssl_recv_flight_completed mbedtls_ssl_recv_flight_completed -#define ssl_renegotiate mbedtls_ssl_renegotiate -#define ssl_resend mbedtls_ssl_resend -#define ssl_reset_checksum mbedtls_ssl_reset_checksum -#define ssl_send_alert_message mbedtls_ssl_send_alert_message -#define ssl_send_fatal_handshake_failure mbedtls_ssl_send_fatal_handshake_failure -#define ssl_send_flight_completed mbedtls_ssl_send_flight_completed -#define ssl_session mbedtls_ssl_session -#define ssl_session_free mbedtls_ssl_session_free -#define ssl_session_init mbedtls_ssl_session_init -#define ssl_session_reset mbedtls_ssl_session_reset -#define ssl_set_alpn_protocols mbedtls_ssl_conf_alpn_protocols -#define ssl_set_arc4_support mbedtls_ssl_conf_arc4_support -#define ssl_set_authmode mbedtls_ssl_conf_authmode -#define ssl_set_bio mbedtls_ssl_set_bio -#define ssl_set_bio mbedtls_ssl_set_bio_timeout -#define ssl_set_ca_chain mbedtls_ssl_conf_ca_chain -#define ssl_set_cbc_record_splitting mbedtls_ssl_conf_cbc_record_splitting -#define ssl_set_ciphersuites mbedtls_ssl_conf_ciphersuites -#define ssl_set_ciphersuites_for_version mbedtls_ssl_conf_ciphersuites_for_version -#define ssl_set_client_transport_id mbedtls_ssl_set_client_transport_id -#define ssl_set_curves mbedtls_ssl_conf_curves -#define ssl_set_dbg mbedtls_ssl_conf_dbg -#define ssl_set_dh_param mbedtls_ssl_conf_dh_param -#define ssl_set_dh_param_ctx mbedtls_ssl_conf_dh_param_ctx -#define ssl_set_dtls_anti_replay mbedtls_ssl_conf_dtls_anti_replay -#define ssl_set_dtls_badmac_limit mbedtls_ssl_conf_dtls_badmac_limit -#define ssl_set_dtls_cookies mbedtls_ssl_conf_dtls_cookies -#define ssl_set_encrypt_then_mac mbedtls_ssl_conf_encrypt_then_mac -#define ssl_set_endpoint mbedtls_ssl_conf_endpoint -#define ssl_set_extended_master_secret mbedtls_ssl_conf_extended_master_secret -#define ssl_set_fallback mbedtls_ssl_conf_fallback -#define ssl_set_handshake_timeout mbedtls_ssl_conf_handshake_timeout -#define ssl_set_hostname mbedtls_ssl_set_hostname -#define ssl_set_max_frag_len mbedtls_ssl_conf_max_frag_len -#define ssl_set_max_version mbedtls_ssl_conf_max_version -#define ssl_set_min_version mbedtls_ssl_conf_min_version -#define ssl_set_own_cert mbedtls_ssl_conf_own_cert -#define ssl_set_own_cert_alt mbedtls_ssl_set_own_cert_alt -#define ssl_set_own_cert_rsa mbedtls_ssl_set_own_cert_rsa -#define ssl_set_psk mbedtls_ssl_conf_psk -#define ssl_set_psk_cb mbedtls_ssl_conf_psk_cb -#define ssl_set_renegotiation mbedtls_ssl_conf_renegotiation -#define ssl_set_renegotiation_enforced mbedtls_ssl_conf_renegotiation_enforced -#define ssl_set_renegotiation_period mbedtls_ssl_conf_renegotiation_period -#define ssl_set_rng mbedtls_ssl_conf_rng -#define ssl_set_session mbedtls_ssl_set_session -#define ssl_set_session_cache mbedtls_ssl_conf_session_cache -#define ssl_set_session_ticket_lifetime mbedtls_ssl_conf_session_ticket_lifetime -#define ssl_set_session_tickets mbedtls_ssl_conf_session_tickets -#define ssl_set_sni mbedtls_ssl_conf_sni -#define ssl_set_transport mbedtls_ssl_conf_transport -#define ssl_set_truncated_hmac mbedtls_ssl_conf_truncated_hmac -#define ssl_set_verify mbedtls_ssl_conf_verify -#define ssl_sig_from_pk mbedtls_ssl_sig_from_pk -#define ssl_states mbedtls_ssl_states -#define ssl_ticket_keys mbedtls_ssl_ticket_keys -#define ssl_transform mbedtls_ssl_transform -#define ssl_transform_free mbedtls_ssl_transform_free -#define ssl_write mbedtls_ssl_write -#define ssl_write_certificate mbedtls_ssl_write_certificate -#define ssl_write_change_cipher_spec mbedtls_ssl_write_change_cipher_spec -#define ssl_write_finished mbedtls_ssl_write_finished -#define ssl_write_record mbedtls_ssl_write_record -#define ssl_write_version mbedtls_ssl_write_version -#define supported_ciphers mbedtls_cipher_supported -#define t_sint mbedtls_mpi_sint -#define t_udbl mbedtls_t_udbl -#define t_uint mbedtls_mpi_uint -#define test_ca_crt mbedtls_test_ca_crt -#define test_ca_crt_ec mbedtls_test_ca_crt_ec -#define test_ca_crt_rsa mbedtls_test_ca_crt_rsa -#define test_ca_key mbedtls_test_ca_key -#define test_ca_key_ec mbedtls_test_ca_key_ec -#define test_ca_key_rsa mbedtls_test_ca_key_rsa -#define test_ca_list mbedtls_test_cas_pem -#define test_ca_pwd mbedtls_test_ca_pwd -#define test_ca_pwd_ec mbedtls_test_ca_pwd_ec -#define test_ca_pwd_rsa mbedtls_test_ca_pwd_rsa -#define test_cli_crt mbedtls_test_cli_crt -#define test_cli_crt_ec mbedtls_test_cli_crt_ec -#define test_cli_crt_rsa mbedtls_test_cli_crt_rsa -#define test_cli_key mbedtls_test_cli_key -#define test_cli_key_ec mbedtls_test_cli_key_ec -#define test_cli_key_rsa mbedtls_test_cli_key_rsa -#define test_dhm_params mbedtls_test_dhm_params -#define test_srv_crt mbedtls_test_srv_crt -#define test_srv_crt_ec mbedtls_test_srv_crt_ec -#define test_srv_crt_rsa mbedtls_test_srv_crt_rsa -#define test_srv_key mbedtls_test_srv_key -#define test_srv_key_ec mbedtls_test_srv_key_ec -#define test_srv_key_rsa mbedtls_test_srv_key_rsa -#define threading_mutex_t mbedtls_threading_mutex_t -#define threading_set_alt mbedtls_threading_set_alt -#define timing_self_test mbedtls_timing_self_test -#define version_check_feature mbedtls_version_check_feature -#define version_get_number mbedtls_version_get_number -#define version_get_string mbedtls_version_get_string -#define version_get_string_full mbedtls_version_get_string_full -#define x509_bitstring mbedtls_x509_bitstring -#define x509_buf mbedtls_x509_buf -#define x509_crl mbedtls_x509_crl -#define x509_crl_entry mbedtls_x509_crl_entry -#define x509_crl_free mbedtls_x509_crl_free -#define x509_crl_info mbedtls_x509_crl_info -#define x509_crl_init mbedtls_x509_crl_init -#define x509_crl_parse mbedtls_x509_crl_parse -#define x509_crl_parse_der mbedtls_x509_crl_parse_der -#define x509_crl_parse_file mbedtls_x509_crl_parse_file -#define x509_crt mbedtls_x509_crt -#define x509_crt_check_extended_key_usage mbedtls_x509_crt_check_extended_key_usage -#define x509_crt_check_key_usage mbedtls_x509_crt_check_key_usage -#define x509_crt_free mbedtls_x509_crt_free -#define x509_crt_info mbedtls_x509_crt_info -#define x509_crt_init mbedtls_x509_crt_init -#define x509_crt_parse mbedtls_x509_crt_parse -#define x509_crt_parse_der mbedtls_x509_crt_parse_der -#define x509_crt_parse_file mbedtls_x509_crt_parse_file -#define x509_crt_parse_path mbedtls_x509_crt_parse_path -#define x509_crt_revoked mbedtls_x509_crt_is_revoked -#define x509_crt_verify mbedtls_x509_crt_verify -#define x509_csr mbedtls_x509_csr -#define x509_csr_free mbedtls_x509_csr_free -#define x509_csr_info mbedtls_x509_csr_info -#define x509_csr_init mbedtls_x509_csr_init -#define x509_csr_parse mbedtls_x509_csr_parse -#define x509_csr_parse_der mbedtls_x509_csr_parse_der -#define x509_csr_parse_file mbedtls_x509_csr_parse_file -#define x509_dn_gets mbedtls_x509_dn_gets -#define x509_get_alg mbedtls_x509_get_alg -#define x509_get_alg_null mbedtls_x509_get_alg_null -#define x509_get_ext mbedtls_x509_get_ext -#define x509_get_name mbedtls_x509_get_name -#define x509_get_rsassa_pss_params mbedtls_x509_get_rsassa_pss_params -#define x509_get_serial mbedtls_x509_get_serial -#define x509_get_sig mbedtls_x509_get_sig -#define x509_get_sig_alg mbedtls_x509_get_sig_alg -#define x509_get_time mbedtls_x509_get_time -#define x509_key_size_helper mbedtls_x509_key_size_helper -#define x509_name mbedtls_x509_name -#define x509_oid_get_description mbedtls_x509_oid_get_description -#define x509_oid_get_numeric_string mbedtls_x509_oid_get_numeric_string -#define x509_self_test mbedtls_x509_self_test -#define x509_sequence mbedtls_x509_sequence -#define x509_serial_gets mbedtls_x509_serial_gets -#define x509_set_extension mbedtls_x509_set_extension -#define x509_sig_alg_gets mbedtls_x509_sig_alg_gets -#define x509_string_to_names mbedtls_x509_string_to_names -#define x509_time mbedtls_x509_time -#define x509_time_expired mbedtls_x509_time_is_past -#define x509_time_future mbedtls_x509_time_is_future -#define x509_write_extensions mbedtls_x509_write_extensions -#define x509_write_names mbedtls_x509_write_names -#define x509_write_sig mbedtls_x509_write_sig -#define x509write_cert mbedtls_x509write_cert -#define x509write_crt_der mbedtls_x509write_crt_der -#define x509write_crt_free mbedtls_x509write_crt_free -#define x509write_crt_init mbedtls_x509write_crt_init -#define x509write_crt_pem mbedtls_x509write_crt_pem -#define x509write_crt_set_authority_key_identifier mbedtls_x509write_crt_set_authority_key_identifier -#define x509write_crt_set_basic_constraints mbedtls_x509write_crt_set_basic_constraints -#define x509write_crt_set_extension mbedtls_x509write_crt_set_extension -#define x509write_crt_set_issuer_key mbedtls_x509write_crt_set_issuer_key -#define x509write_crt_set_issuer_name mbedtls_x509write_crt_set_issuer_name -#define x509write_crt_set_key_usage mbedtls_x509write_crt_set_key_usage -#define x509write_crt_set_md_alg mbedtls_x509write_crt_set_md_alg -#define x509write_crt_set_ns_cert_type mbedtls_x509write_crt_set_ns_cert_type -#define x509write_crt_set_serial mbedtls_x509write_crt_set_serial -#define x509write_crt_set_subject_key mbedtls_x509write_crt_set_subject_key -#define x509write_crt_set_subject_key_identifier mbedtls_x509write_crt_set_subject_key_identifier -#define x509write_crt_set_subject_name mbedtls_x509write_crt_set_subject_name -#define x509write_crt_set_validity mbedtls_x509write_crt_set_validity -#define x509write_crt_set_version mbedtls_x509write_crt_set_version -#define x509write_csr mbedtls_x509write_csr -#define x509write_csr_der mbedtls_x509write_csr_der -#define x509write_csr_free mbedtls_x509write_csr_free -#define x509write_csr_init mbedtls_x509write_csr_init -#define x509write_csr_pem mbedtls_x509write_csr_pem -#define x509write_csr_set_extension mbedtls_x509write_csr_set_extension -#define x509write_csr_set_key mbedtls_x509write_csr_set_key -#define x509write_csr_set_key_usage mbedtls_x509write_csr_set_key_usage -#define x509write_csr_set_md_alg mbedtls_x509write_csr_set_md_alg -#define x509write_csr_set_ns_cert_type mbedtls_x509write_csr_set_ns_cert_type -#define x509write_csr_set_subject_name mbedtls_x509write_csr_set_subject_name -#define xtea_context mbedtls_xtea_context -#define xtea_crypt_cbc mbedtls_xtea_crypt_cbc -#define xtea_crypt_ecb mbedtls_xtea_crypt_ecb -#define xtea_free mbedtls_xtea_free -#define xtea_init mbedtls_xtea_init -#define xtea_self_test mbedtls_xtea_self_test -#define xtea_setup mbedtls_xtea_setup - -#endif /* compat-1.3.h */ -#endif /* MBEDTLS_DEPRECATED_REMOVED */ diff --git a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/config.h b/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/config.h deleted file mode 100644 index 68153efd..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/config.h +++ /dev/null @@ -1,2462 +0,0 @@ -/** - * \file config.h - * - * \brief Configuration options (set of defines) - * - * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * This file is part of mbed TLS (https://tls.mbed.org) - */ - -/* - * This set of compile-time options may be used to enable - * or disable features selectively, and reduce the global - * memory footprint. - */ -#ifndef MBEDTLS_CONFIG_H -#define MBEDTLS_CONFIG_H - -#if defined(_MSC_VER) && !defined(_CRT_SECURE_NO_DEPRECATE) -#define _CRT_SECURE_NO_DEPRECATE 1 -#endif - -/** - * \name SECTION: System support - * - * This section sets system specific settings. - * \{ - */ - -/** - * \def MBEDTLS_HAVE_ASM - * - * The compiler has support for asm(). - * - * Requires support for asm() in compiler. - * - * Used in: - * library/timing.c - * library/padlock.c - * include/mbedtls/bn_mul.h - * - * Comment to disable the use of assembly code. - */ -#define MBEDTLS_HAVE_ASM - -/** - * \def MBEDTLS_HAVE_SSE2 - * - * CPU supports SSE2 instruction set. - * - * Uncomment if the CPU supports SSE2 (IA-32 specific). - */ -//#define MBEDTLS_HAVE_SSE2 - -/** - * \def MBEDTLS_HAVE_TIME - * - * System has time.h and time(). - * The time does not need to be correct, only time differences are used, - * by contrast with MBEDTLS_HAVE_TIME_DATE - * - * Comment if your system does not support time functions - */ -#define MBEDTLS_HAVE_TIME - -/** - * \def MBEDTLS_HAVE_TIME_DATE - * - * System has time.h and time(), gmtime() and the clock is correct. - * The time needs to be correct (not necesarily very accurate, but at least - * the date should be correct). This is used to verify the validity period of - * X.509 certificates. - * - * Comment if your system does not have a correct clock. - */ -#define MBEDTLS_HAVE_TIME_DATE - -/** - * \def MBEDTLS_PLATFORM_MEMORY - * - * Enable the memory allocation layer. - * - * By default mbed TLS uses the system-provided calloc() and free(). - * This allows different allocators (self-implemented or provided) to be - * provided to the platform abstraction layer. - * - * Enabling MBEDTLS_PLATFORM_MEMORY without the - * MBEDTLS_PLATFORM_{FREE,CALLOC}_MACROs will provide - * "mbedtls_platform_set_calloc_free()" allowing you to set an alternative calloc() and - * free() function pointer at runtime. - * - * Enabling MBEDTLS_PLATFORM_MEMORY and specifying - * MBEDTLS_PLATFORM_{CALLOC,FREE}_MACROs will allow you to specify the - * alternate function at compile time. - * - * Requires: MBEDTLS_PLATFORM_C - * - * Enable this layer to allow use of alternative memory allocators. - */ -//#define MBEDTLS_PLATFORM_MEMORY - -/** - * \def MBEDTLS_PLATFORM_NO_STD_FUNCTIONS - * - * Do not assign standard functions in the platform layer (e.g. calloc() to - * MBEDTLS_PLATFORM_STD_CALLOC and printf() to MBEDTLS_PLATFORM_STD_PRINTF) - * - * This makes sure there are no linking errors on platforms that do not support - * these functions. You will HAVE to provide alternatives, either at runtime - * via the platform_set_xxx() functions or at compile time by setting - * the MBEDTLS_PLATFORM_STD_XXX defines, or enabling a - * MBEDTLS_PLATFORM_XXX_MACRO. - * - * Requires: MBEDTLS_PLATFORM_C - * - * Uncomment to prevent default assignment of standard functions in the - * platform layer. - */ -//#define MBEDTLS_PLATFORM_NO_STD_FUNCTIONS - -/** - * \def MBEDTLS_PLATFORM_XXX_ALT - * - * Uncomment a macro to let mbed TLS support the function in the platform - * abstraction layer. - * - * Example: In case you uncomment MBEDTLS_PLATFORM_PRINTF_ALT, mbed TLS will - * provide a function "mbedtls_platform_set_printf()" that allows you to set an - * alternative printf function pointer. - * - * All these define require MBEDTLS_PLATFORM_C to be defined! - * - * \note MBEDTLS_PLATFORM_SNPRINTF_ALT is required on Windows; - * it will be enabled automatically by check_config.h - * - * \warning MBEDTLS_PLATFORM_XXX_ALT cannot be defined at the same time as - * MBEDTLS_PLATFORM_XXX_MACRO! - * - * Uncomment a macro to enable alternate implementation of specific base - * platform function - */ -//#define MBEDTLS_PLATFORM_EXIT_ALT -//#define MBEDTLS_PLATFORM_FPRINTF_ALT -//#define MBEDTLS_PLATFORM_PRINTF_ALT -//#define MBEDTLS_PLATFORM_SNPRINTF_ALT - -/** - * \def MBEDTLS_DEPRECATED_WARNING - * - * Mark deprecated functions so that they generate a warning if used. - * Functions deprecated in one version will usually be removed in the next - * version. You can enable this to help you prepare the transition to a new - * major version by making sure your code is not using these functions. - * - * This only works with GCC and Clang. With other compilers, you may want to - * use MBEDTLS_DEPRECATED_REMOVED - * - * Uncomment to get warnings on using deprecated functions. - */ -//#define MBEDTLS_DEPRECATED_WARNING - -/** - * \def MBEDTLS_DEPRECATED_REMOVED - * - * Remove deprecated functions so that they generate an error if used. - * Functions deprecated in one version will usually be removed in the next - * version. You can enable this to help you prepare the transition to a new - * major version by making sure your code is not using these functions. - * - * Uncomment to get errors on using deprecated functions. - */ -//#define MBEDTLS_DEPRECATED_REMOVED - -/* \} name SECTION: System support */ - -/** - * \name SECTION: mbed TLS feature support - * - * This section sets support for features that are or are not needed - * within the modules that are enabled. - * \{ - */ - -/** - * \def MBEDTLS_TIMING_ALT - * - * Uncomment to provide your own alternate implementation for mbedtls_timing_hardclock(), - * mbedtls_timing_get_timer(), mbedtls_set_alarm(), mbedtls_set/get_delay() - * - * Only works if you have MBEDTLS_TIMING_C enabled. - * - * You will need to provide a header "timing_alt.h" and an implementation at - * compile time. - */ -//#define MBEDTLS_TIMING_ALT - -/** - * \def MBEDTLS__MODULE_NAME__ALT - * - * Uncomment a macro to let mbed TLS use your alternate core implementation of - * a symmetric crypto or hash module (e.g. platform specific assembly - * optimized implementations). Keep in mind that the function prototypes - * should remain the same. - * - * This replaces the whole module. If you only want to replace one of the - * functions, use one of the MBEDTLS__FUNCTION_NAME__ALT flags. - * - * Example: In case you uncomment MBEDTLS_AES_ALT, mbed TLS will no longer - * provide the "struct mbedtls_aes_context" definition and omit the base function - * declarations and implementations. "aes_alt.h" will be included from - * "aes.h" to include the new function definitions. - * - * Uncomment a macro to enable alternate implementation of the corresponding - * module. - */ -//#define MBEDTLS_AES_ALT -//#define MBEDTLS_ARC4_ALT -//#define MBEDTLS_BLOWFISH_ALT -//#define MBEDTLS_CAMELLIA_ALT -//#define MBEDTLS_DES_ALT -//#define MBEDTLS_XTEA_ALT -//#define MBEDTLS_MD2_ALT -//#define MBEDTLS_MD4_ALT -//#define MBEDTLS_MD5_ALT -//#define MBEDTLS_RIPEMD160_ALT -//#define MBEDTLS_SHA1_ALT -//#define MBEDTLS_SHA256_ALT -//#define MBEDTLS_SHA512_ALT - -/** - * \def MBEDTLS__FUNCTION_NAME__ALT - * - * Uncomment a macro to let mbed TLS use you alternate core implementation of - * symmetric crypto or hash function. Keep in mind that function prototypes - * should remain the same. - * - * This replaces only one function. The header file from mbed TLS is still - * used, in contrast to the MBEDTLS__MODULE_NAME__ALT flags. - * - * Example: In case you uncomment MBEDTLS_SHA256_PROCESS_ALT, mbed TLS will - * no longer provide the mbedtls_sha1_process() function, but it will still provide - * the other function (using your mbedtls_sha1_process() function) and the definition - * of mbedtls_sha1_context, so your implementation of mbedtls_sha1_process must be compatible - * with this definition. - * - * Note: if you use the AES_xxx_ALT macros, then is is recommended to also set - * MBEDTLS_AES_ROM_TABLES in order to help the linker garbage-collect the AES - * tables. - * - * Uncomment a macro to enable alternate implementation of the corresponding - * function. - */ -//#define MBEDTLS_MD2_PROCESS_ALT -//#define MBEDTLS_MD4_PROCESS_ALT -//#define MBEDTLS_MD5_PROCESS_ALT -//#define MBEDTLS_RIPEMD160_PROCESS_ALT -//#define MBEDTLS_SHA1_PROCESS_ALT -//#define MBEDTLS_SHA256_PROCESS_ALT -//#define MBEDTLS_SHA512_PROCESS_ALT -//#define MBEDTLS_DES_SETKEY_ALT -//#define MBEDTLS_DES_CRYPT_ECB_ALT -//#define MBEDTLS_DES3_CRYPT_ECB_ALT -//#define MBEDTLS_AES_SETKEY_ENC_ALT -//#define MBEDTLS_AES_SETKEY_DEC_ALT -//#define MBEDTLS_AES_ENCRYPT_ALT -//#define MBEDTLS_AES_DECRYPT_ALT - -/** - * \def MBEDTLS_ENTROPY_HARDWARE_ALT - * - * Uncomment this macro to let mbed TLS use your own implementation of a - * hardware entropy collector. - * - * Your function must be called \c mbedtls_hardware_poll(), have the same - * prototype as declared in entropy_poll.h, and accept NULL as first argument. - * - * Uncomment to use your own hardware entropy collector. - */ -//#define MBEDTLS_ENTROPY_HARDWARE_ALT - -/** - * \def MBEDTLS_AES_ROM_TABLES - * - * Store the AES tables in ROM. - * - * Uncomment this macro to store the AES tables in ROM. - */ -//#define MBEDTLS_AES_ROM_TABLES - -/** - * \def MBEDTLS_CAMELLIA_SMALL_MEMORY - * - * Use less ROM for the Camellia implementation (saves about 768 bytes). - * - * Uncomment this macro to use less memory for Camellia. - */ -//#define MBEDTLS_CAMELLIA_SMALL_MEMORY - -/** - * \def MBEDTLS_CIPHER_MODE_CBC - * - * Enable Cipher Block Chaining mode (CBC) for symmetric ciphers. - */ -#define MBEDTLS_CIPHER_MODE_CBC - -/** - * \def MBEDTLS_CIPHER_MODE_CFB - * - * Enable Cipher Feedback mode (CFB) for symmetric ciphers. - */ -#define MBEDTLS_CIPHER_MODE_CFB - -/** - * \def MBEDTLS_CIPHER_MODE_CTR - * - * Enable Counter Block Cipher mode (CTR) for symmetric ciphers. - */ -#define MBEDTLS_CIPHER_MODE_CTR - -/** - * \def MBEDTLS_CIPHER_NULL_CIPHER - * - * Enable NULL cipher. - * Warning: Only do so when you know what you are doing. This allows for - * encryption or channels without any security! - * - * Requires MBEDTLS_ENABLE_WEAK_CIPHERSUITES as well to enable - * the following ciphersuites: - * MBEDTLS_TLS_ECDH_ECDSA_WITH_NULL_SHA - * MBEDTLS_TLS_ECDH_RSA_WITH_NULL_SHA - * MBEDTLS_TLS_ECDHE_ECDSA_WITH_NULL_SHA - * MBEDTLS_TLS_ECDHE_RSA_WITH_NULL_SHA - * MBEDTLS_TLS_ECDHE_PSK_WITH_NULL_SHA384 - * MBEDTLS_TLS_ECDHE_PSK_WITH_NULL_SHA256 - * MBEDTLS_TLS_ECDHE_PSK_WITH_NULL_SHA - * MBEDTLS_TLS_DHE_PSK_WITH_NULL_SHA384 - * MBEDTLS_TLS_DHE_PSK_WITH_NULL_SHA256 - * MBEDTLS_TLS_DHE_PSK_WITH_NULL_SHA - * MBEDTLS_TLS_RSA_WITH_NULL_SHA256 - * MBEDTLS_TLS_RSA_WITH_NULL_SHA - * MBEDTLS_TLS_RSA_WITH_NULL_MD5 - * MBEDTLS_TLS_RSA_PSK_WITH_NULL_SHA384 - * MBEDTLS_TLS_RSA_PSK_WITH_NULL_SHA256 - * MBEDTLS_TLS_RSA_PSK_WITH_NULL_SHA - * MBEDTLS_TLS_PSK_WITH_NULL_SHA384 - * MBEDTLS_TLS_PSK_WITH_NULL_SHA256 - * MBEDTLS_TLS_PSK_WITH_NULL_SHA - * - * Uncomment this macro to enable the NULL cipher and ciphersuites - */ -//#define MBEDTLS_CIPHER_NULL_CIPHER - -/** - * \def MBEDTLS_CIPHER_PADDING_XXX - * - * Uncomment or comment macros to add support for specific padding modes - * in the cipher layer with cipher modes that support padding (e.g. CBC) - * - * If you disable all padding modes, only full blocks can be used with CBC. - * - * Enable padding modes in the cipher layer. - */ -#define MBEDTLS_CIPHER_PADDING_PKCS7 -#define MBEDTLS_CIPHER_PADDING_ONE_AND_ZEROS -#define MBEDTLS_CIPHER_PADDING_ZEROS_AND_LEN -#define MBEDTLS_CIPHER_PADDING_ZEROS - -/** - * \def MBEDTLS_ENABLE_WEAK_CIPHERSUITES - * - * Enable weak ciphersuites in SSL / TLS. - * Warning: Only do so when you know what you are doing. This allows for - * channels with virtually no security at all! - * - * This enables the following ciphersuites: - * MBEDTLS_TLS_RSA_WITH_DES_CBC_SHA - * MBEDTLS_TLS_DHE_RSA_WITH_DES_CBC_SHA - * - * Uncomment this macro to enable weak ciphersuites - */ -//#define MBEDTLS_ENABLE_WEAK_CIPHERSUITES - -/** - * \def MBEDTLS_REMOVE_ARC4_CIPHERSUITES - * - * Remove RC4 ciphersuites by default in SSL / TLS. - * This flag removes the ciphersuites based on RC4 from the default list as - * returned by mbedtls_ssl_list_ciphersuites(). However, it is still possible to - * enable (some of) them with mbedtls_ssl_conf_ciphersuites() by including them - * explicitly. - * - * Uncomment this macro to remove RC4 ciphersuites by default. - */ -#define MBEDTLS_REMOVE_ARC4_CIPHERSUITES - -/** - * \def MBEDTLS_ECP_XXXX_ENABLED - * - * Enables specific curves within the Elliptic Curve module. - * By default all supported curves are enabled. - * - * Comment macros to disable the curve and functions for it - */ -#define MBEDTLS_ECP_DP_SECP192R1_ENABLED -#define MBEDTLS_ECP_DP_SECP224R1_ENABLED -#define MBEDTLS_ECP_DP_SECP256R1_ENABLED -#define MBEDTLS_ECP_DP_SECP384R1_ENABLED -#define MBEDTLS_ECP_DP_SECP521R1_ENABLED -#define MBEDTLS_ECP_DP_SECP192K1_ENABLED -#define MBEDTLS_ECP_DP_SECP224K1_ENABLED -#define MBEDTLS_ECP_DP_SECP256K1_ENABLED -#define MBEDTLS_ECP_DP_BP256R1_ENABLED -#define MBEDTLS_ECP_DP_BP384R1_ENABLED -#define MBEDTLS_ECP_DP_BP512R1_ENABLED -#define MBEDTLS_ECP_DP_CURVE25519_ENABLED - -/** - * \def MBEDTLS_ECP_NIST_OPTIM - * - * Enable specific 'modulo p' routines for each NIST prime. - * Depending on the prime and architecture, makes operations 4 to 8 times - * faster on the corresponding curve. - * - * Comment this macro to disable NIST curves optimisation. - */ -#define MBEDTLS_ECP_NIST_OPTIM - -/** - * \def MBEDTLS_ECDSA_DETERMINISTIC - * - * Enable deterministic ECDSA (RFC 6979). - * Standard ECDSA is "fragile" in the sense that lack of entropy when signing - * may result in a compromise of the long-term signing key. This is avoided by - * the deterministic variant. - * - * Requires: MBEDTLS_HMAC_DRBG_C - * - * Comment this macro to disable deterministic ECDSA. - */ -#define MBEDTLS_ECDSA_DETERMINISTIC - -/** - * \def MBEDTLS_KEY_EXCHANGE_PSK_ENABLED - * - * Enable the PSK based ciphersuite modes in SSL / TLS. - * - * This enables the following ciphersuites (if other requisites are - * enabled as well): - * MBEDTLS_TLS_PSK_WITH_AES_256_GCM_SHA384 - * MBEDTLS_TLS_PSK_WITH_AES_256_CBC_SHA384 - * MBEDTLS_TLS_PSK_WITH_AES_256_CBC_SHA - * MBEDTLS_TLS_PSK_WITH_CAMELLIA_256_GCM_SHA384 - * MBEDTLS_TLS_PSK_WITH_CAMELLIA_256_CBC_SHA384 - * MBEDTLS_TLS_PSK_WITH_AES_128_GCM_SHA256 - * MBEDTLS_TLS_PSK_WITH_AES_128_CBC_SHA256 - * MBEDTLS_TLS_PSK_WITH_AES_128_CBC_SHA - * MBEDTLS_TLS_PSK_WITH_CAMELLIA_128_GCM_SHA256 - * MBEDTLS_TLS_PSK_WITH_CAMELLIA_128_CBC_SHA256 - * MBEDTLS_TLS_PSK_WITH_3DES_EDE_CBC_SHA - * MBEDTLS_TLS_PSK_WITH_RC4_128_SHA - */ -#define MBEDTLS_KEY_EXCHANGE_PSK_ENABLED - -/** - * \def MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED - * - * Enable the DHE-PSK based ciphersuite modes in SSL / TLS. - * - * Requires: MBEDTLS_DHM_C - * - * This enables the following ciphersuites (if other requisites are - * enabled as well): - * MBEDTLS_TLS_DHE_PSK_WITH_AES_256_GCM_SHA384 - * MBEDTLS_TLS_DHE_PSK_WITH_AES_256_CBC_SHA384 - * MBEDTLS_TLS_DHE_PSK_WITH_AES_256_CBC_SHA - * MBEDTLS_TLS_DHE_PSK_WITH_CAMELLIA_256_GCM_SHA384 - * MBEDTLS_TLS_DHE_PSK_WITH_CAMELLIA_256_CBC_SHA384 - * MBEDTLS_TLS_DHE_PSK_WITH_AES_128_GCM_SHA256 - * MBEDTLS_TLS_DHE_PSK_WITH_AES_128_CBC_SHA256 - * MBEDTLS_TLS_DHE_PSK_WITH_AES_128_CBC_SHA - * MBEDTLS_TLS_DHE_PSK_WITH_CAMELLIA_128_GCM_SHA256 - * MBEDTLS_TLS_DHE_PSK_WITH_CAMELLIA_128_CBC_SHA256 - * MBEDTLS_TLS_DHE_PSK_WITH_3DES_EDE_CBC_SHA - * MBEDTLS_TLS_DHE_PSK_WITH_RC4_128_SHA - */ -#define MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED - -/** - * \def MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED - * - * Enable the ECDHE-PSK based ciphersuite modes in SSL / TLS. - * - * Requires: MBEDTLS_ECDH_C - * - * This enables the following ciphersuites (if other requisites are - * enabled as well): - * MBEDTLS_TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA384 - * MBEDTLS_TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA - * MBEDTLS_TLS_ECDHE_PSK_WITH_CAMELLIA_256_CBC_SHA384 - * MBEDTLS_TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256 - * MBEDTLS_TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA - * MBEDTLS_TLS_ECDHE_PSK_WITH_CAMELLIA_128_CBC_SHA256 - * MBEDTLS_TLS_ECDHE_PSK_WITH_3DES_EDE_CBC_SHA - * MBEDTLS_TLS_ECDHE_PSK_WITH_RC4_128_SHA - */ -#define MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED - -/** - * \def MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED - * - * Enable the RSA-PSK based ciphersuite modes in SSL / TLS. - * - * Requires: MBEDTLS_RSA_C, MBEDTLS_PKCS1_V15, - * MBEDTLS_X509_CRT_PARSE_C - * - * This enables the following ciphersuites (if other requisites are - * enabled as well): - * MBEDTLS_TLS_RSA_PSK_WITH_AES_256_GCM_SHA384 - * MBEDTLS_TLS_RSA_PSK_WITH_AES_256_CBC_SHA384 - * MBEDTLS_TLS_RSA_PSK_WITH_AES_256_CBC_SHA - * MBEDTLS_TLS_RSA_PSK_WITH_CAMELLIA_256_GCM_SHA384 - * MBEDTLS_TLS_RSA_PSK_WITH_CAMELLIA_256_CBC_SHA384 - * MBEDTLS_TLS_RSA_PSK_WITH_AES_128_GCM_SHA256 - * MBEDTLS_TLS_RSA_PSK_WITH_AES_128_CBC_SHA256 - * MBEDTLS_TLS_RSA_PSK_WITH_AES_128_CBC_SHA - * MBEDTLS_TLS_RSA_PSK_WITH_CAMELLIA_128_GCM_SHA256 - * MBEDTLS_TLS_RSA_PSK_WITH_CAMELLIA_128_CBC_SHA256 - * MBEDTLS_TLS_RSA_PSK_WITH_3DES_EDE_CBC_SHA - * MBEDTLS_TLS_RSA_PSK_WITH_RC4_128_SHA - */ -#define MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED - -/** - * \def MBEDTLS_KEY_EXCHANGE_RSA_ENABLED - * - * Enable the RSA-only based ciphersuite modes in SSL / TLS. - * - * Requires: MBEDTLS_RSA_C, MBEDTLS_PKCS1_V15, - * MBEDTLS_X509_CRT_PARSE_C - * - * This enables the following ciphersuites (if other requisites are - * enabled as well): - * MBEDTLS_TLS_RSA_WITH_AES_256_GCM_SHA384 - * MBEDTLS_TLS_RSA_WITH_AES_256_CBC_SHA256 - * MBEDTLS_TLS_RSA_WITH_AES_256_CBC_SHA - * MBEDTLS_TLS_RSA_WITH_CAMELLIA_256_GCM_SHA384 - * MBEDTLS_TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256 - * MBEDTLS_TLS_RSA_WITH_CAMELLIA_256_CBC_SHA - * MBEDTLS_TLS_RSA_WITH_AES_128_GCM_SHA256 - * MBEDTLS_TLS_RSA_WITH_AES_128_CBC_SHA256 - * MBEDTLS_TLS_RSA_WITH_AES_128_CBC_SHA - * MBEDTLS_TLS_RSA_WITH_CAMELLIA_128_GCM_SHA256 - * MBEDTLS_TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256 - * MBEDTLS_TLS_RSA_WITH_CAMELLIA_128_CBC_SHA - * MBEDTLS_TLS_RSA_WITH_3DES_EDE_CBC_SHA - * MBEDTLS_TLS_RSA_WITH_RC4_128_SHA - * MBEDTLS_TLS_RSA_WITH_RC4_128_MD5 - */ -#define MBEDTLS_KEY_EXCHANGE_RSA_ENABLED - -/** - * \def MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED - * - * Enable the DHE-RSA based ciphersuite modes in SSL / TLS. - * - * Requires: MBEDTLS_DHM_C, MBEDTLS_RSA_C, MBEDTLS_PKCS1_V15, - * MBEDTLS_X509_CRT_PARSE_C - * - * This enables the following ciphersuites (if other requisites are - * enabled as well): - * MBEDTLS_TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 - * MBEDTLS_TLS_DHE_RSA_WITH_AES_256_CBC_SHA256 - * MBEDTLS_TLS_DHE_RSA_WITH_AES_256_CBC_SHA - * MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_256_GCM_SHA384 - * MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256 - * MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA - * MBEDTLS_TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 - * MBEDTLS_TLS_DHE_RSA_WITH_AES_128_CBC_SHA256 - * MBEDTLS_TLS_DHE_RSA_WITH_AES_128_CBC_SHA - * MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_128_GCM_SHA256 - * MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256 - * MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA - * MBEDTLS_TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA - */ -#define MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED - -/** - * \def MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED - * - * Enable the ECDHE-RSA based ciphersuite modes in SSL / TLS. - * - * Requires: MBEDTLS_ECDH_C, MBEDTLS_RSA_C, MBEDTLS_PKCS1_V15, - * MBEDTLS_X509_CRT_PARSE_C - * - * This enables the following ciphersuites (if other requisites are - * enabled as well): - * MBEDTLS_TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 - * MBEDTLS_TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 - * MBEDTLS_TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA - * MBEDTLS_TLS_ECDHE_RSA_WITH_CAMELLIA_256_GCM_SHA384 - * MBEDTLS_TLS_ECDHE_RSA_WITH_CAMELLIA_256_CBC_SHA384 - * MBEDTLS_TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 - * MBEDTLS_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 - * MBEDTLS_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA - * MBEDTLS_TLS_ECDHE_RSA_WITH_CAMELLIA_128_GCM_SHA256 - * MBEDTLS_TLS_ECDHE_RSA_WITH_CAMELLIA_128_CBC_SHA256 - * MBEDTLS_TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA - * MBEDTLS_TLS_ECDHE_RSA_WITH_RC4_128_SHA - */ -#define MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED - -/** - * \def MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED - * - * Enable the ECDHE-ECDSA based ciphersuite modes in SSL / TLS. - * - * Requires: MBEDTLS_ECDH_C, MBEDTLS_ECDSA_C, MBEDTLS_X509_CRT_PARSE_C, - * - * This enables the following ciphersuites (if other requisites are - * enabled as well): - * MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 - * MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384 - * MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA - * MBEDTLS_TLS_ECDHE_ECDSA_WITH_CAMELLIA_256_GCM_SHA384 - * MBEDTLS_TLS_ECDHE_ECDSA_WITH_CAMELLIA_256_CBC_SHA384 - * MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 - * MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 - * MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA - * MBEDTLS_TLS_ECDHE_ECDSA_WITH_CAMELLIA_128_GCM_SHA256 - * MBEDTLS_TLS_ECDHE_ECDSA_WITH_CAMELLIA_128_CBC_SHA256 - * MBEDTLS_TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA - * MBEDTLS_TLS_ECDHE_ECDSA_WITH_RC4_128_SHA - */ -#define MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED - -/** - * \def MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED - * - * Enable the ECDH-ECDSA based ciphersuite modes in SSL / TLS. - * - * Requires: MBEDTLS_ECDH_C, MBEDTLS_X509_CRT_PARSE_C - * - * This enables the following ciphersuites (if other requisites are - * enabled as well): - * MBEDTLS_TLS_ECDH_ECDSA_WITH_RC4_128_SHA - * MBEDTLS_TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA - * MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA - * MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA - * MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256 - * MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384 - * MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256 - * MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384 - * MBEDTLS_TLS_ECDH_ECDSA_WITH_CAMELLIA_128_CBC_SHA256 - * MBEDTLS_TLS_ECDH_ECDSA_WITH_CAMELLIA_256_CBC_SHA384 - * MBEDTLS_TLS_ECDH_ECDSA_WITH_CAMELLIA_128_GCM_SHA256 - * MBEDTLS_TLS_ECDH_ECDSA_WITH_CAMELLIA_256_GCM_SHA384 - */ -#define MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED - -/** - * \def MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED - * - * Enable the ECDH-RSA based ciphersuite modes in SSL / TLS. - * - * Requires: MBEDTLS_ECDH_C, MBEDTLS_X509_CRT_PARSE_C - * - * This enables the following ciphersuites (if other requisites are - * enabled as well): - * MBEDTLS_TLS_ECDH_RSA_WITH_RC4_128_SHA - * MBEDTLS_TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA - * MBEDTLS_TLS_ECDH_RSA_WITH_AES_128_CBC_SHA - * MBEDTLS_TLS_ECDH_RSA_WITH_AES_256_CBC_SHA - * MBEDTLS_TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256 - * MBEDTLS_TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384 - * MBEDTLS_TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256 - * MBEDTLS_TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384 - * MBEDTLS_TLS_ECDH_RSA_WITH_CAMELLIA_128_CBC_SHA256 - * MBEDTLS_TLS_ECDH_RSA_WITH_CAMELLIA_256_CBC_SHA384 - * MBEDTLS_TLS_ECDH_RSA_WITH_CAMELLIA_128_GCM_SHA256 - * MBEDTLS_TLS_ECDH_RSA_WITH_CAMELLIA_256_GCM_SHA384 - */ -#define MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED - -/** - * \def MBEDTLS_PK_PARSE_EC_EXTENDED - * - * Enhance support for reading EC keys using variants of SEC1 not allowed by - * RFC 5915 and RFC 5480. - * - * Currently this means parsing the SpecifiedECDomain choice of EC - * parameters (only known groups are supported, not arbitrary domains, to - * avoid validation issues). - * - * Disable if you only need to support RFC 5915 + 5480 key formats. - */ -#define MBEDTLS_PK_PARSE_EC_EXTENDED - -/** - * \def MBEDTLS_ERROR_STRERROR_DUMMY - * - * Enable a dummy error function to make use of mbedtls_strerror() in - * third party libraries easier when MBEDTLS_ERROR_C is disabled - * (no effect when MBEDTLS_ERROR_C is enabled). - * - * You can safely disable this if MBEDTLS_ERROR_C is enabled, or if you're - * not using mbedtls_strerror() or error_strerror() in your application. - * - * Disable if you run into name conflicts and want to really remove the - * mbedtls_strerror() - */ -#define MBEDTLS_ERROR_STRERROR_DUMMY - -/** - * \def MBEDTLS_GENPRIME - * - * Enable the prime-number generation code. - * - * Requires: MBEDTLS_BIGNUM_C - */ -#define MBEDTLS_GENPRIME - -/** - * \def MBEDTLS_FS_IO - * - * Enable functions that use the filesystem. - */ -#define MBEDTLS_FS_IO - -/** - * \def MBEDTLS_NO_DEFAULT_ENTROPY_SOURCES - * - * Do not add default entropy sources. These are the platform specific, - * mbedtls_timing_hardclock and HAVEGE based poll functions. - * - * This is useful to have more control over the added entropy sources in an - * application. - * - * Uncomment this macro to prevent loading of default entropy functions. - */ -//#define MBEDTLS_NO_DEFAULT_ENTROPY_SOURCES - -/** - * \def MBEDTLS_NO_PLATFORM_ENTROPY - * - * Do not use built-in platform entropy functions. - * This is useful if your platform does not support - * standards like the /dev/urandom or Windows CryptoAPI. - * - * Uncomment this macro to disable the built-in platform entropy functions. - */ -//#define MBEDTLS_NO_PLATFORM_ENTROPY - -/** - * \def MBEDTLS_ENTROPY_FORCE_SHA256 - * - * Force the entropy accumulator to use a SHA-256 accumulator instead of the - * default SHA-512 based one (if both are available). - * - * Requires: MBEDTLS_SHA256_C - * - * On 32-bit systems SHA-256 can be much faster than SHA-512. Use this option - * if you have performance concerns. - * - * This option is only useful if both MBEDTLS_SHA256_C and - * MBEDTLS_SHA512_C are defined. Otherwise the available hash module is used. - */ -//#define MBEDTLS_ENTROPY_FORCE_SHA256 - -/** - * \def MBEDTLS_MEMORY_DEBUG - * - * Enable debugging of buffer allocator memory issues. Automatically prints - * (to stderr) all (fatal) messages on memory allocation issues. Enables - * function for 'debug output' of allocated memory. - * - * Requires: MBEDTLS_MEMORY_BUFFER_ALLOC_C - * - * Uncomment this macro to let the buffer allocator print out error messages. - */ -//#define MBEDTLS_MEMORY_DEBUG - -/** - * \def MBEDTLS_MEMORY_BACKTRACE - * - * Include backtrace information with each allocated block. - * - * Requires: MBEDTLS_MEMORY_BUFFER_ALLOC_C - * GLIBC-compatible backtrace() an backtrace_symbols() support - * - * Uncomment this macro to include backtrace information - */ -//#define MBEDTLS_MEMORY_BACKTRACE - -/** - * \def MBEDTLS_PK_RSA_ALT_SUPPORT - * - * Support external private RSA keys (eg from a HSM) in the PK layer. - * - * Comment this macro to disable support for external private RSA keys. - */ -#define MBEDTLS_PK_RSA_ALT_SUPPORT - -/** - * \def MBEDTLS_PKCS1_V15 - * - * Enable support for PKCS#1 v1.5 encoding. - * - * Requires: MBEDTLS_RSA_C - * - * This enables support for PKCS#1 v1.5 operations. - */ -#define MBEDTLS_PKCS1_V15 - -/** - * \def MBEDTLS_PKCS1_V21 - * - * Enable support for PKCS#1 v2.1 encoding. - * - * Requires: MBEDTLS_MD_C, MBEDTLS_RSA_C - * - * This enables support for RSAES-OAEP and RSASSA-PSS operations. - */ -#define MBEDTLS_PKCS1_V21 - -/** - * \def MBEDTLS_RSA_NO_CRT - * - * Do not use the Chinese Remainder Theorem for the RSA private operation. - * - * Uncomment this macro to disable the use of CRT in RSA. - * - */ -//#define MBEDTLS_RSA_NO_CRT - -/** - * \def MBEDTLS_SELF_TEST - * - * Enable the checkup functions (*_self_test). - */ -#define MBEDTLS_SELF_TEST - -/** - * \def MBEDTLS_SHA256_SMALLER - * - * Enable an implementation of SHA-256 that has lower ROM footprint but also - * lower performance. - * - * The default implementation is meant to be a reasonnable compromise between - * performance and size. This version optimizes more aggressively for size at - * the expense of performance. Eg on Cortex-M4 it reduces the size of - * mbedtls_sha256_process() from ~2KB to ~0.5KB for a performance hit of about - * 30%. - * - * Uncomment to enable the smaller implementation of SHA256. - */ -//#define MBEDTLS_SHA256_SMALLER - -/** - * \def MBEDTLS_SSL_AEAD_RANDOM_IV - * - * Generate a random IV rather than using the record sequence number as a - * nonce for ciphersuites using and AEAD algorithm (GCM or CCM). - * - * Using the sequence number is generally recommended. - * - * Uncomment this macro to always use random IVs with AEAD ciphersuites. - */ -//#define MBEDTLS_SSL_AEAD_RANDOM_IV - -/** - * \def MBEDTLS_SSL_ALL_ALERT_MESSAGES - * - * Enable sending of alert messages in case of encountered errors as per RFC. - * If you choose not to send the alert messages, mbed TLS can still communicate - * with other servers, only debugging of failures is harder. - * - * The advantage of not sending alert messages, is that no information is given - * about reasons for failures thus preventing adversaries of gaining intel. - * - * Enable sending of all alert messages - */ -#define MBEDTLS_SSL_ALL_ALERT_MESSAGES - -/** - * \def MBEDTLS_SSL_DEBUG_ALL - * - * Enable the debug messages in SSL module for all issues. - * Debug messages have been disabled in some places to prevent timing - * attacks due to (unbalanced) debugging function calls. - * - * If you need all error reporting you should enable this during debugging, - * but remove this for production servers that should log as well. - * - * Uncomment this macro to report all debug messages on errors introducing - * a timing side-channel. - * - */ -//#define MBEDTLS_SSL_DEBUG_ALL - -/** \def MBEDTLS_SSL_ENCRYPT_THEN_MAC - * - * Enable support for Encrypt-then-MAC, RFC 7366. - * - * This allows peers that both support it to use a more robust protection for - * ciphersuites using CBC, providing deep resistance against timing attacks - * on the padding or underlying cipher. - * - * This only affects CBC ciphersuites, and is useless if none is defined. - * - * Requires: MBEDTLS_SSL_PROTO_TLS1 or - * MBEDTLS_SSL_PROTO_TLS1_1 or - * MBEDTLS_SSL_PROTO_TLS1_2 - * - * Comment this macro to disable support for Encrypt-then-MAC - */ -#define MBEDTLS_SSL_ENCRYPT_THEN_MAC - -/** \def MBEDTLS_SSL_EXTENDED_MASTER_SECRET - * - * Enable support for Extended Master Secret, aka Session Hash - * (draft-ietf-tls-session-hash-02). - * - * This was introduced as "the proper fix" to the Triple Handshake familiy of - * attacks, but it is recommended to always use it (even if you disable - * renegotiation), since it actually fixes a more fundamental issue in the - * original SSL/TLS design, and has implications beyond Triple Handshake. - * - * Requires: MBEDTLS_SSL_PROTO_TLS1 or - * MBEDTLS_SSL_PROTO_TLS1_1 or - * MBEDTLS_SSL_PROTO_TLS1_2 - * - * Comment this macro to disable support for Extended Master Secret. - */ -#define MBEDTLS_SSL_EXTENDED_MASTER_SECRET - -/** - * \def MBEDTLS_SSL_FALLBACK_SCSV - * - * Enable support for FALLBACK_SCSV (draft-ietf-tls-downgrade-scsv-00). - * - * For servers, it is recommended to always enable this, unless you support - * only one version of TLS, or know for sure that none of your clients - * implements a fallback strategy. - * - * For clients, you only need this if you're using a fallback strategy, which - * is not recommended in the first place, unless you absolutely need it to - * interoperate with buggy (version-intolerant) servers. - * - * Comment this macro to disable support for FALLBACK_SCSV - */ -#define MBEDTLS_SSL_FALLBACK_SCSV - -/** - * \def MBEDTLS_SSL_HW_RECORD_ACCEL - * - * Enable hooking functions in SSL module for hardware acceleration of - * individual records. - * - * Uncomment this macro to enable hooking functions. - */ -//#define MBEDTLS_SSL_HW_RECORD_ACCEL - -/** - * \def MBEDTLS_SSL_CBC_RECORD_SPLITTING - * - * Enable 1/n-1 record splitting for CBC mode in SSLv3 and TLS 1.0. - * - * This is a countermeasure to the BEAST attack, which also minimizes the risk - * of interoperability issues compared to sending 0-length records. - * - * Comment this macro to disable 1/n-1 record splitting. - */ -#define MBEDTLS_SSL_CBC_RECORD_SPLITTING - -/** - * \def MBEDTLS_SSL_RENEGOTIATION - * - * Disable support for TLS renegotiation. - * - * The two main uses of renegotiation are (1) refresh keys on long-lived - * connections and (2) client authentication after the initial handshake. - * If you don't need renegotiation, it's probably better to disable it, since - * it has been associated with security issues in the past and is easy to - * misuse/misunderstand. - * - * Comment this to disable support for renegotiation. - */ -#define MBEDTLS_SSL_RENEGOTIATION - -/** - * \def MBEDTLS_SSL_SRV_SUPPORT_SSLV2_CLIENT_HELLO - * - * Enable support for receiving and parsing SSLv2 Client Hello messages for the - * SSL Server module (MBEDTLS_SSL_SRV_C). - * - * Uncomment this macro to enable support for SSLv2 Client Hello messages. - */ -//#define MBEDTLS_SSL_SRV_SUPPORT_SSLV2_CLIENT_HELLO - -/** - * \def MBEDTLS_SSL_SRV_RESPECT_CLIENT_PREFERENCE - * - * Pick the ciphersuite according to the client's preferences rather than ours - * in the SSL Server module (MBEDTLS_SSL_SRV_C). - * - * Uncomment this macro to respect client's ciphersuite order - */ -//#define MBEDTLS_SSL_SRV_RESPECT_CLIENT_PREFERENCE - -/** - * \def MBEDTLS_SSL_MAX_FRAGMENT_LENGTH - * - * Enable support for RFC 6066 max_fragment_length extension in SSL. - * - * Comment this macro to disable support for the max_fragment_length extension - */ -#define MBEDTLS_SSL_MAX_FRAGMENT_LENGTH - -/** - * \def MBEDTLS_SSL_PROTO_SSL3 - * - * Enable support for SSL 3.0. - * - * Requires: MBEDTLS_MD5_C - * MBEDTLS_SHA1_C - * - * Comment this macro to disable support for SSL 3.0 - */ -#define MBEDTLS_SSL_PROTO_SSL3 - -/** - * \def MBEDTLS_SSL_PROTO_TLS1 - * - * Enable support for TLS 1.0. - * - * Requires: MBEDTLS_MD5_C - * MBEDTLS_SHA1_C - * - * Comment this macro to disable support for TLS 1.0 - */ -#define MBEDTLS_SSL_PROTO_TLS1 - -/** - * \def MBEDTLS_SSL_PROTO_TLS1_1 - * - * Enable support for TLS 1.1 (and DTLS 1.0 if DTLS is enabled). - * - * Requires: MBEDTLS_MD5_C - * MBEDTLS_SHA1_C - * - * Comment this macro to disable support for TLS 1.1 / DTLS 1.0 - */ -#define MBEDTLS_SSL_PROTO_TLS1_1 - -/** - * \def MBEDTLS_SSL_PROTO_TLS1_2 - * - * Enable support for TLS 1.2 (and DTLS 1.2 if DTLS is enabled). - * - * Requires: MBEDTLS_SHA1_C or MBEDTLS_SHA256_C or MBEDTLS_SHA512_C - * (Depends on ciphersuites) - * - * Comment this macro to disable support for TLS 1.2 / DTLS 1.2 - */ -#define MBEDTLS_SSL_PROTO_TLS1_2 - -/** - * \def MBEDTLS_SSL_PROTO_DTLS - * - * Enable support for DTLS (all available versions). - * - * Enable this and MBEDTLS_SSL_PROTO_TLS1_1 to enable DTLS 1.0, - * and/or this and MBEDTLS_SSL_PROTO_TLS1_2 to enable DTLS 1.2. - * - * Requires: MBEDTLS_SSL_PROTO_TLS1_1 - * or MBEDTLS_SSL_PROTO_TLS1_2 - * - * Comment this macro to disable support for DTLS - */ -#define MBEDTLS_SSL_PROTO_DTLS - -/** - * \def MBEDTLS_SSL_ALPN - * - * Enable support for RFC 7301 Application Layer Protocol Negotiation. - * - * Comment this macro to disable support for ALPN. - */ -#define MBEDTLS_SSL_ALPN - -/** - * \def MBEDTLS_SSL_DTLS_ANTI_REPLAY - * - * Enable support for the anti-replay mechanism in DTLS. - * - * Requires: MBEDTLS_SSL_TLS_C - * MBEDTLS_SSL_PROTO_DTLS - * - * \warning Disabling this is often a security risk! - * See mbedtls_ssl_conf_dtls_anti_replay() for details. - * - * Comment this to disable anti-replay in DTLS. - */ -#define MBEDTLS_SSL_DTLS_ANTI_REPLAY - -/** - * \def MBEDTLS_SSL_DTLS_HELLO_VERIFY - * - * Enable support for HelloVerifyRequest on DTLS servers. - * - * This feature is highly recommended to prevent DTLS servers being used as - * amplifiers in DoS attacks against other hosts. It should always be enabled - * unless you know for sure amplification cannot be a problem in the - * environment in which your server operates. - * - * \warning Disabling this can ba a security risk! (see above) - * - * Requires: MBEDTLS_SSL_PROTO_DTLS - * - * Comment this to disable support for HelloVerifyRequest. - */ -#define MBEDTLS_SSL_DTLS_HELLO_VERIFY - -/** - * \def MBEDTLS_SSL_DTLS_CLIENT_PORT_REUSE - * - * Enable server-side support for clients that reconnect from the same port. - * - * Some clients unexpectedly close the connection and try to reconnect using the - * same source port. This needs special support from the server to handle the - * new connection securely, as described in section 4.2.8 of RFC 6347. This - * flag enables that support. - * - * Requires: MBEDTLS_SSL_DTLS_HELLO_VERIFY - * - * Comment this to disable support for clients reusing the source port. - */ -#define MBEDTLS_SSL_DTLS_CLIENT_PORT_REUSE - -/** - * \def MBEDTLS_SSL_DTLS_BADMAC_LIMIT - * - * Enable support for a limit of records with bad MAC. - * - * See mbedtls_ssl_conf_dtls_badmac_limit(). - * - * Requires: MBEDTLS_SSL_PROTO_DTLS - */ -#define MBEDTLS_SSL_DTLS_BADMAC_LIMIT - -/** - * \def MBEDTLS_SSL_SESSION_TICKETS - * - * Enable support for RFC 5077 session tickets in SSL. - * Client-side, provides full support for session tickets (maintainance of a - * session store remains the responsibility of the application, though). - * Server-side, you also need to provide callbacks for writing and parsing - * tickets, including authenticated encryption and key management. Example - * callbacks are provided by MBEDTLS_SSL_TICKET_C. - * - * Comment this macro to disable support for SSL session tickets - */ -#define MBEDTLS_SSL_SESSION_TICKETS - -/** - * \def MBEDTLS_SSL_SERVER_NAME_INDICATION - * - * Enable support for RFC 6066 server name indication (SNI) in SSL. - * - * Requires: MBEDTLS_X509_CRT_PARSE_C - * - * Comment this macro to disable support for server name indication in SSL - */ -#define MBEDTLS_SSL_SERVER_NAME_INDICATION - -/** - * \def MBEDTLS_SSL_TRUNCATED_HMAC - * - * Enable support for RFC 6066 truncated HMAC in SSL. - * - * Comment this macro to disable support for truncated HMAC in SSL - */ -#define MBEDTLS_SSL_TRUNCATED_HMAC - -/** - * \def MBEDTLS_THREADING_ALT - * - * Provide your own alternate threading implementation. - * - * Requires: MBEDTLS_THREADING_C - * - * Uncomment this to allow your own alternate threading implementation. - */ -//#define MBEDTLS_THREADING_ALT - -/** - * \def MBEDTLS_THREADING_PTHREAD - * - * Enable the pthread wrapper layer for the threading layer. - * - * Requires: MBEDTLS_THREADING_C - * - * Uncomment this to enable pthread mutexes. - */ -//#define MBEDTLS_THREADING_PTHREAD - -/** - * \def MBEDTLS_VERSION_FEATURES - * - * Allow run-time checking of compile-time enabled features. Thus allowing users - * to check at run-time if the library is for instance compiled with threading - * support via mbedtls_version_check_feature(). - * - * Requires: MBEDTLS_VERSION_C - * - * Comment this to disable run-time checking and save ROM space - */ -#define MBEDTLS_VERSION_FEATURES - -/** - * \def MBEDTLS_X509_ALLOW_EXTENSIONS_NON_V3 - * - * If set, the X509 parser will not break-off when parsing an X509 certificate - * and encountering an extension in a v1 or v2 certificate. - * - * Uncomment to prevent an error. - */ -//#define MBEDTLS_X509_ALLOW_EXTENSIONS_NON_V3 - -/** - * \def MBEDTLS_X509_ALLOW_UNSUPPORTED_CRITICAL_EXTENSION - * - * If set, the X509 parser will not break-off when parsing an X509 certificate - * and encountering an unknown critical extension. - * - * \warning Depending on your PKI use, enabling this can be a security risk! - * - * Uncomment to prevent an error. - */ -//#define MBEDTLS_X509_ALLOW_UNSUPPORTED_CRITICAL_EXTENSION - -/** - * \def MBEDTLS_X509_CHECK_KEY_USAGE - * - * Enable verification of the keyUsage extension (CA and leaf certificates). - * - * Disabling this avoids problems with mis-issued and/or misused - * (intermediate) CA and leaf certificates. - * - * \warning Depending on your PKI use, disabling this can be a security risk! - * - * Comment to skip keyUsage checking for both CA and leaf certificates. - */ -#define MBEDTLS_X509_CHECK_KEY_USAGE - -/** - * \def MBEDTLS_X509_CHECK_EXTENDED_KEY_USAGE - * - * Enable verification of the extendedKeyUsage extension (leaf certificates). - * - * Disabling this avoids problems with mis-issued and/or misused certificates. - * - * \warning Depending on your PKI use, disabling this can be a security risk! - * - * Comment to skip extendedKeyUsage checking for certificates. - */ -#define MBEDTLS_X509_CHECK_EXTENDED_KEY_USAGE - -/** - * \def MBEDTLS_X509_RSASSA_PSS_SUPPORT - * - * Enable parsing and verification of X.509 certificates, CRLs and CSRS - * signed with RSASSA-PSS (aka PKCS#1 v2.1). - * - * Comment this macro to disallow using RSASSA-PSS in certificates. - */ -#define MBEDTLS_X509_RSASSA_PSS_SUPPORT - -/** - * \def MBEDTLS_ZLIB_SUPPORT - * - * If set, the SSL/TLS module uses ZLIB to support compression and - * decompression of packet data. - * - * \warning TLS-level compression MAY REDUCE SECURITY! See for example the - * CRIME attack. Before enabling this option, you should examine with care if - * CRIME or similar exploits may be a applicable to your use case. - * - * \note Currently compression can't be used with DTLS. - * - * Used in: library/ssl_tls.c - * library/ssl_cli.c - * library/ssl_srv.c - * - * This feature requires zlib library and headers to be present. - * - * Uncomment to enable use of ZLIB - */ -//#define MBEDTLS_ZLIB_SUPPORT -/* \} name SECTION: mbed TLS feature support */ - -/** - * \name SECTION: mbed TLS modules - * - * This section enables or disables entire modules in mbed TLS - * \{ - */ - -/** - * \def MBEDTLS_AESNI_C - * - * Enable AES-NI support on x86-64. - * - * Module: library/aesni.c - * Caller: library/aes.c - * - * Requires: MBEDTLS_HAVE_ASM - * - * This modules adds support for the AES-NI instructions on x86-64 - */ -#define MBEDTLS_AESNI_C - -/** - * \def MBEDTLS_AES_C - * - * Enable the AES block cipher. - * - * Module: library/aes.c - * Caller: library/ssl_tls.c - * library/pem.c - * library/ctr_drbg.c - * - * This module enables the following ciphersuites (if other requisites are - * enabled as well): - * MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA - * MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA - * MBEDTLS_TLS_ECDH_RSA_WITH_AES_128_CBC_SHA - * MBEDTLS_TLS_ECDH_RSA_WITH_AES_256_CBC_SHA - * MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256 - * MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384 - * MBEDTLS_TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256 - * MBEDTLS_TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384 - * MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256 - * MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384 - * MBEDTLS_TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256 - * MBEDTLS_TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384 - * MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 - * MBEDTLS_TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 - * MBEDTLS_TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 - * MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384 - * MBEDTLS_TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 - * MBEDTLS_TLS_DHE_RSA_WITH_AES_256_CBC_SHA256 - * MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA - * MBEDTLS_TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA - * MBEDTLS_TLS_DHE_RSA_WITH_AES_256_CBC_SHA - * MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 - * MBEDTLS_TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 - * MBEDTLS_TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 - * MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 - * MBEDTLS_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 - * MBEDTLS_TLS_DHE_RSA_WITH_AES_128_CBC_SHA256 - * MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA - * MBEDTLS_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA - * MBEDTLS_TLS_DHE_RSA_WITH_AES_128_CBC_SHA - * MBEDTLS_TLS_DHE_PSK_WITH_AES_256_GCM_SHA384 - * MBEDTLS_TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA384 - * MBEDTLS_TLS_DHE_PSK_WITH_AES_256_CBC_SHA384 - * MBEDTLS_TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA - * MBEDTLS_TLS_DHE_PSK_WITH_AES_256_CBC_SHA - * MBEDTLS_TLS_DHE_PSK_WITH_AES_128_GCM_SHA256 - * MBEDTLS_TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256 - * MBEDTLS_TLS_DHE_PSK_WITH_AES_128_CBC_SHA256 - * MBEDTLS_TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA - * MBEDTLS_TLS_DHE_PSK_WITH_AES_128_CBC_SHA - * MBEDTLS_TLS_RSA_WITH_AES_256_GCM_SHA384 - * MBEDTLS_TLS_RSA_WITH_AES_256_CBC_SHA256 - * MBEDTLS_TLS_RSA_WITH_AES_256_CBC_SHA - * MBEDTLS_TLS_RSA_WITH_AES_128_GCM_SHA256 - * MBEDTLS_TLS_RSA_WITH_AES_128_CBC_SHA256 - * MBEDTLS_TLS_RSA_WITH_AES_128_CBC_SHA - * MBEDTLS_TLS_RSA_PSK_WITH_AES_256_GCM_SHA384 - * MBEDTLS_TLS_RSA_PSK_WITH_AES_256_CBC_SHA384 - * MBEDTLS_TLS_RSA_PSK_WITH_AES_256_CBC_SHA - * MBEDTLS_TLS_RSA_PSK_WITH_AES_128_GCM_SHA256 - * MBEDTLS_TLS_RSA_PSK_WITH_AES_128_CBC_SHA256 - * MBEDTLS_TLS_RSA_PSK_WITH_AES_128_CBC_SHA - * MBEDTLS_TLS_PSK_WITH_AES_256_GCM_SHA384 - * MBEDTLS_TLS_PSK_WITH_AES_256_CBC_SHA384 - * MBEDTLS_TLS_PSK_WITH_AES_256_CBC_SHA - * MBEDTLS_TLS_PSK_WITH_AES_128_GCM_SHA256 - * MBEDTLS_TLS_PSK_WITH_AES_128_CBC_SHA256 - * MBEDTLS_TLS_PSK_WITH_AES_128_CBC_SHA - * - * PEM_PARSE uses AES for decrypting encrypted keys. - */ -#define MBEDTLS_AES_C - -/** - * \def MBEDTLS_ARC4_C - * - * Enable the ARCFOUR stream cipher. - * - * Module: library/arc4.c - * Caller: library/ssl_tls.c - * - * This module enables the following ciphersuites (if other requisites are - * enabled as well): - * MBEDTLS_TLS_ECDH_ECDSA_WITH_RC4_128_SHA - * MBEDTLS_TLS_ECDH_RSA_WITH_RC4_128_SHA - * MBEDTLS_TLS_ECDHE_ECDSA_WITH_RC4_128_SHA - * MBEDTLS_TLS_ECDHE_RSA_WITH_RC4_128_SHA - * MBEDTLS_TLS_ECDHE_PSK_WITH_RC4_128_SHA - * MBEDTLS_TLS_DHE_PSK_WITH_RC4_128_SHA - * MBEDTLS_TLS_RSA_WITH_RC4_128_SHA - * MBEDTLS_TLS_RSA_WITH_RC4_128_MD5 - * MBEDTLS_TLS_RSA_PSK_WITH_RC4_128_SHA - * MBEDTLS_TLS_PSK_WITH_RC4_128_SHA - */ -#define MBEDTLS_ARC4_C - -/** - * \def MBEDTLS_ASN1_PARSE_C - * - * Enable the generic ASN1 parser. - * - * Module: library/asn1.c - * Caller: library/x509.c - * library/dhm.c - * library/pkcs12.c - * library/pkcs5.c - * library/pkparse.c - */ -#define MBEDTLS_ASN1_PARSE_C - -/** - * \def MBEDTLS_ASN1_WRITE_C - * - * Enable the generic ASN1 writer. - * - * Module: library/asn1write.c - * Caller: library/ecdsa.c - * library/pkwrite.c - * library/x509_create.c - * library/x509write_crt.c - * library/mbedtls_x509write_csr.c - */ -#define MBEDTLS_ASN1_WRITE_C - -/** - * \def MBEDTLS_BASE64_C - * - * Enable the Base64 module. - * - * Module: library/base64.c - * Caller: library/pem.c - * - * This module is required for PEM support (required by X.509). - */ -#define MBEDTLS_BASE64_C - -/** - * \def MBEDTLS_BIGNUM_C - * - * Enable the multi-precision integer library. - * - * Module: library/bignum.c - * Caller: library/dhm.c - * library/ecp.c - * library/ecdsa.c - * library/rsa.c - * library/ssl_tls.c - * - * This module is required for RSA, DHM and ECC (ECDH, ECDSA) support. - */ -#define MBEDTLS_BIGNUM_C - -/** - * \def MBEDTLS_BLOWFISH_C - * - * Enable the Blowfish block cipher. - * - * Module: library/blowfish.c - */ -#define MBEDTLS_BLOWFISH_C - -/** - * \def MBEDTLS_CAMELLIA_C - * - * Enable the Camellia block cipher. - * - * Module: library/camellia.c - * Caller: library/ssl_tls.c - * - * This module enables the following ciphersuites (if other requisites are - * enabled as well): - * MBEDTLS_TLS_ECDH_ECDSA_WITH_CAMELLIA_128_CBC_SHA256 - * MBEDTLS_TLS_ECDH_ECDSA_WITH_CAMELLIA_256_CBC_SHA384 - * MBEDTLS_TLS_ECDH_RSA_WITH_CAMELLIA_128_CBC_SHA256 - * MBEDTLS_TLS_ECDH_RSA_WITH_CAMELLIA_256_CBC_SHA384 - * MBEDTLS_TLS_ECDH_ECDSA_WITH_CAMELLIA_128_GCM_SHA256 - * MBEDTLS_TLS_ECDH_ECDSA_WITH_CAMELLIA_256_GCM_SHA384 - * MBEDTLS_TLS_ECDH_RSA_WITH_CAMELLIA_128_GCM_SHA256 - * MBEDTLS_TLS_ECDH_RSA_WITH_CAMELLIA_256_GCM_SHA384 - * MBEDTLS_TLS_ECDHE_ECDSA_WITH_CAMELLIA_256_GCM_SHA384 - * MBEDTLS_TLS_ECDHE_RSA_WITH_CAMELLIA_256_GCM_SHA384 - * MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_256_GCM_SHA384 - * MBEDTLS_TLS_ECDHE_ECDSA_WITH_CAMELLIA_256_CBC_SHA384 - * MBEDTLS_TLS_ECDHE_RSA_WITH_CAMELLIA_256_CBC_SHA384 - * MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256 - * MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA - * MBEDTLS_TLS_ECDHE_ECDSA_WITH_CAMELLIA_128_GCM_SHA256 - * MBEDTLS_TLS_ECDHE_RSA_WITH_CAMELLIA_128_GCM_SHA256 - * MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_128_GCM_SHA256 - * MBEDTLS_TLS_ECDHE_ECDSA_WITH_CAMELLIA_128_CBC_SHA256 - * MBEDTLS_TLS_ECDHE_RSA_WITH_CAMELLIA_128_CBC_SHA256 - * MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256 - * MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA - * MBEDTLS_TLS_DHE_PSK_WITH_CAMELLIA_256_GCM_SHA384 - * MBEDTLS_TLS_ECDHE_PSK_WITH_CAMELLIA_256_CBC_SHA384 - * MBEDTLS_TLS_DHE_PSK_WITH_CAMELLIA_256_CBC_SHA384 - * MBEDTLS_TLS_DHE_PSK_WITH_CAMELLIA_128_GCM_SHA256 - * MBEDTLS_TLS_DHE_PSK_WITH_CAMELLIA_128_CBC_SHA256 - * MBEDTLS_TLS_ECDHE_PSK_WITH_CAMELLIA_128_CBC_SHA256 - * MBEDTLS_TLS_RSA_WITH_CAMELLIA_256_GCM_SHA384 - * MBEDTLS_TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256 - * MBEDTLS_TLS_RSA_WITH_CAMELLIA_256_CBC_SHA - * MBEDTLS_TLS_RSA_WITH_CAMELLIA_128_GCM_SHA256 - * MBEDTLS_TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256 - * MBEDTLS_TLS_RSA_WITH_CAMELLIA_128_CBC_SHA - * MBEDTLS_TLS_RSA_PSK_WITH_CAMELLIA_256_GCM_SHA384 - * MBEDTLS_TLS_RSA_PSK_WITH_CAMELLIA_256_CBC_SHA384 - * MBEDTLS_TLS_RSA_PSK_WITH_CAMELLIA_128_GCM_SHA256 - * MBEDTLS_TLS_RSA_PSK_WITH_CAMELLIA_128_CBC_SHA256 - * MBEDTLS_TLS_PSK_WITH_CAMELLIA_256_GCM_SHA384 - * MBEDTLS_TLS_PSK_WITH_CAMELLIA_256_CBC_SHA384 - * MBEDTLS_TLS_PSK_WITH_CAMELLIA_128_GCM_SHA256 - * MBEDTLS_TLS_PSK_WITH_CAMELLIA_128_CBC_SHA256 - */ -#define MBEDTLS_CAMELLIA_C - -/** - * \def MBEDTLS_CCM_C - * - * Enable the Counter with CBC-MAC (CCM) mode for 128-bit block cipher. - * - * Module: library/ccm.c - * - * Requires: MBEDTLS_AES_C or MBEDTLS_CAMELLIA_C - * - * This module enables the AES-CCM ciphersuites, if other requisites are - * enabled as well. - */ -#define MBEDTLS_CCM_C - -/** - * \def MBEDTLS_CERTS_C - * - * Enable the test certificates. - * - * Module: library/certs.c - * Caller: - * - * This module is used for testing (ssl_client/server). - */ -#define MBEDTLS_CERTS_C - -/** - * \def MBEDTLS_CIPHER_C - * - * Enable the generic cipher layer. - * - * Module: library/cipher.c - * Caller: library/ssl_tls.c - * - * Uncomment to enable generic cipher wrappers. - */ -#define MBEDTLS_CIPHER_C - -/** - * \def MBEDTLS_CTR_DRBG_C - * - * Enable the CTR_DRBG AES-256-based random generator. - * - * Module: library/ctr_drbg.c - * Caller: - * - * Requires: MBEDTLS_AES_C - * - * This module provides the CTR_DRBG AES-256 random number generator. - */ -#define MBEDTLS_CTR_DRBG_C - -/** - * \def MBEDTLS_DEBUG_C - * - * Enable the debug functions. - * - * Module: library/debug.c - * Caller: library/ssl_cli.c - * library/ssl_srv.c - * library/ssl_tls.c - * - * This module provides debugging functions. - */ -#define MBEDTLS_DEBUG_C - -/** - * \def MBEDTLS_DES_C - * - * Enable the DES block cipher. - * - * Module: library/des.c - * Caller: library/pem.c - * library/ssl_tls.c - * - * This module enables the following ciphersuites (if other requisites are - * enabled as well): - * MBEDTLS_TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA - * MBEDTLS_TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA - * MBEDTLS_TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA - * MBEDTLS_TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA - * MBEDTLS_TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA - * MBEDTLS_TLS_ECDHE_PSK_WITH_3DES_EDE_CBC_SHA - * MBEDTLS_TLS_DHE_PSK_WITH_3DES_EDE_CBC_SHA - * MBEDTLS_TLS_RSA_WITH_3DES_EDE_CBC_SHA - * MBEDTLS_TLS_RSA_PSK_WITH_3DES_EDE_CBC_SHA - * MBEDTLS_TLS_PSK_WITH_3DES_EDE_CBC_SHA - * - * PEM_PARSE uses DES/3DES for decrypting encrypted keys. - */ -#define MBEDTLS_DES_C - -/** - * \def MBEDTLS_DHM_C - * - * Enable the Diffie-Hellman-Merkle module. - * - * Module: library/dhm.c - * Caller: library/ssl_cli.c - * library/ssl_srv.c - * - * This module is used by the following key exchanges: - * DHE-RSA, DHE-PSK - */ -#define MBEDTLS_DHM_C - -/** - * \def MBEDTLS_ECDH_C - * - * Enable the elliptic curve Diffie-Hellman library. - * - * Module: library/ecdh.c - * Caller: library/ssl_cli.c - * library/ssl_srv.c - * - * This module is used by the following key exchanges: - * ECDHE-ECDSA, ECDHE-RSA, DHE-PSK - * - * Requires: MBEDTLS_ECP_C - */ -#define MBEDTLS_ECDH_C - -/** - * \def MBEDTLS_ECDSA_C - * - * Enable the elliptic curve DSA library. - * - * Module: library/ecdsa.c - * Caller: - * - * This module is used by the following key exchanges: - * ECDHE-ECDSA - * - * Requires: MBEDTLS_ECP_C, MBEDTLS_ASN1_WRITE_C, MBEDTLS_ASN1_PARSE_C - */ -#define MBEDTLS_ECDSA_C - -/** - * \def MBEDTLS_ECP_C - * - * Enable the elliptic curve over GF(p) library. - * - * Module: library/ecp.c - * Caller: library/ecdh.c - * library/ecdsa.c - * - * Requires: MBEDTLS_BIGNUM_C and at least one MBEDTLS_ECP_DP_XXX_ENABLED - */ -#define MBEDTLS_ECP_C - -/** - * \def MBEDTLS_ENTROPY_C - * - * Enable the platform-specific entropy code. - * - * Module: library/entropy.c - * Caller: - * - * Requires: MBEDTLS_SHA512_C or MBEDTLS_SHA256_C - * - * This module provides a generic entropy pool - */ -#define MBEDTLS_ENTROPY_C - -/** - * \def MBEDTLS_ERROR_C - * - * Enable error code to error string conversion. - * - * Module: library/error.c - * Caller: - * - * This module enables mbedtls_strerror(). - */ -#define MBEDTLS_ERROR_C - -/** - * \def MBEDTLS_GCM_C - * - * Enable the Galois/Counter Mode (GCM) for AES. - * - * Module: library/gcm.c - * - * Requires: MBEDTLS_AES_C or MBEDTLS_CAMELLIA_C - * - * This module enables the AES-GCM and CAMELLIA-GCM ciphersuites, if other - * requisites are enabled as well. - */ -#define MBEDTLS_GCM_C - -/** - * \def MBEDTLS_HAVEGE_C - * - * Enable the HAVEGE random generator. - * - * Warning: the HAVEGE random generator is not suitable for virtualized - * environments - * - * Warning: the HAVEGE random generator is dependent on timing and specific - * processor traits. It is therefore not advised to use HAVEGE as - * your applications primary random generator or primary entropy pool - * input. As a secondary input to your entropy pool, it IS able add - * the (limited) extra entropy it provides. - * - * Module: library/havege.c - * Caller: - * - * Requires: MBEDTLS_TIMING_C - * - * Uncomment to enable the HAVEGE random generator. - */ -//#define MBEDTLS_HAVEGE_C - -/** - * \def MBEDTLS_HMAC_DRBG_C - * - * Enable the HMAC_DRBG random generator. - * - * Module: library/hmac_drbg.c - * Caller: - * - * Requires: MBEDTLS_MD_C - * - * Uncomment to enable the HMAC_DRBG random number geerator. - */ -#define MBEDTLS_HMAC_DRBG_C - -/** - * \def MBEDTLS_MD_C - * - * Enable the generic message digest layer. - * - * Module: library/mbedtls_md.c - * Caller: - * - * Uncomment to enable generic message digest wrappers. - */ -#define MBEDTLS_MD_C - -/** - * \def MBEDTLS_MD2_C - * - * Enable the MD2 hash algorithm. - * - * Module: library/mbedtls_md2.c - * Caller: - * - * Uncomment to enable support for (rare) MD2-signed X.509 certs. - */ -//#define MBEDTLS_MD2_C - -/** - * \def MBEDTLS_MD4_C - * - * Enable the MD4 hash algorithm. - * - * Module: library/mbedtls_md4.c - * Caller: - * - * Uncomment to enable support for (rare) MD4-signed X.509 certs. - */ -//#define MBEDTLS_MD4_C - -/** - * \def MBEDTLS_MD5_C - * - * Enable the MD5 hash algorithm. - * - * Module: library/mbedtls_md5.c - * Caller: library/mbedtls_md.c - * library/pem.c - * library/ssl_tls.c - * - * This module is required for SSL/TLS and X.509. - * PEM_PARSE uses MD5 for decrypting encrypted keys. - */ -#define MBEDTLS_MD5_C - -/** - * \def MBEDTLS_MEMORY_BUFFER_ALLOC_C - * - * Enable the buffer allocator implementation that makes use of a (stack) - * based buffer to 'allocate' dynamic memory. (replaces calloc() and free() - * calls) - * - * Module: library/memory_buffer_alloc.c - * - * Requires: MBEDTLS_PLATFORM_C - * MBEDTLS_PLATFORM_MEMORY (to use it within mbed TLS) - * - * Enable this module to enable the buffer memory allocator. - */ -//#define MBEDTLS_MEMORY_BUFFER_ALLOC_C - -/** - * \def MBEDTLS_NET_C - * - * Enable the TCP/IP networking routines. - * - * Module: library/net.c - * - * This module provides TCP/IP networking routines. - */ -#define MBEDTLS_NET_C - -/** - * \def MBEDTLS_OID_C - * - * Enable the OID database. - * - * Module: library/oid.c - * Caller: library/asn1write.c - * library/pkcs5.c - * library/pkparse.c - * library/pkwrite.c - * library/rsa.c - * library/x509.c - * library/x509_create.c - * library/mbedtls_x509_crl.c - * library/mbedtls_x509_crt.c - * library/mbedtls_x509_csr.c - * library/x509write_crt.c - * library/mbedtls_x509write_csr.c - * - * This modules translates between OIDs and internal values. - */ -#define MBEDTLS_OID_C - -/** - * \def MBEDTLS_PADLOCK_C - * - * Enable VIA Padlock support on x86. - * - * Module: library/padlock.c - * Caller: library/aes.c - * - * Requires: MBEDTLS_HAVE_ASM - * - * This modules adds support for the VIA PadLock on x86. - */ -#define MBEDTLS_PADLOCK_C - -/** - * \def MBEDTLS_PEM_PARSE_C - * - * Enable PEM decoding / parsing. - * - * Module: library/pem.c - * Caller: library/dhm.c - * library/pkparse.c - * library/mbedtls_x509_crl.c - * library/mbedtls_x509_crt.c - * library/mbedtls_x509_csr.c - * - * Requires: MBEDTLS_BASE64_C - * - * This modules adds support for decoding / parsing PEM files. - */ -#define MBEDTLS_PEM_PARSE_C - -/** - * \def MBEDTLS_PEM_WRITE_C - * - * Enable PEM encoding / writing. - * - * Module: library/pem.c - * Caller: library/pkwrite.c - * library/x509write_crt.c - * library/mbedtls_x509write_csr.c - * - * Requires: MBEDTLS_BASE64_C - * - * This modules adds support for encoding / writing PEM files. - */ -#define MBEDTLS_PEM_WRITE_C - -/** - * \def MBEDTLS_PK_C - * - * Enable the generic public (asymetric) key layer. - * - * Module: library/pk.c - * Caller: library/ssl_tls.c - * library/ssl_cli.c - * library/ssl_srv.c - * - * Requires: MBEDTLS_RSA_C or MBEDTLS_ECP_C - * - * Uncomment to enable generic public key wrappers. - */ -#define MBEDTLS_PK_C - -/** - * \def MBEDTLS_PK_PARSE_C - * - * Enable the generic public (asymetric) key parser. - * - * Module: library/pkparse.c - * Caller: library/mbedtls_x509_crt.c - * library/mbedtls_x509_csr.c - * - * Requires: MBEDTLS_PK_C - * - * Uncomment to enable generic public key parse functions. - */ -#define MBEDTLS_PK_PARSE_C - -/** - * \def MBEDTLS_PK_WRITE_C - * - * Enable the generic public (asymetric) key writer. - * - * Module: library/pkwrite.c - * Caller: library/x509write.c - * - * Requires: MBEDTLS_PK_C - * - * Uncomment to enable generic public key write functions. - */ -#define MBEDTLS_PK_WRITE_C - -/** - * \def MBEDTLS_PKCS5_C - * - * Enable PKCS#5 functions. - * - * Module: library/pkcs5.c - * - * Requires: MBEDTLS_MD_C - * - * This module adds support for the PKCS#5 functions. - */ -#define MBEDTLS_PKCS5_C - -/** - * \def MBEDTLS_PKCS11_C - * - * Enable wrapper for PKCS#11 smartcard support. - * - * Module: library/pkcs11.c - * Caller: library/pk.c - * - * Requires: MBEDTLS_PK_C - * - * This module enables SSL/TLS PKCS #11 smartcard support. - * Requires the presence of the PKCS#11 helper library (libpkcs11-helper) - */ -//#define MBEDTLS_PKCS11_C - -/** - * \def MBEDTLS_PKCS12_C - * - * Enable PKCS#12 PBE functions. - * Adds algorithms for parsing PKCS#8 encrypted private keys - * - * Module: library/pkcs12.c - * Caller: library/pkparse.c - * - * Requires: MBEDTLS_ASN1_PARSE_C, MBEDTLS_CIPHER_C, MBEDTLS_MD_C - * Can use: MBEDTLS_ARC4_C - * - * This module enables PKCS#12 functions. - */ -#define MBEDTLS_PKCS12_C - -/** - * \def MBEDTLS_PLATFORM_C - * - * Enable the platform abstraction layer that allows you to re-assign - * functions like calloc(), free(), snprintf(), printf(), fprintf(), exit(). - * - * Enabling MBEDTLS_PLATFORM_C enables to use of MBEDTLS_PLATFORM_XXX_ALT - * or MBEDTLS_PLATFORM_XXX_MACRO directives, allowing the functions mentioned - * above to be specified at runtime or compile time respectively. - * - * \note This abstraction layer must be enabled on Windows (including MSYS2) - * as other module rely on it for a fixed snprintf implementation. - * - * Module: library/platform.c - * Caller: Most other .c files - * - * This module enables abstraction of common (libc) functions. - */ -#define MBEDTLS_PLATFORM_C - -/** - * \def MBEDTLS_RIPEMD160_C - * - * Enable the RIPEMD-160 hash algorithm. - * - * Module: library/mbedtls_ripemd160.c - * Caller: library/mbedtls_md.c - * - */ -#define MBEDTLS_RIPEMD160_C - -/** - * \def MBEDTLS_RSA_C - * - * Enable the RSA public-key cryptosystem. - * - * Module: library/rsa.c - * Caller: library/ssl_cli.c - * library/ssl_srv.c - * library/ssl_tls.c - * library/x509.c - * - * This module is used by the following key exchanges: - * RSA, DHE-RSA, ECDHE-RSA, RSA-PSK - * - * Requires: MBEDTLS_BIGNUM_C, MBEDTLS_OID_C - */ -#define MBEDTLS_RSA_C - -/** - * \def MBEDTLS_SHA1_C - * - * Enable the SHA1 cryptographic hash algorithm. - * - * Module: library/mbedtls_sha1.c - * Caller: library/mbedtls_md.c - * library/ssl_cli.c - * library/ssl_srv.c - * library/ssl_tls.c - * library/x509write_crt.c - * - * This module is required for SSL/TLS and SHA1-signed certificates. - */ -#define MBEDTLS_SHA1_C - -/** - * \def MBEDTLS_SHA256_C - * - * Enable the SHA-224 and SHA-256 cryptographic hash algorithms. - * - * Module: library/mbedtls_sha256.c - * Caller: library/entropy.c - * library/mbedtls_md.c - * library/ssl_cli.c - * library/ssl_srv.c - * library/ssl_tls.c - * - * This module adds support for SHA-224 and SHA-256. - * This module is required for the SSL/TLS 1.2 PRF function. - */ -#define MBEDTLS_SHA256_C - -/** - * \def MBEDTLS_SHA512_C - * - * Enable the SHA-384 and SHA-512 cryptographic hash algorithms. - * - * Module: library/mbedtls_sha512.c - * Caller: library/entropy.c - * library/mbedtls_md.c - * library/ssl_cli.c - * library/ssl_srv.c - * - * This module adds support for SHA-384 and SHA-512. - */ -#define MBEDTLS_SHA512_C - -/** - * \def MBEDTLS_SSL_CACHE_C - * - * Enable simple SSL cache implementation. - * - * Module: library/ssl_cache.c - * Caller: - * - * Requires: MBEDTLS_SSL_CACHE_C - */ -#define MBEDTLS_SSL_CACHE_C - -/** - * \def MBEDTLS_SSL_COOKIE_C - * - * Enable basic implementation of DTLS cookies for hello verification. - * - * Module: library/ssl_cookie.c - * Caller: - */ -#define MBEDTLS_SSL_COOKIE_C - -/** - * \def MBEDTLS_SSL_TICKET_C - * - * Enable an implementation of TLS server-side callbacks for session tickets. - * - * Module: library/ssl_ticket.c - * Caller: - * - * Requires: MBEDTLS_CIPHER_C - */ -#define MBEDTLS_SSL_TICKET_C - -/** - * \def MBEDTLS_SSL_CLI_C - * - * Enable the SSL/TLS client code. - * - * Module: library/ssl_cli.c - * Caller: - * - * Requires: MBEDTLS_SSL_TLS_C - * - * This module is required for SSL/TLS client support. - */ -#define MBEDTLS_SSL_CLI_C - -/** - * \def MBEDTLS_SSL_SRV_C - * - * Enable the SSL/TLS server code. - * - * Module: library/ssl_srv.c - * Caller: - * - * Requires: MBEDTLS_SSL_TLS_C - * - * This module is required for SSL/TLS server support. - */ -#define MBEDTLS_SSL_SRV_C - -/** - * \def MBEDTLS_SSL_TLS_C - * - * Enable the generic SSL/TLS code. - * - * Module: library/ssl_tls.c - * Caller: library/ssl_cli.c - * library/ssl_srv.c - * - * Requires: MBEDTLS_CIPHER_C, MBEDTLS_MD_C - * and at least one of the MBEDTLS_SSL_PROTO_XXX defines - * - * This module is required for SSL/TLS. - */ -#define MBEDTLS_SSL_TLS_C - -/** - * \def MBEDTLS_THREADING_C - * - * Enable the threading abstraction layer. - * By default mbed TLS assumes it is used in a non-threaded environment or that - * contexts are not shared between threads. If you do intend to use contexts - * between threads, you will need to enable this layer to prevent race - * conditions. - * - * Module: library/threading.c - * - * This allows different threading implementations (self-implemented or - * provided). - * - * You will have to enable either MBEDTLS_THREADING_ALT or - * MBEDTLS_THREADING_PTHREAD. - * - * Enable this layer to allow use of mutexes within mbed TLS - */ -//#define MBEDTLS_THREADING_C - -/** - * \def MBEDTLS_TIMING_C - * - * Enable the portable timing interface. - * - * Module: library/timing.c - * Caller: library/havege.c - * - * This module is used by the HAVEGE random number generator. - */ -#define MBEDTLS_TIMING_C - -/** - * \def MBEDTLS_VERSION_C - * - * Enable run-time version information. - * - * Module: library/version.c - * - * This module provides run-time version information. - */ -#define MBEDTLS_VERSION_C - -/** - * \def MBEDTLS_X509_USE_C - * - * Enable X.509 core for using certificates. - * - * Module: library/x509.c - * Caller: library/mbedtls_x509_crl.c - * library/mbedtls_x509_crt.c - * library/mbedtls_x509_csr.c - * - * Requires: MBEDTLS_ASN1_PARSE_C, MBEDTLS_BIGNUM_C, MBEDTLS_OID_C, - * MBEDTLS_PK_PARSE_C - * - * This module is required for the X.509 parsing modules. - */ -#define MBEDTLS_X509_USE_C - -/** - * \def MBEDTLS_X509_CRT_PARSE_C - * - * Enable X.509 certificate parsing. - * - * Module: library/mbedtls_x509_crt.c - * Caller: library/ssl_cli.c - * library/ssl_srv.c - * library/ssl_tls.c - * - * Requires: MBEDTLS_X509_USE_C - * - * This module is required for X.509 certificate parsing. - */ -#define MBEDTLS_X509_CRT_PARSE_C - -/** - * \def MBEDTLS_X509_CRL_PARSE_C - * - * Enable X.509 CRL parsing. - * - * Module: library/mbedtls_x509_crl.c - * Caller: library/mbedtls_x509_crt.c - * - * Requires: MBEDTLS_X509_USE_C - * - * This module is required for X.509 CRL parsing. - */ -#define MBEDTLS_X509_CRL_PARSE_C - -/** - * \def MBEDTLS_X509_CSR_PARSE_C - * - * Enable X.509 Certificate Signing Request (CSR) parsing. - * - * Module: library/mbedtls_x509_csr.c - * Caller: library/x509_crt_write.c - * - * Requires: MBEDTLS_X509_USE_C - * - * This module is used for reading X.509 certificate request. - */ -#define MBEDTLS_X509_CSR_PARSE_C - -/** - * \def MBEDTLS_X509_CREATE_C - * - * Enable X.509 core for creating certificates. - * - * Module: library/x509_create.c - * - * Requires: MBEDTLS_BIGNUM_C, MBEDTLS_OID_C, MBEDTLS_PK_WRITE_C - * - * This module is the basis for creating X.509 certificates and CSRs. - */ -#define MBEDTLS_X509_CREATE_C - -/** - * \def MBEDTLS_X509_CRT_WRITE_C - * - * Enable creating X.509 certificates. - * - * Module: library/x509_crt_write.c - * - * Requires: MBEDTLS_X509_CREATE_C - * - * This module is required for X.509 certificate creation. - */ -#define MBEDTLS_X509_CRT_WRITE_C - -/** - * \def MBEDTLS_X509_CSR_WRITE_C - * - * Enable creating X.509 Certificate Signing Requests (CSR). - * - * Module: library/x509_csr_write.c - * - * Requires: MBEDTLS_X509_CREATE_C - * - * This module is required for X.509 certificate request writing. - */ -#define MBEDTLS_X509_CSR_WRITE_C - -/** - * \def MBEDTLS_XTEA_C - * - * Enable the XTEA block cipher. - * - * Module: library/xtea.c - * Caller: - */ -#define MBEDTLS_XTEA_C - -/* \} name SECTION: mbed TLS modules */ - -/** - * \name SECTION: Module configuration options - * - * This section allows for the setting of module specific sizes and - * configuration options. The default values are already present in the - * relevant header files and should suffice for the regular use cases. - * - * Our advice is to enable options and change their values here - * only if you have a good reason and know the consequences. - * - * Please check the respective header file for documentation on these - * parameters (to prevent duplicate documentation). - * \{ - */ - -/* MPI / BIGNUM options */ -//#define MBEDTLS_MPI_WINDOW_SIZE 6 /**< Maximum windows size used. */ -//#define MBEDTLS_MPI_MAX_SIZE 1024 /**< Maximum number of bytes for usable MPIs. */ - -/* CTR_DRBG options */ -//#define MBEDTLS_CTR_DRBG_ENTROPY_LEN 48 /**< Amount of entropy used per seed by default (48 with SHA-512, 32 with SHA-256) */ -//#define MBEDTLS_CTR_DRBG_RESEED_INTERVAL 10000 /**< Interval before reseed is performed by default */ -//#define MBEDTLS_CTR_DRBG_MAX_INPUT 256 /**< Maximum number of additional input bytes */ -//#define MBEDTLS_CTR_DRBG_MAX_REQUEST 1024 /**< Maximum number of requested bytes per call */ -//#define MBEDTLS_CTR_DRBG_MAX_SEED_INPUT 384 /**< Maximum size of (re)seed buffer */ - -/* HMAC_DRBG options */ -//#define MBEDTLS_HMAC_DRBG_RESEED_INTERVAL 10000 /**< Interval before reseed is performed by default */ -//#define MBEDTLS_HMAC_DRBG_MAX_INPUT 256 /**< Maximum number of additional input bytes */ -//#define MBEDTLS_HMAC_DRBG_MAX_REQUEST 1024 /**< Maximum number of requested bytes per call */ -//#define MBEDTLS_HMAC_DRBG_MAX_SEED_INPUT 384 /**< Maximum size of (re)seed buffer */ - -/* ECP options */ -//#define MBEDTLS_ECP_MAX_BITS 521 /**< Maximum bit size of groups */ -//#define MBEDTLS_ECP_WINDOW_SIZE 6 /**< Maximum window size used */ -//#define MBEDTLS_ECP_FIXED_POINT_OPTIM 1 /**< Enable fixed-point speed-up */ - -/* Entropy options */ -//#define MBEDTLS_ENTROPY_MAX_SOURCES 20 /**< Maximum number of sources supported */ -//#define MBEDTLS_ENTROPY_MAX_GATHER 128 /**< Maximum amount requested from entropy sources */ - -/* Memory buffer allocator options */ -//#define MBEDTLS_MEMORY_ALIGN_MULTIPLE 4 /**< Align on multiples of this value */ - -/* Platform options */ -//#define MBEDTLS_PLATFORM_STD_MEM_HDR /**< Header to include if MBEDTLS_PLATFORM_NO_STD_FUNCTIONS is defined. Don't define if no header is needed. */ -//#define MBEDTLS_PLATFORM_STD_CALLOC calloc /**< Default allocator to use, can be undefined */ -//#define MBEDTLS_PLATFORM_STD_FREE free /**< Default free to use, can be undefined */ -//#define MBEDTLS_PLATFORM_STD_EXIT exit /**< Default exit to use, can be undefined */ -//#define MBEDTLS_PLATFORM_STD_FPRINTF fprintf /**< Default fprintf to use, can be undefined */ -//#define MBEDTLS_PLATFORM_STD_PRINTF printf /**< Default printf to use, can be undefined */ -/* Note: your snprintf must correclty zero-terminate the buffer! */ -//#define MBEDTLS_PLATFORM_STD_SNPRINTF snprintf /**< Default snprintf to use, can be undefined */ - -/* To Use Function Macros MBEDTLS_PLATFORM_C must be enabled */ -/* MBEDTLS_PLATFORM_XXX_MACRO and MBEDTLS_PLATFORM_XXX_ALT cannot both be defined */ -//#define MBEDTLS_PLATFORM_CALLOC_MACRO calloc /**< Default allocator macro to use, can be undefined */ -//#define MBEDTLS_PLATFORM_FREE_MACRO free /**< Default free macro to use, can be undefined */ -//#define MBEDTLS_PLATFORM_EXIT_MACRO exit /**< Default exit macro to use, can be undefined */ -//#define MBEDTLS_PLATFORM_FPRINTF_MACRO fprintf /**< Default fprintf macro to use, can be undefined */ -//#define MBEDTLS_PLATFORM_PRINTF_MACRO printf /**< Default printf macro to use, can be undefined */ -/* Note: your snprintf must correclty zero-terminate the buffer! */ -//#define MBEDTLS_PLATFORM_SNPRINTF_MACRO snprintf /**< Default snprintf macro to use, can be undefined */ - -/* SSL Cache options */ -//#define MBEDTLS_SSL_CACHE_DEFAULT_TIMEOUT 86400 /**< 1 day */ -//#define MBEDTLS_SSL_CACHE_DEFAULT_MAX_ENTRIES 50 /**< Maximum entries in cache */ - -/* SSL options */ -//#define MBEDTLS_SSL_MAX_CONTENT_LEN 16384 /**< Maxium fragment length in bytes, determines the size of each of the two internal I/O buffers */ -//#define MBEDTLS_SSL_DEFAULT_TICKET_LIFETIME 86400 /**< Lifetime of session tickets (if enabled) */ -//#define MBEDTLS_PSK_MAX_LEN 32 /**< Max size of TLS pre-shared keys, in bytes (default 256 bits) */ -//#define MBEDTLS_SSL_COOKIE_TIMEOUT 60 /**< Default expiration delay of DTLS cookies, in seconds if HAVE_TIME, or in number of cookies issued */ - -/** - * Complete list of ciphersuites to use, in order of preference. - * - * \warning No dependency checking is done on that field! This option can only - * be used to restrict the set of available ciphersuites. It is your - * responsibility to make sure the needed modules are active. - * - * Use this to save a few hundred bytes of ROM (default ordering of all - * available ciphersuites) and a few to a few hundred bytes of RAM. - * - * The value below is only an example, not the default. - */ -//#define MBEDTLS_SSL_CIPHERSUITES MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 - -/* X509 options */ -//#define MBEDTLS_X509_MAX_INTERMEDIATE_CA 8 /**< Maximum number of intermediate CAs in a verification chain. */ - -/* \} name SECTION: Module configuration options */ - -#if defined(TARGET_LIKE_MBED) -#include "mbedtls/target_config.h" -#endif - -/* - * Allow user to override any previous default. - * - * Use two macro names for that, as: - * - with yotta the prefix YOTTA_CFG_ is forced - * - without yotta is looks weird to have a YOTTA prefix. - */ -#if defined(YOTTA_CFG_MBEDTLS_USER_CONFIG_FILE) -#include YOTTA_CFG_MBEDTLS_USER_CONFIG_FILE -#elif defined(MBEDTLS_USER_CONFIG_FILE) -#include MBEDTLS_USER_CONFIG_FILE -#endif - -#include "check_config.h" - -#endif /* MBEDTLS_CONFIG_H */ diff --git a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/ctr_drbg.h b/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/ctr_drbg.h deleted file mode 100644 index 059d3c5c..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/ctr_drbg.h +++ /dev/null @@ -1,290 +0,0 @@ -/** - * \file ctr_drbg.h - * - * \brief CTR_DRBG based on AES-256 (NIST SP 800-90) - * - * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * This file is part of mbed TLS (https://tls.mbed.org) - */ -#ifndef MBEDTLS_CTR_DRBG_H -#define MBEDTLS_CTR_DRBG_H - -#include "aes.h" - -#if defined(MBEDTLS_THREADING_C) -#include "mbedtls/threading.h" -#endif - -#define MBEDTLS_ERR_CTR_DRBG_ENTROPY_SOURCE_FAILED -0x0034 /**< The entropy source failed. */ -#define MBEDTLS_ERR_CTR_DRBG_REQUEST_TOO_BIG -0x0036 /**< Too many random requested in single call. */ -#define MBEDTLS_ERR_CTR_DRBG_INPUT_TOO_BIG -0x0038 /**< Input too large (Entropy + additional). */ -#define MBEDTLS_ERR_CTR_DRBG_FILE_IO_ERROR -0x003A /**< Read/write error in file. */ - -#define MBEDTLS_CTR_DRBG_BLOCKSIZE 16 /**< Block size used by the cipher */ -#define MBEDTLS_CTR_DRBG_KEYSIZE 32 /**< Key size used by the cipher */ -#define MBEDTLS_CTR_DRBG_KEYBITS ( MBEDTLS_CTR_DRBG_KEYSIZE * 8 ) -#define MBEDTLS_CTR_DRBG_SEEDLEN ( MBEDTLS_CTR_DRBG_KEYSIZE + MBEDTLS_CTR_DRBG_BLOCKSIZE ) - /**< The seed length (counter + AES key) */ - -/** - * \name SECTION: Module settings - * - * The configuration options you can set for this module are in this section. - * Either change them in config.h or define them on the compiler command line. - * \{ - */ - -#if !defined(MBEDTLS_CTR_DRBG_ENTROPY_LEN) -#if defined(MBEDTLS_SHA512_C) && !defined(MBEDTLS_ENTROPY_FORCE_SHA256) -#define MBEDTLS_CTR_DRBG_ENTROPY_LEN 48 /**< Amount of entropy used per seed by default (48 with SHA-512, 32 with SHA-256) */ -#else -#define MBEDTLS_CTR_DRBG_ENTROPY_LEN 32 /**< Amount of entropy used per seed by default (48 with SHA-512, 32 with SHA-256) */ -#endif -#endif - -#if !defined(MBEDTLS_CTR_DRBG_RESEED_INTERVAL) -#define MBEDTLS_CTR_DRBG_RESEED_INTERVAL 10000 /**< Interval before reseed is performed by default */ -#endif - -#if !defined(MBEDTLS_CTR_DRBG_MAX_INPUT) -#define MBEDTLS_CTR_DRBG_MAX_INPUT 256 /**< Maximum number of additional input bytes */ -#endif - -#if !defined(MBEDTLS_CTR_DRBG_MAX_REQUEST) -#define MBEDTLS_CTR_DRBG_MAX_REQUEST 1024 /**< Maximum number of requested bytes per call */ -#endif - -#if !defined(MBEDTLS_CTR_DRBG_MAX_SEED_INPUT) -#define MBEDTLS_CTR_DRBG_MAX_SEED_INPUT 384 /**< Maximum size of (re)seed buffer */ -#endif - -/* \} name SECTION: Module settings */ - -#define MBEDTLS_CTR_DRBG_PR_OFF 0 /**< No prediction resistance */ -#define MBEDTLS_CTR_DRBG_PR_ON 1 /**< Prediction resistance enabled */ - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * \brief CTR_DRBG context structure - */ -typedef struct -{ - unsigned char counter[16]; /*!< counter (V) */ - int reseed_counter; /*!< reseed counter */ - int prediction_resistance; /*!< enable prediction resistance (Automatic - reseed before every random generation) */ - size_t entropy_len; /*!< amount of entropy grabbed on each - (re)seed */ - int reseed_interval; /*!< reseed interval */ - - mbedtls_aes_context aes_ctx; /*!< AES context */ - - /* - * Callbacks (Entropy) - */ - int (*f_entropy)(void *, unsigned char *, size_t); - - void *p_entropy; /*!< context for the entropy function */ - -#if defined(MBEDTLS_THREADING_C) - mbedtls_threading_mutex_t mutex; -#endif -} -mbedtls_ctr_drbg_context; - -/** - * \brief CTR_DRBG context initialization - * Makes the context ready for mbedtls_ctr_drbg_seed() or - * mbedtls_ctr_drbg_free(). - * - * \param ctx CTR_DRBG context to be initialized - */ -void mbedtls_ctr_drbg_init( mbedtls_ctr_drbg_context *ctx ); - -/** - * \brief CTR_DRBG initial seeding - * Seed and setup entropy source for future reseeds. - * - * Note: Personalization data can be provided in addition to the more generic - * entropy source to make this instantiation as unique as possible. - * - * \param ctx CTR_DRBG context to be seeded - * \param f_entropy Entropy callback (p_entropy, buffer to fill, buffer - * length) - * \param p_entropy Entropy context - * \param custom Personalization data (Device specific identifiers) - * (Can be NULL) - * \param len Length of personalization data - * - * \return 0 if successful, or - * MBEDTLS_ERR_CTR_DRBG_ENTROPY_SOURCE_FAILED - */ -int mbedtls_ctr_drbg_seed( mbedtls_ctr_drbg_context *ctx, - int (*f_entropy)(void *, unsigned char *, size_t), - void *p_entropy, - const unsigned char *custom, - size_t len ); - -/** - * \brief Clear CTR_CRBG context data - * - * \param ctx CTR_DRBG context to clear - */ -void mbedtls_ctr_drbg_free( mbedtls_ctr_drbg_context *ctx ); - -/** - * \brief Enable / disable prediction resistance (Default: Off) - * - * Note: If enabled, entropy is used for ctx->entropy_len before each call! - * Only use this if you have ample supply of good entropy! - * - * \param ctx CTR_DRBG context - * \param resistance MBEDTLS_CTR_DRBG_PR_ON or MBEDTLS_CTR_DRBG_PR_OFF - */ -void mbedtls_ctr_drbg_set_prediction_resistance( mbedtls_ctr_drbg_context *ctx, - int resistance ); - -/** - * \brief Set the amount of entropy grabbed on each (re)seed - * (Default: MBEDTLS_CTR_DRBG_ENTROPY_LEN) - * - * \param ctx CTR_DRBG context - * \param len Amount of entropy to grab - */ -void mbedtls_ctr_drbg_set_entropy_len( mbedtls_ctr_drbg_context *ctx, - size_t len ); - -/** - * \brief Set the reseed interval - * (Default: MBEDTLS_CTR_DRBG_RESEED_INTERVAL) - * - * \param ctx CTR_DRBG context - * \param interval Reseed interval - */ -void mbedtls_ctr_drbg_set_reseed_interval( mbedtls_ctr_drbg_context *ctx, - int interval ); - -/** - * \brief CTR_DRBG reseeding (extracts data from entropy source) - * - * \param ctx CTR_DRBG context - * \param additional Additional data to add to state (Can be NULL) - * \param len Length of additional data - * - * \return 0 if successful, or - * MBEDTLS_ERR_CTR_DRBG_ENTROPY_SOURCE_FAILED - */ -int mbedtls_ctr_drbg_reseed( mbedtls_ctr_drbg_context *ctx, - const unsigned char *additional, size_t len ); - -/** - * \brief CTR_DRBG update state - * - * \param ctx CTR_DRBG context - * \param additional Additional data to update state with - * \param add_len Length of additional data - * - * \note If add_len is greater than MBEDTLS_CTR_DRBG_MAX_SEED_INPUT, - * only the first MBEDTLS_CTR_DRBG_MAX_SEED_INPUT bytes are used, - * the remaining ones are silently discarded. - */ -void mbedtls_ctr_drbg_update( mbedtls_ctr_drbg_context *ctx, - const unsigned char *additional, size_t add_len ); - -/** - * \brief CTR_DRBG generate random with additional update input - * - * Note: Automatically reseeds if reseed_counter is reached. - * - * \param p_rng CTR_DRBG context - * \param output Buffer to fill - * \param output_len Length of the buffer - * \param additional Additional data to update with (Can be NULL) - * \param add_len Length of additional data - * - * \return 0 if successful, or - * MBEDTLS_ERR_CTR_DRBG_ENTROPY_SOURCE_FAILED, or - * MBEDTLS_ERR_CTR_DRBG_REQUEST_TOO_BIG - */ -int mbedtls_ctr_drbg_random_with_add( void *p_rng, - unsigned char *output, size_t output_len, - const unsigned char *additional, size_t add_len ); - -/** - * \brief CTR_DRBG generate random - * - * Note: Automatically reseeds if reseed_counter is reached. - * - * \param p_rng CTR_DRBG context - * \param output Buffer to fill - * \param output_len Length of the buffer - * - * \return 0 if successful, or - * MBEDTLS_ERR_CTR_DRBG_ENTROPY_SOURCE_FAILED, or - * MBEDTLS_ERR_CTR_DRBG_REQUEST_TOO_BIG - */ -int mbedtls_ctr_drbg_random( void *p_rng, - unsigned char *output, size_t output_len ); - -#if defined(MBEDTLS_FS_IO) -/** - * \brief Write a seed file - * - * \param ctx CTR_DRBG context - * \param path Name of the file - * - * \return 0 if successful, - * MBEDTLS_ERR_CTR_DRBG_FILE_IO_ERROR on file error, or - * MBEDTLS_ERR_CTR_DRBG_ENTROPY_SOURCE_FAILED - */ -int mbedtls_ctr_drbg_write_seed_file( mbedtls_ctr_drbg_context *ctx, const char *path ); - -/** - * \brief Read and update a seed file. Seed is added to this - * instance - * - * \param ctx CTR_DRBG context - * \param path Name of the file - * - * \return 0 if successful, - * MBEDTLS_ERR_CTR_DRBG_FILE_IO_ERROR on file error, - * MBEDTLS_ERR_CTR_DRBG_ENTROPY_SOURCE_FAILED or - * MBEDTLS_ERR_CTR_DRBG_INPUT_TOO_BIG - */ -int mbedtls_ctr_drbg_update_seed_file( mbedtls_ctr_drbg_context *ctx, const char *path ); -#endif /* MBEDTLS_FS_IO */ - -/** - * \brief Checkup routine - * - * \return 0 if successful, or 1 if the test failed - */ -int mbedtls_ctr_drbg_self_test( int verbose ); - -/* Internal functions (do not call directly) */ -int mbedtls_ctr_drbg_seed_entropy_len( mbedtls_ctr_drbg_context *, - int (*)(void *, unsigned char *, size_t), void *, - const unsigned char *, size_t, size_t ); - -#ifdef __cplusplus -} -#endif - -#endif /* ctr_drbg.h */ diff --git a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/debug.h b/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/debug.h deleted file mode 100644 index d859dd5f..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/debug.h +++ /dev/null @@ -1,125 +0,0 @@ -/** - * \file debug.h - * - * \brief Debug functions - * - * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * This file is part of mbed TLS (https://tls.mbed.org) - */ -#ifndef MBEDTLS_DEBUG_H -#define MBEDTLS_DEBUG_H - -#if !defined(MBEDTLS_CONFIG_FILE) -#include "config.h" -#else -#include MBEDTLS_CONFIG_FILE -#endif - -#include "ssl.h" - -#if defined(MBEDTLS_ECP_C) -#include "ecp.h" -#endif - -#if defined(MBEDTLS_DEBUG_C) - -#define MBEDTLS_DEBUG_STRIP_PARENS( ... ) __VA_ARGS__ - -#define MBEDTLS_SSL_DEBUG_MSG( level, args ) \ - mbedtls_debug_print_msg( ssl, level, __FILE__, __LINE__, \ - MBEDTLS_DEBUG_STRIP_PARENS args ) - -#define MBEDTLS_SSL_DEBUG_RET( level, text, ret ) \ - mbedtls_debug_print_ret( ssl, level, __FILE__, __LINE__, text, ret ) - -#define MBEDTLS_SSL_DEBUG_BUF( level, text, buf, len ) \ - mbedtls_debug_print_buf( ssl, level, __FILE__, __LINE__, text, buf, len ) - -#if defined(MBEDTLS_BIGNUM_C) -#define MBEDTLS_SSL_DEBUG_MPI( level, text, X ) \ - mbedtls_debug_print_mpi( ssl, level, __FILE__, __LINE__, text, X ) -#endif - -#if defined(MBEDTLS_ECP_C) -#define MBEDTLS_SSL_DEBUG_ECP( level, text, X ) \ - mbedtls_debug_print_ecp( ssl, level, __FILE__, __LINE__, text, X ) -#endif - -#if defined(MBEDTLS_X509_CRT_PARSE_C) -#define MBEDTLS_SSL_DEBUG_CRT( level, text, crt ) \ - mbedtls_debug_print_crt( ssl, level, __FILE__, __LINE__, text, crt ) -#endif - -#else /* MBEDTLS_DEBUG_C */ - -#define MBEDTLS_SSL_DEBUG_MSG( level, args ) do { } while( 0 ) -#define MBEDTLS_SSL_DEBUG_RET( level, text, ret ) do { } while( 0 ) -#define MBEDTLS_SSL_DEBUG_BUF( level, text, buf, len ) do { } while( 0 ) -#define MBEDTLS_SSL_DEBUG_MPI( level, text, X ) do { } while( 0 ) -#define MBEDTLS_SSL_DEBUG_ECP( level, text, X ) do { } while( 0 ) -#define MBEDTLS_SSL_DEBUG_CRT( level, text, crt ) do { } while( 0 ) - -#endif /* MBEDTLS_DEBUG_C */ - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * \brief Set the level threshold to handle globally. Messages that have a - * level over the threshold value are ignored. - * (Default value: 0 (No debug)) - * - * \param threshold maximum level of messages to pass on - */ -void mbedtls_debug_set_threshold( int threshold ); - -void mbedtls_debug_print_msg( const mbedtls_ssl_context *ssl, int level, - const char *file, int line, - const char *format, ... ); - -void mbedtls_debug_print_ret( const mbedtls_ssl_context *ssl, int level, - const char *file, int line, - const char *text, int ret ); - -void mbedtls_debug_print_buf( const mbedtls_ssl_context *ssl, int level, - const char *file, int line, const char *text, - const unsigned char *buf, size_t len ); - -#if defined(MBEDTLS_BIGNUM_C) -void mbedtls_debug_print_mpi( const mbedtls_ssl_context *ssl, int level, - const char *file, int line, - const char *text, const mbedtls_mpi *X ); -#endif - -#if defined(MBEDTLS_ECP_C) -void mbedtls_debug_print_ecp( const mbedtls_ssl_context *ssl, int level, - const char *file, int line, - const char *text, const mbedtls_ecp_point *X ); -#endif - -#if defined(MBEDTLS_X509_CRT_PARSE_C) -void mbedtls_debug_print_crt( const mbedtls_ssl_context *ssl, int level, - const char *file, int line, - const char *text, const mbedtls_x509_crt *crt ); -#endif - -#ifdef __cplusplus -} -#endif - -#endif /* debug.h */ diff --git a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/des.h b/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/des.h deleted file mode 100644 index 5ca2ecf2..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/des.h +++ /dev/null @@ -1,306 +0,0 @@ -/** - * \file des.h - * - * \brief DES block cipher - * - * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * This file is part of mbed TLS (https://tls.mbed.org) - */ -#ifndef MBEDTLS_DES_H -#define MBEDTLS_DES_H - -#if !defined(MBEDTLS_CONFIG_FILE) -#include "config.h" -#else -#include MBEDTLS_CONFIG_FILE -#endif - -#include -#include - -#define MBEDTLS_DES_ENCRYPT 1 -#define MBEDTLS_DES_DECRYPT 0 - -#define MBEDTLS_ERR_DES_INVALID_INPUT_LENGTH -0x0032 /**< The data input has an invalid length. */ - -#define MBEDTLS_DES_KEY_SIZE 8 - -#if !defined(MBEDTLS_DES_ALT) -// Regular implementation -// - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * \brief DES context structure - */ -typedef struct -{ - uint32_t sk[32]; /*!< DES subkeys */ -} -mbedtls_des_context; - -/** - * \brief Triple-DES context structure - */ -typedef struct -{ - uint32_t sk[96]; /*!< 3DES subkeys */ -} -mbedtls_des3_context; - -/** - * \brief Initialize DES context - * - * \param ctx DES context to be initialized - */ -void mbedtls_des_init( mbedtls_des_context *ctx ); - -/** - * \brief Clear DES context - * - * \param ctx DES context to be cleared - */ -void mbedtls_des_free( mbedtls_des_context *ctx ); - -/** - * \brief Initialize Triple-DES context - * - * \param ctx DES3 context to be initialized - */ -void mbedtls_des3_init( mbedtls_des3_context *ctx ); - -/** - * \brief Clear Triple-DES context - * - * \param ctx DES3 context to be cleared - */ -void mbedtls_des3_free( mbedtls_des3_context *ctx ); - -/** - * \brief Set key parity on the given key to odd. - * - * DES keys are 56 bits long, but each byte is padded with - * a parity bit to allow verification. - * - * \param key 8-byte secret key - */ -void mbedtls_des_key_set_parity( unsigned char key[MBEDTLS_DES_KEY_SIZE] ); - -/** - * \brief Check that key parity on the given key is odd. - * - * DES keys are 56 bits long, but each byte is padded with - * a parity bit to allow verification. - * - * \param key 8-byte secret key - * - * \return 0 is parity was ok, 1 if parity was not correct. - */ -int mbedtls_des_key_check_key_parity( const unsigned char key[MBEDTLS_DES_KEY_SIZE] ); - -/** - * \brief Check that key is not a weak or semi-weak DES key - * - * \param key 8-byte secret key - * - * \return 0 if no weak key was found, 1 if a weak key was identified. - */ -int mbedtls_des_key_check_weak( const unsigned char key[MBEDTLS_DES_KEY_SIZE] ); - -/** - * \brief DES key schedule (56-bit, encryption) - * - * \param ctx DES context to be initialized - * \param key 8-byte secret key - * - * \return 0 - */ -int mbedtls_des_setkey_enc( mbedtls_des_context *ctx, const unsigned char key[MBEDTLS_DES_KEY_SIZE] ); - -/** - * \brief DES key schedule (56-bit, decryption) - * - * \param ctx DES context to be initialized - * \param key 8-byte secret key - * - * \return 0 - */ -int mbedtls_des_setkey_dec( mbedtls_des_context *ctx, const unsigned char key[MBEDTLS_DES_KEY_SIZE] ); - -/** - * \brief Triple-DES key schedule (112-bit, encryption) - * - * \param ctx 3DES context to be initialized - * \param key 16-byte secret key - * - * \return 0 - */ -int mbedtls_des3_set2key_enc( mbedtls_des3_context *ctx, - const unsigned char key[MBEDTLS_DES_KEY_SIZE * 2] ); - -/** - * \brief Triple-DES key schedule (112-bit, decryption) - * - * \param ctx 3DES context to be initialized - * \param key 16-byte secret key - * - * \return 0 - */ -int mbedtls_des3_set2key_dec( mbedtls_des3_context *ctx, - const unsigned char key[MBEDTLS_DES_KEY_SIZE * 2] ); - -/** - * \brief Triple-DES key schedule (168-bit, encryption) - * - * \param ctx 3DES context to be initialized - * \param key 24-byte secret key - * - * \return 0 - */ -int mbedtls_des3_set3key_enc( mbedtls_des3_context *ctx, - const unsigned char key[MBEDTLS_DES_KEY_SIZE * 3] ); - -/** - * \brief Triple-DES key schedule (168-bit, decryption) - * - * \param ctx 3DES context to be initialized - * \param key 24-byte secret key - * - * \return 0 - */ -int mbedtls_des3_set3key_dec( mbedtls_des3_context *ctx, - const unsigned char key[MBEDTLS_DES_KEY_SIZE * 3] ); - -/** - * \brief DES-ECB block encryption/decryption - * - * \param ctx DES context - * \param input 64-bit input block - * \param output 64-bit output block - * - * \return 0 if successful - */ -int mbedtls_des_crypt_ecb( mbedtls_des_context *ctx, - const unsigned char input[8], - unsigned char output[8] ); - -#if defined(MBEDTLS_CIPHER_MODE_CBC) -/** - * \brief DES-CBC buffer encryption/decryption - * - * \note Upon exit, the content of the IV is updated so that you can - * call the function same function again on the following - * block(s) of data and get the same result as if it was - * encrypted in one call. This allows a "streaming" usage. - * If on the other hand you need to retain the contents of the - * IV, you should either save it manually or use the cipher - * module instead. - * - * \param ctx DES context - * \param mode MBEDTLS_DES_ENCRYPT or MBEDTLS_DES_DECRYPT - * \param length length of the input data - * \param iv initialization vector (updated after use) - * \param input buffer holding the input data - * \param output buffer holding the output data - */ -int mbedtls_des_crypt_cbc( mbedtls_des_context *ctx, - int mode, - size_t length, - unsigned char iv[8], - const unsigned char *input, - unsigned char *output ); -#endif /* MBEDTLS_CIPHER_MODE_CBC */ - -/** - * \brief 3DES-ECB block encryption/decryption - * - * \param ctx 3DES context - * \param input 64-bit input block - * \param output 64-bit output block - * - * \return 0 if successful - */ -int mbedtls_des3_crypt_ecb( mbedtls_des3_context *ctx, - const unsigned char input[8], - unsigned char output[8] ); - -#if defined(MBEDTLS_CIPHER_MODE_CBC) -/** - * \brief 3DES-CBC buffer encryption/decryption - * - * \note Upon exit, the content of the IV is updated so that you can - * call the function same function again on the following - * block(s) of data and get the same result as if it was - * encrypted in one call. This allows a "streaming" usage. - * If on the other hand you need to retain the contents of the - * IV, you should either save it manually or use the cipher - * module instead. - * - * \param ctx 3DES context - * \param mode MBEDTLS_DES_ENCRYPT or MBEDTLS_DES_DECRYPT - * \param length length of the input data - * \param iv initialization vector (updated after use) - * \param input buffer holding the input data - * \param output buffer holding the output data - * - * \return 0 if successful, or MBEDTLS_ERR_DES_INVALID_INPUT_LENGTH - */ -int mbedtls_des3_crypt_cbc( mbedtls_des3_context *ctx, - int mode, - size_t length, - unsigned char iv[8], - const unsigned char *input, - unsigned char *output ); -#endif /* MBEDTLS_CIPHER_MODE_CBC */ - -/** - * \brief Internal function for key expansion. - * (Only exposed to allow overriding it, - * see MBEDTLS_DES_SETKEY_ALT) - * - * \param SK Round keys - * \param key Base key - */ -void mbedtls_des_setkey( uint32_t SK[32], - const unsigned char key[MBEDTLS_DES_KEY_SIZE] ); -#ifdef __cplusplus -} -#endif - -#else /* MBEDTLS_DES_ALT */ -#include "des_alt.h" -#endif /* MBEDTLS_DES_ALT */ - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * \brief Checkup routine - * - * \return 0 if successful, or 1 if the test failed - */ -int mbedtls_des_self_test( int verbose ); - -#ifdef __cplusplus -} -#endif - -#endif /* des.h */ diff --git a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/dhm.h b/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/dhm.h deleted file mode 100644 index cd056d1b..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/dhm.h +++ /dev/null @@ -1,305 +0,0 @@ -/** - * \file dhm.h - * - * \brief Diffie-Hellman-Merkle key exchange - * - * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * This file is part of mbed TLS (https://tls.mbed.org) - */ -#ifndef MBEDTLS_DHM_H -#define MBEDTLS_DHM_H - -#include "bignum.h" - -/* - * DHM Error codes - */ -#define MBEDTLS_ERR_DHM_BAD_INPUT_DATA -0x3080 /**< Bad input parameters to function. */ -#define MBEDTLS_ERR_DHM_READ_PARAMS_FAILED -0x3100 /**< Reading of the DHM parameters failed. */ -#define MBEDTLS_ERR_DHM_MAKE_PARAMS_FAILED -0x3180 /**< Making of the DHM parameters failed. */ -#define MBEDTLS_ERR_DHM_READ_PUBLIC_FAILED -0x3200 /**< Reading of the public values failed. */ -#define MBEDTLS_ERR_DHM_MAKE_PUBLIC_FAILED -0x3280 /**< Making of the public value failed. */ -#define MBEDTLS_ERR_DHM_CALC_SECRET_FAILED -0x3300 /**< Calculation of the DHM secret failed. */ -#define MBEDTLS_ERR_DHM_INVALID_FORMAT -0x3380 /**< The ASN.1 data is not formatted correctly. */ -#define MBEDTLS_ERR_DHM_ALLOC_FAILED -0x3400 /**< Allocation of memory failed. */ -#define MBEDTLS_ERR_DHM_FILE_IO_ERROR -0x3480 /**< Read/write of file failed. */ - -/** - * RFC 3526 defines a number of standardized Diffie-Hellman groups - * for IKE. - * RFC 5114 defines a number of standardized Diffie-Hellman groups - * that can be used. - * - * Some are included here for convenience. - * - * Included are: - * RFC 3526 3. 2048-bit MODP Group - * RFC 3526 4. 3072-bit MODP Group - * RFC 3526 5. 4096-bit MODP Group - * RFC 5114 2.2. 2048-bit MODP Group with 224-bit Prime Order Subgroup - */ -#define MBEDTLS_DHM_RFC3526_MODP_2048_P \ - "FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD1" \ - "29024E088A67CC74020BBEA63B139B22514A08798E3404DD" \ - "EF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245" \ - "E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7ED" \ - "EE386BFB5A899FA5AE9F24117C4B1FE649286651ECE45B3D" \ - "C2007CB8A163BF0598DA48361C55D39A69163FA8FD24CF5F" \ - "83655D23DCA3AD961C62F356208552BB9ED529077096966D" \ - "670C354E4ABC9804F1746C08CA18217C32905E462E36CE3B" \ - "E39E772C180E86039B2783A2EC07A28FB5C55DF06F4C52C9" \ - "DE2BCBF6955817183995497CEA956AE515D2261898FA0510" \ - "15728E5A8AACAA68FFFFFFFFFFFFFFFF" - -#define MBEDTLS_DHM_RFC3526_MODP_2048_G "02" - -#define MBEDTLS_DHM_RFC3526_MODP_3072_P \ - "FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD1" \ - "29024E088A67CC74020BBEA63B139B22514A08798E3404DD" \ - "EF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245" \ - "E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7ED" \ - "EE386BFB5A899FA5AE9F24117C4B1FE649286651ECE45B3D" \ - "C2007CB8A163BF0598DA48361C55D39A69163FA8FD24CF5F" \ - "83655D23DCA3AD961C62F356208552BB9ED529077096966D" \ - "670C354E4ABC9804F1746C08CA18217C32905E462E36CE3B" \ - "E39E772C180E86039B2783A2EC07A28FB5C55DF06F4C52C9" \ - "DE2BCBF6955817183995497CEA956AE515D2261898FA0510" \ - "15728E5A8AAAC42DAD33170D04507A33A85521ABDF1CBA64" \ - "ECFB850458DBEF0A8AEA71575D060C7DB3970F85A6E1E4C7" \ - "ABF5AE8CDB0933D71E8C94E04A25619DCEE3D2261AD2EE6B" \ - "F12FFA06D98A0864D87602733EC86A64521F2B18177B200C" \ - "BBE117577A615D6C770988C0BAD946E208E24FA074E5AB31" \ - "43DB5BFCE0FD108E4B82D120A93AD2CAFFFFFFFFFFFFFFFF" - -#define MBEDTLS_DHM_RFC3526_MODP_3072_G "02" - -#define MBEDTLS_DHM_RFC3526_MODP_4096_P \ - "FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD1" \ - "29024E088A67CC74020BBEA63B139B22514A08798E3404DD" \ - "EF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245" \ - "E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7ED" \ - "EE386BFB5A899FA5AE9F24117C4B1FE649286651ECE45B3D" \ - "C2007CB8A163BF0598DA48361C55D39A69163FA8FD24CF5F" \ - "83655D23DCA3AD961C62F356208552BB9ED529077096966D" \ - "670C354E4ABC9804F1746C08CA18217C32905E462E36CE3B" \ - "E39E772C180E86039B2783A2EC07A28FB5C55DF06F4C52C9" \ - "DE2BCBF6955817183995497CEA956AE515D2261898FA0510" \ - "15728E5A8AAAC42DAD33170D04507A33A85521ABDF1CBA64" \ - "ECFB850458DBEF0A8AEA71575D060C7DB3970F85A6E1E4C7" \ - "ABF5AE8CDB0933D71E8C94E04A25619DCEE3D2261AD2EE6B" \ - "F12FFA06D98A0864D87602733EC86A64521F2B18177B200C" \ - "BBE117577A615D6C770988C0BAD946E208E24FA074E5AB31" \ - "43DB5BFCE0FD108E4B82D120A92108011A723C12A787E6D7" \ - "88719A10BDBA5B2699C327186AF4E23C1A946834B6150BDA" \ - "2583E9CA2AD44CE8DBBBC2DB04DE8EF92E8EFC141FBECAA6" \ - "287C59474E6BC05D99B2964FA090C3A2233BA186515BE7ED" \ - "1F612970CEE2D7AFB81BDD762170481CD0069127D5B05AA9" \ - "93B4EA988D8FDDC186FFB7DC90A6C08F4DF435C934063199" \ - "FFFFFFFFFFFFFFFF" - -#define MBEDTLS_DHM_RFC3526_MODP_4096_G "02" - -#define MBEDTLS_DHM_RFC5114_MODP_2048_P \ - "AD107E1E9123A9D0D660FAA79559C51FA20D64E5683B9FD1" \ - "B54B1597B61D0A75E6FA141DF95A56DBAF9A3C407BA1DF15" \ - "EB3D688A309C180E1DE6B85A1274A0A66D3F8152AD6AC212" \ - "9037C9EDEFDA4DF8D91E8FEF55B7394B7AD5B7D0B6C12207" \ - "C9F98D11ED34DBF6C6BA0B2C8BBC27BE6A00E0A0B9C49708" \ - "B3BF8A317091883681286130BC8985DB1602E714415D9330" \ - "278273C7DE31EFDC7310F7121FD5A07415987D9ADC0A486D" \ - "CDF93ACC44328387315D75E198C641A480CD86A1B9E587E8" \ - "BE60E69CC928B2B9C52172E413042E9B23F10B0E16E79763" \ - "C9B53DCF4BA80A29E3FB73C16B8E75B97EF363E2FFA31F71" \ - "CF9DE5384E71B81C0AC4DFFE0C10E64F" - -#define MBEDTLS_DHM_RFC5114_MODP_2048_G \ - "AC4032EF4F2D9AE39DF30B5C8FFDAC506CDEBE7B89998CAF"\ - "74866A08CFE4FFE3A6824A4E10B9A6F0DD921F01A70C4AFA"\ - "AB739D7700C29F52C57DB17C620A8652BE5E9001A8D66AD7"\ - "C17669101999024AF4D027275AC1348BB8A762D0521BC98A"\ - "E247150422EA1ED409939D54DA7460CDB5F6C6B250717CBE"\ - "F180EB34118E98D119529A45D6F834566E3025E316A330EF"\ - "BB77A86F0C1AB15B051AE3D428C8F8ACB70A8137150B8EEB"\ - "10E183EDD19963DDD9E263E4770589EF6AA21E7F5F2FF381"\ - "B539CCE3409D13CD566AFBB48D6C019181E1BCFE94B30269"\ - "EDFE72FE9B6AA4BD7B5A0F1C71CFFF4C19C418E1F6EC0179"\ - "81BC087F2A7065B384B890D3191F2BFA" - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * \brief DHM context structure - */ -typedef struct -{ - size_t len; /*!< size(P) in chars */ - mbedtls_mpi P; /*!< prime modulus */ - mbedtls_mpi G; /*!< generator */ - mbedtls_mpi X; /*!< secret value */ - mbedtls_mpi GX; /*!< self = G^X mod P */ - mbedtls_mpi GY; /*!< peer = G^Y mod P */ - mbedtls_mpi K; /*!< key = GY^X mod P */ - mbedtls_mpi RP; /*!< cached R^2 mod P */ - mbedtls_mpi Vi; /*!< blinding value */ - mbedtls_mpi Vf; /*!< un-blinding value */ - mbedtls_mpi pX; /*!< previous X */ -} -mbedtls_dhm_context; - -/** - * \brief Initialize DHM context - * - * \param ctx DHM context to be initialized - */ -void mbedtls_dhm_init( mbedtls_dhm_context *ctx ); - -/** - * \brief Parse the ServerKeyExchange parameters - * - * \param ctx DHM context - * \param p &(start of input buffer) - * \param end end of buffer - * - * \return 0 if successful, or an MBEDTLS_ERR_DHM_XXX error code - */ -int mbedtls_dhm_read_params( mbedtls_dhm_context *ctx, - unsigned char **p, - const unsigned char *end ); - -/** - * \brief Setup and write the ServerKeyExchange parameters - * - * \param ctx DHM context - * \param x_size private value size in bytes - * \param output destination buffer - * \param olen number of chars written - * \param f_rng RNG function - * \param p_rng RNG parameter - * - * \note This function assumes that ctx->P and ctx->G - * have already been properly set (for example - * using mbedtls_mpi_read_string or mbedtls_mpi_read_binary). - * - * \return 0 if successful, or an MBEDTLS_ERR_DHM_XXX error code - */ -int mbedtls_dhm_make_params( mbedtls_dhm_context *ctx, int x_size, - unsigned char *output, size_t *olen, - int (*f_rng)(void *, unsigned char *, size_t), - void *p_rng ); - -/** - * \brief Import the peer's public value G^Y - * - * \param ctx DHM context - * \param input input buffer - * \param ilen size of buffer - * - * \return 0 if successful, or an MBEDTLS_ERR_DHM_XXX error code - */ -int mbedtls_dhm_read_public( mbedtls_dhm_context *ctx, - const unsigned char *input, size_t ilen ); - -/** - * \brief Create own private value X and export G^X - * - * \param ctx DHM context - * \param x_size private value size in bytes - * \param output destination buffer - * \param olen must be equal to ctx->P.len - * \param f_rng RNG function - * \param p_rng RNG parameter - * - * \return 0 if successful, or an MBEDTLS_ERR_DHM_XXX error code - */ -int mbedtls_dhm_make_public( mbedtls_dhm_context *ctx, int x_size, - unsigned char *output, size_t olen, - int (*f_rng)(void *, unsigned char *, size_t), - void *p_rng ); - -/** - * \brief Derive and export the shared secret (G^Y)^X mod P - * - * \param ctx DHM context - * \param output destination buffer - * \param output_size size of the destination buffer - * \param olen on exit, holds the actual number of bytes written - * \param f_rng RNG function, for blinding purposes - * \param p_rng RNG parameter - * - * \return 0 if successful, or an MBEDTLS_ERR_DHM_XXX error code - * - * \note If non-NULL, f_rng is used to blind the input as - * countermeasure against timing attacks. Blinding is - * automatically used if and only if our secret value X is - * re-used and costs nothing otherwise, so it is recommended - * to always pass a non-NULL f_rng argument. - */ -int mbedtls_dhm_calc_secret( mbedtls_dhm_context *ctx, - unsigned char *output, size_t output_size, size_t *olen, - int (*f_rng)(void *, unsigned char *, size_t), - void *p_rng ); - -/** - * \brief Free and clear the components of a DHM key - * - * \param ctx DHM context to free and clear - */ -void mbedtls_dhm_free( mbedtls_dhm_context *ctx ); - -#if defined(MBEDTLS_ASN1_PARSE_C) -/** \ingroup x509_module */ -/** - * \brief Parse DHM parameters in PEM or DER format - * - * \param dhm DHM context to be initialized - * \param dhmin input buffer - * \param dhminlen size of the buffer - * (including the terminating null byte for PEM data) - * - * \return 0 if successful, or a specific DHM or PEM error code - */ -int mbedtls_dhm_parse_dhm( mbedtls_dhm_context *dhm, const unsigned char *dhmin, - size_t dhminlen ); - -#if defined(MBEDTLS_FS_IO) -/** \ingroup x509_module */ -/** - * \brief Load and parse DHM parameters - * - * \param dhm DHM context to be initialized - * \param path filename to read the DHM Parameters from - * - * \return 0 if successful, or a specific DHM or PEM error code - */ -int mbedtls_dhm_parse_dhmfile( mbedtls_dhm_context *dhm, const char *path ); -#endif /* MBEDTLS_FS_IO */ -#endif /* MBEDTLS_ASN1_PARSE_C */ - -/** - * \brief Checkup routine - * - * \return 0 if successful, or 1 if the test failed - */ -int mbedtls_dhm_self_test( int verbose ); - -#ifdef __cplusplus -} -#endif - -#endif /* dhm.h */ diff --git a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/ecdh.h b/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/ecdh.h deleted file mode 100644 index 625a2819..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/ecdh.h +++ /dev/null @@ -1,214 +0,0 @@ -/** - * \file ecdh.h - * - * \brief Elliptic curve Diffie-Hellman - * - * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * This file is part of mbed TLS (https://tls.mbed.org) - */ -#ifndef MBEDTLS_ECDH_H -#define MBEDTLS_ECDH_H - -#include "ecp.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * When importing from an EC key, select if it is our key or the peer's key - */ -typedef enum -{ - MBEDTLS_ECDH_OURS, - MBEDTLS_ECDH_THEIRS, -} mbedtls_ecdh_side; - -/** - * \brief ECDH context structure - */ -typedef struct -{ - mbedtls_ecp_group grp; /*!< elliptic curve used */ - mbedtls_mpi d; /*!< our secret value (private key) */ - mbedtls_ecp_point Q; /*!< our public value (public key) */ - mbedtls_ecp_point Qp; /*!< peer's public value (public key) */ - mbedtls_mpi z; /*!< shared secret */ - int point_format; /*!< format for point export in TLS messages */ - mbedtls_ecp_point Vi; /*!< blinding value (for later) */ - mbedtls_ecp_point Vf; /*!< un-blinding value (for later) */ - mbedtls_mpi _d; /*!< previous d (for later) */ -} -mbedtls_ecdh_context; - -/** - * \brief Generate a public key. - * Raw function that only does the core computation. - * - * \param grp ECP group - * \param d Destination MPI (secret exponent, aka private key) - * \param Q Destination point (public key) - * \param f_rng RNG function - * \param p_rng RNG parameter - * - * \return 0 if successful, - * or a MBEDTLS_ERR_ECP_XXX or MBEDTLS_MPI_XXX error code - */ -int mbedtls_ecdh_gen_public( mbedtls_ecp_group *grp, mbedtls_mpi *d, mbedtls_ecp_point *Q, - int (*f_rng)(void *, unsigned char *, size_t), - void *p_rng ); - -/** - * \brief Compute shared secret - * Raw function that only does the core computation. - * - * \param grp ECP group - * \param z Destination MPI (shared secret) - * \param Q Public key from other party - * \param d Our secret exponent (private key) - * \param f_rng RNG function (see notes) - * \param p_rng RNG parameter - * - * \return 0 if successful, - * or a MBEDTLS_ERR_ECP_XXX or MBEDTLS_MPI_XXX error code - * - * \note If f_rng is not NULL, it is used to implement - * countermeasures against potential elaborate timing - * attacks, see \c mbedtls_ecp_mul() for details. - */ -int mbedtls_ecdh_compute_shared( mbedtls_ecp_group *grp, mbedtls_mpi *z, - const mbedtls_ecp_point *Q, const mbedtls_mpi *d, - int (*f_rng)(void *, unsigned char *, size_t), - void *p_rng ); - -/** - * \brief Initialize context - * - * \param ctx Context to initialize - */ -void mbedtls_ecdh_init( mbedtls_ecdh_context *ctx ); - -/** - * \brief Free context - * - * \param ctx Context to free - */ -void mbedtls_ecdh_free( mbedtls_ecdh_context *ctx ); - -/** - * \brief Generate a public key and a TLS ServerKeyExchange payload. - * (First function used by a TLS server for ECDHE.) - * - * \param ctx ECDH context - * \param olen number of chars written - * \param buf destination buffer - * \param blen length of buffer - * \param f_rng RNG function - * \param p_rng RNG parameter - * - * \note This function assumes that ctx->grp has already been - * properly set (for example using mbedtls_ecp_group_load). - * - * \return 0 if successful, or an MBEDTLS_ERR_ECP_XXX error code - */ -int mbedtls_ecdh_make_params( mbedtls_ecdh_context *ctx, size_t *olen, - unsigned char *buf, size_t blen, - int (*f_rng)(void *, unsigned char *, size_t), - void *p_rng ); - -/** - * \brief Parse and procress a TLS ServerKeyExhange payload. - * (First function used by a TLS client for ECDHE.) - * - * \param ctx ECDH context - * \param buf pointer to start of input buffer - * \param end one past end of buffer - * - * \return 0 if successful, or an MBEDTLS_ERR_ECP_XXX error code - */ -int mbedtls_ecdh_read_params( mbedtls_ecdh_context *ctx, - const unsigned char **buf, const unsigned char *end ); - -/** - * \brief Setup an ECDH context from an EC key. - * (Used by clients and servers in place of the - * ServerKeyEchange for static ECDH: import ECDH parameters - * from a certificate's EC key information.) - * - * \param ctx ECDH constext to set - * \param key EC key to use - * \param side Is it our key (1) or the peer's key (0) ? - * - * \return 0 if successful, or an MBEDTLS_ERR_ECP_XXX error code - */ -int mbedtls_ecdh_get_params( mbedtls_ecdh_context *ctx, const mbedtls_ecp_keypair *key, - mbedtls_ecdh_side side ); - -/** - * \brief Generate a public key and a TLS ClientKeyExchange payload. - * (Second function used by a TLS client for ECDH(E).) - * - * \param ctx ECDH context - * \param olen number of bytes actually written - * \param buf destination buffer - * \param blen size of destination buffer - * \param f_rng RNG function - * \param p_rng RNG parameter - * - * \return 0 if successful, or an MBEDTLS_ERR_ECP_XXX error code - */ -int mbedtls_ecdh_make_public( mbedtls_ecdh_context *ctx, size_t *olen, - unsigned char *buf, size_t blen, - int (*f_rng)(void *, unsigned char *, size_t), - void *p_rng ); - -/** - * \brief Parse and process a TLS ClientKeyExchange payload. - * (Second function used by a TLS server for ECDH(E).) - * - * \param ctx ECDH context - * \param buf start of input buffer - * \param blen length of input buffer - * - * \return 0 if successful, or an MBEDTLS_ERR_ECP_XXX error code - */ -int mbedtls_ecdh_read_public( mbedtls_ecdh_context *ctx, - const unsigned char *buf, size_t blen ); - -/** - * \brief Derive and export the shared secret. - * (Last function used by both TLS client en servers.) - * - * \param ctx ECDH context - * \param olen number of bytes written - * \param buf destination buffer - * \param blen buffer length - * \param f_rng RNG function, see notes for \c mbedtls_ecdh_compute_shared() - * \param p_rng RNG parameter - * - * \return 0 if successful, or an MBEDTLS_ERR_ECP_XXX error code - */ -int mbedtls_ecdh_calc_secret( mbedtls_ecdh_context *ctx, size_t *olen, - unsigned char *buf, size_t blen, - int (*f_rng)(void *, unsigned char *, size_t), - void *p_rng ); - -#ifdef __cplusplus -} -#endif - -#endif /* ecdh.h */ diff --git a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/ecdsa.h b/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/ecdsa.h deleted file mode 100644 index 52827d8d..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/ecdsa.h +++ /dev/null @@ -1,248 +0,0 @@ -/** - * \file ecdsa.h - * - * \brief Elliptic curve DSA - * - * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * This file is part of mbed TLS (https://tls.mbed.org) - */ -#ifndef MBEDTLS_ECDSA_H -#define MBEDTLS_ECDSA_H - -#include "ecp.h" -#include "md.h" - -/* - * RFC 4492 page 20: - * - * Ecdsa-Sig-Value ::= SEQUENCE { - * r INTEGER, - * s INTEGER - * } - * - * Size is at most - * 1 (tag) + 1 (len) + 1 (initial 0) + ECP_MAX_BYTES for each of r and s, - * twice that + 1 (tag) + 2 (len) for the sequence - * (assuming ECP_MAX_BYTES is less than 126 for r and s, - * and less than 124 (total len <= 255) for the sequence) - */ -#if MBEDTLS_ECP_MAX_BYTES > 124 -#error "MBEDTLS_ECP_MAX_BYTES bigger than expected, please fix MBEDTLS_ECDSA_MAX_LEN" -#endif -/** Maximum size of an ECDSA signature in bytes */ -#define MBEDTLS_ECDSA_MAX_LEN ( 3 + 2 * ( 3 + MBEDTLS_ECP_MAX_BYTES ) ) - -/** - * \brief ECDSA context structure - */ -typedef mbedtls_ecp_keypair mbedtls_ecdsa_context; - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * \brief Compute ECDSA signature of a previously hashed message - * - * \note The deterministic version is usually prefered. - * - * \param grp ECP group - * \param r First output integer - * \param s Second output integer - * \param d Private signing key - * \param buf Message hash - * \param blen Length of buf - * \param f_rng RNG function - * \param p_rng RNG parameter - * - * \return 0 if successful, - * or a MBEDTLS_ERR_ECP_XXX or MBEDTLS_MPI_XXX error code - */ -int mbedtls_ecdsa_sign( mbedtls_ecp_group *grp, mbedtls_mpi *r, mbedtls_mpi *s, - const mbedtls_mpi *d, const unsigned char *buf, size_t blen, - int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ); - -#if defined(MBEDTLS_ECDSA_DETERMINISTIC) -/** - * \brief Compute ECDSA signature of a previously hashed message, - * deterministic version (RFC 6979). - * - * \param grp ECP group - * \param r First output integer - * \param s Second output integer - * \param d Private signing key - * \param buf Message hash - * \param blen Length of buf - * \param md_alg MD algorithm used to hash the message - * - * \return 0 if successful, - * or a MBEDTLS_ERR_ECP_XXX or MBEDTLS_MPI_XXX error code - */ -int mbedtls_ecdsa_sign_det( mbedtls_ecp_group *grp, mbedtls_mpi *r, mbedtls_mpi *s, - const mbedtls_mpi *d, const unsigned char *buf, size_t blen, - mbedtls_md_type_t md_alg ); -#endif /* MBEDTLS_ECDSA_DETERMINISTIC */ - -/** - * \brief Verify ECDSA signature of a previously hashed message - * - * \param grp ECP group - * \param buf Message hash - * \param blen Length of buf - * \param Q Public key to use for verification - * \param r First integer of the signature - * \param s Second integer of the signature - * - * \return 0 if successful, - * MBEDTLS_ERR_ECP_BAD_INPUT_DATA if signature is invalid - * or a MBEDTLS_ERR_ECP_XXX or MBEDTLS_MPI_XXX error code - */ -int mbedtls_ecdsa_verify( mbedtls_ecp_group *grp, - const unsigned char *buf, size_t blen, - const mbedtls_ecp_point *Q, const mbedtls_mpi *r, const mbedtls_mpi *s); - -/** - * \brief Compute ECDSA signature and write it to buffer, - * serialized as defined in RFC 4492 page 20. - * (Not thread-safe to use same context in multiple threads) - * - * \note The deterministice version (RFC 6979) is used if - * MBEDTLS_ECDSA_DETERMINISTIC is defined. - * - * \param ctx ECDSA context - * \param md_alg Algorithm that was used to hash the message - * \param hash Message hash - * \param hlen Length of hash - * \param sig Buffer that will hold the signature - * \param slen Length of the signature written - * \param f_rng RNG function - * \param p_rng RNG parameter - * - * \note The "sig" buffer must be at least as large as twice the - * size of the curve used, plus 9 (eg. 73 bytes if a 256-bit - * curve is used). MBEDTLS_ECDSA_MAX_LEN is always safe. - * - * \return 0 if successful, - * or a MBEDTLS_ERR_ECP_XXX, MBEDTLS_ERR_MPI_XXX or - * MBEDTLS_ERR_ASN1_XXX error code - */ -int mbedtls_ecdsa_write_signature( mbedtls_ecdsa_context *ctx, mbedtls_md_type_t md_alg, - const unsigned char *hash, size_t hlen, - unsigned char *sig, size_t *slen, - int (*f_rng)(void *, unsigned char *, size_t), - void *p_rng ); - -#if defined(MBEDTLS_ECDSA_DETERMINISTIC) -#if ! defined(MBEDTLS_DEPRECATED_REMOVED) -#if defined(MBEDTLS_DEPRECATED_WARNING) -#define MBEDTLS_DEPRECATED __attribute__((deprecated)) -#else -#define MBEDTLS_DEPRECATED -#endif -/** - * \brief Compute ECDSA signature and write it to buffer, - * serialized as defined in RFC 4492 page 20. - * Deterministic version, RFC 6979. - * (Not thread-safe to use same context in multiple threads) - * - * \deprecated Superseded by mbedtls_ecdsa_write_signature() in 2.0.0 - * - * \param ctx ECDSA context - * \param hash Message hash - * \param hlen Length of hash - * \param sig Buffer that will hold the signature - * \param slen Length of the signature written - * \param md_alg MD algorithm used to hash the message - * - * \note The "sig" buffer must be at least as large as twice the - * size of the curve used, plus 9 (eg. 73 bytes if a 256-bit - * curve is used). MBEDTLS_ECDSA_MAX_LEN is always safe. - * - * \return 0 if successful, - * or a MBEDTLS_ERR_ECP_XXX, MBEDTLS_ERR_MPI_XXX or - * MBEDTLS_ERR_ASN1_XXX error code - */ -int mbedtls_ecdsa_write_signature_det( mbedtls_ecdsa_context *ctx, - const unsigned char *hash, size_t hlen, - unsigned char *sig, size_t *slen, - mbedtls_md_type_t md_alg ) MBEDTLS_DEPRECATED; -#undef MBEDTLS_DEPRECATED -#endif /* MBEDTLS_DEPRECATED_REMOVED */ -#endif /* MBEDTLS_ECDSA_DETERMINISTIC */ - -/** - * \brief Read and verify an ECDSA signature - * - * \param ctx ECDSA context - * \param hash Message hash - * \param hlen Size of hash - * \param sig Signature to read and verify - * \param slen Size of sig - * - * \return 0 if successful, - * MBEDTLS_ERR_ECP_BAD_INPUT_DATA if signature is invalid, - * MBEDTLS_ERR_ECP_SIG_LEN_MISMATCH if the signature is - * valid but its actual length is less than siglen, - * or a MBEDTLS_ERR_ECP_XXX or MBEDTLS_ERR_MPI_XXX error code - */ -int mbedtls_ecdsa_read_signature( mbedtls_ecdsa_context *ctx, - const unsigned char *hash, size_t hlen, - const unsigned char *sig, size_t slen ); - -/** - * \brief Generate an ECDSA keypair on the given curve - * - * \param ctx ECDSA context in which the keypair should be stored - * \param gid Group (elliptic curve) to use. One of the various - * MBEDTLS_ECP_DP_XXX macros depending on configuration. - * \param f_rng RNG function - * \param p_rng RNG parameter - * - * \return 0 on success, or a MBEDTLS_ERR_ECP_XXX code. - */ -int mbedtls_ecdsa_genkey( mbedtls_ecdsa_context *ctx, mbedtls_ecp_group_id gid, - int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ); - -/** - * \brief Set an ECDSA context from an EC key pair - * - * \param ctx ECDSA context to set - * \param key EC key to use - * - * \return 0 on success, or a MBEDTLS_ERR_ECP_XXX code. - */ -int mbedtls_ecdsa_from_keypair( mbedtls_ecdsa_context *ctx, const mbedtls_ecp_keypair *key ); - -/** - * \brief Initialize context - * - * \param ctx Context to initialize - */ -void mbedtls_ecdsa_init( mbedtls_ecdsa_context *ctx ); - -/** - * \brief Free context - * - * \param ctx Context to free - */ -void mbedtls_ecdsa_free( mbedtls_ecdsa_context *ctx ); - -#ifdef __cplusplus -} -#endif - -#endif /* ecdsa.h */ diff --git a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/ecp.h b/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/ecp.h deleted file mode 100644 index 723e46c9..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/ecp.h +++ /dev/null @@ -1,631 +0,0 @@ -/** - * \file ecp.h - * - * \brief Elliptic curves over GF(p) - * - * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * This file is part of mbed TLS (https://tls.mbed.org) - */ -#ifndef MBEDTLS_ECP_H -#define MBEDTLS_ECP_H - -#include "bignum.h" - -/* - * ECP error codes - */ -#define MBEDTLS_ERR_ECP_BAD_INPUT_DATA -0x4F80 /**< Bad input parameters to function. */ -#define MBEDTLS_ERR_ECP_BUFFER_TOO_SMALL -0x4F00 /**< The buffer is too small to write to. */ -#define MBEDTLS_ERR_ECP_FEATURE_UNAVAILABLE -0x4E80 /**< Requested curve not available. */ -#define MBEDTLS_ERR_ECP_VERIFY_FAILED -0x4E00 /**< The signature is not valid. */ -#define MBEDTLS_ERR_ECP_ALLOC_FAILED -0x4D80 /**< Memory allocation failed. */ -#define MBEDTLS_ERR_ECP_RANDOM_FAILED -0x4D00 /**< Generation of random value, such as (ephemeral) key, failed. */ -#define MBEDTLS_ERR_ECP_INVALID_KEY -0x4C80 /**< Invalid private or public key. */ -#define MBEDTLS_ERR_ECP_SIG_LEN_MISMATCH -0x4C00 /**< Signature is valid but shorter than the user-supplied length. */ - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * Domain parameters (curve, subgroup and generator) identifiers. - * - * Only curves over prime fields are supported. - * - * \warning This library does not support validation of arbitrary domain - * parameters. Therefore, only well-known domain parameters from trusted - * sources should be used. See mbedtls_ecp_group_load(). - */ -typedef enum -{ - MBEDTLS_ECP_DP_NONE = 0, - MBEDTLS_ECP_DP_SECP192R1, /*!< 192-bits NIST curve */ - MBEDTLS_ECP_DP_SECP224R1, /*!< 224-bits NIST curve */ - MBEDTLS_ECP_DP_SECP256R1, /*!< 256-bits NIST curve */ - MBEDTLS_ECP_DP_SECP384R1, /*!< 384-bits NIST curve */ - MBEDTLS_ECP_DP_SECP521R1, /*!< 521-bits NIST curve */ - MBEDTLS_ECP_DP_BP256R1, /*!< 256-bits Brainpool curve */ - MBEDTLS_ECP_DP_BP384R1, /*!< 384-bits Brainpool curve */ - MBEDTLS_ECP_DP_BP512R1, /*!< 512-bits Brainpool curve */ - MBEDTLS_ECP_DP_CURVE25519, /*!< Curve25519 */ - MBEDTLS_ECP_DP_SECP192K1, /*!< 192-bits "Koblitz" curve */ - MBEDTLS_ECP_DP_SECP224K1, /*!< 224-bits "Koblitz" curve */ - MBEDTLS_ECP_DP_SECP256K1, /*!< 256-bits "Koblitz" curve */ -} mbedtls_ecp_group_id; - -/** - * Number of supported curves (plus one for NONE). - * - * (Montgomery curves excluded for now.) - */ -#define MBEDTLS_ECP_DP_MAX 12 - -/** - * Curve information for use by other modules - */ -typedef struct -{ - mbedtls_ecp_group_id grp_id; /*!< Internal identifier */ - uint16_t tls_id; /*!< TLS NamedCurve identifier */ - uint16_t bit_size; /*!< Curve size in bits */ - const char *name; /*!< Human-friendly name */ -} mbedtls_ecp_curve_info; - -/** - * \brief ECP point structure (jacobian coordinates) - * - * \note All functions expect and return points satisfying - * the following condition: Z == 0 or Z == 1. (Other - * values of Z are used by internal functions only.) - * The point is zero, or "at infinity", if Z == 0. - * Otherwise, X and Y are its standard (affine) coordinates. - */ -typedef struct -{ - mbedtls_mpi X; /*!< the point's X coordinate */ - mbedtls_mpi Y; /*!< the point's Y coordinate */ - mbedtls_mpi Z; /*!< the point's Z coordinate */ -} -mbedtls_ecp_point; - -/** - * \brief ECP group structure - * - * We consider two types of curves equations: - * 1. Short Weierstrass y^2 = x^3 + A x + B mod P (SEC1 + RFC 4492) - * 2. Montgomery, y^2 = x^3 + A x^2 + x mod P (Curve25519 + draft) - * In both cases, a generator G for a prime-order subgroup is fixed. In the - * short weierstrass, this subgroup is actually the whole curve, and its - * cardinal is denoted by N. - * - * In the case of Short Weierstrass curves, our code requires that N is an odd - * prime. (Use odd in mbedtls_ecp_mul() and prime in mbedtls_ecdsa_sign() for blinding.) - * - * In the case of Montgomery curves, we don't store A but (A + 2) / 4 which is - * the quantity actually used in the formulas. Also, nbits is not the size of N - * but the required size for private keys. - * - * If modp is NULL, reduction modulo P is done using a generic algorithm. - * Otherwise, it must point to a function that takes an mbedtls_mpi in the range - * 0..2^(2*pbits)-1 and transforms it in-place in an integer of little more - * than pbits, so that the integer may be efficiently brought in the 0..P-1 - * range by a few additions or substractions. It must return 0 on success and - * non-zero on failure. - */ -typedef struct -{ - mbedtls_ecp_group_id id; /*!< internal group identifier */ - mbedtls_mpi P; /*!< prime modulus of the base field */ - mbedtls_mpi A; /*!< 1. A in the equation, or 2. (A + 2) / 4 */ - mbedtls_mpi B; /*!< 1. B in the equation, or 2. unused */ - mbedtls_ecp_point G; /*!< generator of the (sub)group used */ - mbedtls_mpi N; /*!< 1. the order of G, or 2. unused */ - size_t pbits; /*!< number of bits in P */ - size_t nbits; /*!< number of bits in 1. P, or 2. private keys */ - unsigned int h; /*!< internal: 1 if the constants are static */ - int (*modp)(mbedtls_mpi *); /*!< function for fast reduction mod P */ - int (*t_pre)(mbedtls_ecp_point *, void *); /*!< unused */ - int (*t_post)(mbedtls_ecp_point *, void *); /*!< unused */ - void *t_data; /*!< unused */ - mbedtls_ecp_point *T; /*!< pre-computed points for ecp_mul_comb() */ - size_t T_size; /*!< number for pre-computed points */ -} -mbedtls_ecp_group; - -/** - * \brief ECP key pair structure - * - * A generic key pair that could be used for ECDSA, fixed ECDH, etc. - * - * \note Members purposefully in the same order as struc mbedtls_ecdsa_context. - */ -typedef struct -{ - mbedtls_ecp_group grp; /*!< Elliptic curve and base point */ - mbedtls_mpi d; /*!< our secret value */ - mbedtls_ecp_point Q; /*!< our public value */ -} -mbedtls_ecp_keypair; - -/** - * \name SECTION: Module settings - * - * The configuration options you can set for this module are in this section. - * Either change them in config.h or define them on the compiler command line. - * \{ - */ - -#if !defined(MBEDTLS_ECP_MAX_BITS) -/** - * Maximum size of the groups (that is, of N and P) - */ -#define MBEDTLS_ECP_MAX_BITS 521 /**< Maximum bit size of groups */ -#endif - -#define MBEDTLS_ECP_MAX_BYTES ( ( MBEDTLS_ECP_MAX_BITS + 7 ) / 8 ) -#define MBEDTLS_ECP_MAX_PT_LEN ( 2 * MBEDTLS_ECP_MAX_BYTES + 1 ) - -#if !defined(MBEDTLS_ECP_WINDOW_SIZE) -/* - * Maximum "window" size used for point multiplication. - * Default: 6. - * Minimum value: 2. Maximum value: 7. - * - * Result is an array of at most ( 1 << ( MBEDTLS_ECP_WINDOW_SIZE - 1 ) ) - * points used for point multiplication. This value is directly tied to EC - * peak memory usage, so decreasing it by one should roughly cut memory usage - * by two (if large curves are in use). - * - * Reduction in size may reduce speed, but larger curves are impacted first. - * Sample performances (in ECDHE handshakes/s, with FIXED_POINT_OPTIM = 1): - * w-size: 6 5 4 3 2 - * 521 145 141 135 120 97 - * 384 214 209 198 177 146 - * 256 320 320 303 262 226 - - * 224 475 475 453 398 342 - * 192 640 640 633 587 476 - */ -#define MBEDTLS_ECP_WINDOW_SIZE 6 /**< Maximum window size used */ -#endif /* MBEDTLS_ECP_WINDOW_SIZE */ - -#if !defined(MBEDTLS_ECP_FIXED_POINT_OPTIM) -/* - * Trade memory for speed on fixed-point multiplication. - * - * This speeds up repeated multiplication of the generator (that is, the - * multiplication in ECDSA signatures, and half of the multiplications in - * ECDSA verification and ECDHE) by a factor roughly 3 to 4. - * - * The cost is increasing EC peak memory usage by a factor roughly 2. - * - * Change this value to 0 to reduce peak memory usage. - */ -#define MBEDTLS_ECP_FIXED_POINT_OPTIM 1 /**< Enable fixed-point speed-up */ -#endif /* MBEDTLS_ECP_FIXED_POINT_OPTIM */ - -/* \} name SECTION: Module settings */ - -/* - * Point formats, from RFC 4492's enum ECPointFormat - */ -#define MBEDTLS_ECP_PF_UNCOMPRESSED 0 /**< Uncompressed point format */ -#define MBEDTLS_ECP_PF_COMPRESSED 1 /**< Compressed point format */ - -/* - * Some other constants from RFC 4492 - */ -#define MBEDTLS_ECP_TLS_NAMED_CURVE 3 /**< ECCurveType's named_curve */ - -/** - * \brief Get the list of supported curves in order of preferrence - * (full information) - * - * \return A statically allocated array, the last entry is 0. - */ -const mbedtls_ecp_curve_info *mbedtls_ecp_curve_list( void ); - -/** - * \brief Get the list of supported curves in order of preferrence - * (grp_id only) - * - * \return A statically allocated array, - * terminated with MBEDTLS_ECP_DP_NONE. - */ -const mbedtls_ecp_group_id *mbedtls_ecp_grp_id_list( void ); - -/** - * \brief Get curve information from an internal group identifier - * - * \param grp_id A MBEDTLS_ECP_DP_XXX value - * - * \return The associated curve information or NULL - */ -const mbedtls_ecp_curve_info *mbedtls_ecp_curve_info_from_grp_id( mbedtls_ecp_group_id grp_id ); - -/** - * \brief Get curve information from a TLS NamedCurve value - * - * \param tls_id A MBEDTLS_ECP_DP_XXX value - * - * \return The associated curve information or NULL - */ -const mbedtls_ecp_curve_info *mbedtls_ecp_curve_info_from_tls_id( uint16_t tls_id ); - -/** - * \brief Get curve information from a human-readable name - * - * \param name The name - * - * \return The associated curve information or NULL - */ -const mbedtls_ecp_curve_info *mbedtls_ecp_curve_info_from_name( const char *name ); - -/** - * \brief Initialize a point (as zero) - */ -void mbedtls_ecp_point_init( mbedtls_ecp_point *pt ); - -/** - * \brief Initialize a group (to something meaningless) - */ -void mbedtls_ecp_group_init( mbedtls_ecp_group *grp ); - -/** - * \brief Initialize a key pair (as an invalid one) - */ -void mbedtls_ecp_keypair_init( mbedtls_ecp_keypair *key ); - -/** - * \brief Free the components of a point - */ -void mbedtls_ecp_point_free( mbedtls_ecp_point *pt ); - -/** - * \brief Free the components of an ECP group - */ -void mbedtls_ecp_group_free( mbedtls_ecp_group *grp ); - -/** - * \brief Free the components of a key pair - */ -void mbedtls_ecp_keypair_free( mbedtls_ecp_keypair *key ); - -/** - * \brief Copy the contents of point Q into P - * - * \param P Destination point - * \param Q Source point - * - * \return 0 if successful, - * MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed - */ -int mbedtls_ecp_copy( mbedtls_ecp_point *P, const mbedtls_ecp_point *Q ); - -/** - * \brief Copy the contents of a group object - * - * \param dst Destination group - * \param src Source group - * - * \return 0 if successful, - * MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed - */ -int mbedtls_ecp_group_copy( mbedtls_ecp_group *dst, const mbedtls_ecp_group *src ); - -/** - * \brief Set a point to zero - * - * \param pt Destination point - * - * \return 0 if successful, - * MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed - */ -int mbedtls_ecp_set_zero( mbedtls_ecp_point *pt ); - -/** - * \brief Tell if a point is zero - * - * \param pt Point to test - * - * \return 1 if point is zero, 0 otherwise - */ -int mbedtls_ecp_is_zero( mbedtls_ecp_point *pt ); - -/** - * \brief Import a non-zero point from two ASCII strings - * - * \param P Destination point - * \param radix Input numeric base - * \param x First affine coordinate as a null-terminated string - * \param y Second affine coordinate as a null-terminated string - * - * \return 0 if successful, or a MBEDTLS_ERR_MPI_XXX error code - */ -int mbedtls_ecp_point_read_string( mbedtls_ecp_point *P, int radix, - const char *x, const char *y ); - -/** - * \brief Export a point into unsigned binary data - * - * \param grp Group to which the point should belong - * \param P Point to export - * \param format Point format, should be a MBEDTLS_ECP_PF_XXX macro - * \param olen Length of the actual output - * \param buf Output buffer - * \param buflen Length of the output buffer - * - * \return 0 if successful, - * or MBEDTLS_ERR_ECP_BAD_INPUT_DATA - * or MBEDTLS_ERR_ECP_BUFFER_TOO_SMALL - */ -int mbedtls_ecp_point_write_binary( const mbedtls_ecp_group *grp, const mbedtls_ecp_point *P, - int format, size_t *olen, - unsigned char *buf, size_t buflen ); - -/** - * \brief Import a point from unsigned binary data - * - * \param grp Group to which the point should belong - * \param P Point to import - * \param buf Input buffer - * \param ilen Actual length of input - * - * \return 0 if successful, - * MBEDTLS_ERR_ECP_BAD_INPUT_DATA if input is invalid, - * MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed, - * MBEDTLS_ERR_ECP_FEATURE_UNAVAILABLE if the point format - * is not implemented. - * - * \note This function does NOT check that the point actually - * belongs to the given group, see mbedtls_ecp_check_pubkey() for - * that. - */ -int mbedtls_ecp_point_read_binary( const mbedtls_ecp_group *grp, mbedtls_ecp_point *P, - const unsigned char *buf, size_t ilen ); - -/** - * \brief Import a point from a TLS ECPoint record - * - * \param grp ECP group used - * \param pt Destination point - * \param buf $(Start of input buffer) - * \param len Buffer length - * - * \note buf is updated to point right after the ECPoint on exit - * - * \return 0 if successful, - * MBEDTLS_ERR_MPI_XXX if initialization failed - * MBEDTLS_ERR_ECP_BAD_INPUT_DATA if input is invalid - */ -int mbedtls_ecp_tls_read_point( const mbedtls_ecp_group *grp, mbedtls_ecp_point *pt, - const unsigned char **buf, size_t len ); - -/** - * \brief Export a point as a TLS ECPoint record - * - * \param grp ECP group used - * \param pt Point to export - * \param format Export format - * \param olen length of data written - * \param buf Buffer to write to - * \param blen Buffer length - * - * \return 0 if successful, - * or MBEDTLS_ERR_ECP_BAD_INPUT_DATA - * or MBEDTLS_ERR_ECP_BUFFER_TOO_SMALL - */ -int mbedtls_ecp_tls_write_point( const mbedtls_ecp_group *grp, const mbedtls_ecp_point *pt, - int format, size_t *olen, - unsigned char *buf, size_t blen ); - -/** - * \brief Set a group using well-known domain parameters - * - * \param grp Destination group - * \param index Index in the list of well-known domain parameters - * - * \return 0 if successful, - * MBEDTLS_ERR_MPI_XXX if initialization failed - * MBEDTLS_ERR_ECP_FEATURE_UNAVAILABLE for unkownn groups - * - * \note Index should be a value of RFC 4492's enum NamedCurve, - * usually in the form of a MBEDTLS_ECP_DP_XXX macro. - */ -int mbedtls_ecp_group_load( mbedtls_ecp_group *grp, mbedtls_ecp_group_id index ); - -/** - * \brief Set a group from a TLS ECParameters record - * - * \param grp Destination group - * \param buf &(Start of input buffer) - * \param len Buffer length - * - * \note buf is updated to point right after ECParameters on exit - * - * \return 0 if successful, - * MBEDTLS_ERR_MPI_XXX if initialization failed - * MBEDTLS_ERR_ECP_BAD_INPUT_DATA if input is invalid - */ -int mbedtls_ecp_tls_read_group( mbedtls_ecp_group *grp, const unsigned char **buf, size_t len ); - -/** - * \brief Write the TLS ECParameters record for a group - * - * \param grp ECP group used - * \param olen Number of bytes actually written - * \param buf Buffer to write to - * \param blen Buffer length - * - * \return 0 if successful, - * or MBEDTLS_ERR_ECP_BUFFER_TOO_SMALL - */ -int mbedtls_ecp_tls_write_group( const mbedtls_ecp_group *grp, size_t *olen, - unsigned char *buf, size_t blen ); - -/** - * \brief Multiplication by an integer: R = m * P - * (Not thread-safe to use same group in multiple threads) - * - * \note In order to prevent timing attacks, this function - * executes the exact same sequence of (base field) - * operations for any valid m. It avoids any if-branch or - * array index depending on the value of m. - * - * \note If f_rng is not NULL, it is used to randomize intermediate - * results in order to prevent potential timing attacks - * targeting these results. It is recommended to always - * provide a non-NULL f_rng (the overhead is negligible). - * - * \param grp ECP group - * \param R Destination point - * \param m Integer by which to multiply - * \param P Point to multiply - * \param f_rng RNG function (see notes) - * \param p_rng RNG parameter - * - * \return 0 if successful, - * MBEDTLS_ERR_ECP_INVALID_KEY if m is not a valid privkey - * or P is not a valid pubkey, - * MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed - */ -int mbedtls_ecp_mul( mbedtls_ecp_group *grp, mbedtls_ecp_point *R, - const mbedtls_mpi *m, const mbedtls_ecp_point *P, - int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ); - -/** - * \brief Multiplication and addition of two points by integers: - * R = m * P + n * Q - * (Not thread-safe to use same group in multiple threads) - * - * \note In contrast to mbedtls_ecp_mul(), this function does not guarantee - * a constant execution flow and timing. - * - * \param grp ECP group - * \param R Destination point - * \param m Integer by which to multiply P - * \param P Point to multiply by m - * \param n Integer by which to multiply Q - * \param Q Point to be multiplied by n - * - * \return 0 if successful, - * MBEDTLS_ERR_ECP_INVALID_KEY if m or n is not a valid privkey - * or P or Q is not a valid pubkey, - * MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed - */ -int mbedtls_ecp_muladd( mbedtls_ecp_group *grp, mbedtls_ecp_point *R, - const mbedtls_mpi *m, const mbedtls_ecp_point *P, - const mbedtls_mpi *n, const mbedtls_ecp_point *Q ); - -/** - * \brief Check that a point is a valid public key on this curve - * - * \param grp Curve/group the point should belong to - * \param pt Point to check - * - * \return 0 if point is a valid public key, - * MBEDTLS_ERR_ECP_INVALID_KEY otherwise. - * - * \note This function only checks the point is non-zero, has valid - * coordinates and lies on the curve, but not that it is - * indeed a multiple of G. This is additional check is more - * expensive, isn't required by standards, and shouldn't be - * necessary if the group used has a small cofactor. In - * particular, it is useless for the NIST groups which all - * have a cofactor of 1. - * - * \note Uses bare components rather than an mbedtls_ecp_keypair structure - * in order to ease use with other structures such as - * mbedtls_ecdh_context of mbedtls_ecdsa_context. - */ -int mbedtls_ecp_check_pubkey( const mbedtls_ecp_group *grp, const mbedtls_ecp_point *pt ); - -/** - * \brief Check that an mbedtls_mpi is a valid private key for this curve - * - * \param grp Group used - * \param d Integer to check - * - * \return 0 if point is a valid private key, - * MBEDTLS_ERR_ECP_INVALID_KEY otherwise. - * - * \note Uses bare components rather than an mbedtls_ecp_keypair structure - * in order to ease use with other structures such as - * mbedtls_ecdh_context of mbedtls_ecdsa_context. - */ -int mbedtls_ecp_check_privkey( const mbedtls_ecp_group *grp, const mbedtls_mpi *d ); - -/** - * \brief Generate a keypair - * - * \param grp ECP group - * \param d Destination MPI (secret part) - * \param Q Destination point (public part) - * \param f_rng RNG function - * \param p_rng RNG parameter - * - * \return 0 if successful, - * or a MBEDTLS_ERR_ECP_XXX or MBEDTLS_MPI_XXX error code - * - * \note Uses bare components rather than an mbedtls_ecp_keypair structure - * in order to ease use with other structures such as - * mbedtls_ecdh_context of mbedtls_ecdsa_context. - */ -int mbedtls_ecp_gen_keypair( mbedtls_ecp_group *grp, mbedtls_mpi *d, mbedtls_ecp_point *Q, - int (*f_rng)(void *, unsigned char *, size_t), - void *p_rng ); - -/** - * \brief Generate a keypair - * - * \param grp_id ECP group identifier - * \param key Destination keypair - * \param f_rng RNG function - * \param p_rng RNG parameter - * - * \return 0 if successful, - * or a MBEDTLS_ERR_ECP_XXX or MBEDTLS_MPI_XXX error code - */ -int mbedtls_ecp_gen_key( mbedtls_ecp_group_id grp_id, mbedtls_ecp_keypair *key, - int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ); - -/** - * \brief Check a public-private key pair - * - * \param pub Keypair structure holding a public key - * \param prv Keypair structure holding a private (plus public) key - * - * \return 0 if successful (keys are valid and match), or - * MBEDTLS_ERR_ECP_BAD_INPUT_DATA, or - * a MBEDTLS_ERR_ECP_XXX or MBEDTLS_ERR_MPI_XXX code. - */ -int mbedtls_ecp_check_pub_priv( const mbedtls_ecp_keypair *pub, const mbedtls_ecp_keypair *prv ); - -#if defined(MBEDTLS_SELF_TEST) -/** - * \brief Checkup routine - * - * \return 0 if successful, or 1 if a test failed - */ -int mbedtls_ecp_self_test( int verbose ); -#endif - -#ifdef __cplusplus -} -#endif - -#endif /* ecp.h */ diff --git a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/entropy.h b/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/entropy.h deleted file mode 100644 index 00de9a6e..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/entropy.h +++ /dev/null @@ -1,252 +0,0 @@ -/** - * \file entropy.h - * - * \brief Entropy accumulator implementation - * - * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * This file is part of mbed TLS (https://tls.mbed.org) - */ -#ifndef MBEDTLS_ENTROPY_H -#define MBEDTLS_ENTROPY_H - -#if !defined(MBEDTLS_CONFIG_FILE) -#include "config.h" -#else -#include MBEDTLS_CONFIG_FILE -#endif - -#include - -#if defined(MBEDTLS_SHA512_C) && !defined(MBEDTLS_ENTROPY_FORCE_SHA256) -#include "sha512.h" -#define MBEDTLS_ENTROPY_SHA512_ACCUMULATOR -#else -#if defined(MBEDTLS_SHA256_C) -#define MBEDTLS_ENTROPY_SHA256_ACCUMULATOR -#include "sha256.h" -#endif -#endif - -#if defined(MBEDTLS_THREADING_C) -#include "threading.h" -#endif - -#if defined(MBEDTLS_HAVEGE_C) -#include "havege.h" -#endif - -#define MBEDTLS_ERR_ENTROPY_SOURCE_FAILED -0x003C /**< Critical entropy source failure. */ -#define MBEDTLS_ERR_ENTROPY_MAX_SOURCES -0x003E /**< No more sources can be added. */ -#define MBEDTLS_ERR_ENTROPY_NO_SOURCES_DEFINED -0x0040 /**< No sources have been added to poll. */ -#define MBEDTLS_ERR_ENTROPY_NO_STRONG_SOURCE -0x003D /**< No strong sources have been added to poll. */ -#define MBEDTLS_ERR_ENTROPY_FILE_IO_ERROR -0x003F /**< Read/write error in file. */ - -/** - * \name SECTION: Module settings - * - * The configuration options you can set for this module are in this section. - * Either change them in config.h or define them on the compiler command line. - * \{ - */ - -#if !defined(MBEDTLS_ENTROPY_MAX_SOURCES) -#define MBEDTLS_ENTROPY_MAX_SOURCES 20 /**< Maximum number of sources supported */ -#endif - -#if !defined(MBEDTLS_ENTROPY_MAX_GATHER) -#define MBEDTLS_ENTROPY_MAX_GATHER 128 /**< Maximum amount requested from entropy sources */ -#endif - -/* \} name SECTION: Module settings */ - -#if defined(MBEDTLS_ENTROPY_SHA512_ACCUMULATOR) -#define MBEDTLS_ENTROPY_BLOCK_SIZE 64 /**< Block size of entropy accumulator (SHA-512) */ -#else -#define MBEDTLS_ENTROPY_BLOCK_SIZE 32 /**< Block size of entropy accumulator (SHA-256) */ -#endif - -#define MBEDTLS_ENTROPY_MAX_SEED_SIZE 1024 /**< Maximum size of seed we read from seed file */ -#define MBEDTLS_ENTROPY_SOURCE_MANUAL MBEDTLS_ENTROPY_MAX_SOURCES - -#define MBEDTLS_ENTROPY_SOURCE_STRONG 1 /**< Entropy source is strong */ -#define MBEDTLS_ENTROPY_SOURCE_WEAK 0 /**< Entropy source is weak */ - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * \brief Entropy poll callback pointer - * - * \param data Callback-specific data pointer - * \param output Data to fill - * \param len Maximum size to provide - * \param olen The actual amount of bytes put into the buffer (Can be 0) - * - * \return 0 if no critical failures occurred, - * MBEDTLS_ERR_ENTROPY_SOURCE_FAILED otherwise - */ -typedef int (*mbedtls_entropy_f_source_ptr)(void *data, unsigned char *output, size_t len, - size_t *olen); - -/** - * \brief Entropy source state - */ -typedef struct -{ - mbedtls_entropy_f_source_ptr f_source; /**< The entropy source callback */ - void * p_source; /**< The callback data pointer */ - size_t size; /**< Amount received in bytes */ - size_t threshold; /**< Minimum bytes required before release */ - int strong; /**< Is the source strong? */ -} -mbedtls_entropy_source_state; - -/** - * \brief Entropy context structure - */ -typedef struct -{ -#if defined(MBEDTLS_ENTROPY_SHA512_ACCUMULATOR) - mbedtls_sha512_context accumulator; -#else - mbedtls_sha256_context accumulator; -#endif - int source_count; - mbedtls_entropy_source_state source[MBEDTLS_ENTROPY_MAX_SOURCES]; -#if defined(MBEDTLS_HAVEGE_C) - mbedtls_havege_state havege_data; -#endif -#if defined(MBEDTLS_THREADING_C) - mbedtls_threading_mutex_t mutex; /*!< mutex */ -#endif -} -mbedtls_entropy_context; - -/** - * \brief Initialize the context - * - * \param ctx Entropy context to initialize - */ -void mbedtls_entropy_init( mbedtls_entropy_context *ctx ); - -/** - * \brief Free the data in the context - * - * \param ctx Entropy context to free - */ -void mbedtls_entropy_free( mbedtls_entropy_context *ctx ); - -/** - * \brief Adds an entropy source to poll - * (Thread-safe if MBEDTLS_THREADING_C is enabled) - * - * \param ctx Entropy context - * \param f_source Entropy function - * \param p_source Function data - * \param threshold Minimum required from source before entropy is released - * ( with mbedtls_entropy_func() ) (in bytes) - * \param strong MBEDTLS_ENTROPY_SOURCE_STRONG or - * MBEDTSL_ENTROPY_SOURCE_WEAK. - * At least one strong source needs to be added. - * Weaker sources (such as the cycle counter) can be used as - * a complement. - * - * \return 0 if successful or MBEDTLS_ERR_ENTROPY_MAX_SOURCES - */ -int mbedtls_entropy_add_source( mbedtls_entropy_context *ctx, - mbedtls_entropy_f_source_ptr f_source, void *p_source, - size_t threshold, int strong ); - -/** - * \brief Trigger an extra gather poll for the accumulator - * (Thread-safe if MBEDTLS_THREADING_C is enabled) - * - * \param ctx Entropy context - * - * \return 0 if successful, or MBEDTLS_ERR_ENTROPY_SOURCE_FAILED - */ -int mbedtls_entropy_gather( mbedtls_entropy_context *ctx ); - -/** - * \brief Retrieve entropy from the accumulator - * (Maximum length: MBEDTLS_ENTROPY_BLOCK_SIZE) - * (Thread-safe if MBEDTLS_THREADING_C is enabled) - * - * \param data Entropy context - * \param output Buffer to fill - * \param len Number of bytes desired, must be at most MBEDTLS_ENTROPY_BLOCK_SIZE - * - * \return 0 if successful, or MBEDTLS_ERR_ENTROPY_SOURCE_FAILED - */ -int mbedtls_entropy_func( void *data, unsigned char *output, size_t len ); - -/** - * \brief Add data to the accumulator manually - * (Thread-safe if MBEDTLS_THREADING_C is enabled) - * - * \param ctx Entropy context - * \param data Data to add - * \param len Length of data - * - * \return 0 if successful - */ -int mbedtls_entropy_update_manual( mbedtls_entropy_context *ctx, - const unsigned char *data, size_t len ); - -#if defined(MBEDTLS_FS_IO) -/** - * \brief Write a seed file - * - * \param ctx Entropy context - * \param path Name of the file - * - * \return 0 if successful, - * MBEDTLS_ERR_ENTROPY_FILE_IO_ERROR on file error, or - * MBEDTLS_ERR_ENTROPY_SOURCE_FAILED - */ -int mbedtls_entropy_write_seed_file( mbedtls_entropy_context *ctx, const char *path ); - -/** - * \brief Read and update a seed file. Seed is added to this - * instance. No more than MBEDTLS_ENTROPY_MAX_SEED_SIZE bytes are - * read from the seed file. The rest is ignored. - * - * \param ctx Entropy context - * \param path Name of the file - * - * \return 0 if successful, - * MBEDTLS_ERR_ENTROPY_FILE_IO_ERROR on file error, - * MBEDTLS_ERR_ENTROPY_SOURCE_FAILED - */ -int mbedtls_entropy_update_seed_file( mbedtls_entropy_context *ctx, const char *path ); -#endif /* MBEDTLS_FS_IO */ - -#if defined(MBEDTLS_SELF_TEST) -/** - * \brief Checkup routine - * - * \return 0 if successful, or 1 if a test failed - */ -int mbedtls_entropy_self_test( int verbose ); -#endif /* MBEDTLS_SELF_TEST */ - -#ifdef __cplusplus -} -#endif - -#endif /* entropy.h */ diff --git a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/entropy_poll.h b/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/entropy_poll.h deleted file mode 100644 index dc119113..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/entropy_poll.h +++ /dev/null @@ -1,89 +0,0 @@ -/** - * \file entropy_poll.h - * - * \brief Platform-specific and custom entropy polling functions - * - * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * This file is part of mbed TLS (https://tls.mbed.org) - */ -#ifndef MBEDTLS_ENTROPY_POLL_H -#define MBEDTLS_ENTROPY_POLL_H - -#if !defined(MBEDTLS_CONFIG_FILE) -#include "config.h" -#else -#include MBEDTLS_CONFIG_FILE -#endif - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -/* - * Default thresholds for built-in sources, in bytes - */ -#define MBEDTLS_ENTROPY_MIN_PLATFORM 32 /**< Minimum for platform source */ -#define MBEDTLS_ENTROPY_MIN_HAVEGE 32 /**< Minimum for HAVEGE */ -#define MBEDTLS_ENTROPY_MIN_HARDCLOCK 4 /**< Minimum for mbedtls_timing_hardclock() */ -#define MBEDTLS_ENTROPY_MIN_HARDWARE 32 /**< Minimum for the hardware source */ - -#if !defined(MBEDTLS_NO_PLATFORM_ENTROPY) -/** - * \brief Platform-specific entropy poll callback - */ -int mbedtls_platform_entropy_poll( void *data, - unsigned char *output, size_t len, size_t *olen ); -#endif - -#if defined(MBEDTLS_HAVEGE_C) -/** - * \brief HAVEGE based entropy poll callback - * - * Requires an HAVEGE state as its data pointer. - */ -int mbedtls_havege_poll( void *data, - unsigned char *output, size_t len, size_t *olen ); -#endif - -#if defined(MBEDTLS_TIMING_C) -/** - * \brief mbedtls_timing_hardclock-based entropy poll callback - */ -int mbedtls_hardclock_poll( void *data, - unsigned char *output, size_t len, size_t *olen ); -#endif - -#if defined(MBEDTLS_ENTROPY_HARDWARE_ALT) -/** - * \brief Entropy poll callback for a hardware source - * - * \warning This is not provided by mbed TLS! - * See \c MBEDTLS_ENTROPY_HARDWARE_ALT in config.h. - * - * \note This must accept NULL as its first argument. - */ -int mbedtls_hardware_poll( void *data, - unsigned char *output, size_t len, size_t *olen ); -#endif - -#ifdef __cplusplus -} -#endif - -#endif /* entropy_poll.h */ diff --git a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/error.h b/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/error.h deleted file mode 100644 index a182713d..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/error.h +++ /dev/null @@ -1,107 +0,0 @@ -/** - * \file error.h - * - * \brief Error to string translation - * - * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * This file is part of mbed TLS (https://tls.mbed.org) - */ -#ifndef MBEDTLS_ERROR_H -#define MBEDTLS_ERROR_H - -#include - -/** - * Error code layout. - * - * Currently we try to keep all error codes within the negative space of 16 - * bits signed integers to support all platforms (-0x0001 - -0x7FFF). In - * addition we'd like to give two layers of information on the error if - * possible. - * - * For that purpose the error codes are segmented in the following manner: - * - * 16 bit error code bit-segmentation - * - * 1 bit - Unused (sign bit) - * 3 bits - High level module ID - * 5 bits - Module-dependent error code - * 7 bits - Low level module errors - * - * For historical reasons, low-level error codes are divided in even and odd, - * even codes were assigned first, and -1 is reserved for other errors. - * - * Low-level module errors (0x0002-0x007E, 0x0003-0x007F) - * - * Module Nr Codes assigned - * MPI 7 0x0002-0x0010 - * GCM 2 0x0012-0x0014 - * BLOWFISH 2 0x0016-0x0018 - * THREADING 3 0x001A-0x001E - * AES 2 0x0020-0x0022 - * CAMELLIA 2 0x0024-0x0026 - * XTEA 1 0x0028-0x0028 - * BASE64 2 0x002A-0x002C - * OID 1 0x002E-0x002E 0x000B-0x000B - * PADLOCK 1 0x0030-0x0030 - * DES 1 0x0032-0x0032 - * CTR_DBRG 4 0x0034-0x003A - * ENTROPY 3 0x003C-0x0040 0x003D-0x003F - * NET 11 0x0042-0x0052 0x0043-0x0045 - * ASN1 7 0x0060-0x006C - * PBKDF2 1 0x007C-0x007C - * HMAC_DRBG 4 0x0003-0x0009 - * CCM 2 0x000D-0x000F - * - * High-level module nr (3 bits - 0x0...-0x7...) - * Name ID Nr of Errors - * PEM 1 9 - * PKCS#12 1 4 (Started from top) - * X509 2 19 - * PKCS5 2 4 (Started from top) - * DHM 3 9 - * PK 3 14 (Started from top) - * RSA 4 9 - * ECP 4 8 (Started from top) - * MD 5 4 - * CIPHER 6 6 - * SSL 6 16 (Started from top) - * SSL 7 31 - * - * Module dependent error code (5 bits 0x.00.-0x.F8.) - */ - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * \brief Translate a mbed TLS error code into a string representation, - * Result is truncated if necessary and always includes a terminating - * null byte. - * - * \param errnum error code - * \param buffer buffer to place representation in - * \param buflen length of the buffer - */ -void mbedtls_strerror( int errnum, char *buffer, size_t buflen ); - -#ifdef __cplusplus -} -#endif - -#endif /* error.h */ diff --git a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/gcm.h b/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/gcm.h deleted file mode 100644 index 6743ac9a..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/gcm.h +++ /dev/null @@ -1,220 +0,0 @@ -/** - * \file gcm.h - * - * \brief Galois/Counter mode for 128-bit block ciphers - * - * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * This file is part of mbed TLS (https://tls.mbed.org) - */ -#ifndef MBEDTLS_GCM_H -#define MBEDTLS_GCM_H - -#include "cipher.h" - -#include - -#define MBEDTLS_GCM_ENCRYPT 1 -#define MBEDTLS_GCM_DECRYPT 0 - -#define MBEDTLS_ERR_GCM_AUTH_FAILED -0x0012 /**< Authenticated decryption failed. */ -#define MBEDTLS_ERR_GCM_BAD_INPUT -0x0014 /**< Bad input parameters to function. */ - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * \brief GCM context structure - */ -typedef struct { - mbedtls_cipher_context_t cipher_ctx;/*!< cipher context used */ - uint64_t HL[16]; /*!< Precalculated HTable */ - uint64_t HH[16]; /*!< Precalculated HTable */ - uint64_t len; /*!< Total data length */ - uint64_t add_len; /*!< Total add length */ - unsigned char base_ectr[16];/*!< First ECTR for tag */ - unsigned char y[16]; /*!< Y working value */ - unsigned char buf[16]; /*!< buf working value */ - int mode; /*!< Encrypt or Decrypt */ -} -mbedtls_gcm_context; - -/** - * \brief Initialize GCM context (just makes references valid) - * Makes the context ready for mbedtls_gcm_setkey() or - * mbedtls_gcm_free(). - * - * \param ctx GCM context to initialize - */ -void mbedtls_gcm_init( mbedtls_gcm_context *ctx ); - -/** - * \brief GCM initialization (encryption) - * - * \param ctx GCM context to be initialized - * \param cipher cipher to use (a 128-bit block cipher) - * \param key encryption key - * \param keybits must be 128, 192 or 256 - * - * \return 0 if successful, or a cipher specific error code - */ -int mbedtls_gcm_setkey( mbedtls_gcm_context *ctx, - mbedtls_cipher_id_t cipher, - const unsigned char *key, - unsigned int keybits ); - -/** - * \brief GCM buffer encryption/decryption using a block cipher - * - * \note On encryption, the output buffer can be the same as the input buffer. - * On decryption, the output buffer cannot be the same as input buffer. - * If buffers overlap, the output buffer must trail at least 8 bytes - * behind the input buffer. - * - * \param ctx GCM context - * \param mode MBEDTLS_GCM_ENCRYPT or MBEDTLS_GCM_DECRYPT - * \param length length of the input data - * \param iv initialization vector - * \param iv_len length of IV - * \param add additional data - * \param add_len length of additional data - * \param input buffer holding the input data - * \param output buffer for holding the output data - * \param tag_len length of the tag to generate - * \param tag buffer for holding the tag - * - * \return 0 if successful - */ -int mbedtls_gcm_crypt_and_tag( mbedtls_gcm_context *ctx, - int mode, - size_t length, - const unsigned char *iv, - size_t iv_len, - const unsigned char *add, - size_t add_len, - const unsigned char *input, - unsigned char *output, - size_t tag_len, - unsigned char *tag ); - -/** - * \brief GCM buffer authenticated decryption using a block cipher - * - * \note On decryption, the output buffer cannot be the same as input buffer. - * If buffers overlap, the output buffer must trail at least 8 bytes - * behind the input buffer. - * - * \param ctx GCM context - * \param length length of the input data - * \param iv initialization vector - * \param iv_len length of IV - * \param add additional data - * \param add_len length of additional data - * \param tag buffer holding the tag - * \param tag_len length of the tag - * \param input buffer holding the input data - * \param output buffer for holding the output data - * - * \return 0 if successful and authenticated, - * MBEDTLS_ERR_GCM_AUTH_FAILED if tag does not match - */ -int mbedtls_gcm_auth_decrypt( mbedtls_gcm_context *ctx, - size_t length, - const unsigned char *iv, - size_t iv_len, - const unsigned char *add, - size_t add_len, - const unsigned char *tag, - size_t tag_len, - const unsigned char *input, - unsigned char *output ); - -/** - * \brief Generic GCM stream start function - * - * \param ctx GCM context - * \param mode MBEDTLS_GCM_ENCRYPT or MBEDTLS_GCM_DECRYPT - * \param iv initialization vector - * \param iv_len length of IV - * \param add additional data (or NULL if length is 0) - * \param add_len length of additional data - * - * \return 0 if successful - */ -int mbedtls_gcm_starts( mbedtls_gcm_context *ctx, - int mode, - const unsigned char *iv, - size_t iv_len, - const unsigned char *add, - size_t add_len ); - -/** - * \brief Generic GCM update function. Encrypts/decrypts using the - * given GCM context. Expects input to be a multiple of 16 - * bytes! Only the last call before mbedtls_gcm_finish() can be less - * than 16 bytes! - * - * \note On decryption, the output buffer cannot be the same as input buffer. - * If buffers overlap, the output buffer must trail at least 8 bytes - * behind the input buffer. - * - * \param ctx GCM context - * \param length length of the input data - * \param input buffer holding the input data - * \param output buffer for holding the output data - * - * \return 0 if successful or MBEDTLS_ERR_GCM_BAD_INPUT - */ -int mbedtls_gcm_update( mbedtls_gcm_context *ctx, - size_t length, - const unsigned char *input, - unsigned char *output ); - -/** - * \brief Generic GCM finalisation function. Wraps up the GCM stream - * and generates the tag. The tag can have a maximum length of - * 16 bytes. - * - * \param ctx GCM context - * \param tag buffer for holding the tag (may be NULL if tag_len is 0) - * \param tag_len length of the tag to generate - * - * \return 0 if successful or MBEDTLS_ERR_GCM_BAD_INPUT - */ -int mbedtls_gcm_finish( mbedtls_gcm_context *ctx, - unsigned char *tag, - size_t tag_len ); - -/** - * \brief Free a GCM context and underlying cipher sub-context - * - * \param ctx GCM context to free - */ -void mbedtls_gcm_free( mbedtls_gcm_context *ctx ); - -/** - * \brief Checkup routine - * - * \return 0 if successful, or 1 if the test failed - */ -int mbedtls_gcm_self_test( int verbose ); - -#ifdef __cplusplus -} -#endif - -#endif /* gcm.h */ diff --git a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/havege.h b/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/havege.h deleted file mode 100644 index dac5d311..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/havege.h +++ /dev/null @@ -1,74 +0,0 @@ -/** - * \file havege.h - * - * \brief HAVEGE: HArdware Volatile Entropy Gathering and Expansion - * - * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * This file is part of mbed TLS (https://tls.mbed.org) - */ -#ifndef MBEDTLS_HAVEGE_H -#define MBEDTLS_HAVEGE_H - -#include - -#define MBEDTLS_HAVEGE_COLLECT_SIZE 1024 - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * \brief HAVEGE state structure - */ -typedef struct -{ - int PT1, PT2, offset[2]; - int pool[MBEDTLS_HAVEGE_COLLECT_SIZE]; - int WALK[8192]; -} -mbedtls_havege_state; - -/** - * \brief HAVEGE initialization - * - * \param hs HAVEGE state to be initialized - */ -void mbedtls_havege_init( mbedtls_havege_state *hs ); - -/** - * \brief Clear HAVEGE state - * - * \param hs HAVEGE state to be cleared - */ -void mbedtls_havege_free( mbedtls_havege_state *hs ); - -/** - * \brief HAVEGE rand function - * - * \param p_rng A HAVEGE state - * \param output Buffer to fill - * \param len Length of buffer - * - * \return 0 - */ -int mbedtls_havege_random( void *p_rng, unsigned char *output, size_t len ); - -#ifdef __cplusplus -} -#endif - -#endif /* havege.h */ diff --git a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/hmac_drbg.h b/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/hmac_drbg.h deleted file mode 100644 index e0105580..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/hmac_drbg.h +++ /dev/null @@ -1,299 +0,0 @@ -/** - * \file hmac_drbg.h - * - * \brief HMAC_DRBG (NIST SP 800-90A) - * - * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * This file is part of mbed TLS (https://tls.mbed.org) - */ -#ifndef MBEDTLS_HMAC_DRBG_H -#define MBEDTLS_HMAC_DRBG_H - -#include "md.h" - -#if defined(MBEDTLS_THREADING_C) -#include "mbedtls/threading.h" -#endif - -/* - * Error codes - */ -#define MBEDTLS_ERR_HMAC_DRBG_REQUEST_TOO_BIG -0x0003 /**< Too many random requested in single call. */ -#define MBEDTLS_ERR_HMAC_DRBG_INPUT_TOO_BIG -0x0005 /**< Input too large (Entropy + additional). */ -#define MBEDTLS_ERR_HMAC_DRBG_FILE_IO_ERROR -0x0007 /**< Read/write error in file. */ -#define MBEDTLS_ERR_HMAC_DRBG_ENTROPY_SOURCE_FAILED -0x0009 /**< The entropy source failed. */ - -/** - * \name SECTION: Module settings - * - * The configuration options you can set for this module are in this section. - * Either change them in config.h or define them on the compiler command line. - * \{ - */ - -#if !defined(MBEDTLS_HMAC_DRBG_RESEED_INTERVAL) -#define MBEDTLS_HMAC_DRBG_RESEED_INTERVAL 10000 /**< Interval before reseed is performed by default */ -#endif - -#if !defined(MBEDTLS_HMAC_DRBG_MAX_INPUT) -#define MBEDTLS_HMAC_DRBG_MAX_INPUT 256 /**< Maximum number of additional input bytes */ -#endif - -#if !defined(MBEDTLS_HMAC_DRBG_MAX_REQUEST) -#define MBEDTLS_HMAC_DRBG_MAX_REQUEST 1024 /**< Maximum number of requested bytes per call */ -#endif - -#if !defined(MBEDTLS_HMAC_DRBG_MAX_SEED_INPUT) -#define MBEDTLS_HMAC_DRBG_MAX_SEED_INPUT 384 /**< Maximum size of (re)seed buffer */ -#endif - -/* \} name SECTION: Module settings */ - -#define MBEDTLS_HMAC_DRBG_PR_OFF 0 /**< No prediction resistance */ -#define MBEDTLS_HMAC_DRBG_PR_ON 1 /**< Prediction resistance enabled */ - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * HMAC_DRBG context. - */ -typedef struct -{ - /* Working state: the key K is not stored explicitely, - * but is implied by the HMAC context */ - mbedtls_md_context_t md_ctx; /*!< HMAC context (inc. K) */ - unsigned char V[MBEDTLS_MD_MAX_SIZE]; /*!< V in the spec */ - int reseed_counter; /*!< reseed counter */ - - /* Administrative state */ - size_t entropy_len; /*!< entropy bytes grabbed on each (re)seed */ - int prediction_resistance; /*!< enable prediction resistance (Automatic - reseed before every random generation) */ - int reseed_interval; /*!< reseed interval */ - - /* Callbacks */ - int (*f_entropy)(void *, unsigned char *, size_t); /*!< entropy function */ - void *p_entropy; /*!< context for the entropy function */ - -#if defined(MBEDTLS_THREADING_C) - mbedtls_threading_mutex_t mutex; -#endif -} mbedtls_hmac_drbg_context; - -/** - * \brief HMAC_DRBG context initialization - * Makes the context ready for mbedtls_hmac_drbg_seed(), - * mbedtls_hmac_drbg_seed_buf() or - * mbedtls_hmac_drbg_free(). - * - * \param ctx HMAC_DRBG context to be initialized - */ -void mbedtls_hmac_drbg_init( mbedtls_hmac_drbg_context *ctx ); - -/** - * \brief HMAC_DRBG initial seeding - * Seed and setup entropy source for future reseeds. - * - * \param ctx HMAC_DRBG context to be seeded - * \param md_info MD algorithm to use for HMAC_DRBG - * \param f_entropy Entropy callback (p_entropy, buffer to fill, buffer - * length) - * \param p_entropy Entropy context - * \param custom Personalization data (Device specific identifiers) - * (Can be NULL) - * \param len Length of personalization data - * - * \note The "security strength" as defined by NIST is set to: - * 128 bits if md_alg is SHA-1, - * 192 bits if md_alg is SHA-224, - * 256 bits if md_alg is SHA-256 or higher. - * Note that SHA-256 is just as efficient as SHA-224. - * - * \return 0 if successful, or - * MBEDTLS_ERR_MD_BAD_INPUT_DATA, or - * MBEDTLS_ERR_MD_ALLOC_FAILED, or - * MBEDTLS_ERR_HMAC_DRBG_ENTROPY_SOURCE_FAILED. - */ -int mbedtls_hmac_drbg_seed( mbedtls_hmac_drbg_context *ctx, - const mbedtls_md_info_t * md_info, - int (*f_entropy)(void *, unsigned char *, size_t), - void *p_entropy, - const unsigned char *custom, - size_t len ); - -/** - * \brief Initilisation of simpified HMAC_DRBG (never reseeds). - * (For use with deterministic ECDSA.) - * - * \param ctx HMAC_DRBG context to be initialised - * \param md_info MD algorithm to use for HMAC_DRBG - * \param data Concatenation of entropy string and additional data - * \param data_len Length of data in bytes - * - * \return 0 if successful, or - * MBEDTLS_ERR_MD_BAD_INPUT_DATA, or - * MBEDTLS_ERR_MD_ALLOC_FAILED. - */ -int mbedtls_hmac_drbg_seed_buf( mbedtls_hmac_drbg_context *ctx, - const mbedtls_md_info_t * md_info, - const unsigned char *data, size_t data_len ); - -/** - * \brief Enable / disable prediction resistance (Default: Off) - * - * Note: If enabled, entropy is used for ctx->entropy_len before each call! - * Only use this if you have ample supply of good entropy! - * - * \param ctx HMAC_DRBG context - * \param resistance MBEDTLS_HMAC_DRBG_PR_ON or MBEDTLS_HMAC_DRBG_PR_OFF - */ -void mbedtls_hmac_drbg_set_prediction_resistance( mbedtls_hmac_drbg_context *ctx, - int resistance ); - -/** - * \brief Set the amount of entropy grabbed on each reseed - * (Default: given by the security strength, which - * depends on the hash used, see \c mbedtls_hmac_drbg_init() ) - * - * \param ctx HMAC_DRBG context - * \param len Amount of entropy to grab, in bytes - */ -void mbedtls_hmac_drbg_set_entropy_len( mbedtls_hmac_drbg_context *ctx, - size_t len ); - -/** - * \brief Set the reseed interval - * (Default: MBEDTLS_HMAC_DRBG_RESEED_INTERVAL) - * - * \param ctx HMAC_DRBG context - * \param interval Reseed interval - */ -void mbedtls_hmac_drbg_set_reseed_interval( mbedtls_hmac_drbg_context *ctx, - int interval ); - -/** - * \brief HMAC_DRBG update state - * - * \param ctx HMAC_DRBG context - * \param additional Additional data to update state with, or NULL - * \param add_len Length of additional data, or 0 - * - * \note Additional data is optional, pass NULL and 0 as second - * third argument if no additional data is being used. - */ -void mbedtls_hmac_drbg_update( mbedtls_hmac_drbg_context *ctx, - const unsigned char *additional, size_t add_len ); - -/** - * \brief HMAC_DRBG reseeding (extracts data from entropy source) - * - * \param ctx HMAC_DRBG context - * \param additional Additional data to add to state (Can be NULL) - * \param len Length of additional data - * - * \return 0 if successful, or - * MBEDTLS_ERR_HMAC_DRBG_ENTROPY_SOURCE_FAILED - */ -int mbedtls_hmac_drbg_reseed( mbedtls_hmac_drbg_context *ctx, - const unsigned char *additional, size_t len ); - -/** - * \brief HMAC_DRBG generate random with additional update input - * - * Note: Automatically reseeds if reseed_counter is reached or PR is enabled. - * - * \param p_rng HMAC_DRBG context - * \param output Buffer to fill - * \param output_len Length of the buffer - * \param additional Additional data to update with (can be NULL) - * \param add_len Length of additional data (can be 0) - * - * \return 0 if successful, or - * MBEDTLS_ERR_HMAC_DRBG_ENTROPY_SOURCE_FAILED, or - * MBEDTLS_ERR_HMAC_DRBG_REQUEST_TOO_BIG, or - * MBEDTLS_ERR_HMAC_DRBG_INPUT_TOO_BIG. - */ -int mbedtls_hmac_drbg_random_with_add( void *p_rng, - unsigned char *output, size_t output_len, - const unsigned char *additional, - size_t add_len ); - -/** - * \brief HMAC_DRBG generate random - * - * Note: Automatically reseeds if reseed_counter is reached or PR is enabled. - * - * \param p_rng HMAC_DRBG context - * \param output Buffer to fill - * \param out_len Length of the buffer - * - * \return 0 if successful, or - * MBEDTLS_ERR_HMAC_DRBG_ENTROPY_SOURCE_FAILED, or - * MBEDTLS_ERR_HMAC_DRBG_REQUEST_TOO_BIG - */ -int mbedtls_hmac_drbg_random( void *p_rng, unsigned char *output, size_t out_len ); - -/** - * \brief Free an HMAC_DRBG context - * - * \param ctx HMAC_DRBG context to free. - */ -void mbedtls_hmac_drbg_free( mbedtls_hmac_drbg_context *ctx ); - -#if defined(MBEDTLS_FS_IO) -/** - * \brief Write a seed file - * - * \param ctx HMAC_DRBG context - * \param path Name of the file - * - * \return 0 if successful, 1 on file error, or - * MBEDTLS_ERR_HMAC_DRBG_ENTROPY_SOURCE_FAILED - */ -int mbedtls_hmac_drbg_write_seed_file( mbedtls_hmac_drbg_context *ctx, const char *path ); - -/** - * \brief Read and update a seed file. Seed is added to this - * instance - * - * \param ctx HMAC_DRBG context - * \param path Name of the file - * - * \return 0 if successful, 1 on file error, - * MBEDTLS_ERR_HMAC_DRBG_ENTROPY_SOURCE_FAILED or - * MBEDTLS_ERR_HMAC_DRBG_INPUT_TOO_BIG - */ -int mbedtls_hmac_drbg_update_seed_file( mbedtls_hmac_drbg_context *ctx, const char *path ); -#endif /* MBEDTLS_FS_IO */ - - -#if defined(MBEDTLS_SELF_TEST) -/** - * \brief Checkup routine - * - * \return 0 if successful, or 1 if the test failed - */ -int mbedtls_hmac_drbg_self_test( int verbose ); -#endif - -#ifdef __cplusplus -} -#endif - -#endif /* hmac_drbg.h */ diff --git a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/LICENSE b/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/LICENSE deleted file mode 100644 index 546a8e63..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/LICENSE +++ /dev/null @@ -1,2 +0,0 @@ -Unless specifically indicated otherwise in a file, files are licensed -under the Apache 2.0 license, as can be found in: apache-2.0.txt diff --git a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/aes.h b/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/aes.h deleted file mode 100644 index a36e825a..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/aes.h +++ /dev/null @@ -1,297 +0,0 @@ -/** - * \file aes.h - * - * \brief AES block cipher - * - * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * This file is part of mbed TLS (https://tls.mbed.org) - */ -#ifndef MBEDTLS_AES_H -#define MBEDTLS_AES_H - -#if !defined(MBEDTLS_CONFIG_FILE) -#include "config.h" -#else -#include MBEDTLS_CONFIG_FILE -#endif - -#include -#include - -/* padlock.c and aesni.c rely on these values! */ -#define MBEDTLS_AES_ENCRYPT 1 -#define MBEDTLS_AES_DECRYPT 0 - -#define MBEDTLS_ERR_AES_INVALID_KEY_LENGTH -0x0020 /**< Invalid key length. */ -#define MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH -0x0022 /**< Invalid data input length. */ - -#if !defined(MBEDTLS_AES_ALT) -// Regular implementation -// - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * \brief AES context structure - * - * \note buf is able to hold 32 extra bytes, which can be used: - * - for alignment purposes if VIA padlock is used, and/or - * - to simplify key expansion in the 256-bit case by - * generating an extra round key - */ -typedef struct -{ - int nr; /*!< number of rounds */ - uint32_t *rk; /*!< AES round keys */ - uint32_t buf[68]; /*!< unaligned data */ -} -mbedtls_aes_context; - -/** - * \brief Initialize AES context - * - * \param ctx AES context to be initialized - */ -void mbedtls_aes_init( mbedtls_aes_context *ctx ); - -/** - * \brief Clear AES context - * - * \param ctx AES context to be cleared - */ -void mbedtls_aes_free( mbedtls_aes_context *ctx ); - -/** - * \brief AES key schedule (encryption) - * - * \param ctx AES context to be initialized - * \param key encryption key - * \param keybits must be 128, 192 or 256 - * - * \return 0 if successful, or MBEDTLS_ERR_AES_INVALID_KEY_LENGTH - */ -int mbedtls_aes_setkey_enc( mbedtls_aes_context *ctx, const unsigned char *key, - unsigned int keybits ); - -/** - * \brief AES key schedule (decryption) - * - * \param ctx AES context to be initialized - * \param key decryption key - * \param keybits must be 128, 192 or 256 - * - * \return 0 if successful, or MBEDTLS_ERR_AES_INVALID_KEY_LENGTH - */ -int mbedtls_aes_setkey_dec( mbedtls_aes_context *ctx, const unsigned char *key, - unsigned int keybits ); - -/** - * \brief AES-ECB block encryption/decryption - * - * \param ctx AES context - * \param mode MBEDTLS_AES_ENCRYPT or MBEDTLS_AES_DECRYPT - * \param input 16-byte input block - * \param output 16-byte output block - * - * \return 0 if successful - */ -int mbedtls_aes_crypt_ecb( mbedtls_aes_context *ctx, - int mode, - const unsigned char input[16], - unsigned char output[16] ); - -#if defined(MBEDTLS_CIPHER_MODE_CBC) -/** - * \brief AES-CBC buffer encryption/decryption - * Length should be a multiple of the block - * size (16 bytes) - * - * \note Upon exit, the content of the IV is updated so that you can - * call the function same function again on the following - * block(s) of data and get the same result as if it was - * encrypted in one call. This allows a "streaming" usage. - * If on the other hand you need to retain the contents of the - * IV, you should either save it manually or use the cipher - * module instead. - * - * \param ctx AES context - * \param mode MBEDTLS_AES_ENCRYPT or MBEDTLS_AES_DECRYPT - * \param length length of the input data - * \param iv initialization vector (updated after use) - * \param input buffer holding the input data - * \param output buffer holding the output data - * - * \return 0 if successful, or MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH - */ -int mbedtls_aes_crypt_cbc( mbedtls_aes_context *ctx, - int mode, - size_t length, - unsigned char iv[16], - const unsigned char *input, - unsigned char *output ); -#endif /* MBEDTLS_CIPHER_MODE_CBC */ - -#if defined(MBEDTLS_CIPHER_MODE_CFB) -/** - * \brief AES-CFB128 buffer encryption/decryption. - * - * Note: Due to the nature of CFB you should use the same key schedule for - * both encryption and decryption. So a context initialized with - * mbedtls_aes_setkey_enc() for both MBEDTLS_AES_ENCRYPT and MBEDTLS_AES_DECRYPT. - * - * \note Upon exit, the content of the IV is updated so that you can - * call the function same function again on the following - * block(s) of data and get the same result as if it was - * encrypted in one call. This allows a "streaming" usage. - * If on the other hand you need to retain the contents of the - * IV, you should either save it manually or use the cipher - * module instead. - * - * \param ctx AES context - * \param mode MBEDTLS_AES_ENCRYPT or MBEDTLS_AES_DECRYPT - * \param length length of the input data - * \param iv_off offset in IV (updated after use) - * \param iv initialization vector (updated after use) - * \param input buffer holding the input data - * \param output buffer holding the output data - * - * \return 0 if successful - */ -int mbedtls_aes_crypt_cfb128( mbedtls_aes_context *ctx, - int mode, - size_t length, - size_t *iv_off, - unsigned char iv[16], - const unsigned char *input, - unsigned char *output ); - -/** - * \brief AES-CFB8 buffer encryption/decryption. - * - * Note: Due to the nature of CFB you should use the same key schedule for - * both encryption and decryption. So a context initialized with - * mbedtls_aes_setkey_enc() for both MBEDTLS_AES_ENCRYPT and MBEDTLS_AES_DECRYPT. - * - * \note Upon exit, the content of the IV is updated so that you can - * call the function same function again on the following - * block(s) of data and get the same result as if it was - * encrypted in one call. This allows a "streaming" usage. - * If on the other hand you need to retain the contents of the - * IV, you should either save it manually or use the cipher - * module instead. - * - * \param ctx AES context - * \param mode MBEDTLS_AES_ENCRYPT or MBEDTLS_AES_DECRYPT - * \param length length of the input data - * \param iv initialization vector (updated after use) - * \param input buffer holding the input data - * \param output buffer holding the output data - * - * \return 0 if successful - */ -int mbedtls_aes_crypt_cfb8( mbedtls_aes_context *ctx, - int mode, - size_t length, - unsigned char iv[16], - const unsigned char *input, - unsigned char *output ); -#endif /*MBEDTLS_CIPHER_MODE_CFB */ - -#if defined(MBEDTLS_CIPHER_MODE_CTR) -/** - * \brief AES-CTR buffer encryption/decryption - * - * Warning: You have to keep the maximum use of your counter in mind! - * - * Note: Due to the nature of CTR you should use the same key schedule for - * both encryption and decryption. So a context initialized with - * mbedtls_aes_setkey_enc() for both MBEDTLS_AES_ENCRYPT and MBEDTLS_AES_DECRYPT. - * - * \param ctx AES context - * \param length The length of the data - * \param nc_off The offset in the current stream_block (for resuming - * within current cipher stream). The offset pointer to - * should be 0 at the start of a stream. - * \param nonce_counter The 128-bit nonce and counter. - * \param stream_block The saved stream-block for resuming. Is overwritten - * by the function. - * \param input The input data stream - * \param output The output data stream - * - * \return 0 if successful - */ -int mbedtls_aes_crypt_ctr( mbedtls_aes_context *ctx, - size_t length, - size_t *nc_off, - unsigned char nonce_counter[16], - unsigned char stream_block[16], - const unsigned char *input, - unsigned char *output ); -#endif /* MBEDTLS_CIPHER_MODE_CTR */ - -/** - * \brief Internal AES block encryption function - * (Only exposed to allow overriding it, - * see MBEDTLS_AES_ENCRYPT_ALT) - * - * \param ctx AES context - * \param input Plaintext block - * \param output Output (ciphertext) block - */ -void mbedtls_aes_encrypt( mbedtls_aes_context *ctx, - const unsigned char input[16], - unsigned char output[16] ); - -/** - * \brief Internal AES block decryption function - * (Only exposed to allow overriding it, - * see MBEDTLS_AES_DECRYPT_ALT) - * - * \param ctx AES context - * \param input Ciphertext block - * \param output Output (plaintext) block - */ -void mbedtls_aes_decrypt( mbedtls_aes_context *ctx, - const unsigned char input[16], - unsigned char output[16] ); - -#ifdef __cplusplus -} -#endif - -#else /* MBEDTLS_AES_ALT */ -#include "aes_alt.h" -#endif /* MBEDTLS_AES_ALT */ - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * \brief Checkup routine - * - * \return 0 if successful, or 1 if the test failed - */ -int mbedtls_aes_self_test( int verbose ); - -#ifdef __cplusplus -} -#endif - -#endif /* aes.h */ diff --git a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/aesni.h b/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/aesni.h deleted file mode 100644 index b1b7f1cd..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/aesni.h +++ /dev/null @@ -1,111 +0,0 @@ -/** - * \file aesni.h - * - * \brief AES-NI for hardware AES acceleration on some Intel processors - * - * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * This file is part of mbed TLS (https://tls.mbed.org) - */ -#ifndef MBEDTLS_AESNI_H -#define MBEDTLS_AESNI_H - -#include "aes.h" - -#define MBEDTLS_AESNI_AES 0x02000000u -#define MBEDTLS_AESNI_CLMUL 0x00000002u - -#if defined(MBEDTLS_HAVE_ASM) && defined(__GNUC__) && \ - ( defined(__amd64__) || defined(__x86_64__) ) && \ - ! defined(MBEDTLS_HAVE_X86_64) -#define MBEDTLS_HAVE_X86_64 -#endif - -#if defined(MBEDTLS_HAVE_X86_64) - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * \brief AES-NI features detection routine - * - * \param what The feature to detect - * (MBEDTLS_AESNI_AES or MBEDTLS_AESNI_CLMUL) - * - * \return 1 if CPU has support for the feature, 0 otherwise - */ -int mbedtls_aesni_has_support( unsigned int what ); - -/** - * \brief AES-NI AES-ECB block en(de)cryption - * - * \param ctx AES context - * \param mode MBEDTLS_AES_ENCRYPT or MBEDTLS_AES_DECRYPT - * \param input 16-byte input block - * \param output 16-byte output block - * - * \return 0 on success (cannot fail) - */ -int mbedtls_aesni_crypt_ecb( mbedtls_aes_context *ctx, - int mode, - const unsigned char input[16], - unsigned char output[16] ); - -/** - * \brief GCM multiplication: c = a * b in GF(2^128) - * - * \param c Result - * \param a First operand - * \param b Second operand - * - * \note Both operands and result are bit strings interpreted as - * elements of GF(2^128) as per the GCM spec. - */ -void mbedtls_aesni_gcm_mult( unsigned char c[16], - const unsigned char a[16], - const unsigned char b[16] ); - -/** - * \brief Compute decryption round keys from encryption round keys - * - * \param invkey Round keys for the equivalent inverse cipher - * \param fwdkey Original round keys (for encryption) - * \param nr Number of rounds (that is, number of round keys minus one) - */ -void mbedtls_aesni_inverse_key( unsigned char *invkey, - const unsigned char *fwdkey, int nr ); - -/** - * \brief Perform key expansion (for encryption) - * - * \param rk Destination buffer where the round keys are written - * \param key Encryption key - * \param bits Key size in bits (must be 128, 192 or 256) - * - * \return 0 if successful, or MBEDTLS_ERR_AES_INVALID_KEY_LENGTH - */ -int mbedtls_aesni_setkey_enc( unsigned char *rk, - const unsigned char *key, - size_t bits ); - -#ifdef __cplusplus -} -#endif - -#endif /* MBEDTLS_HAVE_X86_64 */ - -#endif /* MBEDTLS_AESNI_H */ diff --git a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/arc4.h b/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/arc4.h deleted file mode 100644 index 5fc5395a..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/arc4.h +++ /dev/null @@ -1,113 +0,0 @@ -/** - * \file arc4.h - * - * \brief The ARCFOUR stream cipher - * - * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * This file is part of mbed TLS (https://tls.mbed.org) - */ -#ifndef MBEDTLS_ARC4_H -#define MBEDTLS_ARC4_H - -#if !defined(MBEDTLS_CONFIG_FILE) -#include "config.h" -#else -#include MBEDTLS_CONFIG_FILE -#endif - -#include - -#if !defined(MBEDTLS_ARC4_ALT) -// Regular implementation -// - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * \brief ARC4 context structure - */ -typedef struct -{ - int x; /*!< permutation index */ - int y; /*!< permutation index */ - unsigned char m[256]; /*!< permutation table */ -} -mbedtls_arc4_context; - -/** - * \brief Initialize ARC4 context - * - * \param ctx ARC4 context to be initialized - */ -void mbedtls_arc4_init( mbedtls_arc4_context *ctx ); - -/** - * \brief Clear ARC4 context - * - * \param ctx ARC4 context to be cleared - */ -void mbedtls_arc4_free( mbedtls_arc4_context *ctx ); - -/** - * \brief ARC4 key schedule - * - * \param ctx ARC4 context to be setup - * \param key the secret key - * \param keylen length of the key, in bytes - */ -void mbedtls_arc4_setup( mbedtls_arc4_context *ctx, const unsigned char *key, - unsigned int keylen ); - -/** - * \brief ARC4 cipher function - * - * \param ctx ARC4 context - * \param length length of the input data - * \param input buffer holding the input data - * \param output buffer for the output data - * - * \return 0 if successful - */ -int mbedtls_arc4_crypt( mbedtls_arc4_context *ctx, size_t length, const unsigned char *input, - unsigned char *output ); - -#ifdef __cplusplus -} -#endif - -#else /* MBEDTLS_ARC4_ALT */ -#include "arc4_alt.h" -#endif /* MBEDTLS_ARC4_ALT */ - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * \brief Checkup routine - * - * \return 0 if successful, or 1 if the test failed - */ -int mbedtls_arc4_self_test( int verbose ); - -#ifdef __cplusplus -} -#endif - -#endif /* arc4.h */ diff --git a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/asn1.h b/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/asn1.h deleted file mode 100644 index 082832c8..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/asn1.h +++ /dev/null @@ -1,342 +0,0 @@ -/** - * \file asn1.h - * - * \brief Generic ASN.1 parsing - * - * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * This file is part of mbed TLS (https://tls.mbed.org) - */ -#ifndef MBEDTLS_ASN1_H -#define MBEDTLS_ASN1_H - -#if !defined(MBEDTLS_CONFIG_FILE) -#include "config.h" -#else -#include MBEDTLS_CONFIG_FILE -#endif - -#include - -#if defined(MBEDTLS_BIGNUM_C) -#include "bignum.h" -#endif - -/** - * \addtogroup asn1_module - * \{ - */ - -/** - * \name ASN1 Error codes - * These error codes are OR'ed to X509 error codes for - * higher error granularity. - * ASN1 is a standard to specify data structures. - * \{ - */ -#define MBEDTLS_ERR_ASN1_OUT_OF_DATA -0x0060 /**< Out of data when parsing an ASN1 data structure. */ -#define MBEDTLS_ERR_ASN1_UNEXPECTED_TAG -0x0062 /**< ASN1 tag was of an unexpected value. */ -#define MBEDTLS_ERR_ASN1_INVALID_LENGTH -0x0064 /**< Error when trying to determine the length or invalid length. */ -#define MBEDTLS_ERR_ASN1_LENGTH_MISMATCH -0x0066 /**< Actual length differs from expected length. */ -#define MBEDTLS_ERR_ASN1_INVALID_DATA -0x0068 /**< Data is invalid. (not used) */ -#define MBEDTLS_ERR_ASN1_ALLOC_FAILED -0x006A /**< Memory allocation failed */ -#define MBEDTLS_ERR_ASN1_BUF_TOO_SMALL -0x006C /**< Buffer too small when writing ASN.1 data structure. */ - -/* \} name */ - -/** - * \name DER constants - * These constants comply with DER encoded the ANS1 type tags. - * DER encoding uses hexadecimal representation. - * An example DER sequence is:\n - * - 0x02 -- tag indicating INTEGER - * - 0x01 -- length in octets - * - 0x05 -- value - * Such sequences are typically read into \c ::mbedtls_x509_buf. - * \{ - */ -#define MBEDTLS_ASN1_BOOLEAN 0x01 -#define MBEDTLS_ASN1_INTEGER 0x02 -#define MBEDTLS_ASN1_BIT_STRING 0x03 -#define MBEDTLS_ASN1_OCTET_STRING 0x04 -#define MBEDTLS_ASN1_NULL 0x05 -#define MBEDTLS_ASN1_OID 0x06 -#define MBEDTLS_ASN1_UTF8_STRING 0x0C -#define MBEDTLS_ASN1_SEQUENCE 0x10 -#define MBEDTLS_ASN1_SET 0x11 -#define MBEDTLS_ASN1_PRINTABLE_STRING 0x13 -#define MBEDTLS_ASN1_T61_STRING 0x14 -#define MBEDTLS_ASN1_IA5_STRING 0x16 -#define MBEDTLS_ASN1_UTC_TIME 0x17 -#define MBEDTLS_ASN1_GENERALIZED_TIME 0x18 -#define MBEDTLS_ASN1_UNIVERSAL_STRING 0x1C -#define MBEDTLS_ASN1_BMP_STRING 0x1E -#define MBEDTLS_ASN1_PRIMITIVE 0x00 -#define MBEDTLS_ASN1_CONSTRUCTED 0x20 -#define MBEDTLS_ASN1_CONTEXT_SPECIFIC 0x80 -/* \} name */ -/* \} addtogroup asn1_module */ - -/** Returns the size of the binary string, without the trailing \\0 */ -#define MBEDTLS_OID_SIZE(x) (sizeof(x) - 1) - -/** - * Compares an mbedtls_asn1_buf structure to a reference OID. - * - * Only works for 'defined' oid_str values (MBEDTLS_OID_HMAC_SHA1), you cannot use a - * 'unsigned char *oid' here! - */ -#define MBEDTLS_OID_CMP(oid_str, oid_buf) \ - ( ( MBEDTLS_OID_SIZE(oid_str) != (oid_buf)->len ) || \ - memcmp( (oid_str), (oid_buf)->p, (oid_buf)->len) != 0 ) - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * \name Functions to parse ASN.1 data structures - * \{ - */ - -/** - * Type-length-value structure that allows for ASN1 using DER. - */ -typedef struct mbedtls_asn1_buf -{ - int tag; /**< ASN1 type, e.g. MBEDTLS_ASN1_UTF8_STRING. */ - size_t len; /**< ASN1 length, in octets. */ - unsigned char *p; /**< ASN1 data, e.g. in ASCII. */ -} -mbedtls_asn1_buf; - -/** - * Container for ASN1 bit strings. - */ -typedef struct mbedtls_asn1_bitstring -{ - size_t len; /**< ASN1 length, in octets. */ - unsigned char unused_bits; /**< Number of unused bits at the end of the string */ - unsigned char *p; /**< Raw ASN1 data for the bit string */ -} -mbedtls_asn1_bitstring; - -/** - * Container for a sequence of ASN.1 items - */ -typedef struct mbedtls_asn1_sequence -{ - mbedtls_asn1_buf buf; /**< Buffer containing the given ASN.1 item. */ - struct mbedtls_asn1_sequence *next; /**< The next entry in the sequence. */ -} -mbedtls_asn1_sequence; - -/** - * Container for a sequence or list of 'named' ASN.1 data items - */ -typedef struct mbedtls_asn1_named_data -{ - mbedtls_asn1_buf oid; /**< The object identifier. */ - mbedtls_asn1_buf val; /**< The named value. */ - struct mbedtls_asn1_named_data *next; /**< The next entry in the sequence. */ - unsigned char next_merged; /**< Merge next item into the current one? */ -} -mbedtls_asn1_named_data; - -/** - * \brief Get the length of an ASN.1 element. - * Updates the pointer to immediately behind the length. - * - * \param p The position in the ASN.1 data - * \param end End of data - * \param len The variable that will receive the value - * - * \return 0 if successful, MBEDTLS_ERR_ASN1_OUT_OF_DATA on reaching - * end of data, MBEDTLS_ERR_ASN1_INVALID_LENGTH if length is - * unparseable. - */ -int mbedtls_asn1_get_len( unsigned char **p, - const unsigned char *end, - size_t *len ); - -/** - * \brief Get the tag and length of the tag. Check for the requested tag. - * Updates the pointer to immediately behind the tag and length. - * - * \param p The position in the ASN.1 data - * \param end End of data - * \param len The variable that will receive the length - * \param tag The expected tag - * - * \return 0 if successful, MBEDTLS_ERR_ASN1_UNEXPECTED_TAG if tag did - * not match requested tag, or another specific ASN.1 error code. - */ -int mbedtls_asn1_get_tag( unsigned char **p, - const unsigned char *end, - size_t *len, int tag ); - -/** - * \brief Retrieve a boolean ASN.1 tag and its value. - * Updates the pointer to immediately behind the full tag. - * - * \param p The position in the ASN.1 data - * \param end End of data - * \param val The variable that will receive the value - * - * \return 0 if successful or a specific ASN.1 error code. - */ -int mbedtls_asn1_get_bool( unsigned char **p, - const unsigned char *end, - int *val ); - -/** - * \brief Retrieve an integer ASN.1 tag and its value. - * Updates the pointer to immediately behind the full tag. - * - * \param p The position in the ASN.1 data - * \param end End of data - * \param val The variable that will receive the value - * - * \return 0 if successful or a specific ASN.1 error code. - */ -int mbedtls_asn1_get_int( unsigned char **p, - const unsigned char *end, - int *val ); - -/** - * \brief Retrieve a bitstring ASN.1 tag and its value. - * Updates the pointer to immediately behind the full tag. - * - * \param p The position in the ASN.1 data - * \param end End of data - * \param bs The variable that will receive the value - * - * \return 0 if successful or a specific ASN.1 error code. - */ -int mbedtls_asn1_get_bitstring( unsigned char **p, const unsigned char *end, - mbedtls_asn1_bitstring *bs); - -/** - * \brief Retrieve a bitstring ASN.1 tag without unused bits and its - * value. - * Updates the pointer to the beginning of the bit/octet string. - * - * \param p The position in the ASN.1 data - * \param end End of data - * \param len Length of the actual bit/octect string in bytes - * - * \return 0 if successful or a specific ASN.1 error code. - */ -int mbedtls_asn1_get_bitstring_null( unsigned char **p, const unsigned char *end, - size_t *len ); - -/** - * \brief Parses and splits an ASN.1 "SEQUENCE OF " - * Updated the pointer to immediately behind the full sequence tag. - * - * \param p The position in the ASN.1 data - * \param end End of data - * \param cur First variable in the chain to fill - * \param tag Type of sequence - * - * \return 0 if successful or a specific ASN.1 error code. - */ -int mbedtls_asn1_get_sequence_of( unsigned char **p, - const unsigned char *end, - mbedtls_asn1_sequence *cur, - int tag); - -#if defined(MBEDTLS_BIGNUM_C) -/** - * \brief Retrieve a MPI value from an integer ASN.1 tag. - * Updates the pointer to immediately behind the full tag. - * - * \param p The position in the ASN.1 data - * \param end End of data - * \param X The MPI that will receive the value - * - * \return 0 if successful or a specific ASN.1 or MPI error code. - */ -int mbedtls_asn1_get_mpi( unsigned char **p, - const unsigned char *end, - mbedtls_mpi *X ); -#endif /* MBEDTLS_BIGNUM_C */ - -/** - * \brief Retrieve an AlgorithmIdentifier ASN.1 sequence. - * Updates the pointer to immediately behind the full - * AlgorithmIdentifier. - * - * \param p The position in the ASN.1 data - * \param end End of data - * \param alg The buffer to receive the OID - * \param params The buffer to receive the params (if any) - * - * \return 0 if successful or a specific ASN.1 or MPI error code. - */ -int mbedtls_asn1_get_alg( unsigned char **p, - const unsigned char *end, - mbedtls_asn1_buf *alg, mbedtls_asn1_buf *params ); - -/** - * \brief Retrieve an AlgorithmIdentifier ASN.1 sequence with NULL or no - * params. - * Updates the pointer to immediately behind the full - * AlgorithmIdentifier. - * - * \param p The position in the ASN.1 data - * \param end End of data - * \param alg The buffer to receive the OID - * - * \return 0 if successful or a specific ASN.1 or MPI error code. - */ -int mbedtls_asn1_get_alg_null( unsigned char **p, - const unsigned char *end, - mbedtls_asn1_buf *alg ); - -/** - * \brief Find a specific named_data entry in a sequence or list based on - * the OID. - * - * \param list The list to seek through - * \param oid The OID to look for - * \param len Size of the OID - * - * \return NULL if not found, or a pointer to the existing entry. - */ -mbedtls_asn1_named_data *mbedtls_asn1_find_named_data( mbedtls_asn1_named_data *list, - const char *oid, size_t len ); - -/** - * \brief Free a mbedtls_asn1_named_data entry - * - * \param entry The named data entry to free - */ -void mbedtls_asn1_free_named_data( mbedtls_asn1_named_data *entry ); - -/** - * \brief Free all entries in a mbedtls_asn1_named_data list - * Head will be set to NULL - * - * \param head Pointer to the head of the list of named data entries to free - */ -void mbedtls_asn1_free_named_data_list( mbedtls_asn1_named_data **head ); - -#ifdef __cplusplus -} -#endif - -#endif /* asn1.h */ diff --git a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/asn1write.h b/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/asn1write.h deleted file mode 100644 index 73ff32b6..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/asn1write.h +++ /dev/null @@ -1,239 +0,0 @@ -/** - * \file asn1write.h - * - * \brief ASN.1 buffer writing functionality - * - * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * This file is part of mbed TLS (https://tls.mbed.org) - */ -#ifndef MBEDTLS_ASN1_WRITE_H -#define MBEDTLS_ASN1_WRITE_H - -#include "asn1.h" - -#define MBEDTLS_ASN1_CHK_ADD(g, f) do { if( ( ret = f ) < 0 ) return( ret ); else \ - g += ret; } while( 0 ) - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * \brief Write a length field in ASN.1 format - * Note: function works backwards in data buffer - * - * \param p reference to current position pointer - * \param start start of the buffer (for bounds-checking) - * \param len the length to write - * - * \return the length written or a negative error code - */ -int mbedtls_asn1_write_len( unsigned char **p, unsigned char *start, size_t len ); - -/** - * \brief Write a ASN.1 tag in ASN.1 format - * Note: function works backwards in data buffer - * - * \param p reference to current position pointer - * \param start start of the buffer (for bounds-checking) - * \param tag the tag to write - * - * \return the length written or a negative error code - */ -int mbedtls_asn1_write_tag( unsigned char **p, unsigned char *start, - unsigned char tag ); - -/** - * \brief Write raw buffer data - * Note: function works backwards in data buffer - * - * \param p reference to current position pointer - * \param start start of the buffer (for bounds-checking) - * \param buf data buffer to write - * \param size length of the data buffer - * - * \return the length written or a negative error code - */ -int mbedtls_asn1_write_raw_buffer( unsigned char **p, unsigned char *start, - const unsigned char *buf, size_t size ); - -#if defined(MBEDTLS_BIGNUM_C) -/** - * \brief Write a big number (MBEDTLS_ASN1_INTEGER) in ASN.1 format - * Note: function works backwards in data buffer - * - * \param p reference to current position pointer - * \param start start of the buffer (for bounds-checking) - * \param X the MPI to write - * - * \return the length written or a negative error code - */ -int mbedtls_asn1_write_mpi( unsigned char **p, unsigned char *start, const mbedtls_mpi *X ); -#endif /* MBEDTLS_BIGNUM_C */ - -/** - * \brief Write a NULL tag (MBEDTLS_ASN1_NULL) with zero data in ASN.1 format - * Note: function works backwards in data buffer - * - * \param p reference to current position pointer - * \param start start of the buffer (for bounds-checking) - * - * \return the length written or a negative error code - */ -int mbedtls_asn1_write_null( unsigned char **p, unsigned char *start ); - -/** - * \brief Write an OID tag (MBEDTLS_ASN1_OID) and data in ASN.1 format - * Note: function works backwards in data buffer - * - * \param p reference to current position pointer - * \param start start of the buffer (for bounds-checking) - * \param oid the OID to write - * \param oid_len length of the OID - * - * \return the length written or a negative error code - */ -int mbedtls_asn1_write_oid( unsigned char **p, unsigned char *start, - const char *oid, size_t oid_len ); - -/** - * \brief Write an AlgorithmIdentifier sequence in ASN.1 format - * Note: function works backwards in data buffer - * - * \param p reference to current position pointer - * \param start start of the buffer (for bounds-checking) - * \param oid the OID of the algorithm - * \param oid_len length of the OID - * \param par_len length of parameters, which must be already written. - * If 0, NULL parameters are added - * - * \return the length written or a negative error code - */ -int mbedtls_asn1_write_algorithm_identifier( unsigned char **p, unsigned char *start, - const char *oid, size_t oid_len, - size_t par_len ); - -/** - * \brief Write a boolean tag (MBEDTLS_ASN1_BOOLEAN) and value in ASN.1 format - * Note: function works backwards in data buffer - * - * \param p reference to current position pointer - * \param start start of the buffer (for bounds-checking) - * \param boolean 0 or 1 - * - * \return the length written or a negative error code - */ -int mbedtls_asn1_write_bool( unsigned char **p, unsigned char *start, int boolean ); - -/** - * \brief Write an int tag (MBEDTLS_ASN1_INTEGER) and value in ASN.1 format - * Note: function works backwards in data buffer - * - * \param p reference to current position pointer - * \param start start of the buffer (for bounds-checking) - * \param val the integer value - * - * \return the length written or a negative error code - */ -int mbedtls_asn1_write_int( unsigned char **p, unsigned char *start, int val ); - -/** - * \brief Write a printable string tag (MBEDTLS_ASN1_PRINTABLE_STRING) and - * value in ASN.1 format - * Note: function works backwards in data buffer - * - * \param p reference to current position pointer - * \param start start of the buffer (for bounds-checking) - * \param text the text to write - * \param text_len length of the text - * - * \return the length written or a negative error code - */ -int mbedtls_asn1_write_printable_string( unsigned char **p, unsigned char *start, - const char *text, size_t text_len ); - -/** - * \brief Write an IA5 string tag (MBEDTLS_ASN1_IA5_STRING) and - * value in ASN.1 format - * Note: function works backwards in data buffer - * - * \param p reference to current position pointer - * \param start start of the buffer (for bounds-checking) - * \param text the text to write - * \param text_len length of the text - * - * \return the length written or a negative error code - */ -int mbedtls_asn1_write_ia5_string( unsigned char **p, unsigned char *start, - const char *text, size_t text_len ); - -/** - * \brief Write a bitstring tag (MBEDTLS_ASN1_BIT_STRING) and - * value in ASN.1 format - * Note: function works backwards in data buffer - * - * \param p reference to current position pointer - * \param start start of the buffer (for bounds-checking) - * \param buf the bitstring - * \param bits the total number of bits in the bitstring - * - * \return the length written or a negative error code - */ -int mbedtls_asn1_write_bitstring( unsigned char **p, unsigned char *start, - const unsigned char *buf, size_t bits ); - -/** - * \brief Write an octet string tag (MBEDTLS_ASN1_OCTET_STRING) and - * value in ASN.1 format - * Note: function works backwards in data buffer - * - * \param p reference to current position pointer - * \param start start of the buffer (for bounds-checking) - * \param buf data buffer to write - * \param size length of the data buffer - * - * \return the length written or a negative error code - */ -int mbedtls_asn1_write_octet_string( unsigned char **p, unsigned char *start, - const unsigned char *buf, size_t size ); - -/** - * \brief Create or find a specific named_data entry for writing in a - * sequence or list based on the OID. If not already in there, - * a new entry is added to the head of the list. - * Warning: Destructive behaviour for the val data! - * - * \param list Pointer to the location of the head of the list to seek - * through (will be updated in case of a new entry) - * \param oid The OID to look for - * \param oid_len Size of the OID - * \param val Data to store (can be NULL if you want to fill it by hand) - * \param val_len Minimum length of the data buffer needed - * - * \return NULL if if there was a memory allocation error, or a pointer - * to the new / existing entry. - */ -mbedtls_asn1_named_data *mbedtls_asn1_store_named_data( mbedtls_asn1_named_data **list, - const char *oid, size_t oid_len, - const unsigned char *val, - size_t val_len ); - -#ifdef __cplusplus -} -#endif - -#endif /* MBEDTLS_ASN1_WRITE_H */ diff --git a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/base64.h b/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/base64.h deleted file mode 100644 index 352c652d..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/base64.h +++ /dev/null @@ -1,88 +0,0 @@ -/** - * \file base64.h - * - * \brief RFC 1521 base64 encoding/decoding - * - * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * This file is part of mbed TLS (https://tls.mbed.org) - */ -#ifndef MBEDTLS_BASE64_H -#define MBEDTLS_BASE64_H - -#include - -#define MBEDTLS_ERR_BASE64_BUFFER_TOO_SMALL -0x002A /**< Output buffer too small. */ -#define MBEDTLS_ERR_BASE64_INVALID_CHARACTER -0x002C /**< Invalid character in input. */ - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * \brief Encode a buffer into base64 format - * - * \param dst destination buffer - * \param dlen size of the destination buffer - * \param olen number of bytes written - * \param src source buffer - * \param slen amount of data to be encoded - * - * \return 0 if successful, or MBEDTLS_ERR_BASE64_BUFFER_TOO_SMALL. - * *olen is always updated to reflect the amount - * of data that has (or would have) been written. - * If that length cannot be represented, then no data is - * written to the buffer and *olen is set to the maximum - * length representable as a size_t. - * - * \note Call this function with dlen = 0 to obtain the - * required buffer size in *olen - */ -int mbedtls_base64_encode( unsigned char *dst, size_t dlen, size_t *olen, - const unsigned char *src, size_t slen ); - -/** - * \brief Decode a base64-formatted buffer - * - * \param dst destination buffer (can be NULL for checking size) - * \param dlen size of the destination buffer - * \param olen number of bytes written - * \param src source buffer - * \param slen amount of data to be decoded - * - * \return 0 if successful, MBEDTLS_ERR_BASE64_BUFFER_TOO_SMALL, or - * MBEDTLS_ERR_BASE64_INVALID_CHARACTER if the input data is - * not correct. *olen is always updated to reflect the amount - * of data that has (or would have) been written. - * - * \note Call this function with *dst = NULL or dlen = 0 to obtain - * the required buffer size in *olen - */ -int mbedtls_base64_decode( unsigned char *dst, size_t dlen, size_t *olen, - const unsigned char *src, size_t slen ); - -/** - * \brief Checkup routine - * - * \return 0 if successful, or 1 if the test failed - */ -int mbedtls_base64_self_test( int verbose ); - -#ifdef __cplusplus -} -#endif - -#endif /* base64.h */ diff --git a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/bignum.h b/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/bignum.h deleted file mode 100644 index 146224a2..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/bignum.h +++ /dev/null @@ -1,716 +0,0 @@ -/** - * \file bignum.h - * - * \brief Multi-precision integer library - * - * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * This file is part of mbed TLS (https://tls.mbed.org) - */ -#ifndef MBEDTLS_BIGNUM_H -#define MBEDTLS_BIGNUM_H - -#if !defined(MBEDTLS_CONFIG_FILE) -#include "config.h" -#else -#include MBEDTLS_CONFIG_FILE -#endif - -#include -#include - -#if defined(MBEDTLS_FS_IO) -#include -#endif - -#define MBEDTLS_ERR_MPI_FILE_IO_ERROR -0x0002 /**< An error occurred while reading from or writing to a file. */ -#define MBEDTLS_ERR_MPI_BAD_INPUT_DATA -0x0004 /**< Bad input parameters to function. */ -#define MBEDTLS_ERR_MPI_INVALID_CHARACTER -0x0006 /**< There is an invalid character in the digit string. */ -#define MBEDTLS_ERR_MPI_BUFFER_TOO_SMALL -0x0008 /**< The buffer is too small to write to. */ -#define MBEDTLS_ERR_MPI_NEGATIVE_VALUE -0x000A /**< The input arguments are negative or result in illegal output. */ -#define MBEDTLS_ERR_MPI_DIVISION_BY_ZERO -0x000C /**< The input argument for division is zero, which is not allowed. */ -#define MBEDTLS_ERR_MPI_NOT_ACCEPTABLE -0x000E /**< The input arguments are not acceptable. */ -#define MBEDTLS_ERR_MPI_ALLOC_FAILED -0x0010 /**< Memory allocation failed. */ - -#define MBEDTLS_MPI_CHK(f) do { if( ( ret = f ) != 0 ) goto cleanup; } while( 0 ) - -/* - * Maximum size MPIs are allowed to grow to in number of limbs. - */ -#define MBEDTLS_MPI_MAX_LIMBS 10000 - -#if !defined(MBEDTLS_MPI_WINDOW_SIZE) -/* - * Maximum window size used for modular exponentiation. Default: 6 - * Minimum value: 1. Maximum value: 6. - * - * Result is an array of ( 2 << MBEDTLS_MPI_WINDOW_SIZE ) MPIs used - * for the sliding window calculation. (So 64 by default) - * - * Reduction in size, reduces speed. - */ -#define MBEDTLS_MPI_WINDOW_SIZE 6 /**< Maximum windows size used. */ -#endif /* !MBEDTLS_MPI_WINDOW_SIZE */ - -#if !defined(MBEDTLS_MPI_MAX_SIZE) -/* - * Maximum size of MPIs allowed in bits and bytes for user-MPIs. - * ( Default: 512 bytes => 4096 bits, Maximum tested: 2048 bytes => 16384 bits ) - * - * Note: Calculations can results temporarily in larger MPIs. So the number - * of limbs required (MBEDTLS_MPI_MAX_LIMBS) is higher. - */ -#define MBEDTLS_MPI_MAX_SIZE 1024 /**< Maximum number of bytes for usable MPIs. */ -#endif /* !MBEDTLS_MPI_MAX_SIZE */ - -#define MBEDTLS_MPI_MAX_BITS ( 8 * MBEDTLS_MPI_MAX_SIZE ) /**< Maximum number of bits for usable MPIs. */ - -/* - * When reading from files with mbedtls_mpi_read_file() and writing to files with - * mbedtls_mpi_write_file() the buffer should have space - * for a (short) label, the MPI (in the provided radix), the newline - * characters and the '\0'. - * - * By default we assume at least a 10 char label, a minimum radix of 10 - * (decimal) and a maximum of 4096 bit numbers (1234 decimal chars). - * Autosized at compile time for at least a 10 char label, a minimum radix - * of 10 (decimal) for a number of MBEDTLS_MPI_MAX_BITS size. - * - * This used to be statically sized to 1250 for a maximum of 4096 bit - * numbers (1234 decimal chars). - * - * Calculate using the formula: - * MBEDTLS_MPI_RW_BUFFER_SIZE = ceil(MBEDTLS_MPI_MAX_BITS / ln(10) * ln(2)) + - * LabelSize + 6 - */ -#define MBEDTLS_MPI_MAX_BITS_SCALE100 ( 100 * MBEDTLS_MPI_MAX_BITS ) -#define MBEDTLS_LN_2_DIV_LN_10_SCALE100 332 -#define MBEDTLS_MPI_RW_BUFFER_SIZE ( ((MBEDTLS_MPI_MAX_BITS_SCALE100 + MBEDTLS_LN_2_DIV_LN_10_SCALE100 - 1) / MBEDTLS_LN_2_DIV_LN_10_SCALE100) + 10 + 6 ) - -/* - * Define the base integer type, architecture-wise. - * - * 32-bit integers can be forced on 64-bit arches (eg. for testing purposes) - * by defining MBEDTLS_HAVE_INT32 and undefining MBEDTLS_HAVE_ASM - */ -#if ( ! defined(MBEDTLS_HAVE_INT32) && \ - defined(_MSC_VER) && defined(_M_AMD64) ) - #define MBEDTLS_HAVE_INT64 - typedef int64_t mbedtls_mpi_sint; - typedef uint64_t mbedtls_mpi_uint; -#else - #if ( ! defined(MBEDTLS_HAVE_INT32) && \ - defined(__GNUC__) && ( \ - defined(__amd64__) || defined(__x86_64__) || \ - defined(__ppc64__) || defined(__powerpc64__) || \ - defined(__ia64__) || defined(__alpha__) || \ - (defined(__sparc__) && defined(__arch64__)) || \ - defined(__s390x__) || defined(__mips64) ) ) - #define MBEDTLS_HAVE_INT64 - typedef int64_t mbedtls_mpi_sint; - typedef uint64_t mbedtls_mpi_uint; - typedef unsigned int mbedtls_t_udbl __attribute__((mode(TI))); - #define MBEDTLS_HAVE_UDBL - #else - #define MBEDTLS_HAVE_INT32 - typedef int32_t mbedtls_mpi_sint; - typedef uint32_t mbedtls_mpi_uint; - typedef uint64_t mbedtls_t_udbl; - #define MBEDTLS_HAVE_UDBL - #endif /* !MBEDTLS_HAVE_INT32 && __GNUC__ && 64-bit platform */ -#endif /* !MBEDTLS_HAVE_INT32 && _MSC_VER && _M_AMD64 */ - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * \brief MPI structure - */ -typedef struct -{ - int s; /*!< integer sign */ - size_t n; /*!< total # of limbs */ - mbedtls_mpi_uint *p; /*!< pointer to limbs */ -} -mbedtls_mpi; - -/** - * \brief Initialize one MPI (make internal references valid) - * This just makes it ready to be set or freed, - * but does not define a value for the MPI. - * - * \param X One MPI to initialize. - */ -void mbedtls_mpi_init( mbedtls_mpi *X ); - -/** - * \brief Unallocate one MPI - * - * \param X One MPI to unallocate. - */ -void mbedtls_mpi_free( mbedtls_mpi *X ); - -/** - * \brief Enlarge to the specified number of limbs - * - * \param X MPI to grow - * \param nblimbs The target number of limbs - * - * \return 0 if successful, - * MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed - */ -int mbedtls_mpi_grow( mbedtls_mpi *X, size_t nblimbs ); - -/** - * \brief Resize down, keeping at least the specified number of limbs - * - * \param X MPI to shrink - * \param nblimbs The minimum number of limbs to keep - * - * \return 0 if successful, - * MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed - */ -int mbedtls_mpi_shrink( mbedtls_mpi *X, size_t nblimbs ); - -/** - * \brief Copy the contents of Y into X - * - * \param X Destination MPI - * \param Y Source MPI - * - * \return 0 if successful, - * MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed - */ -int mbedtls_mpi_copy( mbedtls_mpi *X, const mbedtls_mpi *Y ); - -/** - * \brief Swap the contents of X and Y - * - * \param X First MPI value - * \param Y Second MPI value - */ -void mbedtls_mpi_swap( mbedtls_mpi *X, mbedtls_mpi *Y ); - -/** - * \brief Safe conditional assignement X = Y if assign is 1 - * - * \param X MPI to conditionally assign to - * \param Y Value to be assigned - * \param assign 1: perform the assignment, 0: keep X's original value - * - * \return 0 if successful, - * MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed, - * - * \note This function is equivalent to - * if( assign ) mbedtls_mpi_copy( X, Y ); - * except that it avoids leaking any information about whether - * the assignment was done or not (the above code may leak - * information through branch prediction and/or memory access - * patterns analysis). - */ -int mbedtls_mpi_safe_cond_assign( mbedtls_mpi *X, const mbedtls_mpi *Y, unsigned char assign ); - -/** - * \brief Safe conditional swap X <-> Y if swap is 1 - * - * \param X First mbedtls_mpi value - * \param Y Second mbedtls_mpi value - * \param assign 1: perform the swap, 0: keep X and Y's original values - * - * \return 0 if successful, - * MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed, - * - * \note This function is equivalent to - * if( assign ) mbedtls_mpi_swap( X, Y ); - * except that it avoids leaking any information about whether - * the assignment was done or not (the above code may leak - * information through branch prediction and/or memory access - * patterns analysis). - */ -int mbedtls_mpi_safe_cond_swap( mbedtls_mpi *X, mbedtls_mpi *Y, unsigned char assign ); - -/** - * \brief Set value from integer - * - * \param X MPI to set - * \param z Value to use - * - * \return 0 if successful, - * MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed - */ -int mbedtls_mpi_lset( mbedtls_mpi *X, mbedtls_mpi_sint z ); - -/** - * \brief Get a specific bit from X - * - * \param X MPI to use - * \param pos Zero-based index of the bit in X - * - * \return Either a 0 or a 1 - */ -int mbedtls_mpi_get_bit( const mbedtls_mpi *X, size_t pos ); - -/** - * \brief Set a bit of X to a specific value of 0 or 1 - * - * \note Will grow X if necessary to set a bit to 1 in a not yet - * existing limb. Will not grow if bit should be set to 0 - * - * \param X MPI to use - * \param pos Zero-based index of the bit in X - * \param val The value to set the bit to (0 or 1) - * - * \return 0 if successful, - * MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed, - * MBEDTLS_ERR_MPI_BAD_INPUT_DATA if val is not 0 or 1 - */ -int mbedtls_mpi_set_bit( mbedtls_mpi *X, size_t pos, unsigned char val ); - -/** - * \brief Return the number of zero-bits before the least significant - * '1' bit - * - * Note: Thus also the zero-based index of the least significant '1' bit - * - * \param X MPI to use - */ -size_t mbedtls_mpi_lsb( const mbedtls_mpi *X ); - -/** - * \brief Return the number of bits up to and including the most - * significant '1' bit' - * - * Note: Thus also the one-based index of the most significant '1' bit - * - * \param X MPI to use - */ -size_t mbedtls_mpi_bitlen( const mbedtls_mpi *X ); - -/** - * \brief Return the total size in bytes - * - * \param X MPI to use - */ -size_t mbedtls_mpi_size( const mbedtls_mpi *X ); - -/** - * \brief Import from an ASCII string - * - * \param X Destination MPI - * \param radix Input numeric base - * \param s Null-terminated string buffer - * - * \return 0 if successful, or a MBEDTLS_ERR_MPI_XXX error code - */ -int mbedtls_mpi_read_string( mbedtls_mpi *X, int radix, const char *s ); - -/** - * \brief Export into an ASCII string - * - * \param X Source MPI - * \param radix Output numeric base - * \param buf Buffer to write the string to - * \param buflen Length of buf - * \param olen Length of the string written, including final NUL byte - * - * \return 0 if successful, or a MBEDTLS_ERR_MPI_XXX error code. - * *olen is always updated to reflect the amount - * of data that has (or would have) been written. - * - * \note Call this function with buflen = 0 to obtain the - * minimum required buffer size in *olen. - */ -int mbedtls_mpi_write_string( const mbedtls_mpi *X, int radix, - char *buf, size_t buflen, size_t *olen ); - -#if defined(MBEDTLS_FS_IO) -/** - * \brief Read X from an opened file - * - * \param X Destination MPI - * \param radix Input numeric base - * \param fin Input file handle - * - * \return 0 if successful, MBEDTLS_ERR_MPI_BUFFER_TOO_SMALL if - * the file read buffer is too small or a - * MBEDTLS_ERR_MPI_XXX error code - */ -int mbedtls_mpi_read_file( mbedtls_mpi *X, int radix, FILE *fin ); - -/** - * \brief Write X into an opened file, or stdout if fout is NULL - * - * \param p Prefix, can be NULL - * \param X Source MPI - * \param radix Output numeric base - * \param fout Output file handle (can be NULL) - * - * \return 0 if successful, or a MBEDTLS_ERR_MPI_XXX error code - * - * \note Set fout == NULL to print X on the console. - */ -int mbedtls_mpi_write_file( const char *p, const mbedtls_mpi *X, int radix, FILE *fout ); -#endif /* MBEDTLS_FS_IO */ - -/** - * \brief Import X from unsigned binary data, big endian - * - * \param X Destination MPI - * \param buf Input buffer - * \param buflen Input buffer size - * - * \return 0 if successful, - * MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed - */ -int mbedtls_mpi_read_binary( mbedtls_mpi *X, const unsigned char *buf, size_t buflen ); - -/** - * \brief Export X into unsigned binary data, big endian. - * Always fills the whole buffer, which will start with zeros - * if the number is smaller. - * - * \param X Source MPI - * \param buf Output buffer - * \param buflen Output buffer size - * - * \return 0 if successful, - * MBEDTLS_ERR_MPI_BUFFER_TOO_SMALL if buf isn't large enough - */ -int mbedtls_mpi_write_binary( const mbedtls_mpi *X, unsigned char *buf, size_t buflen ); - -/** - * \brief Left-shift: X <<= count - * - * \param X MPI to shift - * \param count Amount to shift - * - * \return 0 if successful, - * MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed - */ -int mbedtls_mpi_shift_l( mbedtls_mpi *X, size_t count ); - -/** - * \brief Right-shift: X >>= count - * - * \param X MPI to shift - * \param count Amount to shift - * - * \return 0 if successful, - * MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed - */ -int mbedtls_mpi_shift_r( mbedtls_mpi *X, size_t count ); - -/** - * \brief Compare unsigned values - * - * \param X Left-hand MPI - * \param Y Right-hand MPI - * - * \return 1 if |X| is greater than |Y|, - * -1 if |X| is lesser than |Y| or - * 0 if |X| is equal to |Y| - */ -int mbedtls_mpi_cmp_abs( const mbedtls_mpi *X, const mbedtls_mpi *Y ); - -/** - * \brief Compare signed values - * - * \param X Left-hand MPI - * \param Y Right-hand MPI - * - * \return 1 if X is greater than Y, - * -1 if X is lesser than Y or - * 0 if X is equal to Y - */ -int mbedtls_mpi_cmp_mpi( const mbedtls_mpi *X, const mbedtls_mpi *Y ); - -/** - * \brief Compare signed values - * - * \param X Left-hand MPI - * \param z The integer value to compare to - * - * \return 1 if X is greater than z, - * -1 if X is lesser than z or - * 0 if X is equal to z - */ -int mbedtls_mpi_cmp_int( const mbedtls_mpi *X, mbedtls_mpi_sint z ); - -/** - * \brief Unsigned addition: X = |A| + |B| - * - * \param X Destination MPI - * \param A Left-hand MPI - * \param B Right-hand MPI - * - * \return 0 if successful, - * MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed - */ -int mbedtls_mpi_add_abs( mbedtls_mpi *X, const mbedtls_mpi *A, const mbedtls_mpi *B ); - -/** - * \brief Unsigned subtraction: X = |A| - |B| - * - * \param X Destination MPI - * \param A Left-hand MPI - * \param B Right-hand MPI - * - * \return 0 if successful, - * MBEDTLS_ERR_MPI_NEGATIVE_VALUE if B is greater than A - */ -int mbedtls_mpi_sub_abs( mbedtls_mpi *X, const mbedtls_mpi *A, const mbedtls_mpi *B ); - -/** - * \brief Signed addition: X = A + B - * - * \param X Destination MPI - * \param A Left-hand MPI - * \param B Right-hand MPI - * - * \return 0 if successful, - * MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed - */ -int mbedtls_mpi_add_mpi( mbedtls_mpi *X, const mbedtls_mpi *A, const mbedtls_mpi *B ); - -/** - * \brief Signed subtraction: X = A - B - * - * \param X Destination MPI - * \param A Left-hand MPI - * \param B Right-hand MPI - * - * \return 0 if successful, - * MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed - */ -int mbedtls_mpi_sub_mpi( mbedtls_mpi *X, const mbedtls_mpi *A, const mbedtls_mpi *B ); - -/** - * \brief Signed addition: X = A + b - * - * \param X Destination MPI - * \param A Left-hand MPI - * \param b The integer value to add - * - * \return 0 if successful, - * MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed - */ -int mbedtls_mpi_add_int( mbedtls_mpi *X, const mbedtls_mpi *A, mbedtls_mpi_sint b ); - -/** - * \brief Signed subtraction: X = A - b - * - * \param X Destination MPI - * \param A Left-hand MPI - * \param b The integer value to subtract - * - * \return 0 if successful, - * MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed - */ -int mbedtls_mpi_sub_int( mbedtls_mpi *X, const mbedtls_mpi *A, mbedtls_mpi_sint b ); - -/** - * \brief Baseline multiplication: X = A * B - * - * \param X Destination MPI - * \param A Left-hand MPI - * \param B Right-hand MPI - * - * \return 0 if successful, - * MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed - */ -int mbedtls_mpi_mul_mpi( mbedtls_mpi *X, const mbedtls_mpi *A, const mbedtls_mpi *B ); - -/** - * \brief Baseline multiplication: X = A * b - * - * \param X Destination MPI - * \param A Left-hand MPI - * \param b The unsigned integer value to multiply with - * - * \note b is unsigned - * - * \return 0 if successful, - * MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed - */ -int mbedtls_mpi_mul_int( mbedtls_mpi *X, const mbedtls_mpi *A, mbedtls_mpi_uint b ); - -/** - * \brief Division by mbedtls_mpi: A = Q * B + R - * - * \param Q Destination MPI for the quotient - * \param R Destination MPI for the rest value - * \param A Left-hand MPI - * \param B Right-hand MPI - * - * \return 0 if successful, - * MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed, - * MBEDTLS_ERR_MPI_DIVISION_BY_ZERO if B == 0 - * - * \note Either Q or R can be NULL. - */ -int mbedtls_mpi_div_mpi( mbedtls_mpi *Q, mbedtls_mpi *R, const mbedtls_mpi *A, const mbedtls_mpi *B ); - -/** - * \brief Division by int: A = Q * b + R - * - * \param Q Destination MPI for the quotient - * \param R Destination MPI for the rest value - * \param A Left-hand MPI - * \param b Integer to divide by - * - * \return 0 if successful, - * MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed, - * MBEDTLS_ERR_MPI_DIVISION_BY_ZERO if b == 0 - * - * \note Either Q or R can be NULL. - */ -int mbedtls_mpi_div_int( mbedtls_mpi *Q, mbedtls_mpi *R, const mbedtls_mpi *A, mbedtls_mpi_sint b ); - -/** - * \brief Modulo: R = A mod B - * - * \param R Destination MPI for the rest value - * \param A Left-hand MPI - * \param B Right-hand MPI - * - * \return 0 if successful, - * MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed, - * MBEDTLS_ERR_MPI_DIVISION_BY_ZERO if B == 0, - * MBEDTLS_ERR_MPI_NEGATIVE_VALUE if B < 0 - */ -int mbedtls_mpi_mod_mpi( mbedtls_mpi *R, const mbedtls_mpi *A, const mbedtls_mpi *B ); - -/** - * \brief Modulo: r = A mod b - * - * \param r Destination mbedtls_mpi_uint - * \param A Left-hand MPI - * \param b Integer to divide by - * - * \return 0 if successful, - * MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed, - * MBEDTLS_ERR_MPI_DIVISION_BY_ZERO if b == 0, - * MBEDTLS_ERR_MPI_NEGATIVE_VALUE if b < 0 - */ -int mbedtls_mpi_mod_int( mbedtls_mpi_uint *r, const mbedtls_mpi *A, mbedtls_mpi_sint b ); - -/** - * \brief Sliding-window exponentiation: X = A^E mod N - * - * \param X Destination MPI - * \param A Left-hand MPI - * \param E Exponent MPI - * \param N Modular MPI - * \param _RR Speed-up MPI used for recalculations - * - * \return 0 if successful, - * MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed, - * MBEDTLS_ERR_MPI_BAD_INPUT_DATA if N is negative or even or - * if E is negative - * - * \note _RR is used to avoid re-computing R*R mod N across - * multiple calls, which speeds up things a bit. It can - * be set to NULL if the extra performance is unneeded. - */ -int mbedtls_mpi_exp_mod( mbedtls_mpi *X, const mbedtls_mpi *A, const mbedtls_mpi *E, const mbedtls_mpi *N, mbedtls_mpi *_RR ); - -/** - * \brief Fill an MPI X with size bytes of random - * - * \param X Destination MPI - * \param size Size in bytes - * \param f_rng RNG function - * \param p_rng RNG parameter - * - * \return 0 if successful, - * MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed - */ -int mbedtls_mpi_fill_random( mbedtls_mpi *X, size_t size, - int (*f_rng)(void *, unsigned char *, size_t), - void *p_rng ); - -/** - * \brief Greatest common divisor: G = gcd(A, B) - * - * \param G Destination MPI - * \param A Left-hand MPI - * \param B Right-hand MPI - * - * \return 0 if successful, - * MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed - */ -int mbedtls_mpi_gcd( mbedtls_mpi *G, const mbedtls_mpi *A, const mbedtls_mpi *B ); - -/** - * \brief Modular inverse: X = A^-1 mod N - * - * \param X Destination MPI - * \param A Left-hand MPI - * \param N Right-hand MPI - * - * \return 0 if successful, - * MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed, - * MBEDTLS_ERR_MPI_BAD_INPUT_DATA if N is negative or nil - MBEDTLS_ERR_MPI_NOT_ACCEPTABLE if A has no inverse mod N - */ -int mbedtls_mpi_inv_mod( mbedtls_mpi *X, const mbedtls_mpi *A, const mbedtls_mpi *N ); - -/** - * \brief Miller-Rabin primality test - * - * \param X MPI to check - * \param f_rng RNG function - * \param p_rng RNG parameter - * - * \return 0 if successful (probably prime), - * MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed, - * MBEDTLS_ERR_MPI_NOT_ACCEPTABLE if X is not prime - */ -int mbedtls_mpi_is_prime( const mbedtls_mpi *X, - int (*f_rng)(void *, unsigned char *, size_t), - void *p_rng ); - -/** - * \brief Prime number generation - * - * \param X Destination MPI - * \param nbits Required size of X in bits - * ( 3 <= nbits <= MBEDTLS_MPI_MAX_BITS ) - * \param dh_flag If 1, then (X-1)/2 will be prime too - * \param f_rng RNG function - * \param p_rng RNG parameter - * - * \return 0 if successful (probably prime), - * MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed, - * MBEDTLS_ERR_MPI_BAD_INPUT_DATA if nbits is < 3 - */ -int mbedtls_mpi_gen_prime( mbedtls_mpi *X, size_t nbits, int dh_flag, - int (*f_rng)(void *, unsigned char *, size_t), - void *p_rng ); - -/** - * \brief Checkup routine - * - * \return 0 if successful, or 1 if the test failed - */ -int mbedtls_mpi_self_test( int verbose ); - -#ifdef __cplusplus -} -#endif - -#endif /* bignum.h */ diff --git a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/blowfish.h b/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/blowfish.h deleted file mode 100644 index 34626eef..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/blowfish.h +++ /dev/null @@ -1,203 +0,0 @@ -/** - * \file blowfish.h - * - * \brief Blowfish block cipher - * - * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * This file is part of mbed TLS (https://tls.mbed.org) - */ -#ifndef MBEDTLS_BLOWFISH_H -#define MBEDTLS_BLOWFISH_H - -#if !defined(MBEDTLS_CONFIG_FILE) -#include "config.h" -#else -#include MBEDTLS_CONFIG_FILE -#endif - -#include -#include - -#define MBEDTLS_BLOWFISH_ENCRYPT 1 -#define MBEDTLS_BLOWFISH_DECRYPT 0 -#define MBEDTLS_BLOWFISH_MAX_KEY_BITS 448 -#define MBEDTLS_BLOWFISH_MIN_KEY_BITS 32 -#define MBEDTLS_BLOWFISH_ROUNDS 16 /**< Rounds to use. When increasing this value, make sure to extend the initialisation vectors */ -#define MBEDTLS_BLOWFISH_BLOCKSIZE 8 /* Blowfish uses 64 bit blocks */ - -#define MBEDTLS_ERR_BLOWFISH_INVALID_KEY_LENGTH -0x0016 /**< Invalid key length. */ -#define MBEDTLS_ERR_BLOWFISH_INVALID_INPUT_LENGTH -0x0018 /**< Invalid data input length. */ - -#if !defined(MBEDTLS_BLOWFISH_ALT) -// Regular implementation -// - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * \brief Blowfish context structure - */ -typedef struct -{ - uint32_t P[MBEDTLS_BLOWFISH_ROUNDS + 2]; /*!< Blowfish round keys */ - uint32_t S[4][256]; /*!< key dependent S-boxes */ -} -mbedtls_blowfish_context; - -/** - * \brief Initialize Blowfish context - * - * \param ctx Blowfish context to be initialized - */ -void mbedtls_blowfish_init( mbedtls_blowfish_context *ctx ); - -/** - * \brief Clear Blowfish context - * - * \param ctx Blowfish context to be cleared - */ -void mbedtls_blowfish_free( mbedtls_blowfish_context *ctx ); - -/** - * \brief Blowfish key schedule - * - * \param ctx Blowfish context to be initialized - * \param key encryption key - * \param keybits must be between 32 and 448 bits - * - * \return 0 if successful, or MBEDTLS_ERR_BLOWFISH_INVALID_KEY_LENGTH - */ -int mbedtls_blowfish_setkey( mbedtls_blowfish_context *ctx, const unsigned char *key, - unsigned int keybits ); - -/** - * \brief Blowfish-ECB block encryption/decryption - * - * \param ctx Blowfish context - * \param mode MBEDTLS_BLOWFISH_ENCRYPT or MBEDTLS_BLOWFISH_DECRYPT - * \param input 8-byte input block - * \param output 8-byte output block - * - * \return 0 if successful - */ -int mbedtls_blowfish_crypt_ecb( mbedtls_blowfish_context *ctx, - int mode, - const unsigned char input[MBEDTLS_BLOWFISH_BLOCKSIZE], - unsigned char output[MBEDTLS_BLOWFISH_BLOCKSIZE] ); - -#if defined(MBEDTLS_CIPHER_MODE_CBC) -/** - * \brief Blowfish-CBC buffer encryption/decryption - * Length should be a multiple of the block - * size (8 bytes) - * - * \note Upon exit, the content of the IV is updated so that you can - * call the function same function again on the following - * block(s) of data and get the same result as if it was - * encrypted in one call. This allows a "streaming" usage. - * If on the other hand you need to retain the contents of the - * IV, you should either save it manually or use the cipher - * module instead. - * - * \param ctx Blowfish context - * \param mode MBEDTLS_BLOWFISH_ENCRYPT or MBEDTLS_BLOWFISH_DECRYPT - * \param length length of the input data - * \param iv initialization vector (updated after use) - * \param input buffer holding the input data - * \param output buffer holding the output data - * - * \return 0 if successful, or - * MBEDTLS_ERR_BLOWFISH_INVALID_INPUT_LENGTH - */ -int mbedtls_blowfish_crypt_cbc( mbedtls_blowfish_context *ctx, - int mode, - size_t length, - unsigned char iv[MBEDTLS_BLOWFISH_BLOCKSIZE], - const unsigned char *input, - unsigned char *output ); -#endif /* MBEDTLS_CIPHER_MODE_CBC */ - -#if defined(MBEDTLS_CIPHER_MODE_CFB) -/** - * \brief Blowfish CFB buffer encryption/decryption. - * - * \note Upon exit, the content of the IV is updated so that you can - * call the function same function again on the following - * block(s) of data and get the same result as if it was - * encrypted in one call. This allows a "streaming" usage. - * If on the other hand you need to retain the contents of the - * IV, you should either save it manually or use the cipher - * module instead. - * - * \param ctx Blowfish context - * \param mode MBEDTLS_BLOWFISH_ENCRYPT or MBEDTLS_BLOWFISH_DECRYPT - * \param length length of the input data - * \param iv_off offset in IV (updated after use) - * \param iv initialization vector (updated after use) - * \param input buffer holding the input data - * \param output buffer holding the output data - * - * \return 0 if successful - */ -int mbedtls_blowfish_crypt_cfb64( mbedtls_blowfish_context *ctx, - int mode, - size_t length, - size_t *iv_off, - unsigned char iv[MBEDTLS_BLOWFISH_BLOCKSIZE], - const unsigned char *input, - unsigned char *output ); -#endif /*MBEDTLS_CIPHER_MODE_CFB */ - -#if defined(MBEDTLS_CIPHER_MODE_CTR) -/** - * \brief Blowfish-CTR buffer encryption/decryption - * - * Warning: You have to keep the maximum use of your counter in mind! - * - * \param ctx Blowfish context - * \param length The length of the data - * \param nc_off The offset in the current stream_block (for resuming - * within current cipher stream). The offset pointer to - * should be 0 at the start of a stream. - * \param nonce_counter The 64-bit nonce and counter. - * \param stream_block The saved stream-block for resuming. Is overwritten - * by the function. - * \param input The input data stream - * \param output The output data stream - * - * \return 0 if successful - */ -int mbedtls_blowfish_crypt_ctr( mbedtls_blowfish_context *ctx, - size_t length, - size_t *nc_off, - unsigned char nonce_counter[MBEDTLS_BLOWFISH_BLOCKSIZE], - unsigned char stream_block[MBEDTLS_BLOWFISH_BLOCKSIZE], - const unsigned char *input, - unsigned char *output ); -#endif /* MBEDTLS_CIPHER_MODE_CTR */ - -#ifdef __cplusplus -} -#endif - -#else /* MBEDTLS_BLOWFISH_ALT */ -#include "blowfish_alt.h" -#endif /* MBEDTLS_BLOWFISH_ALT */ - -#endif /* blowfish.h */ diff --git a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/bn_mul.h b/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/bn_mul.h deleted file mode 100644 index 003f605b..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/bn_mul.h +++ /dev/null @@ -1,875 +0,0 @@ -/** - * \file bn_mul.h - * - * \brief Multi-precision integer library - * - * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * This file is part of mbed TLS (https://tls.mbed.org) - */ -/* - * Multiply source vector [s] with b, add result - * to destination vector [d] and set carry c. - * - * Currently supports: - * - * . IA-32 (386+) . AMD64 / EM64T - * . IA-32 (SSE2) . Motorola 68000 - * . PowerPC, 32-bit . MicroBlaze - * . PowerPC, 64-bit . TriCore - * . SPARC v8 . ARM v3+ - * . Alpha . MIPS32 - * . C, longlong . C, generic - */ -#ifndef MBEDTLS_BN_MUL_H -#define MBEDTLS_BN_MUL_H - -#include "bignum.h" - -#if defined(MBEDTLS_HAVE_ASM) - -#ifndef asm -#define asm __asm -#endif - -/* armcc5 --gnu defines __GNUC__ but doesn't support GNU's extended asm */ -#if defined(__GNUC__) && \ - ( !defined(__ARMCC_VERSION) || __ARMCC_VERSION >= 6000000 ) -#if defined(__i386__) - -#define MULADDC_INIT \ - asm( \ - "movl %%ebx, %0 \n\t" \ - "movl %5, %%esi \n\t" \ - "movl %6, %%edi \n\t" \ - "movl %7, %%ecx \n\t" \ - "movl %8, %%ebx \n\t" - -#define MULADDC_CORE \ - "lodsl \n\t" \ - "mull %%ebx \n\t" \ - "addl %%ecx, %%eax \n\t" \ - "adcl $0, %%edx \n\t" \ - "addl (%%edi), %%eax \n\t" \ - "adcl $0, %%edx \n\t" \ - "movl %%edx, %%ecx \n\t" \ - "stosl \n\t" - -#if defined(MBEDTLS_HAVE_SSE2) - -#define MULADDC_HUIT \ - "movd %%ecx, %%mm1 \n\t" \ - "movd %%ebx, %%mm0 \n\t" \ - "movd (%%edi), %%mm3 \n\t" \ - "paddq %%mm3, %%mm1 \n\t" \ - "movd (%%esi), %%mm2 \n\t" \ - "pmuludq %%mm0, %%mm2 \n\t" \ - "movd 4(%%esi), %%mm4 \n\t" \ - "pmuludq %%mm0, %%mm4 \n\t" \ - "movd 8(%%esi), %%mm6 \n\t" \ - "pmuludq %%mm0, %%mm6 \n\t" \ - "movd 12(%%esi), %%mm7 \n\t" \ - "pmuludq %%mm0, %%mm7 \n\t" \ - "paddq %%mm2, %%mm1 \n\t" \ - "movd 4(%%edi), %%mm3 \n\t" \ - "paddq %%mm4, %%mm3 \n\t" \ - "movd 8(%%edi), %%mm5 \n\t" \ - "paddq %%mm6, %%mm5 \n\t" \ - "movd 12(%%edi), %%mm4 \n\t" \ - "paddq %%mm4, %%mm7 \n\t" \ - "movd %%mm1, (%%edi) \n\t" \ - "movd 16(%%esi), %%mm2 \n\t" \ - "pmuludq %%mm0, %%mm2 \n\t" \ - "psrlq $32, %%mm1 \n\t" \ - "movd 20(%%esi), %%mm4 \n\t" \ - "pmuludq %%mm0, %%mm4 \n\t" \ - "paddq %%mm3, %%mm1 \n\t" \ - "movd 24(%%esi), %%mm6 \n\t" \ - "pmuludq %%mm0, %%mm6 \n\t" \ - "movd %%mm1, 4(%%edi) \n\t" \ - "psrlq $32, %%mm1 \n\t" \ - "movd 28(%%esi), %%mm3 \n\t" \ - "pmuludq %%mm0, %%mm3 \n\t" \ - "paddq %%mm5, %%mm1 \n\t" \ - "movd 16(%%edi), %%mm5 \n\t" \ - "paddq %%mm5, %%mm2 \n\t" \ - "movd %%mm1, 8(%%edi) \n\t" \ - "psrlq $32, %%mm1 \n\t" \ - "paddq %%mm7, %%mm1 \n\t" \ - "movd 20(%%edi), %%mm5 \n\t" \ - "paddq %%mm5, %%mm4 \n\t" \ - "movd %%mm1, 12(%%edi) \n\t" \ - "psrlq $32, %%mm1 \n\t" \ - "paddq %%mm2, %%mm1 \n\t" \ - "movd 24(%%edi), %%mm5 \n\t" \ - "paddq %%mm5, %%mm6 \n\t" \ - "movd %%mm1, 16(%%edi) \n\t" \ - "psrlq $32, %%mm1 \n\t" \ - "paddq %%mm4, %%mm1 \n\t" \ - "movd 28(%%edi), %%mm5 \n\t" \ - "paddq %%mm5, %%mm3 \n\t" \ - "movd %%mm1, 20(%%edi) \n\t" \ - "psrlq $32, %%mm1 \n\t" \ - "paddq %%mm6, %%mm1 \n\t" \ - "movd %%mm1, 24(%%edi) \n\t" \ - "psrlq $32, %%mm1 \n\t" \ - "paddq %%mm3, %%mm1 \n\t" \ - "movd %%mm1, 28(%%edi) \n\t" \ - "addl $32, %%edi \n\t" \ - "addl $32, %%esi \n\t" \ - "psrlq $32, %%mm1 \n\t" \ - "movd %%mm1, %%ecx \n\t" - -#define MULADDC_STOP \ - "emms \n\t" \ - "movl %4, %%ebx \n\t" \ - "movl %%ecx, %1 \n\t" \ - "movl %%edi, %2 \n\t" \ - "movl %%esi, %3 \n\t" \ - : "=m" (t), "=m" (c), "=m" (d), "=m" (s) \ - : "m" (t), "m" (s), "m" (d), "m" (c), "m" (b) \ - : "eax", "ecx", "edx", "esi", "edi" \ - ); - -#else - -#define MULADDC_STOP \ - "movl %4, %%ebx \n\t" \ - "movl %%ecx, %1 \n\t" \ - "movl %%edi, %2 \n\t" \ - "movl %%esi, %3 \n\t" \ - : "=m" (t), "=m" (c), "=m" (d), "=m" (s) \ - : "m" (t), "m" (s), "m" (d), "m" (c), "m" (b) \ - : "eax", "ecx", "edx", "esi", "edi" \ - ); -#endif /* SSE2 */ -#endif /* i386 */ - -#if defined(__amd64__) || defined (__x86_64__) - -#define MULADDC_INIT \ - asm( \ - "movq %3, %%rsi \n\t" \ - "movq %4, %%rdi \n\t" \ - "movq %5, %%rcx \n\t" \ - "movq %6, %%rbx \n\t" \ - "xorq %%r8, %%r8 \n\t" - -#define MULADDC_CORE \ - "movq (%%rsi), %%rax \n\t" \ - "mulq %%rbx \n\t" \ - "addq $8, %%rsi \n\t" \ - "addq %%rcx, %%rax \n\t" \ - "movq %%r8, %%rcx \n\t" \ - "adcq $0, %%rdx \n\t" \ - "nop \n\t" \ - "addq %%rax, (%%rdi) \n\t" \ - "adcq %%rdx, %%rcx \n\t" \ - "addq $8, %%rdi \n\t" - -#define MULADDC_STOP \ - "movq %%rcx, %0 \n\t" \ - "movq %%rdi, %1 \n\t" \ - "movq %%rsi, %2 \n\t" \ - : "=m" (c), "=m" (d), "=m" (s) \ - : "m" (s), "m" (d), "m" (c), "m" (b) \ - : "rax", "rcx", "rdx", "rbx", "rsi", "rdi", "r8" \ - ); - -#endif /* AMD64 */ - -#if defined(__mc68020__) || defined(__mcpu32__) - -#define MULADDC_INIT \ - asm( \ - "movl %3, %%a2 \n\t" \ - "movl %4, %%a3 \n\t" \ - "movl %5, %%d3 \n\t" \ - "movl %6, %%d2 \n\t" \ - "moveq #0, %%d0 \n\t" - -#define MULADDC_CORE \ - "movel %%a2@+, %%d1 \n\t" \ - "mulul %%d2, %%d4:%%d1 \n\t" \ - "addl %%d3, %%d1 \n\t" \ - "addxl %%d0, %%d4 \n\t" \ - "moveq #0, %%d3 \n\t" \ - "addl %%d1, %%a3@+ \n\t" \ - "addxl %%d4, %%d3 \n\t" - -#define MULADDC_STOP \ - "movl %%d3, %0 \n\t" \ - "movl %%a3, %1 \n\t" \ - "movl %%a2, %2 \n\t" \ - : "=m" (c), "=m" (d), "=m" (s) \ - : "m" (s), "m" (d), "m" (c), "m" (b) \ - : "d0", "d1", "d2", "d3", "d4", "a2", "a3" \ - ); - -#define MULADDC_HUIT \ - "movel %%a2@+, %%d1 \n\t" \ - "mulul %%d2, %%d4:%%d1 \n\t" \ - "addxl %%d3, %%d1 \n\t" \ - "addxl %%d0, %%d4 \n\t" \ - "addl %%d1, %%a3@+ \n\t" \ - "movel %%a2@+, %%d1 \n\t" \ - "mulul %%d2, %%d3:%%d1 \n\t" \ - "addxl %%d4, %%d1 \n\t" \ - "addxl %%d0, %%d3 \n\t" \ - "addl %%d1, %%a3@+ \n\t" \ - "movel %%a2@+, %%d1 \n\t" \ - "mulul %%d2, %%d4:%%d1 \n\t" \ - "addxl %%d3, %%d1 \n\t" \ - "addxl %%d0, %%d4 \n\t" \ - "addl %%d1, %%a3@+ \n\t" \ - "movel %%a2@+, %%d1 \n\t" \ - "mulul %%d2, %%d3:%%d1 \n\t" \ - "addxl %%d4, %%d1 \n\t" \ - "addxl %%d0, %%d3 \n\t" \ - "addl %%d1, %%a3@+ \n\t" \ - "movel %%a2@+, %%d1 \n\t" \ - "mulul %%d2, %%d4:%%d1 \n\t" \ - "addxl %%d3, %%d1 \n\t" \ - "addxl %%d0, %%d4 \n\t" \ - "addl %%d1, %%a3@+ \n\t" \ - "movel %%a2@+, %%d1 \n\t" \ - "mulul %%d2, %%d3:%%d1 \n\t" \ - "addxl %%d4, %%d1 \n\t" \ - "addxl %%d0, %%d3 \n\t" \ - "addl %%d1, %%a3@+ \n\t" \ - "movel %%a2@+, %%d1 \n\t" \ - "mulul %%d2, %%d4:%%d1 \n\t" \ - "addxl %%d3, %%d1 \n\t" \ - "addxl %%d0, %%d4 \n\t" \ - "addl %%d1, %%a3@+ \n\t" \ - "movel %%a2@+, %%d1 \n\t" \ - "mulul %%d2, %%d3:%%d1 \n\t" \ - "addxl %%d4, %%d1 \n\t" \ - "addxl %%d0, %%d3 \n\t" \ - "addl %%d1, %%a3@+ \n\t" \ - "addxl %%d0, %%d3 \n\t" - -#endif /* MC68000 */ - -#if defined(__powerpc64__) || defined(__ppc64__) - -#if defined(__MACH__) && defined(__APPLE__) - -#define MULADDC_INIT \ - asm( \ - "ld r3, %3 \n\t" \ - "ld r4, %4 \n\t" \ - "ld r5, %5 \n\t" \ - "ld r6, %6 \n\t" \ - "addi r3, r3, -8 \n\t" \ - "addi r4, r4, -8 \n\t" \ - "addic r5, r5, 0 \n\t" - -#define MULADDC_CORE \ - "ldu r7, 8(r3) \n\t" \ - "mulld r8, r7, r6 \n\t" \ - "mulhdu r9, r7, r6 \n\t" \ - "adde r8, r8, r5 \n\t" \ - "ld r7, 8(r4) \n\t" \ - "addze r5, r9 \n\t" \ - "addc r8, r8, r7 \n\t" \ - "stdu r8, 8(r4) \n\t" - -#define MULADDC_STOP \ - "addze r5, r5 \n\t" \ - "addi r4, r4, 8 \n\t" \ - "addi r3, r3, 8 \n\t" \ - "std r5, %0 \n\t" \ - "std r4, %1 \n\t" \ - "std r3, %2 \n\t" \ - : "=m" (c), "=m" (d), "=m" (s) \ - : "m" (s), "m" (d), "m" (c), "m" (b) \ - : "r3", "r4", "r5", "r6", "r7", "r8", "r9" \ - ); - - -#else /* __MACH__ && __APPLE__ */ - -#define MULADDC_INIT \ - asm( \ - "ld %%r3, %3 \n\t" \ - "ld %%r4, %4 \n\t" \ - "ld %%r5, %5 \n\t" \ - "ld %%r6, %6 \n\t" \ - "addi %%r3, %%r3, -8 \n\t" \ - "addi %%r4, %%r4, -8 \n\t" \ - "addic %%r5, %%r5, 0 \n\t" - -#define MULADDC_CORE \ - "ldu %%r7, 8(%%r3) \n\t" \ - "mulld %%r8, %%r7, %%r6 \n\t" \ - "mulhdu %%r9, %%r7, %%r6 \n\t" \ - "adde %%r8, %%r8, %%r5 \n\t" \ - "ld %%r7, 8(%%r4) \n\t" \ - "addze %%r5, %%r9 \n\t" \ - "addc %%r8, %%r8, %%r7 \n\t" \ - "stdu %%r8, 8(%%r4) \n\t" - -#define MULADDC_STOP \ - "addze %%r5, %%r5 \n\t" \ - "addi %%r4, %%r4, 8 \n\t" \ - "addi %%r3, %%r3, 8 \n\t" \ - "std %%r5, %0 \n\t" \ - "std %%r4, %1 \n\t" \ - "std %%r3, %2 \n\t" \ - : "=m" (c), "=m" (d), "=m" (s) \ - : "m" (s), "m" (d), "m" (c), "m" (b) \ - : "r3", "r4", "r5", "r6", "r7", "r8", "r9" \ - ); - -#endif /* __MACH__ && __APPLE__ */ - -#elif defined(__powerpc__) || defined(__ppc__) /* end PPC64/begin PPC32 */ - -#if defined(__MACH__) && defined(__APPLE__) - -#define MULADDC_INIT \ - asm( \ - "lwz r3, %3 \n\t" \ - "lwz r4, %4 \n\t" \ - "lwz r5, %5 \n\t" \ - "lwz r6, %6 \n\t" \ - "addi r3, r3, -4 \n\t" \ - "addi r4, r4, -4 \n\t" \ - "addic r5, r5, 0 \n\t" - -#define MULADDC_CORE \ - "lwzu r7, 4(r3) \n\t" \ - "mullw r8, r7, r6 \n\t" \ - "mulhwu r9, r7, r6 \n\t" \ - "adde r8, r8, r5 \n\t" \ - "lwz r7, 4(r4) \n\t" \ - "addze r5, r9 \n\t" \ - "addc r8, r8, r7 \n\t" \ - "stwu r8, 4(r4) \n\t" - -#define MULADDC_STOP \ - "addze r5, r5 \n\t" \ - "addi r4, r4, 4 \n\t" \ - "addi r3, r3, 4 \n\t" \ - "stw r5, %0 \n\t" \ - "stw r4, %1 \n\t" \ - "stw r3, %2 \n\t" \ - : "=m" (c), "=m" (d), "=m" (s) \ - : "m" (s), "m" (d), "m" (c), "m" (b) \ - : "r3", "r4", "r5", "r6", "r7", "r8", "r9" \ - ); - -#else /* __MACH__ && __APPLE__ */ - -#define MULADDC_INIT \ - asm( \ - "lwz %%r3, %3 \n\t" \ - "lwz %%r4, %4 \n\t" \ - "lwz %%r5, %5 \n\t" \ - "lwz %%r6, %6 \n\t" \ - "addi %%r3, %%r3, -4 \n\t" \ - "addi %%r4, %%r4, -4 \n\t" \ - "addic %%r5, %%r5, 0 \n\t" - -#define MULADDC_CORE \ - "lwzu %%r7, 4(%%r3) \n\t" \ - "mullw %%r8, %%r7, %%r6 \n\t" \ - "mulhwu %%r9, %%r7, %%r6 \n\t" \ - "adde %%r8, %%r8, %%r5 \n\t" \ - "lwz %%r7, 4(%%r4) \n\t" \ - "addze %%r5, %%r9 \n\t" \ - "addc %%r8, %%r8, %%r7 \n\t" \ - "stwu %%r8, 4(%%r4) \n\t" - -#define MULADDC_STOP \ - "addze %%r5, %%r5 \n\t" \ - "addi %%r4, %%r4, 4 \n\t" \ - "addi %%r3, %%r3, 4 \n\t" \ - "stw %%r5, %0 \n\t" \ - "stw %%r4, %1 \n\t" \ - "stw %%r3, %2 \n\t" \ - : "=m" (c), "=m" (d), "=m" (s) \ - : "m" (s), "m" (d), "m" (c), "m" (b) \ - : "r3", "r4", "r5", "r6", "r7", "r8", "r9" \ - ); - -#endif /* __MACH__ && __APPLE__ */ - -#endif /* PPC32 */ - -/* - * The Sparc64 assembly is reported to be broken. - * Disable it for now, until we're able to fix it. - */ -#if 0 && defined(__sparc__) && defined(__sparc64__) - -#define MULADDC_INIT \ - asm( \ - "ldx %3, %%o0 \n\t" \ - "ldx %4, %%o1 \n\t" \ - "ld %5, %%o2 \n\t" \ - "ld %6, %%o3 \n\t" - -#define MULADDC_CORE \ - "ld [%%o0], %%o4 \n\t" \ - "inc 4, %%o0 \n\t" \ - "ld [%%o1], %%o5 \n\t" \ - "umul %%o3, %%o4, %%o4 \n\t" \ - "addcc %%o4, %%o2, %%o4 \n\t" \ - "rd %%y, %%g1 \n\t" \ - "addx %%g1, 0, %%g1 \n\t" \ - "addcc %%o4, %%o5, %%o4 \n\t" \ - "st %%o4, [%%o1] \n\t" \ - "addx %%g1, 0, %%o2 \n\t" \ - "inc 4, %%o1 \n\t" - - #define MULADDC_STOP \ - "st %%o2, %0 \n\t" \ - "stx %%o1, %1 \n\t" \ - "stx %%o0, %2 \n\t" \ - : "=m" (c), "=m" (d), "=m" (s) \ - : "m" (s), "m" (d), "m" (c), "m" (b) \ - : "g1", "o0", "o1", "o2", "o3", "o4", \ - "o5" \ - ); -#endif /* SPARCv9 */ - -#if defined(__sparc__) && !defined(__sparc64__) - -#define MULADDC_INIT \ - asm( \ - "ld %3, %%o0 \n\t" \ - "ld %4, %%o1 \n\t" \ - "ld %5, %%o2 \n\t" \ - "ld %6, %%o3 \n\t" - -#define MULADDC_CORE \ - "ld [%%o0], %%o4 \n\t" \ - "inc 4, %%o0 \n\t" \ - "ld [%%o1], %%o5 \n\t" \ - "umul %%o3, %%o4, %%o4 \n\t" \ - "addcc %%o4, %%o2, %%o4 \n\t" \ - "rd %%y, %%g1 \n\t" \ - "addx %%g1, 0, %%g1 \n\t" \ - "addcc %%o4, %%o5, %%o4 \n\t" \ - "st %%o4, [%%o1] \n\t" \ - "addx %%g1, 0, %%o2 \n\t" \ - "inc 4, %%o1 \n\t" - -#define MULADDC_STOP \ - "st %%o2, %0 \n\t" \ - "st %%o1, %1 \n\t" \ - "st %%o0, %2 \n\t" \ - : "=m" (c), "=m" (d), "=m" (s) \ - : "m" (s), "m" (d), "m" (c), "m" (b) \ - : "g1", "o0", "o1", "o2", "o3", "o4", \ - "o5" \ - ); - -#endif /* SPARCv8 */ - -#if defined(__microblaze__) || defined(microblaze) - -#define MULADDC_INIT \ - asm( \ - "lwi r3, %3 \n\t" \ - "lwi r4, %4 \n\t" \ - "lwi r5, %5 \n\t" \ - "lwi r6, %6 \n\t" \ - "andi r7, r6, 0xffff \n\t" \ - "bsrli r6, r6, 16 \n\t" - -#define MULADDC_CORE \ - "lhui r8, r3, 0 \n\t" \ - "addi r3, r3, 2 \n\t" \ - "lhui r9, r3, 0 \n\t" \ - "addi r3, r3, 2 \n\t" \ - "mul r10, r9, r6 \n\t" \ - "mul r11, r8, r7 \n\t" \ - "mul r12, r9, r7 \n\t" \ - "mul r13, r8, r6 \n\t" \ - "bsrli r8, r10, 16 \n\t" \ - "bsrli r9, r11, 16 \n\t" \ - "add r13, r13, r8 \n\t" \ - "add r13, r13, r9 \n\t" \ - "bslli r10, r10, 16 \n\t" \ - "bslli r11, r11, 16 \n\t" \ - "add r12, r12, r10 \n\t" \ - "addc r13, r13, r0 \n\t" \ - "add r12, r12, r11 \n\t" \ - "addc r13, r13, r0 \n\t" \ - "lwi r10, r4, 0 \n\t" \ - "add r12, r12, r10 \n\t" \ - "addc r13, r13, r0 \n\t" \ - "add r12, r12, r5 \n\t" \ - "addc r5, r13, r0 \n\t" \ - "swi r12, r4, 0 \n\t" \ - "addi r4, r4, 4 \n\t" - -#define MULADDC_STOP \ - "swi r5, %0 \n\t" \ - "swi r4, %1 \n\t" \ - "swi r3, %2 \n\t" \ - : "=m" (c), "=m" (d), "=m" (s) \ - : "m" (s), "m" (d), "m" (c), "m" (b) \ - : "r3", "r4" "r5", "r6", "r7", "r8", \ - "r9", "r10", "r11", "r12", "r13" \ - ); - -#endif /* MicroBlaze */ - -#if defined(__tricore__) - -#define MULADDC_INIT \ - asm( \ - "ld.a %%a2, %3 \n\t" \ - "ld.a %%a3, %4 \n\t" \ - "ld.w %%d4, %5 \n\t" \ - "ld.w %%d1, %6 \n\t" \ - "xor %%d5, %%d5 \n\t" - -#define MULADDC_CORE \ - "ld.w %%d0, [%%a2+] \n\t" \ - "madd.u %%e2, %%e4, %%d0, %%d1 \n\t" \ - "ld.w %%d0, [%%a3] \n\t" \ - "addx %%d2, %%d2, %%d0 \n\t" \ - "addc %%d3, %%d3, 0 \n\t" \ - "mov %%d4, %%d3 \n\t" \ - "st.w [%%a3+], %%d2 \n\t" - -#define MULADDC_STOP \ - "st.w %0, %%d4 \n\t" \ - "st.a %1, %%a3 \n\t" \ - "st.a %2, %%a2 \n\t" \ - : "=m" (c), "=m" (d), "=m" (s) \ - : "m" (s), "m" (d), "m" (c), "m" (b) \ - : "d0", "d1", "e2", "d4", "a2", "a3" \ - ); - -#endif /* TriCore */ - -#if defined(__arm__) - -#if defined(__thumb__) && !defined(__thumb2__) - -#define MULADDC_INIT \ - asm( \ - "ldr r0, %3 \n\t" \ - "ldr r1, %4 \n\t" \ - "ldr r2, %5 \n\t" \ - "ldr r3, %6 \n\t" \ - "lsr r7, r3, #16 \n\t" \ - "mov r9, r7 \n\t" \ - "lsl r7, r3, #16 \n\t" \ - "lsr r7, r7, #16 \n\t" \ - "mov r8, r7 \n\t" - -#define MULADDC_CORE \ - "ldmia r0!, {r6} \n\t" \ - "lsr r7, r6, #16 \n\t" \ - "lsl r6, r6, #16 \n\t" \ - "lsr r6, r6, #16 \n\t" \ - "mov r4, r8 \n\t" \ - "mul r4, r6 \n\t" \ - "mov r3, r9 \n\t" \ - "mul r6, r3 \n\t" \ - "mov r5, r9 \n\t" \ - "mul r5, r7 \n\t" \ - "mov r3, r8 \n\t" \ - "mul r7, r3 \n\t" \ - "lsr r3, r6, #16 \n\t" \ - "add r5, r5, r3 \n\t" \ - "lsr r3, r7, #16 \n\t" \ - "add r5, r5, r3 \n\t" \ - "add r4, r4, r2 \n\t" \ - "mov r2, #0 \n\t" \ - "adc r5, r2 \n\t" \ - "lsl r3, r6, #16 \n\t" \ - "add r4, r4, r3 \n\t" \ - "adc r5, r2 \n\t" \ - "lsl r3, r7, #16 \n\t" \ - "add r4, r4, r3 \n\t" \ - "adc r5, r2 \n\t" \ - "ldr r3, [r1] \n\t" \ - "add r4, r4, r3 \n\t" \ - "adc r2, r5 \n\t" \ - "stmia r1!, {r4} \n\t" - -#define MULADDC_STOP \ - "str r2, %0 \n\t" \ - "str r1, %1 \n\t" \ - "str r0, %2 \n\t" \ - : "=m" (c), "=m" (d), "=m" (s) \ - : "m" (s), "m" (d), "m" (c), "m" (b) \ - : "r0", "r1", "r2", "r3", "r4", "r5", \ - "r6", "r7", "r8", "r9", "cc" \ - ); - -#else - -#define MULADDC_INIT \ - asm( \ - "ldr r0, %3 \n\t" \ - "ldr r1, %4 \n\t" \ - "ldr r2, %5 \n\t" \ - "ldr r3, %6 \n\t" - -#define MULADDC_CORE \ - "ldr r4, [r0], #4 \n\t" \ - "mov r5, #0 \n\t" \ - "ldr r6, [r1] \n\t" \ - "umlal r2, r5, r3, r4 \n\t" \ - "adds r7, r6, r2 \n\t" \ - "adc r2, r5, #0 \n\t" \ - "str r7, [r1], #4 \n\t" - -#define MULADDC_STOP \ - "str r2, %0 \n\t" \ - "str r1, %1 \n\t" \ - "str r0, %2 \n\t" \ - : "=m" (c), "=m" (d), "=m" (s) \ - : "m" (s), "m" (d), "m" (c), "m" (b) \ - : "r0", "r1", "r2", "r3", "r4", "r5", \ - "r6", "r7", "cc" \ - ); - -#endif /* Thumb */ - -#endif /* ARMv3 */ - -#if defined(__alpha__) - -#define MULADDC_INIT \ - asm( \ - "ldq $1, %3 \n\t" \ - "ldq $2, %4 \n\t" \ - "ldq $3, %5 \n\t" \ - "ldq $4, %6 \n\t" - -#define MULADDC_CORE \ - "ldq $6, 0($1) \n\t" \ - "addq $1, 8, $1 \n\t" \ - "mulq $6, $4, $7 \n\t" \ - "umulh $6, $4, $6 \n\t" \ - "addq $7, $3, $7 \n\t" \ - "cmpult $7, $3, $3 \n\t" \ - "ldq $5, 0($2) \n\t" \ - "addq $7, $5, $7 \n\t" \ - "cmpult $7, $5, $5 \n\t" \ - "stq $7, 0($2) \n\t" \ - "addq $2, 8, $2 \n\t" \ - "addq $6, $3, $3 \n\t" \ - "addq $5, $3, $3 \n\t" - -#define MULADDC_STOP \ - "stq $3, %0 \n\t" \ - "stq $2, %1 \n\t" \ - "stq $1, %2 \n\t" \ - : "=m" (c), "=m" (d), "=m" (s) \ - : "m" (s), "m" (d), "m" (c), "m" (b) \ - : "$1", "$2", "$3", "$4", "$5", "$6", "$7" \ - ); -#endif /* Alpha */ - -#if defined(__mips__) && !defined(__mips64) - -#define MULADDC_INIT \ - asm( \ - "lw $10, %3 \n\t" \ - "lw $11, %4 \n\t" \ - "lw $12, %5 \n\t" \ - "lw $13, %6 \n\t" - -#define MULADDC_CORE \ - "lw $14, 0($10) \n\t" \ - "multu $13, $14 \n\t" \ - "addi $10, $10, 4 \n\t" \ - "mflo $14 \n\t" \ - "mfhi $9 \n\t" \ - "addu $14, $12, $14 \n\t" \ - "lw $15, 0($11) \n\t" \ - "sltu $12, $14, $12 \n\t" \ - "addu $15, $14, $15 \n\t" \ - "sltu $14, $15, $14 \n\t" \ - "addu $12, $12, $9 \n\t" \ - "sw $15, 0($11) \n\t" \ - "addu $12, $12, $14 \n\t" \ - "addi $11, $11, 4 \n\t" - -#define MULADDC_STOP \ - "sw $12, %0 \n\t" \ - "sw $11, %1 \n\t" \ - "sw $10, %2 \n\t" \ - : "=m" (c), "=m" (d), "=m" (s) \ - : "m" (s), "m" (d), "m" (c), "m" (b) \ - : "$9", "$10", "$11", "$12", "$13", "$14", "$15" \ - ); - -#endif /* MIPS */ -#endif /* GNUC */ - -#if (defined(_MSC_VER) && defined(_M_IX86)) || defined(__WATCOMC__) - -#define MULADDC_INIT \ - __asm mov esi, s \ - __asm mov edi, d \ - __asm mov ecx, c \ - __asm mov ebx, b - -#define MULADDC_CORE \ - __asm lodsd \ - __asm mul ebx \ - __asm add eax, ecx \ - __asm adc edx, 0 \ - __asm add eax, [edi] \ - __asm adc edx, 0 \ - __asm mov ecx, edx \ - __asm stosd - -#if defined(MBEDTLS_HAVE_SSE2) - -#define EMIT __asm _emit - -#define MULADDC_HUIT \ - EMIT 0x0F EMIT 0x6E EMIT 0xC9 \ - EMIT 0x0F EMIT 0x6E EMIT 0xC3 \ - EMIT 0x0F EMIT 0x6E EMIT 0x1F \ - EMIT 0x0F EMIT 0xD4 EMIT 0xCB \ - EMIT 0x0F EMIT 0x6E EMIT 0x16 \ - EMIT 0x0F EMIT 0xF4 EMIT 0xD0 \ - EMIT 0x0F EMIT 0x6E EMIT 0x66 EMIT 0x04 \ - EMIT 0x0F EMIT 0xF4 EMIT 0xE0 \ - EMIT 0x0F EMIT 0x6E EMIT 0x76 EMIT 0x08 \ - EMIT 0x0F EMIT 0xF4 EMIT 0xF0 \ - EMIT 0x0F EMIT 0x6E EMIT 0x7E EMIT 0x0C \ - EMIT 0x0F EMIT 0xF4 EMIT 0xF8 \ - EMIT 0x0F EMIT 0xD4 EMIT 0xCA \ - EMIT 0x0F EMIT 0x6E EMIT 0x5F EMIT 0x04 \ - EMIT 0x0F EMIT 0xD4 EMIT 0xDC \ - EMIT 0x0F EMIT 0x6E EMIT 0x6F EMIT 0x08 \ - EMIT 0x0F EMIT 0xD4 EMIT 0xEE \ - EMIT 0x0F EMIT 0x6E EMIT 0x67 EMIT 0x0C \ - EMIT 0x0F EMIT 0xD4 EMIT 0xFC \ - EMIT 0x0F EMIT 0x7E EMIT 0x0F \ - EMIT 0x0F EMIT 0x6E EMIT 0x56 EMIT 0x10 \ - EMIT 0x0F EMIT 0xF4 EMIT 0xD0 \ - EMIT 0x0F EMIT 0x73 EMIT 0xD1 EMIT 0x20 \ - EMIT 0x0F EMIT 0x6E EMIT 0x66 EMIT 0x14 \ - EMIT 0x0F EMIT 0xF4 EMIT 0xE0 \ - EMIT 0x0F EMIT 0xD4 EMIT 0xCB \ - EMIT 0x0F EMIT 0x6E EMIT 0x76 EMIT 0x18 \ - EMIT 0x0F EMIT 0xF4 EMIT 0xF0 \ - EMIT 0x0F EMIT 0x7E EMIT 0x4F EMIT 0x04 \ - EMIT 0x0F EMIT 0x73 EMIT 0xD1 EMIT 0x20 \ - EMIT 0x0F EMIT 0x6E EMIT 0x5E EMIT 0x1C \ - EMIT 0x0F EMIT 0xF4 EMIT 0xD8 \ - EMIT 0x0F EMIT 0xD4 EMIT 0xCD \ - EMIT 0x0F EMIT 0x6E EMIT 0x6F EMIT 0x10 \ - EMIT 0x0F EMIT 0xD4 EMIT 0xD5 \ - EMIT 0x0F EMIT 0x7E EMIT 0x4F EMIT 0x08 \ - EMIT 0x0F EMIT 0x73 EMIT 0xD1 EMIT 0x20 \ - EMIT 0x0F EMIT 0xD4 EMIT 0xCF \ - EMIT 0x0F EMIT 0x6E EMIT 0x6F EMIT 0x14 \ - EMIT 0x0F EMIT 0xD4 EMIT 0xE5 \ - EMIT 0x0F EMIT 0x7E EMIT 0x4F EMIT 0x0C \ - EMIT 0x0F EMIT 0x73 EMIT 0xD1 EMIT 0x20 \ - EMIT 0x0F EMIT 0xD4 EMIT 0xCA \ - EMIT 0x0F EMIT 0x6E EMIT 0x6F EMIT 0x18 \ - EMIT 0x0F EMIT 0xD4 EMIT 0xF5 \ - EMIT 0x0F EMIT 0x7E EMIT 0x4F EMIT 0x10 \ - EMIT 0x0F EMIT 0x73 EMIT 0xD1 EMIT 0x20 \ - EMIT 0x0F EMIT 0xD4 EMIT 0xCC \ - EMIT 0x0F EMIT 0x6E EMIT 0x6F EMIT 0x1C \ - EMIT 0x0F EMIT 0xD4 EMIT 0xDD \ - EMIT 0x0F EMIT 0x7E EMIT 0x4F EMIT 0x14 \ - EMIT 0x0F EMIT 0x73 EMIT 0xD1 EMIT 0x20 \ - EMIT 0x0F EMIT 0xD4 EMIT 0xCE \ - EMIT 0x0F EMIT 0x7E EMIT 0x4F EMIT 0x18 \ - EMIT 0x0F EMIT 0x73 EMIT 0xD1 EMIT 0x20 \ - EMIT 0x0F EMIT 0xD4 EMIT 0xCB \ - EMIT 0x0F EMIT 0x7E EMIT 0x4F EMIT 0x1C \ - EMIT 0x83 EMIT 0xC7 EMIT 0x20 \ - EMIT 0x83 EMIT 0xC6 EMIT 0x20 \ - EMIT 0x0F EMIT 0x73 EMIT 0xD1 EMIT 0x20 \ - EMIT 0x0F EMIT 0x7E EMIT 0xC9 - -#define MULADDC_STOP \ - EMIT 0x0F EMIT 0x77 \ - __asm mov c, ecx \ - __asm mov d, edi \ - __asm mov s, esi \ - -#else - -#define MULADDC_STOP \ - __asm mov c, ecx \ - __asm mov d, edi \ - __asm mov s, esi \ - -#endif /* SSE2 */ -#endif /* MSVC */ - -#endif /* MBEDTLS_HAVE_ASM */ - -#if !defined(MULADDC_CORE) -#if defined(MBEDTLS_HAVE_UDBL) - -#define MULADDC_INIT \ -{ \ - mbedtls_t_udbl r; \ - mbedtls_mpi_uint r0, r1; - -#define MULADDC_CORE \ - r = *(s++) * (mbedtls_t_udbl) b; \ - r0 = (mbedtls_mpi_uint) r; \ - r1 = (mbedtls_mpi_uint)( r >> biL ); \ - r0 += c; r1 += (r0 < c); \ - r0 += *d; r1 += (r0 < *d); \ - c = r1; *(d++) = r0; - -#define MULADDC_STOP \ -} - -#else -#define MULADDC_INIT \ -{ \ - mbedtls_mpi_uint s0, s1, b0, b1; \ - mbedtls_mpi_uint r0, r1, rx, ry; \ - b0 = ( b << biH ) >> biH; \ - b1 = ( b >> biH ); - -#define MULADDC_CORE \ - s0 = ( *s << biH ) >> biH; \ - s1 = ( *s >> biH ); s++; \ - rx = s0 * b1; r0 = s0 * b0; \ - ry = s1 * b0; r1 = s1 * b1; \ - r1 += ( rx >> biH ); \ - r1 += ( ry >> biH ); \ - rx <<= biH; ry <<= biH; \ - r0 += rx; r1 += (r0 < rx); \ - r0 += ry; r1 += (r0 < ry); \ - r0 += c; r1 += (r0 < c); \ - r0 += *d; r1 += (r0 < *d); \ - c = r1; *(d++) = r0; - -#define MULADDC_STOP \ -} - -#endif /* C (generic) */ -#endif /* C (longlong) */ - -#endif /* bn_mul.h */ diff --git a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/camellia.h b/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/camellia.h deleted file mode 100644 index 0424d623..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/camellia.h +++ /dev/null @@ -1,235 +0,0 @@ -/** - * \file camellia.h - * - * \brief Camellia block cipher - * - * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * This file is part of mbed TLS (https://tls.mbed.org) - */ -#ifndef MBEDTLS_CAMELLIA_H -#define MBEDTLS_CAMELLIA_H - -#if !defined(MBEDTLS_CONFIG_FILE) -#include "config.h" -#else -#include MBEDTLS_CONFIG_FILE -#endif - -#include -#include - -#define MBEDTLS_CAMELLIA_ENCRYPT 1 -#define MBEDTLS_CAMELLIA_DECRYPT 0 - -#define MBEDTLS_ERR_CAMELLIA_INVALID_KEY_LENGTH -0x0024 /**< Invalid key length. */ -#define MBEDTLS_ERR_CAMELLIA_INVALID_INPUT_LENGTH -0x0026 /**< Invalid data input length. */ - -#if !defined(MBEDTLS_CAMELLIA_ALT) -// Regular implementation -// - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * \brief CAMELLIA context structure - */ -typedef struct -{ - int nr; /*!< number of rounds */ - uint32_t rk[68]; /*!< CAMELLIA round keys */ -} -mbedtls_camellia_context; - -/** - * \brief Initialize CAMELLIA context - * - * \param ctx CAMELLIA context to be initialized - */ -void mbedtls_camellia_init( mbedtls_camellia_context *ctx ); - -/** - * \brief Clear CAMELLIA context - * - * \param ctx CAMELLIA context to be cleared - */ -void mbedtls_camellia_free( mbedtls_camellia_context *ctx ); - -/** - * \brief CAMELLIA key schedule (encryption) - * - * \param ctx CAMELLIA context to be initialized - * \param key encryption key - * \param keybits must be 128, 192 or 256 - * - * \return 0 if successful, or MBEDTLS_ERR_CAMELLIA_INVALID_KEY_LENGTH - */ -int mbedtls_camellia_setkey_enc( mbedtls_camellia_context *ctx, const unsigned char *key, - unsigned int keybits ); - -/** - * \brief CAMELLIA key schedule (decryption) - * - * \param ctx CAMELLIA context to be initialized - * \param key decryption key - * \param keybits must be 128, 192 or 256 - * - * \return 0 if successful, or MBEDTLS_ERR_CAMELLIA_INVALID_KEY_LENGTH - */ -int mbedtls_camellia_setkey_dec( mbedtls_camellia_context *ctx, const unsigned char *key, - unsigned int keybits ); - -/** - * \brief CAMELLIA-ECB block encryption/decryption - * - * \param ctx CAMELLIA context - * \param mode MBEDTLS_CAMELLIA_ENCRYPT or MBEDTLS_CAMELLIA_DECRYPT - * \param input 16-byte input block - * \param output 16-byte output block - * - * \return 0 if successful - */ -int mbedtls_camellia_crypt_ecb( mbedtls_camellia_context *ctx, - int mode, - const unsigned char input[16], - unsigned char output[16] ); - -#if defined(MBEDTLS_CIPHER_MODE_CBC) -/** - * \brief CAMELLIA-CBC buffer encryption/decryption - * Length should be a multiple of the block - * size (16 bytes) - * - * \note Upon exit, the content of the IV is updated so that you can - * call the function same function again on the following - * block(s) of data and get the same result as if it was - * encrypted in one call. This allows a "streaming" usage. - * If on the other hand you need to retain the contents of the - * IV, you should either save it manually or use the cipher - * module instead. - * - * \param ctx CAMELLIA context - * \param mode MBEDTLS_CAMELLIA_ENCRYPT or MBEDTLS_CAMELLIA_DECRYPT - * \param length length of the input data - * \param iv initialization vector (updated after use) - * \param input buffer holding the input data - * \param output buffer holding the output data - * - * \return 0 if successful, or - * MBEDTLS_ERR_CAMELLIA_INVALID_INPUT_LENGTH - */ -int mbedtls_camellia_crypt_cbc( mbedtls_camellia_context *ctx, - int mode, - size_t length, - unsigned char iv[16], - const unsigned char *input, - unsigned char *output ); -#endif /* MBEDTLS_CIPHER_MODE_CBC */ - -#if defined(MBEDTLS_CIPHER_MODE_CFB) -/** - * \brief CAMELLIA-CFB128 buffer encryption/decryption - * - * Note: Due to the nature of CFB you should use the same key schedule for - * both encryption and decryption. So a context initialized with - * mbedtls_camellia_setkey_enc() for both MBEDTLS_CAMELLIA_ENCRYPT and CAMELLIE_DECRYPT. - * - * \note Upon exit, the content of the IV is updated so that you can - * call the function same function again on the following - * block(s) of data and get the same result as if it was - * encrypted in one call. This allows a "streaming" usage. - * If on the other hand you need to retain the contents of the - * IV, you should either save it manually or use the cipher - * module instead. - * - * \param ctx CAMELLIA context - * \param mode MBEDTLS_CAMELLIA_ENCRYPT or MBEDTLS_CAMELLIA_DECRYPT - * \param length length of the input data - * \param iv_off offset in IV (updated after use) - * \param iv initialization vector (updated after use) - * \param input buffer holding the input data - * \param output buffer holding the output data - * - * \return 0 if successful, or - * MBEDTLS_ERR_CAMELLIA_INVALID_INPUT_LENGTH - */ -int mbedtls_camellia_crypt_cfb128( mbedtls_camellia_context *ctx, - int mode, - size_t length, - size_t *iv_off, - unsigned char iv[16], - const unsigned char *input, - unsigned char *output ); -#endif /* MBEDTLS_CIPHER_MODE_CFB */ - -#if defined(MBEDTLS_CIPHER_MODE_CTR) -/** - * \brief CAMELLIA-CTR buffer encryption/decryption - * - * Warning: You have to keep the maximum use of your counter in mind! - * - * Note: Due to the nature of CTR you should use the same key schedule for - * both encryption and decryption. So a context initialized with - * mbedtls_camellia_setkey_enc() for both MBEDTLS_CAMELLIA_ENCRYPT and MBEDTLS_CAMELLIA_DECRYPT. - * - * \param ctx CAMELLIA context - * \param length The length of the data - * \param nc_off The offset in the current stream_block (for resuming - * within current cipher stream). The offset pointer to - * should be 0 at the start of a stream. - * \param nonce_counter The 128-bit nonce and counter. - * \param stream_block The saved stream-block for resuming. Is overwritten - * by the function. - * \param input The input data stream - * \param output The output data stream - * - * \return 0 if successful - */ -int mbedtls_camellia_crypt_ctr( mbedtls_camellia_context *ctx, - size_t length, - size_t *nc_off, - unsigned char nonce_counter[16], - unsigned char stream_block[16], - const unsigned char *input, - unsigned char *output ); -#endif /* MBEDTLS_CIPHER_MODE_CTR */ - -#ifdef __cplusplus -} -#endif - -#else /* MBEDTLS_CAMELLIA_ALT */ -#include "camellia_alt.h" -#endif /* MBEDTLS_CAMELLIA_ALT */ - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * \brief Checkup routine - * - * \return 0 if successful, or 1 if the test failed - */ -int mbedtls_camellia_self_test( int verbose ); - -#ifdef __cplusplus -} -#endif - -#endif /* camellia.h */ diff --git a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/ccm.h b/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/ccm.h deleted file mode 100644 index ef75839b..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/ccm.h +++ /dev/null @@ -1,141 +0,0 @@ -/** - * \file ccm.h - * - * \brief Counter with CBC-MAC (CCM) for 128-bit block ciphers - * - * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * This file is part of mbed TLS (https://tls.mbed.org) - */ -#ifndef MBEDTLS_CCM_H -#define MBEDTLS_CCM_H - -#include "cipher.h" - -#define MBEDTLS_ERR_CCM_BAD_INPUT -0x000D /**< Bad input parameters to function. */ -#define MBEDTLS_ERR_CCM_AUTH_FAILED -0x000F /**< Authenticated decryption failed. */ - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * \brief CCM context structure - */ -typedef struct { - mbedtls_cipher_context_t cipher_ctx; /*!< cipher context used */ -} -mbedtls_ccm_context; - -/** - * \brief Initialize CCM context (just makes references valid) - * Makes the context ready for mbedtls_ccm_setkey() or - * mbedtls_ccm_free(). - * - * \param ctx CCM context to initialize - */ -void mbedtls_ccm_init( mbedtls_ccm_context *ctx ); - -/** - * \brief CCM initialization (encryption and decryption) - * - * \param ctx CCM context to be initialized - * \param cipher cipher to use (a 128-bit block cipher) - * \param key encryption key - * \param keybits key size in bits (must be acceptable by the cipher) - * - * \return 0 if successful, or a cipher specific error code - */ -int mbedtls_ccm_setkey( mbedtls_ccm_context *ctx, - mbedtls_cipher_id_t cipher, - const unsigned char *key, - unsigned int keybits ); - -/** - * \brief Free a CCM context and underlying cipher sub-context - * - * \param ctx CCM context to free - */ -void mbedtls_ccm_free( mbedtls_ccm_context *ctx ); - -/** - * \brief CCM buffer encryption - * - * \param ctx CCM context - * \param length length of the input data in bytes - * \param iv nonce (initialization vector) - * \param iv_len length of IV in bytes - * must be 2, 3, 4, 5, 6, 7 or 8 - * \param add additional data - * \param add_len length of additional data in bytes - * must be less than 2^16 - 2^8 - * \param input buffer holding the input data - * \param output buffer for holding the output data - * must be at least 'length' bytes wide - * \param tag buffer for holding the tag - * \param tag_len length of the tag to generate in bytes - * must be 4, 6, 8, 10, 14 or 16 - * - * \note The tag is written to a separate buffer. To get the tag - * concatenated with the output as in the CCM spec, use - * tag = output + length and make sure the output buffer is - * at least length + tag_len wide. - * - * \return 0 if successful - */ -int mbedtls_ccm_encrypt_and_tag( mbedtls_ccm_context *ctx, size_t length, - const unsigned char *iv, size_t iv_len, - const unsigned char *add, size_t add_len, - const unsigned char *input, unsigned char *output, - unsigned char *tag, size_t tag_len ); - -/** - * \brief CCM buffer authenticated decryption - * - * \param ctx CCM context - * \param length length of the input data - * \param iv initialization vector - * \param iv_len length of IV - * \param add additional data - * \param add_len length of additional data - * \param input buffer holding the input data - * \param output buffer for holding the output data - * \param tag buffer holding the tag - * \param tag_len length of the tag - * - * \return 0 if successful and authenticated, - * MBEDTLS_ERR_CCM_AUTH_FAILED if tag does not match - */ -int mbedtls_ccm_auth_decrypt( mbedtls_ccm_context *ctx, size_t length, - const unsigned char *iv, size_t iv_len, - const unsigned char *add, size_t add_len, - const unsigned char *input, unsigned char *output, - const unsigned char *tag, size_t tag_len ); - -#if defined(MBEDTLS_SELF_TEST) && defined(MBEDTLS_AES_C) -/** - * \brief Checkup routine - * - * \return 0 if successful, or 1 if the test failed - */ -int mbedtls_ccm_self_test( int verbose ); -#endif /* MBEDTLS_SELF_TEST && MBEDTLS_AES_C */ - -#ifdef __cplusplus -} -#endif - -#endif /* MBEDTLS_CCM_H */ diff --git a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/certs.h b/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/certs.h deleted file mode 100644 index ca49086e..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/certs.h +++ /dev/null @@ -1,99 +0,0 @@ -/** - * \file certs.h - * - * \brief Sample certificates and DHM parameters for testing - * - * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * This file is part of mbed TLS (https://tls.mbed.org) - */ -#ifndef MBEDTLS_CERTS_H -#define MBEDTLS_CERTS_H - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -#if defined(MBEDTLS_PEM_PARSE_C) -/* Concatenation of all CA certificates in PEM format if available */ -extern const char mbedtls_test_cas_pem[]; -extern const size_t mbedtls_test_cas_pem_len; -#endif - -/* List of all CA certificates, terminated by NULL */ -extern const char * mbedtls_test_cas[]; -extern const size_t mbedtls_test_cas_len[]; - -/* - * Convenience for users who just want a certificate: - * RSA by default, or ECDSA if RSA is not available - */ -extern const char * mbedtls_test_ca_crt; -extern const size_t mbedtls_test_ca_crt_len; -extern const char * mbedtls_test_ca_key; -extern const size_t mbedtls_test_ca_key_len; -extern const char * mbedtls_test_ca_pwd; -extern const size_t mbedtls_test_ca_pwd_len; -extern const char * mbedtls_test_srv_crt; -extern const size_t mbedtls_test_srv_crt_len; -extern const char * mbedtls_test_srv_key; -extern const size_t mbedtls_test_srv_key_len; -extern const char * mbedtls_test_cli_crt; -extern const size_t mbedtls_test_cli_crt_len; -extern const char * mbedtls_test_cli_key; -extern const size_t mbedtls_test_cli_key_len; - -#if defined(MBEDTLS_ECDSA_C) -extern const char mbedtls_test_ca_crt_ec[]; -extern const size_t mbedtls_test_ca_crt_ec_len; -extern const char mbedtls_test_ca_key_ec[]; -extern const size_t mbedtls_test_ca_key_ec_len; -extern const char mbedtls_test_ca_pwd_ec[]; -extern const size_t mbedtls_test_ca_pwd_ec_len; -extern const char mbedtls_test_srv_crt_ec[]; -extern const size_t mbedtls_test_srv_crt_ec_len; -extern const char mbedtls_test_srv_key_ec[]; -extern const size_t mbedtls_test_srv_key_ec_len; -extern const char mbedtls_test_cli_crt_ec[]; -extern const size_t mbedtls_test_cli_crt_ec_len; -extern const char mbedtls_test_cli_key_ec[]; -extern const size_t mbedtls_test_cli_key_ec_len; -#endif - -#if defined(MBEDTLS_RSA_C) -extern const char mbedtls_test_ca_crt_rsa[]; -extern const size_t mbedtls_test_ca_crt_rsa_len; -extern const char mbedtls_test_ca_key_rsa[]; -extern const size_t mbedtls_test_ca_key_rsa_len; -extern const char mbedtls_test_ca_pwd_rsa[]; -extern const size_t mbedtls_test_ca_pwd_rsa_len; -extern const char mbedtls_test_srv_crt_rsa[]; -extern const size_t mbedtls_test_srv_crt_rsa_len; -extern const char mbedtls_test_srv_key_rsa[]; -extern const size_t mbedtls_test_srv_key_rsa_len; -extern const char mbedtls_test_cli_crt_rsa[]; -extern const size_t mbedtls_test_cli_crt_rsa_len; -extern const char mbedtls_test_cli_key_rsa[]; -extern const size_t mbedtls_test_cli_key_rsa_len; -#endif - -#ifdef __cplusplus -} -#endif - -#endif /* certs.h */ diff --git a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/check_config.h b/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/check_config.h deleted file mode 100644 index 8dadbe1c..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/check_config.h +++ /dev/null @@ -1,529 +0,0 @@ -/** - * \file check_config.h - * - * \brief Consistency checks for configuration options - * - * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * This file is part of mbed TLS (https://tls.mbed.org) - */ - -/* - * It is recommended to include this file from your config.h - * in order to catch dependency issues early. - */ - -#ifndef MBEDTLS_CHECK_CONFIG_H -#define MBEDTLS_CHECK_CONFIG_H - -/* - * We assume CHAR_BIT is 8 in many places. In practice, this is true on our - * target platforms, so not an issue, but let's just be extra sure. - */ -#include -#if CHAR_BIT != 8 -#error "mbed TLS requires a platform with 8-bit chars" -#endif - -#if defined(_WIN32) -#if !defined(MBEDTLS_PLATFORM_C) -#error "MBEDTLS_PLATFORM_C is required on Windows" -#endif - -/* Fix the config here. Not convenient to put an #ifdef _WIN32 in config.h as - * it would confuse config.pl. */ -#if !defined(MBEDTLS_PLATFORM_SNPRINTF_ALT) && \ - !defined(MBEDTLS_PLATFORM_SNPRINTF_MACRO) -#define MBEDTLS_PLATFORM_SNPRINTF_ALT -#endif -#endif /* _WIN32 */ - -#if defined(TARGET_LIKE_MBED) && \ - ( defined(MBEDTLS_NET_C) || defined(MBEDTLS_TIMING_C) ) -#error "The NET and TIMING modules are not available for mbed OS - please use the network and timing functions provided by mbed OS" -#endif - -#if defined(MBEDTLS_DEPRECATED_WARNING) && \ - !defined(__GNUC__) && !defined(__clang__) -#error "MBEDTLS_DEPRECATED_WARNING only works with GCC and Clang" -#endif - -#if defined(MBEDTLS_HAVE_TIME_DATE) && !defined(MBEDTLS_HAVE_TIME) -#error "MBEDTLS_HAVE_TIME_DATE without MBEDTLS_HAVE_TIME does not make sense" -#endif - -#if defined(MBEDTLS_AESNI_C) && !defined(MBEDTLS_HAVE_ASM) -#error "MBEDTLS_AESNI_C defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_CTR_DRBG_C) && !defined(MBEDTLS_AES_C) -#error "MBEDTLS_CTR_DRBG_C defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_DHM_C) && !defined(MBEDTLS_BIGNUM_C) -#error "MBEDTLS_DHM_C defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_ECDH_C) && !defined(MBEDTLS_ECP_C) -#error "MBEDTLS_ECDH_C defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_ECDSA_C) && \ - ( !defined(MBEDTLS_ECP_C) || \ - !defined(MBEDTLS_ASN1_PARSE_C) || \ - !defined(MBEDTLS_ASN1_WRITE_C) ) -#error "MBEDTLS_ECDSA_C defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_ECDSA_DETERMINISTIC) && !defined(MBEDTLS_HMAC_DRBG_C) -#error "MBEDTLS_ECDSA_DETERMINISTIC defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_ECP_C) && ( !defined(MBEDTLS_BIGNUM_C) || ( \ - !defined(MBEDTLS_ECP_DP_SECP192R1_ENABLED) && \ - !defined(MBEDTLS_ECP_DP_SECP224R1_ENABLED) && \ - !defined(MBEDTLS_ECP_DP_SECP256R1_ENABLED) && \ - !defined(MBEDTLS_ECP_DP_SECP384R1_ENABLED) && \ - !defined(MBEDTLS_ECP_DP_SECP521R1_ENABLED) && \ - !defined(MBEDTLS_ECP_DP_BP256R1_ENABLED) && \ - !defined(MBEDTLS_ECP_DP_BP384R1_ENABLED) && \ - !defined(MBEDTLS_ECP_DP_BP512R1_ENABLED) && \ - !defined(MBEDTLS_ECP_DP_SECP192K1_ENABLED) && \ - !defined(MBEDTLS_ECP_DP_SECP224K1_ENABLED) && \ - !defined(MBEDTLS_ECP_DP_SECP256K1_ENABLED) ) ) -#error "MBEDTLS_ECP_C defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_ENTROPY_C) && (!defined(MBEDTLS_SHA512_C) && \ - !defined(MBEDTLS_SHA256_C)) -#error "MBEDTLS_ENTROPY_C defined, but not all prerequisites" -#endif -#if defined(MBEDTLS_ENTROPY_C) && defined(MBEDTLS_SHA512_C) && \ - defined(MBEDTLS_CTR_DRBG_ENTROPY_LEN) && (MBEDTLS_CTR_DRBG_ENTROPY_LEN > 64) -#error "MBEDTLS_CTR_DRBG_ENTROPY_LEN value too high" -#endif -#if defined(MBEDTLS_ENTROPY_C) && \ - ( !defined(MBEDTLS_SHA512_C) || defined(MBEDTLS_ENTROPY_FORCE_SHA256) ) \ - && defined(MBEDTLS_CTR_DRBG_ENTROPY_LEN) && (MBEDTLS_CTR_DRBG_ENTROPY_LEN > 32) -#error "MBEDTLS_CTR_DRBG_ENTROPY_LEN value too high" -#endif -#if defined(MBEDTLS_ENTROPY_C) && \ - defined(MBEDTLS_ENTROPY_FORCE_SHA256) && !defined(MBEDTLS_SHA256_C) -#error "MBEDTLS_ENTROPY_FORCE_SHA256 defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_GCM_C) && ( \ - !defined(MBEDTLS_AES_C) && !defined(MBEDTLS_CAMELLIA_C) ) -#error "MBEDTLS_GCM_C defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_HAVEGE_C) && !defined(MBEDTLS_TIMING_C) -#error "MBEDTLS_HAVEGE_C defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_HMAC_DRBG_C) && !defined(MBEDTLS_MD_C) -#error "MBEDTLS_HMAC_DRBG_C defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED) && \ - ( !defined(MBEDTLS_ECDH_C) || !defined(MBEDTLS_X509_CRT_PARSE_C) ) -#error "MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) && \ - ( !defined(MBEDTLS_ECDH_C) || !defined(MBEDTLS_X509_CRT_PARSE_C) ) -#error "MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED) && !defined(MBEDTLS_DHM_C) -#error "MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED) && \ - !defined(MBEDTLS_ECDH_C) -#error "MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED) && \ - ( !defined(MBEDTLS_DHM_C) || !defined(MBEDTLS_RSA_C) || \ - !defined(MBEDTLS_X509_CRT_PARSE_C) || !defined(MBEDTLS_PKCS1_V15) ) -#error "MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) && \ - ( !defined(MBEDTLS_ECDH_C) || !defined(MBEDTLS_RSA_C) || \ - !defined(MBEDTLS_X509_CRT_PARSE_C) || !defined(MBEDTLS_PKCS1_V15) ) -#error "MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED) && \ - ( !defined(MBEDTLS_ECDH_C) || !defined(MBEDTLS_ECDSA_C) || \ - !defined(MBEDTLS_X509_CRT_PARSE_C) ) -#error "MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED) && \ - ( !defined(MBEDTLS_RSA_C) || !defined(MBEDTLS_X509_CRT_PARSE_C) || \ - !defined(MBEDTLS_PKCS1_V15) ) -#error "MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED) && \ - ( !defined(MBEDTLS_RSA_C) || !defined(MBEDTLS_X509_CRT_PARSE_C) || \ - !defined(MBEDTLS_PKCS1_V15) ) -#error "MBEDTLS_KEY_EXCHANGE_RSA_ENABLED defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_MEMORY_BUFFER_ALLOC_C) && \ - ( !defined(MBEDTLS_PLATFORM_C) || !defined(MBEDTLS_PLATFORM_MEMORY) ) -#error "MBEDTLS_MEMORY_BUFFER_ALLOC_C defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_PADLOCK_C) && !defined(MBEDTLS_HAVE_ASM) -#error "MBEDTLS_PADLOCK_C defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_PEM_PARSE_C) && !defined(MBEDTLS_BASE64_C) -#error "MBEDTLS_PEM_PARSE_C defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_PEM_WRITE_C) && !defined(MBEDTLS_BASE64_C) -#error "MBEDTLS_PEM_WRITE_C defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_PK_C) && \ - ( !defined(MBEDTLS_RSA_C) && !defined(MBEDTLS_ECP_C) ) -#error "MBEDTLS_PK_C defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_PK_PARSE_C) && !defined(MBEDTLS_PK_C) -#error "MBEDTLS_PK_PARSE_C defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_PK_WRITE_C) && !defined(MBEDTLS_PK_C) -#error "MBEDTLS_PK_WRITE_C defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_PKCS11_C) && !defined(MBEDTLS_PK_C) -#error "MBEDTLS_PKCS11_C defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_PLATFORM_EXIT_ALT) && !defined(MBEDTLS_PLATFORM_C) -#error "MBEDTLS_PLATFORM_EXIT_ALT defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_PLATFORM_EXIT_MACRO) && !defined(MBEDTLS_PLATFORM_C) -#error "MBEDTLS_PLATFORM_EXIT_MACRO defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_PLATFORM_EXIT_MACRO) &&\ - ( defined(MBEDTLS_PLATFORM_STD_EXIT) ||\ - defined(MBEDTLS_PLATFORM_EXIT_ALT) ) -#error "MBEDTLS_PLATFORM_EXIT_MACRO and MBEDTLS_PLATFORM_STD_EXIT/MBEDTLS_PLATFORM_EXIT_ALT cannot be defined simultaneously" -#endif - -#if defined(MBEDTLS_PLATFORM_FPRINTF_ALT) && !defined(MBEDTLS_PLATFORM_C) -#error "MBEDTLS_PLATFORM_FPRINTF_ALT defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_PLATFORM_FPRINTF_MACRO) && !defined(MBEDTLS_PLATFORM_C) -#error "MBEDTLS_PLATFORM_FPRINTF_MACRO defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_PLATFORM_FPRINTF_MACRO) &&\ - ( defined(MBEDTLS_PLATFORM_STD_FPRINTF) ||\ - defined(MBEDTLS_PLATFORM_FPRINTF_ALT) ) -#error "MBEDTLS_PLATFORM_FPRINTF_MACRO and MBEDTLS_PLATFORM_STD_FPRINTF/MBEDTLS_PLATFORM_FPRINTF_ALT cannot be defined simultaneously" -#endif - -#if defined(MBEDTLS_PLATFORM_FREE_MACRO) &&\ - ( !defined(MBEDTLS_PLATFORM_C) || !defined(MBEDTLS_PLATFORM_MEMORY) ) -#error "MBEDTLS_PLATFORM_FREE_MACRO defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_PLATFORM_FREE_MACRO) &&\ - defined(MBEDTLS_PLATFORM_STD_FREE) -#error "MBEDTLS_PLATFORM_FREE_MACRO and MBEDTLS_PLATFORM_STD_FREE cannot be defined simultaneously" -#endif - -#if defined(MBEDTLS_PLATFORM_FREE_MACRO) && !defined(MBEDTLS_PLATFORM_CALLOC_MACRO) -#error "MBEDTLS_PLATFORM_CALLOC_MACRO must be defined if MBEDTLS_PLATFORM_FREE_MACRO is" -#endif - -#if defined(MBEDTLS_PLATFORM_CALLOC_MACRO) &&\ - ( !defined(MBEDTLS_PLATFORM_C) || !defined(MBEDTLS_PLATFORM_MEMORY) ) -#error "MBEDTLS_PLATFORM_CALLOC_MACRO defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_PLATFORM_CALLOC_MACRO) &&\ - defined(MBEDTLS_PLATFORM_STD_CALLOC) -#error "MBEDTLS_PLATFORM_CALLOC_MACRO and MBEDTLS_PLATFORM_STD_CALLOC cannot be defined simultaneously" -#endif - -#if defined(MBEDTLS_PLATFORM_CALLOC_MACRO) && !defined(MBEDTLS_PLATFORM_FREE_MACRO) -#error "MBEDTLS_PLATFORM_FREE_MACRO must be defined if MBEDTLS_PLATFORM_CALLOC_MACRO is" -#endif - -#if defined(MBEDTLS_PLATFORM_MEMORY) && !defined(MBEDTLS_PLATFORM_C) -#error "MBEDTLS_PLATFORM_MEMORY defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_PLATFORM_PRINTF_ALT) && !defined(MBEDTLS_PLATFORM_C) -#error "MBEDTLS_PLATFORM_PRINTF_ALT defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_PLATFORM_PRINTF_MACRO) && !defined(MBEDTLS_PLATFORM_C) -#error "MBEDTLS_PLATFORM_PRINTF_MACRO defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_PLATFORM_PRINTF_MACRO) &&\ - ( defined(MBEDTLS_PLATFORM_STD_PRINTF) ||\ - defined(MBEDTLS_PLATFORM_PRINTF_ALT) ) -#error "MBEDTLS_PLATFORM_PRINTF_MACRO and MBEDTLS_PLATFORM_STD_PRINTF/MBEDTLS_PLATFORM_PRINTF_ALT cannot be defined simultaneously" -#endif - -#if defined(MBEDTLS_PLATFORM_SNPRINTF_ALT) && !defined(MBEDTLS_PLATFORM_C) -#error "MBEDTLS_PLATFORM_SNPRINTF_ALT defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_PLATFORM_SNPRINTF_MACRO) && !defined(MBEDTLS_PLATFORM_C) -#error "MBEDTLS_PLATFORM_SNPRINTF_MACRO defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_PLATFORM_SNPRINTF_MACRO) &&\ - ( defined(MBEDTLS_PLATFORM_STD_SNPRINTF) ||\ - defined(MBEDTLS_PLATFORM_SNPRINTF_ALT) ) -#error "MBEDTLS_PLATFORM_SNPRINTF_MACRO and MBEDTLS_PLATFORM_STD_SNPRINTF/MBEDTLS_PLATFORM_SNPRINTF_ALT cannot be defined simultaneously" -#endif - -#if defined(MBEDTLS_PLATFORM_STD_MEM_HDR) &&\ - !defined(MBEDTLS_PLATFORM_NO_STD_FUNCTIONS) -#error "MBEDTLS_PLATFORM_STD_MEM_HDR defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_PLATFORM_STD_CALLOC) && !defined(MBEDTLS_PLATFORM_MEMORY) -#error "MBEDTLS_PLATFORM_STD_CALLOC defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_PLATFORM_STD_CALLOC) && !defined(MBEDTLS_PLATFORM_MEMORY) -#error "MBEDTLS_PLATFORM_STD_CALLOC defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_PLATFORM_STD_FREE) && !defined(MBEDTLS_PLATFORM_MEMORY) -#error "MBEDTLS_PLATFORM_STD_FREE defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_PLATFORM_STD_EXIT) &&\ - !defined(MBEDTLS_PLATFORM_EXIT_ALT) -#error "MBEDTLS_PLATFORM_STD_EXIT defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_PLATFORM_STD_FPRINTF) &&\ - !defined(MBEDTLS_PLATFORM_FPRINTF_ALT) -#error "MBEDTLS_PLATFORM_STD_FPRINTF defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_PLATFORM_STD_PRINTF) &&\ - !defined(MBEDTLS_PLATFORM_PRINTF_ALT) -#error "MBEDTLS_PLATFORM_STD_PRINTF defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_PLATFORM_STD_SNPRINTF) &&\ - !defined(MBEDTLS_PLATFORM_SNPRINTF_ALT) -#error "MBEDTLS_PLATFORM_STD_SNPRINTF defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_RSA_C) && ( !defined(MBEDTLS_BIGNUM_C) || \ - !defined(MBEDTLS_OID_C) ) -#error "MBEDTLS_RSA_C defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_X509_RSASSA_PSS_SUPPORT) && \ - ( !defined(MBEDTLS_RSA_C) || !defined(MBEDTLS_PKCS1_V21) ) -#error "MBEDTLS_X509_RSASSA_PSS_SUPPORT defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_SSL_PROTO_SSL3) && ( !defined(MBEDTLS_MD5_C) || \ - !defined(MBEDTLS_SHA1_C) ) -#error "MBEDTLS_SSL_PROTO_SSL3 defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_SSL_PROTO_TLS1) && ( !defined(MBEDTLS_MD5_C) || \ - !defined(MBEDTLS_SHA1_C) ) -#error "MBEDTLS_SSL_PROTO_TLS1 defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_SSL_PROTO_TLS1_1) && ( !defined(MBEDTLS_MD5_C) || \ - !defined(MBEDTLS_SHA1_C) ) -#error "MBEDTLS_SSL_PROTO_TLS1_1 defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_SSL_PROTO_TLS1_2) && ( !defined(MBEDTLS_SHA1_C) && \ - !defined(MBEDTLS_SHA256_C) && !defined(MBEDTLS_SHA512_C) ) -#error "MBEDTLS_SSL_PROTO_TLS1_2 defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_SSL_PROTO_DTLS) && \ - !defined(MBEDTLS_SSL_PROTO_TLS1_1) && \ - !defined(MBEDTLS_SSL_PROTO_TLS1_2) -#error "MBEDTLS_SSL_PROTO_DTLS defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_SSL_CLI_C) && !defined(MBEDTLS_SSL_TLS_C) -#error "MBEDTLS_SSL_CLI_C defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_SSL_TLS_C) && ( !defined(MBEDTLS_CIPHER_C) || \ - !defined(MBEDTLS_MD_C) ) -#error "MBEDTLS_SSL_TLS_C defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_SSL_SRV_C) && !defined(MBEDTLS_SSL_TLS_C) -#error "MBEDTLS_SSL_SRV_C defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_SSL_TLS_C) && (!defined(MBEDTLS_SSL_PROTO_SSL3) && \ - !defined(MBEDTLS_SSL_PROTO_TLS1) && !defined(MBEDTLS_SSL_PROTO_TLS1_1) && \ - !defined(MBEDTLS_SSL_PROTO_TLS1_2)) -#error "MBEDTLS_SSL_TLS_C defined, but no protocols are active" -#endif - -#if defined(MBEDTLS_SSL_TLS_C) && (defined(MBEDTLS_SSL_PROTO_SSL3) && \ - defined(MBEDTLS_SSL_PROTO_TLS1_1) && !defined(MBEDTLS_SSL_PROTO_TLS1)) -#error "Illegal protocol selection" -#endif - -#if defined(MBEDTLS_SSL_TLS_C) && (defined(MBEDTLS_SSL_PROTO_TLS1) && \ - defined(MBEDTLS_SSL_PROTO_TLS1_2) && !defined(MBEDTLS_SSL_PROTO_TLS1_1)) -#error "Illegal protocol selection" -#endif - -#if defined(MBEDTLS_SSL_TLS_C) && (defined(MBEDTLS_SSL_PROTO_SSL3) && \ - defined(MBEDTLS_SSL_PROTO_TLS1_2) && (!defined(MBEDTLS_SSL_PROTO_TLS1) || \ - !defined(MBEDTLS_SSL_PROTO_TLS1_1))) -#error "Illegal protocol selection" -#endif - -#if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY) && !defined(MBEDTLS_SSL_PROTO_DTLS) -#error "MBEDTLS_SSL_DTLS_HELLO_VERIFY defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_SSL_DTLS_CLIENT_PORT_REUSE) && \ - !defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY) -#error "MBEDTLS_SSL_DTLS_CLIENT_PORT_REUSE defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY) && \ - ( !defined(MBEDTLS_SSL_TLS_C) || !defined(MBEDTLS_SSL_PROTO_DTLS) ) -#error "MBEDTLS_SSL_DTLS_ANTI_REPLAY defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_SSL_DTLS_BADMAC_LIMIT) && \ - ( !defined(MBEDTLS_SSL_TLS_C) || !defined(MBEDTLS_SSL_PROTO_DTLS) ) -#error "MBEDTLS_SSL_DTLS_BADMAC_LIMIT defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC) && \ - !defined(MBEDTLS_SSL_PROTO_TLS1) && \ - !defined(MBEDTLS_SSL_PROTO_TLS1_1) && \ - !defined(MBEDTLS_SSL_PROTO_TLS1_2) -#error "MBEDTLS_SSL_ENCRYPT_THEN_MAC defined, but not all prerequsites" -#endif - -#if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET) && \ - !defined(MBEDTLS_SSL_PROTO_TLS1) && \ - !defined(MBEDTLS_SSL_PROTO_TLS1_1) && \ - !defined(MBEDTLS_SSL_PROTO_TLS1_2) -#error "MBEDTLS_SSL_EXTENDED_MASTER_SECRET defined, but not all prerequsites" -#endif - -#if defined(MBEDTLS_SSL_TICKET_C) && !defined(MBEDTLS_CIPHER_C) -#error "MBEDTLS_SSL_TICKET_C defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_SSL_CBC_RECORD_SPLITTING) && \ - !defined(MBEDTLS_SSL_PROTO_SSL3) && !defined(MBEDTLS_SSL_PROTO_TLS1) -#error "MBEDTLS_SSL_CBC_RECORD_SPLITTING defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION) && \ - !defined(MBEDTLS_X509_CRT_PARSE_C) -#error "MBEDTLS_SSL_SERVER_NAME_INDICATION defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_THREADING_PTHREAD) -#if !defined(MBEDTLS_THREADING_C) || defined(MBEDTLS_THREADING_IMPL) -#error "MBEDTLS_THREADING_PTHREAD defined, but not all prerequisites" -#endif -#define MBEDTLS_THREADING_IMPL -#endif - -#if defined(MBEDTLS_THREADING_ALT) -#if !defined(MBEDTLS_THREADING_C) || defined(MBEDTLS_THREADING_IMPL) -#error "MBEDTLS_THREADING_ALT defined, but not all prerequisites" -#endif -#define MBEDTLS_THREADING_IMPL -#endif - -#if defined(MBEDTLS_THREADING_C) && !defined(MBEDTLS_THREADING_IMPL) -#error "MBEDTLS_THREADING_C defined, single threading implementation required" -#endif -#undef MBEDTLS_THREADING_IMPL - -#if defined(MBEDTLS_VERSION_FEATURES) && !defined(MBEDTLS_VERSION_C) -#error "MBEDTLS_VERSION_FEATURES defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_X509_USE_C) && ( !defined(MBEDTLS_BIGNUM_C) || \ - !defined(MBEDTLS_OID_C) || !defined(MBEDTLS_ASN1_PARSE_C) || \ - !defined(MBEDTLS_PK_PARSE_C) ) -#error "MBEDTLS_X509_USE_C defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_X509_CREATE_C) && ( !defined(MBEDTLS_BIGNUM_C) || \ - !defined(MBEDTLS_OID_C) || !defined(MBEDTLS_ASN1_WRITE_C) || \ - !defined(MBEDTLS_PK_WRITE_C) ) -#error "MBEDTLS_X509_CREATE_C defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_X509_CRT_PARSE_C) && ( !defined(MBEDTLS_X509_USE_C) ) -#error "MBEDTLS_X509_CRT_PARSE_C defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_X509_CRL_PARSE_C) && ( !defined(MBEDTLS_X509_USE_C) ) -#error "MBEDTLS_X509_CRL_PARSE_C defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_X509_CSR_PARSE_C) && ( !defined(MBEDTLS_X509_USE_C) ) -#error "MBEDTLS_X509_CSR_PARSE_C defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_X509_CRT_WRITE_C) && ( !defined(MBEDTLS_X509_CREATE_C) ) -#error "MBEDTLS_X509_CRT_WRITE_C defined, but not all prerequisites" -#endif - -#if defined(MBEDTLS_X509_CSR_WRITE_C) && ( !defined(MBEDTLS_X509_CREATE_C) ) -#error "MBEDTLS_X509_CSR_WRITE_C defined, but not all prerequisites" -#endif - -/* - * Avoid warning from -pedantic. This is a convenient place for this - * workaround since this is included by every single file before the - * #if defined(MBEDTLS_xxx_C) that results in emtpy translation units. - */ -typedef int mbedtls_iso_c_forbids_empty_translation_units; - -#endif /* MBEDTLS_CHECK_CONFIG_H */ diff --git a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/cipher.h b/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/cipher.h deleted file mode 100644 index 70000f5e..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/cipher.h +++ /dev/null @@ -1,698 +0,0 @@ -/** - * \file cipher.h - * - * \brief Generic cipher wrapper. - * - * \author Adriaan de Jong - * - * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * This file is part of mbed TLS (https://tls.mbed.org) - */ - -#ifndef MBEDTLS_CIPHER_H -#define MBEDTLS_CIPHER_H - -#if !defined(MBEDTLS_CONFIG_FILE) -#include "config.h" -#else -#include MBEDTLS_CONFIG_FILE -#endif - -#include - -#if defined(MBEDTLS_GCM_C) || defined(MBEDTLS_CCM_C) -#define MBEDTLS_CIPHER_MODE_AEAD -#endif - -#if defined(MBEDTLS_CIPHER_MODE_CBC) -#define MBEDTLS_CIPHER_MODE_WITH_PADDING -#endif - -#if defined(MBEDTLS_ARC4_C) -#define MBEDTLS_CIPHER_MODE_STREAM -#endif - -#if ( defined(__ARMCC_VERSION) || defined(_MSC_VER) ) && \ - !defined(inline) && !defined(__cplusplus) -#define inline __inline -#endif - -#define MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE -0x6080 /**< The selected feature is not available. */ -#define MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA -0x6100 /**< Bad input parameters to function. */ -#define MBEDTLS_ERR_CIPHER_ALLOC_FAILED -0x6180 /**< Failed to allocate memory. */ -#define MBEDTLS_ERR_CIPHER_INVALID_PADDING -0x6200 /**< Input data contains invalid padding and is rejected. */ -#define MBEDTLS_ERR_CIPHER_FULL_BLOCK_EXPECTED -0x6280 /**< Decryption of block requires a full block. */ -#define MBEDTLS_ERR_CIPHER_AUTH_FAILED -0x6300 /**< Authentication failed (for AEAD modes). */ - -#define MBEDTLS_CIPHER_VARIABLE_IV_LEN 0x01 /**< Cipher accepts IVs of variable length */ -#define MBEDTLS_CIPHER_VARIABLE_KEY_LEN 0x02 /**< Cipher accepts keys of variable length */ - -#ifdef __cplusplus -extern "C" { -#endif - -typedef enum { - MBEDTLS_CIPHER_ID_NONE = 0, - MBEDTLS_CIPHER_ID_NULL, - MBEDTLS_CIPHER_ID_AES, - MBEDTLS_CIPHER_ID_DES, - MBEDTLS_CIPHER_ID_3DES, - MBEDTLS_CIPHER_ID_CAMELLIA, - MBEDTLS_CIPHER_ID_BLOWFISH, - MBEDTLS_CIPHER_ID_ARC4, -} mbedtls_cipher_id_t; - -typedef enum { - MBEDTLS_CIPHER_NONE = 0, - MBEDTLS_CIPHER_NULL, - MBEDTLS_CIPHER_AES_128_ECB, - MBEDTLS_CIPHER_AES_192_ECB, - MBEDTLS_CIPHER_AES_256_ECB, - MBEDTLS_CIPHER_AES_128_CBC, - MBEDTLS_CIPHER_AES_192_CBC, - MBEDTLS_CIPHER_AES_256_CBC, - MBEDTLS_CIPHER_AES_128_CFB128, - MBEDTLS_CIPHER_AES_192_CFB128, - MBEDTLS_CIPHER_AES_256_CFB128, - MBEDTLS_CIPHER_AES_128_CTR, - MBEDTLS_CIPHER_AES_192_CTR, - MBEDTLS_CIPHER_AES_256_CTR, - MBEDTLS_CIPHER_AES_128_GCM, - MBEDTLS_CIPHER_AES_192_GCM, - MBEDTLS_CIPHER_AES_256_GCM, - MBEDTLS_CIPHER_CAMELLIA_128_ECB, - MBEDTLS_CIPHER_CAMELLIA_192_ECB, - MBEDTLS_CIPHER_CAMELLIA_256_ECB, - MBEDTLS_CIPHER_CAMELLIA_128_CBC, - MBEDTLS_CIPHER_CAMELLIA_192_CBC, - MBEDTLS_CIPHER_CAMELLIA_256_CBC, - MBEDTLS_CIPHER_CAMELLIA_128_CFB128, - MBEDTLS_CIPHER_CAMELLIA_192_CFB128, - MBEDTLS_CIPHER_CAMELLIA_256_CFB128, - MBEDTLS_CIPHER_CAMELLIA_128_CTR, - MBEDTLS_CIPHER_CAMELLIA_192_CTR, - MBEDTLS_CIPHER_CAMELLIA_256_CTR, - MBEDTLS_CIPHER_CAMELLIA_128_GCM, - MBEDTLS_CIPHER_CAMELLIA_192_GCM, - MBEDTLS_CIPHER_CAMELLIA_256_GCM, - MBEDTLS_CIPHER_DES_ECB, - MBEDTLS_CIPHER_DES_CBC, - MBEDTLS_CIPHER_DES_EDE_ECB, - MBEDTLS_CIPHER_DES_EDE_CBC, - MBEDTLS_CIPHER_DES_EDE3_ECB, - MBEDTLS_CIPHER_DES_EDE3_CBC, - MBEDTLS_CIPHER_BLOWFISH_ECB, - MBEDTLS_CIPHER_BLOWFISH_CBC, - MBEDTLS_CIPHER_BLOWFISH_CFB64, - MBEDTLS_CIPHER_BLOWFISH_CTR, - MBEDTLS_CIPHER_ARC4_128, - MBEDTLS_CIPHER_AES_128_CCM, - MBEDTLS_CIPHER_AES_192_CCM, - MBEDTLS_CIPHER_AES_256_CCM, - MBEDTLS_CIPHER_CAMELLIA_128_CCM, - MBEDTLS_CIPHER_CAMELLIA_192_CCM, - MBEDTLS_CIPHER_CAMELLIA_256_CCM, -} mbedtls_cipher_type_t; - -typedef enum { - MBEDTLS_MODE_NONE = 0, - MBEDTLS_MODE_ECB, - MBEDTLS_MODE_CBC, - MBEDTLS_MODE_CFB, - MBEDTLS_MODE_OFB, /* Unused! */ - MBEDTLS_MODE_CTR, - MBEDTLS_MODE_GCM, - MBEDTLS_MODE_STREAM, - MBEDTLS_MODE_CCM, -} mbedtls_cipher_mode_t; - -typedef enum { - MBEDTLS_PADDING_PKCS7 = 0, /**< PKCS7 padding (default) */ - MBEDTLS_PADDING_ONE_AND_ZEROS, /**< ISO/IEC 7816-4 padding */ - MBEDTLS_PADDING_ZEROS_AND_LEN, /**< ANSI X.923 padding */ - MBEDTLS_PADDING_ZEROS, /**< zero padding (not reversible!) */ - MBEDTLS_PADDING_NONE, /**< never pad (full blocks only) */ -} mbedtls_cipher_padding_t; - -typedef enum { - MBEDTLS_OPERATION_NONE = -1, - MBEDTLS_DECRYPT = 0, - MBEDTLS_ENCRYPT, -} mbedtls_operation_t; - -enum { - /** Undefined key length */ - MBEDTLS_KEY_LENGTH_NONE = 0, - /** Key length, in bits (including parity), for DES keys */ - MBEDTLS_KEY_LENGTH_DES = 64, - /** Key length, in bits (including parity), for DES in two key EDE */ - MBEDTLS_KEY_LENGTH_DES_EDE = 128, - /** Key length, in bits (including parity), for DES in three-key EDE */ - MBEDTLS_KEY_LENGTH_DES_EDE3 = 192, -}; - -/** Maximum length of any IV, in bytes */ -#define MBEDTLS_MAX_IV_LENGTH 16 -/** Maximum block size of any cipher, in bytes */ -#define MBEDTLS_MAX_BLOCK_LENGTH 16 - -/** - * Base cipher information (opaque struct). - */ -typedef struct mbedtls_cipher_base_t mbedtls_cipher_base_t; - -/** - * Cipher information. Allows cipher functions to be called in a generic way. - */ -typedef struct { - /** Full cipher identifier (e.g. MBEDTLS_CIPHER_AES_256_CBC) */ - mbedtls_cipher_type_t type; - - /** Cipher mode (e.g. MBEDTLS_MODE_CBC) */ - mbedtls_cipher_mode_t mode; - - /** Cipher key length, in bits (default length for variable sized ciphers) - * (Includes parity bits for ciphers like DES) */ - unsigned int key_bitlen; - - /** Name of the cipher */ - const char * name; - - /** IV/NONCE size, in bytes. - * For cipher that accept many sizes: recommended size */ - unsigned int iv_size; - - /** Flags for variable IV size, variable key size, etc. */ - int flags; - - /** block size, in bytes */ - unsigned int block_size; - - /** Base cipher information and functions */ - const mbedtls_cipher_base_t *base; - -} mbedtls_cipher_info_t; - -/** - * Generic cipher context. - */ -typedef struct { - /** Information about the associated cipher */ - const mbedtls_cipher_info_t *cipher_info; - - /** Key length to use */ - int key_bitlen; - - /** Operation that the context's key has been initialised for */ - mbedtls_operation_t operation; - -#if defined(MBEDTLS_CIPHER_MODE_WITH_PADDING) - /** Padding functions to use, if relevant for cipher mode */ - void (*add_padding)( unsigned char *output, size_t olen, size_t data_len ); - int (*get_padding)( unsigned char *input, size_t ilen, size_t *data_len ); -#endif - - /** Buffer for data that hasn't been encrypted yet */ - unsigned char unprocessed_data[MBEDTLS_MAX_BLOCK_LENGTH]; - - /** Number of bytes that still need processing */ - size_t unprocessed_len; - - /** Current IV or NONCE_COUNTER for CTR-mode */ - unsigned char iv[MBEDTLS_MAX_IV_LENGTH]; - - /** IV size in bytes (for ciphers with variable-length IVs) */ - size_t iv_size; - - /** Cipher-specific context */ - void *cipher_ctx; -} mbedtls_cipher_context_t; - -/** - * \brief Returns the list of ciphers supported by the generic cipher module. - * - * \return a statically allocated array of ciphers, the last entry - * is 0. - */ -const int *mbedtls_cipher_list( void ); - -/** - * \brief Returns the cipher information structure associated - * with the given cipher name. - * - * \param cipher_name Name of the cipher to search for. - * - * \return the cipher information structure associated with the - * given cipher_name, or NULL if not found. - */ -const mbedtls_cipher_info_t *mbedtls_cipher_info_from_string( const char *cipher_name ); - -/** - * \brief Returns the cipher information structure associated - * with the given cipher type. - * - * \param cipher_type Type of the cipher to search for. - * - * \return the cipher information structure associated with the - * given cipher_type, or NULL if not found. - */ -const mbedtls_cipher_info_t *mbedtls_cipher_info_from_type( const mbedtls_cipher_type_t cipher_type ); - -/** - * \brief Returns the cipher information structure associated - * with the given cipher id, key size and mode. - * - * \param cipher_id Id of the cipher to search for - * (e.g. MBEDTLS_CIPHER_ID_AES) - * \param key_bitlen Length of the key in bits - * \param mode Cipher mode (e.g. MBEDTLS_MODE_CBC) - * - * \return the cipher information structure associated with the - * given cipher_type, or NULL if not found. - */ -const mbedtls_cipher_info_t *mbedtls_cipher_info_from_values( const mbedtls_cipher_id_t cipher_id, - int key_bitlen, - const mbedtls_cipher_mode_t mode ); - -/** - * \brief Initialize a cipher_context (as NONE) - */ -void mbedtls_cipher_init( mbedtls_cipher_context_t *ctx ); - -/** - * \brief Free and clear the cipher-specific context of ctx. - * Freeing ctx itself remains the responsibility of the - * caller. - */ -void mbedtls_cipher_free( mbedtls_cipher_context_t *ctx ); - -/** - * \brief Initialises and fills the cipher context structure with - * the appropriate values. - * - * \note Currently also clears structure. In future versions you - * will be required to call mbedtls_cipher_init() on the structure - * first. - * - * \param ctx context to initialise. May not be NULL. - * \param cipher_info cipher to use. - * - * \return 0 on success, - * MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA on parameter failure, - * MBEDTLS_ERR_CIPHER_ALLOC_FAILED if allocation of the - * cipher-specific context failed. - */ -int mbedtls_cipher_setup( mbedtls_cipher_context_t *ctx, const mbedtls_cipher_info_t *cipher_info ); - -/** - * \brief Returns the block size of the given cipher. - * - * \param ctx cipher's context. Must have been initialised. - * - * \return size of the cipher's blocks, or 0 if ctx has not been - * initialised. - */ -static inline unsigned int mbedtls_cipher_get_block_size( const mbedtls_cipher_context_t *ctx ) -{ - if( NULL == ctx || NULL == ctx->cipher_info ) - return 0; - - return ctx->cipher_info->block_size; -} - -/** - * \brief Returns the mode of operation for the cipher. - * (e.g. MBEDTLS_MODE_CBC) - * - * \param ctx cipher's context. Must have been initialised. - * - * \return mode of operation, or MBEDTLS_MODE_NONE if ctx - * has not been initialised. - */ -static inline mbedtls_cipher_mode_t mbedtls_cipher_get_cipher_mode( const mbedtls_cipher_context_t *ctx ) -{ - if( NULL == ctx || NULL == ctx->cipher_info ) - return MBEDTLS_MODE_NONE; - - return ctx->cipher_info->mode; -} - -/** - * \brief Returns the size of the cipher's IV/NONCE in bytes. - * - * \param ctx cipher's context. Must have been initialised. - * - * \return If IV has not been set yet: (recommended) IV size - * (0 for ciphers not using IV/NONCE). - * If IV has already been set: actual size. - */ -static inline int mbedtls_cipher_get_iv_size( const mbedtls_cipher_context_t *ctx ) -{ - if( NULL == ctx || NULL == ctx->cipher_info ) - return 0; - - if( ctx->iv_size != 0 ) - return (int) ctx->iv_size; - - return (int) ctx->cipher_info->iv_size; -} - -/** - * \brief Returns the type of the given cipher. - * - * \param ctx cipher's context. Must have been initialised. - * - * \return type of the cipher, or MBEDTLS_CIPHER_NONE if ctx has - * not been initialised. - */ -static inline mbedtls_cipher_type_t mbedtls_cipher_get_type( const mbedtls_cipher_context_t *ctx ) -{ - if( NULL == ctx || NULL == ctx->cipher_info ) - return MBEDTLS_CIPHER_NONE; - - return ctx->cipher_info->type; -} - -/** - * \brief Returns the name of the given cipher, as a string. - * - * \param ctx cipher's context. Must have been initialised. - * - * \return name of the cipher, or NULL if ctx was not initialised. - */ -static inline const char *mbedtls_cipher_get_name( const mbedtls_cipher_context_t *ctx ) -{ - if( NULL == ctx || NULL == ctx->cipher_info ) - return 0; - - return ctx->cipher_info->name; -} - -/** - * \brief Returns the key length of the cipher. - * - * \param ctx cipher's context. Must have been initialised. - * - * \return cipher's key length, in bits, or - * MBEDTLS_KEY_LENGTH_NONE if ctx has not been - * initialised. - */ -static inline int mbedtls_cipher_get_key_bitlen( const mbedtls_cipher_context_t *ctx ) -{ - if( NULL == ctx || NULL == ctx->cipher_info ) - return MBEDTLS_KEY_LENGTH_NONE; - - return (int) ctx->cipher_info->key_bitlen; -} - -/** - * \brief Returns the operation of the given cipher. - * - * \param ctx cipher's context. Must have been initialised. - * - * \return operation (MBEDTLS_ENCRYPT or MBEDTLS_DECRYPT), - * or MBEDTLS_OPERATION_NONE if ctx has not been - * initialised. - */ -static inline mbedtls_operation_t mbedtls_cipher_get_operation( const mbedtls_cipher_context_t *ctx ) -{ - if( NULL == ctx || NULL == ctx->cipher_info ) - return MBEDTLS_OPERATION_NONE; - - return ctx->operation; -} - -/** - * \brief Set the key to use with the given context. - * - * \param ctx generic cipher context. May not be NULL. Must have been - * initialised using cipher_context_from_type or - * cipher_context_from_string. - * \param key The key to use. - * \param key_bitlen key length to use, in bits. - * \param operation Operation that the key will be used for, either - * MBEDTLS_ENCRYPT or MBEDTLS_DECRYPT. - * - * \returns 0 on success, MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA if - * parameter verification fails or a cipher specific - * error code. - */ -int mbedtls_cipher_setkey( mbedtls_cipher_context_t *ctx, const unsigned char *key, - int key_bitlen, const mbedtls_operation_t operation ); - -#if defined(MBEDTLS_CIPHER_MODE_WITH_PADDING) -/** - * \brief Set padding mode, for cipher modes that use padding. - * (Default: PKCS7 padding.) - * - * \param ctx generic cipher context - * \param mode padding mode - * - * \returns 0 on success, MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE - * if selected padding mode is not supported, or - * MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA if the cipher mode - * does not support padding. - */ -int mbedtls_cipher_set_padding_mode( mbedtls_cipher_context_t *ctx, mbedtls_cipher_padding_t mode ); -#endif /* MBEDTLS_CIPHER_MODE_WITH_PADDING */ - -/** - * \brief Set the initialization vector (IV) or nonce - * - * \param ctx generic cipher context - * \param iv IV to use (or NONCE_COUNTER for CTR-mode ciphers) - * \param iv_len IV length for ciphers with variable-size IV; - * discarded by ciphers with fixed-size IV. - * - * \returns 0 on success, or MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA - * - * \note Some ciphers don't use IVs nor NONCE. For these - * ciphers, this function has no effect. - */ -int mbedtls_cipher_set_iv( mbedtls_cipher_context_t *ctx, - const unsigned char *iv, size_t iv_len ); - -/** - * \brief Finish preparation of the given context - * - * \param ctx generic cipher context - * - * \returns 0 on success, MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA - * if parameter verification fails. - */ -int mbedtls_cipher_reset( mbedtls_cipher_context_t *ctx ); - -#if defined(MBEDTLS_GCM_C) -/** - * \brief Add additional data (for AEAD ciphers). - * Currently only supported with GCM. - * Must be called exactly once, after mbedtls_cipher_reset(). - * - * \param ctx generic cipher context - * \param ad Additional data to use. - * \param ad_len Length of ad. - * - * \return 0 on success, or a specific error code. - */ -int mbedtls_cipher_update_ad( mbedtls_cipher_context_t *ctx, - const unsigned char *ad, size_t ad_len ); -#endif /* MBEDTLS_GCM_C */ - -/** - * \brief Generic cipher update function. Encrypts/decrypts - * using the given cipher context. Writes as many block - * size'd blocks of data as possible to output. Any data - * that cannot be written immediately will either be added - * to the next block, or flushed when cipher_final is - * called. - * Exception: for MBEDTLS_MODE_ECB, expects single block - * in size (e.g. 16 bytes for AES) - * - * \param ctx generic cipher context - * \param input buffer holding the input data - * \param ilen length of the input data - * \param output buffer for the output data. Should be able to hold at - * least ilen + block_size. Cannot be the same buffer as - * input! - * \param olen length of the output data, will be filled with the - * actual number of bytes written. - * - * \returns 0 on success, MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA if - * parameter verification fails, - * MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE on an - * unsupported mode for a cipher or a cipher specific - * error code. - * - * \note If the underlying cipher is GCM, all calls to this - * function, except the last one before mbedtls_cipher_finish(), - * must have ilen a multiple of the block size. - */ -int mbedtls_cipher_update( mbedtls_cipher_context_t *ctx, const unsigned char *input, - size_t ilen, unsigned char *output, size_t *olen ); - -/** - * \brief Generic cipher finalisation function. If data still - * needs to be flushed from an incomplete block, data - * contained within it will be padded with the size of - * the last block, and written to the output buffer. - * - * \param ctx Generic cipher context - * \param output buffer to write data to. Needs block_size available. - * \param olen length of the data written to the output buffer. - * - * \returns 0 on success, MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA if - * parameter verification fails, - * MBEDTLS_ERR_CIPHER_FULL_BLOCK_EXPECTED if decryption - * expected a full block but was not provided one, - * MBEDTLS_ERR_CIPHER_INVALID_PADDING on invalid padding - * while decrypting or a cipher specific error code. - */ -int mbedtls_cipher_finish( mbedtls_cipher_context_t *ctx, - unsigned char *output, size_t *olen ); - -#if defined(MBEDTLS_GCM_C) -/** - * \brief Write tag for AEAD ciphers. - * Currently only supported with GCM. - * Must be called after mbedtls_cipher_finish(). - * - * \param ctx Generic cipher context - * \param tag buffer to write the tag - * \param tag_len Length of the tag to write - * - * \return 0 on success, or a specific error code. - */ -int mbedtls_cipher_write_tag( mbedtls_cipher_context_t *ctx, - unsigned char *tag, size_t tag_len ); - -/** - * \brief Check tag for AEAD ciphers. - * Currently only supported with GCM. - * Must be called after mbedtls_cipher_finish(). - * - * \param ctx Generic cipher context - * \param tag Buffer holding the tag - * \param tag_len Length of the tag to check - * - * \return 0 on success, or a specific error code. - */ -int mbedtls_cipher_check_tag( mbedtls_cipher_context_t *ctx, - const unsigned char *tag, size_t tag_len ); -#endif /* MBEDTLS_GCM_C */ - -/** - * \brief Generic all-in-one encryption/decryption - * (for all ciphers except AEAD constructs). - * - * \param ctx generic cipher context - * \param iv IV to use (or NONCE_COUNTER for CTR-mode ciphers) - * \param iv_len IV length for ciphers with variable-size IV; - * discarded by ciphers with fixed-size IV. - * \param input buffer holding the input data - * \param ilen length of the input data - * \param output buffer for the output data. Should be able to hold at - * least ilen + block_size. Cannot be the same buffer as - * input! - * \param olen length of the output data, will be filled with the - * actual number of bytes written. - * - * \note Some ciphers don't use IVs nor NONCE. For these - * ciphers, use iv = NULL and iv_len = 0. - * - * \returns 0 on success, or - * MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA, or - * MBEDTLS_ERR_CIPHER_FULL_BLOCK_EXPECTED if decryption - * expected a full block but was not provided one, or - * MBEDTLS_ERR_CIPHER_INVALID_PADDING on invalid padding - * while decrypting, or - * a cipher specific error code. - */ -int mbedtls_cipher_crypt( mbedtls_cipher_context_t *ctx, - const unsigned char *iv, size_t iv_len, - const unsigned char *input, size_t ilen, - unsigned char *output, size_t *olen ); - -#if defined(MBEDTLS_CIPHER_MODE_AEAD) -/** - * \brief Generic autenticated encryption (AEAD ciphers). - * - * \param ctx generic cipher context - * \param iv IV to use (or NONCE_COUNTER for CTR-mode ciphers) - * \param iv_len IV length for ciphers with variable-size IV; - * discarded by ciphers with fixed-size IV. - * \param ad Additional data to authenticate. - * \param ad_len Length of ad. - * \param input buffer holding the input data - * \param ilen length of the input data - * \param output buffer for the output data. - * Should be able to hold at least ilen. - * \param olen length of the output data, will be filled with the - * actual number of bytes written. - * \param tag buffer for the authentication tag - * \param tag_len desired tag length - * - * \returns 0 on success, or - * MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA, or - * a cipher specific error code. - */ -int mbedtls_cipher_auth_encrypt( mbedtls_cipher_context_t *ctx, - const unsigned char *iv, size_t iv_len, - const unsigned char *ad, size_t ad_len, - const unsigned char *input, size_t ilen, - unsigned char *output, size_t *olen, - unsigned char *tag, size_t tag_len ); - -/** - * \brief Generic autenticated decryption (AEAD ciphers). - * - * \param ctx generic cipher context - * \param iv IV to use (or NONCE_COUNTER for CTR-mode ciphers) - * \param iv_len IV length for ciphers with variable-size IV; - * discarded by ciphers with fixed-size IV. - * \param ad Additional data to be authenticated. - * \param ad_len Length of ad. - * \param input buffer holding the input data - * \param ilen length of the input data - * \param output buffer for the output data. - * Should be able to hold at least ilen. - * \param olen length of the output data, will be filled with the - * actual number of bytes written. - * \param tag buffer holding the authentication tag - * \param tag_len length of the authentication tag - * - * \returns 0 on success, or - * MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA, or - * MBEDTLS_ERR_CIPHER_AUTH_FAILED if data isn't authentic, - * or a cipher specific error code. - * - * \note If the data is not authentic, then the output buffer - * is zeroed out to prevent the unauthentic plaintext to - * be used by mistake, making this interface safer. - */ -int mbedtls_cipher_auth_decrypt( mbedtls_cipher_context_t *ctx, - const unsigned char *iv, size_t iv_len, - const unsigned char *ad, size_t ad_len, - const unsigned char *input, size_t ilen, - unsigned char *output, size_t *olen, - const unsigned char *tag, size_t tag_len ); -#endif /* MBEDTLS_CIPHER_MODE_AEAD */ - -#ifdef __cplusplus -} -#endif - -#endif /* MBEDTLS_CIPHER_H */ diff --git a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/cipher_internal.h b/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/cipher_internal.h deleted file mode 100644 index 6c58bcc5..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/cipher_internal.h +++ /dev/null @@ -1,109 +0,0 @@ -/** - * \file cipher_internal.h - * - * \brief Cipher wrappers. - * - * \author Adriaan de Jong - * - * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * This file is part of mbed TLS (https://tls.mbed.org) - */ -#ifndef MBEDTLS_CIPHER_WRAP_H -#define MBEDTLS_CIPHER_WRAP_H - -#if !defined(MBEDTLS_CONFIG_FILE) -#include "config.h" -#else -#include MBEDTLS_CONFIG_FILE -#endif - -#include "cipher.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * Base cipher information. The non-mode specific functions and values. - */ -struct mbedtls_cipher_base_t -{ - /** Base Cipher type (e.g. MBEDTLS_CIPHER_ID_AES) */ - mbedtls_cipher_id_t cipher; - - /** Encrypt using ECB */ - int (*ecb_func)( void *ctx, mbedtls_operation_t mode, - const unsigned char *input, unsigned char *output ); - -#if defined(MBEDTLS_CIPHER_MODE_CBC) - /** Encrypt using CBC */ - int (*cbc_func)( void *ctx, mbedtls_operation_t mode, size_t length, - unsigned char *iv, const unsigned char *input, - unsigned char *output ); -#endif - -#if defined(MBEDTLS_CIPHER_MODE_CFB) - /** Encrypt using CFB (Full length) */ - int (*cfb_func)( void *ctx, mbedtls_operation_t mode, size_t length, size_t *iv_off, - unsigned char *iv, const unsigned char *input, - unsigned char *output ); -#endif - -#if defined(MBEDTLS_CIPHER_MODE_CTR) - /** Encrypt using CTR */ - int (*ctr_func)( void *ctx, size_t length, size_t *nc_off, - unsigned char *nonce_counter, unsigned char *stream_block, - const unsigned char *input, unsigned char *output ); -#endif - -#if defined(MBEDTLS_CIPHER_MODE_STREAM) - /** Encrypt using STREAM */ - int (*stream_func)( void *ctx, size_t length, - const unsigned char *input, unsigned char *output ); -#endif - - /** Set key for encryption purposes */ - int (*setkey_enc_func)( void *ctx, const unsigned char *key, - unsigned int key_bitlen ); - - /** Set key for decryption purposes */ - int (*setkey_dec_func)( void *ctx, const unsigned char *key, - unsigned int key_bitlen); - - /** Allocate a new context */ - void * (*ctx_alloc_func)( void ); - - /** Free the given context */ - void (*ctx_free_func)( void *ctx ); - -}; - -typedef struct -{ - mbedtls_cipher_type_t type; - const mbedtls_cipher_info_t *info; -} mbedtls_cipher_definition_t; - -extern const mbedtls_cipher_definition_t mbedtls_cipher_definitions[]; - -extern int mbedtls_cipher_supported[]; - -#ifdef __cplusplus -} -#endif - -#endif /* MBEDTLS_CIPHER_WRAP_H */ diff --git a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/compat-1.3.h b/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/compat-1.3.h deleted file mode 100644 index 1ddfff8c..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/compat-1.3.h +++ /dev/null @@ -1,2633 +0,0 @@ -/** - * \file config.h - * - * \brief Compatibility names (set of defines) - * - * \deprecated Use the new names directly instead - * - * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * This file is part of mbed TLS (https://tls.mbed.org) - */ - -#if ! defined(MBEDTLS_DEPRECATED_REMOVED) - -#if defined(MBEDTLS_DEPRECATED_WARNING) -#warning "Including compat-1.3.h is deprecated" -#endif - -#ifndef MBEDTLS_COMPAT13_H -#define MBEDTLS_COMPAT13_H - -/* - * config.h options - */ -#if defined MBEDTLS_AESNI_C -#define POLARSSL_AESNI_C MBEDTLS_AESNI_C -#endif -#if defined MBEDTLS_AES_ALT -#define POLARSSL_AES_ALT MBEDTLS_AES_ALT -#endif -#if defined MBEDTLS_AES_C -#define POLARSSL_AES_C MBEDTLS_AES_C -#endif -#if defined MBEDTLS_AES_ROM_TABLES -#define POLARSSL_AES_ROM_TABLES MBEDTLS_AES_ROM_TABLES -#endif -#if defined MBEDTLS_ARC4_ALT -#define POLARSSL_ARC4_ALT MBEDTLS_ARC4_ALT -#endif -#if defined MBEDTLS_ARC4_C -#define POLARSSL_ARC4_C MBEDTLS_ARC4_C -#endif -#if defined MBEDTLS_ASN1_PARSE_C -#define POLARSSL_ASN1_PARSE_C MBEDTLS_ASN1_PARSE_C -#endif -#if defined MBEDTLS_ASN1_WRITE_C -#define POLARSSL_ASN1_WRITE_C MBEDTLS_ASN1_WRITE_C -#endif -#if defined MBEDTLS_BASE64_C -#define POLARSSL_BASE64_C MBEDTLS_BASE64_C -#endif -#if defined MBEDTLS_BIGNUM_C -#define POLARSSL_BIGNUM_C MBEDTLS_BIGNUM_C -#endif -#if defined MBEDTLS_BLOWFISH_ALT -#define POLARSSL_BLOWFISH_ALT MBEDTLS_BLOWFISH_ALT -#endif -#if defined MBEDTLS_BLOWFISH_C -#define POLARSSL_BLOWFISH_C MBEDTLS_BLOWFISH_C -#endif -#if defined MBEDTLS_CAMELLIA_ALT -#define POLARSSL_CAMELLIA_ALT MBEDTLS_CAMELLIA_ALT -#endif -#if defined MBEDTLS_CAMELLIA_C -#define POLARSSL_CAMELLIA_C MBEDTLS_CAMELLIA_C -#endif -#if defined MBEDTLS_CAMELLIA_SMALL_MEMORY -#define POLARSSL_CAMELLIA_SMALL_MEMORY MBEDTLS_CAMELLIA_SMALL_MEMORY -#endif -#if defined MBEDTLS_CCM_C -#define POLARSSL_CCM_C MBEDTLS_CCM_C -#endif -#if defined MBEDTLS_CERTS_C -#define POLARSSL_CERTS_C MBEDTLS_CERTS_C -#endif -#if defined MBEDTLS_CIPHER_C -#define POLARSSL_CIPHER_C MBEDTLS_CIPHER_C -#endif -#if defined MBEDTLS_CIPHER_MODE_CBC -#define POLARSSL_CIPHER_MODE_CBC MBEDTLS_CIPHER_MODE_CBC -#endif -#if defined MBEDTLS_CIPHER_MODE_CFB -#define POLARSSL_CIPHER_MODE_CFB MBEDTLS_CIPHER_MODE_CFB -#endif -#if defined MBEDTLS_CIPHER_MODE_CTR -#define POLARSSL_CIPHER_MODE_CTR MBEDTLS_CIPHER_MODE_CTR -#endif -#if defined MBEDTLS_CIPHER_NULL_CIPHER -#define POLARSSL_CIPHER_NULL_CIPHER MBEDTLS_CIPHER_NULL_CIPHER -#endif -#if defined MBEDTLS_CIPHER_PADDING_ONE_AND_ZEROS -#define POLARSSL_CIPHER_PADDING_ONE_AND_ZEROS MBEDTLS_CIPHER_PADDING_ONE_AND_ZEROS -#endif -#if defined MBEDTLS_CIPHER_PADDING_PKCS7 -#define POLARSSL_CIPHER_PADDING_PKCS7 MBEDTLS_CIPHER_PADDING_PKCS7 -#endif -#if defined MBEDTLS_CIPHER_PADDING_ZEROS -#define POLARSSL_CIPHER_PADDING_ZEROS MBEDTLS_CIPHER_PADDING_ZEROS -#endif -#if defined MBEDTLS_CIPHER_PADDING_ZEROS_AND_LEN -#define POLARSSL_CIPHER_PADDING_ZEROS_AND_LEN MBEDTLS_CIPHER_PADDING_ZEROS_AND_LEN -#endif -#if defined MBEDTLS_CTR_DRBG_C -#define POLARSSL_CTR_DRBG_C MBEDTLS_CTR_DRBG_C -#endif -#if defined MBEDTLS_DEBUG_C -#define POLARSSL_DEBUG_C MBEDTLS_DEBUG_C -#endif -#if defined MBEDTLS_DEPRECATED_REMOVED -#define POLARSSL_DEPRECATED_REMOVED MBEDTLS_DEPRECATED_REMOVED -#endif -#if defined MBEDTLS_DEPRECATED_WARNING -#define POLARSSL_DEPRECATED_WARNING MBEDTLS_DEPRECATED_WARNING -#endif -#if defined MBEDTLS_DES_ALT -#define POLARSSL_DES_ALT MBEDTLS_DES_ALT -#endif -#if defined MBEDTLS_DES_C -#define POLARSSL_DES_C MBEDTLS_DES_C -#endif -#if defined MBEDTLS_DHM_C -#define POLARSSL_DHM_C MBEDTLS_DHM_C -#endif -#if defined MBEDTLS_ECDH_C -#define POLARSSL_ECDH_C MBEDTLS_ECDH_C -#endif -#if defined MBEDTLS_ECDSA_C -#define POLARSSL_ECDSA_C MBEDTLS_ECDSA_C -#endif -#if defined MBEDTLS_ECDSA_DETERMINISTIC -#define POLARSSL_ECDSA_DETERMINISTIC MBEDTLS_ECDSA_DETERMINISTIC -#endif -#if defined MBEDTLS_ECP_C -#define POLARSSL_ECP_C MBEDTLS_ECP_C -#endif -#if defined MBEDTLS_ECP_DP_BP256R1_ENABLED -#define POLARSSL_ECP_DP_BP256R1_ENABLED MBEDTLS_ECP_DP_BP256R1_ENABLED -#endif -#if defined MBEDTLS_ECP_DP_BP384R1_ENABLED -#define POLARSSL_ECP_DP_BP384R1_ENABLED MBEDTLS_ECP_DP_BP384R1_ENABLED -#endif -#if defined MBEDTLS_ECP_DP_BP512R1_ENABLED -#define POLARSSL_ECP_DP_BP512R1_ENABLED MBEDTLS_ECP_DP_BP512R1_ENABLED -#endif -#if defined MBEDTLS_ECP_DP_CURVE25519_ENABLED -#define POLARSSL_ECP_DP_M255_ENABLED MBEDTLS_ECP_DP_CURVE25519_ENABLED -#endif -#if defined MBEDTLS_ECP_DP_SECP192K1_ENABLED -#define POLARSSL_ECP_DP_SECP192K1_ENABLED MBEDTLS_ECP_DP_SECP192K1_ENABLED -#endif -#if defined MBEDTLS_ECP_DP_SECP192R1_ENABLED -#define POLARSSL_ECP_DP_SECP192R1_ENABLED MBEDTLS_ECP_DP_SECP192R1_ENABLED -#endif -#if defined MBEDTLS_ECP_DP_SECP224K1_ENABLED -#define POLARSSL_ECP_DP_SECP224K1_ENABLED MBEDTLS_ECP_DP_SECP224K1_ENABLED -#endif -#if defined MBEDTLS_ECP_DP_SECP224R1_ENABLED -#define POLARSSL_ECP_DP_SECP224R1_ENABLED MBEDTLS_ECP_DP_SECP224R1_ENABLED -#endif -#if defined MBEDTLS_ECP_DP_SECP256K1_ENABLED -#define POLARSSL_ECP_DP_SECP256K1_ENABLED MBEDTLS_ECP_DP_SECP256K1_ENABLED -#endif -#if defined MBEDTLS_ECP_DP_SECP256R1_ENABLED -#define POLARSSL_ECP_DP_SECP256R1_ENABLED MBEDTLS_ECP_DP_SECP256R1_ENABLED -#endif -#if defined MBEDTLS_ECP_DP_SECP384R1_ENABLED -#define POLARSSL_ECP_DP_SECP384R1_ENABLED MBEDTLS_ECP_DP_SECP384R1_ENABLED -#endif -#if defined MBEDTLS_ECP_DP_SECP521R1_ENABLED -#define POLARSSL_ECP_DP_SECP521R1_ENABLED MBEDTLS_ECP_DP_SECP521R1_ENABLED -#endif -#if defined MBEDTLS_ECP_FIXED_POINT_OPTIM -#define POLARSSL_ECP_FIXED_POINT_OPTIM MBEDTLS_ECP_FIXED_POINT_OPTIM -#endif -#if defined MBEDTLS_ECP_MAX_BITS -#define POLARSSL_ECP_MAX_BITS MBEDTLS_ECP_MAX_BITS -#endif -#if defined MBEDTLS_ECP_NIST_OPTIM -#define POLARSSL_ECP_NIST_OPTIM MBEDTLS_ECP_NIST_OPTIM -#endif -#if defined MBEDTLS_ECP_WINDOW_SIZE -#define POLARSSL_ECP_WINDOW_SIZE MBEDTLS_ECP_WINDOW_SIZE -#endif -#if defined MBEDTLS_ENABLE_WEAK_CIPHERSUITES -#define POLARSSL_ENABLE_WEAK_CIPHERSUITES MBEDTLS_ENABLE_WEAK_CIPHERSUITES -#endif -#if defined MBEDTLS_ENTROPY_C -#define POLARSSL_ENTROPY_C MBEDTLS_ENTROPY_C -#endif -#if defined MBEDTLS_ENTROPY_FORCE_SHA256 -#define POLARSSL_ENTROPY_FORCE_SHA256 MBEDTLS_ENTROPY_FORCE_SHA256 -#endif -#if defined MBEDTLS_ERROR_C -#define POLARSSL_ERROR_C MBEDTLS_ERROR_C -#endif -#if defined MBEDTLS_ERROR_STRERROR_BC -#define POLARSSL_ERROR_STRERROR_BC MBEDTLS_ERROR_STRERROR_BC -#endif -#if defined MBEDTLS_ERROR_STRERROR_DUMMY -#define POLARSSL_ERROR_STRERROR_DUMMY MBEDTLS_ERROR_STRERROR_DUMMY -#endif -#if defined MBEDTLS_FS_IO -#define POLARSSL_FS_IO MBEDTLS_FS_IO -#endif -#if defined MBEDTLS_GCM_C -#define POLARSSL_GCM_C MBEDTLS_GCM_C -#endif -#if defined MBEDTLS_GENPRIME -#define POLARSSL_GENPRIME MBEDTLS_GENPRIME -#endif -#if defined MBEDTLS_HAVEGE_C -#define POLARSSL_HAVEGE_C MBEDTLS_HAVEGE_C -#endif -#if defined MBEDTLS_HAVE_ASM -#define POLARSSL_HAVE_ASM MBEDTLS_HAVE_ASM -#endif -#if defined MBEDTLS_HAVE_SSE2 -#define POLARSSL_HAVE_SSE2 MBEDTLS_HAVE_SSE2 -#endif -#if defined MBEDTLS_HAVE_TIME -#define POLARSSL_HAVE_TIME MBEDTLS_HAVE_TIME -#endif -#if defined MBEDTLS_HMAC_DRBG_C -#define POLARSSL_HMAC_DRBG_C MBEDTLS_HMAC_DRBG_C -#endif -#if defined MBEDTLS_HMAC_DRBG_MAX_INPUT -#define POLARSSL_HMAC_DRBG_MAX_INPUT MBEDTLS_HMAC_DRBG_MAX_INPUT -#endif -#if defined MBEDTLS_HMAC_DRBG_MAX_REQUEST -#define POLARSSL_HMAC_DRBG_MAX_REQUEST MBEDTLS_HMAC_DRBG_MAX_REQUEST -#endif -#if defined MBEDTLS_HMAC_DRBG_MAX_SEED_INPUT -#define POLARSSL_HMAC_DRBG_MAX_SEED_INPUT MBEDTLS_HMAC_DRBG_MAX_SEED_INPUT -#endif -#if defined MBEDTLS_HMAC_DRBG_RESEED_INTERVAL -#define POLARSSL_HMAC_DRBG_RESEED_INTERVAL MBEDTLS_HMAC_DRBG_RESEED_INTERVAL -#endif -#if defined MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED -#define POLARSSL_KEY_EXCHANGE_DHE_PSK_ENABLED MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED -#endif -#if defined MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED -#define POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED -#endif -#if defined MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED -#define POLARSSL_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED -#endif -#if defined MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED -#define POLARSSL_KEY_EXCHANGE_ECDHE_PSK_ENABLED MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED -#endif -#if defined MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED -#define POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED -#endif -#if defined MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED -#define POLARSSL_KEY_EXCHANGE_ECDH_ECDSA_ENABLED MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED -#endif -#if defined MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED -#define POLARSSL_KEY_EXCHANGE_ECDH_RSA_ENABLED MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED -#endif -#if defined MBEDTLS_KEY_EXCHANGE_PSK_ENABLED -#define POLARSSL_KEY_EXCHANGE_PSK_ENABLED MBEDTLS_KEY_EXCHANGE_PSK_ENABLED -#endif -#if defined MBEDTLS_KEY_EXCHANGE_RSA_ENABLED -#define POLARSSL_KEY_EXCHANGE_RSA_ENABLED MBEDTLS_KEY_EXCHANGE_RSA_ENABLED -#endif -#if defined MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED -#define POLARSSL_KEY_EXCHANGE_RSA_PSK_ENABLED MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED -#endif -#if defined MBEDTLS_MD2_ALT -#define POLARSSL_MD2_ALT MBEDTLS_MD2_ALT -#endif -#if defined MBEDTLS_MD2_C -#define POLARSSL_MD2_C MBEDTLS_MD2_C -#endif -#if defined MBEDTLS_MD2_PROCESS_ALT -#define POLARSSL_MD2_PROCESS_ALT MBEDTLS_MD2_PROCESS_ALT -#endif -#if defined MBEDTLS_MD4_ALT -#define POLARSSL_MD4_ALT MBEDTLS_MD4_ALT -#endif -#if defined MBEDTLS_MD4_C -#define POLARSSL_MD4_C MBEDTLS_MD4_C -#endif -#if defined MBEDTLS_MD4_PROCESS_ALT -#define POLARSSL_MD4_PROCESS_ALT MBEDTLS_MD4_PROCESS_ALT -#endif -#if defined MBEDTLS_MD5_ALT -#define POLARSSL_MD5_ALT MBEDTLS_MD5_ALT -#endif -#if defined MBEDTLS_MD5_C -#define POLARSSL_MD5_C MBEDTLS_MD5_C -#endif -#if defined MBEDTLS_MD5_PROCESS_ALT -#define POLARSSL_MD5_PROCESS_ALT MBEDTLS_MD5_PROCESS_ALT -#endif -#if defined MBEDTLS_MD_C -#define POLARSSL_MD_C MBEDTLS_MD_C -#endif -#if defined MBEDTLS_MEMORY_ALIGN_MULTIPLE -#define POLARSSL_MEMORY_ALIGN_MULTIPLE MBEDTLS_MEMORY_ALIGN_MULTIPLE -#endif -#if defined MBEDTLS_MEMORY_BACKTRACE -#define POLARSSL_MEMORY_BACKTRACE MBEDTLS_MEMORY_BACKTRACE -#endif -#if defined MBEDTLS_MEMORY_BUFFER_ALLOC_C -#define POLARSSL_MEMORY_BUFFER_ALLOC_C MBEDTLS_MEMORY_BUFFER_ALLOC_C -#endif -#if defined MBEDTLS_MEMORY_C -#define POLARSSL_MEMORY_C MBEDTLS_MEMORY_C -#endif -#if defined MBEDTLS_MEMORY_DEBUG -#define POLARSSL_MEMORY_DEBUG MBEDTLS_MEMORY_DEBUG -#endif -#if defined MBEDTLS_MPI_MAX_SIZE -#define POLARSSL_MPI_MAX_SIZE MBEDTLS_MPI_MAX_SIZE -#endif -#if defined MBEDTLS_MPI_WINDOW_SIZE -#define POLARSSL_MPI_WINDOW_SIZE MBEDTLS_MPI_WINDOW_SIZE -#endif -#if defined MBEDTLS_NET_C -#define POLARSSL_NET_C MBEDTLS_NET_C -#endif -#if defined MBEDTLS_NO_DEFAULT_ENTROPY_SOURCES -#define POLARSSL_NO_DEFAULT_ENTROPY_SOURCES MBEDTLS_NO_DEFAULT_ENTROPY_SOURCES -#endif -#if defined MBEDTLS_NO_PLATFORM_ENTROPY -#define POLARSSL_NO_PLATFORM_ENTROPY MBEDTLS_NO_PLATFORM_ENTROPY -#endif -#if defined MBEDTLS_OID_C -#define POLARSSL_OID_C MBEDTLS_OID_C -#endif -#if defined MBEDTLS_PADLOCK_C -#define POLARSSL_PADLOCK_C MBEDTLS_PADLOCK_C -#endif -#if defined MBEDTLS_PBKDF2_C -#define POLARSSL_PBKDF2_C MBEDTLS_PBKDF2_C -#endif -#if defined MBEDTLS_PEM_PARSE_C -#define POLARSSL_PEM_PARSE_C MBEDTLS_PEM_PARSE_C -#endif -#if defined MBEDTLS_PEM_WRITE_C -#define POLARSSL_PEM_WRITE_C MBEDTLS_PEM_WRITE_C -#endif -#if defined MBEDTLS_PKCS11_C -#define POLARSSL_PKCS11_C MBEDTLS_PKCS11_C -#endif -#if defined MBEDTLS_PKCS12_C -#define POLARSSL_PKCS12_C MBEDTLS_PKCS12_C -#endif -#if defined MBEDTLS_PKCS1_V15 -#define POLARSSL_PKCS1_V15 MBEDTLS_PKCS1_V15 -#endif -#if defined MBEDTLS_PKCS1_V21 -#define POLARSSL_PKCS1_V21 MBEDTLS_PKCS1_V21 -#endif -#if defined MBEDTLS_PKCS5_C -#define POLARSSL_PKCS5_C MBEDTLS_PKCS5_C -#endif -#if defined MBEDTLS_PK_C -#define POLARSSL_PK_C MBEDTLS_PK_C -#endif -#if defined MBEDTLS_PK_PARSE_C -#define POLARSSL_PK_PARSE_C MBEDTLS_PK_PARSE_C -#endif -#if defined MBEDTLS_PK_PARSE_EC_EXTENDED -#define POLARSSL_PK_PARSE_EC_EXTENDED MBEDTLS_PK_PARSE_EC_EXTENDED -#endif -#if defined MBEDTLS_PK_RSA_ALT_SUPPORT -#define POLARSSL_PK_RSA_ALT_SUPPORT MBEDTLS_PK_RSA_ALT_SUPPORT -#endif -#if defined MBEDTLS_PK_WRITE_C -#define POLARSSL_PK_WRITE_C MBEDTLS_PK_WRITE_C -#endif -#if defined MBEDTLS_PLATFORM_C -#define POLARSSL_PLATFORM_C MBEDTLS_PLATFORM_C -#endif -#if defined MBEDTLS_PLATFORM_EXIT_ALT -#define POLARSSL_PLATFORM_EXIT_ALT MBEDTLS_PLATFORM_EXIT_ALT -#endif -#if defined MBEDTLS_PLATFORM_EXIT_MACRO -#define POLARSSL_PLATFORM_EXIT_MACRO MBEDTLS_PLATFORM_EXIT_MACRO -#endif -#if defined MBEDTLS_PLATFORM_FPRINTF_ALT -#define POLARSSL_PLATFORM_FPRINTF_ALT MBEDTLS_PLATFORM_FPRINTF_ALT -#endif -#if defined MBEDTLS_PLATFORM_FPRINTF_MACRO -#define POLARSSL_PLATFORM_FPRINTF_MACRO MBEDTLS_PLATFORM_FPRINTF_MACRO -#endif -#if defined MBEDTLS_PLATFORM_FREE_MACRO -#define POLARSSL_PLATFORM_FREE_MACRO MBEDTLS_PLATFORM_FREE_MACRO -#endif -#if defined MBEDTLS_PLATFORM_MEMORY -#define POLARSSL_PLATFORM_MEMORY MBEDTLS_PLATFORM_MEMORY -#endif -#if defined MBEDTLS_PLATFORM_NO_STD_FUNCTIONS -#define POLARSSL_PLATFORM_NO_STD_FUNCTIONS MBEDTLS_PLATFORM_NO_STD_FUNCTIONS -#endif -#if defined MBEDTLS_PLATFORM_PRINTF_ALT -#define POLARSSL_PLATFORM_PRINTF_ALT MBEDTLS_PLATFORM_PRINTF_ALT -#endif -#if defined MBEDTLS_PLATFORM_PRINTF_MACRO -#define POLARSSL_PLATFORM_PRINTF_MACRO MBEDTLS_PLATFORM_PRINTF_MACRO -#endif -#if defined MBEDTLS_PLATFORM_SNPRINTF_ALT -#define POLARSSL_PLATFORM_SNPRINTF_ALT MBEDTLS_PLATFORM_SNPRINTF_ALT -#endif -#if defined MBEDTLS_PLATFORM_SNPRINTF_MACRO -#define POLARSSL_PLATFORM_SNPRINTF_MACRO MBEDTLS_PLATFORM_SNPRINTF_MACRO -#endif -#if defined MBEDTLS_PLATFORM_STD_EXIT -#define POLARSSL_PLATFORM_STD_EXIT MBEDTLS_PLATFORM_STD_EXIT -#endif -#if defined MBEDTLS_PLATFORM_STD_FPRINTF -#define POLARSSL_PLATFORM_STD_FPRINTF MBEDTLS_PLATFORM_STD_FPRINTF -#endif -#if defined MBEDTLS_PLATFORM_STD_FREE -#define POLARSSL_PLATFORM_STD_FREE MBEDTLS_PLATFORM_STD_FREE -#endif -#if defined MBEDTLS_PLATFORM_STD_MALLOC -#define POLARSSL_PLATFORM_STD_MALLOC MBEDTLS_PLATFORM_STD_MALLOC -#endif -#if defined MBEDTLS_PLATFORM_STD_MEM_HDR -#define POLARSSL_PLATFORM_STD_MEM_HDR MBEDTLS_PLATFORM_STD_MEM_HDR -#endif -#if defined MBEDTLS_PLATFORM_STD_PRINTF -#define POLARSSL_PLATFORM_STD_PRINTF MBEDTLS_PLATFORM_STD_PRINTF -#endif -#if defined MBEDTLS_PLATFORM_STD_SNPRINTF -#define POLARSSL_PLATFORM_STD_SNPRINTF MBEDTLS_PLATFORM_STD_SNPRINTF -#endif -#if defined MBEDTLS_PSK_MAX_LEN -#define POLARSSL_PSK_MAX_LEN MBEDTLS_PSK_MAX_LEN -#endif -#if defined MBEDTLS_REMOVE_ARC4_CIPHERSUITES -#define POLARSSL_REMOVE_ARC4_CIPHERSUITES MBEDTLS_REMOVE_ARC4_CIPHERSUITES -#endif -#if defined MBEDTLS_RIPEMD160_ALT -#define POLARSSL_RIPEMD160_ALT MBEDTLS_RIPEMD160_ALT -#endif -#if defined MBEDTLS_RIPEMD160_C -#define POLARSSL_RIPEMD160_C MBEDTLS_RIPEMD160_C -#endif -#if defined MBEDTLS_RIPEMD160_PROCESS_ALT -#define POLARSSL_RIPEMD160_PROCESS_ALT MBEDTLS_RIPEMD160_PROCESS_ALT -#endif -#if defined MBEDTLS_RSA_C -#define POLARSSL_RSA_C MBEDTLS_RSA_C -#endif -#if defined MBEDTLS_RSA_NO_CRT -#define POLARSSL_RSA_NO_CRT MBEDTLS_RSA_NO_CRT -#endif -#if defined MBEDTLS_SELF_TEST -#define POLARSSL_SELF_TEST MBEDTLS_SELF_TEST -#endif -#if defined MBEDTLS_SHA1_ALT -#define POLARSSL_SHA1_ALT MBEDTLS_SHA1_ALT -#endif -#if defined MBEDTLS_SHA1_C -#define POLARSSL_SHA1_C MBEDTLS_SHA1_C -#endif -#if defined MBEDTLS_SHA1_PROCESS_ALT -#define POLARSSL_SHA1_PROCESS_ALT MBEDTLS_SHA1_PROCESS_ALT -#endif -#if defined MBEDTLS_SHA256_ALT -#define POLARSSL_SHA256_ALT MBEDTLS_SHA256_ALT -#endif -#if defined MBEDTLS_SHA256_C -#define POLARSSL_SHA256_C MBEDTLS_SHA256_C -#endif -#if defined MBEDTLS_SHA256_PROCESS_ALT -#define POLARSSL_SHA256_PROCESS_ALT MBEDTLS_SHA256_PROCESS_ALT -#endif -#if defined MBEDTLS_SHA512_ALT -#define POLARSSL_SHA512_ALT MBEDTLS_SHA512_ALT -#endif -#if defined MBEDTLS_SHA512_C -#define POLARSSL_SHA512_C MBEDTLS_SHA512_C -#endif -#if defined MBEDTLS_SHA512_PROCESS_ALT -#define POLARSSL_SHA512_PROCESS_ALT MBEDTLS_SHA512_PROCESS_ALT -#endif -#if defined MBEDTLS_SSL_AEAD_RANDOM_IV -#define POLARSSL_SSL_AEAD_RANDOM_IV MBEDTLS_SSL_AEAD_RANDOM_IV -#endif -#if defined MBEDTLS_SSL_ALERT_MESSAGES -#define POLARSSL_SSL_ALERT_MESSAGES MBEDTLS_SSL_ALERT_MESSAGES -#endif -#if defined MBEDTLS_SSL_ALL_ALERT_MESSAGES -#define POLARSSL_SSL_ALL_ALERT_MESSAGES MBEDTLS_SSL_ALL_ALERT_MESSAGES -#endif -#if defined MBEDTLS_SSL_ALPN -#define POLARSSL_SSL_ALPN MBEDTLS_SSL_ALPN -#endif -#if defined MBEDTLS_SSL_CACHE_C -#define POLARSSL_SSL_CACHE_C MBEDTLS_SSL_CACHE_C -#endif -#if defined MBEDTLS_SSL_CBC_RECORD_SPLITTING -#define POLARSSL_SSL_CBC_RECORD_SPLITTING MBEDTLS_SSL_CBC_RECORD_SPLITTING -#endif -#if defined MBEDTLS_SSL_CLI_C -#define POLARSSL_SSL_CLI_C MBEDTLS_SSL_CLI_C -#endif -#if defined MBEDTLS_SSL_COOKIE_C -#define POLARSSL_SSL_COOKIE_C MBEDTLS_SSL_COOKIE_C -#endif -#if defined MBEDTLS_SSL_COOKIE_TIMEOUT -#define POLARSSL_SSL_COOKIE_TIMEOUT MBEDTLS_SSL_COOKIE_TIMEOUT -#endif -#if defined MBEDTLS_SSL_DEBUG_ALL -#define POLARSSL_SSL_DEBUG_ALL MBEDTLS_SSL_DEBUG_ALL -#endif -#if defined MBEDTLS_SSL_DISABLE_RENEGOTIATION -#define POLARSSL_SSL_DISABLE_RENEGOTIATION MBEDTLS_SSL_DISABLE_RENEGOTIATION -#endif -#if defined MBEDTLS_SSL_DTLS_ANTI_REPLAY -#define POLARSSL_SSL_DTLS_ANTI_REPLAY MBEDTLS_SSL_DTLS_ANTI_REPLAY -#endif -#if defined MBEDTLS_SSL_DTLS_BADMAC_LIMIT -#define POLARSSL_SSL_DTLS_BADMAC_LIMIT MBEDTLS_SSL_DTLS_BADMAC_LIMIT -#endif -#if defined MBEDTLS_SSL_DTLS_HELLO_VERIFY -#define POLARSSL_SSL_DTLS_HELLO_VERIFY MBEDTLS_SSL_DTLS_HELLO_VERIFY -#endif -#if defined MBEDTLS_SSL_ENCRYPT_THEN_MAC -#define POLARSSL_SSL_ENCRYPT_THEN_MAC MBEDTLS_SSL_ENCRYPT_THEN_MAC -#endif -#if defined MBEDTLS_SSL_EXTENDED_MASTER_SECRET -#define POLARSSL_SSL_EXTENDED_MASTER_SECRET MBEDTLS_SSL_EXTENDED_MASTER_SECRET -#endif -#if defined MBEDTLS_SSL_FALLBACK_SCSV -#define POLARSSL_SSL_FALLBACK_SCSV MBEDTLS_SSL_FALLBACK_SCSV -#endif -#if defined MBEDTLS_SSL_HW_RECORD_ACCEL -#define POLARSSL_SSL_HW_RECORD_ACCEL MBEDTLS_SSL_HW_RECORD_ACCEL -#endif -#if defined MBEDTLS_SSL_MAX_FRAGMENT_LENGTH -#define POLARSSL_SSL_MAX_FRAGMENT_LENGTH MBEDTLS_SSL_MAX_FRAGMENT_LENGTH -#endif -#if defined MBEDTLS_SSL_PROTO_DTLS -#define POLARSSL_SSL_PROTO_DTLS MBEDTLS_SSL_PROTO_DTLS -#endif -#if defined MBEDTLS_SSL_PROTO_SSL3 -#define POLARSSL_SSL_PROTO_SSL3 MBEDTLS_SSL_PROTO_SSL3 -#endif -#if defined MBEDTLS_SSL_PROTO_TLS1 -#define POLARSSL_SSL_PROTO_TLS1 MBEDTLS_SSL_PROTO_TLS1 -#endif -#if defined MBEDTLS_SSL_PROTO_TLS1_1 -#define POLARSSL_SSL_PROTO_TLS1_1 MBEDTLS_SSL_PROTO_TLS1_1 -#endif -#if defined MBEDTLS_SSL_PROTO_TLS1_2 -#define POLARSSL_SSL_PROTO_TLS1_2 MBEDTLS_SSL_PROTO_TLS1_2 -#endif -#if defined MBEDTLS_SSL_RENEGOTIATION -#define POLARSSL_SSL_RENEGOTIATION MBEDTLS_SSL_RENEGOTIATION -#endif -#if defined MBEDTLS_SSL_SERVER_NAME_INDICATION -#define POLARSSL_SSL_SERVER_NAME_INDICATION MBEDTLS_SSL_SERVER_NAME_INDICATION -#endif -#if defined MBEDTLS_SSL_SESSION_TICKETS -#define POLARSSL_SSL_SESSION_TICKETS MBEDTLS_SSL_SESSION_TICKETS -#endif -#if defined MBEDTLS_SSL_SRV_C -#define POLARSSL_SSL_SRV_C MBEDTLS_SSL_SRV_C -#endif -#if defined MBEDTLS_SSL_SRV_RESPECT_CLIENT_PREFERENCE -#define POLARSSL_SSL_SRV_RESPECT_CLIENT_PREFERENCE MBEDTLS_SSL_SRV_RESPECT_CLIENT_PREFERENCE -#endif -#if defined MBEDTLS_SSL_SRV_SUPPORT_SSLV2_CLIENT_HELLO -#define POLARSSL_SSL_SRV_SUPPORT_SSLV2_CLIENT_HELLO MBEDTLS_SSL_SRV_SUPPORT_SSLV2_CLIENT_HELLO -#endif -#if defined MBEDTLS_SSL_TLS_C -#define POLARSSL_SSL_TLS_C MBEDTLS_SSL_TLS_C -#endif -#if defined MBEDTLS_SSL_TRUNCATED_HMAC -#define POLARSSL_SSL_TRUNCATED_HMAC MBEDTLS_SSL_TRUNCATED_HMAC -#endif -#if defined MBEDTLS_THREADING_ALT -#define POLARSSL_THREADING_ALT MBEDTLS_THREADING_ALT -#endif -#if defined MBEDTLS_THREADING_C -#define POLARSSL_THREADING_C MBEDTLS_THREADING_C -#endif -#if defined MBEDTLS_THREADING_PTHREAD -#define POLARSSL_THREADING_PTHREAD MBEDTLS_THREADING_PTHREAD -#endif -#if defined MBEDTLS_TIMING_ALT -#define POLARSSL_TIMING_ALT MBEDTLS_TIMING_ALT -#endif -#if defined MBEDTLS_TIMING_C -#define POLARSSL_TIMING_C MBEDTLS_TIMING_C -#endif -#if defined MBEDTLS_VERSION_C -#define POLARSSL_VERSION_C MBEDTLS_VERSION_C -#endif -#if defined MBEDTLS_VERSION_FEATURES -#define POLARSSL_VERSION_FEATURES MBEDTLS_VERSION_FEATURES -#endif -#if defined MBEDTLS_X509_ALLOW_EXTENSIONS_NON_V3 -#define POLARSSL_X509_ALLOW_EXTENSIONS_NON_V3 MBEDTLS_X509_ALLOW_EXTENSIONS_NON_V3 -#endif -#if defined MBEDTLS_X509_ALLOW_UNSUPPORTED_CRITICAL_EXTENSION -#define POLARSSL_X509_ALLOW_UNSUPPORTED_CRITICAL_EXTENSION MBEDTLS_X509_ALLOW_UNSUPPORTED_CRITICAL_EXTENSION -#endif -#if defined MBEDTLS_X509_CHECK_EXTENDED_KEY_USAGE -#define POLARSSL_X509_CHECK_EXTENDED_KEY_USAGE MBEDTLS_X509_CHECK_EXTENDED_KEY_USAGE -#endif -#if defined MBEDTLS_X509_CHECK_KEY_USAGE -#define POLARSSL_X509_CHECK_KEY_USAGE MBEDTLS_X509_CHECK_KEY_USAGE -#endif -#if defined MBEDTLS_X509_CREATE_C -#define POLARSSL_X509_CREATE_C MBEDTLS_X509_CREATE_C -#endif -#if defined MBEDTLS_X509_CRL_PARSE_C -#define POLARSSL_X509_CRL_PARSE_C MBEDTLS_X509_CRL_PARSE_C -#endif -#if defined MBEDTLS_X509_CRT_PARSE_C -#define POLARSSL_X509_CRT_PARSE_C MBEDTLS_X509_CRT_PARSE_C -#endif -#if defined MBEDTLS_X509_CRT_WRITE_C -#define POLARSSL_X509_CRT_WRITE_C MBEDTLS_X509_CRT_WRITE_C -#endif -#if defined MBEDTLS_X509_CSR_PARSE_C -#define POLARSSL_X509_CSR_PARSE_C MBEDTLS_X509_CSR_PARSE_C -#endif -#if defined MBEDTLS_X509_CSR_WRITE_C -#define POLARSSL_X509_CSR_WRITE_C MBEDTLS_X509_CSR_WRITE_C -#endif -#if defined MBEDTLS_X509_MAX_INTERMEDIATE_CA -#define POLARSSL_X509_MAX_INTERMEDIATE_CA MBEDTLS_X509_MAX_INTERMEDIATE_CA -#endif -#if defined MBEDTLS_X509_RSASSA_PSS_SUPPORT -#define POLARSSL_X509_RSASSA_PSS_SUPPORT MBEDTLS_X509_RSASSA_PSS_SUPPORT -#endif -#if defined MBEDTLS_X509_USE_C -#define POLARSSL_X509_USE_C MBEDTLS_X509_USE_C -#endif -#if defined MBEDTLS_XTEA_ALT -#define POLARSSL_XTEA_ALT MBEDTLS_XTEA_ALT -#endif -#if defined MBEDTLS_XTEA_C -#define POLARSSL_XTEA_C MBEDTLS_XTEA_C -#endif -#if defined MBEDTLS_ZLIB_SUPPORT -#define POLARSSL_ZLIB_SUPPORT MBEDTLS_ZLIB_SUPPORT -#endif - -/* - * Misc names (macros, types, functions, enum constants...) - */ -#define AES_DECRYPT MBEDTLS_AES_DECRYPT -#define AES_ENCRYPT MBEDTLS_AES_ENCRYPT -#define ASN1_BIT_STRING MBEDTLS_ASN1_BIT_STRING -#define ASN1_BMP_STRING MBEDTLS_ASN1_BMP_STRING -#define ASN1_BOOLEAN MBEDTLS_ASN1_BOOLEAN -#define ASN1_CHK_ADD MBEDTLS_ASN1_CHK_ADD -#define ASN1_CONSTRUCTED MBEDTLS_ASN1_CONSTRUCTED -#define ASN1_CONTEXT_SPECIFIC MBEDTLS_ASN1_CONTEXT_SPECIFIC -#define ASN1_GENERALIZED_TIME MBEDTLS_ASN1_GENERALIZED_TIME -#define ASN1_IA5_STRING MBEDTLS_ASN1_IA5_STRING -#define ASN1_INTEGER MBEDTLS_ASN1_INTEGER -#define ASN1_NULL MBEDTLS_ASN1_NULL -#define ASN1_OCTET_STRING MBEDTLS_ASN1_OCTET_STRING -#define ASN1_OID MBEDTLS_ASN1_OID -#define ASN1_PRIMITIVE MBEDTLS_ASN1_PRIMITIVE -#define ASN1_PRINTABLE_STRING MBEDTLS_ASN1_PRINTABLE_STRING -#define ASN1_SEQUENCE MBEDTLS_ASN1_SEQUENCE -#define ASN1_SET MBEDTLS_ASN1_SET -#define ASN1_T61_STRING MBEDTLS_ASN1_T61_STRING -#define ASN1_UNIVERSAL_STRING MBEDTLS_ASN1_UNIVERSAL_STRING -#define ASN1_UTC_TIME MBEDTLS_ASN1_UTC_TIME -#define ASN1_UTF8_STRING MBEDTLS_ASN1_UTF8_STRING -#define BADCERT_CN_MISMATCH MBEDTLS_X509_BADCERT_CN_MISMATCH -#define BADCERT_EXPIRED MBEDTLS_X509_BADCERT_EXPIRED -#define BADCERT_FUTURE MBEDTLS_X509_BADCERT_FUTURE -#define BADCERT_MISSING MBEDTLS_X509_BADCERT_MISSING -#define BADCERT_NOT_TRUSTED MBEDTLS_X509_BADCERT_NOT_TRUSTED -#define BADCERT_OTHER MBEDTLS_X509_BADCERT_OTHER -#define BADCERT_REVOKED MBEDTLS_X509_BADCERT_REVOKED -#define BADCERT_SKIP_VERIFY MBEDTLS_X509_BADCERT_SKIP_VERIFY -#define BADCRL_EXPIRED MBEDTLS_X509_BADCRL_EXPIRED -#define BADCRL_FUTURE MBEDTLS_X509_BADCRL_FUTURE -#define BADCRL_NOT_TRUSTED MBEDTLS_X509_BADCRL_NOT_TRUSTED -#define BLOWFISH_BLOCKSIZE MBEDTLS_BLOWFISH_BLOCKSIZE -#define BLOWFISH_DECRYPT MBEDTLS_BLOWFISH_DECRYPT -#define BLOWFISH_ENCRYPT MBEDTLS_BLOWFISH_ENCRYPT -#define BLOWFISH_MAX_KEY MBEDTLS_BLOWFISH_MAX_KEY_BITS -#define BLOWFISH_MIN_KEY MBEDTLS_BLOWFISH_MIN_KEY_BITS -#define BLOWFISH_ROUNDS MBEDTLS_BLOWFISH_ROUNDS -#define CAMELLIA_DECRYPT MBEDTLS_CAMELLIA_DECRYPT -#define CAMELLIA_ENCRYPT MBEDTLS_CAMELLIA_ENCRYPT -#define COLLECT_SIZE MBEDTLS_HAVEGE_COLLECT_SIZE -#define CTR_DRBG_BLOCKSIZE MBEDTLS_CTR_DRBG_BLOCKSIZE -#define CTR_DRBG_ENTROPY_LEN MBEDTLS_CTR_DRBG_ENTROPY_LEN -#define CTR_DRBG_KEYBITS MBEDTLS_CTR_DRBG_KEYBITS -#define CTR_DRBG_KEYSIZE MBEDTLS_CTR_DRBG_KEYSIZE -#define CTR_DRBG_MAX_INPUT MBEDTLS_CTR_DRBG_MAX_INPUT -#define CTR_DRBG_MAX_REQUEST MBEDTLS_CTR_DRBG_MAX_REQUEST -#define CTR_DRBG_MAX_SEED_INPUT MBEDTLS_CTR_DRBG_MAX_SEED_INPUT -#define CTR_DRBG_PR_OFF MBEDTLS_CTR_DRBG_PR_OFF -#define CTR_DRBG_PR_ON MBEDTLS_CTR_DRBG_PR_ON -#define CTR_DRBG_RESEED_INTERVAL MBEDTLS_CTR_DRBG_RESEED_INTERVAL -#define CTR_DRBG_SEEDLEN MBEDTLS_CTR_DRBG_SEEDLEN -#define DEPRECATED MBEDTLS_DEPRECATED -#define DES_DECRYPT MBEDTLS_DES_DECRYPT -#define DES_ENCRYPT MBEDTLS_DES_ENCRYPT -#define DES_KEY_SIZE MBEDTLS_DES_KEY_SIZE -#define ENTROPY_BLOCK_SIZE MBEDTLS_ENTROPY_BLOCK_SIZE -#define ENTROPY_MAX_GATHER MBEDTLS_ENTROPY_MAX_GATHER -#define ENTROPY_MAX_SEED_SIZE MBEDTLS_ENTROPY_MAX_SEED_SIZE -#define ENTROPY_MAX_SOURCES MBEDTLS_ENTROPY_MAX_SOURCES -#define ENTROPY_MIN_HARDCLOCK MBEDTLS_ENTROPY_MIN_HARDCLOCK -#define ENTROPY_MIN_HAVEGE MBEDTLS_ENTROPY_MIN_HAVEGE -#define ENTROPY_MIN_PLATFORM MBEDTLS_ENTROPY_MIN_PLATFORM -#define ENTROPY_SOURCE_MANUAL MBEDTLS_ENTROPY_SOURCE_MANUAL -#define EXT_AUTHORITY_KEY_IDENTIFIER MBEDTLS_X509_EXT_AUTHORITY_KEY_IDENTIFIER -#define EXT_BASIC_CONSTRAINTS MBEDTLS_X509_EXT_BASIC_CONSTRAINTS -#define EXT_CERTIFICATE_POLICIES MBEDTLS_X509_EXT_CERTIFICATE_POLICIES -#define EXT_CRL_DISTRIBUTION_POINTS MBEDTLS_X509_EXT_CRL_DISTRIBUTION_POINTS -#define EXT_EXTENDED_KEY_USAGE MBEDTLS_X509_EXT_EXTENDED_KEY_USAGE -#define EXT_FRESHEST_CRL MBEDTLS_X509_EXT_FRESHEST_CRL -#define EXT_INIHIBIT_ANYPOLICY MBEDTLS_X509_EXT_INIHIBIT_ANYPOLICY -#define EXT_ISSUER_ALT_NAME MBEDTLS_X509_EXT_ISSUER_ALT_NAME -#define EXT_KEY_USAGE MBEDTLS_X509_EXT_KEY_USAGE -#define EXT_NAME_CONSTRAINTS MBEDTLS_X509_EXT_NAME_CONSTRAINTS -#define EXT_NS_CERT_TYPE MBEDTLS_X509_EXT_NS_CERT_TYPE -#define EXT_POLICY_CONSTRAINTS MBEDTLS_X509_EXT_POLICY_CONSTRAINTS -#define EXT_POLICY_MAPPINGS MBEDTLS_X509_EXT_POLICY_MAPPINGS -#define EXT_SUBJECT_ALT_NAME MBEDTLS_X509_EXT_SUBJECT_ALT_NAME -#define EXT_SUBJECT_DIRECTORY_ATTRS MBEDTLS_X509_EXT_SUBJECT_DIRECTORY_ATTRS -#define EXT_SUBJECT_KEY_IDENTIFIER MBEDTLS_X509_EXT_SUBJECT_KEY_IDENTIFIER -#define GCM_DECRYPT MBEDTLS_GCM_DECRYPT -#define GCM_ENCRYPT MBEDTLS_GCM_ENCRYPT -#define KU_CRL_SIGN MBEDTLS_X509_KU_CRL_SIGN -#define KU_DATA_ENCIPHERMENT MBEDTLS_X509_KU_DATA_ENCIPHERMENT -#define KU_DIGITAL_SIGNATURE MBEDTLS_X509_KU_DIGITAL_SIGNATURE -#define KU_KEY_AGREEMENT MBEDTLS_X509_KU_KEY_AGREEMENT -#define KU_KEY_CERT_SIGN MBEDTLS_X509_KU_KEY_CERT_SIGN -#define KU_KEY_ENCIPHERMENT MBEDTLS_X509_KU_KEY_ENCIPHERMENT -#define KU_NON_REPUDIATION MBEDTLS_X509_KU_NON_REPUDIATION -#define LN_2_DIV_LN_10_SCALE100 MBEDTLS_LN_2_DIV_LN_10_SCALE100 -#define MD_CONTEXT_T_INIT MBEDTLS_MD_CONTEXT_T_INIT -#define MEMORY_VERIFY_ALLOC MBEDTLS_MEMORY_VERIFY_ALLOC -#define MEMORY_VERIFY_ALWAYS MBEDTLS_MEMORY_VERIFY_ALWAYS -#define MEMORY_VERIFY_FREE MBEDTLS_MEMORY_VERIFY_FREE -#define MEMORY_VERIFY_NONE MBEDTLS_MEMORY_VERIFY_NONE -#define MPI_CHK MBEDTLS_MPI_CHK -#define NET_PROTO_TCP MBEDTLS_NET_PROTO_TCP -#define NET_PROTO_UDP MBEDTLS_NET_PROTO_UDP -#define NS_CERT_TYPE_EMAIL MBEDTLS_X509_NS_CERT_TYPE_EMAIL -#define NS_CERT_TYPE_EMAIL_CA MBEDTLS_X509_NS_CERT_TYPE_EMAIL_CA -#define NS_CERT_TYPE_OBJECT_SIGNING MBEDTLS_X509_NS_CERT_TYPE_OBJECT_SIGNING -#define NS_CERT_TYPE_OBJECT_SIGNING_CA MBEDTLS_X509_NS_CERT_TYPE_OBJECT_SIGNING_CA -#define NS_CERT_TYPE_RESERVED MBEDTLS_X509_NS_CERT_TYPE_RESERVED -#define NS_CERT_TYPE_SSL_CA MBEDTLS_X509_NS_CERT_TYPE_SSL_CA -#define NS_CERT_TYPE_SSL_CLIENT MBEDTLS_X509_NS_CERT_TYPE_SSL_CLIENT -#define NS_CERT_TYPE_SSL_SERVER MBEDTLS_X509_NS_CERT_TYPE_SSL_SERVER -#define OID_ANSI_X9_62 MBEDTLS_OID_ANSI_X9_62 -#define OID_ANSI_X9_62_FIELD_TYPE MBEDTLS_OID_ANSI_X9_62_FIELD_TYPE -#define OID_ANSI_X9_62_PRIME_FIELD MBEDTLS_OID_ANSI_X9_62_PRIME_FIELD -#define OID_ANSI_X9_62_SIG MBEDTLS_OID_ANSI_X9_62_SIG -#define OID_ANSI_X9_62_SIG_SHA2 MBEDTLS_OID_ANSI_X9_62_SIG_SHA2 -#define OID_ANY_EXTENDED_KEY_USAGE MBEDTLS_OID_ANY_EXTENDED_KEY_USAGE -#define OID_AT MBEDTLS_OID_AT -#define OID_AT_CN MBEDTLS_OID_AT_CN -#define OID_AT_COUNTRY MBEDTLS_OID_AT_COUNTRY -#define OID_AT_DN_QUALIFIER MBEDTLS_OID_AT_DN_QUALIFIER -#define OID_AT_GENERATION_QUALIFIER MBEDTLS_OID_AT_GENERATION_QUALIFIER -#define OID_AT_GIVEN_NAME MBEDTLS_OID_AT_GIVEN_NAME -#define OID_AT_INITIALS MBEDTLS_OID_AT_INITIALS -#define OID_AT_LOCALITY MBEDTLS_OID_AT_LOCALITY -#define OID_AT_ORGANIZATION MBEDTLS_OID_AT_ORGANIZATION -#define OID_AT_ORG_UNIT MBEDTLS_OID_AT_ORG_UNIT -#define OID_AT_POSTAL_ADDRESS MBEDTLS_OID_AT_POSTAL_ADDRESS -#define OID_AT_POSTAL_CODE MBEDTLS_OID_AT_POSTAL_CODE -#define OID_AT_PSEUDONYM MBEDTLS_OID_AT_PSEUDONYM -#define OID_AT_SERIAL_NUMBER MBEDTLS_OID_AT_SERIAL_NUMBER -#define OID_AT_STATE MBEDTLS_OID_AT_STATE -#define OID_AT_SUR_NAME MBEDTLS_OID_AT_SUR_NAME -#define OID_AT_TITLE MBEDTLS_OID_AT_TITLE -#define OID_AT_UNIQUE_IDENTIFIER MBEDTLS_OID_AT_UNIQUE_IDENTIFIER -#define OID_AUTHORITY_KEY_IDENTIFIER MBEDTLS_OID_AUTHORITY_KEY_IDENTIFIER -#define OID_BASIC_CONSTRAINTS MBEDTLS_OID_BASIC_CONSTRAINTS -#define OID_CERTICOM MBEDTLS_OID_CERTICOM -#define OID_CERTIFICATE_POLICIES MBEDTLS_OID_CERTIFICATE_POLICIES -#define OID_CLIENT_AUTH MBEDTLS_OID_CLIENT_AUTH -#define OID_CMP MBEDTLS_OID_CMP -#define OID_CODE_SIGNING MBEDTLS_OID_CODE_SIGNING -#define OID_COUNTRY_US MBEDTLS_OID_COUNTRY_US -#define OID_CRL_DISTRIBUTION_POINTS MBEDTLS_OID_CRL_DISTRIBUTION_POINTS -#define OID_CRL_NUMBER MBEDTLS_OID_CRL_NUMBER -#define OID_DES_CBC MBEDTLS_OID_DES_CBC -#define OID_DES_EDE3_CBC MBEDTLS_OID_DES_EDE3_CBC -#define OID_DIGEST_ALG_MD2 MBEDTLS_OID_DIGEST_ALG_MD2 -#define OID_DIGEST_ALG_MD4 MBEDTLS_OID_DIGEST_ALG_MD4 -#define OID_DIGEST_ALG_MD5 MBEDTLS_OID_DIGEST_ALG_MD5 -#define OID_DIGEST_ALG_SHA1 MBEDTLS_OID_DIGEST_ALG_SHA1 -#define OID_DIGEST_ALG_SHA224 MBEDTLS_OID_DIGEST_ALG_SHA224 -#define OID_DIGEST_ALG_SHA256 MBEDTLS_OID_DIGEST_ALG_SHA256 -#define OID_DIGEST_ALG_SHA384 MBEDTLS_OID_DIGEST_ALG_SHA384 -#define OID_DIGEST_ALG_SHA512 MBEDTLS_OID_DIGEST_ALG_SHA512 -#define OID_DOMAIN_COMPONENT MBEDTLS_OID_DOMAIN_COMPONENT -#define OID_ECDSA_SHA1 MBEDTLS_OID_ECDSA_SHA1 -#define OID_ECDSA_SHA224 MBEDTLS_OID_ECDSA_SHA224 -#define OID_ECDSA_SHA256 MBEDTLS_OID_ECDSA_SHA256 -#define OID_ECDSA_SHA384 MBEDTLS_OID_ECDSA_SHA384 -#define OID_ECDSA_SHA512 MBEDTLS_OID_ECDSA_SHA512 -#define OID_EC_ALG_ECDH MBEDTLS_OID_EC_ALG_ECDH -#define OID_EC_ALG_UNRESTRICTED MBEDTLS_OID_EC_ALG_UNRESTRICTED -#define OID_EC_BRAINPOOL_V1 MBEDTLS_OID_EC_BRAINPOOL_V1 -#define OID_EC_GRP_BP256R1 MBEDTLS_OID_EC_GRP_BP256R1 -#define OID_EC_GRP_BP384R1 MBEDTLS_OID_EC_GRP_BP384R1 -#define OID_EC_GRP_BP512R1 MBEDTLS_OID_EC_GRP_BP512R1 -#define OID_EC_GRP_SECP192K1 MBEDTLS_OID_EC_GRP_SECP192K1 -#define OID_EC_GRP_SECP192R1 MBEDTLS_OID_EC_GRP_SECP192R1 -#define OID_EC_GRP_SECP224K1 MBEDTLS_OID_EC_GRP_SECP224K1 -#define OID_EC_GRP_SECP224R1 MBEDTLS_OID_EC_GRP_SECP224R1 -#define OID_EC_GRP_SECP256K1 MBEDTLS_OID_EC_GRP_SECP256K1 -#define OID_EC_GRP_SECP256R1 MBEDTLS_OID_EC_GRP_SECP256R1 -#define OID_EC_GRP_SECP384R1 MBEDTLS_OID_EC_GRP_SECP384R1 -#define OID_EC_GRP_SECP521R1 MBEDTLS_OID_EC_GRP_SECP521R1 -#define OID_EMAIL_PROTECTION MBEDTLS_OID_EMAIL_PROTECTION -#define OID_EXTENDED_KEY_USAGE MBEDTLS_OID_EXTENDED_KEY_USAGE -#define OID_FRESHEST_CRL MBEDTLS_OID_FRESHEST_CRL -#define OID_GOV MBEDTLS_OID_GOV -#define OID_HMAC_SHA1 MBEDTLS_OID_HMAC_SHA1 -#define OID_ID_CE MBEDTLS_OID_ID_CE -#define OID_INIHIBIT_ANYPOLICY MBEDTLS_OID_INIHIBIT_ANYPOLICY -#define OID_ISO_CCITT_DS MBEDTLS_OID_ISO_CCITT_DS -#define OID_ISO_IDENTIFIED_ORG MBEDTLS_OID_ISO_IDENTIFIED_ORG -#define OID_ISO_ITU_COUNTRY MBEDTLS_OID_ISO_ITU_COUNTRY -#define OID_ISO_ITU_US_ORG MBEDTLS_OID_ISO_ITU_US_ORG -#define OID_ISO_MEMBER_BODIES MBEDTLS_OID_ISO_MEMBER_BODIES -#define OID_ISSUER_ALT_NAME MBEDTLS_OID_ISSUER_ALT_NAME -#define OID_KEY_USAGE MBEDTLS_OID_KEY_USAGE -#define OID_KP MBEDTLS_OID_KP -#define OID_MGF1 MBEDTLS_OID_MGF1 -#define OID_NAME_CONSTRAINTS MBEDTLS_OID_NAME_CONSTRAINTS -#define OID_NETSCAPE MBEDTLS_OID_NETSCAPE -#define OID_NS_BASE_URL MBEDTLS_OID_NS_BASE_URL -#define OID_NS_CA_POLICY_URL MBEDTLS_OID_NS_CA_POLICY_URL -#define OID_NS_CA_REVOCATION_URL MBEDTLS_OID_NS_CA_REVOCATION_URL -#define OID_NS_CERT MBEDTLS_OID_NS_CERT -#define OID_NS_CERT_SEQUENCE MBEDTLS_OID_NS_CERT_SEQUENCE -#define OID_NS_CERT_TYPE MBEDTLS_OID_NS_CERT_TYPE -#define OID_NS_COMMENT MBEDTLS_OID_NS_COMMENT -#define OID_NS_DATA_TYPE MBEDTLS_OID_NS_DATA_TYPE -#define OID_NS_RENEWAL_URL MBEDTLS_OID_NS_RENEWAL_URL -#define OID_NS_REVOCATION_URL MBEDTLS_OID_NS_REVOCATION_URL -#define OID_NS_SSL_SERVER_NAME MBEDTLS_OID_NS_SSL_SERVER_NAME -#define OID_OCSP_SIGNING MBEDTLS_OID_OCSP_SIGNING -#define OID_OIW_SECSIG MBEDTLS_OID_OIW_SECSIG -#define OID_OIW_SECSIG_ALG MBEDTLS_OID_OIW_SECSIG_ALG -#define OID_OIW_SECSIG_SHA1 MBEDTLS_OID_OIW_SECSIG_SHA1 -#define OID_ORGANIZATION MBEDTLS_OID_ORGANIZATION -#define OID_ORG_ANSI_X9_62 MBEDTLS_OID_ORG_ANSI_X9_62 -#define OID_ORG_CERTICOM MBEDTLS_OID_ORG_CERTICOM -#define OID_ORG_DOD MBEDTLS_OID_ORG_DOD -#define OID_ORG_GOV MBEDTLS_OID_ORG_GOV -#define OID_ORG_NETSCAPE MBEDTLS_OID_ORG_NETSCAPE -#define OID_ORG_OIW MBEDTLS_OID_ORG_OIW -#define OID_ORG_RSA_DATA_SECURITY MBEDTLS_OID_ORG_RSA_DATA_SECURITY -#define OID_ORG_TELETRUST MBEDTLS_OID_ORG_TELETRUST -#define OID_PKCS MBEDTLS_OID_PKCS -#define OID_PKCS1 MBEDTLS_OID_PKCS1 -#define OID_PKCS12 MBEDTLS_OID_PKCS12 -#define OID_PKCS12_PBE MBEDTLS_OID_PKCS12_PBE -#define OID_PKCS12_PBE_SHA1_DES2_EDE_CBC MBEDTLS_OID_PKCS12_PBE_SHA1_DES2_EDE_CBC -#define OID_PKCS12_PBE_SHA1_DES3_EDE_CBC MBEDTLS_OID_PKCS12_PBE_SHA1_DES3_EDE_CBC -#define OID_PKCS12_PBE_SHA1_RC2_128_CBC MBEDTLS_OID_PKCS12_PBE_SHA1_RC2_128_CBC -#define OID_PKCS12_PBE_SHA1_RC2_40_CBC MBEDTLS_OID_PKCS12_PBE_SHA1_RC2_40_CBC -#define OID_PKCS12_PBE_SHA1_RC4_128 MBEDTLS_OID_PKCS12_PBE_SHA1_RC4_128 -#define OID_PKCS12_PBE_SHA1_RC4_40 MBEDTLS_OID_PKCS12_PBE_SHA1_RC4_40 -#define OID_PKCS1_MD2 MBEDTLS_OID_PKCS1_MD2 -#define OID_PKCS1_MD4 MBEDTLS_OID_PKCS1_MD4 -#define OID_PKCS1_MD5 MBEDTLS_OID_PKCS1_MD5 -#define OID_PKCS1_RSA MBEDTLS_OID_PKCS1_RSA -#define OID_PKCS1_SHA1 MBEDTLS_OID_PKCS1_SHA1 -#define OID_PKCS1_SHA224 MBEDTLS_OID_PKCS1_SHA224 -#define OID_PKCS1_SHA256 MBEDTLS_OID_PKCS1_SHA256 -#define OID_PKCS1_SHA384 MBEDTLS_OID_PKCS1_SHA384 -#define OID_PKCS1_SHA512 MBEDTLS_OID_PKCS1_SHA512 -#define OID_PKCS5 MBEDTLS_OID_PKCS5 -#define OID_PKCS5_PBES2 MBEDTLS_OID_PKCS5_PBES2 -#define OID_PKCS5_PBE_MD2_DES_CBC MBEDTLS_OID_PKCS5_PBE_MD2_DES_CBC -#define OID_PKCS5_PBE_MD2_RC2_CBC MBEDTLS_OID_PKCS5_PBE_MD2_RC2_CBC -#define OID_PKCS5_PBE_MD5_DES_CBC MBEDTLS_OID_PKCS5_PBE_MD5_DES_CBC -#define OID_PKCS5_PBE_MD5_RC2_CBC MBEDTLS_OID_PKCS5_PBE_MD5_RC2_CBC -#define OID_PKCS5_PBE_SHA1_DES_CBC MBEDTLS_OID_PKCS5_PBE_SHA1_DES_CBC -#define OID_PKCS5_PBE_SHA1_RC2_CBC MBEDTLS_OID_PKCS5_PBE_SHA1_RC2_CBC -#define OID_PKCS5_PBKDF2 MBEDTLS_OID_PKCS5_PBKDF2 -#define OID_PKCS5_PBMAC1 MBEDTLS_OID_PKCS5_PBMAC1 -#define OID_PKCS9 MBEDTLS_OID_PKCS9 -#define OID_PKCS9_CSR_EXT_REQ MBEDTLS_OID_PKCS9_CSR_EXT_REQ -#define OID_PKCS9_EMAIL MBEDTLS_OID_PKCS9_EMAIL -#define OID_PKIX MBEDTLS_OID_PKIX -#define OID_POLICY_CONSTRAINTS MBEDTLS_OID_POLICY_CONSTRAINTS -#define OID_POLICY_MAPPINGS MBEDTLS_OID_POLICY_MAPPINGS -#define OID_PRIVATE_KEY_USAGE_PERIOD MBEDTLS_OID_PRIVATE_KEY_USAGE_PERIOD -#define OID_RSASSA_PSS MBEDTLS_OID_RSASSA_PSS -#define OID_RSA_COMPANY MBEDTLS_OID_RSA_COMPANY -#define OID_RSA_SHA_OBS MBEDTLS_OID_RSA_SHA_OBS -#define OID_SERVER_AUTH MBEDTLS_OID_SERVER_AUTH -#define OID_SIZE MBEDTLS_OID_SIZE -#define OID_SUBJECT_ALT_NAME MBEDTLS_OID_SUBJECT_ALT_NAME -#define OID_SUBJECT_DIRECTORY_ATTRS MBEDTLS_OID_SUBJECT_DIRECTORY_ATTRS -#define OID_SUBJECT_KEY_IDENTIFIER MBEDTLS_OID_SUBJECT_KEY_IDENTIFIER -#define OID_TELETRUST MBEDTLS_OID_TELETRUST -#define OID_TIME_STAMPING MBEDTLS_OID_TIME_STAMPING -#define PADLOCK_ACE MBEDTLS_PADLOCK_ACE -#define PADLOCK_ALIGN16 MBEDTLS_PADLOCK_ALIGN16 -#define PADLOCK_PHE MBEDTLS_PADLOCK_PHE -#define PADLOCK_PMM MBEDTLS_PADLOCK_PMM -#define PADLOCK_RNG MBEDTLS_PADLOCK_RNG -#define PKCS12_DERIVE_IV MBEDTLS_PKCS12_DERIVE_IV -#define PKCS12_DERIVE_KEY MBEDTLS_PKCS12_DERIVE_KEY -#define PKCS12_DERIVE_MAC_KEY MBEDTLS_PKCS12_DERIVE_MAC_KEY -#define PKCS12_PBE_DECRYPT MBEDTLS_PKCS12_PBE_DECRYPT -#define PKCS12_PBE_ENCRYPT MBEDTLS_PKCS12_PBE_ENCRYPT -#define PKCS5_DECRYPT MBEDTLS_PKCS5_DECRYPT -#define PKCS5_ENCRYPT MBEDTLS_PKCS5_ENCRYPT -#define POLARSSL_AESNI_AES MBEDTLS_AESNI_AES -#define POLARSSL_AESNI_CLMUL MBEDTLS_AESNI_CLMUL -#define POLARSSL_AESNI_H MBEDTLS_AESNI_H -#define POLARSSL_AES_H MBEDTLS_AES_H -#define POLARSSL_ARC4_H MBEDTLS_ARC4_H -#define POLARSSL_ASN1_H MBEDTLS_ASN1_H -#define POLARSSL_ASN1_WRITE_H MBEDTLS_ASN1_WRITE_H -#define POLARSSL_BASE64_H MBEDTLS_BASE64_H -#define POLARSSL_BIGNUM_H MBEDTLS_BIGNUM_H -#define POLARSSL_BLOWFISH_H MBEDTLS_BLOWFISH_H -#define POLARSSL_BN_MUL_H MBEDTLS_BN_MUL_H -#define POLARSSL_CAMELLIA_H MBEDTLS_CAMELLIA_H -#define POLARSSL_CCM_H MBEDTLS_CCM_H -#define POLARSSL_CERTS_H MBEDTLS_CERTS_H -#define POLARSSL_CHECK_CONFIG_H MBEDTLS_CHECK_CONFIG_H -#define POLARSSL_CIPHERSUITE_NODTLS MBEDTLS_CIPHERSUITE_NODTLS -#define POLARSSL_CIPHERSUITE_SHORT_TAG MBEDTLS_CIPHERSUITE_SHORT_TAG -#define POLARSSL_CIPHERSUITE_WEAK MBEDTLS_CIPHERSUITE_WEAK -#define POLARSSL_CIPHER_AES_128_CBC MBEDTLS_CIPHER_AES_128_CBC -#define POLARSSL_CIPHER_AES_128_CCM MBEDTLS_CIPHER_AES_128_CCM -#define POLARSSL_CIPHER_AES_128_CFB128 MBEDTLS_CIPHER_AES_128_CFB128 -#define POLARSSL_CIPHER_AES_128_CTR MBEDTLS_CIPHER_AES_128_CTR -#define POLARSSL_CIPHER_AES_128_ECB MBEDTLS_CIPHER_AES_128_ECB -#define POLARSSL_CIPHER_AES_128_GCM MBEDTLS_CIPHER_AES_128_GCM -#define POLARSSL_CIPHER_AES_192_CBC MBEDTLS_CIPHER_AES_192_CBC -#define POLARSSL_CIPHER_AES_192_CCM MBEDTLS_CIPHER_AES_192_CCM -#define POLARSSL_CIPHER_AES_192_CFB128 MBEDTLS_CIPHER_AES_192_CFB128 -#define POLARSSL_CIPHER_AES_192_CTR MBEDTLS_CIPHER_AES_192_CTR -#define POLARSSL_CIPHER_AES_192_ECB MBEDTLS_CIPHER_AES_192_ECB -#define POLARSSL_CIPHER_AES_192_GCM MBEDTLS_CIPHER_AES_192_GCM -#define POLARSSL_CIPHER_AES_256_CBC MBEDTLS_CIPHER_AES_256_CBC -#define POLARSSL_CIPHER_AES_256_CCM MBEDTLS_CIPHER_AES_256_CCM -#define POLARSSL_CIPHER_AES_256_CFB128 MBEDTLS_CIPHER_AES_256_CFB128 -#define POLARSSL_CIPHER_AES_256_CTR MBEDTLS_CIPHER_AES_256_CTR -#define POLARSSL_CIPHER_AES_256_ECB MBEDTLS_CIPHER_AES_256_ECB -#define POLARSSL_CIPHER_AES_256_GCM MBEDTLS_CIPHER_AES_256_GCM -#define POLARSSL_CIPHER_ARC4_128 MBEDTLS_CIPHER_ARC4_128 -#define POLARSSL_CIPHER_BLOWFISH_CBC MBEDTLS_CIPHER_BLOWFISH_CBC -#define POLARSSL_CIPHER_BLOWFISH_CFB64 MBEDTLS_CIPHER_BLOWFISH_CFB64 -#define POLARSSL_CIPHER_BLOWFISH_CTR MBEDTLS_CIPHER_BLOWFISH_CTR -#define POLARSSL_CIPHER_BLOWFISH_ECB MBEDTLS_CIPHER_BLOWFISH_ECB -#define POLARSSL_CIPHER_CAMELLIA_128_CBC MBEDTLS_CIPHER_CAMELLIA_128_CBC -#define POLARSSL_CIPHER_CAMELLIA_128_CCM MBEDTLS_CIPHER_CAMELLIA_128_CCM -#define POLARSSL_CIPHER_CAMELLIA_128_CFB128 MBEDTLS_CIPHER_CAMELLIA_128_CFB128 -#define POLARSSL_CIPHER_CAMELLIA_128_CTR MBEDTLS_CIPHER_CAMELLIA_128_CTR -#define POLARSSL_CIPHER_CAMELLIA_128_ECB MBEDTLS_CIPHER_CAMELLIA_128_ECB -#define POLARSSL_CIPHER_CAMELLIA_128_GCM MBEDTLS_CIPHER_CAMELLIA_128_GCM -#define POLARSSL_CIPHER_CAMELLIA_192_CBC MBEDTLS_CIPHER_CAMELLIA_192_CBC -#define POLARSSL_CIPHER_CAMELLIA_192_CCM MBEDTLS_CIPHER_CAMELLIA_192_CCM -#define POLARSSL_CIPHER_CAMELLIA_192_CFB128 MBEDTLS_CIPHER_CAMELLIA_192_CFB128 -#define POLARSSL_CIPHER_CAMELLIA_192_CTR MBEDTLS_CIPHER_CAMELLIA_192_CTR -#define POLARSSL_CIPHER_CAMELLIA_192_ECB MBEDTLS_CIPHER_CAMELLIA_192_ECB -#define POLARSSL_CIPHER_CAMELLIA_192_GCM MBEDTLS_CIPHER_CAMELLIA_192_GCM -#define POLARSSL_CIPHER_CAMELLIA_256_CBC MBEDTLS_CIPHER_CAMELLIA_256_CBC -#define POLARSSL_CIPHER_CAMELLIA_256_CCM MBEDTLS_CIPHER_CAMELLIA_256_CCM -#define POLARSSL_CIPHER_CAMELLIA_256_CFB128 MBEDTLS_CIPHER_CAMELLIA_256_CFB128 -#define POLARSSL_CIPHER_CAMELLIA_256_CTR MBEDTLS_CIPHER_CAMELLIA_256_CTR -#define POLARSSL_CIPHER_CAMELLIA_256_ECB MBEDTLS_CIPHER_CAMELLIA_256_ECB -#define POLARSSL_CIPHER_CAMELLIA_256_GCM MBEDTLS_CIPHER_CAMELLIA_256_GCM -#define POLARSSL_CIPHER_DES_CBC MBEDTLS_CIPHER_DES_CBC -#define POLARSSL_CIPHER_DES_ECB MBEDTLS_CIPHER_DES_ECB -#define POLARSSL_CIPHER_DES_EDE3_CBC MBEDTLS_CIPHER_DES_EDE3_CBC -#define POLARSSL_CIPHER_DES_EDE3_ECB MBEDTLS_CIPHER_DES_EDE3_ECB -#define POLARSSL_CIPHER_DES_EDE_CBC MBEDTLS_CIPHER_DES_EDE_CBC -#define POLARSSL_CIPHER_DES_EDE_ECB MBEDTLS_CIPHER_DES_EDE_ECB -#define POLARSSL_CIPHER_H MBEDTLS_CIPHER_H -#define POLARSSL_CIPHER_ID_3DES MBEDTLS_CIPHER_ID_3DES -#define POLARSSL_CIPHER_ID_AES MBEDTLS_CIPHER_ID_AES -#define POLARSSL_CIPHER_ID_ARC4 MBEDTLS_CIPHER_ID_ARC4 -#define POLARSSL_CIPHER_ID_BLOWFISH MBEDTLS_CIPHER_ID_BLOWFISH -#define POLARSSL_CIPHER_ID_CAMELLIA MBEDTLS_CIPHER_ID_CAMELLIA -#define POLARSSL_CIPHER_ID_DES MBEDTLS_CIPHER_ID_DES -#define POLARSSL_CIPHER_ID_NONE MBEDTLS_CIPHER_ID_NONE -#define POLARSSL_CIPHER_ID_NULL MBEDTLS_CIPHER_ID_NULL -#define POLARSSL_CIPHER_MODE_AEAD MBEDTLS_CIPHER_MODE_AEAD -#define POLARSSL_CIPHER_MODE_STREAM MBEDTLS_CIPHER_MODE_STREAM -#define POLARSSL_CIPHER_MODE_WITH_PADDING MBEDTLS_CIPHER_MODE_WITH_PADDING -#define POLARSSL_CIPHER_NONE MBEDTLS_CIPHER_NONE -#define POLARSSL_CIPHER_NULL MBEDTLS_CIPHER_NULL -#define POLARSSL_CIPHER_VARIABLE_IV_LEN MBEDTLS_CIPHER_VARIABLE_IV_LEN -#define POLARSSL_CIPHER_VARIABLE_KEY_LEN MBEDTLS_CIPHER_VARIABLE_KEY_LEN -#define POLARSSL_CIPHER_WRAP_H MBEDTLS_CIPHER_WRAP_H -#define POLARSSL_CONFIG_H MBEDTLS_CONFIG_H -#define POLARSSL_CTR_DRBG_H MBEDTLS_CTR_DRBG_H -#define POLARSSL_DEBUG_H MBEDTLS_DEBUG_H -#define POLARSSL_DEBUG_LOG_FULL MBEDTLS_DEBUG_LOG_FULL -#define POLARSSL_DEBUG_LOG_RAW MBEDTLS_DEBUG_LOG_RAW -#define POLARSSL_DECRYPT MBEDTLS_DECRYPT -#define POLARSSL_DES_H MBEDTLS_DES_H -#define POLARSSL_DHM_H MBEDTLS_DHM_H -#define POLARSSL_DHM_RFC2409_MODP_1024_G MBEDTLS_DHM_RFC2409_MODP_1024_G -#define POLARSSL_DHM_RFC2409_MODP_1024_P MBEDTLS_DHM_RFC2409_MODP_1024_P -#define POLARSSL_DHM_RFC3526_MODP_2048_G MBEDTLS_DHM_RFC3526_MODP_2048_G -#define POLARSSL_DHM_RFC3526_MODP_2048_P MBEDTLS_DHM_RFC3526_MODP_2048_P -#define POLARSSL_DHM_RFC3526_MODP_3072_G MBEDTLS_DHM_RFC3526_MODP_3072_G -#define POLARSSL_DHM_RFC3526_MODP_3072_P MBEDTLS_DHM_RFC3526_MODP_3072_P -#define POLARSSL_DHM_RFC5114_MODP_1024_G MBEDTLS_DHM_RFC5114_MODP_1024_G -#define POLARSSL_DHM_RFC5114_MODP_1024_P MBEDTLS_DHM_RFC5114_MODP_1024_P -#define POLARSSL_DHM_RFC5114_MODP_2048_G MBEDTLS_DHM_RFC5114_MODP_2048_G -#define POLARSSL_DHM_RFC5114_MODP_2048_P MBEDTLS_DHM_RFC5114_MODP_2048_P -#define POLARSSL_ECDH_H MBEDTLS_ECDH_H -#define POLARSSL_ECDH_OURS MBEDTLS_ECDH_OURS -#define POLARSSL_ECDH_THEIRS MBEDTLS_ECDH_THEIRS -#define POLARSSL_ECDSA_H MBEDTLS_ECDSA_H -#define POLARSSL_ECP_DP_BP256R1 MBEDTLS_ECP_DP_BP256R1 -#define POLARSSL_ECP_DP_BP384R1 MBEDTLS_ECP_DP_BP384R1 -#define POLARSSL_ECP_DP_BP512R1 MBEDTLS_ECP_DP_BP512R1 -#define POLARSSL_ECP_DP_M255 MBEDTLS_ECP_DP_CURVE25519 -#define POLARSSL_ECP_DP_MAX MBEDTLS_ECP_DP_MAX -#define POLARSSL_ECP_DP_NONE MBEDTLS_ECP_DP_NONE -#define POLARSSL_ECP_DP_SECP192K1 MBEDTLS_ECP_DP_SECP192K1 -#define POLARSSL_ECP_DP_SECP192R1 MBEDTLS_ECP_DP_SECP192R1 -#define POLARSSL_ECP_DP_SECP224K1 MBEDTLS_ECP_DP_SECP224K1 -#define POLARSSL_ECP_DP_SECP224R1 MBEDTLS_ECP_DP_SECP224R1 -#define POLARSSL_ECP_DP_SECP256K1 MBEDTLS_ECP_DP_SECP256K1 -#define POLARSSL_ECP_DP_SECP256R1 MBEDTLS_ECP_DP_SECP256R1 -#define POLARSSL_ECP_DP_SECP384R1 MBEDTLS_ECP_DP_SECP384R1 -#define POLARSSL_ECP_DP_SECP521R1 MBEDTLS_ECP_DP_SECP521R1 -#define POLARSSL_ECP_H MBEDTLS_ECP_H -#define POLARSSL_ECP_MAX_BYTES MBEDTLS_ECP_MAX_BYTES -#define POLARSSL_ECP_MAX_PT_LEN MBEDTLS_ECP_MAX_PT_LEN -#define POLARSSL_ECP_PF_COMPRESSED MBEDTLS_ECP_PF_COMPRESSED -#define POLARSSL_ECP_PF_UNCOMPRESSED MBEDTLS_ECP_PF_UNCOMPRESSED -#define POLARSSL_ECP_TLS_NAMED_CURVE MBEDTLS_ECP_TLS_NAMED_CURVE -#define POLARSSL_ENCRYPT MBEDTLS_ENCRYPT -#define POLARSSL_ENTROPY_H MBEDTLS_ENTROPY_H -#define POLARSSL_ENTROPY_POLL_H MBEDTLS_ENTROPY_POLL_H -#define POLARSSL_ENTROPY_SHA256_ACCUMULATOR MBEDTLS_ENTROPY_SHA256_ACCUMULATOR -#define POLARSSL_ENTROPY_SHA512_ACCUMULATOR MBEDTLS_ENTROPY_SHA512_ACCUMULATOR -#define POLARSSL_ERROR_H MBEDTLS_ERROR_H -#define POLARSSL_ERR_AES_INVALID_INPUT_LENGTH MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH -#define POLARSSL_ERR_AES_INVALID_KEY_LENGTH MBEDTLS_ERR_AES_INVALID_KEY_LENGTH -#define POLARSSL_ERR_ASN1_BUF_TOO_SMALL MBEDTLS_ERR_ASN1_BUF_TOO_SMALL -#define POLARSSL_ERR_ASN1_INVALID_DATA MBEDTLS_ERR_ASN1_INVALID_DATA -#define POLARSSL_ERR_ASN1_INVALID_LENGTH MBEDTLS_ERR_ASN1_INVALID_LENGTH -#define POLARSSL_ERR_ASN1_LENGTH_MISMATCH MBEDTLS_ERR_ASN1_LENGTH_MISMATCH -#define POLARSSL_ERR_ASN1_MALLOC_FAILED MBEDTLS_ERR_ASN1_ALLOC_FAILED -#define POLARSSL_ERR_ASN1_OUT_OF_DATA MBEDTLS_ERR_ASN1_OUT_OF_DATA -#define POLARSSL_ERR_ASN1_UNEXPECTED_TAG MBEDTLS_ERR_ASN1_UNEXPECTED_TAG -#define POLARSSL_ERR_BASE64_BUFFER_TOO_SMALL MBEDTLS_ERR_BASE64_BUFFER_TOO_SMALL -#define POLARSSL_ERR_BASE64_INVALID_CHARACTER MBEDTLS_ERR_BASE64_INVALID_CHARACTER -#define POLARSSL_ERR_BLOWFISH_INVALID_INPUT_LENGTH MBEDTLS_ERR_BLOWFISH_INVALID_INPUT_LENGTH -#define POLARSSL_ERR_BLOWFISH_INVALID_KEY_LENGTH MBEDTLS_ERR_BLOWFISH_INVALID_KEY_LENGTH -#define POLARSSL_ERR_CAMELLIA_INVALID_INPUT_LENGTH MBEDTLS_ERR_CAMELLIA_INVALID_INPUT_LENGTH -#define POLARSSL_ERR_CAMELLIA_INVALID_KEY_LENGTH MBEDTLS_ERR_CAMELLIA_INVALID_KEY_LENGTH -#define POLARSSL_ERR_CCM_AUTH_FAILED MBEDTLS_ERR_CCM_AUTH_FAILED -#define POLARSSL_ERR_CCM_BAD_INPUT MBEDTLS_ERR_CCM_BAD_INPUT -#define POLARSSL_ERR_CIPHER_ALLOC_FAILED MBEDTLS_ERR_CIPHER_ALLOC_FAILED -#define POLARSSL_ERR_CIPHER_AUTH_FAILED MBEDTLS_ERR_CIPHER_AUTH_FAILED -#define POLARSSL_ERR_CIPHER_BAD_INPUT_DATA MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA -#define POLARSSL_ERR_CIPHER_FEATURE_UNAVAILABLE MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE -#define POLARSSL_ERR_CIPHER_FULL_BLOCK_EXPECTED MBEDTLS_ERR_CIPHER_FULL_BLOCK_EXPECTED -#define POLARSSL_ERR_CIPHER_INVALID_PADDING MBEDTLS_ERR_CIPHER_INVALID_PADDING -#define POLARSSL_ERR_CTR_DRBG_ENTROPY_SOURCE_FAILED MBEDTLS_ERR_CTR_DRBG_ENTROPY_SOURCE_FAILED -#define POLARSSL_ERR_CTR_DRBG_FILE_IO_ERROR MBEDTLS_ERR_CTR_DRBG_FILE_IO_ERROR -#define POLARSSL_ERR_CTR_DRBG_INPUT_TOO_BIG MBEDTLS_ERR_CTR_DRBG_INPUT_TOO_BIG -#define POLARSSL_ERR_CTR_DRBG_REQUEST_TOO_BIG MBEDTLS_ERR_CTR_DRBG_REQUEST_TOO_BIG -#define POLARSSL_ERR_DES_INVALID_INPUT_LENGTH MBEDTLS_ERR_DES_INVALID_INPUT_LENGTH -#define POLARSSL_ERR_DHM_BAD_INPUT_DATA MBEDTLS_ERR_DHM_BAD_INPUT_DATA -#define POLARSSL_ERR_DHM_CALC_SECRET_FAILED MBEDTLS_ERR_DHM_CALC_SECRET_FAILED -#define POLARSSL_ERR_DHM_FILE_IO_ERROR MBEDTLS_ERR_DHM_FILE_IO_ERROR -#define POLARSSL_ERR_DHM_INVALID_FORMAT MBEDTLS_ERR_DHM_INVALID_FORMAT -#define POLARSSL_ERR_DHM_MAKE_PARAMS_FAILED MBEDTLS_ERR_DHM_MAKE_PARAMS_FAILED -#define POLARSSL_ERR_DHM_MAKE_PUBLIC_FAILED MBEDTLS_ERR_DHM_MAKE_PUBLIC_FAILED -#define POLARSSL_ERR_DHM_MALLOC_FAILED MBEDTLS_ERR_DHM_ALLOC_FAILED -#define POLARSSL_ERR_DHM_READ_PARAMS_FAILED MBEDTLS_ERR_DHM_READ_PARAMS_FAILED -#define POLARSSL_ERR_DHM_READ_PUBLIC_FAILED MBEDTLS_ERR_DHM_READ_PUBLIC_FAILED -#define POLARSSL_ERR_ECP_BAD_INPUT_DATA MBEDTLS_ERR_ECP_BAD_INPUT_DATA -#define POLARSSL_ERR_ECP_BUFFER_TOO_SMALL MBEDTLS_ERR_ECP_BUFFER_TOO_SMALL -#define POLARSSL_ERR_ECP_FEATURE_UNAVAILABLE MBEDTLS_ERR_ECP_FEATURE_UNAVAILABLE -#define POLARSSL_ERR_ECP_INVALID_KEY MBEDTLS_ERR_ECP_INVALID_KEY -#define POLARSSL_ERR_ECP_MALLOC_FAILED MBEDTLS_ERR_ECP_ALLOC_FAILED -#define POLARSSL_ERR_ECP_RANDOM_FAILED MBEDTLS_ERR_ECP_RANDOM_FAILED -#define POLARSSL_ERR_ECP_SIG_LEN_MISMATCH MBEDTLS_ERR_ECP_SIG_LEN_MISMATCH -#define POLARSSL_ERR_ECP_VERIFY_FAILED MBEDTLS_ERR_ECP_VERIFY_FAILED -#define POLARSSL_ERR_ENTROPY_FILE_IO_ERROR MBEDTLS_ERR_ENTROPY_FILE_IO_ERROR -#define POLARSSL_ERR_ENTROPY_MAX_SOURCES MBEDTLS_ERR_ENTROPY_MAX_SOURCES -#define POLARSSL_ERR_ENTROPY_NO_SOURCES_DEFINED MBEDTLS_ERR_ENTROPY_NO_SOURCES_DEFINED -#define POLARSSL_ERR_ENTROPY_SOURCE_FAILED MBEDTLS_ERR_ENTROPY_SOURCE_FAILED -#define POLARSSL_ERR_GCM_AUTH_FAILED MBEDTLS_ERR_GCM_AUTH_FAILED -#define POLARSSL_ERR_GCM_BAD_INPUT MBEDTLS_ERR_GCM_BAD_INPUT -#define POLARSSL_ERR_HMAC_DRBG_ENTROPY_SOURCE_FAILED MBEDTLS_ERR_HMAC_DRBG_ENTROPY_SOURCE_FAILED -#define POLARSSL_ERR_HMAC_DRBG_FILE_IO_ERROR MBEDTLS_ERR_HMAC_DRBG_FILE_IO_ERROR -#define POLARSSL_ERR_HMAC_DRBG_INPUT_TOO_BIG MBEDTLS_ERR_HMAC_DRBG_INPUT_TOO_BIG -#define POLARSSL_ERR_HMAC_DRBG_REQUEST_TOO_BIG MBEDTLS_ERR_HMAC_DRBG_REQUEST_TOO_BIG -#define POLARSSL_ERR_MD2_FILE_IO_ERROR MBEDTLS_ERR_MD2_FILE_IO_ERROR -#define POLARSSL_ERR_MD4_FILE_IO_ERROR MBEDTLS_ERR_MD4_FILE_IO_ERROR -#define POLARSSL_ERR_MD5_FILE_IO_ERROR MBEDTLS_ERR_MD5_FILE_IO_ERROR -#define POLARSSL_ERR_MD_ALLOC_FAILED MBEDTLS_ERR_MD_ALLOC_FAILED -#define POLARSSL_ERR_MD_BAD_INPUT_DATA MBEDTLS_ERR_MD_BAD_INPUT_DATA -#define POLARSSL_ERR_MD_FEATURE_UNAVAILABLE MBEDTLS_ERR_MD_FEATURE_UNAVAILABLE -#define POLARSSL_ERR_MD_FILE_IO_ERROR MBEDTLS_ERR_MD_FILE_IO_ERROR -#define POLARSSL_ERR_MPI_BAD_INPUT_DATA MBEDTLS_ERR_MPI_BAD_INPUT_DATA -#define POLARSSL_ERR_MPI_BUFFER_TOO_SMALL MBEDTLS_ERR_MPI_BUFFER_TOO_SMALL -#define POLARSSL_ERR_MPI_DIVISION_BY_ZERO MBEDTLS_ERR_MPI_DIVISION_BY_ZERO -#define POLARSSL_ERR_MPI_FILE_IO_ERROR MBEDTLS_ERR_MPI_FILE_IO_ERROR -#define POLARSSL_ERR_MPI_INVALID_CHARACTER MBEDTLS_ERR_MPI_INVALID_CHARACTER -#define POLARSSL_ERR_MPI_MALLOC_FAILED MBEDTLS_ERR_MPI_ALLOC_FAILED -#define POLARSSL_ERR_MPI_NEGATIVE_VALUE MBEDTLS_ERR_MPI_NEGATIVE_VALUE -#define POLARSSL_ERR_MPI_NOT_ACCEPTABLE MBEDTLS_ERR_MPI_NOT_ACCEPTABLE -#define POLARSSL_ERR_NET_ACCEPT_FAILED MBEDTLS_ERR_NET_ACCEPT_FAILED -#define POLARSSL_ERR_NET_BIND_FAILED MBEDTLS_ERR_NET_BIND_FAILED -#define POLARSSL_ERR_NET_CONNECT_FAILED MBEDTLS_ERR_NET_CONNECT_FAILED -#define POLARSSL_ERR_NET_CONN_RESET MBEDTLS_ERR_NET_CONN_RESET -#define POLARSSL_ERR_NET_LISTEN_FAILED MBEDTLS_ERR_NET_LISTEN_FAILED -#define POLARSSL_ERR_NET_RECV_FAILED MBEDTLS_ERR_NET_RECV_FAILED -#define POLARSSL_ERR_NET_SEND_FAILED MBEDTLS_ERR_NET_SEND_FAILED -#define POLARSSL_ERR_NET_SOCKET_FAILED MBEDTLS_ERR_NET_SOCKET_FAILED -#define POLARSSL_ERR_NET_TIMEOUT MBEDTLS_ERR_SSL_TIMEOUT -#define POLARSSL_ERR_NET_UNKNOWN_HOST MBEDTLS_ERR_NET_UNKNOWN_HOST -#define POLARSSL_ERR_NET_WANT_READ MBEDTLS_ERR_SSL_WANT_READ -#define POLARSSL_ERR_NET_WANT_WRITE MBEDTLS_ERR_SSL_WANT_WRITE -#define POLARSSL_ERR_OID_BUF_TOO_SMALL MBEDTLS_ERR_OID_BUF_TOO_SMALL -#define POLARSSL_ERR_OID_NOT_FOUND MBEDTLS_ERR_OID_NOT_FOUND -#define POLARSSL_ERR_PADLOCK_DATA_MISALIGNED MBEDTLS_ERR_PADLOCK_DATA_MISALIGNED -#define POLARSSL_ERR_PBKDF2_BAD_INPUT_DATA MBEDTLS_ERR_PBKDF2_BAD_INPUT_DATA -#define POLARSSL_ERR_PEM_BAD_INPUT_DATA MBEDTLS_ERR_PEM_BAD_INPUT_DATA -#define POLARSSL_ERR_PEM_FEATURE_UNAVAILABLE MBEDTLS_ERR_PEM_FEATURE_UNAVAILABLE -#define POLARSSL_ERR_PEM_INVALID_DATA MBEDTLS_ERR_PEM_INVALID_DATA -#define POLARSSL_ERR_PEM_INVALID_ENC_IV MBEDTLS_ERR_PEM_INVALID_ENC_IV -#define POLARSSL_ERR_PEM_MALLOC_FAILED MBEDTLS_ERR_PEM_ALLOC_FAILED -#define POLARSSL_ERR_PEM_NO_HEADER_FOOTER_PRESENT MBEDTLS_ERR_PEM_NO_HEADER_FOOTER_PRESENT -#define POLARSSL_ERR_PEM_PASSWORD_MISMATCH MBEDTLS_ERR_PEM_PASSWORD_MISMATCH -#define POLARSSL_ERR_PEM_PASSWORD_REQUIRED MBEDTLS_ERR_PEM_PASSWORD_REQUIRED -#define POLARSSL_ERR_PEM_UNKNOWN_ENC_ALG MBEDTLS_ERR_PEM_UNKNOWN_ENC_ALG -#define POLARSSL_ERR_PKCS12_BAD_INPUT_DATA MBEDTLS_ERR_PKCS12_BAD_INPUT_DATA -#define POLARSSL_ERR_PKCS12_FEATURE_UNAVAILABLE MBEDTLS_ERR_PKCS12_FEATURE_UNAVAILABLE -#define POLARSSL_ERR_PKCS12_PASSWORD_MISMATCH MBEDTLS_ERR_PKCS12_PASSWORD_MISMATCH -#define POLARSSL_ERR_PKCS12_PBE_INVALID_FORMAT MBEDTLS_ERR_PKCS12_PBE_INVALID_FORMAT -#define POLARSSL_ERR_PKCS5_BAD_INPUT_DATA MBEDTLS_ERR_PKCS5_BAD_INPUT_DATA -#define POLARSSL_ERR_PKCS5_FEATURE_UNAVAILABLE MBEDTLS_ERR_PKCS5_FEATURE_UNAVAILABLE -#define POLARSSL_ERR_PKCS5_INVALID_FORMAT MBEDTLS_ERR_PKCS5_INVALID_FORMAT -#define POLARSSL_ERR_PKCS5_PASSWORD_MISMATCH MBEDTLS_ERR_PKCS5_PASSWORD_MISMATCH -#define POLARSSL_ERR_PK_BAD_INPUT_DATA MBEDTLS_ERR_PK_BAD_INPUT_DATA -#define POLARSSL_ERR_PK_FEATURE_UNAVAILABLE MBEDTLS_ERR_PK_FEATURE_UNAVAILABLE -#define POLARSSL_ERR_PK_FILE_IO_ERROR MBEDTLS_ERR_PK_FILE_IO_ERROR -#define POLARSSL_ERR_PK_INVALID_ALG MBEDTLS_ERR_PK_INVALID_ALG -#define POLARSSL_ERR_PK_INVALID_PUBKEY MBEDTLS_ERR_PK_INVALID_PUBKEY -#define POLARSSL_ERR_PK_KEY_INVALID_FORMAT MBEDTLS_ERR_PK_KEY_INVALID_FORMAT -#define POLARSSL_ERR_PK_KEY_INVALID_VERSION MBEDTLS_ERR_PK_KEY_INVALID_VERSION -#define POLARSSL_ERR_PK_MALLOC_FAILED MBEDTLS_ERR_PK_ALLOC_FAILED -#define POLARSSL_ERR_PK_PASSWORD_MISMATCH MBEDTLS_ERR_PK_PASSWORD_MISMATCH -#define POLARSSL_ERR_PK_PASSWORD_REQUIRED MBEDTLS_ERR_PK_PASSWORD_REQUIRED -#define POLARSSL_ERR_PK_SIG_LEN_MISMATCH MBEDTLS_ERR_PK_SIG_LEN_MISMATCH -#define POLARSSL_ERR_PK_TYPE_MISMATCH MBEDTLS_ERR_PK_TYPE_MISMATCH -#define POLARSSL_ERR_PK_UNKNOWN_NAMED_CURVE MBEDTLS_ERR_PK_UNKNOWN_NAMED_CURVE -#define POLARSSL_ERR_PK_UNKNOWN_PK_ALG MBEDTLS_ERR_PK_UNKNOWN_PK_ALG -#define POLARSSL_ERR_RIPEMD160_FILE_IO_ERROR MBEDTLS_ERR_RIPEMD160_FILE_IO_ERROR -#define POLARSSL_ERR_RSA_BAD_INPUT_DATA MBEDTLS_ERR_RSA_BAD_INPUT_DATA -#define POLARSSL_ERR_RSA_INVALID_PADDING MBEDTLS_ERR_RSA_INVALID_PADDING -#define POLARSSL_ERR_RSA_KEY_CHECK_FAILED MBEDTLS_ERR_RSA_KEY_CHECK_FAILED -#define POLARSSL_ERR_RSA_KEY_GEN_FAILED MBEDTLS_ERR_RSA_KEY_GEN_FAILED -#define POLARSSL_ERR_RSA_OUTPUT_TOO_LARGE MBEDTLS_ERR_RSA_OUTPUT_TOO_LARGE -#define POLARSSL_ERR_RSA_PRIVATE_FAILED MBEDTLS_ERR_RSA_PRIVATE_FAILED -#define POLARSSL_ERR_RSA_PUBLIC_FAILED MBEDTLS_ERR_RSA_PUBLIC_FAILED -#define POLARSSL_ERR_RSA_RNG_FAILED MBEDTLS_ERR_RSA_RNG_FAILED -#define POLARSSL_ERR_RSA_VERIFY_FAILED MBEDTLS_ERR_RSA_VERIFY_FAILED -#define POLARSSL_ERR_SHA1_FILE_IO_ERROR MBEDTLS_ERR_SHA1_FILE_IO_ERROR -#define POLARSSL_ERR_SHA256_FILE_IO_ERROR MBEDTLS_ERR_SHA256_FILE_IO_ERROR -#define POLARSSL_ERR_SHA512_FILE_IO_ERROR MBEDTLS_ERR_SHA512_FILE_IO_ERROR -#define POLARSSL_ERR_SSL_BAD_HS_CERTIFICATE MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE -#define POLARSSL_ERR_SSL_BAD_HS_CERTIFICATE_REQUEST MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE_REQUEST -#define POLARSSL_ERR_SSL_BAD_HS_CERTIFICATE_VERIFY MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE_VERIFY -#define POLARSSL_ERR_SSL_BAD_HS_CHANGE_CIPHER_SPEC MBEDTLS_ERR_SSL_BAD_HS_CHANGE_CIPHER_SPEC -#define POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO -#define POLARSSL_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE -#define POLARSSL_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE_CS MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE_CS -#define POLARSSL_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE_RP MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE_RP -#define POLARSSL_ERR_SSL_BAD_HS_FINISHED MBEDTLS_ERR_SSL_BAD_HS_FINISHED -#define POLARSSL_ERR_SSL_BAD_HS_NEW_SESSION_TICKET MBEDTLS_ERR_SSL_BAD_HS_NEW_SESSION_TICKET -#define POLARSSL_ERR_SSL_BAD_HS_PROTOCOL_VERSION MBEDTLS_ERR_SSL_BAD_HS_PROTOCOL_VERSION -#define POLARSSL_ERR_SSL_BAD_HS_SERVER_HELLO MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO -#define POLARSSL_ERR_SSL_BAD_HS_SERVER_HELLO_DONE MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO_DONE -#define POLARSSL_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE -#define POLARSSL_ERR_SSL_BAD_INPUT_DATA MBEDTLS_ERR_SSL_BAD_INPUT_DATA -#define POLARSSL_ERR_SSL_BUFFER_TOO_SMALL MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL -#define POLARSSL_ERR_SSL_CA_CHAIN_REQUIRED MBEDTLS_ERR_SSL_CA_CHAIN_REQUIRED -#define POLARSSL_ERR_SSL_CERTIFICATE_REQUIRED MBEDTLS_ERR_SSL_CERTIFICATE_REQUIRED -#define POLARSSL_ERR_SSL_CERTIFICATE_TOO_LARGE MBEDTLS_ERR_SSL_CERTIFICATE_TOO_LARGE -#define POLARSSL_ERR_SSL_COMPRESSION_FAILED MBEDTLS_ERR_SSL_COMPRESSION_FAILED -#define POLARSSL_ERR_SSL_CONN_EOF MBEDTLS_ERR_SSL_CONN_EOF -#define POLARSSL_ERR_SSL_COUNTER_WRAPPING MBEDTLS_ERR_SSL_COUNTER_WRAPPING -#define POLARSSL_ERR_SSL_FATAL_ALERT_MESSAGE MBEDTLS_ERR_SSL_FATAL_ALERT_MESSAGE -#define POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE -#define POLARSSL_ERR_SSL_HELLO_VERIFY_REQUIRED MBEDTLS_ERR_SSL_HELLO_VERIFY_REQUIRED -#define POLARSSL_ERR_SSL_HW_ACCEL_FAILED MBEDTLS_ERR_SSL_HW_ACCEL_FAILED -#define POLARSSL_ERR_SSL_HW_ACCEL_FALLTHROUGH MBEDTLS_ERR_SSL_HW_ACCEL_FALLTHROUGH -#define POLARSSL_ERR_SSL_INTERNAL_ERROR MBEDTLS_ERR_SSL_INTERNAL_ERROR -#define POLARSSL_ERR_SSL_INVALID_MAC MBEDTLS_ERR_SSL_INVALID_MAC -#define POLARSSL_ERR_SSL_INVALID_RECORD MBEDTLS_ERR_SSL_INVALID_RECORD -#define POLARSSL_ERR_SSL_MALLOC_FAILED MBEDTLS_ERR_SSL_ALLOC_FAILED -#define POLARSSL_ERR_SSL_NO_CIPHER_CHOSEN MBEDTLS_ERR_SSL_NO_CIPHER_CHOSEN -#define POLARSSL_ERR_SSL_NO_CLIENT_CERTIFICATE MBEDTLS_ERR_SSL_NO_CLIENT_CERTIFICATE -#define POLARSSL_ERR_SSL_NO_RNG MBEDTLS_ERR_SSL_NO_RNG -#define POLARSSL_ERR_SSL_NO_USABLE_CIPHERSUITE MBEDTLS_ERR_SSL_NO_USABLE_CIPHERSUITE -#define POLARSSL_ERR_SSL_PEER_CLOSE_NOTIFY MBEDTLS_ERR_SSL_PEER_CLOSE_NOTIFY -#define POLARSSL_ERR_SSL_PEER_VERIFY_FAILED MBEDTLS_ERR_SSL_PEER_VERIFY_FAILED -#define POLARSSL_ERR_SSL_PK_TYPE_MISMATCH MBEDTLS_ERR_SSL_PK_TYPE_MISMATCH -#define POLARSSL_ERR_SSL_PRIVATE_KEY_REQUIRED MBEDTLS_ERR_SSL_PRIVATE_KEY_REQUIRED -#define POLARSSL_ERR_SSL_SESSION_TICKET_EXPIRED MBEDTLS_ERR_SSL_SESSION_TICKET_EXPIRED -#define POLARSSL_ERR_SSL_UNEXPECTED_MESSAGE MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE -#define POLARSSL_ERR_SSL_UNKNOWN_CIPHER MBEDTLS_ERR_SSL_UNKNOWN_CIPHER -#define POLARSSL_ERR_SSL_UNKNOWN_IDENTITY MBEDTLS_ERR_SSL_UNKNOWN_IDENTITY -#define POLARSSL_ERR_SSL_WAITING_SERVER_HELLO_RENEGO MBEDTLS_ERR_SSL_WAITING_SERVER_HELLO_RENEGO -#define POLARSSL_ERR_THREADING_BAD_INPUT_DATA MBEDTLS_ERR_THREADING_BAD_INPUT_DATA -#define POLARSSL_ERR_THREADING_FEATURE_UNAVAILABLE MBEDTLS_ERR_THREADING_FEATURE_UNAVAILABLE -#define POLARSSL_ERR_THREADING_MUTEX_ERROR MBEDTLS_ERR_THREADING_MUTEX_ERROR -#define POLARSSL_ERR_X509_BAD_INPUT_DATA MBEDTLS_ERR_X509_BAD_INPUT_DATA -#define POLARSSL_ERR_X509_CERT_UNKNOWN_FORMAT MBEDTLS_ERR_X509_CERT_UNKNOWN_FORMAT -#define POLARSSL_ERR_X509_CERT_VERIFY_FAILED MBEDTLS_ERR_X509_CERT_VERIFY_FAILED -#define POLARSSL_ERR_X509_FEATURE_UNAVAILABLE MBEDTLS_ERR_X509_FEATURE_UNAVAILABLE -#define POLARSSL_ERR_X509_FILE_IO_ERROR MBEDTLS_ERR_X509_FILE_IO_ERROR -#define POLARSSL_ERR_X509_INVALID_ALG MBEDTLS_ERR_X509_INVALID_ALG -#define POLARSSL_ERR_X509_INVALID_DATE MBEDTLS_ERR_X509_INVALID_DATE -#define POLARSSL_ERR_X509_INVALID_EXTENSIONS MBEDTLS_ERR_X509_INVALID_EXTENSIONS -#define POLARSSL_ERR_X509_INVALID_FORMAT MBEDTLS_ERR_X509_INVALID_FORMAT -#define POLARSSL_ERR_X509_INVALID_NAME MBEDTLS_ERR_X509_INVALID_NAME -#define POLARSSL_ERR_X509_INVALID_SERIAL MBEDTLS_ERR_X509_INVALID_SERIAL -#define POLARSSL_ERR_X509_INVALID_SIGNATURE MBEDTLS_ERR_X509_INVALID_SIGNATURE -#define POLARSSL_ERR_X509_INVALID_VERSION MBEDTLS_ERR_X509_INVALID_VERSION -#define POLARSSL_ERR_X509_MALLOC_FAILED MBEDTLS_ERR_X509_ALLOC_FAILED -#define POLARSSL_ERR_X509_SIG_MISMATCH MBEDTLS_ERR_X509_SIG_MISMATCH -#define POLARSSL_ERR_X509_UNKNOWN_OID MBEDTLS_ERR_X509_UNKNOWN_OID -#define POLARSSL_ERR_X509_UNKNOWN_SIG_ALG MBEDTLS_ERR_X509_UNKNOWN_SIG_ALG -#define POLARSSL_ERR_X509_UNKNOWN_VERSION MBEDTLS_ERR_X509_UNKNOWN_VERSION -#define POLARSSL_ERR_XTEA_INVALID_INPUT_LENGTH MBEDTLS_ERR_XTEA_INVALID_INPUT_LENGTH -#define POLARSSL_GCM_H MBEDTLS_GCM_H -#define POLARSSL_HAVEGE_H MBEDTLS_HAVEGE_H -#define POLARSSL_HAVE_INT32 MBEDTLS_HAVE_INT32 -#define POLARSSL_HAVE_INT64 MBEDTLS_HAVE_INT64 -#define POLARSSL_HAVE_UDBL MBEDTLS_HAVE_UDBL -#define POLARSSL_HAVE_X86 MBEDTLS_HAVE_X86 -#define POLARSSL_HAVE_X86_64 MBEDTLS_HAVE_X86_64 -#define POLARSSL_HMAC_DRBG_H MBEDTLS_HMAC_DRBG_H -#define POLARSSL_HMAC_DRBG_PR_OFF MBEDTLS_HMAC_DRBG_PR_OFF -#define POLARSSL_HMAC_DRBG_PR_ON MBEDTLS_HMAC_DRBG_PR_ON -#define POLARSSL_KEY_EXCHANGE_DHE_PSK MBEDTLS_KEY_EXCHANGE_DHE_PSK -#define POLARSSL_KEY_EXCHANGE_DHE_RSA MBEDTLS_KEY_EXCHANGE_DHE_RSA -#define POLARSSL_KEY_EXCHANGE_ECDHE_ECDSA MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA -#define POLARSSL_KEY_EXCHANGE_ECDHE_PSK MBEDTLS_KEY_EXCHANGE_ECDHE_PSK -#define POLARSSL_KEY_EXCHANGE_ECDHE_RSA MBEDTLS_KEY_EXCHANGE_ECDHE_RSA -#define POLARSSL_KEY_EXCHANGE_ECDH_ECDSA MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA -#define POLARSSL_KEY_EXCHANGE_ECDH_RSA MBEDTLS_KEY_EXCHANGE_ECDH_RSA -#define POLARSSL_KEY_EXCHANGE_NONE MBEDTLS_KEY_EXCHANGE_NONE -#define POLARSSL_KEY_EXCHANGE_PSK MBEDTLS_KEY_EXCHANGE_PSK -#define POLARSSL_KEY_EXCHANGE_RSA MBEDTLS_KEY_EXCHANGE_RSA -#define POLARSSL_KEY_EXCHANGE_RSA_PSK MBEDTLS_KEY_EXCHANGE_RSA_PSK -#define POLARSSL_KEY_EXCHANGE__SOME__ECDHE_ENABLED MBEDTLS_KEY_EXCHANGE__SOME__ECDHE_ENABLED -#define POLARSSL_KEY_EXCHANGE__SOME__PSK_ENABLED MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED -#define POLARSSL_KEY_EXCHANGE__WITH_CERT__ENABLED MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED -#define POLARSSL_KEY_LENGTH_DES MBEDTLS_KEY_LENGTH_DES -#define POLARSSL_KEY_LENGTH_DES_EDE MBEDTLS_KEY_LENGTH_DES_EDE -#define POLARSSL_KEY_LENGTH_DES_EDE3 MBEDTLS_KEY_LENGTH_DES_EDE3 -#define POLARSSL_KEY_LENGTH_NONE MBEDTLS_KEY_LENGTH_NONE -#define POLARSSL_MAX_BLOCK_LENGTH MBEDTLS_MAX_BLOCK_LENGTH -#define POLARSSL_MAX_IV_LENGTH MBEDTLS_MAX_IV_LENGTH -#define POLARSSL_MD2_H MBEDTLS_MD2_H -#define POLARSSL_MD4_H MBEDTLS_MD4_H -#define POLARSSL_MD5_H MBEDTLS_MD5_H -#define POLARSSL_MD_H MBEDTLS_MD_H -#define POLARSSL_MD_MAX_SIZE MBEDTLS_MD_MAX_SIZE -#define POLARSSL_MD_MD2 MBEDTLS_MD_MD2 -#define POLARSSL_MD_MD4 MBEDTLS_MD_MD4 -#define POLARSSL_MD_MD5 MBEDTLS_MD_MD5 -#define POLARSSL_MD_NONE MBEDTLS_MD_NONE -#define POLARSSL_MD_RIPEMD160 MBEDTLS_MD_RIPEMD160 -#define POLARSSL_MD_SHA1 MBEDTLS_MD_SHA1 -#define POLARSSL_MD_SHA224 MBEDTLS_MD_SHA224 -#define POLARSSL_MD_SHA256 MBEDTLS_MD_SHA256 -#define POLARSSL_MD_SHA384 MBEDTLS_MD_SHA384 -#define POLARSSL_MD_SHA512 MBEDTLS_MD_SHA512 -#define POLARSSL_MD_WRAP_H MBEDTLS_MD_WRAP_H -#define POLARSSL_MEMORY_BUFFER_ALLOC_H MBEDTLS_MEMORY_BUFFER_ALLOC_H -#define POLARSSL_MEMORY_H MBEDTLS_MEMORY_H -#define POLARSSL_MODE_CBC MBEDTLS_MODE_CBC -#define POLARSSL_MODE_CCM MBEDTLS_MODE_CCM -#define POLARSSL_MODE_CFB MBEDTLS_MODE_CFB -#define POLARSSL_MODE_CTR MBEDTLS_MODE_CTR -#define POLARSSL_MODE_ECB MBEDTLS_MODE_ECB -#define POLARSSL_MODE_GCM MBEDTLS_MODE_GCM -#define POLARSSL_MODE_NONE MBEDTLS_MODE_NONE -#define POLARSSL_MODE_OFB MBEDTLS_MODE_OFB -#define POLARSSL_MODE_STREAM MBEDTLS_MODE_STREAM -#define POLARSSL_MPI_MAX_BITS MBEDTLS_MPI_MAX_BITS -#define POLARSSL_MPI_MAX_BITS_SCALE100 MBEDTLS_MPI_MAX_BITS_SCALE100 -#define POLARSSL_MPI_MAX_LIMBS MBEDTLS_MPI_MAX_LIMBS -#define POLARSSL_MPI_RW_BUFFER_SIZE MBEDTLS_MPI_RW_BUFFER_SIZE -#define POLARSSL_NET_H MBEDTLS_NET_H -#define POLARSSL_NET_LISTEN_BACKLOG MBEDTLS_NET_LISTEN_BACKLOG -#define POLARSSL_OID_H MBEDTLS_OID_H -#define POLARSSL_OPERATION_NONE MBEDTLS_OPERATION_NONE -#define POLARSSL_PADDING_NONE MBEDTLS_PADDING_NONE -#define POLARSSL_PADDING_ONE_AND_ZEROS MBEDTLS_PADDING_ONE_AND_ZEROS -#define POLARSSL_PADDING_PKCS7 MBEDTLS_PADDING_PKCS7 -#define POLARSSL_PADDING_ZEROS MBEDTLS_PADDING_ZEROS -#define POLARSSL_PADDING_ZEROS_AND_LEN MBEDTLS_PADDING_ZEROS_AND_LEN -#define POLARSSL_PADLOCK_H MBEDTLS_PADLOCK_H -#define POLARSSL_PBKDF2_H MBEDTLS_PBKDF2_H -#define POLARSSL_PEM_H MBEDTLS_PEM_H -#define POLARSSL_PKCS11_H MBEDTLS_PKCS11_H -#define POLARSSL_PKCS12_H MBEDTLS_PKCS12_H -#define POLARSSL_PKCS5_H MBEDTLS_PKCS5_H -#define POLARSSL_PK_DEBUG_ECP MBEDTLS_PK_DEBUG_ECP -#define POLARSSL_PK_DEBUG_MAX_ITEMS MBEDTLS_PK_DEBUG_MAX_ITEMS -#define POLARSSL_PK_DEBUG_MPI MBEDTLS_PK_DEBUG_MPI -#define POLARSSL_PK_DEBUG_NONE MBEDTLS_PK_DEBUG_NONE -#define POLARSSL_PK_ECDSA MBEDTLS_PK_ECDSA -#define POLARSSL_PK_ECKEY MBEDTLS_PK_ECKEY -#define POLARSSL_PK_ECKEY_DH MBEDTLS_PK_ECKEY_DH -#define POLARSSL_PK_H MBEDTLS_PK_H -#define POLARSSL_PK_NONE MBEDTLS_PK_NONE -#define POLARSSL_PK_RSA MBEDTLS_PK_RSA -#define POLARSSL_PK_RSASSA_PSS MBEDTLS_PK_RSASSA_PSS -#define POLARSSL_PK_RSA_ALT MBEDTLS_PK_RSA_ALT -#define POLARSSL_PK_WRAP_H MBEDTLS_PK_WRAP_H -#define POLARSSL_PLATFORM_H MBEDTLS_PLATFORM_H -#define POLARSSL_PREMASTER_SIZE MBEDTLS_PREMASTER_SIZE -#define POLARSSL_RIPEMD160_H MBEDTLS_RIPEMD160_H -#define POLARSSL_RSA_H MBEDTLS_RSA_H -#define POLARSSL_SHA1_H MBEDTLS_SHA1_H -#define POLARSSL_SHA256_H MBEDTLS_SHA256_H -#define POLARSSL_SHA512_H MBEDTLS_SHA512_H -#define POLARSSL_SSL_CACHE_H MBEDTLS_SSL_CACHE_H -#define POLARSSL_SSL_CIPHERSUITES_H MBEDTLS_SSL_CIPHERSUITES_H -#define POLARSSL_SSL_COOKIE_H MBEDTLS_SSL_COOKIE_H -#define POLARSSL_SSL_H MBEDTLS_SSL_H -#define POLARSSL_THREADING_H MBEDTLS_THREADING_H -#define POLARSSL_THREADING_IMPL MBEDTLS_THREADING_IMPL -#define POLARSSL_TIMING_H MBEDTLS_TIMING_H -#define POLARSSL_VERSION_H MBEDTLS_VERSION_H -#define POLARSSL_VERSION_MAJOR MBEDTLS_VERSION_MAJOR -#define POLARSSL_VERSION_MINOR MBEDTLS_VERSION_MINOR -#define POLARSSL_VERSION_NUMBER MBEDTLS_VERSION_NUMBER -#define POLARSSL_VERSION_PATCH MBEDTLS_VERSION_PATCH -#define POLARSSL_VERSION_STRING MBEDTLS_VERSION_STRING -#define POLARSSL_VERSION_STRING_FULL MBEDTLS_VERSION_STRING_FULL -#define POLARSSL_X509_CRL_H MBEDTLS_X509_CRL_H -#define POLARSSL_X509_CRT_H MBEDTLS_X509_CRT_H -#define POLARSSL_X509_CSR_H MBEDTLS_X509_CSR_H -#define POLARSSL_X509_H MBEDTLS_X509_H -#define POLARSSL_XTEA_H MBEDTLS_XTEA_H -#define RSA_CRYPT MBEDTLS_RSA_CRYPT -#define RSA_PKCS_V15 MBEDTLS_RSA_PKCS_V15 -#define RSA_PKCS_V21 MBEDTLS_RSA_PKCS_V21 -#define RSA_PRIVATE MBEDTLS_RSA_PRIVATE -#define RSA_PUBLIC MBEDTLS_RSA_PUBLIC -#define RSA_SALT_LEN_ANY MBEDTLS_RSA_SALT_LEN_ANY -#define RSA_SIGN MBEDTLS_RSA_SIGN -#define SSL_ALERT_LEVEL_FATAL MBEDTLS_SSL_ALERT_LEVEL_FATAL -#define SSL_ALERT_LEVEL_WARNING MBEDTLS_SSL_ALERT_LEVEL_WARNING -#define SSL_ALERT_MSG_ACCESS_DENIED MBEDTLS_SSL_ALERT_MSG_ACCESS_DENIED -#define SSL_ALERT_MSG_BAD_CERT MBEDTLS_SSL_ALERT_MSG_BAD_CERT -#define SSL_ALERT_MSG_BAD_RECORD_MAC MBEDTLS_SSL_ALERT_MSG_BAD_RECORD_MAC -#define SSL_ALERT_MSG_CERT_EXPIRED MBEDTLS_SSL_ALERT_MSG_CERT_EXPIRED -#define SSL_ALERT_MSG_CERT_REVOKED MBEDTLS_SSL_ALERT_MSG_CERT_REVOKED -#define SSL_ALERT_MSG_CERT_UNKNOWN MBEDTLS_SSL_ALERT_MSG_CERT_UNKNOWN -#define SSL_ALERT_MSG_CLOSE_NOTIFY MBEDTLS_SSL_ALERT_MSG_CLOSE_NOTIFY -#define SSL_ALERT_MSG_DECODE_ERROR MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR -#define SSL_ALERT_MSG_DECOMPRESSION_FAILURE MBEDTLS_SSL_ALERT_MSG_DECOMPRESSION_FAILURE -#define SSL_ALERT_MSG_DECRYPTION_FAILED MBEDTLS_SSL_ALERT_MSG_DECRYPTION_FAILED -#define SSL_ALERT_MSG_DECRYPT_ERROR MBEDTLS_SSL_ALERT_MSG_DECRYPT_ERROR -#define SSL_ALERT_MSG_EXPORT_RESTRICTION MBEDTLS_SSL_ALERT_MSG_EXPORT_RESTRICTION -#define SSL_ALERT_MSG_HANDSHAKE_FAILURE MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE -#define SSL_ALERT_MSG_ILLEGAL_PARAMETER MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER -#define SSL_ALERT_MSG_INAPROPRIATE_FALLBACK MBEDTLS_SSL_ALERT_MSG_INAPROPRIATE_FALLBACK -#define SSL_ALERT_MSG_INSUFFICIENT_SECURITY MBEDTLS_SSL_ALERT_MSG_INSUFFICIENT_SECURITY -#define SSL_ALERT_MSG_INTERNAL_ERROR MBEDTLS_SSL_ALERT_MSG_INTERNAL_ERROR -#define SSL_ALERT_MSG_NO_APPLICATION_PROTOCOL MBEDTLS_SSL_ALERT_MSG_NO_APPLICATION_PROTOCOL -#define SSL_ALERT_MSG_NO_CERT MBEDTLS_SSL_ALERT_MSG_NO_CERT -#define SSL_ALERT_MSG_NO_RENEGOTIATION MBEDTLS_SSL_ALERT_MSG_NO_RENEGOTIATION -#define SSL_ALERT_MSG_PROTOCOL_VERSION MBEDTLS_SSL_ALERT_MSG_PROTOCOL_VERSION -#define SSL_ALERT_MSG_RECORD_OVERFLOW MBEDTLS_SSL_ALERT_MSG_RECORD_OVERFLOW -#define SSL_ALERT_MSG_UNEXPECTED_MESSAGE MBEDTLS_SSL_ALERT_MSG_UNEXPECTED_MESSAGE -#define SSL_ALERT_MSG_UNKNOWN_CA MBEDTLS_SSL_ALERT_MSG_UNKNOWN_CA -#define SSL_ALERT_MSG_UNKNOWN_PSK_IDENTITY MBEDTLS_SSL_ALERT_MSG_UNKNOWN_PSK_IDENTITY -#define SSL_ALERT_MSG_UNRECOGNIZED_NAME MBEDTLS_SSL_ALERT_MSG_UNRECOGNIZED_NAME -#define SSL_ALERT_MSG_UNSUPPORTED_CERT MBEDTLS_SSL_ALERT_MSG_UNSUPPORTED_CERT -#define SSL_ALERT_MSG_UNSUPPORTED_EXT MBEDTLS_SSL_ALERT_MSG_UNSUPPORTED_EXT -#define SSL_ALERT_MSG_USER_CANCELED MBEDTLS_SSL_ALERT_MSG_USER_CANCELED -#define SSL_ANTI_REPLAY_DISABLED MBEDTLS_SSL_ANTI_REPLAY_DISABLED -#define SSL_ANTI_REPLAY_ENABLED MBEDTLS_SSL_ANTI_REPLAY_ENABLED -#define SSL_ARC4_DISABLED MBEDTLS_SSL_ARC4_DISABLED -#define SSL_ARC4_ENABLED MBEDTLS_SSL_ARC4_ENABLED -#define SSL_BUFFER_LEN MBEDTLS_SSL_BUFFER_LEN -#define SSL_CACHE_DEFAULT_MAX_ENTRIES MBEDTLS_SSL_CACHE_DEFAULT_MAX_ENTRIES -#define SSL_CACHE_DEFAULT_TIMEOUT MBEDTLS_SSL_CACHE_DEFAULT_TIMEOUT -#define SSL_CBC_RECORD_SPLITTING_DISABLED MBEDTLS_SSL_CBC_RECORD_SPLITTING_DISABLED -#define SSL_CBC_RECORD_SPLITTING_ENABLED MBEDTLS_SSL_CBC_RECORD_SPLITTING_ENABLED -#define SSL_CERTIFICATE_REQUEST MBEDTLS_SSL_CERTIFICATE_REQUEST -#define SSL_CERTIFICATE_VERIFY MBEDTLS_SSL_CERTIFICATE_VERIFY -#define SSL_CERT_TYPE_ECDSA_SIGN MBEDTLS_SSL_CERT_TYPE_ECDSA_SIGN -#define SSL_CERT_TYPE_RSA_SIGN MBEDTLS_SSL_CERT_TYPE_RSA_SIGN -#define SSL_CHANNEL_INBOUND MBEDTLS_SSL_CHANNEL_INBOUND -#define SSL_CHANNEL_OUTBOUND MBEDTLS_SSL_CHANNEL_OUTBOUND -#define SSL_CIPHERSUITES MBEDTLS_SSL_CIPHERSUITES -#define SSL_CLIENT_CERTIFICATE MBEDTLS_SSL_CLIENT_CERTIFICATE -#define SSL_CLIENT_CHANGE_CIPHER_SPEC MBEDTLS_SSL_CLIENT_CHANGE_CIPHER_SPEC -#define SSL_CLIENT_FINISHED MBEDTLS_SSL_CLIENT_FINISHED -#define SSL_CLIENT_HELLO MBEDTLS_SSL_CLIENT_HELLO -#define SSL_CLIENT_KEY_EXCHANGE MBEDTLS_SSL_CLIENT_KEY_EXCHANGE -#define SSL_COMPRESSION_ADD MBEDTLS_SSL_COMPRESSION_ADD -#define SSL_COMPRESS_DEFLATE MBEDTLS_SSL_COMPRESS_DEFLATE -#define SSL_COMPRESS_NULL MBEDTLS_SSL_COMPRESS_NULL -#define SSL_DEBUG_BUF MBEDTLS_SSL_DEBUG_BUF -#define SSL_DEBUG_CRT MBEDTLS_SSL_DEBUG_CRT -#define SSL_DEBUG_ECP MBEDTLS_SSL_DEBUG_ECP -#define SSL_DEBUG_MPI MBEDTLS_SSL_DEBUG_MPI -#define SSL_DEBUG_MSG MBEDTLS_SSL_DEBUG_MSG -#define SSL_DEBUG_RET MBEDTLS_SSL_DEBUG_RET -#define SSL_DEFAULT_TICKET_LIFETIME MBEDTLS_SSL_DEFAULT_TICKET_LIFETIME -#define SSL_DTLS_TIMEOUT_DFL_MAX MBEDTLS_SSL_DTLS_TIMEOUT_DFL_MAX -#define SSL_DTLS_TIMEOUT_DFL_MIN MBEDTLS_SSL_DTLS_TIMEOUT_DFL_MIN -#define SSL_EMPTY_RENEGOTIATION_INFO MBEDTLS_SSL_EMPTY_RENEGOTIATION_INFO -#define SSL_ETM_DISABLED MBEDTLS_SSL_ETM_DISABLED -#define SSL_ETM_ENABLED MBEDTLS_SSL_ETM_ENABLED -#define SSL_EXTENDED_MS_DISABLED MBEDTLS_SSL_EXTENDED_MS_DISABLED -#define SSL_EXTENDED_MS_ENABLED MBEDTLS_SSL_EXTENDED_MS_ENABLED -#define SSL_FALLBACK_SCSV MBEDTLS_SSL_FALLBACK_SCSV -#define SSL_FLUSH_BUFFERS MBEDTLS_SSL_FLUSH_BUFFERS -#define SSL_HANDSHAKE_OVER MBEDTLS_SSL_HANDSHAKE_OVER -#define SSL_HANDSHAKE_WRAPUP MBEDTLS_SSL_HANDSHAKE_WRAPUP -#define SSL_HASH_MD5 MBEDTLS_SSL_HASH_MD5 -#define SSL_HASH_NONE MBEDTLS_SSL_HASH_NONE -#define SSL_HASH_SHA1 MBEDTLS_SSL_HASH_SHA1 -#define SSL_HASH_SHA224 MBEDTLS_SSL_HASH_SHA224 -#define SSL_HASH_SHA256 MBEDTLS_SSL_HASH_SHA256 -#define SSL_HASH_SHA384 MBEDTLS_SSL_HASH_SHA384 -#define SSL_HASH_SHA512 MBEDTLS_SSL_HASH_SHA512 -#define SSL_HELLO_REQUEST MBEDTLS_SSL_HELLO_REQUEST -#define SSL_HS_CERTIFICATE MBEDTLS_SSL_HS_CERTIFICATE -#define SSL_HS_CERTIFICATE_REQUEST MBEDTLS_SSL_HS_CERTIFICATE_REQUEST -#define SSL_HS_CERTIFICATE_VERIFY MBEDTLS_SSL_HS_CERTIFICATE_VERIFY -#define SSL_HS_CLIENT_HELLO MBEDTLS_SSL_HS_CLIENT_HELLO -#define SSL_HS_CLIENT_KEY_EXCHANGE MBEDTLS_SSL_HS_CLIENT_KEY_EXCHANGE -#define SSL_HS_FINISHED MBEDTLS_SSL_HS_FINISHED -#define SSL_HS_HELLO_REQUEST MBEDTLS_SSL_HS_HELLO_REQUEST -#define SSL_HS_HELLO_VERIFY_REQUEST MBEDTLS_SSL_HS_HELLO_VERIFY_REQUEST -#define SSL_HS_NEW_SESSION_TICKET MBEDTLS_SSL_HS_NEW_SESSION_TICKET -#define SSL_HS_SERVER_HELLO MBEDTLS_SSL_HS_SERVER_HELLO -#define SSL_HS_SERVER_HELLO_DONE MBEDTLS_SSL_HS_SERVER_HELLO_DONE -#define SSL_HS_SERVER_KEY_EXCHANGE MBEDTLS_SSL_HS_SERVER_KEY_EXCHANGE -#define SSL_INITIAL_HANDSHAKE MBEDTLS_SSL_INITIAL_HANDSHAKE -#define SSL_IS_CLIENT MBEDTLS_SSL_IS_CLIENT -#define SSL_IS_FALLBACK MBEDTLS_SSL_IS_FALLBACK -#define SSL_IS_NOT_FALLBACK MBEDTLS_SSL_IS_NOT_FALLBACK -#define SSL_IS_SERVER MBEDTLS_SSL_IS_SERVER -#define SSL_LEGACY_ALLOW_RENEGOTIATION MBEDTLS_SSL_LEGACY_ALLOW_RENEGOTIATION -#define SSL_LEGACY_BREAK_HANDSHAKE MBEDTLS_SSL_LEGACY_BREAK_HANDSHAKE -#define SSL_LEGACY_NO_RENEGOTIATION MBEDTLS_SSL_LEGACY_NO_RENEGOTIATION -#define SSL_LEGACY_RENEGOTIATION MBEDTLS_SSL_LEGACY_RENEGOTIATION -#define SSL_MAC_ADD MBEDTLS_SSL_MAC_ADD -#define SSL_MAJOR_VERSION_3 MBEDTLS_SSL_MAJOR_VERSION_3 -#define SSL_MAX_CONTENT_LEN MBEDTLS_SSL_MAX_CONTENT_LEN -#define SSL_MAX_FRAG_LEN_1024 MBEDTLS_SSL_MAX_FRAG_LEN_1024 -#define SSL_MAX_FRAG_LEN_2048 MBEDTLS_SSL_MAX_FRAG_LEN_2048 -#define SSL_MAX_FRAG_LEN_4096 MBEDTLS_SSL_MAX_FRAG_LEN_4096 -#define SSL_MAX_FRAG_LEN_512 MBEDTLS_SSL_MAX_FRAG_LEN_512 -#define SSL_MAX_FRAG_LEN_INVALID MBEDTLS_SSL_MAX_FRAG_LEN_INVALID -#define SSL_MAX_FRAG_LEN_NONE MBEDTLS_SSL_MAX_FRAG_LEN_NONE -#define SSL_MAX_MAJOR_VERSION MBEDTLS_SSL_MAX_MAJOR_VERSION -#define SSL_MAX_MINOR_VERSION MBEDTLS_SSL_MAX_MINOR_VERSION -#define SSL_MINOR_VERSION_0 MBEDTLS_SSL_MINOR_VERSION_0 -#define SSL_MINOR_VERSION_1 MBEDTLS_SSL_MINOR_VERSION_1 -#define SSL_MINOR_VERSION_2 MBEDTLS_SSL_MINOR_VERSION_2 -#define SSL_MINOR_VERSION_3 MBEDTLS_SSL_MINOR_VERSION_3 -#define SSL_MIN_MAJOR_VERSION MBEDTLS_SSL_MIN_MAJOR_VERSION -#define SSL_MIN_MINOR_VERSION MBEDTLS_SSL_MIN_MINOR_VERSION -#define SSL_MSG_ALERT MBEDTLS_SSL_MSG_ALERT -#define SSL_MSG_APPLICATION_DATA MBEDTLS_SSL_MSG_APPLICATION_DATA -#define SSL_MSG_CHANGE_CIPHER_SPEC MBEDTLS_SSL_MSG_CHANGE_CIPHER_SPEC -#define SSL_MSG_HANDSHAKE MBEDTLS_SSL_MSG_HANDSHAKE -#define SSL_PADDING_ADD MBEDTLS_SSL_PADDING_ADD -#define SSL_RENEGOTIATION MBEDTLS_SSL_RENEGOTIATION -#define SSL_RENEGOTIATION_DISABLED MBEDTLS_SSL_RENEGOTIATION_DISABLED -#define SSL_RENEGOTIATION_DONE MBEDTLS_SSL_RENEGOTIATION_DONE -#define SSL_RENEGOTIATION_ENABLED MBEDTLS_SSL_RENEGOTIATION_ENABLED -#define SSL_RENEGOTIATION_NOT_ENFORCED MBEDTLS_SSL_RENEGOTIATION_NOT_ENFORCED -#define SSL_RENEGOTIATION_PENDING MBEDTLS_SSL_RENEGOTIATION_PENDING -#define SSL_RENEGO_MAX_RECORDS_DEFAULT MBEDTLS_SSL_RENEGO_MAX_RECORDS_DEFAULT -#define SSL_RETRANS_FINISHED MBEDTLS_SSL_RETRANS_FINISHED -#define SSL_RETRANS_PREPARING MBEDTLS_SSL_RETRANS_PREPARING -#define SSL_RETRANS_SENDING MBEDTLS_SSL_RETRANS_SENDING -#define SSL_RETRANS_WAITING MBEDTLS_SSL_RETRANS_WAITING -#define SSL_SECURE_RENEGOTIATION MBEDTLS_SSL_SECURE_RENEGOTIATION -#define SSL_SERVER_CERTIFICATE MBEDTLS_SSL_SERVER_CERTIFICATE -#define SSL_SERVER_CHANGE_CIPHER_SPEC MBEDTLS_SSL_SERVER_CHANGE_CIPHER_SPEC -#define SSL_SERVER_FINISHED MBEDTLS_SSL_SERVER_FINISHED -#define SSL_SERVER_HELLO MBEDTLS_SSL_SERVER_HELLO -#define SSL_SERVER_HELLO_DONE MBEDTLS_SSL_SERVER_HELLO_DONE -#define SSL_SERVER_HELLO_VERIFY_REQUEST_SENT MBEDTLS_SSL_SERVER_HELLO_VERIFY_REQUEST_SENT -#define SSL_SERVER_KEY_EXCHANGE MBEDTLS_SSL_SERVER_KEY_EXCHANGE -#define SSL_SERVER_NEW_SESSION_TICKET MBEDTLS_SSL_SERVER_NEW_SESSION_TICKET -#define SSL_SESSION_TICKETS_DISABLED MBEDTLS_SSL_SESSION_TICKETS_DISABLED -#define SSL_SESSION_TICKETS_ENABLED MBEDTLS_SSL_SESSION_TICKETS_ENABLED -#define SSL_SIG_ANON MBEDTLS_SSL_SIG_ANON -#define SSL_SIG_ECDSA MBEDTLS_SSL_SIG_ECDSA -#define SSL_SIG_RSA MBEDTLS_SSL_SIG_RSA -#define SSL_TRANSPORT_DATAGRAM MBEDTLS_SSL_TRANSPORT_DATAGRAM -#define SSL_TRANSPORT_STREAM MBEDTLS_SSL_TRANSPORT_STREAM -#define SSL_TRUNCATED_HMAC_LEN MBEDTLS_SSL_TRUNCATED_HMAC_LEN -#define SSL_TRUNC_HMAC_DISABLED MBEDTLS_SSL_TRUNC_HMAC_DISABLED -#define SSL_TRUNC_HMAC_ENABLED MBEDTLS_SSL_TRUNC_HMAC_ENABLED -#define SSL_VERIFY_DATA_MAX_LEN MBEDTLS_SSL_VERIFY_DATA_MAX_LEN -#define SSL_VERIFY_NONE MBEDTLS_SSL_VERIFY_NONE -#define SSL_VERIFY_OPTIONAL MBEDTLS_SSL_VERIFY_OPTIONAL -#define SSL_VERIFY_REQUIRED MBEDTLS_SSL_VERIFY_REQUIRED -#define TLS_DHE_PSK_WITH_3DES_EDE_CBC_SHA MBEDTLS_TLS_DHE_PSK_WITH_3DES_EDE_CBC_SHA -#define TLS_DHE_PSK_WITH_AES_128_CBC_SHA MBEDTLS_TLS_DHE_PSK_WITH_AES_128_CBC_SHA -#define TLS_DHE_PSK_WITH_AES_128_CBC_SHA256 MBEDTLS_TLS_DHE_PSK_WITH_AES_128_CBC_SHA256 -#define TLS_DHE_PSK_WITH_AES_128_CCM MBEDTLS_TLS_DHE_PSK_WITH_AES_128_CCM -#define TLS_DHE_PSK_WITH_AES_128_CCM_8 MBEDTLS_TLS_DHE_PSK_WITH_AES_128_CCM_8 -#define TLS_DHE_PSK_WITH_AES_128_GCM_SHA256 MBEDTLS_TLS_DHE_PSK_WITH_AES_128_GCM_SHA256 -#define TLS_DHE_PSK_WITH_AES_256_CBC_SHA MBEDTLS_TLS_DHE_PSK_WITH_AES_256_CBC_SHA -#define TLS_DHE_PSK_WITH_AES_256_CBC_SHA384 MBEDTLS_TLS_DHE_PSK_WITH_AES_256_CBC_SHA384 -#define TLS_DHE_PSK_WITH_AES_256_CCM MBEDTLS_TLS_DHE_PSK_WITH_AES_256_CCM -#define TLS_DHE_PSK_WITH_AES_256_CCM_8 MBEDTLS_TLS_DHE_PSK_WITH_AES_256_CCM_8 -#define TLS_DHE_PSK_WITH_AES_256_GCM_SHA384 MBEDTLS_TLS_DHE_PSK_WITH_AES_256_GCM_SHA384 -#define TLS_DHE_PSK_WITH_CAMELLIA_128_CBC_SHA256 MBEDTLS_TLS_DHE_PSK_WITH_CAMELLIA_128_CBC_SHA256 -#define TLS_DHE_PSK_WITH_CAMELLIA_128_GCM_SHA256 MBEDTLS_TLS_DHE_PSK_WITH_CAMELLIA_128_GCM_SHA256 -#define TLS_DHE_PSK_WITH_CAMELLIA_256_CBC_SHA384 MBEDTLS_TLS_DHE_PSK_WITH_CAMELLIA_256_CBC_SHA384 -#define TLS_DHE_PSK_WITH_CAMELLIA_256_GCM_SHA384 MBEDTLS_TLS_DHE_PSK_WITH_CAMELLIA_256_GCM_SHA384 -#define TLS_DHE_PSK_WITH_NULL_SHA MBEDTLS_TLS_DHE_PSK_WITH_NULL_SHA -#define TLS_DHE_PSK_WITH_NULL_SHA256 MBEDTLS_TLS_DHE_PSK_WITH_NULL_SHA256 -#define TLS_DHE_PSK_WITH_NULL_SHA384 MBEDTLS_TLS_DHE_PSK_WITH_NULL_SHA384 -#define TLS_DHE_PSK_WITH_RC4_128_SHA MBEDTLS_TLS_DHE_PSK_WITH_RC4_128_SHA -#define TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA MBEDTLS_TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA -#define TLS_DHE_RSA_WITH_AES_128_CBC_SHA MBEDTLS_TLS_DHE_RSA_WITH_AES_128_CBC_SHA -#define TLS_DHE_RSA_WITH_AES_128_CBC_SHA256 MBEDTLS_TLS_DHE_RSA_WITH_AES_128_CBC_SHA256 -#define TLS_DHE_RSA_WITH_AES_128_CCM MBEDTLS_TLS_DHE_RSA_WITH_AES_128_CCM -#define TLS_DHE_RSA_WITH_AES_128_CCM_8 MBEDTLS_TLS_DHE_RSA_WITH_AES_128_CCM_8 -#define TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 MBEDTLS_TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 -#define TLS_DHE_RSA_WITH_AES_256_CBC_SHA MBEDTLS_TLS_DHE_RSA_WITH_AES_256_CBC_SHA -#define TLS_DHE_RSA_WITH_AES_256_CBC_SHA256 MBEDTLS_TLS_DHE_RSA_WITH_AES_256_CBC_SHA256 -#define TLS_DHE_RSA_WITH_AES_256_CCM MBEDTLS_TLS_DHE_RSA_WITH_AES_256_CCM -#define TLS_DHE_RSA_WITH_AES_256_CCM_8 MBEDTLS_TLS_DHE_RSA_WITH_AES_256_CCM_8 -#define TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 MBEDTLS_TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 -#define TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA -#define TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256 MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256 -#define TLS_DHE_RSA_WITH_CAMELLIA_128_GCM_SHA256 MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_128_GCM_SHA256 -#define TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA -#define TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256 MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256 -#define TLS_DHE_RSA_WITH_CAMELLIA_256_GCM_SHA384 MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_256_GCM_SHA384 -#define TLS_DHE_RSA_WITH_DES_CBC_SHA MBEDTLS_TLS_DHE_RSA_WITH_DES_CBC_SHA -#define TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA MBEDTLS_TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA -#define TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA -#define TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 -#define TLS_ECDHE_ECDSA_WITH_AES_128_CCM MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_CCM -#define TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8 MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8 -#define TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 -#define TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA -#define TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384 MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384 -#define TLS_ECDHE_ECDSA_WITH_AES_256_CCM MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_CCM -#define TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8 MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8 -#define TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 -#define TLS_ECDHE_ECDSA_WITH_CAMELLIA_128_CBC_SHA256 MBEDTLS_TLS_ECDHE_ECDSA_WITH_CAMELLIA_128_CBC_SHA256 -#define TLS_ECDHE_ECDSA_WITH_CAMELLIA_128_GCM_SHA256 MBEDTLS_TLS_ECDHE_ECDSA_WITH_CAMELLIA_128_GCM_SHA256 -#define TLS_ECDHE_ECDSA_WITH_CAMELLIA_256_CBC_SHA384 MBEDTLS_TLS_ECDHE_ECDSA_WITH_CAMELLIA_256_CBC_SHA384 -#define TLS_ECDHE_ECDSA_WITH_CAMELLIA_256_GCM_SHA384 MBEDTLS_TLS_ECDHE_ECDSA_WITH_CAMELLIA_256_GCM_SHA384 -#define TLS_ECDHE_ECDSA_WITH_NULL_SHA MBEDTLS_TLS_ECDHE_ECDSA_WITH_NULL_SHA -#define TLS_ECDHE_ECDSA_WITH_RC4_128_SHA MBEDTLS_TLS_ECDHE_ECDSA_WITH_RC4_128_SHA -#define TLS_ECDHE_PSK_WITH_3DES_EDE_CBC_SHA MBEDTLS_TLS_ECDHE_PSK_WITH_3DES_EDE_CBC_SHA -#define TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA MBEDTLS_TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA -#define TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256 MBEDTLS_TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256 -#define TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA MBEDTLS_TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA -#define TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA384 MBEDTLS_TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA384 -#define TLS_ECDHE_PSK_WITH_CAMELLIA_128_CBC_SHA256 MBEDTLS_TLS_ECDHE_PSK_WITH_CAMELLIA_128_CBC_SHA256 -#define TLS_ECDHE_PSK_WITH_CAMELLIA_256_CBC_SHA384 MBEDTLS_TLS_ECDHE_PSK_WITH_CAMELLIA_256_CBC_SHA384 -#define TLS_ECDHE_PSK_WITH_NULL_SHA MBEDTLS_TLS_ECDHE_PSK_WITH_NULL_SHA -#define TLS_ECDHE_PSK_WITH_NULL_SHA256 MBEDTLS_TLS_ECDHE_PSK_WITH_NULL_SHA256 -#define TLS_ECDHE_PSK_WITH_NULL_SHA384 MBEDTLS_TLS_ECDHE_PSK_WITH_NULL_SHA384 -#define TLS_ECDHE_PSK_WITH_RC4_128_SHA MBEDTLS_TLS_ECDHE_PSK_WITH_RC4_128_SHA -#define TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA MBEDTLS_TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA -#define TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA MBEDTLS_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA -#define TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 MBEDTLS_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 -#define TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 MBEDTLS_TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 -#define TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA MBEDTLS_TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA -#define TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 MBEDTLS_TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 -#define TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 MBEDTLS_TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 -#define TLS_ECDHE_RSA_WITH_CAMELLIA_128_CBC_SHA256 MBEDTLS_TLS_ECDHE_RSA_WITH_CAMELLIA_128_CBC_SHA256 -#define TLS_ECDHE_RSA_WITH_CAMELLIA_128_GCM_SHA256 MBEDTLS_TLS_ECDHE_RSA_WITH_CAMELLIA_128_GCM_SHA256 -#define TLS_ECDHE_RSA_WITH_CAMELLIA_256_CBC_SHA384 MBEDTLS_TLS_ECDHE_RSA_WITH_CAMELLIA_256_CBC_SHA384 -#define TLS_ECDHE_RSA_WITH_CAMELLIA_256_GCM_SHA384 MBEDTLS_TLS_ECDHE_RSA_WITH_CAMELLIA_256_GCM_SHA384 -#define TLS_ECDHE_RSA_WITH_NULL_SHA MBEDTLS_TLS_ECDHE_RSA_WITH_NULL_SHA -#define TLS_ECDHE_RSA_WITH_RC4_128_SHA MBEDTLS_TLS_ECDHE_RSA_WITH_RC4_128_SHA -#define TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA MBEDTLS_TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA -#define TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA -#define TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256 MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256 -#define TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256 MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256 -#define TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA -#define TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384 MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384 -#define TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384 MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384 -#define TLS_ECDH_ECDSA_WITH_CAMELLIA_128_CBC_SHA256 MBEDTLS_TLS_ECDH_ECDSA_WITH_CAMELLIA_128_CBC_SHA256 -#define TLS_ECDH_ECDSA_WITH_CAMELLIA_128_GCM_SHA256 MBEDTLS_TLS_ECDH_ECDSA_WITH_CAMELLIA_128_GCM_SHA256 -#define TLS_ECDH_ECDSA_WITH_CAMELLIA_256_CBC_SHA384 MBEDTLS_TLS_ECDH_ECDSA_WITH_CAMELLIA_256_CBC_SHA384 -#define TLS_ECDH_ECDSA_WITH_CAMELLIA_256_GCM_SHA384 MBEDTLS_TLS_ECDH_ECDSA_WITH_CAMELLIA_256_GCM_SHA384 -#define TLS_ECDH_ECDSA_WITH_NULL_SHA MBEDTLS_TLS_ECDH_ECDSA_WITH_NULL_SHA -#define TLS_ECDH_ECDSA_WITH_RC4_128_SHA MBEDTLS_TLS_ECDH_ECDSA_WITH_RC4_128_SHA -#define TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA MBEDTLS_TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA -#define TLS_ECDH_RSA_WITH_AES_128_CBC_SHA MBEDTLS_TLS_ECDH_RSA_WITH_AES_128_CBC_SHA -#define TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256 MBEDTLS_TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256 -#define TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256 MBEDTLS_TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256 -#define TLS_ECDH_RSA_WITH_AES_256_CBC_SHA MBEDTLS_TLS_ECDH_RSA_WITH_AES_256_CBC_SHA -#define TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384 MBEDTLS_TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384 -#define TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384 MBEDTLS_TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384 -#define TLS_ECDH_RSA_WITH_CAMELLIA_128_CBC_SHA256 MBEDTLS_TLS_ECDH_RSA_WITH_CAMELLIA_128_CBC_SHA256 -#define TLS_ECDH_RSA_WITH_CAMELLIA_128_GCM_SHA256 MBEDTLS_TLS_ECDH_RSA_WITH_CAMELLIA_128_GCM_SHA256 -#define TLS_ECDH_RSA_WITH_CAMELLIA_256_CBC_SHA384 MBEDTLS_TLS_ECDH_RSA_WITH_CAMELLIA_256_CBC_SHA384 -#define TLS_ECDH_RSA_WITH_CAMELLIA_256_GCM_SHA384 MBEDTLS_TLS_ECDH_RSA_WITH_CAMELLIA_256_GCM_SHA384 -#define TLS_ECDH_RSA_WITH_NULL_SHA MBEDTLS_TLS_ECDH_RSA_WITH_NULL_SHA -#define TLS_ECDH_RSA_WITH_RC4_128_SHA MBEDTLS_TLS_ECDH_RSA_WITH_RC4_128_SHA -#define TLS_EXT_ALPN MBEDTLS_TLS_EXT_ALPN -#define TLS_EXT_ENCRYPT_THEN_MAC MBEDTLS_TLS_EXT_ENCRYPT_THEN_MAC -#define TLS_EXT_EXTENDED_MASTER_SECRET MBEDTLS_TLS_EXT_EXTENDED_MASTER_SECRET -#define TLS_EXT_MAX_FRAGMENT_LENGTH MBEDTLS_TLS_EXT_MAX_FRAGMENT_LENGTH -#define TLS_EXT_RENEGOTIATION_INFO MBEDTLS_TLS_EXT_RENEGOTIATION_INFO -#define TLS_EXT_SERVERNAME MBEDTLS_TLS_EXT_SERVERNAME -#define TLS_EXT_SERVERNAME_HOSTNAME MBEDTLS_TLS_EXT_SERVERNAME_HOSTNAME -#define TLS_EXT_SESSION_TICKET MBEDTLS_TLS_EXT_SESSION_TICKET -#define TLS_EXT_SIG_ALG MBEDTLS_TLS_EXT_SIG_ALG -#define TLS_EXT_SUPPORTED_ELLIPTIC_CURVES MBEDTLS_TLS_EXT_SUPPORTED_ELLIPTIC_CURVES -#define TLS_EXT_SUPPORTED_POINT_FORMATS MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS -#define TLS_EXT_SUPPORTED_POINT_FORMATS_PRESENT MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS_PRESENT -#define TLS_EXT_TRUNCATED_HMAC MBEDTLS_TLS_EXT_TRUNCATED_HMAC -#define TLS_PSK_WITH_3DES_EDE_CBC_SHA MBEDTLS_TLS_PSK_WITH_3DES_EDE_CBC_SHA -#define TLS_PSK_WITH_AES_128_CBC_SHA MBEDTLS_TLS_PSK_WITH_AES_128_CBC_SHA -#define TLS_PSK_WITH_AES_128_CBC_SHA256 MBEDTLS_TLS_PSK_WITH_AES_128_CBC_SHA256 -#define TLS_PSK_WITH_AES_128_CCM MBEDTLS_TLS_PSK_WITH_AES_128_CCM -#define TLS_PSK_WITH_AES_128_CCM_8 MBEDTLS_TLS_PSK_WITH_AES_128_CCM_8 -#define TLS_PSK_WITH_AES_128_GCM_SHA256 MBEDTLS_TLS_PSK_WITH_AES_128_GCM_SHA256 -#define TLS_PSK_WITH_AES_256_CBC_SHA MBEDTLS_TLS_PSK_WITH_AES_256_CBC_SHA -#define TLS_PSK_WITH_AES_256_CBC_SHA384 MBEDTLS_TLS_PSK_WITH_AES_256_CBC_SHA384 -#define TLS_PSK_WITH_AES_256_CCM MBEDTLS_TLS_PSK_WITH_AES_256_CCM -#define TLS_PSK_WITH_AES_256_CCM_8 MBEDTLS_TLS_PSK_WITH_AES_256_CCM_8 -#define TLS_PSK_WITH_AES_256_GCM_SHA384 MBEDTLS_TLS_PSK_WITH_AES_256_GCM_SHA384 -#define TLS_PSK_WITH_CAMELLIA_128_CBC_SHA256 MBEDTLS_TLS_PSK_WITH_CAMELLIA_128_CBC_SHA256 -#define TLS_PSK_WITH_CAMELLIA_128_GCM_SHA256 MBEDTLS_TLS_PSK_WITH_CAMELLIA_128_GCM_SHA256 -#define TLS_PSK_WITH_CAMELLIA_256_CBC_SHA384 MBEDTLS_TLS_PSK_WITH_CAMELLIA_256_CBC_SHA384 -#define TLS_PSK_WITH_CAMELLIA_256_GCM_SHA384 MBEDTLS_TLS_PSK_WITH_CAMELLIA_256_GCM_SHA384 -#define TLS_PSK_WITH_NULL_SHA MBEDTLS_TLS_PSK_WITH_NULL_SHA -#define TLS_PSK_WITH_NULL_SHA256 MBEDTLS_TLS_PSK_WITH_NULL_SHA256 -#define TLS_PSK_WITH_NULL_SHA384 MBEDTLS_TLS_PSK_WITH_NULL_SHA384 -#define TLS_PSK_WITH_RC4_128_SHA MBEDTLS_TLS_PSK_WITH_RC4_128_SHA -#define TLS_RSA_PSK_WITH_3DES_EDE_CBC_SHA MBEDTLS_TLS_RSA_PSK_WITH_3DES_EDE_CBC_SHA -#define TLS_RSA_PSK_WITH_AES_128_CBC_SHA MBEDTLS_TLS_RSA_PSK_WITH_AES_128_CBC_SHA -#define TLS_RSA_PSK_WITH_AES_128_CBC_SHA256 MBEDTLS_TLS_RSA_PSK_WITH_AES_128_CBC_SHA256 -#define TLS_RSA_PSK_WITH_AES_128_GCM_SHA256 MBEDTLS_TLS_RSA_PSK_WITH_AES_128_GCM_SHA256 -#define TLS_RSA_PSK_WITH_AES_256_CBC_SHA MBEDTLS_TLS_RSA_PSK_WITH_AES_256_CBC_SHA -#define TLS_RSA_PSK_WITH_AES_256_CBC_SHA384 MBEDTLS_TLS_RSA_PSK_WITH_AES_256_CBC_SHA384 -#define TLS_RSA_PSK_WITH_AES_256_GCM_SHA384 MBEDTLS_TLS_RSA_PSK_WITH_AES_256_GCM_SHA384 -#define TLS_RSA_PSK_WITH_CAMELLIA_128_CBC_SHA256 MBEDTLS_TLS_RSA_PSK_WITH_CAMELLIA_128_CBC_SHA256 -#define TLS_RSA_PSK_WITH_CAMELLIA_128_GCM_SHA256 MBEDTLS_TLS_RSA_PSK_WITH_CAMELLIA_128_GCM_SHA256 -#define TLS_RSA_PSK_WITH_CAMELLIA_256_CBC_SHA384 MBEDTLS_TLS_RSA_PSK_WITH_CAMELLIA_256_CBC_SHA384 -#define TLS_RSA_PSK_WITH_CAMELLIA_256_GCM_SHA384 MBEDTLS_TLS_RSA_PSK_WITH_CAMELLIA_256_GCM_SHA384 -#define TLS_RSA_PSK_WITH_NULL_SHA MBEDTLS_TLS_RSA_PSK_WITH_NULL_SHA -#define TLS_RSA_PSK_WITH_NULL_SHA256 MBEDTLS_TLS_RSA_PSK_WITH_NULL_SHA256 -#define TLS_RSA_PSK_WITH_NULL_SHA384 MBEDTLS_TLS_RSA_PSK_WITH_NULL_SHA384 -#define TLS_RSA_PSK_WITH_RC4_128_SHA MBEDTLS_TLS_RSA_PSK_WITH_RC4_128_SHA -#define TLS_RSA_WITH_3DES_EDE_CBC_SHA MBEDTLS_TLS_RSA_WITH_3DES_EDE_CBC_SHA -#define TLS_RSA_WITH_AES_128_CBC_SHA MBEDTLS_TLS_RSA_WITH_AES_128_CBC_SHA -#define TLS_RSA_WITH_AES_128_CBC_SHA256 MBEDTLS_TLS_RSA_WITH_AES_128_CBC_SHA256 -#define TLS_RSA_WITH_AES_128_CCM MBEDTLS_TLS_RSA_WITH_AES_128_CCM -#define TLS_RSA_WITH_AES_128_CCM_8 MBEDTLS_TLS_RSA_WITH_AES_128_CCM_8 -#define TLS_RSA_WITH_AES_128_GCM_SHA256 MBEDTLS_TLS_RSA_WITH_AES_128_GCM_SHA256 -#define TLS_RSA_WITH_AES_256_CBC_SHA MBEDTLS_TLS_RSA_WITH_AES_256_CBC_SHA -#define TLS_RSA_WITH_AES_256_CBC_SHA256 MBEDTLS_TLS_RSA_WITH_AES_256_CBC_SHA256 -#define TLS_RSA_WITH_AES_256_CCM MBEDTLS_TLS_RSA_WITH_AES_256_CCM -#define TLS_RSA_WITH_AES_256_CCM_8 MBEDTLS_TLS_RSA_WITH_AES_256_CCM_8 -#define TLS_RSA_WITH_AES_256_GCM_SHA384 MBEDTLS_TLS_RSA_WITH_AES_256_GCM_SHA384 -#define TLS_RSA_WITH_CAMELLIA_128_CBC_SHA MBEDTLS_TLS_RSA_WITH_CAMELLIA_128_CBC_SHA -#define TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256 MBEDTLS_TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256 -#define TLS_RSA_WITH_CAMELLIA_128_GCM_SHA256 MBEDTLS_TLS_RSA_WITH_CAMELLIA_128_GCM_SHA256 -#define TLS_RSA_WITH_CAMELLIA_256_CBC_SHA MBEDTLS_TLS_RSA_WITH_CAMELLIA_256_CBC_SHA -#define TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256 MBEDTLS_TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256 -#define TLS_RSA_WITH_CAMELLIA_256_GCM_SHA384 MBEDTLS_TLS_RSA_WITH_CAMELLIA_256_GCM_SHA384 -#define TLS_RSA_WITH_DES_CBC_SHA MBEDTLS_TLS_RSA_WITH_DES_CBC_SHA -#define TLS_RSA_WITH_NULL_MD5 MBEDTLS_TLS_RSA_WITH_NULL_MD5 -#define TLS_RSA_WITH_NULL_SHA MBEDTLS_TLS_RSA_WITH_NULL_SHA -#define TLS_RSA_WITH_NULL_SHA256 MBEDTLS_TLS_RSA_WITH_NULL_SHA256 -#define TLS_RSA_WITH_RC4_128_MD5 MBEDTLS_TLS_RSA_WITH_RC4_128_MD5 -#define TLS_RSA_WITH_RC4_128_SHA MBEDTLS_TLS_RSA_WITH_RC4_128_SHA -#define UL64 MBEDTLS_UL64 -#define X509_CRT_VERSION_1 MBEDTLS_X509_CRT_VERSION_1 -#define X509_CRT_VERSION_2 MBEDTLS_X509_CRT_VERSION_2 -#define X509_CRT_VERSION_3 MBEDTLS_X509_CRT_VERSION_3 -#define X509_FORMAT_DER MBEDTLS_X509_FORMAT_DER -#define X509_FORMAT_PEM MBEDTLS_X509_FORMAT_PEM -#define X509_MAX_DN_NAME_SIZE MBEDTLS_X509_MAX_DN_NAME_SIZE -#define X509_RFC5280_MAX_SERIAL_LEN MBEDTLS_X509_RFC5280_MAX_SERIAL_LEN -#define X509_RFC5280_UTC_TIME_LEN MBEDTLS_X509_RFC5280_UTC_TIME_LEN -#define XTEA_DECRYPT MBEDTLS_XTEA_DECRYPT -#define XTEA_ENCRYPT MBEDTLS_XTEA_ENCRYPT -#define _asn1_bitstring mbedtls_asn1_bitstring -#define _asn1_buf mbedtls_asn1_buf -#define _asn1_named_data mbedtls_asn1_named_data -#define _asn1_sequence mbedtls_asn1_sequence -#define _ssl_cache_context mbedtls_ssl_cache_context -#define _ssl_cache_entry mbedtls_ssl_cache_entry -#define _ssl_ciphersuite_t mbedtls_ssl_ciphersuite_t -#define _ssl_context mbedtls_ssl_context -#define _ssl_flight_item mbedtls_ssl_flight_item -#define _ssl_handshake_params mbedtls_ssl_handshake_params -#define _ssl_key_cert mbedtls_ssl_key_cert -#define _ssl_premaster_secret mbedtls_ssl_premaster_secret -#define _ssl_session mbedtls_ssl_session -#define _ssl_ticket_keys mbedtls_ssl_ticket_keys -#define _ssl_transform mbedtls_ssl_transform -#define _x509_crl mbedtls_x509_crl -#define _x509_crl_entry mbedtls_x509_crl_entry -#define _x509_crt mbedtls_x509_crt -#define _x509_csr mbedtls_x509_csr -#define _x509_time mbedtls_x509_time -#define _x509write_cert mbedtls_x509write_cert -#define _x509write_csr mbedtls_x509write_csr -#define aes_context mbedtls_aes_context -#define aes_crypt_cbc mbedtls_aes_crypt_cbc -#define aes_crypt_cfb128 mbedtls_aes_crypt_cfb128 -#define aes_crypt_cfb8 mbedtls_aes_crypt_cfb8 -#define aes_crypt_ctr mbedtls_aes_crypt_ctr -#define aes_crypt_ecb mbedtls_aes_crypt_ecb -#define aes_free mbedtls_aes_free -#define aes_init mbedtls_aes_init -#define aes_self_test mbedtls_aes_self_test -#define aes_setkey_dec mbedtls_aes_setkey_dec -#define aes_setkey_enc mbedtls_aes_setkey_enc -#define aesni_crypt_ecb mbedtls_aesni_crypt_ecb -#define aesni_gcm_mult mbedtls_aesni_gcm_mult -#define aesni_inverse_key mbedtls_aesni_inverse_key -#define aesni_setkey_enc mbedtls_aesni_setkey_enc -#define aesni_supports mbedtls_aesni_has_support -#define alarmed mbedtls_timing_alarmed -#define arc4_context mbedtls_arc4_context -#define arc4_crypt mbedtls_arc4_crypt -#define arc4_free mbedtls_arc4_free -#define arc4_init mbedtls_arc4_init -#define arc4_self_test mbedtls_arc4_self_test -#define arc4_setup mbedtls_arc4_setup -#define asn1_bitstring mbedtls_asn1_bitstring -#define asn1_buf mbedtls_asn1_buf -#define asn1_find_named_data mbedtls_asn1_find_named_data -#define asn1_free_named_data mbedtls_asn1_free_named_data -#define asn1_free_named_data_list mbedtls_asn1_free_named_data_list -#define asn1_get_alg mbedtls_asn1_get_alg -#define asn1_get_alg_null mbedtls_asn1_get_alg_null -#define asn1_get_bitstring mbedtls_asn1_get_bitstring -#define asn1_get_bitstring_null mbedtls_asn1_get_bitstring_null -#define asn1_get_bool mbedtls_asn1_get_bool -#define asn1_get_int mbedtls_asn1_get_int -#define asn1_get_len mbedtls_asn1_get_len -#define asn1_get_mpi mbedtls_asn1_get_mpi -#define asn1_get_sequence_of mbedtls_asn1_get_sequence_of -#define asn1_get_tag mbedtls_asn1_get_tag -#define asn1_named_data mbedtls_asn1_named_data -#define asn1_sequence mbedtls_asn1_sequence -#define asn1_store_named_data mbedtls_asn1_store_named_data -#define asn1_write_algorithm_identifier mbedtls_asn1_write_algorithm_identifier -#define asn1_write_bitstring mbedtls_asn1_write_bitstring -#define asn1_write_bool mbedtls_asn1_write_bool -#define asn1_write_ia5_string mbedtls_asn1_write_ia5_string -#define asn1_write_int mbedtls_asn1_write_int -#define asn1_write_len mbedtls_asn1_write_len -#define asn1_write_mpi mbedtls_asn1_write_mpi -#define asn1_write_null mbedtls_asn1_write_null -#define asn1_write_octet_string mbedtls_asn1_write_octet_string -#define asn1_write_oid mbedtls_asn1_write_oid -#define asn1_write_printable_string mbedtls_asn1_write_printable_string -#define asn1_write_raw_buffer mbedtls_asn1_write_raw_buffer -#define asn1_write_tag mbedtls_asn1_write_tag -#define base64_decode mbedtls_base64_decode -#define base64_encode mbedtls_base64_encode -#define base64_self_test mbedtls_base64_self_test -#define blowfish_context mbedtls_blowfish_context -#define blowfish_crypt_cbc mbedtls_blowfish_crypt_cbc -#define blowfish_crypt_cfb64 mbedtls_blowfish_crypt_cfb64 -#define blowfish_crypt_ctr mbedtls_blowfish_crypt_ctr -#define blowfish_crypt_ecb mbedtls_blowfish_crypt_ecb -#define blowfish_free mbedtls_blowfish_free -#define blowfish_init mbedtls_blowfish_init -#define blowfish_setkey mbedtls_blowfish_setkey -#define camellia_context mbedtls_camellia_context -#define camellia_crypt_cbc mbedtls_camellia_crypt_cbc -#define camellia_crypt_cfb128 mbedtls_camellia_crypt_cfb128 -#define camellia_crypt_ctr mbedtls_camellia_crypt_ctr -#define camellia_crypt_ecb mbedtls_camellia_crypt_ecb -#define camellia_free mbedtls_camellia_free -#define camellia_init mbedtls_camellia_init -#define camellia_self_test mbedtls_camellia_self_test -#define camellia_setkey_dec mbedtls_camellia_setkey_dec -#define camellia_setkey_enc mbedtls_camellia_setkey_enc -#define ccm_auth_decrypt mbedtls_ccm_auth_decrypt -#define ccm_context mbedtls_ccm_context -#define ccm_encrypt_and_tag mbedtls_ccm_encrypt_and_tag -#define ccm_free mbedtls_ccm_free -#define ccm_init mbedtls_ccm_init -#define ccm_self_test mbedtls_ccm_self_test -#define cipher_auth_decrypt mbedtls_cipher_auth_decrypt -#define cipher_auth_encrypt mbedtls_cipher_auth_encrypt -#define cipher_base_t mbedtls_cipher_base_t -#define cipher_check_tag mbedtls_cipher_check_tag -#define cipher_context_t mbedtls_cipher_context_t -#define cipher_crypt mbedtls_cipher_crypt -#define cipher_definition_t mbedtls_cipher_definition_t -#define cipher_definitions mbedtls_cipher_definitions -#define cipher_finish mbedtls_cipher_finish -#define cipher_free mbedtls_cipher_free -#define cipher_free_ctx mbedtls_cipher_free_ctx -#define cipher_get_block_size mbedtls_cipher_get_block_size -#define cipher_get_cipher_mode mbedtls_cipher_get_cipher_mode -#define cipher_get_iv_size mbedtls_cipher_get_iv_size -#define cipher_get_key_size mbedtls_cipher_get_key_bitlen -#define cipher_get_name mbedtls_cipher_get_name -#define cipher_get_operation mbedtls_cipher_get_operation -#define cipher_get_type mbedtls_cipher_get_type -#define cipher_id_t mbedtls_cipher_id_t -#define cipher_info_from_string mbedtls_cipher_info_from_string -#define cipher_info_from_type mbedtls_cipher_info_from_type -#define cipher_info_from_values mbedtls_cipher_info_from_values -#define cipher_info_t mbedtls_cipher_info_t -#define cipher_init mbedtls_cipher_init -#define cipher_init_ctx mbedtls_cipher_setup -#define cipher_list mbedtls_cipher_list -#define cipher_mode_t mbedtls_cipher_mode_t -#define cipher_padding_t mbedtls_cipher_padding_t -#define cipher_reset mbedtls_cipher_reset -#define cipher_self_test mbedtls_cipher_self_test -#define cipher_set_iv mbedtls_cipher_set_iv -#define cipher_set_padding_mode mbedtls_cipher_set_padding_mode -#define cipher_setkey mbedtls_cipher_setkey -#define cipher_type_t mbedtls_cipher_type_t -#define cipher_update mbedtls_cipher_update -#define cipher_update_ad mbedtls_cipher_update_ad -#define cipher_write_tag mbedtls_cipher_write_tag -#define ctr_drbg_context mbedtls_ctr_drbg_context -#define ctr_drbg_free mbedtls_ctr_drbg_free -#define ctr_drbg_init mbedtls_ctr_drbg_init -#define ctr_drbg_init_entropy_len mbedtls_ctr_drbg_init_entropy_len -#define ctr_drbg_random mbedtls_ctr_drbg_random -#define ctr_drbg_random_with_add mbedtls_ctr_drbg_random_with_add -#define ctr_drbg_reseed mbedtls_ctr_drbg_reseed -#define ctr_drbg_self_test mbedtls_ctr_drbg_self_test -#define ctr_drbg_set_entropy_len mbedtls_ctr_drbg_set_entropy_len -#define ctr_drbg_set_prediction_resistance mbedtls_ctr_drbg_set_prediction_resistance -#define ctr_drbg_set_reseed_interval mbedtls_ctr_drbg_set_reseed_interval -#define ctr_drbg_update mbedtls_ctr_drbg_update -#define ctr_drbg_update_seed_file mbedtls_ctr_drbg_update_seed_file -#define ctr_drbg_write_seed_file mbedtls_ctr_drbg_write_seed_file -#define debug_fmt mbedtls_debug_fmt -#define debug_print_buf mbedtls_debug_print_buf -#define debug_print_crt mbedtls_debug_print_crt -#define debug_print_ecp mbedtls_debug_print_ecp -#define debug_print_mpi mbedtls_debug_print_mpi -#define debug_print_msg mbedtls_debug_print_msg -#define debug_print_ret mbedtls_debug_print_ret -#define debug_set_log_mode mbedtls_debug_set_log_mode -#define debug_set_threshold mbedtls_debug_set_threshold -#define des3_context mbedtls_des3_context -#define des3_crypt_cbc mbedtls_des3_crypt_cbc -#define des3_crypt_ecb mbedtls_des3_crypt_ecb -#define des3_free mbedtls_des3_free -#define des3_init mbedtls_des3_init -#define des3_set2key_dec mbedtls_des3_set2key_dec -#define des3_set2key_enc mbedtls_des3_set2key_enc -#define des3_set3key_dec mbedtls_des3_set3key_dec -#define des3_set3key_enc mbedtls_des3_set3key_enc -#define des_context mbedtls_des_context -#define des_crypt_cbc mbedtls_des_crypt_cbc -#define des_crypt_ecb mbedtls_des_crypt_ecb -#define des_free mbedtls_des_free -#define des_init mbedtls_des_init -#define des_key_check_key_parity mbedtls_des_key_check_key_parity -#define des_key_check_weak mbedtls_des_key_check_weak -#define des_key_set_parity mbedtls_des_key_set_parity -#define des_self_test mbedtls_des_self_test -#define des_setkey_dec mbedtls_des_setkey_dec -#define des_setkey_enc mbedtls_des_setkey_enc -#define dhm_calc_secret mbedtls_dhm_calc_secret -#define dhm_context mbedtls_dhm_context -#define dhm_free mbedtls_dhm_free -#define dhm_init mbedtls_dhm_init -#define dhm_make_params mbedtls_dhm_make_params -#define dhm_make_public mbedtls_dhm_make_public -#define dhm_parse_dhm mbedtls_dhm_parse_dhm -#define dhm_parse_dhmfile mbedtls_dhm_parse_dhmfile -#define dhm_read_params mbedtls_dhm_read_params -#define dhm_read_public mbedtls_dhm_read_public -#define dhm_self_test mbedtls_dhm_self_test -#define ecdh_calc_secret mbedtls_ecdh_calc_secret -#define ecdh_compute_shared mbedtls_ecdh_compute_shared -#define ecdh_context mbedtls_ecdh_context -#define ecdh_free mbedtls_ecdh_free -#define ecdh_gen_public mbedtls_ecdh_gen_public -#define ecdh_get_params mbedtls_ecdh_get_params -#define ecdh_init mbedtls_ecdh_init -#define ecdh_make_params mbedtls_ecdh_make_params -#define ecdh_make_public mbedtls_ecdh_make_public -#define ecdh_read_params mbedtls_ecdh_read_params -#define ecdh_read_public mbedtls_ecdh_read_public -#define ecdh_self_test mbedtls_ecdh_self_test -#define ecdh_side mbedtls_ecdh_side -#define ecdsa_context mbedtls_ecdsa_context -#define ecdsa_free mbedtls_ecdsa_free -#define ecdsa_from_keypair mbedtls_ecdsa_from_keypair -#define ecdsa_genkey mbedtls_ecdsa_genkey -#define ecdsa_info mbedtls_ecdsa_info -#define ecdsa_init mbedtls_ecdsa_init -#define ecdsa_read_signature mbedtls_ecdsa_read_signature -#define ecdsa_self_test mbedtls_ecdsa_self_test -#define ecdsa_sign mbedtls_ecdsa_sign -#define ecdsa_sign_det mbedtls_ecdsa_sign_det -#define ecdsa_verify mbedtls_ecdsa_verify -#define ecdsa_write_signature mbedtls_ecdsa_write_signature -#define ecdsa_write_signature_det mbedtls_ecdsa_write_signature_det -#define eckey_info mbedtls_eckey_info -#define eckeydh_info mbedtls_eckeydh_info -#define ecp_add mbedtls_ecp_add -#define ecp_check_privkey mbedtls_ecp_check_privkey -#define ecp_check_pub_priv mbedtls_ecp_check_pub_priv -#define ecp_check_pubkey mbedtls_ecp_check_pubkey -#define ecp_copy mbedtls_ecp_copy -#define ecp_curve_info mbedtls_ecp_curve_info -#define ecp_curve_info_from_grp_id mbedtls_ecp_curve_info_from_grp_id -#define ecp_curve_info_from_name mbedtls_ecp_curve_info_from_name -#define ecp_curve_info_from_tls_id mbedtls_ecp_curve_info_from_tls_id -#define ecp_curve_list mbedtls_ecp_curve_list -#define ecp_gen_key mbedtls_ecp_gen_key -#define ecp_gen_keypair mbedtls_ecp_gen_keypair -#define ecp_group mbedtls_ecp_group -#define ecp_group_copy mbedtls_ecp_group_copy -#define ecp_group_free mbedtls_ecp_group_free -#define ecp_group_id mbedtls_ecp_group_id -#define ecp_group_init mbedtls_ecp_group_init -#define ecp_group_read_string mbedtls_ecp_group_read_string -#define ecp_grp_id_list mbedtls_ecp_grp_id_list -#define ecp_is_zero mbedtls_ecp_is_zero -#define ecp_keypair mbedtls_ecp_keypair -#define ecp_keypair_free mbedtls_ecp_keypair_free -#define ecp_keypair_init mbedtls_ecp_keypair_init -#define ecp_mul mbedtls_ecp_mul -#define ecp_point mbedtls_ecp_point -#define ecp_point_free mbedtls_ecp_point_free -#define ecp_point_init mbedtls_ecp_point_init -#define ecp_point_read_binary mbedtls_ecp_point_read_binary -#define ecp_point_read_string mbedtls_ecp_point_read_string -#define ecp_point_write_binary mbedtls_ecp_point_write_binary -#define ecp_self_test mbedtls_ecp_self_test -#define ecp_set_zero mbedtls_ecp_set_zero -#define ecp_sub mbedtls_ecp_sub -#define ecp_tls_read_group mbedtls_ecp_tls_read_group -#define ecp_tls_read_point mbedtls_ecp_tls_read_point -#define ecp_tls_write_group mbedtls_ecp_tls_write_group -#define ecp_tls_write_point mbedtls_ecp_tls_write_point -#define ecp_use_known_dp mbedtls_ecp_group_load -#define entropy_add_source mbedtls_entropy_add_source -#define entropy_context mbedtls_entropy_context -#define entropy_free mbedtls_entropy_free -#define entropy_func mbedtls_entropy_func -#define entropy_gather mbedtls_entropy_gather -#define entropy_init mbedtls_entropy_init -#define entropy_self_test mbedtls_entropy_self_test -#define entropy_update_manual mbedtls_entropy_update_manual -#define entropy_update_seed_file mbedtls_entropy_update_seed_file -#define entropy_write_seed_file mbedtls_entropy_write_seed_file -#define error_strerror mbedtls_strerror -#define f_source_ptr mbedtls_entropy_f_source_ptr -#define gcm_auth_decrypt mbedtls_gcm_auth_decrypt -#define gcm_context mbedtls_gcm_context -#define gcm_crypt_and_tag mbedtls_gcm_crypt_and_tag -#define gcm_finish mbedtls_gcm_finish -#define gcm_free mbedtls_gcm_free -#define gcm_init mbedtls_gcm_init -#define gcm_self_test mbedtls_gcm_self_test -#define gcm_starts mbedtls_gcm_starts -#define gcm_update mbedtls_gcm_update -#define get_timer mbedtls_timing_get_timer -#define hardclock mbedtls_timing_hardclock -#define hardclock_poll mbedtls_hardclock_poll -#define havege_free mbedtls_havege_free -#define havege_init mbedtls_havege_init -#define havege_poll mbedtls_havege_poll -#define havege_random mbedtls_havege_random -#define havege_state mbedtls_havege_state -#define hmac_drbg_context mbedtls_hmac_drbg_context -#define hmac_drbg_free mbedtls_hmac_drbg_free -#define hmac_drbg_init mbedtls_hmac_drbg_init -#define hmac_drbg_init_buf mbedtls_hmac_drbg_init_buf -#define hmac_drbg_random mbedtls_hmac_drbg_random -#define hmac_drbg_random_with_add mbedtls_hmac_drbg_random_with_add -#define hmac_drbg_reseed mbedtls_hmac_drbg_reseed -#define hmac_drbg_self_test mbedtls_hmac_drbg_self_test -#define hmac_drbg_set_entropy_len mbedtls_hmac_drbg_set_entropy_len -#define hmac_drbg_set_prediction_resistance mbedtls_hmac_drbg_set_prediction_resistance -#define hmac_drbg_set_reseed_interval mbedtls_hmac_drbg_set_reseed_interval -#define hmac_drbg_update mbedtls_hmac_drbg_update -#define hmac_drbg_update_seed_file mbedtls_hmac_drbg_update_seed_file -#define hmac_drbg_write_seed_file mbedtls_hmac_drbg_write_seed_file -#define hr_time mbedtls_timing_hr_time -#define key_exchange_type_t mbedtls_key_exchange_type_t -#define md mbedtls_md -#define md2 mbedtls_md2 -#define md2_context mbedtls_md2_context -#define md2_file mbedtls_md2_file -#define md2_finish mbedtls_md2_finish -#define md2_free mbedtls_md2_free -#define md2_hmac mbedtls_md2_hmac -#define md2_hmac_finish mbedtls_md2_hmac_finish -#define md2_hmac_reset mbedtls_md2_hmac_reset -#define md2_hmac_starts mbedtls_md2_hmac_starts -#define md2_hmac_update mbedtls_md2_hmac_update -#define md2_info mbedtls_md2_info -#define md2_init mbedtls_md2_init -#define md2_process mbedtls_md2_process -#define md2_self_test mbedtls_md2_self_test -#define md2_starts mbedtls_md2_starts -#define md2_update mbedtls_md2_update -#define md4 mbedtls_md4 -#define md4_context mbedtls_md4_context -#define md4_file mbedtls_md4_file -#define md4_finish mbedtls_md4_finish -#define md4_free mbedtls_md4_free -#define md4_hmac mbedtls_md4_hmac -#define md4_hmac_finish mbedtls_md4_hmac_finish -#define md4_hmac_reset mbedtls_md4_hmac_reset -#define md4_hmac_starts mbedtls_md4_hmac_starts -#define md4_hmac_update mbedtls_md4_hmac_update -#define md4_info mbedtls_md4_info -#define md4_init mbedtls_md4_init -#define md4_process mbedtls_md4_process -#define md4_self_test mbedtls_md4_self_test -#define md4_starts mbedtls_md4_starts -#define md4_update mbedtls_md4_update -#define md5 mbedtls_md5 -#define md5_context mbedtls_md5_context -#define md5_file mbedtls_md5_file -#define md5_finish mbedtls_md5_finish -#define md5_free mbedtls_md5_free -#define md5_hmac mbedtls_md5_hmac -#define md5_hmac_finish mbedtls_md5_hmac_finish -#define md5_hmac_reset mbedtls_md5_hmac_reset -#define md5_hmac_starts mbedtls_md5_hmac_starts -#define md5_hmac_update mbedtls_md5_hmac_update -#define md5_info mbedtls_md5_info -#define md5_init mbedtls_md5_init -#define md5_process mbedtls_md5_process -#define md5_self_test mbedtls_md5_self_test -#define md5_starts mbedtls_md5_starts -#define md5_update mbedtls_md5_update -#define md_context_t mbedtls_md_context_t -#define md_file mbedtls_md_file -#define md_finish mbedtls_md_finish -#define md_free mbedtls_md_free -#define md_free_ctx mbedtls_md_free_ctx -#define md_get_name mbedtls_md_get_name -#define md_get_size mbedtls_md_get_size -#define md_get_type mbedtls_md_get_type -#define md_hmac mbedtls_md_hmac -#define md_hmac_finish mbedtls_md_hmac_finish -#define md_hmac_reset mbedtls_md_hmac_reset -#define md_hmac_starts mbedtls_md_hmac_starts -#define md_hmac_update mbedtls_md_hmac_update -#define md_info_from_string mbedtls_md_info_from_string -#define md_info_from_type mbedtls_md_info_from_type -#define md_info_t mbedtls_md_info_t -#define md_init mbedtls_md_init -#define md_init_ctx mbedtls_md_init_ctx -#define md_list mbedtls_md_list -#define md_process mbedtls_md_process -#define md_starts mbedtls_md_starts -#define md_type_t mbedtls_md_type_t -#define md_update mbedtls_md_update -#define memory_buffer_alloc_cur_get mbedtls_memory_buffer_alloc_cur_get -#define memory_buffer_alloc_free mbedtls_memory_buffer_alloc_free -#define memory_buffer_alloc_init mbedtls_memory_buffer_alloc_init -#define memory_buffer_alloc_max_get mbedtls_memory_buffer_alloc_max_get -#define memory_buffer_alloc_max_reset mbedtls_memory_buffer_alloc_max_reset -#define memory_buffer_alloc_self_test mbedtls_memory_buffer_alloc_self_test -#define memory_buffer_alloc_status mbedtls_memory_buffer_alloc_status -#define memory_buffer_alloc_verify mbedtls_memory_buffer_alloc_verify -#define memory_buffer_set_verify mbedtls_memory_buffer_set_verify -#define memory_set_own mbedtls_memory_set_own -#define mpi mbedtls_mpi -#define mpi_add_abs mbedtls_mpi_add_abs -#define mpi_add_int mbedtls_mpi_add_int -#define mpi_add_mpi mbedtls_mpi_add_mpi -#define mpi_cmp_abs mbedtls_mpi_cmp_abs -#define mpi_cmp_int mbedtls_mpi_cmp_int -#define mpi_cmp_mpi mbedtls_mpi_cmp_mpi -#define mpi_copy mbedtls_mpi_copy -#define mpi_div_int mbedtls_mpi_div_int -#define mpi_div_mpi mbedtls_mpi_div_mpi -#define mpi_exp_mod mbedtls_mpi_exp_mod -#define mpi_fill_random mbedtls_mpi_fill_random -#define mpi_free mbedtls_mpi_free -#define mpi_gcd mbedtls_mpi_gcd -#define mpi_gen_prime mbedtls_mpi_gen_prime -#define mpi_get_bit mbedtls_mpi_get_bit -#define mpi_grow mbedtls_mpi_grow -#define mpi_init mbedtls_mpi_init -#define mpi_inv_mod mbedtls_mpi_inv_mod -#define mpi_is_prime mbedtls_mpi_is_prime -#define mpi_lsb mbedtls_mpi_lsb -#define mpi_lset mbedtls_mpi_lset -#define mpi_mod_int mbedtls_mpi_mod_int -#define mpi_mod_mpi mbedtls_mpi_mod_mpi -#define mpi_msb mbedtls_mpi_bitlen -#define mpi_mul_int mbedtls_mpi_mul_int -#define mpi_mul_mpi mbedtls_mpi_mul_mpi -#define mpi_read_binary mbedtls_mpi_read_binary -#define mpi_read_file mbedtls_mpi_read_file -#define mpi_read_string mbedtls_mpi_read_string -#define mpi_safe_cond_assign mbedtls_mpi_safe_cond_assign -#define mpi_safe_cond_swap mbedtls_mpi_safe_cond_swap -#define mpi_self_test mbedtls_mpi_self_test -#define mpi_set_bit mbedtls_mpi_set_bit -#define mpi_shift_l mbedtls_mpi_shift_l -#define mpi_shift_r mbedtls_mpi_shift_r -#define mpi_shrink mbedtls_mpi_shrink -#define mpi_size mbedtls_mpi_size -#define mpi_sub_abs mbedtls_mpi_sub_abs -#define mpi_sub_int mbedtls_mpi_sub_int -#define mpi_sub_mpi mbedtls_mpi_sub_mpi -#define mpi_swap mbedtls_mpi_swap -#define mpi_write_binary mbedtls_mpi_write_binary -#define mpi_write_file mbedtls_mpi_write_file -#define mpi_write_string mbedtls_mpi_write_string -#define net_accept mbedtls_net_accept -#define net_bind mbedtls_net_bind -#define net_close mbedtls_net_free -#define net_connect mbedtls_net_connect -#define net_recv mbedtls_net_recv -#define net_recv_timeout mbedtls_net_recv_timeout -#define net_send mbedtls_net_send -#define net_set_block mbedtls_net_set_block -#define net_set_nonblock mbedtls_net_set_nonblock -#define net_usleep mbedtls_net_usleep -#define oid_descriptor_t mbedtls_oid_descriptor_t -#define oid_get_attr_short_name mbedtls_oid_get_attr_short_name -#define oid_get_cipher_alg mbedtls_oid_get_cipher_alg -#define oid_get_ec_grp mbedtls_oid_get_ec_grp -#define oid_get_extended_key_usage mbedtls_oid_get_extended_key_usage -#define oid_get_md_alg mbedtls_oid_get_md_alg -#define oid_get_numeric_string mbedtls_oid_get_numeric_string -#define oid_get_oid_by_ec_grp mbedtls_oid_get_oid_by_ec_grp -#define oid_get_oid_by_md mbedtls_oid_get_oid_by_md -#define oid_get_oid_by_pk_alg mbedtls_oid_get_oid_by_pk_alg -#define oid_get_oid_by_sig_alg mbedtls_oid_get_oid_by_sig_alg -#define oid_get_pk_alg mbedtls_oid_get_pk_alg -#define oid_get_pkcs12_pbe_alg mbedtls_oid_get_pkcs12_pbe_alg -#define oid_get_sig_alg mbedtls_oid_get_sig_alg -#define oid_get_sig_alg_desc mbedtls_oid_get_sig_alg_desc -#define oid_get_x509_ext_type mbedtls_oid_get_x509_ext_type -#define operation_t mbedtls_operation_t -#define padlock_supports mbedtls_padlock_has_support -#define padlock_xcryptcbc mbedtls_padlock_xcryptcbc -#define padlock_xcryptecb mbedtls_padlock_xcryptecb -#define pbkdf2_hmac mbedtls_pbkdf2_hmac -#define pbkdf2_self_test mbedtls_pbkdf2_self_test -#define pem_context mbedtls_pem_context -#define pem_free mbedtls_pem_free -#define pem_init mbedtls_pem_init -#define pem_read_buffer mbedtls_pem_read_buffer -#define pem_write_buffer mbedtls_pem_write_buffer -#define pk_can_do mbedtls_pk_can_do -#define pk_check_pair mbedtls_pk_check_pair -#define pk_context mbedtls_pk_context -#define pk_debug mbedtls_pk_debug -#define pk_debug_item mbedtls_pk_debug_item -#define pk_debug_type mbedtls_pk_debug_type -#define pk_decrypt mbedtls_pk_decrypt -#define pk_ec mbedtls_pk_ec -#define pk_encrypt mbedtls_pk_encrypt -#define pk_free mbedtls_pk_free -#define pk_get_len mbedtls_pk_get_len -#define pk_get_name mbedtls_pk_get_name -#define pk_get_size mbedtls_pk_get_bitlen -#define pk_get_type mbedtls_pk_get_type -#define pk_info_from_type mbedtls_pk_info_from_type -#define pk_info_t mbedtls_pk_info_t -#define pk_init mbedtls_pk_init -#define pk_init_ctx mbedtls_pk_setup -#define pk_init_ctx_rsa_alt mbedtls_pk_setup_rsa_alt -#define pk_load_file mbedtls_pk_load_file -#define pk_parse_key mbedtls_pk_parse_key -#define pk_parse_keyfile mbedtls_pk_parse_keyfile -#define pk_parse_public_key mbedtls_pk_parse_public_key -#define pk_parse_public_keyfile mbedtls_pk_parse_public_keyfile -#define pk_parse_subpubkey mbedtls_pk_parse_subpubkey -#define pk_rsa mbedtls_pk_rsa -#define pk_rsa_alt_decrypt_func mbedtls_pk_rsa_alt_decrypt_func -#define pk_rsa_alt_key_len_func mbedtls_pk_rsa_alt_key_len_func -#define pk_rsa_alt_sign_func mbedtls_pk_rsa_alt_sign_func -#define pk_rsassa_pss_options mbedtls_pk_rsassa_pss_options -#define pk_sign mbedtls_pk_sign -#define pk_type_t mbedtls_pk_type_t -#define pk_verify mbedtls_pk_verify -#define pk_verify_ext mbedtls_pk_verify_ext -#define pk_write_key_der mbedtls_pk_write_key_der -#define pk_write_key_pem mbedtls_pk_write_key_pem -#define pk_write_pubkey mbedtls_pk_write_pubkey -#define pk_write_pubkey_der mbedtls_pk_write_pubkey_der -#define pk_write_pubkey_pem mbedtls_pk_write_pubkey_pem -#define pkcs11_context mbedtls_pkcs11_context -#define pkcs11_decrypt mbedtls_pkcs11_decrypt -#define pkcs11_priv_key_free mbedtls_pkcs11_priv_key_free -#define pkcs11_priv_key_init mbedtls_pkcs11_priv_key_bind -#define pkcs11_sign mbedtls_pkcs11_sign -#define pkcs11_x509_cert_init mbedtls_pkcs11_x509_cert_bind -#define pkcs12_derivation mbedtls_pkcs12_derivation -#define pkcs12_pbe mbedtls_pkcs12_pbe -#define pkcs12_pbe_sha1_rc4_128 mbedtls_pkcs12_pbe_sha1_rc4_128 -#define pkcs5_pbes2 mbedtls_pkcs5_pbes2 -#define pkcs5_pbkdf2_hmac mbedtls_pkcs5_pbkdf2_hmac -#define pkcs5_self_test mbedtls_pkcs5_self_test -#define platform_entropy_poll mbedtls_platform_entropy_poll -#define platform_set_exit mbedtls_platform_set_exit -#define platform_set_fprintf mbedtls_platform_set_fprintf -#define platform_set_malloc_free mbedtls_platform_set_malloc_free -#define platform_set_printf mbedtls_platform_set_printf -#define platform_set_snprintf mbedtls_platform_set_snprintf -#define polarssl_exit mbedtls_exit -#define polarssl_fprintf mbedtls_fprintf -#define polarssl_free mbedtls_free -#define polarssl_malloc mbedtls_malloc -#define polarssl_mutex_free mbedtls_mutex_free -#define polarssl_mutex_init mbedtls_mutex_init -#define polarssl_mutex_lock mbedtls_mutex_lock -#define polarssl_mutex_unlock mbedtls_mutex_unlock -#define polarssl_printf mbedtls_printf -#define polarssl_snprintf mbedtls_snprintf -#define polarssl_strerror mbedtls_strerror -#define ripemd160 mbedtls_ripemd160 -#define ripemd160_context mbedtls_ripemd160_context -#define ripemd160_file mbedtls_ripemd160_file -#define ripemd160_finish mbedtls_ripemd160_finish -#define ripemd160_free mbedtls_ripemd160_free -#define ripemd160_hmac mbedtls_ripemd160_hmac -#define ripemd160_hmac_finish mbedtls_ripemd160_hmac_finish -#define ripemd160_hmac_reset mbedtls_ripemd160_hmac_reset -#define ripemd160_hmac_starts mbedtls_ripemd160_hmac_starts -#define ripemd160_hmac_update mbedtls_ripemd160_hmac_update -#define ripemd160_info mbedtls_ripemd160_info -#define ripemd160_init mbedtls_ripemd160_init -#define ripemd160_process mbedtls_ripemd160_process -#define ripemd160_self_test mbedtls_ripemd160_self_test -#define ripemd160_starts mbedtls_ripemd160_starts -#define ripemd160_update mbedtls_ripemd160_update -#define rsa_alt_context mbedtls_rsa_alt_context -#define rsa_alt_info mbedtls_rsa_alt_info -#define rsa_check_privkey mbedtls_rsa_check_privkey -#define rsa_check_pub_priv mbedtls_rsa_check_pub_priv -#define rsa_check_pubkey mbedtls_rsa_check_pubkey -#define rsa_context mbedtls_rsa_context -#define rsa_copy mbedtls_rsa_copy -#define rsa_decrypt_func mbedtls_rsa_decrypt_func -#define rsa_free mbedtls_rsa_free -#define rsa_gen_key mbedtls_rsa_gen_key -#define rsa_info mbedtls_rsa_info -#define rsa_init mbedtls_rsa_init -#define rsa_key_len_func mbedtls_rsa_key_len_func -#define rsa_pkcs1_decrypt mbedtls_rsa_pkcs1_decrypt -#define rsa_pkcs1_encrypt mbedtls_rsa_pkcs1_encrypt -#define rsa_pkcs1_sign mbedtls_rsa_pkcs1_sign -#define rsa_pkcs1_verify mbedtls_rsa_pkcs1_verify -#define rsa_private mbedtls_rsa_private -#define rsa_public mbedtls_rsa_public -#define rsa_rsaes_oaep_decrypt mbedtls_rsa_rsaes_oaep_decrypt -#define rsa_rsaes_oaep_encrypt mbedtls_rsa_rsaes_oaep_encrypt -#define rsa_rsaes_pkcs1_v15_decrypt mbedtls_rsa_rsaes_pkcs1_v15_decrypt -#define rsa_rsaes_pkcs1_v15_encrypt mbedtls_rsa_rsaes_pkcs1_v15_encrypt -#define rsa_rsassa_pkcs1_v15_sign mbedtls_rsa_rsassa_pkcs1_v15_sign -#define rsa_rsassa_pkcs1_v15_verify mbedtls_rsa_rsassa_pkcs1_v15_verify -#define rsa_rsassa_pss_sign mbedtls_rsa_rsassa_pss_sign -#define rsa_rsassa_pss_verify mbedtls_rsa_rsassa_pss_verify -#define rsa_rsassa_pss_verify_ext mbedtls_rsa_rsassa_pss_verify_ext -#define rsa_self_test mbedtls_rsa_self_test -#define rsa_set_padding mbedtls_rsa_set_padding -#define rsa_sign_func mbedtls_rsa_sign_func -#define safer_memcmp mbedtls_ssl_safer_memcmp -#define set_alarm mbedtls_set_alarm -#define sha1 mbedtls_sha1 -#define sha1_context mbedtls_sha1_context -#define sha1_file mbedtls_sha1_file -#define sha1_finish mbedtls_sha1_finish -#define sha1_free mbedtls_sha1_free -#define sha1_hmac mbedtls_sha1_hmac -#define sha1_hmac_finish mbedtls_sha1_hmac_finish -#define sha1_hmac_reset mbedtls_sha1_hmac_reset -#define sha1_hmac_starts mbedtls_sha1_hmac_starts -#define sha1_hmac_update mbedtls_sha1_hmac_update -#define sha1_info mbedtls_sha1_info -#define sha1_init mbedtls_sha1_init -#define sha1_process mbedtls_sha1_process -#define sha1_self_test mbedtls_sha1_self_test -#define sha1_starts mbedtls_sha1_starts -#define sha1_update mbedtls_sha1_update -#define sha224_info mbedtls_sha224_info -#define sha256 mbedtls_sha256 -#define sha256_context mbedtls_sha256_context -#define sha256_file mbedtls_sha256_file -#define sha256_finish mbedtls_sha256_finish -#define sha256_free mbedtls_sha256_free -#define sha256_hmac mbedtls_sha256_hmac -#define sha256_hmac_finish mbedtls_sha256_hmac_finish -#define sha256_hmac_reset mbedtls_sha256_hmac_reset -#define sha256_hmac_starts mbedtls_sha256_hmac_starts -#define sha256_hmac_update mbedtls_sha256_hmac_update -#define sha256_info mbedtls_sha256_info -#define sha256_init mbedtls_sha256_init -#define sha256_process mbedtls_sha256_process -#define sha256_self_test mbedtls_sha256_self_test -#define sha256_starts mbedtls_sha256_starts -#define sha256_update mbedtls_sha256_update -#define sha384_info mbedtls_sha384_info -#define sha512 mbedtls_sha512 -#define sha512_context mbedtls_sha512_context -#define sha512_file mbedtls_sha512_file -#define sha512_finish mbedtls_sha512_finish -#define sha512_free mbedtls_sha512_free -#define sha512_hmac mbedtls_sha512_hmac -#define sha512_hmac_finish mbedtls_sha512_hmac_finish -#define sha512_hmac_reset mbedtls_sha512_hmac_reset -#define sha512_hmac_starts mbedtls_sha512_hmac_starts -#define sha512_hmac_update mbedtls_sha512_hmac_update -#define sha512_info mbedtls_sha512_info -#define sha512_init mbedtls_sha512_init -#define sha512_process mbedtls_sha512_process -#define sha512_self_test mbedtls_sha512_self_test -#define sha512_starts mbedtls_sha512_starts -#define sha512_update mbedtls_sha512_update -#define source_state mbedtls_entropy_source_state -#define ssl_cache_context mbedtls_ssl_cache_context -#define ssl_cache_entry mbedtls_ssl_cache_entry -#define ssl_cache_free mbedtls_ssl_cache_free -#define ssl_cache_get mbedtls_ssl_cache_get -#define ssl_cache_init mbedtls_ssl_cache_init -#define ssl_cache_set mbedtls_ssl_cache_set -#define ssl_cache_set_max_entries mbedtls_ssl_cache_set_max_entries -#define ssl_cache_set_timeout mbedtls_ssl_cache_set_timeout -#define ssl_check_cert_usage mbedtls_ssl_check_cert_usage -#define ssl_ciphersuite_from_id mbedtls_ssl_ciphersuite_from_id -#define ssl_ciphersuite_from_string mbedtls_ssl_ciphersuite_from_string -#define ssl_ciphersuite_t mbedtls_ssl_ciphersuite_t -#define ssl_ciphersuite_uses_ec mbedtls_ssl_ciphersuite_uses_ec -#define ssl_ciphersuite_uses_psk mbedtls_ssl_ciphersuite_uses_psk -#define ssl_close_notify mbedtls_ssl_close_notify -#define ssl_context mbedtls_ssl_context -#define ssl_cookie_check mbedtls_ssl_cookie_check -#define ssl_cookie_check_t mbedtls_ssl_cookie_check_t -#define ssl_cookie_ctx mbedtls_ssl_cookie_ctx -#define ssl_cookie_free mbedtls_ssl_cookie_free -#define ssl_cookie_init mbedtls_ssl_cookie_init -#define ssl_cookie_set_timeout mbedtls_ssl_cookie_set_timeout -#define ssl_cookie_setup mbedtls_ssl_cookie_setup -#define ssl_cookie_write mbedtls_ssl_cookie_write -#define ssl_cookie_write_t mbedtls_ssl_cookie_write_t -#define ssl_curve_is_acceptable mbedtls_ssl_curve_is_acceptable -#define ssl_derive_keys mbedtls_ssl_derive_keys -#define ssl_dtls_replay_check mbedtls_ssl_dtls_replay_check -#define ssl_dtls_replay_update mbedtls_ssl_dtls_replay_update -#define ssl_fetch_input mbedtls_ssl_fetch_input -#define ssl_flight_item mbedtls_ssl_flight_item -#define ssl_flush_output mbedtls_ssl_flush_output -#define ssl_free mbedtls_ssl_free -#define ssl_get_alpn_protocol mbedtls_ssl_get_alpn_protocol -#define ssl_get_bytes_avail mbedtls_ssl_get_bytes_avail -#define ssl_get_ciphersuite mbedtls_ssl_get_ciphersuite -#define ssl_get_ciphersuite_id mbedtls_ssl_get_ciphersuite_id -#define ssl_get_ciphersuite_name mbedtls_ssl_get_ciphersuite_name -#define ssl_get_ciphersuite_sig_pk_alg mbedtls_ssl_get_ciphersuite_sig_pk_alg -#define ssl_get_peer_cert mbedtls_ssl_get_peer_cert -#define ssl_get_record_expansion mbedtls_ssl_get_record_expansion -#define ssl_get_session mbedtls_ssl_get_session -#define ssl_get_verify_result mbedtls_ssl_get_verify_result -#define ssl_get_version mbedtls_ssl_get_version -#define ssl_handshake mbedtls_ssl_handshake -#define ssl_handshake_client_step mbedtls_ssl_handshake_client_step -#define ssl_handshake_free mbedtls_ssl_handshake_free -#define ssl_handshake_params mbedtls_ssl_handshake_params -#define ssl_handshake_server_step mbedtls_ssl_handshake_server_step -#define ssl_handshake_step mbedtls_ssl_handshake_step -#define ssl_handshake_wrapup mbedtls_ssl_handshake_wrapup -#define ssl_hdr_len mbedtls_ssl_hdr_len -#define ssl_hs_hdr_len mbedtls_ssl_hs_hdr_len -#define ssl_hw_record_activate mbedtls_ssl_hw_record_activate -#define ssl_hw_record_finish mbedtls_ssl_hw_record_finish -#define ssl_hw_record_init mbedtls_ssl_hw_record_init -#define ssl_hw_record_read mbedtls_ssl_hw_record_read -#define ssl_hw_record_reset mbedtls_ssl_hw_record_reset -#define ssl_hw_record_write mbedtls_ssl_hw_record_write -#define ssl_init mbedtls_ssl_init -#define ssl_key_cert mbedtls_ssl_key_cert -#define ssl_legacy_renegotiation mbedtls_ssl_conf_legacy_renegotiation -#define ssl_list_ciphersuites mbedtls_ssl_list_ciphersuites -#define ssl_md_alg_from_hash mbedtls_ssl_md_alg_from_hash -#define ssl_optimize_checksum mbedtls_ssl_optimize_checksum -#define ssl_own_cert mbedtls_ssl_own_cert -#define ssl_own_key mbedtls_ssl_own_key -#define ssl_parse_certificate mbedtls_ssl_parse_certificate -#define ssl_parse_change_cipher_spec mbedtls_ssl_parse_change_cipher_spec -#define ssl_parse_finished mbedtls_ssl_parse_finished -#define ssl_pk_alg_from_sig mbedtls_ssl_pk_alg_from_sig -#define ssl_pkcs11_decrypt mbedtls_ssl_pkcs11_decrypt -#define ssl_pkcs11_key_len mbedtls_ssl_pkcs11_key_len -#define ssl_pkcs11_sign mbedtls_ssl_pkcs11_sign -#define ssl_psk_derive_premaster mbedtls_ssl_psk_derive_premaster -#define ssl_read mbedtls_ssl_read -#define ssl_read_record mbedtls_ssl_read_record -#define ssl_read_version mbedtls_ssl_read_version -#define ssl_recv_flight_completed mbedtls_ssl_recv_flight_completed -#define ssl_renegotiate mbedtls_ssl_renegotiate -#define ssl_resend mbedtls_ssl_resend -#define ssl_reset_checksum mbedtls_ssl_reset_checksum -#define ssl_send_alert_message mbedtls_ssl_send_alert_message -#define ssl_send_fatal_handshake_failure mbedtls_ssl_send_fatal_handshake_failure -#define ssl_send_flight_completed mbedtls_ssl_send_flight_completed -#define ssl_session mbedtls_ssl_session -#define ssl_session_free mbedtls_ssl_session_free -#define ssl_session_init mbedtls_ssl_session_init -#define ssl_session_reset mbedtls_ssl_session_reset -#define ssl_set_alpn_protocols mbedtls_ssl_conf_alpn_protocols -#define ssl_set_arc4_support mbedtls_ssl_conf_arc4_support -#define ssl_set_authmode mbedtls_ssl_conf_authmode -#define ssl_set_bio mbedtls_ssl_set_bio -#define ssl_set_bio mbedtls_ssl_set_bio_timeout -#define ssl_set_ca_chain mbedtls_ssl_conf_ca_chain -#define ssl_set_cbc_record_splitting mbedtls_ssl_conf_cbc_record_splitting -#define ssl_set_ciphersuites mbedtls_ssl_conf_ciphersuites -#define ssl_set_ciphersuites_for_version mbedtls_ssl_conf_ciphersuites_for_version -#define ssl_set_client_transport_id mbedtls_ssl_set_client_transport_id -#define ssl_set_curves mbedtls_ssl_conf_curves -#define ssl_set_dbg mbedtls_ssl_conf_dbg -#define ssl_set_dh_param mbedtls_ssl_conf_dh_param -#define ssl_set_dh_param_ctx mbedtls_ssl_conf_dh_param_ctx -#define ssl_set_dtls_anti_replay mbedtls_ssl_conf_dtls_anti_replay -#define ssl_set_dtls_badmac_limit mbedtls_ssl_conf_dtls_badmac_limit -#define ssl_set_dtls_cookies mbedtls_ssl_conf_dtls_cookies -#define ssl_set_encrypt_then_mac mbedtls_ssl_conf_encrypt_then_mac -#define ssl_set_endpoint mbedtls_ssl_conf_endpoint -#define ssl_set_extended_master_secret mbedtls_ssl_conf_extended_master_secret -#define ssl_set_fallback mbedtls_ssl_conf_fallback -#define ssl_set_handshake_timeout mbedtls_ssl_conf_handshake_timeout -#define ssl_set_hostname mbedtls_ssl_set_hostname -#define ssl_set_max_frag_len mbedtls_ssl_conf_max_frag_len -#define ssl_set_max_version mbedtls_ssl_conf_max_version -#define ssl_set_min_version mbedtls_ssl_conf_min_version -#define ssl_set_own_cert mbedtls_ssl_conf_own_cert -#define ssl_set_own_cert_alt mbedtls_ssl_set_own_cert_alt -#define ssl_set_own_cert_rsa mbedtls_ssl_set_own_cert_rsa -#define ssl_set_psk mbedtls_ssl_conf_psk -#define ssl_set_psk_cb mbedtls_ssl_conf_psk_cb -#define ssl_set_renegotiation mbedtls_ssl_conf_renegotiation -#define ssl_set_renegotiation_enforced mbedtls_ssl_conf_renegotiation_enforced -#define ssl_set_renegotiation_period mbedtls_ssl_conf_renegotiation_period -#define ssl_set_rng mbedtls_ssl_conf_rng -#define ssl_set_session mbedtls_ssl_set_session -#define ssl_set_session_cache mbedtls_ssl_conf_session_cache -#define ssl_set_session_ticket_lifetime mbedtls_ssl_conf_session_ticket_lifetime -#define ssl_set_session_tickets mbedtls_ssl_conf_session_tickets -#define ssl_set_sni mbedtls_ssl_conf_sni -#define ssl_set_transport mbedtls_ssl_conf_transport -#define ssl_set_truncated_hmac mbedtls_ssl_conf_truncated_hmac -#define ssl_set_verify mbedtls_ssl_conf_verify -#define ssl_sig_from_pk mbedtls_ssl_sig_from_pk -#define ssl_states mbedtls_ssl_states -#define ssl_ticket_keys mbedtls_ssl_ticket_keys -#define ssl_transform mbedtls_ssl_transform -#define ssl_transform_free mbedtls_ssl_transform_free -#define ssl_write mbedtls_ssl_write -#define ssl_write_certificate mbedtls_ssl_write_certificate -#define ssl_write_change_cipher_spec mbedtls_ssl_write_change_cipher_spec -#define ssl_write_finished mbedtls_ssl_write_finished -#define ssl_write_record mbedtls_ssl_write_record -#define ssl_write_version mbedtls_ssl_write_version -#define supported_ciphers mbedtls_cipher_supported -#define t_sint mbedtls_mpi_sint -#define t_udbl mbedtls_t_udbl -#define t_uint mbedtls_mpi_uint -#define test_ca_crt mbedtls_test_ca_crt -#define test_ca_crt_ec mbedtls_test_ca_crt_ec -#define test_ca_crt_rsa mbedtls_test_ca_crt_rsa -#define test_ca_key mbedtls_test_ca_key -#define test_ca_key_ec mbedtls_test_ca_key_ec -#define test_ca_key_rsa mbedtls_test_ca_key_rsa -#define test_ca_list mbedtls_test_cas_pem -#define test_ca_pwd mbedtls_test_ca_pwd -#define test_ca_pwd_ec mbedtls_test_ca_pwd_ec -#define test_ca_pwd_rsa mbedtls_test_ca_pwd_rsa -#define test_cli_crt mbedtls_test_cli_crt -#define test_cli_crt_ec mbedtls_test_cli_crt_ec -#define test_cli_crt_rsa mbedtls_test_cli_crt_rsa -#define test_cli_key mbedtls_test_cli_key -#define test_cli_key_ec mbedtls_test_cli_key_ec -#define test_cli_key_rsa mbedtls_test_cli_key_rsa -#define test_dhm_params mbedtls_test_dhm_params -#define test_srv_crt mbedtls_test_srv_crt -#define test_srv_crt_ec mbedtls_test_srv_crt_ec -#define test_srv_crt_rsa mbedtls_test_srv_crt_rsa -#define test_srv_key mbedtls_test_srv_key -#define test_srv_key_ec mbedtls_test_srv_key_ec -#define test_srv_key_rsa mbedtls_test_srv_key_rsa -#define threading_mutex_t mbedtls_threading_mutex_t -#define threading_set_alt mbedtls_threading_set_alt -#define timing_self_test mbedtls_timing_self_test -#define version_check_feature mbedtls_version_check_feature -#define version_get_number mbedtls_version_get_number -#define version_get_string mbedtls_version_get_string -#define version_get_string_full mbedtls_version_get_string_full -#define x509_bitstring mbedtls_x509_bitstring -#define x509_buf mbedtls_x509_buf -#define x509_crl mbedtls_x509_crl -#define x509_crl_entry mbedtls_x509_crl_entry -#define x509_crl_free mbedtls_x509_crl_free -#define x509_crl_info mbedtls_x509_crl_info -#define x509_crl_init mbedtls_x509_crl_init -#define x509_crl_parse mbedtls_x509_crl_parse -#define x509_crl_parse_der mbedtls_x509_crl_parse_der -#define x509_crl_parse_file mbedtls_x509_crl_parse_file -#define x509_crt mbedtls_x509_crt -#define x509_crt_check_extended_key_usage mbedtls_x509_crt_check_extended_key_usage -#define x509_crt_check_key_usage mbedtls_x509_crt_check_key_usage -#define x509_crt_free mbedtls_x509_crt_free -#define x509_crt_info mbedtls_x509_crt_info -#define x509_crt_init mbedtls_x509_crt_init -#define x509_crt_parse mbedtls_x509_crt_parse -#define x509_crt_parse_der mbedtls_x509_crt_parse_der -#define x509_crt_parse_file mbedtls_x509_crt_parse_file -#define x509_crt_parse_path mbedtls_x509_crt_parse_path -#define x509_crt_revoked mbedtls_x509_crt_is_revoked -#define x509_crt_verify mbedtls_x509_crt_verify -#define x509_csr mbedtls_x509_csr -#define x509_csr_free mbedtls_x509_csr_free -#define x509_csr_info mbedtls_x509_csr_info -#define x509_csr_init mbedtls_x509_csr_init -#define x509_csr_parse mbedtls_x509_csr_parse -#define x509_csr_parse_der mbedtls_x509_csr_parse_der -#define x509_csr_parse_file mbedtls_x509_csr_parse_file -#define x509_dn_gets mbedtls_x509_dn_gets -#define x509_get_alg mbedtls_x509_get_alg -#define x509_get_alg_null mbedtls_x509_get_alg_null -#define x509_get_ext mbedtls_x509_get_ext -#define x509_get_name mbedtls_x509_get_name -#define x509_get_rsassa_pss_params mbedtls_x509_get_rsassa_pss_params -#define x509_get_serial mbedtls_x509_get_serial -#define x509_get_sig mbedtls_x509_get_sig -#define x509_get_sig_alg mbedtls_x509_get_sig_alg -#define x509_get_time mbedtls_x509_get_time -#define x509_key_size_helper mbedtls_x509_key_size_helper -#define x509_name mbedtls_x509_name -#define x509_oid_get_description mbedtls_x509_oid_get_description -#define x509_oid_get_numeric_string mbedtls_x509_oid_get_numeric_string -#define x509_self_test mbedtls_x509_self_test -#define x509_sequence mbedtls_x509_sequence -#define x509_serial_gets mbedtls_x509_serial_gets -#define x509_set_extension mbedtls_x509_set_extension -#define x509_sig_alg_gets mbedtls_x509_sig_alg_gets -#define x509_string_to_names mbedtls_x509_string_to_names -#define x509_time mbedtls_x509_time -#define x509_time_expired mbedtls_x509_time_is_past -#define x509_time_future mbedtls_x509_time_is_future -#define x509_write_extensions mbedtls_x509_write_extensions -#define x509_write_names mbedtls_x509_write_names -#define x509_write_sig mbedtls_x509_write_sig -#define x509write_cert mbedtls_x509write_cert -#define x509write_crt_der mbedtls_x509write_crt_der -#define x509write_crt_free mbedtls_x509write_crt_free -#define x509write_crt_init mbedtls_x509write_crt_init -#define x509write_crt_pem mbedtls_x509write_crt_pem -#define x509write_crt_set_authority_key_identifier mbedtls_x509write_crt_set_authority_key_identifier -#define x509write_crt_set_basic_constraints mbedtls_x509write_crt_set_basic_constraints -#define x509write_crt_set_extension mbedtls_x509write_crt_set_extension -#define x509write_crt_set_issuer_key mbedtls_x509write_crt_set_issuer_key -#define x509write_crt_set_issuer_name mbedtls_x509write_crt_set_issuer_name -#define x509write_crt_set_key_usage mbedtls_x509write_crt_set_key_usage -#define x509write_crt_set_md_alg mbedtls_x509write_crt_set_md_alg -#define x509write_crt_set_ns_cert_type mbedtls_x509write_crt_set_ns_cert_type -#define x509write_crt_set_serial mbedtls_x509write_crt_set_serial -#define x509write_crt_set_subject_key mbedtls_x509write_crt_set_subject_key -#define x509write_crt_set_subject_key_identifier mbedtls_x509write_crt_set_subject_key_identifier -#define x509write_crt_set_subject_name mbedtls_x509write_crt_set_subject_name -#define x509write_crt_set_validity mbedtls_x509write_crt_set_validity -#define x509write_crt_set_version mbedtls_x509write_crt_set_version -#define x509write_csr mbedtls_x509write_csr -#define x509write_csr_der mbedtls_x509write_csr_der -#define x509write_csr_free mbedtls_x509write_csr_free -#define x509write_csr_init mbedtls_x509write_csr_init -#define x509write_csr_pem mbedtls_x509write_csr_pem -#define x509write_csr_set_extension mbedtls_x509write_csr_set_extension -#define x509write_csr_set_key mbedtls_x509write_csr_set_key -#define x509write_csr_set_key_usage mbedtls_x509write_csr_set_key_usage -#define x509write_csr_set_md_alg mbedtls_x509write_csr_set_md_alg -#define x509write_csr_set_ns_cert_type mbedtls_x509write_csr_set_ns_cert_type -#define x509write_csr_set_subject_name mbedtls_x509write_csr_set_subject_name -#define xtea_context mbedtls_xtea_context -#define xtea_crypt_cbc mbedtls_xtea_crypt_cbc -#define xtea_crypt_ecb mbedtls_xtea_crypt_ecb -#define xtea_free mbedtls_xtea_free -#define xtea_init mbedtls_xtea_init -#define xtea_self_test mbedtls_xtea_self_test -#define xtea_setup mbedtls_xtea_setup - -#endif /* compat-1.3.h */ -#endif /* MBEDTLS_DEPRECATED_REMOVED */ diff --git a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/config.h b/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/config.h deleted file mode 100644 index 68153efd..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/config.h +++ /dev/null @@ -1,2462 +0,0 @@ -/** - * \file config.h - * - * \brief Configuration options (set of defines) - * - * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * This file is part of mbed TLS (https://tls.mbed.org) - */ - -/* - * This set of compile-time options may be used to enable - * or disable features selectively, and reduce the global - * memory footprint. - */ -#ifndef MBEDTLS_CONFIG_H -#define MBEDTLS_CONFIG_H - -#if defined(_MSC_VER) && !defined(_CRT_SECURE_NO_DEPRECATE) -#define _CRT_SECURE_NO_DEPRECATE 1 -#endif - -/** - * \name SECTION: System support - * - * This section sets system specific settings. - * \{ - */ - -/** - * \def MBEDTLS_HAVE_ASM - * - * The compiler has support for asm(). - * - * Requires support for asm() in compiler. - * - * Used in: - * library/timing.c - * library/padlock.c - * include/mbedtls/bn_mul.h - * - * Comment to disable the use of assembly code. - */ -#define MBEDTLS_HAVE_ASM - -/** - * \def MBEDTLS_HAVE_SSE2 - * - * CPU supports SSE2 instruction set. - * - * Uncomment if the CPU supports SSE2 (IA-32 specific). - */ -//#define MBEDTLS_HAVE_SSE2 - -/** - * \def MBEDTLS_HAVE_TIME - * - * System has time.h and time(). - * The time does not need to be correct, only time differences are used, - * by contrast with MBEDTLS_HAVE_TIME_DATE - * - * Comment if your system does not support time functions - */ -#define MBEDTLS_HAVE_TIME - -/** - * \def MBEDTLS_HAVE_TIME_DATE - * - * System has time.h and time(), gmtime() and the clock is correct. - * The time needs to be correct (not necesarily very accurate, but at least - * the date should be correct). This is used to verify the validity period of - * X.509 certificates. - * - * Comment if your system does not have a correct clock. - */ -#define MBEDTLS_HAVE_TIME_DATE - -/** - * \def MBEDTLS_PLATFORM_MEMORY - * - * Enable the memory allocation layer. - * - * By default mbed TLS uses the system-provided calloc() and free(). - * This allows different allocators (self-implemented or provided) to be - * provided to the platform abstraction layer. - * - * Enabling MBEDTLS_PLATFORM_MEMORY without the - * MBEDTLS_PLATFORM_{FREE,CALLOC}_MACROs will provide - * "mbedtls_platform_set_calloc_free()" allowing you to set an alternative calloc() and - * free() function pointer at runtime. - * - * Enabling MBEDTLS_PLATFORM_MEMORY and specifying - * MBEDTLS_PLATFORM_{CALLOC,FREE}_MACROs will allow you to specify the - * alternate function at compile time. - * - * Requires: MBEDTLS_PLATFORM_C - * - * Enable this layer to allow use of alternative memory allocators. - */ -//#define MBEDTLS_PLATFORM_MEMORY - -/** - * \def MBEDTLS_PLATFORM_NO_STD_FUNCTIONS - * - * Do not assign standard functions in the platform layer (e.g. calloc() to - * MBEDTLS_PLATFORM_STD_CALLOC and printf() to MBEDTLS_PLATFORM_STD_PRINTF) - * - * This makes sure there are no linking errors on platforms that do not support - * these functions. You will HAVE to provide alternatives, either at runtime - * via the platform_set_xxx() functions or at compile time by setting - * the MBEDTLS_PLATFORM_STD_XXX defines, or enabling a - * MBEDTLS_PLATFORM_XXX_MACRO. - * - * Requires: MBEDTLS_PLATFORM_C - * - * Uncomment to prevent default assignment of standard functions in the - * platform layer. - */ -//#define MBEDTLS_PLATFORM_NO_STD_FUNCTIONS - -/** - * \def MBEDTLS_PLATFORM_XXX_ALT - * - * Uncomment a macro to let mbed TLS support the function in the platform - * abstraction layer. - * - * Example: In case you uncomment MBEDTLS_PLATFORM_PRINTF_ALT, mbed TLS will - * provide a function "mbedtls_platform_set_printf()" that allows you to set an - * alternative printf function pointer. - * - * All these define require MBEDTLS_PLATFORM_C to be defined! - * - * \note MBEDTLS_PLATFORM_SNPRINTF_ALT is required on Windows; - * it will be enabled automatically by check_config.h - * - * \warning MBEDTLS_PLATFORM_XXX_ALT cannot be defined at the same time as - * MBEDTLS_PLATFORM_XXX_MACRO! - * - * Uncomment a macro to enable alternate implementation of specific base - * platform function - */ -//#define MBEDTLS_PLATFORM_EXIT_ALT -//#define MBEDTLS_PLATFORM_FPRINTF_ALT -//#define MBEDTLS_PLATFORM_PRINTF_ALT -//#define MBEDTLS_PLATFORM_SNPRINTF_ALT - -/** - * \def MBEDTLS_DEPRECATED_WARNING - * - * Mark deprecated functions so that they generate a warning if used. - * Functions deprecated in one version will usually be removed in the next - * version. You can enable this to help you prepare the transition to a new - * major version by making sure your code is not using these functions. - * - * This only works with GCC and Clang. With other compilers, you may want to - * use MBEDTLS_DEPRECATED_REMOVED - * - * Uncomment to get warnings on using deprecated functions. - */ -//#define MBEDTLS_DEPRECATED_WARNING - -/** - * \def MBEDTLS_DEPRECATED_REMOVED - * - * Remove deprecated functions so that they generate an error if used. - * Functions deprecated in one version will usually be removed in the next - * version. You can enable this to help you prepare the transition to a new - * major version by making sure your code is not using these functions. - * - * Uncomment to get errors on using deprecated functions. - */ -//#define MBEDTLS_DEPRECATED_REMOVED - -/* \} name SECTION: System support */ - -/** - * \name SECTION: mbed TLS feature support - * - * This section sets support for features that are or are not needed - * within the modules that are enabled. - * \{ - */ - -/** - * \def MBEDTLS_TIMING_ALT - * - * Uncomment to provide your own alternate implementation for mbedtls_timing_hardclock(), - * mbedtls_timing_get_timer(), mbedtls_set_alarm(), mbedtls_set/get_delay() - * - * Only works if you have MBEDTLS_TIMING_C enabled. - * - * You will need to provide a header "timing_alt.h" and an implementation at - * compile time. - */ -//#define MBEDTLS_TIMING_ALT - -/** - * \def MBEDTLS__MODULE_NAME__ALT - * - * Uncomment a macro to let mbed TLS use your alternate core implementation of - * a symmetric crypto or hash module (e.g. platform specific assembly - * optimized implementations). Keep in mind that the function prototypes - * should remain the same. - * - * This replaces the whole module. If you only want to replace one of the - * functions, use one of the MBEDTLS__FUNCTION_NAME__ALT flags. - * - * Example: In case you uncomment MBEDTLS_AES_ALT, mbed TLS will no longer - * provide the "struct mbedtls_aes_context" definition and omit the base function - * declarations and implementations. "aes_alt.h" will be included from - * "aes.h" to include the new function definitions. - * - * Uncomment a macro to enable alternate implementation of the corresponding - * module. - */ -//#define MBEDTLS_AES_ALT -//#define MBEDTLS_ARC4_ALT -//#define MBEDTLS_BLOWFISH_ALT -//#define MBEDTLS_CAMELLIA_ALT -//#define MBEDTLS_DES_ALT -//#define MBEDTLS_XTEA_ALT -//#define MBEDTLS_MD2_ALT -//#define MBEDTLS_MD4_ALT -//#define MBEDTLS_MD5_ALT -//#define MBEDTLS_RIPEMD160_ALT -//#define MBEDTLS_SHA1_ALT -//#define MBEDTLS_SHA256_ALT -//#define MBEDTLS_SHA512_ALT - -/** - * \def MBEDTLS__FUNCTION_NAME__ALT - * - * Uncomment a macro to let mbed TLS use you alternate core implementation of - * symmetric crypto or hash function. Keep in mind that function prototypes - * should remain the same. - * - * This replaces only one function. The header file from mbed TLS is still - * used, in contrast to the MBEDTLS__MODULE_NAME__ALT flags. - * - * Example: In case you uncomment MBEDTLS_SHA256_PROCESS_ALT, mbed TLS will - * no longer provide the mbedtls_sha1_process() function, but it will still provide - * the other function (using your mbedtls_sha1_process() function) and the definition - * of mbedtls_sha1_context, so your implementation of mbedtls_sha1_process must be compatible - * with this definition. - * - * Note: if you use the AES_xxx_ALT macros, then is is recommended to also set - * MBEDTLS_AES_ROM_TABLES in order to help the linker garbage-collect the AES - * tables. - * - * Uncomment a macro to enable alternate implementation of the corresponding - * function. - */ -//#define MBEDTLS_MD2_PROCESS_ALT -//#define MBEDTLS_MD4_PROCESS_ALT -//#define MBEDTLS_MD5_PROCESS_ALT -//#define MBEDTLS_RIPEMD160_PROCESS_ALT -//#define MBEDTLS_SHA1_PROCESS_ALT -//#define MBEDTLS_SHA256_PROCESS_ALT -//#define MBEDTLS_SHA512_PROCESS_ALT -//#define MBEDTLS_DES_SETKEY_ALT -//#define MBEDTLS_DES_CRYPT_ECB_ALT -//#define MBEDTLS_DES3_CRYPT_ECB_ALT -//#define MBEDTLS_AES_SETKEY_ENC_ALT -//#define MBEDTLS_AES_SETKEY_DEC_ALT -//#define MBEDTLS_AES_ENCRYPT_ALT -//#define MBEDTLS_AES_DECRYPT_ALT - -/** - * \def MBEDTLS_ENTROPY_HARDWARE_ALT - * - * Uncomment this macro to let mbed TLS use your own implementation of a - * hardware entropy collector. - * - * Your function must be called \c mbedtls_hardware_poll(), have the same - * prototype as declared in entropy_poll.h, and accept NULL as first argument. - * - * Uncomment to use your own hardware entropy collector. - */ -//#define MBEDTLS_ENTROPY_HARDWARE_ALT - -/** - * \def MBEDTLS_AES_ROM_TABLES - * - * Store the AES tables in ROM. - * - * Uncomment this macro to store the AES tables in ROM. - */ -//#define MBEDTLS_AES_ROM_TABLES - -/** - * \def MBEDTLS_CAMELLIA_SMALL_MEMORY - * - * Use less ROM for the Camellia implementation (saves about 768 bytes). - * - * Uncomment this macro to use less memory for Camellia. - */ -//#define MBEDTLS_CAMELLIA_SMALL_MEMORY - -/** - * \def MBEDTLS_CIPHER_MODE_CBC - * - * Enable Cipher Block Chaining mode (CBC) for symmetric ciphers. - */ -#define MBEDTLS_CIPHER_MODE_CBC - -/** - * \def MBEDTLS_CIPHER_MODE_CFB - * - * Enable Cipher Feedback mode (CFB) for symmetric ciphers. - */ -#define MBEDTLS_CIPHER_MODE_CFB - -/** - * \def MBEDTLS_CIPHER_MODE_CTR - * - * Enable Counter Block Cipher mode (CTR) for symmetric ciphers. - */ -#define MBEDTLS_CIPHER_MODE_CTR - -/** - * \def MBEDTLS_CIPHER_NULL_CIPHER - * - * Enable NULL cipher. - * Warning: Only do so when you know what you are doing. This allows for - * encryption or channels without any security! - * - * Requires MBEDTLS_ENABLE_WEAK_CIPHERSUITES as well to enable - * the following ciphersuites: - * MBEDTLS_TLS_ECDH_ECDSA_WITH_NULL_SHA - * MBEDTLS_TLS_ECDH_RSA_WITH_NULL_SHA - * MBEDTLS_TLS_ECDHE_ECDSA_WITH_NULL_SHA - * MBEDTLS_TLS_ECDHE_RSA_WITH_NULL_SHA - * MBEDTLS_TLS_ECDHE_PSK_WITH_NULL_SHA384 - * MBEDTLS_TLS_ECDHE_PSK_WITH_NULL_SHA256 - * MBEDTLS_TLS_ECDHE_PSK_WITH_NULL_SHA - * MBEDTLS_TLS_DHE_PSK_WITH_NULL_SHA384 - * MBEDTLS_TLS_DHE_PSK_WITH_NULL_SHA256 - * MBEDTLS_TLS_DHE_PSK_WITH_NULL_SHA - * MBEDTLS_TLS_RSA_WITH_NULL_SHA256 - * MBEDTLS_TLS_RSA_WITH_NULL_SHA - * MBEDTLS_TLS_RSA_WITH_NULL_MD5 - * MBEDTLS_TLS_RSA_PSK_WITH_NULL_SHA384 - * MBEDTLS_TLS_RSA_PSK_WITH_NULL_SHA256 - * MBEDTLS_TLS_RSA_PSK_WITH_NULL_SHA - * MBEDTLS_TLS_PSK_WITH_NULL_SHA384 - * MBEDTLS_TLS_PSK_WITH_NULL_SHA256 - * MBEDTLS_TLS_PSK_WITH_NULL_SHA - * - * Uncomment this macro to enable the NULL cipher and ciphersuites - */ -//#define MBEDTLS_CIPHER_NULL_CIPHER - -/** - * \def MBEDTLS_CIPHER_PADDING_XXX - * - * Uncomment or comment macros to add support for specific padding modes - * in the cipher layer with cipher modes that support padding (e.g. CBC) - * - * If you disable all padding modes, only full blocks can be used with CBC. - * - * Enable padding modes in the cipher layer. - */ -#define MBEDTLS_CIPHER_PADDING_PKCS7 -#define MBEDTLS_CIPHER_PADDING_ONE_AND_ZEROS -#define MBEDTLS_CIPHER_PADDING_ZEROS_AND_LEN -#define MBEDTLS_CIPHER_PADDING_ZEROS - -/** - * \def MBEDTLS_ENABLE_WEAK_CIPHERSUITES - * - * Enable weak ciphersuites in SSL / TLS. - * Warning: Only do so when you know what you are doing. This allows for - * channels with virtually no security at all! - * - * This enables the following ciphersuites: - * MBEDTLS_TLS_RSA_WITH_DES_CBC_SHA - * MBEDTLS_TLS_DHE_RSA_WITH_DES_CBC_SHA - * - * Uncomment this macro to enable weak ciphersuites - */ -//#define MBEDTLS_ENABLE_WEAK_CIPHERSUITES - -/** - * \def MBEDTLS_REMOVE_ARC4_CIPHERSUITES - * - * Remove RC4 ciphersuites by default in SSL / TLS. - * This flag removes the ciphersuites based on RC4 from the default list as - * returned by mbedtls_ssl_list_ciphersuites(). However, it is still possible to - * enable (some of) them with mbedtls_ssl_conf_ciphersuites() by including them - * explicitly. - * - * Uncomment this macro to remove RC4 ciphersuites by default. - */ -#define MBEDTLS_REMOVE_ARC4_CIPHERSUITES - -/** - * \def MBEDTLS_ECP_XXXX_ENABLED - * - * Enables specific curves within the Elliptic Curve module. - * By default all supported curves are enabled. - * - * Comment macros to disable the curve and functions for it - */ -#define MBEDTLS_ECP_DP_SECP192R1_ENABLED -#define MBEDTLS_ECP_DP_SECP224R1_ENABLED -#define MBEDTLS_ECP_DP_SECP256R1_ENABLED -#define MBEDTLS_ECP_DP_SECP384R1_ENABLED -#define MBEDTLS_ECP_DP_SECP521R1_ENABLED -#define MBEDTLS_ECP_DP_SECP192K1_ENABLED -#define MBEDTLS_ECP_DP_SECP224K1_ENABLED -#define MBEDTLS_ECP_DP_SECP256K1_ENABLED -#define MBEDTLS_ECP_DP_BP256R1_ENABLED -#define MBEDTLS_ECP_DP_BP384R1_ENABLED -#define MBEDTLS_ECP_DP_BP512R1_ENABLED -#define MBEDTLS_ECP_DP_CURVE25519_ENABLED - -/** - * \def MBEDTLS_ECP_NIST_OPTIM - * - * Enable specific 'modulo p' routines for each NIST prime. - * Depending on the prime and architecture, makes operations 4 to 8 times - * faster on the corresponding curve. - * - * Comment this macro to disable NIST curves optimisation. - */ -#define MBEDTLS_ECP_NIST_OPTIM - -/** - * \def MBEDTLS_ECDSA_DETERMINISTIC - * - * Enable deterministic ECDSA (RFC 6979). - * Standard ECDSA is "fragile" in the sense that lack of entropy when signing - * may result in a compromise of the long-term signing key. This is avoided by - * the deterministic variant. - * - * Requires: MBEDTLS_HMAC_DRBG_C - * - * Comment this macro to disable deterministic ECDSA. - */ -#define MBEDTLS_ECDSA_DETERMINISTIC - -/** - * \def MBEDTLS_KEY_EXCHANGE_PSK_ENABLED - * - * Enable the PSK based ciphersuite modes in SSL / TLS. - * - * This enables the following ciphersuites (if other requisites are - * enabled as well): - * MBEDTLS_TLS_PSK_WITH_AES_256_GCM_SHA384 - * MBEDTLS_TLS_PSK_WITH_AES_256_CBC_SHA384 - * MBEDTLS_TLS_PSK_WITH_AES_256_CBC_SHA - * MBEDTLS_TLS_PSK_WITH_CAMELLIA_256_GCM_SHA384 - * MBEDTLS_TLS_PSK_WITH_CAMELLIA_256_CBC_SHA384 - * MBEDTLS_TLS_PSK_WITH_AES_128_GCM_SHA256 - * MBEDTLS_TLS_PSK_WITH_AES_128_CBC_SHA256 - * MBEDTLS_TLS_PSK_WITH_AES_128_CBC_SHA - * MBEDTLS_TLS_PSK_WITH_CAMELLIA_128_GCM_SHA256 - * MBEDTLS_TLS_PSK_WITH_CAMELLIA_128_CBC_SHA256 - * MBEDTLS_TLS_PSK_WITH_3DES_EDE_CBC_SHA - * MBEDTLS_TLS_PSK_WITH_RC4_128_SHA - */ -#define MBEDTLS_KEY_EXCHANGE_PSK_ENABLED - -/** - * \def MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED - * - * Enable the DHE-PSK based ciphersuite modes in SSL / TLS. - * - * Requires: MBEDTLS_DHM_C - * - * This enables the following ciphersuites (if other requisites are - * enabled as well): - * MBEDTLS_TLS_DHE_PSK_WITH_AES_256_GCM_SHA384 - * MBEDTLS_TLS_DHE_PSK_WITH_AES_256_CBC_SHA384 - * MBEDTLS_TLS_DHE_PSK_WITH_AES_256_CBC_SHA - * MBEDTLS_TLS_DHE_PSK_WITH_CAMELLIA_256_GCM_SHA384 - * MBEDTLS_TLS_DHE_PSK_WITH_CAMELLIA_256_CBC_SHA384 - * MBEDTLS_TLS_DHE_PSK_WITH_AES_128_GCM_SHA256 - * MBEDTLS_TLS_DHE_PSK_WITH_AES_128_CBC_SHA256 - * MBEDTLS_TLS_DHE_PSK_WITH_AES_128_CBC_SHA - * MBEDTLS_TLS_DHE_PSK_WITH_CAMELLIA_128_GCM_SHA256 - * MBEDTLS_TLS_DHE_PSK_WITH_CAMELLIA_128_CBC_SHA256 - * MBEDTLS_TLS_DHE_PSK_WITH_3DES_EDE_CBC_SHA - * MBEDTLS_TLS_DHE_PSK_WITH_RC4_128_SHA - */ -#define MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED - -/** - * \def MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED - * - * Enable the ECDHE-PSK based ciphersuite modes in SSL / TLS. - * - * Requires: MBEDTLS_ECDH_C - * - * This enables the following ciphersuites (if other requisites are - * enabled as well): - * MBEDTLS_TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA384 - * MBEDTLS_TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA - * MBEDTLS_TLS_ECDHE_PSK_WITH_CAMELLIA_256_CBC_SHA384 - * MBEDTLS_TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256 - * MBEDTLS_TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA - * MBEDTLS_TLS_ECDHE_PSK_WITH_CAMELLIA_128_CBC_SHA256 - * MBEDTLS_TLS_ECDHE_PSK_WITH_3DES_EDE_CBC_SHA - * MBEDTLS_TLS_ECDHE_PSK_WITH_RC4_128_SHA - */ -#define MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED - -/** - * \def MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED - * - * Enable the RSA-PSK based ciphersuite modes in SSL / TLS. - * - * Requires: MBEDTLS_RSA_C, MBEDTLS_PKCS1_V15, - * MBEDTLS_X509_CRT_PARSE_C - * - * This enables the following ciphersuites (if other requisites are - * enabled as well): - * MBEDTLS_TLS_RSA_PSK_WITH_AES_256_GCM_SHA384 - * MBEDTLS_TLS_RSA_PSK_WITH_AES_256_CBC_SHA384 - * MBEDTLS_TLS_RSA_PSK_WITH_AES_256_CBC_SHA - * MBEDTLS_TLS_RSA_PSK_WITH_CAMELLIA_256_GCM_SHA384 - * MBEDTLS_TLS_RSA_PSK_WITH_CAMELLIA_256_CBC_SHA384 - * MBEDTLS_TLS_RSA_PSK_WITH_AES_128_GCM_SHA256 - * MBEDTLS_TLS_RSA_PSK_WITH_AES_128_CBC_SHA256 - * MBEDTLS_TLS_RSA_PSK_WITH_AES_128_CBC_SHA - * MBEDTLS_TLS_RSA_PSK_WITH_CAMELLIA_128_GCM_SHA256 - * MBEDTLS_TLS_RSA_PSK_WITH_CAMELLIA_128_CBC_SHA256 - * MBEDTLS_TLS_RSA_PSK_WITH_3DES_EDE_CBC_SHA - * MBEDTLS_TLS_RSA_PSK_WITH_RC4_128_SHA - */ -#define MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED - -/** - * \def MBEDTLS_KEY_EXCHANGE_RSA_ENABLED - * - * Enable the RSA-only based ciphersuite modes in SSL / TLS. - * - * Requires: MBEDTLS_RSA_C, MBEDTLS_PKCS1_V15, - * MBEDTLS_X509_CRT_PARSE_C - * - * This enables the following ciphersuites (if other requisites are - * enabled as well): - * MBEDTLS_TLS_RSA_WITH_AES_256_GCM_SHA384 - * MBEDTLS_TLS_RSA_WITH_AES_256_CBC_SHA256 - * MBEDTLS_TLS_RSA_WITH_AES_256_CBC_SHA - * MBEDTLS_TLS_RSA_WITH_CAMELLIA_256_GCM_SHA384 - * MBEDTLS_TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256 - * MBEDTLS_TLS_RSA_WITH_CAMELLIA_256_CBC_SHA - * MBEDTLS_TLS_RSA_WITH_AES_128_GCM_SHA256 - * MBEDTLS_TLS_RSA_WITH_AES_128_CBC_SHA256 - * MBEDTLS_TLS_RSA_WITH_AES_128_CBC_SHA - * MBEDTLS_TLS_RSA_WITH_CAMELLIA_128_GCM_SHA256 - * MBEDTLS_TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256 - * MBEDTLS_TLS_RSA_WITH_CAMELLIA_128_CBC_SHA - * MBEDTLS_TLS_RSA_WITH_3DES_EDE_CBC_SHA - * MBEDTLS_TLS_RSA_WITH_RC4_128_SHA - * MBEDTLS_TLS_RSA_WITH_RC4_128_MD5 - */ -#define MBEDTLS_KEY_EXCHANGE_RSA_ENABLED - -/** - * \def MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED - * - * Enable the DHE-RSA based ciphersuite modes in SSL / TLS. - * - * Requires: MBEDTLS_DHM_C, MBEDTLS_RSA_C, MBEDTLS_PKCS1_V15, - * MBEDTLS_X509_CRT_PARSE_C - * - * This enables the following ciphersuites (if other requisites are - * enabled as well): - * MBEDTLS_TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 - * MBEDTLS_TLS_DHE_RSA_WITH_AES_256_CBC_SHA256 - * MBEDTLS_TLS_DHE_RSA_WITH_AES_256_CBC_SHA - * MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_256_GCM_SHA384 - * MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256 - * MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA - * MBEDTLS_TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 - * MBEDTLS_TLS_DHE_RSA_WITH_AES_128_CBC_SHA256 - * MBEDTLS_TLS_DHE_RSA_WITH_AES_128_CBC_SHA - * MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_128_GCM_SHA256 - * MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256 - * MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA - * MBEDTLS_TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA - */ -#define MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED - -/** - * \def MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED - * - * Enable the ECDHE-RSA based ciphersuite modes in SSL / TLS. - * - * Requires: MBEDTLS_ECDH_C, MBEDTLS_RSA_C, MBEDTLS_PKCS1_V15, - * MBEDTLS_X509_CRT_PARSE_C - * - * This enables the following ciphersuites (if other requisites are - * enabled as well): - * MBEDTLS_TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 - * MBEDTLS_TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 - * MBEDTLS_TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA - * MBEDTLS_TLS_ECDHE_RSA_WITH_CAMELLIA_256_GCM_SHA384 - * MBEDTLS_TLS_ECDHE_RSA_WITH_CAMELLIA_256_CBC_SHA384 - * MBEDTLS_TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 - * MBEDTLS_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 - * MBEDTLS_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA - * MBEDTLS_TLS_ECDHE_RSA_WITH_CAMELLIA_128_GCM_SHA256 - * MBEDTLS_TLS_ECDHE_RSA_WITH_CAMELLIA_128_CBC_SHA256 - * MBEDTLS_TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA - * MBEDTLS_TLS_ECDHE_RSA_WITH_RC4_128_SHA - */ -#define MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED - -/** - * \def MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED - * - * Enable the ECDHE-ECDSA based ciphersuite modes in SSL / TLS. - * - * Requires: MBEDTLS_ECDH_C, MBEDTLS_ECDSA_C, MBEDTLS_X509_CRT_PARSE_C, - * - * This enables the following ciphersuites (if other requisites are - * enabled as well): - * MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 - * MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384 - * MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA - * MBEDTLS_TLS_ECDHE_ECDSA_WITH_CAMELLIA_256_GCM_SHA384 - * MBEDTLS_TLS_ECDHE_ECDSA_WITH_CAMELLIA_256_CBC_SHA384 - * MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 - * MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 - * MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA - * MBEDTLS_TLS_ECDHE_ECDSA_WITH_CAMELLIA_128_GCM_SHA256 - * MBEDTLS_TLS_ECDHE_ECDSA_WITH_CAMELLIA_128_CBC_SHA256 - * MBEDTLS_TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA - * MBEDTLS_TLS_ECDHE_ECDSA_WITH_RC4_128_SHA - */ -#define MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED - -/** - * \def MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED - * - * Enable the ECDH-ECDSA based ciphersuite modes in SSL / TLS. - * - * Requires: MBEDTLS_ECDH_C, MBEDTLS_X509_CRT_PARSE_C - * - * This enables the following ciphersuites (if other requisites are - * enabled as well): - * MBEDTLS_TLS_ECDH_ECDSA_WITH_RC4_128_SHA - * MBEDTLS_TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA - * MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA - * MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA - * MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256 - * MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384 - * MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256 - * MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384 - * MBEDTLS_TLS_ECDH_ECDSA_WITH_CAMELLIA_128_CBC_SHA256 - * MBEDTLS_TLS_ECDH_ECDSA_WITH_CAMELLIA_256_CBC_SHA384 - * MBEDTLS_TLS_ECDH_ECDSA_WITH_CAMELLIA_128_GCM_SHA256 - * MBEDTLS_TLS_ECDH_ECDSA_WITH_CAMELLIA_256_GCM_SHA384 - */ -#define MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED - -/** - * \def MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED - * - * Enable the ECDH-RSA based ciphersuite modes in SSL / TLS. - * - * Requires: MBEDTLS_ECDH_C, MBEDTLS_X509_CRT_PARSE_C - * - * This enables the following ciphersuites (if other requisites are - * enabled as well): - * MBEDTLS_TLS_ECDH_RSA_WITH_RC4_128_SHA - * MBEDTLS_TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA - * MBEDTLS_TLS_ECDH_RSA_WITH_AES_128_CBC_SHA - * MBEDTLS_TLS_ECDH_RSA_WITH_AES_256_CBC_SHA - * MBEDTLS_TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256 - * MBEDTLS_TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384 - * MBEDTLS_TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256 - * MBEDTLS_TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384 - * MBEDTLS_TLS_ECDH_RSA_WITH_CAMELLIA_128_CBC_SHA256 - * MBEDTLS_TLS_ECDH_RSA_WITH_CAMELLIA_256_CBC_SHA384 - * MBEDTLS_TLS_ECDH_RSA_WITH_CAMELLIA_128_GCM_SHA256 - * MBEDTLS_TLS_ECDH_RSA_WITH_CAMELLIA_256_GCM_SHA384 - */ -#define MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED - -/** - * \def MBEDTLS_PK_PARSE_EC_EXTENDED - * - * Enhance support for reading EC keys using variants of SEC1 not allowed by - * RFC 5915 and RFC 5480. - * - * Currently this means parsing the SpecifiedECDomain choice of EC - * parameters (only known groups are supported, not arbitrary domains, to - * avoid validation issues). - * - * Disable if you only need to support RFC 5915 + 5480 key formats. - */ -#define MBEDTLS_PK_PARSE_EC_EXTENDED - -/** - * \def MBEDTLS_ERROR_STRERROR_DUMMY - * - * Enable a dummy error function to make use of mbedtls_strerror() in - * third party libraries easier when MBEDTLS_ERROR_C is disabled - * (no effect when MBEDTLS_ERROR_C is enabled). - * - * You can safely disable this if MBEDTLS_ERROR_C is enabled, or if you're - * not using mbedtls_strerror() or error_strerror() in your application. - * - * Disable if you run into name conflicts and want to really remove the - * mbedtls_strerror() - */ -#define MBEDTLS_ERROR_STRERROR_DUMMY - -/** - * \def MBEDTLS_GENPRIME - * - * Enable the prime-number generation code. - * - * Requires: MBEDTLS_BIGNUM_C - */ -#define MBEDTLS_GENPRIME - -/** - * \def MBEDTLS_FS_IO - * - * Enable functions that use the filesystem. - */ -#define MBEDTLS_FS_IO - -/** - * \def MBEDTLS_NO_DEFAULT_ENTROPY_SOURCES - * - * Do not add default entropy sources. These are the platform specific, - * mbedtls_timing_hardclock and HAVEGE based poll functions. - * - * This is useful to have more control over the added entropy sources in an - * application. - * - * Uncomment this macro to prevent loading of default entropy functions. - */ -//#define MBEDTLS_NO_DEFAULT_ENTROPY_SOURCES - -/** - * \def MBEDTLS_NO_PLATFORM_ENTROPY - * - * Do not use built-in platform entropy functions. - * This is useful if your platform does not support - * standards like the /dev/urandom or Windows CryptoAPI. - * - * Uncomment this macro to disable the built-in platform entropy functions. - */ -//#define MBEDTLS_NO_PLATFORM_ENTROPY - -/** - * \def MBEDTLS_ENTROPY_FORCE_SHA256 - * - * Force the entropy accumulator to use a SHA-256 accumulator instead of the - * default SHA-512 based one (if both are available). - * - * Requires: MBEDTLS_SHA256_C - * - * On 32-bit systems SHA-256 can be much faster than SHA-512. Use this option - * if you have performance concerns. - * - * This option is only useful if both MBEDTLS_SHA256_C and - * MBEDTLS_SHA512_C are defined. Otherwise the available hash module is used. - */ -//#define MBEDTLS_ENTROPY_FORCE_SHA256 - -/** - * \def MBEDTLS_MEMORY_DEBUG - * - * Enable debugging of buffer allocator memory issues. Automatically prints - * (to stderr) all (fatal) messages on memory allocation issues. Enables - * function for 'debug output' of allocated memory. - * - * Requires: MBEDTLS_MEMORY_BUFFER_ALLOC_C - * - * Uncomment this macro to let the buffer allocator print out error messages. - */ -//#define MBEDTLS_MEMORY_DEBUG - -/** - * \def MBEDTLS_MEMORY_BACKTRACE - * - * Include backtrace information with each allocated block. - * - * Requires: MBEDTLS_MEMORY_BUFFER_ALLOC_C - * GLIBC-compatible backtrace() an backtrace_symbols() support - * - * Uncomment this macro to include backtrace information - */ -//#define MBEDTLS_MEMORY_BACKTRACE - -/** - * \def MBEDTLS_PK_RSA_ALT_SUPPORT - * - * Support external private RSA keys (eg from a HSM) in the PK layer. - * - * Comment this macro to disable support for external private RSA keys. - */ -#define MBEDTLS_PK_RSA_ALT_SUPPORT - -/** - * \def MBEDTLS_PKCS1_V15 - * - * Enable support for PKCS#1 v1.5 encoding. - * - * Requires: MBEDTLS_RSA_C - * - * This enables support for PKCS#1 v1.5 operations. - */ -#define MBEDTLS_PKCS1_V15 - -/** - * \def MBEDTLS_PKCS1_V21 - * - * Enable support for PKCS#1 v2.1 encoding. - * - * Requires: MBEDTLS_MD_C, MBEDTLS_RSA_C - * - * This enables support for RSAES-OAEP and RSASSA-PSS operations. - */ -#define MBEDTLS_PKCS1_V21 - -/** - * \def MBEDTLS_RSA_NO_CRT - * - * Do not use the Chinese Remainder Theorem for the RSA private operation. - * - * Uncomment this macro to disable the use of CRT in RSA. - * - */ -//#define MBEDTLS_RSA_NO_CRT - -/** - * \def MBEDTLS_SELF_TEST - * - * Enable the checkup functions (*_self_test). - */ -#define MBEDTLS_SELF_TEST - -/** - * \def MBEDTLS_SHA256_SMALLER - * - * Enable an implementation of SHA-256 that has lower ROM footprint but also - * lower performance. - * - * The default implementation is meant to be a reasonnable compromise between - * performance and size. This version optimizes more aggressively for size at - * the expense of performance. Eg on Cortex-M4 it reduces the size of - * mbedtls_sha256_process() from ~2KB to ~0.5KB for a performance hit of about - * 30%. - * - * Uncomment to enable the smaller implementation of SHA256. - */ -//#define MBEDTLS_SHA256_SMALLER - -/** - * \def MBEDTLS_SSL_AEAD_RANDOM_IV - * - * Generate a random IV rather than using the record sequence number as a - * nonce for ciphersuites using and AEAD algorithm (GCM or CCM). - * - * Using the sequence number is generally recommended. - * - * Uncomment this macro to always use random IVs with AEAD ciphersuites. - */ -//#define MBEDTLS_SSL_AEAD_RANDOM_IV - -/** - * \def MBEDTLS_SSL_ALL_ALERT_MESSAGES - * - * Enable sending of alert messages in case of encountered errors as per RFC. - * If you choose not to send the alert messages, mbed TLS can still communicate - * with other servers, only debugging of failures is harder. - * - * The advantage of not sending alert messages, is that no information is given - * about reasons for failures thus preventing adversaries of gaining intel. - * - * Enable sending of all alert messages - */ -#define MBEDTLS_SSL_ALL_ALERT_MESSAGES - -/** - * \def MBEDTLS_SSL_DEBUG_ALL - * - * Enable the debug messages in SSL module for all issues. - * Debug messages have been disabled in some places to prevent timing - * attacks due to (unbalanced) debugging function calls. - * - * If you need all error reporting you should enable this during debugging, - * but remove this for production servers that should log as well. - * - * Uncomment this macro to report all debug messages on errors introducing - * a timing side-channel. - * - */ -//#define MBEDTLS_SSL_DEBUG_ALL - -/** \def MBEDTLS_SSL_ENCRYPT_THEN_MAC - * - * Enable support for Encrypt-then-MAC, RFC 7366. - * - * This allows peers that both support it to use a more robust protection for - * ciphersuites using CBC, providing deep resistance against timing attacks - * on the padding or underlying cipher. - * - * This only affects CBC ciphersuites, and is useless if none is defined. - * - * Requires: MBEDTLS_SSL_PROTO_TLS1 or - * MBEDTLS_SSL_PROTO_TLS1_1 or - * MBEDTLS_SSL_PROTO_TLS1_2 - * - * Comment this macro to disable support for Encrypt-then-MAC - */ -#define MBEDTLS_SSL_ENCRYPT_THEN_MAC - -/** \def MBEDTLS_SSL_EXTENDED_MASTER_SECRET - * - * Enable support for Extended Master Secret, aka Session Hash - * (draft-ietf-tls-session-hash-02). - * - * This was introduced as "the proper fix" to the Triple Handshake familiy of - * attacks, but it is recommended to always use it (even if you disable - * renegotiation), since it actually fixes a more fundamental issue in the - * original SSL/TLS design, and has implications beyond Triple Handshake. - * - * Requires: MBEDTLS_SSL_PROTO_TLS1 or - * MBEDTLS_SSL_PROTO_TLS1_1 or - * MBEDTLS_SSL_PROTO_TLS1_2 - * - * Comment this macro to disable support for Extended Master Secret. - */ -#define MBEDTLS_SSL_EXTENDED_MASTER_SECRET - -/** - * \def MBEDTLS_SSL_FALLBACK_SCSV - * - * Enable support for FALLBACK_SCSV (draft-ietf-tls-downgrade-scsv-00). - * - * For servers, it is recommended to always enable this, unless you support - * only one version of TLS, or know for sure that none of your clients - * implements a fallback strategy. - * - * For clients, you only need this if you're using a fallback strategy, which - * is not recommended in the first place, unless you absolutely need it to - * interoperate with buggy (version-intolerant) servers. - * - * Comment this macro to disable support for FALLBACK_SCSV - */ -#define MBEDTLS_SSL_FALLBACK_SCSV - -/** - * \def MBEDTLS_SSL_HW_RECORD_ACCEL - * - * Enable hooking functions in SSL module for hardware acceleration of - * individual records. - * - * Uncomment this macro to enable hooking functions. - */ -//#define MBEDTLS_SSL_HW_RECORD_ACCEL - -/** - * \def MBEDTLS_SSL_CBC_RECORD_SPLITTING - * - * Enable 1/n-1 record splitting for CBC mode in SSLv3 and TLS 1.0. - * - * This is a countermeasure to the BEAST attack, which also minimizes the risk - * of interoperability issues compared to sending 0-length records. - * - * Comment this macro to disable 1/n-1 record splitting. - */ -#define MBEDTLS_SSL_CBC_RECORD_SPLITTING - -/** - * \def MBEDTLS_SSL_RENEGOTIATION - * - * Disable support for TLS renegotiation. - * - * The two main uses of renegotiation are (1) refresh keys on long-lived - * connections and (2) client authentication after the initial handshake. - * If you don't need renegotiation, it's probably better to disable it, since - * it has been associated with security issues in the past and is easy to - * misuse/misunderstand. - * - * Comment this to disable support for renegotiation. - */ -#define MBEDTLS_SSL_RENEGOTIATION - -/** - * \def MBEDTLS_SSL_SRV_SUPPORT_SSLV2_CLIENT_HELLO - * - * Enable support for receiving and parsing SSLv2 Client Hello messages for the - * SSL Server module (MBEDTLS_SSL_SRV_C). - * - * Uncomment this macro to enable support for SSLv2 Client Hello messages. - */ -//#define MBEDTLS_SSL_SRV_SUPPORT_SSLV2_CLIENT_HELLO - -/** - * \def MBEDTLS_SSL_SRV_RESPECT_CLIENT_PREFERENCE - * - * Pick the ciphersuite according to the client's preferences rather than ours - * in the SSL Server module (MBEDTLS_SSL_SRV_C). - * - * Uncomment this macro to respect client's ciphersuite order - */ -//#define MBEDTLS_SSL_SRV_RESPECT_CLIENT_PREFERENCE - -/** - * \def MBEDTLS_SSL_MAX_FRAGMENT_LENGTH - * - * Enable support for RFC 6066 max_fragment_length extension in SSL. - * - * Comment this macro to disable support for the max_fragment_length extension - */ -#define MBEDTLS_SSL_MAX_FRAGMENT_LENGTH - -/** - * \def MBEDTLS_SSL_PROTO_SSL3 - * - * Enable support for SSL 3.0. - * - * Requires: MBEDTLS_MD5_C - * MBEDTLS_SHA1_C - * - * Comment this macro to disable support for SSL 3.0 - */ -#define MBEDTLS_SSL_PROTO_SSL3 - -/** - * \def MBEDTLS_SSL_PROTO_TLS1 - * - * Enable support for TLS 1.0. - * - * Requires: MBEDTLS_MD5_C - * MBEDTLS_SHA1_C - * - * Comment this macro to disable support for TLS 1.0 - */ -#define MBEDTLS_SSL_PROTO_TLS1 - -/** - * \def MBEDTLS_SSL_PROTO_TLS1_1 - * - * Enable support for TLS 1.1 (and DTLS 1.0 if DTLS is enabled). - * - * Requires: MBEDTLS_MD5_C - * MBEDTLS_SHA1_C - * - * Comment this macro to disable support for TLS 1.1 / DTLS 1.0 - */ -#define MBEDTLS_SSL_PROTO_TLS1_1 - -/** - * \def MBEDTLS_SSL_PROTO_TLS1_2 - * - * Enable support for TLS 1.2 (and DTLS 1.2 if DTLS is enabled). - * - * Requires: MBEDTLS_SHA1_C or MBEDTLS_SHA256_C or MBEDTLS_SHA512_C - * (Depends on ciphersuites) - * - * Comment this macro to disable support for TLS 1.2 / DTLS 1.2 - */ -#define MBEDTLS_SSL_PROTO_TLS1_2 - -/** - * \def MBEDTLS_SSL_PROTO_DTLS - * - * Enable support for DTLS (all available versions). - * - * Enable this and MBEDTLS_SSL_PROTO_TLS1_1 to enable DTLS 1.0, - * and/or this and MBEDTLS_SSL_PROTO_TLS1_2 to enable DTLS 1.2. - * - * Requires: MBEDTLS_SSL_PROTO_TLS1_1 - * or MBEDTLS_SSL_PROTO_TLS1_2 - * - * Comment this macro to disable support for DTLS - */ -#define MBEDTLS_SSL_PROTO_DTLS - -/** - * \def MBEDTLS_SSL_ALPN - * - * Enable support for RFC 7301 Application Layer Protocol Negotiation. - * - * Comment this macro to disable support for ALPN. - */ -#define MBEDTLS_SSL_ALPN - -/** - * \def MBEDTLS_SSL_DTLS_ANTI_REPLAY - * - * Enable support for the anti-replay mechanism in DTLS. - * - * Requires: MBEDTLS_SSL_TLS_C - * MBEDTLS_SSL_PROTO_DTLS - * - * \warning Disabling this is often a security risk! - * See mbedtls_ssl_conf_dtls_anti_replay() for details. - * - * Comment this to disable anti-replay in DTLS. - */ -#define MBEDTLS_SSL_DTLS_ANTI_REPLAY - -/** - * \def MBEDTLS_SSL_DTLS_HELLO_VERIFY - * - * Enable support for HelloVerifyRequest on DTLS servers. - * - * This feature is highly recommended to prevent DTLS servers being used as - * amplifiers in DoS attacks against other hosts. It should always be enabled - * unless you know for sure amplification cannot be a problem in the - * environment in which your server operates. - * - * \warning Disabling this can ba a security risk! (see above) - * - * Requires: MBEDTLS_SSL_PROTO_DTLS - * - * Comment this to disable support for HelloVerifyRequest. - */ -#define MBEDTLS_SSL_DTLS_HELLO_VERIFY - -/** - * \def MBEDTLS_SSL_DTLS_CLIENT_PORT_REUSE - * - * Enable server-side support for clients that reconnect from the same port. - * - * Some clients unexpectedly close the connection and try to reconnect using the - * same source port. This needs special support from the server to handle the - * new connection securely, as described in section 4.2.8 of RFC 6347. This - * flag enables that support. - * - * Requires: MBEDTLS_SSL_DTLS_HELLO_VERIFY - * - * Comment this to disable support for clients reusing the source port. - */ -#define MBEDTLS_SSL_DTLS_CLIENT_PORT_REUSE - -/** - * \def MBEDTLS_SSL_DTLS_BADMAC_LIMIT - * - * Enable support for a limit of records with bad MAC. - * - * See mbedtls_ssl_conf_dtls_badmac_limit(). - * - * Requires: MBEDTLS_SSL_PROTO_DTLS - */ -#define MBEDTLS_SSL_DTLS_BADMAC_LIMIT - -/** - * \def MBEDTLS_SSL_SESSION_TICKETS - * - * Enable support for RFC 5077 session tickets in SSL. - * Client-side, provides full support for session tickets (maintainance of a - * session store remains the responsibility of the application, though). - * Server-side, you also need to provide callbacks for writing and parsing - * tickets, including authenticated encryption and key management. Example - * callbacks are provided by MBEDTLS_SSL_TICKET_C. - * - * Comment this macro to disable support for SSL session tickets - */ -#define MBEDTLS_SSL_SESSION_TICKETS - -/** - * \def MBEDTLS_SSL_SERVER_NAME_INDICATION - * - * Enable support for RFC 6066 server name indication (SNI) in SSL. - * - * Requires: MBEDTLS_X509_CRT_PARSE_C - * - * Comment this macro to disable support for server name indication in SSL - */ -#define MBEDTLS_SSL_SERVER_NAME_INDICATION - -/** - * \def MBEDTLS_SSL_TRUNCATED_HMAC - * - * Enable support for RFC 6066 truncated HMAC in SSL. - * - * Comment this macro to disable support for truncated HMAC in SSL - */ -#define MBEDTLS_SSL_TRUNCATED_HMAC - -/** - * \def MBEDTLS_THREADING_ALT - * - * Provide your own alternate threading implementation. - * - * Requires: MBEDTLS_THREADING_C - * - * Uncomment this to allow your own alternate threading implementation. - */ -//#define MBEDTLS_THREADING_ALT - -/** - * \def MBEDTLS_THREADING_PTHREAD - * - * Enable the pthread wrapper layer for the threading layer. - * - * Requires: MBEDTLS_THREADING_C - * - * Uncomment this to enable pthread mutexes. - */ -//#define MBEDTLS_THREADING_PTHREAD - -/** - * \def MBEDTLS_VERSION_FEATURES - * - * Allow run-time checking of compile-time enabled features. Thus allowing users - * to check at run-time if the library is for instance compiled with threading - * support via mbedtls_version_check_feature(). - * - * Requires: MBEDTLS_VERSION_C - * - * Comment this to disable run-time checking and save ROM space - */ -#define MBEDTLS_VERSION_FEATURES - -/** - * \def MBEDTLS_X509_ALLOW_EXTENSIONS_NON_V3 - * - * If set, the X509 parser will not break-off when parsing an X509 certificate - * and encountering an extension in a v1 or v2 certificate. - * - * Uncomment to prevent an error. - */ -//#define MBEDTLS_X509_ALLOW_EXTENSIONS_NON_V3 - -/** - * \def MBEDTLS_X509_ALLOW_UNSUPPORTED_CRITICAL_EXTENSION - * - * If set, the X509 parser will not break-off when parsing an X509 certificate - * and encountering an unknown critical extension. - * - * \warning Depending on your PKI use, enabling this can be a security risk! - * - * Uncomment to prevent an error. - */ -//#define MBEDTLS_X509_ALLOW_UNSUPPORTED_CRITICAL_EXTENSION - -/** - * \def MBEDTLS_X509_CHECK_KEY_USAGE - * - * Enable verification of the keyUsage extension (CA and leaf certificates). - * - * Disabling this avoids problems with mis-issued and/or misused - * (intermediate) CA and leaf certificates. - * - * \warning Depending on your PKI use, disabling this can be a security risk! - * - * Comment to skip keyUsage checking for both CA and leaf certificates. - */ -#define MBEDTLS_X509_CHECK_KEY_USAGE - -/** - * \def MBEDTLS_X509_CHECK_EXTENDED_KEY_USAGE - * - * Enable verification of the extendedKeyUsage extension (leaf certificates). - * - * Disabling this avoids problems with mis-issued and/or misused certificates. - * - * \warning Depending on your PKI use, disabling this can be a security risk! - * - * Comment to skip extendedKeyUsage checking for certificates. - */ -#define MBEDTLS_X509_CHECK_EXTENDED_KEY_USAGE - -/** - * \def MBEDTLS_X509_RSASSA_PSS_SUPPORT - * - * Enable parsing and verification of X.509 certificates, CRLs and CSRS - * signed with RSASSA-PSS (aka PKCS#1 v2.1). - * - * Comment this macro to disallow using RSASSA-PSS in certificates. - */ -#define MBEDTLS_X509_RSASSA_PSS_SUPPORT - -/** - * \def MBEDTLS_ZLIB_SUPPORT - * - * If set, the SSL/TLS module uses ZLIB to support compression and - * decompression of packet data. - * - * \warning TLS-level compression MAY REDUCE SECURITY! See for example the - * CRIME attack. Before enabling this option, you should examine with care if - * CRIME or similar exploits may be a applicable to your use case. - * - * \note Currently compression can't be used with DTLS. - * - * Used in: library/ssl_tls.c - * library/ssl_cli.c - * library/ssl_srv.c - * - * This feature requires zlib library and headers to be present. - * - * Uncomment to enable use of ZLIB - */ -//#define MBEDTLS_ZLIB_SUPPORT -/* \} name SECTION: mbed TLS feature support */ - -/** - * \name SECTION: mbed TLS modules - * - * This section enables or disables entire modules in mbed TLS - * \{ - */ - -/** - * \def MBEDTLS_AESNI_C - * - * Enable AES-NI support on x86-64. - * - * Module: library/aesni.c - * Caller: library/aes.c - * - * Requires: MBEDTLS_HAVE_ASM - * - * This modules adds support for the AES-NI instructions on x86-64 - */ -#define MBEDTLS_AESNI_C - -/** - * \def MBEDTLS_AES_C - * - * Enable the AES block cipher. - * - * Module: library/aes.c - * Caller: library/ssl_tls.c - * library/pem.c - * library/ctr_drbg.c - * - * This module enables the following ciphersuites (if other requisites are - * enabled as well): - * MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA - * MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA - * MBEDTLS_TLS_ECDH_RSA_WITH_AES_128_CBC_SHA - * MBEDTLS_TLS_ECDH_RSA_WITH_AES_256_CBC_SHA - * MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256 - * MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384 - * MBEDTLS_TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256 - * MBEDTLS_TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384 - * MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256 - * MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384 - * MBEDTLS_TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256 - * MBEDTLS_TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384 - * MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 - * MBEDTLS_TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 - * MBEDTLS_TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 - * MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384 - * MBEDTLS_TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 - * MBEDTLS_TLS_DHE_RSA_WITH_AES_256_CBC_SHA256 - * MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA - * MBEDTLS_TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA - * MBEDTLS_TLS_DHE_RSA_WITH_AES_256_CBC_SHA - * MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 - * MBEDTLS_TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 - * MBEDTLS_TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 - * MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 - * MBEDTLS_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 - * MBEDTLS_TLS_DHE_RSA_WITH_AES_128_CBC_SHA256 - * MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA - * MBEDTLS_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA - * MBEDTLS_TLS_DHE_RSA_WITH_AES_128_CBC_SHA - * MBEDTLS_TLS_DHE_PSK_WITH_AES_256_GCM_SHA384 - * MBEDTLS_TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA384 - * MBEDTLS_TLS_DHE_PSK_WITH_AES_256_CBC_SHA384 - * MBEDTLS_TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA - * MBEDTLS_TLS_DHE_PSK_WITH_AES_256_CBC_SHA - * MBEDTLS_TLS_DHE_PSK_WITH_AES_128_GCM_SHA256 - * MBEDTLS_TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256 - * MBEDTLS_TLS_DHE_PSK_WITH_AES_128_CBC_SHA256 - * MBEDTLS_TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA - * MBEDTLS_TLS_DHE_PSK_WITH_AES_128_CBC_SHA - * MBEDTLS_TLS_RSA_WITH_AES_256_GCM_SHA384 - * MBEDTLS_TLS_RSA_WITH_AES_256_CBC_SHA256 - * MBEDTLS_TLS_RSA_WITH_AES_256_CBC_SHA - * MBEDTLS_TLS_RSA_WITH_AES_128_GCM_SHA256 - * MBEDTLS_TLS_RSA_WITH_AES_128_CBC_SHA256 - * MBEDTLS_TLS_RSA_WITH_AES_128_CBC_SHA - * MBEDTLS_TLS_RSA_PSK_WITH_AES_256_GCM_SHA384 - * MBEDTLS_TLS_RSA_PSK_WITH_AES_256_CBC_SHA384 - * MBEDTLS_TLS_RSA_PSK_WITH_AES_256_CBC_SHA - * MBEDTLS_TLS_RSA_PSK_WITH_AES_128_GCM_SHA256 - * MBEDTLS_TLS_RSA_PSK_WITH_AES_128_CBC_SHA256 - * MBEDTLS_TLS_RSA_PSK_WITH_AES_128_CBC_SHA - * MBEDTLS_TLS_PSK_WITH_AES_256_GCM_SHA384 - * MBEDTLS_TLS_PSK_WITH_AES_256_CBC_SHA384 - * MBEDTLS_TLS_PSK_WITH_AES_256_CBC_SHA - * MBEDTLS_TLS_PSK_WITH_AES_128_GCM_SHA256 - * MBEDTLS_TLS_PSK_WITH_AES_128_CBC_SHA256 - * MBEDTLS_TLS_PSK_WITH_AES_128_CBC_SHA - * - * PEM_PARSE uses AES for decrypting encrypted keys. - */ -#define MBEDTLS_AES_C - -/** - * \def MBEDTLS_ARC4_C - * - * Enable the ARCFOUR stream cipher. - * - * Module: library/arc4.c - * Caller: library/ssl_tls.c - * - * This module enables the following ciphersuites (if other requisites are - * enabled as well): - * MBEDTLS_TLS_ECDH_ECDSA_WITH_RC4_128_SHA - * MBEDTLS_TLS_ECDH_RSA_WITH_RC4_128_SHA - * MBEDTLS_TLS_ECDHE_ECDSA_WITH_RC4_128_SHA - * MBEDTLS_TLS_ECDHE_RSA_WITH_RC4_128_SHA - * MBEDTLS_TLS_ECDHE_PSK_WITH_RC4_128_SHA - * MBEDTLS_TLS_DHE_PSK_WITH_RC4_128_SHA - * MBEDTLS_TLS_RSA_WITH_RC4_128_SHA - * MBEDTLS_TLS_RSA_WITH_RC4_128_MD5 - * MBEDTLS_TLS_RSA_PSK_WITH_RC4_128_SHA - * MBEDTLS_TLS_PSK_WITH_RC4_128_SHA - */ -#define MBEDTLS_ARC4_C - -/** - * \def MBEDTLS_ASN1_PARSE_C - * - * Enable the generic ASN1 parser. - * - * Module: library/asn1.c - * Caller: library/x509.c - * library/dhm.c - * library/pkcs12.c - * library/pkcs5.c - * library/pkparse.c - */ -#define MBEDTLS_ASN1_PARSE_C - -/** - * \def MBEDTLS_ASN1_WRITE_C - * - * Enable the generic ASN1 writer. - * - * Module: library/asn1write.c - * Caller: library/ecdsa.c - * library/pkwrite.c - * library/x509_create.c - * library/x509write_crt.c - * library/mbedtls_x509write_csr.c - */ -#define MBEDTLS_ASN1_WRITE_C - -/** - * \def MBEDTLS_BASE64_C - * - * Enable the Base64 module. - * - * Module: library/base64.c - * Caller: library/pem.c - * - * This module is required for PEM support (required by X.509). - */ -#define MBEDTLS_BASE64_C - -/** - * \def MBEDTLS_BIGNUM_C - * - * Enable the multi-precision integer library. - * - * Module: library/bignum.c - * Caller: library/dhm.c - * library/ecp.c - * library/ecdsa.c - * library/rsa.c - * library/ssl_tls.c - * - * This module is required for RSA, DHM and ECC (ECDH, ECDSA) support. - */ -#define MBEDTLS_BIGNUM_C - -/** - * \def MBEDTLS_BLOWFISH_C - * - * Enable the Blowfish block cipher. - * - * Module: library/blowfish.c - */ -#define MBEDTLS_BLOWFISH_C - -/** - * \def MBEDTLS_CAMELLIA_C - * - * Enable the Camellia block cipher. - * - * Module: library/camellia.c - * Caller: library/ssl_tls.c - * - * This module enables the following ciphersuites (if other requisites are - * enabled as well): - * MBEDTLS_TLS_ECDH_ECDSA_WITH_CAMELLIA_128_CBC_SHA256 - * MBEDTLS_TLS_ECDH_ECDSA_WITH_CAMELLIA_256_CBC_SHA384 - * MBEDTLS_TLS_ECDH_RSA_WITH_CAMELLIA_128_CBC_SHA256 - * MBEDTLS_TLS_ECDH_RSA_WITH_CAMELLIA_256_CBC_SHA384 - * MBEDTLS_TLS_ECDH_ECDSA_WITH_CAMELLIA_128_GCM_SHA256 - * MBEDTLS_TLS_ECDH_ECDSA_WITH_CAMELLIA_256_GCM_SHA384 - * MBEDTLS_TLS_ECDH_RSA_WITH_CAMELLIA_128_GCM_SHA256 - * MBEDTLS_TLS_ECDH_RSA_WITH_CAMELLIA_256_GCM_SHA384 - * MBEDTLS_TLS_ECDHE_ECDSA_WITH_CAMELLIA_256_GCM_SHA384 - * MBEDTLS_TLS_ECDHE_RSA_WITH_CAMELLIA_256_GCM_SHA384 - * MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_256_GCM_SHA384 - * MBEDTLS_TLS_ECDHE_ECDSA_WITH_CAMELLIA_256_CBC_SHA384 - * MBEDTLS_TLS_ECDHE_RSA_WITH_CAMELLIA_256_CBC_SHA384 - * MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256 - * MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA - * MBEDTLS_TLS_ECDHE_ECDSA_WITH_CAMELLIA_128_GCM_SHA256 - * MBEDTLS_TLS_ECDHE_RSA_WITH_CAMELLIA_128_GCM_SHA256 - * MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_128_GCM_SHA256 - * MBEDTLS_TLS_ECDHE_ECDSA_WITH_CAMELLIA_128_CBC_SHA256 - * MBEDTLS_TLS_ECDHE_RSA_WITH_CAMELLIA_128_CBC_SHA256 - * MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256 - * MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA - * MBEDTLS_TLS_DHE_PSK_WITH_CAMELLIA_256_GCM_SHA384 - * MBEDTLS_TLS_ECDHE_PSK_WITH_CAMELLIA_256_CBC_SHA384 - * MBEDTLS_TLS_DHE_PSK_WITH_CAMELLIA_256_CBC_SHA384 - * MBEDTLS_TLS_DHE_PSK_WITH_CAMELLIA_128_GCM_SHA256 - * MBEDTLS_TLS_DHE_PSK_WITH_CAMELLIA_128_CBC_SHA256 - * MBEDTLS_TLS_ECDHE_PSK_WITH_CAMELLIA_128_CBC_SHA256 - * MBEDTLS_TLS_RSA_WITH_CAMELLIA_256_GCM_SHA384 - * MBEDTLS_TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256 - * MBEDTLS_TLS_RSA_WITH_CAMELLIA_256_CBC_SHA - * MBEDTLS_TLS_RSA_WITH_CAMELLIA_128_GCM_SHA256 - * MBEDTLS_TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256 - * MBEDTLS_TLS_RSA_WITH_CAMELLIA_128_CBC_SHA - * MBEDTLS_TLS_RSA_PSK_WITH_CAMELLIA_256_GCM_SHA384 - * MBEDTLS_TLS_RSA_PSK_WITH_CAMELLIA_256_CBC_SHA384 - * MBEDTLS_TLS_RSA_PSK_WITH_CAMELLIA_128_GCM_SHA256 - * MBEDTLS_TLS_RSA_PSK_WITH_CAMELLIA_128_CBC_SHA256 - * MBEDTLS_TLS_PSK_WITH_CAMELLIA_256_GCM_SHA384 - * MBEDTLS_TLS_PSK_WITH_CAMELLIA_256_CBC_SHA384 - * MBEDTLS_TLS_PSK_WITH_CAMELLIA_128_GCM_SHA256 - * MBEDTLS_TLS_PSK_WITH_CAMELLIA_128_CBC_SHA256 - */ -#define MBEDTLS_CAMELLIA_C - -/** - * \def MBEDTLS_CCM_C - * - * Enable the Counter with CBC-MAC (CCM) mode for 128-bit block cipher. - * - * Module: library/ccm.c - * - * Requires: MBEDTLS_AES_C or MBEDTLS_CAMELLIA_C - * - * This module enables the AES-CCM ciphersuites, if other requisites are - * enabled as well. - */ -#define MBEDTLS_CCM_C - -/** - * \def MBEDTLS_CERTS_C - * - * Enable the test certificates. - * - * Module: library/certs.c - * Caller: - * - * This module is used for testing (ssl_client/server). - */ -#define MBEDTLS_CERTS_C - -/** - * \def MBEDTLS_CIPHER_C - * - * Enable the generic cipher layer. - * - * Module: library/cipher.c - * Caller: library/ssl_tls.c - * - * Uncomment to enable generic cipher wrappers. - */ -#define MBEDTLS_CIPHER_C - -/** - * \def MBEDTLS_CTR_DRBG_C - * - * Enable the CTR_DRBG AES-256-based random generator. - * - * Module: library/ctr_drbg.c - * Caller: - * - * Requires: MBEDTLS_AES_C - * - * This module provides the CTR_DRBG AES-256 random number generator. - */ -#define MBEDTLS_CTR_DRBG_C - -/** - * \def MBEDTLS_DEBUG_C - * - * Enable the debug functions. - * - * Module: library/debug.c - * Caller: library/ssl_cli.c - * library/ssl_srv.c - * library/ssl_tls.c - * - * This module provides debugging functions. - */ -#define MBEDTLS_DEBUG_C - -/** - * \def MBEDTLS_DES_C - * - * Enable the DES block cipher. - * - * Module: library/des.c - * Caller: library/pem.c - * library/ssl_tls.c - * - * This module enables the following ciphersuites (if other requisites are - * enabled as well): - * MBEDTLS_TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA - * MBEDTLS_TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA - * MBEDTLS_TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA - * MBEDTLS_TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA - * MBEDTLS_TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA - * MBEDTLS_TLS_ECDHE_PSK_WITH_3DES_EDE_CBC_SHA - * MBEDTLS_TLS_DHE_PSK_WITH_3DES_EDE_CBC_SHA - * MBEDTLS_TLS_RSA_WITH_3DES_EDE_CBC_SHA - * MBEDTLS_TLS_RSA_PSK_WITH_3DES_EDE_CBC_SHA - * MBEDTLS_TLS_PSK_WITH_3DES_EDE_CBC_SHA - * - * PEM_PARSE uses DES/3DES for decrypting encrypted keys. - */ -#define MBEDTLS_DES_C - -/** - * \def MBEDTLS_DHM_C - * - * Enable the Diffie-Hellman-Merkle module. - * - * Module: library/dhm.c - * Caller: library/ssl_cli.c - * library/ssl_srv.c - * - * This module is used by the following key exchanges: - * DHE-RSA, DHE-PSK - */ -#define MBEDTLS_DHM_C - -/** - * \def MBEDTLS_ECDH_C - * - * Enable the elliptic curve Diffie-Hellman library. - * - * Module: library/ecdh.c - * Caller: library/ssl_cli.c - * library/ssl_srv.c - * - * This module is used by the following key exchanges: - * ECDHE-ECDSA, ECDHE-RSA, DHE-PSK - * - * Requires: MBEDTLS_ECP_C - */ -#define MBEDTLS_ECDH_C - -/** - * \def MBEDTLS_ECDSA_C - * - * Enable the elliptic curve DSA library. - * - * Module: library/ecdsa.c - * Caller: - * - * This module is used by the following key exchanges: - * ECDHE-ECDSA - * - * Requires: MBEDTLS_ECP_C, MBEDTLS_ASN1_WRITE_C, MBEDTLS_ASN1_PARSE_C - */ -#define MBEDTLS_ECDSA_C - -/** - * \def MBEDTLS_ECP_C - * - * Enable the elliptic curve over GF(p) library. - * - * Module: library/ecp.c - * Caller: library/ecdh.c - * library/ecdsa.c - * - * Requires: MBEDTLS_BIGNUM_C and at least one MBEDTLS_ECP_DP_XXX_ENABLED - */ -#define MBEDTLS_ECP_C - -/** - * \def MBEDTLS_ENTROPY_C - * - * Enable the platform-specific entropy code. - * - * Module: library/entropy.c - * Caller: - * - * Requires: MBEDTLS_SHA512_C or MBEDTLS_SHA256_C - * - * This module provides a generic entropy pool - */ -#define MBEDTLS_ENTROPY_C - -/** - * \def MBEDTLS_ERROR_C - * - * Enable error code to error string conversion. - * - * Module: library/error.c - * Caller: - * - * This module enables mbedtls_strerror(). - */ -#define MBEDTLS_ERROR_C - -/** - * \def MBEDTLS_GCM_C - * - * Enable the Galois/Counter Mode (GCM) for AES. - * - * Module: library/gcm.c - * - * Requires: MBEDTLS_AES_C or MBEDTLS_CAMELLIA_C - * - * This module enables the AES-GCM and CAMELLIA-GCM ciphersuites, if other - * requisites are enabled as well. - */ -#define MBEDTLS_GCM_C - -/** - * \def MBEDTLS_HAVEGE_C - * - * Enable the HAVEGE random generator. - * - * Warning: the HAVEGE random generator is not suitable for virtualized - * environments - * - * Warning: the HAVEGE random generator is dependent on timing and specific - * processor traits. It is therefore not advised to use HAVEGE as - * your applications primary random generator or primary entropy pool - * input. As a secondary input to your entropy pool, it IS able add - * the (limited) extra entropy it provides. - * - * Module: library/havege.c - * Caller: - * - * Requires: MBEDTLS_TIMING_C - * - * Uncomment to enable the HAVEGE random generator. - */ -//#define MBEDTLS_HAVEGE_C - -/** - * \def MBEDTLS_HMAC_DRBG_C - * - * Enable the HMAC_DRBG random generator. - * - * Module: library/hmac_drbg.c - * Caller: - * - * Requires: MBEDTLS_MD_C - * - * Uncomment to enable the HMAC_DRBG random number geerator. - */ -#define MBEDTLS_HMAC_DRBG_C - -/** - * \def MBEDTLS_MD_C - * - * Enable the generic message digest layer. - * - * Module: library/mbedtls_md.c - * Caller: - * - * Uncomment to enable generic message digest wrappers. - */ -#define MBEDTLS_MD_C - -/** - * \def MBEDTLS_MD2_C - * - * Enable the MD2 hash algorithm. - * - * Module: library/mbedtls_md2.c - * Caller: - * - * Uncomment to enable support for (rare) MD2-signed X.509 certs. - */ -//#define MBEDTLS_MD2_C - -/** - * \def MBEDTLS_MD4_C - * - * Enable the MD4 hash algorithm. - * - * Module: library/mbedtls_md4.c - * Caller: - * - * Uncomment to enable support for (rare) MD4-signed X.509 certs. - */ -//#define MBEDTLS_MD4_C - -/** - * \def MBEDTLS_MD5_C - * - * Enable the MD5 hash algorithm. - * - * Module: library/mbedtls_md5.c - * Caller: library/mbedtls_md.c - * library/pem.c - * library/ssl_tls.c - * - * This module is required for SSL/TLS and X.509. - * PEM_PARSE uses MD5 for decrypting encrypted keys. - */ -#define MBEDTLS_MD5_C - -/** - * \def MBEDTLS_MEMORY_BUFFER_ALLOC_C - * - * Enable the buffer allocator implementation that makes use of a (stack) - * based buffer to 'allocate' dynamic memory. (replaces calloc() and free() - * calls) - * - * Module: library/memory_buffer_alloc.c - * - * Requires: MBEDTLS_PLATFORM_C - * MBEDTLS_PLATFORM_MEMORY (to use it within mbed TLS) - * - * Enable this module to enable the buffer memory allocator. - */ -//#define MBEDTLS_MEMORY_BUFFER_ALLOC_C - -/** - * \def MBEDTLS_NET_C - * - * Enable the TCP/IP networking routines. - * - * Module: library/net.c - * - * This module provides TCP/IP networking routines. - */ -#define MBEDTLS_NET_C - -/** - * \def MBEDTLS_OID_C - * - * Enable the OID database. - * - * Module: library/oid.c - * Caller: library/asn1write.c - * library/pkcs5.c - * library/pkparse.c - * library/pkwrite.c - * library/rsa.c - * library/x509.c - * library/x509_create.c - * library/mbedtls_x509_crl.c - * library/mbedtls_x509_crt.c - * library/mbedtls_x509_csr.c - * library/x509write_crt.c - * library/mbedtls_x509write_csr.c - * - * This modules translates between OIDs and internal values. - */ -#define MBEDTLS_OID_C - -/** - * \def MBEDTLS_PADLOCK_C - * - * Enable VIA Padlock support on x86. - * - * Module: library/padlock.c - * Caller: library/aes.c - * - * Requires: MBEDTLS_HAVE_ASM - * - * This modules adds support for the VIA PadLock on x86. - */ -#define MBEDTLS_PADLOCK_C - -/** - * \def MBEDTLS_PEM_PARSE_C - * - * Enable PEM decoding / parsing. - * - * Module: library/pem.c - * Caller: library/dhm.c - * library/pkparse.c - * library/mbedtls_x509_crl.c - * library/mbedtls_x509_crt.c - * library/mbedtls_x509_csr.c - * - * Requires: MBEDTLS_BASE64_C - * - * This modules adds support for decoding / parsing PEM files. - */ -#define MBEDTLS_PEM_PARSE_C - -/** - * \def MBEDTLS_PEM_WRITE_C - * - * Enable PEM encoding / writing. - * - * Module: library/pem.c - * Caller: library/pkwrite.c - * library/x509write_crt.c - * library/mbedtls_x509write_csr.c - * - * Requires: MBEDTLS_BASE64_C - * - * This modules adds support for encoding / writing PEM files. - */ -#define MBEDTLS_PEM_WRITE_C - -/** - * \def MBEDTLS_PK_C - * - * Enable the generic public (asymetric) key layer. - * - * Module: library/pk.c - * Caller: library/ssl_tls.c - * library/ssl_cli.c - * library/ssl_srv.c - * - * Requires: MBEDTLS_RSA_C or MBEDTLS_ECP_C - * - * Uncomment to enable generic public key wrappers. - */ -#define MBEDTLS_PK_C - -/** - * \def MBEDTLS_PK_PARSE_C - * - * Enable the generic public (asymetric) key parser. - * - * Module: library/pkparse.c - * Caller: library/mbedtls_x509_crt.c - * library/mbedtls_x509_csr.c - * - * Requires: MBEDTLS_PK_C - * - * Uncomment to enable generic public key parse functions. - */ -#define MBEDTLS_PK_PARSE_C - -/** - * \def MBEDTLS_PK_WRITE_C - * - * Enable the generic public (asymetric) key writer. - * - * Module: library/pkwrite.c - * Caller: library/x509write.c - * - * Requires: MBEDTLS_PK_C - * - * Uncomment to enable generic public key write functions. - */ -#define MBEDTLS_PK_WRITE_C - -/** - * \def MBEDTLS_PKCS5_C - * - * Enable PKCS#5 functions. - * - * Module: library/pkcs5.c - * - * Requires: MBEDTLS_MD_C - * - * This module adds support for the PKCS#5 functions. - */ -#define MBEDTLS_PKCS5_C - -/** - * \def MBEDTLS_PKCS11_C - * - * Enable wrapper for PKCS#11 smartcard support. - * - * Module: library/pkcs11.c - * Caller: library/pk.c - * - * Requires: MBEDTLS_PK_C - * - * This module enables SSL/TLS PKCS #11 smartcard support. - * Requires the presence of the PKCS#11 helper library (libpkcs11-helper) - */ -//#define MBEDTLS_PKCS11_C - -/** - * \def MBEDTLS_PKCS12_C - * - * Enable PKCS#12 PBE functions. - * Adds algorithms for parsing PKCS#8 encrypted private keys - * - * Module: library/pkcs12.c - * Caller: library/pkparse.c - * - * Requires: MBEDTLS_ASN1_PARSE_C, MBEDTLS_CIPHER_C, MBEDTLS_MD_C - * Can use: MBEDTLS_ARC4_C - * - * This module enables PKCS#12 functions. - */ -#define MBEDTLS_PKCS12_C - -/** - * \def MBEDTLS_PLATFORM_C - * - * Enable the platform abstraction layer that allows you to re-assign - * functions like calloc(), free(), snprintf(), printf(), fprintf(), exit(). - * - * Enabling MBEDTLS_PLATFORM_C enables to use of MBEDTLS_PLATFORM_XXX_ALT - * or MBEDTLS_PLATFORM_XXX_MACRO directives, allowing the functions mentioned - * above to be specified at runtime or compile time respectively. - * - * \note This abstraction layer must be enabled on Windows (including MSYS2) - * as other module rely on it for a fixed snprintf implementation. - * - * Module: library/platform.c - * Caller: Most other .c files - * - * This module enables abstraction of common (libc) functions. - */ -#define MBEDTLS_PLATFORM_C - -/** - * \def MBEDTLS_RIPEMD160_C - * - * Enable the RIPEMD-160 hash algorithm. - * - * Module: library/mbedtls_ripemd160.c - * Caller: library/mbedtls_md.c - * - */ -#define MBEDTLS_RIPEMD160_C - -/** - * \def MBEDTLS_RSA_C - * - * Enable the RSA public-key cryptosystem. - * - * Module: library/rsa.c - * Caller: library/ssl_cli.c - * library/ssl_srv.c - * library/ssl_tls.c - * library/x509.c - * - * This module is used by the following key exchanges: - * RSA, DHE-RSA, ECDHE-RSA, RSA-PSK - * - * Requires: MBEDTLS_BIGNUM_C, MBEDTLS_OID_C - */ -#define MBEDTLS_RSA_C - -/** - * \def MBEDTLS_SHA1_C - * - * Enable the SHA1 cryptographic hash algorithm. - * - * Module: library/mbedtls_sha1.c - * Caller: library/mbedtls_md.c - * library/ssl_cli.c - * library/ssl_srv.c - * library/ssl_tls.c - * library/x509write_crt.c - * - * This module is required for SSL/TLS and SHA1-signed certificates. - */ -#define MBEDTLS_SHA1_C - -/** - * \def MBEDTLS_SHA256_C - * - * Enable the SHA-224 and SHA-256 cryptographic hash algorithms. - * - * Module: library/mbedtls_sha256.c - * Caller: library/entropy.c - * library/mbedtls_md.c - * library/ssl_cli.c - * library/ssl_srv.c - * library/ssl_tls.c - * - * This module adds support for SHA-224 and SHA-256. - * This module is required for the SSL/TLS 1.2 PRF function. - */ -#define MBEDTLS_SHA256_C - -/** - * \def MBEDTLS_SHA512_C - * - * Enable the SHA-384 and SHA-512 cryptographic hash algorithms. - * - * Module: library/mbedtls_sha512.c - * Caller: library/entropy.c - * library/mbedtls_md.c - * library/ssl_cli.c - * library/ssl_srv.c - * - * This module adds support for SHA-384 and SHA-512. - */ -#define MBEDTLS_SHA512_C - -/** - * \def MBEDTLS_SSL_CACHE_C - * - * Enable simple SSL cache implementation. - * - * Module: library/ssl_cache.c - * Caller: - * - * Requires: MBEDTLS_SSL_CACHE_C - */ -#define MBEDTLS_SSL_CACHE_C - -/** - * \def MBEDTLS_SSL_COOKIE_C - * - * Enable basic implementation of DTLS cookies for hello verification. - * - * Module: library/ssl_cookie.c - * Caller: - */ -#define MBEDTLS_SSL_COOKIE_C - -/** - * \def MBEDTLS_SSL_TICKET_C - * - * Enable an implementation of TLS server-side callbacks for session tickets. - * - * Module: library/ssl_ticket.c - * Caller: - * - * Requires: MBEDTLS_CIPHER_C - */ -#define MBEDTLS_SSL_TICKET_C - -/** - * \def MBEDTLS_SSL_CLI_C - * - * Enable the SSL/TLS client code. - * - * Module: library/ssl_cli.c - * Caller: - * - * Requires: MBEDTLS_SSL_TLS_C - * - * This module is required for SSL/TLS client support. - */ -#define MBEDTLS_SSL_CLI_C - -/** - * \def MBEDTLS_SSL_SRV_C - * - * Enable the SSL/TLS server code. - * - * Module: library/ssl_srv.c - * Caller: - * - * Requires: MBEDTLS_SSL_TLS_C - * - * This module is required for SSL/TLS server support. - */ -#define MBEDTLS_SSL_SRV_C - -/** - * \def MBEDTLS_SSL_TLS_C - * - * Enable the generic SSL/TLS code. - * - * Module: library/ssl_tls.c - * Caller: library/ssl_cli.c - * library/ssl_srv.c - * - * Requires: MBEDTLS_CIPHER_C, MBEDTLS_MD_C - * and at least one of the MBEDTLS_SSL_PROTO_XXX defines - * - * This module is required for SSL/TLS. - */ -#define MBEDTLS_SSL_TLS_C - -/** - * \def MBEDTLS_THREADING_C - * - * Enable the threading abstraction layer. - * By default mbed TLS assumes it is used in a non-threaded environment or that - * contexts are not shared between threads. If you do intend to use contexts - * between threads, you will need to enable this layer to prevent race - * conditions. - * - * Module: library/threading.c - * - * This allows different threading implementations (self-implemented or - * provided). - * - * You will have to enable either MBEDTLS_THREADING_ALT or - * MBEDTLS_THREADING_PTHREAD. - * - * Enable this layer to allow use of mutexes within mbed TLS - */ -//#define MBEDTLS_THREADING_C - -/** - * \def MBEDTLS_TIMING_C - * - * Enable the portable timing interface. - * - * Module: library/timing.c - * Caller: library/havege.c - * - * This module is used by the HAVEGE random number generator. - */ -#define MBEDTLS_TIMING_C - -/** - * \def MBEDTLS_VERSION_C - * - * Enable run-time version information. - * - * Module: library/version.c - * - * This module provides run-time version information. - */ -#define MBEDTLS_VERSION_C - -/** - * \def MBEDTLS_X509_USE_C - * - * Enable X.509 core for using certificates. - * - * Module: library/x509.c - * Caller: library/mbedtls_x509_crl.c - * library/mbedtls_x509_crt.c - * library/mbedtls_x509_csr.c - * - * Requires: MBEDTLS_ASN1_PARSE_C, MBEDTLS_BIGNUM_C, MBEDTLS_OID_C, - * MBEDTLS_PK_PARSE_C - * - * This module is required for the X.509 parsing modules. - */ -#define MBEDTLS_X509_USE_C - -/** - * \def MBEDTLS_X509_CRT_PARSE_C - * - * Enable X.509 certificate parsing. - * - * Module: library/mbedtls_x509_crt.c - * Caller: library/ssl_cli.c - * library/ssl_srv.c - * library/ssl_tls.c - * - * Requires: MBEDTLS_X509_USE_C - * - * This module is required for X.509 certificate parsing. - */ -#define MBEDTLS_X509_CRT_PARSE_C - -/** - * \def MBEDTLS_X509_CRL_PARSE_C - * - * Enable X.509 CRL parsing. - * - * Module: library/mbedtls_x509_crl.c - * Caller: library/mbedtls_x509_crt.c - * - * Requires: MBEDTLS_X509_USE_C - * - * This module is required for X.509 CRL parsing. - */ -#define MBEDTLS_X509_CRL_PARSE_C - -/** - * \def MBEDTLS_X509_CSR_PARSE_C - * - * Enable X.509 Certificate Signing Request (CSR) parsing. - * - * Module: library/mbedtls_x509_csr.c - * Caller: library/x509_crt_write.c - * - * Requires: MBEDTLS_X509_USE_C - * - * This module is used for reading X.509 certificate request. - */ -#define MBEDTLS_X509_CSR_PARSE_C - -/** - * \def MBEDTLS_X509_CREATE_C - * - * Enable X.509 core for creating certificates. - * - * Module: library/x509_create.c - * - * Requires: MBEDTLS_BIGNUM_C, MBEDTLS_OID_C, MBEDTLS_PK_WRITE_C - * - * This module is the basis for creating X.509 certificates and CSRs. - */ -#define MBEDTLS_X509_CREATE_C - -/** - * \def MBEDTLS_X509_CRT_WRITE_C - * - * Enable creating X.509 certificates. - * - * Module: library/x509_crt_write.c - * - * Requires: MBEDTLS_X509_CREATE_C - * - * This module is required for X.509 certificate creation. - */ -#define MBEDTLS_X509_CRT_WRITE_C - -/** - * \def MBEDTLS_X509_CSR_WRITE_C - * - * Enable creating X.509 Certificate Signing Requests (CSR). - * - * Module: library/x509_csr_write.c - * - * Requires: MBEDTLS_X509_CREATE_C - * - * This module is required for X.509 certificate request writing. - */ -#define MBEDTLS_X509_CSR_WRITE_C - -/** - * \def MBEDTLS_XTEA_C - * - * Enable the XTEA block cipher. - * - * Module: library/xtea.c - * Caller: - */ -#define MBEDTLS_XTEA_C - -/* \} name SECTION: mbed TLS modules */ - -/** - * \name SECTION: Module configuration options - * - * This section allows for the setting of module specific sizes and - * configuration options. The default values are already present in the - * relevant header files and should suffice for the regular use cases. - * - * Our advice is to enable options and change their values here - * only if you have a good reason and know the consequences. - * - * Please check the respective header file for documentation on these - * parameters (to prevent duplicate documentation). - * \{ - */ - -/* MPI / BIGNUM options */ -//#define MBEDTLS_MPI_WINDOW_SIZE 6 /**< Maximum windows size used. */ -//#define MBEDTLS_MPI_MAX_SIZE 1024 /**< Maximum number of bytes for usable MPIs. */ - -/* CTR_DRBG options */ -//#define MBEDTLS_CTR_DRBG_ENTROPY_LEN 48 /**< Amount of entropy used per seed by default (48 with SHA-512, 32 with SHA-256) */ -//#define MBEDTLS_CTR_DRBG_RESEED_INTERVAL 10000 /**< Interval before reseed is performed by default */ -//#define MBEDTLS_CTR_DRBG_MAX_INPUT 256 /**< Maximum number of additional input bytes */ -//#define MBEDTLS_CTR_DRBG_MAX_REQUEST 1024 /**< Maximum number of requested bytes per call */ -//#define MBEDTLS_CTR_DRBG_MAX_SEED_INPUT 384 /**< Maximum size of (re)seed buffer */ - -/* HMAC_DRBG options */ -//#define MBEDTLS_HMAC_DRBG_RESEED_INTERVAL 10000 /**< Interval before reseed is performed by default */ -//#define MBEDTLS_HMAC_DRBG_MAX_INPUT 256 /**< Maximum number of additional input bytes */ -//#define MBEDTLS_HMAC_DRBG_MAX_REQUEST 1024 /**< Maximum number of requested bytes per call */ -//#define MBEDTLS_HMAC_DRBG_MAX_SEED_INPUT 384 /**< Maximum size of (re)seed buffer */ - -/* ECP options */ -//#define MBEDTLS_ECP_MAX_BITS 521 /**< Maximum bit size of groups */ -//#define MBEDTLS_ECP_WINDOW_SIZE 6 /**< Maximum window size used */ -//#define MBEDTLS_ECP_FIXED_POINT_OPTIM 1 /**< Enable fixed-point speed-up */ - -/* Entropy options */ -//#define MBEDTLS_ENTROPY_MAX_SOURCES 20 /**< Maximum number of sources supported */ -//#define MBEDTLS_ENTROPY_MAX_GATHER 128 /**< Maximum amount requested from entropy sources */ - -/* Memory buffer allocator options */ -//#define MBEDTLS_MEMORY_ALIGN_MULTIPLE 4 /**< Align on multiples of this value */ - -/* Platform options */ -//#define MBEDTLS_PLATFORM_STD_MEM_HDR /**< Header to include if MBEDTLS_PLATFORM_NO_STD_FUNCTIONS is defined. Don't define if no header is needed. */ -//#define MBEDTLS_PLATFORM_STD_CALLOC calloc /**< Default allocator to use, can be undefined */ -//#define MBEDTLS_PLATFORM_STD_FREE free /**< Default free to use, can be undefined */ -//#define MBEDTLS_PLATFORM_STD_EXIT exit /**< Default exit to use, can be undefined */ -//#define MBEDTLS_PLATFORM_STD_FPRINTF fprintf /**< Default fprintf to use, can be undefined */ -//#define MBEDTLS_PLATFORM_STD_PRINTF printf /**< Default printf to use, can be undefined */ -/* Note: your snprintf must correclty zero-terminate the buffer! */ -//#define MBEDTLS_PLATFORM_STD_SNPRINTF snprintf /**< Default snprintf to use, can be undefined */ - -/* To Use Function Macros MBEDTLS_PLATFORM_C must be enabled */ -/* MBEDTLS_PLATFORM_XXX_MACRO and MBEDTLS_PLATFORM_XXX_ALT cannot both be defined */ -//#define MBEDTLS_PLATFORM_CALLOC_MACRO calloc /**< Default allocator macro to use, can be undefined */ -//#define MBEDTLS_PLATFORM_FREE_MACRO free /**< Default free macro to use, can be undefined */ -//#define MBEDTLS_PLATFORM_EXIT_MACRO exit /**< Default exit macro to use, can be undefined */ -//#define MBEDTLS_PLATFORM_FPRINTF_MACRO fprintf /**< Default fprintf macro to use, can be undefined */ -//#define MBEDTLS_PLATFORM_PRINTF_MACRO printf /**< Default printf macro to use, can be undefined */ -/* Note: your snprintf must correclty zero-terminate the buffer! */ -//#define MBEDTLS_PLATFORM_SNPRINTF_MACRO snprintf /**< Default snprintf macro to use, can be undefined */ - -/* SSL Cache options */ -//#define MBEDTLS_SSL_CACHE_DEFAULT_TIMEOUT 86400 /**< 1 day */ -//#define MBEDTLS_SSL_CACHE_DEFAULT_MAX_ENTRIES 50 /**< Maximum entries in cache */ - -/* SSL options */ -//#define MBEDTLS_SSL_MAX_CONTENT_LEN 16384 /**< Maxium fragment length in bytes, determines the size of each of the two internal I/O buffers */ -//#define MBEDTLS_SSL_DEFAULT_TICKET_LIFETIME 86400 /**< Lifetime of session tickets (if enabled) */ -//#define MBEDTLS_PSK_MAX_LEN 32 /**< Max size of TLS pre-shared keys, in bytes (default 256 bits) */ -//#define MBEDTLS_SSL_COOKIE_TIMEOUT 60 /**< Default expiration delay of DTLS cookies, in seconds if HAVE_TIME, or in number of cookies issued */ - -/** - * Complete list of ciphersuites to use, in order of preference. - * - * \warning No dependency checking is done on that field! This option can only - * be used to restrict the set of available ciphersuites. It is your - * responsibility to make sure the needed modules are active. - * - * Use this to save a few hundred bytes of ROM (default ordering of all - * available ciphersuites) and a few to a few hundred bytes of RAM. - * - * The value below is only an example, not the default. - */ -//#define MBEDTLS_SSL_CIPHERSUITES MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 - -/* X509 options */ -//#define MBEDTLS_X509_MAX_INTERMEDIATE_CA 8 /**< Maximum number of intermediate CAs in a verification chain. */ - -/* \} name SECTION: Module configuration options */ - -#if defined(TARGET_LIKE_MBED) -#include "mbedtls/target_config.h" -#endif - -/* - * Allow user to override any previous default. - * - * Use two macro names for that, as: - * - with yotta the prefix YOTTA_CFG_ is forced - * - without yotta is looks weird to have a YOTTA prefix. - */ -#if defined(YOTTA_CFG_MBEDTLS_USER_CONFIG_FILE) -#include YOTTA_CFG_MBEDTLS_USER_CONFIG_FILE -#elif defined(MBEDTLS_USER_CONFIG_FILE) -#include MBEDTLS_USER_CONFIG_FILE -#endif - -#include "check_config.h" - -#endif /* MBEDTLS_CONFIG_H */ diff --git a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/ctr_drbg.h b/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/ctr_drbg.h deleted file mode 100644 index 059d3c5c..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/ctr_drbg.h +++ /dev/null @@ -1,290 +0,0 @@ -/** - * \file ctr_drbg.h - * - * \brief CTR_DRBG based on AES-256 (NIST SP 800-90) - * - * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * This file is part of mbed TLS (https://tls.mbed.org) - */ -#ifndef MBEDTLS_CTR_DRBG_H -#define MBEDTLS_CTR_DRBG_H - -#include "aes.h" - -#if defined(MBEDTLS_THREADING_C) -#include "mbedtls/threading.h" -#endif - -#define MBEDTLS_ERR_CTR_DRBG_ENTROPY_SOURCE_FAILED -0x0034 /**< The entropy source failed. */ -#define MBEDTLS_ERR_CTR_DRBG_REQUEST_TOO_BIG -0x0036 /**< Too many random requested in single call. */ -#define MBEDTLS_ERR_CTR_DRBG_INPUT_TOO_BIG -0x0038 /**< Input too large (Entropy + additional). */ -#define MBEDTLS_ERR_CTR_DRBG_FILE_IO_ERROR -0x003A /**< Read/write error in file. */ - -#define MBEDTLS_CTR_DRBG_BLOCKSIZE 16 /**< Block size used by the cipher */ -#define MBEDTLS_CTR_DRBG_KEYSIZE 32 /**< Key size used by the cipher */ -#define MBEDTLS_CTR_DRBG_KEYBITS ( MBEDTLS_CTR_DRBG_KEYSIZE * 8 ) -#define MBEDTLS_CTR_DRBG_SEEDLEN ( MBEDTLS_CTR_DRBG_KEYSIZE + MBEDTLS_CTR_DRBG_BLOCKSIZE ) - /**< The seed length (counter + AES key) */ - -/** - * \name SECTION: Module settings - * - * The configuration options you can set for this module are in this section. - * Either change them in config.h or define them on the compiler command line. - * \{ - */ - -#if !defined(MBEDTLS_CTR_DRBG_ENTROPY_LEN) -#if defined(MBEDTLS_SHA512_C) && !defined(MBEDTLS_ENTROPY_FORCE_SHA256) -#define MBEDTLS_CTR_DRBG_ENTROPY_LEN 48 /**< Amount of entropy used per seed by default (48 with SHA-512, 32 with SHA-256) */ -#else -#define MBEDTLS_CTR_DRBG_ENTROPY_LEN 32 /**< Amount of entropy used per seed by default (48 with SHA-512, 32 with SHA-256) */ -#endif -#endif - -#if !defined(MBEDTLS_CTR_DRBG_RESEED_INTERVAL) -#define MBEDTLS_CTR_DRBG_RESEED_INTERVAL 10000 /**< Interval before reseed is performed by default */ -#endif - -#if !defined(MBEDTLS_CTR_DRBG_MAX_INPUT) -#define MBEDTLS_CTR_DRBG_MAX_INPUT 256 /**< Maximum number of additional input bytes */ -#endif - -#if !defined(MBEDTLS_CTR_DRBG_MAX_REQUEST) -#define MBEDTLS_CTR_DRBG_MAX_REQUEST 1024 /**< Maximum number of requested bytes per call */ -#endif - -#if !defined(MBEDTLS_CTR_DRBG_MAX_SEED_INPUT) -#define MBEDTLS_CTR_DRBG_MAX_SEED_INPUT 384 /**< Maximum size of (re)seed buffer */ -#endif - -/* \} name SECTION: Module settings */ - -#define MBEDTLS_CTR_DRBG_PR_OFF 0 /**< No prediction resistance */ -#define MBEDTLS_CTR_DRBG_PR_ON 1 /**< Prediction resistance enabled */ - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * \brief CTR_DRBG context structure - */ -typedef struct -{ - unsigned char counter[16]; /*!< counter (V) */ - int reseed_counter; /*!< reseed counter */ - int prediction_resistance; /*!< enable prediction resistance (Automatic - reseed before every random generation) */ - size_t entropy_len; /*!< amount of entropy grabbed on each - (re)seed */ - int reseed_interval; /*!< reseed interval */ - - mbedtls_aes_context aes_ctx; /*!< AES context */ - - /* - * Callbacks (Entropy) - */ - int (*f_entropy)(void *, unsigned char *, size_t); - - void *p_entropy; /*!< context for the entropy function */ - -#if defined(MBEDTLS_THREADING_C) - mbedtls_threading_mutex_t mutex; -#endif -} -mbedtls_ctr_drbg_context; - -/** - * \brief CTR_DRBG context initialization - * Makes the context ready for mbedtls_ctr_drbg_seed() or - * mbedtls_ctr_drbg_free(). - * - * \param ctx CTR_DRBG context to be initialized - */ -void mbedtls_ctr_drbg_init( mbedtls_ctr_drbg_context *ctx ); - -/** - * \brief CTR_DRBG initial seeding - * Seed and setup entropy source for future reseeds. - * - * Note: Personalization data can be provided in addition to the more generic - * entropy source to make this instantiation as unique as possible. - * - * \param ctx CTR_DRBG context to be seeded - * \param f_entropy Entropy callback (p_entropy, buffer to fill, buffer - * length) - * \param p_entropy Entropy context - * \param custom Personalization data (Device specific identifiers) - * (Can be NULL) - * \param len Length of personalization data - * - * \return 0 if successful, or - * MBEDTLS_ERR_CTR_DRBG_ENTROPY_SOURCE_FAILED - */ -int mbedtls_ctr_drbg_seed( mbedtls_ctr_drbg_context *ctx, - int (*f_entropy)(void *, unsigned char *, size_t), - void *p_entropy, - const unsigned char *custom, - size_t len ); - -/** - * \brief Clear CTR_CRBG context data - * - * \param ctx CTR_DRBG context to clear - */ -void mbedtls_ctr_drbg_free( mbedtls_ctr_drbg_context *ctx ); - -/** - * \brief Enable / disable prediction resistance (Default: Off) - * - * Note: If enabled, entropy is used for ctx->entropy_len before each call! - * Only use this if you have ample supply of good entropy! - * - * \param ctx CTR_DRBG context - * \param resistance MBEDTLS_CTR_DRBG_PR_ON or MBEDTLS_CTR_DRBG_PR_OFF - */ -void mbedtls_ctr_drbg_set_prediction_resistance( mbedtls_ctr_drbg_context *ctx, - int resistance ); - -/** - * \brief Set the amount of entropy grabbed on each (re)seed - * (Default: MBEDTLS_CTR_DRBG_ENTROPY_LEN) - * - * \param ctx CTR_DRBG context - * \param len Amount of entropy to grab - */ -void mbedtls_ctr_drbg_set_entropy_len( mbedtls_ctr_drbg_context *ctx, - size_t len ); - -/** - * \brief Set the reseed interval - * (Default: MBEDTLS_CTR_DRBG_RESEED_INTERVAL) - * - * \param ctx CTR_DRBG context - * \param interval Reseed interval - */ -void mbedtls_ctr_drbg_set_reseed_interval( mbedtls_ctr_drbg_context *ctx, - int interval ); - -/** - * \brief CTR_DRBG reseeding (extracts data from entropy source) - * - * \param ctx CTR_DRBG context - * \param additional Additional data to add to state (Can be NULL) - * \param len Length of additional data - * - * \return 0 if successful, or - * MBEDTLS_ERR_CTR_DRBG_ENTROPY_SOURCE_FAILED - */ -int mbedtls_ctr_drbg_reseed( mbedtls_ctr_drbg_context *ctx, - const unsigned char *additional, size_t len ); - -/** - * \brief CTR_DRBG update state - * - * \param ctx CTR_DRBG context - * \param additional Additional data to update state with - * \param add_len Length of additional data - * - * \note If add_len is greater than MBEDTLS_CTR_DRBG_MAX_SEED_INPUT, - * only the first MBEDTLS_CTR_DRBG_MAX_SEED_INPUT bytes are used, - * the remaining ones are silently discarded. - */ -void mbedtls_ctr_drbg_update( mbedtls_ctr_drbg_context *ctx, - const unsigned char *additional, size_t add_len ); - -/** - * \brief CTR_DRBG generate random with additional update input - * - * Note: Automatically reseeds if reseed_counter is reached. - * - * \param p_rng CTR_DRBG context - * \param output Buffer to fill - * \param output_len Length of the buffer - * \param additional Additional data to update with (Can be NULL) - * \param add_len Length of additional data - * - * \return 0 if successful, or - * MBEDTLS_ERR_CTR_DRBG_ENTROPY_SOURCE_FAILED, or - * MBEDTLS_ERR_CTR_DRBG_REQUEST_TOO_BIG - */ -int mbedtls_ctr_drbg_random_with_add( void *p_rng, - unsigned char *output, size_t output_len, - const unsigned char *additional, size_t add_len ); - -/** - * \brief CTR_DRBG generate random - * - * Note: Automatically reseeds if reseed_counter is reached. - * - * \param p_rng CTR_DRBG context - * \param output Buffer to fill - * \param output_len Length of the buffer - * - * \return 0 if successful, or - * MBEDTLS_ERR_CTR_DRBG_ENTROPY_SOURCE_FAILED, or - * MBEDTLS_ERR_CTR_DRBG_REQUEST_TOO_BIG - */ -int mbedtls_ctr_drbg_random( void *p_rng, - unsigned char *output, size_t output_len ); - -#if defined(MBEDTLS_FS_IO) -/** - * \brief Write a seed file - * - * \param ctx CTR_DRBG context - * \param path Name of the file - * - * \return 0 if successful, - * MBEDTLS_ERR_CTR_DRBG_FILE_IO_ERROR on file error, or - * MBEDTLS_ERR_CTR_DRBG_ENTROPY_SOURCE_FAILED - */ -int mbedtls_ctr_drbg_write_seed_file( mbedtls_ctr_drbg_context *ctx, const char *path ); - -/** - * \brief Read and update a seed file. Seed is added to this - * instance - * - * \param ctx CTR_DRBG context - * \param path Name of the file - * - * \return 0 if successful, - * MBEDTLS_ERR_CTR_DRBG_FILE_IO_ERROR on file error, - * MBEDTLS_ERR_CTR_DRBG_ENTROPY_SOURCE_FAILED or - * MBEDTLS_ERR_CTR_DRBG_INPUT_TOO_BIG - */ -int mbedtls_ctr_drbg_update_seed_file( mbedtls_ctr_drbg_context *ctx, const char *path ); -#endif /* MBEDTLS_FS_IO */ - -/** - * \brief Checkup routine - * - * \return 0 if successful, or 1 if the test failed - */ -int mbedtls_ctr_drbg_self_test( int verbose ); - -/* Internal functions (do not call directly) */ -int mbedtls_ctr_drbg_seed_entropy_len( mbedtls_ctr_drbg_context *, - int (*)(void *, unsigned char *, size_t), void *, - const unsigned char *, size_t, size_t ); - -#ifdef __cplusplus -} -#endif - -#endif /* ctr_drbg.h */ diff --git a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/debug.h b/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/debug.h deleted file mode 100644 index d859dd5f..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/debug.h +++ /dev/null @@ -1,125 +0,0 @@ -/** - * \file debug.h - * - * \brief Debug functions - * - * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * This file is part of mbed TLS (https://tls.mbed.org) - */ -#ifndef MBEDTLS_DEBUG_H -#define MBEDTLS_DEBUG_H - -#if !defined(MBEDTLS_CONFIG_FILE) -#include "config.h" -#else -#include MBEDTLS_CONFIG_FILE -#endif - -#include "ssl.h" - -#if defined(MBEDTLS_ECP_C) -#include "ecp.h" -#endif - -#if defined(MBEDTLS_DEBUG_C) - -#define MBEDTLS_DEBUG_STRIP_PARENS( ... ) __VA_ARGS__ - -#define MBEDTLS_SSL_DEBUG_MSG( level, args ) \ - mbedtls_debug_print_msg( ssl, level, __FILE__, __LINE__, \ - MBEDTLS_DEBUG_STRIP_PARENS args ) - -#define MBEDTLS_SSL_DEBUG_RET( level, text, ret ) \ - mbedtls_debug_print_ret( ssl, level, __FILE__, __LINE__, text, ret ) - -#define MBEDTLS_SSL_DEBUG_BUF( level, text, buf, len ) \ - mbedtls_debug_print_buf( ssl, level, __FILE__, __LINE__, text, buf, len ) - -#if defined(MBEDTLS_BIGNUM_C) -#define MBEDTLS_SSL_DEBUG_MPI( level, text, X ) \ - mbedtls_debug_print_mpi( ssl, level, __FILE__, __LINE__, text, X ) -#endif - -#if defined(MBEDTLS_ECP_C) -#define MBEDTLS_SSL_DEBUG_ECP( level, text, X ) \ - mbedtls_debug_print_ecp( ssl, level, __FILE__, __LINE__, text, X ) -#endif - -#if defined(MBEDTLS_X509_CRT_PARSE_C) -#define MBEDTLS_SSL_DEBUG_CRT( level, text, crt ) \ - mbedtls_debug_print_crt( ssl, level, __FILE__, __LINE__, text, crt ) -#endif - -#else /* MBEDTLS_DEBUG_C */ - -#define MBEDTLS_SSL_DEBUG_MSG( level, args ) do { } while( 0 ) -#define MBEDTLS_SSL_DEBUG_RET( level, text, ret ) do { } while( 0 ) -#define MBEDTLS_SSL_DEBUG_BUF( level, text, buf, len ) do { } while( 0 ) -#define MBEDTLS_SSL_DEBUG_MPI( level, text, X ) do { } while( 0 ) -#define MBEDTLS_SSL_DEBUG_ECP( level, text, X ) do { } while( 0 ) -#define MBEDTLS_SSL_DEBUG_CRT( level, text, crt ) do { } while( 0 ) - -#endif /* MBEDTLS_DEBUG_C */ - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * \brief Set the level threshold to handle globally. Messages that have a - * level over the threshold value are ignored. - * (Default value: 0 (No debug)) - * - * \param threshold maximum level of messages to pass on - */ -void mbedtls_debug_set_threshold( int threshold ); - -void mbedtls_debug_print_msg( const mbedtls_ssl_context *ssl, int level, - const char *file, int line, - const char *format, ... ); - -void mbedtls_debug_print_ret( const mbedtls_ssl_context *ssl, int level, - const char *file, int line, - const char *text, int ret ); - -void mbedtls_debug_print_buf( const mbedtls_ssl_context *ssl, int level, - const char *file, int line, const char *text, - const unsigned char *buf, size_t len ); - -#if defined(MBEDTLS_BIGNUM_C) -void mbedtls_debug_print_mpi( const mbedtls_ssl_context *ssl, int level, - const char *file, int line, - const char *text, const mbedtls_mpi *X ); -#endif - -#if defined(MBEDTLS_ECP_C) -void mbedtls_debug_print_ecp( const mbedtls_ssl_context *ssl, int level, - const char *file, int line, - const char *text, const mbedtls_ecp_point *X ); -#endif - -#if defined(MBEDTLS_X509_CRT_PARSE_C) -void mbedtls_debug_print_crt( const mbedtls_ssl_context *ssl, int level, - const char *file, int line, - const char *text, const mbedtls_x509_crt *crt ); -#endif - -#ifdef __cplusplus -} -#endif - -#endif /* debug.h */ diff --git a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/des.h b/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/des.h deleted file mode 100644 index 5ca2ecf2..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/des.h +++ /dev/null @@ -1,306 +0,0 @@ -/** - * \file des.h - * - * \brief DES block cipher - * - * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * This file is part of mbed TLS (https://tls.mbed.org) - */ -#ifndef MBEDTLS_DES_H -#define MBEDTLS_DES_H - -#if !defined(MBEDTLS_CONFIG_FILE) -#include "config.h" -#else -#include MBEDTLS_CONFIG_FILE -#endif - -#include -#include - -#define MBEDTLS_DES_ENCRYPT 1 -#define MBEDTLS_DES_DECRYPT 0 - -#define MBEDTLS_ERR_DES_INVALID_INPUT_LENGTH -0x0032 /**< The data input has an invalid length. */ - -#define MBEDTLS_DES_KEY_SIZE 8 - -#if !defined(MBEDTLS_DES_ALT) -// Regular implementation -// - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * \brief DES context structure - */ -typedef struct -{ - uint32_t sk[32]; /*!< DES subkeys */ -} -mbedtls_des_context; - -/** - * \brief Triple-DES context structure - */ -typedef struct -{ - uint32_t sk[96]; /*!< 3DES subkeys */ -} -mbedtls_des3_context; - -/** - * \brief Initialize DES context - * - * \param ctx DES context to be initialized - */ -void mbedtls_des_init( mbedtls_des_context *ctx ); - -/** - * \brief Clear DES context - * - * \param ctx DES context to be cleared - */ -void mbedtls_des_free( mbedtls_des_context *ctx ); - -/** - * \brief Initialize Triple-DES context - * - * \param ctx DES3 context to be initialized - */ -void mbedtls_des3_init( mbedtls_des3_context *ctx ); - -/** - * \brief Clear Triple-DES context - * - * \param ctx DES3 context to be cleared - */ -void mbedtls_des3_free( mbedtls_des3_context *ctx ); - -/** - * \brief Set key parity on the given key to odd. - * - * DES keys are 56 bits long, but each byte is padded with - * a parity bit to allow verification. - * - * \param key 8-byte secret key - */ -void mbedtls_des_key_set_parity( unsigned char key[MBEDTLS_DES_KEY_SIZE] ); - -/** - * \brief Check that key parity on the given key is odd. - * - * DES keys are 56 bits long, but each byte is padded with - * a parity bit to allow verification. - * - * \param key 8-byte secret key - * - * \return 0 is parity was ok, 1 if parity was not correct. - */ -int mbedtls_des_key_check_key_parity( const unsigned char key[MBEDTLS_DES_KEY_SIZE] ); - -/** - * \brief Check that key is not a weak or semi-weak DES key - * - * \param key 8-byte secret key - * - * \return 0 if no weak key was found, 1 if a weak key was identified. - */ -int mbedtls_des_key_check_weak( const unsigned char key[MBEDTLS_DES_KEY_SIZE] ); - -/** - * \brief DES key schedule (56-bit, encryption) - * - * \param ctx DES context to be initialized - * \param key 8-byte secret key - * - * \return 0 - */ -int mbedtls_des_setkey_enc( mbedtls_des_context *ctx, const unsigned char key[MBEDTLS_DES_KEY_SIZE] ); - -/** - * \brief DES key schedule (56-bit, decryption) - * - * \param ctx DES context to be initialized - * \param key 8-byte secret key - * - * \return 0 - */ -int mbedtls_des_setkey_dec( mbedtls_des_context *ctx, const unsigned char key[MBEDTLS_DES_KEY_SIZE] ); - -/** - * \brief Triple-DES key schedule (112-bit, encryption) - * - * \param ctx 3DES context to be initialized - * \param key 16-byte secret key - * - * \return 0 - */ -int mbedtls_des3_set2key_enc( mbedtls_des3_context *ctx, - const unsigned char key[MBEDTLS_DES_KEY_SIZE * 2] ); - -/** - * \brief Triple-DES key schedule (112-bit, decryption) - * - * \param ctx 3DES context to be initialized - * \param key 16-byte secret key - * - * \return 0 - */ -int mbedtls_des3_set2key_dec( mbedtls_des3_context *ctx, - const unsigned char key[MBEDTLS_DES_KEY_SIZE * 2] ); - -/** - * \brief Triple-DES key schedule (168-bit, encryption) - * - * \param ctx 3DES context to be initialized - * \param key 24-byte secret key - * - * \return 0 - */ -int mbedtls_des3_set3key_enc( mbedtls_des3_context *ctx, - const unsigned char key[MBEDTLS_DES_KEY_SIZE * 3] ); - -/** - * \brief Triple-DES key schedule (168-bit, decryption) - * - * \param ctx 3DES context to be initialized - * \param key 24-byte secret key - * - * \return 0 - */ -int mbedtls_des3_set3key_dec( mbedtls_des3_context *ctx, - const unsigned char key[MBEDTLS_DES_KEY_SIZE * 3] ); - -/** - * \brief DES-ECB block encryption/decryption - * - * \param ctx DES context - * \param input 64-bit input block - * \param output 64-bit output block - * - * \return 0 if successful - */ -int mbedtls_des_crypt_ecb( mbedtls_des_context *ctx, - const unsigned char input[8], - unsigned char output[8] ); - -#if defined(MBEDTLS_CIPHER_MODE_CBC) -/** - * \brief DES-CBC buffer encryption/decryption - * - * \note Upon exit, the content of the IV is updated so that you can - * call the function same function again on the following - * block(s) of data and get the same result as if it was - * encrypted in one call. This allows a "streaming" usage. - * If on the other hand you need to retain the contents of the - * IV, you should either save it manually or use the cipher - * module instead. - * - * \param ctx DES context - * \param mode MBEDTLS_DES_ENCRYPT or MBEDTLS_DES_DECRYPT - * \param length length of the input data - * \param iv initialization vector (updated after use) - * \param input buffer holding the input data - * \param output buffer holding the output data - */ -int mbedtls_des_crypt_cbc( mbedtls_des_context *ctx, - int mode, - size_t length, - unsigned char iv[8], - const unsigned char *input, - unsigned char *output ); -#endif /* MBEDTLS_CIPHER_MODE_CBC */ - -/** - * \brief 3DES-ECB block encryption/decryption - * - * \param ctx 3DES context - * \param input 64-bit input block - * \param output 64-bit output block - * - * \return 0 if successful - */ -int mbedtls_des3_crypt_ecb( mbedtls_des3_context *ctx, - const unsigned char input[8], - unsigned char output[8] ); - -#if defined(MBEDTLS_CIPHER_MODE_CBC) -/** - * \brief 3DES-CBC buffer encryption/decryption - * - * \note Upon exit, the content of the IV is updated so that you can - * call the function same function again on the following - * block(s) of data and get the same result as if it was - * encrypted in one call. This allows a "streaming" usage. - * If on the other hand you need to retain the contents of the - * IV, you should either save it manually or use the cipher - * module instead. - * - * \param ctx 3DES context - * \param mode MBEDTLS_DES_ENCRYPT or MBEDTLS_DES_DECRYPT - * \param length length of the input data - * \param iv initialization vector (updated after use) - * \param input buffer holding the input data - * \param output buffer holding the output data - * - * \return 0 if successful, or MBEDTLS_ERR_DES_INVALID_INPUT_LENGTH - */ -int mbedtls_des3_crypt_cbc( mbedtls_des3_context *ctx, - int mode, - size_t length, - unsigned char iv[8], - const unsigned char *input, - unsigned char *output ); -#endif /* MBEDTLS_CIPHER_MODE_CBC */ - -/** - * \brief Internal function for key expansion. - * (Only exposed to allow overriding it, - * see MBEDTLS_DES_SETKEY_ALT) - * - * \param SK Round keys - * \param key Base key - */ -void mbedtls_des_setkey( uint32_t SK[32], - const unsigned char key[MBEDTLS_DES_KEY_SIZE] ); -#ifdef __cplusplus -} -#endif - -#else /* MBEDTLS_DES_ALT */ -#include "des_alt.h" -#endif /* MBEDTLS_DES_ALT */ - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * \brief Checkup routine - * - * \return 0 if successful, or 1 if the test failed - */ -int mbedtls_des_self_test( int verbose ); - -#ifdef __cplusplus -} -#endif - -#endif /* des.h */ diff --git a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/dhm.h b/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/dhm.h deleted file mode 100644 index cd056d1b..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/dhm.h +++ /dev/null @@ -1,305 +0,0 @@ -/** - * \file dhm.h - * - * \brief Diffie-Hellman-Merkle key exchange - * - * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * This file is part of mbed TLS (https://tls.mbed.org) - */ -#ifndef MBEDTLS_DHM_H -#define MBEDTLS_DHM_H - -#include "bignum.h" - -/* - * DHM Error codes - */ -#define MBEDTLS_ERR_DHM_BAD_INPUT_DATA -0x3080 /**< Bad input parameters to function. */ -#define MBEDTLS_ERR_DHM_READ_PARAMS_FAILED -0x3100 /**< Reading of the DHM parameters failed. */ -#define MBEDTLS_ERR_DHM_MAKE_PARAMS_FAILED -0x3180 /**< Making of the DHM parameters failed. */ -#define MBEDTLS_ERR_DHM_READ_PUBLIC_FAILED -0x3200 /**< Reading of the public values failed. */ -#define MBEDTLS_ERR_DHM_MAKE_PUBLIC_FAILED -0x3280 /**< Making of the public value failed. */ -#define MBEDTLS_ERR_DHM_CALC_SECRET_FAILED -0x3300 /**< Calculation of the DHM secret failed. */ -#define MBEDTLS_ERR_DHM_INVALID_FORMAT -0x3380 /**< The ASN.1 data is not formatted correctly. */ -#define MBEDTLS_ERR_DHM_ALLOC_FAILED -0x3400 /**< Allocation of memory failed. */ -#define MBEDTLS_ERR_DHM_FILE_IO_ERROR -0x3480 /**< Read/write of file failed. */ - -/** - * RFC 3526 defines a number of standardized Diffie-Hellman groups - * for IKE. - * RFC 5114 defines a number of standardized Diffie-Hellman groups - * that can be used. - * - * Some are included here for convenience. - * - * Included are: - * RFC 3526 3. 2048-bit MODP Group - * RFC 3526 4. 3072-bit MODP Group - * RFC 3526 5. 4096-bit MODP Group - * RFC 5114 2.2. 2048-bit MODP Group with 224-bit Prime Order Subgroup - */ -#define MBEDTLS_DHM_RFC3526_MODP_2048_P \ - "FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD1" \ - "29024E088A67CC74020BBEA63B139B22514A08798E3404DD" \ - "EF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245" \ - "E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7ED" \ - "EE386BFB5A899FA5AE9F24117C4B1FE649286651ECE45B3D" \ - "C2007CB8A163BF0598DA48361C55D39A69163FA8FD24CF5F" \ - "83655D23DCA3AD961C62F356208552BB9ED529077096966D" \ - "670C354E4ABC9804F1746C08CA18217C32905E462E36CE3B" \ - "E39E772C180E86039B2783A2EC07A28FB5C55DF06F4C52C9" \ - "DE2BCBF6955817183995497CEA956AE515D2261898FA0510" \ - "15728E5A8AACAA68FFFFFFFFFFFFFFFF" - -#define MBEDTLS_DHM_RFC3526_MODP_2048_G "02" - -#define MBEDTLS_DHM_RFC3526_MODP_3072_P \ - "FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD1" \ - "29024E088A67CC74020BBEA63B139B22514A08798E3404DD" \ - "EF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245" \ - "E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7ED" \ - "EE386BFB5A899FA5AE9F24117C4B1FE649286651ECE45B3D" \ - "C2007CB8A163BF0598DA48361C55D39A69163FA8FD24CF5F" \ - "83655D23DCA3AD961C62F356208552BB9ED529077096966D" \ - "670C354E4ABC9804F1746C08CA18217C32905E462E36CE3B" \ - "E39E772C180E86039B2783A2EC07A28FB5C55DF06F4C52C9" \ - "DE2BCBF6955817183995497CEA956AE515D2261898FA0510" \ - "15728E5A8AAAC42DAD33170D04507A33A85521ABDF1CBA64" \ - "ECFB850458DBEF0A8AEA71575D060C7DB3970F85A6E1E4C7" \ - "ABF5AE8CDB0933D71E8C94E04A25619DCEE3D2261AD2EE6B" \ - "F12FFA06D98A0864D87602733EC86A64521F2B18177B200C" \ - "BBE117577A615D6C770988C0BAD946E208E24FA074E5AB31" \ - "43DB5BFCE0FD108E4B82D120A93AD2CAFFFFFFFFFFFFFFFF" - -#define MBEDTLS_DHM_RFC3526_MODP_3072_G "02" - -#define MBEDTLS_DHM_RFC3526_MODP_4096_P \ - "FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD1" \ - "29024E088A67CC74020BBEA63B139B22514A08798E3404DD" \ - "EF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245" \ - "E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7ED" \ - "EE386BFB5A899FA5AE9F24117C4B1FE649286651ECE45B3D" \ - "C2007CB8A163BF0598DA48361C55D39A69163FA8FD24CF5F" \ - "83655D23DCA3AD961C62F356208552BB9ED529077096966D" \ - "670C354E4ABC9804F1746C08CA18217C32905E462E36CE3B" \ - "E39E772C180E86039B2783A2EC07A28FB5C55DF06F4C52C9" \ - "DE2BCBF6955817183995497CEA956AE515D2261898FA0510" \ - "15728E5A8AAAC42DAD33170D04507A33A85521ABDF1CBA64" \ - "ECFB850458DBEF0A8AEA71575D060C7DB3970F85A6E1E4C7" \ - "ABF5AE8CDB0933D71E8C94E04A25619DCEE3D2261AD2EE6B" \ - "F12FFA06D98A0864D87602733EC86A64521F2B18177B200C" \ - "BBE117577A615D6C770988C0BAD946E208E24FA074E5AB31" \ - "43DB5BFCE0FD108E4B82D120A92108011A723C12A787E6D7" \ - "88719A10BDBA5B2699C327186AF4E23C1A946834B6150BDA" \ - "2583E9CA2AD44CE8DBBBC2DB04DE8EF92E8EFC141FBECAA6" \ - "287C59474E6BC05D99B2964FA090C3A2233BA186515BE7ED" \ - "1F612970CEE2D7AFB81BDD762170481CD0069127D5B05AA9" \ - "93B4EA988D8FDDC186FFB7DC90A6C08F4DF435C934063199" \ - "FFFFFFFFFFFFFFFF" - -#define MBEDTLS_DHM_RFC3526_MODP_4096_G "02" - -#define MBEDTLS_DHM_RFC5114_MODP_2048_P \ - "AD107E1E9123A9D0D660FAA79559C51FA20D64E5683B9FD1" \ - "B54B1597B61D0A75E6FA141DF95A56DBAF9A3C407BA1DF15" \ - "EB3D688A309C180E1DE6B85A1274A0A66D3F8152AD6AC212" \ - "9037C9EDEFDA4DF8D91E8FEF55B7394B7AD5B7D0B6C12207" \ - "C9F98D11ED34DBF6C6BA0B2C8BBC27BE6A00E0A0B9C49708" \ - "B3BF8A317091883681286130BC8985DB1602E714415D9330" \ - "278273C7DE31EFDC7310F7121FD5A07415987D9ADC0A486D" \ - "CDF93ACC44328387315D75E198C641A480CD86A1B9E587E8" \ - "BE60E69CC928B2B9C52172E413042E9B23F10B0E16E79763" \ - "C9B53DCF4BA80A29E3FB73C16B8E75B97EF363E2FFA31F71" \ - "CF9DE5384E71B81C0AC4DFFE0C10E64F" - -#define MBEDTLS_DHM_RFC5114_MODP_2048_G \ - "AC4032EF4F2D9AE39DF30B5C8FFDAC506CDEBE7B89998CAF"\ - "74866A08CFE4FFE3A6824A4E10B9A6F0DD921F01A70C4AFA"\ - "AB739D7700C29F52C57DB17C620A8652BE5E9001A8D66AD7"\ - "C17669101999024AF4D027275AC1348BB8A762D0521BC98A"\ - "E247150422EA1ED409939D54DA7460CDB5F6C6B250717CBE"\ - "F180EB34118E98D119529A45D6F834566E3025E316A330EF"\ - "BB77A86F0C1AB15B051AE3D428C8F8ACB70A8137150B8EEB"\ - "10E183EDD19963DDD9E263E4770589EF6AA21E7F5F2FF381"\ - "B539CCE3409D13CD566AFBB48D6C019181E1BCFE94B30269"\ - "EDFE72FE9B6AA4BD7B5A0F1C71CFFF4C19C418E1F6EC0179"\ - "81BC087F2A7065B384B890D3191F2BFA" - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * \brief DHM context structure - */ -typedef struct -{ - size_t len; /*!< size(P) in chars */ - mbedtls_mpi P; /*!< prime modulus */ - mbedtls_mpi G; /*!< generator */ - mbedtls_mpi X; /*!< secret value */ - mbedtls_mpi GX; /*!< self = G^X mod P */ - mbedtls_mpi GY; /*!< peer = G^Y mod P */ - mbedtls_mpi K; /*!< key = GY^X mod P */ - mbedtls_mpi RP; /*!< cached R^2 mod P */ - mbedtls_mpi Vi; /*!< blinding value */ - mbedtls_mpi Vf; /*!< un-blinding value */ - mbedtls_mpi pX; /*!< previous X */ -} -mbedtls_dhm_context; - -/** - * \brief Initialize DHM context - * - * \param ctx DHM context to be initialized - */ -void mbedtls_dhm_init( mbedtls_dhm_context *ctx ); - -/** - * \brief Parse the ServerKeyExchange parameters - * - * \param ctx DHM context - * \param p &(start of input buffer) - * \param end end of buffer - * - * \return 0 if successful, or an MBEDTLS_ERR_DHM_XXX error code - */ -int mbedtls_dhm_read_params( mbedtls_dhm_context *ctx, - unsigned char **p, - const unsigned char *end ); - -/** - * \brief Setup and write the ServerKeyExchange parameters - * - * \param ctx DHM context - * \param x_size private value size in bytes - * \param output destination buffer - * \param olen number of chars written - * \param f_rng RNG function - * \param p_rng RNG parameter - * - * \note This function assumes that ctx->P and ctx->G - * have already been properly set (for example - * using mbedtls_mpi_read_string or mbedtls_mpi_read_binary). - * - * \return 0 if successful, or an MBEDTLS_ERR_DHM_XXX error code - */ -int mbedtls_dhm_make_params( mbedtls_dhm_context *ctx, int x_size, - unsigned char *output, size_t *olen, - int (*f_rng)(void *, unsigned char *, size_t), - void *p_rng ); - -/** - * \brief Import the peer's public value G^Y - * - * \param ctx DHM context - * \param input input buffer - * \param ilen size of buffer - * - * \return 0 if successful, or an MBEDTLS_ERR_DHM_XXX error code - */ -int mbedtls_dhm_read_public( mbedtls_dhm_context *ctx, - const unsigned char *input, size_t ilen ); - -/** - * \brief Create own private value X and export G^X - * - * \param ctx DHM context - * \param x_size private value size in bytes - * \param output destination buffer - * \param olen must be equal to ctx->P.len - * \param f_rng RNG function - * \param p_rng RNG parameter - * - * \return 0 if successful, or an MBEDTLS_ERR_DHM_XXX error code - */ -int mbedtls_dhm_make_public( mbedtls_dhm_context *ctx, int x_size, - unsigned char *output, size_t olen, - int (*f_rng)(void *, unsigned char *, size_t), - void *p_rng ); - -/** - * \brief Derive and export the shared secret (G^Y)^X mod P - * - * \param ctx DHM context - * \param output destination buffer - * \param output_size size of the destination buffer - * \param olen on exit, holds the actual number of bytes written - * \param f_rng RNG function, for blinding purposes - * \param p_rng RNG parameter - * - * \return 0 if successful, or an MBEDTLS_ERR_DHM_XXX error code - * - * \note If non-NULL, f_rng is used to blind the input as - * countermeasure against timing attacks. Blinding is - * automatically used if and only if our secret value X is - * re-used and costs nothing otherwise, so it is recommended - * to always pass a non-NULL f_rng argument. - */ -int mbedtls_dhm_calc_secret( mbedtls_dhm_context *ctx, - unsigned char *output, size_t output_size, size_t *olen, - int (*f_rng)(void *, unsigned char *, size_t), - void *p_rng ); - -/** - * \brief Free and clear the components of a DHM key - * - * \param ctx DHM context to free and clear - */ -void mbedtls_dhm_free( mbedtls_dhm_context *ctx ); - -#if defined(MBEDTLS_ASN1_PARSE_C) -/** \ingroup x509_module */ -/** - * \brief Parse DHM parameters in PEM or DER format - * - * \param dhm DHM context to be initialized - * \param dhmin input buffer - * \param dhminlen size of the buffer - * (including the terminating null byte for PEM data) - * - * \return 0 if successful, or a specific DHM or PEM error code - */ -int mbedtls_dhm_parse_dhm( mbedtls_dhm_context *dhm, const unsigned char *dhmin, - size_t dhminlen ); - -#if defined(MBEDTLS_FS_IO) -/** \ingroup x509_module */ -/** - * \brief Load and parse DHM parameters - * - * \param dhm DHM context to be initialized - * \param path filename to read the DHM Parameters from - * - * \return 0 if successful, or a specific DHM or PEM error code - */ -int mbedtls_dhm_parse_dhmfile( mbedtls_dhm_context *dhm, const char *path ); -#endif /* MBEDTLS_FS_IO */ -#endif /* MBEDTLS_ASN1_PARSE_C */ - -/** - * \brief Checkup routine - * - * \return 0 if successful, or 1 if the test failed - */ -int mbedtls_dhm_self_test( int verbose ); - -#ifdef __cplusplus -} -#endif - -#endif /* dhm.h */ diff --git a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/ecdh.h b/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/ecdh.h deleted file mode 100644 index 625a2819..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/ecdh.h +++ /dev/null @@ -1,214 +0,0 @@ -/** - * \file ecdh.h - * - * \brief Elliptic curve Diffie-Hellman - * - * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * This file is part of mbed TLS (https://tls.mbed.org) - */ -#ifndef MBEDTLS_ECDH_H -#define MBEDTLS_ECDH_H - -#include "ecp.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * When importing from an EC key, select if it is our key or the peer's key - */ -typedef enum -{ - MBEDTLS_ECDH_OURS, - MBEDTLS_ECDH_THEIRS, -} mbedtls_ecdh_side; - -/** - * \brief ECDH context structure - */ -typedef struct -{ - mbedtls_ecp_group grp; /*!< elliptic curve used */ - mbedtls_mpi d; /*!< our secret value (private key) */ - mbedtls_ecp_point Q; /*!< our public value (public key) */ - mbedtls_ecp_point Qp; /*!< peer's public value (public key) */ - mbedtls_mpi z; /*!< shared secret */ - int point_format; /*!< format for point export in TLS messages */ - mbedtls_ecp_point Vi; /*!< blinding value (for later) */ - mbedtls_ecp_point Vf; /*!< un-blinding value (for later) */ - mbedtls_mpi _d; /*!< previous d (for later) */ -} -mbedtls_ecdh_context; - -/** - * \brief Generate a public key. - * Raw function that only does the core computation. - * - * \param grp ECP group - * \param d Destination MPI (secret exponent, aka private key) - * \param Q Destination point (public key) - * \param f_rng RNG function - * \param p_rng RNG parameter - * - * \return 0 if successful, - * or a MBEDTLS_ERR_ECP_XXX or MBEDTLS_MPI_XXX error code - */ -int mbedtls_ecdh_gen_public( mbedtls_ecp_group *grp, mbedtls_mpi *d, mbedtls_ecp_point *Q, - int (*f_rng)(void *, unsigned char *, size_t), - void *p_rng ); - -/** - * \brief Compute shared secret - * Raw function that only does the core computation. - * - * \param grp ECP group - * \param z Destination MPI (shared secret) - * \param Q Public key from other party - * \param d Our secret exponent (private key) - * \param f_rng RNG function (see notes) - * \param p_rng RNG parameter - * - * \return 0 if successful, - * or a MBEDTLS_ERR_ECP_XXX or MBEDTLS_MPI_XXX error code - * - * \note If f_rng is not NULL, it is used to implement - * countermeasures against potential elaborate timing - * attacks, see \c mbedtls_ecp_mul() for details. - */ -int mbedtls_ecdh_compute_shared( mbedtls_ecp_group *grp, mbedtls_mpi *z, - const mbedtls_ecp_point *Q, const mbedtls_mpi *d, - int (*f_rng)(void *, unsigned char *, size_t), - void *p_rng ); - -/** - * \brief Initialize context - * - * \param ctx Context to initialize - */ -void mbedtls_ecdh_init( mbedtls_ecdh_context *ctx ); - -/** - * \brief Free context - * - * \param ctx Context to free - */ -void mbedtls_ecdh_free( mbedtls_ecdh_context *ctx ); - -/** - * \brief Generate a public key and a TLS ServerKeyExchange payload. - * (First function used by a TLS server for ECDHE.) - * - * \param ctx ECDH context - * \param olen number of chars written - * \param buf destination buffer - * \param blen length of buffer - * \param f_rng RNG function - * \param p_rng RNG parameter - * - * \note This function assumes that ctx->grp has already been - * properly set (for example using mbedtls_ecp_group_load). - * - * \return 0 if successful, or an MBEDTLS_ERR_ECP_XXX error code - */ -int mbedtls_ecdh_make_params( mbedtls_ecdh_context *ctx, size_t *olen, - unsigned char *buf, size_t blen, - int (*f_rng)(void *, unsigned char *, size_t), - void *p_rng ); - -/** - * \brief Parse and procress a TLS ServerKeyExhange payload. - * (First function used by a TLS client for ECDHE.) - * - * \param ctx ECDH context - * \param buf pointer to start of input buffer - * \param end one past end of buffer - * - * \return 0 if successful, or an MBEDTLS_ERR_ECP_XXX error code - */ -int mbedtls_ecdh_read_params( mbedtls_ecdh_context *ctx, - const unsigned char **buf, const unsigned char *end ); - -/** - * \brief Setup an ECDH context from an EC key. - * (Used by clients and servers in place of the - * ServerKeyEchange for static ECDH: import ECDH parameters - * from a certificate's EC key information.) - * - * \param ctx ECDH constext to set - * \param key EC key to use - * \param side Is it our key (1) or the peer's key (0) ? - * - * \return 0 if successful, or an MBEDTLS_ERR_ECP_XXX error code - */ -int mbedtls_ecdh_get_params( mbedtls_ecdh_context *ctx, const mbedtls_ecp_keypair *key, - mbedtls_ecdh_side side ); - -/** - * \brief Generate a public key and a TLS ClientKeyExchange payload. - * (Second function used by a TLS client for ECDH(E).) - * - * \param ctx ECDH context - * \param olen number of bytes actually written - * \param buf destination buffer - * \param blen size of destination buffer - * \param f_rng RNG function - * \param p_rng RNG parameter - * - * \return 0 if successful, or an MBEDTLS_ERR_ECP_XXX error code - */ -int mbedtls_ecdh_make_public( mbedtls_ecdh_context *ctx, size_t *olen, - unsigned char *buf, size_t blen, - int (*f_rng)(void *, unsigned char *, size_t), - void *p_rng ); - -/** - * \brief Parse and process a TLS ClientKeyExchange payload. - * (Second function used by a TLS server for ECDH(E).) - * - * \param ctx ECDH context - * \param buf start of input buffer - * \param blen length of input buffer - * - * \return 0 if successful, or an MBEDTLS_ERR_ECP_XXX error code - */ -int mbedtls_ecdh_read_public( mbedtls_ecdh_context *ctx, - const unsigned char *buf, size_t blen ); - -/** - * \brief Derive and export the shared secret. - * (Last function used by both TLS client en servers.) - * - * \param ctx ECDH context - * \param olen number of bytes written - * \param buf destination buffer - * \param blen buffer length - * \param f_rng RNG function, see notes for \c mbedtls_ecdh_compute_shared() - * \param p_rng RNG parameter - * - * \return 0 if successful, or an MBEDTLS_ERR_ECP_XXX error code - */ -int mbedtls_ecdh_calc_secret( mbedtls_ecdh_context *ctx, size_t *olen, - unsigned char *buf, size_t blen, - int (*f_rng)(void *, unsigned char *, size_t), - void *p_rng ); - -#ifdef __cplusplus -} -#endif - -#endif /* ecdh.h */ diff --git a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/ecdsa.h b/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/ecdsa.h deleted file mode 100644 index 52827d8d..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/ecdsa.h +++ /dev/null @@ -1,248 +0,0 @@ -/** - * \file ecdsa.h - * - * \brief Elliptic curve DSA - * - * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * This file is part of mbed TLS (https://tls.mbed.org) - */ -#ifndef MBEDTLS_ECDSA_H -#define MBEDTLS_ECDSA_H - -#include "ecp.h" -#include "md.h" - -/* - * RFC 4492 page 20: - * - * Ecdsa-Sig-Value ::= SEQUENCE { - * r INTEGER, - * s INTEGER - * } - * - * Size is at most - * 1 (tag) + 1 (len) + 1 (initial 0) + ECP_MAX_BYTES for each of r and s, - * twice that + 1 (tag) + 2 (len) for the sequence - * (assuming ECP_MAX_BYTES is less than 126 for r and s, - * and less than 124 (total len <= 255) for the sequence) - */ -#if MBEDTLS_ECP_MAX_BYTES > 124 -#error "MBEDTLS_ECP_MAX_BYTES bigger than expected, please fix MBEDTLS_ECDSA_MAX_LEN" -#endif -/** Maximum size of an ECDSA signature in bytes */ -#define MBEDTLS_ECDSA_MAX_LEN ( 3 + 2 * ( 3 + MBEDTLS_ECP_MAX_BYTES ) ) - -/** - * \brief ECDSA context structure - */ -typedef mbedtls_ecp_keypair mbedtls_ecdsa_context; - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * \brief Compute ECDSA signature of a previously hashed message - * - * \note The deterministic version is usually prefered. - * - * \param grp ECP group - * \param r First output integer - * \param s Second output integer - * \param d Private signing key - * \param buf Message hash - * \param blen Length of buf - * \param f_rng RNG function - * \param p_rng RNG parameter - * - * \return 0 if successful, - * or a MBEDTLS_ERR_ECP_XXX or MBEDTLS_MPI_XXX error code - */ -int mbedtls_ecdsa_sign( mbedtls_ecp_group *grp, mbedtls_mpi *r, mbedtls_mpi *s, - const mbedtls_mpi *d, const unsigned char *buf, size_t blen, - int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ); - -#if defined(MBEDTLS_ECDSA_DETERMINISTIC) -/** - * \brief Compute ECDSA signature of a previously hashed message, - * deterministic version (RFC 6979). - * - * \param grp ECP group - * \param r First output integer - * \param s Second output integer - * \param d Private signing key - * \param buf Message hash - * \param blen Length of buf - * \param md_alg MD algorithm used to hash the message - * - * \return 0 if successful, - * or a MBEDTLS_ERR_ECP_XXX or MBEDTLS_MPI_XXX error code - */ -int mbedtls_ecdsa_sign_det( mbedtls_ecp_group *grp, mbedtls_mpi *r, mbedtls_mpi *s, - const mbedtls_mpi *d, const unsigned char *buf, size_t blen, - mbedtls_md_type_t md_alg ); -#endif /* MBEDTLS_ECDSA_DETERMINISTIC */ - -/** - * \brief Verify ECDSA signature of a previously hashed message - * - * \param grp ECP group - * \param buf Message hash - * \param blen Length of buf - * \param Q Public key to use for verification - * \param r First integer of the signature - * \param s Second integer of the signature - * - * \return 0 if successful, - * MBEDTLS_ERR_ECP_BAD_INPUT_DATA if signature is invalid - * or a MBEDTLS_ERR_ECP_XXX or MBEDTLS_MPI_XXX error code - */ -int mbedtls_ecdsa_verify( mbedtls_ecp_group *grp, - const unsigned char *buf, size_t blen, - const mbedtls_ecp_point *Q, const mbedtls_mpi *r, const mbedtls_mpi *s); - -/** - * \brief Compute ECDSA signature and write it to buffer, - * serialized as defined in RFC 4492 page 20. - * (Not thread-safe to use same context in multiple threads) - * - * \note The deterministice version (RFC 6979) is used if - * MBEDTLS_ECDSA_DETERMINISTIC is defined. - * - * \param ctx ECDSA context - * \param md_alg Algorithm that was used to hash the message - * \param hash Message hash - * \param hlen Length of hash - * \param sig Buffer that will hold the signature - * \param slen Length of the signature written - * \param f_rng RNG function - * \param p_rng RNG parameter - * - * \note The "sig" buffer must be at least as large as twice the - * size of the curve used, plus 9 (eg. 73 bytes if a 256-bit - * curve is used). MBEDTLS_ECDSA_MAX_LEN is always safe. - * - * \return 0 if successful, - * or a MBEDTLS_ERR_ECP_XXX, MBEDTLS_ERR_MPI_XXX or - * MBEDTLS_ERR_ASN1_XXX error code - */ -int mbedtls_ecdsa_write_signature( mbedtls_ecdsa_context *ctx, mbedtls_md_type_t md_alg, - const unsigned char *hash, size_t hlen, - unsigned char *sig, size_t *slen, - int (*f_rng)(void *, unsigned char *, size_t), - void *p_rng ); - -#if defined(MBEDTLS_ECDSA_DETERMINISTIC) -#if ! defined(MBEDTLS_DEPRECATED_REMOVED) -#if defined(MBEDTLS_DEPRECATED_WARNING) -#define MBEDTLS_DEPRECATED __attribute__((deprecated)) -#else -#define MBEDTLS_DEPRECATED -#endif -/** - * \brief Compute ECDSA signature and write it to buffer, - * serialized as defined in RFC 4492 page 20. - * Deterministic version, RFC 6979. - * (Not thread-safe to use same context in multiple threads) - * - * \deprecated Superseded by mbedtls_ecdsa_write_signature() in 2.0.0 - * - * \param ctx ECDSA context - * \param hash Message hash - * \param hlen Length of hash - * \param sig Buffer that will hold the signature - * \param slen Length of the signature written - * \param md_alg MD algorithm used to hash the message - * - * \note The "sig" buffer must be at least as large as twice the - * size of the curve used, plus 9 (eg. 73 bytes if a 256-bit - * curve is used). MBEDTLS_ECDSA_MAX_LEN is always safe. - * - * \return 0 if successful, - * or a MBEDTLS_ERR_ECP_XXX, MBEDTLS_ERR_MPI_XXX or - * MBEDTLS_ERR_ASN1_XXX error code - */ -int mbedtls_ecdsa_write_signature_det( mbedtls_ecdsa_context *ctx, - const unsigned char *hash, size_t hlen, - unsigned char *sig, size_t *slen, - mbedtls_md_type_t md_alg ) MBEDTLS_DEPRECATED; -#undef MBEDTLS_DEPRECATED -#endif /* MBEDTLS_DEPRECATED_REMOVED */ -#endif /* MBEDTLS_ECDSA_DETERMINISTIC */ - -/** - * \brief Read and verify an ECDSA signature - * - * \param ctx ECDSA context - * \param hash Message hash - * \param hlen Size of hash - * \param sig Signature to read and verify - * \param slen Size of sig - * - * \return 0 if successful, - * MBEDTLS_ERR_ECP_BAD_INPUT_DATA if signature is invalid, - * MBEDTLS_ERR_ECP_SIG_LEN_MISMATCH if the signature is - * valid but its actual length is less than siglen, - * or a MBEDTLS_ERR_ECP_XXX or MBEDTLS_ERR_MPI_XXX error code - */ -int mbedtls_ecdsa_read_signature( mbedtls_ecdsa_context *ctx, - const unsigned char *hash, size_t hlen, - const unsigned char *sig, size_t slen ); - -/** - * \brief Generate an ECDSA keypair on the given curve - * - * \param ctx ECDSA context in which the keypair should be stored - * \param gid Group (elliptic curve) to use. One of the various - * MBEDTLS_ECP_DP_XXX macros depending on configuration. - * \param f_rng RNG function - * \param p_rng RNG parameter - * - * \return 0 on success, or a MBEDTLS_ERR_ECP_XXX code. - */ -int mbedtls_ecdsa_genkey( mbedtls_ecdsa_context *ctx, mbedtls_ecp_group_id gid, - int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ); - -/** - * \brief Set an ECDSA context from an EC key pair - * - * \param ctx ECDSA context to set - * \param key EC key to use - * - * \return 0 on success, or a MBEDTLS_ERR_ECP_XXX code. - */ -int mbedtls_ecdsa_from_keypair( mbedtls_ecdsa_context *ctx, const mbedtls_ecp_keypair *key ); - -/** - * \brief Initialize context - * - * \param ctx Context to initialize - */ -void mbedtls_ecdsa_init( mbedtls_ecdsa_context *ctx ); - -/** - * \brief Free context - * - * \param ctx Context to free - */ -void mbedtls_ecdsa_free( mbedtls_ecdsa_context *ctx ); - -#ifdef __cplusplus -} -#endif - -#endif /* ecdsa.h */ diff --git a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/ecp.h b/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/ecp.h deleted file mode 100644 index 723e46c9..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/ecp.h +++ /dev/null @@ -1,631 +0,0 @@ -/** - * \file ecp.h - * - * \brief Elliptic curves over GF(p) - * - * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * This file is part of mbed TLS (https://tls.mbed.org) - */ -#ifndef MBEDTLS_ECP_H -#define MBEDTLS_ECP_H - -#include "bignum.h" - -/* - * ECP error codes - */ -#define MBEDTLS_ERR_ECP_BAD_INPUT_DATA -0x4F80 /**< Bad input parameters to function. */ -#define MBEDTLS_ERR_ECP_BUFFER_TOO_SMALL -0x4F00 /**< The buffer is too small to write to. */ -#define MBEDTLS_ERR_ECP_FEATURE_UNAVAILABLE -0x4E80 /**< Requested curve not available. */ -#define MBEDTLS_ERR_ECP_VERIFY_FAILED -0x4E00 /**< The signature is not valid. */ -#define MBEDTLS_ERR_ECP_ALLOC_FAILED -0x4D80 /**< Memory allocation failed. */ -#define MBEDTLS_ERR_ECP_RANDOM_FAILED -0x4D00 /**< Generation of random value, such as (ephemeral) key, failed. */ -#define MBEDTLS_ERR_ECP_INVALID_KEY -0x4C80 /**< Invalid private or public key. */ -#define MBEDTLS_ERR_ECP_SIG_LEN_MISMATCH -0x4C00 /**< Signature is valid but shorter than the user-supplied length. */ - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * Domain parameters (curve, subgroup and generator) identifiers. - * - * Only curves over prime fields are supported. - * - * \warning This library does not support validation of arbitrary domain - * parameters. Therefore, only well-known domain parameters from trusted - * sources should be used. See mbedtls_ecp_group_load(). - */ -typedef enum -{ - MBEDTLS_ECP_DP_NONE = 0, - MBEDTLS_ECP_DP_SECP192R1, /*!< 192-bits NIST curve */ - MBEDTLS_ECP_DP_SECP224R1, /*!< 224-bits NIST curve */ - MBEDTLS_ECP_DP_SECP256R1, /*!< 256-bits NIST curve */ - MBEDTLS_ECP_DP_SECP384R1, /*!< 384-bits NIST curve */ - MBEDTLS_ECP_DP_SECP521R1, /*!< 521-bits NIST curve */ - MBEDTLS_ECP_DP_BP256R1, /*!< 256-bits Brainpool curve */ - MBEDTLS_ECP_DP_BP384R1, /*!< 384-bits Brainpool curve */ - MBEDTLS_ECP_DP_BP512R1, /*!< 512-bits Brainpool curve */ - MBEDTLS_ECP_DP_CURVE25519, /*!< Curve25519 */ - MBEDTLS_ECP_DP_SECP192K1, /*!< 192-bits "Koblitz" curve */ - MBEDTLS_ECP_DP_SECP224K1, /*!< 224-bits "Koblitz" curve */ - MBEDTLS_ECP_DP_SECP256K1, /*!< 256-bits "Koblitz" curve */ -} mbedtls_ecp_group_id; - -/** - * Number of supported curves (plus one for NONE). - * - * (Montgomery curves excluded for now.) - */ -#define MBEDTLS_ECP_DP_MAX 12 - -/** - * Curve information for use by other modules - */ -typedef struct -{ - mbedtls_ecp_group_id grp_id; /*!< Internal identifier */ - uint16_t tls_id; /*!< TLS NamedCurve identifier */ - uint16_t bit_size; /*!< Curve size in bits */ - const char *name; /*!< Human-friendly name */ -} mbedtls_ecp_curve_info; - -/** - * \brief ECP point structure (jacobian coordinates) - * - * \note All functions expect and return points satisfying - * the following condition: Z == 0 or Z == 1. (Other - * values of Z are used by internal functions only.) - * The point is zero, or "at infinity", if Z == 0. - * Otherwise, X and Y are its standard (affine) coordinates. - */ -typedef struct -{ - mbedtls_mpi X; /*!< the point's X coordinate */ - mbedtls_mpi Y; /*!< the point's Y coordinate */ - mbedtls_mpi Z; /*!< the point's Z coordinate */ -} -mbedtls_ecp_point; - -/** - * \brief ECP group structure - * - * We consider two types of curves equations: - * 1. Short Weierstrass y^2 = x^3 + A x + B mod P (SEC1 + RFC 4492) - * 2. Montgomery, y^2 = x^3 + A x^2 + x mod P (Curve25519 + draft) - * In both cases, a generator G for a prime-order subgroup is fixed. In the - * short weierstrass, this subgroup is actually the whole curve, and its - * cardinal is denoted by N. - * - * In the case of Short Weierstrass curves, our code requires that N is an odd - * prime. (Use odd in mbedtls_ecp_mul() and prime in mbedtls_ecdsa_sign() for blinding.) - * - * In the case of Montgomery curves, we don't store A but (A + 2) / 4 which is - * the quantity actually used in the formulas. Also, nbits is not the size of N - * but the required size for private keys. - * - * If modp is NULL, reduction modulo P is done using a generic algorithm. - * Otherwise, it must point to a function that takes an mbedtls_mpi in the range - * 0..2^(2*pbits)-1 and transforms it in-place in an integer of little more - * than pbits, so that the integer may be efficiently brought in the 0..P-1 - * range by a few additions or substractions. It must return 0 on success and - * non-zero on failure. - */ -typedef struct -{ - mbedtls_ecp_group_id id; /*!< internal group identifier */ - mbedtls_mpi P; /*!< prime modulus of the base field */ - mbedtls_mpi A; /*!< 1. A in the equation, or 2. (A + 2) / 4 */ - mbedtls_mpi B; /*!< 1. B in the equation, or 2. unused */ - mbedtls_ecp_point G; /*!< generator of the (sub)group used */ - mbedtls_mpi N; /*!< 1. the order of G, or 2. unused */ - size_t pbits; /*!< number of bits in P */ - size_t nbits; /*!< number of bits in 1. P, or 2. private keys */ - unsigned int h; /*!< internal: 1 if the constants are static */ - int (*modp)(mbedtls_mpi *); /*!< function for fast reduction mod P */ - int (*t_pre)(mbedtls_ecp_point *, void *); /*!< unused */ - int (*t_post)(mbedtls_ecp_point *, void *); /*!< unused */ - void *t_data; /*!< unused */ - mbedtls_ecp_point *T; /*!< pre-computed points for ecp_mul_comb() */ - size_t T_size; /*!< number for pre-computed points */ -} -mbedtls_ecp_group; - -/** - * \brief ECP key pair structure - * - * A generic key pair that could be used for ECDSA, fixed ECDH, etc. - * - * \note Members purposefully in the same order as struc mbedtls_ecdsa_context. - */ -typedef struct -{ - mbedtls_ecp_group grp; /*!< Elliptic curve and base point */ - mbedtls_mpi d; /*!< our secret value */ - mbedtls_ecp_point Q; /*!< our public value */ -} -mbedtls_ecp_keypair; - -/** - * \name SECTION: Module settings - * - * The configuration options you can set for this module are in this section. - * Either change them in config.h or define them on the compiler command line. - * \{ - */ - -#if !defined(MBEDTLS_ECP_MAX_BITS) -/** - * Maximum size of the groups (that is, of N and P) - */ -#define MBEDTLS_ECP_MAX_BITS 521 /**< Maximum bit size of groups */ -#endif - -#define MBEDTLS_ECP_MAX_BYTES ( ( MBEDTLS_ECP_MAX_BITS + 7 ) / 8 ) -#define MBEDTLS_ECP_MAX_PT_LEN ( 2 * MBEDTLS_ECP_MAX_BYTES + 1 ) - -#if !defined(MBEDTLS_ECP_WINDOW_SIZE) -/* - * Maximum "window" size used for point multiplication. - * Default: 6. - * Minimum value: 2. Maximum value: 7. - * - * Result is an array of at most ( 1 << ( MBEDTLS_ECP_WINDOW_SIZE - 1 ) ) - * points used for point multiplication. This value is directly tied to EC - * peak memory usage, so decreasing it by one should roughly cut memory usage - * by two (if large curves are in use). - * - * Reduction in size may reduce speed, but larger curves are impacted first. - * Sample performances (in ECDHE handshakes/s, with FIXED_POINT_OPTIM = 1): - * w-size: 6 5 4 3 2 - * 521 145 141 135 120 97 - * 384 214 209 198 177 146 - * 256 320 320 303 262 226 - - * 224 475 475 453 398 342 - * 192 640 640 633 587 476 - */ -#define MBEDTLS_ECP_WINDOW_SIZE 6 /**< Maximum window size used */ -#endif /* MBEDTLS_ECP_WINDOW_SIZE */ - -#if !defined(MBEDTLS_ECP_FIXED_POINT_OPTIM) -/* - * Trade memory for speed on fixed-point multiplication. - * - * This speeds up repeated multiplication of the generator (that is, the - * multiplication in ECDSA signatures, and half of the multiplications in - * ECDSA verification and ECDHE) by a factor roughly 3 to 4. - * - * The cost is increasing EC peak memory usage by a factor roughly 2. - * - * Change this value to 0 to reduce peak memory usage. - */ -#define MBEDTLS_ECP_FIXED_POINT_OPTIM 1 /**< Enable fixed-point speed-up */ -#endif /* MBEDTLS_ECP_FIXED_POINT_OPTIM */ - -/* \} name SECTION: Module settings */ - -/* - * Point formats, from RFC 4492's enum ECPointFormat - */ -#define MBEDTLS_ECP_PF_UNCOMPRESSED 0 /**< Uncompressed point format */ -#define MBEDTLS_ECP_PF_COMPRESSED 1 /**< Compressed point format */ - -/* - * Some other constants from RFC 4492 - */ -#define MBEDTLS_ECP_TLS_NAMED_CURVE 3 /**< ECCurveType's named_curve */ - -/** - * \brief Get the list of supported curves in order of preferrence - * (full information) - * - * \return A statically allocated array, the last entry is 0. - */ -const mbedtls_ecp_curve_info *mbedtls_ecp_curve_list( void ); - -/** - * \brief Get the list of supported curves in order of preferrence - * (grp_id only) - * - * \return A statically allocated array, - * terminated with MBEDTLS_ECP_DP_NONE. - */ -const mbedtls_ecp_group_id *mbedtls_ecp_grp_id_list( void ); - -/** - * \brief Get curve information from an internal group identifier - * - * \param grp_id A MBEDTLS_ECP_DP_XXX value - * - * \return The associated curve information or NULL - */ -const mbedtls_ecp_curve_info *mbedtls_ecp_curve_info_from_grp_id( mbedtls_ecp_group_id grp_id ); - -/** - * \brief Get curve information from a TLS NamedCurve value - * - * \param tls_id A MBEDTLS_ECP_DP_XXX value - * - * \return The associated curve information or NULL - */ -const mbedtls_ecp_curve_info *mbedtls_ecp_curve_info_from_tls_id( uint16_t tls_id ); - -/** - * \brief Get curve information from a human-readable name - * - * \param name The name - * - * \return The associated curve information or NULL - */ -const mbedtls_ecp_curve_info *mbedtls_ecp_curve_info_from_name( const char *name ); - -/** - * \brief Initialize a point (as zero) - */ -void mbedtls_ecp_point_init( mbedtls_ecp_point *pt ); - -/** - * \brief Initialize a group (to something meaningless) - */ -void mbedtls_ecp_group_init( mbedtls_ecp_group *grp ); - -/** - * \brief Initialize a key pair (as an invalid one) - */ -void mbedtls_ecp_keypair_init( mbedtls_ecp_keypair *key ); - -/** - * \brief Free the components of a point - */ -void mbedtls_ecp_point_free( mbedtls_ecp_point *pt ); - -/** - * \brief Free the components of an ECP group - */ -void mbedtls_ecp_group_free( mbedtls_ecp_group *grp ); - -/** - * \brief Free the components of a key pair - */ -void mbedtls_ecp_keypair_free( mbedtls_ecp_keypair *key ); - -/** - * \brief Copy the contents of point Q into P - * - * \param P Destination point - * \param Q Source point - * - * \return 0 if successful, - * MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed - */ -int mbedtls_ecp_copy( mbedtls_ecp_point *P, const mbedtls_ecp_point *Q ); - -/** - * \brief Copy the contents of a group object - * - * \param dst Destination group - * \param src Source group - * - * \return 0 if successful, - * MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed - */ -int mbedtls_ecp_group_copy( mbedtls_ecp_group *dst, const mbedtls_ecp_group *src ); - -/** - * \brief Set a point to zero - * - * \param pt Destination point - * - * \return 0 if successful, - * MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed - */ -int mbedtls_ecp_set_zero( mbedtls_ecp_point *pt ); - -/** - * \brief Tell if a point is zero - * - * \param pt Point to test - * - * \return 1 if point is zero, 0 otherwise - */ -int mbedtls_ecp_is_zero( mbedtls_ecp_point *pt ); - -/** - * \brief Import a non-zero point from two ASCII strings - * - * \param P Destination point - * \param radix Input numeric base - * \param x First affine coordinate as a null-terminated string - * \param y Second affine coordinate as a null-terminated string - * - * \return 0 if successful, or a MBEDTLS_ERR_MPI_XXX error code - */ -int mbedtls_ecp_point_read_string( mbedtls_ecp_point *P, int radix, - const char *x, const char *y ); - -/** - * \brief Export a point into unsigned binary data - * - * \param grp Group to which the point should belong - * \param P Point to export - * \param format Point format, should be a MBEDTLS_ECP_PF_XXX macro - * \param olen Length of the actual output - * \param buf Output buffer - * \param buflen Length of the output buffer - * - * \return 0 if successful, - * or MBEDTLS_ERR_ECP_BAD_INPUT_DATA - * or MBEDTLS_ERR_ECP_BUFFER_TOO_SMALL - */ -int mbedtls_ecp_point_write_binary( const mbedtls_ecp_group *grp, const mbedtls_ecp_point *P, - int format, size_t *olen, - unsigned char *buf, size_t buflen ); - -/** - * \brief Import a point from unsigned binary data - * - * \param grp Group to which the point should belong - * \param P Point to import - * \param buf Input buffer - * \param ilen Actual length of input - * - * \return 0 if successful, - * MBEDTLS_ERR_ECP_BAD_INPUT_DATA if input is invalid, - * MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed, - * MBEDTLS_ERR_ECP_FEATURE_UNAVAILABLE if the point format - * is not implemented. - * - * \note This function does NOT check that the point actually - * belongs to the given group, see mbedtls_ecp_check_pubkey() for - * that. - */ -int mbedtls_ecp_point_read_binary( const mbedtls_ecp_group *grp, mbedtls_ecp_point *P, - const unsigned char *buf, size_t ilen ); - -/** - * \brief Import a point from a TLS ECPoint record - * - * \param grp ECP group used - * \param pt Destination point - * \param buf $(Start of input buffer) - * \param len Buffer length - * - * \note buf is updated to point right after the ECPoint on exit - * - * \return 0 if successful, - * MBEDTLS_ERR_MPI_XXX if initialization failed - * MBEDTLS_ERR_ECP_BAD_INPUT_DATA if input is invalid - */ -int mbedtls_ecp_tls_read_point( const mbedtls_ecp_group *grp, mbedtls_ecp_point *pt, - const unsigned char **buf, size_t len ); - -/** - * \brief Export a point as a TLS ECPoint record - * - * \param grp ECP group used - * \param pt Point to export - * \param format Export format - * \param olen length of data written - * \param buf Buffer to write to - * \param blen Buffer length - * - * \return 0 if successful, - * or MBEDTLS_ERR_ECP_BAD_INPUT_DATA - * or MBEDTLS_ERR_ECP_BUFFER_TOO_SMALL - */ -int mbedtls_ecp_tls_write_point( const mbedtls_ecp_group *grp, const mbedtls_ecp_point *pt, - int format, size_t *olen, - unsigned char *buf, size_t blen ); - -/** - * \brief Set a group using well-known domain parameters - * - * \param grp Destination group - * \param index Index in the list of well-known domain parameters - * - * \return 0 if successful, - * MBEDTLS_ERR_MPI_XXX if initialization failed - * MBEDTLS_ERR_ECP_FEATURE_UNAVAILABLE for unkownn groups - * - * \note Index should be a value of RFC 4492's enum NamedCurve, - * usually in the form of a MBEDTLS_ECP_DP_XXX macro. - */ -int mbedtls_ecp_group_load( mbedtls_ecp_group *grp, mbedtls_ecp_group_id index ); - -/** - * \brief Set a group from a TLS ECParameters record - * - * \param grp Destination group - * \param buf &(Start of input buffer) - * \param len Buffer length - * - * \note buf is updated to point right after ECParameters on exit - * - * \return 0 if successful, - * MBEDTLS_ERR_MPI_XXX if initialization failed - * MBEDTLS_ERR_ECP_BAD_INPUT_DATA if input is invalid - */ -int mbedtls_ecp_tls_read_group( mbedtls_ecp_group *grp, const unsigned char **buf, size_t len ); - -/** - * \brief Write the TLS ECParameters record for a group - * - * \param grp ECP group used - * \param olen Number of bytes actually written - * \param buf Buffer to write to - * \param blen Buffer length - * - * \return 0 if successful, - * or MBEDTLS_ERR_ECP_BUFFER_TOO_SMALL - */ -int mbedtls_ecp_tls_write_group( const mbedtls_ecp_group *grp, size_t *olen, - unsigned char *buf, size_t blen ); - -/** - * \brief Multiplication by an integer: R = m * P - * (Not thread-safe to use same group in multiple threads) - * - * \note In order to prevent timing attacks, this function - * executes the exact same sequence of (base field) - * operations for any valid m. It avoids any if-branch or - * array index depending on the value of m. - * - * \note If f_rng is not NULL, it is used to randomize intermediate - * results in order to prevent potential timing attacks - * targeting these results. It is recommended to always - * provide a non-NULL f_rng (the overhead is negligible). - * - * \param grp ECP group - * \param R Destination point - * \param m Integer by which to multiply - * \param P Point to multiply - * \param f_rng RNG function (see notes) - * \param p_rng RNG parameter - * - * \return 0 if successful, - * MBEDTLS_ERR_ECP_INVALID_KEY if m is not a valid privkey - * or P is not a valid pubkey, - * MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed - */ -int mbedtls_ecp_mul( mbedtls_ecp_group *grp, mbedtls_ecp_point *R, - const mbedtls_mpi *m, const mbedtls_ecp_point *P, - int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ); - -/** - * \brief Multiplication and addition of two points by integers: - * R = m * P + n * Q - * (Not thread-safe to use same group in multiple threads) - * - * \note In contrast to mbedtls_ecp_mul(), this function does not guarantee - * a constant execution flow and timing. - * - * \param grp ECP group - * \param R Destination point - * \param m Integer by which to multiply P - * \param P Point to multiply by m - * \param n Integer by which to multiply Q - * \param Q Point to be multiplied by n - * - * \return 0 if successful, - * MBEDTLS_ERR_ECP_INVALID_KEY if m or n is not a valid privkey - * or P or Q is not a valid pubkey, - * MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed - */ -int mbedtls_ecp_muladd( mbedtls_ecp_group *grp, mbedtls_ecp_point *R, - const mbedtls_mpi *m, const mbedtls_ecp_point *P, - const mbedtls_mpi *n, const mbedtls_ecp_point *Q ); - -/** - * \brief Check that a point is a valid public key on this curve - * - * \param grp Curve/group the point should belong to - * \param pt Point to check - * - * \return 0 if point is a valid public key, - * MBEDTLS_ERR_ECP_INVALID_KEY otherwise. - * - * \note This function only checks the point is non-zero, has valid - * coordinates and lies on the curve, but not that it is - * indeed a multiple of G. This is additional check is more - * expensive, isn't required by standards, and shouldn't be - * necessary if the group used has a small cofactor. In - * particular, it is useless for the NIST groups which all - * have a cofactor of 1. - * - * \note Uses bare components rather than an mbedtls_ecp_keypair structure - * in order to ease use with other structures such as - * mbedtls_ecdh_context of mbedtls_ecdsa_context. - */ -int mbedtls_ecp_check_pubkey( const mbedtls_ecp_group *grp, const mbedtls_ecp_point *pt ); - -/** - * \brief Check that an mbedtls_mpi is a valid private key for this curve - * - * \param grp Group used - * \param d Integer to check - * - * \return 0 if point is a valid private key, - * MBEDTLS_ERR_ECP_INVALID_KEY otherwise. - * - * \note Uses bare components rather than an mbedtls_ecp_keypair structure - * in order to ease use with other structures such as - * mbedtls_ecdh_context of mbedtls_ecdsa_context. - */ -int mbedtls_ecp_check_privkey( const mbedtls_ecp_group *grp, const mbedtls_mpi *d ); - -/** - * \brief Generate a keypair - * - * \param grp ECP group - * \param d Destination MPI (secret part) - * \param Q Destination point (public part) - * \param f_rng RNG function - * \param p_rng RNG parameter - * - * \return 0 if successful, - * or a MBEDTLS_ERR_ECP_XXX or MBEDTLS_MPI_XXX error code - * - * \note Uses bare components rather than an mbedtls_ecp_keypair structure - * in order to ease use with other structures such as - * mbedtls_ecdh_context of mbedtls_ecdsa_context. - */ -int mbedtls_ecp_gen_keypair( mbedtls_ecp_group *grp, mbedtls_mpi *d, mbedtls_ecp_point *Q, - int (*f_rng)(void *, unsigned char *, size_t), - void *p_rng ); - -/** - * \brief Generate a keypair - * - * \param grp_id ECP group identifier - * \param key Destination keypair - * \param f_rng RNG function - * \param p_rng RNG parameter - * - * \return 0 if successful, - * or a MBEDTLS_ERR_ECP_XXX or MBEDTLS_MPI_XXX error code - */ -int mbedtls_ecp_gen_key( mbedtls_ecp_group_id grp_id, mbedtls_ecp_keypair *key, - int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ); - -/** - * \brief Check a public-private key pair - * - * \param pub Keypair structure holding a public key - * \param prv Keypair structure holding a private (plus public) key - * - * \return 0 if successful (keys are valid and match), or - * MBEDTLS_ERR_ECP_BAD_INPUT_DATA, or - * a MBEDTLS_ERR_ECP_XXX or MBEDTLS_ERR_MPI_XXX code. - */ -int mbedtls_ecp_check_pub_priv( const mbedtls_ecp_keypair *pub, const mbedtls_ecp_keypair *prv ); - -#if defined(MBEDTLS_SELF_TEST) -/** - * \brief Checkup routine - * - * \return 0 if successful, or 1 if a test failed - */ -int mbedtls_ecp_self_test( int verbose ); -#endif - -#ifdef __cplusplus -} -#endif - -#endif /* ecp.h */ diff --git a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/entropy.h b/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/entropy.h deleted file mode 100644 index 00de9a6e..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/entropy.h +++ /dev/null @@ -1,252 +0,0 @@ -/** - * \file entropy.h - * - * \brief Entropy accumulator implementation - * - * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * This file is part of mbed TLS (https://tls.mbed.org) - */ -#ifndef MBEDTLS_ENTROPY_H -#define MBEDTLS_ENTROPY_H - -#if !defined(MBEDTLS_CONFIG_FILE) -#include "config.h" -#else -#include MBEDTLS_CONFIG_FILE -#endif - -#include - -#if defined(MBEDTLS_SHA512_C) && !defined(MBEDTLS_ENTROPY_FORCE_SHA256) -#include "sha512.h" -#define MBEDTLS_ENTROPY_SHA512_ACCUMULATOR -#else -#if defined(MBEDTLS_SHA256_C) -#define MBEDTLS_ENTROPY_SHA256_ACCUMULATOR -#include "sha256.h" -#endif -#endif - -#if defined(MBEDTLS_THREADING_C) -#include "threading.h" -#endif - -#if defined(MBEDTLS_HAVEGE_C) -#include "havege.h" -#endif - -#define MBEDTLS_ERR_ENTROPY_SOURCE_FAILED -0x003C /**< Critical entropy source failure. */ -#define MBEDTLS_ERR_ENTROPY_MAX_SOURCES -0x003E /**< No more sources can be added. */ -#define MBEDTLS_ERR_ENTROPY_NO_SOURCES_DEFINED -0x0040 /**< No sources have been added to poll. */ -#define MBEDTLS_ERR_ENTROPY_NO_STRONG_SOURCE -0x003D /**< No strong sources have been added to poll. */ -#define MBEDTLS_ERR_ENTROPY_FILE_IO_ERROR -0x003F /**< Read/write error in file. */ - -/** - * \name SECTION: Module settings - * - * The configuration options you can set for this module are in this section. - * Either change them in config.h or define them on the compiler command line. - * \{ - */ - -#if !defined(MBEDTLS_ENTROPY_MAX_SOURCES) -#define MBEDTLS_ENTROPY_MAX_SOURCES 20 /**< Maximum number of sources supported */ -#endif - -#if !defined(MBEDTLS_ENTROPY_MAX_GATHER) -#define MBEDTLS_ENTROPY_MAX_GATHER 128 /**< Maximum amount requested from entropy sources */ -#endif - -/* \} name SECTION: Module settings */ - -#if defined(MBEDTLS_ENTROPY_SHA512_ACCUMULATOR) -#define MBEDTLS_ENTROPY_BLOCK_SIZE 64 /**< Block size of entropy accumulator (SHA-512) */ -#else -#define MBEDTLS_ENTROPY_BLOCK_SIZE 32 /**< Block size of entropy accumulator (SHA-256) */ -#endif - -#define MBEDTLS_ENTROPY_MAX_SEED_SIZE 1024 /**< Maximum size of seed we read from seed file */ -#define MBEDTLS_ENTROPY_SOURCE_MANUAL MBEDTLS_ENTROPY_MAX_SOURCES - -#define MBEDTLS_ENTROPY_SOURCE_STRONG 1 /**< Entropy source is strong */ -#define MBEDTLS_ENTROPY_SOURCE_WEAK 0 /**< Entropy source is weak */ - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * \brief Entropy poll callback pointer - * - * \param data Callback-specific data pointer - * \param output Data to fill - * \param len Maximum size to provide - * \param olen The actual amount of bytes put into the buffer (Can be 0) - * - * \return 0 if no critical failures occurred, - * MBEDTLS_ERR_ENTROPY_SOURCE_FAILED otherwise - */ -typedef int (*mbedtls_entropy_f_source_ptr)(void *data, unsigned char *output, size_t len, - size_t *olen); - -/** - * \brief Entropy source state - */ -typedef struct -{ - mbedtls_entropy_f_source_ptr f_source; /**< The entropy source callback */ - void * p_source; /**< The callback data pointer */ - size_t size; /**< Amount received in bytes */ - size_t threshold; /**< Minimum bytes required before release */ - int strong; /**< Is the source strong? */ -} -mbedtls_entropy_source_state; - -/** - * \brief Entropy context structure - */ -typedef struct -{ -#if defined(MBEDTLS_ENTROPY_SHA512_ACCUMULATOR) - mbedtls_sha512_context accumulator; -#else - mbedtls_sha256_context accumulator; -#endif - int source_count; - mbedtls_entropy_source_state source[MBEDTLS_ENTROPY_MAX_SOURCES]; -#if defined(MBEDTLS_HAVEGE_C) - mbedtls_havege_state havege_data; -#endif -#if defined(MBEDTLS_THREADING_C) - mbedtls_threading_mutex_t mutex; /*!< mutex */ -#endif -} -mbedtls_entropy_context; - -/** - * \brief Initialize the context - * - * \param ctx Entropy context to initialize - */ -void mbedtls_entropy_init( mbedtls_entropy_context *ctx ); - -/** - * \brief Free the data in the context - * - * \param ctx Entropy context to free - */ -void mbedtls_entropy_free( mbedtls_entropy_context *ctx ); - -/** - * \brief Adds an entropy source to poll - * (Thread-safe if MBEDTLS_THREADING_C is enabled) - * - * \param ctx Entropy context - * \param f_source Entropy function - * \param p_source Function data - * \param threshold Minimum required from source before entropy is released - * ( with mbedtls_entropy_func() ) (in bytes) - * \param strong MBEDTLS_ENTROPY_SOURCE_STRONG or - * MBEDTSL_ENTROPY_SOURCE_WEAK. - * At least one strong source needs to be added. - * Weaker sources (such as the cycle counter) can be used as - * a complement. - * - * \return 0 if successful or MBEDTLS_ERR_ENTROPY_MAX_SOURCES - */ -int mbedtls_entropy_add_source( mbedtls_entropy_context *ctx, - mbedtls_entropy_f_source_ptr f_source, void *p_source, - size_t threshold, int strong ); - -/** - * \brief Trigger an extra gather poll for the accumulator - * (Thread-safe if MBEDTLS_THREADING_C is enabled) - * - * \param ctx Entropy context - * - * \return 0 if successful, or MBEDTLS_ERR_ENTROPY_SOURCE_FAILED - */ -int mbedtls_entropy_gather( mbedtls_entropy_context *ctx ); - -/** - * \brief Retrieve entropy from the accumulator - * (Maximum length: MBEDTLS_ENTROPY_BLOCK_SIZE) - * (Thread-safe if MBEDTLS_THREADING_C is enabled) - * - * \param data Entropy context - * \param output Buffer to fill - * \param len Number of bytes desired, must be at most MBEDTLS_ENTROPY_BLOCK_SIZE - * - * \return 0 if successful, or MBEDTLS_ERR_ENTROPY_SOURCE_FAILED - */ -int mbedtls_entropy_func( void *data, unsigned char *output, size_t len ); - -/** - * \brief Add data to the accumulator manually - * (Thread-safe if MBEDTLS_THREADING_C is enabled) - * - * \param ctx Entropy context - * \param data Data to add - * \param len Length of data - * - * \return 0 if successful - */ -int mbedtls_entropy_update_manual( mbedtls_entropy_context *ctx, - const unsigned char *data, size_t len ); - -#if defined(MBEDTLS_FS_IO) -/** - * \brief Write a seed file - * - * \param ctx Entropy context - * \param path Name of the file - * - * \return 0 if successful, - * MBEDTLS_ERR_ENTROPY_FILE_IO_ERROR on file error, or - * MBEDTLS_ERR_ENTROPY_SOURCE_FAILED - */ -int mbedtls_entropy_write_seed_file( mbedtls_entropy_context *ctx, const char *path ); - -/** - * \brief Read and update a seed file. Seed is added to this - * instance. No more than MBEDTLS_ENTROPY_MAX_SEED_SIZE bytes are - * read from the seed file. The rest is ignored. - * - * \param ctx Entropy context - * \param path Name of the file - * - * \return 0 if successful, - * MBEDTLS_ERR_ENTROPY_FILE_IO_ERROR on file error, - * MBEDTLS_ERR_ENTROPY_SOURCE_FAILED - */ -int mbedtls_entropy_update_seed_file( mbedtls_entropy_context *ctx, const char *path ); -#endif /* MBEDTLS_FS_IO */ - -#if defined(MBEDTLS_SELF_TEST) -/** - * \brief Checkup routine - * - * \return 0 if successful, or 1 if a test failed - */ -int mbedtls_entropy_self_test( int verbose ); -#endif /* MBEDTLS_SELF_TEST */ - -#ifdef __cplusplus -} -#endif - -#endif /* entropy.h */ diff --git a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/entropy_poll.h b/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/entropy_poll.h deleted file mode 100644 index dc119113..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/entropy_poll.h +++ /dev/null @@ -1,89 +0,0 @@ -/** - * \file entropy_poll.h - * - * \brief Platform-specific and custom entropy polling functions - * - * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * This file is part of mbed TLS (https://tls.mbed.org) - */ -#ifndef MBEDTLS_ENTROPY_POLL_H -#define MBEDTLS_ENTROPY_POLL_H - -#if !defined(MBEDTLS_CONFIG_FILE) -#include "config.h" -#else -#include MBEDTLS_CONFIG_FILE -#endif - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -/* - * Default thresholds for built-in sources, in bytes - */ -#define MBEDTLS_ENTROPY_MIN_PLATFORM 32 /**< Minimum for platform source */ -#define MBEDTLS_ENTROPY_MIN_HAVEGE 32 /**< Minimum for HAVEGE */ -#define MBEDTLS_ENTROPY_MIN_HARDCLOCK 4 /**< Minimum for mbedtls_timing_hardclock() */ -#define MBEDTLS_ENTROPY_MIN_HARDWARE 32 /**< Minimum for the hardware source */ - -#if !defined(MBEDTLS_NO_PLATFORM_ENTROPY) -/** - * \brief Platform-specific entropy poll callback - */ -int mbedtls_platform_entropy_poll( void *data, - unsigned char *output, size_t len, size_t *olen ); -#endif - -#if defined(MBEDTLS_HAVEGE_C) -/** - * \brief HAVEGE based entropy poll callback - * - * Requires an HAVEGE state as its data pointer. - */ -int mbedtls_havege_poll( void *data, - unsigned char *output, size_t len, size_t *olen ); -#endif - -#if defined(MBEDTLS_TIMING_C) -/** - * \brief mbedtls_timing_hardclock-based entropy poll callback - */ -int mbedtls_hardclock_poll( void *data, - unsigned char *output, size_t len, size_t *olen ); -#endif - -#if defined(MBEDTLS_ENTROPY_HARDWARE_ALT) -/** - * \brief Entropy poll callback for a hardware source - * - * \warning This is not provided by mbed TLS! - * See \c MBEDTLS_ENTROPY_HARDWARE_ALT in config.h. - * - * \note This must accept NULL as its first argument. - */ -int mbedtls_hardware_poll( void *data, - unsigned char *output, size_t len, size_t *olen ); -#endif - -#ifdef __cplusplus -} -#endif - -#endif /* entropy_poll.h */ diff --git a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/error.h b/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/error.h deleted file mode 100644 index a182713d..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/error.h +++ /dev/null @@ -1,107 +0,0 @@ -/** - * \file error.h - * - * \brief Error to string translation - * - * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * This file is part of mbed TLS (https://tls.mbed.org) - */ -#ifndef MBEDTLS_ERROR_H -#define MBEDTLS_ERROR_H - -#include - -/** - * Error code layout. - * - * Currently we try to keep all error codes within the negative space of 16 - * bits signed integers to support all platforms (-0x0001 - -0x7FFF). In - * addition we'd like to give two layers of information on the error if - * possible. - * - * For that purpose the error codes are segmented in the following manner: - * - * 16 bit error code bit-segmentation - * - * 1 bit - Unused (sign bit) - * 3 bits - High level module ID - * 5 bits - Module-dependent error code - * 7 bits - Low level module errors - * - * For historical reasons, low-level error codes are divided in even and odd, - * even codes were assigned first, and -1 is reserved for other errors. - * - * Low-level module errors (0x0002-0x007E, 0x0003-0x007F) - * - * Module Nr Codes assigned - * MPI 7 0x0002-0x0010 - * GCM 2 0x0012-0x0014 - * BLOWFISH 2 0x0016-0x0018 - * THREADING 3 0x001A-0x001E - * AES 2 0x0020-0x0022 - * CAMELLIA 2 0x0024-0x0026 - * XTEA 1 0x0028-0x0028 - * BASE64 2 0x002A-0x002C - * OID 1 0x002E-0x002E 0x000B-0x000B - * PADLOCK 1 0x0030-0x0030 - * DES 1 0x0032-0x0032 - * CTR_DBRG 4 0x0034-0x003A - * ENTROPY 3 0x003C-0x0040 0x003D-0x003F - * NET 11 0x0042-0x0052 0x0043-0x0045 - * ASN1 7 0x0060-0x006C - * PBKDF2 1 0x007C-0x007C - * HMAC_DRBG 4 0x0003-0x0009 - * CCM 2 0x000D-0x000F - * - * High-level module nr (3 bits - 0x0...-0x7...) - * Name ID Nr of Errors - * PEM 1 9 - * PKCS#12 1 4 (Started from top) - * X509 2 19 - * PKCS5 2 4 (Started from top) - * DHM 3 9 - * PK 3 14 (Started from top) - * RSA 4 9 - * ECP 4 8 (Started from top) - * MD 5 4 - * CIPHER 6 6 - * SSL 6 16 (Started from top) - * SSL 7 31 - * - * Module dependent error code (5 bits 0x.00.-0x.F8.) - */ - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * \brief Translate a mbed TLS error code into a string representation, - * Result is truncated if necessary and always includes a terminating - * null byte. - * - * \param errnum error code - * \param buffer buffer to place representation in - * \param buflen length of the buffer - */ -void mbedtls_strerror( int errnum, char *buffer, size_t buflen ); - -#ifdef __cplusplus -} -#endif - -#endif /* error.h */ diff --git a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/gcm.h b/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/gcm.h deleted file mode 100644 index 6743ac9a..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/gcm.h +++ /dev/null @@ -1,220 +0,0 @@ -/** - * \file gcm.h - * - * \brief Galois/Counter mode for 128-bit block ciphers - * - * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * This file is part of mbed TLS (https://tls.mbed.org) - */ -#ifndef MBEDTLS_GCM_H -#define MBEDTLS_GCM_H - -#include "cipher.h" - -#include - -#define MBEDTLS_GCM_ENCRYPT 1 -#define MBEDTLS_GCM_DECRYPT 0 - -#define MBEDTLS_ERR_GCM_AUTH_FAILED -0x0012 /**< Authenticated decryption failed. */ -#define MBEDTLS_ERR_GCM_BAD_INPUT -0x0014 /**< Bad input parameters to function. */ - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * \brief GCM context structure - */ -typedef struct { - mbedtls_cipher_context_t cipher_ctx;/*!< cipher context used */ - uint64_t HL[16]; /*!< Precalculated HTable */ - uint64_t HH[16]; /*!< Precalculated HTable */ - uint64_t len; /*!< Total data length */ - uint64_t add_len; /*!< Total add length */ - unsigned char base_ectr[16];/*!< First ECTR for tag */ - unsigned char y[16]; /*!< Y working value */ - unsigned char buf[16]; /*!< buf working value */ - int mode; /*!< Encrypt or Decrypt */ -} -mbedtls_gcm_context; - -/** - * \brief Initialize GCM context (just makes references valid) - * Makes the context ready for mbedtls_gcm_setkey() or - * mbedtls_gcm_free(). - * - * \param ctx GCM context to initialize - */ -void mbedtls_gcm_init( mbedtls_gcm_context *ctx ); - -/** - * \brief GCM initialization (encryption) - * - * \param ctx GCM context to be initialized - * \param cipher cipher to use (a 128-bit block cipher) - * \param key encryption key - * \param keybits must be 128, 192 or 256 - * - * \return 0 if successful, or a cipher specific error code - */ -int mbedtls_gcm_setkey( mbedtls_gcm_context *ctx, - mbedtls_cipher_id_t cipher, - const unsigned char *key, - unsigned int keybits ); - -/** - * \brief GCM buffer encryption/decryption using a block cipher - * - * \note On encryption, the output buffer can be the same as the input buffer. - * On decryption, the output buffer cannot be the same as input buffer. - * If buffers overlap, the output buffer must trail at least 8 bytes - * behind the input buffer. - * - * \param ctx GCM context - * \param mode MBEDTLS_GCM_ENCRYPT or MBEDTLS_GCM_DECRYPT - * \param length length of the input data - * \param iv initialization vector - * \param iv_len length of IV - * \param add additional data - * \param add_len length of additional data - * \param input buffer holding the input data - * \param output buffer for holding the output data - * \param tag_len length of the tag to generate - * \param tag buffer for holding the tag - * - * \return 0 if successful - */ -int mbedtls_gcm_crypt_and_tag( mbedtls_gcm_context *ctx, - int mode, - size_t length, - const unsigned char *iv, - size_t iv_len, - const unsigned char *add, - size_t add_len, - const unsigned char *input, - unsigned char *output, - size_t tag_len, - unsigned char *tag ); - -/** - * \brief GCM buffer authenticated decryption using a block cipher - * - * \note On decryption, the output buffer cannot be the same as input buffer. - * If buffers overlap, the output buffer must trail at least 8 bytes - * behind the input buffer. - * - * \param ctx GCM context - * \param length length of the input data - * \param iv initialization vector - * \param iv_len length of IV - * \param add additional data - * \param add_len length of additional data - * \param tag buffer holding the tag - * \param tag_len length of the tag - * \param input buffer holding the input data - * \param output buffer for holding the output data - * - * \return 0 if successful and authenticated, - * MBEDTLS_ERR_GCM_AUTH_FAILED if tag does not match - */ -int mbedtls_gcm_auth_decrypt( mbedtls_gcm_context *ctx, - size_t length, - const unsigned char *iv, - size_t iv_len, - const unsigned char *add, - size_t add_len, - const unsigned char *tag, - size_t tag_len, - const unsigned char *input, - unsigned char *output ); - -/** - * \brief Generic GCM stream start function - * - * \param ctx GCM context - * \param mode MBEDTLS_GCM_ENCRYPT or MBEDTLS_GCM_DECRYPT - * \param iv initialization vector - * \param iv_len length of IV - * \param add additional data (or NULL if length is 0) - * \param add_len length of additional data - * - * \return 0 if successful - */ -int mbedtls_gcm_starts( mbedtls_gcm_context *ctx, - int mode, - const unsigned char *iv, - size_t iv_len, - const unsigned char *add, - size_t add_len ); - -/** - * \brief Generic GCM update function. Encrypts/decrypts using the - * given GCM context. Expects input to be a multiple of 16 - * bytes! Only the last call before mbedtls_gcm_finish() can be less - * than 16 bytes! - * - * \note On decryption, the output buffer cannot be the same as input buffer. - * If buffers overlap, the output buffer must trail at least 8 bytes - * behind the input buffer. - * - * \param ctx GCM context - * \param length length of the input data - * \param input buffer holding the input data - * \param output buffer for holding the output data - * - * \return 0 if successful or MBEDTLS_ERR_GCM_BAD_INPUT - */ -int mbedtls_gcm_update( mbedtls_gcm_context *ctx, - size_t length, - const unsigned char *input, - unsigned char *output ); - -/** - * \brief Generic GCM finalisation function. Wraps up the GCM stream - * and generates the tag. The tag can have a maximum length of - * 16 bytes. - * - * \param ctx GCM context - * \param tag buffer for holding the tag (may be NULL if tag_len is 0) - * \param tag_len length of the tag to generate - * - * \return 0 if successful or MBEDTLS_ERR_GCM_BAD_INPUT - */ -int mbedtls_gcm_finish( mbedtls_gcm_context *ctx, - unsigned char *tag, - size_t tag_len ); - -/** - * \brief Free a GCM context and underlying cipher sub-context - * - * \param ctx GCM context to free - */ -void mbedtls_gcm_free( mbedtls_gcm_context *ctx ); - -/** - * \brief Checkup routine - * - * \return 0 if successful, or 1 if the test failed - */ -int mbedtls_gcm_self_test( int verbose ); - -#ifdef __cplusplus -} -#endif - -#endif /* gcm.h */ diff --git a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/havege.h b/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/havege.h deleted file mode 100644 index dac5d311..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/havege.h +++ /dev/null @@ -1,74 +0,0 @@ -/** - * \file havege.h - * - * \brief HAVEGE: HArdware Volatile Entropy Gathering and Expansion - * - * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * This file is part of mbed TLS (https://tls.mbed.org) - */ -#ifndef MBEDTLS_HAVEGE_H -#define MBEDTLS_HAVEGE_H - -#include - -#define MBEDTLS_HAVEGE_COLLECT_SIZE 1024 - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * \brief HAVEGE state structure - */ -typedef struct -{ - int PT1, PT2, offset[2]; - int pool[MBEDTLS_HAVEGE_COLLECT_SIZE]; - int WALK[8192]; -} -mbedtls_havege_state; - -/** - * \brief HAVEGE initialization - * - * \param hs HAVEGE state to be initialized - */ -void mbedtls_havege_init( mbedtls_havege_state *hs ); - -/** - * \brief Clear HAVEGE state - * - * \param hs HAVEGE state to be cleared - */ -void mbedtls_havege_free( mbedtls_havege_state *hs ); - -/** - * \brief HAVEGE rand function - * - * \param p_rng A HAVEGE state - * \param output Buffer to fill - * \param len Length of buffer - * - * \return 0 - */ -int mbedtls_havege_random( void *p_rng, unsigned char *output, size_t len ); - -#ifdef __cplusplus -} -#endif - -#endif /* havege.h */ diff --git a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/hmac_drbg.h b/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/hmac_drbg.h deleted file mode 100644 index e0105580..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/hmac_drbg.h +++ /dev/null @@ -1,299 +0,0 @@ -/** - * \file hmac_drbg.h - * - * \brief HMAC_DRBG (NIST SP 800-90A) - * - * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * This file is part of mbed TLS (https://tls.mbed.org) - */ -#ifndef MBEDTLS_HMAC_DRBG_H -#define MBEDTLS_HMAC_DRBG_H - -#include "md.h" - -#if defined(MBEDTLS_THREADING_C) -#include "mbedtls/threading.h" -#endif - -/* - * Error codes - */ -#define MBEDTLS_ERR_HMAC_DRBG_REQUEST_TOO_BIG -0x0003 /**< Too many random requested in single call. */ -#define MBEDTLS_ERR_HMAC_DRBG_INPUT_TOO_BIG -0x0005 /**< Input too large (Entropy + additional). */ -#define MBEDTLS_ERR_HMAC_DRBG_FILE_IO_ERROR -0x0007 /**< Read/write error in file. */ -#define MBEDTLS_ERR_HMAC_DRBG_ENTROPY_SOURCE_FAILED -0x0009 /**< The entropy source failed. */ - -/** - * \name SECTION: Module settings - * - * The configuration options you can set for this module are in this section. - * Either change them in config.h or define them on the compiler command line. - * \{ - */ - -#if !defined(MBEDTLS_HMAC_DRBG_RESEED_INTERVAL) -#define MBEDTLS_HMAC_DRBG_RESEED_INTERVAL 10000 /**< Interval before reseed is performed by default */ -#endif - -#if !defined(MBEDTLS_HMAC_DRBG_MAX_INPUT) -#define MBEDTLS_HMAC_DRBG_MAX_INPUT 256 /**< Maximum number of additional input bytes */ -#endif - -#if !defined(MBEDTLS_HMAC_DRBG_MAX_REQUEST) -#define MBEDTLS_HMAC_DRBG_MAX_REQUEST 1024 /**< Maximum number of requested bytes per call */ -#endif - -#if !defined(MBEDTLS_HMAC_DRBG_MAX_SEED_INPUT) -#define MBEDTLS_HMAC_DRBG_MAX_SEED_INPUT 384 /**< Maximum size of (re)seed buffer */ -#endif - -/* \} name SECTION: Module settings */ - -#define MBEDTLS_HMAC_DRBG_PR_OFF 0 /**< No prediction resistance */ -#define MBEDTLS_HMAC_DRBG_PR_ON 1 /**< Prediction resistance enabled */ - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * HMAC_DRBG context. - */ -typedef struct -{ - /* Working state: the key K is not stored explicitely, - * but is implied by the HMAC context */ - mbedtls_md_context_t md_ctx; /*!< HMAC context (inc. K) */ - unsigned char V[MBEDTLS_MD_MAX_SIZE]; /*!< V in the spec */ - int reseed_counter; /*!< reseed counter */ - - /* Administrative state */ - size_t entropy_len; /*!< entropy bytes grabbed on each (re)seed */ - int prediction_resistance; /*!< enable prediction resistance (Automatic - reseed before every random generation) */ - int reseed_interval; /*!< reseed interval */ - - /* Callbacks */ - int (*f_entropy)(void *, unsigned char *, size_t); /*!< entropy function */ - void *p_entropy; /*!< context for the entropy function */ - -#if defined(MBEDTLS_THREADING_C) - mbedtls_threading_mutex_t mutex; -#endif -} mbedtls_hmac_drbg_context; - -/** - * \brief HMAC_DRBG context initialization - * Makes the context ready for mbedtls_hmac_drbg_seed(), - * mbedtls_hmac_drbg_seed_buf() or - * mbedtls_hmac_drbg_free(). - * - * \param ctx HMAC_DRBG context to be initialized - */ -void mbedtls_hmac_drbg_init( mbedtls_hmac_drbg_context *ctx ); - -/** - * \brief HMAC_DRBG initial seeding - * Seed and setup entropy source for future reseeds. - * - * \param ctx HMAC_DRBG context to be seeded - * \param md_info MD algorithm to use for HMAC_DRBG - * \param f_entropy Entropy callback (p_entropy, buffer to fill, buffer - * length) - * \param p_entropy Entropy context - * \param custom Personalization data (Device specific identifiers) - * (Can be NULL) - * \param len Length of personalization data - * - * \note The "security strength" as defined by NIST is set to: - * 128 bits if md_alg is SHA-1, - * 192 bits if md_alg is SHA-224, - * 256 bits if md_alg is SHA-256 or higher. - * Note that SHA-256 is just as efficient as SHA-224. - * - * \return 0 if successful, or - * MBEDTLS_ERR_MD_BAD_INPUT_DATA, or - * MBEDTLS_ERR_MD_ALLOC_FAILED, or - * MBEDTLS_ERR_HMAC_DRBG_ENTROPY_SOURCE_FAILED. - */ -int mbedtls_hmac_drbg_seed( mbedtls_hmac_drbg_context *ctx, - const mbedtls_md_info_t * md_info, - int (*f_entropy)(void *, unsigned char *, size_t), - void *p_entropy, - const unsigned char *custom, - size_t len ); - -/** - * \brief Initilisation of simpified HMAC_DRBG (never reseeds). - * (For use with deterministic ECDSA.) - * - * \param ctx HMAC_DRBG context to be initialised - * \param md_info MD algorithm to use for HMAC_DRBG - * \param data Concatenation of entropy string and additional data - * \param data_len Length of data in bytes - * - * \return 0 if successful, or - * MBEDTLS_ERR_MD_BAD_INPUT_DATA, or - * MBEDTLS_ERR_MD_ALLOC_FAILED. - */ -int mbedtls_hmac_drbg_seed_buf( mbedtls_hmac_drbg_context *ctx, - const mbedtls_md_info_t * md_info, - const unsigned char *data, size_t data_len ); - -/** - * \brief Enable / disable prediction resistance (Default: Off) - * - * Note: If enabled, entropy is used for ctx->entropy_len before each call! - * Only use this if you have ample supply of good entropy! - * - * \param ctx HMAC_DRBG context - * \param resistance MBEDTLS_HMAC_DRBG_PR_ON or MBEDTLS_HMAC_DRBG_PR_OFF - */ -void mbedtls_hmac_drbg_set_prediction_resistance( mbedtls_hmac_drbg_context *ctx, - int resistance ); - -/** - * \brief Set the amount of entropy grabbed on each reseed - * (Default: given by the security strength, which - * depends on the hash used, see \c mbedtls_hmac_drbg_init() ) - * - * \param ctx HMAC_DRBG context - * \param len Amount of entropy to grab, in bytes - */ -void mbedtls_hmac_drbg_set_entropy_len( mbedtls_hmac_drbg_context *ctx, - size_t len ); - -/** - * \brief Set the reseed interval - * (Default: MBEDTLS_HMAC_DRBG_RESEED_INTERVAL) - * - * \param ctx HMAC_DRBG context - * \param interval Reseed interval - */ -void mbedtls_hmac_drbg_set_reseed_interval( mbedtls_hmac_drbg_context *ctx, - int interval ); - -/** - * \brief HMAC_DRBG update state - * - * \param ctx HMAC_DRBG context - * \param additional Additional data to update state with, or NULL - * \param add_len Length of additional data, or 0 - * - * \note Additional data is optional, pass NULL and 0 as second - * third argument if no additional data is being used. - */ -void mbedtls_hmac_drbg_update( mbedtls_hmac_drbg_context *ctx, - const unsigned char *additional, size_t add_len ); - -/** - * \brief HMAC_DRBG reseeding (extracts data from entropy source) - * - * \param ctx HMAC_DRBG context - * \param additional Additional data to add to state (Can be NULL) - * \param len Length of additional data - * - * \return 0 if successful, or - * MBEDTLS_ERR_HMAC_DRBG_ENTROPY_SOURCE_FAILED - */ -int mbedtls_hmac_drbg_reseed( mbedtls_hmac_drbg_context *ctx, - const unsigned char *additional, size_t len ); - -/** - * \brief HMAC_DRBG generate random with additional update input - * - * Note: Automatically reseeds if reseed_counter is reached or PR is enabled. - * - * \param p_rng HMAC_DRBG context - * \param output Buffer to fill - * \param output_len Length of the buffer - * \param additional Additional data to update with (can be NULL) - * \param add_len Length of additional data (can be 0) - * - * \return 0 if successful, or - * MBEDTLS_ERR_HMAC_DRBG_ENTROPY_SOURCE_FAILED, or - * MBEDTLS_ERR_HMAC_DRBG_REQUEST_TOO_BIG, or - * MBEDTLS_ERR_HMAC_DRBG_INPUT_TOO_BIG. - */ -int mbedtls_hmac_drbg_random_with_add( void *p_rng, - unsigned char *output, size_t output_len, - const unsigned char *additional, - size_t add_len ); - -/** - * \brief HMAC_DRBG generate random - * - * Note: Automatically reseeds if reseed_counter is reached or PR is enabled. - * - * \param p_rng HMAC_DRBG context - * \param output Buffer to fill - * \param out_len Length of the buffer - * - * \return 0 if successful, or - * MBEDTLS_ERR_HMAC_DRBG_ENTROPY_SOURCE_FAILED, or - * MBEDTLS_ERR_HMAC_DRBG_REQUEST_TOO_BIG - */ -int mbedtls_hmac_drbg_random( void *p_rng, unsigned char *output, size_t out_len ); - -/** - * \brief Free an HMAC_DRBG context - * - * \param ctx HMAC_DRBG context to free. - */ -void mbedtls_hmac_drbg_free( mbedtls_hmac_drbg_context *ctx ); - -#if defined(MBEDTLS_FS_IO) -/** - * \brief Write a seed file - * - * \param ctx HMAC_DRBG context - * \param path Name of the file - * - * \return 0 if successful, 1 on file error, or - * MBEDTLS_ERR_HMAC_DRBG_ENTROPY_SOURCE_FAILED - */ -int mbedtls_hmac_drbg_write_seed_file( mbedtls_hmac_drbg_context *ctx, const char *path ); - -/** - * \brief Read and update a seed file. Seed is added to this - * instance - * - * \param ctx HMAC_DRBG context - * \param path Name of the file - * - * \return 0 if successful, 1 on file error, - * MBEDTLS_ERR_HMAC_DRBG_ENTROPY_SOURCE_FAILED or - * MBEDTLS_ERR_HMAC_DRBG_INPUT_TOO_BIG - */ -int mbedtls_hmac_drbg_update_seed_file( mbedtls_hmac_drbg_context *ctx, const char *path ); -#endif /* MBEDTLS_FS_IO */ - - -#if defined(MBEDTLS_SELF_TEST) -/** - * \brief Checkup routine - * - * \return 0 if successful, or 1 if the test failed - */ -int mbedtls_hmac_drbg_self_test( int verbose ); -#endif - -#ifdef __cplusplus -} -#endif - -#endif /* hmac_drbg.h */ diff --git a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/md.h b/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/md.h deleted file mode 100644 index 77c2c6f6..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/md.h +++ /dev/null @@ -1,353 +0,0 @@ -/** - * \file mbedtls_md.h - * - * \brief Generic message digest wrapper - * - * \author Adriaan de Jong - * - * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * This file is part of mbed TLS (https://tls.mbed.org) - */ -#ifndef MBEDTLS_MD_H -#define MBEDTLS_MD_H - -#include - -#define MBEDTLS_ERR_MD_FEATURE_UNAVAILABLE -0x5080 /**< The selected feature is not available. */ -#define MBEDTLS_ERR_MD_BAD_INPUT_DATA -0x5100 /**< Bad input parameters to function. */ -#define MBEDTLS_ERR_MD_ALLOC_FAILED -0x5180 /**< Failed to allocate memory. */ -#define MBEDTLS_ERR_MD_FILE_IO_ERROR -0x5200 /**< Opening or reading of file failed. */ - -#ifdef __cplusplus -extern "C" { -#endif - -typedef enum { - MBEDTLS_MD_NONE=0, - MBEDTLS_MD_MD2, - MBEDTLS_MD_MD4, - MBEDTLS_MD_MD5, - MBEDTLS_MD_SHA1, - MBEDTLS_MD_SHA224, - MBEDTLS_MD_SHA256, - MBEDTLS_MD_SHA384, - MBEDTLS_MD_SHA512, - MBEDTLS_MD_RIPEMD160, -} mbedtls_md_type_t; - -#if defined(MBEDTLS_SHA512_C) -#define MBEDTLS_MD_MAX_SIZE 64 /* longest known is SHA512 */ -#else -#define MBEDTLS_MD_MAX_SIZE 32 /* longest known is SHA256 or less */ -#endif - -/** - * Opaque struct defined in md_internal.h - */ -typedef struct mbedtls_md_info_t mbedtls_md_info_t; - -/** - * Generic message digest context. - */ -typedef struct { - /** Information about the associated message digest */ - const mbedtls_md_info_t *md_info; - - /** Digest-specific context */ - void *md_ctx; - - /** HMAC part of the context */ - void *hmac_ctx; -} mbedtls_md_context_t; - -/** - * \brief Returns the list of digests supported by the generic digest module. - * - * \return a statically allocated array of digests, the last entry - * is 0. - */ -const int *mbedtls_md_list( void ); - -/** - * \brief Returns the message digest information associated with the - * given digest name. - * - * \param md_name Name of the digest to search for. - * - * \return The message digest information associated with md_name or - * NULL if not found. - */ -const mbedtls_md_info_t *mbedtls_md_info_from_string( const char *md_name ); - -/** - * \brief Returns the message digest information associated with the - * given digest type. - * - * \param md_type type of digest to search for. - * - * \return The message digest information associated with md_type or - * NULL if not found. - */ -const mbedtls_md_info_t *mbedtls_md_info_from_type( mbedtls_md_type_t md_type ); - -/** - * \brief Initialize a md_context (as NONE) - * This should always be called first. - * Prepares the context for mbedtls_md_setup() or mbedtls_md_free(). - */ -void mbedtls_md_init( mbedtls_md_context_t *ctx ); - -/** - * \brief Free and clear the internal structures of ctx. - * Can be called at any time after mbedtls_md_init(). - * Mandatory once mbedtls_md_setup() has been called. - */ -void mbedtls_md_free( mbedtls_md_context_t *ctx ); - -#if ! defined(MBEDTLS_DEPRECATED_REMOVED) -#if defined(MBEDTLS_DEPRECATED_WARNING) -#define MBEDTLS_DEPRECATED __attribute__((deprecated)) -#else -#define MBEDTLS_DEPRECATED -#endif -/** - * \brief Select MD to use and allocate internal structures. - * Should be called after mbedtls_md_init() or mbedtls_md_free(). - * Makes it necessary to call mbedtls_md_free() later. - * - * \deprecated Superseded by mbedtls_md_setup() in 2.0.0 - * - * \param ctx Context to set up. - * \param md_info Message digest to use. - * - * \returns \c 0 on success, - * \c MBEDTLS_ERR_MD_BAD_INPUT_DATA on parameter failure, - * \c MBEDTLS_ERR_MD_ALLOC_FAILED memory allocation failure. - */ -int mbedtls_md_init_ctx( mbedtls_md_context_t *ctx, const mbedtls_md_info_t *md_info ) MBEDTLS_DEPRECATED; -#undef MBEDTLS_DEPRECATED -#endif /* MBEDTLS_DEPRECATED_REMOVED */ - -/** - * \brief Select MD to use and allocate internal structures. - * Should be called after mbedtls_md_init() or mbedtls_md_free(). - * Makes it necessary to call mbedtls_md_free() later. - * - * \param ctx Context to set up. - * \param md_info Message digest to use. - * \param hmac 0 to save some memory if HMAC will not be used, - * non-zero is HMAC is going to be used with this context. - * - * \returns \c 0 on success, - * \c MBEDTLS_ERR_MD_BAD_INPUT_DATA on parameter failure, - * \c MBEDTLS_ERR_MD_ALLOC_FAILED memory allocation failure. - */ -int mbedtls_md_setup( mbedtls_md_context_t *ctx, const mbedtls_md_info_t *md_info, int hmac ); - -/** - * \brief Clone the state of an MD context - * - * \note The two contexts must have been setup to the same type - * (cloning from SHA-256 to SHA-512 make no sense). - * - * \warning Only clones the MD state, not the HMAC state! (for now) - * - * \param dst The destination context - * \param src The context to be cloned - * - * \return \c 0 on success, - * \c MBEDTLS_ERR_MD_BAD_INPUT_DATA on parameter failure. - */ -int mbedtls_md_clone( mbedtls_md_context_t *dst, - const mbedtls_md_context_t *src ); - -/** - * \brief Returns the size of the message digest output. - * - * \param md_info message digest info - * - * \return size of the message digest output in bytes. - */ -unsigned char mbedtls_md_get_size( const mbedtls_md_info_t *md_info ); - -/** - * \brief Returns the type of the message digest output. - * - * \param md_info message digest info - * - * \return type of the message digest output. - */ -mbedtls_md_type_t mbedtls_md_get_type( const mbedtls_md_info_t *md_info ); - -/** - * \brief Returns the name of the message digest output. - * - * \param md_info message digest info - * - * \return name of the message digest output. - */ -const char *mbedtls_md_get_name( const mbedtls_md_info_t *md_info ); - -/** - * \brief Prepare the context to digest a new message. - * Generally called after mbedtls_md_setup() or mbedtls_md_finish(). - * Followed by mbedtls_md_update(). - * - * \param ctx generic message digest context. - * - * \returns 0 on success, MBEDTLS_ERR_MD_BAD_INPUT_DATA if parameter - * verification fails. - */ -int mbedtls_md_starts( mbedtls_md_context_t *ctx ); - -/** - * \brief Generic message digest process buffer - * Called between mbedtls_md_starts() and mbedtls_md_finish(). - * May be called repeatedly. - * - * \param ctx Generic message digest context - * \param input buffer holding the datal - * \param ilen length of the input data - * - * \returns 0 on success, MBEDTLS_ERR_MD_BAD_INPUT_DATA if parameter - * verification fails. - */ -int mbedtls_md_update( mbedtls_md_context_t *ctx, const unsigned char *input, size_t ilen ); - -/** - * \brief Generic message digest final digest - * Called after mbedtls_md_update(). - * Usually followed by mbedtls_md_free() or mbedtls_md_starts(). - * - * \param ctx Generic message digest context - * \param output Generic message digest checksum result - * - * \returns 0 on success, MBEDTLS_ERR_MD_BAD_INPUT_DATA if parameter - * verification fails. - */ -int mbedtls_md_finish( mbedtls_md_context_t *ctx, unsigned char *output ); - -/** - * \brief Output = message_digest( input buffer ) - * - * \param md_info message digest info - * \param input buffer holding the data - * \param ilen length of the input data - * \param output Generic message digest checksum result - * - * \returns 0 on success, MBEDTLS_ERR_MD_BAD_INPUT_DATA if parameter - * verification fails. - */ -int mbedtls_md( const mbedtls_md_info_t *md_info, const unsigned char *input, size_t ilen, - unsigned char *output ); - -#if defined(MBEDTLS_FS_IO) -/** - * \brief Output = message_digest( file contents ) - * - * \param md_info message digest info - * \param path input file name - * \param output generic message digest checksum result - * - * \return 0 if successful, - * MBEDTLS_ERR_MD_FILE_IO_ERROR if file input failed, - * MBEDTLS_ERR_MD_BAD_INPUT_DATA if md_info was NULL. - */ -int mbedtls_md_file( const mbedtls_md_info_t *md_info, const char *path, - unsigned char *output ); -#endif /* MBEDTLS_FS_IO */ - -/** - * \brief Set HMAC key and prepare to authenticate a new message. - * Usually called after mbedtls_md_setup() or mbedtls_md_hmac_finish(). - * - * \param ctx HMAC context - * \param key HMAC secret key - * \param keylen length of the HMAC key in bytes - * - * \returns 0 on success, MBEDTLS_ERR_MD_BAD_INPUT_DATA if parameter - * verification fails. - */ -int mbedtls_md_hmac_starts( mbedtls_md_context_t *ctx, const unsigned char *key, - size_t keylen ); - -/** - * \brief Generic HMAC process buffer. - * Called between mbedtls_md_hmac_starts() or mbedtls_md_hmac_reset() - * and mbedtls_md_hmac_finish(). - * May be called repeatedly. - * - * \param ctx HMAC context - * \param input buffer holding the data - * \param ilen length of the input data - * - * \returns 0 on success, MBEDTLS_ERR_MD_BAD_INPUT_DATA if parameter - * verification fails. - */ -int mbedtls_md_hmac_update( mbedtls_md_context_t *ctx, const unsigned char *input, - size_t ilen ); - -/** - * \brief Output HMAC. - * Called after mbedtls_md_hmac_update(). - * Usually followed my mbedtls_md_hmac_reset(), mbedtls_md_hmac_starts(), - * or mbedtls_md_free(). - * - * \param ctx HMAC context - * \param output Generic HMAC checksum result - * - * \returns 0 on success, MBEDTLS_ERR_MD_BAD_INPUT_DATA if parameter - * verification fails. - */ -int mbedtls_md_hmac_finish( mbedtls_md_context_t *ctx, unsigned char *output); - -/** - * \brief Prepare to authenticate a new message with the same key. - * Called after mbedtls_md_hmac_finish() and before mbedtls_md_hmac_update(). - * - * \param ctx HMAC context to be reset - * - * \returns 0 on success, MBEDTLS_ERR_MD_BAD_INPUT_DATA if parameter - * verification fails. - */ -int mbedtls_md_hmac_reset( mbedtls_md_context_t *ctx ); - -/** - * \brief Output = Generic_HMAC( hmac key, input buffer ) - * - * \param md_info message digest info - * \param key HMAC secret key - * \param keylen length of the HMAC key in bytes - * \param input buffer holding the data - * \param ilen length of the input data - * \param output Generic HMAC-result - * - * \returns 0 on success, MBEDTLS_ERR_MD_BAD_INPUT_DATA if parameter - * verification fails. - */ -int mbedtls_md_hmac( const mbedtls_md_info_t *md_info, const unsigned char *key, size_t keylen, - const unsigned char *input, size_t ilen, - unsigned char *output ); - -/* Internal use */ -int mbedtls_md_process( mbedtls_md_context_t *ctx, const unsigned char *data ); - -#ifdef __cplusplus -} -#endif - -#endif /* MBEDTLS_MD_H */ diff --git a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/md2.h b/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/md2.h deleted file mode 100644 index 51d79486..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/md2.h +++ /dev/null @@ -1,136 +0,0 @@ -/** - * \file mbedtls_md2.h - * - * \brief MD2 message digest algorithm (hash function) - * - * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * This file is part of mbed TLS (https://tls.mbed.org) - */ -#ifndef MBEDTLS_MD2_H -#define MBEDTLS_MD2_H - -#if !defined(MBEDTLS_CONFIG_FILE) -#include "config.h" -#else -#include MBEDTLS_CONFIG_FILE -#endif - -#include - -#if !defined(MBEDTLS_MD2_ALT) -// Regular implementation -// - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * \brief MD2 context structure - */ -typedef struct -{ - unsigned char cksum[16]; /*!< checksum of the data block */ - unsigned char state[48]; /*!< intermediate digest state */ - unsigned char buffer[16]; /*!< data block being processed */ - size_t left; /*!< amount of data in buffer */ -} -mbedtls_md2_context; - -/** - * \brief Initialize MD2 context - * - * \param ctx MD2 context to be initialized - */ -void mbedtls_md2_init( mbedtls_md2_context *ctx ); - -/** - * \brief Clear MD2 context - * - * \param ctx MD2 context to be cleared - */ -void mbedtls_md2_free( mbedtls_md2_context *ctx ); - -/** - * \brief Clone (the state of) an MD2 context - * - * \param dst The destination context - * \param src The context to be cloned - */ -void mbedtls_md2_clone( mbedtls_md2_context *dst, - const mbedtls_md2_context *src ); - -/** - * \brief MD2 context setup - * - * \param ctx context to be initialized - */ -void mbedtls_md2_starts( mbedtls_md2_context *ctx ); - -/** - * \brief MD2 process buffer - * - * \param ctx MD2 context - * \param input buffer holding the data - * \param ilen length of the input data - */ -void mbedtls_md2_update( mbedtls_md2_context *ctx, const unsigned char *input, size_t ilen ); - -/** - * \brief MD2 final digest - * - * \param ctx MD2 context - * \param output MD2 checksum result - */ -void mbedtls_md2_finish( mbedtls_md2_context *ctx, unsigned char output[16] ); - -#ifdef __cplusplus -} -#endif - -#else /* MBEDTLS_MD2_ALT */ -#include "md2_alt.h" -#endif /* MBEDTLS_MD2_ALT */ - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * \brief Output = MD2( input buffer ) - * - * \param input buffer holding the data - * \param ilen length of the input data - * \param output MD2 checksum result - */ -void mbedtls_md2( const unsigned char *input, size_t ilen, unsigned char output[16] ); - -/** - * \brief Checkup routine - * - * \return 0 if successful, or 1 if the test failed - */ -int mbedtls_md2_self_test( int verbose ); - -/* Internal use */ -void mbedtls_md2_process( mbedtls_md2_context *ctx ); - -#ifdef __cplusplus -} -#endif - -#endif /* mbedtls_md2.h */ diff --git a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/md4.h b/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/md4.h deleted file mode 100644 index 12cb81dc..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/md4.h +++ /dev/null @@ -1,136 +0,0 @@ -/** - * \file mbedtls_md4.h - * - * \brief MD4 message digest algorithm (hash function) - * - * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * This file is part of mbed TLS (https://tls.mbed.org) - */ -#ifndef MBEDTLS_MD4_H -#define MBEDTLS_MD4_H - -#if !defined(MBEDTLS_CONFIG_FILE) -#include "config.h" -#else -#include MBEDTLS_CONFIG_FILE -#endif - -#include -#include - -#if !defined(MBEDTLS_MD4_ALT) -// Regular implementation -// - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * \brief MD4 context structure - */ -typedef struct -{ - uint32_t total[2]; /*!< number of bytes processed */ - uint32_t state[4]; /*!< intermediate digest state */ - unsigned char buffer[64]; /*!< data block being processed */ -} -mbedtls_md4_context; - -/** - * \brief Initialize MD4 context - * - * \param ctx MD4 context to be initialized - */ -void mbedtls_md4_init( mbedtls_md4_context *ctx ); - -/** - * \brief Clear MD4 context - * - * \param ctx MD4 context to be cleared - */ -void mbedtls_md4_free( mbedtls_md4_context *ctx ); - -/** - * \brief Clone (the state of) an MD4 context - * - * \param dst The destination context - * \param src The context to be cloned - */ -void mbedtls_md4_clone( mbedtls_md4_context *dst, - const mbedtls_md4_context *src ); - -/** - * \brief MD4 context setup - * - * \param ctx context to be initialized - */ -void mbedtls_md4_starts( mbedtls_md4_context *ctx ); - -/** - * \brief MD4 process buffer - * - * \param ctx MD4 context - * \param input buffer holding the data - * \param ilen length of the input data - */ -void mbedtls_md4_update( mbedtls_md4_context *ctx, const unsigned char *input, size_t ilen ); - -/** - * \brief MD4 final digest - * - * \param ctx MD4 context - * \param output MD4 checksum result - */ -void mbedtls_md4_finish( mbedtls_md4_context *ctx, unsigned char output[16] ); - -#ifdef __cplusplus -} -#endif - -#else /* MBEDTLS_MD4_ALT */ -#include "md4_alt.h" -#endif /* MBEDTLS_MD4_ALT */ - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * \brief Output = MD4( input buffer ) - * - * \param input buffer holding the data - * \param ilen length of the input data - * \param output MD4 checksum result - */ -void mbedtls_md4( const unsigned char *input, size_t ilen, unsigned char output[16] ); - -/** - * \brief Checkup routine - * - * \return 0 if successful, or 1 if the test failed - */ -int mbedtls_md4_self_test( int verbose ); - -/* Internal use */ -void mbedtls_md4_process( mbedtls_md4_context *ctx, const unsigned char data[64] ); - -#ifdef __cplusplus -} -#endif - -#endif /* mbedtls_md4.h */ diff --git a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/md5.h b/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/md5.h deleted file mode 100644 index 09d8a947..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/md5.h +++ /dev/null @@ -1,136 +0,0 @@ -/** - * \file mbedtls_md5.h - * - * \brief MD5 message digest algorithm (hash function) - * - * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * This file is part of mbed TLS (https://tls.mbed.org) - */ -#ifndef MBEDTLS_MD5_H -#define MBEDTLS_MD5_H - -#if !defined(MBEDTLS_CONFIG_FILE) -#include "config.h" -#else -#include MBEDTLS_CONFIG_FILE -#endif - -#include -#include - -#if !defined(MBEDTLS_MD5_ALT) -// Regular implementation -// - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * \brief MD5 context structure - */ -typedef struct -{ - uint32_t total[2]; /*!< number of bytes processed */ - uint32_t state[4]; /*!< intermediate digest state */ - unsigned char buffer[64]; /*!< data block being processed */ -} -mbedtls_md5_context; - -/** - * \brief Initialize MD5 context - * - * \param ctx MD5 context to be initialized - */ -void mbedtls_md5_init( mbedtls_md5_context *ctx ); - -/** - * \brief Clear MD5 context - * - * \param ctx MD5 context to be cleared - */ -void mbedtls_md5_free( mbedtls_md5_context *ctx ); - -/** - * \brief Clone (the state of) an MD5 context - * - * \param dst The destination context - * \param src The context to be cloned - */ -void mbedtls_md5_clone( mbedtls_md5_context *dst, - const mbedtls_md5_context *src ); - -/** - * \brief MD5 context setup - * - * \param ctx context to be initialized - */ -void mbedtls_md5_starts( mbedtls_md5_context *ctx ); - -/** - * \brief MD5 process buffer - * - * \param ctx MD5 context - * \param input buffer holding the data - * \param ilen length of the input data - */ -void mbedtls_md5_update( mbedtls_md5_context *ctx, const unsigned char *input, size_t ilen ); - -/** - * \brief MD5 final digest - * - * \param ctx MD5 context - * \param output MD5 checksum result - */ -void mbedtls_md5_finish( mbedtls_md5_context *ctx, unsigned char output[16] ); - -/* Internal use */ -void mbedtls_md5_process( mbedtls_md5_context *ctx, const unsigned char data[64] ); - -#ifdef __cplusplus -} -#endif - -#else /* MBEDTLS_MD5_ALT */ -#include "md5_alt.h" -#endif /* MBEDTLS_MD5_ALT */ - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * \brief Output = MD5( input buffer ) - * - * \param input buffer holding the data - * \param ilen length of the input data - * \param output MD5 checksum result - */ -void mbedtls_md5( const unsigned char *input, size_t ilen, unsigned char output[16] ); - -/** - * \brief Checkup routine - * - * \return 0 if successful, or 1 if the test failed - */ -int mbedtls_md5_self_test( int verbose ); - -#ifdef __cplusplus -} -#endif - -#endif /* mbedtls_md5.h */ diff --git a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/md_internal.h b/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/md_internal.h deleted file mode 100644 index e2441bbc..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/md_internal.h +++ /dev/null @@ -1,114 +0,0 @@ -/** - * \file md_internal.h - * - * \brief Message digest wrappers. - * - * \warning This in an internal header. Do not include directly. - * - * \author Adriaan de Jong - * - * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * This file is part of mbed TLS (https://tls.mbed.org) - */ -#ifndef MBEDTLS_MD_WRAP_H -#define MBEDTLS_MD_WRAP_H - -#if !defined(MBEDTLS_CONFIG_FILE) -#include "config.h" -#else -#include MBEDTLS_CONFIG_FILE -#endif - -#include "md.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * Message digest information. - * Allows message digest functions to be called in a generic way. - */ -struct mbedtls_md_info_t -{ - /** Digest identifier */ - mbedtls_md_type_t type; - - /** Name of the message digest */ - const char * name; - - /** Output length of the digest function in bytes */ - int size; - - /** Block length of the digest function in bytes */ - int block_size; - - /** Digest initialisation function */ - void (*starts_func)( void *ctx ); - - /** Digest update function */ - void (*update_func)( void *ctx, const unsigned char *input, size_t ilen ); - - /** Digest finalisation function */ - void (*finish_func)( void *ctx, unsigned char *output ); - - /** Generic digest function */ - void (*digest_func)( const unsigned char *input, size_t ilen, - unsigned char *output ); - - /** Allocate a new context */ - void * (*ctx_alloc_func)( void ); - - /** Free the given context */ - void (*ctx_free_func)( void *ctx ); - - /** Clone state from a context */ - void (*clone_func)( void *dst, const void *src ); - - /** Internal use only */ - void (*process_func)( void *ctx, const unsigned char *input ); -}; - -#if defined(MBEDTLS_MD2_C) -extern const mbedtls_md_info_t mbedtls_md2_info; -#endif -#if defined(MBEDTLS_MD4_C) -extern const mbedtls_md_info_t mbedtls_md4_info; -#endif -#if defined(MBEDTLS_MD5_C) -extern const mbedtls_md_info_t mbedtls_md5_info; -#endif -#if defined(MBEDTLS_RIPEMD160_C) -extern const mbedtls_md_info_t mbedtls_ripemd160_info; -#endif -#if defined(MBEDTLS_SHA1_C) -extern const mbedtls_md_info_t mbedtls_sha1_info; -#endif -#if defined(MBEDTLS_SHA256_C) -extern const mbedtls_md_info_t mbedtls_sha224_info; -extern const mbedtls_md_info_t mbedtls_sha256_info; -#endif -#if defined(MBEDTLS_SHA512_C) -extern const mbedtls_md_info_t mbedtls_sha384_info; -extern const mbedtls_md_info_t mbedtls_sha512_info; -#endif - -#ifdef __cplusplus -} -#endif - -#endif /* MBEDTLS_MD_WRAP_H */ diff --git a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/memory_buffer_alloc.h b/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/memory_buffer_alloc.h deleted file mode 100644 index 661bc08d..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/memory_buffer_alloc.h +++ /dev/null @@ -1,146 +0,0 @@ -/** - * \file memory_buffer_alloc.h - * - * \brief Buffer-based memory allocator - * - * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * This file is part of mbed TLS (https://tls.mbed.org) - */ -#ifndef MBEDTLS_MEMORY_BUFFER_ALLOC_H -#define MBEDTLS_MEMORY_BUFFER_ALLOC_H - -#if !defined(MBEDTLS_CONFIG_FILE) -#include "config.h" -#else -#include MBEDTLS_CONFIG_FILE -#endif - -#include - -/** - * \name SECTION: Module settings - * - * The configuration options you can set for this module are in this section. - * Either change them in config.h or define them on the compiler command line. - * \{ - */ - -#if !defined(MBEDTLS_MEMORY_ALIGN_MULTIPLE) -#define MBEDTLS_MEMORY_ALIGN_MULTIPLE 4 /**< Align on multiples of this value */ -#endif - -/* \} name SECTION: Module settings */ - -#define MBEDTLS_MEMORY_VERIFY_NONE 0 -#define MBEDTLS_MEMORY_VERIFY_ALLOC (1 << 0) -#define MBEDTLS_MEMORY_VERIFY_FREE (1 << 1) -#define MBEDTLS_MEMORY_VERIFY_ALWAYS (MBEDTLS_MEMORY_VERIFY_ALLOC | MBEDTLS_MEMORY_VERIFY_FREE) - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * \brief Initialize use of stack-based memory allocator. - * The stack-based allocator does memory management inside the - * presented buffer and does not call calloc() and free(). - * It sets the global mbedtls_calloc() and mbedtls_free() pointers - * to its own functions. - * (Provided mbedtls_calloc() and mbedtls_free() are thread-safe if - * MBEDTLS_THREADING_C is defined) - * - * \note This code is not optimized and provides a straight-forward - * implementation of a stack-based memory allocator. - * - * \param buf buffer to use as heap - * \param len size of the buffer - */ -void mbedtls_memory_buffer_alloc_init( unsigned char *buf, size_t len ); - -/** - * \brief Free the mutex for thread-safety and clear remaining memory - */ -void mbedtls_memory_buffer_alloc_free( void ); - -/** - * \brief Determine when the allocator should automatically verify the state - * of the entire chain of headers / meta-data. - * (Default: MBEDTLS_MEMORY_VERIFY_NONE) - * - * \param verify One of MBEDTLS_MEMORY_VERIFY_NONE, MBEDTLS_MEMORY_VERIFY_ALLOC, - * MBEDTLS_MEMORY_VERIFY_FREE or MBEDTLS_MEMORY_VERIFY_ALWAYS - */ -void mbedtls_memory_buffer_set_verify( int verify ); - -#if defined(MBEDTLS_MEMORY_DEBUG) -/** - * \brief Print out the status of the allocated memory (primarily for use - * after a program should have de-allocated all memory) - * Prints out a list of 'still allocated' blocks and their stack - * trace if MBEDTLS_MEMORY_BACKTRACE is defined. - */ -void mbedtls_memory_buffer_alloc_status( void ); - -/** - * \brief Get the peak heap usage so far - * - * \param max_used Peak number of bytes reauested by the application - * \param max_blocks Peak number of blocks reauested by the application - */ -void mbedtls_memory_buffer_alloc_max_get( size_t *max_used, size_t *max_blocks ); - -/** - * \brief Reset peak statistics - */ -void mbedtls_memory_buffer_alloc_max_reset( void ); - -/** - * \brief Get the current heap usage - * - * \param cur_used Number of bytes reauested by the application - * \param cur_blocks Number of blocks reauested by the application - */ -void mbedtls_memory_buffer_alloc_cur_get( size_t *cur_used, size_t *cur_blocks ); -#endif /* MBEDTLS_MEMORY_DEBUG */ - -/** - * \brief Verifies that all headers in the memory buffer are correct - * and contain sane values. Helps debug buffer-overflow errors. - * - * Prints out first failure if MBEDTLS_MEMORY_DEBUG is defined. - * Prints out full header information if MBEDTLS_MEMORY_DEBUG - * is defined. (Includes stack trace information for each block if - * MBEDTLS_MEMORY_BACKTRACE is defined as well). - * - * \return 0 if verified, 1 otherwise - */ -int mbedtls_memory_buffer_alloc_verify( void ); - -#if defined(MBEDTLS_SELF_TEST) -/** - * \brief Checkup routine - * - * \return 0 if successful, or 1 if a test failed - */ -int mbedtls_memory_buffer_alloc_self_test( int verbose ); -#endif - -#ifdef __cplusplus -} -#endif - -#endif /* memory_buffer_alloc.h */ diff --git a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/net.h b/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/net.h deleted file mode 100644 index 8c6534cf..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/net.h +++ /dev/null @@ -1,225 +0,0 @@ -/** - * \file net.h - * - * \brief Network communication functions - * - * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * This file is part of mbed TLS (https://tls.mbed.org) - */ -#ifndef MBEDTLS_NET_H -#define MBEDTLS_NET_H - -#if !defined(MBEDTLS_CONFIG_FILE) -#include "config.h" -#else -#include MBEDTLS_CONFIG_FILE -#endif - -#include "ssl.h" - -#include -#include - -#define MBEDTLS_ERR_NET_SOCKET_FAILED -0x0042 /**< Failed to open a socket. */ -#define MBEDTLS_ERR_NET_CONNECT_FAILED -0x0044 /**< The connection to the given server / port failed. */ -#define MBEDTLS_ERR_NET_BIND_FAILED -0x0046 /**< Binding of the socket failed. */ -#define MBEDTLS_ERR_NET_LISTEN_FAILED -0x0048 /**< Could not listen on the socket. */ -#define MBEDTLS_ERR_NET_ACCEPT_FAILED -0x004A /**< Could not accept the incoming connection. */ -#define MBEDTLS_ERR_NET_RECV_FAILED -0x004C /**< Reading information from the socket failed. */ -#define MBEDTLS_ERR_NET_SEND_FAILED -0x004E /**< Sending information through the socket failed. */ -#define MBEDTLS_ERR_NET_CONN_RESET -0x0050 /**< Connection was reset by peer. */ -#define MBEDTLS_ERR_NET_UNKNOWN_HOST -0x0052 /**< Failed to get an IP address for the given hostname. */ -#define MBEDTLS_ERR_NET_BUFFER_TOO_SMALL -0x0043 /**< Buffer is too small to hold the data. */ -#define MBEDTLS_ERR_NET_INVALID_CONTEXT -0x0045 /**< The context is invalid, eg because it was free()ed. */ - -#define MBEDTLS_NET_LISTEN_BACKLOG 10 /**< The backlog that listen() should use. */ - -#define MBEDTLS_NET_PROTO_TCP 0 /**< The TCP transport protocol */ -#define MBEDTLS_NET_PROTO_UDP 1 /**< The UDP transport protocol */ - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * Wrapper type for sockets. - * - * Currently backed by just a file descriptor, but might be more in the future - * (eg two file descriptors for combined IPv4 + IPv6 support, or additional - * structures for hand-made UDP demultiplexing). - */ -typedef struct -{ - int fd; /**< The underlying file descriptor */ -} -mbedtls_net_context; - -/** - * \brief Initialize a context - * Just makes the context ready to be used or freed safely. - * - * \param ctx Context to initialize - */ -void mbedtls_net_init( mbedtls_net_context *ctx ); - -/** - * \brief Initiate a connection with host:port in the given protocol - * - * \param ctx Socket to use - * \param host Host to connect to - * \param port Port to connect to - * \param proto Protocol: MBEDTLS_NET_PROTO_TCP or MBEDTLS_NET_PROTO_UDP - * - * \return 0 if successful, or one of: - * MBEDTLS_ERR_NET_SOCKET_FAILED, - * MBEDTLS_ERR_NET_UNKNOWN_HOST, - * MBEDTLS_ERR_NET_CONNECT_FAILED - * - * \note Sets the socket in connected mode even with UDP. - */ -int mbedtls_net_connect( mbedtls_net_context *ctx, const char *host, const char *port, int proto ); - -/** - * \brief Create a receiving socket on bind_ip:port in the chosen - * protocol. If bind_ip == NULL, all interfaces are bound. - * - * \param ctx Socket to use - * \param bind_ip IP to bind to, can be NULL - * \param port Port number to use - * \param proto Protocol: MBEDTLS_NET_PROTO_TCP or MBEDTLS_NET_PROTO_UDP - * - * \return 0 if successful, or one of: - * MBEDTLS_ERR_NET_SOCKET_FAILED, - * MBEDTLS_ERR_NET_BIND_FAILED, - * MBEDTLS_ERR_NET_LISTEN_FAILED - * - * \note Regardless of the protocol, opens the sockets and binds it. - * In addition, make the socket listening if protocol is TCP. - */ -int mbedtls_net_bind( mbedtls_net_context *ctx, const char *bind_ip, const char *port, int proto ); - -/** - * \brief Accept a connection from a remote client - * - * \param bind_ctx Relevant socket - * \param client_ctx Will contain the connected client socket - * \param client_ip Will contain the client IP address - * \param buf_size Size of the client_ip buffer - * \param ip_len Will receive the size of the client IP written - * - * \return 0 if successful, or - * MBEDTLS_ERR_NET_ACCEPT_FAILED, or - * MBEDTLS_ERR_NET_BUFFER_TOO_SMALL if buf_size is too small, - * MBEDTLS_ERR_SSL_WANT_READ if bind_fd was set to - * non-blocking and accept() would block. - */ -int mbedtls_net_accept( mbedtls_net_context *bind_ctx, - mbedtls_net_context *client_ctx, - void *client_ip, size_t buf_size, size_t *ip_len ); - -/** - * \brief Set the socket blocking - * - * \param ctx Socket to set - * - * \return 0 if successful, or a non-zero error code - */ -int mbedtls_net_set_block( mbedtls_net_context *ctx ); - -/** - * \brief Set the socket non-blocking - * - * \param ctx Socket to set - * - * \return 0 if successful, or a non-zero error code - */ -int mbedtls_net_set_nonblock( mbedtls_net_context *ctx ); - -/** - * \brief Portable usleep helper - * - * \param usec Amount of microseconds to sleep - * - * \note Real amount of time slept will not be less than - * select()'s timeout granularity (typically, 10ms). - */ -void mbedtls_net_usleep( unsigned long usec ); - -/** - * \brief Read at most 'len' characters. If no error occurs, - * the actual amount read is returned. - * - * \param ctx Socket - * \param buf The buffer to write to - * \param len Maximum length of the buffer - * - * \return the number of bytes received, - * or a non-zero error code; with a non-blocking socket, - * MBEDTLS_ERR_SSL_WANT_READ indicates read() would block. - */ -int mbedtls_net_recv( void *ctx, unsigned char *buf, size_t len ); - -/** - * \brief Write at most 'len' characters. If no error occurs, - * the actual amount read is returned. - * - * \param ctx Socket - * \param buf The buffer to read from - * \param len The length of the buffer - * - * \return the number of bytes sent, - * or a non-zero error code; with a non-blocking socket, - * MBEDTLS_ERR_SSL_WANT_WRITE indicates write() would block. - */ -int mbedtls_net_send( void *ctx, const unsigned char *buf, size_t len ); - -/** - * \brief Read at most 'len' characters, blocking for at most - * 'timeout' seconds. If no error occurs, the actual amount - * read is returned. - * - * \param ctx Socket - * \param buf The buffer to write to - * \param len Maximum length of the buffer - * \param timeout Maximum number of milliseconds to wait for data - * 0 means no timeout (wait forever) - * - * \return the number of bytes received, - * or a non-zero error code: - * MBEDTLS_ERR_SSL_TIMEOUT if the operation timed out, - * MBEDTLS_ERR_SSL_WANT_READ if interrupted by a signal. - * - * \note This function will block (until data becomes available or - * timeout is reached) even if the socket is set to - * non-blocking. Handling timeouts with non-blocking reads - * requires a different strategy. - */ -int mbedtls_net_recv_timeout( void *ctx, unsigned char *buf, size_t len, - uint32_t timeout ); - -/** - * \brief Gracefully shutdown the connection and free associated data - * - * \param ctx The context to free - */ -void mbedtls_net_free( mbedtls_net_context *ctx ); - -#ifdef __cplusplus -} -#endif - -#endif /* net.h */ diff --git a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/oid.h b/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/oid.h deleted file mode 100644 index fcecdafd..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/oid.h +++ /dev/null @@ -1,570 +0,0 @@ -/** - * \file oid.h - * - * \brief Object Identifier (OID) database - * - * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * This file is part of mbed TLS (https://tls.mbed.org) - */ -#ifndef MBEDTLS_OID_H -#define MBEDTLS_OID_H - -#if !defined(MBEDTLS_CONFIG_FILE) -#include "config.h" -#else -#include MBEDTLS_CONFIG_FILE -#endif - -#include "asn1.h" -#include "pk.h" - -#include - -#if defined(MBEDTLS_CIPHER_C) -#include "cipher.h" -#endif - -#if defined(MBEDTLS_MD_C) -#include "md.h" -#endif - -#if defined(MBEDTLS_X509_USE_C) || defined(MBEDTLS_X509_CREATE_C) -#include "x509.h" -#endif - -#define MBEDTLS_ERR_OID_NOT_FOUND -0x002E /**< OID is not found. */ -#define MBEDTLS_ERR_OID_BUF_TOO_SMALL -0x000B /**< output buffer is too small */ - -/* - * Top level OID tuples - */ -#define MBEDTLS_OID_ISO_MEMBER_BODIES "\x2a" /* {iso(1) member-body(2)} */ -#define MBEDTLS_OID_ISO_IDENTIFIED_ORG "\x2b" /* {iso(1) identified-organization(3)} */ -#define MBEDTLS_OID_ISO_CCITT_DS "\x55" /* {joint-iso-ccitt(2) ds(5)} */ -#define MBEDTLS_OID_ISO_ITU_COUNTRY "\x60" /* {joint-iso-itu-t(2) country(16)} */ - -/* - * ISO Member bodies OID parts - */ -#define MBEDTLS_OID_COUNTRY_US "\x86\x48" /* {us(840)} */ -#define MBEDTLS_OID_ORG_RSA_DATA_SECURITY "\x86\xf7\x0d" /* {rsadsi(113549)} */ -#define MBEDTLS_OID_RSA_COMPANY MBEDTLS_OID_ISO_MEMBER_BODIES MBEDTLS_OID_COUNTRY_US \ - MBEDTLS_OID_ORG_RSA_DATA_SECURITY /* {iso(1) member-body(2) us(840) rsadsi(113549)} */ -#define MBEDTLS_OID_ORG_ANSI_X9_62 "\xce\x3d" /* ansi-X9-62(10045) */ -#define MBEDTLS_OID_ANSI_X9_62 MBEDTLS_OID_ISO_MEMBER_BODIES MBEDTLS_OID_COUNTRY_US \ - MBEDTLS_OID_ORG_ANSI_X9_62 - -/* - * ISO Identified organization OID parts - */ -#define MBEDTLS_OID_ORG_DOD "\x06" /* {dod(6)} */ -#define MBEDTLS_OID_ORG_OIW "\x0e" -#define MBEDTLS_OID_OIW_SECSIG MBEDTLS_OID_ORG_OIW "\x03" -#define MBEDTLS_OID_OIW_SECSIG_ALG MBEDTLS_OID_OIW_SECSIG "\x02" -#define MBEDTLS_OID_OIW_SECSIG_SHA1 MBEDTLS_OID_OIW_SECSIG_ALG "\x1a" -#define MBEDTLS_OID_ORG_CERTICOM "\x81\x04" /* certicom(132) */ -#define MBEDTLS_OID_CERTICOM MBEDTLS_OID_ISO_IDENTIFIED_ORG MBEDTLS_OID_ORG_CERTICOM -#define MBEDTLS_OID_ORG_TELETRUST "\x24" /* teletrust(36) */ -#define MBEDTLS_OID_TELETRUST MBEDTLS_OID_ISO_IDENTIFIED_ORG MBEDTLS_OID_ORG_TELETRUST - -/* - * ISO ITU OID parts - */ -#define MBEDTLS_OID_ORGANIZATION "\x01" /* {organization(1)} */ -#define MBEDTLS_OID_ISO_ITU_US_ORG MBEDTLS_OID_ISO_ITU_COUNTRY MBEDTLS_OID_COUNTRY_US MBEDTLS_OID_ORGANIZATION /* {joint-iso-itu-t(2) country(16) us(840) organization(1)} */ - -#define MBEDTLS_OID_ORG_GOV "\x65" /* {gov(101)} */ -#define MBEDTLS_OID_GOV MBEDTLS_OID_ISO_ITU_US_ORG MBEDTLS_OID_ORG_GOV /* {joint-iso-itu-t(2) country(16) us(840) organization(1) gov(101)} */ - -#define MBEDTLS_OID_ORG_NETSCAPE "\x86\xF8\x42" /* {netscape(113730)} */ -#define MBEDTLS_OID_NETSCAPE MBEDTLS_OID_ISO_ITU_US_ORG MBEDTLS_OID_ORG_NETSCAPE /* Netscape OID {joint-iso-itu-t(2) country(16) us(840) organization(1) netscape(113730)} */ - -/* ISO arc for standard certificate and CRL extensions */ -#define MBEDTLS_OID_ID_CE MBEDTLS_OID_ISO_CCITT_DS "\x1D" /**< id-ce OBJECT IDENTIFIER ::= {joint-iso-ccitt(2) ds(5) 29} */ - -/** - * Private Internet Extensions - * { iso(1) identified-organization(3) dod(6) internet(1) - * security(5) mechanisms(5) pkix(7) } - */ -#define MBEDTLS_OID_PKIX MBEDTLS_OID_ISO_IDENTIFIED_ORG MBEDTLS_OID_ORG_DOD "\x01\x05\x05\x07" - -/* - * Arc for standard naming attributes - */ -#define MBEDTLS_OID_AT MBEDTLS_OID_ISO_CCITT_DS "\x04" /**< id-at OBJECT IDENTIFIER ::= {joint-iso-ccitt(2) ds(5) 4} */ -#define MBEDTLS_OID_AT_CN MBEDTLS_OID_AT "\x03" /**< id-at-commonName AttributeType:= {id-at 3} */ -#define MBEDTLS_OID_AT_SUR_NAME MBEDTLS_OID_AT "\x04" /**< id-at-surName AttributeType:= {id-at 4} */ -#define MBEDTLS_OID_AT_SERIAL_NUMBER MBEDTLS_OID_AT "\x05" /**< id-at-serialNumber AttributeType:= {id-at 5} */ -#define MBEDTLS_OID_AT_COUNTRY MBEDTLS_OID_AT "\x06" /**< id-at-countryName AttributeType:= {id-at 6} */ -#define MBEDTLS_OID_AT_LOCALITY MBEDTLS_OID_AT "\x07" /**< id-at-locality AttributeType:= {id-at 7} */ -#define MBEDTLS_OID_AT_STATE MBEDTLS_OID_AT "\x08" /**< id-at-state AttributeType:= {id-at 8} */ -#define MBEDTLS_OID_AT_ORGANIZATION MBEDTLS_OID_AT "\x0A" /**< id-at-organizationName AttributeType:= {id-at 10} */ -#define MBEDTLS_OID_AT_ORG_UNIT MBEDTLS_OID_AT "\x0B" /**< id-at-organizationalUnitName AttributeType:= {id-at 11} */ -#define MBEDTLS_OID_AT_TITLE MBEDTLS_OID_AT "\x0C" /**< id-at-title AttributeType:= {id-at 12} */ -#define MBEDTLS_OID_AT_POSTAL_ADDRESS MBEDTLS_OID_AT "\x10" /**< id-at-postalAddress AttributeType:= {id-at 16} */ -#define MBEDTLS_OID_AT_POSTAL_CODE MBEDTLS_OID_AT "\x11" /**< id-at-postalCode AttributeType:= {id-at 17} */ -#define MBEDTLS_OID_AT_GIVEN_NAME MBEDTLS_OID_AT "\x2A" /**< id-at-givenName AttributeType:= {id-at 42} */ -#define MBEDTLS_OID_AT_INITIALS MBEDTLS_OID_AT "\x2B" /**< id-at-initials AttributeType:= {id-at 43} */ -#define MBEDTLS_OID_AT_GENERATION_QUALIFIER MBEDTLS_OID_AT "\x2C" /**< id-at-generationQualifier AttributeType:= {id-at 44} */ -#define MBEDTLS_OID_AT_UNIQUE_IDENTIFIER MBEDTLS_OID_AT "\x2D" /**< id-at-uniqueIdentifier AttributType:= {id-at 45} */ -#define MBEDTLS_OID_AT_DN_QUALIFIER MBEDTLS_OID_AT "\x2E" /**< id-at-dnQualifier AttributeType:= {id-at 46} */ -#define MBEDTLS_OID_AT_PSEUDONYM MBEDTLS_OID_AT "\x41" /**< id-at-pseudonym AttributeType:= {id-at 65} */ - -#define MBEDTLS_OID_DOMAIN_COMPONENT "\x09\x92\x26\x89\x93\xF2\x2C\x64\x01\x19" /** id-domainComponent AttributeType:= {itu-t(0) data(9) pss(2342) ucl(19200300) pilot(100) pilotAttributeType(1) domainComponent(25)} */ - -/* - * OIDs for standard certificate extensions - */ -#define MBEDTLS_OID_AUTHORITY_KEY_IDENTIFIER MBEDTLS_OID_ID_CE "\x23" /**< id-ce-authorityKeyIdentifier OBJECT IDENTIFIER ::= { id-ce 35 } */ -#define MBEDTLS_OID_SUBJECT_KEY_IDENTIFIER MBEDTLS_OID_ID_CE "\x0E" /**< id-ce-subjectKeyIdentifier OBJECT IDENTIFIER ::= { id-ce 14 } */ -#define MBEDTLS_OID_KEY_USAGE MBEDTLS_OID_ID_CE "\x0F" /**< id-ce-keyUsage OBJECT IDENTIFIER ::= { id-ce 15 } */ -#define MBEDTLS_OID_CERTIFICATE_POLICIES MBEDTLS_OID_ID_CE "\x20" /**< id-ce-certificatePolicies OBJECT IDENTIFIER ::= { id-ce 32 } */ -#define MBEDTLS_OID_POLICY_MAPPINGS MBEDTLS_OID_ID_CE "\x21" /**< id-ce-policyMappings OBJECT IDENTIFIER ::= { id-ce 33 } */ -#define MBEDTLS_OID_SUBJECT_ALT_NAME MBEDTLS_OID_ID_CE "\x11" /**< id-ce-subjectAltName OBJECT IDENTIFIER ::= { id-ce 17 } */ -#define MBEDTLS_OID_ISSUER_ALT_NAME MBEDTLS_OID_ID_CE "\x12" /**< id-ce-issuerAltName OBJECT IDENTIFIER ::= { id-ce 18 } */ -#define MBEDTLS_OID_SUBJECT_DIRECTORY_ATTRS MBEDTLS_OID_ID_CE "\x09" /**< id-ce-subjectDirectoryAttributes OBJECT IDENTIFIER ::= { id-ce 9 } */ -#define MBEDTLS_OID_BASIC_CONSTRAINTS MBEDTLS_OID_ID_CE "\x13" /**< id-ce-basicConstraints OBJECT IDENTIFIER ::= { id-ce 19 } */ -#define MBEDTLS_OID_NAME_CONSTRAINTS MBEDTLS_OID_ID_CE "\x1E" /**< id-ce-nameConstraints OBJECT IDENTIFIER ::= { id-ce 30 } */ -#define MBEDTLS_OID_POLICY_CONSTRAINTS MBEDTLS_OID_ID_CE "\x24" /**< id-ce-policyConstraints OBJECT IDENTIFIER ::= { id-ce 36 } */ -#define MBEDTLS_OID_EXTENDED_KEY_USAGE MBEDTLS_OID_ID_CE "\x25" /**< id-ce-extKeyUsage OBJECT IDENTIFIER ::= { id-ce 37 } */ -#define MBEDTLS_OID_CRL_DISTRIBUTION_POINTS MBEDTLS_OID_ID_CE "\x1F" /**< id-ce-cRLDistributionPoints OBJECT IDENTIFIER ::= { id-ce 31 } */ -#define MBEDTLS_OID_INIHIBIT_ANYPOLICY MBEDTLS_OID_ID_CE "\x36" /**< id-ce-inhibitAnyPolicy OBJECT IDENTIFIER ::= { id-ce 54 } */ -#define MBEDTLS_OID_FRESHEST_CRL MBEDTLS_OID_ID_CE "\x2E" /**< id-ce-freshestCRL OBJECT IDENTIFIER ::= { id-ce 46 } */ - -/* - * Netscape certificate extensions - */ -#define MBEDTLS_OID_NS_CERT MBEDTLS_OID_NETSCAPE "\x01" -#define MBEDTLS_OID_NS_CERT_TYPE MBEDTLS_OID_NS_CERT "\x01" -#define MBEDTLS_OID_NS_BASE_URL MBEDTLS_OID_NS_CERT "\x02" -#define MBEDTLS_OID_NS_REVOCATION_URL MBEDTLS_OID_NS_CERT "\x03" -#define MBEDTLS_OID_NS_CA_REVOCATION_URL MBEDTLS_OID_NS_CERT "\x04" -#define MBEDTLS_OID_NS_RENEWAL_URL MBEDTLS_OID_NS_CERT "\x07" -#define MBEDTLS_OID_NS_CA_POLICY_URL MBEDTLS_OID_NS_CERT "\x08" -#define MBEDTLS_OID_NS_SSL_SERVER_NAME MBEDTLS_OID_NS_CERT "\x0C" -#define MBEDTLS_OID_NS_COMMENT MBEDTLS_OID_NS_CERT "\x0D" -#define MBEDTLS_OID_NS_DATA_TYPE MBEDTLS_OID_NETSCAPE "\x02" -#define MBEDTLS_OID_NS_CERT_SEQUENCE MBEDTLS_OID_NS_DATA_TYPE "\x05" - -/* - * OIDs for CRL extensions - */ -#define MBEDTLS_OID_PRIVATE_KEY_USAGE_PERIOD MBEDTLS_OID_ID_CE "\x10" -#define MBEDTLS_OID_CRL_NUMBER MBEDTLS_OID_ID_CE "\x14" /**< id-ce-cRLNumber OBJECT IDENTIFIER ::= { id-ce 20 } */ - -/* - * X.509 v3 Extended key usage OIDs - */ -#define MBEDTLS_OID_ANY_EXTENDED_KEY_USAGE MBEDTLS_OID_EXTENDED_KEY_USAGE "\x00" /**< anyExtendedKeyUsage OBJECT IDENTIFIER ::= { id-ce-extKeyUsage 0 } */ - -#define MBEDTLS_OID_KP MBEDTLS_OID_PKIX "\x03" /**< id-kp OBJECT IDENTIFIER ::= { id-pkix 3 } */ -#define MBEDTLS_OID_SERVER_AUTH MBEDTLS_OID_KP "\x01" /**< id-kp-serverAuth OBJECT IDENTIFIER ::= { id-kp 1 } */ -#define MBEDTLS_OID_CLIENT_AUTH MBEDTLS_OID_KP "\x02" /**< id-kp-clientAuth OBJECT IDENTIFIER ::= { id-kp 2 } */ -#define MBEDTLS_OID_CODE_SIGNING MBEDTLS_OID_KP "\x03" /**< id-kp-codeSigning OBJECT IDENTIFIER ::= { id-kp 3 } */ -#define MBEDTLS_OID_EMAIL_PROTECTION MBEDTLS_OID_KP "\x04" /**< id-kp-emailProtection OBJECT IDENTIFIER ::= { id-kp 4 } */ -#define MBEDTLS_OID_TIME_STAMPING MBEDTLS_OID_KP "\x08" /**< id-kp-timeStamping OBJECT IDENTIFIER ::= { id-kp 8 } */ -#define MBEDTLS_OID_OCSP_SIGNING MBEDTLS_OID_KP "\x09" /**< id-kp-OCSPSigning OBJECT IDENTIFIER ::= { id-kp 9 } */ - -/* - * PKCS definition OIDs - */ - -#define MBEDTLS_OID_PKCS MBEDTLS_OID_RSA_COMPANY "\x01" /**< pkcs OBJECT IDENTIFIER ::= { iso(1) member-body(2) us(840) rsadsi(113549) 1 } */ -#define MBEDTLS_OID_PKCS1 MBEDTLS_OID_PKCS "\x01" /**< pkcs-1 OBJECT IDENTIFIER ::= { iso(1) member-body(2) us(840) rsadsi(113549) pkcs(1) 1 } */ -#define MBEDTLS_OID_PKCS5 MBEDTLS_OID_PKCS "\x05" /**< pkcs-5 OBJECT IDENTIFIER ::= { iso(1) member-body(2) us(840) rsadsi(113549) pkcs(1) 5 } */ -#define MBEDTLS_OID_PKCS9 MBEDTLS_OID_PKCS "\x09" /**< pkcs-9 OBJECT IDENTIFIER ::= { iso(1) member-body(2) us(840) rsadsi(113549) pkcs(1) 9 } */ -#define MBEDTLS_OID_PKCS12 MBEDTLS_OID_PKCS "\x0c" /**< pkcs-12 OBJECT IDENTIFIER ::= { iso(1) member-body(2) us(840) rsadsi(113549) pkcs(1) 12 } */ - -/* - * PKCS#1 OIDs - */ -#define MBEDTLS_OID_PKCS1_RSA MBEDTLS_OID_PKCS1 "\x01" /**< rsaEncryption OBJECT IDENTIFIER ::= { pkcs-1 1 } */ -#define MBEDTLS_OID_PKCS1_MD2 MBEDTLS_OID_PKCS1 "\x02" /**< md2WithRSAEncryption ::= { pkcs-1 2 } */ -#define MBEDTLS_OID_PKCS1_MD4 MBEDTLS_OID_PKCS1 "\x03" /**< md4WithRSAEncryption ::= { pkcs-1 3 } */ -#define MBEDTLS_OID_PKCS1_MD5 MBEDTLS_OID_PKCS1 "\x04" /**< md5WithRSAEncryption ::= { pkcs-1 4 } */ -#define MBEDTLS_OID_PKCS1_SHA1 MBEDTLS_OID_PKCS1 "\x05" /**< sha1WithRSAEncryption ::= { pkcs-1 5 } */ -#define MBEDTLS_OID_PKCS1_SHA224 MBEDTLS_OID_PKCS1 "\x0e" /**< sha224WithRSAEncryption ::= { pkcs-1 14 } */ -#define MBEDTLS_OID_PKCS1_SHA256 MBEDTLS_OID_PKCS1 "\x0b" /**< sha256WithRSAEncryption ::= { pkcs-1 11 } */ -#define MBEDTLS_OID_PKCS1_SHA384 MBEDTLS_OID_PKCS1 "\x0c" /**< sha384WithRSAEncryption ::= { pkcs-1 12 } */ -#define MBEDTLS_OID_PKCS1_SHA512 MBEDTLS_OID_PKCS1 "\x0d" /**< sha512WithRSAEncryption ::= { pkcs-1 13 } */ - -#define MBEDTLS_OID_RSA_SHA_OBS "\x2B\x0E\x03\x02\x1D" - -#define MBEDTLS_OID_PKCS9_EMAIL MBEDTLS_OID_PKCS9 "\x01" /**< emailAddress AttributeType ::= { pkcs-9 1 } */ - -/* RFC 4055 */ -#define MBEDTLS_OID_RSASSA_PSS MBEDTLS_OID_PKCS1 "\x0a" /**< id-RSASSA-PSS ::= { pkcs-1 10 } */ -#define MBEDTLS_OID_MGF1 MBEDTLS_OID_PKCS1 "\x08" /**< id-mgf1 ::= { pkcs-1 8 } */ - -/* - * Digest algorithms - */ -#define MBEDTLS_OID_DIGEST_ALG_MD2 MBEDTLS_OID_RSA_COMPANY "\x02\x02" /**< id-mbedtls_md2 OBJECT IDENTIFIER ::= { iso(1) member-body(2) us(840) rsadsi(113549) digestAlgorithm(2) 2 } */ -#define MBEDTLS_OID_DIGEST_ALG_MD4 MBEDTLS_OID_RSA_COMPANY "\x02\x04" /**< id-mbedtls_md4 OBJECT IDENTIFIER ::= { iso(1) member-body(2) us(840) rsadsi(113549) digestAlgorithm(2) 4 } */ -#define MBEDTLS_OID_DIGEST_ALG_MD5 MBEDTLS_OID_RSA_COMPANY "\x02\x05" /**< id-mbedtls_md5 OBJECT IDENTIFIER ::= { iso(1) member-body(2) us(840) rsadsi(113549) digestAlgorithm(2) 5 } */ -#define MBEDTLS_OID_DIGEST_ALG_SHA1 MBEDTLS_OID_ISO_IDENTIFIED_ORG MBEDTLS_OID_OIW_SECSIG_SHA1 /**< id-mbedtls_sha1 OBJECT IDENTIFIER ::= { iso(1) identified-organization(3) oiw(14) secsig(3) algorithms(2) 26 } */ -#define MBEDTLS_OID_DIGEST_ALG_SHA224 MBEDTLS_OID_GOV "\x03\x04\x02\x04" /**< id-sha224 OBJECT IDENTIFIER ::= { joint-iso-itu-t(2) country(16) us(840) organization(1) gov(101) csor(3) nistalgorithm(4) hashalgs(2) 4 } */ -#define MBEDTLS_OID_DIGEST_ALG_SHA256 MBEDTLS_OID_GOV "\x03\x04\x02\x01" /**< id-mbedtls_sha256 OBJECT IDENTIFIER ::= { joint-iso-itu-t(2) country(16) us(840) organization(1) gov(101) csor(3) nistalgorithm(4) hashalgs(2) 1 } */ - -#define MBEDTLS_OID_DIGEST_ALG_SHA384 MBEDTLS_OID_GOV "\x03\x04\x02\x02" /**< id-sha384 OBJECT IDENTIFIER ::= { joint-iso-itu-t(2) country(16) us(840) organization(1) gov(101) csor(3) nistalgorithm(4) hashalgs(2) 2 } */ - -#define MBEDTLS_OID_DIGEST_ALG_SHA512 MBEDTLS_OID_GOV "\x03\x04\x02\x03" /**< id-mbedtls_sha512 OBJECT IDENTIFIER ::= { joint-iso-itu-t(2) country(16) us(840) organization(1) gov(101) csor(3) nistalgorithm(4) hashalgs(2) 3 } */ - -#define MBEDTLS_OID_HMAC_SHA1 MBEDTLS_OID_RSA_COMPANY "\x02\x07" /**< id-hmacWithSHA1 OBJECT IDENTIFIER ::= { iso(1) member-body(2) us(840) rsadsi(113549) digestAlgorithm(2) 7 } */ - -/* - * Encryption algorithms - */ -#define MBEDTLS_OID_DES_CBC MBEDTLS_OID_ISO_IDENTIFIED_ORG MBEDTLS_OID_OIW_SECSIG_ALG "\x07" /**< desCBC OBJECT IDENTIFIER ::= { iso(1) identified-organization(3) oiw(14) secsig(3) algorithms(2) 7 } */ -#define MBEDTLS_OID_DES_EDE3_CBC MBEDTLS_OID_RSA_COMPANY "\x03\x07" /**< des-ede3-cbc OBJECT IDENTIFIER ::= { iso(1) member-body(2) -- us(840) rsadsi(113549) encryptionAlgorithm(3) 7 } */ - -/* - * PKCS#5 OIDs - */ -#define MBEDTLS_OID_PKCS5_PBKDF2 MBEDTLS_OID_PKCS5 "\x0c" /**< id-PBKDF2 OBJECT IDENTIFIER ::= {pkcs-5 12} */ -#define MBEDTLS_OID_PKCS5_PBES2 MBEDTLS_OID_PKCS5 "\x0d" /**< id-PBES2 OBJECT IDENTIFIER ::= {pkcs-5 13} */ -#define MBEDTLS_OID_PKCS5_PBMAC1 MBEDTLS_OID_PKCS5 "\x0e" /**< id-PBMAC1 OBJECT IDENTIFIER ::= {pkcs-5 14} */ - -/* - * PKCS#5 PBES1 algorithms - */ -#define MBEDTLS_OID_PKCS5_PBE_MD2_DES_CBC MBEDTLS_OID_PKCS5 "\x01" /**< pbeWithMD2AndDES-CBC OBJECT IDENTIFIER ::= {pkcs-5 1} */ -#define MBEDTLS_OID_PKCS5_PBE_MD2_RC2_CBC MBEDTLS_OID_PKCS5 "\x04" /**< pbeWithMD2AndRC2-CBC OBJECT IDENTIFIER ::= {pkcs-5 4} */ -#define MBEDTLS_OID_PKCS5_PBE_MD5_DES_CBC MBEDTLS_OID_PKCS5 "\x03" /**< pbeWithMD5AndDES-CBC OBJECT IDENTIFIER ::= {pkcs-5 3} */ -#define MBEDTLS_OID_PKCS5_PBE_MD5_RC2_CBC MBEDTLS_OID_PKCS5 "\x06" /**< pbeWithMD5AndRC2-CBC OBJECT IDENTIFIER ::= {pkcs-5 6} */ -#define MBEDTLS_OID_PKCS5_PBE_SHA1_DES_CBC MBEDTLS_OID_PKCS5 "\x0a" /**< pbeWithSHA1AndDES-CBC OBJECT IDENTIFIER ::= {pkcs-5 10} */ -#define MBEDTLS_OID_PKCS5_PBE_SHA1_RC2_CBC MBEDTLS_OID_PKCS5 "\x0b" /**< pbeWithSHA1AndRC2-CBC OBJECT IDENTIFIER ::= {pkcs-5 11} */ - -/* - * PKCS#8 OIDs - */ -#define MBEDTLS_OID_PKCS9_CSR_EXT_REQ MBEDTLS_OID_PKCS9 "\x0e" /**< extensionRequest OBJECT IDENTIFIER ::= {pkcs-9 14} */ - -/* - * PKCS#12 PBE OIDs - */ -#define MBEDTLS_OID_PKCS12_PBE MBEDTLS_OID_PKCS12 "\x01" /**< pkcs-12PbeIds OBJECT IDENTIFIER ::= {pkcs-12 1} */ - -#define MBEDTLS_OID_PKCS12_PBE_SHA1_RC4_128 MBEDTLS_OID_PKCS12_PBE "\x01" /**< pbeWithSHAAnd128BitRC4 OBJECT IDENTIFIER ::= {pkcs-12PbeIds 1} */ -#define MBEDTLS_OID_PKCS12_PBE_SHA1_RC4_40 MBEDTLS_OID_PKCS12_PBE "\x02" /**< pbeWithSHAAnd40BitRC4 OBJECT IDENTIFIER ::= {pkcs-12PbeIds 2} */ -#define MBEDTLS_OID_PKCS12_PBE_SHA1_DES3_EDE_CBC MBEDTLS_OID_PKCS12_PBE "\x03" /**< pbeWithSHAAnd3-KeyTripleDES-CBC OBJECT IDENTIFIER ::= {pkcs-12PbeIds 3} */ -#define MBEDTLS_OID_PKCS12_PBE_SHA1_DES2_EDE_CBC MBEDTLS_OID_PKCS12_PBE "\x04" /**< pbeWithSHAAnd2-KeyTripleDES-CBC OBJECT IDENTIFIER ::= {pkcs-12PbeIds 4} */ -#define MBEDTLS_OID_PKCS12_PBE_SHA1_RC2_128_CBC MBEDTLS_OID_PKCS12_PBE "\x05" /**< pbeWithSHAAnd128BitRC2-CBC OBJECT IDENTIFIER ::= {pkcs-12PbeIds 5} */ -#define MBEDTLS_OID_PKCS12_PBE_SHA1_RC2_40_CBC MBEDTLS_OID_PKCS12_PBE "\x06" /**< pbeWithSHAAnd40BitRC2-CBC OBJECT IDENTIFIER ::= {pkcs-12PbeIds 6} */ - -/* - * EC key algorithms from RFC 5480 - */ - -/* id-ecPublicKey OBJECT IDENTIFIER ::= { - * iso(1) member-body(2) us(840) ansi-X9-62(10045) keyType(2) 1 } */ -#define MBEDTLS_OID_EC_ALG_UNRESTRICTED MBEDTLS_OID_ANSI_X9_62 "\x02\01" - -/* id-ecDH OBJECT IDENTIFIER ::= { - * iso(1) identified-organization(3) certicom(132) - * schemes(1) ecdh(12) } */ -#define MBEDTLS_OID_EC_ALG_ECDH MBEDTLS_OID_CERTICOM "\x01\x0c" - -/* - * ECParameters namedCurve identifiers, from RFC 5480, RFC 5639, and SEC2 - */ - -/* secp192r1 OBJECT IDENTIFIER ::= { - * iso(1) member-body(2) us(840) ansi-X9-62(10045) curves(3) prime(1) 1 } */ -#define MBEDTLS_OID_EC_GRP_SECP192R1 MBEDTLS_OID_ANSI_X9_62 "\x03\x01\x01" - -/* secp224r1 OBJECT IDENTIFIER ::= { - * iso(1) identified-organization(3) certicom(132) curve(0) 33 } */ -#define MBEDTLS_OID_EC_GRP_SECP224R1 MBEDTLS_OID_CERTICOM "\x00\x21" - -/* secp256r1 OBJECT IDENTIFIER ::= { - * iso(1) member-body(2) us(840) ansi-X9-62(10045) curves(3) prime(1) 7 } */ -#define MBEDTLS_OID_EC_GRP_SECP256R1 MBEDTLS_OID_ANSI_X9_62 "\x03\x01\x07" - -/* secp384r1 OBJECT IDENTIFIER ::= { - * iso(1) identified-organization(3) certicom(132) curve(0) 34 } */ -#define MBEDTLS_OID_EC_GRP_SECP384R1 MBEDTLS_OID_CERTICOM "\x00\x22" - -/* secp521r1 OBJECT IDENTIFIER ::= { - * iso(1) identified-organization(3) certicom(132) curve(0) 35 } */ -#define MBEDTLS_OID_EC_GRP_SECP521R1 MBEDTLS_OID_CERTICOM "\x00\x23" - -/* secp192k1 OBJECT IDENTIFIER ::= { - * iso(1) identified-organization(3) certicom(132) curve(0) 31 } */ -#define MBEDTLS_OID_EC_GRP_SECP192K1 MBEDTLS_OID_CERTICOM "\x00\x1f" - -/* secp224k1 OBJECT IDENTIFIER ::= { - * iso(1) identified-organization(3) certicom(132) curve(0) 32 } */ -#define MBEDTLS_OID_EC_GRP_SECP224K1 MBEDTLS_OID_CERTICOM "\x00\x20" - -/* secp256k1 OBJECT IDENTIFIER ::= { - * iso(1) identified-organization(3) certicom(132) curve(0) 10 } */ -#define MBEDTLS_OID_EC_GRP_SECP256K1 MBEDTLS_OID_CERTICOM "\x00\x0a" - -/* RFC 5639 4.1 - * ecStdCurvesAndGeneration OBJECT IDENTIFIER::= {iso(1) - * identified-organization(3) teletrust(36) algorithm(3) signature- - * algorithm(3) ecSign(2) 8} - * ellipticCurve OBJECT IDENTIFIER ::= {ecStdCurvesAndGeneration 1} - * versionOne OBJECT IDENTIFIER ::= {ellipticCurve 1} */ -#define MBEDTLS_OID_EC_BRAINPOOL_V1 MBEDTLS_OID_TELETRUST "\x03\x03\x02\x08\x01\x01" - -/* brainpoolP256r1 OBJECT IDENTIFIER ::= {versionOne 7} */ -#define MBEDTLS_OID_EC_GRP_BP256R1 MBEDTLS_OID_EC_BRAINPOOL_V1 "\x07" - -/* brainpoolP384r1 OBJECT IDENTIFIER ::= {versionOne 11} */ -#define MBEDTLS_OID_EC_GRP_BP384R1 MBEDTLS_OID_EC_BRAINPOOL_V1 "\x0B" - -/* brainpoolP512r1 OBJECT IDENTIFIER ::= {versionOne 13} */ -#define MBEDTLS_OID_EC_GRP_BP512R1 MBEDTLS_OID_EC_BRAINPOOL_V1 "\x0D" - -/* - * SEC1 C.1 - * - * prime-field OBJECT IDENTIFIER ::= { id-fieldType 1 } - * id-fieldType OBJECT IDENTIFIER ::= { ansi-X9-62 fieldType(1)} - */ -#define MBEDTLS_OID_ANSI_X9_62_FIELD_TYPE MBEDTLS_OID_ANSI_X9_62 "\x01" -#define MBEDTLS_OID_ANSI_X9_62_PRIME_FIELD MBEDTLS_OID_ANSI_X9_62_FIELD_TYPE "\x01" - -/* - * ECDSA signature identifiers, from RFC 5480 - */ -#define MBEDTLS_OID_ANSI_X9_62_SIG MBEDTLS_OID_ANSI_X9_62 "\x04" /* signatures(4) */ -#define MBEDTLS_OID_ANSI_X9_62_SIG_SHA2 MBEDTLS_OID_ANSI_X9_62_SIG "\x03" /* ecdsa-with-SHA2(3) */ - -/* ecdsa-with-SHA1 OBJECT IDENTIFIER ::= { - * iso(1) member-body(2) us(840) ansi-X9-62(10045) signatures(4) 1 } */ -#define MBEDTLS_OID_ECDSA_SHA1 MBEDTLS_OID_ANSI_X9_62_SIG "\x01" - -/* ecdsa-with-SHA224 OBJECT IDENTIFIER ::= { - * iso(1) member-body(2) us(840) ansi-X9-62(10045) signatures(4) - * ecdsa-with-SHA2(3) 1 } */ -#define MBEDTLS_OID_ECDSA_SHA224 MBEDTLS_OID_ANSI_X9_62_SIG_SHA2 "\x01" - -/* ecdsa-with-SHA256 OBJECT IDENTIFIER ::= { - * iso(1) member-body(2) us(840) ansi-X9-62(10045) signatures(4) - * ecdsa-with-SHA2(3) 2 } */ -#define MBEDTLS_OID_ECDSA_SHA256 MBEDTLS_OID_ANSI_X9_62_SIG_SHA2 "\x02" - -/* ecdsa-with-SHA384 OBJECT IDENTIFIER ::= { - * iso(1) member-body(2) us(840) ansi-X9-62(10045) signatures(4) - * ecdsa-with-SHA2(3) 3 } */ -#define MBEDTLS_OID_ECDSA_SHA384 MBEDTLS_OID_ANSI_X9_62_SIG_SHA2 "\x03" - -/* ecdsa-with-SHA512 OBJECT IDENTIFIER ::= { - * iso(1) member-body(2) us(840) ansi-X9-62(10045) signatures(4) - * ecdsa-with-SHA2(3) 4 } */ -#define MBEDTLS_OID_ECDSA_SHA512 MBEDTLS_OID_ANSI_X9_62_SIG_SHA2 "\x04" - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * \brief Base OID descriptor structure - */ -typedef struct { - const char *asn1; /*!< OID ASN.1 representation */ - size_t asn1_len; /*!< length of asn1 */ - const char *name; /*!< official name (e.g. from RFC) */ - const char *description; /*!< human friendly description */ -} mbedtls_oid_descriptor_t; - -/** - * \brief Translate an ASN.1 OID into its numeric representation - * (e.g. "\x2A\x86\x48\x86\xF7\x0D" into "1.2.840.113549") - * - * \param buf buffer to put representation in - * \param size size of the buffer - * \param oid OID to translate - * - * \return Length of the string written (excluding final NULL) or - * MBEDTLS_ERR_OID_BUF_TOO_SMALL in case of error - */ -int mbedtls_oid_get_numeric_string( char *buf, size_t size, const mbedtls_asn1_buf *oid ); - -#if defined(MBEDTLS_X509_USE_C) || defined(MBEDTLS_X509_CREATE_C) -/** - * \brief Translate an X.509 extension OID into local values - * - * \param oid OID to use - * \param ext_type place to store the extension type - * - * \return 0 if successful, or MBEDTLS_ERR_OID_NOT_FOUND - */ -int mbedtls_oid_get_x509_ext_type( const mbedtls_asn1_buf *oid, int *ext_type ); -#endif - -/** - * \brief Translate an X.509 attribute type OID into the short name - * (e.g. the OID for an X520 Common Name into "CN") - * - * \param oid OID to use - * \param short_name place to store the string pointer - * - * \return 0 if successful, or MBEDTLS_ERR_OID_NOT_FOUND - */ -int mbedtls_oid_get_attr_short_name( const mbedtls_asn1_buf *oid, const char **short_name ); - -/** - * \brief Translate PublicKeyAlgorithm OID into pk_type - * - * \param oid OID to use - * \param pk_alg place to store public key algorithm - * - * \return 0 if successful, or MBEDTLS_ERR_OID_NOT_FOUND - */ -int mbedtls_oid_get_pk_alg( const mbedtls_asn1_buf *oid, mbedtls_pk_type_t *pk_alg ); - -/** - * \brief Translate pk_type into PublicKeyAlgorithm OID - * - * \param pk_alg Public key type to look for - * \param oid place to store ASN.1 OID string pointer - * \param olen length of the OID - * - * \return 0 if successful, or MBEDTLS_ERR_OID_NOT_FOUND - */ -int mbedtls_oid_get_oid_by_pk_alg( mbedtls_pk_type_t pk_alg, - const char **oid, size_t *olen ); - -#if defined(MBEDTLS_ECP_C) -/** - * \brief Translate NamedCurve OID into an EC group identifier - * - * \param oid OID to use - * \param grp_id place to store group id - * - * \return 0 if successful, or MBEDTLS_ERR_OID_NOT_FOUND - */ -int mbedtls_oid_get_ec_grp( const mbedtls_asn1_buf *oid, mbedtls_ecp_group_id *grp_id ); - -/** - * \brief Translate EC group identifier into NamedCurve OID - * - * \param grp_id EC group identifier - * \param oid place to store ASN.1 OID string pointer - * \param olen length of the OID - * - * \return 0 if successful, or MBEDTLS_ERR_OID_NOT_FOUND - */ -int mbedtls_oid_get_oid_by_ec_grp( mbedtls_ecp_group_id grp_id, - const char **oid, size_t *olen ); -#endif /* MBEDTLS_ECP_C */ - -#if defined(MBEDTLS_MD_C) -/** - * \brief Translate SignatureAlgorithm OID into md_type and pk_type - * - * \param oid OID to use - * \param md_alg place to store message digest algorithm - * \param pk_alg place to store public key algorithm - * - * \return 0 if successful, or MBEDTLS_ERR_OID_NOT_FOUND - */ -int mbedtls_oid_get_sig_alg( const mbedtls_asn1_buf *oid, - mbedtls_md_type_t *md_alg, mbedtls_pk_type_t *pk_alg ); - -/** - * \brief Translate SignatureAlgorithm OID into description - * - * \param oid OID to use - * \param desc place to store string pointer - * - * \return 0 if successful, or MBEDTLS_ERR_OID_NOT_FOUND - */ -int mbedtls_oid_get_sig_alg_desc( const mbedtls_asn1_buf *oid, const char **desc ); - -/** - * \brief Translate md_type and pk_type into SignatureAlgorithm OID - * - * \param md_alg message digest algorithm - * \param pk_alg public key algorithm - * \param oid place to store ASN.1 OID string pointer - * \param olen length of the OID - * - * \return 0 if successful, or MBEDTLS_ERR_OID_NOT_FOUND - */ -int mbedtls_oid_get_oid_by_sig_alg( mbedtls_pk_type_t pk_alg, mbedtls_md_type_t md_alg, - const char **oid, size_t *olen ); - -/** - * \brief Translate hash algorithm OID into md_type - * - * \param oid OID to use - * \param md_alg place to store message digest algorithm - * - * \return 0 if successful, or MBEDTLS_ERR_OID_NOT_FOUND - */ -int mbedtls_oid_get_md_alg( const mbedtls_asn1_buf *oid, mbedtls_md_type_t *md_alg ); -#endif /* MBEDTLS_MD_C */ - -/** - * \brief Translate Extended Key Usage OID into description - * - * \param oid OID to use - * \param desc place to store string pointer - * - * \return 0 if successful, or MBEDTLS_ERR_OID_NOT_FOUND - */ -int mbedtls_oid_get_extended_key_usage( const mbedtls_asn1_buf *oid, const char **desc ); - -/** - * \brief Translate md_type into hash algorithm OID - * - * \param md_alg message digest algorithm - * \param oid place to store ASN.1 OID string pointer - * \param olen length of the OID - * - * \return 0 if successful, or MBEDTLS_ERR_OID_NOT_FOUND - */ -int mbedtls_oid_get_oid_by_md( mbedtls_md_type_t md_alg, const char **oid, size_t *olen ); - -#if defined(MBEDTLS_CIPHER_C) -/** - * \brief Translate encryption algorithm OID into cipher_type - * - * \param oid OID to use - * \param cipher_alg place to store cipher algorithm - * - * \return 0 if successful, or MBEDTLS_ERR_OID_NOT_FOUND - */ -int mbedtls_oid_get_cipher_alg( const mbedtls_asn1_buf *oid, mbedtls_cipher_type_t *cipher_alg ); -#endif /* MBEDTLS_CIPHER_C */ - -#if defined(MBEDTLS_PKCS12_C) -/** - * \brief Translate PKCS#12 PBE algorithm OID into md_type and - * cipher_type - * - * \param oid OID to use - * \param md_alg place to store message digest algorithm - * \param cipher_alg place to store cipher algorithm - * - * \return 0 if successful, or MBEDTLS_ERR_OID_NOT_FOUND - */ -int mbedtls_oid_get_pkcs12_pbe_alg( const mbedtls_asn1_buf *oid, mbedtls_md_type_t *md_alg, - mbedtls_cipher_type_t *cipher_alg ); -#endif /* MBEDTLS_PKCS12_C */ - -#ifdef __cplusplus -} -#endif - -#endif /* oid.h */ diff --git a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/padlock.h b/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/padlock.h deleted file mode 100644 index 2045a5ab..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/padlock.h +++ /dev/null @@ -1,107 +0,0 @@ -/** - * \file padlock.h - * - * \brief VIA PadLock ACE for HW encryption/decryption supported by some - * processors - * - * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * This file is part of mbed TLS (https://tls.mbed.org) - */ -#ifndef MBEDTLS_PADLOCK_H -#define MBEDTLS_PADLOCK_H - -#include "aes.h" - -#define MBEDTLS_ERR_PADLOCK_DATA_MISALIGNED -0x0030 /**< Input data should be aligned. */ - -#if defined(__has_feature) -#if __has_feature(address_sanitizer) -#define MBEDTLS_HAVE_ASAN -#endif -#endif - -/* Some versions of ASan result in errors about not enough registers */ -#if defined(MBEDTLS_HAVE_ASM) && defined(__GNUC__) && defined(__i386__) && \ - !defined(MBEDTLS_HAVE_ASAN) - -#ifndef MBEDTLS_HAVE_X86 -#define MBEDTLS_HAVE_X86 -#endif - -#include - -#define MBEDTLS_PADLOCK_RNG 0x000C -#define MBEDTLS_PADLOCK_ACE 0x00C0 -#define MBEDTLS_PADLOCK_PHE 0x0C00 -#define MBEDTLS_PADLOCK_PMM 0x3000 - -#define MBEDTLS_PADLOCK_ALIGN16(x) (uint32_t *) (16 + ((int32_t) x & ~15)) - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * \brief PadLock detection routine - * - * \param feature The feature to detect - * - * \return 1 if CPU has support for the feature, 0 otherwise - */ -int mbedtls_padlock_has_support( int feature ); - -/** - * \brief PadLock AES-ECB block en(de)cryption - * - * \param ctx AES context - * \param mode MBEDTLS_AES_ENCRYPT or MBEDTLS_AES_DECRYPT - * \param input 16-byte input block - * \param output 16-byte output block - * - * \return 0 if success, 1 if operation failed - */ -int mbedtls_padlock_xcryptecb( mbedtls_aes_context *ctx, - int mode, - const unsigned char input[16], - unsigned char output[16] ); - -/** - * \brief PadLock AES-CBC buffer en(de)cryption - * - * \param ctx AES context - * \param mode MBEDTLS_AES_ENCRYPT or MBEDTLS_AES_DECRYPT - * \param length length of the input data - * \param iv initialization vector (updated after use) - * \param input buffer holding the input data - * \param output buffer holding the output data - * - * \return 0 if success, 1 if operation failed - */ -int mbedtls_padlock_xcryptcbc( mbedtls_aes_context *ctx, - int mode, - size_t length, - unsigned char iv[16], - const unsigned char *input, - unsigned char *output ); - -#ifdef __cplusplus -} -#endif - -#endif /* HAVE_X86 */ - -#endif /* padlock.h */ diff --git a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/pem.h b/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/pem.h deleted file mode 100644 index 54dc02d7..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/pem.h +++ /dev/null @@ -1,129 +0,0 @@ -/** - * \file pem.h - * - * \brief Privacy Enhanced Mail (PEM) decoding - * - * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * This file is part of mbed TLS (https://tls.mbed.org) - */ -#ifndef MBEDTLS_PEM_H -#define MBEDTLS_PEM_H - -#include - -/** - * \name PEM Error codes - * These error codes are returned in case of errors reading the - * PEM data. - * \{ - */ -#define MBEDTLS_ERR_PEM_NO_HEADER_FOOTER_PRESENT -0x1080 /**< No PEM header or footer found. */ -#define MBEDTLS_ERR_PEM_INVALID_DATA -0x1100 /**< PEM string is not as expected. */ -#define MBEDTLS_ERR_PEM_ALLOC_FAILED -0x1180 /**< Failed to allocate memory. */ -#define MBEDTLS_ERR_PEM_INVALID_ENC_IV -0x1200 /**< RSA IV is not in hex-format. */ -#define MBEDTLS_ERR_PEM_UNKNOWN_ENC_ALG -0x1280 /**< Unsupported key encryption algorithm. */ -#define MBEDTLS_ERR_PEM_PASSWORD_REQUIRED -0x1300 /**< Private key password can't be empty. */ -#define MBEDTLS_ERR_PEM_PASSWORD_MISMATCH -0x1380 /**< Given private key password does not allow for correct decryption. */ -#define MBEDTLS_ERR_PEM_FEATURE_UNAVAILABLE -0x1400 /**< Unavailable feature, e.g. hashing/encryption combination. */ -#define MBEDTLS_ERR_PEM_BAD_INPUT_DATA -0x1480 /**< Bad input parameters to function. */ -/* \} name */ - -#ifdef __cplusplus -extern "C" { -#endif - -#if defined(MBEDTLS_PEM_PARSE_C) -/** - * \brief PEM context structure - */ -typedef struct -{ - unsigned char *buf; /*!< buffer for decoded data */ - size_t buflen; /*!< length of the buffer */ - unsigned char *info; /*!< buffer for extra header information */ -} -mbedtls_pem_context; - -/** - * \brief PEM context setup - * - * \param ctx context to be initialized - */ -void mbedtls_pem_init( mbedtls_pem_context *ctx ); - -/** - * \brief Read a buffer for PEM information and store the resulting - * data into the specified context buffers. - * - * \param ctx context to use - * \param header header string to seek and expect - * \param footer footer string to seek and expect - * \param data source data to look in (must be nul-terminated) - * \param pwd password for decryption (can be NULL) - * \param pwdlen length of password - * \param use_len destination for total length used (set after header is - * correctly read, so unless you get - * MBEDTLS_ERR_PEM_BAD_INPUT_DATA or - * MBEDTLS_ERR_PEM_NO_HEADER_FOOTER_PRESENT, use_len is - * the length to skip) - * - * \note Attempts to check password correctness by verifying if - * the decrypted text starts with an ASN.1 sequence of - * appropriate length - * - * \return 0 on success, or a specific PEM error code - */ -int mbedtls_pem_read_buffer( mbedtls_pem_context *ctx, const char *header, const char *footer, - const unsigned char *data, - const unsigned char *pwd, - size_t pwdlen, size_t *use_len ); - -/** - * \brief PEM context memory freeing - * - * \param ctx context to be freed - */ -void mbedtls_pem_free( mbedtls_pem_context *ctx ); -#endif /* MBEDTLS_PEM_PARSE_C */ - -#if defined(MBEDTLS_PEM_WRITE_C) -/** - * \brief Write a buffer of PEM information from a DER encoded - * buffer. - * - * \param header header string to write - * \param footer footer string to write - * \param der_data DER data to write - * \param der_len length of the DER data - * \param buf buffer to write to - * \param buf_len length of output buffer - * \param olen total length written / required (if buf_len is not enough) - * - * \return 0 on success, or a specific PEM or BASE64 error code. On - * MBEDTLS_ERR_BASE64_BUFFER_TOO_SMALL olen is the required - * size. - */ -int mbedtls_pem_write_buffer( const char *header, const char *footer, - const unsigned char *der_data, size_t der_len, - unsigned char *buf, size_t buf_len, size_t *olen ); -#endif /* MBEDTLS_PEM_WRITE_C */ - -#ifdef __cplusplus -} -#endif - -#endif /* pem.h */ diff --git a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/pk.h b/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/pk.h deleted file mode 100644 index e5e78fba..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/pk.h +++ /dev/null @@ -1,615 +0,0 @@ -/** - * \file pk.h - * - * \brief Public Key abstraction layer - * - * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * This file is part of mbed TLS (https://tls.mbed.org) - */ - -#ifndef MBEDTLS_PK_H -#define MBEDTLS_PK_H - -#if !defined(MBEDTLS_CONFIG_FILE) -#include "config.h" -#else -#include MBEDTLS_CONFIG_FILE -#endif - -#include "md.h" - -#if defined(MBEDTLS_RSA_C) -#include "rsa.h" -#endif - -#if defined(MBEDTLS_ECP_C) -#include "ecp.h" -#endif - -#if defined(MBEDTLS_ECDSA_C) -#include "ecdsa.h" -#endif - -#if ( defined(__ARMCC_VERSION) || defined(_MSC_VER) ) && \ - !defined(inline) && !defined(__cplusplus) -#define inline __inline -#endif - -#define MBEDTLS_ERR_PK_ALLOC_FAILED -0x3F80 /**< Memory allocation failed. */ -#define MBEDTLS_ERR_PK_TYPE_MISMATCH -0x3F00 /**< Type mismatch, eg attempt to encrypt with an ECDSA key */ -#define MBEDTLS_ERR_PK_BAD_INPUT_DATA -0x3E80 /**< Bad input parameters to function. */ -#define MBEDTLS_ERR_PK_FILE_IO_ERROR -0x3E00 /**< Read/write of file failed. */ -#define MBEDTLS_ERR_PK_KEY_INVALID_VERSION -0x3D80 /**< Unsupported key version */ -#define MBEDTLS_ERR_PK_KEY_INVALID_FORMAT -0x3D00 /**< Invalid key tag or value. */ -#define MBEDTLS_ERR_PK_UNKNOWN_PK_ALG -0x3C80 /**< Key algorithm is unsupported (only RSA and EC are supported). */ -#define MBEDTLS_ERR_PK_PASSWORD_REQUIRED -0x3C00 /**< Private key password can't be empty. */ -#define MBEDTLS_ERR_PK_PASSWORD_MISMATCH -0x3B80 /**< Given private key password does not allow for correct decryption. */ -#define MBEDTLS_ERR_PK_INVALID_PUBKEY -0x3B00 /**< The pubkey tag or value is invalid (only RSA and EC are supported). */ -#define MBEDTLS_ERR_PK_INVALID_ALG -0x3A80 /**< The algorithm tag or value is invalid. */ -#define MBEDTLS_ERR_PK_UNKNOWN_NAMED_CURVE -0x3A00 /**< Elliptic curve is unsupported (only NIST curves are supported). */ -#define MBEDTLS_ERR_PK_FEATURE_UNAVAILABLE -0x3980 /**< Unavailable feature, e.g. RSA disabled for RSA key. */ -#define MBEDTLS_ERR_PK_SIG_LEN_MISMATCH -0x3900 /**< The signature is valid but its length is less than expected. */ - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * \brief Public key types - */ -typedef enum { - MBEDTLS_PK_NONE=0, - MBEDTLS_PK_RSA, - MBEDTLS_PK_ECKEY, - MBEDTLS_PK_ECKEY_DH, - MBEDTLS_PK_ECDSA, - MBEDTLS_PK_RSA_ALT, - MBEDTLS_PK_RSASSA_PSS, -} mbedtls_pk_type_t; - -/** - * \brief Options for RSASSA-PSS signature verification. - * See \c mbedtls_rsa_rsassa_pss_verify_ext() - */ -typedef struct -{ - mbedtls_md_type_t mgf1_hash_id; - int expected_salt_len; - -} mbedtls_pk_rsassa_pss_options; - -/** - * \brief Types for interfacing with the debug module - */ -typedef enum -{ - MBEDTLS_PK_DEBUG_NONE = 0, - MBEDTLS_PK_DEBUG_MPI, - MBEDTLS_PK_DEBUG_ECP, -} mbedtls_pk_debug_type; - -/** - * \brief Item to send to the debug module - */ -typedef struct -{ - mbedtls_pk_debug_type type; - const char *name; - void *value; -} mbedtls_pk_debug_item; - -/** Maximum number of item send for debugging, plus 1 */ -#define MBEDTLS_PK_DEBUG_MAX_ITEMS 3 - -/** - * \brief Public key information and operations - */ -typedef struct mbedtls_pk_info_t mbedtls_pk_info_t; - -/** - * \brief Public key container - */ -typedef struct -{ - const mbedtls_pk_info_t * pk_info; /**< Public key informations */ - void * pk_ctx; /**< Underlying public key context */ -} mbedtls_pk_context; - -#if defined(MBEDTLS_RSA_C) -/** - * Quick access to an RSA context inside a PK context. - * - * \warning You must make sure the PK context actually holds an RSA context - * before using this function! - */ -static inline mbedtls_rsa_context *mbedtls_pk_rsa( const mbedtls_pk_context pk ) -{ - return( (mbedtls_rsa_context *) (pk).pk_ctx ); -} -#endif /* MBEDTLS_RSA_C */ - -#if defined(MBEDTLS_ECP_C) -/** - * Quick access to an EC context inside a PK context. - * - * \warning You must make sure the PK context actually holds an EC context - * before using this function! - */ -static inline mbedtls_ecp_keypair *mbedtls_pk_ec( const mbedtls_pk_context pk ) -{ - return( (mbedtls_ecp_keypair *) (pk).pk_ctx ); -} -#endif /* MBEDTLS_ECP_C */ - -#if defined(MBEDTLS_PK_RSA_ALT_SUPPORT) -/** - * \brief Types for RSA-alt abstraction - */ -typedef int (*mbedtls_pk_rsa_alt_decrypt_func)( void *ctx, int mode, size_t *olen, - const unsigned char *input, unsigned char *output, - size_t output_max_len ); -typedef int (*mbedtls_pk_rsa_alt_sign_func)( void *ctx, - int (*f_rng)(void *, unsigned char *, size_t), void *p_rng, - int mode, mbedtls_md_type_t md_alg, unsigned int hashlen, - const unsigned char *hash, unsigned char *sig ); -typedef size_t (*mbedtls_pk_rsa_alt_key_len_func)( void *ctx ); -#endif /* MBEDTLS_PK_RSA_ALT_SUPPORT */ - -/** - * \brief Return information associated with the given PK type - * - * \param pk_type PK type to search for. - * - * \return The PK info associated with the type or NULL if not found. - */ -const mbedtls_pk_info_t *mbedtls_pk_info_from_type( mbedtls_pk_type_t pk_type ); - -/** - * \brief Initialize a mbedtls_pk_context (as NONE) - */ -void mbedtls_pk_init( mbedtls_pk_context *ctx ); - -/** - * \brief Free a mbedtls_pk_context - */ -void mbedtls_pk_free( mbedtls_pk_context *ctx ); - -/** - * \brief Initialize a PK context with the information given - * and allocates the type-specific PK subcontext. - * - * \param ctx Context to initialize. Must be empty (type NONE). - * \param info Information to use - * - * \return 0 on success, - * MBEDTLS_ERR_PK_BAD_INPUT_DATA on invalid input, - * MBEDTLS_ERR_PK_ALLOC_FAILED on allocation failure. - * - * \note For contexts holding an RSA-alt key, use - * \c mbedtls_pk_setup_rsa_alt() instead. - */ -int mbedtls_pk_setup( mbedtls_pk_context *ctx, const mbedtls_pk_info_t *info ); - -#if defined(MBEDTLS_PK_RSA_ALT_SUPPORT) -/** - * \brief Initialize an RSA-alt context - * - * \param ctx Context to initialize. Must be empty (type NONE). - * \param key RSA key pointer - * \param decrypt_func Decryption function - * \param sign_func Signing function - * \param key_len_func Function returning key length in bytes - * - * \return 0 on success, or MBEDTLS_ERR_PK_BAD_INPUT_DATA if the - * context wasn't already initialized as RSA_ALT. - * - * \note This function replaces \c mbedtls_pk_setup() for RSA-alt. - */ -int mbedtls_pk_setup_rsa_alt( mbedtls_pk_context *ctx, void * key, - mbedtls_pk_rsa_alt_decrypt_func decrypt_func, - mbedtls_pk_rsa_alt_sign_func sign_func, - mbedtls_pk_rsa_alt_key_len_func key_len_func ); -#endif /* MBEDTLS_PK_RSA_ALT_SUPPORT */ - -/** - * \brief Get the size in bits of the underlying key - * - * \param ctx Context to use - * - * \return Key size in bits, or 0 on error - */ -size_t mbedtls_pk_get_bitlen( const mbedtls_pk_context *ctx ); - -/** - * \brief Get the length in bytes of the underlying key - * \param ctx Context to use - * - * \return Key length in bytes, or 0 on error - */ -static inline size_t mbedtls_pk_get_len( const mbedtls_pk_context *ctx ) -{ - return( ( mbedtls_pk_get_bitlen( ctx ) + 7 ) / 8 ); -} - -/** - * \brief Tell if a context can do the operation given by type - * - * \param ctx Context to test - * \param type Target type - * - * \return 0 if context can't do the operations, - * 1 otherwise. - */ -int mbedtls_pk_can_do( const mbedtls_pk_context *ctx, mbedtls_pk_type_t type ); - -/** - * \brief Verify signature (including padding if relevant). - * - * \param ctx PK context to use - * \param md_alg Hash algorithm used (see notes) - * \param hash Hash of the message to sign - * \param hash_len Hash length or 0 (see notes) - * \param sig Signature to verify - * \param sig_len Signature length - * - * \return 0 on success (signature is valid), - * MBEDTLS_ERR_PK_SIG_LEN_MISMATCH if the signature is - * valid but its actual length is less than sig_len, - * or a specific error code. - * - * \note For RSA keys, the default padding type is PKCS#1 v1.5. - * Use \c mbedtls_pk_verify_ext( MBEDTLS_PK_RSASSA_PSS, ... ) - * to verify RSASSA_PSS signatures. - * - * \note If hash_len is 0, then the length associated with md_alg - * is used instead, or an error returned if it is invalid. - * - * \note md_alg may be MBEDTLS_MD_NONE, only if hash_len != 0 - */ -int mbedtls_pk_verify( mbedtls_pk_context *ctx, mbedtls_md_type_t md_alg, - const unsigned char *hash, size_t hash_len, - const unsigned char *sig, size_t sig_len ); - -/** - * \brief Verify signature, with options. - * (Includes verification of the padding depending on type.) - * - * \param type Signature type (inc. possible padding type) to verify - * \param options Pointer to type-specific options, or NULL - * \param ctx PK context to use - * \param md_alg Hash algorithm used (see notes) - * \param hash Hash of the message to sign - * \param hash_len Hash length or 0 (see notes) - * \param sig Signature to verify - * \param sig_len Signature length - * - * \return 0 on success (signature is valid), - * MBEDTLS_ERR_PK_TYPE_MISMATCH if the PK context can't be - * used for this type of signatures, - * MBEDTLS_ERR_PK_SIG_LEN_MISMATCH if the signature is - * valid but its actual length is less than sig_len, - * or a specific error code. - * - * \note If hash_len is 0, then the length associated with md_alg - * is used instead, or an error returned if it is invalid. - * - * \note md_alg may be MBEDTLS_MD_NONE, only if hash_len != 0 - * - * \note If type is MBEDTLS_PK_RSASSA_PSS, then options must point - * to a mbedtls_pk_rsassa_pss_options structure, - * otherwise it must be NULL. - */ -int mbedtls_pk_verify_ext( mbedtls_pk_type_t type, const void *options, - mbedtls_pk_context *ctx, mbedtls_md_type_t md_alg, - const unsigned char *hash, size_t hash_len, - const unsigned char *sig, size_t sig_len ); - -/** - * \brief Make signature, including padding if relevant. - * - * \param ctx PK context to use - * \param md_alg Hash algorithm used (see notes) - * \param hash Hash of the message to sign - * \param hash_len Hash length or 0 (see notes) - * \param sig Place to write the signature - * \param sig_len Number of bytes written - * \param f_rng RNG function - * \param p_rng RNG parameter - * - * \return 0 on success, or a specific error code. - * - * \note For RSA keys, the default padding type is PKCS#1 v1.5. - * There is no interface in the PK module to make RSASSA-PSS - * signatures yet. - * - * \note If hash_len is 0, then the length associated with md_alg - * is used instead, or an error returned if it is invalid. - * - * \note For RSA, md_alg may be MBEDTLS_MD_NONE if hash_len != 0. - * For ECDSA, md_alg may never be MBEDTLS_MD_NONE. - */ -int mbedtls_pk_sign( mbedtls_pk_context *ctx, mbedtls_md_type_t md_alg, - const unsigned char *hash, size_t hash_len, - unsigned char *sig, size_t *sig_len, - int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ); - -/** - * \brief Decrypt message (including padding if relevant). - * - * \param ctx PK context to use - * \param input Input to decrypt - * \param ilen Input size - * \param output Decrypted output - * \param olen Decrypted message length - * \param osize Size of the output buffer - * \param f_rng RNG function - * \param p_rng RNG parameter - * - * \note For RSA keys, the default padding type is PKCS#1 v1.5. - * - * \return 0 on success, or a specific error code. - */ -int mbedtls_pk_decrypt( mbedtls_pk_context *ctx, - const unsigned char *input, size_t ilen, - unsigned char *output, size_t *olen, size_t osize, - int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ); - -/** - * \brief Encrypt message (including padding if relevant). - * - * \param ctx PK context to use - * \param input Message to encrypt - * \param ilen Message size - * \param output Encrypted output - * \param olen Encrypted output length - * \param osize Size of the output buffer - * \param f_rng RNG function - * \param p_rng RNG parameter - * - * \note For RSA keys, the default padding type is PKCS#1 v1.5. - * - * \return 0 on success, or a specific error code. - */ -int mbedtls_pk_encrypt( mbedtls_pk_context *ctx, - const unsigned char *input, size_t ilen, - unsigned char *output, size_t *olen, size_t osize, - int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ); - -/** - * \brief Check if a public-private pair of keys matches. - * - * \param pub Context holding a public key. - * \param prv Context holding a private (and public) key. - * - * \return 0 on success or MBEDTLS_ERR_PK_BAD_INPUT_DATA - */ -int mbedtls_pk_check_pair( const mbedtls_pk_context *pub, const mbedtls_pk_context *prv ); - -/** - * \brief Export debug information - * - * \param ctx Context to use - * \param items Place to write debug items - * - * \return 0 on success or MBEDTLS_ERR_PK_BAD_INPUT_DATA - */ -int mbedtls_pk_debug( const mbedtls_pk_context *ctx, mbedtls_pk_debug_item *items ); - -/** - * \brief Access the type name - * - * \param ctx Context to use - * - * \return Type name on success, or "invalid PK" - */ -const char * mbedtls_pk_get_name( const mbedtls_pk_context *ctx ); - -/** - * \brief Get the key type - * - * \param ctx Context to use - * - * \return Type on success, or MBEDTLS_PK_NONE - */ -mbedtls_pk_type_t mbedtls_pk_get_type( const mbedtls_pk_context *ctx ); - -#if defined(MBEDTLS_PK_PARSE_C) -/** \ingroup pk_module */ -/** - * \brief Parse a private key in PEM or DER format - * - * \param ctx key to be initialized - * \param key input buffer - * \param keylen size of the buffer - * (including the terminating null byte for PEM data) - * \param pwd password for decryption (optional) - * \param pwdlen size of the password - * - * \note On entry, ctx must be empty, either freshly initialised - * with mbedtls_pk_init() or reset with mbedtls_pk_free(). If you need a - * specific key type, check the result with mbedtls_pk_can_do(). - * - * \note The key is also checked for correctness. - * - * \return 0 if successful, or a specific PK or PEM error code - */ -int mbedtls_pk_parse_key( mbedtls_pk_context *ctx, - const unsigned char *key, size_t keylen, - const unsigned char *pwd, size_t pwdlen ); - -/** \ingroup pk_module */ -/** - * \brief Parse a public key in PEM or DER format - * - * \param ctx key to be initialized - * \param key input buffer - * \param keylen size of the buffer - * (including the terminating null byte for PEM data) - * - * \note On entry, ctx must be empty, either freshly initialised - * with mbedtls_pk_init() or reset with mbedtls_pk_free(). If you need a - * specific key type, check the result with mbedtls_pk_can_do(). - * - * \note The key is also checked for correctness. - * - * \return 0 if successful, or a specific PK or PEM error code - */ -int mbedtls_pk_parse_public_key( mbedtls_pk_context *ctx, - const unsigned char *key, size_t keylen ); - -#if defined(MBEDTLS_FS_IO) -/** \ingroup pk_module */ -/** - * \brief Load and parse a private key - * - * \param ctx key to be initialized - * \param path filename to read the private key from - * \param password password to decrypt the file (can be NULL) - * - * \note On entry, ctx must be empty, either freshly initialised - * with mbedtls_pk_init() or reset with mbedtls_pk_free(). If you need a - * specific key type, check the result with mbedtls_pk_can_do(). - * - * \note The key is also checked for correctness. - * - * \return 0 if successful, or a specific PK or PEM error code - */ -int mbedtls_pk_parse_keyfile( mbedtls_pk_context *ctx, - const char *path, const char *password ); - -/** \ingroup pk_module */ -/** - * \brief Load and parse a public key - * - * \param ctx key to be initialized - * \param path filename to read the private key from - * - * \note On entry, ctx must be empty, either freshly initialised - * with mbedtls_pk_init() or reset with mbedtls_pk_free(). If you need a - * specific key type, check the result with mbedtls_pk_can_do(). - * - * \note The key is also checked for correctness. - * - * \return 0 if successful, or a specific PK or PEM error code - */ -int mbedtls_pk_parse_public_keyfile( mbedtls_pk_context *ctx, const char *path ); -#endif /* MBEDTLS_FS_IO */ -#endif /* MBEDTLS_PK_PARSE_C */ - -#if defined(MBEDTLS_PK_WRITE_C) -/** - * \brief Write a private key to a PKCS#1 or SEC1 DER structure - * Note: data is written at the end of the buffer! Use the - * return value to determine where you should start - * using the buffer - * - * \param ctx private to write away - * \param buf buffer to write to - * \param size size of the buffer - * - * \return length of data written if successful, or a specific - * error code - */ -int mbedtls_pk_write_key_der( mbedtls_pk_context *ctx, unsigned char *buf, size_t size ); - -/** - * \brief Write a public key to a SubjectPublicKeyInfo DER structure - * Note: data is written at the end of the buffer! Use the - * return value to determine where you should start - * using the buffer - * - * \param ctx public key to write away - * \param buf buffer to write to - * \param size size of the buffer - * - * \return length of data written if successful, or a specific - * error code - */ -int mbedtls_pk_write_pubkey_der( mbedtls_pk_context *ctx, unsigned char *buf, size_t size ); - -#if defined(MBEDTLS_PEM_WRITE_C) -/** - * \brief Write a public key to a PEM string - * - * \param ctx public key to write away - * \param buf buffer to write to - * \param size size of the buffer - * - * \return 0 if successful, or a specific error code - */ -int mbedtls_pk_write_pubkey_pem( mbedtls_pk_context *ctx, unsigned char *buf, size_t size ); - -/** - * \brief Write a private key to a PKCS#1 or SEC1 PEM string - * - * \param ctx private to write away - * \param buf buffer to write to - * \param size size of the buffer - * - * \return 0 if successful, or a specific error code - */ -int mbedtls_pk_write_key_pem( mbedtls_pk_context *ctx, unsigned char *buf, size_t size ); -#endif /* MBEDTLS_PEM_WRITE_C */ -#endif /* MBEDTLS_PK_WRITE_C */ - -/* - * WARNING: Low-level functions. You probably do not want to use these unless - * you are certain you do ;) - */ - -#if defined(MBEDTLS_PK_PARSE_C) -/** - * \brief Parse a SubjectPublicKeyInfo DER structure - * - * \param p the position in the ASN.1 data - * \param end end of the buffer - * \param pk the key to fill - * - * \return 0 if successful, or a specific PK error code - */ -int mbedtls_pk_parse_subpubkey( unsigned char **p, const unsigned char *end, - mbedtls_pk_context *pk ); -#endif /* MBEDTLS_PK_PARSE_C */ - -#if defined(MBEDTLS_PK_WRITE_C) -/** - * \brief Write a subjectPublicKey to ASN.1 data - * Note: function works backwards in data buffer - * - * \param p reference to current position pointer - * \param start start of the buffer (for bounds-checking) - * \param key public key to write away - * - * \return the length written or a negative error code - */ -int mbedtls_pk_write_pubkey( unsigned char **p, unsigned char *start, - const mbedtls_pk_context *key ); -#endif /* MBEDTLS_PK_WRITE_C */ - -/* - * Internal module functions. You probably do not want to use these unless you - * know you do. - */ -#if defined(MBEDTLS_FS_IO) -int mbedtls_pk_load_file( const char *path, unsigned char **buf, size_t *n ); -#endif - -#ifdef __cplusplus -} -#endif - -#endif /* MBEDTLS_PK_H */ diff --git a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/pk_internal.h b/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/pk_internal.h deleted file mode 100644 index 01d0f214..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/pk_internal.h +++ /dev/null @@ -1,114 +0,0 @@ -/** - * \file pk.h - * - * \brief Public Key abstraction layer: wrapper functions - * - * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * This file is part of mbed TLS (https://tls.mbed.org) - */ - -#ifndef MBEDTLS_PK_WRAP_H -#define MBEDTLS_PK_WRAP_H - -#if !defined(MBEDTLS_CONFIG_FILE) -#include "config.h" -#else -#include MBEDTLS_CONFIG_FILE -#endif - -#include "pk.h" - -struct mbedtls_pk_info_t -{ - /** Public key type */ - mbedtls_pk_type_t type; - - /** Type name */ - const char *name; - - /** Get key size in bits */ - size_t (*get_bitlen)( const void * ); - - /** Tell if the context implements this type (e.g. ECKEY can do ECDSA) */ - int (*can_do)( mbedtls_pk_type_t type ); - - /** Verify signature */ - int (*verify_func)( void *ctx, mbedtls_md_type_t md_alg, - const unsigned char *hash, size_t hash_len, - const unsigned char *sig, size_t sig_len ); - - /** Make signature */ - int (*sign_func)( void *ctx, mbedtls_md_type_t md_alg, - const unsigned char *hash, size_t hash_len, - unsigned char *sig, size_t *sig_len, - int (*f_rng)(void *, unsigned char *, size_t), - void *p_rng ); - - /** Decrypt message */ - int (*decrypt_func)( void *ctx, const unsigned char *input, size_t ilen, - unsigned char *output, size_t *olen, size_t osize, - int (*f_rng)(void *, unsigned char *, size_t), - void *p_rng ); - - /** Encrypt message */ - int (*encrypt_func)( void *ctx, const unsigned char *input, size_t ilen, - unsigned char *output, size_t *olen, size_t osize, - int (*f_rng)(void *, unsigned char *, size_t), - void *p_rng ); - - /** Check public-private key pair */ - int (*check_pair_func)( const void *pub, const void *prv ); - - /** Allocate a new context */ - void * (*ctx_alloc_func)( void ); - - /** Free the given context */ - void (*ctx_free_func)( void *ctx ); - - /** Interface with the debug module */ - void (*debug_func)( const void *ctx, mbedtls_pk_debug_item *items ); - -}; -#if defined(MBEDTLS_PK_RSA_ALT_SUPPORT) -/* Container for RSA-alt */ -typedef struct -{ - void *key; - mbedtls_pk_rsa_alt_decrypt_func decrypt_func; - mbedtls_pk_rsa_alt_sign_func sign_func; - mbedtls_pk_rsa_alt_key_len_func key_len_func; -} mbedtls_rsa_alt_context; -#endif - -#if defined(MBEDTLS_RSA_C) -extern const mbedtls_pk_info_t mbedtls_rsa_info; -#endif - -#if defined(MBEDTLS_ECP_C) -extern const mbedtls_pk_info_t mbedtls_eckey_info; -extern const mbedtls_pk_info_t mbedtls_eckeydh_info; -#endif - -#if defined(MBEDTLS_ECDSA_C) -extern const mbedtls_pk_info_t mbedtls_ecdsa_info; -#endif - -#if defined(MBEDTLS_PK_RSA_ALT_SUPPORT) -extern const mbedtls_pk_info_t mbedtls_rsa_alt_info; -#endif - -#endif /* MBEDTLS_PK_WRAP_H */ diff --git a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/pkcs11.h b/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/pkcs11.h deleted file mode 100644 index 2e889281..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/pkcs11.h +++ /dev/null @@ -1,173 +0,0 @@ -/** - * \file pkcs11.h - * - * \brief Wrapper for PKCS#11 library libpkcs11-helper - * - * \author Adriaan de Jong - * - * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * This file is part of mbed TLS (https://tls.mbed.org) - */ -#ifndef MBEDTLS_PKCS11_H -#define MBEDTLS_PKCS11_H - -#if !defined(MBEDTLS_CONFIG_FILE) -#include "config.h" -#else -#include MBEDTLS_CONFIG_FILE -#endif - -#if defined(MBEDTLS_PKCS11_C) - -#include "x509_crt.h" - -#include - -#if ( defined(__ARMCC_VERSION) || defined(_MSC_VER) ) && \ - !defined(inline) && !defined(__cplusplus) -#define inline __inline -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * Context for PKCS #11 private keys. - */ -typedef struct { - pkcs11h_certificate_t pkcs11h_cert; - int len; -} mbedtls_pkcs11_context; - -/** - * Initialize a mbedtls_pkcs11_context. - * (Just making memory references valid.) - */ -void mbedtls_pkcs11_init( mbedtls_pkcs11_context *ctx ); - -/** - * Fill in a mbed TLS certificate, based on the given PKCS11 helper certificate. - * - * \param cert X.509 certificate to fill - * \param pkcs11h_cert PKCS #11 helper certificate - * - * \return 0 on success. - */ -int mbedtls_pkcs11_x509_cert_bind( mbedtls_x509_crt *cert, pkcs11h_certificate_t pkcs11h_cert ); - -/** - * Set up a mbedtls_pkcs11_context storing the given certificate. Note that the - * mbedtls_pkcs11_context will take over control of the certificate, freeing it when - * done. - * - * \param priv_key Private key structure to fill. - * \param pkcs11_cert PKCS #11 helper certificate - * - * \return 0 on success - */ -int mbedtls_pkcs11_priv_key_bind( mbedtls_pkcs11_context *priv_key, - pkcs11h_certificate_t pkcs11_cert ); - -/** - * Free the contents of the given private key context. Note that the structure - * itself is not freed. - * - * \param priv_key Private key structure to cleanup - */ -void mbedtls_pkcs11_priv_key_free( mbedtls_pkcs11_context *priv_key ); - -/** - * \brief Do an RSA private key decrypt, then remove the message - * padding - * - * \param ctx PKCS #11 context - * \param mode must be MBEDTLS_RSA_PRIVATE, for compatibility with rsa.c's signature - * \param input buffer holding the encrypted data - * \param output buffer that will hold the plaintext - * \param olen will contain the plaintext length - * \param output_max_len maximum length of the output buffer - * - * \return 0 if successful, or an MBEDTLS_ERR_RSA_XXX error code - * - * \note The output buffer must be as large as the size - * of ctx->N (eg. 128 bytes if RSA-1024 is used) otherwise - * an error is thrown. - */ -int mbedtls_pkcs11_decrypt( mbedtls_pkcs11_context *ctx, - int mode, size_t *olen, - const unsigned char *input, - unsigned char *output, - size_t output_max_len ); - -/** - * \brief Do a private RSA to sign a message digest - * - * \param ctx PKCS #11 context - * \param mode must be MBEDTLS_RSA_PRIVATE, for compatibility with rsa.c's signature - * \param md_alg a MBEDTLS_MD_XXX (use MBEDTLS_MD_NONE for signing raw data) - * \param hashlen message digest length (for MBEDTLS_MD_NONE only) - * \param hash buffer holding the message digest - * \param sig buffer that will hold the ciphertext - * - * \return 0 if the signing operation was successful, - * or an MBEDTLS_ERR_RSA_XXX error code - * - * \note The "sig" buffer must be as large as the size - * of ctx->N (eg. 128 bytes if RSA-1024 is used). - */ -int mbedtls_pkcs11_sign( mbedtls_pkcs11_context *ctx, - int mode, - mbedtls_md_type_t md_alg, - unsigned int hashlen, - const unsigned char *hash, - unsigned char *sig ); - -/** - * SSL/TLS wrappers for PKCS#11 functions - */ -static inline int mbedtls_ssl_pkcs11_decrypt( void *ctx, int mode, size_t *olen, - const unsigned char *input, unsigned char *output, - size_t output_max_len ) -{ - return mbedtls_pkcs11_decrypt( (mbedtls_pkcs11_context *) ctx, mode, olen, input, output, - output_max_len ); -} - -static inline int mbedtls_ssl_pkcs11_sign( void *ctx, - int (*f_rng)(void *, unsigned char *, size_t), void *p_rng, - int mode, mbedtls_md_type_t md_alg, unsigned int hashlen, - const unsigned char *hash, unsigned char *sig ) -{ - ((void) f_rng); - ((void) p_rng); - return mbedtls_pkcs11_sign( (mbedtls_pkcs11_context *) ctx, mode, md_alg, - hashlen, hash, sig ); -} - -static inline size_t mbedtls_ssl_pkcs11_key_len( void *ctx ) -{ - return ( (mbedtls_pkcs11_context *) ctx )->len; -} - -#ifdef __cplusplus -} -#endif - -#endif /* MBEDTLS_PKCS11_C */ - -#endif /* MBEDTLS_PKCS11_H */ diff --git a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/pkcs12.h b/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/pkcs12.h deleted file mode 100644 index 9b2d9045..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/pkcs12.h +++ /dev/null @@ -1,119 +0,0 @@ -/** - * \file pkcs12.h - * - * \brief PKCS#12 Personal Information Exchange Syntax - * - * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * This file is part of mbed TLS (https://tls.mbed.org) - */ -#ifndef MBEDTLS_PKCS12_H -#define MBEDTLS_PKCS12_H - -#include "md.h" -#include "cipher.h" -#include "asn1.h" - -#include - -#define MBEDTLS_ERR_PKCS12_BAD_INPUT_DATA -0x1F80 /**< Bad input parameters to function. */ -#define MBEDTLS_ERR_PKCS12_FEATURE_UNAVAILABLE -0x1F00 /**< Feature not available, e.g. unsupported encryption scheme. */ -#define MBEDTLS_ERR_PKCS12_PBE_INVALID_FORMAT -0x1E80 /**< PBE ASN.1 data not as expected. */ -#define MBEDTLS_ERR_PKCS12_PASSWORD_MISMATCH -0x1E00 /**< Given private key password does not allow for correct decryption. */ - -#define MBEDTLS_PKCS12_DERIVE_KEY 1 /**< encryption/decryption key */ -#define MBEDTLS_PKCS12_DERIVE_IV 2 /**< initialization vector */ -#define MBEDTLS_PKCS12_DERIVE_MAC_KEY 3 /**< integrity / MAC key */ - -#define MBEDTLS_PKCS12_PBE_DECRYPT 0 -#define MBEDTLS_PKCS12_PBE_ENCRYPT 1 - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * \brief PKCS12 Password Based function (encryption / decryption) - * for pbeWithSHAAnd128BitRC4 - * - * \param pbe_params an ASN1 buffer containing the pkcs-12PbeParams structure - * \param mode either MBEDTLS_PKCS12_PBE_ENCRYPT or MBEDTLS_PKCS12_PBE_DECRYPT - * \param pwd the password used (may be NULL if no password is used) - * \param pwdlen length of the password (may be 0) - * \param input the input data - * \param len data length - * \param output the output buffer - * - * \return 0 if successful, or a MBEDTLS_ERR_XXX code - */ -int mbedtls_pkcs12_pbe_sha1_rc4_128( mbedtls_asn1_buf *pbe_params, int mode, - const unsigned char *pwd, size_t pwdlen, - const unsigned char *input, size_t len, - unsigned char *output ); - -/** - * \brief PKCS12 Password Based function (encryption / decryption) - * for cipher-based and mbedtls_md-based PBE's - * - * \param pbe_params an ASN1 buffer containing the pkcs-12PbeParams structure - * \param mode either MBEDTLS_PKCS12_PBE_ENCRYPT or MBEDTLS_PKCS12_PBE_DECRYPT - * \param cipher_type the cipher used - * \param md_type the mbedtls_md used - * \param pwd the password used (may be NULL if no password is used) - * \param pwdlen length of the password (may be 0) - * \param input the input data - * \param len data length - * \param output the output buffer - * - * \return 0 if successful, or a MBEDTLS_ERR_XXX code - */ -int mbedtls_pkcs12_pbe( mbedtls_asn1_buf *pbe_params, int mode, - mbedtls_cipher_type_t cipher_type, mbedtls_md_type_t md_type, - const unsigned char *pwd, size_t pwdlen, - const unsigned char *input, size_t len, - unsigned char *output ); - -/** - * \brief The PKCS#12 derivation function uses a password and a salt - * to produce pseudo-random bits for a particular "purpose". - * - * Depending on the given id, this function can produce an - * encryption/decryption key, an nitialization vector or an - * integrity key. - * - * \param data buffer to store the derived data in - * \param datalen length to fill - * \param pwd password to use (may be NULL if no password is used) - * \param pwdlen length of the password (may be 0) - * \param salt salt buffer to use - * \param saltlen length of the salt - * \param mbedtls_md mbedtls_md type to use during the derivation - * \param id id that describes the purpose (can be MBEDTLS_PKCS12_DERIVE_KEY, - * MBEDTLS_PKCS12_DERIVE_IV or MBEDTLS_PKCS12_DERIVE_MAC_KEY) - * \param iterations number of iterations - * - * \return 0 if successful, or a MD, BIGNUM type error. - */ -int mbedtls_pkcs12_derivation( unsigned char *data, size_t datalen, - const unsigned char *pwd, size_t pwdlen, - const unsigned char *salt, size_t saltlen, - mbedtls_md_type_t mbedtls_md, int id, int iterations ); - -#ifdef __cplusplus -} -#endif - -#endif /* pkcs12.h */ diff --git a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/pkcs5.h b/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/pkcs5.h deleted file mode 100644 index ec5cb9e7..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/pkcs5.h +++ /dev/null @@ -1,94 +0,0 @@ -/** - * \file pkcs5.h - * - * \brief PKCS#5 functions - * - * \author Mathias Olsson - * - * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * This file is part of mbed TLS (https://tls.mbed.org) - */ -#ifndef MBEDTLS_PKCS5_H -#define MBEDTLS_PKCS5_H - -#include "asn1.h" -#include "md.h" - -#include -#include - -#define MBEDTLS_ERR_PKCS5_BAD_INPUT_DATA -0x2f80 /**< Bad input parameters to function. */ -#define MBEDTLS_ERR_PKCS5_INVALID_FORMAT -0x2f00 /**< Unexpected ASN.1 data. */ -#define MBEDTLS_ERR_PKCS5_FEATURE_UNAVAILABLE -0x2e80 /**< Requested encryption or digest alg not available. */ -#define MBEDTLS_ERR_PKCS5_PASSWORD_MISMATCH -0x2e00 /**< Given private key password does not allow for correct decryption. */ - -#define MBEDTLS_PKCS5_DECRYPT 0 -#define MBEDTLS_PKCS5_ENCRYPT 1 - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * \brief PKCS#5 PBES2 function - * - * \param pbe_params the ASN.1 algorithm parameters - * \param mode either MBEDTLS_PKCS5_DECRYPT or MBEDTLS_PKCS5_ENCRYPT - * \param pwd password to use when generating key - * \param pwdlen length of password - * \param data data to process - * \param datalen length of data - * \param output output buffer - * - * \returns 0 on success, or a MBEDTLS_ERR_XXX code if verification fails. - */ -int mbedtls_pkcs5_pbes2( const mbedtls_asn1_buf *pbe_params, int mode, - const unsigned char *pwd, size_t pwdlen, - const unsigned char *data, size_t datalen, - unsigned char *output ); - -/** - * \brief PKCS#5 PBKDF2 using HMAC - * - * \param ctx Generic HMAC context - * \param password Password to use when generating key - * \param plen Length of password - * \param salt Salt to use when generating key - * \param slen Length of salt - * \param iteration_count Iteration count - * \param key_length Length of generated key in bytes - * \param output Generated key. Must be at least as big as key_length - * - * \returns 0 on success, or a MBEDTLS_ERR_XXX code if verification fails. - */ -int mbedtls_pkcs5_pbkdf2_hmac( mbedtls_md_context_t *ctx, const unsigned char *password, - size_t plen, const unsigned char *salt, size_t slen, - unsigned int iteration_count, - uint32_t key_length, unsigned char *output ); - -/** - * \brief Checkup routine - * - * \return 0 if successful, or 1 if the test failed - */ -int mbedtls_pkcs5_self_test( int verbose ); - -#ifdef __cplusplus -} -#endif - -#endif /* pkcs5.h */ diff --git a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/platform.h b/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/platform.h deleted file mode 100644 index f71f1b64..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/platform.h +++ /dev/null @@ -1,214 +0,0 @@ -/** - * \file platform.h - * - * \brief mbed TLS Platform abstraction layer - * - * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * This file is part of mbed TLS (https://tls.mbed.org) - */ -#ifndef MBEDTLS_PLATFORM_H -#define MBEDTLS_PLATFORM_H - -#if !defined(MBEDTLS_CONFIG_FILE) -#include "config.h" -#else -#include MBEDTLS_CONFIG_FILE -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * \name SECTION: Module settings - * - * The configuration options you can set for this module are in this section. - * Either change them in config.h or define them on the compiler command line. - * \{ - */ - -#if !defined(MBEDTLS_PLATFORM_NO_STD_FUNCTIONS) -#include -#include -#if !defined(MBEDTLS_PLATFORM_STD_SNPRINTF) -#if defined(_WIN32) -#define MBEDTLS_PLATFORM_STD_SNPRINTF mbedtls_platform_win32_snprintf /**< Default snprintf to use */ -#else -#define MBEDTLS_PLATFORM_STD_SNPRINTF snprintf /**< Default snprintf to use */ -#endif -#endif -#if !defined(MBEDTLS_PLATFORM_STD_PRINTF) -#define MBEDTLS_PLATFORM_STD_PRINTF printf /**< Default printf to use */ -#endif -#if !defined(MBEDTLS_PLATFORM_STD_FPRINTF) -#define MBEDTLS_PLATFORM_STD_FPRINTF fprintf /**< Default fprintf to use */ -#endif -#if !defined(MBEDTLS_PLATFORM_STD_CALLOC) -#define MBEDTLS_PLATFORM_STD_CALLOC calloc /**< Default allocator to use */ -#endif -#if !defined(MBEDTLS_PLATFORM_STD_FREE) -#define MBEDTLS_PLATFORM_STD_FREE free /**< Default free to use */ -#endif -#if !defined(MBEDTLS_PLATFORM_STD_EXIT) -#define MBEDTLS_PLATFORM_STD_EXIT exit /**< Default free to use */ -#endif -#else /* MBEDTLS_PLATFORM_NO_STD_FUNCTIONS */ -#if defined(MBEDTLS_PLATFORM_STD_MEM_HDR) -#include MBEDTLS_PLATFORM_STD_MEM_HDR -#endif -#endif /* MBEDTLS_PLATFORM_NO_STD_FUNCTIONS */ - -/* \} name SECTION: Module settings */ - -/* - * The function pointers for calloc and free - */ -#if defined(MBEDTLS_PLATFORM_MEMORY) -#if defined(MBEDTLS_PLATFORM_FREE_MACRO) && \ - defined(MBEDTLS_PLATFORM_CALLOC_MACRO) -#define mbedtls_free MBEDTLS_PLATFORM_FREE_MACRO -#define mbedtls_calloc MBEDTLS_PLATFORM_CALLOC_MACRO -#else -/* For size_t */ -#include -extern void * (*mbedtls_calloc)( size_t n, size_t size ); -extern void (*mbedtls_free)( void *ptr ); - -/** - * \brief Set your own memory implementation function pointers - * - * \param calloc_func the calloc function implementation - * \param free_func the free function implementation - * - * \return 0 if successful - */ -int mbedtls_platform_set_calloc_free( void * (*calloc_func)( size_t, size_t ), - void (*free_func)( void * ) ); -#endif /* MBEDTLS_PLATFORM_FREE_MACRO && MBEDTLS_PLATFORM_CALLOC_MACRO */ -#else /* !MBEDTLS_PLATFORM_MEMORY */ -#define mbedtls_free free -#define mbedtls_calloc calloc -#endif /* MBEDTLS_PLATFORM_MEMORY && !MBEDTLS_PLATFORM_{FREE,CALLOC}_MACRO */ - -/* - * The function pointers for fprintf - */ -#if defined(MBEDTLS_PLATFORM_FPRINTF_ALT) -/* We need FILE * */ -#include -extern int (*mbedtls_fprintf)( FILE *stream, const char *format, ... ); - -/** - * \brief Set your own fprintf function pointer - * - * \param fprintf_func the fprintf function implementation - * - * \return 0 - */ -int mbedtls_platform_set_fprintf( int (*fprintf_func)( FILE *stream, const char *, - ... ) ); -#else -#if defined(MBEDTLS_PLATFORM_FPRINTF_MACRO) -#define mbedtls_fprintf MBEDTLS_PLATFORM_FPRINTF_MACRO -#else -#define mbedtls_fprintf fprintf -#endif /* MBEDTLS_PLATFORM_FPRINTF_MACRO */ -#endif /* MBEDTLS_PLATFORM_FPRINTF_ALT */ - -/* - * The function pointers for printf - */ -#if defined(MBEDTLS_PLATFORM_PRINTF_ALT) -extern int (*mbedtls_printf)( const char *format, ... ); - -/** - * \brief Set your own printf function pointer - * - * \param printf_func the printf function implementation - * - * \return 0 - */ -int mbedtls_platform_set_printf( int (*printf_func)( const char *, ... ) ); -#else /* !MBEDTLS_PLATFORM_PRINTF_ALT */ -#if defined(MBEDTLS_PLATFORM_PRINTF_MACRO) -#define mbedtls_printf MBEDTLS_PLATFORM_PRINTF_MACRO -#else -#define mbedtls_printf printf -#endif /* MBEDTLS_PLATFORM_PRINTF_MACRO */ -#endif /* MBEDTLS_PLATFORM_PRINTF_ALT */ - -/* - * The function pointers for snprintf - * - * The snprintf implementation should conform to C99: - * - it *must* always correctly zero-terminate the buffer - * (except when n == 0, then it must leave the buffer untouched) - * - however it is acceptable to return -1 instead of the required length when - * the destination buffer is too short. - */ -#if defined(_WIN32) -/* For Windows (inc. MSYS2), we provide our own fixed implementation */ -int mbedtls_platform_win32_snprintf( char *s, size_t n, const char *fmt, ... ); -#endif - -#if defined(MBEDTLS_PLATFORM_SNPRINTF_ALT) -extern int (*mbedtls_snprintf)( char * s, size_t n, const char * format, ... ); - -/** - * \brief Set your own snprintf function pointer - * - * \param snprintf_func the snprintf function implementation - * - * \return 0 - */ -int mbedtls_platform_set_snprintf( int (*snprintf_func)( char * s, size_t n, - const char * format, ... ) ); -#else /* MBEDTLS_PLATFORM_SNPRINTF_ALT */ -#if defined(MBEDTLS_PLATFORM_SNPRINTF_MACRO) -#define mbedtls_snprintf MBEDTLS_PLATFORM_SNPRINTF_MACRO -#else -#define mbedtls_snprintf snprintf -#endif /* MBEDTLS_PLATFORM_SNPRINTF_MACRO */ -#endif /* MBEDTLS_PLATFORM_SNPRINTF_ALT */ - -/* - * The function pointers for exit - */ -#if defined(MBEDTLS_PLATFORM_EXIT_ALT) -extern void (*mbedtls_exit)( int status ); - -/** - * \brief Set your own exit function pointer - * - * \param exit_func the exit function implementation - * - * \return 0 - */ -int mbedtls_platform_set_exit( void (*exit_func)( int status ) ); -#else -#if defined(MBEDTLS_PLATFORM_EXIT_MACRO) -#define mbedtls_exit MBEDTLS_PLATFORM_EXIT_MACRO -#else -#define mbedtls_exit exit -#endif /* MBEDTLS_PLATFORM_EXIT_MACRO */ -#endif /* MBEDTLS_PLATFORM_EXIT_ALT */ - -#ifdef __cplusplus -} -#endif - -#endif /* platform.h */ diff --git a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/ripemd160.h b/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/ripemd160.h deleted file mode 100644 index a92d3844..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/ripemd160.h +++ /dev/null @@ -1,138 +0,0 @@ -/** - * \file mbedtls_ripemd160.h - * - * \brief RIPE MD-160 message digest - * - * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * This file is part of mbed TLS (https://tls.mbed.org) - */ -#ifndef MBEDTLS_RIPEMD160_H -#define MBEDTLS_RIPEMD160_H - -#if !defined(MBEDTLS_CONFIG_FILE) -#include "config.h" -#else -#include MBEDTLS_CONFIG_FILE -#endif - -#include -#include - -#if !defined(MBEDTLS_RIPEMD160_ALT) -// Regular implementation -// - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * \brief RIPEMD-160 context structure - */ -typedef struct -{ - uint32_t total[2]; /*!< number of bytes processed */ - uint32_t state[5]; /*!< intermediate digest state */ - unsigned char buffer[64]; /*!< data block being processed */ -} -mbedtls_ripemd160_context; - -/** - * \brief Initialize RIPEMD-160 context - * - * \param ctx RIPEMD-160 context to be initialized - */ -void mbedtls_ripemd160_init( mbedtls_ripemd160_context *ctx ); - -/** - * \brief Clear RIPEMD-160 context - * - * \param ctx RIPEMD-160 context to be cleared - */ -void mbedtls_ripemd160_free( mbedtls_ripemd160_context *ctx ); - -/** - * \brief Clone (the state of) an RIPEMD-160 context - * - * \param dst The destination context - * \param src The context to be cloned - */ -void mbedtls_ripemd160_clone( mbedtls_ripemd160_context *dst, - const mbedtls_ripemd160_context *src ); - -/** - * \brief RIPEMD-160 context setup - * - * \param ctx context to be initialized - */ -void mbedtls_ripemd160_starts( mbedtls_ripemd160_context *ctx ); - -/** - * \brief RIPEMD-160 process buffer - * - * \param ctx RIPEMD-160 context - * \param input buffer holding the data - * \param ilen length of the input data - */ -void mbedtls_ripemd160_update( mbedtls_ripemd160_context *ctx, - const unsigned char *input, size_t ilen ); - -/** - * \brief RIPEMD-160 final digest - * - * \param ctx RIPEMD-160 context - * \param output RIPEMD-160 checksum result - */ -void mbedtls_ripemd160_finish( mbedtls_ripemd160_context *ctx, unsigned char output[20] ); - -/* Internal use */ -void mbedtls_ripemd160_process( mbedtls_ripemd160_context *ctx, const unsigned char data[64] ); - -#ifdef __cplusplus -} -#endif - -#else /* MBEDTLS_RIPEMD160_ALT */ -#include "ripemd160.h" -#endif /* MBEDTLS_RIPEMD160_ALT */ - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * \brief Output = RIPEMD-160( input buffer ) - * - * \param input buffer holding the data - * \param ilen length of the input data - * \param output RIPEMD-160 checksum result - */ -void mbedtls_ripemd160( const unsigned char *input, size_t ilen, - unsigned char output[20] ); - -/** - * \brief Checkup routine - * - * \return 0 if successful, or 1 if the test failed - */ -int mbedtls_ripemd160_self_test( int verbose ); - -#ifdef __cplusplus -} -#endif - -#endif /* mbedtls_ripemd160.h */ diff --git a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/rsa.h b/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/rsa.h deleted file mode 100644 index 9c8645df..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/rsa.h +++ /dev/null @@ -1,652 +0,0 @@ -/** - * \file rsa.h - * - * \brief The RSA public-key cryptosystem - * - * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * This file is part of mbed TLS (https://tls.mbed.org) - */ -#ifndef MBEDTLS_RSA_H -#define MBEDTLS_RSA_H - -#if !defined(MBEDTLS_CONFIG_FILE) -#include "config.h" -#else -#include MBEDTLS_CONFIG_FILE -#endif - -#include "bignum.h" -#include "md.h" - -#if defined(MBEDTLS_THREADING_C) -#include "threading.h" -#endif - -/* - * RSA Error codes - */ -#define MBEDTLS_ERR_RSA_BAD_INPUT_DATA -0x4080 /**< Bad input parameters to function. */ -#define MBEDTLS_ERR_RSA_INVALID_PADDING -0x4100 /**< Input data contains invalid padding and is rejected. */ -#define MBEDTLS_ERR_RSA_KEY_GEN_FAILED -0x4180 /**< Something failed during generation of a key. */ -#define MBEDTLS_ERR_RSA_KEY_CHECK_FAILED -0x4200 /**< Key failed to pass the library's validity check. */ -#define MBEDTLS_ERR_RSA_PUBLIC_FAILED -0x4280 /**< The public key operation failed. */ -#define MBEDTLS_ERR_RSA_PRIVATE_FAILED -0x4300 /**< The private key operation failed. */ -#define MBEDTLS_ERR_RSA_VERIFY_FAILED -0x4380 /**< The PKCS#1 verification failed. */ -#define MBEDTLS_ERR_RSA_OUTPUT_TOO_LARGE -0x4400 /**< The output buffer for decryption is not large enough. */ -#define MBEDTLS_ERR_RSA_RNG_FAILED -0x4480 /**< The random generator failed to generate non-zeros. */ - -/* - * RSA constants - */ -#define MBEDTLS_RSA_PUBLIC 0 -#define MBEDTLS_RSA_PRIVATE 1 - -#define MBEDTLS_RSA_PKCS_V15 0 -#define MBEDTLS_RSA_PKCS_V21 1 - -#define MBEDTLS_RSA_SIGN 1 -#define MBEDTLS_RSA_CRYPT 2 - -#define MBEDTLS_RSA_SALT_LEN_ANY -1 - -/* - * The above constants may be used even if the RSA module is compile out, - * eg for alternative (PKCS#11) RSA implemenations in the PK layers. - */ -#if defined(MBEDTLS_RSA_C) - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * \brief RSA context structure - */ -typedef struct -{ - int ver; /*!< always 0 */ - size_t len; /*!< size(N) in chars */ - - mbedtls_mpi N; /*!< public modulus */ - mbedtls_mpi E; /*!< public exponent */ - - mbedtls_mpi D; /*!< private exponent */ - mbedtls_mpi P; /*!< 1st prime factor */ - mbedtls_mpi Q; /*!< 2nd prime factor */ - mbedtls_mpi DP; /*!< D % (P - 1) */ - mbedtls_mpi DQ; /*!< D % (Q - 1) */ - mbedtls_mpi QP; /*!< 1 / (Q % P) */ - - mbedtls_mpi RN; /*!< cached R^2 mod N */ - mbedtls_mpi RP; /*!< cached R^2 mod P */ - mbedtls_mpi RQ; /*!< cached R^2 mod Q */ - - mbedtls_mpi Vi; /*!< cached blinding value */ - mbedtls_mpi Vf; /*!< cached un-blinding value */ - - int padding; /*!< MBEDTLS_RSA_PKCS_V15 for 1.5 padding and - RSA_PKCS_v21 for OAEP/PSS */ - int hash_id; /*!< Hash identifier of mbedtls_md_type_t as - specified in the mbedtls_md.h header file - for the EME-OAEP and EMSA-PSS - encoding */ -#if defined(MBEDTLS_THREADING_C) - mbedtls_threading_mutex_t mutex; /*!< Thread-safety mutex */ -#endif -} -mbedtls_rsa_context; - -/** - * \brief Initialize an RSA context - * - * Note: Set padding to MBEDTLS_RSA_PKCS_V21 for the RSAES-OAEP - * encryption scheme and the RSASSA-PSS signature scheme. - * - * \param ctx RSA context to be initialized - * \param padding MBEDTLS_RSA_PKCS_V15 or MBEDTLS_RSA_PKCS_V21 - * \param hash_id MBEDTLS_RSA_PKCS_V21 hash identifier - * - * \note The hash_id parameter is actually ignored - * when using MBEDTLS_RSA_PKCS_V15 padding. - * - * \note Choice of padding mode is strictly enforced for private key - * operations, since there might be security concerns in - * mixing padding modes. For public key operations it's merely - * a default value, which can be overriden by calling specific - * rsa_rsaes_xxx or rsa_rsassa_xxx functions. - * - * \note The chosen hash is always used for OEAP encryption. - * For PSS signatures, it's always used for making signatures, - * but can be overriden (and always is, if set to - * MBEDTLS_MD_NONE) for verifying them. - */ -void mbedtls_rsa_init( mbedtls_rsa_context *ctx, - int padding, - int hash_id); - -/** - * \brief Set padding for an already initialized RSA context - * See \c mbedtls_rsa_init() for details. - * - * \param ctx RSA context to be set - * \param padding MBEDTLS_RSA_PKCS_V15 or MBEDTLS_RSA_PKCS_V21 - * \param hash_id MBEDTLS_RSA_PKCS_V21 hash identifier - */ -void mbedtls_rsa_set_padding( mbedtls_rsa_context *ctx, int padding, int hash_id); - -/** - * \brief Generate an RSA keypair - * - * \param ctx RSA context that will hold the key - * \param f_rng RNG function - * \param p_rng RNG parameter - * \param nbits size of the public key in bits - * \param exponent public exponent (e.g., 65537) - * - * \note mbedtls_rsa_init() must be called beforehand to setup - * the RSA context. - * - * \return 0 if successful, or an MBEDTLS_ERR_RSA_XXX error code - */ -int mbedtls_rsa_gen_key( mbedtls_rsa_context *ctx, - int (*f_rng)(void *, unsigned char *, size_t), - void *p_rng, - unsigned int nbits, int exponent ); - -/** - * \brief Check a public RSA key - * - * \param ctx RSA context to be checked - * - * \return 0 if successful, or an MBEDTLS_ERR_RSA_XXX error code - */ -int mbedtls_rsa_check_pubkey( const mbedtls_rsa_context *ctx ); - -/** - * \brief Check a private RSA key - * - * \param ctx RSA context to be checked - * - * \return 0 if successful, or an MBEDTLS_ERR_RSA_XXX error code - */ -int mbedtls_rsa_check_privkey( const mbedtls_rsa_context *ctx ); - -/** - * \brief Check a public-private RSA key pair. - * Check each of the contexts, and make sure they match. - * - * \param pub RSA context holding the public key - * \param prv RSA context holding the private key - * - * \return 0 if successful, or an MBEDTLS_ERR_RSA_XXX error code - */ -int mbedtls_rsa_check_pub_priv( const mbedtls_rsa_context *pub, const mbedtls_rsa_context *prv ); - -/** - * \brief Do an RSA public key operation - * - * \param ctx RSA context - * \param input input buffer - * \param output output buffer - * - * \return 0 if successful, or an MBEDTLS_ERR_RSA_XXX error code - * - * \note This function does NOT take care of message - * padding. Also, be sure to set input[0] = 0 or assure that - * input is smaller than N. - * - * \note The input and output buffers must be large - * enough (eg. 128 bytes if RSA-1024 is used). - */ -int mbedtls_rsa_public( mbedtls_rsa_context *ctx, - const unsigned char *input, - unsigned char *output ); - -/** - * \brief Do an RSA private key operation - * - * \param ctx RSA context - * \param f_rng RNG function (Needed for blinding) - * \param p_rng RNG parameter - * \param input input buffer - * \param output output buffer - * - * \return 0 if successful, or an MBEDTLS_ERR_RSA_XXX error code - * - * \note The input and output buffers must be large - * enough (eg. 128 bytes if RSA-1024 is used). - */ -int mbedtls_rsa_private( mbedtls_rsa_context *ctx, - int (*f_rng)(void *, unsigned char *, size_t), - void *p_rng, - const unsigned char *input, - unsigned char *output ); - -/** - * \brief Generic wrapper to perform a PKCS#1 encryption using the - * mode from the context. Add the message padding, then do an - * RSA operation. - * - * \param ctx RSA context - * \param f_rng RNG function (Needed for padding and PKCS#1 v2.1 encoding - * and MBEDTLS_RSA_PRIVATE) - * \param p_rng RNG parameter - * \param mode MBEDTLS_RSA_PUBLIC or MBEDTLS_RSA_PRIVATE - * \param ilen contains the plaintext length - * \param input buffer holding the data to be encrypted - * \param output buffer that will hold the ciphertext - * - * \return 0 if successful, or an MBEDTLS_ERR_RSA_XXX error code - * - * \note The output buffer must be as large as the size - * of ctx->N (eg. 128 bytes if RSA-1024 is used). - */ -int mbedtls_rsa_pkcs1_encrypt( mbedtls_rsa_context *ctx, - int (*f_rng)(void *, unsigned char *, size_t), - void *p_rng, - int mode, size_t ilen, - const unsigned char *input, - unsigned char *output ); - -/** - * \brief Perform a PKCS#1 v1.5 encryption (RSAES-PKCS1-v1_5-ENCRYPT) - * - * \param ctx RSA context - * \param f_rng RNG function (Needed for padding and MBEDTLS_RSA_PRIVATE) - * \param p_rng RNG parameter - * \param mode MBEDTLS_RSA_PUBLIC or MBEDTLS_RSA_PRIVATE - * \param ilen contains the plaintext length - * \param input buffer holding the data to be encrypted - * \param output buffer that will hold the ciphertext - * - * \return 0 if successful, or an MBEDTLS_ERR_RSA_XXX error code - * - * \note The output buffer must be as large as the size - * of ctx->N (eg. 128 bytes if RSA-1024 is used). - */ -int mbedtls_rsa_rsaes_pkcs1_v15_encrypt( mbedtls_rsa_context *ctx, - int (*f_rng)(void *, unsigned char *, size_t), - void *p_rng, - int mode, size_t ilen, - const unsigned char *input, - unsigned char *output ); - -/** - * \brief Perform a PKCS#1 v2.1 OAEP encryption (RSAES-OAEP-ENCRYPT) - * - * \param ctx RSA context - * \param f_rng RNG function (Needed for padding and PKCS#1 v2.1 encoding - * and MBEDTLS_RSA_PRIVATE) - * \param p_rng RNG parameter - * \param mode MBEDTLS_RSA_PUBLIC or MBEDTLS_RSA_PRIVATE - * \param label buffer holding the custom label to use - * \param label_len contains the label length - * \param ilen contains the plaintext length - * \param input buffer holding the data to be encrypted - * \param output buffer that will hold the ciphertext - * - * \return 0 if successful, or an MBEDTLS_ERR_RSA_XXX error code - * - * \note The output buffer must be as large as the size - * of ctx->N (eg. 128 bytes if RSA-1024 is used). - */ -int mbedtls_rsa_rsaes_oaep_encrypt( mbedtls_rsa_context *ctx, - int (*f_rng)(void *, unsigned char *, size_t), - void *p_rng, - int mode, - const unsigned char *label, size_t label_len, - size_t ilen, - const unsigned char *input, - unsigned char *output ); - -/** - * \brief Generic wrapper to perform a PKCS#1 decryption using the - * mode from the context. Do an RSA operation, then remove - * the message padding - * - * \param ctx RSA context - * \param f_rng RNG function (Only needed for MBEDTLS_RSA_PRIVATE) - * \param p_rng RNG parameter - * \param mode MBEDTLS_RSA_PUBLIC or MBEDTLS_RSA_PRIVATE - * \param olen will contain the plaintext length - * \param input buffer holding the encrypted data - * \param output buffer that will hold the plaintext - * \param output_max_len maximum length of the output buffer - * - * \return 0 if successful, or an MBEDTLS_ERR_RSA_XXX error code - * - * \note The output buffer must be as large as the size - * of ctx->N (eg. 128 bytes if RSA-1024 is used) otherwise - * an error is thrown. - */ -int mbedtls_rsa_pkcs1_decrypt( mbedtls_rsa_context *ctx, - int (*f_rng)(void *, unsigned char *, size_t), - void *p_rng, - int mode, size_t *olen, - const unsigned char *input, - unsigned char *output, - size_t output_max_len ); - -/** - * \brief Perform a PKCS#1 v1.5 decryption (RSAES-PKCS1-v1_5-DECRYPT) - * - * \param ctx RSA context - * \param f_rng RNG function (Only needed for MBEDTLS_RSA_PRIVATE) - * \param p_rng RNG parameter - * \param mode MBEDTLS_RSA_PUBLIC or MBEDTLS_RSA_PRIVATE - * \param olen will contain the plaintext length - * \param input buffer holding the encrypted data - * \param output buffer that will hold the plaintext - * \param output_max_len maximum length of the output buffer - * - * \return 0 if successful, or an MBEDTLS_ERR_RSA_XXX error code - * - * \note The output buffer must be as large as the size - * of ctx->N (eg. 128 bytes if RSA-1024 is used) otherwise - * an error is thrown. - */ -int mbedtls_rsa_rsaes_pkcs1_v15_decrypt( mbedtls_rsa_context *ctx, - int (*f_rng)(void *, unsigned char *, size_t), - void *p_rng, - int mode, size_t *olen, - const unsigned char *input, - unsigned char *output, - size_t output_max_len ); - -/** - * \brief Perform a PKCS#1 v2.1 OAEP decryption (RSAES-OAEP-DECRYPT) - * - * \param ctx RSA context - * \param f_rng RNG function (Only needed for MBEDTLS_RSA_PRIVATE) - * \param p_rng RNG parameter - * \param mode MBEDTLS_RSA_PUBLIC or MBEDTLS_RSA_PRIVATE - * \param label buffer holding the custom label to use - * \param label_len contains the label length - * \param olen will contain the plaintext length - * \param input buffer holding the encrypted data - * \param output buffer that will hold the plaintext - * \param output_max_len maximum length of the output buffer - * - * \return 0 if successful, or an MBEDTLS_ERR_RSA_XXX error code - * - * \note The output buffer must be as large as the size - * of ctx->N (eg. 128 bytes if RSA-1024 is used) otherwise - * an error is thrown. - */ -int mbedtls_rsa_rsaes_oaep_decrypt( mbedtls_rsa_context *ctx, - int (*f_rng)(void *, unsigned char *, size_t), - void *p_rng, - int mode, - const unsigned char *label, size_t label_len, - size_t *olen, - const unsigned char *input, - unsigned char *output, - size_t output_max_len ); - -/** - * \brief Generic wrapper to perform a PKCS#1 signature using the - * mode from the context. Do a private RSA operation to sign - * a message digest - * - * \param ctx RSA context - * \param f_rng RNG function (Needed for PKCS#1 v2.1 encoding and for - * MBEDTLS_RSA_PRIVATE) - * \param p_rng RNG parameter - * \param mode MBEDTLS_RSA_PUBLIC or MBEDTLS_RSA_PRIVATE - * \param md_alg a MBEDTLS_MD_XXX (use MBEDTLS_MD_NONE for signing raw data) - * \param hashlen message digest length (for MBEDTLS_MD_NONE only) - * \param hash buffer holding the message digest - * \param sig buffer that will hold the ciphertext - * - * \return 0 if the signing operation was successful, - * or an MBEDTLS_ERR_RSA_XXX error code - * - * \note The "sig" buffer must be as large as the size - * of ctx->N (eg. 128 bytes if RSA-1024 is used). - * - * \note In case of PKCS#1 v2.1 encoding, see comments on - * \note \c mbedtls_rsa_rsassa_pss_sign() for details on md_alg and hash_id. - */ -int mbedtls_rsa_pkcs1_sign( mbedtls_rsa_context *ctx, - int (*f_rng)(void *, unsigned char *, size_t), - void *p_rng, - int mode, - mbedtls_md_type_t md_alg, - unsigned int hashlen, - const unsigned char *hash, - unsigned char *sig ); - -/** - * \brief Perform a PKCS#1 v1.5 signature (RSASSA-PKCS1-v1_5-SIGN) - * - * \param ctx RSA context - * \param f_rng RNG function (Only needed for MBEDTLS_RSA_PRIVATE) - * \param p_rng RNG parameter - * \param mode MBEDTLS_RSA_PUBLIC or MBEDTLS_RSA_PRIVATE - * \param md_alg a MBEDTLS_MD_XXX (use MBEDTLS_MD_NONE for signing raw data) - * \param hashlen message digest length (for MBEDTLS_MD_NONE only) - * \param hash buffer holding the message digest - * \param sig buffer that will hold the ciphertext - * - * \return 0 if the signing operation was successful, - * or an MBEDTLS_ERR_RSA_XXX error code - * - * \note The "sig" buffer must be as large as the size - * of ctx->N (eg. 128 bytes if RSA-1024 is used). - */ -int mbedtls_rsa_rsassa_pkcs1_v15_sign( mbedtls_rsa_context *ctx, - int (*f_rng)(void *, unsigned char *, size_t), - void *p_rng, - int mode, - mbedtls_md_type_t md_alg, - unsigned int hashlen, - const unsigned char *hash, - unsigned char *sig ); - -/** - * \brief Perform a PKCS#1 v2.1 PSS signature (RSASSA-PSS-SIGN) - * - * \param ctx RSA context - * \param f_rng RNG function (Needed for PKCS#1 v2.1 encoding and for - * MBEDTLS_RSA_PRIVATE) - * \param p_rng RNG parameter - * \param mode MBEDTLS_RSA_PUBLIC or MBEDTLS_RSA_PRIVATE - * \param md_alg a MBEDTLS_MD_XXX (use MBEDTLS_MD_NONE for signing raw data) - * \param hashlen message digest length (for MBEDTLS_MD_NONE only) - * \param hash buffer holding the message digest - * \param sig buffer that will hold the ciphertext - * - * \return 0 if the signing operation was successful, - * or an MBEDTLS_ERR_RSA_XXX error code - * - * \note The "sig" buffer must be as large as the size - * of ctx->N (eg. 128 bytes if RSA-1024 is used). - * - * \note The hash_id in the RSA context is the one used for the - * encoding. md_alg in the function call is the type of hash - * that is encoded. According to RFC 3447 it is advised to - * keep both hashes the same. - */ -int mbedtls_rsa_rsassa_pss_sign( mbedtls_rsa_context *ctx, - int (*f_rng)(void *, unsigned char *, size_t), - void *p_rng, - int mode, - mbedtls_md_type_t md_alg, - unsigned int hashlen, - const unsigned char *hash, - unsigned char *sig ); - -/** - * \brief Generic wrapper to perform a PKCS#1 verification using the - * mode from the context. Do a public RSA operation and check - * the message digest - * - * \param ctx points to an RSA public key - * \param f_rng RNG function (Only needed for MBEDTLS_RSA_PRIVATE) - * \param p_rng RNG parameter - * \param mode MBEDTLS_RSA_PUBLIC or MBEDTLS_RSA_PRIVATE - * \param md_alg a MBEDTLS_MD_XXX (use MBEDTLS_MD_NONE for signing raw data) - * \param hashlen message digest length (for MBEDTLS_MD_NONE only) - * \param hash buffer holding the message digest - * \param sig buffer holding the ciphertext - * - * \return 0 if the verify operation was successful, - * or an MBEDTLS_ERR_RSA_XXX error code - * - * \note The "sig" buffer must be as large as the size - * of ctx->N (eg. 128 bytes if RSA-1024 is used). - * - * \note In case of PKCS#1 v2.1 encoding, see comments on - * \c mbedtls_rsa_rsassa_pss_verify() about md_alg and hash_id. - */ -int mbedtls_rsa_pkcs1_verify( mbedtls_rsa_context *ctx, - int (*f_rng)(void *, unsigned char *, size_t), - void *p_rng, - int mode, - mbedtls_md_type_t md_alg, - unsigned int hashlen, - const unsigned char *hash, - const unsigned char *sig ); - -/** - * \brief Perform a PKCS#1 v1.5 verification (RSASSA-PKCS1-v1_5-VERIFY) - * - * \param ctx points to an RSA public key - * \param f_rng RNG function (Only needed for MBEDTLS_RSA_PRIVATE) - * \param p_rng RNG parameter - * \param mode MBEDTLS_RSA_PUBLIC or MBEDTLS_RSA_PRIVATE - * \param md_alg a MBEDTLS_MD_XXX (use MBEDTLS_MD_NONE for signing raw data) - * \param hashlen message digest length (for MBEDTLS_MD_NONE only) - * \param hash buffer holding the message digest - * \param sig buffer holding the ciphertext - * - * \return 0 if the verify operation was successful, - * or an MBEDTLS_ERR_RSA_XXX error code - * - * \note The "sig" buffer must be as large as the size - * of ctx->N (eg. 128 bytes if RSA-1024 is used). - */ -int mbedtls_rsa_rsassa_pkcs1_v15_verify( mbedtls_rsa_context *ctx, - int (*f_rng)(void *, unsigned char *, size_t), - void *p_rng, - int mode, - mbedtls_md_type_t md_alg, - unsigned int hashlen, - const unsigned char *hash, - const unsigned char *sig ); - -/** - * \brief Perform a PKCS#1 v2.1 PSS verification (RSASSA-PSS-VERIFY) - * (This is the "simple" version.) - * - * \param ctx points to an RSA public key - * \param f_rng RNG function (Only needed for MBEDTLS_RSA_PRIVATE) - * \param p_rng RNG parameter - * \param mode MBEDTLS_RSA_PUBLIC or MBEDTLS_RSA_PRIVATE - * \param md_alg a MBEDTLS_MD_XXX (use MBEDTLS_MD_NONE for signing raw data) - * \param hashlen message digest length (for MBEDTLS_MD_NONE only) - * \param hash buffer holding the message digest - * \param sig buffer holding the ciphertext - * - * \return 0 if the verify operation was successful, - * or an MBEDTLS_ERR_RSA_XXX error code - * - * \note The "sig" buffer must be as large as the size - * of ctx->N (eg. 128 bytes if RSA-1024 is used). - * - * \note The hash_id in the RSA context is the one used for the - * verification. md_alg in the function call is the type of - * hash that is verified. According to RFC 3447 it is advised to - * keep both hashes the same. If hash_id in the RSA context is - * unset, the md_alg from the function call is used. - */ -int mbedtls_rsa_rsassa_pss_verify( mbedtls_rsa_context *ctx, - int (*f_rng)(void *, unsigned char *, size_t), - void *p_rng, - int mode, - mbedtls_md_type_t md_alg, - unsigned int hashlen, - const unsigned char *hash, - const unsigned char *sig ); - -/** - * \brief Perform a PKCS#1 v2.1 PSS verification (RSASSA-PSS-VERIFY) - * (This is the version with "full" options.) - * - * \param ctx points to an RSA public key - * \param f_rng RNG function (Only needed for MBEDTLS_RSA_PRIVATE) - * \param p_rng RNG parameter - * \param mode MBEDTLS_RSA_PUBLIC or MBEDTLS_RSA_PRIVATE - * \param md_alg a MBEDTLS_MD_XXX (use MBEDTLS_MD_NONE for signing raw data) - * \param hashlen message digest length (for MBEDTLS_MD_NONE only) - * \param hash buffer holding the message digest - * \param mgf1_hash_id message digest used for mask generation - * \param expected_salt_len Length of the salt used in padding, use - * MBEDTLS_RSA_SALT_LEN_ANY to accept any salt length - * \param sig buffer holding the ciphertext - * - * \return 0 if the verify operation was successful, - * or an MBEDTLS_ERR_RSA_XXX error code - * - * \note The "sig" buffer must be as large as the size - * of ctx->N (eg. 128 bytes if RSA-1024 is used). - * - * \note The hash_id in the RSA context is ignored. - */ -int mbedtls_rsa_rsassa_pss_verify_ext( mbedtls_rsa_context *ctx, - int (*f_rng)(void *, unsigned char *, size_t), - void *p_rng, - int mode, - mbedtls_md_type_t md_alg, - unsigned int hashlen, - const unsigned char *hash, - mbedtls_md_type_t mgf1_hash_id, - int expected_salt_len, - const unsigned char *sig ); - -/** - * \brief Copy the components of an RSA context - * - * \param dst Destination context - * \param src Source context - * - * \return 0 on success, - * MBEDTLS_ERR_MPI_ALLOC_FAILED on memory allocation failure - */ -int mbedtls_rsa_copy( mbedtls_rsa_context *dst, const mbedtls_rsa_context *src ); - -/** - * \brief Free the components of an RSA key - * - * \param ctx RSA Context to free - */ -void mbedtls_rsa_free( mbedtls_rsa_context *ctx ); - -/** - * \brief Checkup routine - * - * \return 0 if successful, or 1 if the test failed - */ -int mbedtls_rsa_self_test( int verbose ); - -#ifdef __cplusplus -} -#endif - -#endif /* MBEDTLS_RSA_C */ - -#endif /* rsa.h */ diff --git a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/sha1.h b/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/sha1.h deleted file mode 100644 index 2b74d06d..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/sha1.h +++ /dev/null @@ -1,136 +0,0 @@ -/** - * \file mbedtls_sha1.h - * - * \brief SHA-1 cryptographic hash function - * - * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * This file is part of mbed TLS (https://tls.mbed.org) - */ -#ifndef MBEDTLS_SHA1_H -#define MBEDTLS_SHA1_H - -#if !defined(MBEDTLS_CONFIG_FILE) -#include "config.h" -#else -#include MBEDTLS_CONFIG_FILE -#endif - -#include -#include - -#if !defined(MBEDTLS_SHA1_ALT) -// Regular implementation -// - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * \brief SHA-1 context structure - */ -typedef struct -{ - uint32_t total[2]; /*!< number of bytes processed */ - uint32_t state[5]; /*!< intermediate digest state */ - unsigned char buffer[64]; /*!< data block being processed */ -} -mbedtls_sha1_context; - -/** - * \brief Initialize SHA-1 context - * - * \param ctx SHA-1 context to be initialized - */ -void mbedtls_sha1_init( mbedtls_sha1_context *ctx ); - -/** - * \brief Clear SHA-1 context - * - * \param ctx SHA-1 context to be cleared - */ -void mbedtls_sha1_free( mbedtls_sha1_context *ctx ); - -/** - * \brief Clone (the state of) a SHA-1 context - * - * \param dst The destination context - * \param src The context to be cloned - */ -void mbedtls_sha1_clone( mbedtls_sha1_context *dst, - const mbedtls_sha1_context *src ); - -/** - * \brief SHA-1 context setup - * - * \param ctx context to be initialized - */ -void mbedtls_sha1_starts( mbedtls_sha1_context *ctx ); - -/** - * \brief SHA-1 process buffer - * - * \param ctx SHA-1 context - * \param input buffer holding the data - * \param ilen length of the input data - */ -void mbedtls_sha1_update( mbedtls_sha1_context *ctx, const unsigned char *input, size_t ilen ); - -/** - * \brief SHA-1 final digest - * - * \param ctx SHA-1 context - * \param output SHA-1 checksum result - */ -void mbedtls_sha1_finish( mbedtls_sha1_context *ctx, unsigned char output[20] ); - -/* Internal use */ -void mbedtls_sha1_process( mbedtls_sha1_context *ctx, const unsigned char data[64] ); - -#ifdef __cplusplus -} -#endif - -#else /* MBEDTLS_SHA1_ALT */ -#include "sha1_alt.h" -#endif /* MBEDTLS_SHA1_ALT */ - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * \brief Output = SHA-1( input buffer ) - * - * \param input buffer holding the data - * \param ilen length of the input data - * \param output SHA-1 checksum result - */ -void mbedtls_sha1( const unsigned char *input, size_t ilen, unsigned char output[20] ); - -/** - * \brief Checkup routine - * - * \return 0 if successful, or 1 if the test failed - */ -int mbedtls_sha1_self_test( int verbose ); - -#ifdef __cplusplus -} -#endif - -#endif /* mbedtls_sha1.h */ diff --git a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/sha256.h b/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/sha256.h deleted file mode 100644 index bc8b226e..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/sha256.h +++ /dev/null @@ -1,141 +0,0 @@ -/** - * \file mbedtls_sha256.h - * - * \brief SHA-224 and SHA-256 cryptographic hash function - * - * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * This file is part of mbed TLS (https://tls.mbed.org) - */ -#ifndef MBEDTLS_SHA256_H -#define MBEDTLS_SHA256_H - -#if !defined(MBEDTLS_CONFIG_FILE) -#include "config.h" -#else -#include MBEDTLS_CONFIG_FILE -#endif - -#include -#include - -#if !defined(MBEDTLS_SHA256_ALT) -// Regular implementation -// - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * \brief SHA-256 context structure - */ -typedef struct -{ - uint32_t total[2]; /*!< number of bytes processed */ - uint32_t state[8]; /*!< intermediate digest state */ - unsigned char buffer[64]; /*!< data block being processed */ - int is224; /*!< 0 => SHA-256, else SHA-224 */ -} -mbedtls_sha256_context; - -/** - * \brief Initialize SHA-256 context - * - * \param ctx SHA-256 context to be initialized - */ -void mbedtls_sha256_init( mbedtls_sha256_context *ctx ); - -/** - * \brief Clear SHA-256 context - * - * \param ctx SHA-256 context to be cleared - */ -void mbedtls_sha256_free( mbedtls_sha256_context *ctx ); - -/** - * \brief Clone (the state of) a SHA-256 context - * - * \param dst The destination context - * \param src The context to be cloned - */ -void mbedtls_sha256_clone( mbedtls_sha256_context *dst, - const mbedtls_sha256_context *src ); - -/** - * \brief SHA-256 context setup - * - * \param ctx context to be initialized - * \param is224 0 = use SHA256, 1 = use SHA224 - */ -void mbedtls_sha256_starts( mbedtls_sha256_context *ctx, int is224 ); - -/** - * \brief SHA-256 process buffer - * - * \param ctx SHA-256 context - * \param input buffer holding the data - * \param ilen length of the input data - */ -void mbedtls_sha256_update( mbedtls_sha256_context *ctx, const unsigned char *input, - size_t ilen ); - -/** - * \brief SHA-256 final digest - * - * \param ctx SHA-256 context - * \param output SHA-224/256 checksum result - */ -void mbedtls_sha256_finish( mbedtls_sha256_context *ctx, unsigned char output[32] ); - -/* Internal use */ -void mbedtls_sha256_process( mbedtls_sha256_context *ctx, const unsigned char data[64] ); - -#ifdef __cplusplus -} -#endif - -#else /* MBEDTLS_SHA256_ALT */ -#include "sha256_alt.h" -#endif /* MBEDTLS_SHA256_ALT */ - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * \brief Output = SHA-256( input buffer ) - * - * \param input buffer holding the data - * \param ilen length of the input data - * \param output SHA-224/256 checksum result - * \param is224 0 = use SHA256, 1 = use SHA224 - */ -void mbedtls_sha256( const unsigned char *input, size_t ilen, - unsigned char output[32], int is224 ); - -/** - * \brief Checkup routine - * - * \return 0 if successful, or 1 if the test failed - */ -int mbedtls_sha256_self_test( int verbose ); - -#ifdef __cplusplus -} -#endif - -#endif /* mbedtls_sha256.h */ diff --git a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/sha512.h b/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/sha512.h deleted file mode 100644 index 9462764f..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/sha512.h +++ /dev/null @@ -1,141 +0,0 @@ -/** - * \file mbedtls_sha512.h - * - * \brief SHA-384 and SHA-512 cryptographic hash function - * - * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * This file is part of mbed TLS (https://tls.mbed.org) - */ -#ifndef MBEDTLS_SHA512_H -#define MBEDTLS_SHA512_H - -#if !defined(MBEDTLS_CONFIG_FILE) -#include "config.h" -#else -#include MBEDTLS_CONFIG_FILE -#endif - -#include -#include - -#if !defined(MBEDTLS_SHA512_ALT) -// Regular implementation -// - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * \brief SHA-512 context structure - */ -typedef struct -{ - uint64_t total[2]; /*!< number of bytes processed */ - uint64_t state[8]; /*!< intermediate digest state */ - unsigned char buffer[128]; /*!< data block being processed */ - int is384; /*!< 0 => SHA-512, else SHA-384 */ -} -mbedtls_sha512_context; - -/** - * \brief Initialize SHA-512 context - * - * \param ctx SHA-512 context to be initialized - */ -void mbedtls_sha512_init( mbedtls_sha512_context *ctx ); - -/** - * \brief Clear SHA-512 context - * - * \param ctx SHA-512 context to be cleared - */ -void mbedtls_sha512_free( mbedtls_sha512_context *ctx ); - -/** - * \brief Clone (the state of) a SHA-512 context - * - * \param dst The destination context - * \param src The context to be cloned - */ -void mbedtls_sha512_clone( mbedtls_sha512_context *dst, - const mbedtls_sha512_context *src ); - -/** - * \brief SHA-512 context setup - * - * \param ctx context to be initialized - * \param is384 0 = use SHA512, 1 = use SHA384 - */ -void mbedtls_sha512_starts( mbedtls_sha512_context *ctx, int is384 ); - -/** - * \brief SHA-512 process buffer - * - * \param ctx SHA-512 context - * \param input buffer holding the data - * \param ilen length of the input data - */ -void mbedtls_sha512_update( mbedtls_sha512_context *ctx, const unsigned char *input, - size_t ilen ); - -/** - * \brief SHA-512 final digest - * - * \param ctx SHA-512 context - * \param output SHA-384/512 checksum result - */ -void mbedtls_sha512_finish( mbedtls_sha512_context *ctx, unsigned char output[64] ); - -#ifdef __cplusplus -} -#endif - -#else /* MBEDTLS_SHA512_ALT */ -#include "sha512_alt.h" -#endif /* MBEDTLS_SHA512_ALT */ - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * \brief Output = SHA-512( input buffer ) - * - * \param input buffer holding the data - * \param ilen length of the input data - * \param output SHA-384/512 checksum result - * \param is384 0 = use SHA512, 1 = use SHA384 - */ -void mbedtls_sha512( const unsigned char *input, size_t ilen, - unsigned char output[64], int is384 ); - -/** - * \brief Checkup routine - * - * \return 0 if successful, or 1 if the test failed - */ -int mbedtls_sha512_self_test( int verbose ); - -/* Internal use */ -void mbedtls_sha512_process( mbedtls_sha512_context *ctx, const unsigned char data[128] ); - -#ifdef __cplusplus -} -#endif - -#endif /* mbedtls_sha512.h */ diff --git a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/ssl.h b/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/ssl.h deleted file mode 100644 index a017ec0b..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/ssl.h +++ /dev/null @@ -1,2290 +0,0 @@ -/** - * \file ssl.h - * - * \brief SSL/TLS functions. - * - * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * This file is part of mbed TLS (https://tls.mbed.org) - */ -#ifndef MBEDTLS_SSL_H -#define MBEDTLS_SSL_H - -#if !defined(MBEDTLS_CONFIG_FILE) -#include "config.h" -#else -#include MBEDTLS_CONFIG_FILE -#endif - -#include "bignum.h" -#include "ecp.h" - -#include "ssl_ciphersuites.h" - -#if defined(MBEDTLS_X509_CRT_PARSE_C) -#include "x509_crt.h" -#include "x509_crl.h" -#endif - -#if defined(MBEDTLS_DHM_C) -#include "dhm.h" -#endif - -#if defined(MBEDTLS_ECDH_C) -#include "ecdh.h" -#endif - -#if defined(MBEDTLS_ZLIB_SUPPORT) -#include "zlib.h" -#endif - -#if defined(MBEDTLS_HAVE_TIME) -#include -#endif - -/* For convenience below and in programs */ -#if defined(MBEDTLS_KEY_EXCHANGE_PSK_ENABLED) || \ - defined(MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED) || \ - defined(MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED) || \ - defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED) -#define MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED -#endif - -#if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) || \ - defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED) || \ - defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED) -#define MBEDTLS_KEY_EXCHANGE__SOME__ECDHE_ENABLED -#endif - -#if defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED) || \ - defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) || \ - defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED) -#define MBEDTLS_KEY_EXCHANGE__SOME__SIGNATURE_ENABLED -#endif - -/* - * SSL Error codes - */ -#define MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE -0x7080 /**< The requested feature is not available. */ -#define MBEDTLS_ERR_SSL_BAD_INPUT_DATA -0x7100 /**< Bad input parameters to function. */ -#define MBEDTLS_ERR_SSL_INVALID_MAC -0x7180 /**< Verification of the message MAC failed. */ -#define MBEDTLS_ERR_SSL_INVALID_RECORD -0x7200 /**< An invalid SSL record was received. */ -#define MBEDTLS_ERR_SSL_CONN_EOF -0x7280 /**< The connection indicated an EOF. */ -#define MBEDTLS_ERR_SSL_UNKNOWN_CIPHER -0x7300 /**< An unknown cipher was received. */ -#define MBEDTLS_ERR_SSL_NO_CIPHER_CHOSEN -0x7380 /**< The server has no ciphersuites in common with the client. */ -#define MBEDTLS_ERR_SSL_NO_RNG -0x7400 /**< No RNG was provided to the SSL module. */ -#define MBEDTLS_ERR_SSL_NO_CLIENT_CERTIFICATE -0x7480 /**< No client certification received from the client, but required by the authentication mode. */ -#define MBEDTLS_ERR_SSL_CERTIFICATE_TOO_LARGE -0x7500 /**< Our own certificate(s) is/are too large to send in an SSL message. */ -#define MBEDTLS_ERR_SSL_CERTIFICATE_REQUIRED -0x7580 /**< The own certificate is not set, but needed by the server. */ -#define MBEDTLS_ERR_SSL_PRIVATE_KEY_REQUIRED -0x7600 /**< The own private key or pre-shared key is not set, but needed. */ -#define MBEDTLS_ERR_SSL_CA_CHAIN_REQUIRED -0x7680 /**< No CA Chain is set, but required to operate. */ -#define MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE -0x7700 /**< An unexpected message was received from our peer. */ -#define MBEDTLS_ERR_SSL_FATAL_ALERT_MESSAGE -0x7780 /**< A fatal alert message was received from our peer. */ -#define MBEDTLS_ERR_SSL_PEER_VERIFY_FAILED -0x7800 /**< Verification of our peer failed. */ -#define MBEDTLS_ERR_SSL_PEER_CLOSE_NOTIFY -0x7880 /**< The peer notified us that the connection is going to be closed. */ -#define MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO -0x7900 /**< Processing of the ClientHello handshake message failed. */ -#define MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO -0x7980 /**< Processing of the ServerHello handshake message failed. */ -#define MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE -0x7A00 /**< Processing of the Certificate handshake message failed. */ -#define MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE_REQUEST -0x7A80 /**< Processing of the CertificateRequest handshake message failed. */ -#define MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE -0x7B00 /**< Processing of the ServerKeyExchange handshake message failed. */ -#define MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO_DONE -0x7B80 /**< Processing of the ServerHelloDone handshake message failed. */ -#define MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE -0x7C00 /**< Processing of the ClientKeyExchange handshake message failed. */ -#define MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE_RP -0x7C80 /**< Processing of the ClientKeyExchange handshake message failed in DHM / ECDH Read Public. */ -#define MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE_CS -0x7D00 /**< Processing of the ClientKeyExchange handshake message failed in DHM / ECDH Calculate Secret. */ -#define MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE_VERIFY -0x7D80 /**< Processing of the CertificateVerify handshake message failed. */ -#define MBEDTLS_ERR_SSL_BAD_HS_CHANGE_CIPHER_SPEC -0x7E00 /**< Processing of the ChangeCipherSpec handshake message failed. */ -#define MBEDTLS_ERR_SSL_BAD_HS_FINISHED -0x7E80 /**< Processing of the Finished handshake message failed. */ -#define MBEDTLS_ERR_SSL_ALLOC_FAILED -0x7F00 /**< Memory allocation failed */ -#define MBEDTLS_ERR_SSL_HW_ACCEL_FAILED -0x7F80 /**< Hardware acceleration function returned with error */ -#define MBEDTLS_ERR_SSL_HW_ACCEL_FALLTHROUGH -0x6F80 /**< Hardware acceleration function skipped / left alone data */ -#define MBEDTLS_ERR_SSL_COMPRESSION_FAILED -0x6F00 /**< Processing of the compression / decompression failed */ -#define MBEDTLS_ERR_SSL_BAD_HS_PROTOCOL_VERSION -0x6E80 /**< Handshake protocol not within min/max boundaries */ -#define MBEDTLS_ERR_SSL_BAD_HS_NEW_SESSION_TICKET -0x6E00 /**< Processing of the NewSessionTicket handshake message failed. */ -#define MBEDTLS_ERR_SSL_SESSION_TICKET_EXPIRED -0x6D80 /**< Session ticket has expired. */ -#define MBEDTLS_ERR_SSL_PK_TYPE_MISMATCH -0x6D00 /**< Public key type mismatch (eg, asked for RSA key exchange and presented EC key) */ -#define MBEDTLS_ERR_SSL_UNKNOWN_IDENTITY -0x6C80 /**< Unknown identity received (eg, PSK identity) */ -#define MBEDTLS_ERR_SSL_INTERNAL_ERROR -0x6C00 /**< Internal error (eg, unexpected failure in lower-level module) */ -#define MBEDTLS_ERR_SSL_COUNTER_WRAPPING -0x6B80 /**< A counter would wrap (eg, too many messages exchanged). */ -#define MBEDTLS_ERR_SSL_WAITING_SERVER_HELLO_RENEGO -0x6B00 /**< Unexpected message at ServerHello in renegotiation. */ -#define MBEDTLS_ERR_SSL_HELLO_VERIFY_REQUIRED -0x6A80 /**< DTLS client must retry for hello verification */ -#define MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL -0x6A00 /**< A buffer is too small to receive or write a message */ -#define MBEDTLS_ERR_SSL_NO_USABLE_CIPHERSUITE -0x6980 /**< None of the common ciphersuites is usable (eg, no suitable certificate, see debug messages). */ -#define MBEDTLS_ERR_SSL_WANT_READ -0x6900 /**< Connection requires a read call. */ -#define MBEDTLS_ERR_SSL_WANT_WRITE -0x6880 /**< Connection requires a write call. */ -#define MBEDTLS_ERR_SSL_TIMEOUT -0x6800 /**< The operation timed out. */ -#define MBEDTLS_ERR_SSL_CLIENT_RECONNECT -0x6780 /**< The client initiated a reconnect from the same port. */ - -/* - * Various constants - */ -#define MBEDTLS_SSL_MAJOR_VERSION_3 3 -#define MBEDTLS_SSL_MINOR_VERSION_0 0 /*!< SSL v3.0 */ -#define MBEDTLS_SSL_MINOR_VERSION_1 1 /*!< TLS v1.0 */ -#define MBEDTLS_SSL_MINOR_VERSION_2 2 /*!< TLS v1.1 */ -#define MBEDTLS_SSL_MINOR_VERSION_3 3 /*!< TLS v1.2 */ - -#define MBEDTLS_SSL_TRANSPORT_STREAM 0 /*!< TLS */ -#define MBEDTLS_SSL_TRANSPORT_DATAGRAM 1 /*!< DTLS */ - -#define MBEDTLS_SSL_MAX_HOST_NAME_LEN 255 /*!< Maximum host name defined in RFC 1035 */ - -/* RFC 6066 section 4, see also mfl_code_to_length in ssl_tls.c - * NONE must be zero so that memset()ing structure to zero works */ -#define MBEDTLS_SSL_MAX_FRAG_LEN_NONE 0 /*!< don't use this extension */ -#define MBEDTLS_SSL_MAX_FRAG_LEN_512 1 /*!< MaxFragmentLength 2^9 */ -#define MBEDTLS_SSL_MAX_FRAG_LEN_1024 2 /*!< MaxFragmentLength 2^10 */ -#define MBEDTLS_SSL_MAX_FRAG_LEN_2048 3 /*!< MaxFragmentLength 2^11 */ -#define MBEDTLS_SSL_MAX_FRAG_LEN_4096 4 /*!< MaxFragmentLength 2^12 */ -#define MBEDTLS_SSL_MAX_FRAG_LEN_INVALID 5 /*!< first invalid value */ - -#define MBEDTLS_SSL_IS_CLIENT 0 -#define MBEDTLS_SSL_IS_SERVER 1 - -#define MBEDTLS_SSL_IS_NOT_FALLBACK 0 -#define MBEDTLS_SSL_IS_FALLBACK 1 - -#define MBEDTLS_SSL_EXTENDED_MS_DISABLED 0 -#define MBEDTLS_SSL_EXTENDED_MS_ENABLED 1 - -#define MBEDTLS_SSL_ETM_DISABLED 0 -#define MBEDTLS_SSL_ETM_ENABLED 1 - -#define MBEDTLS_SSL_COMPRESS_NULL 0 -#define MBEDTLS_SSL_COMPRESS_DEFLATE 1 - -#define MBEDTLS_SSL_VERIFY_NONE 0 -#define MBEDTLS_SSL_VERIFY_OPTIONAL 1 -#define MBEDTLS_SSL_VERIFY_REQUIRED 2 -#define MBEDTLS_SSL_VERIFY_UNSET 3 /* Used only for sni_authmode */ - -#define MBEDTLS_SSL_LEGACY_RENEGOTIATION 0 -#define MBEDTLS_SSL_SECURE_RENEGOTIATION 1 - -#define MBEDTLS_SSL_RENEGOTIATION_DISABLED 0 -#define MBEDTLS_SSL_RENEGOTIATION_ENABLED 1 - -#define MBEDTLS_SSL_ANTI_REPLAY_DISABLED 0 -#define MBEDTLS_SSL_ANTI_REPLAY_ENABLED 1 - -#define MBEDTLS_SSL_RENEGOTIATION_NOT_ENFORCED -1 -#define MBEDTLS_SSL_RENEGO_MAX_RECORDS_DEFAULT 16 - -#define MBEDTLS_SSL_LEGACY_NO_RENEGOTIATION 0 -#define MBEDTLS_SSL_LEGACY_ALLOW_RENEGOTIATION 1 -#define MBEDTLS_SSL_LEGACY_BREAK_HANDSHAKE 2 - -#define MBEDTLS_SSL_TRUNC_HMAC_DISABLED 0 -#define MBEDTLS_SSL_TRUNC_HMAC_ENABLED 1 -#define MBEDTLS_SSL_TRUNCATED_HMAC_LEN 10 /* 80 bits, rfc 6066 section 7 */ - -#define MBEDTLS_SSL_SESSION_TICKETS_DISABLED 0 -#define MBEDTLS_SSL_SESSION_TICKETS_ENABLED 1 - -#define MBEDTLS_SSL_CBC_RECORD_SPLITTING_DISABLED 0 -#define MBEDTLS_SSL_CBC_RECORD_SPLITTING_ENABLED 1 - -#define MBEDTLS_SSL_ARC4_ENABLED 0 -#define MBEDTLS_SSL_ARC4_DISABLED 1 - -#define MBEDTLS_SSL_PRESET_DEFAULT 0 -#define MBEDTLS_SSL_PRESET_SUITEB 2 - -/* - * Default range for DTLS retransmission timer value, in milliseconds. - * RFC 6347 4.2.4.1 says from 1 second to 60 seconds. - */ -#define MBEDTLS_SSL_DTLS_TIMEOUT_DFL_MIN 1000 -#define MBEDTLS_SSL_DTLS_TIMEOUT_DFL_MAX 60000 - -/** - * \name SECTION: Module settings - * - * The configuration options you can set for this module are in this section. - * Either change them in config.h or define them on the compiler command line. - * \{ - */ - -#if !defined(MBEDTLS_SSL_DEFAULT_TICKET_LIFETIME) -#define MBEDTLS_SSL_DEFAULT_TICKET_LIFETIME 86400 /**< Lifetime of session tickets (if enabled) */ -#endif - -/* - * Maxium fragment length in bytes, - * determines the size of each of the two internal I/O buffers. - * - * Note: the RFC defines the default size of SSL / TLS messages. If you - * change the value here, other clients / servers may not be able to - * communicate with you anymore. Only change this value if you control - * both sides of the connection and have it reduced at both sides, or - * if you're using the Max Fragment Length extension and you know all your - * peers are using it too! - */ -#if !defined(MBEDTLS_SSL_MAX_CONTENT_LEN) -#define MBEDTLS_SSL_MAX_CONTENT_LEN 16384 /**< Size of the input / output buffer */ -#endif - -/* \} name SECTION: Module settings */ - -/* - * Length of the verify data for secure renegotiation - */ -#if defined(MBEDTLS_SSL_PROTO_SSL3) -#define MBEDTLS_SSL_VERIFY_DATA_MAX_LEN 36 -#else -#define MBEDTLS_SSL_VERIFY_DATA_MAX_LEN 12 -#endif - -/* - * Signaling ciphersuite values (SCSV) - */ -#define MBEDTLS_SSL_EMPTY_RENEGOTIATION_INFO 0xFF /**< renegotiation info ext */ -#define MBEDTLS_SSL_FALLBACK_SCSV_VALUE 0x5600 /**< draft-ietf-tls-downgrade-scsv-00 */ - -/* - * Supported Signature and Hash algorithms (For TLS 1.2) - * RFC 5246 section 7.4.1.4.1 - */ -#define MBEDTLS_SSL_HASH_NONE 0 -#define MBEDTLS_SSL_HASH_MD5 1 -#define MBEDTLS_SSL_HASH_SHA1 2 -#define MBEDTLS_SSL_HASH_SHA224 3 -#define MBEDTLS_SSL_HASH_SHA256 4 -#define MBEDTLS_SSL_HASH_SHA384 5 -#define MBEDTLS_SSL_HASH_SHA512 6 - -#define MBEDTLS_SSL_SIG_ANON 0 -#define MBEDTLS_SSL_SIG_RSA 1 -#define MBEDTLS_SSL_SIG_ECDSA 3 - -/* - * Client Certificate Types - * RFC 5246 section 7.4.4 plus RFC 4492 section 5.5 - */ -#define MBEDTLS_SSL_CERT_TYPE_RSA_SIGN 1 -#define MBEDTLS_SSL_CERT_TYPE_ECDSA_SIGN 64 - -/* - * Message, alert and handshake types - */ -#define MBEDTLS_SSL_MSG_CHANGE_CIPHER_SPEC 20 -#define MBEDTLS_SSL_MSG_ALERT 21 -#define MBEDTLS_SSL_MSG_HANDSHAKE 22 -#define MBEDTLS_SSL_MSG_APPLICATION_DATA 23 - -#define MBEDTLS_SSL_ALERT_LEVEL_WARNING 1 -#define MBEDTLS_SSL_ALERT_LEVEL_FATAL 2 - -#define MBEDTLS_SSL_ALERT_MSG_CLOSE_NOTIFY 0 /* 0x00 */ -#define MBEDTLS_SSL_ALERT_MSG_UNEXPECTED_MESSAGE 10 /* 0x0A */ -#define MBEDTLS_SSL_ALERT_MSG_BAD_RECORD_MAC 20 /* 0x14 */ -#define MBEDTLS_SSL_ALERT_MSG_DECRYPTION_FAILED 21 /* 0x15 */ -#define MBEDTLS_SSL_ALERT_MSG_RECORD_OVERFLOW 22 /* 0x16 */ -#define MBEDTLS_SSL_ALERT_MSG_DECOMPRESSION_FAILURE 30 /* 0x1E */ -#define MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE 40 /* 0x28 */ -#define MBEDTLS_SSL_ALERT_MSG_NO_CERT 41 /* 0x29 */ -#define MBEDTLS_SSL_ALERT_MSG_BAD_CERT 42 /* 0x2A */ -#define MBEDTLS_SSL_ALERT_MSG_UNSUPPORTED_CERT 43 /* 0x2B */ -#define MBEDTLS_SSL_ALERT_MSG_CERT_REVOKED 44 /* 0x2C */ -#define MBEDTLS_SSL_ALERT_MSG_CERT_EXPIRED 45 /* 0x2D */ -#define MBEDTLS_SSL_ALERT_MSG_CERT_UNKNOWN 46 /* 0x2E */ -#define MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER 47 /* 0x2F */ -#define MBEDTLS_SSL_ALERT_MSG_UNKNOWN_CA 48 /* 0x30 */ -#define MBEDTLS_SSL_ALERT_MSG_ACCESS_DENIED 49 /* 0x31 */ -#define MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR 50 /* 0x32 */ -#define MBEDTLS_SSL_ALERT_MSG_DECRYPT_ERROR 51 /* 0x33 */ -#define MBEDTLS_SSL_ALERT_MSG_EXPORT_RESTRICTION 60 /* 0x3C */ -#define MBEDTLS_SSL_ALERT_MSG_PROTOCOL_VERSION 70 /* 0x46 */ -#define MBEDTLS_SSL_ALERT_MSG_INSUFFICIENT_SECURITY 71 /* 0x47 */ -#define MBEDTLS_SSL_ALERT_MSG_INTERNAL_ERROR 80 /* 0x50 */ -#define MBEDTLS_SSL_ALERT_MSG_INAPROPRIATE_FALLBACK 86 /* 0x56 */ -#define MBEDTLS_SSL_ALERT_MSG_USER_CANCELED 90 /* 0x5A */ -#define MBEDTLS_SSL_ALERT_MSG_NO_RENEGOTIATION 100 /* 0x64 */ -#define MBEDTLS_SSL_ALERT_MSG_UNSUPPORTED_EXT 110 /* 0x6E */ -#define MBEDTLS_SSL_ALERT_MSG_UNRECOGNIZED_NAME 112 /* 0x70 */ -#define MBEDTLS_SSL_ALERT_MSG_UNKNOWN_PSK_IDENTITY 115 /* 0x73 */ -#define MBEDTLS_SSL_ALERT_MSG_NO_APPLICATION_PROTOCOL 120 /* 0x78 */ - -#define MBEDTLS_SSL_HS_HELLO_REQUEST 0 -#define MBEDTLS_SSL_HS_CLIENT_HELLO 1 -#define MBEDTLS_SSL_HS_SERVER_HELLO 2 -#define MBEDTLS_SSL_HS_HELLO_VERIFY_REQUEST 3 -#define MBEDTLS_SSL_HS_NEW_SESSION_TICKET 4 -#define MBEDTLS_SSL_HS_CERTIFICATE 11 -#define MBEDTLS_SSL_HS_SERVER_KEY_EXCHANGE 12 -#define MBEDTLS_SSL_HS_CERTIFICATE_REQUEST 13 -#define MBEDTLS_SSL_HS_SERVER_HELLO_DONE 14 -#define MBEDTLS_SSL_HS_CERTIFICATE_VERIFY 15 -#define MBEDTLS_SSL_HS_CLIENT_KEY_EXCHANGE 16 -#define MBEDTLS_SSL_HS_FINISHED 20 - -/* - * TLS extensions - */ -#define MBEDTLS_TLS_EXT_SERVERNAME 0 -#define MBEDTLS_TLS_EXT_SERVERNAME_HOSTNAME 0 - -#define MBEDTLS_TLS_EXT_MAX_FRAGMENT_LENGTH 1 - -#define MBEDTLS_TLS_EXT_TRUNCATED_HMAC 4 - -#define MBEDTLS_TLS_EXT_SUPPORTED_ELLIPTIC_CURVES 10 -#define MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS 11 - -#define MBEDTLS_TLS_EXT_SIG_ALG 13 - -#define MBEDTLS_TLS_EXT_ALPN 16 - -#define MBEDTLS_TLS_EXT_ENCRYPT_THEN_MAC 22 /* 0x16 */ -#define MBEDTLS_TLS_EXT_EXTENDED_MASTER_SECRET 0x0017 /* 23 */ - -#define MBEDTLS_TLS_EXT_SESSION_TICKET 35 - -#define MBEDTLS_TLS_EXT_RENEGOTIATION_INFO 0xFF01 - -/* - * Size defines - */ -#if !defined(MBEDTLS_PSK_MAX_LEN) -#define MBEDTLS_PSK_MAX_LEN 32 /* 256 bits */ -#endif - -/* Dummy type used only for its size */ -union mbedtls_ssl_premaster_secret -{ -#if defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED) - unsigned char _pms_rsa[48]; /* RFC 5246 8.1.1 */ -#endif -#if defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED) - unsigned char _pms_dhm[MBEDTLS_MPI_MAX_SIZE]; /* RFC 5246 8.1.2 */ -#endif -#if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) || \ - defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED) || \ - defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) || \ - defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED) - unsigned char _pms_ecdh[MBEDTLS_ECP_MAX_BYTES]; /* RFC 4492 5.10 */ -#endif -#if defined(MBEDTLS_KEY_EXCHANGE_PSK_ENABLED) - unsigned char _pms_psk[4 + 2 * MBEDTLS_PSK_MAX_LEN]; /* RFC 4279 2 */ -#endif -#if defined(MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED) - unsigned char _pms_dhe_psk[4 + MBEDTLS_MPI_MAX_SIZE - + MBEDTLS_PSK_MAX_LEN]; /* RFC 4279 3 */ -#endif -#if defined(MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED) - unsigned char _pms_rsa_psk[52 + MBEDTLS_PSK_MAX_LEN]; /* RFC 4279 4 */ -#endif -#if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED) - unsigned char _pms_ecdhe_psk[4 + MBEDTLS_ECP_MAX_BYTES - + MBEDTLS_PSK_MAX_LEN]; /* RFC 5489 2 */ -#endif -}; - -#define MBEDTLS_PREMASTER_SIZE sizeof( union mbedtls_ssl_premaster_secret ) - -#ifdef __cplusplus -extern "C" { -#endif - -/* - * SSL state machine - */ -typedef enum -{ - MBEDTLS_SSL_HELLO_REQUEST, - MBEDTLS_SSL_CLIENT_HELLO, - MBEDTLS_SSL_SERVER_HELLO, - MBEDTLS_SSL_SERVER_CERTIFICATE, - MBEDTLS_SSL_SERVER_KEY_EXCHANGE, - MBEDTLS_SSL_CERTIFICATE_REQUEST, - MBEDTLS_SSL_SERVER_HELLO_DONE, - MBEDTLS_SSL_CLIENT_CERTIFICATE, - MBEDTLS_SSL_CLIENT_KEY_EXCHANGE, - MBEDTLS_SSL_CERTIFICATE_VERIFY, - MBEDTLS_SSL_CLIENT_CHANGE_CIPHER_SPEC, - MBEDTLS_SSL_CLIENT_FINISHED, - MBEDTLS_SSL_SERVER_CHANGE_CIPHER_SPEC, - MBEDTLS_SSL_SERVER_FINISHED, - MBEDTLS_SSL_FLUSH_BUFFERS, - MBEDTLS_SSL_HANDSHAKE_WRAPUP, - MBEDTLS_SSL_HANDSHAKE_OVER, - MBEDTLS_SSL_SERVER_NEW_SESSION_TICKET, - MBEDTLS_SSL_SERVER_HELLO_VERIFY_REQUEST_SENT, -} -mbedtls_ssl_states; - -/* Defined below */ -typedef struct mbedtls_ssl_session mbedtls_ssl_session; -typedef struct mbedtls_ssl_context mbedtls_ssl_context; -typedef struct mbedtls_ssl_config mbedtls_ssl_config; - -/* Defined in ssl_internal.h */ -typedef struct mbedtls_ssl_transform mbedtls_ssl_transform; -typedef struct mbedtls_ssl_handshake_params mbedtls_ssl_handshake_params; -#if defined(MBEDTLS_X509_CRT_PARSE_C) -typedef struct mbedtls_ssl_key_cert mbedtls_ssl_key_cert; -#endif -#if defined(MBEDTLS_SSL_PROTO_DTLS) -typedef struct mbedtls_ssl_flight_item mbedtls_ssl_flight_item; -#endif - -/* - * This structure is used for storing current session data. - */ -struct mbedtls_ssl_session -{ -#if defined(MBEDTLS_HAVE_TIME) - time_t start; /*!< starting time */ -#endif - int ciphersuite; /*!< chosen ciphersuite */ - int compression; /*!< chosen compression */ - size_t id_len; /*!< session id length */ - unsigned char id[32]; /*!< session identifier */ - unsigned char master[48]; /*!< the master secret */ - -#if defined(MBEDTLS_X509_CRT_PARSE_C) - mbedtls_x509_crt *peer_cert; /*!< peer X.509 cert chain */ -#endif /* MBEDTLS_X509_CRT_PARSE_C */ - uint32_t verify_result; /*!< verification result */ - -#if defined(MBEDTLS_SSL_SESSION_TICKETS) && defined(MBEDTLS_SSL_CLI_C) - unsigned char *ticket; /*!< RFC 5077 session ticket */ - size_t ticket_len; /*!< session ticket length */ - uint32_t ticket_lifetime; /*!< ticket lifetime hint */ -#endif /* MBEDTLS_SSL_SESSION_TICKETS && MBEDTLS_SSL_CLI_C */ - -#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH) - unsigned char mfl_code; /*!< MaxFragmentLength negotiated by peer */ -#endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */ - -#if defined(MBEDTLS_SSL_TRUNCATED_HMAC) - int trunc_hmac; /*!< flag for truncated hmac activation */ -#endif /* MBEDTLS_SSL_TRUNCATED_HMAC */ - -#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC) - int encrypt_then_mac; /*!< flag for EtM activation */ -#endif -}; - -/** - * SSL/TLS configuration to be shared between mbedtls_ssl_context structures. - */ -struct mbedtls_ssl_config -{ - /* Group items by size (largest first) to minimize padding overhead */ - - /* - * Pointers - */ - - const int *ciphersuite_list[4]; /*!< allowed ciphersuites per version */ - - /** Callback for printing debug output */ - void (*f_dbg)(void *, int, const char *, int, const char *); - void *p_dbg; /*!< context for the debug function */ - - /** Callback for getting (pseudo-)random numbers */ - int (*f_rng)(void *, unsigned char *, size_t); - void *p_rng; /*!< context for the RNG function */ - - /** Callback to retrieve a session from the cache */ - int (*f_get_cache)(void *, mbedtls_ssl_session *); - /** Callback to store a session into the cache */ - int (*f_set_cache)(void *, const mbedtls_ssl_session *); - void *p_cache; /*!< context for cache callbacks */ - -#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION) - /** Callback for setting cert according to SNI extension */ - int (*f_sni)(void *, mbedtls_ssl_context *, const unsigned char *, size_t); - void *p_sni; /*!< context for SNI callback */ -#endif - -#if defined(MBEDTLS_X509_CRT_PARSE_C) - /** Callback to customize X.509 certificate chain verification */ - int (*f_vrfy)(void *, mbedtls_x509_crt *, int, uint32_t *); - void *p_vrfy; /*!< context for X.509 verify calllback */ -#endif - -#if defined(MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED) - /** Callback to retrieve PSK key from identity */ - int (*f_psk)(void *, mbedtls_ssl_context *, const unsigned char *, size_t); - void *p_psk; /*!< context for PSK callback */ -#endif - -#if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY) && defined(MBEDTLS_SSL_SRV_C) - /** Callback to create & write a cookie for ClientHello veirifcation */ - int (*f_cookie_write)( void *, unsigned char **, unsigned char *, - const unsigned char *, size_t ); - /** Callback to verify validity of a ClientHello cookie */ - int (*f_cookie_check)( void *, const unsigned char *, size_t, - const unsigned char *, size_t ); - void *p_cookie; /*!< context for the cookie callbacks */ -#endif - -#if defined(MBEDTLS_SSL_SESSION_TICKETS) && defined(MBEDTLS_SSL_SRV_C) - /** Callback to create & write a session ticket */ - int (*f_ticket_write)( void *, const mbedtls_ssl_session *, - unsigned char *, const unsigned char *, size_t *, uint32_t * ); - /** Callback to parse a session ticket into a session structure */ - int (*f_ticket_parse)( void *, mbedtls_ssl_session *, unsigned char *, size_t); - void *p_ticket; /*!< context for the ticket callbacks */ -#endif /* MBEDTLS_SSL_SESSION_TICKETS && MBEDTLS_SSL_SRV_C */ - -#if defined(MBEDTLS_X509_CRT_PARSE_C) - const mbedtls_x509_crt_profile *cert_profile; /*!< verification profile */ - mbedtls_ssl_key_cert *key_cert; /*!< own certificate/key pair(s) */ - mbedtls_x509_crt *ca_chain; /*!< trusted CAs */ - mbedtls_x509_crl *ca_crl; /*!< trusted CAs CRLs */ -#endif /* MBEDTLS_X509_CRT_PARSE_C */ - -#if defined(MBEDTLS_KEY_EXCHANGE__SOME__SIGNATURE_ENABLED) - const int *sig_hashes; /*!< allowed signature hashes */ -#endif - -#if defined(MBEDTLS_ECP_C) - const mbedtls_ecp_group_id *curve_list; /*!< allowed curves */ -#endif - -#if defined(MBEDTLS_DHM_C) - mbedtls_mpi dhm_P; /*!< prime modulus for DHM */ - mbedtls_mpi dhm_G; /*!< generator for DHM */ -#endif - -#if defined(MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED) - unsigned char *psk; /*!< pre-shared key */ - size_t psk_len; /*!< length of the pre-shared key */ - unsigned char *psk_identity; /*!< identity for PSK negotiation */ - size_t psk_identity_len;/*!< length of identity */ -#endif - -#if defined(MBEDTLS_SSL_ALPN) - const char **alpn_list; /*!< ordered list of protocols */ -#endif - - /* - * Numerical settings (int then char) - */ - - uint32_t read_timeout; /*!< timeout for mbedtls_ssl_read (ms) */ - -#if defined(MBEDTLS_SSL_PROTO_DTLS) - uint32_t hs_timeout_min; /*!< initial value of the handshake - retransmission timeout (ms) */ - uint32_t hs_timeout_max; /*!< maximum value of the handshake - retransmission timeout (ms) */ -#endif - -#if defined(MBEDTLS_SSL_RENEGOTIATION) - int renego_max_records; /*!< grace period for renegotiation */ - unsigned char renego_period[8]; /*!< value of the record counters - that triggers renegotiation */ -#endif - -#if defined(MBEDTLS_SSL_DTLS_BADMAC_LIMIT) - unsigned int badmac_limit; /*!< limit of records with a bad MAC */ -#endif - -#if defined(MBEDTLS_DHM_C) && defined(MBEDTLS_SSL_CLI_C) - unsigned int dhm_min_bitlen; /*!< min. bit length of the DHM prime */ -#endif - - unsigned char max_major_ver; /*!< max. major version used */ - unsigned char max_minor_ver; /*!< max. minor version used */ - unsigned char min_major_ver; /*!< min. major version used */ - unsigned char min_minor_ver; /*!< min. minor version used */ - - /* - * Flags (bitfields) - */ - - unsigned int endpoint : 1; /*!< 0: client, 1: server */ - unsigned int transport : 1; /*!< stream (TLS) or datagram (DTLS) */ - unsigned int authmode : 2; /*!< MBEDTLS_SSL_VERIFY_XXX */ - /* needed even with renego disabled for LEGACY_BREAK_HANDSHAKE */ - unsigned int allow_legacy_renegotiation : 2 ; /*!< MBEDTLS_LEGACY_XXX */ -#if defined(MBEDTLS_ARC4_C) - unsigned int arc4_disabled : 1; /*!< blacklist RC4 ciphersuites? */ -#endif -#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH) - unsigned int mfl_code : 3; /*!< desired fragment length */ -#endif -#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC) - unsigned int encrypt_then_mac : 1 ; /*!< negotiate encrypt-then-mac? */ -#endif -#if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET) - unsigned int extended_ms : 1; /*!< negotiate extended master secret? */ -#endif -#if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY) - unsigned int anti_replay : 1; /*!< detect and prevent replay? */ -#endif -#if defined(MBEDTLS_SSL_CBC_RECORD_SPLITTING) - unsigned int cbc_record_splitting : 1; /*!< do cbc record splitting */ -#endif -#if defined(MBEDTLS_SSL_RENEGOTIATION) - unsigned int disable_renegotiation : 1; /*!< disable renegotiation? */ -#endif -#if defined(MBEDTLS_SSL_TRUNCATED_HMAC) - unsigned int trunc_hmac : 1; /*!< negotiate truncated hmac? */ -#endif -#if defined(MBEDTLS_SSL_SESSION_TICKETS) - unsigned int session_tickets : 1; /*!< use session tickets? */ -#endif -#if defined(MBEDTLS_SSL_FALLBACK_SCSV) && defined(MBEDTLS_SSL_CLI_C) - unsigned int fallback : 1; /*!< is this a fallback? */ -#endif -}; - - -struct mbedtls_ssl_context -{ - const mbedtls_ssl_config *conf; /*!< configuration information */ - - /* - * Miscellaneous - */ - int state; /*!< SSL handshake: current state */ -#if defined(MBEDTLS_SSL_RENEGOTIATION) - int renego_status; /*!< Initial, in progress, pending? */ - int renego_records_seen; /*!< Records since renego request, or with DTLS, - number of retransmissions of request if - renego_max_records is < 0 */ -#endif - - int major_ver; /*!< equal to MBEDTLS_SSL_MAJOR_VERSION_3 */ - int minor_ver; /*!< either 0 (SSL3) or 1 (TLS1.0) */ - -#if defined(MBEDTLS_SSL_DTLS_BADMAC_LIMIT) - unsigned badmac_seen; /*!< records with a bad MAC received */ -#endif - - /* - * Callbacks - */ - int (*f_send)(void *, const unsigned char *, size_t); - int (*f_recv)(void *, unsigned char *, size_t); - int (*f_recv_timeout)(void *, unsigned char *, size_t, uint32_t); - void *p_bio; /*!< context for I/O operations */ - - /* - * Session layer - */ - mbedtls_ssl_session *session_in; /*!< current session data (in) */ - mbedtls_ssl_session *session_out; /*!< current session data (out) */ - mbedtls_ssl_session *session; /*!< negotiated session data */ - mbedtls_ssl_session *session_negotiate; /*!< session data in negotiation */ - - mbedtls_ssl_handshake_params *handshake; /*!< params required only during - the handshake process */ - - /* - * Record layer transformations - */ - mbedtls_ssl_transform *transform_in; /*!< current transform params (in) */ - mbedtls_ssl_transform *transform_out; /*!< current transform params (in) */ - mbedtls_ssl_transform *transform; /*!< negotiated transform params */ - mbedtls_ssl_transform *transform_negotiate; /*!< transform params in negotiation */ - - /* - * Timers - */ - void *p_timer; /*!< context for the timer callbacks */ - void (*f_set_timer)(void *, uint32_t, uint32_t); /*!< set timer callback */ - int (*f_get_timer)(void *); /*!< get timer callback */ - - /* - * Record layer (incoming data) - */ - unsigned char *in_buf; /*!< input buffer */ - unsigned char *in_ctr; /*!< 64-bit incoming message counter - TLS: maintained by us - DTLS: read from peer */ - unsigned char *in_hdr; /*!< start of record header */ - unsigned char *in_len; /*!< two-bytes message length field */ - unsigned char *in_iv; /*!< ivlen-byte IV */ - unsigned char *in_msg; /*!< message contents (in_iv+ivlen) */ - unsigned char *in_offt; /*!< read offset in application data */ - - int in_msgtype; /*!< record header: message type */ - size_t in_msglen; /*!< record header: message length */ - size_t in_left; /*!< amount of data read so far */ -#if defined(MBEDTLS_SSL_PROTO_DTLS) - uint16_t in_epoch; /*!< DTLS epoch for incoming records */ - size_t next_record_offset; /*!< offset of the next record in datagram - (equal to in_left if none) */ -#endif -#if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY) - uint64_t in_window_top; /*!< last validated record seq_num */ - uint64_t in_window; /*!< bitmask for replay detection */ -#endif - - size_t in_hslen; /*!< current handshake message length, - including the handshake header */ - int nb_zero; /*!< # of 0-length encrypted messages */ - int record_read; /*!< record is already present */ - - /* - * Record layer (outgoing data) - */ - unsigned char *out_buf; /*!< output buffer */ - unsigned char *out_ctr; /*!< 64-bit outgoing message counter */ - unsigned char *out_hdr; /*!< start of record header */ - unsigned char *out_len; /*!< two-bytes message length field */ - unsigned char *out_iv; /*!< ivlen-byte IV */ - unsigned char *out_msg; /*!< message contents (out_iv+ivlen) */ - - int out_msgtype; /*!< record header: message type */ - size_t out_msglen; /*!< record header: message length */ - size_t out_left; /*!< amount of data not yet written */ - -#if defined(MBEDTLS_ZLIB_SUPPORT) - unsigned char *compress_buf; /*!< zlib data buffer */ -#endif -#if defined(MBEDTLS_SSL_CBC_RECORD_SPLITTING) - signed char split_done; /*!< current record already splitted? */ -#endif - - /* - * PKI layer - */ - int client_auth; /*!< flag for client auth. */ - - /* - * User settings - */ -#if defined(MBEDTLS_X509_CRT_PARSE_C) - char *hostname; /*!< expected peer CN for verification - (and SNI if available) */ -#endif - -#if defined(MBEDTLS_SSL_ALPN) - const char *alpn_chosen; /*!< negotiated protocol */ -#endif - - /* - * Information for DTLS hello verify - */ -#if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY) && defined(MBEDTLS_SSL_SRV_C) - unsigned char *cli_id; /*!< transport-level ID of the client */ - size_t cli_id_len; /*!< length of cli_id */ -#endif - - /* - * Secure renegotiation - */ - /* needed to know when to send extension on server */ - int secure_renegotiation; /*!< does peer support legacy or - secure renegotiation */ -#if defined(MBEDTLS_SSL_RENEGOTIATION) - size_t verify_data_len; /*!< length of verify data stored */ - char own_verify_data[MBEDTLS_SSL_VERIFY_DATA_MAX_LEN]; /*!< previous handshake verify data */ - char peer_verify_data[MBEDTLS_SSL_VERIFY_DATA_MAX_LEN]; /*!< previous handshake verify data */ -#endif -}; - -#if defined(MBEDTLS_SSL_HW_RECORD_ACCEL) - -#define MBEDTLS_SSL_CHANNEL_OUTBOUND 0 -#define MBEDTLS_SSL_CHANNEL_INBOUND 1 - -extern int (*mbedtls_ssl_hw_record_init)(mbedtls_ssl_context *ssl, - const unsigned char *key_enc, const unsigned char *key_dec, - size_t keylen, - const unsigned char *iv_enc, const unsigned char *iv_dec, - size_t ivlen, - const unsigned char *mac_enc, const unsigned char *mac_dec, - size_t maclen); -extern int (*mbedtls_ssl_hw_record_activate)(mbedtls_ssl_context *ssl, int direction); -extern int (*mbedtls_ssl_hw_record_reset)(mbedtls_ssl_context *ssl); -extern int (*mbedtls_ssl_hw_record_write)(mbedtls_ssl_context *ssl); -extern int (*mbedtls_ssl_hw_record_read)(mbedtls_ssl_context *ssl); -extern int (*mbedtls_ssl_hw_record_finish)(mbedtls_ssl_context *ssl); -#endif /* MBEDTLS_SSL_HW_RECORD_ACCEL */ - -/** - * \brief Returns the list of ciphersuites supported by the SSL/TLS module. - * - * \return a statically allocated array of ciphersuites, the last - * entry is 0. - */ -const int *mbedtls_ssl_list_ciphersuites( void ); - -/** - * \brief Return the name of the ciphersuite associated with the - * given ID - * - * \param ciphersuite_id SSL ciphersuite ID - * - * \return a string containing the ciphersuite name - */ -const char *mbedtls_ssl_get_ciphersuite_name( const int ciphersuite_id ); - -/** - * \brief Return the ID of the ciphersuite associated with the - * given name - * - * \param ciphersuite_name SSL ciphersuite name - * - * \return the ID with the ciphersuite or 0 if not found - */ -int mbedtls_ssl_get_ciphersuite_id( const char *ciphersuite_name ); - -/** - * \brief Initialize an SSL context - * Just makes the context ready for mbedtls_ssl_setup() or - * mbedtls_ssl_free() - * - * \param ssl SSL context - */ -void mbedtls_ssl_init( mbedtls_ssl_context *ssl ); - -/** - * \brief Set up an SSL context for use - * - * \note No copy of the configuration context is made, it can be - * shared by many mbedtls_ssl_context structures. - * - * \warning Modifying the conf structure after is has been used in this - * function is unsupported! - * - * \param ssl SSL context - * \param conf SSL configuration to use - * - * \return 0 if successful, or MBEDTLS_ERR_SSL_ALLOC_FAILED if - * memory allocation failed - */ -int mbedtls_ssl_setup( mbedtls_ssl_context *ssl, - const mbedtls_ssl_config *conf ); - -/** - * \brief Reset an already initialized SSL context for re-use - * while retaining application-set variables, function - * pointers and data. - * - * \param ssl SSL context - * \return 0 if successful, or POLASSL_ERR_SSL_MALLOC_FAILED, - MBEDTLS_ERR_SSL_HW_ACCEL_FAILED or - * MBEDTLS_ERR_SSL_COMPRESSION_FAILED - */ -int mbedtls_ssl_session_reset( mbedtls_ssl_context *ssl ); - -/** - * \brief Set the current endpoint type - * - * \param conf SSL configuration - * \param endpoint must be MBEDTLS_SSL_IS_CLIENT or MBEDTLS_SSL_IS_SERVER - */ -void mbedtls_ssl_conf_endpoint( mbedtls_ssl_config *conf, int endpoint ); - -/** - * \brief Set the transport type (TLS or DTLS). - * Default: TLS - * - * \note For DTLS, you must either provide a recv callback that - * doesn't block, or one that handles timeouts, see - * \c mbedtls_ssl_set_bio(). You also need to provide timer - * callbacks with \c mbedtls_ssl_set_timer_cb(). - * - * \param conf SSL configuration - * \param transport transport type: - * MBEDTLS_SSL_TRANSPORT_STREAM for TLS, - * MBEDTLS_SSL_TRANSPORT_DATAGRAM for DTLS. - */ -void mbedtls_ssl_conf_transport( mbedtls_ssl_config *conf, int transport ); - -/** - * \brief Set the certificate verification mode - * Default: NONE on server, REQUIRED on client - * - * \param conf SSL configuration - * \param authmode can be: - * - * MBEDTLS_SSL_VERIFY_NONE: peer certificate is not checked - * (default on server) - * (insecure on client) - * - * MBEDTLS_SSL_VERIFY_OPTIONAL: peer certificate is checked, however the - * handshake continues even if verification failed; - * mbedtls_ssl_get_verify_result() can be called after the - * handshake is complete. - * - * MBEDTLS_SSL_VERIFY_REQUIRED: peer *must* present a valid certificate, - * handshake is aborted if verification failed. - * - * \note On client, MBEDTLS_SSL_VERIFY_REQUIRED is the recommended mode. - * With MBEDTLS_SSL_VERIFY_OPTIONAL, the user needs to call mbedtls_ssl_get_verify_result() at - * the right time(s), which may not be obvious, while REQUIRED always perform - * the verification as soon as possible. For example, REQUIRED was protecting - * against the "triple handshake" attack even before it was found. - */ -void mbedtls_ssl_conf_authmode( mbedtls_ssl_config *conf, int authmode ); - -#if defined(MBEDTLS_X509_CRT_PARSE_C) -/** - * \brief Set the verification callback (Optional). - * - * If set, the verify callback is called for each - * certificate in the chain. For implementation - * information, please see \c x509parse_verify() - * - * \param conf SSL configuration - * \param f_vrfy verification function - * \param p_vrfy verification parameter - */ -void mbedtls_ssl_conf_verify( mbedtls_ssl_config *conf, - int (*f_vrfy)(void *, mbedtls_x509_crt *, int, uint32_t *), - void *p_vrfy ); -#endif /* MBEDTLS_X509_CRT_PARSE_C */ - -/** - * \brief Set the random number generator callback - * - * \param conf SSL configuration - * \param f_rng RNG function - * \param p_rng RNG parameter - */ -void mbedtls_ssl_conf_rng( mbedtls_ssl_config *conf, - int (*f_rng)(void *, unsigned char *, size_t), - void *p_rng ); - -/** - * \brief Set the debug callback - * - * The callback has the following argument: - * void * opaque context for the callback - * int debug level - * const char * file name - * int line number - * const char * message - * - * \param conf SSL configuration - * \param f_dbg debug function - * \param p_dbg debug parameter - */ -void mbedtls_ssl_conf_dbg( mbedtls_ssl_config *conf, - void (*f_dbg)(void *, int, const char *, int, const char *), - void *p_dbg ); - -/** - * \brief Set the underlying BIO callbacks for write, read and - * read-with-timeout. - * - * \param ssl SSL context - * \param p_bio parameter (context) shared by BIO callbacks - * \param f_send write callback - * \param f_recv read callback - * \param f_recv_timeout blocking read callback with timeout. - * The last argument is the timeout in milliseconds, - * 0 means no timeout (block forever until a message comes) - * - * \note One of f_recv or f_recv_timeout can be NULL, in which case - * the other is used. If both are non-NULL, f_recv_timeout is - * used and f_recv is ignored (as if it were NULL). - * - * \note The two most common use cases are: - * - non-blocking I/O, f_recv != NULL, f_recv_timeout == NULL - * - blocking I/O, f_recv == NULL, f_recv_timout != NULL - * - * \note For DTLS, you need to provide either a non-NULL - * f_recv_timeout callback, or a f_recv that doesn't block. - */ -void mbedtls_ssl_set_bio( mbedtls_ssl_context *ssl, - void *p_bio, - int (*f_send)(void *, const unsigned char *, size_t), - int (*f_recv)(void *, unsigned char *, size_t), - int (*f_recv_timeout)(void *, unsigned char *, size_t, uint32_t) ); - -/** - * \brief Set the timeout period for mbedtls_ssl_read() - * (Default: no timeout.) - * - * \param conf SSL configuration context - * \param timeout Timeout value in milliseconds. - * Use 0 for no timeout (default). - * - * \note With blocking I/O, this will only work if a non-NULL - * \c f_recv_timeout was set with \c mbedtls_ssl_set_bio(). - * With non-blocking I/O, this will only work if timer - * callbacks were set with \c mbedtls_ssl_set_timer_cb(). - * - * \note With non-blocking I/O, you may also skip this function - * altogether and handle timeouts at the application layer. - */ -void mbedtls_ssl_conf_read_timeout( mbedtls_ssl_config *conf, uint32_t timeout ); - -/** - * \brief Set the timer callbacks - * (Mandatory for DTLS.) - * - * \param ssl SSL context - * \param p_timer parameter (context) shared by timer callback - * \param f_set_timer set timer callback - * Accepts an intermediate and a final delay in milliseconcs - * If the final delay is 0, cancels the running timer. - * \param f_get_timer get timer callback. Must return: - * -1 if cancelled - * 0 if none of the delays is expired - * 1 if the intermediate delay only is expired - * 2 if the final delay is expired - */ -void mbedtls_ssl_set_timer_cb( mbedtls_ssl_context *ssl, - void *p_timer, - void (*f_set_timer)(void *, uint32_t int_ms, uint32_t fin_ms), - int (*f_get_timer)(void *) ); - -/** - * \brief Callback type: generate and write session ticket - * - * \note This describes what a callback implementation should do. - * This callback should generate and encrypted and - * authenticated ticket for the session and write it to the - * output buffer. Here, ticket means the opaque ticket part - * of the NewSessionTicket structure of RFC 5077. - * - * \param p_ticket Context for the callback - * \param session SSL session to bo written in the ticket - * \param start Start of the outpur buffer - * \param end End of the output buffer - * \param tlen On exit, holds the length written - * \param lifetime On exit, holds the lifetime of the ticket in seconds - * - * \return 0 if successful, or - * a specific MBEDTLS_ERR_XXX code. - */ -typedef int mbedtls_ssl_ticket_write_t( void *p_ticket, - const mbedtls_ssl_session *session, - unsigned char *start, - const unsigned char *end, - size_t *tlen, - uint32_t *lifetime ); - -/** - * \brief Callback type: parse and load session ticket - * - * \note This describes what a callback implementation should do. - * This callback should parse a session ticket as generated - * by the corresponding mbedtls_ssl_ticket_write_t function, - * and, if the ticket is authentic and valid, load the - * session. - * - * \note The implementation is allowed to modify the first len - * bytes of the input buffer, eg to use it as a temporary - * area for the decrypted ticket contents. - * - * \param p_ticket Context for the callback - * \param session SSL session to be loaded - * \param buf Start of the buffer containing the ticket - * \param len Length of the ticket. - * - * \return 0 if successful, or - * MBEDTLS_ERR_SSL_INVALID_MAC if not authentic, or - * MBEDTLS_ERR_SSL_SESSION_TICKET_EXPIRED if expired, or - * any other non-zero code for other failures. - */ -typedef int mbedtls_ssl_ticket_parse_t( void *p_ticket, - mbedtls_ssl_session *session, - unsigned char *buf, - size_t len ); - -#if defined(MBEDTLS_SSL_SESSION_TICKETS) && defined(MBEDTLS_SSL_SRV_C) -/** - * \brief Configure SSL session ticket callbacks (server only). - * (Default: none.) - * - * \note On server, session tickets are enabled by providing - * non-NULL callbacks. - * - * \note On client, use \c mbedtls_ssl_conf_session_tickets(). - * - * \param conf SSL configuration context - * \param f_ticket_write Callback for writing a ticket - * \param f_ticket_parse Callback for parsing a ticket - * \param p_ticket Context shared by the two callbacks - */ -void mbedtls_ssl_conf_session_tickets_cb( mbedtls_ssl_config *conf, - mbedtls_ssl_ticket_write_t *f_ticket_write, - mbedtls_ssl_ticket_parse_t *f_ticket_parse, - void *p_ticket ); -#endif /* MBEDTLS_SSL_SESSION_TICKETS && MBEDTLS_SSL_SRV_C */ - -/** - * \brief Callback type: generate a cookie - * - * \param ctx Context for the callback - * \param p Buffer to write to, - * must be updated to point right after the cookie - * \param end Pointer to one past the end of the output buffer - * \param info Client ID info that was passed to - * \c mbedtls_ssl_set_client_transport_id() - * \param ilen Length of info in bytes - * - * \return The callback must return 0 on success, - * or a negative error code. - */ -typedef int mbedtls_ssl_cookie_write_t( void *ctx, - unsigned char **p, unsigned char *end, - const unsigned char *info, size_t ilen ); - -/** - * \brief Callback type: verify a cookie - * - * \param ctx Context for the callback - * \param cookie Cookie to verify - * \param clen Length of cookie - * \param info Client ID info that was passed to - * \c mbedtls_ssl_set_client_transport_id() - * \param ilen Length of info in bytes - * - * \return The callback must return 0 if cookie is valid, - * or a negative error code. - */ -typedef int mbedtls_ssl_cookie_check_t( void *ctx, - const unsigned char *cookie, size_t clen, - const unsigned char *info, size_t ilen ); - -#if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY) && defined(MBEDTLS_SSL_SRV_C) -/** - * \brief Register callbacks for DTLS cookies - * (Server only. DTLS only.) - * - * Default: dummy callbacks that fail, in order to force you to - * register working callbacks (and initialize their context). - * - * To disable HelloVerifyRequest, register NULL callbacks. - * - * \warning Disabling hello verification allows your server to be used - * for amplification in DoS attacks against other hosts. - * Only disable if you known this can't happen in your - * particular environment. - * - * \note See comments on \c mbedtls_ssl_handshake() about handling - * the MBEDTLS_ERR_SSL_HELLO_VERIFY_REQUIRED that is expected - * on the first handshake attempt when this is enabled. - * - * \note This is also necessary to handle client reconnection from - * the same port as described in RFC 6347 section 4.2.8 (only - * the variant with cookies is supported currently). See - * comments on \c mbedtls_ssl_read() for details. - * - * \param conf SSL configuration - * \param f_cookie_write Cookie write callback - * \param f_cookie_check Cookie check callback - * \param p_cookie Context for both callbacks - */ -void mbedtls_ssl_conf_dtls_cookies( mbedtls_ssl_config *conf, - mbedtls_ssl_cookie_write_t *f_cookie_write, - mbedtls_ssl_cookie_check_t *f_cookie_check, - void *p_cookie ); - -/** - * \brief Set client's transport-level identification info. - * (Server only. DTLS only.) - * - * This is usually the IP address (and port), but could be - * anything identify the client depending on the underlying - * network stack. Used for HelloVerifyRequest with DTLS. - * This is *not* used to route the actual packets. - * - * \param ssl SSL context - * \param info Transport-level info identifying the client (eg IP + port) - * \param ilen Length of info in bytes - * - * \note An internal copy is made, so the info buffer can be reused. - * - * \return 0 on success, - * MBEDTLS_ERR_SSL_BAD_INPUT_DATA if used on client, - * MBEDTLS_ERR_SSL_ALLOC_FAILED if out of memory. - */ -int mbedtls_ssl_set_client_transport_id( mbedtls_ssl_context *ssl, - const unsigned char *info, - size_t ilen ); - -#endif /* MBEDTLS_SSL_DTLS_HELLO_VERIFY && MBEDTLS_SSL_SRV_C */ - -#if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY) -/** - * \brief Enable or disable anti-replay protection for DTLS. - * (DTLS only, no effect on TLS.) - * Default: enabled. - * - * \param conf SSL configuration - * \param mode MBEDTLS_SSL_ANTI_REPLAY_ENABLED or MBEDTLS_SSL_ANTI_REPLAY_DISABLED. - * - * \warning Disabling this is a security risk unless the application - * protocol handles duplicated packets in a safe way. You - * should not disable this without careful consideration. - * However, if your application already detects duplicated - * packets and needs information about them to adjust its - * transmission strategy, then you'll want to disable this. - */ -void mbedtls_ssl_conf_dtls_anti_replay( mbedtls_ssl_config *conf, char mode ); -#endif /* MBEDTLS_SSL_DTLS_ANTI_REPLAY */ - -#if defined(MBEDTLS_SSL_DTLS_BADMAC_LIMIT) -/** - * \brief Set a limit on the number of records with a bad MAC - * before terminating the connection. - * (DTLS only, no effect on TLS.) - * Default: 0 (disabled). - * - * \param conf SSL configuration - * \param limit Limit, or 0 to disable. - * - * \note If the limit is N, then the connection is terminated when - * the Nth non-authentic record is seen. - * - * \note Records with an invalid header are not counted, only the - * ones going through the authentication-decryption phase. - * - * \note This is a security trade-off related to the fact that it's - * often relatively easy for an active attacker ot inject UDP - * datagrams. On one hand, setting a low limit here makes it - * easier for such an attacker to forcibly terminated a - * connection. On the other hand, a high limit or no limit - * might make us waste resources checking authentication on - * many bogus packets. - */ -void mbedtls_ssl_conf_dtls_badmac_limit( mbedtls_ssl_config *conf, unsigned limit ); -#endif /* MBEDTLS_SSL_DTLS_BADMAC_LIMIT */ - -#if defined(MBEDTLS_SSL_PROTO_DTLS) -/** - * \brief Set retransmit timeout values for the DTLS handshale. - * (DTLS only, no effect on TLS.) - * - * \param conf SSL configuration - * \param min Initial timeout value in milliseconds. - * Default: 1000 (1 second). - * \param max Maximum timeout value in milliseconds. - * Default: 60000 (60 seconds). - * - * \note Default values are from RFC 6347 section 4.2.4.1. - * - * \note Higher values for initial timeout may increase average - * handshake latency. Lower values may increase the risk of - * network congestion by causing more retransmissions. - */ -void mbedtls_ssl_conf_handshake_timeout( mbedtls_ssl_config *conf, uint32_t min, uint32_t max ); -#endif /* MBEDTLS_SSL_PROTO_DTLS */ - -#if defined(MBEDTLS_SSL_SRV_C) -/** - * \brief Set the session cache callbacks (server-side only) - * If not set, no session resuming is done (except if session - * tickets are enabled too). - * - * The session cache has the responsibility to check for stale - * entries based on timeout. See RFC 5246 for recommendations. - * - * Warning: session.peer_cert is cleared by the SSL/TLS layer on - * connection shutdown, so do not cache the pointer! Either set - * it to NULL or make a full copy of the certificate. - * - * The get callback is called once during the initial handshake - * to enable session resuming. The get function has the - * following parameters: (void *parameter, mbedtls_ssl_session *session) - * If a valid entry is found, it should fill the master of - * the session object with the cached values and return 0, - * return 1 otherwise. Optionally peer_cert can be set as well - * if it is properly present in cache entry. - * - * The set callback is called once during the initial handshake - * to enable session resuming after the entire handshake has - * been finished. The set function has the following parameters: - * (void *parameter, const mbedtls_ssl_session *session). The function - * should create a cache entry for future retrieval based on - * the data in the session structure and should keep in mind - * that the mbedtls_ssl_session object presented (and all its referenced - * data) is cleared by the SSL/TLS layer when the connection is - * terminated. It is recommended to add metadata to determine if - * an entry is still valid in the future. Return 0 if - * successfully cached, return 1 otherwise. - * - * \param conf SSL configuration - * \param p_cache parmater (context) for both callbacks - * \param f_get_cache session get callback - * \param f_set_cache session set callback - */ -void mbedtls_ssl_conf_session_cache( mbedtls_ssl_config *conf, - void *p_cache, - int (*f_get_cache)(void *, mbedtls_ssl_session *), - int (*f_set_cache)(void *, const mbedtls_ssl_session *) ); -#endif /* MBEDTLS_SSL_SRV_C */ - -#if defined(MBEDTLS_SSL_CLI_C) -/** - * \brief Request resumption of session (client-side only) - * Session data is copied from presented session structure. - * - * \param ssl SSL context - * \param session session context - * - * \return 0 if successful, - * MBEDTLS_ERR_SSL_ALLOC_FAILED if memory allocation failed, - * MBEDTLS_ERR_SSL_BAD_INPUT_DATA if used server-side or - * arguments are otherwise invalid - * - * \sa mbedtls_ssl_get_session() - */ -int mbedtls_ssl_set_session( mbedtls_ssl_context *ssl, const mbedtls_ssl_session *session ); -#endif /* MBEDTLS_SSL_CLI_C */ - -/** - * \brief Set the list of allowed ciphersuites and the preference - * order. First in the list has the highest preference. - * (Overrides all version specific lists) - * - * The ciphersuites array is not copied, and must remain - * valid for the lifetime of the ssl_config. - * - * Note: The server uses its own preferences - * over the preference of the client unless - * MBEDTLS_SSL_SRV_RESPECT_CLIENT_PREFERENCE is defined! - * - * \param conf SSL configuration - * \param ciphersuites 0-terminated list of allowed ciphersuites - */ -void mbedtls_ssl_conf_ciphersuites( mbedtls_ssl_config *conf, - const int *ciphersuites ); - -/** - * \brief Set the list of allowed ciphersuites and the - * preference order for a specific version of the protocol. - * (Only useful on the server side) - * - * The ciphersuites array is not copied, and must remain - * valid for the lifetime of the ssl_config. - * - * \param conf SSL configuration - * \param ciphersuites 0-terminated list of allowed ciphersuites - * \param major Major version number (only MBEDTLS_SSL_MAJOR_VERSION_3 - * supported) - * \param minor Minor version number (MBEDTLS_SSL_MINOR_VERSION_0, - * MBEDTLS_SSL_MINOR_VERSION_1 and MBEDTLS_SSL_MINOR_VERSION_2, - * MBEDTLS_SSL_MINOR_VERSION_3 supported) - * - * \note With DTLS, use MBEDTLS_SSL_MINOR_VERSION_2 for DTLS 1.0 - * and MBEDTLS_SSL_MINOR_VERSION_3 for DTLS 1.2 - */ -void mbedtls_ssl_conf_ciphersuites_for_version( mbedtls_ssl_config *conf, - const int *ciphersuites, - int major, int minor ); - -#if defined(MBEDTLS_X509_CRT_PARSE_C) -/** - * \brief Set the X.509 security profile used for verification - * - * \param conf SSL configuration - * \param profile Profile to use - */ -void mbedtls_ssl_conf_cert_profile( mbedtls_ssl_config *conf, - const mbedtls_x509_crt_profile *profile ); - -/** - * \brief Set the data required to verify peer certificate - * - * \param conf SSL configuration - * \param ca_chain trusted CA chain (meaning all fully trusted top-level CAs) - * \param ca_crl trusted CA CRLs - */ -void mbedtls_ssl_conf_ca_chain( mbedtls_ssl_config *conf, - mbedtls_x509_crt *ca_chain, - mbedtls_x509_crl *ca_crl ); - -/** - * \brief Set own certificate chain and private key - * - * \note own_cert should contain in order from the bottom up your - * certificate chain. The top certificate (self-signed) - * can be omitted. - * - * \note On server, this function can be called multiple times to - * provision more than one cert/key pair (eg one ECDSA, one - * RSA with SHA-256, one RSA with SHA-1). An adequate - * certificate will be selected according to the client's - * advertised capabilities. In case mutliple certificates are - * adequate, preference is given to the one set by the first - * call to this function, then second, etc. - * - * \note On client, only the first call has any effect. - * - * \param conf SSL configuration - * \param own_cert own public certificate chain - * \param pk_key own private key - * - * \return 0 on success or MBEDTLS_ERR_SSL_ALLOC_FAILED - */ -int mbedtls_ssl_conf_own_cert( mbedtls_ssl_config *conf, - mbedtls_x509_crt *own_cert, - mbedtls_pk_context *pk_key ); -#endif /* MBEDTLS_X509_CRT_PARSE_C */ - -#if defined(MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED) -/** - * \brief Set the Pre Shared Key (PSK) and the expected identity name - * - * \note This is mainly useful for clients. Servers will usually - * want to use \c mbedtls_ssl_conf_psk_cb() instead. - * - * \param conf SSL configuration - * \param psk pointer to the pre-shared key - * \param psk_len pre-shared key length - * \param psk_identity pointer to the pre-shared key identity - * \param psk_identity_len identity key length - * - * \return 0 if successful or MBEDTLS_ERR_SSL_ALLOC_FAILED - */ -int mbedtls_ssl_conf_psk( mbedtls_ssl_config *conf, - const unsigned char *psk, size_t psk_len, - const unsigned char *psk_identity, size_t psk_identity_len ); - - -/** - * \brief Set the Pre Shared Key (PSK) for the current handshake - * - * \note This should only be called inside the PSK callback, - * ie the function passed to \c mbedtls_ssl_conf_psk_cb(). - * - * \param ssl SSL context - * \param psk pointer to the pre-shared key - * \param psk_len pre-shared key length - * - * \return 0 if successful or MBEDTLS_ERR_SSL_ALLOC_FAILED - */ -int mbedtls_ssl_set_hs_psk( mbedtls_ssl_context *ssl, - const unsigned char *psk, size_t psk_len ); - -/** - * \brief Set the PSK callback (server-side only). - * - * If set, the PSK callback is called for each - * handshake where a PSK ciphersuite was negotiated. - * The caller provides the identity received and wants to - * receive the actual PSK data and length. - * - * The callback has the following parameters: (void *parameter, - * mbedtls_ssl_context *ssl, const unsigned char *psk_identity, - * size_t identity_len) - * If a valid PSK identity is found, the callback should use - * \c mbedtls_ssl_set_hs_psk() on the ssl context to set the - * correct PSK and return 0. - * Any other return value will result in a denied PSK identity. - * - * \note If you set a PSK callback using this function, then you - * don't need to set a PSK key and identity using - * \c mbedtls_ssl_conf_psk(). - * - * \param conf SSL configuration - * \param f_psk PSK identity function - * \param p_psk PSK identity parameter - */ -void mbedtls_ssl_conf_psk_cb( mbedtls_ssl_config *conf, - int (*f_psk)(void *, mbedtls_ssl_context *, const unsigned char *, - size_t), - void *p_psk ); -#endif /* MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED */ - -#if defined(MBEDTLS_DHM_C) && defined(MBEDTLS_SSL_SRV_C) -/** - * \brief Set the Diffie-Hellman public P and G values, - * read as hexadecimal strings (server-side only) - * (Default: MBEDTLS_DHM_RFC5114_MODP_2048_[PG]) - * - * \param conf SSL configuration - * \param dhm_P Diffie-Hellman-Merkle modulus - * \param dhm_G Diffie-Hellman-Merkle generator - * - * \return 0 if successful - */ -int mbedtls_ssl_conf_dh_param( mbedtls_ssl_config *conf, const char *dhm_P, const char *dhm_G ); - -/** - * \brief Set the Diffie-Hellman public P and G values, - * read from existing context (server-side only) - * - * \param conf SSL configuration - * \param dhm_ctx Diffie-Hellman-Merkle context - * - * \return 0 if successful - */ -int mbedtls_ssl_conf_dh_param_ctx( mbedtls_ssl_config *conf, mbedtls_dhm_context *dhm_ctx ); -#endif /* MBEDTLS_DHM_C && defined(MBEDTLS_SSL_SRV_C) */ - -#if defined(MBEDTLS_DHM_C) && defined(MBEDTLS_SSL_CLI_C) -/** - * \brief Set the minimum length for Diffie-Hellman parameters. - * (Client-side only.) - * (Default: 1024 bits.) - * - * \param conf SSL configuration - * \param bitlen Minimum bit length of the DHM prime - */ -void mbedtls_ssl_conf_dhm_min_bitlen( mbedtls_ssl_config *conf, - unsigned int bitlen ); -#endif /* MBEDTLS_DHM_C && MBEDTLS_SSL_CLI_C */ - -#if defined(MBEDTLS_ECP_C) -/** - * \brief Set the allowed curves in order of preference. - * (Default: all defined curves.) - * - * On server: this only affects selection of the ECDHE curve; - * the curves used for ECDH and ECDSA are determined by the - * list of available certificates instead. - * - * On client: this affects the list of curves offered for any - * use. The server can override our preference order. - * - * Both sides: limits the set of curves used by peer to the - * listed curves for any use ECDHE and the end-entity - * certificate. - * - * \note This has no influence on which curve are allowed inside the - * certificate chains, see \c mbedtls_ssl_conf_cert_profile() - * for that. For example, if the peer's certificate chain is - * EE -> CA_int -> CA_root, then the allowed curves for EE are - * controlled by \c mbedtls_ssl_conf_curves() but for CA_int - * and CA_root it's \c mbedtls_ssl_conf_cert_profile(). - * - * \note This list should be ordered by decreasing preference - * (preferred curve first). - * - * \param conf SSL configuration - * \param curves Ordered list of allowed curves, - * terminated by MBEDTLS_ECP_DP_NONE. - */ -void mbedtls_ssl_conf_curves( mbedtls_ssl_config *conf, - const mbedtls_ecp_group_id *curves ); -#endif /* MBEDTLS_ECP_C */ - -#if defined(MBEDTLS_KEY_EXCHANGE__SOME__SIGNATURE_ENABLED) -/** - * \brief Set the allowed hashes for signatures during the handshake. - * (Default: all available hashes.) - * - * \note This only affects which hashes are offered and can be used - * for signatures during the handshake. Hashes for message - * authentication and the TLS PRF are controlled by the - * ciphersuite, see \c mbedtls_ssl_conf_ciphersuites(). Hashes - * used for certificate signature are controlled by the - * verification profile, see \c mbedtls_ssl_conf_cert_profile(). - * - * \note This list should be ordered by decreasing preference - * (preferred hash first). - * - * \param conf SSL configuration - * \param hashes Ordered list of allowed signature hashes, - * terminated by \c MBEDTLS_MD_NONE. - */ -void mbedtls_ssl_conf_sig_hashes( mbedtls_ssl_config *conf, - const int *hashes ); -#endif /* MBEDTLS_KEY_EXCHANGE__SOME__SIGNATURE_ENABLED */ - -#if defined(MBEDTLS_X509_CRT_PARSE_C) -/** - * \brief Set hostname for ServerName TLS extension - * (client-side only) - * - * - * \param ssl SSL context - * \param hostname the server hostname - * - * \return 0 if successful or MBEDTLS_ERR_SSL_ALLOC_FAILED - */ -int mbedtls_ssl_set_hostname( mbedtls_ssl_context *ssl, const char *hostname ); -#endif /* MBEDTLS_X509_CRT_PARSE_C */ - -#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION) -/** - * \brief Set own certificate and key for the current handshake - * - * \note Same as \c mbedtls_ssl_conf_own_cert() but for use within - * the SNI callback. - * - * \param ssl SSL context - * \param own_cert own public certificate chain - * \param pk_key own private key - * - * \return 0 on success or MBEDTLS_ERR_SSL_ALLOC_FAILED - */ -int mbedtls_ssl_set_hs_own_cert( mbedtls_ssl_context *ssl, - mbedtls_x509_crt *own_cert, - mbedtls_pk_context *pk_key ); - -/** - * \brief Set the data required to verify peer certificate for the - * current handshake - * - * \note Same as \c mbedtls_ssl_conf_ca_chain() but for use within - * the SNI callback. - * - * \param ssl SSL context - * \param ca_chain trusted CA chain (meaning all fully trusted top-level CAs) - * \param ca_crl trusted CA CRLs - */ -void mbedtls_ssl_set_hs_ca_chain( mbedtls_ssl_context *ssl, - mbedtls_x509_crt *ca_chain, - mbedtls_x509_crl *ca_crl ); - -/** - * \brief Set authmode for the current handshake. - * - * \note Same as \c mbedtls_ssl_conf_authmode() but for use within - * the SNI callback. - * - * \param ssl SSL context - * \param authmode MBEDTLS_SSL_VERIFY_NONE, MBEDTLS_SSL_VERIFY_OPTIONAL or - * MBEDTLS_SSL_VERIFY_REQUIRED - */ -void mbedtls_ssl_set_hs_authmode( mbedtls_ssl_context *ssl, - int authmode ); - -/** - * \brief Set server side ServerName TLS extension callback - * (optional, server-side only). - * - * If set, the ServerName callback is called whenever the - * server receives a ServerName TLS extension from the client - * during a handshake. The ServerName callback has the - * following parameters: (void *parameter, mbedtls_ssl_context *ssl, - * const unsigned char *hostname, size_t len). If a suitable - * certificate is found, the callback must set the - * certificate(s) and key(s) to use with \c - * mbedtls_ssl_set_hs_own_cert() (can be called repeatedly), - * and may optionally adjust the CA and associated CRL with \c - * mbedtls_ssl_set_hs_ca_chain() as well as the client - * authentication mode with \c mbedtls_ssl_set_hs_authmode(), - * then must return 0. If no matching name is found, the - * callback must either set a default cert, or - * return non-zero to abort the handshake at this point. - * - * \param conf SSL configuration - * \param f_sni verification function - * \param p_sni verification parameter - */ -void mbedtls_ssl_conf_sni( mbedtls_ssl_config *conf, - int (*f_sni)(void *, mbedtls_ssl_context *, const unsigned char *, - size_t), - void *p_sni ); -#endif /* MBEDTLS_SSL_SERVER_NAME_INDICATION */ - -#if defined(MBEDTLS_SSL_ALPN) -/** - * \brief Set the supported Application Layer Protocols. - * - * \param conf SSL configuration - * \param protos NULL-terminated list of supported protocols, - * in decreasing preference order. - * - * \return 0 on success, or MBEDTLS_ERR_SSL_BAD_INPUT_DATA. - */ -int mbedtls_ssl_conf_alpn_protocols( mbedtls_ssl_config *conf, const char **protos ); - -/** - * \brief Get the name of the negotiated Application Layer Protocol. - * This function should be called after the handshake is - * completed. - * - * \param ssl SSL context - * - * \return Protcol name, or NULL if no protocol was negotiated. - */ -const char *mbedtls_ssl_get_alpn_protocol( const mbedtls_ssl_context *ssl ); -#endif /* MBEDTLS_SSL_ALPN */ - -/** - * \brief Set the maximum supported version sent from the client side - * and/or accepted at the server side - * (Default: MBEDTLS_SSL_MAX_MAJOR_VERSION, MBEDTLS_SSL_MAX_MINOR_VERSION) - * - * \note This ignores ciphersuites from higher versions. - * - * \note With DTLS, use MBEDTLS_SSL_MINOR_VERSION_2 for DTLS 1.0 and - * MBEDTLS_SSL_MINOR_VERSION_3 for DTLS 1.2 - * - * \param conf SSL configuration - * \param major Major version number (only MBEDTLS_SSL_MAJOR_VERSION_3 supported) - * \param minor Minor version number (MBEDTLS_SSL_MINOR_VERSION_0, - * MBEDTLS_SSL_MINOR_VERSION_1 and MBEDTLS_SSL_MINOR_VERSION_2, - * MBEDTLS_SSL_MINOR_VERSION_3 supported) - */ -void mbedtls_ssl_conf_max_version( mbedtls_ssl_config *conf, int major, int minor ); - -/** - * \brief Set the minimum accepted SSL/TLS protocol version - * (Default: TLS 1.0) - * - * \note Input outside of the SSL_MAX_XXXXX_VERSION and - * SSL_MIN_XXXXX_VERSION range is ignored. - * - * \note MBEDTLS_SSL_MINOR_VERSION_0 (SSL v3) should be avoided. - * - * \note With DTLS, use MBEDTLS_SSL_MINOR_VERSION_2 for DTLS 1.0 and - * MBEDTLS_SSL_MINOR_VERSION_3 for DTLS 1.2 - * - * \param conf SSL configuration - * \param major Major version number (only MBEDTLS_SSL_MAJOR_VERSION_3 supported) - * \param minor Minor version number (MBEDTLS_SSL_MINOR_VERSION_0, - * MBEDTLS_SSL_MINOR_VERSION_1 and MBEDTLS_SSL_MINOR_VERSION_2, - * MBEDTLS_SSL_MINOR_VERSION_3 supported) - */ -void mbedtls_ssl_conf_min_version( mbedtls_ssl_config *conf, int major, int minor ); - -#if defined(MBEDTLS_SSL_FALLBACK_SCSV) && defined(MBEDTLS_SSL_CLI_C) -/** - * \brief Set the fallback flag (client-side only). - * (Default: MBEDTLS_SSL_IS_NOT_FALLBACK). - * - * \note Set to MBEDTLS_SSL_IS_FALLBACK when preparing a fallback - * connection, that is a connection with max_version set to a - * lower value than the value you're willing to use. Such - * fallback connections are not recommended but are sometimes - * necessary to interoperate with buggy (version-intolerant) - * servers. - * - * \warning You should NOT set this to MBEDTLS_SSL_IS_FALLBACK for - * non-fallback connections! This would appear to work for a - * while, then cause failures when the server is upgraded to - * support a newer TLS version. - * - * \param conf SSL configuration - * \param fallback MBEDTLS_SSL_IS_NOT_FALLBACK or MBEDTLS_SSL_IS_FALLBACK - */ -void mbedtls_ssl_conf_fallback( mbedtls_ssl_config *conf, char fallback ); -#endif /* MBEDTLS_SSL_FALLBACK_SCSV && MBEDTLS_SSL_CLI_C */ - -#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC) -/** - * \brief Enable or disable Encrypt-then-MAC - * (Default: MBEDTLS_SSL_ETM_ENABLED) - * - * \note This should always be enabled, it is a security - * improvement, and should not cause any interoperability - * issue (used only if the peer supports it too). - * - * \param conf SSL configuration - * \param etm MBEDTLS_SSL_ETM_ENABLED or MBEDTLS_SSL_ETM_DISABLED - */ -void mbedtls_ssl_conf_encrypt_then_mac( mbedtls_ssl_config *conf, char etm ); -#endif /* MBEDTLS_SSL_ENCRYPT_THEN_MAC */ - -#if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET) -/** - * \brief Enable or disable Extended Master Secret negotiation. - * (Default: MBEDTLS_SSL_EXTENDED_MS_ENABLED) - * - * \note This should always be enabled, it is a security fix to the - * protocol, and should not cause any interoperability issue - * (used only if the peer supports it too). - * - * \param conf SSL configuration - * \param ems MBEDTLS_SSL_EXTENDED_MS_ENABLED or MBEDTLS_SSL_EXTENDED_MS_DISABLED - */ -void mbedtls_ssl_conf_extended_master_secret( mbedtls_ssl_config *conf, char ems ); -#endif /* MBEDTLS_SSL_EXTENDED_MASTER_SECRET */ - -#if defined(MBEDTLS_ARC4_C) -/** - * \brief Disable or enable support for RC4 - * (Default: MBEDTLS_SSL_ARC4_DISABLED) - * - * \warning Use of RC4 in (D)TLS has been prohibited by RFC ???? - * for security reasons. Use at your own risks. - * - * \note This function will likely be removed in future versions as - * RC4 will then be disabled by default at compile time. - * - * \param conf SSL configuration - * \param arc4 MBEDTLS_SSL_ARC4_ENABLED or MBEDTLS_SSL_ARC4_DISABLED - */ -void mbedtls_ssl_conf_arc4_support( mbedtls_ssl_config *conf, char arc4 ); -#endif /* MBEDTLS_ARC4_C */ - -#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH) -/** - * \brief Set the maximum fragment length to emit and/or negotiate - * (Default: MBEDTLS_SSL_MAX_CONTENT_LEN, usually 2^14 bytes) - * (Server: set maximum fragment length to emit, - * usually negotiated by the client during handshake - * (Client: set maximum fragment length to emit *and* - * negotiate with the server during handshake) - * - * \param conf SSL configuration - * \param mfl_code Code for maximum fragment length (allowed values: - * MBEDTLS_SSL_MAX_FRAG_LEN_512, MBEDTLS_SSL_MAX_FRAG_LEN_1024, - * MBEDTLS_SSL_MAX_FRAG_LEN_2048, MBEDTLS_SSL_MAX_FRAG_LEN_4096) - * - * \return 0 if successful or MBEDTLS_ERR_SSL_BAD_INPUT_DATA - */ -int mbedtls_ssl_conf_max_frag_len( mbedtls_ssl_config *conf, unsigned char mfl_code ); -#endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */ - -#if defined(MBEDTLS_SSL_TRUNCATED_HMAC) -/** - * \brief Activate negotiation of truncated HMAC - * (Default: MBEDTLS_SSL_TRUNC_HMAC_DISABLED) - * - * \param conf SSL configuration - * \param truncate Enable or disable (MBEDTLS_SSL_TRUNC_HMAC_ENABLED or - * MBEDTLS_SSL_TRUNC_HMAC_DISABLED) - */ -void mbedtls_ssl_conf_truncated_hmac( mbedtls_ssl_config *conf, int truncate ); -#endif /* MBEDTLS_SSL_TRUNCATED_HMAC */ - -#if defined(MBEDTLS_SSL_CBC_RECORD_SPLITTING) -/** - * \brief Enable / Disable 1/n-1 record splitting - * (Default: MBEDTLS_SSL_CBC_RECORD_SPLITTING_ENABLED) - * - * \note Only affects SSLv3 and TLS 1.0, not higher versions. - * Does not affect non-CBC ciphersuites in any version. - * - * \param conf SSL configuration - * \param split MBEDTLS_SSL_CBC_RECORD_SPLITTING_ENABLED or - * MBEDTLS_SSL_CBC_RECORD_SPLITTING_DISABLED - */ -void mbedtls_ssl_conf_cbc_record_splitting( mbedtls_ssl_config *conf, char split ); -#endif /* MBEDTLS_SSL_CBC_RECORD_SPLITTING */ - -#if defined(MBEDTLS_SSL_SESSION_TICKETS) && defined(MBEDTLS_SSL_CLI_C) -/** - * \brief Enable / Disable session tickets (client only). - * (Default: MBEDTLS_SSL_SESSION_TICKETS_ENABLED.) - * - * \note On server, use \c mbedtls_ssl_conf_session_tickets_cb(). - * - * \param conf SSL configuration - * \param use_tickets Enable or disable (MBEDTLS_SSL_SESSION_TICKETS_ENABLED or - * MBEDTLS_SSL_SESSION_TICKETS_DISABLED) - */ -void mbedtls_ssl_conf_session_tickets( mbedtls_ssl_config *conf, int use_tickets ); -#endif /* MBEDTLS_SSL_SESSION_TICKETS && MBEDTLS_SSL_CLI_C */ - -#if defined(MBEDTLS_SSL_RENEGOTIATION) -/** - * \brief Enable / Disable renegotiation support for connection when - * initiated by peer - * (Default: MBEDTLS_SSL_RENEGOTIATION_DISABLED) - * - * \warning It is recommended to always disable renegotation unless you - * know you need it and you know what you're doing. In the - * past, there has been several issues associated with - * renegotiation or a poor understanding of its properties. - * - * \note Server-side, enabling renegotiation also makes the server - * susceptible to a resource DoS by a malicious client. - * - * \param conf SSL configuration - * \param renegotiation Enable or disable (MBEDTLS_SSL_RENEGOTIATION_ENABLED or - * MBEDTLS_SSL_RENEGOTIATION_DISABLED) - */ -void mbedtls_ssl_conf_renegotiation( mbedtls_ssl_config *conf, int renegotiation ); -#endif /* MBEDTLS_SSL_RENEGOTIATION */ - -/** - * \brief Prevent or allow legacy renegotiation. - * (Default: MBEDTLS_SSL_LEGACY_NO_RENEGOTIATION) - * - * MBEDTLS_SSL_LEGACY_NO_RENEGOTIATION allows connections to - * be established even if the peer does not support - * secure renegotiation, but does not allow renegotiation - * to take place if not secure. - * (Interoperable and secure option) - * - * MBEDTLS_SSL_LEGACY_ALLOW_RENEGOTIATION allows renegotiations - * with non-upgraded peers. Allowing legacy renegotiation - * makes the connection vulnerable to specific man in the - * middle attacks. (See RFC 5746) - * (Most interoperable and least secure option) - * - * MBEDTLS_SSL_LEGACY_BREAK_HANDSHAKE breaks off connections - * if peer does not support secure renegotiation. Results - * in interoperability issues with non-upgraded peers - * that do not support renegotiation altogether. - * (Most secure option, interoperability issues) - * - * \param conf SSL configuration - * \param allow_legacy Prevent or allow (SSL_NO_LEGACY_RENEGOTIATION, - * SSL_ALLOW_LEGACY_RENEGOTIATION or - * MBEDTLS_SSL_LEGACY_BREAK_HANDSHAKE) - */ -void mbedtls_ssl_conf_legacy_renegotiation( mbedtls_ssl_config *conf, int allow_legacy ); - -#if defined(MBEDTLS_SSL_RENEGOTIATION) -/** - * \brief Enforce renegotiation requests. - * (Default: enforced, max_records = 16) - * - * When we request a renegotiation, the peer can comply or - * ignore the request. This function allows us to decide - * whether to enforce our renegotiation requests by closing - * the connection if the peer doesn't comply. - * - * However, records could already be in transit from the peer - * when the request is emitted. In order to increase - * reliability, we can accept a number of records before the - * expected handshake records. - * - * The optimal value is highly dependent on the specific usage - * scenario. - * - * \note With DTLS and server-initiated renegotiation, the - * HelloRequest is retransmited every time mbedtls_ssl_read() times - * out or receives Application Data, until: - * - max_records records have beens seen, if it is >= 0, or - * - the number of retransmits that would happen during an - * actual handshake has been reached. - * Please remember the request might be lost a few times - * if you consider setting max_records to a really low value. - * - * \warning On client, the grace period can only happen during - * mbedtls_ssl_read(), as opposed to mbedtls_ssl_write() and mbedtls_ssl_renegotiate() - * which always behave as if max_record was 0. The reason is, - * if we receive application data from the server, we need a - * place to write it, which only happens during mbedtls_ssl_read(). - * - * \param conf SSL configuration - * \param max_records Use MBEDTLS_SSL_RENEGOTIATION_NOT_ENFORCED if you don't want to - * enforce renegotiation, or a non-negative value to enforce - * it but allow for a grace period of max_records records. - */ -void mbedtls_ssl_conf_renegotiation_enforced( mbedtls_ssl_config *conf, int max_records ); - -/** - * \brief Set record counter threshold for periodic renegotiation. - * (Default: 2^64 - 256.) - * - * Renegotiation is automatically triggered when a record - * counter (outgoing or ingoing) crosses the defined - * threshold. The default value is meant to prevent the - * connection from being closed when the counter is about to - * reached its maximal value (it is not allowed to wrap). - * - * Lower values can be used to enforce policies such as "keys - * must be refreshed every N packets with cipher X". - * - * \param conf SSL configuration - * \param period The threshold value: a big-endian 64-bit number. - * Set to 2^64 - 1 to disable periodic renegotiation - */ -void mbedtls_ssl_conf_renegotiation_period( mbedtls_ssl_config *conf, - const unsigned char period[8] ); -#endif /* MBEDTLS_SSL_RENEGOTIATION */ - -/** - * \brief Return the number of data bytes available to read - * - * \param ssl SSL context - * - * \return how many bytes are available in the read buffer - */ -size_t mbedtls_ssl_get_bytes_avail( const mbedtls_ssl_context *ssl ); - -/** - * \brief Return the result of the certificate verification - * - * \param ssl SSL context - * - * \return 0 if successful, - * -1 if result is not available (eg because the handshake was - * aborted too early), or - * a combination of BADCERT_xxx and BADCRL_xxx flags, see - * x509.h - */ -uint32_t mbedtls_ssl_get_verify_result( const mbedtls_ssl_context *ssl ); - -/** - * \brief Return the name of the current ciphersuite - * - * \param ssl SSL context - * - * \return a string containing the ciphersuite name - */ -const char *mbedtls_ssl_get_ciphersuite( const mbedtls_ssl_context *ssl ); - -/** - * \brief Return the current SSL version (SSLv3/TLSv1/etc) - * - * \param ssl SSL context - * - * \return a string containing the SSL version - */ -const char *mbedtls_ssl_get_version( const mbedtls_ssl_context *ssl ); - -/** - * \brief Return the (maximum) number of bytes added by the record - * layer: header + encryption/MAC overhead (inc. padding) - * - * \param ssl SSL context - * - * \return Current maximum record expansion in bytes, or - * MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE if compression is - * enabled, which makes expansion much less predictable - */ -int mbedtls_ssl_get_record_expansion( const mbedtls_ssl_context *ssl ); - -#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH) -/** - * \brief Return the maximum fragment length (payload, in bytes). - * This is the value negotiated with peer if any, - * or the locally configured value. - * - * \note With DTLS, \c mbedtls_ssl_write() will return an error if - * called with a larger length value. - * With TLS, \c mbedtls_ssl_write() will fragment the input if - * necessary and return the number of bytes written; it is up - * to the caller to call \c mbedtls_ssl_write() again in - * order to send the remaining bytes if any. - * - * \param ssl SSL context - * - * \return Current maximum fragment length. - */ -size_t mbedtls_ssl_get_max_frag_len( const mbedtls_ssl_context *ssl ); -#endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */ - -#if defined(MBEDTLS_X509_CRT_PARSE_C) -/** - * \brief Return the peer certificate from the current connection - * - * Note: Can be NULL in case no certificate was sent during - * the handshake. Different calls for the same connection can - * return the same or different pointers for the same - * certificate and even a different certificate altogether. - * The peer cert CAN change in a single connection if - * renegotiation is performed. - * - * \param ssl SSL context - * - * \return the current peer certificate - */ -const mbedtls_x509_crt *mbedtls_ssl_get_peer_cert( const mbedtls_ssl_context *ssl ); -#endif /* MBEDTLS_X509_CRT_PARSE_C */ - -#if defined(MBEDTLS_SSL_CLI_C) -/** - * \brief Save session in order to resume it later (client-side only) - * Session data is copied to presented session structure. - * - * \warning Currently, peer certificate is lost in the operation. - * - * \param ssl SSL context - * \param session session context - * - * \return 0 if successful, - * MBEDTLS_ERR_SSL_ALLOC_FAILED if memory allocation failed, - * MBEDTLS_ERR_SSL_BAD_INPUT_DATA if used server-side or - * arguments are otherwise invalid - * - * \sa mbedtls_ssl_set_session() - */ -int mbedtls_ssl_get_session( const mbedtls_ssl_context *ssl, mbedtls_ssl_session *session ); -#endif /* MBEDTLS_SSL_CLI_C */ - -/** - * \brief Perform the SSL handshake - * - * \param ssl SSL context - * - * \return 0 if successful, or - * MBEDTLS_ERR_SSL_WANT_READ or MBEDTLS_ERR_SSL_WANT_WRITE, or - * MBEDTLS_ERR_SSL_HELLO_VERIFY_REQUIRED (see below), or - * a specific SSL error code. - * - * \note If this function returns something other than 0 or - * MBEDTLS_ERR_SSL_WANT_READ/WRITE, then the ssl context - * becomes unusable, and you should either free it or call - * \c mbedtls_ssl_session_reset() on it before re-using it. - * - * \note If DTLS is in use, then you may choose to handle - * MBEDTLS_ERR_SSL_HELLO_VERIFY_REQUIRED specially for logging - * purposes, as it is an expected return value rather than an - * actual error, but you still need to reset/free the context. - */ -int mbedtls_ssl_handshake( mbedtls_ssl_context *ssl ); - -/** - * \brief Perform a single step of the SSL handshake - * - * \note The state of the context (ssl->state) will be at - * the following state after execution of this function. - * Do not call this function if state is MBEDTLS_SSL_HANDSHAKE_OVER. - * - * \param ssl SSL context - * - * \return 0 if successful, or - * MBEDTLS_ERR_SSL_WANT_READ or MBEDTLS_ERR_SSL_WANT_WRITE, or - * a specific SSL error code. - */ -int mbedtls_ssl_handshake_step( mbedtls_ssl_context *ssl ); - -#if defined(MBEDTLS_SSL_RENEGOTIATION) -/** - * \brief Initiate an SSL renegotiation on the running connection. - * Client: perform the renegotiation right now. - * Server: request renegotiation, which will be performed - * during the next call to mbedtls_ssl_read() if honored by client. - * - * \param ssl SSL context - * - * \return 0 if successful, or any mbedtls_ssl_handshake() return value. - */ -int mbedtls_ssl_renegotiate( mbedtls_ssl_context *ssl ); -#endif /* MBEDTLS_SSL_RENEGOTIATION */ - -/** - * \brief Read at most 'len' application data bytes - * - * \param ssl SSL context - * \param buf buffer that will hold the data - * \param len maximum number of bytes to read - * - * \return the number of bytes read, or - * 0 for EOF, or - * MBEDTLS_ERR_SSL_WANT_READ or MBEDTLS_ERR_SSL_WANT_WRITE, or - * MBEDTLS_ERR_SSL_CLIENT_RECONNECT (see below), or - * another negative error code. - * - * \note When this function return MBEDTLS_ERR_SSL_CLIENT_RECONNECT - * (which can only happen server-side), it means that a client - * is initiating a new connection using the same source port. - * You can either treat that as a connection close and wait - * for the client to resend a ClientHello, or directly - * continue with \c mbedtls_ssl_handshake() with the same - * context (as it has beeen reset internally). Either way, you - * should make sure this is seen by the application as a new - * connection: application state, if any, should be reset, and - * most importantly the identity of the client must be checked - * again. WARNING: not validating the identity of the client - * again, or not transmitting the new identity to the - * application layer, would allow authentication bypass! - */ -int mbedtls_ssl_read( mbedtls_ssl_context *ssl, unsigned char *buf, size_t len ); - -/** - * \brief Try to write exactly 'len' application data bytes - * - * \warning This function will do partial writes in some cases. If the - * return value is non-negative but less than length, the - * function must be called again with updated arguments: - * buf + ret, len - ret (if ret is the return value) until - * it returns a value equal to the last 'len' argument. - * - * \param ssl SSL context - * \param buf buffer holding the data - * \param len how many bytes must be written - * - * \return the number of bytes actually written (may be less than len), - * or MBEDTLS_ERR_SSL_WANT_WRITE of MBEDTLS_ERR_SSL_WANT_READ, - * or another negative error code. - * - * \note When this function returns MBEDTLS_ERR_SSL_WANT_WRITE/READ, - * it must be called later with the *same* arguments, - * until it returns a positive value. - * - * \note If the requested length is greater than the maximum - * fragment length (either the built-in limit or the one set - * or negotiated with the peer), then: - * - with TLS, less bytes than requested are written. - * - with DTLS, MBEDTLS_ERR_SSL_BAD_INPUT_DATA is returned. - * \c mbedtls_ssl_get_max_frag_len() may be used to query the - * active maximum fragment length. - */ -int mbedtls_ssl_write( mbedtls_ssl_context *ssl, const unsigned char *buf, size_t len ); - -/** - * \brief Send an alert message - * - * \param ssl SSL context - * \param level The alert level of the message - * (MBEDTLS_SSL_ALERT_LEVEL_WARNING or MBEDTLS_SSL_ALERT_LEVEL_FATAL) - * \param message The alert message (SSL_ALERT_MSG_*) - * - * \return 0 if successful, or a specific SSL error code. - */ -int mbedtls_ssl_send_alert_message( mbedtls_ssl_context *ssl, - unsigned char level, - unsigned char message ); -/** - * \brief Notify the peer that the connection is being closed - * - * \param ssl SSL context - */ -int mbedtls_ssl_close_notify( mbedtls_ssl_context *ssl ); - -/** - * \brief Free referenced items in an SSL context and clear memory - * - * \param ssl SSL context - */ -void mbedtls_ssl_free( mbedtls_ssl_context *ssl ); - -/** - * \brief Initialize an SSL configuration context - * Just makes the context ready for - * mbedtls_ssl_config_defaults() or mbedtls_ssl_config_free(). - * - * \note You need to call mbedtls_ssl_config_defaults() unless you - * manually set all of the relevent fields yourself. - * - * \param conf SSL configuration context - */ -void mbedtls_ssl_config_init( mbedtls_ssl_config *conf ); - -/** - * \brief Load reasonnable default SSL configuration values. - * (You need to call mbedtls_ssl_config_init() first.) - * - * \param conf SSL configuration context - * \param endpoint MBEDTLS_SSL_IS_CLIENT or MBEDTLS_SSL_IS_SERVER - * \param transport MBEDTLS_SSL_TRANSPORT_STREAM for TLS, or - * MBEDTLS_SSL_TRANSPORT_DATAGRAM for DTLS - * \param preset a MBEDTLS_SSL_PRESET_XXX value - * (currently unused). - * - * \note See \c mbedtls_ssl_conf_transport() for notes on DTLS. - * - * \return 0 if successful, or - * MBEDTLS_ERR_XXX_ALLOC_FAILED on memory allocation error. - */ -int mbedtls_ssl_config_defaults( mbedtls_ssl_config *conf, - int endpoint, int transport, int preset ); - -/** - * \brief Free an SSL configuration context - * - * \param conf SSL configuration context - */ -void mbedtls_ssl_config_free( mbedtls_ssl_config *conf ); - -/** - * \brief Initialize SSL session structure - * - * \param session SSL session - */ -void mbedtls_ssl_session_init( mbedtls_ssl_session *session ); - -/** - * \brief Free referenced items in an SSL session including the - * peer certificate and clear memory - * - * \param session SSL session - */ -void mbedtls_ssl_session_free( mbedtls_ssl_session *session ); - -#ifdef __cplusplus -} -#endif - -#endif /* ssl.h */ diff --git a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/ssl_cache.h b/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/ssl_cache.h deleted file mode 100644 index 53f043e9..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/ssl_cache.h +++ /dev/null @@ -1,143 +0,0 @@ -/** - * \file ssl_cache.h - * - * \brief SSL session cache implementation - * - * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * This file is part of mbed TLS (https://tls.mbed.org) - */ -#ifndef MBEDTLS_SSL_CACHE_H -#define MBEDTLS_SSL_CACHE_H - -#include "ssl.h" - -#if defined(MBEDTLS_THREADING_C) -#include "threading.h" -#endif - -/** - * \name SECTION: Module settings - * - * The configuration options you can set for this module are in this section. - * Either change them in config.h or define them on the compiler command line. - * \{ - */ - -#if !defined(MBEDTLS_SSL_CACHE_DEFAULT_TIMEOUT) -#define MBEDTLS_SSL_CACHE_DEFAULT_TIMEOUT 86400 /*!< 1 day */ -#endif - -#if !defined(MBEDTLS_SSL_CACHE_DEFAULT_MAX_ENTRIES) -#define MBEDTLS_SSL_CACHE_DEFAULT_MAX_ENTRIES 50 /*!< Maximum entries in cache */ -#endif - -/* \} name SECTION: Module settings */ - -#ifdef __cplusplus -extern "C" { -#endif - -typedef struct mbedtls_ssl_cache_context mbedtls_ssl_cache_context; -typedef struct mbedtls_ssl_cache_entry mbedtls_ssl_cache_entry; - -/** - * \brief This structure is used for storing cache entries - */ -struct mbedtls_ssl_cache_entry -{ -#if defined(MBEDTLS_HAVE_TIME) - time_t timestamp; /*!< entry timestamp */ -#endif - mbedtls_ssl_session session; /*!< entry session */ -#if defined(MBEDTLS_X509_CRT_PARSE_C) - mbedtls_x509_buf peer_cert; /*!< entry peer_cert */ -#endif - mbedtls_ssl_cache_entry *next; /*!< chain pointer */ -}; - -/** - * \brief Cache context - */ -struct mbedtls_ssl_cache_context -{ - mbedtls_ssl_cache_entry *chain; /*!< start of the chain */ - int timeout; /*!< cache entry timeout */ - int max_entries; /*!< maximum entries */ -#if defined(MBEDTLS_THREADING_C) - mbedtls_threading_mutex_t mutex; /*!< mutex */ -#endif -}; - -/** - * \brief Initialize an SSL cache context - * - * \param cache SSL cache context - */ -void mbedtls_ssl_cache_init( mbedtls_ssl_cache_context *cache ); - -/** - * \brief Cache get callback implementation - * (Thread-safe if MBEDTLS_THREADING_C is enabled) - * - * \param data SSL cache context - * \param session session to retrieve entry for - */ -int mbedtls_ssl_cache_get( void *data, mbedtls_ssl_session *session ); - -/** - * \brief Cache set callback implementation - * (Thread-safe if MBEDTLS_THREADING_C is enabled) - * - * \param data SSL cache context - * \param session session to store entry for - */ -int mbedtls_ssl_cache_set( void *data, const mbedtls_ssl_session *session ); - -#if defined(MBEDTLS_HAVE_TIME) -/** - * \brief Set the cache timeout - * (Default: MBEDTLS_SSL_CACHE_DEFAULT_TIMEOUT (1 day)) - * - * A timeout of 0 indicates no timeout. - * - * \param cache SSL cache context - * \param timeout cache entry timeout in seconds - */ -void mbedtls_ssl_cache_set_timeout( mbedtls_ssl_cache_context *cache, int timeout ); -#endif /* MBEDTLS_HAVE_TIME */ - -/** - * \brief Set the cache timeout - * (Default: MBEDTLS_SSL_CACHE_DEFAULT_MAX_ENTRIES (50)) - * - * \param cache SSL cache context - * \param max cache entry maximum - */ -void mbedtls_ssl_cache_set_max_entries( mbedtls_ssl_cache_context *cache, int max ); - -/** - * \brief Free referenced items in a cache context and clear memory - * - * \param cache SSL cache context - */ -void mbedtls_ssl_cache_free( mbedtls_ssl_cache_context *cache ); - -#ifdef __cplusplus -} -#endif - -#endif /* ssl_cache.h */ diff --git a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/ssl_ciphersuites.h b/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/ssl_ciphersuites.h deleted file mode 100644 index 75d4a8a0..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/ssl_ciphersuites.h +++ /dev/null @@ -1,303 +0,0 @@ -/** - * \file ssl_ciphersuites.h - * - * \brief SSL Ciphersuites for mbed TLS - * - * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * This file is part of mbed TLS (https://tls.mbed.org) - */ -#ifndef MBEDTLS_SSL_CIPHERSUITES_H -#define MBEDTLS_SSL_CIPHERSUITES_H - -#include "pk.h" -#include "cipher.h" -#include "md.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/* - * Supported ciphersuites (Official IANA names) - */ -#define MBEDTLS_TLS_RSA_WITH_NULL_MD5 0x01 /**< Weak! */ -#define MBEDTLS_TLS_RSA_WITH_NULL_SHA 0x02 /**< Weak! */ - -#define MBEDTLS_TLS_RSA_WITH_RC4_128_MD5 0x04 -#define MBEDTLS_TLS_RSA_WITH_RC4_128_SHA 0x05 -#define MBEDTLS_TLS_RSA_WITH_DES_CBC_SHA 0x09 /**< Weak! Not in TLS 1.2 */ - -#define MBEDTLS_TLS_RSA_WITH_3DES_EDE_CBC_SHA 0x0A - -#define MBEDTLS_TLS_DHE_RSA_WITH_DES_CBC_SHA 0x15 /**< Weak! Not in TLS 1.2 */ -#define MBEDTLS_TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA 0x16 - -#define MBEDTLS_TLS_PSK_WITH_NULL_SHA 0x2C /**< Weak! */ -#define MBEDTLS_TLS_DHE_PSK_WITH_NULL_SHA 0x2D /**< Weak! */ -#define MBEDTLS_TLS_RSA_PSK_WITH_NULL_SHA 0x2E /**< Weak! */ -#define MBEDTLS_TLS_RSA_WITH_AES_128_CBC_SHA 0x2F - -#define MBEDTLS_TLS_DHE_RSA_WITH_AES_128_CBC_SHA 0x33 -#define MBEDTLS_TLS_RSA_WITH_AES_256_CBC_SHA 0x35 -#define MBEDTLS_TLS_DHE_RSA_WITH_AES_256_CBC_SHA 0x39 - -#define MBEDTLS_TLS_RSA_WITH_NULL_SHA256 0x3B /**< Weak! */ -#define MBEDTLS_TLS_RSA_WITH_AES_128_CBC_SHA256 0x3C /**< TLS 1.2 */ -#define MBEDTLS_TLS_RSA_WITH_AES_256_CBC_SHA256 0x3D /**< TLS 1.2 */ - -#define MBEDTLS_TLS_RSA_WITH_CAMELLIA_128_CBC_SHA 0x41 -#define MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA 0x45 - -#define MBEDTLS_TLS_DHE_RSA_WITH_AES_128_CBC_SHA256 0x67 /**< TLS 1.2 */ -#define MBEDTLS_TLS_DHE_RSA_WITH_AES_256_CBC_SHA256 0x6B /**< TLS 1.2 */ - -#define MBEDTLS_TLS_RSA_WITH_CAMELLIA_256_CBC_SHA 0x84 -#define MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA 0x88 - -#define MBEDTLS_TLS_PSK_WITH_RC4_128_SHA 0x8A -#define MBEDTLS_TLS_PSK_WITH_3DES_EDE_CBC_SHA 0x8B -#define MBEDTLS_TLS_PSK_WITH_AES_128_CBC_SHA 0x8C -#define MBEDTLS_TLS_PSK_WITH_AES_256_CBC_SHA 0x8D - -#define MBEDTLS_TLS_DHE_PSK_WITH_RC4_128_SHA 0x8E -#define MBEDTLS_TLS_DHE_PSK_WITH_3DES_EDE_CBC_SHA 0x8F -#define MBEDTLS_TLS_DHE_PSK_WITH_AES_128_CBC_SHA 0x90 -#define MBEDTLS_TLS_DHE_PSK_WITH_AES_256_CBC_SHA 0x91 - -#define MBEDTLS_TLS_RSA_PSK_WITH_RC4_128_SHA 0x92 -#define MBEDTLS_TLS_RSA_PSK_WITH_3DES_EDE_CBC_SHA 0x93 -#define MBEDTLS_TLS_RSA_PSK_WITH_AES_128_CBC_SHA 0x94 -#define MBEDTLS_TLS_RSA_PSK_WITH_AES_256_CBC_SHA 0x95 - -#define MBEDTLS_TLS_RSA_WITH_AES_128_GCM_SHA256 0x9C /**< TLS 1.2 */ -#define MBEDTLS_TLS_RSA_WITH_AES_256_GCM_SHA384 0x9D /**< TLS 1.2 */ -#define MBEDTLS_TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 0x9E /**< TLS 1.2 */ -#define MBEDTLS_TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 0x9F /**< TLS 1.2 */ - -#define MBEDTLS_TLS_PSK_WITH_AES_128_GCM_SHA256 0xA8 /**< TLS 1.2 */ -#define MBEDTLS_TLS_PSK_WITH_AES_256_GCM_SHA384 0xA9 /**< TLS 1.2 */ -#define MBEDTLS_TLS_DHE_PSK_WITH_AES_128_GCM_SHA256 0xAA /**< TLS 1.2 */ -#define MBEDTLS_TLS_DHE_PSK_WITH_AES_256_GCM_SHA384 0xAB /**< TLS 1.2 */ -#define MBEDTLS_TLS_RSA_PSK_WITH_AES_128_GCM_SHA256 0xAC /**< TLS 1.2 */ -#define MBEDTLS_TLS_RSA_PSK_WITH_AES_256_GCM_SHA384 0xAD /**< TLS 1.2 */ - -#define MBEDTLS_TLS_PSK_WITH_AES_128_CBC_SHA256 0xAE -#define MBEDTLS_TLS_PSK_WITH_AES_256_CBC_SHA384 0xAF -#define MBEDTLS_TLS_PSK_WITH_NULL_SHA256 0xB0 /**< Weak! */ -#define MBEDTLS_TLS_PSK_WITH_NULL_SHA384 0xB1 /**< Weak! */ - -#define MBEDTLS_TLS_DHE_PSK_WITH_AES_128_CBC_SHA256 0xB2 -#define MBEDTLS_TLS_DHE_PSK_WITH_AES_256_CBC_SHA384 0xB3 -#define MBEDTLS_TLS_DHE_PSK_WITH_NULL_SHA256 0xB4 /**< Weak! */ -#define MBEDTLS_TLS_DHE_PSK_WITH_NULL_SHA384 0xB5 /**< Weak! */ - -#define MBEDTLS_TLS_RSA_PSK_WITH_AES_128_CBC_SHA256 0xB6 -#define MBEDTLS_TLS_RSA_PSK_WITH_AES_256_CBC_SHA384 0xB7 -#define MBEDTLS_TLS_RSA_PSK_WITH_NULL_SHA256 0xB8 /**< Weak! */ -#define MBEDTLS_TLS_RSA_PSK_WITH_NULL_SHA384 0xB9 /**< Weak! */ - -#define MBEDTLS_TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256 0xBA /**< TLS 1.2 */ -#define MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256 0xBE /**< TLS 1.2 */ - -#define MBEDTLS_TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256 0xC0 /**< TLS 1.2 */ -#define MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256 0xC4 /**< TLS 1.2 */ - -#define MBEDTLS_TLS_ECDH_ECDSA_WITH_NULL_SHA 0xC001 /**< Weak! */ -#define MBEDTLS_TLS_ECDH_ECDSA_WITH_RC4_128_SHA 0xC002 /**< Not in SSL3! */ -#define MBEDTLS_TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA 0xC003 /**< Not in SSL3! */ -#define MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA 0xC004 /**< Not in SSL3! */ -#define MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA 0xC005 /**< Not in SSL3! */ - -#define MBEDTLS_TLS_ECDHE_ECDSA_WITH_NULL_SHA 0xC006 /**< Weak! */ -#define MBEDTLS_TLS_ECDHE_ECDSA_WITH_RC4_128_SHA 0xC007 /**< Not in SSL3! */ -#define MBEDTLS_TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA 0xC008 /**< Not in SSL3! */ -#define MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA 0xC009 /**< Not in SSL3! */ -#define MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA 0xC00A /**< Not in SSL3! */ - -#define MBEDTLS_TLS_ECDH_RSA_WITH_NULL_SHA 0xC00B /**< Weak! */ -#define MBEDTLS_TLS_ECDH_RSA_WITH_RC4_128_SHA 0xC00C /**< Not in SSL3! */ -#define MBEDTLS_TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA 0xC00D /**< Not in SSL3! */ -#define MBEDTLS_TLS_ECDH_RSA_WITH_AES_128_CBC_SHA 0xC00E /**< Not in SSL3! */ -#define MBEDTLS_TLS_ECDH_RSA_WITH_AES_256_CBC_SHA 0xC00F /**< Not in SSL3! */ - -#define MBEDTLS_TLS_ECDHE_RSA_WITH_NULL_SHA 0xC010 /**< Weak! */ -#define MBEDTLS_TLS_ECDHE_RSA_WITH_RC4_128_SHA 0xC011 /**< Not in SSL3! */ -#define MBEDTLS_TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA 0xC012 /**< Not in SSL3! */ -#define MBEDTLS_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA 0xC013 /**< Not in SSL3! */ -#define MBEDTLS_TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA 0xC014 /**< Not in SSL3! */ - -#define MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 0xC023 /**< TLS 1.2 */ -#define MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384 0xC024 /**< TLS 1.2 */ -#define MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256 0xC025 /**< TLS 1.2 */ -#define MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384 0xC026 /**< TLS 1.2 */ -#define MBEDTLS_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 0xC027 /**< TLS 1.2 */ -#define MBEDTLS_TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 0xC028 /**< TLS 1.2 */ -#define MBEDTLS_TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256 0xC029 /**< TLS 1.2 */ -#define MBEDTLS_TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384 0xC02A /**< TLS 1.2 */ - -#define MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 0xC02B /**< TLS 1.2 */ -#define MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 0xC02C /**< TLS 1.2 */ -#define MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256 0xC02D /**< TLS 1.2 */ -#define MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384 0xC02E /**< TLS 1.2 */ -#define MBEDTLS_TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 0xC02F /**< TLS 1.2 */ -#define MBEDTLS_TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 0xC030 /**< TLS 1.2 */ -#define MBEDTLS_TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256 0xC031 /**< TLS 1.2 */ -#define MBEDTLS_TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384 0xC032 /**< TLS 1.2 */ - -#define MBEDTLS_TLS_ECDHE_PSK_WITH_RC4_128_SHA 0xC033 /**< Not in SSL3! */ -#define MBEDTLS_TLS_ECDHE_PSK_WITH_3DES_EDE_CBC_SHA 0xC034 /**< Not in SSL3! */ -#define MBEDTLS_TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA 0xC035 /**< Not in SSL3! */ -#define MBEDTLS_TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA 0xC036 /**< Not in SSL3! */ -#define MBEDTLS_TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256 0xC037 /**< Not in SSL3! */ -#define MBEDTLS_TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA384 0xC038 /**< Not in SSL3! */ -#define MBEDTLS_TLS_ECDHE_PSK_WITH_NULL_SHA 0xC039 /**< Weak! No SSL3! */ -#define MBEDTLS_TLS_ECDHE_PSK_WITH_NULL_SHA256 0xC03A /**< Weak! No SSL3! */ -#define MBEDTLS_TLS_ECDHE_PSK_WITH_NULL_SHA384 0xC03B /**< Weak! No SSL3! */ - -#define MBEDTLS_TLS_ECDHE_ECDSA_WITH_CAMELLIA_128_CBC_SHA256 0xC072 /**< Not in SSL3! */ -#define MBEDTLS_TLS_ECDHE_ECDSA_WITH_CAMELLIA_256_CBC_SHA384 0xC073 /**< Not in SSL3! */ -#define MBEDTLS_TLS_ECDH_ECDSA_WITH_CAMELLIA_128_CBC_SHA256 0xC074 /**< Not in SSL3! */ -#define MBEDTLS_TLS_ECDH_ECDSA_WITH_CAMELLIA_256_CBC_SHA384 0xC075 /**< Not in SSL3! */ -#define MBEDTLS_TLS_ECDHE_RSA_WITH_CAMELLIA_128_CBC_SHA256 0xC076 /**< Not in SSL3! */ -#define MBEDTLS_TLS_ECDHE_RSA_WITH_CAMELLIA_256_CBC_SHA384 0xC077 /**< Not in SSL3! */ -#define MBEDTLS_TLS_ECDH_RSA_WITH_CAMELLIA_128_CBC_SHA256 0xC078 /**< Not in SSL3! */ -#define MBEDTLS_TLS_ECDH_RSA_WITH_CAMELLIA_256_CBC_SHA384 0xC079 /**< Not in SSL3! */ - -#define MBEDTLS_TLS_RSA_WITH_CAMELLIA_128_GCM_SHA256 0xC07A /**< TLS 1.2 */ -#define MBEDTLS_TLS_RSA_WITH_CAMELLIA_256_GCM_SHA384 0xC07B /**< TLS 1.2 */ -#define MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_128_GCM_SHA256 0xC07C /**< TLS 1.2 */ -#define MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_256_GCM_SHA384 0xC07D /**< TLS 1.2 */ -#define MBEDTLS_TLS_ECDHE_ECDSA_WITH_CAMELLIA_128_GCM_SHA256 0xC086 /**< TLS 1.2 */ -#define MBEDTLS_TLS_ECDHE_ECDSA_WITH_CAMELLIA_256_GCM_SHA384 0xC087 /**< TLS 1.2 */ -#define MBEDTLS_TLS_ECDH_ECDSA_WITH_CAMELLIA_128_GCM_SHA256 0xC088 /**< TLS 1.2 */ -#define MBEDTLS_TLS_ECDH_ECDSA_WITH_CAMELLIA_256_GCM_SHA384 0xC089 /**< TLS 1.2 */ -#define MBEDTLS_TLS_ECDHE_RSA_WITH_CAMELLIA_128_GCM_SHA256 0xC08A /**< TLS 1.2 */ -#define MBEDTLS_TLS_ECDHE_RSA_WITH_CAMELLIA_256_GCM_SHA384 0xC08B /**< TLS 1.2 */ -#define MBEDTLS_TLS_ECDH_RSA_WITH_CAMELLIA_128_GCM_SHA256 0xC08C /**< TLS 1.2 */ -#define MBEDTLS_TLS_ECDH_RSA_WITH_CAMELLIA_256_GCM_SHA384 0xC08D /**< TLS 1.2 */ - -#define MBEDTLS_TLS_PSK_WITH_CAMELLIA_128_GCM_SHA256 0xC08E /**< TLS 1.2 */ -#define MBEDTLS_TLS_PSK_WITH_CAMELLIA_256_GCM_SHA384 0xC08F /**< TLS 1.2 */ -#define MBEDTLS_TLS_DHE_PSK_WITH_CAMELLIA_128_GCM_SHA256 0xC090 /**< TLS 1.2 */ -#define MBEDTLS_TLS_DHE_PSK_WITH_CAMELLIA_256_GCM_SHA384 0xC091 /**< TLS 1.2 */ -#define MBEDTLS_TLS_RSA_PSK_WITH_CAMELLIA_128_GCM_SHA256 0xC092 /**< TLS 1.2 */ -#define MBEDTLS_TLS_RSA_PSK_WITH_CAMELLIA_256_GCM_SHA384 0xC093 /**< TLS 1.2 */ - -#define MBEDTLS_TLS_PSK_WITH_CAMELLIA_128_CBC_SHA256 0xC094 -#define MBEDTLS_TLS_PSK_WITH_CAMELLIA_256_CBC_SHA384 0xC095 -#define MBEDTLS_TLS_DHE_PSK_WITH_CAMELLIA_128_CBC_SHA256 0xC096 -#define MBEDTLS_TLS_DHE_PSK_WITH_CAMELLIA_256_CBC_SHA384 0xC097 -#define MBEDTLS_TLS_RSA_PSK_WITH_CAMELLIA_128_CBC_SHA256 0xC098 -#define MBEDTLS_TLS_RSA_PSK_WITH_CAMELLIA_256_CBC_SHA384 0xC099 -#define MBEDTLS_TLS_ECDHE_PSK_WITH_CAMELLIA_128_CBC_SHA256 0xC09A /**< Not in SSL3! */ -#define MBEDTLS_TLS_ECDHE_PSK_WITH_CAMELLIA_256_CBC_SHA384 0xC09B /**< Not in SSL3! */ - -#define MBEDTLS_TLS_RSA_WITH_AES_128_CCM 0xC09C /**< TLS 1.2 */ -#define MBEDTLS_TLS_RSA_WITH_AES_256_CCM 0xC09D /**< TLS 1.2 */ -#define MBEDTLS_TLS_DHE_RSA_WITH_AES_128_CCM 0xC09E /**< TLS 1.2 */ -#define MBEDTLS_TLS_DHE_RSA_WITH_AES_256_CCM 0xC09F /**< TLS 1.2 */ -#define MBEDTLS_TLS_RSA_WITH_AES_128_CCM_8 0xC0A0 /**< TLS 1.2 */ -#define MBEDTLS_TLS_RSA_WITH_AES_256_CCM_8 0xC0A1 /**< TLS 1.2 */ -#define MBEDTLS_TLS_DHE_RSA_WITH_AES_128_CCM_8 0xC0A2 /**< TLS 1.2 */ -#define MBEDTLS_TLS_DHE_RSA_WITH_AES_256_CCM_8 0xC0A3 /**< TLS 1.2 */ -#define MBEDTLS_TLS_PSK_WITH_AES_128_CCM 0xC0A4 /**< TLS 1.2 */ -#define MBEDTLS_TLS_PSK_WITH_AES_256_CCM 0xC0A5 /**< TLS 1.2 */ -#define MBEDTLS_TLS_DHE_PSK_WITH_AES_128_CCM 0xC0A6 /**< TLS 1.2 */ -#define MBEDTLS_TLS_DHE_PSK_WITH_AES_256_CCM 0xC0A7 /**< TLS 1.2 */ -#define MBEDTLS_TLS_PSK_WITH_AES_128_CCM_8 0xC0A8 /**< TLS 1.2 */ -#define MBEDTLS_TLS_PSK_WITH_AES_256_CCM_8 0xC0A9 /**< TLS 1.2 */ -#define MBEDTLS_TLS_DHE_PSK_WITH_AES_128_CCM_8 0xC0AA /**< TLS 1.2 */ -#define MBEDTLS_TLS_DHE_PSK_WITH_AES_256_CCM_8 0xC0AB /**< TLS 1.2 */ -/* The last two are named with PSK_DHE in the RFC, which looks like a typo */ - -#define MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_CCM 0xC0AC /**< TLS 1.2 */ -#define MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_CCM 0xC0AD /**< TLS 1.2 */ -#define MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8 0xC0AE /**< TLS 1.2 */ -#define MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8 0xC0AF /**< TLS 1.2 */ - -/* Reminder: update mbedtls_ssl_premaster_secret when adding a new key exchange. - * Reminder: update MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED below. - */ -typedef enum { - MBEDTLS_KEY_EXCHANGE_NONE = 0, - MBEDTLS_KEY_EXCHANGE_RSA, - MBEDTLS_KEY_EXCHANGE_DHE_RSA, - MBEDTLS_KEY_EXCHANGE_ECDHE_RSA, - MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA, - MBEDTLS_KEY_EXCHANGE_PSK, - MBEDTLS_KEY_EXCHANGE_DHE_PSK, - MBEDTLS_KEY_EXCHANGE_RSA_PSK, - MBEDTLS_KEY_EXCHANGE_ECDHE_PSK, - MBEDTLS_KEY_EXCHANGE_ECDH_RSA, - MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA, -} mbedtls_key_exchange_type_t; - -#if defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED) || \ - defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED) || \ - defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) || \ - defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED) || \ - defined(MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED) || \ - defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED) || \ - defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) || \ - defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED) -#define MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED -#endif - -typedef struct mbedtls_ssl_ciphersuite_t mbedtls_ssl_ciphersuite_t; - -#define MBEDTLS_CIPHERSUITE_WEAK 0x01 /**< Weak ciphersuite flag */ -#define MBEDTLS_CIPHERSUITE_SHORT_TAG 0x02 /**< Short authentication tag, - eg for CCM_8 */ -#define MBEDTLS_CIPHERSUITE_NODTLS 0x04 /**< Can't be used with DTLS */ - -/** - * \brief This structure is used for storing ciphersuite information - */ -struct mbedtls_ssl_ciphersuite_t -{ - int id; - const char * name; - - mbedtls_cipher_type_t cipher; - mbedtls_md_type_t mac; - mbedtls_key_exchange_type_t key_exchange; - - int min_major_ver; - int min_minor_ver; - int max_major_ver; - int max_minor_ver; - - unsigned char flags; -}; - -const int *mbedtls_ssl_list_ciphersuites( void ); - -const mbedtls_ssl_ciphersuite_t *mbedtls_ssl_ciphersuite_from_string( const char *ciphersuite_name ); -const mbedtls_ssl_ciphersuite_t *mbedtls_ssl_ciphersuite_from_id( int ciphersuite_id ); - -#if defined(MBEDTLS_PK_C) -mbedtls_pk_type_t mbedtls_ssl_get_ciphersuite_sig_pk_alg( const mbedtls_ssl_ciphersuite_t *info ); -#endif - -int mbedtls_ssl_ciphersuite_uses_ec( const mbedtls_ssl_ciphersuite_t *info ); -int mbedtls_ssl_ciphersuite_uses_psk( const mbedtls_ssl_ciphersuite_t *info ); - -#ifdef __cplusplus -} -#endif - -#endif /* ssl_ciphersuites.h */ diff --git a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/ssl_cookie.h b/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/ssl_cookie.h deleted file mode 100644 index 037e1c31..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/ssl_cookie.h +++ /dev/null @@ -1,108 +0,0 @@ -/** - * \file ssl_cookie.h - * - * \brief DTLS cookie callbacks implementation - * - * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * This file is part of mbed TLS (https://tls.mbed.org) - */ -#ifndef MBEDTLS_SSL_COOKIE_H -#define MBEDTLS_SSL_COOKIE_H - -#include "ssl.h" - -#if defined(MBEDTLS_THREADING_C) -#include "threading.h" -#endif - -/** - * \name SECTION: Module settings - * - * The configuration options you can set for this module are in this section. - * Either change them in config.h or define them on the compiler command line. - * \{ - */ -#ifndef MBEDTLS_SSL_COOKIE_TIMEOUT -#define MBEDTLS_SSL_COOKIE_TIMEOUT 60 /**< Default expiration delay of DTLS cookies, in seconds if HAVE_TIME, or in number of cookies issued */ -#endif - -/* \} name SECTION: Module settings */ - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * \brief Context for the default cookie functions. - */ -typedef struct -{ - mbedtls_md_context_t hmac_ctx; /*!< context for the HMAC portion */ -#if !defined(MBEDTLS_HAVE_TIME) - unsigned long serial; /*!< serial number for expiration */ -#endif - unsigned long timeout; /*!< timeout delay, in seconds if HAVE_TIME, - or in number of tickets issued */ - -#if defined(MBEDTLS_THREADING_C) - mbedtls_threading_mutex_t mutex; -#endif -} mbedtls_ssl_cookie_ctx; - -/** - * \brief Initialize cookie context - */ -void mbedtls_ssl_cookie_init( mbedtls_ssl_cookie_ctx *ctx ); - -/** - * \brief Setup cookie context (generate keys) - */ -int mbedtls_ssl_cookie_setup( mbedtls_ssl_cookie_ctx *ctx, - int (*f_rng)(void *, unsigned char *, size_t), - void *p_rng ); - -/** - * \brief Set expiration delay for cookies - * (Default MBEDTLS_SSL_COOKIE_TIMEOUT) - * - * \param ctx Cookie contex - * \param delay Delay, in seconds if HAVE_TIME, or in number of cookies - * issued in the meantime. - * 0 to disable expiration (NOT recommended) - */ -void mbedtls_ssl_cookie_set_timeout( mbedtls_ssl_cookie_ctx *ctx, unsigned long delay ); - -/** - * \brief Free cookie context - */ -void mbedtls_ssl_cookie_free( mbedtls_ssl_cookie_ctx *ctx ); - -/** - * \brief Generate cookie, see \c mbedtls_ssl_cookie_write_t - */ -mbedtls_ssl_cookie_write_t mbedtls_ssl_cookie_write; - -/** - * \brief Verify cookie, see \c mbedtls_ssl_cookie_write_t - */ -mbedtls_ssl_cookie_check_t mbedtls_ssl_cookie_check; - -#ifdef __cplusplus -} -#endif - -#endif /* ssl_cookie.h */ diff --git a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/ssl_internal.h b/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/ssl_internal.h deleted file mode 100644 index 78c748cf..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/ssl_internal.h +++ /dev/null @@ -1,482 +0,0 @@ -/** - * \file ssl_ticket.h - * - * \brief Internal functions shared by the SSL modules - * - * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * This file is part of mbed TLS (https://tls.mbed.org) - */ -#ifndef MBEDTLS_SSL_INTERNAL_H -#define MBEDTLS_SSL_INTERNAL_H - -#include "ssl.h" - -#if defined(MBEDTLS_MD5_C) -#include "md5.h" -#endif - -#if defined(MBEDTLS_SHA1_C) -#include "sha1.h" -#endif - -#if defined(MBEDTLS_SHA256_C) -#include "sha256.h" -#endif - -#if defined(MBEDTLS_SHA512_C) -#include "sha512.h" -#endif - -#if ( defined(__ARMCC_VERSION) || defined(_MSC_VER) ) && \ - !defined(inline) && !defined(__cplusplus) -#define inline __inline -#endif - -/* Determine minimum supported version */ -#define MBEDTLS_SSL_MIN_MAJOR_VERSION MBEDTLS_SSL_MAJOR_VERSION_3 - -#if defined(MBEDTLS_SSL_PROTO_SSL3) -#define MBEDTLS_SSL_MIN_MINOR_VERSION MBEDTLS_SSL_MINOR_VERSION_0 -#else -#if defined(MBEDTLS_SSL_PROTO_TLS1) -#define MBEDTLS_SSL_MIN_MINOR_VERSION MBEDTLS_SSL_MINOR_VERSION_1 -#else -#if defined(MBEDTLS_SSL_PROTO_TLS1_1) -#define MBEDTLS_SSL_MIN_MINOR_VERSION MBEDTLS_SSL_MINOR_VERSION_2 -#else -#if defined(MBEDTLS_SSL_PROTO_TLS1_2) -#define MBEDTLS_SSL_MIN_MINOR_VERSION MBEDTLS_SSL_MINOR_VERSION_3 -#endif /* MBEDTLS_SSL_PROTO_TLS1_2 */ -#endif /* MBEDTLS_SSL_PROTO_TLS1_1 */ -#endif /* MBEDTLS_SSL_PROTO_TLS1 */ -#endif /* MBEDTLS_SSL_PROTO_SSL3 */ - -/* Determine maximum supported version */ -#define MBEDTLS_SSL_MAX_MAJOR_VERSION MBEDTLS_SSL_MAJOR_VERSION_3 - -#if defined(MBEDTLS_SSL_PROTO_TLS1_2) -#define MBEDTLS_SSL_MAX_MINOR_VERSION MBEDTLS_SSL_MINOR_VERSION_3 -#else -#if defined(MBEDTLS_SSL_PROTO_TLS1_1) -#define MBEDTLS_SSL_MAX_MINOR_VERSION MBEDTLS_SSL_MINOR_VERSION_2 -#else -#if defined(MBEDTLS_SSL_PROTO_TLS1) -#define MBEDTLS_SSL_MAX_MINOR_VERSION MBEDTLS_SSL_MINOR_VERSION_1 -#else -#if defined(MBEDTLS_SSL_PROTO_SSL3) -#define MBEDTLS_SSL_MAX_MINOR_VERSION MBEDTLS_SSL_MINOR_VERSION_0 -#endif /* MBEDTLS_SSL_PROTO_SSL3 */ -#endif /* MBEDTLS_SSL_PROTO_TLS1 */ -#endif /* MBEDTLS_SSL_PROTO_TLS1_1 */ -#endif /* MBEDTLS_SSL_PROTO_TLS1_2 */ - -#define MBEDTLS_SSL_INITIAL_HANDSHAKE 0 -#define MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS 1 /* In progress */ -#define MBEDTLS_SSL_RENEGOTIATION_DONE 2 /* Done or aborted */ -#define MBEDTLS_SSL_RENEGOTIATION_PENDING 3 /* Requested (server only) */ - -/* - * DTLS retransmission states, see RFC 6347 4.2.4 - * - * The SENDING state is merged in PREPARING for initial sends, - * but is distinct for resends. - * - * Note: initial state is wrong for server, but is not used anyway. - */ -#define MBEDTLS_SSL_RETRANS_PREPARING 0 -#define MBEDTLS_SSL_RETRANS_SENDING 1 -#define MBEDTLS_SSL_RETRANS_WAITING 2 -#define MBEDTLS_SSL_RETRANS_FINISHED 3 - -/* - * Allow extra bytes for record, authentication and encryption overhead: - * counter (8) + header (5) + IV(16) + MAC (16-48) + padding (0-256) - * and allow for a maximum of 1024 of compression expansion if - * enabled. - */ -#if defined(MBEDTLS_ZLIB_SUPPORT) -#define MBEDTLS_SSL_COMPRESSION_ADD 1024 -#else -#define MBEDTLS_SSL_COMPRESSION_ADD 0 -#endif - -#if defined(MBEDTLS_ARC4_C) || defined(MBEDTLS_CIPHER_MODE_CBC) -/* Ciphersuites using HMAC */ -#if defined(MBEDTLS_SHA512_C) -#define MBEDTLS_SSL_MAC_ADD 48 /* SHA-384 used for HMAC */ -#elif defined(MBEDTLS_SHA256_C) -#define MBEDTLS_SSL_MAC_ADD 32 /* SHA-256 used for HMAC */ -#else -#define MBEDTLS_SSL_MAC_ADD 20 /* SHA-1 used for HMAC */ -#endif -#else -/* AEAD ciphersuites: GCM and CCM use a 128 bits tag */ -#define MBEDTLS_SSL_MAC_ADD 16 -#endif - -#if defined(MBEDTLS_CIPHER_MODE_CBC) -#define MBEDTLS_SSL_PADDING_ADD 256 -#else -#define MBEDTLS_SSL_PADDING_ADD 0 -#endif - -#define MBEDTLS_SSL_BUFFER_LEN ( MBEDTLS_SSL_MAX_CONTENT_LEN \ - + MBEDTLS_SSL_COMPRESSION_ADD \ - + 29 /* counter + header + IV */ \ - + MBEDTLS_SSL_MAC_ADD \ - + MBEDTLS_SSL_PADDING_ADD \ - ) - -/* - * TLS extension flags (for extensions with outgoing ServerHello content - * that need it (e.g. for RENEGOTIATION_INFO the server already knows because - * of state of the renegotiation flag, so no indicator is required) - */ -#define MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS_PRESENT (1 << 0) - -#ifdef __cplusplus -extern "C" { -#endif - -/* - * This structure contains the parameters only needed during handshake. - */ -struct mbedtls_ssl_handshake_params -{ - /* - * Handshake specific crypto variables - */ - int sig_alg; /*!< Hash algorithm for signature */ - int cert_type; /*!< Requested cert type */ - int verify_sig_alg; /*!< Signature algorithm for verify */ -#if defined(MBEDTLS_DHM_C) - mbedtls_dhm_context dhm_ctx; /*!< DHM key exchange */ -#endif -#if defined(MBEDTLS_ECDH_C) - mbedtls_ecdh_context ecdh_ctx; /*!< ECDH key exchange */ -#endif -#if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C) - const mbedtls_ecp_curve_info **curves; /*!< Supported elliptic curves */ -#endif -#if defined(MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED) - unsigned char *psk; /*!< PSK from the callback */ - size_t psk_len; /*!< Length of PSK from callback */ -#endif -#if defined(MBEDTLS_X509_CRT_PARSE_C) - mbedtls_ssl_key_cert *key_cert; /*!< chosen key/cert pair (server) */ -#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION) - int sni_authmode; /*!< authmode from SNI callback */ - mbedtls_ssl_key_cert *sni_key_cert; /*!< key/cert list from SNI */ - mbedtls_x509_crt *sni_ca_chain; /*!< trusted CAs from SNI callback */ - mbedtls_x509_crl *sni_ca_crl; /*!< trusted CAs CRLs from SNI */ -#endif -#endif /* MBEDTLS_X509_CRT_PARSE_C */ -#if defined(MBEDTLS_SSL_PROTO_DTLS) - unsigned int out_msg_seq; /*!< Outgoing handshake sequence number */ - unsigned int in_msg_seq; /*!< Incoming handshake sequence number */ - - unsigned char *verify_cookie; /*!< Cli: HelloVerifyRequest cookie - Srv: unused */ - unsigned char verify_cookie_len; /*!< Cli: cookie length - Srv: flag for sending a cookie */ - - unsigned char *hs_msg; /*!< Reassembled handshake message */ - - uint32_t retransmit_timeout; /*!< Current value of timeout */ - unsigned char retransmit_state; /*!< Retransmission state */ - mbedtls_ssl_flight_item *flight; /*!< Current outgoing flight */ - mbedtls_ssl_flight_item *cur_msg; /*!< Current message in flight */ - unsigned int in_flight_start_seq; /*!< Minimum message sequence in the - flight being received */ - mbedtls_ssl_transform *alt_transform_out; /*!< Alternative transform for - resending messages */ - unsigned char alt_out_ctr[8]; /*!< Alternative record epoch/counter - for resending messages */ -#endif - - /* - * Checksum contexts - */ -#if defined(MBEDTLS_SSL_PROTO_SSL3) || defined(MBEDTLS_SSL_PROTO_TLS1) || \ - defined(MBEDTLS_SSL_PROTO_TLS1_1) - mbedtls_md5_context fin_md5; - mbedtls_sha1_context fin_sha1; -#endif -#if defined(MBEDTLS_SSL_PROTO_TLS1_2) -#if defined(MBEDTLS_SHA256_C) - mbedtls_sha256_context fin_sha256; -#endif -#if defined(MBEDTLS_SHA512_C) - mbedtls_sha512_context fin_sha512; -#endif -#endif /* MBEDTLS_SSL_PROTO_TLS1_2 */ - - void (*update_checksum)(mbedtls_ssl_context *, const unsigned char *, size_t); - void (*calc_verify)(mbedtls_ssl_context *, unsigned char *); - void (*calc_finished)(mbedtls_ssl_context *, unsigned char *, int); - int (*tls_prf)(const unsigned char *, size_t, const char *, - const unsigned char *, size_t, - unsigned char *, size_t); - - size_t pmslen; /*!< premaster length */ - - unsigned char randbytes[64]; /*!< random bytes */ - unsigned char premaster[MBEDTLS_PREMASTER_SIZE]; - /*!< premaster secret */ - - int resume; /*!< session resume indicator*/ - int max_major_ver; /*!< max. major version client*/ - int max_minor_ver; /*!< max. minor version client*/ - int cli_exts; /*!< client extension presence*/ - -#if defined(MBEDTLS_SSL_SESSION_TICKETS) - int new_session_ticket; /*!< use NewSessionTicket? */ -#endif /* MBEDTLS_SSL_SESSION_TICKETS */ -#if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET) - int extended_ms; /*!< use Extended Master Secret? */ -#endif -}; - -/* - * This structure contains a full set of runtime transform parameters - * either in negotiation or active. - */ -struct mbedtls_ssl_transform -{ - /* - * Session specific crypto layer - */ - const mbedtls_ssl_ciphersuite_t *ciphersuite_info; - /*!< Chosen cipersuite_info */ - unsigned int keylen; /*!< symmetric key length (bytes) */ - size_t minlen; /*!< min. ciphertext length */ - size_t ivlen; /*!< IV length */ - size_t fixed_ivlen; /*!< Fixed part of IV (AEAD) */ - size_t maclen; /*!< MAC length */ - - unsigned char iv_enc[16]; /*!< IV (encryption) */ - unsigned char iv_dec[16]; /*!< IV (decryption) */ - -#if defined(MBEDTLS_SSL_PROTO_SSL3) - /* Needed only for SSL v3.0 secret */ - unsigned char mac_enc[20]; /*!< SSL v3.0 secret (enc) */ - unsigned char mac_dec[20]; /*!< SSL v3.0 secret (dec) */ -#endif /* MBEDTLS_SSL_PROTO_SSL3 */ - - mbedtls_md_context_t md_ctx_enc; /*!< MAC (encryption) */ - mbedtls_md_context_t md_ctx_dec; /*!< MAC (decryption) */ - - mbedtls_cipher_context_t cipher_ctx_enc; /*!< encryption context */ - mbedtls_cipher_context_t cipher_ctx_dec; /*!< decryption context */ - - /* - * Session specific compression layer - */ -#if defined(MBEDTLS_ZLIB_SUPPORT) - z_stream ctx_deflate; /*!< compression context */ - z_stream ctx_inflate; /*!< decompression context */ -#endif -}; - -#if defined(MBEDTLS_X509_CRT_PARSE_C) -/* - * List of certificate + private key pairs - */ -struct mbedtls_ssl_key_cert -{ - mbedtls_x509_crt *cert; /*!< cert */ - mbedtls_pk_context *key; /*!< private key */ - mbedtls_ssl_key_cert *next; /*!< next key/cert pair */ -}; -#endif /* MBEDTLS_X509_CRT_PARSE_C */ - -#if defined(MBEDTLS_SSL_PROTO_DTLS) -/* - * List of handshake messages kept around for resending - */ -struct mbedtls_ssl_flight_item -{ - unsigned char *p; /*!< message, including handshake headers */ - size_t len; /*!< length of p */ - unsigned char type; /*!< type of the message: handshake or CCS */ - mbedtls_ssl_flight_item *next; /*!< next handshake message(s) */ -}; -#endif /* MBEDTLS_SSL_PROTO_DTLS */ - - -/** - * \brief Free referenced items in an SSL transform context and clear - * memory - * - * \param transform SSL transform context - */ -void mbedtls_ssl_transform_free( mbedtls_ssl_transform *transform ); - -/** - * \brief Free referenced items in an SSL handshake context and clear - * memory - * - * \param handshake SSL handshake context - */ -void mbedtls_ssl_handshake_free( mbedtls_ssl_handshake_params *handshake ); - -int mbedtls_ssl_handshake_client_step( mbedtls_ssl_context *ssl ); -int mbedtls_ssl_handshake_server_step( mbedtls_ssl_context *ssl ); -void mbedtls_ssl_handshake_wrapup( mbedtls_ssl_context *ssl ); - -int mbedtls_ssl_send_fatal_handshake_failure( mbedtls_ssl_context *ssl ); - -void mbedtls_ssl_reset_checksum( mbedtls_ssl_context *ssl ); -int mbedtls_ssl_derive_keys( mbedtls_ssl_context *ssl ); - -int mbedtls_ssl_read_record( mbedtls_ssl_context *ssl ); -int mbedtls_ssl_fetch_input( mbedtls_ssl_context *ssl, size_t nb_want ); - -int mbedtls_ssl_write_record( mbedtls_ssl_context *ssl ); -int mbedtls_ssl_flush_output( mbedtls_ssl_context *ssl ); - -int mbedtls_ssl_parse_certificate( mbedtls_ssl_context *ssl ); -int mbedtls_ssl_write_certificate( mbedtls_ssl_context *ssl ); - -int mbedtls_ssl_parse_change_cipher_spec( mbedtls_ssl_context *ssl ); -int mbedtls_ssl_write_change_cipher_spec( mbedtls_ssl_context *ssl ); - -int mbedtls_ssl_parse_finished( mbedtls_ssl_context *ssl ); -int mbedtls_ssl_write_finished( mbedtls_ssl_context *ssl ); - -void mbedtls_ssl_optimize_checksum( mbedtls_ssl_context *ssl, - const mbedtls_ssl_ciphersuite_t *ciphersuite_info ); - -#if defined(MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED) -int mbedtls_ssl_psk_derive_premaster( mbedtls_ssl_context *ssl, mbedtls_key_exchange_type_t key_ex ); -#endif - -#if defined(MBEDTLS_PK_C) -unsigned char mbedtls_ssl_sig_from_pk( mbedtls_pk_context *pk ); -mbedtls_pk_type_t mbedtls_ssl_pk_alg_from_sig( unsigned char sig ); -#endif - -mbedtls_md_type_t mbedtls_ssl_md_alg_from_hash( unsigned char hash ); -unsigned char mbedtls_ssl_hash_from_md_alg( int md ); - -#if defined(MBEDTLS_ECP_C) -int mbedtls_ssl_check_curve( const mbedtls_ssl_context *ssl, mbedtls_ecp_group_id grp_id ); -#endif - -#if defined(MBEDTLS_KEY_EXCHANGE__SOME__SIGNATURE_ENABLED) -int mbedtls_ssl_check_sig_hash( const mbedtls_ssl_context *ssl, - mbedtls_md_type_t md ); -#endif - -#if defined(MBEDTLS_X509_CRT_PARSE_C) -static inline mbedtls_pk_context *mbedtls_ssl_own_key( mbedtls_ssl_context *ssl ) -{ - mbedtls_ssl_key_cert *key_cert; - - if( ssl->handshake != NULL && ssl->handshake->key_cert != NULL ) - key_cert = ssl->handshake->key_cert; - else - key_cert = ssl->conf->key_cert; - - return( key_cert == NULL ? NULL : key_cert->key ); -} - -static inline mbedtls_x509_crt *mbedtls_ssl_own_cert( mbedtls_ssl_context *ssl ) -{ - mbedtls_ssl_key_cert *key_cert; - - if( ssl->handshake != NULL && ssl->handshake->key_cert != NULL ) - key_cert = ssl->handshake->key_cert; - else - key_cert = ssl->conf->key_cert; - - return( key_cert == NULL ? NULL : key_cert->cert ); -} - -/* - * Check usage of a certificate wrt extensions: - * keyUsage, extendedKeyUsage (later), and nSCertType (later). - * - * Warning: cert_endpoint is the endpoint of the cert (ie, of our peer when we - * check a cert we received from them)! - * - * Return 0 if everything is OK, -1 if not. - */ -int mbedtls_ssl_check_cert_usage( const mbedtls_x509_crt *cert, - const mbedtls_ssl_ciphersuite_t *ciphersuite, - int cert_endpoint, - uint32_t *flags ); -#endif /* MBEDTLS_X509_CRT_PARSE_C */ - -void mbedtls_ssl_write_version( int major, int minor, int transport, - unsigned char ver[2] ); -void mbedtls_ssl_read_version( int *major, int *minor, int transport, - const unsigned char ver[2] ); - -static inline size_t mbedtls_ssl_hdr_len( const mbedtls_ssl_context *ssl ) -{ -#if defined(MBEDTLS_SSL_PROTO_DTLS) - if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM ) - return( 13 ); -#else - ((void) ssl); -#endif - return( 5 ); -} - -static inline size_t mbedtls_ssl_hs_hdr_len( const mbedtls_ssl_context *ssl ) -{ -#if defined(MBEDTLS_SSL_PROTO_DTLS) - if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM ) - return( 12 ); -#else - ((void) ssl); -#endif - return( 4 ); -} - -#if defined(MBEDTLS_SSL_PROTO_DTLS) -void mbedtls_ssl_send_flight_completed( mbedtls_ssl_context *ssl ); -void mbedtls_ssl_recv_flight_completed( mbedtls_ssl_context *ssl ); -int mbedtls_ssl_resend( mbedtls_ssl_context *ssl ); -#endif - -/* Visible for testing purposes only */ -#if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY) -int mbedtls_ssl_dtls_replay_check( mbedtls_ssl_context *ssl ); -void mbedtls_ssl_dtls_replay_update( mbedtls_ssl_context *ssl ); -#endif - -/* constant-time buffer comparison */ -static inline int mbedtls_ssl_safer_memcmp( const void *a, const void *b, size_t n ) -{ - size_t i; - const unsigned char *A = (const unsigned char *) a; - const unsigned char *B = (const unsigned char *) b; - unsigned char diff = 0; - - for( i = 0; i < n; i++ ) - diff |= A[i] ^ B[i]; - - return( diff ); -} - -#ifdef __cplusplus -} -#endif - -#endif /* ssl_internal.h */ diff --git a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/ssl_ticket.h b/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/ssl_ticket.h deleted file mode 100644 index 7c6bc61b..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/ssl_ticket.h +++ /dev/null @@ -1,135 +0,0 @@ -/** - * \file ssl_ticket.h - * - * \brief TLS server ticket callbacks implementation - * - * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * This file is part of mbed TLS (https://tls.mbed.org) - */ -#ifndef MBEDTLS_SSL_TICKET_H -#define MBEDTLS_SSL_TICKET_H - -/* - * This implementation of the session ticket callbacks includes key - * management, rotating the keys periodically in order to preserve forward - * secrecy, when MBEDTLS_HAVE_TIME is defined. - */ - -#include "ssl.h" -#include "cipher.h" - -#if defined(MBEDTLS_THREADING_C) -#include "threading.h" -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * \brief Information for session ticket protection - */ -typedef struct -{ - unsigned char name[4]; /*!< random key identifier */ - uint32_t generation_time; /*!< key generation timestamp (seconds) */ - mbedtls_cipher_context_t ctx; /*!< context for auth enc/decryption */ -} -mbedtls_ssl_ticket_key; - -/** - * \brief Context for session ticket handling functions - */ -typedef struct -{ - mbedtls_ssl_ticket_key keys[2]; /*!< ticket protection keys */ - unsigned char active; /*!< index of the currently active key */ - - uint32_t ticket_lifetime; /*!< lifetime of tickets in seconds */ - - /** Callback for getting (pseudo-)random numbers */ - int (*f_rng)(void *, unsigned char *, size_t); - void *p_rng; /*!< context for the RNG function */ - -#if defined(MBEDTLS_THREADING_C) - mbedtls_threading_mutex_t mutex; -#endif -} -mbedtls_ssl_ticket_context; - -/** - * \brief Initialize a ticket context. - * (Just make it ready for mbedtls_ssl_ticket_setup() - * or mbedtls_ssl_ticket_free().) - * - * \param ctx Context to be initialized - */ -void mbedtls_ssl_ticket_init( mbedtls_ssl_ticket_context *ctx ); - -/** - * \brief Prepare context to be actually used - * - * \param ctx Context to be set up - * \param f_rng RNG callback function - * \param p_rng RNG callback context - * \param cipher AEAD cipher to use for ticket protection. - * Recommended value: MBEDTLS_CIPHER_AES_256_GCM. - * \param lifetime Tickets lifetime in seconds - * Recommended value: 86400 (one day). - * - * \note It is highly recommended to select a cipher that is at - * least as strong as the the strongest ciphersuite - * supported. Usually that means a 256-bit key. - * - * \note The lifetime of the keys is twice the lifetime of tickets. - * It is recommended to pick a reasonnable lifetime so as not - * to negate the benefits of forward secrecy. - * - * \return 0 if successful, - * or a specific MBEDTLS_ERR_XXX error code - */ -int mbedtls_ssl_ticket_setup( mbedtls_ssl_ticket_context *ctx, - int (*f_rng)(void *, unsigned char *, size_t), void *p_rng, - mbedtls_cipher_type_t cipher, - uint32_t lifetime ); - -/** - * \brief Implementation of the ticket write callback - * - * \note See \c mbedlts_ssl_ticket_write_t for description - */ -mbedtls_ssl_ticket_write_t mbedtls_ssl_ticket_write; - -/** - * \brief Implementation of the ticket parse callback - * - * \note See \c mbedlts_ssl_ticket_parse_t for description - */ -mbedtls_ssl_ticket_parse_t mbedtls_ssl_ticket_parse; - -/** - * \brief Free a context's content and zeroize it. - * - * \param ctx Context to be cleaned up - */ -void mbedtls_ssl_ticket_free( mbedtls_ssl_ticket_context *ctx ); - -#ifdef __cplusplus -} -#endif - -#endif /* ssl_ticket.h */ diff --git a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/threading.h b/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/threading.h deleted file mode 100644 index c39cbf24..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/threading.h +++ /dev/null @@ -1,104 +0,0 @@ -/** - * \file threading.h - * - * \brief Threading abstraction layer - * - * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * This file is part of mbed TLS (https://tls.mbed.org) - */ -#ifndef MBEDTLS_THREADING_H -#define MBEDTLS_THREADING_H - -#if !defined(MBEDTLS_CONFIG_FILE) -#include "config.h" -#else -#include MBEDTLS_CONFIG_FILE -#endif - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -#define MBEDTLS_ERR_THREADING_FEATURE_UNAVAILABLE -0x001A /**< The selected feature is not available. */ -#define MBEDTLS_ERR_THREADING_BAD_INPUT_DATA -0x001C /**< Bad input parameters to function. */ -#define MBEDTLS_ERR_THREADING_MUTEX_ERROR -0x001E /**< Locking / unlocking / free failed with error code. */ - -#if defined(MBEDTLS_THREADING_PTHREAD) -#include -typedef struct -{ - pthread_mutex_t mutex; - char is_valid; -} mbedtls_threading_mutex_t; -#endif - -#if defined(MBEDTLS_THREADING_ALT) -/* You should define the mbedtls_threading_mutex_t type in your header */ -#include "threading_alt.h" - -/** - * \brief Set your alternate threading implementation function - * pointers and initialize global mutexes. If used, this - * function must be called once in the main thread before any - * other mbed TLS function is called, and - * mbedtls_threading_free_alt() must be called once in the main - * thread after all other mbed TLS functions. - * - * \note mutex_init() and mutex_free() don't return a status code. - * If mutex_init() fails, it should leave its argument (the - * mutex) in a state such that mutex_lock() will fail when - * called with this argument. - * - * \param mutex_init the init function implementation - * \param mutex_free the free function implementation - * \param mutex_lock the lock function implementation - * \param mutex_unlock the unlock function implementation - */ -void mbedtls_threading_set_alt( void (*mutex_init)( mbedtls_threading_mutex_t * ), - void (*mutex_free)( mbedtls_threading_mutex_t * ), - int (*mutex_lock)( mbedtls_threading_mutex_t * ), - int (*mutex_unlock)( mbedtls_threading_mutex_t * ) ); - -/** - * \brief Free global mutexes. - */ -void mbedtls_threading_free_alt( void ); -#endif /* MBEDTLS_THREADING_ALT */ - -/* - * The function pointers for mutex_init, mutex_free, mutex_ and mutex_unlock - * - * All these functions are expected to work or the result will be undefined. - */ -extern void (*mbedtls_mutex_init)( mbedtls_threading_mutex_t *mutex ); -extern void (*mbedtls_mutex_free)( mbedtls_threading_mutex_t *mutex ); -extern int (*mbedtls_mutex_lock)( mbedtls_threading_mutex_t *mutex ); -extern int (*mbedtls_mutex_unlock)( mbedtls_threading_mutex_t *mutex ); - -/* - * Global mutexes - */ -extern mbedtls_threading_mutex_t mbedtls_threading_readdir_mutex; -extern mbedtls_threading_mutex_t mbedtls_threading_gmtime_mutex; - -#ifdef __cplusplus -} -#endif - -#endif /* threading.h */ diff --git a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/timing.h b/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/timing.h deleted file mode 100644 index ae7a713e..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/timing.h +++ /dev/null @@ -1,141 +0,0 @@ -/** - * \file timing.h - * - * \brief Portable interface to the CPU cycle counter - * - * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * This file is part of mbed TLS (https://tls.mbed.org) - */ -#ifndef MBEDTLS_TIMING_H -#define MBEDTLS_TIMING_H - -#if !defined(MBEDTLS_CONFIG_FILE) -#include "config.h" -#else -#include MBEDTLS_CONFIG_FILE -#endif - -#if !defined(MBEDTLS_TIMING_ALT) -// Regular implementation -// - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * \brief timer structure - */ -struct mbedtls_timing_hr_time -{ - unsigned char opaque[32]; -}; - -/** - * \brief Context for mbedtls_timing_set/get_delay() - */ -typedef struct -{ - struct mbedtls_timing_hr_time timer; - uint32_t int_ms; - uint32_t fin_ms; -} mbedtls_timing_delay_context; - -extern volatile int mbedtls_timing_alarmed; - -/** - * \brief Return the CPU cycle counter value - * - * \warning This is only a best effort! Do not rely on this! - * In particular, it is known to be unreliable on virtual - * machines. - */ -unsigned long mbedtls_timing_hardclock( void ); - -/** - * \brief Return the elapsed time in milliseconds - * - * \param val points to a timer structure - * \param reset if set to 1, the timer is restarted - */ -unsigned long mbedtls_timing_get_timer( struct mbedtls_timing_hr_time *val, int reset ); - -/** - * \brief Setup an alarm clock - * - * \param seconds delay before the "mbedtls_timing_alarmed" flag is set - * - * \warning Only one alarm at a time is supported. In a threaded - * context, this means one for the whole process, not one per - * thread. - */ -void mbedtls_set_alarm( int seconds ); - -/** - * \brief Set a pair of delays to watch - * (See \c mbedtls_timing_get_delay().) - * - * \param data Pointer to timing data - * Must point to a valid \c mbedtls_timing_delay_context struct. - * \param int_ms First (intermediate) delay in milliseconds. - * \param fin_ms Second (final) delay in milliseconds. - * Pass 0 to cancel the current delay. - */ -void mbedtls_timing_set_delay( void *data, uint32_t int_ms, uint32_t fin_ms ); - -/** - * \brief Get the status of delays - * (Memory helper: number of delays passed.) - * - * \param data Pointer to timing data - * Must point to a valid \c mbedtls_timing_delay_context struct. - * - * \return -1 if cancelled (fin_ms = 0) - * 0 if none of the delays are passed, - * 1 if only the intermediate delay is passed, - * 2 if the final delay is passed. - */ -int mbedtls_timing_get_delay( void *data ); - -#ifdef __cplusplus -} -#endif - -#else /* MBEDTLS_TIMING_ALT */ -#include "timing_alt.h" -#endif /* MBEDTLS_TIMING_ALT */ - -#ifdef __cplusplus -extern "C" { -#endif - -#if defined(MBEDTLS_SELF_TEST) -/** - * \brief Checkup routine - * - * \return 0 if successful, or 1 if a test failed - */ -int mbedtls_timing_self_test( int verbose ); -#endif - -#ifdef __cplusplus -} -#endif - -#endif /* timing.h */ diff --git a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/version.h b/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/version.h deleted file mode 100644 index 8bc2708e..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/version.h +++ /dev/null @@ -1,111 +0,0 @@ -/** - * \file version.h - * - * \brief Run-time version information - * - * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * This file is part of mbed TLS (https://tls.mbed.org) - */ -/* - * This set of compile-time defines and run-time variables can be used to - * determine the version number of the mbed TLS library used. - */ -#ifndef MBEDTLS_VERSION_H -#define MBEDTLS_VERSION_H - -#if !defined(MBEDTLS_CONFIG_FILE) -#include "config.h" -#else -#include MBEDTLS_CONFIG_FILE -#endif - -/** - * The version number x.y.z is split into three parts. - * Major, Minor, Patchlevel - */ -#define MBEDTLS_VERSION_MAJOR 2 -#define MBEDTLS_VERSION_MINOR 1 -#define MBEDTLS_VERSION_PATCH 2 - -/** - * The single version number has the following structure: - * MMNNPP00 - * Major version | Minor version | Patch version - */ -#define MBEDTLS_VERSION_NUMBER 0x02010200 -#define MBEDTLS_VERSION_STRING "2.1.2" -#define MBEDTLS_VERSION_STRING_FULL "mbed TLS 2.1.2" - -#if defined(MBEDTLS_VERSION_C) - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * Get the version number. - * - * \return The constructed version number in the format - * MMNNPP00 (Major, Minor, Patch). - */ -unsigned int mbedtls_version_get_number( void ); - -/** - * Get the version string ("x.y.z"). - * - * \param string The string that will receive the value. - * (Should be at least 9 bytes in size) - */ -void mbedtls_version_get_string( char *string ); - -/** - * Get the full version string ("mbed TLS x.y.z"). - * - * \param string The string that will receive the value. The mbed TLS version - * string will use 18 bytes AT MOST including a terminating - * null byte. - * (So the buffer should be at least 18 bytes to receive this - * version string). - */ -void mbedtls_version_get_string_full( char *string ); - -/** - * \brief Check if support for a feature was compiled into this - * mbed TLS binary. This allows you to see at runtime if the - * library was for instance compiled with or without - * Multi-threading support. - * - * \note only checks against defines in the sections "System - * support", "mbed TLS modules" and "mbed TLS feature - * support" in config.h - * - * \param feature The string for the define to check (e.g. "MBEDTLS_AES_C") - * - * \return 0 if the feature is present, - * -1 if the feature is not present and - * -2 if support for feature checking as a whole was not - * compiled in. - */ -int mbedtls_version_check_feature( const char *feature ); - -#ifdef __cplusplus -} -#endif - -#endif /* MBEDTLS_VERSION_C */ - -#endif /* version.h */ diff --git a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/x509.h b/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/x509.h deleted file mode 100644 index 54dac166..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/x509.h +++ /dev/null @@ -1,331 +0,0 @@ -/** - * \file x509.h - * - * \brief X.509 generic defines and structures - * - * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * This file is part of mbed TLS (https://tls.mbed.org) - */ -#ifndef MBEDTLS_X509_H -#define MBEDTLS_X509_H - -#if !defined(MBEDTLS_CONFIG_FILE) -#include "config.h" -#else -#include MBEDTLS_CONFIG_FILE -#endif - -#include "asn1.h" -#include "pk.h" - -#if defined(MBEDTLS_RSA_C) -#include "rsa.h" -#endif - -/** - * \addtogroup x509_module - * \{ - */ - -#if !defined(MBEDTLS_X509_MAX_INTERMEDIATE_CA) -/** - * Maximum number of intermediate CAs in a verification chain. - * That is, maximum length of the chain, excluding the end-entity certificate - * and the trusted root certificate. - * - * Set this to a low value to prevent an adversary from making you waste - * resources verifying an overlong certificate chain. - */ -#define MBEDTLS_X509_MAX_INTERMEDIATE_CA 8 -#endif - -/** - * \name X509 Error codes - * \{ - */ -#define MBEDTLS_ERR_X509_FEATURE_UNAVAILABLE -0x2080 /**< Unavailable feature, e.g. RSA hashing/encryption combination. */ -#define MBEDTLS_ERR_X509_UNKNOWN_OID -0x2100 /**< Requested OID is unknown. */ -#define MBEDTLS_ERR_X509_INVALID_FORMAT -0x2180 /**< The CRT/CRL/CSR format is invalid, e.g. different type expected. */ -#define MBEDTLS_ERR_X509_INVALID_VERSION -0x2200 /**< The CRT/CRL/CSR version element is invalid. */ -#define MBEDTLS_ERR_X509_INVALID_SERIAL -0x2280 /**< The serial tag or value is invalid. */ -#define MBEDTLS_ERR_X509_INVALID_ALG -0x2300 /**< The algorithm tag or value is invalid. */ -#define MBEDTLS_ERR_X509_INVALID_NAME -0x2380 /**< The name tag or value is invalid. */ -#define MBEDTLS_ERR_X509_INVALID_DATE -0x2400 /**< The date tag or value is invalid. */ -#define MBEDTLS_ERR_X509_INVALID_SIGNATURE -0x2480 /**< The signature tag or value invalid. */ -#define MBEDTLS_ERR_X509_INVALID_EXTENSIONS -0x2500 /**< The extension tag or value is invalid. */ -#define MBEDTLS_ERR_X509_UNKNOWN_VERSION -0x2580 /**< CRT/CRL/CSR has an unsupported version number. */ -#define MBEDTLS_ERR_X509_UNKNOWN_SIG_ALG -0x2600 /**< Signature algorithm (oid) is unsupported. */ -#define MBEDTLS_ERR_X509_SIG_MISMATCH -0x2680 /**< Signature algorithms do not match. (see \c ::mbedtls_x509_crt sig_oid) */ -#define MBEDTLS_ERR_X509_CERT_VERIFY_FAILED -0x2700 /**< Certificate verification failed, e.g. CRL, CA or signature check failed. */ -#define MBEDTLS_ERR_X509_CERT_UNKNOWN_FORMAT -0x2780 /**< Format not recognized as DER or PEM. */ -#define MBEDTLS_ERR_X509_BAD_INPUT_DATA -0x2800 /**< Input invalid. */ -#define MBEDTLS_ERR_X509_ALLOC_FAILED -0x2880 /**< Allocation of memory failed. */ -#define MBEDTLS_ERR_X509_FILE_IO_ERROR -0x2900 /**< Read/write of file failed. */ -#define MBEDTLS_ERR_X509_BUFFER_TOO_SMALL -0x2980 /**< Destination buffer is too small. */ -/* \} name */ - -/** - * \name X509 Verify codes - * \{ - */ -/* Reminder: update x509_crt_verify_strings[] in library/x509_crt.c */ -#define MBEDTLS_X509_BADCERT_EXPIRED 0x01 /**< The certificate validity has expired. */ -#define MBEDTLS_X509_BADCERT_REVOKED 0x02 /**< The certificate has been revoked (is on a CRL). */ -#define MBEDTLS_X509_BADCERT_CN_MISMATCH 0x04 /**< The certificate Common Name (CN) does not match with the expected CN. */ -#define MBEDTLS_X509_BADCERT_NOT_TRUSTED 0x08 /**< The certificate is not correctly signed by the trusted CA. */ -#define MBEDTLS_X509_BADCRL_NOT_TRUSTED 0x10 /**< The CRL is not correctly signed by the trusted CA. */ -#define MBEDTLS_X509_BADCRL_EXPIRED 0x20 /**< The CRL is expired. */ -#define MBEDTLS_X509_BADCERT_MISSING 0x40 /**< Certificate was missing. */ -#define MBEDTLS_X509_BADCERT_SKIP_VERIFY 0x80 /**< Certificate verification was skipped. */ -#define MBEDTLS_X509_BADCERT_OTHER 0x0100 /**< Other reason (can be used by verify callback) */ -#define MBEDTLS_X509_BADCERT_FUTURE 0x0200 /**< The certificate validity starts in the future. */ -#define MBEDTLS_X509_BADCRL_FUTURE 0x0400 /**< The CRL is from the future */ -#define MBEDTLS_X509_BADCERT_KEY_USAGE 0x0800 /**< Usage does not match the keyUsage extension. */ -#define MBEDTLS_X509_BADCERT_EXT_KEY_USAGE 0x1000 /**< Usage does not match the extendedKeyUsage extension. */ -#define MBEDTLS_X509_BADCERT_NS_CERT_TYPE 0x2000 /**< Usage does not match the nsCertType extension. */ -#define MBEDTLS_X509_BADCERT_BAD_MD 0x4000 /**< The certificate is signed with an unacceptable hash. */ -#define MBEDTLS_X509_BADCERT_BAD_PK 0x8000 /**< The certificate is signed with an unacceptable PK alg (eg RSA vs ECDSA). */ -#define MBEDTLS_X509_BADCERT_BAD_KEY 0x010000 /**< The certificate is signed with an unacceptable key (eg bad curve, RSA too short). */ -#define MBEDTLS_X509_BADCRL_BAD_MD 0x020000 /**< The CRL is signed with an unacceptable hash. */ -#define MBEDTLS_X509_BADCRL_BAD_PK 0x040000 /**< The CRL is signed with an unacceptable PK alg (eg RSA vs ECDSA). */ -#define MBEDTLS_X509_BADCRL_BAD_KEY 0x080000 /**< The CRL is signed with an unacceptable key (eg bad curve, RSA too short). */ - -/* \} name */ -/* \} addtogroup x509_module */ - -/* - * X.509 v3 Key Usage Extension flags - * Reminder: update x509_info_key_usage() when adding new flags. - */ -#define MBEDTLS_X509_KU_DIGITAL_SIGNATURE (0x80) /* bit 0 */ -#define MBEDTLS_X509_KU_NON_REPUDIATION (0x40) /* bit 1 */ -#define MBEDTLS_X509_KU_KEY_ENCIPHERMENT (0x20) /* bit 2 */ -#define MBEDTLS_X509_KU_DATA_ENCIPHERMENT (0x10) /* bit 3 */ -#define MBEDTLS_X509_KU_KEY_AGREEMENT (0x08) /* bit 4 */ -#define MBEDTLS_X509_KU_KEY_CERT_SIGN (0x04) /* bit 5 */ -#define MBEDTLS_X509_KU_CRL_SIGN (0x02) /* bit 6 */ -#define MBEDTLS_X509_KU_ENCIPHER_ONLY (0x01) /* bit 7 */ -#define MBEDTLS_X509_KU_DECIPHER_ONLY (0x8000) /* bit 8 */ - -/* - * Netscape certificate types - * (http://www.mozilla.org/projects/security/pki/nss/tech-notes/tn3.html) - */ - -#define MBEDTLS_X509_NS_CERT_TYPE_SSL_CLIENT (0x80) /* bit 0 */ -#define MBEDTLS_X509_NS_CERT_TYPE_SSL_SERVER (0x40) /* bit 1 */ -#define MBEDTLS_X509_NS_CERT_TYPE_EMAIL (0x20) /* bit 2 */ -#define MBEDTLS_X509_NS_CERT_TYPE_OBJECT_SIGNING (0x10) /* bit 3 */ -#define MBEDTLS_X509_NS_CERT_TYPE_RESERVED (0x08) /* bit 4 */ -#define MBEDTLS_X509_NS_CERT_TYPE_SSL_CA (0x04) /* bit 5 */ -#define MBEDTLS_X509_NS_CERT_TYPE_EMAIL_CA (0x02) /* bit 6 */ -#define MBEDTLS_X509_NS_CERT_TYPE_OBJECT_SIGNING_CA (0x01) /* bit 7 */ - -/* - * X.509 extension types - * - * Comments refer to the status for using certificates. Status can be - * different for writing certificates or reading CRLs or CSRs. - */ -#define MBEDTLS_X509_EXT_AUTHORITY_KEY_IDENTIFIER (1 << 0) -#define MBEDTLS_X509_EXT_SUBJECT_KEY_IDENTIFIER (1 << 1) -#define MBEDTLS_X509_EXT_KEY_USAGE (1 << 2) -#define MBEDTLS_X509_EXT_CERTIFICATE_POLICIES (1 << 3) -#define MBEDTLS_X509_EXT_POLICY_MAPPINGS (1 << 4) -#define MBEDTLS_X509_EXT_SUBJECT_ALT_NAME (1 << 5) /* Supported (DNS) */ -#define MBEDTLS_X509_EXT_ISSUER_ALT_NAME (1 << 6) -#define MBEDTLS_X509_EXT_SUBJECT_DIRECTORY_ATTRS (1 << 7) -#define MBEDTLS_X509_EXT_BASIC_CONSTRAINTS (1 << 8) /* Supported */ -#define MBEDTLS_X509_EXT_NAME_CONSTRAINTS (1 << 9) -#define MBEDTLS_X509_EXT_POLICY_CONSTRAINTS (1 << 10) -#define MBEDTLS_X509_EXT_EXTENDED_KEY_USAGE (1 << 11) -#define MBEDTLS_X509_EXT_CRL_DISTRIBUTION_POINTS (1 << 12) -#define MBEDTLS_X509_EXT_INIHIBIT_ANYPOLICY (1 << 13) -#define MBEDTLS_X509_EXT_FRESHEST_CRL (1 << 14) - -#define MBEDTLS_X509_EXT_NS_CERT_TYPE (1 << 16) /* Parsed (and then ?) */ - -/* - * Storage format identifiers - * Recognized formats: PEM and DER - */ -#define MBEDTLS_X509_FORMAT_DER 1 -#define MBEDTLS_X509_FORMAT_PEM 2 - -#define MBEDTLS_X509_MAX_DN_NAME_SIZE 256 /**< Maximum value size of a DN entry */ - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * \addtogroup x509_module - * \{ */ - -/** - * \name Structures for parsing X.509 certificates, CRLs and CSRs - * \{ - */ - -/** - * Type-length-value structure that allows for ASN1 using DER. - */ -typedef mbedtls_asn1_buf mbedtls_x509_buf; - -/** - * Container for ASN1 bit strings. - */ -typedef mbedtls_asn1_bitstring mbedtls_x509_bitstring; - -/** - * Container for ASN1 named information objects. - * It allows for Relative Distinguished Names (e.g. cn=localhost,ou=code,etc.). - */ -typedef mbedtls_asn1_named_data mbedtls_x509_name; - -/** - * Container for a sequence of ASN.1 items - */ -typedef mbedtls_asn1_sequence mbedtls_x509_sequence; - -/** Container for date and time (precision in seconds). */ -typedef struct mbedtls_x509_time -{ - int year, mon, day; /**< Date. */ - int hour, min, sec; /**< Time. */ -} -mbedtls_x509_time; - -/** \} name Structures for parsing X.509 certificates, CRLs and CSRs */ -/** \} addtogroup x509_module */ - -/** - * \brief Store the certificate DN in printable form into buf; - * no more than size characters will be written. - * - * \param buf Buffer to write to - * \param size Maximum size of buffer - * \param dn The X509 name to represent - * - * \return The length of the string written (not including the - * terminated nul byte), or a negative error code. - */ -int mbedtls_x509_dn_gets( char *buf, size_t size, const mbedtls_x509_name *dn ); - -/** - * \brief Store the certificate serial in printable form into buf; - * no more than size characters will be written. - * - * \param buf Buffer to write to - * \param size Maximum size of buffer - * \param serial The X509 serial to represent - * - * \return The length of the string written (not including the - * terminated nul byte), or a negative error code. - */ -int mbedtls_x509_serial_gets( char *buf, size_t size, const mbedtls_x509_buf *serial ); - -/** - * \brief Check a given mbedtls_x509_time against the system time - * and tell if it's in the past. - * - * \note Intended usage is "if( is_past( valid_to ) ) ERROR". - * Hence the return value of 1 if on internal errors. - * - * \param time mbedtls_x509_time to check - * - * \return 1 if the given time is in the past or an error occured, - * 0 otherwise. - */ -int mbedtls_x509_time_is_past( const mbedtls_x509_time *time ); - -/** - * \brief Check a given mbedtls_x509_time against the system time - * and tell if it's in the future. - * - * \note Intended usage is "if( is_future( valid_from ) ) ERROR". - * Hence the return value of 1 if on internal errors. - * - * \param time mbedtls_x509_time to check - * - * \return 1 if the given time is in the future or an error occured, - * 0 otherwise. - */ -int mbedtls_x509_time_is_future( const mbedtls_x509_time *time ); - -/** - * \brief Checkup routine - * - * \return 0 if successful, or 1 if the test failed - */ -int mbedtls_x509_self_test( int verbose ); - -/* - * Internal module functions. You probably do not want to use these unless you - * know you do. - */ -int mbedtls_x509_get_name( unsigned char **p, const unsigned char *end, - mbedtls_x509_name *cur ); -int mbedtls_x509_get_alg_null( unsigned char **p, const unsigned char *end, - mbedtls_x509_buf *alg ); -int mbedtls_x509_get_alg( unsigned char **p, const unsigned char *end, - mbedtls_x509_buf *alg, mbedtls_x509_buf *params ); -#if defined(MBEDTLS_X509_RSASSA_PSS_SUPPORT) -int mbedtls_x509_get_rsassa_pss_params( const mbedtls_x509_buf *params, - mbedtls_md_type_t *md_alg, mbedtls_md_type_t *mgf_md, - int *salt_len ); -#endif -int mbedtls_x509_get_sig( unsigned char **p, const unsigned char *end, mbedtls_x509_buf *sig ); -int mbedtls_x509_get_sig_alg( const mbedtls_x509_buf *sig_oid, const mbedtls_x509_buf *sig_params, - mbedtls_md_type_t *md_alg, mbedtls_pk_type_t *pk_alg, - void **sig_opts ); -int mbedtls_x509_get_time( unsigned char **p, const unsigned char *end, - mbedtls_x509_time *time ); -int mbedtls_x509_get_serial( unsigned char **p, const unsigned char *end, - mbedtls_x509_buf *serial ); -int mbedtls_x509_get_ext( unsigned char **p, const unsigned char *end, - mbedtls_x509_buf *ext, int tag ); -int mbedtls_x509_sig_alg_gets( char *buf, size_t size, const mbedtls_x509_buf *sig_oid, - mbedtls_pk_type_t pk_alg, mbedtls_md_type_t md_alg, - const void *sig_opts ); -int mbedtls_x509_key_size_helper( char *buf, size_t buf_size, const char *name ); -int mbedtls_x509_string_to_names( mbedtls_asn1_named_data **head, const char *name ); -int mbedtls_x509_set_extension( mbedtls_asn1_named_data **head, const char *oid, size_t oid_len, - int critical, const unsigned char *val, - size_t val_len ); -int mbedtls_x509_write_extensions( unsigned char **p, unsigned char *start, - mbedtls_asn1_named_data *first ); -int mbedtls_x509_write_names( unsigned char **p, unsigned char *start, - mbedtls_asn1_named_data *first ); -int mbedtls_x509_write_sig( unsigned char **p, unsigned char *start, - const char *oid, size_t oid_len, - unsigned char *sig, size_t size ); - -#define MBEDTLS_X509_SAFE_SNPRINTF \ - do { \ - if( ret < 0 || (size_t) ret >= n ) \ - return( MBEDTLS_ERR_X509_BUFFER_TOO_SMALL ); \ - \ - n -= (size_t) ret; \ - p += (size_t) ret; \ - } while( 0 ) - -#ifdef __cplusplus -} -#endif - -#endif /* x509.h */ diff --git a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/x509_crl.h b/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/x509_crl.h deleted file mode 100644 index c50c4efc..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/x509_crl.h +++ /dev/null @@ -1,172 +0,0 @@ -/** - * \file mbedtls_x509_crl.h - * - * \brief X.509 certificate revocation list parsing - * - * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * This file is part of mbed TLS (https://tls.mbed.org) - */ -#ifndef MBEDTLS_X509_CRL_H -#define MBEDTLS_X509_CRL_H - -#if !defined(MBEDTLS_CONFIG_FILE) -#include "config.h" -#else -#include MBEDTLS_CONFIG_FILE -#endif - -#include "x509.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * \addtogroup x509_module - * \{ */ - -/** - * \name Structures and functions for parsing CRLs - * \{ - */ - -/** - * Certificate revocation list entry. - * Contains the CA-specific serial numbers and revocation dates. - */ -typedef struct mbedtls_x509_crl_entry -{ - mbedtls_x509_buf raw; - - mbedtls_x509_buf serial; - - mbedtls_x509_time revocation_date; - - mbedtls_x509_buf entry_ext; - - struct mbedtls_x509_crl_entry *next; -} -mbedtls_x509_crl_entry; - -/** - * Certificate revocation list structure. - * Every CRL may have multiple entries. - */ -typedef struct mbedtls_x509_crl -{ - mbedtls_x509_buf raw; /**< The raw certificate data (DER). */ - mbedtls_x509_buf tbs; /**< The raw certificate body (DER). The part that is To Be Signed. */ - - int version; /**< CRL version (1=v1, 2=v2) */ - mbedtls_x509_buf sig_oid; /**< CRL signature type identifier */ - - mbedtls_x509_buf issuer_raw; /**< The raw issuer data (DER). */ - - mbedtls_x509_name issuer; /**< The parsed issuer data (named information object). */ - - mbedtls_x509_time this_update; - mbedtls_x509_time next_update; - - mbedtls_x509_crl_entry entry; /**< The CRL entries containing the certificate revocation times for this CA. */ - - mbedtls_x509_buf crl_ext; - - mbedtls_x509_buf sig_oid2; - mbedtls_x509_buf sig; - mbedtls_md_type_t sig_md; /**< Internal representation of the MD algorithm of the signature algorithm, e.g. MBEDTLS_MD_SHA256 */ - mbedtls_pk_type_t sig_pk; /**< Internal representation of the Public Key algorithm of the signature algorithm, e.g. MBEDTLS_PK_RSA */ - void *sig_opts; /**< Signature options to be passed to mbedtls_pk_verify_ext(), e.g. for RSASSA-PSS */ - - struct mbedtls_x509_crl *next; -} -mbedtls_x509_crl; - -/** - * \brief Parse a DER-encoded CRL and append it to the chained list - * - * \param chain points to the start of the chain - * \param buf buffer holding the CRL data in DER format - * (including the terminating null byte for PEM data) - * - * \return 0 if successful, or a specific X509 or PEM error code - */ -int mbedtls_x509_crl_parse_der( mbedtls_x509_crl *chain, - const unsigned char *buf, size_t buflen ); -/** - * \brief Parse one or more CRLs and append them to the chained list - * - * \note Mutliple CRLs are accepted only if using PEM format - * - * \param chain points to the start of the chain - * \param buf buffer holding the CRL data in PEM or DER format - * \param buflen size of the buffer - * (including the terminating null byte for PEM data) - * - * \return 0 if successful, or a specific X509 or PEM error code - */ -int mbedtls_x509_crl_parse( mbedtls_x509_crl *chain, const unsigned char *buf, size_t buflen ); - -#if defined(MBEDTLS_FS_IO) -/** - * \brief Load one or more CRLs and append them to the chained list - * - * \note Mutliple CRLs are accepted only if using PEM format - * - * \param chain points to the start of the chain - * \param path filename to read the CRLs from (in PEM or DER encoding) - * - * \return 0 if successful, or a specific X509 or PEM error code - */ -int mbedtls_x509_crl_parse_file( mbedtls_x509_crl *chain, const char *path ); -#endif /* MBEDTLS_FS_IO */ - -/** - * \brief Returns an informational string about the CRL. - * - * \param buf Buffer to write to - * \param size Maximum size of buffer - * \param prefix A line prefix - * \param crl The X509 CRL to represent - * - * \return The length of the string written (not including the - * terminated nul byte), or a negative error code. - */ -int mbedtls_x509_crl_info( char *buf, size_t size, const char *prefix, - const mbedtls_x509_crl *crl ); - -/** - * \brief Initialize a CRL (chain) - * - * \param crl CRL chain to initialize - */ -void mbedtls_x509_crl_init( mbedtls_x509_crl *crl ); - -/** - * \brief Unallocate all CRL data - * - * \param crl CRL chain to free - */ -void mbedtls_x509_crl_free( mbedtls_x509_crl *crl ); - -/* \} name */ -/* \} addtogroup x509_module */ - -#ifdef __cplusplus -} -#endif - -#endif /* mbedtls_x509_crl.h */ diff --git a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/x509_crt.h b/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/x509_crt.h deleted file mode 100644 index 72b02ffd..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/x509_crt.h +++ /dev/null @@ -1,645 +0,0 @@ -/** - * \file mbedtls_x509_crt.h - * - * \brief X.509 certificate parsing and writing - * - * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * This file is part of mbed TLS (https://tls.mbed.org) - */ -#ifndef MBEDTLS_X509_CRT_H -#define MBEDTLS_X509_CRT_H - -#if !defined(MBEDTLS_CONFIG_FILE) -#include "config.h" -#else -#include MBEDTLS_CONFIG_FILE -#endif - -#include "x509.h" -#include "x509_crl.h" - -/** - * \addtogroup x509_module - * \{ - */ - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * \name Structures and functions for parsing and writing X.509 certificates - * \{ - */ - -/** - * Container for an X.509 certificate. The certificate may be chained. - */ -typedef struct mbedtls_x509_crt -{ - mbedtls_x509_buf raw; /**< The raw certificate data (DER). */ - mbedtls_x509_buf tbs; /**< The raw certificate body (DER). The part that is To Be Signed. */ - - int version; /**< The X.509 version. (1=v1, 2=v2, 3=v3) */ - mbedtls_x509_buf serial; /**< Unique id for certificate issued by a specific CA. */ - mbedtls_x509_buf sig_oid; /**< Signature algorithm, e.g. sha1RSA */ - - mbedtls_x509_buf issuer_raw; /**< The raw issuer data (DER). Used for quick comparison. */ - mbedtls_x509_buf subject_raw; /**< The raw subject data (DER). Used for quick comparison. */ - - mbedtls_x509_name issuer; /**< The parsed issuer data (named information object). */ - mbedtls_x509_name subject; /**< The parsed subject data (named information object). */ - - mbedtls_x509_time valid_from; /**< Start time of certificate validity. */ - mbedtls_x509_time valid_to; /**< End time of certificate validity. */ - - mbedtls_pk_context pk; /**< Container for the public key context. */ - - mbedtls_x509_buf issuer_id; /**< Optional X.509 v2/v3 issuer unique identifier. */ - mbedtls_x509_buf subject_id; /**< Optional X.509 v2/v3 subject unique identifier. */ - mbedtls_x509_buf v3_ext; /**< Optional X.509 v3 extensions. */ - mbedtls_x509_sequence subject_alt_names; /**< Optional list of Subject Alternative Names (Only dNSName supported). */ - - int ext_types; /**< Bit string containing detected and parsed extensions */ - int ca_istrue; /**< Optional Basic Constraint extension value: 1 if this certificate belongs to a CA, 0 otherwise. */ - int max_pathlen; /**< Optional Basic Constraint extension value: The maximum path length to the root certificate. Path length is 1 higher than RFC 5280 'meaning', so 1+ */ - - unsigned int key_usage; /**< Optional key usage extension value: See the values in x509.h */ - - mbedtls_x509_sequence ext_key_usage; /**< Optional list of extended key usage OIDs. */ - - unsigned char ns_cert_type; /**< Optional Netscape certificate type extension value: See the values in x509.h */ - - mbedtls_x509_buf sig; /**< Signature: hash of the tbs part signed with the private key. */ - mbedtls_md_type_t sig_md; /**< Internal representation of the MD algorithm of the signature algorithm, e.g. MBEDTLS_MD_SHA256 */ - mbedtls_pk_type_t sig_pk; /**< Internal representation of the Public Key algorithm of the signature algorithm, e.g. MBEDTLS_PK_RSA */ - void *sig_opts; /**< Signature options to be passed to mbedtls_pk_verify_ext(), e.g. for RSASSA-PSS */ - - struct mbedtls_x509_crt *next; /**< Next certificate in the CA-chain. */ -} -mbedtls_x509_crt; - -/** - * Build flag from an algorithm/curve identifier (pk, md, ecp) - * Since 0 is always XXX_NONE, ignore it. - */ -#define MBEDTLS_X509_ID_FLAG( id ) ( 1 << ( id - 1 ) ) - -/** - * Security profile for certificate verification. - * - * All lists are bitfields, built by ORing flags from MBEDTLS_X509_ID_FLAG(). - */ -typedef struct -{ - uint32_t allowed_mds; /**< MDs for signatures */ - uint32_t allowed_pks; /**< PK algs for signatures */ - uint32_t allowed_curves; /**< Elliptic curves for ECDSA */ - uint32_t rsa_min_bitlen; /**< Minimum size for RSA keys */ -} -mbedtls_x509_crt_profile; - -#define MBEDTLS_X509_CRT_VERSION_1 0 -#define MBEDTLS_X509_CRT_VERSION_2 1 -#define MBEDTLS_X509_CRT_VERSION_3 2 - -#define MBEDTLS_X509_RFC5280_MAX_SERIAL_LEN 32 -#define MBEDTLS_X509_RFC5280_UTC_TIME_LEN 15 - -/** - * Container for writing a certificate (CRT) - */ -typedef struct mbedtls_x509write_cert -{ - int version; - mbedtls_mpi serial; - mbedtls_pk_context *subject_key; - mbedtls_pk_context *issuer_key; - mbedtls_asn1_named_data *subject; - mbedtls_asn1_named_data *issuer; - mbedtls_md_type_t md_alg; - char not_before[MBEDTLS_X509_RFC5280_UTC_TIME_LEN + 1]; - char not_after[MBEDTLS_X509_RFC5280_UTC_TIME_LEN + 1]; - mbedtls_asn1_named_data *extensions; -} -mbedtls_x509write_cert; - -#if defined(MBEDTLS_X509_CRT_PARSE_C) -/** - * Default security profile. Should provide a good balance between security - * and compatibility with current deployments. - */ -extern const mbedtls_x509_crt_profile mbedtls_x509_crt_profile_default; - -/** - * Expected next default profile. Recommended for new deployments. - * Currently targets a 128-bit security level, except for RSA-2048. - */ -extern const mbedtls_x509_crt_profile mbedtls_x509_crt_profile_next; - -/** - * NSA Suite B profile. - */ -extern const mbedtls_x509_crt_profile mbedtls_x509_crt_profile_suiteb; - -/** - * \brief Parse a single DER formatted certificate and add it - * to the chained list. - * - * \param chain points to the start of the chain - * \param buf buffer holding the certificate DER data - * \param buflen size of the buffer - * - * \return 0 if successful, or a specific X509 or PEM error code - */ -int mbedtls_x509_crt_parse_der( mbedtls_x509_crt *chain, const unsigned char *buf, - size_t buflen ); - -/** - * \brief Parse one or more certificates and add them - * to the chained list. Parses permissively. If some - * certificates can be parsed, the result is the number - * of failed certificates it encountered. If none complete - * correctly, the first error is returned. - * - * \param chain points to the start of the chain - * \param buf buffer holding the certificate data in PEM or DER format - * \param buflen size of the buffer - * (including the terminating null byte for PEM data) - * - * \return 0 if all certificates parsed successfully, a positive number - * if partly successful or a specific X509 or PEM error code - */ -int mbedtls_x509_crt_parse( mbedtls_x509_crt *chain, const unsigned char *buf, size_t buflen ); - -#if defined(MBEDTLS_FS_IO) -/** - * \brief Load one or more certificates and add them - * to the chained list. Parses permissively. If some - * certificates can be parsed, the result is the number - * of failed certificates it encountered. If none complete - * correctly, the first error is returned. - * - * \param chain points to the start of the chain - * \param path filename to read the certificates from - * - * \return 0 if all certificates parsed successfully, a positive number - * if partly successful or a specific X509 or PEM error code - */ -int mbedtls_x509_crt_parse_file( mbedtls_x509_crt *chain, const char *path ); - -/** - * \brief Load one or more certificate files from a path and add them - * to the chained list. Parses permissively. If some - * certificates can be parsed, the result is the number - * of failed certificates it encountered. If none complete - * correctly, the first error is returned. - * - * \param chain points to the start of the chain - * \param path directory / folder to read the certificate files from - * - * \return 0 if all certificates parsed successfully, a positive number - * if partly successful or a specific X509 or PEM error code - */ -int mbedtls_x509_crt_parse_path( mbedtls_x509_crt *chain, const char *path ); -#endif /* MBEDTLS_FS_IO */ - -/** - * \brief Returns an informational string about the - * certificate. - * - * \param buf Buffer to write to - * \param size Maximum size of buffer - * \param prefix A line prefix - * \param crt The X509 certificate to represent - * - * \return The length of the string written (not including the - * terminated nul byte), or a negative error code. - */ -int mbedtls_x509_crt_info( char *buf, size_t size, const char *prefix, - const mbedtls_x509_crt *crt ); - -/** - * \brief Returns an informational string about the - * verification status of a certificate. - * - * \param buf Buffer to write to - * \param size Maximum size of buffer - * \param prefix A line prefix - * \param flags Verification flags created by mbedtls_x509_crt_verify() - * - * \return The length of the string written (not including the - * terminated nul byte), or a negative error code. - */ -int mbedtls_x509_crt_verify_info( char *buf, size_t size, const char *prefix, - uint32_t flags ); - -/** - * \brief Verify the certificate signature - * - * The verify callback is a user-supplied callback that - * can clear / modify / add flags for a certificate. If set, - * the verification callback is called for each - * certificate in the chain (from the trust-ca down to the - * presented crt). The parameters for the callback are: - * (void *parameter, mbedtls_x509_crt *crt, int certificate_depth, - * int *flags). With the flags representing current flags for - * that specific certificate and the certificate depth from - * the bottom (Peer cert depth = 0). - * - * All flags left after returning from the callback - * are also returned to the application. The function should - * return 0 for anything but a fatal error. - * - * \note In case verification failed, the results can be displayed - * using \c mbedtls_x509_crt_verify_info() - * - * \note Same as \c mbedtls_x509_crt_verify_with_profile() with the - * default security profile. - * - * \param crt a certificate to be verified - * \param trust_ca the trusted CA chain - * \param ca_crl the CRL chain for trusted CA's - * \param cn expected Common Name (can be set to - * NULL if the CN must not be verified) - * \param flags result of the verification - * \param f_vrfy verification function - * \param p_vrfy verification parameter - * - * \return 0 if successful or MBEDTLS_ERR_X509_CERT_VERIFY_FAILED - * in which case *flags will have one or more - * MBEDTLS_X509_BADCERT_XXX or MBEDTLS_X509_BADCRL_XXX flags - * set, - * or another error in case of a fatal error encountered - * during the verification process. - */ -int mbedtls_x509_crt_verify( mbedtls_x509_crt *crt, - mbedtls_x509_crt *trust_ca, - mbedtls_x509_crl *ca_crl, - const char *cn, uint32_t *flags, - int (*f_vrfy)(void *, mbedtls_x509_crt *, int, uint32_t *), - void *p_vrfy ); - -/** - * \brief Verify the certificate signature according to profile - * - * \note Same as \c mbedtls_x509_crt_verify(), but with explicit - * security profile. - * - * \note The restrictions on keys (RSA minimum size, allowed curves - * for ECDSA) only applys to (intermediate) CAs, not to the - * end-entity certificate. - * - * \param crt a certificate to be verified - * \param trust_ca the trusted CA chain - * \param ca_crl the CRL chain for trusted CA's - * \param profile security profile for verification - * \param cn expected Common Name (can be set to - * NULL if the CN must not be verified) - * \param flags result of the verification - * \param f_vrfy verification function - * \param p_vrfy verification parameter - * - * \return 0 if successful or MBEDTLS_ERR_X509_CERT_VERIFY_FAILED - * in which case *flags will have one or more - * MBEDTLS_X509_BADCERT_XXX or MBEDTLS_X509_BADCRL_XXX flags - * set, - * or another error in case of a fatal error encountered - * during the verification process. - */ -int mbedtls_x509_crt_verify_with_profile( mbedtls_x509_crt *crt, - mbedtls_x509_crt *trust_ca, - mbedtls_x509_crl *ca_crl, - const mbedtls_x509_crt_profile *profile, - const char *cn, uint32_t *flags, - int (*f_vrfy)(void *, mbedtls_x509_crt *, int, uint32_t *), - void *p_vrfy ); - -#if defined(MBEDTLS_X509_CHECK_KEY_USAGE) -/** - * \brief Check usage of certificate against keyUsage extension. - * - * \param crt Leaf certificate used. - * \param usage Intended usage(s) (eg MBEDTLS_X509_KU_KEY_ENCIPHERMENT - * before using the certificate to perform an RSA key - * exchange). - * - * \note Except for decipherOnly and encipherOnly, a bit set in the - * usage argument means this bit MUST be set in the - * certificate. For decipherOnly and encipherOnly, it means - * that bit MAY be set. - * - * \return 0 is these uses of the certificate are allowed, - * MBEDTLS_ERR_X509_BAD_INPUT_DATA if the keyUsage extension - * is present but does not match the usage argument. - * - * \note You should only call this function on leaf certificates, on - * (intermediate) CAs the keyUsage extension is automatically - * checked by \c mbedtls_x509_crt_verify(). - */ -int mbedtls_x509_crt_check_key_usage( const mbedtls_x509_crt *crt, - unsigned int usage ); -#endif /* MBEDTLS_X509_CHECK_KEY_USAGE) */ - -#if defined(MBEDTLS_X509_CHECK_EXTENDED_KEY_USAGE) -/** - * \brief Check usage of certificate against extentedJeyUsage. - * - * \param crt Leaf certificate used. - * \param usage_oid Intended usage (eg MBEDTLS_OID_SERVER_AUTH or MBEDTLS_OID_CLIENT_AUTH). - * \param usage_len Length of usage_oid (eg given by MBEDTLS_OID_SIZE()). - * - * \return 0 if this use of the certificate is allowed, - * MBEDTLS_ERR_X509_BAD_INPUT_DATA if not. - * - * \note Usually only makes sense on leaf certificates. - */ -int mbedtls_x509_crt_check_extended_key_usage( const mbedtls_x509_crt *crt, - const char *usage_oid, - size_t usage_len ); -#endif /* MBEDTLS_X509_CHECK_EXTENDED_KEY_USAGE) */ - -#if defined(MBEDTLS_X509_CRL_PARSE_C) -/** - * \brief Verify the certificate revocation status - * - * \param crt a certificate to be verified - * \param crl the CRL to verify against - * - * \return 1 if the certificate is revoked, 0 otherwise - * - */ -int mbedtls_x509_crt_is_revoked( const mbedtls_x509_crt *crt, const mbedtls_x509_crl *crl ); -#endif /* MBEDTLS_X509_CRL_PARSE_C */ - -/** - * \brief Initialize a certificate (chain) - * - * \param crt Certificate chain to initialize - */ -void mbedtls_x509_crt_init( mbedtls_x509_crt *crt ); - -/** - * \brief Unallocate all certificate data - * - * \param crt Certificate chain to free - */ -void mbedtls_x509_crt_free( mbedtls_x509_crt *crt ); -#endif /* MBEDTLS_X509_CRT_PARSE_C */ - -/* \} name */ -/* \} addtogroup x509_module */ - -#if defined(MBEDTLS_X509_CRT_WRITE_C) -/** - * \brief Initialize a CRT writing context - * - * \param ctx CRT context to initialize - */ -void mbedtls_x509write_crt_init( mbedtls_x509write_cert *ctx ); - -/** - * \brief Set the verion for a Certificate - * Default: MBEDTLS_X509_CRT_VERSION_3 - * - * \param ctx CRT context to use - * \param version version to set (MBEDTLS_X509_CRT_VERSION_1, MBEDTLS_X509_CRT_VERSION_2 or - * MBEDTLS_X509_CRT_VERSION_3) - */ -void mbedtls_x509write_crt_set_version( mbedtls_x509write_cert *ctx, int version ); - -/** - * \brief Set the serial number for a Certificate. - * - * \param ctx CRT context to use - * \param serial serial number to set - * - * \return 0 if successful - */ -int mbedtls_x509write_crt_set_serial( mbedtls_x509write_cert *ctx, const mbedtls_mpi *serial ); - -/** - * \brief Set the validity period for a Certificate - * Timestamps should be in string format for UTC timezone - * i.e. "YYYYMMDDhhmmss" - * e.g. "20131231235959" for December 31st 2013 - * at 23:59:59 - * - * \param ctx CRT context to use - * \param not_before not_before timestamp - * \param not_after not_after timestamp - * - * \return 0 if timestamp was parsed successfully, or - * a specific error code - */ -int mbedtls_x509write_crt_set_validity( mbedtls_x509write_cert *ctx, const char *not_before, - const char *not_after ); - -/** - * \brief Set the issuer name for a Certificate - * Issuer names should contain a comma-separated list - * of OID types and values: - * e.g. "C=UK,O=ARM,CN=mbed TLS CA" - * - * \param ctx CRT context to use - * \param issuer_name issuer name to set - * - * \return 0 if issuer name was parsed successfully, or - * a specific error code - */ -int mbedtls_x509write_crt_set_issuer_name( mbedtls_x509write_cert *ctx, - const char *issuer_name ); - -/** - * \brief Set the subject name for a Certificate - * Subject names should contain a comma-separated list - * of OID types and values: - * e.g. "C=UK,O=ARM,CN=mbed TLS Server 1" - * - * \param ctx CRT context to use - * \param subject_name subject name to set - * - * \return 0 if subject name was parsed successfully, or - * a specific error code - */ -int mbedtls_x509write_crt_set_subject_name( mbedtls_x509write_cert *ctx, - const char *subject_name ); - -/** - * \brief Set the subject public key for the certificate - * - * \param ctx CRT context to use - * \param key public key to include - */ -void mbedtls_x509write_crt_set_subject_key( mbedtls_x509write_cert *ctx, mbedtls_pk_context *key ); - -/** - * \brief Set the issuer key used for signing the certificate - * - * \param ctx CRT context to use - * \param key private key to sign with - */ -void mbedtls_x509write_crt_set_issuer_key( mbedtls_x509write_cert *ctx, mbedtls_pk_context *key ); - -/** - * \brief Set the MD algorithm to use for the signature - * (e.g. MBEDTLS_MD_SHA1) - * - * \param ctx CRT context to use - * \param md_alg MD algorithm to use - */ -void mbedtls_x509write_crt_set_md_alg( mbedtls_x509write_cert *ctx, mbedtls_md_type_t md_alg ); - -/** - * \brief Generic function to add to or replace an extension in the - * CRT - * - * \param ctx CRT context to use - * \param oid OID of the extension - * \param oid_len length of the OID - * \param critical if the extension is critical (per the RFC's definition) - * \param val value of the extension OCTET STRING - * \param val_len length of the value data - * - * \return 0 if successful, or a MBEDTLS_ERR_X509_ALLOC_FAILED - */ -int mbedtls_x509write_crt_set_extension( mbedtls_x509write_cert *ctx, - const char *oid, size_t oid_len, - int critical, - const unsigned char *val, size_t val_len ); - -/** - * \brief Set the basicConstraints extension for a CRT - * - * \param ctx CRT context to use - * \param is_ca is this a CA certificate - * \param max_pathlen maximum length of certificate chains below this - * certificate (only for CA certificates, -1 is - * inlimited) - * - * \return 0 if successful, or a MBEDTLS_ERR_X509_ALLOC_FAILED - */ -int mbedtls_x509write_crt_set_basic_constraints( mbedtls_x509write_cert *ctx, - int is_ca, int max_pathlen ); - -#if defined(MBEDTLS_SHA1_C) -/** - * \brief Set the subjectKeyIdentifier extension for a CRT - * Requires that mbedtls_x509write_crt_set_subject_key() has been - * called before - * - * \param ctx CRT context to use - * - * \return 0 if successful, or a MBEDTLS_ERR_X509_ALLOC_FAILED - */ -int mbedtls_x509write_crt_set_subject_key_identifier( mbedtls_x509write_cert *ctx ); - -/** - * \brief Set the authorityKeyIdentifier extension for a CRT - * Requires that mbedtls_x509write_crt_set_issuer_key() has been - * called before - * - * \param ctx CRT context to use - * - * \return 0 if successful, or a MBEDTLS_ERR_X509_ALLOC_FAILED - */ -int mbedtls_x509write_crt_set_authority_key_identifier( mbedtls_x509write_cert *ctx ); -#endif /* MBEDTLS_SHA1_C */ - -/** - * \brief Set the Key Usage Extension flags - * (e.g. MBEDTLS_X509_KU_DIGITAL_SIGNATURE | MBEDTLS_X509_KU_KEY_CERT_SIGN) - * - * \param ctx CRT context to use - * \param key_usage key usage flags to set - * - * \return 0 if successful, or MBEDTLS_ERR_X509_ALLOC_FAILED - */ -int mbedtls_x509write_crt_set_key_usage( mbedtls_x509write_cert *ctx, - unsigned int key_usage ); - -/** - * \brief Set the Netscape Cert Type flags - * (e.g. MBEDTLS_X509_NS_CERT_TYPE_SSL_CLIENT | MBEDTLS_X509_NS_CERT_TYPE_EMAIL) - * - * \param ctx CRT context to use - * \param ns_cert_type Netscape Cert Type flags to set - * - * \return 0 if successful, or MBEDTLS_ERR_X509_ALLOC_FAILED - */ -int mbedtls_x509write_crt_set_ns_cert_type( mbedtls_x509write_cert *ctx, - unsigned char ns_cert_type ); - -/** - * \brief Free the contents of a CRT write context - * - * \param ctx CRT context to free - */ -void mbedtls_x509write_crt_free( mbedtls_x509write_cert *ctx ); - -/** - * \brief Write a built up certificate to a X509 DER structure - * Note: data is written at the end of the buffer! Use the - * return value to determine where you should start - * using the buffer - * - * \param ctx certificate to write away - * \param buf buffer to write to - * \param size size of the buffer - * \param f_rng RNG function (for signature, see note) - * \param p_rng RNG parameter - * - * \return length of data written if successful, or a specific - * error code - * - * \note f_rng may be NULL if RSA is used for signature and the - * signature is made offline (otherwise f_rng is desirable - * for countermeasures against timing attacks). - * ECDSA signatures always require a non-NULL f_rng. - */ -int mbedtls_x509write_crt_der( mbedtls_x509write_cert *ctx, unsigned char *buf, size_t size, - int (*f_rng)(void *, unsigned char *, size_t), - void *p_rng ); - -#if defined(MBEDTLS_PEM_WRITE_C) -/** - * \brief Write a built up certificate to a X509 PEM string - * - * \param ctx certificate to write away - * \param buf buffer to write to - * \param size size of the buffer - * \param f_rng RNG function (for signature, see note) - * \param p_rng RNG parameter - * - * \return 0 if successful, or a specific error code - * - * \note f_rng may be NULL if RSA is used for signature and the - * signature is made offline (otherwise f_rng is desirable - * for countermeasures against timing attacks). - * ECDSA signatures always require a non-NULL f_rng. - */ -int mbedtls_x509write_crt_pem( mbedtls_x509write_cert *ctx, unsigned char *buf, size_t size, - int (*f_rng)(void *, unsigned char *, size_t), - void *p_rng ); -#endif /* MBEDTLS_PEM_WRITE_C */ -#endif /* MBEDTLS_X509_CRT_WRITE_C */ - -#ifdef __cplusplus -} -#endif - -#endif /* mbedtls_x509_crt.h */ diff --git a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/x509_csr.h b/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/x509_csr.h deleted file mode 100644 index 98c75bcf..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/x509_csr.h +++ /dev/null @@ -1,292 +0,0 @@ -/** - * \file mbedtls_x509_csr.h - * - * \brief X.509 certificate signing request parsing and writing - * - * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * This file is part of mbed TLS (https://tls.mbed.org) - */ -#ifndef MBEDTLS_X509_CSR_H -#define MBEDTLS_X509_CSR_H - -#if !defined(MBEDTLS_CONFIG_FILE) -#include "config.h" -#else -#include MBEDTLS_CONFIG_FILE -#endif - -#include "x509.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * \addtogroup x509_module - * \{ */ - -/** - * \name Structures and functions for X.509 Certificate Signing Requests (CSR) - * \{ - */ - -/** - * Certificate Signing Request (CSR) structure. - */ -typedef struct mbedtls_x509_csr -{ - mbedtls_x509_buf raw; /**< The raw CSR data (DER). */ - mbedtls_x509_buf cri; /**< The raw CertificateRequestInfo body (DER). */ - - int version; /**< CSR version (1=v1). */ - - mbedtls_x509_buf subject_raw; /**< The raw subject data (DER). */ - mbedtls_x509_name subject; /**< The parsed subject data (named information object). */ - - mbedtls_pk_context pk; /**< Container for the public key context. */ - - mbedtls_x509_buf sig_oid; - mbedtls_x509_buf sig; - mbedtls_md_type_t sig_md; /**< Internal representation of the MD algorithm of the signature algorithm, e.g. MBEDTLS_MD_SHA256 */ - mbedtls_pk_type_t sig_pk; /**< Internal representation of the Public Key algorithm of the signature algorithm, e.g. MBEDTLS_PK_RSA */ - void *sig_opts; /**< Signature options to be passed to mbedtls_pk_verify_ext(), e.g. for RSASSA-PSS */ -} -mbedtls_x509_csr; - -/** - * Container for writing a CSR - */ -typedef struct mbedtls_x509write_csr -{ - mbedtls_pk_context *key; - mbedtls_asn1_named_data *subject; - mbedtls_md_type_t md_alg; - mbedtls_asn1_named_data *extensions; -} -mbedtls_x509write_csr; - -#if defined(MBEDTLS_X509_CSR_PARSE_C) -/** - * \brief Load a Certificate Signing Request (CSR) in DER format - * - * \param csr CSR context to fill - * \param buf buffer holding the CRL data - * \param buflen size of the buffer - * - * \return 0 if successful, or a specific X509 error code - */ -int mbedtls_x509_csr_parse_der( mbedtls_x509_csr *csr, - const unsigned char *buf, size_t buflen ); - -/** - * \brief Load a Certificate Signing Request (CSR), DER or PEM format - * - * \param csr CSR context to fill - * \param buf buffer holding the CRL data - * \param buflen size of the buffer - * (including the terminating null byte for PEM data) - * - * \return 0 if successful, or a specific X509 or PEM error code - */ -int mbedtls_x509_csr_parse( mbedtls_x509_csr *csr, const unsigned char *buf, size_t buflen ); - -#if defined(MBEDTLS_FS_IO) -/** - * \brief Load a Certificate Signing Request (CSR) - * - * \param csr CSR context to fill - * \param path filename to read the CSR from - * - * \return 0 if successful, or a specific X509 or PEM error code - */ -int mbedtls_x509_csr_parse_file( mbedtls_x509_csr *csr, const char *path ); -#endif /* MBEDTLS_FS_IO */ - -/** - * \brief Returns an informational string about the - * CSR. - * - * \param buf Buffer to write to - * \param size Maximum size of buffer - * \param prefix A line prefix - * \param csr The X509 CSR to represent - * - * \return The length of the string written (not including the - * terminated nul byte), or a negative error code. - */ -int mbedtls_x509_csr_info( char *buf, size_t size, const char *prefix, - const mbedtls_x509_csr *csr ); - -/** - * \brief Initialize a CSR - * - * \param csr CSR to initialize - */ -void mbedtls_x509_csr_init( mbedtls_x509_csr *csr ); - -/** - * \brief Unallocate all CSR data - * - * \param csr CSR to free - */ -void mbedtls_x509_csr_free( mbedtls_x509_csr *csr ); -#endif /* MBEDTLS_X509_CSR_PARSE_C */ - -/* \} name */ -/* \} addtogroup x509_module */ - -#if defined(MBEDTLS_X509_CSR_WRITE_C) -/** - * \brief Initialize a CSR context - * - * \param ctx CSR context to initialize - */ -void mbedtls_x509write_csr_init( mbedtls_x509write_csr *ctx ); - -/** - * \brief Set the subject name for a CSR - * Subject names should contain a comma-separated list - * of OID types and values: - * e.g. "C=UK,O=ARM,CN=mbed TLS Server 1" - * - * \param ctx CSR context to use - * \param subject_name subject name to set - * - * \return 0 if subject name was parsed successfully, or - * a specific error code - */ -int mbedtls_x509write_csr_set_subject_name( mbedtls_x509write_csr *ctx, - const char *subject_name ); - -/** - * \brief Set the key for a CSR (public key will be included, - * private key used to sign the CSR when writing it) - * - * \param ctx CSR context to use - * \param key Asymetric key to include - */ -void mbedtls_x509write_csr_set_key( mbedtls_x509write_csr *ctx, mbedtls_pk_context *key ); - -/** - * \brief Set the MD algorithm to use for the signature - * (e.g. MBEDTLS_MD_SHA1) - * - * \param ctx CSR context to use - * \param md_alg MD algorithm to use - */ -void mbedtls_x509write_csr_set_md_alg( mbedtls_x509write_csr *ctx, mbedtls_md_type_t md_alg ); - -/** - * \brief Set the Key Usage Extension flags - * (e.g. MBEDTLS_X509_KU_DIGITAL_SIGNATURE | MBEDTLS_X509_KU_KEY_CERT_SIGN) - * - * \param ctx CSR context to use - * \param key_usage key usage flags to set - * - * \return 0 if successful, or MBEDTLS_ERR_X509_ALLOC_FAILED - */ -int mbedtls_x509write_csr_set_key_usage( mbedtls_x509write_csr *ctx, unsigned char key_usage ); - -/** - * \brief Set the Netscape Cert Type flags - * (e.g. MBEDTLS_X509_NS_CERT_TYPE_SSL_CLIENT | MBEDTLS_X509_NS_CERT_TYPE_EMAIL) - * - * \param ctx CSR context to use - * \param ns_cert_type Netscape Cert Type flags to set - * - * \return 0 if successful, or MBEDTLS_ERR_X509_ALLOC_FAILED - */ -int mbedtls_x509write_csr_set_ns_cert_type( mbedtls_x509write_csr *ctx, - unsigned char ns_cert_type ); - -/** - * \brief Generic function to add to or replace an extension in the - * CSR - * - * \param ctx CSR context to use - * \param oid OID of the extension - * \param oid_len length of the OID - * \param val value of the extension OCTET STRING - * \param val_len length of the value data - * - * \return 0 if successful, or a MBEDTLS_ERR_X509_ALLOC_FAILED - */ -int mbedtls_x509write_csr_set_extension( mbedtls_x509write_csr *ctx, - const char *oid, size_t oid_len, - const unsigned char *val, size_t val_len ); - -/** - * \brief Free the contents of a CSR context - * - * \param ctx CSR context to free - */ -void mbedtls_x509write_csr_free( mbedtls_x509write_csr *ctx ); - -/** - * \brief Write a CSR (Certificate Signing Request) to a - * DER structure - * Note: data is written at the end of the buffer! Use the - * return value to determine where you should start - * using the buffer - * - * \param ctx CSR to write away - * \param buf buffer to write to - * \param size size of the buffer - * \param f_rng RNG function (for signature, see note) - * \param p_rng RNG parameter - * - * \return length of data written if successful, or a specific - * error code - * - * \note f_rng may be NULL if RSA is used for signature and the - * signature is made offline (otherwise f_rng is desirable - * for countermeasures against timing attacks). - * ECDSA signatures always require a non-NULL f_rng. - */ -int mbedtls_x509write_csr_der( mbedtls_x509write_csr *ctx, unsigned char *buf, size_t size, - int (*f_rng)(void *, unsigned char *, size_t), - void *p_rng ); - -#if defined(MBEDTLS_PEM_WRITE_C) -/** - * \brief Write a CSR (Certificate Signing Request) to a - * PEM string - * - * \param ctx CSR to write away - * \param buf buffer to write to - * \param size size of the buffer - * \param f_rng RNG function (for signature, see note) - * \param p_rng RNG parameter - * - * \return 0 if successful, or a specific error code - * - * \note f_rng may be NULL if RSA is used for signature and the - * signature is made offline (otherwise f_rng is desirable - * for couermeasures against timing attacks). - * ECDSA signatures always require a non-NULL f_rng. - */ -int mbedtls_x509write_csr_pem( mbedtls_x509write_csr *ctx, unsigned char *buf, size_t size, - int (*f_rng)(void *, unsigned char *, size_t), - void *p_rng ); -#endif /* MBEDTLS_PEM_WRITE_C */ -#endif /* MBEDTLS_X509_CSR_WRITE_C */ - -#ifdef __cplusplus -} -#endif - -#endif /* mbedtls_x509_csr.h */ diff --git a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/xtea.h b/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/xtea.h deleted file mode 100644 index b073f84e..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/mbedtls/xtea.h +++ /dev/null @@ -1,139 +0,0 @@ -/** - * \file xtea.h - * - * \brief XTEA block cipher (32-bit) - * - * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * This file is part of mbed TLS (https://tls.mbed.org) - */ -#ifndef MBEDTLS_XTEA_H -#define MBEDTLS_XTEA_H - -#if !defined(MBEDTLS_CONFIG_FILE) -#include "config.h" -#else -#include MBEDTLS_CONFIG_FILE -#endif - -#include -#include - -#define MBEDTLS_XTEA_ENCRYPT 1 -#define MBEDTLS_XTEA_DECRYPT 0 - -#define MBEDTLS_ERR_XTEA_INVALID_INPUT_LENGTH -0x0028 /**< The data input has an invalid length. */ - -#if !defined(MBEDTLS_XTEA_ALT) -// Regular implementation -// - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * \brief XTEA context structure - */ -typedef struct -{ - uint32_t k[4]; /*!< key */ -} -mbedtls_xtea_context; - -/** - * \brief Initialize XTEA context - * - * \param ctx XTEA context to be initialized - */ -void mbedtls_xtea_init( mbedtls_xtea_context *ctx ); - -/** - * \brief Clear XTEA context - * - * \param ctx XTEA context to be cleared - */ -void mbedtls_xtea_free( mbedtls_xtea_context *ctx ); - -/** - * \brief XTEA key schedule - * - * \param ctx XTEA context to be initialized - * \param key the secret key - */ -void mbedtls_xtea_setup( mbedtls_xtea_context *ctx, const unsigned char key[16] ); - -/** - * \brief XTEA cipher function - * - * \param ctx XTEA context - * \param mode MBEDTLS_XTEA_ENCRYPT or MBEDTLS_XTEA_DECRYPT - * \param input 8-byte input block - * \param output 8-byte output block - * - * \return 0 if successful - */ -int mbedtls_xtea_crypt_ecb( mbedtls_xtea_context *ctx, - int mode, - const unsigned char input[8], - unsigned char output[8] ); - -#if defined(MBEDTLS_CIPHER_MODE_CBC) -/** - * \brief XTEA CBC cipher function - * - * \param ctx XTEA context - * \param mode MBEDTLS_XTEA_ENCRYPT or MBEDTLS_XTEA_DECRYPT - * \param length the length of input, multiple of 8 - * \param iv initialization vector for CBC mode - * \param input input block - * \param output output block - * - * \return 0 if successful, - * MBEDTLS_ERR_XTEA_INVALID_INPUT_LENGTH if the length % 8 != 0 - */ -int mbedtls_xtea_crypt_cbc( mbedtls_xtea_context *ctx, - int mode, - size_t length, - unsigned char iv[8], - const unsigned char *input, - unsigned char *output); -#endif /* MBEDTLS_CIPHER_MODE_CBC */ - -#ifdef __cplusplus -} -#endif - -#else /* MBEDTLS_XTEA_ALT */ -#include "xtea_alt.h" -#endif /* MBEDTLS_XTEA_ALT */ - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * \brief Checkup routine - * - * \return 0 if successful, or 1 if the test failed - */ -int mbedtls_xtea_self_test( int verbose ); - -#ifdef __cplusplus -} -#endif - -#endif /* xtea.h */ diff --git a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/md.h b/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/md.h deleted file mode 100644 index 77c2c6f6..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/md.h +++ /dev/null @@ -1,353 +0,0 @@ -/** - * \file mbedtls_md.h - * - * \brief Generic message digest wrapper - * - * \author Adriaan de Jong - * - * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * This file is part of mbed TLS (https://tls.mbed.org) - */ -#ifndef MBEDTLS_MD_H -#define MBEDTLS_MD_H - -#include - -#define MBEDTLS_ERR_MD_FEATURE_UNAVAILABLE -0x5080 /**< The selected feature is not available. */ -#define MBEDTLS_ERR_MD_BAD_INPUT_DATA -0x5100 /**< Bad input parameters to function. */ -#define MBEDTLS_ERR_MD_ALLOC_FAILED -0x5180 /**< Failed to allocate memory. */ -#define MBEDTLS_ERR_MD_FILE_IO_ERROR -0x5200 /**< Opening or reading of file failed. */ - -#ifdef __cplusplus -extern "C" { -#endif - -typedef enum { - MBEDTLS_MD_NONE=0, - MBEDTLS_MD_MD2, - MBEDTLS_MD_MD4, - MBEDTLS_MD_MD5, - MBEDTLS_MD_SHA1, - MBEDTLS_MD_SHA224, - MBEDTLS_MD_SHA256, - MBEDTLS_MD_SHA384, - MBEDTLS_MD_SHA512, - MBEDTLS_MD_RIPEMD160, -} mbedtls_md_type_t; - -#if defined(MBEDTLS_SHA512_C) -#define MBEDTLS_MD_MAX_SIZE 64 /* longest known is SHA512 */ -#else -#define MBEDTLS_MD_MAX_SIZE 32 /* longest known is SHA256 or less */ -#endif - -/** - * Opaque struct defined in md_internal.h - */ -typedef struct mbedtls_md_info_t mbedtls_md_info_t; - -/** - * Generic message digest context. - */ -typedef struct { - /** Information about the associated message digest */ - const mbedtls_md_info_t *md_info; - - /** Digest-specific context */ - void *md_ctx; - - /** HMAC part of the context */ - void *hmac_ctx; -} mbedtls_md_context_t; - -/** - * \brief Returns the list of digests supported by the generic digest module. - * - * \return a statically allocated array of digests, the last entry - * is 0. - */ -const int *mbedtls_md_list( void ); - -/** - * \brief Returns the message digest information associated with the - * given digest name. - * - * \param md_name Name of the digest to search for. - * - * \return The message digest information associated with md_name or - * NULL if not found. - */ -const mbedtls_md_info_t *mbedtls_md_info_from_string( const char *md_name ); - -/** - * \brief Returns the message digest information associated with the - * given digest type. - * - * \param md_type type of digest to search for. - * - * \return The message digest information associated with md_type or - * NULL if not found. - */ -const mbedtls_md_info_t *mbedtls_md_info_from_type( mbedtls_md_type_t md_type ); - -/** - * \brief Initialize a md_context (as NONE) - * This should always be called first. - * Prepares the context for mbedtls_md_setup() or mbedtls_md_free(). - */ -void mbedtls_md_init( mbedtls_md_context_t *ctx ); - -/** - * \brief Free and clear the internal structures of ctx. - * Can be called at any time after mbedtls_md_init(). - * Mandatory once mbedtls_md_setup() has been called. - */ -void mbedtls_md_free( mbedtls_md_context_t *ctx ); - -#if ! defined(MBEDTLS_DEPRECATED_REMOVED) -#if defined(MBEDTLS_DEPRECATED_WARNING) -#define MBEDTLS_DEPRECATED __attribute__((deprecated)) -#else -#define MBEDTLS_DEPRECATED -#endif -/** - * \brief Select MD to use and allocate internal structures. - * Should be called after mbedtls_md_init() or mbedtls_md_free(). - * Makes it necessary to call mbedtls_md_free() later. - * - * \deprecated Superseded by mbedtls_md_setup() in 2.0.0 - * - * \param ctx Context to set up. - * \param md_info Message digest to use. - * - * \returns \c 0 on success, - * \c MBEDTLS_ERR_MD_BAD_INPUT_DATA on parameter failure, - * \c MBEDTLS_ERR_MD_ALLOC_FAILED memory allocation failure. - */ -int mbedtls_md_init_ctx( mbedtls_md_context_t *ctx, const mbedtls_md_info_t *md_info ) MBEDTLS_DEPRECATED; -#undef MBEDTLS_DEPRECATED -#endif /* MBEDTLS_DEPRECATED_REMOVED */ - -/** - * \brief Select MD to use and allocate internal structures. - * Should be called after mbedtls_md_init() or mbedtls_md_free(). - * Makes it necessary to call mbedtls_md_free() later. - * - * \param ctx Context to set up. - * \param md_info Message digest to use. - * \param hmac 0 to save some memory if HMAC will not be used, - * non-zero is HMAC is going to be used with this context. - * - * \returns \c 0 on success, - * \c MBEDTLS_ERR_MD_BAD_INPUT_DATA on parameter failure, - * \c MBEDTLS_ERR_MD_ALLOC_FAILED memory allocation failure. - */ -int mbedtls_md_setup( mbedtls_md_context_t *ctx, const mbedtls_md_info_t *md_info, int hmac ); - -/** - * \brief Clone the state of an MD context - * - * \note The two contexts must have been setup to the same type - * (cloning from SHA-256 to SHA-512 make no sense). - * - * \warning Only clones the MD state, not the HMAC state! (for now) - * - * \param dst The destination context - * \param src The context to be cloned - * - * \return \c 0 on success, - * \c MBEDTLS_ERR_MD_BAD_INPUT_DATA on parameter failure. - */ -int mbedtls_md_clone( mbedtls_md_context_t *dst, - const mbedtls_md_context_t *src ); - -/** - * \brief Returns the size of the message digest output. - * - * \param md_info message digest info - * - * \return size of the message digest output in bytes. - */ -unsigned char mbedtls_md_get_size( const mbedtls_md_info_t *md_info ); - -/** - * \brief Returns the type of the message digest output. - * - * \param md_info message digest info - * - * \return type of the message digest output. - */ -mbedtls_md_type_t mbedtls_md_get_type( const mbedtls_md_info_t *md_info ); - -/** - * \brief Returns the name of the message digest output. - * - * \param md_info message digest info - * - * \return name of the message digest output. - */ -const char *mbedtls_md_get_name( const mbedtls_md_info_t *md_info ); - -/** - * \brief Prepare the context to digest a new message. - * Generally called after mbedtls_md_setup() or mbedtls_md_finish(). - * Followed by mbedtls_md_update(). - * - * \param ctx generic message digest context. - * - * \returns 0 on success, MBEDTLS_ERR_MD_BAD_INPUT_DATA if parameter - * verification fails. - */ -int mbedtls_md_starts( mbedtls_md_context_t *ctx ); - -/** - * \brief Generic message digest process buffer - * Called between mbedtls_md_starts() and mbedtls_md_finish(). - * May be called repeatedly. - * - * \param ctx Generic message digest context - * \param input buffer holding the datal - * \param ilen length of the input data - * - * \returns 0 on success, MBEDTLS_ERR_MD_BAD_INPUT_DATA if parameter - * verification fails. - */ -int mbedtls_md_update( mbedtls_md_context_t *ctx, const unsigned char *input, size_t ilen ); - -/** - * \brief Generic message digest final digest - * Called after mbedtls_md_update(). - * Usually followed by mbedtls_md_free() or mbedtls_md_starts(). - * - * \param ctx Generic message digest context - * \param output Generic message digest checksum result - * - * \returns 0 on success, MBEDTLS_ERR_MD_BAD_INPUT_DATA if parameter - * verification fails. - */ -int mbedtls_md_finish( mbedtls_md_context_t *ctx, unsigned char *output ); - -/** - * \brief Output = message_digest( input buffer ) - * - * \param md_info message digest info - * \param input buffer holding the data - * \param ilen length of the input data - * \param output Generic message digest checksum result - * - * \returns 0 on success, MBEDTLS_ERR_MD_BAD_INPUT_DATA if parameter - * verification fails. - */ -int mbedtls_md( const mbedtls_md_info_t *md_info, const unsigned char *input, size_t ilen, - unsigned char *output ); - -#if defined(MBEDTLS_FS_IO) -/** - * \brief Output = message_digest( file contents ) - * - * \param md_info message digest info - * \param path input file name - * \param output generic message digest checksum result - * - * \return 0 if successful, - * MBEDTLS_ERR_MD_FILE_IO_ERROR if file input failed, - * MBEDTLS_ERR_MD_BAD_INPUT_DATA if md_info was NULL. - */ -int mbedtls_md_file( const mbedtls_md_info_t *md_info, const char *path, - unsigned char *output ); -#endif /* MBEDTLS_FS_IO */ - -/** - * \brief Set HMAC key and prepare to authenticate a new message. - * Usually called after mbedtls_md_setup() or mbedtls_md_hmac_finish(). - * - * \param ctx HMAC context - * \param key HMAC secret key - * \param keylen length of the HMAC key in bytes - * - * \returns 0 on success, MBEDTLS_ERR_MD_BAD_INPUT_DATA if parameter - * verification fails. - */ -int mbedtls_md_hmac_starts( mbedtls_md_context_t *ctx, const unsigned char *key, - size_t keylen ); - -/** - * \brief Generic HMAC process buffer. - * Called between mbedtls_md_hmac_starts() or mbedtls_md_hmac_reset() - * and mbedtls_md_hmac_finish(). - * May be called repeatedly. - * - * \param ctx HMAC context - * \param input buffer holding the data - * \param ilen length of the input data - * - * \returns 0 on success, MBEDTLS_ERR_MD_BAD_INPUT_DATA if parameter - * verification fails. - */ -int mbedtls_md_hmac_update( mbedtls_md_context_t *ctx, const unsigned char *input, - size_t ilen ); - -/** - * \brief Output HMAC. - * Called after mbedtls_md_hmac_update(). - * Usually followed my mbedtls_md_hmac_reset(), mbedtls_md_hmac_starts(), - * or mbedtls_md_free(). - * - * \param ctx HMAC context - * \param output Generic HMAC checksum result - * - * \returns 0 on success, MBEDTLS_ERR_MD_BAD_INPUT_DATA if parameter - * verification fails. - */ -int mbedtls_md_hmac_finish( mbedtls_md_context_t *ctx, unsigned char *output); - -/** - * \brief Prepare to authenticate a new message with the same key. - * Called after mbedtls_md_hmac_finish() and before mbedtls_md_hmac_update(). - * - * \param ctx HMAC context to be reset - * - * \returns 0 on success, MBEDTLS_ERR_MD_BAD_INPUT_DATA if parameter - * verification fails. - */ -int mbedtls_md_hmac_reset( mbedtls_md_context_t *ctx ); - -/** - * \brief Output = Generic_HMAC( hmac key, input buffer ) - * - * \param md_info message digest info - * \param key HMAC secret key - * \param keylen length of the HMAC key in bytes - * \param input buffer holding the data - * \param ilen length of the input data - * \param output Generic HMAC-result - * - * \returns 0 on success, MBEDTLS_ERR_MD_BAD_INPUT_DATA if parameter - * verification fails. - */ -int mbedtls_md_hmac( const mbedtls_md_info_t *md_info, const unsigned char *key, size_t keylen, - const unsigned char *input, size_t ilen, - unsigned char *output ); - -/* Internal use */ -int mbedtls_md_process( mbedtls_md_context_t *ctx, const unsigned char *data ); - -#ifdef __cplusplus -} -#endif - -#endif /* MBEDTLS_MD_H */ diff --git a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/md2.h b/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/md2.h deleted file mode 100644 index 51d79486..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/md2.h +++ /dev/null @@ -1,136 +0,0 @@ -/** - * \file mbedtls_md2.h - * - * \brief MD2 message digest algorithm (hash function) - * - * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * This file is part of mbed TLS (https://tls.mbed.org) - */ -#ifndef MBEDTLS_MD2_H -#define MBEDTLS_MD2_H - -#if !defined(MBEDTLS_CONFIG_FILE) -#include "config.h" -#else -#include MBEDTLS_CONFIG_FILE -#endif - -#include - -#if !defined(MBEDTLS_MD2_ALT) -// Regular implementation -// - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * \brief MD2 context structure - */ -typedef struct -{ - unsigned char cksum[16]; /*!< checksum of the data block */ - unsigned char state[48]; /*!< intermediate digest state */ - unsigned char buffer[16]; /*!< data block being processed */ - size_t left; /*!< amount of data in buffer */ -} -mbedtls_md2_context; - -/** - * \brief Initialize MD2 context - * - * \param ctx MD2 context to be initialized - */ -void mbedtls_md2_init( mbedtls_md2_context *ctx ); - -/** - * \brief Clear MD2 context - * - * \param ctx MD2 context to be cleared - */ -void mbedtls_md2_free( mbedtls_md2_context *ctx ); - -/** - * \brief Clone (the state of) an MD2 context - * - * \param dst The destination context - * \param src The context to be cloned - */ -void mbedtls_md2_clone( mbedtls_md2_context *dst, - const mbedtls_md2_context *src ); - -/** - * \brief MD2 context setup - * - * \param ctx context to be initialized - */ -void mbedtls_md2_starts( mbedtls_md2_context *ctx ); - -/** - * \brief MD2 process buffer - * - * \param ctx MD2 context - * \param input buffer holding the data - * \param ilen length of the input data - */ -void mbedtls_md2_update( mbedtls_md2_context *ctx, const unsigned char *input, size_t ilen ); - -/** - * \brief MD2 final digest - * - * \param ctx MD2 context - * \param output MD2 checksum result - */ -void mbedtls_md2_finish( mbedtls_md2_context *ctx, unsigned char output[16] ); - -#ifdef __cplusplus -} -#endif - -#else /* MBEDTLS_MD2_ALT */ -#include "md2_alt.h" -#endif /* MBEDTLS_MD2_ALT */ - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * \brief Output = MD2( input buffer ) - * - * \param input buffer holding the data - * \param ilen length of the input data - * \param output MD2 checksum result - */ -void mbedtls_md2( const unsigned char *input, size_t ilen, unsigned char output[16] ); - -/** - * \brief Checkup routine - * - * \return 0 if successful, or 1 if the test failed - */ -int mbedtls_md2_self_test( int verbose ); - -/* Internal use */ -void mbedtls_md2_process( mbedtls_md2_context *ctx ); - -#ifdef __cplusplus -} -#endif - -#endif /* mbedtls_md2.h */ diff --git a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/md4.h b/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/md4.h deleted file mode 100644 index 12cb81dc..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/md4.h +++ /dev/null @@ -1,136 +0,0 @@ -/** - * \file mbedtls_md4.h - * - * \brief MD4 message digest algorithm (hash function) - * - * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * This file is part of mbed TLS (https://tls.mbed.org) - */ -#ifndef MBEDTLS_MD4_H -#define MBEDTLS_MD4_H - -#if !defined(MBEDTLS_CONFIG_FILE) -#include "config.h" -#else -#include MBEDTLS_CONFIG_FILE -#endif - -#include -#include - -#if !defined(MBEDTLS_MD4_ALT) -// Regular implementation -// - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * \brief MD4 context structure - */ -typedef struct -{ - uint32_t total[2]; /*!< number of bytes processed */ - uint32_t state[4]; /*!< intermediate digest state */ - unsigned char buffer[64]; /*!< data block being processed */ -} -mbedtls_md4_context; - -/** - * \brief Initialize MD4 context - * - * \param ctx MD4 context to be initialized - */ -void mbedtls_md4_init( mbedtls_md4_context *ctx ); - -/** - * \brief Clear MD4 context - * - * \param ctx MD4 context to be cleared - */ -void mbedtls_md4_free( mbedtls_md4_context *ctx ); - -/** - * \brief Clone (the state of) an MD4 context - * - * \param dst The destination context - * \param src The context to be cloned - */ -void mbedtls_md4_clone( mbedtls_md4_context *dst, - const mbedtls_md4_context *src ); - -/** - * \brief MD4 context setup - * - * \param ctx context to be initialized - */ -void mbedtls_md4_starts( mbedtls_md4_context *ctx ); - -/** - * \brief MD4 process buffer - * - * \param ctx MD4 context - * \param input buffer holding the data - * \param ilen length of the input data - */ -void mbedtls_md4_update( mbedtls_md4_context *ctx, const unsigned char *input, size_t ilen ); - -/** - * \brief MD4 final digest - * - * \param ctx MD4 context - * \param output MD4 checksum result - */ -void mbedtls_md4_finish( mbedtls_md4_context *ctx, unsigned char output[16] ); - -#ifdef __cplusplus -} -#endif - -#else /* MBEDTLS_MD4_ALT */ -#include "md4_alt.h" -#endif /* MBEDTLS_MD4_ALT */ - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * \brief Output = MD4( input buffer ) - * - * \param input buffer holding the data - * \param ilen length of the input data - * \param output MD4 checksum result - */ -void mbedtls_md4( const unsigned char *input, size_t ilen, unsigned char output[16] ); - -/** - * \brief Checkup routine - * - * \return 0 if successful, or 1 if the test failed - */ -int mbedtls_md4_self_test( int verbose ); - -/* Internal use */ -void mbedtls_md4_process( mbedtls_md4_context *ctx, const unsigned char data[64] ); - -#ifdef __cplusplus -} -#endif - -#endif /* mbedtls_md4.h */ diff --git a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/md5.h b/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/md5.h deleted file mode 100644 index 09d8a947..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/md5.h +++ /dev/null @@ -1,136 +0,0 @@ -/** - * \file mbedtls_md5.h - * - * \brief MD5 message digest algorithm (hash function) - * - * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * This file is part of mbed TLS (https://tls.mbed.org) - */ -#ifndef MBEDTLS_MD5_H -#define MBEDTLS_MD5_H - -#if !defined(MBEDTLS_CONFIG_FILE) -#include "config.h" -#else -#include MBEDTLS_CONFIG_FILE -#endif - -#include -#include - -#if !defined(MBEDTLS_MD5_ALT) -// Regular implementation -// - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * \brief MD5 context structure - */ -typedef struct -{ - uint32_t total[2]; /*!< number of bytes processed */ - uint32_t state[4]; /*!< intermediate digest state */ - unsigned char buffer[64]; /*!< data block being processed */ -} -mbedtls_md5_context; - -/** - * \brief Initialize MD5 context - * - * \param ctx MD5 context to be initialized - */ -void mbedtls_md5_init( mbedtls_md5_context *ctx ); - -/** - * \brief Clear MD5 context - * - * \param ctx MD5 context to be cleared - */ -void mbedtls_md5_free( mbedtls_md5_context *ctx ); - -/** - * \brief Clone (the state of) an MD5 context - * - * \param dst The destination context - * \param src The context to be cloned - */ -void mbedtls_md5_clone( mbedtls_md5_context *dst, - const mbedtls_md5_context *src ); - -/** - * \brief MD5 context setup - * - * \param ctx context to be initialized - */ -void mbedtls_md5_starts( mbedtls_md5_context *ctx ); - -/** - * \brief MD5 process buffer - * - * \param ctx MD5 context - * \param input buffer holding the data - * \param ilen length of the input data - */ -void mbedtls_md5_update( mbedtls_md5_context *ctx, const unsigned char *input, size_t ilen ); - -/** - * \brief MD5 final digest - * - * \param ctx MD5 context - * \param output MD5 checksum result - */ -void mbedtls_md5_finish( mbedtls_md5_context *ctx, unsigned char output[16] ); - -/* Internal use */ -void mbedtls_md5_process( mbedtls_md5_context *ctx, const unsigned char data[64] ); - -#ifdef __cplusplus -} -#endif - -#else /* MBEDTLS_MD5_ALT */ -#include "md5_alt.h" -#endif /* MBEDTLS_MD5_ALT */ - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * \brief Output = MD5( input buffer ) - * - * \param input buffer holding the data - * \param ilen length of the input data - * \param output MD5 checksum result - */ -void mbedtls_md5( const unsigned char *input, size_t ilen, unsigned char output[16] ); - -/** - * \brief Checkup routine - * - * \return 0 if successful, or 1 if the test failed - */ -int mbedtls_md5_self_test( int verbose ); - -#ifdef __cplusplus -} -#endif - -#endif /* mbedtls_md5.h */ diff --git a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/md_internal.h b/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/md_internal.h deleted file mode 100644 index e2441bbc..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/md_internal.h +++ /dev/null @@ -1,114 +0,0 @@ -/** - * \file md_internal.h - * - * \brief Message digest wrappers. - * - * \warning This in an internal header. Do not include directly. - * - * \author Adriaan de Jong - * - * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * This file is part of mbed TLS (https://tls.mbed.org) - */ -#ifndef MBEDTLS_MD_WRAP_H -#define MBEDTLS_MD_WRAP_H - -#if !defined(MBEDTLS_CONFIG_FILE) -#include "config.h" -#else -#include MBEDTLS_CONFIG_FILE -#endif - -#include "md.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * Message digest information. - * Allows message digest functions to be called in a generic way. - */ -struct mbedtls_md_info_t -{ - /** Digest identifier */ - mbedtls_md_type_t type; - - /** Name of the message digest */ - const char * name; - - /** Output length of the digest function in bytes */ - int size; - - /** Block length of the digest function in bytes */ - int block_size; - - /** Digest initialisation function */ - void (*starts_func)( void *ctx ); - - /** Digest update function */ - void (*update_func)( void *ctx, const unsigned char *input, size_t ilen ); - - /** Digest finalisation function */ - void (*finish_func)( void *ctx, unsigned char *output ); - - /** Generic digest function */ - void (*digest_func)( const unsigned char *input, size_t ilen, - unsigned char *output ); - - /** Allocate a new context */ - void * (*ctx_alloc_func)( void ); - - /** Free the given context */ - void (*ctx_free_func)( void *ctx ); - - /** Clone state from a context */ - void (*clone_func)( void *dst, const void *src ); - - /** Internal use only */ - void (*process_func)( void *ctx, const unsigned char *input ); -}; - -#if defined(MBEDTLS_MD2_C) -extern const mbedtls_md_info_t mbedtls_md2_info; -#endif -#if defined(MBEDTLS_MD4_C) -extern const mbedtls_md_info_t mbedtls_md4_info; -#endif -#if defined(MBEDTLS_MD5_C) -extern const mbedtls_md_info_t mbedtls_md5_info; -#endif -#if defined(MBEDTLS_RIPEMD160_C) -extern const mbedtls_md_info_t mbedtls_ripemd160_info; -#endif -#if defined(MBEDTLS_SHA1_C) -extern const mbedtls_md_info_t mbedtls_sha1_info; -#endif -#if defined(MBEDTLS_SHA256_C) -extern const mbedtls_md_info_t mbedtls_sha224_info; -extern const mbedtls_md_info_t mbedtls_sha256_info; -#endif -#if defined(MBEDTLS_SHA512_C) -extern const mbedtls_md_info_t mbedtls_sha384_info; -extern const mbedtls_md_info_t mbedtls_sha512_info; -#endif - -#ifdef __cplusplus -} -#endif - -#endif /* MBEDTLS_MD_WRAP_H */ diff --git a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/memory_buffer_alloc.h b/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/memory_buffer_alloc.h deleted file mode 100644 index 661bc08d..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/memory_buffer_alloc.h +++ /dev/null @@ -1,146 +0,0 @@ -/** - * \file memory_buffer_alloc.h - * - * \brief Buffer-based memory allocator - * - * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * This file is part of mbed TLS (https://tls.mbed.org) - */ -#ifndef MBEDTLS_MEMORY_BUFFER_ALLOC_H -#define MBEDTLS_MEMORY_BUFFER_ALLOC_H - -#if !defined(MBEDTLS_CONFIG_FILE) -#include "config.h" -#else -#include MBEDTLS_CONFIG_FILE -#endif - -#include - -/** - * \name SECTION: Module settings - * - * The configuration options you can set for this module are in this section. - * Either change them in config.h or define them on the compiler command line. - * \{ - */ - -#if !defined(MBEDTLS_MEMORY_ALIGN_MULTIPLE) -#define MBEDTLS_MEMORY_ALIGN_MULTIPLE 4 /**< Align on multiples of this value */ -#endif - -/* \} name SECTION: Module settings */ - -#define MBEDTLS_MEMORY_VERIFY_NONE 0 -#define MBEDTLS_MEMORY_VERIFY_ALLOC (1 << 0) -#define MBEDTLS_MEMORY_VERIFY_FREE (1 << 1) -#define MBEDTLS_MEMORY_VERIFY_ALWAYS (MBEDTLS_MEMORY_VERIFY_ALLOC | MBEDTLS_MEMORY_VERIFY_FREE) - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * \brief Initialize use of stack-based memory allocator. - * The stack-based allocator does memory management inside the - * presented buffer and does not call calloc() and free(). - * It sets the global mbedtls_calloc() and mbedtls_free() pointers - * to its own functions. - * (Provided mbedtls_calloc() and mbedtls_free() are thread-safe if - * MBEDTLS_THREADING_C is defined) - * - * \note This code is not optimized and provides a straight-forward - * implementation of a stack-based memory allocator. - * - * \param buf buffer to use as heap - * \param len size of the buffer - */ -void mbedtls_memory_buffer_alloc_init( unsigned char *buf, size_t len ); - -/** - * \brief Free the mutex for thread-safety and clear remaining memory - */ -void mbedtls_memory_buffer_alloc_free( void ); - -/** - * \brief Determine when the allocator should automatically verify the state - * of the entire chain of headers / meta-data. - * (Default: MBEDTLS_MEMORY_VERIFY_NONE) - * - * \param verify One of MBEDTLS_MEMORY_VERIFY_NONE, MBEDTLS_MEMORY_VERIFY_ALLOC, - * MBEDTLS_MEMORY_VERIFY_FREE or MBEDTLS_MEMORY_VERIFY_ALWAYS - */ -void mbedtls_memory_buffer_set_verify( int verify ); - -#if defined(MBEDTLS_MEMORY_DEBUG) -/** - * \brief Print out the status of the allocated memory (primarily for use - * after a program should have de-allocated all memory) - * Prints out a list of 'still allocated' blocks and their stack - * trace if MBEDTLS_MEMORY_BACKTRACE is defined. - */ -void mbedtls_memory_buffer_alloc_status( void ); - -/** - * \brief Get the peak heap usage so far - * - * \param max_used Peak number of bytes reauested by the application - * \param max_blocks Peak number of blocks reauested by the application - */ -void mbedtls_memory_buffer_alloc_max_get( size_t *max_used, size_t *max_blocks ); - -/** - * \brief Reset peak statistics - */ -void mbedtls_memory_buffer_alloc_max_reset( void ); - -/** - * \brief Get the current heap usage - * - * \param cur_used Number of bytes reauested by the application - * \param cur_blocks Number of blocks reauested by the application - */ -void mbedtls_memory_buffer_alloc_cur_get( size_t *cur_used, size_t *cur_blocks ); -#endif /* MBEDTLS_MEMORY_DEBUG */ - -/** - * \brief Verifies that all headers in the memory buffer are correct - * and contain sane values. Helps debug buffer-overflow errors. - * - * Prints out first failure if MBEDTLS_MEMORY_DEBUG is defined. - * Prints out full header information if MBEDTLS_MEMORY_DEBUG - * is defined. (Includes stack trace information for each block if - * MBEDTLS_MEMORY_BACKTRACE is defined as well). - * - * \return 0 if verified, 1 otherwise - */ -int mbedtls_memory_buffer_alloc_verify( void ); - -#if defined(MBEDTLS_SELF_TEST) -/** - * \brief Checkup routine - * - * \return 0 if successful, or 1 if a test failed - */ -int mbedtls_memory_buffer_alloc_self_test( int verbose ); -#endif - -#ifdef __cplusplus -} -#endif - -#endif /* memory_buffer_alloc.h */ diff --git a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/net.h b/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/net.h deleted file mode 100644 index 8c6534cf..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/net.h +++ /dev/null @@ -1,225 +0,0 @@ -/** - * \file net.h - * - * \brief Network communication functions - * - * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * This file is part of mbed TLS (https://tls.mbed.org) - */ -#ifndef MBEDTLS_NET_H -#define MBEDTLS_NET_H - -#if !defined(MBEDTLS_CONFIG_FILE) -#include "config.h" -#else -#include MBEDTLS_CONFIG_FILE -#endif - -#include "ssl.h" - -#include -#include - -#define MBEDTLS_ERR_NET_SOCKET_FAILED -0x0042 /**< Failed to open a socket. */ -#define MBEDTLS_ERR_NET_CONNECT_FAILED -0x0044 /**< The connection to the given server / port failed. */ -#define MBEDTLS_ERR_NET_BIND_FAILED -0x0046 /**< Binding of the socket failed. */ -#define MBEDTLS_ERR_NET_LISTEN_FAILED -0x0048 /**< Could not listen on the socket. */ -#define MBEDTLS_ERR_NET_ACCEPT_FAILED -0x004A /**< Could not accept the incoming connection. */ -#define MBEDTLS_ERR_NET_RECV_FAILED -0x004C /**< Reading information from the socket failed. */ -#define MBEDTLS_ERR_NET_SEND_FAILED -0x004E /**< Sending information through the socket failed. */ -#define MBEDTLS_ERR_NET_CONN_RESET -0x0050 /**< Connection was reset by peer. */ -#define MBEDTLS_ERR_NET_UNKNOWN_HOST -0x0052 /**< Failed to get an IP address for the given hostname. */ -#define MBEDTLS_ERR_NET_BUFFER_TOO_SMALL -0x0043 /**< Buffer is too small to hold the data. */ -#define MBEDTLS_ERR_NET_INVALID_CONTEXT -0x0045 /**< The context is invalid, eg because it was free()ed. */ - -#define MBEDTLS_NET_LISTEN_BACKLOG 10 /**< The backlog that listen() should use. */ - -#define MBEDTLS_NET_PROTO_TCP 0 /**< The TCP transport protocol */ -#define MBEDTLS_NET_PROTO_UDP 1 /**< The UDP transport protocol */ - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * Wrapper type for sockets. - * - * Currently backed by just a file descriptor, but might be more in the future - * (eg two file descriptors for combined IPv4 + IPv6 support, or additional - * structures for hand-made UDP demultiplexing). - */ -typedef struct -{ - int fd; /**< The underlying file descriptor */ -} -mbedtls_net_context; - -/** - * \brief Initialize a context - * Just makes the context ready to be used or freed safely. - * - * \param ctx Context to initialize - */ -void mbedtls_net_init( mbedtls_net_context *ctx ); - -/** - * \brief Initiate a connection with host:port in the given protocol - * - * \param ctx Socket to use - * \param host Host to connect to - * \param port Port to connect to - * \param proto Protocol: MBEDTLS_NET_PROTO_TCP or MBEDTLS_NET_PROTO_UDP - * - * \return 0 if successful, or one of: - * MBEDTLS_ERR_NET_SOCKET_FAILED, - * MBEDTLS_ERR_NET_UNKNOWN_HOST, - * MBEDTLS_ERR_NET_CONNECT_FAILED - * - * \note Sets the socket in connected mode even with UDP. - */ -int mbedtls_net_connect( mbedtls_net_context *ctx, const char *host, const char *port, int proto ); - -/** - * \brief Create a receiving socket on bind_ip:port in the chosen - * protocol. If bind_ip == NULL, all interfaces are bound. - * - * \param ctx Socket to use - * \param bind_ip IP to bind to, can be NULL - * \param port Port number to use - * \param proto Protocol: MBEDTLS_NET_PROTO_TCP or MBEDTLS_NET_PROTO_UDP - * - * \return 0 if successful, or one of: - * MBEDTLS_ERR_NET_SOCKET_FAILED, - * MBEDTLS_ERR_NET_BIND_FAILED, - * MBEDTLS_ERR_NET_LISTEN_FAILED - * - * \note Regardless of the protocol, opens the sockets and binds it. - * In addition, make the socket listening if protocol is TCP. - */ -int mbedtls_net_bind( mbedtls_net_context *ctx, const char *bind_ip, const char *port, int proto ); - -/** - * \brief Accept a connection from a remote client - * - * \param bind_ctx Relevant socket - * \param client_ctx Will contain the connected client socket - * \param client_ip Will contain the client IP address - * \param buf_size Size of the client_ip buffer - * \param ip_len Will receive the size of the client IP written - * - * \return 0 if successful, or - * MBEDTLS_ERR_NET_ACCEPT_FAILED, or - * MBEDTLS_ERR_NET_BUFFER_TOO_SMALL if buf_size is too small, - * MBEDTLS_ERR_SSL_WANT_READ if bind_fd was set to - * non-blocking and accept() would block. - */ -int mbedtls_net_accept( mbedtls_net_context *bind_ctx, - mbedtls_net_context *client_ctx, - void *client_ip, size_t buf_size, size_t *ip_len ); - -/** - * \brief Set the socket blocking - * - * \param ctx Socket to set - * - * \return 0 if successful, or a non-zero error code - */ -int mbedtls_net_set_block( mbedtls_net_context *ctx ); - -/** - * \brief Set the socket non-blocking - * - * \param ctx Socket to set - * - * \return 0 if successful, or a non-zero error code - */ -int mbedtls_net_set_nonblock( mbedtls_net_context *ctx ); - -/** - * \brief Portable usleep helper - * - * \param usec Amount of microseconds to sleep - * - * \note Real amount of time slept will not be less than - * select()'s timeout granularity (typically, 10ms). - */ -void mbedtls_net_usleep( unsigned long usec ); - -/** - * \brief Read at most 'len' characters. If no error occurs, - * the actual amount read is returned. - * - * \param ctx Socket - * \param buf The buffer to write to - * \param len Maximum length of the buffer - * - * \return the number of bytes received, - * or a non-zero error code; with a non-blocking socket, - * MBEDTLS_ERR_SSL_WANT_READ indicates read() would block. - */ -int mbedtls_net_recv( void *ctx, unsigned char *buf, size_t len ); - -/** - * \brief Write at most 'len' characters. If no error occurs, - * the actual amount read is returned. - * - * \param ctx Socket - * \param buf The buffer to read from - * \param len The length of the buffer - * - * \return the number of bytes sent, - * or a non-zero error code; with a non-blocking socket, - * MBEDTLS_ERR_SSL_WANT_WRITE indicates write() would block. - */ -int mbedtls_net_send( void *ctx, const unsigned char *buf, size_t len ); - -/** - * \brief Read at most 'len' characters, blocking for at most - * 'timeout' seconds. If no error occurs, the actual amount - * read is returned. - * - * \param ctx Socket - * \param buf The buffer to write to - * \param len Maximum length of the buffer - * \param timeout Maximum number of milliseconds to wait for data - * 0 means no timeout (wait forever) - * - * \return the number of bytes received, - * or a non-zero error code: - * MBEDTLS_ERR_SSL_TIMEOUT if the operation timed out, - * MBEDTLS_ERR_SSL_WANT_READ if interrupted by a signal. - * - * \note This function will block (until data becomes available or - * timeout is reached) even if the socket is set to - * non-blocking. Handling timeouts with non-blocking reads - * requires a different strategy. - */ -int mbedtls_net_recv_timeout( void *ctx, unsigned char *buf, size_t len, - uint32_t timeout ); - -/** - * \brief Gracefully shutdown the connection and free associated data - * - * \param ctx The context to free - */ -void mbedtls_net_free( mbedtls_net_context *ctx ); - -#ifdef __cplusplus -} -#endif - -#endif /* net.h */ diff --git a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/oid.h b/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/oid.h deleted file mode 100644 index fcecdafd..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/oid.h +++ /dev/null @@ -1,570 +0,0 @@ -/** - * \file oid.h - * - * \brief Object Identifier (OID) database - * - * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * This file is part of mbed TLS (https://tls.mbed.org) - */ -#ifndef MBEDTLS_OID_H -#define MBEDTLS_OID_H - -#if !defined(MBEDTLS_CONFIG_FILE) -#include "config.h" -#else -#include MBEDTLS_CONFIG_FILE -#endif - -#include "asn1.h" -#include "pk.h" - -#include - -#if defined(MBEDTLS_CIPHER_C) -#include "cipher.h" -#endif - -#if defined(MBEDTLS_MD_C) -#include "md.h" -#endif - -#if defined(MBEDTLS_X509_USE_C) || defined(MBEDTLS_X509_CREATE_C) -#include "x509.h" -#endif - -#define MBEDTLS_ERR_OID_NOT_FOUND -0x002E /**< OID is not found. */ -#define MBEDTLS_ERR_OID_BUF_TOO_SMALL -0x000B /**< output buffer is too small */ - -/* - * Top level OID tuples - */ -#define MBEDTLS_OID_ISO_MEMBER_BODIES "\x2a" /* {iso(1) member-body(2)} */ -#define MBEDTLS_OID_ISO_IDENTIFIED_ORG "\x2b" /* {iso(1) identified-organization(3)} */ -#define MBEDTLS_OID_ISO_CCITT_DS "\x55" /* {joint-iso-ccitt(2) ds(5)} */ -#define MBEDTLS_OID_ISO_ITU_COUNTRY "\x60" /* {joint-iso-itu-t(2) country(16)} */ - -/* - * ISO Member bodies OID parts - */ -#define MBEDTLS_OID_COUNTRY_US "\x86\x48" /* {us(840)} */ -#define MBEDTLS_OID_ORG_RSA_DATA_SECURITY "\x86\xf7\x0d" /* {rsadsi(113549)} */ -#define MBEDTLS_OID_RSA_COMPANY MBEDTLS_OID_ISO_MEMBER_BODIES MBEDTLS_OID_COUNTRY_US \ - MBEDTLS_OID_ORG_RSA_DATA_SECURITY /* {iso(1) member-body(2) us(840) rsadsi(113549)} */ -#define MBEDTLS_OID_ORG_ANSI_X9_62 "\xce\x3d" /* ansi-X9-62(10045) */ -#define MBEDTLS_OID_ANSI_X9_62 MBEDTLS_OID_ISO_MEMBER_BODIES MBEDTLS_OID_COUNTRY_US \ - MBEDTLS_OID_ORG_ANSI_X9_62 - -/* - * ISO Identified organization OID parts - */ -#define MBEDTLS_OID_ORG_DOD "\x06" /* {dod(6)} */ -#define MBEDTLS_OID_ORG_OIW "\x0e" -#define MBEDTLS_OID_OIW_SECSIG MBEDTLS_OID_ORG_OIW "\x03" -#define MBEDTLS_OID_OIW_SECSIG_ALG MBEDTLS_OID_OIW_SECSIG "\x02" -#define MBEDTLS_OID_OIW_SECSIG_SHA1 MBEDTLS_OID_OIW_SECSIG_ALG "\x1a" -#define MBEDTLS_OID_ORG_CERTICOM "\x81\x04" /* certicom(132) */ -#define MBEDTLS_OID_CERTICOM MBEDTLS_OID_ISO_IDENTIFIED_ORG MBEDTLS_OID_ORG_CERTICOM -#define MBEDTLS_OID_ORG_TELETRUST "\x24" /* teletrust(36) */ -#define MBEDTLS_OID_TELETRUST MBEDTLS_OID_ISO_IDENTIFIED_ORG MBEDTLS_OID_ORG_TELETRUST - -/* - * ISO ITU OID parts - */ -#define MBEDTLS_OID_ORGANIZATION "\x01" /* {organization(1)} */ -#define MBEDTLS_OID_ISO_ITU_US_ORG MBEDTLS_OID_ISO_ITU_COUNTRY MBEDTLS_OID_COUNTRY_US MBEDTLS_OID_ORGANIZATION /* {joint-iso-itu-t(2) country(16) us(840) organization(1)} */ - -#define MBEDTLS_OID_ORG_GOV "\x65" /* {gov(101)} */ -#define MBEDTLS_OID_GOV MBEDTLS_OID_ISO_ITU_US_ORG MBEDTLS_OID_ORG_GOV /* {joint-iso-itu-t(2) country(16) us(840) organization(1) gov(101)} */ - -#define MBEDTLS_OID_ORG_NETSCAPE "\x86\xF8\x42" /* {netscape(113730)} */ -#define MBEDTLS_OID_NETSCAPE MBEDTLS_OID_ISO_ITU_US_ORG MBEDTLS_OID_ORG_NETSCAPE /* Netscape OID {joint-iso-itu-t(2) country(16) us(840) organization(1) netscape(113730)} */ - -/* ISO arc for standard certificate and CRL extensions */ -#define MBEDTLS_OID_ID_CE MBEDTLS_OID_ISO_CCITT_DS "\x1D" /**< id-ce OBJECT IDENTIFIER ::= {joint-iso-ccitt(2) ds(5) 29} */ - -/** - * Private Internet Extensions - * { iso(1) identified-organization(3) dod(6) internet(1) - * security(5) mechanisms(5) pkix(7) } - */ -#define MBEDTLS_OID_PKIX MBEDTLS_OID_ISO_IDENTIFIED_ORG MBEDTLS_OID_ORG_DOD "\x01\x05\x05\x07" - -/* - * Arc for standard naming attributes - */ -#define MBEDTLS_OID_AT MBEDTLS_OID_ISO_CCITT_DS "\x04" /**< id-at OBJECT IDENTIFIER ::= {joint-iso-ccitt(2) ds(5) 4} */ -#define MBEDTLS_OID_AT_CN MBEDTLS_OID_AT "\x03" /**< id-at-commonName AttributeType:= {id-at 3} */ -#define MBEDTLS_OID_AT_SUR_NAME MBEDTLS_OID_AT "\x04" /**< id-at-surName AttributeType:= {id-at 4} */ -#define MBEDTLS_OID_AT_SERIAL_NUMBER MBEDTLS_OID_AT "\x05" /**< id-at-serialNumber AttributeType:= {id-at 5} */ -#define MBEDTLS_OID_AT_COUNTRY MBEDTLS_OID_AT "\x06" /**< id-at-countryName AttributeType:= {id-at 6} */ -#define MBEDTLS_OID_AT_LOCALITY MBEDTLS_OID_AT "\x07" /**< id-at-locality AttributeType:= {id-at 7} */ -#define MBEDTLS_OID_AT_STATE MBEDTLS_OID_AT "\x08" /**< id-at-state AttributeType:= {id-at 8} */ -#define MBEDTLS_OID_AT_ORGANIZATION MBEDTLS_OID_AT "\x0A" /**< id-at-organizationName AttributeType:= {id-at 10} */ -#define MBEDTLS_OID_AT_ORG_UNIT MBEDTLS_OID_AT "\x0B" /**< id-at-organizationalUnitName AttributeType:= {id-at 11} */ -#define MBEDTLS_OID_AT_TITLE MBEDTLS_OID_AT "\x0C" /**< id-at-title AttributeType:= {id-at 12} */ -#define MBEDTLS_OID_AT_POSTAL_ADDRESS MBEDTLS_OID_AT "\x10" /**< id-at-postalAddress AttributeType:= {id-at 16} */ -#define MBEDTLS_OID_AT_POSTAL_CODE MBEDTLS_OID_AT "\x11" /**< id-at-postalCode AttributeType:= {id-at 17} */ -#define MBEDTLS_OID_AT_GIVEN_NAME MBEDTLS_OID_AT "\x2A" /**< id-at-givenName AttributeType:= {id-at 42} */ -#define MBEDTLS_OID_AT_INITIALS MBEDTLS_OID_AT "\x2B" /**< id-at-initials AttributeType:= {id-at 43} */ -#define MBEDTLS_OID_AT_GENERATION_QUALIFIER MBEDTLS_OID_AT "\x2C" /**< id-at-generationQualifier AttributeType:= {id-at 44} */ -#define MBEDTLS_OID_AT_UNIQUE_IDENTIFIER MBEDTLS_OID_AT "\x2D" /**< id-at-uniqueIdentifier AttributType:= {id-at 45} */ -#define MBEDTLS_OID_AT_DN_QUALIFIER MBEDTLS_OID_AT "\x2E" /**< id-at-dnQualifier AttributeType:= {id-at 46} */ -#define MBEDTLS_OID_AT_PSEUDONYM MBEDTLS_OID_AT "\x41" /**< id-at-pseudonym AttributeType:= {id-at 65} */ - -#define MBEDTLS_OID_DOMAIN_COMPONENT "\x09\x92\x26\x89\x93\xF2\x2C\x64\x01\x19" /** id-domainComponent AttributeType:= {itu-t(0) data(9) pss(2342) ucl(19200300) pilot(100) pilotAttributeType(1) domainComponent(25)} */ - -/* - * OIDs for standard certificate extensions - */ -#define MBEDTLS_OID_AUTHORITY_KEY_IDENTIFIER MBEDTLS_OID_ID_CE "\x23" /**< id-ce-authorityKeyIdentifier OBJECT IDENTIFIER ::= { id-ce 35 } */ -#define MBEDTLS_OID_SUBJECT_KEY_IDENTIFIER MBEDTLS_OID_ID_CE "\x0E" /**< id-ce-subjectKeyIdentifier OBJECT IDENTIFIER ::= { id-ce 14 } */ -#define MBEDTLS_OID_KEY_USAGE MBEDTLS_OID_ID_CE "\x0F" /**< id-ce-keyUsage OBJECT IDENTIFIER ::= { id-ce 15 } */ -#define MBEDTLS_OID_CERTIFICATE_POLICIES MBEDTLS_OID_ID_CE "\x20" /**< id-ce-certificatePolicies OBJECT IDENTIFIER ::= { id-ce 32 } */ -#define MBEDTLS_OID_POLICY_MAPPINGS MBEDTLS_OID_ID_CE "\x21" /**< id-ce-policyMappings OBJECT IDENTIFIER ::= { id-ce 33 } */ -#define MBEDTLS_OID_SUBJECT_ALT_NAME MBEDTLS_OID_ID_CE "\x11" /**< id-ce-subjectAltName OBJECT IDENTIFIER ::= { id-ce 17 } */ -#define MBEDTLS_OID_ISSUER_ALT_NAME MBEDTLS_OID_ID_CE "\x12" /**< id-ce-issuerAltName OBJECT IDENTIFIER ::= { id-ce 18 } */ -#define MBEDTLS_OID_SUBJECT_DIRECTORY_ATTRS MBEDTLS_OID_ID_CE "\x09" /**< id-ce-subjectDirectoryAttributes OBJECT IDENTIFIER ::= { id-ce 9 } */ -#define MBEDTLS_OID_BASIC_CONSTRAINTS MBEDTLS_OID_ID_CE "\x13" /**< id-ce-basicConstraints OBJECT IDENTIFIER ::= { id-ce 19 } */ -#define MBEDTLS_OID_NAME_CONSTRAINTS MBEDTLS_OID_ID_CE "\x1E" /**< id-ce-nameConstraints OBJECT IDENTIFIER ::= { id-ce 30 } */ -#define MBEDTLS_OID_POLICY_CONSTRAINTS MBEDTLS_OID_ID_CE "\x24" /**< id-ce-policyConstraints OBJECT IDENTIFIER ::= { id-ce 36 } */ -#define MBEDTLS_OID_EXTENDED_KEY_USAGE MBEDTLS_OID_ID_CE "\x25" /**< id-ce-extKeyUsage OBJECT IDENTIFIER ::= { id-ce 37 } */ -#define MBEDTLS_OID_CRL_DISTRIBUTION_POINTS MBEDTLS_OID_ID_CE "\x1F" /**< id-ce-cRLDistributionPoints OBJECT IDENTIFIER ::= { id-ce 31 } */ -#define MBEDTLS_OID_INIHIBIT_ANYPOLICY MBEDTLS_OID_ID_CE "\x36" /**< id-ce-inhibitAnyPolicy OBJECT IDENTIFIER ::= { id-ce 54 } */ -#define MBEDTLS_OID_FRESHEST_CRL MBEDTLS_OID_ID_CE "\x2E" /**< id-ce-freshestCRL OBJECT IDENTIFIER ::= { id-ce 46 } */ - -/* - * Netscape certificate extensions - */ -#define MBEDTLS_OID_NS_CERT MBEDTLS_OID_NETSCAPE "\x01" -#define MBEDTLS_OID_NS_CERT_TYPE MBEDTLS_OID_NS_CERT "\x01" -#define MBEDTLS_OID_NS_BASE_URL MBEDTLS_OID_NS_CERT "\x02" -#define MBEDTLS_OID_NS_REVOCATION_URL MBEDTLS_OID_NS_CERT "\x03" -#define MBEDTLS_OID_NS_CA_REVOCATION_URL MBEDTLS_OID_NS_CERT "\x04" -#define MBEDTLS_OID_NS_RENEWAL_URL MBEDTLS_OID_NS_CERT "\x07" -#define MBEDTLS_OID_NS_CA_POLICY_URL MBEDTLS_OID_NS_CERT "\x08" -#define MBEDTLS_OID_NS_SSL_SERVER_NAME MBEDTLS_OID_NS_CERT "\x0C" -#define MBEDTLS_OID_NS_COMMENT MBEDTLS_OID_NS_CERT "\x0D" -#define MBEDTLS_OID_NS_DATA_TYPE MBEDTLS_OID_NETSCAPE "\x02" -#define MBEDTLS_OID_NS_CERT_SEQUENCE MBEDTLS_OID_NS_DATA_TYPE "\x05" - -/* - * OIDs for CRL extensions - */ -#define MBEDTLS_OID_PRIVATE_KEY_USAGE_PERIOD MBEDTLS_OID_ID_CE "\x10" -#define MBEDTLS_OID_CRL_NUMBER MBEDTLS_OID_ID_CE "\x14" /**< id-ce-cRLNumber OBJECT IDENTIFIER ::= { id-ce 20 } */ - -/* - * X.509 v3 Extended key usage OIDs - */ -#define MBEDTLS_OID_ANY_EXTENDED_KEY_USAGE MBEDTLS_OID_EXTENDED_KEY_USAGE "\x00" /**< anyExtendedKeyUsage OBJECT IDENTIFIER ::= { id-ce-extKeyUsage 0 } */ - -#define MBEDTLS_OID_KP MBEDTLS_OID_PKIX "\x03" /**< id-kp OBJECT IDENTIFIER ::= { id-pkix 3 } */ -#define MBEDTLS_OID_SERVER_AUTH MBEDTLS_OID_KP "\x01" /**< id-kp-serverAuth OBJECT IDENTIFIER ::= { id-kp 1 } */ -#define MBEDTLS_OID_CLIENT_AUTH MBEDTLS_OID_KP "\x02" /**< id-kp-clientAuth OBJECT IDENTIFIER ::= { id-kp 2 } */ -#define MBEDTLS_OID_CODE_SIGNING MBEDTLS_OID_KP "\x03" /**< id-kp-codeSigning OBJECT IDENTIFIER ::= { id-kp 3 } */ -#define MBEDTLS_OID_EMAIL_PROTECTION MBEDTLS_OID_KP "\x04" /**< id-kp-emailProtection OBJECT IDENTIFIER ::= { id-kp 4 } */ -#define MBEDTLS_OID_TIME_STAMPING MBEDTLS_OID_KP "\x08" /**< id-kp-timeStamping OBJECT IDENTIFIER ::= { id-kp 8 } */ -#define MBEDTLS_OID_OCSP_SIGNING MBEDTLS_OID_KP "\x09" /**< id-kp-OCSPSigning OBJECT IDENTIFIER ::= { id-kp 9 } */ - -/* - * PKCS definition OIDs - */ - -#define MBEDTLS_OID_PKCS MBEDTLS_OID_RSA_COMPANY "\x01" /**< pkcs OBJECT IDENTIFIER ::= { iso(1) member-body(2) us(840) rsadsi(113549) 1 } */ -#define MBEDTLS_OID_PKCS1 MBEDTLS_OID_PKCS "\x01" /**< pkcs-1 OBJECT IDENTIFIER ::= { iso(1) member-body(2) us(840) rsadsi(113549) pkcs(1) 1 } */ -#define MBEDTLS_OID_PKCS5 MBEDTLS_OID_PKCS "\x05" /**< pkcs-5 OBJECT IDENTIFIER ::= { iso(1) member-body(2) us(840) rsadsi(113549) pkcs(1) 5 } */ -#define MBEDTLS_OID_PKCS9 MBEDTLS_OID_PKCS "\x09" /**< pkcs-9 OBJECT IDENTIFIER ::= { iso(1) member-body(2) us(840) rsadsi(113549) pkcs(1) 9 } */ -#define MBEDTLS_OID_PKCS12 MBEDTLS_OID_PKCS "\x0c" /**< pkcs-12 OBJECT IDENTIFIER ::= { iso(1) member-body(2) us(840) rsadsi(113549) pkcs(1) 12 } */ - -/* - * PKCS#1 OIDs - */ -#define MBEDTLS_OID_PKCS1_RSA MBEDTLS_OID_PKCS1 "\x01" /**< rsaEncryption OBJECT IDENTIFIER ::= { pkcs-1 1 } */ -#define MBEDTLS_OID_PKCS1_MD2 MBEDTLS_OID_PKCS1 "\x02" /**< md2WithRSAEncryption ::= { pkcs-1 2 } */ -#define MBEDTLS_OID_PKCS1_MD4 MBEDTLS_OID_PKCS1 "\x03" /**< md4WithRSAEncryption ::= { pkcs-1 3 } */ -#define MBEDTLS_OID_PKCS1_MD5 MBEDTLS_OID_PKCS1 "\x04" /**< md5WithRSAEncryption ::= { pkcs-1 4 } */ -#define MBEDTLS_OID_PKCS1_SHA1 MBEDTLS_OID_PKCS1 "\x05" /**< sha1WithRSAEncryption ::= { pkcs-1 5 } */ -#define MBEDTLS_OID_PKCS1_SHA224 MBEDTLS_OID_PKCS1 "\x0e" /**< sha224WithRSAEncryption ::= { pkcs-1 14 } */ -#define MBEDTLS_OID_PKCS1_SHA256 MBEDTLS_OID_PKCS1 "\x0b" /**< sha256WithRSAEncryption ::= { pkcs-1 11 } */ -#define MBEDTLS_OID_PKCS1_SHA384 MBEDTLS_OID_PKCS1 "\x0c" /**< sha384WithRSAEncryption ::= { pkcs-1 12 } */ -#define MBEDTLS_OID_PKCS1_SHA512 MBEDTLS_OID_PKCS1 "\x0d" /**< sha512WithRSAEncryption ::= { pkcs-1 13 } */ - -#define MBEDTLS_OID_RSA_SHA_OBS "\x2B\x0E\x03\x02\x1D" - -#define MBEDTLS_OID_PKCS9_EMAIL MBEDTLS_OID_PKCS9 "\x01" /**< emailAddress AttributeType ::= { pkcs-9 1 } */ - -/* RFC 4055 */ -#define MBEDTLS_OID_RSASSA_PSS MBEDTLS_OID_PKCS1 "\x0a" /**< id-RSASSA-PSS ::= { pkcs-1 10 } */ -#define MBEDTLS_OID_MGF1 MBEDTLS_OID_PKCS1 "\x08" /**< id-mgf1 ::= { pkcs-1 8 } */ - -/* - * Digest algorithms - */ -#define MBEDTLS_OID_DIGEST_ALG_MD2 MBEDTLS_OID_RSA_COMPANY "\x02\x02" /**< id-mbedtls_md2 OBJECT IDENTIFIER ::= { iso(1) member-body(2) us(840) rsadsi(113549) digestAlgorithm(2) 2 } */ -#define MBEDTLS_OID_DIGEST_ALG_MD4 MBEDTLS_OID_RSA_COMPANY "\x02\x04" /**< id-mbedtls_md4 OBJECT IDENTIFIER ::= { iso(1) member-body(2) us(840) rsadsi(113549) digestAlgorithm(2) 4 } */ -#define MBEDTLS_OID_DIGEST_ALG_MD5 MBEDTLS_OID_RSA_COMPANY "\x02\x05" /**< id-mbedtls_md5 OBJECT IDENTIFIER ::= { iso(1) member-body(2) us(840) rsadsi(113549) digestAlgorithm(2) 5 } */ -#define MBEDTLS_OID_DIGEST_ALG_SHA1 MBEDTLS_OID_ISO_IDENTIFIED_ORG MBEDTLS_OID_OIW_SECSIG_SHA1 /**< id-mbedtls_sha1 OBJECT IDENTIFIER ::= { iso(1) identified-organization(3) oiw(14) secsig(3) algorithms(2) 26 } */ -#define MBEDTLS_OID_DIGEST_ALG_SHA224 MBEDTLS_OID_GOV "\x03\x04\x02\x04" /**< id-sha224 OBJECT IDENTIFIER ::= { joint-iso-itu-t(2) country(16) us(840) organization(1) gov(101) csor(3) nistalgorithm(4) hashalgs(2) 4 } */ -#define MBEDTLS_OID_DIGEST_ALG_SHA256 MBEDTLS_OID_GOV "\x03\x04\x02\x01" /**< id-mbedtls_sha256 OBJECT IDENTIFIER ::= { joint-iso-itu-t(2) country(16) us(840) organization(1) gov(101) csor(3) nistalgorithm(4) hashalgs(2) 1 } */ - -#define MBEDTLS_OID_DIGEST_ALG_SHA384 MBEDTLS_OID_GOV "\x03\x04\x02\x02" /**< id-sha384 OBJECT IDENTIFIER ::= { joint-iso-itu-t(2) country(16) us(840) organization(1) gov(101) csor(3) nistalgorithm(4) hashalgs(2) 2 } */ - -#define MBEDTLS_OID_DIGEST_ALG_SHA512 MBEDTLS_OID_GOV "\x03\x04\x02\x03" /**< id-mbedtls_sha512 OBJECT IDENTIFIER ::= { joint-iso-itu-t(2) country(16) us(840) organization(1) gov(101) csor(3) nistalgorithm(4) hashalgs(2) 3 } */ - -#define MBEDTLS_OID_HMAC_SHA1 MBEDTLS_OID_RSA_COMPANY "\x02\x07" /**< id-hmacWithSHA1 OBJECT IDENTIFIER ::= { iso(1) member-body(2) us(840) rsadsi(113549) digestAlgorithm(2) 7 } */ - -/* - * Encryption algorithms - */ -#define MBEDTLS_OID_DES_CBC MBEDTLS_OID_ISO_IDENTIFIED_ORG MBEDTLS_OID_OIW_SECSIG_ALG "\x07" /**< desCBC OBJECT IDENTIFIER ::= { iso(1) identified-organization(3) oiw(14) secsig(3) algorithms(2) 7 } */ -#define MBEDTLS_OID_DES_EDE3_CBC MBEDTLS_OID_RSA_COMPANY "\x03\x07" /**< des-ede3-cbc OBJECT IDENTIFIER ::= { iso(1) member-body(2) -- us(840) rsadsi(113549) encryptionAlgorithm(3) 7 } */ - -/* - * PKCS#5 OIDs - */ -#define MBEDTLS_OID_PKCS5_PBKDF2 MBEDTLS_OID_PKCS5 "\x0c" /**< id-PBKDF2 OBJECT IDENTIFIER ::= {pkcs-5 12} */ -#define MBEDTLS_OID_PKCS5_PBES2 MBEDTLS_OID_PKCS5 "\x0d" /**< id-PBES2 OBJECT IDENTIFIER ::= {pkcs-5 13} */ -#define MBEDTLS_OID_PKCS5_PBMAC1 MBEDTLS_OID_PKCS5 "\x0e" /**< id-PBMAC1 OBJECT IDENTIFIER ::= {pkcs-5 14} */ - -/* - * PKCS#5 PBES1 algorithms - */ -#define MBEDTLS_OID_PKCS5_PBE_MD2_DES_CBC MBEDTLS_OID_PKCS5 "\x01" /**< pbeWithMD2AndDES-CBC OBJECT IDENTIFIER ::= {pkcs-5 1} */ -#define MBEDTLS_OID_PKCS5_PBE_MD2_RC2_CBC MBEDTLS_OID_PKCS5 "\x04" /**< pbeWithMD2AndRC2-CBC OBJECT IDENTIFIER ::= {pkcs-5 4} */ -#define MBEDTLS_OID_PKCS5_PBE_MD5_DES_CBC MBEDTLS_OID_PKCS5 "\x03" /**< pbeWithMD5AndDES-CBC OBJECT IDENTIFIER ::= {pkcs-5 3} */ -#define MBEDTLS_OID_PKCS5_PBE_MD5_RC2_CBC MBEDTLS_OID_PKCS5 "\x06" /**< pbeWithMD5AndRC2-CBC OBJECT IDENTIFIER ::= {pkcs-5 6} */ -#define MBEDTLS_OID_PKCS5_PBE_SHA1_DES_CBC MBEDTLS_OID_PKCS5 "\x0a" /**< pbeWithSHA1AndDES-CBC OBJECT IDENTIFIER ::= {pkcs-5 10} */ -#define MBEDTLS_OID_PKCS5_PBE_SHA1_RC2_CBC MBEDTLS_OID_PKCS5 "\x0b" /**< pbeWithSHA1AndRC2-CBC OBJECT IDENTIFIER ::= {pkcs-5 11} */ - -/* - * PKCS#8 OIDs - */ -#define MBEDTLS_OID_PKCS9_CSR_EXT_REQ MBEDTLS_OID_PKCS9 "\x0e" /**< extensionRequest OBJECT IDENTIFIER ::= {pkcs-9 14} */ - -/* - * PKCS#12 PBE OIDs - */ -#define MBEDTLS_OID_PKCS12_PBE MBEDTLS_OID_PKCS12 "\x01" /**< pkcs-12PbeIds OBJECT IDENTIFIER ::= {pkcs-12 1} */ - -#define MBEDTLS_OID_PKCS12_PBE_SHA1_RC4_128 MBEDTLS_OID_PKCS12_PBE "\x01" /**< pbeWithSHAAnd128BitRC4 OBJECT IDENTIFIER ::= {pkcs-12PbeIds 1} */ -#define MBEDTLS_OID_PKCS12_PBE_SHA1_RC4_40 MBEDTLS_OID_PKCS12_PBE "\x02" /**< pbeWithSHAAnd40BitRC4 OBJECT IDENTIFIER ::= {pkcs-12PbeIds 2} */ -#define MBEDTLS_OID_PKCS12_PBE_SHA1_DES3_EDE_CBC MBEDTLS_OID_PKCS12_PBE "\x03" /**< pbeWithSHAAnd3-KeyTripleDES-CBC OBJECT IDENTIFIER ::= {pkcs-12PbeIds 3} */ -#define MBEDTLS_OID_PKCS12_PBE_SHA1_DES2_EDE_CBC MBEDTLS_OID_PKCS12_PBE "\x04" /**< pbeWithSHAAnd2-KeyTripleDES-CBC OBJECT IDENTIFIER ::= {pkcs-12PbeIds 4} */ -#define MBEDTLS_OID_PKCS12_PBE_SHA1_RC2_128_CBC MBEDTLS_OID_PKCS12_PBE "\x05" /**< pbeWithSHAAnd128BitRC2-CBC OBJECT IDENTIFIER ::= {pkcs-12PbeIds 5} */ -#define MBEDTLS_OID_PKCS12_PBE_SHA1_RC2_40_CBC MBEDTLS_OID_PKCS12_PBE "\x06" /**< pbeWithSHAAnd40BitRC2-CBC OBJECT IDENTIFIER ::= {pkcs-12PbeIds 6} */ - -/* - * EC key algorithms from RFC 5480 - */ - -/* id-ecPublicKey OBJECT IDENTIFIER ::= { - * iso(1) member-body(2) us(840) ansi-X9-62(10045) keyType(2) 1 } */ -#define MBEDTLS_OID_EC_ALG_UNRESTRICTED MBEDTLS_OID_ANSI_X9_62 "\x02\01" - -/* id-ecDH OBJECT IDENTIFIER ::= { - * iso(1) identified-organization(3) certicom(132) - * schemes(1) ecdh(12) } */ -#define MBEDTLS_OID_EC_ALG_ECDH MBEDTLS_OID_CERTICOM "\x01\x0c" - -/* - * ECParameters namedCurve identifiers, from RFC 5480, RFC 5639, and SEC2 - */ - -/* secp192r1 OBJECT IDENTIFIER ::= { - * iso(1) member-body(2) us(840) ansi-X9-62(10045) curves(3) prime(1) 1 } */ -#define MBEDTLS_OID_EC_GRP_SECP192R1 MBEDTLS_OID_ANSI_X9_62 "\x03\x01\x01" - -/* secp224r1 OBJECT IDENTIFIER ::= { - * iso(1) identified-organization(3) certicom(132) curve(0) 33 } */ -#define MBEDTLS_OID_EC_GRP_SECP224R1 MBEDTLS_OID_CERTICOM "\x00\x21" - -/* secp256r1 OBJECT IDENTIFIER ::= { - * iso(1) member-body(2) us(840) ansi-X9-62(10045) curves(3) prime(1) 7 } */ -#define MBEDTLS_OID_EC_GRP_SECP256R1 MBEDTLS_OID_ANSI_X9_62 "\x03\x01\x07" - -/* secp384r1 OBJECT IDENTIFIER ::= { - * iso(1) identified-organization(3) certicom(132) curve(0) 34 } */ -#define MBEDTLS_OID_EC_GRP_SECP384R1 MBEDTLS_OID_CERTICOM "\x00\x22" - -/* secp521r1 OBJECT IDENTIFIER ::= { - * iso(1) identified-organization(3) certicom(132) curve(0) 35 } */ -#define MBEDTLS_OID_EC_GRP_SECP521R1 MBEDTLS_OID_CERTICOM "\x00\x23" - -/* secp192k1 OBJECT IDENTIFIER ::= { - * iso(1) identified-organization(3) certicom(132) curve(0) 31 } */ -#define MBEDTLS_OID_EC_GRP_SECP192K1 MBEDTLS_OID_CERTICOM "\x00\x1f" - -/* secp224k1 OBJECT IDENTIFIER ::= { - * iso(1) identified-organization(3) certicom(132) curve(0) 32 } */ -#define MBEDTLS_OID_EC_GRP_SECP224K1 MBEDTLS_OID_CERTICOM "\x00\x20" - -/* secp256k1 OBJECT IDENTIFIER ::= { - * iso(1) identified-organization(3) certicom(132) curve(0) 10 } */ -#define MBEDTLS_OID_EC_GRP_SECP256K1 MBEDTLS_OID_CERTICOM "\x00\x0a" - -/* RFC 5639 4.1 - * ecStdCurvesAndGeneration OBJECT IDENTIFIER::= {iso(1) - * identified-organization(3) teletrust(36) algorithm(3) signature- - * algorithm(3) ecSign(2) 8} - * ellipticCurve OBJECT IDENTIFIER ::= {ecStdCurvesAndGeneration 1} - * versionOne OBJECT IDENTIFIER ::= {ellipticCurve 1} */ -#define MBEDTLS_OID_EC_BRAINPOOL_V1 MBEDTLS_OID_TELETRUST "\x03\x03\x02\x08\x01\x01" - -/* brainpoolP256r1 OBJECT IDENTIFIER ::= {versionOne 7} */ -#define MBEDTLS_OID_EC_GRP_BP256R1 MBEDTLS_OID_EC_BRAINPOOL_V1 "\x07" - -/* brainpoolP384r1 OBJECT IDENTIFIER ::= {versionOne 11} */ -#define MBEDTLS_OID_EC_GRP_BP384R1 MBEDTLS_OID_EC_BRAINPOOL_V1 "\x0B" - -/* brainpoolP512r1 OBJECT IDENTIFIER ::= {versionOne 13} */ -#define MBEDTLS_OID_EC_GRP_BP512R1 MBEDTLS_OID_EC_BRAINPOOL_V1 "\x0D" - -/* - * SEC1 C.1 - * - * prime-field OBJECT IDENTIFIER ::= { id-fieldType 1 } - * id-fieldType OBJECT IDENTIFIER ::= { ansi-X9-62 fieldType(1)} - */ -#define MBEDTLS_OID_ANSI_X9_62_FIELD_TYPE MBEDTLS_OID_ANSI_X9_62 "\x01" -#define MBEDTLS_OID_ANSI_X9_62_PRIME_FIELD MBEDTLS_OID_ANSI_X9_62_FIELD_TYPE "\x01" - -/* - * ECDSA signature identifiers, from RFC 5480 - */ -#define MBEDTLS_OID_ANSI_X9_62_SIG MBEDTLS_OID_ANSI_X9_62 "\x04" /* signatures(4) */ -#define MBEDTLS_OID_ANSI_X9_62_SIG_SHA2 MBEDTLS_OID_ANSI_X9_62_SIG "\x03" /* ecdsa-with-SHA2(3) */ - -/* ecdsa-with-SHA1 OBJECT IDENTIFIER ::= { - * iso(1) member-body(2) us(840) ansi-X9-62(10045) signatures(4) 1 } */ -#define MBEDTLS_OID_ECDSA_SHA1 MBEDTLS_OID_ANSI_X9_62_SIG "\x01" - -/* ecdsa-with-SHA224 OBJECT IDENTIFIER ::= { - * iso(1) member-body(2) us(840) ansi-X9-62(10045) signatures(4) - * ecdsa-with-SHA2(3) 1 } */ -#define MBEDTLS_OID_ECDSA_SHA224 MBEDTLS_OID_ANSI_X9_62_SIG_SHA2 "\x01" - -/* ecdsa-with-SHA256 OBJECT IDENTIFIER ::= { - * iso(1) member-body(2) us(840) ansi-X9-62(10045) signatures(4) - * ecdsa-with-SHA2(3) 2 } */ -#define MBEDTLS_OID_ECDSA_SHA256 MBEDTLS_OID_ANSI_X9_62_SIG_SHA2 "\x02" - -/* ecdsa-with-SHA384 OBJECT IDENTIFIER ::= { - * iso(1) member-body(2) us(840) ansi-X9-62(10045) signatures(4) - * ecdsa-with-SHA2(3) 3 } */ -#define MBEDTLS_OID_ECDSA_SHA384 MBEDTLS_OID_ANSI_X9_62_SIG_SHA2 "\x03" - -/* ecdsa-with-SHA512 OBJECT IDENTIFIER ::= { - * iso(1) member-body(2) us(840) ansi-X9-62(10045) signatures(4) - * ecdsa-with-SHA2(3) 4 } */ -#define MBEDTLS_OID_ECDSA_SHA512 MBEDTLS_OID_ANSI_X9_62_SIG_SHA2 "\x04" - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * \brief Base OID descriptor structure - */ -typedef struct { - const char *asn1; /*!< OID ASN.1 representation */ - size_t asn1_len; /*!< length of asn1 */ - const char *name; /*!< official name (e.g. from RFC) */ - const char *description; /*!< human friendly description */ -} mbedtls_oid_descriptor_t; - -/** - * \brief Translate an ASN.1 OID into its numeric representation - * (e.g. "\x2A\x86\x48\x86\xF7\x0D" into "1.2.840.113549") - * - * \param buf buffer to put representation in - * \param size size of the buffer - * \param oid OID to translate - * - * \return Length of the string written (excluding final NULL) or - * MBEDTLS_ERR_OID_BUF_TOO_SMALL in case of error - */ -int mbedtls_oid_get_numeric_string( char *buf, size_t size, const mbedtls_asn1_buf *oid ); - -#if defined(MBEDTLS_X509_USE_C) || defined(MBEDTLS_X509_CREATE_C) -/** - * \brief Translate an X.509 extension OID into local values - * - * \param oid OID to use - * \param ext_type place to store the extension type - * - * \return 0 if successful, or MBEDTLS_ERR_OID_NOT_FOUND - */ -int mbedtls_oid_get_x509_ext_type( const mbedtls_asn1_buf *oid, int *ext_type ); -#endif - -/** - * \brief Translate an X.509 attribute type OID into the short name - * (e.g. the OID for an X520 Common Name into "CN") - * - * \param oid OID to use - * \param short_name place to store the string pointer - * - * \return 0 if successful, or MBEDTLS_ERR_OID_NOT_FOUND - */ -int mbedtls_oid_get_attr_short_name( const mbedtls_asn1_buf *oid, const char **short_name ); - -/** - * \brief Translate PublicKeyAlgorithm OID into pk_type - * - * \param oid OID to use - * \param pk_alg place to store public key algorithm - * - * \return 0 if successful, or MBEDTLS_ERR_OID_NOT_FOUND - */ -int mbedtls_oid_get_pk_alg( const mbedtls_asn1_buf *oid, mbedtls_pk_type_t *pk_alg ); - -/** - * \brief Translate pk_type into PublicKeyAlgorithm OID - * - * \param pk_alg Public key type to look for - * \param oid place to store ASN.1 OID string pointer - * \param olen length of the OID - * - * \return 0 if successful, or MBEDTLS_ERR_OID_NOT_FOUND - */ -int mbedtls_oid_get_oid_by_pk_alg( mbedtls_pk_type_t pk_alg, - const char **oid, size_t *olen ); - -#if defined(MBEDTLS_ECP_C) -/** - * \brief Translate NamedCurve OID into an EC group identifier - * - * \param oid OID to use - * \param grp_id place to store group id - * - * \return 0 if successful, or MBEDTLS_ERR_OID_NOT_FOUND - */ -int mbedtls_oid_get_ec_grp( const mbedtls_asn1_buf *oid, mbedtls_ecp_group_id *grp_id ); - -/** - * \brief Translate EC group identifier into NamedCurve OID - * - * \param grp_id EC group identifier - * \param oid place to store ASN.1 OID string pointer - * \param olen length of the OID - * - * \return 0 if successful, or MBEDTLS_ERR_OID_NOT_FOUND - */ -int mbedtls_oid_get_oid_by_ec_grp( mbedtls_ecp_group_id grp_id, - const char **oid, size_t *olen ); -#endif /* MBEDTLS_ECP_C */ - -#if defined(MBEDTLS_MD_C) -/** - * \brief Translate SignatureAlgorithm OID into md_type and pk_type - * - * \param oid OID to use - * \param md_alg place to store message digest algorithm - * \param pk_alg place to store public key algorithm - * - * \return 0 if successful, or MBEDTLS_ERR_OID_NOT_FOUND - */ -int mbedtls_oid_get_sig_alg( const mbedtls_asn1_buf *oid, - mbedtls_md_type_t *md_alg, mbedtls_pk_type_t *pk_alg ); - -/** - * \brief Translate SignatureAlgorithm OID into description - * - * \param oid OID to use - * \param desc place to store string pointer - * - * \return 0 if successful, or MBEDTLS_ERR_OID_NOT_FOUND - */ -int mbedtls_oid_get_sig_alg_desc( const mbedtls_asn1_buf *oid, const char **desc ); - -/** - * \brief Translate md_type and pk_type into SignatureAlgorithm OID - * - * \param md_alg message digest algorithm - * \param pk_alg public key algorithm - * \param oid place to store ASN.1 OID string pointer - * \param olen length of the OID - * - * \return 0 if successful, or MBEDTLS_ERR_OID_NOT_FOUND - */ -int mbedtls_oid_get_oid_by_sig_alg( mbedtls_pk_type_t pk_alg, mbedtls_md_type_t md_alg, - const char **oid, size_t *olen ); - -/** - * \brief Translate hash algorithm OID into md_type - * - * \param oid OID to use - * \param md_alg place to store message digest algorithm - * - * \return 0 if successful, or MBEDTLS_ERR_OID_NOT_FOUND - */ -int mbedtls_oid_get_md_alg( const mbedtls_asn1_buf *oid, mbedtls_md_type_t *md_alg ); -#endif /* MBEDTLS_MD_C */ - -/** - * \brief Translate Extended Key Usage OID into description - * - * \param oid OID to use - * \param desc place to store string pointer - * - * \return 0 if successful, or MBEDTLS_ERR_OID_NOT_FOUND - */ -int mbedtls_oid_get_extended_key_usage( const mbedtls_asn1_buf *oid, const char **desc ); - -/** - * \brief Translate md_type into hash algorithm OID - * - * \param md_alg message digest algorithm - * \param oid place to store ASN.1 OID string pointer - * \param olen length of the OID - * - * \return 0 if successful, or MBEDTLS_ERR_OID_NOT_FOUND - */ -int mbedtls_oid_get_oid_by_md( mbedtls_md_type_t md_alg, const char **oid, size_t *olen ); - -#if defined(MBEDTLS_CIPHER_C) -/** - * \brief Translate encryption algorithm OID into cipher_type - * - * \param oid OID to use - * \param cipher_alg place to store cipher algorithm - * - * \return 0 if successful, or MBEDTLS_ERR_OID_NOT_FOUND - */ -int mbedtls_oid_get_cipher_alg( const mbedtls_asn1_buf *oid, mbedtls_cipher_type_t *cipher_alg ); -#endif /* MBEDTLS_CIPHER_C */ - -#if defined(MBEDTLS_PKCS12_C) -/** - * \brief Translate PKCS#12 PBE algorithm OID into md_type and - * cipher_type - * - * \param oid OID to use - * \param md_alg place to store message digest algorithm - * \param cipher_alg place to store cipher algorithm - * - * \return 0 if successful, or MBEDTLS_ERR_OID_NOT_FOUND - */ -int mbedtls_oid_get_pkcs12_pbe_alg( const mbedtls_asn1_buf *oid, mbedtls_md_type_t *md_alg, - mbedtls_cipher_type_t *cipher_alg ); -#endif /* MBEDTLS_PKCS12_C */ - -#ifdef __cplusplus -} -#endif - -#endif /* oid.h */ diff --git a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/padlock.h b/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/padlock.h deleted file mode 100644 index 2045a5ab..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/padlock.h +++ /dev/null @@ -1,107 +0,0 @@ -/** - * \file padlock.h - * - * \brief VIA PadLock ACE for HW encryption/decryption supported by some - * processors - * - * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * This file is part of mbed TLS (https://tls.mbed.org) - */ -#ifndef MBEDTLS_PADLOCK_H -#define MBEDTLS_PADLOCK_H - -#include "aes.h" - -#define MBEDTLS_ERR_PADLOCK_DATA_MISALIGNED -0x0030 /**< Input data should be aligned. */ - -#if defined(__has_feature) -#if __has_feature(address_sanitizer) -#define MBEDTLS_HAVE_ASAN -#endif -#endif - -/* Some versions of ASan result in errors about not enough registers */ -#if defined(MBEDTLS_HAVE_ASM) && defined(__GNUC__) && defined(__i386__) && \ - !defined(MBEDTLS_HAVE_ASAN) - -#ifndef MBEDTLS_HAVE_X86 -#define MBEDTLS_HAVE_X86 -#endif - -#include - -#define MBEDTLS_PADLOCK_RNG 0x000C -#define MBEDTLS_PADLOCK_ACE 0x00C0 -#define MBEDTLS_PADLOCK_PHE 0x0C00 -#define MBEDTLS_PADLOCK_PMM 0x3000 - -#define MBEDTLS_PADLOCK_ALIGN16(x) (uint32_t *) (16 + ((int32_t) x & ~15)) - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * \brief PadLock detection routine - * - * \param feature The feature to detect - * - * \return 1 if CPU has support for the feature, 0 otherwise - */ -int mbedtls_padlock_has_support( int feature ); - -/** - * \brief PadLock AES-ECB block en(de)cryption - * - * \param ctx AES context - * \param mode MBEDTLS_AES_ENCRYPT or MBEDTLS_AES_DECRYPT - * \param input 16-byte input block - * \param output 16-byte output block - * - * \return 0 if success, 1 if operation failed - */ -int mbedtls_padlock_xcryptecb( mbedtls_aes_context *ctx, - int mode, - const unsigned char input[16], - unsigned char output[16] ); - -/** - * \brief PadLock AES-CBC buffer en(de)cryption - * - * \param ctx AES context - * \param mode MBEDTLS_AES_ENCRYPT or MBEDTLS_AES_DECRYPT - * \param length length of the input data - * \param iv initialization vector (updated after use) - * \param input buffer holding the input data - * \param output buffer holding the output data - * - * \return 0 if success, 1 if operation failed - */ -int mbedtls_padlock_xcryptcbc( mbedtls_aes_context *ctx, - int mode, - size_t length, - unsigned char iv[16], - const unsigned char *input, - unsigned char *output ); - -#ifdef __cplusplus -} -#endif - -#endif /* HAVE_X86 */ - -#endif /* padlock.h */ diff --git a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/pem.h b/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/pem.h deleted file mode 100644 index 54dc02d7..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/pem.h +++ /dev/null @@ -1,129 +0,0 @@ -/** - * \file pem.h - * - * \brief Privacy Enhanced Mail (PEM) decoding - * - * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * This file is part of mbed TLS (https://tls.mbed.org) - */ -#ifndef MBEDTLS_PEM_H -#define MBEDTLS_PEM_H - -#include - -/** - * \name PEM Error codes - * These error codes are returned in case of errors reading the - * PEM data. - * \{ - */ -#define MBEDTLS_ERR_PEM_NO_HEADER_FOOTER_PRESENT -0x1080 /**< No PEM header or footer found. */ -#define MBEDTLS_ERR_PEM_INVALID_DATA -0x1100 /**< PEM string is not as expected. */ -#define MBEDTLS_ERR_PEM_ALLOC_FAILED -0x1180 /**< Failed to allocate memory. */ -#define MBEDTLS_ERR_PEM_INVALID_ENC_IV -0x1200 /**< RSA IV is not in hex-format. */ -#define MBEDTLS_ERR_PEM_UNKNOWN_ENC_ALG -0x1280 /**< Unsupported key encryption algorithm. */ -#define MBEDTLS_ERR_PEM_PASSWORD_REQUIRED -0x1300 /**< Private key password can't be empty. */ -#define MBEDTLS_ERR_PEM_PASSWORD_MISMATCH -0x1380 /**< Given private key password does not allow for correct decryption. */ -#define MBEDTLS_ERR_PEM_FEATURE_UNAVAILABLE -0x1400 /**< Unavailable feature, e.g. hashing/encryption combination. */ -#define MBEDTLS_ERR_PEM_BAD_INPUT_DATA -0x1480 /**< Bad input parameters to function. */ -/* \} name */ - -#ifdef __cplusplus -extern "C" { -#endif - -#if defined(MBEDTLS_PEM_PARSE_C) -/** - * \brief PEM context structure - */ -typedef struct -{ - unsigned char *buf; /*!< buffer for decoded data */ - size_t buflen; /*!< length of the buffer */ - unsigned char *info; /*!< buffer for extra header information */ -} -mbedtls_pem_context; - -/** - * \brief PEM context setup - * - * \param ctx context to be initialized - */ -void mbedtls_pem_init( mbedtls_pem_context *ctx ); - -/** - * \brief Read a buffer for PEM information and store the resulting - * data into the specified context buffers. - * - * \param ctx context to use - * \param header header string to seek and expect - * \param footer footer string to seek and expect - * \param data source data to look in (must be nul-terminated) - * \param pwd password for decryption (can be NULL) - * \param pwdlen length of password - * \param use_len destination for total length used (set after header is - * correctly read, so unless you get - * MBEDTLS_ERR_PEM_BAD_INPUT_DATA or - * MBEDTLS_ERR_PEM_NO_HEADER_FOOTER_PRESENT, use_len is - * the length to skip) - * - * \note Attempts to check password correctness by verifying if - * the decrypted text starts with an ASN.1 sequence of - * appropriate length - * - * \return 0 on success, or a specific PEM error code - */ -int mbedtls_pem_read_buffer( mbedtls_pem_context *ctx, const char *header, const char *footer, - const unsigned char *data, - const unsigned char *pwd, - size_t pwdlen, size_t *use_len ); - -/** - * \brief PEM context memory freeing - * - * \param ctx context to be freed - */ -void mbedtls_pem_free( mbedtls_pem_context *ctx ); -#endif /* MBEDTLS_PEM_PARSE_C */ - -#if defined(MBEDTLS_PEM_WRITE_C) -/** - * \brief Write a buffer of PEM information from a DER encoded - * buffer. - * - * \param header header string to write - * \param footer footer string to write - * \param der_data DER data to write - * \param der_len length of the DER data - * \param buf buffer to write to - * \param buf_len length of output buffer - * \param olen total length written / required (if buf_len is not enough) - * - * \return 0 on success, or a specific PEM or BASE64 error code. On - * MBEDTLS_ERR_BASE64_BUFFER_TOO_SMALL olen is the required - * size. - */ -int mbedtls_pem_write_buffer( const char *header, const char *footer, - const unsigned char *der_data, size_t der_len, - unsigned char *buf, size_t buf_len, size_t *olen ); -#endif /* MBEDTLS_PEM_WRITE_C */ - -#ifdef __cplusplus -} -#endif - -#endif /* pem.h */ diff --git a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/pk.h b/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/pk.h deleted file mode 100644 index e5e78fba..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/pk.h +++ /dev/null @@ -1,615 +0,0 @@ -/** - * \file pk.h - * - * \brief Public Key abstraction layer - * - * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * This file is part of mbed TLS (https://tls.mbed.org) - */ - -#ifndef MBEDTLS_PK_H -#define MBEDTLS_PK_H - -#if !defined(MBEDTLS_CONFIG_FILE) -#include "config.h" -#else -#include MBEDTLS_CONFIG_FILE -#endif - -#include "md.h" - -#if defined(MBEDTLS_RSA_C) -#include "rsa.h" -#endif - -#if defined(MBEDTLS_ECP_C) -#include "ecp.h" -#endif - -#if defined(MBEDTLS_ECDSA_C) -#include "ecdsa.h" -#endif - -#if ( defined(__ARMCC_VERSION) || defined(_MSC_VER) ) && \ - !defined(inline) && !defined(__cplusplus) -#define inline __inline -#endif - -#define MBEDTLS_ERR_PK_ALLOC_FAILED -0x3F80 /**< Memory allocation failed. */ -#define MBEDTLS_ERR_PK_TYPE_MISMATCH -0x3F00 /**< Type mismatch, eg attempt to encrypt with an ECDSA key */ -#define MBEDTLS_ERR_PK_BAD_INPUT_DATA -0x3E80 /**< Bad input parameters to function. */ -#define MBEDTLS_ERR_PK_FILE_IO_ERROR -0x3E00 /**< Read/write of file failed. */ -#define MBEDTLS_ERR_PK_KEY_INVALID_VERSION -0x3D80 /**< Unsupported key version */ -#define MBEDTLS_ERR_PK_KEY_INVALID_FORMAT -0x3D00 /**< Invalid key tag or value. */ -#define MBEDTLS_ERR_PK_UNKNOWN_PK_ALG -0x3C80 /**< Key algorithm is unsupported (only RSA and EC are supported). */ -#define MBEDTLS_ERR_PK_PASSWORD_REQUIRED -0x3C00 /**< Private key password can't be empty. */ -#define MBEDTLS_ERR_PK_PASSWORD_MISMATCH -0x3B80 /**< Given private key password does not allow for correct decryption. */ -#define MBEDTLS_ERR_PK_INVALID_PUBKEY -0x3B00 /**< The pubkey tag or value is invalid (only RSA and EC are supported). */ -#define MBEDTLS_ERR_PK_INVALID_ALG -0x3A80 /**< The algorithm tag or value is invalid. */ -#define MBEDTLS_ERR_PK_UNKNOWN_NAMED_CURVE -0x3A00 /**< Elliptic curve is unsupported (only NIST curves are supported). */ -#define MBEDTLS_ERR_PK_FEATURE_UNAVAILABLE -0x3980 /**< Unavailable feature, e.g. RSA disabled for RSA key. */ -#define MBEDTLS_ERR_PK_SIG_LEN_MISMATCH -0x3900 /**< The signature is valid but its length is less than expected. */ - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * \brief Public key types - */ -typedef enum { - MBEDTLS_PK_NONE=0, - MBEDTLS_PK_RSA, - MBEDTLS_PK_ECKEY, - MBEDTLS_PK_ECKEY_DH, - MBEDTLS_PK_ECDSA, - MBEDTLS_PK_RSA_ALT, - MBEDTLS_PK_RSASSA_PSS, -} mbedtls_pk_type_t; - -/** - * \brief Options for RSASSA-PSS signature verification. - * See \c mbedtls_rsa_rsassa_pss_verify_ext() - */ -typedef struct -{ - mbedtls_md_type_t mgf1_hash_id; - int expected_salt_len; - -} mbedtls_pk_rsassa_pss_options; - -/** - * \brief Types for interfacing with the debug module - */ -typedef enum -{ - MBEDTLS_PK_DEBUG_NONE = 0, - MBEDTLS_PK_DEBUG_MPI, - MBEDTLS_PK_DEBUG_ECP, -} mbedtls_pk_debug_type; - -/** - * \brief Item to send to the debug module - */ -typedef struct -{ - mbedtls_pk_debug_type type; - const char *name; - void *value; -} mbedtls_pk_debug_item; - -/** Maximum number of item send for debugging, plus 1 */ -#define MBEDTLS_PK_DEBUG_MAX_ITEMS 3 - -/** - * \brief Public key information and operations - */ -typedef struct mbedtls_pk_info_t mbedtls_pk_info_t; - -/** - * \brief Public key container - */ -typedef struct -{ - const mbedtls_pk_info_t * pk_info; /**< Public key informations */ - void * pk_ctx; /**< Underlying public key context */ -} mbedtls_pk_context; - -#if defined(MBEDTLS_RSA_C) -/** - * Quick access to an RSA context inside a PK context. - * - * \warning You must make sure the PK context actually holds an RSA context - * before using this function! - */ -static inline mbedtls_rsa_context *mbedtls_pk_rsa( const mbedtls_pk_context pk ) -{ - return( (mbedtls_rsa_context *) (pk).pk_ctx ); -} -#endif /* MBEDTLS_RSA_C */ - -#if defined(MBEDTLS_ECP_C) -/** - * Quick access to an EC context inside a PK context. - * - * \warning You must make sure the PK context actually holds an EC context - * before using this function! - */ -static inline mbedtls_ecp_keypair *mbedtls_pk_ec( const mbedtls_pk_context pk ) -{ - return( (mbedtls_ecp_keypair *) (pk).pk_ctx ); -} -#endif /* MBEDTLS_ECP_C */ - -#if defined(MBEDTLS_PK_RSA_ALT_SUPPORT) -/** - * \brief Types for RSA-alt abstraction - */ -typedef int (*mbedtls_pk_rsa_alt_decrypt_func)( void *ctx, int mode, size_t *olen, - const unsigned char *input, unsigned char *output, - size_t output_max_len ); -typedef int (*mbedtls_pk_rsa_alt_sign_func)( void *ctx, - int (*f_rng)(void *, unsigned char *, size_t), void *p_rng, - int mode, mbedtls_md_type_t md_alg, unsigned int hashlen, - const unsigned char *hash, unsigned char *sig ); -typedef size_t (*mbedtls_pk_rsa_alt_key_len_func)( void *ctx ); -#endif /* MBEDTLS_PK_RSA_ALT_SUPPORT */ - -/** - * \brief Return information associated with the given PK type - * - * \param pk_type PK type to search for. - * - * \return The PK info associated with the type or NULL if not found. - */ -const mbedtls_pk_info_t *mbedtls_pk_info_from_type( mbedtls_pk_type_t pk_type ); - -/** - * \brief Initialize a mbedtls_pk_context (as NONE) - */ -void mbedtls_pk_init( mbedtls_pk_context *ctx ); - -/** - * \brief Free a mbedtls_pk_context - */ -void mbedtls_pk_free( mbedtls_pk_context *ctx ); - -/** - * \brief Initialize a PK context with the information given - * and allocates the type-specific PK subcontext. - * - * \param ctx Context to initialize. Must be empty (type NONE). - * \param info Information to use - * - * \return 0 on success, - * MBEDTLS_ERR_PK_BAD_INPUT_DATA on invalid input, - * MBEDTLS_ERR_PK_ALLOC_FAILED on allocation failure. - * - * \note For contexts holding an RSA-alt key, use - * \c mbedtls_pk_setup_rsa_alt() instead. - */ -int mbedtls_pk_setup( mbedtls_pk_context *ctx, const mbedtls_pk_info_t *info ); - -#if defined(MBEDTLS_PK_RSA_ALT_SUPPORT) -/** - * \brief Initialize an RSA-alt context - * - * \param ctx Context to initialize. Must be empty (type NONE). - * \param key RSA key pointer - * \param decrypt_func Decryption function - * \param sign_func Signing function - * \param key_len_func Function returning key length in bytes - * - * \return 0 on success, or MBEDTLS_ERR_PK_BAD_INPUT_DATA if the - * context wasn't already initialized as RSA_ALT. - * - * \note This function replaces \c mbedtls_pk_setup() for RSA-alt. - */ -int mbedtls_pk_setup_rsa_alt( mbedtls_pk_context *ctx, void * key, - mbedtls_pk_rsa_alt_decrypt_func decrypt_func, - mbedtls_pk_rsa_alt_sign_func sign_func, - mbedtls_pk_rsa_alt_key_len_func key_len_func ); -#endif /* MBEDTLS_PK_RSA_ALT_SUPPORT */ - -/** - * \brief Get the size in bits of the underlying key - * - * \param ctx Context to use - * - * \return Key size in bits, or 0 on error - */ -size_t mbedtls_pk_get_bitlen( const mbedtls_pk_context *ctx ); - -/** - * \brief Get the length in bytes of the underlying key - * \param ctx Context to use - * - * \return Key length in bytes, or 0 on error - */ -static inline size_t mbedtls_pk_get_len( const mbedtls_pk_context *ctx ) -{ - return( ( mbedtls_pk_get_bitlen( ctx ) + 7 ) / 8 ); -} - -/** - * \brief Tell if a context can do the operation given by type - * - * \param ctx Context to test - * \param type Target type - * - * \return 0 if context can't do the operations, - * 1 otherwise. - */ -int mbedtls_pk_can_do( const mbedtls_pk_context *ctx, mbedtls_pk_type_t type ); - -/** - * \brief Verify signature (including padding if relevant). - * - * \param ctx PK context to use - * \param md_alg Hash algorithm used (see notes) - * \param hash Hash of the message to sign - * \param hash_len Hash length or 0 (see notes) - * \param sig Signature to verify - * \param sig_len Signature length - * - * \return 0 on success (signature is valid), - * MBEDTLS_ERR_PK_SIG_LEN_MISMATCH if the signature is - * valid but its actual length is less than sig_len, - * or a specific error code. - * - * \note For RSA keys, the default padding type is PKCS#1 v1.5. - * Use \c mbedtls_pk_verify_ext( MBEDTLS_PK_RSASSA_PSS, ... ) - * to verify RSASSA_PSS signatures. - * - * \note If hash_len is 0, then the length associated with md_alg - * is used instead, or an error returned if it is invalid. - * - * \note md_alg may be MBEDTLS_MD_NONE, only if hash_len != 0 - */ -int mbedtls_pk_verify( mbedtls_pk_context *ctx, mbedtls_md_type_t md_alg, - const unsigned char *hash, size_t hash_len, - const unsigned char *sig, size_t sig_len ); - -/** - * \brief Verify signature, with options. - * (Includes verification of the padding depending on type.) - * - * \param type Signature type (inc. possible padding type) to verify - * \param options Pointer to type-specific options, or NULL - * \param ctx PK context to use - * \param md_alg Hash algorithm used (see notes) - * \param hash Hash of the message to sign - * \param hash_len Hash length or 0 (see notes) - * \param sig Signature to verify - * \param sig_len Signature length - * - * \return 0 on success (signature is valid), - * MBEDTLS_ERR_PK_TYPE_MISMATCH if the PK context can't be - * used for this type of signatures, - * MBEDTLS_ERR_PK_SIG_LEN_MISMATCH if the signature is - * valid but its actual length is less than sig_len, - * or a specific error code. - * - * \note If hash_len is 0, then the length associated with md_alg - * is used instead, or an error returned if it is invalid. - * - * \note md_alg may be MBEDTLS_MD_NONE, only if hash_len != 0 - * - * \note If type is MBEDTLS_PK_RSASSA_PSS, then options must point - * to a mbedtls_pk_rsassa_pss_options structure, - * otherwise it must be NULL. - */ -int mbedtls_pk_verify_ext( mbedtls_pk_type_t type, const void *options, - mbedtls_pk_context *ctx, mbedtls_md_type_t md_alg, - const unsigned char *hash, size_t hash_len, - const unsigned char *sig, size_t sig_len ); - -/** - * \brief Make signature, including padding if relevant. - * - * \param ctx PK context to use - * \param md_alg Hash algorithm used (see notes) - * \param hash Hash of the message to sign - * \param hash_len Hash length or 0 (see notes) - * \param sig Place to write the signature - * \param sig_len Number of bytes written - * \param f_rng RNG function - * \param p_rng RNG parameter - * - * \return 0 on success, or a specific error code. - * - * \note For RSA keys, the default padding type is PKCS#1 v1.5. - * There is no interface in the PK module to make RSASSA-PSS - * signatures yet. - * - * \note If hash_len is 0, then the length associated with md_alg - * is used instead, or an error returned if it is invalid. - * - * \note For RSA, md_alg may be MBEDTLS_MD_NONE if hash_len != 0. - * For ECDSA, md_alg may never be MBEDTLS_MD_NONE. - */ -int mbedtls_pk_sign( mbedtls_pk_context *ctx, mbedtls_md_type_t md_alg, - const unsigned char *hash, size_t hash_len, - unsigned char *sig, size_t *sig_len, - int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ); - -/** - * \brief Decrypt message (including padding if relevant). - * - * \param ctx PK context to use - * \param input Input to decrypt - * \param ilen Input size - * \param output Decrypted output - * \param olen Decrypted message length - * \param osize Size of the output buffer - * \param f_rng RNG function - * \param p_rng RNG parameter - * - * \note For RSA keys, the default padding type is PKCS#1 v1.5. - * - * \return 0 on success, or a specific error code. - */ -int mbedtls_pk_decrypt( mbedtls_pk_context *ctx, - const unsigned char *input, size_t ilen, - unsigned char *output, size_t *olen, size_t osize, - int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ); - -/** - * \brief Encrypt message (including padding if relevant). - * - * \param ctx PK context to use - * \param input Message to encrypt - * \param ilen Message size - * \param output Encrypted output - * \param olen Encrypted output length - * \param osize Size of the output buffer - * \param f_rng RNG function - * \param p_rng RNG parameter - * - * \note For RSA keys, the default padding type is PKCS#1 v1.5. - * - * \return 0 on success, or a specific error code. - */ -int mbedtls_pk_encrypt( mbedtls_pk_context *ctx, - const unsigned char *input, size_t ilen, - unsigned char *output, size_t *olen, size_t osize, - int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ); - -/** - * \brief Check if a public-private pair of keys matches. - * - * \param pub Context holding a public key. - * \param prv Context holding a private (and public) key. - * - * \return 0 on success or MBEDTLS_ERR_PK_BAD_INPUT_DATA - */ -int mbedtls_pk_check_pair( const mbedtls_pk_context *pub, const mbedtls_pk_context *prv ); - -/** - * \brief Export debug information - * - * \param ctx Context to use - * \param items Place to write debug items - * - * \return 0 on success or MBEDTLS_ERR_PK_BAD_INPUT_DATA - */ -int mbedtls_pk_debug( const mbedtls_pk_context *ctx, mbedtls_pk_debug_item *items ); - -/** - * \brief Access the type name - * - * \param ctx Context to use - * - * \return Type name on success, or "invalid PK" - */ -const char * mbedtls_pk_get_name( const mbedtls_pk_context *ctx ); - -/** - * \brief Get the key type - * - * \param ctx Context to use - * - * \return Type on success, or MBEDTLS_PK_NONE - */ -mbedtls_pk_type_t mbedtls_pk_get_type( const mbedtls_pk_context *ctx ); - -#if defined(MBEDTLS_PK_PARSE_C) -/** \ingroup pk_module */ -/** - * \brief Parse a private key in PEM or DER format - * - * \param ctx key to be initialized - * \param key input buffer - * \param keylen size of the buffer - * (including the terminating null byte for PEM data) - * \param pwd password for decryption (optional) - * \param pwdlen size of the password - * - * \note On entry, ctx must be empty, either freshly initialised - * with mbedtls_pk_init() or reset with mbedtls_pk_free(). If you need a - * specific key type, check the result with mbedtls_pk_can_do(). - * - * \note The key is also checked for correctness. - * - * \return 0 if successful, or a specific PK or PEM error code - */ -int mbedtls_pk_parse_key( mbedtls_pk_context *ctx, - const unsigned char *key, size_t keylen, - const unsigned char *pwd, size_t pwdlen ); - -/** \ingroup pk_module */ -/** - * \brief Parse a public key in PEM or DER format - * - * \param ctx key to be initialized - * \param key input buffer - * \param keylen size of the buffer - * (including the terminating null byte for PEM data) - * - * \note On entry, ctx must be empty, either freshly initialised - * with mbedtls_pk_init() or reset with mbedtls_pk_free(). If you need a - * specific key type, check the result with mbedtls_pk_can_do(). - * - * \note The key is also checked for correctness. - * - * \return 0 if successful, or a specific PK or PEM error code - */ -int mbedtls_pk_parse_public_key( mbedtls_pk_context *ctx, - const unsigned char *key, size_t keylen ); - -#if defined(MBEDTLS_FS_IO) -/** \ingroup pk_module */ -/** - * \brief Load and parse a private key - * - * \param ctx key to be initialized - * \param path filename to read the private key from - * \param password password to decrypt the file (can be NULL) - * - * \note On entry, ctx must be empty, either freshly initialised - * with mbedtls_pk_init() or reset with mbedtls_pk_free(). If you need a - * specific key type, check the result with mbedtls_pk_can_do(). - * - * \note The key is also checked for correctness. - * - * \return 0 if successful, or a specific PK or PEM error code - */ -int mbedtls_pk_parse_keyfile( mbedtls_pk_context *ctx, - const char *path, const char *password ); - -/** \ingroup pk_module */ -/** - * \brief Load and parse a public key - * - * \param ctx key to be initialized - * \param path filename to read the private key from - * - * \note On entry, ctx must be empty, either freshly initialised - * with mbedtls_pk_init() or reset with mbedtls_pk_free(). If you need a - * specific key type, check the result with mbedtls_pk_can_do(). - * - * \note The key is also checked for correctness. - * - * \return 0 if successful, or a specific PK or PEM error code - */ -int mbedtls_pk_parse_public_keyfile( mbedtls_pk_context *ctx, const char *path ); -#endif /* MBEDTLS_FS_IO */ -#endif /* MBEDTLS_PK_PARSE_C */ - -#if defined(MBEDTLS_PK_WRITE_C) -/** - * \brief Write a private key to a PKCS#1 or SEC1 DER structure - * Note: data is written at the end of the buffer! Use the - * return value to determine where you should start - * using the buffer - * - * \param ctx private to write away - * \param buf buffer to write to - * \param size size of the buffer - * - * \return length of data written if successful, or a specific - * error code - */ -int mbedtls_pk_write_key_der( mbedtls_pk_context *ctx, unsigned char *buf, size_t size ); - -/** - * \brief Write a public key to a SubjectPublicKeyInfo DER structure - * Note: data is written at the end of the buffer! Use the - * return value to determine where you should start - * using the buffer - * - * \param ctx public key to write away - * \param buf buffer to write to - * \param size size of the buffer - * - * \return length of data written if successful, or a specific - * error code - */ -int mbedtls_pk_write_pubkey_der( mbedtls_pk_context *ctx, unsigned char *buf, size_t size ); - -#if defined(MBEDTLS_PEM_WRITE_C) -/** - * \brief Write a public key to a PEM string - * - * \param ctx public key to write away - * \param buf buffer to write to - * \param size size of the buffer - * - * \return 0 if successful, or a specific error code - */ -int mbedtls_pk_write_pubkey_pem( mbedtls_pk_context *ctx, unsigned char *buf, size_t size ); - -/** - * \brief Write a private key to a PKCS#1 or SEC1 PEM string - * - * \param ctx private to write away - * \param buf buffer to write to - * \param size size of the buffer - * - * \return 0 if successful, or a specific error code - */ -int mbedtls_pk_write_key_pem( mbedtls_pk_context *ctx, unsigned char *buf, size_t size ); -#endif /* MBEDTLS_PEM_WRITE_C */ -#endif /* MBEDTLS_PK_WRITE_C */ - -/* - * WARNING: Low-level functions. You probably do not want to use these unless - * you are certain you do ;) - */ - -#if defined(MBEDTLS_PK_PARSE_C) -/** - * \brief Parse a SubjectPublicKeyInfo DER structure - * - * \param p the position in the ASN.1 data - * \param end end of the buffer - * \param pk the key to fill - * - * \return 0 if successful, or a specific PK error code - */ -int mbedtls_pk_parse_subpubkey( unsigned char **p, const unsigned char *end, - mbedtls_pk_context *pk ); -#endif /* MBEDTLS_PK_PARSE_C */ - -#if defined(MBEDTLS_PK_WRITE_C) -/** - * \brief Write a subjectPublicKey to ASN.1 data - * Note: function works backwards in data buffer - * - * \param p reference to current position pointer - * \param start start of the buffer (for bounds-checking) - * \param key public key to write away - * - * \return the length written or a negative error code - */ -int mbedtls_pk_write_pubkey( unsigned char **p, unsigned char *start, - const mbedtls_pk_context *key ); -#endif /* MBEDTLS_PK_WRITE_C */ - -/* - * Internal module functions. You probably do not want to use these unless you - * know you do. - */ -#if defined(MBEDTLS_FS_IO) -int mbedtls_pk_load_file( const char *path, unsigned char **buf, size_t *n ); -#endif - -#ifdef __cplusplus -} -#endif - -#endif /* MBEDTLS_PK_H */ diff --git a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/pk_internal.h b/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/pk_internal.h deleted file mode 100644 index 01d0f214..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/pk_internal.h +++ /dev/null @@ -1,114 +0,0 @@ -/** - * \file pk.h - * - * \brief Public Key abstraction layer: wrapper functions - * - * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * This file is part of mbed TLS (https://tls.mbed.org) - */ - -#ifndef MBEDTLS_PK_WRAP_H -#define MBEDTLS_PK_WRAP_H - -#if !defined(MBEDTLS_CONFIG_FILE) -#include "config.h" -#else -#include MBEDTLS_CONFIG_FILE -#endif - -#include "pk.h" - -struct mbedtls_pk_info_t -{ - /** Public key type */ - mbedtls_pk_type_t type; - - /** Type name */ - const char *name; - - /** Get key size in bits */ - size_t (*get_bitlen)( const void * ); - - /** Tell if the context implements this type (e.g. ECKEY can do ECDSA) */ - int (*can_do)( mbedtls_pk_type_t type ); - - /** Verify signature */ - int (*verify_func)( void *ctx, mbedtls_md_type_t md_alg, - const unsigned char *hash, size_t hash_len, - const unsigned char *sig, size_t sig_len ); - - /** Make signature */ - int (*sign_func)( void *ctx, mbedtls_md_type_t md_alg, - const unsigned char *hash, size_t hash_len, - unsigned char *sig, size_t *sig_len, - int (*f_rng)(void *, unsigned char *, size_t), - void *p_rng ); - - /** Decrypt message */ - int (*decrypt_func)( void *ctx, const unsigned char *input, size_t ilen, - unsigned char *output, size_t *olen, size_t osize, - int (*f_rng)(void *, unsigned char *, size_t), - void *p_rng ); - - /** Encrypt message */ - int (*encrypt_func)( void *ctx, const unsigned char *input, size_t ilen, - unsigned char *output, size_t *olen, size_t osize, - int (*f_rng)(void *, unsigned char *, size_t), - void *p_rng ); - - /** Check public-private key pair */ - int (*check_pair_func)( const void *pub, const void *prv ); - - /** Allocate a new context */ - void * (*ctx_alloc_func)( void ); - - /** Free the given context */ - void (*ctx_free_func)( void *ctx ); - - /** Interface with the debug module */ - void (*debug_func)( const void *ctx, mbedtls_pk_debug_item *items ); - -}; -#if defined(MBEDTLS_PK_RSA_ALT_SUPPORT) -/* Container for RSA-alt */ -typedef struct -{ - void *key; - mbedtls_pk_rsa_alt_decrypt_func decrypt_func; - mbedtls_pk_rsa_alt_sign_func sign_func; - mbedtls_pk_rsa_alt_key_len_func key_len_func; -} mbedtls_rsa_alt_context; -#endif - -#if defined(MBEDTLS_RSA_C) -extern const mbedtls_pk_info_t mbedtls_rsa_info; -#endif - -#if defined(MBEDTLS_ECP_C) -extern const mbedtls_pk_info_t mbedtls_eckey_info; -extern const mbedtls_pk_info_t mbedtls_eckeydh_info; -#endif - -#if defined(MBEDTLS_ECDSA_C) -extern const mbedtls_pk_info_t mbedtls_ecdsa_info; -#endif - -#if defined(MBEDTLS_PK_RSA_ALT_SUPPORT) -extern const mbedtls_pk_info_t mbedtls_rsa_alt_info; -#endif - -#endif /* MBEDTLS_PK_WRAP_H */ diff --git a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/pkcs11.h b/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/pkcs11.h deleted file mode 100644 index 2e889281..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/pkcs11.h +++ /dev/null @@ -1,173 +0,0 @@ -/** - * \file pkcs11.h - * - * \brief Wrapper for PKCS#11 library libpkcs11-helper - * - * \author Adriaan de Jong - * - * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * This file is part of mbed TLS (https://tls.mbed.org) - */ -#ifndef MBEDTLS_PKCS11_H -#define MBEDTLS_PKCS11_H - -#if !defined(MBEDTLS_CONFIG_FILE) -#include "config.h" -#else -#include MBEDTLS_CONFIG_FILE -#endif - -#if defined(MBEDTLS_PKCS11_C) - -#include "x509_crt.h" - -#include - -#if ( defined(__ARMCC_VERSION) || defined(_MSC_VER) ) && \ - !defined(inline) && !defined(__cplusplus) -#define inline __inline -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * Context for PKCS #11 private keys. - */ -typedef struct { - pkcs11h_certificate_t pkcs11h_cert; - int len; -} mbedtls_pkcs11_context; - -/** - * Initialize a mbedtls_pkcs11_context. - * (Just making memory references valid.) - */ -void mbedtls_pkcs11_init( mbedtls_pkcs11_context *ctx ); - -/** - * Fill in a mbed TLS certificate, based on the given PKCS11 helper certificate. - * - * \param cert X.509 certificate to fill - * \param pkcs11h_cert PKCS #11 helper certificate - * - * \return 0 on success. - */ -int mbedtls_pkcs11_x509_cert_bind( mbedtls_x509_crt *cert, pkcs11h_certificate_t pkcs11h_cert ); - -/** - * Set up a mbedtls_pkcs11_context storing the given certificate. Note that the - * mbedtls_pkcs11_context will take over control of the certificate, freeing it when - * done. - * - * \param priv_key Private key structure to fill. - * \param pkcs11_cert PKCS #11 helper certificate - * - * \return 0 on success - */ -int mbedtls_pkcs11_priv_key_bind( mbedtls_pkcs11_context *priv_key, - pkcs11h_certificate_t pkcs11_cert ); - -/** - * Free the contents of the given private key context. Note that the structure - * itself is not freed. - * - * \param priv_key Private key structure to cleanup - */ -void mbedtls_pkcs11_priv_key_free( mbedtls_pkcs11_context *priv_key ); - -/** - * \brief Do an RSA private key decrypt, then remove the message - * padding - * - * \param ctx PKCS #11 context - * \param mode must be MBEDTLS_RSA_PRIVATE, for compatibility with rsa.c's signature - * \param input buffer holding the encrypted data - * \param output buffer that will hold the plaintext - * \param olen will contain the plaintext length - * \param output_max_len maximum length of the output buffer - * - * \return 0 if successful, or an MBEDTLS_ERR_RSA_XXX error code - * - * \note The output buffer must be as large as the size - * of ctx->N (eg. 128 bytes if RSA-1024 is used) otherwise - * an error is thrown. - */ -int mbedtls_pkcs11_decrypt( mbedtls_pkcs11_context *ctx, - int mode, size_t *olen, - const unsigned char *input, - unsigned char *output, - size_t output_max_len ); - -/** - * \brief Do a private RSA to sign a message digest - * - * \param ctx PKCS #11 context - * \param mode must be MBEDTLS_RSA_PRIVATE, for compatibility with rsa.c's signature - * \param md_alg a MBEDTLS_MD_XXX (use MBEDTLS_MD_NONE for signing raw data) - * \param hashlen message digest length (for MBEDTLS_MD_NONE only) - * \param hash buffer holding the message digest - * \param sig buffer that will hold the ciphertext - * - * \return 0 if the signing operation was successful, - * or an MBEDTLS_ERR_RSA_XXX error code - * - * \note The "sig" buffer must be as large as the size - * of ctx->N (eg. 128 bytes if RSA-1024 is used). - */ -int mbedtls_pkcs11_sign( mbedtls_pkcs11_context *ctx, - int mode, - mbedtls_md_type_t md_alg, - unsigned int hashlen, - const unsigned char *hash, - unsigned char *sig ); - -/** - * SSL/TLS wrappers for PKCS#11 functions - */ -static inline int mbedtls_ssl_pkcs11_decrypt( void *ctx, int mode, size_t *olen, - const unsigned char *input, unsigned char *output, - size_t output_max_len ) -{ - return mbedtls_pkcs11_decrypt( (mbedtls_pkcs11_context *) ctx, mode, olen, input, output, - output_max_len ); -} - -static inline int mbedtls_ssl_pkcs11_sign( void *ctx, - int (*f_rng)(void *, unsigned char *, size_t), void *p_rng, - int mode, mbedtls_md_type_t md_alg, unsigned int hashlen, - const unsigned char *hash, unsigned char *sig ) -{ - ((void) f_rng); - ((void) p_rng); - return mbedtls_pkcs11_sign( (mbedtls_pkcs11_context *) ctx, mode, md_alg, - hashlen, hash, sig ); -} - -static inline size_t mbedtls_ssl_pkcs11_key_len( void *ctx ) -{ - return ( (mbedtls_pkcs11_context *) ctx )->len; -} - -#ifdef __cplusplus -} -#endif - -#endif /* MBEDTLS_PKCS11_C */ - -#endif /* MBEDTLS_PKCS11_H */ diff --git a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/pkcs12.h b/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/pkcs12.h deleted file mode 100644 index 9b2d9045..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/pkcs12.h +++ /dev/null @@ -1,119 +0,0 @@ -/** - * \file pkcs12.h - * - * \brief PKCS#12 Personal Information Exchange Syntax - * - * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * This file is part of mbed TLS (https://tls.mbed.org) - */ -#ifndef MBEDTLS_PKCS12_H -#define MBEDTLS_PKCS12_H - -#include "md.h" -#include "cipher.h" -#include "asn1.h" - -#include - -#define MBEDTLS_ERR_PKCS12_BAD_INPUT_DATA -0x1F80 /**< Bad input parameters to function. */ -#define MBEDTLS_ERR_PKCS12_FEATURE_UNAVAILABLE -0x1F00 /**< Feature not available, e.g. unsupported encryption scheme. */ -#define MBEDTLS_ERR_PKCS12_PBE_INVALID_FORMAT -0x1E80 /**< PBE ASN.1 data not as expected. */ -#define MBEDTLS_ERR_PKCS12_PASSWORD_MISMATCH -0x1E00 /**< Given private key password does not allow for correct decryption. */ - -#define MBEDTLS_PKCS12_DERIVE_KEY 1 /**< encryption/decryption key */ -#define MBEDTLS_PKCS12_DERIVE_IV 2 /**< initialization vector */ -#define MBEDTLS_PKCS12_DERIVE_MAC_KEY 3 /**< integrity / MAC key */ - -#define MBEDTLS_PKCS12_PBE_DECRYPT 0 -#define MBEDTLS_PKCS12_PBE_ENCRYPT 1 - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * \brief PKCS12 Password Based function (encryption / decryption) - * for pbeWithSHAAnd128BitRC4 - * - * \param pbe_params an ASN1 buffer containing the pkcs-12PbeParams structure - * \param mode either MBEDTLS_PKCS12_PBE_ENCRYPT or MBEDTLS_PKCS12_PBE_DECRYPT - * \param pwd the password used (may be NULL if no password is used) - * \param pwdlen length of the password (may be 0) - * \param input the input data - * \param len data length - * \param output the output buffer - * - * \return 0 if successful, or a MBEDTLS_ERR_XXX code - */ -int mbedtls_pkcs12_pbe_sha1_rc4_128( mbedtls_asn1_buf *pbe_params, int mode, - const unsigned char *pwd, size_t pwdlen, - const unsigned char *input, size_t len, - unsigned char *output ); - -/** - * \brief PKCS12 Password Based function (encryption / decryption) - * for cipher-based and mbedtls_md-based PBE's - * - * \param pbe_params an ASN1 buffer containing the pkcs-12PbeParams structure - * \param mode either MBEDTLS_PKCS12_PBE_ENCRYPT or MBEDTLS_PKCS12_PBE_DECRYPT - * \param cipher_type the cipher used - * \param md_type the mbedtls_md used - * \param pwd the password used (may be NULL if no password is used) - * \param pwdlen length of the password (may be 0) - * \param input the input data - * \param len data length - * \param output the output buffer - * - * \return 0 if successful, or a MBEDTLS_ERR_XXX code - */ -int mbedtls_pkcs12_pbe( mbedtls_asn1_buf *pbe_params, int mode, - mbedtls_cipher_type_t cipher_type, mbedtls_md_type_t md_type, - const unsigned char *pwd, size_t pwdlen, - const unsigned char *input, size_t len, - unsigned char *output ); - -/** - * \brief The PKCS#12 derivation function uses a password and a salt - * to produce pseudo-random bits for a particular "purpose". - * - * Depending on the given id, this function can produce an - * encryption/decryption key, an nitialization vector or an - * integrity key. - * - * \param data buffer to store the derived data in - * \param datalen length to fill - * \param pwd password to use (may be NULL if no password is used) - * \param pwdlen length of the password (may be 0) - * \param salt salt buffer to use - * \param saltlen length of the salt - * \param mbedtls_md mbedtls_md type to use during the derivation - * \param id id that describes the purpose (can be MBEDTLS_PKCS12_DERIVE_KEY, - * MBEDTLS_PKCS12_DERIVE_IV or MBEDTLS_PKCS12_DERIVE_MAC_KEY) - * \param iterations number of iterations - * - * \return 0 if successful, or a MD, BIGNUM type error. - */ -int mbedtls_pkcs12_derivation( unsigned char *data, size_t datalen, - const unsigned char *pwd, size_t pwdlen, - const unsigned char *salt, size_t saltlen, - mbedtls_md_type_t mbedtls_md, int id, int iterations ); - -#ifdef __cplusplus -} -#endif - -#endif /* pkcs12.h */ diff --git a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/pkcs5.h b/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/pkcs5.h deleted file mode 100644 index ec5cb9e7..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/pkcs5.h +++ /dev/null @@ -1,94 +0,0 @@ -/** - * \file pkcs5.h - * - * \brief PKCS#5 functions - * - * \author Mathias Olsson - * - * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * This file is part of mbed TLS (https://tls.mbed.org) - */ -#ifndef MBEDTLS_PKCS5_H -#define MBEDTLS_PKCS5_H - -#include "asn1.h" -#include "md.h" - -#include -#include - -#define MBEDTLS_ERR_PKCS5_BAD_INPUT_DATA -0x2f80 /**< Bad input parameters to function. */ -#define MBEDTLS_ERR_PKCS5_INVALID_FORMAT -0x2f00 /**< Unexpected ASN.1 data. */ -#define MBEDTLS_ERR_PKCS5_FEATURE_UNAVAILABLE -0x2e80 /**< Requested encryption or digest alg not available. */ -#define MBEDTLS_ERR_PKCS5_PASSWORD_MISMATCH -0x2e00 /**< Given private key password does not allow for correct decryption. */ - -#define MBEDTLS_PKCS5_DECRYPT 0 -#define MBEDTLS_PKCS5_ENCRYPT 1 - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * \brief PKCS#5 PBES2 function - * - * \param pbe_params the ASN.1 algorithm parameters - * \param mode either MBEDTLS_PKCS5_DECRYPT or MBEDTLS_PKCS5_ENCRYPT - * \param pwd password to use when generating key - * \param pwdlen length of password - * \param data data to process - * \param datalen length of data - * \param output output buffer - * - * \returns 0 on success, or a MBEDTLS_ERR_XXX code if verification fails. - */ -int mbedtls_pkcs5_pbes2( const mbedtls_asn1_buf *pbe_params, int mode, - const unsigned char *pwd, size_t pwdlen, - const unsigned char *data, size_t datalen, - unsigned char *output ); - -/** - * \brief PKCS#5 PBKDF2 using HMAC - * - * \param ctx Generic HMAC context - * \param password Password to use when generating key - * \param plen Length of password - * \param salt Salt to use when generating key - * \param slen Length of salt - * \param iteration_count Iteration count - * \param key_length Length of generated key in bytes - * \param output Generated key. Must be at least as big as key_length - * - * \returns 0 on success, or a MBEDTLS_ERR_XXX code if verification fails. - */ -int mbedtls_pkcs5_pbkdf2_hmac( mbedtls_md_context_t *ctx, const unsigned char *password, - size_t plen, const unsigned char *salt, size_t slen, - unsigned int iteration_count, - uint32_t key_length, unsigned char *output ); - -/** - * \brief Checkup routine - * - * \return 0 if successful, or 1 if the test failed - */ -int mbedtls_pkcs5_self_test( int verbose ); - -#ifdef __cplusplus -} -#endif - -#endif /* pkcs5.h */ diff --git a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/platform.h b/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/platform.h deleted file mode 100644 index f71f1b64..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/platform.h +++ /dev/null @@ -1,214 +0,0 @@ -/** - * \file platform.h - * - * \brief mbed TLS Platform abstraction layer - * - * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * This file is part of mbed TLS (https://tls.mbed.org) - */ -#ifndef MBEDTLS_PLATFORM_H -#define MBEDTLS_PLATFORM_H - -#if !defined(MBEDTLS_CONFIG_FILE) -#include "config.h" -#else -#include MBEDTLS_CONFIG_FILE -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * \name SECTION: Module settings - * - * The configuration options you can set for this module are in this section. - * Either change them in config.h or define them on the compiler command line. - * \{ - */ - -#if !defined(MBEDTLS_PLATFORM_NO_STD_FUNCTIONS) -#include -#include -#if !defined(MBEDTLS_PLATFORM_STD_SNPRINTF) -#if defined(_WIN32) -#define MBEDTLS_PLATFORM_STD_SNPRINTF mbedtls_platform_win32_snprintf /**< Default snprintf to use */ -#else -#define MBEDTLS_PLATFORM_STD_SNPRINTF snprintf /**< Default snprintf to use */ -#endif -#endif -#if !defined(MBEDTLS_PLATFORM_STD_PRINTF) -#define MBEDTLS_PLATFORM_STD_PRINTF printf /**< Default printf to use */ -#endif -#if !defined(MBEDTLS_PLATFORM_STD_FPRINTF) -#define MBEDTLS_PLATFORM_STD_FPRINTF fprintf /**< Default fprintf to use */ -#endif -#if !defined(MBEDTLS_PLATFORM_STD_CALLOC) -#define MBEDTLS_PLATFORM_STD_CALLOC calloc /**< Default allocator to use */ -#endif -#if !defined(MBEDTLS_PLATFORM_STD_FREE) -#define MBEDTLS_PLATFORM_STD_FREE free /**< Default free to use */ -#endif -#if !defined(MBEDTLS_PLATFORM_STD_EXIT) -#define MBEDTLS_PLATFORM_STD_EXIT exit /**< Default free to use */ -#endif -#else /* MBEDTLS_PLATFORM_NO_STD_FUNCTIONS */ -#if defined(MBEDTLS_PLATFORM_STD_MEM_HDR) -#include MBEDTLS_PLATFORM_STD_MEM_HDR -#endif -#endif /* MBEDTLS_PLATFORM_NO_STD_FUNCTIONS */ - -/* \} name SECTION: Module settings */ - -/* - * The function pointers for calloc and free - */ -#if defined(MBEDTLS_PLATFORM_MEMORY) -#if defined(MBEDTLS_PLATFORM_FREE_MACRO) && \ - defined(MBEDTLS_PLATFORM_CALLOC_MACRO) -#define mbedtls_free MBEDTLS_PLATFORM_FREE_MACRO -#define mbedtls_calloc MBEDTLS_PLATFORM_CALLOC_MACRO -#else -/* For size_t */ -#include -extern void * (*mbedtls_calloc)( size_t n, size_t size ); -extern void (*mbedtls_free)( void *ptr ); - -/** - * \brief Set your own memory implementation function pointers - * - * \param calloc_func the calloc function implementation - * \param free_func the free function implementation - * - * \return 0 if successful - */ -int mbedtls_platform_set_calloc_free( void * (*calloc_func)( size_t, size_t ), - void (*free_func)( void * ) ); -#endif /* MBEDTLS_PLATFORM_FREE_MACRO && MBEDTLS_PLATFORM_CALLOC_MACRO */ -#else /* !MBEDTLS_PLATFORM_MEMORY */ -#define mbedtls_free free -#define mbedtls_calloc calloc -#endif /* MBEDTLS_PLATFORM_MEMORY && !MBEDTLS_PLATFORM_{FREE,CALLOC}_MACRO */ - -/* - * The function pointers for fprintf - */ -#if defined(MBEDTLS_PLATFORM_FPRINTF_ALT) -/* We need FILE * */ -#include -extern int (*mbedtls_fprintf)( FILE *stream, const char *format, ... ); - -/** - * \brief Set your own fprintf function pointer - * - * \param fprintf_func the fprintf function implementation - * - * \return 0 - */ -int mbedtls_platform_set_fprintf( int (*fprintf_func)( FILE *stream, const char *, - ... ) ); -#else -#if defined(MBEDTLS_PLATFORM_FPRINTF_MACRO) -#define mbedtls_fprintf MBEDTLS_PLATFORM_FPRINTF_MACRO -#else -#define mbedtls_fprintf fprintf -#endif /* MBEDTLS_PLATFORM_FPRINTF_MACRO */ -#endif /* MBEDTLS_PLATFORM_FPRINTF_ALT */ - -/* - * The function pointers for printf - */ -#if defined(MBEDTLS_PLATFORM_PRINTF_ALT) -extern int (*mbedtls_printf)( const char *format, ... ); - -/** - * \brief Set your own printf function pointer - * - * \param printf_func the printf function implementation - * - * \return 0 - */ -int mbedtls_platform_set_printf( int (*printf_func)( const char *, ... ) ); -#else /* !MBEDTLS_PLATFORM_PRINTF_ALT */ -#if defined(MBEDTLS_PLATFORM_PRINTF_MACRO) -#define mbedtls_printf MBEDTLS_PLATFORM_PRINTF_MACRO -#else -#define mbedtls_printf printf -#endif /* MBEDTLS_PLATFORM_PRINTF_MACRO */ -#endif /* MBEDTLS_PLATFORM_PRINTF_ALT */ - -/* - * The function pointers for snprintf - * - * The snprintf implementation should conform to C99: - * - it *must* always correctly zero-terminate the buffer - * (except when n == 0, then it must leave the buffer untouched) - * - however it is acceptable to return -1 instead of the required length when - * the destination buffer is too short. - */ -#if defined(_WIN32) -/* For Windows (inc. MSYS2), we provide our own fixed implementation */ -int mbedtls_platform_win32_snprintf( char *s, size_t n, const char *fmt, ... ); -#endif - -#if defined(MBEDTLS_PLATFORM_SNPRINTF_ALT) -extern int (*mbedtls_snprintf)( char * s, size_t n, const char * format, ... ); - -/** - * \brief Set your own snprintf function pointer - * - * \param snprintf_func the snprintf function implementation - * - * \return 0 - */ -int mbedtls_platform_set_snprintf( int (*snprintf_func)( char * s, size_t n, - const char * format, ... ) ); -#else /* MBEDTLS_PLATFORM_SNPRINTF_ALT */ -#if defined(MBEDTLS_PLATFORM_SNPRINTF_MACRO) -#define mbedtls_snprintf MBEDTLS_PLATFORM_SNPRINTF_MACRO -#else -#define mbedtls_snprintf snprintf -#endif /* MBEDTLS_PLATFORM_SNPRINTF_MACRO */ -#endif /* MBEDTLS_PLATFORM_SNPRINTF_ALT */ - -/* - * The function pointers for exit - */ -#if defined(MBEDTLS_PLATFORM_EXIT_ALT) -extern void (*mbedtls_exit)( int status ); - -/** - * \brief Set your own exit function pointer - * - * \param exit_func the exit function implementation - * - * \return 0 - */ -int mbedtls_platform_set_exit( void (*exit_func)( int status ) ); -#else -#if defined(MBEDTLS_PLATFORM_EXIT_MACRO) -#define mbedtls_exit MBEDTLS_PLATFORM_EXIT_MACRO -#else -#define mbedtls_exit exit -#endif /* MBEDTLS_PLATFORM_EXIT_MACRO */ -#endif /* MBEDTLS_PLATFORM_EXIT_ALT */ - -#ifdef __cplusplus -} -#endif - -#endif /* platform.h */ diff --git a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/ripemd160.h b/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/ripemd160.h deleted file mode 100644 index a92d3844..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/ripemd160.h +++ /dev/null @@ -1,138 +0,0 @@ -/** - * \file mbedtls_ripemd160.h - * - * \brief RIPE MD-160 message digest - * - * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * This file is part of mbed TLS (https://tls.mbed.org) - */ -#ifndef MBEDTLS_RIPEMD160_H -#define MBEDTLS_RIPEMD160_H - -#if !defined(MBEDTLS_CONFIG_FILE) -#include "config.h" -#else -#include MBEDTLS_CONFIG_FILE -#endif - -#include -#include - -#if !defined(MBEDTLS_RIPEMD160_ALT) -// Regular implementation -// - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * \brief RIPEMD-160 context structure - */ -typedef struct -{ - uint32_t total[2]; /*!< number of bytes processed */ - uint32_t state[5]; /*!< intermediate digest state */ - unsigned char buffer[64]; /*!< data block being processed */ -} -mbedtls_ripemd160_context; - -/** - * \brief Initialize RIPEMD-160 context - * - * \param ctx RIPEMD-160 context to be initialized - */ -void mbedtls_ripemd160_init( mbedtls_ripemd160_context *ctx ); - -/** - * \brief Clear RIPEMD-160 context - * - * \param ctx RIPEMD-160 context to be cleared - */ -void mbedtls_ripemd160_free( mbedtls_ripemd160_context *ctx ); - -/** - * \brief Clone (the state of) an RIPEMD-160 context - * - * \param dst The destination context - * \param src The context to be cloned - */ -void mbedtls_ripemd160_clone( mbedtls_ripemd160_context *dst, - const mbedtls_ripemd160_context *src ); - -/** - * \brief RIPEMD-160 context setup - * - * \param ctx context to be initialized - */ -void mbedtls_ripemd160_starts( mbedtls_ripemd160_context *ctx ); - -/** - * \brief RIPEMD-160 process buffer - * - * \param ctx RIPEMD-160 context - * \param input buffer holding the data - * \param ilen length of the input data - */ -void mbedtls_ripemd160_update( mbedtls_ripemd160_context *ctx, - const unsigned char *input, size_t ilen ); - -/** - * \brief RIPEMD-160 final digest - * - * \param ctx RIPEMD-160 context - * \param output RIPEMD-160 checksum result - */ -void mbedtls_ripemd160_finish( mbedtls_ripemd160_context *ctx, unsigned char output[20] ); - -/* Internal use */ -void mbedtls_ripemd160_process( mbedtls_ripemd160_context *ctx, const unsigned char data[64] ); - -#ifdef __cplusplus -} -#endif - -#else /* MBEDTLS_RIPEMD160_ALT */ -#include "ripemd160.h" -#endif /* MBEDTLS_RIPEMD160_ALT */ - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * \brief Output = RIPEMD-160( input buffer ) - * - * \param input buffer holding the data - * \param ilen length of the input data - * \param output RIPEMD-160 checksum result - */ -void mbedtls_ripemd160( const unsigned char *input, size_t ilen, - unsigned char output[20] ); - -/** - * \brief Checkup routine - * - * \return 0 if successful, or 1 if the test failed - */ -int mbedtls_ripemd160_self_test( int verbose ); - -#ifdef __cplusplus -} -#endif - -#endif /* mbedtls_ripemd160.h */ diff --git a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/rsa.h b/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/rsa.h deleted file mode 100644 index 9c8645df..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/rsa.h +++ /dev/null @@ -1,652 +0,0 @@ -/** - * \file rsa.h - * - * \brief The RSA public-key cryptosystem - * - * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * This file is part of mbed TLS (https://tls.mbed.org) - */ -#ifndef MBEDTLS_RSA_H -#define MBEDTLS_RSA_H - -#if !defined(MBEDTLS_CONFIG_FILE) -#include "config.h" -#else -#include MBEDTLS_CONFIG_FILE -#endif - -#include "bignum.h" -#include "md.h" - -#if defined(MBEDTLS_THREADING_C) -#include "threading.h" -#endif - -/* - * RSA Error codes - */ -#define MBEDTLS_ERR_RSA_BAD_INPUT_DATA -0x4080 /**< Bad input parameters to function. */ -#define MBEDTLS_ERR_RSA_INVALID_PADDING -0x4100 /**< Input data contains invalid padding and is rejected. */ -#define MBEDTLS_ERR_RSA_KEY_GEN_FAILED -0x4180 /**< Something failed during generation of a key. */ -#define MBEDTLS_ERR_RSA_KEY_CHECK_FAILED -0x4200 /**< Key failed to pass the library's validity check. */ -#define MBEDTLS_ERR_RSA_PUBLIC_FAILED -0x4280 /**< The public key operation failed. */ -#define MBEDTLS_ERR_RSA_PRIVATE_FAILED -0x4300 /**< The private key operation failed. */ -#define MBEDTLS_ERR_RSA_VERIFY_FAILED -0x4380 /**< The PKCS#1 verification failed. */ -#define MBEDTLS_ERR_RSA_OUTPUT_TOO_LARGE -0x4400 /**< The output buffer for decryption is not large enough. */ -#define MBEDTLS_ERR_RSA_RNG_FAILED -0x4480 /**< The random generator failed to generate non-zeros. */ - -/* - * RSA constants - */ -#define MBEDTLS_RSA_PUBLIC 0 -#define MBEDTLS_RSA_PRIVATE 1 - -#define MBEDTLS_RSA_PKCS_V15 0 -#define MBEDTLS_RSA_PKCS_V21 1 - -#define MBEDTLS_RSA_SIGN 1 -#define MBEDTLS_RSA_CRYPT 2 - -#define MBEDTLS_RSA_SALT_LEN_ANY -1 - -/* - * The above constants may be used even if the RSA module is compile out, - * eg for alternative (PKCS#11) RSA implemenations in the PK layers. - */ -#if defined(MBEDTLS_RSA_C) - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * \brief RSA context structure - */ -typedef struct -{ - int ver; /*!< always 0 */ - size_t len; /*!< size(N) in chars */ - - mbedtls_mpi N; /*!< public modulus */ - mbedtls_mpi E; /*!< public exponent */ - - mbedtls_mpi D; /*!< private exponent */ - mbedtls_mpi P; /*!< 1st prime factor */ - mbedtls_mpi Q; /*!< 2nd prime factor */ - mbedtls_mpi DP; /*!< D % (P - 1) */ - mbedtls_mpi DQ; /*!< D % (Q - 1) */ - mbedtls_mpi QP; /*!< 1 / (Q % P) */ - - mbedtls_mpi RN; /*!< cached R^2 mod N */ - mbedtls_mpi RP; /*!< cached R^2 mod P */ - mbedtls_mpi RQ; /*!< cached R^2 mod Q */ - - mbedtls_mpi Vi; /*!< cached blinding value */ - mbedtls_mpi Vf; /*!< cached un-blinding value */ - - int padding; /*!< MBEDTLS_RSA_PKCS_V15 for 1.5 padding and - RSA_PKCS_v21 for OAEP/PSS */ - int hash_id; /*!< Hash identifier of mbedtls_md_type_t as - specified in the mbedtls_md.h header file - for the EME-OAEP and EMSA-PSS - encoding */ -#if defined(MBEDTLS_THREADING_C) - mbedtls_threading_mutex_t mutex; /*!< Thread-safety mutex */ -#endif -} -mbedtls_rsa_context; - -/** - * \brief Initialize an RSA context - * - * Note: Set padding to MBEDTLS_RSA_PKCS_V21 for the RSAES-OAEP - * encryption scheme and the RSASSA-PSS signature scheme. - * - * \param ctx RSA context to be initialized - * \param padding MBEDTLS_RSA_PKCS_V15 or MBEDTLS_RSA_PKCS_V21 - * \param hash_id MBEDTLS_RSA_PKCS_V21 hash identifier - * - * \note The hash_id parameter is actually ignored - * when using MBEDTLS_RSA_PKCS_V15 padding. - * - * \note Choice of padding mode is strictly enforced for private key - * operations, since there might be security concerns in - * mixing padding modes. For public key operations it's merely - * a default value, which can be overriden by calling specific - * rsa_rsaes_xxx or rsa_rsassa_xxx functions. - * - * \note The chosen hash is always used for OEAP encryption. - * For PSS signatures, it's always used for making signatures, - * but can be overriden (and always is, if set to - * MBEDTLS_MD_NONE) for verifying them. - */ -void mbedtls_rsa_init( mbedtls_rsa_context *ctx, - int padding, - int hash_id); - -/** - * \brief Set padding for an already initialized RSA context - * See \c mbedtls_rsa_init() for details. - * - * \param ctx RSA context to be set - * \param padding MBEDTLS_RSA_PKCS_V15 or MBEDTLS_RSA_PKCS_V21 - * \param hash_id MBEDTLS_RSA_PKCS_V21 hash identifier - */ -void mbedtls_rsa_set_padding( mbedtls_rsa_context *ctx, int padding, int hash_id); - -/** - * \brief Generate an RSA keypair - * - * \param ctx RSA context that will hold the key - * \param f_rng RNG function - * \param p_rng RNG parameter - * \param nbits size of the public key in bits - * \param exponent public exponent (e.g., 65537) - * - * \note mbedtls_rsa_init() must be called beforehand to setup - * the RSA context. - * - * \return 0 if successful, or an MBEDTLS_ERR_RSA_XXX error code - */ -int mbedtls_rsa_gen_key( mbedtls_rsa_context *ctx, - int (*f_rng)(void *, unsigned char *, size_t), - void *p_rng, - unsigned int nbits, int exponent ); - -/** - * \brief Check a public RSA key - * - * \param ctx RSA context to be checked - * - * \return 0 if successful, or an MBEDTLS_ERR_RSA_XXX error code - */ -int mbedtls_rsa_check_pubkey( const mbedtls_rsa_context *ctx ); - -/** - * \brief Check a private RSA key - * - * \param ctx RSA context to be checked - * - * \return 0 if successful, or an MBEDTLS_ERR_RSA_XXX error code - */ -int mbedtls_rsa_check_privkey( const mbedtls_rsa_context *ctx ); - -/** - * \brief Check a public-private RSA key pair. - * Check each of the contexts, and make sure they match. - * - * \param pub RSA context holding the public key - * \param prv RSA context holding the private key - * - * \return 0 if successful, or an MBEDTLS_ERR_RSA_XXX error code - */ -int mbedtls_rsa_check_pub_priv( const mbedtls_rsa_context *pub, const mbedtls_rsa_context *prv ); - -/** - * \brief Do an RSA public key operation - * - * \param ctx RSA context - * \param input input buffer - * \param output output buffer - * - * \return 0 if successful, or an MBEDTLS_ERR_RSA_XXX error code - * - * \note This function does NOT take care of message - * padding. Also, be sure to set input[0] = 0 or assure that - * input is smaller than N. - * - * \note The input and output buffers must be large - * enough (eg. 128 bytes if RSA-1024 is used). - */ -int mbedtls_rsa_public( mbedtls_rsa_context *ctx, - const unsigned char *input, - unsigned char *output ); - -/** - * \brief Do an RSA private key operation - * - * \param ctx RSA context - * \param f_rng RNG function (Needed for blinding) - * \param p_rng RNG parameter - * \param input input buffer - * \param output output buffer - * - * \return 0 if successful, or an MBEDTLS_ERR_RSA_XXX error code - * - * \note The input and output buffers must be large - * enough (eg. 128 bytes if RSA-1024 is used). - */ -int mbedtls_rsa_private( mbedtls_rsa_context *ctx, - int (*f_rng)(void *, unsigned char *, size_t), - void *p_rng, - const unsigned char *input, - unsigned char *output ); - -/** - * \brief Generic wrapper to perform a PKCS#1 encryption using the - * mode from the context. Add the message padding, then do an - * RSA operation. - * - * \param ctx RSA context - * \param f_rng RNG function (Needed for padding and PKCS#1 v2.1 encoding - * and MBEDTLS_RSA_PRIVATE) - * \param p_rng RNG parameter - * \param mode MBEDTLS_RSA_PUBLIC or MBEDTLS_RSA_PRIVATE - * \param ilen contains the plaintext length - * \param input buffer holding the data to be encrypted - * \param output buffer that will hold the ciphertext - * - * \return 0 if successful, or an MBEDTLS_ERR_RSA_XXX error code - * - * \note The output buffer must be as large as the size - * of ctx->N (eg. 128 bytes if RSA-1024 is used). - */ -int mbedtls_rsa_pkcs1_encrypt( mbedtls_rsa_context *ctx, - int (*f_rng)(void *, unsigned char *, size_t), - void *p_rng, - int mode, size_t ilen, - const unsigned char *input, - unsigned char *output ); - -/** - * \brief Perform a PKCS#1 v1.5 encryption (RSAES-PKCS1-v1_5-ENCRYPT) - * - * \param ctx RSA context - * \param f_rng RNG function (Needed for padding and MBEDTLS_RSA_PRIVATE) - * \param p_rng RNG parameter - * \param mode MBEDTLS_RSA_PUBLIC or MBEDTLS_RSA_PRIVATE - * \param ilen contains the plaintext length - * \param input buffer holding the data to be encrypted - * \param output buffer that will hold the ciphertext - * - * \return 0 if successful, or an MBEDTLS_ERR_RSA_XXX error code - * - * \note The output buffer must be as large as the size - * of ctx->N (eg. 128 bytes if RSA-1024 is used). - */ -int mbedtls_rsa_rsaes_pkcs1_v15_encrypt( mbedtls_rsa_context *ctx, - int (*f_rng)(void *, unsigned char *, size_t), - void *p_rng, - int mode, size_t ilen, - const unsigned char *input, - unsigned char *output ); - -/** - * \brief Perform a PKCS#1 v2.1 OAEP encryption (RSAES-OAEP-ENCRYPT) - * - * \param ctx RSA context - * \param f_rng RNG function (Needed for padding and PKCS#1 v2.1 encoding - * and MBEDTLS_RSA_PRIVATE) - * \param p_rng RNG parameter - * \param mode MBEDTLS_RSA_PUBLIC or MBEDTLS_RSA_PRIVATE - * \param label buffer holding the custom label to use - * \param label_len contains the label length - * \param ilen contains the plaintext length - * \param input buffer holding the data to be encrypted - * \param output buffer that will hold the ciphertext - * - * \return 0 if successful, or an MBEDTLS_ERR_RSA_XXX error code - * - * \note The output buffer must be as large as the size - * of ctx->N (eg. 128 bytes if RSA-1024 is used). - */ -int mbedtls_rsa_rsaes_oaep_encrypt( mbedtls_rsa_context *ctx, - int (*f_rng)(void *, unsigned char *, size_t), - void *p_rng, - int mode, - const unsigned char *label, size_t label_len, - size_t ilen, - const unsigned char *input, - unsigned char *output ); - -/** - * \brief Generic wrapper to perform a PKCS#1 decryption using the - * mode from the context. Do an RSA operation, then remove - * the message padding - * - * \param ctx RSA context - * \param f_rng RNG function (Only needed for MBEDTLS_RSA_PRIVATE) - * \param p_rng RNG parameter - * \param mode MBEDTLS_RSA_PUBLIC or MBEDTLS_RSA_PRIVATE - * \param olen will contain the plaintext length - * \param input buffer holding the encrypted data - * \param output buffer that will hold the plaintext - * \param output_max_len maximum length of the output buffer - * - * \return 0 if successful, or an MBEDTLS_ERR_RSA_XXX error code - * - * \note The output buffer must be as large as the size - * of ctx->N (eg. 128 bytes if RSA-1024 is used) otherwise - * an error is thrown. - */ -int mbedtls_rsa_pkcs1_decrypt( mbedtls_rsa_context *ctx, - int (*f_rng)(void *, unsigned char *, size_t), - void *p_rng, - int mode, size_t *olen, - const unsigned char *input, - unsigned char *output, - size_t output_max_len ); - -/** - * \brief Perform a PKCS#1 v1.5 decryption (RSAES-PKCS1-v1_5-DECRYPT) - * - * \param ctx RSA context - * \param f_rng RNG function (Only needed for MBEDTLS_RSA_PRIVATE) - * \param p_rng RNG parameter - * \param mode MBEDTLS_RSA_PUBLIC or MBEDTLS_RSA_PRIVATE - * \param olen will contain the plaintext length - * \param input buffer holding the encrypted data - * \param output buffer that will hold the plaintext - * \param output_max_len maximum length of the output buffer - * - * \return 0 if successful, or an MBEDTLS_ERR_RSA_XXX error code - * - * \note The output buffer must be as large as the size - * of ctx->N (eg. 128 bytes if RSA-1024 is used) otherwise - * an error is thrown. - */ -int mbedtls_rsa_rsaes_pkcs1_v15_decrypt( mbedtls_rsa_context *ctx, - int (*f_rng)(void *, unsigned char *, size_t), - void *p_rng, - int mode, size_t *olen, - const unsigned char *input, - unsigned char *output, - size_t output_max_len ); - -/** - * \brief Perform a PKCS#1 v2.1 OAEP decryption (RSAES-OAEP-DECRYPT) - * - * \param ctx RSA context - * \param f_rng RNG function (Only needed for MBEDTLS_RSA_PRIVATE) - * \param p_rng RNG parameter - * \param mode MBEDTLS_RSA_PUBLIC or MBEDTLS_RSA_PRIVATE - * \param label buffer holding the custom label to use - * \param label_len contains the label length - * \param olen will contain the plaintext length - * \param input buffer holding the encrypted data - * \param output buffer that will hold the plaintext - * \param output_max_len maximum length of the output buffer - * - * \return 0 if successful, or an MBEDTLS_ERR_RSA_XXX error code - * - * \note The output buffer must be as large as the size - * of ctx->N (eg. 128 bytes if RSA-1024 is used) otherwise - * an error is thrown. - */ -int mbedtls_rsa_rsaes_oaep_decrypt( mbedtls_rsa_context *ctx, - int (*f_rng)(void *, unsigned char *, size_t), - void *p_rng, - int mode, - const unsigned char *label, size_t label_len, - size_t *olen, - const unsigned char *input, - unsigned char *output, - size_t output_max_len ); - -/** - * \brief Generic wrapper to perform a PKCS#1 signature using the - * mode from the context. Do a private RSA operation to sign - * a message digest - * - * \param ctx RSA context - * \param f_rng RNG function (Needed for PKCS#1 v2.1 encoding and for - * MBEDTLS_RSA_PRIVATE) - * \param p_rng RNG parameter - * \param mode MBEDTLS_RSA_PUBLIC or MBEDTLS_RSA_PRIVATE - * \param md_alg a MBEDTLS_MD_XXX (use MBEDTLS_MD_NONE for signing raw data) - * \param hashlen message digest length (for MBEDTLS_MD_NONE only) - * \param hash buffer holding the message digest - * \param sig buffer that will hold the ciphertext - * - * \return 0 if the signing operation was successful, - * or an MBEDTLS_ERR_RSA_XXX error code - * - * \note The "sig" buffer must be as large as the size - * of ctx->N (eg. 128 bytes if RSA-1024 is used). - * - * \note In case of PKCS#1 v2.1 encoding, see comments on - * \note \c mbedtls_rsa_rsassa_pss_sign() for details on md_alg and hash_id. - */ -int mbedtls_rsa_pkcs1_sign( mbedtls_rsa_context *ctx, - int (*f_rng)(void *, unsigned char *, size_t), - void *p_rng, - int mode, - mbedtls_md_type_t md_alg, - unsigned int hashlen, - const unsigned char *hash, - unsigned char *sig ); - -/** - * \brief Perform a PKCS#1 v1.5 signature (RSASSA-PKCS1-v1_5-SIGN) - * - * \param ctx RSA context - * \param f_rng RNG function (Only needed for MBEDTLS_RSA_PRIVATE) - * \param p_rng RNG parameter - * \param mode MBEDTLS_RSA_PUBLIC or MBEDTLS_RSA_PRIVATE - * \param md_alg a MBEDTLS_MD_XXX (use MBEDTLS_MD_NONE for signing raw data) - * \param hashlen message digest length (for MBEDTLS_MD_NONE only) - * \param hash buffer holding the message digest - * \param sig buffer that will hold the ciphertext - * - * \return 0 if the signing operation was successful, - * or an MBEDTLS_ERR_RSA_XXX error code - * - * \note The "sig" buffer must be as large as the size - * of ctx->N (eg. 128 bytes if RSA-1024 is used). - */ -int mbedtls_rsa_rsassa_pkcs1_v15_sign( mbedtls_rsa_context *ctx, - int (*f_rng)(void *, unsigned char *, size_t), - void *p_rng, - int mode, - mbedtls_md_type_t md_alg, - unsigned int hashlen, - const unsigned char *hash, - unsigned char *sig ); - -/** - * \brief Perform a PKCS#1 v2.1 PSS signature (RSASSA-PSS-SIGN) - * - * \param ctx RSA context - * \param f_rng RNG function (Needed for PKCS#1 v2.1 encoding and for - * MBEDTLS_RSA_PRIVATE) - * \param p_rng RNG parameter - * \param mode MBEDTLS_RSA_PUBLIC or MBEDTLS_RSA_PRIVATE - * \param md_alg a MBEDTLS_MD_XXX (use MBEDTLS_MD_NONE for signing raw data) - * \param hashlen message digest length (for MBEDTLS_MD_NONE only) - * \param hash buffer holding the message digest - * \param sig buffer that will hold the ciphertext - * - * \return 0 if the signing operation was successful, - * or an MBEDTLS_ERR_RSA_XXX error code - * - * \note The "sig" buffer must be as large as the size - * of ctx->N (eg. 128 bytes if RSA-1024 is used). - * - * \note The hash_id in the RSA context is the one used for the - * encoding. md_alg in the function call is the type of hash - * that is encoded. According to RFC 3447 it is advised to - * keep both hashes the same. - */ -int mbedtls_rsa_rsassa_pss_sign( mbedtls_rsa_context *ctx, - int (*f_rng)(void *, unsigned char *, size_t), - void *p_rng, - int mode, - mbedtls_md_type_t md_alg, - unsigned int hashlen, - const unsigned char *hash, - unsigned char *sig ); - -/** - * \brief Generic wrapper to perform a PKCS#1 verification using the - * mode from the context. Do a public RSA operation and check - * the message digest - * - * \param ctx points to an RSA public key - * \param f_rng RNG function (Only needed for MBEDTLS_RSA_PRIVATE) - * \param p_rng RNG parameter - * \param mode MBEDTLS_RSA_PUBLIC or MBEDTLS_RSA_PRIVATE - * \param md_alg a MBEDTLS_MD_XXX (use MBEDTLS_MD_NONE for signing raw data) - * \param hashlen message digest length (for MBEDTLS_MD_NONE only) - * \param hash buffer holding the message digest - * \param sig buffer holding the ciphertext - * - * \return 0 if the verify operation was successful, - * or an MBEDTLS_ERR_RSA_XXX error code - * - * \note The "sig" buffer must be as large as the size - * of ctx->N (eg. 128 bytes if RSA-1024 is used). - * - * \note In case of PKCS#1 v2.1 encoding, see comments on - * \c mbedtls_rsa_rsassa_pss_verify() about md_alg and hash_id. - */ -int mbedtls_rsa_pkcs1_verify( mbedtls_rsa_context *ctx, - int (*f_rng)(void *, unsigned char *, size_t), - void *p_rng, - int mode, - mbedtls_md_type_t md_alg, - unsigned int hashlen, - const unsigned char *hash, - const unsigned char *sig ); - -/** - * \brief Perform a PKCS#1 v1.5 verification (RSASSA-PKCS1-v1_5-VERIFY) - * - * \param ctx points to an RSA public key - * \param f_rng RNG function (Only needed for MBEDTLS_RSA_PRIVATE) - * \param p_rng RNG parameter - * \param mode MBEDTLS_RSA_PUBLIC or MBEDTLS_RSA_PRIVATE - * \param md_alg a MBEDTLS_MD_XXX (use MBEDTLS_MD_NONE for signing raw data) - * \param hashlen message digest length (for MBEDTLS_MD_NONE only) - * \param hash buffer holding the message digest - * \param sig buffer holding the ciphertext - * - * \return 0 if the verify operation was successful, - * or an MBEDTLS_ERR_RSA_XXX error code - * - * \note The "sig" buffer must be as large as the size - * of ctx->N (eg. 128 bytes if RSA-1024 is used). - */ -int mbedtls_rsa_rsassa_pkcs1_v15_verify( mbedtls_rsa_context *ctx, - int (*f_rng)(void *, unsigned char *, size_t), - void *p_rng, - int mode, - mbedtls_md_type_t md_alg, - unsigned int hashlen, - const unsigned char *hash, - const unsigned char *sig ); - -/** - * \brief Perform a PKCS#1 v2.1 PSS verification (RSASSA-PSS-VERIFY) - * (This is the "simple" version.) - * - * \param ctx points to an RSA public key - * \param f_rng RNG function (Only needed for MBEDTLS_RSA_PRIVATE) - * \param p_rng RNG parameter - * \param mode MBEDTLS_RSA_PUBLIC or MBEDTLS_RSA_PRIVATE - * \param md_alg a MBEDTLS_MD_XXX (use MBEDTLS_MD_NONE for signing raw data) - * \param hashlen message digest length (for MBEDTLS_MD_NONE only) - * \param hash buffer holding the message digest - * \param sig buffer holding the ciphertext - * - * \return 0 if the verify operation was successful, - * or an MBEDTLS_ERR_RSA_XXX error code - * - * \note The "sig" buffer must be as large as the size - * of ctx->N (eg. 128 bytes if RSA-1024 is used). - * - * \note The hash_id in the RSA context is the one used for the - * verification. md_alg in the function call is the type of - * hash that is verified. According to RFC 3447 it is advised to - * keep both hashes the same. If hash_id in the RSA context is - * unset, the md_alg from the function call is used. - */ -int mbedtls_rsa_rsassa_pss_verify( mbedtls_rsa_context *ctx, - int (*f_rng)(void *, unsigned char *, size_t), - void *p_rng, - int mode, - mbedtls_md_type_t md_alg, - unsigned int hashlen, - const unsigned char *hash, - const unsigned char *sig ); - -/** - * \brief Perform a PKCS#1 v2.1 PSS verification (RSASSA-PSS-VERIFY) - * (This is the version with "full" options.) - * - * \param ctx points to an RSA public key - * \param f_rng RNG function (Only needed for MBEDTLS_RSA_PRIVATE) - * \param p_rng RNG parameter - * \param mode MBEDTLS_RSA_PUBLIC or MBEDTLS_RSA_PRIVATE - * \param md_alg a MBEDTLS_MD_XXX (use MBEDTLS_MD_NONE for signing raw data) - * \param hashlen message digest length (for MBEDTLS_MD_NONE only) - * \param hash buffer holding the message digest - * \param mgf1_hash_id message digest used for mask generation - * \param expected_salt_len Length of the salt used in padding, use - * MBEDTLS_RSA_SALT_LEN_ANY to accept any salt length - * \param sig buffer holding the ciphertext - * - * \return 0 if the verify operation was successful, - * or an MBEDTLS_ERR_RSA_XXX error code - * - * \note The "sig" buffer must be as large as the size - * of ctx->N (eg. 128 bytes if RSA-1024 is used). - * - * \note The hash_id in the RSA context is ignored. - */ -int mbedtls_rsa_rsassa_pss_verify_ext( mbedtls_rsa_context *ctx, - int (*f_rng)(void *, unsigned char *, size_t), - void *p_rng, - int mode, - mbedtls_md_type_t md_alg, - unsigned int hashlen, - const unsigned char *hash, - mbedtls_md_type_t mgf1_hash_id, - int expected_salt_len, - const unsigned char *sig ); - -/** - * \brief Copy the components of an RSA context - * - * \param dst Destination context - * \param src Source context - * - * \return 0 on success, - * MBEDTLS_ERR_MPI_ALLOC_FAILED on memory allocation failure - */ -int mbedtls_rsa_copy( mbedtls_rsa_context *dst, const mbedtls_rsa_context *src ); - -/** - * \brief Free the components of an RSA key - * - * \param ctx RSA Context to free - */ -void mbedtls_rsa_free( mbedtls_rsa_context *ctx ); - -/** - * \brief Checkup routine - * - * \return 0 if successful, or 1 if the test failed - */ -int mbedtls_rsa_self_test( int verbose ); - -#ifdef __cplusplus -} -#endif - -#endif /* MBEDTLS_RSA_C */ - -#endif /* rsa.h */ diff --git a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/sha1.h b/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/sha1.h deleted file mode 100644 index 2b74d06d..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/sha1.h +++ /dev/null @@ -1,136 +0,0 @@ -/** - * \file mbedtls_sha1.h - * - * \brief SHA-1 cryptographic hash function - * - * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * This file is part of mbed TLS (https://tls.mbed.org) - */ -#ifndef MBEDTLS_SHA1_H -#define MBEDTLS_SHA1_H - -#if !defined(MBEDTLS_CONFIG_FILE) -#include "config.h" -#else -#include MBEDTLS_CONFIG_FILE -#endif - -#include -#include - -#if !defined(MBEDTLS_SHA1_ALT) -// Regular implementation -// - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * \brief SHA-1 context structure - */ -typedef struct -{ - uint32_t total[2]; /*!< number of bytes processed */ - uint32_t state[5]; /*!< intermediate digest state */ - unsigned char buffer[64]; /*!< data block being processed */ -} -mbedtls_sha1_context; - -/** - * \brief Initialize SHA-1 context - * - * \param ctx SHA-1 context to be initialized - */ -void mbedtls_sha1_init( mbedtls_sha1_context *ctx ); - -/** - * \brief Clear SHA-1 context - * - * \param ctx SHA-1 context to be cleared - */ -void mbedtls_sha1_free( mbedtls_sha1_context *ctx ); - -/** - * \brief Clone (the state of) a SHA-1 context - * - * \param dst The destination context - * \param src The context to be cloned - */ -void mbedtls_sha1_clone( mbedtls_sha1_context *dst, - const mbedtls_sha1_context *src ); - -/** - * \brief SHA-1 context setup - * - * \param ctx context to be initialized - */ -void mbedtls_sha1_starts( mbedtls_sha1_context *ctx ); - -/** - * \brief SHA-1 process buffer - * - * \param ctx SHA-1 context - * \param input buffer holding the data - * \param ilen length of the input data - */ -void mbedtls_sha1_update( mbedtls_sha1_context *ctx, const unsigned char *input, size_t ilen ); - -/** - * \brief SHA-1 final digest - * - * \param ctx SHA-1 context - * \param output SHA-1 checksum result - */ -void mbedtls_sha1_finish( mbedtls_sha1_context *ctx, unsigned char output[20] ); - -/* Internal use */ -void mbedtls_sha1_process( mbedtls_sha1_context *ctx, const unsigned char data[64] ); - -#ifdef __cplusplus -} -#endif - -#else /* MBEDTLS_SHA1_ALT */ -#include "sha1_alt.h" -#endif /* MBEDTLS_SHA1_ALT */ - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * \brief Output = SHA-1( input buffer ) - * - * \param input buffer holding the data - * \param ilen length of the input data - * \param output SHA-1 checksum result - */ -void mbedtls_sha1( const unsigned char *input, size_t ilen, unsigned char output[20] ); - -/** - * \brief Checkup routine - * - * \return 0 if successful, or 1 if the test failed - */ -int mbedtls_sha1_self_test( int verbose ); - -#ifdef __cplusplus -} -#endif - -#endif /* mbedtls_sha1.h */ diff --git a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/sha256.h b/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/sha256.h deleted file mode 100644 index bc8b226e..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/sha256.h +++ /dev/null @@ -1,141 +0,0 @@ -/** - * \file mbedtls_sha256.h - * - * \brief SHA-224 and SHA-256 cryptographic hash function - * - * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * This file is part of mbed TLS (https://tls.mbed.org) - */ -#ifndef MBEDTLS_SHA256_H -#define MBEDTLS_SHA256_H - -#if !defined(MBEDTLS_CONFIG_FILE) -#include "config.h" -#else -#include MBEDTLS_CONFIG_FILE -#endif - -#include -#include - -#if !defined(MBEDTLS_SHA256_ALT) -// Regular implementation -// - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * \brief SHA-256 context structure - */ -typedef struct -{ - uint32_t total[2]; /*!< number of bytes processed */ - uint32_t state[8]; /*!< intermediate digest state */ - unsigned char buffer[64]; /*!< data block being processed */ - int is224; /*!< 0 => SHA-256, else SHA-224 */ -} -mbedtls_sha256_context; - -/** - * \brief Initialize SHA-256 context - * - * \param ctx SHA-256 context to be initialized - */ -void mbedtls_sha256_init( mbedtls_sha256_context *ctx ); - -/** - * \brief Clear SHA-256 context - * - * \param ctx SHA-256 context to be cleared - */ -void mbedtls_sha256_free( mbedtls_sha256_context *ctx ); - -/** - * \brief Clone (the state of) a SHA-256 context - * - * \param dst The destination context - * \param src The context to be cloned - */ -void mbedtls_sha256_clone( mbedtls_sha256_context *dst, - const mbedtls_sha256_context *src ); - -/** - * \brief SHA-256 context setup - * - * \param ctx context to be initialized - * \param is224 0 = use SHA256, 1 = use SHA224 - */ -void mbedtls_sha256_starts( mbedtls_sha256_context *ctx, int is224 ); - -/** - * \brief SHA-256 process buffer - * - * \param ctx SHA-256 context - * \param input buffer holding the data - * \param ilen length of the input data - */ -void mbedtls_sha256_update( mbedtls_sha256_context *ctx, const unsigned char *input, - size_t ilen ); - -/** - * \brief SHA-256 final digest - * - * \param ctx SHA-256 context - * \param output SHA-224/256 checksum result - */ -void mbedtls_sha256_finish( mbedtls_sha256_context *ctx, unsigned char output[32] ); - -/* Internal use */ -void mbedtls_sha256_process( mbedtls_sha256_context *ctx, const unsigned char data[64] ); - -#ifdef __cplusplus -} -#endif - -#else /* MBEDTLS_SHA256_ALT */ -#include "sha256_alt.h" -#endif /* MBEDTLS_SHA256_ALT */ - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * \brief Output = SHA-256( input buffer ) - * - * \param input buffer holding the data - * \param ilen length of the input data - * \param output SHA-224/256 checksum result - * \param is224 0 = use SHA256, 1 = use SHA224 - */ -void mbedtls_sha256( const unsigned char *input, size_t ilen, - unsigned char output[32], int is224 ); - -/** - * \brief Checkup routine - * - * \return 0 if successful, or 1 if the test failed - */ -int mbedtls_sha256_self_test( int verbose ); - -#ifdef __cplusplus -} -#endif - -#endif /* mbedtls_sha256.h */ diff --git a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/sha512.h b/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/sha512.h deleted file mode 100644 index 9462764f..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/sha512.h +++ /dev/null @@ -1,141 +0,0 @@ -/** - * \file mbedtls_sha512.h - * - * \brief SHA-384 and SHA-512 cryptographic hash function - * - * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * This file is part of mbed TLS (https://tls.mbed.org) - */ -#ifndef MBEDTLS_SHA512_H -#define MBEDTLS_SHA512_H - -#if !defined(MBEDTLS_CONFIG_FILE) -#include "config.h" -#else -#include MBEDTLS_CONFIG_FILE -#endif - -#include -#include - -#if !defined(MBEDTLS_SHA512_ALT) -// Regular implementation -// - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * \brief SHA-512 context structure - */ -typedef struct -{ - uint64_t total[2]; /*!< number of bytes processed */ - uint64_t state[8]; /*!< intermediate digest state */ - unsigned char buffer[128]; /*!< data block being processed */ - int is384; /*!< 0 => SHA-512, else SHA-384 */ -} -mbedtls_sha512_context; - -/** - * \brief Initialize SHA-512 context - * - * \param ctx SHA-512 context to be initialized - */ -void mbedtls_sha512_init( mbedtls_sha512_context *ctx ); - -/** - * \brief Clear SHA-512 context - * - * \param ctx SHA-512 context to be cleared - */ -void mbedtls_sha512_free( mbedtls_sha512_context *ctx ); - -/** - * \brief Clone (the state of) a SHA-512 context - * - * \param dst The destination context - * \param src The context to be cloned - */ -void mbedtls_sha512_clone( mbedtls_sha512_context *dst, - const mbedtls_sha512_context *src ); - -/** - * \brief SHA-512 context setup - * - * \param ctx context to be initialized - * \param is384 0 = use SHA512, 1 = use SHA384 - */ -void mbedtls_sha512_starts( mbedtls_sha512_context *ctx, int is384 ); - -/** - * \brief SHA-512 process buffer - * - * \param ctx SHA-512 context - * \param input buffer holding the data - * \param ilen length of the input data - */ -void mbedtls_sha512_update( mbedtls_sha512_context *ctx, const unsigned char *input, - size_t ilen ); - -/** - * \brief SHA-512 final digest - * - * \param ctx SHA-512 context - * \param output SHA-384/512 checksum result - */ -void mbedtls_sha512_finish( mbedtls_sha512_context *ctx, unsigned char output[64] ); - -#ifdef __cplusplus -} -#endif - -#else /* MBEDTLS_SHA512_ALT */ -#include "sha512_alt.h" -#endif /* MBEDTLS_SHA512_ALT */ - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * \brief Output = SHA-512( input buffer ) - * - * \param input buffer holding the data - * \param ilen length of the input data - * \param output SHA-384/512 checksum result - * \param is384 0 = use SHA512, 1 = use SHA384 - */ -void mbedtls_sha512( const unsigned char *input, size_t ilen, - unsigned char output[64], int is384 ); - -/** - * \brief Checkup routine - * - * \return 0 if successful, or 1 if the test failed - */ -int mbedtls_sha512_self_test( int verbose ); - -/* Internal use */ -void mbedtls_sha512_process( mbedtls_sha512_context *ctx, const unsigned char data[128] ); - -#ifdef __cplusplus -} -#endif - -#endif /* mbedtls_sha512.h */ diff --git a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/ssl.h b/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/ssl.h deleted file mode 100644 index a017ec0b..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/ssl.h +++ /dev/null @@ -1,2290 +0,0 @@ -/** - * \file ssl.h - * - * \brief SSL/TLS functions. - * - * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * This file is part of mbed TLS (https://tls.mbed.org) - */ -#ifndef MBEDTLS_SSL_H -#define MBEDTLS_SSL_H - -#if !defined(MBEDTLS_CONFIG_FILE) -#include "config.h" -#else -#include MBEDTLS_CONFIG_FILE -#endif - -#include "bignum.h" -#include "ecp.h" - -#include "ssl_ciphersuites.h" - -#if defined(MBEDTLS_X509_CRT_PARSE_C) -#include "x509_crt.h" -#include "x509_crl.h" -#endif - -#if defined(MBEDTLS_DHM_C) -#include "dhm.h" -#endif - -#if defined(MBEDTLS_ECDH_C) -#include "ecdh.h" -#endif - -#if defined(MBEDTLS_ZLIB_SUPPORT) -#include "zlib.h" -#endif - -#if defined(MBEDTLS_HAVE_TIME) -#include -#endif - -/* For convenience below and in programs */ -#if defined(MBEDTLS_KEY_EXCHANGE_PSK_ENABLED) || \ - defined(MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED) || \ - defined(MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED) || \ - defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED) -#define MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED -#endif - -#if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) || \ - defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED) || \ - defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED) -#define MBEDTLS_KEY_EXCHANGE__SOME__ECDHE_ENABLED -#endif - -#if defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED) || \ - defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) || \ - defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED) -#define MBEDTLS_KEY_EXCHANGE__SOME__SIGNATURE_ENABLED -#endif - -/* - * SSL Error codes - */ -#define MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE -0x7080 /**< The requested feature is not available. */ -#define MBEDTLS_ERR_SSL_BAD_INPUT_DATA -0x7100 /**< Bad input parameters to function. */ -#define MBEDTLS_ERR_SSL_INVALID_MAC -0x7180 /**< Verification of the message MAC failed. */ -#define MBEDTLS_ERR_SSL_INVALID_RECORD -0x7200 /**< An invalid SSL record was received. */ -#define MBEDTLS_ERR_SSL_CONN_EOF -0x7280 /**< The connection indicated an EOF. */ -#define MBEDTLS_ERR_SSL_UNKNOWN_CIPHER -0x7300 /**< An unknown cipher was received. */ -#define MBEDTLS_ERR_SSL_NO_CIPHER_CHOSEN -0x7380 /**< The server has no ciphersuites in common with the client. */ -#define MBEDTLS_ERR_SSL_NO_RNG -0x7400 /**< No RNG was provided to the SSL module. */ -#define MBEDTLS_ERR_SSL_NO_CLIENT_CERTIFICATE -0x7480 /**< No client certification received from the client, but required by the authentication mode. */ -#define MBEDTLS_ERR_SSL_CERTIFICATE_TOO_LARGE -0x7500 /**< Our own certificate(s) is/are too large to send in an SSL message. */ -#define MBEDTLS_ERR_SSL_CERTIFICATE_REQUIRED -0x7580 /**< The own certificate is not set, but needed by the server. */ -#define MBEDTLS_ERR_SSL_PRIVATE_KEY_REQUIRED -0x7600 /**< The own private key or pre-shared key is not set, but needed. */ -#define MBEDTLS_ERR_SSL_CA_CHAIN_REQUIRED -0x7680 /**< No CA Chain is set, but required to operate. */ -#define MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE -0x7700 /**< An unexpected message was received from our peer. */ -#define MBEDTLS_ERR_SSL_FATAL_ALERT_MESSAGE -0x7780 /**< A fatal alert message was received from our peer. */ -#define MBEDTLS_ERR_SSL_PEER_VERIFY_FAILED -0x7800 /**< Verification of our peer failed. */ -#define MBEDTLS_ERR_SSL_PEER_CLOSE_NOTIFY -0x7880 /**< The peer notified us that the connection is going to be closed. */ -#define MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO -0x7900 /**< Processing of the ClientHello handshake message failed. */ -#define MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO -0x7980 /**< Processing of the ServerHello handshake message failed. */ -#define MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE -0x7A00 /**< Processing of the Certificate handshake message failed. */ -#define MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE_REQUEST -0x7A80 /**< Processing of the CertificateRequest handshake message failed. */ -#define MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE -0x7B00 /**< Processing of the ServerKeyExchange handshake message failed. */ -#define MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO_DONE -0x7B80 /**< Processing of the ServerHelloDone handshake message failed. */ -#define MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE -0x7C00 /**< Processing of the ClientKeyExchange handshake message failed. */ -#define MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE_RP -0x7C80 /**< Processing of the ClientKeyExchange handshake message failed in DHM / ECDH Read Public. */ -#define MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE_CS -0x7D00 /**< Processing of the ClientKeyExchange handshake message failed in DHM / ECDH Calculate Secret. */ -#define MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE_VERIFY -0x7D80 /**< Processing of the CertificateVerify handshake message failed. */ -#define MBEDTLS_ERR_SSL_BAD_HS_CHANGE_CIPHER_SPEC -0x7E00 /**< Processing of the ChangeCipherSpec handshake message failed. */ -#define MBEDTLS_ERR_SSL_BAD_HS_FINISHED -0x7E80 /**< Processing of the Finished handshake message failed. */ -#define MBEDTLS_ERR_SSL_ALLOC_FAILED -0x7F00 /**< Memory allocation failed */ -#define MBEDTLS_ERR_SSL_HW_ACCEL_FAILED -0x7F80 /**< Hardware acceleration function returned with error */ -#define MBEDTLS_ERR_SSL_HW_ACCEL_FALLTHROUGH -0x6F80 /**< Hardware acceleration function skipped / left alone data */ -#define MBEDTLS_ERR_SSL_COMPRESSION_FAILED -0x6F00 /**< Processing of the compression / decompression failed */ -#define MBEDTLS_ERR_SSL_BAD_HS_PROTOCOL_VERSION -0x6E80 /**< Handshake protocol not within min/max boundaries */ -#define MBEDTLS_ERR_SSL_BAD_HS_NEW_SESSION_TICKET -0x6E00 /**< Processing of the NewSessionTicket handshake message failed. */ -#define MBEDTLS_ERR_SSL_SESSION_TICKET_EXPIRED -0x6D80 /**< Session ticket has expired. */ -#define MBEDTLS_ERR_SSL_PK_TYPE_MISMATCH -0x6D00 /**< Public key type mismatch (eg, asked for RSA key exchange and presented EC key) */ -#define MBEDTLS_ERR_SSL_UNKNOWN_IDENTITY -0x6C80 /**< Unknown identity received (eg, PSK identity) */ -#define MBEDTLS_ERR_SSL_INTERNAL_ERROR -0x6C00 /**< Internal error (eg, unexpected failure in lower-level module) */ -#define MBEDTLS_ERR_SSL_COUNTER_WRAPPING -0x6B80 /**< A counter would wrap (eg, too many messages exchanged). */ -#define MBEDTLS_ERR_SSL_WAITING_SERVER_HELLO_RENEGO -0x6B00 /**< Unexpected message at ServerHello in renegotiation. */ -#define MBEDTLS_ERR_SSL_HELLO_VERIFY_REQUIRED -0x6A80 /**< DTLS client must retry for hello verification */ -#define MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL -0x6A00 /**< A buffer is too small to receive or write a message */ -#define MBEDTLS_ERR_SSL_NO_USABLE_CIPHERSUITE -0x6980 /**< None of the common ciphersuites is usable (eg, no suitable certificate, see debug messages). */ -#define MBEDTLS_ERR_SSL_WANT_READ -0x6900 /**< Connection requires a read call. */ -#define MBEDTLS_ERR_SSL_WANT_WRITE -0x6880 /**< Connection requires a write call. */ -#define MBEDTLS_ERR_SSL_TIMEOUT -0x6800 /**< The operation timed out. */ -#define MBEDTLS_ERR_SSL_CLIENT_RECONNECT -0x6780 /**< The client initiated a reconnect from the same port. */ - -/* - * Various constants - */ -#define MBEDTLS_SSL_MAJOR_VERSION_3 3 -#define MBEDTLS_SSL_MINOR_VERSION_0 0 /*!< SSL v3.0 */ -#define MBEDTLS_SSL_MINOR_VERSION_1 1 /*!< TLS v1.0 */ -#define MBEDTLS_SSL_MINOR_VERSION_2 2 /*!< TLS v1.1 */ -#define MBEDTLS_SSL_MINOR_VERSION_3 3 /*!< TLS v1.2 */ - -#define MBEDTLS_SSL_TRANSPORT_STREAM 0 /*!< TLS */ -#define MBEDTLS_SSL_TRANSPORT_DATAGRAM 1 /*!< DTLS */ - -#define MBEDTLS_SSL_MAX_HOST_NAME_LEN 255 /*!< Maximum host name defined in RFC 1035 */ - -/* RFC 6066 section 4, see also mfl_code_to_length in ssl_tls.c - * NONE must be zero so that memset()ing structure to zero works */ -#define MBEDTLS_SSL_MAX_FRAG_LEN_NONE 0 /*!< don't use this extension */ -#define MBEDTLS_SSL_MAX_FRAG_LEN_512 1 /*!< MaxFragmentLength 2^9 */ -#define MBEDTLS_SSL_MAX_FRAG_LEN_1024 2 /*!< MaxFragmentLength 2^10 */ -#define MBEDTLS_SSL_MAX_FRAG_LEN_2048 3 /*!< MaxFragmentLength 2^11 */ -#define MBEDTLS_SSL_MAX_FRAG_LEN_4096 4 /*!< MaxFragmentLength 2^12 */ -#define MBEDTLS_SSL_MAX_FRAG_LEN_INVALID 5 /*!< first invalid value */ - -#define MBEDTLS_SSL_IS_CLIENT 0 -#define MBEDTLS_SSL_IS_SERVER 1 - -#define MBEDTLS_SSL_IS_NOT_FALLBACK 0 -#define MBEDTLS_SSL_IS_FALLBACK 1 - -#define MBEDTLS_SSL_EXTENDED_MS_DISABLED 0 -#define MBEDTLS_SSL_EXTENDED_MS_ENABLED 1 - -#define MBEDTLS_SSL_ETM_DISABLED 0 -#define MBEDTLS_SSL_ETM_ENABLED 1 - -#define MBEDTLS_SSL_COMPRESS_NULL 0 -#define MBEDTLS_SSL_COMPRESS_DEFLATE 1 - -#define MBEDTLS_SSL_VERIFY_NONE 0 -#define MBEDTLS_SSL_VERIFY_OPTIONAL 1 -#define MBEDTLS_SSL_VERIFY_REQUIRED 2 -#define MBEDTLS_SSL_VERIFY_UNSET 3 /* Used only for sni_authmode */ - -#define MBEDTLS_SSL_LEGACY_RENEGOTIATION 0 -#define MBEDTLS_SSL_SECURE_RENEGOTIATION 1 - -#define MBEDTLS_SSL_RENEGOTIATION_DISABLED 0 -#define MBEDTLS_SSL_RENEGOTIATION_ENABLED 1 - -#define MBEDTLS_SSL_ANTI_REPLAY_DISABLED 0 -#define MBEDTLS_SSL_ANTI_REPLAY_ENABLED 1 - -#define MBEDTLS_SSL_RENEGOTIATION_NOT_ENFORCED -1 -#define MBEDTLS_SSL_RENEGO_MAX_RECORDS_DEFAULT 16 - -#define MBEDTLS_SSL_LEGACY_NO_RENEGOTIATION 0 -#define MBEDTLS_SSL_LEGACY_ALLOW_RENEGOTIATION 1 -#define MBEDTLS_SSL_LEGACY_BREAK_HANDSHAKE 2 - -#define MBEDTLS_SSL_TRUNC_HMAC_DISABLED 0 -#define MBEDTLS_SSL_TRUNC_HMAC_ENABLED 1 -#define MBEDTLS_SSL_TRUNCATED_HMAC_LEN 10 /* 80 bits, rfc 6066 section 7 */ - -#define MBEDTLS_SSL_SESSION_TICKETS_DISABLED 0 -#define MBEDTLS_SSL_SESSION_TICKETS_ENABLED 1 - -#define MBEDTLS_SSL_CBC_RECORD_SPLITTING_DISABLED 0 -#define MBEDTLS_SSL_CBC_RECORD_SPLITTING_ENABLED 1 - -#define MBEDTLS_SSL_ARC4_ENABLED 0 -#define MBEDTLS_SSL_ARC4_DISABLED 1 - -#define MBEDTLS_SSL_PRESET_DEFAULT 0 -#define MBEDTLS_SSL_PRESET_SUITEB 2 - -/* - * Default range for DTLS retransmission timer value, in milliseconds. - * RFC 6347 4.2.4.1 says from 1 second to 60 seconds. - */ -#define MBEDTLS_SSL_DTLS_TIMEOUT_DFL_MIN 1000 -#define MBEDTLS_SSL_DTLS_TIMEOUT_DFL_MAX 60000 - -/** - * \name SECTION: Module settings - * - * The configuration options you can set for this module are in this section. - * Either change them in config.h or define them on the compiler command line. - * \{ - */ - -#if !defined(MBEDTLS_SSL_DEFAULT_TICKET_LIFETIME) -#define MBEDTLS_SSL_DEFAULT_TICKET_LIFETIME 86400 /**< Lifetime of session tickets (if enabled) */ -#endif - -/* - * Maxium fragment length in bytes, - * determines the size of each of the two internal I/O buffers. - * - * Note: the RFC defines the default size of SSL / TLS messages. If you - * change the value here, other clients / servers may not be able to - * communicate with you anymore. Only change this value if you control - * both sides of the connection and have it reduced at both sides, or - * if you're using the Max Fragment Length extension and you know all your - * peers are using it too! - */ -#if !defined(MBEDTLS_SSL_MAX_CONTENT_LEN) -#define MBEDTLS_SSL_MAX_CONTENT_LEN 16384 /**< Size of the input / output buffer */ -#endif - -/* \} name SECTION: Module settings */ - -/* - * Length of the verify data for secure renegotiation - */ -#if defined(MBEDTLS_SSL_PROTO_SSL3) -#define MBEDTLS_SSL_VERIFY_DATA_MAX_LEN 36 -#else -#define MBEDTLS_SSL_VERIFY_DATA_MAX_LEN 12 -#endif - -/* - * Signaling ciphersuite values (SCSV) - */ -#define MBEDTLS_SSL_EMPTY_RENEGOTIATION_INFO 0xFF /**< renegotiation info ext */ -#define MBEDTLS_SSL_FALLBACK_SCSV_VALUE 0x5600 /**< draft-ietf-tls-downgrade-scsv-00 */ - -/* - * Supported Signature and Hash algorithms (For TLS 1.2) - * RFC 5246 section 7.4.1.4.1 - */ -#define MBEDTLS_SSL_HASH_NONE 0 -#define MBEDTLS_SSL_HASH_MD5 1 -#define MBEDTLS_SSL_HASH_SHA1 2 -#define MBEDTLS_SSL_HASH_SHA224 3 -#define MBEDTLS_SSL_HASH_SHA256 4 -#define MBEDTLS_SSL_HASH_SHA384 5 -#define MBEDTLS_SSL_HASH_SHA512 6 - -#define MBEDTLS_SSL_SIG_ANON 0 -#define MBEDTLS_SSL_SIG_RSA 1 -#define MBEDTLS_SSL_SIG_ECDSA 3 - -/* - * Client Certificate Types - * RFC 5246 section 7.4.4 plus RFC 4492 section 5.5 - */ -#define MBEDTLS_SSL_CERT_TYPE_RSA_SIGN 1 -#define MBEDTLS_SSL_CERT_TYPE_ECDSA_SIGN 64 - -/* - * Message, alert and handshake types - */ -#define MBEDTLS_SSL_MSG_CHANGE_CIPHER_SPEC 20 -#define MBEDTLS_SSL_MSG_ALERT 21 -#define MBEDTLS_SSL_MSG_HANDSHAKE 22 -#define MBEDTLS_SSL_MSG_APPLICATION_DATA 23 - -#define MBEDTLS_SSL_ALERT_LEVEL_WARNING 1 -#define MBEDTLS_SSL_ALERT_LEVEL_FATAL 2 - -#define MBEDTLS_SSL_ALERT_MSG_CLOSE_NOTIFY 0 /* 0x00 */ -#define MBEDTLS_SSL_ALERT_MSG_UNEXPECTED_MESSAGE 10 /* 0x0A */ -#define MBEDTLS_SSL_ALERT_MSG_BAD_RECORD_MAC 20 /* 0x14 */ -#define MBEDTLS_SSL_ALERT_MSG_DECRYPTION_FAILED 21 /* 0x15 */ -#define MBEDTLS_SSL_ALERT_MSG_RECORD_OVERFLOW 22 /* 0x16 */ -#define MBEDTLS_SSL_ALERT_MSG_DECOMPRESSION_FAILURE 30 /* 0x1E */ -#define MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE 40 /* 0x28 */ -#define MBEDTLS_SSL_ALERT_MSG_NO_CERT 41 /* 0x29 */ -#define MBEDTLS_SSL_ALERT_MSG_BAD_CERT 42 /* 0x2A */ -#define MBEDTLS_SSL_ALERT_MSG_UNSUPPORTED_CERT 43 /* 0x2B */ -#define MBEDTLS_SSL_ALERT_MSG_CERT_REVOKED 44 /* 0x2C */ -#define MBEDTLS_SSL_ALERT_MSG_CERT_EXPIRED 45 /* 0x2D */ -#define MBEDTLS_SSL_ALERT_MSG_CERT_UNKNOWN 46 /* 0x2E */ -#define MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER 47 /* 0x2F */ -#define MBEDTLS_SSL_ALERT_MSG_UNKNOWN_CA 48 /* 0x30 */ -#define MBEDTLS_SSL_ALERT_MSG_ACCESS_DENIED 49 /* 0x31 */ -#define MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR 50 /* 0x32 */ -#define MBEDTLS_SSL_ALERT_MSG_DECRYPT_ERROR 51 /* 0x33 */ -#define MBEDTLS_SSL_ALERT_MSG_EXPORT_RESTRICTION 60 /* 0x3C */ -#define MBEDTLS_SSL_ALERT_MSG_PROTOCOL_VERSION 70 /* 0x46 */ -#define MBEDTLS_SSL_ALERT_MSG_INSUFFICIENT_SECURITY 71 /* 0x47 */ -#define MBEDTLS_SSL_ALERT_MSG_INTERNAL_ERROR 80 /* 0x50 */ -#define MBEDTLS_SSL_ALERT_MSG_INAPROPRIATE_FALLBACK 86 /* 0x56 */ -#define MBEDTLS_SSL_ALERT_MSG_USER_CANCELED 90 /* 0x5A */ -#define MBEDTLS_SSL_ALERT_MSG_NO_RENEGOTIATION 100 /* 0x64 */ -#define MBEDTLS_SSL_ALERT_MSG_UNSUPPORTED_EXT 110 /* 0x6E */ -#define MBEDTLS_SSL_ALERT_MSG_UNRECOGNIZED_NAME 112 /* 0x70 */ -#define MBEDTLS_SSL_ALERT_MSG_UNKNOWN_PSK_IDENTITY 115 /* 0x73 */ -#define MBEDTLS_SSL_ALERT_MSG_NO_APPLICATION_PROTOCOL 120 /* 0x78 */ - -#define MBEDTLS_SSL_HS_HELLO_REQUEST 0 -#define MBEDTLS_SSL_HS_CLIENT_HELLO 1 -#define MBEDTLS_SSL_HS_SERVER_HELLO 2 -#define MBEDTLS_SSL_HS_HELLO_VERIFY_REQUEST 3 -#define MBEDTLS_SSL_HS_NEW_SESSION_TICKET 4 -#define MBEDTLS_SSL_HS_CERTIFICATE 11 -#define MBEDTLS_SSL_HS_SERVER_KEY_EXCHANGE 12 -#define MBEDTLS_SSL_HS_CERTIFICATE_REQUEST 13 -#define MBEDTLS_SSL_HS_SERVER_HELLO_DONE 14 -#define MBEDTLS_SSL_HS_CERTIFICATE_VERIFY 15 -#define MBEDTLS_SSL_HS_CLIENT_KEY_EXCHANGE 16 -#define MBEDTLS_SSL_HS_FINISHED 20 - -/* - * TLS extensions - */ -#define MBEDTLS_TLS_EXT_SERVERNAME 0 -#define MBEDTLS_TLS_EXT_SERVERNAME_HOSTNAME 0 - -#define MBEDTLS_TLS_EXT_MAX_FRAGMENT_LENGTH 1 - -#define MBEDTLS_TLS_EXT_TRUNCATED_HMAC 4 - -#define MBEDTLS_TLS_EXT_SUPPORTED_ELLIPTIC_CURVES 10 -#define MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS 11 - -#define MBEDTLS_TLS_EXT_SIG_ALG 13 - -#define MBEDTLS_TLS_EXT_ALPN 16 - -#define MBEDTLS_TLS_EXT_ENCRYPT_THEN_MAC 22 /* 0x16 */ -#define MBEDTLS_TLS_EXT_EXTENDED_MASTER_SECRET 0x0017 /* 23 */ - -#define MBEDTLS_TLS_EXT_SESSION_TICKET 35 - -#define MBEDTLS_TLS_EXT_RENEGOTIATION_INFO 0xFF01 - -/* - * Size defines - */ -#if !defined(MBEDTLS_PSK_MAX_LEN) -#define MBEDTLS_PSK_MAX_LEN 32 /* 256 bits */ -#endif - -/* Dummy type used only for its size */ -union mbedtls_ssl_premaster_secret -{ -#if defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED) - unsigned char _pms_rsa[48]; /* RFC 5246 8.1.1 */ -#endif -#if defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED) - unsigned char _pms_dhm[MBEDTLS_MPI_MAX_SIZE]; /* RFC 5246 8.1.2 */ -#endif -#if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) || \ - defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED) || \ - defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) || \ - defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED) - unsigned char _pms_ecdh[MBEDTLS_ECP_MAX_BYTES]; /* RFC 4492 5.10 */ -#endif -#if defined(MBEDTLS_KEY_EXCHANGE_PSK_ENABLED) - unsigned char _pms_psk[4 + 2 * MBEDTLS_PSK_MAX_LEN]; /* RFC 4279 2 */ -#endif -#if defined(MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED) - unsigned char _pms_dhe_psk[4 + MBEDTLS_MPI_MAX_SIZE - + MBEDTLS_PSK_MAX_LEN]; /* RFC 4279 3 */ -#endif -#if defined(MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED) - unsigned char _pms_rsa_psk[52 + MBEDTLS_PSK_MAX_LEN]; /* RFC 4279 4 */ -#endif -#if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED) - unsigned char _pms_ecdhe_psk[4 + MBEDTLS_ECP_MAX_BYTES - + MBEDTLS_PSK_MAX_LEN]; /* RFC 5489 2 */ -#endif -}; - -#define MBEDTLS_PREMASTER_SIZE sizeof( union mbedtls_ssl_premaster_secret ) - -#ifdef __cplusplus -extern "C" { -#endif - -/* - * SSL state machine - */ -typedef enum -{ - MBEDTLS_SSL_HELLO_REQUEST, - MBEDTLS_SSL_CLIENT_HELLO, - MBEDTLS_SSL_SERVER_HELLO, - MBEDTLS_SSL_SERVER_CERTIFICATE, - MBEDTLS_SSL_SERVER_KEY_EXCHANGE, - MBEDTLS_SSL_CERTIFICATE_REQUEST, - MBEDTLS_SSL_SERVER_HELLO_DONE, - MBEDTLS_SSL_CLIENT_CERTIFICATE, - MBEDTLS_SSL_CLIENT_KEY_EXCHANGE, - MBEDTLS_SSL_CERTIFICATE_VERIFY, - MBEDTLS_SSL_CLIENT_CHANGE_CIPHER_SPEC, - MBEDTLS_SSL_CLIENT_FINISHED, - MBEDTLS_SSL_SERVER_CHANGE_CIPHER_SPEC, - MBEDTLS_SSL_SERVER_FINISHED, - MBEDTLS_SSL_FLUSH_BUFFERS, - MBEDTLS_SSL_HANDSHAKE_WRAPUP, - MBEDTLS_SSL_HANDSHAKE_OVER, - MBEDTLS_SSL_SERVER_NEW_SESSION_TICKET, - MBEDTLS_SSL_SERVER_HELLO_VERIFY_REQUEST_SENT, -} -mbedtls_ssl_states; - -/* Defined below */ -typedef struct mbedtls_ssl_session mbedtls_ssl_session; -typedef struct mbedtls_ssl_context mbedtls_ssl_context; -typedef struct mbedtls_ssl_config mbedtls_ssl_config; - -/* Defined in ssl_internal.h */ -typedef struct mbedtls_ssl_transform mbedtls_ssl_transform; -typedef struct mbedtls_ssl_handshake_params mbedtls_ssl_handshake_params; -#if defined(MBEDTLS_X509_CRT_PARSE_C) -typedef struct mbedtls_ssl_key_cert mbedtls_ssl_key_cert; -#endif -#if defined(MBEDTLS_SSL_PROTO_DTLS) -typedef struct mbedtls_ssl_flight_item mbedtls_ssl_flight_item; -#endif - -/* - * This structure is used for storing current session data. - */ -struct mbedtls_ssl_session -{ -#if defined(MBEDTLS_HAVE_TIME) - time_t start; /*!< starting time */ -#endif - int ciphersuite; /*!< chosen ciphersuite */ - int compression; /*!< chosen compression */ - size_t id_len; /*!< session id length */ - unsigned char id[32]; /*!< session identifier */ - unsigned char master[48]; /*!< the master secret */ - -#if defined(MBEDTLS_X509_CRT_PARSE_C) - mbedtls_x509_crt *peer_cert; /*!< peer X.509 cert chain */ -#endif /* MBEDTLS_X509_CRT_PARSE_C */ - uint32_t verify_result; /*!< verification result */ - -#if defined(MBEDTLS_SSL_SESSION_TICKETS) && defined(MBEDTLS_SSL_CLI_C) - unsigned char *ticket; /*!< RFC 5077 session ticket */ - size_t ticket_len; /*!< session ticket length */ - uint32_t ticket_lifetime; /*!< ticket lifetime hint */ -#endif /* MBEDTLS_SSL_SESSION_TICKETS && MBEDTLS_SSL_CLI_C */ - -#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH) - unsigned char mfl_code; /*!< MaxFragmentLength negotiated by peer */ -#endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */ - -#if defined(MBEDTLS_SSL_TRUNCATED_HMAC) - int trunc_hmac; /*!< flag for truncated hmac activation */ -#endif /* MBEDTLS_SSL_TRUNCATED_HMAC */ - -#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC) - int encrypt_then_mac; /*!< flag for EtM activation */ -#endif -}; - -/** - * SSL/TLS configuration to be shared between mbedtls_ssl_context structures. - */ -struct mbedtls_ssl_config -{ - /* Group items by size (largest first) to minimize padding overhead */ - - /* - * Pointers - */ - - const int *ciphersuite_list[4]; /*!< allowed ciphersuites per version */ - - /** Callback for printing debug output */ - void (*f_dbg)(void *, int, const char *, int, const char *); - void *p_dbg; /*!< context for the debug function */ - - /** Callback for getting (pseudo-)random numbers */ - int (*f_rng)(void *, unsigned char *, size_t); - void *p_rng; /*!< context for the RNG function */ - - /** Callback to retrieve a session from the cache */ - int (*f_get_cache)(void *, mbedtls_ssl_session *); - /** Callback to store a session into the cache */ - int (*f_set_cache)(void *, const mbedtls_ssl_session *); - void *p_cache; /*!< context for cache callbacks */ - -#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION) - /** Callback for setting cert according to SNI extension */ - int (*f_sni)(void *, mbedtls_ssl_context *, const unsigned char *, size_t); - void *p_sni; /*!< context for SNI callback */ -#endif - -#if defined(MBEDTLS_X509_CRT_PARSE_C) - /** Callback to customize X.509 certificate chain verification */ - int (*f_vrfy)(void *, mbedtls_x509_crt *, int, uint32_t *); - void *p_vrfy; /*!< context for X.509 verify calllback */ -#endif - -#if defined(MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED) - /** Callback to retrieve PSK key from identity */ - int (*f_psk)(void *, mbedtls_ssl_context *, const unsigned char *, size_t); - void *p_psk; /*!< context for PSK callback */ -#endif - -#if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY) && defined(MBEDTLS_SSL_SRV_C) - /** Callback to create & write a cookie for ClientHello veirifcation */ - int (*f_cookie_write)( void *, unsigned char **, unsigned char *, - const unsigned char *, size_t ); - /** Callback to verify validity of a ClientHello cookie */ - int (*f_cookie_check)( void *, const unsigned char *, size_t, - const unsigned char *, size_t ); - void *p_cookie; /*!< context for the cookie callbacks */ -#endif - -#if defined(MBEDTLS_SSL_SESSION_TICKETS) && defined(MBEDTLS_SSL_SRV_C) - /** Callback to create & write a session ticket */ - int (*f_ticket_write)( void *, const mbedtls_ssl_session *, - unsigned char *, const unsigned char *, size_t *, uint32_t * ); - /** Callback to parse a session ticket into a session structure */ - int (*f_ticket_parse)( void *, mbedtls_ssl_session *, unsigned char *, size_t); - void *p_ticket; /*!< context for the ticket callbacks */ -#endif /* MBEDTLS_SSL_SESSION_TICKETS && MBEDTLS_SSL_SRV_C */ - -#if defined(MBEDTLS_X509_CRT_PARSE_C) - const mbedtls_x509_crt_profile *cert_profile; /*!< verification profile */ - mbedtls_ssl_key_cert *key_cert; /*!< own certificate/key pair(s) */ - mbedtls_x509_crt *ca_chain; /*!< trusted CAs */ - mbedtls_x509_crl *ca_crl; /*!< trusted CAs CRLs */ -#endif /* MBEDTLS_X509_CRT_PARSE_C */ - -#if defined(MBEDTLS_KEY_EXCHANGE__SOME__SIGNATURE_ENABLED) - const int *sig_hashes; /*!< allowed signature hashes */ -#endif - -#if defined(MBEDTLS_ECP_C) - const mbedtls_ecp_group_id *curve_list; /*!< allowed curves */ -#endif - -#if defined(MBEDTLS_DHM_C) - mbedtls_mpi dhm_P; /*!< prime modulus for DHM */ - mbedtls_mpi dhm_G; /*!< generator for DHM */ -#endif - -#if defined(MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED) - unsigned char *psk; /*!< pre-shared key */ - size_t psk_len; /*!< length of the pre-shared key */ - unsigned char *psk_identity; /*!< identity for PSK negotiation */ - size_t psk_identity_len;/*!< length of identity */ -#endif - -#if defined(MBEDTLS_SSL_ALPN) - const char **alpn_list; /*!< ordered list of protocols */ -#endif - - /* - * Numerical settings (int then char) - */ - - uint32_t read_timeout; /*!< timeout for mbedtls_ssl_read (ms) */ - -#if defined(MBEDTLS_SSL_PROTO_DTLS) - uint32_t hs_timeout_min; /*!< initial value of the handshake - retransmission timeout (ms) */ - uint32_t hs_timeout_max; /*!< maximum value of the handshake - retransmission timeout (ms) */ -#endif - -#if defined(MBEDTLS_SSL_RENEGOTIATION) - int renego_max_records; /*!< grace period for renegotiation */ - unsigned char renego_period[8]; /*!< value of the record counters - that triggers renegotiation */ -#endif - -#if defined(MBEDTLS_SSL_DTLS_BADMAC_LIMIT) - unsigned int badmac_limit; /*!< limit of records with a bad MAC */ -#endif - -#if defined(MBEDTLS_DHM_C) && defined(MBEDTLS_SSL_CLI_C) - unsigned int dhm_min_bitlen; /*!< min. bit length of the DHM prime */ -#endif - - unsigned char max_major_ver; /*!< max. major version used */ - unsigned char max_minor_ver; /*!< max. minor version used */ - unsigned char min_major_ver; /*!< min. major version used */ - unsigned char min_minor_ver; /*!< min. minor version used */ - - /* - * Flags (bitfields) - */ - - unsigned int endpoint : 1; /*!< 0: client, 1: server */ - unsigned int transport : 1; /*!< stream (TLS) or datagram (DTLS) */ - unsigned int authmode : 2; /*!< MBEDTLS_SSL_VERIFY_XXX */ - /* needed even with renego disabled for LEGACY_BREAK_HANDSHAKE */ - unsigned int allow_legacy_renegotiation : 2 ; /*!< MBEDTLS_LEGACY_XXX */ -#if defined(MBEDTLS_ARC4_C) - unsigned int arc4_disabled : 1; /*!< blacklist RC4 ciphersuites? */ -#endif -#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH) - unsigned int mfl_code : 3; /*!< desired fragment length */ -#endif -#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC) - unsigned int encrypt_then_mac : 1 ; /*!< negotiate encrypt-then-mac? */ -#endif -#if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET) - unsigned int extended_ms : 1; /*!< negotiate extended master secret? */ -#endif -#if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY) - unsigned int anti_replay : 1; /*!< detect and prevent replay? */ -#endif -#if defined(MBEDTLS_SSL_CBC_RECORD_SPLITTING) - unsigned int cbc_record_splitting : 1; /*!< do cbc record splitting */ -#endif -#if defined(MBEDTLS_SSL_RENEGOTIATION) - unsigned int disable_renegotiation : 1; /*!< disable renegotiation? */ -#endif -#if defined(MBEDTLS_SSL_TRUNCATED_HMAC) - unsigned int trunc_hmac : 1; /*!< negotiate truncated hmac? */ -#endif -#if defined(MBEDTLS_SSL_SESSION_TICKETS) - unsigned int session_tickets : 1; /*!< use session tickets? */ -#endif -#if defined(MBEDTLS_SSL_FALLBACK_SCSV) && defined(MBEDTLS_SSL_CLI_C) - unsigned int fallback : 1; /*!< is this a fallback? */ -#endif -}; - - -struct mbedtls_ssl_context -{ - const mbedtls_ssl_config *conf; /*!< configuration information */ - - /* - * Miscellaneous - */ - int state; /*!< SSL handshake: current state */ -#if defined(MBEDTLS_SSL_RENEGOTIATION) - int renego_status; /*!< Initial, in progress, pending? */ - int renego_records_seen; /*!< Records since renego request, or with DTLS, - number of retransmissions of request if - renego_max_records is < 0 */ -#endif - - int major_ver; /*!< equal to MBEDTLS_SSL_MAJOR_VERSION_3 */ - int minor_ver; /*!< either 0 (SSL3) or 1 (TLS1.0) */ - -#if defined(MBEDTLS_SSL_DTLS_BADMAC_LIMIT) - unsigned badmac_seen; /*!< records with a bad MAC received */ -#endif - - /* - * Callbacks - */ - int (*f_send)(void *, const unsigned char *, size_t); - int (*f_recv)(void *, unsigned char *, size_t); - int (*f_recv_timeout)(void *, unsigned char *, size_t, uint32_t); - void *p_bio; /*!< context for I/O operations */ - - /* - * Session layer - */ - mbedtls_ssl_session *session_in; /*!< current session data (in) */ - mbedtls_ssl_session *session_out; /*!< current session data (out) */ - mbedtls_ssl_session *session; /*!< negotiated session data */ - mbedtls_ssl_session *session_negotiate; /*!< session data in negotiation */ - - mbedtls_ssl_handshake_params *handshake; /*!< params required only during - the handshake process */ - - /* - * Record layer transformations - */ - mbedtls_ssl_transform *transform_in; /*!< current transform params (in) */ - mbedtls_ssl_transform *transform_out; /*!< current transform params (in) */ - mbedtls_ssl_transform *transform; /*!< negotiated transform params */ - mbedtls_ssl_transform *transform_negotiate; /*!< transform params in negotiation */ - - /* - * Timers - */ - void *p_timer; /*!< context for the timer callbacks */ - void (*f_set_timer)(void *, uint32_t, uint32_t); /*!< set timer callback */ - int (*f_get_timer)(void *); /*!< get timer callback */ - - /* - * Record layer (incoming data) - */ - unsigned char *in_buf; /*!< input buffer */ - unsigned char *in_ctr; /*!< 64-bit incoming message counter - TLS: maintained by us - DTLS: read from peer */ - unsigned char *in_hdr; /*!< start of record header */ - unsigned char *in_len; /*!< two-bytes message length field */ - unsigned char *in_iv; /*!< ivlen-byte IV */ - unsigned char *in_msg; /*!< message contents (in_iv+ivlen) */ - unsigned char *in_offt; /*!< read offset in application data */ - - int in_msgtype; /*!< record header: message type */ - size_t in_msglen; /*!< record header: message length */ - size_t in_left; /*!< amount of data read so far */ -#if defined(MBEDTLS_SSL_PROTO_DTLS) - uint16_t in_epoch; /*!< DTLS epoch for incoming records */ - size_t next_record_offset; /*!< offset of the next record in datagram - (equal to in_left if none) */ -#endif -#if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY) - uint64_t in_window_top; /*!< last validated record seq_num */ - uint64_t in_window; /*!< bitmask for replay detection */ -#endif - - size_t in_hslen; /*!< current handshake message length, - including the handshake header */ - int nb_zero; /*!< # of 0-length encrypted messages */ - int record_read; /*!< record is already present */ - - /* - * Record layer (outgoing data) - */ - unsigned char *out_buf; /*!< output buffer */ - unsigned char *out_ctr; /*!< 64-bit outgoing message counter */ - unsigned char *out_hdr; /*!< start of record header */ - unsigned char *out_len; /*!< two-bytes message length field */ - unsigned char *out_iv; /*!< ivlen-byte IV */ - unsigned char *out_msg; /*!< message contents (out_iv+ivlen) */ - - int out_msgtype; /*!< record header: message type */ - size_t out_msglen; /*!< record header: message length */ - size_t out_left; /*!< amount of data not yet written */ - -#if defined(MBEDTLS_ZLIB_SUPPORT) - unsigned char *compress_buf; /*!< zlib data buffer */ -#endif -#if defined(MBEDTLS_SSL_CBC_RECORD_SPLITTING) - signed char split_done; /*!< current record already splitted? */ -#endif - - /* - * PKI layer - */ - int client_auth; /*!< flag for client auth. */ - - /* - * User settings - */ -#if defined(MBEDTLS_X509_CRT_PARSE_C) - char *hostname; /*!< expected peer CN for verification - (and SNI if available) */ -#endif - -#if defined(MBEDTLS_SSL_ALPN) - const char *alpn_chosen; /*!< negotiated protocol */ -#endif - - /* - * Information for DTLS hello verify - */ -#if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY) && defined(MBEDTLS_SSL_SRV_C) - unsigned char *cli_id; /*!< transport-level ID of the client */ - size_t cli_id_len; /*!< length of cli_id */ -#endif - - /* - * Secure renegotiation - */ - /* needed to know when to send extension on server */ - int secure_renegotiation; /*!< does peer support legacy or - secure renegotiation */ -#if defined(MBEDTLS_SSL_RENEGOTIATION) - size_t verify_data_len; /*!< length of verify data stored */ - char own_verify_data[MBEDTLS_SSL_VERIFY_DATA_MAX_LEN]; /*!< previous handshake verify data */ - char peer_verify_data[MBEDTLS_SSL_VERIFY_DATA_MAX_LEN]; /*!< previous handshake verify data */ -#endif -}; - -#if defined(MBEDTLS_SSL_HW_RECORD_ACCEL) - -#define MBEDTLS_SSL_CHANNEL_OUTBOUND 0 -#define MBEDTLS_SSL_CHANNEL_INBOUND 1 - -extern int (*mbedtls_ssl_hw_record_init)(mbedtls_ssl_context *ssl, - const unsigned char *key_enc, const unsigned char *key_dec, - size_t keylen, - const unsigned char *iv_enc, const unsigned char *iv_dec, - size_t ivlen, - const unsigned char *mac_enc, const unsigned char *mac_dec, - size_t maclen); -extern int (*mbedtls_ssl_hw_record_activate)(mbedtls_ssl_context *ssl, int direction); -extern int (*mbedtls_ssl_hw_record_reset)(mbedtls_ssl_context *ssl); -extern int (*mbedtls_ssl_hw_record_write)(mbedtls_ssl_context *ssl); -extern int (*mbedtls_ssl_hw_record_read)(mbedtls_ssl_context *ssl); -extern int (*mbedtls_ssl_hw_record_finish)(mbedtls_ssl_context *ssl); -#endif /* MBEDTLS_SSL_HW_RECORD_ACCEL */ - -/** - * \brief Returns the list of ciphersuites supported by the SSL/TLS module. - * - * \return a statically allocated array of ciphersuites, the last - * entry is 0. - */ -const int *mbedtls_ssl_list_ciphersuites( void ); - -/** - * \brief Return the name of the ciphersuite associated with the - * given ID - * - * \param ciphersuite_id SSL ciphersuite ID - * - * \return a string containing the ciphersuite name - */ -const char *mbedtls_ssl_get_ciphersuite_name( const int ciphersuite_id ); - -/** - * \brief Return the ID of the ciphersuite associated with the - * given name - * - * \param ciphersuite_name SSL ciphersuite name - * - * \return the ID with the ciphersuite or 0 if not found - */ -int mbedtls_ssl_get_ciphersuite_id( const char *ciphersuite_name ); - -/** - * \brief Initialize an SSL context - * Just makes the context ready for mbedtls_ssl_setup() or - * mbedtls_ssl_free() - * - * \param ssl SSL context - */ -void mbedtls_ssl_init( mbedtls_ssl_context *ssl ); - -/** - * \brief Set up an SSL context for use - * - * \note No copy of the configuration context is made, it can be - * shared by many mbedtls_ssl_context structures. - * - * \warning Modifying the conf structure after is has been used in this - * function is unsupported! - * - * \param ssl SSL context - * \param conf SSL configuration to use - * - * \return 0 if successful, or MBEDTLS_ERR_SSL_ALLOC_FAILED if - * memory allocation failed - */ -int mbedtls_ssl_setup( mbedtls_ssl_context *ssl, - const mbedtls_ssl_config *conf ); - -/** - * \brief Reset an already initialized SSL context for re-use - * while retaining application-set variables, function - * pointers and data. - * - * \param ssl SSL context - * \return 0 if successful, or POLASSL_ERR_SSL_MALLOC_FAILED, - MBEDTLS_ERR_SSL_HW_ACCEL_FAILED or - * MBEDTLS_ERR_SSL_COMPRESSION_FAILED - */ -int mbedtls_ssl_session_reset( mbedtls_ssl_context *ssl ); - -/** - * \brief Set the current endpoint type - * - * \param conf SSL configuration - * \param endpoint must be MBEDTLS_SSL_IS_CLIENT or MBEDTLS_SSL_IS_SERVER - */ -void mbedtls_ssl_conf_endpoint( mbedtls_ssl_config *conf, int endpoint ); - -/** - * \brief Set the transport type (TLS or DTLS). - * Default: TLS - * - * \note For DTLS, you must either provide a recv callback that - * doesn't block, or one that handles timeouts, see - * \c mbedtls_ssl_set_bio(). You also need to provide timer - * callbacks with \c mbedtls_ssl_set_timer_cb(). - * - * \param conf SSL configuration - * \param transport transport type: - * MBEDTLS_SSL_TRANSPORT_STREAM for TLS, - * MBEDTLS_SSL_TRANSPORT_DATAGRAM for DTLS. - */ -void mbedtls_ssl_conf_transport( mbedtls_ssl_config *conf, int transport ); - -/** - * \brief Set the certificate verification mode - * Default: NONE on server, REQUIRED on client - * - * \param conf SSL configuration - * \param authmode can be: - * - * MBEDTLS_SSL_VERIFY_NONE: peer certificate is not checked - * (default on server) - * (insecure on client) - * - * MBEDTLS_SSL_VERIFY_OPTIONAL: peer certificate is checked, however the - * handshake continues even if verification failed; - * mbedtls_ssl_get_verify_result() can be called after the - * handshake is complete. - * - * MBEDTLS_SSL_VERIFY_REQUIRED: peer *must* present a valid certificate, - * handshake is aborted if verification failed. - * - * \note On client, MBEDTLS_SSL_VERIFY_REQUIRED is the recommended mode. - * With MBEDTLS_SSL_VERIFY_OPTIONAL, the user needs to call mbedtls_ssl_get_verify_result() at - * the right time(s), which may not be obvious, while REQUIRED always perform - * the verification as soon as possible. For example, REQUIRED was protecting - * against the "triple handshake" attack even before it was found. - */ -void mbedtls_ssl_conf_authmode( mbedtls_ssl_config *conf, int authmode ); - -#if defined(MBEDTLS_X509_CRT_PARSE_C) -/** - * \brief Set the verification callback (Optional). - * - * If set, the verify callback is called for each - * certificate in the chain. For implementation - * information, please see \c x509parse_verify() - * - * \param conf SSL configuration - * \param f_vrfy verification function - * \param p_vrfy verification parameter - */ -void mbedtls_ssl_conf_verify( mbedtls_ssl_config *conf, - int (*f_vrfy)(void *, mbedtls_x509_crt *, int, uint32_t *), - void *p_vrfy ); -#endif /* MBEDTLS_X509_CRT_PARSE_C */ - -/** - * \brief Set the random number generator callback - * - * \param conf SSL configuration - * \param f_rng RNG function - * \param p_rng RNG parameter - */ -void mbedtls_ssl_conf_rng( mbedtls_ssl_config *conf, - int (*f_rng)(void *, unsigned char *, size_t), - void *p_rng ); - -/** - * \brief Set the debug callback - * - * The callback has the following argument: - * void * opaque context for the callback - * int debug level - * const char * file name - * int line number - * const char * message - * - * \param conf SSL configuration - * \param f_dbg debug function - * \param p_dbg debug parameter - */ -void mbedtls_ssl_conf_dbg( mbedtls_ssl_config *conf, - void (*f_dbg)(void *, int, const char *, int, const char *), - void *p_dbg ); - -/** - * \brief Set the underlying BIO callbacks for write, read and - * read-with-timeout. - * - * \param ssl SSL context - * \param p_bio parameter (context) shared by BIO callbacks - * \param f_send write callback - * \param f_recv read callback - * \param f_recv_timeout blocking read callback with timeout. - * The last argument is the timeout in milliseconds, - * 0 means no timeout (block forever until a message comes) - * - * \note One of f_recv or f_recv_timeout can be NULL, in which case - * the other is used. If both are non-NULL, f_recv_timeout is - * used and f_recv is ignored (as if it were NULL). - * - * \note The two most common use cases are: - * - non-blocking I/O, f_recv != NULL, f_recv_timeout == NULL - * - blocking I/O, f_recv == NULL, f_recv_timout != NULL - * - * \note For DTLS, you need to provide either a non-NULL - * f_recv_timeout callback, or a f_recv that doesn't block. - */ -void mbedtls_ssl_set_bio( mbedtls_ssl_context *ssl, - void *p_bio, - int (*f_send)(void *, const unsigned char *, size_t), - int (*f_recv)(void *, unsigned char *, size_t), - int (*f_recv_timeout)(void *, unsigned char *, size_t, uint32_t) ); - -/** - * \brief Set the timeout period for mbedtls_ssl_read() - * (Default: no timeout.) - * - * \param conf SSL configuration context - * \param timeout Timeout value in milliseconds. - * Use 0 for no timeout (default). - * - * \note With blocking I/O, this will only work if a non-NULL - * \c f_recv_timeout was set with \c mbedtls_ssl_set_bio(). - * With non-blocking I/O, this will only work if timer - * callbacks were set with \c mbedtls_ssl_set_timer_cb(). - * - * \note With non-blocking I/O, you may also skip this function - * altogether and handle timeouts at the application layer. - */ -void mbedtls_ssl_conf_read_timeout( mbedtls_ssl_config *conf, uint32_t timeout ); - -/** - * \brief Set the timer callbacks - * (Mandatory for DTLS.) - * - * \param ssl SSL context - * \param p_timer parameter (context) shared by timer callback - * \param f_set_timer set timer callback - * Accepts an intermediate and a final delay in milliseconcs - * If the final delay is 0, cancels the running timer. - * \param f_get_timer get timer callback. Must return: - * -1 if cancelled - * 0 if none of the delays is expired - * 1 if the intermediate delay only is expired - * 2 if the final delay is expired - */ -void mbedtls_ssl_set_timer_cb( mbedtls_ssl_context *ssl, - void *p_timer, - void (*f_set_timer)(void *, uint32_t int_ms, uint32_t fin_ms), - int (*f_get_timer)(void *) ); - -/** - * \brief Callback type: generate and write session ticket - * - * \note This describes what a callback implementation should do. - * This callback should generate and encrypted and - * authenticated ticket for the session and write it to the - * output buffer. Here, ticket means the opaque ticket part - * of the NewSessionTicket structure of RFC 5077. - * - * \param p_ticket Context for the callback - * \param session SSL session to bo written in the ticket - * \param start Start of the outpur buffer - * \param end End of the output buffer - * \param tlen On exit, holds the length written - * \param lifetime On exit, holds the lifetime of the ticket in seconds - * - * \return 0 if successful, or - * a specific MBEDTLS_ERR_XXX code. - */ -typedef int mbedtls_ssl_ticket_write_t( void *p_ticket, - const mbedtls_ssl_session *session, - unsigned char *start, - const unsigned char *end, - size_t *tlen, - uint32_t *lifetime ); - -/** - * \brief Callback type: parse and load session ticket - * - * \note This describes what a callback implementation should do. - * This callback should parse a session ticket as generated - * by the corresponding mbedtls_ssl_ticket_write_t function, - * and, if the ticket is authentic and valid, load the - * session. - * - * \note The implementation is allowed to modify the first len - * bytes of the input buffer, eg to use it as a temporary - * area for the decrypted ticket contents. - * - * \param p_ticket Context for the callback - * \param session SSL session to be loaded - * \param buf Start of the buffer containing the ticket - * \param len Length of the ticket. - * - * \return 0 if successful, or - * MBEDTLS_ERR_SSL_INVALID_MAC if not authentic, or - * MBEDTLS_ERR_SSL_SESSION_TICKET_EXPIRED if expired, or - * any other non-zero code for other failures. - */ -typedef int mbedtls_ssl_ticket_parse_t( void *p_ticket, - mbedtls_ssl_session *session, - unsigned char *buf, - size_t len ); - -#if defined(MBEDTLS_SSL_SESSION_TICKETS) && defined(MBEDTLS_SSL_SRV_C) -/** - * \brief Configure SSL session ticket callbacks (server only). - * (Default: none.) - * - * \note On server, session tickets are enabled by providing - * non-NULL callbacks. - * - * \note On client, use \c mbedtls_ssl_conf_session_tickets(). - * - * \param conf SSL configuration context - * \param f_ticket_write Callback for writing a ticket - * \param f_ticket_parse Callback for parsing a ticket - * \param p_ticket Context shared by the two callbacks - */ -void mbedtls_ssl_conf_session_tickets_cb( mbedtls_ssl_config *conf, - mbedtls_ssl_ticket_write_t *f_ticket_write, - mbedtls_ssl_ticket_parse_t *f_ticket_parse, - void *p_ticket ); -#endif /* MBEDTLS_SSL_SESSION_TICKETS && MBEDTLS_SSL_SRV_C */ - -/** - * \brief Callback type: generate a cookie - * - * \param ctx Context for the callback - * \param p Buffer to write to, - * must be updated to point right after the cookie - * \param end Pointer to one past the end of the output buffer - * \param info Client ID info that was passed to - * \c mbedtls_ssl_set_client_transport_id() - * \param ilen Length of info in bytes - * - * \return The callback must return 0 on success, - * or a negative error code. - */ -typedef int mbedtls_ssl_cookie_write_t( void *ctx, - unsigned char **p, unsigned char *end, - const unsigned char *info, size_t ilen ); - -/** - * \brief Callback type: verify a cookie - * - * \param ctx Context for the callback - * \param cookie Cookie to verify - * \param clen Length of cookie - * \param info Client ID info that was passed to - * \c mbedtls_ssl_set_client_transport_id() - * \param ilen Length of info in bytes - * - * \return The callback must return 0 if cookie is valid, - * or a negative error code. - */ -typedef int mbedtls_ssl_cookie_check_t( void *ctx, - const unsigned char *cookie, size_t clen, - const unsigned char *info, size_t ilen ); - -#if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY) && defined(MBEDTLS_SSL_SRV_C) -/** - * \brief Register callbacks for DTLS cookies - * (Server only. DTLS only.) - * - * Default: dummy callbacks that fail, in order to force you to - * register working callbacks (and initialize their context). - * - * To disable HelloVerifyRequest, register NULL callbacks. - * - * \warning Disabling hello verification allows your server to be used - * for amplification in DoS attacks against other hosts. - * Only disable if you known this can't happen in your - * particular environment. - * - * \note See comments on \c mbedtls_ssl_handshake() about handling - * the MBEDTLS_ERR_SSL_HELLO_VERIFY_REQUIRED that is expected - * on the first handshake attempt when this is enabled. - * - * \note This is also necessary to handle client reconnection from - * the same port as described in RFC 6347 section 4.2.8 (only - * the variant with cookies is supported currently). See - * comments on \c mbedtls_ssl_read() for details. - * - * \param conf SSL configuration - * \param f_cookie_write Cookie write callback - * \param f_cookie_check Cookie check callback - * \param p_cookie Context for both callbacks - */ -void mbedtls_ssl_conf_dtls_cookies( mbedtls_ssl_config *conf, - mbedtls_ssl_cookie_write_t *f_cookie_write, - mbedtls_ssl_cookie_check_t *f_cookie_check, - void *p_cookie ); - -/** - * \brief Set client's transport-level identification info. - * (Server only. DTLS only.) - * - * This is usually the IP address (and port), but could be - * anything identify the client depending on the underlying - * network stack. Used for HelloVerifyRequest with DTLS. - * This is *not* used to route the actual packets. - * - * \param ssl SSL context - * \param info Transport-level info identifying the client (eg IP + port) - * \param ilen Length of info in bytes - * - * \note An internal copy is made, so the info buffer can be reused. - * - * \return 0 on success, - * MBEDTLS_ERR_SSL_BAD_INPUT_DATA if used on client, - * MBEDTLS_ERR_SSL_ALLOC_FAILED if out of memory. - */ -int mbedtls_ssl_set_client_transport_id( mbedtls_ssl_context *ssl, - const unsigned char *info, - size_t ilen ); - -#endif /* MBEDTLS_SSL_DTLS_HELLO_VERIFY && MBEDTLS_SSL_SRV_C */ - -#if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY) -/** - * \brief Enable or disable anti-replay protection for DTLS. - * (DTLS only, no effect on TLS.) - * Default: enabled. - * - * \param conf SSL configuration - * \param mode MBEDTLS_SSL_ANTI_REPLAY_ENABLED or MBEDTLS_SSL_ANTI_REPLAY_DISABLED. - * - * \warning Disabling this is a security risk unless the application - * protocol handles duplicated packets in a safe way. You - * should not disable this without careful consideration. - * However, if your application already detects duplicated - * packets and needs information about them to adjust its - * transmission strategy, then you'll want to disable this. - */ -void mbedtls_ssl_conf_dtls_anti_replay( mbedtls_ssl_config *conf, char mode ); -#endif /* MBEDTLS_SSL_DTLS_ANTI_REPLAY */ - -#if defined(MBEDTLS_SSL_DTLS_BADMAC_LIMIT) -/** - * \brief Set a limit on the number of records with a bad MAC - * before terminating the connection. - * (DTLS only, no effect on TLS.) - * Default: 0 (disabled). - * - * \param conf SSL configuration - * \param limit Limit, or 0 to disable. - * - * \note If the limit is N, then the connection is terminated when - * the Nth non-authentic record is seen. - * - * \note Records with an invalid header are not counted, only the - * ones going through the authentication-decryption phase. - * - * \note This is a security trade-off related to the fact that it's - * often relatively easy for an active attacker ot inject UDP - * datagrams. On one hand, setting a low limit here makes it - * easier for such an attacker to forcibly terminated a - * connection. On the other hand, a high limit or no limit - * might make us waste resources checking authentication on - * many bogus packets. - */ -void mbedtls_ssl_conf_dtls_badmac_limit( mbedtls_ssl_config *conf, unsigned limit ); -#endif /* MBEDTLS_SSL_DTLS_BADMAC_LIMIT */ - -#if defined(MBEDTLS_SSL_PROTO_DTLS) -/** - * \brief Set retransmit timeout values for the DTLS handshale. - * (DTLS only, no effect on TLS.) - * - * \param conf SSL configuration - * \param min Initial timeout value in milliseconds. - * Default: 1000 (1 second). - * \param max Maximum timeout value in milliseconds. - * Default: 60000 (60 seconds). - * - * \note Default values are from RFC 6347 section 4.2.4.1. - * - * \note Higher values for initial timeout may increase average - * handshake latency. Lower values may increase the risk of - * network congestion by causing more retransmissions. - */ -void mbedtls_ssl_conf_handshake_timeout( mbedtls_ssl_config *conf, uint32_t min, uint32_t max ); -#endif /* MBEDTLS_SSL_PROTO_DTLS */ - -#if defined(MBEDTLS_SSL_SRV_C) -/** - * \brief Set the session cache callbacks (server-side only) - * If not set, no session resuming is done (except if session - * tickets are enabled too). - * - * The session cache has the responsibility to check for stale - * entries based on timeout. See RFC 5246 for recommendations. - * - * Warning: session.peer_cert is cleared by the SSL/TLS layer on - * connection shutdown, so do not cache the pointer! Either set - * it to NULL or make a full copy of the certificate. - * - * The get callback is called once during the initial handshake - * to enable session resuming. The get function has the - * following parameters: (void *parameter, mbedtls_ssl_session *session) - * If a valid entry is found, it should fill the master of - * the session object with the cached values and return 0, - * return 1 otherwise. Optionally peer_cert can be set as well - * if it is properly present in cache entry. - * - * The set callback is called once during the initial handshake - * to enable session resuming after the entire handshake has - * been finished. The set function has the following parameters: - * (void *parameter, const mbedtls_ssl_session *session). The function - * should create a cache entry for future retrieval based on - * the data in the session structure and should keep in mind - * that the mbedtls_ssl_session object presented (and all its referenced - * data) is cleared by the SSL/TLS layer when the connection is - * terminated. It is recommended to add metadata to determine if - * an entry is still valid in the future. Return 0 if - * successfully cached, return 1 otherwise. - * - * \param conf SSL configuration - * \param p_cache parmater (context) for both callbacks - * \param f_get_cache session get callback - * \param f_set_cache session set callback - */ -void mbedtls_ssl_conf_session_cache( mbedtls_ssl_config *conf, - void *p_cache, - int (*f_get_cache)(void *, mbedtls_ssl_session *), - int (*f_set_cache)(void *, const mbedtls_ssl_session *) ); -#endif /* MBEDTLS_SSL_SRV_C */ - -#if defined(MBEDTLS_SSL_CLI_C) -/** - * \brief Request resumption of session (client-side only) - * Session data is copied from presented session structure. - * - * \param ssl SSL context - * \param session session context - * - * \return 0 if successful, - * MBEDTLS_ERR_SSL_ALLOC_FAILED if memory allocation failed, - * MBEDTLS_ERR_SSL_BAD_INPUT_DATA if used server-side or - * arguments are otherwise invalid - * - * \sa mbedtls_ssl_get_session() - */ -int mbedtls_ssl_set_session( mbedtls_ssl_context *ssl, const mbedtls_ssl_session *session ); -#endif /* MBEDTLS_SSL_CLI_C */ - -/** - * \brief Set the list of allowed ciphersuites and the preference - * order. First in the list has the highest preference. - * (Overrides all version specific lists) - * - * The ciphersuites array is not copied, and must remain - * valid for the lifetime of the ssl_config. - * - * Note: The server uses its own preferences - * over the preference of the client unless - * MBEDTLS_SSL_SRV_RESPECT_CLIENT_PREFERENCE is defined! - * - * \param conf SSL configuration - * \param ciphersuites 0-terminated list of allowed ciphersuites - */ -void mbedtls_ssl_conf_ciphersuites( mbedtls_ssl_config *conf, - const int *ciphersuites ); - -/** - * \brief Set the list of allowed ciphersuites and the - * preference order for a specific version of the protocol. - * (Only useful on the server side) - * - * The ciphersuites array is not copied, and must remain - * valid for the lifetime of the ssl_config. - * - * \param conf SSL configuration - * \param ciphersuites 0-terminated list of allowed ciphersuites - * \param major Major version number (only MBEDTLS_SSL_MAJOR_VERSION_3 - * supported) - * \param minor Minor version number (MBEDTLS_SSL_MINOR_VERSION_0, - * MBEDTLS_SSL_MINOR_VERSION_1 and MBEDTLS_SSL_MINOR_VERSION_2, - * MBEDTLS_SSL_MINOR_VERSION_3 supported) - * - * \note With DTLS, use MBEDTLS_SSL_MINOR_VERSION_2 for DTLS 1.0 - * and MBEDTLS_SSL_MINOR_VERSION_3 for DTLS 1.2 - */ -void mbedtls_ssl_conf_ciphersuites_for_version( mbedtls_ssl_config *conf, - const int *ciphersuites, - int major, int minor ); - -#if defined(MBEDTLS_X509_CRT_PARSE_C) -/** - * \brief Set the X.509 security profile used for verification - * - * \param conf SSL configuration - * \param profile Profile to use - */ -void mbedtls_ssl_conf_cert_profile( mbedtls_ssl_config *conf, - const mbedtls_x509_crt_profile *profile ); - -/** - * \brief Set the data required to verify peer certificate - * - * \param conf SSL configuration - * \param ca_chain trusted CA chain (meaning all fully trusted top-level CAs) - * \param ca_crl trusted CA CRLs - */ -void mbedtls_ssl_conf_ca_chain( mbedtls_ssl_config *conf, - mbedtls_x509_crt *ca_chain, - mbedtls_x509_crl *ca_crl ); - -/** - * \brief Set own certificate chain and private key - * - * \note own_cert should contain in order from the bottom up your - * certificate chain. The top certificate (self-signed) - * can be omitted. - * - * \note On server, this function can be called multiple times to - * provision more than one cert/key pair (eg one ECDSA, one - * RSA with SHA-256, one RSA with SHA-1). An adequate - * certificate will be selected according to the client's - * advertised capabilities. In case mutliple certificates are - * adequate, preference is given to the one set by the first - * call to this function, then second, etc. - * - * \note On client, only the first call has any effect. - * - * \param conf SSL configuration - * \param own_cert own public certificate chain - * \param pk_key own private key - * - * \return 0 on success or MBEDTLS_ERR_SSL_ALLOC_FAILED - */ -int mbedtls_ssl_conf_own_cert( mbedtls_ssl_config *conf, - mbedtls_x509_crt *own_cert, - mbedtls_pk_context *pk_key ); -#endif /* MBEDTLS_X509_CRT_PARSE_C */ - -#if defined(MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED) -/** - * \brief Set the Pre Shared Key (PSK) and the expected identity name - * - * \note This is mainly useful for clients. Servers will usually - * want to use \c mbedtls_ssl_conf_psk_cb() instead. - * - * \param conf SSL configuration - * \param psk pointer to the pre-shared key - * \param psk_len pre-shared key length - * \param psk_identity pointer to the pre-shared key identity - * \param psk_identity_len identity key length - * - * \return 0 if successful or MBEDTLS_ERR_SSL_ALLOC_FAILED - */ -int mbedtls_ssl_conf_psk( mbedtls_ssl_config *conf, - const unsigned char *psk, size_t psk_len, - const unsigned char *psk_identity, size_t psk_identity_len ); - - -/** - * \brief Set the Pre Shared Key (PSK) for the current handshake - * - * \note This should only be called inside the PSK callback, - * ie the function passed to \c mbedtls_ssl_conf_psk_cb(). - * - * \param ssl SSL context - * \param psk pointer to the pre-shared key - * \param psk_len pre-shared key length - * - * \return 0 if successful or MBEDTLS_ERR_SSL_ALLOC_FAILED - */ -int mbedtls_ssl_set_hs_psk( mbedtls_ssl_context *ssl, - const unsigned char *psk, size_t psk_len ); - -/** - * \brief Set the PSK callback (server-side only). - * - * If set, the PSK callback is called for each - * handshake where a PSK ciphersuite was negotiated. - * The caller provides the identity received and wants to - * receive the actual PSK data and length. - * - * The callback has the following parameters: (void *parameter, - * mbedtls_ssl_context *ssl, const unsigned char *psk_identity, - * size_t identity_len) - * If a valid PSK identity is found, the callback should use - * \c mbedtls_ssl_set_hs_psk() on the ssl context to set the - * correct PSK and return 0. - * Any other return value will result in a denied PSK identity. - * - * \note If you set a PSK callback using this function, then you - * don't need to set a PSK key and identity using - * \c mbedtls_ssl_conf_psk(). - * - * \param conf SSL configuration - * \param f_psk PSK identity function - * \param p_psk PSK identity parameter - */ -void mbedtls_ssl_conf_psk_cb( mbedtls_ssl_config *conf, - int (*f_psk)(void *, mbedtls_ssl_context *, const unsigned char *, - size_t), - void *p_psk ); -#endif /* MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED */ - -#if defined(MBEDTLS_DHM_C) && defined(MBEDTLS_SSL_SRV_C) -/** - * \brief Set the Diffie-Hellman public P and G values, - * read as hexadecimal strings (server-side only) - * (Default: MBEDTLS_DHM_RFC5114_MODP_2048_[PG]) - * - * \param conf SSL configuration - * \param dhm_P Diffie-Hellman-Merkle modulus - * \param dhm_G Diffie-Hellman-Merkle generator - * - * \return 0 if successful - */ -int mbedtls_ssl_conf_dh_param( mbedtls_ssl_config *conf, const char *dhm_P, const char *dhm_G ); - -/** - * \brief Set the Diffie-Hellman public P and G values, - * read from existing context (server-side only) - * - * \param conf SSL configuration - * \param dhm_ctx Diffie-Hellman-Merkle context - * - * \return 0 if successful - */ -int mbedtls_ssl_conf_dh_param_ctx( mbedtls_ssl_config *conf, mbedtls_dhm_context *dhm_ctx ); -#endif /* MBEDTLS_DHM_C && defined(MBEDTLS_SSL_SRV_C) */ - -#if defined(MBEDTLS_DHM_C) && defined(MBEDTLS_SSL_CLI_C) -/** - * \brief Set the minimum length for Diffie-Hellman parameters. - * (Client-side only.) - * (Default: 1024 bits.) - * - * \param conf SSL configuration - * \param bitlen Minimum bit length of the DHM prime - */ -void mbedtls_ssl_conf_dhm_min_bitlen( mbedtls_ssl_config *conf, - unsigned int bitlen ); -#endif /* MBEDTLS_DHM_C && MBEDTLS_SSL_CLI_C */ - -#if defined(MBEDTLS_ECP_C) -/** - * \brief Set the allowed curves in order of preference. - * (Default: all defined curves.) - * - * On server: this only affects selection of the ECDHE curve; - * the curves used for ECDH and ECDSA are determined by the - * list of available certificates instead. - * - * On client: this affects the list of curves offered for any - * use. The server can override our preference order. - * - * Both sides: limits the set of curves used by peer to the - * listed curves for any use ECDHE and the end-entity - * certificate. - * - * \note This has no influence on which curve are allowed inside the - * certificate chains, see \c mbedtls_ssl_conf_cert_profile() - * for that. For example, if the peer's certificate chain is - * EE -> CA_int -> CA_root, then the allowed curves for EE are - * controlled by \c mbedtls_ssl_conf_curves() but for CA_int - * and CA_root it's \c mbedtls_ssl_conf_cert_profile(). - * - * \note This list should be ordered by decreasing preference - * (preferred curve first). - * - * \param conf SSL configuration - * \param curves Ordered list of allowed curves, - * terminated by MBEDTLS_ECP_DP_NONE. - */ -void mbedtls_ssl_conf_curves( mbedtls_ssl_config *conf, - const mbedtls_ecp_group_id *curves ); -#endif /* MBEDTLS_ECP_C */ - -#if defined(MBEDTLS_KEY_EXCHANGE__SOME__SIGNATURE_ENABLED) -/** - * \brief Set the allowed hashes for signatures during the handshake. - * (Default: all available hashes.) - * - * \note This only affects which hashes are offered and can be used - * for signatures during the handshake. Hashes for message - * authentication and the TLS PRF are controlled by the - * ciphersuite, see \c mbedtls_ssl_conf_ciphersuites(). Hashes - * used for certificate signature are controlled by the - * verification profile, see \c mbedtls_ssl_conf_cert_profile(). - * - * \note This list should be ordered by decreasing preference - * (preferred hash first). - * - * \param conf SSL configuration - * \param hashes Ordered list of allowed signature hashes, - * terminated by \c MBEDTLS_MD_NONE. - */ -void mbedtls_ssl_conf_sig_hashes( mbedtls_ssl_config *conf, - const int *hashes ); -#endif /* MBEDTLS_KEY_EXCHANGE__SOME__SIGNATURE_ENABLED */ - -#if defined(MBEDTLS_X509_CRT_PARSE_C) -/** - * \brief Set hostname for ServerName TLS extension - * (client-side only) - * - * - * \param ssl SSL context - * \param hostname the server hostname - * - * \return 0 if successful or MBEDTLS_ERR_SSL_ALLOC_FAILED - */ -int mbedtls_ssl_set_hostname( mbedtls_ssl_context *ssl, const char *hostname ); -#endif /* MBEDTLS_X509_CRT_PARSE_C */ - -#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION) -/** - * \brief Set own certificate and key for the current handshake - * - * \note Same as \c mbedtls_ssl_conf_own_cert() but for use within - * the SNI callback. - * - * \param ssl SSL context - * \param own_cert own public certificate chain - * \param pk_key own private key - * - * \return 0 on success or MBEDTLS_ERR_SSL_ALLOC_FAILED - */ -int mbedtls_ssl_set_hs_own_cert( mbedtls_ssl_context *ssl, - mbedtls_x509_crt *own_cert, - mbedtls_pk_context *pk_key ); - -/** - * \brief Set the data required to verify peer certificate for the - * current handshake - * - * \note Same as \c mbedtls_ssl_conf_ca_chain() but for use within - * the SNI callback. - * - * \param ssl SSL context - * \param ca_chain trusted CA chain (meaning all fully trusted top-level CAs) - * \param ca_crl trusted CA CRLs - */ -void mbedtls_ssl_set_hs_ca_chain( mbedtls_ssl_context *ssl, - mbedtls_x509_crt *ca_chain, - mbedtls_x509_crl *ca_crl ); - -/** - * \brief Set authmode for the current handshake. - * - * \note Same as \c mbedtls_ssl_conf_authmode() but for use within - * the SNI callback. - * - * \param ssl SSL context - * \param authmode MBEDTLS_SSL_VERIFY_NONE, MBEDTLS_SSL_VERIFY_OPTIONAL or - * MBEDTLS_SSL_VERIFY_REQUIRED - */ -void mbedtls_ssl_set_hs_authmode( mbedtls_ssl_context *ssl, - int authmode ); - -/** - * \brief Set server side ServerName TLS extension callback - * (optional, server-side only). - * - * If set, the ServerName callback is called whenever the - * server receives a ServerName TLS extension from the client - * during a handshake. The ServerName callback has the - * following parameters: (void *parameter, mbedtls_ssl_context *ssl, - * const unsigned char *hostname, size_t len). If a suitable - * certificate is found, the callback must set the - * certificate(s) and key(s) to use with \c - * mbedtls_ssl_set_hs_own_cert() (can be called repeatedly), - * and may optionally adjust the CA and associated CRL with \c - * mbedtls_ssl_set_hs_ca_chain() as well as the client - * authentication mode with \c mbedtls_ssl_set_hs_authmode(), - * then must return 0. If no matching name is found, the - * callback must either set a default cert, or - * return non-zero to abort the handshake at this point. - * - * \param conf SSL configuration - * \param f_sni verification function - * \param p_sni verification parameter - */ -void mbedtls_ssl_conf_sni( mbedtls_ssl_config *conf, - int (*f_sni)(void *, mbedtls_ssl_context *, const unsigned char *, - size_t), - void *p_sni ); -#endif /* MBEDTLS_SSL_SERVER_NAME_INDICATION */ - -#if defined(MBEDTLS_SSL_ALPN) -/** - * \brief Set the supported Application Layer Protocols. - * - * \param conf SSL configuration - * \param protos NULL-terminated list of supported protocols, - * in decreasing preference order. - * - * \return 0 on success, or MBEDTLS_ERR_SSL_BAD_INPUT_DATA. - */ -int mbedtls_ssl_conf_alpn_protocols( mbedtls_ssl_config *conf, const char **protos ); - -/** - * \brief Get the name of the negotiated Application Layer Protocol. - * This function should be called after the handshake is - * completed. - * - * \param ssl SSL context - * - * \return Protcol name, or NULL if no protocol was negotiated. - */ -const char *mbedtls_ssl_get_alpn_protocol( const mbedtls_ssl_context *ssl ); -#endif /* MBEDTLS_SSL_ALPN */ - -/** - * \brief Set the maximum supported version sent from the client side - * and/or accepted at the server side - * (Default: MBEDTLS_SSL_MAX_MAJOR_VERSION, MBEDTLS_SSL_MAX_MINOR_VERSION) - * - * \note This ignores ciphersuites from higher versions. - * - * \note With DTLS, use MBEDTLS_SSL_MINOR_VERSION_2 for DTLS 1.0 and - * MBEDTLS_SSL_MINOR_VERSION_3 for DTLS 1.2 - * - * \param conf SSL configuration - * \param major Major version number (only MBEDTLS_SSL_MAJOR_VERSION_3 supported) - * \param minor Minor version number (MBEDTLS_SSL_MINOR_VERSION_0, - * MBEDTLS_SSL_MINOR_VERSION_1 and MBEDTLS_SSL_MINOR_VERSION_2, - * MBEDTLS_SSL_MINOR_VERSION_3 supported) - */ -void mbedtls_ssl_conf_max_version( mbedtls_ssl_config *conf, int major, int minor ); - -/** - * \brief Set the minimum accepted SSL/TLS protocol version - * (Default: TLS 1.0) - * - * \note Input outside of the SSL_MAX_XXXXX_VERSION and - * SSL_MIN_XXXXX_VERSION range is ignored. - * - * \note MBEDTLS_SSL_MINOR_VERSION_0 (SSL v3) should be avoided. - * - * \note With DTLS, use MBEDTLS_SSL_MINOR_VERSION_2 for DTLS 1.0 and - * MBEDTLS_SSL_MINOR_VERSION_3 for DTLS 1.2 - * - * \param conf SSL configuration - * \param major Major version number (only MBEDTLS_SSL_MAJOR_VERSION_3 supported) - * \param minor Minor version number (MBEDTLS_SSL_MINOR_VERSION_0, - * MBEDTLS_SSL_MINOR_VERSION_1 and MBEDTLS_SSL_MINOR_VERSION_2, - * MBEDTLS_SSL_MINOR_VERSION_3 supported) - */ -void mbedtls_ssl_conf_min_version( mbedtls_ssl_config *conf, int major, int minor ); - -#if defined(MBEDTLS_SSL_FALLBACK_SCSV) && defined(MBEDTLS_SSL_CLI_C) -/** - * \brief Set the fallback flag (client-side only). - * (Default: MBEDTLS_SSL_IS_NOT_FALLBACK). - * - * \note Set to MBEDTLS_SSL_IS_FALLBACK when preparing a fallback - * connection, that is a connection with max_version set to a - * lower value than the value you're willing to use. Such - * fallback connections are not recommended but are sometimes - * necessary to interoperate with buggy (version-intolerant) - * servers. - * - * \warning You should NOT set this to MBEDTLS_SSL_IS_FALLBACK for - * non-fallback connections! This would appear to work for a - * while, then cause failures when the server is upgraded to - * support a newer TLS version. - * - * \param conf SSL configuration - * \param fallback MBEDTLS_SSL_IS_NOT_FALLBACK or MBEDTLS_SSL_IS_FALLBACK - */ -void mbedtls_ssl_conf_fallback( mbedtls_ssl_config *conf, char fallback ); -#endif /* MBEDTLS_SSL_FALLBACK_SCSV && MBEDTLS_SSL_CLI_C */ - -#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC) -/** - * \brief Enable or disable Encrypt-then-MAC - * (Default: MBEDTLS_SSL_ETM_ENABLED) - * - * \note This should always be enabled, it is a security - * improvement, and should not cause any interoperability - * issue (used only if the peer supports it too). - * - * \param conf SSL configuration - * \param etm MBEDTLS_SSL_ETM_ENABLED or MBEDTLS_SSL_ETM_DISABLED - */ -void mbedtls_ssl_conf_encrypt_then_mac( mbedtls_ssl_config *conf, char etm ); -#endif /* MBEDTLS_SSL_ENCRYPT_THEN_MAC */ - -#if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET) -/** - * \brief Enable or disable Extended Master Secret negotiation. - * (Default: MBEDTLS_SSL_EXTENDED_MS_ENABLED) - * - * \note This should always be enabled, it is a security fix to the - * protocol, and should not cause any interoperability issue - * (used only if the peer supports it too). - * - * \param conf SSL configuration - * \param ems MBEDTLS_SSL_EXTENDED_MS_ENABLED or MBEDTLS_SSL_EXTENDED_MS_DISABLED - */ -void mbedtls_ssl_conf_extended_master_secret( mbedtls_ssl_config *conf, char ems ); -#endif /* MBEDTLS_SSL_EXTENDED_MASTER_SECRET */ - -#if defined(MBEDTLS_ARC4_C) -/** - * \brief Disable or enable support for RC4 - * (Default: MBEDTLS_SSL_ARC4_DISABLED) - * - * \warning Use of RC4 in (D)TLS has been prohibited by RFC ???? - * for security reasons. Use at your own risks. - * - * \note This function will likely be removed in future versions as - * RC4 will then be disabled by default at compile time. - * - * \param conf SSL configuration - * \param arc4 MBEDTLS_SSL_ARC4_ENABLED or MBEDTLS_SSL_ARC4_DISABLED - */ -void mbedtls_ssl_conf_arc4_support( mbedtls_ssl_config *conf, char arc4 ); -#endif /* MBEDTLS_ARC4_C */ - -#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH) -/** - * \brief Set the maximum fragment length to emit and/or negotiate - * (Default: MBEDTLS_SSL_MAX_CONTENT_LEN, usually 2^14 bytes) - * (Server: set maximum fragment length to emit, - * usually negotiated by the client during handshake - * (Client: set maximum fragment length to emit *and* - * negotiate with the server during handshake) - * - * \param conf SSL configuration - * \param mfl_code Code for maximum fragment length (allowed values: - * MBEDTLS_SSL_MAX_FRAG_LEN_512, MBEDTLS_SSL_MAX_FRAG_LEN_1024, - * MBEDTLS_SSL_MAX_FRAG_LEN_2048, MBEDTLS_SSL_MAX_FRAG_LEN_4096) - * - * \return 0 if successful or MBEDTLS_ERR_SSL_BAD_INPUT_DATA - */ -int mbedtls_ssl_conf_max_frag_len( mbedtls_ssl_config *conf, unsigned char mfl_code ); -#endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */ - -#if defined(MBEDTLS_SSL_TRUNCATED_HMAC) -/** - * \brief Activate negotiation of truncated HMAC - * (Default: MBEDTLS_SSL_TRUNC_HMAC_DISABLED) - * - * \param conf SSL configuration - * \param truncate Enable or disable (MBEDTLS_SSL_TRUNC_HMAC_ENABLED or - * MBEDTLS_SSL_TRUNC_HMAC_DISABLED) - */ -void mbedtls_ssl_conf_truncated_hmac( mbedtls_ssl_config *conf, int truncate ); -#endif /* MBEDTLS_SSL_TRUNCATED_HMAC */ - -#if defined(MBEDTLS_SSL_CBC_RECORD_SPLITTING) -/** - * \brief Enable / Disable 1/n-1 record splitting - * (Default: MBEDTLS_SSL_CBC_RECORD_SPLITTING_ENABLED) - * - * \note Only affects SSLv3 and TLS 1.0, not higher versions. - * Does not affect non-CBC ciphersuites in any version. - * - * \param conf SSL configuration - * \param split MBEDTLS_SSL_CBC_RECORD_SPLITTING_ENABLED or - * MBEDTLS_SSL_CBC_RECORD_SPLITTING_DISABLED - */ -void mbedtls_ssl_conf_cbc_record_splitting( mbedtls_ssl_config *conf, char split ); -#endif /* MBEDTLS_SSL_CBC_RECORD_SPLITTING */ - -#if defined(MBEDTLS_SSL_SESSION_TICKETS) && defined(MBEDTLS_SSL_CLI_C) -/** - * \brief Enable / Disable session tickets (client only). - * (Default: MBEDTLS_SSL_SESSION_TICKETS_ENABLED.) - * - * \note On server, use \c mbedtls_ssl_conf_session_tickets_cb(). - * - * \param conf SSL configuration - * \param use_tickets Enable or disable (MBEDTLS_SSL_SESSION_TICKETS_ENABLED or - * MBEDTLS_SSL_SESSION_TICKETS_DISABLED) - */ -void mbedtls_ssl_conf_session_tickets( mbedtls_ssl_config *conf, int use_tickets ); -#endif /* MBEDTLS_SSL_SESSION_TICKETS && MBEDTLS_SSL_CLI_C */ - -#if defined(MBEDTLS_SSL_RENEGOTIATION) -/** - * \brief Enable / Disable renegotiation support for connection when - * initiated by peer - * (Default: MBEDTLS_SSL_RENEGOTIATION_DISABLED) - * - * \warning It is recommended to always disable renegotation unless you - * know you need it and you know what you're doing. In the - * past, there has been several issues associated with - * renegotiation or a poor understanding of its properties. - * - * \note Server-side, enabling renegotiation also makes the server - * susceptible to a resource DoS by a malicious client. - * - * \param conf SSL configuration - * \param renegotiation Enable or disable (MBEDTLS_SSL_RENEGOTIATION_ENABLED or - * MBEDTLS_SSL_RENEGOTIATION_DISABLED) - */ -void mbedtls_ssl_conf_renegotiation( mbedtls_ssl_config *conf, int renegotiation ); -#endif /* MBEDTLS_SSL_RENEGOTIATION */ - -/** - * \brief Prevent or allow legacy renegotiation. - * (Default: MBEDTLS_SSL_LEGACY_NO_RENEGOTIATION) - * - * MBEDTLS_SSL_LEGACY_NO_RENEGOTIATION allows connections to - * be established even if the peer does not support - * secure renegotiation, but does not allow renegotiation - * to take place if not secure. - * (Interoperable and secure option) - * - * MBEDTLS_SSL_LEGACY_ALLOW_RENEGOTIATION allows renegotiations - * with non-upgraded peers. Allowing legacy renegotiation - * makes the connection vulnerable to specific man in the - * middle attacks. (See RFC 5746) - * (Most interoperable and least secure option) - * - * MBEDTLS_SSL_LEGACY_BREAK_HANDSHAKE breaks off connections - * if peer does not support secure renegotiation. Results - * in interoperability issues with non-upgraded peers - * that do not support renegotiation altogether. - * (Most secure option, interoperability issues) - * - * \param conf SSL configuration - * \param allow_legacy Prevent or allow (SSL_NO_LEGACY_RENEGOTIATION, - * SSL_ALLOW_LEGACY_RENEGOTIATION or - * MBEDTLS_SSL_LEGACY_BREAK_HANDSHAKE) - */ -void mbedtls_ssl_conf_legacy_renegotiation( mbedtls_ssl_config *conf, int allow_legacy ); - -#if defined(MBEDTLS_SSL_RENEGOTIATION) -/** - * \brief Enforce renegotiation requests. - * (Default: enforced, max_records = 16) - * - * When we request a renegotiation, the peer can comply or - * ignore the request. This function allows us to decide - * whether to enforce our renegotiation requests by closing - * the connection if the peer doesn't comply. - * - * However, records could already be in transit from the peer - * when the request is emitted. In order to increase - * reliability, we can accept a number of records before the - * expected handshake records. - * - * The optimal value is highly dependent on the specific usage - * scenario. - * - * \note With DTLS and server-initiated renegotiation, the - * HelloRequest is retransmited every time mbedtls_ssl_read() times - * out or receives Application Data, until: - * - max_records records have beens seen, if it is >= 0, or - * - the number of retransmits that would happen during an - * actual handshake has been reached. - * Please remember the request might be lost a few times - * if you consider setting max_records to a really low value. - * - * \warning On client, the grace period can only happen during - * mbedtls_ssl_read(), as opposed to mbedtls_ssl_write() and mbedtls_ssl_renegotiate() - * which always behave as if max_record was 0. The reason is, - * if we receive application data from the server, we need a - * place to write it, which only happens during mbedtls_ssl_read(). - * - * \param conf SSL configuration - * \param max_records Use MBEDTLS_SSL_RENEGOTIATION_NOT_ENFORCED if you don't want to - * enforce renegotiation, or a non-negative value to enforce - * it but allow for a grace period of max_records records. - */ -void mbedtls_ssl_conf_renegotiation_enforced( mbedtls_ssl_config *conf, int max_records ); - -/** - * \brief Set record counter threshold for periodic renegotiation. - * (Default: 2^64 - 256.) - * - * Renegotiation is automatically triggered when a record - * counter (outgoing or ingoing) crosses the defined - * threshold. The default value is meant to prevent the - * connection from being closed when the counter is about to - * reached its maximal value (it is not allowed to wrap). - * - * Lower values can be used to enforce policies such as "keys - * must be refreshed every N packets with cipher X". - * - * \param conf SSL configuration - * \param period The threshold value: a big-endian 64-bit number. - * Set to 2^64 - 1 to disable periodic renegotiation - */ -void mbedtls_ssl_conf_renegotiation_period( mbedtls_ssl_config *conf, - const unsigned char period[8] ); -#endif /* MBEDTLS_SSL_RENEGOTIATION */ - -/** - * \brief Return the number of data bytes available to read - * - * \param ssl SSL context - * - * \return how many bytes are available in the read buffer - */ -size_t mbedtls_ssl_get_bytes_avail( const mbedtls_ssl_context *ssl ); - -/** - * \brief Return the result of the certificate verification - * - * \param ssl SSL context - * - * \return 0 if successful, - * -1 if result is not available (eg because the handshake was - * aborted too early), or - * a combination of BADCERT_xxx and BADCRL_xxx flags, see - * x509.h - */ -uint32_t mbedtls_ssl_get_verify_result( const mbedtls_ssl_context *ssl ); - -/** - * \brief Return the name of the current ciphersuite - * - * \param ssl SSL context - * - * \return a string containing the ciphersuite name - */ -const char *mbedtls_ssl_get_ciphersuite( const mbedtls_ssl_context *ssl ); - -/** - * \brief Return the current SSL version (SSLv3/TLSv1/etc) - * - * \param ssl SSL context - * - * \return a string containing the SSL version - */ -const char *mbedtls_ssl_get_version( const mbedtls_ssl_context *ssl ); - -/** - * \brief Return the (maximum) number of bytes added by the record - * layer: header + encryption/MAC overhead (inc. padding) - * - * \param ssl SSL context - * - * \return Current maximum record expansion in bytes, or - * MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE if compression is - * enabled, which makes expansion much less predictable - */ -int mbedtls_ssl_get_record_expansion( const mbedtls_ssl_context *ssl ); - -#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH) -/** - * \brief Return the maximum fragment length (payload, in bytes). - * This is the value negotiated with peer if any, - * or the locally configured value. - * - * \note With DTLS, \c mbedtls_ssl_write() will return an error if - * called with a larger length value. - * With TLS, \c mbedtls_ssl_write() will fragment the input if - * necessary and return the number of bytes written; it is up - * to the caller to call \c mbedtls_ssl_write() again in - * order to send the remaining bytes if any. - * - * \param ssl SSL context - * - * \return Current maximum fragment length. - */ -size_t mbedtls_ssl_get_max_frag_len( const mbedtls_ssl_context *ssl ); -#endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */ - -#if defined(MBEDTLS_X509_CRT_PARSE_C) -/** - * \brief Return the peer certificate from the current connection - * - * Note: Can be NULL in case no certificate was sent during - * the handshake. Different calls for the same connection can - * return the same or different pointers for the same - * certificate and even a different certificate altogether. - * The peer cert CAN change in a single connection if - * renegotiation is performed. - * - * \param ssl SSL context - * - * \return the current peer certificate - */ -const mbedtls_x509_crt *mbedtls_ssl_get_peer_cert( const mbedtls_ssl_context *ssl ); -#endif /* MBEDTLS_X509_CRT_PARSE_C */ - -#if defined(MBEDTLS_SSL_CLI_C) -/** - * \brief Save session in order to resume it later (client-side only) - * Session data is copied to presented session structure. - * - * \warning Currently, peer certificate is lost in the operation. - * - * \param ssl SSL context - * \param session session context - * - * \return 0 if successful, - * MBEDTLS_ERR_SSL_ALLOC_FAILED if memory allocation failed, - * MBEDTLS_ERR_SSL_BAD_INPUT_DATA if used server-side or - * arguments are otherwise invalid - * - * \sa mbedtls_ssl_set_session() - */ -int mbedtls_ssl_get_session( const mbedtls_ssl_context *ssl, mbedtls_ssl_session *session ); -#endif /* MBEDTLS_SSL_CLI_C */ - -/** - * \brief Perform the SSL handshake - * - * \param ssl SSL context - * - * \return 0 if successful, or - * MBEDTLS_ERR_SSL_WANT_READ or MBEDTLS_ERR_SSL_WANT_WRITE, or - * MBEDTLS_ERR_SSL_HELLO_VERIFY_REQUIRED (see below), or - * a specific SSL error code. - * - * \note If this function returns something other than 0 or - * MBEDTLS_ERR_SSL_WANT_READ/WRITE, then the ssl context - * becomes unusable, and you should either free it or call - * \c mbedtls_ssl_session_reset() on it before re-using it. - * - * \note If DTLS is in use, then you may choose to handle - * MBEDTLS_ERR_SSL_HELLO_VERIFY_REQUIRED specially for logging - * purposes, as it is an expected return value rather than an - * actual error, but you still need to reset/free the context. - */ -int mbedtls_ssl_handshake( mbedtls_ssl_context *ssl ); - -/** - * \brief Perform a single step of the SSL handshake - * - * \note The state of the context (ssl->state) will be at - * the following state after execution of this function. - * Do not call this function if state is MBEDTLS_SSL_HANDSHAKE_OVER. - * - * \param ssl SSL context - * - * \return 0 if successful, or - * MBEDTLS_ERR_SSL_WANT_READ or MBEDTLS_ERR_SSL_WANT_WRITE, or - * a specific SSL error code. - */ -int mbedtls_ssl_handshake_step( mbedtls_ssl_context *ssl ); - -#if defined(MBEDTLS_SSL_RENEGOTIATION) -/** - * \brief Initiate an SSL renegotiation on the running connection. - * Client: perform the renegotiation right now. - * Server: request renegotiation, which will be performed - * during the next call to mbedtls_ssl_read() if honored by client. - * - * \param ssl SSL context - * - * \return 0 if successful, or any mbedtls_ssl_handshake() return value. - */ -int mbedtls_ssl_renegotiate( mbedtls_ssl_context *ssl ); -#endif /* MBEDTLS_SSL_RENEGOTIATION */ - -/** - * \brief Read at most 'len' application data bytes - * - * \param ssl SSL context - * \param buf buffer that will hold the data - * \param len maximum number of bytes to read - * - * \return the number of bytes read, or - * 0 for EOF, or - * MBEDTLS_ERR_SSL_WANT_READ or MBEDTLS_ERR_SSL_WANT_WRITE, or - * MBEDTLS_ERR_SSL_CLIENT_RECONNECT (see below), or - * another negative error code. - * - * \note When this function return MBEDTLS_ERR_SSL_CLIENT_RECONNECT - * (which can only happen server-side), it means that a client - * is initiating a new connection using the same source port. - * You can either treat that as a connection close and wait - * for the client to resend a ClientHello, or directly - * continue with \c mbedtls_ssl_handshake() with the same - * context (as it has beeen reset internally). Either way, you - * should make sure this is seen by the application as a new - * connection: application state, if any, should be reset, and - * most importantly the identity of the client must be checked - * again. WARNING: not validating the identity of the client - * again, or not transmitting the new identity to the - * application layer, would allow authentication bypass! - */ -int mbedtls_ssl_read( mbedtls_ssl_context *ssl, unsigned char *buf, size_t len ); - -/** - * \brief Try to write exactly 'len' application data bytes - * - * \warning This function will do partial writes in some cases. If the - * return value is non-negative but less than length, the - * function must be called again with updated arguments: - * buf + ret, len - ret (if ret is the return value) until - * it returns a value equal to the last 'len' argument. - * - * \param ssl SSL context - * \param buf buffer holding the data - * \param len how many bytes must be written - * - * \return the number of bytes actually written (may be less than len), - * or MBEDTLS_ERR_SSL_WANT_WRITE of MBEDTLS_ERR_SSL_WANT_READ, - * or another negative error code. - * - * \note When this function returns MBEDTLS_ERR_SSL_WANT_WRITE/READ, - * it must be called later with the *same* arguments, - * until it returns a positive value. - * - * \note If the requested length is greater than the maximum - * fragment length (either the built-in limit or the one set - * or negotiated with the peer), then: - * - with TLS, less bytes than requested are written. - * - with DTLS, MBEDTLS_ERR_SSL_BAD_INPUT_DATA is returned. - * \c mbedtls_ssl_get_max_frag_len() may be used to query the - * active maximum fragment length. - */ -int mbedtls_ssl_write( mbedtls_ssl_context *ssl, const unsigned char *buf, size_t len ); - -/** - * \brief Send an alert message - * - * \param ssl SSL context - * \param level The alert level of the message - * (MBEDTLS_SSL_ALERT_LEVEL_WARNING or MBEDTLS_SSL_ALERT_LEVEL_FATAL) - * \param message The alert message (SSL_ALERT_MSG_*) - * - * \return 0 if successful, or a specific SSL error code. - */ -int mbedtls_ssl_send_alert_message( mbedtls_ssl_context *ssl, - unsigned char level, - unsigned char message ); -/** - * \brief Notify the peer that the connection is being closed - * - * \param ssl SSL context - */ -int mbedtls_ssl_close_notify( mbedtls_ssl_context *ssl ); - -/** - * \brief Free referenced items in an SSL context and clear memory - * - * \param ssl SSL context - */ -void mbedtls_ssl_free( mbedtls_ssl_context *ssl ); - -/** - * \brief Initialize an SSL configuration context - * Just makes the context ready for - * mbedtls_ssl_config_defaults() or mbedtls_ssl_config_free(). - * - * \note You need to call mbedtls_ssl_config_defaults() unless you - * manually set all of the relevent fields yourself. - * - * \param conf SSL configuration context - */ -void mbedtls_ssl_config_init( mbedtls_ssl_config *conf ); - -/** - * \brief Load reasonnable default SSL configuration values. - * (You need to call mbedtls_ssl_config_init() first.) - * - * \param conf SSL configuration context - * \param endpoint MBEDTLS_SSL_IS_CLIENT or MBEDTLS_SSL_IS_SERVER - * \param transport MBEDTLS_SSL_TRANSPORT_STREAM for TLS, or - * MBEDTLS_SSL_TRANSPORT_DATAGRAM for DTLS - * \param preset a MBEDTLS_SSL_PRESET_XXX value - * (currently unused). - * - * \note See \c mbedtls_ssl_conf_transport() for notes on DTLS. - * - * \return 0 if successful, or - * MBEDTLS_ERR_XXX_ALLOC_FAILED on memory allocation error. - */ -int mbedtls_ssl_config_defaults( mbedtls_ssl_config *conf, - int endpoint, int transport, int preset ); - -/** - * \brief Free an SSL configuration context - * - * \param conf SSL configuration context - */ -void mbedtls_ssl_config_free( mbedtls_ssl_config *conf ); - -/** - * \brief Initialize SSL session structure - * - * \param session SSL session - */ -void mbedtls_ssl_session_init( mbedtls_ssl_session *session ); - -/** - * \brief Free referenced items in an SSL session including the - * peer certificate and clear memory - * - * \param session SSL session - */ -void mbedtls_ssl_session_free( mbedtls_ssl_session *session ); - -#ifdef __cplusplus -} -#endif - -#endif /* ssl.h */ diff --git a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/ssl_cache.h b/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/ssl_cache.h deleted file mode 100644 index 53f043e9..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/ssl_cache.h +++ /dev/null @@ -1,143 +0,0 @@ -/** - * \file ssl_cache.h - * - * \brief SSL session cache implementation - * - * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * This file is part of mbed TLS (https://tls.mbed.org) - */ -#ifndef MBEDTLS_SSL_CACHE_H -#define MBEDTLS_SSL_CACHE_H - -#include "ssl.h" - -#if defined(MBEDTLS_THREADING_C) -#include "threading.h" -#endif - -/** - * \name SECTION: Module settings - * - * The configuration options you can set for this module are in this section. - * Either change them in config.h or define them on the compiler command line. - * \{ - */ - -#if !defined(MBEDTLS_SSL_CACHE_DEFAULT_TIMEOUT) -#define MBEDTLS_SSL_CACHE_DEFAULT_TIMEOUT 86400 /*!< 1 day */ -#endif - -#if !defined(MBEDTLS_SSL_CACHE_DEFAULT_MAX_ENTRIES) -#define MBEDTLS_SSL_CACHE_DEFAULT_MAX_ENTRIES 50 /*!< Maximum entries in cache */ -#endif - -/* \} name SECTION: Module settings */ - -#ifdef __cplusplus -extern "C" { -#endif - -typedef struct mbedtls_ssl_cache_context mbedtls_ssl_cache_context; -typedef struct mbedtls_ssl_cache_entry mbedtls_ssl_cache_entry; - -/** - * \brief This structure is used for storing cache entries - */ -struct mbedtls_ssl_cache_entry -{ -#if defined(MBEDTLS_HAVE_TIME) - time_t timestamp; /*!< entry timestamp */ -#endif - mbedtls_ssl_session session; /*!< entry session */ -#if defined(MBEDTLS_X509_CRT_PARSE_C) - mbedtls_x509_buf peer_cert; /*!< entry peer_cert */ -#endif - mbedtls_ssl_cache_entry *next; /*!< chain pointer */ -}; - -/** - * \brief Cache context - */ -struct mbedtls_ssl_cache_context -{ - mbedtls_ssl_cache_entry *chain; /*!< start of the chain */ - int timeout; /*!< cache entry timeout */ - int max_entries; /*!< maximum entries */ -#if defined(MBEDTLS_THREADING_C) - mbedtls_threading_mutex_t mutex; /*!< mutex */ -#endif -}; - -/** - * \brief Initialize an SSL cache context - * - * \param cache SSL cache context - */ -void mbedtls_ssl_cache_init( mbedtls_ssl_cache_context *cache ); - -/** - * \brief Cache get callback implementation - * (Thread-safe if MBEDTLS_THREADING_C is enabled) - * - * \param data SSL cache context - * \param session session to retrieve entry for - */ -int mbedtls_ssl_cache_get( void *data, mbedtls_ssl_session *session ); - -/** - * \brief Cache set callback implementation - * (Thread-safe if MBEDTLS_THREADING_C is enabled) - * - * \param data SSL cache context - * \param session session to store entry for - */ -int mbedtls_ssl_cache_set( void *data, const mbedtls_ssl_session *session ); - -#if defined(MBEDTLS_HAVE_TIME) -/** - * \brief Set the cache timeout - * (Default: MBEDTLS_SSL_CACHE_DEFAULT_TIMEOUT (1 day)) - * - * A timeout of 0 indicates no timeout. - * - * \param cache SSL cache context - * \param timeout cache entry timeout in seconds - */ -void mbedtls_ssl_cache_set_timeout( mbedtls_ssl_cache_context *cache, int timeout ); -#endif /* MBEDTLS_HAVE_TIME */ - -/** - * \brief Set the cache timeout - * (Default: MBEDTLS_SSL_CACHE_DEFAULT_MAX_ENTRIES (50)) - * - * \param cache SSL cache context - * \param max cache entry maximum - */ -void mbedtls_ssl_cache_set_max_entries( mbedtls_ssl_cache_context *cache, int max ); - -/** - * \brief Free referenced items in a cache context and clear memory - * - * \param cache SSL cache context - */ -void mbedtls_ssl_cache_free( mbedtls_ssl_cache_context *cache ); - -#ifdef __cplusplus -} -#endif - -#endif /* ssl_cache.h */ diff --git a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/ssl_ciphersuites.h b/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/ssl_ciphersuites.h deleted file mode 100644 index 75d4a8a0..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/ssl_ciphersuites.h +++ /dev/null @@ -1,303 +0,0 @@ -/** - * \file ssl_ciphersuites.h - * - * \brief SSL Ciphersuites for mbed TLS - * - * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * This file is part of mbed TLS (https://tls.mbed.org) - */ -#ifndef MBEDTLS_SSL_CIPHERSUITES_H -#define MBEDTLS_SSL_CIPHERSUITES_H - -#include "pk.h" -#include "cipher.h" -#include "md.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/* - * Supported ciphersuites (Official IANA names) - */ -#define MBEDTLS_TLS_RSA_WITH_NULL_MD5 0x01 /**< Weak! */ -#define MBEDTLS_TLS_RSA_WITH_NULL_SHA 0x02 /**< Weak! */ - -#define MBEDTLS_TLS_RSA_WITH_RC4_128_MD5 0x04 -#define MBEDTLS_TLS_RSA_WITH_RC4_128_SHA 0x05 -#define MBEDTLS_TLS_RSA_WITH_DES_CBC_SHA 0x09 /**< Weak! Not in TLS 1.2 */ - -#define MBEDTLS_TLS_RSA_WITH_3DES_EDE_CBC_SHA 0x0A - -#define MBEDTLS_TLS_DHE_RSA_WITH_DES_CBC_SHA 0x15 /**< Weak! Not in TLS 1.2 */ -#define MBEDTLS_TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA 0x16 - -#define MBEDTLS_TLS_PSK_WITH_NULL_SHA 0x2C /**< Weak! */ -#define MBEDTLS_TLS_DHE_PSK_WITH_NULL_SHA 0x2D /**< Weak! */ -#define MBEDTLS_TLS_RSA_PSK_WITH_NULL_SHA 0x2E /**< Weak! */ -#define MBEDTLS_TLS_RSA_WITH_AES_128_CBC_SHA 0x2F - -#define MBEDTLS_TLS_DHE_RSA_WITH_AES_128_CBC_SHA 0x33 -#define MBEDTLS_TLS_RSA_WITH_AES_256_CBC_SHA 0x35 -#define MBEDTLS_TLS_DHE_RSA_WITH_AES_256_CBC_SHA 0x39 - -#define MBEDTLS_TLS_RSA_WITH_NULL_SHA256 0x3B /**< Weak! */ -#define MBEDTLS_TLS_RSA_WITH_AES_128_CBC_SHA256 0x3C /**< TLS 1.2 */ -#define MBEDTLS_TLS_RSA_WITH_AES_256_CBC_SHA256 0x3D /**< TLS 1.2 */ - -#define MBEDTLS_TLS_RSA_WITH_CAMELLIA_128_CBC_SHA 0x41 -#define MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA 0x45 - -#define MBEDTLS_TLS_DHE_RSA_WITH_AES_128_CBC_SHA256 0x67 /**< TLS 1.2 */ -#define MBEDTLS_TLS_DHE_RSA_WITH_AES_256_CBC_SHA256 0x6B /**< TLS 1.2 */ - -#define MBEDTLS_TLS_RSA_WITH_CAMELLIA_256_CBC_SHA 0x84 -#define MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA 0x88 - -#define MBEDTLS_TLS_PSK_WITH_RC4_128_SHA 0x8A -#define MBEDTLS_TLS_PSK_WITH_3DES_EDE_CBC_SHA 0x8B -#define MBEDTLS_TLS_PSK_WITH_AES_128_CBC_SHA 0x8C -#define MBEDTLS_TLS_PSK_WITH_AES_256_CBC_SHA 0x8D - -#define MBEDTLS_TLS_DHE_PSK_WITH_RC4_128_SHA 0x8E -#define MBEDTLS_TLS_DHE_PSK_WITH_3DES_EDE_CBC_SHA 0x8F -#define MBEDTLS_TLS_DHE_PSK_WITH_AES_128_CBC_SHA 0x90 -#define MBEDTLS_TLS_DHE_PSK_WITH_AES_256_CBC_SHA 0x91 - -#define MBEDTLS_TLS_RSA_PSK_WITH_RC4_128_SHA 0x92 -#define MBEDTLS_TLS_RSA_PSK_WITH_3DES_EDE_CBC_SHA 0x93 -#define MBEDTLS_TLS_RSA_PSK_WITH_AES_128_CBC_SHA 0x94 -#define MBEDTLS_TLS_RSA_PSK_WITH_AES_256_CBC_SHA 0x95 - -#define MBEDTLS_TLS_RSA_WITH_AES_128_GCM_SHA256 0x9C /**< TLS 1.2 */ -#define MBEDTLS_TLS_RSA_WITH_AES_256_GCM_SHA384 0x9D /**< TLS 1.2 */ -#define MBEDTLS_TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 0x9E /**< TLS 1.2 */ -#define MBEDTLS_TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 0x9F /**< TLS 1.2 */ - -#define MBEDTLS_TLS_PSK_WITH_AES_128_GCM_SHA256 0xA8 /**< TLS 1.2 */ -#define MBEDTLS_TLS_PSK_WITH_AES_256_GCM_SHA384 0xA9 /**< TLS 1.2 */ -#define MBEDTLS_TLS_DHE_PSK_WITH_AES_128_GCM_SHA256 0xAA /**< TLS 1.2 */ -#define MBEDTLS_TLS_DHE_PSK_WITH_AES_256_GCM_SHA384 0xAB /**< TLS 1.2 */ -#define MBEDTLS_TLS_RSA_PSK_WITH_AES_128_GCM_SHA256 0xAC /**< TLS 1.2 */ -#define MBEDTLS_TLS_RSA_PSK_WITH_AES_256_GCM_SHA384 0xAD /**< TLS 1.2 */ - -#define MBEDTLS_TLS_PSK_WITH_AES_128_CBC_SHA256 0xAE -#define MBEDTLS_TLS_PSK_WITH_AES_256_CBC_SHA384 0xAF -#define MBEDTLS_TLS_PSK_WITH_NULL_SHA256 0xB0 /**< Weak! */ -#define MBEDTLS_TLS_PSK_WITH_NULL_SHA384 0xB1 /**< Weak! */ - -#define MBEDTLS_TLS_DHE_PSK_WITH_AES_128_CBC_SHA256 0xB2 -#define MBEDTLS_TLS_DHE_PSK_WITH_AES_256_CBC_SHA384 0xB3 -#define MBEDTLS_TLS_DHE_PSK_WITH_NULL_SHA256 0xB4 /**< Weak! */ -#define MBEDTLS_TLS_DHE_PSK_WITH_NULL_SHA384 0xB5 /**< Weak! */ - -#define MBEDTLS_TLS_RSA_PSK_WITH_AES_128_CBC_SHA256 0xB6 -#define MBEDTLS_TLS_RSA_PSK_WITH_AES_256_CBC_SHA384 0xB7 -#define MBEDTLS_TLS_RSA_PSK_WITH_NULL_SHA256 0xB8 /**< Weak! */ -#define MBEDTLS_TLS_RSA_PSK_WITH_NULL_SHA384 0xB9 /**< Weak! */ - -#define MBEDTLS_TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256 0xBA /**< TLS 1.2 */ -#define MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256 0xBE /**< TLS 1.2 */ - -#define MBEDTLS_TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256 0xC0 /**< TLS 1.2 */ -#define MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256 0xC4 /**< TLS 1.2 */ - -#define MBEDTLS_TLS_ECDH_ECDSA_WITH_NULL_SHA 0xC001 /**< Weak! */ -#define MBEDTLS_TLS_ECDH_ECDSA_WITH_RC4_128_SHA 0xC002 /**< Not in SSL3! */ -#define MBEDTLS_TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA 0xC003 /**< Not in SSL3! */ -#define MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA 0xC004 /**< Not in SSL3! */ -#define MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA 0xC005 /**< Not in SSL3! */ - -#define MBEDTLS_TLS_ECDHE_ECDSA_WITH_NULL_SHA 0xC006 /**< Weak! */ -#define MBEDTLS_TLS_ECDHE_ECDSA_WITH_RC4_128_SHA 0xC007 /**< Not in SSL3! */ -#define MBEDTLS_TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA 0xC008 /**< Not in SSL3! */ -#define MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA 0xC009 /**< Not in SSL3! */ -#define MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA 0xC00A /**< Not in SSL3! */ - -#define MBEDTLS_TLS_ECDH_RSA_WITH_NULL_SHA 0xC00B /**< Weak! */ -#define MBEDTLS_TLS_ECDH_RSA_WITH_RC4_128_SHA 0xC00C /**< Not in SSL3! */ -#define MBEDTLS_TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA 0xC00D /**< Not in SSL3! */ -#define MBEDTLS_TLS_ECDH_RSA_WITH_AES_128_CBC_SHA 0xC00E /**< Not in SSL3! */ -#define MBEDTLS_TLS_ECDH_RSA_WITH_AES_256_CBC_SHA 0xC00F /**< Not in SSL3! */ - -#define MBEDTLS_TLS_ECDHE_RSA_WITH_NULL_SHA 0xC010 /**< Weak! */ -#define MBEDTLS_TLS_ECDHE_RSA_WITH_RC4_128_SHA 0xC011 /**< Not in SSL3! */ -#define MBEDTLS_TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA 0xC012 /**< Not in SSL3! */ -#define MBEDTLS_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA 0xC013 /**< Not in SSL3! */ -#define MBEDTLS_TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA 0xC014 /**< Not in SSL3! */ - -#define MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 0xC023 /**< TLS 1.2 */ -#define MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384 0xC024 /**< TLS 1.2 */ -#define MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256 0xC025 /**< TLS 1.2 */ -#define MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384 0xC026 /**< TLS 1.2 */ -#define MBEDTLS_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 0xC027 /**< TLS 1.2 */ -#define MBEDTLS_TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 0xC028 /**< TLS 1.2 */ -#define MBEDTLS_TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256 0xC029 /**< TLS 1.2 */ -#define MBEDTLS_TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384 0xC02A /**< TLS 1.2 */ - -#define MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 0xC02B /**< TLS 1.2 */ -#define MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 0xC02C /**< TLS 1.2 */ -#define MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256 0xC02D /**< TLS 1.2 */ -#define MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384 0xC02E /**< TLS 1.2 */ -#define MBEDTLS_TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 0xC02F /**< TLS 1.2 */ -#define MBEDTLS_TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 0xC030 /**< TLS 1.2 */ -#define MBEDTLS_TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256 0xC031 /**< TLS 1.2 */ -#define MBEDTLS_TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384 0xC032 /**< TLS 1.2 */ - -#define MBEDTLS_TLS_ECDHE_PSK_WITH_RC4_128_SHA 0xC033 /**< Not in SSL3! */ -#define MBEDTLS_TLS_ECDHE_PSK_WITH_3DES_EDE_CBC_SHA 0xC034 /**< Not in SSL3! */ -#define MBEDTLS_TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA 0xC035 /**< Not in SSL3! */ -#define MBEDTLS_TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA 0xC036 /**< Not in SSL3! */ -#define MBEDTLS_TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256 0xC037 /**< Not in SSL3! */ -#define MBEDTLS_TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA384 0xC038 /**< Not in SSL3! */ -#define MBEDTLS_TLS_ECDHE_PSK_WITH_NULL_SHA 0xC039 /**< Weak! No SSL3! */ -#define MBEDTLS_TLS_ECDHE_PSK_WITH_NULL_SHA256 0xC03A /**< Weak! No SSL3! */ -#define MBEDTLS_TLS_ECDHE_PSK_WITH_NULL_SHA384 0xC03B /**< Weak! No SSL3! */ - -#define MBEDTLS_TLS_ECDHE_ECDSA_WITH_CAMELLIA_128_CBC_SHA256 0xC072 /**< Not in SSL3! */ -#define MBEDTLS_TLS_ECDHE_ECDSA_WITH_CAMELLIA_256_CBC_SHA384 0xC073 /**< Not in SSL3! */ -#define MBEDTLS_TLS_ECDH_ECDSA_WITH_CAMELLIA_128_CBC_SHA256 0xC074 /**< Not in SSL3! */ -#define MBEDTLS_TLS_ECDH_ECDSA_WITH_CAMELLIA_256_CBC_SHA384 0xC075 /**< Not in SSL3! */ -#define MBEDTLS_TLS_ECDHE_RSA_WITH_CAMELLIA_128_CBC_SHA256 0xC076 /**< Not in SSL3! */ -#define MBEDTLS_TLS_ECDHE_RSA_WITH_CAMELLIA_256_CBC_SHA384 0xC077 /**< Not in SSL3! */ -#define MBEDTLS_TLS_ECDH_RSA_WITH_CAMELLIA_128_CBC_SHA256 0xC078 /**< Not in SSL3! */ -#define MBEDTLS_TLS_ECDH_RSA_WITH_CAMELLIA_256_CBC_SHA384 0xC079 /**< Not in SSL3! */ - -#define MBEDTLS_TLS_RSA_WITH_CAMELLIA_128_GCM_SHA256 0xC07A /**< TLS 1.2 */ -#define MBEDTLS_TLS_RSA_WITH_CAMELLIA_256_GCM_SHA384 0xC07B /**< TLS 1.2 */ -#define MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_128_GCM_SHA256 0xC07C /**< TLS 1.2 */ -#define MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_256_GCM_SHA384 0xC07D /**< TLS 1.2 */ -#define MBEDTLS_TLS_ECDHE_ECDSA_WITH_CAMELLIA_128_GCM_SHA256 0xC086 /**< TLS 1.2 */ -#define MBEDTLS_TLS_ECDHE_ECDSA_WITH_CAMELLIA_256_GCM_SHA384 0xC087 /**< TLS 1.2 */ -#define MBEDTLS_TLS_ECDH_ECDSA_WITH_CAMELLIA_128_GCM_SHA256 0xC088 /**< TLS 1.2 */ -#define MBEDTLS_TLS_ECDH_ECDSA_WITH_CAMELLIA_256_GCM_SHA384 0xC089 /**< TLS 1.2 */ -#define MBEDTLS_TLS_ECDHE_RSA_WITH_CAMELLIA_128_GCM_SHA256 0xC08A /**< TLS 1.2 */ -#define MBEDTLS_TLS_ECDHE_RSA_WITH_CAMELLIA_256_GCM_SHA384 0xC08B /**< TLS 1.2 */ -#define MBEDTLS_TLS_ECDH_RSA_WITH_CAMELLIA_128_GCM_SHA256 0xC08C /**< TLS 1.2 */ -#define MBEDTLS_TLS_ECDH_RSA_WITH_CAMELLIA_256_GCM_SHA384 0xC08D /**< TLS 1.2 */ - -#define MBEDTLS_TLS_PSK_WITH_CAMELLIA_128_GCM_SHA256 0xC08E /**< TLS 1.2 */ -#define MBEDTLS_TLS_PSK_WITH_CAMELLIA_256_GCM_SHA384 0xC08F /**< TLS 1.2 */ -#define MBEDTLS_TLS_DHE_PSK_WITH_CAMELLIA_128_GCM_SHA256 0xC090 /**< TLS 1.2 */ -#define MBEDTLS_TLS_DHE_PSK_WITH_CAMELLIA_256_GCM_SHA384 0xC091 /**< TLS 1.2 */ -#define MBEDTLS_TLS_RSA_PSK_WITH_CAMELLIA_128_GCM_SHA256 0xC092 /**< TLS 1.2 */ -#define MBEDTLS_TLS_RSA_PSK_WITH_CAMELLIA_256_GCM_SHA384 0xC093 /**< TLS 1.2 */ - -#define MBEDTLS_TLS_PSK_WITH_CAMELLIA_128_CBC_SHA256 0xC094 -#define MBEDTLS_TLS_PSK_WITH_CAMELLIA_256_CBC_SHA384 0xC095 -#define MBEDTLS_TLS_DHE_PSK_WITH_CAMELLIA_128_CBC_SHA256 0xC096 -#define MBEDTLS_TLS_DHE_PSK_WITH_CAMELLIA_256_CBC_SHA384 0xC097 -#define MBEDTLS_TLS_RSA_PSK_WITH_CAMELLIA_128_CBC_SHA256 0xC098 -#define MBEDTLS_TLS_RSA_PSK_WITH_CAMELLIA_256_CBC_SHA384 0xC099 -#define MBEDTLS_TLS_ECDHE_PSK_WITH_CAMELLIA_128_CBC_SHA256 0xC09A /**< Not in SSL3! */ -#define MBEDTLS_TLS_ECDHE_PSK_WITH_CAMELLIA_256_CBC_SHA384 0xC09B /**< Not in SSL3! */ - -#define MBEDTLS_TLS_RSA_WITH_AES_128_CCM 0xC09C /**< TLS 1.2 */ -#define MBEDTLS_TLS_RSA_WITH_AES_256_CCM 0xC09D /**< TLS 1.2 */ -#define MBEDTLS_TLS_DHE_RSA_WITH_AES_128_CCM 0xC09E /**< TLS 1.2 */ -#define MBEDTLS_TLS_DHE_RSA_WITH_AES_256_CCM 0xC09F /**< TLS 1.2 */ -#define MBEDTLS_TLS_RSA_WITH_AES_128_CCM_8 0xC0A0 /**< TLS 1.2 */ -#define MBEDTLS_TLS_RSA_WITH_AES_256_CCM_8 0xC0A1 /**< TLS 1.2 */ -#define MBEDTLS_TLS_DHE_RSA_WITH_AES_128_CCM_8 0xC0A2 /**< TLS 1.2 */ -#define MBEDTLS_TLS_DHE_RSA_WITH_AES_256_CCM_8 0xC0A3 /**< TLS 1.2 */ -#define MBEDTLS_TLS_PSK_WITH_AES_128_CCM 0xC0A4 /**< TLS 1.2 */ -#define MBEDTLS_TLS_PSK_WITH_AES_256_CCM 0xC0A5 /**< TLS 1.2 */ -#define MBEDTLS_TLS_DHE_PSK_WITH_AES_128_CCM 0xC0A6 /**< TLS 1.2 */ -#define MBEDTLS_TLS_DHE_PSK_WITH_AES_256_CCM 0xC0A7 /**< TLS 1.2 */ -#define MBEDTLS_TLS_PSK_WITH_AES_128_CCM_8 0xC0A8 /**< TLS 1.2 */ -#define MBEDTLS_TLS_PSK_WITH_AES_256_CCM_8 0xC0A9 /**< TLS 1.2 */ -#define MBEDTLS_TLS_DHE_PSK_WITH_AES_128_CCM_8 0xC0AA /**< TLS 1.2 */ -#define MBEDTLS_TLS_DHE_PSK_WITH_AES_256_CCM_8 0xC0AB /**< TLS 1.2 */ -/* The last two are named with PSK_DHE in the RFC, which looks like a typo */ - -#define MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_CCM 0xC0AC /**< TLS 1.2 */ -#define MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_CCM 0xC0AD /**< TLS 1.2 */ -#define MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8 0xC0AE /**< TLS 1.2 */ -#define MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8 0xC0AF /**< TLS 1.2 */ - -/* Reminder: update mbedtls_ssl_premaster_secret when adding a new key exchange. - * Reminder: update MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED below. - */ -typedef enum { - MBEDTLS_KEY_EXCHANGE_NONE = 0, - MBEDTLS_KEY_EXCHANGE_RSA, - MBEDTLS_KEY_EXCHANGE_DHE_RSA, - MBEDTLS_KEY_EXCHANGE_ECDHE_RSA, - MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA, - MBEDTLS_KEY_EXCHANGE_PSK, - MBEDTLS_KEY_EXCHANGE_DHE_PSK, - MBEDTLS_KEY_EXCHANGE_RSA_PSK, - MBEDTLS_KEY_EXCHANGE_ECDHE_PSK, - MBEDTLS_KEY_EXCHANGE_ECDH_RSA, - MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA, -} mbedtls_key_exchange_type_t; - -#if defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED) || \ - defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED) || \ - defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) || \ - defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED) || \ - defined(MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED) || \ - defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED) || \ - defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) || \ - defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED) -#define MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED -#endif - -typedef struct mbedtls_ssl_ciphersuite_t mbedtls_ssl_ciphersuite_t; - -#define MBEDTLS_CIPHERSUITE_WEAK 0x01 /**< Weak ciphersuite flag */ -#define MBEDTLS_CIPHERSUITE_SHORT_TAG 0x02 /**< Short authentication tag, - eg for CCM_8 */ -#define MBEDTLS_CIPHERSUITE_NODTLS 0x04 /**< Can't be used with DTLS */ - -/** - * \brief This structure is used for storing ciphersuite information - */ -struct mbedtls_ssl_ciphersuite_t -{ - int id; - const char * name; - - mbedtls_cipher_type_t cipher; - mbedtls_md_type_t mac; - mbedtls_key_exchange_type_t key_exchange; - - int min_major_ver; - int min_minor_ver; - int max_major_ver; - int max_minor_ver; - - unsigned char flags; -}; - -const int *mbedtls_ssl_list_ciphersuites( void ); - -const mbedtls_ssl_ciphersuite_t *mbedtls_ssl_ciphersuite_from_string( const char *ciphersuite_name ); -const mbedtls_ssl_ciphersuite_t *mbedtls_ssl_ciphersuite_from_id( int ciphersuite_id ); - -#if defined(MBEDTLS_PK_C) -mbedtls_pk_type_t mbedtls_ssl_get_ciphersuite_sig_pk_alg( const mbedtls_ssl_ciphersuite_t *info ); -#endif - -int mbedtls_ssl_ciphersuite_uses_ec( const mbedtls_ssl_ciphersuite_t *info ); -int mbedtls_ssl_ciphersuite_uses_psk( const mbedtls_ssl_ciphersuite_t *info ); - -#ifdef __cplusplus -} -#endif - -#endif /* ssl_ciphersuites.h */ diff --git a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/ssl_cookie.h b/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/ssl_cookie.h deleted file mode 100644 index 037e1c31..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/ssl_cookie.h +++ /dev/null @@ -1,108 +0,0 @@ -/** - * \file ssl_cookie.h - * - * \brief DTLS cookie callbacks implementation - * - * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * This file is part of mbed TLS (https://tls.mbed.org) - */ -#ifndef MBEDTLS_SSL_COOKIE_H -#define MBEDTLS_SSL_COOKIE_H - -#include "ssl.h" - -#if defined(MBEDTLS_THREADING_C) -#include "threading.h" -#endif - -/** - * \name SECTION: Module settings - * - * The configuration options you can set for this module are in this section. - * Either change them in config.h or define them on the compiler command line. - * \{ - */ -#ifndef MBEDTLS_SSL_COOKIE_TIMEOUT -#define MBEDTLS_SSL_COOKIE_TIMEOUT 60 /**< Default expiration delay of DTLS cookies, in seconds if HAVE_TIME, or in number of cookies issued */ -#endif - -/* \} name SECTION: Module settings */ - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * \brief Context for the default cookie functions. - */ -typedef struct -{ - mbedtls_md_context_t hmac_ctx; /*!< context for the HMAC portion */ -#if !defined(MBEDTLS_HAVE_TIME) - unsigned long serial; /*!< serial number for expiration */ -#endif - unsigned long timeout; /*!< timeout delay, in seconds if HAVE_TIME, - or in number of tickets issued */ - -#if defined(MBEDTLS_THREADING_C) - mbedtls_threading_mutex_t mutex; -#endif -} mbedtls_ssl_cookie_ctx; - -/** - * \brief Initialize cookie context - */ -void mbedtls_ssl_cookie_init( mbedtls_ssl_cookie_ctx *ctx ); - -/** - * \brief Setup cookie context (generate keys) - */ -int mbedtls_ssl_cookie_setup( mbedtls_ssl_cookie_ctx *ctx, - int (*f_rng)(void *, unsigned char *, size_t), - void *p_rng ); - -/** - * \brief Set expiration delay for cookies - * (Default MBEDTLS_SSL_COOKIE_TIMEOUT) - * - * \param ctx Cookie contex - * \param delay Delay, in seconds if HAVE_TIME, or in number of cookies - * issued in the meantime. - * 0 to disable expiration (NOT recommended) - */ -void mbedtls_ssl_cookie_set_timeout( mbedtls_ssl_cookie_ctx *ctx, unsigned long delay ); - -/** - * \brief Free cookie context - */ -void mbedtls_ssl_cookie_free( mbedtls_ssl_cookie_ctx *ctx ); - -/** - * \brief Generate cookie, see \c mbedtls_ssl_cookie_write_t - */ -mbedtls_ssl_cookie_write_t mbedtls_ssl_cookie_write; - -/** - * \brief Verify cookie, see \c mbedtls_ssl_cookie_write_t - */ -mbedtls_ssl_cookie_check_t mbedtls_ssl_cookie_check; - -#ifdef __cplusplus -} -#endif - -#endif /* ssl_cookie.h */ diff --git a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/ssl_internal.h b/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/ssl_internal.h deleted file mode 100644 index 78c748cf..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/ssl_internal.h +++ /dev/null @@ -1,482 +0,0 @@ -/** - * \file ssl_ticket.h - * - * \brief Internal functions shared by the SSL modules - * - * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * This file is part of mbed TLS (https://tls.mbed.org) - */ -#ifndef MBEDTLS_SSL_INTERNAL_H -#define MBEDTLS_SSL_INTERNAL_H - -#include "ssl.h" - -#if defined(MBEDTLS_MD5_C) -#include "md5.h" -#endif - -#if defined(MBEDTLS_SHA1_C) -#include "sha1.h" -#endif - -#if defined(MBEDTLS_SHA256_C) -#include "sha256.h" -#endif - -#if defined(MBEDTLS_SHA512_C) -#include "sha512.h" -#endif - -#if ( defined(__ARMCC_VERSION) || defined(_MSC_VER) ) && \ - !defined(inline) && !defined(__cplusplus) -#define inline __inline -#endif - -/* Determine minimum supported version */ -#define MBEDTLS_SSL_MIN_MAJOR_VERSION MBEDTLS_SSL_MAJOR_VERSION_3 - -#if defined(MBEDTLS_SSL_PROTO_SSL3) -#define MBEDTLS_SSL_MIN_MINOR_VERSION MBEDTLS_SSL_MINOR_VERSION_0 -#else -#if defined(MBEDTLS_SSL_PROTO_TLS1) -#define MBEDTLS_SSL_MIN_MINOR_VERSION MBEDTLS_SSL_MINOR_VERSION_1 -#else -#if defined(MBEDTLS_SSL_PROTO_TLS1_1) -#define MBEDTLS_SSL_MIN_MINOR_VERSION MBEDTLS_SSL_MINOR_VERSION_2 -#else -#if defined(MBEDTLS_SSL_PROTO_TLS1_2) -#define MBEDTLS_SSL_MIN_MINOR_VERSION MBEDTLS_SSL_MINOR_VERSION_3 -#endif /* MBEDTLS_SSL_PROTO_TLS1_2 */ -#endif /* MBEDTLS_SSL_PROTO_TLS1_1 */ -#endif /* MBEDTLS_SSL_PROTO_TLS1 */ -#endif /* MBEDTLS_SSL_PROTO_SSL3 */ - -/* Determine maximum supported version */ -#define MBEDTLS_SSL_MAX_MAJOR_VERSION MBEDTLS_SSL_MAJOR_VERSION_3 - -#if defined(MBEDTLS_SSL_PROTO_TLS1_2) -#define MBEDTLS_SSL_MAX_MINOR_VERSION MBEDTLS_SSL_MINOR_VERSION_3 -#else -#if defined(MBEDTLS_SSL_PROTO_TLS1_1) -#define MBEDTLS_SSL_MAX_MINOR_VERSION MBEDTLS_SSL_MINOR_VERSION_2 -#else -#if defined(MBEDTLS_SSL_PROTO_TLS1) -#define MBEDTLS_SSL_MAX_MINOR_VERSION MBEDTLS_SSL_MINOR_VERSION_1 -#else -#if defined(MBEDTLS_SSL_PROTO_SSL3) -#define MBEDTLS_SSL_MAX_MINOR_VERSION MBEDTLS_SSL_MINOR_VERSION_0 -#endif /* MBEDTLS_SSL_PROTO_SSL3 */ -#endif /* MBEDTLS_SSL_PROTO_TLS1 */ -#endif /* MBEDTLS_SSL_PROTO_TLS1_1 */ -#endif /* MBEDTLS_SSL_PROTO_TLS1_2 */ - -#define MBEDTLS_SSL_INITIAL_HANDSHAKE 0 -#define MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS 1 /* In progress */ -#define MBEDTLS_SSL_RENEGOTIATION_DONE 2 /* Done or aborted */ -#define MBEDTLS_SSL_RENEGOTIATION_PENDING 3 /* Requested (server only) */ - -/* - * DTLS retransmission states, see RFC 6347 4.2.4 - * - * The SENDING state is merged in PREPARING for initial sends, - * but is distinct for resends. - * - * Note: initial state is wrong for server, but is not used anyway. - */ -#define MBEDTLS_SSL_RETRANS_PREPARING 0 -#define MBEDTLS_SSL_RETRANS_SENDING 1 -#define MBEDTLS_SSL_RETRANS_WAITING 2 -#define MBEDTLS_SSL_RETRANS_FINISHED 3 - -/* - * Allow extra bytes for record, authentication and encryption overhead: - * counter (8) + header (5) + IV(16) + MAC (16-48) + padding (0-256) - * and allow for a maximum of 1024 of compression expansion if - * enabled. - */ -#if defined(MBEDTLS_ZLIB_SUPPORT) -#define MBEDTLS_SSL_COMPRESSION_ADD 1024 -#else -#define MBEDTLS_SSL_COMPRESSION_ADD 0 -#endif - -#if defined(MBEDTLS_ARC4_C) || defined(MBEDTLS_CIPHER_MODE_CBC) -/* Ciphersuites using HMAC */ -#if defined(MBEDTLS_SHA512_C) -#define MBEDTLS_SSL_MAC_ADD 48 /* SHA-384 used for HMAC */ -#elif defined(MBEDTLS_SHA256_C) -#define MBEDTLS_SSL_MAC_ADD 32 /* SHA-256 used for HMAC */ -#else -#define MBEDTLS_SSL_MAC_ADD 20 /* SHA-1 used for HMAC */ -#endif -#else -/* AEAD ciphersuites: GCM and CCM use a 128 bits tag */ -#define MBEDTLS_SSL_MAC_ADD 16 -#endif - -#if defined(MBEDTLS_CIPHER_MODE_CBC) -#define MBEDTLS_SSL_PADDING_ADD 256 -#else -#define MBEDTLS_SSL_PADDING_ADD 0 -#endif - -#define MBEDTLS_SSL_BUFFER_LEN ( MBEDTLS_SSL_MAX_CONTENT_LEN \ - + MBEDTLS_SSL_COMPRESSION_ADD \ - + 29 /* counter + header + IV */ \ - + MBEDTLS_SSL_MAC_ADD \ - + MBEDTLS_SSL_PADDING_ADD \ - ) - -/* - * TLS extension flags (for extensions with outgoing ServerHello content - * that need it (e.g. for RENEGOTIATION_INFO the server already knows because - * of state of the renegotiation flag, so no indicator is required) - */ -#define MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS_PRESENT (1 << 0) - -#ifdef __cplusplus -extern "C" { -#endif - -/* - * This structure contains the parameters only needed during handshake. - */ -struct mbedtls_ssl_handshake_params -{ - /* - * Handshake specific crypto variables - */ - int sig_alg; /*!< Hash algorithm for signature */ - int cert_type; /*!< Requested cert type */ - int verify_sig_alg; /*!< Signature algorithm for verify */ -#if defined(MBEDTLS_DHM_C) - mbedtls_dhm_context dhm_ctx; /*!< DHM key exchange */ -#endif -#if defined(MBEDTLS_ECDH_C) - mbedtls_ecdh_context ecdh_ctx; /*!< ECDH key exchange */ -#endif -#if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C) - const mbedtls_ecp_curve_info **curves; /*!< Supported elliptic curves */ -#endif -#if defined(MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED) - unsigned char *psk; /*!< PSK from the callback */ - size_t psk_len; /*!< Length of PSK from callback */ -#endif -#if defined(MBEDTLS_X509_CRT_PARSE_C) - mbedtls_ssl_key_cert *key_cert; /*!< chosen key/cert pair (server) */ -#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION) - int sni_authmode; /*!< authmode from SNI callback */ - mbedtls_ssl_key_cert *sni_key_cert; /*!< key/cert list from SNI */ - mbedtls_x509_crt *sni_ca_chain; /*!< trusted CAs from SNI callback */ - mbedtls_x509_crl *sni_ca_crl; /*!< trusted CAs CRLs from SNI */ -#endif -#endif /* MBEDTLS_X509_CRT_PARSE_C */ -#if defined(MBEDTLS_SSL_PROTO_DTLS) - unsigned int out_msg_seq; /*!< Outgoing handshake sequence number */ - unsigned int in_msg_seq; /*!< Incoming handshake sequence number */ - - unsigned char *verify_cookie; /*!< Cli: HelloVerifyRequest cookie - Srv: unused */ - unsigned char verify_cookie_len; /*!< Cli: cookie length - Srv: flag for sending a cookie */ - - unsigned char *hs_msg; /*!< Reassembled handshake message */ - - uint32_t retransmit_timeout; /*!< Current value of timeout */ - unsigned char retransmit_state; /*!< Retransmission state */ - mbedtls_ssl_flight_item *flight; /*!< Current outgoing flight */ - mbedtls_ssl_flight_item *cur_msg; /*!< Current message in flight */ - unsigned int in_flight_start_seq; /*!< Minimum message sequence in the - flight being received */ - mbedtls_ssl_transform *alt_transform_out; /*!< Alternative transform for - resending messages */ - unsigned char alt_out_ctr[8]; /*!< Alternative record epoch/counter - for resending messages */ -#endif - - /* - * Checksum contexts - */ -#if defined(MBEDTLS_SSL_PROTO_SSL3) || defined(MBEDTLS_SSL_PROTO_TLS1) || \ - defined(MBEDTLS_SSL_PROTO_TLS1_1) - mbedtls_md5_context fin_md5; - mbedtls_sha1_context fin_sha1; -#endif -#if defined(MBEDTLS_SSL_PROTO_TLS1_2) -#if defined(MBEDTLS_SHA256_C) - mbedtls_sha256_context fin_sha256; -#endif -#if defined(MBEDTLS_SHA512_C) - mbedtls_sha512_context fin_sha512; -#endif -#endif /* MBEDTLS_SSL_PROTO_TLS1_2 */ - - void (*update_checksum)(mbedtls_ssl_context *, const unsigned char *, size_t); - void (*calc_verify)(mbedtls_ssl_context *, unsigned char *); - void (*calc_finished)(mbedtls_ssl_context *, unsigned char *, int); - int (*tls_prf)(const unsigned char *, size_t, const char *, - const unsigned char *, size_t, - unsigned char *, size_t); - - size_t pmslen; /*!< premaster length */ - - unsigned char randbytes[64]; /*!< random bytes */ - unsigned char premaster[MBEDTLS_PREMASTER_SIZE]; - /*!< premaster secret */ - - int resume; /*!< session resume indicator*/ - int max_major_ver; /*!< max. major version client*/ - int max_minor_ver; /*!< max. minor version client*/ - int cli_exts; /*!< client extension presence*/ - -#if defined(MBEDTLS_SSL_SESSION_TICKETS) - int new_session_ticket; /*!< use NewSessionTicket? */ -#endif /* MBEDTLS_SSL_SESSION_TICKETS */ -#if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET) - int extended_ms; /*!< use Extended Master Secret? */ -#endif -}; - -/* - * This structure contains a full set of runtime transform parameters - * either in negotiation or active. - */ -struct mbedtls_ssl_transform -{ - /* - * Session specific crypto layer - */ - const mbedtls_ssl_ciphersuite_t *ciphersuite_info; - /*!< Chosen cipersuite_info */ - unsigned int keylen; /*!< symmetric key length (bytes) */ - size_t minlen; /*!< min. ciphertext length */ - size_t ivlen; /*!< IV length */ - size_t fixed_ivlen; /*!< Fixed part of IV (AEAD) */ - size_t maclen; /*!< MAC length */ - - unsigned char iv_enc[16]; /*!< IV (encryption) */ - unsigned char iv_dec[16]; /*!< IV (decryption) */ - -#if defined(MBEDTLS_SSL_PROTO_SSL3) - /* Needed only for SSL v3.0 secret */ - unsigned char mac_enc[20]; /*!< SSL v3.0 secret (enc) */ - unsigned char mac_dec[20]; /*!< SSL v3.0 secret (dec) */ -#endif /* MBEDTLS_SSL_PROTO_SSL3 */ - - mbedtls_md_context_t md_ctx_enc; /*!< MAC (encryption) */ - mbedtls_md_context_t md_ctx_dec; /*!< MAC (decryption) */ - - mbedtls_cipher_context_t cipher_ctx_enc; /*!< encryption context */ - mbedtls_cipher_context_t cipher_ctx_dec; /*!< decryption context */ - - /* - * Session specific compression layer - */ -#if defined(MBEDTLS_ZLIB_SUPPORT) - z_stream ctx_deflate; /*!< compression context */ - z_stream ctx_inflate; /*!< decompression context */ -#endif -}; - -#if defined(MBEDTLS_X509_CRT_PARSE_C) -/* - * List of certificate + private key pairs - */ -struct mbedtls_ssl_key_cert -{ - mbedtls_x509_crt *cert; /*!< cert */ - mbedtls_pk_context *key; /*!< private key */ - mbedtls_ssl_key_cert *next; /*!< next key/cert pair */ -}; -#endif /* MBEDTLS_X509_CRT_PARSE_C */ - -#if defined(MBEDTLS_SSL_PROTO_DTLS) -/* - * List of handshake messages kept around for resending - */ -struct mbedtls_ssl_flight_item -{ - unsigned char *p; /*!< message, including handshake headers */ - size_t len; /*!< length of p */ - unsigned char type; /*!< type of the message: handshake or CCS */ - mbedtls_ssl_flight_item *next; /*!< next handshake message(s) */ -}; -#endif /* MBEDTLS_SSL_PROTO_DTLS */ - - -/** - * \brief Free referenced items in an SSL transform context and clear - * memory - * - * \param transform SSL transform context - */ -void mbedtls_ssl_transform_free( mbedtls_ssl_transform *transform ); - -/** - * \brief Free referenced items in an SSL handshake context and clear - * memory - * - * \param handshake SSL handshake context - */ -void mbedtls_ssl_handshake_free( mbedtls_ssl_handshake_params *handshake ); - -int mbedtls_ssl_handshake_client_step( mbedtls_ssl_context *ssl ); -int mbedtls_ssl_handshake_server_step( mbedtls_ssl_context *ssl ); -void mbedtls_ssl_handshake_wrapup( mbedtls_ssl_context *ssl ); - -int mbedtls_ssl_send_fatal_handshake_failure( mbedtls_ssl_context *ssl ); - -void mbedtls_ssl_reset_checksum( mbedtls_ssl_context *ssl ); -int mbedtls_ssl_derive_keys( mbedtls_ssl_context *ssl ); - -int mbedtls_ssl_read_record( mbedtls_ssl_context *ssl ); -int mbedtls_ssl_fetch_input( mbedtls_ssl_context *ssl, size_t nb_want ); - -int mbedtls_ssl_write_record( mbedtls_ssl_context *ssl ); -int mbedtls_ssl_flush_output( mbedtls_ssl_context *ssl ); - -int mbedtls_ssl_parse_certificate( mbedtls_ssl_context *ssl ); -int mbedtls_ssl_write_certificate( mbedtls_ssl_context *ssl ); - -int mbedtls_ssl_parse_change_cipher_spec( mbedtls_ssl_context *ssl ); -int mbedtls_ssl_write_change_cipher_spec( mbedtls_ssl_context *ssl ); - -int mbedtls_ssl_parse_finished( mbedtls_ssl_context *ssl ); -int mbedtls_ssl_write_finished( mbedtls_ssl_context *ssl ); - -void mbedtls_ssl_optimize_checksum( mbedtls_ssl_context *ssl, - const mbedtls_ssl_ciphersuite_t *ciphersuite_info ); - -#if defined(MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED) -int mbedtls_ssl_psk_derive_premaster( mbedtls_ssl_context *ssl, mbedtls_key_exchange_type_t key_ex ); -#endif - -#if defined(MBEDTLS_PK_C) -unsigned char mbedtls_ssl_sig_from_pk( mbedtls_pk_context *pk ); -mbedtls_pk_type_t mbedtls_ssl_pk_alg_from_sig( unsigned char sig ); -#endif - -mbedtls_md_type_t mbedtls_ssl_md_alg_from_hash( unsigned char hash ); -unsigned char mbedtls_ssl_hash_from_md_alg( int md ); - -#if defined(MBEDTLS_ECP_C) -int mbedtls_ssl_check_curve( const mbedtls_ssl_context *ssl, mbedtls_ecp_group_id grp_id ); -#endif - -#if defined(MBEDTLS_KEY_EXCHANGE__SOME__SIGNATURE_ENABLED) -int mbedtls_ssl_check_sig_hash( const mbedtls_ssl_context *ssl, - mbedtls_md_type_t md ); -#endif - -#if defined(MBEDTLS_X509_CRT_PARSE_C) -static inline mbedtls_pk_context *mbedtls_ssl_own_key( mbedtls_ssl_context *ssl ) -{ - mbedtls_ssl_key_cert *key_cert; - - if( ssl->handshake != NULL && ssl->handshake->key_cert != NULL ) - key_cert = ssl->handshake->key_cert; - else - key_cert = ssl->conf->key_cert; - - return( key_cert == NULL ? NULL : key_cert->key ); -} - -static inline mbedtls_x509_crt *mbedtls_ssl_own_cert( mbedtls_ssl_context *ssl ) -{ - mbedtls_ssl_key_cert *key_cert; - - if( ssl->handshake != NULL && ssl->handshake->key_cert != NULL ) - key_cert = ssl->handshake->key_cert; - else - key_cert = ssl->conf->key_cert; - - return( key_cert == NULL ? NULL : key_cert->cert ); -} - -/* - * Check usage of a certificate wrt extensions: - * keyUsage, extendedKeyUsage (later), and nSCertType (later). - * - * Warning: cert_endpoint is the endpoint of the cert (ie, of our peer when we - * check a cert we received from them)! - * - * Return 0 if everything is OK, -1 if not. - */ -int mbedtls_ssl_check_cert_usage( const mbedtls_x509_crt *cert, - const mbedtls_ssl_ciphersuite_t *ciphersuite, - int cert_endpoint, - uint32_t *flags ); -#endif /* MBEDTLS_X509_CRT_PARSE_C */ - -void mbedtls_ssl_write_version( int major, int minor, int transport, - unsigned char ver[2] ); -void mbedtls_ssl_read_version( int *major, int *minor, int transport, - const unsigned char ver[2] ); - -static inline size_t mbedtls_ssl_hdr_len( const mbedtls_ssl_context *ssl ) -{ -#if defined(MBEDTLS_SSL_PROTO_DTLS) - if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM ) - return( 13 ); -#else - ((void) ssl); -#endif - return( 5 ); -} - -static inline size_t mbedtls_ssl_hs_hdr_len( const mbedtls_ssl_context *ssl ) -{ -#if defined(MBEDTLS_SSL_PROTO_DTLS) - if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM ) - return( 12 ); -#else - ((void) ssl); -#endif - return( 4 ); -} - -#if defined(MBEDTLS_SSL_PROTO_DTLS) -void mbedtls_ssl_send_flight_completed( mbedtls_ssl_context *ssl ); -void mbedtls_ssl_recv_flight_completed( mbedtls_ssl_context *ssl ); -int mbedtls_ssl_resend( mbedtls_ssl_context *ssl ); -#endif - -/* Visible for testing purposes only */ -#if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY) -int mbedtls_ssl_dtls_replay_check( mbedtls_ssl_context *ssl ); -void mbedtls_ssl_dtls_replay_update( mbedtls_ssl_context *ssl ); -#endif - -/* constant-time buffer comparison */ -static inline int mbedtls_ssl_safer_memcmp( const void *a, const void *b, size_t n ) -{ - size_t i; - const unsigned char *A = (const unsigned char *) a; - const unsigned char *B = (const unsigned char *) b; - unsigned char diff = 0; - - for( i = 0; i < n; i++ ) - diff |= A[i] ^ B[i]; - - return( diff ); -} - -#ifdef __cplusplus -} -#endif - -#endif /* ssl_internal.h */ diff --git a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/ssl_ticket.h b/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/ssl_ticket.h deleted file mode 100644 index 7c6bc61b..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/ssl_ticket.h +++ /dev/null @@ -1,135 +0,0 @@ -/** - * \file ssl_ticket.h - * - * \brief TLS server ticket callbacks implementation - * - * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * This file is part of mbed TLS (https://tls.mbed.org) - */ -#ifndef MBEDTLS_SSL_TICKET_H -#define MBEDTLS_SSL_TICKET_H - -/* - * This implementation of the session ticket callbacks includes key - * management, rotating the keys periodically in order to preserve forward - * secrecy, when MBEDTLS_HAVE_TIME is defined. - */ - -#include "ssl.h" -#include "cipher.h" - -#if defined(MBEDTLS_THREADING_C) -#include "threading.h" -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * \brief Information for session ticket protection - */ -typedef struct -{ - unsigned char name[4]; /*!< random key identifier */ - uint32_t generation_time; /*!< key generation timestamp (seconds) */ - mbedtls_cipher_context_t ctx; /*!< context for auth enc/decryption */ -} -mbedtls_ssl_ticket_key; - -/** - * \brief Context for session ticket handling functions - */ -typedef struct -{ - mbedtls_ssl_ticket_key keys[2]; /*!< ticket protection keys */ - unsigned char active; /*!< index of the currently active key */ - - uint32_t ticket_lifetime; /*!< lifetime of tickets in seconds */ - - /** Callback for getting (pseudo-)random numbers */ - int (*f_rng)(void *, unsigned char *, size_t); - void *p_rng; /*!< context for the RNG function */ - -#if defined(MBEDTLS_THREADING_C) - mbedtls_threading_mutex_t mutex; -#endif -} -mbedtls_ssl_ticket_context; - -/** - * \brief Initialize a ticket context. - * (Just make it ready for mbedtls_ssl_ticket_setup() - * or mbedtls_ssl_ticket_free().) - * - * \param ctx Context to be initialized - */ -void mbedtls_ssl_ticket_init( mbedtls_ssl_ticket_context *ctx ); - -/** - * \brief Prepare context to be actually used - * - * \param ctx Context to be set up - * \param f_rng RNG callback function - * \param p_rng RNG callback context - * \param cipher AEAD cipher to use for ticket protection. - * Recommended value: MBEDTLS_CIPHER_AES_256_GCM. - * \param lifetime Tickets lifetime in seconds - * Recommended value: 86400 (one day). - * - * \note It is highly recommended to select a cipher that is at - * least as strong as the the strongest ciphersuite - * supported. Usually that means a 256-bit key. - * - * \note The lifetime of the keys is twice the lifetime of tickets. - * It is recommended to pick a reasonnable lifetime so as not - * to negate the benefits of forward secrecy. - * - * \return 0 if successful, - * or a specific MBEDTLS_ERR_XXX error code - */ -int mbedtls_ssl_ticket_setup( mbedtls_ssl_ticket_context *ctx, - int (*f_rng)(void *, unsigned char *, size_t), void *p_rng, - mbedtls_cipher_type_t cipher, - uint32_t lifetime ); - -/** - * \brief Implementation of the ticket write callback - * - * \note See \c mbedlts_ssl_ticket_write_t for description - */ -mbedtls_ssl_ticket_write_t mbedtls_ssl_ticket_write; - -/** - * \brief Implementation of the ticket parse callback - * - * \note See \c mbedlts_ssl_ticket_parse_t for description - */ -mbedtls_ssl_ticket_parse_t mbedtls_ssl_ticket_parse; - -/** - * \brief Free a context's content and zeroize it. - * - * \param ctx Context to be cleaned up - */ -void mbedtls_ssl_ticket_free( mbedtls_ssl_ticket_context *ctx ); - -#ifdef __cplusplus -} -#endif - -#endif /* ssl_ticket.h */ diff --git a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/threading.h b/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/threading.h deleted file mode 100644 index c39cbf24..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/threading.h +++ /dev/null @@ -1,104 +0,0 @@ -/** - * \file threading.h - * - * \brief Threading abstraction layer - * - * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * This file is part of mbed TLS (https://tls.mbed.org) - */ -#ifndef MBEDTLS_THREADING_H -#define MBEDTLS_THREADING_H - -#if !defined(MBEDTLS_CONFIG_FILE) -#include "config.h" -#else -#include MBEDTLS_CONFIG_FILE -#endif - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -#define MBEDTLS_ERR_THREADING_FEATURE_UNAVAILABLE -0x001A /**< The selected feature is not available. */ -#define MBEDTLS_ERR_THREADING_BAD_INPUT_DATA -0x001C /**< Bad input parameters to function. */ -#define MBEDTLS_ERR_THREADING_MUTEX_ERROR -0x001E /**< Locking / unlocking / free failed with error code. */ - -#if defined(MBEDTLS_THREADING_PTHREAD) -#include -typedef struct -{ - pthread_mutex_t mutex; - char is_valid; -} mbedtls_threading_mutex_t; -#endif - -#if defined(MBEDTLS_THREADING_ALT) -/* You should define the mbedtls_threading_mutex_t type in your header */ -#include "threading_alt.h" - -/** - * \brief Set your alternate threading implementation function - * pointers and initialize global mutexes. If used, this - * function must be called once in the main thread before any - * other mbed TLS function is called, and - * mbedtls_threading_free_alt() must be called once in the main - * thread after all other mbed TLS functions. - * - * \note mutex_init() and mutex_free() don't return a status code. - * If mutex_init() fails, it should leave its argument (the - * mutex) in a state such that mutex_lock() will fail when - * called with this argument. - * - * \param mutex_init the init function implementation - * \param mutex_free the free function implementation - * \param mutex_lock the lock function implementation - * \param mutex_unlock the unlock function implementation - */ -void mbedtls_threading_set_alt( void (*mutex_init)( mbedtls_threading_mutex_t * ), - void (*mutex_free)( mbedtls_threading_mutex_t * ), - int (*mutex_lock)( mbedtls_threading_mutex_t * ), - int (*mutex_unlock)( mbedtls_threading_mutex_t * ) ); - -/** - * \brief Free global mutexes. - */ -void mbedtls_threading_free_alt( void ); -#endif /* MBEDTLS_THREADING_ALT */ - -/* - * The function pointers for mutex_init, mutex_free, mutex_ and mutex_unlock - * - * All these functions are expected to work or the result will be undefined. - */ -extern void (*mbedtls_mutex_init)( mbedtls_threading_mutex_t *mutex ); -extern void (*mbedtls_mutex_free)( mbedtls_threading_mutex_t *mutex ); -extern int (*mbedtls_mutex_lock)( mbedtls_threading_mutex_t *mutex ); -extern int (*mbedtls_mutex_unlock)( mbedtls_threading_mutex_t *mutex ); - -/* - * Global mutexes - */ -extern mbedtls_threading_mutex_t mbedtls_threading_readdir_mutex; -extern mbedtls_threading_mutex_t mbedtls_threading_gmtime_mutex; - -#ifdef __cplusplus -} -#endif - -#endif /* threading.h */ diff --git a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/timing.h b/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/timing.h deleted file mode 100644 index ae7a713e..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/timing.h +++ /dev/null @@ -1,141 +0,0 @@ -/** - * \file timing.h - * - * \brief Portable interface to the CPU cycle counter - * - * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * This file is part of mbed TLS (https://tls.mbed.org) - */ -#ifndef MBEDTLS_TIMING_H -#define MBEDTLS_TIMING_H - -#if !defined(MBEDTLS_CONFIG_FILE) -#include "config.h" -#else -#include MBEDTLS_CONFIG_FILE -#endif - -#if !defined(MBEDTLS_TIMING_ALT) -// Regular implementation -// - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * \brief timer structure - */ -struct mbedtls_timing_hr_time -{ - unsigned char opaque[32]; -}; - -/** - * \brief Context for mbedtls_timing_set/get_delay() - */ -typedef struct -{ - struct mbedtls_timing_hr_time timer; - uint32_t int_ms; - uint32_t fin_ms; -} mbedtls_timing_delay_context; - -extern volatile int mbedtls_timing_alarmed; - -/** - * \brief Return the CPU cycle counter value - * - * \warning This is only a best effort! Do not rely on this! - * In particular, it is known to be unreliable on virtual - * machines. - */ -unsigned long mbedtls_timing_hardclock( void ); - -/** - * \brief Return the elapsed time in milliseconds - * - * \param val points to a timer structure - * \param reset if set to 1, the timer is restarted - */ -unsigned long mbedtls_timing_get_timer( struct mbedtls_timing_hr_time *val, int reset ); - -/** - * \brief Setup an alarm clock - * - * \param seconds delay before the "mbedtls_timing_alarmed" flag is set - * - * \warning Only one alarm at a time is supported. In a threaded - * context, this means one for the whole process, not one per - * thread. - */ -void mbedtls_set_alarm( int seconds ); - -/** - * \brief Set a pair of delays to watch - * (See \c mbedtls_timing_get_delay().) - * - * \param data Pointer to timing data - * Must point to a valid \c mbedtls_timing_delay_context struct. - * \param int_ms First (intermediate) delay in milliseconds. - * \param fin_ms Second (final) delay in milliseconds. - * Pass 0 to cancel the current delay. - */ -void mbedtls_timing_set_delay( void *data, uint32_t int_ms, uint32_t fin_ms ); - -/** - * \brief Get the status of delays - * (Memory helper: number of delays passed.) - * - * \param data Pointer to timing data - * Must point to a valid \c mbedtls_timing_delay_context struct. - * - * \return -1 if cancelled (fin_ms = 0) - * 0 if none of the delays are passed, - * 1 if only the intermediate delay is passed, - * 2 if the final delay is passed. - */ -int mbedtls_timing_get_delay( void *data ); - -#ifdef __cplusplus -} -#endif - -#else /* MBEDTLS_TIMING_ALT */ -#include "timing_alt.h" -#endif /* MBEDTLS_TIMING_ALT */ - -#ifdef __cplusplus -extern "C" { -#endif - -#if defined(MBEDTLS_SELF_TEST) -/** - * \brief Checkup routine - * - * \return 0 if successful, or 1 if a test failed - */ -int mbedtls_timing_self_test( int verbose ); -#endif - -#ifdef __cplusplus -} -#endif - -#endif /* timing.h */ diff --git a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/version.h b/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/version.h deleted file mode 100644 index 8bc2708e..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/version.h +++ /dev/null @@ -1,111 +0,0 @@ -/** - * \file version.h - * - * \brief Run-time version information - * - * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * This file is part of mbed TLS (https://tls.mbed.org) - */ -/* - * This set of compile-time defines and run-time variables can be used to - * determine the version number of the mbed TLS library used. - */ -#ifndef MBEDTLS_VERSION_H -#define MBEDTLS_VERSION_H - -#if !defined(MBEDTLS_CONFIG_FILE) -#include "config.h" -#else -#include MBEDTLS_CONFIG_FILE -#endif - -/** - * The version number x.y.z is split into three parts. - * Major, Minor, Patchlevel - */ -#define MBEDTLS_VERSION_MAJOR 2 -#define MBEDTLS_VERSION_MINOR 1 -#define MBEDTLS_VERSION_PATCH 2 - -/** - * The single version number has the following structure: - * MMNNPP00 - * Major version | Minor version | Patch version - */ -#define MBEDTLS_VERSION_NUMBER 0x02010200 -#define MBEDTLS_VERSION_STRING "2.1.2" -#define MBEDTLS_VERSION_STRING_FULL "mbed TLS 2.1.2" - -#if defined(MBEDTLS_VERSION_C) - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * Get the version number. - * - * \return The constructed version number in the format - * MMNNPP00 (Major, Minor, Patch). - */ -unsigned int mbedtls_version_get_number( void ); - -/** - * Get the version string ("x.y.z"). - * - * \param string The string that will receive the value. - * (Should be at least 9 bytes in size) - */ -void mbedtls_version_get_string( char *string ); - -/** - * Get the full version string ("mbed TLS x.y.z"). - * - * \param string The string that will receive the value. The mbed TLS version - * string will use 18 bytes AT MOST including a terminating - * null byte. - * (So the buffer should be at least 18 bytes to receive this - * version string). - */ -void mbedtls_version_get_string_full( char *string ); - -/** - * \brief Check if support for a feature was compiled into this - * mbed TLS binary. This allows you to see at runtime if the - * library was for instance compiled with or without - * Multi-threading support. - * - * \note only checks against defines in the sections "System - * support", "mbed TLS modules" and "mbed TLS feature - * support" in config.h - * - * \param feature The string for the define to check (e.g. "MBEDTLS_AES_C") - * - * \return 0 if the feature is present, - * -1 if the feature is not present and - * -2 if support for feature checking as a whole was not - * compiled in. - */ -int mbedtls_version_check_feature( const char *feature ); - -#ifdef __cplusplus -} -#endif - -#endif /* MBEDTLS_VERSION_C */ - -#endif /* version.h */ diff --git a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/x509.h b/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/x509.h deleted file mode 100644 index 54dac166..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/x509.h +++ /dev/null @@ -1,331 +0,0 @@ -/** - * \file x509.h - * - * \brief X.509 generic defines and structures - * - * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * This file is part of mbed TLS (https://tls.mbed.org) - */ -#ifndef MBEDTLS_X509_H -#define MBEDTLS_X509_H - -#if !defined(MBEDTLS_CONFIG_FILE) -#include "config.h" -#else -#include MBEDTLS_CONFIG_FILE -#endif - -#include "asn1.h" -#include "pk.h" - -#if defined(MBEDTLS_RSA_C) -#include "rsa.h" -#endif - -/** - * \addtogroup x509_module - * \{ - */ - -#if !defined(MBEDTLS_X509_MAX_INTERMEDIATE_CA) -/** - * Maximum number of intermediate CAs in a verification chain. - * That is, maximum length of the chain, excluding the end-entity certificate - * and the trusted root certificate. - * - * Set this to a low value to prevent an adversary from making you waste - * resources verifying an overlong certificate chain. - */ -#define MBEDTLS_X509_MAX_INTERMEDIATE_CA 8 -#endif - -/** - * \name X509 Error codes - * \{ - */ -#define MBEDTLS_ERR_X509_FEATURE_UNAVAILABLE -0x2080 /**< Unavailable feature, e.g. RSA hashing/encryption combination. */ -#define MBEDTLS_ERR_X509_UNKNOWN_OID -0x2100 /**< Requested OID is unknown. */ -#define MBEDTLS_ERR_X509_INVALID_FORMAT -0x2180 /**< The CRT/CRL/CSR format is invalid, e.g. different type expected. */ -#define MBEDTLS_ERR_X509_INVALID_VERSION -0x2200 /**< The CRT/CRL/CSR version element is invalid. */ -#define MBEDTLS_ERR_X509_INVALID_SERIAL -0x2280 /**< The serial tag or value is invalid. */ -#define MBEDTLS_ERR_X509_INVALID_ALG -0x2300 /**< The algorithm tag or value is invalid. */ -#define MBEDTLS_ERR_X509_INVALID_NAME -0x2380 /**< The name tag or value is invalid. */ -#define MBEDTLS_ERR_X509_INVALID_DATE -0x2400 /**< The date tag or value is invalid. */ -#define MBEDTLS_ERR_X509_INVALID_SIGNATURE -0x2480 /**< The signature tag or value invalid. */ -#define MBEDTLS_ERR_X509_INVALID_EXTENSIONS -0x2500 /**< The extension tag or value is invalid. */ -#define MBEDTLS_ERR_X509_UNKNOWN_VERSION -0x2580 /**< CRT/CRL/CSR has an unsupported version number. */ -#define MBEDTLS_ERR_X509_UNKNOWN_SIG_ALG -0x2600 /**< Signature algorithm (oid) is unsupported. */ -#define MBEDTLS_ERR_X509_SIG_MISMATCH -0x2680 /**< Signature algorithms do not match. (see \c ::mbedtls_x509_crt sig_oid) */ -#define MBEDTLS_ERR_X509_CERT_VERIFY_FAILED -0x2700 /**< Certificate verification failed, e.g. CRL, CA or signature check failed. */ -#define MBEDTLS_ERR_X509_CERT_UNKNOWN_FORMAT -0x2780 /**< Format not recognized as DER or PEM. */ -#define MBEDTLS_ERR_X509_BAD_INPUT_DATA -0x2800 /**< Input invalid. */ -#define MBEDTLS_ERR_X509_ALLOC_FAILED -0x2880 /**< Allocation of memory failed. */ -#define MBEDTLS_ERR_X509_FILE_IO_ERROR -0x2900 /**< Read/write of file failed. */ -#define MBEDTLS_ERR_X509_BUFFER_TOO_SMALL -0x2980 /**< Destination buffer is too small. */ -/* \} name */ - -/** - * \name X509 Verify codes - * \{ - */ -/* Reminder: update x509_crt_verify_strings[] in library/x509_crt.c */ -#define MBEDTLS_X509_BADCERT_EXPIRED 0x01 /**< The certificate validity has expired. */ -#define MBEDTLS_X509_BADCERT_REVOKED 0x02 /**< The certificate has been revoked (is on a CRL). */ -#define MBEDTLS_X509_BADCERT_CN_MISMATCH 0x04 /**< The certificate Common Name (CN) does not match with the expected CN. */ -#define MBEDTLS_X509_BADCERT_NOT_TRUSTED 0x08 /**< The certificate is not correctly signed by the trusted CA. */ -#define MBEDTLS_X509_BADCRL_NOT_TRUSTED 0x10 /**< The CRL is not correctly signed by the trusted CA. */ -#define MBEDTLS_X509_BADCRL_EXPIRED 0x20 /**< The CRL is expired. */ -#define MBEDTLS_X509_BADCERT_MISSING 0x40 /**< Certificate was missing. */ -#define MBEDTLS_X509_BADCERT_SKIP_VERIFY 0x80 /**< Certificate verification was skipped. */ -#define MBEDTLS_X509_BADCERT_OTHER 0x0100 /**< Other reason (can be used by verify callback) */ -#define MBEDTLS_X509_BADCERT_FUTURE 0x0200 /**< The certificate validity starts in the future. */ -#define MBEDTLS_X509_BADCRL_FUTURE 0x0400 /**< The CRL is from the future */ -#define MBEDTLS_X509_BADCERT_KEY_USAGE 0x0800 /**< Usage does not match the keyUsage extension. */ -#define MBEDTLS_X509_BADCERT_EXT_KEY_USAGE 0x1000 /**< Usage does not match the extendedKeyUsage extension. */ -#define MBEDTLS_X509_BADCERT_NS_CERT_TYPE 0x2000 /**< Usage does not match the nsCertType extension. */ -#define MBEDTLS_X509_BADCERT_BAD_MD 0x4000 /**< The certificate is signed with an unacceptable hash. */ -#define MBEDTLS_X509_BADCERT_BAD_PK 0x8000 /**< The certificate is signed with an unacceptable PK alg (eg RSA vs ECDSA). */ -#define MBEDTLS_X509_BADCERT_BAD_KEY 0x010000 /**< The certificate is signed with an unacceptable key (eg bad curve, RSA too short). */ -#define MBEDTLS_X509_BADCRL_BAD_MD 0x020000 /**< The CRL is signed with an unacceptable hash. */ -#define MBEDTLS_X509_BADCRL_BAD_PK 0x040000 /**< The CRL is signed with an unacceptable PK alg (eg RSA vs ECDSA). */ -#define MBEDTLS_X509_BADCRL_BAD_KEY 0x080000 /**< The CRL is signed with an unacceptable key (eg bad curve, RSA too short). */ - -/* \} name */ -/* \} addtogroup x509_module */ - -/* - * X.509 v3 Key Usage Extension flags - * Reminder: update x509_info_key_usage() when adding new flags. - */ -#define MBEDTLS_X509_KU_DIGITAL_SIGNATURE (0x80) /* bit 0 */ -#define MBEDTLS_X509_KU_NON_REPUDIATION (0x40) /* bit 1 */ -#define MBEDTLS_X509_KU_KEY_ENCIPHERMENT (0x20) /* bit 2 */ -#define MBEDTLS_X509_KU_DATA_ENCIPHERMENT (0x10) /* bit 3 */ -#define MBEDTLS_X509_KU_KEY_AGREEMENT (0x08) /* bit 4 */ -#define MBEDTLS_X509_KU_KEY_CERT_SIGN (0x04) /* bit 5 */ -#define MBEDTLS_X509_KU_CRL_SIGN (0x02) /* bit 6 */ -#define MBEDTLS_X509_KU_ENCIPHER_ONLY (0x01) /* bit 7 */ -#define MBEDTLS_X509_KU_DECIPHER_ONLY (0x8000) /* bit 8 */ - -/* - * Netscape certificate types - * (http://www.mozilla.org/projects/security/pki/nss/tech-notes/tn3.html) - */ - -#define MBEDTLS_X509_NS_CERT_TYPE_SSL_CLIENT (0x80) /* bit 0 */ -#define MBEDTLS_X509_NS_CERT_TYPE_SSL_SERVER (0x40) /* bit 1 */ -#define MBEDTLS_X509_NS_CERT_TYPE_EMAIL (0x20) /* bit 2 */ -#define MBEDTLS_X509_NS_CERT_TYPE_OBJECT_SIGNING (0x10) /* bit 3 */ -#define MBEDTLS_X509_NS_CERT_TYPE_RESERVED (0x08) /* bit 4 */ -#define MBEDTLS_X509_NS_CERT_TYPE_SSL_CA (0x04) /* bit 5 */ -#define MBEDTLS_X509_NS_CERT_TYPE_EMAIL_CA (0x02) /* bit 6 */ -#define MBEDTLS_X509_NS_CERT_TYPE_OBJECT_SIGNING_CA (0x01) /* bit 7 */ - -/* - * X.509 extension types - * - * Comments refer to the status for using certificates. Status can be - * different for writing certificates or reading CRLs or CSRs. - */ -#define MBEDTLS_X509_EXT_AUTHORITY_KEY_IDENTIFIER (1 << 0) -#define MBEDTLS_X509_EXT_SUBJECT_KEY_IDENTIFIER (1 << 1) -#define MBEDTLS_X509_EXT_KEY_USAGE (1 << 2) -#define MBEDTLS_X509_EXT_CERTIFICATE_POLICIES (1 << 3) -#define MBEDTLS_X509_EXT_POLICY_MAPPINGS (1 << 4) -#define MBEDTLS_X509_EXT_SUBJECT_ALT_NAME (1 << 5) /* Supported (DNS) */ -#define MBEDTLS_X509_EXT_ISSUER_ALT_NAME (1 << 6) -#define MBEDTLS_X509_EXT_SUBJECT_DIRECTORY_ATTRS (1 << 7) -#define MBEDTLS_X509_EXT_BASIC_CONSTRAINTS (1 << 8) /* Supported */ -#define MBEDTLS_X509_EXT_NAME_CONSTRAINTS (1 << 9) -#define MBEDTLS_X509_EXT_POLICY_CONSTRAINTS (1 << 10) -#define MBEDTLS_X509_EXT_EXTENDED_KEY_USAGE (1 << 11) -#define MBEDTLS_X509_EXT_CRL_DISTRIBUTION_POINTS (1 << 12) -#define MBEDTLS_X509_EXT_INIHIBIT_ANYPOLICY (1 << 13) -#define MBEDTLS_X509_EXT_FRESHEST_CRL (1 << 14) - -#define MBEDTLS_X509_EXT_NS_CERT_TYPE (1 << 16) /* Parsed (and then ?) */ - -/* - * Storage format identifiers - * Recognized formats: PEM and DER - */ -#define MBEDTLS_X509_FORMAT_DER 1 -#define MBEDTLS_X509_FORMAT_PEM 2 - -#define MBEDTLS_X509_MAX_DN_NAME_SIZE 256 /**< Maximum value size of a DN entry */ - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * \addtogroup x509_module - * \{ */ - -/** - * \name Structures for parsing X.509 certificates, CRLs and CSRs - * \{ - */ - -/** - * Type-length-value structure that allows for ASN1 using DER. - */ -typedef mbedtls_asn1_buf mbedtls_x509_buf; - -/** - * Container for ASN1 bit strings. - */ -typedef mbedtls_asn1_bitstring mbedtls_x509_bitstring; - -/** - * Container for ASN1 named information objects. - * It allows for Relative Distinguished Names (e.g. cn=localhost,ou=code,etc.). - */ -typedef mbedtls_asn1_named_data mbedtls_x509_name; - -/** - * Container for a sequence of ASN.1 items - */ -typedef mbedtls_asn1_sequence mbedtls_x509_sequence; - -/** Container for date and time (precision in seconds). */ -typedef struct mbedtls_x509_time -{ - int year, mon, day; /**< Date. */ - int hour, min, sec; /**< Time. */ -} -mbedtls_x509_time; - -/** \} name Structures for parsing X.509 certificates, CRLs and CSRs */ -/** \} addtogroup x509_module */ - -/** - * \brief Store the certificate DN in printable form into buf; - * no more than size characters will be written. - * - * \param buf Buffer to write to - * \param size Maximum size of buffer - * \param dn The X509 name to represent - * - * \return The length of the string written (not including the - * terminated nul byte), or a negative error code. - */ -int mbedtls_x509_dn_gets( char *buf, size_t size, const mbedtls_x509_name *dn ); - -/** - * \brief Store the certificate serial in printable form into buf; - * no more than size characters will be written. - * - * \param buf Buffer to write to - * \param size Maximum size of buffer - * \param serial The X509 serial to represent - * - * \return The length of the string written (not including the - * terminated nul byte), or a negative error code. - */ -int mbedtls_x509_serial_gets( char *buf, size_t size, const mbedtls_x509_buf *serial ); - -/** - * \brief Check a given mbedtls_x509_time against the system time - * and tell if it's in the past. - * - * \note Intended usage is "if( is_past( valid_to ) ) ERROR". - * Hence the return value of 1 if on internal errors. - * - * \param time mbedtls_x509_time to check - * - * \return 1 if the given time is in the past or an error occured, - * 0 otherwise. - */ -int mbedtls_x509_time_is_past( const mbedtls_x509_time *time ); - -/** - * \brief Check a given mbedtls_x509_time against the system time - * and tell if it's in the future. - * - * \note Intended usage is "if( is_future( valid_from ) ) ERROR". - * Hence the return value of 1 if on internal errors. - * - * \param time mbedtls_x509_time to check - * - * \return 1 if the given time is in the future or an error occured, - * 0 otherwise. - */ -int mbedtls_x509_time_is_future( const mbedtls_x509_time *time ); - -/** - * \brief Checkup routine - * - * \return 0 if successful, or 1 if the test failed - */ -int mbedtls_x509_self_test( int verbose ); - -/* - * Internal module functions. You probably do not want to use these unless you - * know you do. - */ -int mbedtls_x509_get_name( unsigned char **p, const unsigned char *end, - mbedtls_x509_name *cur ); -int mbedtls_x509_get_alg_null( unsigned char **p, const unsigned char *end, - mbedtls_x509_buf *alg ); -int mbedtls_x509_get_alg( unsigned char **p, const unsigned char *end, - mbedtls_x509_buf *alg, mbedtls_x509_buf *params ); -#if defined(MBEDTLS_X509_RSASSA_PSS_SUPPORT) -int mbedtls_x509_get_rsassa_pss_params( const mbedtls_x509_buf *params, - mbedtls_md_type_t *md_alg, mbedtls_md_type_t *mgf_md, - int *salt_len ); -#endif -int mbedtls_x509_get_sig( unsigned char **p, const unsigned char *end, mbedtls_x509_buf *sig ); -int mbedtls_x509_get_sig_alg( const mbedtls_x509_buf *sig_oid, const mbedtls_x509_buf *sig_params, - mbedtls_md_type_t *md_alg, mbedtls_pk_type_t *pk_alg, - void **sig_opts ); -int mbedtls_x509_get_time( unsigned char **p, const unsigned char *end, - mbedtls_x509_time *time ); -int mbedtls_x509_get_serial( unsigned char **p, const unsigned char *end, - mbedtls_x509_buf *serial ); -int mbedtls_x509_get_ext( unsigned char **p, const unsigned char *end, - mbedtls_x509_buf *ext, int tag ); -int mbedtls_x509_sig_alg_gets( char *buf, size_t size, const mbedtls_x509_buf *sig_oid, - mbedtls_pk_type_t pk_alg, mbedtls_md_type_t md_alg, - const void *sig_opts ); -int mbedtls_x509_key_size_helper( char *buf, size_t buf_size, const char *name ); -int mbedtls_x509_string_to_names( mbedtls_asn1_named_data **head, const char *name ); -int mbedtls_x509_set_extension( mbedtls_asn1_named_data **head, const char *oid, size_t oid_len, - int critical, const unsigned char *val, - size_t val_len ); -int mbedtls_x509_write_extensions( unsigned char **p, unsigned char *start, - mbedtls_asn1_named_data *first ); -int mbedtls_x509_write_names( unsigned char **p, unsigned char *start, - mbedtls_asn1_named_data *first ); -int mbedtls_x509_write_sig( unsigned char **p, unsigned char *start, - const char *oid, size_t oid_len, - unsigned char *sig, size_t size ); - -#define MBEDTLS_X509_SAFE_SNPRINTF \ - do { \ - if( ret < 0 || (size_t) ret >= n ) \ - return( MBEDTLS_ERR_X509_BUFFER_TOO_SMALL ); \ - \ - n -= (size_t) ret; \ - p += (size_t) ret; \ - } while( 0 ) - -#ifdef __cplusplus -} -#endif - -#endif /* x509.h */ diff --git a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/x509_crl.h b/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/x509_crl.h deleted file mode 100644 index c50c4efc..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/x509_crl.h +++ /dev/null @@ -1,172 +0,0 @@ -/** - * \file mbedtls_x509_crl.h - * - * \brief X.509 certificate revocation list parsing - * - * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * This file is part of mbed TLS (https://tls.mbed.org) - */ -#ifndef MBEDTLS_X509_CRL_H -#define MBEDTLS_X509_CRL_H - -#if !defined(MBEDTLS_CONFIG_FILE) -#include "config.h" -#else -#include MBEDTLS_CONFIG_FILE -#endif - -#include "x509.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * \addtogroup x509_module - * \{ */ - -/** - * \name Structures and functions for parsing CRLs - * \{ - */ - -/** - * Certificate revocation list entry. - * Contains the CA-specific serial numbers and revocation dates. - */ -typedef struct mbedtls_x509_crl_entry -{ - mbedtls_x509_buf raw; - - mbedtls_x509_buf serial; - - mbedtls_x509_time revocation_date; - - mbedtls_x509_buf entry_ext; - - struct mbedtls_x509_crl_entry *next; -} -mbedtls_x509_crl_entry; - -/** - * Certificate revocation list structure. - * Every CRL may have multiple entries. - */ -typedef struct mbedtls_x509_crl -{ - mbedtls_x509_buf raw; /**< The raw certificate data (DER). */ - mbedtls_x509_buf tbs; /**< The raw certificate body (DER). The part that is To Be Signed. */ - - int version; /**< CRL version (1=v1, 2=v2) */ - mbedtls_x509_buf sig_oid; /**< CRL signature type identifier */ - - mbedtls_x509_buf issuer_raw; /**< The raw issuer data (DER). */ - - mbedtls_x509_name issuer; /**< The parsed issuer data (named information object). */ - - mbedtls_x509_time this_update; - mbedtls_x509_time next_update; - - mbedtls_x509_crl_entry entry; /**< The CRL entries containing the certificate revocation times for this CA. */ - - mbedtls_x509_buf crl_ext; - - mbedtls_x509_buf sig_oid2; - mbedtls_x509_buf sig; - mbedtls_md_type_t sig_md; /**< Internal representation of the MD algorithm of the signature algorithm, e.g. MBEDTLS_MD_SHA256 */ - mbedtls_pk_type_t sig_pk; /**< Internal representation of the Public Key algorithm of the signature algorithm, e.g. MBEDTLS_PK_RSA */ - void *sig_opts; /**< Signature options to be passed to mbedtls_pk_verify_ext(), e.g. for RSASSA-PSS */ - - struct mbedtls_x509_crl *next; -} -mbedtls_x509_crl; - -/** - * \brief Parse a DER-encoded CRL and append it to the chained list - * - * \param chain points to the start of the chain - * \param buf buffer holding the CRL data in DER format - * (including the terminating null byte for PEM data) - * - * \return 0 if successful, or a specific X509 or PEM error code - */ -int mbedtls_x509_crl_parse_der( mbedtls_x509_crl *chain, - const unsigned char *buf, size_t buflen ); -/** - * \brief Parse one or more CRLs and append them to the chained list - * - * \note Mutliple CRLs are accepted only if using PEM format - * - * \param chain points to the start of the chain - * \param buf buffer holding the CRL data in PEM or DER format - * \param buflen size of the buffer - * (including the terminating null byte for PEM data) - * - * \return 0 if successful, or a specific X509 or PEM error code - */ -int mbedtls_x509_crl_parse( mbedtls_x509_crl *chain, const unsigned char *buf, size_t buflen ); - -#if defined(MBEDTLS_FS_IO) -/** - * \brief Load one or more CRLs and append them to the chained list - * - * \note Mutliple CRLs are accepted only if using PEM format - * - * \param chain points to the start of the chain - * \param path filename to read the CRLs from (in PEM or DER encoding) - * - * \return 0 if successful, or a specific X509 or PEM error code - */ -int mbedtls_x509_crl_parse_file( mbedtls_x509_crl *chain, const char *path ); -#endif /* MBEDTLS_FS_IO */ - -/** - * \brief Returns an informational string about the CRL. - * - * \param buf Buffer to write to - * \param size Maximum size of buffer - * \param prefix A line prefix - * \param crl The X509 CRL to represent - * - * \return The length of the string written (not including the - * terminated nul byte), or a negative error code. - */ -int mbedtls_x509_crl_info( char *buf, size_t size, const char *prefix, - const mbedtls_x509_crl *crl ); - -/** - * \brief Initialize a CRL (chain) - * - * \param crl CRL chain to initialize - */ -void mbedtls_x509_crl_init( mbedtls_x509_crl *crl ); - -/** - * \brief Unallocate all CRL data - * - * \param crl CRL chain to free - */ -void mbedtls_x509_crl_free( mbedtls_x509_crl *crl ); - -/* \} name */ -/* \} addtogroup x509_module */ - -#ifdef __cplusplus -} -#endif - -#endif /* mbedtls_x509_crl.h */ diff --git a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/x509_crt.h b/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/x509_crt.h deleted file mode 100644 index 72b02ffd..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/x509_crt.h +++ /dev/null @@ -1,645 +0,0 @@ -/** - * \file mbedtls_x509_crt.h - * - * \brief X.509 certificate parsing and writing - * - * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * This file is part of mbed TLS (https://tls.mbed.org) - */ -#ifndef MBEDTLS_X509_CRT_H -#define MBEDTLS_X509_CRT_H - -#if !defined(MBEDTLS_CONFIG_FILE) -#include "config.h" -#else -#include MBEDTLS_CONFIG_FILE -#endif - -#include "x509.h" -#include "x509_crl.h" - -/** - * \addtogroup x509_module - * \{ - */ - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * \name Structures and functions for parsing and writing X.509 certificates - * \{ - */ - -/** - * Container for an X.509 certificate. The certificate may be chained. - */ -typedef struct mbedtls_x509_crt -{ - mbedtls_x509_buf raw; /**< The raw certificate data (DER). */ - mbedtls_x509_buf tbs; /**< The raw certificate body (DER). The part that is To Be Signed. */ - - int version; /**< The X.509 version. (1=v1, 2=v2, 3=v3) */ - mbedtls_x509_buf serial; /**< Unique id for certificate issued by a specific CA. */ - mbedtls_x509_buf sig_oid; /**< Signature algorithm, e.g. sha1RSA */ - - mbedtls_x509_buf issuer_raw; /**< The raw issuer data (DER). Used for quick comparison. */ - mbedtls_x509_buf subject_raw; /**< The raw subject data (DER). Used for quick comparison. */ - - mbedtls_x509_name issuer; /**< The parsed issuer data (named information object). */ - mbedtls_x509_name subject; /**< The parsed subject data (named information object). */ - - mbedtls_x509_time valid_from; /**< Start time of certificate validity. */ - mbedtls_x509_time valid_to; /**< End time of certificate validity. */ - - mbedtls_pk_context pk; /**< Container for the public key context. */ - - mbedtls_x509_buf issuer_id; /**< Optional X.509 v2/v3 issuer unique identifier. */ - mbedtls_x509_buf subject_id; /**< Optional X.509 v2/v3 subject unique identifier. */ - mbedtls_x509_buf v3_ext; /**< Optional X.509 v3 extensions. */ - mbedtls_x509_sequence subject_alt_names; /**< Optional list of Subject Alternative Names (Only dNSName supported). */ - - int ext_types; /**< Bit string containing detected and parsed extensions */ - int ca_istrue; /**< Optional Basic Constraint extension value: 1 if this certificate belongs to a CA, 0 otherwise. */ - int max_pathlen; /**< Optional Basic Constraint extension value: The maximum path length to the root certificate. Path length is 1 higher than RFC 5280 'meaning', so 1+ */ - - unsigned int key_usage; /**< Optional key usage extension value: See the values in x509.h */ - - mbedtls_x509_sequence ext_key_usage; /**< Optional list of extended key usage OIDs. */ - - unsigned char ns_cert_type; /**< Optional Netscape certificate type extension value: See the values in x509.h */ - - mbedtls_x509_buf sig; /**< Signature: hash of the tbs part signed with the private key. */ - mbedtls_md_type_t sig_md; /**< Internal representation of the MD algorithm of the signature algorithm, e.g. MBEDTLS_MD_SHA256 */ - mbedtls_pk_type_t sig_pk; /**< Internal representation of the Public Key algorithm of the signature algorithm, e.g. MBEDTLS_PK_RSA */ - void *sig_opts; /**< Signature options to be passed to mbedtls_pk_verify_ext(), e.g. for RSASSA-PSS */ - - struct mbedtls_x509_crt *next; /**< Next certificate in the CA-chain. */ -} -mbedtls_x509_crt; - -/** - * Build flag from an algorithm/curve identifier (pk, md, ecp) - * Since 0 is always XXX_NONE, ignore it. - */ -#define MBEDTLS_X509_ID_FLAG( id ) ( 1 << ( id - 1 ) ) - -/** - * Security profile for certificate verification. - * - * All lists are bitfields, built by ORing flags from MBEDTLS_X509_ID_FLAG(). - */ -typedef struct -{ - uint32_t allowed_mds; /**< MDs for signatures */ - uint32_t allowed_pks; /**< PK algs for signatures */ - uint32_t allowed_curves; /**< Elliptic curves for ECDSA */ - uint32_t rsa_min_bitlen; /**< Minimum size for RSA keys */ -} -mbedtls_x509_crt_profile; - -#define MBEDTLS_X509_CRT_VERSION_1 0 -#define MBEDTLS_X509_CRT_VERSION_2 1 -#define MBEDTLS_X509_CRT_VERSION_3 2 - -#define MBEDTLS_X509_RFC5280_MAX_SERIAL_LEN 32 -#define MBEDTLS_X509_RFC5280_UTC_TIME_LEN 15 - -/** - * Container for writing a certificate (CRT) - */ -typedef struct mbedtls_x509write_cert -{ - int version; - mbedtls_mpi serial; - mbedtls_pk_context *subject_key; - mbedtls_pk_context *issuer_key; - mbedtls_asn1_named_data *subject; - mbedtls_asn1_named_data *issuer; - mbedtls_md_type_t md_alg; - char not_before[MBEDTLS_X509_RFC5280_UTC_TIME_LEN + 1]; - char not_after[MBEDTLS_X509_RFC5280_UTC_TIME_LEN + 1]; - mbedtls_asn1_named_data *extensions; -} -mbedtls_x509write_cert; - -#if defined(MBEDTLS_X509_CRT_PARSE_C) -/** - * Default security profile. Should provide a good balance between security - * and compatibility with current deployments. - */ -extern const mbedtls_x509_crt_profile mbedtls_x509_crt_profile_default; - -/** - * Expected next default profile. Recommended for new deployments. - * Currently targets a 128-bit security level, except for RSA-2048. - */ -extern const mbedtls_x509_crt_profile mbedtls_x509_crt_profile_next; - -/** - * NSA Suite B profile. - */ -extern const mbedtls_x509_crt_profile mbedtls_x509_crt_profile_suiteb; - -/** - * \brief Parse a single DER formatted certificate and add it - * to the chained list. - * - * \param chain points to the start of the chain - * \param buf buffer holding the certificate DER data - * \param buflen size of the buffer - * - * \return 0 if successful, or a specific X509 or PEM error code - */ -int mbedtls_x509_crt_parse_der( mbedtls_x509_crt *chain, const unsigned char *buf, - size_t buflen ); - -/** - * \brief Parse one or more certificates and add them - * to the chained list. Parses permissively. If some - * certificates can be parsed, the result is the number - * of failed certificates it encountered. If none complete - * correctly, the first error is returned. - * - * \param chain points to the start of the chain - * \param buf buffer holding the certificate data in PEM or DER format - * \param buflen size of the buffer - * (including the terminating null byte for PEM data) - * - * \return 0 if all certificates parsed successfully, a positive number - * if partly successful or a specific X509 or PEM error code - */ -int mbedtls_x509_crt_parse( mbedtls_x509_crt *chain, const unsigned char *buf, size_t buflen ); - -#if defined(MBEDTLS_FS_IO) -/** - * \brief Load one or more certificates and add them - * to the chained list. Parses permissively. If some - * certificates can be parsed, the result is the number - * of failed certificates it encountered. If none complete - * correctly, the first error is returned. - * - * \param chain points to the start of the chain - * \param path filename to read the certificates from - * - * \return 0 if all certificates parsed successfully, a positive number - * if partly successful or a specific X509 or PEM error code - */ -int mbedtls_x509_crt_parse_file( mbedtls_x509_crt *chain, const char *path ); - -/** - * \brief Load one or more certificate files from a path and add them - * to the chained list. Parses permissively. If some - * certificates can be parsed, the result is the number - * of failed certificates it encountered. If none complete - * correctly, the first error is returned. - * - * \param chain points to the start of the chain - * \param path directory / folder to read the certificate files from - * - * \return 0 if all certificates parsed successfully, a positive number - * if partly successful or a specific X509 or PEM error code - */ -int mbedtls_x509_crt_parse_path( mbedtls_x509_crt *chain, const char *path ); -#endif /* MBEDTLS_FS_IO */ - -/** - * \brief Returns an informational string about the - * certificate. - * - * \param buf Buffer to write to - * \param size Maximum size of buffer - * \param prefix A line prefix - * \param crt The X509 certificate to represent - * - * \return The length of the string written (not including the - * terminated nul byte), or a negative error code. - */ -int mbedtls_x509_crt_info( char *buf, size_t size, const char *prefix, - const mbedtls_x509_crt *crt ); - -/** - * \brief Returns an informational string about the - * verification status of a certificate. - * - * \param buf Buffer to write to - * \param size Maximum size of buffer - * \param prefix A line prefix - * \param flags Verification flags created by mbedtls_x509_crt_verify() - * - * \return The length of the string written (not including the - * terminated nul byte), or a negative error code. - */ -int mbedtls_x509_crt_verify_info( char *buf, size_t size, const char *prefix, - uint32_t flags ); - -/** - * \brief Verify the certificate signature - * - * The verify callback is a user-supplied callback that - * can clear / modify / add flags for a certificate. If set, - * the verification callback is called for each - * certificate in the chain (from the trust-ca down to the - * presented crt). The parameters for the callback are: - * (void *parameter, mbedtls_x509_crt *crt, int certificate_depth, - * int *flags). With the flags representing current flags for - * that specific certificate and the certificate depth from - * the bottom (Peer cert depth = 0). - * - * All flags left after returning from the callback - * are also returned to the application. The function should - * return 0 for anything but a fatal error. - * - * \note In case verification failed, the results can be displayed - * using \c mbedtls_x509_crt_verify_info() - * - * \note Same as \c mbedtls_x509_crt_verify_with_profile() with the - * default security profile. - * - * \param crt a certificate to be verified - * \param trust_ca the trusted CA chain - * \param ca_crl the CRL chain for trusted CA's - * \param cn expected Common Name (can be set to - * NULL if the CN must not be verified) - * \param flags result of the verification - * \param f_vrfy verification function - * \param p_vrfy verification parameter - * - * \return 0 if successful or MBEDTLS_ERR_X509_CERT_VERIFY_FAILED - * in which case *flags will have one or more - * MBEDTLS_X509_BADCERT_XXX or MBEDTLS_X509_BADCRL_XXX flags - * set, - * or another error in case of a fatal error encountered - * during the verification process. - */ -int mbedtls_x509_crt_verify( mbedtls_x509_crt *crt, - mbedtls_x509_crt *trust_ca, - mbedtls_x509_crl *ca_crl, - const char *cn, uint32_t *flags, - int (*f_vrfy)(void *, mbedtls_x509_crt *, int, uint32_t *), - void *p_vrfy ); - -/** - * \brief Verify the certificate signature according to profile - * - * \note Same as \c mbedtls_x509_crt_verify(), but with explicit - * security profile. - * - * \note The restrictions on keys (RSA minimum size, allowed curves - * for ECDSA) only applys to (intermediate) CAs, not to the - * end-entity certificate. - * - * \param crt a certificate to be verified - * \param trust_ca the trusted CA chain - * \param ca_crl the CRL chain for trusted CA's - * \param profile security profile for verification - * \param cn expected Common Name (can be set to - * NULL if the CN must not be verified) - * \param flags result of the verification - * \param f_vrfy verification function - * \param p_vrfy verification parameter - * - * \return 0 if successful or MBEDTLS_ERR_X509_CERT_VERIFY_FAILED - * in which case *flags will have one or more - * MBEDTLS_X509_BADCERT_XXX or MBEDTLS_X509_BADCRL_XXX flags - * set, - * or another error in case of a fatal error encountered - * during the verification process. - */ -int mbedtls_x509_crt_verify_with_profile( mbedtls_x509_crt *crt, - mbedtls_x509_crt *trust_ca, - mbedtls_x509_crl *ca_crl, - const mbedtls_x509_crt_profile *profile, - const char *cn, uint32_t *flags, - int (*f_vrfy)(void *, mbedtls_x509_crt *, int, uint32_t *), - void *p_vrfy ); - -#if defined(MBEDTLS_X509_CHECK_KEY_USAGE) -/** - * \brief Check usage of certificate against keyUsage extension. - * - * \param crt Leaf certificate used. - * \param usage Intended usage(s) (eg MBEDTLS_X509_KU_KEY_ENCIPHERMENT - * before using the certificate to perform an RSA key - * exchange). - * - * \note Except for decipherOnly and encipherOnly, a bit set in the - * usage argument means this bit MUST be set in the - * certificate. For decipherOnly and encipherOnly, it means - * that bit MAY be set. - * - * \return 0 is these uses of the certificate are allowed, - * MBEDTLS_ERR_X509_BAD_INPUT_DATA if the keyUsage extension - * is present but does not match the usage argument. - * - * \note You should only call this function on leaf certificates, on - * (intermediate) CAs the keyUsage extension is automatically - * checked by \c mbedtls_x509_crt_verify(). - */ -int mbedtls_x509_crt_check_key_usage( const mbedtls_x509_crt *crt, - unsigned int usage ); -#endif /* MBEDTLS_X509_CHECK_KEY_USAGE) */ - -#if defined(MBEDTLS_X509_CHECK_EXTENDED_KEY_USAGE) -/** - * \brief Check usage of certificate against extentedJeyUsage. - * - * \param crt Leaf certificate used. - * \param usage_oid Intended usage (eg MBEDTLS_OID_SERVER_AUTH or MBEDTLS_OID_CLIENT_AUTH). - * \param usage_len Length of usage_oid (eg given by MBEDTLS_OID_SIZE()). - * - * \return 0 if this use of the certificate is allowed, - * MBEDTLS_ERR_X509_BAD_INPUT_DATA if not. - * - * \note Usually only makes sense on leaf certificates. - */ -int mbedtls_x509_crt_check_extended_key_usage( const mbedtls_x509_crt *crt, - const char *usage_oid, - size_t usage_len ); -#endif /* MBEDTLS_X509_CHECK_EXTENDED_KEY_USAGE) */ - -#if defined(MBEDTLS_X509_CRL_PARSE_C) -/** - * \brief Verify the certificate revocation status - * - * \param crt a certificate to be verified - * \param crl the CRL to verify against - * - * \return 1 if the certificate is revoked, 0 otherwise - * - */ -int mbedtls_x509_crt_is_revoked( const mbedtls_x509_crt *crt, const mbedtls_x509_crl *crl ); -#endif /* MBEDTLS_X509_CRL_PARSE_C */ - -/** - * \brief Initialize a certificate (chain) - * - * \param crt Certificate chain to initialize - */ -void mbedtls_x509_crt_init( mbedtls_x509_crt *crt ); - -/** - * \brief Unallocate all certificate data - * - * \param crt Certificate chain to free - */ -void mbedtls_x509_crt_free( mbedtls_x509_crt *crt ); -#endif /* MBEDTLS_X509_CRT_PARSE_C */ - -/* \} name */ -/* \} addtogroup x509_module */ - -#if defined(MBEDTLS_X509_CRT_WRITE_C) -/** - * \brief Initialize a CRT writing context - * - * \param ctx CRT context to initialize - */ -void mbedtls_x509write_crt_init( mbedtls_x509write_cert *ctx ); - -/** - * \brief Set the verion for a Certificate - * Default: MBEDTLS_X509_CRT_VERSION_3 - * - * \param ctx CRT context to use - * \param version version to set (MBEDTLS_X509_CRT_VERSION_1, MBEDTLS_X509_CRT_VERSION_2 or - * MBEDTLS_X509_CRT_VERSION_3) - */ -void mbedtls_x509write_crt_set_version( mbedtls_x509write_cert *ctx, int version ); - -/** - * \brief Set the serial number for a Certificate. - * - * \param ctx CRT context to use - * \param serial serial number to set - * - * \return 0 if successful - */ -int mbedtls_x509write_crt_set_serial( mbedtls_x509write_cert *ctx, const mbedtls_mpi *serial ); - -/** - * \brief Set the validity period for a Certificate - * Timestamps should be in string format for UTC timezone - * i.e. "YYYYMMDDhhmmss" - * e.g. "20131231235959" for December 31st 2013 - * at 23:59:59 - * - * \param ctx CRT context to use - * \param not_before not_before timestamp - * \param not_after not_after timestamp - * - * \return 0 if timestamp was parsed successfully, or - * a specific error code - */ -int mbedtls_x509write_crt_set_validity( mbedtls_x509write_cert *ctx, const char *not_before, - const char *not_after ); - -/** - * \brief Set the issuer name for a Certificate - * Issuer names should contain a comma-separated list - * of OID types and values: - * e.g. "C=UK,O=ARM,CN=mbed TLS CA" - * - * \param ctx CRT context to use - * \param issuer_name issuer name to set - * - * \return 0 if issuer name was parsed successfully, or - * a specific error code - */ -int mbedtls_x509write_crt_set_issuer_name( mbedtls_x509write_cert *ctx, - const char *issuer_name ); - -/** - * \brief Set the subject name for a Certificate - * Subject names should contain a comma-separated list - * of OID types and values: - * e.g. "C=UK,O=ARM,CN=mbed TLS Server 1" - * - * \param ctx CRT context to use - * \param subject_name subject name to set - * - * \return 0 if subject name was parsed successfully, or - * a specific error code - */ -int mbedtls_x509write_crt_set_subject_name( mbedtls_x509write_cert *ctx, - const char *subject_name ); - -/** - * \brief Set the subject public key for the certificate - * - * \param ctx CRT context to use - * \param key public key to include - */ -void mbedtls_x509write_crt_set_subject_key( mbedtls_x509write_cert *ctx, mbedtls_pk_context *key ); - -/** - * \brief Set the issuer key used for signing the certificate - * - * \param ctx CRT context to use - * \param key private key to sign with - */ -void mbedtls_x509write_crt_set_issuer_key( mbedtls_x509write_cert *ctx, mbedtls_pk_context *key ); - -/** - * \brief Set the MD algorithm to use for the signature - * (e.g. MBEDTLS_MD_SHA1) - * - * \param ctx CRT context to use - * \param md_alg MD algorithm to use - */ -void mbedtls_x509write_crt_set_md_alg( mbedtls_x509write_cert *ctx, mbedtls_md_type_t md_alg ); - -/** - * \brief Generic function to add to or replace an extension in the - * CRT - * - * \param ctx CRT context to use - * \param oid OID of the extension - * \param oid_len length of the OID - * \param critical if the extension is critical (per the RFC's definition) - * \param val value of the extension OCTET STRING - * \param val_len length of the value data - * - * \return 0 if successful, or a MBEDTLS_ERR_X509_ALLOC_FAILED - */ -int mbedtls_x509write_crt_set_extension( mbedtls_x509write_cert *ctx, - const char *oid, size_t oid_len, - int critical, - const unsigned char *val, size_t val_len ); - -/** - * \brief Set the basicConstraints extension for a CRT - * - * \param ctx CRT context to use - * \param is_ca is this a CA certificate - * \param max_pathlen maximum length of certificate chains below this - * certificate (only for CA certificates, -1 is - * inlimited) - * - * \return 0 if successful, or a MBEDTLS_ERR_X509_ALLOC_FAILED - */ -int mbedtls_x509write_crt_set_basic_constraints( mbedtls_x509write_cert *ctx, - int is_ca, int max_pathlen ); - -#if defined(MBEDTLS_SHA1_C) -/** - * \brief Set the subjectKeyIdentifier extension for a CRT - * Requires that mbedtls_x509write_crt_set_subject_key() has been - * called before - * - * \param ctx CRT context to use - * - * \return 0 if successful, or a MBEDTLS_ERR_X509_ALLOC_FAILED - */ -int mbedtls_x509write_crt_set_subject_key_identifier( mbedtls_x509write_cert *ctx ); - -/** - * \brief Set the authorityKeyIdentifier extension for a CRT - * Requires that mbedtls_x509write_crt_set_issuer_key() has been - * called before - * - * \param ctx CRT context to use - * - * \return 0 if successful, or a MBEDTLS_ERR_X509_ALLOC_FAILED - */ -int mbedtls_x509write_crt_set_authority_key_identifier( mbedtls_x509write_cert *ctx ); -#endif /* MBEDTLS_SHA1_C */ - -/** - * \brief Set the Key Usage Extension flags - * (e.g. MBEDTLS_X509_KU_DIGITAL_SIGNATURE | MBEDTLS_X509_KU_KEY_CERT_SIGN) - * - * \param ctx CRT context to use - * \param key_usage key usage flags to set - * - * \return 0 if successful, or MBEDTLS_ERR_X509_ALLOC_FAILED - */ -int mbedtls_x509write_crt_set_key_usage( mbedtls_x509write_cert *ctx, - unsigned int key_usage ); - -/** - * \brief Set the Netscape Cert Type flags - * (e.g. MBEDTLS_X509_NS_CERT_TYPE_SSL_CLIENT | MBEDTLS_X509_NS_CERT_TYPE_EMAIL) - * - * \param ctx CRT context to use - * \param ns_cert_type Netscape Cert Type flags to set - * - * \return 0 if successful, or MBEDTLS_ERR_X509_ALLOC_FAILED - */ -int mbedtls_x509write_crt_set_ns_cert_type( mbedtls_x509write_cert *ctx, - unsigned char ns_cert_type ); - -/** - * \brief Free the contents of a CRT write context - * - * \param ctx CRT context to free - */ -void mbedtls_x509write_crt_free( mbedtls_x509write_cert *ctx ); - -/** - * \brief Write a built up certificate to a X509 DER structure - * Note: data is written at the end of the buffer! Use the - * return value to determine where you should start - * using the buffer - * - * \param ctx certificate to write away - * \param buf buffer to write to - * \param size size of the buffer - * \param f_rng RNG function (for signature, see note) - * \param p_rng RNG parameter - * - * \return length of data written if successful, or a specific - * error code - * - * \note f_rng may be NULL if RSA is used for signature and the - * signature is made offline (otherwise f_rng is desirable - * for countermeasures against timing attacks). - * ECDSA signatures always require a non-NULL f_rng. - */ -int mbedtls_x509write_crt_der( mbedtls_x509write_cert *ctx, unsigned char *buf, size_t size, - int (*f_rng)(void *, unsigned char *, size_t), - void *p_rng ); - -#if defined(MBEDTLS_PEM_WRITE_C) -/** - * \brief Write a built up certificate to a X509 PEM string - * - * \param ctx certificate to write away - * \param buf buffer to write to - * \param size size of the buffer - * \param f_rng RNG function (for signature, see note) - * \param p_rng RNG parameter - * - * \return 0 if successful, or a specific error code - * - * \note f_rng may be NULL if RSA is used for signature and the - * signature is made offline (otherwise f_rng is desirable - * for countermeasures against timing attacks). - * ECDSA signatures always require a non-NULL f_rng. - */ -int mbedtls_x509write_crt_pem( mbedtls_x509write_cert *ctx, unsigned char *buf, size_t size, - int (*f_rng)(void *, unsigned char *, size_t), - void *p_rng ); -#endif /* MBEDTLS_PEM_WRITE_C */ -#endif /* MBEDTLS_X509_CRT_WRITE_C */ - -#ifdef __cplusplus -} -#endif - -#endif /* mbedtls_x509_crt.h */ diff --git a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/x509_csr.h b/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/x509_csr.h deleted file mode 100644 index 98c75bcf..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/x509_csr.h +++ /dev/null @@ -1,292 +0,0 @@ -/** - * \file mbedtls_x509_csr.h - * - * \brief X.509 certificate signing request parsing and writing - * - * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * This file is part of mbed TLS (https://tls.mbed.org) - */ -#ifndef MBEDTLS_X509_CSR_H -#define MBEDTLS_X509_CSR_H - -#if !defined(MBEDTLS_CONFIG_FILE) -#include "config.h" -#else -#include MBEDTLS_CONFIG_FILE -#endif - -#include "x509.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * \addtogroup x509_module - * \{ */ - -/** - * \name Structures and functions for X.509 Certificate Signing Requests (CSR) - * \{ - */ - -/** - * Certificate Signing Request (CSR) structure. - */ -typedef struct mbedtls_x509_csr -{ - mbedtls_x509_buf raw; /**< The raw CSR data (DER). */ - mbedtls_x509_buf cri; /**< The raw CertificateRequestInfo body (DER). */ - - int version; /**< CSR version (1=v1). */ - - mbedtls_x509_buf subject_raw; /**< The raw subject data (DER). */ - mbedtls_x509_name subject; /**< The parsed subject data (named information object). */ - - mbedtls_pk_context pk; /**< Container for the public key context. */ - - mbedtls_x509_buf sig_oid; - mbedtls_x509_buf sig; - mbedtls_md_type_t sig_md; /**< Internal representation of the MD algorithm of the signature algorithm, e.g. MBEDTLS_MD_SHA256 */ - mbedtls_pk_type_t sig_pk; /**< Internal representation of the Public Key algorithm of the signature algorithm, e.g. MBEDTLS_PK_RSA */ - void *sig_opts; /**< Signature options to be passed to mbedtls_pk_verify_ext(), e.g. for RSASSA-PSS */ -} -mbedtls_x509_csr; - -/** - * Container for writing a CSR - */ -typedef struct mbedtls_x509write_csr -{ - mbedtls_pk_context *key; - mbedtls_asn1_named_data *subject; - mbedtls_md_type_t md_alg; - mbedtls_asn1_named_data *extensions; -} -mbedtls_x509write_csr; - -#if defined(MBEDTLS_X509_CSR_PARSE_C) -/** - * \brief Load a Certificate Signing Request (CSR) in DER format - * - * \param csr CSR context to fill - * \param buf buffer holding the CRL data - * \param buflen size of the buffer - * - * \return 0 if successful, or a specific X509 error code - */ -int mbedtls_x509_csr_parse_der( mbedtls_x509_csr *csr, - const unsigned char *buf, size_t buflen ); - -/** - * \brief Load a Certificate Signing Request (CSR), DER or PEM format - * - * \param csr CSR context to fill - * \param buf buffer holding the CRL data - * \param buflen size of the buffer - * (including the terminating null byte for PEM data) - * - * \return 0 if successful, or a specific X509 or PEM error code - */ -int mbedtls_x509_csr_parse( mbedtls_x509_csr *csr, const unsigned char *buf, size_t buflen ); - -#if defined(MBEDTLS_FS_IO) -/** - * \brief Load a Certificate Signing Request (CSR) - * - * \param csr CSR context to fill - * \param path filename to read the CSR from - * - * \return 0 if successful, or a specific X509 or PEM error code - */ -int mbedtls_x509_csr_parse_file( mbedtls_x509_csr *csr, const char *path ); -#endif /* MBEDTLS_FS_IO */ - -/** - * \brief Returns an informational string about the - * CSR. - * - * \param buf Buffer to write to - * \param size Maximum size of buffer - * \param prefix A line prefix - * \param csr The X509 CSR to represent - * - * \return The length of the string written (not including the - * terminated nul byte), or a negative error code. - */ -int mbedtls_x509_csr_info( char *buf, size_t size, const char *prefix, - const mbedtls_x509_csr *csr ); - -/** - * \brief Initialize a CSR - * - * \param csr CSR to initialize - */ -void mbedtls_x509_csr_init( mbedtls_x509_csr *csr ); - -/** - * \brief Unallocate all CSR data - * - * \param csr CSR to free - */ -void mbedtls_x509_csr_free( mbedtls_x509_csr *csr ); -#endif /* MBEDTLS_X509_CSR_PARSE_C */ - -/* \} name */ -/* \} addtogroup x509_module */ - -#if defined(MBEDTLS_X509_CSR_WRITE_C) -/** - * \brief Initialize a CSR context - * - * \param ctx CSR context to initialize - */ -void mbedtls_x509write_csr_init( mbedtls_x509write_csr *ctx ); - -/** - * \brief Set the subject name for a CSR - * Subject names should contain a comma-separated list - * of OID types and values: - * e.g. "C=UK,O=ARM,CN=mbed TLS Server 1" - * - * \param ctx CSR context to use - * \param subject_name subject name to set - * - * \return 0 if subject name was parsed successfully, or - * a specific error code - */ -int mbedtls_x509write_csr_set_subject_name( mbedtls_x509write_csr *ctx, - const char *subject_name ); - -/** - * \brief Set the key for a CSR (public key will be included, - * private key used to sign the CSR when writing it) - * - * \param ctx CSR context to use - * \param key Asymetric key to include - */ -void mbedtls_x509write_csr_set_key( mbedtls_x509write_csr *ctx, mbedtls_pk_context *key ); - -/** - * \brief Set the MD algorithm to use for the signature - * (e.g. MBEDTLS_MD_SHA1) - * - * \param ctx CSR context to use - * \param md_alg MD algorithm to use - */ -void mbedtls_x509write_csr_set_md_alg( mbedtls_x509write_csr *ctx, mbedtls_md_type_t md_alg ); - -/** - * \brief Set the Key Usage Extension flags - * (e.g. MBEDTLS_X509_KU_DIGITAL_SIGNATURE | MBEDTLS_X509_KU_KEY_CERT_SIGN) - * - * \param ctx CSR context to use - * \param key_usage key usage flags to set - * - * \return 0 if successful, or MBEDTLS_ERR_X509_ALLOC_FAILED - */ -int mbedtls_x509write_csr_set_key_usage( mbedtls_x509write_csr *ctx, unsigned char key_usage ); - -/** - * \brief Set the Netscape Cert Type flags - * (e.g. MBEDTLS_X509_NS_CERT_TYPE_SSL_CLIENT | MBEDTLS_X509_NS_CERT_TYPE_EMAIL) - * - * \param ctx CSR context to use - * \param ns_cert_type Netscape Cert Type flags to set - * - * \return 0 if successful, or MBEDTLS_ERR_X509_ALLOC_FAILED - */ -int mbedtls_x509write_csr_set_ns_cert_type( mbedtls_x509write_csr *ctx, - unsigned char ns_cert_type ); - -/** - * \brief Generic function to add to or replace an extension in the - * CSR - * - * \param ctx CSR context to use - * \param oid OID of the extension - * \param oid_len length of the OID - * \param val value of the extension OCTET STRING - * \param val_len length of the value data - * - * \return 0 if successful, or a MBEDTLS_ERR_X509_ALLOC_FAILED - */ -int mbedtls_x509write_csr_set_extension( mbedtls_x509write_csr *ctx, - const char *oid, size_t oid_len, - const unsigned char *val, size_t val_len ); - -/** - * \brief Free the contents of a CSR context - * - * \param ctx CSR context to free - */ -void mbedtls_x509write_csr_free( mbedtls_x509write_csr *ctx ); - -/** - * \brief Write a CSR (Certificate Signing Request) to a - * DER structure - * Note: data is written at the end of the buffer! Use the - * return value to determine where you should start - * using the buffer - * - * \param ctx CSR to write away - * \param buf buffer to write to - * \param size size of the buffer - * \param f_rng RNG function (for signature, see note) - * \param p_rng RNG parameter - * - * \return length of data written if successful, or a specific - * error code - * - * \note f_rng may be NULL if RSA is used for signature and the - * signature is made offline (otherwise f_rng is desirable - * for countermeasures against timing attacks). - * ECDSA signatures always require a non-NULL f_rng. - */ -int mbedtls_x509write_csr_der( mbedtls_x509write_csr *ctx, unsigned char *buf, size_t size, - int (*f_rng)(void *, unsigned char *, size_t), - void *p_rng ); - -#if defined(MBEDTLS_PEM_WRITE_C) -/** - * \brief Write a CSR (Certificate Signing Request) to a - * PEM string - * - * \param ctx CSR to write away - * \param buf buffer to write to - * \param size size of the buffer - * \param f_rng RNG function (for signature, see note) - * \param p_rng RNG parameter - * - * \return 0 if successful, or a specific error code - * - * \note f_rng may be NULL if RSA is used for signature and the - * signature is made offline (otherwise f_rng is desirable - * for couermeasures against timing attacks). - * ECDSA signatures always require a non-NULL f_rng. - */ -int mbedtls_x509write_csr_pem( mbedtls_x509write_csr *ctx, unsigned char *buf, size_t size, - int (*f_rng)(void *, unsigned char *, size_t), - void *p_rng ); -#endif /* MBEDTLS_PEM_WRITE_C */ -#endif /* MBEDTLS_X509_CSR_WRITE_C */ - -#ifdef __cplusplus -} -#endif - -#endif /* mbedtls_x509_csr.h */ diff --git a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/xtea.h b/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/xtea.h deleted file mode 100644 index b073f84e..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/include/xtea.h +++ /dev/null @@ -1,139 +0,0 @@ -/** - * \file xtea.h - * - * \brief XTEA block cipher (32-bit) - * - * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * This file is part of mbed TLS (https://tls.mbed.org) - */ -#ifndef MBEDTLS_XTEA_H -#define MBEDTLS_XTEA_H - -#if !defined(MBEDTLS_CONFIG_FILE) -#include "config.h" -#else -#include MBEDTLS_CONFIG_FILE -#endif - -#include -#include - -#define MBEDTLS_XTEA_ENCRYPT 1 -#define MBEDTLS_XTEA_DECRYPT 0 - -#define MBEDTLS_ERR_XTEA_INVALID_INPUT_LENGTH -0x0028 /**< The data input has an invalid length. */ - -#if !defined(MBEDTLS_XTEA_ALT) -// Regular implementation -// - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * \brief XTEA context structure - */ -typedef struct -{ - uint32_t k[4]; /*!< key */ -} -mbedtls_xtea_context; - -/** - * \brief Initialize XTEA context - * - * \param ctx XTEA context to be initialized - */ -void mbedtls_xtea_init( mbedtls_xtea_context *ctx ); - -/** - * \brief Clear XTEA context - * - * \param ctx XTEA context to be cleared - */ -void mbedtls_xtea_free( mbedtls_xtea_context *ctx ); - -/** - * \brief XTEA key schedule - * - * \param ctx XTEA context to be initialized - * \param key the secret key - */ -void mbedtls_xtea_setup( mbedtls_xtea_context *ctx, const unsigned char key[16] ); - -/** - * \brief XTEA cipher function - * - * \param ctx XTEA context - * \param mode MBEDTLS_XTEA_ENCRYPT or MBEDTLS_XTEA_DECRYPT - * \param input 8-byte input block - * \param output 8-byte output block - * - * \return 0 if successful - */ -int mbedtls_xtea_crypt_ecb( mbedtls_xtea_context *ctx, - int mode, - const unsigned char input[8], - unsigned char output[8] ); - -#if defined(MBEDTLS_CIPHER_MODE_CBC) -/** - * \brief XTEA CBC cipher function - * - * \param ctx XTEA context - * \param mode MBEDTLS_XTEA_ENCRYPT or MBEDTLS_XTEA_DECRYPT - * \param length the length of input, multiple of 8 - * \param iv initialization vector for CBC mode - * \param input input block - * \param output output block - * - * \return 0 if successful, - * MBEDTLS_ERR_XTEA_INVALID_INPUT_LENGTH if the length % 8 != 0 - */ -int mbedtls_xtea_crypt_cbc( mbedtls_xtea_context *ctx, - int mode, - size_t length, - unsigned char iv[8], - const unsigned char *input, - unsigned char *output); -#endif /* MBEDTLS_CIPHER_MODE_CBC */ - -#ifdef __cplusplus -} -#endif - -#else /* MBEDTLS_XTEA_ALT */ -#include "xtea_alt.h" -#endif /* MBEDTLS_XTEA_ALT */ - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * \brief Checkup routine - * - * \return 0 if successful, or 1 if the test failed - */ -int mbedtls_xtea_self_test( int verbose ); - -#ifdef __cplusplus -} -#endif - -#endif /* xtea.h */ diff --git a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/lib/libmbedcrypto.a b/client/3rd/ShadowSocks/ShadowSocks/mbedtls/lib/libmbedcrypto.a deleted file mode 100644 index 720f8d17fc82a889198241b5a779e45c6d467894..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1344976 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

    SYS3 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±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%0D+oyR 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

      BR4*KM%fGCuFkUtxHY5 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
    1. PWX2g&JUu7EovS$K3E5 z>2`GGL)di~F0lHs{BHUM<$P*vWwb{_?@TfMr`p;eBiB$5w;}n0 zgx2x@6GEffY4;fI^`G{dqP0G{eHyP?eH?NE5>h8|LOU-umm5jiMYh$#r0Ow ze{wI1Cy{r?^m)@GGSIxbp1kEnJ^a)pZKgr+ZKd;I|Bj?j4ZJ*-K^Z!0@#|-jG!ybD z5b<>EhC6#2-h@82pO3wn*w3Q#?SNNOpDMZZqn{6Q{M2^6)hDS>tzs-)sqgWRSAEHk zg`GR&W7c$c*P>?_$F~k^X}df0y@Q=}Abs!o>dCTWypP^0I57^J(&rV?Rp}c{-+bd- z+^p|S=tUTRu-2`)e;fKH>E5IZ+0VE3OMHtYbswZzdZX@k={i`qEnSEIwo3B8JE7ws z^PP?()UPGdhRoBI2AnyItKI$`_M1Eh<;%|-y1LS-GvUQU*8{IAB7I9KU{lO ze{fqvbC+~Aq5kH&{+Ez{jIDcp^R`5MZ%HR`U4Jq?q?a-Xbx70;msf7>7I`Y2#DjeE z??*q8j62rPynVfdOEdgy%lP&L^?j)||N6dld3;AGlgdEl=VjW4zQoHUot4V1xIBsP zTk^V>yw>+!FW-C$Q}E52_!iEf4=Xz}Tu(}UaPt9-mmXDE>dO_IW-WN8P|$aPq+C(H82N%vyh%DGMeib%R=8tu@~YaoG60$tB{u;twlaT4;u2`n4 zk?C4wx`y@gCR3u0`LaLi`gm4heQdM(==1KKs)w_z9u}=r(+3r=Q$^}dhi}(aZ%Vf7 zVZC$hztyL=+U~n{fwn{IO!v~B?^E4&?$r7a8`cZ$XCr$nX;Hp5!QOqvQ6-wK2b|GELPpz3+Xr7t&)@9!DDsW@u}r z7p!#sbnvBu`eW^ZD;M?ClwU!)B>S2~-?kMU`aX2%FVe^Dr;mGyK2Cj`^lFm9#SQwn z)#k%Dbdz4u+;YMzU{R2FS7UMA@cYo`XJZ$A@`fNCHkG68XpW{??b!~NcwQC z)91XzgD)b}eq?$HncRGeRG@3Uh&jn3du4W>Fkr7t9yxoF^AK`IYr2s$Z}TCPpIe8{K7mlK3pSkCcR|p7 z8gk7V-2TjgoxwLN8E*w;H+&@+HR3X@>(9Tdy)OSA{g@9zwu(XR&+OY;w&}(7!KR_~ zar-NVhW*&7Hs(1M9VR?AU#ECqq7#Fs-{s@K z|9)3-=-cK$~A&!Zs>$PVdA^{fnGfP1^S-&MkWkX4Y4CEV{b zcl$;iz`w`bXOsv($SO#w@Z-(heK{A&pKaz|N`L>DxzADjMZym=iIx80MdnYmu3FE1 z{EE3t->s*V{JQT%k1M|-{B_=~o>Jkv%)MToipbxeM2ua|p~`Lzz*Co?ax85{#H1JR{qwcdIXI0>8p z4g)7Lzfl=tQy+3uwXU{h>@W7Kgj?15Swl%pA^p;@I0^)oC;0_6;BQL ze(+w(dm5mc+FXV0ZIZ$$F-@ymL z+rbOLSICs<;7YIoe3D|A0q%xAjj4`Z;ApT1%z!&U=8xR{HRNmcW@zTA-2FA=YxM@` zGr@Hrs^-g?-gYO0_ z!5UD7DL&65?+9==sBnyHv@girXQOaCpcSqYRJaaM;WmILfbAfvKXuIW2LW@ru zcm}utq)NH_ZKx{Mv!E-%dXOsN?zy2#RF8+INULi>imEyTQUvba8?xHndxOY24qE$f zs`EHP59u-NFl;w$F|0St7zT!Un7Z(W9fs|OEr#`m8N`S<x-=C^HMf?6!^LL_sf2nptwC^8hn!N8ZdEL47 zxcmOG()|1W@FT|G_g}{w?fWa$OBWw6fu0x4-STw}EFZ~hNq6yEnQ6D+*% zPkwIxegAR4#pnBrPg{EYJj3_J4<4RYJF0nFKX33E^Zz<8vz|XO`qxIUF#1iSTa2!- z{8}oSpBe`}-yyE!;jeYrdbEF1bi4WgoY8rs)!xdz!~AQ$ShSb#W0*;D^ejoyXA*bP zy)H$MP0@dpqSZbo!+$G9Kb4B_uTnH^ctQA|rQGjMxoe&{8Q-9kJX=%l%Tx5+6s>!f zlKf;&((%-!COKE?wC4fS!8$YUT)RcI^1sK!rM-TgY+1oNyf3fT>}{#z(5A zd6}48nwT0^ph6oz4U4bzd~xXHj$<@#0VjQH9ymFTES7vD7ubcq!Z~p_@ff&S>H>?9 zdx4c$SvnJ;#N3jYupMX<3uWFyDKvYW2q$hSs{|PeRbZj?YPL4TBW0B!eYQnGLOI+% zofMOScARb)NzZ-qTtOITee>+I&He>#;N3Kz9qI#86Wmex%C4yRd0R2)T9aH z<8=c%<2771P;9+GiyFd=VhPs^^o7Qv|Fxf8PrEgqo>n)mAKj9Bj&{93t@Ur>r?4C7 zAE%4M!1V$vZd$o;@tWqf%Wqk_d`WY2;|v#({qubCMt347O}^XTWJ3%un)AUJTHi-J zjLH-9@w*tzzYp75J}&wRA@SzO8;?HK^%Gx0>AU4EKZn-qOrR0We{n8Q!@x6v@@JuM zzC7sOGlo4M>|;pk$@A;Ob3*cGp@$#Cyb9~`??nH)ZENuKV9xv)g6>%QV}!adpVS>U z2i<(b)F?dTiGy44&lw?CIDhEOd(lHnXRf&tAGV&)J&L5J1HXQcl#idi3Eh40>}x)< zZu!mIu0pT8fHm@o^Mj6XE>ivi^57QoUI*YrzG$vGe*x*;8_rh}SGcY~dUE(s z_uM`ztw%WE;;DLhkJf`vfyNHK`90{+r^!6-;2qDNsWXa*V_exW1J3IDC1=>=&n15; zFDEnpE2@G``=rAs&-dR#oFAy~-b45^kWqU)YMD27Wss7K@l#FT8R4FqKFYpLYn_qT zl`HnW*c~a3i;oZo)xAbM`_>;#xfVYciuvldf3DN|LA)Eoc{fhr-59i~ld|GHW6nKX zU%#FC>OA$Km%6v-nxK2{l|gs%>{0Fc(HTgG#suAms0aCLSg)dY0hv^u8??6lU#TxE zg6?_BPnBm?eRmaS4pmlt|KvWx19+ zb_UNGR(H-Izu<|!q$aK|fLq}25OS|CSXX=>3?Q5{QZZgoO)##kRJ=kl`tc*G> zf1XbZy!##}pYX4<#>#BIri1vSw!r*TCtce6R)9kfGtb1l?whxLn6_XJZNZ@EEU|*K z>KcYU-T5xcBVFdrl=(Hm!97>f9?YdZxSaOjQrd&h2Hh{+6Lj}|n%^~Hn?T<+uWzo* zWv@}*^ZG6g&3DVJw&Ht1_b-%hpS8N7_Jned>IUxn<-V0Q5X||xJb4%8h###naWwBp zyYfiy3I6|={NpY+%?D}^8|SWu?<40VNsdaLp+y@;-%(RJJT&*+Q{P=SDmYQ+JasHC zf4TyD@lboQ=W^;FvggNCx^i)LS7Jxn@?(ZLJKEoaeIFnmm-gVb@7FM&humJqdSrZn z_{3lKTZkj+_N9bduf>xmZ3=f^fm;}#cl!)(;@3N-q9CqMW6ye-XQ(#^)m9z&bUXFD z>g5M?o)!7Chj(i)VR|bn9!|<}E8*n7QfGh>_BEaTMVfs3>&lL>%wxLzlbg(XFLi!c z{sZtnS7lUz+9jNaJOCZ$3ull~cN~pBwckF^X3-v8Mcm5Uz3|VE8MJASrKt})pAK|} zuT_;(e~__?GwS;AcMN=H>AY3W*ge4eiN0uBC1nZEN$Bx>dR`L`^#g|_JCQgO9 zgfLMb6y~Li`^BS*d&uuB?yD3(bxQTPjQXwpp(=aV4_iGB&4a?aME;lYuDJSPb=kjX zec$7KJN__j4C@sSH4Ga#m)($9r>J!iwr5mp{@gkU>XPjzd`)E{vpbK}uXlSFb%8cr z@2*>?fVpodcIsoOgIXV@brDhB!|eJD)irpljScx%y{vOPRVD@NPm=QCzJ-2nk7PrR zO4gVu9%rs9SWD^7nhyC=4>$|8opz@7h4pUFsrs2b@oK%I_P>^o4mPd#?boS6cMtWH zvkSZXe!M`24mhT7jD`)z#e5LtE!h*h={)O^)$K3w=-$##Kb!TSx{4VQppu%87g zy!5!j42X!?7swClN45t%4cq~a2Bj~~fVH6Hm3|p)(ma*Yu@5G)&xhFb6v!CGovS5z zyP$>lgUqYA`76e{*?G{+k7esY=4Y}a!IQw(DL3YUvh=g=ysup#S)5%7G8WEG0u`V1 z?vmqqm`e`LTgm>B5SuoDBrQAE@Lre@Bzrq}I;eRg`B(Xgk0KEt%@@i3xe%LrK<0h2 zT_CKo9Uz~u*?U3iO?C-L&}==(r)8G3yYRR#Kcm076|Jg7~(s!iX|03l+A;qsL<=&lg|7?oBD#icQ6ummd@6i-JAw^4e z{rq!GD!zYD(cP)|9!j|{Pr3g%<^I8xJ7dg(_%kX0KS;R`ONDldAAIKy%W1;i|=x!lQ^{-n!=~Jp5{TLceVc3RT>0drndd?)aIX z)|(J7W@`*qwHDaI!5?Df6R~jB>Q;BBg}12qSz2CYeN*Bd%Q#5$>b8ZsW>rOZi=w-LE7r2Ubv^5O z6Q)kexJTzwEnYp@c4rmSv#Ns#GW>Yx%lw(Bj!ysUvw6ad!ti*S?%e5F=?>jBRMjpIBDX0nL}iKs_txvgzK|@JZjtay5hHkL6+rNfr#|=MfJeDH7LWagF!`}5b74^@Y92n`-v~k zuI~lj(o>-K;Eeu0zI$|@3}dzeeHV*yIFILDUFBK6KgMyF!0DWiFgiFmWE6U?-=OFE zb)1KGtB3D}?K|gm_5JH7?R%l7>kAe}-v{GZug-%vi$DQ!Z6L0U7Xv=TM9qp(ChhcA?2ykbD@hH zz0y27uWK9+Ag(tDbH(?L{92Tsk1M^yyCh41F2Kj@%e8aoJoWsI{P%Rn&XM+hT$^}5 zPVKsqF!Co|K=OOKiuXZwP8WqN;;XZJ!n`QXYliZeFw!Nc-cV2H>AU%ZCYR1?Qe2(~ z<3HY$Yr87%F3a`ccRS|z-95Eyd53_WsH^4+K0M)U6X zo_xK?#iTD20E}H!soz1_2`m8ySWLn#$FL3SDsa-V134KBG464Gp1KOB^ zJ5Tac$mfXxdcxq~UfK#bZ*VcX-Uf8Y%(H2JCt#iddGE`Aox1|ip{t%SkL32nGT$|g zcUNZtbvEaa5c^k@2%z+ ziuoa}p`W?Ircd~}ycC~Xyq~?MvroCNkW62%pQd>OwHdwmt1z9K+Gup9-F>uU2b3Q6 zU|l!_{p=BBcWobjJl`$wEhayGq?5mt`z+iK=}t24XgYw5ivI`Hmje^qyF1}|jPAj~ z+=t9n=+A1UV=X)866(Y>g(3gloo271LsJ?YO?sXZO*wd;pHLY=)2DXRPrLk(nYI!A zY5lY6Yo)uB{>tT#>5bKPN}sE+lC6*WAzfhdeN`Rxd5CWK=5f*uhqB!4!cule)DN3~ z@%aU^ui$s+7Ua7HnR!2w^*6m=r`S9S_b;*6s`!0+@gZ9p)%g zjIF7dom?sKNkoqOfwSIkKB6CE5*fD&?fYwCh~(kOkG z9>&WB&uZ=TI*R9a;cxEr#(Cmf3MJNR9T0L9@*S-g`=;^VHW7|B2B={Ro-!!<(D0*Y zxFJxJ_?;A62g6!+9sh+>t8f0d?cW;v^_CNdoSUEW5YEx_vt?x;`d)U$y+3^KPtW|( zsOhgh|1WpbjKt5S!L4QAZk_eT@BY>7pT6(cqj$G%8^e(KJ7v=;N zQ^eh`kJd+IvG8-OVru<#vGBEg-?ERu-NQkHuuRHyu<3Ow?rGS+0-g=_fsCUY_k~!u z+w7kLX>S^Lg;=-4>>mLcGc|UGShpEu?C&G*7t?~5`>vRu@(v=6v z^u`xLtlI{T!(QvS&j8newO|XV{JA#7rbbZtHrDJjW`7@%OV7WLNU7u5C&BlDn$M8l zehnyh&11;D7JMH#$S{wP^0yfr18RSb;%y1B=~aYPKE47{&510WrgQLNAQ03AHDu2!gm5y3a^DY^% z7JQ6)#`juw8+azD`3l;?Y$K@r)czN|X7w?lbi58?)%a?Nb)BI6BZHF@v#_ZJ#NUv5 z!;B%|>@|;~`2_#$#-RBEuMhf`Xx#n#beH_|yN*hz=f_5$XSC9(_4Qu=a~xqs`}v2P z2_t#|l~&JCbDu?}*RzzL+}9cXE_2^#w9+Matpn7f{FXe87XST5&olZnMqg|6_l@@H z(|UdJ^YVT{GbVFU9|rl>b{&{>3}V{~uHI2U7eVPw~4lMSnRJ{<)OrYKsrs zx;i{rj{nW)pr=14I%qB=;}zp?^_;ofq^Y)GT=N*Nh8^*oxgC1pGT|$yG2_(a3m95Q z|9jK`^6WN0o~Ao@^BFX)?m61|j3+apfAOQK2sYBmzaXo(IG^G9Ty1jQcUs8T{}=D% zbENr)jD_#8fUk}T=O0#P!?^-@6|g)V3&xc^45Sk4&_|pTo=LlTBKgYLMcv>W=P$f} zV>D*0)#qzJ^ILunRcK9A1?NBo?he&nbX|MUJL}vYvSK6roh~sy)b4qBJUl!8LwqXa zhoWCbH+7-cB|swp_W}n8D+dMNctYQ?X4hxoE=Ytcw{U$Geq9l|2&dOXx5*knbUlxH zIzv2V*onV%Ff{T9d(c@#{O$e;^1R1Y%&QKLiIBfq`3uvLxCf(wGqCKO_?^Yi#nHL@z34CY zP$r7IW9KNF?`U%Oyi%1|f5y73vfx|pe5LoGze3N-y0d4f_Rsh*%uj{u)THCVkJhfC zn{eyZ-1$0`bq9Rpzn6T_+BMy^zE5Y_p#SlF&_x`S9#^!?!p@zcEaCY~7e(jjaGnnJ zsq|St)D4#=#lMSuk{(@W2#sUiqVB%lpm~AgKXIb;VGP-7qVs!*UtxVd^YU!Gkh-~l zamX)^f9c*jD}u??6{cX2m2|gjt@mfcI?GroJg3gmrZDyBgfs`B`cj5IUg3JFk9(|M z$WIG0DW4rrli$UK-ktGijm!tQM_qctJEd=25ynRy4c)kJK61MwbR(kBjkL-QIi2oM zXBz&>%J+AbKlLT@=Q-ka_30hVpT~VVi{ww2cPo-V-|%il^5nZ?8Ix%)C6V9%wzQ=A(-6ovb;h zS>{jih3~+p<9e=l5kG40m7kthLN>=^N`gnJ_m(d3sOn{@IQUL>;T3nOy3aTEZxsh> zgD8%^uZHjVfVOeHJ5TTJ?~5tYS8MK~mo{n77;6X7DYvT)MSraP=d(0SSF%3iCl9SQ z-<1bup$`+vo#?05t4&Yb$HKZ~&8Hr1Ti!|k<=gV3c^B2+sehsUo2;=xC-Le9hWZ%oZ+XDlamA4i7p6OLZe4@sQYty0 zvhaTSLsQrf9{jTs`<8?dl^3|KIO6UJDg81yx&Osp7x~16Qey3&YqN9jvr^5j&^JAQ{fdh zkvFbhSfB0Y=@l>I8ubT3vJcmIMqwG#_&np=q9z;*g!QY^__%U`59Rf8OO#KcpElR` zhhrpPzruPli*rN$y+_6058YR!@e*U?E6OY4v+;bn@5L>8Z_lu`_-8OLba`B+=oo9Z zkhc7ouzrwVll*uFJ)!Fdk>8ca6O@O>d5-4(8ke_5Z_v9WGh-agk17t;O~z4)dGtix zFVfcd?*c2+O}^fl|!nCV#uh*Ki#9)sUasN`2ojo(&(R<;(YlvU-^QvQgDi`Y8o(ATQt!>u)HF1Y~UC1B&xwiQx<&onNe%mF( z`@W)7*y{*u?X8<5?)!R}?+dV3{BkR&F8Oy?eCme;lOs3ka?-73aKf#O{iDd`@`rHk zgA#5F3*9>S=81SdQRs%gJ9ZmgUcfWYyA_4Iv(QcNUF6m~z-^M+Fv;fj4khyQB+C>3 z4k-_U!Mp=1pRf&hnR1xt!*@Os<{5eo*9Q3X;wOqjbL9ius(6nO_s>y3>@L8HaNm^1 zCvFU|SnIBcpSD0_09U@$TdlR)vp23E1$}BFJ^Dt`8YqP)tzrGL@DFS)(jO_HCYlVqlxqI^n^JMJc&WR~nM z-Q>gL4Wrx{`+ofxYYgWlWvQr%$1?5Ion+cIeu~$EIaw!fK`xE6ygbQr^Zn%w$f5ET zt#xR~9F>1s=4?P$|^n)oy{b+P}*^=~R)*M5TKl(XoH z>1CVrjk>R5FrU0fE^j~9cf8=?!}KKHC0{0mZGU3@T*YDDCCWKDp7wQ0YvWWeAE58^ z?QN-YSVy|Uad|uz*8AzgAK`sksytioz6-)JHt!QMxORLIZsH-{dsuh1cWYdJN`JbZ zeI(&uav$j(yhL%cE|GWnwNI$b|1xa1W?;`4&-bqf+Y|aG)hD%c$-0R<>oG&!*<{@H z&87CCjJ0F#9jCvH^icF?4-jWyWv_HZ?WXZSonE85sM>&CaT-qH8} zw^;vw3u9DkqvijL_?KVS6dpVm>Pmi#!B z+r1aW*Q@&b`LOP`)338Ww43uMy7x7(cAK>BN6wcBuQF6VX>DB}`J{1^@=5WwXk17- z4{&w^??x1KzfKFWPJ;!l2LuP~vxiMuc6at6m0%tZ_i@8c+O`Gd@bB{<5@o(qeVE>+J?Dh-g6=_skcTb{?`i#uHkMi>(e#A@h z?OB`{o58ako}KWNzkkACC{t6v{Mk3;)D!)PaU+RKs*_e04*A5l3fc&(RsJJ6Tv zUJA-Fn&*;#m8IgLTx!JI$EE&G`5@hh#+KSk@8jtylICv^Uj72}=ge10SJKpf03Prw z7=Jv7|D#F&m+1UtN`5lCJdZp21Kv&P zJsf}Y=gdt>y+>kxuR-k*ZP9Hte2))~+M~zSzN`=52g!_X#lAc0yW6VR6Jc&ja~Zk| zPy6=jLX)BLD*E9Y!!jPNJJ*rFvI)Btq1~PAQE>9{PU)PlGJCgr_%?9%)N^MKN)Em~ zL;GH{2W4N+_q6j*nw@`3yZT&bPdPbzQ2zBD?d;3UKj`>-d&-Ue_!;SYWUn?E-Kx$K z+Z5m?JMkAvpLbYsG!OID7I*->mfQeE*t0ocxpSr;R$% z$2W*{>m9hgdD}eN^SS6GtvxTHzjJLmV@%braE=-o`4$yVt>dS?m>1FhED`%Y(m2zN zXOTgE)cy%82&?oJ=mBkvrFOJNWvjk~cwL-T)D6OEzo7b(S|?9bY>{#j`KVB+Xp;k(qPF?2k;JH#2kT%&VNQ(0%4*Gcu)JLryar4imVf zV;Ht{ti@d{#>*P6xN6S4nKKR-@e%x3{PQntoZV0)(Q{G`Y!UcTU0IoJ6(}1P8wc|} z89iEG%EOSq@G<*^ZN#SeaC%0CU`)X(HJ zCVV9m>iRX49#mt(_ssI))JHkPi&((WuiU2`lfLp3KD-b9=EDE_Y#)BagE8qBmQfM1 zkNG>qYXGhTwg8tKyc*by`x1j^8+@O9<^P7k7Y*JI{51X>fx@>O$T+29DXHoXp?T{?rEK-OO>-bFqt#~~o3RJ;r%%ZmNLM&KjBa^QC0Joc+^ z_He~YAgWcN&F)KqFVFP(z62!8&KEswS_izI@LCJ61d?^<6&^OdOy}g+34a)PEpRzd zbY23i0vSe{qr<}$R{-g+Ra^wbR4b+dS=Xr0`>K3a90AJxEKubT4)_Lo&%cU?_@DT+94P-IEUI0taNq)9zq$K>O}N*X`ywDk zsCfB2|8B_RK&8JQsPs1(TnH4MwLn-|F$1W0FHQIH`hn7eT|oIa18abj&AkVsScdx{ z;0?h0&3!9S`gOIruK?EKo@VgkO6wmG2>hE;@RE^}uyN>F+T0 z*r$Py01<7){lIqMOrYpENMZoKTzoLHc1nN9YHSj?oqICCWDc=&p#Yoi1tOwOoksySH3JtBuL$@lURXoH06z?IR;_U(|-ew>osAx0y6+l#@ z;t1{OLf|2w!v~bV?&DIq7{jPO?R><;CY^IZ#GT*qu&Dv4^p!xRF9Rx{$v~xlf3iPs zq;oKcxJl<=5T!c@18ma0TuR>wRC>KDQwppEs@yYyD$h}vrScpC3hx_0MAG@XhfS{m zVQJ?p9yZkih4%`e@amo^@k!@rD0;V1#j0P6gK+s$>{Iv0A_bP4cs{HFnhZ?d_M z&`wqG??s@(p8?JX_5iO0t}*|mz)IYd)%jlnyaIO_5LBJi(Sl7qWC}cMrNL%{Wd>6Q z2Z^M3`wi|f*kf>|!DfSH22%zHeST-{H@L@OkHM7&n+=v31PH}hpOl{R5q^Kgx6awT zSmu3ZDIE7-nfo7LzT$`epMB~Du^q0=>I%#@u$!6`8{Rs zN^>u?^r64iZs|k+=rN0boyGq>bFVk|FA98qp})k!jH9pD!tXHmK6C5bis%ddC!If2 z`ToYj&o%e3xxZli2>sDVD2CF9{^uX^EqCZoZnE&uKb)fc3Ex8_qu&oKe&|2FWb_q( z(ue=V+*&-)Pxh_!p}%&Q(I5I}|7!6IEPk=k|6-X-o_bf|l%dSR7lQ9x@P*$&KI9JL zfpaW8j316#c<9exX5pd#-(%sSKR<)KV(3$o67GK>eLTDw`r_{7yCcba=o%C8pHJZX zWFo(RgI{s{I{y}T|6?NjQv}At=OyC*al+k5`Q!2bFyYoaHSzGa1pYaR@|>Rt|9m37 z&b`I)={xRzIuU+Ng5J9l_`jKOmnHE1RU-YrPvGB?2-mwxaeDOLQQUoNBESEVa6g)e z|34D=ZcXI>mx=hB6a4(AgnN0Sd@m*3f11Ge`-%K|6ZF222v44?%bbMLdoi0gaXN}4 zY^&CE-?sj)Ra-gF7LFg?xp{r=fY_@xT<4c{?oIDt*n=z~X!8bl-ikzb-wOb@stMWpl^Y&D|U?+qgb{a4$Mk=8ova zsk&q9rn^ay_2ACtwRa|b#7%qI1QsW*A5`E*&e`cY!N9HPe!=d$xpEM?%!5N*{Ila+ z8EGj;FUGrXzkTgihsm>7hxBwDtbvCx?3talYj`LncbpT&sLGLY+uGIU9r!{q?AV|R z!WXJ-*_-@bO7BZ*M#UzNFi+uF4}E;9xlL}YwL5tMdkc}6+A1BoU~K-T%h zP~`mn(S?~==_2IW_cKDrw)J0%Jz^6*dUN~gjhnW`0?07m-HHT7+QMCy*@=8e#$3ik z*tm)MBimO(LG#>WRN1#NdJ~h)Wcy2l6FwUf9%G-`kz!YIruDYmS36QHuYFGSwryU! zdj0L|*K*He6o8>8!-Cv1gsOa~r0grjyGMGQDWeFWTAS^J%y8VYF&;0Fnz&NZpTukk zNyd2$sH!$Ziax4%5y&H`$mX;<7fRuZuGm9FP|l&=h*qs&BUKWSPzpY z50Qc~cyvBgMb{r)6U}Y7Z@?-2j^{c1ah$d0aCWe0GW(ZouaVZVv`*&s=CgK{Vr?hd z&%~O~L9KzYwgVAvPXc5AE#J_3Dr;C;EBZC2Z}uJdLBH;#(z>tqn=xg}x)Zoa!#qqT zFV@;zUWLG9UhFk>d9eDan+dd?drE;cda zu)>IMYmcMl1*}QpmcHs7>=1bshP&W!D;;~ya@@(Lbxqdy!H-_EZ~Z#nwJD6=waLqi z1G&%1y7#K!f%H1suMBVe*|zSZg9p4$Xx%*MQ?MQQ;q}><-|dG{nZiCJ_TIb~_#nA$ z4?M%4yULEa^UO-Cy$Q%ddFt-Q@$y`qBTuDMn%lyDjvTa72almub|bwVLjDI=XUZu# zhcaGEx)4uw!Cu=};m-h(9{EM}4Yu#f-+1Mh9lH7|#`BZm zo9r-GI^`AYFqe#Fhskv8tBToSN9HVcI`_E=*_P}IUJVS*h1Z2v&%|s>`ax6acGtO8b@Z(|&%uv~$K!d;NH6U*NpPI5g8g$WQaC@zYj~m$qR1 zw4WR=Ep6I(G;;@2ewu01#!JgQdd{>;qc%YGLoU1c*Bo|nGIlteC!NbLcCIt%d#H#0 zF-N+eo4tre)lFZSl|x_YAIbiX(|2+7(H9zzANxZ-al0C)PN#qB+rfC9uC%Jt$=BtH zd%Qd!%aNzjDb09w`tRmRr}lKb{Jxeaozi?VcK#zNgB>~2X@8OGLstidHtYmEz9ZnF zj&tdPY;cc9_sx0IDb1vD=w6Z|oz9~q>DC@Fodp?>hK7JER%Z2Uc3~^@X&QsvJ~@u< zT$Tfe(-Uxxm$&*{x$09_{&8$4>UYOz9@Fn8EYo&m+O+KR1arooCy4bUT^|x&43!q_ z{^?|YjzIm!phuzaID>Kw6Q}5VWt=JM8JI+W?oHq!Xn0HQBz;x>*x%>(3BR2l+g_@F z$na~%abWI#qCa2!g7p)RADA;{uXk42rZ&HNyzt{=%f}tnLzM9#x~)27kn>$bmvPqN zFTeUT)jNZi#mdLof#GXY1FS2~P&|dZu^M~)-~s(_zwa>mrhZ^pnu)8i);Mv4%#;V? z%NZKi4Pk#H&@v27vZayBjGw^hz0_%nuwv5kOa@-dq;I|Peh*jN1Z4i8LhHWNJDt-! zY$^i6`Oe86HXQ|j8S%8wMf(#DdD!#@5IyXC-NUArfr|GOkfaq40F_^lhbz_rMMtyw zUv2){CnGwh0qHAup6y{%5fGMiPWG_r<+J@hj>mz*yT`*7R|DC1RWTWej4EEHFxoG( z3rIa&aW&9|16??ULnIXs0OhayF6FOxzvO;{Ldv}k2(v46|0^P{s0FHgVuIqmMBx=r z`(>2hO+e*$k-Ayo{^rhlzpyVHf`+;12b{uM;45 zs6VvtMebnl?CEmuP(OTuFog$uzE9z#3G<)#DLsELqx|}9H22%)USaO3Hov*t+`ne- zCFbrh_ub|W_-~gRMuz#(gXE!o1EKy{%D3F1KA2)--297v zI}`2#@{fmqm6&n&>V*5kM0)MJh{vCiz?Zz=RB_|+f0c0mB!TbAM0oPP*34>w);at- zu$!eHvk=SzhYtvAvXKXic4PdsMiV^4N{U;#@;J17>X#NW1jK?_@Y=L>{q}V%pRQSZ z*LJPeuud89Xo<*Zv{lY1B%4ORNI51@OQCMzGlYbtIKkU?u#RJkkoJIEjIgW~$A|&G zpxw|FBQlWU7G4z+MHj!cjLW3IZfIS-LFpit;GN3Z$=IZ3o2k{mRsVS+aFKma(R4L1j!Zx#Z&ZdX@Q{X)E0uy%8OWkG{p;V>9)oe!(5&Lfh|tCo7k- zYkhp-6Uv#_(I(346xaO%9_GW`@1aE=hW{J6!HL1IS+#vtK z<)*ny_0v#G{>k5o-p$)(_y#TEQR8D0PjH`bUDC=Yebn#uC7!;c&_~x%zpNtX)9Z!T zd!2vy26#^jx~0*&B>gb;#bgQU^W`iz-sApwOPsZ&0@jk4Pt-V=`4i6Hb$zuobI+E} zQWMXgZ%)J?CO)kD3Ef0@N77eFM~2@?reO_j;`j9>@*HA)Pjn73k1jgL>yI=a@_q!He@TXhLr{)fv|Oe+G0qAC z=S|`K>zv~G?z@=p7W+Pj?^VU~`+6_zck!oN{PSb+XT{=QZ1E3R{5cl?(pda?vG^4h zzwjcDzslm*#o{-{;x}3Rw8d|+`0cUyi(>Jwv-rIh{|1Zy*;xFWWARs5`~wz$mBn8h zi@!b=|4xfv$lW{Q=N5~9cP##nSp1z9KW*{9V)1`77XRz9_}{Yly%vAB#sA${{O`r$ z|G?t2F6ZdkYw>>+i@z@x|7nX~_z55Xk1hUBV(|xJ@&Cf&bKcnDf5GDaWi0+*$KwBu z#qYKFuUh=Si^czkSp0vs_y;Whki~y17Jnob{~e28INQ_np2h!{So~wL_#asOH1RJ- zUd7Bu)o5OdKe^AreI?&%b5F;8Ip3Q5Q~3F~ncEt^%G|SX&*i(GzjX7!2(Iin^JB}3<`vI(`CbX$%bN$d z!((7x!TkBcuXp-@rGI_@?yf~Mp4iG-_yF&bmAd!S3QB;ffy2C|=G;4HE-RW-GXF4l zjquKz4+9_Nv3yGAyD~!4ValMl*bcjLlq`PYz%BhHO5pa18V3 zc>`|A30e+|m!g@xJ?>jQ&4DgtB^rn2-Z_0)Q4@H5`AQ{6rT6j>&%rBQfClkzl>8!^ z(^Ytf&f_efdhI z6B!v8Ug;k+h<~Hx8PSaXi5AD_Ko|Oam~StC=^(hpSJA96aCjLQZg?*`OwNk~?N9U? z&4DgtEgHT2FI-l1K6rikN~H%G85mw~Lymu=?dV|*oxzGpexG;&9;NCpNb8la}mvfF4-C1UjC+cLDv;_vNqUjGzYq} zY|!ik-a1~KiVYr!@j1|yWrHTepzEh%gV>7WbD&Fh7Rlf21f6m;D-3z~deC$upADjO z5uXEHSvF`i2VFlE8!Y_%I5uc)%0z519cxnpU0F8xA=*J~C4W0;b`o^`RBRBPi};+= z22JmRuAhnx_8QHBt}Gk;__Cr|)Ehz9PsIl56GSuzy0UE0WEgb)RBRAiaeNMRW!a$V zT+sDXu|ae$qB+o&WrId@(DhTXLHaWJZP4nviP&H|R@Vi(vTV@$1wq$O#RjnzM{}U- zTIvSAeLv_!w1eoJ`0V<;jxO~{>GSgK`=Zi2`n*opEev^N`l9rC;l1b>adIv$5nbw6 z)Auc*&pUr#S~gQ$I=|+(x)v{ea_ix#sexkkU0j_3PV7&8YTrkd&XAw80Sg0frjJT~ z)Qh4`eQfZSjKFL4Rp%94?(=hXVR7l#FZsQ$eP4fa>qu#8pj3TrSB6qxYC!#$Ouw~s zzWN451r`RrOq*F6^;<_N7ja6CKDsu`(o&Vl(G4E#bChpicZ-MQ z;cUdhz~yD9dYwFwr|41tRe7jSc!cjLkF?~ZJSaz?6+0E(z8zKDK^~4L@^(y&f5_D7!0% z!XjB&9@fq(Z&wcZe1z{P52w>sjzBB+EV{k!NRKIp=R>K+J{ehA9>_@am|m0|(KmEN zdAK^z$`NQqPb4$1J8Eml!^_i+M>DdrJdly-QQoc`@c9VeQ66r*VdV(4q9+;MQJqB| zo)4~W$jHj_F#9*XC^-Usq9e+~*`t*s(2Aa9bVqeAd3brc`XD1K%L5t7=1sp##OEWF zCCVex-F$X#y6gGi>wrjBmIpGDE{nfTuk?*fqC8xG#mW(A&9ZZoIc0Zxr7&=LSy>*) zZx~+YwetgNLrfllR@pM&!*aWEHoOY9qcHg5>uSs6M0Ot8U_LuH8>H;6922qgNOzG( zpf$_RO?Q!j%R^!CMZEFz1=NWrvh&_peHCcUvU8IMGH`iJ#Lnp}MDhrGf{S)r;}73=w|tzfTNwBJ*cycm!?Boq@M?bioZW`S=?bqsTU(Sgv zPT8dCLRLRqb1J2woa6Vy9Z$jS^%c4UZrP&YR@=+Bx7Snce}g;i@PIp}Cte1L@%1UR z$Bw7q_Bs*MLFo1}@MCAboqMP0;6&`w>Pa^*5c&$TJ-&V4?L*jQVT|8_HrXEEzRz~5 z?JhhCb{W}DKD)HG5Pf%jtW&bf7~MJT(sVHB{t4Sz=ni&S80xBgc4@eS?#pH)StR<= zj;G*`>@u|7=t-b0t6e?SaWc4rT}HN(&o0e&g6@ykZ%*1}q=WhF(sVHBzHAm8nRYZe z{{`K_F5}~tKwH*$*l-8kA8$OIw96CrkF{=88tR{unD2saudmpA&_VbeXv?xovmIZ~ z@#ndy--=ixkJ`&f2jO>4yEGjPx_>I|<$<7s`RvkoG7-Cs`Vi0^Xv=CZO_o9TPsJ|N zF}ee7S?%R1jBk^68R=j?yEM9;oK9w3i!6g(9*ET^q0Y!^FRh&qx_?S`8F1&bOT#@O zyY&2a{c}ef`hx9c))H;a)s@r2kc;oTSpVGmw0_Nge%Noo{u1G~ez~I!`Y)ru%(rhZ zg`0l4laqy^Gnx4*`peXt>RbDMIrI1MR%-^)dVyKL`5eEYc&vj=!`a_uW~;LxhRR+L9n$H9|8 zYnDA*U2!t@?De}ucA+(cD324`^{KYElml8NpD2&sn4JV#v)Wy28!5ZvmBQdf&Uq`R zKdi05XRR4Tc|>&|w%}#v`@WGLox;48=XHtJJVZy7N7Sc69)Z@Z{;~DzDZ4Ajck_Sbs6P)bYk3egdotr$+#|hhcWP@kW&LiDLuL7-Ec76);RbFRGG``HT^K`5o%xUM=Mg`kZ z9RQ9@+fH3#ZM)6;jJ5N^m^^aYxwW;Sjhsk(9@!xB2()I|xyjt~VPbY3>25wdH+clx z8Lxky&(7oXae>y;ZRb(nhjIj3v+Vp7#?fA9#A{AbeD4Ev~$zl zU^^3O&kJMr5opb7&n=H&I|@T?r_`PohB`5yom*QQY)5qfayzB=+-%T|M;xul1zXPS z)s@WI+vaS?!m{j~^#ZeV?R91R;rj3zn`G7t{9Z!0kIB(Wd9Y=TLwsLQZ4~1YXXh3M zE+@ONcOMz4&C=Yz_Dn~6_j{#J?A_n@!>;x7f3kICw(Z>y^kVCo^$pn}WpVbS`hYO- z`LzTaTOlXWq&={dWwDiM@e|a!jz^A0(qhAz{kx(cyv}AUjP$N<4tw{Jjp`rqRsD!) zue0kH+Fs{C7j`Wgy{<^c;C8kGZiRs((|*H$em zUN18@S3TYyYV{c+nw?GoIpi6efx0k=!3gvV(D-0Yb zWrOHlej7BM3%V}*L>?z)gRTx7&jvM5H9;HfwLRs5t}Gi=zj=Z-=-P(yY|vyFbp2Fp z5WUN9gQjyq*JYpRNoGzOoy%u~t`9Sw4VnytuFF2rlT4clZt6eP1woG^8>BsUGzYq} zY|wNr=(@s?N2Z+wZ$2Aza|7eq;3>C{85>0J9L<5QEE_bPn}`jj)g~IvIc?Bz!`oB0 z!SUKb(~Y3(r(%QHNkns?3t4C6Z?-~R<7ieGdU8_jAbRKc9O%lj!4J_6rek$opew5# zv^HfTHb}o9zYSWSAn5uj*O1>7STuvz>AHoHKGP0@7v9syb?0;KjBTmq;rjkAY`X7j zt8Z=jmeOB8R(_79J)dx=^MqSoE_}L$&m!E)7W(xr{Co>9CfxX-^Mt+`m3BaxULRJze13pgTVm_i$m+6Z?qAeb=s@DKAJ31h>8e4$>Y|x<{eK zg-;>=l+^U{DbNqzg@xSLN1TyT7jN`{yMLMdx43uM2U6Vmx3{qSsP6m>_h;`RU*Rtx zj_y2ATK~>3@2OKBxrI|a(EahpDT8+xytkVB2bEqpmDZ=@jcn3|I7;(AZzp?q>b-fS zapg(UL>_^r5AKWKSDv{inL9Y5I|p?y`JUcS938UzxQpSP?kFx2PqtjVtmy7V^SLM6 z`-!jkabNww@JIQ+ICUO0Hn{JdMeNJR{n6l_=G}9Hd*-sf8on>EbZPqz>6QhzrCS}` zq}w*T!O;}tKb!n#gJ&qU<)_GSMBh_Q7vL-RsLXJF=Vtui+W_}}59m$w;R~Aw4x%eu z|MAcq?z|Mw<-eD^DJB*8J1bm%=()-?!u^=&Ph;d~G&}z(aeq&{^DmD3&s^sG&N07p zVtA*={Ni}ekNd~)&WigR-iyr-yN~Fd6Z4DXy)^D0!#gkTZ+I)rkNP6QTNU$*mU8*sz+p_IUos+qnTk<~Mt9wC;xmzX2 zy&%}a5cYPEdS&oW{oN}{qkByP96~1!Vr!8b`wriN`RQ21eJ!!NuUB?C1vu_9kzuJ>IsV!gNjd<$%0rb+{Em}hTMZOR5w|k_JJ5LKso*>N8 zG;&#w)y1jZ#XHth7p0ELFU7ZL<<6ET2BH7a-qfqAcjc#hPKSx}^+`QHE8bcBeNP+r z!&3Ks6+gu(Q{K?9%U?U>@|J%&chu<3cJ9NOkt^Jl0eaPzy-c0AddOuU~pY*RtiG{f!%My7_bYbE~YX zuBokCP~Xs)ioP;_ALw82<*UkzzWeWn|7GEyT>7o5(l>rkap{K7 zjQryt*53E_`)~AquH(!9@3;S?=zk8bc=$`-pS<|n5C5lUzV_bdN`JNDtgrv~ML+vr zZ*A@W${)||>;7MJZth<2KQFp$+9T_)xbQdr;~S&5{Gfd8pKkuvbLZ_@*0A`Ivv(bu zvS;IEZ@m9||9IQz<yhzkK*#^TDaj zf;sNB)jgd0J${V?W9S=hcK)d~KHiw{&Q>3;_htEw3BR@7hhxY3jR`+w;aBIue-ZbP z>E73)9V&im*0z)py=Fh{?D0zKT!9+J_FQy z%#QekyBvs@yN^}(#x~%l zarlVzZyK;1$kn7DDFbq)=|?DAimQ1)LYUq^{s?uj?lL3D-G}y(GLZ4_wB6_W-$53? zudmSDYm_0sVg5dXfXnTkwy(=QiL%;#ce+ze_os$?=C&$5@xwiFZ_7>m28;hU=599k z-6ig(eJ67AzdTNH@3-!*Q5FSI9+MjUmNw~X-9FPA{B3xnd@PA9VA5OTrRZ+B601!lj88B4T%)z9aV)vFL(;Z&@#1Y>wPp>ELvleYZ$xgtJwsIVg5p>#cW>s} z#@O?SnUe9?;$1ld{G*0(^6$8N)mCm*&7^gVzH^P0{ZozMWBf+}xji*{2ape(JO()4 zg{xy8`5PgyW01_3cu<~1yog5F3`oF)isq1 z{LQS~|G8~dbn|Dfdp}((Uxp&`o5kO*xWYQ$%>RZzKdphsD%10GH^!rwmhxz`0qI)`b z8NQX&&HD9$PoMicUAru=ED|rpLv2{{{@I7Q7j*@`>z0Aztn7O_)%Jxy=}iTHr}|6Y z(>XLX#r#5QAl%nEX@2IuPIouvRLws$50FpxU7XB6=x)rAewcV8j5*5}6$}g$-+f}iH|Z~e2nqbUHEy&9Zb;O0T}u8HUxTy2oCq}=XJD&9oeOM1EYq%ZDoX59B}(z-C-X>$26t}EJE zuxyC=mB+~c@xsp^jovh}G+zm6co*tq(`*lEluse^Y@`((^i{U}XO#=TR3a>wA2ioh z1zfz-hEi6^(*pd6|V3kXF2l-kz~CE)3z|6i<`k;FuvE50UmD z;ldyCZ47DQ_aOW~NW6Hs=$HQ-d+#Ro{_#3j)&k=V>5^$KF`Oyh@p5G*?m?4z$d|sZ zmnH9nMR5|eofqN^SscozxRX|Sc?4X@#p8m(%DpP zcpFW3-3(v3>pbRjN~N{qFoJ!Ibv7uwBRg)bJ?)!zZH zx7l*aAL0}hFlU=eEeP@CCS84q%NWANO$Aw`CcSq69aj9vuc-Mw`q|4v8tPG>#^~m) zulL>zY4B6p0>jsnIvVAbEtlBc#0RFl`m0Un@B84sk8v08l-+x%r^0)udh4u*x+JsNhj93oEBuxaj{Q0QVz-XJw5KYI z(!}%Q%6uoAN!X@~@9Z6U&=!lg$@s3$0ml%y4iX;6l6*xYg=`TlUT5Vf4{<{|0)2^mnNM}{Qh7tWF!*oQ|2{!l z=3Jw+Sv=i4wr+~^M6%cVb>^+e*t-6K%=-p?lqsujp)OS2@}u61j{X6<_2b?PkFt0B z7;AFJhIwOAby(39|Nfzq`=S=@gV@p|9@^OOw?#90zKeYr!4Dq$a$MKq#;}9D)5yBM z`l?Z!2P}@OgD<0vAzWo*9B`iPIX|`!J$L(0X@3{*EWL1ELCH7g6*Ep?kHlAFG;9Ia zAT%Gm%)fsT_BRak-XpT-Jxl+tx9C)#atMFzZ#h_4{6wnYn!g{sHZ`yxUDciz=|&hs zsP58!+Y!d9!iE1g#TU`)?6CLNqi@=qlDXmyLyz|CE`t7fJ4-GU-9^Qz_f#(S_>9JJ zvLE4Cx!$J*zt%^~*-tQt-`?I^oV|xK4W_Asr=}dQ+*|>)OtSvTA=+NaPGu9VDdB?# zbB{{56+TJ+#Cel)iRU4mi;us?=5ahOehg0`c$6;m1*9j#wDoF3h9n36e7IY$jo!~z z+wvx1hhpKw%wc5oHnZ>NWZvbVzCZRR{5r&2pnK*PysCcMq$0oeeEdq*!g=>JRS?rF z?F%7qwfW*pQ9c)s)Xu z?!C~VxbA)NQg}br@9Fs|`*B8a_Yq#Qetm=O4cRSP$_sdFf%6EGx%x}kn0u%AUG3+2 zo-nP2Kc8w8F3}|VSQ|g~w}cnP_5_6WaPSUElL;s`&3q^3;18~!;ixgr5#xK!PI)iUuWSjsos$O#Oe*^ z30;3U$no!y({%jeWe7GtrVQ{q9&dQIuM7TFx{%YwoZn(k$lKBx?7xUM!tvkfisx$&x<8BZ$NQL% zA=g95|1H|uw<(8c*mJ;-C6e*pCf+Z!--LKfVgGCjf7-)>y+r8>#q-%-H~pMXrf;3~ zrf_=3tNXyy2fh+)XEF7I{+?iNbg-N8&Mm292XCZa`EhFC(DjsU31z!Bb?g`E)UlCk z(9f&*`>`)q0p%L*MxPSx;_zRk2L4*~C~OLJ*N~=$@0Qeiy{cFAT`v}rkR`WO|&zFhjvDBhps1&CFC);aJSOAHiW!Xcc>lF{?8%WSK9~r zP1lA{ZgY=@HpHbv9`Zk|__RH0=gWkH_=oYwJvs+FcQ|l|b}O_$(hJpx$7dHbs(y6! z2X6K%HV)5jX{2tMKddm)y0+Zcq2F|Au7uB5X6Ty4Ud|ER!<4H?^)zwkL(5_C%~QR> z9^EXQ#C3KKo?l|4$1jJD3kw=)e>`5wFiO6Qsc)OQ59 z^M!BpjQY;&;>V?Dk`*`(BUABT^p0HRaE`ipz%To_>a*sIdoA@f_BnVBx&j`~c^sRB zorQYpIC?kySLokVr?=65)9}Xi3)l(rWi4aIZq0-KYST~q_VZqsbS>MS&l~$bICeUO zogS>mj_<&Zk;PlcT|Hq0CPG_GgH*z>Q*X9w~6YK0#{_yc&J+?#mp;)-~$-47?*O+|*MF$2p zW0-i%Y(-U7U|DE_S+D;&ib@x^#={zsw&NPx(H~UrwE+y>>ba|6SXU zU8(=`-=wpIiC(9(lq*hqvW!=XA7jb}9VaTA?2UAxY(*awZW*5X!;fQ6=lL?gLn}j3 zL2Ap0+I{LI^8anM(~hl|i)^f$Y(rgVo z8=`!w&$4Wdw8LLRm+0T1gSl;uKF#s;d1Gwt_yM*3XE7f*w%@3J_gnDeZDjZhWEQpm z+7GV!Y4H>kQM`Q#(1arJ<5St;KwtW%%=ozXX4m(jEy#?I(;x4Dp0e~6-kcd9G_EGkhm@Z39we^DR-x`zdG_?)baaHY8bfQo-}SF=v2pY*kxYXMjJRad2xiVHozT{7P(m05p>NxGsSH7B?3UtZe zweK+;g9qrxpr7K~AiATrDC)=Hj{He8iM{;?(dWpI{!`z98~c@){A63g5%Q1XkyhV_ zFCdIMy}0;4{~qK0@2gDfkfCU&Zr0hCV#JS1vMUZc^Pc?KJ3Xp)K{8Sw=Mc0X zQh!Rcm-;-M%x%u8D8|R4_jdkV?Y{8&`HG&dl6imq@e%U0@nwnlC)`OM#reGJ0?%jZ z_OQnE=-7~SfImlvuR~a0x*0pU89TY@=$nKciiKmJ*v7~E`_iB5*SM)DU!B8v>Vx}k zplx5uzU|4;zU}zfKRMpezJ(v9FYf;X=B$3qoE3ZCv7cLy4y#?K&wQLZN$vZI#;=sk z%~3fUlrD;Qw1K?e$vGXyoSgC51N6Kn9RBYL_Q*Kpb z9&>lh;YcpR9ptEfb|2;FOS681tmARq_ng#wkI^sDcaW>=chNV|dyQD_b51q7)J&>;jKmZWp+l~Bp$a1#I1d4{^{1EqER*w(rXSjo>$RXUS~$I zt$A}&yPqIFb;>snlgAS5ca%I98GWuVE&8O3#4nmoKc9GU|2XcK%i<^Ht8F!Gh z8Ut(YPxQSx)!WOPQ?WJt;^mCv?F)EGUkr^S(3IriE{o%2l%P@h#(5(>iI2VaqLZ4Z zm%qlfY)NwZRxqXcSQ+D2))<{V4eM-0A#|d*YCje3bPgTXT+BMH?^CZh-7C=g)$IO8 zaAmcR__|9#fSVXZ-Ds@TH@y|*3}Eh^(A@(Q}7IWu2g4=M9N z&iTOJapoW{PYt|vS!&>I+JawDUq<~9>Z(3xlbL>q*8Z}1cYt{a&ZxX~Su^SBV^}>a znX$q7q~o6S{6jDE5A^f<$ZO2}!|K$rq3+bNgSRkl`6I?HPg1TQQ?BbN*LPC`Bfmo% zaxHrCN4`96{$Vw8OU^(1ZEAoq%?#>#KX$QxOEh+&uFe{}5dZHKAH2hwTOi%gwdl?2 z$!=^vSnuj^_9NlnjsGo-T?juE3)g(I#wzM(qN}y8zX@LTe};*tevaCrd9-yJR}{TB z$@h~q<|N)v6z@s+LO*B_=ybyBWvBZZlM(Mp;%Tm5;cl)1{tSLMfBYXN<8OjS=or}q z57BqEy_%mnz5%{czN|jVmH1tWoah(C+jMyJ6Sd!@b>;G7MDU2utJ@k6gTI(G^Uf(5 zdsP8oXU|wY4ry3KhjBak)=0NeM z9+pilh?n2lzTp}Hmn$#%4jK+uzaoE!i~jL`{KI;-n{z;}b&|izMtZk4QsZfNb7#Nf z^u4NCbrb$0ztc0Ia^=FKy3O&Gdcg4&dmc&`?pEI}a$irGf9(5^kso;<1b5_K&H6v} zNpK6gv6X04JoVw=dFUIi#BPpL4p$Fs^13?wx7ftFsr>z)a~X5>j-B7gns4o8uD)GG~ZPYTbEXz8ODe>P>d~lMk zZjf|C^~mutn{)BJpW*zM;7^_PCgF!-;gs2rhwiX?3pfm3?HL;;p8A#X{*iQ8c_sZ+ zrXK0L>NC>+nbOY{z0Hm5CQ%>q%^f_)M!+fiaP=TM{HW4cJk3YMar`LYP(1@3N7TkD zuDR7`RiEat$LZ$ixG%uZJAN5HgZ~BDOfO}#{+#BXXs5IF7J9#-yrj2$e~s@!(n#l% zYqtvjvcjpK6z=L^UiWE*!$GK6XAlZk<+mW`W0-`UuG@h6G zIIdrukae6^^=+gFu5FM`NoJ<&Bk)|h6URA;_{WjGTYosgnC|$29P>#3KkmOBKaklI zr~4;{Xj?QM#J27J2>2p5b(X&`f<7qqvicJ8FR=0YAoWo*`oA7ty70Xg4ou0`EPPc6 zFTkdh9vBb5IfSpWa9})KdhYPQVBx@c_@WTbo-BtS7!Pj=;q1Y3;lOyf^xWYevT$HL zyefpZ6k7TH8c`_Uyb!+E!h!Mhb3%B5){|6z>xUYDW`%I})3|V8JpJ?#{(^-AHbUoiYy!ML{(2aa?{x-xZV2^4ZJgyxR z9&{vM9JltUIOs{fIBxAxapp|Q8%KR}M>G184-f5~kAu$Si}O9=^c}dNe;0g!_e?{Q zuk1tl1AElg+jkk`gdHrhFa)lSUIVtcJ>~H!J_PwX@2UiyrYkbN&Ft`f{ zM-O)+!=Eu$?V4QJ^RqvgTllK-KT)1)*K*~V#5)(fj~^&}^+(|SgSiE-P9=|%!T(wC zKU#RhQSEuz3+*S9W?>$ha?!a5oCVPG=(fUF4^H)cz_+LRwlK~Y(f> zHSMkG%7)s8miCsmwwA`~bjyOY61Ub=r)%4)DjQqdD?4fyv@K|9udk}9Y;8=px7D|# z+dArM(;eyhy1KfSbX9G8duvN;V@*p#V?$L<2U(=wI$uqL1F5-|Dv+8vMNbmv?we2101q;$Gwe{7l>DpTSYN{%$I~rPRTN>MHT02_6+*no9 zupnJoSzq5+Q{T~EQ`6B>Q(afxR^8B0SJzNe-_l;yTH8?D($Lb_Qd`$i-`?Jku1qhe zsqJWN%KDa$s*d(H=x(oWZEsyrPlBqtj+%D(S5;SC1>UNp3EtN)GmF=zd9cgH;tFEp|!_1bJ)|R@~wiaYtovy4(x3pC?wzs%) z)B|hk>lf72w!@6iu11K}HK>1WV`aLrrlYdHgY@aTx<=Sr z-|+U8=T`V2ahz(9zz3PPMeRFKDcBdu>O3TV-7%B_L);RZUe*x&=z>t6C98HR{<;AbhQFm6}wwLV6mV!tjty z8zrx4sA)$<5kVv7+R>VBY{U#|Yba5DRYT)~j&yYm8Md{wchoerRW-C#w^nylw!=&+ zj+PcEMCUqcYpbd{>RM`AtKn@8JgsYKZ*5JdTU#&(v=vjpP-?4TPCNNGw$)>CbuA6) zy2`c%9kmVZEtL%^F4tMsQnq33jy(u(U6Nilx2kOIU8}e5 z*sMrp#Il=rqEN2V85^3iq~Kmvwr%|#ca`NzO2DVezPNVl`rCJaxFq$&e|))cQbFpt ze$zi$Q&M{N%m1t&6>j)ZFY6bMReKlzH-CQ*OOAV1?zNaRnB?I%CjEonKh^K!jR|iv zpTRugm)JS$UErCP1OHP+KH;uB>1*lO>i4b(WAeX*31|Htq{GQ?O!zZrJO9+nH1fH^ z?`P1cpAHc58AHFdUeKWXs;8u>vzfL^nJ1U+5)*z0j zJY4ZG@FM&l0^S0A5QxY-cX`-!zxm$_M3p+Xd)RcV`QHRYMLU;!*whC6BzVd!{30NG zM>=PE*pxE=UonbMx}zR84FeHn#VbJijGZrg*t8#b6aG&DMPDBfmF;}o!={JL|2sg@ z_mGE8_nQB9pz`7B3c;q8z?;F-X5q~iezk>P0h~?vG@$4>+ry^GK;^H|4|>x1E0_pu zIs}yeAW-?d;bGIuz%u;%fx`2whfNOyG1<=Vc-Zt1(D5C34*t75Y~pSW=f4psyz4w{ zx(PTFyq!SyDOI!qmA)CsxunjkJ#4xJcmw`rK&qI|i#%+S@a6w2l!2r405EJh#^RTH1$b4GGaFy5BLmsZ!50t(>0Bi%UG1zAC5`&Ws9;)>5UNrc)!3PYk zG1zAC5`&WsK7xH-K|Y&-n0iGD2x%3sf6CMKnujYM07|c#ftXyyOoOjiq*A|udk;|l zodzcxd>!PU#=jqU74Tu8@OR$sEybe8a;P&pBdJ6;}X7&twZ1k;Gdu z$b^pYya;RrJ_l?7J_Wo6_=v$>2JZ!a2LF{n#h+<#W4XJqqoNYngnt?EYTz@MrI;!~ z4nWbr1}OTMo4eNBZ&1I^#s4{=%5f1;<(TQ=iZ`gADPqMlK(eeT2U0~;lo^}}L=+Vd zkXY&0@jv0K1Y(L6GY$RD*k4JFH;%G{U8vPsF(&6y@#l5ZUjCD6x~+<9UpCTnH4Ont_vmhp05f-`9cS?~4YXG582j{QVA4e0%^XKCS_Z zzO#YC`!Y%|I(vYkb0tvpb(;GMbMK*D6rGQFxMCd;R#lV(VSPnEMxydO1XR2SJzQ}= zQ2CX8+?Pw0h|0BQmXEj6!xf!CrN6}d%glcoQ0Z@FB-{vG4pjMP8XWu>ml)uF8Q27T z4tO=N52*6=0L9OhK;>HrRQVn`-{=3ZhbwLcq9PTS08zP$Ju`f|9-z{#1B#BG^E{m^ zfhy;%9a%YR4Z^0xCqz}ycW0) z`0K!C;Pt?n=6?5V@4g?n5dZB4HyXSN_*wibfl5COsPydpN;Lyt2Fm>uP~i`ndn0fe z?xjG{S7z|t5+Cmspwc}9ECB8TrhyxQOMy25mjIUdwkCg4KFH@MJXv%v;~l?KZVmKmIBaGJp)gKGR1g7@fD z4-Ww)m)8uwXz*E}=-y-SL4)@iycO6F8yupR&BfQy93U=L9IT?6a_ zwi&#{{MFbxIZp9>8Z`L2!B-5vWN^R1euK{#>@&E>;KK$VGPuj&)j;w4SCf5t2Z5@m z_8WZ4U@cI5D>rzN!D$938{|-wi+98zd#;@OHG?l1e9quA2G#!;{*^$gu!^PTUTCn{ zV1vOjpy(_DN)Ceo~W!H0qJzaQ8NTmzIG+JNFOXT%-I;S4hur%O z?lIV7aHYX!gJlL&1_w#((i_}ku*cv^gUtrZ45kbYLLZ-J?Kil`V2{C-2Ad6*83ed= zyV2kHJ(5?W7jlPjuEvRShjHtp(CzMZTp$eG*{1aPEuxXpZPH#g@JUHDQll;4%+ ze%0I;nY)Y1TtCj5y7)gg_rId=!oQr#TEBP9{deX*WbPy8{;s8e-`xLBZpskuRr{*q zQ=TwRyV2sGN290TXUtt`?n}+xVD9tGeVw_FTmBo&&7IPY-f%D64RXiwZ;%@vhkM!n zj68KOWSG~GP~;Bt7_VA*m>20V_kNU9zZ&va{4lRFil5x~y3kZ=HN2BM{Qiw^xx+aB z`{oYw3g<(s!oxWI5faKB#?5~Q?Q(~C64h^Vhk2Dh<6G`95Ahr34)Y?qH&o$a9^#AU z4)Y%W!{`n32=`e2VO;-r79QpyZnE$&FL06J3-buqm^+NyyNrJ7F8BK)dE@a_ugBfjB;38^7Y~0j5w7|;9{$Nh_})bLe@(cxFd9$4FX8^Jg!}(aq<=e6 zzKVqVV~O-XPK4LOxp@A+od~}(QJ$7W__Rd$e@M7F#FB;I>d{DEHznflOwjvkB0sfb zae6OI&_6ek-{lE>|CUJ4yB1maggcIZLjs@L^LY4X>VvrZKPK?qop66If$tj$e3@HJ z@7%n;`<|`qx3BHKZT(%Vw(iId*}8Vsnw$ZvH*JnZl=X|uoaYR>`?fJ5cdWgudyJ=Hy8AYV zEgMxJGAcv&+I!>o+)|EQH{AN-t=-nWY1P`z-8N%C1~cJSK1!c6k`K-q1Z4rg&H0ay zKW8M5e@u{+f@^iT)i+jFd2WMAV?48O@x5~mG1kY@N!I4G_D-(e&5$XK8?$}ZaFegQ z`*&mar?}HM7MGB<+wbP8U)?~gD}TeayN<4VR>gdjV@z;b@W@1u2S%zlHj3v=w!d<^ zZT8XMQ&<*!E$(G{vfMfWC$fKBVybl*V$3bJY=_bCVeRom{Wask^{<+x>;*h;i* z{g>j`COZn&e=+NlWnw1pU3R*7`=;*Ow{E(#d;5;fF%;scY6B{eI}_giD&{~QII=xd zz`VCLN2x%+{w}1ri7TAro@?(#iq3O~G=}?~-TyiD;)UyaA=RU0>M zTAhjHWOFxCSsm_Z9_O0qss$lZ^ifq8yrPe)vDZgC+x%1&7fJiC#EsHb)ggcnu9~jO z(6?>fs?7b;nJ*WuGNg*Gl}?@Nz0y2SQnR2;zm+A*DqJl6VegfG#l|rjm+2SWOb=*& zJw{De;^-({S`{FV^)2!tQ^Hk;LXpYHDE?Kd%S4ZncrQuA1DbcS#v zH#n(*R&TnC7g@qDiSJgUtJXRj_k%BqBcv5P(Y?}IpVF_{@IAwLkFHT_kZ~7NO!{S^ zS2?CRZzhr^o$CT;;?_8eDN;9S_b|9h`DEV7{g_(Q8jRLOQXk__@;KFB@-Ev!_7@ef zXXvY?nfs*k-XY5#rD5VTR`>~eFhgm-LON*3zH_=a^(ym=$K0M*?SWQ0_AM3b%qsg} znNxUHcyR9?AxvlJjt{cC47jzP0DMCy-uQYOnzzdGupt#{SeK^W>4Yl z6R>>c16_T?Pi-wPHusj_?dm)B7hB8E@$Q#?`2DVh7yRkg^6BRO_BXl~p7rR~^7FmB z=rfOWE&Njd)^gsVJI;Qy{oE&UJgs|?iuQd_nB$$N3!zu%@Yw5KtbPAL_V_jyHSx~W zD&FD4J+Bz|9Q!`U&cG+CN!ElrE1X-}kC6iaiRrCDNWZm=|;O{BRwmS%;ex!%&OvNUTGY1YTm+-Yf+ zS(+`D=I%tA9kDb!EzOOV<|~%wHxp^T9!v8rOLL2**==clH<9Lhu{1xhG&;X6neMeT zKT4$87fbWBrCDuh{@Bv|B#~wymgX-k4QC`=J}+3Bzf7e0>sXq87}C7h{Q z%s$G}c{RVqqhC*M9VuilCvLqz?cOcr43v9Y7Mw~y%wN&YNz00M@IElKaK_c0lk)lS zZZr5t$@d8H-r@Vff^!y=R|$EMPf4l6eU0IU4u>1sIrD7v8g9zWy#SJ_l>yw~93{Ua z#C?bFoVe45o4g%vc$A^haH}kY!@CS_aE_AK5%9mmcTU{b8gBA-xK;j$M#HVL5bpV8 zZ?J+h@ckXWbK+iNxXIh$R{0|u4Y$fdct)=9g#1Uz?+9_<;X5bp>kT(~JKU#Jmdgw` zc{|*vQ9r}&x9YQ4^u}w2!8}e zkdfpw!rwe(G;c}??_zV$CT+8;{~e^Ahey60QyalOT-1?c+J0zPTjKCz+k&pm-~NNH zdH?kER>mLHueABdWE4AfJXw~_qnx~4+HH_ z_fe}4BKt6YLh$0MK7H!t}|2(^ z=OUQ%nNQuM`K9^l*M0r_-|bre<{xim?wdN0z9ur6P~T$Wb!ds3gTdx(?r6TvOF^IY zJ(ocfI_&DyU`y~$?wq<4`Wh40-x4=>Lz!&OX)I01Y(jmHiR*KTo4=z>Hdi&4rdy!N z>XyjXj9)qV6#60)*Y6TH??;(zj%zGU$Z0}-lZn^CC2qcuGTA)mSejNtQ>csYF}Zf3T*Njs?g?W@SspIJN zg!(>bQpc}?CaaGk`!jy!w7bw3I+Hq%oF>#aI+Hq{h9;|zPN}bSCUqP+O{nj5CUu;? zR5aEM_IKkrb{FPi&ZLghu1u)^bS8Ct88lga6xpBgE2rIs{?nP%apW|i{?i%M@sV5T zo1^EhZ;t&rNPQ)kvu{rS=|lF-7preB{OWuE^`{^1TGTnPb>v*@izA~6^_?cJ-;2Y1 zU)1-WXkTgK`n)*I_eC@yg9-JGCa%AW!+c*v!$kW+6W7H}rK*r%v7j4d|uoZ_x%gm>!3QuvT={Z5O(o-#O-Y4u0^{`As*!>G&aM=XbvOosS>-=lo`w->g*PzIX0t=g!Bk zaLo6E`xfqFzj5ZBo5I*T+uReWd)^P~ZdmqNYhN~J$lX1=MFrqKpEt_r=Z>7qcTrCl zI5%*=f{S~Yw^`i1wTh=Q6{PH5;^qN;>n=*+Anh@wdlXvyJ;lW5ZQ1fEsR8mF;Cy?n z@*dG$xX{e`zvV9N7WQ@%t~>Ad7Iq&!NO&P{t!VGI?#ES}0^-Q6wC?>4;`UJzx!%{s+$xy9lnXXEPNApwg2whHoGCpM{=GGk7P?jsVzT6 zRwMeJYBGm^9E+Uc{Lanz!5_Deb`NFHJ{rACz>x!Yhpm^>=a24XZ+&!u6X~(|)P!_?VWs@>*fxu7U`1+)=IKGOX@-5>|YL$6c;{IygNv*e4&J`Uw z!dfQ%{(XUe8~C@8e|PflF8*!e-)8=8 znLt({iOyzm6fHH($G-1*edP;({+Ua++`IIr8y|V)^&dR&@MqdCy6R_l{rMj* z-h1qZd2hYdvH88)C%$|2YcKxeC39t))s8)2?#$Vtn}%_@wy0``Rgt* z{lRWBg#%;q-(TVUQ)_&@G2xfk zy&SsNhToX*!785~z1MF{xbElEPxsnP%Mo4)V>mZgQ3RaD{aCsO5xC+gmt_&Z;$5Kb z<2eH4+*~JiBIxcvl>bY(vEj}aJ#2akDE~en=j%Ej_pnL#A$}bHT|llV=zPFKcMl@A zS+No~SAkV52h!GdF7>df4M?Fnn>}pOJ%@^?`wcGu>K?-xz?Xr__cRajSgydbnZ@Q03M=h4ODU|Eqy2cP&tK>Hb3HHxsCQrU8ZTUHGnaM?75d22l8( zGyi_`Z>aR?%MI%OK}6YE=3!GU@)e#+4_C|payGHz?=p9h#qTlq40C^7`H}uw z^i;o%=DyzCE6jbPx$ic2$nSQ!p(o^bqueN1IDdK{Zrvvn?CN53Kklis~O^9FFq0`a1uC8$Y*%vtYsQy}p=q$VQ+`M(u>b2Xp*|}|>iLPdFfod1K zZ@c?;cU?lpXWQL5FG)C=s}UTMa6N%1fLjgRodg;DjnWA zKY3k%^IW}g(_OI(0i0jHx6V@Q4^wi#lRe-5@?0NZ_=IxWe0N`) z5cT*F|Nj%6M-O=Hp6t{S4u~6xaWv8QiO$PE@M}J*fz;#WQBwDj#C@Xk?avsZW;4E5 zz(+NdDx+U;D(Blb6Q3(WQ%h+N`oR@H-~JK&^`|<9y57kHa7w?t=iASj;Q4maLBRjM z^X<9vOZ)TfLsJ1;dmGY)DFW-4-h|an% zyzBS7Ui#LLqqFV{fBgGh!~33%&bkj@|BbGf<~-rfx(nZ~>EG(=Tgln@i$Lhj)ACGA8ETxoBKCC$;5K#)ZRk zDa#zjn;H-9Sl=&rn0L!Z<`(QO-!Z>GK2H1}y1Rh!qVsD>ZTaM6((@jg(tLyQ+oGMt z7ZxvC-ypwH{Fdx2y>J6#wxUHF8lrmv;$gh2K2KqDIJ<2Ai%GNi9Ql8tf$`e>h@QvB z((_-F^rWHZ4(PuH{_r>N{IizLo3(iUDBtp1Jg;=w;)*5nHBTD(t(vuL@mlXkex)O; zeO#?e9^pHAhFbJc4?MKEAhr82a}0~%nM;TNsQ3n*Bg{WszGDOarKP;j?&i&hmuS4r z`K{t5^N;YYx%3TH=PcV$*U8@0(#4VAXFs-V!_D4LagJQ?Xec?dj6I0Be~J6)f{)DS z3~-6|-?}^)6OS?;9=?%0l;@4e2=}Pw8RWhLH)T0O_$YrH;LCSm-s;W-@*M$+2V^06M10^|dX~k9;1}lu zerB5`;>SCS$qh7Nj^wV2zv)!{F3jSe3+i# z1MVz7APdPO;sf8RpR)K6{NjAT?}+#%eW3g?+ss`*z$?cG)d%(DQDbh^7b*wg&K?6F zaLX@?55X_V2k8l6u{vsO{cwJQ54f}VfGk`c7V1gduD*)blff^}2mFqRU*ZG&P#tEr znVS#r%JD(Af#|QWkv(4OmfLD$Wst@9PP<^3t5bo?T@Bz2{viK1El6;V!5EiSW z#`59f)bz!!eJCmAE%1TGxaZyc1=pUcy%<3jl85KRqWOpUmft-1Ft2VgZC|lFQ|zsm_KkS?5)TX*WkGx3fLk{$bSzxJPQl7u>2ZuH<`;pC^C& zgX0$z@s_0K%$?v6Mnk3 z7r!NZZ)lmmY(snJ{3Dd(LHw?}d1HV0?&SNyMIT-E;B~&8kNaZ!9d5vHX&9mS0@f<{l$&{Ig_k z?woRug=NWJxD)b!5Wgii$8>=DcvRKZ_JjaVA_P#VAfgiiNq|T$gd~NLgk)fn3`v{`3Tiq@NhBDqAqZ-z zLC^-F6{@YEXoFx4c*6_*gGB^U2^3olYN@vd!J2RrVq1yg$M?SbtaIkfC0y$F_i3MY zKbgF1t$ka2oqhH>XP>qA5k9C7KjT1v>;tAazdpdS1N#7EetiJ< z6#psD41Rq8&kTNjK=`0O0J&cu5I$rdFvS^tfU>|oK$*D@2p`l3AouG7!iVewrZ~So zz_J7T0AzlB0Qa{4DbGuOeE`o(etkgrpgsV(Ump-YWFIia8GV4Vz&=2kxeo{*)CVB< z>jT1v>;tAazdpdS1N#7EetiJ<_5Uf)ihg|n&x(G1K=`0O0J&cu5I$rdFvS^tfU>|o zK$*D@2p`l3AouG7!iVewrZ~Soz_J7T0AzlB0MB&)DbLBV>Ny$n(|E>;<#V!n4$$W7 zbv}F2)cROF@5MTD2dn1?r1R@5!mGZ5=e~;ZF3g2v?>LlMVTy~5&GpI92bdn|v^id; zLmx1nNrYEr;yJLQpFC?q?$=j@SA7M~gUhl_&zz>Ximt94zq-%|0_)G7G~{1)j^OKW zOz%jdEwekoPmgm2E$}&Q#ygcrye}}nbBTzESQf|N46It5!1czn);0iU0K^pG>u}Ncd<|StVwflvQSyNm)~U zGF8@e;itmaw}T~F={V3-?re!yGAVbiStjM);ghLy7hHgk_zwDrN3Q=C{@Uhov<~Y@ znoK_82fM+CnttNgf1hJc6ZYRf&<$%kblU7I&N$sy95mCI%jVh<%pD(DsK)4=^=Edp z<13zd={x3pby#oFG*W!UzZ73_%z<-0+S?RB#Sk zrGY6;tiYt8!wtF797aWAF~~BsznAYrXjxr7)Ep4RYcwIxf3-&h`U8ocN*Xi4@jt$1>mXvD4H$AKu zeAU_Bj<8V#+KV~!4hzyBWLg{j&S8_9v-zEeh*!3y-Z&PI(eFG&8pBqDa6fvP@k8SU^ zXHAy@Gl#asZCG5D^U?Z^w|r33cDwuf>sC&GE1|AoQ2553cTall%Zr=d8n@!9_pYD3 zyYrOT*q--B{=Y$~(S5HyJ$>l-OS`6e3g<+Y{WkKp+ppdA`oepMR{nfV^J`D!-gbEX^%aH<7%0ky7YV354wF%(JMu3zFiVl zu<&Kb9?>iNyj7p~d)>Eb_LH|1pYBhGaX+oC#7PusJz z$I!jitmHccZN0?6(sM4DFx4Ucx4QeG5u^L%iaT&ne5s^NCw>S2|50JcAHx5?yEqDV zg!6lMpL-;0Q=uoE)*0IK|DUfuW`pl{(pfM>{sGZSt`_%%iho(+dqa;<^*6x(vJd>i zYk^R4+G-7pmIHf0UIT;*af^ZQPjXdjXfG9cF%a($UAJgx&k}h$5Z58sC=KmHf%Hf3 z4uqemtBZzq3lMt6ow!=_Z$AX=jQA!E?e7A)9$>GA_Gf_fgXj0&=?7m5q<{WIAoWZK z;vl<5X=rak`!9jK0m$~fp<&TRAluEwdXz5{c@2>5t_D)CDj@4C1*&?0EN?iF`QkM! zvH@A1MdYV#D!ynLoHd#MM}qT#;n1&2LwgOBW;u&BRNr}5e)`}qMZQDmAH;Woly?WR zo}(}(^I^|!V$mr$f_6Z;f7Q@ljY`P>NJIMoFidaLP^}L@QGV+KXir?vEcp9BTOaT| z3X8%|4-vxa=iN;5&`I~-Z9+owS>i9t0gL|nxwkR3%^+S zU$cDVUn%81EPSo-HNw{kUmKv$3W?Y2zlS_JnC{P83BDVC`gxcj{5mR!unRxN>*w(} ziH}#Y>KpVbURX=Mq}Rs{`tmZrejcX^udf%lT*}kOk!KMPkr93yz&{$m--5*E^jv>o z=1KeUV9b2T^#brVZ)e2-V}jNUsN}(`1}Hwux&cN9t{gCA-)-#xi!rSpP>Pt=4;Zza z_X+~$2(gBM;^0*Tl(x5yz?j}(Zf0f)%7lTJwbe8TB40X zeJ?LLA@ToaJ%P=J4u-&SNufDIt3TFo=%?bf>D zFI!{!N%_w{+!#~-T5Eaohppu&4z|WbOF6?9H#W?CqBUmipIWUyI?{@@0Bs4r^$3kv zkI-88^uE^ed2L1;ur8qy>k?X>1K(_QdX5@x!1{zntWRil4%yZkGo;nmhCxdku}-1Y z`sl~4%};*nYs0Mz8?jyiHhQDA{4Xd++JJQnjaawP+FY=!wdVbkMjNnxp%LpBTI;sI z*;-TbjnM|IV`#)WhSs|9U9EM0Z&q#Ku~6$7-tnzx@LN}(*(G?cBopfyMq@q0Jj^@H z!!tkL6GUEwIg-)oZ7twqxlhHesi|t-9kRoanj(E)P2|4{O{}F*THp6h_jw!GWxuuls2e>~-FD9DKXB zfW4G0*q_X{V1MEHCg)-^k1^8X`&vF*fTqmP7P>6Z7O;UjHn7KW&=+J290wi?!xo^A z;OA!xU1qigWcco(W((K=d#tw|2j8wOU@v70o@XhjBT0CkM`l~FEl7I=KcioOrp(V4 zx-8HZ>_dn<23s8meL=Rsap18qYyq16%+D6O%xnwD~S3Q1=#|}p&38J7N9v+`Po93nQZ|X zzALHq3)sMPeuf?|U@v70jt^#AaQraaf^9)sb)M?u1$fH*Y@y2nZNdJ6IMeub{^JFX zgBsWLu@k%+x6EUwE;HML$B#DScmbPmER*vyv@KvSWebiEW?OLlFx!G{LE0nu8T|q@ zWq!8MWr4O}e?gpS{5pSI;5annXY>ouYTPp0LYJ9s0U5`8WeeEEbbf}m1?;74!SNvl zbtDPT@xyEjwgqX`d8+pd@Ra%4LYD>Fg8c|>gYX%534xR&3KJ@V98$MGAs;k^y7@yx5P zsV!)`IuFTnd;pL2B(M#5jvr=Qkj@C3J!H$7!o#pjOQza;4{0Np#za`!lrEIven-i= zLWX)(x*j6y0U2~svR)$V1sRT+lHoo`V8SK84t; zug!{keCyw`H*haR#wkA{$eJ&Loi0ZFxAXVmy>qHY&)Qe_piYr& z>UQXK!M?hEI_=z7cTl72z64$*Wpf`uMWbx)1E^?}&3ynBjk38HprTPW_X1Qj%I02x zibmPo3lOy03s7$d`wg!_=&RQ4VJBZlUuYp6Ro%$G(Hw4R!<0}@CA-omYYtCGAF;I6 zq8#r3hG`kTT2RNFvNe;j51{N-rfe3WwWS5;NeuS^Wc^AuYoC&FA3#G^uF1F$pdl;P zWL?d&iJFXi0UGHFG#U2-G-OUq#=QVVrt0h`JjVqbLnY&0fJ~!gq8s-DG-RS1_X0Fz zq8oi%44LT0{QwP_=*Im34Vmc1{QyO#^so!h@k!T>`vEeIl8J8I573Z_Zrl&hkcn>N z%`(xA{w+p2(T)BshD>y$e~ZYJZbia#oYZxre+$znndnCU7DFbw(Z9uziEi|9F=V0} z{aOr}=tjR5LngY>uSH}^w*|s;yw-JFXqJg?_nKv*+Y+-(bo;4UCc3RK%S5+dm}R2d zDxXa0_L%UzZs@wLG0Q}^C(Sa^ZM|70x;<-_iEb~LWun_AvrKf`?2{?oUKRcw_+CW7 z&xkhVwM^G@yTmJ*==r8uCVK8N%S6w&%`(yR9kWdIe9tTsJ^$pBDLp?Hp4U`ew*zLG z==PaeCc3qlWun_LvrKe5X_kp@e>2NOw>FGti}e5xGS@6xpI=8lfoXQT)A8My?0 zRUHHTs^G(f>k#*i@Y0SP=Nsx^e z-zxe$rNg(XAAF5c&eOLFd2}6^$7=Sig3oW$FIC)vAmGNJ~4ZIPp<3 ze5+D$?~7|;&|aR9Yj(A)Pl+OLikp} zCN-gat6=kPxDL~1f$_@z)Emb_`BsHUW7uj)`eyF^8>&xi$F;xds`Slg7WE3c7rpwq zm_O3L>g}>G`qRg1*vRom{{TO$EgvpfNMEbeP0larZ`EgSr{B=$>e2i@&(rU!_rmEP z(D!Oghw!!ZzuG!;mV-W6%U(Q`M?b7jUq165eX(XPxvQ1_STFqYdn4(Sm3+z0f%MCI z=$fg2pl?=V&dJB=pLK9xeky&mHodoODgCs{RzEY3zFKoT44FiKtwo1^J%c`5?|zf< zD*d)Ld3r3O@7B|QzV$f$x4I|397i9n(b3g@FA8u(P?gY@Z| zc~5u~{kmq&h>E0d*Xd!6W9i>@&8};1p^w+G!Ef9|Kd(Q(^oz&n>-EXx=aJ3_p3Dgq>KJvVew9Jr4=jFbVQ2b+^>%;pKK;SE zuP>WGpRmEU**DTJtp1(fCek;oVQ*tS{lh#@XIxJou~kQY_GkKu)j1zMKwq)RH|=_p z{$jtoKjR>M#^xNHJdb{3YwKTppT1+KU;Lto{$s_%F3Y43S>@9w*3ggaXjvhLlFVe4Uh^O)(ealvtTyyyM*A3cz(d*lych=wc&Xq@+-hO|< z2Z!gsGvoN(`3wH`%FN3uH%vLv`PVBOo_KS?#kmrTOS|g>e_wv8&mpa{$|W|zuWrmo36n>E<3$C_U=hX zzkdJwPtW|F_p*uOa+dYUn)VO-w&5iFhXVJQ<-W24Q#EetZAyp@W*NtQW(B5e-1Her zhz(~M$9-o7W^3H+N+q0KIfrq8DuKEGkdogm6W{O7!VmZOmg?_T)OXJPJImbBjXtoeLT|B0_0T{FC4;8TGWMkIAf z`l`pcW_zDuJMVeB?>JA7zL$+0*{N|@ZS{QzH-2@=>76?-pYY?j&A0Ao`FcfFaav&h z$D(>i%r33^opr{dyoAV{D~|Pie6^+3>As`#_ixT}4ZiuJ`j2d%ASll+0WTB5-$16*Lh3U|M-c>$B+Ldcf!6$qJO?>@Syzdbt7IG z)qm~(9C_6-KC6G}sOG4_kL=2S(zWhaKl{a_b3ZtE=?BaH`c+KN(>+H&Fz=4Hj{NHG zHI=KLd-gXq%X=5}i+McT^3|cFzN^3SeX`NBwBR?H2Fb>YvipL67sZmn5A`SGtKT^lopel~AM-y@dQ zw+zkRaBbeRFJAWSvTcuEs1Ks}^K=ZfgYM_^|J(m?3m!P(uomb>U|BAbE$|EL9>Ran z#SH@yxPL4{kp8u}$THM)RuB{)1Lrn|mH34!f1AX&=YRMv{5AT(@9Y^M{nP3+ELsih z0r^8fxWdIP2jV@KYng`jSt6eXr2k>LhV}xHyMVZ+yPO)@Q-N@mi@O3y|HIxI+PeUu zcid?>*U?Y!1Q1Pi9o5i|`%dM5_>qS8dLYxS1R`tPEFk>?OM%qW1%#1YP7Uoxk(mC1 z?*iGry&4v60kYjIMgEY;mjl`E8X)!h5fFcI)9{b=6a!h_C?LyA)v#y)kmYq0IWr-? zs5=S+8OK72r%@<|H`gf*?Hh4?SWzO{}TR&@J4IL-;gmu{)Q@fu)iV2XYn^=bfCYX zA^UFrhAhV9Z>SV8`5PLwoVULrbA<3Wq&V2$kkYgG8;0Dv*w`-_PKd}a`#N8%Z)F_P z-%#72SosiQf8r5IX(>r5$!YEEUz{{t+r60nhE?U2WhLCbS#vp5{W8=(#@*3REjAU+ zF-l#NG_L*s@yufiy5FHLKHq(e^&$exgS=XgBM!t5LoWi(v<}_W1sm593-hr~`t#ws z<+rad<@_<|sB!22pZUyw*t#d^h5CUGPfe5qgX1!Fx^YlK9ghNxYZjZPBag@avnaoq z0}sM1=0PYIUOyhVtf+9l$73ZkBCtFbxgYmGw^0z}2l_*7OYRF^Z&pTOhL6|v;4#tz zpA+;D*d*n*Ieq2~JwC9!YH64GMoOBjvVn(IlEYxWJ*W0;QL{{7+ znS;4(%FpFjTF%bLAd2iqd2DYC?gJ#sugLcLb2-xU66eHy2Yu{eeoFy<3=pXw4-xIE z-CBaUfN*Aq1@EmoV6M<2bA|Y>4c$L9bwu08rF`&El zLl1m=N7sRR>Uu=t8$GdDuW5xo`ui%bKjpW*zP-!$O(XMu-nBcfs;7Op|Mj-8YBvsx z?;X_+Z#`@k?bXt>nRsE-zYTrbo zUFtHu^{U;`n18%fY%oxxYcSWxIooK|qv>O^wW-`DynCdr)H_F{htD170h6tk>PzaN zD{fzUvK$PD>ReUxnp=bqfU{FjK9BXux-FW}2bjjjb1Q^SdK+N4o-BU}+GLH`b-9rr z^(dQmw9G~sXSKsBmI3_&b)n8ddR;)d=!dG@c6GC!TenIn!x|mlgY((zd5q9r#l!x! z;FV2r{&j#24up45eaX^C8yk79h#eBnWrrJCR|s2&lJOg5%~-#TzBBt6&bLr$>?lw5 zfAn4I(9|DeC;BRB{?HDL>((RaN6P;S<1zepcRfNs7$?sg>GReemXmeZJN`n-z_C+4 zEl;DIoQU5&f-(LG&k24fk@f0zg-ExQ>DIGNTKjsyUwHGIv^(|VxdOdDxPWuz49>OY ze4GatSpwciXlwu1pe`Jz&EMYTzy9BR4U(~;4dVm+TCg7h&Y?5B7EQLS(8m(e`gp-H zl(v0>?cg{{y^;Pa>J1)qp=#VTm+QY5f$v&FyW4Dq+2gbG#;LWtb8ItaR+W9* zX|}48iZa`rnbXT`xNj_rjo8_1Et^(yhdg80m^C12k}amZq_PxGL6a*&*J6vAI%USp%CgefNPQ&@8difJg88;h z2}EwGRa|g<3@(xkqcjN0FYA8Qb2gF$#jlq96WhuESBd9|f)JD+dt|7vSc?gY?;`if z%d})c@ed&$_h@ldz&@DInWbS-7O*Gese)HXd~b=j0-5g+Ztj?`NyDPOK(0I81MGtN zq6Q7^TSQ(DL{`_!8rp{fIqww%#QjIy6~Z^;fq?QuK+5+E-vDI!Zvb)6>Ds2DeVxc_ zfsv4}*3iCO_LAnVNna$c+>ko8)COn(}d1lpT{ zOy2}#`fWg_+oHw0>NT{l12WxeAk&otnXXiecNJ@BcLA9$3&?Z>fJ|r8;$2s0Xzv1K zx{g4m!+EUqTnA+OS|HA8*J=&z%SFBnNc-1lXfGD|EkL$wqK5XKKpuZS9AG}ubsGH) zXg>wSeQexOAmjG{SziMXrg6QYp`ABWl)nswimr_s+E)VEUmnu1Xef~796~=QE(3C& zwFZc)U5hoe{|HDusx-87J{$9oaV{X!JAq7}rJ;Qkkm*x3v_FIXk14)5o@Wrb3N^Gl zMLr4$Ra~hW+T%qY17!LE8rsn&l@5KMXzwoZ=<7^pZ_=>yHo;oKYQbW`bU~XSfcZNw z#6R1bMEj?pEIqj3}0~5Kb&Sp{4xwujXWl}c?Wu^L*V~S2-CA9Zi%#~c5 ztmd|c>nw=#`1o4jj3ws9E@-|oAwG4ucH2=Ld3#yqoT)Qsm}V<2mQeF!8`&{z_#t4- zvv4eGFPxBwy^==fc^dMEF0aD*&W}||dX|UN&$12wFurpzt|sW=T-oRIDe(htpw)zG%R$U#A_2U z!_ITaR_OBBG&VpzUS|;eY(#;`+x-r1Iujub*8n4~e<%eDTdC_K3Rl-hpt=rHJ^=A( zv&*KTJzc}j!mF-@_|A(VH($SKdtR^fesq`ccLEva;%APZNnVaA<9YndCj(GqIHU6kxV$&?a@rUF0XsVb4gfWY~5y&T@(GVs2VWHrkBk&^iTJJ)zt zEe%=60Ry2{^<0hSf9h%u=bBHC(d{OgoYKx>Oi+rs{fcaFJS#`~MJQt>Ce`CHc$vqu zg^=^d^6n7?Tu?C2r*qB#=N0A{wYh+1&I@2Zp~hm_6l0oS<=g>fR*|XsYdvk4^SOMsHO=Th<<36e*& zpI}S@cEW03gE0kXZNZoVxUjUJJ9C2j21jCYaza{2E9Yf<3cdLS=%Oa$XL&NbS&l-7 z8*|}^&-Qi4T*oA@V`8Q=BX69;Tj0qJD$_4Pmh(IkIWo^HnHxHtvqB~c>`Or!oimZ9 z(Rn6A;&WBX^1SDpE>yJzx!!^dx5t4(VEsZzUY7Y>al7-~UQeOhp@^&r7Oea309eJ7VNd<-8LZ>6oJ3hnLw^XFG4iO&oKMoOYhkx;7QT~{W z%v`T0({qDQ6_ku|)9ZF*=DV}Jo&r~PVIf99zXWbao?~2oVRlAgcD`>cW4+@uCVI!Z zGscZ~YKpz>MkIzPh}RH5afYkFUr%+F z$;d0rMnel+8NLHeCACYC!{y5N-r#U&j|~x<>B?pcd8ARo1ds0mWE3zaBMV2x>%xmL zf5UrlG+{R{#)Di(p}(RY2SypUH!own!<(I#m7N)E;zIX?Jcu1xUZ?q}BbzF9tRtgv zg4@(rCML(Hc{8039BH1y6WEgsmFY;#K7+PL!3DSTBGIK~GZ7|H^V3r0Ir zCVfox69s3<^q3Xn{S+KdO?g}yg=6#GW<$EOQF&Ivh`LYUgKQN|(8#^JMq9ZwN@kJ6Ka)KfX9W=f<$h?a_?PEk0gTfp{ zTu&h8BV3&R0NVFsQs&2)y4wrHJD8{jAm(SHwgEBc7gZ0$oL|&N;2pp^;Cx^$a2}BJ zxOjIJ#rKq$6O5_>V$LwC8aM|yA6N;T1)L2m2hIW(12Jb9H4zA>%%}q3bf6PB4VVtB z0Hy+O1I7cV0%L&XKpSuhus0Cz)}p!t%Yas3DbNC(4CH&y9|Ac~T>@+d!WL0YKre7V z@CU%XK)kby;``8BfZKpK137PX6OivgCjsk#6M?nB8-Xi2Id1N0`q_c!0|vQ&;?8f<^ofJIly>eHZTV01loY(fW3iZf!%?a zLyfWmvw#+0Ch!yv@)+O=U0G0#efyKaKz=^Mm+8uph7icm;49urIJ4csXz*5Oc9nb->=hTHs~Cl|W1ZMlA>S0@eU=jzv`iF9psA zVrnsJ77+7rQRTqyz+zxG;6z{){tAFyfleUi$fMGM7Xwp)k-&Ih1TY3@1=@g^uZ!vp z#8hY$%H+F~D8yl^mPM-hR)sJ{=VvJdp$C$jzh5bW{){*As9SsA3pv9&#)rdcSNO|? zUn~4_#4-LA;X4c8DEv=RHscQq-&6PwP@3UUD8zW|)vChP!qbm~VLg6~pDKJGAo=@* ze*oo@e@ggH!Z!$i7vdP-BK%3IKN7}c;CagUA;O=L`dz}`C;W8by9)m^;U7X7%>TUb z^gAK{d*SaCeU1r#0&$Gj-_PGF{Ixi!3?GR;4&f&YUn2ZrssA3~XAA$7@TX9Qs$clK zh5u6cFGQc7>@Wyr!lw!Uq3BaA{Pn^w5x!CMc|rI|!v9hDCei1w!cP&t2Rbpsar~&? z)xzW2q4;>=KNEd&g}+(&BH`Z=eP#+jPWXkwH;6v9!siSBs_^fNK25?G3IDb5heV&g zIQbYV@T0!T!hb0GOc4Hh;in0|Q}kIRyj}R!!fzFQHVN+#evj~bM4yj^_vrcw|AFY! zn$e4e$@VHhge!TEIMW0)Qw+la8_?JYV`-G1b{$b%ah(2|~CkX#r;p;`8-wQul z_>Y8tOY}J^Jg&V;zi)+qRrKkOL75>*c$@I+MW1Vhze@N~!q&-z)lS>F+&pPviG~9``7`W%32D{J*iRXKUO$+Jj*tv$KC3{FLoT=(ut zOVg=TgGw=|5eAiPP{R!>$)FMqDj~r~`lxt=^bx5>#RipPP$LW~*`S6SRFXj@8dO4p zkMvRT25As!hR0K?L8Tbf2!l#CsNn{cWKf9)m5|^geN?3of&hg3{l|v z+8WVoo1~}v{~jlNgU}DOb(pgEsoy$L z_&_#cKfeQ9%ZWYuxbBEPMG>7WC;8oi2Hd8w9Plez5QlZEX{X>T1l>ZeGi5nk|H`#Z zW< z;`Hx$L>G%!QWOW3U#r1#1bh9uD6E?&Pudh{z$2x-aJ1 zXs$KIzT2BCI$18sQQvfryf`8(A_whJX{cWd_GjdJXXe4WxXmqyQ}KFvlGd-h1s8jQ z%9MJs7EoJ1O8Y|B_h4Vl2lh1Dfc3^)TWp=$*F*aUwWq!M(GOI6fEDf6U%~pZ2e8(! z_`O`z(XNfmWrns14&nU!jOQ@+c*I)W#)ydB zkLc@oM=$vu;OGeRC&EGSgbaEGMU;kMTUTa@}G$*0E#1)ip@-DP#xf zM~JnBSjUL9kvOK&_$E&WZM|a4Mb$XQ_#O|&kHes2r{X(1=zA^5qxdlFc~09gA8m^= zzCd4TLi#nC*pu1hYpv?1Pa?-7?ttQN4_I zqkg^J)b#-P3)PkDv|r=_=Zz6;Icxqi{(YCi%T{}onzw`M(#2fsPQ z<8O`&>k+Y(bv5C*Fkch<1Z=|fte=L5Z%{JuetEh^ETz2|XT#cX>V!UsAwtuIa`>{k z>(CB7+M+)O$E!9$f9z#m-vC>NN~7DLE)zD!7+_U?vsypa*U7Hox?PL`fi||;;H!~w z_OIM#jLFP$j2-99kZ{w@GX^bj{_*ZW`K$w17tP4KeS#&dLwLtdoiDORL|)vbYgD&$ z@-W1OgzN=h?yW2ty6N)=;x4Vq%-FB%Rh!mn$*KA;o;=n+<)(WsUlym!^|E>IilE;X zY8?KH{H*H^m^hvPY(ckgmUWaPa2^XGsQhA?Y^dX1RY7omtK`5%u|B2%|SxhOpxK0*me+G!Dw78W(oM>^}rw>ZH7Hepq2E_fPt6W2SF_7gK z0AUgr-#Y;9TwjaxAg()*?dYOm(P>n|_R0F%Y43tZd=b~r;@&c@2FUtPpi=V7f#iDw zSx!$4iyB~Eyr=T}-YofTki+zyYXz$Xiv`mKZGr%mJ`0)5@0m72PQH{05N^be@0s-H zff({IgnmEI!%d#f=nUETk?)Oz!!VNNBmeCZKUDZ13*S%p`-E5Xs;2s`VZ5n6HBSgz z==cAhqYkc1(fi*S;r0HyU3mTcz`IYsd9?02kK@FEcgre%o#HH(Wk3{fghvASI|KN4 z1Nh1SzAk{bc=)y!m_|M%Q?@0<5#3HJa0&nGwM zF6W$k&bj-2_r3e)@n>Iy>O*#?G;z8yRZ~|r5+3Ym!!y4Nt(`KA%~Z6SjFM@Is7SyPXo4|DM^3g z@NEu1<4}Skl%B)kTn^9Ya1DnWIlP6#p8&48K$0Hk@FflpbNF8lr@?xJcN{t>Q%uq% zs|wv5o`v*lR!Y*<9Da|(T^yEjyz4l;nZx@z+|S_~9FA}}!=~nQ4u@47exJj8IDCS` z*Esx)!^vqXeLCdM|GF%l#lzQd*u>#34u8wxyBwPAD*Y@DFW~Sy9B$_DZVn&e@MR7^ z=5P{fBH3*jhnI3#!{OZ=KFwh-haYojN>}OUaJYiQYdLJ>@Vlt_y@j&0jl=sm{0)b1 zayY=@ot*Ar4*$U6ha8S_I4wiX-_7Ag99D7o0x#$HIHVRx_2Cwt{&NnW zmPz(m$l*nxKllSQULKy$%deb=w{qCY;XV%CJl{X_@G%b4GFASka(F3+J`Qi=@DUF8 zb9jiuPdS{F#qGf13J$N~a5IMwarj3L|HepZuo2Zz7l@OcjZ!Qtd=Zf_1f9F}o-8;1{a_#B6C0hZNn@K!a~G?i6( zH?(XlYiRV>HJ5E@sZO3y+1Q*s!CTpoJfXJ1pCX}YWAcPXZ$chT-sZAqU!%9lS6@>V zqpCx6MP;S8K}SGw8~k-~Se5m4b>7N2wCYB$*T~FY=a0i_^j6+r#G#n7W`C`>z9kN~ z$s3<7$-SYbzH*b11x44@*Ck15X{zyhb(U;uswu0isPuWujKap^H|nhwi#BQ!i$~Tm zSq#x-wH2Goymifues5DMlmxXI2Y-Xl+t}3NZzd`0Ys>sP<0nOELMC;((vL@KY4SFe zc`M_j&}G9A8k%%wB^EG6S)~puUXJ+mx{6v|`6uJhp=vbyD>nfzQCXgl zs4P!tsAz186Pc$ZQIn@6QMu4{WuW!3eKWvCcU z{`#cykWG{EsM-+M)R;}Gd}S!`irOTaiKMd1=FLfyYs+f=br=$wYrM%MVRgKsuGtU! zG}KfiD>8<%p`xm`qOz>UU#lM?)aC`-d+RD2w=~cw<*h?c8sB%3aWOhH)MIo_BBgh8 zGg7@(phQ=J*5s`;jDlJ=)fF{08!8gJ46u)NI>~!!5~0Ssv7&MdG_CV)Lz)U1+O z%|2S6oJ6YT#+JIuie}VDU-GJq@=e;ip+l_lR#&vtG$&C7iHZF@l`#?$`}rzlaf7#P zlXpuTE7ls-wwi4C)F-zzR6z@)g4N#UN+0rT(9hn;D%CYDO};Wr>Jn27^F+d>nS`Mu zH|9af8@4oK5>s(Qg}){-QP)!@CZ=wE#J9nV{(%OpL_*%ddp9>=xJ_u;M9eEwBB@%S zsOwEAyQIm947Co&h_6K_DeYKV;*2Pkc4K2jL;OsI##u1L?6S5haXywM)LQ>xOT z?Z&Z3kH>3&L!(z65sVnr^(Drj^k{%jl904JX6u;h8vjNg=4th{4K-dg_;_M5PQ+ON z^~A8&p*BHr;6yW{1cMSbN{wb0wdfHOCR!}Lx}v$FMmLOAqv^CX#^tPHPAIkLF%vr* zk&;+lL<&>FXav$~gTFp8(pTTqoVbJ_bRQai(rFq`Og>TLiOEMuo|rI3Qhd@@O$js+ zKxYv*dLkvhb28;+WmtfH$a zqNYm{_Ino>#Mn?_IX^Y;C`nZG|kV$8M}7{dM?1xyC#l&{DS+j!bfFK$^`C0~lG$z^3mIY@@zA}I^`>wkKF zWo30WWldXZH`LdZH8eLuE~6Zuaybryhn@~wy4r6ZeAtS@4;!SWNenL^p`K}ylndCE zhy5)Gj_pNh4IKSQH*#cKiU(!N-vRK^>n#v(>5>#F;2C_cs3#=JTT1Qaa#zDet-r2c z`S_QP@BbrWS3H9+tVWt+sPyfKq>%Fr?v0CiE#m4(Q*7O0P^$dnw zz)!G;0(%UPtM+*O%WRZ;HgpsEy)Yj%#`2Ggc`dS{!=c#Q(>iSTNV6>M4p@(B06~e@ z06S{H=2_sRX_)c;q}`UFz0}g_2}!fI&mcQf&eH7q0mc}P$KO`mI?&N-4Rn3k zS|+`|qu&~k2C%*CUeyPm`}DU#>o7_pB)DKEByf(B1jwE0QcgPt#COMID{N zWs3Dt_PChWBKaLw#nNu>Fx>CyYTO*BG;}p#rSutyb zoLhjeZ?U0azcJ>u$kGm{lF^>t;kZY3*%WD(x!uWHZB8#iwbeR%Bg{_r-VE60*$TaF zCchu?d3^G63-y)m%(o-HR-YxfT|y1?N!`}|=uyNUj}};z&yJqrvMY9AO@3F8We*A39RwJ`MZb&w{Zclg<8=JBNtXCNb( z-s#}IgL6zmt+!yLu(sRLBS`M8Z(}^_CRxx9&fzleujx0t(iDtZ?&^1K0bg8tTJRN# z*vuZto)ryWH=6w%>2~rFqufHy^R87bueO$plE`;pl;n%X={@Z0KECrJ_!|1A>7(*WGkOs-B$HuDXab9-DL*;NS~UDt<>sTd zfb5>umt5BN)p}Wvj|hIru`3MN?~Ei`{)$mgs8u%t-^J^07OT52j_{Tonp>;2vF%9-fdC z7o(qx?DLtGeLj<73MfO!<7pM9yXWPFL zfohw>7=OumLWOZLuSM2jWS+_Ap6cj77o-0@!_GYsUo`yVVPCh9$`ktIbnw$gE@@;t z+Ob(N2h8r)fo-kkfRoKnib|ZjSueJKi#qe_F$bNqL20_U#JOj3Xw@f>CM^gdY3DI`+oyv{7*;TXxnJfgsH9P@0uHiksQ*<*|QdInQt_FY-s$wc}?#5E^N)W zG}d{mT=S}2?u7-L=M^m7JU?BkYQeMax{a>W<~5z>a?fjVu`NI(xLos^(j~$=*Cn~; z6%=kpluH7yYv$AcYv)ThRMfP1UG>$1xXOhG7ESYA{-$%&C2%Mx0HSNoyeb4GJcM6( zzT~e1k-y5d<`Ne+QE5SmJeuY;Nq9)!Qd8x^6DXIjqM^ZC2NLzS0BbQU!)o)L(tcW( zy^7IiCLqph?4dAz4^r3yhmpxUoFVOh6aF`VH;zTtV1~4Z!h}cRV{nA`0Eg=UakQeg z7<7HWyIq#LS0e6w&{3G^C_D^_h;ATV+W$P_{|LM<5cg@iw1>ikN8$J2CWGIbfKvdU z0zS!EXp*{rgSaPvFXX2113bMH>2wBWmoA;cZE&PN&et$LjljDBaj=lahr-{2Bl+lD z4#chf$f4rn98C8yEHwKaF?e4BE0FLr~nB#eXw;OQ}=0Bem>G4Mff44i*lgw zPM*F7=>dclT{?wtf+KrWalBUG`4CsG!=vzeIMQ+_}J~Fv&&X z85}PgczY1v4!m5%Ie|xE!lUq?v1vg34x~x@n-SjyydK2uOOy6cnD8k4LpaL6j^kGW zpYl7;3V9J%4t$Y6g*|XcuKfU;8$|b4K$ee9+J6TUUItwc;`Z63Jrrj7AiN0aWZ!3P zQgCQB%`!K>dcc+yHgc%)y%hM%5Vr{U6efHM z=OCT*dK2l>5Y9rn(38T4EvlY&yVTu}&7HR_F+C{!XP%C7?*1#nFYD4NjB;dpc5=Ln zfpJzb3*l8@oz$g1>B&IeJ_U2w#Uez(CR{Cg1={!Kc6sSf8}UHsp5{&hP4 z44psroJN13Q9ZZlt;MsCGo7V<#+eSVxU8hLfGeG#sGBgF_}Y{v{JUhdC?xbC@OP zEMJb)l#&T zONi3&9A@I@A4HGlBP{@}$d_24t!lq{@Fjcxu@jR|H`1EX3Fd+rLGAem@ghfYNS025 zOZ7v)XUJRNvF9H_>^DoXCm%{zmXg`-?8vxB8mNt=E7{%Yfk{eLziGF+zI0)I`C*h+ zjv3fX@nCgs|DEj09*`$tuYvh3Nm3>w#fBZ}%z!g!dQ^Ta8h$aF-(5d&r8G%d)=w}U zYi)WOLr+ZHy?83)lY-lQQs*J8V;_rV1?}Zov@_>6zf(U@1niuC77lLrOPx9XXgCb*m2?Yx<@2TFh^1$z9Fa_FcWh=y;Ek}i`1*;vof(~nG-j6JNa&_)e+bY&}( z+Os+`?}>&#k7hvkjKE~2qu;F4-5aHy_RJKzlZNqDQFXT=Us_Abu-v3TR?z&Y3063t zTVb+N#;lNm-3Z!sAS+zii`@sG3@gaY3hrn&tdOmGioxjho{+_H z@k(_EB0IXgn^L0T4A`Pb%24L^Qy3imGP7B9Twn~3*AH9>j4Az@frkBrl@7~%uBCs1 z^ox*g#{QAyA}GVIva$!e8`1E)<7B7FfgEnvKK4`z`yG7uFSeUi9vAak#M3V7TPyZS zE!cyka&<6mib8hm($A#*VC=Q;9(V6|z`8a(SuwfIz4ZgDQG53FQ=FrZs0#MjAB~20 zj%UJ7=}LZo=5e$N_Dn=Zt!={&!$~sXWghQw$g@pzh%fEos82UGkE8ZrFEjHU;0*jc z;_hA@k{bRt7;TuO+=kMj+-_mHmG;W0%RI-dKPd z`yww&CU;(6!ETGP-)C{z%QFJ|ee^WVe5ih)7}#_Ao!F3F%U!ZjRvI4t1M#bGvs>A|J#OO&O-C4pt_XQBL+Z0w@3z1ij6 z(WA=(X9XqH>A#PjO|rVqR?ZHzb}vOsIz^UU(y$y_5?C6v&H;`2ZO?W|F17ozOYG%~ zu)}(6u?eNHZ`2e#LsmYoX#`b}fW`7Y7Q0XQJFDMGKX} zz$3@)uxZyPvguIF)uQ>owHUz6?35rM(J1V`*QYNhK(#v@eS*ZK`){q(=E> zAD1UdeNNOh$!9{XK6#XU(eR8>NgKyopBLl%LCigHbfUHga4z5v0BIdl!{G)F*8pOE z<1Gd}4e8iNVBuq!q!9kAfU^OA3YZJH1CZ92R{_%c%!B<4n&;q*Mt3RVR$%{v!uUN% zVTIQE!21D*%^Yq3qsVQ4LlwD zEZx-zU#Cl_@JcwWZED?sRE{SDo(xFqXbO)*2$J_>Knl}&qd9qe* zW&q;PYr(&H2!94c5Pw>?68)b6NxxqK68%kpM86D>=#e+0r}<_M+@0V<>&8*|Yq)>~%g=&;mk#GLoqs^*pQppWM;HHn zT|BK=t123A#EE|ORhVkLK7whqLY!ptgLIs3SYl8R@eMEJXu%4QuJ$mea>XFd)zNQtjU($b%F zrDMfqWi3_y8))rLUcQWnm-|w^N54G9dVcZQOZjW}<>_>4l)cTUt?HAn>%TyKlw4|k z-b(%?zjM*|W}~hWM3=xEg6#KI*7bs(Xz0CNj5CIHJ^II_Yx0kPOZ#d8^hq;8jHR`< zCWn{(Z1_(OOaA})ryK2OIoY|VX!y&h6udChiusl-ttyv-g|0T7R8(iAw|ChTYrE{S zD3S}$q@!lVhS@pJ4Ekimu-P-#2envBlD{{iNSH%mUFqpI2c)3G=b2#&u4ZQv|AmuJ z>Z-e~I0L7{TCoCu1u0hed*FBAESc2%Ca|&#B&;K{7pp7pUqz+vzaSRRC=pw*xPVLD z8I=O9b=KgjY6^r~P4V?xP*(ZW_y1f!J*Y zl2(`gHjeW;b;S3yUh)e9$ zx;Dv#Qb9RG>a;*QN`h8zQak3RZuuRmg|KsQRk;bLYm=q4u@tKLw|0rTtLmO(sJ9aI zjfU&S)%p|-`{9d*tH+NWH6u?+DnMU=HdlK(hj>mxd*rph!Z?riNb@n;i>t*vi~5V& z%K-@=&ox+j1nrs99{{9z?WKS;ucUTPcsYRBMz0-5t46!8{TPt&4+0W@8h43q1t8JU z9EtLw`4P=shLKM-_b&iEoBIKzE4Y6J@}T{A!tVz@g3SLi{JY_&F#Uc5C;Yka2!EE& z|A7w2rSrd}^FN^TAJ+L}W2e?@v#~$nw!bb0VNFK%QjWytB*sj{3n1zMD(GUWtMQe1{j$DNO2?1J z!R53~&41ea1*yitrAzq6HXjFd@6zgq!=&#USWxzoOD*FaqM#9_|1}o?1$gHyVs(y< zhZv&R@2iZ53qVWs#C|<^xrx%S&pq+`1}l&+wIlj*!2Eh~@xDQQT~jlQr+@M98;}fb za5Nt4d1wTTCZ31!eS>E}YsaGK4KzsNv1_sV{3(vdgzr5Zz@q5;m=GMEsi!i^lxlup z!D5NlM-KotLwWuD0HVR9tj}N{FVfq_m{aNy^^)7ViU&_G7rQT#`@%j?D4m}zGb_b| zIXn$-4`77Csb=icV5hUUcrdbtQ+?^Y-h};VN?DHmd+MQS4}V%OqZpVQLH~_0!h!y` z)pxqv%HmDI^skvZ?B#S?%7Q(aza6E1-(Frkxa&&r#mQlrg*tdH7WB%uVkGc{z9``N zA|DB3E&Z3-o}q*h(2D&GH^$)s>@HIOZ{}}dsI>buS{b>~e1Wj0(&!H^o572A$)n-M zDE0@{bREx6HJ<8xiFnepfTyEu{|-9Z`ichEXRGodcgTWKjY(mo_>D%PNaQKt9!QBPV7P#$j zEpWReIKUNvXTmLpe?D9m+(Ni{a2B`+;BJC@R+6M5xE=6shHHashD(>wKLDEH9*6(8 za6f^&2jL*xUig0lw-c@d;Q-t{@b7{9CHzkU-Uat#_wy0bxT$asI9m_aK5*y3oeOsk+^;1`dIoMG+<9;& zI2kUZ2M}&Q{It)q2(BBh3vK}%{Tw~0L+DdQzLYnnW{jR7Ir^pdNYcN6mj*xKq{5p6 zysVQ{el{JR;3fE-0la0v%L2|sc+@7Y10Llo^49Yb{1yQ3N5IQI0p8=ldjfc5tBLY` z5_o?*0Up_TFYrRZJL3fWo&esInG@p?zeeCK172<%KPpe5H@vLYqMc_zBP5BT0YY`BL5@O%DmL0C@ib zo~VENbm1qw8-O?IA7ro!8VwC@6s%4{OMB}l)U^CNi$KX^4c$v6ZKi(A=*&B_aXc(;E8%F>(WKp z5zQ{Rn}8?kX)3%G!0QB_sHds$z7D)+fhX!|D!em+_YUVr_7iyU8uT~|;V|bn5#D`0 zD6`qIdMfw{T}3^85O@nufJZjn1-wXFYfcG-zH<4Yo0q+>+Hxb@V$T)pYte&RI_j|xQ6L@Iqtc+9Pr6YYE@I*Zoc!)NX zFUiyhJnDDNaLMophw9y(950m~6ra_D`6=)SpTac9)bk}j{U-Ime!!!8IuYJ{;2q=q zsNWF$h>vjavN?L@+*mtGg?D-n)&;<$e95K4D+Jy*fhXE;D!k3W+X_5UuLPd3Bgsg= zEj?Jv0FUaGKHqq}9l+}ap6IUxKcTDOcNg%6fhX!gD!feK%|#^;^+4do=j#OCML?o@ zV1Y}9NAVWmd4Xr;cG8Nvb zJ(4uS^QF8~;VlB*>{Daqn+lKCajStR%2(jU>r3m#7T}5UO@-G6ya$0N%2(hCT?x`} zdygc&20T%|sqoCe8v-6wX5}XE;^i{|@8r{B<(mwT%6B*1`M?u)wj!*TO~|(g@z()Q zw2xGHPXO-+z@u~tTDcMZ zqi|;cPt-rEGkV#`Prt|Dt^l5>f2r`E0$vmFC_lmxc=7go8fiZR9@RZ^sqhq}J;(Wx zyaEqiO-}N+!yV@QCc=B9N0P>XC+eTzr`MVIJqElPr%#MW_2pNC+n9e4x46ZJ0@-j5}m6N9p% z{s}xp8_MHugwF#WSh9MW43Em`>>j*B1Uyk+?1&@T;`Ln)ydMBh)R$CvX94eF&X4$~ z!dnKsKXHB&;dKJ<6X1#RNX747;7wf+E00uoOM&MBp0Hmkyd}V^0-ms6GCY!dFWjxb z6YZDmqc2&~fRzC-xD34TlJApR^jg9z`ys7Yh zg0!W;qx6aJ0zEjR20T$7srUtf_XFUG_K^y&19*=BPqYt#r?(+QVtdHFz!U8wB_42x zfG5gV;Kkdo19&Gbij{9NJhB7*mILoZzm~d9b#%IF-KA?6URYAP>O%UzwrJruSFc;O zu;{|I3l|qIUszIHvT*IHqSQ!*XDvH1l8zJbQ!^vHi%Kq|94ExnWx8bf($xG2kMlbr zUP;Mi6EgzB!sV$^n2r$L;fnZTT+T@ za$)I(6W4&NN|rLEjP>ZM6IV3@icV8qAsA4Yh1Cjcv|IvK(n@B)(q(6?Itf@wE0~6* z+4IE0X{aa8TSHA*q=^C$*NJ7Fpg1*l@r6nKhL%XZMv`n2aFR%!6o>adV9AO+0Y_)3 zlsG!OpODD}2)tz{7eVV85|UZ&sc3m3?-2~Nh60|*3>xBzY@s1eXb=rc$1c$-8W!=2 zYfH)1Aa-$;&w!Y;>Yb=w8Pb!8l8_!}NJF|#VR)I&hV*!|84`8GiIgmn*MUSTt?n3- zSZ>K^cml688jYbuQmLsS>BLRYRYOXtu!f;yW7Jy1ARck`BT-~x6IVAhq>1Z==!`Ba zJC#%?NJJDLF*G2*pL#L)2&W=xJ0XM#i|U0(XpCQ+a`I~h3{%pO+>Qed7i zV*}3#_0TYh=Y(=5EmWg`Ned7tCz>?G&tY}?u^Pg1NzDi76QU(EKpZz+j)tO4f|krk zIyB9osp?rW+^>+mf$s@4(r}6I3FJ*(tU5vC3wF)gON=XyIDri5NrW(@Coz;EJ&AD) z={kB=4Gf7o;uMLzzfPpm`glVU%PkoVPvCvLMx&L5PD}`86h=eRi7V=1a!#oXZr~JG z^ctt6Wv->h7d8#~TB2BD#^s-YLyE*@pMaCZA_+K243dDOhQm@0XL9&Ou8RLEhYxeOmBV!$F5u9@ z;o&JN-7_5S;IN9r6&&Vr_-T%c{}PA0IBe$dQV!>GI67Iye}lul9B$)qJ%>vofF z<&f@krSMA}?&6TXn?&(+KP}bu$04@9MU&TDg9Lr=^LaJ-pb)R4i|7};qb6S#e0Us9UNA1xPrr64nM_%7vlR8 zhr2jz=I~Mu=W;lTjeNp?gTuWXZsTx0hf6u6??Dj$M`#cP4{*4X!x|3hTMv{zlfy3% zpzy04;(L=Uyp==x?gRcT3pliJNZ)y&cvP2)Mr*k z_Z}s?-!&djebHW@1zyFk_Tp;5%DDTf^f>HBC4bzVTJfyo)AbC*J-Fh1!({i@r+V*x z>9PX;ej_d zl^)elYS@4=7JU*Prncfg`<>`cBBH+%m4C*Sft8}oi5%06% zOZ=Wesibsp(N=^Ewg`%)SDD&_j1q$nLB@%1eoS zA{?Y$lA08pjS4linu7m4CJ#6=bMj`+ zI`xc#v(CL>_2p~*wWYX|0+?GV=Yg9eX5~ia`^%_VX@rmNC^9Rx@W}&rjhNZH^723p z;wlkm8n}AMtX#+N>JWD=iwh%e9rL|_?|5CoQp=EfG4p*3z6)9E7Wh0YZVi0rG2bQd zEu&Oe?~AL1_3B|g*^iL+-Tbqomf$4F?P62~(V2j%-DOZdt5I$SX+=KfxH7*c&GE4{lr6w{9eL0=qgnIAK+ib{XNn?U=Zhzi@7yIcY^b| z2F_i?nSUeilMl1-t$+g(-F9NZ%^NDu9`JPd+9NM!XLaWI4nmPUxIA^Fb!W~d}WjT<*gMi{uPCb!0!m|RG|DnEfktR0xqw`aq)!c%Yk$& z(?V$AVj8q=>hWdZ`2E_d2nWNQ~J*|VuPvej= z{5^HMp@HPP)ldI>{8_>6o3ahx*_QB`s)cPYaqBr?orLA3MdJKkm)wl|=~O zXhi>mH>shk)VC4sycMOXwt}|ew8KdGt{VPBHZb0~ntk0dvG=w0nFC5>E*9Jvt-4Dz zESsT^wg8LX(U$rOfnf@ZMqruY4w%wkCl_^i=xC-o}w;HHpqK2Fa5hsLbAn>Y}$N%>2DiVd0h=& zG5#u7)Oya(hT3mK?Z^F0lJLiB_#%z}dEoz-nem!mHHz<*MCLn%l*Ws;>NjB8kzL*7mO#5e>_EeMKl?{c_1s2Jbpup_?J_}&m2n5=f)KAhf>7f zJ{;q7Br=y;QRsuKM7iG&TUwk58Rk<9MsVAod+OV;lUCQGl4vhT!_8S*D5&-?_>WtL zvhe+!moP?7bG;bBSV<#jHkAfOVxL^FsytQg%)$)m_%QwdY}hdNg_dcuKC`4WbW6hA z@6BNvNv5DiVV)7PYuNjMU9%-tqw$Sq+~gy^mpt%m^OKiFEO*`8H68unWF=df&gc&o z3(Nesq;#-LSIeT|2ZyHzr21T7M#J|G=PL)hr(^snrx7}&XmmrMyE~zE-a4Egn1OpN z?|5N)ptXLQySx|BC%a4frUwtgG6&1S8#C6uczxFO?sR;iYC3w@zQ|tmsQE{x)66Bb zK+D6vwsf%AAluqu%v`c*PDHtU6S)w@aG}t~35pT}#ks@yD(f0SaXzOws8LJ?#aRZ5 zS%y63fg;)1cz$1QK-z3}&+k($dV|Js1~`ry?kb85sW?|@I41#T(17zXaLfaL7$Uv? z{X8tg#@%T69mK!5NkTpQNLGEfU{s7AosK%UOUghgnFsa`%PTVir!K}^53V15AK)&^Wv7-)2XguM zdgN&sO{|esgX$N7sSP_0S8D9&^?GXXO&`oGPeOljB(fg0vt+PX<9Hu9 zJ{QMvJbYMNcg|4yKcu?#=}1cmAdwko}LyMfE8MOZ|%qbO&(t!)+Xsm6Nr}*H%7_#n4DWD!P#J%AHupPls(Ui{@kXD8{Ce*!n;8d+7CQ+}db7d{&gkrWGGj-w8`%U9vS_ zn(x6Ekn(>g&zg+yD1oXJ*2LY!rJB~qhd{u!9xPmtsIIF-n>&UvVJ?Gc*qmkch~X#N74x&)ekfQD>89zHZqV>{KP ztX?rP=~otSbx&gJiaeA9)v@=Ah1`D!=S$|td<(-2VPO#s5u_~k&f3LAH?&ycxGOQx*nr4W?!!ClluR3luCUc%8J~XfJ!ep3{DuBlKMj+AITYfsXbZjrPp(Ka9*y?D{Zm0pdtg*fi!}OL&_6XZzV;p(#XA0LQv;qEQ&C6d zuT8;hZ3-KSXRwht?~vM>J~j#cTPjNi*ZL9S{ndE5Yc$sGpXtBxV;W~a!po4NKe1@5 zAv12L$mKoBPK{$LB)h<%+3lmUD_ikH51Q@M7)KoG*51j12YBzXPNQ!F{Q?91Mn=Di z)6e1b5m2ggZ@ol{$1FGnxuD+(HEaBS0gLBftLGOUkz6yB8G)0!z7w(B zIl%5I_(xaiV22DWc6YbKhy7n&=<4=7C6CP-rUDZGT#f(dO{Jml81((q2>LX??9T5~ zagS{fx_trM%MG~QBYAv0mR$MDogWgV12?k}Om{CM4g+tEPs7-n$7UJmn?nJ?Z_sQm z4Y?9(b1O9tHuJ@^`y+al1? z8Z)mqkH(KsZ2vzWxpo?IJ$qyoUpM9}IiQp3rOi(FT&A;?>z?Me^yT5{#*2}MrDGqc zJRi7<+i`F{c&;??%+&EDe5u|+B{lGWxPzK@UUCtV>hrKR*_BOgl&ra?XG$=)^TB`9 zyuKtZcgGsfVCV$NvG1 z{~a3t%fY|E!2gFj{@?kagmE)-sqLJrMaOkkR7kCj|AW_o>pOnE)Zf%`E&L#_U)9s3 z$*~a>hYb|x)4HEMJ;_(5Lr+yxliSYpGUIt1>1T0!212(;=({Gd(z3G>w4em-D8VeO z2(qx-lZjZ5-|Q~sw$6Sm^Y{wv#Yu{3V3H<(bD^;M4E4GWM&8SfCEgF`eYwBSyf?0|j01=I#o$LpjjgRFI1~QEo7Yt>A==ch44DJ_3$Q4IH=W zWGs7Mt?x%7t7u#cU9HhQ2D;LutB$In>_E?R1-r+?Wkb{PfBn#0%xft8%^~!Kv|g?# z*zK7;9=>8IE120yDHji|+(U3BqbSkvrZc?r7#{IjHneiLbUa%of58w@EMyd?4}F{N z*TP1gU2yXvbKt@|dadxD-4(4Ltr5 zou-ZDdCD)|pN4rCMz80l1;)b9N2g*8pN7(3huwza!8bMtjlVIaBy=dwR%78`MyCey zlv}_<9aX1cEGZtmU!(dqazEdY`wrTlV7p^^iue6#eC(Wt@BO|Q>6L_J)7WU6iTkmp zVJz&GWz2XVB6>SSpdNOJ~Ei+NvnNY(wJtAxe2 zA;)4}j$`4hC}x0cUpY@X+MgRp2Ok+vv}y0mUMd$%q5J*Z^WUa5rtHq3vK%;LOrA9s zK0fY3sl2#}&QVP7r*scbKWWT@^!ItX2k8!0bHV9&v>+S3G4VZgbQPk%6)nF@36ol&ap+-0K2FcnNzGJ`pgRanBo@P7nexT!DB z5`ki2iKk$RR2a6|T{2;rkl35^`nWbMD#m#Fg zadx9{G9-&hhq25cmz80k3vSkcS>r~drdmp)g+jI-$hK>`UbgdevgJZHwMG3|qxd5z zerceXJx==|d4c>cMY~Om&X*Jq?$oFbfog|=Ds9}tT3+vS7PLHR+>DlILCbTpmiH}< z@-4KyYn+f!w<9qYJ~l>YO6qYYMQwRFJ%jw_YEKH|_@?4dD~CYv`|l~emIymv`{&d3DL zDE~3lKFu1}5Lwm0^~N!}&qKWjk50|p(M9J?XiwAvNY-7ZQICQ8hX(3vkOR$0Jp*sH zf(oZKh?jU~XGcGBAlrUDVwi8$^){D{xNmY6m^ri*jD^p_&4T8D9k-JlaM@7ftQcQh zih9dsKE@g0pQ(*EW8ss==x&UjZad0yCM(OkbA;_C&nXFox5k&HX)G<^P`>dY=8xE8 zbS{>06Q&vZU9Hhg1>HXq=sq5eQMeh!T#aHHC>~FscnuV!BjqE1d1nPQ+hhvmmf*e* zoY=|lQQ=HHubx}{8XrN&!cUE+p>D?XdBG&~IT^WJk&sL0DCzT`4`R}Jm~=nV=w^fN z%mlh0jNbhLm6{n}QzvM_%$uNtorI&6rU!dn7G6?q(1J?Q)|p<4TTAdn5b`rPQ?c&B zy@E?(8e9nt3}q71_WuXZg)EQN#Fxo(ro)|Fhc=W+8|e`GeWTF*e9-Mkpqt4oOtQhk zq1+;7;Vmdi@yvM3>!e~plZSLmecWzx;n=q?7` zqy)OxMh?GE7PWEw9iFSv?FF4B zf$o~&JkU^G&DJox=M)cq;@6kMh1!bWq5Oo+o1#Z?rV%$_jfKyKth!z=q&@#1+=m>` zPss5UCTU~;>C8g3|EJb{szDNJ(58r}LFN5Iw%Gdr707nELAJ2A)^;ctaoKDEYCU## zlEltWlCYYdjeC6??0n?4V}yMR^;Iu@dZDoM-{%yEzOg>Oe0zqde5b%>7+FJyXAA7N zp{su9e=PhM*1HbH!ES$|arxe^tUV%e&v_5{8j@!Dy z!>**Y+Ym!JepkyeZAnS!=K1H%6avtBh*8R^g3 z13TihhkdRypj_l+bNea1bJ2H67#)f8q$sTm{vKJ5J}Vn1R&kfxa@>xF)C+LiGwlP- zMy^yAJw8~aFOAXBnIx;re!Z=q=0l|Cfo$9`eLZpfczi7Uc*M!)OVm%|3>$WhRM{Uj z3Hx1-(%5#6zWh40J%~)@KGbC5_PcRgFs+m3Qw5k$9Z(#{Z4S(*dK~|DW~p%!;%SaW z>Evf~EZp=xHw)`}>~`9*zIQ5P;mU}yUbr+#w!n%%amLq+OCnS+uEqV{Vm7GiWbd@# z>8icKfzzFAcGzjwqP)Dsy zmMO5IX;#r-b)&H14%qPDTVggG4G%;~>P+m|l!O%B{=y8lzhJ>rg4X9p!$+dy?@^oF z(M9(|6VDut=Y8P$w1MZ#(e%J*_zzJB+EqH*)m*fzqQU+RLW&0=^Lugq+-Uf*r~|9x zQ_!x|l?QHZ2Gye))g#DfqamLTZOxDSX++1uF&;Qf;DXks$bap}kEprni8h86K{&oiK8`JSTxM=X@Vqt~ovS8nR1er|QY1nn!w>1L*U_WaRa zWX4HhGfoPd0@(>M;=FSVNBFELH9Ph@iv~X^2DPV(LAr~f^Eb8se3 z?OQN2MBQaKGTAW46*pA2b)_k`c58=?_F36{RQj^j!!(>Fms89e5}h00(VvF%wtbN| zm;~iqf>p?WG;W+84S$NYBGHY8kB-r;Ulz1~+v^1BeoqJ5&*VdCtVQN?K9_^fhX(uq zd2B7M(r3~+cYA{c7PFAWg4V_M*`$4+M;?gE7R;_K_e^H-#;`dBo_VnzPvfigvuuA^ zWHP?+<|=q)DW86lPzW3^9dcw=?+ubE%jFP zW4{NbIFspdQ|UJ79$Brgr1KkaxI>M{>0?Z2b)PP_Vpri9TaAo{t_?08^?)RBgr9(6rKI#a2c>FtEYay!;H<+P4bA}>m2=>H(*Z%qFjwH7}G9p)Ky zcopkY)Z991Gm>u=-U&0I?^FNNEu$tSggaL0u2b9V1U)m%$cbtd&8CY6e{WJb_kiXVtR)@0m~O085bHIwxiMr#TTW?v>3?xTh6 zX@&!vGG8WqB)J&J$;MW2w!-QZZwx2LGUC_@$f6EzfAxl0ymf=N?a=BRtzvBjq7;Bl z77snzsM^I7vP~%({J;5n%jAsWT)0oFr`y`-PCWXL{(qF(FIiuPelqUF!(JD&J3(Rh zoI?(>d+1_~|5WgwV&MP5$aT!}`dkKhE^mxbNw>C%zR#j72Z|^C^>L~!M{w_-w0}vz z4R)q`b?ptRFFlFH#rqh-;<2#a;;~rDF&45Fq`~5JlPrw{Cu-$nY0m~>X%8&%%yhk_ zzcZq?ZVPYSHh0b;)~ZA48dWK%UU%rJibqc7?V2<-bzV8s)SfYmdOo!Ut1%{uVQDz| zr=_8Fp#Kpq_C)flBb#`uMH;|+wfonoeOAbKmC&n_O4y*+@nNH0R!y%$jcVhRqR_|| zy+dZN3B+w4y_a+D!ZZNt=ulX!Gf8q0K9h%Wcr+=^ zT&>snWSk4o&#P#LMf);%Zy4i6q9iAANlZ)2b>YV(G2=?1H7tORl zLJODhJ&e#aLeTt(YNlF&f?xiMOsrXWc4|@-t8_JV$Tc`p6{-)}2HB z^;ei*T7%RBkPfZvJzTjLvyT09Ag?;__Y8j0C}fTz=O->jNVoqv8ZJONq+w08y-v(g zPm7p3Q3Af~(%39jeMTkKvsuu~*s@Y3NNE z+hN)@7w@XNj?nzhGx)&IH&9G+C%(QlCb6RAo zlWEhF7n!5_X@7 zH%VNe@qVqODD>)9W66z#*W#(Wy5e;x3o$=d^GFMVegU1L zz({x*BpL}XVOo0z4_+lK^A7Uas_P?1!n2~WJyCvFZ;~~vsn6*`Kh$rb{{gzUSDo`% z6mz=?D;vBk?p}?WNnaT_mc3e%(K1{(JA&O39z#2gX7mvjtRF0F{U8l|In=OUjUy`b z5<&UPw(CXe$3qdUP03DnP5!?wDGKS&%8i6y#IxuTtp8=KWM!;23bnJUR%Jo|e9R(b zJR2cN1h;34g*Dy!Dc?)kX|pMBTBWAR_%=rGD*jFyX3}gPj2;HIjpwSLmDs`6 z-5sN|Lc?2dx}t3(tzeSV8)pP2?4hROa&Q7J#*sJ~7aL@ulO8Wd6nkoE^gVC995D_% zbR4LzwRPDPYrCZbeg9_ClWG#}a^WNhYRJdTuJqpj)u`cX4Q;=Rp7FCMacRmWn9<2t zDWX2O7rl*A+nnD`|7G_neFSZ+#a799DuypSNQwo#@6dQxfcMYi`qzM+Qpt;;wvhe4p-wT zjm2#}6pOhGT4B$Sb_H>ok=25r=^TCiO2ZdKu+y-aR#fJo9GA8byJ_)rjgx7dL0gx6 zBjHInOCaHF#iTy$QLs_o)HxEij4j_!={D>x;|oo&0iEAbXCm(&jY+3!b~`UWSQc#u zH@Ca)ir|w`YMn(%PCi7E(Wx0)Z_~-0BF}xmu$K@XmA6^>*HMZ|)Ac^+d9>4ebS}d) zc-SOb_n(`JLSO2};gRrTqpSD{E-Oy&tF#9SOtVJ9_mA$|ul6;&H2OZ!4;kq192KYc ztk}ULdbtk!?NVQ)CtDi0aF|Y_^lWM?Fa_n==>PGRnAo`(&tS2}`5kb6E^c>vB)oo< z&c%Fw8{WtJKBq?2532hN@|57s2K5=U75#_tOD(iBNxM$s`4!2Al{{(*o)P+} zp2!O3Z9eQllv9cf+ncFHy-ll5PiUt$lAn%zD-8LjQNHX96i%M>%bmoB<`U`+@y2~b zwbcqK%-DgTr@)xipay-2Z|3xL(}_(d-etm@om!sHR$?xnV4=T^m;-6b_fT8u*>w-r z;?%1iz>Hw-A?$3R?Y`o>;*%GhJRZ*kJfYb8f4>LMPZyzfWEoGLkA#0dBJ@d9E(Leu zL}ytnIGNxH-LXN`sF%UvPYV#z&9Bh@M`9G&j6&Q05B&)g_a#tl)KM&D6sKx=90WyE z0>$M_^H?8|Sh}>w+=f2U47;97gI9|>949$_#L!_%^h$y=wi}IQm^8$*P7tDpY&_$_#Aei5G6 z*!c6#eAc%OasuWDYS(fc67YC|jduXfr!L)oO!TY~90yLTv( zJ2(B_*CPiC=;`exr8v8f|Mp!7_24v)W6!^xc&eV;1Bj>UZvG^lo~jG~Ohv*M4PwvJ zN5aoVjP~g@3Hvlcw!b(LGW6WPh>(3wrnc>#j&+&j6T1=g6!k#1qf=tf(J4j5$Z8B9 zImOdJ<^OZ7L|x^zlIpkI&Szi8qj*;0?v}8djdbi8d~uX&Zc|fDStY)fSSjJZx31aM z)LhZ*J=Zm_O7d0IRWZQ7R z*HxEa#F@5TN=GpuG)&taNn(Oblu=>Y{GXlUH&E)XS=`!#3oQQ zx>}n2bsJrVFJdwt^uf)FmYU`!_k1BO%W?r@%vql6`u4o4bLUlkMs&1?4~MUm8-^Ew}=@;ujT?*41-ig?*8g6(4l^l-|K3wM{*r> zS8d9rR1@POE2^qoy3b%Dqrxf)kz|6EMVDS$TvT#N+1iq|SI5z9tZzmc=t<*MsI0HW zhdY~^QYoONSJZ4|3R0QIOUzjal(_Wf`sRunmv?is7e$BSgsC<*`ZCXv9pb>L~6SZ0ujhn74p$YP2t@BIOhpBjRt)1VS8tWra z7f}3UX_p&)FuLBljq{}%@5YMCEkd7PUzl~vu5=W14;djs2UTpqcNApF1IS-e3~Yy4K`_W=9PmtQGKT%qWH9dGOu)1 zSNLntGq_<4Hf@<7>kpE$r;Z3CN2M>;@ras5W?&uFP2R?O(K#AaV@*+FrAG}Ce9&BK zyp`zuSjES@$B^hp+o-Rtt*?ve%+*6{gT*URA{)IVant|9+PlD4Rh@bN`<$F4Cn1Co z0)!ax5D=oJ7!VOD#SkJQA|g@-t(7|lO&|g~NEsU~rAR4rz{`6QDHUGFA=cVN9ZM|L z=r|Uw@&@Wyq?AUa%2?~fGnx}ZF7NlZZ)cw*cIN;8ywT0tzqOv{x1M#`>$dk<>#o(6 ziOpDogf(>Auz2P26=jRbyrmWEt$ogyuUxmmn@3(PxBcuZ&h=$$?&pzqyL#1Xb(B=OyYE>|bMI=gsXD9-|KerQ zrwLYDFO$`2=**eW@}-qamzA${smugx*K{k<-lTd>D72I{l(@u*-%}{-O*kcVQ>9n8 zuWSkxvaS4L2Ha~ltln_nVk*c6yAoXDnzN#;f=-a0&^D)Z)(s5o8I)Ngt1`wm=5sk! zohpG-Li0kFd#&T%;*yzZ^Rjt5z`hMs%B~5SBc@A?o2~3)oA?!>d)B!7>4#=fKGU5M zne4FhzL((5&H(N!r4y+(lu_URo^C;y_$v~u=$p`MXCfiCxov^BG(A1L=eg)h z!t6SGR7J)jZp}9*1?xk7sk+04z5-pd?7Xv@5_8t)DWtfs8==eETe0Wt&|AcAolpg< zV2Zi8@}6botCw4KXOUBP7A43nUs}H09za@h*N5D2vu=5bRCRa?5(T^rmcS-MS*CW3 zL4h7_S*fuH$2}Q5A0g-YFe`ldTJN6)dNSINv7r^K*DqhXE@3{g+ML4DAToXE9i4UJ z!HaVZVj;^T~#dOx`RhB%*a%MFHcJv{H>itlaYt8X=o zf6FlHoA5h~ys-F$U$*(4f$uf&OCCPq$GDWvZOHu{cKimrcHp-KIbrb#Z?bt>;JF`s zuZKr?K363?`M9zx8~KUo=Vcr9L-5N)URZp>0h@0XXIllqhKEmh37Iw?p80c(hSF~v z#wVFZ{X+ca&M|6*#Uorwxbk~6XL-#67ZdK}zwjuo1@H{Pm0dyPuR#Ce0Y-fWegWi# z#V6c;y~S4vUl$qOdVQQv_#~Hjjv;p|`CNrv@8Nd@Ibrb#zi#t91+ri1d13JhFR}U314jJ{@NFJG;W=F5nTFhc^f(i%z68H1$O(%_ zxX9+20?$P7SPzeI7MFNZkXw)5N_f)o^CKrL9^tmxRz9tRr(?EZd@(zoPr{#YeG8s< zamDur^4FmM_wc=i-)qPVi%mwEVv=W`)m(ZV4o;```2qv12v1M2H1_?^Das5LQs!p8|$z1p2@)Sm>u zOSn_dgx})gJd~9$X zhevo4*Ol;mcCBUCnQM)P8_-`0-&y>cuQh6g#V7n8;Y!aV@SOl3Biu=!@V#70UpaCE z(fbKJmH3q*CoCS}+ijkVpi#dJe5;2?cpjJPRVl90ISKi5v@^egZwh`BkQWx8aG}jt z0^eBhC=Z`-4%b!i1aQUs(M-$ElQWHmKf-ek-e&xc&opX<#VdS-aHWs4+Uk#i-y+;e zuW%z5%|gXfxJvgP#X81uJ~RqAztiwW(fT?elL{}uWgrbox-u}CHngpz|SZgtoVehxK_in30HiT z$j?Xr1biFtD@R^f^1{n(zF>c&eiit351;S?F4dDsw)@g_i??n%{X0CHhhhhQ&rGL( zw|Ry46E3?B!}}C?FX4`z!jEyS#J(`@9k?5DzlOUIS9Z@rKOerg;h%$FDf+^)TX>4i zUqt^q4Lr%iFPy_Q4xV(}%W%7j>HBa$EjAhk!!sh+sBgjVY_U-*%-=rYQ-sS-&TyQJPY!a|%{Pp%(>~0rNyNBGP%i|52NqhSc~PaJI2pTh6G zX-2KEc!b|3T#pWxbADjlB;+iUEi>HzW9b^&kdxj4ZoIe#O)FOh;YTfg>wD`e422_9^u1Wvgc*wb`bv? z*z+2GFCix^dxYz3o|oWx0sM@IN4SVfJfm%UE`aA!{0cnw2lZD*Zh<^}gAm`whft;}H5%$|WW$>hcyRM4cBfRk{i)YPM zmOZ~CUF-0>6FJ8o;U$DC9qE+k3h-?n9^n!$*)tirFG$x5*fSNsiO31d9^p%Eo?>{$ zfk%6IgcnS<=0B5h#W!xUW!IoQqkaN@mrjn`B^)ALcFiUqM}hMRck)~KGX`%|%ZlT; z;yZGs(eNwm`7?aS@O$e@qgGh<2{#fh{ior39ejvzhfla;l3{!so)fnFGOl=Em}J@c z;|qAc@T;2?w^R54;o^CX{Cx)eB;gLP@Cq*R+=|=}vFGA^qyBdM79uAs`-JD(Jo)7B zeDG`!k8t}HR=f2CuJ|6i!m{gU@YUeA`--?-!rKX#9nJ9V1aBqWu}gRbmuVMrw_-<| z?80v$a>Axv;JG$WKKVKyJln$~oX(~8v}~fqcl$)kt`9F{e2d?$6XSLX&nH}V=GWwwGO^fxUz2u@_E?P0bd?|*~kmaKH+qmZwY*v;1my^@RN|3`E|L`(0&v3 zdpP-p$L`CGT4C`BZzEiGoQ7uycnjft_`OvWw^O*0aHa2Q_+AGeBHT%@@Kan=!-@!U_b;H|7|9v(_&tK0 zu+l5M-R5bAXD4{8he!BcuI2Dl;>xa7$d6cJ7|&zZo%k(7UYNgq!i#La?2DKmgBN)C zgiE-_!ZQ}R*U<|XF~7pE5IJG~_6g^6DZXsvlJWlw@eRQ*6FFi2_6Y~<_*M~L5X|7# z%?IHql}Y(<<}#zKHapGGha#jp7?qgGfv!tW8T{CfnR6X0WnJNYU68rNE-A6I;f zkpFVAVLXccx8b({d13Jh&$jtOA=UxFGd+C5lek!ZtoW2lZkAv)ti*9ejvz$4=q>TzA2{7gxOVajyr@v2i}GnXm91!`_4A$yfX`;SrYo z!T~#;RpeI?%){x%BOLv@#eWJ{eD8kUXsAd3-{CusU(?r(T4C`Czd^X{d=kF5z^@VR z*e(15m+Xz;if^aQcfkb4|M+e9@CjGhe4oI#1-#kACp?!+|n{1lh$*n`|q;$4p&Pv93pPFQvb?<8FL zdlEZ#gSUI^5Z=tC{8@vXo`Y{)%s36dJCSpq3*jX;Pde?#3h-?n9^pA$Yn3m!vMYeR z)~Dyvz6S9#kayOrgRW{!z@NEHa_V5Yc$;Gg* zViN9b+)pmC@~!z2=5g5d?nL@u{7zoNJkGXL_!!};ZxQOzd*CC4JI}Z99xjz@IWEbn z$i`K91ku|G&;3{Mo&>)Ddcv|-xV_NgtsKpJl0xcFVVqa^4KDExWvOF%z3kB zIpiZZAH8w#gz(EnPFOs`nKsXD@MMG2Jv_qgV;B=*&+E9VZ!eCq>e~+ZUc&FWG4c8) ze1LG}_iOMy1AdZlC;x?aaH)RWkDTh)&)|6wzfH(F^-Z|a<{|$24d8MQkMONrs&59a z@+&&pXt)Hv%dTYoXEgJp(MGMX(kXm~aM`i7kbW23Ot@p0@L?|5^%8Oe(Yq0zm+^ZM zIbrb#KV$Q}3{M^SfQLso!o`%JVi~Skj>xB>|8w{j;WrO?VetviwE0HSFU$s)c=&{i zxWrR{oDaRxmkSqM)qILpH$+;*{*zE3W;p34|KpW*k>#qsA-_$1-V zm!0r5gO3yLSy9N4LxDmCp^*S<$1233@-BU z3TJYOCxBc%djAAZ5I+MsVetsJje8LZMslB)zS9}X>zALYyJn@_7;S-)|^NnKMG#gyv;S(Oq zrFu3TIgNiAr`8wXmxr7)9u}tEH_L&3pgsqj;o%YP7-@}%Kf{$>XGR(g8%fs=>^h5I z^GKssSm_jgk8qXaBk-L7A0yl;SK)(PW_}^}ZS?*Lp6Bp;8aZL{2tQ%-yamsb;5{B5 z;jLWa*^FEWy*=<$;kOYvVetsBv3WY+SqHw;!y`P8OZi@4yMEjKq`=~DF0lAnPpUtI zAL9#`U-%f|N+08q`uD&`2zSyee2`20+ibVocBkN8kNp#EoM+=48@G^Kp! z(l>1?>&^JR7mBA(_-(?K9>)3gP2j_XJLwaCj!X6ZN#s<&k1-xNfZr3yIrUxmF`MUI zcxu4AJv_n>axI5v6|VB#wB&%<{bzZ1jb??Z)~2v@pl;CmPRHsMY>g%5HuZLW94mh<#J7d`TJSr2A?>rB4&hUTEB!l&?=<)X z;ZA-Czr}See2utD$BVc#aS!0m!`+WN4R;SNG!}j(fZ9 z&c!VTm*U=pI}P`0+=;ju0sXDhJ^l+kV#D>T|(a9{YvA$hY$S zlYFb5O@!w&{65N$*E8Xhge%=U;b{gRC)~*g;r(1HzX)*6YFQ;SB#wVybDjVc_zX$1w6sSBV5QO``Yp>zR&V3zM`x7 zz5u^Z^5T5L&4jBQw`<-8K1sM!uENK-#23MpeLHQwFnqi5+wS2LuCn<)fo}_VvxiT3 z9hdlK;i~>lLVo70=KJINDfmr5URd>4xX|V+p+6i89_8T^ZXagxoyL`Y$A?+zok@Ft z62Etc#nUVN7U4=C?i?f!BF>gm2?g ze=rw0^{0ijlk@SLjhxfJ3K!cvmoncf1yA+x2#@7b|C);{yE2jg=oZ>(?8?S39eH8p zm#|^;-3ea++>skkpYUh7mR-%cMnjN%4o#=r@jHo}uy}-z5w3iR!1EsXh=)h`WiFLt z4X*48BQHDV!uJS%JCJwm5`NI;I}6`d@ckY>;Wb?1;roS#H{tmXJZ1PTK~7k92`{vH za+oLG3ZC!b5uQx=>q}_QXVD&jClW5q-#+0>?eN`%j{}ePgbQbK$&LVWqrSzwoOUOO zpMjjPc!XPr+U*2(v=6177#h!K;di-K!}Bt(_+CK%pBJ%CO}QP!uMT-(@d-a=^YPBF zo_B%9eh;7U{aoVNfZSH}_@1PGBYu_035!Q~mCX}iUUesUnTJPs9G7@TA-4#rKO184oEgIVVDzqr=PZ8BLwFx-^9a93xa!d(@bK-A zag1>1c@y5lC3|)w_g9{in`!qR!*3^Y!b+F$7MtfIc(#G7JUqgSxWqFXxd8D$hdp!g zn~9vTc!a0gJiPm@=bf-I*~23o;!?fN!4)6xpBw)3@0h2;mx*5r^1|X1?ig&PkN4U2 z2Doi-Jbl7v23vf`am9B8`QM=bIef?PdkcAC@d-EDd{4voI{1)>Pxt_r?AwED<{R<{ z(9bL(-|*Xsys-F$x7d6i!M6=u<>3=9=Mvu%T=6YL{sHty!gniv^N|-8pYSZ3uYmd8 z9B`?JPq>Ine4}v1mxufk^ryi$9KRvR3yV)U!{)mkzASLi!zcVjj>UHtSA3^(jE3px ze;dBj_?^fxYK6ro+(fwQR}Fmcg5M_Gsc*suxn$onxZ>N7{DtVRhwmx;_98DVKH*1f zzW3mZfWsa>;mus)E5{YzGUU4#^4SMze~8%^%y+I!A*oa=@hQvx*U6UAom{em(1Y%8vM2)CoFq}@3(nA zh37%=CJ&GBT&~OEDYfm{hds0KEB4qUJjv#n$T)fmc!GyVxFy@-`6$~;S2sML;CDJZ zo-X0zgex7p;W-I@mvARt!cTHtjy*Lt&-LWO@Cfg)c}~F-25?7x7qANROE$~Pr?&yzRC0llfdIVe8T*`z~sq5ZWnt008bWvLF9zRBiuF6 zN?$oVesKH1c>07t8))&IMy?XQt?+z=-znsT#UuQ#&GQ&M$H7e=9^uys-+_E1`iH@d zgbPbw_$9)%uJAVDFN0qs+*xN3-pw_UeA$AW-iJwU8-7*DIq%1W@3rmt0y{Q=*Lmy^ zUdF}aRIvc}Yq%lY^|(RYyK!I6vc`eWWEl-t6VH#XVf_}r16f9`uKW zSGpd7?*#Z5;Z8b*w{gj?`;k-scn3TW;=~ti{B^@pKzYdH;?hlaPSZhpKwQ}#rKl!?!^`FBbk<+H_fE|#4nr~w^Mj4;Y!~b zc(;QeB-}}_@CL3Tcy34T5c#z5TE5@G?^fi5m2blHY@R&Yl?C8A9v7BHZH;y|7i3z zK5m8oQv3?gcgD-YxiAn}9 zwtn<0ggfaLeu+ywb;v1wS6s(?Vf>y!&PlKEew*hoJWql5dU%Alaf#=CK zd^X*hPx8B*`cLsYlOCT>3ZEcc`4NWa6!<;Do%|7ggG=+tmvGH|LcR<;_?=Mw3-~>Q zys+#N-f#0AhVLoxUJsw}CNA+*B6sE{(og;0fL}Rs!r~ELX7dDTUsi!{_wWeMFGOF7ogQhq%_llZSgJ?vrVjeUGK_do*|h)T;Ddxa z_6XN;$)3H)DgJ7B_TyKBoMVr0*ycF_55HkDc6fM%7jc>SgWQGi{8ssc-%R9$WsmSw zn`a#5TMVA;;Sv5K#p3xSg>?_~hRkN26TgpASog4bgijK#bnJwu8GM{@Ctbp~bIG20 z$o+X9`2)`a{N^AhEPI4YY@R~woe7@i;Sqiz*%}v=;eHLiX}Id=#wHsLP4Miwp6}l9 zD@-1DZ-_<1D@01 z6NEcF!q0FOVNVTmd(rEFXD@z_Atx*z;T<;5DR{!*Z5|%sd%2WfWyoztkKeY|m*ckr zIbrb#-)i&lyU+UD!3#Y+!uyjfdv+ul4NK8`2c9r~+mei0VetsxPq@Gb2A(~*;@ge zxXQyPT*4)u$;iEq-WGVK;x`dFVetrGYV#BmJ`OzE!y}x{C7vL1&!V>%xeWXQ$O(%_ zxZP)^uafXCGN#oRPoMDHT;h2dxu2l-d*oij?bl*CG?`DZZ z_eV&?X8S(x3VuIk>t;^kxwHLuUTGNLxBc}a&}!Sik^7i^|HKsX!?tb3H~9UgEkA)o zF0f_v!t7ex|3O}|{n(aoYVF^z(O!avM1;;$k+Nv*nd%&(fYU=0?~qWTWzi7 zlA7jwcJ4ECaCzCvlNbcPev-%v5QzDTiN=>Wh>Tc z&*emaZ3enwu~`q;RyHwgEgM2tutS_DSh4rqv)ubE_HNIO#fw#Qsbg%uP^g@UD3j&W>Pr)U!8L}^8A8Ic%jX;|Sf!~?x? zv$0-002V#m+R)GAS-HB0kG4`x5RuJRLd|U~J-RCv-&47QEeE|`SM>5T^R}m;NUiGY z=>+0D3bxwruME~E*;E#GZ}&Xhsyu9f8z&;sdX%hu(sqGg^(gXiaXonYIlbt@B$rDi7hSoJc|%gs4^H~NGc zX+HN(fcLSw;~q8vjK{4EHh1~;_|bq_d%JtG?2dJnY_OWB=dHY})~&7RB|!Z5GALMm zM;SGpE&R*bhPDTXReFC@#3}&mq3o${)s1){7jLp(Lo+~e1N zMi;NITM zGB2iK=HKGQ8#Kaq{}wM^aLpnu40-GTEDtuXy7ef~Ep(RJdLKT{g_?_%zu4bjQwh8`V=ohnM&`UFX3%U)b2i$%WO2 zmpJDOgj23^JB>yMplqi;6b^cvRGdb(Dwm7=SK1b|*&U4bm=~_K}-f1fi zr##H*QM;2L4@5$od6UG+jym@%)Xa%`;p9+vY+tu;rZ3_v=#K5_*11Mjcvf?;HU*9D z*e;K6a&z!NXhe7H0Owq$>Lgp@98$zdFviAGHgzh?;sh$r28s+MMctg)*>y@bZ#U1d zvd*wiewdT#bz&f=2qiTon=a?^wHlTGr?tB>Ej$yuQaR11I4{Jhe9l=vY2hi&2DV<` zt<#Ef?Nf{;r*mJOGZ2Mmft_<_gtvj^9PssrTo$*y_aHczwe!*JKEbWfH*2T$QW%;DbI!99_vL!2CBAIrH3@}UNXI)l_JX-g_%!6h9 z4-`ii+240( z{8+v`lHUPPxhm7g*)r72xzJ&fQB%=XA!jKyXHS^+Oxe{BqwkPiy4lwz7Gg z_LpRyi~MF8Hok9J;)5Y0oWY5S#nEL(Jcn}39P&p7n>mz64*kD9T~Y1CVHy~gYARTR zZcsb6%;2{=_&v)z7GeJO32W_32)@04Xn5om(MyX=Hb$wR+QQ?EnBbRgk1UJt8KYH%lJu=sO?w5J)zv+?xmgnA1Gm?B;JhkZ{2J;^g?Eb)XncJ-X&^*!4$kHE6#C%q|pPGz9(ImNJM5q+dRadeNS z<>5`AJy7=~Mfq&}e;r3&F@F3+Yuss#BiFCHH$I4@p7b0?GAuK8P-l#gRYwE5@8fUs zoqQunm|SNZ$)jWb{ZGb`pYl*aC?qLFTqb^(}OSYZXH*8Y6D&eKY-ix66vAQ zQCs7TO)uqMm-0vNMHg^=)n6k#ePy}EE%(q8XAz%tPfWJXPEQJF+LFF%qsAJ89AP9Y*=EY#JTIA^bPH!>`gi$u8xQLw z;#n(v{JU)hCq-5tUZGRDjaOvX);h*o=ma=NGOIAq6tGXCjE^Uh!zUOg>D==Gr(|9e z%~?jzt+OFpbCzEd&FXQsWp`{_x5i9AV9csHRA`xpN&YU{>O%7eo>;W4Ha^Bk^d&WvlK_a|6!pleK|s?7M+m`F17jD20B z!-wm~aHesDGdiz{4skU{p?PaBD<0|^9Vra^TJC+R`{OZ@;x)O%*e{$LNyklUNjlGY zmyHk1>=y~Z^_F`|>g8~ao=b`{6VEd4jxEKST=VSmBs3zf#?@%}d&NGxE0?k9kiy)i zF`Q$1O|;CFpMm@r_S}rIZ@4=)v5Rwh%{how6)F2^i5-kjPq-?MBBeT}k{v)IvTDX^cB==JFQa#~+0`=WD9@8`mw8<~+m@IY2= zckE2(z(`VI?g=X;dtJtF!FXvxO8yV$uE$f-(9j1jZOu(b&2lZg0hiBGHs(rhP4UJ? zN>_O`)s0~#F&wsMQ&wK>O^9I|noVub82+L$)oE+|<5TRJ(2qzF&wr=tix@x2c5-12 zj3*Nq@97-FNy@LbZ8OHuZdDnte_W?soob+Z>q{dFgCUAF)j)(X}%~@ z_hr?Mx$j$XY<1)KA#r3U#4#hm>aSyUnpq1Q&-rGiMK0o0_U_pD&cymX$>sYoe4Bcl zLE9Z0)@jx66y;tYty;gM7e#_*EI%feU?furY7O zz*17*q|}$Tu5;ObJ)^X>>ppMluS&3LBv$oRip4G8uTs796;9F9vevjyH8O4Ob@v5l z3%cU6cFbh+om?!KD!iubeWTy-;tU{nV??n+LtF$ugr9fO|wi_QfX_`#wW3| z@$2)}b6(oIz_so_$esU4$epLp&uXo5t$O4Y)zzeyY23- zVqSs2rQ6>fOFGY3BulGCg{)`&_2sxFjl`VsN3eNz_L%D6QtSRzV@&m|rJ0nz?3WF% zBAIMUTA?bF+-l$F>YYkkx0X2hJ|63;dyK}4qaiy7f8DOO!}#+1OL94TJ7l-m&$Z`9 z!fge{h2aZXF-ksuVWgnQUvv@cF;@Fp+B(|h|0ev;UFR*=hjl8vTU-8t^vSM~8Gmfs zV3zJD6CB&7qno=1)ayC8yZu7-yLTO4!t-`lR*^Bnv26tw%O|&bB&ELlu484^Sa%Wr zeLu5rRb3bvS(L|UBaidUjg7;?c|0k@xKB*eeAli8*mWwQFTEroO@qud< zp~PM?)(y*&X4#C(|(s9 z$tp}ao^SeE7CO&Iip#tg=H0`*IhT}R*a1)#zY>t z%Lr}b8R@I$CsD7g@DbGad@K*qHivkMZ+c&@f4nm?C~aNn#`g;Golf)G`?EH0Nk4ih z7u|T7h1@c`Abdf@DD=O7K_pO^@;fVr3rLsS14modIjMS+ST-lbvN0i+WruvtM(6@^ zJcQl;q9HsRe{5UCxTswD6Mf2MIttT{aq#wPLvC!7Jw{8$gF_;!Uqe`#4$kNw9ulcC z(VHNxI|qs`h_`IfIWF_bn@gj|6Z*l?2{vXO>d!nj{CxMv$nhy^xI1UwvA<%= zKbm*_xT`hq`WG&3l2jHx%O23(5bg}~ZYXzo=G{o{CYpCQw)*bgRx-Nj&JXBgN%ynM zoE-d+bU)*%S6#8+cdH&W-l?|5IC=*fL#hMgGiv-T-|HA19?dGg#;7lRc&p8|%;owF zuJ0yr)pz@t7seSzG9Gpq9{%tun<3;foQL7>5*Wf*qmhzvw7_G@S`W|K4+q;k$LBk# zN?%^uIx&H#93CefCp_BoK5V6BQ=Zhg+SzD_60~nXTO+7#!D8ACM%?uK4%-6euuhsT z`SAbPY;#<;3t?;b)X}ckXpb$AdbHC&th2Qh|+1k5Z?Qfv{WPT!4nfIppZz$P*2g?eYHqf203Vg8n>Hf0nI3($;T7v$sVK-#pizr{Q}& zfv?cyyU6Ctv-#>82GjNrveT30>er+HPYL=#Q@{IT{g;DIe{{NHowUqW-kxoa=k00w zzKg>e>5r+Izk0X9n5b;fuI%ur@Sw=3>W2)*ON<+@Z8Ab5slQI07-`nuE6w^lsCrb5 zr57~Ici?o*K(>{no3%O~YWW&XgPVPdF%l2Se%jx%ooC&$uDUtfe4lJIl~OZDQYS~+ zHS=Fd&nU(hqo|`7N1E!bl1cG9C3~8jc=Hx-$$p>pimq5y2eY6h)-32wa@99tMr+eL zN9!zFze&(4GqqNB%xbMN-?$gD+BznZZLdGiXnn-h{S4jO+h9s)KW25r^G-91Sxd4t zb1n}q(M<2n^0cz9*rX2TS!KSWS@`ueqVk(%HWEwxSXNlgzM04YCB};yMsVcfD{_5`&D1Jx?dkN^1$O=u`TCW@iyg>Sr-j7>fdB~fElgF z<~zA^2Qd!lV|}D6w(`6Y>WVEppU&3?*4HM%>4ECm`GMWR%5?jC6R(f;#fjI)k?u#& zQ)tF}s~c}+Qfc(pJysjKVqY^$nwxcf~T%OlIzz!km0YYqZ2k-}i{;o*wZybMmg(f3>Tmo7y%9%YN05)^DEvy{oaT zh;rw-H^+COCf)n*)W21C_M<+BudQpKJc(z!8_!PSDNJb5{|#=<3}1!ai6!!@es--_ z-oDT-w%`&gbVsnP-WZXxOBTF}pJv|HOuQ@h)Aqs5p%CAknDca5;^dKhvc{*d66xgA zPd@1W_~K?O9n#3)eMUc8fq!UE3pduQEJm@aGNbj#1SgMviS3W}Sht}3+m-A0!e((f zr5T7=arSdp1iE53l2)uP3ouepz5HWau36r9x^WyPj_Z2GaXES_wK2>SEse>p#+ztd z)yIlOS1cE;e&+h$=3L{F;;7-veZ@CoV2f`+X>{5OQWe--S{j|Olsn&jrMa(U%v4#O zDsa;KTbSECZHVuYuGnYil!D^2p0(KWbT>nC)biKNPG~%{R`akymP?PxzhqGY6GM zKfeUzj#&TNruv={>0cK%zjb@Rj&s9O;bVhSA?_YBQOlXVy8X9thJ*o|@kkTbID}(TCzm zv3Y`p{f-Wj#3gA%hyHST{^7+c3T>7NTvK*I@Z(nZ8x{4#u~! zei&`d618X1u4PUtr^4T_$8*#f>+EJ#GJKEC9;AeqD@xxaIvSBQ%gy(u=Om3TNRSr>xZ1 z9`X$g50pPOC8No_8^ci zv2V#$*k?b_ow4L@XZ)HM-gJ6cWFT><&7~cP9xHKjVm*4Lz0&n@mu%fuB%QRf&e)&2 z5=-Bm|F>>LKc|=eZ+Huy7rvTU#WJ{N=;NidBfrg4jXtUxX1dg{+IS87d5<{8xi(f2 z$8W~=%=<^pIQpOd+cj((HEf$%mZv5-Y2FTBxEEhVm-S3rWtn7`Wq`7bJYa+dgfqka zDbHd`yMWe(F<6;eW23t+;NOv5x(}J9!JCt%6Aly?bjEVKa;gW_C}dFA ztXjDPOz8|)?gCRTV9JT7yK~k7G~XSo)6?I62uyPTrW`vt$l;s`QILknU@pW?o@?x@pr(ow8ja z|I#_DR&IT#{(ZJ{C~pIlgOgnLl*?zdel`qtw@yFa8PCBiMrN}Pq);ZQyqV0Z&t!!( zm6UYy{=YM}wNs^&9A;eAm`WR&qy9H~BHOXN-{p)o`WW|j##UpozvUO5-nM(ctCx-5 z{hk>L<=;u$9n$PFFZ>2+Pz}kpYlzclh;b`ceWTOyv3e2tZ|a=&bpPs1zCT|OPW#-S zsdqfqH|4pkK|A;P`Yye>|L0RPX^(m57o=Uzpk2=HQ8sOUCxxTPy^lBdESq-TW9RV= z(g1ga;aD^v;@mm5VG$NgHFNF>mv=0@KfNE`9;@J;v9~)0*sc3eTCQQ{h-8>OA{nNc zTUG}BsMB)~qokhiNUT{?+*qa(%MHC+=*La#2a(Ha#WGy!Vx)8L!zQ<;Y-LuQ$J@6+ zxHLM}^Xr5~th@2VMQ-8yw9eT24(nU^U3CM(w3gC@;Z&2&@H6b=^p_#WtA7_B^<5wHc{5*&*CdnLeyj{AyqI63B!yF(k|V4%6bdmzGQUgA zVwSWF|KjqDuzqF2Xzh1$i}Nzfw^Z532G9zXwARgcO8OV%^_*KkZrxgRetL6;$LiVn zsf-IVV6pB}8IeC!o?(6&*%_ODKEqDO03jo((X^=IJ$o32Be# zm8zWjMI66m*KYvN<6qiU`&HBHN}Tk+fmIu?^QQlJJMArF8vVjYUvU0_?>v)Ctxc}h zb(ha*U7Vox>vn$O!tCUABgwWk$!rrcv6Zhw&9yLo6V%5SP5z@v*!Gil{ae%SXVjZS ziymauThbbIV_Zax7i3_kXGYZ-d$8S48!)KZvhTzMCsns0eIlWEu4w0HZG45AY^Um> zI{h9+Edl+CnYul$_S6|OT7Q|KJ-0m->#lE4!8-Lfxu$jT`F}AQ`+JR(E^kkX1jBEB z$jol7pID5RH@kc@`SlX32=Ys%Nl{3Do*qX7@Tdl|zrSg0P#aN`?I~YzTM#ZLCNik!_ zlGdkP?Q*nN_R_xj+`pVwJ|z`q(57fK7c|{8MvubjOpGLufYI5=MV|ksi$vtc= zbz|8~EUCR>31MTEZR7K&EgLniea5uWegEHDh4$%QqcIhWZJmQ@07w0w3qhM{zY4snUBeZ zw;gqATRpkteU^s191%Fi^y2t&n`+xgR!KdzEqZpH6Z2lQ)~A8oc6@_uw(EN;HYZo7 zt!Dg3%02PM-~YG%6AbTUz>v_w++@c4@dwX-pb}3lTDQ~xPb zf9eN`rJ3hy{SGbfTd$7TkGtcg8M1SrBlci-V!ZDA|JD;QboYw)PBUKPgMZ^UiyD6w zw>;pse`P(=uw%ZHn}3F@=L&L1tkmQ>(VY1Fcf=-Rlc$Y}mbyHj!jsy|rVuG}pMTi& zB)iXlG{x0!LHqP=J#*66ZPkX3SVvc4Uc6o6*#9M(|J6(LOqa@VQ}Z-4FMNd~s12%_ z1~v0kkG!aIxs01ASQtt#N}^#~DjSSGaL~leo$f z;+oLKn1}KIz$Uq=%md^GnFq+#JU}b##u|-kb9rATz8shD8u%tA@TGUf->_tapZTDF zt@U;#II3SHd~HAS?_6g(PonisN+t0|fs+$A!qznwj;(Nbzv<|R-R9xw#um+Ow93#CyRlQhVM^hb z;y&grarTZ_NoR8SV1s4fZ7z2N?n9ojS4V7|hx;hpD)U3U;p>Qv=yde+UHyINznGw( z>Cvy}*VnRRC_E~eGkzyup5_VJxlQym%!#eE64bn z-6`37h|kGa!{1L|e!E}n1<4z8PRE>uS&UP1cHJp)V`w0T?o@yj zSu3ezm1k7r+ok-r-2L@_N9+e3-g-X0_0&2i7hWZf|JAFWS9GYJ4=|Gx|8j0Dbc9m)2r zNb@`1q%bR@2Vyof4{hGORxqc$E4k)a+o4eUgk-+fJyewRWz~%SpJ!xf)Ykv=AZ~!K zb_3yq^~uaYvY3HP_q_lAggF0_kF^O;ca*o>{7TQ=Pr+O@Gv|xJyW_hm#C>Ps>&z?T zzT5DPqr-P6^&t~nM~kL4Ig@=BD4qJP`Cu}u4EiO`j$ktFQ|$5l+T0aP91&EHv5Nstj8wn--veX z_*=3Wrfk5K)qHq+owd&eyIfELt89ywjVy^ilkm(=JkK1D??Y3~uSGTY^cSU2hla4D zg34~Jt$D}D>8;+kRvodS?(Z4W!at-(^%wckHVRk0@8?T0!|!KDgy0O#%9EIP!1%t! zc%sD0ox5R7?1w&czdBFjmxq+*#sj}%UkB>nSb9R%y6*~B`)iUWBt3rkTGi*==Y!^| zs_fiivwoKp{<&BAyxJb5_Ur4PO7r`(j@Us@T!pNAr-d(Oe*S7czqia|zYOj)1NMg> zXZZo50cGj=v)wA|X+!tW`Sz9%PGx%LF<8=Uae-rOFb#?EW^@r{O$ z_2=>KmsQE(uQeBvk3QD-6_dlY$maSvT>p_!JHKvnUFvf6^Kd0M>sO}w0?yjuBgGz> z{HQK19Nfj~6JtWH8BkJ`e$cE>s_CqoQTj@*C8hlKCezi;+J7P`z_RG(2zmks%r_rMZmt06+ z!V`(cpLu_k#A;+x_yoO+o`?l@{C^@3f(d!>vvXRp%q3>A9BngLA)DSh%9cNa{J9Kl zPiVn*nL6o_e!cSKf07r6v#q>nBQF*vlkpZdzl$-!-PDdFT@>=y*1IP_#_grsy#Z+*;f93M_bltj+w^5y z8m)y=p?*s-yo3E(s|(sSKo2^A4JlKt|UqXDTW_%&yv%UojvvIpOFKg>cT6YX0j->CFUQl*HSxM{t9#r_S zRTF~;&c}YjY}zO*t}ve!>LPuTdCy)`l>S>hWmXJ3f+^7fu2l_&RE+E)*fbW zEu(ODlkB~wn|-vt{P4zXT3>PA?sEPb&e{ad%euc#{$+jn2Uohtm3{^3hZCf8y9X2d zA9??$8tu;iqpu?Q-8tCmX&=wWeBIsV^Kq3@$hUp{!odSsj5GAzT)&#ik>_JA%#f?@ zIv@Mgbc3~3=5O=P$If&G4^*)`SqJO5O2M8ICpUjbOqV9ubOc>1|2LEW&Uj8wr9WH} zeYz4&dz4&ATjJ-byo9IqeC#=UH!7zmQ=g;XS*w&)vgzUb7~cfgHOr}M>EX)ep8Z^E zwf`!;6^hH;j*Lb{R?p~T_F?m~KN~d%_N$w8cRqGE`$@4sh1xkRyNtF{Zu0wauE~_m z^!%hMj4U@kE1V{Sr5} z_lfOkPp^4CR%FID+$ASeR5DToRwx{J-6|?E7{8 zux}UT&nSZ)cf4;`VZFf@aqM!){Pc^Dlb9XFXFO`zQz?PN>{${tOQ6YqTk9abtu<#8 zysf3ZqvcHt{}(<=?KHnr9ygHMQ)%9s{L>EdliVMC)RN71Wp6_EcL}l&b!e}*wD51p zPmO`4XSD3D3Pw_>{~A#iw;o&P#I*?hpZ6G3QvMw&?ER8deLl9VBix`ki(B`)I=7*- zKOxQ=JHBJ~2dUM*0{_p>$FA)NGjEYrnX6Tf){hdjCU%t2vIO{AQLzQh5$~aaM$4Ku zNBdG&djr}JCTI`t7)j1)J#6?1t1l|_1=tsXaUd!7!KwLxY;e{si=#h)WoZHn^Z(`~ z^$cYx;j)jd-16~#gp+e4=xJryt8IrFiCQ)u9_Zxb_GL~!J_d7fuYCMhX54A~0@o^$ z_&$o(2#V2LnA%%*9jj=0ZM4d&W#%)Q(PZA08MLkH1sMM}`)D1D!X9S^{xo?*> zOIJPA$Th|MYD2#dU}Q<^Kbmjb*cwQpCrx;Y)}JTEt5ay_Qu_Q20p*W`)>4#@dt9c0 zFx}B(EydX@;CyVB{ksE|O0oI->!Fl}4~F>n|3hK${`&BI?Cbni-&%=F4gZvVcc$ml z>Z|_JzLc77W4UVZfvnQ#4cSUlda3Y9`f~PdXbhO&(rI?ySTCD%7#$S1o-J`wUqFn_ zy-FzBo*YRH-$8sy)xPn?d6Y*by*=Ng`!bTuak)~y-(@L;rM8dnrq0LSVg4#h4rLYR zrI_nFDfWt%St42b)+41lo3HUxXd_;1PqeexjbQ>Y+}z8~y{4UmsHrN`Y*%^`($f-Z z^h3PIPn-?V=dlJrzs`Ke`ej#AlfRl4Y>9SYQu!-J7B=9Y5_tE0{!rjveV9AB>=_1Lq{pdAIy$1Wr9(9iNQM$n8d zQ2pt6YaPN0zbGNRe{(!uU(HSVJOO;iCr0_#`(?XeAGtYE@OnR(pNK&yzqsxxVt&u_i#L3a>QhI?C@77 zlfz$SL)BWxg3-1G(_9PsW5EZjvBw?B{PbMU6bHO1wsYIh_a*Tdot}`sl-`PdjAw}P z@7gS$4rV|N0kZ~Nt+tO}Fr1H7*z@pyO&WKckF7k%zP+@hNwh`m1I9Pumd0o_RA+XY z&mg;yMJHqL;skrIJ;xU<`HGisTPUHVT|=-p2|JUh6^8)>yYwJ3?U_IQ?$ek*l~)kb@%;(W|#JIJ2G^aj!R`~Tk$njTH^)SUL%U%Tml%r7{S!(++)S9!QX@-0V?^b4 z22Y%7-C=vQ=paT1T7@Yy)~HRCq{adU;|V>H+G*Pve>y8xv+Qp;lbENmK54C6y>Irt z(Npss8`oSuJvuHS?Q7j{2U5d#oAVK^rST0#nf7sDos&_DpZ%3hR;{!$E*Wa`ZgqM8 z9^Usnb)!8t!^3+G?S{T*605(aJ$40oc--u%HIFZjPIGzw0iNb^to6*}+hZ5HUjd|s zFKYJJ$fm5);F1)2UF(~riF|8Q9BnOe()oRO>U!~<d zER1MMz45#^!O5Tg#4|b}p1VBptY+Q8ne}D!?V9pqD)SraV|gmOS!b8&T}X(1xvg(A z0^uRF7JLuOFB~H5nUrSd;Uk9ZOsZk0w{u=;?Jt@2<@+~|Lr&u+gKw=fG|r4pbS)f- zg&BQ(5!xOb(xvYh^j2lPxq8qZ>(4rd`io#VLpxBKPjZlPb5f0RM>T~OjTwRSRm0PD z)1%pT2|0V1PmdZseBNn$GR$uucJ<$#@$dll#~ayYv=pC9H^0U;zWmXW402cB3wL9Y zZ$x|SE#6k^3)F{Z-#=ZFm0P`W)KB z6SVK}XusI}&!2Bivc5j93Jx%5X>@MoEPhpn&cE>0l^R3aw&qVScJMXeAGkQ9nr|eFS;_gGbyu8MR5;Z9 z&bc^x*zc6m?=LTItuoVM?bFvDJL7&EkQKfhyI;Mlh<8vqf#mAs8YA>z-oP0bnI&+v zczRxH+Yj^As#y7xlcW89hPM4MBemwjT63SJVo?4AE#2c&A0PO1UTOBmfyKcYeBrHM zbym^>@TJF}Sf|u?#ewkj=tj>s`p1JW2(*{qyL@eV$UdHFO6c1cub6W2itk`mW%<(kR;~zH=8X-lSiOEZ$F^uUWZUB9 zYu9X8xrTGUdeOQ$6u0_s$hhWxRm#|u`)=7EDqOjd6Hqw71#pS+emqAeLam!v z*Cm$H=u%3p`UUE`mLeOetE_eX;;be^$mRPz?`7spi0yuXGv|H&=YO8_KbQAh-rJdJ z?}t;$j(HpW>o%^ury65c)>Uq(@z-pq^GCM+i!pDkms3x=p{DA7Pj{1_TK8|NW&@YC z8~t_U!e7m&$E!D2d&T0P>K%FU?YbT7-?*}7&4z0Ks{8BK#+Juezq>=Bzj95#ILE6oPT7}sK<21Xmeq)QAs>)4u{X^Lk zhs}33QEV|GetWkK#sG5~^Y=vZOn|QgB zw*{l$+X2yUZ}GJ0&uH3vI{Mdb*jT-??s7f0FpM+{KW*%ux{AxVBD)d#^%jz*l#HTTxA+h9~e7O4Q| z44^DG=#%8v>nvPbxrMZ6O`ku1#`Kx<%I=zZ*AlC;W+i7e+xyX7`Pb2uSFxK}RC)3I zyUK3AW8vbjmMyw{!R@o}Ts&v`;yHIND4Vlj)}8*ST1=o{#Qrs#m99UguC1!I_pDrf zf2?q(==rodN7MYwy`mhh;P?`$P3c9;+*9ghVN%3~4LZ4@hmF+1g*} zZ)oO!mQIbD{=i@8Sa`if!se;4$zNIHXG5s!4K>)ixen%fGuC5O|NE$$bJQm)$2Cc z;o2?0Yt}I(;i>osIPapFjy>5m&tH|yL&X2|K}D>qWV=78zMa`s`P;O+j3ZhQ4=4%cn2q7SFO>oyRLbDoaa z(YH2LY}j12#$U6R-j#+(?^t8iZMD_1(N?lFgtfg{C^05QxO*(oWu z$fTgA_$jb2P4NFsC0)D9kIv0Me%u7VGXNSVsA2j5Ib*(NZ}3LT-e@-zO(|kekiW4D zuFk*GYp)d88lC6^M5KThEtri#8@5z3Heg1Sl_F)|Tt<`2CS3irHj_cRFYVsJSyi>U zA4|-9<9~5JtX|0`Br#`{xtD8f+8!NK+Q`)G^E9k$nKZelqZ-$$wd9S)x4D{(ucV{u zXSbVsqrH;5P5qVJIf^bsN}i(HK6A4k%Kc_T0>wJ*j_i_WX5o z;+DTvS;I7T6Z0aKwmaX_4t^RnnfbVT-nsj)xZxUDV#?Cl9?+Q^{pM1Uw&0qgPAIZ@Ca15a%(3Tij0UH2NvQ^NX1&bs)YhXl&*rW)kJ|eqO(D9| zqatjwN=omT;$P}_{DrPR+w+%lb}(;rM|pd)tGTTI_L(K6w_EnFGX=KK5N|Nl#+dhP z+_1T}tZKu`=oo42CF!KC_*48}@kfk{>}_P^#@;Db6C*5P#<)eJ0Qrx^@%HGgW{KoY z;-l?*pdvM7>Z)ahfAz{*do~r#0{br;dpk$!$Q%v4(>1n^2GX!sJ!8@0T)&wGZ|k_A!Q2O^5tVK!T5i9cXR?*tJmX0adBe!MJef@f}rYOHik z{m4>Y`ZjBsGnAES$Lh_is+cEzPSi-9_1_WPZiMrq?Z9p+wkuz_cweYTatk2zCxF^J-yQasS6w!({W)ln}mFw=8X?9QI+IP8vU2B(# zBlTUomNu&sX5||8Vzztk4c>@F%jM+L+S%?NoD?H5y`VK4)^4h~uFmOD?0H-NGdXJN z=UN##1K0?juFjcdyHjbiDZ8_Ad)SMfQv*bDc9=TDK3R*|`|efzFXO+k#A?>QS6hc# zO-GP5F0mSf`FmP;B5pEzW6*nkg=OtXv6{vq8;zc@^n?ot{|Nsidm#Gp^9UDKxbVrl zE$c3L9>e!p*4p*>-vE!p7yqcct>(FG?savx)l`Vgf49{jtoXvYgp2PD_BhN3XA|!6 z3%8Rg@w~s-;aLvPhse$^j`9eV@U*}j&JCW@` zPgwQ{Z*h5Q;MoS=Xz&PE;1#KbH7*IpqshM?SswaceF$f`d~d;*4Nf!ogpZMV@w~9e;du<6Bgh&TMR|k|5-vNY zC0I>|!3PNU>=J$mC!Ve79VI_gDUSz`)uAV>{0XmjdA7k*172tF2&dt0f~Wf{R`UzQ zYlKG?6#k0UAS@o?j|o@$9q@#{Vp$&&?%5;!3hrj*3%z~BYlG(qvPSfT#Up&s<(Za9 zzQ6|z9^u`%sqk#USN^KdSNXn0{na9?K;J8G;T105Bk-*PFEjXruf~Zd$K@G^U3thd z4Ibenm**TjY2Y}6M|k@}Cx5jIt>)X-S=O(yrw&=wLaRYo`4e76xXR_BB&%s1cm?5J zISDVoO~alNe6_17u0H}_cIFX(Bz*DMS%55u_`>2BPILLsz@Gt5GWdnN?{vYjWoMmGOWt3g=l2+tr~b{|N#nr4Bg5$@$f_{{|l z&#Mcp<}%`aAD%amomgNs2#ZJfDB+4%NdMRZK0>(1BfK0ZdlsQLo_PNb&k|${&=VGq zFcTx2XFoip;9`SE_`)3y&$&CS=1Z&D|C;hUkL=7HR)es3gj)$$`Z=jq)0^Pe2>0v} zuEEKkHR%18cxCWZAS*{tSUkc@T%O0^Sq5HY@CZ-9-2l%B{IB63oA2aejag5boJ0JQXMVCZKm8@opM!HBCY`4n1M<2#<1kTHq-J z`wbr9WAmJL@s#UN!544QJgd0`p7cDcX(F<*^Q;D8@d}S1T=u*&$Z8r5zM62)KH(4N zIy`N2t>)3hn+DH&$j;8S8id6oe422@%TBkN-U7ctxW^;hf>VF;JbHtPcNaV_B6|)! zVetq*RzQ%)v==+G@0N-L{^U)U;pYRNq?*M$Wz|#yq;XIt| zN<)v0m8~{-GLR*qCoCS}?m15WF2G}f!*inf6FxA137?+r@SL1& zH7_cspN8i(WXI7H=I?3Ymk3vT95cjfItG5x;1PZnr~Y*hzU+Dw{i}%oJ@_6&_6YjI z{5>uFfXi0_-wyCrgHN~yw;Y}o_~KiPes3A=1iq!n7NRdKKH*s|-&63-11nFh~c@BxEIxC*xp zp4QtPz7w}w%~iyIiuU>{vR7`m8id6se1ve>F*eI;ItqS)aL+E`!#LIFK784?8~qaE zABOKqWRIaQEI#3fUA}Voc7k^pe8N+3s8^4}7vCuKhavbc_zIEv(H9n&S~t83euZ!^zryQr;weY( z9pY_AF;e2nb@L9r@j}+ErZQ!>F_wprt0;loz8T?K7>+!ea=i`49 zKRCl#-#s+LS!W!+&T4uD+4dRHb%t;`PWf7b-cIr{rhtAG*&_6Wl`r8^!j=9$=JE5v zC4_tS2v5bST}{OQ5`3fZx8N7JxNEvIo_sXjYTf|v*GZ=x*@fv=gRs&OK1aBClb9c! z2cIF_OGo%Moa}uCy{{4P33yH*JBFUHc!XbYd5YjU0&X;TgrCBRXAgR}6R!cDAhG~@ z!r~Er#N}B5&!gan3?AW)IOTILzW9pKA5Hvo@RcB&ioUS;geSOs&%-wfJkH<~&c%r* z1-%^NC0u1Sr6Wr~Pgp#{UBym0eF#r)G3%A$XgLYLg8LhIo5t98h#3?AWCF3&^otOKtw zc!Wpc#FOvxtbylhWVr^9aJtL$HawZ&6oW_j#59NJ$TX|DixYCn7wC79y)eyc5a#b` z;lqS0A5%!@Iq*Tky?hC;!^xiI=&4*s(0`UATZ*1n&cX{^o+sg11fFZ~2#0R9ESg94 zUi|U+HTdFPbF0IfPk&Q^to+s}ukcdBWzR0sT@GGMxM!d61e|yZU7jWIj72ue;1Mox zc}~LP2j>|)!e^#BJg-f)nqU8#WnJ`B&&WaL*p$gE-l< z54~rJmvW8Ov>#azJz?<(2V9=T@azHaGI)fS<0{}8jW50e^i|%guEc(1dFXrPFP!P} zy$N3qINjhAK6DG$Cg3@MFTUU{R`YkU=fALTAF@5SSPjCmPk0yM%GXlT3xIbL?&VW> zIZk{_@WnSD{Yv5w8(}pqL{^Hvu=s?FUA|}FD*;b6_=G3meDu?2rZ{}9Q=I%hM}PGu zve%|W^DBIuaM|N0{3N)AaL+#BT{w+D+wiqss6zj%*z=#*SBtCyePP)rT<-Ec4Br~? za)VFUk5fK#UArpi|MHP#8+Hk&xjbj!$p9xAJi>2ajChXU?Bwqycupc~xjC9Y;Uk1A zKVu0$3VwlbFMq;&aN>Csy=mm**^$h9kv)Q*u<|9m-Q`&a&qLsC29Iz8PCQ+ct>#?% z%0R|@3Jt=tOStZ35!QK$>li* zPZ~JR;1Lc@Vl4;HOZc*@agx=13-P}N-wVi|on$o#i%<9f;i}ge^nVAzPZ93bv+z=! zcow)k{|V0`WOEH3;bNEP8F)&-Qw<*BJe+tk(9`w$eTA$ik)@&MUB4H$T%PyfNdR}> z7_~>Zjm4FC-n!9h-a|fKyuoTZgX}bV!pfKMNy3$n0{Xkxz{d?9;g@h)ukFVd-;?Ms zBmPnN_9EMjzOeX&ce;Gb;oAj%*x(c1imT@T3VikBCHUf<;_~KAw3?!m^};MtArQS^kxBfP`qSp(0*;0FvI;U$FYe1B^a>k;rG!oBlfxYP}QkMQ~65+huA zEKYWeK<}HRdpCBBMs_uN!m>j+$F-vsJMzGph8@CP6P$AXXoA)J@=D8keH{HVvI`Te z24V3CpCer5kTi;N1D_$>D;MEcaplVG48%g7JsXVVsBHRuV;F5xvU&klGhz~u&y@Isv0C1|ev9^a9=>*D7sgu+!r~J?N4Q;X*HUia zGlWOV4SW(GxUUq66v zJ+f8k3yV*9smr$uzUAP>2A^;VPUTjJFTQ;ARZe~IU5zXkeXrbv(_Ox|;mZW47<|Iv zBB$KW{e1dSV+=Lr(vg-hP>xtI_ z&p~8Qp(iXJ;XN+TLU@AUfWafY1E+k};)`z;`YNaTn^;#NTY{cc@JP9VU&P72XYj@MB>KwVTKM)N+l{`LU*VlD-*WhN zfgd*bgzIqPTZS*b`RFTuufw+xSt}6A6h7hdT+RI9Rq!hY zkMQ$2M^eOuG+mv0q(kASxue8S~8mDeKl+K9(|yJ-os z1?UNjN4Ui0*$+=CxY*zkF2dakPZt-Z?EdIWZhr({JF*L3GWsL%Il|Q*lDHmn9(;yy zuYCv~#mTPc(6jraDfCCk4x<<8kHGs~o)TSG0q-+-gm>YJ;aP&O@+w9DpUKx+_~s)k zL0?$;6rSSp9fofjc#^>)xP$julDpVeEX3F(f8Vy@MA9D64oKR!H*hz!gV;=wGKV?JKgZCN45$*uOAX# z>hkP@XE}JW!6RIPQ~Mf)FT3*5p9^2%E%dj@a?ux7K84d=zPI7a1T)S?>QVT^FFHJJ zUvzj@!Sf!nvtNwz2%jcg^`HGkuJeQ6Alz#Y!iR9O>q&g&b0_+mf3f~=+J)?4^u76* z@HUrkJ$&22TMRzob+`@il;bO(OVA$%-@m}O4A~;|g_Td?QkQQZeDlF22A}W*7Yj8F&hi<)9}l9^o{X=L|d<;3R`bI6TJ5--lzIb?24zHynht>X67IDR;cYlhtLpjqwteV7N&NZn%|bQ}ePP=^@I;rd5x&XbB7;x3 z?K+3&t?R7jI^sP!jdd8Z)7M!I!r~D=Nx1AN_%iD-@NvRDyM$NaWY1Fc{)%{=@Gyp1 zi_sGnkMLZVhq10{0eF_dBb%#4$o%G%xZ8ayspLZM2 zXCXU}p0Lsrew%RFnO?;B4Sthw&u-xpIGtxl(9`vfJE-TQ$X-CtyZ#}3*yWi5&vW2| z29NNQIMwqSeAV+J^e?WptiQ*uCCC<_FD$!+OI*JF@Rfp#4L;!%ob2kl)@uGQ;(Y*5 z@3qWNuC*G3#UuO?;mS`Ko_6pB!oB8|2^WhOzI>IyDbPjMmXBK#xk&bW?PW)r=mH#~SPpqY!;446ugTAo%gwtF;=I2cr z;3R`jxP26D1)h)a=i#5gmz_sPIqRH{8E;#V9T^o}=LkPXxbi=V_3QKC!-RX~A-o?q z2cEt7rTDw?@5JBf`djfAfUEFT{wv`7XY9UnI?qWVTLz!7@*&K6%1)2@*kMN`W9Ix`oby?;Ut%jb$?SDIL_b`K0U%I*W)9s<|l~vYj{o~YZ+lR2#ZJf zMZ#srIId^B1b&`y&o1EuIBu6z*Wjz3%F%y-_&M|!YmhBRUs!y?i(J0l@GSu^F!+S0 z;by=y4qxTwN56{rCGd?xR)D^+_=K}vzSHpKf-?+0;m|b>&xLEO=7q#7hvy???_Fax z2#ZJf4B^UG8td6};I|0(@+rIoXV2%*D7M^r)g25vk@;f~5`K{*3#G4P#1!Qf0t3jB*r-k1l zT>0QSVbdA#X~MmH3Af;6&-3UN5pN4TFCu#mJz@Ty7JkO%DTe0|c)!6TT#HlvuR<@6 zc+bJJ4%rIyg!y|~c(Kb9fM+Rqp}`|ujN?{DbpifY@Z<2s`{@^~=45yV-EK97zd*nA z1*<`rzo&)YCtUgJh4(}7dBVMX3ZKR;gy*R1KZURMwTF12HPkP>L1Y2q35!?w5tnxb z>*7bj4;j3|c{uT8pw~*gm*B}pmWH0Nc!VvN=RJ55z};6z?Gyg=YNy|R17Cc{uXgwn zW^rC3YeC=R6Mm6!DGwU@xp8+^jMapKvD-p{aOBs{y2J&c~P>=NGQ@~nqvJ9vx1 zBV02srN=?hYGk(=h`9s6yZvD z7VDz};Jt)Q6?Yuj{-&fUgjlAARq-uW+u*_Xd3V;B13W zI1X11&#`>YLHs@VJMcH+%ifB7t2qdN;cT84M7Ad1Y7pk{Y2jsrE1!=t&s_oLzI!C! z!nrt=pM~Bxh_@M@1Z3S;SPjDB5e{A9@Py#$xPs^03HQoRxDBU#AHrbDrBgf-k=3@~r0Th<_h^&m%jWXEg|mPk2A!%3lfVnrFcK2>0?U{4mbPsjwY? zGJJLDtDpG+d|Q##qVM%P!s}eV?eMJ!uQK?Am*FPEvk<+H%W04BEJijTJz@Ty7M|hq z9DrvQnCFHgb_wU;Cc~44-rK}G0T0i(SV`y!^Y^rH_i!hF7vQnL;o(sp;WNV>o>ue< zzs8ux`TZuc*U%FdkMJul&j{8lC&0%H9^n^p_hC-}zY@O+e=`0G;theP0p3-}mJv@_ zyuu4z-aYUx2G2Kmg(u+Z;2DcAz7gnuvYh!Pe4~+FjlQt>gmYXzo&jp&*&r*^;1ll7 zb@)2)#rIJz*XM};8~EChUC8D7oXaPCj&QYyB-T6U!Dk5f+K2FdoZ3emzU=&Hn8SO1 z81ECn^JDsh_mQ0&#`^>=ukf3Mizk!y$J^jm!aZK$XK}Lc0D3jVI}Xo5WKW?dto#b^ zad{TP69fkg9^vIU@hn2Gn0W8Qvjo`!^n}GDT;lTVho=-=Z14yd;KY-S-caIQgeMnS z271Ec5l(P<+Tck6TLzEt!5pWY_T!81$sDWs{9ltk{l{KpyK}4tVetv?BwXdPoN;~^ z_+i4mauTk?iDx}}KPTQCcxsTXLr+*d!pmJAz6jk^4qj^T2&dyV!P7O=;cFjiHUF6S zKZWm8WFHN+8id6se4cRG5y!m!eegNLJ-dWY;AGcP^d2MLtMIfSJA$6Dc!ZyGc_zX0 zJovD|BV3CU&pPz7=bJw zJz?1+oayqs2~Q3<-QW=pWjpQteSGnq&E~mr;@7~}hV1QZo*Q@hgx?@s<-#+qO+4#r zy-K)OPQowXbp9N|7vEFp-$4BD!*>ALUi5`!pK!qCTMXYG@GgT-cneN^>+!``j($4v zpMh@;GT!%V5Eh^CBA0JBd`rL!3_jt>IPs0uF?=J?|I;$ddKtda$atQ(L0EjkIW8a1 zA2;QJGYvlBt}KV|V|?+wmt{4-M*KGTE+A{mvKoZNC;S%SDz6Osr!(NwgnQ*D%vZy0 z`x^1ZcM$zU#OM8kro+e%pf4;w;h@VmAHIFyJqDlfcAWCN3SWFn(ceLQ{~X#Cvc>2N zi%)p2%eNQ41>ji*pKuXQe53HimyiAu;!lL{YGk?S3yV)U-Q{~5zD#h6!6zKbbokEV zi|=$M?@1B=ui$$N*&CU>C*|@9A17Sp<)^ePC;X7hw+g;Tz}pQz;R>Ai7T}Ao1pV+=>CfRSMOKWyu=s>0xqQ#THw8Sw;1g~f z;_w_C;++3)(~lfRc3?>K{1*-qu6)fWd>?oZ;a)z4SKuaM&wTXSNPpK{?kgfIMNe4v z2v2i)4#G17JjLJ@ec!a0nl&`Vqogg2(SvM9TD@0FN`4Ya`<Cqd3{~JbJ3H*U)mW5AJx zhrs&{9^suh@oY!$KGOda_B@1a8+yXBN4VDIse`8uTxIYGFU5&x0eVXm?+%`OLpB#Z z8^a^advJEXcrUK01U%K?5e^M<>Z@&#)jS=Zufp>lva^G%24UGFe422TM>g&2E$|zJ zd*vg17$ z1zf*FmOwmV*(cnU=GgZkyuE3(=d`GO!f)YZ-)rc}p64m|R%9p9^XwBo=JJdt{1xy^ z29IzMC;J}4mt9rp55|sq?5agpfxfWp5?xFgk>cfE%%``$?9dGDp% zXM*oEvR6}i-Wx1F;TFPG?xU!uyk{G{q^mN3ko6tUV=KZo=;qE<1YR`4D`baL+E`*Kisaj=BCJ z{K?q&6!HERd;Sai4j|i0JYm@<%&u8B?_$#31Kwru3O|I~4o^0|_$>6xiNACq>w9F~ z$yS4~_=H2r4qphqj%4}=!aX~MAH|7h2YPB3z1a0IvIo%f+KKQ+muDm4Tfj92kMKgA z@>`5Az6t10#SY#hZ<>T`9QwktOL&ya*8*Q5*l+L&f12d*e3<0ewTJwDjO_iSs9nNm z30Hnn2yX+wO}Ljo;gdMo^AdV_q`w4vjv;#yJz?1+{H)6}8J7D!2Ol+fg!kaY z^C)^Mmrv1q4A~>-dF3ShfXh=s_zv(^gGaamC!S^Kt$`SUE z$li{No(IBj5U%p&`zcMQ!LJhTmACLqxYgM8EWYx20R2Mj*^d4}WKW?lEc=A_xO@u< z4}t>*pYR%-c$T0yoOsRXEkm{lJz?<(m%2Rr2%irwF?fV0;_iWGG`{!>&`&1*AJO+C z%R^sSe8L$n-&=%dgVPK?;a&>u>+pPvzYYIGe3j!{{8WKo!@n2*6<2=5^`FCEkNg=I z?{)ov>py~jKj9C!c%AEy#@~oMgn?`DKf+f&&QT;C)JNtL=Gn;3a0yYEzo&&;30M8( z5dJ3kHNw665-!K7ADDzc9-q0CH37er^oCk-RuT9h{Yr)}#oA83kGaPehST>jFOj^6 z`$P?d>A2uJ=CaHObi8Z~?=88G8kJhpNuAqEmhyJcJj$ebvlfOqh@s0o8%?HzYuvv>S` zZ19d38)=<0jt|nVJe^I(@ps6JC;zfx!!ARo#?aYs9G4pUMdaP%`5)t$d0<4o%gEOP zgFn^a{5KfA^)k7?o~!yt;fBz{@t+o3x*AvUwJyeHS);ZGa}z?#O*Y6rW?mo zjdX*C{z^kwStp_RFhf{Yktpf*POokLoy7_QzfM269>Trf87+iAVS2u`xkTEPcbZzk009(Tn-) zc{G9(IKbC(qbiOG{|go8Q=m0`{xure;g5V;w@h0HL_;0w&kJ?px}Uc!)3?vd28cay zxLM`vsy1(`DBG~PPCJN1T8|ooxwVMVAnXqgyRC;$kviW(Ho{jMZ7e2OA8NI~8A`_Z zsBM`(uU;l?w?VO`feStR)~sE%`JOVqCtFijwpw~#0F8SMpYpuF){x0$uQ{^Uh7rOC zYx@gs>?h&#-{bp<`hWg3lDM6R)hnx3d!G}HgqZf~JEKOa@JY*vb?$dCBhh5J`4R0% zfWEX_w{jyJqZpzaFO%8Edx|1+TF&Qu_t-prW4?|WO~lTj@m<|W>ixe<90{;vRIj{u ztIhh&DXQnm943(+T?yI+sL$?r-8l#8%aO%P2z||aUvT= z*!v-Du8mD_(@MVYTUNccdUbWbkZ3&Ttfj=)8Y*Tr^A%+?uWl!8pCe}VyF7;6DVx}i z$KH}5k^>s~>XkKRYc|B1?VR}Z?eOx_BdQ2gxvMJc_|`dA)@`(X z7HnS*i;v0TonT~ND8rf zj?76FooJxR&PT1I0oW<>O;nR1I=IyFad&f#dh{)N4{R$D_Y9YC~l|O8-q)fTEWig^tr)&XrD@5$(R0(PC<>34Pv51PBGj2$vEYxt+JxQ zWI<=B85Fh5Ji|F>Ylx>U7oxGH+P^L}9T=edQ1M2-EpH4WZW^({W@~q9N2S0y#0D9$ zsoRCHk{zk)IC(Y=6mEZ~nf$FaVv_6r0?vgP73WNd6-BDd-OM1;`=}huFPO*l3-@eh zXRuhS?d^B^$?Q|z-kYkdjtwj})$)CIJ{}&8sE^y*gN#{Y3@xUP3^7kEyKm{Qfc0C- z)>T#BQ^8rtZW2{|z28Vj98TN%vno#Gb^40_(Vdoid04;i^D`E(m&ob?T1)hc?vXO? z|LyWffIUu|-)xVBC@1bY#_)F!9k;zvP1z>)NsE@NwA@qeFKC%1Yxn0S4Sf}m=e5Uw zc|wst`Zs>k4L9F(!%a6%zR~Z$v1mL2PVo4mqDd1c`u#W9ztS&HlPS(jYTO2`srC0p z*MIl246|55*=sA7h}L8+viuHi;c%e8*I3gnMo&KfZO5|K{wpi1(|RTHS5~(8_N83+ zG5=1u@$IBYoNIhsu(Nh}I%Q=ww3GX*S8bs9>NYZ9l}uke-3#UV6Y*s$_x-pE82w{e z82P)Fqf8q~X^5?t2iEnE0(|ZbTe|j&r*{DCKQAvVH7%8k6WU^v!O!1)A;YZ1s^7mMA z>@oR=K8J&SA5XFKYVH5&=&MZ%+}38XcWzQ)YODN|!o=2S*m%NrR5X6J!Wv9d@*QE=~hGTD~^RpTy3U z-j3IgHx`FlSGBN{{kD?qitLKw&?^SY+?^Ci4u7d2DL9l4^%)7b+xIWVd%rNIpK8)3O^DTmlwm|Vr#zgGLuOTPLz_BQs7 z?CZR(kNu7hB|PrG#%lkJeb=?Cr4=X+jV{MhYikKFOjTssJ5ur(6}8gWIl8a+T;o5- z{nL}wO?p7}lM@*Fc=qnBCvt*A0@=aAxP+qgKzcB}NV|8&6{Q7^R8U^!LxR)}`;n3h zd*A73O$`e?(v}s>W+(R%g^6d_nYmo`H!SdV_TjYJ9|&g#tfoyI52=4V9LS88P6m6i zw$cJFR-}{<4rWj$P78Xo*G{EKzx%B8`gF=e9A9Z0%Fd`+d((b&IzQznR{Ntc`JrntLnYA@%zRvIT%8tQp$#AJO$g926 zZ)PAK*@&WMa*`Pw78n-HZEUp9frstAqm|2wpQ$aZ>-DjhbX>oZC}xLfc8!KJ?f3GF z^W)fMcMm)B#+|nO@qw(ixL|;?^Z6C>U^u{8<8btKHulB`)LP?d9|`W6=j|~a|3qRi zj@`AjC-siP#M55gBnQ3G+e%E8w#|2YLwC{EzrNO?) z<=kMWb*GR+wcj5$4h!TwK6H2X6T{f4c4#mImryh~Fqn3$)*DCb&9wL7PHfE_pv~q6 zzSou=q`jW@dXL<|Lv5M#MWgz%sN-#I=|NskjZ3fBuG*=b38}Q6G|rCH`t0$UDuqaI zloeP_%#3=geQkJ1KqZ%WYEEc}y?=C8;BH!eO3~o@j2{i6#f_rHjitpE4$$KK1GKmW zJz0U$rYv?}K5=IPed7-M+{y}!p{=LJw85-^zbz+7o8N1-e~ z=bbZB{@@%H=V!X@EAjVHOD*;u&I;xRa)ZNZy=u9>$1VT&xq16{xVS?9X&(kVFys7=52V7VxV~#rO2l)9U2~mwT02`Kgx5|JgW3f> zff80PM@v-BBK>-Dpq4fmA8D<}yQL$Z_{%i^x-DMymJm<9rN*VqjIaML^`{;*o*2Gh zUUO1CdrPmo1wHn>FX^AsEp41*p~+c&?A6O&)a$%9N^cjkGS#mo2d=lzh`!Dp-3pDb z_px90wr(p>!4BzGOc|Z@lmE!X~S}w1836pHlnj2ij}?A&twV zzjH)ubt`{uPb&`s8@(X(;3lgnGi5XSzCdh!+pmUu3v!9W31IV_{=G) zQ}FZgyP1Gofqw>{xkEM2jc6WGeSitYmH1CO*Ra=?<7b02Tzs0zjM75Xu4Bf<9ZPy`FmRUQ5^r* zZs#W#{f#ajg|Bpaxi2gISBM{ntczQyUVPzpH@ubbPa*xt2p4_>huYd>u73!hTe8)R zlD0n!pVtVgDFbUTK98E}y8`yT!1wXJdyV_B;US20k8mr;KXrBVY(SPP*Rv1Qfvt0v z@*L^Pb#Ex1a?!oOMa12Mj(1=1r|9T-3+4T;E2sXfCtUf9`0l-Jq&)uv=D+=?d9Qao z-YIum&OQBz{ENnMIia5ZOyih){1N%D4NmEL`j?F3j|`n}81i2k$L||D(M5>2GFe*} zxmV%dop3f3jo!j=#rJS=+*bA0$}WTUU@UX5fnG*$2VQoSdFzcuH|tt-zl+7u#fTeV z2%M`KGQhZ`8R2nOQ`)dQW+@iQP@Q?%GMaNqmByx(Th@9PmK}+9bBjv)I*3c2)eJ(Lwe;>x6s1;`9E> z%Bm{av2bP8L`Tw}<3Vhv+u=n9FNWjOjYa;-%D5P~G6FAK|L%liGQmgSFw>64knMkd z4c!69K+3jbI^FzXpf4kk(T_3RW^B)f zgOzh}C}HH>j=aklza7Jv|BKvUab-*Mp!(vD5aj1yZQ%cLp*;;+KG%3BsYI~u&NP3l|H!_{nV_Ng<-eJMvf&cj97uqgQanRnl z&%U+VO*8bT2vc#!Urx7sm6y*gBj<*G@<9J|2ifWV!yla-7KcVn=bF@|EZTxf=~yK8 zH;Dbs`-vTC3m^BaIi$M&*2>}$eVrfltZ5L(x61wF{qB1Hov5tHll_iZ#a!ol{nFr1 z0_jd(2M3FaY^K#kq&a!O{8##}??*i<*Bkzr8%$+YUQGY6yXV1K zsdnz#7I|f}kGOAK7WW%HxxvBpzE6r$RTj@jwEqt6wf(fId9Kc=Ew3V$otw%8Vm%Ov z^%Swbep#$yH`eSP$|E&5s5qsOIDb!^#h1mgu5eQNQjb&OD$i>#4dF^;yn78KohyAq z?5mdXTr1O6%Mqv2S%sCZ%rJ^k9{X-v^s5{-GIO=^iB) z!R7sH=8bOE%)0X#Tf7H#|9r~Z+d+i)-p0wrq`de^O9VcK)+ZF-dTP} z+u&deddaqANd0#!9s4q|uej2|DO`VXj{7=;-CUszDxW*c)mP+kW)@fa3awMu(b9`6 z;|k+jojxQ9##bnnofVlSJIjX?sj+)sHKFw4-U=xr}J7;p0pgeAbblk2=IvpvpOx zuO#Pj?c+;t9`VLFfilMeWzLM<6&GeJp^mYAO=@%B|^h^KsOR_2|ji%pn z$t(G(BfOFyM`?XKW)|_&OVN^_LCLEIYk#g<&nX=Kd#C2Qv%UB?5&!m>_}@3;k9apd zIJqcW7FIe}|F&b@{Gu#FviZ^%?bhNe%=m-O14p~Bvl7iJSCjKUV*8Fr+H*_MmW}}wTvYg5+5tgsR za;BhvUVde>e2puW#T9Xd#hi&-ixRHs>um1FQyAg-Hav$e<9XWVx!JZx@#|ya&*`|Z z(JPZ(#ILw4{)2Y>E2x!Ghl)d7_GsS{)|_@u$8(XGFA#G5d*;V-^ExK>le`}O zD3B0{e>`rt?}=*<^>vQx%Ha2lq^i4CH&-T%P_9lD@0>CDblM@Se)@R(?$Tc0giPvU zxUHSjmDXSdXA~%AMpr_8{9YZUcKPaGs?bqFS7L*Ft4k^LT$F~6!WR=8u051Pum3+6 z!xdJ2s?S#<`9~MIrdMPIj(s5XpBEMP{Kd3GnOq}0+n0DK2mkH9c^wt*tXJi6i(MX; ze=1iHng3sO%Hy|<^CB~T-Pt1lc7B}uTyu9T=LvQlj9KN?-pe=4?KoNqiuA?LT%3pn zPhY%>-={7nFsHOWOSn(6AG#?2K7|D?W*wSj-)$=*Pv5SG4CQ*ia*Kp z$*S9JyJz&%odU0;dt*dbH8C!N`Z^1V^A2q(o;I4c$Sa>V%IBZ@jl0b7+!;p(anz>I z%<%NzML+mevpl=Q%J0Rntm_ER>)7wE7gUdPsYl#g)`z zje+JqksL^RJaKn2<*O^u&fT5lU@<7!wq=29%k)tE$a$exV{CcRw&iEGEsf!1qi!2q z23>sFSBMPJRWUv3&RPtqy*J}SoQC;w&o;P(`i9pM$>5(W5OvMaZeRnqOJG~c4-yFun&u{XWHy)p@YIncAHMN z%QeABqqnoC&q<@VGu)>%az^xa{!brw7wq=h+xg#p$+WsWyVdP+&(`UoTPU%m^C{d7*4~-5c8)dpn=z?y~yWpU3vGq4REgiuAFe)_#)L!xsWW1I%M~XFidLg%9*) z1$#U1@5|wys;^`R_b#G$>T&|3-_1W1&%HQbk;7LFE}MHg8GEg3zMG#?k{S@l zUvZB-J~-s@9Oel__EwGT?Of28e<+7BJEbI(-dA&u-p-P~<_hl9l?(~Q`+GZY?MsQ= z$8+xR<^(=!OQ}yhTV zxpPLzX-S6IVa%^T$&3?D?i*ckoE!EBIbJ!Kl>p%A9+xGuMZ#1WK?40f;MET6I z^Z7)tlh42HRoc7kSZdebapQlBJm%PWOeBvv*YtL7)4lSx9PU{4ec+49WzOkv#bD-# z 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

      Bq&t)bW8HYTL{X&Y@&c}brcPdjDiz%UY7CvR{ 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

    2. n$7U6MycJWs-UotvrJyNgIdF% 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%0Ag=Y(K&miZPS9pWr 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
      *A}jc?u|*t0bAHEN;9MAI>)OWUaY_c?ngC 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

      JjS{25I+*VME5E4OdlFIWfu#FvZ2OWS$z7S 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 diff --git a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/lib/libmbedx509.a b/client/3rd/ShadowSocks/ShadowSocks/mbedtls/lib/libmbedx509.a deleted file mode 100644 index 98c956ce72a4e8751585b599a2e4c6af20fbdfc2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 267400 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 - exit 1 -fi - -libR= -case `uname -s` in - *SunOS*) - libR=" -R${exec_prefix}/lib" - ;; - *BSD*) - libR=" -Wl,-R${exec_prefix}/lib" - ;; -esac - -libS= -if test ${exec_prefix}/lib != /usr/lib ; then - libS=-L${exec_prefix}/lib -fi - -while test $# -gt 0; do - case "$1" in - -*=*) optarg=`echo "$1" | sed 's/[-_a-zA-Z0-9]*=//'` ;; - *) optarg= ;; - esac - - case $1 in - --prefix=*) - prefix=$optarg - if test $exec_prefix_set = no ; then - exec_prefix=$optarg - fi - ;; - --prefix) - echo $prefix - ;; - --exec-prefix=*) - exec_prefix=$optarg - exec_prefix_set=yes - ;; - --exec-prefix) - echo $exec_prefix - ;; - --version) - echo 8.41 - ;; - --cflags) - if test ${prefix}/include != /usr/include ; then - includes=-I${prefix}/include - fi - echo $includes -DPCRE_STATIC - ;; - --cflags-posix) - if test yes = yes ; then - if test ${prefix}/include != /usr/include ; then - includes=-I${prefix}/include - fi - echo $includes -DPCRE_STATIC - else - echo "${usage}" 1>&2 - fi - ;; - --libs-posix) - if test yes = yes ; then - echo $libS$libR -lpcreposix -lpcre - else - echo "${usage}" 1>&2 - fi - ;; - --libs) - if test yes = yes ; then - echo $libS$libR -lpcre - else - echo "${usage}" 1>&2 - fi - ;; - --libs16) - if test no = yes ; then - echo $libS$libR -lpcre16 - else - echo "${usage}" 1>&2 - fi - ;; - --libs32) - if test no = yes ; then - echo $libS$libR -lpcre32 - else - echo "${usage}" 1>&2 - fi - ;; - --libs-cpp) - if test yes = yes ; then - echo $libS$libR -lpcrecpp -lpcre - else - echo "${usage}" 1>&2 - fi - ;; - *) - echo "${usage}" 1>&2 - exit 1 - ;; - esac - shift -done diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/bin/pcregrep b/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/bin/pcregrep deleted file mode 100755 index 66ec29a73f00200452621455eb3af9eb321e3fbb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 271128 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 J*dxB<{XY*%Q0M>v diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/bin/pcretest b/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/bin/pcretest deleted file mode 100755 index d64a816f157940e881aeba8d1c14a0f712afc0e5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 320384 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 was incorrectly compiled such that - the conditional was interpreted as a reference to capturing group 1 instead - of a test for recursion. Any group whose name began with R was - misinterpreted in this way. (The reference interpretation should only - happen if the group's name is precisely "R".) - -9. A number of bugs have been mended relating to match start-up optimizations - when the first thing in a pattern is a positive lookahead. These all - applied only when PCRE_NO_START_OPTIMIZE was *not* set: - - (a) A pattern such as (?=.*X)X$ was incorrectly optimized as if it needed - both an initial 'X' and a following 'X'. - (b) Some patterns starting with an assertion that started with .* were - incorrectly optimized as having to match at the start of the subject or - after a newline. There are cases where this is not true, for example, - (?=.*[A-Z])(?=.{8,16})(?!.*[\s]) matches after the start in lines that - start with spaces. Starting .* in an assertion is no longer taken as an - indication of matching at the start (or after a newline). - - -Version 8.39 14-June-2016 -------------------------- - -1. If PCRE_AUTO_CALLOUT was set on a pattern that had a (?# comment between - an item and its qualifier (for example, A(?#comment)?B) pcre_compile() - misbehaved. This bug was found by the LLVM fuzzer. - -2. Similar to the above, if an isolated \E was present between an item and its - qualifier when PCRE_AUTO_CALLOUT was set, pcre_compile() misbehaved. This - bug was found by the LLVM fuzzer. - -3. Further to 8.38/46, negated classes such as [^[:^ascii:]\d] were also not - working correctly in UCP mode. - -4. The POSIX wrapper function regexec() crashed if the option REG_STARTEND - was set when the pmatch argument was NULL. It now returns REG_INVARG. - -5. Allow for up to 32-bit numbers in the ordin() function in pcregrep. - -6. An empty \Q\E sequence between an item and its qualifier caused - pcre_compile() to misbehave when auto callouts were enabled. This bug was - found by the LLVM fuzzer. - -7. If a pattern that was compiled with PCRE_EXTENDED started with white - space or a #-type comment that was followed by (?-x), which turns off - PCRE_EXTENDED, and there was no subsequent (?x) to turn it on again, - pcre_compile() assumed that (?-x) applied to the whole pattern and - consequently mis-compiled it. This bug was found by the LLVM fuzzer. - -8. A call of pcre_copy_named_substring() for a named substring whose number - was greater than the space in the ovector could cause a crash. - -9. Yet another buffer overflow bug involved duplicate named groups with a - group that reset capture numbers (compare 8.38/7 below). Once again, I have - just allowed for more memory, even if not needed. (A proper fix is - implemented in PCRE2, but it involves a lot of refactoring.) - -10. pcre_get_substring_list() crashed if the use of \K in a match caused the - start of the match to be earlier than the end. - -11. Migrating appropriate PCRE2 JIT improvements to PCRE. - -12. A pattern such as /(?<=((?C)0))/, which has a callout inside a lookbehind - assertion, caused pcretest to generate incorrect output, and also to read - uninitialized memory (detected by ASAN or valgrind). - -13. A pattern that included (*ACCEPT) in the middle of a sufficiently deeply - nested set of parentheses of sufficient size caused an overflow of the - compiling workspace (which was diagnosed, but of course is not desirable). - -14. And yet another buffer overflow bug involving duplicate named groups, this - time nested, with a nested back reference. Yet again, I have just allowed - for more memory, because anything more needs all the refactoring that has - been done for PCRE2. An example pattern that provoked this bug is: - /((?J)(?'R'(?'R'(?'R'(?'R'(?'R'(?|(\k'R'))))))))/ and the bug was - registered as CVE-2016-1283. - -15. pcretest went into a loop if global matching was requested with an ovector - size less than 2. It now gives an error message. This bug was found by - afl-fuzz. - -16. An invalid pattern fragment such as (?(?C)0 was not diagnosing an error - ("assertion expected") when (?(?C) was not followed by an opening - parenthesis. - -17. Fixed typo ("&&" for "&") in pcre_study(). Fortunately, this could not - actually affect anything, by sheer luck. - -18. Applied Chris Wilson's patch (Bugzilla #1681) to CMakeLists.txt for MSVC - static compilation. - -19. Modified the RunTest script to incorporate a valgrind suppressions file so - that certain errors, provoked by the SSE2 instruction set when JIT is used, - are ignored. - -20. A racing condition is fixed in JIT reported by Mozilla. - -21. Minor code refactor to avoid "array subscript is below array bounds" - compiler warning. - -22. Minor code refactor to avoid "left shift of negative number" warning. - -23. Fix typo causing compile error when 16- or 32-bit JIT is compiled without - UCP support. - -24. Refactor to avoid compiler warnings in pcrecpp.cc. - -25. Refactor to fix a typo in pcre_jit_test.c - -26. Patch to support compiling pcrecpp.cc with Intel compiler. - - -Version 8.38 23-November-2015 ------------------------------ - -1. If a group that contained a recursive back reference also contained a - forward reference subroutine call followed by a non-forward-reference - subroutine call, for example /.((?2)(?R)\1)()/, pcre_compile() failed to - compile correct code, leading to undefined behaviour or an internally - detected error. This bug was discovered by the LLVM fuzzer. - -2. Quantification of certain items (e.g. atomic back references) could cause - incorrect code to be compiled when recursive forward references were - involved. For example, in this pattern: /(?1)()((((((\1++))\x85)+)|))/. - This bug was discovered by the LLVM fuzzer. - -3. A repeated conditional group whose condition was a reference by name caused - a buffer overflow if there was more than one group with the given name. - This bug was discovered by the LLVM fuzzer. - -4. A recursive back reference by name within a group that had the same name as - another group caused a buffer overflow. For example: - /(?J)(?'d'(?'d'\g{d}))/. This bug was discovered by the LLVM fuzzer. - -5. A forward reference by name to a group whose number is the same as the - current group, for example in this pattern: /(?|(\k'Pm')|(?'Pm'))/, caused - a buffer overflow at compile time. This bug was discovered by the LLVM - fuzzer. - -6. A lookbehind assertion within a set of mutually recursive subpatterns could - provoke a buffer overflow. This bug was discovered by the LLVM fuzzer. - -7. Another buffer overflow bug involved duplicate named groups with a - reference between their definition, with a group that reset capture - numbers, for example: /(?J:(?|(?'R')(\k'R')|((?'R'))))/. This has been - fixed by always allowing for more memory, even if not needed. (A proper fix - is implemented in PCRE2, but it involves more refactoring.) - -8. There was no check for integer overflow in subroutine calls such as (?123). - -9. The table entry for \l in EBCDIC environments was incorrect, leading to its - being treated as a literal 'l' instead of causing an error. - -10. There was a buffer overflow if pcre_exec() was called with an ovector of - size 1. This bug was found by american fuzzy lop. - -11. If a non-capturing group containing a conditional group that could match - an empty string was repeated, it was not identified as matching an empty - string itself. For example: /^(?:(?(1)x|)+)+$()/. - -12. In an EBCDIC environment, pcretest was mishandling the escape sequences - \a and \e in test subject lines. - -13. In an EBCDIC environment, \a in a pattern was converted to the ASCII - instead of the EBCDIC value. - -14. The handling of \c in an EBCDIC environment has been revised so that it is - now compatible with the specification in Perl's perlebcdic page. - -15. The EBCDIC character 0x41 is a non-breaking space, equivalent to 0xa0 in - ASCII/Unicode. This has now been added to the list of characters that are - recognized as white space in EBCDIC. - -16. When PCRE was compiled without UCP support, the use of \p and \P gave an - error (correctly) when used outside a class, but did not give an error - within a class. - -17. \h within a class was incorrectly compiled in EBCDIC environments. - -18. A pattern with an unmatched closing parenthesis that contained a backward - assertion which itself contained a forward reference caused buffer - overflow. And example pattern is: /(?=di(?<=(?1))|(?=(.))))/. - -19. JIT should return with error when the compiled pattern requires more stack - space than the maximum. - -20. A possessively repeated conditional group that could match an empty string, - for example, /(?(R))*+/, was incorrectly compiled. - -21. Fix infinite recursion in the JIT compiler when certain patterns such as - /(?:|a|){100}x/ are analysed. - -22. Some patterns with character classes involving [: and \\ were incorrectly - compiled and could cause reading from uninitialized memory or an incorrect - error diagnosis. - -23. Pathological patterns containing many nested occurrences of [: caused - pcre_compile() to run for a very long time. - -24. A conditional group with only one branch has an implicit empty alternative - branch and must therefore be treated as potentially matching an empty - string. - -25. If (?R was followed by - or + incorrect behaviour happened instead of a - diagnostic. - -26. Arrange to give up on finding the minimum matching length for overly - complex patterns. - -27. Similar to (4) above: in a pattern with duplicated named groups and an - occurrence of (?| it is possible for an apparently non-recursive back - reference to become recursive if a later named group with the relevant - number is encountered. This could lead to a buffer overflow. Wen Guanxing - from Venustech ADLAB discovered this bug. - -28. If pcregrep was given the -q option with -c or -l, or when handling a - binary file, it incorrectly wrote output to stdout. - -29. The JIT compiler did not restore the control verb head in case of *THEN - control verbs. This issue was found by Karl Skomski with a custom LLVM - fuzzer. - -30. Error messages for syntax errors following \g and \k were giving inaccurate - offsets in the pattern. - -31. Added a check for integer overflow in conditions (?() and - (?(R). This omission was discovered by Karl Skomski with the LLVM - fuzzer. - -32. Handling recursive references such as (?2) when the reference is to a group - later in the pattern uses code that is very hacked about and error-prone. - It has been re-written for PCRE2. Here in PCRE1, a check has been added to - give an internal error if it is obvious that compiling has gone wrong. - -33. The JIT compiler should not check repeats after a {0,1} repeat byte code. - This issue was found by Karl Skomski with a custom LLVM fuzzer. - -34. The JIT compiler should restore the control chain for empty possessive - repeats. This issue was found by Karl Skomski with a custom LLVM fuzzer. - -35. Match limit check added to JIT recursion. This issue was found by Karl - Skomski with a custom LLVM fuzzer. - -36. Yet another case similar to 27 above has been circumvented by an - unconditional allocation of extra memory. This issue is fixed "properly" in - PCRE2 by refactoring the way references are handled. Wen Guanxing - from Venustech ADLAB discovered this bug. - -37. Fix two assertion fails in JIT. These issues were found by Karl Skomski - with a custom LLVM fuzzer. - -38. Fixed a corner case of range optimization in JIT. - -39. An incorrect error "overran compiling workspace" was given if there were - exactly enough group forward references such that the last one extended - into the workspace safety margin. The next one would have expanded the - workspace. The test for overflow was not including the safety margin. - -40. A match limit issue is fixed in JIT which was found by Karl Skomski - with a custom LLVM fuzzer. - -41. Remove the use of /dev/null in testdata/testinput2, because it doesn't - work under Windows. (Why has it taken so long for anyone to notice?) - -42. In a character class such as [\W\p{Any}] where both a negative-type escape - ("not a word character") and a property escape were present, the property - escape was being ignored. - -43. Fix crash caused by very long (*MARK) or (*THEN) names. - -44. A sequence such as [[:punct:]b] that is, a POSIX character class followed - by a single ASCII character in a class item, was incorrectly compiled in - UCP mode. The POSIX class got lost, but only if the single character - followed it. - -45. [:punct:] in UCP mode was matching some characters in the range 128-255 - that should not have been matched. - -46. If [:^ascii:] or [:^xdigit:] or [:^cntrl:] are present in a non-negated - class, all characters with code points greater than 255 are in the class. - When a Unicode property was also in the class (if PCRE_UCP is set, escapes - such as \w are turned into Unicode properties), wide characters were not - correctly handled, and could fail to match. - - -Version 8.37 28-April-2015 --------------------------- - -1. When an (*ACCEPT) is triggered inside capturing parentheses, it arranges - for those parentheses to be closed with whatever has been captured so far. - However, it was failing to mark any other groups between the hightest - capture so far and the currrent group as "unset". Thus, the ovector for - those groups contained whatever was previously there. An example is the - pattern /(x)|((*ACCEPT))/ when matched against "abcd". - -2. If an assertion condition was quantified with a minimum of zero (an odd - thing to do, but it happened), SIGSEGV or other misbehaviour could occur. - -3. If a pattern in pcretest input had the P (POSIX) modifier followed by an - unrecognized modifier, a crash could occur. - -4. An attempt to do global matching in pcretest with a zero-length ovector - caused a crash. - -5. Fixed a memory leak during matching that could occur for a subpattern - subroutine call (recursive or otherwise) if the number of captured groups - that had to be saved was greater than ten. - -6. Catch a bad opcode during auto-possessification after compiling a bad UTF - string with NO_UTF_CHECK. This is a tidyup, not a bug fix, as passing bad - UTF with NO_UTF_CHECK is documented as having an undefined outcome. - -7. A UTF pattern containing a "not" match of a non-ASCII character and a - subroutine reference could loop at compile time. Example: /[^\xff]((?1))/. - -8. When a pattern is compiled, it remembers the highest back reference so that - when matching, if the ovector is too small, extra memory can be obtained to - use instead. A conditional subpattern whose condition is a check on a - capture having happened, such as, for example in the pattern - /^(?:(a)|b)(?(1)A|B)/, is another kind of back reference, but it was not - setting the highest backreference number. This mattered only if pcre_exec() - was called with an ovector that was too small to hold the capture, and there - was no other kind of back reference (a situation which is probably quite - rare). The effect of the bug was that the condition was always treated as - FALSE when the capture could not be consulted, leading to a incorrect - behaviour by pcre_exec(). This bug has been fixed. - -9. A reference to a duplicated named group (either a back reference or a test - for being set in a conditional) that occurred in a part of the pattern where - PCRE_DUPNAMES was not set caused the amount of memory needed for the pattern - to be incorrectly calculated, leading to overwriting. - -10. A mutually recursive set of back references such as (\2)(\1) caused a - segfault at study time (while trying to find the minimum matching length). - The infinite loop is now broken (with the minimum length unset, that is, - zero). - -11. If an assertion that was used as a condition was quantified with a minimum - of zero, matching went wrong. In particular, if the whole group had - unlimited repetition and could match an empty string, a segfault was - likely. The pattern (?(?=0)?)+ is an example that caused this. Perl allows - assertions to be quantified, but not if they are being used as conditions, - so the above pattern is faulted by Perl. PCRE has now been changed so that - it also rejects such patterns. - -12. A possessive capturing group such as (a)*+ with a minimum repeat of zero - failed to allow the zero-repeat case if pcre2_exec() was called with an - ovector too small to capture the group. - -13. Fixed two bugs in pcretest that were discovered by fuzzing and reported by - Red Hat Product Security: - - (a) A crash if /K and /F were both set with the option to save the compiled - pattern. - - (b) Another crash if the option to print captured substrings in a callout - was combined with setting a null ovector, for example \O\C+ as a subject - string. - -14. A pattern such as "((?2){0,1999}())?", which has a group containing a - forward reference repeated a large (but limited) number of times within a - repeated outer group that has a zero minimum quantifier, caused incorrect - code to be compiled, leading to the error "internal error: - previously-checked referenced subpattern not found" when an incorrect - memory address was read. This bug was reported as "heap overflow", - discovered by Kai Lu of Fortinet's FortiGuard Labs and given the CVE number - CVE-2015-2325. - -23. A pattern such as "((?+1)(\1))/" containing a forward reference subroutine - call within a group that also contained a recursive back reference caused - incorrect code to be compiled. This bug was reported as "heap overflow", - discovered by Kai Lu of Fortinet's FortiGuard Labs, and given the CVE - number CVE-2015-2326. - -24. Computing the size of the JIT read-only data in advance has been a source - of various issues, and new ones are still appear unfortunately. To fix - existing and future issues, size computation is eliminated from the code, - and replaced by on-demand memory allocation. - -25. A pattern such as /(?i)[A-`]/, where characters in the other case are - adjacent to the end of the range, and the range contained characters with - more than one other case, caused incorrect behaviour when compiled in UTF - mode. In that example, the range a-j was left out of the class. - -26. Fix JIT compilation of conditional blocks, which assertion - is converted to (*FAIL). E.g: /(?(?!))/. - -27. The pattern /(?(?!)^)/ caused references to random memory. This bug was - discovered by the LLVM fuzzer. - -28. The assertion (?!) is optimized to (*FAIL). This was not handled correctly - when this assertion was used as a condition, for example (?(?!)a|b). In - pcre2_match() it worked by luck; in pcre2_dfa_match() it gave an incorrect - error about an unsupported item. - -29. For some types of pattern, for example /Z*(|d*){216}/, the auto- - possessification code could take exponential time to complete. A recursion - depth limit of 1000 has been imposed to limit the resources used by this - optimization. - -30. A pattern such as /(*UTF)[\S\V\H]/, which contains a negated special class - such as \S in non-UCP mode, explicit wide characters (> 255) can be ignored - because \S ensures they are all in the class. The code for doing this was - interacting badly with the code for computing the amount of space needed to - compile the pattern, leading to a buffer overflow. This bug was discovered - by the LLVM fuzzer. - -31. A pattern such as /((?2)+)((?1))/ which has mutual recursion nested inside - other kinds of group caused stack overflow at compile time. This bug was - discovered by the LLVM fuzzer. - -32. A pattern such as /(?1)(?#?'){8}(a)/ which had a parenthesized comment - between a subroutine call and its quantifier was incorrectly compiled, - leading to buffer overflow or other errors. This bug was discovered by the - LLVM fuzzer. - -33. The illegal pattern /(?(?.*!.*)?)/ was not being diagnosed as missing an - assertion after (?(. The code was failing to check the character after - (?(?< for the ! or = that would indicate a lookbehind assertion. This bug - was discovered by the LLVM fuzzer. - -34. A pattern such as /X((?2)()*+){2}+/ which has a possessive quantifier with - a fixed maximum following a group that contains a subroutine reference was - incorrectly compiled and could trigger buffer overflow. This bug was - discovered by the LLVM fuzzer. - -35. A mutual recursion within a lookbehind assertion such as (?<=((?2))((?1))) - caused a stack overflow instead of the diagnosis of a non-fixed length - lookbehind assertion. This bug was discovered by the LLVM fuzzer. - -36. The use of \K in a positive lookbehind assertion in a non-anchored pattern - (e.g. /(?<=\Ka)/) could make pcregrep loop. - -37. There was a similar problem to 36 in pcretest for global matches. - -38. If a greedy quantified \X was preceded by \C in UTF mode (e.g. \C\X*), - and a subsequent item in the pattern caused a non-match, backtracking over - the repeated \X did not stop, but carried on past the start of the subject, - causing reference to random memory and/or a segfault. There were also some - other cases where backtracking after \C could crash. This set of bugs was - discovered by the LLVM fuzzer. - -39. The function for finding the minimum length of a matching string could take - a very long time if mutual recursion was present many times in a pattern, - for example, /((?2){73}(?2))((?1))/. A better mutual recursion detection - method has been implemented. This infelicity was discovered by the LLVM - fuzzer. - -40. Static linking against the PCRE library using the pkg-config module was - failing on missing pthread symbols. - - -Version 8.36 26-September-2014 ------------------------------- - -1. Got rid of some compiler warnings in the C++ modules that were shown up by - -Wmissing-field-initializers and -Wunused-parameter. - -2. The tests for quantifiers being too big (greater than 65535) were being - applied after reading the number, and stupidly assuming that integer - overflow would give a negative number. The tests are now applied as the - numbers are read. - -3. Tidy code in pcre_exec.c where two branches that used to be different are - now the same. - -4. The JIT compiler did not generate match limit checks for certain - bracketed expressions with quantifiers. This may lead to exponential - backtracking, instead of returning with PCRE_ERROR_MATCHLIMIT. This - issue should be resolved now. - -5. Fixed an issue, which occures when nested alternatives are optimized - with table jumps. - -6. Inserted two casts and changed some ints to size_t in the light of some - reported 64-bit compiler warnings (Bugzilla 1477). - -7. Fixed a bug concerned with zero-minimum possessive groups that could match - an empty string, which sometimes were behaving incorrectly in the - interpreter (though correctly in the JIT matcher). This pcretest input is - an example: - - '\A(?:[^"]++|"(?:[^"]*+|"")*+")++' - NON QUOTED "QUOT""ED" AFTER "NOT MATCHED - - the interpreter was reporting a match of 'NON QUOTED ' only, whereas the - JIT matcher and Perl both matched 'NON QUOTED "QUOT""ED" AFTER '. The test - for an empty string was breaking the inner loop and carrying on at a lower - level, when possessive repeated groups should always return to a higher - level as they have no backtrack points in them. The empty string test now - occurs at the outer level. - -8. Fixed a bug that was incorrectly auto-possessifying \w+ in the pattern - ^\w+(?>\s*)(?<=\w) which caused it not to match "test test". - -9. Give a compile-time error for \o{} (as Perl does) and for \x{} (which Perl - doesn't). - -10. Change 8.34/15 introduced a bug that caused the amount of memory needed - to hold a pattern to be incorrectly computed (too small) when there were - named back references to duplicated names. This could cause "internal - error: code overflow" or "double free or corruption" or other memory - handling errors. - -11. When named subpatterns had the same prefixes, back references could be - confused. For example, in this pattern: - - /(?Pa)?(?Pb)?(?()c|d)*l/ - - the reference to 'Name' was incorrectly treated as a reference to a - duplicate name. - -12. A pattern such as /^s?c/mi8 where the optional character has more than - one "other case" was incorrectly compiled such that it would only try to - match starting at "c". - -13. When a pattern starting with \s was studied, VT was not included in the - list of possible starting characters; this should have been part of the - 8.34/18 patch. - -14. If a character class started [\Qx]... where x is any character, the class - was incorrectly terminated at the ]. - -15. If a pattern that started with a caseless match for a character with more - than one "other case" was studied, PCRE did not set up the starting code - unit bit map for the list of possible characters. Now it does. This is an - optimization improvement, not a bug fix. - -16. The Unicode data tables have been updated to Unicode 7.0.0. - -17. Fixed a number of memory leaks in pcregrep. - -18. Avoid a compiler warning (from some compilers) for a function call with - a cast that removes "const" from an lvalue by using an intermediate - variable (to which the compiler does not object). - -19. Incorrect code was compiled if a group that contained an internal recursive - back reference was optional (had quantifier with a minimum of zero). This - example compiled incorrect code: /(((a\2)|(a*)\g<-1>))*/ and other examples - caused segmentation faults because of stack overflows at compile time. - -20. A pattern such as /((?(R)a|(?1)))+/, which contains a recursion within a - group that is quantified with an indefinite repeat, caused a compile-time - loop which used up all the system stack and provoked a segmentation fault. - This was not the same bug as 19 above. - -21. Add PCRECPP_EXP_DECL declaration to operator<< in pcre_stringpiece.h. - Patch by Mike Frysinger. - - -Version 8.35 04-April-2014 --------------------------- - -1. A new flag is set, when property checks are present in an XCLASS. - When this flag is not set, PCRE can perform certain optimizations - such as studying these XCLASS-es. - -2. The auto-possessification of character sets were improved: a normal - and an extended character set can be compared now. Furthermore - the JIT compiler optimizes more character set checks. - -3. Got rid of some compiler warnings for potentially uninitialized variables - that show up only when compiled with -O2. - -4. A pattern such as (?=ab\K) that uses \K in an assertion can set the start - of a match later then the end of the match. The pcretest program was not - handling the case sensibly - it was outputting from the start to the next - binary zero. It now reports this situation in a message, and outputs the - text from the end to the start. - -5. Fast forward search is improved in JIT. Instead of the first three - characters, any three characters with fixed position can be searched. - Search order: first, last, middle. - -6. Improve character range checks in JIT. Characters are read by an inprecise - function now, which returns with an unknown value if the character code is - above a certain threshold (e.g: 256). The only limitation is that the value - must be bigger than the threshold as well. This function is useful when - the characters above the threshold are handled in the same way. - -7. The macros whose names start with RAWUCHAR are placeholders for a future - mode in which only the bottom 21 bits of 32-bit data items are used. To - make this more memorable for those maintaining the code, the names have - been changed to start with UCHAR21, and an extensive comment has been added - to their definition. - -8. Add missing (new) files sljitNativeTILEGX.c and sljitNativeTILEGX-encoder.c - to the export list in Makefile.am (they were accidentally omitted from the - 8.34 tarball). - -9. The informational output from pcretest used the phrase "starting byte set" - which is inappropriate for the 16-bit and 32-bit libraries. As the output - for "first char" and "need char" really means "non-UTF-char", I've changed - "byte" to "char", and slightly reworded the output. The documentation about - these values has also been (I hope) clarified. - -10. Another JIT related optimization: use table jumps for selecting the correct - backtracking path, when more than four alternatives are present inside a - bracket. - -11. Empty match is not possible, when the minimum length is greater than zero, - and there is no \K in the pattern. JIT should avoid empty match checks in - such cases. - -12. In a caseless character class with UCP support, when a character with more - than one alternative case was not the first character of a range, not all - the alternative cases were added to the class. For example, s and \x{17f} - are both alternative cases for S: the class [RST] was handled correctly, - but [R-T] was not. - -13. The configure.ac file always checked for pthread support when JIT was - enabled. This is not used in Windows, so I have put this test inside a - check for the presence of windows.h (which was already tested for). - -14. Improve pattern prefix search by a simplified Boyer-Moore algorithm in JIT. - The algorithm provides a way to skip certain starting offsets, and usually - faster than linear prefix searches. - -15. Change 13 for 8.20 updated RunTest to check for the 'fr' locale as well - as for 'fr_FR' and 'french'. For some reason, however, it then used the - Windows-specific input and output files, which have 'french' screwed in. - So this could never have worked. One of the problems with locales is that - they aren't always the same. I have now updated RunTest so that it checks - the output of the locale test (test 3) against three different output - files, and it allows the test to pass if any one of them matches. With luck - this should make the test pass on some versions of Solaris where it was - failing. Because of the uncertainty, the script did not used to stop if - test 3 failed; it now does. If further versions of a French locale ever - come to light, they can now easily be added. - -16. If --with-pcregrep-bufsize was given a non-integer value such as "50K", - there was a message during ./configure, but it did not stop. This now - provokes an error. The invalid example in README has been corrected. - If a value less than the minimum is given, the minimum value has always - been used, but now a warning is given. - -17. If --enable-bsr-anycrlf was set, the special 16/32-bit test failed. This - was a bug in the test system, which is now fixed. Also, the list of various - configurations that are tested for each release did not have one with both - 16/32 bits and --enable-bar-anycrlf. It now does. - -18. pcretest was missing "-C bsr" for displaying the \R default setting. - -19. Little endian PowerPC systems are supported now by the JIT compiler. - -20. The fast forward newline mechanism could enter to an infinite loop on - certain invalid UTF-8 input. Although we don't support these cases - this issue can be fixed by a performance optimization. - -21. Change 33 of 8.34 is not sufficient to ensure stack safety because it does - not take account if existing stack usage. There is now a new global - variable called pcre_stack_guard that can be set to point to an external - function to check stack availability. It is called at the start of - processing every parenthesized group. - -22. A typo in the code meant that in ungreedy mode the max/min qualifier - behaved like a min-possessive qualifier, and, for example, /a{1,3}b/U did - not match "ab". - -23. When UTF was disabled, the JIT program reported some incorrect compile - errors. These messages are silenced now. - -24. Experimental support for ARM-64 and MIPS-64 has been added to the JIT - compiler. - -25. Change all the temporary files used in RunGrepTest to be different to those - used by RunTest so that the tests can be run simultaneously, for example by - "make -j check". - - -Version 8.34 15-December-2013 ------------------------------ - -1. Add pcre[16|32]_jit_free_unused_memory to forcibly free unused JIT - executable memory. Patch inspired by Carsten Klein. - -2. ./configure --enable-coverage defined SUPPORT_GCOV in config.h, although - this macro is never tested and has no effect, because the work to support - coverage involves only compiling and linking options and special targets in - the Makefile. The comment in config.h implied that defining the macro would - enable coverage support, which is totally false. There was also support for - setting this macro in the CMake files (my fault, I just copied it from - configure). SUPPORT_GCOV has now been removed. - -3. Make a small performance improvement in strlen16() and strlen32() in - pcretest. - -4. Change 36 for 8.33 left some unreachable statements in pcre_exec.c, - detected by the Solaris compiler (gcc doesn't seem to be able to diagnose - these cases). There was also one in pcretest.c. - -5. Cleaned up a "may be uninitialized" compiler warning in pcre_exec.c. - -6. In UTF mode, the code for checking whether a group could match an empty - string (which is used for indefinitely repeated groups to allow for - breaking an infinite loop) was broken when the group contained a repeated - negated single-character class with a character that occupied more than one - data item and had a minimum repetition of zero (for example, [^\x{100}]* in - UTF-8 mode). The effect was undefined: the group might or might not be - deemed as matching an empty string, or the program might have crashed. - -7. The code for checking whether a group could match an empty string was not - recognizing that \h, \H, \v, \V, and \R must match a character. - -8. Implemented PCRE_INFO_MATCH_EMPTY, which yields 1 if the pattern can match - an empty string. If it can, pcretest shows this in its information output. - -9. Fixed two related bugs that applied to Unicode extended grapheme clusters - that were repeated with a maximizing qualifier (e.g. \X* or \X{2,5}) when - matched by pcre_exec() without using JIT: - - (a) If the rest of the pattern did not match after a maximal run of - grapheme clusters, the code for backing up to try with fewer of them - did not always back up over a full grapheme when characters that do not - have the modifier quality were involved, e.g. Hangul syllables. - - (b) If the match point in a subject started with modifier character, and - there was no match, the code could incorrectly back up beyond the match - point, and potentially beyond the first character in the subject, - leading to a segfault or an incorrect match result. - -10. A conditional group with an assertion condition could lead to PCRE - recording an incorrect first data item for a match if no other first data - item was recorded. For example, the pattern (?(?=ab)ab) recorded "a" as a - first data item, and therefore matched "ca" after "c" instead of at the - start. - -11. Change 40 for 8.33 (allowing pcregrep to find empty strings) showed up a - bug that caused the command "echo a | ./pcregrep -M '|a'" to loop. - -12. The source of pcregrep now includes z/OS-specific code so that it can be - compiled for z/OS as part of the special z/OS distribution. - -13. Added the -T and -TM options to pcretest. - -14. The code in pcre_compile.c for creating the table of named capturing groups - has been refactored. Instead of creating the table dynamically during the - actual compiling pass, the information is remembered during the pre-compile - pass (on the stack unless there are more than 20 named groups, in which - case malloc() is used) and the whole table is created before the actual - compile happens. This has simplified the code (it is now nearly 150 lines - shorter) and prepared the way for better handling of references to groups - with duplicate names. - -15. A back reference to a named subpattern when there is more than one of the - same name now checks them in the order in which they appear in the pattern. - The first one that is set is used for the reference. Previously only the - first one was inspected. This change makes PCRE more compatible with Perl. - -16. Unicode character properties were updated from Unicode 6.3.0. - -17. The compile-time code for auto-possessification has been refactored, based - on a patch by Zoltan Herczeg. It now happens after instead of during - compilation. The code is cleaner, and more cases are handled. The option - PCRE_NO_AUTO_POSSESS is added for testing purposes, and the -O and /O - options in pcretest are provided to set it. It can also be set by - (*NO_AUTO_POSSESS) at the start of a pattern. - -18. The character VT has been added to the default ("C" locale) set of - characters that match \s and are generally treated as white space, - following this same change in Perl 5.18. There is now no difference between - "Perl space" and "POSIX space". Whether VT is treated as white space in - other locales depends on the locale. - -19. The code for checking named groups as conditions, either for being set or - for being recursed, has been refactored (this is related to 14 and 15 - above). Processing unduplicated named groups should now be as fast at - numerical groups, and processing duplicated groups should be faster than - before. - -20. Two patches to the CMake build system, by Alexander Barkov: - - (1) Replace the "source" command by "." in CMakeLists.txt because - "source" is a bash-ism. - - (2) Add missing HAVE_STDINT_H and HAVE_INTTYPES_H to config-cmake.h.in; - without these the CMake build does not work on Solaris. - -21. Perl has changed its handling of \8 and \9. If there is no previously - encountered capturing group of those numbers, they are treated as the - literal characters 8 and 9 instead of a binary zero followed by the - literals. PCRE now does the same. - -22. Following Perl, added \o{} to specify codepoints in octal, making it - possible to specify values greater than 0777 and also making them - unambiguous. - -23. Perl now gives an error for missing closing braces after \x{... instead of - treating the string as literal. PCRE now does the same. - -24. RunTest used to grumble if an inappropriate test was selected explicitly, - but just skip it when running all tests. This make it awkward to run ranges - of tests when one of them was inappropriate. Now it just skips any - inappropriate tests, as it always did when running all tests. - -25. If PCRE_AUTO_CALLOUT and PCRE_UCP were set for a pattern that contained - character types such as \d or \w, too many callouts were inserted, and the - data that they returned was rubbish. - -26. In UCP mode, \s was not matching two of the characters that Perl matches, - namely NEL (U+0085) and MONGOLIAN VOWEL SEPARATOR (U+180E), though they - were matched by \h. The code has now been refactored so that the lists of - the horizontal and vertical whitespace characters used for \h and \v (which - are defined only in one place) are now also used for \s. - -27. Add JIT support for the 64 bit TileGX architecture. - Patch by Jiong Wang (Tilera Corporation). - -28. Possessive quantifiers for classes (both explicit and automatically - generated) now use special opcodes instead of wrapping in ONCE brackets. - -29. Whereas an item such as A{4}+ ignored the possessivenes of the quantifier - (because it's meaningless), this was not happening when PCRE_CASELESS was - set. Not wrong, but inefficient. - -30. Updated perltest.pl to add /u (force Unicode mode) when /W (use Unicode - properties for \w, \d, etc) is present in a test regex. Otherwise if the - test contains no characters greater than 255, Perl doesn't realise it - should be using Unicode semantics. - -31. Upgraded the handling of the POSIX classes [:graph:], [:print:], and - [:punct:] when PCRE_UCP is set so as to include the same characters as Perl - does in Unicode mode. - -32. Added the "forbid" facility to pcretest so that putting tests into the - wrong test files can sometimes be quickly detected. - -33. There is now a limit (default 250) on the depth of nesting of parentheses. - This limit is imposed to control the amount of system stack used at compile - time. It can be changed at build time by --with-parens-nest-limit=xxx or - the equivalent in CMake. - -34. Character classes such as [A-\d] or [a-[:digit:]] now cause compile-time - errors. Perl warns for these when in warning mode, but PCRE has no facility - for giving warnings. - -35. Change 34 for 8.13 allowed quantifiers on assertions, because Perl does. - However, this was not working for (?!) because it is optimized to (*FAIL), - for which PCRE does not allow quantifiers. The optimization is now disabled - when a quantifier follows (?!). I can't see any use for this, but it makes - things uniform. - -36. Perl no longer allows group names to start with digits, so I have made this - change also in PCRE. It simplifies the code a bit. - -37. In extended mode, Perl ignores spaces before a + that indicates a - possessive quantifier. PCRE allowed a space before the quantifier, but not - before the possessive +. It now does. - -38. The use of \K (reset reported match start) within a repeated possessive - group such as (a\Kb)*+ was not working. - -40. Document that the same character tables must be used at compile time and - run time, and that the facility to pass tables to pcre_exec() and - pcre_dfa_exec() is for use only with saved/restored patterns. - -41. Applied Jeff Trawick's patch CMakeLists.txt, which "provides two new - features for Builds with MSVC: - - 1. Support pcre.rc and/or pcreposix.rc (as is already done for MinGW - builds). The .rc files can be used to set FileDescription and many other - attributes. - - 2. Add an option (-DINSTALL_MSVC_PDB) to enable installation of .pdb files. - This allows higher-level build scripts which want .pdb files to avoid - hard-coding the exact files needed." - -42. Added support for [[:<:]] and [[:>:]] as used in the BSD POSIX library to - mean "start of word" and "end of word", respectively, as a transition aid. - -43. A minimizing repeat of a class containing codepoints greater than 255 in - non-UTF 16-bit or 32-bit modes caused an internal error when PCRE was - compiled to use the heap for recursion. - -44. Got rid of some compiler warnings for unused variables when UTF but not UCP - is configured. - - -Version 8.33 28-May-2013 ------------------------- - -1. Added 'U' to some constants that are compared to unsigned integers, to - avoid compiler signed/unsigned warnings. Added (int) casts to unsigned - variables that are added to signed variables, to ensure the result is - signed and can be negated. - -2. Applied patch by Daniel Richard G for quashing MSVC warnings to the - CMake config files. - -3. Revise the creation of config.h.generic so that all boolean macros are - #undefined, whereas non-boolean macros are #ifndef/#endif-ed. This makes - overriding via -D on the command line possible. - -4. Changing the definition of the variable "op" in pcre_exec.c from pcre_uchar - to unsigned int is reported to make a quite noticeable speed difference in - a specific Windows environment. Testing on Linux did also appear to show - some benefit (and it is clearly not harmful). Also fixed the definition of - Xop which should be unsigned. - -5. Related to (4), changing the definition of the intermediate variable cc - in repeated character loops from pcre_uchar to pcre_uint32 also gave speed - improvements. - -6. Fix forward search in JIT when link size is 3 or greater. Also removed some - unnecessary spaces. - -7. Adjust autogen.sh and configure.ac to lose warnings given by automake 1.12 - and later. - -8. Fix two buffer over read issues in 16 and 32 bit modes. Affects JIT only. - -9. Optimizing fast_forward_start_bits in JIT. - -10. Adding support for callouts in JIT, and fixing some issues revealed - during this work. Namely: - - (a) Unoptimized capturing brackets incorrectly reset on backtrack. - - (b) Minimum length was not checked before the matching is started. - -11. The value of capture_last that is passed to callouts was incorrect in some - cases when there was a capture on one path that was subsequently abandoned - after a backtrack. Also, the capture_last value is now reset after a - recursion, since all captures are also reset in this case. - -12. The interpreter no longer returns the "too many substrings" error in the - case when an overflowing capture is in a branch that is subsequently - abandoned after a backtrack. - -13. In the pathological case when an offset vector of size 2 is used, pcretest - now prints out the matched string after a yield of 0 or 1. - -14. Inlining subpatterns in recursions, when certain conditions are fulfilled. - Only supported by the JIT compiler at the moment. - -15. JIT compiler now supports 32 bit Macs thanks to Lawrence Velazquez. - -16. Partial matches now set offsets[2] to the "bumpalong" value, that is, the - offset of the starting point of the matching process, provided the offsets - vector is large enough. - -17. The \A escape now records a lookbehind value of 1, though its execution - does not actually inspect the previous character. This is to ensure that, - in partial multi-segment matching, at least one character from the old - segment is retained when a new segment is processed. Otherwise, if there - are no lookbehinds in the pattern, \A might match incorrectly at the start - of a new segment. - -18. Added some #ifdef __VMS code into pcretest.c to help VMS implementations. - -19. Redefined some pcre_uchar variables in pcre_exec.c as pcre_uint32; this - gives some modest performance improvement in 8-bit mode. - -20. Added the PCRE-specific property \p{Xuc} for matching characters that can - be expressed in certain programming languages using Universal Character - Names. - -21. Unicode validation has been updated in the light of Unicode Corrigendum #9, - which points out that "non characters" are not "characters that may not - appear in Unicode strings" but rather "characters that are reserved for - internal use and have only local meaning". - -22. When a pattern was compiled with automatic callouts (PCRE_AUTO_CALLOUT) and - there was a conditional group that depended on an assertion, if the - assertion was false, the callout that immediately followed the alternation - in the condition was skipped when pcre_exec() was used for matching. - -23. Allow an explicit callout to be inserted before an assertion that is the - condition for a conditional group, for compatibility with automatic - callouts, which always insert a callout at this point. - -24. In 8.31, (*COMMIT) was confined to within a recursive subpattern. Perl also - confines (*SKIP) and (*PRUNE) in the same way, and this has now been done. - -25. (*PRUNE) is now supported by the JIT compiler. - -26. Fix infinite loop when /(?<=(*SKIP)ac)a/ is matched against aa. - -27. Fix the case where there are two or more SKIPs with arguments that may be - ignored. - -28. (*SKIP) is now supported by the JIT compiler. - -29. (*THEN) is now supported by the JIT compiler. - -30. Update RunTest with additional test selector options. - -31. The way PCRE handles backtracking verbs has been changed in two ways. - - (1) Previously, in something like (*COMMIT)(*SKIP), COMMIT would override - SKIP. Now, PCRE acts on whichever backtracking verb is reached first by - backtracking. In some cases this makes it more Perl-compatible, but Perl's - rather obscure rules do not always do the same thing. - - (2) Previously, backtracking verbs were confined within assertions. This is - no longer the case for positive assertions, except for (*ACCEPT). Again, - this sometimes improves Perl compatibility, and sometimes does not. - -32. A number of tests that were in test 2 because Perl did things differently - have been moved to test 1, because either Perl or PCRE has changed, and - these tests are now compatible. - -32. Backtracking control verbs are now handled in the same way in JIT and - interpreter. - -33. An opening parenthesis in a MARK/PRUNE/SKIP/THEN name in a pattern that - contained a forward subroutine reference caused a compile error. - -34. Auto-detect and optimize limited repetitions in JIT. - -35. Implement PCRE_NEVER_UTF to lock out the use of UTF, in particular, - blocking (*UTF) etc. - -36. In the interpreter, maximizing pattern repetitions for characters and - character types now use tail recursion, which reduces stack usage. - -37. The value of the max lookbehind was not correctly preserved if a compiled - and saved regex was reloaded on a host of different endianness. - -38. Implemented (*LIMIT_MATCH) and (*LIMIT_RECURSION). As part of the extension - of the compiled pattern block, expand the flags field from 16 to 32 bits - because it was almost full. - -39. Try madvise first before posix_madvise. - -40. Change 7 for PCRE 7.9 made it impossible for pcregrep to find empty lines - with a pattern such as ^$. It has taken 4 years for anybody to notice! The - original change locked out all matches of empty strings. This has been - changed so that one match of an empty string per line is recognized. - Subsequent searches on the same line (for colouring or for --only-matching, - for example) do not recognize empty strings. - -41. Applied a user patch to fix a number of spelling mistakes in comments. - -42. Data lines longer than 65536 caused pcretest to crash. - -43. Clarified the data type for length and startoffset arguments for pcre_exec - and pcre_dfa_exec in the function-specific man pages, where they were - explicitly stated to be in bytes, never having been updated. I also added - some clarification to the pcreapi man page. - -44. A call to pcre_dfa_exec() with an output vector size less than 2 caused - a segmentation fault. - - -Version 8.32 30-November-2012 ------------------------------ - -1. Improved JIT compiler optimizations for first character search and single - character iterators. - -2. Supporting IBM XL C compilers for PPC architectures in the JIT compiler. - Patch by Daniel Richard G. - -3. Single character iterator optimizations in the JIT compiler. - -4. Improved JIT compiler optimizations for character ranges. - -5. Rename the "leave" variable names to "quit" to improve WinCE compatibility. - Reported by Giuseppe D'Angelo. - -6. The PCRE_STARTLINE bit, indicating that a match can occur only at the start - of a line, was being set incorrectly in cases where .* appeared inside - atomic brackets at the start of a pattern, or where there was a subsequent - *PRUNE or *SKIP. - -7. Improved instruction cache flush for POWER/PowerPC. - Patch by Daniel Richard G. - -8. Fixed a number of issues in pcregrep, making it more compatible with GNU - grep: - - (a) There is now no limit to the number of patterns to be matched. - - (b) An error is given if a pattern is too long. - - (c) Multiple uses of --exclude, --exclude-dir, --include, and --include-dir - are now supported. - - (d) --exclude-from and --include-from (multiple use) have been added. - - (e) Exclusions and inclusions now apply to all files and directories, not - just to those obtained from scanning a directory recursively. - - (f) Multiple uses of -f and --file-list are now supported. - - (g) In a Windows environment, the default for -d has been changed from - "read" (the GNU grep default) to "skip", because otherwise the presence - of a directory in the file list provokes an error. - - (h) The documentation has been revised and clarified in places. - -9. Improve the matching speed of capturing brackets. - -10. Changed the meaning of \X so that it now matches a Unicode extended - grapheme cluster. - -11. Patch by Daniel Richard G to the autoconf files to add a macro for sorting - out POSIX threads when JIT support is configured. - -12. Added support for PCRE_STUDY_EXTRA_NEEDED. - -13. In the POSIX wrapper regcomp() function, setting re_nsub field in the preg - structure could go wrong in environments where size_t is not the same size - as int. - -14. Applied user-supplied patch to pcrecpp.cc to allow PCRE_NO_UTF8_CHECK to be - set. - -15. The EBCDIC support had decayed; later updates to the code had included - explicit references to (e.g.) \x0a instead of CHAR_LF. There has been a - general tidy up of EBCDIC-related issues, and the documentation was also - not quite right. There is now a test that can be run on ASCII systems to - check some of the EBCDIC-related things (but is it not a full test). - -16. The new PCRE_STUDY_EXTRA_NEEDED option is now used by pcregrep, resulting - in a small tidy to the code. - -17. Fix JIT tests when UTF is disabled and both 8 and 16 bit mode are enabled. - -18. If the --only-matching (-o) option in pcregrep is specified multiple - times, each one causes appropriate output. For example, -o1 -o2 outputs the - substrings matched by the 1st and 2nd capturing parentheses. A separating - string can be specified by --om-separator (default empty). - -19. Improving the first n character searches. - -20. Turn case lists for horizontal and vertical white space into macros so that - they are defined only once. - -21. This set of changes together give more compatible Unicode case-folding - behaviour for characters that have more than one other case when UCP - support is available. - - (a) The Unicode property table now has offsets into a new table of sets of - three or more characters that are case-equivalent. The MultiStage2.py - script that generates these tables (the pcre_ucd.c file) now scans - CaseFolding.txt instead of UnicodeData.txt for character case - information. - - (b) The code for adding characters or ranges of characters to a character - class has been abstracted into a generalized function that also handles - case-independence. In UTF-mode with UCP support, this uses the new data - to handle characters with more than one other case. - - (c) A bug that is fixed as a result of (b) is that codepoints less than 256 - whose other case is greater than 256 are now correctly matched - caselessly. Previously, the high codepoint matched the low one, but not - vice versa. - - (d) The processing of \h, \H, \v, and \ in character classes now makes use - of the new class addition function, using character lists defined as - macros alongside the case definitions of 20 above. - - (e) Caseless back references now work with characters that have more than - one other case. - - (f) General caseless matching of characters with more than one other case - is supported. - -22. Unicode character properties were updated from Unicode 6.2.0 - -23. Improved CMake support under Windows. Patch by Daniel Richard G. - -24. Add support for 32-bit character strings, and UTF-32 - -25. Major JIT compiler update (code refactoring and bugfixing). - Experimental Sparc 32 support is added. - -26. Applied a modified version of Daniel Richard G's patch to create - pcre.h.generic and config.h.generic by "make" instead of in the - PrepareRelease script. - -27. Added a definition for CHAR_NULL (helpful for the z/OS port), and use it in - pcre_compile.c when checking for a zero character. - -28. Introducing a native interface for JIT. Through this interface, the compiled - machine code can be directly executed. The purpose of this interface is to - provide fast pattern matching, so several sanity checks are not performed. - However, feature tests are still performed. The new interface provides - 1.4x speedup compared to the old one. - -29. If pcre_exec() or pcre_dfa_exec() was called with a negative value for - the subject string length, the error given was PCRE_ERROR_BADOFFSET, which - was confusing. There is now a new error PCRE_ERROR_BADLENGTH for this case. - -30. In 8-bit UTF-8 mode, pcretest failed to give an error for data codepoints - greater than 0x7fffffff (which cannot be represented in UTF-8, even under - the "old" RFC 2279). Instead, it ended up passing a negative length to - pcre_exec(). - -31. Add support for GCC's visibility feature to hide internal functions. - -32. Running "pcretest -C pcre8" or "pcretest -C pcre16" gave a spurious error - "unknown -C option" after outputting 0 or 1. - -33. There is now support for generating a code coverage report for the test - suite in environments where gcc is the compiler and lcov is installed. This - is mainly for the benefit of the developers. - -34. If PCRE is built with --enable-valgrind, certain memory regions are marked - unaddressable using valgrind annotations, allowing valgrind to detect - invalid memory accesses. This is mainly for the benefit of the developers. - -25. (*UTF) can now be used to start a pattern in any of the three libraries. - -26. Give configure error if --enable-cpp but no C++ compiler found. - - -Version 8.31 06-July-2012 -------------------------- - -1. Fixing a wrong JIT test case and some compiler warnings. - -2. Removed a bashism from the RunTest script. - -3. Add a cast to pcre_exec.c to fix the warning "unary minus operator applied - to unsigned type, result still unsigned" that was given by an MS compiler - on encountering the code "-sizeof(xxx)". - -4. Partial matching support is added to the JIT compiler. - -5. Fixed several bugs concerned with partial matching of items that consist - of more than one character: - - (a) /^(..)\1/ did not partially match "aba" because checking references was - done on an "all or nothing" basis. This also applied to repeated - references. - - (b) \R did not give a hard partial match if \r was found at the end of the - subject. - - (c) \X did not give a hard partial match after matching one or more - characters at the end of the subject. - - (d) When newline was set to CRLF, a pattern such as /a$/ did not recognize - a partial match for the string "\r". - - (e) When newline was set to CRLF, the metacharacter "." did not recognize - a partial match for a CR character at the end of the subject string. - -6. If JIT is requested using /S++ or -s++ (instead of just /S+ or -s+) when - running pcretest, the text "(JIT)" added to the output whenever JIT is - actually used to run the match. - -7. Individual JIT compile options can be set in pcretest by following -s+[+] - or /S+[+] with a digit between 1 and 7. - -8. OP_NOT now supports any UTF character not just single-byte ones. - -9. (*MARK) control verb is now supported by the JIT compiler. - -10. The command "./RunTest list" lists the available tests without actually - running any of them. (Because I keep forgetting what they all are.) - -11. Add PCRE_INFO_MAXLOOKBEHIND. - -12. Applied a (slightly modified) user-supplied patch that improves performance - when the heap is used for recursion (compiled with --disable-stack-for- - recursion). Instead of malloc and free for each heap frame each time a - logical recursion happens, frames are retained on a chain and re-used where - possible. This sometimes gives as much as 30% improvement. - -13. As documented, (*COMMIT) is now confined to within a recursive subpattern - call. - -14. As documented, (*COMMIT) is now confined to within a positive assertion. - -15. It is now possible to link pcretest with libedit as an alternative to - libreadline. - -16. (*COMMIT) control verb is now supported by the JIT compiler. - -17. The Unicode data tables have been updated to Unicode 6.1.0. - -18. Added --file-list option to pcregrep. - -19. Added binary file support to pcregrep, including the -a, --binary-files, - -I, and --text options. - -20. The madvise function is renamed for posix_madvise for QNX compatibility - reasons. Fixed by Giuseppe D'Angelo. - -21. Fixed a bug for backward assertions with REVERSE 0 in the JIT compiler. - -22. Changed the option for creating symbolic links for 16-bit man pages from - -s to -sf so that re-installing does not cause issues. - -23. Support PCRE_NO_START_OPTIMIZE in JIT as (*MARK) support requires it. - -24. Fixed a very old bug in pcretest that caused errors with restarted DFA - matches in certain environments (the workspace was not being correctly - retained). Also added to pcre_dfa_exec() a simple plausibility check on - some of the workspace data at the beginning of a restart. - -25. \s*\R was auto-possessifying the \s* when it should not, whereas \S*\R - was not doing so when it should - probably a typo introduced by SVN 528 - (change 8.10/14). - -26. When PCRE_UCP was not set, \w+\x{c4} was incorrectly auto-possessifying the - \w+ when the character tables indicated that \x{c4} was a word character. - There were several related cases, all because the tests for doing a table - lookup were testing for characters less than 127 instead of 255. - -27. If a pattern contains capturing parentheses that are not used in a match, - their slots in the ovector are set to -1. For those that are higher than - any matched groups, this happens at the end of processing. In the case when - there were back references that the ovector was too small to contain - (causing temporary malloc'd memory to be used during matching), and the - highest capturing number was not used, memory off the end of the ovector - was incorrectly being set to -1. (It was using the size of the temporary - memory instead of the true size.) - -28. To catch bugs like 27 using valgrind, when pcretest is asked to specify an - ovector size, it uses memory at the end of the block that it has got. - -29. Check for an overlong MARK name and give an error at compile time. The - limit is 255 for the 8-bit library and 65535 for the 16-bit library. - -30. JIT compiler update. - -31. JIT is now supported on jailbroken iOS devices. Thanks for Ruiger - Rill for the patch. - -32. Put spaces around SLJIT_PRINT_D in the JIT compiler. Required by CXX11. - -33. Variable renamings in the PCRE-JIT compiler. No functionality change. - -34. Fixed typos in pcregrep: in two places there was SUPPORT_LIBZ2 instead of - SUPPORT_LIBBZ2. This caused a build problem when bzip2 but not gzip (zlib) - was enabled. - -35. Improve JIT code generation for greedy plus quantifier. - -36. When /((?:a?)*)*c/ or /((?>a?)*)*c/ was matched against "aac", it set group - 1 to "aa" instead of to an empty string. The bug affected repeated groups - that could potentially match an empty string. - -37. Optimizing single character iterators in JIT. - -38. Wide characters specified with \uxxxx in JavaScript mode are now subject to - the same checks as \x{...} characters in non-JavaScript mode. Specifically, - codepoints that are too big for the mode are faulted, and in a UTF mode, - disallowed codepoints are also faulted. - -39. If PCRE was compiled with UTF support, in three places in the DFA - matcher there was code that should only have been obeyed in UTF mode, but - was being obeyed unconditionally. In 8-bit mode this could cause incorrect - processing when bytes with values greater than 127 were present. In 16-bit - mode the bug would be provoked by values in the range 0xfc00 to 0xdc00. In - both cases the values are those that cannot be the first data item in a UTF - character. The three items that might have provoked this were recursions, - possessively repeated groups, and atomic groups. - -40. Ensure that libpcre is explicitly listed in the link commands for pcretest - and pcregrep, because some OS require shared objects to be explicitly - passed to ld, causing the link step to fail if they are not. - -41. There were two incorrect #ifdefs in pcre_study.c, meaning that, in 16-bit - mode, patterns that started with \h* or \R* might be incorrectly matched. - - -Version 8.30 04-February-2012 ------------------------------ - -1. Renamed "isnumber" as "is_a_number" because in some Mac environments this - name is defined in ctype.h. - -2. Fixed a bug in fixed-length calculation for lookbehinds that would show up - only in quite long subpatterns. - -3. Removed the function pcre_info(), which has been obsolete and deprecated - since it was replaced by pcre_fullinfo() in February 2000. - -4. For a non-anchored pattern, if (*SKIP) was given with a name that did not - match a (*MARK), and the match failed at the start of the subject, a - reference to memory before the start of the subject could occur. This bug - was introduced by fix 17 of release 8.21. - -5. A reference to an unset group with zero minimum repetition was giving - totally wrong answers (in non-JavaScript-compatibility mode). For example, - /(another)?(\1?)test/ matched against "hello world test". This bug was - introduced in release 8.13. - -6. Add support for 16-bit character strings (a large amount of work involving - many changes and refactorings). - -7. RunGrepTest failed on msys because \r\n was replaced by whitespace when the - command "pattern=`printf 'xxx\r\njkl'`" was run. The pattern is now taken - from a file. - -8. Ovector size of 2 is also supported by JIT based pcre_exec (the ovector size - rounding is not applied in this particular case). - -9. The invalid Unicode surrogate codepoints U+D800 to U+DFFF are now rejected - if they appear, or are escaped, in patterns. - -10. Get rid of a number of -Wunused-but-set-variable warnings. - -11. The pattern /(?=(*:x))(q|)/ matches an empty string, and returns the mark - "x". The similar pattern /(?=(*:x))((*:y)q|)/ did not return a mark at all. - Oddly, Perl behaves the same way. PCRE has been fixed so that this pattern - also returns the mark "x". This bug applied to capturing parentheses, - non-capturing parentheses, and atomic parentheses. It also applied to some - assertions. - -12. Stephen Kelly's patch to CMakeLists.txt allows it to parse the version - information out of configure.ac instead of relying on pcre.h.generic, which - is not stored in the repository. - -13. Applied Dmitry V. Levin's patch for a more portable method for linking with - -lreadline. - -14. ZH added PCRE_CONFIG_JITTARGET; added its output to pcretest -C. - -15. Applied Graycode's patch to put the top-level frame on the stack rather - than the heap when not using the stack for recursion. This gives a - performance improvement in many cases when recursion is not deep. - -16. Experimental code added to "pcretest -C" to output the stack frame size. - - -Version 8.21 12-Dec-2011 ------------------------- - -1. Updating the JIT compiler. - -2. JIT compiler now supports OP_NCREF, OP_RREF and OP_NRREF. New test cases - are added as well. - -3. Fix cache-flush issue on PowerPC (It is still an experimental JIT port). - PCRE_EXTRA_TABLES is not suported by JIT, and should be checked before - calling _pcre_jit_exec. Some extra comments are added. - -4. (*MARK) settings inside atomic groups that do not contain any capturing - parentheses, for example, (?>a(*:m)), were not being passed out. This bug - was introduced by change 18 for 8.20. - -5. Supporting of \x, \U and \u in JavaScript compatibility mode based on the - ECMA-262 standard. - -6. Lookbehinds such as (?<=a{2}b) that contained a fixed repetition were - erroneously being rejected as "not fixed length" if PCRE_CASELESS was set. - This bug was probably introduced by change 9 of 8.13. - -7. While fixing 6 above, I noticed that a number of other items were being - incorrectly rejected as "not fixed length". This arose partly because newer - opcodes had not been added to the fixed-length checking code. I have (a) - corrected the bug and added tests for these items, and (b) arranged for an - error to occur if an unknown opcode is encountered while checking for fixed - length instead of just assuming "not fixed length". The items that were - rejected were: (*ACCEPT), (*COMMIT), (*FAIL), (*MARK), (*PRUNE), (*SKIP), - (*THEN), \h, \H, \v, \V, and single character negative classes with fixed - repetitions, e.g. [^a]{3}, with and without PCRE_CASELESS. - -8. A possessively repeated conditional subpattern such as (?(?=c)c|d)++ was - being incorrectly compiled and would have given unpredicatble results. - -9. A possessively repeated subpattern with minimum repeat count greater than - one behaved incorrectly. For example, (A){2,}+ behaved as if it was - (A)(A)++ which meant that, after a subsequent mismatch, backtracking into - the first (A) could occur when it should not. - -10. Add a cast and remove a redundant test from the code. - -11. JIT should use pcre_malloc/pcre_free for allocation. - -12. Updated pcre-config so that it no longer shows -L/usr/lib, which seems - best practice nowadays, and helps with cross-compiling. (If the exec_prefix - is anything other than /usr, -L is still shown). - -13. In non-UTF-8 mode, \C is now supported in lookbehinds and DFA matching. - -14. Perl does not support \N without a following name in a [] class; PCRE now - also gives an error. - -15. If a forward reference was repeated with an upper limit of around 2000, - it caused the error "internal error: overran compiling workspace". The - maximum number of forward references (including repeats) was limited by the - internal workspace, and dependent on the LINK_SIZE. The code has been - rewritten so that the workspace expands (via pcre_malloc) if necessary, and - the default depends on LINK_SIZE. There is a new upper limit (for safety) - of around 200,000 forward references. While doing this, I also speeded up - the filling in of repeated forward references. - -16. A repeated forward reference in a pattern such as (a)(?2){2}(.) was - incorrectly expecting the subject to contain another "a" after the start. - -17. When (*SKIP:name) is activated without a corresponding (*MARK:name) earlier - in the match, the SKIP should be ignored. This was not happening; instead - the SKIP was being treated as NOMATCH. For patterns such as - /A(*MARK:A)A+(*SKIP:B)Z|AAC/ this meant that the AAC branch was never - tested. - -18. The behaviour of (*MARK), (*PRUNE), and (*THEN) has been reworked and is - now much more compatible with Perl, in particular in cases where the result - is a non-match for a non-anchored pattern. For example, if - /b(*:m)f|a(*:n)w/ is matched against "abc", the non-match returns the name - "m", where previously it did not return a name. A side effect of this - change is that for partial matches, the last encountered mark name is - returned, as for non matches. A number of tests that were previously not - Perl-compatible have been moved into the Perl-compatible test files. The - refactoring has had the pleasing side effect of removing one argument from - the match() function, thus reducing its stack requirements. - -19. If the /S+ option was used in pcretest to study a pattern using JIT, - subsequent uses of /S (without +) incorrectly behaved like /S+. - -21. Retrieve executable code size support for the JIT compiler and fixing - some warnings. - -22. A caseless match of a UTF-8 character whose other case uses fewer bytes did - not work when the shorter character appeared right at the end of the - subject string. - -23. Added some (int) casts to non-JIT modules to reduce warnings on 64-bit - systems. - -24. Added PCRE_INFO_JITSIZE to pass on the value from (21) above, and also - output it when the /M option is used in pcretest. - -25. The CheckMan script was not being included in the distribution. Also, added - an explicit "perl" to run Perl scripts from the PrepareRelease script - because this is reportedly needed in Windows. - -26. If study data was being save in a file and studying had not found a set of - "starts with" bytes for the pattern, the data written to the file (though - never used) was taken from uninitialized memory and so caused valgrind to - complain. - -27. Updated RunTest.bat as provided by Sheri Pierce. - -28. Fixed a possible uninitialized memory bug in pcre_jit_compile.c. - -29. Computation of memory usage for the table of capturing group names was - giving an unnecessarily large value. - - -Version 8.20 21-Oct-2011 ------------------------- - -1. Change 37 of 8.13 broke patterns like [:a]...[b:] because it thought it had - a POSIX class. After further experiments with Perl, which convinced me that - Perl has bugs and confusions, a closing square bracket is no longer allowed - in a POSIX name. This bug also affected patterns with classes that started - with full stops. - -2. If a pattern such as /(a)b|ac/ is matched against "ac", there is no - captured substring, but while checking the failing first alternative, - substring 1 is temporarily captured. If the output vector supplied to - pcre_exec() was not big enough for this capture, the yield of the function - was still zero ("insufficient space for captured substrings"). This cannot - be totally fixed without adding another stack variable, which seems a lot - of expense for a edge case. However, I have improved the situation in cases - such as /(a)(b)x|abc/ matched against "abc", where the return code - indicates that fewer than the maximum number of slots in the ovector have - been set. - -3. Related to (2) above: when there are more back references in a pattern than - slots in the output vector, pcre_exec() uses temporary memory during - matching, and copies in the captures as far as possible afterwards. It was - using the entire output vector, but this conflicts with the specification - that only 2/3 is used for passing back captured substrings. Now it uses - only the first 2/3, for compatibility. This is, of course, another edge - case. - -4. Zoltan Herczeg's just-in-time compiler support has been integrated into the - main code base, and can be used by building with --enable-jit. When this is - done, pcregrep automatically uses it unless --disable-pcregrep-jit or the - runtime --no-jit option is given. - -5. When the number of matches in a pcre_dfa_exec() run exactly filled the - ovector, the return from the function was zero, implying that there were - other matches that did not fit. The correct "exactly full" value is now - returned. - -6. If a subpattern that was called recursively or as a subroutine contained - (*PRUNE) or any other control that caused it to give a non-standard return, - invalid errors such as "Error -26 (nested recursion at the same subject - position)" or even infinite loops could occur. - -7. If a pattern such as /a(*SKIP)c|b(*ACCEPT)|/ was studied, it stopped - computing the minimum length on reaching *ACCEPT, and so ended up with the - wrong value of 1 rather than 0. Further investigation indicates that - computing a minimum subject length in the presence of *ACCEPT is difficult - (think back references, subroutine calls), and so I have changed the code - so that no minimum is registered for a pattern that contains *ACCEPT. - -8. If (*THEN) was present in the first (true) branch of a conditional group, - it was not handled as intended. [But see 16 below.] - -9. Replaced RunTest.bat and CMakeLists.txt with improved versions provided by - Sheri Pierce. - -10. A pathological pattern such as /(*ACCEPT)a/ was miscompiled, thinking that - the first byte in a match must be "a". - -11. Change 17 for 8.13 increased the recursion depth for patterns like - /a(?:.)*?a/ drastically. I've improved things by remembering whether a - pattern contains any instances of (*THEN). If it does not, the old - optimizations are restored. It would be nice to do this on a per-group - basis, but at the moment that is not feasible. - -12. In some environments, the output of pcretest -C is CRLF terminated. This - broke RunTest's code that checks for the link size. A single white space - character after the value is now allowed for. - -13. RunTest now checks for the "fr" locale as well as for "fr_FR" and "french". - For "fr", it uses the Windows-specific input and output files. - -14. If (*THEN) appeared in a group that was called recursively or as a - subroutine, it did not work as intended. [But see next item.] - -15. Consider the pattern /A (B(*THEN)C) | D/ where A, B, C, and D are complex - pattern fragments (but not containing any | characters). If A and B are - matched, but there is a failure in C so that it backtracks to (*THEN), PCRE - was behaving differently to Perl. PCRE backtracked into A, but Perl goes to - D. In other words, Perl considers parentheses that do not contain any | - characters to be part of a surrounding alternative, whereas PCRE was - treading (B(*THEN)C) the same as (B(*THEN)C|(*FAIL)) -- which Perl handles - differently. PCRE now behaves in the same way as Perl, except in the case - of subroutine/recursion calls such as (?1) which have in any case always - been different (but PCRE had them first :-). - -16. Related to 15 above: Perl does not treat the | in a conditional group as - creating alternatives. Such a group is treated in the same way as an - ordinary group without any | characters when processing (*THEN). PCRE has - been changed to match Perl's behaviour. - -17. If a user had set PCREGREP_COLO(U)R to something other than 1:31, the - RunGrepTest script failed. - -18. Change 22 for version 13 caused atomic groups to use more stack. This is - inevitable for groups that contain captures, but it can lead to a lot of - stack use in large patterns. The old behaviour has been restored for atomic - groups that do not contain any capturing parentheses. - -19. If the PCRE_NO_START_OPTIMIZE option was set for pcre_compile(), it did not - suppress the check for a minimum subject length at run time. (If it was - given to pcre_exec() or pcre_dfa_exec() it did work.) - -20. Fixed an ASCII-dependent infelicity in pcretest that would have made it - fail to work when decoding hex characters in data strings in EBCDIC - environments. - -21. It appears that in at least one Mac OS environment, the isxdigit() function - is implemented as a macro that evaluates to its argument more than once, - contravening the C 90 Standard (I haven't checked a later standard). There - was an instance in pcretest which caused it to go wrong when processing - \x{...} escapes in subject strings. The has been rewritten to avoid using - things like p++ in the argument of isxdigit(). - - -Version 8.13 16-Aug-2011 ------------------------- - -1. The Unicode data tables have been updated to Unicode 6.0.0. - -2. Two minor typos in pcre_internal.h have been fixed. - -3. Added #include to pcre_scanner_unittest.cc, pcrecpp.cc, and - pcrecpp_unittest.cc. They are needed for strcmp(), memset(), and strchr() - in some environments (e.g. Solaris 10/SPARC using Sun Studio 12U2). - -4. There were a number of related bugs in the code for matching backrefences - caselessly in UTF-8 mode when codes for the characters concerned were - different numbers of bytes. For example, U+023A and U+2C65 are an upper - and lower case pair, using 2 and 3 bytes, respectively. The main bugs were: - (a) A reference to 3 copies of a 2-byte code matched only 2 of a 3-byte - code. (b) A reference to 2 copies of a 3-byte code would not match 2 of a - 2-byte code at the end of the subject (it thought there wasn't enough data - left). - -5. Comprehensive information about what went wrong is now returned by - pcre_exec() and pcre_dfa_exec() when the UTF-8 string check fails, as long - as the output vector has at least 2 elements. The offset of the start of - the failing character and a reason code are placed in the vector. - -6. When the UTF-8 string check fails for pcre_compile(), the offset that is - now returned is for the first byte of the failing character, instead of the - last byte inspected. This is an incompatible change, but I hope it is small - enough not to be a problem. It makes the returned offset consistent with - pcre_exec() and pcre_dfa_exec(). - -7. pcretest now gives a text phrase as well as the error number when - pcre_exec() or pcre_dfa_exec() fails; if the error is a UTF-8 check - failure, the offset and reason code are output. - -8. When \R was used with a maximizing quantifier it failed to skip backwards - over a \r\n pair if the subsequent match failed. Instead, it just skipped - back over a single character (\n). This seems wrong (because it treated the - two characters as a single entity when going forwards), conflicts with the - documentation that \R is equivalent to (?>\r\n|\n|...etc), and makes the - behaviour of \R* different to (\R)*, which also seems wrong. The behaviour - has been changed. - -9. Some internal refactoring has changed the processing so that the handling - of the PCRE_CASELESS and PCRE_MULTILINE options is done entirely at compile - time (the PCRE_DOTALL option was changed this way some time ago: version - 7.7 change 16). This has made it possible to abolish the OP_OPT op code, - which was always a bit of a fudge. It also means that there is one less - argument for the match() function, which reduces its stack requirements - slightly. This change also fixes an incompatibility with Perl: the pattern - (?i:([^b]))(?1) should not match "ab", but previously PCRE gave a match. - -10. More internal refactoring has drastically reduced the number of recursive - calls to match() for possessively repeated groups such as (abc)++ when - using pcre_exec(). - -11. While implementing 10, a number of bugs in the handling of groups were - discovered and fixed: - - (?<=(a)+) was not diagnosed as invalid (non-fixed-length lookbehind). - (a|)*(?1) gave a compile-time internal error. - ((a|)+)+ did not notice that the outer group could match an empty string. - (^a|^)+ was not marked as anchored. - (.*a|.*)+ was not marked as matching at start or after a newline. - -12. Yet more internal refactoring has removed another argument from the match() - function. Special calls to this function are now indicated by setting a - value in a variable in the "match data" data block. - -13. Be more explicit in pcre_study() instead of relying on "default" for - opcodes that mean there is no starting character; this means that when new - ones are added and accidentally left out of pcre_study(), testing should - pick them up. - -14. The -s option of pcretest has been documented for ages as being an old - synonym of -m (show memory usage). I have changed it to mean "force study - for every regex", that is, assume /S for every regex. This is similar to -i - and -d etc. It's slightly incompatible, but I'm hoping nobody is still - using it. It makes it easier to run collections of tests with and without - study enabled, and thereby test pcre_study() more easily. All the standard - tests are now run with and without -s (but some patterns can be marked as - "never study" - see 20 below). - -15. When (*ACCEPT) was used in a subpattern that was called recursively, the - restoration of the capturing data to the outer values was not happening - correctly. - -16. If a recursively called subpattern ended with (*ACCEPT) and matched an - empty string, and PCRE_NOTEMPTY was set, pcre_exec() thought the whole - pattern had matched an empty string, and so incorrectly returned a no - match. - -17. There was optimizing code for the last branch of non-capturing parentheses, - and also for the obeyed branch of a conditional subexpression, which used - tail recursion to cut down on stack usage. Unfortunately, now that there is - the possibility of (*THEN) occurring in these branches, tail recursion is - no longer possible because the return has to be checked for (*THEN). These - two optimizations have therefore been removed. [But see 8.20/11 above.] - -18. If a pattern containing \R was studied, it was assumed that \R always - matched two bytes, thus causing the minimum subject length to be - incorrectly computed because \R can also match just one byte. - -19. If a pattern containing (*ACCEPT) was studied, the minimum subject length - was incorrectly computed. - -20. If /S is present twice on a test pattern in pcretest input, it now - *disables* studying, thereby overriding the use of -s on the command line - (see 14 above). This is necessary for one or two tests to keep the output - identical in both cases. - -21. When (*ACCEPT) was used in an assertion that matched an empty string and - PCRE_NOTEMPTY was set, PCRE applied the non-empty test to the assertion. - -22. When an atomic group that contained a capturing parenthesis was - successfully matched, but the branch in which it appeared failed, the - capturing was not being forgotten if a higher numbered group was later - captured. For example, /(?>(a))b|(a)c/ when matching "ac" set capturing - group 1 to "a", when in fact it should be unset. This applied to multi- - branched capturing and non-capturing groups, repeated or not, and also to - positive assertions (capturing in negative assertions does not happen - in PCRE) and also to nested atomic groups. - -23. Add the ++ qualifier feature to pcretest, to show the remainder of the - subject after a captured substring, to make it easier to tell which of a - number of identical substrings has been captured. - -24. The way atomic groups are processed by pcre_exec() has been changed so that - if they are repeated, backtracking one repetition now resets captured - values correctly. For example, if ((?>(a+)b)+aabab) is matched against - "aaaabaaabaabab" the value of captured group 2 is now correctly recorded as - "aaa". Previously, it would have been "a". As part of this code - refactoring, the way recursive calls are handled has also been changed. - -25. If an assertion condition captured any substrings, they were not passed - back unless some other capturing happened later. For example, if - (?(?=(a))a) was matched against "a", no capturing was returned. - -26. When studying a pattern that contained subroutine calls or assertions, - the code for finding the minimum length of a possible match was handling - direct recursions such as (xxx(?1)|yyy) but not mutual recursions (where - group 1 called group 2 while simultaneously a separate group 2 called group - 1). A stack overflow occurred in this case. I have fixed this by limiting - the recursion depth to 10. - -27. Updated RunTest.bat in the distribution to the version supplied by Tom - Fortmann. This supports explicit test numbers on the command line, and has - argument validation and error reporting. - -28. An instance of \X with an unlimited repeat could fail if at any point the - first character it looked at was a mark character. - -29. Some minor code refactoring concerning Unicode properties and scripts - should reduce the stack requirement of match() slightly. - -30. Added the '=' option to pcretest to check the setting of unused capturing - slots at the end of the pattern, which are documented as being -1, but are - not included in the return count. - -31. If \k was not followed by a braced, angle-bracketed, or quoted name, PCRE - compiled something random. Now it gives a compile-time error (as does - Perl). - -32. A *MARK encountered during the processing of a positive assertion is now - recorded and passed back (compatible with Perl). - -33. If --only-matching or --colour was set on a pcregrep call whose pattern - had alternative anchored branches, the search for a second match in a line - was done as if at the line start. Thus, for example, /^01|^02/ incorrectly - matched the line "0102" twice. The same bug affected patterns that started - with a backwards assertion. For example /\b01|\b02/ also matched "0102" - twice. - -34. Previously, PCRE did not allow quantification of assertions. However, Perl - does, and because of capturing effects, quantifying parenthesized - assertions may at times be useful. Quantifiers are now allowed for - parenthesized assertions. - -35. A minor code tidy in pcre_compile() when checking options for \R usage. - -36. \g was being checked for fancy things in a character class, when it should - just be a literal "g". - -37. PCRE was rejecting [:a[:digit:]] whereas Perl was not. It seems that the - appearance of a nested POSIX class supersedes an apparent external class. - For example, [:a[:digit:]b:] matches "a", "b", ":", or a digit. Also, - unescaped square brackets may also appear as part of class names. For - example, [:a[:abc]b:] gives unknown class "[:abc]b:]". PCRE now behaves - more like Perl. (But see 8.20/1 above.) - -38. PCRE was giving an error for \N with a braced quantifier such as {1,} (this - was because it thought it was \N{name}, which is not supported). - -39. Add minix to OS list not supporting the -S option in pcretest. - -40. PCRE tries to detect cases of infinite recursion at compile time, but it - cannot analyze patterns in sufficient detail to catch mutual recursions - such as ((?1))((?2)). There is now a runtime test that gives an error if a - subgroup is called recursively as a subpattern for a second time at the - same position in the subject string. In previous releases this might have - been caught by the recursion limit, or it might have run out of stack. - -41. A pattern such as /(?(R)a+|(?R)b)/ is quite safe, as the recursion can - happen only once. PCRE was, however incorrectly giving a compile time error - "recursive call could loop indefinitely" because it cannot analyze the - pattern in sufficient detail. The compile time test no longer happens when - PCRE is compiling a conditional subpattern, but actual runaway loops are - now caught at runtime (see 40 above). - -42. It seems that Perl allows any characters other than a closing parenthesis - to be part of the NAME in (*MARK:NAME) and other backtracking verbs. PCRE - has been changed to be the same. - -43. Updated configure.ac to put in more quoting round AC_LANG_PROGRAM etc. so - as not to get warnings when autogen.sh is called. Also changed - AC_PROG_LIBTOOL (deprecated) to LT_INIT (the current macro). - -44. To help people who use pcregrep to scan files containing exceedingly long - lines, the following changes have been made: - - (a) The default value of the buffer size parameter has been increased from - 8K to 20K. (The actual buffer used is three times this size.) - - (b) The default can be changed by ./configure --with-pcregrep-bufsize when - PCRE is built. - - (c) A --buffer-size=n option has been added to pcregrep, to allow the size - to be set at run time. - - (d) Numerical values in pcregrep options can be followed by K or M, for - example --buffer-size=50K. - - (e) If a line being scanned overflows pcregrep's buffer, an error is now - given and the return code is set to 2. - -45. Add a pointer to the latest mark to the callout data block. - -46. The pattern /.(*F)/, when applied to "abc" with PCRE_PARTIAL_HARD, gave a - partial match of an empty string instead of no match. This was specific to - the use of ".". - -47. The pattern /f.*/8s, when applied to "for" with PCRE_PARTIAL_HARD, gave a - complete match instead of a partial match. This bug was dependent on both - the PCRE_UTF8 and PCRE_DOTALL options being set. - -48. For a pattern such as /\babc|\bdef/ pcre_study() was failing to set up the - starting byte set, because \b was not being ignored. - - -Version 8.12 15-Jan-2011 ------------------------- - -1. Fixed some typos in the markup of the man pages, and wrote a script that - checks for such things as part of the documentation building process. - -2. On a big-endian 64-bit system, pcregrep did not correctly process the - --match-limit and --recursion-limit options (added for 8.11). In - particular, this made one of the standard tests fail. (The integer value - went into the wrong half of a long int.) - -3. If the --colour option was given to pcregrep with -v (invert match), it - did strange things, either producing crazy output, or crashing. It should, - of course, ignore a request for colour when reporting lines that do not - match. - -4. Another pcregrep bug caused similar problems if --colour was specified with - -M (multiline) and the pattern match finished with a line ending. - -5. In pcregrep, when a pattern that ended with a literal newline sequence was - matched in multiline mode, the following line was shown as part of the - match. This seems wrong, so I have changed it. - -6. Another pcregrep bug in multiline mode, when --colour was specified, caused - the check for further matches in the same line (so they could be coloured) - to overrun the end of the current line. If another match was found, it was - incorrectly shown (and then shown again when found in the next line). - -7. If pcregrep was compiled under Windows, there was a reference to the - function pcregrep_exit() before it was defined. I am assuming this was - the cause of the "error C2371: 'pcregrep_exit' : redefinition;" that was - reported by a user. I've moved the definition above the reference. - - -Version 8.11 10-Dec-2010 ------------------------- - -1. (*THEN) was not working properly if there were untried alternatives prior - to it in the current branch. For example, in ((a|b)(*THEN)(*F)|c..) it - backtracked to try for "b" instead of moving to the next alternative branch - at the same level (in this case, to look for "c"). The Perl documentation - is clear that when (*THEN) is backtracked onto, it goes to the "next - alternative in the innermost enclosing group". - -2. (*COMMIT) was not overriding (*THEN), as it does in Perl. In a pattern - such as (A(*COMMIT)B(*THEN)C|D) any failure after matching A should - result in overall failure. Similarly, (*COMMIT) now overrides (*PRUNE) and - (*SKIP), (*SKIP) overrides (*PRUNE) and (*THEN), and (*PRUNE) overrides - (*THEN). - -3. If \s appeared in a character class, it removed the VT character from - the class, even if it had been included by some previous item, for example - in [\x00-\xff\s]. (This was a bug related to the fact that VT is not part - of \s, but is part of the POSIX "space" class.) - -4. A partial match never returns an empty string (because you can always - match an empty string at the end of the subject); however the checking for - an empty string was starting at the "start of match" point. This has been - changed to the "earliest inspected character" point, because the returned - data for a partial match starts at this character. This means that, for - example, /(?<=abc)def/ gives a partial match for the subject "abc" - (previously it gave "no match"). - -5. Changes have been made to the way PCRE_PARTIAL_HARD affects the matching - of $, \z, \Z, \b, and \B. If the match point is at the end of the string, - previously a full match would be given. However, setting PCRE_PARTIAL_HARD - has an implication that the given string is incomplete (because a partial - match is preferred over a full match). For this reason, these items now - give a partial match in this situation. [Aside: previously, the one case - /t\b/ matched against "cat" with PCRE_PARTIAL_HARD set did return a partial - match rather than a full match, which was wrong by the old rules, but is - now correct.] - -6. There was a bug in the handling of #-introduced comments, recognized when - PCRE_EXTENDED is set, when PCRE_NEWLINE_ANY and PCRE_UTF8 were also set. - If a UTF-8 multi-byte character included the byte 0x85 (e.g. +U0445, whose - UTF-8 encoding is 0xd1,0x85), this was misinterpreted as a newline when - scanning for the end of the comment. (*Character* 0x85 is an "any" newline, - but *byte* 0x85 is not, in UTF-8 mode). This bug was present in several - places in pcre_compile(). - -7. Related to (6) above, when pcre_compile() was skipping #-introduced - comments when looking ahead for named forward references to subpatterns, - the only newline sequence it recognized was NL. It now handles newlines - according to the set newline convention. - -8. SunOS4 doesn't have strerror() or strtoul(); pcregrep dealt with the - former, but used strtoul(), whereas pcretest avoided strtoul() but did not - cater for a lack of strerror(). These oversights have been fixed. - -9. Added --match-limit and --recursion-limit to pcregrep. - -10. Added two casts needed to build with Visual Studio when NO_RECURSE is set. - -11. When the -o option was used, pcregrep was setting a return code of 1, even - when matches were found, and --line-buffered was not being honoured. - -12. Added an optional parentheses number to the -o and --only-matching options - of pcregrep. - -13. Imitating Perl's /g action for multiple matches is tricky when the pattern - can match an empty string. The code to do it in pcretest and pcredemo - needed fixing: - - (a) When the newline convention was "crlf", pcretest got it wrong, skipping - only one byte after an empty string match just before CRLF (this case - just got forgotten; "any" and "anycrlf" were OK). - - (b) The pcretest code also had a bug, causing it to loop forever in UTF-8 - mode when an empty string match preceded an ASCII character followed by - a non-ASCII character. (The code for advancing by one character rather - than one byte was nonsense.) - - (c) The pcredemo.c sample program did not have any code at all to handle - the cases when CRLF is a valid newline sequence. - -14. Neither pcre_exec() nor pcre_dfa_exec() was checking that the value given - as a starting offset was within the subject string. There is now a new - error, PCRE_ERROR_BADOFFSET, which is returned if the starting offset is - negative or greater than the length of the string. In order to test this, - pcretest is extended to allow the setting of negative starting offsets. - -15. In both pcre_exec() and pcre_dfa_exec() the code for checking that the - starting offset points to the beginning of a UTF-8 character was - unnecessarily clumsy. I tidied it up. - -16. Added PCRE_ERROR_SHORTUTF8 to make it possible to distinguish between a - bad UTF-8 sequence and one that is incomplete when using PCRE_PARTIAL_HARD. - -17. Nobody had reported that the --include_dir option, which was added in - release 7.7 should have been called --include-dir (hyphen, not underscore) - for compatibility with GNU grep. I have changed it to --include-dir, but - left --include_dir as an undocumented synonym, and the same for - --exclude-dir, though that is not available in GNU grep, at least as of - release 2.5.4. - -18. At a user's suggestion, the macros GETCHAR and friends (which pick up UTF-8 - characters from a string of bytes) have been redefined so as not to use - loops, in order to improve performance in some environments. At the same - time, I abstracted some of the common code into auxiliary macros to save - repetition (this should not affect the compiled code). - -19. If \c was followed by a multibyte UTF-8 character, bad things happened. A - compile-time error is now given if \c is not followed by an ASCII - character, that is, a byte less than 128. (In EBCDIC mode, the code is - different, and any byte value is allowed.) - -20. Recognize (*NO_START_OPT) at the start of a pattern to set the PCRE_NO_ - START_OPTIMIZE option, which is now allowed at compile time - but just - passed through to pcre_exec() or pcre_dfa_exec(). This makes it available - to pcregrep and other applications that have no direct access to PCRE - options. The new /Y option in pcretest sets this option when calling - pcre_compile(). - -21. Change 18 of release 8.01 broke the use of named subpatterns for recursive - back references. Groups containing recursive back references were forced to - be atomic by that change, but in the case of named groups, the amount of - memory required was incorrectly computed, leading to "Failed: internal - error: code overflow". This has been fixed. - -22. Some patches to pcre_stringpiece.h, pcre_stringpiece_unittest.cc, and - pcretest.c, to avoid build problems in some Borland environments. - - -Version 8.10 25-Jun-2010 ------------------------- - -1. Added support for (*MARK:ARG) and for ARG additions to PRUNE, SKIP, and - THEN. - -2. (*ACCEPT) was not working when inside an atomic group. - -3. Inside a character class, \B is treated as a literal by default, but - faulted if PCRE_EXTRA is set. This mimics Perl's behaviour (the -w option - causes the error). The code is unchanged, but I tidied the documentation. - -4. Inside a character class, PCRE always treated \R and \X as literals, - whereas Perl faults them if its -w option is set. I have changed PCRE so - that it faults them when PCRE_EXTRA is set. - -5. Added support for \N, which always matches any character other than - newline. (It is the same as "." when PCRE_DOTALL is not set.) - -6. When compiling pcregrep with newer versions of gcc which may have - FORTIFY_SOURCE set, several warnings "ignoring return value of 'fwrite', - declared with attribute warn_unused_result" were given. Just casting the - result to (void) does not stop the warnings; a more elaborate fudge is - needed. I've used a macro to implement this. - -7. Minor change to pcretest.c to avoid a compiler warning. - -8. Added four artifical Unicode properties to help with an option to make - \s etc use properties (see next item). The new properties are: Xan - (alphanumeric), Xsp (Perl space), Xps (POSIX space), and Xwd (word). - -9. Added PCRE_UCP to make \b, \d, \s, \w, and certain POSIX character classes - use Unicode properties. (*UCP) at the start of a pattern can be used to set - this option. Modified pcretest to add /W to test this facility. Added - REG_UCP to make it available via the POSIX interface. - -10. Added --line-buffered to pcregrep. - -11. In UTF-8 mode, if a pattern that was compiled with PCRE_CASELESS was - studied, and the match started with a letter with a code point greater than - 127 whose first byte was different to the first byte of the other case of - the letter, the other case of this starting letter was not recognized - (#976). - -12. If a pattern that was studied started with a repeated Unicode property - test, for example, \p{Nd}+, there was the theoretical possibility of - setting up an incorrect bitmap of starting bytes, but fortunately it could - not have actually happened in practice until change 8 above was made (it - added property types that matched character-matching opcodes). - -13. pcre_study() now recognizes \h, \v, and \R when constructing a bit map of - possible starting bytes for non-anchored patterns. - -14. Extended the "auto-possessify" feature of pcre_compile(). It now recognizes - \R, and also a number of cases that involve Unicode properties, both - explicit and implicit when PCRE_UCP is set. - -15. If a repeated Unicode property match (e.g. \p{Lu}*) was used with non-UTF-8 - input, it could crash or give wrong results if characters with values - greater than 0xc0 were present in the subject string. (Detail: it assumed - UTF-8 input when processing these items.) - -16. Added a lot of (int) casts to avoid compiler warnings in systems where - size_t is 64-bit (#991). - -17. Added a check for running out of memory when PCRE is compiled with - --disable-stack-for-recursion (#990). - -18. If the last data line in a file for pcretest does not have a newline on - the end, a newline was missing in the output. - -19. The default pcre_chartables.c file recognizes only ASCII characters (values - less than 128) in its various bitmaps. However, there is a facility for - generating tables according to the current locale when PCRE is compiled. It - turns out that in some environments, 0x85 and 0xa0, which are Unicode space - characters, are recognized by isspace() and therefore were getting set in - these tables, and indeed these tables seem to approximate to ISO 8859. This - caused a problem in UTF-8 mode when pcre_study() was used to create a list - of bytes that can start a match. For \s, it was including 0x85 and 0xa0, - which of course cannot start UTF-8 characters. I have changed the code so - that only real ASCII characters (less than 128) and the correct starting - bytes for UTF-8 encodings are set for characters greater than 127 when in - UTF-8 mode. (When PCRE_UCP is set - see 9 above - the code is different - altogether.) - -20. Added the /T option to pcretest so as to be able to run tests with non- - standard character tables, thus making it possible to include the tests - used for 19 above in the standard set of tests. - -21. A pattern such as (?&t)(?#()(?(DEFINE)(?a)) which has a forward - reference to a subpattern the other side of a comment that contains an - opening parenthesis caused either an internal compiling error, or a - reference to the wrong subpattern. - - -Version 8.02 19-Mar-2010 ------------------------- - -1. The Unicode data tables have been updated to Unicode 5.2.0. - -2. Added the option --libs-cpp to pcre-config, but only when C++ support is - configured. - -3. Updated the licensing terms in the pcregexp.pas file, as agreed with the - original author of that file, following a query about its status. - -4. On systems that do not have stdint.h (e.g. Solaris), check for and include - inttypes.h instead. This fixes a bug that was introduced by change 8.01/8. - -5. A pattern such as (?&t)*+(?(DEFINE)(?.)) which has a possessive - quantifier applied to a forward-referencing subroutine call, could compile - incorrect code or give the error "internal error: previously-checked - referenced subpattern not found". - -6. Both MS Visual Studio and Symbian OS have problems with initializing - variables to point to external functions. For these systems, therefore, - pcre_malloc etc. are now initialized to local functions that call the - relevant global functions. - -7. There were two entries missing in the vectors called coptable and poptable - in pcre_dfa_exec.c. This could lead to memory accesses outsize the vectors. - I've fixed the data, and added a kludgy way of testing at compile time that - the lengths are correct (equal to the number of opcodes). - -8. Following on from 7, I added a similar kludge to check the length of the - eint vector in pcreposix.c. - -9. Error texts for pcre_compile() are held as one long string to avoid too - much relocation at load time. To find a text, the string is searched, - counting zeros. There was no check for running off the end of the string, - which could happen if a new error number was added without updating the - string. - -10. \K gave a compile-time error if it appeared in a lookbehind assersion. - -11. \K was not working if it appeared in an atomic group or in a group that - was called as a "subroutine", or in an assertion. Perl 5.11 documents that - \K is "not well defined" if used in an assertion. PCRE now accepts it if - the assertion is positive, but not if it is negative. - -12. Change 11 fortuitously reduced the size of the stack frame used in the - "match()" function of pcre_exec.c by one pointer. Forthcoming - implementation of support for (*MARK) will need an extra pointer on the - stack; I have reserved it now, so that the stack frame size does not - decrease. - -13. A pattern such as (?P(?P0)|(?P>L2)(?P>L1)) in which the only other - item in branch that calls a recursion is a subroutine call - as in the - second branch in the above example - was incorrectly given the compile- - time error "recursive call could loop indefinitely" because pcre_compile() - was not correctly checking the subroutine for matching a non-empty string. - -14. The checks for overrunning compiling workspace could trigger after an - overrun had occurred. This is a "should never occur" error, but it can be - triggered by pathological patterns such as hundreds of nested parentheses. - The checks now trigger 100 bytes before the end of the workspace. - -15. Fix typo in configure.ac: "srtoq" should be "strtoq". - - -Version 8.01 19-Jan-2010 ------------------------- - -1. If a pattern contained a conditional subpattern with only one branch (in - particular, this includes all (*DEFINE) patterns), a call to pcre_study() - computed the wrong minimum data length (which is of course zero for such - subpatterns). This could cause incorrect "no match" results. - -2. For patterns such as (?i)a(?-i)b|c where an option setting at the start of - the pattern is reset in the first branch, pcre_compile() failed with - "internal error: code overflow at offset...". This happened only when - the reset was to the original external option setting. (An optimization - abstracts leading options settings into an external setting, which was the - cause of this.) - -3. A pattern such as ^(?!a(*SKIP)b) where a negative assertion contained one - of the verbs SKIP, PRUNE, or COMMIT, did not work correctly. When the - assertion pattern did not match (meaning that the assertion was true), it - was incorrectly treated as false if the SKIP had been reached during the - matching. This also applied to assertions used as conditions. - -4. If an item that is not supported by pcre_dfa_exec() was encountered in an - assertion subpattern, including such a pattern used as a condition, - unpredictable results occurred, instead of the error return - PCRE_ERROR_DFA_UITEM. - -5. The C++ GlobalReplace function was not working like Perl for the special - situation when an empty string is matched. It now does the fancy magic - stuff that is necessary. - -6. In pcre_internal.h, obsolete includes to setjmp.h and stdarg.h have been - removed. (These were left over from very, very early versions of PCRE.) - -7. Some cosmetic changes to the code to make life easier when compiling it - as part of something else: - - (a) Change DEBUG to PCRE_DEBUG. - - (b) In pcre_compile(), rename the member of the "branch_chain" structure - called "current" as "current_branch", to prevent a collision with the - Linux macro when compiled as a kernel module. - - (c) In pcre_study(), rename the function set_bit() as set_table_bit(), to - prevent a collision with the Linux macro when compiled as a kernel - module. - -8. In pcre_compile() there are some checks for integer overflows that used to - cast potentially large values to (double). This has been changed to that - when building, a check for int64_t is made, and if it is found, it is used - instead, thus avoiding the use of floating point arithmetic. (There is no - other use of FP in PCRE.) If int64_t is not found, the fallback is to - double. - -9. Added two casts to avoid signed/unsigned warnings from VS Studio Express - 2005 (difference between two addresses compared to an unsigned value). - -10. Change the standard AC_CHECK_LIB test for libbz2 in configure.ac to a - custom one, because of the following reported problem in Windows: - - - libbz2 uses the Pascal calling convention (WINAPI) for the functions - under Win32. - - The standard autoconf AC_CHECK_LIB fails to include "bzlib.h", - therefore missing the function definition. - - The compiler thus generates a "C" signature for the test function. - - The linker fails to find the "C" function. - - PCRE fails to configure if asked to do so against libbz2. - -11. When running libtoolize from libtool-2.2.6b as part of autogen.sh, these - messages were output: - - Consider adding `AC_CONFIG_MACRO_DIR([m4])' to configure.ac and - rerunning libtoolize, to keep the correct libtool macros in-tree. - Consider adding `-I m4' to ACLOCAL_AMFLAGS in Makefile.am. - - I have done both of these things. - -12. Although pcre_dfa_exec() does not use nearly as much stack as pcre_exec() - most of the time, it *can* run out if it is given a pattern that contains a - runaway infinite recursion. I updated the discussion in the pcrestack man - page. - -13. Now that we have gone to the x.xx style of version numbers, the minor - version may start with zero. Using 08 or 09 is a bad idea because users - might check the value of PCRE_MINOR in their code, and 08 or 09 may be - interpreted as invalid octal numbers. I've updated the previous comment in - configure.ac, and also added a check that gives an error if 08 or 09 are - used. - -14. Change 8.00/11 was not quite complete: code had been accidentally omitted, - causing partial matching to fail when the end of the subject matched \W - in a UTF-8 pattern where \W was quantified with a minimum of 3. - -15. There were some discrepancies between the declarations in pcre_internal.h - of _pcre_is_newline(), _pcre_was_newline(), and _pcre_valid_utf8() and - their definitions. The declarations used "const uschar *" and the - definitions used USPTR. Even though USPTR is normally defined as "const - unsigned char *" (and uschar is typedeffed as "unsigned char"), it was - reported that: "This difference in casting confuses some C++ compilers, for - example, SunCC recognizes above declarations as different functions and - generates broken code for hbpcre." I have changed the declarations to use - USPTR. - -16. GNU libtool is named differently on some systems. The autogen.sh script now - tries several variants such as glibtoolize (MacOSX) and libtoolize1x - (FreeBSD). - -17. Applied Craig's patch that fixes an HP aCC compile error in pcre 8.00 - (strtoXX undefined when compiling pcrecpp.cc). The patch contains this - comment: "Figure out how to create a longlong from a string: strtoll and - equivalent. It's not enough to call AC_CHECK_FUNCS: hpux has a strtoll, for - instance, but it only takes 2 args instead of 3!" - -18. A subtle bug concerned with back references has been fixed by a change of - specification, with a corresponding code fix. A pattern such as - ^(xa|=?\1a)+$ which contains a back reference inside the group to which it - refers, was giving matches when it shouldn't. For example, xa=xaaa would - match that pattern. Interestingly, Perl (at least up to 5.11.3) has the - same bug. Such groups have to be quantified to be useful, or contained - inside another quantified group. (If there's no repetition, the reference - can never match.) The problem arises because, having left the group and - moved on to the rest of the pattern, a later failure that backtracks into - the group uses the captured value from the final iteration of the group - rather than the correct earlier one. I have fixed this in PCRE by forcing - any group that contains a reference to itself to be an atomic group; that - is, there cannot be any backtracking into it once it has completed. This is - similar to recursive and subroutine calls. - - -Version 8.00 19-Oct-09 ----------------------- - -1. The table for translating pcre_compile() error codes into POSIX error codes - was out-of-date, and there was no check on the pcre_compile() error code - being within the table. This could lead to an OK return being given in - error. - -2. Changed the call to open a subject file in pcregrep from fopen(pathname, - "r") to fopen(pathname, "rb"), which fixed a problem with some of the tests - in a Windows environment. - -3. The pcregrep --count option prints the count for each file even when it is - zero, as does GNU grep. However, pcregrep was also printing all files when - --files-with-matches was added. Now, when both options are given, it prints - counts only for those files that have at least one match. (GNU grep just - prints the file name in this circumstance, but including the count seems - more useful - otherwise, why use --count?) Also ensured that the - combination -clh just lists non-zero counts, with no names. - -4. The long form of the pcregrep -F option was incorrectly implemented as - --fixed_strings instead of --fixed-strings. This is an incompatible change, - but it seems right to fix it, and I didn't think it was worth preserving - the old behaviour. - -5. The command line items --regex=pattern and --regexp=pattern were not - recognized by pcregrep, which required --regex pattern or --regexp pattern - (with a space rather than an '='). The man page documented the '=' forms, - which are compatible with GNU grep; these now work. - -6. No libpcreposix.pc file was created for pkg-config; there was just - libpcre.pc and libpcrecpp.pc. The omission has been rectified. - -7. Added #ifndef SUPPORT_UCP into the pcre_ucd.c module, to reduce its size - when UCP support is not needed, by modifying the Python script that - generates it from Unicode data files. This should not matter if the module - is correctly used as a library, but I received one complaint about 50K of - unwanted data. My guess is that the person linked everything into his - program rather than using a library. Anyway, it does no harm. - -8. A pattern such as /\x{123}{2,2}+/8 was incorrectly compiled; the trigger - was a minimum greater than 1 for a wide character in a possessive - repetition. The same bug could also affect patterns like /(\x{ff}{0,2})*/8 - which had an unlimited repeat of a nested, fixed maximum repeat of a wide - character. Chaos in the form of incorrect output or a compiling loop could - result. - -9. The restrictions on what a pattern can contain when partial matching is - requested for pcre_exec() have been removed. All patterns can now be - partially matched by this function. In addition, if there are at least two - slots in the offset vector, the offset of the earliest inspected character - for the match and the offset of the end of the subject are set in them when - PCRE_ERROR_PARTIAL is returned. - -10. Partial matching has been split into two forms: PCRE_PARTIAL_SOFT, which is - synonymous with PCRE_PARTIAL, for backwards compatibility, and - PCRE_PARTIAL_HARD, which causes a partial match to supersede a full match, - and may be more useful for multi-segment matching. - -11. Partial matching with pcre_exec() is now more intuitive. A partial match - used to be given if ever the end of the subject was reached; now it is - given only if matching could not proceed because another character was - needed. This makes a difference in some odd cases such as Z(*FAIL) with the - string "Z", which now yields "no match" instead of "partial match". In the - case of pcre_dfa_exec(), "no match" is given if every matching path for the - final character ended with (*FAIL). - -12. Restarting a match using pcre_dfa_exec() after a partial match did not work - if the pattern had a "must contain" character that was already found in the - earlier partial match, unless partial matching was again requested. For - example, with the pattern /dog.(body)?/, the "must contain" character is - "g". If the first part-match was for the string "dog", restarting with - "sbody" failed. This bug has been fixed. - -13. The string returned by pcre_dfa_exec() after a partial match has been - changed so that it starts at the first inspected character rather than the - first character of the match. This makes a difference only if the pattern - starts with a lookbehind assertion or \b or \B (\K is not supported by - pcre_dfa_exec()). It's an incompatible change, but it makes the two - matching functions compatible, and I think it's the right thing to do. - -14. Added a pcredemo man page, created automatically from the pcredemo.c file, - so that the demonstration program is easily available in environments where - PCRE has not been installed from source. - -15. Arranged to add -DPCRE_STATIC to cflags in libpcre.pc, libpcreposix.cp, - libpcrecpp.pc and pcre-config when PCRE is not compiled as a shared - library. - -16. Added REG_UNGREEDY to the pcreposix interface, at the request of a user. - It maps to PCRE_UNGREEDY. It is not, of course, POSIX-compatible, but it - is not the first non-POSIX option to be added. Clearly some people find - these options useful. - -17. If a caller to the POSIX matching function regexec() passes a non-zero - value for nmatch with a NULL value for pmatch, the value of - nmatch is forced to zero. - -18. RunGrepTest did not have a test for the availability of the -u option of - the diff command, as RunTest does. It now checks in the same way as - RunTest, and also checks for the -b option. - -19. If an odd number of negated classes containing just a single character - interposed, within parentheses, between a forward reference to a named - subpattern and the definition of the subpattern, compilation crashed with - an internal error, complaining that it could not find the referenced - subpattern. An example of a crashing pattern is /(?&A)(([^m])(?))/. - [The bug was that it was starting one character too far in when skipping - over the character class, thus treating the ] as data rather than - terminating the class. This meant it could skip too much.] - -20. Added PCRE_NOTEMPTY_ATSTART in order to be able to correctly implement the - /g option in pcretest when the pattern contains \K, which makes it possible - to have an empty string match not at the start, even when the pattern is - anchored. Updated pcretest and pcredemo to use this option. - -21. If the maximum number of capturing subpatterns in a recursion was greater - than the maximum at the outer level, the higher number was returned, but - with unset values at the outer level. The correct (outer level) value is - now given. - -22. If (*ACCEPT) appeared inside capturing parentheses, previous releases of - PCRE did not set those parentheses (unlike Perl). I have now found a way to - make it do so. The string so far is captured, making this feature - compatible with Perl. - -23. The tests have been re-organized, adding tests 11 and 12, to make it - possible to check the Perl 5.10 features against Perl 5.10. - -24. Perl 5.10 allows subroutine calls in lookbehinds, as long as the subroutine - pattern matches a fixed length string. PCRE did not allow this; now it - does. Neither allows recursion. - -25. I finally figured out how to implement a request to provide the minimum - length of subject string that was needed in order to match a given pattern. - (It was back references and recursion that I had previously got hung up - on.) This code has now been added to pcre_study(); it finds a lower bound - to the length of subject needed. It is not necessarily the greatest lower - bound, but using it to avoid searching strings that are too short does give - some useful speed-ups. The value is available to calling programs via - pcre_fullinfo(). - -26. While implementing 25, I discovered to my embarrassment that pcretest had - not been passing the result of pcre_study() to pcre_dfa_exec(), so the - study optimizations had never been tested with that matching function. - Oops. What is worse, even when it was passed study data, there was a bug in - pcre_dfa_exec() that meant it never actually used it. Double oops. There - were also very few tests of studied patterns with pcre_dfa_exec(). - -27. If (?| is used to create subpatterns with duplicate numbers, they are now - allowed to have the same name, even if PCRE_DUPNAMES is not set. However, - on the other side of the coin, they are no longer allowed to have different - names, because these cannot be distinguished in PCRE, and this has caused - confusion. (This is a difference from Perl.) - -28. When duplicate subpattern names are present (necessarily with different - numbers, as required by 27 above), and a test is made by name in a - conditional pattern, either for a subpattern having been matched, or for - recursion in such a pattern, all the associated numbered subpatterns are - tested, and the overall condition is true if the condition is true for any - one of them. This is the way Perl works, and is also more like the way - testing by number works. - - -Version 7.9 11-Apr-09 ---------------------- - -1. When building with support for bzlib/zlib (pcregrep) and/or readline - (pcretest), all targets were linked against these libraries. This included - libpcre, libpcreposix, and libpcrecpp, even though they do not use these - libraries. This caused unwanted dependencies to be created. This problem - has been fixed, and now only pcregrep is linked with bzlib/zlib and only - pcretest is linked with readline. - -2. The "typedef int BOOL" in pcre_internal.h that was included inside the - "#ifndef FALSE" condition by an earlier change (probably 7.8/18) has been - moved outside it again, because FALSE and TRUE are already defined in AIX, - but BOOL is not. - -3. The pcre_config() function was treating the PCRE_MATCH_LIMIT and - PCRE_MATCH_LIMIT_RECURSION values as ints, when they should be long ints. - -4. The pcregrep documentation said spaces were inserted as well as colons (or - hyphens) following file names and line numbers when outputting matching - lines. This is not true; no spaces are inserted. I have also clarified the - wording for the --colour (or --color) option. - -5. In pcregrep, when --colour was used with -o, the list of matching strings - was not coloured; this is different to GNU grep, so I have changed it to be - the same. - -6. When --colo(u)r was used in pcregrep, only the first matching substring in - each matching line was coloured. Now it goes on to look for further matches - of any of the test patterns, which is the same behaviour as GNU grep. - -7. A pattern that could match an empty string could cause pcregrep to loop; it - doesn't make sense to accept an empty string match in pcregrep, so I have - locked it out (using PCRE's PCRE_NOTEMPTY option). By experiment, this - seems to be how GNU grep behaves. [But see later change 40 for release - 8.33.] - -8. The pattern (?(?=.*b)b|^) was incorrectly compiled as "match must be at - start or after a newline", because the conditional assertion was not being - correctly handled. The rule now is that both the assertion and what follows - in the first alternative must satisfy the test. - -9. If auto-callout was enabled in a pattern with a conditional group whose - condition was an assertion, PCRE could crash during matching, both with - pcre_exec() and pcre_dfa_exec(). - -10. The PCRE_DOLLAR_ENDONLY option was not working when pcre_dfa_exec() was - used for matching. - -11. Unicode property support in character classes was not working for - characters (bytes) greater than 127 when not in UTF-8 mode. - -12. Added the -M command line option to pcretest. - -14. Added the non-standard REG_NOTEMPTY option to the POSIX interface. - -15. Added the PCRE_NO_START_OPTIMIZE match-time option. - -16. Added comments and documentation about mis-use of no_arg in the C++ - wrapper. - -17. Implemented support for UTF-8 encoding in EBCDIC environments, a patch - from Martin Jerabek that uses macro names for all relevant character and - string constants. - -18. Added to pcre_internal.h two configuration checks: (a) If both EBCDIC and - SUPPORT_UTF8 are set, give an error; (b) If SUPPORT_UCP is set without - SUPPORT_UTF8, define SUPPORT_UTF8. The "configure" script handles both of - these, but not everybody uses configure. - -19. A conditional group that had only one branch was not being correctly - recognized as an item that could match an empty string. This meant that an - enclosing group might also not be so recognized, causing infinite looping - (and probably a segfault) for patterns such as ^"((?(?=[a])[^"])|b)*"$ - with the subject "ab", where knowledge that the repeated group can match - nothing is needed in order to break the loop. - -20. If a pattern that was compiled with callouts was matched using pcre_dfa_ - exec(), but without supplying a callout function, matching went wrong. - -21. If PCRE_ERROR_MATCHLIMIT occurred during a recursion, there was a memory - leak if the size of the offset vector was greater than 30. When the vector - is smaller, the saved offsets during recursion go onto a local stack - vector, but for larger vectors malloc() is used. It was failing to free - when the recursion yielded PCRE_ERROR_MATCH_LIMIT (or any other "abnormal" - error, in fact). - -22. There was a missing #ifdef SUPPORT_UTF8 round one of the variables in the - heapframe that is used only when UTF-8 support is enabled. This caused no - problem, but was untidy. - -23. Steven Van Ingelgem's patch to CMakeLists.txt to change the name - CMAKE_BINARY_DIR to PROJECT_BINARY_DIR so that it works when PCRE is - included within another project. - -24. Steven Van Ingelgem's patches to add more options to the CMake support, - slightly modified by me: - - (a) PCRE_BUILD_TESTS can be set OFF not to build the tests, including - not building pcregrep. - - (b) PCRE_BUILD_PCREGREP can be see OFF not to build pcregrep, but only - if PCRE_BUILD_TESTS is also set OFF, because the tests use pcregrep. - -25. Forward references, both numeric and by name, in patterns that made use of - duplicate group numbers, could behave incorrectly or give incorrect errors, - because when scanning forward to find the reference group, PCRE was not - taking into account the duplicate group numbers. A pattern such as - ^X(?3)(a)(?|(b)|(q))(Y) is an example. - -26. Changed a few more instances of "const unsigned char *" to USPTR, making - the feature of a custom pointer more persuasive (as requested by a user). - -27. Wrapped the definitions of fileno and isatty for Windows, which appear in - pcretest.c, inside #ifndefs, because it seems they are sometimes already - pre-defined. - -28. Added support for (*UTF8) at the start of a pattern. - -29. Arrange for flags added by the "release type" setting in CMake to be shown - in the configuration summary. - - -Version 7.8 05-Sep-08 ---------------------- - -1. Replaced UCP searching code with optimized version as implemented for Ad - Muncher (http://www.admuncher.com/) by Peter Kankowski. This uses a two- - stage table and inline lookup instead of a function, giving speed ups of 2 - to 5 times on some simple patterns that I tested. Permission was given to - distribute the MultiStage2.py script that generates the tables (it's not in - the tarball, but is in the Subversion repository). - -2. Updated the Unicode datatables to Unicode 5.1.0. This adds yet more - scripts. - -3. Change 12 for 7.7 introduced a bug in pcre_study() when a pattern contained - a group with a zero qualifier. The result of the study could be incorrect, - or the function might crash, depending on the pattern. - -4. Caseless matching was not working for non-ASCII characters in back - references. For example, /(\x{de})\1/8i was not matching \x{de}\x{fe}. - It now works when Unicode Property Support is available. - -5. In pcretest, an escape such as \x{de} in the data was always generating - a UTF-8 string, even in non-UTF-8 mode. Now it generates a single byte in - non-UTF-8 mode. If the value is greater than 255, it gives a warning about - truncation. - -6. Minor bugfix in pcrecpp.cc (change "" == ... to NULL == ...). - -7. Added two (int) casts to pcregrep when printing the difference of two - pointers, in case they are 64-bit values. - -8. Added comments about Mac OS X stack usage to the pcrestack man page and to - test 2 if it fails. - -9. Added PCRE_CALL_CONVENTION just before the names of all exported functions, - and a #define of that name to empty if it is not externally set. This is to - allow users of MSVC to set it if necessary. - -10. The PCRE_EXP_DEFN macro which precedes exported functions was missing from - the convenience functions in the pcre_get.c source file. - -11. An option change at the start of a pattern that had top-level alternatives - could cause overwriting and/or a crash. This command provoked a crash in - some environments: - - printf "/(?i)[\xc3\xa9\xc3\xbd]|[\xc3\xa9\xc3\xbdA]/8\n" | pcretest - - This potential security problem was recorded as CVE-2008-2371. - -12. For a pattern where the match had to start at the beginning or immediately - after a newline (e.g /.*anything/ without the DOTALL flag), pcre_exec() and - pcre_dfa_exec() could read past the end of the passed subject if there was - no match. To help with detecting such bugs (e.g. with valgrind), I modified - pcretest so that it places the subject at the end of its malloc-ed buffer. - -13. The change to pcretest in 12 above threw up a couple more cases when pcre_ - exec() might read past the end of the data buffer in UTF-8 mode. - -14. A similar bug to 7.3/2 existed when the PCRE_FIRSTLINE option was set and - the data contained the byte 0x85 as part of a UTF-8 character within its - first line. This applied both to normal and DFA matching. - -15. Lazy qualifiers were not working in some cases in UTF-8 mode. For example, - /^[^d]*?$/8 failed to match "abc". - -16. Added a missing copyright notice to pcrecpp_internal.h. - -17. Make it more clear in the documentation that values returned from - pcre_exec() in ovector are byte offsets, not character counts. - -18. Tidied a few places to stop certain compilers from issuing warnings. - -19. Updated the Virtual Pascal + BCC files to compile the latest v7.7, as - supplied by Stefan Weber. I made a further small update for 7.8 because - there is a change of source arrangements: the pcre_searchfuncs.c module is - replaced by pcre_ucd.c. - - -Version 7.7 07-May-08 ---------------------- - -1. Applied Craig's patch to sort out a long long problem: "If we can't convert - a string to a long long, pretend we don't even have a long long." This is - done by checking for the strtoq, strtoll, and _strtoi64 functions. - -2. Applied Craig's patch to pcrecpp.cc to restore ABI compatibility with - pre-7.6 versions, which defined a global no_arg variable instead of putting - it in the RE class. (See also #8 below.) - -3. Remove a line of dead code, identified by coverity and reported by Nuno - Lopes. - -4. Fixed two related pcregrep bugs involving -r with --include or --exclude: - - (1) The include/exclude patterns were being applied to the whole pathnames - of files, instead of just to the final components. - - (2) If there was more than one level of directory, the subdirectories were - skipped unless they satisfied the include/exclude conditions. This is - inconsistent with GNU grep (and could even be seen as contrary to the - pcregrep specification - which I improved to make it absolutely clear). - The action now is always to scan all levels of directory, and just - apply the include/exclude patterns to regular files. - -5. Added the --include_dir and --exclude_dir patterns to pcregrep, and used - --exclude_dir in the tests to avoid scanning .svn directories. - -6. Applied Craig's patch to the QuoteMeta function so that it escapes the - NUL character as backslash + 0 rather than backslash + NUL, because PCRE - doesn't support NULs in patterns. - -7. Added some missing "const"s to declarations of static tables in - pcre_compile.c and pcre_dfa_exec.c. - -8. Applied Craig's patch to pcrecpp.cc to fix a problem in OS X that was - caused by fix #2 above. (Subsequently also a second patch to fix the - first patch. And a third patch - this was a messy problem.) - -9. Applied Craig's patch to remove the use of push_back(). - -10. Applied Alan Lehotsky's patch to add REG_STARTEND support to the POSIX - matching function regexec(). - -11. Added support for the Oniguruma syntax \g, \g, \g'name', \g'n', - which, however, unlike Perl's \g{...}, are subroutine calls, not back - references. PCRE supports relative numbers with this syntax (I don't think - Oniguruma does). - -12. Previously, a group with a zero repeat such as (...){0} was completely - omitted from the compiled regex. However, this means that if the group - was called as a subroutine from elsewhere in the pattern, things went wrong - (an internal error was given). Such groups are now left in the compiled - pattern, with a new opcode that causes them to be skipped at execution - time. - -13. Added the PCRE_JAVASCRIPT_COMPAT option. This makes the following changes - to the way PCRE behaves: - - (a) A lone ] character is dis-allowed (Perl treats it as data). - - (b) A back reference to an unmatched subpattern matches an empty string - (Perl fails the current match path). - - (c) A data ] in a character class must be notated as \] because if the - first data character in a class is ], it defines an empty class. (In - Perl it is not possible to have an empty class.) The empty class [] - never matches; it forces failure and is equivalent to (*FAIL) or (?!). - The negative empty class [^] matches any one character, independently - of the DOTALL setting. - -14. A pattern such as /(?2)[]a()b](abc)/ which had a forward reference to a - non-existent subpattern following a character class starting with ']' and - containing () gave an internal compiling error instead of "reference to - non-existent subpattern". Fortunately, when the pattern did exist, the - compiled code was correct. (When scanning forwards to check for the - existence of the subpattern, it was treating the data ']' as terminating - the class, so got the count wrong. When actually compiling, the reference - was subsequently set up correctly.) - -15. The "always fail" assertion (?!) is optimzed to (*FAIL) by pcre_compile; - it was being rejected as not supported by pcre_dfa_exec(), even though - other assertions are supported. I have made pcre_dfa_exec() support - (*FAIL). - -16. The implementation of 13c above involved the invention of a new opcode, - OP_ALLANY, which is like OP_ANY but doesn't check the /s flag. Since /s - cannot be changed at match time, I realized I could make a small - improvement to matching performance by compiling OP_ALLANY instead of - OP_ANY for "." when DOTALL was set, and then removing the runtime tests - on the OP_ANY path. - -17. Compiling pcretest on Windows with readline support failed without the - following two fixes: (1) Make the unistd.h include conditional on - HAVE_UNISTD_H; (2) #define isatty and fileno as _isatty and _fileno. - -18. Changed CMakeLists.txt and cmake/FindReadline.cmake to arrange for the - ncurses library to be included for pcretest when ReadLine support is - requested, but also to allow for it to be overridden. This patch came from - Daniel Bergström. - -19. There was a typo in the file ucpinternal.h where f0_rangeflag was defined - as 0x00f00000 instead of 0x00800000. Luckily, this would not have caused - any errors with the current Unicode tables. Thanks to Peter Kankowski for - spotting this. - - -Version 7.6 28-Jan-08 ---------------------- - -1. A character class containing a very large number of characters with - codepoints greater than 255 (in UTF-8 mode, of course) caused a buffer - overflow. - -2. Patch to cut out the "long long" test in pcrecpp_unittest when - HAVE_LONG_LONG is not defined. - -3. Applied Christian Ehrlicher's patch to update the CMake build files to - bring them up to date and include new features. This patch includes: - - - Fixed PH's badly added libz and libbz2 support. - - Fixed a problem with static linking. - - Added pcredemo. [But later removed - see 7 below.] - - Fixed dftables problem and added an option. - - Added a number of HAVE_XXX tests, including HAVE_WINDOWS_H and - HAVE_LONG_LONG. - - Added readline support for pcretest. - - Added an listing of the option settings after cmake has run. - -4. A user submitted a patch to Makefile that makes it easy to create - "pcre.dll" under mingw when using Configure/Make. I added stuff to - Makefile.am that cause it to include this special target, without - affecting anything else. Note that the same mingw target plus all - the other distribution libraries and programs are now supported - when configuring with CMake (see 6 below) instead of with - Configure/Make. - -5. Applied Craig's patch that moves no_arg into the RE class in the C++ code. - This is an attempt to solve the reported problem "pcrecpp::no_arg is not - exported in the Windows port". It has not yet been confirmed that the patch - solves the problem, but it does no harm. - -6. Applied Sheri's patch to CMakeLists.txt to add NON_STANDARD_LIB_PREFIX and - NON_STANDARD_LIB_SUFFIX for dll names built with mingw when configured - with CMake, and also correct the comment about stack recursion. - -7. Remove the automatic building of pcredemo from the ./configure system and - from CMakeLists.txt. The whole idea of pcredemo.c is that it is an example - of a program that users should build themselves after PCRE is installed, so - building it automatically is not really right. What is more, it gave - trouble in some build environments. - -8. Further tidies to CMakeLists.txt from Sheri and Christian. - - -Version 7.5 10-Jan-08 ---------------------- - -1. Applied a patch from Craig: "This patch makes it possible to 'ignore' - values in parens when parsing an RE using the C++ wrapper." - -2. Negative specials like \S did not work in character classes in UTF-8 mode. - Characters greater than 255 were excluded from the class instead of being - included. - -3. The same bug as (2) above applied to negated POSIX classes such as - [:^space:]. - -4. PCRECPP_STATIC was referenced in pcrecpp_internal.h, but nowhere was it - defined or documented. It seems to have been a typo for PCRE_STATIC, so - I have changed it. - -5. The construct (?&) was not diagnosed as a syntax error (it referenced the - first named subpattern) and a construct such as (?&a) would reference the - first named subpattern whose name started with "a" (in other words, the - length check was missing). Both these problems are fixed. "Subpattern name - expected" is now given for (?&) (a zero-length name), and this patch also - makes it give the same error for \k'' (previously it complained that that - was a reference to a non-existent subpattern). - -6. The erroneous patterns (?+-a) and (?-+a) give different error messages; - this is right because (?- can be followed by option settings as well as by - digits. I have, however, made the messages clearer. - -7. Patterns such as (?(1)a|b) (a pattern that contains fewer subpatterns - than the number used in the conditional) now cause a compile-time error. - This is actually not compatible with Perl, which accepts such patterns, but - treats the conditional as always being FALSE (as PCRE used to), but it - seems to me that giving a diagnostic is better. - -8. Change "alphameric" to the more common word "alphanumeric" in comments - and messages. - -9. Fix two occurrences of "backslash" in comments that should have been - "backspace". - -10. Remove two redundant lines of code that can never be obeyed (their function - was moved elsewhere). - -11. The program that makes PCRE's Unicode character property table had a bug - which caused it to generate incorrect table entries for sequences of - characters that have the same character type, but are in different scripts. - It amalgamated them into a single range, with the script of the first of - them. In other words, some characters were in the wrong script. There were - thirteen such cases, affecting characters in the following ranges: - - U+002b0 - U+002c1 - U+0060c - U+0060d - U+0061e - U+00612 - U+0064b - U+0065e - U+0074d - U+0076d - U+01800 - U+01805 - U+01d00 - U+01d77 - U+01d9b - U+01dbf - U+0200b - U+0200f - U+030fc - U+030fe - U+03260 - U+0327f - U+0fb46 - U+0fbb1 - U+10450 - U+1049d - -12. The -o option (show only the matching part of a line) for pcregrep was not - compatible with GNU grep in that, if there was more than one match in a - line, it showed only the first of them. It now behaves in the same way as - GNU grep. - -13. If the -o and -v options were combined for pcregrep, it printed a blank - line for every non-matching line. GNU grep prints nothing, and pcregrep now - does the same. The return code can be used to tell if there were any - non-matching lines. - -14. Added --file-offsets and --line-offsets to pcregrep. - -15. The pattern (?=something)(?R) was not being diagnosed as a potentially - infinitely looping recursion. The bug was that positive lookaheads were not - being skipped when checking for a possible empty match (negative lookaheads - and both kinds of lookbehind were skipped). - -16. Fixed two typos in the Windows-only code in pcregrep.c, and moved the - inclusion of to before rather than after the definition of - INVALID_FILE_ATTRIBUTES (patch from David Byron). - -17. Specifying a possessive quantifier with a specific limit for a Unicode - character property caused pcre_compile() to compile bad code, which led at - runtime to PCRE_ERROR_INTERNAL (-14). Examples of patterns that caused this - are: /\p{Zl}{2,3}+/8 and /\p{Cc}{2}+/8. It was the possessive "+" that - caused the error; without that there was no problem. - -18. Added --enable-pcregrep-libz and --enable-pcregrep-libbz2. - -19. Added --enable-pcretest-libreadline. - -20. In pcrecpp.cc, the variable 'count' was incremented twice in - RE::GlobalReplace(). As a result, the number of replacements returned was - double what it should be. I removed one of the increments, but Craig sent a - later patch that removed the other one (the right fix) and added unit tests - that check the return values (which was not done before). - -21. Several CMake things: - - (1) Arranged that, when cmake is used on Unix, the libraries end up with - the names libpcre and libpcreposix, not just pcre and pcreposix. - - (2) The above change means that pcretest and pcregrep are now correctly - linked with the newly-built libraries, not previously installed ones. - - (3) Added PCRE_SUPPORT_LIBREADLINE, PCRE_SUPPORT_LIBZ, PCRE_SUPPORT_LIBBZ2. - -22. In UTF-8 mode, with newline set to "any", a pattern such as .*a.*=.b.* - crashed when matching a string such as a\x{2029}b (note that \x{2029} is a - UTF-8 newline character). The key issue is that the pattern starts .*; - this means that the match must be either at the beginning, or after a - newline. The bug was in the code for advancing after a failed match and - checking that the new position followed a newline. It was not taking - account of UTF-8 characters correctly. - -23. PCRE was behaving differently from Perl in the way it recognized POSIX - character classes. PCRE was not treating the sequence [:...:] as a - character class unless the ... were all letters. Perl, however, seems to - allow any characters between [: and :], though of course it rejects as - unknown any "names" that contain non-letters, because all the known class - names consist only of letters. Thus, Perl gives an error for [[:1234:]], - for example, whereas PCRE did not - it did not recognize a POSIX character - class. This seemed a bit dangerous, so the code has been changed to be - closer to Perl. The behaviour is not identical to Perl, because PCRE will - diagnose an unknown class for, for example, [[:l\ower:]] where Perl will - treat it as [[:lower:]]. However, PCRE does now give "unknown" errors where - Perl does, and where it didn't before. - -24. Rewrite so as to remove the single use of %n from pcregrep because in some - Windows environments %n is disabled by default. - - -Version 7.4 21-Sep-07 ---------------------- - -1. Change 7.3/28 was implemented for classes by looking at the bitmap. This - means that a class such as [\s] counted as "explicit reference to CR or - LF". That isn't really right - the whole point of the change was to try to - help when there was an actual mention of one of the two characters. So now - the change happens only if \r or \n (or a literal CR or LF) character is - encountered. - -2. The 32-bit options word was also used for 6 internal flags, but the numbers - of both had grown to the point where there were only 3 bits left. - Fortunately, there was spare space in the data structure, and so I have - moved the internal flags into a new 16-bit field to free up more option - bits. - -3. The appearance of (?J) at the start of a pattern set the DUPNAMES option, - but did not set the internal JCHANGED flag - either of these is enough to - control the way the "get" function works - but the PCRE_INFO_JCHANGED - facility is supposed to tell if (?J) was ever used, so now (?J) at the - start sets both bits. - -4. Added options (at build time, compile time, exec time) to change \R from - matching any Unicode line ending sequence to just matching CR, LF, or CRLF. - -5. doc/pcresyntax.html was missing from the distribution. - -6. Put back the definition of PCRE_ERROR_NULLWSLIMIT, for backward - compatibility, even though it is no longer used. - -7. Added macro for snprintf to pcrecpp_unittest.cc and also for strtoll and - strtoull to pcrecpp.cc to select the available functions in WIN32 when the - windows.h file is present (where different names are used). [This was - reversed later after testing - see 16 below.] - -8. Changed all #include to #include "config.h". There were also - some further cases that I changed to "pcre.h". - -9. When pcregrep was used with the --colour option, it missed the line ending - sequence off the lines that it output. - -10. It was pointed out to me that arrays of string pointers cause lots of - relocations when a shared library is dynamically loaded. A technique of - using a single long string with a table of offsets can drastically reduce - these. I have refactored PCRE in four places to do this. The result is - dramatic: - - Originally: 290 - After changing UCP table: 187 - After changing error message table: 43 - After changing table of "verbs" 36 - After changing table of Posix names 22 - - Thanks to the folks working on Gregex for glib for this insight. - -11. --disable-stack-for-recursion caused compiling to fail unless -enable- - unicode-properties was also set. - -12. Updated the tests so that they work when \R is defaulted to ANYCRLF. - -13. Added checks for ANY and ANYCRLF to pcrecpp.cc where it previously - checked only for CRLF. - -14. Added casts to pcretest.c to avoid compiler warnings. - -15. Added Craig's patch to various pcrecpp modules to avoid compiler warnings. - -16. Added Craig's patch to remove the WINDOWS_H tests, that were not working, - and instead check for _strtoi64 explicitly, and avoid the use of snprintf() - entirely. This removes changes made in 7 above. - -17. The CMake files have been updated, and there is now more information about - building with CMake in the NON-UNIX-USE document. - - -Version 7.3 28-Aug-07 ---------------------- - - 1. In the rejigging of the build system that eventually resulted in 7.1, the - line "#include " was included in pcre_internal.h. The use of angle - brackets there is not right, since it causes compilers to look for an - installed pcre.h, not the version that is in the source that is being - compiled (which of course may be different). I have changed it back to: - - #include "pcre.h" - - I have a vague recollection that the change was concerned with compiling in - different directories, but in the new build system, that is taken care of - by the VPATH setting the Makefile. - - 2. The pattern .*$ when run in not-DOTALL UTF-8 mode with newline=any failed - when the subject happened to end in the byte 0x85 (e.g. if the last - character was \x{1ec5}). *Character* 0x85 is one of the "any" newline - characters but of course it shouldn't be taken as a newline when it is part - of another character. The bug was that, for an unlimited repeat of . in - not-DOTALL UTF-8 mode, PCRE was advancing by bytes rather than by - characters when looking for a newline. - - 3. A small performance improvement in the DOTALL UTF-8 mode .* case. - - 4. Debugging: adjusted the names of opcodes for different kinds of parentheses - in debug output. - - 5. Arrange to use "%I64d" instead of "%lld" and "%I64u" instead of "%llu" for - long printing in the pcrecpp unittest when running under MinGW. - - 6. ESC_K was left out of the EBCDIC table. - - 7. Change 7.0/38 introduced a new limit on the number of nested non-capturing - parentheses; I made it 1000, which seemed large enough. Unfortunately, the - limit also applies to "virtual nesting" when a pattern is recursive, and in - this case 1000 isn't so big. I have been able to remove this limit at the - expense of backing off one optimization in certain circumstances. Normally, - when pcre_exec() would call its internal match() function recursively and - immediately return the result unconditionally, it uses a "tail recursion" - feature to save stack. However, when a subpattern that can match an empty - string has an unlimited repetition quantifier, it no longer makes this - optimization. That gives it a stack frame in which to save the data for - checking that an empty string has been matched. Previously this was taken - from the 1000-entry workspace that had been reserved. So now there is no - explicit limit, but more stack is used. - - 8. Applied Daniel's patches to solve problems with the import/export magic - syntax that is required for Windows, and which was going wrong for the - pcreposix and pcrecpp parts of the library. These were overlooked when this - problem was solved for the main library. - - 9. There were some crude static tests to avoid integer overflow when computing - the size of patterns that contain repeated groups with explicit upper - limits. As the maximum quantifier is 65535, the maximum group length was - set at 30,000 so that the product of these two numbers did not overflow a - 32-bit integer. However, it turns out that people want to use groups that - are longer than 30,000 bytes (though not repeat them that many times). - Change 7.0/17 (the refactoring of the way the pattern size is computed) has - made it possible to implement the integer overflow checks in a much more - dynamic way, which I have now done. The artificial limitation on group - length has been removed - we now have only the limit on the total length of - the compiled pattern, which depends on the LINK_SIZE setting. - -10. Fixed a bug in the documentation for get/copy named substring when - duplicate names are permitted. If none of the named substrings are set, the - functions return PCRE_ERROR_NOSUBSTRING (7); the doc said they returned an - empty string. - -11. Because Perl interprets \Q...\E at a high level, and ignores orphan \E - instances, patterns such as [\Q\E] or [\E] or even [^\E] cause an error, - because the ] is interpreted as the first data character and the - terminating ] is not found. PCRE has been made compatible with Perl in this - regard. Previously, it interpreted [\Q\E] as an empty class, and [\E] could - cause memory overwriting. - -10. Like Perl, PCRE automatically breaks an unlimited repeat after an empty - string has been matched (to stop an infinite loop). It was not recognizing - a conditional subpattern that could match an empty string if that - subpattern was within another subpattern. For example, it looped when - trying to match (((?(1)X|))*) but it was OK with ((?(1)X|)*) where the - condition was not nested. This bug has been fixed. - -12. A pattern like \X?\d or \P{L}?\d in non-UTF-8 mode could cause a backtrack - past the start of the subject in the presence of bytes with the top bit - set, for example "\x8aBCD". - -13. Added Perl 5.10 experimental backtracking controls (*FAIL), (*F), (*PRUNE), - (*SKIP), (*THEN), (*COMMIT), and (*ACCEPT). - -14. Optimized (?!) to (*FAIL). - -15. Updated the test for a valid UTF-8 string to conform to the later RFC 3629. - This restricts code points to be within the range 0 to 0x10FFFF, excluding - the "low surrogate" sequence 0xD800 to 0xDFFF. Previously, PCRE allowed the - full range 0 to 0x7FFFFFFF, as defined by RFC 2279. Internally, it still - does: it's just the validity check that is more restrictive. - -16. Inserted checks for integer overflows during escape sequence (backslash) - processing, and also fixed erroneous offset values for syntax errors during - backslash processing. - -17. Fixed another case of looking too far back in non-UTF-8 mode (cf 12 above) - for patterns like [\PPP\x8a]{1,}\x80 with the subject "A\x80". - -18. An unterminated class in a pattern like (?1)\c[ with a "forward reference" - caused an overrun. - -19. A pattern like (?:[\PPa*]*){8,} which had an "extended class" (one with - something other than just ASCII characters) inside a group that had an - unlimited repeat caused a loop at compile time (while checking to see - whether the group could match an empty string). - -20. Debugging a pattern containing \p or \P could cause a crash. For example, - [\P{Any}] did so. (Error in the code for printing property names.) - -21. An orphan \E inside a character class could cause a crash. - -22. A repeated capturing bracket such as (A)? could cause a wild memory - reference during compilation. - -23. There are several functions in pcre_compile() that scan along a compiled - expression for various reasons (e.g. to see if it's fixed length for look - behind). There were bugs in these functions when a repeated \p or \P was - present in the pattern. These operators have additional parameters compared - with \d, etc, and these were not being taken into account when moving along - the compiled data. Specifically: - - (a) A item such as \p{Yi}{3} in a lookbehind was not treated as fixed - length. - - (b) An item such as \pL+ within a repeated group could cause crashes or - loops. - - (c) A pattern such as \p{Yi}+(\P{Yi}+)(?1) could give an incorrect - "reference to non-existent subpattern" error. - - (d) A pattern like (\P{Yi}{2}\277)? could loop at compile time. - -24. A repeated \S or \W in UTF-8 mode could give wrong answers when multibyte - characters were involved (for example /\S{2}/8g with "A\x{a3}BC"). - -25. Using pcregrep in multiline, inverted mode (-Mv) caused it to loop. - -26. Patterns such as [\P{Yi}A] which include \p or \P and just one other - character were causing crashes (broken optimization). - -27. Patterns such as (\P{Yi}*\277)* (group with possible zero repeat containing - \p or \P) caused a compile-time loop. - -28. More problems have arisen in unanchored patterns when CRLF is a valid line - break. For example, the unstudied pattern [\r\n]A does not match the string - "\r\nA" because change 7.0/46 below moves the current point on by two - characters after failing to match at the start. However, the pattern \nA - *does* match, because it doesn't start till \n, and if [\r\n]A is studied, - the same is true. There doesn't seem any very clean way out of this, but - what I have chosen to do makes the common cases work: PCRE now takes note - of whether there can be an explicit match for \r or \n anywhere in the - pattern, and if so, 7.0/46 no longer applies. As part of this change, - there's a new PCRE_INFO_HASCRORLF option for finding out whether a compiled - pattern has explicit CR or LF references. - -29. Added (*CR) etc for changing newline setting at start of pattern. - - -Version 7.2 19-Jun-07 ---------------------- - - 1. If the fr_FR locale cannot be found for test 3, try the "french" locale, - which is apparently normally available under Windows. - - 2. Re-jig the pcregrep tests with different newline settings in an attempt - to make them independent of the local environment's newline setting. - - 3. Add code to configure.ac to remove -g from the CFLAGS default settings. - - 4. Some of the "internals" tests were previously cut out when the link size - was not 2, because the output contained actual offsets. The recent new - "Z" feature of pcretest means that these can be cut out, making the tests - usable with all link sizes. - - 5. Implemented Stan Switzer's goto replacement for longjmp() when not using - stack recursion. This gives a massive performance boost under BSD, but just - a small improvement under Linux. However, it saves one field in the frame - in all cases. - - 6. Added more features from the forthcoming Perl 5.10: - - (a) (?-n) (where n is a string of digits) is a relative subroutine or - recursion call. It refers to the nth most recently opened parentheses. - - (b) (?+n) is also a relative subroutine call; it refers to the nth next - to be opened parentheses. - - (c) Conditions that refer to capturing parentheses can be specified - relatively, for example, (?(-2)... or (?(+3)... - - (d) \K resets the start of the current match so that everything before - is not part of it. - - (e) \k{name} is synonymous with \k and \k'name' (.NET compatible). - - (f) \g{name} is another synonym - part of Perl 5.10's unification of - reference syntax. - - (g) (?| introduces a group in which the numbering of parentheses in each - alternative starts with the same number. - - (h) \h, \H, \v, and \V match horizontal and vertical whitespace. - - 7. Added two new calls to pcre_fullinfo(): PCRE_INFO_OKPARTIAL and - PCRE_INFO_JCHANGED. - - 8. A pattern such as (.*(.)?)* caused pcre_exec() to fail by either not - terminating or by crashing. Diagnosed by Viktor Griph; it was in the code - for detecting groups that can match an empty string. - - 9. A pattern with a very large number of alternatives (more than several - hundred) was running out of internal workspace during the pre-compile - phase, where pcre_compile() figures out how much memory will be needed. A - bit of new cunning has reduced the workspace needed for groups with - alternatives. The 1000-alternative test pattern now uses 12 bytes of - workspace instead of running out of the 4096 that are available. - -10. Inserted some missing (unsigned int) casts to get rid of compiler warnings. - -11. Applied patch from Google to remove an optimization that didn't quite work. - The report of the bug said: - - pcrecpp::RE("a*").FullMatch("aaa") matches, while - pcrecpp::RE("a*?").FullMatch("aaa") does not, and - pcrecpp::RE("a*?\\z").FullMatch("aaa") does again. - -12. If \p or \P was used in non-UTF-8 mode on a character greater than 127 - it matched the wrong number of bytes. - - -Version 7.1 24-Apr-07 ---------------------- - - 1. Applied Bob Rossi and Daniel G's patches to convert the build system to one - that is more "standard", making use of automake and other Autotools. There - is some re-arrangement of the files and adjustment of comments consequent - on this. - - 2. Part of the patch fixed a problem with the pcregrep tests. The test of -r - for recursive directory scanning broke on some systems because the files - are not scanned in any specific order and on different systems the order - was different. A call to "sort" has been inserted into RunGrepTest for the - approprate test as a short-term fix. In the longer term there may be an - alternative. - - 3. I had an email from Eric Raymond about problems translating some of PCRE's - man pages to HTML (despite the fact that I distribute HTML pages, some - people do their own conversions for various reasons). The problems - concerned the use of low-level troff macros .br and .in. I have therefore - removed all such uses from the man pages (some were redundant, some could - be replaced by .nf/.fi pairs). The 132html script that I use to generate - HTML has been updated to handle .nf/.fi and to complain if it encounters - .br or .in. - - 4. Updated comments in configure.ac that get placed in config.h.in and also - arranged for config.h to be included in the distribution, with the name - config.h.generic, for the benefit of those who have to compile without - Autotools (compare pcre.h, which is now distributed as pcre.h.generic). - - 5. Updated the support (such as it is) for Virtual Pascal, thanks to Stefan - Weber: (1) pcre_internal.h was missing some function renames; (2) updated - makevp.bat for the current PCRE, using the additional files - makevp_c.txt, makevp_l.txt, and pcregexp.pas. - - 6. A Windows user reported a minor discrepancy with test 2, which turned out - to be caused by a trailing space on an input line that had got lost in his - copy. The trailing space was an accident, so I've just removed it. - - 7. Add -Wl,-R... flags in pcre-config.in for *BSD* systems, as I'm told - that is needed. - - 8. Mark ucp_table (in ucptable.h) and ucp_gentype (in pcre_ucp_searchfuncs.c) - as "const" (a) because they are and (b) because it helps the PHP - maintainers who have recently made a script to detect big data structures - in the php code that should be moved to the .rodata section. I remembered - to update Builducptable as well, so it won't revert if ucptable.h is ever - re-created. - - 9. Added some extra #ifdef SUPPORT_UTF8 conditionals into pcretest.c, - pcre_printint.src, pcre_compile.c, pcre_study.c, and pcre_tables.c, in - order to be able to cut out the UTF-8 tables in the latter when UTF-8 - support is not required. This saves 1.5-2K of code, which is important in - some applications. - - Later: more #ifdefs are needed in pcre_ord2utf8.c and pcre_valid_utf8.c - so as not to refer to the tables, even though these functions will never be - called when UTF-8 support is disabled. Otherwise there are problems with a - shared library. - -10. Fixed two bugs in the emulated memmove() function in pcre_internal.h: - - (a) It was defining its arguments as char * instead of void *. - - (b) It was assuming that all moves were upwards in memory; this was true - a long time ago when I wrote it, but is no longer the case. - - The emulated memove() is provided for those environments that have neither - memmove() nor bcopy(). I didn't think anyone used it these days, but that - is clearly not the case, as these two bugs were recently reported. - -11. The script PrepareRelease is now distributed: it calls 132html, CleanTxt, - and Detrail to create the HTML documentation, the .txt form of the man - pages, and it removes trailing spaces from listed files. It also creates - pcre.h.generic and config.h.generic from pcre.h and config.h. In the latter - case, it wraps all the #defines with #ifndefs. This script should be run - before "make dist". - -12. Fixed two fairly obscure bugs concerned with quantified caseless matching - with Unicode property support. - - (a) For a maximizing quantifier, if the two different cases of the - character were of different lengths in their UTF-8 codings (there are - some cases like this - I found 11), and the matching function had to - back up over a mixture of the two cases, it incorrectly assumed they - were both the same length. - - (b) When PCRE was configured to use the heap rather than the stack for - recursion during matching, it was not correctly preserving the data for - the other case of a UTF-8 character when checking ahead for a match - while processing a minimizing repeat. If the check also involved - matching a wide character, but failed, corruption could cause an - erroneous result when trying to check for a repeat of the original - character. - -13. Some tidying changes to the testing mechanism: - - (a) The RunTest script now detects the internal link size and whether there - is UTF-8 and UCP support by running ./pcretest -C instead of relying on - values substituted by "configure". (The RunGrepTest script already did - this for UTF-8.) The configure.ac script no longer substitutes the - relevant variables. - - (b) The debugging options /B and /D in pcretest show the compiled bytecode - with length and offset values. This means that the output is different - for different internal link sizes. Test 2 is skipped for link sizes - other than 2 because of this, bypassing the problem. Unfortunately, - there was also a test in test 3 (the locale tests) that used /B and - failed for link sizes other than 2. Rather than cut the whole test out, - I have added a new /Z option to pcretest that replaces the length and - offset values with spaces. This is now used to make test 3 independent - of link size. (Test 2 will be tidied up later.) - -14. If erroroffset was passed as NULL to pcre_compile, it provoked a - segmentation fault instead of returning the appropriate error message. - -15. In multiline mode when the newline sequence was set to "any", the pattern - ^$ would give a match between the \r and \n of a subject such as "A\r\nB". - This doesn't seem right; it now treats the CRLF combination as the line - ending, and so does not match in that case. It's only a pattern such as ^$ - that would hit this one: something like ^ABC$ would have failed after \r - and then tried again after \r\n. - -16. Changed the comparison command for RunGrepTest from "diff -u" to "diff -ub" - in an attempt to make files that differ only in their line terminators - compare equal. This works on Linux. - -17. Under certain error circumstances pcregrep might try to free random memory - as it exited. This is now fixed, thanks to valgrind. - -19. In pcretest, if the pattern /(?m)^$/g was matched against the string - "abc\r\n\r\n", it found an unwanted second match after the second \r. This - was because its rules for how to advance for /g after matching an empty - string at the end of a line did not allow for this case. They now check for - it specially. - -20. pcretest is supposed to handle patterns and data of any length, by - extending its buffers when necessary. It was getting this wrong when the - buffer for a data line had to be extended. - -21. Added PCRE_NEWLINE_ANYCRLF which is like ANY, but matches only CR, LF, or - CRLF as a newline sequence. - -22. Code for handling Unicode properties in pcre_dfa_exec() wasn't being cut - out by #ifdef SUPPORT_UCP. This did no harm, as it could never be used, but - I have nevertheless tidied it up. - -23. Added some casts to kill warnings from HP-UX ia64 compiler. - -24. Added a man page for pcre-config. - - -Version 7.0 19-Dec-06 ---------------------- - - 1. Fixed a signed/unsigned compiler warning in pcre_compile.c, shown up by - moving to gcc 4.1.1. - - 2. The -S option for pcretest uses setrlimit(); I had omitted to #include - sys/time.h, which is documented as needed for this function. It doesn't - seem to matter on Linux, but it showed up on some releases of OS X. - - 3. It seems that there are systems where bytes whose values are greater than - 127 match isprint() in the "C" locale. The "C" locale should be the - default when a C program starts up. In most systems, only ASCII printing - characters match isprint(). This difference caused the output from pcretest - to vary, making some of the tests fail. I have changed pcretest so that: - - (a) When it is outputting text in the compiled version of a pattern, bytes - other than 32-126 are always shown as hex escapes. - - (b) When it is outputting text that is a matched part of a subject string, - it does the same, unless a different locale has been set for the match - (using the /L modifier). In this case, it uses isprint() to decide. - - 4. Fixed a major bug that caused incorrect computation of the amount of memory - required for a compiled pattern when options that changed within the - pattern affected the logic of the preliminary scan that determines the - length. The relevant options are -x, and -i in UTF-8 mode. The result was - that the computed length was too small. The symptoms of this bug were - either the PCRE error "internal error: code overflow" from pcre_compile(), - or a glibc crash with a message such as "pcretest: free(): invalid next - size (fast)". Examples of patterns that provoked this bug (shown in - pcretest format) are: - - /(?-x: )/x - /(?x)(?-x: \s*#\s*)/ - /((?i)[\x{c0}])/8 - /(?i:[\x{c0}])/8 - - HOWEVER: Change 17 below makes this fix obsolete as the memory computation - is now done differently. - - 5. Applied patches from Google to: (a) add a QuoteMeta function to the C++ - wrapper classes; (b) implement a new function in the C++ scanner that is - more efficient than the old way of doing things because it avoids levels of - recursion in the regex matching; (c) add a paragraph to the documentation - for the FullMatch() function. - - 6. The escape sequence \n was being treated as whatever was defined as - "newline". Not only was this contrary to the documentation, which states - that \n is character 10 (hex 0A), but it also went horribly wrong when - "newline" was defined as CRLF. This has been fixed. - - 7. In pcre_dfa_exec.c the value of an unsigned integer (the variable called c) - was being set to -1 for the "end of line" case (supposedly a value that no - character can have). Though this value is never used (the check for end of - line is "zero bytes in current character"), it caused compiler complaints. - I've changed it to 0xffffffff. - - 8. In pcre_version.c, the version string was being built by a sequence of - C macros that, in the event of PCRE_PRERELEASE being defined as an empty - string (as it is for production releases) called a macro with an empty - argument. The C standard says the result of this is undefined. The gcc - compiler treats it as an empty string (which was what was wanted) but it is - reported that Visual C gives an error. The source has been hacked around to - avoid this problem. - - 9. On the advice of a Windows user, included and in Windows - builds of pcretest, and changed the call to _setmode() to use _O_BINARY - instead of 0x8000. Made all the #ifdefs test both _WIN32 and WIN32 (not all - of them did). - -10. Originally, pcretest opened its input and output without "b"; then I was - told that "b" was needed in some environments, so it was added for release - 5.0 to both the input and output. (It makes no difference on Unix-like - systems.) Later I was told that it is wrong for the input on Windows. I've - now abstracted the modes into two macros, to make it easier to fiddle with - them, and removed "b" from the input mode under Windows. - -11. Added pkgconfig support for the C++ wrapper library, libpcrecpp. - -12. Added -help and --help to pcretest as an official way of being reminded - of the options. - -13. Removed some redundant semicolons after macro calls in pcrecpparg.h.in - and pcrecpp.cc because they annoy compilers at high warning levels. - -14. A bit of tidying/refactoring in pcre_exec.c in the main bumpalong loop. - -15. Fixed an occurrence of == in configure.ac that should have been = (shell - scripts are not C programs :-) and which was not noticed because it works - on Linux. - -16. pcretest is supposed to handle any length of pattern and data line (as one - line or as a continued sequence of lines) by extending its input buffer if - necessary. This feature was broken for very long pattern lines, leading to - a string of junk being passed to pcre_compile() if the pattern was longer - than about 50K. - -17. I have done a major re-factoring of the way pcre_compile() computes the - amount of memory needed for a compiled pattern. Previously, there was code - that made a preliminary scan of the pattern in order to do this. That was - OK when PCRE was new, but as the facilities have expanded, it has become - harder and harder to keep it in step with the real compile phase, and there - have been a number of bugs (see for example, 4 above). I have now found a - cunning way of running the real compile function in a "fake" mode that - enables it to compute how much memory it would need, while actually only - ever using a few hundred bytes of working memory and without too many - tests of the mode. This should make future maintenance and development - easier. A side effect of this work is that the limit of 200 on the nesting - depth of parentheses has been removed (though this was never a serious - limitation, I suspect). However, there is a downside: pcre_compile() now - runs more slowly than before (30% or more, depending on the pattern). I - hope this isn't a big issue. There is no effect on runtime performance. - -18. Fixed a minor bug in pcretest: if a pattern line was not terminated by a - newline (only possible for the last line of a file) and it was a - pattern that set a locale (followed by /Lsomething), pcretest crashed. - -19. Added additional timing features to pcretest. (1) The -tm option now times - matching only, not compiling. (2) Both -t and -tm can be followed, as a - separate command line item, by a number that specifies the number of - repeats to use when timing. The default is 50000; this gives better - precision, but takes uncomfortably long for very large patterns. - -20. Extended pcre_study() to be more clever in cases where a branch of a - subpattern has no definite first character. For example, (a*|b*)[cd] would - previously give no result from pcre_study(). Now it recognizes that the - first character must be a, b, c, or d. - -21. There was an incorrect error "recursive call could loop indefinitely" if - a subpattern (or the entire pattern) that was being tested for matching an - empty string contained only one non-empty item after a nested subpattern. - For example, the pattern (?>\x{100}*)\d(?R) provoked this error - incorrectly, because the \d was being skipped in the check. - -22. The pcretest program now has a new pattern option /B and a command line - option -b, which is equivalent to adding /B to every pattern. This causes - it to show the compiled bytecode, without the additional information that - -d shows. The effect of -d is now the same as -b with -i (and similarly, /D - is the same as /B/I). - -23. A new optimization is now able automatically to treat some sequences such - as a*b as a*+b. More specifically, if something simple (such as a character - or a simple class like \d) has an unlimited quantifier, and is followed by - something that cannot possibly match the quantified thing, the quantifier - is automatically "possessified". - -24. A recursive reference to a subpattern whose number was greater than 39 - went wrong under certain circumstances in UTF-8 mode. This bug could also - have affected the operation of pcre_study(). - -25. Realized that a little bit of performance could be had by replacing - (c & 0xc0) == 0xc0 with c >= 0xc0 when processing UTF-8 characters. - -26. Timing data from pcretest is now shown to 4 decimal places instead of 3. - -27. Possessive quantifiers such as a++ were previously implemented by turning - them into atomic groups such as ($>a+). Now they have their own opcodes, - which improves performance. This includes the automatically created ones - from 23 above. - -28. A pattern such as (?=(\w+))\1: which simulates an atomic group using a - lookahead was broken if it was not anchored. PCRE was mistakenly expecting - the first matched character to be a colon. This applied both to named and - numbered groups. - -29. The ucpinternal.h header file was missing its idempotency #ifdef. - -30. I was sent a "project" file called libpcre.a.dev which I understand makes - building PCRE on Windows easier, so I have included it in the distribution. - -31. There is now a check in pcretest against a ridiculously large number being - returned by pcre_exec() or pcre_dfa_exec(). If this happens in a /g or /G - loop, the loop is abandoned. - -32. Forward references to subpatterns in conditions such as (?(2)...) where - subpattern 2 is defined later cause pcre_compile() to search forwards in - the pattern for the relevant set of parentheses. This search went wrong - when there were unescaped parentheses in a character class, parentheses - escaped with \Q...\E, or parentheses in a #-comment in /x mode. - -33. "Subroutine" calls and backreferences were previously restricted to - referencing subpatterns earlier in the regex. This restriction has now - been removed. - -34. Added a number of extra features that are going to be in Perl 5.10. On the - whole, these are just syntactic alternatives for features that PCRE had - previously implemented using the Python syntax or my own invention. The - other formats are all retained for compatibility. - - (a) Named groups can now be defined as (?...) or (?'name'...) as well - as (?P...). The new forms, as well as being in Perl 5.10, are - also .NET compatible. - - (b) A recursion or subroutine call to a named group can now be defined as - (?&name) as well as (?P>name). - - (c) A backreference to a named group can now be defined as \k or - \k'name' as well as (?P=name). The new forms, as well as being in Perl - 5.10, are also .NET compatible. - - (d) A conditional reference to a named group can now use the syntax - (?() or (?('name') as well as (?(name). - - (e) A "conditional group" of the form (?(DEFINE)...) can be used to define - groups (named and numbered) that are never evaluated inline, but can be - called as "subroutines" from elsewhere. In effect, the DEFINE condition - is always false. There may be only one alternative in such a group. - - (f) A test for recursion can be given as (?(R1).. or (?(R&name)... as well - as the simple (?(R). The condition is true only if the most recent - recursion is that of the given number or name. It does not search out - through the entire recursion stack. - - (g) The escape \gN or \g{N} has been added, where N is a positive or - negative number, specifying an absolute or relative reference. - -35. Tidied to get rid of some further signed/unsigned compiler warnings and - some "unreachable code" warnings. - -36. Updated the Unicode property tables to Unicode version 5.0.0. Amongst other - things, this adds five new scripts. - -37. Perl ignores orphaned \E escapes completely. PCRE now does the same. - There were also incompatibilities regarding the handling of \Q..\E inside - character classes, for example with patterns like [\Qa\E-\Qz\E] where the - hyphen was adjacent to \Q or \E. I hope I've cleared all this up now. - -38. Like Perl, PCRE detects when an indefinitely repeated parenthesized group - matches an empty string, and forcibly breaks the loop. There were bugs in - this code in non-simple cases. For a pattern such as ^(a()*)* matched - against aaaa the result was just "a" rather than "aaaa", for example. Two - separate and independent bugs (that affected different cases) have been - fixed. - -39. Refactored the code to abolish the use of different opcodes for small - capturing bracket numbers. This is a tidy that I avoided doing when I - removed the limit on the number of capturing brackets for 3.5 back in 2001. - The new approach is not only tidier, it makes it possible to reduce the - memory needed to fix the previous bug (38). - -40. Implemented PCRE_NEWLINE_ANY to recognize any of the Unicode newline - sequences (http://unicode.org/unicode/reports/tr18/) as "newline" when - processing dot, circumflex, or dollar metacharacters, or #-comments in /x - mode. - -41. Add \R to match any Unicode newline sequence, as suggested in the Unicode - report. - -42. Applied patch, originally from Ari Pollak, modified by Google, to allow - copy construction and assignment in the C++ wrapper. - -43. Updated pcregrep to support "--newline=any". In the process, I fixed a - couple of bugs that could have given wrong results in the "--newline=crlf" - case. - -44. Added a number of casts and did some reorganization of signed/unsigned int - variables following suggestions from Dair Grant. Also renamed the variable - "this" as "item" because it is a C++ keyword. - -45. Arranged for dftables to add - - #include "pcre_internal.h" - - to pcre_chartables.c because without it, gcc 4.x may remove the array - definition from the final binary if PCRE is built into a static library and - dead code stripping is activated. - -46. For an unanchored pattern, if a match attempt fails at the start of a - newline sequence, and the newline setting is CRLF or ANY, and the next two - characters are CRLF, advance by two characters instead of one. - - -Version 6.7 04-Jul-06 ---------------------- - - 1. In order to handle tests when input lines are enormously long, pcretest has - been re-factored so that it automatically extends its buffers when - necessary. The code is crude, but this _is_ just a test program. The - default size has been increased from 32K to 50K. - - 2. The code in pcre_study() was using the value of the re argument before - testing it for NULL. (Of course, in any sensible call of the function, it - won't be NULL.) - - 3. The memmove() emulation function in pcre_internal.h, which is used on - systems that lack both memmove() and bcopy() - that is, hardly ever - - was missing a "static" storage class specifier. - - 4. When UTF-8 mode was not set, PCRE looped when compiling certain patterns - containing an extended class (one that cannot be represented by a bitmap - because it contains high-valued characters or Unicode property items, e.g. - [\pZ]). Almost always one would set UTF-8 mode when processing such a - pattern, but PCRE should not loop if you do not (it no longer does). - [Detail: two cases were found: (a) a repeated subpattern containing an - extended class; (b) a recursive reference to a subpattern that followed a - previous extended class. It wasn't skipping over the extended class - correctly when UTF-8 mode was not set.] - - 5. A negated single-character class was not being recognized as fixed-length - in lookbehind assertions such as (?<=[^f]), leading to an incorrect - compile error "lookbehind assertion is not fixed length". - - 6. The RunPerlTest auxiliary script was showing an unexpected difference - between PCRE and Perl for UTF-8 tests. It turns out that it is hard to - write a Perl script that can interpret lines of an input file either as - byte characters or as UTF-8, which is what "perltest" was being required to - do for the non-UTF-8 and UTF-8 tests, respectively. Essentially what you - can't do is switch easily at run time between having the "use utf8;" pragma - or not. In the end, I fudged it by using the RunPerlTest script to insert - "use utf8;" explicitly for the UTF-8 tests. - - 7. In multiline (/m) mode, PCRE was matching ^ after a terminating newline at - the end of the subject string, contrary to the documentation and to what - Perl does. This was true of both matching functions. Now it matches only at - the start of the subject and immediately after *internal* newlines. - - 8. A call of pcre_fullinfo() from pcretest to get the option bits was passing - a pointer to an int instead of a pointer to an unsigned long int. This - caused problems on 64-bit systems. - - 9. Applied a patch from the folks at Google to pcrecpp.cc, to fix "another - instance of the 'standard' template library not being so standard". - -10. There was no check on the number of named subpatterns nor the maximum - length of a subpattern name. The product of these values is used to compute - the size of the memory block for a compiled pattern. By supplying a very - long subpattern name and a large number of named subpatterns, the size - computation could be caused to overflow. This is now prevented by limiting - the length of names to 32 characters, and the number of named subpatterns - to 10,000. - -11. Subpatterns that are repeated with specific counts have to be replicated in - the compiled pattern. The size of memory for this was computed from the - length of the subpattern and the repeat count. The latter is limited to - 65535, but there was no limit on the former, meaning that integer overflow - could in principle occur. The compiled length of a repeated subpattern is - now limited to 30,000 bytes in order to prevent this. - -12. Added the optional facility to have named substrings with the same name. - -13. Added the ability to use a named substring as a condition, using the - Python syntax: (?(name)yes|no). This overloads (?(R)... and names that - are numbers (not recommended). Forward references are permitted. - -14. Added forward references in named backreferences (if you see what I mean). - -15. In UTF-8 mode, with the PCRE_DOTALL option set, a quantified dot in the - pattern could run off the end of the subject. For example, the pattern - "(?s)(.{1,5})"8 did this with the subject "ab". - -16. If PCRE_DOTALL or PCRE_MULTILINE were set, pcre_dfa_exec() behaved as if - PCRE_CASELESS was set when matching characters that were quantified with ? - or *. - -17. A character class other than a single negated character that had a minimum - but no maximum quantifier - for example [ab]{6,} - was not handled - correctly by pce_dfa_exec(). It would match only one character. - -18. A valid (though odd) pattern that looked like a POSIX character - class but used an invalid character after [ (for example [[,abc,]]) caused - pcre_compile() to give the error "Failed: internal error: code overflow" or - in some cases to crash with a glibc free() error. This could even happen if - the pattern terminated after [[ but there just happened to be a sequence of - letters, a binary zero, and a closing ] in the memory that followed. - -19. Perl's treatment of octal escapes in the range \400 to \777 has changed - over the years. Originally (before any Unicode support), just the bottom 8 - bits were taken. Thus, for example, \500 really meant \100. Nowadays the - output from "man perlunicode" includes this: - - The regular expression compiler produces polymorphic opcodes. That - is, the pattern adapts to the data and automatically switches to - the Unicode character scheme when presented with Unicode data--or - instead uses a traditional byte scheme when presented with byte - data. - - Sadly, a wide octal escape does not cause a switch, and in a string with - no other multibyte characters, these octal escapes are treated as before. - Thus, in Perl, the pattern /\500/ actually matches \100 but the pattern - /\500|\x{1ff}/ matches \500 or \777 because the whole thing is treated as a - Unicode string. - - I have not perpetrated such confusion in PCRE. Up till now, it took just - the bottom 8 bits, as in old Perl. I have now made octal escapes with - values greater than \377 illegal in non-UTF-8 mode. In UTF-8 mode they - translate to the appropriate multibyte character. - -29. Applied some refactoring to reduce the number of warnings from Microsoft - and Borland compilers. This has included removing the fudge introduced - seven years ago for the OS/2 compiler (see 2.02/2 below) because it caused - a warning about an unused variable. - -21. PCRE has not included VT (character 0x0b) in the set of whitespace - characters since release 4.0, because Perl (from release 5.004) does not. - [Or at least, is documented not to: some releases seem to be in conflict - with the documentation.] However, when a pattern was studied with - pcre_study() and all its branches started with \s, PCRE still included VT - as a possible starting character. Of course, this did no harm; it just - caused an unnecessary match attempt. - -22. Removed a now-redundant internal flag bit that recorded the fact that case - dependency changed within the pattern. This was once needed for "required - byte" processing, but is no longer used. This recovers a now-scarce options - bit. Also moved the least significant internal flag bit to the most- - significant bit of the word, which was not previously used (hangover from - the days when it was an int rather than a uint) to free up another bit for - the future. - -23. Added support for CRLF line endings as well as CR and LF. As well as the - default being selectable at build time, it can now be changed at runtime - via the PCRE_NEWLINE_xxx flags. There are now options for pcregrep to - specify that it is scanning data with non-default line endings. - -24. Changed the definition of CXXLINK to make it agree with the definition of - LINK in the Makefile, by replacing LDFLAGS to CXXFLAGS. - -25. Applied Ian Taylor's patches to avoid using another stack frame for tail - recursions. This makes a big different to stack usage for some patterns. - -26. If a subpattern containing a named recursion or subroutine reference such - as (?P>B) was quantified, for example (xxx(?P>B)){3}, the calculation of - the space required for the compiled pattern went wrong and gave too small a - value. Depending on the environment, this could lead to "Failed: internal - error: code overflow at offset 49" or "glibc detected double free or - corruption" errors. - -27. Applied patches from Google (a) to support the new newline modes and (b) to - advance over multibyte UTF-8 characters in GlobalReplace. - -28. Change free() to pcre_free() in pcredemo.c. Apparently this makes a - difference for some implementation of PCRE in some Windows version. - -29. Added some extra testing facilities to pcretest: - - \q in a data line sets the "match limit" value - \Q in a data line sets the "match recursion limt" value - -S sets the stack size, where is in megabytes - - The -S option isn't available for Windows. - - -Version 6.6 06-Feb-06 ---------------------- - - 1. Change 16(a) for 6.5 broke things, because PCRE_DATA_SCOPE was not defined - in pcreposix.h. I have copied the definition from pcre.h. - - 2. Change 25 for 6.5 broke compilation in a build directory out-of-tree - because pcre.h is no longer a built file. - - 3. Added Jeff Friedl's additional debugging patches to pcregrep. These are - not normally included in the compiled code. - - -Version 6.5 01-Feb-06 ---------------------- - - 1. When using the partial match feature with pcre_dfa_exec(), it was not - anchoring the second and subsequent partial matches at the new starting - point. This could lead to incorrect results. For example, with the pattern - /1234/, partially matching against "123" and then "a4" gave a match. - - 2. Changes to pcregrep: - - (a) All non-match returns from pcre_exec() were being treated as failures - to match the line. Now, unless the error is PCRE_ERROR_NOMATCH, an - error message is output. Some extra information is given for the - PCRE_ERROR_MATCHLIMIT and PCRE_ERROR_RECURSIONLIMIT errors, which are - probably the only errors that are likely to be caused by users (by - specifying a regex that has nested indefinite repeats, for instance). - If there are more than 20 of these errors, pcregrep is abandoned. - - (b) A binary zero was treated as data while matching, but terminated the - output line if it was written out. This has been fixed: binary zeroes - are now no different to any other data bytes. - - (c) Whichever of the LC_ALL or LC_CTYPE environment variables is set is - used to set a locale for matching. The --locale=xxxx long option has - been added (no short equivalent) to specify a locale explicitly on the - pcregrep command, overriding the environment variables. - - (d) When -B was used with -n, some line numbers in the output were one less - than they should have been. - - (e) Added the -o (--only-matching) option. - - (f) If -A or -C was used with -c (count only), some lines of context were - accidentally printed for the final match. - - (g) Added the -H (--with-filename) option. - - (h) The combination of options -rh failed to suppress file names for files - that were found from directory arguments. - - (i) Added the -D (--devices) and -d (--directories) options. - - (j) Added the -F (--fixed-strings) option. - - (k) Allow "-" to be used as a file name for -f as well as for a data file. - - (l) Added the --colo(u)r option. - - (m) Added Jeffrey Friedl's -S testing option, but within #ifdefs so that it - is not present by default. - - 3. A nasty bug was discovered in the handling of recursive patterns, that is, - items such as (?R) or (?1), when the recursion could match a number of - alternatives. If it matched one of the alternatives, but subsequently, - outside the recursion, there was a failure, the code tried to back up into - the recursion. However, because of the way PCRE is implemented, this is not - possible, and the result was an incorrect result from the match. - - In order to prevent this happening, the specification of recursion has - been changed so that all such subpatterns are automatically treated as - atomic groups. Thus, for example, (?R) is treated as if it were (?>(?R)). - - 4. I had overlooked the fact that, in some locales, there are characters for - which isalpha() is true but neither isupper() nor islower() are true. In - the fr_FR locale, for instance, the \xAA and \xBA characters (ordmasculine - and ordfeminine) are like this. This affected the treatment of \w and \W - when they appeared in character classes, but not when they appeared outside - a character class. The bit map for "word" characters is now created - separately from the results of isalnum() instead of just taking it from the - upper, lower, and digit maps. (Plus the underscore character, of course.) - - 5. The above bug also affected the handling of POSIX character classes such as - [[:alpha:]] and [[:alnum:]]. These do not have their own bit maps in PCRE's - permanent tables. Instead, the bit maps for such a class were previously - created as the appropriate unions of the upper, lower, and digit bitmaps. - Now they are created by subtraction from the [[:word:]] class, which has - its own bitmap. - - 6. The [[:blank:]] character class matches horizontal, but not vertical space. - It is created by subtracting the vertical space characters (\x09, \x0a, - \x0b, \x0c) from the [[:space:]] bitmap. Previously, however, the - subtraction was done in the overall bitmap for a character class, meaning - that a class such as [\x0c[:blank:]] was incorrect because \x0c would not - be recognized. This bug has been fixed. - - 7. Patches from the folks at Google: - - (a) pcrecpp.cc: "to handle a corner case that may or may not happen in - real life, but is still worth protecting against". - - (b) pcrecpp.cc: "corrects a bug when negative radixes are used with - regular expressions". - - (c) pcre_scanner.cc: avoid use of std::count() because not all systems - have it. - - (d) Split off pcrecpparg.h from pcrecpp.h and had the former built by - "configure" and the latter not, in order to fix a problem somebody had - with compiling the Arg class on HP-UX. - - (e) Improve the error-handling of the C++ wrapper a little bit. - - (f) New tests for checking recursion limiting. - - 8. The pcre_memmove() function, which is used only if the environment does not - have a standard memmove() function (and is therefore rarely compiled), - contained two bugs: (a) use of int instead of size_t, and (b) it was not - returning a result (though PCRE never actually uses the result). - - 9. In the POSIX regexec() interface, if nmatch is specified as a ridiculously - large number - greater than INT_MAX/(3*sizeof(int)) - REG_ESPACE is - returned instead of calling malloc() with an overflowing number that would - most likely cause subsequent chaos. - -10. The debugging option of pcretest was not showing the NO_AUTO_CAPTURE flag. - -11. The POSIX flag REG_NOSUB is now supported. When a pattern that was compiled - with this option is matched, the nmatch and pmatch options of regexec() are - ignored. - -12. Added REG_UTF8 to the POSIX interface. This is not defined by POSIX, but is - provided in case anyone wants to the the POSIX interface with UTF-8 - strings. - -13. Added CXXLDFLAGS to the Makefile parameters to provide settings only on the - C++ linking (needed for some HP-UX environments). - -14. Avoid compiler warnings in get_ucpname() when compiled without UCP support - (unused parameter) and in the pcre_printint() function (omitted "default" - switch label when the default is to do nothing). - -15. Added some code to make it possible, when PCRE is compiled as a C++ - library, to replace subject pointers for pcre_exec() with a smart pointer - class, thus making it possible to process discontinuous strings. - -16. The two macros PCRE_EXPORT and PCRE_DATA_SCOPE are confusing, and perform - much the same function. They were added by different people who were trying - to make PCRE easy to compile on non-Unix systems. It has been suggested - that PCRE_EXPORT be abolished now that there is more automatic apparatus - for compiling on Windows systems. I have therefore replaced it with - PCRE_DATA_SCOPE. This is set automatically for Windows; if not set it - defaults to "extern" for C or "extern C" for C++, which works fine on - Unix-like systems. It is now possible to override the value of PCRE_DATA_ - SCOPE with something explicit in config.h. In addition: - - (a) pcreposix.h still had just "extern" instead of either of these macros; - I have replaced it with PCRE_DATA_SCOPE. - - (b) Functions such as _pcre_xclass(), which are internal to the library, - but external in the C sense, all had PCRE_EXPORT in their definitions. - This is apparently wrong for the Windows case, so I have removed it. - (It makes no difference on Unix-like systems.) - -17. Added a new limit, MATCH_LIMIT_RECURSION, which limits the depth of nesting - of recursive calls to match(). This is different to MATCH_LIMIT because - that limits the total number of calls to match(), not all of which increase - the depth of recursion. Limiting the recursion depth limits the amount of - stack (or heap if NO_RECURSE is set) that is used. The default can be set - when PCRE is compiled, and changed at run time. A patch from Google adds - this functionality to the C++ interface. - -18. Changes to the handling of Unicode character properties: - - (a) Updated the table to Unicode 4.1.0. - - (b) Recognize characters that are not in the table as "Cn" (undefined). - - (c) I revised the way the table is implemented to a much improved format - which includes recognition of ranges. It now supports the ranges that - are defined in UnicodeData.txt, and it also amalgamates other - characters into ranges. This has reduced the number of entries in the - table from around 16,000 to around 3,000, thus reducing its size - considerably. I realized I did not need to use a tree structure after - all - a binary chop search is just as efficient. Having reduced the - number of entries, I extended their size from 6 bytes to 8 bytes to - allow for more data. - - (d) Added support for Unicode script names via properties such as \p{Han}. - -19. In UTF-8 mode, a backslash followed by a non-Ascii character was not - matching that character. - -20. When matching a repeated Unicode property with a minimum greater than zero, - (for example \pL{2,}), PCRE could look past the end of the subject if it - reached it while seeking the minimum number of characters. This could - happen only if some of the characters were more than one byte long, because - there is a check for at least the minimum number of bytes. - -21. Refactored the implementation of \p and \P so as to be more general, to - allow for more different types of property in future. This has changed the - compiled form incompatibly. Anybody with saved compiled patterns that use - \p or \P will have to recompile them. - -22. Added "Any" and "L&" to the supported property types. - -23. Recognize \x{...} as a code point specifier, even when not in UTF-8 mode, - but give a compile time error if the value is greater than 0xff. - -24. The man pages for pcrepartial, pcreprecompile, and pcre_compile2 were - accidentally not being installed or uninstalled. - -25. The pcre.h file was built from pcre.h.in, but the only changes that were - made were to insert the current release number. This seemed silly, because - it made things harder for people building PCRE on systems that don't run - "configure". I have turned pcre.h into a distributed file, no longer built - by "configure", with the version identification directly included. There is - no longer a pcre.h.in file. - - However, this change necessitated a change to the pcre-config script as - well. It is built from pcre-config.in, and one of the substitutions was the - release number. I have updated configure.ac so that ./configure now finds - the release number by grepping pcre.h. - -26. Added the ability to run the tests under valgrind. - - -Version 6.4 05-Sep-05 ---------------------- - - 1. Change 6.0/10/(l) to pcregrep introduced a bug that caused separator lines - "--" to be printed when multiple files were scanned, even when none of the - -A, -B, or -C options were used. This is not compatible with Gnu grep, so I - consider it to be a bug, and have restored the previous behaviour. - - 2. A couple of code tidies to get rid of compiler warnings. - - 3. The pcretest program used to cheat by referring to symbols in the library - whose names begin with _pcre_. These are internal symbols that are not - really supposed to be visible externally, and in some environments it is - possible to suppress them. The cheating is now confined to including - certain files from the library's source, which is a bit cleaner. - - 4. Renamed pcre.in as pcre.h.in to go with pcrecpp.h.in; it also makes the - file's purpose clearer. - - 5. Reorganized pcre_ucp_findchar(). - - -Version 6.3 15-Aug-05 ---------------------- - - 1. The file libpcre.pc.in did not have general read permission in the tarball. - - 2. There were some problems when building without C++ support: - - (a) If C++ support was not built, "make install" and "make test" still - tried to test it. - - (b) There were problems when the value of CXX was explicitly set. Some - changes have been made to try to fix these, and ... - - (c) --disable-cpp can now be used to explicitly disable C++ support. - - (d) The use of @CPP_OBJ@ directly caused a blank line preceded by a - backslash in a target when C++ was disabled. This confuses some - versions of "make", apparently. Using an intermediate variable solves - this. (Same for CPP_LOBJ.) - - 3. $(LINK_FOR_BUILD) now includes $(CFLAGS_FOR_BUILD) and $(LINK) - (non-Windows) now includes $(CFLAGS) because these flags are sometimes - necessary on certain architectures. - - 4. Added a setting of -export-symbols-regex to the link command to remove - those symbols that are exported in the C sense, but actually are local - within the library, and not documented. Their names all begin with - "_pcre_". This is not a perfect job, because (a) we have to except some - symbols that pcretest ("illegally") uses, and (b) the facility isn't always - available (and never for static libraries). I have made a note to try to - find a way round (a) in the future. - - -Version 6.2 01-Aug-05 ---------------------- - - 1. There was no test for integer overflow of quantifier values. A construction - such as {1111111111111111} would give undefined results. What is worse, if - a minimum quantifier for a parenthesized subpattern overflowed and became - negative, the calculation of the memory size went wrong. This could have - led to memory overwriting. - - 2. Building PCRE using VPATH was broken. Hopefully it is now fixed. - - 3. Added "b" to the 2nd argument of fopen() in dftables.c, for non-Unix-like - operating environments where this matters. - - 4. Applied Giuseppe Maxia's patch to add additional features for controlling - PCRE options from within the C++ wrapper. - - 5. Named capturing subpatterns were not being correctly counted when a pattern - was compiled. This caused two problems: (a) If there were more than 100 - such subpatterns, the calculation of the memory needed for the whole - compiled pattern went wrong, leading to an overflow error. (b) Numerical - back references of the form \12, where the number was greater than 9, were - not recognized as back references, even though there were sufficient - previous subpatterns. - - 6. Two minor patches to pcrecpp.cc in order to allow it to compile on older - versions of gcc, e.g. 2.95.4. - - -Version 6.1 21-Jun-05 ---------------------- - - 1. There was one reference to the variable "posix" in pcretest.c that was not - surrounded by "#if !defined NOPOSIX". - - 2. Make it possible to compile pcretest without DFA support, UTF8 support, or - the cross-check on the old pcre_info() function, for the benefit of the - cut-down version of PCRE that is currently imported into Exim. - - 3. A (silly) pattern starting with (?i)(?-i) caused an internal space - allocation error. I've done the easy fix, which wastes 2 bytes for sensible - patterns that start (?i) but I don't think that matters. The use of (?i) is - just an example; this all applies to the other options as well. - - 4. Since libtool seems to echo the compile commands it is issuing, the output - from "make" can be reduced a bit by putting "@" in front of each libtool - compile command. - - 5. Patch from the folks at Google for configure.in to be a bit more thorough - in checking for a suitable C++ installation before trying to compile the - C++ stuff. This should fix a reported problem when a compiler was present, - but no suitable headers. - - 6. The man pages all had just "PCRE" as their title. I have changed them to - be the relevant file name. I have also arranged that these names are - retained in the file doc/pcre.txt, which is a concatenation in text format - of all the man pages except the little individual ones for each function. - - 7. The NON-UNIX-USE file had not been updated for the different set of source - files that come with release 6. I also added a few comments about the C++ - wrapper. - - -Version 6.0 07-Jun-05 ---------------------- - - 1. Some minor internal re-organization to help with my DFA experiments. - - 2. Some missing #ifdef SUPPORT_UCP conditionals in pcretest and printint that - didn't matter for the library itself when fully configured, but did matter - when compiling without UCP support, or within Exim, where the ucp files are - not imported. - - 3. Refactoring of the library code to split up the various functions into - different source modules. The addition of the new DFA matching code (see - below) to a single monolithic source would have made it really too - unwieldy, quite apart from causing all the code to be include in a - statically linked application, when only some functions are used. This is - relevant even without the DFA addition now that patterns can be compiled in - one application and matched in another. - - The downside of splitting up is that there have to be some external - functions and data tables that are used internally in different modules of - the library but which are not part of the API. These have all had their - names changed to start with "_pcre_" so that they are unlikely to clash - with other external names. - - 4. Added an alternate matching function, pcre_dfa_exec(), which matches using - a different (DFA) algorithm. Although it is slower than the original - function, it does have some advantages for certain types of matching - problem. - - 5. Upgrades to pcretest in order to test the features of pcre_dfa_exec(), - including restarting after a partial match. - - 6. A patch for pcregrep that defines INVALID_FILE_ATTRIBUTES if it is not - defined when compiling for Windows was sent to me. I have put it into the - code, though I have no means of testing or verifying it. - - 7. Added the pcre_refcount() auxiliary function. - - 8. Added the PCRE_FIRSTLINE option. This constrains an unanchored pattern to - match before or at the first newline in the subject string. In pcretest, - the /f option on a pattern can be used to set this. - - 9. A repeated \w when used in UTF-8 mode with characters greater than 256 - would behave wrongly. This has been present in PCRE since release 4.0. - -10. A number of changes to the pcregrep command: - - (a) Refactored how -x works; insert ^(...)$ instead of setting - PCRE_ANCHORED and checking the length, in preparation for adding - something similar for -w. - - (b) Added the -w (match as a word) option. - - (c) Refactored the way lines are read and buffered so as to have more - than one at a time available. - - (d) Implemented a pcregrep test script. - - (e) Added the -M (multiline match) option. This allows patterns to match - over several lines of the subject. The buffering ensures that at least - 8K, or the rest of the document (whichever is the shorter) is available - for matching (and similarly the previous 8K for lookbehind assertions). - - (f) Changed the --help output so that it now says - - -w, --word-regex(p) - - instead of two lines, one with "regex" and the other with "regexp" - because that confused at least one person since the short forms are the - same. (This required a bit of code, as the output is generated - automatically from a table. It wasn't just a text change.) - - (g) -- can be used to terminate pcregrep options if the next thing isn't an - option but starts with a hyphen. Could be a pattern or a path name - starting with a hyphen, for instance. - - (h) "-" can be given as a file name to represent stdin. - - (i) When file names are being printed, "(standard input)" is used for - the standard input, for compatibility with GNU grep. Previously - "" was used. - - (j) The option --label=xxx can be used to supply a name to be used for - stdin when file names are being printed. There is no short form. - - (k) Re-factored the options decoding logic because we are going to add - two more options that take data. Such options can now be given in four - different ways, e.g. "-fname", "-f name", "--file=name", "--file name". - - (l) Added the -A, -B, and -C options for requesting that lines of context - around matches be printed. - - (m) Added the -L option to print the names of files that do not contain - any matching lines, that is, the complement of -l. - - (n) The return code is 2 if any file cannot be opened, but pcregrep does - continue to scan other files. - - (o) The -s option was incorrectly implemented. For compatibility with other - greps, it now suppresses the error message for a non-existent or non- - accessible file (but not the return code). There is a new option called - -q that suppresses the output of matching lines, which was what -s was - previously doing. - - (p) Added --include and --exclude options to specify files for inclusion - and exclusion when recursing. - -11. The Makefile was not using the Autoconf-supported LDFLAGS macro properly. - Hopefully, it now does. - -12. Missing cast in pcre_study(). - -13. Added an "uninstall" target to the makefile. - -14. Replaced "extern" in the function prototypes in Makefile.in with - "PCRE_DATA_SCOPE", which defaults to 'extern' or 'extern "C"' in the Unix - world, but is set differently for Windows. - -15. Added a second compiling function called pcre_compile2(). The only - difference is that it has an extra argument, which is a pointer to an - integer error code. When there is a compile-time failure, this is set - non-zero, in addition to the error test pointer being set to point to an - error message. The new argument may be NULL if no error number is required - (but then you may as well call pcre_compile(), which is now just a - wrapper). This facility is provided because some applications need a - numeric error indication, but it has also enabled me to tidy up the way - compile-time errors are handled in the POSIX wrapper. - -16. Added VPATH=.libs to the makefile; this should help when building with one - prefix path and installing with another. (Or so I'm told by someone who - knows more about this stuff than I do.) - -17. Added a new option, REG_DOTALL, to the POSIX function regcomp(). This - passes PCRE_DOTALL to the pcre_compile() function, making the "." character - match everything, including newlines. This is not POSIX-compatible, but - somebody wanted the feature. From pcretest it can be activated by using - both the P and the s flags. - -18. AC_PROG_LIBTOOL appeared twice in Makefile.in. Removed one. - -19. libpcre.pc was being incorrectly installed as executable. - -20. A couple of places in pcretest check for end-of-line by looking for '\n'; - it now also looks for '\r' so that it will work unmodified on Windows. - -21. Added Google's contributed C++ wrapper to the distribution. - -22. Added some untidy missing memory free() calls in pcretest, to keep - Electric Fence happy when testing. - - - -Version 5.0 13-Sep-04 ---------------------- - - 1. Internal change: literal characters are no longer packed up into items - containing multiple characters in a single byte-string. Each character - is now matched using a separate opcode. However, there may be more than one - byte in the character in UTF-8 mode. - - 2. The pcre_callout_block structure has two new fields: pattern_position and - next_item_length. These contain the offset in the pattern to the next match - item, and its length, respectively. - - 3. The PCRE_AUTO_CALLOUT option for pcre_compile() requests the automatic - insertion of callouts before each pattern item. Added the /C option to - pcretest to make use of this. - - 4. On the advice of a Windows user, the lines - - #if defined(_WIN32) || defined(WIN32) - _setmode( _fileno( stdout ), 0x8000 ); - #endif /* defined(_WIN32) || defined(WIN32) */ - - have been added to the source of pcretest. This apparently does useful - magic in relation to line terminators. - - 5. Changed "r" and "w" in the calls to fopen() in pcretest to "rb" and "wb" - for the benefit of those environments where the "b" makes a difference. - - 6. The icc compiler has the same options as gcc, but "configure" doesn't seem - to know about it. I have put a hack into configure.in that adds in code - to set GCC=yes if CC=icc. This seems to end up at a point in the - generated configure script that is early enough to affect the setting of - compiler options, which is what is needed, but I have no means of testing - whether it really works. (The user who reported this had patched the - generated configure script, which of course I cannot do.) - - LATER: After change 22 below (new libtool files), the configure script - seems to know about icc (and also ecc). Therefore, I have commented out - this hack in configure.in. - - 7. Added support for pkg-config (2 patches were sent in). - - 8. Negated POSIX character classes that used a combination of internal tables - were completely broken. These were [[:^alpha:]], [[:^alnum:]], and - [[:^ascii]]. Typically, they would match almost any characters. The other - POSIX classes were not broken in this way. - - 9. Matching the pattern "\b.*?" against "ab cd", starting at offset 1, failed - to find the match, as PCRE was deluded into thinking that the match had to - start at the start point or following a newline. The same bug applied to - patterns with negative forward assertions or any backward assertions - preceding ".*" at the start, unless the pattern required a fixed first - character. This was a failing pattern: "(?!.bcd).*". The bug is now fixed. - -10. In UTF-8 mode, when moving forwards in the subject after a failed match - starting at the last subject character, bytes beyond the end of the subject - string were read. - -11. Renamed the variable "class" as "classbits" to make life easier for C++ - users. (Previously there was a macro definition, but it apparently wasn't - enough.) - -12. Added the new field "tables" to the extra data so that tables can be passed - in at exec time, or the internal tables can be re-selected. This allows - a compiled regex to be saved and re-used at a later time by a different - program that might have everything at different addresses. - -13. Modified the pcre-config script so that, when run on Solaris, it shows a - -R library as well as a -L library. - -14. The debugging options of pcretest (-d on the command line or D on a - pattern) showed incorrect output for anything following an extended class - that contained multibyte characters and which was followed by a quantifier. - -15. Added optional support for general category Unicode character properties - via the \p, \P, and \X escapes. Unicode property support implies UTF-8 - support. It adds about 90K to the size of the library. The meanings of the - inbuilt class escapes such as \d and \s have NOT been changed. - -16. Updated pcredemo.c to include calls to free() to release the memory for the - compiled pattern. - -17. The generated file chartables.c was being created in the source directory - instead of in the building directory. This caused the build to fail if the - source directory was different from the building directory, and was - read-only. - -18. Added some sample Win commands from Mark Tetrode into the NON-UNIX-USE - file. No doubt somebody will tell me if they don't make sense... Also added - Dan Mooney's comments about building on OpenVMS. - -19. Added support for partial matching via the PCRE_PARTIAL option for - pcre_exec() and the \P data escape in pcretest. - -20. Extended pcretest with 3 new pattern features: - - (i) A pattern option of the form ">rest-of-line" causes pcretest to - write the compiled pattern to the file whose name is "rest-of-line". - This is a straight binary dump of the data, with the saved pointer to - the character tables forced to be NULL. The study data, if any, is - written too. After writing, pcretest reads a new pattern. - - (ii) If, instead of a pattern, ": new target - : new target - : use native compiler - : use native linker - : handle Windows platform correctly - : ditto - : ditto - copy DLL to top builddir before testing - - As part of these changes, -no-undefined was removed again. This was reported - to give trouble on HP-UX 11.0, so getting rid of it seems like a good idea - in any case. - -3. Some tidies to get rid of compiler warnings: - - . In the match_data structure, match_limit was an unsigned long int, whereas - match_call_count was an int. I've made them both unsigned long ints. - - . In pcretest the fact that a const uschar * doesn't automatically cast to - a void * provoked a warning. - - . Turning on some more compiler warnings threw up some "shadow" variables - and a few more missing casts. - -4. If PCRE was complied with UTF-8 support, but called without the PCRE_UTF8 - option, a class that contained a single character with a value between 128 - and 255 (e.g. /[\xFF]/) caused PCRE to crash. - -5. If PCRE was compiled with UTF-8 support, but called without the PCRE_UTF8 - option, a class that contained several characters, but with at least one - whose value was between 128 and 255 caused PCRE to crash. - - -Version 4.1 12-Mar-03 ---------------------- - -1. Compiling with gcc -pedantic found a couple of places where casts were -needed, and a string in dftables.c that was longer than standard compilers are -required to support. - -2. Compiling with Sun's compiler found a few more places where the code could -be tidied up in order to avoid warnings. - -3. The variables for cross-compiling were called HOST_CC and HOST_CFLAGS; the -first of these names is deprecated in the latest Autoconf in favour of the name -CC_FOR_BUILD, because "host" is typically used to mean the system on which the -compiled code will be run. I can't find a reference for HOST_CFLAGS, but by -analogy I have changed it to CFLAGS_FOR_BUILD. - -4. Added -no-undefined to the linking command in the Makefile, because this is -apparently helpful for Windows. To make it work, also added "-L. -lpcre" to the -linking step for the pcreposix library. - -5. PCRE was failing to diagnose the case of two named groups with the same -name. - -6. A problem with one of PCRE's optimizations was discovered. PCRE remembers a -literal character that is needed in the subject for a match, and scans along to -ensure that it is present before embarking on the full matching process. This -saves time in cases of nested unlimited repeats that are never going to match. -Problem: the scan can take a lot of time if the subject is very long (e.g. -megabytes), thus penalizing straightforward matches. It is now done only if the -amount of subject to be scanned is less than 1000 bytes. - -7. A lesser problem with the same optimization is that it was recording the -first character of an anchored pattern as "needed", thus provoking a search -right along the subject, even when the first match of the pattern was going to -fail. The "needed" character is now not set for anchored patterns, unless it -follows something in the pattern that is of non-fixed length. Thus, it still -fulfils its original purpose of finding quick non-matches in cases of nested -unlimited repeats, but isn't used for simple anchored patterns such as /^abc/. - - -Version 4.0 17-Feb-03 ---------------------- - -1. If a comment in an extended regex that started immediately after a meta-item -extended to the end of string, PCRE compiled incorrect data. This could lead to -all kinds of weird effects. Example: /#/ was bad; /()#/ was bad; /a#/ was not. - -2. Moved to autoconf 2.53 and libtool 1.4.2. - -3. Perl 5.8 no longer needs "use utf8" for doing UTF-8 things. Consequently, -the special perltest8 script is no longer needed - all the tests can be run -from a single perltest script. - -4. From 5.004, Perl has not included the VT character (0x0b) in the set defined -by \s. It has now been removed in PCRE. This means it isn't recognized as -whitespace in /x regexes too, which is the same as Perl. Note that the POSIX -class [:space:] *does* include VT, thereby creating a mess. - -5. Added the class [:blank:] (a GNU extension from Perl 5.8) to match only -space and tab. - -6. Perl 5.005 was a long time ago. It's time to amalgamate the tests that use -its new features into the main test script, reducing the number of scripts. - -7. Perl 5.8 has changed the meaning of patterns like /a(?i)b/. Earlier versions -were backward compatible, and made the (?i) apply to the whole pattern, as if -/i were given. Now it behaves more logically, and applies the option setting -only to what follows. PCRE has been changed to follow suit. However, if it -finds options settings right at the start of the pattern, it extracts them into -the global options, as before. Thus, they show up in the info data. - -8. Added support for the \Q...\E escape sequence. Characters in between are -treated as literals. This is slightly different from Perl in that $ and @ are -also handled as literals inside the quotes. In Perl, they will cause variable -interpolation. Note the following examples: - - Pattern PCRE matches Perl matches - - \Qabc$xyz\E abc$xyz abc followed by the contents of $xyz - \Qabc\$xyz\E abc\$xyz abc\$xyz - \Qabc\E\$\Qxyz\E abc$xyz abc$xyz - -For compatibility with Perl, \Q...\E sequences are recognized inside character -classes as well as outside them. - -9. Re-organized 3 code statements in pcretest to avoid "overflow in -floating-point constant arithmetic" warnings from a Microsoft compiler. Added a -(size_t) cast to one statement in pcretest and one in pcreposix to avoid -signed/unsigned warnings. - -10. SunOS4 doesn't have strtoul(). This was used only for unpicking the -o -option for pcretest, so I've replaced it by a simple function that does just -that job. - -11. pcregrep was ending with code 0 instead of 2 for the commands "pcregrep" or -"pcregrep -". - -12. Added "possessive quantifiers" ?+, *+, ++, and {,}+ which come from Sun's -Java package. This provides some syntactic sugar for simple cases of what my -documentation calls "once-only subpatterns". A pattern such as x*+ is the same -as (?>x*). In other words, if what is inside (?>...) is just a single repeated -item, you can use this simplified notation. Note that only makes sense with -greedy quantifiers. Consequently, the use of the possessive quantifier forces -greediness, whatever the setting of the PCRE_UNGREEDY option. - -13. A change of greediness default within a pattern was not taking effect at -the current level for patterns like /(b+(?U)a+)/. It did apply to parenthesized -subpatterns that followed. Patterns like /b+(?U)a+/ worked because the option -was abstracted outside. - -14. PCRE now supports the \G assertion. It is true when the current matching -position is at the start point of the match. This differs from \A when the -starting offset is non-zero. Used with the /g option of pcretest (or similar -code), it works in the same way as it does for Perl's /g option. If all -alternatives of a regex begin with \G, the expression is anchored to the start -match position, and the "anchored" flag is set in the compiled expression. - -15. Some bugs concerning the handling of certain option changes within patterns -have been fixed. These applied to options other than (?ims). For example, -"a(?x: b c )d" did not match "XabcdY" but did match "Xa b c dY". It should have -been the other way round. Some of this was related to change 7 above. - -16. PCRE now gives errors for /[.x.]/ and /[=x=]/ as unsupported POSIX -features, as Perl does. Previously, PCRE gave the warnings only for /[[.x.]]/ -and /[[=x=]]/. PCRE now also gives an error for /[:name:]/ because it supports -POSIX classes only within a class (e.g. /[[:alpha:]]/). - -17. Added support for Perl's \C escape. This matches one byte, even in UTF8 -mode. Unlike ".", it always matches newline, whatever the setting of -PCRE_DOTALL. However, PCRE does not permit \C to appear in lookbehind -assertions. Perl allows it, but it doesn't (in general) work because it can't -calculate the length of the lookbehind. At least, that's the case for Perl -5.8.0 - I've been told they are going to document that it doesn't work in -future. - -18. Added an error diagnosis for escapes that PCRE does not support: these are -\L, \l, \N, \P, \p, \U, \u, and \X. - -19. Although correctly diagnosing a missing ']' in a character class, PCRE was -reading past the end of the pattern in cases such as /[abcd/. - -20. PCRE was getting more memory than necessary for patterns with classes that -contained both POSIX named classes and other characters, e.g. /[[:space:]abc/. - -21. Added some code, conditional on #ifdef VPCOMPAT, to make life easier for -compiling PCRE for use with Virtual Pascal. - -22. Small fix to the Makefile to make it work properly if the build is done -outside the source tree. - -23. Added a new extension: a condition to go with recursion. If a conditional -subpattern starts with (?(R) the "true" branch is used if recursion has -happened, whereas the "false" branch is used only at the top level. - -24. When there was a very long string of literal characters (over 255 bytes -without UTF support, over 250 bytes with UTF support), the computation of how -much memory was required could be incorrect, leading to segfaults or other -strange effects. - -25. PCRE was incorrectly assuming anchoring (either to start of subject or to -start of line for a non-DOTALL pattern) when a pattern started with (.*) and -there was a subsequent back reference to those brackets. This meant that, for -example, /(.*)\d+\1/ failed to match "abc123bc". Unfortunately, it isn't -possible to check for precisely this case. All we can do is abandon the -optimization if .* occurs inside capturing brackets when there are any back -references whatsoever. (See below for a better fix that came later.) - -26. The handling of the optimization for finding the first character of a -non-anchored pattern, and for finding a character that is required later in the -match were failing in some cases. This didn't break the matching; it just -failed to optimize when it could. The way this is done has been re-implemented. - -27. Fixed typo in error message for invalid (?R item (it said "(?p"). - -28. Added a new feature that provides some of the functionality that Perl -provides with (?{...}). The facility is termed a "callout". The way it is done -in PCRE is for the caller to provide an optional function, by setting -pcre_callout to its entry point. Like pcre_malloc and pcre_free, this is a -global variable. By default it is unset, which disables all calling out. To get -the function called, the regex must include (?C) at appropriate points. This -is, in fact, equivalent to (?C0), and any number <= 255 may be given with (?C). -This provides a means of identifying different callout points. When PCRE -reaches such a point in the regex, if pcre_callout has been set, the external -function is called. It is provided with data in a structure called -pcre_callout_block, which is defined in pcre.h. If the function returns 0, -matching continues; if it returns a non-zero value, the match at the current -point fails. However, backtracking will occur if possible. [This was changed -later and other features added - see item 49 below.] - -29. pcretest is upgraded to test the callout functionality. It provides a -callout function that displays information. By default, it shows the start of -the match and the current position in the text. There are some new data escapes -to vary what happens: - - \C+ in addition, show current contents of captured substrings - \C- do not supply a callout function - \C!n return 1 when callout number n is reached - \C!n!m return 1 when callout number n is reached for the mth time - -30. If pcregrep was called with the -l option and just a single file name, it -output "" if a match was found, instead of the file name. - -31. Improve the efficiency of the POSIX API to PCRE. If the number of capturing -slots is less than POSIX_MALLOC_THRESHOLD, use a block on the stack to pass to -pcre_exec(). This saves a malloc/free per call. The default value of -POSIX_MALLOC_THRESHOLD is 10; it can be changed by --with-posix-malloc-threshold -when configuring. - -32. The default maximum size of a compiled pattern is 64K. There have been a -few cases of people hitting this limit. The code now uses macros to handle the -storing of links as offsets within the compiled pattern. It defaults to 2-byte -links, but this can be changed to 3 or 4 bytes by --with-link-size when -configuring. Tests 2 and 5 work only with 2-byte links because they output -debugging information about compiled patterns. - -33. Internal code re-arrangements: - -(a) Moved the debugging function for printing out a compiled regex into - its own source file (printint.c) and used #include to pull it into - pcretest.c and, when DEBUG is defined, into pcre.c, instead of having two - separate copies. - -(b) Defined the list of op-code names for debugging as a macro in - internal.h so that it is next to the definition of the opcodes. - -(c) Defined a table of op-code lengths for simpler skipping along compiled - code. This is again a macro in internal.h so that it is next to the - definition of the opcodes. - -34. Added support for recursive calls to individual subpatterns, along the -lines of Robin Houston's patch (but implemented somewhat differently). - -35. Further mods to the Makefile to help Win32. Also, added code to pcregrep to -allow it to read and process whole directories in Win32. This code was -contributed by Lionel Fourquaux; it has not been tested by me. - -36. Added support for named subpatterns. The Python syntax (?P...) is -used to name a group. Names consist of alphanumerics and underscores, and must -be unique. Back references use the syntax (?P=name) and recursive calls use -(?P>name) which is a PCRE extension to the Python extension. Groups still have -numbers. The function pcre_fullinfo() can be used after compilation to extract -a name/number map. There are three relevant calls: - - PCRE_INFO_NAMEENTRYSIZE yields the size of each entry in the map - PCRE_INFO_NAMECOUNT yields the number of entries - PCRE_INFO_NAMETABLE yields a pointer to the map. - -The map is a vector of fixed-size entries. The size of each entry depends on -the length of the longest name used. The first two bytes of each entry are the -group number, most significant byte first. There follows the corresponding -name, zero terminated. The names are in alphabetical order. - -37. Make the maximum literal string in the compiled code 250 for the non-UTF-8 -case instead of 255. Making it the same both with and without UTF-8 support -means that the same test output works with both. - -38. There was a case of malloc(0) in the POSIX testing code in pcretest. Avoid -calling malloc() with a zero argument. - -39. Change 25 above had to resort to a heavy-handed test for the .* anchoring -optimization. I've improved things by keeping a bitmap of backreferences with -numbers 1-31 so that if .* occurs inside capturing brackets that are not in -fact referenced, the optimization can be applied. It is unlikely that a -relevant occurrence of .* (i.e. one which might indicate anchoring or forcing -the match to follow \n) will appear inside brackets with a number greater than -31, but if it does, any back reference > 31 suppresses the optimization. - -40. Added a new compile-time option PCRE_NO_AUTO_CAPTURE. This has the effect -of disabling numbered capturing parentheses. Any opening parenthesis that is -not followed by ? behaves as if it were followed by ?: but named parentheses -can still be used for capturing (and they will acquire numbers in the usual -way). - -41. Redesigned the return codes from the match() function into yes/no/error so -that errors can be passed back from deep inside the nested calls. A malloc -failure while inside a recursive subpattern call now causes the -PCRE_ERROR_NOMEMORY return instead of quietly going wrong. - -42. It is now possible to set a limit on the number of times the match() -function is called in a call to pcre_exec(). This facility makes it possible to -limit the amount of recursion and backtracking, though not in a directly -obvious way, because the match() function is used in a number of different -circumstances. The count starts from zero for each position in the subject -string (for non-anchored patterns). The default limit is, for compatibility, a -large number, namely 10 000 000. You can change this in two ways: - -(a) When configuring PCRE before making, you can use --with-match-limit=n - to set a default value for the compiled library. - -(b) For each call to pcre_exec(), you can pass a pcre_extra block in which - a different value is set. See 45 below. - -If the limit is exceeded, pcre_exec() returns PCRE_ERROR_MATCHLIMIT. - -43. Added a new function pcre_config(int, void *) to enable run-time extraction -of things that can be changed at compile time. The first argument specifies -what is wanted and the second points to where the information is to be placed. -The current list of available information is: - - PCRE_CONFIG_UTF8 - -The output is an integer that is set to one if UTF-8 support is available; -otherwise it is set to zero. - - PCRE_CONFIG_NEWLINE - -The output is an integer that it set to the value of the code that is used for -newline. It is either LF (10) or CR (13). - - PCRE_CONFIG_LINK_SIZE - -The output is an integer that contains the number of bytes used for internal -linkage in compiled expressions. The value is 2, 3, or 4. See item 32 above. - - PCRE_CONFIG_POSIX_MALLOC_THRESHOLD - -The output is an integer that contains the threshold above which the POSIX -interface uses malloc() for output vectors. See item 31 above. - - PCRE_CONFIG_MATCH_LIMIT - -The output is an unsigned integer that contains the default limit of the number -of match() calls in a pcre_exec() execution. See 42 above. - -44. pcretest has been upgraded by the addition of the -C option. This causes it -to extract all the available output from the new pcre_config() function, and to -output it. The program then exits immediately. - -45. A need has arisen to pass over additional data with calls to pcre_exec() in -order to support additional features. One way would have been to define -pcre_exec2() (for example) with extra arguments, but this would not have been -extensible, and would also have required all calls to the original function to -be mapped to the new one. Instead, I have chosen to extend the mechanism that -is used for passing in "extra" data from pcre_study(). - -The pcre_extra structure is now exposed and defined in pcre.h. It currently -contains the following fields: - - flags a bitmap indicating which of the following fields are set - study_data opaque data from pcre_study() - match_limit a way of specifying a limit on match() calls for a specific - call to pcre_exec() - callout_data data for callouts (see 49 below) - -The flag bits are also defined in pcre.h, and are - - PCRE_EXTRA_STUDY_DATA - PCRE_EXTRA_MATCH_LIMIT - PCRE_EXTRA_CALLOUT_DATA - -The pcre_study() function now returns one of these new pcre_extra blocks, with -the actual study data pointed to by the study_data field, and the -PCRE_EXTRA_STUDY_DATA flag set. This can be passed directly to pcre_exec() as -before. That is, this change is entirely upwards-compatible and requires no -change to existing code. - -If you want to pass in additional data to pcre_exec(), you can either place it -in a pcre_extra block provided by pcre_study(), or create your own pcre_extra -block. - -46. pcretest has been extended to test the PCRE_EXTRA_MATCH_LIMIT feature. If a -data string contains the escape sequence \M, pcretest calls pcre_exec() several -times with different match limits, until it finds the minimum value needed for -pcre_exec() to complete. The value is then output. This can be instructive; for -most simple matches the number is quite small, but for pathological cases it -gets very large very quickly. - -47. There's a new option for pcre_fullinfo() called PCRE_INFO_STUDYSIZE. It -returns the size of the data block pointed to by the study_data field in a -pcre_extra block, that is, the value that was passed as the argument to -pcre_malloc() when PCRE was getting memory in which to place the information -created by pcre_study(). The fourth argument should point to a size_t variable. -pcretest has been extended so that this information is shown after a successful -pcre_study() call when information about the compiled regex is being displayed. - -48. Cosmetic change to Makefile: there's no need to have / after $(DESTDIR) -because what follows is always an absolute path. (Later: it turns out that this -is more than cosmetic for MinGW, because it doesn't like empty path -components.) - -49. Some changes have been made to the callout feature (see 28 above): - -(i) A callout function now has three choices for what it returns: - - 0 => success, carry on matching - > 0 => failure at this point, but backtrack if possible - < 0 => serious error, return this value from pcre_exec() - - Negative values should normally be chosen from the set of PCRE_ERROR_xxx - values. In particular, returning PCRE_ERROR_NOMATCH forces a standard - "match failed" error. The error number PCRE_ERROR_CALLOUT is reserved for - use by callout functions. It will never be used by PCRE itself. - -(ii) The pcre_extra structure (see 45 above) has a void * field called - callout_data, with corresponding flag bit PCRE_EXTRA_CALLOUT_DATA. The - pcre_callout_block structure has a field of the same name. The contents of - the field passed in the pcre_extra structure are passed to the callout - function in the corresponding field in the callout block. This makes it - easier to use the same callout-containing regex from multiple threads. For - testing, the pcretest program has a new data escape - - \C*n pass the number n (may be negative) as callout_data - - If the callout function in pcretest receives a non-zero value as - callout_data, it returns that value. - -50. Makefile wasn't handling CFLAGS properly when compiling dftables. Also, -there were some redundant $(CFLAGS) in commands that are now specified as -$(LINK), which already includes $(CFLAGS). - -51. Extensions to UTF-8 support are listed below. These all apply when (a) PCRE -has been compiled with UTF-8 support *and* pcre_compile() has been compiled -with the PCRE_UTF8 flag. Patterns that are compiled without that flag assume -one-byte characters throughout. Note that case-insensitive matching applies -only to characters whose values are less than 256. PCRE doesn't support the -notion of cases for higher-valued characters. - -(i) A character class whose characters are all within 0-255 is handled as - a bit map, and the map is inverted for negative classes. Previously, a - character > 255 always failed to match such a class; however it should - match if the class was a negative one (e.g. [^ab]). This has been fixed. - -(ii) A negated character class with a single character < 255 is coded as - "not this character" (OP_NOT). This wasn't working properly when the test - character was multibyte, either singly or repeated. - -(iii) Repeats of multibyte characters are now handled correctly in UTF-8 - mode, for example: \x{100}{2,3}. - -(iv) The character escapes \b, \B, \d, \D, \s, \S, \w, and \W (either - singly or repeated) now correctly test multibyte characters. However, - PCRE doesn't recognize any characters with values greater than 255 as - digits, spaces, or word characters. Such characters always match \D, \S, - and \W, and never match \d, \s, or \w. - -(v) Classes may now contain characters and character ranges with values - greater than 255. For example: [ab\x{100}-\x{400}]. - -(vi) pcregrep now has a --utf-8 option (synonym -u) which makes it call - PCRE in UTF-8 mode. - -52. The info request value PCRE_INFO_FIRSTCHAR has been renamed -PCRE_INFO_FIRSTBYTE because it is a byte value. However, the old name is -retained for backwards compatibility. (Note that LASTLITERAL is also a byte -value.) - -53. The single man page has become too large. I have therefore split it up into -a number of separate man pages. These also give rise to individual HTML pages; -these are now put in a separate directory, and there is an index.html page that -lists them all. Some hyperlinking between the pages has been installed. - -54. Added convenience functions for handling named capturing parentheses. - -55. Unknown escapes inside character classes (e.g. [\M]) and escapes that -aren't interpreted therein (e.g. [\C]) are literals in Perl. This is now also -true in PCRE, except when the PCRE_EXTENDED option is set, in which case they -are faulted. - -56. Introduced HOST_CC and HOST_CFLAGS which can be set in the environment when -calling configure. These values are used when compiling the dftables.c program -which is run to generate the source of the default character tables. They -default to the values of CC and CFLAGS. If you are cross-compiling PCRE, -you will need to set these values. - -57. Updated the building process for Windows DLL, as provided by Fred Cox. - - -Version 3.9 02-Jan-02 ---------------------- - -1. A bit of extraneous text had somehow crept into the pcregrep documentation. - -2. If --disable-static was given, the building process failed when trying to -build pcretest and pcregrep. (For some reason it was using libtool to compile -them, which is not right, as they aren't part of the library.) - - -Version 3.8 18-Dec-01 ---------------------- - -1. The experimental UTF-8 code was completely screwed up. It was packing the -bytes in the wrong order. How dumb can you get? - - -Version 3.7 29-Oct-01 ---------------------- - -1. In updating pcretest to check change 1 of version 3.6, I screwed up. -This caused pcretest, when used on the test data, to segfault. Unfortunately, -this didn't happen under Solaris 8, where I normally test things. - -2. The Makefile had to be changed to make it work on BSD systems, where 'make' -doesn't seem to recognize that ./xxx and xxx are the same file. (This entry -isn't in ChangeLog distributed with 3.7 because I forgot when I hastily made -this fix an hour or so after the initial 3.7 release.) - - -Version 3.6 23-Oct-01 ---------------------- - -1. Crashed with /(sens|respons)e and \1ibility/ and "sense and sensibility" if -offsets passed as NULL with zero offset count. - -2. The config.guess and config.sub files had not been updated when I moved to -the latest autoconf. - - -Version 3.5 15-Aug-01 ---------------------- - -1. Added some missing #if !defined NOPOSIX conditionals in pcretest.c that -had been forgotten. - -2. By using declared but undefined structures, we can avoid using "void" -definitions in pcre.h while keeping the internal definitions of the structures -private. - -3. The distribution is now built using autoconf 2.50 and libtool 1.4. From a -user point of view, this means that both static and shared libraries are built -by default, but this can be individually controlled. More of the work of -handling this static/shared cases is now inside libtool instead of PCRE's make -file. - -4. The pcretest utility is now installed along with pcregrep because it is -useful for users (to test regexs) and by doing this, it automatically gets -relinked by libtool. The documentation has been turned into a man page, so -there are now .1, .txt, and .html versions in /doc. - -5. Upgrades to pcregrep: - (i) Added long-form option names like gnu grep. - (ii) Added --help to list all options with an explanatory phrase. - (iii) Added -r, --recursive to recurse into sub-directories. - (iv) Added -f, --file to read patterns from a file. - -6. pcre_exec() was referring to its "code" argument before testing that -argument for NULL (and giving an error if it was NULL). - -7. Upgraded Makefile.in to allow for compiling in a different directory from -the source directory. - -8. Tiny buglet in pcretest: when pcre_fullinfo() was called to retrieve the -options bits, the pointer it was passed was to an int instead of to an unsigned -long int. This mattered only on 64-bit systems. - -9. Fixed typo (3.4/1) in pcre.h again. Sigh. I had changed pcre.h (which is -generated) instead of pcre.in, which it its source. Also made the same change -in several of the .c files. - -10. A new release of gcc defines printf() as a macro, which broke pcretest -because it had an ifdef in the middle of a string argument for printf(). Fixed -by using separate calls to printf(). - -11. Added --enable-newline-is-cr and --enable-newline-is-lf to the configure -script, to force use of CR or LF instead of \n in the source. On non-Unix -systems, the value can be set in config.h. - -12. The limit of 200 on non-capturing parentheses is a _nesting_ limit, not an -absolute limit. Changed the text of the error message to make this clear, and -likewise updated the man page. - -13. The limit of 99 on the number of capturing subpatterns has been removed. -The new limit is 65535, which I hope will not be a "real" limit. - - -Version 3.4 22-Aug-00 ---------------------- - -1. Fixed typo in pcre.h: unsigned const char * changed to const unsigned char *. - -2. Diagnose condition (?(0) as an error instead of crashing on matching. - - -Version 3.3 01-Aug-00 ---------------------- - -1. If an octal character was given, but the value was greater than \377, it -was not getting masked to the least significant bits, as documented. This could -lead to crashes in some systems. - -2. Perl 5.6 (if not earlier versions) accepts classes like [a-\d] and treats -the hyphen as a literal. PCRE used to give an error; it now behaves like Perl. - -3. Added the functions pcre_free_substring() and pcre_free_substring_list(). -These just pass their arguments on to (pcre_free)(), but they are provided -because some uses of PCRE bind it to non-C systems that can call its functions, -but cannot call free() or pcre_free() directly. - -4. Add "make test" as a synonym for "make check". Corrected some comments in -the Makefile. - -5. Add $(DESTDIR)/ in front of all the paths in the "install" target in the -Makefile. - -6. Changed the name of pgrep to pcregrep, because Solaris has introduced a -command called pgrep for grepping around the active processes. - -7. Added the beginnings of support for UTF-8 character strings. - -8. Arranged for the Makefile to pass over the settings of CC, CFLAGS, and -RANLIB to ./ltconfig so that they are used by libtool. I think these are all -the relevant ones. (AR is not passed because ./ltconfig does its own figuring -out for the ar command.) - - -Version 3.2 12-May-00 ---------------------- - -This is purely a bug fixing release. - -1. If the pattern /((Z)+|A)*/ was matched agained ZABCDEFG it matched Z instead -of ZA. This was just one example of several cases that could provoke this bug, -which was introduced by change 9 of version 2.00. The code for breaking -infinite loops after an iteration that matches an empty string was't working -correctly. - -2. The pcretest program was not imitating Perl correctly for the pattern /a*/g -when matched against abbab (for example). After matching an empty string, it -wasn't forcing anchoring when setting PCRE_NOTEMPTY for the next attempt; this -caused it to match further down the string than it should. - -3. The code contained an inclusion of sys/types.h. It isn't clear why this -was there because it doesn't seem to be needed, and it causes trouble on some -systems, as it is not a Standard C header. It has been removed. - -4. Made 4 silly changes to the source to avoid stupid compiler warnings that -were reported on the Macintosh. The changes were from - - while ((c = *(++ptr)) != 0 && c != '\n'); -to - while ((c = *(++ptr)) != 0 && c != '\n') ; - -Totally extraordinary, but if that's what it takes... - -5. PCRE is being used in one environment where neither memmove() nor bcopy() is -available. Added HAVE_BCOPY and an autoconf test for it; if neither -HAVE_MEMMOVE nor HAVE_BCOPY is set, use a built-in emulation function which -assumes the way PCRE uses memmove() (always moving upwards). - -6. PCRE is being used in one environment where strchr() is not available. There -was only one use in pcre.c, and writing it out to avoid strchr() probably gives -faster code anyway. - - -Version 3.1 09-Feb-00 ---------------------- - -The only change in this release is the fixing of some bugs in Makefile.in for -the "install" target: - -(1) It was failing to install pcreposix.h. - -(2) It was overwriting the pcre.3 man page with the pcreposix.3 man page. - - -Version 3.0 01-Feb-00 ---------------------- - -1. Add support for the /+ modifier to perltest (to output $` like it does in -pcretest). - -2. Add support for the /g modifier to perltest. - -3. Fix pcretest so that it behaves even more like Perl for /g when the pattern -matches null strings. - -4. Fix perltest so that it doesn't do unwanted things when fed an empty -pattern. Perl treats empty patterns specially - it reuses the most recent -pattern, which is not what we want. Replace // by /(?#)/ in order to avoid this -effect. - -5. The POSIX interface was broken in that it was just handing over the POSIX -captured string vector to pcre_exec(), but (since release 2.00) PCRE has -required a bigger vector, with some working space on the end. This means that -the POSIX wrapper now has to get and free some memory, and copy the results. - -6. Added some simple autoconf support, placing the test data and the -documentation in separate directories, re-organizing some of the -information files, and making it build pcre-config (a GNU standard). Also added -libtool support for building PCRE as a shared library, which is now the -default. - -7. Got rid of the leading zero in the definition of PCRE_MINOR because 08 and -09 are not valid octal constants. Single digits will be used for minor values -less than 10. - -8. Defined REG_EXTENDED and REG_NOSUB as zero in the POSIX header, so that -existing programs that set these in the POSIX interface can use PCRE without -modification. - -9. Added a new function, pcre_fullinfo() with an extensible interface. It can -return all that pcre_info() returns, plus additional data. The pcre_info() -function is retained for compatibility, but is considered to be obsolete. - -10. Added experimental recursion feature (?R) to handle one common case that -Perl 5.6 will be able to do with (?p{...}). - -11. Added support for POSIX character classes like [:alpha:], which Perl is -adopting. - - -Version 2.08 31-Aug-99 ----------------------- - -1. When startoffset was not zero and the pattern began with ".*", PCRE was not -trying to match at the startoffset position, but instead was moving forward to -the next newline as if a previous match had failed. - -2. pcretest was not making use of PCRE_NOTEMPTY when repeating for /g and /G, -and could get into a loop if a null string was matched other than at the start -of the subject. - -3. Added definitions of PCRE_MAJOR and PCRE_MINOR to pcre.h so the version can -be distinguished at compile time, and for completeness also added PCRE_DATE. - -5. Added Paul Sokolovsky's minor changes to make it easy to compile a Win32 DLL -in GnuWin32 environments. - - -Version 2.07 29-Jul-99 ----------------------- - -1. The documentation is now supplied in plain text form and HTML as well as in -the form of man page sources. - -2. C++ compilers don't like assigning (void *) values to other pointer types. -In particular this affects malloc(). Although there is no problem in Standard -C, I've put in casts to keep C++ compilers happy. - -3. Typo on pcretest.c; a cast of (unsigned char *) in the POSIX regexec() call -should be (const char *). - -4. If NOPOSIX is defined, pcretest.c compiles without POSIX support. This may -be useful for non-Unix systems who don't want to bother with the POSIX stuff. -However, I haven't made this a standard facility. The documentation doesn't -mention it, and the Makefile doesn't support it. - -5. The Makefile now contains an "install" target, with editable destinations at -the top of the file. The pcretest program is not installed. - -6. pgrep -V now gives the PCRE version number and date. - -7. Fixed bug: a zero repetition after a literal string (e.g. /abcde{0}/) was -causing the entire string to be ignored, instead of just the last character. - -8. If a pattern like /"([^\\"]+|\\.)*"/ is applied in the normal way to a -non-matching string, it can take a very, very long time, even for strings of -quite modest length, because of the nested recursion. PCRE now does better in -some of these cases. It does this by remembering the last required literal -character in the pattern, and pre-searching the subject to ensure it is present -before running the real match. In other words, it applies a heuristic to detect -some types of certain failure quickly, and in the above example, if presented -with a string that has no trailing " it gives "no match" very quickly. - -9. A new runtime option PCRE_NOTEMPTY causes null string matches to be ignored; -other alternatives are tried instead. - - -Version 2.06 09-Jun-99 ----------------------- - -1. Change pcretest's output for amount of store used to show just the code -space, because the remainder (the data block) varies in size between 32-bit and -64-bit systems. - -2. Added an extra argument to pcre_exec() to supply an offset in the subject to -start matching at. This allows lookbehinds to work when searching for multiple -occurrences in a string. - -3. Added additional options to pcretest for testing multiple occurrences: - - /+ outputs the rest of the string that follows a match - /g loops for multiple occurrences, using the new startoffset argument - /G loops for multiple occurrences by passing an incremented pointer - -4. PCRE wasn't doing the "first character" optimization for patterns starting -with \b or \B, though it was doing it for other lookbehind assertions. That is, -it wasn't noticing that a match for a pattern such as /\bxyz/ has to start with -the letter 'x'. On long subject strings, this gives a significant speed-up. - - -Version 2.05 21-Apr-99 ----------------------- - -1. Changed the type of magic_number from int to long int so that it works -properly on 16-bit systems. - -2. Fixed a bug which caused patterns starting with .* not to work correctly -when the subject string contained newline characters. PCRE was assuming -anchoring for such patterns in all cases, which is not correct because .* will -not pass a newline unless PCRE_DOTALL is set. It now assumes anchoring only if -DOTALL is set at top level; otherwise it knows that patterns starting with .* -must be retried after every newline in the subject. - - -Version 2.04 18-Feb-99 ----------------------- - -1. For parenthesized subpatterns with repeats whose minimum was zero, the -computation of the store needed to hold the pattern was incorrect (too large). -If such patterns were nested a few deep, this could multiply and become a real -problem. - -2. Added /M option to pcretest to show the memory requirement of a specific -pattern. Made -m a synonym of -s (which does this globally) for compatibility. - -3. Subpatterns of the form (regex){n,m} (i.e. limited maximum) were being -compiled in such a way that the backtracking after subsequent failure was -pessimal. Something like (a){0,3} was compiled as (a)?(a)?(a)? instead of -((a)((a)(a)?)?)? with disastrous performance if the maximum was of any size. - - -Version 2.03 02-Feb-99 ----------------------- - -1. Fixed typo and small mistake in man page. - -2. Added 4th condition (GPL supersedes if conflict) and created separate -LICENCE file containing the conditions. - -3. Updated pcretest so that patterns such as /abc\/def/ work like they do in -Perl, that is the internal \ allows the delimiter to be included in the -pattern. Locked out the use of \ as a delimiter. If \ immediately follows -the final delimiter, add \ to the end of the pattern (to test the error). - -4. Added the convenience functions for extracting substrings after a successful -match. Updated pcretest to make it able to test these functions. - - -Version 2.02 14-Jan-99 ----------------------- - -1. Initialized the working variables associated with each extraction so that -their saving and restoring doesn't refer to uninitialized store. - -2. Put dummy code into study.c in order to trick the optimizer of the IBM C -compiler for OS/2 into generating correct code. Apparently IBM isn't going to -fix the problem. - -3. Pcretest: the timing code wasn't using LOOPREPEAT for timing execution -calls, and wasn't printing the correct value for compiling calls. Increased the -default value of LOOPREPEAT, and the number of significant figures in the -times. - -4. Changed "/bin/rm" in the Makefile to "-rm" so it works on Windows NT. - -5. Renamed "deftables" as "dftables" to get it down to 8 characters, to avoid -a building problem on Windows NT with a FAT file system. - - -Version 2.01 21-Oct-98 ----------------------- - -1. Changed the API for pcre_compile() to allow for the provision of a pointer -to character tables built by pcre_maketables() in the current locale. If NULL -is passed, the default tables are used. - - -Version 2.00 24-Sep-98 ----------------------- - -1. Since the (>?) facility is in Perl 5.005, don't require PCRE_EXTRA to enable -it any more. - -2. Allow quantification of (?>) groups, and make it work correctly. - -3. The first character computation wasn't working for (?>) groups. - -4. Correct the implementation of \Z (it is permitted to match on the \n at the -end of the subject) and add 5.005's \z, which really does match only at the -very end of the subject. - -5. Remove the \X "cut" facility; Perl doesn't have it, and (?> is neater. - -6. Remove the ability to specify CASELESS, MULTILINE, DOTALL, and -DOLLAR_END_ONLY at runtime, to make it possible to implement the Perl 5.005 -localized options. All options to pcre_study() were also removed. - -7. Add other new features from 5.005: - - $(?<= positive lookbehind - $(?a*))*/ (a PCRE_EXTRA facility). - - -Version 1.00 18-Nov-97 ----------------------- - -1. Added compile-time macros to support systems such as SunOS4 which don't have -memmove() or strerror() but have other things that can be used instead. - -2. Arranged that "make clean" removes the executables. - - -Version 0.99 27-Oct-97 ----------------------- - -1. Fixed bug in code for optimizing classes with only one character. It was -initializing a 32-byte map regardless, which could cause it to run off the end -of the memory it had got. - -2. Added, conditional on PCRE_EXTRA, the proposed (?>REGEX) construction. - - -Version 0.98 22-Oct-97 ----------------------- - -1. Fixed bug in code for handling temporary memory usage when there are more -back references than supplied space in the ovector. This could cause segfaults. - - -Version 0.97 21-Oct-97 ----------------------- - -1. Added the \X "cut" facility, conditional on PCRE_EXTRA. - -2. Optimized negated single characters not to use a bit map. - -3. Brought error texts together as macro definitions; clarified some of them; -fixed one that was wrong - it said "range out of order" when it meant "invalid -escape sequence". - -4. Changed some char * arguments to const char *. - -5. Added PCRE_NOTBOL and PCRE_NOTEOL (from POSIX). - -6. Added the POSIX-style API wrapper in pcreposix.a and testing facilities in -pcretest. - - -Version 0.96 16-Oct-97 ----------------------- - -1. Added a simple "pgrep" utility to the distribution. - -2. Fixed an incompatibility with Perl: "{" is now treated as a normal character -unless it appears in one of the precise forms "{ddd}", "{ddd,}", or "{ddd,ddd}" -where "ddd" means "one or more decimal digits". - -3. Fixed serious bug. If a pattern had a back reference, but the call to -pcre_exec() didn't supply a large enough ovector to record the related -identifying subpattern, the match always failed. PCRE now remembers the number -of the largest back reference, and gets some temporary memory in which to save -the offsets during matching if necessary, in order to ensure that -backreferences always work. - -4. Increased the compatibility with Perl in a number of ways: - - (a) . no longer matches \n by default; an option PCRE_DOTALL is provided - to request this handling. The option can be set at compile or exec time. - - (b) $ matches before a terminating newline by default; an option - PCRE_DOLLAR_ENDONLY is provided to override this (but not in multiline - mode). The option can be set at compile or exec time. - - (c) The handling of \ followed by a digit other than 0 is now supposed to be - the same as Perl's. If the decimal number it represents is less than 10 - or there aren't that many previous left capturing parentheses, an octal - escape is read. Inside a character class, it's always an octal escape, - even if it is a single digit. - - (d) An escaped but undefined alphabetic character is taken as a literal, - unless PCRE_EXTRA is set. Currently this just reserves the remaining - escapes. - - (e) {0} is now permitted. (The previous item is removed from the compiled - pattern). - -5. Changed all the names of code files so that the basic parts are no longer -than 10 characters, and abolished the teeny "globals.c" file. - -6. Changed the handling of character classes; they are now done with a 32-byte -bit map always. - -7. Added the -d and /D options to pcretest to make it possible to look at the -internals of compilation without having to recompile pcre. - - -Version 0.95 23-Sep-97 ----------------------- - -1. Fixed bug in pre-pass concerning escaped "normal" characters such as \x5c or -\x20 at the start of a run of normal characters. These were being treated as -real characters, instead of the source characters being re-checked. - - -Version 0.94 18-Sep-97 ----------------------- - -1. The functions are now thread-safe, with the caveat that the global variables -containing pointers to malloc() and free() or alternative functions are the -same for all threads. - -2. Get pcre_study() to generate a bitmap of initial characters for non- -anchored patterns when this is possible, and use it if passed to pcre_exec(). - - -Version 0.93 15-Sep-97 ----------------------- - -1. /(b)|(:+)/ was computing an incorrect first character. - -2. Add pcre_study() to the API and the passing of pcre_extra to pcre_exec(), -but not actually doing anything yet. - -3. Treat "-" characters in classes that cannot be part of ranges as literals, -as Perl does (e.g. [-az] or [az-]). - -4. Set the anchored flag if a branch starts with .* or .*? because that tests -all possible positions. - -5. Split up into different modules to avoid including unneeded functions in a -compiled binary. However, compile and exec are still in one module. The "study" -function is split off. - -6. The character tables are now in a separate module whose source is generated -by an auxiliary program - but can then be edited by hand if required. There are -now no calls to isalnum(), isspace(), isdigit(), isxdigit(), tolower() or -toupper() in the code. - -7. Turn the malloc/free funtions variables into pcre_malloc and pcre_free and -make them global. Abolish the function for setting them, as the caller can now -set them directly. - - -Version 0.92 11-Sep-97 ----------------------- - -1. A repeat with a fixed maximum and a minimum of 1 for an ordinary character -(e.g. /a{1,3}/) was broken (I mis-optimized it). - -2. Caseless matching was not working in character classes if the characters in -the pattern were in upper case. - -3. Make ranges like [W-c] work in the same way as Perl for caseless matching. - -4. Make PCRE_ANCHORED public and accept as a compile option. - -5. Add an options word to pcre_exec() and accept PCRE_ANCHORED and -PCRE_CASELESS at run time. Add escapes \A and \I to pcretest to cause it to -pass them. - -6. Give an error if bad option bits passed at compile or run time. - -7. Add PCRE_MULTILINE at compile and exec time, and (?m) as well. Add \M to -pcretest to cause it to pass that flag. - -8. Add pcre_info(), to get the number of identifying subpatterns, the stored -options, and the first character, if set. - -9. Recognize C+ or C{n,m} where n >= 1 as providing a fixed starting character. - - -Version 0.91 10-Sep-97 ----------------------- - -1. PCRE was failing to diagnose unlimited repeats of subpatterns that could -match the empty string as in /(a*)*/. It was looping and ultimately crashing. - -2. PCRE was looping on encountering an indefinitely repeated back reference to -a subpattern that had matched an empty string, e.g. /(a|)\1*/. It now does what -Perl does - treats the match as successful. - -**** diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/LICENCE b/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/LICENCE deleted file mode 100644 index dd9071a8..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/LICENCE +++ /dev/null @@ -1,93 +0,0 @@ -PCRE LICENCE ------------- - -PCRE is a library of functions to support regular expressions whose syntax -and semantics are as close as possible to those of the Perl 5 language. - -Release 8 of PCRE is distributed under the terms of the "BSD" licence, as -specified below. The documentation for PCRE, supplied in the "doc" -directory, is distributed under the same terms as the software itself. The data -in the testdata directory is not copyrighted and is in the public domain. - -The basic library functions are written in C and are freestanding. Also -included in the distribution is a set of C++ wrapper functions, and a -just-in-time compiler that can be used to optimize pattern matching. These -are both optional features that can be omitted when the library is built. - - -THE BASIC LIBRARY FUNCTIONS ---------------------------- - -Written by: Philip Hazel -Email local part: ph10 -Email domain: cam.ac.uk - -University of Cambridge Computing Service, -Cambridge, England. - -Copyright (c) 1997-2017 University of Cambridge -All rights reserved. - - -PCRE JUST-IN-TIME COMPILATION SUPPORT -------------------------------------- - -Written by: Zoltan Herczeg -Email local part: hzmester -Emain domain: freemail.hu - -Copyright(c) 2010-2017 Zoltan Herczeg -All rights reserved. - - -STACK-LESS JUST-IN-TIME COMPILER --------------------------------- - -Written by: Zoltan Herczeg -Email local part: hzmester -Emain domain: freemail.hu - -Copyright(c) 2009-2017 Zoltan Herczeg -All rights reserved. - - -THE C++ WRAPPER FUNCTIONS -------------------------- - -Contributed by: Google Inc. - -Copyright (c) 2007-2012, Google Inc. -All rights reserved. - - -THE "BSD" LICENCE ------------------ - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - - * Neither the name of the University of Cambridge nor the name of Google - Inc. nor the names of their contributors may be used to endorse or - promote products derived from this software without specific prior - written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. - -End diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/NEWS b/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/NEWS deleted file mode 100644 index 36be07cb..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/NEWS +++ /dev/null @@ -1,737 +0,0 @@ -News about PCRE releases ------------------------- - -Release 8.41 13-June-2017 -------------------------- - -This is a bug-fix release. - - -Release 8.40 11-January-2017 ----------------------------- - -This is a bug-fix release. - - -Release 8.39 14-June-2016 -------------------------- - -Some appropriate PCRE2 JIT improvements have been retro-fitted to PCRE1. Apart -from that, this is another bug-fix release. Note that this library (now called -PCRE1) is now being maintained for bug fixes only. New projects are advised to -use the new PCRE2 libraries. - - -Release 8.38 23-November-2015 ------------------------------ - -This is bug-fix release. Note that this library (now called PCRE1) is now being -maintained for bug fixes only. New projects are advised to use the new PCRE2 -libraries. - - -Release 8.37 28-April-2015 --------------------------- - -This is bug-fix release. Note that this library (now called PCRE1) is now being -maintained for bug fixes only. New projects are advised to use the new PCRE2 -libraries. - - -Release 8.36 26-September-2014 ------------------------------- - -This is primarily a bug-fix release. However, in addition, the Unicode data -tables have been updated to Unicode 7.0.0. - - -Release 8.35 04-April-2014 --------------------------- - -There have been performance improvements for classes containing non-ASCII -characters and the "auto-possessification" feature has been extended. Other -minor improvements have been implemented and bugs fixed. There is a new callout -feature to enable applications to do detailed stack checks at compile time, to -avoid running out of stack for deeply nested parentheses. The JIT compiler has -been extended with experimental support for ARM-64, MIPS-64, and PPC-LE. - - -Release 8.34 15-December-2013 ------------------------------ - -As well as fixing the inevitable bugs, performance has been improved by -refactoring and extending the amount of "auto-possessification" that PCRE does. -Other notable changes: - -. Implemented PCRE_INFO_MATCH_EMPTY, which yields 1 if the pattern can match - an empty string. If it can, pcretest shows this in its information output. - -. A back reference to a named subpattern when there is more than one of the - same name now checks them in the order in which they appear in the pattern. - The first one that is set is used for the reference. Previously only the - first one was inspected. This change makes PCRE more compatible with Perl. - -. Unicode character properties were updated from Unicode 6.3.0. - -. The character VT has been added to the set of characters that match \s and - are generally treated as white space, following this same change in Perl - 5.18. There is now no difference between "Perl space" and "POSIX space". - -. Perl has changed its handling of \8 and \9. If there is no previously - encountered capturing group of those numbers, they are treated as the - literal characters 8 and 9 instead of a binary zero followed by the - literals. PCRE now does the same. - -. Following Perl, added \o{} to specify codepoints in octal, making it - possible to specify values greater than 0777 and also making them - unambiguous. - -. In UCP mode, \s was not matching two of the characters that Perl matches, - namely NEL (U+0085) and MONGOLIAN VOWEL SEPARATOR (U+180E), though they - were matched by \h. - -. Add JIT support for the 64 bit TileGX architecture. - -. Upgraded the handling of the POSIX classes [:graph:], [:print:], and - [:punct:] when PCRE_UCP is set so as to include the same characters as Perl - does in Unicode mode. - -. Perl no longer allows group names to start with digits, so I have made this - change also in PCRE. - -. Added support for [[:<:]] and [[:>:]] as used in the BSD POSIX library to - mean "start of word" and "end of word", respectively, as a transition aid. - - -Release 8.33 28-May-2013 --------------------------- - -A number of bugs are fixed, and some performance improvements have been made. -There are also some new features, of which these are the most important: - -. The behaviour of the backtracking verbs has been rationalized and - documented in more detail. - -. JIT now supports callouts and all of the backtracking verbs. - -. Unicode validation has been updated in the light of Unicode Corrigendum #9, - which points out that "non characters" are not "characters that may not - appear in Unicode strings" but rather "characters that are reserved for - internal use and have only local meaning". - -. (*LIMIT_MATCH=d) and (*LIMIT_RECURSION=d) have been added so that the - creator of a pattern can specify lower (but not higher) limits for the - matching process. - -. The PCRE_NEVER_UTF option is available to prevent pattern-writers from using - the (*UTF) feature, as this could be a security issue. - - -Release 8.32 30-November-2012 ------------------------------ - -This release fixes a number of bugs, but also has some new features. These are -the highlights: - -. There is now support for 32-bit character strings and UTF-32. Like the - 16-bit support, this is done by compiling a separate 32-bit library. - -. \X now matches a Unicode extended grapheme cluster. - -. Case-independent matching of Unicode characters that have more than one - "other case" now makes all three (or more) characters equivalent. This - applies, for example, to Greek Sigma, which has two lowercase versions. - -. Unicode character properties are updated to Unicode 6.2.0. - -. The EBCDIC support, which had decayed, has had a spring clean. - -. A number of JIT optimizations have been added, which give faster JIT - execution speed. In addition, a new direct interface to JIT execution is - available. This bypasses some of the sanity checks of pcre_exec() to give a - noticeable speed-up. - -. A number of issues in pcregrep have been fixed, making it more compatible - with GNU grep. In particular, --exclude and --include (and variants) apply - to all files now, not just those obtained from scanning a directory - recursively. In Windows environments, the default action for directories is - now "skip" instead of "read" (which provokes an error). - -. If the --only-matching (-o) option in pcregrep is specified multiple - times, each one causes appropriate output. For example, -o1 -o2 outputs the - substrings matched by the 1st and 2nd capturing parentheses. A separating - string can be specified by --om-separator (default empty). - -. When PCRE is built via Autotools using a version of gcc that has the - "visibility" feature, it is used to hide internal library functions that are - not part of the public API. - - -Release 8.31 06-July-2012 -------------------------- - -This is mainly a bug-fixing release, with a small number of developments: - -. The JIT compiler now supports partial matching and the (*MARK) and - (*COMMIT) verbs. - -. PCRE_INFO_MAXLOOKBEHIND can be used to find the longest lookbehind in a - pattern. - -. There should be a performance improvement when using the heap instead of the - stack for recursion. - -. pcregrep can now be linked with libedit as an alternative to libreadline. - -. pcregrep now has a --file-list option where the list of files to scan is - given as a file. - -. pcregrep now recognizes binary files and there are related options. - -. The Unicode tables have been updated to 6.1.0. - -As always, the full list of changes is in the ChangeLog file. - - -Release 8.30 04-February-2012 ------------------------------ - -Release 8.30 introduces a major new feature: support for 16-bit character -strings, compiled as a separate library. There are a few changes to the -8-bit library, in addition to some bug fixes. - -. The pcre_info() function, which has been obsolete for over 10 years, has - been removed. - -. When a compiled pattern was saved to a file and later reloaded on a host - with different endianness, PCRE used automatically to swap the bytes in some - of the data fields. With the advent of the 16-bit library, where more of this - swapping is needed, it is no longer done automatically. Instead, the bad - endianness is detected and a specific error is given. The user can then call - a new function called pcre_pattern_to_host_byte_order() (or an equivalent - 16-bit function) to do the swap. - -. In UTF-8 mode, the values 0xd800 to 0xdfff are not legal Unicode - code points and are now faulted. (They are the so-called "surrogates" - that are reserved for coding high values in UTF-16.) - - -Release 8.21 12-Dec-2011 ------------------------- - -This is almost entirely a bug-fix release. The only new feature is the ability -to obtain the size of the memory used by the JIT compiler. - - -Release 8.20 21-Oct-2011 ------------------------- - -The main change in this release is the inclusion of Zoltan Herczeg's -just-in-time compiler support, which can be accessed by building PCRE with ---enable-jit. Large performance benefits can be had in many situations. 8.20 -also fixes an unfortunate bug that was introduced in 8.13 as well as tidying up -a number of infelicities and differences from Perl. - - -Release 8.13 16-Aug-2011 ------------------------- - -This is mainly a bug-fix release. There has been a lot of internal refactoring. -The Unicode tables have been updated. The only new feature in the library is -the passing of *MARK information to callouts. Some additions have been made to -pcretest to make testing easier and more comprehensive. There is a new option -for pcregrep to adjust its internal buffer size. - - -Release 8.12 15-Jan-2011 ------------------------- - -This release fixes some bugs in pcregrep, one of which caused the tests to fail -on 64-bit big-endian systems. There are no changes to the code of the library. - - -Release 8.11 10-Dec-2010 ------------------------- - -A number of bugs in the library and in pcregrep have been fixed. As always, see -ChangeLog for details. The following are the non-bug-fix changes: - -. Added --match-limit and --recursion-limit to pcregrep. - -. Added an optional parentheses number to the -o and --only-matching options - of pcregrep. - -. Changed the way PCRE_PARTIAL_HARD affects the matching of $, \z, \Z, \b, and - \B. - -. Added PCRE_ERROR_SHORTUTF8 to make it possible to distinguish between a - bad UTF-8 sequence and one that is incomplete when using PCRE_PARTIAL_HARD. - -. Recognize (*NO_START_OPT) at the start of a pattern to set the PCRE_NO_ - START_OPTIMIZE option, which is now allowed at compile time - - -Release 8.10 25-Jun-2010 ------------------------- - -There are two major additions: support for (*MARK) and friends, and the option -PCRE_UCP, which changes the behaviour of \b, \d, \s, and \w (and their -opposites) so that they make use of Unicode properties. There are also a number -of lesser new features, and several bugs have been fixed. A new option, ---line-buffered, has been added to pcregrep, for use when it is connected to -pipes. - - -Release 8.02 19-Mar-2010 ------------------------- - -Another bug-fix release. - - -Release 8.01 19-Jan-2010 ------------------------- - -This is a bug-fix release. Several bugs in the code itself and some bugs and -infelicities in the build system have been fixed. - - -Release 8.00 19-Oct-09 ----------------------- - -Bugs have been fixed in the library and in pcregrep. There are also some -enhancements. Restrictions on patterns used for partial matching have been -removed, extra information is given for partial matches, the partial matching -process has been improved, and an option to make a partial match override a -full match is available. The "study" process has been enhanced by finding a -lower bound matching length. Groups with duplicate numbers may now have -duplicated names without the use of PCRE_DUPNAMES. However, they may not have -different names. The documentation has been revised to reflect these changes. -The version number has been expanded to 3 digits as it is clear that the rate -of change is not slowing down. - - -Release 7.9 11-Apr-09 ---------------------- - -Mostly bugfixes and tidies with just a couple of minor functional additions. - - -Release 7.8 05-Sep-08 ---------------------- - -More bug fixes, plus a performance improvement in Unicode character property -lookup. - - -Release 7.7 07-May-08 ---------------------- - -This is once again mainly a bug-fix release, but there are a couple of new -features. - - -Release 7.6 28-Jan-08 ---------------------- - -The main reason for having this release so soon after 7.5 is because it fixes a -potential buffer overflow problem in pcre_compile() when run in UTF-8 mode. In -addition, the CMake configuration files have been brought up to date. - - -Release 7.5 10-Jan-08 ---------------------- - -This is mainly a bug-fix release. However the ability to link pcregrep with -libz or libbz2 and the ability to link pcretest with libreadline have been -added. Also the --line-offsets and --file-offsets options were added to -pcregrep. - - -Release 7.4 21-Sep-07 ---------------------- - -The only change of specification is the addition of options to control whether -\R matches any Unicode line ending (the default) or just CR, LF, and CRLF. -Otherwise, the changes are bug fixes and a refactoring to reduce the number of -relocations needed in a shared library. There have also been some documentation -updates, in particular, some more information about using CMake to build PCRE -has been added to the NON-UNIX-USE file. - - -Release 7.3 28-Aug-07 ---------------------- - -Most changes are bug fixes. Some that are not: - -1. There is some support for Perl 5.10's experimental "backtracking control - verbs" such as (*PRUNE). - -2. UTF-8 checking is now as per RFC 3629 instead of RFC 2279; this is more - restrictive in the strings it accepts. - -3. Checking for potential integer overflow has been made more dynamic, and as a - consequence there is no longer a hard limit on the size of a subpattern that - has a limited repeat count. - -4. When CRLF is a valid line-ending sequence, pcre_exec() and pcre_dfa_exec() - no longer advance by two characters instead of one when an unanchored match - fails at CRLF if there are explicit CR or LF matches within the pattern. - This gets rid of some anomalous effects that previously occurred. - -5. Some PCRE-specific settings for varying the newline options at the start of - a pattern have been added. - - -Release 7.2 19-Jun-07 ---------------------- - -WARNING: saved patterns that were compiled by earlier versions of PCRE must be -recompiled for use with 7.2 (necessitated by the addition of \K, \h, \H, \v, -and \V). - -Correction to the notes for 7.1: the note about shared libraries for Windows is -wrong. Previously, three libraries were built, but each could function -independently. For example, the pcreposix library also included all the -functions from the basic pcre library. The change is that the three libraries -are no longer independent. They are like the Unix libraries. To use the -pcreposix functions, for example, you need to link with both the pcreposix and -the basic pcre library. - -Some more features from Perl 5.10 have been added: - - (?-n) and (?+n) relative references for recursion and subroutines. - - (?(-n) and (?(+n) relative references as conditions. - - \k{name} and \g{name} are synonyms for \k. - - \K to reset the start of the matched string; for example, (foo)\Kbar - matches bar preceded by foo, but only sets bar as the matched string. - - (?| introduces a group where the capturing parentheses in each alternative - start from the same number; for example, (?|(abc)|(xyz)) sets capturing - parentheses number 1 in both cases. - - \h, \H, \v, \V match horizontal and vertical whitespace, respectively. - - -Release 7.1 24-Apr-07 ---------------------- - -There is only one new feature in this release: a linebreak setting of -PCRE_NEWLINE_ANYCRLF. It is a cut-down version of PCRE_NEWLINE_ANY, which -recognizes only CRLF, CR, and LF as linebreaks. - -A few bugs are fixed (see ChangeLog for details), but the major change is a -complete re-implementation of the build system. This now has full Autotools -support and so is now "standard" in some sense. It should help with compiling -PCRE in a wide variety of environments. - -NOTE: when building shared libraries for Windows, three dlls are now built, -called libpcre, libpcreposix, and libpcrecpp. Previously, everything was -included in a single dll. - -Another important change is that the dftables auxiliary program is no longer -compiled and run at "make" time by default. Instead, a default set of character -tables (assuming ASCII coding) is used. If you want to use dftables to generate -the character tables as previously, add --enable-rebuild-chartables to the -"configure" command. You must do this if you are compiling PCRE to run on a -system that uses EBCDIC code. - -There is a discussion about character tables in the README file. The default is -not to use dftables so that that there is no problem when cross-compiling. - - -Release 7.0 19-Dec-06 ---------------------- - -This release has a new major number because there have been some internal -upheavals to facilitate the addition of new optimizations and other facilities, -and to make subsequent maintenance and extension easier. Compilation is likely -to be a bit slower, but there should be no major effect on runtime performance. -Previously compiled patterns are NOT upwards compatible with this release. If -you have saved compiled patterns from a previous release, you will have to -re-compile them. Important changes that are visible to users are: - -1. The Unicode property tables have been updated to Unicode 5.0.0, which adds - some more scripts. - -2. The option PCRE_NEWLINE_ANY causes PCRE to recognize any Unicode newline - sequence as a newline. - -3. The \R escape matches a single Unicode newline sequence as a single unit. - -4. New features that will appear in Perl 5.10 are now in PCRE. These include - alternative Perl syntax for named parentheses, and Perl syntax for - recursion. - -5. The C++ wrapper interface has been extended by the addition of a - QuoteMeta function and the ability to allow copy construction and - assignment. - -For a complete list of changes, see the ChangeLog file. - - -Release 6.7 04-Jul-06 ---------------------- - -The main additions to this release are the ability to use the same name for -multiple sets of parentheses, and support for CRLF line endings in both the -library and pcregrep (and in pcretest for testing). - -Thanks to Ian Taylor, the stack usage for many kinds of pattern has been -significantly reduced for certain subject strings. - - -Release 6.5 01-Feb-06 ---------------------- - -Important changes in this release: - -1. A number of new features have been added to pcregrep. - -2. The Unicode property tables have been updated to Unicode 4.1.0, and the - supported properties have been extended with script names such as "Arabic", - and the derived properties "Any" and "L&". This has necessitated a change to - the interal format of compiled patterns. Any saved compiled patterns that - use \p or \P must be recompiled. - -3. The specification of recursion in patterns has been changed so that all - recursive subpatterns are automatically treated as atomic groups. Thus, for - example, (?R) is treated as if it were (?>(?R)). This is necessary because - otherwise there are situations where recursion does not work. - -See the ChangeLog for a complete list of changes, which include a number of bug -fixes and tidies. - - -Release 6.0 07-Jun-05 ---------------------- - -The release number has been increased to 6.0 because of the addition of several -major new pieces of functionality. - -A new function, pcre_dfa_exec(), which implements pattern matching using a DFA -algorithm, has been added. This has a number of advantages for certain cases, -though it does run more slowly, and lacks the ability to capture substrings. On -the other hand, it does find all matches, not just the first, and it works -better for partial matching. The pcrematching man page discusses the -differences. - -The pcretest program has been enhanced so that it can make use of the new -pcre_dfa_exec() matching function and the extra features it provides. - -The distribution now includes a C++ wrapper library. This is built -automatically if a C++ compiler is found. The pcrecpp man page discusses this -interface. - -The code itself has been re-organized into many more files, one for each -function, so it no longer requires everything to be linked in when static -linkage is used. As a consequence, some internal functions have had to have -their names exposed. These functions all have names starting with _pcre_. They -are undocumented, and are not intended for use by outside callers. - -The pcregrep program has been enhanced with new functionality such as -multiline-matching and options for output more matching context. See the -ChangeLog for a complete list of changes to the library and the utility -programs. - - -Release 5.0 13-Sep-04 ---------------------- - -The licence under which PCRE is released has been changed to the more -conventional "BSD" licence. - -In the code, some bugs have been fixed, and there are also some major changes -in this release (which is why I've increased the number to 5.0). Some changes -are internal rearrangements, and some provide a number of new facilities. The -new features are: - -1. There's an "automatic callout" feature that inserts callouts before every - item in the regex, and there's a new callout field that gives the position - in the pattern - useful for debugging and tracing. - -2. The extra_data structure can now be used to pass in a set of character - tables at exec time. This is useful if compiled regex are saved and re-used - at a later time when the tables may not be at the same address. If the - default internal tables are used, the pointer saved with the compiled - pattern is now set to NULL, which means that you don't need to do anything - special unless you are using custom tables. - -3. It is possible, with some restrictions on the content of the regex, to - request "partial" matching. A special return code is given if all of the - subject string matched part of the regex. This could be useful for testing - an input field as it is being typed. - -4. There is now some optional support for Unicode character properties, which - means that the patterns items such as \p{Lu} and \X can now be used. Only - the general category properties are supported. If PCRE is compiled with this - support, an additional 90K data structure is include, which increases the - size of the library dramatically. - -5. There is support for saving compiled patterns and re-using them later. - -6. There is support for running regular expressions that were compiled on a - different host with the opposite endianness. - -7. The pcretest program has been extended to accommodate the new features. - -The main internal rearrangement is that sequences of literal characters are no -longer handled as strings. Instead, each character is handled on its own. This -makes some UTF-8 handling easier, and makes the support of partial matching -possible. Compiled patterns containing long literal strings will be larger as a -result of this change; I hope that performance will not be much affected. - - -Release 4.5 01-Dec-03 ---------------------- - -Again mainly a bug-fix and tidying release, with only a couple of new features: - -1. It's possible now to compile PCRE so that it does not use recursive -function calls when matching. Instead it gets memory from the heap. This slows -things down, but may be necessary on systems with limited stacks. - -2. UTF-8 string checking has been tightened to reject overlong sequences and to -check that a starting offset points to the start of a character. Failure of the -latter returns a new error code: PCRE_ERROR_BADUTF8_OFFSET. - -3. PCRE can now be compiled for systems that use EBCDIC code. - - -Release 4.4 21-Aug-03 ---------------------- - -This is mainly a bug-fix and tidying release. The only new feature is that PCRE -checks UTF-8 strings for validity by default. There is an option to suppress -this, just in case anybody wants that teeny extra bit of performance. - - -Releases 4.1 - 4.3 ------------------- - -Sorry, I forgot about updating the NEWS file for these releases. Please take a -look at ChangeLog. - - -Release 4.0 17-Feb-03 ---------------------- - -There have been a lot of changes for the 4.0 release, adding additional -functionality and mending bugs. Below is a list of the highlights of the new -functionality. For full details of these features, please consult the -documentation. For a complete list of changes, see the ChangeLog file. - -1. Support for Perl's \Q...\E escapes. - -2. "Possessive quantifiers" ?+, *+, ++, and {,}+ which come from Sun's Java -package. They provide some syntactic sugar for simple cases of "atomic -grouping". - -3. Support for the \G assertion. It is true when the current matching position -is at the start point of the match. - -4. A new feature that provides some of the functionality that Perl provides -with (?{...}). The facility is termed a "callout". The way it is done in PCRE -is for the caller to provide an optional function, by setting pcre_callout to -its entry point. To get the function called, the regex must include (?C) at -appropriate points. - -5. Support for recursive calls to individual subpatterns. This makes it really -easy to get totally confused. - -6. Support for named subpatterns. The Python syntax (?P...) is used to -name a group. - -7. Several extensions to UTF-8 support; it is now fairly complete. There is an -option for pcregrep to make it operate in UTF-8 mode. - -8. The single man page has been split into a number of separate man pages. -These also give rise to individual HTML pages which are put in a separate -directory. There is an index.html page that lists them all. Some hyperlinking -between the pages has been installed. - - -Release 3.5 15-Aug-01 ---------------------- - -1. The configuring system has been upgraded to use later versions of autoconf -and libtool. By default it builds both a shared and a static library if the OS -supports it. You can use --disable-shared or --disable-static on the configure -command if you want only one of them. - -2. The pcretest utility is now installed along with pcregrep because it is -useful for users (to test regexs) and by doing this, it automatically gets -relinked by libtool. The documentation has been turned into a man page, so -there are now .1, .txt, and .html versions in /doc. - -3. Upgrades to pcregrep: - (i) Added long-form option names like gnu grep. - (ii) Added --help to list all options with an explanatory phrase. - (iii) Added -r, --recursive to recurse into sub-directories. - (iv) Added -f, --file to read patterns from a file. - -4. Added --enable-newline-is-cr and --enable-newline-is-lf to the configure -script, to force use of CR or LF instead of \n in the source. On non-Unix -systems, the value can be set in config.h. - -5. The limit of 200 on non-capturing parentheses is a _nesting_ limit, not an -absolute limit. Changed the text of the error message to make this clear, and -likewise updated the man page. - -6. The limit of 99 on the number of capturing subpatterns has been removed. -The new limit is 65535, which I hope will not be a "real" limit. - - -Release 3.3 01-Aug-00 ---------------------- - -There is some support for UTF-8 character strings. This is incomplete and -experimental. The documentation describes what is and what is not implemented. -Otherwise, this is just a bug-fixing release. - - -Release 3.0 01-Feb-00 ---------------------- - -1. A "configure" script is now used to configure PCRE for Unix systems. It -builds a Makefile, a config.h file, and the pcre-config script. - -2. PCRE is built as a shared library by default. - -3. There is support for POSIX classes such as [:alpha:]. - -5. There is an experimental recursion feature. - ----------------------------------------------------------------------------- - IMPORTANT FOR THOSE UPGRADING FROM VERSIONS BEFORE 2.00 - -Please note that there has been a change in the API such that a larger -ovector is required at matching time, to provide some additional workspace. -The new man page has details. This change was necessary in order to support -some of the new functionality in Perl 5.005. - - IMPORTANT FOR THOSE UPGRADING FROM VERSION 2.00 - -Another (I hope this is the last!) change has been made to the API for the -pcre_compile() function. An additional argument has been added to make it -possible to pass over a pointer to character tables built in the current -locale by pcre_maketables(). To use the default tables, this new argument -should be passed as NULL. - - IMPORTANT FOR THOSE UPGRADING FROM VERSION 2.05 - -Yet another (and again I hope this really is the last) change has been made -to the API for the pcre_exec() function. An additional argument has been -added to make it possible to start the match other than at the start of the -subject string. This is important if there are lookbehinds. The new man -page has the details, but you just want to convert existing programs, all -you need to do is to stick in a new fifth argument to pcre_exec(), with a -value of zero. For example, change - - pcre_exec(pattern, extra, subject, length, options, ovec, ovecsize) -to - pcre_exec(pattern, extra, subject, length, 0, options, ovec, ovecsize) - -**** diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/README b/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/README deleted file mode 100644 index 4887ebf3..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/README +++ /dev/null @@ -1,1002 +0,0 @@ -README file for PCRE (Perl-compatible regular expression library) ------------------------------------------------------------------ - -NOTE: This set of files relates to PCRE releases that use the original API, -with library names libpcre, libpcre16, and libpcre32. January 2015 saw the -first release of a new API, known as PCRE2, with release numbers starting at -10.00 and library names libpcre2-8, libpcre2-16, and libpcre2-32. The old -libraries (now called PCRE1) are still being maintained for bug fixes, but -there will be no new development. New projects are advised to use the new PCRE2 -libraries. - - -The latest release of PCRE1 is always available in three alternative formats -from: - - ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-xxx.tar.gz - ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-xxx.tar.bz2 - ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-xxx.zip - -There is a mailing list for discussion about the development of PCRE at -pcre-dev@exim.org. You can access the archives and subscribe or manage your -subscription here: - - https://lists.exim.org/mailman/listinfo/pcre-dev - -Please read the NEWS file if you are upgrading from a previous release. -The contents of this README file are: - - The PCRE APIs - Documentation for PCRE - Contributions by users of PCRE - Building PCRE on non-Unix-like systems - Building PCRE without using autotools - Building PCRE using autotools - Retrieving configuration information - Shared libraries - Cross-compiling using autotools - Using HP's ANSI C++ compiler (aCC) - Compiling in Tru64 using native compilers - Using Sun's compilers for Solaris - Using PCRE from MySQL - Making new tarballs - Testing PCRE - Character tables - File manifest - - -The PCRE APIs -------------- - -PCRE is written in C, and it has its own API. There are three sets of -functions, one for the 8-bit library, which processes strings of bytes, one for -the 16-bit library, which processes strings of 16-bit values, and one for the -32-bit library, which processes strings of 32-bit values. The distribution also -includes a set of C++ wrapper functions (see the pcrecpp man page for details), -courtesy of Google Inc., which can be used to call the 8-bit PCRE library from -C++. Other C++ wrappers have been created from time to time. See, for example: -https://github.com/YasserAsmi/regexp, which aims to be simple and similar in -style to the C API. - -The distribution also contains a set of C wrapper functions (again, just for -the 8-bit library) that are based on the POSIX regular expression API (see the -pcreposix man page). These end up in the library called libpcreposix. Note that -this just provides a POSIX calling interface to PCRE; the regular expressions -themselves still follow Perl syntax and semantics. The POSIX API is restricted, -and does not give full access to all of PCRE's facilities. - -The header file for the POSIX-style functions is called pcreposix.h. The -official POSIX name is regex.h, but I did not want to risk possible problems -with existing files of that name by distributing it that way. To use PCRE with -an existing program that uses the POSIX API, pcreposix.h will have to be -renamed or pointed at by a link. - -If you are using the POSIX interface to PCRE and there is already a POSIX regex -library installed on your system, as well as worrying about the regex.h header -file (as mentioned above), you must also take care when linking programs to -ensure that they link with PCRE's libpcreposix library. Otherwise they may pick -up the POSIX functions of the same name from the other library. - -One way of avoiding this confusion is to compile PCRE with the addition of --Dregcomp=PCREregcomp (and similarly for the other POSIX functions) to the -compiler flags (CFLAGS if you are using "configure" -- see below). This has the -effect of renaming the functions so that the names no longer clash. Of course, -you have to do the same thing for your applications, or write them using the -new names. - - -Documentation for PCRE ----------------------- - -If you install PCRE in the normal way on a Unix-like system, you will end up -with a set of man pages whose names all start with "pcre". The one that is just -called "pcre" lists all the others. In addition to these man pages, the PCRE -documentation is supplied in two other forms: - - 1. There are files called doc/pcre.txt, doc/pcregrep.txt, and - doc/pcretest.txt in the source distribution. The first of these is a - concatenation of the text forms of all the section 3 man pages except - the listing of pcredemo.c and those that summarize individual functions. - The other two are the text forms of the section 1 man pages for the - pcregrep and pcretest commands. These text forms are provided for ease of - scanning with text editors or similar tools. They are installed in - /share/doc/pcre, where is the installation prefix - (defaulting to /usr/local). - - 2. A set of files containing all the documentation in HTML form, hyperlinked - in various ways, and rooted in a file called index.html, is distributed in - doc/html and installed in /share/doc/pcre/html. - -Users of PCRE have contributed files containing the documentation for various -releases in CHM format. These can be found in the Contrib directory of the FTP -site (see next section). - - -Contributions by users of PCRE ------------------------------- - -You can find contributions from PCRE users in the directory - - ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/Contrib - -There is a README file giving brief descriptions of what they are. Some are -complete in themselves; others are pointers to URLs containing relevant files. -Some of this material is likely to be well out-of-date. Several of the earlier -contributions provided support for compiling PCRE on various flavours of -Windows (I myself do not use Windows). Nowadays there is more Windows support -in the standard distribution, so these contibutions have been archived. - -A PCRE user maintains downloadable Windows binaries of the pcregrep and -pcretest programs here: - - http://www.rexegg.com/pcregrep-pcretest.html - - -Building PCRE on non-Unix-like systems --------------------------------------- - -For a non-Unix-like system, please read the comments in the file -NON-AUTOTOOLS-BUILD, though if your system supports the use of "configure" and -"make" you may be able to build PCRE using autotools in the same way as for -many Unix-like systems. - -PCRE can also be configured using the GUI facility provided by CMake's -cmake-gui command. This creates Makefiles, solution files, etc. The file -NON-AUTOTOOLS-BUILD has information about CMake. - -PCRE has been compiled on many different operating systems. It should be -straightforward to build PCRE on any system that has a Standard C compiler and -library, because it uses only Standard C functions. - - -Building PCRE without using autotools -------------------------------------- - -The use of autotools (in particular, libtool) is problematic in some -environments, even some that are Unix or Unix-like. See the NON-AUTOTOOLS-BUILD -file for ways of building PCRE without using autotools. - - -Building PCRE using autotools ------------------------------ - -If you are using HP's ANSI C++ compiler (aCC), please see the special note -in the section entitled "Using HP's ANSI C++ compiler (aCC)" below. - -The following instructions assume the use of the widely used "configure; make; -make install" (autotools) process. - -To build PCRE on system that supports autotools, first run the "configure" -command from the PCRE distribution directory, with your current directory set -to the directory where you want the files to be created. This command is a -standard GNU "autoconf" configuration script, for which generic instructions -are supplied in the file INSTALL. - -Most commonly, people build PCRE within its own distribution directory, and in -this case, on many systems, just running "./configure" is sufficient. However, -the usual methods of changing standard defaults are available. For example: - -CFLAGS='-O2 -Wall' ./configure --prefix=/opt/local - -This command specifies that the C compiler should be run with the flags '-O2 --Wall' instead of the default, and that "make install" should install PCRE -under /opt/local instead of the default /usr/local. - -If you want to build in a different directory, just run "configure" with that -directory as current. For example, suppose you have unpacked the PCRE source -into /source/pcre/pcre-xxx, but you want to build it in /build/pcre/pcre-xxx: - -cd /build/pcre/pcre-xxx -/source/pcre/pcre-xxx/configure - -PCRE is written in C and is normally compiled as a C library. However, it is -possible to build it as a C++ library, though the provided building apparatus -does not have any features to support this. - -There are some optional features that can be included or omitted from the PCRE -library. They are also documented in the pcrebuild man page. - -. By default, both shared and static libraries are built. You can change this - by adding one of these options to the "configure" command: - - --disable-shared - --disable-static - - (See also "Shared libraries on Unix-like systems" below.) - -. By default, only the 8-bit library is built. If you add --enable-pcre16 to - the "configure" command, the 16-bit library is also built. If you add - --enable-pcre32 to the "configure" command, the 32-bit library is also built. - If you want only the 16-bit or 32-bit library, use --disable-pcre8 to disable - building the 8-bit library. - -. If you are building the 8-bit library and want to suppress the building of - the C++ wrapper library, you can add --disable-cpp to the "configure" - command. Otherwise, when "configure" is run without --disable-pcre8, it will - try to find a C++ compiler and C++ header files, and if it succeeds, it will - try to build the C++ wrapper. - -. If you want to include support for just-in-time compiling, which can give - large performance improvements on certain platforms, add --enable-jit to the - "configure" command. This support is available only for certain hardware - architectures. If you try to enable it on an unsupported architecture, there - will be a compile time error. - -. When JIT support is enabled, pcregrep automatically makes use of it, unless - you add --disable-pcregrep-jit to the "configure" command. - -. If you want to make use of the support for UTF-8 Unicode character strings in - the 8-bit library, or UTF-16 Unicode character strings in the 16-bit library, - or UTF-32 Unicode character strings in the 32-bit library, you must add - --enable-utf to the "configure" command. Without it, the code for handling - UTF-8, UTF-16 and UTF-8 is not included in the relevant library. Even - when --enable-utf is included, the use of a UTF encoding still has to be - enabled by an option at run time. When PCRE is compiled with this option, its - input can only either be ASCII or UTF-8/16/32, even when running on EBCDIC - platforms. It is not possible to use both --enable-utf and --enable-ebcdic at - the same time. - -. There are no separate options for enabling UTF-8, UTF-16 and UTF-32 - independently because that would allow ridiculous settings such as requesting - UTF-16 support while building only the 8-bit library. However, the option - --enable-utf8 is retained for backwards compatibility with earlier releases - that did not support 16-bit or 32-bit character strings. It is synonymous with - --enable-utf. It is not possible to configure one library with UTF support - and the other without in the same configuration. - -. If, in addition to support for UTF-8/16/32 character strings, you want to - include support for the \P, \p, and \X sequences that recognize Unicode - character properties, you must add --enable-unicode-properties to the - "configure" command. This adds about 30K to the size of the library (in the - form of a property table); only the basic two-letter properties such as Lu - are supported. - -. You can build PCRE to recognize either CR or LF or the sequence CRLF or any - of the preceding, or any of the Unicode newline sequences as indicating the - end of a line. Whatever you specify at build time is the default; the caller - of PCRE can change the selection at run time. The default newline indicator - is a single LF character (the Unix standard). You can specify the default - newline indicator by adding --enable-newline-is-cr or --enable-newline-is-lf - or --enable-newline-is-crlf or --enable-newline-is-anycrlf or - --enable-newline-is-any to the "configure" command, respectively. - - If you specify --enable-newline-is-cr or --enable-newline-is-crlf, some of - the standard tests will fail, because the lines in the test files end with - LF. Even if the files are edited to change the line endings, there are likely - to be some failures. With --enable-newline-is-anycrlf or - --enable-newline-is-any, many tests should succeed, but there may be some - failures. - -. By default, the sequence \R in a pattern matches any Unicode line ending - sequence. This is independent of the option specifying what PCRE considers to - be the end of a line (see above). However, the caller of PCRE can restrict \R - to match only CR, LF, or CRLF. You can make this the default by adding - --enable-bsr-anycrlf to the "configure" command (bsr = "backslash R"). - -. When called via the POSIX interface, PCRE uses malloc() to get additional - storage for processing capturing parentheses if there are more than 10 of - them in a pattern. You can increase this threshold by setting, for example, - - --with-posix-malloc-threshold=20 - - on the "configure" command. - -. PCRE has a counter that limits the depth of nesting of parentheses in a - pattern. This limits the amount of system stack that a pattern uses when it - is compiled. The default is 250, but you can change it by setting, for - example, - - --with-parens-nest-limit=500 - -. PCRE has a counter that can be set to limit the amount of resources it uses - when matching a pattern. If the limit is exceeded during a match, the match - fails. The default is ten million. You can change the default by setting, for - example, - - --with-match-limit=500000 - - on the "configure" command. This is just the default; individual calls to - pcre_exec() can supply their own value. There is more discussion on the - pcreapi man page. - -. There is a separate counter that limits the depth of recursive function calls - during a matching process. This also has a default of ten million, which is - essentially "unlimited". You can change the default by setting, for example, - - --with-match-limit-recursion=500000 - - Recursive function calls use up the runtime stack; running out of stack can - cause programs to crash in strange ways. There is a discussion about stack - sizes in the pcrestack man page. - -. The default maximum compiled pattern size is around 64K. You can increase - this by adding --with-link-size=3 to the "configure" command. In the 8-bit - library, PCRE then uses three bytes instead of two for offsets to different - parts of the compiled pattern. In the 16-bit library, --with-link-size=3 is - the same as --with-link-size=4, which (in both libraries) uses four-byte - offsets. Increasing the internal link size reduces performance. In the 32-bit - library, the only supported link size is 4. - -. You can build PCRE so that its internal match() function that is called from - pcre_exec() does not call itself recursively. Instead, it uses memory blocks - obtained from the heap via the special functions pcre_stack_malloc() and - pcre_stack_free() to save data that would otherwise be saved on the stack. To - build PCRE like this, use - - --disable-stack-for-recursion - - on the "configure" command. PCRE runs more slowly in this mode, but it may be - necessary in environments with limited stack sizes. This applies only to the - normal execution of the pcre_exec() function; if JIT support is being - successfully used, it is not relevant. Equally, it does not apply to - pcre_dfa_exec(), which does not use deeply nested recursion. There is a - discussion about stack sizes in the pcrestack man page. - -. For speed, PCRE uses four tables for manipulating and identifying characters - whose code point values are less than 256. By default, it uses a set of - tables for ASCII encoding that is part of the distribution. If you specify - - --enable-rebuild-chartables - - a program called dftables is compiled and run in the default C locale when - you obey "make". It builds a source file called pcre_chartables.c. If you do - not specify this option, pcre_chartables.c is created as a copy of - pcre_chartables.c.dist. See "Character tables" below for further information. - -. It is possible to compile PCRE for use on systems that use EBCDIC as their - character code (as opposed to ASCII/Unicode) by specifying - - --enable-ebcdic - - This automatically implies --enable-rebuild-chartables (see above). However, - when PCRE is built this way, it always operates in EBCDIC. It cannot support - both EBCDIC and UTF-8/16/32. There is a second option, --enable-ebcdic-nl25, - which specifies that the code value for the EBCDIC NL character is 0x25 - instead of the default 0x15. - -. In environments where valgrind is installed, if you specify - - --enable-valgrind - - PCRE will use valgrind annotations to mark certain memory regions as - unaddressable. This allows it to detect invalid memory accesses, and is - mostly useful for debugging PCRE itself. - -. In environments where the gcc compiler is used and lcov version 1.6 or above - is installed, if you specify - - --enable-coverage - - the build process implements a code coverage report for the test suite. The - report is generated by running "make coverage". If ccache is installed on - your system, it must be disabled when building PCRE for coverage reporting. - You can do this by setting the environment variable CCACHE_DISABLE=1 before - running "make" to build PCRE. There is more information about coverage - reporting in the "pcrebuild" documentation. - -. The pcregrep program currently supports only 8-bit data files, and so - requires the 8-bit PCRE library. It is possible to compile pcregrep to use - libz and/or libbz2, in order to read .gz and .bz2 files (respectively), by - specifying one or both of - - --enable-pcregrep-libz - --enable-pcregrep-libbz2 - - Of course, the relevant libraries must be installed on your system. - -. The default size (in bytes) of the internal buffer used by pcregrep can be - set by, for example: - - --with-pcregrep-bufsize=51200 - - The value must be a plain integer. The default is 20480. - -. It is possible to compile pcretest so that it links with the libreadline - or libedit libraries, by specifying, respectively, - - --enable-pcretest-libreadline or --enable-pcretest-libedit - - If this is done, when pcretest's input is from a terminal, it reads it using - the readline() function. This provides line-editing and history facilities. - Note that libreadline is GPL-licenced, so if you distribute a binary of - pcretest linked in this way, there may be licensing issues. These can be - avoided by linking with libedit (which has a BSD licence) instead. - - Enabling libreadline causes the -lreadline option to be added to the pcretest - build. In many operating environments with a sytem-installed readline - library this is sufficient. However, in some environments (e.g. if an - unmodified distribution version of readline is in use), it may be necessary - to specify something like LIBS="-lncurses" as well. This is because, to quote - the readline INSTALL, "Readline uses the termcap functions, but does not link - with the termcap or curses library itself, allowing applications which link - with readline the to choose an appropriate library." If you get error - messages about missing functions tgetstr, tgetent, tputs, tgetflag, or tgoto, - this is the problem, and linking with the ncurses library should fix it. - -The "configure" script builds the following files for the basic C library: - -. Makefile the makefile that builds the library -. config.h build-time configuration options for the library -. pcre.h the public PCRE header file -. pcre-config script that shows the building settings such as CFLAGS - that were set for "configure" -. libpcre.pc ) data for the pkg-config command -. libpcre16.pc ) -. libpcre32.pc ) -. libpcreposix.pc ) -. libtool script that builds shared and/or static libraries - -Versions of config.h and pcre.h are distributed in the PCRE tarballs under the -names config.h.generic and pcre.h.generic. These are provided for those who -have to built PCRE without using "configure" or CMake. If you use "configure" -or CMake, the .generic versions are not used. - -When building the 8-bit library, if a C++ compiler is found, the following -files are also built: - -. libpcrecpp.pc data for the pkg-config command -. pcrecpparg.h header file for calling PCRE via the C++ wrapper -. pcre_stringpiece.h header for the C++ "stringpiece" functions - -The "configure" script also creates config.status, which is an executable -script that can be run to recreate the configuration, and config.log, which -contains compiler output from tests that "configure" runs. - -Once "configure" has run, you can run "make". This builds the the libraries -libpcre, libpcre16 and/or libpcre32, and a test program called pcretest. If you -enabled JIT support with --enable-jit, a test program called pcre_jit_test is -built as well. - -If the 8-bit library is built, libpcreposix and the pcregrep command are also -built, and if a C++ compiler was found on your system, and you did not disable -it with --disable-cpp, "make" builds the C++ wrapper library, which is called -libpcrecpp, as well as some test programs called pcrecpp_unittest, -pcre_scanner_unittest, and pcre_stringpiece_unittest. - -The command "make check" runs all the appropriate tests. Details of the PCRE -tests are given below in a separate section of this document. - -You can use "make install" to install PCRE into live directories on your -system. The following are installed (file names are all relative to the - that is set when "configure" is run): - - Commands (bin): - pcretest - pcregrep (if 8-bit support is enabled) - pcre-config - - Libraries (lib): - libpcre16 (if 16-bit support is enabled) - libpcre32 (if 32-bit support is enabled) - libpcre (if 8-bit support is enabled) - libpcreposix (if 8-bit support is enabled) - libpcrecpp (if 8-bit and C++ support is enabled) - - Configuration information (lib/pkgconfig): - libpcre16.pc - libpcre32.pc - libpcre.pc - libpcreposix.pc - libpcrecpp.pc (if C++ support is enabled) - - Header files (include): - pcre.h - pcreposix.h - pcre_scanner.h ) - pcre_stringpiece.h ) if C++ support is enabled - pcrecpp.h ) - pcrecpparg.h ) - - Man pages (share/man/man{1,3}): - pcregrep.1 - pcretest.1 - pcre-config.1 - pcre.3 - pcre*.3 (lots more pages, all starting "pcre") - - HTML documentation (share/doc/pcre/html): - index.html - *.html (lots more pages, hyperlinked from index.html) - - Text file documentation (share/doc/pcre): - AUTHORS - COPYING - ChangeLog - LICENCE - NEWS - README - pcre.txt (a concatenation of the man(3) pages) - pcretest.txt the pcretest man page - pcregrep.txt the pcregrep man page - pcre-config.txt the pcre-config man page - -If you want to remove PCRE from your system, you can run "make uninstall". -This removes all the files that "make install" installed. However, it does not -remove any directories, because these are often shared with other programs. - - -Retrieving configuration information ------------------------------------- - -Running "make install" installs the command pcre-config, which can be used to -recall information about the PCRE configuration and installation. For example: - - pcre-config --version - -prints the version number, and - - pcre-config --libs - -outputs information about where the library is installed. This command can be -included in makefiles for programs that use PCRE, saving the programmer from -having to remember too many details. - -The pkg-config command is another system for saving and retrieving information -about installed libraries. Instead of separate commands for each library, a -single command is used. For example: - - pkg-config --cflags pcre - -The data is held in *.pc files that are installed in a directory called -/lib/pkgconfig. - - -Shared libraries ----------------- - -The default distribution builds PCRE as shared libraries and static libraries, -as long as the operating system supports shared libraries. Shared library -support relies on the "libtool" script which is built as part of the -"configure" process. - -The libtool script is used to compile and link both shared and static -libraries. They are placed in a subdirectory called .libs when they are newly -built. The programs pcretest and pcregrep are built to use these uninstalled -libraries (by means of wrapper scripts in the case of shared libraries). When -you use "make install" to install shared libraries, pcregrep and pcretest are -automatically re-built to use the newly installed shared libraries before being -installed themselves. However, the versions left in the build directory still -use the uninstalled libraries. - -To build PCRE using static libraries only you must use --disable-shared when -configuring it. For example: - -./configure --prefix=/usr/gnu --disable-shared - -Then run "make" in the usual way. Similarly, you can use --disable-static to -build only shared libraries. - - -Cross-compiling using autotools -------------------------------- - -You can specify CC and CFLAGS in the normal way to the "configure" command, in -order to cross-compile PCRE for some other host. However, you should NOT -specify --enable-rebuild-chartables, because if you do, the dftables.c source -file is compiled and run on the local host, in order to generate the inbuilt -character tables (the pcre_chartables.c file). This will probably not work, -because dftables.c needs to be compiled with the local compiler, not the cross -compiler. - -When --enable-rebuild-chartables is not specified, pcre_chartables.c is created -by making a copy of pcre_chartables.c.dist, which is a default set of tables -that assumes ASCII code. Cross-compiling with the default tables should not be -a problem. - -If you need to modify the character tables when cross-compiling, you should -move pcre_chartables.c.dist out of the way, then compile dftables.c by hand and -run it on the local host to make a new version of pcre_chartables.c.dist. -Then when you cross-compile PCRE this new version of the tables will be used. - - -Using HP's ANSI C++ compiler (aCC) ----------------------------------- - -Unless C++ support is disabled by specifying the "--disable-cpp" option of the -"configure" script, you must include the "-AA" option in the CXXFLAGS -environment variable in order for the C++ components to compile correctly. - -Also, note that the aCC compiler on PA-RISC platforms may have a defect whereby -needed libraries fail to get included when specifying the "-AA" compiler -option. If you experience unresolved symbols when linking the C++ programs, -use the workaround of specifying the following environment variable prior to -running the "configure" script: - - CXXLDFLAGS="-lstd_v2 -lCsup_v2" - - -Compiling in Tru64 using native compilers ------------------------------------------ - -The following error may occur when compiling with native compilers in the Tru64 -operating system: - - CXX libpcrecpp_la-pcrecpp.lo -cxx: Error: /usr/lib/cmplrs/cxx/V7.1-006/include/cxx/iosfwd, line 58: #error - directive: "cannot include iosfwd -- define __USE_STD_IOSTREAM to - override default - see section 7.1.2 of the C++ Using Guide" -#error "cannot include iosfwd -- define __USE_STD_IOSTREAM to override default -- see section 7.1.2 of the C++ Using Guide" - -This may be followed by other errors, complaining that 'namespace "std" has no -member'. The solution to this is to add the line - -#define __USE_STD_IOSTREAM 1 - -to the config.h file. - - -Using Sun's compilers for Solaris ---------------------------------- - -A user reports that the following configurations work on Solaris 9 sparcv9 and -Solaris 9 x86 (32-bit): - - Solaris 9 sparcv9: ./configure --disable-cpp CC=/bin/cc CFLAGS="-m64 -g" - Solaris 9 x86: ./configure --disable-cpp CC=/bin/cc CFLAGS="-g" - - -Using PCRE from MySQL ---------------------- - -On systems where both PCRE and MySQL are installed, it is possible to make use -of PCRE from within MySQL, as an alternative to the built-in pattern matching. -There is a web page that tells you how to do this: - - http://www.mysqludf.org/lib_mysqludf_preg/index.php - - -Making new tarballs -------------------- - -The command "make dist" creates three PCRE tarballs, in tar.gz, tar.bz2, and -zip formats. The command "make distcheck" does the same, but then does a trial -build of the new distribution to ensure that it works. - -If you have modified any of the man page sources in the doc directory, you -should first run the PrepareRelease script before making a distribution. This -script creates the .txt and HTML forms of the documentation from the man pages. - - -Testing PCRE ------------- - -To test the basic PCRE library on a Unix-like system, run the RunTest script. -There is another script called RunGrepTest that tests the options of the -pcregrep command. If the C++ wrapper library is built, three test programs -called pcrecpp_unittest, pcre_scanner_unittest, and pcre_stringpiece_unittest -are also built. When JIT support is enabled, another test program called -pcre_jit_test is built. - -Both the scripts and all the program tests are run if you obey "make check" or -"make test". For other environments, see the instructions in -NON-AUTOTOOLS-BUILD. - -The RunTest script runs the pcretest test program (which is documented in its -own man page) on each of the relevant testinput files in the testdata -directory, and compares the output with the contents of the corresponding -testoutput files. RunTest uses a file called testtry to hold the main output -from pcretest. Other files whose names begin with "test" are used as working -files in some tests. - -Some tests are relevant only when certain build-time options were selected. For -example, the tests for UTF-8/16/32 support are run only if --enable-utf was -used. RunTest outputs a comment when it skips a test. - -Many of the tests that are not skipped are run up to three times. The second -run forces pcre_study() to be called for all patterns except for a few in some -tests that are marked "never study" (see the pcretest program for how this is -done). If JIT support is available, the non-DFA tests are run a third time, -this time with a forced pcre_study() with the PCRE_STUDY_JIT_COMPILE option. -This testing can be suppressed by putting "nojit" on the RunTest command line. - -The entire set of tests is run once for each of the 8-bit, 16-bit and 32-bit -libraries that are enabled. If you want to run just one set of tests, call -RunTest with either the -8, -16 or -32 option. - -If valgrind is installed, you can run the tests under it by putting "valgrind" -on the RunTest command line. To run pcretest on just one or more specific test -files, give their numbers as arguments to RunTest, for example: - - RunTest 2 7 11 - -You can also specify ranges of tests such as 3-6 or 3- (meaning 3 to the -end), or a number preceded by ~ to exclude a test. For example: - - Runtest 3-15 ~10 - -This runs tests 3 to 15, excluding test 10, and just ~13 runs all the tests -except test 13. Whatever order the arguments are in, the tests are always run -in numerical order. - -You can also call RunTest with the single argument "list" to cause it to output -a list of tests. - -The first test file can be fed directly into the perltest.pl script to check -that Perl gives the same results. The only difference you should see is in the -first few lines, where the Perl version is given instead of the PCRE version. - -The second set of tests check pcre_fullinfo(), pcre_study(), -pcre_copy_substring(), pcre_get_substring(), pcre_get_substring_list(), error -detection, and run-time flags that are specific to PCRE, as well as the POSIX -wrapper API. It also uses the debugging flags to check some of the internals of -pcre_compile(). - -If you build PCRE with a locale setting that is not the standard C locale, the -character tables may be different (see next paragraph). In some cases, this may -cause failures in the second set of tests. For example, in a locale where the -isprint() function yields TRUE for characters in the range 128-255, the use of -[:isascii:] inside a character class defines a different set of characters, and -this shows up in this test as a difference in the compiled code, which is being -listed for checking. Where the comparison test output contains [\x00-\x7f] the -test will contain [\x00-\xff], and similarly in some other cases. This is not a -bug in PCRE. - -The third set of tests checks pcre_maketables(), the facility for building a -set of character tables for a specific locale and using them instead of the -default tables. The tests make use of the "fr_FR" (French) locale. Before -running the test, the script checks for the presence of this locale by running -the "locale" command. If that command fails, or if it doesn't include "fr_FR" -in the list of available locales, the third test cannot be run, and a comment -is output to say why. If running this test produces instances of the error - - ** Failed to set locale "fr_FR" - -in the comparison output, it means that locale is not available on your system, -despite being listed by "locale". This does not mean that PCRE is broken. - -[If you are trying to run this test on Windows, you may be able to get it to -work by changing "fr_FR" to "french" everywhere it occurs. Alternatively, use -RunTest.bat. The version of RunTest.bat included with PCRE 7.4 and above uses -Windows versions of test 2. More info on using RunTest.bat is included in the -document entitled NON-UNIX-USE.] - -The fourth and fifth tests check the UTF-8/16/32 support and error handling and -internal UTF features of PCRE that are not relevant to Perl, respectively. The -sixth and seventh tests do the same for Unicode character properties support. - -The eighth, ninth, and tenth tests check the pcre_dfa_exec() alternative -matching function, in non-UTF-8/16/32 mode, UTF-8/16/32 mode, and UTF-8/16/32 -mode with Unicode property support, respectively. - -The eleventh test checks some internal offsets and code size features; it is -run only when the default "link size" of 2 is set (in other cases the sizes -change) and when Unicode property support is enabled. - -The twelfth test is run only when JIT support is available, and the thirteenth -test is run only when JIT support is not available. They test some JIT-specific -features such as information output from pcretest about JIT compilation. - -The fourteenth, fifteenth, and sixteenth tests are run only in 8-bit mode, and -the seventeenth, eighteenth, and nineteenth tests are run only in 16/32-bit -mode. These are tests that generate different output in the two modes. They are -for general cases, UTF-8/16/32 support, and Unicode property support, -respectively. - -The twentieth test is run only in 16/32-bit mode. It tests some specific -16/32-bit features of the DFA matching engine. - -The twenty-first and twenty-second tests are run only in 16/32-bit mode, when -the link size is set to 2 for the 16-bit library. They test reloading -pre-compiled patterns. - -The twenty-third and twenty-fourth tests are run only in 16-bit mode. They are -for general cases, and UTF-16 support, respectively. - -The twenty-fifth and twenty-sixth tests are run only in 32-bit mode. They are -for general cases, and UTF-32 support, respectively. - - -Character tables ----------------- - -For speed, PCRE uses four tables for manipulating and identifying characters -whose code point values are less than 256. The final argument of the -pcre_compile() function is a pointer to a block of memory containing the -concatenated tables. A call to pcre_maketables() can be used to generate a set -of tables in the current locale. If the final argument for pcre_compile() is -passed as NULL, a set of default tables that is built into the binary is used. - -The source file called pcre_chartables.c contains the default set of tables. By -default, this is created as a copy of pcre_chartables.c.dist, which contains -tables for ASCII coding. However, if --enable-rebuild-chartables is specified -for ./configure, a different version of pcre_chartables.c is built by the -program dftables (compiled from dftables.c), which uses the ANSI C character -handling functions such as isalnum(), isalpha(), isupper(), islower(), etc. to -build the table sources. This means that the default C locale which is set for -your system will control the contents of these default tables. You can change -the default tables by editing pcre_chartables.c and then re-building PCRE. If -you do this, you should take care to ensure that the file does not get -automatically re-generated. The best way to do this is to move -pcre_chartables.c.dist out of the way and replace it with your customized -tables. - -When the dftables program is run as a result of --enable-rebuild-chartables, -it uses the default C locale that is set on your system. It does not pay -attention to the LC_xxx environment variables. In other words, it uses the -system's default locale rather than whatever the compiling user happens to have -set. If you really do want to build a source set of character tables in a -locale that is specified by the LC_xxx variables, you can run the dftables -program by hand with the -L option. For example: - - ./dftables -L pcre_chartables.c.special - -The first two 256-byte tables provide lower casing and case flipping functions, -respectively. The next table consists of three 32-byte bit maps which identify -digits, "word" characters, and white space, respectively. These are used when -building 32-byte bit maps that represent character classes for code points less -than 256. - -The final 256-byte table has bits indicating various character types, as -follows: - - 1 white space character - 2 letter - 4 decimal digit - 8 hexadecimal digit - 16 alphanumeric or '_' - 128 regular expression metacharacter or binary zero - -You should not alter the set of characters that contain the 128 bit, as that -will cause PCRE to malfunction. - - -File manifest -------------- - -The distribution should contain the files listed below. Where a file name is -given as pcre[16|32]_xxx it means that there are three files, one with the name -pcre_xxx, one with the name pcre16_xx, and a third with the name pcre32_xxx. - -(A) Source files of the PCRE library functions and their headers: - - dftables.c auxiliary program for building pcre_chartables.c - when --enable-rebuild-chartables is specified - - pcre_chartables.c.dist a default set of character tables that assume ASCII - coding; used, unless --enable-rebuild-chartables is - specified, by copying to pcre[16]_chartables.c - - pcreposix.c ) - pcre[16|32]_byte_order.c ) - pcre[16|32]_compile.c ) - pcre[16|32]_config.c ) - pcre[16|32]_dfa_exec.c ) - pcre[16|32]_exec.c ) - pcre[16|32]_fullinfo.c ) - pcre[16|32]_get.c ) sources for the functions in the library, - pcre[16|32]_globals.c ) and some internal functions that they use - pcre[16|32]_jit_compile.c ) - pcre[16|32]_maketables.c ) - pcre[16|32]_newline.c ) - pcre[16|32]_refcount.c ) - pcre[16|32]_string_utils.c ) - pcre[16|32]_study.c ) - pcre[16|32]_tables.c ) - pcre[16|32]_ucd.c ) - pcre[16|32]_version.c ) - pcre[16|32]_xclass.c ) - pcre_ord2utf8.c ) - pcre_valid_utf8.c ) - pcre16_ord2utf16.c ) - pcre16_utf16_utils.c ) - pcre16_valid_utf16.c ) - pcre32_utf32_utils.c ) - pcre32_valid_utf32.c ) - - pcre[16|32]_printint.c ) debugging function that is used by pcretest, - ) and can also be #included in pcre_compile() - - pcre.h.in template for pcre.h when built by "configure" - pcreposix.h header for the external POSIX wrapper API - pcre_internal.h header for internal use - sljit/* 16 files that make up the JIT compiler - ucp.h header for Unicode property handling - - config.h.in template for config.h, which is built by "configure" - - pcrecpp.h public header file for the C++ wrapper - pcrecpparg.h.in template for another C++ header file - pcre_scanner.h public header file for C++ scanner functions - pcrecpp.cc ) - pcre_scanner.cc ) source for the C++ wrapper library - - pcre_stringpiece.h.in template for pcre_stringpiece.h, the header for the - C++ stringpiece functions - pcre_stringpiece.cc source for the C++ stringpiece functions - -(B) Source files for programs that use PCRE: - - pcredemo.c simple demonstration of coding calls to PCRE - pcregrep.c source of a grep utility that uses PCRE - pcretest.c comprehensive test program - -(C) Auxiliary files: - - 132html script to turn "man" pages into HTML - AUTHORS information about the author of PCRE - ChangeLog log of changes to the code - CleanTxt script to clean nroff output for txt man pages - Detrail script to remove trailing spaces - HACKING some notes about the internals of PCRE - INSTALL generic installation instructions - LICENCE conditions for the use of PCRE - COPYING the same, using GNU's standard name - Makefile.in ) template for Unix Makefile, which is built by - ) "configure" - Makefile.am ) the automake input that was used to create - ) Makefile.in - NEWS important changes in this release - NON-UNIX-USE the previous name for NON-AUTOTOOLS-BUILD - NON-AUTOTOOLS-BUILD notes on building PCRE without using autotools - PrepareRelease script to make preparations for "make dist" - README this file - RunTest a Unix shell script for running tests - RunGrepTest a Unix shell script for pcregrep tests - aclocal.m4 m4 macros (generated by "aclocal") - config.guess ) files used by libtool, - config.sub ) used only when building a shared library - configure a configuring shell script (built by autoconf) - configure.ac ) the autoconf input that was used to build - ) "configure" and config.h - depcomp ) script to find program dependencies, generated by - ) automake - doc/*.3 man page sources for PCRE - doc/*.1 man page sources for pcregrep and pcretest - doc/index.html.src the base HTML page - doc/html/* HTML documentation - doc/pcre.txt plain text version of the man pages - doc/pcretest.txt plain text documentation of test program - doc/perltest.txt plain text documentation of Perl test program - install-sh a shell script for installing files - libpcre16.pc.in template for libpcre16.pc for pkg-config - libpcre32.pc.in template for libpcre32.pc for pkg-config - libpcre.pc.in template for libpcre.pc for pkg-config - libpcreposix.pc.in template for libpcreposix.pc for pkg-config - libpcrecpp.pc.in template for libpcrecpp.pc for pkg-config - ltmain.sh file used to build a libtool script - missing ) common stub for a few missing GNU programs while - ) installing, generated by automake - mkinstalldirs script for making install directories - perltest.pl Perl test program - pcre-config.in source of script which retains PCRE information - pcre_jit_test.c test program for the JIT compiler - pcrecpp_unittest.cc ) - pcre_scanner_unittest.cc ) test programs for the C++ wrapper - pcre_stringpiece_unittest.cc ) - testdata/testinput* test data for main library tests - testdata/testoutput* expected test results - testdata/grep* input and output for pcregrep tests - testdata/* other supporting test files - -(D) Auxiliary files for cmake support - - cmake/COPYING-CMAKE-SCRIPTS - cmake/FindPackageHandleStandardArgs.cmake - cmake/FindEditline.cmake - cmake/FindReadline.cmake - CMakeLists.txt - config-cmake.h.in - -(E) Auxiliary files for VPASCAL - - makevp.bat - makevp_c.txt - makevp_l.txt - pcregexp.pas - -(F) Auxiliary files for building PCRE "by hand" - - pcre.h.generic ) a version of the public PCRE header file - ) for use in non-"configure" environments - config.h.generic ) a version of config.h for use in non-"configure" - ) environments - -(F) Miscellaneous - - RunTest.bat a script for running tests under Windows - -Philip Hazel -Email local part: ph10 -Email domain: cam.ac.uk -Last updated: 10 February 2015 diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/NON-AUTOTOOLS-BUILD.txt b/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/NON-AUTOTOOLS-BUILD.txt deleted file mode 100644 index 39100591..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/NON-AUTOTOOLS-BUILD.txt +++ /dev/null @@ -1,772 +0,0 @@ -Building PCRE without using autotools -------------------------------------- - -NOTE: This document relates to PCRE releases that use the original API, with -library names libpcre, libpcre16, and libpcre32. January 2015 saw the first -release of a new API, known as PCRE2, with release numbers starting at 10.00 -and library names libpcre2-8, libpcre2-16, and libpcre2-32. The old libraries -(now called PCRE1) are still being maintained for bug fixes, but there will be -no new development. New projects are advised to use the new PCRE2 libraries. - - -This document contains the following sections: - - General - Generic instructions for the PCRE C library - The C++ wrapper functions - Building for virtual Pascal - Stack size in Windows environments - Linking programs in Windows environments - Calling conventions in Windows environments - Comments about Win32 builds - Building PCRE on Windows with CMake - Use of relative paths with CMake on Windows - Testing with RunTest.bat - Building under Windows CE with Visual Studio 200x - Building under Windows with BCC5.5 - Building using Borland C++ Builder 2007 (CB2007) and higher - Building PCRE on OpenVMS - Building PCRE on Stratus OpenVOS - Building PCRE on native z/OS and z/VM - - -GENERAL - -I (Philip Hazel) have no experience of Windows or VMS sytems and how their -libraries work. The items in the PCRE distribution and Makefile that relate to -anything other than Linux systems are untested by me. - -There are some other comments and files (including some documentation in CHM -format) in the Contrib directory on the FTP site: - - ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/Contrib - -The basic PCRE library consists entirely of code written in Standard C, and so -should compile successfully on any system that has a Standard C compiler and -library. The C++ wrapper functions are a separate issue (see below). - -The PCRE distribution includes a "configure" file for use by the configure/make -(autotools) build system, as found in many Unix-like environments. The README -file contains information about the options for "configure". - -There is also support for CMake, which some users prefer, especially in Windows -environments, though it can also be run in Unix-like environments. See the -section entitled "Building PCRE on Windows with CMake" below. - -Versions of config.h and pcre.h are distributed in the PCRE tarballs under the -names config.h.generic and pcre.h.generic. These are provided for those who -build PCRE without using "configure" or CMake. If you use "configure" or CMake, -the .generic versions are not used. - - -GENERIC INSTRUCTIONS FOR THE PCRE C LIBRARY - -The following are generic instructions for building the PCRE C library "by -hand". If you are going to use CMake, this section does not apply to you; you -can skip ahead to the CMake section. - - (1) Copy or rename the file config.h.generic as config.h, and edit the macro - settings that it contains to whatever is appropriate for your environment. - - In particular, you can alter the definition of the NEWLINE macro to - specify what character(s) you want to be interpreted as line terminators. - In an EBCDIC environment, you MUST change NEWLINE, because its default - value is 10, an ASCII LF. The usual EBCDIC newline character is 21 (0x15, - NL), though in some cases it may be 37 (0x25). - - When you compile any of the PCRE modules, you must specify -DHAVE_CONFIG_H - to your compiler so that config.h is included in the sources. - - An alternative approach is not to edit config.h, but to use -D on the - compiler command line to make any changes that you need to the - configuration options. In this case -DHAVE_CONFIG_H must not be set. - - NOTE: There have been occasions when the way in which certain parameters - in config.h are used has changed between releases. (In the configure/make - world, this is handled automatically.) When upgrading to a new release, - you are strongly advised to review config.h.generic before re-using what - you had previously. - - (2) Copy or rename the file pcre.h.generic as pcre.h. - - (3) EITHER: - Copy or rename file pcre_chartables.c.dist as pcre_chartables.c. - - OR: - Compile dftables.c as a stand-alone program (using -DHAVE_CONFIG_H if - you have set up config.h), and then run it with the single argument - "pcre_chartables.c". This generates a set of standard character tables - and writes them to that file. The tables are generated using the default - C locale for your system. If you want to use a locale that is specified - by LC_xxx environment variables, add the -L option to the dftables - command. You must use this method if you are building on a system that - uses EBCDIC code. - - The tables in pcre_chartables.c are defaults. The caller of PCRE can - specify alternative tables at run time. - - (4) Ensure that you have the following header files: - - pcre_internal.h - ucp.h - - (5) For an 8-bit library, compile the following source files, setting - -DHAVE_CONFIG_H as a compiler option if you have set up config.h with your - configuration, or else use other -D settings to change the configuration - as required. - - pcre_byte_order.c - pcre_chartables.c - pcre_compile.c - pcre_config.c - pcre_dfa_exec.c - pcre_exec.c - pcre_fullinfo.c - pcre_get.c - pcre_globals.c - pcre_jit_compile.c - pcre_maketables.c - pcre_newline.c - pcre_ord2utf8.c - pcre_refcount.c - pcre_string_utils.c - pcre_study.c - pcre_tables.c - pcre_ucd.c - pcre_valid_utf8.c - pcre_version.c - pcre_xclass.c - - Make sure that you include -I. in the compiler command (or equivalent for - an unusual compiler) so that all included PCRE header files are first - sought in the current directory. Otherwise you run the risk of picking up - a previously-installed file from somewhere else. - - Note that you must still compile pcre_jit_compile.c, even if you have not - defined SUPPORT_JIT in config.h, because when JIT support is not - configured, dummy functions are compiled. When JIT support IS configured, - pcre_jit_compile.c #includes sources from the sljit subdirectory, where - there should be 16 files, all of whose names begin with "sljit". - - (6) Now link all the compiled code into an object library in whichever form - your system keeps such libraries. This is the basic PCRE C 8-bit library. - If your system has static and shared libraries, you may have to do this - once for each type. - - (7) If you want to build a 16-bit library (as well as, or instead of the 8-bit - or 32-bit libraries) repeat steps 5-6 with the following files: - - pcre16_byte_order.c - pcre16_chartables.c - pcre16_compile.c - pcre16_config.c - pcre16_dfa_exec.c - pcre16_exec.c - pcre16_fullinfo.c - pcre16_get.c - pcre16_globals.c - pcre16_jit_compile.c - pcre16_maketables.c - pcre16_newline.c - pcre16_ord2utf16.c - pcre16_refcount.c - pcre16_string_utils.c - pcre16_study.c - pcre16_tables.c - pcre16_ucd.c - pcre16_utf16_utils.c - pcre16_valid_utf16.c - pcre16_version.c - pcre16_xclass.c - - (8) If you want to build a 32-bit library (as well as, or instead of the 8-bit - or 16-bit libraries) repeat steps 5-6 with the following files: - - pcre32_byte_order.c - pcre32_chartables.c - pcre32_compile.c - pcre32_config.c - pcre32_dfa_exec.c - pcre32_exec.c - pcre32_fullinfo.c - pcre32_get.c - pcre32_globals.c - pcre32_jit_compile.c - pcre32_maketables.c - pcre32_newline.c - pcre32_ord2utf32.c - pcre32_refcount.c - pcre32_string_utils.c - pcre32_study.c - pcre32_tables.c - pcre32_ucd.c - pcre32_utf32_utils.c - pcre32_valid_utf32.c - pcre32_version.c - pcre32_xclass.c - - (9) If you want to build the POSIX wrapper functions (which apply only to the - 8-bit library), ensure that you have the pcreposix.h file and then compile - pcreposix.c (remembering -DHAVE_CONFIG_H if necessary). Link the result - (on its own) as the pcreposix library. - -(10) The pcretest program can be linked with any combination of the 8-bit, - 16-bit and 32-bit libraries (depending on what you selected in config.h). - Compile pcretest.c and pcre_printint.c (again, don't forget - -DHAVE_CONFIG_H) and link them together with the appropriate library/ies. - If you compiled an 8-bit library, pcretest also needs the pcreposix - wrapper library unless you compiled it with -DNOPOSIX. - -(11) Run pcretest on the testinput files in the testdata directory, and check - that the output matches the corresponding testoutput files. There are - comments about what each test does in the section entitled "Testing PCRE" - in the README file. If you compiled more than one of the 8-bit, 16-bit and - 32-bit libraries, you need to run pcretest with the -16 option to do - 16-bit tests and with the -32 option to do 32-bit tests. - - Some tests are relevant only when certain build-time options are selected. - For example, test 4 is for UTF-8/UTF-16/UTF-32 support, and will not run - if you have built PCRE without it. See the comments at the start of each - testinput file. If you have a suitable Unix-like shell, the RunTest script - will run the appropriate tests for you. The command "RunTest list" will - output a list of all the tests. - - Note that the supplied files are in Unix format, with just LF characters - as line terminators. You may need to edit them to change this if your - system uses a different convention. If you are using Windows, you probably - should use the wintestinput3 file instead of testinput3 (and the - corresponding output file). This is a locale test; wintestinput3 sets the - locale to "french" rather than "fr_FR", and there some minor output - differences. - -(12) If you have built PCRE with SUPPORT_JIT, the JIT features will be tested - by the testdata files. However, you might also like to build and run - the freestanding JIT test program, pcre_jit_test.c. - -(13) If you want to use the pcregrep command, compile and link pcregrep.c; it - uses only the basic 8-bit PCRE library (it does not need the pcreposix - library). - - -THE C++ WRAPPER FUNCTIONS - -The PCRE distribution also contains some C++ wrapper functions and tests, -applicable to the 8-bit library, which were contributed by Google Inc. On a -system that can use "configure" and "make", the functions are automatically -built into a library called pcrecpp. It should be straightforward to compile -the .cc files manually on other systems. The files called xxx_unittest.cc are -test programs for each of the corresponding xxx.cc files. - - -BUILDING FOR VIRTUAL PASCAL - -A script for building PCRE using Borland's C++ compiler for use with VPASCAL -was contributed by Alexander Tokarev. Stefan Weber updated the script and added -additional files. The following files in the distribution are for building PCRE -for use with VP/Borland: makevp_c.txt, makevp_l.txt, makevp.bat, pcregexp.pas. - - -STACK SIZE IN WINDOWS ENVIRONMENTS - -The default processor stack size of 1Mb in some Windows environments is too -small for matching patterns that need much recursion. In particular, test 2 may -fail because of this. Normally, running out of stack causes a crash, but there -have been cases where the test program has just died silently. See your linker -documentation for how to increase stack size if you experience problems. The -Linux default of 8Mb is a reasonable choice for the stack, though even that can -be too small for some pattern/subject combinations. - -PCRE has a compile configuration option to disable the use of stack for -recursion so that heap is used instead. However, pattern matching is -significantly slower when this is done. There is more about stack usage in the -"pcrestack" documentation. - - -LINKING PROGRAMS IN WINDOWS ENVIRONMENTS - -If you want to statically link a program against a PCRE library in the form of -a non-dll .a file, you must define PCRE_STATIC before including pcre.h or -pcrecpp.h, otherwise the pcre_malloc() and pcre_free() exported functions will -be declared __declspec(dllimport), with unwanted results. - - -CALLING CONVENTIONS IN WINDOWS ENVIRONMENTS - -It is possible to compile programs to use different calling conventions using -MSVC. Search the web for "calling conventions" for more information. To make it -easier to change the calling convention for the exported functions in the -PCRE library, the macro PCRE_CALL_CONVENTION is present in all the external -definitions. It can be set externally when compiling (e.g. in CFLAGS). If it is -not set, it defaults to empty; the default calling convention is then used -(which is what is wanted most of the time). - - -COMMENTS ABOUT WIN32 BUILDS (see also "BUILDING PCRE ON WINDOWS WITH CMAKE") - -There are two ways of building PCRE using the "configure, make, make install" -paradigm on Windows systems: using MinGW or using Cygwin. These are not at all -the same thing; they are completely different from each other. There is also -support for building using CMake, which some users find a more straightforward -way of building PCRE under Windows. - -The MinGW home page (http://www.mingw.org/) says this: - - MinGW: A collection of freely available and freely distributable Windows - specific header files and import libraries combined with GNU toolsets that - allow one to produce native Windows programs that do not rely on any - 3rd-party C runtime DLLs. - -The Cygwin home page (http://www.cygwin.com/) says this: - - Cygwin is a Linux-like environment for Windows. It consists of two parts: - - . A DLL (cygwin1.dll) which acts as a Linux API emulation layer providing - substantial Linux API functionality - - . A collection of tools which provide Linux look and feel. - - The Cygwin DLL currently works with all recent, commercially released x86 32 - bit and 64 bit versions of Windows, with the exception of Windows CE. - -On both MinGW and Cygwin, PCRE should build correctly using: - - ./configure && make && make install - -This should create two libraries called libpcre and libpcreposix, and, if you -have enabled building the C++ wrapper, a third one called libpcrecpp. These are -independent libraries: when you link with libpcreposix or libpcrecpp you must -also link with libpcre, which contains the basic functions. (Some earlier -releases of PCRE included the basic libpcre functions in libpcreposix. This no -longer happens.) - -A user submitted a special-purpose patch that makes it easy to create -"pcre.dll" under mingw32 using the "msys" environment. It provides "pcre.dll" -as a special target. If you use this target, no other files are built, and in -particular, the pcretest and pcregrep programs are not built. An example of how -this might be used is: - - ./configure --enable-utf --disable-cpp CFLAGS="-03 -s"; make pcre.dll - -Using Cygwin's compiler generates libraries and executables that depend on -cygwin1.dll. If a library that is generated this way is distributed, -cygwin1.dll has to be distributed as well. Since cygwin1.dll is under the GPL -licence, this forces not only PCRE to be under the GPL, but also the entire -application. A distributor who wants to keep their own code proprietary must -purchase an appropriate Cygwin licence. - -MinGW has no such restrictions. The MinGW compiler generates a library or -executable that can run standalone on Windows without any third party dll or -licensing issues. - -But there is more complication: - -If a Cygwin user uses the -mno-cygwin Cygwin gcc flag, what that really does is -to tell Cygwin's gcc to use the MinGW gcc. Cygwin's gcc is only acting as a -front end to MinGW's gcc (if you install Cygwin's gcc, you get both Cygwin's -gcc and MinGW's gcc). So, a user can: - -. Build native binaries by using MinGW or by getting Cygwin and using - -mno-cygwin. - -. Build binaries that depend on cygwin1.dll by using Cygwin with the normal - compiler flags. - -The test files that are supplied with PCRE are in UNIX format, with LF -characters as line terminators. Unless your PCRE library uses a default newline -option that includes LF as a valid newline, it may be necessary to change the -line terminators in the test files to get some of the tests to work. - - -BUILDING PCRE ON WINDOWS WITH CMAKE - -CMake is an alternative configuration facility that can be used instead of -"configure". CMake creates project files (make files, solution files, etc.) -tailored to numerous development environments, including Visual Studio, -Borland, Msys, MinGW, NMake, and Unix. If possible, use short paths with no -spaces in the names for your CMake installation and your PCRE source and build -directories. - -The following instructions were contributed by a PCRE user. If they are not -followed exactly, errors may occur. In the event that errors do occur, it is -recommended that you delete the CMake cache before attempting to repeat the -CMake build process. In the CMake GUI, the cache can be deleted by selecting -"File > Delete Cache". - -1. Install the latest CMake version available from http://www.cmake.org/, and - ensure that cmake\bin is on your path. - -2. Unzip (retaining folder structure) the PCRE source tree into a source - directory such as C:\pcre. You should ensure your local date and time - is not earlier than the file dates in your source dir if the release is - very new. - -3. Create a new, empty build directory, preferably a subdirectory of the - source dir. For example, C:\pcre\pcre-xx\build. - -4. Run cmake-gui from the Shell envirornment of your build tool, for example, - Msys for Msys/MinGW or Visual Studio Command Prompt for VC/VC++. Do not try - to start Cmake from the Windows Start menu, as this can lead to errors. - -5. Enter C:\pcre\pcre-xx and C:\pcre\pcre-xx\build for the source and build - directories, respectively. - -6. Hit the "Configure" button. - -7. Select the particular IDE / build tool that you are using (Visual - Studio, MSYS makefiles, MinGW makefiles, etc.) - -8. The GUI will then list several configuration options. This is where - you can enable UTF-8 support or other PCRE optional features. - -9. Hit "Configure" again. The adjacent "Generate" button should now be - active. - -10. Hit "Generate". - -11. The build directory should now contain a usable build system, be it a - solution file for Visual Studio, makefiles for MinGW, etc. Exit from - cmake-gui and use the generated build system with your compiler or IDE. - E.g., for MinGW you can run "make", or for Visual Studio, open the PCRE - solution, select the desired configuration (Debug, or Release, etc.) and - build the ALL_BUILD project. - -12. If during configuration with cmake-gui you've elected to build the test - programs, you can execute them by building the test project. E.g., for - MinGW: "make test"; for Visual Studio build the RUN_TESTS project. The - most recent build configuration is targeted by the tests. A summary of - test results is presented. Complete test output is subsequently - available for review in Testing\Temporary under your build dir. - - -USE OF RELATIVE PATHS WITH CMAKE ON WINDOWS - -A PCRE user comments as follows: I thought that others may want to know the -current state of CMAKE_USE_RELATIVE_PATHS support on Windows. Here it is: - --- AdditionalIncludeDirectories is only partially modified (only the - first path - see below) --- Only some of the contained file paths are modified - shown below for - pcre.vcproj --- It properly modifies - -I am sure CMake people can fix that if they want to. Until then one will -need to replace existing absolute paths in project files with relative -paths manually (e.g. from VS) - relative to project file location. I did -just that before being told to try CMAKE_USE_RELATIVE_PATHS. Not a big -deal. - -AdditionalIncludeDirectories="E:\builds\pcre\build;E:\builds\pcre\pcre-7.5;" -AdditionalIncludeDirectories=".;E:\builds\pcre\pcre-7.5;" - -RelativePath="pcre.h" -RelativePath="pcre_chartables.c" -RelativePath="pcre_chartables.c.rule" - - -TESTING WITH RUNTEST.BAT - -If configured with CMake, building the test project ("make test" or building -ALL_TESTS in Visual Studio) creates (and runs) pcre_test.bat (and depending -on your configuration options, possibly other test programs) in the build -directory. Pcre_test.bat runs RunTest.Bat with correct source and exe paths. - -For manual testing with RunTest.bat, provided the build dir is a subdirectory -of the source directory: Open command shell window. Chdir to the location -of your pcretest.exe and pcregrep.exe programs. Call RunTest.bat with -"..\RunTest.Bat" or "..\..\RunTest.bat" as appropriate. - -To run only a particular test with RunTest.Bat provide a test number argument. - -Otherwise: - -1. Copy RunTest.bat into the directory where pcretest.exe and pcregrep.exe - have been created. - -2. Edit RunTest.bat to indentify the full or relative location of - the pcre source (wherein which the testdata folder resides), e.g.: - - set srcdir=C:\pcre\pcre-8.20 - -3. In a Windows command environment, chdir to the location of your bat and - exe programs. - -4. Run RunTest.bat. Test outputs will automatically be compared to expected - results, and discrepancies will be identified in the console output. - -To independently test the just-in-time compiler, run pcre_jit_test.exe. -To test pcrecpp, run pcrecpp_unittest.exe, pcre_stringpiece_unittest.exe and -pcre_scanner_unittest.exe. - - -BUILDING UNDER WINDOWS CE WITH VISUAL STUDIO 200x - -Vincent Richomme sent a zip archive of files to help with this process. They -can be found in the file "pcre-vsbuild.zip" in the Contrib directory of the FTP -site. - - -BUILDING UNDER WINDOWS WITH BCC5.5 - -Michael Roy sent these comments about building PCRE under Windows with BCC5.5: - -Some of the core BCC libraries have a version of PCRE from 1998 built in, which -can lead to pcre_exec() giving an erroneous PCRE_ERROR_NULL from a version -mismatch. I'm including an easy workaround below, if you'd like to include it -in the non-unix instructions: - -When linking a project with BCC5.5, pcre.lib must be included before any of the -libraries cw32.lib, cw32i.lib, cw32mt.lib, and cw32mti.lib on the command line. - - -BUILDING USING BORLAND C++ BUILDER 2007 (CB2007) AND HIGHER - -A PCRE user sent these comments about this environment (see also the comment -from another user that follows them): - -The XE versions of C++ Builder come with a RegularExpressionsCore class which -contain a version of TPerlRegEx. However, direct use of the C PCRE library may -be desirable. - -The default makevp.bat, however, supplied with PCRE builds a version of PCRE -that is not usable with any version of C++ Builder because the compiler ships -with an embedded version of PCRE, version 2.01 from 1998! [See also the note -about BCC5.5 above.] If you want to use PCRE you'll need to rename the -functions (pcre_compile to pcre_compile_bcc, etc) or do as I have done and just -use the 16 bit versions. I'm using std::wstring everywhere anyway. Since the -embedded version of PCRE does not have the 16 bit function names, there is no -conflict. - -Building PCRE using a C++ Builder static library project file (recommended): - -1. Rename or remove pcre.h, pcreposi.h, and pcreposix.h from your C++ Builder -original include path. - -2. Download PCRE from pcre.org and extract to a directory. - -3. Rename pcre_chartables.c.dist to pcre_chartables.c, pcre.h.generic to -pcre.h, and config.h.generic to config.h. - -4. Edit pcre.h and pcre_config.c so that they include config.h. - -5. Edit config.h like so: - -Comment out the following lines: -#define PACKAGE "pcre" -#define PACKAGE_BUGREPORT "" -#define PACKAGE_NAME "PCRE" -#define PACKAGE_STRING "PCRE 8.32" -#define PACKAGE_TARNAME "pcre" -#define PACKAGE_URL "" -#define PACKAGE_VERSION "8.32" - -Add the following lines: -#ifndef SUPPORT_UTF -#define SUPPORT_UTF 100 // any value is fine -#endif - -#ifndef SUPPORT_UCP -#define SUPPORT_UCP 101 // any value is fine -#endif - -#ifndef SUPPORT_UCP -#define SUPPORT_PCRE16 102 // any value is fine -#endif - -#ifndef SUPPORT_UTF8 -#define SUPPORT_UTF8 103 // any value is fine -#endif - -6. Build a C++ Builder project using the IDE. Go to File / New / Other and -choose Static Library. You can name it pcre.cbproj or whatever. Now set your -paths by going to Project / Options. Set the Include path. Do this from the -"Base" option to apply to both Release and Debug builds. Now add the following -files to the project: - -pcre.h -pcre16_byte_order.c -pcre16_chartables.c -pcre16_compile.c -pcre16_config.c -pcre16_dfa_exec.c -pcre16_exec.c -pcre16_fullinfo.c -pcre16_get.c -pcre16_globals.c -pcre16_maketables.c -pcre16_newline.c -pcre16_ord2utf16.c -pcre16_printint.c -pcre16_refcount.c -pcre16_string_utils.c -pcre16_study.c -pcre16_tables.c -pcre16_ucd.c -pcre16_utf16_utils.c -pcre16_valid_utf16.c -pcre16_version.c -pcre16_xclass.c - -//Optional -pcre_version.c - -7. After compiling the .lib file, copy the .lib and header files to a project -you want to use PCRE with. Enjoy. - -Optional ... Building PCRE using the makevp.bat file: - -1. Edit makevp_c.txt and makevp_l.txt and change all the names to the 16 bit -versions. - -2. Edit makevp.bat and set the path to C++ Builder. Run makevp.bat. - -Another PCRE user added this comment: - -Another approach I successfully used for some years with BCB 5 and 6 was to -make sure that include and library paths of PCRE are configured before the -default paths of the IDE in the dialogs where one can manage those paths. -Afterwards one can open the project files using a text editor and manually add -the self created library for pcre itself, pcrecpp doesn't ship with the IDE, in -the library nodes where the IDE manages its own libraries to link against in -front of the IDE-own libraries. This way one can use the default PCRE function -names without getting access violations on runtime. - - - - -BUILDING PCRE ON OPENVMS - -Stephen Hoffman sent the following, in December 2012: - -"Here is a very short write-up on the -OpenVMS port and here - - - -is a zip with the OpenVMS files, and with one modified testing-related PCRE -file." This is a port of PCRE 8.32. - -Earlier, Dan Mooney sent the following comments about building PCRE on OpenVMS. -They relate to an older version of PCRE that used fewer source files, so the -exact commands will need changing. See the current list of source files above. - -"It was quite easy to compile and link the library. I don't have a formal -make file but the attached file [reproduced below] contains the OpenVMS DCL -commands I used to build the library. I had to add #define -POSIX_MALLOC_THRESHOLD 10 to pcre.h since it was not defined anywhere. - -The library was built on: -O/S: HP OpenVMS v7.3-1 -Compiler: Compaq C v6.5-001-48BCD -Linker: vA13-01 - -The test results did not match 100% due to the issues you mention in your -documentation regarding isprint(), iscntrl(), isgraph() and ispunct(). I -modified some of the character tables temporarily and was able to get the -results to match. Tests using the fr locale did not match since I don't have -that locale loaded. The study size was always reported to be 3 less than the -value in the standard test output files." - -========================= -$! This DCL procedure builds PCRE on OpenVMS -$! -$! I followed the instructions in the non-unix-use file in the distribution. -$! -$ COMPILE == "CC/LIST/NOMEMBER_ALIGNMENT/PREFIX_LIBRARY_ENTRIES=ALL_ENTRIES -$ COMPILE DFTABLES.C -$ LINK/EXE=DFTABLES.EXE DFTABLES.OBJ -$ RUN DFTABLES.EXE/OUTPUT=CHARTABLES.C -$ COMPILE MAKETABLES.C -$ COMPILE GET.C -$ COMPILE STUDY.C -$! I had to set POSIX_MALLOC_THRESHOLD to 10 in PCRE.H since the symbol -$! did not seem to be defined anywhere. -$! I edited pcre.h and added #DEFINE SUPPORT_UTF8 to enable UTF8 support. -$ COMPILE PCRE.C -$ LIB/CREATE PCRE MAKETABLES.OBJ, GET.OBJ, STUDY.OBJ, PCRE.OBJ -$! I had to set POSIX_MALLOC_THRESHOLD to 10 in PCRE.H since the symbol -$! did not seem to be defined anywhere. -$ COMPILE PCREPOSIX.C -$ LIB/CREATE PCREPOSIX PCREPOSIX.OBJ -$ COMPILE PCRETEST.C -$ LINK/EXE=PCRETEST.EXE PCRETEST.OBJ, PCRE/LIB, PCREPOSIX/LIB -$! C programs that want access to command line arguments must be -$! defined as a symbol -$ PCRETEST :== "$ SYS$ROADSUSERS:[DMOONEY.REGEXP]PCRETEST.EXE" -$! Arguments must be enclosed in quotes. -$ PCRETEST "-C" -$! Test results: -$! -$! The test results did not match 100%. The functions isprint(), iscntrl(), -$! isgraph() and ispunct() on OpenVMS must not produce the same results -$! as the system that built the test output files provided with the -$! distribution. -$! -$! The study size did not match and was always 3 less on OpenVMS. -$! -$! Locale could not be set to fr -$! -========================= - - -BUILDING PCRE ON STRATUS OPENVOS - -These notes on the port of PCRE to VOS (lightly edited) were supplied by -Ashutosh Warikoo, whose email address has the local part awarikoo and the -domain nse.co.in. The port was for version 7.9 in August 2009. - -1. Building PCRE - -I built pcre on OpenVOS Release 17.0.1at using GNU Tools 3.4a without any -problems. I used the following packages to build PCRE: - - ftp://ftp.stratus.com/pub/vos/posix/ga/posix.save.evf.gz - -Please read and follow the instructions that come with these packages. To start -the build of pcre, from the root of the package type: - - ./build.sh - -2. Installing PCRE - -Once you have successfully built PCRE, login to the SysAdmin group, switch to -the root user, and type - - [ !create_dir (master_disk)>usr --if needed ] - [ !create_dir (master_disk)>usr>local --if needed ] - !gmake install - -This installs PCRE and its man pages into /usr/local. You can add -(master_disk)>usr>local>bin to your command search paths, or if you are in -BASH, add /usr/local/bin to the PATH environment variable. - -4. Restrictions - -This port requires readline library optionally. However during the build I -faced some yet unexplored errors while linking with readline. As it was an -optional component I chose to disable it. - -5. Known Problems - -I ran the test suite, but you will have to be your own judge of whether this -command, and this port, suits your purposes. If you find any problems that -appear to be related to the port itself, please let me know. Please see the -build.log file in the root of the package also. - - -BUILDING PCRE ON NATIVE Z/OS AND Z/VM - -z/OS and z/VM are operating systems for mainframe computers, produced by IBM. -The character code used is EBCDIC, not ASCII or Unicode. In z/OS, UNIX APIs and -applications can be supported through UNIX System Services, and in such an -environment PCRE can be built in the same way as in other systems. However, in -native z/OS (without UNIX System Services) and in z/VM, special ports are -required. For details, please see this web site: - - http://www.zaconsultants.net - -You may download PCRE from WWW.CBTTAPE.ORG, file 882.  Everything, source and -executable, is in EBCDIC and native z/OS file formats and this is the -recommended download site. - -========================== -Last Updated: 25 June 2015 diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/README.txt b/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/README.txt deleted file mode 100644 index 4887ebf3..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/README.txt +++ /dev/null @@ -1,1002 +0,0 @@ -README file for PCRE (Perl-compatible regular expression library) ------------------------------------------------------------------ - -NOTE: This set of files relates to PCRE releases that use the original API, -with library names libpcre, libpcre16, and libpcre32. January 2015 saw the -first release of a new API, known as PCRE2, with release numbers starting at -10.00 and library names libpcre2-8, libpcre2-16, and libpcre2-32. The old -libraries (now called PCRE1) are still being maintained for bug fixes, but -there will be no new development. New projects are advised to use the new PCRE2 -libraries. - - -The latest release of PCRE1 is always available in three alternative formats -from: - - ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-xxx.tar.gz - ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-xxx.tar.bz2 - ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-xxx.zip - -There is a mailing list for discussion about the development of PCRE at -pcre-dev@exim.org. You can access the archives and subscribe or manage your -subscription here: - - https://lists.exim.org/mailman/listinfo/pcre-dev - -Please read the NEWS file if you are upgrading from a previous release. -The contents of this README file are: - - The PCRE APIs - Documentation for PCRE - Contributions by users of PCRE - Building PCRE on non-Unix-like systems - Building PCRE without using autotools - Building PCRE using autotools - Retrieving configuration information - Shared libraries - Cross-compiling using autotools - Using HP's ANSI C++ compiler (aCC) - Compiling in Tru64 using native compilers - Using Sun's compilers for Solaris - Using PCRE from MySQL - Making new tarballs - Testing PCRE - Character tables - File manifest - - -The PCRE APIs -------------- - -PCRE is written in C, and it has its own API. There are three sets of -functions, one for the 8-bit library, which processes strings of bytes, one for -the 16-bit library, which processes strings of 16-bit values, and one for the -32-bit library, which processes strings of 32-bit values. The distribution also -includes a set of C++ wrapper functions (see the pcrecpp man page for details), -courtesy of Google Inc., which can be used to call the 8-bit PCRE library from -C++. Other C++ wrappers have been created from time to time. See, for example: -https://github.com/YasserAsmi/regexp, which aims to be simple and similar in -style to the C API. - -The distribution also contains a set of C wrapper functions (again, just for -the 8-bit library) that are based on the POSIX regular expression API (see the -pcreposix man page). These end up in the library called libpcreposix. Note that -this just provides a POSIX calling interface to PCRE; the regular expressions -themselves still follow Perl syntax and semantics. The POSIX API is restricted, -and does not give full access to all of PCRE's facilities. - -The header file for the POSIX-style functions is called pcreposix.h. The -official POSIX name is regex.h, but I did not want to risk possible problems -with existing files of that name by distributing it that way. To use PCRE with -an existing program that uses the POSIX API, pcreposix.h will have to be -renamed or pointed at by a link. - -If you are using the POSIX interface to PCRE and there is already a POSIX regex -library installed on your system, as well as worrying about the regex.h header -file (as mentioned above), you must also take care when linking programs to -ensure that they link with PCRE's libpcreposix library. Otherwise they may pick -up the POSIX functions of the same name from the other library. - -One way of avoiding this confusion is to compile PCRE with the addition of --Dregcomp=PCREregcomp (and similarly for the other POSIX functions) to the -compiler flags (CFLAGS if you are using "configure" -- see below). This has the -effect of renaming the functions so that the names no longer clash. Of course, -you have to do the same thing for your applications, or write them using the -new names. - - -Documentation for PCRE ----------------------- - -If you install PCRE in the normal way on a Unix-like system, you will end up -with a set of man pages whose names all start with "pcre". The one that is just -called "pcre" lists all the others. In addition to these man pages, the PCRE -documentation is supplied in two other forms: - - 1. There are files called doc/pcre.txt, doc/pcregrep.txt, and - doc/pcretest.txt in the source distribution. The first of these is a - concatenation of the text forms of all the section 3 man pages except - the listing of pcredemo.c and those that summarize individual functions. - The other two are the text forms of the section 1 man pages for the - pcregrep and pcretest commands. These text forms are provided for ease of - scanning with text editors or similar tools. They are installed in - /share/doc/pcre, where is the installation prefix - (defaulting to /usr/local). - - 2. A set of files containing all the documentation in HTML form, hyperlinked - in various ways, and rooted in a file called index.html, is distributed in - doc/html and installed in /share/doc/pcre/html. - -Users of PCRE have contributed files containing the documentation for various -releases in CHM format. These can be found in the Contrib directory of the FTP -site (see next section). - - -Contributions by users of PCRE ------------------------------- - -You can find contributions from PCRE users in the directory - - ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/Contrib - -There is a README file giving brief descriptions of what they are. Some are -complete in themselves; others are pointers to URLs containing relevant files. -Some of this material is likely to be well out-of-date. Several of the earlier -contributions provided support for compiling PCRE on various flavours of -Windows (I myself do not use Windows). Nowadays there is more Windows support -in the standard distribution, so these contibutions have been archived. - -A PCRE user maintains downloadable Windows binaries of the pcregrep and -pcretest programs here: - - http://www.rexegg.com/pcregrep-pcretest.html - - -Building PCRE on non-Unix-like systems --------------------------------------- - -For a non-Unix-like system, please read the comments in the file -NON-AUTOTOOLS-BUILD, though if your system supports the use of "configure" and -"make" you may be able to build PCRE using autotools in the same way as for -many Unix-like systems. - -PCRE can also be configured using the GUI facility provided by CMake's -cmake-gui command. This creates Makefiles, solution files, etc. The file -NON-AUTOTOOLS-BUILD has information about CMake. - -PCRE has been compiled on many different operating systems. It should be -straightforward to build PCRE on any system that has a Standard C compiler and -library, because it uses only Standard C functions. - - -Building PCRE without using autotools -------------------------------------- - -The use of autotools (in particular, libtool) is problematic in some -environments, even some that are Unix or Unix-like. See the NON-AUTOTOOLS-BUILD -file for ways of building PCRE without using autotools. - - -Building PCRE using autotools ------------------------------ - -If you are using HP's ANSI C++ compiler (aCC), please see the special note -in the section entitled "Using HP's ANSI C++ compiler (aCC)" below. - -The following instructions assume the use of the widely used "configure; make; -make install" (autotools) process. - -To build PCRE on system that supports autotools, first run the "configure" -command from the PCRE distribution directory, with your current directory set -to the directory where you want the files to be created. This command is a -standard GNU "autoconf" configuration script, for which generic instructions -are supplied in the file INSTALL. - -Most commonly, people build PCRE within its own distribution directory, and in -this case, on many systems, just running "./configure" is sufficient. However, -the usual methods of changing standard defaults are available. For example: - -CFLAGS='-O2 -Wall' ./configure --prefix=/opt/local - -This command specifies that the C compiler should be run with the flags '-O2 --Wall' instead of the default, and that "make install" should install PCRE -under /opt/local instead of the default /usr/local. - -If you want to build in a different directory, just run "configure" with that -directory as current. For example, suppose you have unpacked the PCRE source -into /source/pcre/pcre-xxx, but you want to build it in /build/pcre/pcre-xxx: - -cd /build/pcre/pcre-xxx -/source/pcre/pcre-xxx/configure - -PCRE is written in C and is normally compiled as a C library. However, it is -possible to build it as a C++ library, though the provided building apparatus -does not have any features to support this. - -There are some optional features that can be included or omitted from the PCRE -library. They are also documented in the pcrebuild man page. - -. By default, both shared and static libraries are built. You can change this - by adding one of these options to the "configure" command: - - --disable-shared - --disable-static - - (See also "Shared libraries on Unix-like systems" below.) - -. By default, only the 8-bit library is built. If you add --enable-pcre16 to - the "configure" command, the 16-bit library is also built. If you add - --enable-pcre32 to the "configure" command, the 32-bit library is also built. - If you want only the 16-bit or 32-bit library, use --disable-pcre8 to disable - building the 8-bit library. - -. If you are building the 8-bit library and want to suppress the building of - the C++ wrapper library, you can add --disable-cpp to the "configure" - command. Otherwise, when "configure" is run without --disable-pcre8, it will - try to find a C++ compiler and C++ header files, and if it succeeds, it will - try to build the C++ wrapper. - -. If you want to include support for just-in-time compiling, which can give - large performance improvements on certain platforms, add --enable-jit to the - "configure" command. This support is available only for certain hardware - architectures. If you try to enable it on an unsupported architecture, there - will be a compile time error. - -. When JIT support is enabled, pcregrep automatically makes use of it, unless - you add --disable-pcregrep-jit to the "configure" command. - -. If you want to make use of the support for UTF-8 Unicode character strings in - the 8-bit library, or UTF-16 Unicode character strings in the 16-bit library, - or UTF-32 Unicode character strings in the 32-bit library, you must add - --enable-utf to the "configure" command. Without it, the code for handling - UTF-8, UTF-16 and UTF-8 is not included in the relevant library. Even - when --enable-utf is included, the use of a UTF encoding still has to be - enabled by an option at run time. When PCRE is compiled with this option, its - input can only either be ASCII or UTF-8/16/32, even when running on EBCDIC - platforms. It is not possible to use both --enable-utf and --enable-ebcdic at - the same time. - -. There are no separate options for enabling UTF-8, UTF-16 and UTF-32 - independently because that would allow ridiculous settings such as requesting - UTF-16 support while building only the 8-bit library. However, the option - --enable-utf8 is retained for backwards compatibility with earlier releases - that did not support 16-bit or 32-bit character strings. It is synonymous with - --enable-utf. It is not possible to configure one library with UTF support - and the other without in the same configuration. - -. If, in addition to support for UTF-8/16/32 character strings, you want to - include support for the \P, \p, and \X sequences that recognize Unicode - character properties, you must add --enable-unicode-properties to the - "configure" command. This adds about 30K to the size of the library (in the - form of a property table); only the basic two-letter properties such as Lu - are supported. - -. You can build PCRE to recognize either CR or LF or the sequence CRLF or any - of the preceding, or any of the Unicode newline sequences as indicating the - end of a line. Whatever you specify at build time is the default; the caller - of PCRE can change the selection at run time. The default newline indicator - is a single LF character (the Unix standard). You can specify the default - newline indicator by adding --enable-newline-is-cr or --enable-newline-is-lf - or --enable-newline-is-crlf or --enable-newline-is-anycrlf or - --enable-newline-is-any to the "configure" command, respectively. - - If you specify --enable-newline-is-cr or --enable-newline-is-crlf, some of - the standard tests will fail, because the lines in the test files end with - LF. Even if the files are edited to change the line endings, there are likely - to be some failures. With --enable-newline-is-anycrlf or - --enable-newline-is-any, many tests should succeed, but there may be some - failures. - -. By default, the sequence \R in a pattern matches any Unicode line ending - sequence. This is independent of the option specifying what PCRE considers to - be the end of a line (see above). However, the caller of PCRE can restrict \R - to match only CR, LF, or CRLF. You can make this the default by adding - --enable-bsr-anycrlf to the "configure" command (bsr = "backslash R"). - -. When called via the POSIX interface, PCRE uses malloc() to get additional - storage for processing capturing parentheses if there are more than 10 of - them in a pattern. You can increase this threshold by setting, for example, - - --with-posix-malloc-threshold=20 - - on the "configure" command. - -. PCRE has a counter that limits the depth of nesting of parentheses in a - pattern. This limits the amount of system stack that a pattern uses when it - is compiled. The default is 250, but you can change it by setting, for - example, - - --with-parens-nest-limit=500 - -. PCRE has a counter that can be set to limit the amount of resources it uses - when matching a pattern. If the limit is exceeded during a match, the match - fails. The default is ten million. You can change the default by setting, for - example, - - --with-match-limit=500000 - - on the "configure" command. This is just the default; individual calls to - pcre_exec() can supply their own value. There is more discussion on the - pcreapi man page. - -. There is a separate counter that limits the depth of recursive function calls - during a matching process. This also has a default of ten million, which is - essentially "unlimited". You can change the default by setting, for example, - - --with-match-limit-recursion=500000 - - Recursive function calls use up the runtime stack; running out of stack can - cause programs to crash in strange ways. There is a discussion about stack - sizes in the pcrestack man page. - -. The default maximum compiled pattern size is around 64K. You can increase - this by adding --with-link-size=3 to the "configure" command. In the 8-bit - library, PCRE then uses three bytes instead of two for offsets to different - parts of the compiled pattern. In the 16-bit library, --with-link-size=3 is - the same as --with-link-size=4, which (in both libraries) uses four-byte - offsets. Increasing the internal link size reduces performance. In the 32-bit - library, the only supported link size is 4. - -. You can build PCRE so that its internal match() function that is called from - pcre_exec() does not call itself recursively. Instead, it uses memory blocks - obtained from the heap via the special functions pcre_stack_malloc() and - pcre_stack_free() to save data that would otherwise be saved on the stack. To - build PCRE like this, use - - --disable-stack-for-recursion - - on the "configure" command. PCRE runs more slowly in this mode, but it may be - necessary in environments with limited stack sizes. This applies only to the - normal execution of the pcre_exec() function; if JIT support is being - successfully used, it is not relevant. Equally, it does not apply to - pcre_dfa_exec(), which does not use deeply nested recursion. There is a - discussion about stack sizes in the pcrestack man page. - -. For speed, PCRE uses four tables for manipulating and identifying characters - whose code point values are less than 256. By default, it uses a set of - tables for ASCII encoding that is part of the distribution. If you specify - - --enable-rebuild-chartables - - a program called dftables is compiled and run in the default C locale when - you obey "make". It builds a source file called pcre_chartables.c. If you do - not specify this option, pcre_chartables.c is created as a copy of - pcre_chartables.c.dist. See "Character tables" below for further information. - -. It is possible to compile PCRE for use on systems that use EBCDIC as their - character code (as opposed to ASCII/Unicode) by specifying - - --enable-ebcdic - - This automatically implies --enable-rebuild-chartables (see above). However, - when PCRE is built this way, it always operates in EBCDIC. It cannot support - both EBCDIC and UTF-8/16/32. There is a second option, --enable-ebcdic-nl25, - which specifies that the code value for the EBCDIC NL character is 0x25 - instead of the default 0x15. - -. In environments where valgrind is installed, if you specify - - --enable-valgrind - - PCRE will use valgrind annotations to mark certain memory regions as - unaddressable. This allows it to detect invalid memory accesses, and is - mostly useful for debugging PCRE itself. - -. In environments where the gcc compiler is used and lcov version 1.6 or above - is installed, if you specify - - --enable-coverage - - the build process implements a code coverage report for the test suite. The - report is generated by running "make coverage". If ccache is installed on - your system, it must be disabled when building PCRE for coverage reporting. - You can do this by setting the environment variable CCACHE_DISABLE=1 before - running "make" to build PCRE. There is more information about coverage - reporting in the "pcrebuild" documentation. - -. The pcregrep program currently supports only 8-bit data files, and so - requires the 8-bit PCRE library. It is possible to compile pcregrep to use - libz and/or libbz2, in order to read .gz and .bz2 files (respectively), by - specifying one or both of - - --enable-pcregrep-libz - --enable-pcregrep-libbz2 - - Of course, the relevant libraries must be installed on your system. - -. The default size (in bytes) of the internal buffer used by pcregrep can be - set by, for example: - - --with-pcregrep-bufsize=51200 - - The value must be a plain integer. The default is 20480. - -. It is possible to compile pcretest so that it links with the libreadline - or libedit libraries, by specifying, respectively, - - --enable-pcretest-libreadline or --enable-pcretest-libedit - - If this is done, when pcretest's input is from a terminal, it reads it using - the readline() function. This provides line-editing and history facilities. - Note that libreadline is GPL-licenced, so if you distribute a binary of - pcretest linked in this way, there may be licensing issues. These can be - avoided by linking with libedit (which has a BSD licence) instead. - - Enabling libreadline causes the -lreadline option to be added to the pcretest - build. In many operating environments with a sytem-installed readline - library this is sufficient. However, in some environments (e.g. if an - unmodified distribution version of readline is in use), it may be necessary - to specify something like LIBS="-lncurses" as well. This is because, to quote - the readline INSTALL, "Readline uses the termcap functions, but does not link - with the termcap or curses library itself, allowing applications which link - with readline the to choose an appropriate library." If you get error - messages about missing functions tgetstr, tgetent, tputs, tgetflag, or tgoto, - this is the problem, and linking with the ncurses library should fix it. - -The "configure" script builds the following files for the basic C library: - -. Makefile the makefile that builds the library -. config.h build-time configuration options for the library -. pcre.h the public PCRE header file -. pcre-config script that shows the building settings such as CFLAGS - that were set for "configure" -. libpcre.pc ) data for the pkg-config command -. libpcre16.pc ) -. libpcre32.pc ) -. libpcreposix.pc ) -. libtool script that builds shared and/or static libraries - -Versions of config.h and pcre.h are distributed in the PCRE tarballs under the -names config.h.generic and pcre.h.generic. These are provided for those who -have to built PCRE without using "configure" or CMake. If you use "configure" -or CMake, the .generic versions are not used. - -When building the 8-bit library, if a C++ compiler is found, the following -files are also built: - -. libpcrecpp.pc data for the pkg-config command -. pcrecpparg.h header file for calling PCRE via the C++ wrapper -. pcre_stringpiece.h header for the C++ "stringpiece" functions - -The "configure" script also creates config.status, which is an executable -script that can be run to recreate the configuration, and config.log, which -contains compiler output from tests that "configure" runs. - -Once "configure" has run, you can run "make". This builds the the libraries -libpcre, libpcre16 and/or libpcre32, and a test program called pcretest. If you -enabled JIT support with --enable-jit, a test program called pcre_jit_test is -built as well. - -If the 8-bit library is built, libpcreposix and the pcregrep command are also -built, and if a C++ compiler was found on your system, and you did not disable -it with --disable-cpp, "make" builds the C++ wrapper library, which is called -libpcrecpp, as well as some test programs called pcrecpp_unittest, -pcre_scanner_unittest, and pcre_stringpiece_unittest. - -The command "make check" runs all the appropriate tests. Details of the PCRE -tests are given below in a separate section of this document. - -You can use "make install" to install PCRE into live directories on your -system. The following are installed (file names are all relative to the - that is set when "configure" is run): - - Commands (bin): - pcretest - pcregrep (if 8-bit support is enabled) - pcre-config - - Libraries (lib): - libpcre16 (if 16-bit support is enabled) - libpcre32 (if 32-bit support is enabled) - libpcre (if 8-bit support is enabled) - libpcreposix (if 8-bit support is enabled) - libpcrecpp (if 8-bit and C++ support is enabled) - - Configuration information (lib/pkgconfig): - libpcre16.pc - libpcre32.pc - libpcre.pc - libpcreposix.pc - libpcrecpp.pc (if C++ support is enabled) - - Header files (include): - pcre.h - pcreposix.h - pcre_scanner.h ) - pcre_stringpiece.h ) if C++ support is enabled - pcrecpp.h ) - pcrecpparg.h ) - - Man pages (share/man/man{1,3}): - pcregrep.1 - pcretest.1 - pcre-config.1 - pcre.3 - pcre*.3 (lots more pages, all starting "pcre") - - HTML documentation (share/doc/pcre/html): - index.html - *.html (lots more pages, hyperlinked from index.html) - - Text file documentation (share/doc/pcre): - AUTHORS - COPYING - ChangeLog - LICENCE - NEWS - README - pcre.txt (a concatenation of the man(3) pages) - pcretest.txt the pcretest man page - pcregrep.txt the pcregrep man page - pcre-config.txt the pcre-config man page - -If you want to remove PCRE from your system, you can run "make uninstall". -This removes all the files that "make install" installed. However, it does not -remove any directories, because these are often shared with other programs. - - -Retrieving configuration information ------------------------------------- - -Running "make install" installs the command pcre-config, which can be used to -recall information about the PCRE configuration and installation. For example: - - pcre-config --version - -prints the version number, and - - pcre-config --libs - -outputs information about where the library is installed. This command can be -included in makefiles for programs that use PCRE, saving the programmer from -having to remember too many details. - -The pkg-config command is another system for saving and retrieving information -about installed libraries. Instead of separate commands for each library, a -single command is used. For example: - - pkg-config --cflags pcre - -The data is held in *.pc files that are installed in a directory called -/lib/pkgconfig. - - -Shared libraries ----------------- - -The default distribution builds PCRE as shared libraries and static libraries, -as long as the operating system supports shared libraries. Shared library -support relies on the "libtool" script which is built as part of the -"configure" process. - -The libtool script is used to compile and link both shared and static -libraries. They are placed in a subdirectory called .libs when they are newly -built. The programs pcretest and pcregrep are built to use these uninstalled -libraries (by means of wrapper scripts in the case of shared libraries). When -you use "make install" to install shared libraries, pcregrep and pcretest are -automatically re-built to use the newly installed shared libraries before being -installed themselves. However, the versions left in the build directory still -use the uninstalled libraries. - -To build PCRE using static libraries only you must use --disable-shared when -configuring it. For example: - -./configure --prefix=/usr/gnu --disable-shared - -Then run "make" in the usual way. Similarly, you can use --disable-static to -build only shared libraries. - - -Cross-compiling using autotools -------------------------------- - -You can specify CC and CFLAGS in the normal way to the "configure" command, in -order to cross-compile PCRE for some other host. However, you should NOT -specify --enable-rebuild-chartables, because if you do, the dftables.c source -file is compiled and run on the local host, in order to generate the inbuilt -character tables (the pcre_chartables.c file). This will probably not work, -because dftables.c needs to be compiled with the local compiler, not the cross -compiler. - -When --enable-rebuild-chartables is not specified, pcre_chartables.c is created -by making a copy of pcre_chartables.c.dist, which is a default set of tables -that assumes ASCII code. Cross-compiling with the default tables should not be -a problem. - -If you need to modify the character tables when cross-compiling, you should -move pcre_chartables.c.dist out of the way, then compile dftables.c by hand and -run it on the local host to make a new version of pcre_chartables.c.dist. -Then when you cross-compile PCRE this new version of the tables will be used. - - -Using HP's ANSI C++ compiler (aCC) ----------------------------------- - -Unless C++ support is disabled by specifying the "--disable-cpp" option of the -"configure" script, you must include the "-AA" option in the CXXFLAGS -environment variable in order for the C++ components to compile correctly. - -Also, note that the aCC compiler on PA-RISC platforms may have a defect whereby -needed libraries fail to get included when specifying the "-AA" compiler -option. If you experience unresolved symbols when linking the C++ programs, -use the workaround of specifying the following environment variable prior to -running the "configure" script: - - CXXLDFLAGS="-lstd_v2 -lCsup_v2" - - -Compiling in Tru64 using native compilers ------------------------------------------ - -The following error may occur when compiling with native compilers in the Tru64 -operating system: - - CXX libpcrecpp_la-pcrecpp.lo -cxx: Error: /usr/lib/cmplrs/cxx/V7.1-006/include/cxx/iosfwd, line 58: #error - directive: "cannot include iosfwd -- define __USE_STD_IOSTREAM to - override default - see section 7.1.2 of the C++ Using Guide" -#error "cannot include iosfwd -- define __USE_STD_IOSTREAM to override default -- see section 7.1.2 of the C++ Using Guide" - -This may be followed by other errors, complaining that 'namespace "std" has no -member'. The solution to this is to add the line - -#define __USE_STD_IOSTREAM 1 - -to the config.h file. - - -Using Sun's compilers for Solaris ---------------------------------- - -A user reports that the following configurations work on Solaris 9 sparcv9 and -Solaris 9 x86 (32-bit): - - Solaris 9 sparcv9: ./configure --disable-cpp CC=/bin/cc CFLAGS="-m64 -g" - Solaris 9 x86: ./configure --disable-cpp CC=/bin/cc CFLAGS="-g" - - -Using PCRE from MySQL ---------------------- - -On systems where both PCRE and MySQL are installed, it is possible to make use -of PCRE from within MySQL, as an alternative to the built-in pattern matching. -There is a web page that tells you how to do this: - - http://www.mysqludf.org/lib_mysqludf_preg/index.php - - -Making new tarballs -------------------- - -The command "make dist" creates three PCRE tarballs, in tar.gz, tar.bz2, and -zip formats. The command "make distcheck" does the same, but then does a trial -build of the new distribution to ensure that it works. - -If you have modified any of the man page sources in the doc directory, you -should first run the PrepareRelease script before making a distribution. This -script creates the .txt and HTML forms of the documentation from the man pages. - - -Testing PCRE ------------- - -To test the basic PCRE library on a Unix-like system, run the RunTest script. -There is another script called RunGrepTest that tests the options of the -pcregrep command. If the C++ wrapper library is built, three test programs -called pcrecpp_unittest, pcre_scanner_unittest, and pcre_stringpiece_unittest -are also built. When JIT support is enabled, another test program called -pcre_jit_test is built. - -Both the scripts and all the program tests are run if you obey "make check" or -"make test". For other environments, see the instructions in -NON-AUTOTOOLS-BUILD. - -The RunTest script runs the pcretest test program (which is documented in its -own man page) on each of the relevant testinput files in the testdata -directory, and compares the output with the contents of the corresponding -testoutput files. RunTest uses a file called testtry to hold the main output -from pcretest. Other files whose names begin with "test" are used as working -files in some tests. - -Some tests are relevant only when certain build-time options were selected. For -example, the tests for UTF-8/16/32 support are run only if --enable-utf was -used. RunTest outputs a comment when it skips a test. - -Many of the tests that are not skipped are run up to three times. The second -run forces pcre_study() to be called for all patterns except for a few in some -tests that are marked "never study" (see the pcretest program for how this is -done). If JIT support is available, the non-DFA tests are run a third time, -this time with a forced pcre_study() with the PCRE_STUDY_JIT_COMPILE option. -This testing can be suppressed by putting "nojit" on the RunTest command line. - -The entire set of tests is run once for each of the 8-bit, 16-bit and 32-bit -libraries that are enabled. If you want to run just one set of tests, call -RunTest with either the -8, -16 or -32 option. - -If valgrind is installed, you can run the tests under it by putting "valgrind" -on the RunTest command line. To run pcretest on just one or more specific test -files, give their numbers as arguments to RunTest, for example: - - RunTest 2 7 11 - -You can also specify ranges of tests such as 3-6 or 3- (meaning 3 to the -end), or a number preceded by ~ to exclude a test. For example: - - Runtest 3-15 ~10 - -This runs tests 3 to 15, excluding test 10, and just ~13 runs all the tests -except test 13. Whatever order the arguments are in, the tests are always run -in numerical order. - -You can also call RunTest with the single argument "list" to cause it to output -a list of tests. - -The first test file can be fed directly into the perltest.pl script to check -that Perl gives the same results. The only difference you should see is in the -first few lines, where the Perl version is given instead of the PCRE version. - -The second set of tests check pcre_fullinfo(), pcre_study(), -pcre_copy_substring(), pcre_get_substring(), pcre_get_substring_list(), error -detection, and run-time flags that are specific to PCRE, as well as the POSIX -wrapper API. It also uses the debugging flags to check some of the internals of -pcre_compile(). - -If you build PCRE with a locale setting that is not the standard C locale, the -character tables may be different (see next paragraph). In some cases, this may -cause failures in the second set of tests. For example, in a locale where the -isprint() function yields TRUE for characters in the range 128-255, the use of -[:isascii:] inside a character class defines a different set of characters, and -this shows up in this test as a difference in the compiled code, which is being -listed for checking. Where the comparison test output contains [\x00-\x7f] the -test will contain [\x00-\xff], and similarly in some other cases. This is not a -bug in PCRE. - -The third set of tests checks pcre_maketables(), the facility for building a -set of character tables for a specific locale and using them instead of the -default tables. The tests make use of the "fr_FR" (French) locale. Before -running the test, the script checks for the presence of this locale by running -the "locale" command. If that command fails, or if it doesn't include "fr_FR" -in the list of available locales, the third test cannot be run, and a comment -is output to say why. If running this test produces instances of the error - - ** Failed to set locale "fr_FR" - -in the comparison output, it means that locale is not available on your system, -despite being listed by "locale". This does not mean that PCRE is broken. - -[If you are trying to run this test on Windows, you may be able to get it to -work by changing "fr_FR" to "french" everywhere it occurs. Alternatively, use -RunTest.bat. The version of RunTest.bat included with PCRE 7.4 and above uses -Windows versions of test 2. More info on using RunTest.bat is included in the -document entitled NON-UNIX-USE.] - -The fourth and fifth tests check the UTF-8/16/32 support and error handling and -internal UTF features of PCRE that are not relevant to Perl, respectively. The -sixth and seventh tests do the same for Unicode character properties support. - -The eighth, ninth, and tenth tests check the pcre_dfa_exec() alternative -matching function, in non-UTF-8/16/32 mode, UTF-8/16/32 mode, and UTF-8/16/32 -mode with Unicode property support, respectively. - -The eleventh test checks some internal offsets and code size features; it is -run only when the default "link size" of 2 is set (in other cases the sizes -change) and when Unicode property support is enabled. - -The twelfth test is run only when JIT support is available, and the thirteenth -test is run only when JIT support is not available. They test some JIT-specific -features such as information output from pcretest about JIT compilation. - -The fourteenth, fifteenth, and sixteenth tests are run only in 8-bit mode, and -the seventeenth, eighteenth, and nineteenth tests are run only in 16/32-bit -mode. These are tests that generate different output in the two modes. They are -for general cases, UTF-8/16/32 support, and Unicode property support, -respectively. - -The twentieth test is run only in 16/32-bit mode. It tests some specific -16/32-bit features of the DFA matching engine. - -The twenty-first and twenty-second tests are run only in 16/32-bit mode, when -the link size is set to 2 for the 16-bit library. They test reloading -pre-compiled patterns. - -The twenty-third and twenty-fourth tests are run only in 16-bit mode. They are -for general cases, and UTF-16 support, respectively. - -The twenty-fifth and twenty-sixth tests are run only in 32-bit mode. They are -for general cases, and UTF-32 support, respectively. - - -Character tables ----------------- - -For speed, PCRE uses four tables for manipulating and identifying characters -whose code point values are less than 256. The final argument of the -pcre_compile() function is a pointer to a block of memory containing the -concatenated tables. A call to pcre_maketables() can be used to generate a set -of tables in the current locale. If the final argument for pcre_compile() is -passed as NULL, a set of default tables that is built into the binary is used. - -The source file called pcre_chartables.c contains the default set of tables. By -default, this is created as a copy of pcre_chartables.c.dist, which contains -tables for ASCII coding. However, if --enable-rebuild-chartables is specified -for ./configure, a different version of pcre_chartables.c is built by the -program dftables (compiled from dftables.c), which uses the ANSI C character -handling functions such as isalnum(), isalpha(), isupper(), islower(), etc. to -build the table sources. This means that the default C locale which is set for -your system will control the contents of these default tables. You can change -the default tables by editing pcre_chartables.c and then re-building PCRE. If -you do this, you should take care to ensure that the file does not get -automatically re-generated. The best way to do this is to move -pcre_chartables.c.dist out of the way and replace it with your customized -tables. - -When the dftables program is run as a result of --enable-rebuild-chartables, -it uses the default C locale that is set on your system. It does not pay -attention to the LC_xxx environment variables. In other words, it uses the -system's default locale rather than whatever the compiling user happens to have -set. If you really do want to build a source set of character tables in a -locale that is specified by the LC_xxx variables, you can run the dftables -program by hand with the -L option. For example: - - ./dftables -L pcre_chartables.c.special - -The first two 256-byte tables provide lower casing and case flipping functions, -respectively. The next table consists of three 32-byte bit maps which identify -digits, "word" characters, and white space, respectively. These are used when -building 32-byte bit maps that represent character classes for code points less -than 256. - -The final 256-byte table has bits indicating various character types, as -follows: - - 1 white space character - 2 letter - 4 decimal digit - 8 hexadecimal digit - 16 alphanumeric or '_' - 128 regular expression metacharacter or binary zero - -You should not alter the set of characters that contain the 128 bit, as that -will cause PCRE to malfunction. - - -File manifest -------------- - -The distribution should contain the files listed below. Where a file name is -given as pcre[16|32]_xxx it means that there are three files, one with the name -pcre_xxx, one with the name pcre16_xx, and a third with the name pcre32_xxx. - -(A) Source files of the PCRE library functions and their headers: - - dftables.c auxiliary program for building pcre_chartables.c - when --enable-rebuild-chartables is specified - - pcre_chartables.c.dist a default set of character tables that assume ASCII - coding; used, unless --enable-rebuild-chartables is - specified, by copying to pcre[16]_chartables.c - - pcreposix.c ) - pcre[16|32]_byte_order.c ) - pcre[16|32]_compile.c ) - pcre[16|32]_config.c ) - pcre[16|32]_dfa_exec.c ) - pcre[16|32]_exec.c ) - pcre[16|32]_fullinfo.c ) - pcre[16|32]_get.c ) sources for the functions in the library, - pcre[16|32]_globals.c ) and some internal functions that they use - pcre[16|32]_jit_compile.c ) - pcre[16|32]_maketables.c ) - pcre[16|32]_newline.c ) - pcre[16|32]_refcount.c ) - pcre[16|32]_string_utils.c ) - pcre[16|32]_study.c ) - pcre[16|32]_tables.c ) - pcre[16|32]_ucd.c ) - pcre[16|32]_version.c ) - pcre[16|32]_xclass.c ) - pcre_ord2utf8.c ) - pcre_valid_utf8.c ) - pcre16_ord2utf16.c ) - pcre16_utf16_utils.c ) - pcre16_valid_utf16.c ) - pcre32_utf32_utils.c ) - pcre32_valid_utf32.c ) - - pcre[16|32]_printint.c ) debugging function that is used by pcretest, - ) and can also be #included in pcre_compile() - - pcre.h.in template for pcre.h when built by "configure" - pcreposix.h header for the external POSIX wrapper API - pcre_internal.h header for internal use - sljit/* 16 files that make up the JIT compiler - ucp.h header for Unicode property handling - - config.h.in template for config.h, which is built by "configure" - - pcrecpp.h public header file for the C++ wrapper - pcrecpparg.h.in template for another C++ header file - pcre_scanner.h public header file for C++ scanner functions - pcrecpp.cc ) - pcre_scanner.cc ) source for the C++ wrapper library - - pcre_stringpiece.h.in template for pcre_stringpiece.h, the header for the - C++ stringpiece functions - pcre_stringpiece.cc source for the C++ stringpiece functions - -(B) Source files for programs that use PCRE: - - pcredemo.c simple demonstration of coding calls to PCRE - pcregrep.c source of a grep utility that uses PCRE - pcretest.c comprehensive test program - -(C) Auxiliary files: - - 132html script to turn "man" pages into HTML - AUTHORS information about the author of PCRE - ChangeLog log of changes to the code - CleanTxt script to clean nroff output for txt man pages - Detrail script to remove trailing spaces - HACKING some notes about the internals of PCRE - INSTALL generic installation instructions - LICENCE conditions for the use of PCRE - COPYING the same, using GNU's standard name - Makefile.in ) template for Unix Makefile, which is built by - ) "configure" - Makefile.am ) the automake input that was used to create - ) Makefile.in - NEWS important changes in this release - NON-UNIX-USE the previous name for NON-AUTOTOOLS-BUILD - NON-AUTOTOOLS-BUILD notes on building PCRE without using autotools - PrepareRelease script to make preparations for "make dist" - README this file - RunTest a Unix shell script for running tests - RunGrepTest a Unix shell script for pcregrep tests - aclocal.m4 m4 macros (generated by "aclocal") - config.guess ) files used by libtool, - config.sub ) used only when building a shared library - configure a configuring shell script (built by autoconf) - configure.ac ) the autoconf input that was used to build - ) "configure" and config.h - depcomp ) script to find program dependencies, generated by - ) automake - doc/*.3 man page sources for PCRE - doc/*.1 man page sources for pcregrep and pcretest - doc/index.html.src the base HTML page - doc/html/* HTML documentation - doc/pcre.txt plain text version of the man pages - doc/pcretest.txt plain text documentation of test program - doc/perltest.txt plain text documentation of Perl test program - install-sh a shell script for installing files - libpcre16.pc.in template for libpcre16.pc for pkg-config - libpcre32.pc.in template for libpcre32.pc for pkg-config - libpcre.pc.in template for libpcre.pc for pkg-config - libpcreposix.pc.in template for libpcreposix.pc for pkg-config - libpcrecpp.pc.in template for libpcrecpp.pc for pkg-config - ltmain.sh file used to build a libtool script - missing ) common stub for a few missing GNU programs while - ) installing, generated by automake - mkinstalldirs script for making install directories - perltest.pl Perl test program - pcre-config.in source of script which retains PCRE information - pcre_jit_test.c test program for the JIT compiler - pcrecpp_unittest.cc ) - pcre_scanner_unittest.cc ) test programs for the C++ wrapper - pcre_stringpiece_unittest.cc ) - testdata/testinput* test data for main library tests - testdata/testoutput* expected test results - testdata/grep* input and output for pcregrep tests - testdata/* other supporting test files - -(D) Auxiliary files for cmake support - - cmake/COPYING-CMAKE-SCRIPTS - cmake/FindPackageHandleStandardArgs.cmake - cmake/FindEditline.cmake - cmake/FindReadline.cmake - CMakeLists.txt - config-cmake.h.in - -(E) Auxiliary files for VPASCAL - - makevp.bat - makevp_c.txt - makevp_l.txt - pcregexp.pas - -(F) Auxiliary files for building PCRE "by hand" - - pcre.h.generic ) a version of the public PCRE header file - ) for use in non-"configure" environments - config.h.generic ) a version of config.h for use in non-"configure" - ) environments - -(F) Miscellaneous - - RunTest.bat a script for running tests under Windows - -Philip Hazel -Email local part: ph10 -Email domain: cam.ac.uk -Last updated: 10 February 2015 diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/index.html b/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/index.html deleted file mode 100644 index 352c55df..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/index.html +++ /dev/null @@ -1,185 +0,0 @@ - - - -PCRE specification - - -

      Perl-compatible Regular Expressions (PCRE)

      -

      -The HTML documentation for PCRE consists of a number of pages that are listed -below in alphabetical order. If you are new to PCRE, please read the first one -first. -

      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      pcre  Introductory page
      pcre-config  Information about the installation configuration
      pcre16  Discussion of the 16-bit PCRE library
      pcre32  Discussion of the 32-bit PCRE library
      pcreapi  PCRE's native API
      pcrebuild  Building PCRE
      pcrecallout  The callout facility
      pcrecompat  Compability with Perl
      pcrecpp  The C++ wrapper for the PCRE library
      pcredemo  A demonstration C program that uses the PCRE library
      pcregrep  The pcregrep command
      pcrejit  Discussion of the just-in-time optimization support
      pcrelimits  Details of size and other limits
      pcrematching  Discussion of the two matching algorithms
      pcrepartial  Using PCRE for partial matching
      pcrepattern  Specification of the regular expressions supported by PCRE
      pcreperform  Some comments on performance
      pcreposix  The POSIX API to the PCRE 8-bit library
      pcreprecompile  How to save and re-use compiled patterns
      pcresample  Discussion of the pcredemo program
      pcrestack  Discussion of PCRE's stack usage
      pcresyntax  Syntax quick-reference summary
      pcretest  The pcretest command for testing PCRE
      pcreunicode  Discussion of Unicode and UTF-8/UTF-16/UTF-32 support
      - -

      -There are also individual pages that summarize the interface for each function -in the library. There is a single page for each triple of 8-bit/16-bit/32-bit -functions. -

      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      pcre_assign_jit_stack  Assign stack for JIT matching
      pcre_compile  Compile a regular expression
      pcre_compile2  Compile a regular expression (alternate interface)
      pcre_config  Show build-time configuration options
      pcre_copy_named_substring  Extract named substring into given buffer
      pcre_copy_substring  Extract numbered substring into given buffer
      pcre_dfa_exec  Match a compiled pattern to a subject string - (DFA algorithm; not Perl compatible)
      pcre_exec  Match a compiled pattern to a subject string - (Perl compatible)
      pcre_free_study  Free study data
      pcre_free_substring  Free extracted substring
      pcre_free_substring_list  Free list of extracted substrings
      pcre_fullinfo  Extract information about a pattern
      pcre_get_named_substring  Extract named substring into new memory
      pcre_get_stringnumber  Convert captured string name to number
      pcre_get_stringtable_entries  Find table entries for given string name
      pcre_get_substring  Extract numbered substring into new memory
      pcre_get_substring_list  Extract all substrings into new memory
      pcre_jit_exec  Fast path interface to JIT matching
      pcre_jit_stack_alloc  Create a stack for JIT matching
      pcre_jit_stack_free  Free a JIT matching stack
      pcre_maketables  Build character tables in current locale
      pcre_pattern_to_host_byte_order  Convert compiled pattern to host byte order if necessary
      pcre_refcount  Maintain reference count in compiled pattern
      pcre_study  Study a compiled pattern
      pcre_utf16_to_host_byte_order  Convert UTF-16 string to host byte order if necessary
      pcre_utf32_to_host_byte_order  Convert UTF-32 string to host byte order if necessary
      pcre_version  Return PCRE version and release date
      - - diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcre-config.html b/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcre-config.html deleted file mode 100644 index 56a80604..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcre-config.html +++ /dev/null @@ -1,109 +0,0 @@ - - -pcre-config specification - - -

      pcre-config man page

      -

      -Return to the PCRE index page. -

      -

      -This page is part of the PCRE HTML documentation. It was generated automatically -from the original man page. If there is any nonsense in it, please consult the -man page, in case the conversion went wrong. -
      -

      -
      SYNOPSIS
      -

      -pcre-config [--prefix] [--exec-prefix] [--version] [--libs] - [--libs16] [--libs32] [--libs-cpp] [--libs-posix] - [--cflags] [--cflags-posix] -

      -
      DESCRIPTION
      -

      -pcre-config returns the configuration of the installed PCRE -libraries and the options required to compile a program to use them. Some of -the options apply only to the 8-bit, or 16-bit, or 32-bit libraries, -respectively, and are -not available if only one of those libraries has been built. If an unavailable -option is encountered, the "usage" information is output. -

      -
      OPTIONS
      -

      ---prefix -Writes the directory prefix used in the PCRE installation for architecture -independent files (/usr on many systems, /usr/local on some -systems) to the standard output. -

      -

      ---exec-prefix -Writes the directory prefix used in the PCRE installation for architecture -dependent files (normally the same as --prefix) to the standard output. -

      -

      ---version -Writes the version number of the installed PCRE libraries to the standard -output. -

      -

      ---libs -Writes to the standard output the command line options required to link -with the 8-bit PCRE library (-lpcre on many systems). -

      -

      ---libs16 -Writes to the standard output the command line options required to link -with the 16-bit PCRE library (-lpcre16 on many systems). -

      -

      ---libs32 -Writes to the standard output the command line options required to link -with the 32-bit PCRE library (-lpcre32 on many systems). -

      -

      ---libs-cpp -Writes to the standard output the command line options required to link with -PCRE's C++ wrapper library (-lpcrecpp -lpcre on many -systems). -

      -

      ---libs-posix -Writes to the standard output the command line options required to link with -PCRE's POSIX API wrapper library (-lpcreposix -lpcre on many -systems). -

      -

      ---cflags -Writes to the standard output the command line options required to compile -files that use PCRE (this may include some -I options, but is blank on -many systems). -

      -

      ---cflags-posix -Writes to the standard output the command line options required to compile -files that use PCRE's POSIX API wrapper library (this may include some -I -options, but is blank on many systems). -

      -
      SEE ALSO
      -

      -pcre(3) -

      -
      AUTHOR
      -

      -This manual page was originally written by Mark Baker for the Debian GNU/Linux -system. It has been subsequently revised as a generic PCRE man page. -

      -
      REVISION
      -

      -Last updated: 24 June 2012 -
      -

      -Return to the PCRE index page. -

      diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcre.html b/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcre.html deleted file mode 100644 index c87b1066..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcre.html +++ /dev/null @@ -1,224 +0,0 @@ - - -pcre specification - - -

      pcre man page

      -

      -Return to the PCRE index page. -

      -

      -This page is part of the PCRE HTML documentation. It was generated automatically -from the original man page. If there is any nonsense in it, please consult the -man page, in case the conversion went wrong. -
      -

      -
      PLEASE TAKE NOTE
      -

      -This document relates to PCRE releases that use the original API, -with library names libpcre, libpcre16, and libpcre32. January 2015 saw the -first release of a new API, known as PCRE2, with release numbers starting at -10.00 and library names libpcre2-8, libpcre2-16, and libpcre2-32. The old -libraries (now called PCRE1) are still being maintained for bug fixes, but -there will be no new development. New projects are advised to use the new PCRE2 -libraries. -

      -
      INTRODUCTION
      -

      -The PCRE library is a set of functions that implement regular expression -pattern matching using the same syntax and semantics as Perl, with just a few -differences. Some features that appeared in Python and PCRE before they -appeared in Perl are also available using the Python syntax, there is some -support for one or two .NET and Oniguruma syntax items, and there is an option -for requesting some minor changes that give better JavaScript compatibility. -

      -

      -Starting with release 8.30, it is possible to compile two separate PCRE -libraries: the original, which supports 8-bit character strings (including -UTF-8 strings), and a second library that supports 16-bit character strings -(including UTF-16 strings). The build process allows either one or both to be -built. The majority of the work to make this possible was done by Zoltan -Herczeg. -

      -

      -Starting with release 8.32 it is possible to compile a third separate PCRE -library that supports 32-bit character strings (including UTF-32 strings). The -build process allows any combination of the 8-, 16- and 32-bit libraries. The -work to make this possible was done by Christian Persch. -

      -

      -The three libraries contain identical sets of functions, except that the names -in the 16-bit library start with pcre16_ instead of pcre_, and the -names in the 32-bit library start with pcre32_ instead of pcre_. To -avoid over-complication and reduce the documentation maintenance load, most of -the documentation describes the 8-bit library, with the differences for the -16-bit and 32-bit libraries described separately in the -pcre16 -and -pcre32 -pages. References to functions or structures of the form pcre[16|32]_xxx -should be read as meaning "pcre_xxx when using the 8-bit library, -pcre16_xxx when using the 16-bit library, or pcre32_xxx when using -the 32-bit library". -

      -

      -The current implementation of PCRE corresponds approximately with Perl 5.12, -including support for UTF-8/16/32 encoded strings and Unicode general category -properties. However, UTF-8/16/32 and Unicode support has to be explicitly -enabled; it is not the default. The Unicode tables correspond to Unicode -release 6.3.0. -

      -

      -In addition to the Perl-compatible matching function, PCRE contains an -alternative function that matches the same compiled patterns in a different -way. In certain circumstances, the alternative function has some advantages. -For a discussion of the two matching algorithms, see the -pcrematching -page. -

      -

      -PCRE is written in C and released as a C library. A number of people have -written wrappers and interfaces of various kinds. In particular, Google Inc. -have provided a comprehensive C++ wrapper for the 8-bit library. This is now -included as part of the PCRE distribution. The -pcrecpp -page has details of this interface. Other people's contributions can be found -in the Contrib directory at the primary FTP site, which is: -ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre -

      -

      -Details of exactly which Perl regular expression features are and are not -supported by PCRE are given in separate documents. See the -pcrepattern -and -pcrecompat -pages. There is a syntax summary in the -pcresyntax -page. -

      -

      -Some features of PCRE can be included, excluded, or changed when the library is -built. The -pcre_config() -function makes it possible for a client to discover which features are -available. The features themselves are described in the -pcrebuild -page. Documentation about building PCRE for various operating systems can be -found in the -README -and -NON-AUTOTOOLS_BUILD -files in the source distribution. -

      -

      -The libraries contains a number of undocumented internal functions and data -tables that are used by more than one of the exported external functions, but -which are not intended for use by external callers. Their names all begin with -"_pcre_" or "_pcre16_" or "_pcre32_", which hopefully will not provoke any name -clashes. In some environments, it is possible to control which external symbols -are exported when a shared library is built, and in these cases the -undocumented symbols are not exported. -

      -
      SECURITY CONSIDERATIONS
      -

      -If you are using PCRE in a non-UTF application that permits users to supply -arbitrary patterns for compilation, you should be aware of a feature that -allows users to turn on UTF support from within a pattern, provided that PCRE -was built with UTF support. For example, an 8-bit pattern that begins with -"(*UTF8)" or "(*UTF)" turns on UTF-8 mode, which interprets patterns and -subjects as strings of UTF-8 characters instead of individual 8-bit characters. -This causes both the pattern and any data against which it is matched to be -checked for UTF-8 validity. If the data string is very long, such a check might -use sufficiently many resources as to cause your application to lose -performance. -

      -

      -One way of guarding against this possibility is to use the -pcre_fullinfo() function to check the compiled pattern's options for UTF. -Alternatively, from release 8.33, you can set the PCRE_NEVER_UTF option at -compile time. This causes an compile time error if a pattern contains a -UTF-setting sequence. -

      -

      -If your application is one that supports UTF, be aware that validity checking -can take time. If the same data string is to be matched many times, you can use -the PCRE_NO_UTF[8|16|32]_CHECK option for the second and subsequent matches to -save redundant checks. -

      -

      -Another way that performance can be hit is by running a pattern that has a very -large search tree against a string that will never match. Nested unlimited -repeats in a pattern are a common example. PCRE provides some protection -against this: see the PCRE_EXTRA_MATCH_LIMIT feature in the -pcreapi -page. -

      -
      USER DOCUMENTATION
      -

      -The user documentation for PCRE comprises a number of different sections. In -the "man" format, each of these is a separate "man page". In the HTML format, -each is a separate page, linked from the index page. In the plain text format, -the descriptions of the pcregrep and pcretest programs are in files -called pcregrep.txt and pcretest.txt, respectively. The remaining -sections, except for the pcredemo section (which is a program listing), -are concatenated in pcre.txt, for ease of searching. The sections are as -follows: -

      -  pcre              this document
      -  pcre-config       show PCRE installation configuration information
      -  pcre16            details of the 16-bit library
      -  pcre32            details of the 32-bit library
      -  pcreapi           details of PCRE's native C API
      -  pcrebuild         building PCRE
      -  pcrecallout       details of the callout feature
      -  pcrecompat        discussion of Perl compatibility
      -  pcrecpp           details of the C++ wrapper for the 8-bit library
      -  pcredemo          a demonstration C program that uses PCRE
      -  pcregrep          description of the pcregrep command (8-bit only)
      -  pcrejit           discussion of the just-in-time optimization support
      -  pcrelimits        details of size and other limits
      -  pcrematching      discussion of the two matching algorithms
      -  pcrepartial       details of the partial matching facility
      -  pcrepattern       syntax and semantics of supported regular expressions
      -  pcreperform       discussion of performance issues
      -  pcreposix         the POSIX-compatible C API for the 8-bit library
      -  pcreprecompile    details of saving and re-using precompiled patterns
      -  pcresample        discussion of the pcredemo program
      -  pcrestack         discussion of stack usage
      -  pcresyntax        quick syntax reference
      -  pcretest          description of the pcretest testing command
      -  pcreunicode       discussion of Unicode and UTF-8/16/32 support
      -
      -In the "man" and HTML formats, there is also a short page for each C library -function, listing its arguments and results. -

      -
      AUTHOR
      -

      -Philip Hazel -
      -University Computing Service -
      -Cambridge CB2 3QH, England. -
      -

      -

      -Putting an actual email address here seems to have been a spam magnet, so I've -taken it away. If you want to email me, use my two initials, followed by the -two digits 10, at the domain cam.ac.uk. -

      -
      REVISION
      -

      -Last updated: 10 February 2015 -
      -Copyright © 1997-2015 University of Cambridge. -
      -

      -Return to the PCRE index page. -

      diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcre16.html b/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcre16.html deleted file mode 100644 index f00859f0..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcre16.html +++ /dev/null @@ -1,384 +0,0 @@ - - -pcre16 specification - - -

      pcre16 man page

      -

      -Return to the PCRE index page. -

      -

      -This page is part of the PCRE HTML documentation. It was generated automatically -from the original man page. If there is any nonsense in it, please consult the -man page, in case the conversion went wrong. -
      -

      -

      -#include <pcre.h> -

      -
      PCRE 16-BIT API BASIC FUNCTIONS
      -

      -pcre16 *pcre16_compile(PCRE_SPTR16 pattern, int options, - const char **errptr, int *erroffset, - const unsigned char *tableptr); -
      -
      -pcre16 *pcre16_compile2(PCRE_SPTR16 pattern, int options, - int *errorcodeptr, - const char **errptr, int *erroffset, - const unsigned char *tableptr); -
      -
      -pcre16_extra *pcre16_study(const pcre16 *code, int options, - const char **errptr); -
      -
      -void pcre16_free_study(pcre16_extra *extra); -
      -
      -int pcre16_exec(const pcre16 *code, const pcre16_extra *extra, - PCRE_SPTR16 subject, int length, int startoffset, - int options, int *ovector, int ovecsize); -
      -
      -int pcre16_dfa_exec(const pcre16 *code, const pcre16_extra *extra, - PCRE_SPTR16 subject, int length, int startoffset, - int options, int *ovector, int ovecsize, - int *workspace, int wscount); -

      -
      PCRE 16-BIT API STRING EXTRACTION FUNCTIONS
      -

      -int pcre16_copy_named_substring(const pcre16 *code, - PCRE_SPTR16 subject, int *ovector, - int stringcount, PCRE_SPTR16 stringname, - PCRE_UCHAR16 *buffer, int buffersize); -
      -
      -int pcre16_copy_substring(PCRE_SPTR16 subject, int *ovector, - int stringcount, int stringnumber, PCRE_UCHAR16 *buffer, - int buffersize); -
      -
      -int pcre16_get_named_substring(const pcre16 *code, - PCRE_SPTR16 subject, int *ovector, - int stringcount, PCRE_SPTR16 stringname, - PCRE_SPTR16 *stringptr); -
      -
      -int pcre16_get_stringnumber(const pcre16 *code, -" PCRE_SPTR16 name); -
      -
      -int pcre16_get_stringtable_entries(const pcre16 *code, - PCRE_SPTR16 name, PCRE_UCHAR16 **first, PCRE_UCHAR16 **last); -
      -
      -int pcre16_get_substring(PCRE_SPTR16 subject, int *ovector, - int stringcount, int stringnumber, - PCRE_SPTR16 *stringptr); -
      -
      -int pcre16_get_substring_list(PCRE_SPTR16 subject, - int *ovector, int stringcount, PCRE_SPTR16 **listptr); -
      -
      -void pcre16_free_substring(PCRE_SPTR16 stringptr); -
      -
      -void pcre16_free_substring_list(PCRE_SPTR16 *stringptr); -

      -
      PCRE 16-BIT API AUXILIARY FUNCTIONS
      -

      -pcre16_jit_stack *pcre16_jit_stack_alloc(int startsize, int maxsize); -
      -
      -void pcre16_jit_stack_free(pcre16_jit_stack *stack); -
      -
      -void pcre16_assign_jit_stack(pcre16_extra *extra, - pcre16_jit_callback callback, void *data); -
      -
      -const unsigned char *pcre16_maketables(void); -
      -
      -int pcre16_fullinfo(const pcre16 *code, const pcre16_extra *extra, - int what, void *where); -
      -
      -int pcre16_refcount(pcre16 *code, int adjust); -
      -
      -int pcre16_config(int what, void *where); -
      -
      -const char *pcre16_version(void); -
      -
      -int pcre16_pattern_to_host_byte_order(pcre16 *code, - pcre16_extra *extra, const unsigned char *tables); -

      -
      PCRE 16-BIT API INDIRECTED FUNCTIONS
      -

      -void *(*pcre16_malloc)(size_t); -
      -
      -void (*pcre16_free)(void *); -
      -
      -void *(*pcre16_stack_malloc)(size_t); -
      -
      -void (*pcre16_stack_free)(void *); -
      -
      -int (*pcre16_callout)(pcre16_callout_block *); -

      -
      PCRE 16-BIT API 16-BIT-ONLY FUNCTION
      -

      -int pcre16_utf16_to_host_byte_order(PCRE_UCHAR16 *output, - PCRE_SPTR16 input, int length, int *byte_order, - int keep_boms); -

      -
      THE PCRE 16-BIT LIBRARY
      -

      -Starting with release 8.30, it is possible to compile a PCRE library that -supports 16-bit character strings, including UTF-16 strings, as well as or -instead of the original 8-bit library. The majority of the work to make this -possible was done by Zoltan Herczeg. The two libraries contain identical sets -of functions, used in exactly the same way. Only the names of the functions and -the data types of their arguments and results are different. To avoid -over-complication and reduce the documentation maintenance load, most of the -PCRE documentation describes the 8-bit library, with only occasional references -to the 16-bit library. This page describes what is different when you use the -16-bit library. -

      -

      -WARNING: A single application can be linked with both libraries, but you must -take care when processing any particular pattern to use functions from just one -library. For example, if you want to study a pattern that was compiled with -pcre16_compile(), you must do so with pcre16_study(), not -pcre_study(), and you must free the study data with -pcre16_free_study(). -

      -
      THE HEADER FILE
      -

      -There is only one header file, pcre.h. It contains prototypes for all the -functions in all libraries, as well as definitions of flags, structures, error -codes, etc. -

      -
      THE LIBRARY NAME
      -

      -In Unix-like systems, the 16-bit library is called libpcre16, and can -normally be accesss by adding -lpcre16 to the command for linking an -application that uses PCRE. -

      -
      STRING TYPES
      -

      -In the 8-bit library, strings are passed to PCRE library functions as vectors -of bytes with the C type "char *". In the 16-bit library, strings are passed as -vectors of unsigned 16-bit quantities. The macro PCRE_UCHAR16 specifies an -appropriate data type, and PCRE_SPTR16 is defined as "const PCRE_UCHAR16 *". In -very many environments, "short int" is a 16-bit data type. When PCRE is built, -it defines PCRE_UCHAR16 as "unsigned short int", but checks that it really is a -16-bit data type. If it is not, the build fails with an error message telling -the maintainer to modify the definition appropriately. -

      -
      STRUCTURE TYPES
      -

      -The types of the opaque structures that are used for compiled 16-bit patterns -and JIT stacks are pcre16 and pcre16_jit_stack respectively. The -type of the user-accessible structure that is returned by pcre16_study() -is pcre16_extra, and the type of the structure that is used for passing -data to a callout function is pcre16_callout_block. These structures -contain the same fields, with the same names, as their 8-bit counterparts. The -only difference is that pointers to character strings are 16-bit instead of -8-bit types. -

      -
      16-BIT FUNCTIONS
      -

      -For every function in the 8-bit library there is a corresponding function in -the 16-bit library with a name that starts with pcre16_ instead of -pcre_. The prototypes are listed above. In addition, there is one extra -function, pcre16_utf16_to_host_byte_order(). This is a utility function -that converts a UTF-16 character string to host byte order if necessary. The -other 16-bit functions expect the strings they are passed to be in host byte -order. -

      -

      -The input and output arguments of -pcre16_utf16_to_host_byte_order() may point to the same address, that is, -conversion in place is supported. The output buffer must be at least as long as -the input. -

      -

      -The length argument specifies the number of 16-bit data units in the -input string; a negative value specifies a zero-terminated string. -

      -

      -If byte_order is NULL, it is assumed that the string starts off in host -byte order. This may be changed by byte-order marks (BOMs) anywhere in the -string (commonly as the first character). -

      -

      -If byte_order is not NULL, a non-zero value of the integer to which it -points means that the input starts off in host byte order, otherwise the -opposite order is assumed. Again, BOMs in the string can change this. The final -byte order is passed back at the end of processing. -

      -

      -If keep_boms is not zero, byte-order mark characters (0xfeff) are copied -into the output string. Otherwise they are discarded. -

      -

      -The result of the function is the number of 16-bit units placed into the output -buffer, including the zero terminator if the string was zero-terminated. -

      -
      SUBJECT STRING OFFSETS
      -

      -The lengths and starting offsets of subject strings must be specified in 16-bit -data units, and the offsets within subject strings that are returned by the -matching functions are in also 16-bit units rather than bytes. -

      -
      NAMED SUBPATTERNS
      -

      -The name-to-number translation table that is maintained for named subpatterns -uses 16-bit characters. The pcre16_get_stringtable_entries() function -returns the length of each entry in the table as the number of 16-bit data -units. -

      -
      OPTION NAMES
      -

      -There are two new general option names, PCRE_UTF16 and PCRE_NO_UTF16_CHECK, -which correspond to PCRE_UTF8 and PCRE_NO_UTF8_CHECK in the 8-bit library. In -fact, these new options define the same bits in the options word. There is a -discussion about the -validity of UTF-16 strings -in the -pcreunicode -page. -

      -

      -For the pcre16_config() function there is an option PCRE_CONFIG_UTF16 -that returns 1 if UTF-16 support is configured, otherwise 0. If this option is -given to pcre_config() or pcre32_config(), or if the -PCRE_CONFIG_UTF8 or PCRE_CONFIG_UTF32 option is given to pcre16_config(), -the result is the PCRE_ERROR_BADOPTION error. -

      -
      CHARACTER CODES
      -

      -In 16-bit mode, when PCRE_UTF16 is not set, character values are treated in the -same way as in 8-bit, non UTF-8 mode, except, of course, that they can range -from 0 to 0xffff instead of 0 to 0xff. Character types for characters less than -0xff can therefore be influenced by the locale in the same way as before. -Characters greater than 0xff have only one case, and no "type" (such as letter -or digit). -

      -

      -In UTF-16 mode, the character code is Unicode, in the range 0 to 0x10ffff, with -the exception of values in the range 0xd800 to 0xdfff because those are -"surrogate" values that are used in pairs to encode values greater than 0xffff. -

      -

      -A UTF-16 string can indicate its endianness by special code knows as a -byte-order mark (BOM). The PCRE functions do not handle this, expecting strings -to be in host byte order. A utility function called -pcre16_utf16_to_host_byte_order() is provided to help with this (see -above). -

      -
      ERROR NAMES
      -

      -The errors PCRE_ERROR_BADUTF16_OFFSET and PCRE_ERROR_SHORTUTF16 correspond to -their 8-bit counterparts. The error PCRE_ERROR_BADMODE is given when a compiled -pattern is passed to a function that processes patterns in the other -mode, for example, if a pattern compiled with pcre_compile() is passed to -pcre16_exec(). -

      -

      -There are new error codes whose names begin with PCRE_UTF16_ERR for invalid -UTF-16 strings, corresponding to the PCRE_UTF8_ERR codes for UTF-8 strings that -are described in the section entitled -"Reason codes for invalid UTF-8 strings" -in the main -pcreapi -page. The UTF-16 errors are: -

      -  PCRE_UTF16_ERR1  Missing low surrogate at end of string
      -  PCRE_UTF16_ERR2  Invalid low surrogate follows high surrogate
      -  PCRE_UTF16_ERR3  Isolated low surrogate
      -  PCRE_UTF16_ERR4  Non-character
      -
      -

      -
      ERROR TEXTS
      -

      -If there is an error while compiling a pattern, the error text that is passed -back by pcre16_compile() or pcre16_compile2() is still an 8-bit -character string, zero-terminated. -

      -
      CALLOUTS
      -

      -The subject and mark fields in the callout block that is passed to -a callout function point to 16-bit vectors. -

      -
      TESTING
      -

      -The pcretest program continues to operate with 8-bit input and output -files, but it can be used for testing the 16-bit library. If it is run with the -command line option -16, patterns and subject strings are converted from -8-bit to 16-bit before being passed to PCRE, and the 16-bit library functions -are used instead of the 8-bit ones. Returned 16-bit strings are converted to -8-bit for output. If both the 8-bit and the 32-bit libraries were not compiled, -pcretest defaults to 16-bit and the -16 option is ignored. -

      -

      -When PCRE is being built, the RunTest script that is called by "make -check" uses the pcretest -C option to discover which of the 8-bit, -16-bit and 32-bit libraries has been built, and runs the tests appropriately. -

      -
      NOT SUPPORTED IN 16-BIT MODE
      -

      -Not all the features of the 8-bit library are available with the 16-bit -library. The C++ and POSIX wrapper functions support only the 8-bit library, -and the pcregrep program is at present 8-bit only. -

      -
      AUTHOR
      -

      -Philip Hazel -
      -University Computing Service -
      -Cambridge CB2 3QH, England. -
      -

      -
      REVISION
      -

      -Last updated: 12 May 2013 -
      -Copyright © 1997-2013 University of Cambridge. -
      -

      -Return to the PCRE index page. -

      diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcre32.html b/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcre32.html deleted file mode 100644 index f96876e7..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcre32.html +++ /dev/null @@ -1,382 +0,0 @@ - - -pcre32 specification - - -

      pcre32 man page

      -

      -Return to the PCRE index page. -

      -

      -This page is part of the PCRE HTML documentation. It was generated automatically -from the original man page. If there is any nonsense in it, please consult the -man page, in case the conversion went wrong. -
      -

      -

      -#include <pcre.h> -

      -
      PCRE 32-BIT API BASIC FUNCTIONS
      -

      -pcre32 *pcre32_compile(PCRE_SPTR32 pattern, int options, - const char **errptr, int *erroffset, - const unsigned char *tableptr); -
      -
      -pcre32 *pcre32_compile2(PCRE_SPTR32 pattern, int options, - int *errorcodeptr, - const unsigned char *tableptr); -
      -
      -pcre32_extra *pcre32_study(const pcre32 *code, int options, - const char **errptr); -
      -
      -void pcre32_free_study(pcre32_extra *extra); -
      -
      -int pcre32_exec(const pcre32 *code, const pcre32_extra *extra, - PCRE_SPTR32 subject, int length, int startoffset, - int options, int *ovector, int ovecsize); -
      -
      -int pcre32_dfa_exec(const pcre32 *code, const pcre32_extra *extra, - PCRE_SPTR32 subject, int length, int startoffset, - int options, int *ovector, int ovecsize, - int *workspace, int wscount); -

      -
      PCRE 32-BIT API STRING EXTRACTION FUNCTIONS
      -

      -int pcre32_copy_named_substring(const pcre32 *code, - PCRE_SPTR32 subject, int *ovector, - int stringcount, PCRE_SPTR32 stringname, - PCRE_UCHAR32 *buffer, int buffersize); -
      -
      -int pcre32_copy_substring(PCRE_SPTR32 subject, int *ovector, - int stringcount, int stringnumber, PCRE_UCHAR32 *buffer, - int buffersize); -
      -
      -int pcre32_get_named_substring(const pcre32 *code, - PCRE_SPTR32 subject, int *ovector, - int stringcount, PCRE_SPTR32 stringname, - PCRE_SPTR32 *stringptr); -
      -
      -int pcre32_get_stringnumber(const pcre32 *code, - PCRE_SPTR32 name); -
      -
      -int pcre32_get_stringtable_entries(const pcre32 *code, - PCRE_SPTR32 name, PCRE_UCHAR32 **first, PCRE_UCHAR32 **last); -
      -
      -int pcre32_get_substring(PCRE_SPTR32 subject, int *ovector, - int stringcount, int stringnumber, - PCRE_SPTR32 *stringptr); -
      -
      -int pcre32_get_substring_list(PCRE_SPTR32 subject, - int *ovector, int stringcount, PCRE_SPTR32 **listptr); -
      -
      -void pcre32_free_substring(PCRE_SPTR32 stringptr); -
      -
      -void pcre32_free_substring_list(PCRE_SPTR32 *stringptr); -

      -
      PCRE 32-BIT API AUXILIARY FUNCTIONS
      -

      -pcre32_jit_stack *pcre32_jit_stack_alloc(int startsize, int maxsize); -
      -
      -void pcre32_jit_stack_free(pcre32_jit_stack *stack); -
      -
      -void pcre32_assign_jit_stack(pcre32_extra *extra, - pcre32_jit_callback callback, void *data); -
      -
      -const unsigned char *pcre32_maketables(void); -
      -
      -int pcre32_fullinfo(const pcre32 *code, const pcre32_extra *extra, - int what, void *where); -
      -
      -int pcre32_refcount(pcre32 *code, int adjust); -
      -
      -int pcre32_config(int what, void *where); -
      -
      -const char *pcre32_version(void); -
      -
      -int pcre32_pattern_to_host_byte_order(pcre32 *code, - pcre32_extra *extra, const unsigned char *tables); -

      -
      PCRE 32-BIT API INDIRECTED FUNCTIONS
      -

      -void *(*pcre32_malloc)(size_t); -
      -
      -void (*pcre32_free)(void *); -
      -
      -void *(*pcre32_stack_malloc)(size_t); -
      -
      -void (*pcre32_stack_free)(void *); -
      -
      -int (*pcre32_callout)(pcre32_callout_block *); -

      -
      PCRE 32-BIT API 32-BIT-ONLY FUNCTION
      -

      -int pcre32_utf32_to_host_byte_order(PCRE_UCHAR32 *output, - PCRE_SPTR32 input, int length, int *byte_order, - int keep_boms); -

      -
      THE PCRE 32-BIT LIBRARY
      -

      -Starting with release 8.32, it is possible to compile a PCRE library that -supports 32-bit character strings, including UTF-32 strings, as well as or -instead of the original 8-bit library. This work was done by Christian Persch, -based on the work done by Zoltan Herczeg for the 16-bit library. All three -libraries contain identical sets of functions, used in exactly the same way. -Only the names of the functions and the data types of their arguments and -results are different. To avoid over-complication and reduce the documentation -maintenance load, most of the PCRE documentation describes the 8-bit library, -with only occasional references to the 16-bit and 32-bit libraries. This page -describes what is different when you use the 32-bit library. -

      -

      -WARNING: A single application can be linked with all or any of the three -libraries, but you must take care when processing any particular pattern -to use functions from just one library. For example, if you want to study -a pattern that was compiled with pcre32_compile(), you must do so -with pcre32_study(), not pcre_study(), and you must free the -study data with pcre32_free_study(). -

      -
      THE HEADER FILE
      -

      -There is only one header file, pcre.h. It contains prototypes for all the -functions in all libraries, as well as definitions of flags, structures, error -codes, etc. -

      -
      THE LIBRARY NAME
      -

      -In Unix-like systems, the 32-bit library is called libpcre32, and can -normally be accesss by adding -lpcre32 to the command for linking an -application that uses PCRE. -

      -
      STRING TYPES
      -

      -In the 8-bit library, strings are passed to PCRE library functions as vectors -of bytes with the C type "char *". In the 32-bit library, strings are passed as -vectors of unsigned 32-bit quantities. The macro PCRE_UCHAR32 specifies an -appropriate data type, and PCRE_SPTR32 is defined as "const PCRE_UCHAR32 *". In -very many environments, "unsigned int" is a 32-bit data type. When PCRE is -built, it defines PCRE_UCHAR32 as "unsigned int", but checks that it really is -a 32-bit data type. If it is not, the build fails with an error message telling -the maintainer to modify the definition appropriately. -

      -
      STRUCTURE TYPES
      -

      -The types of the opaque structures that are used for compiled 32-bit patterns -and JIT stacks are pcre32 and pcre32_jit_stack respectively. The -type of the user-accessible structure that is returned by pcre32_study() -is pcre32_extra, and the type of the structure that is used for passing -data to a callout function is pcre32_callout_block. These structures -contain the same fields, with the same names, as their 8-bit counterparts. The -only difference is that pointers to character strings are 32-bit instead of -8-bit types. -

      -
      32-BIT FUNCTIONS
      -

      -For every function in the 8-bit library there is a corresponding function in -the 32-bit library with a name that starts with pcre32_ instead of -pcre_. The prototypes are listed above. In addition, there is one extra -function, pcre32_utf32_to_host_byte_order(). This is a utility function -that converts a UTF-32 character string to host byte order if necessary. The -other 32-bit functions expect the strings they are passed to be in host byte -order. -

      -

      -The input and output arguments of -pcre32_utf32_to_host_byte_order() may point to the same address, that is, -conversion in place is supported. The output buffer must be at least as long as -the input. -

      -

      -The length argument specifies the number of 32-bit data units in the -input string; a negative value specifies a zero-terminated string. -

      -

      -If byte_order is NULL, it is assumed that the string starts off in host -byte order. This may be changed by byte-order marks (BOMs) anywhere in the -string (commonly as the first character). -

      -

      -If byte_order is not NULL, a non-zero value of the integer to which it -points means that the input starts off in host byte order, otherwise the -opposite order is assumed. Again, BOMs in the string can change this. The final -byte order is passed back at the end of processing. -

      -

      -If keep_boms is not zero, byte-order mark characters (0xfeff) are copied -into the output string. Otherwise they are discarded. -

      -

      -The result of the function is the number of 32-bit units placed into the output -buffer, including the zero terminator if the string was zero-terminated. -

      -
      SUBJECT STRING OFFSETS
      -

      -The lengths and starting offsets of subject strings must be specified in 32-bit -data units, and the offsets within subject strings that are returned by the -matching functions are in also 32-bit units rather than bytes. -

      -
      NAMED SUBPATTERNS
      -

      -The name-to-number translation table that is maintained for named subpatterns -uses 32-bit characters. The pcre32_get_stringtable_entries() function -returns the length of each entry in the table as the number of 32-bit data -units. -

      -
      OPTION NAMES
      -

      -There are two new general option names, PCRE_UTF32 and PCRE_NO_UTF32_CHECK, -which correspond to PCRE_UTF8 and PCRE_NO_UTF8_CHECK in the 8-bit library. In -fact, these new options define the same bits in the options word. There is a -discussion about the -validity of UTF-32 strings -in the -pcreunicode -page. -

      -

      -For the pcre32_config() function there is an option PCRE_CONFIG_UTF32 -that returns 1 if UTF-32 support is configured, otherwise 0. If this option is -given to pcre_config() or pcre16_config(), or if the -PCRE_CONFIG_UTF8 or PCRE_CONFIG_UTF16 option is given to pcre32_config(), -the result is the PCRE_ERROR_BADOPTION error. -

      -
      CHARACTER CODES
      -

      -In 32-bit mode, when PCRE_UTF32 is not set, character values are treated in the -same way as in 8-bit, non UTF-8 mode, except, of course, that they can range -from 0 to 0x7fffffff instead of 0 to 0xff. Character types for characters less -than 0xff can therefore be influenced by the locale in the same way as before. -Characters greater than 0xff have only one case, and no "type" (such as letter -or digit). -

      -

      -In UTF-32 mode, the character code is Unicode, in the range 0 to 0x10ffff, with -the exception of values in the range 0xd800 to 0xdfff because those are -"surrogate" values that are ill-formed in UTF-32. -

      -

      -A UTF-32 string can indicate its endianness by special code knows as a -byte-order mark (BOM). The PCRE functions do not handle this, expecting strings -to be in host byte order. A utility function called -pcre32_utf32_to_host_byte_order() is provided to help with this (see -above). -

      -
      ERROR NAMES
      -

      -The error PCRE_ERROR_BADUTF32 corresponds to its 8-bit counterpart. -The error PCRE_ERROR_BADMODE is given when a compiled -pattern is passed to a function that processes patterns in the other -mode, for example, if a pattern compiled with pcre_compile() is passed to -pcre32_exec(). -

      -

      -There are new error codes whose names begin with PCRE_UTF32_ERR for invalid -UTF-32 strings, corresponding to the PCRE_UTF8_ERR codes for UTF-8 strings that -are described in the section entitled -"Reason codes for invalid UTF-8 strings" -in the main -pcreapi -page. The UTF-32 errors are: -

      -  PCRE_UTF32_ERR1  Surrogate character (range from 0xd800 to 0xdfff)
      -  PCRE_UTF32_ERR2  Non-character
      -  PCRE_UTF32_ERR3  Character > 0x10ffff
      -
      -

      -
      ERROR TEXTS
      -

      -If there is an error while compiling a pattern, the error text that is passed -back by pcre32_compile() or pcre32_compile2() is still an 8-bit -character string, zero-terminated. -

      -
      CALLOUTS
      -

      -The subject and mark fields in the callout block that is passed to -a callout function point to 32-bit vectors. -

      -
      TESTING
      -

      -The pcretest program continues to operate with 8-bit input and output -files, but it can be used for testing the 32-bit library. If it is run with the -command line option -32, patterns and subject strings are converted from -8-bit to 32-bit before being passed to PCRE, and the 32-bit library functions -are used instead of the 8-bit ones. Returned 32-bit strings are converted to -8-bit for output. If both the 8-bit and the 16-bit libraries were not compiled, -pcretest defaults to 32-bit and the -32 option is ignored. -

      -

      -When PCRE is being built, the RunTest script that is called by "make -check" uses the pcretest -C option to discover which of the 8-bit, -16-bit and 32-bit libraries has been built, and runs the tests appropriately. -

      -
      NOT SUPPORTED IN 32-BIT MODE
      -

      -Not all the features of the 8-bit library are available with the 32-bit -library. The C++ and POSIX wrapper functions support only the 8-bit library, -and the pcregrep program is at present 8-bit only. -

      -
      AUTHOR
      -

      -Philip Hazel -
      -University Computing Service -
      -Cambridge CB2 3QH, England. -
      -

      -
      REVISION
      -

      -Last updated: 12 May 2013 -
      -Copyright © 1997-2013 University of Cambridge. -
      -

      -Return to the PCRE index page. -

      diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcre_assign_jit_stack.html b/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcre_assign_jit_stack.html deleted file mode 100644 index b2eef704..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcre_assign_jit_stack.html +++ /dev/null @@ -1,76 +0,0 @@ - - -pcre_assign_jit_stack specification - - -

      pcre_assign_jit_stack man page

      -

      -Return to the PCRE index page. -

      -

      -This page is part of the PCRE HTML documentation. It was generated automatically -from the original man page. If there is any nonsense in it, please consult the -man page, in case the conversion went wrong. -
      -
      -SYNOPSIS -
      -

      -#include <pcre.h> -

      -

      -void pcre_assign_jit_stack(pcre_extra *extra, - pcre_jit_callback callback, void *data); -
      -
      -void pcre16_assign_jit_stack(pcre16_extra *extra, - pcre16_jit_callback callback, void *data); -
      -
      -void pcre32_assign_jit_stack(pcre32_extra *extra, - pcre32_jit_callback callback, void *data); -

      -
      -DESCRIPTION -
      -

      -This function provides control over the memory used as a stack at run-time by a -call to pcre[16|32]_exec() with a pattern that has been successfully -compiled with JIT optimization. The arguments are: -

      -  extra     the data pointer returned by pcre[16|32]_study()
      -  callback  a callback function
      -  data      a JIT stack or a value to be passed to the callback
      -              function
      -
      -

      -

      -If callback is NULL and data is NULL, an internal 32K block on -the machine stack is used. -

      -

      -If callback is NULL and data is not NULL, data must -be a valid JIT stack, the result of calling pcre[16|32]_jit_stack_alloc(). -

      -

      -If callback not NULL, it is called with data as an argument at -the start of matching, in order to set up a JIT stack. If the result is NULL, -the internal 32K stack is used; otherwise the return value must be a valid JIT -stack, the result of calling pcre[16|32]_jit_stack_alloc(). -

      -

      -You may safely assign the same JIT stack to multiple patterns, as long as they -are all matched in the same thread. In a multithread application, each thread -must use its own JIT stack. For more details, see the -pcrejit -page. -

      -

      -There is a complete description of the PCRE native API in the -pcreapi -page and a description of the POSIX API in the -pcreposix -page. -

      -Return to the PCRE index page. -

      diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcre_compile.html b/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcre_compile.html deleted file mode 100644 index 95b4bec6..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcre_compile.html +++ /dev/null @@ -1,111 +0,0 @@ - - -pcre_compile specification - - -

      pcre_compile man page

      -

      -Return to the PCRE index page. -

      -

      -This page is part of the PCRE HTML documentation. It was generated automatically -from the original man page. If there is any nonsense in it, please consult the -man page, in case the conversion went wrong. -
      -
      -SYNOPSIS -
      -

      -#include <pcre.h> -

      -

      -pcre *pcre_compile(const char *pattern, int options, - const char **errptr, int *erroffset, - const unsigned char *tableptr); -
      -
      -pcre16 *pcre16_compile(PCRE_SPTR16 pattern, int options, - const char **errptr, int *erroffset, - const unsigned char *tableptr); -
      -
      -pcre32 *pcre32_compile(PCRE_SPTR32 pattern, int options, - const char **errptr, int *erroffset, - const unsigned char *tableptr); -

      -
      -DESCRIPTION -
      -

      -This function compiles a regular expression into an internal form. It is the -same as pcre[16|32]_compile2(), except for the absence of the -errorcodeptr argument. Its arguments are: -

      -  pattern       A zero-terminated string containing the
      -                  regular expression to be compiled
      -  options       Zero or more option bits
      -  errptr        Where to put an error message
      -  erroffset     Offset in pattern where error was found
      -  tableptr      Pointer to character tables, or NULL to
      -                  use the built-in default
      -
      -The option bits are: -
      -  PCRE_ANCHORED           Force pattern anchoring
      -  PCRE_AUTO_CALLOUT       Compile automatic callouts
      -  PCRE_BSR_ANYCRLF        \R matches only CR, LF, or CRLF
      -  PCRE_BSR_UNICODE        \R matches all Unicode line endings
      -  PCRE_CASELESS           Do caseless matching
      -  PCRE_DOLLAR_ENDONLY     $ not to match newline at end
      -  PCRE_DOTALL             . matches anything including NL
      -  PCRE_DUPNAMES           Allow duplicate names for subpatterns
      -  PCRE_EXTENDED           Ignore white space and # comments
      -  PCRE_EXTRA              PCRE extra features
      -                            (not much use currently)
      -  PCRE_FIRSTLINE          Force matching to be before newline
      -  PCRE_JAVASCRIPT_COMPAT  JavaScript compatibility
      -  PCRE_MULTILINE          ^ and $ match newlines within data
      -  PCRE_NEVER_UTF          Lock out UTF, e.g. via (*UTF)
      -  PCRE_NEWLINE_ANY        Recognize any Unicode newline sequence
      -  PCRE_NEWLINE_ANYCRLF    Recognize CR, LF, and CRLF as newline
      -                            sequences
      -  PCRE_NEWLINE_CR         Set CR as the newline sequence
      -  PCRE_NEWLINE_CRLF       Set CRLF as the newline sequence
      -  PCRE_NEWLINE_LF         Set LF as the newline sequence
      -  PCRE_NO_AUTO_CAPTURE    Disable numbered capturing paren-
      -                            theses (named ones available)
      -  PCRE_NO_AUTO_POSSESS    Disable auto-possessification
      -  PCRE_NO_START_OPTIMIZE  Disable match-time start optimizations
      -  PCRE_NO_UTF16_CHECK     Do not check the pattern for UTF-16
      -                            validity (only relevant if
      -                            PCRE_UTF16 is set)
      -  PCRE_NO_UTF32_CHECK     Do not check the pattern for UTF-32
      -                            validity (only relevant if
      -                            PCRE_UTF32 is set)
      -  PCRE_NO_UTF8_CHECK      Do not check the pattern for UTF-8
      -                            validity (only relevant if
      -                            PCRE_UTF8 is set)
      -  PCRE_UCP                Use Unicode properties for \d, \w, etc.
      -  PCRE_UNGREEDY           Invert greediness of quantifiers
      -  PCRE_UTF16              Run in pcre16_compile() UTF-16 mode
      -  PCRE_UTF32              Run in pcre32_compile() UTF-32 mode
      -  PCRE_UTF8               Run in pcre_compile() UTF-8 mode
      -
      -PCRE must be built with UTF support in order to use PCRE_UTF8/16/32 and -PCRE_NO_UTF8/16/32_CHECK, and with UCP support if PCRE_UCP is used. -

      -

      -The yield of the function is a pointer to a private data structure that -contains the compiled pattern, or NULL if an error was detected. Note that -compiling regular expressions with one version of PCRE for use with a different -version is not guaranteed to work and may cause crashes. -

      -

      -There is a complete description of the PCRE native API in the -pcreapi -page and a description of the POSIX API in the -pcreposix -page. -

      -Return to the PCRE index page. -

      diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcre_compile2.html b/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcre_compile2.html deleted file mode 100644 index 9cd56a23..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcre_compile2.html +++ /dev/null @@ -1,115 +0,0 @@ - - -pcre_compile2 specification - - -

      pcre_compile2 man page

      -

      -Return to the PCRE index page. -

      -

      -This page is part of the PCRE HTML documentation. It was generated automatically -from the original man page. If there is any nonsense in it, please consult the -man page, in case the conversion went wrong. -
      -
      -SYNOPSIS -
      -

      -#include <pcre.h> -

      -

      -pcre *pcre_compile2(const char *pattern, int options, - int *errorcodeptr, - const char **errptr, int *erroffset, - const unsigned char *tableptr); -
      -
      -pcre16 *pcre16_compile2(PCRE_SPTR16 pattern, int options, - int *errorcodeptr, - const char **errptr, int *erroffset, - const unsigned char *tableptr); -
      -
      -pcre32 *pcre32_compile2(PCRE_SPTR32 pattern, int options, -" int *errorcodeptr,£ - const char **errptr, int *erroffset, - const unsigned char *tableptr); -

      -
      -DESCRIPTION -
      -

      -This function compiles a regular expression into an internal form. It is the -same as pcre[16|32]_compile(), except for the addition of the -errorcodeptr argument. The arguments are: -

      -  pattern       A zero-terminated string containing the
      -                  regular expression to be compiled
      -  options       Zero or more option bits
      -  errorcodeptr  Where to put an error code
      -  errptr        Where to put an error message
      -  erroffset     Offset in pattern where error was found
      -  tableptr      Pointer to character tables, or NULL to
      -                  use the built-in default
      -
      -The option bits are: -
      -  PCRE_ANCHORED           Force pattern anchoring
      -  PCRE_AUTO_CALLOUT       Compile automatic callouts
      -  PCRE_BSR_ANYCRLF        \R matches only CR, LF, or CRLF
      -  PCRE_BSR_UNICODE        \R matches all Unicode line endings
      -  PCRE_CASELESS           Do caseless matching
      -  PCRE_DOLLAR_ENDONLY     $ not to match newline at end
      -  PCRE_DOTALL             . matches anything including NL
      -  PCRE_DUPNAMES           Allow duplicate names for subpatterns
      -  PCRE_EXTENDED           Ignore white space and # comments
      -  PCRE_EXTRA              PCRE extra features
      -                            (not much use currently)
      -  PCRE_FIRSTLINE          Force matching to be before newline
      -  PCRE_JAVASCRIPT_COMPAT  JavaScript compatibility
      -  PCRE_MULTILINE          ^ and $ match newlines within data
      -  PCRE_NEVER_UTF          Lock out UTF, e.g. via (*UTF)
      -  PCRE_NEWLINE_ANY        Recognize any Unicode newline sequence
      -  PCRE_NEWLINE_ANYCRLF    Recognize CR, LF, and CRLF as newline
      -                            sequences
      -  PCRE_NEWLINE_CR         Set CR as the newline sequence
      -  PCRE_NEWLINE_CRLF       Set CRLF as the newline sequence
      -  PCRE_NEWLINE_LF         Set LF as the newline sequence
      -  PCRE_NO_AUTO_CAPTURE    Disable numbered capturing paren-
      -                            theses (named ones available)
      -  PCRE_NO_AUTO_POSSESS    Disable auto-possessification
      -  PCRE_NO_START_OPTIMIZE  Disable match-time start optimizations
      -  PCRE_NO_UTF16_CHECK     Do not check the pattern for UTF-16
      -                            validity (only relevant if
      -                            PCRE_UTF16 is set)
      -  PCRE_NO_UTF32_CHECK     Do not check the pattern for UTF-32
      -                            validity (only relevant if
      -                            PCRE_UTF32 is set)
      -  PCRE_NO_UTF8_CHECK      Do not check the pattern for UTF-8
      -                            validity (only relevant if
      -                            PCRE_UTF8 is set)
      -  PCRE_UCP                Use Unicode properties for \d, \w, etc.
      -  PCRE_UNGREEDY           Invert greediness of quantifiers
      -  PCRE_UTF16              Run pcre16_compile() in UTF-16 mode
      -  PCRE_UTF32              Run pcre32_compile() in UTF-32 mode
      -  PCRE_UTF8               Run pcre_compile() in UTF-8 mode
      -
      -PCRE must be built with UTF support in order to use PCRE_UTF8/16/32 and -PCRE_NO_UTF8/16/32_CHECK, and with UCP support if PCRE_UCP is used. -

      -

      -The yield of the function is a pointer to a private data structure that -contains the compiled pattern, or NULL if an error was detected. Note that -compiling regular expressions with one version of PCRE for use with a different -version is not guaranteed to work and may cause crashes. -

      -

      -There is a complete description of the PCRE native API in the -pcreapi -page and a description of the POSIX API in the -pcreposix -page. -

      -Return to the PCRE index page. -

      diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcre_config.html b/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcre_config.html deleted file mode 100644 index 72fb9caa..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcre_config.html +++ /dev/null @@ -1,94 +0,0 @@ - - -pcre_config specification - - -

      pcre_config man page

      -

      -Return to the PCRE index page. -

      -

      -This page is part of the PCRE HTML documentation. It was generated automatically -from the original man page. If there is any nonsense in it, please consult the -man page, in case the conversion went wrong. -
      -
      -SYNOPSIS -
      -

      -#include <pcre.h> -

      -

      -int pcre_config(int what, void *where); -

      -

      -int pcre16_config(int what, void *where); -

      -

      -int pcre32_config(int what, void *where); -

      -
      -DESCRIPTION -
      -

      -This function makes it possible for a client program to find out which optional -features are available in the version of the PCRE library it is using. The -arguments are as follows: -

      -  what     A code specifying what information is required
      -  where    Points to where to put the data
      -
      -The where argument must point to an integer variable, except for -PCRE_CONFIG_MATCH_LIMIT, PCRE_CONFIG_MATCH_LIMIT_RECURSION, and -PCRE_CONFIG_PARENS_LIMIT, when it must point to an unsigned long integer, -and for PCRE_CONFIG_JITTARGET, when it must point to a const char*. -The available codes are: -
      -  PCRE_CONFIG_JIT           Availability of just-in-time compiler
      -                              support (1=yes 0=no)
      -  PCRE_CONFIG_JITTARGET     String containing information about the
      -                              target architecture for the JIT compiler,
      -                              or NULL if there is no JIT support
      -  PCRE_CONFIG_LINK_SIZE     Internal link size: 2, 3, or 4
      -  PCRE_CONFIG_PARENS_LIMIT  Parentheses nesting limit
      -  PCRE_CONFIG_MATCH_LIMIT   Internal resource limit
      -  PCRE_CONFIG_MATCH_LIMIT_RECURSION
      -                            Internal recursion depth limit
      -  PCRE_CONFIG_NEWLINE       Value of the default newline sequence:
      -                                13 (0x000d)    for CR
      -                                10 (0x000a)    for LF
      -                              3338 (0x0d0a)    for CRLF
      -                                -2             for ANYCRLF
      -                                -1             for ANY
      -  PCRE_CONFIG_BSR           Indicates what \R matches by default:
      -                                 0             all Unicode line endings
      -                                 1             CR, LF, or CRLF only
      -  PCRE_CONFIG_POSIX_MALLOC_THRESHOLD
      -                            Threshold of return slots, above which
      -                              malloc() is used by the POSIX API
      -  PCRE_CONFIG_STACKRECURSE  Recursion implementation (1=stack 0=heap)
      -  PCRE_CONFIG_UTF16         Availability of UTF-16 support (1=yes
      -                               0=no); option for pcre16_config()
      -  PCRE_CONFIG_UTF32         Availability of UTF-32 support (1=yes
      -                               0=no); option for pcre32_config()
      -  PCRE_CONFIG_UTF8          Availability of UTF-8 support (1=yes 0=no);
      -                              option for pcre_config()
      -  PCRE_CONFIG_UNICODE_PROPERTIES
      -                            Availability of Unicode property support
      -                              (1=yes 0=no)
      -
      -The function yields 0 on success or PCRE_ERROR_BADOPTION otherwise. That error -is also given if PCRE_CONFIG_UTF16 or PCRE_CONFIG_UTF32 is passed to -pcre_config(), if PCRE_CONFIG_UTF8 or PCRE_CONFIG_UTF32 is passed to -pcre16_config(), or if PCRE_CONFIG_UTF8 or PCRE_CONFIG_UTF16 is passed to -pcre32_config(). -

      -

      -There is a complete description of the PCRE native API in the -pcreapi -page and a description of the POSIX API in the -pcreposix -page. -

      -Return to the PCRE index page. -

      diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcre_copy_named_substring.html b/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcre_copy_named_substring.html deleted file mode 100644 index 77b48043..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcre_copy_named_substring.html +++ /dev/null @@ -1,65 +0,0 @@ - - -pcre_copy_named_substring specification - - -

      pcre_copy_named_substring man page

      -

      -Return to the PCRE index page. -

      -

      -This page is part of the PCRE HTML documentation. It was generated automatically -from the original man page. If there is any nonsense in it, please consult the -man page, in case the conversion went wrong. -
      -
      -SYNOPSIS -
      -

      -#include <pcre.h> -

      -

      -int pcre_copy_named_substring(const pcre *code, - const char *subject, int *ovector, - int stringcount, const char *stringname, - char *buffer, int buffersize); -
      -
      -int pcre16_copy_named_substring(const pcre16 *code, - PCRE_SPTR16 subject, int *ovector, - int stringcount, PCRE_SPTR16 stringname, - PCRE_UCHAR16 *buffer, int buffersize); -
      -
      -int pcre32_copy_named_substring(const pcre32 *code, - PCRE_SPTR32 subject, int *ovector, - int stringcount, PCRE_SPTR32 stringname, - PCRE_UCHAR32 *buffer, int buffersize); -

      -
      -DESCRIPTION -
      -

      -This is a convenience function for extracting a captured substring, identified -by name, into a given buffer. The arguments are: -

      -  code          Pattern that was successfully matched
      -  subject       Subject that has been successfully matched
      -  ovector       Offset vector that pcre[16|32]_exec() used
      -  stringcount   Value returned by pcre[16|32]_exec()
      -  stringname    Name of the required substring
      -  buffer        Buffer to receive the string
      -  buffersize    Size of buffer
      -
      -The yield is the length of the substring, PCRE_ERROR_NOMEMORY if the buffer was -too small, or PCRE_ERROR_NOSUBSTRING if the string name is invalid. -

      -

      -There is a complete description of the PCRE native API in the -pcreapi -page and a description of the POSIX API in the -pcreposix -page. -

      -Return to the PCRE index page. -

      diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcre_copy_substring.html b/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcre_copy_substring.html deleted file mode 100644 index ecaebe85..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcre_copy_substring.html +++ /dev/null @@ -1,61 +0,0 @@ - - -pcre_copy_substring specification - - -

      pcre_copy_substring man page

      -

      -Return to the PCRE index page. -

      -

      -This page is part of the PCRE HTML documentation. It was generated automatically -from the original man page. If there is any nonsense in it, please consult the -man page, in case the conversion went wrong. -
      -
      -SYNOPSIS -
      -

      -#include <pcre.h> -

      -

      -int pcre_copy_substring(const char *subject, int *ovector, - int stringcount, int stringnumber, char *buffer, - int buffersize); -
      -
      -int pcre16_copy_substring(PCRE_SPTR16 subject, int *ovector, - int stringcount, int stringnumber, PCRE_UCHAR16 *buffer, - int buffersize); -
      -
      -int pcre32_copy_substring(PCRE_SPTR32 subject, int *ovector, - int stringcount, int stringnumber, PCRE_UCHAR32 *buffer, - int buffersize); -

      -
      -DESCRIPTION -
      -

      -This is a convenience function for extracting a captured substring into a given -buffer. The arguments are: -

      -  subject       Subject that has been successfully matched
      -  ovector       Offset vector that pcre[16|32]_exec() used
      -  stringcount   Value returned by pcre[16|32]_exec()
      -  stringnumber  Number of the required substring
      -  buffer        Buffer to receive the string
      -  buffersize    Size of buffer
      -
      -The yield is the length of the string, PCRE_ERROR_NOMEMORY if the buffer was -too small, or PCRE_ERROR_NOSUBSTRING if the string number is invalid. -

      -

      -There is a complete description of the PCRE native API in the -pcreapi -page and a description of the POSIX API in the -pcreposix -page. -

      -Return to the PCRE index page. -

      diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcre_dfa_exec.html b/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcre_dfa_exec.html deleted file mode 100644 index 5fff6a7e..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcre_dfa_exec.html +++ /dev/null @@ -1,129 +0,0 @@ - - -pcre_dfa_exec specification - - -

      pcre_dfa_exec man page

      -

      -Return to the PCRE index page. -

      -

      -This page is part of the PCRE HTML documentation. It was generated automatically -from the original man page. If there is any nonsense in it, please consult the -man page, in case the conversion went wrong. -
      -
      -SYNOPSIS -
      -

      -#include <pcre.h> -

      -

      -int pcre_dfa_exec(const pcre *code, const pcre_extra *extra, - const char *subject, int length, int startoffset, - int options, int *ovector, int ovecsize, - int *workspace, int wscount); -
      -
      -int pcre16_dfa_exec(const pcre16 *code, const pcre16_extra *extra, - PCRE_SPTR16 subject, int length, int startoffset, - int options, int *ovector, int ovecsize, - int *workspace, int wscount); -
      -
      -int pcre32_dfa_exec(const pcre32 *code, const pcre32_extra *extra, - PCRE_SPTR32 subject, int length, int startoffset, - int options, int *ovector, int ovecsize, - int *workspace, int wscount); -

      -
      -DESCRIPTION -
      -

      -This function matches a compiled regular expression against a given subject -string, using an alternative matching algorithm that scans the subject string -just once (not Perl-compatible). Note that the main, Perl-compatible, -matching function is pcre[16|32]_exec(). The arguments for this function -are: -

      -  code         Points to the compiled pattern
      -  extra        Points to an associated pcre[16|32]_extra structure,
      -                 or is NULL
      -  subject      Points to the subject string
      -  length       Length of the subject string
      -  startoffset  Offset in the subject at which to start matching
      -  options      Option bits
      -  ovector      Points to a vector of ints for result offsets
      -  ovecsize     Number of elements in the vector
      -  workspace    Points to a vector of ints used as working space
      -  wscount      Number of elements in the vector
      -
      -The units for length and startoffset are bytes for -pcre_exec(), 16-bit data items for pcre16_exec(), and 32-bit items -for pcre32_exec(). The options are: -
      -  PCRE_ANCHORED          Match only at the first position
      -  PCRE_BSR_ANYCRLF       \R matches only CR, LF, or CRLF
      -  PCRE_BSR_UNICODE       \R matches all Unicode line endings
      -  PCRE_NEWLINE_ANY       Recognize any Unicode newline sequence
      -  PCRE_NEWLINE_ANYCRLF   Recognize CR, LF, & CRLF as newline sequences
      -  PCRE_NEWLINE_CR        Recognize CR as the only newline sequence
      -  PCRE_NEWLINE_CRLF      Recognize CRLF as the only newline sequence
      -  PCRE_NEWLINE_LF        Recognize LF as the only newline sequence
      -  PCRE_NOTBOL            Subject is not the beginning of a line
      -  PCRE_NOTEOL            Subject is not the end of a line
      -  PCRE_NOTEMPTY          An empty string is not a valid match
      -  PCRE_NOTEMPTY_ATSTART  An empty string at the start of the subject
      -                           is not a valid match
      -  PCRE_NO_START_OPTIMIZE Do not do "start-match" optimizations
      -  PCRE_NO_UTF16_CHECK    Do not check the subject for UTF-16
      -                           validity (only relevant if PCRE_UTF16
      -                           was set at compile time)
      -  PCRE_NO_UTF32_CHECK    Do not check the subject for UTF-32
      -                           validity (only relevant if PCRE_UTF32
      -                           was set at compile time)
      -  PCRE_NO_UTF8_CHECK     Do not check the subject for UTF-8
      -                           validity (only relevant if PCRE_UTF8
      -                           was set at compile time)
      -  PCRE_PARTIAL           ) Return PCRE_ERROR_PARTIAL for a partial
      -  PCRE_PARTIAL_SOFT      )   match if no full matches are found
      -  PCRE_PARTIAL_HARD      Return PCRE_ERROR_PARTIAL for a partial match
      -                           even if there is a full match as well
      -  PCRE_DFA_SHORTEST      Return only the shortest match
      -  PCRE_DFA_RESTART       Restart after a partial match
      -
      -There are restrictions on what may appear in a pattern when using this matching -function. Details are given in the -pcrematching -documentation. For details of partial matching, see the -pcrepartial -page. -

      -

      -A pcre[16|32]_extra structure contains the following fields: -

      -  flags            Bits indicating which fields are set
      -  study_data       Opaque data from pcre[16|32]_study()
      -  match_limit      Limit on internal resource use
      -  match_limit_recursion  Limit on internal recursion depth
      -  callout_data     Opaque data passed back to callouts
      -  tables           Points to character tables or is NULL
      -  mark             For passing back a *MARK pointer
      -  executable_jit   Opaque data from JIT compilation
      -
      -The flag bits are PCRE_EXTRA_STUDY_DATA, PCRE_EXTRA_MATCH_LIMIT, -PCRE_EXTRA_MATCH_LIMIT_RECURSION, PCRE_EXTRA_CALLOUT_DATA, -PCRE_EXTRA_TABLES, PCRE_EXTRA_MARK and PCRE_EXTRA_EXECUTABLE_JIT. For this -matching function, the match_limit and match_limit_recursion fields -are not used, and must not be set. The PCRE_EXTRA_EXECUTABLE_JIT flag and -the corresponding variable are ignored. -

      -

      -There is a complete description of the PCRE native API in the -pcreapi -page and a description of the POSIX API in the -pcreposix -page. -

      -Return to the PCRE index page. -

      diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcre_exec.html b/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcre_exec.html deleted file mode 100644 index 18e1a13f..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcre_exec.html +++ /dev/null @@ -1,111 +0,0 @@ - - -pcre_exec specification - - -

      pcre_exec man page

      -

      -Return to the PCRE index page. -

      -

      -This page is part of the PCRE HTML documentation. It was generated automatically -from the original man page. If there is any nonsense in it, please consult the -man page, in case the conversion went wrong. -
      -
      -SYNOPSIS -
      -

      -#include <pcre.h> -

      -

      -int pcre_exec(const pcre *code, const pcre_extra *extra, - const char *subject, int length, int startoffset, - int options, int *ovector, int ovecsize); -
      -
      -int pcre16_exec(const pcre16 *code, const pcre16_extra *extra, - PCRE_SPTR16 subject, int length, int startoffset, - int options, int *ovector, int ovecsize); -
      -
      -int pcre32_exec(const pcre32 *code, const pcre32_extra *extra, - PCRE_SPTR32 subject, int length, int startoffset, - int options, int *ovector, int ovecsize); -

      -
      -DESCRIPTION -
      -

      -This function matches a compiled regular expression against a given subject -string, using a matching algorithm that is similar to Perl's. It returns -offsets to captured substrings. Its arguments are: -

      -  code         Points to the compiled pattern
      -  extra        Points to an associated pcre[16|32]_extra structure,
      -                 or is NULL
      -  subject      Points to the subject string
      -  length       Length of the subject string
      -  startoffset  Offset in the subject at which to start matching
      -  options      Option bits
      -  ovector      Points to a vector of ints for result offsets
      -  ovecsize     Number of elements in the vector (a multiple of 3)
      -
      -The units for length and startoffset are bytes for -pcre_exec(), 16-bit data items for pcre16_exec(), and 32-bit items -for pcre32_exec(). The options are: -
      -  PCRE_ANCHORED          Match only at the first position
      -  PCRE_BSR_ANYCRLF       \R matches only CR, LF, or CRLF
      -  PCRE_BSR_UNICODE       \R matches all Unicode line endings
      -  PCRE_NEWLINE_ANY       Recognize any Unicode newline sequence
      -  PCRE_NEWLINE_ANYCRLF   Recognize CR, LF, & CRLF as newline sequences
      -  PCRE_NEWLINE_CR        Recognize CR as the only newline sequence
      -  PCRE_NEWLINE_CRLF      Recognize CRLF as the only newline sequence
      -  PCRE_NEWLINE_LF        Recognize LF as the only newline sequence
      -  PCRE_NOTBOL            Subject string is not the beginning of a line
      -  PCRE_NOTEOL            Subject string is not the end of a line
      -  PCRE_NOTEMPTY          An empty string is not a valid match
      -  PCRE_NOTEMPTY_ATSTART  An empty string at the start of the subject
      -                           is not a valid match
      -  PCRE_NO_START_OPTIMIZE Do not do "start-match" optimizations
      -  PCRE_NO_UTF16_CHECK    Do not check the subject for UTF-16
      -                           validity (only relevant if PCRE_UTF16
      -                           was set at compile time)
      -  PCRE_NO_UTF32_CHECK    Do not check the subject for UTF-32
      -                           validity (only relevant if PCRE_UTF32
      -                           was set at compile time)
      -  PCRE_NO_UTF8_CHECK     Do not check the subject for UTF-8
      -                           validity (only relevant if PCRE_UTF8
      -                           was set at compile time)
      -  PCRE_PARTIAL           ) Return PCRE_ERROR_PARTIAL for a partial
      -  PCRE_PARTIAL_SOFT      )   match if no full matches are found
      -  PCRE_PARTIAL_HARD      Return PCRE_ERROR_PARTIAL for a partial match
      -                           if that is found before a full match
      -
      -For details of partial matching, see the -pcrepartial -page. A pcre_extra structure contains the following fields: -
      -  flags            Bits indicating which fields are set
      -  study_data       Opaque data from pcre[16|32]_study()
      -  match_limit      Limit on internal resource use
      -  match_limit_recursion  Limit on internal recursion depth
      -  callout_data     Opaque data passed back to callouts
      -  tables           Points to character tables or is NULL
      -  mark             For passing back a *MARK pointer
      -  executable_jit   Opaque data from JIT compilation
      -
      -The flag bits are PCRE_EXTRA_STUDY_DATA, PCRE_EXTRA_MATCH_LIMIT, -PCRE_EXTRA_MATCH_LIMIT_RECURSION, PCRE_EXTRA_CALLOUT_DATA, -PCRE_EXTRA_TABLES, PCRE_EXTRA_MARK and PCRE_EXTRA_EXECUTABLE_JIT. -

      -

      -There is a complete description of the PCRE native API in the -pcreapi -page and a description of the POSIX API in the -pcreposix -page. -

      -Return to the PCRE index page. -

      diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcre_free_study.html b/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcre_free_study.html deleted file mode 100644 index 7f9e10e8..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcre_free_study.html +++ /dev/null @@ -1,46 +0,0 @@ - - -pcre_free_study specification - - -

      pcre_free_study man page

      -

      -Return to the PCRE index page. -

      -

      -This page is part of the PCRE HTML documentation. It was generated automatically -from the original man page. If there is any nonsense in it, please consult the -man page, in case the conversion went wrong. -
      -
      -SYNOPSIS -
      -

      -#include <pcre.h> -

      -

      -void pcre_free_study(pcre_extra *extra); -

      -

      -void pcre16_free_study(pcre16_extra *extra); -

      -

      -void pcre32_free_study(pcre32_extra *extra); -

      -
      -DESCRIPTION -
      -

      -This function is used to free the memory used for the data generated by a call -to pcre[16|32]_study() when it is no longer needed. The argument must be the -result of such a call. -

      -

      -There is a complete description of the PCRE native API in the -pcreapi -page and a description of the POSIX API in the -pcreposix -page. -

      -Return to the PCRE index page. -

      diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcre_free_substring.html b/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcre_free_substring.html deleted file mode 100644 index 1fe66107..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcre_free_substring.html +++ /dev/null @@ -1,46 +0,0 @@ - - -pcre_free_substring specification - - -

      pcre_free_substring man page

      -

      -Return to the PCRE index page. -

      -

      -This page is part of the PCRE HTML documentation. It was generated automatically -from the original man page. If there is any nonsense in it, please consult the -man page, in case the conversion went wrong. -
      -
      -SYNOPSIS -
      -

      -#include <pcre.h> -

      -

      -void pcre_free_substring(const char *stringptr); -

      -

      -void pcre16_free_substring(PCRE_SPTR16 stringptr); -

      -

      -void pcre32_free_substring(PCRE_SPTR32 stringptr); -

      -
      -DESCRIPTION -
      -

      -This is a convenience function for freeing the store obtained by a previous -call to pcre[16|32]_get_substring() or pcre[16|32]_get_named_substring(). -Its only argument is a pointer to the string. -

      -

      -There is a complete description of the PCRE native API in the -pcreapi -page and a description of the POSIX API in the -pcreposix -page. -

      -Return to the PCRE index page. -

      diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcre_free_substring_list.html b/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcre_free_substring_list.html deleted file mode 100644 index c0861780..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcre_free_substring_list.html +++ /dev/null @@ -1,46 +0,0 @@ - - -pcre_free_substring_list specification - - -

      pcre_free_substring_list man page

      -

      -Return to the PCRE index page. -

      -

      -This page is part of the PCRE HTML documentation. It was generated automatically -from the original man page. If there is any nonsense in it, please consult the -man page, in case the conversion went wrong. -
      -
      -SYNOPSIS -
      -

      -#include <pcre.h> -

      -

      -void pcre_free_substring_list(const char **stringptr); -

      -

      -void pcre16_free_substring_list(PCRE_SPTR16 *stringptr); -

      -

      -void pcre32_free_substring_list(PCRE_SPTR32 *stringptr); -

      -
      -DESCRIPTION -
      -

      -This is a convenience function for freeing the store obtained by a previous -call to pcre[16|32]_get_substring_list(). Its only argument is a pointer to -the list of string pointers. -

      -

      -There is a complete description of the PCRE native API in the -pcreapi -page and a description of the POSIX API in the -pcreposix -page. -

      -Return to the PCRE index page. -

      diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcre_fullinfo.html b/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcre_fullinfo.html deleted file mode 100644 index 2b7c72b3..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcre_fullinfo.html +++ /dev/null @@ -1,118 +0,0 @@ - - -pcre_fullinfo specification - - -

      pcre_fullinfo man page

      -

      -Return to the PCRE index page. -

      -

      -This page is part of the PCRE HTML documentation. It was generated automatically -from the original man page. If there is any nonsense in it, please consult the -man page, in case the conversion went wrong. -
      -
      -SYNOPSIS -
      -

      -#include <pcre.h> -

      -

      -int pcre_fullinfo(const pcre *code, const pcre_extra *extra, - int what, void *where); -
      -
      -int pcre16_fullinfo(const pcre16 *code, const pcre16_extra *extra, - int what, void *where); -
      -
      -int pcre32_fullinfo(const pcre32 *code, const pcre32_extra *extra, - int what, void *where); -

      -
      -DESCRIPTION -
      -

      -This function returns information about a compiled pattern. Its arguments are: -

      -  code                      Compiled regular expression
      -  extra                     Result of pcre[16|32]_study() or NULL
      -  what                      What information is required
      -  where                     Where to put the information
      -
      -The following information is available: -
      -  PCRE_INFO_BACKREFMAX      Number of highest back reference
      -  PCRE_INFO_CAPTURECOUNT    Number of capturing subpatterns
      -  PCRE_INFO_DEFAULT_TABLES  Pointer to default tables
      -  PCRE_INFO_FIRSTBYTE       Fixed first data unit for a match, or
      -                              -1 for start of string
      -                                 or after newline, or
      -                              -2 otherwise
      -  PCRE_INFO_FIRSTTABLE      Table of first data units (after studying)
      -  PCRE_INFO_HASCRORLF       Return 1 if explicit CR or LF matches exist
      -  PCRE_INFO_JCHANGED        Return 1 if (?J) or (?-J) was used
      -  PCRE_INFO_JIT             Return 1 after successful JIT compilation
      -  PCRE_INFO_JITSIZE         Size of JIT compiled code
      -  PCRE_INFO_LASTLITERAL     Literal last data unit required
      -  PCRE_INFO_MINLENGTH       Lower bound length of matching strings
      -  PCRE_INFO_MATCHEMPTY      Return 1 if the pattern can match an empty string,
      -                               0 otherwise
      -  PCRE_INFO_MATCHLIMIT      Match limit if set, otherwise PCRE_RROR_UNSET
      -  PCRE_INFO_MAXLOOKBEHIND   Length (in characters) of the longest lookbehind assertion
      -  PCRE_INFO_NAMECOUNT       Number of named subpatterns
      -  PCRE_INFO_NAMEENTRYSIZE   Size of name table entry
      -  PCRE_INFO_NAMETABLE       Pointer to name table
      -  PCRE_INFO_OKPARTIAL       Return 1 if partial matching can be tried
      -                              (always returns 1 after release 8.00)
      -  PCRE_INFO_OPTIONS         Option bits used for compilation
      -  PCRE_INFO_SIZE            Size of compiled pattern
      -  PCRE_INFO_STUDYSIZE       Size of study data
      -  PCRE_INFO_FIRSTCHARACTER      Fixed first data unit for a match
      -  PCRE_INFO_FIRSTCHARACTERFLAGS Returns
      -                                  1 if there is a first data character set, which can
      -                                    then be retrieved using PCRE_INFO_FIRSTCHARACTER,
      -                                  2 if the first character is at the start of the data
      -                                    string or after a newline, and
      -                                  0 otherwise
      -  PCRE_INFO_RECURSIONLIMIT    Recursion limit if set, otherwise PCRE_ERROR_UNSET
      -  PCRE_INFO_REQUIREDCHAR      Literal last data unit required
      -  PCRE_INFO_REQUIREDCHARFLAGS Returns 1 if the last data character is set (which can then
      -                              be retrieved using PCRE_INFO_REQUIREDCHAR); 0 otherwise
      -
      -The where argument must point to an integer variable, except for the -following what values: -
      -  PCRE_INFO_DEFAULT_TABLES  const uint8_t *
      -  PCRE_INFO_FIRSTCHARACTER  uint32_t
      -  PCRE_INFO_FIRSTTABLE      const uint8_t *
      -  PCRE_INFO_JITSIZE         size_t
      -  PCRE_INFO_MATCHLIMIT      uint32_t
      -  PCRE_INFO_NAMETABLE       PCRE_SPTR16           (16-bit library)
      -  PCRE_INFO_NAMETABLE       PCRE_SPTR32           (32-bit library)
      -  PCRE_INFO_NAMETABLE       const unsigned char * (8-bit library)
      -  PCRE_INFO_OPTIONS         unsigned long int
      -  PCRE_INFO_SIZE            size_t
      -  PCRE_INFO_STUDYSIZE       size_t
      -  PCRE_INFO_RECURSIONLIMIT  uint32_t
      -  PCRE_INFO_REQUIREDCHAR    uint32_t
      -
      -The yield of the function is zero on success or: -
      -  PCRE_ERROR_NULL           the argument code was NULL
      -                            the argument where was NULL
      -  PCRE_ERROR_BADMAGIC       the "magic number" was not found
      -  PCRE_ERROR_BADOPTION      the value of what was invalid
      -  PCRE_ERROR_UNSET          the option was not set
      -
      -

      -

      -There is a complete description of the PCRE native API in the -pcreapi -page and a description of the POSIX API in the -pcreposix -page. -

      -Return to the PCRE index page. -

      diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcre_get_named_substring.html b/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcre_get_named_substring.html deleted file mode 100644 index 72924d9b..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcre_get_named_substring.html +++ /dev/null @@ -1,68 +0,0 @@ - - -pcre_get_named_substring specification - - -

      pcre_get_named_substring man page

      -

      -Return to the PCRE index page. -

      -

      -This page is part of the PCRE HTML documentation. It was generated automatically -from the original man page. If there is any nonsense in it, please consult the -man page, in case the conversion went wrong. -
      -
      -SYNOPSIS -
      -

      -#include <pcre.h> -

      -

      -int pcre_get_named_substring(const pcre *code, - const char *subject, int *ovector, - int stringcount, const char *stringname, - const char **stringptr); -
      -
      -int pcre16_get_named_substring(const pcre16 *code, - PCRE_SPTR16 subject, int *ovector, - int stringcount, PCRE_SPTR16 stringname, - PCRE_SPTR16 *stringptr); -
      -
      -int pcre32_get_named_substring(const pcre32 *code, - PCRE_SPTR32 subject, int *ovector, - int stringcount, PCRE_SPTR32 stringname, - PCRE_SPTR32 *stringptr); -

      -
      -DESCRIPTION -
      -

      -This is a convenience function for extracting a captured substring by name. The -arguments are: -

      -  code          Compiled pattern
      -  subject       Subject that has been successfully matched
      -  ovector       Offset vector that pcre[16|32]_exec() used
      -  stringcount   Value returned by pcre[16|32]_exec()
      -  stringname    Name of the required substring
      -  stringptr     Where to put the string pointer
      -
      -The memory in which the substring is placed is obtained by calling -pcre[16|32]_malloc(). The convenience function -pcre[16|32]_free_substring() can be used to free it when it is no longer -needed. The yield of the function is the length of the extracted substring, -PCRE_ERROR_NOMEMORY if sufficient memory could not be obtained, or -PCRE_ERROR_NOSUBSTRING if the string name is invalid. -

      -

      -There is a complete description of the PCRE native API in the -pcreapi -page and a description of the POSIX API in the -pcreposix -page. -

      -Return to the PCRE index page. -

      diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcre_get_stringnumber.html b/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcre_get_stringnumber.html deleted file mode 100644 index 7324d782..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcre_get_stringnumber.html +++ /dev/null @@ -1,57 +0,0 @@ - - -pcre_get_stringnumber specification - - -

      pcre_get_stringnumber man page

      -

      -Return to the PCRE index page. -

      -

      -This page is part of the PCRE HTML documentation. It was generated automatically -from the original man page. If there is any nonsense in it, please consult the -man page, in case the conversion went wrong. -
      -
      -SYNOPSIS -
      -

      -#include <pcre.h> -

      -

      -int pcre_get_stringnumber(const pcre *code, - const char *name); -
      -
      -int pcre16_get_stringnumber(const pcre16 *code, - PCRE_SPTR16 name); -
      -
      -int pcre32_get_stringnumber(const pcre32 *code, - PCRE_SPTR32 name); -

      -
      -DESCRIPTION -
      -

      -This convenience function finds the number of a named substring capturing -parenthesis in a compiled pattern. Its arguments are: -

      -  code    Compiled regular expression
      -  name    Name whose number is required
      -
      -The yield of the function is the number of the parenthesis if the name is -found, or PCRE_ERROR_NOSUBSTRING otherwise. When duplicate names are allowed -(PCRE_DUPNAMES is set), it is not defined which of the numbers is returned by -pcre[16|32]_get_stringnumber(). You can obtain the complete list by calling -pcre[16|32]_get_stringtable_entries(). -

      -

      -There is a complete description of the PCRE native API in the -pcreapi -page and a description of the POSIX API in the -pcreposix -page. -

      -Return to the PCRE index page. -

      diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcre_get_stringtable_entries.html b/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcre_get_stringtable_entries.html deleted file mode 100644 index 79906798..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcre_get_stringtable_entries.html +++ /dev/null @@ -1,60 +0,0 @@ - - -pcre_get_stringtable_entries specification - - -

      pcre_get_stringtable_entries man page

      -

      -Return to the PCRE index page. -

      -

      -This page is part of the PCRE HTML documentation. It was generated automatically -from the original man page. If there is any nonsense in it, please consult the -man page, in case the conversion went wrong. -
      -
      -SYNOPSIS -
      -

      -#include <pcre.h> -

      -

      -int pcre_get_stringtable_entries(const pcre *code, - const char *name, char **first, char **last); -
      -
      -int pcre16_get_stringtable_entries(const pcre16 *code, - PCRE_SPTR16 name, PCRE_UCHAR16 **first, PCRE_UCHAR16 **last); -
      -
      -int pcre32_get_stringtable_entries(const pcre32 *code, - PCRE_SPTR32 name, PCRE_UCHAR32 **first, PCRE_UCHAR32 **last); -

      -
      -DESCRIPTION -
      -

      -This convenience function finds, for a compiled pattern, the first and last -entries for a given name in the table that translates capturing parenthesis -names into numbers. When names are required to be unique (PCRE_DUPNAMES is -not set), it is usually easier to use pcre[16|32]_get_stringnumber() -instead. -

      -  code    Compiled regular expression
      -  name    Name whose entries required
      -  first   Where to return a pointer to the first entry
      -  last    Where to return a pointer to the last entry
      -
      -The yield of the function is the length of each entry, or -PCRE_ERROR_NOSUBSTRING if none are found. -

      -

      -There is a complete description of the PCRE native API, including the format of -the table entries, in the -pcreapi -page, and a description of the POSIX API in the -pcreposix -page. -

      -Return to the PCRE index page. -

      diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcre_get_substring.html b/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcre_get_substring.html deleted file mode 100644 index 1a8e4f5a..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcre_get_substring.html +++ /dev/null @@ -1,64 +0,0 @@ - - -pcre_get_substring specification - - -

      pcre_get_substring man page

      -

      -Return to the PCRE index page. -

      -

      -This page is part of the PCRE HTML documentation. It was generated automatically -from the original man page. If there is any nonsense in it, please consult the -man page, in case the conversion went wrong. -
      -
      -SYNOPSIS -
      -

      -#include <pcre.h> -

      -

      -int pcre_get_substring(const char *subject, int *ovector, - int stringcount, int stringnumber, - const char **stringptr); -
      -
      -int pcre16_get_substring(PCRE_SPTR16 subject, int *ovector, - int stringcount, int stringnumber, - PCRE_SPTR16 *stringptr); -
      -
      -int pcre32_get_substring(PCRE_SPTR32 subject, int *ovector, - int stringcount, int stringnumber, - PCRE_SPTR32 *stringptr); -

      -
      -DESCRIPTION -
      -

      -This is a convenience function for extracting a captured substring. The -arguments are: -

      -  subject       Subject that has been successfully matched
      -  ovector       Offset vector that pcre[16|32]_exec() used
      -  stringcount   Value returned by pcre[16|32]_exec()
      -  stringnumber  Number of the required substring
      -  stringptr     Where to put the string pointer
      -
      -The memory in which the substring is placed is obtained by calling -pcre[16|32]_malloc(). The convenience function -pcre[16|32]_free_substring() can be used to free it when it is no longer -needed. The yield of the function is the length of the substring, -PCRE_ERROR_NOMEMORY if sufficient memory could not be obtained, or -PCRE_ERROR_NOSUBSTRING if the string number is invalid. -

      -

      -There is a complete description of the PCRE native API in the -pcreapi -page and a description of the POSIX API in the -pcreposix -page. -

      -Return to the PCRE index page. -

      diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcre_get_substring_list.html b/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcre_get_substring_list.html deleted file mode 100644 index 7e8c6bc8..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcre_get_substring_list.html +++ /dev/null @@ -1,61 +0,0 @@ - - -pcre_get_substring_list specification - - -

      pcre_get_substring_list man page

      -

      -Return to the PCRE index page. -

      -

      -This page is part of the PCRE HTML documentation. It was generated automatically -from the original man page. If there is any nonsense in it, please consult the -man page, in case the conversion went wrong. -
      -
      -SYNOPSIS -
      -

      -#include <pcre.h> -

      -

      -int pcre_get_substring_list(const char *subject, - int *ovector, int stringcount, const char ***listptr); -
      -
      -int pcre16_get_substring_list(PCRE_SPTR16 subject, - int *ovector, int stringcount, PCRE_SPTR16 **listptr); -
      -
      -int pcre32_get_substring_list(PCRE_SPTR32 subject, - int *ovector, int stringcount, PCRE_SPTR32 **listptr); -

      -
      -DESCRIPTION -
      -

      -This is a convenience function for extracting a list of all the captured -substrings. The arguments are: -

      -  subject       Subject that has been successfully matched
      -  ovector       Offset vector that pcre[16|32]_exec used
      -  stringcount   Value returned by pcre[16|32]_exec
      -  listptr       Where to put a pointer to the list
      -
      -The memory in which the substrings and the list are placed is obtained by -calling pcre[16|32]_malloc(). The convenience function -pcre[16|32]_free_substring_list() can be used to free it when it is no -longer needed. A pointer to a list of pointers is put in the variable whose -address is in listptr. The list is terminated by a NULL pointer. The -yield of the function is zero on success or PCRE_ERROR_NOMEMORY if sufficient -memory could not be obtained. -

      -

      -There is a complete description of the PCRE native API in the -pcreapi -page and a description of the POSIX API in the -pcreposix -page. -

      -Return to the PCRE index page. -

      diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcre_jit_exec.html b/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcre_jit_exec.html deleted file mode 100644 index 4ebb0cbc..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcre_jit_exec.html +++ /dev/null @@ -1,108 +0,0 @@ - - -pcre_jit_exec specification - - -

      pcre_jit_exec man page

      -

      -Return to the PCRE index page. -

      -

      -This page is part of the PCRE HTML documentation. It was generated automatically -from the original man page. If there is any nonsense in it, please consult the -man page, in case the conversion went wrong. -
      -
      -SYNOPSIS -
      -

      -#include <pcre.h> -

      -

      -int pcre_jit_exec(const pcre *code, const pcre_extra *extra, - const char *subject, int length, int startoffset, - int options, int *ovector, int ovecsize, - pcre_jit_stack *jstack); -
      -
      -int pcre16_jit_exec(const pcre16 *code, const pcre16_extra *extra, - PCRE_SPTR16 subject, int length, int startoffset, - int options, int *ovector, int ovecsize, - pcre_jit_stack *jstack); -
      -
      -int pcre32_jit_exec(const pcre32 *code, const pcre32_extra *extra, - PCRE_SPTR32 subject, int length, int startoffset, - int options, int *ovector, int ovecsize, - pcre_jit_stack *jstack); -

      -
      -DESCRIPTION -
      -

      -This function matches a compiled regular expression that has been successfully -studied with one of the JIT options against a given subject string, using a -matching algorithm that is similar to Perl's. It is a "fast path" interface to -JIT, and it bypasses some of the sanity checks that pcre_exec() applies. -It returns offsets to captured substrings. Its arguments are: -

      -  code         Points to the compiled pattern
      -  extra        Points to an associated pcre[16|32]_extra structure,
      -                 or is NULL
      -  subject      Points to the subject string
      -  length       Length of the subject string, in bytes
      -  startoffset  Offset in bytes in the subject at which to
      -                 start matching
      -  options      Option bits
      -  ovector      Points to a vector of ints for result offsets
      -  ovecsize     Number of elements in the vector (a multiple of 3)
      -  jstack       Pointer to a JIT stack
      -
      -The allowed options are: -
      -  PCRE_NOTBOL            Subject string is not the beginning of a line
      -  PCRE_NOTEOL            Subject string is not the end of a line
      -  PCRE_NOTEMPTY          An empty string is not a valid match
      -  PCRE_NOTEMPTY_ATSTART  An empty string at the start of the subject
      -                           is not a valid match
      -  PCRE_NO_UTF16_CHECK    Do not check the subject for UTF-16
      -                           validity (only relevant if PCRE_UTF16
      -                           was set at compile time)
      -  PCRE_NO_UTF32_CHECK    Do not check the subject for UTF-32
      -                           validity (only relevant if PCRE_UTF32
      -                           was set at compile time)
      -  PCRE_NO_UTF8_CHECK     Do not check the subject for UTF-8
      -                           validity (only relevant if PCRE_UTF8
      -                           was set at compile time)
      -  PCRE_PARTIAL           ) Return PCRE_ERROR_PARTIAL for a partial
      -  PCRE_PARTIAL_SOFT      )   match if no full matches are found
      -  PCRE_PARTIAL_HARD      Return PCRE_ERROR_PARTIAL for a partial match
      -                           if that is found before a full match
      -
      -However, the PCRE_NO_UTF[8|16|32]_CHECK options have no effect, as this check -is never applied. For details of partial matching, see the -pcrepartial -page. A pcre_extra structure contains the following fields: -
      -  flags            Bits indicating which fields are set
      -  study_data       Opaque data from pcre[16|32]_study()
      -  match_limit      Limit on internal resource use
      -  match_limit_recursion  Limit on internal recursion depth
      -  callout_data     Opaque data passed back to callouts
      -  tables           Points to character tables or is NULL
      -  mark             For passing back a *MARK pointer
      -  executable_jit   Opaque data from JIT compilation
      -
      -The flag bits are PCRE_EXTRA_STUDY_DATA, PCRE_EXTRA_MATCH_LIMIT, -PCRE_EXTRA_MATCH_LIMIT_RECURSION, PCRE_EXTRA_CALLOUT_DATA, -PCRE_EXTRA_TABLES, PCRE_EXTRA_MARK and PCRE_EXTRA_EXECUTABLE_JIT. -

      -

      -There is a complete description of the PCRE native API in the -pcreapi -page and a description of the JIT API in the -pcrejit -page. -

      -Return to the PCRE index page. -

      diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcre_jit_stack_alloc.html b/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcre_jit_stack_alloc.html deleted file mode 100644 index 23ba4507..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcre_jit_stack_alloc.html +++ /dev/null @@ -1,55 +0,0 @@ - - -pcre_jit_stack_alloc specification - - -

      pcre_jit_stack_alloc man page

      -

      -Return to the PCRE index page. -

      -

      -This page is part of the PCRE HTML documentation. It was generated automatically -from the original man page. If there is any nonsense in it, please consult the -man page, in case the conversion went wrong. -
      -
      -SYNOPSIS -
      -

      -#include <pcre.h> -

      -

      -pcre_jit_stack *pcre_jit_stack_alloc(int startsize, - int maxsize); -
      -
      -pcre16_jit_stack *pcre16_jit_stack_alloc(int startsize, - int maxsize); -
      -
      -pcre32_jit_stack *pcre32_jit_stack_alloc(int startsize, - int maxsize); -

      -
      -DESCRIPTION -
      -

      -This function is used to create a stack for use by the code compiled by the JIT -optimization of pcre[16|32]_study(). The arguments are a starting size for -the stack, and a maximum size to which it is allowed to grow. The result can be -passed to the JIT run-time code by pcre[16|32]_assign_jit_stack(), or that -function can set up a callback for obtaining a stack. A maximum stack size of -512K to 1M should be more than enough for any pattern. For more details, see -the -pcrejit -page. -

      -

      -There is a complete description of the PCRE native API in the -pcreapi -page and a description of the POSIX API in the -pcreposix -page. -

      -Return to the PCRE index page. -

      diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcre_jit_stack_free.html b/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcre_jit_stack_free.html deleted file mode 100644 index 8bd06e46..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcre_jit_stack_free.html +++ /dev/null @@ -1,48 +0,0 @@ - - -pcre_jit_stack_free specification - - -

      pcre_jit_stack_free man page

      -

      -Return to the PCRE index page. -

      -

      -This page is part of the PCRE HTML documentation. It was generated automatically -from the original man page. If there is any nonsense in it, please consult the -man page, in case the conversion went wrong. -
      -
      -SYNOPSIS -
      -

      -#include <pcre.h> -

      -

      -void pcre_jit_stack_free(pcre_jit_stack *stack); -

      -

      -void pcre16_jit_stack_free(pcre16_jit_stack *stack); -

      -

      -void pcre32_jit_stack_free(pcre32_jit_stack *stack); -

      -
      -DESCRIPTION -
      -

      -This function is used to free a JIT stack that was created by -pcre[16|32]_jit_stack_alloc() when it is no longer needed. For more details, -see the -pcrejit -page. -

      -

      -There is a complete description of the PCRE native API in the -pcreapi -page and a description of the POSIX API in the -pcreposix -page. -

      -Return to the PCRE index page. -

      diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcre_maketables.html b/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcre_maketables.html deleted file mode 100644 index 3a7b5ebc..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcre_maketables.html +++ /dev/null @@ -1,48 +0,0 @@ - - -pcre_maketables specification - - -

      pcre_maketables man page

      -

      -Return to the PCRE index page. -

      -

      -This page is part of the PCRE HTML documentation. It was generated automatically -from the original man page. If there is any nonsense in it, please consult the -man page, in case the conversion went wrong. -
      -
      -SYNOPSIS -
      -

      -#include <pcre.h> -

      -

      -const unsigned char *pcre_maketables(void); -

      -

      -const unsigned char *pcre16_maketables(void); -

      -

      -const unsigned char *pcre32_maketables(void); -

      -
      -DESCRIPTION -
      -

      -This function builds a set of character tables for character values less than -256. These can be passed to pcre[16|32]_compile() to override PCRE's -internal, built-in tables (which were made by pcre[16|32]_maketables() when -PCRE was compiled). You might want to do this if you are using a non-standard -locale. The function yields a pointer to the tables. -

      -

      -There is a complete description of the PCRE native API in the -pcreapi -page and a description of the POSIX API in the -pcreposix -page. -

      -Return to the PCRE index page. -

      diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcre_pattern_to_host_byte_order.html b/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcre_pattern_to_host_byte_order.html deleted file mode 100644 index 1b1c8037..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcre_pattern_to_host_byte_order.html +++ /dev/null @@ -1,58 +0,0 @@ - - -pcre_pattern_to_host_byte_order specification - - -

      pcre_pattern_to_host_byte_order man page

      -

      -Return to the PCRE index page. -

      -

      -This page is part of the PCRE HTML documentation. It was generated automatically -from the original man page. If there is any nonsense in it, please consult the -man page, in case the conversion went wrong. -
      -
      -SYNOPSIS -
      -

      -#include <pcre.h> -

      -

      -int pcre_pattern_to_host_byte_order(pcre *code, - pcre_extra *extra, const unsigned char *tables); -
      -
      -int pcre16_pattern_to_host_byte_order(pcre16 *code, - pcre16_extra *extra, const unsigned char *tables); -
      -
      -int pcre32_pattern_to_host_byte_order(pcre32 *code, - pcre32_extra *extra, const unsigned char *tables); -

      -
      -DESCRIPTION -
      -

      -This function ensures that the bytes in 2-byte and 4-byte values in a compiled -pattern are in the correct order for the current host. It is useful when a -pattern that has been compiled on one host is transferred to another that might -have different endianness. The arguments are: -

      -  code         A compiled regular expression
      -  extra        Points to an associated pcre[16|32]_extra structure,
      -                 or is NULL
      -  tables       Pointer to character tables, or NULL to
      -                 set the built-in default
      -
      -The result is 0 for success, a negative PCRE_ERROR_xxx value otherwise. -

      -

      -There is a complete description of the PCRE native API in the -pcreapi -page and a description of the POSIX API in the -pcreposix -page. -

      -Return to the PCRE index page. -

      diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcre_refcount.html b/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcre_refcount.html deleted file mode 100644 index bfb92e6d..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcre_refcount.html +++ /dev/null @@ -1,51 +0,0 @@ - - -pcre_refcount specification - - -

      pcre_refcount man page

      -

      -Return to the PCRE index page. -

      -

      -This page is part of the PCRE HTML documentation. It was generated automatically -from the original man page. If there is any nonsense in it, please consult the -man page, in case the conversion went wrong. -
      -
      -SYNOPSIS -
      -

      -#include <pcre.h> -

      -

      -int pcre_refcount(pcre *code, int adjust); -

      -

      -int pcre16_refcount(pcre16 *code, int adjust); -

      -

      -int pcre32_refcount(pcre32 *code, int adjust); -

      -
      -DESCRIPTION -
      -

      -This function is used to maintain a reference count inside a data block that -contains a compiled pattern. Its arguments are: -

      -  code                      Compiled regular expression
      -  adjust                    Adjustment to reference value
      -
      -The yield of the function is the adjusted reference value, which is constrained -to lie between 0 and 65535. -

      -

      -There is a complete description of the PCRE native API in the -pcreapi -page and a description of the POSIX API in the -pcreposix -page. -

      -Return to the PCRE index page. -

      diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcre_study.html b/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcre_study.html deleted file mode 100644 index af82f114..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcre_study.html +++ /dev/null @@ -1,68 +0,0 @@ - - -pcre_study specification - - -

      pcre_study man page

      -

      -Return to the PCRE index page. -

      -

      -This page is part of the PCRE HTML documentation. It was generated automatically -from the original man page. If there is any nonsense in it, please consult the -man page, in case the conversion went wrong. -
      -
      -SYNOPSIS -
      -

      -#include <pcre.h> -

      -

      -pcre_extra *pcre_study(const pcre *code, int options, - const char **errptr); -
      -
      -pcre16_extra *pcre16_study(const pcre16 *code, int options, - const char **errptr); -
      -
      -pcre32_extra *pcre32_study(const pcre32 *code, int options, - const char **errptr); -

      -
      -DESCRIPTION -
      -

      -This function studies a compiled pattern, to see if additional information can -be extracted that might speed up matching. Its arguments are: -

      -  code       A compiled regular expression
      -  options    Options for pcre[16|32]_study()
      -  errptr     Where to put an error message
      -
      -If the function succeeds, it returns a value that can be passed to -pcre[16|32]_exec() or pcre[16|32]_dfa_exec() via their extra -arguments. -

      -

      -If the function returns NULL, either it could not find any additional -information, or there was an error. You can tell the difference by looking at -the error value. It is NULL in first case. -

      -

      -The only option is PCRE_STUDY_JIT_COMPILE. It requests just-in-time compilation -if possible. If PCRE has been compiled without JIT support, this option is -ignored. See the -pcrejit -page for further details. -

      -

      -There is a complete description of the PCRE native API in the -pcreapi -page and a description of the POSIX API in the -pcreposix -page. -

      -Return to the PCRE index page. -

      diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcre_utf16_to_host_byte_order.html b/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcre_utf16_to_host_byte_order.html deleted file mode 100644 index 18e7788f..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcre_utf16_to_host_byte_order.html +++ /dev/null @@ -1,57 +0,0 @@ - - -pcre_utf16_to_host_byte_order specification - - -

      pcre_utf16_to_host_byte_order man page

      -

      -Return to the PCRE index page. -

      -

      -This page is part of the PCRE HTML documentation. It was generated automatically -from the original man page. If there is any nonsense in it, please consult the -man page, in case the conversion went wrong. -
      -
      -SYNOPSIS -
      -

      -#include <pcre.h> -

      -

      -int pcre16_utf16_to_host_byte_order(PCRE_UCHAR16 *output, - PCRE_SPTR16 input, int length, int *host_byte_order, - int keep_boms); -

      -
      -DESCRIPTION -
      -

      -This function, which exists only in the 16-bit library, converts a UTF-16 -string to the correct order for the current host, taking account of any byte -order marks (BOMs) within the string. Its arguments are: -

      -  output           pointer to output buffer, may be the same as input
      -  input            pointer to input buffer
      -  length           number of 16-bit units in the input, or negative for
      -                     a zero-terminated string
      -  host_byte_order  a NULL value or a non-zero value pointed to means
      -                     start in host byte order
      -  keep_boms        if non-zero, BOMs are copied to the output string
      -
      -The result of the function is the number of 16-bit units placed into the output -buffer, including the zero terminator if the string was zero-terminated. -

      -

      -If host_byte_order is not NULL, it is set to indicate the byte order that -is current at the end of the string. -

      -

      -There is a complete description of the PCRE native API in the -pcreapi -page and a description of the POSIX API in the -pcreposix -page. -

      -Return to the PCRE index page. -

      diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcre_utf32_to_host_byte_order.html b/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcre_utf32_to_host_byte_order.html deleted file mode 100644 index 772ae40c..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcre_utf32_to_host_byte_order.html +++ /dev/null @@ -1,57 +0,0 @@ - - -pcre_utf32_to_host_byte_order specification - - -

      pcre_utf32_to_host_byte_order man page

      -

      -Return to the PCRE index page. -

      -

      -This page is part of the PCRE HTML documentation. It was generated automatically -from the original man page. If there is any nonsense in it, please consult the -man page, in case the conversion went wrong. -
      -
      -SYNOPSIS -
      -

      -#include <pcre.h> -

      -

      -int pcre32_utf32_to_host_byte_order(PCRE_UCHAR32 *output, - PCRE_SPTR32 input, int length, int *host_byte_order, - int keep_boms); -

      -
      -DESCRIPTION -
      -

      -This function, which exists only in the 32-bit library, converts a UTF-32 -string to the correct order for the current host, taking account of any byte -order marks (BOMs) within the string. Its arguments are: -

      -  output           pointer to output buffer, may be the same as input
      -  input            pointer to input buffer
      -  length           number of 32-bit units in the input, or negative for
      -                     a zero-terminated string
      -  host_byte_order  a NULL value or a non-zero value pointed to means
      -                     start in host byte order
      -  keep_boms        if non-zero, BOMs are copied to the output string
      -
      -The result of the function is the number of 32-bit units placed into the output -buffer, including the zero terminator if the string was zero-terminated. -

      -

      -If host_byte_order is not NULL, it is set to indicate the byte order that -is current at the end of the string. -

      -

      -There is a complete description of the PCRE native API in the -pcreapi -page and a description of the POSIX API in the -pcreposix -page. -

      -Return to the PCRE index page. -

      diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcre_version.html b/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcre_version.html deleted file mode 100644 index d33e7189..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcre_version.html +++ /dev/null @@ -1,46 +0,0 @@ - - -pcre_version specification - - -

      pcre_version man page

      -

      -Return to the PCRE index page. -

      -

      -This page is part of the PCRE HTML documentation. It was generated automatically -from the original man page. If there is any nonsense in it, please consult the -man page, in case the conversion went wrong. -
      -
      -SYNOPSIS -
      -

      -#include <pcre.h> -

      -

      -const char *pcre_version(void); -

      -

      -const char *pcre16_version(void); -

      -

      -const char *pcre32_version(void); -

      -
      -DESCRIPTION -
      -

      -This function (even in the 16-bit and 32-bit libraries) returns a -zero-terminated, 8-bit character string that gives the version number of the -PCRE library and the date of its release. -

      -

      -There is a complete description of the PCRE native API in the -pcreapi -page and a description of the POSIX API in the -pcreposix -page. -

      -Return to the PCRE index page. -

      diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcreapi.html b/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcreapi.html deleted file mode 100644 index 2d7adf18..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcreapi.html +++ /dev/null @@ -1,2921 +0,0 @@ - - -pcreapi specification - - -

      pcreapi man page

      -

      -Return to the PCRE index page. -

      -

      -This page is part of the PCRE HTML documentation. It was generated automatically -from the original man page. If there is any nonsense in it, please consult the -man page, in case the conversion went wrong. -
      -

      -

      -#include <pcre.h> -

      -
      PCRE NATIVE API BASIC FUNCTIONS
      -

      -pcre *pcre_compile(const char *pattern, int options, - const char **errptr, int *erroffset, - const unsigned char *tableptr); -
      -
      -pcre *pcre_compile2(const char *pattern, int options, - int *errorcodeptr, - const char **errptr, int *erroffset, - const unsigned char *tableptr); -
      -
      -pcre_extra *pcre_study(const pcre *code, int options, - const char **errptr); -
      -
      -void pcre_free_study(pcre_extra *extra); -
      -
      -int pcre_exec(const pcre *code, const pcre_extra *extra, - const char *subject, int length, int startoffset, - int options, int *ovector, int ovecsize); -
      -
      -int pcre_dfa_exec(const pcre *code, const pcre_extra *extra, - const char *subject, int length, int startoffset, - int options, int *ovector, int ovecsize, - int *workspace, int wscount); -

      -
      PCRE NATIVE API STRING EXTRACTION FUNCTIONS
      -

      -int pcre_copy_named_substring(const pcre *code, - const char *subject, int *ovector, - int stringcount, const char *stringname, - char *buffer, int buffersize); -
      -
      -int pcre_copy_substring(const char *subject, int *ovector, - int stringcount, int stringnumber, char *buffer, - int buffersize); -
      -
      -int pcre_get_named_substring(const pcre *code, - const char *subject, int *ovector, - int stringcount, const char *stringname, - const char **stringptr); -
      -
      -int pcre_get_stringnumber(const pcre *code, - const char *name); -
      -
      -int pcre_get_stringtable_entries(const pcre *code, - const char *name, char **first, char **last); -
      -
      -int pcre_get_substring(const char *subject, int *ovector, - int stringcount, int stringnumber, - const char **stringptr); -
      -
      -int pcre_get_substring_list(const char *subject, - int *ovector, int stringcount, const char ***listptr); -
      -
      -void pcre_free_substring(const char *stringptr); -
      -
      -void pcre_free_substring_list(const char **stringptr); -

      -
      PCRE NATIVE API AUXILIARY FUNCTIONS
      -

      -int pcre_jit_exec(const pcre *code, const pcre_extra *extra, - const char *subject, int length, int startoffset, - int options, int *ovector, int ovecsize, - pcre_jit_stack *jstack); -
      -
      -pcre_jit_stack *pcre_jit_stack_alloc(int startsize, int maxsize); -
      -
      -void pcre_jit_stack_free(pcre_jit_stack *stack); -
      -
      -void pcre_assign_jit_stack(pcre_extra *extra, - pcre_jit_callback callback, void *data); -
      -
      -const unsigned char *pcre_maketables(void); -
      -
      -int pcre_fullinfo(const pcre *code, const pcre_extra *extra, - int what, void *where); -
      -
      -int pcre_refcount(pcre *code, int adjust); -
      -
      -int pcre_config(int what, void *where); -
      -
      -const char *pcre_version(void); -
      -
      -int pcre_pattern_to_host_byte_order(pcre *code, - pcre_extra *extra, const unsigned char *tables); -

      -
      PCRE NATIVE API INDIRECTED FUNCTIONS
      -

      -void *(*pcre_malloc)(size_t); -
      -
      -void (*pcre_free)(void *); -
      -
      -void *(*pcre_stack_malloc)(size_t); -
      -
      -void (*pcre_stack_free)(void *); -
      -
      -int (*pcre_callout)(pcre_callout_block *); -
      -
      -int (*pcre_stack_guard)(void); -

      -
      PCRE 8-BIT, 16-BIT, AND 32-BIT LIBRARIES
      -

      -As well as support for 8-bit character strings, PCRE also supports 16-bit -strings (from release 8.30) and 32-bit strings (from release 8.32), by means of -two additional libraries. They can be built as well as, or instead of, the -8-bit library. To avoid too much complication, this document describes the -8-bit versions of the functions, with only occasional references to the 16-bit -and 32-bit libraries. -

      -

      -The 16-bit and 32-bit functions operate in the same way as their 8-bit -counterparts; they just use different data types for their arguments and -results, and their names start with pcre16_ or pcre32_ instead of -pcre_. For every option that has UTF8 in its name (for example, -PCRE_UTF8), there are corresponding 16-bit and 32-bit names with UTF8 replaced -by UTF16 or UTF32, respectively. This facility is in fact just cosmetic; the -16-bit and 32-bit option names define the same bit values. -

      -

      -References to bytes and UTF-8 in this document should be read as references to -16-bit data units and UTF-16 when using the 16-bit library, or 32-bit data -units and UTF-32 when using the 32-bit library, unless specified otherwise. -More details of the specific differences for the 16-bit and 32-bit libraries -are given in the -pcre16 -and -pcre32 -pages. -

      -
      PCRE API OVERVIEW
      -

      -PCRE has its own native API, which is described in this document. There are -also some wrapper functions (for the 8-bit library only) that correspond to the -POSIX regular expression API, but they do not give access to all the -functionality. They are described in the -pcreposix -documentation. Both of these APIs define a set of C function calls. A C++ -wrapper (again for the 8-bit library only) is also distributed with PCRE. It is -documented in the -pcrecpp -page. -

      -

      -The native API C function prototypes are defined in the header file -pcre.h, and on Unix-like systems the (8-bit) library itself is called -libpcre. It can normally be accessed by adding -lpcre to the -command for linking an application that uses PCRE. The header file defines the -macros PCRE_MAJOR and PCRE_MINOR to contain the major and minor release numbers -for the library. Applications can use these to include support for different -releases of PCRE. -

      -

      -In a Windows environment, if you want to statically link an application program -against a non-dll pcre.a file, you must define PCRE_STATIC before -including pcre.h or pcrecpp.h, because otherwise the -pcre_malloc() and pcre_free() exported functions will be declared -__declspec(dllimport), with unwanted results. -

      -

      -The functions pcre_compile(), pcre_compile2(), pcre_study(), -and pcre_exec() are used for compiling and matching regular expressions -in a Perl-compatible manner. A sample program that demonstrates the simplest -way of using them is provided in the file called pcredemo.c in the PCRE -source distribution. A listing of this program is given in the -pcredemo -documentation, and the -pcresample -documentation describes how to compile and run it. -

      -

      -Just-in-time compiler support is an optional feature of PCRE that can be built -in appropriate hardware environments. It greatly speeds up the matching -performance of many patterns. Simple programs can easily request that it be -used if available, by setting an option that is ignored when it is not -relevant. More complicated programs might need to make use of the functions -pcre_jit_stack_alloc(), pcre_jit_stack_free(), and -pcre_assign_jit_stack() in order to control the JIT code's memory usage. -

      -

      -From release 8.32 there is also a direct interface for JIT execution, which -gives improved performance. The JIT-specific functions are discussed in the -pcrejit -documentation. -

      -

      -A second matching function, pcre_dfa_exec(), which is not -Perl-compatible, is also provided. This uses a different algorithm for the -matching. The alternative algorithm finds all possible matches (at a given -point in the subject), and scans the subject just once (unless there are -lookbehind assertions). However, this algorithm does not return captured -substrings. A description of the two matching algorithms and their advantages -and disadvantages is given in the -pcrematching -documentation. -

      -

      -In addition to the main compiling and matching functions, there are convenience -functions for extracting captured substrings from a subject string that is -matched by pcre_exec(). They are: -

      -  pcre_copy_substring()
      -  pcre_copy_named_substring()
      -  pcre_get_substring()
      -  pcre_get_named_substring()
      -  pcre_get_substring_list()
      -  pcre_get_stringnumber()
      -  pcre_get_stringtable_entries()
      -
      -pcre_free_substring() and pcre_free_substring_list() are also -provided, to free the memory used for extracted strings. -

      -

      -The function pcre_maketables() is used to build a set of character tables -in the current locale for passing to pcre_compile(), pcre_exec(), -or pcre_dfa_exec(). This is an optional facility that is provided for -specialist use. Most commonly, no special tables are passed, in which case -internal tables that are generated when PCRE is built are used. -

      -

      -The function pcre_fullinfo() is used to find out information about a -compiled pattern. The function pcre_version() returns a pointer to a -string containing the version of PCRE and its date of release. -

      -

      -The function pcre_refcount() maintains a reference count in a data block -containing a compiled pattern. This is provided for the benefit of -object-oriented applications. -

      -

      -The global variables pcre_malloc and pcre_free initially contain -the entry points of the standard malloc() and free() functions, -respectively. PCRE calls the memory management functions via these variables, -so a calling program can replace them if it wishes to intercept the calls. This -should be done before calling any PCRE functions. -

      -

      -The global variables pcre_stack_malloc and pcre_stack_free are also -indirections to memory management functions. These special functions are used -only when PCRE is compiled to use the heap for remembering data, instead of -recursive function calls, when running the pcre_exec() function. See the -pcrebuild -documentation for details of how to do this. It is a non-standard way of -building PCRE, for use in environments that have limited stacks. Because of the -greater use of memory management, it runs more slowly. Separate functions are -provided so that special-purpose external code can be used for this case. When -used, these functions always allocate memory blocks of the same size. There is -a discussion about PCRE's stack usage in the -pcrestack -documentation. -

      -

      -The global variable pcre_callout initially contains NULL. It can be set -by the caller to a "callout" function, which PCRE will then call at specified -points during a matching operation. Details are given in the -pcrecallout -documentation. -

      -

      -The global variable pcre_stack_guard initially contains NULL. It can be -set by the caller to a function that is called by PCRE whenever it starts -to compile a parenthesized part of a pattern. When parentheses are nested, PCRE -uses recursive function calls, which use up the system stack. This function is -provided so that applications with restricted stacks can force a compilation -error if the stack runs out. The function should return zero if all is well, or -non-zero to force an error. -

      -
      NEWLINES
      -

      -PCRE supports five different conventions for indicating line breaks in -strings: a single CR (carriage return) character, a single LF (linefeed) -character, the two-character sequence CRLF, any of the three preceding, or any -Unicode newline sequence. The Unicode newline sequences are the three just -mentioned, plus the single characters VT (vertical tab, U+000B), FF (form feed, -U+000C), NEL (next line, U+0085), LS (line separator, U+2028), and PS -(paragraph separator, U+2029). -

      -

      -Each of the first three conventions is used by at least one operating system as -its standard newline sequence. When PCRE is built, a default can be specified. -The default default is LF, which is the Unix standard. When PCRE is run, the -default can be overridden, either when a pattern is compiled, or when it is -matched. -

      -

      -At compile time, the newline convention can be specified by the options -argument of pcre_compile(), or it can be specified by special text at the -start of the pattern itself; this overrides any other settings. See the -pcrepattern -page for details of the special character sequences. -

      -

      -In the PCRE documentation the word "newline" is used to mean "the character or -pair of characters that indicate a line break". The choice of newline -convention affects the handling of the dot, circumflex, and dollar -metacharacters, the handling of #-comments in /x mode, and, when CRLF is a -recognized line ending sequence, the match position advancement for a -non-anchored pattern. There is more detail about this in the -section on pcre_exec() options -below. -

      -

      -The choice of newline convention does not affect the interpretation of -the \n or \r escape sequences, nor does it affect what \R matches, which is -controlled in a similar way, but by separate options. -

      -
      MULTITHREADING
      -

      -The PCRE functions can be used in multi-threading applications, with the -proviso that the memory management functions pointed to by pcre_malloc, -pcre_free, pcre_stack_malloc, and pcre_stack_free, and the -callout and stack-checking functions pointed to by pcre_callout and -pcre_stack_guard, are shared by all threads. -

      -

      -The compiled form of a regular expression is not altered during matching, so -the same compiled pattern can safely be used by several threads at once. -

      -

      -If the just-in-time optimization feature is being used, it needs separate -memory stack areas for each thread. See the -pcrejit -documentation for more details. -

      -
      SAVING PRECOMPILED PATTERNS FOR LATER USE
      -

      -The compiled form of a regular expression can be saved and re-used at a later -time, possibly by a different program, and even on a host other than the one on -which it was compiled. Details are given in the -pcreprecompile -documentation, which includes a description of the -pcre_pattern_to_host_byte_order() function. However, compiling a regular -expression with one version of PCRE for use with a different version is not -guaranteed to work and may cause crashes. -

      -
      CHECKING BUILD-TIME OPTIONS
      -

      -int pcre_config(int what, void *where); -

      -

      -The function pcre_config() makes it possible for a PCRE client to -discover which optional features have been compiled into the PCRE library. The -pcrebuild -documentation has more details about these optional features. -

      -

      -The first argument for pcre_config() is an integer, specifying which -information is required; the second argument is a pointer to a variable into -which the information is placed. The returned value is zero on success, or the -negative error code PCRE_ERROR_BADOPTION if the value in the first argument is -not recognized. The following information is available: -

      -  PCRE_CONFIG_UTF8
      -
      -The output is an integer that is set to one if UTF-8 support is available; -otherwise it is set to zero. This value should normally be given to the 8-bit -version of this function, pcre_config(). If it is given to the 16-bit -or 32-bit version of this function, the result is PCRE_ERROR_BADOPTION. -
      -  PCRE_CONFIG_UTF16
      -
      -The output is an integer that is set to one if UTF-16 support is available; -otherwise it is set to zero. This value should normally be given to the 16-bit -version of this function, pcre16_config(). If it is given to the 8-bit -or 32-bit version of this function, the result is PCRE_ERROR_BADOPTION. -
      -  PCRE_CONFIG_UTF32
      -
      -The output is an integer that is set to one if UTF-32 support is available; -otherwise it is set to zero. This value should normally be given to the 32-bit -version of this function, pcre32_config(). If it is given to the 8-bit -or 16-bit version of this function, the result is PCRE_ERROR_BADOPTION. -
      -  PCRE_CONFIG_UNICODE_PROPERTIES
      -
      -The output is an integer that is set to one if support for Unicode character -properties is available; otherwise it is set to zero. -
      -  PCRE_CONFIG_JIT
      -
      -The output is an integer that is set to one if support for just-in-time -compiling is available; otherwise it is set to zero. -
      -  PCRE_CONFIG_JITTARGET
      -
      -The output is a pointer to a zero-terminated "const char *" string. If JIT -support is available, the string contains the name of the architecture for -which the JIT compiler is configured, for example "x86 32bit (little endian + -unaligned)". If JIT support is not available, the result is NULL. -
      -  PCRE_CONFIG_NEWLINE
      -
      -The output is an integer whose value specifies the default character sequence -that is recognized as meaning "newline". The values that are supported in -ASCII/Unicode environments are: 10 for LF, 13 for CR, 3338 for CRLF, -2 for -ANYCRLF, and -1 for ANY. In EBCDIC environments, CR, ANYCRLF, and ANY yield the -same values. However, the value for LF is normally 21, though some EBCDIC -environments use 37. The corresponding values for CRLF are 3349 and 3365. The -default should normally correspond to the standard sequence for your operating -system. -
      -  PCRE_CONFIG_BSR
      -
      -The output is an integer whose value indicates what character sequences the \R -escape sequence matches by default. A value of 0 means that \R matches any -Unicode line ending sequence; a value of 1 means that \R matches only CR, LF, -or CRLF. The default can be overridden when a pattern is compiled or matched. -
      -  PCRE_CONFIG_LINK_SIZE
      -
      -The output is an integer that contains the number of bytes used for internal -linkage in compiled regular expressions. For the 8-bit library, the value can -be 2, 3, or 4. For the 16-bit library, the value is either 2 or 4 and is still -a number of bytes. For the 32-bit library, the value is either 2 or 4 and is -still a number of bytes. The default value of 2 is sufficient for all but the -most massive patterns, since it allows the compiled pattern to be up to 64K in -size. Larger values allow larger regular expressions to be compiled, at the -expense of slower matching. -
      -  PCRE_CONFIG_POSIX_MALLOC_THRESHOLD
      -
      -The output is an integer that contains the threshold above which the POSIX -interface uses malloc() for output vectors. Further details are given in -the -pcreposix -documentation. -
      -  PCRE_CONFIG_PARENS_LIMIT
      -
      -The output is a long integer that gives the maximum depth of nesting of -parentheses (of any kind) in a pattern. This limit is imposed to cap the amount -of system stack used when a pattern is compiled. It is specified when PCRE is -built; the default is 250. This limit does not take into account the stack that -may already be used by the calling application. For finer control over -compilation stack usage, you can set a pointer to an external checking function -in pcre_stack_guard. -
      -  PCRE_CONFIG_MATCH_LIMIT
      -
      -The output is a long integer that gives the default limit for the number of -internal matching function calls in a pcre_exec() execution. Further -details are given with pcre_exec() below. -
      -  PCRE_CONFIG_MATCH_LIMIT_RECURSION
      -
      -The output is a long integer that gives the default limit for the depth of -recursion when calling the internal matching function in a pcre_exec() -execution. Further details are given with pcre_exec() below. -
      -  PCRE_CONFIG_STACKRECURSE
      -
      -The output is an integer that is set to one if internal recursion when running -pcre_exec() is implemented by recursive function calls that use the stack -to remember their state. This is the usual way that PCRE is compiled. The -output is zero if PCRE was compiled to use blocks of data on the heap instead -of recursive function calls. In this case, pcre_stack_malloc and -pcre_stack_free are called to manage memory blocks on the heap, thus -avoiding the use of the stack. -

      -
      COMPILING A PATTERN
      -

      -pcre *pcre_compile(const char *pattern, int options, - const char **errptr, int *erroffset, - const unsigned char *tableptr); -
      -
      -pcre *pcre_compile2(const char *pattern, int options, - int *errorcodeptr, - const char **errptr, int *erroffset, - const unsigned char *tableptr); -

      -

      -Either of the functions pcre_compile() or pcre_compile2() can be -called to compile a pattern into an internal form. The only difference between -the two interfaces is that pcre_compile2() has an additional argument, -errorcodeptr, via which a numerical error code can be returned. To avoid -too much repetition, we refer just to pcre_compile() below, but the -information applies equally to pcre_compile2(). -

      -

      -The pattern is a C string terminated by a binary zero, and is passed in the -pattern argument. A pointer to a single block of memory that is obtained -via pcre_malloc is returned. This contains the compiled code and related -data. The pcre type is defined for the returned block; this is a typedef -for a structure whose contents are not externally defined. It is up to the -caller to free the memory (via pcre_free) when it is no longer required. -

      -

      -Although the compiled code of a PCRE regex is relocatable, that is, it does not -depend on memory location, the complete pcre data block is not -fully relocatable, because it may contain a copy of the tableptr -argument, which is an address (see below). -

      -

      -The options argument contains various bit settings that affect the -compilation. It should be zero if no options are required. The available -options are described below. Some of them (in particular, those that are -compatible with Perl, but some others as well) can also be set and unset from -within the pattern (see the detailed description in the -pcrepattern -documentation). For those options that can be different in different parts of -the pattern, the contents of the options argument specifies their -settings at the start of compilation and execution. The PCRE_ANCHORED, -PCRE_BSR_xxx, PCRE_NEWLINE_xxx, PCRE_NO_UTF8_CHECK, and -PCRE_NO_START_OPTIMIZE options can be set at the time of matching as well as at -compile time. -

      -

      -If errptr is NULL, pcre_compile() returns NULL immediately. -Otherwise, if compilation of a pattern fails, pcre_compile() returns -NULL, and sets the variable pointed to by errptr to point to a textual -error message. This is a static string that is part of the library. You must -not try to free it. Normally, the offset from the start of the pattern to the -data unit that was being processed when the error was discovered is placed in -the variable pointed to by erroffset, which must not be NULL (if it is, -an immediate error is given). However, for an invalid UTF-8 or UTF-16 string, -the offset is that of the first data unit of the failing character. -

      -

      -Some errors are not detected until the whole pattern has been scanned; in these -cases, the offset passed back is the length of the pattern. Note that the -offset is in data units, not characters, even in a UTF mode. It may sometimes -point into the middle of a UTF-8 or UTF-16 character. -

      -

      -If pcre_compile2() is used instead of pcre_compile(), and the -errorcodeptr argument is not NULL, a non-zero error code number is -returned via this argument in the event of an error. This is in addition to the -textual error message. Error codes and messages are listed below. -

      -

      -If the final argument, tableptr, is NULL, PCRE uses a default set of -character tables that are built when PCRE is compiled, using the default C -locale. Otherwise, tableptr must be an address that is the result of a -call to pcre_maketables(). This value is stored with the compiled -pattern, and used again by pcre_exec() and pcre_dfa_exec() when the -pattern is matched. For more discussion, see the section on locale support -below. -

      -

      -This code fragment shows a typical straightforward call to pcre_compile(): -

      -  pcre *re;
      -  const char *error;
      -  int erroffset;
      -  re = pcre_compile(
      -    "^A.*Z",          /* the pattern */
      -    0,                /* default options */
      -    &error,           /* for error message */
      -    &erroffset,       /* for error offset */
      -    NULL);            /* use default character tables */
      -
      -The following names for option bits are defined in the pcre.h header -file: -
      -  PCRE_ANCHORED
      -
      -If this bit is set, the pattern is forced to be "anchored", that is, it is -constrained to match only at the first matching point in the string that is -being searched (the "subject string"). This effect can also be achieved by -appropriate constructs in the pattern itself, which is the only way to do it in -Perl. -
      -  PCRE_AUTO_CALLOUT
      -
      -If this bit is set, pcre_compile() automatically inserts callout items, -all with number 255, before each pattern item. For discussion of the callout -facility, see the -pcrecallout -documentation. -
      -  PCRE_BSR_ANYCRLF
      -  PCRE_BSR_UNICODE
      -
      -These options (which are mutually exclusive) control what the \R escape -sequence matches. The choice is either to match only CR, LF, or CRLF, or to -match any Unicode newline sequence. The default is specified when PCRE is -built. It can be overridden from within the pattern, or by setting an option -when a compiled pattern is matched. -
      -  PCRE_CASELESS
      -
      -If this bit is set, letters in the pattern match both upper and lower case -letters. It is equivalent to Perl's /i option, and it can be changed within a -pattern by a (?i) option setting. In UTF-8 mode, PCRE always understands the -concept of case for characters whose values are less than 128, so caseless -matching is always possible. For characters with higher values, the concept of -case is supported if PCRE is compiled with Unicode property support, but not -otherwise. If you want to use caseless matching for characters 128 and above, -you must ensure that PCRE is compiled with Unicode property support as well as -with UTF-8 support. -
      -  PCRE_DOLLAR_ENDONLY
      -
      -If this bit is set, a dollar metacharacter in the pattern matches only at the -end of the subject string. Without this option, a dollar also matches -immediately before a newline at the end of the string (but not before any other -newlines). The PCRE_DOLLAR_ENDONLY option is ignored if PCRE_MULTILINE is set. -There is no equivalent to this option in Perl, and no way to set it within a -pattern. -
      -  PCRE_DOTALL
      -
      -If this bit is set, a dot metacharacter in the pattern matches a character of -any value, including one that indicates a newline. However, it only ever -matches one character, even if newlines are coded as CRLF. Without this option, -a dot does not match when the current position is at a newline. This option is -equivalent to Perl's /s option, and it can be changed within a pattern by a -(?s) option setting. A negative class such as [^a] always matches newline -characters, independent of the setting of this option. -
      -  PCRE_DUPNAMES
      -
      -If this bit is set, names used to identify capturing subpatterns need not be -unique. This can be helpful for certain types of pattern when it is known that -only one instance of the named subpattern can ever be matched. There are more -details of named subpatterns below; see also the -pcrepattern -documentation. -
      -  PCRE_EXTENDED
      -
      -If this bit is set, most white space characters in the pattern are totally -ignored except when escaped or inside a character class. However, white space -is not allowed within sequences such as (?> that introduce various -parenthesized subpatterns, nor within a numerical quantifier such as {1,3}. -However, ignorable white space is permitted between an item and a following -quantifier and between a quantifier and a following + that indicates -possessiveness. -

      -

      -White space did not used to include the VT character (code 11), because Perl -did not treat this character as white space. However, Perl changed at release -5.18, so PCRE followed at release 8.34, and VT is now treated as white space. -

      -

      -PCRE_EXTENDED also causes characters between an unescaped # outside a character -class and the next newline, inclusive, to be ignored. PCRE_EXTENDED is -equivalent to Perl's /x option, and it can be changed within a pattern by a -(?x) option setting. -

      -

      -Which characters are interpreted as newlines is controlled by the options -passed to pcre_compile() or by a special sequence at the start of the -pattern, as described in the section entitled -"Newline conventions" -in the pcrepattern documentation. Note that the end of this type of -comment is a literal newline sequence in the pattern; escape sequences that -happen to represent a newline do not count. -

      -

      -This option makes it possible to include comments inside complicated patterns. -Note, however, that this applies only to data characters. White space characters -may never appear within special character sequences in a pattern, for example -within the sequence (?( that introduces a conditional subpattern. -

      -  PCRE_EXTRA
      -
      -This option was invented in order to turn on additional functionality of PCRE -that is incompatible with Perl, but it is currently of very little use. When -set, any backslash in a pattern that is followed by a letter that has no -special meaning causes an error, thus reserving these combinations for future -expansion. By default, as in Perl, a backslash followed by a letter with no -special meaning is treated as a literal. (Perl can, however, be persuaded to -give an error for this, by running it with the -w option.) There are at present -no other features controlled by this option. It can also be set by a (?X) -option setting within a pattern. -
      -  PCRE_FIRSTLINE
      -
      -If this option is set, an unanchored pattern is required to match before or at -the first newline in the subject string, though the matched text may continue -over the newline. -
      -  PCRE_JAVASCRIPT_COMPAT
      -
      -If this option is set, PCRE's behaviour is changed in some ways so that it is -compatible with JavaScript rather than Perl. The changes are as follows: -

      -

      -(1) A lone closing square bracket in a pattern causes a compile-time error, -because this is illegal in JavaScript (by default it is treated as a data -character). Thus, the pattern AB]CD becomes illegal when this option is set. -

      -

      -(2) At run time, a back reference to an unset subpattern group matches an empty -string (by default this causes the current matching alternative to fail). A -pattern such as (\1)(a) succeeds when this option is set (assuming it can find -an "a" in the subject), whereas it fails by default, for Perl compatibility. -

      -

      -(3) \U matches an upper case "U" character; by default \U causes a compile -time error (Perl uses \U to upper case subsequent characters). -

      -

      -(4) \u matches a lower case "u" character unless it is followed by four -hexadecimal digits, in which case the hexadecimal number defines the code point -to match. By default, \u causes a compile time error (Perl uses it to upper -case the following character). -

      -

      -(5) \x matches a lower case "x" character unless it is followed by two -hexadecimal digits, in which case the hexadecimal number defines the code point -to match. By default, as in Perl, a hexadecimal number is always expected after -\x, but it may have zero, one, or two digits (so, for example, \xz matches a -binary zero character followed by z). -

      -  PCRE_MULTILINE
      -
      -By default, for the purposes of matching "start of line" and "end of line", -PCRE treats the subject string as consisting of a single line of characters, -even if it actually contains newlines. The "start of line" metacharacter (^) -matches only at the start of the string, and the "end of line" metacharacter -($) matches only at the end of the string, or before a terminating newline -(except when PCRE_DOLLAR_ENDONLY is set). Note, however, that unless -PCRE_DOTALL is set, the "any character" metacharacter (.) does not match at a -newline. This behaviour (for ^, $, and dot) is the same as Perl. -

      -

      -When PCRE_MULTILINE it is set, the "start of line" and "end of line" constructs -match immediately following or immediately before internal newlines in the -subject string, respectively, as well as at the very start and end. This is -equivalent to Perl's /m option, and it can be changed within a pattern by a -(?m) option setting. If there are no newlines in a subject string, or no -occurrences of ^ or $ in a pattern, setting PCRE_MULTILINE has no effect. -

      -  PCRE_NEVER_UTF
      -
      -This option locks out interpretation of the pattern as UTF-8 (or UTF-16 or -UTF-32 in the 16-bit and 32-bit libraries). In particular, it prevents the -creator of the pattern from switching to UTF interpretation by starting the -pattern with (*UTF). This may be useful in applications that process patterns -from external sources. The combination of PCRE_UTF8 and PCRE_NEVER_UTF also -causes an error. -
      -  PCRE_NEWLINE_CR
      -  PCRE_NEWLINE_LF
      -  PCRE_NEWLINE_CRLF
      -  PCRE_NEWLINE_ANYCRLF
      -  PCRE_NEWLINE_ANY
      -
      -These options override the default newline definition that was chosen when PCRE -was built. Setting the first or the second specifies that a newline is -indicated by a single character (CR or LF, respectively). Setting -PCRE_NEWLINE_CRLF specifies that a newline is indicated by the two-character -CRLF sequence. Setting PCRE_NEWLINE_ANYCRLF specifies that any of the three -preceding sequences should be recognized. Setting PCRE_NEWLINE_ANY specifies -that any Unicode newline sequence should be recognized. -

      -

      -In an ASCII/Unicode environment, the Unicode newline sequences are the three -just mentioned, plus the single characters VT (vertical tab, U+000B), FF (form -feed, U+000C), NEL (next line, U+0085), LS (line separator, U+2028), and PS -(paragraph separator, U+2029). For the 8-bit library, the last two are -recognized only in UTF-8 mode. -

      -

      -When PCRE is compiled to run in an EBCDIC (mainframe) environment, the code for -CR is 0x0d, the same as ASCII. However, the character code for LF is normally -0x15, though in some EBCDIC environments 0x25 is used. Whichever of these is -not LF is made to correspond to Unicode's NEL character. EBCDIC codes are all -less than 256. For more details, see the -pcrebuild -documentation. -

      -

      -The newline setting in the options word uses three bits that are treated -as a number, giving eight possibilities. Currently only six are used (default -plus the five values above). This means that if you set more than one newline -option, the combination may or may not be sensible. For example, -PCRE_NEWLINE_CR with PCRE_NEWLINE_LF is equivalent to PCRE_NEWLINE_CRLF, but -other combinations may yield unused numbers and cause an error. -

      -

      -The only time that a line break in a pattern is specially recognized when -compiling is when PCRE_EXTENDED is set. CR and LF are white space characters, -and so are ignored in this mode. Also, an unescaped # outside a character class -indicates a comment that lasts until after the next line break sequence. In -other circumstances, line break sequences in patterns are treated as literal -data. -

      -

      -The newline option that is set at compile time becomes the default that is used -for pcre_exec() and pcre_dfa_exec(), but it can be overridden. -

      -  PCRE_NO_AUTO_CAPTURE
      -
      -If this option is set, it disables the use of numbered capturing parentheses in -the pattern. Any opening parenthesis that is not followed by ? behaves as if it -were followed by ?: but named parentheses can still be used for capturing (and -they acquire numbers in the usual way). There is no equivalent of this option -in Perl. -
      -  PCRE_NO_AUTO_POSSESS
      -
      -If this option is set, it disables "auto-possessification". This is an -optimization that, for example, turns a+b into a++b in order to avoid -backtracks into a+ that can never be successful. However, if callouts are in -use, auto-possessification means that some of them are never taken. You can set -this option if you want the matching functions to do a full unoptimized search -and run all the callouts, but it is mainly provided for testing purposes. -
      -  PCRE_NO_START_OPTIMIZE
      -
      -This is an option that acts at matching time; that is, it is really an option -for pcre_exec() or pcre_dfa_exec(). If it is set at compile time, -it is remembered with the compiled pattern and assumed at matching time. This -is necessary if you want to use JIT execution, because the JIT compiler needs -to know whether or not this option is set. For details see the discussion of -PCRE_NO_START_OPTIMIZE -below. -
      -  PCRE_UCP
      -
      -This option changes the way PCRE processes \B, \b, \D, \d, \S, \s, \W, -\w, and some of the POSIX character classes. By default, only ASCII characters -are recognized, but if PCRE_UCP is set, Unicode properties are used instead to -classify characters. More details are given in the section on -generic character types -in the -pcrepattern -page. If you set PCRE_UCP, matching one of the items it affects takes much -longer. The option is available only if PCRE has been compiled with Unicode -property support. -
      -  PCRE_UNGREEDY
      -
      -This option inverts the "greediness" of the quantifiers so that they are not -greedy by default, but become greedy if followed by "?". It is not compatible -with Perl. It can also be set by a (?U) option setting within the pattern. -
      -  PCRE_UTF8
      -
      -This option causes PCRE to regard both the pattern and the subject as strings -of UTF-8 characters instead of single-byte strings. However, it is available -only when PCRE is built to include UTF support. If not, the use of this option -provokes an error. Details of how this option changes the behaviour of PCRE are -given in the -pcreunicode -page. -
      -  PCRE_NO_UTF8_CHECK
      -
      -When PCRE_UTF8 is set, the validity of the pattern as a UTF-8 string is -automatically checked. There is a discussion about the -validity of UTF-8 strings -in the -pcreunicode -page. If an invalid UTF-8 sequence is found, pcre_compile() returns an -error. If you already know that your pattern is valid, and you want to skip -this check for performance reasons, you can set the PCRE_NO_UTF8_CHECK option. -When it is set, the effect of passing an invalid UTF-8 string as a pattern is -undefined. It may cause your program to crash or loop. Note that this option -can also be passed to pcre_exec() and pcre_dfa_exec(), to suppress -the validity checking of subject strings only. If the same string is being -matched many times, the option can be safely set for the second and subsequent -matchings to improve performance. -

      -
      COMPILATION ERROR CODES
      -

      -The following table lists the error codes than may be returned by -pcre_compile2(), along with the error messages that may be returned by -both compiling functions. Note that error messages are always 8-bit ASCII -strings, even in 16-bit or 32-bit mode. As PCRE has developed, some error codes -have fallen out of use. To avoid confusion, they have not been re-used. -

      -   0  no error
      -   1  \ at end of pattern
      -   2  \c at end of pattern
      -   3  unrecognized character follows \
      -   4  numbers out of order in {} quantifier
      -   5  number too big in {} quantifier
      -   6  missing terminating ] for character class
      -   7  invalid escape sequence in character class
      -   8  range out of order in character class
      -   9  nothing to repeat
      -  10  [this code is not in use]
      -  11  internal error: unexpected repeat
      -  12  unrecognized character after (? or (?-
      -  13  POSIX named classes are supported only within a class
      -  14  missing )
      -  15  reference to non-existent subpattern
      -  16  erroffset passed as NULL
      -  17  unknown option bit(s) set
      -  18  missing ) after comment
      -  19  [this code is not in use]
      -  20  regular expression is too large
      -  21  failed to get memory
      -  22  unmatched parentheses
      -  23  internal error: code overflow
      -  24  unrecognized character after (?<
      -  25  lookbehind assertion is not fixed length
      -  26  malformed number or name after (?(
      -  27  conditional group contains more than two branches
      -  28  assertion expected after (?(
      -  29  (?R or (?[+-]digits must be followed by )
      -  30  unknown POSIX class name
      -  31  POSIX collating elements are not supported
      -  32  this version of PCRE is compiled without UTF support
      -  33  [this code is not in use]
      -  34  character value in \x{} or \o{} is too large
      -  35  invalid condition (?(0)
      -  36  \C not allowed in lookbehind assertion
      -  37  PCRE does not support \L, \l, \N{name}, \U, or \u
      -  38  number after (?C is > 255
      -  39  closing ) for (?C expected
      -  40  recursive call could loop indefinitely
      -  41  unrecognized character after (?P
      -  42  syntax error in subpattern name (missing terminator)
      -  43  two named subpatterns have the same name
      -  44  invalid UTF-8 string (specifically UTF-8)
      -  45  support for \P, \p, and \X has not been compiled
      -  46  malformed \P or \p sequence
      -  47  unknown property name after \P or \p
      -  48  subpattern name is too long (maximum 32 characters)
      -  49  too many named subpatterns (maximum 10000)
      -  50  [this code is not in use]
      -  51  octal value is greater than \377 in 8-bit non-UTF-8 mode
      -  52  internal error: overran compiling workspace
      -  53  internal error: previously-checked referenced subpattern
      -        not found
      -  54  DEFINE group contains more than one branch
      -  55  repeating a DEFINE group is not allowed
      -  56  inconsistent NEWLINE options
      -  57  \g is not followed by a braced, angle-bracketed, or quoted
      -        name/number or by a plain number
      -  58  a numbered reference must not be zero
      -  59  an argument is not allowed for (*ACCEPT), (*FAIL), or (*COMMIT)
      -  60  (*VERB) not recognized or malformed
      -  61  number is too big
      -  62  subpattern name expected
      -  63  digit expected after (?+
      -  64  ] is an invalid data character in JavaScript compatibility mode
      -  65  different names for subpatterns of the same number are
      -        not allowed
      -  66  (*MARK) must have an argument
      -  67  this version of PCRE is not compiled with Unicode property
      -        support
      -  68  \c must be followed by an ASCII character
      -  69  \k is not followed by a braced, angle-bracketed, or quoted name
      -  70  internal error: unknown opcode in find_fixedlength()
      -  71  \N is not supported in a class
      -  72  too many forward references
      -  73  disallowed Unicode code point (>= 0xd800 && <= 0xdfff)
      -  74  invalid UTF-16 string (specifically UTF-16)
      -  75  name is too long in (*MARK), (*PRUNE), (*SKIP), or (*THEN)
      -  76  character value in \u.... sequence is too large
      -  77  invalid UTF-32 string (specifically UTF-32)
      -  78  setting UTF is disabled by the application
      -  79  non-hex character in \x{} (closing brace missing?)
      -  80  non-octal character in \o{} (closing brace missing?)
      -  81  missing opening brace after \o
      -  82  parentheses are too deeply nested
      -  83  invalid range in character class
      -  84  group name must start with a non-digit
      -  85  parentheses are too deeply nested (stack check)
      -
      -The numbers 32 and 10000 in errors 48 and 49 are defaults; different values may -be used if the limits were changed when PCRE was built. -

      -
      STUDYING A PATTERN
      -

      -pcre_extra *pcre_study(const pcre *code, int options, - const char **errptr); -

      -

      -If a compiled pattern is going to be used several times, it is worth spending -more time analyzing it in order to speed up the time taken for matching. The -function pcre_study() takes a pointer to a compiled pattern as its first -argument. If studying the pattern produces additional information that will -help speed up matching, pcre_study() returns a pointer to a -pcre_extra block, in which the study_data field points to the -results of the study. -

      -

      -The returned value from pcre_study() can be passed directly to -pcre_exec() or pcre_dfa_exec(). However, a pcre_extra block -also contains other fields that can be set by the caller before the block is -passed; these are described -below -in the section on matching a pattern. -

      -

      -If studying the pattern does not produce any useful information, -pcre_study() returns NULL by default. In that circumstance, if the -calling program wants to pass any of the other fields to pcre_exec() or -pcre_dfa_exec(), it must set up its own pcre_extra block. However, -if pcre_study() is called with the PCRE_STUDY_EXTRA_NEEDED option, it -returns a pcre_extra block even if studying did not find any additional -information. It may still return NULL, however, if an error occurs in -pcre_study(). -

      -

      -The second argument of pcre_study() contains option bits. There are three -further options in addition to PCRE_STUDY_EXTRA_NEEDED: -

      -  PCRE_STUDY_JIT_COMPILE
      -  PCRE_STUDY_JIT_PARTIAL_HARD_COMPILE
      -  PCRE_STUDY_JIT_PARTIAL_SOFT_COMPILE
      -
      -If any of these are set, and the just-in-time compiler is available, the -pattern is further compiled into machine code that executes much faster than -the pcre_exec() interpretive matching function. If the just-in-time -compiler is not available, these options are ignored. All undefined bits in the -options argument must be zero. -

      -

      -JIT compilation is a heavyweight optimization. It can take some time for -patterns to be analyzed, and for one-off matches and simple patterns the -benefit of faster execution might be offset by a much slower study time. -Not all patterns can be optimized by the JIT compiler. For those that cannot be -handled, matching automatically falls back to the pcre_exec() -interpreter. For more details, see the -pcrejit -documentation. -

      -

      -The third argument for pcre_study() is a pointer for an error message. If -studying succeeds (even if no data is returned), the variable it points to is -set to NULL. Otherwise it is set to point to a textual error message. This is a -static string that is part of the library. You must not try to free it. You -should test the error pointer for NULL after calling pcre_study(), to be -sure that it has run successfully. -

      -

      -When you are finished with a pattern, you can free the memory used for the -study data by calling pcre_free_study(). This function was added to the -API for release 8.20. For earlier versions, the memory could be freed with -pcre_free(), just like the pattern itself. This will still work in cases -where JIT optimization is not used, but it is advisable to change to the new -function when convenient. -

      -

      -This is a typical way in which pcre_study() is used (except that in a -real application there should be tests for errors): -

      -  int rc;
      -  pcre *re;
      -  pcre_extra *sd;
      -  re = pcre_compile("pattern", 0, &error, &erroroffset, NULL);
      -  sd = pcre_study(
      -    re,             /* result of pcre_compile() */
      -    0,              /* no options */
      -    &error);        /* set to NULL or points to a message */
      -  rc = pcre_exec(   /* see below for details of pcre_exec() options */
      -    re, sd, "subject", 7, 0, 0, ovector, 30);
      -  ...
      -  pcre_free_study(sd);
      -  pcre_free(re);
      -
      -Studying a pattern does two things: first, a lower bound for the length of -subject string that is needed to match the pattern is computed. This does not -mean that there are any strings of that length that match, but it does -guarantee that no shorter strings match. The value is used to avoid wasting -time by trying to match strings that are shorter than the lower bound. You can -find out the value in a calling program via the pcre_fullinfo() function. -

      -

      -Studying a pattern is also useful for non-anchored patterns that do not have a -single fixed starting character. A bitmap of possible starting bytes is -created. This speeds up finding a position in the subject at which to start -matching. (In 16-bit mode, the bitmap is used for 16-bit values less than 256. -In 32-bit mode, the bitmap is used for 32-bit values less than 256.) -

      -

      -These two optimizations apply to both pcre_exec() and -pcre_dfa_exec(), and the information is also used by the JIT compiler. -The optimizations can be disabled by setting the PCRE_NO_START_OPTIMIZE option. -You might want to do this if your pattern contains callouts or (*MARK) and you -want to make use of these facilities in cases where matching fails. -

      -

      -PCRE_NO_START_OPTIMIZE can be specified at either compile time or execution -time. However, if PCRE_NO_START_OPTIMIZE is passed to pcre_exec(), (that -is, after any JIT compilation has happened) JIT execution is disabled. For JIT -execution to work with PCRE_NO_START_OPTIMIZE, the option must be set at -compile time. -

      -

      -There is a longer discussion of PCRE_NO_START_OPTIMIZE -below. -

      -
      LOCALE SUPPORT
      -

      -PCRE handles caseless matching, and determines whether characters are letters, -digits, or whatever, by reference to a set of tables, indexed by character -code point. When running in UTF-8 mode, or in the 16- or 32-bit libraries, this -applies only to characters with code points less than 256. By default, -higher-valued code points never match escapes such as \w or \d. However, if -PCRE is built with Unicode property support, all characters can be tested with -\p and \P, or, alternatively, the PCRE_UCP option can be set when a pattern -is compiled; this causes \w and friends to use Unicode property support -instead of the built-in tables. -

      -

      -The use of locales with Unicode is discouraged. If you are handling characters -with code points greater than 128, you should either use Unicode support, or -use locales, but not try to mix the two. -

      -

      -PCRE contains an internal set of tables that are used when the final argument -of pcre_compile() is NULL. These are sufficient for many applications. -Normally, the internal tables recognize only ASCII characters. However, when -PCRE is built, it is possible to cause the internal tables to be rebuilt in the -default "C" locale of the local system, which may cause them to be different. -

      -

      -The internal tables can always be overridden by tables supplied by the -application that calls PCRE. These may be created in a different locale from -the default. As more and more applications change to using Unicode, the need -for this locale support is expected to die away. -

      -

      -External tables are built by calling the pcre_maketables() function, -which has no arguments, in the relevant locale. The result can then be passed -to pcre_compile() as often as necessary. For example, to build and use -tables that are appropriate for the French locale (where accented characters -with values greater than 128 are treated as letters), the following code could -be used: -

      -  setlocale(LC_CTYPE, "fr_FR");
      -  tables = pcre_maketables();
      -  re = pcre_compile(..., tables);
      -
      -The locale name "fr_FR" is used on Linux and other Unix-like systems; if you -are using Windows, the name for the French locale is "french". -

      -

      -When pcre_maketables() runs, the tables are built in memory that is -obtained via pcre_malloc. It is the caller's responsibility to ensure -that the memory containing the tables remains available for as long as it is -needed. -

      -

      -The pointer that is passed to pcre_compile() is saved with the compiled -pattern, and the same tables are used via this pointer by pcre_study() -and also by pcre_exec() and pcre_dfa_exec(). Thus, for any single -pattern, compilation, studying and matching all happen in the same locale, but -different patterns can be processed in different locales. -

      -

      -It is possible to pass a table pointer or NULL (indicating the use of the -internal tables) to pcre_exec() or pcre_dfa_exec() (see the -discussion below in the section on matching a pattern). This facility is -provided for use with pre-compiled patterns that have been saved and reloaded. -Character tables are not saved with patterns, so if a non-standard table was -used at compile time, it must be provided again when the reloaded pattern is -matched. Attempting to use this facility to match a pattern in a different -locale from the one in which it was compiled is likely to lead to anomalous -(usually incorrect) results. -

      -
      INFORMATION ABOUT A PATTERN
      -

      -int pcre_fullinfo(const pcre *code, const pcre_extra *extra, - int what, void *where); -

      -

      -The pcre_fullinfo() function returns information about a compiled -pattern. It replaces the pcre_info() function, which was removed from the -library at version 8.30, after more than 10 years of obsolescence. -

      -

      -The first argument for pcre_fullinfo() is a pointer to the compiled -pattern. The second argument is the result of pcre_study(), or NULL if -the pattern was not studied. The third argument specifies which piece of -information is required, and the fourth argument is a pointer to a variable -to receive the data. The yield of the function is zero for success, or one of -the following negative numbers: -

      -  PCRE_ERROR_NULL           the argument code was NULL
      -                            the argument where was NULL
      -  PCRE_ERROR_BADMAGIC       the "magic number" was not found
      -  PCRE_ERROR_BADENDIANNESS  the pattern was compiled with different
      -                            endianness
      -  PCRE_ERROR_BADOPTION      the value of what was invalid
      -  PCRE_ERROR_UNSET          the requested field is not set
      -
      -The "magic number" is placed at the start of each compiled pattern as an simple -check against passing an arbitrary memory pointer. The endianness error can -occur if a compiled pattern is saved and reloaded on a different host. Here is -a typical call of pcre_fullinfo(), to obtain the length of the compiled -pattern: -
      -  int rc;
      -  size_t length;
      -  rc = pcre_fullinfo(
      -    re,               /* result of pcre_compile() */
      -    sd,               /* result of pcre_study(), or NULL */
      -    PCRE_INFO_SIZE,   /* what is required */
      -    &length);         /* where to put the data */
      -
      -The possible values for the third argument are defined in pcre.h, and are -as follows: -
      -  PCRE_INFO_BACKREFMAX
      -
      -Return the number of the highest back reference in the pattern. The fourth -argument should point to an int variable. Zero is returned if there are -no back references. -
      -  PCRE_INFO_CAPTURECOUNT
      -
      -Return the number of capturing subpatterns in the pattern. The fourth argument -should point to an int variable. -
      -  PCRE_INFO_DEFAULT_TABLES
      -
      -Return a pointer to the internal default character tables within PCRE. The -fourth argument should point to an unsigned char * variable. This -information call is provided for internal use by the pcre_study() -function. External callers can cause PCRE to use its internal tables by passing -a NULL table pointer. -
      -  PCRE_INFO_FIRSTBYTE (deprecated)
      -
      -Return information about the first data unit of any matched string, for a -non-anchored pattern. The name of this option refers to the 8-bit library, -where data units are bytes. The fourth argument should point to an int -variable. Negative values are used for special cases. However, this means that -when the 32-bit library is in non-UTF-32 mode, the full 32-bit range of -characters cannot be returned. For this reason, this value is deprecated; use -PCRE_INFO_FIRSTCHARACTERFLAGS and PCRE_INFO_FIRSTCHARACTER instead. -

      -

      -If there is a fixed first value, for example, the letter "c" from a pattern -such as (cat|cow|coyote), its value is returned. In the 8-bit library, the -value is always less than 256. In the 16-bit library the value can be up to -0xffff. In the 32-bit library the value can be up to 0x10ffff. -

      -

      -If there is no fixed first value, and if either -
      -
      -(a) the pattern was compiled with the PCRE_MULTILINE option, and every branch -starts with "^", or -
      -
      -(b) every branch of the pattern starts with ".*" and PCRE_DOTALL is not set -(if it were set, the pattern would be anchored), -
      -
      --1 is returned, indicating that the pattern matches only at the start of a -subject string or after any newline within the string. Otherwise -2 is -returned. For anchored patterns, -2 is returned. -

      -  PCRE_INFO_FIRSTCHARACTER
      -
      -Return the value of the first data unit (non-UTF character) of any matched -string in the situation where PCRE_INFO_FIRSTCHARACTERFLAGS returns 1; -otherwise return 0. The fourth argument should point to an uint_t -variable. -

      -

      -In the 8-bit library, the value is always less than 256. In the 16-bit library -the value can be up to 0xffff. In the 32-bit library in UTF-32 mode the value -can be up to 0x10ffff, and up to 0xffffffff when not using UTF-32 mode. -

      -  PCRE_INFO_FIRSTCHARACTERFLAGS
      -
      -Return information about the first data unit of any matched string, for a -non-anchored pattern. The fourth argument should point to an int -variable. -

      -

      -If there is a fixed first value, for example, the letter "c" from a pattern -such as (cat|cow|coyote), 1 is returned, and the character value can be -retrieved using PCRE_INFO_FIRSTCHARACTER. If there is no fixed first value, and -if either -
      -
      -(a) the pattern was compiled with the PCRE_MULTILINE option, and every branch -starts with "^", or -
      -
      -(b) every branch of the pattern starts with ".*" and PCRE_DOTALL is not set -(if it were set, the pattern would be anchored), -
      -
      -2 is returned, indicating that the pattern matches only at the start of a -subject string or after any newline within the string. Otherwise 0 is -returned. For anchored patterns, 0 is returned. -

      -  PCRE_INFO_FIRSTTABLE
      -
      -If the pattern was studied, and this resulted in the construction of a 256-bit -table indicating a fixed set of values for the first data unit in any matching -string, a pointer to the table is returned. Otherwise NULL is returned. The -fourth argument should point to an unsigned char * variable. -
      -  PCRE_INFO_HASCRORLF
      -
      -Return 1 if the pattern contains any explicit matches for CR or LF characters, -otherwise 0. The fourth argument should point to an int variable. An -explicit match is either a literal CR or LF character, or \r or \n. -
      -  PCRE_INFO_JCHANGED
      -
      -Return 1 if the (?J) or (?-J) option setting is used in the pattern, otherwise -0. The fourth argument should point to an int variable. (?J) and -(?-J) set and unset the local PCRE_DUPNAMES option, respectively. -
      -  PCRE_INFO_JIT
      -
      -Return 1 if the pattern was studied with one of the JIT options, and -just-in-time compiling was successful. The fourth argument should point to an -int variable. A return value of 0 means that JIT support is not available -in this version of PCRE, or that the pattern was not studied with a JIT option, -or that the JIT compiler could not handle this particular pattern. See the -pcrejit -documentation for details of what can and cannot be handled. -
      -  PCRE_INFO_JITSIZE
      -
      -If the pattern was successfully studied with a JIT option, return the size of -the JIT compiled code, otherwise return zero. The fourth argument should point -to a size_t variable. -
      -  PCRE_INFO_LASTLITERAL
      -
      -Return the value of the rightmost literal data unit that must exist in any -matched string, other than at its start, if such a value has been recorded. The -fourth argument should point to an int variable. If there is no such -value, -1 is returned. For anchored patterns, a last literal value is recorded -only if it follows something of variable length. For example, for the pattern -/^a\d+z\d+/ the returned value is "z", but for /^a\dz\d/ the returned value -is -1. -

      -

      -Since for the 32-bit library using the non-UTF-32 mode, this function is unable -to return the full 32-bit range of characters, this value is deprecated; -instead the PCRE_INFO_REQUIREDCHARFLAGS and PCRE_INFO_REQUIREDCHAR values should -be used. -

      -  PCRE_INFO_MATCH_EMPTY
      -
      -Return 1 if the pattern can match an empty string, otherwise 0. The fourth -argument should point to an int variable. -
      -  PCRE_INFO_MATCHLIMIT
      -
      -If the pattern set a match limit by including an item of the form -(*LIMIT_MATCH=nnnn) at the start, the value is returned. The fourth argument -should point to an unsigned 32-bit integer. If no such value has been set, the -call to pcre_fullinfo() returns the error PCRE_ERROR_UNSET. -
      -  PCRE_INFO_MAXLOOKBEHIND
      -
      -Return the number of characters (NB not data units) in the longest lookbehind -assertion in the pattern. This information is useful when doing multi-segment -matching using the partial matching facilities. Note that the simple assertions -\b and \B require a one-character lookbehind. \A also registers a -one-character lookbehind, though it does not actually inspect the previous -character. This is to ensure that at least one character from the old segment -is retained when a new segment is processed. Otherwise, if there are no -lookbehinds in the pattern, \A might match incorrectly at the start of a new -segment. -
      -  PCRE_INFO_MINLENGTH
      -
      -If the pattern was studied and a minimum length for matching subject strings -was computed, its value is returned. Otherwise the returned value is -1. The -value is a number of characters, which in UTF mode may be different from the -number of data units. The fourth argument should point to an int -variable. A non-negative value is a lower bound to the length of any matching -string. There may not be any strings of that length that do actually match, but -every string that does match is at least that long. -
      -  PCRE_INFO_NAMECOUNT
      -  PCRE_INFO_NAMEENTRYSIZE
      -  PCRE_INFO_NAMETABLE
      -
      -PCRE supports the use of named as well as numbered capturing parentheses. The -names are just an additional way of identifying the parentheses, which still -acquire numbers. Several convenience functions such as -pcre_get_named_substring() are provided for extracting captured -substrings by name. It is also possible to extract the data directly, by first -converting the name to a number in order to access the correct pointers in the -output vector (described with pcre_exec() below). To do the conversion, -you need to use the name-to-number map, which is described by these three -values. -

      -

      -The map consists of a number of fixed-size entries. PCRE_INFO_NAMECOUNT gives -the number of entries, and PCRE_INFO_NAMEENTRYSIZE gives the size of each -entry; both of these return an int value. The entry size depends on the -length of the longest name. PCRE_INFO_NAMETABLE returns a pointer to the first -entry of the table. This is a pointer to char in the 8-bit library, where -the first two bytes of each entry are the number of the capturing parenthesis, -most significant byte first. In the 16-bit library, the pointer points to -16-bit data units, the first of which contains the parenthesis number. In the -32-bit library, the pointer points to 32-bit data units, the first of which -contains the parenthesis number. The rest of the entry is the corresponding -name, zero terminated. -

      -

      -The names are in alphabetical order. If (?| is used to create multiple groups -with the same number, as described in the -section on duplicate subpattern numbers -in the -pcrepattern -page, the groups may be given the same name, but there is only one entry in the -table. Different names for groups of the same number are not permitted. -Duplicate names for subpatterns with different numbers are permitted, -but only if PCRE_DUPNAMES is set. They appear in the table in the order in -which they were found in the pattern. In the absence of (?| this is the order -of increasing number; when (?| is used this is not necessarily the case because -later subpatterns may have lower numbers. -

      -

      -As a simple example of the name/number table, consider the following pattern -after compilation by the 8-bit library (assume PCRE_EXTENDED is set, so white -space - including newlines - is ignored): -

      -  (?<date> (?<year>(\d\d)?\d\d) - (?<month>\d\d) - (?<day>\d\d) )
      -
      -There are four named subpatterns, so the table has four entries, and each entry -in the table is eight bytes long. The table is as follows, with non-printing -bytes shows in hexadecimal, and undefined bytes shown as ??: -
      -  00 01 d  a  t  e  00 ??
      -  00 05 d  a  y  00 ?? ??
      -  00 04 m  o  n  t  h  00
      -  00 02 y  e  a  r  00 ??
      -
      -When writing code to extract data from named subpatterns using the -name-to-number map, remember that the length of the entries is likely to be -different for each compiled pattern. -
      -  PCRE_INFO_OKPARTIAL
      -
      -Return 1 if the pattern can be used for partial matching with -pcre_exec(), otherwise 0. The fourth argument should point to an -int variable. From release 8.00, this always returns 1, because the -restrictions that previously applied to partial matching have been lifted. The -pcrepartial -documentation gives details of partial matching. -
      -  PCRE_INFO_OPTIONS
      -
      -Return a copy of the options with which the pattern was compiled. The fourth -argument should point to an unsigned long int variable. These option bits -are those specified in the call to pcre_compile(), modified by any -top-level option settings at the start of the pattern itself. In other words, -they are the options that will be in force when matching starts. For example, -if the pattern /(?im)abc(?-i)d/ is compiled with the PCRE_EXTENDED option, the -result is PCRE_CASELESS, PCRE_MULTILINE, and PCRE_EXTENDED. -

      -

      -A pattern is automatically anchored by PCRE if all of its top-level -alternatives begin with one of the following: -

      -  ^     unless PCRE_MULTILINE is set
      -  \A    always
      -  \G    always
      -  .*    if PCRE_DOTALL is set and there are no back references to the subpattern in which .* appears
      -
      -For such patterns, the PCRE_ANCHORED bit is set in the options returned by -pcre_fullinfo(). -
      -  PCRE_INFO_RECURSIONLIMIT
      -
      -If the pattern set a recursion limit by including an item of the form -(*LIMIT_RECURSION=nnnn) at the start, the value is returned. The fourth -argument should point to an unsigned 32-bit integer. If no such value has been -set, the call to pcre_fullinfo() returns the error PCRE_ERROR_UNSET. -
      -  PCRE_INFO_SIZE
      -
      -Return the size of the compiled pattern in bytes (for all three libraries). The -fourth argument should point to a size_t variable. This value does not -include the size of the pcre structure that is returned by -pcre_compile(). The value that is passed as the argument to -pcre_malloc() when pcre_compile() is getting memory in which to -place the compiled data is the value returned by this option plus the size of -the pcre structure. Studying a compiled pattern, with or without JIT, -does not alter the value returned by this option. -
      -  PCRE_INFO_STUDYSIZE
      -
      -Return the size in bytes (for all three libraries) of the data block pointed to -by the study_data field in a pcre_extra block. If pcre_extra -is NULL, or there is no study data, zero is returned. The fourth argument -should point to a size_t variable. The study_data field is set by -pcre_study() to record information that will speed up matching (see the -section entitled -"Studying a pattern" -above). The format of the study_data block is private, but its length -is made available via this option so that it can be saved and restored (see the -pcreprecompile -documentation for details). -
      -  PCRE_INFO_REQUIREDCHARFLAGS
      -
      -Returns 1 if there is a rightmost literal data unit that must exist in any -matched string, other than at its start. The fourth argument should point to -an int variable. If there is no such value, 0 is returned. If returning -1, the character value itself can be retrieved using PCRE_INFO_REQUIREDCHAR. -

      -

      -For anchored patterns, a last literal value is recorded only if it follows -something of variable length. For example, for the pattern /^a\d+z\d+/ the -returned value 1 (with "z" returned from PCRE_INFO_REQUIREDCHAR), but for -/^a\dz\d/ the returned value is 0. -

      -  PCRE_INFO_REQUIREDCHAR
      -
      -Return the value of the rightmost literal data unit that must exist in any -matched string, other than at its start, if such a value has been recorded. The -fourth argument should point to an uint32_t variable. If there is no such -value, 0 is returned. -

      -
      REFERENCE COUNTS
      -

      -int pcre_refcount(pcre *code, int adjust); -

      -

      -The pcre_refcount() function is used to maintain a reference count in the -data block that contains a compiled pattern. It is provided for the benefit of -applications that operate in an object-oriented manner, where different parts -of the application may be using the same compiled pattern, but you want to free -the block when they are all done. -

      -

      -When a pattern is compiled, the reference count field is initialized to zero. -It is changed only by calling this function, whose action is to add the -adjust value (which may be positive or negative) to it. The yield of the -function is the new value. However, the value of the count is constrained to -lie between 0 and 65535, inclusive. If the new value is outside these limits, -it is forced to the appropriate limit value. -

      -

      -Except when it is zero, the reference count is not correctly preserved if a -pattern is compiled on one host and then transferred to a host whose byte-order -is different. (This seems a highly unlikely scenario.) -

      -
      MATCHING A PATTERN: THE TRADITIONAL FUNCTION
      -

      -int pcre_exec(const pcre *code, const pcre_extra *extra, - const char *subject, int length, int startoffset, - int options, int *ovector, int ovecsize); -

      -

      -The function pcre_exec() is called to match a subject string against a -compiled pattern, which is passed in the code argument. If the -pattern was studied, the result of the study should be passed in the -extra argument. You can call pcre_exec() with the same code -and extra arguments as many times as you like, in order to match -different subject strings with the same pattern. -

      -

      -This function is the main matching facility of the library, and it operates in -a Perl-like manner. For specialist use there is also an alternative matching -function, which is described -below -in the section about the pcre_dfa_exec() function. -

      -

      -In most applications, the pattern will have been compiled (and optionally -studied) in the same process that calls pcre_exec(). However, it is -possible to save compiled patterns and study data, and then use them later -in different processes, possibly even on different hosts. For a discussion -about this, see the -pcreprecompile -documentation. -

      -

      -Here is an example of a simple call to pcre_exec(): -

      -  int rc;
      -  int ovector[30];
      -  rc = pcre_exec(
      -    re,             /* result of pcre_compile() */
      -    NULL,           /* we didn't study the pattern */
      -    "some string",  /* the subject string */
      -    11,             /* the length of the subject string */
      -    0,              /* start at offset 0 in the subject */
      -    0,              /* default options */
      -    ovector,        /* vector of integers for substring information */
      -    30);            /* number of elements (NOT size in bytes) */
      -
      -

      -
      -Extra data for pcre_exec() -
      -

      -If the extra argument is not NULL, it must point to a pcre_extra -data block. The pcre_study() function returns such a block (when it -doesn't return NULL), but you can also create one for yourself, and pass -additional information in it. The pcre_extra block contains the following -fields (not necessarily in this order): -

      -  unsigned long int flags;
      -  void *study_data;
      -  void *executable_jit;
      -  unsigned long int match_limit;
      -  unsigned long int match_limit_recursion;
      -  void *callout_data;
      -  const unsigned char *tables;
      -  unsigned char **mark;
      -
      -In the 16-bit version of this structure, the mark field has type -"PCRE_UCHAR16 **". -
      -
      -In the 32-bit version of this structure, the mark field has type -"PCRE_UCHAR32 **". -

      -

      -The flags field is used to specify which of the other fields are set. The -flag bits are: -

      -  PCRE_EXTRA_CALLOUT_DATA
      -  PCRE_EXTRA_EXECUTABLE_JIT
      -  PCRE_EXTRA_MARK
      -  PCRE_EXTRA_MATCH_LIMIT
      -  PCRE_EXTRA_MATCH_LIMIT_RECURSION
      -  PCRE_EXTRA_STUDY_DATA
      -  PCRE_EXTRA_TABLES
      -
      -Other flag bits should be set to zero. The study_data field and sometimes -the executable_jit field are set in the pcre_extra block that is -returned by pcre_study(), together with the appropriate flag bits. You -should not set these yourself, but you may add to the block by setting other -fields and their corresponding flag bits. -

      -

      -The match_limit field provides a means of preventing PCRE from using up a -vast amount of resources when running patterns that are not going to match, -but which have a very large number of possibilities in their search trees. The -classic example is a pattern that uses nested unlimited repeats. -

      -

      -Internally, pcre_exec() uses a function called match(), which it -calls repeatedly (sometimes recursively). The limit set by match_limit is -imposed on the number of times this function is called during a match, which -has the effect of limiting the amount of backtracking that can take place. For -patterns that are not anchored, the count restarts from zero for each position -in the subject string. -

      -

      -When pcre_exec() is called with a pattern that was successfully studied -with a JIT option, the way that the matching is executed is entirely different. -However, there is still the possibility of runaway matching that goes on for a -very long time, and so the match_limit value is also used in this case -(but in a different way) to limit how long the matching can continue. -

      -

      -The default value for the limit can be set when PCRE is built; the default -default is 10 million, which handles all but the most extreme cases. You can -override the default by suppling pcre_exec() with a pcre_extra -block in which match_limit is set, and PCRE_EXTRA_MATCH_LIMIT is set in -the flags field. If the limit is exceeded, pcre_exec() returns -PCRE_ERROR_MATCHLIMIT. -

      -

      -A value for the match limit may also be supplied by an item at the start of a -pattern of the form -

      -  (*LIMIT_MATCH=d)
      -
      -where d is a decimal number. However, such a setting is ignored unless d is -less than the limit set by the caller of pcre_exec() or, if no such limit -is set, less than the default. -

      -

      -The match_limit_recursion field is similar to match_limit, but -instead of limiting the total number of times that match() is called, it -limits the depth of recursion. The recursion depth is a smaller number than the -total number of calls, because not all calls to match() are recursive. -This limit is of use only if it is set smaller than match_limit. -

      -

      -Limiting the recursion depth limits the amount of machine stack that can be -used, or, when PCRE has been compiled to use memory on the heap instead of the -stack, the amount of heap memory that can be used. This limit is not relevant, -and is ignored, when matching is done using JIT compiled code. -

      -

      -The default value for match_limit_recursion can be set when PCRE is -built; the default default is the same value as the default for -match_limit. You can override the default by suppling pcre_exec() -with a pcre_extra block in which match_limit_recursion is set, and -PCRE_EXTRA_MATCH_LIMIT_RECURSION is set in the flags field. If the limit -is exceeded, pcre_exec() returns PCRE_ERROR_RECURSIONLIMIT. -

      -

      -A value for the recursion limit may also be supplied by an item at the start of -a pattern of the form -

      -  (*LIMIT_RECURSION=d)
      -
      -where d is a decimal number. However, such a setting is ignored unless d is -less than the limit set by the caller of pcre_exec() or, if no such limit -is set, less than the default. -

      -

      -The callout_data field is used in conjunction with the "callout" feature, -and is described in the -pcrecallout -documentation. -

      -

      -The tables field is provided for use with patterns that have been -pre-compiled using custom character tables, saved to disc or elsewhere, and -then reloaded, because the tables that were used to compile a pattern are not -saved with it. See the -pcreprecompile -documentation for a discussion of saving compiled patterns for later use. If -NULL is passed using this mechanism, it forces PCRE's internal tables to be -used. -

      -

      -Warning: The tables that pcre_exec() uses must be the same as those -that were used when the pattern was compiled. If this is not the case, the -behaviour of pcre_exec() is undefined. Therefore, when a pattern is -compiled and matched in the same process, this field should never be set. In -this (the most common) case, the correct table pointer is automatically passed -with the compiled pattern from pcre_compile() to pcre_exec(). -

      -

      -If PCRE_EXTRA_MARK is set in the flags field, the mark field must -be set to point to a suitable variable. If the pattern contains any -backtracking control verbs such as (*MARK:NAME), and the execution ends up with -a name to pass back, a pointer to the name string (zero terminated) is placed -in the variable pointed to by the mark field. The names are within the -compiled pattern; if you wish to retain such a name you must copy it before -freeing the memory of a compiled pattern. If there is no name to pass back, the -variable pointed to by the mark field is set to NULL. For details of the -backtracking control verbs, see the section entitled -"Backtracking control" -in the -pcrepattern -documentation. -

      -
      -Option bits for pcre_exec() -
      -

      -The unused bits of the options argument for pcre_exec() must be -zero. The only bits that may be set are PCRE_ANCHORED, PCRE_NEWLINE_xxx, -PCRE_NOTBOL, PCRE_NOTEOL, PCRE_NOTEMPTY, PCRE_NOTEMPTY_ATSTART, -PCRE_NO_START_OPTIMIZE, PCRE_NO_UTF8_CHECK, PCRE_PARTIAL_HARD, and -PCRE_PARTIAL_SOFT. -

      -

      -If the pattern was successfully studied with one of the just-in-time (JIT) -compile options, the only supported options for JIT execution are -PCRE_NO_UTF8_CHECK, PCRE_NOTBOL, PCRE_NOTEOL, PCRE_NOTEMPTY, -PCRE_NOTEMPTY_ATSTART, PCRE_PARTIAL_HARD, and PCRE_PARTIAL_SOFT. If an -unsupported option is used, JIT execution is disabled and the normal -interpretive code in pcre_exec() is run. -

      -  PCRE_ANCHORED
      -
      -The PCRE_ANCHORED option limits pcre_exec() to matching at the first -matching position. If a pattern was compiled with PCRE_ANCHORED, or turned out -to be anchored by virtue of its contents, it cannot be made unachored at -matching time. -
      -  PCRE_BSR_ANYCRLF
      -  PCRE_BSR_UNICODE
      -
      -These options (which are mutually exclusive) control what the \R escape -sequence matches. The choice is either to match only CR, LF, or CRLF, or to -match any Unicode newline sequence. These options override the choice that was -made or defaulted when the pattern was compiled. -
      -  PCRE_NEWLINE_CR
      -  PCRE_NEWLINE_LF
      -  PCRE_NEWLINE_CRLF
      -  PCRE_NEWLINE_ANYCRLF
      -  PCRE_NEWLINE_ANY
      -
      -These options override the newline definition that was chosen or defaulted when -the pattern was compiled. For details, see the description of -pcre_compile() above. During matching, the newline choice affects the -behaviour of the dot, circumflex, and dollar metacharacters. It may also alter -the way the match position is advanced after a match failure for an unanchored -pattern. -

      -

      -When PCRE_NEWLINE_CRLF, PCRE_NEWLINE_ANYCRLF, or PCRE_NEWLINE_ANY is set, and a -match attempt for an unanchored pattern fails when the current position is at a -CRLF sequence, and the pattern contains no explicit matches for CR or LF -characters, the match position is advanced by two characters instead of one, in -other words, to after the CRLF. -

      -

      -The above rule is a compromise that makes the most common cases work as -expected. For example, if the pattern is .+A (and the PCRE_DOTALL option is not -set), it does not match the string "\r\nA" because, after failing at the -start, it skips both the CR and the LF before retrying. However, the pattern -[\r\n]A does match that string, because it contains an explicit CR or LF -reference, and so advances only by one character after the first failure. -

      -

      -An explicit match for CR of LF is either a literal appearance of one of those -characters, or one of the \r or \n escape sequences. Implicit matches such as -[^X] do not count, nor does \s (which includes CR and LF in the characters -that it matches). -

      -

      -Notwithstanding the above, anomalous effects may still occur when CRLF is a -valid newline sequence and explicit \r or \n escapes appear in the pattern. -

      -  PCRE_NOTBOL
      -
      -This option specifies that first character of the subject string is not the -beginning of a line, so the circumflex metacharacter should not match before -it. Setting this without PCRE_MULTILINE (at compile time) causes circumflex -never to match. This option affects only the behaviour of the circumflex -metacharacter. It does not affect \A. -
      -  PCRE_NOTEOL
      -
      -This option specifies that the end of the subject string is not the end of a -line, so the dollar metacharacter should not match it nor (except in multiline -mode) a newline immediately before it. Setting this without PCRE_MULTILINE (at -compile time) causes dollar never to match. This option affects only the -behaviour of the dollar metacharacter. It does not affect \Z or \z. -
      -  PCRE_NOTEMPTY
      -
      -An empty string is not considered to be a valid match if this option is set. If -there are alternatives in the pattern, they are tried. If all the alternatives -match the empty string, the entire match fails. For example, if the pattern -
      -  a?b?
      -
      -is applied to a string not beginning with "a" or "b", it matches an empty -string at the start of the subject. With PCRE_NOTEMPTY set, this match is not -valid, so PCRE searches further into the string for occurrences of "a" or "b". -
      -  PCRE_NOTEMPTY_ATSTART
      -
      -This is like PCRE_NOTEMPTY, except that an empty string match that is not at -the start of the subject is permitted. If the pattern is anchored, such a match -can occur only if the pattern contains \K. -

      -

      -Perl has no direct equivalent of PCRE_NOTEMPTY or PCRE_NOTEMPTY_ATSTART, but it -does make a special case of a pattern match of the empty string within its -split() function, and when using the /g modifier. It is possible to -emulate Perl's behaviour after matching a null string by first trying the match -again at the same offset with PCRE_NOTEMPTY_ATSTART and PCRE_ANCHORED, and then -if that fails, by advancing the starting offset (see below) and trying an -ordinary match again. There is some code that demonstrates how to do this in -the -pcredemo -sample program. In the most general case, you have to check to see if the -newline convention recognizes CRLF as a newline, and if so, and the current -character is CR followed by LF, advance the starting offset by two characters -instead of one. -

      -  PCRE_NO_START_OPTIMIZE
      -
      -There are a number of optimizations that pcre_exec() uses at the start of -a match, in order to speed up the process. For example, if it is known that an -unanchored match must start with a specific character, it searches the subject -for that character, and fails immediately if it cannot find it, without -actually running the main matching function. This means that a special item -such as (*COMMIT) at the start of a pattern is not considered until after a -suitable starting point for the match has been found. Also, when callouts or -(*MARK) items are in use, these "start-up" optimizations can cause them to be -skipped if the pattern is never actually used. The start-up optimizations are -in effect a pre-scan of the subject that takes place before the pattern is run. -

      -

      -The PCRE_NO_START_OPTIMIZE option disables the start-up optimizations, possibly -causing performance to suffer, but ensuring that in cases where the result is -"no match", the callouts do occur, and that items such as (*COMMIT) and (*MARK) -are considered at every possible starting position in the subject string. If -PCRE_NO_START_OPTIMIZE is set at compile time, it cannot be unset at matching -time. The use of PCRE_NO_START_OPTIMIZE at matching time (that is, passing it -to pcre_exec()) disables JIT execution; in this situation, matching is -always done using interpretively. -

      -

      -Setting PCRE_NO_START_OPTIMIZE can change the outcome of a matching operation. -Consider the pattern -

      -  (*COMMIT)ABC
      -
      -When this is compiled, PCRE records the fact that a match must start with the -character "A". Suppose the subject string is "DEFABC". The start-up -optimization scans along the subject, finds "A" and runs the first match -attempt from there. The (*COMMIT) item means that the pattern must match the -current starting position, which in this case, it does. However, if the same -match is run with PCRE_NO_START_OPTIMIZE set, the initial scan along the -subject string does not happen. The first match attempt is run starting from -"D" and when this fails, (*COMMIT) prevents any further matches being tried, so -the overall result is "no match". If the pattern is studied, more start-up -optimizations may be used. For example, a minimum length for the subject may be -recorded. Consider the pattern -
      -  (*MARK:A)(X|Y)
      -
      -The minimum length for a match is one character. If the subject is "ABC", there -will be attempts to match "ABC", "BC", "C", and then finally an empty string. -If the pattern is studied, the final attempt does not take place, because PCRE -knows that the subject is too short, and so the (*MARK) is never encountered. -In this case, studying the pattern does not affect the overall match result, -which is still "no match", but it does affect the auxiliary information that is -returned. -
      -  PCRE_NO_UTF8_CHECK
      -
      -When PCRE_UTF8 is set at compile time, the validity of the subject as a UTF-8 -string is automatically checked when pcre_exec() is subsequently called. -The entire string is checked before any other processing takes place. The value -of startoffset is also checked to ensure that it points to the start of a -UTF-8 character. There is a discussion about the -validity of UTF-8 strings -in the -pcreunicode -page. If an invalid sequence of bytes is found, pcre_exec() returns the -error PCRE_ERROR_BADUTF8 or, if PCRE_PARTIAL_HARD is set and the problem is a -truncated character at the end of the subject, PCRE_ERROR_SHORTUTF8. In both -cases, information about the precise nature of the error may also be returned -(see the descriptions of these errors in the section entitled \fIError return -values from\fP pcre_exec() -below). -If startoffset contains a value that does not point to the start of a -UTF-8 character (or to the end of the subject), PCRE_ERROR_BADUTF8_OFFSET is -returned. -

      -

      -If you already know that your subject is valid, and you want to skip these -checks for performance reasons, you can set the PCRE_NO_UTF8_CHECK option when -calling pcre_exec(). You might want to do this for the second and -subsequent calls to pcre_exec() if you are making repeated calls to find -all the matches in a single subject string. However, you should be sure that -the value of startoffset points to the start of a character (or the end -of the subject). When PCRE_NO_UTF8_CHECK is set, the effect of passing an -invalid string as a subject or an invalid value of startoffset is -undefined. Your program may crash or loop. -

      -  PCRE_PARTIAL_HARD
      -  PCRE_PARTIAL_SOFT
      -
      -These options turn on the partial matching feature. For backwards -compatibility, PCRE_PARTIAL is a synonym for PCRE_PARTIAL_SOFT. A partial match -occurs if the end of the subject string is reached successfully, but there are -not enough subject characters to complete the match. If this happens when -PCRE_PARTIAL_SOFT (but not PCRE_PARTIAL_HARD) is set, matching continues by -testing any remaining alternatives. Only if no complete match can be found is -PCRE_ERROR_PARTIAL returned instead of PCRE_ERROR_NOMATCH. In other words, -PCRE_PARTIAL_SOFT says that the caller is prepared to handle a partial match, -but only if no complete match can be found. -

      -

      -If PCRE_PARTIAL_HARD is set, it overrides PCRE_PARTIAL_SOFT. In this case, if a -partial match is found, pcre_exec() immediately returns -PCRE_ERROR_PARTIAL, without considering any other alternatives. In other words, -when PCRE_PARTIAL_HARD is set, a partial match is considered to be more -important that an alternative complete match. -

      -

      -In both cases, the portion of the string that was inspected when the partial -match was found is set as the first matching string. There is a more detailed -discussion of partial and multi-segment matching, with examples, in the -pcrepartial -documentation. -

      -
      -The string to be matched by pcre_exec() -
      -

      -The subject string is passed to pcre_exec() as a pointer in -subject, a length in length, and a starting offset in -startoffset. The units for length and startoffset are bytes -for the 8-bit library, 16-bit data items for the 16-bit library, and 32-bit -data items for the 32-bit library. -

      -

      -If startoffset is negative or greater than the length of the subject, -pcre_exec() returns PCRE_ERROR_BADOFFSET. When the starting offset is -zero, the search for a match starts at the beginning of the subject, and this -is by far the most common case. In UTF-8 or UTF-16 mode, the offset must point -to the start of a character, or the end of the subject (in UTF-32 mode, one -data unit equals one character, so all offsets are valid). Unlike the pattern -string, the subject may contain binary zeroes. -

      -

      -A non-zero starting offset is useful when searching for another match in the -same subject by calling pcre_exec() again after a previous success. -Setting startoffset differs from just passing over a shortened string and -setting PCRE_NOTBOL in the case of a pattern that begins with any kind of -lookbehind. For example, consider the pattern -

      -  \Biss\B
      -
      -which finds occurrences of "iss" in the middle of words. (\B matches only if -the current position in the subject is not a word boundary.) When applied to -the string "Mississipi" the first call to pcre_exec() finds the first -occurrence. If pcre_exec() is called again with just the remainder of the -subject, namely "issipi", it does not match, because \B is always false at the -start of the subject, which is deemed to be a word boundary. However, if -pcre_exec() is passed the entire string again, but with startoffset -set to 4, it finds the second occurrence of "iss" because it is able to look -behind the starting point to discover that it is preceded by a letter. -

      -

      -Finding all the matches in a subject is tricky when the pattern can match an -empty string. It is possible to emulate Perl's /g behaviour by first trying the -match again at the same offset, with the PCRE_NOTEMPTY_ATSTART and -PCRE_ANCHORED options, and then if that fails, advancing the starting offset -and trying an ordinary match again. There is some code that demonstrates how to -do this in the -pcredemo -sample program. In the most general case, you have to check to see if the -newline convention recognizes CRLF as a newline, and if so, and the current -character is CR followed by LF, advance the starting offset by two characters -instead of one. -

      -

      -If a non-zero starting offset is passed when the pattern is anchored, one -attempt to match at the given offset is made. This can only succeed if the -pattern does not require the match to be at the start of the subject. -

      -
      -How pcre_exec() returns captured substrings -
      -

      -In general, a pattern matches a certain portion of the subject, and in -addition, further substrings from the subject may be picked out by parts of the -pattern. Following the usage in Jeffrey Friedl's book, this is called -"capturing" in what follows, and the phrase "capturing subpattern" is used for -a fragment of a pattern that picks out a substring. PCRE supports several other -kinds of parenthesized subpattern that do not cause substrings to be captured. -

      -

      -Captured substrings are returned to the caller via a vector of integers whose -address is passed in ovector. The number of elements in the vector is -passed in ovecsize, which must be a non-negative number. Note: this -argument is NOT the size of ovector in bytes. -

      -

      -The first two-thirds of the vector is used to pass back captured substrings, -each substring using a pair of integers. The remaining third of the vector is -used as workspace by pcre_exec() while matching capturing subpatterns, -and is not available for passing back information. The number passed in -ovecsize should always be a multiple of three. If it is not, it is -rounded down. -

      -

      -When a match is successful, information about captured substrings is returned -in pairs of integers, starting at the beginning of ovector, and -continuing up to two-thirds of its length at the most. The first element of -each pair is set to the offset of the first character in a substring, and the -second is set to the offset of the first character after the end of a -substring. These values are always data unit offsets, even in UTF mode. They -are byte offsets in the 8-bit library, 16-bit data item offsets in the 16-bit -library, and 32-bit data item offsets in the 32-bit library. Note: they -are not character counts. -

      -

      -The first pair of integers, ovector[0] and ovector[1], identify the -portion of the subject string matched by the entire pattern. The next pair is -used for the first capturing subpattern, and so on. The value returned by -pcre_exec() is one more than the highest numbered pair that has been set. -For example, if two substrings have been captured, the returned value is 3. If -there are no capturing subpatterns, the return value from a successful match is -1, indicating that just the first pair of offsets has been set. -

      -

      -If a capturing subpattern is matched repeatedly, it is the last portion of the -string that it matched that is returned. -

      -

      -If the vector is too small to hold all the captured substring offsets, it is -used as far as possible (up to two-thirds of its length), and the function -returns a value of zero. If neither the actual string matched nor any captured -substrings are of interest, pcre_exec() may be called with ovector -passed as NULL and ovecsize as zero. However, if the pattern contains -back references and the ovector is not big enough to remember the related -substrings, PCRE has to get additional memory for use during matching. Thus it -is usually advisable to supply an ovector of reasonable size. -

      -

      -There are some cases where zero is returned (indicating vector overflow) when -in fact the vector is exactly the right size for the final match. For example, -consider the pattern -

      -  (a)(?:(b)c|bd)
      -
      -If a vector of 6 elements (allowing for only 1 captured substring) is given -with subject string "abd", pcre_exec() will try to set the second -captured string, thereby recording a vector overflow, before failing to match -"c" and backing up to try the second alternative. The zero return, however, -does correctly indicate that the maximum number of slots (namely 2) have been -filled. In similar cases where there is temporary overflow, but the final -number of used slots is actually less than the maximum, a non-zero value is -returned. -

      -

      -The pcre_fullinfo() function can be used to find out how many capturing -subpatterns there are in a compiled pattern. The smallest size for -ovector that will allow for n captured substrings, in addition to -the offsets of the substring matched by the whole pattern, is (n+1)*3. -

      -

      -It is possible for capturing subpattern number n+1 to match some part of -the subject when subpattern n has not been used at all. For example, if -the string "abc" is matched against the pattern (a|(z))(bc) the return from the -function is 4, and subpatterns 1 and 3 are matched, but 2 is not. When this -happens, both values in the offset pairs corresponding to unused subpatterns -are set to -1. -

      -

      -Offset values that correspond to unused subpatterns at the end of the -expression are also set to -1. For example, if the string "abc" is matched -against the pattern (abc)(x(yz)?)? subpatterns 2 and 3 are not matched. The -return from the function is 2, because the highest used capturing subpattern -number is 1, and the offsets for for the second and third capturing subpatterns -(assuming the vector is large enough, of course) are set to -1. -

      -

      -Note: Elements in the first two-thirds of ovector that do not -correspond to capturing parentheses in the pattern are never changed. That is, -if a pattern contains n capturing parentheses, no more than -ovector[0] to ovector[2n+1] are set by pcre_exec(). The other -elements (in the first two-thirds) retain whatever values they previously had. -

      -

      -Some convenience functions are provided for extracting the captured substrings -as separate strings. These are described below. -

      -
      -Error return values from pcre_exec() -
      -

      -If pcre_exec() fails, it returns a negative number. The following are -defined in the header file: -

      -  PCRE_ERROR_NOMATCH        (-1)
      -
      -The subject string did not match the pattern. -
      -  PCRE_ERROR_NULL           (-2)
      -
      -Either code or subject was passed as NULL, or ovector was -NULL and ovecsize was not zero. -
      -  PCRE_ERROR_BADOPTION      (-3)
      -
      -An unrecognized bit was set in the options argument. -
      -  PCRE_ERROR_BADMAGIC       (-4)
      -
      -PCRE stores a 4-byte "magic number" at the start of the compiled code, to catch -the case when it is passed a junk pointer and to detect when a pattern that was -compiled in an environment of one endianness is run in an environment with the -other endianness. This is the error that PCRE gives when the magic number is -not present. -
      -  PCRE_ERROR_UNKNOWN_OPCODE (-5)
      -
      -While running the pattern match, an unknown item was encountered in the -compiled pattern. This error could be caused by a bug in PCRE or by overwriting -of the compiled pattern. -
      -  PCRE_ERROR_NOMEMORY       (-6)
      -
      -If a pattern contains back references, but the ovector that is passed to -pcre_exec() is not big enough to remember the referenced substrings, PCRE -gets a block of memory at the start of matching to use for this purpose. If the -call via pcre_malloc() fails, this error is given. The memory is -automatically freed at the end of matching. -

      -

      -This error is also given if pcre_stack_malloc() fails in -pcre_exec(). This can happen only when PCRE has been compiled with ---disable-stack-for-recursion. -

      -  PCRE_ERROR_NOSUBSTRING    (-7)
      -
      -This error is used by the pcre_copy_substring(), -pcre_get_substring(), and pcre_get_substring_list() functions (see -below). It is never returned by pcre_exec(). -
      -  PCRE_ERROR_MATCHLIMIT     (-8)
      -
      -The backtracking limit, as specified by the match_limit field in a -pcre_extra structure (or defaulted) was reached. See the description -above. -
      -  PCRE_ERROR_CALLOUT        (-9)
      -
      -This error is never generated by pcre_exec() itself. It is provided for -use by callout functions that want to yield a distinctive error code. See the -pcrecallout -documentation for details. -
      -  PCRE_ERROR_BADUTF8        (-10)
      -
      -A string that contains an invalid UTF-8 byte sequence was passed as a subject, -and the PCRE_NO_UTF8_CHECK option was not set. If the size of the output vector -(ovecsize) is at least 2, the byte offset to the start of the the invalid -UTF-8 character is placed in the first element, and a reason code is placed in -the second element. The reason codes are listed in the -following section. -For backward compatibility, if PCRE_PARTIAL_HARD is set and the problem is a -truncated UTF-8 character at the end of the subject (reason codes 1 to 5), -PCRE_ERROR_SHORTUTF8 is returned instead of PCRE_ERROR_BADUTF8. -
      -  PCRE_ERROR_BADUTF8_OFFSET (-11)
      -
      -The UTF-8 byte sequence that was passed as a subject was checked and found to -be valid (the PCRE_NO_UTF8_CHECK option was not set), but the value of -startoffset did not point to the beginning of a UTF-8 character or the -end of the subject. -
      -  PCRE_ERROR_PARTIAL        (-12)
      -
      -The subject string did not match, but it did match partially. See the -pcrepartial -documentation for details of partial matching. -
      -  PCRE_ERROR_BADPARTIAL     (-13)
      -
      -This code is no longer in use. It was formerly returned when the PCRE_PARTIAL -option was used with a compiled pattern containing items that were not -supported for partial matching. From release 8.00 onwards, there are no -restrictions on partial matching. -
      -  PCRE_ERROR_INTERNAL       (-14)
      -
      -An unexpected internal error has occurred. This error could be caused by a bug -in PCRE or by overwriting of the compiled pattern. -
      -  PCRE_ERROR_BADCOUNT       (-15)
      -
      -This error is given if the value of the ovecsize argument is negative. -
      -  PCRE_ERROR_RECURSIONLIMIT (-21)
      -
      -The internal recursion limit, as specified by the match_limit_recursion -field in a pcre_extra structure (or defaulted) was reached. See the -description above. -
      -  PCRE_ERROR_BADNEWLINE     (-23)
      -
      -An invalid combination of PCRE_NEWLINE_xxx options was given. -
      -  PCRE_ERROR_BADOFFSET      (-24)
      -
      -The value of startoffset was negative or greater than the length of the -subject, that is, the value in length. -
      -  PCRE_ERROR_SHORTUTF8      (-25)
      -
      -This error is returned instead of PCRE_ERROR_BADUTF8 when the subject string -ends with a truncated UTF-8 character and the PCRE_PARTIAL_HARD option is set. -Information about the failure is returned as for PCRE_ERROR_BADUTF8. It is in -fact sufficient to detect this case, but this special error code for -PCRE_PARTIAL_HARD precedes the implementation of returned information; it is -retained for backwards compatibility. -
      -  PCRE_ERROR_RECURSELOOP    (-26)
      -
      -This error is returned when pcre_exec() detects a recursion loop within -the pattern. Specifically, it means that either the whole pattern or a -subpattern has been called recursively for the second time at the same position -in the subject string. Some simple patterns that might do this are detected and -faulted at compile time, but more complicated cases, in particular mutual -recursions between two different subpatterns, cannot be detected until run -time. -
      -  PCRE_ERROR_JIT_STACKLIMIT (-27)
      -
      -This error is returned when a pattern that was successfully studied using a -JIT compile option is being matched, but the memory available for the -just-in-time processing stack is not large enough. See the -pcrejit -documentation for more details. -
      -  PCRE_ERROR_BADMODE        (-28)
      -
      -This error is given if a pattern that was compiled by the 8-bit library is -passed to a 16-bit or 32-bit library function, or vice versa. -
      -  PCRE_ERROR_BADENDIANNESS  (-29)
      -
      -This error is given if a pattern that was compiled and saved is reloaded on a -host with different endianness. The utility function -pcre_pattern_to_host_byte_order() can be used to convert such a pattern -so that it runs on the new host. -
      -  PCRE_ERROR_JIT_BADOPTION
      -
      -This error is returned when a pattern that was successfully studied using a JIT -compile option is being matched, but the matching mode (partial or complete -match) does not correspond to any JIT compilation mode. When the JIT fast path -function is used, this error may be also given for invalid options. See the -pcrejit -documentation for more details. -
      -  PCRE_ERROR_BADLENGTH      (-32)
      -
      -This error is given if pcre_exec() is called with a negative value for -the length argument. -

      -

      -Error numbers -16 to -20, -22, and 30 are not used by pcre_exec(). -

      -
      -Reason codes for invalid UTF-8 strings -
      -

      -This section applies only to the 8-bit library. The corresponding information -for the 16-bit and 32-bit libraries is given in the -pcre16 -and -pcre32 -pages. -

      -

      -When pcre_exec() returns either PCRE_ERROR_BADUTF8 or -PCRE_ERROR_SHORTUTF8, and the size of the output vector (ovecsize) is at -least 2, the offset of the start of the invalid UTF-8 character is placed in -the first output vector element (ovector[0]) and a reason code is placed -in the second element (ovector[1]). The reason codes are given names in -the pcre.h header file: -

      -  PCRE_UTF8_ERR1
      -  PCRE_UTF8_ERR2
      -  PCRE_UTF8_ERR3
      -  PCRE_UTF8_ERR4
      -  PCRE_UTF8_ERR5
      -
      -The string ends with a truncated UTF-8 character; the code specifies how many -bytes are missing (1 to 5). Although RFC 3629 restricts UTF-8 characters to be -no longer than 4 bytes, the encoding scheme (originally defined by RFC 2279) -allows for up to 6 bytes, and this is checked first; hence the possibility of -4 or 5 missing bytes. -
      -  PCRE_UTF8_ERR6
      -  PCRE_UTF8_ERR7
      -  PCRE_UTF8_ERR8
      -  PCRE_UTF8_ERR9
      -  PCRE_UTF8_ERR10
      -
      -The two most significant bits of the 2nd, 3rd, 4th, 5th, or 6th byte of the -character do not have the binary value 0b10 (that is, either the most -significant bit is 0, or the next bit is 1). -
      -  PCRE_UTF8_ERR11
      -  PCRE_UTF8_ERR12
      -
      -A character that is valid by the RFC 2279 rules is either 5 or 6 bytes long; -these code points are excluded by RFC 3629. -
      -  PCRE_UTF8_ERR13
      -
      -A 4-byte character has a value greater than 0x10fff; these code points are -excluded by RFC 3629. -
      -  PCRE_UTF8_ERR14
      -
      -A 3-byte character has a value in the range 0xd800 to 0xdfff; this range of -code points are reserved by RFC 3629 for use with UTF-16, and so are excluded -from UTF-8. -
      -  PCRE_UTF8_ERR15
      -  PCRE_UTF8_ERR16
      -  PCRE_UTF8_ERR17
      -  PCRE_UTF8_ERR18
      -  PCRE_UTF8_ERR19
      -
      -A 2-, 3-, 4-, 5-, or 6-byte character is "overlong", that is, it codes for a -value that can be represented by fewer bytes, which is invalid. For example, -the two bytes 0xc0, 0xae give the value 0x2e, whose correct coding uses just -one byte. -
      -  PCRE_UTF8_ERR20
      -
      -The two most significant bits of the first byte of a character have the binary -value 0b10 (that is, the most significant bit is 1 and the second is 0). Such a -byte can only validly occur as the second or subsequent byte of a multi-byte -character. -
      -  PCRE_UTF8_ERR21
      -
      -The first byte of a character has the value 0xfe or 0xff. These values can -never occur in a valid UTF-8 string. -
      -  PCRE_UTF8_ERR22
      -
      -This error code was formerly used when the presence of a so-called -"non-character" caused an error. Unicode corrigendum #9 makes it clear that -such characters should not cause a string to be rejected, and so this code is -no longer in use and is never returned. -

      -
      EXTRACTING CAPTURED SUBSTRINGS BY NUMBER
      -

      -int pcre_copy_substring(const char *subject, int *ovector, - int stringcount, int stringnumber, char *buffer, - int buffersize); -
      -
      -int pcre_get_substring(const char *subject, int *ovector, - int stringcount, int stringnumber, - const char **stringptr); -
      -
      -int pcre_get_substring_list(const char *subject, - int *ovector, int stringcount, const char ***listptr); -

      -

      -Captured substrings can be accessed directly by using the offsets returned by -pcre_exec() in ovector. For convenience, the functions -pcre_copy_substring(), pcre_get_substring(), and -pcre_get_substring_list() are provided for extracting captured substrings -as new, separate, zero-terminated strings. These functions identify substrings -by number. The next section describes functions for extracting named -substrings. -

      -

      -A substring that contains a binary zero is correctly extracted and has a -further zero added on the end, but the result is not, of course, a C string. -However, you can process such a string by referring to the length that is -returned by pcre_copy_substring() and pcre_get_substring(). -Unfortunately, the interface to pcre_get_substring_list() is not adequate -for handling strings containing binary zeros, because the end of the final -string is not independently indicated. -

      -

      -The first three arguments are the same for all three of these functions: -subject is the subject string that has just been successfully matched, -ovector is a pointer to the vector of integer offsets that was passed to -pcre_exec(), and stringcount is the number of substrings that were -captured by the match, including the substring that matched the entire regular -expression. This is the value returned by pcre_exec() if it is greater -than zero. If pcre_exec() returned zero, indicating that it ran out of -space in ovector, the value passed as stringcount should be the -number of elements in the vector divided by three. -

      -

      -The functions pcre_copy_substring() and pcre_get_substring() -extract a single substring, whose number is given as stringnumber. A -value of zero extracts the substring that matched the entire pattern, whereas -higher values extract the captured substrings. For pcre_copy_substring(), -the string is placed in buffer, whose length is given by -buffersize, while for pcre_get_substring() a new block of memory is -obtained via pcre_malloc, and its address is returned via -stringptr. The yield of the function is the length of the string, not -including the terminating zero, or one of these error codes: -

      -  PCRE_ERROR_NOMEMORY       (-6)
      -
      -The buffer was too small for pcre_copy_substring(), or the attempt to get -memory failed for pcre_get_substring(). -
      -  PCRE_ERROR_NOSUBSTRING    (-7)
      -
      -There is no substring whose number is stringnumber. -

      -

      -The pcre_get_substring_list() function extracts all available substrings -and builds a list of pointers to them. All this is done in a single block of -memory that is obtained via pcre_malloc. The address of the memory block -is returned via listptr, which is also the start of the list of string -pointers. The end of the list is marked by a NULL pointer. The yield of the -function is zero if all went well, or the error code -

      -  PCRE_ERROR_NOMEMORY       (-6)
      -
      -if the attempt to get the memory block failed. -

      -

      -When any of these functions encounter a substring that is unset, which can -happen when capturing subpattern number n+1 matches some part of the -subject, but subpattern n has not been used at all, they return an empty -string. This can be distinguished from a genuine zero-length substring by -inspecting the appropriate offset in ovector, which is negative for unset -substrings. -

      -

      -The two convenience functions pcre_free_substring() and -pcre_free_substring_list() can be used to free the memory returned by -a previous call of pcre_get_substring() or -pcre_get_substring_list(), respectively. They do nothing more than call -the function pointed to by pcre_free, which of course could be called -directly from a C program. However, PCRE is used in some situations where it is -linked via a special interface to another programming language that cannot use -pcre_free directly; it is for these cases that the functions are -provided. -

      -
      EXTRACTING CAPTURED SUBSTRINGS BY NAME
      -

      -int pcre_get_stringnumber(const pcre *code, - const char *name); -
      -
      -int pcre_copy_named_substring(const pcre *code, - const char *subject, int *ovector, - int stringcount, const char *stringname, - char *buffer, int buffersize); -
      -
      -int pcre_get_named_substring(const pcre *code, - const char *subject, int *ovector, - int stringcount, const char *stringname, - const char **stringptr); -

      -

      -To extract a substring by name, you first have to find associated number. -For example, for this pattern -

      -  (a+)b(?<xxx>\d+)...
      -
      -the number of the subpattern called "xxx" is 2. If the name is known to be -unique (PCRE_DUPNAMES was not set), you can find the number from the name by -calling pcre_get_stringnumber(). The first argument is the compiled -pattern, and the second is the name. The yield of the function is the -subpattern number, or PCRE_ERROR_NOSUBSTRING (-7) if there is no subpattern of -that name. -

      -

      -Given the number, you can extract the substring directly, or use one of the -functions described in the previous section. For convenience, there are also -two functions that do the whole job. -

      -

      -Most of the arguments of pcre_copy_named_substring() and -pcre_get_named_substring() are the same as those for the similarly named -functions that extract by number. As these are described in the previous -section, they are not re-described here. There are just two differences: -

      -

      -First, instead of a substring number, a substring name is given. Second, there -is an extra argument, given at the start, which is a pointer to the compiled -pattern. This is needed in order to gain access to the name-to-number -translation table. -

      -

      -These functions call pcre_get_stringnumber(), and if it succeeds, they -then call pcre_copy_substring() or pcre_get_substring(), as -appropriate. NOTE: If PCRE_DUPNAMES is set and there are duplicate names, -the behaviour may not be what you want (see the next section). -

      -

      -Warning: If the pattern uses the (?| feature to set up multiple -subpatterns with the same number, as described in the -section on duplicate subpattern numbers -in the -pcrepattern -page, you cannot use names to distinguish the different subpatterns, because -names are not included in the compiled code. The matching process uses only -numbers. For this reason, the use of different names for subpatterns of the -same number causes an error at compile time. -

      -
      DUPLICATE SUBPATTERN NAMES
      -

      -int pcre_get_stringtable_entries(const pcre *code, - const char *name, char **first, char **last); -

      -

      -When a pattern is compiled with the PCRE_DUPNAMES option, names for subpatterns -are not required to be unique. (Duplicate names are always allowed for -subpatterns with the same number, created by using the (?| feature. Indeed, if -such subpatterns are named, they are required to use the same names.) -

      -

      -Normally, patterns with duplicate names are such that in any one match, only -one of the named subpatterns participates. An example is shown in the -pcrepattern -documentation. -

      -

      -When duplicates are present, pcre_copy_named_substring() and -pcre_get_named_substring() return the first substring corresponding to -the given name that is set. If none are set, PCRE_ERROR_NOSUBSTRING (-7) is -returned; no data is returned. The pcre_get_stringnumber() function -returns one of the numbers that are associated with the name, but it is not -defined which it is. -

      -

      -If you want to get full details of all captured substrings for a given name, -you must use the pcre_get_stringtable_entries() function. The first -argument is the compiled pattern, and the second is the name. The third and -fourth are pointers to variables which are updated by the function. After it -has run, they point to the first and last entries in the name-to-number table -for the given name. The function itself returns the length of each entry, or -PCRE_ERROR_NOSUBSTRING (-7) if there are none. The format of the table is -described above in the section entitled Information about a pattern -above. -Given all the relevant entries for the name, you can extract each of their -numbers, and hence the captured data, if any. -

      -
      FINDING ALL POSSIBLE MATCHES
      -

      -The traditional matching function uses a similar algorithm to Perl, which stops -when it finds the first match, starting at a given point in the subject. If you -want to find all possible matches, or the longest possible match, consider -using the alternative matching function (see below) instead. If you cannot use -the alternative function, but still need to find all possible matches, you -can kludge it up by making use of the callout facility, which is described in -the -pcrecallout -documentation. -

      -

      -What you have to do is to insert a callout right at the end of the pattern. -When your callout function is called, extract and save the current matched -substring. Then return 1, which forces pcre_exec() to backtrack and try -other alternatives. Ultimately, when it runs out of matches, pcre_exec() -will yield PCRE_ERROR_NOMATCH. -

      -
      OBTAINING AN ESTIMATE OF STACK USAGE
      -

      -Matching certain patterns using pcre_exec() can use a lot of process -stack, which in certain environments can be rather limited in size. Some users -find it helpful to have an estimate of the amount of stack that is used by -pcre_exec(), to help them set recursion limits, as described in the -pcrestack -documentation. The estimate that is output by pcretest when called with -the -m and -C options is obtained by calling pcre_exec with -the values NULL, NULL, NULL, -999, and -999 for its first five arguments. -

      -

      -Normally, if its first argument is NULL, pcre_exec() immediately returns -the negative error code PCRE_ERROR_NULL, but with this special combination of -arguments, it returns instead a negative number whose absolute value is the -approximate stack frame size in bytes. (A negative number is used so that it is -clear that no match has happened.) The value is approximate because in some -cases, recursive calls to pcre_exec() occur when there are one or two -additional variables on the stack. -

      -

      -If PCRE has been compiled to use the heap instead of the stack for recursion, -the value returned is the size of each block that is obtained from the heap. -

      -
      MATCHING A PATTERN: THE ALTERNATIVE FUNCTION
      -

      -int pcre_dfa_exec(const pcre *code, const pcre_extra *extra, - const char *subject, int length, int startoffset, - int options, int *ovector, int ovecsize, - int *workspace, int wscount); -

      -

      -The function pcre_dfa_exec() is called to match a subject string against -a compiled pattern, using a matching algorithm that scans the subject string -just once, and does not backtrack. This has different characteristics to the -normal algorithm, and is not compatible with Perl. Some of the features of PCRE -patterns are not supported. Nevertheless, there are times when this kind of -matching can be useful. For a discussion of the two matching algorithms, and a -list of features that pcre_dfa_exec() does not support, see the -pcrematching -documentation. -

      -

      -The arguments for the pcre_dfa_exec() function are the same as for -pcre_exec(), plus two extras. The ovector argument is used in a -different way, and this is described below. The other common arguments are used -in the same way as for pcre_exec(), so their description is not repeated -here. -

      -

      -The two additional arguments provide workspace for the function. The workspace -vector should contain at least 20 elements. It is used for keeping track of -multiple paths through the pattern tree. More workspace will be needed for -patterns and subjects where there are a lot of potential matches. -

      -

      -Here is an example of a simple call to pcre_dfa_exec(): -

      -  int rc;
      -  int ovector[10];
      -  int wspace[20];
      -  rc = pcre_dfa_exec(
      -    re,             /* result of pcre_compile() */
      -    NULL,           /* we didn't study the pattern */
      -    "some string",  /* the subject string */
      -    11,             /* the length of the subject string */
      -    0,              /* start at offset 0 in the subject */
      -    0,              /* default options */
      -    ovector,        /* vector of integers for substring information */
      -    10,             /* number of elements (NOT size in bytes) */
      -    wspace,         /* working space vector */
      -    20);            /* number of elements (NOT size in bytes) */
      -
      -

      -
      -Option bits for pcre_dfa_exec() -
      -

      -The unused bits of the options argument for pcre_dfa_exec() must be -zero. The only bits that may be set are PCRE_ANCHORED, PCRE_NEWLINE_xxx, -PCRE_NOTBOL, PCRE_NOTEOL, PCRE_NOTEMPTY, PCRE_NOTEMPTY_ATSTART, -PCRE_NO_UTF8_CHECK, PCRE_BSR_ANYCRLF, PCRE_BSR_UNICODE, PCRE_NO_START_OPTIMIZE, -PCRE_PARTIAL_HARD, PCRE_PARTIAL_SOFT, PCRE_DFA_SHORTEST, and PCRE_DFA_RESTART. -All but the last four of these are exactly the same as for pcre_exec(), -so their description is not repeated here. -

      -  PCRE_PARTIAL_HARD
      -  PCRE_PARTIAL_SOFT
      -
      -These have the same general effect as they do for pcre_exec(), but the -details are slightly different. When PCRE_PARTIAL_HARD is set for -pcre_dfa_exec(), it returns PCRE_ERROR_PARTIAL if the end of the subject -is reached and there is still at least one matching possibility that requires -additional characters. This happens even if some complete matches have also -been found. When PCRE_PARTIAL_SOFT is set, the return code PCRE_ERROR_NOMATCH -is converted into PCRE_ERROR_PARTIAL if the end of the subject is reached, -there have been no complete matches, but there is still at least one matching -possibility. The portion of the string that was inspected when the longest -partial match was found is set as the first matching string in both cases. -There is a more detailed discussion of partial and multi-segment matching, with -examples, in the -pcrepartial -documentation. -
      -  PCRE_DFA_SHORTEST
      -
      -Setting the PCRE_DFA_SHORTEST option causes the matching algorithm to stop as -soon as it has found one match. Because of the way the alternative algorithm -works, this is necessarily the shortest possible match at the first possible -matching point in the subject string. -
      -  PCRE_DFA_RESTART
      -
      -When pcre_dfa_exec() returns a partial match, it is possible to call it -again, with additional subject characters, and have it continue with the same -match. The PCRE_DFA_RESTART option requests this action; when it is set, the -workspace and wscount options must reference the same vector as -before because data about the match so far is left in them after a partial -match. There is more discussion of this facility in the -pcrepartial -documentation. -

      -
      -Successful returns from pcre_dfa_exec() -
      -

      -When pcre_dfa_exec() succeeds, it may have matched more than one -substring in the subject. Note, however, that all the matches from one run of -the function start at the same point in the subject. The shorter matches are -all initial substrings of the longer matches. For example, if the pattern -

      -  <.*>
      -
      -is matched against the string -
      -  This is <something> <something else> <something further> no more
      -
      -the three matched strings are -
      -  <something>
      -  <something> <something else>
      -  <something> <something else> <something further>
      -
      -On success, the yield of the function is a number greater than zero, which is -the number of matched substrings. The substrings themselves are returned in -ovector. Each string uses two elements; the first is the offset to the -start, and the second is the offset to the end. In fact, all the strings have -the same start offset. (Space could have been saved by giving this only once, -but it was decided to retain some compatibility with the way pcre_exec() -returns data, even though the meaning of the strings is different.) -

      -

      -The strings are returned in reverse order of length; that is, the longest -matching string is given first. If there were too many matches to fit into -ovector, the yield of the function is zero, and the vector is filled with -the longest matches. Unlike pcre_exec(), pcre_dfa_exec() can use -the entire ovector for returning matched strings. -

      -

      -NOTE: PCRE's "auto-possessification" optimization usually applies to character -repeats at the end of a pattern (as well as internally). For example, the -pattern "a\d+" is compiled as if it were "a\d++" because there is no point -even considering the possibility of backtracking into the repeated digits. For -DFA matching, this means that only one possible match is found. If you really -do want multiple matches in such cases, either use an ungreedy repeat -("a\d+?") or set the PCRE_NO_AUTO_POSSESS option when compiling. -

      -
      -Error returns from pcre_dfa_exec() -
      -

      -The pcre_dfa_exec() function returns a negative number when it fails. -Many of the errors are the same as for pcre_exec(), and these are -described -above. -There are in addition the following errors that are specific to -pcre_dfa_exec(): -

      -  PCRE_ERROR_DFA_UITEM      (-16)
      -
      -This return is given if pcre_dfa_exec() encounters an item in the pattern -that it does not support, for instance, the use of \C or a back reference. -
      -  PCRE_ERROR_DFA_UCOND      (-17)
      -
      -This return is given if pcre_dfa_exec() encounters a condition item that -uses a back reference for the condition, or a test for recursion in a specific -group. These are not supported. -
      -  PCRE_ERROR_DFA_UMLIMIT    (-18)
      -
      -This return is given if pcre_dfa_exec() is called with an extra -block that contains a setting of the match_limit or -match_limit_recursion fields. This is not supported (these fields are -meaningless for DFA matching). -
      -  PCRE_ERROR_DFA_WSSIZE     (-19)
      -
      -This return is given if pcre_dfa_exec() runs out of space in the -workspace vector. -
      -  PCRE_ERROR_DFA_RECURSE    (-20)
      -
      -When a recursive subpattern is processed, the matching function calls itself -recursively, using private vectors for ovector and workspace. This -error is given if the output vector is not large enough. This should be -extremely rare, as a vector of size 1000 is used. -
      -  PCRE_ERROR_DFA_BADRESTART (-30)
      -
      -When pcre_dfa_exec() is called with the PCRE_DFA_RESTART option, -some plausibility checks are made on the contents of the workspace, which -should contain data about the previous partial match. If any of these checks -fail, this error is given. -

      -
      SEE ALSO
      -

      -pcre16(3), pcre32(3), pcrebuild(3), pcrecallout(3), -pcrecpp(3)(3), pcrematching(3), pcrepartial(3), -pcreposix(3), pcreprecompile(3), pcresample(3), -pcrestack(3). -

      -
      AUTHOR
      -

      -Philip Hazel -
      -University Computing Service -
      -Cambridge CB2 3QH, England. -
      -

      -
      REVISION
      -

      -Last updated: 18 December 2015 -
      -Copyright © 1997-2015 University of Cambridge. -
      -

      -Return to the PCRE index page. -

      diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcrebuild.html b/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcrebuild.html deleted file mode 100644 index 03c8cbe0..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcrebuild.html +++ /dev/null @@ -1,534 +0,0 @@ - - -pcrebuild specification - - -

      pcrebuild man page

      -

      -Return to the PCRE index page. -

      -

      -This page is part of the PCRE HTML documentation. It was generated automatically -from the original man page. If there is any nonsense in it, please consult the -man page, in case the conversion went wrong. -
      -

      -
      BUILDING PCRE
      -

      -PCRE is distributed with a configure script that can be used to build the -library in Unix-like environments using the applications known as Autotools. -Also in the distribution are files to support building using CMake -instead of configure. The text file -README -contains general information about building with Autotools (some of which is -repeated below), and also has some comments about building on various operating -systems. There is a lot more information about building PCRE without using -Autotools (including information about using CMake and building "by -hand") in the text file called -NON-AUTOTOOLS-BUILD. -You should consult this file as well as the -README -file if you are building in a non-Unix-like environment. -

      -
      PCRE BUILD-TIME OPTIONS
      -

      -The rest of this document describes the optional features of PCRE that can be -selected when the library is compiled. It assumes use of the configure -script, where the optional features are selected or deselected by providing -options to configure before running the make command. However, the -same options can be selected in both Unix-like and non-Unix-like environments -using the GUI facility of cmake-gui if you are using CMake instead -of configure to build PCRE. -

      -

      -If you are not using Autotools or CMake, option selection can be done by -editing the config.h file, or by passing parameter settings to the -compiler, as described in -NON-AUTOTOOLS-BUILD. -

      -

      -The complete list of options for configure (which includes the standard -ones such as the selection of the installation directory) can be obtained by -running -

      -  ./configure --help
      -
      -The following sections include descriptions of options whose names begin with ---enable or --disable. These settings specify changes to the defaults for the -configure command. Because of the way that configure works, ---enable and --disable always come in pairs, so the complementary option always -exists as well, but as it specifies the default, it is not described. -

      -
      BUILDING 8-BIT, 16-BIT AND 32-BIT LIBRARIES
      -

      -By default, a library called libpcre is built, containing functions that -take string arguments contained in vectors of bytes, either as single-byte -characters, or interpreted as UTF-8 strings. You can also build a separate -library, called libpcre16, in which strings are contained in vectors of -16-bit data units and interpreted either as single-unit characters or UTF-16 -strings, by adding -

      -  --enable-pcre16
      -
      -to the configure command. You can also build yet another separate -library, called libpcre32, in which strings are contained in vectors of -32-bit data units and interpreted either as single-unit characters or UTF-32 -strings, by adding -
      -  --enable-pcre32
      -
      -to the configure command. If you do not want the 8-bit library, add -
      -  --disable-pcre8
      -
      -as well. At least one of the three libraries must be built. Note that the C++ -and POSIX wrappers are for the 8-bit library only, and that pcregrep is -an 8-bit program. None of these are built if you select only the 16-bit or -32-bit libraries. -

      -
      BUILDING SHARED AND STATIC LIBRARIES
      -

      -The Autotools PCRE building process uses libtool to build both shared and -static libraries by default. You can suppress one of these by adding one of -

      -  --disable-shared
      -  --disable-static
      -
      -to the configure command, as required. -

      -
      C++ SUPPORT
      -

      -By default, if the 8-bit library is being built, the configure script -will search for a C++ compiler and C++ header files. If it finds them, it -automatically builds the C++ wrapper library (which supports only 8-bit -strings). You can disable this by adding -

      -  --disable-cpp
      -
      -to the configure command. -

      -
      UTF-8, UTF-16 AND UTF-32 SUPPORT
      -

      -To build PCRE with support for UTF Unicode character strings, add -

      -  --enable-utf
      -
      -to the configure command. This setting applies to all three libraries, -adding support for UTF-8 to the 8-bit library, support for UTF-16 to the 16-bit -library, and support for UTF-32 to the to the 32-bit library. There are no -separate options for enabling UTF-8, UTF-16 and UTF-32 independently because -that would allow ridiculous settings such as requesting UTF-16 support while -building only the 8-bit library. It is not possible to build one library with -UTF support and another without in the same configuration. (For backwards -compatibility, --enable-utf8 is a synonym of --enable-utf.) -

      -

      -Of itself, this setting does not make PCRE treat strings as UTF-8, UTF-16 or -UTF-32. As well as compiling PCRE with this option, you also have have to set -the PCRE_UTF8, PCRE_UTF16 or PCRE_UTF32 option (as appropriate) when you call -one of the pattern compiling functions. -

      -

      -If you set --enable-utf when compiling in an EBCDIC environment, PCRE expects -its input to be either ASCII or UTF-8 (depending on the run-time option). It is -not possible to support both EBCDIC and UTF-8 codes in the same version of the -library. Consequently, --enable-utf and --enable-ebcdic are mutually -exclusive. -

      -
      UNICODE CHARACTER PROPERTY SUPPORT
      -

      -UTF support allows the libraries to process character codepoints up to 0x10ffff -in the strings that they handle. On its own, however, it does not provide any -facilities for accessing the properties of such characters. If you want to be -able to use the pattern escapes \P, \p, and \X, which refer to Unicode -character properties, you must add -

      -  --enable-unicode-properties
      -
      -to the configure command. This implies UTF support, even if you have -not explicitly requested it. -

      -

      -Including Unicode property support adds around 30K of tables to the PCRE -library. Only the general category properties such as Lu and Nd are -supported. Details are given in the -pcrepattern -documentation. -

      -
      JUST-IN-TIME COMPILER SUPPORT
      -

      -Just-in-time compiler support is included in the build by specifying -

      -  --enable-jit
      -
      -This support is available only for certain hardware architectures. If this -option is set for an unsupported architecture, a compile time error occurs. -See the -pcrejit -documentation for a discussion of JIT usage. When JIT support is enabled, -pcregrep automatically makes use of it, unless you add -
      -  --disable-pcregrep-jit
      -
      -to the "configure" command. -

      -
      CODE VALUE OF NEWLINE
      -

      -By default, PCRE interprets the linefeed (LF) character as indicating the end -of a line. This is the normal newline character on Unix-like systems. You can -compile PCRE to use carriage return (CR) instead, by adding -

      -  --enable-newline-is-cr
      -
      -to the configure command. There is also a --enable-newline-is-lf option, -which explicitly specifies linefeed as the newline character. -
      -
      -Alternatively, you can specify that line endings are to be indicated by the two -character sequence CRLF. If you want this, add -
      -  --enable-newline-is-crlf
      -
      -to the configure command. There is a fourth option, specified by -
      -  --enable-newline-is-anycrlf
      -
      -which causes PCRE to recognize any of the three sequences CR, LF, or CRLF as -indicating a line ending. Finally, a fifth option, specified by -
      -  --enable-newline-is-any
      -
      -causes PCRE to recognize any Unicode newline sequence. -

      -

      -Whatever line ending convention is selected when PCRE is built can be -overridden when the library functions are called. At build time it is -conventional to use the standard for your operating system. -

      -
      WHAT \R MATCHES
      -

      -By default, the sequence \R in a pattern matches any Unicode newline sequence, -whatever has been selected as the line ending sequence. If you specify -

      -  --enable-bsr-anycrlf
      -
      -the default is changed so that \R matches only CR, LF, or CRLF. Whatever is -selected when PCRE is built can be overridden when the library functions are -called. -

      -
      POSIX MALLOC USAGE
      -

      -When the 8-bit library is called through the POSIX interface (see the -pcreposix -documentation), additional working storage is required for holding the pointers -to capturing substrings, because PCRE requires three integers per substring, -whereas the POSIX interface provides only two. If the number of expected -substrings is small, the wrapper function uses space on the stack, because this -is faster than using malloc() for each call. The default threshold above -which the stack is no longer used is 10; it can be changed by adding a setting -such as -

      -  --with-posix-malloc-threshold=20
      -
      -to the configure command. -

      -
      HANDLING VERY LARGE PATTERNS
      -

      -Within a compiled pattern, offset values are used to point from one part to -another (for example, from an opening parenthesis to an alternation -metacharacter). By default, in the 8-bit and 16-bit libraries, two-byte values -are used for these offsets, leading to a maximum size for a compiled pattern of -around 64K. This is sufficient to handle all but the most gigantic patterns. -Nevertheless, some people do want to process truly enormous patterns, so it is -possible to compile PCRE to use three-byte or four-byte offsets by adding a -setting such as -

      -  --with-link-size=3
      -
      -to the configure command. The value given must be 2, 3, or 4. For the -16-bit library, a value of 3 is rounded up to 4. In these libraries, using -longer offsets slows down the operation of PCRE because it has to load -additional data when handling them. For the 32-bit library the value is always -4 and cannot be overridden; the value of --with-link-size is ignored. -

      -
      AVOIDING EXCESSIVE STACK USAGE
      -

      -When matching with the pcre_exec() function, PCRE implements backtracking -by making recursive calls to an internal function called match(). In -environments where the size of the stack is limited, this can severely limit -PCRE's operation. (The Unix environment does not usually suffer from this -problem, but it may sometimes be necessary to increase the maximum stack size. -There is a discussion in the -pcrestack -documentation.) An alternative approach to recursion that uses memory from the -heap to remember data, instead of using recursive function calls, has been -implemented to work round the problem of limited stack size. If you want to -build a version of PCRE that works this way, add -

      -  --disable-stack-for-recursion
      -
      -to the configure command. With this configuration, PCRE will use the -pcre_stack_malloc and pcre_stack_free variables to call memory -management functions. By default these point to malloc() and -free(), but you can replace the pointers so that your own functions are -used instead. -

      -

      -Separate functions are provided rather than using pcre_malloc and -pcre_free because the usage is very predictable: the block sizes -requested are always the same, and the blocks are always freed in reverse -order. A calling program might be able to implement optimized functions that -perform better than malloc() and free(). PCRE runs noticeably more -slowly when built in this way. This option affects only the pcre_exec() -function; it is not relevant for pcre_dfa_exec(). -

      -
      LIMITING PCRE RESOURCE USAGE
      -

      -Internally, PCRE has a function called match(), which it calls repeatedly -(sometimes recursively) when matching a pattern with the pcre_exec() -function. By controlling the maximum number of times this function may be -called during a single matching operation, a limit can be placed on the -resources used by a single call to pcre_exec(). The limit can be changed -at run time, as described in the -pcreapi -documentation. The default is 10 million, but this can be changed by adding a -setting such as -

      -  --with-match-limit=500000
      -
      -to the configure command. This setting has no effect on the -pcre_dfa_exec() matching function. -

      -

      -In some environments it is desirable to limit the depth of recursive calls of -match() more strictly than the total number of calls, in order to -restrict the maximum amount of stack (or heap, if --disable-stack-for-recursion -is specified) that is used. A second limit controls this; it defaults to the -value that is set for --with-match-limit, which imposes no additional -constraints. However, you can set a lower limit by adding, for example, -

      -  --with-match-limit-recursion=10000
      -
      -to the configure command. This value can also be overridden at run time. -

      -
      CREATING CHARACTER TABLES AT BUILD TIME
      -

      -PCRE uses fixed tables for processing characters whose code values are less -than 256. By default, PCRE is built with a set of tables that are distributed -in the file pcre_chartables.c.dist. These tables are for ASCII codes -only. If you add -

      -  --enable-rebuild-chartables
      -
      -to the configure command, the distributed tables are no longer used. -Instead, a program called dftables is compiled and run. This outputs the -source for new set of tables, created in the default locale of your C run-time -system. (This method of replacing the tables does not work if you are cross -compiling, because dftables is run on the local host. If you need to -create alternative tables when cross compiling, you will have to do so "by -hand".) -

      -
      USING EBCDIC CODE
      -

      -PCRE assumes by default that it will run in an environment where the character -code is ASCII (or Unicode, which is a superset of ASCII). This is the case for -most computer operating systems. PCRE can, however, be compiled to run in an -EBCDIC environment by adding -

      -  --enable-ebcdic
      -
      -to the configure command. This setting implies ---enable-rebuild-chartables. You should only use it if you know that you are in -an EBCDIC environment (for example, an IBM mainframe operating system). The ---enable-ebcdic option is incompatible with --enable-utf. -

      -

      -The EBCDIC character that corresponds to an ASCII LF is assumed to have the -value 0x15 by default. However, in some EBCDIC environments, 0x25 is used. In -such an environment you should use -

      -  --enable-ebcdic-nl25
      -
      -as well as, or instead of, --enable-ebcdic. The EBCDIC character for CR has the -same value as in ASCII, namely, 0x0d. Whichever of 0x15 and 0x25 is not -chosen as LF is made to correspond to the Unicode NEL character (which, in -Unicode, is 0x85). -

      -

      -The options that select newline behaviour, such as --enable-newline-is-cr, -and equivalent run-time options, refer to these character values in an EBCDIC -environment. -

      -
      PCREGREP OPTIONS FOR COMPRESSED FILE SUPPORT
      -

      -By default, pcregrep reads all files as plain text. You can build it so -that it recognizes files whose names end in .gz or .bz2, and reads -them with libz or libbz2, respectively, by adding one or both of -

      -  --enable-pcregrep-libz
      -  --enable-pcregrep-libbz2
      -
      -to the configure command. These options naturally require that the -relevant libraries are installed on your system. Configuration will fail if -they are not. -

      -
      PCREGREP BUFFER SIZE
      -

      -pcregrep uses an internal buffer to hold a "window" on the file it is -scanning, in order to be able to output "before" and "after" lines when it -finds a match. The size of the buffer is controlled by a parameter whose -default value is 20K. The buffer itself is three times this size, but because -of the way it is used for holding "before" lines, the longest line that is -guaranteed to be processable is the parameter size. You can change the default -parameter value by adding, for example, -

      -  --with-pcregrep-bufsize=50K
      -
      -to the configure command. The caller of \fPpcregrep\fP can, however, -override this value by specifying a run-time option. -

      -
      PCRETEST OPTION FOR LIBREADLINE SUPPORT
      -

      -If you add -

      -  --enable-pcretest-libreadline
      -
      -to the configure command, pcretest is linked with the -libreadline library, and when its input is from a terminal, it reads it -using the readline() function. This provides line-editing and history -facilities. Note that libreadline is GPL-licensed, so if you distribute a -binary of pcretest linked in this way, there may be licensing issues. -

      -

      -Setting this option causes the -lreadline option to be added to the -pcretest build. In many operating environments with a sytem-installed -libreadline this is sufficient. However, in some environments (e.g. -if an unmodified distribution version of readline is in use), some extra -configuration may be necessary. The INSTALL file for libreadline says -this: -

      -  "Readline uses the termcap functions, but does not link with the
      -  termcap or curses library itself, allowing applications which link
      -  with readline the to choose an appropriate library."
      -
      -If your environment has not been set up so that an appropriate library is -automatically included, you may need to add something like -
      -  LIBS="-ncurses"
      -
      -immediately before the configure command. -

      -
      DEBUGGING WITH VALGRIND SUPPORT
      -

      -By adding the -

      -  --enable-valgrind
      -
      -option to to the configure command, PCRE will use valgrind annotations -to mark certain memory regions as unaddressable. This allows it to detect -invalid memory accesses, and is mostly useful for debugging PCRE itself. -

      -
      CODE COVERAGE REPORTING
      -

      -If your C compiler is gcc, you can build a version of PCRE that can generate a -code coverage report for its test suite. To enable this, you must install -lcov version 1.6 or above. Then specify -

      -  --enable-coverage
      -
      -to the configure command and build PCRE in the usual way. -

      -

      -Note that using ccache (a caching C compiler) is incompatible with code -coverage reporting. If you have configured ccache to run automatically -on your system, you must set the environment variable -

      -  CCACHE_DISABLE=1
      -
      -before running make to build PCRE, so that ccache is not used. -

      -

      -When --enable-coverage is used, the following addition targets are added to the -Makefile: -

      -  make coverage
      -
      -This creates a fresh coverage report for the PCRE test suite. It is equivalent -to running "make coverage-reset", "make coverage-baseline", "make check", and -then "make coverage-report". -
      -  make coverage-reset
      -
      -This zeroes the coverage counters, but does nothing else. -
      -  make coverage-baseline
      -
      -This captures baseline coverage information. -
      -  make coverage-report
      -
      -This creates the coverage report. -
      -  make coverage-clean-report
      -
      -This removes the generated coverage report without cleaning the coverage data -itself. -
      -  make coverage-clean-data
      -
      -This removes the captured coverage data without removing the coverage files -created at compile time (*.gcno). -
      -  make coverage-clean
      -
      -This cleans all coverage data including the generated coverage report. For more -information about code coverage, see the gcov and lcov -documentation. -

      -
      SEE ALSO
      -

      -pcreapi(3), pcre16, pcre32, pcre_config(3). -

      -
      AUTHOR
      -

      -Philip Hazel -
      -University Computing Service -
      -Cambridge CB2 3QH, England. -
      -

      -
      REVISION
      -

      -Last updated: 12 May 2013 -
      -Copyright © 1997-2013 University of Cambridge. -
      -

      -Return to the PCRE index page. -

      diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcrecallout.html b/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcrecallout.html deleted file mode 100644 index 53a937f5..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcrecallout.html +++ /dev/null @@ -1,286 +0,0 @@ - - -pcrecallout specification - - -

      pcrecallout man page

      -

      -Return to the PCRE index page. -

      -

      -This page is part of the PCRE HTML documentation. It was generated automatically -from the original man page. If there is any nonsense in it, please consult the -man page, in case the conversion went wrong. -
      -

      -
      SYNOPSIS
      -

      -#include <pcre.h> -

      -

      -int (*pcre_callout)(pcre_callout_block *); -

      -

      -int (*pcre16_callout)(pcre16_callout_block *); -

      -

      -int (*pcre32_callout)(pcre32_callout_block *); -

      -
      DESCRIPTION
      -

      -PCRE provides a feature called "callout", which is a means of temporarily -passing control to the caller of PCRE in the middle of pattern matching. The -caller of PCRE provides an external function by putting its entry point in the -global variable pcre_callout (pcre16_callout for the 16-bit -library, pcre32_callout for the 32-bit library). By default, this -variable contains NULL, which disables all calling out. -

      -

      -Within a regular expression, (?C) indicates the points at which the external -function is to be called. Different callout points can be identified by putting -a number less than 256 after the letter C. The default value is zero. -For example, this pattern has two callout points: -

      -  (?C1)abc(?C2)def
      -
      -If the PCRE_AUTO_CALLOUT option bit is set when a pattern is compiled, PCRE -automatically inserts callouts, all with number 255, before each item in the -pattern. For example, if PCRE_AUTO_CALLOUT is used with the pattern -
      -  A(\d{2}|--)
      -
      -it is processed as if it were -
      -
      -(?C255)A(?C255)((?C255)\d{2}(?C255)|(?C255)-(?C255)-(?C255))(?C255) -
      -
      -Notice that there is a callout before and after each parenthesis and -alternation bar. If the pattern contains a conditional group whose condition is -an assertion, an automatic callout is inserted immediately before the -condition. Such a callout may also be inserted explicitly, for example: -
      -  (?(?C9)(?=a)ab|de)
      -
      -This applies only to assertion conditions (because they are themselves -independent groups). -

      -

      -Automatic callouts can be used for tracking the progress of pattern matching. -The -pcretest -program has a pattern qualifier (/C) that sets automatic callouts; when it is -used, the output indicates how the pattern is being matched. This is useful -information when you are trying to optimize the performance of a particular -pattern. -

      -
      MISSING CALLOUTS
      -

      -You should be aware that, because of optimizations in the way PCRE compiles and -matches patterns, callouts sometimes do not happen exactly as you might expect. -

      -

      -At compile time, PCRE "auto-possessifies" repeated items when it knows that -what follows cannot be part of the repeat. For example, a+[bc] is compiled as -if it were a++[bc]. The pcretest output when this pattern is anchored and -then applied with automatic callouts to the string "aaaa" is: -

      -  --->aaaa
      -   +0 ^        ^
      -   +1 ^        a+
      -   +3 ^   ^    [bc]
      -  No match
      -
      -This indicates that when matching [bc] fails, there is no backtracking into a+ -and therefore the callouts that would be taken for the backtracks do not occur. -You can disable the auto-possessify feature by passing PCRE_NO_AUTO_POSSESS -to pcre_compile(), or starting the pattern with (*NO_AUTO_POSSESS). If -this is done in pcretest (using the /O qualifier), the output changes to -this: -
      -  --->aaaa
      -   +0 ^        ^
      -   +1 ^        a+
      -   +3 ^   ^    [bc]
      -   +3 ^  ^     [bc]
      -   +3 ^ ^      [bc]
      -   +3 ^^       [bc]
      -  No match
      -
      -This time, when matching [bc] fails, the matcher backtracks into a+ and tries -again, repeatedly, until a+ itself fails. -

      -

      -Other optimizations that provide fast "no match" results also affect callouts. -For example, if the pattern is -

      -  ab(?C4)cd
      -
      -PCRE knows that any matching string must contain the letter "d". If the subject -string is "abyz", the lack of "d" means that matching doesn't ever start, and -the callout is never reached. However, with "abyd", though the result is still -no match, the callout is obeyed. -

      -

      -If the pattern is studied, PCRE knows the minimum length of a matching string, -and will immediately give a "no match" return without actually running a match -if the subject is not long enough, or, for unanchored patterns, if it has -been scanned far enough. -

      -

      -You can disable these optimizations by passing the PCRE_NO_START_OPTIMIZE -option to the matching function, or by starting the pattern with -(*NO_START_OPT). This slows down the matching process, but does ensure that -callouts such as the example above are obeyed. -

      -
      THE CALLOUT INTERFACE
      -

      -During matching, when PCRE reaches a callout point, the external function -defined by pcre_callout or pcre[16|32]_callout is called (if it is -set). This applies to both normal and DFA matching. The only argument to the -callout function is a pointer to a pcre_callout or -pcre[16|32]_callout block. These structures contains the following -fields: -

      -  int           version;
      -  int           callout_number;
      -  int          *offset_vector;
      -  const char   *subject;           (8-bit version)
      -  PCRE_SPTR16   subject;           (16-bit version)
      -  PCRE_SPTR32   subject;           (32-bit version)
      -  int           subject_length;
      -  int           start_match;
      -  int           current_position;
      -  int           capture_top;
      -  int           capture_last;
      -  void         *callout_data;
      -  int           pattern_position;
      -  int           next_item_length;
      -  const unsigned char *mark;       (8-bit version)
      -  const PCRE_UCHAR16  *mark;       (16-bit version)
      -  const PCRE_UCHAR32  *mark;       (32-bit version)
      -
      -The version field is an integer containing the version number of the -block format. The initial version was 0; the current version is 2. The version -number will change again in future if additional fields are added, but the -intention is never to remove any of the existing fields. -

      -

      -The callout_number field contains the number of the callout, as compiled -into the pattern (that is, the number after ?C for manual callouts, and 255 for -automatically generated callouts). -

      -

      -The offset_vector field is a pointer to the vector of offsets that was -passed by the caller to the matching function. When pcre_exec() or -pcre[16|32]_exec() is used, the contents can be inspected, in order to -extract substrings that have been matched so far, in the same way as for -extracting substrings after a match has completed. For the DFA matching -functions, this field is not useful. -

      -

      -The subject and subject_length fields contain copies of the values -that were passed to the matching function. -

      -

      -The start_match field normally contains the offset within the subject at -which the current match attempt started. However, if the escape sequence \K -has been encountered, this value is changed to reflect the modified starting -point. If the pattern is not anchored, the callout function may be called -several times from the same point in the pattern for different starting points -in the subject. -

      -

      -The current_position field contains the offset within the subject of the -current match pointer. -

      -

      -When the pcre_exec() or pcre[16|32]_exec() is used, the -capture_top field contains one more than the number of the highest -numbered captured substring so far. If no substrings have been captured, the -value of capture_top is one. This is always the case when the DFA -functions are used, because they do not support captured substrings. -

      -

      -The capture_last field contains the number of the most recently captured -substring. However, when a recursion exits, the value reverts to what it was -outside the recursion, as do the values of all captured substrings. If no -substrings have been captured, the value of capture_last is -1. This is -always the case for the DFA matching functions. -

      -

      -The callout_data field contains a value that is passed to a matching -function specifically so that it can be passed back in callouts. It is passed -in the callout_data field of a pcre_extra or pcre[16|32]_extra -data structure. If no such data was passed, the value of callout_data in -a callout block is NULL. There is a description of the pcre_extra -structure in the -pcreapi -documentation. -

      -

      -The pattern_position field is present from version 1 of the callout -structure. It contains the offset to the next item to be matched in the pattern -string. -

      -

      -The next_item_length field is present from version 1 of the callout -structure. It contains the length of the next item to be matched in the pattern -string. When the callout immediately precedes an alternation bar, a closing -parenthesis, or the end of the pattern, the length is zero. When the callout -precedes an opening parenthesis, the length is that of the entire subpattern. -

      -

      -The pattern_position and next_item_length fields are intended to -help in distinguishing between different automatic callouts, which all have the -same callout number. However, they are set for all callouts. -

      -

      -The mark field is present from version 2 of the callout structure. In -callouts from pcre_exec() or pcre[16|32]_exec() it contains a -pointer to the zero-terminated name of the most recently passed (*MARK), -(*PRUNE), or (*THEN) item in the match, or NULL if no such items have been -passed. Instances of (*PRUNE) or (*THEN) without a name do not obliterate a -previous (*MARK). In callouts from the DFA matching functions this field always -contains NULL. -

      -
      RETURN VALUES
      -

      -The external callout function returns an integer to PCRE. If the value is zero, -matching proceeds as normal. If the value is greater than zero, matching fails -at the current point, but the testing of other matching possibilities goes -ahead, just as if a lookahead assertion had failed. If the value is less than -zero, the match is abandoned, the matching function returns the negative value. -

      -

      -Negative values should normally be chosen from the set of PCRE_ERROR_xxx -values. In particular, PCRE_ERROR_NOMATCH forces a standard "no match" failure. -The error number PCRE_ERROR_CALLOUT is reserved for use by callout functions; -it will never be used by PCRE itself. -

      -
      AUTHOR
      -

      -Philip Hazel -
      -University Computing Service -
      -Cambridge CB2 3QH, England. -
      -

      -
      REVISION
      -

      -Last updated: 12 November 2013 -
      -Copyright © 1997-2013 University of Cambridge. -
      -

      -Return to the PCRE index page. -

      diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcrecompat.html b/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcrecompat.html deleted file mode 100644 index d95570ef..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcrecompat.html +++ /dev/null @@ -1,235 +0,0 @@ - - -pcrecompat specification - - -

      pcrecompat man page

      -

      -Return to the PCRE index page. -

      -

      -This page is part of the PCRE HTML documentation. It was generated automatically -from the original man page. If there is any nonsense in it, please consult the -man page, in case the conversion went wrong. -
      -
      -DIFFERENCES BETWEEN PCRE AND PERL -
      -

      -This document describes the differences in the ways that PCRE and Perl handle -regular expressions. The differences described here are with respect to Perl -versions 5.10 and above. -

      -

      -1. PCRE has only a subset of Perl's Unicode support. Details of what it does -have are given in the -pcreunicode -page. -

      -

      -2. PCRE allows repeat quantifiers only on parenthesized assertions, but they do -not mean what you might think. For example, (?!a){3} does not assert that the -next three characters are not "a". It just asserts that the next character is -not "a" three times (in principle: PCRE optimizes this to run the assertion -just once). Perl allows repeat quantifiers on other assertions such as \b, but -these do not seem to have any use. -

      -

      -3. Capturing subpatterns that occur inside negative lookahead assertions are -counted, but their entries in the offsets vector are never set. Perl sometimes -(but not always) sets its numerical variables from inside negative assertions. -

      -

      -4. Though binary zero characters are supported in the subject string, they are -not allowed in a pattern string because it is passed as a normal C string, -terminated by zero. The escape sequence \0 can be used in the pattern to -represent a binary zero. -

      -

      -5. The following Perl escape sequences are not supported: \l, \u, \L, -\U, and \N when followed by a character name or Unicode value. (\N on its -own, matching a non-newline character, is supported.) In fact these are -implemented by Perl's general string-handling and are not part of its pattern -matching engine. If any of these are encountered by PCRE, an error is -generated by default. However, if the PCRE_JAVASCRIPT_COMPAT option is set, -\U and \u are interpreted as JavaScript interprets them. -

      -

      -6. The Perl escape sequences \p, \P, and \X are supported only if PCRE is -built with Unicode character property support. The properties that can be -tested with \p and \P are limited to the general category properties such as -Lu and Nd, script names such as Greek or Han, and the derived properties Any -and L&. PCRE does support the Cs (surrogate) property, which Perl does not; the -Perl documentation says "Because Perl hides the need for the user to understand -the internal representation of Unicode characters, there is no need to -implement the somewhat messy concept of surrogates." -

      -

      -7. PCRE does support the \Q...\E escape for quoting substrings. Characters in -between are treated as literals. This is slightly different from Perl in that $ -and @ are also handled as literals inside the quotes. In Perl, they cause -variable interpolation (but of course PCRE does not have variables). Note the -following examples: -

      -    Pattern            PCRE matches      Perl matches
      -
      -    \Qabc$xyz\E        abc$xyz           abc followed by the contents of $xyz
      -    \Qabc\$xyz\E       abc\$xyz          abc\$xyz
      -    \Qabc\E\$\Qxyz\E   abc$xyz           abc$xyz
      -
      -The \Q...\E sequence is recognized both inside and outside character classes. -

      -

      -8. Fairly obviously, PCRE does not support the (?{code}) and (??{code}) -constructions. However, there is support for recursive patterns. This is not -available in Perl 5.8, but it is in Perl 5.10. Also, the PCRE "callout" -feature allows an external function to be called during pattern matching. See -the -pcrecallout -documentation for details. -

      -

      -9. Subpatterns that are called as subroutines (whether or not recursively) are -always treated as atomic groups in PCRE. This is like Python, but unlike Perl. -Captured values that are set outside a subroutine call can be reference from -inside in PCRE, but not in Perl. There is a discussion that explains these -differences in more detail in the -section on recursion differences from Perl -in the -pcrepattern -page. -

      -

      -10. If any of the backtracking control verbs are used in a subpattern that is -called as a subroutine (whether or not recursively), their effect is confined -to that subpattern; it does not extend to the surrounding pattern. This is not -always the case in Perl. In particular, if (*THEN) is present in a group that -is called as a subroutine, its action is limited to that group, even if the -group does not contain any | characters. Note that such subpatterns are -processed as anchored at the point where they are tested. -

      -

      -11. If a pattern contains more than one backtracking control verb, the first -one that is backtracked onto acts. For example, in the pattern -A(*COMMIT)B(*PRUNE)C a failure in B triggers (*COMMIT), but a failure in C -triggers (*PRUNE). Perl's behaviour is more complex; in many cases it is the -same as PCRE, but there are examples where it differs. -

      -

      -12. Most backtracking verbs in assertions have their normal actions. They are -not confined to the assertion. -

      -

      -13. There are some differences that are concerned with the settings of captured -strings when part of a pattern is repeated. For example, matching "aba" against -the pattern /^(a(b)?)+$/ in Perl leaves $2 unset, but in PCRE it is set to "b". -

      -

      -14. PCRE's handling of duplicate subpattern numbers and duplicate subpattern -names is not as general as Perl's. This is a consequence of the fact the PCRE -works internally just with numbers, using an external table to translate -between numbers and names. In particular, a pattern such as (?|(?<a>A)|(?<b>B), -where the two capturing parentheses have the same number but different names, -is not supported, and causes an error at compile time. If it were allowed, it -would not be possible to distinguish which parentheses matched, because both -names map to capturing subpattern number 1. To avoid this confusing situation, -an error is given at compile time. -

      -

      -15. Perl recognizes comments in some places that PCRE does not, for example, -between the ( and ? at the start of a subpattern. If the /x modifier is set, -Perl allows white space between ( and ? (though current Perls warn that this is -deprecated) but PCRE never does, even if the PCRE_EXTENDED option is set. -

      -

      -16. Perl, when in warning mode, gives warnings for character classes such as -[A-\d] or [a-[:digit:]]. It then treats the hyphens as literals. PCRE has no -warning features, so it gives an error in these cases because they are almost -certainly user mistakes. -

      -

      -17. In PCRE, the upper/lower case character properties Lu and Ll are not -affected when case-independent matching is specified. For example, \p{Lu} -always matches an upper case letter. I think Perl has changed in this respect; -in the release at the time of writing (5.16), \p{Lu} and \p{Ll} match all -letters, regardless of case, when case independence is specified. -

      -

      -18. PCRE provides some extensions to the Perl regular expression facilities. -Perl 5.10 includes new features that are not in earlier versions of Perl, some -of which (such as named parentheses) have been in PCRE for some time. This list -is with respect to Perl 5.10: -
      -
      -(a) Although lookbehind assertions in PCRE must match fixed length strings, -each alternative branch of a lookbehind assertion can match a different length -of string. Perl requires them all to have the same length. -
      -
      -(b) If PCRE_DOLLAR_ENDONLY is set and PCRE_MULTILINE is not set, the $ -meta-character matches only at the very end of the string. -
      -
      -(c) If PCRE_EXTRA is set, a backslash followed by a letter with no special -meaning is faulted. Otherwise, like Perl, the backslash is quietly ignored. -(Perl can be made to issue a warning.) -
      -
      -(d) If PCRE_UNGREEDY is set, the greediness of the repetition quantifiers is -inverted, that is, by default they are not greedy, but if followed by a -question mark they are. -
      -
      -(e) PCRE_ANCHORED can be used at matching time to force a pattern to be tried -only at the first matching position in the subject string. -
      -
      -(f) The PCRE_NOTBOL, PCRE_NOTEOL, PCRE_NOTEMPTY, PCRE_NOTEMPTY_ATSTART, and -PCRE_NO_AUTO_CAPTURE options for pcre_exec() have no Perl equivalents. -
      -
      -(g) The \R escape sequence can be restricted to match only CR, LF, or CRLF -by the PCRE_BSR_ANYCRLF option. -
      -
      -(h) The callout facility is PCRE-specific. -
      -
      -(i) The partial matching facility is PCRE-specific. -
      -
      -(j) Patterns compiled by PCRE can be saved and re-used at a later time, even on -different hosts that have the other endianness. However, this does not apply to -optimized data created by the just-in-time compiler. -
      -
      -(k) The alternative matching functions (pcre_dfa_exec(), -pcre16_dfa_exec() and pcre32_dfa_exec(),) match in a different way -and are not Perl-compatible. -
      -
      -(l) PCRE recognizes some special sequences such as (*CR) at the start of -a pattern that set overall options that cannot be changed within the pattern. -

      -
      -AUTHOR -
      -

      -Philip Hazel -
      -University Computing Service -
      -Cambridge CB2 3QH, England. -
      -

      -
      -REVISION -
      -

      -Last updated: 10 November 2013 -
      -Copyright © 1997-2013 University of Cambridge. -
      -

      -Return to the PCRE index page. -

      diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcrecpp.html b/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcrecpp.html deleted file mode 100644 index b7eac3a3..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcrecpp.html +++ /dev/null @@ -1,368 +0,0 @@ - - -pcrecpp specification - - -

      pcrecpp man page

      -

      -Return to the PCRE index page. -

      -

      -This page is part of the PCRE HTML documentation. It was generated automatically -from the original man page. If there is any nonsense in it, please consult the -man page, in case the conversion went wrong. -
      -

      -
      SYNOPSIS OF C++ WRAPPER
      -

      -#include <pcrecpp.h> -

      -
      DESCRIPTION
      -

      -The C++ wrapper for PCRE was provided by Google Inc. Some additional -functionality was added by Giuseppe Maxia. This brief man page was constructed -from the notes in the pcrecpp.h file, which should be consulted for -further details. Note that the C++ wrapper supports only the original 8-bit -PCRE library. There is no 16-bit or 32-bit support at present. -

      -
      MATCHING INTERFACE
      -

      -The "FullMatch" operation checks that supplied text matches a supplied pattern -exactly. If pointer arguments are supplied, it copies matched sub-strings that -match sub-patterns into them. -

      -  Example: successful match
      -     pcrecpp::RE re("h.*o");
      -     re.FullMatch("hello");
      -
      -  Example: unsuccessful match (requires full match):
      -     pcrecpp::RE re("e");
      -     !re.FullMatch("hello");
      -
      -  Example: creating a temporary RE object:
      -     pcrecpp::RE("h.*o").FullMatch("hello");
      -
      -You can pass in a "const char*" or a "string" for "text". The examples below -tend to use a const char*. You can, as in the different examples above, store -the RE object explicitly in a variable or use a temporary RE object. The -examples below use one mode or the other arbitrarily. Either could correctly be -used for any of these examples. -

      -

      -You must supply extra pointer arguments to extract matched subpieces. -

      -  Example: extracts "ruby" into "s" and 1234 into "i"
      -     int i;
      -     string s;
      -     pcrecpp::RE re("(\\w+):(\\d+)");
      -     re.FullMatch("ruby:1234", &s, &i);
      -
      -  Example: does not try to extract any extra sub-patterns
      -     re.FullMatch("ruby:1234", &s);
      -
      -  Example: does not try to extract into NULL
      -     re.FullMatch("ruby:1234", NULL, &i);
      -
      -  Example: integer overflow causes failure
      -     !re.FullMatch("ruby:1234567891234", NULL, &i);
      -
      -  Example: fails because there aren't enough sub-patterns:
      -     !pcrecpp::RE("\\w+:\\d+").FullMatch("ruby:1234", &s);
      -
      -  Example: fails because string cannot be stored in integer
      -     !pcrecpp::RE("(.*)").FullMatch("ruby", &i);
      -
      -The provided pointer arguments can be pointers to any scalar numeric -type, or one of: -
      -   string        (matched piece is copied to string)
      -   StringPiece   (StringPiece is mutated to point to matched piece)
      -   T             (where "bool T::ParseFrom(const char*, int)" exists)
      -   NULL          (the corresponding matched sub-pattern is not copied)
      -
      -The function returns true iff all of the following conditions are satisfied: -
      -  a. "text" matches "pattern" exactly;
      -
      -  b. The number of matched sub-patterns is >= number of supplied
      -     pointers;
      -
      -  c. The "i"th argument has a suitable type for holding the
      -     string captured as the "i"th sub-pattern. If you pass in
      -     void * NULL for the "i"th argument, or a non-void * NULL
      -     of the correct type, or pass fewer arguments than the
      -     number of sub-patterns, "i"th captured sub-pattern is
      -     ignored.
      -
      -CAVEAT: An optional sub-pattern that does not exist in the matched -string is assigned the empty string. Therefore, the following will -return false (because the empty string is not a valid number): -
      -   int number;
      -   pcrecpp::RE::FullMatch("abc", "[a-z]+(\\d+)?", &number);
      -
      -The matching interface supports at most 16 arguments per call. -If you need more, consider using the more general interface -pcrecpp::RE::DoMatch. See pcrecpp.h for the signature for -DoMatch. -

      -

      -NOTE: Do not use no_arg, which is used internally to mark the end of a -list of optional arguments, as a placeholder for missing arguments, as this can -lead to segfaults. -

      -
      QUOTING METACHARACTERS
      -

      -You can use the "QuoteMeta" operation to insert backslashes before all -potentially meaningful characters in a string. The returned string, used as a -regular expression, will exactly match the original string. -

      -  Example:
      -     string quoted = RE::QuoteMeta(unquoted);
      -
      -Note that it's legal to escape a character even if it has no special meaning in -a regular expression -- so this function does that. (This also makes it -identical to the perl function of the same name; see "perldoc -f quotemeta".) -For example, "1.5-2.0?" becomes "1\.5\-2\.0\?". -

      -
      PARTIAL MATCHES
      -

      -You can use the "PartialMatch" operation when you want the pattern -to match any substring of the text. -

      -  Example: simple search for a string:
      -     pcrecpp::RE("ell").PartialMatch("hello");
      -
      -  Example: find first number in a string:
      -     int number;
      -     pcrecpp::RE re("(\\d+)");
      -     re.PartialMatch("x*100 + 20", &number);
      -     assert(number == 100);
      -
      -

      -
      UTF-8 AND THE MATCHING INTERFACE
      -

      -By default, pattern and text are plain text, one byte per character. The UTF8 -flag, passed to the constructor, causes both pattern and string to be treated -as UTF-8 text, still a byte stream but potentially multiple bytes per -character. In practice, the text is likelier to be UTF-8 than the pattern, but -the match returned may depend on the UTF8 flag, so always use it when matching -UTF8 text. For example, "." will match one byte normally but with UTF8 set may -match up to three bytes of a multi-byte character. -

      -  Example:
      -     pcrecpp::RE_Options options;
      -     options.set_utf8();
      -     pcrecpp::RE re(utf8_pattern, options);
      -     re.FullMatch(utf8_string);
      -
      -  Example: using the convenience function UTF8():
      -     pcrecpp::RE re(utf8_pattern, pcrecpp::UTF8());
      -     re.FullMatch(utf8_string);
      -
      -NOTE: The UTF8 flag is ignored if pcre was not configured with the -
      -      --enable-utf8 flag.
      -
      -

      -
      PASSING MODIFIERS TO THE REGULAR EXPRESSION ENGINE
      -

      -PCRE defines some modifiers to change the behavior of the regular expression -engine. The C++ wrapper defines an auxiliary class, RE_Options, as a vehicle to -pass such modifiers to a RE class. Currently, the following modifiers are -supported: -

      -   modifier              description               Perl corresponding
      -
      -   PCRE_CASELESS         case insensitive match      /i
      -   PCRE_MULTILINE        multiple lines match        /m
      -   PCRE_DOTALL           dot matches newlines        /s
      -   PCRE_DOLLAR_ENDONLY   $ matches only at end       N/A
      -   PCRE_EXTRA            strict escape parsing       N/A
      -   PCRE_EXTENDED         ignore white spaces         /x
      -   PCRE_UTF8             handles UTF8 chars          built-in
      -   PCRE_UNGREEDY         reverses * and *?           N/A
      -   PCRE_NO_AUTO_CAPTURE  disables capturing parens   N/A (*)
      -
      -(*) Both Perl and PCRE allow non capturing parentheses by means of the -"?:" modifier within the pattern itself. e.g. (?:ab|cd) does not -capture, while (ab|cd) does. -

      -

      -For a full account on how each modifier works, please check the -PCRE API reference page. -

      -

      -For each modifier, there are two member functions whose name is made -out of the modifier in lowercase, without the "PCRE_" prefix. For -instance, PCRE_CASELESS is handled by -

      -  bool caseless()
      -
      -which returns true if the modifier is set, and -
      -  RE_Options & set_caseless(bool)
      -
      -which sets or unsets the modifier. Moreover, PCRE_EXTRA_MATCH_LIMIT can be -accessed through the set_match_limit() and match_limit() member -functions. Setting match_limit to a non-zero value will limit the -execution of pcre to keep it from doing bad things like blowing the stack or -taking an eternity to return a result. A value of 5000 is good enough to stop -stack blowup in a 2MB thread stack. Setting match_limit to zero disables -match limiting. Alternatively, you can call match_limit_recursion() -which uses PCRE_EXTRA_MATCH_LIMIT_RECURSION to limit how much PCRE -recurses. match_limit() limits the number of matches PCRE does; -match_limit_recursion() limits the depth of internal recursion, and -therefore the amount of stack that is used. -

      -

      -Normally, to pass one or more modifiers to a RE class, you declare -a RE_Options object, set the appropriate options, and pass this -object to a RE constructor. Example: -

      -   RE_Options opt;
      -   opt.set_caseless(true);
      -   if (RE("HELLO", opt).PartialMatch("hello world")) ...
      -
      -RE_options has two constructors. The default constructor takes no arguments and -creates a set of flags that are off by default. The optional parameter -option_flags is to facilitate transfer of legacy code from C programs. -This lets you do -
      -   RE(pattern,
      -     RE_Options(PCRE_CASELESS|PCRE_MULTILINE)).PartialMatch(str);
      -
      -However, new code is better off doing -
      -   RE(pattern,
      -     RE_Options().set_caseless(true).set_multiline(true))
      -       .PartialMatch(str);
      -
      -If you are going to pass one of the most used modifiers, there are some -convenience functions that return a RE_Options class with the -appropriate modifier already set: CASELESS(), UTF8(), -MULTILINE(), DOTALL(), and EXTENDED(). -

      -

      -If you need to set several options at once, and you don't want to go through -the pains of declaring a RE_Options object and setting several options, there -is a parallel method that give you such ability on the fly. You can concatenate -several set_xxxxx() member functions, since each of them returns a -reference to its class object. For example, to pass PCRE_CASELESS, -PCRE_EXTENDED, and PCRE_MULTILINE to a RE with one statement, you may write: -

      -   RE(" ^ xyz \\s+ .* blah$",
      -     RE_Options()
      -       .set_caseless(true)
      -       .set_extended(true)
      -       .set_multiline(true)).PartialMatch(sometext);
      -
      -
      -

      -
      SCANNING TEXT INCREMENTALLY
      -

      -The "Consume" operation may be useful if you want to repeatedly -match regular expressions at the front of a string and skip over -them as they match. This requires use of the "StringPiece" type, -which represents a sub-range of a real string. Like RE, StringPiece -is defined in the pcrecpp namespace. -

      -  Example: read lines of the form "var = value" from a string.
      -     string contents = ...;                 // Fill string somehow
      -     pcrecpp::StringPiece input(contents);  // Wrap in a StringPiece
      -
      -     string var;
      -     int value;
      -     pcrecpp::RE re("(\\w+) = (\\d+)\n");
      -     while (re.Consume(&input, &var, &value)) {
      -       ...;
      -     }
      -
      -Each successful call to "Consume" will set "var/value", and also -advance "input" so it points past the matched text. -

      -

      -The "FindAndConsume" operation is similar to "Consume" but does not -anchor your match at the beginning of the string. For example, you -could extract all words from a string by repeatedly calling -

      -  pcrecpp::RE("(\\w+)").FindAndConsume(&input, &word)
      -
      -

      -
      PARSING HEX/OCTAL/C-RADIX NUMBERS
      -

      -By default, if you pass a pointer to a numeric value, the -corresponding text is interpreted as a base-10 number. You can -instead wrap the pointer with a call to one of the operators Hex(), -Octal(), or CRadix() to interpret the text in another base. The -CRadix operator interprets C-style "0" (base-8) and "0x" (base-16) -prefixes, but defaults to base-10. -

      -  Example:
      -    int a, b, c, d;
      -    pcrecpp::RE re("(.*) (.*) (.*) (.*)");
      -    re.FullMatch("100 40 0100 0x40",
      -                 pcrecpp::Octal(&a), pcrecpp::Hex(&b),
      -                 pcrecpp::CRadix(&c), pcrecpp::CRadix(&d));
      -
      -will leave 64 in a, b, c, and d. -

      -
      REPLACING PARTS OF STRINGS
      -

      -You can replace the first match of "pattern" in "str" with "rewrite". -Within "rewrite", backslash-escaped digits (\1 to \9) can be -used to insert text matching corresponding parenthesized group -from the pattern. \0 in "rewrite" refers to the entire matching -text. For example: -

      -  string s = "yabba dabba doo";
      -  pcrecpp::RE("b+").Replace("d", &s);
      -
      -will leave "s" containing "yada dabba doo". The result is true if the pattern -matches and a replacement occurs, false otherwise. -

      -

      -GlobalReplace is like Replace except that it replaces all -occurrences of the pattern in the string with the rewrite. Replacements are -not subject to re-matching. For example: -

      -  string s = "yabba dabba doo";
      -  pcrecpp::RE("b+").GlobalReplace("d", &s);
      -
      -will leave "s" containing "yada dada doo". It returns the number of -replacements made. -

      -

      -Extract is like Replace, except that if the pattern matches, -"rewrite" is copied into "out" (an additional argument) with substitutions. -The non-matching portions of "text" are ignored. Returns true iff a match -occurred and the extraction happened successfully; if no match occurs, the -string is left unaffected. -

      -
      AUTHOR
      -

      -The C++ wrapper was contributed by Google Inc. -
      -Copyright © 2007 Google Inc. -
      -

      -
      REVISION
      -

      -Last updated: 08 January 2012 -
      -

      -Return to the PCRE index page. -

      diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcredemo.html b/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcredemo.html deleted file mode 100644 index 894a9308..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcredemo.html +++ /dev/null @@ -1,426 +0,0 @@ - - -pcredemo specification - - -

      pcredemo man page

      -

      -Return to the PCRE index page. -

      -

      -This page is part of the PCRE HTML documentation. It was generated automatically -from the original man page. If there is any nonsense in it, please consult the -man page, in case the conversion went wrong. -
      -

        -
      -
      -/*************************************************
      -*           PCRE DEMONSTRATION PROGRAM           *
      -*************************************************/
      -
      -/* This is a demonstration program to illustrate the most straightforward ways
      -of calling the PCRE regular expression library from a C program. See the
      -pcresample documentation for a short discussion ("man pcresample" if you have
      -the PCRE man pages installed).
      -
      -In Unix-like environments, if PCRE is installed in your standard system
      -libraries, you should be able to compile this program using this command:
      -
      -gcc -Wall pcredemo.c -lpcre -o pcredemo
      -
      -If PCRE is not installed in a standard place, it is likely to be installed with
      -support for the pkg-config mechanism. If you have pkg-config, you can compile
      -this program using this command:
      -
      -gcc -Wall pcredemo.c `pkg-config --cflags --libs libpcre` -o pcredemo
      -
      -If you do not have pkg-config, you may have to use this:
      -
      -gcc -Wall pcredemo.c -I/usr/local/include -L/usr/local/lib \
      -  -R/usr/local/lib -lpcre -o pcredemo
      -
      -Replace "/usr/local/include" and "/usr/local/lib" with wherever the include and
      -library files for PCRE are installed on your system. Only some operating
      -systems (e.g. Solaris) use the -R option.
      -
      -Building under Windows:
      -
      -If you want to statically link this program against a non-dll .a file, you must
      -define PCRE_STATIC before including pcre.h, otherwise the pcre_malloc() and
      -pcre_free() exported functions will be declared __declspec(dllimport), with
      -unwanted results. So in this environment, uncomment the following line. */
      -
      -/* #define PCRE_STATIC */
      -
      -#include <stdio.h>
      -#include <string.h>
      -#include <pcre.h>
      -
      -#define OVECCOUNT 30    /* should be a multiple of 3 */
      -
      -
      -int main(int argc, char **argv)
      -{
      -pcre *re;
      -const char *error;
      -char *pattern;
      -char *subject;
      -unsigned char *name_table;
      -unsigned int option_bits;
      -int erroffset;
      -int find_all;
      -int crlf_is_newline;
      -int namecount;
      -int name_entry_size;
      -int ovector[OVECCOUNT];
      -int subject_length;
      -int rc, i;
      -int utf8;
      -
      -
      -/**************************************************************************
      -* First, sort out the command line. There is only one possible option at  *
      -* the moment, "-g" to request repeated matching to find all occurrences,  *
      -* like Perl's /g option. We set the variable find_all to a non-zero value *
      -* if the -g option is present. Apart from that, there must be exactly two *
      -* arguments.                                                              *
      -**************************************************************************/
      -
      -find_all = 0;
      -for (i = 1; i < argc; i++)
      -  {
      -  if (strcmp(argv[i], "-g") == 0) find_all = 1;
      -    else break;
      -  }
      -
      -/* After the options, we require exactly two arguments, which are the pattern,
      -and the subject string. */
      -
      -if (argc - i != 2)
      -  {
      -  printf("Two arguments required: a regex and a subject string\n");
      -  return 1;
      -  }
      -
      -pattern = argv[i];
      -subject = argv[i+1];
      -subject_length = (int)strlen(subject);
      -
      -
      -/*************************************************************************
      -* Now we are going to compile the regular expression pattern, and handle *
      -* and errors that are detected.                                          *
      -*************************************************************************/
      -
      -re = pcre_compile(
      -  pattern,              /* the pattern */
      -  0,                    /* default options */
      -  &error,               /* for error message */
      -  &erroffset,           /* for error offset */
      -  NULL);                /* use default character tables */
      -
      -/* Compilation failed: print the error message and exit */
      -
      -if (re == NULL)
      -  {
      -  printf("PCRE compilation failed at offset %d: %s\n", erroffset, error);
      -  return 1;
      -  }
      -
      -
      -/*************************************************************************
      -* If the compilation succeeded, we call PCRE again, in order to do a     *
      -* pattern match against the subject string. This does just ONE match. If *
      -* further matching is needed, it will be done below.                     *
      -*************************************************************************/
      -
      -rc = pcre_exec(
      -  re,                   /* the compiled pattern */
      -  NULL,                 /* no extra data - we didn't study the pattern */
      -  subject,              /* the subject string */
      -  subject_length,       /* the length of the subject */
      -  0,                    /* start at offset 0 in the subject */
      -  0,                    /* default options */
      -  ovector,              /* output vector for substring information */
      -  OVECCOUNT);           /* number of elements in the output vector */
      -
      -/* Matching failed: handle error cases */
      -
      -if (rc < 0)
      -  {
      -  switch(rc)
      -    {
      -    case PCRE_ERROR_NOMATCH: printf("No match\n"); break;
      -    /*
      -    Handle other special cases if you like
      -    */
      -    default: printf("Matching error %d\n", rc); break;
      -    }
      -  pcre_free(re);     /* Release memory used for the compiled pattern */
      -  return 1;
      -  }
      -
      -/* Match succeded */
      -
      -printf("\nMatch succeeded at offset %d\n", ovector[0]);
      -
      -
      -/*************************************************************************
      -* We have found the first match within the subject string. If the output *
      -* vector wasn't big enough, say so. Then output any substrings that were *
      -* captured.                                                              *
      -*************************************************************************/
      -
      -/* The output vector wasn't big enough */
      -
      -if (rc == 0)
      -  {
      -  rc = OVECCOUNT/3;
      -  printf("ovector only has room for %d captured substrings\n", rc - 1);
      -  }
      -
      -/* Show substrings stored in the output vector by number. Obviously, in a real
      -application you might want to do things other than print them. */
      -
      -for (i = 0; i < rc; i++)
      -  {
      -  char *substring_start = subject + ovector[2*i];
      -  int substring_length = ovector[2*i+1] - ovector[2*i];
      -  printf("%2d: %.*s\n", i, substring_length, substring_start);
      -  }
      -
      -
      -/**************************************************************************
      -* That concludes the basic part of this demonstration program. We have    *
      -* compiled a pattern, and performed a single match. The code that follows *
      -* shows first how to access named substrings, and then how to code for    *
      -* repeated matches on the same subject.                                   *
      -**************************************************************************/
      -
      -/* See if there are any named substrings, and if so, show them by name. First
      -we have to extract the count of named parentheses from the pattern. */
      -
      -(void)pcre_fullinfo(
      -  re,                   /* the compiled pattern */
      -  NULL,                 /* no extra data - we didn't study the pattern */
      -  PCRE_INFO_NAMECOUNT,  /* number of named substrings */
      -  &namecount);          /* where to put the answer */
      -
      -if (namecount <= 0) printf("No named substrings\n"); else
      -  {
      -  unsigned char *tabptr;
      -  printf("Named substrings\n");
      -
      -  /* Before we can access the substrings, we must extract the table for
      -  translating names to numbers, and the size of each entry in the table. */
      -
      -  (void)pcre_fullinfo(
      -    re,                       /* the compiled pattern */
      -    NULL,                     /* no extra data - we didn't study the pattern */
      -    PCRE_INFO_NAMETABLE,      /* address of the table */
      -    &name_table);             /* where to put the answer */
      -
      -  (void)pcre_fullinfo(
      -    re,                       /* the compiled pattern */
      -    NULL,                     /* no extra data - we didn't study the pattern */
      -    PCRE_INFO_NAMEENTRYSIZE,  /* size of each entry in the table */
      -    &name_entry_size);        /* where to put the answer */
      -
      -  /* Now we can scan the table and, for each entry, print the number, the name,
      -  and the substring itself. */
      -
      -  tabptr = name_table;
      -  for (i = 0; i < namecount; i++)
      -    {
      -    int n = (tabptr[0] << 8) | tabptr[1];
      -    printf("(%d) %*s: %.*s\n", n, name_entry_size - 3, tabptr + 2,
      -      ovector[2*n+1] - ovector[2*n], subject + ovector[2*n]);
      -    tabptr += name_entry_size;
      -    }
      -  }
      -
      -
      -/*************************************************************************
      -* If the "-g" option was given on the command line, we want to continue  *
      -* to search for additional matches in the subject string, in a similar   *
      -* way to the /g option in Perl. This turns out to be trickier than you   *
      -* might think because of the possibility of matching an empty string.    *
      -* What happens is as follows:                                            *
      -*                                                                        *
      -* If the previous match was NOT for an empty string, we can just start   *
      -* the next match at the end of the previous one.                         *
      -*                                                                        *
      -* If the previous match WAS for an empty string, we can't do that, as it *
      -* would lead to an infinite loop. Instead, a special call of pcre_exec() *
      -* is made with the PCRE_NOTEMPTY_ATSTART and PCRE_ANCHORED flags set.    *
      -* The first of these tells PCRE that an empty string at the start of the *
      -* subject is not a valid match; other possibilities must be tried. The   *
      -* second flag restricts PCRE to one match attempt at the initial string  *
      -* position. If this match succeeds, an alternative to the empty string   *
      -* match has been found, and we can print it and proceed round the loop,  *
      -* advancing by the length of whatever was found. If this match does not  *
      -* succeed, we still stay in the loop, advancing by just one character.   *
      -* In UTF-8 mode, which can be set by (*UTF8) in the pattern, this may be *
      -* more than one byte.                                                    *
      -*                                                                        *
      -* However, there is a complication concerned with newlines. When the     *
      -* newline convention is such that CRLF is a valid newline, we must       *
      -* advance by two characters rather than one. The newline convention can  *
      -* be set in the regex by (*CR), etc.; if not, we must find the default.  *
      -*************************************************************************/
      -
      -if (!find_all)     /* Check for -g */
      -  {
      -  pcre_free(re);   /* Release the memory used for the compiled pattern */
      -  return 0;        /* Finish unless -g was given */
      -  }
      -
      -/* Before running the loop, check for UTF-8 and whether CRLF is a valid newline
      -sequence. First, find the options with which the regex was compiled; extract
      -the UTF-8 state, and mask off all but the newline options. */
      -
      -(void)pcre_fullinfo(re, NULL, PCRE_INFO_OPTIONS, &option_bits);
      -utf8 = option_bits & PCRE_UTF8;
      -option_bits &= PCRE_NEWLINE_CR|PCRE_NEWLINE_LF|PCRE_NEWLINE_CRLF|
      -               PCRE_NEWLINE_ANY|PCRE_NEWLINE_ANYCRLF;
      -
      -/* If no newline options were set, find the default newline convention from the
      -build configuration. */
      -
      -if (option_bits == 0)
      -  {
      -  int d;
      -  (void)pcre_config(PCRE_CONFIG_NEWLINE, &d);
      -  /* Note that these values are always the ASCII ones, even in
      -  EBCDIC environments. CR = 13, NL = 10. */
      -  option_bits = (d == 13)? PCRE_NEWLINE_CR :
      -          (d == 10)? PCRE_NEWLINE_LF :
      -          (d == (13<<8 | 10))? PCRE_NEWLINE_CRLF :
      -          (d == -2)? PCRE_NEWLINE_ANYCRLF :
      -          (d == -1)? PCRE_NEWLINE_ANY : 0;
      -  }
      -
      -/* See if CRLF is a valid newline sequence. */
      -
      -crlf_is_newline =
      -     option_bits == PCRE_NEWLINE_ANY ||
      -     option_bits == PCRE_NEWLINE_CRLF ||
      -     option_bits == PCRE_NEWLINE_ANYCRLF;
      -
      -/* Loop for second and subsequent matches */
      -
      -for (;;)
      -  {
      -  int options = 0;                 /* Normally no options */
      -  int start_offset = ovector[1];   /* Start at end of previous match */
      -
      -  /* If the previous match was for an empty string, we are finished if we are
      -  at the end of the subject. Otherwise, arrange to run another match at the
      -  same point to see if a non-empty match can be found. */
      -
      -  if (ovector[0] == ovector[1])
      -    {
      -    if (ovector[0] == subject_length) break;
      -    options = PCRE_NOTEMPTY_ATSTART | PCRE_ANCHORED;
      -    }
      -
      -  /* Run the next matching operation */
      -
      -  rc = pcre_exec(
      -    re,                   /* the compiled pattern */
      -    NULL,                 /* no extra data - we didn't study the pattern */
      -    subject,              /* the subject string */
      -    subject_length,       /* the length of the subject */
      -    start_offset,         /* starting offset in the subject */
      -    options,              /* options */
      -    ovector,              /* output vector for substring information */
      -    OVECCOUNT);           /* number of elements in the output vector */
      -
      -  /* This time, a result of NOMATCH isn't an error. If the value in "options"
      -  is zero, it just means we have found all possible matches, so the loop ends.
      -  Otherwise, it means we have failed to find a non-empty-string match at a
      -  point where there was a previous empty-string match. In this case, we do what
      -  Perl does: advance the matching position by one character, and continue. We
      -  do this by setting the "end of previous match" offset, because that is picked
      -  up at the top of the loop as the point at which to start again.
      -
      -  There are two complications: (a) When CRLF is a valid newline sequence, and
      -  the current position is just before it, advance by an extra byte. (b)
      -  Otherwise we must ensure that we skip an entire UTF-8 character if we are in
      -  UTF-8 mode. */
      -
      -  if (rc == PCRE_ERROR_NOMATCH)
      -    {
      -    if (options == 0) break;                    /* All matches found */
      -    ovector[1] = start_offset + 1;              /* Advance one byte */
      -    if (crlf_is_newline &&                      /* If CRLF is newline & */
      -        start_offset < subject_length - 1 &&    /* we are at CRLF, */
      -        subject[start_offset] == '\r' &&
      -        subject[start_offset + 1] == '\n')
      -      ovector[1] += 1;                          /* Advance by one more. */
      -    else if (utf8)                              /* Otherwise, ensure we */
      -      {                                         /* advance a whole UTF-8 */
      -      while (ovector[1] < subject_length)       /* character. */
      -        {
      -        if ((subject[ovector[1]] & 0xc0) != 0x80) break;
      -        ovector[1] += 1;
      -        }
      -      }
      -    continue;    /* Go round the loop again */
      -    }
      -
      -  /* Other matching errors are not recoverable. */
      -
      -  if (rc < 0)
      -    {
      -    printf("Matching error %d\n", rc);
      -    pcre_free(re);    /* Release memory used for the compiled pattern */
      -    return 1;
      -    }
      -
      -  /* Match succeded */
      -
      -  printf("\nMatch succeeded again at offset %d\n", ovector[0]);
      -
      -  /* The match succeeded, but the output vector wasn't big enough. */
      -
      -  if (rc == 0)
      -    {
      -    rc = OVECCOUNT/3;
      -    printf("ovector only has room for %d captured substrings\n", rc - 1);
      -    }
      -
      -  /* As before, show substrings stored in the output vector by number, and then
      -  also any named substrings. */
      -
      -  for (i = 0; i < rc; i++)
      -    {
      -    char *substring_start = subject + ovector[2*i];
      -    int substring_length = ovector[2*i+1] - ovector[2*i];
      -    printf("%2d: %.*s\n", i, substring_length, substring_start);
      -    }
      -
      -  if (namecount <= 0) printf("No named substrings\n"); else
      -    {
      -    unsigned char *tabptr = name_table;
      -    printf("Named substrings\n");
      -    for (i = 0; i < namecount; i++)
      -      {
      -      int n = (tabptr[0] << 8) | tabptr[1];
      -      printf("(%d) %*s: %.*s\n", n, name_entry_size - 3, tabptr + 2,
      -        ovector[2*n+1] - ovector[2*n], subject + ovector[2*n]);
      -      tabptr += name_entry_size;
      -      }
      -    }
      -  }      /* End of loop to find second and subsequent matches */
      -
      -printf("\n");
      -pcre_free(re);       /* Release memory used for the compiled pattern */
      -return 0;
      -}
      -
      -/* End of pcredemo.c */
      -

      -Return to the PCRE index page. -

      diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcregrep.html b/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcregrep.html deleted file mode 100644 index dacbb499..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcregrep.html +++ /dev/null @@ -1,759 +0,0 @@ - - -pcregrep specification - - -

      pcregrep man page

      -

      -Return to the PCRE index page. -

      -

      -This page is part of the PCRE HTML documentation. It was generated automatically -from the original man page. If there is any nonsense in it, please consult the -man page, in case the conversion went wrong. -
      -

      -
      SYNOPSIS
      -

      -pcregrep [options] [long options] [pattern] [path1 path2 ...] -

      -
      DESCRIPTION
      -

      -pcregrep searches files for character patterns, in the same way as other -grep commands do, but it uses the PCRE regular expression library to support -patterns that are compatible with the regular expressions of Perl 5. See -pcresyntax(3) -for a quick-reference summary of pattern syntax, or -pcrepattern(3) -for a full description of the syntax and semantics of the regular expressions -that PCRE supports. -

      -

      -Patterns, whether supplied on the command line or in a separate file, are given -without delimiters. For example: -

      -  pcregrep Thursday /etc/motd
      -
      -If you attempt to use delimiters (for example, by surrounding a pattern with -slashes, as is common in Perl scripts), they are interpreted as part of the -pattern. Quotes can of course be used to delimit patterns on the command line -because they are interpreted by the shell, and indeed quotes are required if a -pattern contains white space or shell metacharacters. -

      -

      -The first argument that follows any option settings is treated as the single -pattern to be matched when neither -e nor -f is present. -Conversely, when one or both of these options are used to specify patterns, all -arguments are treated as path names. At least one of -e, -f, or an -argument pattern must be provided. -

      -

      -If no files are specified, pcregrep reads the standard input. The -standard input can also be referenced by a name consisting of a single hyphen. -For example: -

      -  pcregrep some-pattern /file1 - /file3
      -
      -By default, each line that matches a pattern is copied to the standard -output, and if there is more than one file, the file name is output at the -start of each line, followed by a colon. However, there are options that can -change how pcregrep behaves. In particular, the -M option makes it -possible to search for patterns that span line boundaries. What defines a line -boundary is controlled by the -N (--newline) option. -

      -

      -The amount of memory used for buffering files that are being scanned is -controlled by a parameter that can be set by the --buffer-size option. -The default value for this parameter is specified when pcregrep is built, -with the default default being 20K. A block of memory three times this size is -used (to allow for buffering "before" and "after" lines). An error occurs if a -line overflows the buffer. -

      -

      -Patterns can be no longer than 8K or BUFSIZ bytes, whichever is the greater. -BUFSIZ is defined in <stdio.h>. When there is more than one pattern -(specified by the use of -e and/or -f), each pattern is applied to -each line in the order in which they are defined, except that all the -e -patterns are tried before the -f patterns. -

      -

      -By default, as soon as one pattern matches a line, no further patterns are -considered. However, if --colour (or --color) is used to colour the -matching substrings, or if --only-matching, --file-offsets, or ---line-offsets is used to output only the part of the line that matched -(either shown literally, or as an offset), scanning resumes immediately -following the match, so that further matches on the same line can be found. If -there are multiple patterns, they are all tried on the remainder of the line, -but patterns that follow the one that matched are not tried on the earlier part -of the line. -

      -

      -This behaviour means that the order in which multiple patterns are specified -can affect the output when one of the above options is used. This is no longer -the same behaviour as GNU grep, which now manages to display earlier matches -for later patterns (as long as there is no overlap). -

      -

      -Patterns that can match an empty string are accepted, but empty string -matches are never recognized. An example is the pattern "(super)?(man)?", in -which all components are optional. This pattern finds all occurrences of both -"super" and "man"; the output differs from matching with "super|man" when only -the matching substrings are being shown. -

      -

      -If the LC_ALL or LC_CTYPE environment variable is set, -pcregrep uses the value to set a locale when calling the PCRE library. -The --locale option can be used to override this. -

      -
      SUPPORT FOR COMPRESSED FILES
      -

      -It is possible to compile pcregrep so that it uses libz or -libbz2 to read files whose names end in .gz or .bz2, -respectively. You can find out whether your binary has support for one or both -of these file types by running it with the --help option. If the -appropriate support is not present, files are treated as plain text. The -standard input is always so treated. -

      -
      BINARY FILES
      -

      -By default, a file that contains a binary zero byte within the first 1024 bytes -is identified as a binary file, and is processed specially. (GNU grep also -identifies binary files in this manner.) See the --binary-files option -for a means of changing the way binary files are handled. -

      -
      OPTIONS
      -

      -The order in which some of the options appear can affect the output. For -example, both the -h and -l options affect the printing of file -names. Whichever comes later in the command line will be the one that takes -effect. Similarly, except where noted below, if an option is given twice, the -later setting is used. Numerical values for options may be followed by K or M, -to signify multiplication by 1024 or 1024*1024 respectively. -

      -

      --- -This terminates the list of options. It is useful if the next item on the -command line starts with a hyphen but is not an option. This allows for the -processing of patterns and filenames that start with hyphens. -

      -

      --A number, --after-context=number -Output number lines of context after each matching line. If filenames -and/or line numbers are being output, a hyphen separator is used instead of a -colon for the context lines. A line containing "--" is output between each -group of lines, unless they are in fact contiguous in the input file. The value -of number is expected to be relatively small. However, pcregrep -guarantees to have up to 8K of following text available for context output. -

      -

      --a, --text -Treat binary files as text. This is equivalent to ---binary-files=text. -

      -

      --B number, --before-context=number -Output number lines of context before each matching line. If filenames -and/or line numbers are being output, a hyphen separator is used instead of a -colon for the context lines. A line containing "--" is output between each -group of lines, unless they are in fact contiguous in the input file. The value -of number is expected to be relatively small. However, pcregrep -guarantees to have up to 8K of preceding text available for context output. -

      -

      ---binary-files=word -Specify how binary files are to be processed. If the word is "binary" (the -default), pattern matching is performed on binary files, but the only output is -"Binary file <name> matches" when a match succeeds. If the word is "text", -which is equivalent to the -a or --text option, binary files are -processed in the same way as any other file. In this case, when a match -succeeds, the output may be binary garbage, which can have nasty effects if -sent to a terminal. If the word is "without-match", which is equivalent to the --I option, binary files are not processed at all; they are assumed not to -be of interest. -

      -

      ---buffer-size=number -Set the parameter that controls how much memory is used for buffering files -that are being scanned. -

      -

      --C number, --context=number -Output number lines of context both before and after each matching line. -This is equivalent to setting both -A and -B to the same value. -

      -

      --c, --count -Do not output individual lines from the files that are being scanned; instead -output the number of lines that would otherwise have been shown. If no lines -are selected, the number zero is output. If several files are are being -scanned, a count is output for each of them. However, if the ---files-with-matches option is also used, only those files whose counts -are greater than zero are listed. When -c is used, the -A, --B, and -C options are ignored. -

      -

      ---colour, --color -If this option is given without any data, it is equivalent to "--colour=auto". -If data is required, it must be given in the same shell item, separated by an -equals sign. -

      -

      ---colour=value, --color=value -This option specifies under what circumstances the parts of a line that matched -a pattern should be coloured in the output. By default, the output is not -coloured. The value (which is optional, see above) may be "never", "always", or -"auto". In the latter case, colouring happens only if the standard output is -connected to a terminal. More resources are used when colouring is enabled, -because pcregrep has to search for all possible matches in a line, not -just one, in order to colour them all. -
      -
      -The colour that is used can be specified by setting the environment variable -PCREGREP_COLOUR or PCREGREP_COLOR. The value of this variable should be a -string of two numbers, separated by a semicolon. They are copied directly into -the control string for setting colour on a terminal, so it is your -responsibility to ensure that they make sense. If neither of the environment -variables is set, the default is "1;31", which gives red. -

      -

      --D action, --devices=action -If an input path is not a regular file or a directory, "action" specifies how -it is to be processed. Valid values are "read" (the default) or "skip" -(silently skip the path). -

      -

      --d action, --directories=action -If an input path is a directory, "action" specifies how it is to be processed. -Valid values are "read" (the default in non-Windows environments, for -compatibility with GNU grep), "recurse" (equivalent to the -r option), or -"skip" (silently skip the path, the default in Windows environments). In the -"read" case, directories are read as if they were ordinary files. In some -operating systems the effect of reading a directory like this is an immediate -end-of-file; in others it may provoke an error. -

      -

      --e pattern, --regex=pattern, --regexp=pattern -Specify a pattern to be matched. This option can be used multiple times in -order to specify several patterns. It can also be used as a way of specifying a -single pattern that starts with a hyphen. When -e is used, no argument -pattern is taken from the command line; all arguments are treated as file -names. There is no limit to the number of patterns. They are applied to each -line in the order in which they are defined until one matches. -
      -
      -If -f is used with -e, the command line patterns are matched first, -followed by the patterns from the file(s), independent of the order in which -these options are specified. Note that multiple use of -e is not the same -as a single pattern with alternatives. For example, X|Y finds the first -character in a line that is X or Y, whereas if the two patterns are given -separately, with X first, pcregrep finds X if it is present, even if it -follows Y in the line. It finds Y only if there is no X in the line. This -matters only if you are using -o or --colo(u)r to show the part(s) -of the line that matched. -

      -

      ---exclude=pattern -Files (but not directories) whose names match the pattern are skipped without -being processed. This applies to all files, whether listed on the command line, -obtained from --file-list, or by scanning a directory. The pattern is a -PCRE regular expression, and is matched against the final component of the file -name, not the entire path. The -F, -w, and -x options do not -apply to this pattern. The option may be given any number of times in order to -specify multiple patterns. If a file name matches both an --include -and an --exclude pattern, it is excluded. There is no short form for this -option. -

      -

      ---exclude-from=filename -Treat each non-empty line of the file as the data for an --exclude -option. What constitutes a newline when reading the file is the operating -system's default. The --newline option has no effect on this option. This -option may be given more than once in order to specify a number of files to -read. -

      -

      ---exclude-dir=pattern -Directories whose names match the pattern are skipped without being processed, -whatever the setting of the --recursive option. This applies to all -directories, whether listed on the command line, obtained from ---file-list, or by scanning a parent directory. The pattern is a PCRE -regular expression, and is matched against the final component of the directory -name, not the entire path. The -F, -w, and -x options do not -apply to this pattern. The option may be given any number of times in order to -specify more than one pattern. If a directory matches both --include-dir -and --exclude-dir, it is excluded. There is no short form for this -option. -

      -

      --F, --fixed-strings -Interpret each data-matching pattern as a list of fixed strings, separated by -newlines, instead of as a regular expression. What constitutes a newline for -this purpose is controlled by the --newline option. The -w (match -as a word) and -x (match whole line) options can be used with -F. -They apply to each of the fixed strings. A line is selected if any of the fixed -strings are found in it (subject to -w or -x, if present). This -option applies only to the patterns that are matched against the contents of -files; it does not apply to patterns specified by any of the --include or ---exclude options. -

      -

      --f filename, --file=filename -Read patterns from the file, one per line, and match them against -each line of input. What constitutes a newline when reading the file is the -operating system's default. The --newline option has no effect on this -option. Trailing white space is removed from each line, and blank lines are -ignored. An empty file contains no patterns and therefore matches nothing. See -also the comments about multiple patterns versus a single pattern with -alternatives in the description of -e above. -
      -
      -If this option is given more than once, all the specified files are -read. A data line is output if any of the patterns match it. A filename can -be given as "-" to refer to the standard input. When -f is used, patterns -specified on the command line using -e may also be present; they are -tested before the file's patterns. However, no other pattern is taken from the -command line; all arguments are treated as the names of paths to be searched. -

      -

      ---file-list=filename -Read a list of files and/or directories that are to be scanned from the given -file, one per line. Trailing white space is removed from each line, and blank -lines are ignored. These paths are processed before any that are listed on the -command line. The filename can be given as "-" to refer to the standard input. -If --file and --file-list are both specified as "-", patterns are -read first. This is useful only when the standard input is a terminal, from -which further lines (the list of files) can be read after an end-of-file -indication. If this option is given more than once, all the specified files are -read. -

      -

      ---file-offsets -Instead of showing lines or parts of lines that match, show each match as an -offset from the start of the file and a length, separated by a comma. In this -mode, no context is shown. That is, the -A, -B, and -C -options are ignored. If there is more than one match in a line, each of them is -shown separately. This option is mutually exclusive with --line-offsets -and --only-matching. -

      -

      --H, --with-filename -Force the inclusion of the filename at the start of output lines when searching -a single file. By default, the filename is not shown in this case. For matching -lines, the filename is followed by a colon; for context lines, a hyphen -separator is used. If a line number is also being output, it follows the file -name. -

      -

      --h, --no-filename -Suppress the output filenames when searching multiple files. By default, -filenames are shown when multiple files are searched. For matching lines, the -filename is followed by a colon; for context lines, a hyphen separator is used. -If a line number is also being output, it follows the file name. -

      -

      ---help -Output a help message, giving brief details of the command options and file -type support, and then exit. Anything else on the command line is -ignored. -

      -

      --I -Treat binary files as never matching. This is equivalent to ---binary-files=without-match. -

      -

      --i, --ignore-case -Ignore upper/lower case distinctions during comparisons. -

      -

      ---include=pattern -If any --include patterns are specified, the only files that are -processed are those that match one of the patterns (and do not match an ---exclude pattern). This option does not affect directories, but it -applies to all files, whether listed on the command line, obtained from ---file-list, or by scanning a directory. The pattern is a PCRE regular -expression, and is matched against the final component of the file name, not -the entire path. The -F, -w, and -x options do not apply to -this pattern. The option may be given any number of times. If a file name -matches both an --include and an --exclude pattern, it is excluded. -There is no short form for this option. -

      -

      ---include-from=filename -Treat each non-empty line of the file as the data for an --include -option. What constitutes a newline for this purpose is the operating system's -default. The --newline option has no effect on this option. This option -may be given any number of times; all the files are read. -

      -

      ---include-dir=pattern -If any --include-dir patterns are specified, the only directories that -are processed are those that match one of the patterns (and do not match an ---exclude-dir pattern). This applies to all directories, whether listed -on the command line, obtained from --file-list, or by scanning a parent -directory. The pattern is a PCRE regular expression, and is matched against the -final component of the directory name, not the entire path. The -F, --w, and -x options do not apply to this pattern. The option may be -given any number of times. If a directory matches both --include-dir and ---exclude-dir, it is excluded. There is no short form for this option. -

      -

      --L, --files-without-match -Instead of outputting lines from the files, just output the names of the files -that do not contain any lines that would have been output. Each file name is -output once, on a separate line. -

      -

      --l, --files-with-matches -Instead of outputting lines from the files, just output the names of the files -containing lines that would have been output. Each file name is output -once, on a separate line. Searching normally stops as soon as a matching line -is found in a file. However, if the -c (count) option is also used, -matching continues in order to obtain the correct count, and those files that -have at least one match are listed along with their counts. Using this option -with -c is a way of suppressing the listing of files with no matches. -

      -

      ---label=name -This option supplies a name to be used for the standard input when file names -are being output. If not supplied, "(standard input)" is used. There is no -short form for this option. -

      -

      ---line-buffered -When this option is given, input is read and processed line by line, and the -output is flushed after each write. By default, input is read in large chunks, -unless pcregrep can determine that it is reading from a terminal (which -is currently possible only in Unix-like environments). Output to terminal is -normally automatically flushed by the operating system. This option can be -useful when the input or output is attached to a pipe and you do not want -pcregrep to buffer up large amounts of data. However, its use will affect -performance, and the -M (multiline) option ceases to work. -

      -

      ---line-offsets -Instead of showing lines or parts of lines that match, show each match as a -line number, the offset from the start of the line, and a length. The line -number is terminated by a colon (as usual; see the -n option), and the -offset and length are separated by a comma. In this mode, no context is shown. -That is, the -A, -B, and -C options are ignored. If there is -more than one match in a line, each of them is shown separately. This option is -mutually exclusive with --file-offsets and --only-matching. -

      -

      ---locale=locale-name -This option specifies a locale to be used for pattern matching. It overrides -the value in the LC_ALL or LC_CTYPE environment variables. If no -locale is specified, the PCRE library's default (usually the "C" locale) is -used. There is no short form for this option. -

      -

      ---match-limit=number -Processing some regular expression patterns can require a very large amount of -memory, leading in some cases to a program crash if not enough is available. -Other patterns may take a very long time to search for all possible matching -strings. The pcre_exec() function that is called by pcregrep to do -the matching has two parameters that can limit the resources that it uses. -
      -
      -The --match-limit option provides a means of limiting resource usage -when processing patterns that are not going to match, but which have a very -large number of possibilities in their search trees. The classic example is a -pattern that uses nested unlimited repeats. Internally, PCRE uses a function -called match() which it calls repeatedly (sometimes recursively). The -limit set by --match-limit is imposed on the number of times this -function is called during a match, which has the effect of limiting the amount -of backtracking that can take place. -
      -
      -The --recursion-limit option is similar to --match-limit, but -instead of limiting the total number of times that match() is called, it -limits the depth of recursive calls, which in turn limits the amount of memory -that can be used. The recursion depth is a smaller number than the total number -of calls, because not all calls to match() are recursive. This limit is -of use only if it is set smaller than --match-limit. -
      -
      -There are no short forms for these options. The default settings are specified -when the PCRE library is compiled, with the default default being 10 million. -

      -

      --M, --multiline -Allow patterns to match more than one line. When this option is given, patterns -may usefully contain literal newline characters and internal occurrences of ^ -and $ characters. The output for a successful match may consist of more than -one line, the last of which is the one in which the match ended. If the matched -string ends with a newline sequence the output ends at the end of that line. -
      -
      -When this option is set, the PCRE library is called in "multiline" mode. -There is a limit to the number of lines that can be matched, imposed by the way -that pcregrep buffers the input file as it scans it. However, -pcregrep ensures that at least 8K characters or the rest of the document -(whichever is the shorter) are available for forward matching, and similarly -the previous 8K characters (or all the previous characters, if fewer than 8K) -are guaranteed to be available for lookbehind assertions. This option does not -work when input is read line by line (see \fP--line-buffered\fP.) -

      -

      --N newline-type, --newline=newline-type -The PCRE library supports five different conventions for indicating -the ends of lines. They are the single-character sequences CR (carriage return) -and LF (linefeed), the two-character sequence CRLF, an "anycrlf" convention, -which recognizes any of the preceding three types, and an "any" convention, in -which any Unicode line ending sequence is assumed to end a line. The Unicode -sequences are the three just mentioned, plus VT (vertical tab, U+000B), FF -(form feed, U+000C), NEL (next line, U+0085), LS (line separator, U+2028), and -PS (paragraph separator, U+2029). -
      -
      -When the PCRE library is built, a default line-ending sequence is specified. -This is normally the standard sequence for the operating system. Unless -otherwise specified by this option, pcregrep uses the library's default. -The possible values for this option are CR, LF, CRLF, ANYCRLF, or ANY. This -makes it possible to use pcregrep to scan files that have come from other -environments without having to modify their line endings. If the data that is -being scanned does not agree with the convention set by this option, -pcregrep may behave in strange ways. Note that this option does not -apply to files specified by the -f, --exclude-from, or ---include-from options, which are expected to use the operating system's -standard newline sequence. -

      -

      --n, --line-number -Precede each output line by its line number in the file, followed by a colon -for matching lines or a hyphen for context lines. If the filename is also being -output, it precedes the line number. This option is forced if ---line-offsets is used. -

      -

      ---no-jit -If the PCRE library is built with support for just-in-time compiling (which -speeds up matching), pcregrep automatically makes use of this, unless it -was explicitly disabled at build time. This option can be used to disable the -use of JIT at run time. It is provided for testing and working round problems. -It should never be needed in normal use. -

      -

      --o, --only-matching -Show only the part of the line that matched a pattern instead of the whole -line. In this mode, no context is shown. That is, the -A, -B, and --C options are ignored. If there is more than one match in a line, each -of them is shown separately. If -o is combined with -v (invert the -sense of the match to find non-matching lines), no output is generated, but the -return code is set appropriately. If the matched portion of the line is empty, -nothing is output unless the file name or line number are being printed, in -which case they are shown on an otherwise empty line. This option is mutually -exclusive with --file-offsets and --line-offsets. -

      -

      --onumber, --only-matching=number -Show only the part of the line that matched the capturing parentheses of the -given number. Up to 32 capturing parentheses are supported, and -o0 is -equivalent to -o without a number. Because these options can be given -without an argument (see above), if an argument is present, it must be given in -the same shell item, for example, -o3 or --only-matching=2. The comments given -for the non-argument case above also apply to this case. If the specified -capturing parentheses do not exist in the pattern, or were not set in the -match, nothing is output unless the file name or line number are being printed. -
      -
      -If this option is given multiple times, multiple substrings are output, in the -order the options are given. For example, -o3 -o1 -o3 causes the substrings -matched by capturing parentheses 3 and 1 and then 3 again to be output. By -default, there is no separator (but see the next option). -

      -

      ---om-separator=text -Specify a separating string for multiple occurrences of -o. The default -is an empty string. Separating strings are never coloured. -

      -

      --q, --quiet -Work quietly, that is, display nothing except error messages. The exit -status indicates whether or not any matches were found. -

      -

      --r, --recursive -If any given path is a directory, recursively scan the files it contains, -taking note of any --include and --exclude settings. By default, a -directory is read as a normal file; in some operating systems this gives an -immediate end-of-file. This option is a shorthand for setting the -d -option to "recurse". -

      -

      ---recursion-limit=number -See --match-limit above. -

      -

      --s, --no-messages -Suppress error messages about non-existent or unreadable files. Such files are -quietly skipped. However, the return code is still 2, even if matches were -found in other files. -

      -

      --u, --utf-8 -Operate in UTF-8 mode. This option is available only if PCRE has been compiled -with UTF-8 support. All patterns (including those for any --exclude and ---include options) and all subject lines that are scanned must be valid -strings of UTF-8 characters. -

      -

      --V, --version -Write the version numbers of pcregrep and the PCRE library to the -standard output and then exit. Anything else on the command line is -ignored. -

      -

      --v, --invert-match -Invert the sense of the match, so that lines which do not match any of -the patterns are the ones that are found. -

      -

      --w, --word-regex, --word-regexp -Force the patterns to match only whole words. This is equivalent to having \b -at the start and end of the pattern. This option applies only to the patterns -that are matched against the contents of files; it does not apply to patterns -specified by any of the --include or --exclude options. -

      -

      --x, --line-regex, --line-regexp -Force the patterns to be anchored (each must start matching at the beginning of -a line) and in addition, require them to match entire lines. This is equivalent -to having ^ and $ characters at the start and end of each alternative branch in -every pattern. This option applies only to the patterns that are matched -against the contents of files; it does not apply to patterns specified by any -of the --include or --exclude options. -

      -
      ENVIRONMENT VARIABLES
      -

      -The environment variables LC_ALL and LC_CTYPE are examined, in that -order, for a locale. The first one that is set is used. This can be overridden -by the --locale option. If no locale is set, the PCRE library's default -(usually the "C" locale) is used. -

      -
      NEWLINES
      -

      -The -N (--newline) option allows pcregrep to scan files with -different newline conventions from the default. Any parts of the input files -that are written to the standard output are copied identically, with whatever -newline sequences they have in the input. However, the setting of this option -does not affect the interpretation of files specified by the -f, ---exclude-from, or --include-from options, which are assumed to use -the operating system's standard newline sequence, nor does it affect the way in -which pcregrep writes informational messages to the standard error and -output streams. For these it uses the string "\n" to indicate newlines, -relying on the C I/O library to convert this to an appropriate sequence. -

      -
      OPTIONS COMPATIBILITY
      -

      -Many of the short and long forms of pcregrep's options are the same -as in the GNU grep program. Any long option of the form ---xxx-regexp (GNU terminology) is also available as --xxx-regex -(PCRE terminology). However, the --file-list, --file-offsets, ---include-dir, --line-offsets, --locale, --match-limit, --M, --multiline, -N, --newline, --om-separator, ---recursion-limit, -u, and --utf-8 options are specific to -pcregrep, as is the use of the --only-matching option with a -capturing parentheses number. -

      -

      -Although most of the common options work the same way, a few are different in -pcregrep. For example, the --include option's argument is a glob -for GNU grep, but a regular expression for pcregrep. If both the --c and -l options are given, GNU grep lists only file names, -without counts, but pcregrep gives the counts. -

      -
      OPTIONS WITH DATA
      -

      -There are four different ways in which an option with data can be specified. -If a short form option is used, the data may follow immediately, or (with one -exception) in the next command line item. For example: -

      -  -f/some/file
      -  -f /some/file
      -
      -The exception is the -o option, which may appear with or without data. -Because of this, if data is present, it must follow immediately in the same -item, for example -o3. -

      -

      -If a long form option is used, the data may appear in the same command line -item, separated by an equals character, or (with two exceptions) it may appear -in the next command line item. For example: -

      -  --file=/some/file
      -  --file /some/file
      -
      -Note, however, that if you want to supply a file name beginning with ~ as data -in a shell command, and have the shell expand ~ to a home directory, you must -separate the file name from the option, because the shell does not treat ~ -specially unless it is at the start of an item. -

      -

      -The exceptions to the above are the --colour (or --color) and ---only-matching options, for which the data is optional. If one of these -options does have data, it must be given in the first form, using an equals -character. Otherwise pcregrep will assume that it has no data. -

      -
      MATCHING ERRORS
      -

      -It is possible to supply a regular expression that takes a very long time to -fail to match certain lines. Such patterns normally involve nested indefinite -repeats, for example: (a+)*\d when matched against a line of a's with no final -digit. The PCRE matching function has a resource limit that causes it to abort -in these circumstances. If this happens, pcregrep outputs an error -message and the line that caused the problem to the standard error stream. If -there are more than 20 such errors, pcregrep gives up. -

      -

      -The --match-limit option of pcregrep can be used to set the overall -resource limit; there is a second option called --recursion-limit that -sets a limit on the amount of memory (usually stack) that is used (see the -discussion of these options above). -

      -
      DIAGNOSTICS
      -

      -Exit status is 0 if any matches were found, 1 if no matches were found, and 2 -for syntax errors, overlong lines, non-existent or inaccessible files (even if -matches were found in other files) or too many matching errors. Using the --s option to suppress error messages about inaccessible files does not -affect the return code. -

      -
      SEE ALSO
      -

      -pcrepattern(3), pcresyntax(3), pcretest(1). -

      -
      AUTHOR
      -

      -Philip Hazel -
      -University Computing Service -
      -Cambridge CB2 3QH, England. -
      -

      -
      REVISION
      -

      -Last updated: 03 April 2014 -
      -Copyright © 1997-2014 University of Cambridge. -
      -

      -Return to the PCRE index page. -

      diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcrejit.html b/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcrejit.html deleted file mode 100644 index abb34252..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcrejit.html +++ /dev/null @@ -1,499 +0,0 @@ - - -pcrejit specification - - -

      pcrejit man page

      -

      -Return to the PCRE index page. -

      -

      -This page is part of the PCRE HTML documentation. It was generated automatically -from the original man page. If there is any nonsense in it, please consult the -man page, in case the conversion went wrong. -
      -

      -
      PCRE JUST-IN-TIME COMPILER SUPPORT
      -

      -Just-in-time compiling is a heavyweight optimization that can greatly speed up -pattern matching. However, it comes at the cost of extra processing before the -match is performed. Therefore, it is of most benefit when the same pattern is -going to be matched many times. This does not necessarily mean many calls of a -matching function; if the pattern is not anchored, matching attempts may take -place many times at various positions in the subject, even for a single call. -Therefore, if the subject string is very long, it may still pay to use JIT for -one-off matches. -

      -

      -JIT support applies only to the traditional Perl-compatible matching function. -It does not apply when the DFA matching function is being used. The code for -this support was written by Zoltan Herczeg. -

      -
      8-BIT, 16-BIT AND 32-BIT SUPPORT
      -

      -JIT support is available for all of the 8-bit, 16-bit and 32-bit PCRE -libraries. To keep this documentation simple, only the 8-bit interface is -described in what follows. If you are using the 16-bit library, substitute the -16-bit functions and 16-bit structures (for example, pcre16_jit_stack -instead of pcre_jit_stack). If you are using the 32-bit library, -substitute the 32-bit functions and 32-bit structures (for example, -pcre32_jit_stack instead of pcre_jit_stack). -

      -
      AVAILABILITY OF JIT SUPPORT
      -

      -JIT support is an optional feature of PCRE. The "configure" option --enable-jit -(or equivalent CMake option) must be set when PCRE is built if you want to use -JIT. The support is limited to the following hardware platforms: -

      -  ARM v5, v7, and Thumb2
      -  Intel x86 32-bit and 64-bit
      -  MIPS 32-bit
      -  Power PC 32-bit and 64-bit
      -  SPARC 32-bit (experimental)
      -
      -If --enable-jit is set on an unsupported platform, compilation fails. -

      -

      -A program that is linked with PCRE 8.20 or later can tell if JIT support is -available by calling pcre_config() with the PCRE_CONFIG_JIT option. The -result is 1 when JIT is available, and 0 otherwise. However, a simple program -does not need to check this in order to use JIT. The normal API is implemented -in a way that falls back to the interpretive code if JIT is not available. For -programs that need the best possible performance, there is also a "fast path" -API that is JIT-specific. -

      -

      -If your program may sometimes be linked with versions of PCRE that are older -than 8.20, but you want to use JIT when it is available, you can test the -values of PCRE_MAJOR and PCRE_MINOR, or the existence of a JIT macro such as -PCRE_CONFIG_JIT, for compile-time control of your code. Also beware that the -pcre_jit_exec() function was not available at all before 8.32, -and may not be available at all if PCRE isn't compiled with ---enable-jit. See the "JIT FAST PATH API" section below for details. -

      -
      SIMPLE USE OF JIT
      -

      -You have to do two things to make use of the JIT support in the simplest way: -

      -  (1) Call pcre_study() with the PCRE_STUDY_JIT_COMPILE option for
      -      each compiled pattern, and pass the resulting pcre_extra block to
      -      pcre_exec().
      -
      -  (2) Use pcre_free_study() to free the pcre_extra block when it is
      -      no longer needed, instead of just freeing it yourself. This ensures that
      -      any JIT data is also freed.
      -
      -For a program that may be linked with pre-8.20 versions of PCRE, you can insert -
      -  #ifndef PCRE_STUDY_JIT_COMPILE
      -  #define PCRE_STUDY_JIT_COMPILE 0
      -  #endif
      -
      -so that no option is passed to pcre_study(), and then use something like -this to free the study data: -
      -  #ifdef PCRE_CONFIG_JIT
      -      pcre_free_study(study_ptr);
      -  #else
      -      pcre_free(study_ptr);
      -  #endif
      -
      -PCRE_STUDY_JIT_COMPILE requests the JIT compiler to generate code for complete -matches. If you want to run partial matches using the PCRE_PARTIAL_HARD or -PCRE_PARTIAL_SOFT options of pcre_exec(), you should set one or both of -the following options in addition to, or instead of, PCRE_STUDY_JIT_COMPILE -when you call pcre_study(): -
      -  PCRE_STUDY_JIT_PARTIAL_HARD_COMPILE
      -  PCRE_STUDY_JIT_PARTIAL_SOFT_COMPILE
      -
      -If using pcre_jit_exec() and supporting a pre-8.32 version of -PCRE, you can insert: -
      -   #if PCRE_MAJOR >= 8 && PCRE_MINOR >= 32
      -   pcre_jit_exec(...);
      -   #else
      -   pcre_exec(...)
      -   #endif
      -
      -but as described in the "JIT FAST PATH API" section below this assumes -version 8.32 and later are compiled with --enable-jit, which may -break. -
      -
      -The JIT compiler generates different optimized code for each of the three -modes (normal, soft partial, hard partial). When pcre_exec() is called, -the appropriate code is run if it is available. Otherwise, the pattern is -matched using interpretive code. -

      -

      -In some circumstances you may need to call additional functions. These are -described in the section entitled -"Controlling the JIT stack" -below. -

      -

      -If JIT support is not available, PCRE_STUDY_JIT_COMPILE etc. are ignored, and -no JIT data is created. Otherwise, the compiled pattern is passed to the JIT -compiler, which turns it into machine code that executes much faster than the -normal interpretive code. When pcre_exec() is passed a pcre_extra -block containing a pointer to JIT code of the appropriate mode (normal or -hard/soft partial), it obeys that code instead of running the interpreter. The -result is identical, but the compiled JIT code runs much faster. -

      -

      -There are some pcre_exec() options that are not supported for JIT -execution. There are also some pattern items that JIT cannot handle. Details -are given below. In both cases, execution automatically falls back to the -interpretive code. If you want to know whether JIT was actually used for a -particular match, you should arrange for a JIT callback function to be set up -as described in the section entitled -"Controlling the JIT stack" -below, even if you do not need to supply a non-default JIT stack. Such a -callback function is called whenever JIT code is about to be obeyed. If the -execution options are not right for JIT execution, the callback function is not -obeyed. -

      -

      -If the JIT compiler finds an unsupported item, no JIT data is generated. You -can find out if JIT execution is available after studying a pattern by calling -pcre_fullinfo() with the PCRE_INFO_JIT option. A result of 1 means that -JIT compilation was successful. A result of 0 means that JIT support is not -available, or the pattern was not studied with PCRE_STUDY_JIT_COMPILE etc., or -the JIT compiler was not able to handle the pattern. -

      -

      -Once a pattern has been studied, with or without JIT, it can be used as many -times as you like for matching different subject strings. -

      -
      UNSUPPORTED OPTIONS AND PATTERN ITEMS
      -

      -The only pcre_exec() options that are supported for JIT execution are -PCRE_NO_UTF8_CHECK, PCRE_NO_UTF16_CHECK, PCRE_NO_UTF32_CHECK, PCRE_NOTBOL, -PCRE_NOTEOL, PCRE_NOTEMPTY, PCRE_NOTEMPTY_ATSTART, PCRE_PARTIAL_HARD, and -PCRE_PARTIAL_SOFT. -

      -

      -The only unsupported pattern items are \C (match a single data unit) when -running in a UTF mode, and a callout immediately before an assertion condition -in a conditional group. -

      -
      RETURN VALUES FROM JIT EXECUTION
      -

      -When a pattern is matched using JIT execution, the return values are the same -as those given by the interpretive pcre_exec() code, with the addition of -one new error code: PCRE_ERROR_JIT_STACKLIMIT. This means that the memory used -for the JIT stack was insufficient. See -"Controlling the JIT stack" -below for a discussion of JIT stack usage. For compatibility with the -interpretive pcre_exec() code, no more than two-thirds of the -ovector argument is used for passing back captured substrings. -

      -

      -The error code PCRE_ERROR_MATCHLIMIT is returned by the JIT code if searching a -very large pattern tree goes on for too long, as it is in the same circumstance -when JIT is not used, but the details of exactly what is counted are not the -same. The PCRE_ERROR_RECURSIONLIMIT error code is never returned by JIT -execution. -

      -
      SAVING AND RESTORING COMPILED PATTERNS
      -

      -The code that is generated by the JIT compiler is architecture-specific, and is -also position dependent. For those reasons it cannot be saved (in a file or -database) and restored later like the bytecode and other data of a compiled -pattern. Saving and restoring compiled patterns is not something many people -do. More detail about this facility is given in the -pcreprecompile -documentation. It should be possible to run pcre_study() on a saved and -restored pattern, and thereby recreate the JIT data, but because JIT -compilation uses significant resources, it is probably not worth doing this; -you might as well recompile the original pattern. -

      -
      CONTROLLING THE JIT STACK
      -

      -When the compiled JIT code runs, it needs a block of memory to use as a stack. -By default, it uses 32K on the machine stack. However, some large or -complicated patterns need more than this. The error PCRE_ERROR_JIT_STACKLIMIT -is given when there is not enough stack. Three functions are provided for -managing blocks of memory for use as JIT stacks. There is further discussion -about the use of JIT stacks in the section entitled -"JIT stack FAQ" -below. -

      -

      -The pcre_jit_stack_alloc() function creates a JIT stack. Its arguments -are a starting size and a maximum size, and it returns a pointer to an opaque -structure of type pcre_jit_stack, or NULL if there is an error. The -pcre_jit_stack_free() function can be used to free a stack that is no -longer needed. (For the technically minded: the address space is allocated by -mmap or VirtualAlloc.) -

      -

      -JIT uses far less memory for recursion than the interpretive code, -and a maximum stack size of 512K to 1M should be more than enough for any -pattern. -

      -

      -The pcre_assign_jit_stack() function specifies which stack JIT code -should use. Its arguments are as follows: -

      -  pcre_extra         *extra
      -  pcre_jit_callback  callback
      -  void               *data
      -
      -The extra argument must be the result of studying a pattern with -PCRE_STUDY_JIT_COMPILE etc. There are three cases for the values of the other -two options: -
      -  (1) If callback is NULL and data is NULL, an internal 32K block
      -      on the machine stack is used.
      -
      -  (2) If callback is NULL and data is not NULL, data must be
      -      a valid JIT stack, the result of calling pcre_jit_stack_alloc().
      -
      -  (3) If callback is not NULL, it must point to a function that is
      -      called with data as an argument at the start of matching, in
      -      order to set up a JIT stack. If the return from the callback
      -      function is NULL, the internal 32K stack is used; otherwise the
      -      return value must be a valid JIT stack, the result of calling
      -      pcre_jit_stack_alloc().
      -
      -A callback function is obeyed whenever JIT code is about to be run; it is not -obeyed when pcre_exec() is called with options that are incompatible for -JIT execution. A callback function can therefore be used to determine whether a -match operation was executed by JIT or by the interpreter. -

      -

      -You may safely use the same JIT stack for more than one pattern (either by -assigning directly or by callback), as long as the patterns are all matched -sequentially in the same thread. In a multithread application, if you do not -specify a JIT stack, or if you assign or pass back NULL from a callback, that -is thread-safe, because each thread has its own machine stack. However, if you -assign or pass back a non-NULL JIT stack, this must be a different stack for -each thread so that the application is thread-safe. -

      -

      -Strictly speaking, even more is allowed. You can assign the same non-NULL stack -to any number of patterns as long as they are not used for matching by multiple -threads at the same time. For example, you can assign the same stack to all -compiled patterns, and use a global mutex in the callback to wait until the -stack is available for use. However, this is an inefficient solution, and not -recommended. -

      -

      -This is a suggestion for how a multithreaded program that needs to set up -non-default JIT stacks might operate: -

      -  During thread initalization
      -    thread_local_var = pcre_jit_stack_alloc(...)
      -
      -  During thread exit
      -    pcre_jit_stack_free(thread_local_var)
      -
      -  Use a one-line callback function
      -    return thread_local_var
      -
      -All the functions described in this section do nothing if JIT is not available, -and pcre_assign_jit_stack() does nothing unless the extra argument -is non-NULL and points to a pcre_extra block that is the result of a -successful study with PCRE_STUDY_JIT_COMPILE etc. -

      -
      JIT STACK FAQ
      -

      -(1) Why do we need JIT stacks? -
      -
      -PCRE (and JIT) is a recursive, depth-first engine, so it needs a stack where -the local data of the current node is pushed before checking its child nodes. -Allocating real machine stack on some platforms is difficult. For example, the -stack chain needs to be updated every time if we extend the stack on PowerPC. -Although it is possible, its updating time overhead decreases performance. So -we do the recursion in memory. -

      -

      -(2) Why don't we simply allocate blocks of memory with malloc()? -
      -
      -Modern operating systems have a nice feature: they can reserve an address space -instead of allocating memory. We can safely allocate memory pages inside this -address space, so the stack could grow without moving memory data (this is -important because of pointers). Thus we can allocate 1M address space, and use -only a single memory page (usually 4K) if that is enough. However, we can still -grow up to 1M anytime if needed. -

      -

      -(3) Who "owns" a JIT stack? -
      -
      -The owner of the stack is the user program, not the JIT studied pattern or -anything else. The user program must ensure that if a stack is used by -pcre_exec(), (that is, it is assigned to the pattern currently running), -that stack must not be used by any other threads (to avoid overwriting the same -memory area). The best practice for multithreaded programs is to allocate a -stack for each thread, and return this stack through the JIT callback function. -

      -

      -(4) When should a JIT stack be freed? -
      -
      -You can free a JIT stack at any time, as long as it will not be used by -pcre_exec() again. When you assign the stack to a pattern, only a pointer -is set. There is no reference counting or any other magic. You can free the -patterns and stacks in any order, anytime. Just do not call -pcre_exec() with a pattern pointing to an already freed stack, as that -will cause SEGFAULT. (Also, do not free a stack currently used by -pcre_exec() in another thread). You can also replace the stack for a -pattern at any time. You can even free the previous stack before assigning a -replacement. -

      -

      -(5) Should I allocate/free a stack every time before/after calling -pcre_exec()? -
      -
      -No, because this is too costly in terms of resources. However, you could -implement some clever idea which release the stack if it is not used in let's -say two minutes. The JIT callback can help to achieve this without keeping a -list of the currently JIT studied patterns. -

      -

      -(6) OK, the stack is for long term memory allocation. But what happens if a -pattern causes stack overflow with a stack of 1M? Is that 1M kept until the -stack is freed? -
      -
      -Especially on embedded sytems, it might be a good idea to release memory -sometimes without freeing the stack. There is no API for this at the moment. -Probably a function call which returns with the currently allocated memory for -any stack and another which allows releasing memory (shrinking the stack) would -be a good idea if someone needs this. -

      -

      -(7) This is too much of a headache. Isn't there any better solution for JIT -stack handling? -
      -
      -No, thanks to Windows. If POSIX threads were used everywhere, we could throw -out this complicated API. -

      -
      EXAMPLE CODE
      -

      -This is a single-threaded example that specifies a JIT stack without using a -callback. -

      -  int rc;
      -  int ovector[30];
      -  pcre *re;
      -  pcre_extra *extra;
      -  pcre_jit_stack *jit_stack;
      -
      -  re = pcre_compile(pattern, 0, &error, &erroffset, NULL);
      -  /* Check for errors */
      -  extra = pcre_study(re, PCRE_STUDY_JIT_COMPILE, &error);
      -  jit_stack = pcre_jit_stack_alloc(32*1024, 512*1024);
      -  /* Check for error (NULL) */
      -  pcre_assign_jit_stack(extra, NULL, jit_stack);
      -  rc = pcre_exec(re, extra, subject, length, 0, 0, ovector, 30);
      -  /* Check results */
      -  pcre_free(re);
      -  pcre_free_study(extra);
      -  pcre_jit_stack_free(jit_stack);
      -
      -
      -

      -
      JIT FAST PATH API
      -

      -Because the API described above falls back to interpreted execution when JIT is -not available, it is convenient for programs that are written for general use -in many environments. However, calling JIT via pcre_exec() does have a -performance impact. Programs that are written for use where JIT is known to be -available, and which need the best possible performance, can instead use a -"fast path" API to call JIT execution directly instead of calling -pcre_exec() (obviously only for patterns that have been successfully -studied by JIT). -

      -

      -The fast path function is called pcre_jit_exec(), and it takes exactly -the same arguments as pcre_exec(), plus one additional argument that -must point to a JIT stack. The JIT stack arrangements described above do not -apply. The return values are the same as for pcre_exec(). -

      -

      -When you call pcre_exec(), as well as testing for invalid options, a -number of other sanity checks are performed on the arguments. For example, if -the subject pointer is NULL, or its length is negative, an immediate error is -given. Also, unless PCRE_NO_UTF[8|16|32] is set, a UTF subject string is tested -for validity. In the interests of speed, these checks do not happen on the JIT -fast path, and if invalid data is passed, the result is undefined. -

      -

      -Bypassing the sanity checks and the pcre_exec() wrapping can give -speedups of more than 10%. -

      -

      -Note that the pcre_jit_exec() function is not available in versions of -PCRE before 8.32 (released in November 2012). If you need to support versions -that old you must either use the slower pcre_exec(), or switch between -the two codepaths by checking the values of PCRE_MAJOR and PCRE_MINOR. -

      -

      -Due to an unfortunate implementation oversight, even in versions 8.32 -and later there will be no pcre_jit_exec() stub function defined -when PCRE is compiled with --disable-jit, which is the default, and -there's no way to detect whether PCRE was compiled with --enable-jit -via a macro. -

      -

      -If you need to support versions older than 8.32, or versions that may -not build with --enable-jit, you must either use the slower -pcre_exec(), or switch between the two codepaths by checking the -values of PCRE_MAJOR and PCRE_MINOR. -

      -

      -Switching between the two by checking the version assumes that all the -versions being targeted are built with --enable-jit. To also support -builds that may use --disable-jit either pcre_exec() must be -used, or a compile-time check for JIT via pcre_config() (which -assumes the runtime environment will be the same), or as the Git -project decided to do, simply assume that pcre_jit_exec() is -present in 8.32 or later unless a compile-time flag is provided, see -the "grep: un-break building with PCRE >= 8.32 without --enable-jit" -commit in git.git for an example of that. -

      -
      SEE ALSO
      -

      -pcreapi(3) -

      -
      AUTHOR
      -

      -Philip Hazel (FAQ by Zoltan Herczeg) -
      -University Computing Service -
      -Cambridge CB2 3QH, England. -
      -

      -
      REVISION
      -

      -Last updated: 05 July 2017 -
      -Copyright © 1997-2017 University of Cambridge. -
      -

      -Return to the PCRE index page. -

      diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcrelimits.html b/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcrelimits.html deleted file mode 100644 index ee5ebf03..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcrelimits.html +++ /dev/null @@ -1,90 +0,0 @@ - - -pcrelimits specification - - -

      pcrelimits man page

      -

      -Return to the PCRE index page. -

      -

      -This page is part of the PCRE HTML documentation. It was generated automatically -from the original man page. If there is any nonsense in it, please consult the -man page, in case the conversion went wrong. -
      -
      -SIZE AND OTHER LIMITATIONS -
      -

      -There are some size limitations in PCRE but it is hoped that they will never in -practice be relevant. -

      -

      -The maximum length of a compiled pattern is approximately 64K data units (bytes -for the 8-bit library, 16-bit units for the 16-bit library, and 32-bit units for -the 32-bit library) if PCRE is compiled with the default internal linkage size, -which is 2 bytes for the 8-bit and 16-bit libraries, and 4 bytes for the 32-bit -library. If you want to process regular expressions that are truly enormous, -you can compile PCRE with an internal linkage size of 3 or 4 (when building the -16-bit or 32-bit library, 3 is rounded up to 4). See the README file in -the source distribution and the -pcrebuild -documentation for details. In these cases the limit is substantially larger. -However, the speed of execution is slower. -

      -

      -All values in repeating quantifiers must be less than 65536. -

      -

      -There is no limit to the number of parenthesized subpatterns, but there can be -no more than 65535 capturing subpatterns. There is, however, a limit to the -depth of nesting of parenthesized subpatterns of all kinds. This is imposed in -order to limit the amount of system stack used at compile time. The limit can -be specified when PCRE is built; the default is 250. -

      -

      -There is a limit to the number of forward references to subsequent subpatterns -of around 200,000. Repeated forward references with fixed upper limits, for -example, (?2){0,100} when subpattern number 2 is to the right, are included in -the count. There is no limit to the number of backward references. -

      -

      -The maximum length of name for a named subpattern is 32 characters, and the -maximum number of named subpatterns is 10000. -

      -

      -The maximum length of a name in a (*MARK), (*PRUNE), (*SKIP), or (*THEN) verb -is 255 for the 8-bit library and 65535 for the 16-bit and 32-bit libraries. -

      -

      -The maximum length of a subject string is the largest positive number that an -integer variable can hold. However, when using the traditional matching -function, PCRE uses recursion to handle subpatterns and indefinite repetition. -This means that the available stack space may limit the size of a subject -string that can be processed by certain patterns. For a discussion of stack -issues, see the -pcrestack -documentation. -

      -
      -AUTHOR -
      -

      -Philip Hazel -
      -University Computing Service -
      -Cambridge CB2 3QH, England. -
      -

      -
      -REVISION -
      -

      -Last updated: 05 November 2013 -
      -Copyright © 1997-2013 University of Cambridge. -
      -

      -Return to the PCRE index page. -

      diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcrematching.html b/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcrematching.html deleted file mode 100644 index a1af39b6..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcrematching.html +++ /dev/null @@ -1,242 +0,0 @@ - - -pcrematching specification - - -

      pcrematching man page

      -

      -Return to the PCRE index page. -

      -

      -This page is part of the PCRE HTML documentation. It was generated automatically -from the original man page. If there is any nonsense in it, please consult the -man page, in case the conversion went wrong. -
      -

      -
      PCRE MATCHING ALGORITHMS
      -

      -This document describes the two different algorithms that are available in PCRE -for matching a compiled regular expression against a given subject string. The -"standard" algorithm is the one provided by the pcre_exec(), -pcre16_exec() and pcre32_exec() functions. These work in the same -as as Perl's matching function, and provide a Perl-compatible matching operation. -The just-in-time (JIT) optimization that is described in the -pcrejit -documentation is compatible with these functions. -

      -

      -An alternative algorithm is provided by the pcre_dfa_exec(), -pcre16_dfa_exec() and pcre32_dfa_exec() functions; they operate in -a different way, and are not Perl-compatible. This alternative has advantages -and disadvantages compared with the standard algorithm, and these are described -below. -

      -

      -When there is only one possible way in which a given subject string can match a -pattern, the two algorithms give the same answer. A difference arises, however, -when there are multiple possibilities. For example, if the pattern -

      -  ^<.*>
      -
      -is matched against the string -
      -  <something> <something else> <something further>
      -
      -there are three possible answers. The standard algorithm finds only one of -them, whereas the alternative algorithm finds all three. -

      -
      REGULAR EXPRESSIONS AS TREES
      -

      -The set of strings that are matched by a regular expression can be represented -as a tree structure. An unlimited repetition in the pattern makes the tree of -infinite size, but it is still a tree. Matching the pattern to a given subject -string (from a given starting point) can be thought of as a search of the tree. -There are two ways to search a tree: depth-first and breadth-first, and these -correspond to the two matching algorithms provided by PCRE. -

      -
      THE STANDARD MATCHING ALGORITHM
      -

      -In the terminology of Jeffrey Friedl's book "Mastering Regular -Expressions", the standard algorithm is an "NFA algorithm". It conducts a -depth-first search of the pattern tree. That is, it proceeds along a single -path through the tree, checking that the subject matches what is required. When -there is a mismatch, the algorithm tries any alternatives at the current point, -and if they all fail, it backs up to the previous branch point in the tree, and -tries the next alternative branch at that level. This often involves backing up -(moving to the left) in the subject string as well. The order in which -repetition branches are tried is controlled by the greedy or ungreedy nature of -the quantifier. -

      -

      -If a leaf node is reached, a matching string has been found, and at that point -the algorithm stops. Thus, if there is more than one possible match, this -algorithm returns the first one that it finds. Whether this is the shortest, -the longest, or some intermediate length depends on the way the greedy and -ungreedy repetition quantifiers are specified in the pattern. -

      -

      -Because it ends up with a single path through the tree, it is relatively -straightforward for this algorithm to keep track of the substrings that are -matched by portions of the pattern in parentheses. This provides support for -capturing parentheses and back references. -

      -
      THE ALTERNATIVE MATCHING ALGORITHM
      -

      -This algorithm conducts a breadth-first search of the tree. Starting from the -first matching point in the subject, it scans the subject string from left to -right, once, character by character, and as it does this, it remembers all the -paths through the tree that represent valid matches. In Friedl's terminology, -this is a kind of "DFA algorithm", though it is not implemented as a -traditional finite state machine (it keeps multiple states active -simultaneously). -

      -

      -Although the general principle of this matching algorithm is that it scans the -subject string only once, without backtracking, there is one exception: when a -lookaround assertion is encountered, the characters following or preceding the -current point have to be independently inspected. -

      -

      -The scan continues until either the end of the subject is reached, or there are -no more unterminated paths. At this point, terminated paths represent the -different matching possibilities (if there are none, the match has failed). -Thus, if there is more than one possible match, this algorithm finds all of -them, and in particular, it finds the longest. The matches are returned in -decreasing order of length. There is an option to stop the algorithm after the -first match (which is necessarily the shortest) is found. -

      -

      -Note that all the matches that are found start at the same point in the -subject. If the pattern -

      -  cat(er(pillar)?)?
      -
      -is matched against the string "the caterpillar catchment", the result will be -the three strings "caterpillar", "cater", and "cat" that start at the fifth -character of the subject. The algorithm does not automatically move on to find -matches that start at later positions. -

      -

      -PCRE's "auto-possessification" optimization usually applies to character -repeats at the end of a pattern (as well as internally). For example, the -pattern "a\d+" is compiled as if it were "a\d++" because there is no point -even considering the possibility of backtracking into the repeated digits. For -DFA matching, this means that only one possible match is found. If you really -do want multiple matches in such cases, either use an ungreedy repeat -("a\d+?") or set the PCRE_NO_AUTO_POSSESS option when compiling. -

      -

      -There are a number of features of PCRE regular expressions that are not -supported by the alternative matching algorithm. They are as follows: -

      -

      -1. Because the algorithm finds all possible matches, the greedy or ungreedy -nature of repetition quantifiers is not relevant. Greedy and ungreedy -quantifiers are treated in exactly the same way. However, possessive -quantifiers can make a difference when what follows could also match what is -quantified, for example in a pattern like this: -

      -  ^a++\w!
      -
      -This pattern matches "aaab!" but not "aaa!", which would be matched by a -non-possessive quantifier. Similarly, if an atomic group is present, it is -matched as if it were a standalone pattern at the current point, and the -longest match is then "locked in" for the rest of the overall pattern. -

      -

      -2. When dealing with multiple paths through the tree simultaneously, it is not -straightforward to keep track of captured substrings for the different matching -possibilities, and PCRE's implementation of this algorithm does not attempt to -do this. This means that no captured substrings are available. -

      -

      -3. Because no substrings are captured, back references within the pattern are -not supported, and cause errors if encountered. -

      -

      -4. For the same reason, conditional expressions that use a backreference as the -condition or test for a specific group recursion are not supported. -

      -

      -5. Because many paths through the tree may be active, the \K escape sequence, -which resets the start of the match when encountered (but may be on some paths -and not on others), is not supported. It causes an error if encountered. -

      -

      -6. Callouts are supported, but the value of the capture_top field is -always 1, and the value of the capture_last field is always -1. -

      -

      -7. The \C escape sequence, which (in the standard algorithm) always matches a -single data unit, even in UTF-8, UTF-16 or UTF-32 modes, is not supported in -these modes, because the alternative algorithm moves through the subject string -one character (not data unit) at a time, for all active paths through the tree. -

      -

      -8. Except for (*FAIL), the backtracking control verbs such as (*PRUNE) are not -supported. (*FAIL) is supported, and behaves like a failing negative assertion. -

      -
      ADVANTAGES OF THE ALTERNATIVE ALGORITHM
      -

      -Using the alternative matching algorithm provides the following advantages: -

      -

      -1. All possible matches (at a single point in the subject) are automatically -found, and in particular, the longest match is found. To find more than one -match using the standard algorithm, you have to do kludgy things with -callouts. -

      -

      -2. Because the alternative algorithm scans the subject string just once, and -never needs to backtrack (except for lookbehinds), it is possible to pass very -long subject strings to the matching function in several pieces, checking for -partial matching each time. Although it is possible to do multi-segment -matching using the standard algorithm by retaining partially matched -substrings, it is more complicated. The -pcrepartial -documentation gives details of partial matching and discusses multi-segment -matching. -

      -
      DISADVANTAGES OF THE ALTERNATIVE ALGORITHM
      -

      -The alternative algorithm suffers from a number of disadvantages: -

      -

      -1. It is substantially slower than the standard algorithm. This is partly -because it has to search for all possible matches, but is also because it is -less susceptible to optimization. -

      -

      -2. Capturing parentheses and back references are not supported. -

      -

      -3. Although atomic groups are supported, their use does not provide the -performance advantage that it does for the standard algorithm. -

      -
      AUTHOR
      -

      -Philip Hazel -
      -University Computing Service -
      -Cambridge CB2 3QH, England. -
      -

      -
      REVISION
      -

      -Last updated: 12 November 2013 -
      -Copyright © 1997-2012 University of Cambridge. -
      -

      -Return to the PCRE index page. -

      diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcrepartial.html b/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcrepartial.html deleted file mode 100644 index 4faeafcb..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcrepartial.html +++ /dev/null @@ -1,509 +0,0 @@ - - -pcrepartial specification - - -

      pcrepartial man page

      -

      -Return to the PCRE index page. -

      -

      -This page is part of the PCRE HTML documentation. It was generated automatically -from the original man page. If there is any nonsense in it, please consult the -man page, in case the conversion went wrong. -
      -

      -
      PARTIAL MATCHING IN PCRE
      -

      -In normal use of PCRE, if the subject string that is passed to a matching -function matches as far as it goes, but is too short to match the entire -pattern, PCRE_ERROR_NOMATCH is returned. There are circumstances where it might -be helpful to distinguish this case from other cases in which there is no -match. -

      -

      -Consider, for example, an application where a human is required to type in data -for a field with specific formatting requirements. An example might be a date -in the form ddmmmyy, defined by this pattern: -

      -  ^\d?\d(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)\d\d$
      -
      -If the application sees the user's keystrokes one by one, and can check that -what has been typed so far is potentially valid, it is able to raise an error -as soon as a mistake is made, by beeping and not reflecting the character that -has been typed, for example. This immediate feedback is likely to be a better -user interface than a check that is delayed until the entire string has been -entered. Partial matching can also be useful when the subject string is very -long and is not all available at once. -

      -

      -PCRE supports partial matching by means of the PCRE_PARTIAL_SOFT and -PCRE_PARTIAL_HARD options, which can be set when calling any of the matching -functions. For backwards compatibility, PCRE_PARTIAL is a synonym for -PCRE_PARTIAL_SOFT. The essential difference between the two options is whether -or not a partial match is preferred to an alternative complete match, though -the details differ between the two types of matching function. If both options -are set, PCRE_PARTIAL_HARD takes precedence. -

      -

      -If you want to use partial matching with just-in-time optimized code, you must -call pcre_study(), pcre16_study() or pcre32_study() with one -or both of these options: -

      -  PCRE_STUDY_JIT_PARTIAL_SOFT_COMPILE
      -  PCRE_STUDY_JIT_PARTIAL_HARD_COMPILE
      -
      -PCRE_STUDY_JIT_COMPILE should also be set if you are going to run non-partial -matches on the same pattern. If the appropriate JIT study mode has not been set -for a match, the interpretive matching code is used. -

      -

      -Setting a partial matching option disables two of PCRE's standard -optimizations. PCRE remembers the last literal data unit in a pattern, and -abandons matching immediately if it is not present in the subject string. This -optimization cannot be used for a subject string that might match only -partially. If the pattern was studied, PCRE knows the minimum length of a -matching string, and does not bother to run the matching function on shorter -strings. This optimization is also disabled for partial matching. -

      -
      PARTIAL MATCHING USING pcre_exec() OR pcre[16|32]_exec()
      -

      -A partial match occurs during a call to pcre_exec() or -pcre[16|32]_exec() when the end of the subject string is reached -successfully, but matching cannot continue because more characters are needed. -However, at least one character in the subject must have been inspected. This -character need not form part of the final matched string; lookbehind assertions -and the \K escape sequence provide ways of inspecting characters before the -start of a matched substring. The requirement for inspecting at least one -character exists because an empty string can always be matched; without such a -restriction there would always be a partial match of an empty string at the end -of the subject. -

      -

      -If there are at least two slots in the offsets vector when a partial match is -returned, the first slot is set to the offset of the earliest character that -was inspected. For convenience, the second offset points to the end of the -subject so that a substring can easily be identified. If there are at least -three slots in the offsets vector, the third slot is set to the offset of the -character where matching started. -

      -

      -For the majority of patterns, the contents of the first and third slots will be -the same. However, for patterns that contain lookbehind assertions, or begin -with \b or \B, characters before the one where matching started may have been -inspected while carrying out the match. For example, consider this pattern: -

      -  /(?<=abc)123/
      -
      -This pattern matches "123", but only if it is preceded by "abc". If the subject -string is "xyzabc12", the first two offsets after a partial match are for the -substring "abc12", because all these characters were inspected. However, the -third offset is set to 6, because that is the offset where matching began. -

      -

      -What happens when a partial match is identified depends on which of the two -partial matching options are set. -

      -
      -PCRE_PARTIAL_SOFT WITH pcre_exec() OR pcre[16|32]_exec() -
      -

      -If PCRE_PARTIAL_SOFT is set when pcre_exec() or pcre[16|32]_exec() -identifies a partial match, the partial match is remembered, but matching -continues as normal, and other alternatives in the pattern are tried. If no -complete match can be found, PCRE_ERROR_PARTIAL is returned instead of -PCRE_ERROR_NOMATCH. -

      -

      -This option is "soft" because it prefers a complete match over a partial match. -All the various matching items in a pattern behave as if the subject string is -potentially complete. For example, \z, \Z, and $ match at the end of the -subject, as normal, and for \b and \B the end of the subject is treated as a -non-alphanumeric. -

      -

      -If there is more than one partial match, the first one that was found provides -the data that is returned. Consider this pattern: -

      -  /123\w+X|dogY/
      -
      -If this is matched against the subject string "abc123dog", both -alternatives fail to match, but the end of the subject is reached during -matching, so PCRE_ERROR_PARTIAL is returned. The offsets are set to 3 and 9, -identifying "123dog" as the first partial match that was found. (In this -example, there are two partial matches, because "dog" on its own partially -matches the second alternative.) -

      -
      -PCRE_PARTIAL_HARD WITH pcre_exec() OR pcre[16|32]_exec() -
      -

      -If PCRE_PARTIAL_HARD is set for pcre_exec() or pcre[16|32]_exec(), -PCRE_ERROR_PARTIAL is returned as soon as a partial match is found, without -continuing to search for possible complete matches. This option is "hard" -because it prefers an earlier partial match over a later complete match. For -this reason, the assumption is made that the end of the supplied subject string -may not be the true end of the available data, and so, if \z, \Z, \b, \B, -or $ are encountered at the end of the subject, the result is -PCRE_ERROR_PARTIAL, provided that at least one character in the subject has -been inspected. -

      -

      -Setting PCRE_PARTIAL_HARD also affects the way UTF-8 and UTF-16 -subject strings are checked for validity. Normally, an invalid sequence -causes the error PCRE_ERROR_BADUTF8 or PCRE_ERROR_BADUTF16. However, in the -special case of a truncated character at the end of the subject, -PCRE_ERROR_SHORTUTF8 or PCRE_ERROR_SHORTUTF16 is returned when -PCRE_PARTIAL_HARD is set. -

      -
      -Comparing hard and soft partial matching -
      -

      -The difference between the two partial matching options can be illustrated by a -pattern such as: -

      -  /dog(sbody)?/
      -
      -This matches either "dog" or "dogsbody", greedily (that is, it prefers the -longer string if possible). If it is matched against the string "dog" with -PCRE_PARTIAL_SOFT, it yields a complete match for "dog". However, if -PCRE_PARTIAL_HARD is set, the result is PCRE_ERROR_PARTIAL. On the other hand, -if the pattern is made ungreedy the result is different: -
      -  /dog(sbody)??/
      -
      -In this case the result is always a complete match because that is found first, -and matching never continues after finding a complete match. It might be easier -to follow this explanation by thinking of the two patterns like this: -
      -  /dog(sbody)?/    is the same as  /dogsbody|dog/
      -  /dog(sbody)??/   is the same as  /dog|dogsbody/
      -
      -The second pattern will never match "dogsbody", because it will always find the -shorter match first. -

      -
      PARTIAL MATCHING USING pcre_dfa_exec() OR pcre[16|32]_dfa_exec()
      -

      -The DFA functions move along the subject string character by character, without -backtracking, searching for all possible matches simultaneously. If the end of -the subject is reached before the end of the pattern, there is the possibility -of a partial match, again provided that at least one character has been -inspected. -

      -

      -When PCRE_PARTIAL_SOFT is set, PCRE_ERROR_PARTIAL is returned only if there -have been no complete matches. Otherwise, the complete matches are returned. -However, if PCRE_PARTIAL_HARD is set, a partial match takes precedence over any -complete matches. The portion of the string that was inspected when the longest -partial match was found is set as the first matching string, provided there are -at least two slots in the offsets vector. -

      -

      -Because the DFA functions always search for all possible matches, and there is -no difference between greedy and ungreedy repetition, their behaviour is -different from the standard functions when PCRE_PARTIAL_HARD is set. Consider -the string "dog" matched against the ungreedy pattern shown above: -

      -  /dog(sbody)??/
      -
      -Whereas the standard functions stop as soon as they find the complete match for -"dog", the DFA functions also find the partial match for "dogsbody", and so -return that when PCRE_PARTIAL_HARD is set. -

      -
      PARTIAL MATCHING AND WORD BOUNDARIES
      -

      -If a pattern ends with one of sequences \b or \B, which test for word -boundaries, partial matching with PCRE_PARTIAL_SOFT can give counter-intuitive -results. Consider this pattern: -

      -  /\bcat\b/
      -
      -This matches "cat", provided there is a word boundary at either end. If the -subject string is "the cat", the comparison of the final "t" with a following -character cannot take place, so a partial match is found. However, normal -matching carries on, and \b matches at the end of the subject when the last -character is a letter, so a complete match is found. The result, therefore, is -not PCRE_ERROR_PARTIAL. Using PCRE_PARTIAL_HARD in this case does yield -PCRE_ERROR_PARTIAL, because then the partial match takes precedence. -

      -
      FORMERLY RESTRICTED PATTERNS
      -

      -For releases of PCRE prior to 8.00, because of the way certain internal -optimizations were implemented in the pcre_exec() function, the -PCRE_PARTIAL option (predecessor of PCRE_PARTIAL_SOFT) could not be used with -all patterns. From release 8.00 onwards, the restrictions no longer apply, and -partial matching with can be requested for any pattern. -

      -

      -Items that were formerly restricted were repeated single characters and -repeated metasequences. If PCRE_PARTIAL was set for a pattern that did not -conform to the restrictions, pcre_exec() returned the error code -PCRE_ERROR_BADPARTIAL (-13). This error code is no longer in use. The -PCRE_INFO_OKPARTIAL call to pcre_fullinfo() to find out if a compiled -pattern can be used for partial matching now always returns 1. -

      -
      EXAMPLE OF PARTIAL MATCHING USING PCRETEST
      -

      -If the escape sequence \P is present in a pcretest data line, the -PCRE_PARTIAL_SOFT option is used for the match. Here is a run of pcretest -that uses the date example quoted above: -

      -    re> /^\d?\d(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)\d\d$/
      -  data> 25jun04\P
      -   0: 25jun04
      -   1: jun
      -  data> 25dec3\P
      -  Partial match: 23dec3
      -  data> 3ju\P
      -  Partial match: 3ju
      -  data> 3juj\P
      -  No match
      -  data> j\P
      -  No match
      -
      -The first data string is matched completely, so pcretest shows the -matched substrings. The remaining four strings do not match the complete -pattern, but the first two are partial matches. Similar output is obtained -if DFA matching is used. -

      -

      -If the escape sequence \P is present more than once in a pcretest data -line, the PCRE_PARTIAL_HARD option is set for the match. -

      -
      MULTI-SEGMENT MATCHING WITH pcre_dfa_exec() OR pcre[16|32]_dfa_exec()
      -

      -When a partial match has been found using a DFA matching function, it is -possible to continue the match by providing additional subject data and calling -the function again with the same compiled regular expression, this time setting -the PCRE_DFA_RESTART option. You must pass the same working space as before, -because this is where details of the previous partial match are stored. Here is -an example using pcretest, using the \R escape sequence to set the -PCRE_DFA_RESTART option (\D specifies the use of the DFA matching function): -

      -    re> /^\d?\d(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)\d\d$/
      -  data> 23ja\P\D
      -  Partial match: 23ja
      -  data> n05\R\D
      -   0: n05
      -
      -The first call has "23ja" as the subject, and requests partial matching; the -second call has "n05" as the subject for the continued (restarted) match. -Notice that when the match is complete, only the last part is shown; PCRE does -not retain the previously partially-matched string. It is up to the calling -program to do that if it needs to. -

      -

      -That means that, for an unanchored pattern, if a continued match fails, it is -not possible to try again at a new starting point. All this facility is capable -of doing is continuing with the previous match attempt. In the previous -example, if the second set of data is "ug23" the result is no match, even -though there would be a match for "aug23" if the entire string were given at -once. Depending on the application, this may or may not be what you want. -The only way to allow for starting again at the next character is to retain the -matched part of the subject and try a new complete match. -

      -

      -You can set the PCRE_PARTIAL_SOFT or PCRE_PARTIAL_HARD options with -PCRE_DFA_RESTART to continue partial matching over multiple segments. This -facility can be used to pass very long subject strings to the DFA matching -functions. -

      -
      MULTI-SEGMENT MATCHING WITH pcre_exec() OR pcre[16|32]_exec()
      -

      -From release 8.00, the standard matching functions can also be used to do -multi-segment matching. Unlike the DFA functions, it is not possible to -restart the previous match with a new segment of data. Instead, new data must -be added to the previous subject string, and the entire match re-run, starting -from the point where the partial match occurred. Earlier data can be discarded. -

      -

      -It is best to use PCRE_PARTIAL_HARD in this situation, because it does not -treat the end of a segment as the end of the subject when matching \z, \Z, -\b, \B, and $. Consider an unanchored pattern that matches dates: -

      -    re> /\d?\d(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)\d\d/
      -  data> The date is 23ja\P\P
      -  Partial match: 23ja
      -
      -At this stage, an application could discard the text preceding "23ja", add on -text from the next segment, and call the matching function again. Unlike the -DFA matching functions, the entire matching string must always be available, -and the complete matching process occurs for each call, so more memory and more -processing time is needed. -

      -

      -Note: If the pattern contains lookbehind assertions, or \K, or starts -with \b or \B, the string that is returned for a partial match includes -characters that precede the start of what would be returned for a complete -match, because it contains all the characters that were inspected during the -partial match. -

      -
      ISSUES WITH MULTI-SEGMENT MATCHING
      -

      -Certain types of pattern may give problems with multi-segment matching, -whichever matching function is used. -

      -

      -1. If the pattern contains a test for the beginning of a line, you need to pass -the PCRE_NOTBOL option when the subject string for any call does start at the -beginning of a line. There is also a PCRE_NOTEOL option, but in practice when -doing multi-segment matching you should be using PCRE_PARTIAL_HARD, which -includes the effect of PCRE_NOTEOL. -

      -

      -2. Lookbehind assertions that have already been obeyed are catered for in the -offsets that are returned for a partial match. However a lookbehind assertion -later in the pattern could require even earlier characters to be inspected. You -can handle this case by using the PCRE_INFO_MAXLOOKBEHIND option of the -pcre_fullinfo() or pcre[16|32]_fullinfo() functions to obtain the -length of the longest lookbehind in the pattern. This length is given in -characters, not bytes. If you always retain at least that many characters -before the partially matched string, all should be well. (Of course, near the -start of the subject, fewer characters may be present; in that case all -characters should be retained.) -

      -

      -From release 8.33, there is a more accurate way of deciding which characters to -retain. Instead of subtracting the length of the longest lookbehind from the -earliest inspected character (offsets[0]), the match start position -(offsets[2]) should be used, and the next match attempt started at the -offsets[2] character by setting the startoffset argument of -pcre_exec() or pcre_dfa_exec(). -

      -

      -For example, if the pattern "(?<=123)abc" is partially -matched against the string "xx123a", the three offset values returned are 2, 6, -and 5. This indicates that the matching process that gave a partial match -started at offset 5, but the characters "123a" were all inspected. The maximum -lookbehind for that pattern is 3, so taking that away from 5 shows that we need -only keep "123a", and the next match attempt can be started at offset 3 (that -is, at "a") when further characters have been added. When the match start is -not the earliest inspected character, pcretest shows it explicitly: -

      -    re> "(?<=123)abc"
      -  data> xx123a\P\P
      -  Partial match at offset 5: 123a
      -
      -

      -

      -3. Because a partial match must always contain at least one character, what -might be considered a partial match of an empty string actually gives a "no -match" result. For example: -

      -    re> /c(?<=abc)x/
      -  data> ab\P
      -  No match
      -
      -If the next segment begins "cx", a match should be found, but this will only -happen if characters from the previous segment are retained. For this reason, a -"no match" result should be interpreted as "partial match of an empty string" -when the pattern contains lookbehinds. -

      -

      -4. Matching a subject string that is split into multiple segments may not -always produce exactly the same result as matching over one single long string, -especially when PCRE_PARTIAL_SOFT is used. The section "Partial Matching and -Word Boundaries" above describes an issue that arises if the pattern ends with -\b or \B. Another kind of difference may occur when there are multiple -matching possibilities, because (for PCRE_PARTIAL_SOFT) a partial match result -is given only when there are no completed matches. This means that as soon as -the shortest match has been found, continuation to a new subject segment is no -longer possible. Consider again this pcretest example: -

      -    re> /dog(sbody)?/
      -  data> dogsb\P
      -   0: dog
      -  data> do\P\D
      -  Partial match: do
      -  data> gsb\R\P\D
      -   0: g
      -  data> dogsbody\D
      -   0: dogsbody
      -   1: dog
      -
      -The first data line passes the string "dogsb" to a standard matching function, -setting the PCRE_PARTIAL_SOFT option. Although the string is a partial match -for "dogsbody", the result is not PCRE_ERROR_PARTIAL, because the shorter -string "dog" is a complete match. Similarly, when the subject is presented to -a DFA matching function in several parts ("do" and "gsb" being the first two) -the match stops when "dog" has been found, and it is not possible to continue. -On the other hand, if "dogsbody" is presented as a single string, a DFA -matching function finds both matches. -

      -

      -Because of these problems, it is best to use PCRE_PARTIAL_HARD when matching -multi-segment data. The example above then behaves differently: -

      -    re> /dog(sbody)?/
      -  data> dogsb\P\P
      -  Partial match: dogsb
      -  data> do\P\D
      -  Partial match: do
      -  data> gsb\R\P\P\D
      -  Partial match: gsb
      -
      -5. Patterns that contain alternatives at the top level which do not all start -with the same pattern item may not work as expected when PCRE_DFA_RESTART is -used. For example, consider this pattern: -
      -  1234|3789
      -
      -If the first part of the subject is "ABC123", a partial match of the first -alternative is found at offset 3. There is no partial match for the second -alternative, because such a match does not start at the same point in the -subject string. Attempting to continue with the string "7890" does not yield a -match because only those alternatives that match at one point in the subject -are remembered. The problem arises because the start of the second alternative -matches within the first alternative. There is no problem with anchored -patterns or patterns such as: -
      -  1234|ABCD
      -
      -where no string can be a partial match for both alternatives. This is not a -problem if a standard matching function is used, because the entire match has -to be rerun each time: -
      -    re> /1234|3789/
      -  data> ABC123\P\P
      -  Partial match: 123
      -  data> 1237890
      -   0: 3789
      -
      -Of course, instead of using PCRE_DFA_RESTART, the same technique of re-running -the entire match can also be used with the DFA matching functions. Another -possibility is to work with two buffers. If a partial match at offset n -in the first buffer is followed by "no match" when PCRE_DFA_RESTART is used on -the second buffer, you can then try a new match starting at offset n+1 in -the first buffer. -

      -
      AUTHOR
      -

      -Philip Hazel -
      -University Computing Service -
      -Cambridge CB2 3QH, England. -
      -

      -
      REVISION
      -

      -Last updated: 02 July 2013 -
      -Copyright © 1997-2013 University of Cambridge. -
      -

      -Return to the PCRE index page. -

      diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcrepattern.html b/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcrepattern.html deleted file mode 100644 index 96fc7298..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcrepattern.html +++ /dev/null @@ -1,3276 +0,0 @@ - - -pcrepattern specification - - -

      pcrepattern man page

      -

      -Return to the PCRE index page. -

      -

      -This page is part of the PCRE HTML documentation. It was generated automatically -from the original man page. If there is any nonsense in it, please consult the -man page, in case the conversion went wrong. -
      -

      -
      PCRE REGULAR EXPRESSION DETAILS
      -

      -The syntax and semantics of the regular expressions that are supported by PCRE -are described in detail below. There is a quick-reference syntax summary in the -pcresyntax -page. PCRE tries to match Perl syntax and semantics as closely as it can. PCRE -also supports some alternative regular expression syntax (which does not -conflict with the Perl syntax) in order to provide some compatibility with -regular expressions in Python, .NET, and Oniguruma. -

      -

      -Perl's regular expressions are described in its own documentation, and -regular expressions in general are covered in a number of books, some of which -have copious examples. Jeffrey Friedl's "Mastering Regular Expressions", -published by O'Reilly, covers regular expressions in great detail. This -description of PCRE's regular expressions is intended as reference material. -

      -

      -This document discusses the patterns that are supported by PCRE when one its -main matching functions, pcre_exec() (8-bit) or pcre[16|32]_exec() -(16- or 32-bit), is used. PCRE also has alternative matching functions, -pcre_dfa_exec() and pcre[16|32_dfa_exec(), which match using a -different algorithm that is not Perl-compatible. Some of the features discussed -below are not available when DFA matching is used. The advantages and -disadvantages of the alternative functions, and how they differ from the normal -functions, are discussed in the -pcrematching -page. -

      -
      SPECIAL START-OF-PATTERN ITEMS
      -

      -A number of options that can be passed to pcre_compile() can also be set -by special items at the start of a pattern. These are not Perl-compatible, but -are provided to make these options accessible to pattern writers who are not -able to change the program that processes the pattern. Any number of these -items may appear, but they must all be together right at the start of the -pattern string, and the letters must be in upper case. -

      -
      -UTF support -
      -

      -The original operation of PCRE was on strings of one-byte characters. However, -there is now also support for UTF-8 strings in the original library, an -extra library that supports 16-bit and UTF-16 character strings, and a -third library that supports 32-bit and UTF-32 character strings. To use these -features, PCRE must be built to include appropriate support. When using UTF -strings you must either call the compiling function with the PCRE_UTF8, -PCRE_UTF16, or PCRE_UTF32 option, or the pattern must start with one of -these special sequences: -

      -  (*UTF8)
      -  (*UTF16)
      -  (*UTF32)
      -  (*UTF)
      -
      -(*UTF) is a generic sequence that can be used with any of the libraries. -Starting a pattern with such a sequence is equivalent to setting the relevant -option. How setting a UTF mode affects pattern matching is mentioned in several -places below. There is also a summary of features in the -pcreunicode -page. -

      -

      -Some applications that allow their users to supply patterns may wish to -restrict them to non-UTF data for security reasons. If the PCRE_NEVER_UTF -option is set at compile time, (*UTF) etc. are not allowed, and their -appearance causes an error. -

      -
      -Unicode property support -
      -

      -Another special sequence that may appear at the start of a pattern is (*UCP). -This has the same effect as setting the PCRE_UCP option: it causes sequences -such as \d and \w to use Unicode properties to determine character types, -instead of recognizing only characters with codes less than 128 via a lookup -table. -

      -
      -Disabling auto-possessification -
      -

      -If a pattern starts with (*NO_AUTO_POSSESS), it has the same effect as setting -the PCRE_NO_AUTO_POSSESS option at compile time. This stops PCRE from making -quantifiers possessive when what follows cannot match the repeated item. For -example, by default a+b is treated as a++b. For more details, see the -pcreapi -documentation. -

      -
      -Disabling start-up optimizations -
      -

      -If a pattern starts with (*NO_START_OPT), it has the same effect as setting the -PCRE_NO_START_OPTIMIZE option either at compile or matching time. This disables -several optimizations for quickly reaching "no match" results. For more -details, see the -pcreapi -documentation. -

      -
      -Newline conventions -
      -

      -PCRE supports five different conventions for indicating line breaks in -strings: a single CR (carriage return) character, a single LF (linefeed) -character, the two-character sequence CRLF, any of the three preceding, or any -Unicode newline sequence. The -pcreapi -page has -further discussion -about newlines, and shows how to set the newline convention in the -options arguments for the compiling and matching functions. -

      -

      -It is also possible to specify a newline convention by starting a pattern -string with one of the following five sequences: -

      -  (*CR)        carriage return
      -  (*LF)        linefeed
      -  (*CRLF)      carriage return, followed by linefeed
      -  (*ANYCRLF)   any of the three above
      -  (*ANY)       all Unicode newline sequences
      -
      -These override the default and the options given to the compiling function. For -example, on a Unix system where LF is the default newline sequence, the pattern -
      -  (*CR)a.b
      -
      -changes the convention to CR. That pattern matches "a\nb" because LF is no -longer a newline. If more than one of these settings is present, the last one -is used. -

      -

      -The newline convention affects where the circumflex and dollar assertions are -true. It also affects the interpretation of the dot metacharacter when -PCRE_DOTALL is not set, and the behaviour of \N. However, it does not affect -what the \R escape sequence matches. By default, this is any Unicode newline -sequence, for Perl compatibility. However, this can be changed; see the -description of \R in the section entitled -"Newline sequences" -below. A change of \R setting can be combined with a change of newline -convention. -

      -
      -Setting match and recursion limits -
      -

      -The caller of pcre_exec() can set a limit on the number of times the -internal match() function is called and on the maximum depth of -recursive calls. These facilities are provided to catch runaway matches that -are provoked by patterns with huge matching trees (a typical example is a -pattern with nested unlimited repeats) and to avoid running out of system stack -by too much recursion. When one of these limits is reached, pcre_exec() -gives an error return. The limits can also be set by items at the start of the -pattern of the form -

      -  (*LIMIT_MATCH=d)
      -  (*LIMIT_RECURSION=d)
      -
      -where d is any number of decimal digits. However, the value of the setting must -be less than the value set (or defaulted) by the caller of pcre_exec() -for it to have any effect. In other words, the pattern writer can lower the -limits set by the programmer, but not raise them. If there is more than one -setting of one of these limits, the lower value is used. -

      -
      EBCDIC CHARACTER CODES
      -

      -PCRE can be compiled to run in an environment that uses EBCDIC as its character -code rather than ASCII or Unicode (typically a mainframe system). In the -sections below, character code values are ASCII or Unicode; in an EBCDIC -environment these characters may have different code values, and there are no -code points greater than 255. -

      -
      CHARACTERS AND METACHARACTERS
      -

      -A regular expression is a pattern that is matched against a subject string from -left to right. Most characters stand for themselves in a pattern, and match the -corresponding characters in the subject. As a trivial example, the pattern -

      -  The quick brown fox
      -
      -matches a portion of a subject string that is identical to itself. When -caseless matching is specified (the PCRE_CASELESS option), letters are matched -independently of case. In a UTF mode, PCRE always understands the concept of -case for characters whose values are less than 128, so caseless matching is -always possible. For characters with higher values, the concept of case is -supported if PCRE is compiled with Unicode property support, but not otherwise. -If you want to use caseless matching for characters 128 and above, you must -ensure that PCRE is compiled with Unicode property support as well as with -UTF support. -

      -

      -The power of regular expressions comes from the ability to include alternatives -and repetitions in the pattern. These are encoded in the pattern by the use of -metacharacters, which do not stand for themselves but instead are -interpreted in some special way. -

      -

      -There are two different sets of metacharacters: those that are recognized -anywhere in the pattern except within square brackets, and those that are -recognized within square brackets. Outside square brackets, the metacharacters -are as follows: -

      -  \      general escape character with several uses
      -  ^      assert start of string (or line, in multiline mode)
      -  $      assert end of string (or line, in multiline mode)
      -  .      match any character except newline (by default)
      -  [      start character class definition
      -  |      start of alternative branch
      -  (      start subpattern
      -  )      end subpattern
      -  ?      extends the meaning of (
      -         also 0 or 1 quantifier
      -         also quantifier minimizer
      -  *      0 or more quantifier
      -  +      1 or more quantifier
      -         also "possessive quantifier"
      -  {      start min/max quantifier
      -
      -Part of a pattern that is in square brackets is called a "character class". In -a character class the only metacharacters are: -
      -  \      general escape character
      -  ^      negate the class, but only if the first character
      -  -      indicates character range
      -  [      POSIX character class (only if followed by POSIX syntax)
      -  ]      terminates the character class
      -
      -The following sections describe the use of each of the metacharacters. -

      -
      BACKSLASH
      -

      -The backslash character has several uses. Firstly, if it is followed by a -character that is not a number or a letter, it takes away any special meaning -that character may have. This use of backslash as an escape character applies -both inside and outside character classes. -

      -

      -For example, if you want to match a * character, you write \* in the pattern. -This escaping action applies whether or not the following character would -otherwise be interpreted as a metacharacter, so it is always safe to precede a -non-alphanumeric with backslash to specify that it stands for itself. In -particular, if you want to match a backslash, you write \\. -

      -

      -In a UTF mode, only ASCII numbers and letters have any special meaning after a -backslash. All other characters (in particular, those whose codepoints are -greater than 127) are treated as literals. -

      -

      -If a pattern is compiled with the PCRE_EXTENDED option, most white space in the -pattern (other than in a character class), and characters between a # outside a -character class and the next newline, inclusive, are ignored. An escaping -backslash can be used to include a white space or # character as part of the -pattern. -

      -

      -If you want to remove the special meaning from a sequence of characters, you -can do so by putting them between \Q and \E. This is different from Perl in -that $ and @ are handled as literals in \Q...\E sequences in PCRE, whereas in -Perl, $ and @ cause variable interpolation. Note the following examples: -

      -  Pattern            PCRE matches   Perl matches
      -
      -  \Qabc$xyz\E        abc$xyz        abc followed by the contents of $xyz
      -  \Qabc\$xyz\E       abc\$xyz       abc\$xyz
      -  \Qabc\E\$\Qxyz\E   abc$xyz        abc$xyz
      -
      -The \Q...\E sequence is recognized both inside and outside character classes. -An isolated \E that is not preceded by \Q is ignored. If \Q is not followed -by \E later in the pattern, the literal interpretation continues to the end of -the pattern (that is, \E is assumed at the end). If the isolated \Q is inside -a character class, this causes an error, because the character class is not -terminated. -

      -
      -Non-printing characters -
      -

      -A second use of backslash provides a way of encoding non-printing characters -in patterns in a visible manner. There is no restriction on the appearance of -non-printing characters, apart from the binary zero that terminates a pattern, -but when a pattern is being prepared by text editing, it is often easier to use -one of the following escape sequences than the binary character it represents. -In an ASCII or Unicode environment, these escapes are as follows: -

      -  \a        alarm, that is, the BEL character (hex 07)
      -  \cx       "control-x", where x is any ASCII character
      -  \e        escape (hex 1B)
      -  \f        form feed (hex 0C)
      -  \n        linefeed (hex 0A)
      -  \r        carriage return (hex 0D)
      -  \t        tab (hex 09)
      -  \0dd      character with octal code 0dd
      -  \ddd      character with octal code ddd, or back reference
      -  \o{ddd..} character with octal code ddd..
      -  \xhh      character with hex code hh
      -  \x{hhh..} character with hex code hhh.. (non-JavaScript mode)
      -  \uhhhh    character with hex code hhhh (JavaScript mode only)
      -
      -The precise effect of \cx on ASCII characters is as follows: if x is a lower -case letter, it is converted to upper case. Then bit 6 of the character (hex -40) is inverted. Thus \cA to \cZ become hex 01 to hex 1A (A is 41, Z is 5A), -but \c{ becomes hex 3B ({ is 7B), and \c; becomes hex 7B (; is 3B). If the -data item (byte or 16-bit value) following \c has a value greater than 127, a -compile-time error occurs. This locks out non-ASCII characters in all modes. -

      -

      -When PCRE is compiled in EBCDIC mode, \a, \e, \f, \n, \r, and \t -generate the appropriate EBCDIC code values. The \c escape is processed -as specified for Perl in the perlebcdic document. The only characters -that are allowed after \c are A-Z, a-z, or one of @, [, \, ], ^, _, or ?. Any -other character provokes a compile-time error. The sequence \c@ encodes -character code 0; after \c the letters (in either case) encode characters 1-26 -(hex 01 to hex 1A); [, \, ], ^, and _ encode characters 27-31 (hex 1B to hex -1F), and \c? becomes either 255 (hex FF) or 95 (hex 5F). -

      -

      -Thus, apart from \c?, these escapes generate the same character code values as -they do in an ASCII environment, though the meanings of the values mostly -differ. For example, \cG always generates code value 7, which is BEL in ASCII -but DEL in EBCDIC. -

      -

      -The sequence \c? generates DEL (127, hex 7F) in an ASCII environment, but -because 127 is not a control character in EBCDIC, Perl makes it generate the -APC character. Unfortunately, there are several variants of EBCDIC. In most of -them the APC character has the value 255 (hex FF), but in the one Perl calls -POSIX-BC its value is 95 (hex 5F). If certain other characters have POSIX-BC -values, PCRE makes \c? generate 95; otherwise it generates 255. -

      -

      -After \0 up to two further octal digits are read. If there are fewer than two -digits, just those that are present are used. Thus the sequence \0\x\015 -specifies two binary zeros followed by a CR character (code value 13). Make -sure you supply two digits after the initial zero if the pattern character that -follows is itself an octal digit. -

      -

      -The escape \o must be followed by a sequence of octal digits, enclosed in -braces. An error occurs if this is not the case. This escape is a recent -addition to Perl; it provides way of specifying character code points as octal -numbers greater than 0777, and it also allows octal numbers and back references -to be unambiguously specified. -

      -

      -For greater clarity and unambiguity, it is best to avoid following \ by a -digit greater than zero. Instead, use \o{} or \x{} to specify character -numbers, and \g{} to specify back references. The following paragraphs -describe the old, ambiguous syntax. -

      -

      -The handling of a backslash followed by a digit other than 0 is complicated, -and Perl has changed in recent releases, causing PCRE also to change. Outside a -character class, PCRE reads the digit and any following digits as a decimal -number. If the number is less than 8, or if there have been at least that many -previous capturing left parentheses in the expression, the entire sequence is -taken as a back reference. A description of how this works is given -later, -following the discussion of -parenthesized subpatterns. -

      -

      -Inside a character class, or if the decimal number following \ is greater than -7 and there have not been that many capturing subpatterns, PCRE handles \8 and -\9 as the literal characters "8" and "9", and otherwise re-reads up to three -octal digits following the backslash, using them to generate a data character. -Any subsequent digits stand for themselves. For example: -

      -  \040   is another way of writing an ASCII space
      -  \40    is the same, provided there are fewer than 40 previous capturing subpatterns
      -  \7     is always a back reference
      -  \11    might be a back reference, or another way of writing a tab
      -  \011   is always a tab
      -  \0113  is a tab followed by the character "3"
      -  \113   might be a back reference, otherwise the character with octal code 113
      -  \377   might be a back reference, otherwise the value 255 (decimal)
      -  \81    is either a back reference, or the two characters "8" and "1"
      -
      -Note that octal values of 100 or greater that are specified using this syntax -must not be introduced by a leading zero, because no more than three octal -digits are ever read. -

      -

      -By default, after \x that is not followed by {, from zero to two hexadecimal -digits are read (letters can be in upper or lower case). Any number of -hexadecimal digits may appear between \x{ and }. If a character other than -a hexadecimal digit appears between \x{ and }, or if there is no terminating -}, an error occurs. -

      -

      -If the PCRE_JAVASCRIPT_COMPAT option is set, the interpretation of \x is -as just described only when it is followed by two hexadecimal digits. -Otherwise, it matches a literal "x" character. In JavaScript mode, support for -code points greater than 256 is provided by \u, which must be followed by -four hexadecimal digits; otherwise it matches a literal "u" character. -

      -

      -Characters whose value is less than 256 can be defined by either of the two -syntaxes for \x (or by \u in JavaScript mode). There is no difference in the -way they are handled. For example, \xdc is exactly the same as \x{dc} (or -\u00dc in JavaScript mode). -

      -
      -Constraints on character values -
      -

      -Characters that are specified using octal or hexadecimal numbers are -limited to certain values, as follows: -

      -  8-bit non-UTF mode    less than 0x100
      -  8-bit UTF-8 mode      less than 0x10ffff and a valid codepoint
      -  16-bit non-UTF mode   less than 0x10000
      -  16-bit UTF-16 mode    less than 0x10ffff and a valid codepoint
      -  32-bit non-UTF mode   less than 0x100000000
      -  32-bit UTF-32 mode    less than 0x10ffff and a valid codepoint
      -
      -Invalid Unicode codepoints are the range 0xd800 to 0xdfff (the so-called -"surrogate" codepoints), and 0xffef. -

      -
      -Escape sequences in character classes -
      -

      -All the sequences that define a single character value can be used both inside -and outside character classes. In addition, inside a character class, \b is -interpreted as the backspace character (hex 08). -

      -

      -\N is not allowed in a character class. \B, \R, and \X are not special -inside a character class. Like other unrecognized escape sequences, they are -treated as the literal characters "B", "R", and "X" by default, but cause an -error if the PCRE_EXTRA option is set. Outside a character class, these -sequences have different meanings. -

      -
      -Unsupported escape sequences -
      -

      -In Perl, the sequences \l, \L, \u, and \U are recognized by its string -handler and used to modify the case of following characters. By default, PCRE -does not support these escape sequences. However, if the PCRE_JAVASCRIPT_COMPAT -option is set, \U matches a "U" character, and \u can be used to define a -character by code point, as described in the previous section. -

      -
      -Absolute and relative back references -
      -

      -The sequence \g followed by an unsigned or a negative number, optionally -enclosed in braces, is an absolute or relative back reference. A named back -reference can be coded as \g{name}. Back references are discussed -later, -following the discussion of -parenthesized subpatterns. -

      -
      -Absolute and relative subroutine calls -
      -

      -For compatibility with Oniguruma, the non-Perl syntax \g followed by a name or -a number enclosed either in angle brackets or single quotes, is an alternative -syntax for referencing a subpattern as a "subroutine". Details are discussed -later. -Note that \g{...} (Perl syntax) and \g<...> (Oniguruma syntax) are not -synonymous. The former is a back reference; the latter is a -subroutine -call. -

      -
      -Generic character types -
      -

      -Another use of backslash is for specifying generic character types: -

      -  \d     any decimal digit
      -  \D     any character that is not a decimal digit
      -  \h     any horizontal white space character
      -  \H     any character that is not a horizontal white space character
      -  \s     any white space character
      -  \S     any character that is not a white space character
      -  \v     any vertical white space character
      -  \V     any character that is not a vertical white space character
      -  \w     any "word" character
      -  \W     any "non-word" character
      -
      -There is also the single sequence \N, which matches a non-newline character. -This is the same as -the "." metacharacter -when PCRE_DOTALL is not set. Perl also uses \N to match characters by name; -PCRE does not support this. -

      -

      -Each pair of lower and upper case escape sequences partitions the complete set -of characters into two disjoint sets. Any given character matches one, and only -one, of each pair. The sequences can appear both inside and outside character -classes. They each match one character of the appropriate type. If the current -matching point is at the end of the subject string, all of them fail, because -there is no character to match. -

      -

      -For compatibility with Perl, \s did not used to match the VT character (code -11), which made it different from the the POSIX "space" class. However, Perl -added VT at release 5.18, and PCRE followed suit at release 8.34. The default -\s characters are now HT (9), LF (10), VT (11), FF (12), CR (13), and space -(32), which are defined as white space in the "C" locale. This list may vary if -locale-specific matching is taking place. For example, in some locales the -"non-breaking space" character (\xA0) is recognized as white space, and in -others the VT character is not. -

      -

      -A "word" character is an underscore or any character that is a letter or digit. -By default, the definition of letters and digits is controlled by PCRE's -low-valued character tables, and may vary if locale-specific matching is taking -place (see -"Locale support" -in the -pcreapi -page). For example, in a French locale such as "fr_FR" in Unix-like systems, -or "french" in Windows, some character codes greater than 127 are used for -accented letters, and these are then matched by \w. The use of locales with -Unicode is discouraged. -

      -

      -By default, characters whose code points are greater than 127 never match \d, -\s, or \w, and always match \D, \S, and \W, although this may vary for -characters in the range 128-255 when locale-specific matching is happening. -These escape sequences retain their original meanings from before Unicode -support was available, mainly for efficiency reasons. If PCRE is compiled with -Unicode property support, and the PCRE_UCP option is set, the behaviour is -changed so that Unicode properties are used to determine character types, as -follows: -

      -  \d  any character that matches \p{Nd} (decimal digit)
      -  \s  any character that matches \p{Z} or \h or \v
      -  \w  any character that matches \p{L} or \p{N}, plus underscore
      -
      -The upper case escapes match the inverse sets of characters. Note that \d -matches only decimal digits, whereas \w matches any Unicode digit, as well as -any Unicode letter, and underscore. Note also that PCRE_UCP affects \b, and -\B because they are defined in terms of \w and \W. Matching these sequences -is noticeably slower when PCRE_UCP is set. -

      -

      -The sequences \h, \H, \v, and \V are features that were added to Perl at -release 5.10. In contrast to the other sequences, which match only ASCII -characters by default, these always match certain high-valued code points, -whether or not PCRE_UCP is set. The horizontal space characters are: -

      -  U+0009     Horizontal tab (HT)
      -  U+0020     Space
      -  U+00A0     Non-break space
      -  U+1680     Ogham space mark
      -  U+180E     Mongolian vowel separator
      -  U+2000     En quad
      -  U+2001     Em quad
      -  U+2002     En space
      -  U+2003     Em space
      -  U+2004     Three-per-em space
      -  U+2005     Four-per-em space
      -  U+2006     Six-per-em space
      -  U+2007     Figure space
      -  U+2008     Punctuation space
      -  U+2009     Thin space
      -  U+200A     Hair space
      -  U+202F     Narrow no-break space
      -  U+205F     Medium mathematical space
      -  U+3000     Ideographic space
      -
      -The vertical space characters are: -
      -  U+000A     Linefeed (LF)
      -  U+000B     Vertical tab (VT)
      -  U+000C     Form feed (FF)
      -  U+000D     Carriage return (CR)
      -  U+0085     Next line (NEL)
      -  U+2028     Line separator
      -  U+2029     Paragraph separator
      -
      -In 8-bit, non-UTF-8 mode, only the characters with codepoints less than 256 are -relevant. -

      -
      -Newline sequences -
      -

      -Outside a character class, by default, the escape sequence \R matches any -Unicode newline sequence. In 8-bit non-UTF-8 mode \R is equivalent to the -following: -

      -  (?>\r\n|\n|\x0b|\f|\r|\x85)
      -
      -This is an example of an "atomic group", details of which are given -below. -This particular group matches either the two-character sequence CR followed by -LF, or one of the single characters LF (linefeed, U+000A), VT (vertical tab, -U+000B), FF (form feed, U+000C), CR (carriage return, U+000D), or NEL (next -line, U+0085). The two-character sequence is treated as a single unit that -cannot be split. -

      -

      -In other modes, two additional characters whose codepoints are greater than 255 -are added: LS (line separator, U+2028) and PS (paragraph separator, U+2029). -Unicode character property support is not needed for these characters to be -recognized. -

      -

      -It is possible to restrict \R to match only CR, LF, or CRLF (instead of the -complete set of Unicode line endings) by setting the option PCRE_BSR_ANYCRLF -either at compile time or when the pattern is matched. (BSR is an abbrevation -for "backslash R".) This can be made the default when PCRE is built; if this is -the case, the other behaviour can be requested via the PCRE_BSR_UNICODE option. -It is also possible to specify these settings by starting a pattern string with -one of the following sequences: -

      -  (*BSR_ANYCRLF)   CR, LF, or CRLF only
      -  (*BSR_UNICODE)   any Unicode newline sequence
      -
      -These override the default and the options given to the compiling function, but -they can themselves be overridden by options given to a matching function. Note -that these special settings, which are not Perl-compatible, are recognized only -at the very start of a pattern, and that they must be in upper case. If more -than one of them is present, the last one is used. They can be combined with a -change of newline convention; for example, a pattern can start with: -
      -  (*ANY)(*BSR_ANYCRLF)
      -
      -They can also be combined with the (*UTF8), (*UTF16), (*UTF32), (*UTF) or -(*UCP) special sequences. Inside a character class, \R is treated as an -unrecognized escape sequence, and so matches the letter "R" by default, but -causes an error if PCRE_EXTRA is set. -

      -
      -Unicode character properties -
      -

      -When PCRE is built with Unicode character property support, three additional -escape sequences that match characters with specific properties are available. -When in 8-bit non-UTF-8 mode, these sequences are of course limited to testing -characters whose codepoints are less than 256, but they do work in this mode. -The extra escape sequences are: -

      -  \p{xx}   a character with the xx property
      -  \P{xx}   a character without the xx property
      -  \X       a Unicode extended grapheme cluster
      -
      -The property names represented by xx above are limited to the Unicode -script names, the general category properties, "Any", which matches any -character (including newline), and some special PCRE properties (described -in the -next section). -Other Perl properties such as "InMusicalSymbols" are not currently supported by -PCRE. Note that \P{Any} does not match any characters, so always causes a -match failure. -

      -

      -Sets of Unicode characters are defined as belonging to certain scripts. A -character from one of these sets can be matched using a script name. For -example: -

      -  \p{Greek}
      -  \P{Han}
      -
      -Those that are not part of an identified script are lumped together as -"Common". The current list of scripts is: -

      -

      -Arabic, -Armenian, -Avestan, -Balinese, -Bamum, -Bassa_Vah, -Batak, -Bengali, -Bopomofo, -Brahmi, -Braille, -Buginese, -Buhid, -Canadian_Aboriginal, -Carian, -Caucasian_Albanian, -Chakma, -Cham, -Cherokee, -Common, -Coptic, -Cuneiform, -Cypriot, -Cyrillic, -Deseret, -Devanagari, -Duployan, -Egyptian_Hieroglyphs, -Elbasan, -Ethiopic, -Georgian, -Glagolitic, -Gothic, -Grantha, -Greek, -Gujarati, -Gurmukhi, -Han, -Hangul, -Hanunoo, -Hebrew, -Hiragana, -Imperial_Aramaic, -Inherited, -Inscriptional_Pahlavi, -Inscriptional_Parthian, -Javanese, -Kaithi, -Kannada, -Katakana, -Kayah_Li, -Kharoshthi, -Khmer, -Khojki, -Khudawadi, -Lao, -Latin, -Lepcha, -Limbu, -Linear_A, -Linear_B, -Lisu, -Lycian, -Lydian, -Mahajani, -Malayalam, -Mandaic, -Manichaean, -Meetei_Mayek, -Mende_Kikakui, -Meroitic_Cursive, -Meroitic_Hieroglyphs, -Miao, -Modi, -Mongolian, -Mro, -Myanmar, -Nabataean, -New_Tai_Lue, -Nko, -Ogham, -Ol_Chiki, -Old_Italic, -Old_North_Arabian, -Old_Permic, -Old_Persian, -Old_South_Arabian, -Old_Turkic, -Oriya, -Osmanya, -Pahawh_Hmong, -Palmyrene, -Pau_Cin_Hau, -Phags_Pa, -Phoenician, -Psalter_Pahlavi, -Rejang, -Runic, -Samaritan, -Saurashtra, -Sharada, -Shavian, -Siddham, -Sinhala, -Sora_Sompeng, -Sundanese, -Syloti_Nagri, -Syriac, -Tagalog, -Tagbanwa, -Tai_Le, -Tai_Tham, -Tai_Viet, -Takri, -Tamil, -Telugu, -Thaana, -Thai, -Tibetan, -Tifinagh, -Tirhuta, -Ugaritic, -Vai, -Warang_Citi, -Yi. -

      -

      -Each character has exactly one Unicode general category property, specified by -a two-letter abbreviation. For compatibility with Perl, negation can be -specified by including a circumflex between the opening brace and the property -name. For example, \p{^Lu} is the same as \P{Lu}. -

      -

      -If only one letter is specified with \p or \P, it includes all the general -category properties that start with that letter. In this case, in the absence -of negation, the curly brackets in the escape sequence are optional; these two -examples have the same effect: -

      -  \p{L}
      -  \pL
      -
      -The following general category property codes are supported: -
      -  C     Other
      -  Cc    Control
      -  Cf    Format
      -  Cn    Unassigned
      -  Co    Private use
      -  Cs    Surrogate
      -
      -  L     Letter
      -  Ll    Lower case letter
      -  Lm    Modifier letter
      -  Lo    Other letter
      -  Lt    Title case letter
      -  Lu    Upper case letter
      -
      -  M     Mark
      -  Mc    Spacing mark
      -  Me    Enclosing mark
      -  Mn    Non-spacing mark
      -
      -  N     Number
      -  Nd    Decimal number
      -  Nl    Letter number
      -  No    Other number
      -
      -  P     Punctuation
      -  Pc    Connector punctuation
      -  Pd    Dash punctuation
      -  Pe    Close punctuation
      -  Pf    Final punctuation
      -  Pi    Initial punctuation
      -  Po    Other punctuation
      -  Ps    Open punctuation
      -
      -  S     Symbol
      -  Sc    Currency symbol
      -  Sk    Modifier symbol
      -  Sm    Mathematical symbol
      -  So    Other symbol
      -
      -  Z     Separator
      -  Zl    Line separator
      -  Zp    Paragraph separator
      -  Zs    Space separator
      -
      -The special property L& is also supported: it matches a character that has -the Lu, Ll, or Lt property, in other words, a letter that is not classified as -a modifier or "other". -

      -

      -The Cs (Surrogate) property applies only to characters in the range U+D800 to -U+DFFF. Such characters are not valid in Unicode strings and so -cannot be tested by PCRE, unless UTF validity checking has been turned off -(see the discussion of PCRE_NO_UTF8_CHECK, PCRE_NO_UTF16_CHECK and -PCRE_NO_UTF32_CHECK in the -pcreapi -page). Perl does not support the Cs property. -

      -

      -The long synonyms for property names that Perl supports (such as \p{Letter}) -are not supported by PCRE, nor is it permitted to prefix any of these -properties with "Is". -

      -

      -No character that is in the Unicode table has the Cn (unassigned) property. -Instead, this property is assumed for any code point that is not in the -Unicode table. -

      -

      -Specifying caseless matching does not affect these escape sequences. For -example, \p{Lu} always matches only upper case letters. This is different from -the behaviour of current versions of Perl. -

      -

      -Matching characters by Unicode property is not fast, because PCRE has to do a -multistage table lookup in order to find a character's property. That is why -the traditional escape sequences such as \d and \w do not use Unicode -properties in PCRE by default, though you can make them do so by setting the -PCRE_UCP option or by starting the pattern with (*UCP). -

      -
      -Extended grapheme clusters -
      -

      -The \X escape matches any number of Unicode characters that form an "extended -grapheme cluster", and treats the sequence as an atomic group -(see below). -Up to and including release 8.31, PCRE matched an earlier, simpler definition -that was equivalent to -

      -  (?>\PM\pM*)
      -
      -That is, it matched a character without the "mark" property, followed by zero -or more characters with the "mark" property. Characters with the "mark" -property are typically non-spacing accents that affect the preceding character. -

      -

      -This simple definition was extended in Unicode to include more complicated -kinds of composite character by giving each character a grapheme breaking -property, and creating rules that use these properties to define the boundaries -of extended grapheme clusters. In releases of PCRE later than 8.31, \X matches -one of these clusters. -

      -

      -\X always matches at least one character. Then it decides whether to add -additional characters according to the following rules for ending a cluster: -

      -

      -1. End at the end of the subject string. -

      -

      -2. Do not end between CR and LF; otherwise end after any control character. -

      -

      -3. Do not break Hangul (a Korean script) syllable sequences. Hangul characters -are of five types: L, V, T, LV, and LVT. An L character may be followed by an -L, V, LV, or LVT character; an LV or V character may be followed by a V or T -character; an LVT or T character may be follwed only by a T character. -

      -

      -4. Do not end before extending characters or spacing marks. Characters with -the "mark" property always have the "extend" grapheme breaking property. -

      -

      -5. Do not end after prepend characters. -

      -

      -6. Otherwise, end the cluster. -

      -
      -PCRE's additional properties -
      -

      -As well as the standard Unicode properties described above, PCRE supports four -more that make it possible to convert traditional escape sequences such as \w -and \s to use Unicode properties. PCRE uses these non-standard, non-Perl -properties internally when PCRE_UCP is set. However, they may also be used -explicitly. These properties are: -

      -  Xan   Any alphanumeric character
      -  Xps   Any POSIX space character
      -  Xsp   Any Perl space character
      -  Xwd   Any Perl "word" character
      -
      -Xan matches characters that have either the L (letter) or the N (number) -property. Xps matches the characters tab, linefeed, vertical tab, form feed, or -carriage return, and any other character that has the Z (separator) property. -Xsp is the same as Xps; it used to exclude vertical tab, for Perl -compatibility, but Perl changed, and so PCRE followed at release 8.34. Xwd -matches the same characters as Xan, plus underscore. -

      -

      -There is another non-standard property, Xuc, which matches any character that -can be represented by a Universal Character Name in C++ and other programming -languages. These are the characters $, @, ` (grave accent), and all characters -with Unicode code points greater than or equal to U+00A0, except for the -surrogates U+D800 to U+DFFF. Note that most base (ASCII) characters are -excluded. (Universal Character Names are of the form \uHHHH or \UHHHHHHHH -where H is a hexadecimal digit. Note that the Xuc property does not match these -sequences but the characters that they represent.) -

      -
      -Resetting the match start -
      -

      -The escape sequence \K causes any previously matched characters not to be -included in the final matched sequence. For example, the pattern: -

      -  foo\Kbar
      -
      -matches "foobar", but reports that it has matched "bar". This feature is -similar to a lookbehind assertion -(described below). -However, in this case, the part of the subject before the real match does not -have to be of fixed length, as lookbehind assertions do. The use of \K does -not interfere with the setting of -captured substrings. -For example, when the pattern -
      -  (foo)\Kbar
      -
      -matches "foobar", the first substring is still set to "foo". -

      -

      -Perl documents that the use of \K within assertions is "not well defined". In -PCRE, \K is acted upon when it occurs inside positive assertions, but is -ignored in negative assertions. Note that when a pattern such as (?=ab\K) -matches, the reported start of the match can be greater than the end of the -match. -

      -
      -Simple assertions -
      -

      -The final use of backslash is for certain simple assertions. An assertion -specifies a condition that has to be met at a particular point in a match, -without consuming any characters from the subject string. The use of -subpatterns for more complicated assertions is described -below. -The backslashed assertions are: -

      -  \b     matches at a word boundary
      -  \B     matches when not at a word boundary
      -  \A     matches at the start of the subject
      -  \Z     matches at the end of the subject
      -          also matches before a newline at the end of the subject
      -  \z     matches only at the end of the subject
      -  \G     matches at the first matching position in the subject
      -
      -Inside a character class, \b has a different meaning; it matches the backspace -character. If any other of these assertions appears in a character class, by -default it matches the corresponding literal character (for example, \B -matches the letter B). However, if the PCRE_EXTRA option is set, an "invalid -escape sequence" error is generated instead. -

      -

      -A word boundary is a position in the subject string where the current character -and the previous character do not both match \w or \W (i.e. one matches -\w and the other matches \W), or the start or end of the string if the -first or last character matches \w, respectively. In a UTF mode, the meanings -of \w and \W can be changed by setting the PCRE_UCP option. When this is -done, it also affects \b and \B. Neither PCRE nor Perl has a separate "start -of word" or "end of word" metasequence. However, whatever follows \b normally -determines which it is. For example, the fragment \ba matches "a" at the start -of a word. -

      -

      -The \A, \Z, and \z assertions differ from the traditional circumflex and -dollar (described in the next section) in that they only ever match at the very -start and end of the subject string, whatever options are set. Thus, they are -independent of multiline mode. These three assertions are not affected by the -PCRE_NOTBOL or PCRE_NOTEOL options, which affect only the behaviour of the -circumflex and dollar metacharacters. However, if the startoffset -argument of pcre_exec() is non-zero, indicating that matching is to start -at a point other than the beginning of the subject, \A can never match. The -difference between \Z and \z is that \Z matches before a newline at the end -of the string as well as at the very end, whereas \z matches only at the end. -

      -

      -The \G assertion is true only when the current matching position is at the -start point of the match, as specified by the startoffset argument of -pcre_exec(). It differs from \A when the value of startoffset is -non-zero. By calling pcre_exec() multiple times with appropriate -arguments, you can mimic Perl's /g option, and it is in this kind of -implementation where \G can be useful. -

      -

      -Note, however, that PCRE's interpretation of \G, as the start of the current -match, is subtly different from Perl's, which defines it as the end of the -previous match. In Perl, these can be different when the previously matched -string was empty. Because PCRE does just one match at a time, it cannot -reproduce this behaviour. -

      -

      -If all the alternatives of a pattern begin with \G, the expression is anchored -to the starting match position, and the "anchored" flag is set in the compiled -regular expression. -

      -
      CIRCUMFLEX AND DOLLAR
      -

      -The circumflex and dollar metacharacters are zero-width assertions. That is, -they test for a particular condition being true without consuming any -characters from the subject string. -

      -

      -Outside a character class, in the default matching mode, the circumflex -character is an assertion that is true only if the current matching point is at -the start of the subject string. If the startoffset argument of -pcre_exec() is non-zero, circumflex can never match if the PCRE_MULTILINE -option is unset. Inside a character class, circumflex has an entirely different -meaning -(see below). -

      -

      -Circumflex need not be the first character of the pattern if a number of -alternatives are involved, but it should be the first thing in each alternative -in which it appears if the pattern is ever to match that branch. If all -possible alternatives start with a circumflex, that is, if the pattern is -constrained to match only at the start of the subject, it is said to be an -"anchored" pattern. (There are also other constructs that can cause a pattern -to be anchored.) -

      -

      -The dollar character is an assertion that is true only if the current matching -point is at the end of the subject string, or immediately before a newline at -the end of the string (by default). Note, however, that it does not actually -match the newline. Dollar need not be the last character of the pattern if a -number of alternatives are involved, but it should be the last item in any -branch in which it appears. Dollar has no special meaning in a character class. -

      -

      -The meaning of dollar can be changed so that it matches only at the very end of -the string, by setting the PCRE_DOLLAR_ENDONLY option at compile time. This -does not affect the \Z assertion. -

      -

      -The meanings of the circumflex and dollar characters are changed if the -PCRE_MULTILINE option is set. When this is the case, a circumflex matches -immediately after internal newlines as well as at the start of the subject -string. It does not match after a newline that ends the string. A dollar -matches before any newlines in the string, as well as at the very end, when -PCRE_MULTILINE is set. When newline is specified as the two-character -sequence CRLF, isolated CR and LF characters do not indicate newlines. -

      -

      -For example, the pattern /^abc$/ matches the subject string "def\nabc" (where -\n represents a newline) in multiline mode, but not otherwise. Consequently, -patterns that are anchored in single line mode because all branches start with -^ are not anchored in multiline mode, and a match for circumflex is possible -when the startoffset argument of pcre_exec() is non-zero. The -PCRE_DOLLAR_ENDONLY option is ignored if PCRE_MULTILINE is set. -

      -

      -Note that the sequences \A, \Z, and \z can be used to match the start and -end of the subject in both modes, and if all branches of a pattern start with -\A it is always anchored, whether or not PCRE_MULTILINE is set. -

      -
      FULL STOP (PERIOD, DOT) AND \N
      -

      -Outside a character class, a dot in the pattern matches any one character in -the subject string except (by default) a character that signifies the end of a -line. -

      -

      -When a line ending is defined as a single character, dot never matches that -character; when the two-character sequence CRLF is used, dot does not match CR -if it is immediately followed by LF, but otherwise it matches all characters -(including isolated CRs and LFs). When any Unicode line endings are being -recognized, dot does not match CR or LF or any of the other line ending -characters. -

      -

      -The behaviour of dot with regard to newlines can be changed. If the PCRE_DOTALL -option is set, a dot matches any one character, without exception. If the -two-character sequence CRLF is present in the subject string, it takes two dots -to match it. -

      -

      -The handling of dot is entirely independent of the handling of circumflex and -dollar, the only relationship being that they both involve newlines. Dot has no -special meaning in a character class. -

      -

      -The escape sequence \N behaves like a dot, except that it is not affected by -the PCRE_DOTALL option. In other words, it matches any character except one -that signifies the end of a line. Perl also uses \N to match characters by -name; PCRE does not support this. -

      -
      MATCHING A SINGLE DATA UNIT
      -

      -Outside a character class, the escape sequence \C matches any one data unit, -whether or not a UTF mode is set. In the 8-bit library, one data unit is one -byte; in the 16-bit library it is a 16-bit unit; in the 32-bit library it is -a 32-bit unit. Unlike a dot, \C always -matches line-ending characters. The feature is provided in Perl in order to -match individual bytes in UTF-8 mode, but it is unclear how it can usefully be -used. Because \C breaks up characters into individual data units, matching one -unit with \C in a UTF mode means that the rest of the string may start with a -malformed UTF character. This has undefined results, because PCRE assumes that -it is dealing with valid UTF strings (and by default it checks this at the -start of processing unless the PCRE_NO_UTF8_CHECK, PCRE_NO_UTF16_CHECK or -PCRE_NO_UTF32_CHECK option is used). -

      -

      -PCRE does not allow \C to appear in lookbehind assertions -(described below) -in a UTF mode, because this would make it impossible to calculate the length of -the lookbehind. -

      -

      -In general, the \C escape sequence is best avoided. However, one -way of using it that avoids the problem of malformed UTF characters is to use a -lookahead to check the length of the next character, as in this pattern, which -could be used with a UTF-8 string (ignore white space and line breaks): -

      -  (?| (?=[\x00-\x7f])(\C) |
      -      (?=[\x80-\x{7ff}])(\C)(\C) |
      -      (?=[\x{800}-\x{ffff}])(\C)(\C)(\C) |
      -      (?=[\x{10000}-\x{1fffff}])(\C)(\C)(\C)(\C))
      -
      -A group that starts with (?| resets the capturing parentheses numbers in each -alternative (see -"Duplicate Subpattern Numbers" -below). The assertions at the start of each branch check the next UTF-8 -character for values whose encoding uses 1, 2, 3, or 4 bytes, respectively. The -character's individual bytes are then captured by the appropriate number of -groups. -

      -
      SQUARE BRACKETS AND CHARACTER CLASSES
      -

      -An opening square bracket introduces a character class, terminated by a closing -square bracket. A closing square bracket on its own is not special by default. -However, if the PCRE_JAVASCRIPT_COMPAT option is set, a lone closing square -bracket causes a compile-time error. If a closing square bracket is required as -a member of the class, it should be the first data character in the class -(after an initial circumflex, if present) or escaped with a backslash. -

      -

      -A character class matches a single character in the subject. In a UTF mode, the -character may be more than one data unit long. A matched character must be in -the set of characters defined by the class, unless the first character in the -class definition is a circumflex, in which case the subject character must not -be in the set defined by the class. If a circumflex is actually required as a -member of the class, ensure it is not the first character, or escape it with a -backslash. -

      -

      -For example, the character class [aeiou] matches any lower case vowel, while -[^aeiou] matches any character that is not a lower case vowel. Note that a -circumflex is just a convenient notation for specifying the characters that -are in the class by enumerating those that are not. A class that starts with a -circumflex is not an assertion; it still consumes a character from the subject -string, and therefore it fails if the current pointer is at the end of the -string. -

      -

      -In UTF-8 (UTF-16, UTF-32) mode, characters with values greater than 255 (0xffff) -can be included in a class as a literal string of data units, or by using the -\x{ escaping mechanism. -

      -

      -When caseless matching is set, any letters in a class represent both their -upper case and lower case versions, so for example, a caseless [aeiou] matches -"A" as well as "a", and a caseless [^aeiou] does not match "A", whereas a -caseful version would. In a UTF mode, PCRE always understands the concept of -case for characters whose values are less than 128, so caseless matching is -always possible. For characters with higher values, the concept of case is -supported if PCRE is compiled with Unicode property support, but not otherwise. -If you want to use caseless matching in a UTF mode for characters 128 and -above, you must ensure that PCRE is compiled with Unicode property support as -well as with UTF support. -

      -

      -Characters that might indicate line breaks are never treated in any special way -when matching character classes, whatever line-ending sequence is in use, and -whatever setting of the PCRE_DOTALL and PCRE_MULTILINE options is used. A class -such as [^a] always matches one of these characters. -

      -

      -The minus (hyphen) character can be used to specify a range of characters in a -character class. For example, [d-m] matches any letter between d and m, -inclusive. If a minus character is required in a class, it must be escaped with -a backslash or appear in a position where it cannot be interpreted as -indicating a range, typically as the first or last character in the class, or -immediately after a range. For example, [b-d-z] matches letters in the range b -to d, a hyphen character, or z. -

      -

      -It is not possible to have the literal character "]" as the end character of a -range. A pattern such as [W-]46] is interpreted as a class of two characters -("W" and "-") followed by a literal string "46]", so it would match "W46]" or -"-46]". However, if the "]" is escaped with a backslash it is interpreted as -the end of range, so [W-\]46] is interpreted as a class containing a range -followed by two other characters. The octal or hexadecimal representation of -"]" can also be used to end a range. -

      -

      -An error is generated if a POSIX character class (see below) or an escape -sequence other than one that defines a single character appears at a point -where a range ending character is expected. For example, [z-\xff] is valid, -but [A-\d] and [A-[:digit:]] are not. -

      -

      -Ranges operate in the collating sequence of character values. They can also be -used for characters specified numerically, for example [\000-\037]. Ranges -can include any characters that are valid for the current mode. -

      -

      -If a range that includes letters is used when caseless matching is set, it -matches the letters in either case. For example, [W-c] is equivalent to -[][\\^_`wxyzabc], matched caselessly, and in a non-UTF mode, if character -tables for a French locale are in use, [\xc8-\xcb] matches accented E -characters in both cases. In UTF modes, PCRE supports the concept of case for -characters with values greater than 128 only when it is compiled with Unicode -property support. -

      -

      -The character escape sequences \d, \D, \h, \H, \p, \P, \s, \S, \v, -\V, \w, and \W may appear in a character class, and add the characters that -they match to the class. For example, [\dABCDEF] matches any hexadecimal -digit. In UTF modes, the PCRE_UCP option affects the meanings of \d, \s, \w -and their upper case partners, just as it does when they appear outside a -character class, as described in the section entitled -"Generic character types" -above. The escape sequence \b has a different meaning inside a character -class; it matches the backspace character. The sequences \B, \N, \R, and \X -are not special inside a character class. Like any other unrecognized escape -sequences, they are treated as the literal characters "B", "N", "R", and "X" by -default, but cause an error if the PCRE_EXTRA option is set. -

      -

      -A circumflex can conveniently be used with the upper case character types to -specify a more restricted set of characters than the matching lower case type. -For example, the class [^\W_] matches any letter or digit, but not underscore, -whereas [\w] includes underscore. A positive character class should be read as -"something OR something OR ..." and a negative class as "NOT something AND NOT -something AND NOT ...". -

      -

      -The only metacharacters that are recognized in character classes are backslash, -hyphen (only where it can be interpreted as specifying a range), circumflex -(only at the start), opening square bracket (only when it can be interpreted as -introducing a POSIX class name, or for a special compatibility feature - see -the next two sections), and the terminating closing square bracket. However, -escaping other non-alphanumeric characters does no harm. -

      -
      POSIX CHARACTER CLASSES
      -

      -Perl supports the POSIX notation for character classes. This uses names -enclosed by [: and :] within the enclosing square brackets. PCRE also supports -this notation. For example, -

      -  [01[:alpha:]%]
      -
      -matches "0", "1", any alphabetic character, or "%". The supported class names -are: -
      -  alnum    letters and digits
      -  alpha    letters
      -  ascii    character codes 0 - 127
      -  blank    space or tab only
      -  cntrl    control characters
      -  digit    decimal digits (same as \d)
      -  graph    printing characters, excluding space
      -  lower    lower case letters
      -  print    printing characters, including space
      -  punct    printing characters, excluding letters and digits and space
      -  space    white space (the same as \s from PCRE 8.34)
      -  upper    upper case letters
      -  word     "word" characters (same as \w)
      -  xdigit   hexadecimal digits
      -
      -The default "space" characters are HT (9), LF (10), VT (11), FF (12), CR (13), -and space (32). If locale-specific matching is taking place, the list of space -characters may be different; there may be fewer or more of them. "Space" used -to be different to \s, which did not include VT, for Perl compatibility. -However, Perl changed at release 5.18, and PCRE followed at release 8.34. -"Space" and \s now match the same set of characters. -

      -

      -The name "word" is a Perl extension, and "blank" is a GNU extension from Perl -5.8. Another Perl extension is negation, which is indicated by a ^ character -after the colon. For example, -

      -  [12[:^digit:]]
      -
      -matches "1", "2", or any non-digit. PCRE (and Perl) also recognize the POSIX -syntax [.ch.] and [=ch=] where "ch" is a "collating element", but these are not -supported, and an error is given if they are encountered. -

      -

      -By default, characters with values greater than 128 do not match any of the -POSIX character classes. However, if the PCRE_UCP option is passed to -pcre_compile(), some of the classes are changed so that Unicode character -properties are used. This is achieved by replacing certain POSIX classes by -other sequences, as follows: -

      -  [:alnum:]  becomes  \p{Xan}
      -  [:alpha:]  becomes  \p{L}
      -  [:blank:]  becomes  \h
      -  [:digit:]  becomes  \p{Nd}
      -  [:lower:]  becomes  \p{Ll}
      -  [:space:]  becomes  \p{Xps}
      -  [:upper:]  becomes  \p{Lu}
      -  [:word:]   becomes  \p{Xwd}
      -
      -Negated versions, such as [:^alpha:] use \P instead of \p. Three other POSIX -classes are handled specially in UCP mode: -

      -

      -[:graph:] -This matches characters that have glyphs that mark the page when printed. In -Unicode property terms, it matches all characters with the L, M, N, P, S, or Cf -properties, except for: -

      -  U+061C           Arabic Letter Mark
      -  U+180E           Mongolian Vowel Separator
      -  U+2066 - U+2069  Various "isolate"s
      -
      -
      -

      -

      -[:print:] -This matches the same characters as [:graph:] plus space characters that are -not controls, that is, characters with the Zs property. -

      -

      -[:punct:] -This matches all characters that have the Unicode P (punctuation) property, -plus those characters whose code points are less than 128 that have the S -(Symbol) property. -

      -

      -The other POSIX classes are unchanged, and match only characters with code -points less than 128. -

      -
      COMPATIBILITY FEATURE FOR WORD BOUNDARIES
      -

      -In the POSIX.2 compliant library that was included in 4.4BSD Unix, the ugly -syntax [[:<:]] and [[:>:]] is used for matching "start of word" and "end of -word". PCRE treats these items as follows: -

      -  [[:<:]]  is converted to  \b(?=\w)
      -  [[:>:]]  is converted to  \b(?<=\w)
      -
      -Only these exact character sequences are recognized. A sequence such as -[a[:<:]b] provokes error for an unrecognized POSIX class name. This support is -not compatible with Perl. It is provided to help migrations from other -environments, and is best not used in any new patterns. Note that \b matches -at the start and the end of a word (see -"Simple assertions" -above), and in a Perl-style pattern the preceding or following character -normally shows which is wanted, without the need for the assertions that are -used above in order to give exactly the POSIX behaviour. -

      -
      VERTICAL BAR
      -

      -Vertical bar characters are used to separate alternative patterns. For example, -the pattern -

      -  gilbert|sullivan
      -
      -matches either "gilbert" or "sullivan". Any number of alternatives may appear, -and an empty alternative is permitted (matching the empty string). The matching -process tries each alternative in turn, from left to right, and the first one -that succeeds is used. If the alternatives are within a subpattern -(defined below), -"succeeds" means matching the rest of the main pattern as well as the -alternative in the subpattern. -

      -
      INTERNAL OPTION SETTING
      -

      -The settings of the PCRE_CASELESS, PCRE_MULTILINE, PCRE_DOTALL, and -PCRE_EXTENDED options (which are Perl-compatible) can be changed from within -the pattern by a sequence of Perl option letters enclosed between "(?" and ")". -The option letters are -

      -  i  for PCRE_CASELESS
      -  m  for PCRE_MULTILINE
      -  s  for PCRE_DOTALL
      -  x  for PCRE_EXTENDED
      -
      -For example, (?im) sets caseless, multiline matching. It is also possible to -unset these options by preceding the letter with a hyphen, and a combined -setting and unsetting such as (?im-sx), which sets PCRE_CASELESS and -PCRE_MULTILINE while unsetting PCRE_DOTALL and PCRE_EXTENDED, is also -permitted. If a letter appears both before and after the hyphen, the option is -unset. -

      -

      -The PCRE-specific options PCRE_DUPNAMES, PCRE_UNGREEDY, and PCRE_EXTRA can be -changed in the same way as the Perl-compatible options by using the characters -J, U and X respectively. -

      -

      -When one of these option changes occurs at top level (that is, not inside -subpattern parentheses), the change applies to the remainder of the pattern -that follows. An option change within a subpattern (see below for a description -of subpatterns) affects only that part of the subpattern that follows it, so -

      -  (a(?i)b)c
      -
      -matches abc and aBc and no other strings (assuming PCRE_CASELESS is not used). -By this means, options can be made to have different settings in different -parts of the pattern. Any changes made in one alternative do carry on -into subsequent branches within the same subpattern. For example, -
      -  (a(?i)b|c)
      -
      -matches "ab", "aB", "c", and "C", even though when matching "C" the first -branch is abandoned before the option setting. This is because the effects of -option settings happen at compile time. There would be some very weird -behaviour otherwise. -

      -

      -Note: There are other PCRE-specific options that can be set by the -application when the compiling or matching functions are called. In some cases -the pattern can contain special leading sequences such as (*CRLF) to override -what the application has set or what has been defaulted. Details are given in -the section entitled -"Newline sequences" -above. There are also the (*UTF8), (*UTF16),(*UTF32), and (*UCP) leading -sequences that can be used to set UTF and Unicode property modes; they are -equivalent to setting the PCRE_UTF8, PCRE_UTF16, PCRE_UTF32 and the PCRE_UCP -options, respectively. The (*UTF) sequence is a generic version that can be -used with any of the libraries. However, the application can set the -PCRE_NEVER_UTF option, which locks out the use of the (*UTF) sequences. -

      -
      SUBPATTERNS
      -

      -Subpatterns are delimited by parentheses (round brackets), which can be nested. -Turning part of a pattern into a subpattern does two things: -
      -
      -1. It localizes a set of alternatives. For example, the pattern -

      -  cat(aract|erpillar|)
      -
      -matches "cataract", "caterpillar", or "cat". Without the parentheses, it would -match "cataract", "erpillar" or an empty string. -
      -
      -2. It sets up the subpattern as a capturing subpattern. This means that, when -the whole pattern matches, that portion of the subject string that matched the -subpattern is passed back to the caller via the ovector argument of the -matching function. (This applies only to the traditional matching functions; -the DFA matching functions do not support capturing.) -

      -

      -Opening parentheses are counted from left to right (starting from 1) to obtain -numbers for the capturing subpatterns. For example, if the string "the red -king" is matched against the pattern -

      -  the ((red|white) (king|queen))
      -
      -the captured substrings are "red king", "red", and "king", and are numbered 1, -2, and 3, respectively. -

      -

      -The fact that plain parentheses fulfil two functions is not always helpful. -There are often times when a grouping subpattern is required without a -capturing requirement. If an opening parenthesis is followed by a question mark -and a colon, the subpattern does not do any capturing, and is not counted when -computing the number of any subsequent capturing subpatterns. For example, if -the string "the white queen" is matched against the pattern -

      -  the ((?:red|white) (king|queen))
      -
      -the captured substrings are "white queen" and "queen", and are numbered 1 and -2. The maximum number of capturing subpatterns is 65535. -

      -

      -As a convenient shorthand, if any option settings are required at the start of -a non-capturing subpattern, the option letters may appear between the "?" and -the ":". Thus the two patterns -

      -  (?i:saturday|sunday)
      -  (?:(?i)saturday|sunday)
      -
      -match exactly the same set of strings. Because alternative branches are tried -from left to right, and options are not reset until the end of the subpattern -is reached, an option setting in one branch does affect subsequent branches, so -the above patterns match "SUNDAY" as well as "Saturday". -

      -
      DUPLICATE SUBPATTERN NUMBERS
      -

      -Perl 5.10 introduced a feature whereby each alternative in a subpattern uses -the same numbers for its capturing parentheses. Such a subpattern starts with -(?| and is itself a non-capturing subpattern. For example, consider this -pattern: -

      -  (?|(Sat)ur|(Sun))day
      -
      -Because the two alternatives are inside a (?| group, both sets of capturing -parentheses are numbered one. Thus, when the pattern matches, you can look -at captured substring number one, whichever alternative matched. This construct -is useful when you want to capture part, but not all, of one of a number of -alternatives. Inside a (?| group, parentheses are numbered as usual, but the -number is reset at the start of each branch. The numbers of any capturing -parentheses that follow the subpattern start after the highest number used in -any branch. The following example is taken from the Perl documentation. The -numbers underneath show in which buffer the captured content will be stored. -
      -  # before  ---------------branch-reset----------- after
      -  / ( a )  (?| x ( y ) z | (p (q) r) | (t) u (v) ) ( z ) /x
      -  # 1            2         2  3        2     3     4
      -
      -A back reference to a numbered subpattern uses the most recent value that is -set for that number by any subpattern. The following pattern matches "abcabc" -or "defdef": -
      -  /(?|(abc)|(def))\1/
      -
      -In contrast, a subroutine call to a numbered subpattern always refers to the -first one in the pattern with the given number. The following pattern matches -"abcabc" or "defabc": -
      -  /(?|(abc)|(def))(?1)/
      -
      -If a -condition test -for a subpattern's having matched refers to a non-unique number, the test is -true if any of the subpatterns of that number have matched. -

      -

      -An alternative approach to using this "branch reset" feature is to use -duplicate named subpatterns, as described in the next section. -

      -
      NAMED SUBPATTERNS
      -

      -Identifying capturing parentheses by number is simple, but it can be very hard -to keep track of the numbers in complicated regular expressions. Furthermore, -if an expression is modified, the numbers may change. To help with this -difficulty, PCRE supports the naming of subpatterns. This feature was not -added to Perl until release 5.10. Python had the feature earlier, and PCRE -introduced it at release 4.0, using the Python syntax. PCRE now supports both -the Perl and the Python syntax. Perl allows identically numbered subpatterns to -have different names, but PCRE does not. -

      -

      -In PCRE, a subpattern can be named in one of three ways: (?<name>...) or -(?'name'...) as in Perl, or (?P<name>...) as in Python. References to capturing -parentheses from other parts of the pattern, such as -back references, -recursion, -and -conditions, -can be made by name as well as by number. -

      -

      -Names consist of up to 32 alphanumeric characters and underscores, but must -start with a non-digit. Named capturing parentheses are still allocated numbers -as well as names, exactly as if the names were not present. The PCRE API -provides function calls for extracting the name-to-number translation table -from a compiled pattern. There is also a convenience function for extracting a -captured substring by name. -

      -

      -By default, a name must be unique within a pattern, but it is possible to relax -this constraint by setting the PCRE_DUPNAMES option at compile time. (Duplicate -names are also always permitted for subpatterns with the same number, set up as -described in the previous section.) Duplicate names can be useful for patterns -where only one instance of the named parentheses can match. Suppose you want to -match the name of a weekday, either as a 3-letter abbreviation or as the full -name, and in both cases you want to extract the abbreviation. This pattern -(ignoring the line breaks) does the job: -

      -  (?<DN>Mon|Fri|Sun)(?:day)?|
      -  (?<DN>Tue)(?:sday)?|
      -  (?<DN>Wed)(?:nesday)?|
      -  (?<DN>Thu)(?:rsday)?|
      -  (?<DN>Sat)(?:urday)?
      -
      -There are five capturing substrings, but only one is ever set after a match. -(An alternative way of solving this problem is to use a "branch reset" -subpattern, as described in the previous section.) -

      -

      -The convenience function for extracting the data by name returns the substring -for the first (and in this example, the only) subpattern of that name that -matched. This saves searching to find which numbered subpattern it was. -

      -

      -If you make a back reference to a non-unique named subpattern from elsewhere in -the pattern, the subpatterns to which the name refers are checked in the order -in which they appear in the overall pattern. The first one that is set is used -for the reference. For example, this pattern matches both "foofoo" and -"barbar" but not "foobar" or "barfoo": -

      -  (?:(?<n>foo)|(?<n>bar))\k<n>
      -
      -
      -

      -

      -If you make a subroutine call to a non-unique named subpattern, the one that -corresponds to the first occurrence of the name is used. In the absence of -duplicate numbers (see the previous section) this is the one with the lowest -number. -

      -

      -If you use a named reference in a condition -test (see the -section about conditions -below), either to check whether a subpattern has matched, or to check for -recursion, all subpatterns with the same name are tested. If the condition is -true for any one of them, the overall condition is true. This is the same -behaviour as testing by number. For further details of the interfaces for -handling named subpatterns, see the -pcreapi -documentation. -

      -

      -Warning: You cannot use different names to distinguish between two -subpatterns with the same number because PCRE uses only the numbers when -matching. For this reason, an error is given at compile time if different names -are given to subpatterns with the same number. However, you can always give the -same name to subpatterns with the same number, even when PCRE_DUPNAMES is not -set. -

      -
      REPETITION
      -

      -Repetition is specified by quantifiers, which can follow any of the following -items: -

      -  a literal data character
      -  the dot metacharacter
      -  the \C escape sequence
      -  the \X escape sequence
      -  the \R escape sequence
      -  an escape such as \d or \pL that matches a single character
      -  a character class
      -  a back reference (see next section)
      -  a parenthesized subpattern (including assertions)
      -  a subroutine call to a subpattern (recursive or otherwise)
      -
      -The general repetition quantifier specifies a minimum and maximum number of -permitted matches, by giving the two numbers in curly brackets (braces), -separated by a comma. The numbers must be less than 65536, and the first must -be less than or equal to the second. For example: -
      -  z{2,4}
      -
      -matches "zz", "zzz", or "zzzz". A closing brace on its own is not a special -character. If the second number is omitted, but the comma is present, there is -no upper limit; if the second number and the comma are both omitted, the -quantifier specifies an exact number of required matches. Thus -
      -  [aeiou]{3,}
      -
      -matches at least 3 successive vowels, but may match many more, while -
      -  \d{8}
      -
      -matches exactly 8 digits. An opening curly bracket that appears in a position -where a quantifier is not allowed, or one that does not match the syntax of a -quantifier, is taken as a literal character. For example, {,6} is not a -quantifier, but a literal string of four characters. -

      -

      -In UTF modes, quantifiers apply to characters rather than to individual data -units. Thus, for example, \x{100}{2} matches two characters, each of -which is represented by a two-byte sequence in a UTF-8 string. Similarly, -\X{3} matches three Unicode extended grapheme clusters, each of which may be -several data units long (and they may be of different lengths). -

      -

      -The quantifier {0} is permitted, causing the expression to behave as if the -previous item and the quantifier were not present. This may be useful for -subpatterns that are referenced as -subroutines -from elsewhere in the pattern (but see also the section entitled -"Defining subpatterns for use by reference only" -below). Items other than subpatterns that have a {0} quantifier are omitted -from the compiled pattern. -

      -

      -For convenience, the three most common quantifiers have single-character -abbreviations: -

      -  *    is equivalent to {0,}
      -  +    is equivalent to {1,}
      -  ?    is equivalent to {0,1}
      -
      -It is possible to construct infinite loops by following a subpattern that can -match no characters with a quantifier that has no upper limit, for example: -
      -  (a?)*
      -
      -Earlier versions of Perl and PCRE used to give an error at compile time for -such patterns. However, because there are cases where this can be useful, such -patterns are now accepted, but if any repetition of the subpattern does in fact -match no characters, the loop is forcibly broken. -

      -

      -By default, the quantifiers are "greedy", that is, they match as much as -possible (up to the maximum number of permitted times), without causing the -rest of the pattern to fail. The classic example of where this gives problems -is in trying to match comments in C programs. These appear between /* and */ -and within the comment, individual * and / characters may appear. An attempt to -match C comments by applying the pattern -

      -  /\*.*\*/
      -
      -to the string -
      -  /* first comment */  not comment  /* second comment */
      -
      -fails, because it matches the entire string owing to the greediness of the .* -item. -

      -

      -However, if a quantifier is followed by a question mark, it ceases to be -greedy, and instead matches the minimum number of times possible, so the -pattern -

      -  /\*.*?\*/
      -
      -does the right thing with the C comments. The meaning of the various -quantifiers is not otherwise changed, just the preferred number of matches. -Do not confuse this use of question mark with its use as a quantifier in its -own right. Because it has two uses, it can sometimes appear doubled, as in -
      -  \d??\d
      -
      -which matches one digit by preference, but can match two if that is the only -way the rest of the pattern matches. -

      -

      -If the PCRE_UNGREEDY option is set (an option that is not available in Perl), -the quantifiers are not greedy by default, but individual ones can be made -greedy by following them with a question mark. In other words, it inverts the -default behaviour. -

      -

      -When a parenthesized subpattern is quantified with a minimum repeat count that -is greater than 1 or with a limited maximum, more memory is required for the -compiled pattern, in proportion to the size of the minimum or maximum. -

      -

      -If a pattern starts with .* or .{0,} and the PCRE_DOTALL option (equivalent -to Perl's /s) is set, thus allowing the dot to match newlines, the pattern is -implicitly anchored, because whatever follows will be tried against every -character position in the subject string, so there is no point in retrying the -overall match at any position after the first. PCRE normally treats such a -pattern as though it were preceded by \A. -

      -

      -In cases where it is known that the subject string contains no newlines, it is -worth setting PCRE_DOTALL in order to obtain this optimization, or -alternatively using ^ to indicate anchoring explicitly. -

      -

      -However, there are some cases where the optimization cannot be used. When .* -is inside capturing parentheses that are the subject of a back reference -elsewhere in the pattern, a match at the start may fail where a later one -succeeds. Consider, for example: -

      -  (.*)abc\1
      -
      -If the subject is "xyz123abc123" the match point is the fourth character. For -this reason, such a pattern is not implicitly anchored. -

      -

      -Another case where implicit anchoring is not applied is when the leading .* is -inside an atomic group. Once again, a match at the start may fail where a later -one succeeds. Consider this pattern: -

      -  (?>.*?a)b
      -
      -It matches "ab" in the subject "aab". The use of the backtracking control verbs -(*PRUNE) and (*SKIP) also disable this optimization. -

      -

      -When a capturing subpattern is repeated, the value captured is the substring -that matched the final iteration. For example, after -

      -  (tweedle[dume]{3}\s*)+
      -
      -has matched "tweedledum tweedledee" the value of the captured substring is -"tweedledee". However, if there are nested capturing subpatterns, the -corresponding captured values may have been set in previous iterations. For -example, after -
      -  /(a|(b))+/
      -
      -matches "aba" the value of the second captured substring is "b". -

      -
      ATOMIC GROUPING AND POSSESSIVE QUANTIFIERS
      -

      -With both maximizing ("greedy") and minimizing ("ungreedy" or "lazy") -repetition, failure of what follows normally causes the repeated item to be -re-evaluated to see if a different number of repeats allows the rest of the -pattern to match. Sometimes it is useful to prevent this, either to change the -nature of the match, or to cause it fail earlier than it otherwise might, when -the author of the pattern knows there is no point in carrying on. -

      -

      -Consider, for example, the pattern \d+foo when applied to the subject line -

      -  123456bar
      -
      -After matching all 6 digits and then failing to match "foo", the normal -action of the matcher is to try again with only 5 digits matching the \d+ -item, and then with 4, and so on, before ultimately failing. "Atomic grouping" -(a term taken from Jeffrey Friedl's book) provides the means for specifying -that once a subpattern has matched, it is not to be re-evaluated in this way. -

      -

      -If we use atomic grouping for the previous example, the matcher gives up -immediately on failing to match "foo" the first time. The notation is a kind of -special parenthesis, starting with (?> as in this example: -

      -  (?>\d+)foo
      -
      -This kind of parenthesis "locks up" the part of the pattern it contains once -it has matched, and a failure further into the pattern is prevented from -backtracking into it. Backtracking past it to previous items, however, works as -normal. -

      -

      -An alternative description is that a subpattern of this type matches the string -of characters that an identical standalone pattern would match, if anchored at -the current point in the subject string. -

      -

      -Atomic grouping subpatterns are not capturing subpatterns. Simple cases such as -the above example can be thought of as a maximizing repeat that must swallow -everything it can. So, while both \d+ and \d+? are prepared to adjust the -number of digits they match in order to make the rest of the pattern match, -(?>\d+) can only match an entire sequence of digits. -

      -

      -Atomic groups in general can of course contain arbitrarily complicated -subpatterns, and can be nested. However, when the subpattern for an atomic -group is just a single repeated item, as in the example above, a simpler -notation, called a "possessive quantifier" can be used. This consists of an -additional + character following a quantifier. Using this notation, the -previous example can be rewritten as -

      -  \d++foo
      -
      -Note that a possessive quantifier can be used with an entire group, for -example: -
      -  (abc|xyz){2,3}+
      -
      -Possessive quantifiers are always greedy; the setting of the PCRE_UNGREEDY -option is ignored. They are a convenient notation for the simpler forms of -atomic group. However, there is no difference in the meaning of a possessive -quantifier and the equivalent atomic group, though there may be a performance -difference; possessive quantifiers should be slightly faster. -

      -

      -The possessive quantifier syntax is an extension to the Perl 5.8 syntax. -Jeffrey Friedl originated the idea (and the name) in the first edition of his -book. Mike McCloskey liked it, so implemented it when he built Sun's Java -package, and PCRE copied it from there. It ultimately found its way into Perl -at release 5.10. -

      -

      -PCRE has an optimization that automatically "possessifies" certain simple -pattern constructs. For example, the sequence A+B is treated as A++B because -there is no point in backtracking into a sequence of A's when B must follow. -

      -

      -When a pattern contains an unlimited repeat inside a subpattern that can itself -be repeated an unlimited number of times, the use of an atomic group is the -only way to avoid some failing matches taking a very long time indeed. The -pattern -

      -  (\D+|<\d+>)*[!?]
      -
      -matches an unlimited number of substrings that either consist of non-digits, or -digits enclosed in <>, followed by either ! or ?. When it matches, it runs -quickly. However, if it is applied to -
      -  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
      -
      -it takes a long time before reporting failure. This is because the string can -be divided between the internal \D+ repeat and the external * repeat in a -large number of ways, and all have to be tried. (The example uses [!?] rather -than a single character at the end, because both PCRE and Perl have an -optimization that allows for fast failure when a single character is used. They -remember the last single character that is required for a match, and fail early -if it is not present in the string.) If the pattern is changed so that it uses -an atomic group, like this: -
      -  ((?>\D+)|<\d+>)*[!?]
      -
      -sequences of non-digits cannot be broken, and failure happens quickly. -

      -
      BACK REFERENCES
      -

      -Outside a character class, a backslash followed by a digit greater than 0 (and -possibly further digits) is a back reference to a capturing subpattern earlier -(that is, to its left) in the pattern, provided there have been that many -previous capturing left parentheses. -

      -

      -However, if the decimal number following the backslash is less than 10, it is -always taken as a back reference, and causes an error only if there are not -that many capturing left parentheses in the entire pattern. In other words, the -parentheses that are referenced need not be to the left of the reference for -numbers less than 10. A "forward back reference" of this type can make sense -when a repetition is involved and the subpattern to the right has participated -in an earlier iteration. -

      -

      -It is not possible to have a numerical "forward back reference" to a subpattern -whose number is 10 or more using this syntax because a sequence such as \50 is -interpreted as a character defined in octal. See the subsection entitled -"Non-printing characters" -above -for further details of the handling of digits following a backslash. There is -no such problem when named parentheses are used. A back reference to any -subpattern is possible using named parentheses (see below). -

      -

      -Another way of avoiding the ambiguity inherent in the use of digits following a -backslash is to use the \g escape sequence. This escape must be followed by an -unsigned number or a negative number, optionally enclosed in braces. These -examples are all identical: -

      -  (ring), \1
      -  (ring), \g1
      -  (ring), \g{1}
      -
      -An unsigned number specifies an absolute reference without the ambiguity that -is present in the older syntax. It is also useful when literal digits follow -the reference. A negative number is a relative reference. Consider this -example: -
      -  (abc(def)ghi)\g{-1}
      -
      -The sequence \g{-1} is a reference to the most recently started capturing -subpattern before \g, that is, is it equivalent to \2 in this example. -Similarly, \g{-2} would be equivalent to \1. The use of relative references -can be helpful in long patterns, and also in patterns that are created by -joining together fragments that contain references within themselves. -

      -

      -A back reference matches whatever actually matched the capturing subpattern in -the current subject string, rather than anything matching the subpattern -itself (see -"Subpatterns as subroutines" -below for a way of doing that). So the pattern -

      -  (sens|respons)e and \1ibility
      -
      -matches "sense and sensibility" and "response and responsibility", but not -"sense and responsibility". If caseful matching is in force at the time of the -back reference, the case of letters is relevant. For example, -
      -  ((?i)rah)\s+\1
      -
      -matches "rah rah" and "RAH RAH", but not "RAH rah", even though the original -capturing subpattern is matched caselessly. -

      -

      -There are several different ways of writing back references to named -subpatterns. The .NET syntax \k{name} and the Perl syntax \k<name> or -\k'name' are supported, as is the Python syntax (?P=name). Perl 5.10's unified -back reference syntax, in which \g can be used for both numeric and named -references, is also supported. We could rewrite the above example in any of -the following ways: -

      -  (?<p1>(?i)rah)\s+\k<p1>
      -  (?'p1'(?i)rah)\s+\k{p1}
      -  (?P<p1>(?i)rah)\s+(?P=p1)
      -  (?<p1>(?i)rah)\s+\g{p1}
      -
      -A subpattern that is referenced by name may appear in the pattern before or -after the reference. -

      -

      -There may be more than one back reference to the same subpattern. If a -subpattern has not actually been used in a particular match, any back -references to it always fail by default. For example, the pattern -

      -  (a|(bc))\2
      -
      -always fails if it starts to match "a" rather than "bc". However, if the -PCRE_JAVASCRIPT_COMPAT option is set at compile time, a back reference to an -unset value matches an empty string. -

      -

      -Because there may be many capturing parentheses in a pattern, all digits -following a backslash are taken as part of a potential back reference number. -If the pattern continues with a digit character, some delimiter must be used to -terminate the back reference. If the PCRE_EXTENDED option is set, this can be -white space. Otherwise, the \g{ syntax or an empty comment (see -"Comments" -below) can be used. -

      -
      -Recursive back references -
      -

      -A back reference that occurs inside the parentheses to which it refers fails -when the subpattern is first used, so, for example, (a\1) never matches. -However, such references can be useful inside repeated subpatterns. For -example, the pattern -

      -  (a|b\1)+
      -
      -matches any number of "a"s and also "aba", "ababbaa" etc. At each iteration of -the subpattern, the back reference matches the character string corresponding -to the previous iteration. In order for this to work, the pattern must be such -that the first iteration does not need to match the back reference. This can be -done using alternation, as in the example above, or by a quantifier with a -minimum of zero. -

      -

      -Back references of this type cause the group that they reference to be treated -as an -atomic group. -Once the whole group has been matched, a subsequent matching failure cannot -cause backtracking into the middle of the group. -

      -
      ASSERTIONS
      -

      -An assertion is a test on the characters following or preceding the current -matching point that does not actually consume any characters. The simple -assertions coded as \b, \B, \A, \G, \Z, \z, ^ and $ are described -above. -

      -

      -More complicated assertions are coded as subpatterns. There are two kinds: -those that look ahead of the current position in the subject string, and those -that look behind it. An assertion subpattern is matched in the normal way, -except that it does not cause the current matching position to be changed. -

      -

      -Assertion subpatterns are not capturing subpatterns. If such an assertion -contains capturing subpatterns within it, these are counted for the purposes of -numbering the capturing subpatterns in the whole pattern. However, substring -capturing is carried out only for positive assertions. (Perl sometimes, but not -always, does do capturing in negative assertions.) -

      -

      -WARNING: If a positive assertion containing one or more capturing subpatterns -succeeds, but failure to match later in the pattern causes backtracking over -this assertion, the captures within the assertion are reset only if no higher -numbered captures are already set. This is, unfortunately, a fundamental -limitation of the current implementation, and as PCRE1 is now in -maintenance-only status, it is unlikely ever to change. -

      -

      -For compatibility with Perl, assertion subpatterns may be repeated; though -it makes no sense to assert the same thing several times, the side effect of -capturing parentheses may occasionally be useful. In practice, there only three -cases: -
      -
      -(1) If the quantifier is {0}, the assertion is never obeyed during matching. -However, it may contain internal capturing parenthesized groups that are called -from elsewhere via the -subroutine mechanism. -
      -
      -(2) If quantifier is {0,n} where n is greater than zero, it is treated as if it -were {0,1}. At run time, the rest of the pattern match is tried with and -without the assertion, the order depending on the greediness of the quantifier. -
      -
      -(3) If the minimum repetition is greater than zero, the quantifier is ignored. -The assertion is obeyed just once when encountered during matching. -

      -
      -Lookahead assertions -
      -

      -Lookahead assertions start with (?= for positive assertions and (?! for -negative assertions. For example, -

      -  \w+(?=;)
      -
      -matches a word followed by a semicolon, but does not include the semicolon in -the match, and -
      -  foo(?!bar)
      -
      -matches any occurrence of "foo" that is not followed by "bar". Note that the -apparently similar pattern -
      -  (?!foo)bar
      -
      -does not find an occurrence of "bar" that is preceded by something other than -"foo"; it finds any occurrence of "bar" whatsoever, because the assertion -(?!foo) is always true when the next three characters are "bar". A -lookbehind assertion is needed to achieve the other effect. -

      -

      -If you want to force a matching failure at some point in a pattern, the most -convenient way to do it is with (?!) because an empty string always matches, so -an assertion that requires there not to be an empty string must always fail. -The backtracking control verb (*FAIL) or (*F) is a synonym for (?!). -

      -
      -Lookbehind assertions -
      -

      -Lookbehind assertions start with (?<= for positive assertions and (?<! for -negative assertions. For example, -

      -  (?<!foo)bar
      -
      -does find an occurrence of "bar" that is not preceded by "foo". The contents of -a lookbehind assertion are restricted such that all the strings it matches must -have a fixed length. However, if there are several top-level alternatives, they -do not all have to have the same fixed length. Thus -
      -  (?<=bullock|donkey)
      -
      -is permitted, but -
      -  (?<!dogs?|cats?)
      -
      -causes an error at compile time. Branches that match different length strings -are permitted only at the top level of a lookbehind assertion. This is an -extension compared with Perl, which requires all branches to match the same -length of string. An assertion such as -
      -  (?<=ab(c|de))
      -
      -is not permitted, because its single top-level branch can match two different -lengths, but it is acceptable to PCRE if rewritten to use two top-level -branches: -
      -  (?<=abc|abde)
      -
      -In some cases, the escape sequence \K -(see above) -can be used instead of a lookbehind assertion to get round the fixed-length -restriction. -

      -

      -The implementation of lookbehind assertions is, for each alternative, to -temporarily move the current position back by the fixed length and then try to -match. If there are insufficient characters before the current position, the -assertion fails. -

      -

      -In a UTF mode, PCRE does not allow the \C escape (which matches a single data -unit even in a UTF mode) to appear in lookbehind assertions, because it makes -it impossible to calculate the length of the lookbehind. The \X and \R -escapes, which can match different numbers of data units, are also not -permitted. -

      -

      -"Subroutine" -calls (see below) such as (?2) or (?&X) are permitted in lookbehinds, as long -as the subpattern matches a fixed-length string. -Recursion, -however, is not supported. -

      -

      -Possessive quantifiers can be used in conjunction with lookbehind assertions to -specify efficient matching of fixed-length strings at the end of subject -strings. Consider a simple pattern such as -

      -  abcd$
      -
      -when applied to a long string that does not match. Because matching proceeds -from left to right, PCRE will look for each "a" in the subject and then see if -what follows matches the rest of the pattern. If the pattern is specified as -
      -  ^.*abcd$
      -
      -the initial .* matches the entire string at first, but when this fails (because -there is no following "a"), it backtracks to match all but the last character, -then all but the last two characters, and so on. Once again the search for "a" -covers the entire string, from right to left, so we are no better off. However, -if the pattern is written as -
      -  ^.*+(?<=abcd)
      -
      -there can be no backtracking for the .*+ item; it can match only the entire -string. The subsequent lookbehind assertion does a single test on the last four -characters. If it fails, the match fails immediately. For long strings, this -approach makes a significant difference to the processing time. -

      -
      -Using multiple assertions -
      -

      -Several assertions (of any sort) may occur in succession. For example, -

      -  (?<=\d{3})(?<!999)foo
      -
      -matches "foo" preceded by three digits that are not "999". Notice that each of -the assertions is applied independently at the same point in the subject -string. First there is a check that the previous three characters are all -digits, and then there is a check that the same three characters are not "999". -This pattern does not match "foo" preceded by six characters, the first -of which are digits and the last three of which are not "999". For example, it -doesn't match "123abcfoo". A pattern to do that is -
      -  (?<=\d{3}...)(?<!999)foo
      -
      -This time the first assertion looks at the preceding six characters, checking -that the first three are digits, and then the second assertion checks that the -preceding three characters are not "999". -

      -

      -Assertions can be nested in any combination. For example, -

      -  (?<=(?<!foo)bar)baz
      -
      -matches an occurrence of "baz" that is preceded by "bar" which in turn is not -preceded by "foo", while -
      -  (?<=\d{3}(?!999)...)foo
      -
      -is another pattern that matches "foo" preceded by three digits and any three -characters that are not "999". -

      -
      CONDITIONAL SUBPATTERNS
      -

      -It is possible to cause the matching process to obey a subpattern -conditionally or to choose between two alternative subpatterns, depending on -the result of an assertion, or whether a specific capturing subpattern has -already been matched. The two possible forms of conditional subpattern are: -

      -  (?(condition)yes-pattern)
      -  (?(condition)yes-pattern|no-pattern)
      -
      -If the condition is satisfied, the yes-pattern is used; otherwise the -no-pattern (if present) is used. If there are more than two alternatives in the -subpattern, a compile-time error occurs. Each of the two alternatives may -itself contain nested subpatterns of any form, including conditional -subpatterns; the restriction to two alternatives applies only at the level of -the condition. This pattern fragment is an example where the alternatives are -complex: -
      -  (?(1) (A|B|C) | (D | (?(2)E|F) | E) )
      -
      -
      -

      -

      -There are four kinds of condition: references to subpatterns, references to -recursion, a pseudo-condition called DEFINE, and assertions. -

      -
      -Checking for a used subpattern by number -
      -

      -If the text between the parentheses consists of a sequence of digits, the -condition is true if a capturing subpattern of that number has previously -matched. If there is more than one capturing subpattern with the same number -(see the earlier -section about duplicate subpattern numbers), -the condition is true if any of them have matched. An alternative notation is -to precede the digits with a plus or minus sign. In this case, the subpattern -number is relative rather than absolute. The most recently opened parentheses -can be referenced by (?(-1), the next most recent by (?(-2), and so on. Inside -loops it can also make sense to refer to subsequent groups. The next -parentheses to be opened can be referenced as (?(+1), and so on. (The value -zero in any of these forms is not used; it provokes a compile-time error.) -

      -

      -Consider the following pattern, which contains non-significant white space to -make it more readable (assume the PCRE_EXTENDED option) and to divide it into -three parts for ease of discussion: -

      -  ( \( )?    [^()]+    (?(1) \) )
      -
      -The first part matches an optional opening parenthesis, and if that -character is present, sets it as the first captured substring. The second part -matches one or more characters that are not parentheses. The third part is a -conditional subpattern that tests whether or not the first set of parentheses -matched. If they did, that is, if subject started with an opening parenthesis, -the condition is true, and so the yes-pattern is executed and a closing -parenthesis is required. Otherwise, since no-pattern is not present, the -subpattern matches nothing. In other words, this pattern matches a sequence of -non-parentheses, optionally enclosed in parentheses. -

      -

      -If you were embedding this pattern in a larger one, you could use a relative -reference: -

      -  ...other stuff... ( \( )?    [^()]+    (?(-1) \) ) ...
      -
      -This makes the fragment independent of the parentheses in the larger pattern. -

      -
      -Checking for a used subpattern by name -
      -

      -Perl uses the syntax (?(<name>)...) or (?('name')...) to test for a used -subpattern by name. For compatibility with earlier versions of PCRE, which had -this facility before Perl, the syntax (?(name)...) is also recognized. -

      -

      -Rewriting the above example to use a named subpattern gives this: -

      -  (?<OPEN> \( )?    [^()]+    (?(<OPEN>) \) )
      -
      -If the name used in a condition of this kind is a duplicate, the test is -applied to all subpatterns of the same name, and is true if any one of them has -matched. -

      -
      -Checking for pattern recursion -
      -

      -If the condition is the string (R), and there is no subpattern with the name R, -the condition is true if a recursive call to the whole pattern or any -subpattern has been made. If digits or a name preceded by ampersand follow the -letter R, for example: -

      -  (?(R3)...) or (?(R&name)...)
      -
      -the condition is true if the most recent recursion is into a subpattern whose -number or name is given. This condition does not check the entire recursion -stack. If the name used in a condition of this kind is a duplicate, the test is -applied to all subpatterns of the same name, and is true if any one of them is -the most recent recursion. -

      -

      -At "top level", all these recursion test conditions are false. -The syntax for recursive patterns -is described below. -

      -
      -Defining subpatterns for use by reference only -
      -

      -If the condition is the string (DEFINE), and there is no subpattern with the -name DEFINE, the condition is always false. In this case, there may be only one -alternative in the subpattern. It is always skipped if control reaches this -point in the pattern; the idea of DEFINE is that it can be used to define -subroutines that can be referenced from elsewhere. (The use of -subroutines -is described below.) For example, a pattern to match an IPv4 address such as -"192.168.23.245" could be written like this (ignore white space and line -breaks): -

      -  (?(DEFINE) (?<byte> 2[0-4]\d | 25[0-5] | 1\d\d | [1-9]?\d) )
      -  \b (?&byte) (\.(?&byte)){3} \b
      -
      -The first part of the pattern is a DEFINE group inside which a another group -named "byte" is defined. This matches an individual component of an IPv4 -address (a number less than 256). When matching takes place, this part of the -pattern is skipped because DEFINE acts like a false condition. The rest of the -pattern uses references to the named group to match the four dot-separated -components of an IPv4 address, insisting on a word boundary at each end. -

      -
      -Assertion conditions -
      -

      -If the condition is not in any of the above formats, it must be an assertion. -This may be a positive or negative lookahead or lookbehind assertion. Consider -this pattern, again containing non-significant white space, and with the two -alternatives on the second line: -

      -  (?(?=[^a-z]*[a-z])
      -  \d{2}-[a-z]{3}-\d{2}  |  \d{2}-\d{2}-\d{2} )
      -
      -The condition is a positive lookahead assertion that matches an optional -sequence of non-letters followed by a letter. In other words, it tests for the -presence of at least one letter in the subject. If a letter is found, the -subject is matched against the first alternative; otherwise it is matched -against the second. This pattern matches strings in one of the two forms -dd-aaa-dd or dd-dd-dd, where aaa are letters and dd are digits. -

      -
      COMMENTS
      -

      -There are two ways of including comments in patterns that are processed by -PCRE. In both cases, the start of the comment must not be in a character class, -nor in the middle of any other sequence of related characters such as (?: or a -subpattern name or number. The characters that make up a comment play no part -in the pattern matching. -

      -

      -The sequence (?# marks the start of a comment that continues up to the next -closing parenthesis. Nested parentheses are not permitted. If the PCRE_EXTENDED -option is set, an unescaped # character also introduces a comment, which in -this case continues to immediately after the next newline character or -character sequence in the pattern. Which characters are interpreted as newlines -is controlled by the options passed to a compiling function or by a special -sequence at the start of the pattern, as described in the section entitled -"Newline conventions" -above. Note that the end of this type of comment is a literal newline sequence -in the pattern; escape sequences that happen to represent a newline do not -count. For example, consider this pattern when PCRE_EXTENDED is set, and the -default newline convention is in force: -

      -  abc #comment \n still comment
      -
      -On encountering the # character, pcre_compile() skips along, looking for -a newline in the pattern. The sequence \n is still literal at this stage, so -it does not terminate the comment. Only an actual character with the code value -0x0a (the default newline) does so. -

      -
      RECURSIVE PATTERNS
      -

      -Consider the problem of matching a string in parentheses, allowing for -unlimited nested parentheses. Without the use of recursion, the best that can -be done is to use a pattern that matches up to some fixed depth of nesting. It -is not possible to handle an arbitrary nesting depth. -

      -

      -For some time, Perl has provided a facility that allows regular expressions to -recurse (amongst other things). It does this by interpolating Perl code in the -expression at run time, and the code can refer to the expression itself. A Perl -pattern using code interpolation to solve the parentheses problem can be -created like this: -

      -  $re = qr{\( (?: (?>[^()]+) | (?p{$re}) )* \)}x;
      -
      -The (?p{...}) item interpolates Perl code at run time, and in this case refers -recursively to the pattern in which it appears. -

      -

      -Obviously, PCRE cannot support the interpolation of Perl code. Instead, it -supports special syntax for recursion of the entire pattern, and also for -individual subpattern recursion. After its introduction in PCRE and Python, -this kind of recursion was subsequently introduced into Perl at release 5.10. -

      -

      -A special item that consists of (? followed by a number greater than zero and a -closing parenthesis is a recursive subroutine call of the subpattern of the -given number, provided that it occurs inside that subpattern. (If not, it is a -non-recursive subroutine -call, which is described in the next section.) The special item (?R) or (?0) is -a recursive call of the entire regular expression. -

      -

      -This PCRE pattern solves the nested parentheses problem (assume the -PCRE_EXTENDED option is set so that white space is ignored): -

      -  \( ( [^()]++ | (?R) )* \)
      -
      -First it matches an opening parenthesis. Then it matches any number of -substrings which can either be a sequence of non-parentheses, or a recursive -match of the pattern itself (that is, a correctly parenthesized substring). -Finally there is a closing parenthesis. Note the use of a possessive quantifier -to avoid backtracking into sequences of non-parentheses. -

      -

      -If this were part of a larger pattern, you would not want to recurse the entire -pattern, so instead you could use this: -

      -  ( \( ( [^()]++ | (?1) )* \) )
      -
      -We have put the pattern into parentheses, and caused the recursion to refer to -them instead of the whole pattern. -

      -

      -In a larger pattern, keeping track of parenthesis numbers can be tricky. This -is made easier by the use of relative references. Instead of (?1) in the -pattern above you can write (?-2) to refer to the second most recently opened -parentheses preceding the recursion. In other words, a negative number counts -capturing parentheses leftwards from the point at which it is encountered. -

      -

      -It is also possible to refer to subsequently opened parentheses, by writing -references such as (?+2). However, these cannot be recursive because the -reference is not inside the parentheses that are referenced. They are always -non-recursive subroutine -calls, as described in the next section. -

      -

      -An alternative approach is to use named parentheses instead. The Perl syntax -for this is (?&name); PCRE's earlier syntax (?P>name) is also supported. We -could rewrite the above example as follows: -

      -  (?<pn> \( ( [^()]++ | (?&pn) )* \) )
      -
      -If there is more than one subpattern with the same name, the earliest one is -used. -

      -

      -This particular example pattern that we have been looking at contains nested -unlimited repeats, and so the use of a possessive quantifier for matching -strings of non-parentheses is important when applying the pattern to strings -that do not match. For example, when this pattern is applied to -

      -  (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()
      -
      -it yields "no match" quickly. However, if a possessive quantifier is not used, -the match runs for a very long time indeed because there are so many different -ways the + and * repeats can carve up the subject, and all have to be tested -before failure can be reported. -

      -

      -At the end of a match, the values of capturing parentheses are those from -the outermost level. If you want to obtain intermediate values, a callout -function can be used (see below and the -pcrecallout -documentation). If the pattern above is matched against -

      -  (ab(cd)ef)
      -
      -the value for the inner capturing parentheses (numbered 2) is "ef", which is -the last value taken on at the top level. If a capturing subpattern is not -matched at the top level, its final captured value is unset, even if it was -(temporarily) set at a deeper level during the matching process. -

      -

      -If there are more than 15 capturing parentheses in a pattern, PCRE has to -obtain extra memory to store data during a recursion, which it does by using -pcre_malloc, freeing it via pcre_free afterwards. If no memory can -be obtained, the match fails with the PCRE_ERROR_NOMEMORY error. -

      -

      -Do not confuse the (?R) item with the condition (R), which tests for recursion. -Consider this pattern, which matches text in angle brackets, allowing for -arbitrary nesting. Only digits are allowed in nested brackets (that is, when -recursing), whereas any characters are permitted at the outer level. -

      -  < (?: (?(R) \d++  | [^<>]*+) | (?R)) * >
      -
      -In this pattern, (?(R) is the start of a conditional subpattern, with two -different alternatives for the recursive and non-recursive cases. The (?R) item -is the actual recursive call. -

      -
      -Differences in recursion processing between PCRE and Perl -
      -

      -Recursion processing in PCRE differs from Perl in two important ways. In PCRE -(like Python, but unlike Perl), a recursive subpattern call is always treated -as an atomic group. That is, once it has matched some of the subject string, it -is never re-entered, even if it contains untried alternatives and there is a -subsequent matching failure. This can be illustrated by the following pattern, -which purports to match a palindromic string that contains an odd number of -characters (for example, "a", "aba", "abcba", "abcdcba"): -

      -  ^(.|(.)(?1)\2)$
      -
      -The idea is that it either matches a single character, or two identical -characters surrounding a sub-palindrome. In Perl, this pattern works; in PCRE -it does not if the pattern is longer than three characters. Consider the -subject string "abcba": -

      -

      -At the top level, the first character is matched, but as it is not at the end -of the string, the first alternative fails; the second alternative is taken -and the recursion kicks in. The recursive call to subpattern 1 successfully -matches the next character ("b"). (Note that the beginning and end of line -tests are not part of the recursion). -

      -

      -Back at the top level, the next character ("c") is compared with what -subpattern 2 matched, which was "a". This fails. Because the recursion is -treated as an atomic group, there are now no backtracking points, and so the -entire match fails. (Perl is able, at this point, to re-enter the recursion and -try the second alternative.) However, if the pattern is written with the -alternatives in the other order, things are different: -

      -  ^((.)(?1)\2|.)$
      -
      -This time, the recursing alternative is tried first, and continues to recurse -until it runs out of characters, at which point the recursion fails. But this -time we do have another alternative to try at the higher level. That is the big -difference: in the previous case the remaining alternative is at a deeper -recursion level, which PCRE cannot use. -

      -

      -To change the pattern so that it matches all palindromic strings, not just -those with an odd number of characters, it is tempting to change the pattern to -this: -

      -  ^((.)(?1)\2|.?)$
      -
      -Again, this works in Perl, but not in PCRE, and for the same reason. When a -deeper recursion has matched a single character, it cannot be entered again in -order to match an empty string. The solution is to separate the two cases, and -write out the odd and even cases as alternatives at the higher level: -
      -  ^(?:((.)(?1)\2|)|((.)(?3)\4|.))
      -
      -If you want to match typical palindromic phrases, the pattern has to ignore all -non-word characters, which can be done like this: -
      -  ^\W*+(?:((.)\W*+(?1)\W*+\2|)|((.)\W*+(?3)\W*+\4|\W*+.\W*+))\W*+$
      -
      -If run with the PCRE_CASELESS option, this pattern matches phrases such as "A -man, a plan, a canal: Panama!" and it works well in both PCRE and Perl. Note -the use of the possessive quantifier *+ to avoid backtracking into sequences of -non-word characters. Without this, PCRE takes a great deal longer (ten times or -more) to match typical phrases, and Perl takes so long that you think it has -gone into a loop. -

      -

      -WARNING: The palindrome-matching patterns above work only if the subject -string does not start with a palindrome that is shorter than the entire string. -For example, although "abcba" is correctly matched, if the subject is "ababa", -PCRE finds the palindrome "aba" at the start, then fails at top level because -the end of the string does not follow. Once again, it cannot jump back into the -recursion to try other alternatives, so the entire match fails. -

      -

      -The second way in which PCRE and Perl differ in their recursion processing is -in the handling of captured values. In Perl, when a subpattern is called -recursively or as a subpattern (see the next section), it has no access to any -values that were captured outside the recursion, whereas in PCRE these values -can be referenced. Consider this pattern: -

      -  ^(.)(\1|a(?2))
      -
      -In PCRE, this pattern matches "bab". The first capturing parentheses match "b", -then in the second group, when the back reference \1 fails to match "b", the -second alternative matches "a" and then recurses. In the recursion, \1 does -now match "b" and so the whole match succeeds. In Perl, the pattern fails to -match because inside the recursive call \1 cannot access the externally set -value. -

      -
      SUBPATTERNS AS SUBROUTINES
      -

      -If the syntax for a recursive subpattern call (either by number or by -name) is used outside the parentheses to which it refers, it operates like a -subroutine in a programming language. The called subpattern may be defined -before or after the reference. A numbered reference can be absolute or -relative, as in these examples: -

      -  (...(absolute)...)...(?2)...
      -  (...(relative)...)...(?-1)...
      -  (...(?+1)...(relative)...
      -
      -An earlier example pointed out that the pattern -
      -  (sens|respons)e and \1ibility
      -
      -matches "sense and sensibility" and "response and responsibility", but not -"sense and responsibility". If instead the pattern -
      -  (sens|respons)e and (?1)ibility
      -
      -is used, it does match "sense and responsibility" as well as the other two -strings. Another example is given in the discussion of DEFINE above. -

      -

      -All subroutine calls, whether recursive or not, are always treated as atomic -groups. That is, once a subroutine has matched some of the subject string, it -is never re-entered, even if it contains untried alternatives and there is a -subsequent matching failure. Any capturing parentheses that are set during the -subroutine call revert to their previous values afterwards. -

      -

      -Processing options such as case-independence are fixed when a subpattern is -defined, so if it is used as a subroutine, such options cannot be changed for -different calls. For example, consider this pattern: -

      -  (abc)(?i:(?-1))
      -
      -It matches "abcabc". It does not match "abcABC" because the change of -processing option does not affect the called subpattern. -

      -
      ONIGURUMA SUBROUTINE SYNTAX
      -

      -For compatibility with Oniguruma, the non-Perl syntax \g followed by a name or -a number enclosed either in angle brackets or single quotes, is an alternative -syntax for referencing a subpattern as a subroutine, possibly recursively. Here -are two of the examples used above, rewritten using this syntax: -

      -  (?<pn> \( ( (?>[^()]+) | \g<pn> )* \) )
      -  (sens|respons)e and \g'1'ibility
      -
      -PCRE supports an extension to Oniguruma: if a number is preceded by a -plus or a minus sign it is taken as a relative reference. For example: -
      -  (abc)(?i:\g<-1>)
      -
      -Note that \g{...} (Perl syntax) and \g<...> (Oniguruma syntax) are not -synonymous. The former is a back reference; the latter is a subroutine call. -

      -
      CALLOUTS
      -

      -Perl has a feature whereby using the sequence (?{...}) causes arbitrary Perl -code to be obeyed in the middle of matching a regular expression. This makes it -possible, amongst other things, to extract different substrings that match the -same pair of parentheses when there is a repetition. -

      -

      -PCRE provides a similar feature, but of course it cannot obey arbitrary Perl -code. The feature is called "callout". The caller of PCRE provides an external -function by putting its entry point in the global variable pcre_callout -(8-bit library) or pcre[16|32]_callout (16-bit or 32-bit library). -By default, this variable contains NULL, which disables all calling out. -

      -

      -Within a regular expression, (?C) indicates the points at which the external -function is to be called. If you want to identify different callout points, you -can put a number less than 256 after the letter C. The default value is zero. -For example, this pattern has two callout points: -

      -  (?C1)abc(?C2)def
      -
      -If the PCRE_AUTO_CALLOUT flag is passed to a compiling function, callouts are -automatically installed before each item in the pattern. They are all numbered -255. If there is a conditional group in the pattern whose condition is an -assertion, an additional callout is inserted just before the condition. An -explicit callout may also be set at this position, as in this example: -
      -  (?(?C9)(?=a)abc|def)
      -
      -Note that this applies only to assertion conditions, not to other types of -condition. -

      -

      -During matching, when PCRE reaches a callout point, the external function is -called. It is provided with the number of the callout, the position in the -pattern, and, optionally, one item of data originally supplied by the caller of -the matching function. The callout function may cause matching to proceed, to -backtrack, or to fail altogether. -

      -

      -By default, PCRE implements a number of optimizations at compile time and -matching time, and one side-effect is that sometimes callouts are skipped. If -you need all possible callouts to happen, you need to set options that disable -the relevant optimizations. More details, and a complete description of the -interface to the callout function, are given in the -pcrecallout -documentation. -

      -
      BACKTRACKING CONTROL
      -

      -Perl 5.10 introduced a number of "Special Backtracking Control Verbs", which -are still described in the Perl documentation as "experimental and subject to -change or removal in a future version of Perl". It goes on to say: "Their usage -in production code should be noted to avoid problems during upgrades." The same -remarks apply to the PCRE features described in this section. -

      -

      -The new verbs make use of what was previously invalid syntax: an opening -parenthesis followed by an asterisk. They are generally of the form -(*VERB) or (*VERB:NAME). Some may take either form, possibly behaving -differently depending on whether or not a name is present. A name is any -sequence of characters that does not include a closing parenthesis. The maximum -length of name is 255 in the 8-bit library and 65535 in the 16-bit and 32-bit -libraries. If the name is empty, that is, if the closing parenthesis -immediately follows the colon, the effect is as if the colon were not there. -Any number of these verbs may occur in a pattern. -

      -

      -Since these verbs are specifically related to backtracking, most of them can be -used only when the pattern is to be matched using one of the traditional -matching functions, because these use a backtracking algorithm. With the -exception of (*FAIL), which behaves like a failing negative assertion, the -backtracking control verbs cause an error if encountered by a DFA matching -function. -

      -

      -The behaviour of these verbs in -repeated groups, -assertions, -and in -subpatterns called as subroutines -(whether or not recursively) is documented below. -

      -
      -Optimizations that affect backtracking verbs -
      -

      -PCRE contains some optimizations that are used to speed up matching by running -some checks at the start of each match attempt. For example, it may know the -minimum length of matching subject, or that a particular character must be -present. When one of these optimizations bypasses the running of a match, any -included backtracking verbs will not, of course, be processed. You can suppress -the start-of-match optimizations by setting the PCRE_NO_START_OPTIMIZE option -when calling pcre_compile() or pcre_exec(), or by starting the -pattern with (*NO_START_OPT). There is more discussion of this option in the -section entitled -"Option bits for pcre_exec()" -in the -pcreapi -documentation. -

      -

      -Experiments with Perl suggest that it too has similar optimizations, sometimes -leading to anomalous results. -

      -
      -Verbs that act immediately -
      -

      -The following verbs act as soon as they are encountered. They may not be -followed by a name. -

      -   (*ACCEPT)
      -
      -This verb causes the match to end successfully, skipping the remainder of the -pattern. However, when it is inside a subpattern that is called as a -subroutine, only that subpattern is ended successfully. Matching then continues -at the outer level. If (*ACCEPT) in triggered in a positive assertion, the -assertion succeeds; in a negative assertion, the assertion fails. -

      -

      -If (*ACCEPT) is inside capturing parentheses, the data so far is captured. For -example: -

      -  A((?:A|B(*ACCEPT)|C)D)
      -
      -This matches "AB", "AAD", or "ACD"; when it matches "AB", "B" is captured by -the outer parentheses. -
      -  (*FAIL) or (*F)
      -
      -This verb causes a matching failure, forcing backtracking to occur. It is -equivalent to (?!) but easier to read. The Perl documentation notes that it is -probably useful only when combined with (?{}) or (??{}). Those are, of course, -Perl features that are not present in PCRE. The nearest equivalent is the -callout feature, as for example in this pattern: -
      -  a+(?C)(*FAIL)
      -
      -A match with the string "aaaa" always fails, but the callout is taken before -each backtrack happens (in this example, 10 times). -

      -
      -Recording which path was taken -
      -

      -There is one verb whose main purpose is to track how a match was arrived at, -though it also has a secondary use in conjunction with advancing the match -starting point (see (*SKIP) below). -

      -  (*MARK:NAME) or (*:NAME)
      -
      -A name is always required with this verb. There may be as many instances of -(*MARK) as you like in a pattern, and their names do not have to be unique. -

      -

      -When a match succeeds, the name of the last-encountered (*MARK:NAME), -(*PRUNE:NAME), or (*THEN:NAME) on the matching path is passed back to the -caller as described in the section entitled -"Extra data for pcre_exec()" -in the -pcreapi -documentation. Here is an example of pcretest output, where the /K -modifier requests the retrieval and outputting of (*MARK) data: -

      -    re> /X(*MARK:A)Y|X(*MARK:B)Z/K
      -  data> XY
      -   0: XY
      -  MK: A
      -  XZ
      -   0: XZ
      -  MK: B
      -
      -The (*MARK) name is tagged with "MK:" in this output, and in this example it -indicates which of the two alternatives matched. This is a more efficient way -of obtaining this information than putting each alternative in its own -capturing parentheses. -

      -

      -If a verb with a name is encountered in a positive assertion that is true, the -name is recorded and passed back if it is the last-encountered. This does not -happen for negative assertions or failing positive assertions. -

      -

      -After a partial match or a failed match, the last encountered name in the -entire match process is returned. For example: -

      -    re> /X(*MARK:A)Y|X(*MARK:B)Z/K
      -  data> XP
      -  No match, mark = B
      -
      -Note that in this unanchored example the mark is retained from the match -attempt that started at the letter "X" in the subject. Subsequent match -attempts starting at "P" and then with an empty string do not get as far as the -(*MARK) item, but nevertheless do not reset it. -

      -

      -If you are interested in (*MARK) values after failed matches, you should -probably set the PCRE_NO_START_OPTIMIZE option -(see above) -to ensure that the match is always attempted. -

      -
      -Verbs that act after backtracking -
      -

      -The following verbs do nothing when they are encountered. Matching continues -with what follows, but if there is no subsequent match, causing a backtrack to -the verb, a failure is forced. That is, backtracking cannot pass to the left of -the verb. However, when one of these verbs appears inside an atomic group or an -assertion that is true, its effect is confined to that group, because once the -group has been matched, there is never any backtracking into it. In this -situation, backtracking can "jump back" to the left of the entire atomic group -or assertion. (Remember also, as stated above, that this localization also -applies in subroutine calls.) -

      -

      -These verbs differ in exactly what kind of failure occurs when backtracking -reaches them. The behaviour described below is what happens when the verb is -not in a subroutine or an assertion. Subsequent sections cover these special -cases. -

      -  (*COMMIT)
      -
      -This verb, which may not be followed by a name, causes the whole match to fail -outright if there is a later matching failure that causes backtracking to reach -it. Even if the pattern is unanchored, no further attempts to find a match by -advancing the starting point take place. If (*COMMIT) is the only backtracking -verb that is encountered, once it has been passed pcre_exec() is -committed to finding a match at the current starting point, or not at all. For -example: -
      -  a+(*COMMIT)b
      -
      -This matches "xxaab" but not "aacaab". It can be thought of as a kind of -dynamic anchor, or "I've started, so I must finish." The name of the most -recently passed (*MARK) in the path is passed back when (*COMMIT) forces a -match failure. -

      -

      -If there is more than one backtracking verb in a pattern, a different one that -follows (*COMMIT) may be triggered first, so merely passing (*COMMIT) during a -match does not always guarantee that a match must be at this starting point. -

      -

      -Note that (*COMMIT) at the start of a pattern is not the same as an anchor, -unless PCRE's start-of-match optimizations are turned off, as shown in this -output from pcretest: -

      -    re> /(*COMMIT)abc/
      -  data> xyzabc
      -   0: abc
      -  data> xyzabc\Y
      -  No match
      -
      -For this pattern, PCRE knows that any match must start with "a", so the -optimization skips along the subject to "a" before applying the pattern to the -first set of data. The match attempt then succeeds. In the second set of data, -the escape sequence \Y is interpreted by the pcretest program. It causes -the PCRE_NO_START_OPTIMIZE option to be set when pcre_exec() is called. -This disables the optimization that skips along to the first character. The -pattern is now applied starting at "x", and so the (*COMMIT) causes the match -to fail without trying any other starting points. -
      -  (*PRUNE) or (*PRUNE:NAME)
      -
      -This verb causes the match to fail at the current starting position in the -subject if there is a later matching failure that causes backtracking to reach -it. If the pattern is unanchored, the normal "bumpalong" advance to the next -starting character then happens. Backtracking can occur as usual to the left of -(*PRUNE), before it is reached, or when matching to the right of (*PRUNE), but -if there is no match to the right, backtracking cannot cross (*PRUNE). In -simple cases, the use of (*PRUNE) is just an alternative to an atomic group or -possessive quantifier, but there are some uses of (*PRUNE) that cannot be -expressed in any other way. In an anchored pattern (*PRUNE) has the same effect -as (*COMMIT). -

      -

      -The behaviour of (*PRUNE:NAME) is the not the same as (*MARK:NAME)(*PRUNE). -It is like (*MARK:NAME) in that the name is remembered for passing back to the -caller. However, (*SKIP:NAME) searches only for names set with (*MARK). -

      -  (*SKIP)
      -
      -This verb, when given without a name, is like (*PRUNE), except that if the -pattern is unanchored, the "bumpalong" advance is not to the next character, -but to the position in the subject where (*SKIP) was encountered. (*SKIP) -signifies that whatever text was matched leading up to it cannot be part of a -successful match. Consider: -
      -  a+(*SKIP)b
      -
      -If the subject is "aaaac...", after the first match attempt fails (starting at -the first character in the string), the starting point skips on to start the -next attempt at "c". Note that a possessive quantifer does not have the same -effect as this example; although it would suppress backtracking during the -first match attempt, the second attempt would start at the second character -instead of skipping on to "c". -
      -  (*SKIP:NAME)
      -
      -When (*SKIP) has an associated name, its behaviour is modified. When it is -triggered, the previous path through the pattern is searched for the most -recent (*MARK) that has the same name. If one is found, the "bumpalong" advance -is to the subject position that corresponds to that (*MARK) instead of to where -(*SKIP) was encountered. If no (*MARK) with a matching name is found, the -(*SKIP) is ignored. -

      -

      -Note that (*SKIP:NAME) searches only for names set by (*MARK:NAME). It ignores -names that are set by (*PRUNE:NAME) or (*THEN:NAME). -

      -  (*THEN) or (*THEN:NAME)
      -
      -This verb causes a skip to the next innermost alternative when backtracking -reaches it. That is, it cancels any further backtracking within the current -alternative. Its name comes from the observation that it can be used for a -pattern-based if-then-else block: -
      -  ( COND1 (*THEN) FOO | COND2 (*THEN) BAR | COND3 (*THEN) BAZ ) ...
      -
      -If the COND1 pattern matches, FOO is tried (and possibly further items after -the end of the group if FOO succeeds); on failure, the matcher skips to the -second alternative and tries COND2, without backtracking into COND1. If that -succeeds and BAR fails, COND3 is tried. If subsequently BAZ fails, there are no -more alternatives, so there is a backtrack to whatever came before the entire -group. If (*THEN) is not inside an alternation, it acts like (*PRUNE). -

      -

      -The behaviour of (*THEN:NAME) is the not the same as (*MARK:NAME)(*THEN). -It is like (*MARK:NAME) in that the name is remembered for passing back to the -caller. However, (*SKIP:NAME) searches only for names set with (*MARK). -

      -

      -A subpattern that does not contain a | character is just a part of the -enclosing alternative; it is not a nested alternation with only one -alternative. The effect of (*THEN) extends beyond such a subpattern to the -enclosing alternative. Consider this pattern, where A, B, etc. are complex -pattern fragments that do not contain any | characters at this level: -

      -  A (B(*THEN)C) | D
      -
      -If A and B are matched, but there is a failure in C, matching does not -backtrack into A; instead it moves to the next alternative, that is, D. -However, if the subpattern containing (*THEN) is given an alternative, it -behaves differently: -
      -  A (B(*THEN)C | (*FAIL)) | D
      -
      -The effect of (*THEN) is now confined to the inner subpattern. After a failure -in C, matching moves to (*FAIL), which causes the whole subpattern to fail -because there are no more alternatives to try. In this case, matching does now -backtrack into A. -

      -

      -Note that a conditional subpattern is not considered as having two -alternatives, because only one is ever used. In other words, the | character in -a conditional subpattern has a different meaning. Ignoring white space, -consider: -

      -  ^.*? (?(?=a) a | b(*THEN)c )
      -
      -If the subject is "ba", this pattern does not match. Because .*? is ungreedy, -it initially matches zero characters. The condition (?=a) then fails, the -character "b" is matched, but "c" is not. At this point, matching does not -backtrack to .*? as might perhaps be expected from the presence of the | -character. The conditional subpattern is part of the single alternative that -comprises the whole pattern, and so the match fails. (If there was a backtrack -into .*?, allowing it to match "b", the match would succeed.) -

      -

      -The verbs just described provide four different "strengths" of control when -subsequent matching fails. (*THEN) is the weakest, carrying on the match at the -next alternative. (*PRUNE) comes next, failing the match at the current -starting position, but allowing an advance to the next character (for an -unanchored pattern). (*SKIP) is similar, except that the advance may be more -than one character. (*COMMIT) is the strongest, causing the entire match to -fail. -

      -
      -More than one backtracking verb -
      -

      -If more than one backtracking verb is present in a pattern, the one that is -backtracked onto first acts. For example, consider this pattern, where A, B, -etc. are complex pattern fragments: -

      -  (A(*COMMIT)B(*THEN)C|ABD)
      -
      -If A matches but B fails, the backtrack to (*COMMIT) causes the entire match to -fail. However, if A and B match, but C fails, the backtrack to (*THEN) causes -the next alternative (ABD) to be tried. This behaviour is consistent, but is -not always the same as Perl's. It means that if two or more backtracking verbs -appear in succession, all the the last of them has no effect. Consider this -example: -
      -  ...(*COMMIT)(*PRUNE)...
      -
      -If there is a matching failure to the right, backtracking onto (*PRUNE) causes -it to be triggered, and its action is taken. There can never be a backtrack -onto (*COMMIT). -

      -
      -Backtracking verbs in repeated groups -
      -

      -PCRE differs from Perl in its handling of backtracking verbs in repeated -groups. For example, consider: -

      -  /(a(*COMMIT)b)+ac/
      -
      -If the subject is "abac", Perl matches, but PCRE fails because the (*COMMIT) in -the second repeat of the group acts. -

      -
      -Backtracking verbs in assertions -
      -

      -(*FAIL) in an assertion has its normal effect: it forces an immediate backtrack. -

      -

      -(*ACCEPT) in a positive assertion causes the assertion to succeed without any -further processing. In a negative assertion, (*ACCEPT) causes the assertion to -fail without any further processing. -

      -

      -The other backtracking verbs are not treated specially if they appear in a -positive assertion. In particular, (*THEN) skips to the next alternative in the -innermost enclosing group that has alternations, whether or not this is within -the assertion. -

      -

      -Negative assertions are, however, different, in order to ensure that changing a -positive assertion into a negative assertion changes its result. Backtracking -into (*COMMIT), (*SKIP), or (*PRUNE) causes a negative assertion to be true, -without considering any further alternative branches in the assertion. -Backtracking into (*THEN) causes it to skip to the next enclosing alternative -within the assertion (the normal behaviour), but if the assertion does not have -such an alternative, (*THEN) behaves like (*PRUNE). -

      -
      -Backtracking verbs in subroutines -
      -

      -These behaviours occur whether or not the subpattern is called recursively. -Perl's treatment of subroutines is different in some cases. -

      -

      -(*FAIL) in a subpattern called as a subroutine has its normal effect: it forces -an immediate backtrack. -

      -

      -(*ACCEPT) in a subpattern called as a subroutine causes the subroutine match to -succeed without any further processing. Matching then continues after the -subroutine call. -

      -

      -(*COMMIT), (*SKIP), and (*PRUNE) in a subpattern called as a subroutine cause -the subroutine match to fail. -

      -

      -(*THEN) skips to the next alternative in the innermost enclosing group within -the subpattern that has alternatives. If there is no such group within the -subpattern, (*THEN) causes the subroutine match to fail. -

      -
      SEE ALSO
      -

      -pcreapi(3), pcrecallout(3), pcrematching(3), -pcresyntax(3), pcre(3), pcre16(3), pcre32(3). -

      -
      AUTHOR
      -

      -Philip Hazel -
      -University Computing Service -
      -Cambridge CB2 3QH, England. -
      -

      -
      REVISION
      -

      -Last updated: 23 October 2016 -
      -Copyright © 1997-2016 University of Cambridge. -
      -

      -Return to the PCRE index page. -

      diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcreperform.html b/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcreperform.html deleted file mode 100644 index dda207f9..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcreperform.html +++ /dev/null @@ -1,195 +0,0 @@ - - -pcreperform specification - - -

      pcreperform man page

      -

      -Return to the PCRE index page. -

      -

      -This page is part of the PCRE HTML documentation. It was generated automatically -from the original man page. If there is any nonsense in it, please consult the -man page, in case the conversion went wrong. -
      -
      -PCRE PERFORMANCE -
      -

      -Two aspects of performance are discussed below: memory usage and processing -time. The way you express your pattern as a regular expression can affect both -of them. -

      -
      -COMPILED PATTERN MEMORY USAGE -
      -

      -Patterns are compiled by PCRE into a reasonably efficient interpretive code, so -that most simple patterns do not use much memory. However, there is one case -where the memory usage of a compiled pattern can be unexpectedly large. If a -parenthesized subpattern has a quantifier with a minimum greater than 1 and/or -a limited maximum, the whole subpattern is repeated in the compiled code. For -example, the pattern -

      -  (abc|def){2,4}
      -
      -is compiled as if it were -
      -  (abc|def)(abc|def)((abc|def)(abc|def)?)?
      -
      -(Technical aside: It is done this way so that backtrack points within each of -the repetitions can be independently maintained.) -

      -

      -For regular expressions whose quantifiers use only small numbers, this is not -usually a problem. However, if the numbers are large, and particularly if such -repetitions are nested, the memory usage can become an embarrassment. For -example, the very simple pattern -

      -  ((ab){1,1000}c){1,3}
      -
      -uses 51K bytes when compiled using the 8-bit library. When PCRE is compiled -with its default internal pointer size of two bytes, the size limit on a -compiled pattern is 64K data units, and this is reached with the above pattern -if the outer repetition is increased from 3 to 4. PCRE can be compiled to use -larger internal pointers and thus handle larger compiled patterns, but it is -better to try to rewrite your pattern to use less memory if you can. -

      -

      -One way of reducing the memory usage for such patterns is to make use of PCRE's -"subroutine" -facility. Re-writing the above pattern as -

      -  ((ab)(?2){0,999}c)(?1){0,2}
      -
      -reduces the memory requirements to 18K, and indeed it remains under 20K even -with the outer repetition increased to 100. However, this pattern is not -exactly equivalent, because the "subroutine" calls are treated as -atomic groups -into which there can be no backtracking if there is a subsequent matching -failure. Therefore, PCRE cannot do this kind of rewriting automatically. -Furthermore, there is a noticeable loss of speed when executing the modified -pattern. Nevertheless, if the atomic grouping is not a problem and the loss of -speed is acceptable, this kind of rewriting will allow you to process patterns -that PCRE cannot otherwise handle. -

      -
      -STACK USAGE AT RUN TIME -
      -

      -When pcre_exec() or pcre[16|32]_exec() is used for matching, certain -kinds of pattern can cause it to use large amounts of the process stack. In -some environments the default process stack is quite small, and if it runs out -the result is often SIGSEGV. This issue is probably the most frequently raised -problem with PCRE. Rewriting your pattern can often help. The -pcrestack -documentation discusses this issue in detail. -

      -
      -PROCESSING TIME -
      -

      -Certain items in regular expression patterns are processed more efficiently -than others. It is more efficient to use a character class like [aeiou] than a -set of single-character alternatives such as (a|e|i|o|u). In general, the -simplest construction that provides the required behaviour is usually the most -efficient. Jeffrey Friedl's book contains a lot of useful general discussion -about optimizing regular expressions for efficient performance. This document -contains a few observations about PCRE. -

      -

      -Using Unicode character properties (the \p, \P, and \X escapes) is slow, -because PCRE has to use a multi-stage table lookup whenever it needs a -character's property. If you can find an alternative pattern that does not use -character properties, it will probably be faster. -

      -

      -By default, the escape sequences \b, \d, \s, and \w, and the POSIX -character classes such as [:alpha:] do not use Unicode properties, partly for -backwards compatibility, and partly for performance reasons. However, you can -set PCRE_UCP if you want Unicode character properties to be used. This can -double the matching time for items such as \d, when matched with -a traditional matching function; the performance loss is less with -a DFA matching function, and in both cases there is not much difference for -\b. -

      -

      -When a pattern begins with .* not in parentheses, or in parentheses that are -not the subject of a backreference, and the PCRE_DOTALL option is set, the -pattern is implicitly anchored by PCRE, since it can match only at the start of -a subject string. However, if PCRE_DOTALL is not set, PCRE cannot make this -optimization, because the . metacharacter does not then match a newline, and if -the subject string contains newlines, the pattern may match from the character -immediately following one of them instead of from the very start. For example, -the pattern -

      -  .*second
      -
      -matches the subject "first\nand second" (where \n stands for a newline -character), with the match starting at the seventh character. In order to do -this, PCRE has to retry the match starting after every newline in the subject. -

      -

      -If you are using such a pattern with subject strings that do not contain -newlines, the best performance is obtained by setting PCRE_DOTALL, or starting -the pattern with ^.* or ^.*? to indicate explicit anchoring. That saves PCRE -from having to scan along the subject looking for a newline to restart at. -

      -

      -Beware of patterns that contain nested indefinite repeats. These can take a -long time to run when applied to a string that does not match. Consider the -pattern fragment -

      -  ^(a+)*
      -
      -This can match "aaaa" in 16 different ways, and this number increases very -rapidly as the string gets longer. (The * repeat can match 0, 1, 2, 3, or 4 -times, and for each of those cases other than 0 or 4, the + repeats can match -different numbers of times.) When the remainder of the pattern is such that the -entire match is going to fail, PCRE has in principle to try every possible -variation, and this can take an extremely long time, even for relatively short -strings. -

      -

      -An optimization catches some of the more simple cases such as -

      -  (a+)*b
      -
      -where a literal character follows. Before embarking on the standard matching -procedure, PCRE checks that there is a "b" later in the subject string, and if -there is not, it fails the match immediately. However, when there is no -following literal this optimization cannot be used. You can see the difference -by comparing the behaviour of -
      -  (a+)*\d
      -
      -with the pattern above. The former gives a failure almost instantly when -applied to a whole line of "a" characters, whereas the latter takes an -appreciable time with strings longer than about 20 characters. -

      -

      -In many cases, the solution to this kind of performance issue is to use an -atomic group or a possessive quantifier. -

      -
      -AUTHOR -
      -

      -Philip Hazel -
      -University Computing Service -
      -Cambridge CB2 3QH, England. -
      -

      -
      -REVISION -
      -

      -Last updated: 25 August 2012 -
      -Copyright © 1997-2012 University of Cambridge. -
      -

      -Return to the PCRE index page. -

      diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcreposix.html b/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcreposix.html deleted file mode 100644 index 18924cf7..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcreposix.html +++ /dev/null @@ -1,290 +0,0 @@ - - -pcreposix specification - - -

      pcreposix man page

      -

      -Return to the PCRE index page. -

      -

      -This page is part of the PCRE HTML documentation. It was generated automatically -from the original man page. If there is any nonsense in it, please consult the -man page, in case the conversion went wrong. -
      -

      -
      SYNOPSIS
      -

      -#include <pcreposix.h> -

      -

      -int regcomp(regex_t *preg, const char *pattern, - int cflags); -
      -
      -int regexec(regex_t *preg, const char *string, - size_t nmatch, regmatch_t pmatch[], int eflags); - size_t regerror(int errcode, const regex_t *preg, - char *errbuf, size_t errbuf_size); -
      -
      -void regfree(regex_t *preg); -

      -
      DESCRIPTION
      -

      -This set of functions provides a POSIX-style API for the PCRE regular -expression 8-bit library. See the -pcreapi -documentation for a description of PCRE's native API, which contains much -additional functionality. There is no POSIX-style wrapper for PCRE's 16-bit -and 32-bit library. -

      -

      -The functions described here are just wrapper functions that ultimately call -the PCRE native API. Their prototypes are defined in the pcreposix.h -header file, and on Unix systems the library itself is called -pcreposix.a, so can be accessed by adding -lpcreposix to the -command for linking an application that uses them. Because the POSIX functions -call the native ones, it is also necessary to add -lpcre. -

      -

      -I have implemented only those POSIX option bits that can be reasonably mapped -to PCRE native options. In addition, the option REG_EXTENDED is defined with -the value zero. This has no effect, but since programs that are written to the -POSIX interface often use it, this makes it easier to slot in PCRE as a -replacement library. Other POSIX options are not even defined. -

      -

      -There are also some other options that are not defined by POSIX. These have -been added at the request of users who want to make use of certain -PCRE-specific features via the POSIX calling interface. -

      -

      -When PCRE is called via these functions, it is only the API that is POSIX-like -in style. The syntax and semantics of the regular expressions themselves are -still those of Perl, subject to the setting of various PCRE options, as -described below. "POSIX-like in style" means that the API approximates to the -POSIX definition; it is not fully POSIX-compatible, and in multi-byte encoding -domains it is probably even less compatible. -

      -

      -The header for these functions is supplied as pcreposix.h to avoid any -potential clash with other POSIX libraries. It can, of course, be renamed or -aliased as regex.h, which is the "correct" name. It provides two -structure types, regex_t for compiled internal forms, and -regmatch_t for returning captured substrings. It also defines some -constants whose names start with "REG_"; these are used for setting options and -identifying error codes. -

      -
      COMPILING A PATTERN
      -

      -The function regcomp() is called to compile a pattern into an -internal form. The pattern is a C string terminated by a binary zero, and -is passed in the argument pattern. The preg argument is a pointer -to a regex_t structure that is used as a base for storing information -about the compiled regular expression. -

      -

      -The argument cflags is either zero, or contains one or more of the bits -defined by the following macros: -

      -  REG_DOTALL
      -
      -The PCRE_DOTALL option is set when the regular expression is passed for -compilation to the native function. Note that REG_DOTALL is not part of the -POSIX standard. -
      -  REG_ICASE
      -
      -The PCRE_CASELESS option is set when the regular expression is passed for -compilation to the native function. -
      -  REG_NEWLINE
      -
      -The PCRE_MULTILINE option is set when the regular expression is passed for -compilation to the native function. Note that this does not mimic the -defined POSIX behaviour for REG_NEWLINE (see the following section). -
      -  REG_NOSUB
      -
      -The PCRE_NO_AUTO_CAPTURE option is set when the regular expression is passed -for compilation to the native function. In addition, when a pattern that is -compiled with this flag is passed to regexec() for matching, the -nmatch and pmatch arguments are ignored, and no captured strings -are returned. -
      -  REG_UCP
      -
      -The PCRE_UCP option is set when the regular expression is passed for -compilation to the native function. This causes PCRE to use Unicode properties -when matchine \d, \w, etc., instead of just recognizing ASCII values. Note -that REG_UTF8 is not part of the POSIX standard. -
      -  REG_UNGREEDY
      -
      -The PCRE_UNGREEDY option is set when the regular expression is passed for -compilation to the native function. Note that REG_UNGREEDY is not part of the -POSIX standard. -
      -  REG_UTF8
      -
      -The PCRE_UTF8 option is set when the regular expression is passed for -compilation to the native function. This causes the pattern itself and all data -strings used for matching it to be treated as UTF-8 strings. Note that REG_UTF8 -is not part of the POSIX standard. -

      -

      -In the absence of these flags, no options are passed to the native function. -This means the the regex is compiled with PCRE default semantics. In -particular, the way it handles newline characters in the subject string is the -Perl way, not the POSIX way. Note that setting PCRE_MULTILINE has only -some of the effects specified for REG_NEWLINE. It does not affect the way -newlines are matched by . (they are not) or by a negative class such as [^a] -(they are). -

      -

      -The yield of regcomp() is zero on success, and non-zero otherwise. The -preg structure is filled in on success, and one member of the structure -is public: re_nsub contains the number of capturing subpatterns in -the regular expression. Various error codes are defined in the header file. -

      -

      -NOTE: If the yield of regcomp() is non-zero, you must not attempt to -use the contents of the preg structure. If, for example, you pass it to -regexec(), the result is undefined and your program is likely to crash. -

      -
      MATCHING NEWLINE CHARACTERS
      -

      -This area is not simple, because POSIX and Perl take different views of things. -It is not possible to get PCRE to obey POSIX semantics, but then PCRE was never -intended to be a POSIX engine. The following table lists the different -possibilities for matching newline characters in PCRE: -

      -                          Default   Change with
      -
      -  . matches newline          no     PCRE_DOTALL
      -  newline matches [^a]       yes    not changeable
      -  $ matches \n at end        yes    PCRE_DOLLARENDONLY
      -  $ matches \n in middle     no     PCRE_MULTILINE
      -  ^ matches \n in middle     no     PCRE_MULTILINE
      -
      -This is the equivalent table for POSIX: -
      -                          Default   Change with
      -
      -  . matches newline          yes    REG_NEWLINE
      -  newline matches [^a]       yes    REG_NEWLINE
      -  $ matches \n at end        no     REG_NEWLINE
      -  $ matches \n in middle     no     REG_NEWLINE
      -  ^ matches \n in middle     no     REG_NEWLINE
      -
      -PCRE's behaviour is the same as Perl's, except that there is no equivalent for -PCRE_DOLLAR_ENDONLY in Perl. In both PCRE and Perl, there is no way to stop -newline from matching [^a]. -

      -

      -The default POSIX newline handling can be obtained by setting PCRE_DOTALL and -PCRE_DOLLAR_ENDONLY, but there is no way to make PCRE behave exactly as for the -REG_NEWLINE action. -

      -
      MATCHING A PATTERN
      -

      -The function regexec() is called to match a compiled pattern preg -against a given string, which is by default terminated by a zero byte -(but see REG_STARTEND below), subject to the options in eflags. These can -be: -

      -  REG_NOTBOL
      -
      -The PCRE_NOTBOL option is set when calling the underlying PCRE matching -function. -
      -  REG_NOTEMPTY
      -
      -The PCRE_NOTEMPTY option is set when calling the underlying PCRE matching -function. Note that REG_NOTEMPTY is not part of the POSIX standard. However, -setting this option can give more POSIX-like behaviour in some situations. -
      -  REG_NOTEOL
      -
      -The PCRE_NOTEOL option is set when calling the underlying PCRE matching -function. -
      -  REG_STARTEND
      -
      -The string is considered to start at string + pmatch[0].rm_so and -to have a terminating NUL located at string + pmatch[0].rm_eo -(there need not actually be a NUL at that location), regardless of the value of -nmatch. This is a BSD extension, compatible with but not specified by -IEEE Standard 1003.2 (POSIX.2), and should be used with caution in software -intended to be portable to other systems. Note that a non-zero rm_so does -not imply REG_NOTBOL; REG_STARTEND affects only the location of the string, not -how it is matched. -

      -

      -If the pattern was compiled with the REG_NOSUB flag, no data about any matched -strings is returned. The nmatch and pmatch arguments of -regexec() are ignored. -

      -

      -If the value of nmatch is zero, or if the value pmatch is NULL, -no data about any matched strings is returned. -

      -

      -Otherwise,the portion of the string that was matched, and also any captured -substrings, are returned via the pmatch argument, which points to an -array of nmatch structures of type regmatch_t, containing the -members rm_so and rm_eo. These contain the offset to the first -character of each substring and the offset to the first character after the end -of each substring, respectively. The 0th element of the vector relates to the -entire portion of string that was matched; subsequent elements relate to -the capturing subpatterns of the regular expression. Unused entries in the -array have both structure members set to -1. -

      -

      -A successful match yields a zero return; various error codes are defined in the -header file, of which REG_NOMATCH is the "expected" failure code. -

      -
      ERROR MESSAGES
      -

      -The regerror() function maps a non-zero errorcode from either -regcomp() or regexec() to a printable message. If preg is not -NULL, the error should have arisen from the use of that structure. A message -terminated by a binary zero is placed in errbuf. The length of the -message, including the zero, is limited to errbuf_size. The yield of the -function is the size of buffer needed to hold the whole message. -

      -
      MEMORY USAGE
      -

      -Compiling a regular expression causes memory to be allocated and associated -with the preg structure. The function regfree() frees all such -memory, after which preg may no longer be used as a compiled expression. -

      -
      AUTHOR
      -

      -Philip Hazel -
      -University Computing Service -
      -Cambridge CB2 3QH, England. -
      -

      -
      REVISION
      -

      -Last updated: 09 January 2012 -
      -Copyright © 1997-2012 University of Cambridge. -
      -

      -Return to the PCRE index page. -

      diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcreprecompile.html b/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcreprecompile.html deleted file mode 100644 index decb1d6c..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcreprecompile.html +++ /dev/null @@ -1,163 +0,0 @@ - - -pcreprecompile specification - - -

      pcreprecompile man page

      -

      -Return to the PCRE index page. -

      -

      -This page is part of the PCRE HTML documentation. It was generated automatically -from the original man page. If there is any nonsense in it, please consult the -man page, in case the conversion went wrong. -
      -

      -
      SAVING AND RE-USING PRECOMPILED PCRE PATTERNS
      -

      -If you are running an application that uses a large number of regular -expression patterns, it may be useful to store them in a precompiled form -instead of having to compile them every time the application is run. -If you are not using any private character tables (see the -pcre_maketables() -documentation), this is relatively straightforward. If you are using private -tables, it is a little bit more complicated. However, if you are using the -just-in-time optimization feature, it is not possible to save and reload the -JIT data. -

      -

      -If you save compiled patterns to a file, you can copy them to a different host -and run them there. If the two hosts have different endianness (byte order), -you should run the pcre[16|32]_pattern_to_host_byte_order() function on the -new host before trying to match the pattern. The matching functions return -PCRE_ERROR_BADENDIANNESS if they detect a pattern with the wrong endianness. -

      -

      -Compiling regular expressions with one version of PCRE for use with a different -version is not guaranteed to work and may cause crashes, and saving and -restoring a compiled pattern loses any JIT optimization data. -

      -
      SAVING A COMPILED PATTERN
      -

      -The value returned by pcre[16|32]_compile() points to a single block of -memory that holds the compiled pattern and associated data. You can find the -length of this block in bytes by calling pcre[16|32]_fullinfo() with an -argument of PCRE_INFO_SIZE. You can then save the data in any appropriate -manner. Here is sample code for the 8-bit library that compiles a pattern and -writes it to a file. It assumes that the variable fd refers to a file -that is open for output: -

      -  int erroroffset, rc, size;
      -  char *error;
      -  pcre *re;
      -
      -  re = pcre_compile("my pattern", 0, &error, &erroroffset, NULL);
      -  if (re == NULL) { ... handle errors ... }
      -  rc = pcre_fullinfo(re, NULL, PCRE_INFO_SIZE, &size);
      -  if (rc < 0) { ... handle errors ... }
      -  rc = fwrite(re, 1, size, fd);
      -  if (rc != size) { ... handle errors ... }
      -
      -In this example, the bytes that comprise the compiled pattern are copied -exactly. Note that this is binary data that may contain any of the 256 possible -byte values. On systems that make a distinction between binary and non-binary -data, be sure that the file is opened for binary output. -

      -

      -If you want to write more than one pattern to a file, you will have to devise a -way of separating them. For binary data, preceding each pattern with its length -is probably the most straightforward approach. Another possibility is to write -out the data in hexadecimal instead of binary, one pattern to a line. -

      -

      -Saving compiled patterns in a file is only one possible way of storing them for -later use. They could equally well be saved in a database, or in the memory of -some daemon process that passes them via sockets to the processes that want -them. -

      -

      -If the pattern has been studied, it is also possible to save the normal study -data in a similar way to the compiled pattern itself. However, if the -PCRE_STUDY_JIT_COMPILE was used, the just-in-time data that is created cannot -be saved because it is too dependent on the current environment. When studying -generates additional information, pcre[16|32]_study() returns a pointer to a -pcre[16|32]_extra data block. Its format is defined in the -section on matching a pattern -in the -pcreapi -documentation. The study_data field points to the binary study data, and -this is what you must save (not the pcre[16|32]_extra block itself). The -length of the study data can be obtained by calling pcre[16|32]_fullinfo() -with an argument of PCRE_INFO_STUDYSIZE. Remember to check that -pcre[16|32]_study() did return a non-NULL value before trying to save the -study data. -

      -
      RE-USING A PRECOMPILED PATTERN
      -

      -Re-using a precompiled pattern is straightforward. Having reloaded it into main -memory, called pcre[16|32]_pattern_to_host_byte_order() if necessary, you -pass its pointer to pcre[16|32]_exec() or pcre[16|32]_dfa_exec() in -the usual way. -

      -

      -However, if you passed a pointer to custom character tables when the pattern -was compiled (the tableptr argument of pcre[16|32]_compile()), you -must now pass a similar pointer to pcre[16|32]_exec() or -pcre[16|32]_dfa_exec(), because the value saved with the compiled pattern -will obviously be nonsense. A field in a pcre[16|32]_extra() block is used -to pass this data, as described in the -section on matching a pattern -in the -pcreapi -documentation. -

      -

      -Warning: The tables that pcre_exec() and pcre_dfa_exec() use -must be the same as those that were used when the pattern was compiled. If this -is not the case, the behaviour is undefined. -

      -

      -If you did not provide custom character tables when the pattern was compiled, -the pointer in the compiled pattern is NULL, which causes the matching -functions to use PCRE's internal tables. Thus, you do not need to take any -special action at run time in this case. -

      -

      -If you saved study data with the compiled pattern, you need to create your own -pcre[16|32]_extra data block and set the study_data field to point -to the reloaded study data. You must also set the PCRE_EXTRA_STUDY_DATA bit in -the flags field to indicate that study data is present. Then pass the -pcre[16|32]_extra block to the matching function in the usual way. If the -pattern was studied for just-in-time optimization, that data cannot be saved, -and so is lost by a save/restore cycle. -

      -
      COMPATIBILITY WITH DIFFERENT PCRE RELEASES
      -

      -In general, it is safest to recompile all saved patterns when you update to a -new PCRE release, though not all updates actually require this. -

      -
      AUTHOR
      -

      -Philip Hazel -
      -University Computing Service -
      -Cambridge CB2 3QH, England. -
      -

      -
      REVISION
      -

      -Last updated: 12 November 2013 -
      -Copyright © 1997-2013 University of Cambridge. -
      -

      -Return to the PCRE index page. -

      diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcresample.html b/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcresample.html deleted file mode 100644 index aca9184e..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcresample.html +++ /dev/null @@ -1,110 +0,0 @@ - - -pcresample specification - - -

      pcresample man page

      -

      -Return to the PCRE index page. -

      -

      -This page is part of the PCRE HTML documentation. It was generated automatically -from the original man page. If there is any nonsense in it, please consult the -man page, in case the conversion went wrong. -
      -
      -PCRE SAMPLE PROGRAM -
      -

      -A simple, complete demonstration program, to get you started with using PCRE, -is supplied in the file pcredemo.c in the PCRE distribution. A listing of -this program is given in the -pcredemo -documentation. If you do not have a copy of the PCRE distribution, you can save -this listing to re-create pcredemo.c. -

      -

      -The demonstration program, which uses the original PCRE 8-bit library, compiles -the regular expression that is its first argument, and matches it against the -subject string in its second argument. No PCRE options are set, and default -character tables are used. If matching succeeds, the program outputs the -portion of the subject that matched, together with the contents of any captured -substrings. -

      -

      -If the -g option is given on the command line, the program then goes on to -check for further matches of the same regular expression in the same subject -string. The logic is a little bit tricky because of the possibility of matching -an empty string. Comments in the code explain what is going on. -

      -

      -If PCRE is installed in the standard include and library directories for your -operating system, you should be able to compile the demonstration program using -this command: -

      -  gcc -o pcredemo pcredemo.c -lpcre
      -
      -If PCRE is installed elsewhere, you may need to add additional options to the -command line. For example, on a Unix-like system that has PCRE installed in -/usr/local, you can compile the demonstration program using a command -like this: -
      -  gcc -o pcredemo -I/usr/local/include pcredemo.c -L/usr/local/lib -lpcre
      -
      -In a Windows environment, if you want to statically link the program against a -non-dll pcre.a file, you must uncomment the line that defines PCRE_STATIC -before including pcre.h, because otherwise the pcre_malloc() and -pcre_free() exported functions will be declared -__declspec(dllimport), with unwanted results. -

      -

      -Once you have compiled and linked the demonstration program, you can run simple -tests like this: -

      -  ./pcredemo 'cat|dog' 'the cat sat on the mat'
      -  ./pcredemo -g 'cat|dog' 'the dog sat on the cat'
      -
      -Note that there is a much more comprehensive test program, called -pcretest, -which supports many more facilities for testing regular expressions and both -PCRE libraries. The -pcredemo -program is provided as a simple coding example. -

      -

      -If you try to run -pcredemo -when PCRE is not installed in the standard library directory, you may get an -error like this on some operating systems (e.g. Solaris): -

      -  ld.so.1: a.out: fatal: libpcre.so.0: open failed: No such file or directory
      -
      -This is caused by the way shared library support works on those systems. You -need to add -
      -  -R/usr/local/lib
      -
      -(for example) to the compile command to get round this problem. -

      -
      -AUTHOR -
      -

      -Philip Hazel -
      -University Computing Service -
      -Cambridge CB2 3QH, England. -
      -

      -
      -REVISION -
      -

      -Last updated: 10 January 2012 -
      -Copyright © 1997-2012 University of Cambridge. -
      -

      -Return to the PCRE index page. -

      diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcrestack.html b/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcrestack.html deleted file mode 100644 index af6406d0..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcrestack.html +++ /dev/null @@ -1,225 +0,0 @@ - - -pcrestack specification - - -

      pcrestack man page

      -

      -Return to the PCRE index page. -

      -

      -This page is part of the PCRE HTML documentation. It was generated automatically -from the original man page. If there is any nonsense in it, please consult the -man page, in case the conversion went wrong. -
      -
      -PCRE DISCUSSION OF STACK USAGE -
      -

      -When you call pcre[16|32]_exec(), it makes use of an internal function -called match(). This calls itself recursively at branch points in the -pattern, in order to remember the state of the match so that it can back up and -try a different alternative if the first one fails. As matching proceeds deeper -and deeper into the tree of possibilities, the recursion depth increases. The -match() function is also called in other circumstances, for example, -whenever a parenthesized sub-pattern is entered, and in certain cases of -repetition. -

      -

      -Not all calls of match() increase the recursion depth; for an item such -as a* it may be called several times at the same level, after matching -different numbers of a's. Furthermore, in a number of cases where the result of -the recursive call would immediately be passed back as the result of the -current call (a "tail recursion"), the function is just restarted instead. -

      -

      -The above comments apply when pcre[16|32]_exec() is run in its normal -interpretive manner. If the pattern was studied with the -PCRE_STUDY_JIT_COMPILE option, and just-in-time compiling was successful, and -the options passed to pcre[16|32]_exec() were not incompatible, the matching -process uses the JIT-compiled code instead of the match() function. In -this case, the memory requirements are handled entirely differently. See the -pcrejit -documentation for details. -

      -

      -The pcre[16|32]_dfa_exec() function operates in an entirely different way, -and uses recursion only when there is a regular expression recursion or -subroutine call in the pattern. This includes the processing of assertion and -"once-only" subpatterns, which are handled like subroutine calls. Normally, -these are never very deep, and the limit on the complexity of -pcre[16|32]_dfa_exec() is controlled by the amount of workspace it is given. -However, it is possible to write patterns with runaway infinite recursions; -such patterns will cause pcre[16|32]_dfa_exec() to run out of stack. At -present, there is no protection against this. -

      -

      -The comments that follow do NOT apply to pcre[16|32]_dfa_exec(); they are -relevant only for pcre[16|32]_exec() without the JIT optimization. -

      -
      -Reducing pcre[16|32]_exec()'s stack usage -
      -

      -Each time that match() is actually called recursively, it uses memory -from the process stack. For certain kinds of pattern and data, very large -amounts of stack may be needed, despite the recognition of "tail recursion". -You can often reduce the amount of recursion, and therefore the amount of stack -used, by modifying the pattern that is being matched. Consider, for example, -this pattern: -

      -  ([^<]|<(?!inet))+
      -
      -It matches from wherever it starts until it encounters "<inet" or the end of -the data, and is the kind of pattern that might be used when processing an XML -file. Each iteration of the outer parentheses matches either one character that -is not "<" or a "<" that is not followed by "inet". However, each time a -parenthesis is processed, a recursion occurs, so this formulation uses a stack -frame for each matched character. For a long string, a lot of stack is -required. Consider now this rewritten pattern, which matches exactly the same -strings: -
      -  ([^<]++|<(?!inet))+
      -
      -This uses very much less stack, because runs of characters that do not contain -"<" are "swallowed" in one item inside the parentheses. Recursion happens only -when a "<" character that is not followed by "inet" is encountered (and we -assume this is relatively rare). A possessive quantifier is used to stop any -backtracking into the runs of non-"<" characters, but that is not related to -stack usage. -

      -

      -This example shows that one way of avoiding stack problems when matching long -subject strings is to write repeated parenthesized subpatterns to match more -than one character whenever possible. -

      -
      -Compiling PCRE to use heap instead of stack for pcre[16|32]_exec() -
      -

      -In environments where stack memory is constrained, you might want to compile -PCRE to use heap memory instead of stack for remembering back-up points when -pcre[16|32]_exec() is running. This makes it run a lot more slowly, however. -Details of how to do this are given in the -pcrebuild -documentation. When built in this way, instead of using the stack, PCRE obtains -and frees memory by calling the functions that are pointed to by the -pcre[16|32]_stack_malloc and pcre[16|32]_stack_free variables. By -default, these point to malloc() and free(), but you can replace -the pointers to cause PCRE to use your own functions. Since the block sizes are -always the same, and are always freed in reverse order, it may be possible to -implement customized memory handlers that are more efficient than the standard -functions. -

      -
      -Limiting pcre[16|32]_exec()'s stack usage -
      -

      -You can set limits on the number of times that match() is called, both in -total and recursively. If a limit is exceeded, pcre[16|32]_exec() returns an -error code. Setting suitable limits should prevent it from running out of -stack. The default values of the limits are very large, and unlikely ever to -operate. They can be changed when PCRE is built, and they can also be set when -pcre[16|32]_exec() is called. For details of these interfaces, see the -pcrebuild -documentation and the -section on extra data for pcre[16|32]_exec() -in the -pcreapi -documentation. -

      -

      -As a very rough rule of thumb, you should reckon on about 500 bytes per -recursion. Thus, if you want to limit your stack usage to 8Mb, you should set -the limit at 16000 recursions. A 64Mb stack, on the other hand, can support -around 128000 recursions. -

      -

      -In Unix-like environments, the pcretest test program has a command line -option (-S) that can be used to increase the size of its stack. As long -as the stack is large enough, another option (-M) can be used to find the -smallest limits that allow a particular pattern to match a given subject -string. This is done by calling pcre[16|32]_exec() repeatedly with different -limits. -

      -
      -Obtaining an estimate of stack usage -
      -

      -The actual amount of stack used per recursion can vary quite a lot, depending -on the compiler that was used to build PCRE and the optimization or debugging -options that were set for it. The rule of thumb value of 500 bytes mentioned -above may be larger or smaller than what is actually needed. A better -approximation can be obtained by running this command: -

      -  pcretest -m -C
      -
      -The -C option causes pcretest to output information about the -options with which PCRE was compiled. When -m is also given (before --C), information about stack use is given in a line like this: -
      -  Match recursion uses stack: approximate frame size = 640 bytes
      -
      -The value is approximate because some recursions need a bit more (up to perhaps -16 more bytes). -

      -

      -If the above command is given when PCRE is compiled to use the heap instead of -the stack for recursion, the value that is output is the size of each block -that is obtained from the heap. -

      -
      -Changing stack size in Unix-like systems -
      -

      -In Unix-like environments, there is not often a problem with the stack unless -very long strings are involved, though the default limit on stack size varies -from system to system. Values from 8Mb to 64Mb are common. You can find your -default limit by running the command: -

      -  ulimit -s
      -
      -Unfortunately, the effect of running out of stack is often SIGSEGV, though -sometimes a more explicit error message is given. You can normally increase the -limit on stack size by code such as this: -
      -  struct rlimit rlim;
      -  getrlimit(RLIMIT_STACK, &rlim);
      -  rlim.rlim_cur = 100*1024*1024;
      -  setrlimit(RLIMIT_STACK, &rlim);
      -
      -This reads the current limits (soft and hard) using getrlimit(), then -attempts to increase the soft limit to 100Mb using setrlimit(). You must -do this before calling pcre[16|32]_exec(). -

      -
      -Changing stack size in Mac OS X -
      -

      -Using setrlimit(), as described above, should also work on Mac OS X. It -is also possible to set a stack size when linking a program. There is a -discussion about stack sizes in Mac OS X at this web site: -http://developer.apple.com/qa/qa2005/qa1419.html. -

      -
      -AUTHOR -
      -

      -Philip Hazel -
      -University Computing Service -
      -Cambridge CB2 3QH, England. -
      -

      -
      -REVISION -
      -

      -Last updated: 24 June 2012 -
      -Copyright © 1997-2012 University of Cambridge. -
      -

      -Return to the PCRE index page. -

      diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcresyntax.html b/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcresyntax.html deleted file mode 100644 index 5896b9e0..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcresyntax.html +++ /dev/null @@ -1,561 +0,0 @@ - - -pcresyntax specification - - -

      pcresyntax man page

      -

      -Return to the PCRE index page. -

      -

      -This page is part of the PCRE HTML documentation. It was generated automatically -from the original man page. If there is any nonsense in it, please consult the -man page, in case the conversion went wrong. -
      -

      -
      PCRE REGULAR EXPRESSION SYNTAX SUMMARY
      -

      -The full syntax and semantics of the regular expressions that are supported by -PCRE are described in the -pcrepattern -documentation. This document contains a quick-reference summary of the syntax. -

      -
      QUOTING
      -

      -

      -  \x         where x is non-alphanumeric is a literal x
      -  \Q...\E    treat enclosed characters as literal
      -
      -

      -
      CHARACTERS
      -

      -

      -  \a         alarm, that is, the BEL character (hex 07)
      -  \cx        "control-x", where x is any ASCII character
      -  \e         escape (hex 1B)
      -  \f         form feed (hex 0C)
      -  \n         newline (hex 0A)
      -  \r         carriage return (hex 0D)
      -  \t         tab (hex 09)
      -  \0dd       character with octal code 0dd
      -  \ddd       character with octal code ddd, or backreference
      -  \o{ddd..}  character with octal code ddd..
      -  \xhh       character with hex code hh
      -  \x{hhh..}  character with hex code hhh..
      -
      -Note that \0dd is always an octal code, and that \8 and \9 are the literal -characters "8" and "9". -

      -
      CHARACTER TYPES
      -

      -

      -  .          any character except newline;
      -               in dotall mode, any character whatsoever
      -  \C         one data unit, even in UTF mode (best avoided)
      -  \d         a decimal digit
      -  \D         a character that is not a decimal digit
      -  \h         a horizontal white space character
      -  \H         a character that is not a horizontal white space character
      -  \N         a character that is not a newline
      -  \p{xx}     a character with the xx property
      -  \P{xx}     a character without the xx property
      -  \R         a newline sequence
      -  \s         a white space character
      -  \S         a character that is not a white space character
      -  \v         a vertical white space character
      -  \V         a character that is not a vertical white space character
      -  \w         a "word" character
      -  \W         a "non-word" character
      -  \X         a Unicode extended grapheme cluster
      -
      -By default, \d, \s, and \w match only ASCII characters, even in UTF-8 mode -or in the 16- bit and 32-bit libraries. However, if locale-specific matching is -happening, \s and \w may also match characters with code points in the range -128-255. If the PCRE_UCP option is set, the behaviour of these escape sequences -is changed to use Unicode properties and they match many more characters. -

      -
      GENERAL CATEGORY PROPERTIES FOR \p and \P
      -

      -

      -  C          Other
      -  Cc         Control
      -  Cf         Format
      -  Cn         Unassigned
      -  Co         Private use
      -  Cs         Surrogate
      -
      -  L          Letter
      -  Ll         Lower case letter
      -  Lm         Modifier letter
      -  Lo         Other letter
      -  Lt         Title case letter
      -  Lu         Upper case letter
      -  L&         Ll, Lu, or Lt
      -
      -  M          Mark
      -  Mc         Spacing mark
      -  Me         Enclosing mark
      -  Mn         Non-spacing mark
      -
      -  N          Number
      -  Nd         Decimal number
      -  Nl         Letter number
      -  No         Other number
      -
      -  P          Punctuation
      -  Pc         Connector punctuation
      -  Pd         Dash punctuation
      -  Pe         Close punctuation
      -  Pf         Final punctuation
      -  Pi         Initial punctuation
      -  Po         Other punctuation
      -  Ps         Open punctuation
      -
      -  S          Symbol
      -  Sc         Currency symbol
      -  Sk         Modifier symbol
      -  Sm         Mathematical symbol
      -  So         Other symbol
      -
      -  Z          Separator
      -  Zl         Line separator
      -  Zp         Paragraph separator
      -  Zs         Space separator
      -
      -

      -
      PCRE SPECIAL CATEGORY PROPERTIES FOR \p and \P
      -

      -

      -  Xan        Alphanumeric: union of properties L and N
      -  Xps        POSIX space: property Z or tab, NL, VT, FF, CR
      -  Xsp        Perl space: property Z or tab, NL, VT, FF, CR
      -  Xuc        Univerally-named character: one that can be
      -               represented by a Universal Character Name
      -  Xwd        Perl word: property Xan or underscore
      -
      -Perl and POSIX space are now the same. Perl added VT to its space character set -at release 5.18 and PCRE changed at release 8.34. -

      -
      SCRIPT NAMES FOR \p AND \P
      -

      -Arabic, -Armenian, -Avestan, -Balinese, -Bamum, -Bassa_Vah, -Batak, -Bengali, -Bopomofo, -Brahmi, -Braille, -Buginese, -Buhid, -Canadian_Aboriginal, -Carian, -Caucasian_Albanian, -Chakma, -Cham, -Cherokee, -Common, -Coptic, -Cuneiform, -Cypriot, -Cyrillic, -Deseret, -Devanagari, -Duployan, -Egyptian_Hieroglyphs, -Elbasan, -Ethiopic, -Georgian, -Glagolitic, -Gothic, -Grantha, -Greek, -Gujarati, -Gurmukhi, -Han, -Hangul, -Hanunoo, -Hebrew, -Hiragana, -Imperial_Aramaic, -Inherited, -Inscriptional_Pahlavi, -Inscriptional_Parthian, -Javanese, -Kaithi, -Kannada, -Katakana, -Kayah_Li, -Kharoshthi, -Khmer, -Khojki, -Khudawadi, -Lao, -Latin, -Lepcha, -Limbu, -Linear_A, -Linear_B, -Lisu, -Lycian, -Lydian, -Mahajani, -Malayalam, -Mandaic, -Manichaean, -Meetei_Mayek, -Mende_Kikakui, -Meroitic_Cursive, -Meroitic_Hieroglyphs, -Miao, -Modi, -Mongolian, -Mro, -Myanmar, -Nabataean, -New_Tai_Lue, -Nko, -Ogham, -Ol_Chiki, -Old_Italic, -Old_North_Arabian, -Old_Permic, -Old_Persian, -Old_South_Arabian, -Old_Turkic, -Oriya, -Osmanya, -Pahawh_Hmong, -Palmyrene, -Pau_Cin_Hau, -Phags_Pa, -Phoenician, -Psalter_Pahlavi, -Rejang, -Runic, -Samaritan, -Saurashtra, -Sharada, -Shavian, -Siddham, -Sinhala, -Sora_Sompeng, -Sundanese, -Syloti_Nagri, -Syriac, -Tagalog, -Tagbanwa, -Tai_Le, -Tai_Tham, -Tai_Viet, -Takri, -Tamil, -Telugu, -Thaana, -Thai, -Tibetan, -Tifinagh, -Tirhuta, -Ugaritic, -Vai, -Warang_Citi, -Yi. -

      -
      CHARACTER CLASSES
      -

      -

      -  [...]       positive character class
      -  [^...]      negative character class
      -  [x-y]       range (can be used for hex characters)
      -  [[:xxx:]]   positive POSIX named set
      -  [[:^xxx:]]  negative POSIX named set
      -
      -  alnum       alphanumeric
      -  alpha       alphabetic
      -  ascii       0-127
      -  blank       space or tab
      -  cntrl       control character
      -  digit       decimal digit
      -  graph       printing, excluding space
      -  lower       lower case letter
      -  print       printing, including space
      -  punct       printing, excluding alphanumeric
      -  space       white space
      -  upper       upper case letter
      -  word        same as \w
      -  xdigit      hexadecimal digit
      -
      -In PCRE, POSIX character set names recognize only ASCII characters by default, -but some of them use Unicode properties if PCRE_UCP is set. You can use -\Q...\E inside a character class. -

      -
      QUANTIFIERS
      -

      -

      -  ?           0 or 1, greedy
      -  ?+          0 or 1, possessive
      -  ??          0 or 1, lazy
      -  *           0 or more, greedy
      -  *+          0 or more, possessive
      -  *?          0 or more, lazy
      -  +           1 or more, greedy
      -  ++          1 or more, possessive
      -  +?          1 or more, lazy
      -  {n}         exactly n
      -  {n,m}       at least n, no more than m, greedy
      -  {n,m}+      at least n, no more than m, possessive
      -  {n,m}?      at least n, no more than m, lazy
      -  {n,}        n or more, greedy
      -  {n,}+       n or more, possessive
      -  {n,}?       n or more, lazy
      -
      -

      -
      ANCHORS AND SIMPLE ASSERTIONS
      -

      -

      -  \b          word boundary
      -  \B          not a word boundary
      -  ^           start of subject
      -               also after internal newline in multiline mode
      -  \A          start of subject
      -  $           end of subject
      -               also before newline at end of subject
      -               also before internal newline in multiline mode
      -  \Z          end of subject
      -               also before newline at end of subject
      -  \z          end of subject
      -  \G          first matching position in subject
      -
      -

      -
      MATCH POINT RESET
      -

      -

      -  \K          reset start of match
      -
      -\K is honoured in positive assertions, but ignored in negative ones. -

      -
      ALTERNATION
      -

      -

      -  expr|expr|expr...
      -
      -

      -
      CAPTURING
      -

      -

      -  (...)           capturing group
      -  (?<name>...)    named capturing group (Perl)
      -  (?'name'...)    named capturing group (Perl)
      -  (?P<name>...)   named capturing group (Python)
      -  (?:...)         non-capturing group
      -  (?|...)         non-capturing group; reset group numbers for
      -                   capturing groups in each alternative
      -
      -

      -
      ATOMIC GROUPS
      -

      -

      -  (?>...)         atomic, non-capturing group
      -
      -

      -
      COMMENT
      -

      -

      -  (?#....)        comment (not nestable)
      -
      -

      -
      OPTION SETTING
      -

      -

      -  (?i)            caseless
      -  (?J)            allow duplicate names
      -  (?m)            multiline
      -  (?s)            single line (dotall)
      -  (?U)            default ungreedy (lazy)
      -  (?x)            extended (ignore white space)
      -  (?-...)         unset option(s)
      -
      -The following are recognized only at the very start of a pattern or after one -of the newline or \R options with similar syntax. More than one of them may -appear. -
      -  (*LIMIT_MATCH=d) set the match limit to d (decimal number)
      -  (*LIMIT_RECURSION=d) set the recursion limit to d (decimal number)
      -  (*NO_AUTO_POSSESS) no auto-possessification (PCRE_NO_AUTO_POSSESS)
      -  (*NO_START_OPT) no start-match optimization (PCRE_NO_START_OPTIMIZE)
      -  (*UTF8)         set UTF-8 mode: 8-bit library (PCRE_UTF8)
      -  (*UTF16)        set UTF-16 mode: 16-bit library (PCRE_UTF16)
      -  (*UTF32)        set UTF-32 mode: 32-bit library (PCRE_UTF32)
      -  (*UTF)          set appropriate UTF mode for the library in use
      -  (*UCP)          set PCRE_UCP (use Unicode properties for \d etc)
      -
      -Note that LIMIT_MATCH and LIMIT_RECURSION can only reduce the value of the -limits set by the caller of pcre_exec(), not increase them. -

      -
      NEWLINE CONVENTION
      -

      -These are recognized only at the very start of the pattern or after option -settings with a similar syntax. -

      -  (*CR)           carriage return only
      -  (*LF)           linefeed only
      -  (*CRLF)         carriage return followed by linefeed
      -  (*ANYCRLF)      all three of the above
      -  (*ANY)          any Unicode newline sequence
      -
      -

      -
      WHAT \R MATCHES
      -

      -These are recognized only at the very start of the pattern or after option -setting with a similar syntax. -

      -  (*BSR_ANYCRLF)  CR, LF, or CRLF
      -  (*BSR_UNICODE)  any Unicode newline sequence
      -
      -

      -
      LOOKAHEAD AND LOOKBEHIND ASSERTIONS
      -

      -

      -  (?=...)         positive look ahead
      -  (?!...)         negative look ahead
      -  (?<=...)        positive look behind
      -  (?<!...)        negative look behind
      -
      -Each top-level branch of a look behind must be of a fixed length. -

      -
      BACKREFERENCES
      -

      -

      -  \n              reference by number (can be ambiguous)
      -  \gn             reference by number
      -  \g{n}           reference by number
      -  \g{-n}          relative reference by number
      -  \k<name>        reference by name (Perl)
      -  \k'name'        reference by name (Perl)
      -  \g{name}        reference by name (Perl)
      -  \k{name}        reference by name (.NET)
      -  (?P=name)       reference by name (Python)
      -
      -

      -
      SUBROUTINE REFERENCES (POSSIBLY RECURSIVE)
      -

      -

      -  (?R)            recurse whole pattern
      -  (?n)            call subpattern by absolute number
      -  (?+n)           call subpattern by relative number
      -  (?-n)           call subpattern by relative number
      -  (?&name)        call subpattern by name (Perl)
      -  (?P>name)       call subpattern by name (Python)
      -  \g<name>        call subpattern by name (Oniguruma)
      -  \g'name'        call subpattern by name (Oniguruma)
      -  \g<n>           call subpattern by absolute number (Oniguruma)
      -  \g'n'           call subpattern by absolute number (Oniguruma)
      -  \g<+n>          call subpattern by relative number (PCRE extension)
      -  \g'+n'          call subpattern by relative number (PCRE extension)
      -  \g<-n>          call subpattern by relative number (PCRE extension)
      -  \g'-n'          call subpattern by relative number (PCRE extension)
      -
      -

      -
      CONDITIONAL PATTERNS
      -

      -

      -  (?(condition)yes-pattern)
      -  (?(condition)yes-pattern|no-pattern)
      -
      -  (?(n)...        absolute reference condition
      -  (?(+n)...       relative reference condition
      -  (?(-n)...       relative reference condition
      -  (?(<name>)...   named reference condition (Perl)
      -  (?('name')...   named reference condition (Perl)
      -  (?(name)...     named reference condition (PCRE)
      -  (?(R)...        overall recursion condition
      -  (?(Rn)...       specific group recursion condition
      -  (?(R&name)...   specific recursion condition
      -  (?(DEFINE)...   define subpattern for reference
      -  (?(assert)...   assertion condition
      -
      -

      -
      BACKTRACKING CONTROL
      -

      -The following act immediately they are reached: -

      -  (*ACCEPT)       force successful match
      -  (*FAIL)         force backtrack; synonym (*F)
      -  (*MARK:NAME)    set name to be passed back; synonym (*:NAME)
      -
      -The following act only when a subsequent match failure causes a backtrack to -reach them. They all force a match failure, but they differ in what happens -afterwards. Those that advance the start-of-match point do so only if the -pattern is not anchored. -
      -  (*COMMIT)       overall failure, no advance of starting point
      -  (*PRUNE)        advance to next starting character
      -  (*PRUNE:NAME)   equivalent to (*MARK:NAME)(*PRUNE)
      -  (*SKIP)         advance to current matching position
      -  (*SKIP:NAME)    advance to position corresponding to an earlier
      -                  (*MARK:NAME); if not found, the (*SKIP) is ignored
      -  (*THEN)         local failure, backtrack to next alternation
      -  (*THEN:NAME)    equivalent to (*MARK:NAME)(*THEN)
      -
      -

      -
      CALLOUTS
      -

      -

      -  (?C)      callout
      -  (?Cn)     callout with data n
      -
      -

      -
      SEE ALSO
      -

      -pcrepattern(3), pcreapi(3), pcrecallout(3), -pcrematching(3), pcre(3). -

      -
      AUTHOR
      -

      -Philip Hazel -
      -University Computing Service -
      -Cambridge CB2 3QH, England. -
      -

      -
      REVISION
      -

      -Last updated: 08 January 2014 -
      -Copyright © 1997-2014 University of Cambridge. -
      -

      -Return to the PCRE index page. -

      diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcretest.html b/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcretest.html deleted file mode 100644 index ba540d3c..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcretest.html +++ /dev/null @@ -1,1163 +0,0 @@ - - -pcretest specification - - -

      pcretest man page

      -

      -Return to the PCRE index page. -

      -

      -This page is part of the PCRE HTML documentation. It was generated automatically -from the original man page. If there is any nonsense in it, please consult the -man page, in case the conversion went wrong. -
      -

      -
      SYNOPSIS
      -

      -pcretest [options] [input file [output file]] -
      -
      -pcretest was written as a test program for the PCRE regular expression -library itself, but it can also be used for experimenting with regular -expressions. This document describes the features of the test program; for -details of the regular expressions themselves, see the -pcrepattern -documentation. For details of the PCRE library function calls and their -options, see the -pcreapi -, -pcre16 -and -pcre32 -documentation. -

      -

      -The input for pcretest is a sequence of regular expression patterns and -strings to be matched, as described below. The output shows the result of each -match. Options on the command line and the patterns control PCRE options and -exactly what is output. -

      -

      -As PCRE has evolved, it has acquired many different features, and as a result, -pcretest now has rather a lot of obscure options for testing every -possible feature. Some of these options are specifically designed for use in -conjunction with the test script and data files that are distributed as part of -PCRE, and are unlikely to be of use otherwise. They are all documented here, -but without much justification. -

      -
      INPUT DATA FORMAT
      -

      -Input to pcretest is processed line by line, either by calling the C -library's fgets() function, or via the libreadline library (see -below). In Unix-like environments, fgets() treats any bytes other than -newline as data characters. However, in some Windows environments character 26 -(hex 1A) causes an immediate end of file, and no further data is read. For -maximum portability, therefore, it is safest to use only ASCII characters in -pcretest input files. -

      -

      -The input is processed using using C's string functions, so must not -contain binary zeroes, even though in Unix-like environments, fgets() -treats any bytes other than newline as data characters. -

      -
      PCRE's 8-BIT, 16-BIT AND 32-BIT LIBRARIES
      -

      -From release 8.30, two separate PCRE libraries can be built. The original one -supports 8-bit character strings, whereas the newer 16-bit library supports -character strings encoded in 16-bit units. From release 8.32, a third library -can be built, supporting character strings encoded in 32-bit units. The -pcretest program can be used to test all three libraries. However, it is -itself still an 8-bit program, reading 8-bit input and writing 8-bit output. -When testing the 16-bit or 32-bit library, the patterns and data strings are -converted to 16- or 32-bit format before being passed to the PCRE library -functions. Results are converted to 8-bit for output. -

      -

      -References to functions and structures of the form pcre[16|32]_xx below -mean "pcre_xx when using the 8-bit library, pcre16_xx when using -the 16-bit library, or pcre32_xx when using the 32-bit library". -

      -
      COMMAND LINE OPTIONS
      -

      --8 -If both the 8-bit library has been built, this option causes the 8-bit library -to be used (which is the default); if the 8-bit library has not been built, -this option causes an error. -

      -

      --16 -If both the 8-bit or the 32-bit, and the 16-bit libraries have been built, this -option causes the 16-bit library to be used. If only the 16-bit library has been -built, this is the default (so has no effect). If only the 8-bit or the 32-bit -library has been built, this option causes an error. -

      -

      --32 -If both the 8-bit or the 16-bit, and the 32-bit libraries have been built, this -option causes the 32-bit library to be used. If only the 32-bit library has been -built, this is the default (so has no effect). If only the 8-bit or the 16-bit -library has been built, this option causes an error. -

      -

      --b -Behave as if each pattern has the /B (show byte code) modifier; the -internal form is output after compilation. -

      -

      --C -Output the version number of the PCRE library, and all available information -about the optional features that are included, and then exit with zero exit -code. All other options are ignored. -

      -

      --C option -Output information about a specific build-time option, then exit. This -functionality is intended for use in scripts such as RunTest. The -following options output the value and set the exit code as indicated: -

      -  ebcdic-nl  the code for LF (= NL) in an EBCDIC environment:
      -               0x15 or 0x25
      -               0 if used in an ASCII environment
      -               exit code is always 0
      -  linksize   the configured internal link size (2, 3, or 4)
      -               exit code is set to the link size
      -  newline    the default newline setting:
      -               CR, LF, CRLF, ANYCRLF, or ANY
      -               exit code is always 0
      -  bsr        the default setting for what \R matches:
      -               ANYCRLF or ANY
      -               exit code is always 0
      -
      -The following options output 1 for true or 0 for false, and set the exit code -to the same value: -
      -  ebcdic     compiled for an EBCDIC environment
      -  jit        just-in-time support is available
      -  pcre16     the 16-bit library was built
      -  pcre32     the 32-bit library was built
      -  pcre8      the 8-bit library was built
      -  ucp        Unicode property support is available
      -  utf        UTF-8 and/or UTF-16 and/or UTF-32 support
      -               is available
      -
      -If an unknown option is given, an error message is output; the exit code is 0. -

      -

      --d -Behave as if each pattern has the /D (debug) modifier; the internal -form and information about the compiled pattern is output after compilation; --d is equivalent to -b -i. -

      -

      --dfa -Behave as if each data line contains the \D escape sequence; this causes the -alternative matching function, pcre[16|32]_dfa_exec(), to be used instead -of the standard pcre[16|32]_exec() function (more detail is given below). -

      -

      --help -Output a brief summary these options and then exit. -

      -

      --i -Behave as if each pattern has the /I modifier; information about the -compiled pattern is given after compilation. -

      -

      --M -Behave as if each data line contains the \M escape sequence; this causes -PCRE to discover the minimum MATCH_LIMIT and MATCH_LIMIT_RECURSION settings by -calling pcre[16|32]_exec() repeatedly with different limits. -

      -

      --m -Output the size of each compiled pattern after it has been compiled. This is -equivalent to adding /M to each regular expression. The size is given in -bytes for both libraries. -

      -

      --O -Behave as if each pattern has the /O modifier, that is disable -auto-possessification for all patterns. -

      -

      --o osize -Set the number of elements in the output vector that is used when calling -pcre[16|32]_exec() or pcre[16|32]_dfa_exec() to be osize. The -default value is 45, which is enough for 14 capturing subexpressions for -pcre[16|32]_exec() or 22 different matches for -pcre[16|32]_dfa_exec(). -The vector size can be changed for individual matching calls by including \O -in the data line (see below). -

      -

      --p -Behave as if each pattern has the /P modifier; the POSIX wrapper API is -used to call PCRE. None of the other options has any effect when -p is -set. This option can be used only with the 8-bit library. -

      -

      --q -Do not output the version number of pcretest at the start of execution. -

      -

      --S size -On Unix-like systems, set the size of the run-time stack to size -megabytes. -

      -

      --s or -s+ -Behave as if each pattern has the /S modifier; in other words, force each -pattern to be studied. If -s+ is used, all the JIT compile options are -passed to pcre[16|32]_study(), causing just-in-time optimization to be set -up if it is available, for both full and partial matching. Specific JIT compile -options can be selected by following -s+ with a digit in the range 1 to -7, which selects the JIT compile modes as follows: -

      -  1  normal match only
      -  2  soft partial match only
      -  3  normal match and soft partial match
      -  4  hard partial match only
      -  6  soft and hard partial match
      -  7  all three modes (default)
      -
      -If -s++ is used instead of -s+ (with or without a following digit), -the text "(JIT)" is added to the first output line after a match or no match -when JIT-compiled code was actually used. -
      -
      -Note that there are pattern options that can override -s, either -specifying no studying at all, or suppressing JIT compilation. -
      -
      -If the /I or /D option is present on a pattern (requesting output -about the compiled pattern), information about the result of studying is not -included when studying is caused only by -s and neither -i nor --d is present on the command line. This behaviour means that the output -from tests that are run with and without -s should be identical, except -when options that output information about the actual running of a match are -set. -
      -
      -The -M, -t, and -tm options, which give information about -resources used, are likely to produce different output with and without --s. Output may also differ if the /C option is present on an -individual pattern. This uses callouts to trace the the matching process, and -this may be different between studied and non-studied patterns. If the pattern -contains (*MARK) items there may also be differences, for the same reason. The --s command line option can be overridden for specific patterns that -should never be studied (see the /S pattern modifier below). -

      -

      --t -Run each compile, study, and match many times with a timer, and output the -resulting times per compile, study, or match (in milliseconds). Do not set --m with -t, because you will then get the size output a zillion -times, and the timing will be distorted. You can control the number of -iterations that are used for timing by following -t with a number (as a -separate item on the command line). For example, "-t 1000" iterates 1000 times. -The default is to iterate 500000 times. -

      -

      --tm -This is like -t except that it times only the matching phase, not the -compile or study phases. -

      -

      --T -TM -These behave like -t and -tm, but in addition, at the end of a run, -the total times for all compiles, studies, and matches are output. -

      -
      DESCRIPTION
      -

      -If pcretest is given two filename arguments, it reads from the first and -writes to the second. If it is given only one filename argument, it reads from -that file and writes to stdout. Otherwise, it reads from stdin and writes to -stdout, and prompts for each line of input, using "re>" to prompt for regular -expressions, and "data>" to prompt for data lines. -

      -

      -When pcretest is built, a configuration option can specify that it should -be linked with the libreadline library. When this is done, if the input -is from a terminal, it is read using the readline() function. This -provides line-editing and history facilities. The output from the -help -option states whether or not readline() will be used. -

      -

      -The program handles any number of sets of input on a single input file. Each -set starts with a regular expression, and continues with any number of data -lines to be matched against that pattern. -

      -

      -Each data line is matched separately and independently. If you want to do -multi-line matches, you have to use the \n escape sequence (or \r or \r\n, -etc., depending on the newline setting) in a single line of input to encode the -newline sequences. There is no limit on the length of data lines; the input -buffer is automatically extended if it is too small. -

      -

      -An empty line signals the end of the data lines, at which point a new regular -expression is read. The regular expressions are given enclosed in any -non-alphanumeric delimiters other than backslash, for example: -

      -  /(a|bc)x+yz/
      -
      -White space before the initial delimiter is ignored. A regular expression may -be continued over several input lines, in which case the newline characters are -included within it. It is possible to include the delimiter within the pattern -by escaping it, for example -
      -  /abc\/def/
      -
      -If you do so, the escape and the delimiter form part of the pattern, but since -delimiters are always non-alphanumeric, this does not affect its interpretation. -If the terminating delimiter is immediately followed by a backslash, for -example, -
      -  /abc/\
      -
      -then a backslash is added to the end of the pattern. This is done to provide a -way of testing the error condition that arises if a pattern finishes with a -backslash, because -
      -  /abc\/
      -
      -is interpreted as the first line of a pattern that starts with "abc/", causing -pcretest to read the next line as a continuation of the regular expression. -

      -
      PATTERN MODIFIERS
      -

      -A pattern may be followed by any number of modifiers, which are mostly single -characters, though some of these can be qualified by further characters. -Following Perl usage, these are referred to below as, for example, "the -/i modifier", even though the delimiter of the pattern need not always be -a slash, and no slash is used when writing modifiers. White space may appear -between the final pattern delimiter and the first modifier, and between the -modifiers themselves. For reference, here is a complete list of modifiers. They -fall into several groups that are described in detail in the following -sections. -

      -  /8              set UTF mode
      -  /9              set PCRE_NEVER_UTF (locks out UTF mode)
      -  /?              disable UTF validity check
      -  /+              show remainder of subject after match
      -  /=              show all captures (not just those that are set)
      -
      -  /A              set PCRE_ANCHORED
      -  /B              show compiled code
      -  /C              set PCRE_AUTO_CALLOUT
      -  /D              same as /B plus /I
      -  /E              set PCRE_DOLLAR_ENDONLY
      -  /F              flip byte order in compiled pattern
      -  /f              set PCRE_FIRSTLINE
      -  /G              find all matches (shorten string)
      -  /g              find all matches (use startoffset)
      -  /I              show information about pattern
      -  /i              set PCRE_CASELESS
      -  /J              set PCRE_DUPNAMES
      -  /K              show backtracking control names
      -  /L              set locale
      -  /M              show compiled memory size
      -  /m              set PCRE_MULTILINE
      -  /N              set PCRE_NO_AUTO_CAPTURE
      -  /O              set PCRE_NO_AUTO_POSSESS
      -  /P              use the POSIX wrapper
      -  /Q              test external stack check function
      -  /S              study the pattern after compilation
      -  /s              set PCRE_DOTALL
      -  /T              select character tables
      -  /U              set PCRE_UNGREEDY
      -  /W              set PCRE_UCP
      -  /X              set PCRE_EXTRA
      -  /x              set PCRE_EXTENDED
      -  /Y              set PCRE_NO_START_OPTIMIZE
      -  /Z              don't show lengths in /B output
      -
      -  /<any>          set PCRE_NEWLINE_ANY
      -  /<anycrlf>      set PCRE_NEWLINE_ANYCRLF
      -  /<cr>           set PCRE_NEWLINE_CR
      -  /<crlf>         set PCRE_NEWLINE_CRLF
      -  /<lf>           set PCRE_NEWLINE_LF
      -  /<bsr_anycrlf>  set PCRE_BSR_ANYCRLF
      -  /<bsr_unicode>  set PCRE_BSR_UNICODE
      -  /<JS>           set PCRE_JAVASCRIPT_COMPAT
      -
      -
      -

      -
      -Perl-compatible modifiers -
      -

      -The /i, /m, /s, and /x modifiers set the PCRE_CASELESS, -PCRE_MULTILINE, PCRE_DOTALL, or PCRE_EXTENDED options, respectively, when -pcre[16|32]_compile() is called. These four modifier letters have the same -effect as they do in Perl. For example: -

      -  /caseless/i
      -
      -
      -

      -
      -Modifiers for other PCRE options -
      -

      -The following table shows additional modifiers for setting PCRE compile-time -options that do not correspond to anything in Perl: -

      -  /8              PCRE_UTF8           ) when using the 8-bit
      -  /?              PCRE_NO_UTF8_CHECK  )   library
      -
      -  /8              PCRE_UTF16          ) when using the 16-bit
      -  /?              PCRE_NO_UTF16_CHECK )   library
      -
      -  /8              PCRE_UTF32          ) when using the 32-bit
      -  /?              PCRE_NO_UTF32_CHECK )   library
      -
      -  /9              PCRE_NEVER_UTF
      -  /A              PCRE_ANCHORED
      -  /C              PCRE_AUTO_CALLOUT
      -  /E              PCRE_DOLLAR_ENDONLY
      -  /f              PCRE_FIRSTLINE
      -  /J              PCRE_DUPNAMES
      -  /N              PCRE_NO_AUTO_CAPTURE
      -  /O              PCRE_NO_AUTO_POSSESS
      -  /U              PCRE_UNGREEDY
      -  /W              PCRE_UCP
      -  /X              PCRE_EXTRA
      -  /Y              PCRE_NO_START_OPTIMIZE
      -  /<any>          PCRE_NEWLINE_ANY
      -  /<anycrlf>      PCRE_NEWLINE_ANYCRLF
      -  /<cr>           PCRE_NEWLINE_CR
      -  /<crlf>         PCRE_NEWLINE_CRLF
      -  /<lf>           PCRE_NEWLINE_LF
      -  /<bsr_anycrlf>  PCRE_BSR_ANYCRLF
      -  /<bsr_unicode>  PCRE_BSR_UNICODE
      -  /<JS>           PCRE_JAVASCRIPT_COMPAT
      -
      -The modifiers that are enclosed in angle brackets are literal strings as shown, -including the angle brackets, but the letters within can be in either case. -This example sets multiline matching with CRLF as the line ending sequence: -
      -  /^abc/m<CRLF>
      -
      -As well as turning on the PCRE_UTF8/16/32 option, the /8 modifier causes -all non-printing characters in output strings to be printed using the -\x{hh...} notation. Otherwise, those less than 0x100 are output in hex without -the curly brackets. -

      -

      -Full details of the PCRE options are given in the -pcreapi -documentation. -

      -
      -Finding all matches in a string -
      -

      -Searching for all possible matches within each subject string can be requested -by the /g or /G modifier. After finding a match, PCRE is called -again to search the remainder of the subject string. The difference between -/g and /G is that the former uses the startoffset argument to -pcre[16|32]_exec() to start searching at a new point within the entire -string (which is in effect what Perl does), whereas the latter passes over a -shortened substring. This makes a difference to the matching process if the -pattern begins with a lookbehind assertion (including \b or \B). -

      -

      -If any call to pcre[16|32]_exec() in a /g or /G sequence matches -an empty string, the next call is done with the PCRE_NOTEMPTY_ATSTART and -PCRE_ANCHORED flags set in order to search for another, non-empty, match at the -same point. If this second match fails, the start offset is advanced, and the -normal match is retried. This imitates the way Perl handles such cases when -using the /g modifier or the split() function. Normally, the start -offset is advanced by one character, but if the newline convention recognizes -CRLF as a newline, and the current character is CR followed by LF, an advance -of two is used. -

      -
      -Other modifiers -
      -

      -There are yet more modifiers for controlling the way pcretest -operates. -

      -

      -The /+ modifier requests that as well as outputting the substring that -matched the entire pattern, pcretest should in addition output the -remainder of the subject string. This is useful for tests where the subject -contains multiple copies of the same substring. If the + modifier appears -twice, the same action is taken for captured substrings. In each case the -remainder is output on the following line with a plus character following the -capture number. Note that this modifier must not immediately follow the /S -modifier because /S+ and /S++ have other meanings. -

      -

      -The /= modifier requests that the values of all potential captured -parentheses be output after a match. By default, only those up to the highest -one actually used in the match are output (corresponding to the return code -from pcre[16|32]_exec()). Values in the offsets vector corresponding to -higher numbers should be set to -1, and these are output as "<unset>". This -modifier gives a way of checking that this is happening. -

      -

      -The /B modifier is a debugging feature. It requests that pcretest -output a representation of the compiled code after compilation. Normally this -information contains length and offset values; however, if /Z is also -present, this data is replaced by spaces. This is a special feature for use in -the automatic test scripts; it ensures that the same output is generated for -different internal link sizes. -

      -

      -The /D modifier is a PCRE debugging feature, and is equivalent to -/BI, that is, both the /B and the /I modifiers. -

      -

      -The /F modifier causes pcretest to flip the byte order of the -2-byte and 4-byte fields in the compiled pattern. This facility is for testing -the feature in PCRE that allows it to execute patterns that were compiled on a -host with a different endianness. This feature is not available when the POSIX -interface to PCRE is being used, that is, when the /P pattern modifier is -specified. See also the section about saving and reloading compiled patterns -below. -

      -

      -The /I modifier requests that pcretest output information about the -compiled pattern (whether it is anchored, has a fixed first character, and -so on). It does this by calling pcre[16|32]_fullinfo() after compiling a -pattern. If the pattern is studied, the results of that are also output. In -this output, the word "char" means a non-UTF character, that is, the value of a -single data item (8-bit, 16-bit, or 32-bit, depending on the library that is -being tested). -

      -

      -The /K modifier requests pcretest to show names from backtracking -control verbs that are returned from calls to pcre[16|32]_exec(). It causes -pcretest to create a pcre[16|32]_extra block if one has not already -been created by a call to pcre[16|32]_study(), and to set the -PCRE_EXTRA_MARK flag and the mark field within it, every time that -pcre[16|32]_exec() is called. If the variable that the mark field -points to is non-NULL for a match, non-match, or partial match, pcretest -prints the string to which it points. For a match, this is shown on a line by -itself, tagged with "MK:". For a non-match it is added to the message. -

      -

      -The /L modifier must be followed directly by the name of a locale, for -example, -

      -  /pattern/Lfr_FR
      -
      -For this reason, it must be the last modifier. The given locale is set, -pcre[16|32]_maketables() is called to build a set of character tables for -the locale, and this is then passed to pcre[16|32]_compile() when compiling -the regular expression. Without an /L (or /T) modifier, NULL is -passed as the tables pointer; that is, /L applies only to the expression -on which it appears. -

      -

      -The /M modifier causes the size in bytes of the memory block used to hold -the compiled pattern to be output. This does not include the size of the -pcre[16|32] block; it is just the actual compiled data. If the pattern is -successfully studied with the PCRE_STUDY_JIT_COMPILE option, the size of the -JIT compiled code is also output. -

      -

      -The /Q modifier is used to test the use of pcre_stack_guard. It -must be followed by '0' or '1', specifying the return code to be given from an -external function that is passed to PCRE and used for stack checking during -compilation (see the -pcreapi -documentation for details). -

      -

      -The /S modifier causes pcre[16|32]_study() to be called after the -expression has been compiled, and the results used when the expression is -matched. There are a number of qualifying characters that may follow /S. -They may appear in any order. -

      -

      -If /S is followed by an exclamation mark, pcre[16|32]_study() is -called with the PCRE_STUDY_EXTRA_NEEDED option, causing it always to return a -pcre_extra block, even when studying discovers no useful information. -

      -

      -If /S is followed by a second S character, it suppresses studying, even -if it was requested externally by the -s command line option. This makes -it possible to specify that certain patterns are always studied, and others are -never studied, independently of -s. This feature is used in the test -files in a few cases where the output is different when the pattern is studied. -

      -

      -If the /S modifier is followed by a + character, the call to -pcre[16|32]_study() is made with all the JIT study options, requesting -just-in-time optimization support if it is available, for both normal and -partial matching. If you want to restrict the JIT compiling modes, you can -follow /S+ with a digit in the range 1 to 7: -

      -  1  normal match only
      -  2  soft partial match only
      -  3  normal match and soft partial match
      -  4  hard partial match only
      -  6  soft and hard partial match
      -  7  all three modes (default)
      -
      -If /S++ is used instead of /S+ (with or without a following digit), -the text "(JIT)" is added to the first output line after a match or no match -when JIT-compiled code was actually used. -

      -

      -Note that there is also an independent /+ modifier; it must not be given -immediately after /S or /S+ because this will be misinterpreted. -

      -

      -If JIT studying is successful, the compiled JIT code will automatically be used -when pcre[16|32]_exec() is run, except when incompatible run-time options -are specified. For more details, see the -pcrejit -documentation. See also the \J escape sequence below for a way of -setting the size of the JIT stack. -

      -

      -Finally, if /S is followed by a minus character, JIT compilation is -suppressed, even if it was requested externally by the -s command line -option. This makes it possible to specify that JIT is never to be used for -certain patterns. -

      -

      -The /T modifier must be followed by a single digit. It causes a specific -set of built-in character tables to be passed to pcre[16|32]_compile(). It -is used in the standard PCRE tests to check behaviour with different character -tables. The digit specifies the tables as follows: -

      -  0   the default ASCII tables, as distributed in
      -        pcre_chartables.c.dist
      -  1   a set of tables defining ISO 8859 characters
      -
      -In table 1, some characters whose codes are greater than 128 are identified as -letters, digits, spaces, etc. -

      -
      -Using the POSIX wrapper API -
      -

      -The /P modifier causes pcretest to call PCRE via the POSIX wrapper -API rather than its native API. This supports only the 8-bit library. When -/P is set, the following modifiers set options for the regcomp() -function: -

      -  /i    REG_ICASE
      -  /m    REG_NEWLINE
      -  /N    REG_NOSUB
      -  /s    REG_DOTALL     )
      -  /U    REG_UNGREEDY   ) These options are not part of
      -  /W    REG_UCP        )   the POSIX standard
      -  /8    REG_UTF8       )
      -
      -The /+ modifier works as described above. All other modifiers are -ignored. -

      -
      -Locking out certain modifiers -
      -

      -PCRE can be compiled with or without support for certain features such as -UTF-8/16/32 or Unicode properties. Accordingly, the standard tests are split up -into a number of different files that are selected for running depending on -which features are available. When updating the tests, it is all too easy to -put a new test into the wrong file by mistake; for example, to put a test that -requires UTF support into a file that is used when it is not available. To help -detect such mistakes as early as possible, there is a facility for locking out -specific modifiers. If an input line for pcretest starts with the string -"< forbid " the following sequence of characters is taken as a list of -forbidden modifiers. For example, in the test files that must not use UTF or -Unicode property support, this line appears: -

      -  < forbid 8W
      -
      -This locks out the /8 and /W modifiers. An immediate error is given if they are -subsequently encountered. If the character string contains < but not >, all the -multi-character modifiers that begin with < are locked out. Otherwise, such -modifiers must be explicitly listed, for example: -
      -  < forbid <JS><cr>
      -
      -There must be a single space between < and "forbid" for this feature to be -recognised. If there is not, the line is interpreted either as a request to -re-load a pre-compiled pattern (see "SAVING AND RELOADING COMPILED PATTERNS" -below) or, if there is a another < character, as a pattern that uses < as its -delimiter. -

      -
      DATA LINES
      -

      -Before each data line is passed to pcre[16|32]_exec(), leading and trailing -white space is removed, and it is then scanned for \ escapes. Some of these -are pretty esoteric features, intended for checking out some of the more -complicated features of PCRE. If you are just testing "ordinary" regular -expressions, you probably don't need any of these. The following escapes are -recognized: -

      -  \a         alarm (BEL, \x07)
      -  \b         backspace (\x08)
      -  \e         escape (\x27)
      -  \f         form feed (\x0c)
      -  \n         newline (\x0a)
      -  \qdd       set the PCRE_MATCH_LIMIT limit to dd (any number of digits)
      -  \r         carriage return (\x0d)
      -  \t         tab (\x09)
      -  \v         vertical tab (\x0b)
      -  \nnn       octal character (up to 3 octal digits); always
      -               a byte unless > 255 in UTF-8 or 16-bit or 32-bit mode
      -  \o{dd...}  octal character (any number of octal digits}
      -  \xhh       hexadecimal byte (up to 2 hex digits)
      -  \x{hh...}  hexadecimal character (any number of hex digits)
      -  \A         pass the PCRE_ANCHORED option to pcre[16|32]_exec() or pcre[16|32]_dfa_exec()
      -  \B         pass the PCRE_NOTBOL option to pcre[16|32]_exec() or pcre[16|32]_dfa_exec()
      -  \Cdd       call pcre[16|32]_copy_substring() for substring dd after a successful match (number less than 32)
      -  \Cname     call pcre[16|32]_copy_named_substring() for substring "name" after a successful match (name termin-
      -               ated by next non alphanumeric character)
      -  \C+        show the current captured substrings at callout time
      -  \C-        do not supply a callout function
      -  \C!n       return 1 instead of 0 when callout number n is reached
      -  \C!n!m     return 1 instead of 0 when callout number n is reached for the nth time
      -  \C*n       pass the number n (may be negative) as callout data; this is used as the callout return value
      -  \D         use the pcre[16|32]_dfa_exec() match function
      -  \F         only shortest match for pcre[16|32]_dfa_exec()
      -  \Gdd       call pcre[16|32]_get_substring() for substring dd after a successful match (number less than 32)
      -  \Gname     call pcre[16|32]_get_named_substring() for substring "name" after a successful match (name termin-
      -               ated by next non-alphanumeric character)
      -  \Jdd       set up a JIT stack of dd kilobytes maximum (any number of digits)
      -  \L         call pcre[16|32]_get_substringlist() after a successful match
      -  \M         discover the minimum MATCH_LIMIT and MATCH_LIMIT_RECURSION settings
      -  \N         pass the PCRE_NOTEMPTY option to pcre[16|32]_exec() or pcre[16|32]_dfa_exec(); if used twice, pass the
      -               PCRE_NOTEMPTY_ATSTART option
      -  \Odd       set the size of the output vector passed to pcre[16|32]_exec() to dd (any number of digits)
      -  \P         pass the PCRE_PARTIAL_SOFT option to pcre[16|32]_exec() or pcre[16|32]_dfa_exec(); if used twice, pass the
      -               PCRE_PARTIAL_HARD option
      -  \Qdd       set the PCRE_MATCH_LIMIT_RECURSION limit to dd (any number of digits)
      -  \R         pass the PCRE_DFA_RESTART option to pcre[16|32]_dfa_exec()
      -  \S         output details of memory get/free calls during matching
      -  \Y         pass the PCRE_NO_START_OPTIMIZE option to pcre[16|32]_exec() or pcre[16|32]_dfa_exec()
      -  \Z         pass the PCRE_NOTEOL option to pcre[16|32]_exec() or pcre[16|32]_dfa_exec()
      -  \?         pass the PCRE_NO_UTF[8|16|32]_CHECK option to pcre[16|32]_exec() or pcre[16|32]_dfa_exec()
      -  \>dd       start the match at offset dd (optional "-"; then any number of digits); this sets the startoffset
      -               argument for pcre[16|32]_exec() or pcre[16|32]_dfa_exec()
      -  \<cr>      pass the PCRE_NEWLINE_CR option to pcre[16|32]_exec() or pcre[16|32]_dfa_exec()
      -  \<lf>      pass the PCRE_NEWLINE_LF option to pcre[16|32]_exec() or pcre[16|32]_dfa_exec()
      -  \<crlf>    pass the PCRE_NEWLINE_CRLF option to pcre[16|32]_exec() or pcre[16|32]_dfa_exec()
      -  \<anycrlf> pass the PCRE_NEWLINE_ANYCRLF option to pcre[16|32]_exec() or pcre[16|32]_dfa_exec()
      -  \<any>     pass the PCRE_NEWLINE_ANY option to pcre[16|32]_exec() or pcre[16|32]_dfa_exec()
      -
      -The use of \x{hh...} is not dependent on the use of the /8 modifier on -the pattern. It is recognized always. There may be any number of hexadecimal -digits inside the braces; invalid values provoke error messages. -

      -

      -Note that \xhh specifies one byte rather than one character in UTF-8 mode; -this makes it possible to construct invalid UTF-8 sequences for testing -purposes. On the other hand, \x{hh} is interpreted as a UTF-8 character in -UTF-8 mode, generating more than one byte if the value is greater than 127. -When testing the 8-bit library not in UTF-8 mode, \x{hh} generates one byte -for values less than 256, and causes an error for greater values. -

      -

      -In UTF-16 mode, all 4-digit \x{hhhh} values are accepted. This makes it -possible to construct invalid UTF-16 sequences for testing purposes. -

      -

      -In UTF-32 mode, all 4- to 8-digit \x{...} values are accepted. This makes it -possible to construct invalid UTF-32 sequences for testing purposes. -

      -

      -The escapes that specify line ending sequences are literal strings, exactly as -shown. No more than one newline setting should be present in any data line. -

      -

      -A backslash followed by anything else just escapes the anything else. If -the very last character is a backslash, it is ignored. This gives a way of -passing an empty line as data, since a real empty line terminates the data -input. -

      -

      -The \J escape provides a way of setting the maximum stack size that is -used by the just-in-time optimization code. It is ignored if JIT optimization -is not being used. Providing a stack that is larger than the default 32K is -necessary only for very complicated patterns. -

      -

      -If \M is present, pcretest calls pcre[16|32]_exec() several times, -with different values in the match_limit and match_limit_recursion -fields of the pcre[16|32]_extra data structure, until it finds the minimum -numbers for each parameter that allow pcre[16|32]_exec() to complete without -error. Because this is testing a specific feature of the normal interpretive -pcre[16|32]_exec() execution, the use of any JIT optimization that might -have been set up by the /S+ qualifier of -s+ option is disabled. -

      -

      -The match_limit number is a measure of the amount of backtracking -that takes place, and checking it out can be instructive. For most simple -matches, the number is quite small, but for patterns with very large numbers of -matching possibilities, it can become large very quickly with increasing length -of subject string. The match_limit_recursion number is a measure of how -much stack (or, if PCRE is compiled with NO_RECURSE, how much heap) memory is -needed to complete the match attempt. -

      -

      -When \O is used, the value specified may be higher or lower than the size set -by the -O command line option (or defaulted to 45); \O applies only to -the call of pcre[16|32]_exec() for the line in which it appears. -

      -

      -If the /P modifier was present on the pattern, causing the POSIX wrapper -API to be used, the only option-setting sequences that have any effect are \B, -\N, and \Z, causing REG_NOTBOL, REG_NOTEMPTY, and REG_NOTEOL, respectively, -to be passed to regexec(). -

      -
      THE ALTERNATIVE MATCHING FUNCTION
      -

      -By default, pcretest uses the standard PCRE matching function, -pcre[16|32]_exec() to match each data line. PCRE also supports an -alternative matching function, pcre[16|32]_dfa_test(), which operates in a -different way, and has some restrictions. The differences between the two -functions are described in the -pcrematching -documentation. -

      -

      -If a data line contains the \D escape sequence, or if the command line -contains the -dfa option, the alternative matching function is used. -This function finds all possible matches at a given point. If, however, the \F -escape sequence is present in the data line, it stops after the first match is -found. This is always the shortest possible match. -

      -
      DEFAULT OUTPUT FROM PCRETEST
      -

      -This section describes the output when the normal matching function, -pcre[16|32]_exec(), is being used. -

      -

      -When a match succeeds, pcretest outputs the list of captured substrings -that pcre[16|32]_exec() returns, starting with number 0 for the string that -matched the whole pattern. Otherwise, it outputs "No match" when the return is -PCRE_ERROR_NOMATCH, and "Partial match:" followed by the partially matching -substring when pcre[16|32]_exec() returns PCRE_ERROR_PARTIAL. (Note that -this is the entire substring that was inspected during the partial match; it -may include characters before the actual match start if a lookbehind assertion, -\K, \b, or \B was involved.) For any other return, pcretest outputs -the PCRE negative error number and a short descriptive phrase. If the error is -a failed UTF string check, the offset of the start of the failing character and -the reason code are also output, provided that the size of the output vector is -at least two. Here is an example of an interactive pcretest run. -

      -  $ pcretest
      -  PCRE version 8.13 2011-04-30
      -
      -    re> /^abc(\d+)/
      -  data> abc123
      -   0: abc123
      -   1: 123
      -  data> xyz
      -  No match
      -
      -Unset capturing substrings that are not followed by one that is set are not -returned by pcre[16|32]_exec(), and are not shown by pcretest. In the -following example, there are two capturing substrings, but when the first data -line is matched, the second, unset substring is not shown. An "internal" unset -substring is shown as "<unset>", as for the second data line. -
      -    re> /(a)|(b)/
      -  data> a
      -   0: a
      -   1: a
      -  data> b
      -   0: b
      -   1: <unset>
      -   2: b
      -
      -If the strings contain any non-printing characters, they are output as \xhh -escapes if the value is less than 256 and UTF mode is not set. Otherwise they -are output as \x{hh...} escapes. See below for the definition of non-printing -characters. If the pattern has the /+ modifier, the output for substring -0 is followed by the the rest of the subject string, identified by "0+" like -this: -
      -    re> /cat/+
      -  data> cataract
      -   0: cat
      -   0+ aract
      -
      -If the pattern has the /g or /G modifier, the results of successive -matching attempts are output in sequence, like this: -
      -    re> /\Bi(\w\w)/g
      -  data> Mississippi
      -   0: iss
      -   1: ss
      -   0: iss
      -   1: ss
      -   0: ipp
      -   1: pp
      -
      -"No match" is output only if the first match attempt fails. Here is an example -of a failure message (the offset 4 that is specified by \>4 is past the end of -the subject string): -
      -    re> /xyz/
      -  data> xyz\>4
      -  Error -24 (bad offset value)
      -
      -

      -

      -If any of the sequences \C, \G, or \L are present in a -data line that is successfully matched, the substrings extracted by the -convenience functions are output with C, G, or L after the string number -instead of a colon. This is in addition to the normal full list. The string -length (that is, the return from the extraction function) is given in -parentheses after each string for \C and \G. -

      -

      -Note that whereas patterns can be continued over several lines (a plain ">" -prompt is used for continuations), data lines may not. However newlines can be -included in data by means of the \n escape (or \r, \r\n, etc., depending on -the newline sequence setting). -

      -
      OUTPUT FROM THE ALTERNATIVE MATCHING FUNCTION
      -

      -When the alternative matching function, pcre[16|32]_dfa_exec(), is used (by -means of the \D escape sequence or the -dfa command line option), the -output consists of a list of all the matches that start at the first point in -the subject where there is at least one match. For example: -

      -    re> /(tang|tangerine|tan)/
      -  data> yellow tangerine\D
      -   0: tangerine
      -   1: tang
      -   2: tan
      -
      -(Using the normal matching function on this data finds only "tang".) The -longest matching string is always given first (and numbered zero). After a -PCRE_ERROR_PARTIAL return, the output is "Partial match:", followed by the -partially matching substring. (Note that this is the entire substring that was -inspected during the partial match; it may include characters before the actual -match start if a lookbehind assertion, \K, \b, or \B was involved.) -

      -

      -If /g is present on the pattern, the search for further matches resumes -at the end of the longest match. For example: -

      -    re> /(tang|tangerine|tan)/g
      -  data> yellow tangerine and tangy sultana\D
      -   0: tangerine
      -   1: tang
      -   2: tan
      -   0: tang
      -   1: tan
      -   0: tan
      -
      -Since the matching function does not support substring capture, the escape -sequences that are concerned with captured substrings are not relevant. -

      -
      RESTARTING AFTER A PARTIAL MATCH
      -

      -When the alternative matching function has given the PCRE_ERROR_PARTIAL return, -indicating that the subject partially matched the pattern, you can restart the -match with additional subject data by means of the \R escape sequence. For -example: -

      -    re> /^\d?\d(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)\d\d$/
      -  data> 23ja\P\D
      -  Partial match: 23ja
      -  data> n05\R\D
      -   0: n05
      -
      -For further information about partial matching, see the -pcrepartial -documentation. -

      -
      CALLOUTS
      -

      -If the pattern contains any callout requests, pcretest's callout function -is called during matching. This works with both matching functions. By default, -the called function displays the callout number, the start and current -positions in the text at the callout time, and the next pattern item to be -tested. For example: -

      -  --->pqrabcdef
      -    0    ^  ^     \d
      -
      -This output indicates that callout number 0 occurred for a match attempt -starting at the fourth character of the subject string, when the pointer was at -the seventh character of the data, and when the next pattern item was \d. Just -one circumflex is output if the start and current positions are the same. -

      -

      -Callouts numbered 255 are assumed to be automatic callouts, inserted as a -result of the /C pattern modifier. In this case, instead of showing the -callout number, the offset in the pattern, preceded by a plus, is output. For -example: -

      -    re> /\d?[A-E]\*/C
      -  data> E*
      -  --->E*
      -   +0 ^      \d?
      -   +3 ^      [A-E]
      -   +8 ^^     \*
      -  +10 ^ ^
      -   0: E*
      -
      -If a pattern contains (*MARK) items, an additional line is output whenever -a change of latest mark is passed to the callout function. For example: -
      -    re> /a(*MARK:X)bc/C
      -  data> abc
      -  --->abc
      -   +0 ^       a
      -   +1 ^^      (*MARK:X)
      -  +10 ^^      b
      -  Latest Mark: X
      -  +11 ^ ^     c
      -  +12 ^  ^
      -   0: abc
      -
      -The mark changes between matching "a" and "b", but stays the same for the rest -of the match, so nothing more is output. If, as a result of backtracking, the -mark reverts to being unset, the text "<unset>" is output. -

      -

      -The callout function in pcretest returns zero (carry on matching) by -default, but you can use a \C item in a data line (as described above) to -change this and other parameters of the callout. -

      -

      -Inserting callouts can be helpful when using pcretest to check -complicated regular expressions. For further information about callouts, see -the -pcrecallout -documentation. -

      -
      NON-PRINTING CHARACTERS
      -

      -When pcretest is outputting text in the compiled version of a pattern, -bytes other than 32-126 are always treated as non-printing characters are are -therefore shown as hex escapes. -

      -

      -When pcretest is outputting text that is a matched part of a subject -string, it behaves in the same way, unless a different locale has been set for -the pattern (using the /L modifier). In this case, the isprint() -function to distinguish printing and non-printing characters. -

      -
      SAVING AND RELOADING COMPILED PATTERNS
      -

      -The facilities described in this section are not available when the POSIX -interface to PCRE is being used, that is, when the /P pattern modifier is -specified. -

      -

      -When the POSIX interface is not in use, you can cause pcretest to write a -compiled pattern to a file, by following the modifiers with > and a file name. -For example: -

      -  /pattern/im >/some/file
      -
      -See the -pcreprecompile -documentation for a discussion about saving and re-using compiled patterns. -Note that if the pattern was successfully studied with JIT optimization, the -JIT data cannot be saved. -

      -

      -The data that is written is binary. The first eight bytes are the length of the -compiled pattern data followed by the length of the optional study data, each -written as four bytes in big-endian order (most significant byte first). If -there is no study data (either the pattern was not studied, or studying did not -return any data), the second length is zero. The lengths are followed by an -exact copy of the compiled pattern. If there is additional study data, this -(excluding any JIT data) follows immediately after the compiled pattern. After -writing the file, pcretest expects to read a new pattern. -

      -

      -A saved pattern can be reloaded into pcretest by specifying < and a file -name instead of a pattern. There must be no space between < and the file name, -which must not contain a < character, as otherwise pcretest will -interpret the line as a pattern delimited by < characters. For example: -

      -   re> </some/file
      -  Compiled pattern loaded from /some/file
      -  No study data
      -
      -If the pattern was previously studied with the JIT optimization, the JIT -information cannot be saved and restored, and so is lost. When the pattern has -been loaded, pcretest proceeds to read data lines in the usual way. -

      -

      -You can copy a file written by pcretest to a different host and reload it -there, even if the new host has opposite endianness to the one on which the -pattern was compiled. For example, you can compile on an i86 machine and run on -a SPARC machine. When a pattern is reloaded on a host with different -endianness, the confirmation message is changed to: -

      -  Compiled pattern (byte-inverted) loaded from /some/file
      -
      -The test suite contains some saved pre-compiled patterns with different -endianness. These are reloaded using "<!" instead of just "<". This suppresses -the "(byte-inverted)" text so that the output is the same on all hosts. It also -forces debugging output once the pattern has been reloaded. -

      -

      -File names for saving and reloading can be absolute or relative, but note that -the shell facility of expanding a file name that starts with a tilde (~) is not -available. -

      -

      -The ability to save and reload files in pcretest is intended for testing -and experimentation. It is not intended for production use because only a -single pattern can be written to a file. Furthermore, there is no facility for -supplying custom character tables for use with a reloaded pattern. If the -original pattern was compiled with custom tables, an attempt to match a subject -string using a reloaded pattern is likely to cause pcretest to crash. -Finally, if you attempt to load a file that is not in the correct format, the -result is undefined. -

      -
      SEE ALSO
      -

      -pcre(3), pcre16(3), pcre32(3), pcreapi(3), -pcrecallout(3), -pcrejit, pcrematching(3), pcrepartial(d), -pcrepattern(3), pcreprecompile(3). -

      -
      AUTHOR
      -

      -Philip Hazel -
      -University Computing Service -
      -Cambridge CB2 3QH, England. -
      -

      -
      REVISION
      -

      -Last updated: 23 February 2017 -
      -Copyright © 1997-2017 University of Cambridge. -
      -

      -Return to the PCRE index page. -

      diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcreunicode.html b/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcreunicode.html deleted file mode 100644 index ab36bc61..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/html/pcreunicode.html +++ /dev/null @@ -1,262 +0,0 @@ - - -pcreunicode specification - - -

      pcreunicode man page

      -

      -Return to the PCRE index page. -

      -

      -This page is part of the PCRE HTML documentation. It was generated automatically -from the original man page. If there is any nonsense in it, please consult the -man page, in case the conversion went wrong. -
      -
      -UTF-8, UTF-16, UTF-32, AND UNICODE PROPERTY SUPPORT -
      -

      -As well as UTF-8 support, PCRE also supports UTF-16 (from release 8.30) and -UTF-32 (from release 8.32), by means of two additional libraries. They can be -built as well as, or instead of, the 8-bit library. -

      -
      -UTF-8 SUPPORT -
      -

      -In order process UTF-8 strings, you must build PCRE's 8-bit library with UTF -support, and, in addition, you must call -pcre_compile() -with the PCRE_UTF8 option flag, or the pattern must start with the sequence -(*UTF8) or (*UTF). When either of these is the case, both the pattern and any -subject strings that are matched against it are treated as UTF-8 strings -instead of strings of individual 1-byte characters. -

      -
      -UTF-16 AND UTF-32 SUPPORT -
      -

      -In order process UTF-16 or UTF-32 strings, you must build PCRE's 16-bit or -32-bit library with UTF support, and, in addition, you must call -pcre16_compile() -or -pcre32_compile() -with the PCRE_UTF16 or PCRE_UTF32 option flag, as appropriate. Alternatively, -the pattern must start with the sequence (*UTF16), (*UTF32), as appropriate, or -(*UTF), which can be used with either library. When UTF mode is set, both the -pattern and any subject strings that are matched against it are treated as -UTF-16 or UTF-32 strings instead of strings of individual 16-bit or 32-bit -characters. -

      -
      -UTF SUPPORT OVERHEAD -
      -

      -If you compile PCRE with UTF support, but do not use it at run time, the -library will be a bit bigger, but the additional run time overhead is limited -to testing the PCRE_UTF[8|16|32] flag occasionally, so should not be very big. -

      -
      -UNICODE PROPERTY SUPPORT -
      -

      -If PCRE is built with Unicode character property support (which implies UTF -support), the escape sequences \p{..}, \P{..}, and \X can be used. -The available properties that can be tested are limited to the general -category properties such as Lu for an upper case letter or Nd for a decimal -number, the Unicode script names such as Arabic or Han, and the derived -properties Any and L&. Full lists is given in the -pcrepattern -and -pcresyntax -documentation. Only the short names for properties are supported. For example, -\p{L} matches a letter. Its Perl synonym, \p{Letter}, is not supported. -Furthermore, in Perl, many properties may optionally be prefixed by "Is", for -compatibility with Perl 5.6. PCRE does not support this. -

      -
      -Validity of UTF-8 strings -
      -

      -When you set the PCRE_UTF8 flag, the byte strings passed as patterns and -subjects are (by default) checked for validity on entry to the relevant -functions. The entire string is checked before any other processing takes -place. From release 7.3 of PCRE, the check is according the rules of RFC 3629, -which are themselves derived from the Unicode specification. Earlier releases -of PCRE followed the rules of RFC 2279, which allows the full range of 31-bit -values (0 to 0x7FFFFFFF). The current check allows only values in the range U+0 -to U+10FFFF, excluding the surrogate area. (From release 8.33 the so-called -"non-character" code points are no longer excluded because Unicode corrigendum -#9 makes it clear that they should not be.) -

      -

      -Characters in the "Surrogate Area" of Unicode are reserved for use by UTF-16, -where they are used in pairs to encode codepoints with values greater than -0xFFFF. The code points that are encoded by UTF-16 pairs are available -independently in the UTF-8 and UTF-32 encodings. (In other words, the whole -surrogate thing is a fudge for UTF-16 which unfortunately messes up UTF-8 and -UTF-32.) -

      -

      -If an invalid UTF-8 string is passed to PCRE, an error return is given. At -compile time, the only additional information is the offset to the first byte -of the failing character. The run-time functions pcre_exec() and -pcre_dfa_exec() also pass back this information, as well as a more -detailed reason code if the caller has provided memory in which to do this. -

      -

      -In some situations, you may already know that your strings are valid, and -therefore want to skip these checks in order to improve performance, for -example in the case of a long subject string that is being scanned repeatedly. -If you set the PCRE_NO_UTF8_CHECK flag at compile time or at run time, PCRE -assumes that the pattern or subject it is given (respectively) contains only -valid UTF-8 codes. In this case, it does not diagnose an invalid UTF-8 string. -

      -

      -Note that passing PCRE_NO_UTF8_CHECK to pcre_compile() just disables the -check for the pattern; it does not also apply to subject strings. If you want -to disable the check for a subject string you must pass this option to -pcre_exec() or pcre_dfa_exec(). -

      -

      -If you pass an invalid UTF-8 string when PCRE_NO_UTF8_CHECK is set, the result -is undefined and your program may crash. -

      -
      -Validity of UTF-16 strings -
      -

      -When you set the PCRE_UTF16 flag, the strings of 16-bit data units that are -passed as patterns and subjects are (by default) checked for validity on entry -to the relevant functions. Values other than those in the surrogate range -U+D800 to U+DFFF are independent code points. Values in the surrogate range -must be used in pairs in the correct manner. -

      -

      -If an invalid UTF-16 string is passed to PCRE, an error return is given. At -compile time, the only additional information is the offset to the first data -unit of the failing character. The run-time functions pcre16_exec() and -pcre16_dfa_exec() also pass back this information, as well as a more -detailed reason code if the caller has provided memory in which to do this. -

      -

      -In some situations, you may already know that your strings are valid, and -therefore want to skip these checks in order to improve performance. If you set -the PCRE_NO_UTF16_CHECK flag at compile time or at run time, PCRE assumes that -the pattern or subject it is given (respectively) contains only valid UTF-16 -sequences. In this case, it does not diagnose an invalid UTF-16 string. -However, if an invalid string is passed, the result is undefined. -

      -
      -Validity of UTF-32 strings -
      -

      -When you set the PCRE_UTF32 flag, the strings of 32-bit data units that are -passed as patterns and subjects are (by default) checked for validity on entry -to the relevant functions. This check allows only values in the range U+0 -to U+10FFFF, excluding the surrogate area U+D800 to U+DFFF. -

      -

      -If an invalid UTF-32 string is passed to PCRE, an error return is given. At -compile time, the only additional information is the offset to the first data -unit of the failing character. The run-time functions pcre32_exec() and -pcre32_dfa_exec() also pass back this information, as well as a more -detailed reason code if the caller has provided memory in which to do this. -

      -

      -In some situations, you may already know that your strings are valid, and -therefore want to skip these checks in order to improve performance. If you set -the PCRE_NO_UTF32_CHECK flag at compile time or at run time, PCRE assumes that -the pattern or subject it is given (respectively) contains only valid UTF-32 -sequences. In this case, it does not diagnose an invalid UTF-32 string. -However, if an invalid string is passed, the result is undefined. -

      -
      -General comments about UTF modes -
      -

      -1. Codepoints less than 256 can be specified in patterns by either braced or -unbraced hexadecimal escape sequences (for example, \x{b3} or \xb3). Larger -values have to use braced sequences. -

      -

      -2. Octal numbers up to \777 are recognized, and in UTF-8 mode they match -two-byte characters for values greater than \177. -

      -

      -3. Repeat quantifiers apply to complete UTF characters, not to individual -data units, for example: \x{100}{3}. -

      -

      -4. The dot metacharacter matches one UTF character instead of a single data -unit. -

      -

      -5. The escape sequence \C can be used to match a single byte in UTF-8 mode, or -a single 16-bit data unit in UTF-16 mode, or a single 32-bit data unit in -UTF-32 mode, but its use can lead to some strange effects because it breaks up -multi-unit characters (see the description of \C in the -pcrepattern -documentation). The use of \C is not supported in the alternative matching -function pcre[16|32]_dfa_exec(), nor is it supported in UTF mode by the -JIT optimization of pcre[16|32]_exec(). If JIT optimization is requested -for a UTF pattern that contains \C, it will not succeed, and so the matching -will be carried out by the normal interpretive function. -

      -

      -6. The character escapes \b, \B, \d, \D, \s, \S, \w, and \W correctly -test characters of any code value, but, by default, the characters that PCRE -recognizes as digits, spaces, or word characters remain the same set as in -non-UTF mode, all with values less than 256. This remains true even when PCRE -is built to include Unicode property support, because to do otherwise would -slow down PCRE in many common cases. Note in particular that this applies to -\b and \B, because they are defined in terms of \w and \W. If you really -want to test for a wider sense of, say, "digit", you can use explicit Unicode -property tests such as \p{Nd}. Alternatively, if you set the PCRE_UCP option, -the way that the character escapes work is changed so that Unicode properties -are used to determine which characters match. There are more details in the -section on -generic character types -in the -pcrepattern -documentation. -

      -

      -7. Similarly, characters that match the POSIX named character classes are all -low-valued characters, unless the PCRE_UCP option is set. -

      -

      -8. However, the horizontal and vertical white space matching escapes (\h, \H, -\v, and \V) do match all the appropriate Unicode characters, whether or not -PCRE_UCP is set. -

      -

      -9. Case-insensitive matching applies only to characters whose values are less -than 128, unless PCRE is built with Unicode property support. A few Unicode -characters such as Greek sigma have more than two codepoints that are -case-equivalent. Up to and including PCRE release 8.31, only one-to-one case -mappings were supported, but later releases (with Unicode property support) do -treat as case-equivalent all versions of characters such as Greek sigma. -

      -
      -AUTHOR -
      -

      -Philip Hazel -
      -University Computing Service -
      -Cambridge CB2 3QH, England. -
      -

      -
      -REVISION -
      -

      -Last updated: 27 February 2013 -
      -Copyright © 1997-2013 University of Cambridge. -
      -

      -Return to the PCRE index page. -

      diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/pcre-config.txt b/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/pcre-config.txt deleted file mode 100644 index 8503ab0e..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/pcre-config.txt +++ /dev/null @@ -1,86 +0,0 @@ -PCRE-CONFIG(1) General Commands Manual PCRE-CONFIG(1) - - - -NAME - pcre-config - program to return PCRE configuration - -SYNOPSIS - - pcre-config [--prefix] [--exec-prefix] [--version] [--libs] - [--libs16] [--libs32] [--libs-cpp] [--libs-posix] - [--cflags] [--cflags-posix] - - -DESCRIPTION - - pcre-config returns the configuration of the installed PCRE libraries - and the options required to compile a program to use them. Some of the - options apply only to the 8-bit, or 16-bit, or 32-bit libraries, - respectively, and are not available if only one of those libraries has - been built. If an unavailable option is encountered, the "usage" infor- - mation is output. - - -OPTIONS - - --prefix Writes the directory prefix used in the PCRE installation for - architecture independent files (/usr on many systems, - /usr/local on some systems) to the standard output. - - --exec-prefix - Writes the directory prefix used in the PCRE installation for - architecture dependent files (normally the same as --prefix) - to the standard output. - - --version Writes the version number of the installed PCRE libraries to - the standard output. - - --libs Writes to the standard output the command line options - required to link with the 8-bit PCRE library (-lpcre on many - systems). - - --libs16 Writes to the standard output the command line options - required to link with the 16-bit PCRE library (-lpcre16 on - many systems). - - --libs32 Writes to the standard output the command line options - required to link with the 32-bit PCRE library (-lpcre32 on - many systems). - - --libs-cpp - Writes to the standard output the command line options - required to link with PCRE's C++ wrapper library (-lpcrecpp - -lpcre on many systems). - - --libs-posix - Writes to the standard output the command line options - required to link with PCRE's POSIX API wrapper library - (-lpcreposix -lpcre on many systems). - - --cflags Writes to the standard output the command line options - required to compile files that use PCRE (this may include - some -I options, but is blank on many systems). - - --cflags-posix - Writes to the standard output the command line options - required to compile files that use PCRE's POSIX API wrapper - library (this may include some -I options, but is blank on - many systems). - - -SEE ALSO - - pcre(3) - - -AUTHOR - - This manual page was originally written by Mark Baker for the Debian - GNU/Linux system. It has been subsequently revised as a generic PCRE - man page. - - -REVISION - - Last updated: 24 June 2012 diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/pcre.txt b/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/pcre.txt deleted file mode 100644 index c027538f..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/pcre.txt +++ /dev/null @@ -1,10502 +0,0 @@ ------------------------------------------------------------------------------ -This file contains a concatenation of the PCRE man pages, converted to plain -text format for ease of searching with a text editor, or for use on systems -that do not have a man page processor. The small individual files that give -synopses of each function in the library have not been included. Neither has -the pcredemo program. There are separate text files for the pcregrep and -pcretest commands. ------------------------------------------------------------------------------ - - -PCRE(3) Library Functions Manual PCRE(3) - - - -NAME - PCRE - Perl-compatible regular expressions (original API) - -PLEASE TAKE NOTE - - This document relates to PCRE releases that use the original API, with - library names libpcre, libpcre16, and libpcre32. January 2015 saw the - first release of a new API, known as PCRE2, with release numbers start- - ing at 10.00 and library names libpcre2-8, libpcre2-16, and - libpcre2-32. The old libraries (now called PCRE1) are still being main- - tained for bug fixes, but there will be no new development. New - projects are advised to use the new PCRE2 libraries. - - -INTRODUCTION - - The PCRE library is a set of functions that implement regular expres- - sion pattern matching using the same syntax and semantics as Perl, with - just a few differences. Some features that appeared in Python and PCRE - before they appeared in Perl are also available using the Python syn- - tax, there is some support for one or two .NET and Oniguruma syntax - items, and there is an option for requesting some minor changes that - give better JavaScript compatibility. - - Starting with release 8.30, it is possible to compile two separate PCRE - libraries: the original, which supports 8-bit character strings - (including UTF-8 strings), and a second library that supports 16-bit - character strings (including UTF-16 strings). The build process allows - either one or both to be built. The majority of the work to make this - possible was done by Zoltan Herczeg. - - Starting with release 8.32 it is possible to compile a third separate - PCRE library that supports 32-bit character strings (including UTF-32 - strings). The build process allows any combination of the 8-, 16- and - 32-bit libraries. The work to make this possible was done by Christian - Persch. - - The three libraries contain identical sets of functions, except that - the names in the 16-bit library start with pcre16_ instead of pcre_, - and the names in the 32-bit library start with pcre32_ instead of - pcre_. To avoid over-complication and reduce the documentation mainte- - nance load, most of the documentation describes the 8-bit library, with - the differences for the 16-bit and 32-bit libraries described sepa- - rately in the pcre16 and pcre32 pages. References to functions or - structures of the form pcre[16|32]_xxx should be read as meaning - "pcre_xxx when using the 8-bit library, pcre16_xxx when using the - 16-bit library, or pcre32_xxx when using the 32-bit library". - - The current implementation of PCRE corresponds approximately with Perl - 5.12, including support for UTF-8/16/32 encoded strings and Unicode - general category properties. However, UTF-8/16/32 and Unicode support - has to be explicitly enabled; it is not the default. The Unicode tables - correspond to Unicode release 6.3.0. - - In addition to the Perl-compatible matching function, PCRE contains an - alternative function that matches the same compiled patterns in a dif- - ferent way. In certain circumstances, the alternative function has some - advantages. For a discussion of the two matching algorithms, see the - pcrematching page. - - PCRE is written in C and released as a C library. A number of people - have written wrappers and interfaces of various kinds. In particular, - Google Inc. have provided a comprehensive C++ wrapper for the 8-bit - library. This is now included as part of the PCRE distribution. The - pcrecpp page has details of this interface. Other people's contribu- - tions can be found in the Contrib directory at the primary FTP site, - which is: - - ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre - - Details of exactly which Perl regular expression features are and are - not supported by PCRE are given in separate documents. See the pcrepat- - tern and pcrecompat pages. There is a syntax summary in the pcresyntax - page. - - Some features of PCRE can be included, excluded, or changed when the - library is built. The pcre_config() function makes it possible for a - client to discover which features are available. The features them- - selves are described in the pcrebuild page. Documentation about build- - ing PCRE for various operating systems can be found in the README and - NON-AUTOTOOLS_BUILD files in the source distribution. - - The libraries contains a number of undocumented internal functions and - data tables that are used by more than one of the exported external - functions, but which are not intended for use by external callers. - Their names all begin with "_pcre_" or "_pcre16_" or "_pcre32_", which - hopefully will not provoke any name clashes. In some environments, it - is possible to control which external symbols are exported when a - shared library is built, and in these cases the undocumented symbols - are not exported. - - -SECURITY CONSIDERATIONS - - If you are using PCRE in a non-UTF application that permits users to - supply arbitrary patterns for compilation, you should be aware of a - feature that allows users to turn on UTF support from within a pattern, - provided that PCRE was built with UTF support. For example, an 8-bit - pattern that begins with "(*UTF8)" or "(*UTF)" turns on UTF-8 mode, - which interprets patterns and subjects as strings of UTF-8 characters - instead of individual 8-bit characters. This causes both the pattern - and any data against which it is matched to be checked for UTF-8 valid- - ity. If the data string is very long, such a check might use suffi- - ciently many resources as to cause your application to lose perfor- - mance. - - One way of guarding against this possibility is to use the - pcre_fullinfo() function to check the compiled pattern's options for - UTF. Alternatively, from release 8.33, you can set the PCRE_NEVER_UTF - option at compile time. This causes an compile time error if a pattern - contains a UTF-setting sequence. - - If your application is one that supports UTF, be aware that validity - checking can take time. If the same data string is to be matched many - times, you can use the PCRE_NO_UTF[8|16|32]_CHECK option for the second - and subsequent matches to save redundant checks. - - Another way that performance can be hit is by running a pattern that - has a very large search tree against a string that will never match. - Nested unlimited repeats in a pattern are a common example. PCRE pro- - vides some protection against this: see the PCRE_EXTRA_MATCH_LIMIT fea- - ture in the pcreapi page. - - -USER DOCUMENTATION - - The user documentation for PCRE comprises a number of different sec- - tions. In the "man" format, each of these is a separate "man page". In - the HTML format, each is a separate page, linked from the index page. - In the plain text format, the descriptions of the pcregrep and pcretest - programs are in files called pcregrep.txt and pcretest.txt, respec- - tively. The remaining sections, except for the pcredemo section (which - is a program listing), are concatenated in pcre.txt, for ease of - searching. The sections are as follows: - - pcre this document - pcre-config show PCRE installation configuration information - pcre16 details of the 16-bit library - pcre32 details of the 32-bit library - pcreapi details of PCRE's native C API - pcrebuild building PCRE - pcrecallout details of the callout feature - pcrecompat discussion of Perl compatibility - pcrecpp details of the C++ wrapper for the 8-bit library - pcredemo a demonstration C program that uses PCRE - pcregrep description of the pcregrep command (8-bit only) - pcrejit discussion of the just-in-time optimization support - pcrelimits details of size and other limits - pcrematching discussion of the two matching algorithms - pcrepartial details of the partial matching facility - pcrepattern syntax and semantics of supported - regular expressions - pcreperform discussion of performance issues - pcreposix the POSIX-compatible C API for the 8-bit library - pcreprecompile details of saving and re-using precompiled patterns - pcresample discussion of the pcredemo program - pcrestack discussion of stack usage - pcresyntax quick syntax reference - pcretest description of the pcretest testing command - pcreunicode discussion of Unicode and UTF-8/16/32 support - - In the "man" and HTML formats, there is also a short page for each C - library function, listing its arguments and results. - - -AUTHOR - - Philip Hazel - University Computing Service - Cambridge CB2 3QH, England. - - Putting an actual email address here seems to have been a spam magnet, - so I've taken it away. If you want to email me, use my two initials, - followed by the two digits 10, at the domain cam.ac.uk. - - -REVISION - - Last updated: 10 February 2015 - Copyright (c) 1997-2015 University of Cambridge. ------------------------------------------------------------------------------- - - -PCRE(3) Library Functions Manual PCRE(3) - - - -NAME - PCRE - Perl-compatible regular expressions - - #include - - -PCRE 16-BIT API BASIC FUNCTIONS - - pcre16 *pcre16_compile(PCRE_SPTR16 pattern, int options, - const char **errptr, int *erroffset, - const unsigned char *tableptr); - - pcre16 *pcre16_compile2(PCRE_SPTR16 pattern, int options, - int *errorcodeptr, - const char **errptr, int *erroffset, - const unsigned char *tableptr); - - pcre16_extra *pcre16_study(const pcre16 *code, int options, - const char **errptr); - - void pcre16_free_study(pcre16_extra *extra); - - int pcre16_exec(const pcre16 *code, const pcre16_extra *extra, - PCRE_SPTR16 subject, int length, int startoffset, - int options, int *ovector, int ovecsize); - - int pcre16_dfa_exec(const pcre16 *code, const pcre16_extra *extra, - PCRE_SPTR16 subject, int length, int startoffset, - int options, int *ovector, int ovecsize, - int *workspace, int wscount); - - -PCRE 16-BIT API STRING EXTRACTION FUNCTIONS - - int pcre16_copy_named_substring(const pcre16 *code, - PCRE_SPTR16 subject, int *ovector, - int stringcount, PCRE_SPTR16 stringname, - PCRE_UCHAR16 *buffer, int buffersize); - - int pcre16_copy_substring(PCRE_SPTR16 subject, int *ovector, - int stringcount, int stringnumber, PCRE_UCHAR16 *buffer, - int buffersize); - - int pcre16_get_named_substring(const pcre16 *code, - PCRE_SPTR16 subject, int *ovector, - int stringcount, PCRE_SPTR16 stringname, - PCRE_SPTR16 *stringptr); - - int pcre16_get_stringnumber(const pcre16 *code, - PCRE_SPTR16 name); - - int pcre16_get_stringtable_entries(const pcre16 *code, - PCRE_SPTR16 name, PCRE_UCHAR16 **first, PCRE_UCHAR16 **last); - - int pcre16_get_substring(PCRE_SPTR16 subject, int *ovector, - int stringcount, int stringnumber, - PCRE_SPTR16 *stringptr); - - int pcre16_get_substring_list(PCRE_SPTR16 subject, - int *ovector, int stringcount, PCRE_SPTR16 **listptr); - - void pcre16_free_substring(PCRE_SPTR16 stringptr); - - void pcre16_free_substring_list(PCRE_SPTR16 *stringptr); - - -PCRE 16-BIT API AUXILIARY FUNCTIONS - - pcre16_jit_stack *pcre16_jit_stack_alloc(int startsize, int maxsize); - - void pcre16_jit_stack_free(pcre16_jit_stack *stack); - - void pcre16_assign_jit_stack(pcre16_extra *extra, - pcre16_jit_callback callback, void *data); - - const unsigned char *pcre16_maketables(void); - - int pcre16_fullinfo(const pcre16 *code, const pcre16_extra *extra, - int what, void *where); - - int pcre16_refcount(pcre16 *code, int adjust); - - int pcre16_config(int what, void *where); - - const char *pcre16_version(void); - - int pcre16_pattern_to_host_byte_order(pcre16 *code, - pcre16_extra *extra, const unsigned char *tables); - - -PCRE 16-BIT API INDIRECTED FUNCTIONS - - void *(*pcre16_malloc)(size_t); - - void (*pcre16_free)(void *); - - void *(*pcre16_stack_malloc)(size_t); - - void (*pcre16_stack_free)(void *); - - int (*pcre16_callout)(pcre16_callout_block *); - - -PCRE 16-BIT API 16-BIT-ONLY FUNCTION - - int pcre16_utf16_to_host_byte_order(PCRE_UCHAR16 *output, - PCRE_SPTR16 input, int length, int *byte_order, - int keep_boms); - - -THE PCRE 16-BIT LIBRARY - - Starting with release 8.30, it is possible to compile a PCRE library - that supports 16-bit character strings, including UTF-16 strings, as - well as or instead of the original 8-bit library. The majority of the - work to make this possible was done by Zoltan Herczeg. The two - libraries contain identical sets of functions, used in exactly the same - way. Only the names of the functions and the data types of their argu- - ments and results are different. To avoid over-complication and reduce - the documentation maintenance load, most of the PCRE documentation - describes the 8-bit library, with only occasional references to the - 16-bit library. This page describes what is different when you use the - 16-bit library. - - WARNING: A single application can be linked with both libraries, but - you must take care when processing any particular pattern to use func- - tions from just one library. For example, if you want to study a pat- - tern that was compiled with pcre16_compile(), you must do so with - pcre16_study(), not pcre_study(), and you must free the study data with - pcre16_free_study(). - - -THE HEADER FILE - - There is only one header file, pcre.h. It contains prototypes for all - the functions in all libraries, as well as definitions of flags, struc- - tures, error codes, etc. - - -THE LIBRARY NAME - - In Unix-like systems, the 16-bit library is called libpcre16, and can - normally be accesss by adding -lpcre16 to the command for linking an - application that uses PCRE. - - -STRING TYPES - - In the 8-bit library, strings are passed to PCRE library functions as - vectors of bytes with the C type "char *". In the 16-bit library, - strings are passed as vectors of unsigned 16-bit quantities. The macro - PCRE_UCHAR16 specifies an appropriate data type, and PCRE_SPTR16 is - defined as "const PCRE_UCHAR16 *". In very many environments, "short - int" is a 16-bit data type. When PCRE is built, it defines PCRE_UCHAR16 - as "unsigned short int", but checks that it really is a 16-bit data - type. If it is not, the build fails with an error message telling the - maintainer to modify the definition appropriately. - - -STRUCTURE TYPES - - The types of the opaque structures that are used for compiled 16-bit - patterns and JIT stacks are pcre16 and pcre16_jit_stack respectively. - The type of the user-accessible structure that is returned by - pcre16_study() is pcre16_extra, and the type of the structure that is - used for passing data to a callout function is pcre16_callout_block. - These structures contain the same fields, with the same names, as their - 8-bit counterparts. The only difference is that pointers to character - strings are 16-bit instead of 8-bit types. - - -16-BIT FUNCTIONS - - For every function in the 8-bit library there is a corresponding func- - tion in the 16-bit library with a name that starts with pcre16_ instead - of pcre_. The prototypes are listed above. In addition, there is one - extra function, pcre16_utf16_to_host_byte_order(). This is a utility - function that converts a UTF-16 character string to host byte order if - necessary. The other 16-bit functions expect the strings they are - passed to be in host byte order. - - The input and output arguments of pcre16_utf16_to_host_byte_order() may - point to the same address, that is, conversion in place is supported. - The output buffer must be at least as long as the input. - - The length argument specifies the number of 16-bit data units in the - input string; a negative value specifies a zero-terminated string. - - If byte_order is NULL, it is assumed that the string starts off in host - byte order. This may be changed by byte-order marks (BOMs) anywhere in - the string (commonly as the first character). - - If byte_order is not NULL, a non-zero value of the integer to which it - points means that the input starts off in host byte order, otherwise - the opposite order is assumed. Again, BOMs in the string can change - this. The final byte order is passed back at the end of processing. - - If keep_boms is not zero, byte-order mark characters (0xfeff) are - copied into the output string. Otherwise they are discarded. - - The result of the function is the number of 16-bit units placed into - the output buffer, including the zero terminator if the string was - zero-terminated. - - -SUBJECT STRING OFFSETS - - The lengths and starting offsets of subject strings must be specified - in 16-bit data units, and the offsets within subject strings that are - returned by the matching functions are in also 16-bit units rather than - bytes. - - -NAMED SUBPATTERNS - - The name-to-number translation table that is maintained for named sub- - patterns uses 16-bit characters. The pcre16_get_stringtable_entries() - function returns the length of each entry in the table as the number of - 16-bit data units. - - -OPTION NAMES - - There are two new general option names, PCRE_UTF16 and - PCRE_NO_UTF16_CHECK, which correspond to PCRE_UTF8 and - PCRE_NO_UTF8_CHECK in the 8-bit library. In fact, these new options - define the same bits in the options word. There is a discussion about - the validity of UTF-16 strings in the pcreunicode page. - - For the pcre16_config() function there is an option PCRE_CONFIG_UTF16 - that returns 1 if UTF-16 support is configured, otherwise 0. If this - option is given to pcre_config() or pcre32_config(), or if the - PCRE_CONFIG_UTF8 or PCRE_CONFIG_UTF32 option is given to pcre16_con- - fig(), the result is the PCRE_ERROR_BADOPTION error. - - -CHARACTER CODES - - In 16-bit mode, when PCRE_UTF16 is not set, character values are - treated in the same way as in 8-bit, non UTF-8 mode, except, of course, - that they can range from 0 to 0xffff instead of 0 to 0xff. Character - types for characters less than 0xff can therefore be influenced by the - locale in the same way as before. Characters greater than 0xff have - only one case, and no "type" (such as letter or digit). - - In UTF-16 mode, the character code is Unicode, in the range 0 to - 0x10ffff, with the exception of values in the range 0xd800 to 0xdfff - because those are "surrogate" values that are used in pairs to encode - values greater than 0xffff. - - A UTF-16 string can indicate its endianness by special code knows as a - byte-order mark (BOM). The PCRE functions do not handle this, expecting - strings to be in host byte order. A utility function called - pcre16_utf16_to_host_byte_order() is provided to help with this (see - above). - - -ERROR NAMES - - The errors PCRE_ERROR_BADUTF16_OFFSET and PCRE_ERROR_SHORTUTF16 corre- - spond to their 8-bit counterparts. The error PCRE_ERROR_BADMODE is - given when a compiled pattern is passed to a function that processes - patterns in the other mode, for example, if a pattern compiled with - pcre_compile() is passed to pcre16_exec(). - - There are new error codes whose names begin with PCRE_UTF16_ERR for - invalid UTF-16 strings, corresponding to the PCRE_UTF8_ERR codes for - UTF-8 strings that are described in the section entitled "Reason codes - for invalid UTF-8 strings" in the main pcreapi page. The UTF-16 errors - are: - - PCRE_UTF16_ERR1 Missing low surrogate at end of string - PCRE_UTF16_ERR2 Invalid low surrogate follows high surrogate - PCRE_UTF16_ERR3 Isolated low surrogate - PCRE_UTF16_ERR4 Non-character - - -ERROR TEXTS - - If there is an error while compiling a pattern, the error text that is - passed back by pcre16_compile() or pcre16_compile2() is still an 8-bit - character string, zero-terminated. - - -CALLOUTS - - The subject and mark fields in the callout block that is passed to a - callout function point to 16-bit vectors. - - -TESTING - - The pcretest program continues to operate with 8-bit input and output - files, but it can be used for testing the 16-bit library. If it is run - with the command line option -16, patterns and subject strings are con- - verted from 8-bit to 16-bit before being passed to PCRE, and the 16-bit - library functions are used instead of the 8-bit ones. Returned 16-bit - strings are converted to 8-bit for output. If both the 8-bit and the - 32-bit libraries were not compiled, pcretest defaults to 16-bit and the - -16 option is ignored. - - When PCRE is being built, the RunTest script that is called by "make - check" uses the pcretest -C option to discover which of the 8-bit, - 16-bit and 32-bit libraries has been built, and runs the tests appro- - priately. - - -NOT SUPPORTED IN 16-BIT MODE - - Not all the features of the 8-bit library are available with the 16-bit - library. The C++ and POSIX wrapper functions support only the 8-bit - library, and the pcregrep program is at present 8-bit only. - - -AUTHOR - - Philip Hazel - University Computing Service - Cambridge CB2 3QH, England. - - -REVISION - - Last updated: 12 May 2013 - Copyright (c) 1997-2013 University of Cambridge. ------------------------------------------------------------------------------- - - -PCRE(3) Library Functions Manual PCRE(3) - - - -NAME - PCRE - Perl-compatible regular expressions - - #include - - -PCRE 32-BIT API BASIC FUNCTIONS - - pcre32 *pcre32_compile(PCRE_SPTR32 pattern, int options, - const char **errptr, int *erroffset, - const unsigned char *tableptr); - - pcre32 *pcre32_compile2(PCRE_SPTR32 pattern, int options, - int *errorcodeptr, - const unsigned char *tableptr); - - pcre32_extra *pcre32_study(const pcre32 *code, int options, - const char **errptr); - - void pcre32_free_study(pcre32_extra *extra); - - int pcre32_exec(const pcre32 *code, const pcre32_extra *extra, - PCRE_SPTR32 subject, int length, int startoffset, - int options, int *ovector, int ovecsize); - - int pcre32_dfa_exec(const pcre32 *code, const pcre32_extra *extra, - PCRE_SPTR32 subject, int length, int startoffset, - int options, int *ovector, int ovecsize, - int *workspace, int wscount); - - -PCRE 32-BIT API STRING EXTRACTION FUNCTIONS - - int pcre32_copy_named_substring(const pcre32 *code, - PCRE_SPTR32 subject, int *ovector, - int stringcount, PCRE_SPTR32 stringname, - PCRE_UCHAR32 *buffer, int buffersize); - - int pcre32_copy_substring(PCRE_SPTR32 subject, int *ovector, - int stringcount, int stringnumber, PCRE_UCHAR32 *buffer, - int buffersize); - - int pcre32_get_named_substring(const pcre32 *code, - PCRE_SPTR32 subject, int *ovector, - int stringcount, PCRE_SPTR32 stringname, - PCRE_SPTR32 *stringptr); - - int pcre32_get_stringnumber(const pcre32 *code, - PCRE_SPTR32 name); - - int pcre32_get_stringtable_entries(const pcre32 *code, - PCRE_SPTR32 name, PCRE_UCHAR32 **first, PCRE_UCHAR32 **last); - - int pcre32_get_substring(PCRE_SPTR32 subject, int *ovector, - int stringcount, int stringnumber, - PCRE_SPTR32 *stringptr); - - int pcre32_get_substring_list(PCRE_SPTR32 subject, - int *ovector, int stringcount, PCRE_SPTR32 **listptr); - - void pcre32_free_substring(PCRE_SPTR32 stringptr); - - void pcre32_free_substring_list(PCRE_SPTR32 *stringptr); - - -PCRE 32-BIT API AUXILIARY FUNCTIONS - - pcre32_jit_stack *pcre32_jit_stack_alloc(int startsize, int maxsize); - - void pcre32_jit_stack_free(pcre32_jit_stack *stack); - - void pcre32_assign_jit_stack(pcre32_extra *extra, - pcre32_jit_callback callback, void *data); - - const unsigned char *pcre32_maketables(void); - - int pcre32_fullinfo(const pcre32 *code, const pcre32_extra *extra, - int what, void *where); - - int pcre32_refcount(pcre32 *code, int adjust); - - int pcre32_config(int what, void *where); - - const char *pcre32_version(void); - - int pcre32_pattern_to_host_byte_order(pcre32 *code, - pcre32_extra *extra, const unsigned char *tables); - - -PCRE 32-BIT API INDIRECTED FUNCTIONS - - void *(*pcre32_malloc)(size_t); - - void (*pcre32_free)(void *); - - void *(*pcre32_stack_malloc)(size_t); - - void (*pcre32_stack_free)(void *); - - int (*pcre32_callout)(pcre32_callout_block *); - - -PCRE 32-BIT API 32-BIT-ONLY FUNCTION - - int pcre32_utf32_to_host_byte_order(PCRE_UCHAR32 *output, - PCRE_SPTR32 input, int length, int *byte_order, - int keep_boms); - - -THE PCRE 32-BIT LIBRARY - - Starting with release 8.32, it is possible to compile a PCRE library - that supports 32-bit character strings, including UTF-32 strings, as - well as or instead of the original 8-bit library. This work was done by - Christian Persch, based on the work done by Zoltan Herczeg for the - 16-bit library. All three libraries contain identical sets of func- - tions, used in exactly the same way. Only the names of the functions - and the data types of their arguments and results are different. To - avoid over-complication and reduce the documentation maintenance load, - most of the PCRE documentation describes the 8-bit library, with only - occasional references to the 16-bit and 32-bit libraries. This page - describes what is different when you use the 32-bit library. - - WARNING: A single application can be linked with all or any of the - three libraries, but you must take care when processing any particular - pattern to use functions from just one library. For example, if you - want to study a pattern that was compiled with pcre32_compile(), you - must do so with pcre32_study(), not pcre_study(), and you must free the - study data with pcre32_free_study(). - - -THE HEADER FILE - - There is only one header file, pcre.h. It contains prototypes for all - the functions in all libraries, as well as definitions of flags, struc- - tures, error codes, etc. - - -THE LIBRARY NAME - - In Unix-like systems, the 32-bit library is called libpcre32, and can - normally be accesss by adding -lpcre32 to the command for linking an - application that uses PCRE. - - -STRING TYPES - - In the 8-bit library, strings are passed to PCRE library functions as - vectors of bytes with the C type "char *". In the 32-bit library, - strings are passed as vectors of unsigned 32-bit quantities. The macro - PCRE_UCHAR32 specifies an appropriate data type, and PCRE_SPTR32 is - defined as "const PCRE_UCHAR32 *". In very many environments, "unsigned - int" is a 32-bit data type. When PCRE is built, it defines PCRE_UCHAR32 - as "unsigned int", but checks that it really is a 32-bit data type. If - it is not, the build fails with an error message telling the maintainer - to modify the definition appropriately. - - -STRUCTURE TYPES - - The types of the opaque structures that are used for compiled 32-bit - patterns and JIT stacks are pcre32 and pcre32_jit_stack respectively. - The type of the user-accessible structure that is returned by - pcre32_study() is pcre32_extra, and the type of the structure that is - used for passing data to a callout function is pcre32_callout_block. - These structures contain the same fields, with the same names, as their - 8-bit counterparts. The only difference is that pointers to character - strings are 32-bit instead of 8-bit types. - - -32-BIT FUNCTIONS - - For every function in the 8-bit library there is a corresponding func- - tion in the 32-bit library with a name that starts with pcre32_ instead - of pcre_. The prototypes are listed above. In addition, there is one - extra function, pcre32_utf32_to_host_byte_order(). This is a utility - function that converts a UTF-32 character string to host byte order if - necessary. The other 32-bit functions expect the strings they are - passed to be in host byte order. - - The input and output arguments of pcre32_utf32_to_host_byte_order() may - point to the same address, that is, conversion in place is supported. - The output buffer must be at least as long as the input. - - The length argument specifies the number of 32-bit data units in the - input string; a negative value specifies a zero-terminated string. - - If byte_order is NULL, it is assumed that the string starts off in host - byte order. This may be changed by byte-order marks (BOMs) anywhere in - the string (commonly as the first character). - - If byte_order is not NULL, a non-zero value of the integer to which it - points means that the input starts off in host byte order, otherwise - the opposite order is assumed. Again, BOMs in the string can change - this. The final byte order is passed back at the end of processing. - - If keep_boms is not zero, byte-order mark characters (0xfeff) are - copied into the output string. Otherwise they are discarded. - - The result of the function is the number of 32-bit units placed into - the output buffer, including the zero terminator if the string was - zero-terminated. - - -SUBJECT STRING OFFSETS - - The lengths and starting offsets of subject strings must be specified - in 32-bit data units, and the offsets within subject strings that are - returned by the matching functions are in also 32-bit units rather than - bytes. - - -NAMED SUBPATTERNS - - The name-to-number translation table that is maintained for named sub- - patterns uses 32-bit characters. The pcre32_get_stringtable_entries() - function returns the length of each entry in the table as the number of - 32-bit data units. - - -OPTION NAMES - - There are two new general option names, PCRE_UTF32 and - PCRE_NO_UTF32_CHECK, which correspond to PCRE_UTF8 and - PCRE_NO_UTF8_CHECK in the 8-bit library. In fact, these new options - define the same bits in the options word. There is a discussion about - the validity of UTF-32 strings in the pcreunicode page. - - For the pcre32_config() function there is an option PCRE_CONFIG_UTF32 - that returns 1 if UTF-32 support is configured, otherwise 0. If this - option is given to pcre_config() or pcre16_config(), or if the - PCRE_CONFIG_UTF8 or PCRE_CONFIG_UTF16 option is given to pcre32_con- - fig(), the result is the PCRE_ERROR_BADOPTION error. - - -CHARACTER CODES - - In 32-bit mode, when PCRE_UTF32 is not set, character values are - treated in the same way as in 8-bit, non UTF-8 mode, except, of course, - that they can range from 0 to 0x7fffffff instead of 0 to 0xff. Charac- - ter types for characters less than 0xff can therefore be influenced by - the locale in the same way as before. Characters greater than 0xff - have only one case, and no "type" (such as letter or digit). - - In UTF-32 mode, the character code is Unicode, in the range 0 to - 0x10ffff, with the exception of values in the range 0xd800 to 0xdfff - because those are "surrogate" values that are ill-formed in UTF-32. - - A UTF-32 string can indicate its endianness by special code knows as a - byte-order mark (BOM). The PCRE functions do not handle this, expecting - strings to be in host byte order. A utility function called - pcre32_utf32_to_host_byte_order() is provided to help with this (see - above). - - -ERROR NAMES - - The error PCRE_ERROR_BADUTF32 corresponds to its 8-bit counterpart. - The error PCRE_ERROR_BADMODE is given when a compiled pattern is passed - to a function that processes patterns in the other mode, for example, - if a pattern compiled with pcre_compile() is passed to pcre32_exec(). - - There are new error codes whose names begin with PCRE_UTF32_ERR for - invalid UTF-32 strings, corresponding to the PCRE_UTF8_ERR codes for - UTF-8 strings that are described in the section entitled "Reason codes - for invalid UTF-8 strings" in the main pcreapi page. The UTF-32 errors - are: - - PCRE_UTF32_ERR1 Surrogate character (range from 0xd800 to 0xdfff) - PCRE_UTF32_ERR2 Non-character - PCRE_UTF32_ERR3 Character > 0x10ffff - - -ERROR TEXTS - - If there is an error while compiling a pattern, the error text that is - passed back by pcre32_compile() or pcre32_compile2() is still an 8-bit - character string, zero-terminated. - - -CALLOUTS - - The subject and mark fields in the callout block that is passed to a - callout function point to 32-bit vectors. - - -TESTING - - The pcretest program continues to operate with 8-bit input and output - files, but it can be used for testing the 32-bit library. If it is run - with the command line option -32, patterns and subject strings are con- - verted from 8-bit to 32-bit before being passed to PCRE, and the 32-bit - library functions are used instead of the 8-bit ones. Returned 32-bit - strings are converted to 8-bit for output. If both the 8-bit and the - 16-bit libraries were not compiled, pcretest defaults to 32-bit and the - -32 option is ignored. - - When PCRE is being built, the RunTest script that is called by "make - check" uses the pcretest -C option to discover which of the 8-bit, - 16-bit and 32-bit libraries has been built, and runs the tests appro- - priately. - - -NOT SUPPORTED IN 32-BIT MODE - - Not all the features of the 8-bit library are available with the 32-bit - library. The C++ and POSIX wrapper functions support only the 8-bit - library, and the pcregrep program is at present 8-bit only. - - -AUTHOR - - Philip Hazel - University Computing Service - Cambridge CB2 3QH, England. - - -REVISION - - Last updated: 12 May 2013 - Copyright (c) 1997-2013 University of Cambridge. ------------------------------------------------------------------------------- - - -PCREBUILD(3) Library Functions Manual PCREBUILD(3) - - - -NAME - PCRE - Perl-compatible regular expressions - -BUILDING PCRE - - PCRE is distributed with a configure script that can be used to build - the library in Unix-like environments using the applications known as - Autotools. Also in the distribution are files to support building - using CMake instead of configure. The text file README contains general - information about building with Autotools (some of which is repeated - below), and also has some comments about building on various operating - systems. There is a lot more information about building PCRE without - using Autotools (including information about using CMake and building - "by hand") in the text file called NON-AUTOTOOLS-BUILD. You should - consult this file as well as the README file if you are building in a - non-Unix-like environment. - - -PCRE BUILD-TIME OPTIONS - - The rest of this document describes the optional features of PCRE that - can be selected when the library is compiled. It assumes use of the - configure script, where the optional features are selected or dese- - lected by providing options to configure before running the make com- - mand. However, the same options can be selected in both Unix-like and - non-Unix-like environments using the GUI facility of cmake-gui if you - are using CMake instead of configure to build PCRE. - - If you are not using Autotools or CMake, option selection can be done - by editing the config.h file, or by passing parameter settings to the - compiler, as described in NON-AUTOTOOLS-BUILD. - - The complete list of options for configure (which includes the standard - ones such as the selection of the installation directory) can be - obtained by running - - ./configure --help - - The following sections include descriptions of options whose names - begin with --enable or --disable. These settings specify changes to the - defaults for the configure command. Because of the way that configure - works, --enable and --disable always come in pairs, so the complemen- - tary option always exists as well, but as it specifies the default, it - is not described. - - -BUILDING 8-BIT, 16-BIT AND 32-BIT LIBRARIES - - By default, a library called libpcre is built, containing functions - that take string arguments contained in vectors of bytes, either as - single-byte characters, or interpreted as UTF-8 strings. You can also - build a separate library, called libpcre16, in which strings are con- - tained in vectors of 16-bit data units and interpreted either as sin- - gle-unit characters or UTF-16 strings, by adding - - --enable-pcre16 - - to the configure command. You can also build yet another separate - library, called libpcre32, in which strings are contained in vectors of - 32-bit data units and interpreted either as single-unit characters or - UTF-32 strings, by adding - - --enable-pcre32 - - to the configure command. If you do not want the 8-bit library, add - - --disable-pcre8 - - as well. At least one of the three libraries must be built. Note that - the C++ and POSIX wrappers are for the 8-bit library only, and that - pcregrep is an 8-bit program. None of these are built if you select - only the 16-bit or 32-bit libraries. - - -BUILDING SHARED AND STATIC LIBRARIES - - The Autotools PCRE building process uses libtool to build both shared - and static libraries by default. You can suppress one of these by - adding one of - - --disable-shared - --disable-static - - to the configure command, as required. - - -C++ SUPPORT - - By default, if the 8-bit library is being built, the configure script - will search for a C++ compiler and C++ header files. If it finds them, - it automatically builds the C++ wrapper library (which supports only - 8-bit strings). You can disable this by adding - - --disable-cpp - - to the configure command. - - -UTF-8, UTF-16 AND UTF-32 SUPPORT - - To build PCRE with support for UTF Unicode character strings, add - - --enable-utf - - to the configure command. This setting applies to all three libraries, - adding support for UTF-8 to the 8-bit library, support for UTF-16 to - the 16-bit library, and support for UTF-32 to the to the 32-bit - library. There are no separate options for enabling UTF-8, UTF-16 and - UTF-32 independently because that would allow ridiculous settings such - as requesting UTF-16 support while building only the 8-bit library. It - is not possible to build one library with UTF support and another with- - out in the same configuration. (For backwards compatibility, --enable- - utf8 is a synonym of --enable-utf.) - - Of itself, this setting does not make PCRE treat strings as UTF-8, - UTF-16 or UTF-32. As well as compiling PCRE with this option, you also - have have to set the PCRE_UTF8, PCRE_UTF16 or PCRE_UTF32 option (as - appropriate) when you call one of the pattern compiling functions. - - If you set --enable-utf when compiling in an EBCDIC environment, PCRE - expects its input to be either ASCII or UTF-8 (depending on the run- - time option). It is not possible to support both EBCDIC and UTF-8 codes - in the same version of the library. Consequently, --enable-utf and - --enable-ebcdic are mutually exclusive. - - -UNICODE CHARACTER PROPERTY SUPPORT - - UTF support allows the libraries to process character codepoints up to - 0x10ffff in the strings that they handle. On its own, however, it does - not provide any facilities for accessing the properties of such charac- - ters. If you want to be able to use the pattern escapes \P, \p, and \X, - which refer to Unicode character properties, you must add - - --enable-unicode-properties - - to the configure command. This implies UTF support, even if you have - not explicitly requested it. - - Including Unicode property support adds around 30K of tables to the - PCRE library. Only the general category properties such as Lu and Nd - are supported. Details are given in the pcrepattern documentation. - - -JUST-IN-TIME COMPILER SUPPORT - - Just-in-time compiler support is included in the build by specifying - - --enable-jit - - This support is available only for certain hardware architectures. If - this option is set for an unsupported architecture, a compile time - error occurs. See the pcrejit documentation for a discussion of JIT - usage. When JIT support is enabled, pcregrep automatically makes use of - it, unless you add - - --disable-pcregrep-jit - - to the "configure" command. - - -CODE VALUE OF NEWLINE - - By default, PCRE interprets the linefeed (LF) character as indicating - the end of a line. This is the normal newline character on Unix-like - systems. You can compile PCRE to use carriage return (CR) instead, by - adding - - --enable-newline-is-cr - - to the configure command. There is also a --enable-newline-is-lf - option, which explicitly specifies linefeed as the newline character. - - Alternatively, you can specify that line endings are to be indicated by - the two character sequence CRLF. If you want this, add - - --enable-newline-is-crlf - - to the configure command. There is a fourth option, specified by - - --enable-newline-is-anycrlf - - which causes PCRE to recognize any of the three sequences CR, LF, or - CRLF as indicating a line ending. Finally, a fifth option, specified by - - --enable-newline-is-any - - causes PCRE to recognize any Unicode newline sequence. - - Whatever line ending convention is selected when PCRE is built can be - overridden when the library functions are called. At build time it is - conventional to use the standard for your operating system. - - -WHAT \R MATCHES - - By default, the sequence \R in a pattern matches any Unicode newline - sequence, whatever has been selected as the line ending sequence. If - you specify - - --enable-bsr-anycrlf - - the default is changed so that \R matches only CR, LF, or CRLF. What- - ever is selected when PCRE is built can be overridden when the library - functions are called. - - -POSIX MALLOC USAGE - - When the 8-bit library is called through the POSIX interface (see the - pcreposix documentation), additional working storage is required for - holding the pointers to capturing substrings, because PCRE requires - three integers per substring, whereas the POSIX interface provides only - two. If the number of expected substrings is small, the wrapper func- - tion uses space on the stack, because this is faster than using mal- - loc() for each call. The default threshold above which the stack is no - longer used is 10; it can be changed by adding a setting such as - - --with-posix-malloc-threshold=20 - - to the configure command. - - -HANDLING VERY LARGE PATTERNS - - Within a compiled pattern, offset values are used to point from one - part to another (for example, from an opening parenthesis to an alter- - nation metacharacter). By default, in the 8-bit and 16-bit libraries, - two-byte values are used for these offsets, leading to a maximum size - for a compiled pattern of around 64K. This is sufficient to handle all - but the most gigantic patterns. Nevertheless, some people do want to - process truly enormous patterns, so it is possible to compile PCRE to - use three-byte or four-byte offsets by adding a setting such as - - --with-link-size=3 - - to the configure command. The value given must be 2, 3, or 4. For the - 16-bit library, a value of 3 is rounded up to 4. In these libraries, - using longer offsets slows down the operation of PCRE because it has to - load additional data when handling them. For the 32-bit library the - value is always 4 and cannot be overridden; the value of --with-link- - size is ignored. - - -AVOIDING EXCESSIVE STACK USAGE - - When matching with the pcre_exec() function, PCRE implements backtrack- - ing by making recursive calls to an internal function called match(). - In environments where the size of the stack is limited, this can se- - verely limit PCRE's operation. (The Unix environment does not usually - suffer from this problem, but it may sometimes be necessary to increase - the maximum stack size. There is a discussion in the pcrestack docu- - mentation.) An alternative approach to recursion that uses memory from - the heap to remember data, instead of using recursive function calls, - has been implemented to work round the problem of limited stack size. - If you want to build a version of PCRE that works this way, add - - --disable-stack-for-recursion - - to the configure command. With this configuration, PCRE will use the - pcre_stack_malloc and pcre_stack_free variables to call memory manage- - ment functions. By default these point to malloc() and free(), but you - can replace the pointers so that your own functions are used instead. - - Separate functions are provided rather than using pcre_malloc and - pcre_free because the usage is very predictable: the block sizes - requested are always the same, and the blocks are always freed in - reverse order. A calling program might be able to implement optimized - functions that perform better than malloc() and free(). PCRE runs - noticeably more slowly when built in this way. This option affects only - the pcre_exec() function; it is not relevant for pcre_dfa_exec(). - - -LIMITING PCRE RESOURCE USAGE - - Internally, PCRE has a function called match(), which it calls repeat- - edly (sometimes recursively) when matching a pattern with the - pcre_exec() function. By controlling the maximum number of times this - function may be called during a single matching operation, a limit can - be placed on the resources used by a single call to pcre_exec(). The - limit can be changed at run time, as described in the pcreapi documen- - tation. The default is 10 million, but this can be changed by adding a - setting such as - - --with-match-limit=500000 - - to the configure command. This setting has no effect on the - pcre_dfa_exec() matching function. - - In some environments it is desirable to limit the depth of recursive - calls of match() more strictly than the total number of calls, in order - to restrict the maximum amount of stack (or heap, if --disable-stack- - for-recursion is specified) that is used. A second limit controls this; - it defaults to the value that is set for --with-match-limit, which - imposes no additional constraints. However, you can set a lower limit - by adding, for example, - - --with-match-limit-recursion=10000 - - to the configure command. This value can also be overridden at run - time. - - -CREATING CHARACTER TABLES AT BUILD TIME - - PCRE uses fixed tables for processing characters whose code values are - less than 256. By default, PCRE is built with a set of tables that are - distributed in the file pcre_chartables.c.dist. These tables are for - ASCII codes only. If you add - - --enable-rebuild-chartables - - to the configure command, the distributed tables are no longer used. - Instead, a program called dftables is compiled and run. This outputs - the source for new set of tables, created in the default locale of your - C run-time system. (This method of replacing the tables does not work - if you are cross compiling, because dftables is run on the local host. - If you need to create alternative tables when cross compiling, you will - have to do so "by hand".) - - -USING EBCDIC CODE - - PCRE assumes by default that it will run in an environment where the - character code is ASCII (or Unicode, which is a superset of ASCII). - This is the case for most computer operating systems. PCRE can, how- - ever, be compiled to run in an EBCDIC environment by adding - - --enable-ebcdic - - to the configure command. This setting implies --enable-rebuild-charta- - bles. You should only use it if you know that you are in an EBCDIC - environment (for example, an IBM mainframe operating system). The - --enable-ebcdic option is incompatible with --enable-utf. - - The EBCDIC character that corresponds to an ASCII LF is assumed to have - the value 0x15 by default. However, in some EBCDIC environments, 0x25 - is used. In such an environment you should use - - --enable-ebcdic-nl25 - - as well as, or instead of, --enable-ebcdic. The EBCDIC character for CR - has the same value as in ASCII, namely, 0x0d. Whichever of 0x15 and - 0x25 is not chosen as LF is made to correspond to the Unicode NEL char- - acter (which, in Unicode, is 0x85). - - The options that select newline behaviour, such as --enable-newline-is- - cr, and equivalent run-time options, refer to these character values in - an EBCDIC environment. - - -PCREGREP OPTIONS FOR COMPRESSED FILE SUPPORT - - By default, pcregrep reads all files as plain text. You can build it so - that it recognizes files whose names end in .gz or .bz2, and reads them - with libz or libbz2, respectively, by adding one or both of - - --enable-pcregrep-libz - --enable-pcregrep-libbz2 - - to the configure command. These options naturally require that the rel- - evant libraries are installed on your system. Configuration will fail - if they are not. - - -PCREGREP BUFFER SIZE - - pcregrep uses an internal buffer to hold a "window" on the file it is - scanning, in order to be able to output "before" and "after" lines when - it finds a match. The size of the buffer is controlled by a parameter - whose default value is 20K. The buffer itself is three times this size, - but because of the way it is used for holding "before" lines, the long- - est line that is guaranteed to be processable is the parameter size. - You can change the default parameter value by adding, for example, - - --with-pcregrep-bufsize=50K - - to the configure command. The caller of pcregrep can, however, override - this value by specifying a run-time option. - - -PCRETEST OPTION FOR LIBREADLINE SUPPORT - - If you add - - --enable-pcretest-libreadline - - to the configure command, pcretest is linked with the libreadline - library, and when its input is from a terminal, it reads it using the - readline() function. This provides line-editing and history facilities. - Note that libreadline is GPL-licensed, so if you distribute a binary of - pcretest linked in this way, there may be licensing issues. - - Setting this option causes the -lreadline option to be added to the - pcretest build. In many operating environments with a sytem-installed - libreadline this is sufficient. However, in some environments (e.g. if - an unmodified distribution version of readline is in use), some extra - configuration may be necessary. The INSTALL file for libreadline says - this: - - "Readline uses the termcap functions, but does not link with the - termcap or curses library itself, allowing applications which link - with readline the to choose an appropriate library." - - If your environment has not been set up so that an appropriate library - is automatically included, you may need to add something like - - LIBS="-ncurses" - - immediately before the configure command. - - -DEBUGGING WITH VALGRIND SUPPORT - - By adding the - - --enable-valgrind - - option to to the configure command, PCRE will use valgrind annotations - to mark certain memory regions as unaddressable. This allows it to - detect invalid memory accesses, and is mostly useful for debugging PCRE - itself. - - -CODE COVERAGE REPORTING - - If your C compiler is gcc, you can build a version of PCRE that can - generate a code coverage report for its test suite. To enable this, you - must install lcov version 1.6 or above. Then specify - - --enable-coverage - - to the configure command and build PCRE in the usual way. - - Note that using ccache (a caching C compiler) is incompatible with code - coverage reporting. If you have configured ccache to run automatically - on your system, you must set the environment variable - - CCACHE_DISABLE=1 - - before running make to build PCRE, so that ccache is not used. - - When --enable-coverage is used, the following addition targets are - added to the Makefile: - - make coverage - - This creates a fresh coverage report for the PCRE test suite. It is - equivalent to running "make coverage-reset", "make coverage-baseline", - "make check", and then "make coverage-report". - - make coverage-reset - - This zeroes the coverage counters, but does nothing else. - - make coverage-baseline - - This captures baseline coverage information. - - make coverage-report - - This creates the coverage report. - - make coverage-clean-report - - This removes the generated coverage report without cleaning the cover- - age data itself. - - make coverage-clean-data - - This removes the captured coverage data without removing the coverage - files created at compile time (*.gcno). - - make coverage-clean - - This cleans all coverage data including the generated coverage report. - For more information about code coverage, see the gcov and lcov docu- - mentation. - - -SEE ALSO - - pcreapi(3), pcre16, pcre32, pcre_config(3). - - -AUTHOR - - Philip Hazel - University Computing Service - Cambridge CB2 3QH, England. - - -REVISION - - Last updated: 12 May 2013 - Copyright (c) 1997-2013 University of Cambridge. ------------------------------------------------------------------------------- - - -PCREMATCHING(3) Library Functions Manual PCREMATCHING(3) - - - -NAME - PCRE - Perl-compatible regular expressions - -PCRE MATCHING ALGORITHMS - - This document describes the two different algorithms that are available - in PCRE for matching a compiled regular expression against a given sub- - ject string. The "standard" algorithm is the one provided by the - pcre_exec(), pcre16_exec() and pcre32_exec() functions. These work in - the same as as Perl's matching function, and provide a Perl-compatible - matching operation. The just-in-time (JIT) optimization that is - described in the pcrejit documentation is compatible with these func- - tions. - - An alternative algorithm is provided by the pcre_dfa_exec(), - pcre16_dfa_exec() and pcre32_dfa_exec() functions; they operate in a - different way, and are not Perl-compatible. This alternative has advan- - tages and disadvantages compared with the standard algorithm, and these - are described below. - - When there is only one possible way in which a given subject string can - match a pattern, the two algorithms give the same answer. A difference - arises, however, when there are multiple possibilities. For example, if - the pattern - - ^<.*> - - is matched against the string - - - - there are three possible answers. The standard algorithm finds only one - of them, whereas the alternative algorithm finds all three. - - -REGULAR EXPRESSIONS AS TREES - - The set of strings that are matched by a regular expression can be rep- - resented as a tree structure. An unlimited repetition in the pattern - makes the tree of infinite size, but it is still a tree. Matching the - pattern to a given subject string (from a given starting point) can be - thought of as a search of the tree. There are two ways to search a - tree: depth-first and breadth-first, and these correspond to the two - matching algorithms provided by PCRE. - - -THE STANDARD MATCHING ALGORITHM - - In the terminology of Jeffrey Friedl's book "Mastering Regular Expres- - sions", the standard algorithm is an "NFA algorithm". It conducts a - depth-first search of the pattern tree. That is, it proceeds along a - single path through the tree, checking that the subject matches what is - required. When there is a mismatch, the algorithm tries any alterna- - tives at the current point, and if they all fail, it backs up to the - previous branch point in the tree, and tries the next alternative - branch at that level. This often involves backing up (moving to the - left) in the subject string as well. The order in which repetition - branches are tried is controlled by the greedy or ungreedy nature of - the quantifier. - - If a leaf node is reached, a matching string has been found, and at - that point the algorithm stops. Thus, if there is more than one possi- - ble match, this algorithm returns the first one that it finds. Whether - this is the shortest, the longest, or some intermediate length depends - on the way the greedy and ungreedy repetition quantifiers are specified - in the pattern. - - Because it ends up with a single path through the tree, it is rela- - tively straightforward for this algorithm to keep track of the sub- - strings that are matched by portions of the pattern in parentheses. - This provides support for capturing parentheses and back references. - - -THE ALTERNATIVE MATCHING ALGORITHM - - This algorithm conducts a breadth-first search of the tree. Starting - from the first matching point in the subject, it scans the subject - string from left to right, once, character by character, and as it does - this, it remembers all the paths through the tree that represent valid - matches. In Friedl's terminology, this is a kind of "DFA algorithm", - though it is not implemented as a traditional finite state machine (it - keeps multiple states active simultaneously). - - Although the general principle of this matching algorithm is that it - scans the subject string only once, without backtracking, there is one - exception: when a lookaround assertion is encountered, the characters - following or preceding the current point have to be independently - inspected. - - The scan continues until either the end of the subject is reached, or - there are no more unterminated paths. At this point, terminated paths - represent the different matching possibilities (if there are none, the - match has failed). Thus, if there is more than one possible match, - this algorithm finds all of them, and in particular, it finds the long- - est. The matches are returned in decreasing order of length. There is - an option to stop the algorithm after the first match (which is neces- - sarily the shortest) is found. - - Note that all the matches that are found start at the same point in the - subject. If the pattern - - cat(er(pillar)?)? - - is matched against the string "the caterpillar catchment", the result - will be the three strings "caterpillar", "cater", and "cat" that start - at the fifth character of the subject. The algorithm does not automati- - cally move on to find matches that start at later positions. - - PCRE's "auto-possessification" optimization usually applies to charac- - ter repeats at the end of a pattern (as well as internally). For exam- - ple, the pattern "a\d+" is compiled as if it were "a\d++" because there - is no point even considering the possibility of backtracking into the - repeated digits. For DFA matching, this means that only one possible - match is found. If you really do want multiple matches in such cases, - either use an ungreedy repeat ("a\d+?") or set the PCRE_NO_AUTO_POSSESS - option when compiling. - - There are a number of features of PCRE regular expressions that are not - supported by the alternative matching algorithm. They are as follows: - - 1. Because the algorithm finds all possible matches, the greedy or - ungreedy nature of repetition quantifiers is not relevant. Greedy and - ungreedy quantifiers are treated in exactly the same way. However, pos- - sessive quantifiers can make a difference when what follows could also - match what is quantified, for example in a pattern like this: - - ^a++\w! - - This pattern matches "aaab!" but not "aaa!", which would be matched by - a non-possessive quantifier. Similarly, if an atomic group is present, - it is matched as if it were a standalone pattern at the current point, - and the longest match is then "locked in" for the rest of the overall - pattern. - - 2. When dealing with multiple paths through the tree simultaneously, it - is not straightforward to keep track of captured substrings for the - different matching possibilities, and PCRE's implementation of this - algorithm does not attempt to do this. This means that no captured sub- - strings are available. - - 3. Because no substrings are captured, back references within the pat- - tern are not supported, and cause errors if encountered. - - 4. For the same reason, conditional expressions that use a backrefer- - ence as the condition or test for a specific group recursion are not - supported. - - 5. Because many paths through the tree may be active, the \K escape - sequence, which resets the start of the match when encountered (but may - be on some paths and not on others), is not supported. It causes an - error if encountered. - - 6. Callouts are supported, but the value of the capture_top field is - always 1, and the value of the capture_last field is always -1. - - 7. The \C escape sequence, which (in the standard algorithm) always - matches a single data unit, even in UTF-8, UTF-16 or UTF-32 modes, is - not supported in these modes, because the alternative algorithm moves - through the subject string one character (not data unit) at a time, for - all active paths through the tree. - - 8. Except for (*FAIL), the backtracking control verbs such as (*PRUNE) - are not supported. (*FAIL) is supported, and behaves like a failing - negative assertion. - - -ADVANTAGES OF THE ALTERNATIVE ALGORITHM - - Using the alternative matching algorithm provides the following advan- - tages: - - 1. All possible matches (at a single point in the subject) are automat- - ically found, and in particular, the longest match is found. To find - more than one match using the standard algorithm, you have to do kludgy - things with callouts. - - 2. Because the alternative algorithm scans the subject string just - once, and never needs to backtrack (except for lookbehinds), it is pos- - sible to pass very long subject strings to the matching function in - several pieces, checking for partial matching each time. Although it is - possible to do multi-segment matching using the standard algorithm by - retaining partially matched substrings, it is more complicated. The - pcrepartial documentation gives details of partial matching and dis- - cusses multi-segment matching. - - -DISADVANTAGES OF THE ALTERNATIVE ALGORITHM - - The alternative algorithm suffers from a number of disadvantages: - - 1. It is substantially slower than the standard algorithm. This is - partly because it has to search for all possible matches, but is also - because it is less susceptible to optimization. - - 2. Capturing parentheses and back references are not supported. - - 3. Although atomic groups are supported, their use does not provide the - performance advantage that it does for the standard algorithm. - - -AUTHOR - - Philip Hazel - University Computing Service - Cambridge CB2 3QH, England. - - -REVISION - - Last updated: 12 November 2013 - Copyright (c) 1997-2012 University of Cambridge. ------------------------------------------------------------------------------- - - -PCREAPI(3) Library Functions Manual PCREAPI(3) - - - -NAME - PCRE - Perl-compatible regular expressions - - #include - - -PCRE NATIVE API BASIC FUNCTIONS - - pcre *pcre_compile(const char *pattern, int options, - const char **errptr, int *erroffset, - const unsigned char *tableptr); - - pcre *pcre_compile2(const char *pattern, int options, - int *errorcodeptr, - const char **errptr, int *erroffset, - const unsigned char *tableptr); - - pcre_extra *pcre_study(const pcre *code, int options, - const char **errptr); - - void pcre_free_study(pcre_extra *extra); - - int pcre_exec(const pcre *code, const pcre_extra *extra, - const char *subject, int length, int startoffset, - int options, int *ovector, int ovecsize); - - int pcre_dfa_exec(const pcre *code, const pcre_extra *extra, - const char *subject, int length, int startoffset, - int options, int *ovector, int ovecsize, - int *workspace, int wscount); - - -PCRE NATIVE API STRING EXTRACTION FUNCTIONS - - int pcre_copy_named_substring(const pcre *code, - const char *subject, int *ovector, - int stringcount, const char *stringname, - char *buffer, int buffersize); - - int pcre_copy_substring(const char *subject, int *ovector, - int stringcount, int stringnumber, char *buffer, - int buffersize); - - int pcre_get_named_substring(const pcre *code, - const char *subject, int *ovector, - int stringcount, const char *stringname, - const char **stringptr); - - int pcre_get_stringnumber(const pcre *code, - const char *name); - - int pcre_get_stringtable_entries(const pcre *code, - const char *name, char **first, char **last); - - int pcre_get_substring(const char *subject, int *ovector, - int stringcount, int stringnumber, - const char **stringptr); - - int pcre_get_substring_list(const char *subject, - int *ovector, int stringcount, const char ***listptr); - - void pcre_free_substring(const char *stringptr); - - void pcre_free_substring_list(const char **stringptr); - - -PCRE NATIVE API AUXILIARY FUNCTIONS - - int pcre_jit_exec(const pcre *code, const pcre_extra *extra, - const char *subject, int length, int startoffset, - int options, int *ovector, int ovecsize, - pcre_jit_stack *jstack); - - pcre_jit_stack *pcre_jit_stack_alloc(int startsize, int maxsize); - - void pcre_jit_stack_free(pcre_jit_stack *stack); - - void pcre_assign_jit_stack(pcre_extra *extra, - pcre_jit_callback callback, void *data); - - const unsigned char *pcre_maketables(void); - - int pcre_fullinfo(const pcre *code, const pcre_extra *extra, - int what, void *where); - - int pcre_refcount(pcre *code, int adjust); - - int pcre_config(int what, void *where); - - const char *pcre_version(void); - - int pcre_pattern_to_host_byte_order(pcre *code, - pcre_extra *extra, const unsigned char *tables); - - -PCRE NATIVE API INDIRECTED FUNCTIONS - - void *(*pcre_malloc)(size_t); - - void (*pcre_free)(void *); - - void *(*pcre_stack_malloc)(size_t); - - void (*pcre_stack_free)(void *); - - int (*pcre_callout)(pcre_callout_block *); - - int (*pcre_stack_guard)(void); - - -PCRE 8-BIT, 16-BIT, AND 32-BIT LIBRARIES - - As well as support for 8-bit character strings, PCRE also supports - 16-bit strings (from release 8.30) and 32-bit strings (from release - 8.32), by means of two additional libraries. They can be built as well - as, or instead of, the 8-bit library. To avoid too much complication, - this document describes the 8-bit versions of the functions, with only - occasional references to the 16-bit and 32-bit libraries. - - The 16-bit and 32-bit functions operate in the same way as their 8-bit - counterparts; they just use different data types for their arguments - and results, and their names start with pcre16_ or pcre32_ instead of - pcre_. For every option that has UTF8 in its name (for example, - PCRE_UTF8), there are corresponding 16-bit and 32-bit names with UTF8 - replaced by UTF16 or UTF32, respectively. This facility is in fact just - cosmetic; the 16-bit and 32-bit option names define the same bit val- - ues. - - References to bytes and UTF-8 in this document should be read as refer- - ences to 16-bit data units and UTF-16 when using the 16-bit library, or - 32-bit data units and UTF-32 when using the 32-bit library, unless - specified otherwise. More details of the specific differences for the - 16-bit and 32-bit libraries are given in the pcre16 and pcre32 pages. - - -PCRE API OVERVIEW - - PCRE has its own native API, which is described in this document. There - are also some wrapper functions (for the 8-bit library only) that cor- - respond to the POSIX regular expression API, but they do not give - access to all the functionality. They are described in the pcreposix - documentation. Both of these APIs define a set of C function calls. A - C++ wrapper (again for the 8-bit library only) is also distributed with - PCRE. It is documented in the pcrecpp page. - - The native API C function prototypes are defined in the header file - pcre.h, and on Unix-like systems the (8-bit) library itself is called - libpcre. It can normally be accessed by adding -lpcre to the command - for linking an application that uses PCRE. The header file defines the - macros PCRE_MAJOR and PCRE_MINOR to contain the major and minor release - numbers for the library. Applications can use these to include support - for different releases of PCRE. - - In a Windows environment, if you want to statically link an application - program against a non-dll pcre.a file, you must define PCRE_STATIC - before including pcre.h or pcrecpp.h, because otherwise the pcre_mal- - loc() and pcre_free() exported functions will be declared - __declspec(dllimport), with unwanted results. - - The functions pcre_compile(), pcre_compile2(), pcre_study(), and - pcre_exec() are used for compiling and matching regular expressions in - a Perl-compatible manner. A sample program that demonstrates the sim- - plest way of using them is provided in the file called pcredemo.c in - the PCRE source distribution. A listing of this program is given in the - pcredemo documentation, and the pcresample documentation describes how - to compile and run it. - - Just-in-time compiler support is an optional feature of PCRE that can - be built in appropriate hardware environments. It greatly speeds up the - matching performance of many patterns. Simple programs can easily - request that it be used if available, by setting an option that is - ignored when it is not relevant. More complicated programs might need - to make use of the functions pcre_jit_stack_alloc(), - pcre_jit_stack_free(), and pcre_assign_jit_stack() in order to control - the JIT code's memory usage. - - From release 8.32 there is also a direct interface for JIT execution, - which gives improved performance. The JIT-specific functions are dis- - cussed in the pcrejit documentation. - - A second matching function, pcre_dfa_exec(), which is not Perl-compati- - ble, is also provided. This uses a different algorithm for the match- - ing. The alternative algorithm finds all possible matches (at a given - point in the subject), and scans the subject just once (unless there - are lookbehind assertions). However, this algorithm does not return - captured substrings. A description of the two matching algorithms and - their advantages and disadvantages is given in the pcrematching docu- - mentation. - - In addition to the main compiling and matching functions, there are - convenience functions for extracting captured substrings from a subject - string that is matched by pcre_exec(). They are: - - pcre_copy_substring() - pcre_copy_named_substring() - pcre_get_substring() - pcre_get_named_substring() - pcre_get_substring_list() - pcre_get_stringnumber() - pcre_get_stringtable_entries() - - pcre_free_substring() and pcre_free_substring_list() are also provided, - to free the memory used for extracted strings. - - The function pcre_maketables() is used to build a set of character - tables in the current locale for passing to pcre_compile(), - pcre_exec(), or pcre_dfa_exec(). This is an optional facility that is - provided for specialist use. Most commonly, no special tables are - passed, in which case internal tables that are generated when PCRE is - built are used. - - The function pcre_fullinfo() is used to find out information about a - compiled pattern. The function pcre_version() returns a pointer to a - string containing the version of PCRE and its date of release. - - The function pcre_refcount() maintains a reference count in a data - block containing a compiled pattern. This is provided for the benefit - of object-oriented applications. - - The global variables pcre_malloc and pcre_free initially contain the - entry points of the standard malloc() and free() functions, respec- - tively. PCRE calls the memory management functions via these variables, - so a calling program can replace them if it wishes to intercept the - calls. This should be done before calling any PCRE functions. - - The global variables pcre_stack_malloc and pcre_stack_free are also - indirections to memory management functions. These special functions - are used only when PCRE is compiled to use the heap for remembering - data, instead of recursive function calls, when running the pcre_exec() - function. See the pcrebuild documentation for details of how to do - this. It is a non-standard way of building PCRE, for use in environ- - ments that have limited stacks. Because of the greater use of memory - management, it runs more slowly. Separate functions are provided so - that special-purpose external code can be used for this case. When - used, these functions always allocate memory blocks of the same size. - There is a discussion about PCRE's stack usage in the pcrestack docu- - mentation. - - The global variable pcre_callout initially contains NULL. It can be set - by the caller to a "callout" function, which PCRE will then call at - specified points during a matching operation. Details are given in the - pcrecallout documentation. - - The global variable pcre_stack_guard initially contains NULL. It can be - set by the caller to a function that is called by PCRE whenever it - starts to compile a parenthesized part of a pattern. When parentheses - are nested, PCRE uses recursive function calls, which use up the system - stack. This function is provided so that applications with restricted - stacks can force a compilation error if the stack runs out. The func- - tion should return zero if all is well, or non-zero to force an error. - - -NEWLINES - - PCRE supports five different conventions for indicating line breaks in - strings: a single CR (carriage return) character, a single LF (line- - feed) character, the two-character sequence CRLF, any of the three pre- - ceding, or any Unicode newline sequence. The Unicode newline sequences - are the three just mentioned, plus the single characters VT (vertical - tab, U+000B), FF (form feed, U+000C), NEL (next line, U+0085), LS (line - separator, U+2028), and PS (paragraph separator, U+2029). - - Each of the first three conventions is used by at least one operating - system as its standard newline sequence. When PCRE is built, a default - can be specified. The default default is LF, which is the Unix stan- - dard. When PCRE is run, the default can be overridden, either when a - pattern is compiled, or when it is matched. - - At compile time, the newline convention can be specified by the options - argument of pcre_compile(), or it can be specified by special text at - the start of the pattern itself; this overrides any other settings. See - the pcrepattern page for details of the special character sequences. - - In the PCRE documentation the word "newline" is used to mean "the char- - acter or pair of characters that indicate a line break". The choice of - newline convention affects the handling of the dot, circumflex, and - dollar metacharacters, the handling of #-comments in /x mode, and, when - CRLF is a recognized line ending sequence, the match position advance- - ment for a non-anchored pattern. There is more detail about this in the - section on pcre_exec() options below. - - The choice of newline convention does not affect the interpretation of - the \n or \r escape sequences, nor does it affect what \R matches, - which is controlled in a similar way, but by separate options. - - -MULTITHREADING - - The PCRE functions can be used in multi-threading applications, with - the proviso that the memory management functions pointed to by - pcre_malloc, pcre_free, pcre_stack_malloc, and pcre_stack_free, and the - callout and stack-checking functions pointed to by pcre_callout and - pcre_stack_guard, are shared by all threads. - - The compiled form of a regular expression is not altered during match- - ing, so the same compiled pattern can safely be used by several threads - at once. - - If the just-in-time optimization feature is being used, it needs sepa- - rate memory stack areas for each thread. See the pcrejit documentation - for more details. - - -SAVING PRECOMPILED PATTERNS FOR LATER USE - - The compiled form of a regular expression can be saved and re-used at a - later time, possibly by a different program, and even on a host other - than the one on which it was compiled. Details are given in the - pcreprecompile documentation, which includes a description of the - pcre_pattern_to_host_byte_order() function. However, compiling a regu- - lar expression with one version of PCRE for use with a different ver- - sion is not guaranteed to work and may cause crashes. - - -CHECKING BUILD-TIME OPTIONS - - int pcre_config(int what, void *where); - - The function pcre_config() makes it possible for a PCRE client to dis- - cover which optional features have been compiled into the PCRE library. - The pcrebuild documentation has more details about these optional fea- - tures. - - The first argument for pcre_config() is an integer, specifying which - information is required; the second argument is a pointer to a variable - into which the information is placed. The returned value is zero on - success, or the negative error code PCRE_ERROR_BADOPTION if the value - in the first argument is not recognized. The following information is - available: - - PCRE_CONFIG_UTF8 - - The output is an integer that is set to one if UTF-8 support is avail- - able; otherwise it is set to zero. This value should normally be given - to the 8-bit version of this function, pcre_config(). If it is given to - the 16-bit or 32-bit version of this function, the result is - PCRE_ERROR_BADOPTION. - - PCRE_CONFIG_UTF16 - - The output is an integer that is set to one if UTF-16 support is avail- - able; otherwise it is set to zero. This value should normally be given - to the 16-bit version of this function, pcre16_config(). If it is given - to the 8-bit or 32-bit version of this function, the result is - PCRE_ERROR_BADOPTION. - - PCRE_CONFIG_UTF32 - - The output is an integer that is set to one if UTF-32 support is avail- - able; otherwise it is set to zero. This value should normally be given - to the 32-bit version of this function, pcre32_config(). If it is given - to the 8-bit or 16-bit version of this function, the result is - PCRE_ERROR_BADOPTION. - - PCRE_CONFIG_UNICODE_PROPERTIES - - The output is an integer that is set to one if support for Unicode - character properties is available; otherwise it is set to zero. - - PCRE_CONFIG_JIT - - The output is an integer that is set to one if support for just-in-time - compiling is available; otherwise it is set to zero. - - PCRE_CONFIG_JITTARGET - - The output is a pointer to a zero-terminated "const char *" string. If - JIT support is available, the string contains the name of the architec- - ture for which the JIT compiler is configured, for example "x86 32bit - (little endian + unaligned)". If JIT support is not available, the - result is NULL. - - PCRE_CONFIG_NEWLINE - - The output is an integer whose value specifies the default character - sequence that is recognized as meaning "newline". The values that are - supported in ASCII/Unicode environments are: 10 for LF, 13 for CR, 3338 - for CRLF, -2 for ANYCRLF, and -1 for ANY. In EBCDIC environments, CR, - ANYCRLF, and ANY yield the same values. However, the value for LF is - normally 21, though some EBCDIC environments use 37. The corresponding - values for CRLF are 3349 and 3365. The default should normally corre- - spond to the standard sequence for your operating system. - - PCRE_CONFIG_BSR - - The output is an integer whose value indicates what character sequences - the \R escape sequence matches by default. A value of 0 means that \R - matches any Unicode line ending sequence; a value of 1 means that \R - matches only CR, LF, or CRLF. The default can be overridden when a pat- - tern is compiled or matched. - - PCRE_CONFIG_LINK_SIZE - - The output is an integer that contains the number of bytes used for - internal linkage in compiled regular expressions. For the 8-bit - library, the value can be 2, 3, or 4. For the 16-bit library, the value - is either 2 or 4 and is still a number of bytes. For the 32-bit - library, the value is either 2 or 4 and is still a number of bytes. The - default value of 2 is sufficient for all but the most massive patterns, - since it allows the compiled pattern to be up to 64K in size. Larger - values allow larger regular expressions to be compiled, at the expense - of slower matching. - - PCRE_CONFIG_POSIX_MALLOC_THRESHOLD - - The output is an integer that contains the threshold above which the - POSIX interface uses malloc() for output vectors. Further details are - given in the pcreposix documentation. - - PCRE_CONFIG_PARENS_LIMIT - - The output is a long integer that gives the maximum depth of nesting of - parentheses (of any kind) in a pattern. This limit is imposed to cap - the amount of system stack used when a pattern is compiled. It is spec- - ified when PCRE is built; the default is 250. This limit does not take - into account the stack that may already be used by the calling applica- - tion. For finer control over compilation stack usage, you can set a - pointer to an external checking function in pcre_stack_guard. - - PCRE_CONFIG_MATCH_LIMIT - - The output is a long integer that gives the default limit for the num- - ber of internal matching function calls in a pcre_exec() execution. - Further details are given with pcre_exec() below. - - PCRE_CONFIG_MATCH_LIMIT_RECURSION - - The output is a long integer that gives the default limit for the depth - of recursion when calling the internal matching function in a - pcre_exec() execution. Further details are given with pcre_exec() - below. - - PCRE_CONFIG_STACKRECURSE - - The output is an integer that is set to one if internal recursion when - running pcre_exec() is implemented by recursive function calls that use - the stack to remember their state. This is the usual way that PCRE is - compiled. The output is zero if PCRE was compiled to use blocks of data - on the heap instead of recursive function calls. In this case, - pcre_stack_malloc and pcre_stack_free are called to manage memory - blocks on the heap, thus avoiding the use of the stack. - - -COMPILING A PATTERN - - pcre *pcre_compile(const char *pattern, int options, - const char **errptr, int *erroffset, - const unsigned char *tableptr); - - pcre *pcre_compile2(const char *pattern, int options, - int *errorcodeptr, - const char **errptr, int *erroffset, - const unsigned char *tableptr); - - Either of the functions pcre_compile() or pcre_compile2() can be called - to compile a pattern into an internal form. The only difference between - the two interfaces is that pcre_compile2() has an additional argument, - errorcodeptr, via which a numerical error code can be returned. To - avoid too much repetition, we refer just to pcre_compile() below, but - the information applies equally to pcre_compile2(). - - The pattern is a C string terminated by a binary zero, and is passed in - the pattern argument. A pointer to a single block of memory that is - obtained via pcre_malloc is returned. This contains the compiled code - and related data. The pcre type is defined for the returned block; this - is a typedef for a structure whose contents are not externally defined. - It is up to the caller to free the memory (via pcre_free) when it is no - longer required. - - Although the compiled code of a PCRE regex is relocatable, that is, it - does not depend on memory location, the complete pcre data block is not - fully relocatable, because it may contain a copy of the tableptr argu- - ment, which is an address (see below). - - The options argument contains various bit settings that affect the com- - pilation. It should be zero if no options are required. The available - options are described below. Some of them (in particular, those that - are compatible with Perl, but some others as well) can also be set and - unset from within the pattern (see the detailed description in the - pcrepattern documentation). For those options that can be different in - different parts of the pattern, the contents of the options argument - specifies their settings at the start of compilation and execution. The - PCRE_ANCHORED, PCRE_BSR_xxx, PCRE_NEWLINE_xxx, PCRE_NO_UTF8_CHECK, and - PCRE_NO_START_OPTIMIZE options can be set at the time of matching as - well as at compile time. - - If errptr is NULL, pcre_compile() returns NULL immediately. Otherwise, - if compilation of a pattern fails, pcre_compile() returns NULL, and - sets the variable pointed to by errptr to point to a textual error mes- - sage. This is a static string that is part of the library. You must not - try to free it. Normally, the offset from the start of the pattern to - the data unit that was being processed when the error was discovered is - placed in the variable pointed to by erroffset, which must not be NULL - (if it is, an immediate error is given). However, for an invalid UTF-8 - or UTF-16 string, the offset is that of the first data unit of the - failing character. - - Some errors are not detected until the whole pattern has been scanned; - in these cases, the offset passed back is the length of the pattern. - Note that the offset is in data units, not characters, even in a UTF - mode. It may sometimes point into the middle of a UTF-8 or UTF-16 char- - acter. - - If pcre_compile2() is used instead of pcre_compile(), and the error- - codeptr argument is not NULL, a non-zero error code number is returned - via this argument in the event of an error. This is in addition to the - textual error message. Error codes and messages are listed below. - - If the final argument, tableptr, is NULL, PCRE uses a default set of - character tables that are built when PCRE is compiled, using the - default C locale. Otherwise, tableptr must be an address that is the - result of a call to pcre_maketables(). This value is stored with the - compiled pattern, and used again by pcre_exec() and pcre_dfa_exec() - when the pattern is matched. For more discussion, see the section on - locale support below. - - This code fragment shows a typical straightforward call to pcre_com- - pile(): - - pcre *re; - const char *error; - int erroffset; - re = pcre_compile( - "^A.*Z", /* the pattern */ - 0, /* default options */ - &error, /* for error message */ - &erroffset, /* for error offset */ - NULL); /* use default character tables */ - - The following names for option bits are defined in the pcre.h header - file: - - PCRE_ANCHORED - - If this bit is set, the pattern is forced to be "anchored", that is, it - is constrained to match only at the first matching point in the string - that is being searched (the "subject string"). This effect can also be - achieved by appropriate constructs in the pattern itself, which is the - only way to do it in Perl. - - PCRE_AUTO_CALLOUT - - If this bit is set, pcre_compile() automatically inserts callout items, - all with number 255, before each pattern item. For discussion of the - callout facility, see the pcrecallout documentation. - - PCRE_BSR_ANYCRLF - PCRE_BSR_UNICODE - - These options (which are mutually exclusive) control what the \R escape - sequence matches. The choice is either to match only CR, LF, or CRLF, - or to match any Unicode newline sequence. The default is specified when - PCRE is built. It can be overridden from within the pattern, or by set- - ting an option when a compiled pattern is matched. - - PCRE_CASELESS - - If this bit is set, letters in the pattern match both upper and lower - case letters. It is equivalent to Perl's /i option, and it can be - changed within a pattern by a (?i) option setting. In UTF-8 mode, PCRE - always understands the concept of case for characters whose values are - less than 128, so caseless matching is always possible. For characters - with higher values, the concept of case is supported if PCRE is com- - piled with Unicode property support, but not otherwise. If you want to - use caseless matching for characters 128 and above, you must ensure - that PCRE is compiled with Unicode property support as well as with - UTF-8 support. - - PCRE_DOLLAR_ENDONLY - - If this bit is set, a dollar metacharacter in the pattern matches only - at the end of the subject string. Without this option, a dollar also - matches immediately before a newline at the end of the string (but not - before any other newlines). The PCRE_DOLLAR_ENDONLY option is ignored - if PCRE_MULTILINE is set. There is no equivalent to this option in - Perl, and no way to set it within a pattern. - - PCRE_DOTALL - - If this bit is set, a dot metacharacter in the pattern matches a char- - acter of any value, including one that indicates a newline. However, it - only ever matches one character, even if newlines are coded as CRLF. - Without this option, a dot does not match when the current position is - at a newline. This option is equivalent to Perl's /s option, and it can - be changed within a pattern by a (?s) option setting. A negative class - such as [^a] always matches newline characters, independent of the set- - ting of this option. - - PCRE_DUPNAMES - - If this bit is set, names used to identify capturing subpatterns need - not be unique. This can be helpful for certain types of pattern when it - is known that only one instance of the named subpattern can ever be - matched. There are more details of named subpatterns below; see also - the pcrepattern documentation. - - PCRE_EXTENDED - - If this bit is set, most white space characters in the pattern are - totally ignored except when escaped or inside a character class. How- - ever, white space is not allowed within sequences such as (?> that - introduce various parenthesized subpatterns, nor within a numerical - quantifier such as {1,3}. However, ignorable white space is permitted - between an item and a following quantifier and between a quantifier and - a following + that indicates possessiveness. - - White space did not used to include the VT character (code 11), because - Perl did not treat this character as white space. However, Perl changed - at release 5.18, so PCRE followed at release 8.34, and VT is now - treated as white space. - - PCRE_EXTENDED also causes characters between an unescaped # outside a - character class and the next newline, inclusive, to be ignored. - PCRE_EXTENDED is equivalent to Perl's /x option, and it can be changed - within a pattern by a (?x) option setting. - - Which characters are interpreted as newlines is controlled by the - options passed to pcre_compile() or by a special sequence at the start - of the pattern, as described in the section entitled "Newline conven- - tions" in the pcrepattern documentation. Note that the end of this type - of comment is a literal newline sequence in the pattern; escape - sequences that happen to represent a newline do not count. - - This option makes it possible to include comments inside complicated - patterns. Note, however, that this applies only to data characters. - White space characters may never appear within special character - sequences in a pattern, for example within the sequence (?( that intro- - duces a conditional subpattern. - - PCRE_EXTRA - - This option was invented in order to turn on additional functionality - of PCRE that is incompatible with Perl, but it is currently of very - little use. When set, any backslash in a pattern that is followed by a - letter that has no special meaning causes an error, thus reserving - these combinations for future expansion. By default, as in Perl, a - backslash followed by a letter with no special meaning is treated as a - literal. (Perl can, however, be persuaded to give an error for this, by - running it with the -w option.) There are at present no other features - controlled by this option. It can also be set by a (?X) option setting - within a pattern. - - PCRE_FIRSTLINE - - If this option is set, an unanchored pattern is required to match - before or at the first newline in the subject string, though the - matched text may continue over the newline. - - PCRE_JAVASCRIPT_COMPAT - - If this option is set, PCRE's behaviour is changed in some ways so that - it is compatible with JavaScript rather than Perl. The changes are as - follows: - - (1) A lone closing square bracket in a pattern causes a compile-time - error, because this is illegal in JavaScript (by default it is treated - as a data character). Thus, the pattern AB]CD becomes illegal when this - option is set. - - (2) At run time, a back reference to an unset subpattern group matches - an empty string (by default this causes the current matching alterna- - tive to fail). A pattern such as (\1)(a) succeeds when this option is - set (assuming it can find an "a" in the subject), whereas it fails by - default, for Perl compatibility. - - (3) \U matches an upper case "U" character; by default \U causes a com- - pile time error (Perl uses \U to upper case subsequent characters). - - (4) \u matches a lower case "u" character unless it is followed by four - hexadecimal digits, in which case the hexadecimal number defines the - code point to match. By default, \u causes a compile time error (Perl - uses it to upper case the following character). - - (5) \x matches a lower case "x" character unless it is followed by two - hexadecimal digits, in which case the hexadecimal number defines the - code point to match. By default, as in Perl, a hexadecimal number is - always expected after \x, but it may have zero, one, or two digits (so, - for example, \xz matches a binary zero character followed by z). - - PCRE_MULTILINE - - By default, for the purposes of matching "start of line" and "end of - line", PCRE treats the subject string as consisting of a single line of - characters, even if it actually contains newlines. The "start of line" - metacharacter (^) matches only at the start of the string, and the "end - of line" metacharacter ($) matches only at the end of the string, or - before a terminating newline (except when PCRE_DOLLAR_ENDONLY is set). - Note, however, that unless PCRE_DOTALL is set, the "any character" - metacharacter (.) does not match at a newline. This behaviour (for ^, - $, and dot) is the same as Perl. - - When PCRE_MULTILINE it is set, the "start of line" and "end of line" - constructs match immediately following or immediately before internal - newlines in the subject string, respectively, as well as at the very - start and end. This is equivalent to Perl's /m option, and it can be - changed within a pattern by a (?m) option setting. If there are no new- - lines in a subject string, or no occurrences of ^ or $ in a pattern, - setting PCRE_MULTILINE has no effect. - - PCRE_NEVER_UTF - - This option locks out interpretation of the pattern as UTF-8 (or UTF-16 - or UTF-32 in the 16-bit and 32-bit libraries). In particular, it pre- - vents the creator of the pattern from switching to UTF interpretation - by starting the pattern with (*UTF). This may be useful in applications - that process patterns from external sources. The combination of - PCRE_UTF8 and PCRE_NEVER_UTF also causes an error. - - PCRE_NEWLINE_CR - PCRE_NEWLINE_LF - PCRE_NEWLINE_CRLF - PCRE_NEWLINE_ANYCRLF - PCRE_NEWLINE_ANY - - These options override the default newline definition that was chosen - when PCRE was built. Setting the first or the second specifies that a - newline is indicated by a single character (CR or LF, respectively). - Setting PCRE_NEWLINE_CRLF specifies that a newline is indicated by the - two-character CRLF sequence. Setting PCRE_NEWLINE_ANYCRLF specifies - that any of the three preceding sequences should be recognized. Setting - PCRE_NEWLINE_ANY specifies that any Unicode newline sequence should be - recognized. - - In an ASCII/Unicode environment, the Unicode newline sequences are the - three just mentioned, plus the single characters VT (vertical tab, - U+000B), FF (form feed, U+000C), NEL (next line, U+0085), LS (line sep- - arator, U+2028), and PS (paragraph separator, U+2029). For the 8-bit - library, the last two are recognized only in UTF-8 mode. - - When PCRE is compiled to run in an EBCDIC (mainframe) environment, the - code for CR is 0x0d, the same as ASCII. However, the character code for - LF is normally 0x15, though in some EBCDIC environments 0x25 is used. - Whichever of these is not LF is made to correspond to Unicode's NEL - character. EBCDIC codes are all less than 256. For more details, see - the pcrebuild documentation. - - The newline setting in the options word uses three bits that are - treated as a number, giving eight possibilities. Currently only six are - used (default plus the five values above). This means that if you set - more than one newline option, the combination may or may not be sensi- - ble. For example, PCRE_NEWLINE_CR with PCRE_NEWLINE_LF is equivalent to - PCRE_NEWLINE_CRLF, but other combinations may yield unused numbers and - cause an error. - - The only time that a line break in a pattern is specially recognized - when compiling is when PCRE_EXTENDED is set. CR and LF are white space - characters, and so are ignored in this mode. Also, an unescaped # out- - side a character class indicates a comment that lasts until after the - next line break sequence. In other circumstances, line break sequences - in patterns are treated as literal data. - - The newline option that is set at compile time becomes the default that - is used for pcre_exec() and pcre_dfa_exec(), but it can be overridden. - - PCRE_NO_AUTO_CAPTURE - - If this option is set, it disables the use of numbered capturing paren- - theses in the pattern. Any opening parenthesis that is not followed by - ? behaves as if it were followed by ?: but named parentheses can still - be used for capturing (and they acquire numbers in the usual way). - There is no equivalent of this option in Perl. - - PCRE_NO_AUTO_POSSESS - - If this option is set, it disables "auto-possessification". This is an - optimization that, for example, turns a+b into a++b in order to avoid - backtracks into a+ that can never be successful. However, if callouts - are in use, auto-possessification means that some of them are never - taken. You can set this option if you want the matching functions to do - a full unoptimized search and run all the callouts, but it is mainly - provided for testing purposes. - - PCRE_NO_START_OPTIMIZE - - This is an option that acts at matching time; that is, it is really an - option for pcre_exec() or pcre_dfa_exec(). If it is set at compile - time, it is remembered with the compiled pattern and assumed at match- - ing time. This is necessary if you want to use JIT execution, because - the JIT compiler needs to know whether or not this option is set. For - details see the discussion of PCRE_NO_START_OPTIMIZE below. - - PCRE_UCP - - This option changes the way PCRE processes \B, \b, \D, \d, \S, \s, \W, - \w, and some of the POSIX character classes. By default, only ASCII - characters are recognized, but if PCRE_UCP is set, Unicode properties - are used instead to classify characters. More details are given in the - section on generic character types in the pcrepattern page. If you set - PCRE_UCP, matching one of the items it affects takes much longer. The - option is available only if PCRE has been compiled with Unicode prop- - erty support. - - PCRE_UNGREEDY - - This option inverts the "greediness" of the quantifiers so that they - are not greedy by default, but become greedy if followed by "?". It is - not compatible with Perl. It can also be set by a (?U) option setting - within the pattern. - - PCRE_UTF8 - - This option causes PCRE to regard both the pattern and the subject as - strings of UTF-8 characters instead of single-byte strings. However, it - is available only when PCRE is built to include UTF support. If not, - the use of this option provokes an error. Details of how this option - changes the behaviour of PCRE are given in the pcreunicode page. - - PCRE_NO_UTF8_CHECK - - When PCRE_UTF8 is set, the validity of the pattern as a UTF-8 string is - automatically checked. There is a discussion about the validity of - UTF-8 strings in the pcreunicode page. If an invalid UTF-8 sequence is - found, pcre_compile() returns an error. If you already know that your - pattern is valid, and you want to skip this check for performance rea- - sons, you can set the PCRE_NO_UTF8_CHECK option. When it is set, the - effect of passing an invalid UTF-8 string as a pattern is undefined. It - may cause your program to crash or loop. Note that this option can also - be passed to pcre_exec() and pcre_dfa_exec(), to suppress the validity - checking of subject strings only. If the same string is being matched - many times, the option can be safely set for the second and subsequent - matchings to improve performance. - - -COMPILATION ERROR CODES - - The following table lists the error codes than may be returned by - pcre_compile2(), along with the error messages that may be returned by - both compiling functions. Note that error messages are always 8-bit - ASCII strings, even in 16-bit or 32-bit mode. As PCRE has developed, - some error codes have fallen out of use. To avoid confusion, they have - not been re-used. - - 0 no error - 1 \ at end of pattern - 2 \c at end of pattern - 3 unrecognized character follows \ - 4 numbers out of order in {} quantifier - 5 number too big in {} quantifier - 6 missing terminating ] for character class - 7 invalid escape sequence in character class - 8 range out of order in character class - 9 nothing to repeat - 10 [this code is not in use] - 11 internal error: unexpected repeat - 12 unrecognized character after (? or (?- - 13 POSIX named classes are supported only within a class - 14 missing ) - 15 reference to non-existent subpattern - 16 erroffset passed as NULL - 17 unknown option bit(s) set - 18 missing ) after comment - 19 [this code is not in use] - 20 regular expression is too large - 21 failed to get memory - 22 unmatched parentheses - 23 internal error: code overflow - 24 unrecognized character after (?< - 25 lookbehind assertion is not fixed length - 26 malformed number or name after (?( - 27 conditional group contains more than two branches - 28 assertion expected after (?( - 29 (?R or (?[+-]digits must be followed by ) - 30 unknown POSIX class name - 31 POSIX collating elements are not supported - 32 this version of PCRE is compiled without UTF support - 33 [this code is not in use] - 34 character value in \x{} or \o{} is too large - 35 invalid condition (?(0) - 36 \C not allowed in lookbehind assertion - 37 PCRE does not support \L, \l, \N{name}, \U, or \u - 38 number after (?C is > 255 - 39 closing ) for (?C expected - 40 recursive call could loop indefinitely - 41 unrecognized character after (?P - 42 syntax error in subpattern name (missing terminator) - 43 two named subpatterns have the same name - 44 invalid UTF-8 string (specifically UTF-8) - 45 support for \P, \p, and \X has not been compiled - 46 malformed \P or \p sequence - 47 unknown property name after \P or \p - 48 subpattern name is too long (maximum 32 characters) - 49 too many named subpatterns (maximum 10000) - 50 [this code is not in use] - 51 octal value is greater than \377 in 8-bit non-UTF-8 mode - 52 internal error: overran compiling workspace - 53 internal error: previously-checked referenced subpattern - not found - 54 DEFINE group contains more than one branch - 55 repeating a DEFINE group is not allowed - 56 inconsistent NEWLINE options - 57 \g is not followed by a braced, angle-bracketed, or quoted - name/number or by a plain number - 58 a numbered reference must not be zero - 59 an argument is not allowed for (*ACCEPT), (*FAIL), or (*COMMIT) - 60 (*VERB) not recognized or malformed - 61 number is too big - 62 subpattern name expected - 63 digit expected after (?+ - 64 ] is an invalid data character in JavaScript compatibility mode - 65 different names for subpatterns of the same number are - not allowed - 66 (*MARK) must have an argument - 67 this version of PCRE is not compiled with Unicode property - support - 68 \c must be followed by an ASCII character - 69 \k is not followed by a braced, angle-bracketed, or quoted name - 70 internal error: unknown opcode in find_fixedlength() - 71 \N is not supported in a class - 72 too many forward references - 73 disallowed Unicode code point (>= 0xd800 && <= 0xdfff) - 74 invalid UTF-16 string (specifically UTF-16) - 75 name is too long in (*MARK), (*PRUNE), (*SKIP), or (*THEN) - 76 character value in \u.... sequence is too large - 77 invalid UTF-32 string (specifically UTF-32) - 78 setting UTF is disabled by the application - 79 non-hex character in \x{} (closing brace missing?) - 80 non-octal character in \o{} (closing brace missing?) - 81 missing opening brace after \o - 82 parentheses are too deeply nested - 83 invalid range in character class - 84 group name must start with a non-digit - 85 parentheses are too deeply nested (stack check) - - The numbers 32 and 10000 in errors 48 and 49 are defaults; different - values may be used if the limits were changed when PCRE was built. - - -STUDYING A PATTERN - - pcre_extra *pcre_study(const pcre *code, int options, - const char **errptr); - - If a compiled pattern is going to be used several times, it is worth - spending more time analyzing it in order to speed up the time taken for - matching. The function pcre_study() takes a pointer to a compiled pat- - tern as its first argument. If studying the pattern produces additional - information that will help speed up matching, pcre_study() returns a - pointer to a pcre_extra block, in which the study_data field points to - the results of the study. - - The returned value from pcre_study() can be passed directly to - pcre_exec() or pcre_dfa_exec(). However, a pcre_extra block also con- - tains other fields that can be set by the caller before the block is - passed; these are described below in the section on matching a pattern. - - If studying the pattern does not produce any useful information, - pcre_study() returns NULL by default. In that circumstance, if the - calling program wants to pass any of the other fields to pcre_exec() or - pcre_dfa_exec(), it must set up its own pcre_extra block. However, if - pcre_study() is called with the PCRE_STUDY_EXTRA_NEEDED option, it - returns a pcre_extra block even if studying did not find any additional - information. It may still return NULL, however, if an error occurs in - pcre_study(). - - The second argument of pcre_study() contains option bits. There are - three further options in addition to PCRE_STUDY_EXTRA_NEEDED: - - PCRE_STUDY_JIT_COMPILE - PCRE_STUDY_JIT_PARTIAL_HARD_COMPILE - PCRE_STUDY_JIT_PARTIAL_SOFT_COMPILE - - If any of these are set, and the just-in-time compiler is available, - the pattern is further compiled into machine code that executes much - faster than the pcre_exec() interpretive matching function. If the - just-in-time compiler is not available, these options are ignored. All - undefined bits in the options argument must be zero. - - JIT compilation is a heavyweight optimization. It can take some time - for patterns to be analyzed, and for one-off matches and simple pat- - terns the benefit of faster execution might be offset by a much slower - study time. Not all patterns can be optimized by the JIT compiler. For - those that cannot be handled, matching automatically falls back to the - pcre_exec() interpreter. For more details, see the pcrejit documenta- - tion. - - The third argument for pcre_study() is a pointer for an error message. - If studying succeeds (even if no data is returned), the variable it - points to is set to NULL. Otherwise it is set to point to a textual - error message. This is a static string that is part of the library. You - must not try to free it. You should test the error pointer for NULL - after calling pcre_study(), to be sure that it has run successfully. - - When you are finished with a pattern, you can free the memory used for - the study data by calling pcre_free_study(). This function was added to - the API for release 8.20. For earlier versions, the memory could be - freed with pcre_free(), just like the pattern itself. This will still - work in cases where JIT optimization is not used, but it is advisable - to change to the new function when convenient. - - This is a typical way in which pcre_study() is used (except that in a - real application there should be tests for errors): - - int rc; - pcre *re; - pcre_extra *sd; - re = pcre_compile("pattern", 0, &error, &erroroffset, NULL); - sd = pcre_study( - re, /* result of pcre_compile() */ - 0, /* no options */ - &error); /* set to NULL or points to a message */ - rc = pcre_exec( /* see below for details of pcre_exec() options */ - re, sd, "subject", 7, 0, 0, ovector, 30); - ... - pcre_free_study(sd); - pcre_free(re); - - Studying a pattern does two things: first, a lower bound for the length - of subject string that is needed to match the pattern is computed. This - does not mean that there are any strings of that length that match, but - it does guarantee that no shorter strings match. The value is used to - avoid wasting time by trying to match strings that are shorter than the - lower bound. You can find out the value in a calling program via the - pcre_fullinfo() function. - - Studying a pattern is also useful for non-anchored patterns that do not - have a single fixed starting character. A bitmap of possible starting - bytes is created. This speeds up finding a position in the subject at - which to start matching. (In 16-bit mode, the bitmap is used for 16-bit - values less than 256. In 32-bit mode, the bitmap is used for 32-bit - values less than 256.) - - These two optimizations apply to both pcre_exec() and pcre_dfa_exec(), - and the information is also used by the JIT compiler. The optimiza- - tions can be disabled by setting the PCRE_NO_START_OPTIMIZE option. - You might want to do this if your pattern contains callouts or (*MARK) - and you want to make use of these facilities in cases where matching - fails. - - PCRE_NO_START_OPTIMIZE can be specified at either compile time or exe- - cution time. However, if PCRE_NO_START_OPTIMIZE is passed to - pcre_exec(), (that is, after any JIT compilation has happened) JIT exe- - cution is disabled. For JIT execution to work with PCRE_NO_START_OPTI- - MIZE, the option must be set at compile time. - - There is a longer discussion of PCRE_NO_START_OPTIMIZE below. - - -LOCALE SUPPORT - - PCRE handles caseless matching, and determines whether characters are - letters, digits, or whatever, by reference to a set of tables, indexed - by character code point. When running in UTF-8 mode, or in the 16- or - 32-bit libraries, this applies only to characters with code points less - than 256. By default, higher-valued code points never match escapes - such as \w or \d. However, if PCRE is built with Unicode property sup- - port, all characters can be tested with \p and \P, or, alternatively, - the PCRE_UCP option can be set when a pattern is compiled; this causes - \w and friends to use Unicode property support instead of the built-in - tables. - - The use of locales with Unicode is discouraged. If you are handling - characters with code points greater than 128, you should either use - Unicode support, or use locales, but not try to mix the two. - - PCRE contains an internal set of tables that are used when the final - argument of pcre_compile() is NULL. These are sufficient for many - applications. Normally, the internal tables recognize only ASCII char- - acters. However, when PCRE is built, it is possible to cause the inter- - nal tables to be rebuilt in the default "C" locale of the local system, - which may cause them to be different. - - The internal tables can always be overridden by tables supplied by the - application that calls PCRE. These may be created in a different locale - from the default. As more and more applications change to using Uni- - code, the need for this locale support is expected to die away. - - External tables are built by calling the pcre_maketables() function, - which has no arguments, in the relevant locale. The result can then be - passed to pcre_compile() as often as necessary. For example, to build - and use tables that are appropriate for the French locale (where - accented characters with values greater than 128 are treated as let- - ters), the following code could be used: - - setlocale(LC_CTYPE, "fr_FR"); - tables = pcre_maketables(); - re = pcre_compile(..., tables); - - The locale name "fr_FR" is used on Linux and other Unix-like systems; - if you are using Windows, the name for the French locale is "french". - - When pcre_maketables() runs, the tables are built in memory that is - obtained via pcre_malloc. It is the caller's responsibility to ensure - that the memory containing the tables remains available for as long as - it is needed. - - The pointer that is passed to pcre_compile() is saved with the compiled - pattern, and the same tables are used via this pointer by pcre_study() - and also by pcre_exec() and pcre_dfa_exec(). Thus, for any single pat- - tern, compilation, studying and matching all happen in the same locale, - but different patterns can be processed in different locales. - - It is possible to pass a table pointer or NULL (indicating the use of - the internal tables) to pcre_exec() or pcre_dfa_exec() (see the discus- - sion below in the section on matching a pattern). This facility is pro- - vided for use with pre-compiled patterns that have been saved and - reloaded. Character tables are not saved with patterns, so if a non- - standard table was used at compile time, it must be provided again when - the reloaded pattern is matched. Attempting to use this facility to - match a pattern in a different locale from the one in which it was com- - piled is likely to lead to anomalous (usually incorrect) results. - - -INFORMATION ABOUT A PATTERN - - int pcre_fullinfo(const pcre *code, const pcre_extra *extra, - int what, void *where); - - The pcre_fullinfo() function returns information about a compiled pat- - tern. It replaces the pcre_info() function, which was removed from the - library at version 8.30, after more than 10 years of obsolescence. - - The first argument for pcre_fullinfo() is a pointer to the compiled - pattern. The second argument is the result of pcre_study(), or NULL if - the pattern was not studied. The third argument specifies which piece - of information is required, and the fourth argument is a pointer to a - variable to receive the data. The yield of the function is zero for - success, or one of the following negative numbers: - - PCRE_ERROR_NULL the argument code was NULL - the argument where was NULL - PCRE_ERROR_BADMAGIC the "magic number" was not found - PCRE_ERROR_BADENDIANNESS the pattern was compiled with different - endianness - PCRE_ERROR_BADOPTION the value of what was invalid - PCRE_ERROR_UNSET the requested field is not set - - The "magic number" is placed at the start of each compiled pattern as - an simple check against passing an arbitrary memory pointer. The endi- - anness error can occur if a compiled pattern is saved and reloaded on a - different host. Here is a typical call of pcre_fullinfo(), to obtain - the length of the compiled pattern: - - int rc; - size_t length; - rc = pcre_fullinfo( - re, /* result of pcre_compile() */ - sd, /* result of pcre_study(), or NULL */ - PCRE_INFO_SIZE, /* what is required */ - &length); /* where to put the data */ - - The possible values for the third argument are defined in pcre.h, and - are as follows: - - PCRE_INFO_BACKREFMAX - - Return the number of the highest back reference in the pattern. The - fourth argument should point to an int variable. Zero is returned if - there are no back references. - - PCRE_INFO_CAPTURECOUNT - - Return the number of capturing subpatterns in the pattern. The fourth - argument should point to an int variable. - - PCRE_INFO_DEFAULT_TABLES - - Return a pointer to the internal default character tables within PCRE. - The fourth argument should point to an unsigned char * variable. This - information call is provided for internal use by the pcre_study() func- - tion. External callers can cause PCRE to use its internal tables by - passing a NULL table pointer. - - PCRE_INFO_FIRSTBYTE (deprecated) - - Return information about the first data unit of any matched string, for - a non-anchored pattern. The name of this option refers to the 8-bit - library, where data units are bytes. The fourth argument should point - to an int variable. Negative values are used for special cases. How- - ever, this means that when the 32-bit library is in non-UTF-32 mode, - the full 32-bit range of characters cannot be returned. For this rea- - son, this value is deprecated; use PCRE_INFO_FIRSTCHARACTERFLAGS and - PCRE_INFO_FIRSTCHARACTER instead. - - If there is a fixed first value, for example, the letter "c" from a - pattern such as (cat|cow|coyote), its value is returned. In the 8-bit - library, the value is always less than 256. In the 16-bit library the - value can be up to 0xffff. In the 32-bit library the value can be up to - 0x10ffff. - - If there is no fixed first value, and if either - - (a) the pattern was compiled with the PCRE_MULTILINE option, and every - branch starts with "^", or - - (b) every branch of the pattern starts with ".*" and PCRE_DOTALL is not - set (if it were set, the pattern would be anchored), - - -1 is returned, indicating that the pattern matches only at the start - of a subject string or after any newline within the string. Otherwise - -2 is returned. For anchored patterns, -2 is returned. - - PCRE_INFO_FIRSTCHARACTER - - Return the value of the first data unit (non-UTF character) of any - matched string in the situation where PCRE_INFO_FIRSTCHARACTERFLAGS - returns 1; otherwise return 0. The fourth argument should point to an - uint_t variable. - - In the 8-bit library, the value is always less than 256. In the 16-bit - library the value can be up to 0xffff. In the 32-bit library in UTF-32 - mode the value can be up to 0x10ffff, and up to 0xffffffff when not - using UTF-32 mode. - - PCRE_INFO_FIRSTCHARACTERFLAGS - - Return information about the first data unit of any matched string, for - a non-anchored pattern. The fourth argument should point to an int - variable. - - If there is a fixed first value, for example, the letter "c" from a - pattern such as (cat|cow|coyote), 1 is returned, and the character - value can be retrieved using PCRE_INFO_FIRSTCHARACTER. If there is no - fixed first value, and if either - - (a) the pattern was compiled with the PCRE_MULTILINE option, and every - branch starts with "^", or - - (b) every branch of the pattern starts with ".*" and PCRE_DOTALL is not - set (if it were set, the pattern would be anchored), - - 2 is returned, indicating that the pattern matches only at the start of - a subject string or after any newline within the string. Otherwise 0 is - returned. For anchored patterns, 0 is returned. - - PCRE_INFO_FIRSTTABLE - - If the pattern was studied, and this resulted in the construction of a - 256-bit table indicating a fixed set of values for the first data unit - in any matching string, a pointer to the table is returned. Otherwise - NULL is returned. The fourth argument should point to an unsigned char - * variable. - - PCRE_INFO_HASCRORLF - - Return 1 if the pattern contains any explicit matches for CR or LF - characters, otherwise 0. The fourth argument should point to an int - variable. An explicit match is either a literal CR or LF character, or - \r or \n. - - PCRE_INFO_JCHANGED - - Return 1 if the (?J) or (?-J) option setting is used in the pattern, - otherwise 0. The fourth argument should point to an int variable. (?J) - and (?-J) set and unset the local PCRE_DUPNAMES option, respectively. - - PCRE_INFO_JIT - - Return 1 if the pattern was studied with one of the JIT options, and - just-in-time compiling was successful. The fourth argument should point - to an int variable. A return value of 0 means that JIT support is not - available in this version of PCRE, or that the pattern was not studied - with a JIT option, or that the JIT compiler could not handle this par- - ticular pattern. See the pcrejit documentation for details of what can - and cannot be handled. - - PCRE_INFO_JITSIZE - - If the pattern was successfully studied with a JIT option, return the - size of the JIT compiled code, otherwise return zero. The fourth argu- - ment should point to a size_t variable. - - PCRE_INFO_LASTLITERAL - - Return the value of the rightmost literal data unit that must exist in - any matched string, other than at its start, if such a value has been - recorded. The fourth argument should point to an int variable. If there - is no such value, -1 is returned. For anchored patterns, a last literal - value is recorded only if it follows something of variable length. For - example, for the pattern /^a\d+z\d+/ the returned value is "z", but for - /^a\dz\d/ the returned value is -1. - - Since for the 32-bit library using the non-UTF-32 mode, this function - is unable to return the full 32-bit range of characters, this value is - deprecated; instead the PCRE_INFO_REQUIREDCHARFLAGS and - PCRE_INFO_REQUIREDCHAR values should be used. - - PCRE_INFO_MATCH_EMPTY - - Return 1 if the pattern can match an empty string, otherwise 0. The - fourth argument should point to an int variable. - - PCRE_INFO_MATCHLIMIT - - If the pattern set a match limit by including an item of the form - (*LIMIT_MATCH=nnnn) at the start, the value is returned. The fourth - argument should point to an unsigned 32-bit integer. If no such value - has been set, the call to pcre_fullinfo() returns the error - PCRE_ERROR_UNSET. - - PCRE_INFO_MAXLOOKBEHIND - - Return the number of characters (NB not data units) in the longest - lookbehind assertion in the pattern. This information is useful when - doing multi-segment matching using the partial matching facilities. - Note that the simple assertions \b and \B require a one-character look- - behind. \A also registers a one-character lookbehind, though it does - not actually inspect the previous character. This is to ensure that at - least one character from the old segment is retained when a new segment - is processed. Otherwise, if there are no lookbehinds in the pattern, \A - might match incorrectly at the start of a new segment. - - PCRE_INFO_MINLENGTH - - If the pattern was studied and a minimum length for matching subject - strings was computed, its value is returned. Otherwise the returned - value is -1. The value is a number of characters, which in UTF mode may - be different from the number of data units. The fourth argument should - point to an int variable. A non-negative value is a lower bound to the - length of any matching string. There may not be any strings of that - length that do actually match, but every string that does match is at - least that long. - - PCRE_INFO_NAMECOUNT - PCRE_INFO_NAMEENTRYSIZE - PCRE_INFO_NAMETABLE - - PCRE supports the use of named as well as numbered capturing parenthe- - ses. The names are just an additional way of identifying the parenthe- - ses, which still acquire numbers. Several convenience functions such as - pcre_get_named_substring() are provided for extracting captured sub- - strings by name. It is also possible to extract the data directly, by - first converting the name to a number in order to access the correct - pointers in the output vector (described with pcre_exec() below). To do - the conversion, you need to use the name-to-number map, which is - described by these three values. - - The map consists of a number of fixed-size entries. PCRE_INFO_NAMECOUNT - gives the number of entries, and PCRE_INFO_NAMEENTRYSIZE gives the size - of each entry; both of these return an int value. The entry size - depends on the length of the longest name. PCRE_INFO_NAMETABLE returns - a pointer to the first entry of the table. This is a pointer to char in - the 8-bit library, where the first two bytes of each entry are the num- - ber of the capturing parenthesis, most significant byte first. In the - 16-bit library, the pointer points to 16-bit data units, the first of - which contains the parenthesis number. In the 32-bit library, the - pointer points to 32-bit data units, the first of which contains the - parenthesis number. The rest of the entry is the corresponding name, - zero terminated. - - The names are in alphabetical order. If (?| is used to create multiple - groups with the same number, as described in the section on duplicate - subpattern numbers in the pcrepattern page, the groups may be given the - same name, but there is only one entry in the table. Different names - for groups of the same number are not permitted. Duplicate names for - subpatterns with different numbers are permitted, but only if PCRE_DUP- - NAMES is set. They appear in the table in the order in which they were - found in the pattern. In the absence of (?| this is the order of - increasing number; when (?| is used this is not necessarily the case - because later subpatterns may have lower numbers. - - As a simple example of the name/number table, consider the following - pattern after compilation by the 8-bit library (assume PCRE_EXTENDED is - set, so white space - including newlines - is ignored): - - (? (?(\d\d)?\d\d) - - (?\d\d) - (?\d\d) ) - - There are four named subpatterns, so the table has four entries, and - each entry in the table is eight bytes long. The table is as follows, - with non-printing bytes shows in hexadecimal, and undefined bytes shown - as ??: - - 00 01 d a t e 00 ?? - 00 05 d a y 00 ?? ?? - 00 04 m o n t h 00 - 00 02 y e a r 00 ?? - - When writing code to extract data from named subpatterns using the - name-to-number map, remember that the length of the entries is likely - to be different for each compiled pattern. - - PCRE_INFO_OKPARTIAL - - Return 1 if the pattern can be used for partial matching with - pcre_exec(), otherwise 0. The fourth argument should point to an int - variable. From release 8.00, this always returns 1, because the - restrictions that previously applied to partial matching have been - lifted. The pcrepartial documentation gives details of partial match- - ing. - - PCRE_INFO_OPTIONS - - Return a copy of the options with which the pattern was compiled. The - fourth argument should point to an unsigned long int variable. These - option bits are those specified in the call to pcre_compile(), modified - by any top-level option settings at the start of the pattern itself. In - other words, they are the options that will be in force when matching - starts. For example, if the pattern /(?im)abc(?-i)d/ is compiled with - the PCRE_EXTENDED option, the result is PCRE_CASELESS, PCRE_MULTILINE, - and PCRE_EXTENDED. - - A pattern is automatically anchored by PCRE if all of its top-level - alternatives begin with one of the following: - - ^ unless PCRE_MULTILINE is set - \A always - \G always - .* if PCRE_DOTALL is set and there are no back - references to the subpattern in which .* appears - - For such patterns, the PCRE_ANCHORED bit is set in the options returned - by pcre_fullinfo(). - - PCRE_INFO_RECURSIONLIMIT - - If the pattern set a recursion limit by including an item of the form - (*LIMIT_RECURSION=nnnn) at the start, the value is returned. The fourth - argument should point to an unsigned 32-bit integer. If no such value - has been set, the call to pcre_fullinfo() returns the error - PCRE_ERROR_UNSET. - - PCRE_INFO_SIZE - - Return the size of the compiled pattern in bytes (for all three - libraries). The fourth argument should point to a size_t variable. This - value does not include the size of the pcre structure that is returned - by pcre_compile(). The value that is passed as the argument to - pcre_malloc() when pcre_compile() is getting memory in which to place - the compiled data is the value returned by this option plus the size of - the pcre structure. Studying a compiled pattern, with or without JIT, - does not alter the value returned by this option. - - PCRE_INFO_STUDYSIZE - - Return the size in bytes (for all three libraries) of the data block - pointed to by the study_data field in a pcre_extra block. If pcre_extra - is NULL, or there is no study data, zero is returned. The fourth argu- - ment should point to a size_t variable. The study_data field is set by - pcre_study() to record information that will speed up matching (see the - section entitled "Studying a pattern" above). The format of the - study_data block is private, but its length is made available via this - option so that it can be saved and restored (see the pcreprecompile - documentation for details). - - PCRE_INFO_REQUIREDCHARFLAGS - - Returns 1 if there is a rightmost literal data unit that must exist in - any matched string, other than at its start. The fourth argument should - point to an int variable. If there is no such value, 0 is returned. If - returning 1, the character value itself can be retrieved using - PCRE_INFO_REQUIREDCHAR. - - For anchored patterns, a last literal value is recorded only if it fol- - lows something of variable length. For example, for the pattern - /^a\d+z\d+/ the returned value 1 (with "z" returned from - PCRE_INFO_REQUIREDCHAR), but for /^a\dz\d/ the returned value is 0. - - PCRE_INFO_REQUIREDCHAR - - Return the value of the rightmost literal data unit that must exist in - any matched string, other than at its start, if such a value has been - recorded. The fourth argument should point to an uint32_t variable. If - there is no such value, 0 is returned. - - -REFERENCE COUNTS - - int pcre_refcount(pcre *code, int adjust); - - The pcre_refcount() function is used to maintain a reference count in - the data block that contains a compiled pattern. It is provided for the - benefit of applications that operate in an object-oriented manner, - where different parts of the application may be using the same compiled - pattern, but you want to free the block when they are all done. - - When a pattern is compiled, the reference count field is initialized to - zero. It is changed only by calling this function, whose action is to - add the adjust value (which may be positive or negative) to it. The - yield of the function is the new value. However, the value of the count - is constrained to lie between 0 and 65535, inclusive. If the new value - is outside these limits, it is forced to the appropriate limit value. - - Except when it is zero, the reference count is not correctly preserved - if a pattern is compiled on one host and then transferred to a host - whose byte-order is different. (This seems a highly unlikely scenario.) - - -MATCHING A PATTERN: THE TRADITIONAL FUNCTION - - int pcre_exec(const pcre *code, const pcre_extra *extra, - const char *subject, int length, int startoffset, - int options, int *ovector, int ovecsize); - - The function pcre_exec() is called to match a subject string against a - compiled pattern, which is passed in the code argument. If the pattern - was studied, the result of the study should be passed in the extra - argument. You can call pcre_exec() with the same code and extra argu- - ments as many times as you like, in order to match different subject - strings with the same pattern. - - This function is the main matching facility of the library, and it - operates in a Perl-like manner. For specialist use there is also an - alternative matching function, which is described below in the section - about the pcre_dfa_exec() function. - - In most applications, the pattern will have been compiled (and option- - ally studied) in the same process that calls pcre_exec(). However, it - is possible to save compiled patterns and study data, and then use them - later in different processes, possibly even on different hosts. For a - discussion about this, see the pcreprecompile documentation. - - Here is an example of a simple call to pcre_exec(): - - int rc; - int ovector[30]; - rc = pcre_exec( - re, /* result of pcre_compile() */ - NULL, /* we didn't study the pattern */ - "some string", /* the subject string */ - 11, /* the length of the subject string */ - 0, /* start at offset 0 in the subject */ - 0, /* default options */ - ovector, /* vector of integers for substring information */ - 30); /* number of elements (NOT size in bytes) */ - - Extra data for pcre_exec() - - If the extra argument is not NULL, it must point to a pcre_extra data - block. The pcre_study() function returns such a block (when it doesn't - return NULL), but you can also create one for yourself, and pass addi- - tional information in it. The pcre_extra block contains the following - fields (not necessarily in this order): - - unsigned long int flags; - void *study_data; - void *executable_jit; - unsigned long int match_limit; - unsigned long int match_limit_recursion; - void *callout_data; - const unsigned char *tables; - unsigned char **mark; - - In the 16-bit version of this structure, the mark field has type - "PCRE_UCHAR16 **". - - In the 32-bit version of this structure, the mark field has type - "PCRE_UCHAR32 **". - - The flags field is used to specify which of the other fields are set. - The flag bits are: - - PCRE_EXTRA_CALLOUT_DATA - PCRE_EXTRA_EXECUTABLE_JIT - PCRE_EXTRA_MARK - PCRE_EXTRA_MATCH_LIMIT - PCRE_EXTRA_MATCH_LIMIT_RECURSION - PCRE_EXTRA_STUDY_DATA - PCRE_EXTRA_TABLES - - Other flag bits should be set to zero. The study_data field and some- - times the executable_jit field are set in the pcre_extra block that is - returned by pcre_study(), together with the appropriate flag bits. You - should not set these yourself, but you may add to the block by setting - other fields and their corresponding flag bits. - - The match_limit field provides a means of preventing PCRE from using up - a vast amount of resources when running patterns that are not going to - match, but which have a very large number of possibilities in their - search trees. The classic example is a pattern that uses nested unlim- - ited repeats. - - Internally, pcre_exec() uses a function called match(), which it calls - repeatedly (sometimes recursively). The limit set by match_limit is - imposed on the number of times this function is called during a match, - which has the effect of limiting the amount of backtracking that can - take place. For patterns that are not anchored, the count restarts from - zero for each position in the subject string. - - When pcre_exec() is called with a pattern that was successfully studied - with a JIT option, the way that the matching is executed is entirely - different. However, there is still the possibility of runaway matching - that goes on for a very long time, and so the match_limit value is also - used in this case (but in a different way) to limit how long the match- - ing can continue. - - The default value for the limit can be set when PCRE is built; the - default default is 10 million, which handles all but the most extreme - cases. You can override the default by suppling pcre_exec() with a - pcre_extra block in which match_limit is set, and - PCRE_EXTRA_MATCH_LIMIT is set in the flags field. If the limit is - exceeded, pcre_exec() returns PCRE_ERROR_MATCHLIMIT. - - A value for the match limit may also be supplied by an item at the - start of a pattern of the form - - (*LIMIT_MATCH=d) - - where d is a decimal number. However, such a setting is ignored unless - d is less than the limit set by the caller of pcre_exec() or, if no - such limit is set, less than the default. - - The match_limit_recursion field is similar to match_limit, but instead - of limiting the total number of times that match() is called, it limits - the depth of recursion. The recursion depth is a smaller number than - the total number of calls, because not all calls to match() are recur- - sive. This limit is of use only if it is set smaller than match_limit. - - Limiting the recursion depth limits the amount of machine stack that - can be used, or, when PCRE has been compiled to use memory on the heap - instead of the stack, the amount of heap memory that can be used. This - limit is not relevant, and is ignored, when matching is done using JIT - compiled code. - - The default value for match_limit_recursion can be set when PCRE is - built; the default default is the same value as the default for - match_limit. You can override the default by suppling pcre_exec() with - a pcre_extra block in which match_limit_recursion is set, and - PCRE_EXTRA_MATCH_LIMIT_RECURSION is set in the flags field. If the - limit is exceeded, pcre_exec() returns PCRE_ERROR_RECURSIONLIMIT. - - A value for the recursion limit may also be supplied by an item at the - start of a pattern of the form - - (*LIMIT_RECURSION=d) - - where d is a decimal number. However, such a setting is ignored unless - d is less than the limit set by the caller of pcre_exec() or, if no - such limit is set, less than the default. - - The callout_data field is used in conjunction with the "callout" fea- - ture, and is described in the pcrecallout documentation. - - The tables field is provided for use with patterns that have been pre- - compiled using custom character tables, saved to disc or elsewhere, and - then reloaded, because the tables that were used to compile a pattern - are not saved with it. See the pcreprecompile documentation for a dis- - cussion of saving compiled patterns for later use. If NULL is passed - using this mechanism, it forces PCRE's internal tables to be used. - - Warning: The tables that pcre_exec() uses must be the same as those - that were used when the pattern was compiled. If this is not the case, - the behaviour of pcre_exec() is undefined. Therefore, when a pattern is - compiled and matched in the same process, this field should never be - set. In this (the most common) case, the correct table pointer is auto- - matically passed with the compiled pattern from pcre_compile() to - pcre_exec(). - - If PCRE_EXTRA_MARK is set in the flags field, the mark field must be - set to point to a suitable variable. If the pattern contains any back- - tracking control verbs such as (*MARK:NAME), and the execution ends up - with a name to pass back, a pointer to the name string (zero termi- - nated) is placed in the variable pointed to by the mark field. The - names are within the compiled pattern; if you wish to retain such a - name you must copy it before freeing the memory of a compiled pattern. - If there is no name to pass back, the variable pointed to by the mark - field is set to NULL. For details of the backtracking control verbs, - see the section entitled "Backtracking control" in the pcrepattern doc- - umentation. - - Option bits for pcre_exec() - - The unused bits of the options argument for pcre_exec() must be zero. - The only bits that may be set are PCRE_ANCHORED, PCRE_NEWLINE_xxx, - PCRE_NOTBOL, PCRE_NOTEOL, PCRE_NOTEMPTY, PCRE_NOTEMPTY_ATSTART, - PCRE_NO_START_OPTIMIZE, PCRE_NO_UTF8_CHECK, PCRE_PARTIAL_HARD, and - PCRE_PARTIAL_SOFT. - - If the pattern was successfully studied with one of the just-in-time - (JIT) compile options, the only supported options for JIT execution are - PCRE_NO_UTF8_CHECK, PCRE_NOTBOL, PCRE_NOTEOL, PCRE_NOTEMPTY, - PCRE_NOTEMPTY_ATSTART, PCRE_PARTIAL_HARD, and PCRE_PARTIAL_SOFT. If an - unsupported option is used, JIT execution is disabled and the normal - interpretive code in pcre_exec() is run. - - PCRE_ANCHORED - - The PCRE_ANCHORED option limits pcre_exec() to matching at the first - matching position. If a pattern was compiled with PCRE_ANCHORED, or - turned out to be anchored by virtue of its contents, it cannot be made - unachored at matching time. - - PCRE_BSR_ANYCRLF - PCRE_BSR_UNICODE - - These options (which are mutually exclusive) control what the \R escape - sequence matches. The choice is either to match only CR, LF, or CRLF, - or to match any Unicode newline sequence. These options override the - choice that was made or defaulted when the pattern was compiled. - - PCRE_NEWLINE_CR - PCRE_NEWLINE_LF - PCRE_NEWLINE_CRLF - PCRE_NEWLINE_ANYCRLF - PCRE_NEWLINE_ANY - - These options override the newline definition that was chosen or - defaulted when the pattern was compiled. For details, see the descrip- - tion of pcre_compile() above. During matching, the newline choice - affects the behaviour of the dot, circumflex, and dollar metacharac- - ters. It may also alter the way the match position is advanced after a - match failure for an unanchored pattern. - - When PCRE_NEWLINE_CRLF, PCRE_NEWLINE_ANYCRLF, or PCRE_NEWLINE_ANY is - set, and a match attempt for an unanchored pattern fails when the cur- - rent position is at a CRLF sequence, and the pattern contains no - explicit matches for CR or LF characters, the match position is - advanced by two characters instead of one, in other words, to after the - CRLF. - - The above rule is a compromise that makes the most common cases work as - expected. For example, if the pattern is .+A (and the PCRE_DOTALL - option is not set), it does not match the string "\r\nA" because, after - failing at the start, it skips both the CR and the LF before retrying. - However, the pattern [\r\n]A does match that string, because it con- - tains an explicit CR or LF reference, and so advances only by one char- - acter after the first failure. - - An explicit match for CR of LF is either a literal appearance of one of - those characters, or one of the \r or \n escape sequences. Implicit - matches such as [^X] do not count, nor does \s (which includes CR and - LF in the characters that it matches). - - Notwithstanding the above, anomalous effects may still occur when CRLF - is a valid newline sequence and explicit \r or \n escapes appear in the - pattern. - - PCRE_NOTBOL - - This option specifies that first character of the subject string is not - the beginning of a line, so the circumflex metacharacter should not - match before it. Setting this without PCRE_MULTILINE (at compile time) - causes circumflex never to match. This option affects only the behav- - iour of the circumflex metacharacter. It does not affect \A. - - PCRE_NOTEOL - - This option specifies that the end of the subject string is not the end - of a line, so the dollar metacharacter should not match it nor (except - in multiline mode) a newline immediately before it. Setting this with- - out PCRE_MULTILINE (at compile time) causes dollar never to match. This - option affects only the behaviour of the dollar metacharacter. It does - not affect \Z or \z. - - PCRE_NOTEMPTY - - An empty string is not considered to be a valid match if this option is - set. If there are alternatives in the pattern, they are tried. If all - the alternatives match the empty string, the entire match fails. For - example, if the pattern - - a?b? - - is applied to a string not beginning with "a" or "b", it matches an - empty string at the start of the subject. With PCRE_NOTEMPTY set, this - match is not valid, so PCRE searches further into the string for occur- - rences of "a" or "b". - - PCRE_NOTEMPTY_ATSTART - - This is like PCRE_NOTEMPTY, except that an empty string match that is - not at the start of the subject is permitted. If the pattern is - anchored, such a match can occur only if the pattern contains \K. - - Perl has no direct equivalent of PCRE_NOTEMPTY or - PCRE_NOTEMPTY_ATSTART, but it does make a special case of a pattern - match of the empty string within its split() function, and when using - the /g modifier. It is possible to emulate Perl's behaviour after - matching a null string by first trying the match again at the same off- - set with PCRE_NOTEMPTY_ATSTART and PCRE_ANCHORED, and then if that - fails, by advancing the starting offset (see below) and trying an ordi- - nary match again. There is some code that demonstrates how to do this - in the pcredemo sample program. In the most general case, you have to - check to see if the newline convention recognizes CRLF as a newline, - and if so, and the current character is CR followed by LF, advance the - starting offset by two characters instead of one. - - PCRE_NO_START_OPTIMIZE - - There are a number of optimizations that pcre_exec() uses at the start - of a match, in order to speed up the process. For example, if it is - known that an unanchored match must start with a specific character, it - searches the subject for that character, and fails immediately if it - cannot find it, without actually running the main matching function. - This means that a special item such as (*COMMIT) at the start of a pat- - tern is not considered until after a suitable starting point for the - match has been found. Also, when callouts or (*MARK) items are in use, - these "start-up" optimizations can cause them to be skipped if the pat- - tern is never actually used. The start-up optimizations are in effect a - pre-scan of the subject that takes place before the pattern is run. - - The PCRE_NO_START_OPTIMIZE option disables the start-up optimizations, - possibly causing performance to suffer, but ensuring that in cases - where the result is "no match", the callouts do occur, and that items - such as (*COMMIT) and (*MARK) are considered at every possible starting - position in the subject string. If PCRE_NO_START_OPTIMIZE is set at - compile time, it cannot be unset at matching time. The use of - PCRE_NO_START_OPTIMIZE at matching time (that is, passing it to - pcre_exec()) disables JIT execution; in this situation, matching is - always done using interpretively. - - Setting PCRE_NO_START_OPTIMIZE can change the outcome of a matching - operation. Consider the pattern - - (*COMMIT)ABC - - When this is compiled, PCRE records the fact that a match must start - with the character "A". Suppose the subject string is "DEFABC". The - start-up optimization scans along the subject, finds "A" and runs the - first match attempt from there. The (*COMMIT) item means that the pat- - tern must match the current starting position, which in this case, it - does. However, if the same match is run with PCRE_NO_START_OPTIMIZE - set, the initial scan along the subject string does not happen. The - first match attempt is run starting from "D" and when this fails, - (*COMMIT) prevents any further matches being tried, so the overall - result is "no match". If the pattern is studied, more start-up opti- - mizations may be used. For example, a minimum length for the subject - may be recorded. Consider the pattern - - (*MARK:A)(X|Y) - - The minimum length for a match is one character. If the subject is - "ABC", there will be attempts to match "ABC", "BC", "C", and then - finally an empty string. If the pattern is studied, the final attempt - does not take place, because PCRE knows that the subject is too short, - and so the (*MARK) is never encountered. In this case, studying the - pattern does not affect the overall match result, which is still "no - match", but it does affect the auxiliary information that is returned. - - PCRE_NO_UTF8_CHECK - - When PCRE_UTF8 is set at compile time, the validity of the subject as a - UTF-8 string is automatically checked when pcre_exec() is subsequently - called. The entire string is checked before any other processing takes - place. The value of startoffset is also checked to ensure that it - points to the start of a UTF-8 character. There is a discussion about - the validity of UTF-8 strings in the pcreunicode page. If an invalid - sequence of bytes is found, pcre_exec() returns the error - PCRE_ERROR_BADUTF8 or, if PCRE_PARTIAL_HARD is set and the problem is a - truncated character at the end of the subject, PCRE_ERROR_SHORTUTF8. In - both cases, information about the precise nature of the error may also - be returned (see the descriptions of these errors in the section enti- - tled Error return values from pcre_exec() below). If startoffset con- - tains a value that does not point to the start of a UTF-8 character (or - to the end of the subject), PCRE_ERROR_BADUTF8_OFFSET is returned. - - If you already know that your subject is valid, and you want to skip - these checks for performance reasons, you can set the - PCRE_NO_UTF8_CHECK option when calling pcre_exec(). You might want to - do this for the second and subsequent calls to pcre_exec() if you are - making repeated calls to find all the matches in a single subject - string. However, you should be sure that the value of startoffset - points to the start of a character (or the end of the subject). When - PCRE_NO_UTF8_CHECK is set, the effect of passing an invalid string as a - subject or an invalid value of startoffset is undefined. Your program - may crash or loop. - - PCRE_PARTIAL_HARD - PCRE_PARTIAL_SOFT - - These options turn on the partial matching feature. For backwards com- - patibility, PCRE_PARTIAL is a synonym for PCRE_PARTIAL_SOFT. A partial - match occurs if the end of the subject string is reached successfully, - but there are not enough subject characters to complete the match. If - this happens when PCRE_PARTIAL_SOFT (but not PCRE_PARTIAL_HARD) is set, - matching continues by testing any remaining alternatives. Only if no - complete match can be found is PCRE_ERROR_PARTIAL returned instead of - PCRE_ERROR_NOMATCH. In other words, PCRE_PARTIAL_SOFT says that the - caller is prepared to handle a partial match, but only if no complete - match can be found. - - If PCRE_PARTIAL_HARD is set, it overrides PCRE_PARTIAL_SOFT. In this - case, if a partial match is found, pcre_exec() immediately returns - PCRE_ERROR_PARTIAL, without considering any other alternatives. In - other words, when PCRE_PARTIAL_HARD is set, a partial match is consid- - ered to be more important that an alternative complete match. - - In both cases, the portion of the string that was inspected when the - partial match was found is set as the first matching string. There is a - more detailed discussion of partial and multi-segment matching, with - examples, in the pcrepartial documentation. - - The string to be matched by pcre_exec() - - The subject string is passed to pcre_exec() as a pointer in subject, a - length in length, and a starting offset in startoffset. The units for - length and startoffset are bytes for the 8-bit library, 16-bit data - items for the 16-bit library, and 32-bit data items for the 32-bit - library. - - If startoffset is negative or greater than the length of the subject, - pcre_exec() returns PCRE_ERROR_BADOFFSET. When the starting offset is - zero, the search for a match starts at the beginning of the subject, - and this is by far the most common case. In UTF-8 or UTF-16 mode, the - offset must point to the start of a character, or the end of the sub- - ject (in UTF-32 mode, one data unit equals one character, so all off- - sets are valid). Unlike the pattern string, the subject may contain - binary zeroes. - - A non-zero starting offset is useful when searching for another match - in the same subject by calling pcre_exec() again after a previous suc- - cess. Setting startoffset differs from just passing over a shortened - string and setting PCRE_NOTBOL in the case of a pattern that begins - with any kind of lookbehind. For example, consider the pattern - - \Biss\B - - which finds occurrences of "iss" in the middle of words. (\B matches - only if the current position in the subject is not a word boundary.) - When applied to the string "Mississipi" the first call to pcre_exec() - finds the first occurrence. If pcre_exec() is called again with just - the remainder of the subject, namely "issipi", it does not match, - because \B is always false at the start of the subject, which is deemed - to be a word boundary. However, if pcre_exec() is passed the entire - string again, but with startoffset set to 4, it finds the second occur- - rence of "iss" because it is able to look behind the starting point to - discover that it is preceded by a letter. - - Finding all the matches in a subject is tricky when the pattern can - match an empty string. It is possible to emulate Perl's /g behaviour by - first trying the match again at the same offset, with the - PCRE_NOTEMPTY_ATSTART and PCRE_ANCHORED options, and then if that - fails, advancing the starting offset and trying an ordinary match - again. There is some code that demonstrates how to do this in the pcre- - demo sample program. In the most general case, you have to check to see - if the newline convention recognizes CRLF as a newline, and if so, and - the current character is CR followed by LF, advance the starting offset - by two characters instead of one. - - If a non-zero starting offset is passed when the pattern is anchored, - one attempt to match at the given offset is made. This can only succeed - if the pattern does not require the match to be at the start of the - subject. - - How pcre_exec() returns captured substrings - - In general, a pattern matches a certain portion of the subject, and in - addition, further substrings from the subject may be picked out by - parts of the pattern. Following the usage in Jeffrey Friedl's book, - this is called "capturing" in what follows, and the phrase "capturing - subpattern" is used for a fragment of a pattern that picks out a sub- - string. PCRE supports several other kinds of parenthesized subpattern - that do not cause substrings to be captured. - - Captured substrings are returned to the caller via a vector of integers - whose address is passed in ovector. The number of elements in the vec- - tor is passed in ovecsize, which must be a non-negative number. Note: - this argument is NOT the size of ovector in bytes. - - The first two-thirds of the vector is used to pass back captured sub- - strings, each substring using a pair of integers. The remaining third - of the vector is used as workspace by pcre_exec() while matching cap- - turing subpatterns, and is not available for passing back information. - The number passed in ovecsize should always be a multiple of three. If - it is not, it is rounded down. - - When a match is successful, information about captured substrings is - returned in pairs of integers, starting at the beginning of ovector, - and continuing up to two-thirds of its length at the most. The first - element of each pair is set to the offset of the first character in a - substring, and the second is set to the offset of the first character - after the end of a substring. These values are always data unit off- - sets, even in UTF mode. They are byte offsets in the 8-bit library, - 16-bit data item offsets in the 16-bit library, and 32-bit data item - offsets in the 32-bit library. Note: they are not character counts. - - The first pair of integers, ovector[0] and ovector[1], identify the - portion of the subject string matched by the entire pattern. The next - pair is used for the first capturing subpattern, and so on. The value - returned by pcre_exec() is one more than the highest numbered pair that - has been set. For example, if two substrings have been captured, the - returned value is 3. If there are no capturing subpatterns, the return - value from a successful match is 1, indicating that just the first pair - of offsets has been set. - - If a capturing subpattern is matched repeatedly, it is the last portion - of the string that it matched that is returned. - - If the vector is too small to hold all the captured substring offsets, - it is used as far as possible (up to two-thirds of its length), and the - function returns a value of zero. If neither the actual string matched - nor any captured substrings are of interest, pcre_exec() may be called - with ovector passed as NULL and ovecsize as zero. However, if the pat- - tern contains back references and the ovector is not big enough to - remember the related substrings, PCRE has to get additional memory for - use during matching. Thus it is usually advisable to supply an ovector - of reasonable size. - - There are some cases where zero is returned (indicating vector over- - flow) when in fact the vector is exactly the right size for the final - match. For example, consider the pattern - - (a)(?:(b)c|bd) - - If a vector of 6 elements (allowing for only 1 captured substring) is - given with subject string "abd", pcre_exec() will try to set the second - captured string, thereby recording a vector overflow, before failing to - match "c" and backing up to try the second alternative. The zero - return, however, does correctly indicate that the maximum number of - slots (namely 2) have been filled. In similar cases where there is tem- - porary overflow, but the final number of used slots is actually less - than the maximum, a non-zero value is returned. - - The pcre_fullinfo() function can be used to find out how many capturing - subpatterns there are in a compiled pattern. The smallest size for - ovector that will allow for n captured substrings, in addition to the - offsets of the substring matched by the whole pattern, is (n+1)*3. - - It is possible for capturing subpattern number n+1 to match some part - of the subject when subpattern n has not been used at all. For example, - if the string "abc" is matched against the pattern (a|(z))(bc) the - return from the function is 4, and subpatterns 1 and 3 are matched, but - 2 is not. When this happens, both values in the offset pairs corre- - sponding to unused subpatterns are set to -1. - - Offset values that correspond to unused subpatterns at the end of the - expression are also set to -1. For example, if the string "abc" is - matched against the pattern (abc)(x(yz)?)? subpatterns 2 and 3 are not - matched. The return from the function is 2, because the highest used - capturing subpattern number is 1, and the offsets for for the second - and third capturing subpatterns (assuming the vector is large enough, - of course) are set to -1. - - Note: Elements in the first two-thirds of ovector that do not corre- - spond to capturing parentheses in the pattern are never changed. That - is, if a pattern contains n capturing parentheses, no more than ovec- - tor[0] to ovector[2n+1] are set by pcre_exec(). The other elements (in - the first two-thirds) retain whatever values they previously had. - - Some convenience functions are provided for extracting the captured - substrings as separate strings. These are described below. - - Error return values from pcre_exec() - - If pcre_exec() fails, it returns a negative number. The following are - defined in the header file: - - PCRE_ERROR_NOMATCH (-1) - - The subject string did not match the pattern. - - PCRE_ERROR_NULL (-2) - - Either code or subject was passed as NULL, or ovector was NULL and - ovecsize was not zero. - - PCRE_ERROR_BADOPTION (-3) - - An unrecognized bit was set in the options argument. - - PCRE_ERROR_BADMAGIC (-4) - - PCRE stores a 4-byte "magic number" at the start of the compiled code, - to catch the case when it is passed a junk pointer and to detect when a - pattern that was compiled in an environment of one endianness is run in - an environment with the other endianness. This is the error that PCRE - gives when the magic number is not present. - - PCRE_ERROR_UNKNOWN_OPCODE (-5) - - While running the pattern match, an unknown item was encountered in the - compiled pattern. This error could be caused by a bug in PCRE or by - overwriting of the compiled pattern. - - PCRE_ERROR_NOMEMORY (-6) - - If a pattern contains back references, but the ovector that is passed - to pcre_exec() is not big enough to remember the referenced substrings, - PCRE gets a block of memory at the start of matching to use for this - purpose. If the call via pcre_malloc() fails, this error is given. The - memory is automatically freed at the end of matching. - - This error is also given if pcre_stack_malloc() fails in pcre_exec(). - This can happen only when PCRE has been compiled with --disable-stack- - for-recursion. - - PCRE_ERROR_NOSUBSTRING (-7) - - This error is used by the pcre_copy_substring(), pcre_get_substring(), - and pcre_get_substring_list() functions (see below). It is never - returned by pcre_exec(). - - PCRE_ERROR_MATCHLIMIT (-8) - - The backtracking limit, as specified by the match_limit field in a - pcre_extra structure (or defaulted) was reached. See the description - above. - - PCRE_ERROR_CALLOUT (-9) - - This error is never generated by pcre_exec() itself. It is provided for - use by callout functions that want to yield a distinctive error code. - See the pcrecallout documentation for details. - - PCRE_ERROR_BADUTF8 (-10) - - A string that contains an invalid UTF-8 byte sequence was passed as a - subject, and the PCRE_NO_UTF8_CHECK option was not set. If the size of - the output vector (ovecsize) is at least 2, the byte offset to the - start of the the invalid UTF-8 character is placed in the first ele- - ment, and a reason code is placed in the second element. The reason - codes are listed in the following section. For backward compatibility, - if PCRE_PARTIAL_HARD is set and the problem is a truncated UTF-8 char- - acter at the end of the subject (reason codes 1 to 5), - PCRE_ERROR_SHORTUTF8 is returned instead of PCRE_ERROR_BADUTF8. - - PCRE_ERROR_BADUTF8_OFFSET (-11) - - The UTF-8 byte sequence that was passed as a subject was checked and - found to be valid (the PCRE_NO_UTF8_CHECK option was not set), but the - value of startoffset did not point to the beginning of a UTF-8 charac- - ter or the end of the subject. - - PCRE_ERROR_PARTIAL (-12) - - The subject string did not match, but it did match partially. See the - pcrepartial documentation for details of partial matching. - - PCRE_ERROR_BADPARTIAL (-13) - - This code is no longer in use. It was formerly returned when the - PCRE_PARTIAL option was used with a compiled pattern containing items - that were not supported for partial matching. From release 8.00 - onwards, there are no restrictions on partial matching. - - PCRE_ERROR_INTERNAL (-14) - - An unexpected internal error has occurred. This error could be caused - by a bug in PCRE or by overwriting of the compiled pattern. - - PCRE_ERROR_BADCOUNT (-15) - - This error is given if the value of the ovecsize argument is negative. - - PCRE_ERROR_RECURSIONLIMIT (-21) - - The internal recursion limit, as specified by the match_limit_recursion - field in a pcre_extra structure (or defaulted) was reached. See the - description above. - - PCRE_ERROR_BADNEWLINE (-23) - - An invalid combination of PCRE_NEWLINE_xxx options was given. - - PCRE_ERROR_BADOFFSET (-24) - - The value of startoffset was negative or greater than the length of the - subject, that is, the value in length. - - PCRE_ERROR_SHORTUTF8 (-25) - - This error is returned instead of PCRE_ERROR_BADUTF8 when the subject - string ends with a truncated UTF-8 character and the PCRE_PARTIAL_HARD - option is set. Information about the failure is returned as for - PCRE_ERROR_BADUTF8. It is in fact sufficient to detect this case, but - this special error code for PCRE_PARTIAL_HARD precedes the implementa- - tion of returned information; it is retained for backwards compatibil- - ity. - - PCRE_ERROR_RECURSELOOP (-26) - - This error is returned when pcre_exec() detects a recursion loop within - the pattern. Specifically, it means that either the whole pattern or a - subpattern has been called recursively for the second time at the same - position in the subject string. Some simple patterns that might do this - are detected and faulted at compile time, but more complicated cases, - in particular mutual recursions between two different subpatterns, can- - not be detected until run time. - - PCRE_ERROR_JIT_STACKLIMIT (-27) - - This error is returned when a pattern that was successfully studied - using a JIT compile option is being matched, but the memory available - for the just-in-time processing stack is not large enough. See the - pcrejit documentation for more details. - - PCRE_ERROR_BADMODE (-28) - - This error is given if a pattern that was compiled by the 8-bit library - is passed to a 16-bit or 32-bit library function, or vice versa. - - PCRE_ERROR_BADENDIANNESS (-29) - - This error is given if a pattern that was compiled and saved is - reloaded on a host with different endianness. The utility function - pcre_pattern_to_host_byte_order() can be used to convert such a pattern - so that it runs on the new host. - - PCRE_ERROR_JIT_BADOPTION - - This error is returned when a pattern that was successfully studied - using a JIT compile option is being matched, but the matching mode - (partial or complete match) does not correspond to any JIT compilation - mode. When the JIT fast path function is used, this error may be also - given for invalid options. See the pcrejit documentation for more - details. - - PCRE_ERROR_BADLENGTH (-32) - - This error is given if pcre_exec() is called with a negative value for - the length argument. - - Error numbers -16 to -20, -22, and 30 are not used by pcre_exec(). - - Reason codes for invalid UTF-8 strings - - This section applies only to the 8-bit library. The corresponding - information for the 16-bit and 32-bit libraries is given in the pcre16 - and pcre32 pages. - - When pcre_exec() returns either PCRE_ERROR_BADUTF8 or PCRE_ERROR_SHORT- - UTF8, and the size of the output vector (ovecsize) is at least 2, the - offset of the start of the invalid UTF-8 character is placed in the - first output vector element (ovector[0]) and a reason code is placed in - the second element (ovector[1]). The reason codes are given names in - the pcre.h header file: - - PCRE_UTF8_ERR1 - PCRE_UTF8_ERR2 - PCRE_UTF8_ERR3 - PCRE_UTF8_ERR4 - PCRE_UTF8_ERR5 - - The string ends with a truncated UTF-8 character; the code specifies - how many bytes are missing (1 to 5). Although RFC 3629 restricts UTF-8 - characters to be no longer than 4 bytes, the encoding scheme (origi- - nally defined by RFC 2279) allows for up to 6 bytes, and this is - checked first; hence the possibility of 4 or 5 missing bytes. - - PCRE_UTF8_ERR6 - PCRE_UTF8_ERR7 - PCRE_UTF8_ERR8 - PCRE_UTF8_ERR9 - PCRE_UTF8_ERR10 - - The two most significant bits of the 2nd, 3rd, 4th, 5th, or 6th byte of - the character do not have the binary value 0b10 (that is, either the - most significant bit is 0, or the next bit is 1). - - PCRE_UTF8_ERR11 - PCRE_UTF8_ERR12 - - A character that is valid by the RFC 2279 rules is either 5 or 6 bytes - long; these code points are excluded by RFC 3629. - - PCRE_UTF8_ERR13 - - A 4-byte character has a value greater than 0x10fff; these code points - are excluded by RFC 3629. - - PCRE_UTF8_ERR14 - - A 3-byte character has a value in the range 0xd800 to 0xdfff; this - range of code points are reserved by RFC 3629 for use with UTF-16, and - so are excluded from UTF-8. - - PCRE_UTF8_ERR15 - PCRE_UTF8_ERR16 - PCRE_UTF8_ERR17 - PCRE_UTF8_ERR18 - PCRE_UTF8_ERR19 - - A 2-, 3-, 4-, 5-, or 6-byte character is "overlong", that is, it codes - for a value that can be represented by fewer bytes, which is invalid. - For example, the two bytes 0xc0, 0xae give the value 0x2e, whose cor- - rect coding uses just one byte. - - PCRE_UTF8_ERR20 - - The two most significant bits of the first byte of a character have the - binary value 0b10 (that is, the most significant bit is 1 and the sec- - ond is 0). Such a byte can only validly occur as the second or subse- - quent byte of a multi-byte character. - - PCRE_UTF8_ERR21 - - The first byte of a character has the value 0xfe or 0xff. These values - can never occur in a valid UTF-8 string. - - PCRE_UTF8_ERR22 - - This error code was formerly used when the presence of a so-called - "non-character" caused an error. Unicode corrigendum #9 makes it clear - that such characters should not cause a string to be rejected, and so - this code is no longer in use and is never returned. - - -EXTRACTING CAPTURED SUBSTRINGS BY NUMBER - - int pcre_copy_substring(const char *subject, int *ovector, - int stringcount, int stringnumber, char *buffer, - int buffersize); - - int pcre_get_substring(const char *subject, int *ovector, - int stringcount, int stringnumber, - const char **stringptr); - - int pcre_get_substring_list(const char *subject, - int *ovector, int stringcount, const char ***listptr); - - Captured substrings can be accessed directly by using the offsets - returned by pcre_exec() in ovector. For convenience, the functions - pcre_copy_substring(), pcre_get_substring(), and pcre_get_sub- - string_list() are provided for extracting captured substrings as new, - separate, zero-terminated strings. These functions identify substrings - by number. The next section describes functions for extracting named - substrings. - - A substring that contains a binary zero is correctly extracted and has - a further zero added on the end, but the result is not, of course, a C - string. However, you can process such a string by referring to the - length that is returned by pcre_copy_substring() and pcre_get_sub- - string(). Unfortunately, the interface to pcre_get_substring_list() is - not adequate for handling strings containing binary zeros, because the - end of the final string is not independently indicated. - - The first three arguments are the same for all three of these func- - tions: subject is the subject string that has just been successfully - matched, ovector is a pointer to the vector of integer offsets that was - passed to pcre_exec(), and stringcount is the number of substrings that - were captured by the match, including the substring that matched the - entire regular expression. This is the value returned by pcre_exec() if - it is greater than zero. If pcre_exec() returned zero, indicating that - it ran out of space in ovector, the value passed as stringcount should - be the number of elements in the vector divided by three. - - The functions pcre_copy_substring() and pcre_get_substring() extract a - single substring, whose number is given as stringnumber. A value of - zero extracts the substring that matched the entire pattern, whereas - higher values extract the captured substrings. For pcre_copy_sub- - string(), the string is placed in buffer, whose length is given by - buffersize, while for pcre_get_substring() a new block of memory is - obtained via pcre_malloc, and its address is returned via stringptr. - The yield of the function is the length of the string, not including - the terminating zero, or one of these error codes: - - PCRE_ERROR_NOMEMORY (-6) - - The buffer was too small for pcre_copy_substring(), or the attempt to - get memory failed for pcre_get_substring(). - - PCRE_ERROR_NOSUBSTRING (-7) - - There is no substring whose number is stringnumber. - - The pcre_get_substring_list() function extracts all available sub- - strings and builds a list of pointers to them. All this is done in a - single block of memory that is obtained via pcre_malloc. The address of - the memory block is returned via listptr, which is also the start of - the list of string pointers. The end of the list is marked by a NULL - pointer. The yield of the function is zero if all went well, or the - error code - - PCRE_ERROR_NOMEMORY (-6) - - if the attempt to get the memory block failed. - - When any of these functions encounter a substring that is unset, which - can happen when capturing subpattern number n+1 matches some part of - the subject, but subpattern n has not been used at all, they return an - empty string. This can be distinguished from a genuine zero-length sub- - string by inspecting the appropriate offset in ovector, which is nega- - tive for unset substrings. - - The two convenience functions pcre_free_substring() and pcre_free_sub- - string_list() can be used to free the memory returned by a previous - call of pcre_get_substring() or pcre_get_substring_list(), respec- - tively. They do nothing more than call the function pointed to by - pcre_free, which of course could be called directly from a C program. - However, PCRE is used in some situations where it is linked via a spe- - cial interface to another programming language that cannot use - pcre_free directly; it is for these cases that the functions are pro- - vided. - - -EXTRACTING CAPTURED SUBSTRINGS BY NAME - - int pcre_get_stringnumber(const pcre *code, - const char *name); - - int pcre_copy_named_substring(const pcre *code, - const char *subject, int *ovector, - int stringcount, const char *stringname, - char *buffer, int buffersize); - - int pcre_get_named_substring(const pcre *code, - const char *subject, int *ovector, - int stringcount, const char *stringname, - const char **stringptr); - - To extract a substring by name, you first have to find associated num- - ber. For example, for this pattern - - (a+)b(?\d+)... - - the number of the subpattern called "xxx" is 2. If the name is known to - be unique (PCRE_DUPNAMES was not set), you can find the number from the - name by calling pcre_get_stringnumber(). The first argument is the com- - piled pattern, and the second is the name. The yield of the function is - the subpattern number, or PCRE_ERROR_NOSUBSTRING (-7) if there is no - subpattern of that name. - - Given the number, you can extract the substring directly, or use one of - the functions described in the previous section. For convenience, there - are also two functions that do the whole job. - - Most of the arguments of pcre_copy_named_substring() and - pcre_get_named_substring() are the same as those for the similarly - named functions that extract by number. As these are described in the - previous section, they are not re-described here. There are just two - differences: - - First, instead of a substring number, a substring name is given. Sec- - ond, there is an extra argument, given at the start, which is a pointer - to the compiled pattern. This is needed in order to gain access to the - name-to-number translation table. - - These functions call pcre_get_stringnumber(), and if it succeeds, they - then call pcre_copy_substring() or pcre_get_substring(), as appropri- - ate. NOTE: If PCRE_DUPNAMES is set and there are duplicate names, the - behaviour may not be what you want (see the next section). - - Warning: If the pattern uses the (?| feature to set up multiple subpat- - terns with the same number, as described in the section on duplicate - subpattern numbers in the pcrepattern page, you cannot use names to - distinguish the different subpatterns, because names are not included - in the compiled code. The matching process uses only numbers. For this - reason, the use of different names for subpatterns of the same number - causes an error at compile time. - - -DUPLICATE SUBPATTERN NAMES - - int pcre_get_stringtable_entries(const pcre *code, - const char *name, char **first, char **last); - - When a pattern is compiled with the PCRE_DUPNAMES option, names for - subpatterns are not required to be unique. (Duplicate names are always - allowed for subpatterns with the same number, created by using the (?| - feature. Indeed, if such subpatterns are named, they are required to - use the same names.) - - Normally, patterns with duplicate names are such that in any one match, - only one of the named subpatterns participates. An example is shown in - the pcrepattern documentation. - - When duplicates are present, pcre_copy_named_substring() and - pcre_get_named_substring() return the first substring corresponding to - the given name that is set. If none are set, PCRE_ERROR_NOSUBSTRING - (-7) is returned; no data is returned. The pcre_get_stringnumber() - function returns one of the numbers that are associated with the name, - but it is not defined which it is. - - If you want to get full details of all captured substrings for a given - name, you must use the pcre_get_stringtable_entries() function. The - first argument is the compiled pattern, and the second is the name. The - third and fourth are pointers to variables which are updated by the - function. After it has run, they point to the first and last entries in - the name-to-number table for the given name. The function itself - returns the length of each entry, or PCRE_ERROR_NOSUBSTRING (-7) if - there are none. The format of the table is described above in the sec- - tion entitled Information about a pattern above. Given all the rele- - vant entries for the name, you can extract each of their numbers, and - hence the captured data, if any. - - -FINDING ALL POSSIBLE MATCHES - - The traditional matching function uses a similar algorithm to Perl, - which stops when it finds the first match, starting at a given point in - the subject. If you want to find all possible matches, or the longest - possible match, consider using the alternative matching function (see - below) instead. If you cannot use the alternative function, but still - need to find all possible matches, you can kludge it up by making use - of the callout facility, which is described in the pcrecallout documen- - tation. - - What you have to do is to insert a callout right at the end of the pat- - tern. When your callout function is called, extract and save the cur- - rent matched substring. Then return 1, which forces pcre_exec() to - backtrack and try other alternatives. Ultimately, when it runs out of - matches, pcre_exec() will yield PCRE_ERROR_NOMATCH. - - -OBTAINING AN ESTIMATE OF STACK USAGE - - Matching certain patterns using pcre_exec() can use a lot of process - stack, which in certain environments can be rather limited in size. - Some users find it helpful to have an estimate of the amount of stack - that is used by pcre_exec(), to help them set recursion limits, as - described in the pcrestack documentation. The estimate that is output - by pcretest when called with the -m and -C options is obtained by call- - ing pcre_exec with the values NULL, NULL, NULL, -999, and -999 for its - first five arguments. - - Normally, if its first argument is NULL, pcre_exec() immediately - returns the negative error code PCRE_ERROR_NULL, but with this special - combination of arguments, it returns instead a negative number whose - absolute value is the approximate stack frame size in bytes. (A nega- - tive number is used so that it is clear that no match has happened.) - The value is approximate because in some cases, recursive calls to - pcre_exec() occur when there are one or two additional variables on the - stack. - - If PCRE has been compiled to use the heap instead of the stack for - recursion, the value returned is the size of each block that is - obtained from the heap. - - -MATCHING A PATTERN: THE ALTERNATIVE FUNCTION - - int pcre_dfa_exec(const pcre *code, const pcre_extra *extra, - const char *subject, int length, int startoffset, - int options, int *ovector, int ovecsize, - int *workspace, int wscount); - - The function pcre_dfa_exec() is called to match a subject string - against a compiled pattern, using a matching algorithm that scans the - subject string just once, and does not backtrack. This has different - characteristics to the normal algorithm, and is not compatible with - Perl. Some of the features of PCRE patterns are not supported. Never- - theless, there are times when this kind of matching can be useful. For - a discussion of the two matching algorithms, and a list of features - that pcre_dfa_exec() does not support, see the pcrematching documenta- - tion. - - The arguments for the pcre_dfa_exec() function are the same as for - pcre_exec(), plus two extras. The ovector argument is used in a differ- - ent way, and this is described below. The other common arguments are - used in the same way as for pcre_exec(), so their description is not - repeated here. - - The two additional arguments provide workspace for the function. The - workspace vector should contain at least 20 elements. It is used for - keeping track of multiple paths through the pattern tree. More - workspace will be needed for patterns and subjects where there are a - lot of potential matches. - - Here is an example of a simple call to pcre_dfa_exec(): - - int rc; - int ovector[10]; - int wspace[20]; - rc = pcre_dfa_exec( - re, /* result of pcre_compile() */ - NULL, /* we didn't study the pattern */ - "some string", /* the subject string */ - 11, /* the length of the subject string */ - 0, /* start at offset 0 in the subject */ - 0, /* default options */ - ovector, /* vector of integers for substring information */ - 10, /* number of elements (NOT size in bytes) */ - wspace, /* working space vector */ - 20); /* number of elements (NOT size in bytes) */ - - Option bits for pcre_dfa_exec() - - The unused bits of the options argument for pcre_dfa_exec() must be - zero. The only bits that may be set are PCRE_ANCHORED, PCRE_NEW- - LINE_xxx, PCRE_NOTBOL, PCRE_NOTEOL, PCRE_NOTEMPTY, - PCRE_NOTEMPTY_ATSTART, PCRE_NO_UTF8_CHECK, PCRE_BSR_ANYCRLF, - PCRE_BSR_UNICODE, PCRE_NO_START_OPTIMIZE, PCRE_PARTIAL_HARD, PCRE_PAR- - TIAL_SOFT, PCRE_DFA_SHORTEST, and PCRE_DFA_RESTART. All but the last - four of these are exactly the same as for pcre_exec(), so their - description is not repeated here. - - PCRE_PARTIAL_HARD - PCRE_PARTIAL_SOFT - - These have the same general effect as they do for pcre_exec(), but the - details are slightly different. When PCRE_PARTIAL_HARD is set for - pcre_dfa_exec(), it returns PCRE_ERROR_PARTIAL if the end of the sub- - ject is reached and there is still at least one matching possibility - that requires additional characters. This happens even if some complete - matches have also been found. When PCRE_PARTIAL_SOFT is set, the return - code PCRE_ERROR_NOMATCH is converted into PCRE_ERROR_PARTIAL if the end - of the subject is reached, there have been no complete matches, but - there is still at least one matching possibility. The portion of the - string that was inspected when the longest partial match was found is - set as the first matching string in both cases. There is a more - detailed discussion of partial and multi-segment matching, with exam- - ples, in the pcrepartial documentation. - - PCRE_DFA_SHORTEST - - Setting the PCRE_DFA_SHORTEST option causes the matching algorithm to - stop as soon as it has found one match. Because of the way the alterna- - tive algorithm works, this is necessarily the shortest possible match - at the first possible matching point in the subject string. - - PCRE_DFA_RESTART - - When pcre_dfa_exec() returns a partial match, it is possible to call it - again, with additional subject characters, and have it continue with - the same match. The PCRE_DFA_RESTART option requests this action; when - it is set, the workspace and wscount options must reference the same - vector as before because data about the match so far is left in them - after a partial match. There is more discussion of this facility in the - pcrepartial documentation. - - Successful returns from pcre_dfa_exec() - - When pcre_dfa_exec() succeeds, it may have matched more than one sub- - string in the subject. Note, however, that all the matches from one run - of the function start at the same point in the subject. The shorter - matches are all initial substrings of the longer matches. For example, - if the pattern - - <.*> - - is matched against the string - - This is no more - - the three matched strings are - - - - - - On success, the yield of the function is a number greater than zero, - which is the number of matched substrings. The substrings themselves - are returned in ovector. Each string uses two elements; the first is - the offset to the start, and the second is the offset to the end. In - fact, all the strings have the same start offset. (Space could have - been saved by giving this only once, but it was decided to retain some - compatibility with the way pcre_exec() returns data, even though the - meaning of the strings is different.) - - The strings are returned in reverse order of length; that is, the long- - est matching string is given first. If there were too many matches to - fit into ovector, the yield of the function is zero, and the vector is - filled with the longest matches. Unlike pcre_exec(), pcre_dfa_exec() - can use the entire ovector for returning matched strings. - - NOTE: PCRE's "auto-possessification" optimization usually applies to - character repeats at the end of a pattern (as well as internally). For - example, the pattern "a\d+" is compiled as if it were "a\d++" because - there is no point even considering the possibility of backtracking into - the repeated digits. For DFA matching, this means that only one possi- - ble match is found. If you really do want multiple matches in such - cases, either use an ungreedy repeat ("a\d+?") or set the - PCRE_NO_AUTO_POSSESS option when compiling. - - Error returns from pcre_dfa_exec() - - The pcre_dfa_exec() function returns a negative number when it fails. - Many of the errors are the same as for pcre_exec(), and these are - described above. There are in addition the following errors that are - specific to pcre_dfa_exec(): - - PCRE_ERROR_DFA_UITEM (-16) - - This return is given if pcre_dfa_exec() encounters an item in the pat- - tern that it does not support, for instance, the use of \C or a back - reference. - - PCRE_ERROR_DFA_UCOND (-17) - - This return is given if pcre_dfa_exec() encounters a condition item - that uses a back reference for the condition, or a test for recursion - in a specific group. These are not supported. - - PCRE_ERROR_DFA_UMLIMIT (-18) - - This return is given if pcre_dfa_exec() is called with an extra block - that contains a setting of the match_limit or match_limit_recursion - fields. This is not supported (these fields are meaningless for DFA - matching). - - PCRE_ERROR_DFA_WSSIZE (-19) - - This return is given if pcre_dfa_exec() runs out of space in the - workspace vector. - - PCRE_ERROR_DFA_RECURSE (-20) - - When a recursive subpattern is processed, the matching function calls - itself recursively, using private vectors for ovector and workspace. - This error is given if the output vector is not large enough. This - should be extremely rare, as a vector of size 1000 is used. - - PCRE_ERROR_DFA_BADRESTART (-30) - - When pcre_dfa_exec() is called with the PCRE_DFA_RESTART option, some - plausibility checks are made on the contents of the workspace, which - should contain data about the previous partial match. If any of these - checks fail, this error is given. - - -SEE ALSO - - pcre16(3), pcre32(3), pcrebuild(3), pcrecallout(3), pcrecpp(3)(3), - pcrematching(3), pcrepartial(3), pcreposix(3), pcreprecompile(3), pcre- - sample(3), pcrestack(3). - - -AUTHOR - - Philip Hazel - University Computing Service - Cambridge CB2 3QH, England. - - -REVISION - - Last updated: 18 December 2015 - Copyright (c) 1997-2015 University of Cambridge. ------------------------------------------------------------------------------- - - -PCRECALLOUT(3) Library Functions Manual PCRECALLOUT(3) - - - -NAME - PCRE - Perl-compatible regular expressions - -SYNOPSIS - - #include - - int (*pcre_callout)(pcre_callout_block *); - - int (*pcre16_callout)(pcre16_callout_block *); - - int (*pcre32_callout)(pcre32_callout_block *); - - -DESCRIPTION - - PCRE provides a feature called "callout", which is a means of temporar- - ily passing control to the caller of PCRE in the middle of pattern - matching. The caller of PCRE provides an external function by putting - its entry point in the global variable pcre_callout (pcre16_callout for - the 16-bit library, pcre32_callout for the 32-bit library). By default, - this variable contains NULL, which disables all calling out. - - Within a regular expression, (?C) indicates the points at which the - external function is to be called. Different callout points can be - identified by putting a number less than 256 after the letter C. The - default value is zero. For example, this pattern has two callout - points: - - (?C1)abc(?C2)def - - If the PCRE_AUTO_CALLOUT option bit is set when a pattern is compiled, - PCRE automatically inserts callouts, all with number 255, before each - item in the pattern. For example, if PCRE_AUTO_CALLOUT is used with the - pattern - - A(\d{2}|--) - - it is processed as if it were - - (?C255)A(?C255)((?C255)\d{2}(?C255)|(?C255)-(?C255)-(?C255))(?C255) - - Notice that there is a callout before and after each parenthesis and - alternation bar. If the pattern contains a conditional group whose con- - dition is an assertion, an automatic callout is inserted immediately - before the condition. Such a callout may also be inserted explicitly, - for example: - - (?(?C9)(?=a)ab|de) - - This applies only to assertion conditions (because they are themselves - independent groups). - - Automatic callouts can be used for tracking the progress of pattern - matching. The pcretest program has a pattern qualifier (/C) that sets - automatic callouts; when it is used, the output indicates how the pat- - tern is being matched. This is useful information when you are trying - to optimize the performance of a particular pattern. - - -MISSING CALLOUTS - - You should be aware that, because of optimizations in the way PCRE com- - piles and matches patterns, callouts sometimes do not happen exactly as - you might expect. - - At compile time, PCRE "auto-possessifies" repeated items when it knows - that what follows cannot be part of the repeat. For example, a+[bc] is - compiled as if it were a++[bc]. The pcretest output when this pattern - is anchored and then applied with automatic callouts to the string - "aaaa" is: - - --->aaaa - +0 ^ ^ - +1 ^ a+ - +3 ^ ^ [bc] - No match - - This indicates that when matching [bc] fails, there is no backtracking - into a+ and therefore the callouts that would be taken for the back- - tracks do not occur. You can disable the auto-possessify feature by - passing PCRE_NO_AUTO_POSSESS to pcre_compile(), or starting the pattern - with (*NO_AUTO_POSSESS). If this is done in pcretest (using the /O - qualifier), the output changes to this: - - --->aaaa - +0 ^ ^ - +1 ^ a+ - +3 ^ ^ [bc] - +3 ^ ^ [bc] - +3 ^ ^ [bc] - +3 ^^ [bc] - No match - - This time, when matching [bc] fails, the matcher backtracks into a+ and - tries again, repeatedly, until a+ itself fails. - - Other optimizations that provide fast "no match" results also affect - callouts. For example, if the pattern is - - ab(?C4)cd - - PCRE knows that any matching string must contain the letter "d". If the - subject string is "abyz", the lack of "d" means that matching doesn't - ever start, and the callout is never reached. However, with "abyd", - though the result is still no match, the callout is obeyed. - - If the pattern is studied, PCRE knows the minimum length of a matching - string, and will immediately give a "no match" return without actually - running a match if the subject is not long enough, or, for unanchored - patterns, if it has been scanned far enough. - - You can disable these optimizations by passing the PCRE_NO_START_OPTI- - MIZE option to the matching function, or by starting the pattern with - (*NO_START_OPT). This slows down the matching process, but does ensure - that callouts such as the example above are obeyed. - - -THE CALLOUT INTERFACE - - During matching, when PCRE reaches a callout point, the external func- - tion defined by pcre_callout or pcre[16|32]_callout is called (if it is - set). This applies to both normal and DFA matching. The only argument - to the callout function is a pointer to a pcre_callout or - pcre[16|32]_callout block. These structures contains the following - fields: - - int version; - int callout_number; - int *offset_vector; - const char *subject; (8-bit version) - PCRE_SPTR16 subject; (16-bit version) - PCRE_SPTR32 subject; (32-bit version) - int subject_length; - int start_match; - int current_position; - int capture_top; - int capture_last; - void *callout_data; - int pattern_position; - int next_item_length; - const unsigned char *mark; (8-bit version) - const PCRE_UCHAR16 *mark; (16-bit version) - const PCRE_UCHAR32 *mark; (32-bit version) - - The version field is an integer containing the version number of the - block format. The initial version was 0; the current version is 2. The - version number will change again in future if additional fields are - added, but the intention is never to remove any of the existing fields. - - The callout_number field contains the number of the callout, as com- - piled into the pattern (that is, the number after ?C for manual call- - outs, and 255 for automatically generated callouts). - - The offset_vector field is a pointer to the vector of offsets that was - passed by the caller to the matching function. When pcre_exec() or - pcre[16|32]_exec() is used, the contents can be inspected, in order to - extract substrings that have been matched so far, in the same way as - for extracting substrings after a match has completed. For the DFA - matching functions, this field is not useful. - - The subject and subject_length fields contain copies of the values that - were passed to the matching function. - - The start_match field normally contains the offset within the subject - at which the current match attempt started. However, if the escape - sequence \K has been encountered, this value is changed to reflect the - modified starting point. If the pattern is not anchored, the callout - function may be called several times from the same point in the pattern - for different starting points in the subject. - - The current_position field contains the offset within the subject of - the current match pointer. - - When the pcre_exec() or pcre[16|32]_exec() is used, the capture_top - field contains one more than the number of the highest numbered cap- - tured substring so far. If no substrings have been captured, the value - of capture_top is one. This is always the case when the DFA functions - are used, because they do not support captured substrings. - - The capture_last field contains the number of the most recently cap- - tured substring. However, when a recursion exits, the value reverts to - what it was outside the recursion, as do the values of all captured - substrings. If no substrings have been captured, the value of cap- - ture_last is -1. This is always the case for the DFA matching func- - tions. - - The callout_data field contains a value that is passed to a matching - function specifically so that it can be passed back in callouts. It is - passed in the callout_data field of a pcre_extra or pcre[16|32]_extra - data structure. If no such data was passed, the value of callout_data - in a callout block is NULL. There is a description of the pcre_extra - structure in the pcreapi documentation. - - The pattern_position field is present from version 1 of the callout - structure. It contains the offset to the next item to be matched in the - pattern string. - - The next_item_length field is present from version 1 of the callout - structure. It contains the length of the next item to be matched in the - pattern string. When the callout immediately precedes an alternation - bar, a closing parenthesis, or the end of the pattern, the length is - zero. When the callout precedes an opening parenthesis, the length is - that of the entire subpattern. - - The pattern_position and next_item_length fields are intended to help - in distinguishing between different automatic callouts, which all have - the same callout number. However, they are set for all callouts. - - The mark field is present from version 2 of the callout structure. In - callouts from pcre_exec() or pcre[16|32]_exec() it contains a pointer - to the zero-terminated name of the most recently passed (*MARK), - (*PRUNE), or (*THEN) item in the match, or NULL if no such items have - been passed. Instances of (*PRUNE) or (*THEN) without a name do not - obliterate a previous (*MARK). In callouts from the DFA matching func- - tions this field always contains NULL. - - -RETURN VALUES - - The external callout function returns an integer to PCRE. If the value - is zero, matching proceeds as normal. If the value is greater than - zero, matching fails at the current point, but the testing of other - matching possibilities goes ahead, just as if a lookahead assertion had - failed. If the value is less than zero, the match is abandoned, the - matching function returns the negative value. - - Negative values should normally be chosen from the set of - PCRE_ERROR_xxx values. In particular, PCRE_ERROR_NOMATCH forces a stan- - dard "no match" failure. The error number PCRE_ERROR_CALLOUT is - reserved for use by callout functions; it will never be used by PCRE - itself. - - -AUTHOR - - Philip Hazel - University Computing Service - Cambridge CB2 3QH, England. - - -REVISION - - Last updated: 12 November 2013 - Copyright (c) 1997-2013 University of Cambridge. ------------------------------------------------------------------------------- - - -PCRECOMPAT(3) Library Functions Manual PCRECOMPAT(3) - - - -NAME - PCRE - Perl-compatible regular expressions - -DIFFERENCES BETWEEN PCRE AND PERL - - This document describes the differences in the ways that PCRE and Perl - handle regular expressions. The differences described here are with - respect to Perl versions 5.10 and above. - - 1. PCRE has only a subset of Perl's Unicode support. Details of what it - does have are given in the pcreunicode page. - - 2. PCRE allows repeat quantifiers only on parenthesized assertions, but - they do not mean what you might think. For example, (?!a){3} does not - assert that the next three characters are not "a". It just asserts that - the next character is not "a" three times (in principle: PCRE optimizes - this to run the assertion just once). Perl allows repeat quantifiers on - other assertions such as \b, but these do not seem to have any use. - - 3. Capturing subpatterns that occur inside negative lookahead asser- - tions are counted, but their entries in the offsets vector are never - set. Perl sometimes (but not always) sets its numerical variables from - inside negative assertions. - - 4. Though binary zero characters are supported in the subject string, - they are not allowed in a pattern string because it is passed as a nor- - mal C string, terminated by zero. The escape sequence \0 can be used in - the pattern to represent a binary zero. - - 5. The following Perl escape sequences are not supported: \l, \u, \L, - \U, and \N when followed by a character name or Unicode value. (\N on - its own, matching a non-newline character, is supported.) In fact these - are implemented by Perl's general string-handling and are not part of - its pattern matching engine. If any of these are encountered by PCRE, - an error is generated by default. However, if the PCRE_JAVASCRIPT_COM- - PAT option is set, \U and \u are interpreted as JavaScript interprets - them. - - 6. The Perl escape sequences \p, \P, and \X are supported only if PCRE - is built with Unicode character property support. The properties that - can be tested with \p and \P are limited to the general category prop- - erties such as Lu and Nd, script names such as Greek or Han, and the - derived properties Any and L&. PCRE does support the Cs (surrogate) - property, which Perl does not; the Perl documentation says "Because - Perl hides the need for the user to understand the internal representa- - tion of Unicode characters, there is no need to implement the somewhat - messy concept of surrogates." - - 7. PCRE does support the \Q...\E escape for quoting substrings. Charac- - ters in between are treated as literals. This is slightly different - from Perl in that $ and @ are also handled as literals inside the - quotes. In Perl, they cause variable interpolation (but of course PCRE - does not have variables). Note the following examples: - - Pattern PCRE matches Perl matches - - \Qabc$xyz\E abc$xyz abc followed by the - contents of $xyz - \Qabc\$xyz\E abc\$xyz abc\$xyz - \Qabc\E\$\Qxyz\E abc$xyz abc$xyz - - The \Q...\E sequence is recognized both inside and outside character - classes. - - 8. Fairly obviously, PCRE does not support the (?{code}) and (??{code}) - constructions. However, there is support for recursive patterns. This - is not available in Perl 5.8, but it is in Perl 5.10. Also, the PCRE - "callout" feature allows an external function to be called during pat- - tern matching. See the pcrecallout documentation for details. - - 9. Subpatterns that are called as subroutines (whether or not recur- - sively) are always treated as atomic groups in PCRE. This is like - Python, but unlike Perl. Captured values that are set outside a sub- - routine call can be reference from inside in PCRE, but not in Perl. - There is a discussion that explains these differences in more detail in - the section on recursion differences from Perl in the pcrepattern page. - - 10. If any of the backtracking control verbs are used in a subpattern - that is called as a subroutine (whether or not recursively), their - effect is confined to that subpattern; it does not extend to the sur- - rounding pattern. This is not always the case in Perl. In particular, - if (*THEN) is present in a group that is called as a subroutine, its - action is limited to that group, even if the group does not contain any - | characters. Note that such subpatterns are processed as anchored at - the point where they are tested. - - 11. If a pattern contains more than one backtracking control verb, the - first one that is backtracked onto acts. For example, in the pattern - A(*COMMIT)B(*PRUNE)C a failure in B triggers (*COMMIT), but a failure - in C triggers (*PRUNE). Perl's behaviour is more complex; in many cases - it is the same as PCRE, but there are examples where it differs. - - 12. Most backtracking verbs in assertions have their normal actions. - They are not confined to the assertion. - - 13. There are some differences that are concerned with the settings of - captured strings when part of a pattern is repeated. For example, - matching "aba" against the pattern /^(a(b)?)+$/ in Perl leaves $2 - unset, but in PCRE it is set to "b". - - 14. PCRE's handling of duplicate subpattern numbers and duplicate sub- - pattern names is not as general as Perl's. This is a consequence of the - fact the PCRE works internally just with numbers, using an external ta- - ble to translate between numbers and names. In particular, a pattern - such as (?|(?A)|(?B), where the two capturing parentheses have - the same number but different names, is not supported, and causes an - error at compile time. If it were allowed, it would not be possible to - distinguish which parentheses matched, because both names map to cap- - turing subpattern number 1. To avoid this confusing situation, an error - is given at compile time. - - 15. Perl recognizes comments in some places that PCRE does not, for - example, between the ( and ? at the start of a subpattern. If the /x - modifier is set, Perl allows white space between ( and ? (though cur- - rent Perls warn that this is deprecated) but PCRE never does, even if - the PCRE_EXTENDED option is set. - - 16. Perl, when in warning mode, gives warnings for character classes - such as [A-\d] or [a-[:digit:]]. It then treats the hyphens as liter- - als. PCRE has no warning features, so it gives an error in these cases - because they are almost certainly user mistakes. - - 17. In PCRE, the upper/lower case character properties Lu and Ll are - not affected when case-independent matching is specified. For example, - \p{Lu} always matches an upper case letter. I think Perl has changed in - this respect; in the release at the time of writing (5.16), \p{Lu} and - \p{Ll} match all letters, regardless of case, when case independence is - specified. - - 18. PCRE provides some extensions to the Perl regular expression facil- - ities. Perl 5.10 includes new features that are not in earlier ver- - sions of Perl, some of which (such as named parentheses) have been in - PCRE for some time. This list is with respect to Perl 5.10: - - (a) Although lookbehind assertions in PCRE must match fixed length - strings, each alternative branch of a lookbehind assertion can match a - different length of string. Perl requires them all to have the same - length. - - (b) If PCRE_DOLLAR_ENDONLY is set and PCRE_MULTILINE is not set, the $ - meta-character matches only at the very end of the string. - - (c) If PCRE_EXTRA is set, a backslash followed by a letter with no spe- - cial meaning is faulted. Otherwise, like Perl, the backslash is quietly - ignored. (Perl can be made to issue a warning.) - - (d) If PCRE_UNGREEDY is set, the greediness of the repetition quanti- - fiers is inverted, that is, by default they are not greedy, but if fol- - lowed by a question mark they are. - - (e) PCRE_ANCHORED can be used at matching time to force a pattern to be - tried only at the first matching position in the subject string. - - (f) The PCRE_NOTBOL, PCRE_NOTEOL, PCRE_NOTEMPTY, PCRE_NOTEMPTY_ATSTART, - and PCRE_NO_AUTO_CAPTURE options for pcre_exec() have no Perl equiva- - lents. - - (g) The \R escape sequence can be restricted to match only CR, LF, or - CRLF by the PCRE_BSR_ANYCRLF option. - - (h) The callout facility is PCRE-specific. - - (i) The partial matching facility is PCRE-specific. - - (j) Patterns compiled by PCRE can be saved and re-used at a later time, - even on different hosts that have the other endianness. However, this - does not apply to optimized data created by the just-in-time compiler. - - (k) The alternative matching functions (pcre_dfa_exec(), - pcre16_dfa_exec() and pcre32_dfa_exec(),) match in a different way and - are not Perl-compatible. - - (l) PCRE recognizes some special sequences such as (*CR) at the start - of a pattern that set overall options that cannot be changed within the - pattern. - - -AUTHOR - - Philip Hazel - University Computing Service - Cambridge CB2 3QH, England. - - -REVISION - - Last updated: 10 November 2013 - Copyright (c) 1997-2013 University of Cambridge. ------------------------------------------------------------------------------- - - -PCREPATTERN(3) Library Functions Manual PCREPATTERN(3) - - - -NAME - PCRE - Perl-compatible regular expressions - -PCRE REGULAR EXPRESSION DETAILS - - The syntax and semantics of the regular expressions that are supported - by PCRE are described in detail below. There is a quick-reference syn- - tax summary in the pcresyntax page. PCRE tries to match Perl syntax and - semantics as closely as it can. PCRE also supports some alternative - regular expression syntax (which does not conflict with the Perl syn- - tax) in order to provide some compatibility with regular expressions in - Python, .NET, and Oniguruma. - - Perl's regular expressions are described in its own documentation, and - regular expressions in general are covered in a number of books, some - of which have copious examples. Jeffrey Friedl's "Mastering Regular - Expressions", published by O'Reilly, covers regular expressions in - great detail. This description of PCRE's regular expressions is - intended as reference material. - - This document discusses the patterns that are supported by PCRE when - one its main matching functions, pcre_exec() (8-bit) or - pcre[16|32]_exec() (16- or 32-bit), is used. PCRE also has alternative - matching functions, pcre_dfa_exec() and pcre[16|32_dfa_exec(), which - match using a different algorithm that is not Perl-compatible. Some of - the features discussed below are not available when DFA matching is - used. The advantages and disadvantages of the alternative functions, - and how they differ from the normal functions, are discussed in the - pcrematching page. - - -SPECIAL START-OF-PATTERN ITEMS - - A number of options that can be passed to pcre_compile() can also be - set by special items at the start of a pattern. These are not Perl-com- - patible, but are provided to make these options accessible to pattern - writers who are not able to change the program that processes the pat- - tern. Any number of these items may appear, but they must all be - together right at the start of the pattern string, and the letters must - be in upper case. - - UTF support - - The original operation of PCRE was on strings of one-byte characters. - However, there is now also support for UTF-8 strings in the original - library, an extra library that supports 16-bit and UTF-16 character - strings, and a third library that supports 32-bit and UTF-32 character - strings. To use these features, PCRE must be built to include appropri- - ate support. When using UTF strings you must either call the compiling - function with the PCRE_UTF8, PCRE_UTF16, or PCRE_UTF32 option, or the - pattern must start with one of these special sequences: - - (*UTF8) - (*UTF16) - (*UTF32) - (*UTF) - - (*UTF) is a generic sequence that can be used with any of the - libraries. Starting a pattern with such a sequence is equivalent to - setting the relevant option. How setting a UTF mode affects pattern - matching is mentioned in several places below. There is also a summary - of features in the pcreunicode page. - - Some applications that allow their users to supply patterns may wish to - restrict them to non-UTF data for security reasons. If the - PCRE_NEVER_UTF option is set at compile time, (*UTF) etc. are not - allowed, and their appearance causes an error. - - Unicode property support - - Another special sequence that may appear at the start of a pattern is - (*UCP). This has the same effect as setting the PCRE_UCP option: it - causes sequences such as \d and \w to use Unicode properties to deter- - mine character types, instead of recognizing only characters with codes - less than 128 via a lookup table. - - Disabling auto-possessification - - If a pattern starts with (*NO_AUTO_POSSESS), it has the same effect as - setting the PCRE_NO_AUTO_POSSESS option at compile time. This stops - PCRE from making quantifiers possessive when what follows cannot match - the repeated item. For example, by default a+b is treated as a++b. For - more details, see the pcreapi documentation. - - Disabling start-up optimizations - - If a pattern starts with (*NO_START_OPT), it has the same effect as - setting the PCRE_NO_START_OPTIMIZE option either at compile or matching - time. This disables several optimizations for quickly reaching "no - match" results. For more details, see the pcreapi documentation. - - Newline conventions - - PCRE supports five different conventions for indicating line breaks in - strings: a single CR (carriage return) character, a single LF (line- - feed) character, the two-character sequence CRLF, any of the three pre- - ceding, or any Unicode newline sequence. The pcreapi page has further - discussion about newlines, and shows how to set the newline convention - in the options arguments for the compiling and matching functions. - - It is also possible to specify a newline convention by starting a pat- - tern string with one of the following five sequences: - - (*CR) carriage return - (*LF) linefeed - (*CRLF) carriage return, followed by linefeed - (*ANYCRLF) any of the three above - (*ANY) all Unicode newline sequences - - These override the default and the options given to the compiling func- - tion. For example, on a Unix system where LF is the default newline - sequence, the pattern - - (*CR)a.b - - changes the convention to CR. That pattern matches "a\nb" because LF is - no longer a newline. If more than one of these settings is present, the - last one is used. - - The newline convention affects where the circumflex and dollar asser- - tions are true. It also affects the interpretation of the dot metachar- - acter when PCRE_DOTALL is not set, and the behaviour of \N. However, it - does not affect what the \R escape sequence matches. By default, this - is any Unicode newline sequence, for Perl compatibility. However, this - can be changed; see the description of \R in the section entitled "New- - line sequences" below. A change of \R setting can be combined with a - change of newline convention. - - Setting match and recursion limits - - The caller of pcre_exec() can set a limit on the number of times the - internal match() function is called and on the maximum depth of recur- - sive calls. These facilities are provided to catch runaway matches that - are provoked by patterns with huge matching trees (a typical example is - a pattern with nested unlimited repeats) and to avoid running out of - system stack by too much recursion. When one of these limits is - reached, pcre_exec() gives an error return. The limits can also be set - by items at the start of the pattern of the form - - (*LIMIT_MATCH=d) - (*LIMIT_RECURSION=d) - - where d is any number of decimal digits. However, the value of the set- - ting must be less than the value set (or defaulted) by the caller of - pcre_exec() for it to have any effect. In other words, the pattern - writer can lower the limits set by the programmer, but not raise them. - If there is more than one setting of one of these limits, the lower - value is used. - - -EBCDIC CHARACTER CODES - - PCRE can be compiled to run in an environment that uses EBCDIC as its - character code rather than ASCII or Unicode (typically a mainframe sys- - tem). In the sections below, character code values are ASCII or Uni- - code; in an EBCDIC environment these characters may have different code - values, and there are no code points greater than 255. - - -CHARACTERS AND METACHARACTERS - - A regular expression is a pattern that is matched against a subject - string from left to right. Most characters stand for themselves in a - pattern, and match the corresponding characters in the subject. As a - trivial example, the pattern - - The quick brown fox - - matches a portion of a subject string that is identical to itself. When - caseless matching is specified (the PCRE_CASELESS option), letters are - matched independently of case. In a UTF mode, PCRE always understands - the concept of case for characters whose values are less than 128, so - caseless matching is always possible. For characters with higher val- - ues, the concept of case is supported if PCRE is compiled with Unicode - property support, but not otherwise. If you want to use caseless - matching for characters 128 and above, you must ensure that PCRE is - compiled with Unicode property support as well as with UTF support. - - The power of regular expressions comes from the ability to include - alternatives and repetitions in the pattern. These are encoded in the - pattern by the use of metacharacters, which do not stand for themselves - but instead are interpreted in some special way. - - There are two different sets of metacharacters: those that are recog- - nized anywhere in the pattern except within square brackets, and those - that are recognized within square brackets. Outside square brackets, - the metacharacters are as follows: - - \ general escape character with several uses - ^ assert start of string (or line, in multiline mode) - $ assert end of string (or line, in multiline mode) - . match any character except newline (by default) - [ start character class definition - | start of alternative branch - ( start subpattern - ) end subpattern - ? extends the meaning of ( - also 0 or 1 quantifier - also quantifier minimizer - * 0 or more quantifier - + 1 or more quantifier - also "possessive quantifier" - { start min/max quantifier - - Part of a pattern that is in square brackets is called a "character - class". In a character class the only metacharacters are: - - \ general escape character - ^ negate the class, but only if the first character - - indicates character range - [ POSIX character class (only if followed by POSIX - syntax) - ] terminates the character class - - The following sections describe the use of each of the metacharacters. - - -BACKSLASH - - The backslash character has several uses. Firstly, if it is followed by - a character that is not a number or a letter, it takes away any special - meaning that character may have. This use of backslash as an escape - character applies both inside and outside character classes. - - For example, if you want to match a * character, you write \* in the - pattern. This escaping action applies whether or not the following - character would otherwise be interpreted as a metacharacter, so it is - always safe to precede a non-alphanumeric with backslash to specify - that it stands for itself. In particular, if you want to match a back- - slash, you write \\. - - In a UTF mode, only ASCII numbers and letters have any special meaning - after a backslash. All other characters (in particular, those whose - codepoints are greater than 127) are treated as literals. - - If a pattern is compiled with the PCRE_EXTENDED option, most white - space in the pattern (other than in a character class), and characters - between a # outside a character class and the next newline, inclusive, - are ignored. An escaping backslash can be used to include a white space - or # character as part of the pattern. - - If you want to remove the special meaning from a sequence of charac- - ters, you can do so by putting them between \Q and \E. This is differ- - ent from Perl in that $ and @ are handled as literals in \Q...\E - sequences in PCRE, whereas in Perl, $ and @ cause variable interpola- - tion. Note the following examples: - - Pattern PCRE matches Perl matches - - \Qabc$xyz\E abc$xyz abc followed by the - contents of $xyz - \Qabc\$xyz\E abc\$xyz abc\$xyz - \Qabc\E\$\Qxyz\E abc$xyz abc$xyz - - The \Q...\E sequence is recognized both inside and outside character - classes. An isolated \E that is not preceded by \Q is ignored. If \Q - is not followed by \E later in the pattern, the literal interpretation - continues to the end of the pattern (that is, \E is assumed at the - end). If the isolated \Q is inside a character class, this causes an - error, because the character class is not terminated. - - Non-printing characters - - A second use of backslash provides a way of encoding non-printing char- - acters in patterns in a visible manner. There is no restriction on the - appearance of non-printing characters, apart from the binary zero that - terminates a pattern, but when a pattern is being prepared by text - editing, it is often easier to use one of the following escape - sequences than the binary character it represents. In an ASCII or Uni- - code environment, these escapes are as follows: - - \a alarm, that is, the BEL character (hex 07) - \cx "control-x", where x is any ASCII character - \e escape (hex 1B) - \f form feed (hex 0C) - \n linefeed (hex 0A) - \r carriage return (hex 0D) - \t tab (hex 09) - \0dd character with octal code 0dd - \ddd character with octal code ddd, or back reference - \o{ddd..} character with octal code ddd.. - \xhh character with hex code hh - \x{hhh..} character with hex code hhh.. (non-JavaScript mode) - \uhhhh character with hex code hhhh (JavaScript mode only) - - The precise effect of \cx on ASCII characters is as follows: if x is a - lower case letter, it is converted to upper case. Then bit 6 of the - character (hex 40) is inverted. Thus \cA to \cZ become hex 01 to hex 1A - (A is 41, Z is 5A), but \c{ becomes hex 3B ({ is 7B), and \c; becomes - hex 7B (; is 3B). If the data item (byte or 16-bit value) following \c - has a value greater than 127, a compile-time error occurs. This locks - out non-ASCII characters in all modes. - - When PCRE is compiled in EBCDIC mode, \a, \e, \f, \n, \r, and \t gener- - ate the appropriate EBCDIC code values. The \c escape is processed as - specified for Perl in the perlebcdic document. The only characters that - are allowed after \c are A-Z, a-z, or one of @, [, \, ], ^, _, or ?. - Any other character provokes a compile-time error. The sequence \c@ - encodes character code 0; after \c the letters (in either case) encode - characters 1-26 (hex 01 to hex 1A); [, \, ], ^, and _ encode characters - 27-31 (hex 1B to hex 1F), and \c? becomes either 255 (hex FF) or 95 - (hex 5F). - - Thus, apart from \c?, these escapes generate the same character code - values as they do in an ASCII environment, though the meanings of the - values mostly differ. For example, \cG always generates code value 7, - which is BEL in ASCII but DEL in EBCDIC. - - The sequence \c? generates DEL (127, hex 7F) in an ASCII environment, - but because 127 is not a control character in EBCDIC, Perl makes it - generate the APC character. Unfortunately, there are several variants - of EBCDIC. In most of them the APC character has the value 255 (hex - FF), but in the one Perl calls POSIX-BC its value is 95 (hex 5F). If - certain other characters have POSIX-BC values, PCRE makes \c? generate - 95; otherwise it generates 255. - - After \0 up to two further octal digits are read. If there are fewer - than two digits, just those that are present are used. Thus the - sequence \0\x\015 specifies two binary zeros followed by a CR character - (code value 13). Make sure you supply two digits after the initial zero - if the pattern character that follows is itself an octal digit. - - The escape \o must be followed by a sequence of octal digits, enclosed - in braces. An error occurs if this is not the case. This escape is a - recent addition to Perl; it provides way of specifying character code - points as octal numbers greater than 0777, and it also allows octal - numbers and back references to be unambiguously specified. - - For greater clarity and unambiguity, it is best to avoid following \ by - a digit greater than zero. Instead, use \o{} or \x{} to specify charac- - ter numbers, and \g{} to specify back references. The following para- - graphs describe the old, ambiguous syntax. - - The handling of a backslash followed by a digit other than 0 is compli- - cated, and Perl has changed in recent releases, causing PCRE also to - change. Outside a character class, PCRE reads the digit and any follow- - ing digits as a decimal number. If the number is less than 8, or if - there have been at least that many previous capturing left parentheses - in the expression, the entire sequence is taken as a back reference. A - description of how this works is given later, following the discussion - of parenthesized subpatterns. - - Inside a character class, or if the decimal number following \ is - greater than 7 and there have not been that many capturing subpatterns, - PCRE handles \8 and \9 as the literal characters "8" and "9", and oth- - erwise re-reads up to three octal digits following the backslash, using - them to generate a data character. Any subsequent digits stand for - themselves. For example: - - \040 is another way of writing an ASCII space - \40 is the same, provided there are fewer than 40 - previous capturing subpatterns - \7 is always a back reference - \11 might be a back reference, or another way of - writing a tab - \011 is always a tab - \0113 is a tab followed by the character "3" - \113 might be a back reference, otherwise the - character with octal code 113 - \377 might be a back reference, otherwise - the value 255 (decimal) - \81 is either a back reference, or the two - characters "8" and "1" - - Note that octal values of 100 or greater that are specified using this - syntax must not be introduced by a leading zero, because no more than - three octal digits are ever read. - - By default, after \x that is not followed by {, from zero to two hexa- - decimal digits are read (letters can be in upper or lower case). Any - number of hexadecimal digits may appear between \x{ and }. If a charac- - ter other than a hexadecimal digit appears between \x{ and }, or if - there is no terminating }, an error occurs. - - If the PCRE_JAVASCRIPT_COMPAT option is set, the interpretation of \x - is as just described only when it is followed by two hexadecimal dig- - its. Otherwise, it matches a literal "x" character. In JavaScript - mode, support for code points greater than 256 is provided by \u, which - must be followed by four hexadecimal digits; otherwise it matches a - literal "u" character. - - Characters whose value is less than 256 can be defined by either of the - two syntaxes for \x (or by \u in JavaScript mode). There is no differ- - ence in the way they are handled. For example, \xdc is exactly the same - as \x{dc} (or \u00dc in JavaScript mode). - - Constraints on character values - - Characters that are specified using octal or hexadecimal numbers are - limited to certain values, as follows: - - 8-bit non-UTF mode less than 0x100 - 8-bit UTF-8 mode less than 0x10ffff and a valid codepoint - 16-bit non-UTF mode less than 0x10000 - 16-bit UTF-16 mode less than 0x10ffff and a valid codepoint - 32-bit non-UTF mode less than 0x100000000 - 32-bit UTF-32 mode less than 0x10ffff and a valid codepoint - - Invalid Unicode codepoints are the range 0xd800 to 0xdfff (the so- - called "surrogate" codepoints), and 0xffef. - - Escape sequences in character classes - - All the sequences that define a single character value can be used both - inside and outside character classes. In addition, inside a character - class, \b is interpreted as the backspace character (hex 08). - - \N is not allowed in a character class. \B, \R, and \X are not special - inside a character class. Like other unrecognized escape sequences, - they are treated as the literal characters "B", "R", and "X" by - default, but cause an error if the PCRE_EXTRA option is set. Outside a - character class, these sequences have different meanings. - - Unsupported escape sequences - - In Perl, the sequences \l, \L, \u, and \U are recognized by its string - handler and used to modify the case of following characters. By - default, PCRE does not support these escape sequences. However, if the - PCRE_JAVASCRIPT_COMPAT option is set, \U matches a "U" character, and - \u can be used to define a character by code point, as described in the - previous section. - - Absolute and relative back references - - The sequence \g followed by an unsigned or a negative number, option- - ally enclosed in braces, is an absolute or relative back reference. A - named back reference can be coded as \g{name}. Back references are dis- - cussed later, following the discussion of parenthesized subpatterns. - - Absolute and relative subroutine calls - - For compatibility with Oniguruma, the non-Perl syntax \g followed by a - name or a number enclosed either in angle brackets or single quotes, is - an alternative syntax for referencing a subpattern as a "subroutine". - Details are discussed later. Note that \g{...} (Perl syntax) and - \g<...> (Oniguruma syntax) are not synonymous. The former is a back - reference; the latter is a subroutine call. - - Generic character types - - Another use of backslash is for specifying generic character types: - - \d any decimal digit - \D any character that is not a decimal digit - \h any horizontal white space character - \H any character that is not a horizontal white space character - \s any white space character - \S any character that is not a white space character - \v any vertical white space character - \V any character that is not a vertical white space character - \w any "word" character - \W any "non-word" character - - There is also the single sequence \N, which matches a non-newline char- - acter. This is the same as the "." metacharacter when PCRE_DOTALL is - not set. Perl also uses \N to match characters by name; PCRE does not - support this. - - Each pair of lower and upper case escape sequences partitions the com- - plete set of characters into two disjoint sets. Any given character - matches one, and only one, of each pair. The sequences can appear both - inside and outside character classes. They each match one character of - the appropriate type. If the current matching point is at the end of - the subject string, all of them fail, because there is no character to - match. - - For compatibility with Perl, \s did not used to match the VT character - (code 11), which made it different from the the POSIX "space" class. - However, Perl added VT at release 5.18, and PCRE followed suit at - release 8.34. The default \s characters are now HT (9), LF (10), VT - (11), FF (12), CR (13), and space (32), which are defined as white - space in the "C" locale. This list may vary if locale-specific matching - is taking place. For example, in some locales the "non-breaking space" - character (\xA0) is recognized as white space, and in others the VT - character is not. - - A "word" character is an underscore or any character that is a letter - or digit. By default, the definition of letters and digits is con- - trolled by PCRE's low-valued character tables, and may vary if locale- - specific matching is taking place (see "Locale support" in the pcreapi - page). For example, in a French locale such as "fr_FR" in Unix-like - systems, or "french" in Windows, some character codes greater than 127 - are used for accented letters, and these are then matched by \w. The - use of locales with Unicode is discouraged. - - By default, characters whose code points are greater than 127 never - match \d, \s, or \w, and always match \D, \S, and \W, although this may - vary for characters in the range 128-255 when locale-specific matching - is happening. These escape sequences retain their original meanings - from before Unicode support was available, mainly for efficiency rea- - sons. If PCRE is compiled with Unicode property support, and the - PCRE_UCP option is set, the behaviour is changed so that Unicode prop- - erties are used to determine character types, as follows: - - \d any character that matches \p{Nd} (decimal digit) - \s any character that matches \p{Z} or \h or \v - \w any character that matches \p{L} or \p{N}, plus underscore - - The upper case escapes match the inverse sets of characters. Note that - \d matches only decimal digits, whereas \w matches any Unicode digit, - as well as any Unicode letter, and underscore. Note also that PCRE_UCP - affects \b, and \B because they are defined in terms of \w and \W. - Matching these sequences is noticeably slower when PCRE_UCP is set. - - The sequences \h, \H, \v, and \V are features that were added to Perl - at release 5.10. In contrast to the other sequences, which match only - ASCII characters by default, these always match certain high-valued - code points, whether or not PCRE_UCP is set. The horizontal space char- - acters are: - - U+0009 Horizontal tab (HT) - U+0020 Space - U+00A0 Non-break space - U+1680 Ogham space mark - U+180E Mongolian vowel separator - U+2000 En quad - U+2001 Em quad - U+2002 En space - U+2003 Em space - U+2004 Three-per-em space - U+2005 Four-per-em space - U+2006 Six-per-em space - U+2007 Figure space - U+2008 Punctuation space - U+2009 Thin space - U+200A Hair space - U+202F Narrow no-break space - U+205F Medium mathematical space - U+3000 Ideographic space - - The vertical space characters are: - - U+000A Linefeed (LF) - U+000B Vertical tab (VT) - U+000C Form feed (FF) - U+000D Carriage return (CR) - U+0085 Next line (NEL) - U+2028 Line separator - U+2029 Paragraph separator - - In 8-bit, non-UTF-8 mode, only the characters with codepoints less than - 256 are relevant. - - Newline sequences - - Outside a character class, by default, the escape sequence \R matches - any Unicode newline sequence. In 8-bit non-UTF-8 mode \R is equivalent - to the following: - - (?>\r\n|\n|\x0b|\f|\r|\x85) - - This is an example of an "atomic group", details of which are given - below. This particular group matches either the two-character sequence - CR followed by LF, or one of the single characters LF (linefeed, - U+000A), VT (vertical tab, U+000B), FF (form feed, U+000C), CR (car- - riage return, U+000D), or NEL (next line, U+0085). The two-character - sequence is treated as a single unit that cannot be split. - - In other modes, two additional characters whose codepoints are greater - than 255 are added: LS (line separator, U+2028) and PS (paragraph sepa- - rator, U+2029). Unicode character property support is not needed for - these characters to be recognized. - - It is possible to restrict \R to match only CR, LF, or CRLF (instead of - the complete set of Unicode line endings) by setting the option - PCRE_BSR_ANYCRLF either at compile time or when the pattern is matched. - (BSR is an abbrevation for "backslash R".) This can be made the default - when PCRE is built; if this is the case, the other behaviour can be - requested via the PCRE_BSR_UNICODE option. It is also possible to - specify these settings by starting a pattern string with one of the - following sequences: - - (*BSR_ANYCRLF) CR, LF, or CRLF only - (*BSR_UNICODE) any Unicode newline sequence - - These override the default and the options given to the compiling func- - tion, but they can themselves be overridden by options given to a - matching function. Note that these special settings, which are not - Perl-compatible, are recognized only at the very start of a pattern, - and that they must be in upper case. If more than one of them is - present, the last one is used. They can be combined with a change of - newline convention; for example, a pattern can start with: - - (*ANY)(*BSR_ANYCRLF) - - They can also be combined with the (*UTF8), (*UTF16), (*UTF32), (*UTF) - or (*UCP) special sequences. Inside a character class, \R is treated as - an unrecognized escape sequence, and so matches the letter "R" by - default, but causes an error if PCRE_EXTRA is set. - - Unicode character properties - - When PCRE is built with Unicode character property support, three addi- - tional escape sequences that match characters with specific properties - are available. When in 8-bit non-UTF-8 mode, these sequences are of - course limited to testing characters whose codepoints are less than - 256, but they do work in this mode. The extra escape sequences are: - - \p{xx} a character with the xx property - \P{xx} a character without the xx property - \X a Unicode extended grapheme cluster - - The property names represented by xx above are limited to the Unicode - script names, the general category properties, "Any", which matches any - character (including newline), and some special PCRE properties - (described in the next section). Other Perl properties such as "InMu- - sicalSymbols" are not currently supported by PCRE. Note that \P{Any} - does not match any characters, so always causes a match failure. - - Sets of Unicode characters are defined as belonging to certain scripts. - A character from one of these sets can be matched using a script name. - For example: - - \p{Greek} - \P{Han} - - Those that are not part of an identified script are lumped together as - "Common". The current list of scripts is: - - Arabic, Armenian, Avestan, Balinese, Bamum, Bassa_Vah, Batak, Bengali, - Bopomofo, Brahmi, Braille, Buginese, Buhid, Canadian_Aboriginal, Car- - ian, Caucasian_Albanian, Chakma, Cham, Cherokee, Common, Coptic, Cunei- - form, Cypriot, Cyrillic, Deseret, Devanagari, Duployan, Egyptian_Hiero- - glyphs, Elbasan, Ethiopic, Georgian, Glagolitic, Gothic, Grantha, - Greek, Gujarati, Gurmukhi, Han, Hangul, Hanunoo, Hebrew, Hiragana, - Imperial_Aramaic, Inherited, Inscriptional_Pahlavi, Inscrip- - tional_Parthian, Javanese, Kaithi, Kannada, Katakana, Kayah_Li, - Kharoshthi, Khmer, Khojki, Khudawadi, Lao, Latin, Lepcha, Limbu, Lin- - ear_A, Linear_B, Lisu, Lycian, Lydian, Mahajani, Malayalam, Mandaic, - Manichaean, Meetei_Mayek, Mende_Kikakui, Meroitic_Cursive, - Meroitic_Hieroglyphs, Miao, Modi, Mongolian, Mro, Myanmar, Nabataean, - New_Tai_Lue, Nko, Ogham, Ol_Chiki, Old_Italic, Old_North_Arabian, - Old_Permic, Old_Persian, Old_South_Arabian, Old_Turkic, Oriya, Osmanya, - Pahawh_Hmong, Palmyrene, Pau_Cin_Hau, Phags_Pa, Phoenician, - Psalter_Pahlavi, Rejang, Runic, Samaritan, Saurashtra, Sharada, Sha- - vian, Siddham, Sinhala, Sora_Sompeng, Sundanese, Syloti_Nagri, Syriac, - Tagalog, Tagbanwa, Tai_Le, Tai_Tham, Tai_Viet, Takri, Tamil, Telugu, - Thaana, Thai, Tibetan, Tifinagh, Tirhuta, Ugaritic, Vai, Warang_Citi, - Yi. - - Each character has exactly one Unicode general category property, spec- - ified by a two-letter abbreviation. For compatibility with Perl, nega- - tion can be specified by including a circumflex between the opening - brace and the property name. For example, \p{^Lu} is the same as - \P{Lu}. - - If only one letter is specified with \p or \P, it includes all the gen- - eral category properties that start with that letter. In this case, in - the absence of negation, the curly brackets in the escape sequence are - optional; these two examples have the same effect: - - \p{L} - \pL - - The following general category property codes are supported: - - C Other - Cc Control - Cf Format - Cn Unassigned - Co Private use - Cs Surrogate - - L Letter - Ll Lower case letter - Lm Modifier letter - Lo Other letter - Lt Title case letter - Lu Upper case letter - - M Mark - Mc Spacing mark - Me Enclosing mark - Mn Non-spacing mark - - N Number - Nd Decimal number - Nl Letter number - No Other number - - P Punctuation - Pc Connector punctuation - Pd Dash punctuation - Pe Close punctuation - Pf Final punctuation - Pi Initial punctuation - Po Other punctuation - Ps Open punctuation - - S Symbol - Sc Currency symbol - Sk Modifier symbol - Sm Mathematical symbol - So Other symbol - - Z Separator - Zl Line separator - Zp Paragraph separator - Zs Space separator - - The special property L& is also supported: it matches a character that - has the Lu, Ll, or Lt property, in other words, a letter that is not - classified as a modifier or "other". - - The Cs (Surrogate) property applies only to characters in the range - U+D800 to U+DFFF. Such characters are not valid in Unicode strings and - so cannot be tested by PCRE, unless UTF validity checking has been - turned off (see the discussion of PCRE_NO_UTF8_CHECK, - PCRE_NO_UTF16_CHECK and PCRE_NO_UTF32_CHECK in the pcreapi page). Perl - does not support the Cs property. - - The long synonyms for property names that Perl supports (such as - \p{Letter}) are not supported by PCRE, nor is it permitted to prefix - any of these properties with "Is". - - No character that is in the Unicode table has the Cn (unassigned) prop- - erty. Instead, this property is assumed for any code point that is not - in the Unicode table. - - Specifying caseless matching does not affect these escape sequences. - For example, \p{Lu} always matches only upper case letters. This is - different from the behaviour of current versions of Perl. - - Matching characters by Unicode property is not fast, because PCRE has - to do a multistage table lookup in order to find a character's prop- - erty. That is why the traditional escape sequences such as \d and \w do - not use Unicode properties in PCRE by default, though you can make them - do so by setting the PCRE_UCP option or by starting the pattern with - (*UCP). - - Extended grapheme clusters - - The \X escape matches any number of Unicode characters that form an - "extended grapheme cluster", and treats the sequence as an atomic group - (see below). Up to and including release 8.31, PCRE matched an ear- - lier, simpler definition that was equivalent to - - (?>\PM\pM*) - - That is, it matched a character without the "mark" property, followed - by zero or more characters with the "mark" property. Characters with - the "mark" property are typically non-spacing accents that affect the - preceding character. - - This simple definition was extended in Unicode to include more compli- - cated kinds of composite character by giving each character a grapheme - breaking property, and creating rules that use these properties to - define the boundaries of extended grapheme clusters. In releases of - PCRE later than 8.31, \X matches one of these clusters. - - \X always matches at least one character. Then it decides whether to - add additional characters according to the following rules for ending a - cluster: - - 1. End at the end of the subject string. - - 2. Do not end between CR and LF; otherwise end after any control char- - acter. - - 3. Do not break Hangul (a Korean script) syllable sequences. Hangul - characters are of five types: L, V, T, LV, and LVT. An L character may - be followed by an L, V, LV, or LVT character; an LV or V character may - be followed by a V or T character; an LVT or T character may be follwed - only by a T character. - - 4. Do not end before extending characters or spacing marks. Characters - with the "mark" property always have the "extend" grapheme breaking - property. - - 5. Do not end after prepend characters. - - 6. Otherwise, end the cluster. - - PCRE's additional properties - - As well as the standard Unicode properties described above, PCRE sup- - ports four more that make it possible to convert traditional escape - sequences such as \w and \s to use Unicode properties. PCRE uses these - non-standard, non-Perl properties internally when PCRE_UCP is set. How- - ever, they may also be used explicitly. These properties are: - - Xan Any alphanumeric character - Xps Any POSIX space character - Xsp Any Perl space character - Xwd Any Perl "word" character - - Xan matches characters that have either the L (letter) or the N (num- - ber) property. Xps matches the characters tab, linefeed, vertical tab, - form feed, or carriage return, and any other character that has the Z - (separator) property. Xsp is the same as Xps; it used to exclude ver- - tical tab, for Perl compatibility, but Perl changed, and so PCRE fol- - lowed at release 8.34. Xwd matches the same characters as Xan, plus - underscore. - - There is another non-standard property, Xuc, which matches any charac- - ter that can be represented by a Universal Character Name in C++ and - other programming languages. These are the characters $, @, ` (grave - accent), and all characters with Unicode code points greater than or - equal to U+00A0, except for the surrogates U+D800 to U+DFFF. Note that - most base (ASCII) characters are excluded. (Universal Character Names - are of the form \uHHHH or \UHHHHHHHH where H is a hexadecimal digit. - Note that the Xuc property does not match these sequences but the char- - acters that they represent.) - - Resetting the match start - - The escape sequence \K causes any previously matched characters not to - be included in the final matched sequence. For example, the pattern: - - foo\Kbar - - matches "foobar", but reports that it has matched "bar". This feature - is similar to a lookbehind assertion (described below). However, in - this case, the part of the subject before the real match does not have - to be of fixed length, as lookbehind assertions do. The use of \K does - not interfere with the setting of captured substrings. For example, - when the pattern - - (foo)\Kbar - - matches "foobar", the first substring is still set to "foo". - - Perl documents that the use of \K within assertions is "not well - defined". In PCRE, \K is acted upon when it occurs inside positive - assertions, but is ignored in negative assertions. Note that when a - pattern such as (?=ab\K) matches, the reported start of the match can - be greater than the end of the match. - - Simple assertions - - The final use of backslash is for certain simple assertions. An asser- - tion specifies a condition that has to be met at a particular point in - a match, without consuming any characters from the subject string. The - use of subpatterns for more complicated assertions is described below. - The backslashed assertions are: - - \b matches at a word boundary - \B matches when not at a word boundary - \A matches at the start of the subject - \Z matches at the end of the subject - also matches before a newline at the end of the subject - \z matches only at the end of the subject - \G matches at the first matching position in the subject - - Inside a character class, \b has a different meaning; it matches the - backspace character. If any other of these assertions appears in a - character class, by default it matches the corresponding literal char- - acter (for example, \B matches the letter B). However, if the - PCRE_EXTRA option is set, an "invalid escape sequence" error is gener- - ated instead. - - A word boundary is a position in the subject string where the current - character and the previous character do not both match \w or \W (i.e. - one matches \w and the other matches \W), or the start or end of the - string if the first or last character matches \w, respectively. In a - UTF mode, the meanings of \w and \W can be changed by setting the - PCRE_UCP option. When this is done, it also affects \b and \B. Neither - PCRE nor Perl has a separate "start of word" or "end of word" metase- - quence. However, whatever follows \b normally determines which it is. - For example, the fragment \ba matches "a" at the start of a word. - - The \A, \Z, and \z assertions differ from the traditional circumflex - and dollar (described in the next section) in that they only ever match - at the very start and end of the subject string, whatever options are - set. Thus, they are independent of multiline mode. These three asser- - tions are not affected by the PCRE_NOTBOL or PCRE_NOTEOL options, which - affect only the behaviour of the circumflex and dollar metacharacters. - However, if the startoffset argument of pcre_exec() is non-zero, indi- - cating that matching is to start at a point other than the beginning of - the subject, \A can never match. The difference between \Z and \z is - that \Z matches before a newline at the end of the string as well as at - the very end, whereas \z matches only at the end. - - The \G assertion is true only when the current matching position is at - the start point of the match, as specified by the startoffset argument - of pcre_exec(). It differs from \A when the value of startoffset is - non-zero. By calling pcre_exec() multiple times with appropriate argu- - ments, you can mimic Perl's /g option, and it is in this kind of imple- - mentation where \G can be useful. - - Note, however, that PCRE's interpretation of \G, as the start of the - current match, is subtly different from Perl's, which defines it as the - end of the previous match. In Perl, these can be different when the - previously matched string was empty. Because PCRE does just one match - at a time, it cannot reproduce this behaviour. - - If all the alternatives of a pattern begin with \G, the expression is - anchored to the starting match position, and the "anchored" flag is set - in the compiled regular expression. - - -CIRCUMFLEX AND DOLLAR - - The circumflex and dollar metacharacters are zero-width assertions. - That is, they test for a particular condition being true without con- - suming any characters from the subject string. - - Outside a character class, in the default matching mode, the circumflex - character is an assertion that is true only if the current matching - point is at the start of the subject string. If the startoffset argu- - ment of pcre_exec() is non-zero, circumflex can never match if the - PCRE_MULTILINE option is unset. Inside a character class, circumflex - has an entirely different meaning (see below). - - Circumflex need not be the first character of the pattern if a number - of alternatives are involved, but it should be the first thing in each - alternative in which it appears if the pattern is ever to match that - branch. If all possible alternatives start with a circumflex, that is, - if the pattern is constrained to match only at the start of the sub- - ject, it is said to be an "anchored" pattern. (There are also other - constructs that can cause a pattern to be anchored.) - - The dollar character is an assertion that is true only if the current - matching point is at the end of the subject string, or immediately - before a newline at the end of the string (by default). Note, however, - that it does not actually match the newline. Dollar need not be the - last character of the pattern if a number of alternatives are involved, - but it should be the last item in any branch in which it appears. Dol- - lar has no special meaning in a character class. - - The meaning of dollar can be changed so that it matches only at the - very end of the string, by setting the PCRE_DOLLAR_ENDONLY option at - compile time. This does not affect the \Z assertion. - - The meanings of the circumflex and dollar characters are changed if the - PCRE_MULTILINE option is set. When this is the case, a circumflex - matches immediately after internal newlines as well as at the start of - the subject string. It does not match after a newline that ends the - string. A dollar matches before any newlines in the string, as well as - at the very end, when PCRE_MULTILINE is set. When newline is specified - as the two-character sequence CRLF, isolated CR and LF characters do - not indicate newlines. - - For example, the pattern /^abc$/ matches the subject string "def\nabc" - (where \n represents a newline) in multiline mode, but not otherwise. - Consequently, patterns that are anchored in single line mode because - all branches start with ^ are not anchored in multiline mode, and a - match for circumflex is possible when the startoffset argument of - pcre_exec() is non-zero. The PCRE_DOLLAR_ENDONLY option is ignored if - PCRE_MULTILINE is set. - - Note that the sequences \A, \Z, and \z can be used to match the start - and end of the subject in both modes, and if all branches of a pattern - start with \A it is always anchored, whether or not PCRE_MULTILINE is - set. - - -FULL STOP (PERIOD, DOT) AND \N - - Outside a character class, a dot in the pattern matches any one charac- - ter in the subject string except (by default) a character that signi- - fies the end of a line. - - When a line ending is defined as a single character, dot never matches - that character; when the two-character sequence CRLF is used, dot does - not match CR if it is immediately followed by LF, but otherwise it - matches all characters (including isolated CRs and LFs). When any Uni- - code line endings are being recognized, dot does not match CR or LF or - any of the other line ending characters. - - The behaviour of dot with regard to newlines can be changed. If the - PCRE_DOTALL option is set, a dot matches any one character, without - exception. If the two-character sequence CRLF is present in the subject - string, it takes two dots to match it. - - The handling of dot is entirely independent of the handling of circum- - flex and dollar, the only relationship being that they both involve - newlines. Dot has no special meaning in a character class. - - The escape sequence \N behaves like a dot, except that it is not - affected by the PCRE_DOTALL option. In other words, it matches any - character except one that signifies the end of a line. Perl also uses - \N to match characters by name; PCRE does not support this. - - -MATCHING A SINGLE DATA UNIT - - Outside a character class, the escape sequence \C matches any one data - unit, whether or not a UTF mode is set. In the 8-bit library, one data - unit is one byte; in the 16-bit library it is a 16-bit unit; in the - 32-bit library it is a 32-bit unit. Unlike a dot, \C always matches - line-ending characters. The feature is provided in Perl in order to - match individual bytes in UTF-8 mode, but it is unclear how it can use- - fully be used. Because \C breaks up characters into individual data - units, matching one unit with \C in a UTF mode means that the rest of - the string may start with a malformed UTF character. This has undefined - results, because PCRE assumes that it is dealing with valid UTF strings - (and by default it checks this at the start of processing unless the - PCRE_NO_UTF8_CHECK, PCRE_NO_UTF16_CHECK or PCRE_NO_UTF32_CHECK option - is used). - - PCRE does not allow \C to appear in lookbehind assertions (described - below) in a UTF mode, because this would make it impossible to calcu- - late the length of the lookbehind. - - In general, the \C escape sequence is best avoided. However, one way of - using it that avoids the problem of malformed UTF characters is to use - a lookahead to check the length of the next character, as in this pat- - tern, which could be used with a UTF-8 string (ignore white space and - line breaks): - - (?| (?=[\x00-\x7f])(\C) | - (?=[\x80-\x{7ff}])(\C)(\C) | - (?=[\x{800}-\x{ffff}])(\C)(\C)(\C) | - (?=[\x{10000}-\x{1fffff}])(\C)(\C)(\C)(\C)) - - A group that starts with (?| resets the capturing parentheses numbers - in each alternative (see "Duplicate Subpattern Numbers" below). The - assertions at the start of each branch check the next UTF-8 character - for values whose encoding uses 1, 2, 3, or 4 bytes, respectively. The - character's individual bytes are then captured by the appropriate num- - ber of groups. - - -SQUARE BRACKETS AND CHARACTER CLASSES - - An opening square bracket introduces a character class, terminated by a - closing square bracket. A closing square bracket on its own is not spe- - cial by default. However, if the PCRE_JAVASCRIPT_COMPAT option is set, - a lone closing square bracket causes a compile-time error. If a closing - square bracket is required as a member of the class, it should be the - first data character in the class (after an initial circumflex, if - present) or escaped with a backslash. - - A character class matches a single character in the subject. In a UTF - mode, the character may be more than one data unit long. A matched - character must be in the set of characters defined by the class, unless - the first character in the class definition is a circumflex, in which - case the subject character must not be in the set defined by the class. - If a circumflex is actually required as a member of the class, ensure - it is not the first character, or escape it with a backslash. - - For example, the character class [aeiou] matches any lower case vowel, - while [^aeiou] matches any character that is not a lower case vowel. - Note that a circumflex is just a convenient notation for specifying the - characters that are in the class by enumerating those that are not. A - class that starts with a circumflex is not an assertion; it still con- - sumes a character from the subject string, and therefore it fails if - the current pointer is at the end of the string. - - In UTF-8 (UTF-16, UTF-32) mode, characters with values greater than 255 - (0xffff) can be included in a class as a literal string of data units, - or by using the \x{ escaping mechanism. - - When caseless matching is set, any letters in a class represent both - their upper case and lower case versions, so for example, a caseless - [aeiou] matches "A" as well as "a", and a caseless [^aeiou] does not - match "A", whereas a caseful version would. In a UTF mode, PCRE always - understands the concept of case for characters whose values are less - than 128, so caseless matching is always possible. For characters with - higher values, the concept of case is supported if PCRE is compiled - with Unicode property support, but not otherwise. If you want to use - caseless matching in a UTF mode for characters 128 and above, you must - ensure that PCRE is compiled with Unicode property support as well as - with UTF support. - - Characters that might indicate line breaks are never treated in any - special way when matching character classes, whatever line-ending - sequence is in use, and whatever setting of the PCRE_DOTALL and - PCRE_MULTILINE options is used. A class such as [^a] always matches one - of these characters. - - The minus (hyphen) character can be used to specify a range of charac- - ters in a character class. For example, [d-m] matches any letter - between d and m, inclusive. If a minus character is required in a - class, it must be escaped with a backslash or appear in a position - where it cannot be interpreted as indicating a range, typically as the - first or last character in the class, or immediately after a range. For - example, [b-d-z] matches letters in the range b to d, a hyphen charac- - ter, or z. - - It is not possible to have the literal character "]" as the end charac- - ter of a range. A pattern such as [W-]46] is interpreted as a class of - two characters ("W" and "-") followed by a literal string "46]", so it - would match "W46]" or "-46]". However, if the "]" is escaped with a - backslash it is interpreted as the end of range, so [W-\]46] is inter- - preted as a class containing a range followed by two other characters. - The octal or hexadecimal representation of "]" can also be used to end - a range. - - An error is generated if a POSIX character class (see below) or an - escape sequence other than one that defines a single character appears - at a point where a range ending character is expected. For example, - [z-\xff] is valid, but [A-\d] and [A-[:digit:]] are not. - - Ranges operate in the collating sequence of character values. They can - also be used for characters specified numerically, for example - [\000-\037]. Ranges can include any characters that are valid for the - current mode. - - If a range that includes letters is used when caseless matching is set, - it matches the letters in either case. For example, [W-c] is equivalent - to [][\\^_`wxyzabc], matched caselessly, and in a non-UTF mode, if - character tables for a French locale are in use, [\xc8-\xcb] matches - accented E characters in both cases. In UTF modes, PCRE supports the - concept of case for characters with values greater than 128 only when - it is compiled with Unicode property support. - - The character escape sequences \d, \D, \h, \H, \p, \P, \s, \S, \v, \V, - \w, and \W may appear in a character class, and add the characters that - they match to the class. For example, [\dABCDEF] matches any hexadeci- - mal digit. In UTF modes, the PCRE_UCP option affects the meanings of - \d, \s, \w and their upper case partners, just as it does when they - appear outside a character class, as described in the section entitled - "Generic character types" above. The escape sequence \b has a different - meaning inside a character class; it matches the backspace character. - The sequences \B, \N, \R, and \X are not special inside a character - class. Like any other unrecognized escape sequences, they are treated - as the literal characters "B", "N", "R", and "X" by default, but cause - an error if the PCRE_EXTRA option is set. - - A circumflex can conveniently be used with the upper case character - types to specify a more restricted set of characters than the matching - lower case type. For example, the class [^\W_] matches any letter or - digit, but not underscore, whereas [\w] includes underscore. A positive - character class should be read as "something OR something OR ..." and a - negative class as "NOT something AND NOT something AND NOT ...". - - The only metacharacters that are recognized in character classes are - backslash, hyphen (only where it can be interpreted as specifying a - range), circumflex (only at the start), opening square bracket (only - when it can be interpreted as introducing a POSIX class name, or for a - special compatibility feature - see the next two sections), and the - terminating closing square bracket. However, escaping other non- - alphanumeric characters does no harm. - - -POSIX CHARACTER CLASSES - - Perl supports the POSIX notation for character classes. This uses names - enclosed by [: and :] within the enclosing square brackets. PCRE also - supports this notation. For example, - - [01[:alpha:]%] - - matches "0", "1", any alphabetic character, or "%". The supported class - names are: - - alnum letters and digits - alpha letters - ascii character codes 0 - 127 - blank space or tab only - cntrl control characters - digit decimal digits (same as \d) - graph printing characters, excluding space - lower lower case letters - print printing characters, including space - punct printing characters, excluding letters and digits and space - space white space (the same as \s from PCRE 8.34) - upper upper case letters - word "word" characters (same as \w) - xdigit hexadecimal digits - - The default "space" characters are HT (9), LF (10), VT (11), FF (12), - CR (13), and space (32). If locale-specific matching is taking place, - the list of space characters may be different; there may be fewer or - more of them. "Space" used to be different to \s, which did not include - VT, for Perl compatibility. However, Perl changed at release 5.18, and - PCRE followed at release 8.34. "Space" and \s now match the same set - of characters. - - The name "word" is a Perl extension, and "blank" is a GNU extension - from Perl 5.8. Another Perl extension is negation, which is indicated - by a ^ character after the colon. For example, - - [12[:^digit:]] - - matches "1", "2", or any non-digit. PCRE (and Perl) also recognize the - POSIX syntax [.ch.] and [=ch=] where "ch" is a "collating element", but - these are not supported, and an error is given if they are encountered. - - By default, characters with values greater than 128 do not match any of - the POSIX character classes. However, if the PCRE_UCP option is passed - to pcre_compile(), some of the classes are changed so that Unicode - character properties are used. This is achieved by replacing certain - POSIX classes by other sequences, as follows: - - [:alnum:] becomes \p{Xan} - [:alpha:] becomes \p{L} - [:blank:] becomes \h - [:digit:] becomes \p{Nd} - [:lower:] becomes \p{Ll} - [:space:] becomes \p{Xps} - [:upper:] becomes \p{Lu} - [:word:] becomes \p{Xwd} - - Negated versions, such as [:^alpha:] use \P instead of \p. Three other - POSIX classes are handled specially in UCP mode: - - [:graph:] This matches characters that have glyphs that mark the page - when printed. In Unicode property terms, it matches all char- - acters with the L, M, N, P, S, or Cf properties, except for: - - U+061C Arabic Letter Mark - U+180E Mongolian Vowel Separator - U+2066 - U+2069 Various "isolate"s - - - [:print:] This matches the same characters as [:graph:] plus space - characters that are not controls, that is, characters with - the Zs property. - - [:punct:] This matches all characters that have the Unicode P (punctua- - tion) property, plus those characters whose code points are - less than 128 that have the S (Symbol) property. - - The other POSIX classes are unchanged, and match only characters with - code points less than 128. - - -COMPATIBILITY FEATURE FOR WORD BOUNDARIES - - In the POSIX.2 compliant library that was included in 4.4BSD Unix, the - ugly syntax [[:<:]] and [[:>:]] is used for matching "start of word" - and "end of word". PCRE treats these items as follows: - - [[:<:]] is converted to \b(?=\w) - [[:>:]] is converted to \b(?<=\w) - - Only these exact character sequences are recognized. A sequence such as - [a[:<:]b] provokes error for an unrecognized POSIX class name. This - support is not compatible with Perl. It is provided to help migrations - from other environments, and is best not used in any new patterns. Note - that \b matches at the start and the end of a word (see "Simple asser- - tions" above), and in a Perl-style pattern the preceding or following - character normally shows which is wanted, without the need for the - assertions that are used above in order to give exactly the POSIX be- - haviour. - - -VERTICAL BAR - - Vertical bar characters are used to separate alternative patterns. For - example, the pattern - - gilbert|sullivan - - matches either "gilbert" or "sullivan". Any number of alternatives may - appear, and an empty alternative is permitted (matching the empty - string). The matching process tries each alternative in turn, from left - to right, and the first one that succeeds is used. If the alternatives - are within a subpattern (defined below), "succeeds" means matching the - rest of the main pattern as well as the alternative in the subpattern. - - -INTERNAL OPTION SETTING - - The settings of the PCRE_CASELESS, PCRE_MULTILINE, PCRE_DOTALL, and - PCRE_EXTENDED options (which are Perl-compatible) can be changed from - within the pattern by a sequence of Perl option letters enclosed - between "(?" and ")". The option letters are - - i for PCRE_CASELESS - m for PCRE_MULTILINE - s for PCRE_DOTALL - x for PCRE_EXTENDED - - For example, (?im) sets caseless, multiline matching. It is also possi- - ble to unset these options by preceding the letter with a hyphen, and a - combined setting and unsetting such as (?im-sx), which sets PCRE_CASE- - LESS and PCRE_MULTILINE while unsetting PCRE_DOTALL and PCRE_EXTENDED, - is also permitted. If a letter appears both before and after the - hyphen, the option is unset. - - The PCRE-specific options PCRE_DUPNAMES, PCRE_UNGREEDY, and PCRE_EXTRA - can be changed in the same way as the Perl-compatible options by using - the characters J, U and X respectively. - - When one of these option changes occurs at top level (that is, not - inside subpattern parentheses), the change applies to the remainder of - the pattern that follows. An option change within a subpattern (see - below for a description of subpatterns) affects only that part of the - subpattern that follows it, so - - (a(?i)b)c - - matches abc and aBc and no other strings (assuming PCRE_CASELESS is not - used). By this means, options can be made to have different settings - in different parts of the pattern. Any changes made in one alternative - do carry on into subsequent branches within the same subpattern. For - example, - - (a(?i)b|c) - - matches "ab", "aB", "c", and "C", even though when matching "C" the - first branch is abandoned before the option setting. This is because - the effects of option settings happen at compile time. There would be - some very weird behaviour otherwise. - - Note: There are other PCRE-specific options that can be set by the - application when the compiling or matching functions are called. In - some cases the pattern can contain special leading sequences such as - (*CRLF) to override what the application has set or what has been - defaulted. Details are given in the section entitled "Newline - sequences" above. There are also the (*UTF8), (*UTF16),(*UTF32), and - (*UCP) leading sequences that can be used to set UTF and Unicode prop- - erty modes; they are equivalent to setting the PCRE_UTF8, PCRE_UTF16, - PCRE_UTF32 and the PCRE_UCP options, respectively. The (*UTF) sequence - is a generic version that can be used with any of the libraries. How- - ever, the application can set the PCRE_NEVER_UTF option, which locks - out the use of the (*UTF) sequences. - - -SUBPATTERNS - - Subpatterns are delimited by parentheses (round brackets), which can be - nested. Turning part of a pattern into a subpattern does two things: - - 1. It localizes a set of alternatives. For example, the pattern - - cat(aract|erpillar|) - - matches "cataract", "caterpillar", or "cat". Without the parentheses, - it would match "cataract", "erpillar" or an empty string. - - 2. It sets up the subpattern as a capturing subpattern. This means - that, when the whole pattern matches, that portion of the subject - string that matched the subpattern is passed back to the caller via the - ovector argument of the matching function. (This applies only to the - traditional matching functions; the DFA matching functions do not sup- - port capturing.) - - Opening parentheses are counted from left to right (starting from 1) to - obtain numbers for the capturing subpatterns. For example, if the - string "the red king" is matched against the pattern - - the ((red|white) (king|queen)) - - the captured substrings are "red king", "red", and "king", and are num- - bered 1, 2, and 3, respectively. - - The fact that plain parentheses fulfil two functions is not always - helpful. There are often times when a grouping subpattern is required - without a capturing requirement. If an opening parenthesis is followed - by a question mark and a colon, the subpattern does not do any captur- - ing, and is not counted when computing the number of any subsequent - capturing subpatterns. For example, if the string "the white queen" is - matched against the pattern - - the ((?:red|white) (king|queen)) - - the captured substrings are "white queen" and "queen", and are numbered - 1 and 2. The maximum number of capturing subpatterns is 65535. - - As a convenient shorthand, if any option settings are required at the - start of a non-capturing subpattern, the option letters may appear - between the "?" and the ":". Thus the two patterns - - (?i:saturday|sunday) - (?:(?i)saturday|sunday) - - match exactly the same set of strings. Because alternative branches are - tried from left to right, and options are not reset until the end of - the subpattern is reached, an option setting in one branch does affect - subsequent branches, so the above patterns match "SUNDAY" as well as - "Saturday". - - -DUPLICATE SUBPATTERN NUMBERS - - Perl 5.10 introduced a feature whereby each alternative in a subpattern - uses the same numbers for its capturing parentheses. Such a subpattern - starts with (?| and is itself a non-capturing subpattern. For example, - consider this pattern: - - (?|(Sat)ur|(Sun))day - - Because the two alternatives are inside a (?| group, both sets of cap- - turing parentheses are numbered one. Thus, when the pattern matches, - you can look at captured substring number one, whichever alternative - matched. This construct is useful when you want to capture part, but - not all, of one of a number of alternatives. Inside a (?| group, paren- - theses are numbered as usual, but the number is reset at the start of - each branch. The numbers of any capturing parentheses that follow the - subpattern start after the highest number used in any branch. The fol- - lowing example is taken from the Perl documentation. The numbers under- - neath show in which buffer the captured content will be stored. - - # before ---------------branch-reset----------- after - / ( a ) (?| x ( y ) z | (p (q) r) | (t) u (v) ) ( z ) /x - # 1 2 2 3 2 3 4 - - A back reference to a numbered subpattern uses the most recent value - that is set for that number by any subpattern. The following pattern - matches "abcabc" or "defdef": - - /(?|(abc)|(def))\1/ - - In contrast, a subroutine call to a numbered subpattern always refers - to the first one in the pattern with the given number. The following - pattern matches "abcabc" or "defabc": - - /(?|(abc)|(def))(?1)/ - - If a condition test for a subpattern's having matched refers to a non- - unique number, the test is true if any of the subpatterns of that num- - ber have matched. - - An alternative approach to using this "branch reset" feature is to use - duplicate named subpatterns, as described in the next section. - - -NAMED SUBPATTERNS - - Identifying capturing parentheses by number is simple, but it can be - very hard to keep track of the numbers in complicated regular expres- - sions. Furthermore, if an expression is modified, the numbers may - change. To help with this difficulty, PCRE supports the naming of sub- - patterns. This feature was not added to Perl until release 5.10. Python - had the feature earlier, and PCRE introduced it at release 4.0, using - the Python syntax. PCRE now supports both the Perl and the Python syn- - tax. Perl allows identically numbered subpatterns to have different - names, but PCRE does not. - - In PCRE, a subpattern can be named in one of three ways: (?...) - or (?'name'...) as in Perl, or (?P...) as in Python. References - to capturing parentheses from other parts of the pattern, such as back - references, recursion, and conditions, can be made by name as well as - by number. - - Names consist of up to 32 alphanumeric characters and underscores, but - must start with a non-digit. Named capturing parentheses are still - allocated numbers as well as names, exactly as if the names were not - present. The PCRE API provides function calls for extracting the name- - to-number translation table from a compiled pattern. There is also a - convenience function for extracting a captured substring by name. - - By default, a name must be unique within a pattern, but it is possible - to relax this constraint by setting the PCRE_DUPNAMES option at compile - time. (Duplicate names are also always permitted for subpatterns with - the same number, set up as described in the previous section.) Dupli- - cate names can be useful for patterns where only one instance of the - named parentheses can match. Suppose you want to match the name of a - weekday, either as a 3-letter abbreviation or as the full name, and in - both cases you want to extract the abbreviation. This pattern (ignoring - the line breaks) does the job: - - (?Mon|Fri|Sun)(?:day)?| - (?Tue)(?:sday)?| - (?Wed)(?:nesday)?| - (?Thu)(?:rsday)?| - (?Sat)(?:urday)? - - There are five capturing substrings, but only one is ever set after a - match. (An alternative way of solving this problem is to use a "branch - reset" subpattern, as described in the previous section.) - - The convenience function for extracting the data by name returns the - substring for the first (and in this example, the only) subpattern of - that name that matched. This saves searching to find which numbered - subpattern it was. - - If you make a back reference to a non-unique named subpattern from - elsewhere in the pattern, the subpatterns to which the name refers are - checked in the order in which they appear in the overall pattern. The - first one that is set is used for the reference. For example, this pat- - tern matches both "foofoo" and "barbar" but not "foobar" or "barfoo": - - (?:(?foo)|(?bar))\k - - - If you make a subroutine call to a non-unique named subpattern, the one - that corresponds to the first occurrence of the name is used. In the - absence of duplicate numbers (see the previous section) this is the one - with the lowest number. - - If you use a named reference in a condition test (see the section about - conditions below), either to check whether a subpattern has matched, or - to check for recursion, all subpatterns with the same name are tested. - If the condition is true for any one of them, the overall condition is - true. This is the same behaviour as testing by number. For further - details of the interfaces for handling named subpatterns, see the - pcreapi documentation. - - Warning: You cannot use different names to distinguish between two sub- - patterns with the same number because PCRE uses only the numbers when - matching. For this reason, an error is given at compile time if differ- - ent names are given to subpatterns with the same number. However, you - can always give the same name to subpatterns with the same number, even - when PCRE_DUPNAMES is not set. - - -REPETITION - - Repetition is specified by quantifiers, which can follow any of the - following items: - - a literal data character - the dot metacharacter - the \C escape sequence - the \X escape sequence - the \R escape sequence - an escape such as \d or \pL that matches a single character - a character class - a back reference (see next section) - a parenthesized subpattern (including assertions) - a subroutine call to a subpattern (recursive or otherwise) - - The general repetition quantifier specifies a minimum and maximum num- - ber of permitted matches, by giving the two numbers in curly brackets - (braces), separated by a comma. The numbers must be less than 65536, - and the first must be less than or equal to the second. For example: - - z{2,4} - - matches "zz", "zzz", or "zzzz". A closing brace on its own is not a - special character. If the second number is omitted, but the comma is - present, there is no upper limit; if the second number and the comma - are both omitted, the quantifier specifies an exact number of required - matches. Thus - - [aeiou]{3,} - - matches at least 3 successive vowels, but may match many more, while - - \d{8} - - matches exactly 8 digits. An opening curly bracket that appears in a - position where a quantifier is not allowed, or one that does not match - the syntax of a quantifier, is taken as a literal character. For exam- - ple, {,6} is not a quantifier, but a literal string of four characters. - - In UTF modes, quantifiers apply to characters rather than to individual - data units. Thus, for example, \x{100}{2} matches two characters, each - of which is represented by a two-byte sequence in a UTF-8 string. Simi- - larly, \X{3} matches three Unicode extended grapheme clusters, each of - which may be several data units long (and they may be of different - lengths). - - The quantifier {0} is permitted, causing the expression to behave as if - the previous item and the quantifier were not present. This may be use- - ful for subpatterns that are referenced as subroutines from elsewhere - in the pattern (but see also the section entitled "Defining subpatterns - for use by reference only" below). Items other than subpatterns that - have a {0} quantifier are omitted from the compiled pattern. - - For convenience, the three most common quantifiers have single-charac- - ter abbreviations: - - * is equivalent to {0,} - + is equivalent to {1,} - ? is equivalent to {0,1} - - It is possible to construct infinite loops by following a subpattern - that can match no characters with a quantifier that has no upper limit, - for example: - - (a?)* - - Earlier versions of Perl and PCRE used to give an error at compile time - for such patterns. However, because there are cases where this can be - useful, such patterns are now accepted, but if any repetition of the - subpattern does in fact match no characters, the loop is forcibly bro- - ken. - - By default, the quantifiers are "greedy", that is, they match as much - as possible (up to the maximum number of permitted times), without - causing the rest of the pattern to fail. The classic example of where - this gives problems is in trying to match comments in C programs. These - appear between /* and */ and within the comment, individual * and / - characters may appear. An attempt to match C comments by applying the - pattern - - /\*.*\*/ - - to the string - - /* first comment */ not comment /* second comment */ - - fails, because it matches the entire string owing to the greediness of - the .* item. - - However, if a quantifier is followed by a question mark, it ceases to - be greedy, and instead matches the minimum number of times possible, so - the pattern - - /\*.*?\*/ - - does the right thing with the C comments. The meaning of the various - quantifiers is not otherwise changed, just the preferred number of - matches. Do not confuse this use of question mark with its use as a - quantifier in its own right. Because it has two uses, it can sometimes - appear doubled, as in - - \d??\d - - which matches one digit by preference, but can match two if that is the - only way the rest of the pattern matches. - - If the PCRE_UNGREEDY option is set (an option that is not available in - Perl), the quantifiers are not greedy by default, but individual ones - can be made greedy by following them with a question mark. In other - words, it inverts the default behaviour. - - When a parenthesized subpattern is quantified with a minimum repeat - count that is greater than 1 or with a limited maximum, more memory is - required for the compiled pattern, in proportion to the size of the - minimum or maximum. - - If a pattern starts with .* or .{0,} and the PCRE_DOTALL option (equiv- - alent to Perl's /s) is set, thus allowing the dot to match newlines, - the pattern is implicitly anchored, because whatever follows will be - tried against every character position in the subject string, so there - is no point in retrying the overall match at any position after the - first. PCRE normally treats such a pattern as though it were preceded - by \A. - - In cases where it is known that the subject string contains no new- - lines, it is worth setting PCRE_DOTALL in order to obtain this opti- - mization, or alternatively using ^ to indicate anchoring explicitly. - - However, there are some cases where the optimization cannot be used. - When .* is inside capturing parentheses that are the subject of a back - reference elsewhere in the pattern, a match at the start may fail where - a later one succeeds. Consider, for example: - - (.*)abc\1 - - If the subject is "xyz123abc123" the match point is the fourth charac- - ter. For this reason, such a pattern is not implicitly anchored. - - Another case where implicit anchoring is not applied is when the lead- - ing .* is inside an atomic group. Once again, a match at the start may - fail where a later one succeeds. Consider this pattern: - - (?>.*?a)b - - It matches "ab" in the subject "aab". The use of the backtracking con- - trol verbs (*PRUNE) and (*SKIP) also disable this optimization. - - When a capturing subpattern is repeated, the value captured is the sub- - string that matched the final iteration. For example, after - - (tweedle[dume]{3}\s*)+ - - has matched "tweedledum tweedledee" the value of the captured substring - is "tweedledee". However, if there are nested capturing subpatterns, - the corresponding captured values may have been set in previous itera- - tions. For example, after - - /(a|(b))+/ - - matches "aba" the value of the second captured substring is "b". - - -ATOMIC GROUPING AND POSSESSIVE QUANTIFIERS - - With both maximizing ("greedy") and minimizing ("ungreedy" or "lazy") - repetition, failure of what follows normally causes the repeated item - to be re-evaluated to see if a different number of repeats allows the - rest of the pattern to match. Sometimes it is useful to prevent this, - either to change the nature of the match, or to cause it fail earlier - than it otherwise might, when the author of the pattern knows there is - no point in carrying on. - - Consider, for example, the pattern \d+foo when applied to the subject - line - - 123456bar - - After matching all 6 digits and then failing to match "foo", the normal - action of the matcher is to try again with only 5 digits matching the - \d+ item, and then with 4, and so on, before ultimately failing. - "Atomic grouping" (a term taken from Jeffrey Friedl's book) provides - the means for specifying that once a subpattern has matched, it is not - to be re-evaluated in this way. - - If we use atomic grouping for the previous example, the matcher gives - up immediately on failing to match "foo" the first time. The notation - is a kind of special parenthesis, starting with (?> as in this example: - - (?>\d+)foo - - This kind of parenthesis "locks up" the part of the pattern it con- - tains once it has matched, and a failure further into the pattern is - prevented from backtracking into it. Backtracking past it to previous - items, however, works as normal. - - An alternative description is that a subpattern of this type matches - the string of characters that an identical standalone pattern would - match, if anchored at the current point in the subject string. - - Atomic grouping subpatterns are not capturing subpatterns. Simple cases - such as the above example can be thought of as a maximizing repeat that - must swallow everything it can. So, while both \d+ and \d+? are pre- - pared to adjust the number of digits they match in order to make the - rest of the pattern match, (?>\d+) can only match an entire sequence of - digits. - - Atomic groups in general can of course contain arbitrarily complicated - subpatterns, and can be nested. However, when the subpattern for an - atomic group is just a single repeated item, as in the example above, a - simpler notation, called a "possessive quantifier" can be used. This - consists of an additional + character following a quantifier. Using - this notation, the previous example can be rewritten as - - \d++foo - - Note that a possessive quantifier can be used with an entire group, for - example: - - (abc|xyz){2,3}+ - - Possessive quantifiers are always greedy; the setting of the - PCRE_UNGREEDY option is ignored. They are a convenient notation for the - simpler forms of atomic group. However, there is no difference in the - meaning of a possessive quantifier and the equivalent atomic group, - though there may be a performance difference; possessive quantifiers - should be slightly faster. - - The possessive quantifier syntax is an extension to the Perl 5.8 syn- - tax. Jeffrey Friedl originated the idea (and the name) in the first - edition of his book. Mike McCloskey liked it, so implemented it when he - built Sun's Java package, and PCRE copied it from there. It ultimately - found its way into Perl at release 5.10. - - PCRE has an optimization that automatically "possessifies" certain sim- - ple pattern constructs. For example, the sequence A+B is treated as - A++B because there is no point in backtracking into a sequence of A's - when B must follow. - - When a pattern contains an unlimited repeat inside a subpattern that - can itself be repeated an unlimited number of times, the use of an - atomic group is the only way to avoid some failing matches taking a - very long time indeed. The pattern - - (\D+|<\d+>)*[!?] - - matches an unlimited number of substrings that either consist of non- - digits, or digits enclosed in <>, followed by either ! or ?. When it - matches, it runs quickly. However, if it is applied to - - aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa - - it takes a long time before reporting failure. This is because the - string can be divided between the internal \D+ repeat and the external - * repeat in a large number of ways, and all have to be tried. (The - example uses [!?] rather than a single character at the end, because - both PCRE and Perl have an optimization that allows for fast failure - when a single character is used. They remember the last single charac- - ter that is required for a match, and fail early if it is not present - in the string.) If the pattern is changed so that it uses an atomic - group, like this: - - ((?>\D+)|<\d+>)*[!?] - - sequences of non-digits cannot be broken, and failure happens quickly. - - -BACK REFERENCES - - Outside a character class, a backslash followed by a digit greater than - 0 (and possibly further digits) is a back reference to a capturing sub- - pattern earlier (that is, to its left) in the pattern, provided there - have been that many previous capturing left parentheses. - - However, if the decimal number following the backslash is less than 10, - it is always taken as a back reference, and causes an error only if - there are not that many capturing left parentheses in the entire pat- - tern. In other words, the parentheses that are referenced need not be - to the left of the reference for numbers less than 10. A "forward back - reference" of this type can make sense when a repetition is involved - and the subpattern to the right has participated in an earlier itera- - tion. - - It is not possible to have a numerical "forward back reference" to a - subpattern whose number is 10 or more using this syntax because a - sequence such as \50 is interpreted as a character defined in octal. - See the subsection entitled "Non-printing characters" above for further - details of the handling of digits following a backslash. There is no - such problem when named parentheses are used. A back reference to any - subpattern is possible using named parentheses (see below). - - Another way of avoiding the ambiguity inherent in the use of digits - following a backslash is to use the \g escape sequence. This escape - must be followed by an unsigned number or a negative number, optionally - enclosed in braces. These examples are all identical: - - (ring), \1 - (ring), \g1 - (ring), \g{1} - - An unsigned number specifies an absolute reference without the ambigu- - ity that is present in the older syntax. It is also useful when literal - digits follow the reference. A negative number is a relative reference. - Consider this example: - - (abc(def)ghi)\g{-1} - - The sequence \g{-1} is a reference to the most recently started captur- - ing subpattern before \g, that is, is it equivalent to \2 in this exam- - ple. Similarly, \g{-2} would be equivalent to \1. The use of relative - references can be helpful in long patterns, and also in patterns that - are created by joining together fragments that contain references - within themselves. - - A back reference matches whatever actually matched the capturing sub- - pattern in the current subject string, rather than anything matching - the subpattern itself (see "Subpatterns as subroutines" below for a way - of doing that). So the pattern - - (sens|respons)e and \1ibility - - matches "sense and sensibility" and "response and responsibility", but - not "sense and responsibility". If caseful matching is in force at the - time of the back reference, the case of letters is relevant. For exam- - ple, - - ((?i)rah)\s+\1 - - matches "rah rah" and "RAH RAH", but not "RAH rah", even though the - original capturing subpattern is matched caselessly. - - There are several different ways of writing back references to named - subpatterns. The .NET syntax \k{name} and the Perl syntax \k or - \k'name' are supported, as is the Python syntax (?P=name). Perl 5.10's - unified back reference syntax, in which \g can be used for both numeric - and named references, is also supported. We could rewrite the above - example in any of the following ways: - - (?(?i)rah)\s+\k - (?'p1'(?i)rah)\s+\k{p1} - (?P(?i)rah)\s+(?P=p1) - (?(?i)rah)\s+\g{p1} - - A subpattern that is referenced by name may appear in the pattern - before or after the reference. - - There may be more than one back reference to the same subpattern. If a - subpattern has not actually been used in a particular match, any back - references to it always fail by default. For example, the pattern - - (a|(bc))\2 - - always fails if it starts to match "a" rather than "bc". However, if - the PCRE_JAVASCRIPT_COMPAT option is set at compile time, a back refer- - ence to an unset value matches an empty string. - - Because there may be many capturing parentheses in a pattern, all dig- - its following a backslash are taken as part of a potential back refer- - ence number. If the pattern continues with a digit character, some - delimiter must be used to terminate the back reference. If the - PCRE_EXTENDED option is set, this can be white space. Otherwise, the - \g{ syntax or an empty comment (see "Comments" below) can be used. - - Recursive back references - - A back reference that occurs inside the parentheses to which it refers - fails when the subpattern is first used, so, for example, (a\1) never - matches. However, such references can be useful inside repeated sub- - patterns. For example, the pattern - - (a|b\1)+ - - matches any number of "a"s and also "aba", "ababbaa" etc. At each iter- - ation of the subpattern, the back reference matches the character - string corresponding to the previous iteration. In order for this to - work, the pattern must be such that the first iteration does not need - to match the back reference. This can be done using alternation, as in - the example above, or by a quantifier with a minimum of zero. - - Back references of this type cause the group that they reference to be - treated as an atomic group. Once the whole group has been matched, a - subsequent matching failure cannot cause backtracking into the middle - of the group. - - -ASSERTIONS - - An assertion is a test on the characters following or preceding the - current matching point that does not actually consume any characters. - The simple assertions coded as \b, \B, \A, \G, \Z, \z, ^ and $ are - described above. - - More complicated assertions are coded as subpatterns. There are two - kinds: those that look ahead of the current position in the subject - string, and those that look behind it. An assertion subpattern is - matched in the normal way, except that it does not cause the current - matching position to be changed. - - Assertion subpatterns are not capturing subpatterns. If such an asser- - tion contains capturing subpatterns within it, these are counted for - the purposes of numbering the capturing subpatterns in the whole pat- - tern. However, substring capturing is carried out only for positive - assertions. (Perl sometimes, but not always, does do capturing in nega- - tive assertions.) - - WARNING: If a positive assertion containing one or more capturing sub- - patterns succeeds, but failure to match later in the pattern causes - backtracking over this assertion, the captures within the assertion are - reset only if no higher numbered captures are already set. This is, - unfortunately, a fundamental limitation of the current implementation, - and as PCRE1 is now in maintenance-only status, it is unlikely ever to - change. - - For compatibility with Perl, assertion subpatterns may be repeated; - though it makes no sense to assert the same thing several times, the - side effect of capturing parentheses may occasionally be useful. In - practice, there only three cases: - - (1) If the quantifier is {0}, the assertion is never obeyed during - matching. However, it may contain internal capturing parenthesized - groups that are called from elsewhere via the subroutine mechanism. - - (2) If quantifier is {0,n} where n is greater than zero, it is treated - as if it were {0,1}. At run time, the rest of the pattern match is - tried with and without the assertion, the order depending on the greed- - iness of the quantifier. - - (3) If the minimum repetition is greater than zero, the quantifier is - ignored. The assertion is obeyed just once when encountered during - matching. - - Lookahead assertions - - Lookahead assertions start with (?= for positive assertions and (?! for - negative assertions. For example, - - \w+(?=;) - - matches a word followed by a semicolon, but does not include the semi- - colon in the match, and - - foo(?!bar) - - matches any occurrence of "foo" that is not followed by "bar". Note - that the apparently similar pattern - - (?!foo)bar - - does not find an occurrence of "bar" that is preceded by something - other than "foo"; it finds any occurrence of "bar" whatsoever, because - the assertion (?!foo) is always true when the next three characters are - "bar". A lookbehind assertion is needed to achieve the other effect. - - If you want to force a matching failure at some point in a pattern, the - most convenient way to do it is with (?!) because an empty string - always matches, so an assertion that requires there not to be an empty - string must always fail. The backtracking control verb (*FAIL) or (*F) - is a synonym for (?!). - - Lookbehind assertions - - Lookbehind assertions start with (?<= for positive assertions and (?)...) or (?('name')...) to test for a - used subpattern by name. For compatibility with earlier versions of - PCRE, which had this facility before Perl, the syntax (?(name)...) is - also recognized. - - Rewriting the above example to use a named subpattern gives this: - - (? \( )? [^()]+ (?() \) ) - - If the name used in a condition of this kind is a duplicate, the test - is applied to all subpatterns of the same name, and is true if any one - of them has matched. - - Checking for pattern recursion - - If the condition is the string (R), and there is no subpattern with the - name R, the condition is true if a recursive call to the whole pattern - or any subpattern has been made. If digits or a name preceded by amper- - sand follow the letter R, for example: - - (?(R3)...) or (?(R&name)...) - - the condition is true if the most recent recursion is into a subpattern - whose number or name is given. This condition does not check the entire - recursion stack. If the name used in a condition of this kind is a - duplicate, the test is applied to all subpatterns of the same name, and - is true if any one of them is the most recent recursion. - - At "top level", all these recursion test conditions are false. The - syntax for recursive patterns is described below. - - Defining subpatterns for use by reference only - - If the condition is the string (DEFINE), and there is no subpattern - with the name DEFINE, the condition is always false. In this case, - there may be only one alternative in the subpattern. It is always - skipped if control reaches this point in the pattern; the idea of - DEFINE is that it can be used to define subroutines that can be refer- - enced from elsewhere. (The use of subroutines is described below.) For - example, a pattern to match an IPv4 address such as "192.168.23.245" - could be written like this (ignore white space and line breaks): - - (?(DEFINE) (? 2[0-4]\d | 25[0-5] | 1\d\d | [1-9]?\d) ) - \b (?&byte) (\.(?&byte)){3} \b - - The first part of the pattern is a DEFINE group inside which a another - group named "byte" is defined. This matches an individual component of - an IPv4 address (a number less than 256). When matching takes place, - this part of the pattern is skipped because DEFINE acts like a false - condition. The rest of the pattern uses references to the named group - to match the four dot-separated components of an IPv4 address, insist- - ing on a word boundary at each end. - - Assertion conditions - - If the condition is not in any of the above formats, it must be an - assertion. This may be a positive or negative lookahead or lookbehind - assertion. Consider this pattern, again containing non-significant - white space, and with the two alternatives on the second line: - - (?(?=[^a-z]*[a-z]) - \d{2}-[a-z]{3}-\d{2} | \d{2}-\d{2}-\d{2} ) - - The condition is a positive lookahead assertion that matches an - optional sequence of non-letters followed by a letter. In other words, - it tests for the presence of at least one letter in the subject. If a - letter is found, the subject is matched against the first alternative; - otherwise it is matched against the second. This pattern matches - strings in one of the two forms dd-aaa-dd or dd-dd-dd, where aaa are - letters and dd are digits. - - -COMMENTS - - There are two ways of including comments in patterns that are processed - by PCRE. In both cases, the start of the comment must not be in a char- - acter class, nor in the middle of any other sequence of related charac- - ters such as (?: or a subpattern name or number. The characters that - make up a comment play no part in the pattern matching. - - The sequence (?# marks the start of a comment that continues up to the - next closing parenthesis. Nested parentheses are not permitted. If the - PCRE_EXTENDED option is set, an unescaped # character also introduces a - comment, which in this case continues to immediately after the next - newline character or character sequence in the pattern. Which charac- - ters are interpreted as newlines is controlled by the options passed to - a compiling function or by a special sequence at the start of the pat- - tern, as described in the section entitled "Newline conventions" above. - Note that the end of this type of comment is a literal newline sequence - in the pattern; escape sequences that happen to represent a newline do - not count. For example, consider this pattern when PCRE_EXTENDED is - set, and the default newline convention is in force: - - abc #comment \n still comment - - On encountering the # character, pcre_compile() skips along, looking - for a newline in the pattern. The sequence \n is still literal at this - stage, so it does not terminate the comment. Only an actual character - with the code value 0x0a (the default newline) does so. - - -RECURSIVE PATTERNS - - Consider the problem of matching a string in parentheses, allowing for - unlimited nested parentheses. Without the use of recursion, the best - that can be done is to use a pattern that matches up to some fixed - depth of nesting. It is not possible to handle an arbitrary nesting - depth. - - For some time, Perl has provided a facility that allows regular expres- - sions to recurse (amongst other things). It does this by interpolating - Perl code in the expression at run time, and the code can refer to the - expression itself. A Perl pattern using code interpolation to solve the - parentheses problem can be created like this: - - $re = qr{\( (?: (?>[^()]+) | (?p{$re}) )* \)}x; - - The (?p{...}) item interpolates Perl code at run time, and in this case - refers recursively to the pattern in which it appears. - - Obviously, PCRE cannot support the interpolation of Perl code. Instead, - it supports special syntax for recursion of the entire pattern, and - also for individual subpattern recursion. After its introduction in - PCRE and Python, this kind of recursion was subsequently introduced - into Perl at release 5.10. - - A special item that consists of (? followed by a number greater than - zero and a closing parenthesis is a recursive subroutine call of the - subpattern of the given number, provided that it occurs inside that - subpattern. (If not, it is a non-recursive subroutine call, which is - described in the next section.) The special item (?R) or (?0) is a - recursive call of the entire regular expression. - - This PCRE pattern solves the nested parentheses problem (assume the - PCRE_EXTENDED option is set so that white space is ignored): - - \( ( [^()]++ | (?R) )* \) - - First it matches an opening parenthesis. Then it matches any number of - substrings which can either be a sequence of non-parentheses, or a - recursive match of the pattern itself (that is, a correctly parenthe- - sized substring). Finally there is a closing parenthesis. Note the use - of a possessive quantifier to avoid backtracking into sequences of non- - parentheses. - - If this were part of a larger pattern, you would not want to recurse - the entire pattern, so instead you could use this: - - ( \( ( [^()]++ | (?1) )* \) ) - - We have put the pattern into parentheses, and caused the recursion to - refer to them instead of the whole pattern. - - In a larger pattern, keeping track of parenthesis numbers can be - tricky. This is made easier by the use of relative references. Instead - of (?1) in the pattern above you can write (?-2) to refer to the second - most recently opened parentheses preceding the recursion. In other - words, a negative number counts capturing parentheses leftwards from - the point at which it is encountered. - - It is also possible to refer to subsequently opened parentheses, by - writing references such as (?+2). However, these cannot be recursive - because the reference is not inside the parentheses that are refer- - enced. They are always non-recursive subroutine calls, as described in - the next section. - - An alternative approach is to use named parentheses instead. The Perl - syntax for this is (?&name); PCRE's earlier syntax (?P>name) is also - supported. We could rewrite the above example as follows: - - (? \( ( [^()]++ | (?&pn) )* \) ) - - If there is more than one subpattern with the same name, the earliest - one is used. - - This particular example pattern that we have been looking at contains - nested unlimited repeats, and so the use of a possessive quantifier for - matching strings of non-parentheses is important when applying the pat- - tern to strings that do not match. For example, when this pattern is - applied to - - (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa() - - it yields "no match" quickly. However, if a possessive quantifier is - not used, the match runs for a very long time indeed because there are - so many different ways the + and * repeats can carve up the subject, - and all have to be tested before failure can be reported. - - At the end of a match, the values of capturing parentheses are those - from the outermost level. If you want to obtain intermediate values, a - callout function can be used (see below and the pcrecallout documenta- - tion). If the pattern above is matched against - - (ab(cd)ef) - - the value for the inner capturing parentheses (numbered 2) is "ef", - which is the last value taken on at the top level. If a capturing sub- - pattern is not matched at the top level, its final captured value is - unset, even if it was (temporarily) set at a deeper level during the - matching process. - - If there are more than 15 capturing parentheses in a pattern, PCRE has - to obtain extra memory to store data during a recursion, which it does - by using pcre_malloc, freeing it via pcre_free afterwards. If no memory - can be obtained, the match fails with the PCRE_ERROR_NOMEMORY error. - - Do not confuse the (?R) item with the condition (R), which tests for - recursion. Consider this pattern, which matches text in angle brack- - ets, allowing for arbitrary nesting. Only digits are allowed in nested - brackets (that is, when recursing), whereas any characters are permit- - ted at the outer level. - - < (?: (?(R) \d++ | [^<>]*+) | (?R)) * > - - In this pattern, (?(R) is the start of a conditional subpattern, with - two different alternatives for the recursive and non-recursive cases. - The (?R) item is the actual recursive call. - - Differences in recursion processing between PCRE and Perl - - Recursion processing in PCRE differs from Perl in two important ways. - In PCRE (like Python, but unlike Perl), a recursive subpattern call is - always treated as an atomic group. That is, once it has matched some of - the subject string, it is never re-entered, even if it contains untried - alternatives and there is a subsequent matching failure. This can be - illustrated by the following pattern, which purports to match a palin- - dromic string that contains an odd number of characters (for example, - "a", "aba", "abcba", "abcdcba"): - - ^(.|(.)(?1)\2)$ - - The idea is that it either matches a single character, or two identical - characters surrounding a sub-palindrome. In Perl, this pattern works; - in PCRE it does not if the pattern is longer than three characters. - Consider the subject string "abcba": - - At the top level, the first character is matched, but as it is not at - the end of the string, the first alternative fails; the second alterna- - tive is taken and the recursion kicks in. The recursive call to subpat- - tern 1 successfully matches the next character ("b"). (Note that the - beginning and end of line tests are not part of the recursion). - - Back at the top level, the next character ("c") is compared with what - subpattern 2 matched, which was "a". This fails. Because the recursion - is treated as an atomic group, there are now no backtracking points, - and so the entire match fails. (Perl is able, at this point, to re- - enter the recursion and try the second alternative.) However, if the - pattern is written with the alternatives in the other order, things are - different: - - ^((.)(?1)\2|.)$ - - This time, the recursing alternative is tried first, and continues to - recurse until it runs out of characters, at which point the recursion - fails. But this time we do have another alternative to try at the - higher level. That is the big difference: in the previous case the - remaining alternative is at a deeper recursion level, which PCRE cannot - use. - - To change the pattern so that it matches all palindromic strings, not - just those with an odd number of characters, it is tempting to change - the pattern to this: - - ^((.)(?1)\2|.?)$ - - Again, this works in Perl, but not in PCRE, and for the same reason. - When a deeper recursion has matched a single character, it cannot be - entered again in order to match an empty string. The solution is to - separate the two cases, and write out the odd and even cases as alter- - natives at the higher level: - - ^(?:((.)(?1)\2|)|((.)(?3)\4|.)) - - If you want to match typical palindromic phrases, the pattern has to - ignore all non-word characters, which can be done like this: - - ^\W*+(?:((.)\W*+(?1)\W*+\2|)|((.)\W*+(?3)\W*+\4|\W*+.\W*+))\W*+$ - - If run with the PCRE_CASELESS option, this pattern matches phrases such - as "A man, a plan, a canal: Panama!" and it works well in both PCRE and - Perl. Note the use of the possessive quantifier *+ to avoid backtrack- - ing into sequences of non-word characters. Without this, PCRE takes a - great deal longer (ten times or more) to match typical phrases, and - Perl takes so long that you think it has gone into a loop. - - WARNING: The palindrome-matching patterns above work only if the sub- - ject string does not start with a palindrome that is shorter than the - entire string. For example, although "abcba" is correctly matched, if - the subject is "ababa", PCRE finds the palindrome "aba" at the start, - then fails at top level because the end of the string does not follow. - Once again, it cannot jump back into the recursion to try other alter- - natives, so the entire match fails. - - The second way in which PCRE and Perl differ in their recursion pro- - cessing is in the handling of captured values. In Perl, when a subpat- - tern is called recursively or as a subpattern (see the next section), - it has no access to any values that were captured outside the recur- - sion, whereas in PCRE these values can be referenced. Consider this - pattern: - - ^(.)(\1|a(?2)) - - In PCRE, this pattern matches "bab". The first capturing parentheses - match "b", then in the second group, when the back reference \1 fails - to match "b", the second alternative matches "a" and then recurses. In - the recursion, \1 does now match "b" and so the whole match succeeds. - In Perl, the pattern fails to match because inside the recursive call - \1 cannot access the externally set value. - - -SUBPATTERNS AS SUBROUTINES - - If the syntax for a recursive subpattern call (either by number or by - name) is used outside the parentheses to which it refers, it operates - like a subroutine in a programming language. The called subpattern may - be defined before or after the reference. A numbered reference can be - absolute or relative, as in these examples: - - (...(absolute)...)...(?2)... - (...(relative)...)...(?-1)... - (...(?+1)...(relative)... - - An earlier example pointed out that the pattern - - (sens|respons)e and \1ibility - - matches "sense and sensibility" and "response and responsibility", but - not "sense and responsibility". If instead the pattern - - (sens|respons)e and (?1)ibility - - is used, it does match "sense and responsibility" as well as the other - two strings. Another example is given in the discussion of DEFINE - above. - - All subroutine calls, whether recursive or not, are always treated as - atomic groups. That is, once a subroutine has matched some of the sub- - ject string, it is never re-entered, even if it contains untried alter- - natives and there is a subsequent matching failure. Any capturing - parentheses that are set during the subroutine call revert to their - previous values afterwards. - - Processing options such as case-independence are fixed when a subpat- - tern is defined, so if it is used as a subroutine, such options cannot - be changed for different calls. For example, consider this pattern: - - (abc)(?i:(?-1)) - - It matches "abcabc". It does not match "abcABC" because the change of - processing option does not affect the called subpattern. - - -ONIGURUMA SUBROUTINE SYNTAX - - For compatibility with Oniguruma, the non-Perl syntax \g followed by a - name or a number enclosed either in angle brackets or single quotes, is - an alternative syntax for referencing a subpattern as a subroutine, - possibly recursively. Here are two of the examples used above, rewrit- - ten using this syntax: - - (? \( ( (?>[^()]+) | \g )* \) ) - (sens|respons)e and \g'1'ibility - - PCRE supports an extension to Oniguruma: if a number is preceded by a - plus or a minus sign it is taken as a relative reference. For example: - - (abc)(?i:\g<-1>) - - Note that \g{...} (Perl syntax) and \g<...> (Oniguruma syntax) are not - synonymous. The former is a back reference; the latter is a subroutine - call. - - -CALLOUTS - - Perl has a feature whereby using the sequence (?{...}) causes arbitrary - Perl code to be obeyed in the middle of matching a regular expression. - This makes it possible, amongst other things, to extract different sub- - strings that match the same pair of parentheses when there is a repeti- - tion. - - PCRE provides a similar feature, but of course it cannot obey arbitrary - Perl code. The feature is called "callout". The caller of PCRE provides - an external function by putting its entry point in the global variable - pcre_callout (8-bit library) or pcre[16|32]_callout (16-bit or 32-bit - library). By default, this variable contains NULL, which disables all - calling out. - - Within a regular expression, (?C) indicates the points at which the - external function is to be called. If you want to identify different - callout points, you can put a number less than 256 after the letter C. - The default value is zero. For example, this pattern has two callout - points: - - (?C1)abc(?C2)def - - If the PCRE_AUTO_CALLOUT flag is passed to a compiling function, call- - outs are automatically installed before each item in the pattern. They - are all numbered 255. If there is a conditional group in the pattern - whose condition is an assertion, an additional callout is inserted just - before the condition. An explicit callout may also be set at this posi- - tion, as in this example: - - (?(?C9)(?=a)abc|def) - - Note that this applies only to assertion conditions, not to other types - of condition. - - During matching, when PCRE reaches a callout point, the external func- - tion is called. It is provided with the number of the callout, the - position in the pattern, and, optionally, one item of data originally - supplied by the caller of the matching function. The callout function - may cause matching to proceed, to backtrack, or to fail altogether. - - By default, PCRE implements a number of optimizations at compile time - and matching time, and one side-effect is that sometimes callouts are - skipped. If you need all possible callouts to happen, you need to set - options that disable the relevant optimizations. More details, and a - complete description of the interface to the callout function, are - given in the pcrecallout documentation. - - -BACKTRACKING CONTROL - - Perl 5.10 introduced a number of "Special Backtracking Control Verbs", - which are still described in the Perl documentation as "experimental - and subject to change or removal in a future version of Perl". It goes - on to say: "Their usage in production code should be noted to avoid - problems during upgrades." The same remarks apply to the PCRE features - described in this section. - - The new verbs make use of what was previously invalid syntax: an open- - ing parenthesis followed by an asterisk. They are generally of the form - (*VERB) or (*VERB:NAME). Some may take either form, possibly behaving - differently depending on whether or not a name is present. A name is - any sequence of characters that does not include a closing parenthesis. - The maximum length of name is 255 in the 8-bit library and 65535 in the - 16-bit and 32-bit libraries. If the name is empty, that is, if the - closing parenthesis immediately follows the colon, the effect is as if - the colon were not there. Any number of these verbs may occur in a - pattern. - - Since these verbs are specifically related to backtracking, most of - them can be used only when the pattern is to be matched using one of - the traditional matching functions, because these use a backtracking - algorithm. With the exception of (*FAIL), which behaves like a failing - negative assertion, the backtracking control verbs cause an error if - encountered by a DFA matching function. - - The behaviour of these verbs in repeated groups, assertions, and in - subpatterns called as subroutines (whether or not recursively) is docu- - mented below. - - Optimizations that affect backtracking verbs - - PCRE contains some optimizations that are used to speed up matching by - running some checks at the start of each match attempt. For example, it - may know the minimum length of matching subject, or that a particular - character must be present. When one of these optimizations bypasses the - running of a match, any included backtracking verbs will not, of - course, be processed. You can suppress the start-of-match optimizations - by setting the PCRE_NO_START_OPTIMIZE option when calling pcre_com- - pile() or pcre_exec(), or by starting the pattern with (*NO_START_OPT). - There is more discussion of this option in the section entitled "Option - bits for pcre_exec()" in the pcreapi documentation. - - Experiments with Perl suggest that it too has similar optimizations, - sometimes leading to anomalous results. - - Verbs that act immediately - - The following verbs act as soon as they are encountered. They may not - be followed by a name. - - (*ACCEPT) - - This verb causes the match to end successfully, skipping the remainder - of the pattern. However, when it is inside a subpattern that is called - as a subroutine, only that subpattern is ended successfully. Matching - then continues at the outer level. If (*ACCEPT) in triggered in a posi- - tive assertion, the assertion succeeds; in a negative assertion, the - assertion fails. - - If (*ACCEPT) is inside capturing parentheses, the data so far is cap- - tured. For example: - - A((?:A|B(*ACCEPT)|C)D) - - This matches "AB", "AAD", or "ACD"; when it matches "AB", "B" is cap- - tured by the outer parentheses. - - (*FAIL) or (*F) - - This verb causes a matching failure, forcing backtracking to occur. It - is equivalent to (?!) but easier to read. The Perl documentation notes - that it is probably useful only when combined with (?{}) or (??{}). - Those are, of course, Perl features that are not present in PCRE. The - nearest equivalent is the callout feature, as for example in this pat- - tern: - - a+(?C)(*FAIL) - - A match with the string "aaaa" always fails, but the callout is taken - before each backtrack happens (in this example, 10 times). - - Recording which path was taken - - There is one verb whose main purpose is to track how a match was - arrived at, though it also has a secondary use in conjunction with - advancing the match starting point (see (*SKIP) below). - - (*MARK:NAME) or (*:NAME) - - A name is always required with this verb. There may be as many - instances of (*MARK) as you like in a pattern, and their names do not - have to be unique. - - When a match succeeds, the name of the last-encountered (*MARK:NAME), - (*PRUNE:NAME), or (*THEN:NAME) on the matching path is passed back to - the caller as described in the section entitled "Extra data for - pcre_exec()" in the pcreapi documentation. Here is an example of - pcretest output, where the /K modifier requests the retrieval and out- - putting of (*MARK) data: - - re> /X(*MARK:A)Y|X(*MARK:B)Z/K - data> XY - 0: XY - MK: A - XZ - 0: XZ - MK: B - - The (*MARK) name is tagged with "MK:" in this output, and in this exam- - ple it indicates which of the two alternatives matched. This is a more - efficient way of obtaining this information than putting each alterna- - tive in its own capturing parentheses. - - If a verb with a name is encountered in a positive assertion that is - true, the name is recorded and passed back if it is the last-encoun- - tered. This does not happen for negative assertions or failing positive - assertions. - - After a partial match or a failed match, the last encountered name in - the entire match process is returned. For example: - - re> /X(*MARK:A)Y|X(*MARK:B)Z/K - data> XP - No match, mark = B - - Note that in this unanchored example the mark is retained from the - match attempt that started at the letter "X" in the subject. Subsequent - match attempts starting at "P" and then with an empty string do not get - as far as the (*MARK) item, but nevertheless do not reset it. - - If you are interested in (*MARK) values after failed matches, you - should probably set the PCRE_NO_START_OPTIMIZE option (see above) to - ensure that the match is always attempted. - - Verbs that act after backtracking - - The following verbs do nothing when they are encountered. Matching con- - tinues with what follows, but if there is no subsequent match, causing - a backtrack to the verb, a failure is forced. That is, backtracking - cannot pass to the left of the verb. However, when one of these verbs - appears inside an atomic group or an assertion that is true, its effect - is confined to that group, because once the group has been matched, - there is never any backtracking into it. In this situation, backtrack- - ing can "jump back" to the left of the entire atomic group or asser- - tion. (Remember also, as stated above, that this localization also - applies in subroutine calls.) - - These verbs differ in exactly what kind of failure occurs when back- - tracking reaches them. The behaviour described below is what happens - when the verb is not in a subroutine or an assertion. Subsequent sec- - tions cover these special cases. - - (*COMMIT) - - This verb, which may not be followed by a name, causes the whole match - to fail outright if there is a later matching failure that causes back- - tracking to reach it. Even if the pattern is unanchored, no further - attempts to find a match by advancing the starting point take place. If - (*COMMIT) is the only backtracking verb that is encountered, once it - has been passed pcre_exec() is committed to finding a match at the cur- - rent starting point, or not at all. For example: - - a+(*COMMIT)b - - This matches "xxaab" but not "aacaab". It can be thought of as a kind - of dynamic anchor, or "I've started, so I must finish." The name of the - most recently passed (*MARK) in the path is passed back when (*COMMIT) - forces a match failure. - - If there is more than one backtracking verb in a pattern, a different - one that follows (*COMMIT) may be triggered first, so merely passing - (*COMMIT) during a match does not always guarantee that a match must be - at this starting point. - - Note that (*COMMIT) at the start of a pattern is not the same as an - anchor, unless PCRE's start-of-match optimizations are turned off, as - shown in this output from pcretest: - - re> /(*COMMIT)abc/ - data> xyzabc - 0: abc - data> xyzabc\Y - No match - - For this pattern, PCRE knows that any match must start with "a", so the - optimization skips along the subject to "a" before applying the pattern - to the first set of data. The match attempt then succeeds. In the sec- - ond set of data, the escape sequence \Y is interpreted by the pcretest - program. It causes the PCRE_NO_START_OPTIMIZE option to be set when - pcre_exec() is called. This disables the optimization that skips along - to the first character. The pattern is now applied starting at "x", and - so the (*COMMIT) causes the match to fail without trying any other - starting points. - - (*PRUNE) or (*PRUNE:NAME) - - This verb causes the match to fail at the current starting position in - the subject if there is a later matching failure that causes backtrack- - ing to reach it. If the pattern is unanchored, the normal "bumpalong" - advance to the next starting character then happens. Backtracking can - occur as usual to the left of (*PRUNE), before it is reached, or when - matching to the right of (*PRUNE), but if there is no match to the - right, backtracking cannot cross (*PRUNE). In simple cases, the use of - (*PRUNE) is just an alternative to an atomic group or possessive quan- - tifier, but there are some uses of (*PRUNE) that cannot be expressed in - any other way. In an anchored pattern (*PRUNE) has the same effect as - (*COMMIT). - - The behaviour of (*PRUNE:NAME) is the not the same as - (*MARK:NAME)(*PRUNE). It is like (*MARK:NAME) in that the name is - remembered for passing back to the caller. However, (*SKIP:NAME) - searches only for names set with (*MARK). - - (*SKIP) - - This verb, when given without a name, is like (*PRUNE), except that if - the pattern is unanchored, the "bumpalong" advance is not to the next - character, but to the position in the subject where (*SKIP) was encoun- - tered. (*SKIP) signifies that whatever text was matched leading up to - it cannot be part of a successful match. Consider: - - a+(*SKIP)b - - If the subject is "aaaac...", after the first match attempt fails - (starting at the first character in the string), the starting point - skips on to start the next attempt at "c". Note that a possessive quan- - tifer does not have the same effect as this example; although it would - suppress backtracking during the first match attempt, the second - attempt would start at the second character instead of skipping on to - "c". - - (*SKIP:NAME) - - When (*SKIP) has an associated name, its behaviour is modified. When it - is triggered, the previous path through the pattern is searched for the - most recent (*MARK) that has the same name. If one is found, the - "bumpalong" advance is to the subject position that corresponds to that - (*MARK) instead of to where (*SKIP) was encountered. If no (*MARK) with - a matching name is found, the (*SKIP) is ignored. - - Note that (*SKIP:NAME) searches only for names set by (*MARK:NAME). It - ignores names that are set by (*PRUNE:NAME) or (*THEN:NAME). - - (*THEN) or (*THEN:NAME) - - This verb causes a skip to the next innermost alternative when back- - tracking reaches it. That is, it cancels any further backtracking - within the current alternative. Its name comes from the observation - that it can be used for a pattern-based if-then-else block: - - ( COND1 (*THEN) FOO | COND2 (*THEN) BAR | COND3 (*THEN) BAZ ) ... - - If the COND1 pattern matches, FOO is tried (and possibly further items - after the end of the group if FOO succeeds); on failure, the matcher - skips to the second alternative and tries COND2, without backtracking - into COND1. If that succeeds and BAR fails, COND3 is tried. If subse- - quently BAZ fails, there are no more alternatives, so there is a back- - track to whatever came before the entire group. If (*THEN) is not - inside an alternation, it acts like (*PRUNE). - - The behaviour of (*THEN:NAME) is the not the same as - (*MARK:NAME)(*THEN). It is like (*MARK:NAME) in that the name is - remembered for passing back to the caller. However, (*SKIP:NAME) - searches only for names set with (*MARK). - - A subpattern that does not contain a | character is just a part of the - enclosing alternative; it is not a nested alternation with only one - alternative. The effect of (*THEN) extends beyond such a subpattern to - the enclosing alternative. Consider this pattern, where A, B, etc. are - complex pattern fragments that do not contain any | characters at this - level: - - A (B(*THEN)C) | D - - If A and B are matched, but there is a failure in C, matching does not - backtrack into A; instead it moves to the next alternative, that is, D. - However, if the subpattern containing (*THEN) is given an alternative, - it behaves differently: - - A (B(*THEN)C | (*FAIL)) | D - - The effect of (*THEN) is now confined to the inner subpattern. After a - failure in C, matching moves to (*FAIL), which causes the whole subpat- - tern to fail because there are no more alternatives to try. In this - case, matching does now backtrack into A. - - Note that a conditional subpattern is not considered as having two - alternatives, because only one is ever used. In other words, the | - character in a conditional subpattern has a different meaning. Ignoring - white space, consider: - - ^.*? (?(?=a) a | b(*THEN)c ) - - If the subject is "ba", this pattern does not match. Because .*? is - ungreedy, it initially matches zero characters. The condition (?=a) - then fails, the character "b" is matched, but "c" is not. At this - point, matching does not backtrack to .*? as might perhaps be expected - from the presence of the | character. The conditional subpattern is - part of the single alternative that comprises the whole pattern, and so - the match fails. (If there was a backtrack into .*?, allowing it to - match "b", the match would succeed.) - - The verbs just described provide four different "strengths" of control - when subsequent matching fails. (*THEN) is the weakest, carrying on the - match at the next alternative. (*PRUNE) comes next, failing the match - at the current starting position, but allowing an advance to the next - character (for an unanchored pattern). (*SKIP) is similar, except that - the advance may be more than one character. (*COMMIT) is the strongest, - causing the entire match to fail. - - More than one backtracking verb - - If more than one backtracking verb is present in a pattern, the one - that is backtracked onto first acts. For example, consider this pat- - tern, where A, B, etc. are complex pattern fragments: - - (A(*COMMIT)B(*THEN)C|ABD) - - If A matches but B fails, the backtrack to (*COMMIT) causes the entire - match to fail. However, if A and B match, but C fails, the backtrack to - (*THEN) causes the next alternative (ABD) to be tried. This behaviour - is consistent, but is not always the same as Perl's. It means that if - two or more backtracking verbs appear in succession, all the the last - of them has no effect. Consider this example: - - ...(*COMMIT)(*PRUNE)... - - If there is a matching failure to the right, backtracking onto (*PRUNE) - causes it to be triggered, and its action is taken. There can never be - a backtrack onto (*COMMIT). - - Backtracking verbs in repeated groups - - PCRE differs from Perl in its handling of backtracking verbs in - repeated groups. For example, consider: - - /(a(*COMMIT)b)+ac/ - - If the subject is "abac", Perl matches, but PCRE fails because the - (*COMMIT) in the second repeat of the group acts. - - Backtracking verbs in assertions - - (*FAIL) in an assertion has its normal effect: it forces an immediate - backtrack. - - (*ACCEPT) in a positive assertion causes the assertion to succeed with- - out any further processing. In a negative assertion, (*ACCEPT) causes - the assertion to fail without any further processing. - - The other backtracking verbs are not treated specially if they appear - in a positive assertion. In particular, (*THEN) skips to the next - alternative in the innermost enclosing group that has alternations, - whether or not this is within the assertion. - - Negative assertions are, however, different, in order to ensure that - changing a positive assertion into a negative assertion changes its - result. Backtracking into (*COMMIT), (*SKIP), or (*PRUNE) causes a neg- - ative assertion to be true, without considering any further alternative - branches in the assertion. Backtracking into (*THEN) causes it to skip - to the next enclosing alternative within the assertion (the normal be- - haviour), but if the assertion does not have such an alternative, - (*THEN) behaves like (*PRUNE). - - Backtracking verbs in subroutines - - These behaviours occur whether or not the subpattern is called recur- - sively. Perl's treatment of subroutines is different in some cases. - - (*FAIL) in a subpattern called as a subroutine has its normal effect: - it forces an immediate backtrack. - - (*ACCEPT) in a subpattern called as a subroutine causes the subroutine - match to succeed without any further processing. Matching then contin- - ues after the subroutine call. - - (*COMMIT), (*SKIP), and (*PRUNE) in a subpattern called as a subroutine - cause the subroutine match to fail. - - (*THEN) skips to the next alternative in the innermost enclosing group - within the subpattern that has alternatives. If there is no such group - within the subpattern, (*THEN) causes the subroutine match to fail. - - -SEE ALSO - - pcreapi(3), pcrecallout(3), pcrematching(3), pcresyntax(3), pcre(3), - pcre16(3), pcre32(3). - - -AUTHOR - - Philip Hazel - University Computing Service - Cambridge CB2 3QH, England. - - -REVISION - - Last updated: 23 October 2016 - Copyright (c) 1997-2016 University of Cambridge. ------------------------------------------------------------------------------- - - -PCRESYNTAX(3) Library Functions Manual PCRESYNTAX(3) - - - -NAME - PCRE - Perl-compatible regular expressions - -PCRE REGULAR EXPRESSION SYNTAX SUMMARY - - The full syntax and semantics of the regular expressions that are sup- - ported by PCRE are described in the pcrepattern documentation. This - document contains a quick-reference summary of the syntax. - - -QUOTING - - \x where x is non-alphanumeric is a literal x - \Q...\E treat enclosed characters as literal - - -CHARACTERS - - \a alarm, that is, the BEL character (hex 07) - \cx "control-x", where x is any ASCII character - \e escape (hex 1B) - \f form feed (hex 0C) - \n newline (hex 0A) - \r carriage return (hex 0D) - \t tab (hex 09) - \0dd character with octal code 0dd - \ddd character with octal code ddd, or backreference - \o{ddd..} character with octal code ddd.. - \xhh character with hex code hh - \x{hhh..} character with hex code hhh.. - - Note that \0dd is always an octal code, and that \8 and \9 are the lit- - eral characters "8" and "9". - - -CHARACTER TYPES - - . any character except newline; - in dotall mode, any character whatsoever - \C one data unit, even in UTF mode (best avoided) - \d a decimal digit - \D a character that is not a decimal digit - \h a horizontal white space character - \H a character that is not a horizontal white space character - \N a character that is not a newline - \p{xx} a character with the xx property - \P{xx} a character without the xx property - \R a newline sequence - \s a white space character - \S a character that is not a white space character - \v a vertical white space character - \V a character that is not a vertical white space character - \w a "word" character - \W a "non-word" character - \X a Unicode extended grapheme cluster - - By default, \d, \s, and \w match only ASCII characters, even in UTF-8 - mode or in the 16- bit and 32-bit libraries. However, if locale-spe- - cific matching is happening, \s and \w may also match characters with - code points in the range 128-255. If the PCRE_UCP option is set, the - behaviour of these escape sequences is changed to use Unicode proper- - ties and they match many more characters. - - -GENERAL CATEGORY PROPERTIES FOR \p and \P - - C Other - Cc Control - Cf Format - Cn Unassigned - Co Private use - Cs Surrogate - - L Letter - Ll Lower case letter - Lm Modifier letter - Lo Other letter - Lt Title case letter - Lu Upper case letter - L& Ll, Lu, or Lt - - M Mark - Mc Spacing mark - Me Enclosing mark - Mn Non-spacing mark - - N Number - Nd Decimal number - Nl Letter number - No Other number - - P Punctuation - Pc Connector punctuation - Pd Dash punctuation - Pe Close punctuation - Pf Final punctuation - Pi Initial punctuation - Po Other punctuation - Ps Open punctuation - - S Symbol - Sc Currency symbol - Sk Modifier symbol - Sm Mathematical symbol - So Other symbol - - Z Separator - Zl Line separator - Zp Paragraph separator - Zs Space separator - - -PCRE SPECIAL CATEGORY PROPERTIES FOR \p and \P - - Xan Alphanumeric: union of properties L and N - Xps POSIX space: property Z or tab, NL, VT, FF, CR - Xsp Perl space: property Z or tab, NL, VT, FF, CR - Xuc Univerally-named character: one that can be - represented by a Universal Character Name - Xwd Perl word: property Xan or underscore - - Perl and POSIX space are now the same. Perl added VT to its space char- - acter set at release 5.18 and PCRE changed at release 8.34. - - -SCRIPT NAMES FOR \p AND \P - - Arabic, Armenian, Avestan, Balinese, Bamum, Bassa_Vah, Batak, Bengali, - Bopomofo, Brahmi, Braille, Buginese, Buhid, Canadian_Aboriginal, Car- - ian, Caucasian_Albanian, Chakma, Cham, Cherokee, Common, Coptic, Cunei- - form, Cypriot, Cyrillic, Deseret, Devanagari, Duployan, Egyptian_Hiero- - glyphs, Elbasan, Ethiopic, Georgian, Glagolitic, Gothic, Grantha, - Greek, Gujarati, Gurmukhi, Han, Hangul, Hanunoo, Hebrew, Hiragana, - Imperial_Aramaic, Inherited, Inscriptional_Pahlavi, Inscrip- - tional_Parthian, Javanese, Kaithi, Kannada, Katakana, Kayah_Li, - Kharoshthi, Khmer, Khojki, Khudawadi, Lao, Latin, Lepcha, Limbu, Lin- - ear_A, Linear_B, Lisu, Lycian, Lydian, Mahajani, Malayalam, Mandaic, - Manichaean, Meetei_Mayek, Mende_Kikakui, Meroitic_Cursive, - Meroitic_Hieroglyphs, Miao, Modi, Mongolian, Mro, Myanmar, Nabataean, - New_Tai_Lue, Nko, Ogham, Ol_Chiki, Old_Italic, Old_North_Arabian, - Old_Permic, Old_Persian, Old_South_Arabian, Old_Turkic, Oriya, Osmanya, - Pahawh_Hmong, Palmyrene, Pau_Cin_Hau, Phags_Pa, Phoenician, - Psalter_Pahlavi, Rejang, Runic, Samaritan, Saurashtra, Sharada, Sha- - vian, Siddham, Sinhala, Sora_Sompeng, Sundanese, Syloti_Nagri, Syriac, - Tagalog, Tagbanwa, Tai_Le, Tai_Tham, Tai_Viet, Takri, Tamil, Telugu, - Thaana, Thai, Tibetan, Tifinagh, Tirhuta, Ugaritic, Vai, Warang_Citi, - Yi. - - -CHARACTER CLASSES - - [...] positive character class - [^...] negative character class - [x-y] range (can be used for hex characters) - [[:xxx:]] positive POSIX named set - [[:^xxx:]] negative POSIX named set - - alnum alphanumeric - alpha alphabetic - ascii 0-127 - blank space or tab - cntrl control character - digit decimal digit - graph printing, excluding space - lower lower case letter - print printing, including space - punct printing, excluding alphanumeric - space white space - upper upper case letter - word same as \w - xdigit hexadecimal digit - - In PCRE, POSIX character set names recognize only ASCII characters by - default, but some of them use Unicode properties if PCRE_UCP is set. - You can use \Q...\E inside a character class. - - -QUANTIFIERS - - ? 0 or 1, greedy - ?+ 0 or 1, possessive - ?? 0 or 1, lazy - * 0 or more, greedy - *+ 0 or more, possessive - *? 0 or more, lazy - + 1 or more, greedy - ++ 1 or more, possessive - +? 1 or more, lazy - {n} exactly n - {n,m} at least n, no more than m, greedy - {n,m}+ at least n, no more than m, possessive - {n,m}? at least n, no more than m, lazy - {n,} n or more, greedy - {n,}+ n or more, possessive - {n,}? n or more, lazy - - -ANCHORS AND SIMPLE ASSERTIONS - - \b word boundary - \B not a word boundary - ^ start of subject - also after internal newline in multiline mode - \A start of subject - $ end of subject - also before newline at end of subject - also before internal newline in multiline mode - \Z end of subject - also before newline at end of subject - \z end of subject - \G first matching position in subject - - -MATCH POINT RESET - - \K reset start of match - - \K is honoured in positive assertions, but ignored in negative ones. - - -ALTERNATION - - expr|expr|expr... - - -CAPTURING - - (...) capturing group - (?...) named capturing group (Perl) - (?'name'...) named capturing group (Perl) - (?P...) named capturing group (Python) - (?:...) non-capturing group - (?|...) non-capturing group; reset group numbers for - capturing groups in each alternative - - -ATOMIC GROUPS - - (?>...) atomic, non-capturing group - - -COMMENT - - (?#....) comment (not nestable) - - -OPTION SETTING - - (?i) caseless - (?J) allow duplicate names - (?m) multiline - (?s) single line (dotall) - (?U) default ungreedy (lazy) - (?x) extended (ignore white space) - (?-...) unset option(s) - - The following are recognized only at the very start of a pattern or - after one of the newline or \R options with similar syntax. More than - one of them may appear. - - (*LIMIT_MATCH=d) set the match limit to d (decimal number) - (*LIMIT_RECURSION=d) set the recursion limit to d (decimal number) - (*NO_AUTO_POSSESS) no auto-possessification (PCRE_NO_AUTO_POSSESS) - (*NO_START_OPT) no start-match optimization (PCRE_NO_START_OPTIMIZE) - (*UTF8) set UTF-8 mode: 8-bit library (PCRE_UTF8) - (*UTF16) set UTF-16 mode: 16-bit library (PCRE_UTF16) - (*UTF32) set UTF-32 mode: 32-bit library (PCRE_UTF32) - (*UTF) set appropriate UTF mode for the library in use - (*UCP) set PCRE_UCP (use Unicode properties for \d etc) - - Note that LIMIT_MATCH and LIMIT_RECURSION can only reduce the value of - the limits set by the caller of pcre_exec(), not increase them. - - -NEWLINE CONVENTION - - These are recognized only at the very start of the pattern or after - option settings with a similar syntax. - - (*CR) carriage return only - (*LF) linefeed only - (*CRLF) carriage return followed by linefeed - (*ANYCRLF) all three of the above - (*ANY) any Unicode newline sequence - - -WHAT \R MATCHES - - These are recognized only at the very start of the pattern or after - option setting with a similar syntax. - - (*BSR_ANYCRLF) CR, LF, or CRLF - (*BSR_UNICODE) any Unicode newline sequence - - -LOOKAHEAD AND LOOKBEHIND ASSERTIONS - - (?=...) positive look ahead - (?!...) negative look ahead - (?<=...) positive look behind - (? reference by name (Perl) - \k'name' reference by name (Perl) - \g{name} reference by name (Perl) - \k{name} reference by name (.NET) - (?P=name) reference by name (Python) - - -SUBROUTINE REFERENCES (POSSIBLY RECURSIVE) - - (?R) recurse whole pattern - (?n) call subpattern by absolute number - (?+n) call subpattern by relative number - (?-n) call subpattern by relative number - (?&name) call subpattern by name (Perl) - (?P>name) call subpattern by name (Python) - \g call subpattern by name (Oniguruma) - \g'name' call subpattern by name (Oniguruma) - \g call subpattern by absolute number (Oniguruma) - \g'n' call subpattern by absolute number (Oniguruma) - \g<+n> call subpattern by relative number (PCRE extension) - \g'+n' call subpattern by relative number (PCRE extension) - \g<-n> call subpattern by relative number (PCRE extension) - \g'-n' call subpattern by relative number (PCRE extension) - - -CONDITIONAL PATTERNS - - (?(condition)yes-pattern) - (?(condition)yes-pattern|no-pattern) - - (?(n)... absolute reference condition - (?(+n)... relative reference condition - (?(-n)... relative reference condition - (?()... named reference condition (Perl) - (?('name')... named reference condition (Perl) - (?(name)... named reference condition (PCRE) - (?(R)... overall recursion condition - (?(Rn)... specific group recursion condition - (?(R&name)... specific recursion condition - (?(DEFINE)... define subpattern for reference - (?(assert)... assertion condition - - -BACKTRACKING CONTROL - - The following act immediately they are reached: - - (*ACCEPT) force successful match - (*FAIL) force backtrack; synonym (*F) - (*MARK:NAME) set name to be passed back; synonym (*:NAME) - - The following act only when a subsequent match failure causes a back- - track to reach them. They all force a match failure, but they differ in - what happens afterwards. Those that advance the start-of-match point do - so only if the pattern is not anchored. - - (*COMMIT) overall failure, no advance of starting point - (*PRUNE) advance to next starting character - (*PRUNE:NAME) equivalent to (*MARK:NAME)(*PRUNE) - (*SKIP) advance to current matching position - (*SKIP:NAME) advance to position corresponding to an earlier - (*MARK:NAME); if not found, the (*SKIP) is ignored - (*THEN) local failure, backtrack to next alternation - (*THEN:NAME) equivalent to (*MARK:NAME)(*THEN) - - -CALLOUTS - - (?C) callout - (?Cn) callout with data n - - -SEE ALSO - - pcrepattern(3), pcreapi(3), pcrecallout(3), pcrematching(3), pcre(3). - - -AUTHOR - - Philip Hazel - University Computing Service - Cambridge CB2 3QH, England. - - -REVISION - - Last updated: 08 January 2014 - Copyright (c) 1997-2014 University of Cambridge. ------------------------------------------------------------------------------- - - -PCREUNICODE(3) Library Functions Manual PCREUNICODE(3) - - - -NAME - PCRE - Perl-compatible regular expressions - -UTF-8, UTF-16, UTF-32, AND UNICODE PROPERTY SUPPORT - - As well as UTF-8 support, PCRE also supports UTF-16 (from release 8.30) - and UTF-32 (from release 8.32), by means of two additional libraries. - They can be built as well as, or instead of, the 8-bit library. - - -UTF-8 SUPPORT - - In order process UTF-8 strings, you must build PCRE's 8-bit library - with UTF support, and, in addition, you must call pcre_compile() with - the PCRE_UTF8 option flag, or the pattern must start with the sequence - (*UTF8) or (*UTF). When either of these is the case, both the pattern - and any subject strings that are matched against it are treated as - UTF-8 strings instead of strings of individual 1-byte characters. - - -UTF-16 AND UTF-32 SUPPORT - - In order process UTF-16 or UTF-32 strings, you must build PCRE's 16-bit - or 32-bit library with UTF support, and, in addition, you must call - pcre16_compile() or pcre32_compile() with the PCRE_UTF16 or PCRE_UTF32 - option flag, as appropriate. Alternatively, the pattern must start with - the sequence (*UTF16), (*UTF32), as appropriate, or (*UTF), which can - be used with either library. When UTF mode is set, both the pattern and - any subject strings that are matched against it are treated as UTF-16 - or UTF-32 strings instead of strings of individual 16-bit or 32-bit - characters. - - -UTF SUPPORT OVERHEAD - - If you compile PCRE with UTF support, but do not use it at run time, - the library will be a bit bigger, but the additional run time overhead - is limited to testing the PCRE_UTF[8|16|32] flag occasionally, so - should not be very big. - - -UNICODE PROPERTY SUPPORT - - If PCRE is built with Unicode character property support (which implies - UTF support), the escape sequences \p{..}, \P{..}, and \X can be used. - The available properties that can be tested are limited to the general - category properties such as Lu for an upper case letter or Nd for a - decimal number, the Unicode script names such as Arabic or Han, and the - derived properties Any and L&. Full lists is given in the pcrepattern - and pcresyntax documentation. Only the short names for properties are - supported. For example, \p{L} matches a letter. Its Perl synonym, - \p{Letter}, is not supported. Furthermore, in Perl, many properties - may optionally be prefixed by "Is", for compatibility with Perl 5.6. - PCRE does not support this. - - Validity of UTF-8 strings - - When you set the PCRE_UTF8 flag, the byte strings passed as patterns - and subjects are (by default) checked for validity on entry to the rel- - evant functions. The entire string is checked before any other process- - ing takes place. From release 7.3 of PCRE, the check is according the - rules of RFC 3629, which are themselves derived from the Unicode speci- - fication. Earlier releases of PCRE followed the rules of RFC 2279, - which allows the full range of 31-bit values (0 to 0x7FFFFFFF). The - current check allows only values in the range U+0 to U+10FFFF, exclud- - ing the surrogate area. (From release 8.33 the so-called "non-charac- - ter" code points are no longer excluded because Unicode corrigendum #9 - makes it clear that they should not be.) - - Characters in the "Surrogate Area" of Unicode are reserved for use by - UTF-16, where they are used in pairs to encode codepoints with values - greater than 0xFFFF. The code points that are encoded by UTF-16 pairs - are available independently in the UTF-8 and UTF-32 encodings. (In - other words, the whole surrogate thing is a fudge for UTF-16 which - unfortunately messes up UTF-8 and UTF-32.) - - If an invalid UTF-8 string is passed to PCRE, an error return is given. - At compile time, the only additional information is the offset to the - first byte of the failing character. The run-time functions pcre_exec() - and pcre_dfa_exec() also pass back this information, as well as a more - detailed reason code if the caller has provided memory in which to do - this. - - In some situations, you may already know that your strings are valid, - and therefore want to skip these checks in order to improve perfor- - mance, for example in the case of a long subject string that is being - scanned repeatedly. If you set the PCRE_NO_UTF8_CHECK flag at compile - time or at run time, PCRE assumes that the pattern or subject it is - given (respectively) contains only valid UTF-8 codes. In this case, it - does not diagnose an invalid UTF-8 string. - - Note that passing PCRE_NO_UTF8_CHECK to pcre_compile() just disables - the check for the pattern; it does not also apply to subject strings. - If you want to disable the check for a subject string you must pass - this option to pcre_exec() or pcre_dfa_exec(). - - If you pass an invalid UTF-8 string when PCRE_NO_UTF8_CHECK is set, the - result is undefined and your program may crash. - - Validity of UTF-16 strings - - When you set the PCRE_UTF16 flag, the strings of 16-bit data units that - are passed as patterns and subjects are (by default) checked for valid- - ity on entry to the relevant functions. Values other than those in the - surrogate range U+D800 to U+DFFF are independent code points. Values in - the surrogate range must be used in pairs in the correct manner. - - If an invalid UTF-16 string is passed to PCRE, an error return is - given. At compile time, the only additional information is the offset - to the first data unit of the failing character. The run-time functions - pcre16_exec() and pcre16_dfa_exec() also pass back this information, as - well as a more detailed reason code if the caller has provided memory - in which to do this. - - In some situations, you may already know that your strings are valid, - and therefore want to skip these checks in order to improve perfor- - mance. If you set the PCRE_NO_UTF16_CHECK flag at compile time or at - run time, PCRE assumes that the pattern or subject it is given (respec- - tively) contains only valid UTF-16 sequences. In this case, it does not - diagnose an invalid UTF-16 string. However, if an invalid string is - passed, the result is undefined. - - Validity of UTF-32 strings - - When you set the PCRE_UTF32 flag, the strings of 32-bit data units that - are passed as patterns and subjects are (by default) checked for valid- - ity on entry to the relevant functions. This check allows only values - in the range U+0 to U+10FFFF, excluding the surrogate area U+D800 to - U+DFFF. - - If an invalid UTF-32 string is passed to PCRE, an error return is - given. At compile time, the only additional information is the offset - to the first data unit of the failing character. The run-time functions - pcre32_exec() and pcre32_dfa_exec() also pass back this information, as - well as a more detailed reason code if the caller has provided memory - in which to do this. - - In some situations, you may already know that your strings are valid, - and therefore want to skip these checks in order to improve perfor- - mance. If you set the PCRE_NO_UTF32_CHECK flag at compile time or at - run time, PCRE assumes that the pattern or subject it is given (respec- - tively) contains only valid UTF-32 sequences. In this case, it does not - diagnose an invalid UTF-32 string. However, if an invalid string is - passed, the result is undefined. - - General comments about UTF modes - - 1. Codepoints less than 256 can be specified in patterns by either - braced or unbraced hexadecimal escape sequences (for example, \x{b3} or - \xb3). Larger values have to use braced sequences. - - 2. Octal numbers up to \777 are recognized, and in UTF-8 mode they - match two-byte characters for values greater than \177. - - 3. Repeat quantifiers apply to complete UTF characters, not to individ- - ual data units, for example: \x{100}{3}. - - 4. The dot metacharacter matches one UTF character instead of a single - data unit. - - 5. The escape sequence \C can be used to match a single byte in UTF-8 - mode, or a single 16-bit data unit in UTF-16 mode, or a single 32-bit - data unit in UTF-32 mode, but its use can lead to some strange effects - because it breaks up multi-unit characters (see the description of \C - in the pcrepattern documentation). The use of \C is not supported in - the alternative matching function pcre[16|32]_dfa_exec(), nor is it - supported in UTF mode by the JIT optimization of pcre[16|32]_exec(). If - JIT optimization is requested for a UTF pattern that contains \C, it - will not succeed, and so the matching will be carried out by the normal - interpretive function. - - 6. The character escapes \b, \B, \d, \D, \s, \S, \w, and \W correctly - test characters of any code value, but, by default, the characters that - PCRE recognizes as digits, spaces, or word characters remain the same - set as in non-UTF mode, all with values less than 256. This remains - true even when PCRE is built to include Unicode property support, - because to do otherwise would slow down PCRE in many common cases. Note - in particular that this applies to \b and \B, because they are defined - in terms of \w and \W. If you really want to test for a wider sense of, - say, "digit", you can use explicit Unicode property tests such as - \p{Nd}. Alternatively, if you set the PCRE_UCP option, the way that the - character escapes work is changed so that Unicode properties are used - to determine which characters match. There are more details in the sec- - tion on generic character types in the pcrepattern documentation. - - 7. Similarly, characters that match the POSIX named character classes - are all low-valued characters, unless the PCRE_UCP option is set. - - 8. However, the horizontal and vertical white space matching escapes - (\h, \H, \v, and \V) do match all the appropriate Unicode characters, - whether or not PCRE_UCP is set. - - 9. Case-insensitive matching applies only to characters whose values - are less than 128, unless PCRE is built with Unicode property support. - A few Unicode characters such as Greek sigma have more than two code- - points that are case-equivalent. Up to and including PCRE release 8.31, - only one-to-one case mappings were supported, but later releases (with - Unicode property support) do treat as case-equivalent all versions of - characters such as Greek sigma. - - -AUTHOR - - Philip Hazel - University Computing Service - Cambridge CB2 3QH, England. - - -REVISION - - Last updated: 27 February 2013 - Copyright (c) 1997-2013 University of Cambridge. ------------------------------------------------------------------------------- - - -PCREJIT(3) Library Functions Manual PCREJIT(3) - - - -NAME - PCRE - Perl-compatible regular expressions - -PCRE JUST-IN-TIME COMPILER SUPPORT - - Just-in-time compiling is a heavyweight optimization that can greatly - speed up pattern matching. However, it comes at the cost of extra pro- - cessing before the match is performed. Therefore, it is of most benefit - when the same pattern is going to be matched many times. This does not - necessarily mean many calls of a matching function; if the pattern is - not anchored, matching attempts may take place many times at various - positions in the subject, even for a single call. Therefore, if the - subject string is very long, it may still pay to use JIT for one-off - matches. - - JIT support applies only to the traditional Perl-compatible matching - function. It does not apply when the DFA matching function is being - used. The code for this support was written by Zoltan Herczeg. - - -8-BIT, 16-BIT AND 32-BIT SUPPORT - - JIT support is available for all of the 8-bit, 16-bit and 32-bit PCRE - libraries. To keep this documentation simple, only the 8-bit interface - is described in what follows. If you are using the 16-bit library, sub- - stitute the 16-bit functions and 16-bit structures (for example, - pcre16_jit_stack instead of pcre_jit_stack). If you are using the - 32-bit library, substitute the 32-bit functions and 32-bit structures - (for example, pcre32_jit_stack instead of pcre_jit_stack). - - -AVAILABILITY OF JIT SUPPORT - - JIT support is an optional feature of PCRE. The "configure" option - --enable-jit (or equivalent CMake option) must be set when PCRE is - built if you want to use JIT. The support is limited to the following - hardware platforms: - - ARM v5, v7, and Thumb2 - Intel x86 32-bit and 64-bit - MIPS 32-bit - Power PC 32-bit and 64-bit - SPARC 32-bit (experimental) - - If --enable-jit is set on an unsupported platform, compilation fails. - - A program that is linked with PCRE 8.20 or later can tell if JIT sup- - port is available by calling pcre_config() with the PCRE_CONFIG_JIT - option. The result is 1 when JIT is available, and 0 otherwise. How- - ever, a simple program does not need to check this in order to use JIT. - The normal API is implemented in a way that falls back to the interpre- - tive code if JIT is not available. For programs that need the best pos- - sible performance, there is also a "fast path" API that is JIT-spe- - cific. - - If your program may sometimes be linked with versions of PCRE that are - older than 8.20, but you want to use JIT when it is available, you can - test the values of PCRE_MAJOR and PCRE_MINOR, or the existence of a JIT - macro such as PCRE_CONFIG_JIT, for compile-time control of your code. - Also beware that the pcre_jit_exec() function was not available at all - before 8.32, and may not be available at all if PCRE isn't compiled - with --enable-jit. See the "JIT FAST PATH API" section below for - details. - - -SIMPLE USE OF JIT - - You have to do two things to make use of the JIT support in the sim- - plest way: - - (1) Call pcre_study() with the PCRE_STUDY_JIT_COMPILE option for - each compiled pattern, and pass the resulting pcre_extra block to - pcre_exec(). - - (2) Use pcre_free_study() to free the pcre_extra block when it is - no longer needed, instead of just freeing it yourself. This - ensures that - any JIT data is also freed. - - For a program that may be linked with pre-8.20 versions of PCRE, you - can insert - - #ifndef PCRE_STUDY_JIT_COMPILE - #define PCRE_STUDY_JIT_COMPILE 0 - #endif - - so that no option is passed to pcre_study(), and then use something - like this to free the study data: - - #ifdef PCRE_CONFIG_JIT - pcre_free_study(study_ptr); - #else - pcre_free(study_ptr); - #endif - - PCRE_STUDY_JIT_COMPILE requests the JIT compiler to generate code for - complete matches. If you want to run partial matches using the - PCRE_PARTIAL_HARD or PCRE_PARTIAL_SOFT options of pcre_exec(), you - should set one or both of the following options in addition to, or - instead of, PCRE_STUDY_JIT_COMPILE when you call pcre_study(): - - PCRE_STUDY_JIT_PARTIAL_HARD_COMPILE - PCRE_STUDY_JIT_PARTIAL_SOFT_COMPILE - - If using pcre_jit_exec() and supporting a pre-8.32 version of PCRE, you - can insert: - - #if PCRE_MAJOR >= 8 && PCRE_MINOR >= 32 - pcre_jit_exec(...); - #else - pcre_exec(...) - #endif - - but as described in the "JIT FAST PATH API" section below this assumes - version 8.32 and later are compiled with --enable-jit, which may break. - - The JIT compiler generates different optimized code for each of the - three modes (normal, soft partial, hard partial). When pcre_exec() is - called, the appropriate code is run if it is available. Otherwise, the - pattern is matched using interpretive code. - - In some circumstances you may need to call additional functions. These - are described in the section entitled "Controlling the JIT stack" - below. - - If JIT support is not available, PCRE_STUDY_JIT_COMPILE etc. are - ignored, and no JIT data is created. Otherwise, the compiled pattern is - passed to the JIT compiler, which turns it into machine code that exe- - cutes much faster than the normal interpretive code. When pcre_exec() - is passed a pcre_extra block containing a pointer to JIT code of the - appropriate mode (normal or hard/soft partial), it obeys that code - instead of running the interpreter. The result is identical, but the - compiled JIT code runs much faster. - - There are some pcre_exec() options that are not supported for JIT exe- - cution. There are also some pattern items that JIT cannot handle. - Details are given below. In both cases, execution automatically falls - back to the interpretive code. If you want to know whether JIT was - actually used for a particular match, you should arrange for a JIT - callback function to be set up as described in the section entitled - "Controlling the JIT stack" below, even if you do not need to supply a - non-default JIT stack. Such a callback function is called whenever JIT - code is about to be obeyed. If the execution options are not right for - JIT execution, the callback function is not obeyed. - - If the JIT compiler finds an unsupported item, no JIT data is gener- - ated. You can find out if JIT execution is available after studying a - pattern by calling pcre_fullinfo() with the PCRE_INFO_JIT option. A - result of 1 means that JIT compilation was successful. A result of 0 - means that JIT support is not available, or the pattern was not studied - with PCRE_STUDY_JIT_COMPILE etc., or the JIT compiler was not able to - handle the pattern. - - Once a pattern has been studied, with or without JIT, it can be used as - many times as you like for matching different subject strings. - - -UNSUPPORTED OPTIONS AND PATTERN ITEMS - - The only pcre_exec() options that are supported for JIT execution are - PCRE_NO_UTF8_CHECK, PCRE_NO_UTF16_CHECK, PCRE_NO_UTF32_CHECK, PCRE_NOT- - BOL, PCRE_NOTEOL, PCRE_NOTEMPTY, PCRE_NOTEMPTY_ATSTART, PCRE_PAR- - TIAL_HARD, and PCRE_PARTIAL_SOFT. - - The only unsupported pattern items are \C (match a single data unit) - when running in a UTF mode, and a callout immediately before an asser- - tion condition in a conditional group. - - -RETURN VALUES FROM JIT EXECUTION - - When a pattern is matched using JIT execution, the return values are - the same as those given by the interpretive pcre_exec() code, with the - addition of one new error code: PCRE_ERROR_JIT_STACKLIMIT. This means - that the memory used for the JIT stack was insufficient. See "Control- - ling the JIT stack" below for a discussion of JIT stack usage. For com- - patibility with the interpretive pcre_exec() code, no more than two- - thirds of the ovector argument is used for passing back captured sub- - strings. - - The error code PCRE_ERROR_MATCHLIMIT is returned by the JIT code if - searching a very large pattern tree goes on for too long, as it is in - the same circumstance when JIT is not used, but the details of exactly - what is counted are not the same. The PCRE_ERROR_RECURSIONLIMIT error - code is never returned by JIT execution. - - -SAVING AND RESTORING COMPILED PATTERNS - - The code that is generated by the JIT compiler is architecture-spe- - cific, and is also position dependent. For those reasons it cannot be - saved (in a file or database) and restored later like the bytecode and - other data of a compiled pattern. Saving and restoring compiled pat- - terns is not something many people do. More detail about this facility - is given in the pcreprecompile documentation. It should be possible to - run pcre_study() on a saved and restored pattern, and thereby recreate - the JIT data, but because JIT compilation uses significant resources, - it is probably not worth doing this; you might as well recompile the - original pattern. - - -CONTROLLING THE JIT STACK - - When the compiled JIT code runs, it needs a block of memory to use as a - stack. By default, it uses 32K on the machine stack. However, some - large or complicated patterns need more than this. The error - PCRE_ERROR_JIT_STACKLIMIT is given when there is not enough stack. - Three functions are provided for managing blocks of memory for use as - JIT stacks. There is further discussion about the use of JIT stacks in - the section entitled "JIT stack FAQ" below. - - The pcre_jit_stack_alloc() function creates a JIT stack. Its arguments - are a starting size and a maximum size, and it returns a pointer to an - opaque structure of type pcre_jit_stack, or NULL if there is an error. - The pcre_jit_stack_free() function can be used to free a stack that is - no longer needed. (For the technically minded: the address space is - allocated by mmap or VirtualAlloc.) - - JIT uses far less memory for recursion than the interpretive code, and - a maximum stack size of 512K to 1M should be more than enough for any - pattern. - - The pcre_assign_jit_stack() function specifies which stack JIT code - should use. Its arguments are as follows: - - pcre_extra *extra - pcre_jit_callback callback - void *data - - The extra argument must be the result of studying a pattern with - PCRE_STUDY_JIT_COMPILE etc. There are three cases for the values of the - other two options: - - (1) If callback is NULL and data is NULL, an internal 32K block - on the machine stack is used. - - (2) If callback is NULL and data is not NULL, data must be - a valid JIT stack, the result of calling pcre_jit_stack_alloc(). - - (3) If callback is not NULL, it must point to a function that is - called with data as an argument at the start of matching, in - order to set up a JIT stack. If the return from the callback - function is NULL, the internal 32K stack is used; otherwise the - return value must be a valid JIT stack, the result of calling - pcre_jit_stack_alloc(). - - A callback function is obeyed whenever JIT code is about to be run; it - is not obeyed when pcre_exec() is called with options that are incom- - patible for JIT execution. A callback function can therefore be used to - determine whether a match operation was executed by JIT or by the - interpreter. - - You may safely use the same JIT stack for more than one pattern (either - by assigning directly or by callback), as long as the patterns are all - matched sequentially in the same thread. In a multithread application, - if you do not specify a JIT stack, or if you assign or pass back NULL - from a callback, that is thread-safe, because each thread has its own - machine stack. However, if you assign or pass back a non-NULL JIT - stack, this must be a different stack for each thread so that the - application is thread-safe. - - Strictly speaking, even more is allowed. You can assign the same non- - NULL stack to any number of patterns as long as they are not used for - matching by multiple threads at the same time. For example, you can - assign the same stack to all compiled patterns, and use a global mutex - in the callback to wait until the stack is available for use. However, - this is an inefficient solution, and not recommended. - - This is a suggestion for how a multithreaded program that needs to set - up non-default JIT stacks might operate: - - During thread initalization - thread_local_var = pcre_jit_stack_alloc(...) - - During thread exit - pcre_jit_stack_free(thread_local_var) - - Use a one-line callback function - return thread_local_var - - All the functions described in this section do nothing if JIT is not - available, and pcre_assign_jit_stack() does nothing unless the extra - argument is non-NULL and points to a pcre_extra block that is the - result of a successful study with PCRE_STUDY_JIT_COMPILE etc. - - -JIT STACK FAQ - - (1) Why do we need JIT stacks? - - PCRE (and JIT) is a recursive, depth-first engine, so it needs a stack - where the local data of the current node is pushed before checking its - child nodes. Allocating real machine stack on some platforms is diffi- - cult. For example, the stack chain needs to be updated every time if we - extend the stack on PowerPC. Although it is possible, its updating - time overhead decreases performance. So we do the recursion in memory. - - (2) Why don't we simply allocate blocks of memory with malloc()? - - Modern operating systems have a nice feature: they can reserve an - address space instead of allocating memory. We can safely allocate mem- - ory pages inside this address space, so the stack could grow without - moving memory data (this is important because of pointers). Thus we can - allocate 1M address space, and use only a single memory page (usually - 4K) if that is enough. However, we can still grow up to 1M anytime if - needed. - - (3) Who "owns" a JIT stack? - - The owner of the stack is the user program, not the JIT studied pattern - or anything else. The user program must ensure that if a stack is used - by pcre_exec(), (that is, it is assigned to the pattern currently run- - ning), that stack must not be used by any other threads (to avoid over- - writing the same memory area). The best practice for multithreaded pro- - grams is to allocate a stack for each thread, and return this stack - through the JIT callback function. - - (4) When should a JIT stack be freed? - - You can free a JIT stack at any time, as long as it will not be used by - pcre_exec() again. When you assign the stack to a pattern, only a - pointer is set. There is no reference counting or any other magic. You - can free the patterns and stacks in any order, anytime. Just do not - call pcre_exec() with a pattern pointing to an already freed stack, as - that will cause SEGFAULT. (Also, do not free a stack currently used by - pcre_exec() in another thread). You can also replace the stack for a - pattern at any time. You can even free the previous stack before - assigning a replacement. - - (5) Should I allocate/free a stack every time before/after calling - pcre_exec()? - - No, because this is too costly in terms of resources. However, you - could implement some clever idea which release the stack if it is not - used in let's say two minutes. The JIT callback can help to achieve - this without keeping a list of the currently JIT studied patterns. - - (6) OK, the stack is for long term memory allocation. But what happens - if a pattern causes stack overflow with a stack of 1M? Is that 1M kept - until the stack is freed? - - Especially on embedded sytems, it might be a good idea to release mem- - ory sometimes without freeing the stack. There is no API for this at - the moment. Probably a function call which returns with the currently - allocated memory for any stack and another which allows releasing mem- - ory (shrinking the stack) would be a good idea if someone needs this. - - (7) This is too much of a headache. Isn't there any better solution for - JIT stack handling? - - No, thanks to Windows. If POSIX threads were used everywhere, we could - throw out this complicated API. - - -EXAMPLE CODE - - This is a single-threaded example that specifies a JIT stack without - using a callback. - - int rc; - int ovector[30]; - pcre *re; - pcre_extra *extra; - pcre_jit_stack *jit_stack; - - re = pcre_compile(pattern, 0, &error, &erroffset, NULL); - /* Check for errors */ - extra = pcre_study(re, PCRE_STUDY_JIT_COMPILE, &error); - jit_stack = pcre_jit_stack_alloc(32*1024, 512*1024); - /* Check for error (NULL) */ - pcre_assign_jit_stack(extra, NULL, jit_stack); - rc = pcre_exec(re, extra, subject, length, 0, 0, ovector, 30); - /* Check results */ - pcre_free(re); - pcre_free_study(extra); - pcre_jit_stack_free(jit_stack); - - -JIT FAST PATH API - - Because the API described above falls back to interpreted execution - when JIT is not available, it is convenient for programs that are writ- - ten for general use in many environments. However, calling JIT via - pcre_exec() does have a performance impact. Programs that are written - for use where JIT is known to be available, and which need the best - possible performance, can instead use a "fast path" API to call JIT - execution directly instead of calling pcre_exec() (obviously only for - patterns that have been successfully studied by JIT). - - The fast path function is called pcre_jit_exec(), and it takes exactly - the same arguments as pcre_exec(), plus one additional argument that - must point to a JIT stack. The JIT stack arrangements described above - do not apply. The return values are the same as for pcre_exec(). - - When you call pcre_exec(), as well as testing for invalid options, a - number of other sanity checks are performed on the arguments. For exam- - ple, if the subject pointer is NULL, or its length is negative, an - immediate error is given. Also, unless PCRE_NO_UTF[8|16|32] is set, a - UTF subject string is tested for validity. In the interests of speed, - these checks do not happen on the JIT fast path, and if invalid data is - passed, the result is undefined. - - Bypassing the sanity checks and the pcre_exec() wrapping can give - speedups of more than 10%. - - Note that the pcre_jit_exec() function is not available in versions of - PCRE before 8.32 (released in November 2012). If you need to support - versions that old you must either use the slower pcre_exec(), or switch - between the two codepaths by checking the values of PCRE_MAJOR and - PCRE_MINOR. - - Due to an unfortunate implementation oversight, even in versions 8.32 - and later there will be no pcre_jit_exec() stub function defined when - PCRE is compiled with --disable-jit, which is the default, and there's - no way to detect whether PCRE was compiled with --enable-jit via a - macro. - - If you need to support versions older than 8.32, or versions that may - not build with --enable-jit, you must either use the slower - pcre_exec(), or switch between the two codepaths by checking the values - of PCRE_MAJOR and PCRE_MINOR. - - Switching between the two by checking the version assumes that all the - versions being targeted are built with --enable-jit. To also support - builds that may use --disable-jit either pcre_exec() must be used, or a - compile-time check for JIT via pcre_config() (which assumes the runtime - environment will be the same), or as the Git project decided to do, - simply assume that pcre_jit_exec() is present in 8.32 or later unless a - compile-time flag is provided, see the "grep: un-break building with - PCRE >= 8.32 without --enable-jit" commit in git.git for an example of - that. - - -SEE ALSO - - pcreapi(3) - - -AUTHOR - - Philip Hazel (FAQ by Zoltan Herczeg) - University Computing Service - Cambridge CB2 3QH, England. - - -REVISION - - Last updated: 05 July 2017 - Copyright (c) 1997-2017 University of Cambridge. ------------------------------------------------------------------------------- - - -PCREPARTIAL(3) Library Functions Manual PCREPARTIAL(3) - - - -NAME - PCRE - Perl-compatible regular expressions - -PARTIAL MATCHING IN PCRE - - In normal use of PCRE, if the subject string that is passed to a match- - ing function matches as far as it goes, but is too short to match the - entire pattern, PCRE_ERROR_NOMATCH is returned. There are circumstances - where it might be helpful to distinguish this case from other cases in - which there is no match. - - Consider, for example, an application where a human is required to type - in data for a field with specific formatting requirements. An example - might be a date in the form ddmmmyy, defined by this pattern: - - ^\d?\d(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)\d\d$ - - If the application sees the user's keystrokes one by one, and can check - that what has been typed so far is potentially valid, it is able to - raise an error as soon as a mistake is made, by beeping and not - reflecting the character that has been typed, for example. This immedi- - ate feedback is likely to be a better user interface than a check that - is delayed until the entire string has been entered. Partial matching - can also be useful when the subject string is very long and is not all - available at once. - - PCRE supports partial matching by means of the PCRE_PARTIAL_SOFT and - PCRE_PARTIAL_HARD options, which can be set when calling any of the - matching functions. For backwards compatibility, PCRE_PARTIAL is a syn- - onym for PCRE_PARTIAL_SOFT. The essential difference between the two - options is whether or not a partial match is preferred to an alterna- - tive complete match, though the details differ between the two types of - matching function. If both options are set, PCRE_PARTIAL_HARD takes - precedence. - - If you want to use partial matching with just-in-time optimized code, - you must call pcre_study(), pcre16_study() or pcre32_study() with one - or both of these options: - - PCRE_STUDY_JIT_PARTIAL_SOFT_COMPILE - PCRE_STUDY_JIT_PARTIAL_HARD_COMPILE - - PCRE_STUDY_JIT_COMPILE should also be set if you are going to run non- - partial matches on the same pattern. If the appropriate JIT study mode - has not been set for a match, the interpretive matching code is used. - - Setting a partial matching option disables two of PCRE's standard opti- - mizations. PCRE remembers the last literal data unit in a pattern, and - abandons matching immediately if it is not present in the subject - string. This optimization cannot be used for a subject string that - might match only partially. If the pattern was studied, PCRE knows the - minimum length of a matching string, and does not bother to run the - matching function on shorter strings. This optimization is also dis- - abled for partial matching. - - -PARTIAL MATCHING USING pcre_exec() OR pcre[16|32]_exec() - - A partial match occurs during a call to pcre_exec() or - pcre[16|32]_exec() when the end of the subject string is reached suc- - cessfully, but matching cannot continue because more characters are - needed. However, at least one character in the subject must have been - inspected. This character need not form part of the final matched - string; lookbehind assertions and the \K escape sequence provide ways - of inspecting characters before the start of a matched substring. The - requirement for inspecting at least one character exists because an - empty string can always be matched; without such a restriction there - would always be a partial match of an empty string at the end of the - subject. - - If there are at least two slots in the offsets vector when a partial - match is returned, the first slot is set to the offset of the earliest - character that was inspected. For convenience, the second offset points - to the end of the subject so that a substring can easily be identified. - If there are at least three slots in the offsets vector, the third slot - is set to the offset of the character where matching started. - - For the majority of patterns, the contents of the first and third slots - will be the same. However, for patterns that contain lookbehind asser- - tions, or begin with \b or \B, characters before the one where matching - started may have been inspected while carrying out the match. For exam- - ple, consider this pattern: - - /(?<=abc)123/ - - This pattern matches "123", but only if it is preceded by "abc". If the - subject string is "xyzabc12", the first two offsets after a partial - match are for the substring "abc12", because all these characters were - inspected. However, the third offset is set to 6, because that is the - offset where matching began. - - What happens when a partial match is identified depends on which of the - two partial matching options are set. - - PCRE_PARTIAL_SOFT WITH pcre_exec() OR pcre[16|32]_exec() - - If PCRE_PARTIAL_SOFT is set when pcre_exec() or pcre[16|32]_exec() - identifies a partial match, the partial match is remembered, but match- - ing continues as normal, and other alternatives in the pattern are - tried. If no complete match can be found, PCRE_ERROR_PARTIAL is - returned instead of PCRE_ERROR_NOMATCH. - - This option is "soft" because it prefers a complete match over a par- - tial match. All the various matching items in a pattern behave as if - the subject string is potentially complete. For example, \z, \Z, and $ - match at the end of the subject, as normal, and for \b and \B the end - of the subject is treated as a non-alphanumeric. - - If there is more than one partial match, the first one that was found - provides the data that is returned. Consider this pattern: - - /123\w+X|dogY/ - - If this is matched against the subject string "abc123dog", both alter- - natives fail to match, but the end of the subject is reached during - matching, so PCRE_ERROR_PARTIAL is returned. The offsets are set to 3 - and 9, identifying "123dog" as the first partial match that was found. - (In this example, there are two partial matches, because "dog" on its - own partially matches the second alternative.) - - PCRE_PARTIAL_HARD WITH pcre_exec() OR pcre[16|32]_exec() - - If PCRE_PARTIAL_HARD is set for pcre_exec() or pcre[16|32]_exec(), - PCRE_ERROR_PARTIAL is returned as soon as a partial match is found, - without continuing to search for possible complete matches. This option - is "hard" because it prefers an earlier partial match over a later com- - plete match. For this reason, the assumption is made that the end of - the supplied subject string may not be the true end of the available - data, and so, if \z, \Z, \b, \B, or $ are encountered at the end of the - subject, the result is PCRE_ERROR_PARTIAL, provided that at least one - character in the subject has been inspected. - - Setting PCRE_PARTIAL_HARD also affects the way UTF-8 and UTF-16 subject - strings are checked for validity. Normally, an invalid sequence causes - the error PCRE_ERROR_BADUTF8 or PCRE_ERROR_BADUTF16. However, in the - special case of a truncated character at the end of the subject, - PCRE_ERROR_SHORTUTF8 or PCRE_ERROR_SHORTUTF16 is returned when - PCRE_PARTIAL_HARD is set. - - Comparing hard and soft partial matching - - The difference between the two partial matching options can be illus- - trated by a pattern such as: - - /dog(sbody)?/ - - This matches either "dog" or "dogsbody", greedily (that is, it prefers - the longer string if possible). If it is matched against the string - "dog" with PCRE_PARTIAL_SOFT, it yields a complete match for "dog". - However, if PCRE_PARTIAL_HARD is set, the result is PCRE_ERROR_PARTIAL. - On the other hand, if the pattern is made ungreedy the result is dif- - ferent: - - /dog(sbody)??/ - - In this case the result is always a complete match because that is - found first, and matching never continues after finding a complete - match. It might be easier to follow this explanation by thinking of the - two patterns like this: - - /dog(sbody)?/ is the same as /dogsbody|dog/ - /dog(sbody)??/ is the same as /dog|dogsbody/ - - The second pattern will never match "dogsbody", because it will always - find the shorter match first. - - -PARTIAL MATCHING USING pcre_dfa_exec() OR pcre[16|32]_dfa_exec() - - The DFA functions move along the subject string character by character, - without backtracking, searching for all possible matches simultane- - ously. If the end of the subject is reached before the end of the pat- - tern, there is the possibility of a partial match, again provided that - at least one character has been inspected. - - When PCRE_PARTIAL_SOFT is set, PCRE_ERROR_PARTIAL is returned only if - there have been no complete matches. Otherwise, the complete matches - are returned. However, if PCRE_PARTIAL_HARD is set, a partial match - takes precedence over any complete matches. The portion of the string - that was inspected when the longest partial match was found is set as - the first matching string, provided there are at least two slots in the - offsets vector. - - Because the DFA functions always search for all possible matches, and - there is no difference between greedy and ungreedy repetition, their - behaviour is different from the standard functions when PCRE_PAR- - TIAL_HARD is set. Consider the string "dog" matched against the - ungreedy pattern shown above: - - /dog(sbody)??/ - - Whereas the standard functions stop as soon as they find the complete - match for "dog", the DFA functions also find the partial match for - "dogsbody", and so return that when PCRE_PARTIAL_HARD is set. - - -PARTIAL MATCHING AND WORD BOUNDARIES - - If a pattern ends with one of sequences \b or \B, which test for word - boundaries, partial matching with PCRE_PARTIAL_SOFT can give counter- - intuitive results. Consider this pattern: - - /\bcat\b/ - - This matches "cat", provided there is a word boundary at either end. If - the subject string is "the cat", the comparison of the final "t" with a - following character cannot take place, so a partial match is found. - However, normal matching carries on, and \b matches at the end of the - subject when the last character is a letter, so a complete match is - found. The result, therefore, is not PCRE_ERROR_PARTIAL. Using - PCRE_PARTIAL_HARD in this case does yield PCRE_ERROR_PARTIAL, because - then the partial match takes precedence. - - -FORMERLY RESTRICTED PATTERNS - - For releases of PCRE prior to 8.00, because of the way certain internal - optimizations were implemented in the pcre_exec() function, the - PCRE_PARTIAL option (predecessor of PCRE_PARTIAL_SOFT) could not be - used with all patterns. From release 8.00 onwards, the restrictions no - longer apply, and partial matching with can be requested for any pat- - tern. - - Items that were formerly restricted were repeated single characters and - repeated metasequences. If PCRE_PARTIAL was set for a pattern that did - not conform to the restrictions, pcre_exec() returned the error code - PCRE_ERROR_BADPARTIAL (-13). This error code is no longer in use. The - PCRE_INFO_OKPARTIAL call to pcre_fullinfo() to find out if a compiled - pattern can be used for partial matching now always returns 1. - - -EXAMPLE OF PARTIAL MATCHING USING PCRETEST - - If the escape sequence \P is present in a pcretest data line, the - PCRE_PARTIAL_SOFT option is used for the match. Here is a run of - pcretest that uses the date example quoted above: - - re> /^\d?\d(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)\d\d$/ - data> 25jun04\P - 0: 25jun04 - 1: jun - data> 25dec3\P - Partial match: 23dec3 - data> 3ju\P - Partial match: 3ju - data> 3juj\P - No match - data> j\P - No match - - The first data string is matched completely, so pcretest shows the - matched substrings. The remaining four strings do not match the com- - plete pattern, but the first two are partial matches. Similar output is - obtained if DFA matching is used. - - If the escape sequence \P is present more than once in a pcretest data - line, the PCRE_PARTIAL_HARD option is set for the match. - - -MULTI-SEGMENT MATCHING WITH pcre_dfa_exec() OR pcre[16|32]_dfa_exec() - - When a partial match has been found using a DFA matching function, it - is possible to continue the match by providing additional subject data - and calling the function again with the same compiled regular expres- - sion, this time setting the PCRE_DFA_RESTART option. You must pass the - same working space as before, because this is where details of the pre- - vious partial match are stored. Here is an example using pcretest, - using the \R escape sequence to set the PCRE_DFA_RESTART option (\D - specifies the use of the DFA matching function): - - re> /^\d?\d(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)\d\d$/ - data> 23ja\P\D - Partial match: 23ja - data> n05\R\D - 0: n05 - - The first call has "23ja" as the subject, and requests partial match- - ing; the second call has "n05" as the subject for the continued - (restarted) match. Notice that when the match is complete, only the - last part is shown; PCRE does not retain the previously partially- - matched string. It is up to the calling program to do that if it needs - to. - - That means that, for an unanchored pattern, if a continued match fails, - it is not possible to try again at a new starting point. All this - facility is capable of doing is continuing with the previous match - attempt. In the previous example, if the second set of data is "ug23" - the result is no match, even though there would be a match for "aug23" - if the entire string were given at once. Depending on the application, - this may or may not be what you want. The only way to allow for start- - ing again at the next character is to retain the matched part of the - subject and try a new complete match. - - You can set the PCRE_PARTIAL_SOFT or PCRE_PARTIAL_HARD options with - PCRE_DFA_RESTART to continue partial matching over multiple segments. - This facility can be used to pass very long subject strings to the DFA - matching functions. - - -MULTI-SEGMENT MATCHING WITH pcre_exec() OR pcre[16|32]_exec() - - From release 8.00, the standard matching functions can also be used to - do multi-segment matching. Unlike the DFA functions, it is not possible - to restart the previous match with a new segment of data. Instead, new - data must be added to the previous subject string, and the entire match - re-run, starting from the point where the partial match occurred. Ear- - lier data can be discarded. - - It is best to use PCRE_PARTIAL_HARD in this situation, because it does - not treat the end of a segment as the end of the subject when matching - \z, \Z, \b, \B, and $. Consider an unanchored pattern that matches - dates: - - re> /\d?\d(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)\d\d/ - data> The date is 23ja\P\P - Partial match: 23ja - - At this stage, an application could discard the text preceding "23ja", - add on text from the next segment, and call the matching function - again. Unlike the DFA matching functions, the entire matching string - must always be available, and the complete matching process occurs for - each call, so more memory and more processing time is needed. - - Note: If the pattern contains lookbehind assertions, or \K, or starts - with \b or \B, the string that is returned for a partial match includes - characters that precede the start of what would be returned for a com- - plete match, because it contains all the characters that were inspected - during the partial match. - - -ISSUES WITH MULTI-SEGMENT MATCHING - - Certain types of pattern may give problems with multi-segment matching, - whichever matching function is used. - - 1. If the pattern contains a test for the beginning of a line, you need - to pass the PCRE_NOTBOL option when the subject string for any call - does start at the beginning of a line. There is also a PCRE_NOTEOL - option, but in practice when doing multi-segment matching you should be - using PCRE_PARTIAL_HARD, which includes the effect of PCRE_NOTEOL. - - 2. Lookbehind assertions that have already been obeyed are catered for - in the offsets that are returned for a partial match. However a lookbe- - hind assertion later in the pattern could require even earlier charac- - ters to be inspected. You can handle this case by using the - PCRE_INFO_MAXLOOKBEHIND option of the pcre_fullinfo() or - pcre[16|32]_fullinfo() functions to obtain the length of the longest - lookbehind in the pattern. This length is given in characters, not - bytes. If you always retain at least that many characters before the - partially matched string, all should be well. (Of course, near the - start of the subject, fewer characters may be present; in that case all - characters should be retained.) - - From release 8.33, there is a more accurate way of deciding which char- - acters to retain. Instead of subtracting the length of the longest - lookbehind from the earliest inspected character (offsets[0]), the - match start position (offsets[2]) should be used, and the next match - attempt started at the offsets[2] character by setting the startoffset - argument of pcre_exec() or pcre_dfa_exec(). - - For example, if the pattern "(?<=123)abc" is partially matched against - the string "xx123a", the three offset values returned are 2, 6, and 5. - This indicates that the matching process that gave a partial match - started at offset 5, but the characters "123a" were all inspected. The - maximum lookbehind for that pattern is 3, so taking that away from 5 - shows that we need only keep "123a", and the next match attempt can be - started at offset 3 (that is, at "a") when further characters have been - added. When the match start is not the earliest inspected character, - pcretest shows it explicitly: - - re> "(?<=123)abc" - data> xx123a\P\P - Partial match at offset 5: 123a - - 3. Because a partial match must always contain at least one character, - what might be considered a partial match of an empty string actually - gives a "no match" result. For example: - - re> /c(?<=abc)x/ - data> ab\P - No match - - If the next segment begins "cx", a match should be found, but this will - only happen if characters from the previous segment are retained. For - this reason, a "no match" result should be interpreted as "partial - match of an empty string" when the pattern contains lookbehinds. - - 4. Matching a subject string that is split into multiple segments may - not always produce exactly the same result as matching over one single - long string, especially when PCRE_PARTIAL_SOFT is used. The section - "Partial Matching and Word Boundaries" above describes an issue that - arises if the pattern ends with \b or \B. Another kind of difference - may occur when there are multiple matching possibilities, because (for - PCRE_PARTIAL_SOFT) a partial match result is given only when there are - no completed matches. This means that as soon as the shortest match has - been found, continuation to a new subject segment is no longer possi- - ble. Consider again this pcretest example: - - re> /dog(sbody)?/ - data> dogsb\P - 0: dog - data> do\P\D - Partial match: do - data> gsb\R\P\D - 0: g - data> dogsbody\D - 0: dogsbody - 1: dog - - The first data line passes the string "dogsb" to a standard matching - function, setting the PCRE_PARTIAL_SOFT option. Although the string is - a partial match for "dogsbody", the result is not PCRE_ERROR_PARTIAL, - because the shorter string "dog" is a complete match. Similarly, when - the subject is presented to a DFA matching function in several parts - ("do" and "gsb" being the first two) the match stops when "dog" has - been found, and it is not possible to continue. On the other hand, if - "dogsbody" is presented as a single string, a DFA matching function - finds both matches. - - Because of these problems, it is best to use PCRE_PARTIAL_HARD when - matching multi-segment data. The example above then behaves differ- - ently: - - re> /dog(sbody)?/ - data> dogsb\P\P - Partial match: dogsb - data> do\P\D - Partial match: do - data> gsb\R\P\P\D - Partial match: gsb - - 5. Patterns that contain alternatives at the top level which do not all - start with the same pattern item may not work as expected when - PCRE_DFA_RESTART is used. For example, consider this pattern: - - 1234|3789 - - If the first part of the subject is "ABC123", a partial match of the - first alternative is found at offset 3. There is no partial match for - the second alternative, because such a match does not start at the same - point in the subject string. Attempting to continue with the string - "7890" does not yield a match because only those alternatives that - match at one point in the subject are remembered. The problem arises - because the start of the second alternative matches within the first - alternative. There is no problem with anchored patterns or patterns - such as: - - 1234|ABCD - - where no string can be a partial match for both alternatives. This is - not a problem if a standard matching function is used, because the - entire match has to be rerun each time: - - re> /1234|3789/ - data> ABC123\P\P - Partial match: 123 - data> 1237890 - 0: 3789 - - Of course, instead of using PCRE_DFA_RESTART, the same technique of re- - running the entire match can also be used with the DFA matching func- - tions. Another possibility is to work with two buffers. If a partial - match at offset n in the first buffer is followed by "no match" when - PCRE_DFA_RESTART is used on the second buffer, you can then try a new - match starting at offset n+1 in the first buffer. - - -AUTHOR - - Philip Hazel - University Computing Service - Cambridge CB2 3QH, England. - - -REVISION - - Last updated: 02 July 2013 - Copyright (c) 1997-2013 University of Cambridge. ------------------------------------------------------------------------------- - - -PCREPRECOMPILE(3) Library Functions Manual PCREPRECOMPILE(3) - - - -NAME - PCRE - Perl-compatible regular expressions - -SAVING AND RE-USING PRECOMPILED PCRE PATTERNS - - If you are running an application that uses a large number of regular - expression patterns, it may be useful to store them in a precompiled - form instead of having to compile them every time the application is - run. If you are not using any private character tables (see the - pcre_maketables() documentation), this is relatively straightforward. - If you are using private tables, it is a little bit more complicated. - However, if you are using the just-in-time optimization feature, it is - not possible to save and reload the JIT data. - - If you save compiled patterns to a file, you can copy them to a differ- - ent host and run them there. If the two hosts have different endianness - (byte order), you should run the pcre[16|32]_pat- - tern_to_host_byte_order() function on the new host before trying to - match the pattern. The matching functions return PCRE_ERROR_BADENDIAN- - NESS if they detect a pattern with the wrong endianness. - - Compiling regular expressions with one version of PCRE for use with a - different version is not guaranteed to work and may cause crashes, and - saving and restoring a compiled pattern loses any JIT optimization - data. - - -SAVING A COMPILED PATTERN - - The value returned by pcre[16|32]_compile() points to a single block of - memory that holds the compiled pattern and associated data. You can - find the length of this block in bytes by calling - pcre[16|32]_fullinfo() with an argument of PCRE_INFO_SIZE. You can then - save the data in any appropriate manner. Here is sample code for the - 8-bit library that compiles a pattern and writes it to a file. It - assumes that the variable fd refers to a file that is open for output: - - int erroroffset, rc, size; - char *error; - pcre *re; - - re = pcre_compile("my pattern", 0, &error, &erroroffset, NULL); - if (re == NULL) { ... handle errors ... } - rc = pcre_fullinfo(re, NULL, PCRE_INFO_SIZE, &size); - if (rc < 0) { ... handle errors ... } - rc = fwrite(re, 1, size, fd); - if (rc != size) { ... handle errors ... } - - In this example, the bytes that comprise the compiled pattern are - copied exactly. Note that this is binary data that may contain any of - the 256 possible byte values. On systems that make a distinction - between binary and non-binary data, be sure that the file is opened for - binary output. - - If you want to write more than one pattern to a file, you will have to - devise a way of separating them. For binary data, preceding each pat- - tern with its length is probably the most straightforward approach. - Another possibility is to write out the data in hexadecimal instead of - binary, one pattern to a line. - - Saving compiled patterns in a file is only one possible way of storing - them for later use. They could equally well be saved in a database, or - in the memory of some daemon process that passes them via sockets to - the processes that want them. - - If the pattern has been studied, it is also possible to save the normal - study data in a similar way to the compiled pattern itself. However, if - the PCRE_STUDY_JIT_COMPILE was used, the just-in-time data that is cre- - ated cannot be saved because it is too dependent on the current envi- - ronment. When studying generates additional information, - pcre[16|32]_study() returns a pointer to a pcre[16|32]_extra data - block. Its format is defined in the section on matching a pattern in - the pcreapi documentation. The study_data field points to the binary - study data, and this is what you must save (not the pcre[16|32]_extra - block itself). The length of the study data can be obtained by calling - pcre[16|32]_fullinfo() with an argument of PCRE_INFO_STUDYSIZE. Remem- - ber to check that pcre[16|32]_study() did return a non-NULL value - before trying to save the study data. - - -RE-USING A PRECOMPILED PATTERN - - Re-using a precompiled pattern is straightforward. Having reloaded it - into main memory, called pcre[16|32]_pattern_to_host_byte_order() if - necessary, you pass its pointer to pcre[16|32]_exec() or - pcre[16|32]_dfa_exec() in the usual way. - - However, if you passed a pointer to custom character tables when the - pattern was compiled (the tableptr argument of pcre[16|32]_compile()), - you must now pass a similar pointer to pcre[16|32]_exec() or - pcre[16|32]_dfa_exec(), because the value saved with the compiled pat- - tern will obviously be nonsense. A field in a pcre[16|32]_extra() block - is used to pass this data, as described in the section on matching a - pattern in the pcreapi documentation. - - Warning: The tables that pcre_exec() and pcre_dfa_exec() use must be - the same as those that were used when the pattern was compiled. If this - is not the case, the behaviour is undefined. - - If you did not provide custom character tables when the pattern was - compiled, the pointer in the compiled pattern is NULL, which causes the - matching functions to use PCRE's internal tables. Thus, you do not need - to take any special action at run time in this case. - - If you saved study data with the compiled pattern, you need to create - your own pcre[16|32]_extra data block and set the study_data field to - point to the reloaded study data. You must also set the - PCRE_EXTRA_STUDY_DATA bit in the flags field to indicate that study - data is present. Then pass the pcre[16|32]_extra block to the matching - function in the usual way. If the pattern was studied for just-in-time - optimization, that data cannot be saved, and so is lost by a - save/restore cycle. - - -COMPATIBILITY WITH DIFFERENT PCRE RELEASES - - In general, it is safest to recompile all saved patterns when you - update to a new PCRE release, though not all updates actually require - this. - - -AUTHOR - - Philip Hazel - University Computing Service - Cambridge CB2 3QH, England. - - -REVISION - - Last updated: 12 November 2013 - Copyright (c) 1997-2013 University of Cambridge. ------------------------------------------------------------------------------- - - -PCREPERFORM(3) Library Functions Manual PCREPERFORM(3) - - - -NAME - PCRE - Perl-compatible regular expressions - -PCRE PERFORMANCE - - Two aspects of performance are discussed below: memory usage and pro- - cessing time. The way you express your pattern as a regular expression - can affect both of them. - - -COMPILED PATTERN MEMORY USAGE - - Patterns are compiled by PCRE into a reasonably efficient interpretive - code, so that most simple patterns do not use much memory. However, - there is one case where the memory usage of a compiled pattern can be - unexpectedly large. If a parenthesized subpattern has a quantifier with - a minimum greater than 1 and/or a limited maximum, the whole subpattern - is repeated in the compiled code. For example, the pattern - - (abc|def){2,4} - - is compiled as if it were - - (abc|def)(abc|def)((abc|def)(abc|def)?)? - - (Technical aside: It is done this way so that backtrack points within - each of the repetitions can be independently maintained.) - - For regular expressions whose quantifiers use only small numbers, this - is not usually a problem. However, if the numbers are large, and par- - ticularly if such repetitions are nested, the memory usage can become - an embarrassment. For example, the very simple pattern - - ((ab){1,1000}c){1,3} - - uses 51K bytes when compiled using the 8-bit library. When PCRE is com- - piled with its default internal pointer size of two bytes, the size - limit on a compiled pattern is 64K data units, and this is reached with - the above pattern if the outer repetition is increased from 3 to 4. - PCRE can be compiled to use larger internal pointers and thus handle - larger compiled patterns, but it is better to try to rewrite your pat- - tern to use less memory if you can. - - One way of reducing the memory usage for such patterns is to make use - of PCRE's "subroutine" facility. Re-writing the above pattern as - - ((ab)(?2){0,999}c)(?1){0,2} - - reduces the memory requirements to 18K, and indeed it remains under 20K - even with the outer repetition increased to 100. However, this pattern - is not exactly equivalent, because the "subroutine" calls are treated - as atomic groups into which there can be no backtracking if there is a - subsequent matching failure. Therefore, PCRE cannot do this kind of - rewriting automatically. Furthermore, there is a noticeable loss of - speed when executing the modified pattern. Nevertheless, if the atomic - grouping is not a problem and the loss of speed is acceptable, this - kind of rewriting will allow you to process patterns that PCRE cannot - otherwise handle. - - -STACK USAGE AT RUN TIME - - When pcre_exec() or pcre[16|32]_exec() is used for matching, certain - kinds of pattern can cause it to use large amounts of the process - stack. In some environments the default process stack is quite small, - and if it runs out the result is often SIGSEGV. This issue is probably - the most frequently raised problem with PCRE. Rewriting your pattern - can often help. The pcrestack documentation discusses this issue in - detail. - - -PROCESSING TIME - - Certain items in regular expression patterns are processed more effi- - ciently than others. It is more efficient to use a character class like - [aeiou] than a set of single-character alternatives such as - (a|e|i|o|u). In general, the simplest construction that provides the - required behaviour is usually the most efficient. Jeffrey Friedl's book - contains a lot of useful general discussion about optimizing regular - expressions for efficient performance. This document contains a few - observations about PCRE. - - Using Unicode character properties (the \p, \P, and \X escapes) is - slow, because PCRE has to use a multi-stage table lookup whenever it - needs a character's property. If you can find an alternative pattern - that does not use character properties, it will probably be faster. - - By default, the escape sequences \b, \d, \s, and \w, and the POSIX - character classes such as [:alpha:] do not use Unicode properties, - partly for backwards compatibility, and partly for performance reasons. - However, you can set PCRE_UCP if you want Unicode character properties - to be used. This can double the matching time for items such as \d, - when matched with a traditional matching function; the performance loss - is less with a DFA matching function, and in both cases there is not - much difference for \b. - - When a pattern begins with .* not in parentheses, or in parentheses - that are not the subject of a backreference, and the PCRE_DOTALL option - is set, the pattern is implicitly anchored by PCRE, since it can match - only at the start of a subject string. However, if PCRE_DOTALL is not - set, PCRE cannot make this optimization, because the . metacharacter - does not then match a newline, and if the subject string contains new- - lines, the pattern may match from the character immediately following - one of them instead of from the very start. For example, the pattern - - .*second - - matches the subject "first\nand second" (where \n stands for a newline - character), with the match starting at the seventh character. In order - to do this, PCRE has to retry the match starting after every newline in - the subject. - - If you are using such a pattern with subject strings that do not con- - tain newlines, the best performance is obtained by setting PCRE_DOTALL, - or starting the pattern with ^.* or ^.*? to indicate explicit anchor- - ing. That saves PCRE from having to scan along the subject looking for - a newline to restart at. - - Beware of patterns that contain nested indefinite repeats. These can - take a long time to run when applied to a string that does not match. - Consider the pattern fragment - - ^(a+)* - - This can match "aaaa" in 16 different ways, and this number increases - very rapidly as the string gets longer. (The * repeat can match 0, 1, - 2, 3, or 4 times, and for each of those cases other than 0 or 4, the + - repeats can match different numbers of times.) When the remainder of - the pattern is such that the entire match is going to fail, PCRE has in - principle to try every possible variation, and this can take an - extremely long time, even for relatively short strings. - - An optimization catches some of the more simple cases such as - - (a+)*b - - where a literal character follows. Before embarking on the standard - matching procedure, PCRE checks that there is a "b" later in the sub- - ject string, and if there is not, it fails the match immediately. How- - ever, when there is no following literal this optimization cannot be - used. You can see the difference by comparing the behaviour of - - (a+)*\d - - with the pattern above. The former gives a failure almost instantly - when applied to a whole line of "a" characters, whereas the latter - takes an appreciable time with strings longer than about 20 characters. - - In many cases, the solution to this kind of performance issue is to use - an atomic group or a possessive quantifier. - - -AUTHOR - - Philip Hazel - University Computing Service - Cambridge CB2 3QH, England. - - -REVISION - - Last updated: 25 August 2012 - Copyright (c) 1997-2012 University of Cambridge. ------------------------------------------------------------------------------- - - -PCREPOSIX(3) Library Functions Manual PCREPOSIX(3) - - - -NAME - PCRE - Perl-compatible regular expressions. - -SYNOPSIS - - #include - - int regcomp(regex_t *preg, const char *pattern, - int cflags); - - int regexec(regex_t *preg, const char *string, - size_t nmatch, regmatch_t pmatch[], int eflags); - size_t regerror(int errcode, const regex_t *preg, - char *errbuf, size_t errbuf_size); - - void regfree(regex_t *preg); - - -DESCRIPTION - - This set of functions provides a POSIX-style API for the PCRE regular - expression 8-bit library. See the pcreapi documentation for a descrip- - tion of PCRE's native API, which contains much additional functional- - ity. There is no POSIX-style wrapper for PCRE's 16-bit and 32-bit - library. - - The functions described here are just wrapper functions that ultimately - call the PCRE native API. Their prototypes are defined in the - pcreposix.h header file, and on Unix systems the library itself is - called pcreposix.a, so can be accessed by adding -lpcreposix to the - command for linking an application that uses them. Because the POSIX - functions call the native ones, it is also necessary to add -lpcre. - - I have implemented only those POSIX option bits that can be reasonably - mapped to PCRE native options. In addition, the option REG_EXTENDED is - defined with the value zero. This has no effect, but since programs - that are written to the POSIX interface often use it, this makes it - easier to slot in PCRE as a replacement library. Other POSIX options - are not even defined. - - There are also some other options that are not defined by POSIX. These - have been added at the request of users who want to make use of certain - PCRE-specific features via the POSIX calling interface. - - When PCRE is called via these functions, it is only the API that is - POSIX-like in style. The syntax and semantics of the regular expres- - sions themselves are still those of Perl, subject to the setting of - various PCRE options, as described below. "POSIX-like in style" means - that the API approximates to the POSIX definition; it is not fully - POSIX-compatible, and in multi-byte encoding domains it is probably - even less compatible. - - The header for these functions is supplied as pcreposix.h to avoid any - potential clash with other POSIX libraries. It can, of course, be - renamed or aliased as regex.h, which is the "correct" name. It provides - two structure types, regex_t for compiled internal forms, and reg- - match_t for returning captured substrings. It also defines some con- - stants whose names start with "REG_"; these are used for setting - options and identifying error codes. - - -COMPILING A PATTERN - - The function regcomp() is called to compile a pattern into an internal - form. The pattern is a C string terminated by a binary zero, and is - passed in the argument pattern. The preg argument is a pointer to a - regex_t structure that is used as a base for storing information about - the compiled regular expression. - - The argument cflags is either zero, or contains one or more of the bits - defined by the following macros: - - REG_DOTALL - - The PCRE_DOTALL option is set when the regular expression is passed for - compilation to the native function. Note that REG_DOTALL is not part of - the POSIX standard. - - REG_ICASE - - The PCRE_CASELESS option is set when the regular expression is passed - for compilation to the native function. - - REG_NEWLINE - - The PCRE_MULTILINE option is set when the regular expression is passed - for compilation to the native function. Note that this does not mimic - the defined POSIX behaviour for REG_NEWLINE (see the following sec- - tion). - - REG_NOSUB - - The PCRE_NO_AUTO_CAPTURE option is set when the regular expression is - passed for compilation to the native function. In addition, when a pat- - tern that is compiled with this flag is passed to regexec() for match- - ing, the nmatch and pmatch arguments are ignored, and no captured - strings are returned. - - REG_UCP - - The PCRE_UCP option is set when the regular expression is passed for - compilation to the native function. This causes PCRE to use Unicode - properties when matchine \d, \w, etc., instead of just recognizing - ASCII values. Note that REG_UTF8 is not part of the POSIX standard. - - REG_UNGREEDY - - The PCRE_UNGREEDY option is set when the regular expression is passed - for compilation to the native function. Note that REG_UNGREEDY is not - part of the POSIX standard. - - REG_UTF8 - - The PCRE_UTF8 option is set when the regular expression is passed for - compilation to the native function. This causes the pattern itself and - all data strings used for matching it to be treated as UTF-8 strings. - Note that REG_UTF8 is not part of the POSIX standard. - - In the absence of these flags, no options are passed to the native - function. This means the the regex is compiled with PCRE default - semantics. In particular, the way it handles newline characters in the - subject string is the Perl way, not the POSIX way. Note that setting - PCRE_MULTILINE has only some of the effects specified for REG_NEWLINE. - It does not affect the way newlines are matched by . (they are not) or - by a negative class such as [^a] (they are). - - The yield of regcomp() is zero on success, and non-zero otherwise. The - preg structure is filled in on success, and one member of the structure - is public: re_nsub contains the number of capturing subpatterns in the - regular expression. Various error codes are defined in the header file. - - NOTE: If the yield of regcomp() is non-zero, you must not attempt to - use the contents of the preg structure. If, for example, you pass it to - regexec(), the result is undefined and your program is likely to crash. - - -MATCHING NEWLINE CHARACTERS - - This area is not simple, because POSIX and Perl take different views of - things. It is not possible to get PCRE to obey POSIX semantics, but - then PCRE was never intended to be a POSIX engine. The following table - lists the different possibilities for matching newline characters in - PCRE: - - Default Change with - - . matches newline no PCRE_DOTALL - newline matches [^a] yes not changeable - $ matches \n at end yes PCRE_DOLLARENDONLY - $ matches \n in middle no PCRE_MULTILINE - ^ matches \n in middle no PCRE_MULTILINE - - This is the equivalent table for POSIX: - - Default Change with - - . matches newline yes REG_NEWLINE - newline matches [^a] yes REG_NEWLINE - $ matches \n at end no REG_NEWLINE - $ matches \n in middle no REG_NEWLINE - ^ matches \n in middle no REG_NEWLINE - - PCRE's behaviour is the same as Perl's, except that there is no equiva- - lent for PCRE_DOLLAR_ENDONLY in Perl. In both PCRE and Perl, there is - no way to stop newline from matching [^a]. - - The default POSIX newline handling can be obtained by setting - PCRE_DOTALL and PCRE_DOLLAR_ENDONLY, but there is no way to make PCRE - behave exactly as for the REG_NEWLINE action. - - -MATCHING A PATTERN - - The function regexec() is called to match a compiled pattern preg - against a given string, which is by default terminated by a zero byte - (but see REG_STARTEND below), subject to the options in eflags. These - can be: - - REG_NOTBOL - - The PCRE_NOTBOL option is set when calling the underlying PCRE matching - function. - - REG_NOTEMPTY - - The PCRE_NOTEMPTY option is set when calling the underlying PCRE match- - ing function. Note that REG_NOTEMPTY is not part of the POSIX standard. - However, setting this option can give more POSIX-like behaviour in some - situations. - - REG_NOTEOL - - The PCRE_NOTEOL option is set when calling the underlying PCRE matching - function. - - REG_STARTEND - - The string is considered to start at string + pmatch[0].rm_so and to - have a terminating NUL located at string + pmatch[0].rm_eo (there need - not actually be a NUL at that location), regardless of the value of - nmatch. This is a BSD extension, compatible with but not specified by - IEEE Standard 1003.2 (POSIX.2), and should be used with caution in - software intended to be portable to other systems. Note that a non-zero - rm_so does not imply REG_NOTBOL; REG_STARTEND affects only the location - of the string, not how it is matched. - - If the pattern was compiled with the REG_NOSUB flag, no data about any - matched strings is returned. The nmatch and pmatch arguments of - regexec() are ignored. - - If the value of nmatch is zero, or if the value pmatch is NULL, no data - about any matched strings is returned. - - Otherwise,the portion of the string that was matched, and also any cap- - tured substrings, are returned via the pmatch argument, which points to - an array of nmatch structures of type regmatch_t, containing the mem- - bers rm_so and rm_eo. These contain the offset to the first character - of each substring and the offset to the first character after the end - of each substring, respectively. The 0th element of the vector relates - to the entire portion of string that was matched; subsequent elements - relate to the capturing subpatterns of the regular expression. Unused - entries in the array have both structure members set to -1. - - A successful match yields a zero return; various error codes are - defined in the header file, of which REG_NOMATCH is the "expected" - failure code. - - -ERROR MESSAGES - - The regerror() function maps a non-zero errorcode from either regcomp() - or regexec() to a printable message. If preg is not NULL, the error - should have arisen from the use of that structure. A message terminated - by a binary zero is placed in errbuf. The length of the message, - including the zero, is limited to errbuf_size. The yield of the func- - tion is the size of buffer needed to hold the whole message. - - -MEMORY USAGE - - Compiling a regular expression causes memory to be allocated and asso- - ciated with the preg structure. The function regfree() frees all such - memory, after which preg may no longer be used as a compiled expres- - sion. - - -AUTHOR - - Philip Hazel - University Computing Service - Cambridge CB2 3QH, England. - - -REVISION - - Last updated: 09 January 2012 - Copyright (c) 1997-2012 University of Cambridge. ------------------------------------------------------------------------------- - - -PCRECPP(3) Library Functions Manual PCRECPP(3) - - - -NAME - PCRE - Perl-compatible regular expressions. - -SYNOPSIS OF C++ WRAPPER - - #include - - -DESCRIPTION - - The C++ wrapper for PCRE was provided by Google Inc. Some additional - functionality was added by Giuseppe Maxia. This brief man page was con- - structed from the notes in the pcrecpp.h file, which should be con- - sulted for further details. Note that the C++ wrapper supports only the - original 8-bit PCRE library. There is no 16-bit or 32-bit support at - present. - - -MATCHING INTERFACE - - The "FullMatch" operation checks that supplied text matches a supplied - pattern exactly. If pointer arguments are supplied, it copies matched - sub-strings that match sub-patterns into them. - - Example: successful match - pcrecpp::RE re("h.*o"); - re.FullMatch("hello"); - - Example: unsuccessful match (requires full match): - pcrecpp::RE re("e"); - !re.FullMatch("hello"); - - Example: creating a temporary RE object: - pcrecpp::RE("h.*o").FullMatch("hello"); - - You can pass in a "const char*" or a "string" for "text". The examples - below tend to use a const char*. You can, as in the different examples - above, store the RE object explicitly in a variable or use a temporary - RE object. The examples below use one mode or the other arbitrarily. - Either could correctly be used for any of these examples. - - You must supply extra pointer arguments to extract matched subpieces. - - Example: extracts "ruby" into "s" and 1234 into "i" - int i; - string s; - pcrecpp::RE re("(\\w+):(\\d+)"); - re.FullMatch("ruby:1234", &s, &i); - - Example: does not try to extract any extra sub-patterns - re.FullMatch("ruby:1234", &s); - - Example: does not try to extract into NULL - re.FullMatch("ruby:1234", NULL, &i); - - Example: integer overflow causes failure - !re.FullMatch("ruby:1234567891234", NULL, &i); - - Example: fails because there aren't enough sub-patterns: - !pcrecpp::RE("\\w+:\\d+").FullMatch("ruby:1234", &s); - - Example: fails because string cannot be stored in integer - !pcrecpp::RE("(.*)").FullMatch("ruby", &i); - - The provided pointer arguments can be pointers to any scalar numeric - type, or one of: - - string (matched piece is copied to string) - StringPiece (StringPiece is mutated to point to matched piece) - T (where "bool T::ParseFrom(const char*, int)" exists) - NULL (the corresponding matched sub-pattern is not copied) - - The function returns true iff all of the following conditions are sat- - isfied: - - a. "text" matches "pattern" exactly; - - b. The number of matched sub-patterns is >= number of supplied - pointers; - - c. The "i"th argument has a suitable type for holding the - string captured as the "i"th sub-pattern. If you pass in - void * NULL for the "i"th argument, or a non-void * NULL - of the correct type, or pass fewer arguments than the - number of sub-patterns, "i"th captured sub-pattern is - ignored. - - CAVEAT: An optional sub-pattern that does not exist in the matched - string is assigned the empty string. Therefore, the following will - return false (because the empty string is not a valid number): - - int number; - pcrecpp::RE::FullMatch("abc", "[a-z]+(\\d+)?", &number); - - The matching interface supports at most 16 arguments per call. If you - need more, consider using the more general interface - pcrecpp::RE::DoMatch. See pcrecpp.h for the signature for DoMatch. - - NOTE: Do not use no_arg, which is used internally to mark the end of a - list of optional arguments, as a placeholder for missing arguments, as - this can lead to segfaults. - - -QUOTING METACHARACTERS - - You can use the "QuoteMeta" operation to insert backslashes before all - potentially meaningful characters in a string. The returned string, - used as a regular expression, will exactly match the original string. - - Example: - string quoted = RE::QuoteMeta(unquoted); - - Note that it's legal to escape a character even if it has no special - meaning in a regular expression -- so this function does that. (This - also makes it identical to the perl function of the same name; see - "perldoc -f quotemeta".) For example, "1.5-2.0?" becomes - "1\.5\-2\.0\?". - - -PARTIAL MATCHES - - You can use the "PartialMatch" operation when you want the pattern to - match any substring of the text. - - Example: simple search for a string: - pcrecpp::RE("ell").PartialMatch("hello"); - - Example: find first number in a string: - int number; - pcrecpp::RE re("(\\d+)"); - re.PartialMatch("x*100 + 20", &number); - assert(number == 100); - - -UTF-8 AND THE MATCHING INTERFACE - - By default, pattern and text are plain text, one byte per character. - The UTF8 flag, passed to the constructor, causes both pattern and - string to be treated as UTF-8 text, still a byte stream but potentially - multiple bytes per character. In practice, the text is likelier to be - UTF-8 than the pattern, but the match returned may depend on the UTF8 - flag, so always use it when matching UTF8 text. For example, "." will - match one byte normally but with UTF8 set may match up to three bytes - of a multi-byte character. - - Example: - pcrecpp::RE_Options options; - options.set_utf8(); - pcrecpp::RE re(utf8_pattern, options); - re.FullMatch(utf8_string); - - Example: using the convenience function UTF8(): - pcrecpp::RE re(utf8_pattern, pcrecpp::UTF8()); - re.FullMatch(utf8_string); - - NOTE: The UTF8 flag is ignored if pcre was not configured with the - --enable-utf8 flag. - - -PASSING MODIFIERS TO THE REGULAR EXPRESSION ENGINE - - PCRE defines some modifiers to change the behavior of the regular - expression engine. The C++ wrapper defines an auxiliary class, - RE_Options, as a vehicle to pass such modifiers to a RE class. Cur- - rently, the following modifiers are supported: - - modifier description Perl corresponding - - PCRE_CASELESS case insensitive match /i - PCRE_MULTILINE multiple lines match /m - PCRE_DOTALL dot matches newlines /s - PCRE_DOLLAR_ENDONLY $ matches only at end N/A - PCRE_EXTRA strict escape parsing N/A - PCRE_EXTENDED ignore white spaces /x - PCRE_UTF8 handles UTF8 chars built-in - PCRE_UNGREEDY reverses * and *? N/A - PCRE_NO_AUTO_CAPTURE disables capturing parens N/A (*) - - (*) Both Perl and PCRE allow non capturing parentheses by means of the - "?:" modifier within the pattern itself. e.g. (?:ab|cd) does not cap- - ture, while (ab|cd) does. - - For a full account on how each modifier works, please check the PCRE - API reference page. - - For each modifier, there are two member functions whose name is made - out of the modifier in lowercase, without the "PCRE_" prefix. For - instance, PCRE_CASELESS is handled by - - bool caseless() - - which returns true if the modifier is set, and - - RE_Options & set_caseless(bool) - - which sets or unsets the modifier. Moreover, PCRE_EXTRA_MATCH_LIMIT can - be accessed through the set_match_limit() and match_limit() member - functions. Setting match_limit to a non-zero value will limit the exe- - cution of pcre to keep it from doing bad things like blowing the stack - or taking an eternity to return a result. A value of 5000 is good - enough to stop stack blowup in a 2MB thread stack. Setting match_limit - to zero disables match limiting. Alternatively, you can call - match_limit_recursion() which uses PCRE_EXTRA_MATCH_LIMIT_RECURSION to - limit how much PCRE recurses. match_limit() limits the number of - matches PCRE does; match_limit_recursion() limits the depth of internal - recursion, and therefore the amount of stack that is used. - - Normally, to pass one or more modifiers to a RE class, you declare a - RE_Options object, set the appropriate options, and pass this object to - a RE constructor. Example: - - RE_Options opt; - opt.set_caseless(true); - if (RE("HELLO", opt).PartialMatch("hello world")) ... - - RE_options has two constructors. The default constructor takes no argu- - ments and creates a set of flags that are off by default. The optional - parameter option_flags is to facilitate transfer of legacy code from C - programs. This lets you do - - RE(pattern, - RE_Options(PCRE_CASELESS|PCRE_MULTILINE)).PartialMatch(str); - - However, new code is better off doing - - RE(pattern, - RE_Options().set_caseless(true).set_multiline(true)) - .PartialMatch(str); - - If you are going to pass one of the most used modifiers, there are some - convenience functions that return a RE_Options class with the appropri- - ate modifier already set: CASELESS(), UTF8(), MULTILINE(), DOTALL(), - and EXTENDED(). - - If you need to set several options at once, and you don't want to go - through the pains of declaring a RE_Options object and setting several - options, there is a parallel method that give you such ability on the - fly. You can concatenate several set_xxxxx() member functions, since - each of them returns a reference to its class object. For example, to - pass PCRE_CASELESS, PCRE_EXTENDED, and PCRE_MULTILINE to a RE with one - statement, you may write: - - RE(" ^ xyz \\s+ .* blah$", - RE_Options() - .set_caseless(true) - .set_extended(true) - .set_multiline(true)).PartialMatch(sometext); - - -SCANNING TEXT INCREMENTALLY - - The "Consume" operation may be useful if you want to repeatedly match - regular expressions at the front of a string and skip over them as they - match. This requires use of the "StringPiece" type, which represents a - sub-range of a real string. Like RE, StringPiece is defined in the - pcrecpp namespace. - - Example: read lines of the form "var = value" from a string. - string contents = ...; // Fill string somehow - pcrecpp::StringPiece input(contents); // Wrap in a StringPiece - - string var; - int value; - pcrecpp::RE re("(\\w+) = (\\d+)\n"); - while (re.Consume(&input, &var, &value)) { - ...; - } - - Each successful call to "Consume" will set "var/value", and also - advance "input" so it points past the matched text. - - The "FindAndConsume" operation is similar to "Consume" but does not - anchor your match at the beginning of the string. For example, you - could extract all words from a string by repeatedly calling - - pcrecpp::RE("(\\w+)").FindAndConsume(&input, &word) - - -PARSING HEX/OCTAL/C-RADIX NUMBERS - - By default, if you pass a pointer to a numeric value, the corresponding - text is interpreted as a base-10 number. You can instead wrap the - pointer with a call to one of the operators Hex(), Octal(), or CRadix() - to interpret the text in another base. The CRadix operator interprets - C-style "0" (base-8) and "0x" (base-16) prefixes, but defaults to - base-10. - - Example: - int a, b, c, d; - pcrecpp::RE re("(.*) (.*) (.*) (.*)"); - re.FullMatch("100 40 0100 0x40", - pcrecpp::Octal(&a), pcrecpp::Hex(&b), - pcrecpp::CRadix(&c), pcrecpp::CRadix(&d)); - - will leave 64 in a, b, c, and d. - - -REPLACING PARTS OF STRINGS - - You can replace the first match of "pattern" in "str" with "rewrite". - Within "rewrite", backslash-escaped digits (\1 to \9) can be used to - insert text matching corresponding parenthesized group from the pat- - tern. \0 in "rewrite" refers to the entire matching text. For example: - - string s = "yabba dabba doo"; - pcrecpp::RE("b+").Replace("d", &s); - - will leave "s" containing "yada dabba doo". The result is true if the - pattern matches and a replacement occurs, false otherwise. - - GlobalReplace is like Replace except that it replaces all occurrences - of the pattern in the string with the rewrite. Replacements are not - subject to re-matching. For example: - - string s = "yabba dabba doo"; - pcrecpp::RE("b+").GlobalReplace("d", &s); - - will leave "s" containing "yada dada doo". It returns the number of - replacements made. - - Extract is like Replace, except that if the pattern matches, "rewrite" - is copied into "out" (an additional argument) with substitutions. The - non-matching portions of "text" are ignored. Returns true iff a match - occurred and the extraction happened successfully; if no match occurs, - the string is left unaffected. - - -AUTHOR - - The C++ wrapper was contributed by Google Inc. - Copyright (c) 2007 Google Inc. - - -REVISION - - Last updated: 08 January 2012 ------------------------------------------------------------------------------- - - -PCRESAMPLE(3) Library Functions Manual PCRESAMPLE(3) - - - -NAME - PCRE - Perl-compatible regular expressions - -PCRE SAMPLE PROGRAM - - A simple, complete demonstration program, to get you started with using - PCRE, is supplied in the file pcredemo.c in the PCRE distribution. A - listing of this program is given in the pcredemo documentation. If you - do not have a copy of the PCRE distribution, you can save this listing - to re-create pcredemo.c. - - The demonstration program, which uses the original PCRE 8-bit library, - compiles the regular expression that is its first argument, and matches - it against the subject string in its second argument. No PCRE options - are set, and default character tables are used. If matching succeeds, - the program outputs the portion of the subject that matched, together - with the contents of any captured substrings. - - If the -g option is given on the command line, the program then goes on - to check for further matches of the same regular expression in the same - subject string. The logic is a little bit tricky because of the possi- - bility of matching an empty string. Comments in the code explain what - is going on. - - If PCRE is installed in the standard include and library directories - for your operating system, you should be able to compile the demonstra- - tion program using this command: - - gcc -o pcredemo pcredemo.c -lpcre - - If PCRE is installed elsewhere, you may need to add additional options - to the command line. For example, on a Unix-like system that has PCRE - installed in /usr/local, you can compile the demonstration program - using a command like this: - - gcc -o pcredemo -I/usr/local/include pcredemo.c \ - -L/usr/local/lib -lpcre - - In a Windows environment, if you want to statically link the program - against a non-dll pcre.a file, you must uncomment the line that defines - PCRE_STATIC before including pcre.h, because otherwise the pcre_mal- - loc() and pcre_free() exported functions will be declared - __declspec(dllimport), with unwanted results. - - Once you have compiled and linked the demonstration program, you can - run simple tests like this: - - ./pcredemo 'cat|dog' 'the cat sat on the mat' - ./pcredemo -g 'cat|dog' 'the dog sat on the cat' - - Note that there is a much more comprehensive test program, called - pcretest, which supports many more facilities for testing regular - expressions and both PCRE libraries. The pcredemo program is provided - as a simple coding example. - - If you try to run pcredemo when PCRE is not installed in the standard - library directory, you may get an error like this on some operating - systems (e.g. Solaris): - - ld.so.1: a.out: fatal: libpcre.so.0: open failed: No such file or - directory - - This is caused by the way shared library support works on those sys- - tems. You need to add - - -R/usr/local/lib - - (for example) to the compile command to get round this problem. - - -AUTHOR - - Philip Hazel - University Computing Service - Cambridge CB2 3QH, England. - - -REVISION - - Last updated: 10 January 2012 - Copyright (c) 1997-2012 University of Cambridge. ------------------------------------------------------------------------------- -PCRELIMITS(3) Library Functions Manual PCRELIMITS(3) - - - -NAME - PCRE - Perl-compatible regular expressions - -SIZE AND OTHER LIMITATIONS - - There are some size limitations in PCRE but it is hoped that they will - never in practice be relevant. - - The maximum length of a compiled pattern is approximately 64K data - units (bytes for the 8-bit library, 16-bit units for the 16-bit - library, and 32-bit units for the 32-bit library) if PCRE is compiled - with the default internal linkage size, which is 2 bytes for the 8-bit - and 16-bit libraries, and 4 bytes for the 32-bit library. If you want - to process regular expressions that are truly enormous, you can compile - PCRE with an internal linkage size of 3 or 4 (when building the 16-bit - or 32-bit library, 3 is rounded up to 4). See the README file in the - source distribution and the pcrebuild documentation for details. In - these cases the limit is substantially larger. However, the speed of - execution is slower. - - All values in repeating quantifiers must be less than 65536. - - There is no limit to the number of parenthesized subpatterns, but there - can be no more than 65535 capturing subpatterns. There is, however, a - limit to the depth of nesting of parenthesized subpatterns of all - kinds. This is imposed in order to limit the amount of system stack - used at compile time. The limit can be specified when PCRE is built; - the default is 250. - - There is a limit to the number of forward references to subsequent sub- - patterns of around 200,000. Repeated forward references with fixed - upper limits, for example, (?2){0,100} when subpattern number 2 is to - the right, are included in the count. There is no limit to the number - of backward references. - - The maximum length of name for a named subpattern is 32 characters, and - the maximum number of named subpatterns is 10000. - - The maximum length of a name in a (*MARK), (*PRUNE), (*SKIP), or - (*THEN) verb is 255 for the 8-bit library and 65535 for the 16-bit and - 32-bit libraries. - - The maximum length of a subject string is the largest positive number - that an integer variable can hold. However, when using the traditional - matching function, PCRE uses recursion to handle subpatterns and indef- - inite repetition. This means that the available stack space may limit - the size of a subject string that can be processed by certain patterns. - For a discussion of stack issues, see the pcrestack documentation. - - -AUTHOR - - Philip Hazel - University Computing Service - Cambridge CB2 3QH, England. - - -REVISION - - Last updated: 05 November 2013 - Copyright (c) 1997-2013 University of Cambridge. ------------------------------------------------------------------------------- - - -PCRESTACK(3) Library Functions Manual PCRESTACK(3) - - - -NAME - PCRE - Perl-compatible regular expressions - -PCRE DISCUSSION OF STACK USAGE - - When you call pcre[16|32]_exec(), it makes use of an internal function - called match(). This calls itself recursively at branch points in the - pattern, in order to remember the state of the match so that it can - back up and try a different alternative if the first one fails. As - matching proceeds deeper and deeper into the tree of possibilities, the - recursion depth increases. The match() function is also called in other - circumstances, for example, whenever a parenthesized sub-pattern is - entered, and in certain cases of repetition. - - Not all calls of match() increase the recursion depth; for an item such - as a* it may be called several times at the same level, after matching - different numbers of a's. Furthermore, in a number of cases where the - result of the recursive call would immediately be passed back as the - result of the current call (a "tail recursion"), the function is just - restarted instead. - - The above comments apply when pcre[16|32]_exec() is run in its normal - interpretive manner. If the pattern was studied with the - PCRE_STUDY_JIT_COMPILE option, and just-in-time compiling was success- - ful, and the options passed to pcre[16|32]_exec() were not incompati- - ble, the matching process uses the JIT-compiled code instead of the - match() function. In this case, the memory requirements are handled - entirely differently. See the pcrejit documentation for details. - - The pcre[16|32]_dfa_exec() function operates in an entirely different - way, and uses recursion only when there is a regular expression recur- - sion or subroutine call in the pattern. This includes the processing of - assertion and "once-only" subpatterns, which are handled like subrou- - tine calls. Normally, these are never very deep, and the limit on the - complexity of pcre[16|32]_dfa_exec() is controlled by the amount of - workspace it is given. However, it is possible to write patterns with - runaway infinite recursions; such patterns will cause - pcre[16|32]_dfa_exec() to run out of stack. At present, there is no - protection against this. - - The comments that follow do NOT apply to pcre[16|32]_dfa_exec(); they - are relevant only for pcre[16|32]_exec() without the JIT optimization. - - Reducing pcre[16|32]_exec()'s stack usage - - Each time that match() is actually called recursively, it uses memory - from the process stack. For certain kinds of pattern and data, very - large amounts of stack may be needed, despite the recognition of "tail - recursion". You can often reduce the amount of recursion, and there- - fore the amount of stack used, by modifying the pattern that is being - matched. Consider, for example, this pattern: - - ([^<]|<(?!inet))+ - - It matches from wherever it starts until it encounters ". When there is more than one - pattern (specified by the use of -e and/or -f), each pattern is applied - to each line in the order in which they are defined, except that all - the -e patterns are tried before the -f patterns. - - By default, as soon as one pattern matches a line, no further patterns - are considered. However, if --colour (or --color) is used to colour the - matching substrings, or if --only-matching, --file-offsets, or --line- - offsets is used to output only the part of the line that matched - (either shown literally, or as an offset), scanning resumes immediately - following the match, so that further matches on the same line can be - found. If there are multiple patterns, they are all tried on the - remainder of the line, but patterns that follow the one that matched - are not tried on the earlier part of the line. - - This behaviour means that the order in which multiple patterns are - specified can affect the output when one of the above options is used. - This is no longer the same behaviour as GNU grep, which now manages to - display earlier matches for later patterns (as long as there is no - overlap). - - Patterns that can match an empty string are accepted, but empty string - matches are never recognized. An example is the pattern - "(super)?(man)?", in which all components are optional. This pattern - finds all occurrences of both "super" and "man"; the output differs - from matching with "super|man" when only the matching substrings are - being shown. - - If the LC_ALL or LC_CTYPE environment variable is set, pcregrep uses - the value to set a locale when calling the PCRE library. The --locale - option can be used to override this. - - -SUPPORT FOR COMPRESSED FILES - - It is possible to compile pcregrep so that it uses libz or libbz2 to - read files whose names end in .gz or .bz2, respectively. You can find - out whether your binary has support for one or both of these file types - by running it with the --help option. If the appropriate support is not - present, files are treated as plain text. The standard input is always - so treated. - - -BINARY FILES - - By default, a file that contains a binary zero byte within the first - 1024 bytes is identified as a binary file, and is processed specially. - (GNU grep also identifies binary files in this manner.) See the - --binary-files option for a means of changing the way binary files are - handled. - - -OPTIONS - - The order in which some of the options appear can affect the output. - For example, both the -h and -l options affect the printing of file - names. Whichever comes later in the command line will be the one that - takes effect. Similarly, except where noted below, if an option is - given twice, the later setting is used. Numerical values for options - may be followed by K or M, to signify multiplication by 1024 or - 1024*1024 respectively. - - -- This terminates the list of options. It is useful if the next - item on the command line starts with a hyphen but is not an - option. This allows for the processing of patterns and file- - names that start with hyphens. - - -A number, --after-context=number - Output number lines of context after each matching line. If - filenames and/or line numbers are being output, a hyphen sep- - arator is used instead of a colon for the context lines. A - line containing "--" is output between each group of lines, - unless they are in fact contiguous in the input file. The - value of number is expected to be relatively small. However, - pcregrep guarantees to have up to 8K of following text avail- - able for context output. - - -a, --text - Treat binary files as text. This is equivalent to --binary- - files=text. - - -B number, --before-context=number - Output number lines of context before each matching line. If - filenames and/or line numbers are being output, a hyphen sep- - arator is used instead of a colon for the context lines. A - line containing "--" is output between each group of lines, - unless they are in fact contiguous in the input file. The - value of number is expected to be relatively small. However, - pcregrep guarantees to have up to 8K of preceding text avail- - able for context output. - - --binary-files=word - Specify how binary files are to be processed. If the word is - "binary" (the default), pattern matching is performed on - binary files, but the only output is "Binary file - matches" when a match succeeds. If the word is "text", which - is equivalent to the -a or --text option, binary files are - processed in the same way as any other file. In this case, - when a match succeeds, the output may be binary garbage, - which can have nasty effects if sent to a terminal. If the - word is "without-match", which is equivalent to the -I - option, binary files are not processed at all; they are - assumed not to be of interest. - - --buffer-size=number - Set the parameter that controls how much memory is used for - buffering files that are being scanned. - - -C number, --context=number - Output number lines of context both before and after each - matching line. This is equivalent to setting both -A and -B - to the same value. - - -c, --count - Do not output individual lines from the files that are being - scanned; instead output the number of lines that would other- - wise have been shown. If no lines are selected, the number - zero is output. If several files are are being scanned, a - count is output for each of them. However, if the --files- - with-matches option is also used, only those files whose - counts are greater than zero are listed. When -c is used, the - -A, -B, and -C options are ignored. - - --colour, --color - If this option is given without any data, it is equivalent to - "--colour=auto". If data is required, it must be given in - the same shell item, separated by an equals sign. - - --colour=value, --color=value - This option specifies under what circumstances the parts of a - line that matched a pattern should be coloured in the output. - By default, the output is not coloured. The value (which is - optional, see above) may be "never", "always", or "auto". In - the latter case, colouring happens only if the standard out- - put is connected to a terminal. More resources are used when - colouring is enabled, because pcregrep has to search for all - possible matches in a line, not just one, in order to colour - them all. - - The colour that is used can be specified by setting the envi- - ronment variable PCREGREP_COLOUR or PCREGREP_COLOR. The value - of this variable should be a string of two numbers, separated - by a semicolon. They are copied directly into the control - string for setting colour on a terminal, so it is your - responsibility to ensure that they make sense. If neither of - the environment variables is set, the default is "1;31", - which gives red. - - -D action, --devices=action - If an input path is not a regular file or a directory, - "action" specifies how it is to be processed. Valid values - are "read" (the default) or "skip" (silently skip the path). - - -d action, --directories=action - If an input path is a directory, "action" specifies how it is - to be processed. Valid values are "read" (the default in - non-Windows environments, for compatibility with GNU grep), - "recurse" (equivalent to the -r option), or "skip" (silently - skip the path, the default in Windows environments). In the - "read" case, directories are read as if they were ordinary - files. In some operating systems the effect of reading a - directory like this is an immediate end-of-file; in others it - may provoke an error. - - -e pattern, --regex=pattern, --regexp=pattern - Specify a pattern to be matched. This option can be used mul- - tiple times in order to specify several patterns. It can also - be used as a way of specifying a single pattern that starts - with a hyphen. When -e is used, no argument pattern is taken - from the command line; all arguments are treated as file - names. There is no limit to the number of patterns. They are - applied to each line in the order in which they are defined - until one matches. - - If -f is used with -e, the command line patterns are matched - first, followed by the patterns from the file(s), independent - of the order in which these options are specified. Note that - multiple use of -e is not the same as a single pattern with - alternatives. For example, X|Y finds the first character in a - line that is X or Y, whereas if the two patterns are given - separately, with X first, pcregrep finds X if it is present, - even if it follows Y in the line. It finds Y only if there is - no X in the line. This matters only if you are using -o or - --colo(u)r to show the part(s) of the line that matched. - - --exclude=pattern - Files (but not directories) whose names match the pattern are - skipped without being processed. This applies to all files, - whether listed on the command line, obtained from --file- - list, or by scanning a directory. The pattern is a PCRE regu- - lar expression, and is matched against the final component of - the file name, not the entire path. The -F, -w, and -x - options do not apply to this pattern. The option may be given - any number of times in order to specify multiple patterns. If - a file name matches both an --include and an --exclude pat- - tern, it is excluded. There is no short form for this option. - - --exclude-from=filename - Treat each non-empty line of the file as the data for an - --exclude option. What constitutes a newline when reading the - file is the operating system's default. The --newline option - has no effect on this option. This option may be given more - than once in order to specify a number of files to read. - - --exclude-dir=pattern - Directories whose names match the pattern are skipped without - being processed, whatever the setting of the --recursive - option. This applies to all directories, whether listed on - the command line, obtained from --file-list, or by scanning a - parent directory. The pattern is a PCRE regular expression, - and is matched against the final component of the directory - name, not the entire path. The -F, -w, and -x options do not - apply to this pattern. The option may be given any number of - times in order to specify more than one pattern. If a direc- - tory matches both --include-dir and --exclude-dir, it is - excluded. There is no short form for this option. - - -F, --fixed-strings - Interpret each data-matching pattern as a list of fixed - strings, separated by newlines, instead of as a regular - expression. What constitutes a newline for this purpose is - controlled by the --newline option. The -w (match as a word) - and -x (match whole line) options can be used with -F. They - apply to each of the fixed strings. A line is selected if any - of the fixed strings are found in it (subject to -w or -x, if - present). This option applies only to the patterns that are - matched against the contents of files; it does not apply to - patterns specified by any of the --include or --exclude - options. - - -f filename, --file=filename - Read patterns from the file, one per line, and match them - against each line of input. What constitutes a newline when - reading the file is the operating system's default. The - --newline option has no effect on this option. Trailing white - space is removed from each line, and blank lines are ignored. - An empty file contains no patterns and therefore matches - nothing. See also the comments about multiple patterns versus - a single pattern with alternatives in the description of -e - above. - - If this option is given more than once, all the specified - files are read. A data line is output if any of the patterns - match it. A filename can be given as "-" to refer to the - standard input. When -f is used, patterns specified on the - command line using -e may also be present; they are tested - before the file's patterns. However, no other pattern is - taken from the command line; all arguments are treated as the - names of paths to be searched. - - --file-list=filename - Read a list of files and/or directories that are to be - scanned from the given file, one per line. Trailing white - space is removed from each line, and blank lines are ignored. - These paths are processed before any that are listed on the - command line. The filename can be given as "-" to refer to - the standard input. If --file and --file-list are both spec- - ified as "-", patterns are read first. This is useful only - when the standard input is a terminal, from which further - lines (the list of files) can be read after an end-of-file - indication. If this option is given more than once, all the - specified files are read. - - --file-offsets - Instead of showing lines or parts of lines that match, show - each match as an offset from the start of the file and a - length, separated by a comma. In this mode, no context is - shown. That is, the -A, -B, and -C options are ignored. If - there is more than one match in a line, each of them is shown - separately. This option is mutually exclusive with --line- - offsets and --only-matching. - - -H, --with-filename - Force the inclusion of the filename at the start of output - lines when searching a single file. By default, the filename - is not shown in this case. For matching lines, the filename - is followed by a colon; for context lines, a hyphen separator - is used. If a line number is also being output, it follows - the file name. - - -h, --no-filename - Suppress the output filenames when searching multiple files. - By default, filenames are shown when multiple files are - searched. For matching lines, the filename is followed by a - colon; for context lines, a hyphen separator is used. If a - line number is also being output, it follows the file name. - - --help Output a help message, giving brief details of the command - options and file type support, and then exit. Anything else - on the command line is ignored. - - -I Treat binary files as never matching. This is equivalent to - --binary-files=without-match. - - -i, --ignore-case - Ignore upper/lower case distinctions during comparisons. - - --include=pattern - If any --include patterns are specified, the only files that - are processed are those that match one of the patterns (and - do not match an --exclude pattern). This option does not - affect directories, but it applies to all files, whether - listed on the command line, obtained from --file-list, or by - scanning a directory. The pattern is a PCRE regular expres- - sion, and is matched against the final component of the file - name, not the entire path. The -F, -w, and -x options do not - apply to this pattern. The option may be given any number of - times. If a file name matches both an --include and an - --exclude pattern, it is excluded. There is no short form - for this option. - - --include-from=filename - Treat each non-empty line of the file as the data for an - --include option. What constitutes a newline for this purpose - is the operating system's default. The --newline option has - no effect on this option. This option may be given any number - of times; all the files are read. - - --include-dir=pattern - If any --include-dir patterns are specified, the only direc- - tories that are processed are those that match one of the - patterns (and do not match an --exclude-dir pattern). This - applies to all directories, whether listed on the command - line, obtained from --file-list, or by scanning a parent - directory. The pattern is a PCRE regular expression, and is - matched against the final component of the directory name, - not the entire path. The -F, -w, and -x options do not apply - to this pattern. The option may be given any number of times. - If a directory matches both --include-dir and --exclude-dir, - it is excluded. There is no short form for this option. - - -L, --files-without-match - Instead of outputting lines from the files, just output the - names of the files that do not contain any lines that would - have been output. Each file name is output once, on a sepa- - rate line. - - -l, --files-with-matches - Instead of outputting lines from the files, just output the - names of the files containing lines that would have been out- - put. Each file name is output once, on a separate line. - Searching normally stops as soon as a matching line is found - in a file. However, if the -c (count) option is also used, - matching continues in order to obtain the correct count, and - those files that have at least one match are listed along - with their counts. Using this option with -c is a way of sup- - pressing the listing of files with no matches. - - --label=name - This option supplies a name to be used for the standard input - when file names are being output. If not supplied, "(standard - input)" is used. There is no short form for this option. - - --line-buffered - When this option is given, input is read and processed line - by line, and the output is flushed after each write. By - default, input is read in large chunks, unless pcregrep can - determine that it is reading from a terminal (which is cur- - rently possible only in Unix-like environments). Output to - terminal is normally automatically flushed by the operating - system. This option can be useful when the input or output is - attached to a pipe and you do not want pcregrep to buffer up - large amounts of data. However, its use will affect perfor- - mance, and the -M (multiline) option ceases to work. - - --line-offsets - Instead of showing lines or parts of lines that match, show - each match as a line number, the offset from the start of the - line, and a length. The line number is terminated by a colon - (as usual; see the -n option), and the offset and length are - separated by a comma. In this mode, no context is shown. - That is, the -A, -B, and -C options are ignored. If there is - more than one match in a line, each of them is shown sepa- - rately. This option is mutually exclusive with --file-offsets - and --only-matching. - - --locale=locale-name - This option specifies a locale to be used for pattern match- - ing. It overrides the value in the LC_ALL or LC_CTYPE envi- - ronment variables. If no locale is specified, the PCRE - library's default (usually the "C" locale) is used. There is - no short form for this option. - - --match-limit=number - Processing some regular expression patterns can require a - very large amount of memory, leading in some cases to a pro- - gram crash if not enough is available. Other patterns may - take a very long time to search for all possible matching - strings. The pcre_exec() function that is called by pcregrep - to do the matching has two parameters that can limit the - resources that it uses. - - The --match-limit option provides a means of limiting - resource usage when processing patterns that are not going to - match, but which have a very large number of possibilities in - their search trees. The classic example is a pattern that - uses nested unlimited repeats. Internally, PCRE uses a func- - tion called match() which it calls repeatedly (sometimes - recursively). The limit set by --match-limit is imposed on - the number of times this function is called during a match, - which has the effect of limiting the amount of backtracking - that can take place. - - The --recursion-limit option is similar to --match-limit, but - instead of limiting the total number of times that match() is - called, it limits the depth of recursive calls, which in turn - limits the amount of memory that can be used. The recursion - depth is a smaller number than the total number of calls, - because not all calls to match() are recursive. This limit is - of use only if it is set smaller than --match-limit. - - There are no short forms for these options. The default set- - tings are specified when the PCRE library is compiled, with - the default default being 10 million. - - -M, --multiline - Allow patterns to match more than one line. When this option - is given, patterns may usefully contain literal newline char- - acters and internal occurrences of ^ and $ characters. The - output for a successful match may consist of more than one - line, the last of which is the one in which the match ended. - If the matched string ends with a newline sequence the output - ends at the end of that line. - - When this option is set, the PCRE library is called in "mul- - tiline" mode. There is a limit to the number of lines that - can be matched, imposed by the way that pcregrep buffers the - input file as it scans it. However, pcregrep ensures that at - least 8K characters or the rest of the document (whichever is - the shorter) are available for forward matching, and simi- - larly the previous 8K characters (or all the previous charac- - ters, if fewer than 8K) are guaranteed to be available for - lookbehind assertions. This option does not work when input - is read line by line (see --line-buffered.) - - -N newline-type, --newline=newline-type - The PCRE library supports five different conventions for - indicating the ends of lines. They are the single-character - sequences CR (carriage return) and LF (linefeed), the two- - character sequence CRLF, an "anycrlf" convention, which rec- - ognizes any of the preceding three types, and an "any" con- - vention, in which any Unicode line ending sequence is assumed - to end a line. The Unicode sequences are the three just men- - tioned, plus VT (vertical tab, U+000B), FF (form feed, - U+000C), NEL (next line, U+0085), LS (line separator, - U+2028), and PS (paragraph separator, U+2029). - - When the PCRE library is built, a default line-ending - sequence is specified. This is normally the standard - sequence for the operating system. Unless otherwise specified - by this option, pcregrep uses the library's default. The - possible values for this option are CR, LF, CRLF, ANYCRLF, or - ANY. This makes it possible to use pcregrep to scan files - that have come from other environments without having to mod- - ify their line endings. If the data that is being scanned - does not agree with the convention set by this option, pcre- - grep may behave in strange ways. Note that this option does - not apply to files specified by the -f, --exclude-from, or - --include-from options, which are expected to use the operat- - ing system's standard newline sequence. - - -n, --line-number - Precede each output line by its line number in the file, fol- - lowed by a colon for matching lines or a hyphen for context - lines. If the filename is also being output, it precedes the - line number. This option is forced if --line-offsets is used. - - --no-jit If the PCRE library is built with support for just-in-time - compiling (which speeds up matching), pcregrep automatically - makes use of this, unless it was explicitly disabled at build - time. This option can be used to disable the use of JIT at - run time. It is provided for testing and working round prob- - lems. It should never be needed in normal use. - - -o, --only-matching - Show only the part of the line that matched a pattern instead - of the whole line. In this mode, no context is shown. That - is, the -A, -B, and -C options are ignored. If there is more - than one match in a line, each of them is shown separately. - If -o is combined with -v (invert the sense of the match to - find non-matching lines), no output is generated, but the - return code is set appropriately. If the matched portion of - the line is empty, nothing is output unless the file name or - line number are being printed, in which case they are shown - on an otherwise empty line. This option is mutually exclusive - with --file-offsets and --line-offsets. - - -onumber, --only-matching=number - Show only the part of the line that matched the capturing - parentheses of the given number. Up to 32 capturing parenthe- - ses are supported, and -o0 is equivalent to -o without a num- - ber. Because these options can be given without an argument - (see above), if an argument is present, it must be given in - the same shell item, for example, -o3 or --only-matching=2. - The comments given for the non-argument case above also apply - to this case. If the specified capturing parentheses do not - exist in the pattern, or were not set in the match, nothing - is output unless the file name or line number are being - printed. - - If this option is given multiple times, multiple substrings - are output, in the order the options are given. For example, - -o3 -o1 -o3 causes the substrings matched by capturing paren- - theses 3 and 1 and then 3 again to be output. By default, - there is no separator (but see the next option). - - --om-separator=text - Specify a separating string for multiple occurrences of -o. - The default is an empty string. Separating strings are never - coloured. - - -q, --quiet - Work quietly, that is, display nothing except error messages. - The exit status indicates whether or not any matches were - found. - - -r, --recursive - If any given path is a directory, recursively scan the files - it contains, taking note of any --include and --exclude set- - tings. By default, a directory is read as a normal file; in - some operating systems this gives an immediate end-of-file. - This option is a shorthand for setting the -d option to - "recurse". - - --recursion-limit=number - See --match-limit above. - - -s, --no-messages - Suppress error messages about non-existent or unreadable - files. Such files are quietly skipped. However, the return - code is still 2, even if matches were found in other files. - - -u, --utf-8 - Operate in UTF-8 mode. This option is available only if PCRE - has been compiled with UTF-8 support. All patterns (including - those for any --exclude and --include options) and all sub- - ject lines that are scanned must be valid strings of UTF-8 - characters. - - -V, --version - Write the version numbers of pcregrep and the PCRE library to - the standard output and then exit. Anything else on the com- - mand line is ignored. - - -v, --invert-match - Invert the sense of the match, so that lines which do not - match any of the patterns are the ones that are found. - - -w, --word-regex, --word-regexp - Force the patterns to match only whole words. This is equiva- - lent to having \b at the start and end of the pattern. This - option applies only to the patterns that are matched against - the contents of files; it does not apply to patterns speci- - fied by any of the --include or --exclude options. - - -x, --line-regex, --line-regexp - Force the patterns to be anchored (each must start matching - at the beginning of a line) and in addition, require them to - match entire lines. This is equivalent to having ^ and $ - characters at the start and end of each alternative branch in - every pattern. This option applies only to the patterns that - are matched against the contents of files; it does not apply - to patterns specified by any of the --include or --exclude - options. - - -ENVIRONMENT VARIABLES - - The environment variables LC_ALL and LC_CTYPE are examined, in that - order, for a locale. The first one that is set is used. This can be - overridden by the --locale option. If no locale is set, the PCRE - library's default (usually the "C" locale) is used. - - -NEWLINES - - The -N (--newline) option allows pcregrep to scan files with different - newline conventions from the default. Any parts of the input files that - are written to the standard output are copied identically, with what- - ever newline sequences they have in the input. However, the setting of - this option does not affect the interpretation of files specified by - the -f, --exclude-from, or --include-from options, which are assumed to - use the operating system's standard newline sequence, nor does it - affect the way in which pcregrep writes informational messages to the - standard error and output streams. For these it uses the string "\n" to - indicate newlines, relying on the C I/O library to convert this to an - appropriate sequence. - - -OPTIONS COMPATIBILITY - - Many of the short and long forms of pcregrep's options are the same as - in the GNU grep program. Any long option of the form --xxx-regexp (GNU - terminology) is also available as --xxx-regex (PCRE terminology). How- - ever, the --file-list, --file-offsets, --include-dir, --line-offsets, - --locale, --match-limit, -M, --multiline, -N, --newline, --om-separa- - tor, --recursion-limit, -u, and --utf-8 options are specific to pcre- - grep, as is the use of the --only-matching option with a capturing - parentheses number. - - Although most of the common options work the same way, a few are dif- - ferent in pcregrep. For example, the --include option's argument is a - glob for GNU grep, but a regular expression for pcregrep. If both the - -c and -l options are given, GNU grep lists only file names, without - counts, but pcregrep gives the counts. - - -OPTIONS WITH DATA - - There are four different ways in which an option with data can be spec- - ified. If a short form option is used, the data may follow immedi- - ately, or (with one exception) in the next command line item. For exam- - ple: - - -f/some/file - -f /some/file - - The exception is the -o option, which may appear with or without data. - Because of this, if data is present, it must follow immediately in the - same item, for example -o3. - - If a long form option is used, the data may appear in the same command - line item, separated by an equals character, or (with two exceptions) - it may appear in the next command line item. For example: - - --file=/some/file - --file /some/file - - Note, however, that if you want to supply a file name beginning with ~ - as data in a shell command, and have the shell expand ~ to a home - directory, you must separate the file name from the option, because the - shell does not treat ~ specially unless it is at the start of an item. - - The exceptions to the above are the --colour (or --color) and --only- - matching options, for which the data is optional. If one of these - options does have data, it must be given in the first form, using an - equals character. Otherwise pcregrep will assume that it has no data. - - -MATCHING ERRORS - - It is possible to supply a regular expression that takes a very long - time to fail to match certain lines. Such patterns normally involve - nested indefinite repeats, for example: (a+)*\d when matched against a - line of a's with no final digit. The PCRE matching function has a - resource limit that causes it to abort in these circumstances. If this - happens, pcregrep outputs an error message and the line that caused the - problem to the standard error stream. If there are more than 20 such - errors, pcregrep gives up. - - The --match-limit option of pcregrep can be used to set the overall - resource limit; there is a second option called --recursion-limit that - sets a limit on the amount of memory (usually stack) that is used (see - the discussion of these options above). - - -DIAGNOSTICS - - Exit status is 0 if any matches were found, 1 if no matches were found, - and 2 for syntax errors, overlong lines, non-existent or inaccessible - files (even if matches were found in other files) or too many matching - errors. Using the -s option to suppress error messages about inaccessi- - ble files does not affect the return code. - - -SEE ALSO - - pcrepattern(3), pcresyntax(3), pcretest(1). - - -AUTHOR - - Philip Hazel - University Computing Service - Cambridge CB2 3QH, England. - - -REVISION - - Last updated: 03 April 2014 - Copyright (c) 1997-2014 University of Cambridge. diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/pcretest.txt b/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/pcretest.txt deleted file mode 100644 index 6d7305cf..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/doc/pcre/pcretest.txt +++ /dev/null @@ -1,1091 +0,0 @@ -PCRETEST(1) General Commands Manual PCRETEST(1) - - - -NAME - pcretest - a program for testing Perl-compatible regular expressions. - -SYNOPSIS - - pcretest [options] [input file [output file]] - - pcretest was written as a test program for the PCRE regular expression - library itself, but it can also be used for experimenting with regular - expressions. This document describes the features of the test program; - for details of the regular expressions themselves, see the pcrepattern - documentation. For details of the PCRE library function calls and their - options, see the pcreapi , pcre16 and pcre32 documentation. - - The input for pcretest is a sequence of regular expression patterns and - strings to be matched, as described below. The output shows the result - of each match. Options on the command line and the patterns control - PCRE options and exactly what is output. - - As PCRE has evolved, it has acquired many different features, and as a - result, pcretest now has rather a lot of obscure options for testing - every possible feature. Some of these options are specifically designed - for use in conjunction with the test script and data files that are - distributed as part of PCRE, and are unlikely to be of use otherwise. - They are all documented here, but without much justification. - - -INPUT DATA FORMAT - - Input to pcretest is processed line by line, either by calling the C - library's fgets() function, or via the libreadline library (see below). - In Unix-like environments, fgets() treats any bytes other than newline - as data characters. However, in some Windows environments character 26 - (hex 1A) causes an immediate end of file, and no further data is read. - For maximum portability, therefore, it is safest to use only ASCII - characters in pcretest input files. - - The input is processed using using C's string functions, so must not - contain binary zeroes, even though in Unix-like environments, fgets() - treats any bytes other than newline as data characters. - - -PCRE's 8-BIT, 16-BIT AND 32-BIT LIBRARIES - - From release 8.30, two separate PCRE libraries can be built. The origi- - nal one supports 8-bit character strings, whereas the newer 16-bit - library supports character strings encoded in 16-bit units. From - release 8.32, a third library can be built, supporting character - strings encoded in 32-bit units. The pcretest program can be used to - test all three libraries. However, it is itself still an 8-bit program, - reading 8-bit input and writing 8-bit output. When testing the 16-bit - or 32-bit library, the patterns and data strings are converted to 16- - or 32-bit format before being passed to the PCRE library functions. - Results are converted to 8-bit for output. - - References to functions and structures of the form pcre[16|32]_xx below - mean "pcre_xx when using the 8-bit library, pcre16_xx when using the - 16-bit library, or pcre32_xx when using the 32-bit library". - - -COMMAND LINE OPTIONS - - -8 If both the 8-bit library has been built, this option causes - the 8-bit library to be used (which is the default); if the - 8-bit library has not been built, this option causes an - error. - - -16 If both the 8-bit or the 32-bit, and the 16-bit libraries - have been built, this option causes the 16-bit library to be - used. If only the 16-bit library has been built, this is the - default (so has no effect). If only the 8-bit or the 32-bit - library has been built, this option causes an error. - - -32 If both the 8-bit or the 16-bit, and the 32-bit libraries - have been built, this option causes the 32-bit library to be - used. If only the 32-bit library has been built, this is the - default (so has no effect). If only the 8-bit or the 16-bit - library has been built, this option causes an error. - - -b Behave as if each pattern has the /B (show byte code) modi- - fier; the internal form is output after compilation. - - -C Output the version number of the PCRE library, and all avail- - able information about the optional features that are - included, and then exit with zero exit code. All other - options are ignored. - - -C option Output information about a specific build-time option, then - exit. This functionality is intended for use in scripts such - as RunTest. The following options output the value and set - the exit code as indicated: - - ebcdic-nl the code for LF (= NL) in an EBCDIC environment: - 0x15 or 0x25 - 0 if used in an ASCII environment - exit code is always 0 - linksize the configured internal link size (2, 3, or 4) - exit code is set to the link size - newline the default newline setting: - CR, LF, CRLF, ANYCRLF, or ANY - exit code is always 0 - bsr the default setting for what \R matches: - ANYCRLF or ANY - exit code is always 0 - - The following options output 1 for true or 0 for false, and - set the exit code to the same value: - - ebcdic compiled for an EBCDIC environment - jit just-in-time support is available - pcre16 the 16-bit library was built - pcre32 the 32-bit library was built - pcre8 the 8-bit library was built - ucp Unicode property support is available - utf UTF-8 and/or UTF-16 and/or UTF-32 support - is available - - If an unknown option is given, an error message is output; - the exit code is 0. - - -d Behave as if each pattern has the /D (debug) modifier; the - internal form and information about the compiled pattern is - output after compilation; -d is equivalent to -b -i. - - -dfa Behave as if each data line contains the \D escape sequence; - this causes the alternative matching function, - pcre[16|32]_dfa_exec(), to be used instead of the standard - pcre[16|32]_exec() function (more detail is given below). - - -help Output a brief summary these options and then exit. - - -i Behave as if each pattern has the /I modifier; information - about the compiled pattern is given after compilation. - - -M Behave as if each data line contains the \M escape sequence; - this causes PCRE to discover the minimum MATCH_LIMIT and - MATCH_LIMIT_RECURSION settings by calling pcre[16|32]_exec() - repeatedly with different limits. - - -m Output the size of each compiled pattern after it has been - compiled. This is equivalent to adding /M to each regular - expression. The size is given in bytes for both libraries. - - -O Behave as if each pattern has the /O modifier, that is dis- - able auto-possessification for all patterns. - - -o osize Set the number of elements in the output vector that is used - when calling pcre[16|32]_exec() or pcre[16|32]_dfa_exec() to - be osize. The default value is 45, which is enough for 14 - capturing subexpressions for pcre[16|32]_exec() or 22 differ- - ent matches for pcre[16|32]_dfa_exec(). The vector size can - be changed for individual matching calls by including \O in - the data line (see below). - - -p Behave as if each pattern has the /P modifier; the POSIX - wrapper API is used to call PCRE. None of the other options - has any effect when -p is set. This option can be used only - with the 8-bit library. - - -q Do not output the version number of pcretest at the start of - execution. - - -S size On Unix-like systems, set the size of the run-time stack to - size megabytes. - - -s or -s+ Behave as if each pattern has the /S modifier; in other - words, force each pattern to be studied. If -s+ is used, all - the JIT compile options are passed to pcre[16|32]_study(), - causing just-in-time optimization to be set up if it is - available, for both full and partial matching. Specific JIT - compile options can be selected by following -s+ with a digit - in the range 1 to 7, which selects the JIT compile modes as - follows: - - 1 normal match only - 2 soft partial match only - 3 normal match and soft partial match - 4 hard partial match only - 6 soft and hard partial match - 7 all three modes (default) - - If -s++ is used instead of -s+ (with or without a following - digit), the text "(JIT)" is added to the first output line - after a match or no match when JIT-compiled code was actually - used. - - Note that there are pattern options that can override -s, - either specifying no studying at all, or suppressing JIT com- - pilation. - - If the /I or /D option is present on a pattern (requesting - output about the compiled pattern), information about the - result of studying is not included when studying is caused - only by -s and neither -i nor -d is present on the command - line. This behaviour means that the output from tests that - are run with and without -s should be identical, except when - options that output information about the actual running of a - match are set. - - The -M, -t, and -tm options, which give information about - resources used, are likely to produce different output with - and without -s. Output may also differ if the /C option is - present on an individual pattern. This uses callouts to trace - the the matching process, and this may be different between - studied and non-studied patterns. If the pattern contains - (*MARK) items there may also be differences, for the same - reason. The -s command line option can be overridden for spe- - cific patterns that should never be studied (see the /S pat- - tern modifier below). - - -t Run each compile, study, and match many times with a timer, - and output the resulting times per compile, study, or match - (in milliseconds). Do not set -m with -t, because you will - then get the size output a zillion times, and the timing will - be distorted. You can control the number of iterations that - are used for timing by following -t with a number (as a sepa- - rate item on the command line). For example, "-t 1000" iter- - ates 1000 times. The default is to iterate 500000 times. - - -tm This is like -t except that it times only the matching phase, - not the compile or study phases. - - -T -TM These behave like -t and -tm, but in addition, at the end of - a run, the total times for all compiles, studies, and matches - are output. - - -DESCRIPTION - - If pcretest is given two filename arguments, it reads from the first - and writes to the second. If it is given only one filename argument, it - reads from that file and writes to stdout. Otherwise, it reads from - stdin and writes to stdout, and prompts for each line of input, using - "re>" to prompt for regular expressions, and "data>" to prompt for data - lines. - - When pcretest is built, a configuration option can specify that it - should be linked with the libreadline library. When this is done, if - the input is from a terminal, it is read using the readline() function. - This provides line-editing and history facilities. The output from the - -help option states whether or not readline() will be used. - - The program handles any number of sets of input on a single input file. - Each set starts with a regular expression, and continues with any num- - ber of data lines to be matched against that pattern. - - Each data line is matched separately and independently. If you want to - do multi-line matches, you have to use the \n escape sequence (or \r or - \r\n, etc., depending on the newline setting) in a single line of input - to encode the newline sequences. There is no limit on the length of - data lines; the input buffer is automatically extended if it is too - small. - - An empty line signals the end of the data lines, at which point a new - regular expression is read. The regular expressions are given enclosed - in any non-alphanumeric delimiters other than backslash, for example: - - /(a|bc)x+yz/ - - White space before the initial delimiter is ignored. A regular expres- - sion may be continued over several input lines, in which case the new- - line characters are included within it. It is possible to include the - delimiter within the pattern by escaping it, for example - - /abc\/def/ - - If you do so, the escape and the delimiter form part of the pattern, - but since delimiters are always non-alphanumeric, this does not affect - its interpretation. If the terminating delimiter is immediately fol- - lowed by a backslash, for example, - - /abc/\ - - then a backslash is added to the end of the pattern. This is done to - provide a way of testing the error condition that arises if a pattern - finishes with a backslash, because - - /abc\/ - - is interpreted as the first line of a pattern that starts with "abc/", - causing pcretest to read the next line as a continuation of the regular - expression. - - -PATTERN MODIFIERS - - A pattern may be followed by any number of modifiers, which are mostly - single characters, though some of these can be qualified by further - characters. Following Perl usage, these are referred to below as, for - example, "the /i modifier", even though the delimiter of the pattern - need not always be a slash, and no slash is used when writing modi- - fiers. White space may appear between the final pattern delimiter and - the first modifier, and between the modifiers themselves. For refer- - ence, here is a complete list of modifiers. They fall into several - groups that are described in detail in the following sections. - - /8 set UTF mode - /9 set PCRE_NEVER_UTF (locks out UTF mode) - /? disable UTF validity check - /+ show remainder of subject after match - /= show all captures (not just those that are set) - - /A set PCRE_ANCHORED - /B show compiled code - /C set PCRE_AUTO_CALLOUT - /D same as /B plus /I - /E set PCRE_DOLLAR_ENDONLY - /F flip byte order in compiled pattern - /f set PCRE_FIRSTLINE - /G find all matches (shorten string) - /g find all matches (use startoffset) - /I show information about pattern - /i set PCRE_CASELESS - /J set PCRE_DUPNAMES - /K show backtracking control names - /L set locale - /M show compiled memory size - /m set PCRE_MULTILINE - /N set PCRE_NO_AUTO_CAPTURE - /O set PCRE_NO_AUTO_POSSESS - /P use the POSIX wrapper - /Q test external stack check function - /S study the pattern after compilation - /s set PCRE_DOTALL - /T select character tables - /U set PCRE_UNGREEDY - /W set PCRE_UCP - /X set PCRE_EXTRA - /x set PCRE_EXTENDED - /Y set PCRE_NO_START_OPTIMIZE - /Z don't show lengths in /B output - - / set PCRE_NEWLINE_ANY - / set PCRE_NEWLINE_ANYCRLF - / set PCRE_NEWLINE_CR - / set PCRE_NEWLINE_CRLF - / set PCRE_NEWLINE_LF - / set PCRE_BSR_ANYCRLF - / set PCRE_BSR_UNICODE - / set PCRE_JAVASCRIPT_COMPAT - - - Perl-compatible modifiers - - The /i, /m, /s, and /x modifiers set the PCRE_CASELESS, PCRE_MULTILINE, - PCRE_DOTALL, or PCRE_EXTENDED options, respectively, when - pcre[16|32]_compile() is called. These four modifier letters have the - same effect as they do in Perl. For example: - - /caseless/i - - - Modifiers for other PCRE options - - The following table shows additional modifiers for setting PCRE com- - pile-time options that do not correspond to anything in Perl: - - /8 PCRE_UTF8 ) when using the 8-bit - /? PCRE_NO_UTF8_CHECK ) library - - /8 PCRE_UTF16 ) when using the 16-bit - /? PCRE_NO_UTF16_CHECK ) library - - /8 PCRE_UTF32 ) when using the 32-bit - /? PCRE_NO_UTF32_CHECK ) library - - /9 PCRE_NEVER_UTF - /A PCRE_ANCHORED - /C PCRE_AUTO_CALLOUT - /E PCRE_DOLLAR_ENDONLY - /f PCRE_FIRSTLINE - /J PCRE_DUPNAMES - /N PCRE_NO_AUTO_CAPTURE - /O PCRE_NO_AUTO_POSSESS - /U PCRE_UNGREEDY - /W PCRE_UCP - /X PCRE_EXTRA - /Y PCRE_NO_START_OPTIMIZE - / PCRE_NEWLINE_ANY - / PCRE_NEWLINE_ANYCRLF - / PCRE_NEWLINE_CR - / PCRE_NEWLINE_CRLF - / PCRE_NEWLINE_LF - / PCRE_BSR_ANYCRLF - / PCRE_BSR_UNICODE - / PCRE_JAVASCRIPT_COMPAT - - The modifiers that are enclosed in angle brackets are literal strings - as shown, including the angle brackets, but the letters within can be - in either case. This example sets multiline matching with CRLF as the - line ending sequence: - - /^abc/m - - As well as turning on the PCRE_UTF8/16/32 option, the /8 modifier - causes all non-printing characters in output strings to be printed - using the \x{hh...} notation. Otherwise, those less than 0x100 are out- - put in hex without the curly brackets. - - Full details of the PCRE options are given in the pcreapi documenta- - tion. - - Finding all matches in a string - - Searching for all possible matches within each subject string can be - requested by the /g or /G modifier. After finding a match, PCRE is - called again to search the remainder of the subject string. The differ- - ence between /g and /G is that the former uses the startoffset argument - to pcre[16|32]_exec() to start searching at a new point within the - entire string (which is in effect what Perl does), whereas the latter - passes over a shortened substring. This makes a difference to the - matching process if the pattern begins with a lookbehind assertion - (including \b or \B). - - If any call to pcre[16|32]_exec() in a /g or /G sequence matches an - empty string, the next call is done with the PCRE_NOTEMPTY_ATSTART and - PCRE_ANCHORED flags set in order to search for another, non-empty, - match at the same point. If this second match fails, the start offset - is advanced, and the normal match is retried. This imitates the way - Perl handles such cases when using the /g modifier or the split() func- - tion. Normally, the start offset is advanced by one character, but if - the newline convention recognizes CRLF as a newline, and the current - character is CR followed by LF, an advance of two is used. - - Other modifiers - - There are yet more modifiers for controlling the way pcretest operates. - - The /+ modifier requests that as well as outputting the substring that - matched the entire pattern, pcretest should in addition output the - remainder of the subject string. This is useful for tests where the - subject contains multiple copies of the same substring. If the + modi- - fier appears twice, the same action is taken for captured substrings. - In each case the remainder is output on the following line with a plus - character following the capture number. Note that this modifier must - not immediately follow the /S modifier because /S+ and /S++ have other - meanings. - - The /= modifier requests that the values of all potential captured - parentheses be output after a match. By default, only those up to the - highest one actually used in the match are output (corresponding to the - return code from pcre[16|32]_exec()). Values in the offsets vector cor- - responding to higher numbers should be set to -1, and these are output - as "". This modifier gives a way of checking that this is hap- - pening. - - The /B modifier is a debugging feature. It requests that pcretest out- - put a representation of the compiled code after compilation. Normally - this information contains length and offset values; however, if /Z is - also present, this data is replaced by spaces. This is a special fea- - ture for use in the automatic test scripts; it ensures that the same - output is generated for different internal link sizes. - - The /D modifier is a PCRE debugging feature, and is equivalent to /BI, - that is, both the /B and the /I modifiers. - - The /F modifier causes pcretest to flip the byte order of the 2-byte - and 4-byte fields in the compiled pattern. This facility is for testing - the feature in PCRE that allows it to execute patterns that were com- - piled on a host with a different endianness. This feature is not avail- - able when the POSIX interface to PCRE is being used, that is, when the - /P pattern modifier is specified. See also the section about saving and - reloading compiled patterns below. - - The /I modifier requests that pcretest output information about the - compiled pattern (whether it is anchored, has a fixed first character, - and so on). It does this by calling pcre[16|32]_fullinfo() after com- - piling a pattern. If the pattern is studied, the results of that are - also output. In this output, the word "char" means a non-UTF character, - that is, the value of a single data item (8-bit, 16-bit, or 32-bit, - depending on the library that is being tested). - - The /K modifier requests pcretest to show names from backtracking con- - trol verbs that are returned from calls to pcre[16|32]_exec(). It - causes pcretest to create a pcre[16|32]_extra block if one has not - already been created by a call to pcre[16|32]_study(), and to set the - PCRE_EXTRA_MARK flag and the mark field within it, every time that - pcre[16|32]_exec() is called. If the variable that the mark field - points to is non-NULL for a match, non-match, or partial match, - pcretest prints the string to which it points. For a match, this is - shown on a line by itself, tagged with "MK:". For a non-match it is - added to the message. - - The /L modifier must be followed directly by the name of a locale, for - example, - - /pattern/Lfr_FR - - For this reason, it must be the last modifier. The given locale is set, - pcre[16|32]_maketables() is called to build a set of character tables - for the locale, and this is then passed to pcre[16|32]_compile() when - compiling the regular expression. Without an /L (or /T) modifier, NULL - is passed as the tables pointer; that is, /L applies only to the - expression on which it appears. - - The /M modifier causes the size in bytes of the memory block used to - hold the compiled pattern to be output. This does not include the size - of the pcre[16|32] block; it is just the actual compiled data. If the - pattern is successfully studied with the PCRE_STUDY_JIT_COMPILE option, - the size of the JIT compiled code is also output. - - The /Q modifier is used to test the use of pcre_stack_guard. It must be - followed by '0' or '1', specifying the return code to be given from an - external function that is passed to PCRE and used for stack checking - during compilation (see the pcreapi documentation for details). - - The /S modifier causes pcre[16|32]_study() to be called after the - expression has been compiled, and the results used when the expression - is matched. There are a number of qualifying characters that may follow - /S. They may appear in any order. - - If /S is followed by an exclamation mark, pcre[16|32]_study() is called - with the PCRE_STUDY_EXTRA_NEEDED option, causing it always to return a - pcre_extra block, even when studying discovers no useful information. - - If /S is followed by a second S character, it suppresses studying, even - if it was requested externally by the -s command line option. This - makes it possible to specify that certain patterns are always studied, - and others are never studied, independently of -s. This feature is used - in the test files in a few cases where the output is different when the - pattern is studied. - - If the /S modifier is followed by a + character, the call to - pcre[16|32]_study() is made with all the JIT study options, requesting - just-in-time optimization support if it is available, for both normal - and partial matching. If you want to restrict the JIT compiling modes, - you can follow /S+ with a digit in the range 1 to 7: - - 1 normal match only - 2 soft partial match only - 3 normal match and soft partial match - 4 hard partial match only - 6 soft and hard partial match - 7 all three modes (default) - - If /S++ is used instead of /S+ (with or without a following digit), the - text "(JIT)" is added to the first output line after a match or no - match when JIT-compiled code was actually used. - - Note that there is also an independent /+ modifier; it must not be - given immediately after /S or /S+ because this will be misinterpreted. - - If JIT studying is successful, the compiled JIT code will automatically - be used when pcre[16|32]_exec() is run, except when incompatible run- - time options are specified. For more details, see the pcrejit documen- - tation. See also the \J escape sequence below for a way of setting the - size of the JIT stack. - - Finally, if /S is followed by a minus character, JIT compilation is - suppressed, even if it was requested externally by the -s command line - option. This makes it possible to specify that JIT is never to be used - for certain patterns. - - The /T modifier must be followed by a single digit. It causes a spe- - cific set of built-in character tables to be passed to pcre[16|32]_com- - pile(). It is used in the standard PCRE tests to check behaviour with - different character tables. The digit specifies the tables as follows: - - 0 the default ASCII tables, as distributed in - pcre_chartables.c.dist - 1 a set of tables defining ISO 8859 characters - - In table 1, some characters whose codes are greater than 128 are iden- - tified as letters, digits, spaces, etc. - - Using the POSIX wrapper API - - The /P modifier causes pcretest to call PCRE via the POSIX wrapper API - rather than its native API. This supports only the 8-bit library. When - /P is set, the following modifiers set options for the regcomp() func- - tion: - - /i REG_ICASE - /m REG_NEWLINE - /N REG_NOSUB - /s REG_DOTALL ) - /U REG_UNGREEDY ) These options are not part of - /W REG_UCP ) the POSIX standard - /8 REG_UTF8 ) - - The /+ modifier works as described above. All other modifiers are - ignored. - - Locking out certain modifiers - - PCRE can be compiled with or without support for certain features such - as UTF-8/16/32 or Unicode properties. Accordingly, the standard tests - are split up into a number of different files that are selected for - running depending on which features are available. When updating the - tests, it is all too easy to put a new test into the wrong file by mis- - take; for example, to put a test that requires UTF support into a file - that is used when it is not available. To help detect such mistakes as - early as possible, there is a facility for locking out specific modi- - fiers. If an input line for pcretest starts with the string "< forbid " - the following sequence of characters is taken as a list of forbidden - modifiers. For example, in the test files that must not use UTF or Uni- - code property support, this line appears: - - < forbid 8W - - This locks out the /8 and /W modifiers. An immediate error is given if - they are subsequently encountered. If the character string contains < - but not >, all the multi-character modifiers that begin with < are - locked out. Otherwise, such modifiers must be explicitly listed, for - example: - - < forbid - - There must be a single space between < and "forbid" for this feature to - be recognised. If there is not, the line is interpreted either as a - request to re-load a pre-compiled pattern (see "SAVING AND RELOADING - COMPILED PATTERNS" below) or, if there is a another < character, as a - pattern that uses < as its delimiter. - - -DATA LINES - - Before each data line is passed to pcre[16|32]_exec(), leading and - trailing white space is removed, and it is then scanned for \ escapes. - Some of these are pretty esoteric features, intended for checking out - some of the more complicated features of PCRE. If you are just testing - "ordinary" regular expressions, you probably don't need any of these. - The following escapes are recognized: - - \a alarm (BEL, \x07) - \b backspace (\x08) - \e escape (\x27) - \f form feed (\x0c) - \n newline (\x0a) - \qdd set the PCRE_MATCH_LIMIT limit to dd - (any number of digits) - \r carriage return (\x0d) - \t tab (\x09) - \v vertical tab (\x0b) - \nnn octal character (up to 3 octal digits); always - a byte unless > 255 in UTF-8 or 16-bit or 32-bit mode - \o{dd...} octal character (any number of octal digits} - \xhh hexadecimal byte (up to 2 hex digits) - \x{hh...} hexadecimal character (any number of hex digits) - \A pass the PCRE_ANCHORED option to pcre[16|32]_exec() - or pcre[16|32]_dfa_exec() - \B pass the PCRE_NOTBOL option to pcre[16|32]_exec() - or pcre[16|32]_dfa_exec() - \Cdd call pcre[16|32]_copy_substring() for substring dd - after a successful match (number less than 32) - \Cname call pcre[16|32]_copy_named_substring() for substring - "name" after a successful match (name termin- - ated by next non alphanumeric character) - \C+ show the current captured substrings at callout - time - \C- do not supply a callout function - \C!n return 1 instead of 0 when callout number n is - reached - \C!n!m return 1 instead of 0 when callout number n is - reached for the nth time - \C*n pass the number n (may be negative) as callout - data; this is used as the callout return value - \D use the pcre[16|32]_dfa_exec() match function - \F only shortest match for pcre[16|32]_dfa_exec() - \Gdd call pcre[16|32]_get_substring() for substring dd - after a successful match (number less than 32) - \Gname call pcre[16|32]_get_named_substring() for substring - "name" after a successful match (name termin- - ated by next non-alphanumeric character) - \Jdd set up a JIT stack of dd kilobytes maximum (any - number of digits) - \L call pcre[16|32]_get_substringlist() after a - successful match - \M discover the minimum MATCH_LIMIT and - MATCH_LIMIT_RECURSION settings - \N pass the PCRE_NOTEMPTY option to pcre[16|32]_exec() - or pcre[16|32]_dfa_exec(); if used twice, pass the - PCRE_NOTEMPTY_ATSTART option - \Odd set the size of the output vector passed to - pcre[16|32]_exec() to dd (any number of digits) - \P pass the PCRE_PARTIAL_SOFT option to pcre[16|32]_exec() - or pcre[16|32]_dfa_exec(); if used twice, pass the - PCRE_PARTIAL_HARD option - \Qdd set the PCRE_MATCH_LIMIT_RECURSION limit to dd - (any number of digits) - \R pass the PCRE_DFA_RESTART option to pcre[16|32]_dfa_exec() - \S output details of memory get/free calls during matching - \Y pass the PCRE_NO_START_OPTIMIZE option to - pcre[16|32]_exec() - or pcre[16|32]_dfa_exec() - \Z pass the PCRE_NOTEOL option to pcre[16|32]_exec() - or pcre[16|32]_dfa_exec() - \? pass the PCRE_NO_UTF[8|16|32]_CHECK option to - pcre[16|32]_exec() or pcre[16|32]_dfa_exec() - \>dd start the match at offset dd (optional "-"; then - any number of digits); this sets the startoffset - argument for pcre[16|32]_exec() or - pcre[16|32]_dfa_exec() - \ pass the PCRE_NEWLINE_CR option to pcre[16|32]_exec() - or pcre[16|32]_dfa_exec() - \ pass the PCRE_NEWLINE_LF option to pcre[16|32]_exec() - or pcre[16|32]_dfa_exec() - \ pass the PCRE_NEWLINE_CRLF option to pcre[16|32]_exec() - or pcre[16|32]_dfa_exec() - \ pass the PCRE_NEWLINE_ANYCRLF option to pcre[16|32]_exec() - or pcre[16|32]_dfa_exec() - \ pass the PCRE_NEWLINE_ANY option to pcre[16|32]_exec() - or pcre[16|32]_dfa_exec() - - The use of \x{hh...} is not dependent on the use of the /8 modifier on - the pattern. It is recognized always. There may be any number of hexa- - decimal digits inside the braces; invalid values provoke error mes- - sages. - - Note that \xhh specifies one byte rather than one character in UTF-8 - mode; this makes it possible to construct invalid UTF-8 sequences for - testing purposes. On the other hand, \x{hh} is interpreted as a UTF-8 - character in UTF-8 mode, generating more than one byte if the value is - greater than 127. When testing the 8-bit library not in UTF-8 mode, - \x{hh} generates one byte for values less than 256, and causes an error - for greater values. - - In UTF-16 mode, all 4-digit \x{hhhh} values are accepted. This makes it - possible to construct invalid UTF-16 sequences for testing purposes. - - In UTF-32 mode, all 4- to 8-digit \x{...} values are accepted. This - makes it possible to construct invalid UTF-32 sequences for testing - purposes. - - The escapes that specify line ending sequences are literal strings, - exactly as shown. No more than one newline setting should be present in - any data line. - - A backslash followed by anything else just escapes the anything else. - If the very last character is a backslash, it is ignored. This gives a - way of passing an empty line as data, since a real empty line termi- - nates the data input. - - The \J escape provides a way of setting the maximum stack size that is - used by the just-in-time optimization code. It is ignored if JIT opti- - mization is not being used. Providing a stack that is larger than the - default 32K is necessary only for very complicated patterns. - - If \M is present, pcretest calls pcre[16|32]_exec() several times, with - different values in the match_limit and match_limit_recursion fields of - the pcre[16|32]_extra data structure, until it finds the minimum num- - bers for each parameter that allow pcre[16|32]_exec() to complete with- - out error. Because this is testing a specific feature of the normal - interpretive pcre[16|32]_exec() execution, the use of any JIT optimiza- - tion that might have been set up by the /S+ qualifier of -s+ option is - disabled. - - The match_limit number is a measure of the amount of backtracking that - takes place, and checking it out can be instructive. For most simple - matches, the number is quite small, but for patterns with very large - numbers of matching possibilities, it can become large very quickly - with increasing length of subject string. The match_limit_recursion - number is a measure of how much stack (or, if PCRE is compiled with - NO_RECURSE, how much heap) memory is needed to complete the match - attempt. - - When \O is used, the value specified may be higher or lower than the - size set by the -O command line option (or defaulted to 45); \O applies - only to the call of pcre[16|32]_exec() for the line in which it - appears. - - If the /P modifier was present on the pattern, causing the POSIX wrap- - per API to be used, the only option-setting sequences that have any - effect are \B, \N, and \Z, causing REG_NOTBOL, REG_NOTEMPTY, and - REG_NOTEOL, respectively, to be passed to regexec(). - - -THE ALTERNATIVE MATCHING FUNCTION - - By default, pcretest uses the standard PCRE matching function, - pcre[16|32]_exec() to match each data line. PCRE also supports an - alternative matching function, pcre[16|32]_dfa_test(), which operates - in a different way, and has some restrictions. The differences between - the two functions are described in the pcrematching documentation. - - If a data line contains the \D escape sequence, or if the command line - contains the -dfa option, the alternative matching function is used. - This function finds all possible matches at a given point. If, however, - the \F escape sequence is present in the data line, it stops after the - first match is found. This is always the shortest possible match. - - -DEFAULT OUTPUT FROM PCRETEST - - This section describes the output when the normal matching function, - pcre[16|32]_exec(), is being used. - - When a match succeeds, pcretest outputs the list of captured substrings - that pcre[16|32]_exec() returns, starting with number 0 for the string - that matched the whole pattern. Otherwise, it outputs "No match" when - the return is PCRE_ERROR_NOMATCH, and "Partial match:" followed by the - partially matching substring when pcre[16|32]_exec() returns - PCRE_ERROR_PARTIAL. (Note that this is the entire substring that was - inspected during the partial match; it may include characters before - the actual match start if a lookbehind assertion, \K, \b, or \B was - involved.) For any other return, pcretest outputs the PCRE negative - error number and a short descriptive phrase. If the error is a failed - UTF string check, the offset of the start of the failing character and - the reason code are also output, provided that the size of the output - vector is at least two. Here is an example of an interactive pcretest - run. - - $ pcretest - PCRE version 8.13 2011-04-30 - - re> /^abc(\d+)/ - data> abc123 - 0: abc123 - 1: 123 - data> xyz - No match - - Unset capturing substrings that are not followed by one that is set are - not returned by pcre[16|32]_exec(), and are not shown by pcretest. In - the following example, there are two capturing substrings, but when the - first data line is matched, the second, unset substring is not shown. - An "internal" unset substring is shown as "", as for the second - data line. - - re> /(a)|(b)/ - data> a - 0: a - 1: a - data> b - 0: b - 1: - 2: b - - If the strings contain any non-printing characters, they are output as - \xhh escapes if the value is less than 256 and UTF mode is not set. - Otherwise they are output as \x{hh...} escapes. See below for the defi- - nition of non-printing characters. If the pattern has the /+ modifier, - the output for substring 0 is followed by the the rest of the subject - string, identified by "0+" like this: - - re> /cat/+ - data> cataract - 0: cat - 0+ aract - - If the pattern has the /g or /G modifier, the results of successive - matching attempts are output in sequence, like this: - - re> /\Bi(\w\w)/g - data> Mississippi - 0: iss - 1: ss - 0: iss - 1: ss - 0: ipp - 1: pp - - "No match" is output only if the first match attempt fails. Here is an - example of a failure message (the offset 4 that is specified by \>4 is - past the end of the subject string): - - re> /xyz/ - data> xyz\>4 - Error -24 (bad offset value) - - If any of the sequences \C, \G, or \L are present in a data line that - is successfully matched, the substrings extracted by the convenience - functions are output with C, G, or L after the string number instead of - a colon. This is in addition to the normal full list. The string length - (that is, the return from the extraction function) is given in paren- - theses after each string for \C and \G. - - Note that whereas patterns can be continued over several lines (a plain - ">" prompt is used for continuations), data lines may not. However new- - lines can be included in data by means of the \n escape (or \r, \r\n, - etc., depending on the newline sequence setting). - - -OUTPUT FROM THE ALTERNATIVE MATCHING FUNCTION - - When the alternative matching function, pcre[16|32]_dfa_exec(), is used - (by means of the \D escape sequence or the -dfa command line option), - the output consists of a list of all the matches that start at the - first point in the subject where there is at least one match. For exam- - ple: - - re> /(tang|tangerine|tan)/ - data> yellow tangerine\D - 0: tangerine - 1: tang - 2: tan - - (Using the normal matching function on this data finds only "tang".) - The longest matching string is always given first (and numbered zero). - After a PCRE_ERROR_PARTIAL return, the output is "Partial match:", fol- - lowed by the partially matching substring. (Note that this is the - entire substring that was inspected during the partial match; it may - include characters before the actual match start if a lookbehind asser- - tion, \K, \b, or \B was involved.) - - If /g is present on the pattern, the search for further matches resumes - at the end of the longest match. For example: - - re> /(tang|tangerine|tan)/g - data> yellow tangerine and tangy sultana\D - 0: tangerine - 1: tang - 2: tan - 0: tang - 1: tan - 0: tan - - Since the matching function does not support substring capture, the - escape sequences that are concerned with captured substrings are not - relevant. - - -RESTARTING AFTER A PARTIAL MATCH - - When the alternative matching function has given the PCRE_ERROR_PARTIAL - return, indicating that the subject partially matched the pattern, you - can restart the match with additional subject data by means of the \R - escape sequence. For example: - - re> /^\d?\d(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)\d\d$/ - data> 23ja\P\D - Partial match: 23ja - data> n05\R\D - 0: n05 - - For further information about partial matching, see the pcrepartial - documentation. - - -CALLOUTS - - If the pattern contains any callout requests, pcretest's callout func- - tion is called during matching. This works with both matching func- - tions. By default, the called function displays the callout number, the - start and current positions in the text at the callout time, and the - next pattern item to be tested. For example: - - --->pqrabcdef - 0 ^ ^ \d - - This output indicates that callout number 0 occurred for a match - attempt starting at the fourth character of the subject string, when - the pointer was at the seventh character of the data, and when the next - pattern item was \d. Just one circumflex is output if the start and - current positions are the same. - - Callouts numbered 255 are assumed to be automatic callouts, inserted as - a result of the /C pattern modifier. In this case, instead of showing - the callout number, the offset in the pattern, preceded by a plus, is - output. For example: - - re> /\d?[A-E]\*/C - data> E* - --->E* - +0 ^ \d? - +3 ^ [A-E] - +8 ^^ \* - +10 ^ ^ - 0: E* - - If a pattern contains (*MARK) items, an additional line is output when- - ever a change of latest mark is passed to the callout function. For - example: - - re> /a(*MARK:X)bc/C - data> abc - --->abc - +0 ^ a - +1 ^^ (*MARK:X) - +10 ^^ b - Latest Mark: X - +11 ^ ^ c - +12 ^ ^ - 0: abc - - The mark changes between matching "a" and "b", but stays the same for - the rest of the match, so nothing more is output. If, as a result of - backtracking, the mark reverts to being unset, the text "" is - output. - - The callout function in pcretest returns zero (carry on matching) by - default, but you can use a \C item in a data line (as described above) - to change this and other parameters of the callout. - - Inserting callouts can be helpful when using pcretest to check compli- - cated regular expressions. For further information about callouts, see - the pcrecallout documentation. - - -NON-PRINTING CHARACTERS - - When pcretest is outputting text in the compiled version of a pattern, - bytes other than 32-126 are always treated as non-printing characters - are are therefore shown as hex escapes. - - When pcretest is outputting text that is a matched part of a subject - string, it behaves in the same way, unless a different locale has been - set for the pattern (using the /L modifier). In this case, the - isprint() function to distinguish printing and non-printing characters. - - -SAVING AND RELOADING COMPILED PATTERNS - - The facilities described in this section are not available when the - POSIX interface to PCRE is being used, that is, when the /P pattern - modifier is specified. - - When the POSIX interface is not in use, you can cause pcretest to write - a compiled pattern to a file, by following the modifiers with > and a - file name. For example: - - /pattern/im >/some/file - - See the pcreprecompile documentation for a discussion about saving and - re-using compiled patterns. Note that if the pattern was successfully - studied with JIT optimization, the JIT data cannot be saved. - - The data that is written is binary. The first eight bytes are the - length of the compiled pattern data followed by the length of the - optional study data, each written as four bytes in big-endian order - (most significant byte first). If there is no study data (either the - pattern was not studied, or studying did not return any data), the sec- - ond length is zero. The lengths are followed by an exact copy of the - compiled pattern. If there is additional study data, this (excluding - any JIT data) follows immediately after the compiled pattern. After - writing the file, pcretest expects to read a new pattern. - - A saved pattern can be reloaded into pcretest by specifying < and a - file name instead of a pattern. There must be no space between < and - the file name, which must not contain a < character, as otherwise - pcretest will interpret the line as a pattern delimited by < charac- - ters. For example: - - re> \fP. When there is more than one pattern -(specified by the use of \fB-e\fP and/or \fB-f\fP), each pattern is applied to -each line in the order in which they are defined, except that all the \fB-e\fP -patterns are tried before the \fB-f\fP patterns. -.P -By default, as soon as one pattern matches a line, no further patterns are -considered. However, if \fB--colour\fP (or \fB--color\fP) is used to colour the -matching substrings, or if \fB--only-matching\fP, \fB--file-offsets\fP, or -\fB--line-offsets\fP is used to output only the part of the line that matched -(either shown literally, or as an offset), scanning resumes immediately -following the match, so that further matches on the same line can be found. If -there are multiple patterns, they are all tried on the remainder of the line, -but patterns that follow the one that matched are not tried on the earlier part -of the line. -.P -This behaviour means that the order in which multiple patterns are specified -can affect the output when one of the above options is used. This is no longer -the same behaviour as GNU grep, which now manages to display earlier matches -for later patterns (as long as there is no overlap). -.P -Patterns that can match an empty string are accepted, but empty string -matches are never recognized. An example is the pattern "(super)?(man)?", in -which all components are optional. This pattern finds all occurrences of both -"super" and "man"; the output differs from matching with "super|man" when only -the matching substrings are being shown. -.P -If the \fBLC_ALL\fP or \fBLC_CTYPE\fP environment variable is set, -\fBpcregrep\fP uses the value to set a locale when calling the PCRE library. -The \fB--locale\fP option can be used to override this. -. -. -.SH "SUPPORT FOR COMPRESSED FILES" -.rs -.sp -It is possible to compile \fBpcregrep\fP so that it uses \fBlibz\fP or -\fBlibbz2\fP to read files whose names end in \fB.gz\fP or \fB.bz2\fP, -respectively. You can find out whether your binary has support for one or both -of these file types by running it with the \fB--help\fP option. If the -appropriate support is not present, files are treated as plain text. The -standard input is always so treated. -. -. -.SH "BINARY FILES" -.rs -.sp -By default, a file that contains a binary zero byte within the first 1024 bytes -is identified as a binary file, and is processed specially. (GNU grep also -identifies binary files in this manner.) See the \fB--binary-files\fP option -for a means of changing the way binary files are handled. -. -. -.SH OPTIONS -.rs -.sp -The order in which some of the options appear can affect the output. For -example, both the \fB-h\fP and \fB-l\fP options affect the printing of file -names. Whichever comes later in the command line will be the one that takes -effect. Similarly, except where noted below, if an option is given twice, the -later setting is used. Numerical values for options may be followed by K or M, -to signify multiplication by 1024 or 1024*1024 respectively. -.TP 10 -\fB--\fP -This terminates the list of options. It is useful if the next item on the -command line starts with a hyphen but is not an option. This allows for the -processing of patterns and filenames that start with hyphens. -.TP -\fB-A\fP \fInumber\fP, \fB--after-context=\fP\fInumber\fP -Output \fInumber\fP lines of context after each matching line. If filenames -and/or line numbers are being output, a hyphen separator is used instead of a -colon for the context lines. A line containing "--" is output between each -group of lines, unless they are in fact contiguous in the input file. The value -of \fInumber\fP is expected to be relatively small. However, \fBpcregrep\fP -guarantees to have up to 8K of following text available for context output. -.TP -\fB-a\fP, \fB--text\fP -Treat binary files as text. This is equivalent to -\fB--binary-files\fP=\fItext\fP. -.TP -\fB-B\fP \fInumber\fP, \fB--before-context=\fP\fInumber\fP -Output \fInumber\fP lines of context before each matching line. If filenames -and/or line numbers are being output, a hyphen separator is used instead of a -colon for the context lines. A line containing "--" is output between each -group of lines, unless they are in fact contiguous in the input file. The value -of \fInumber\fP is expected to be relatively small. However, \fBpcregrep\fP -guarantees to have up to 8K of preceding text available for context output. -.TP -\fB--binary-files=\fP\fIword\fP -Specify how binary files are to be processed. If the word is "binary" (the -default), pattern matching is performed on binary files, but the only output is -"Binary file matches" when a match succeeds. If the word is "text", -which is equivalent to the \fB-a\fP or \fB--text\fP option, binary files are -processed in the same way as any other file. In this case, when a match -succeeds, the output may be binary garbage, which can have nasty effects if -sent to a terminal. If the word is "without-match", which is equivalent to the -\fB-I\fP option, binary files are not processed at all; they are assumed not to -be of interest. -.TP -\fB--buffer-size=\fP\fInumber\fP -Set the parameter that controls how much memory is used for buffering files -that are being scanned. -.TP -\fB-C\fP \fInumber\fP, \fB--context=\fP\fInumber\fP -Output \fInumber\fP lines of context both before and after each matching line. -This is equivalent to setting both \fB-A\fP and \fB-B\fP to the same value. -.TP -\fB-c\fP, \fB--count\fP -Do not output individual lines from the files that are being scanned; instead -output the number of lines that would otherwise have been shown. If no lines -are selected, the number zero is output. If several files are are being -scanned, a count is output for each of them. However, if the -\fB--files-with-matches\fP option is also used, only those files whose counts -are greater than zero are listed. When \fB-c\fP is used, the \fB-A\fP, -\fB-B\fP, and \fB-C\fP options are ignored. -.TP -\fB--colour\fP, \fB--color\fP -If this option is given without any data, it is equivalent to "--colour=auto". -If data is required, it must be given in the same shell item, separated by an -equals sign. -.TP -\fB--colour=\fP\fIvalue\fP, \fB--color=\fP\fIvalue\fP -This option specifies under what circumstances the parts of a line that matched -a pattern should be coloured in the output. By default, the output is not -coloured. The value (which is optional, see above) may be "never", "always", or -"auto". In the latter case, colouring happens only if the standard output is -connected to a terminal. More resources are used when colouring is enabled, -because \fBpcregrep\fP has to search for all possible matches in a line, not -just one, in order to colour them all. -.sp -The colour that is used can be specified by setting the environment variable -PCREGREP_COLOUR or PCREGREP_COLOR. The value of this variable should be a -string of two numbers, separated by a semicolon. They are copied directly into -the control string for setting colour on a terminal, so it is your -responsibility to ensure that they make sense. If neither of the environment -variables is set, the default is "1;31", which gives red. -.TP -\fB-D\fP \fIaction\fP, \fB--devices=\fP\fIaction\fP -If an input path is not a regular file or a directory, "action" specifies how -it is to be processed. Valid values are "read" (the default) or "skip" -(silently skip the path). -.TP -\fB-d\fP \fIaction\fP, \fB--directories=\fP\fIaction\fP -If an input path is a directory, "action" specifies how it is to be processed. -Valid values are "read" (the default in non-Windows environments, for -compatibility with GNU grep), "recurse" (equivalent to the \fB-r\fP option), or -"skip" (silently skip the path, the default in Windows environments). In the -"read" case, directories are read as if they were ordinary files. In some -operating systems the effect of reading a directory like this is an immediate -end-of-file; in others it may provoke an error. -.TP -\fB-e\fP \fIpattern\fP, \fB--regex=\fP\fIpattern\fP, \fB--regexp=\fP\fIpattern\fP -Specify a pattern to be matched. This option can be used multiple times in -order to specify several patterns. It can also be used as a way of specifying a -single pattern that starts with a hyphen. When \fB-e\fP is used, no argument -pattern is taken from the command line; all arguments are treated as file -names. There is no limit to the number of patterns. They are applied to each -line in the order in which they are defined until one matches. -.sp -If \fB-f\fP is used with \fB-e\fP, the command line patterns are matched first, -followed by the patterns from the file(s), independent of the order in which -these options are specified. Note that multiple use of \fB-e\fP is not the same -as a single pattern with alternatives. For example, X|Y finds the first -character in a line that is X or Y, whereas if the two patterns are given -separately, with X first, \fBpcregrep\fP finds X if it is present, even if it -follows Y in the line. It finds Y only if there is no X in the line. This -matters only if you are using \fB-o\fP or \fB--colo(u)r\fP to show the part(s) -of the line that matched. -.TP -\fB--exclude\fP=\fIpattern\fP -Files (but not directories) whose names match the pattern are skipped without -being processed. This applies to all files, whether listed on the command line, -obtained from \fB--file-list\fP, or by scanning a directory. The pattern is a -PCRE regular expression, and is matched against the final component of the file -name, not the entire path. The \fB-F\fP, \fB-w\fP, and \fB-x\fP options do not -apply to this pattern. The option may be given any number of times in order to -specify multiple patterns. If a file name matches both an \fB--include\fP -and an \fB--exclude\fP pattern, it is excluded. There is no short form for this -option. -.TP -\fB--exclude-from=\fP\fIfilename\fP -Treat each non-empty line of the file as the data for an \fB--exclude\fP -option. What constitutes a newline when reading the file is the operating -system's default. The \fB--newline\fP option has no effect on this option. This -option may be given more than once in order to specify a number of files to -read. -.TP -\fB--exclude-dir\fP=\fIpattern\fP -Directories whose names match the pattern are skipped without being processed, -whatever the setting of the \fB--recursive\fP option. This applies to all -directories, whether listed on the command line, obtained from -\fB--file-list\fP, or by scanning a parent directory. The pattern is a PCRE -regular expression, and is matched against the final component of the directory -name, not the entire path. The \fB-F\fP, \fB-w\fP, and \fB-x\fP options do not -apply to this pattern. The option may be given any number of times in order to -specify more than one pattern. If a directory matches both \fB--include-dir\fP -and \fB--exclude-dir\fP, it is excluded. There is no short form for this -option. -.TP -\fB-F\fP, \fB--fixed-strings\fP -Interpret each data-matching pattern as a list of fixed strings, separated by -newlines, instead of as a regular expression. What constitutes a newline for -this purpose is controlled by the \fB--newline\fP option. The \fB-w\fP (match -as a word) and \fB-x\fP (match whole line) options can be used with \fB-F\fP. -They apply to each of the fixed strings. A line is selected if any of the fixed -strings are found in it (subject to \fB-w\fP or \fB-x\fP, if present). This -option applies only to the patterns that are matched against the contents of -files; it does not apply to patterns specified by any of the \fB--include\fP or -\fB--exclude\fP options. -.TP -\fB-f\fP \fIfilename\fP, \fB--file=\fP\fIfilename\fP -Read patterns from the file, one per line, and match them against -each line of input. What constitutes a newline when reading the file is the -operating system's default. The \fB--newline\fP option has no effect on this -option. Trailing white space is removed from each line, and blank lines are -ignored. An empty file contains no patterns and therefore matches nothing. See -also the comments about multiple patterns versus a single pattern with -alternatives in the description of \fB-e\fP above. -.sp -If this option is given more than once, all the specified files are -read. A data line is output if any of the patterns match it. A filename can -be given as "-" to refer to the standard input. When \fB-f\fP is used, patterns -specified on the command line using \fB-e\fP may also be present; they are -tested before the file's patterns. However, no other pattern is taken from the -command line; all arguments are treated as the names of paths to be searched. -.TP -\fB--file-list\fP=\fIfilename\fP -Read a list of files and/or directories that are to be scanned from the given -file, one per line. Trailing white space is removed from each line, and blank -lines are ignored. These paths are processed before any that are listed on the -command line. The filename can be given as "-" to refer to the standard input. -If \fB--file\fP and \fB--file-list\fP are both specified as "-", patterns are -read first. This is useful only when the standard input is a terminal, from -which further lines (the list of files) can be read after an end-of-file -indication. If this option is given more than once, all the specified files are -read. -.TP -\fB--file-offsets\fP -Instead of showing lines or parts of lines that match, show each match as an -offset from the start of the file and a length, separated by a comma. In this -mode, no context is shown. That is, the \fB-A\fP, \fB-B\fP, and \fB-C\fP -options are ignored. If there is more than one match in a line, each of them is -shown separately. This option is mutually exclusive with \fB--line-offsets\fP -and \fB--only-matching\fP. -.TP -\fB-H\fP, \fB--with-filename\fP -Force the inclusion of the filename at the start of output lines when searching -a single file. By default, the filename is not shown in this case. For matching -lines, the filename is followed by a colon; for context lines, a hyphen -separator is used. If a line number is also being output, it follows the file -name. -.TP -\fB-h\fP, \fB--no-filename\fP -Suppress the output filenames when searching multiple files. By default, -filenames are shown when multiple files are searched. For matching lines, the -filename is followed by a colon; for context lines, a hyphen separator is used. -If a line number is also being output, it follows the file name. -.TP -\fB--help\fP -Output a help message, giving brief details of the command options and file -type support, and then exit. Anything else on the command line is -ignored. -.TP -\fB-I\fP -Treat binary files as never matching. This is equivalent to -\fB--binary-files\fP=\fIwithout-match\fP. -.TP -\fB-i\fP, \fB--ignore-case\fP -Ignore upper/lower case distinctions during comparisons. -.TP -\fB--include\fP=\fIpattern\fP -If any \fB--include\fP patterns are specified, the only files that are -processed are those that match one of the patterns (and do not match an -\fB--exclude\fP pattern). This option does not affect directories, but it -applies to all files, whether listed on the command line, obtained from -\fB--file-list\fP, or by scanning a directory. The pattern is a PCRE regular -expression, and is matched against the final component of the file name, not -the entire path. The \fB-F\fP, \fB-w\fP, and \fB-x\fP options do not apply to -this pattern. The option may be given any number of times. If a file name -matches both an \fB--include\fP and an \fB--exclude\fP pattern, it is excluded. -There is no short form for this option. -.TP -\fB--include-from=\fP\fIfilename\fP -Treat each non-empty line of the file as the data for an \fB--include\fP -option. What constitutes a newline for this purpose is the operating system's -default. The \fB--newline\fP option has no effect on this option. This option -may be given any number of times; all the files are read. -.TP -\fB--include-dir\fP=\fIpattern\fP -If any \fB--include-dir\fP patterns are specified, the only directories that -are processed are those that match one of the patterns (and do not match an -\fB--exclude-dir\fP pattern). This applies to all directories, whether listed -on the command line, obtained from \fB--file-list\fP, or by scanning a parent -directory. The pattern is a PCRE regular expression, and is matched against the -final component of the directory name, not the entire path. The \fB-F\fP, -\fB-w\fP, and \fB-x\fP options do not apply to this pattern. The option may be -given any number of times. If a directory matches both \fB--include-dir\fP and -\fB--exclude-dir\fP, it is excluded. There is no short form for this option. -.TP -\fB-L\fP, \fB--files-without-match\fP -Instead of outputting lines from the files, just output the names of the files -that do not contain any lines that would have been output. Each file name is -output once, on a separate line. -.TP -\fB-l\fP, \fB--files-with-matches\fP -Instead of outputting lines from the files, just output the names of the files -containing lines that would have been output. Each file name is output -once, on a separate line. Searching normally stops as soon as a matching line -is found in a file. However, if the \fB-c\fP (count) option is also used, -matching continues in order to obtain the correct count, and those files that -have at least one match are listed along with their counts. Using this option -with \fB-c\fP is a way of suppressing the listing of files with no matches. -.TP -\fB--label\fP=\fIname\fP -This option supplies a name to be used for the standard input when file names -are being output. If not supplied, "(standard input)" is used. There is no -short form for this option. -.TP -\fB--line-buffered\fP -When this option is given, input is read and processed line by line, and the -output is flushed after each write. By default, input is read in large chunks, -unless \fBpcregrep\fP can determine that it is reading from a terminal (which -is currently possible only in Unix-like environments). Output to terminal is -normally automatically flushed by the operating system. This option can be -useful when the input or output is attached to a pipe and you do not want -\fBpcregrep\fP to buffer up large amounts of data. However, its use will affect -performance, and the \fB-M\fP (multiline) option ceases to work. -.TP -\fB--line-offsets\fP -Instead of showing lines or parts of lines that match, show each match as a -line number, the offset from the start of the line, and a length. The line -number is terminated by a colon (as usual; see the \fB-n\fP option), and the -offset and length are separated by a comma. In this mode, no context is shown. -That is, the \fB-A\fP, \fB-B\fP, and \fB-C\fP options are ignored. If there is -more than one match in a line, each of them is shown separately. This option is -mutually exclusive with \fB--file-offsets\fP and \fB--only-matching\fP. -.TP -\fB--locale\fP=\fIlocale-name\fP -This option specifies a locale to be used for pattern matching. It overrides -the value in the \fBLC_ALL\fP or \fBLC_CTYPE\fP environment variables. If no -locale is specified, the PCRE library's default (usually the "C" locale) is -used. There is no short form for this option. -.TP -\fB--match-limit\fP=\fInumber\fP -Processing some regular expression patterns can require a very large amount of -memory, leading in some cases to a program crash if not enough is available. -Other patterns may take a very long time to search for all possible matching -strings. The \fBpcre_exec()\fP function that is called by \fBpcregrep\fP to do -the matching has two parameters that can limit the resources that it uses. -.sp -The \fB--match-limit\fP option provides a means of limiting resource usage -when processing patterns that are not going to match, but which have a very -large number of possibilities in their search trees. The classic example is a -pattern that uses nested unlimited repeats. Internally, PCRE uses a function -called \fBmatch()\fP which it calls repeatedly (sometimes recursively). The -limit set by \fB--match-limit\fP is imposed on the number of times this -function is called during a match, which has the effect of limiting the amount -of backtracking that can take place. -.sp -The \fB--recursion-limit\fP option is similar to \fB--match-limit\fP, but -instead of limiting the total number of times that \fBmatch()\fP is called, it -limits the depth of recursive calls, which in turn limits the amount of memory -that can be used. The recursion depth is a smaller number than the total number -of calls, because not all calls to \fBmatch()\fP are recursive. This limit is -of use only if it is set smaller than \fB--match-limit\fP. -.sp -There are no short forms for these options. The default settings are specified -when the PCRE library is compiled, with the default default being 10 million. -.TP -\fB-M\fP, \fB--multiline\fP -Allow patterns to match more than one line. When this option is given, patterns -may usefully contain literal newline characters and internal occurrences of ^ -and $ characters. The output for a successful match may consist of more than -one line, the last of which is the one in which the match ended. If the matched -string ends with a newline sequence the output ends at the end of that line. -.sp -When this option is set, the PCRE library is called in "multiline" mode. -There is a limit to the number of lines that can be matched, imposed by the way -that \fBpcregrep\fP buffers the input file as it scans it. However, -\fBpcregrep\fP ensures that at least 8K characters or the rest of the document -(whichever is the shorter) are available for forward matching, and similarly -the previous 8K characters (or all the previous characters, if fewer than 8K) -are guaranteed to be available for lookbehind assertions. This option does not -work when input is read line by line (see \fP--line-buffered\fP.) -.TP -\fB-N\fP \fInewline-type\fP, \fB--newline\fP=\fInewline-type\fP -The PCRE library supports five different conventions for indicating -the ends of lines. They are the single-character sequences CR (carriage return) -and LF (linefeed), the two-character sequence CRLF, an "anycrlf" convention, -which recognizes any of the preceding three types, and an "any" convention, in -which any Unicode line ending sequence is assumed to end a line. The Unicode -sequences are the three just mentioned, plus VT (vertical tab, U+000B), FF -(form feed, U+000C), NEL (next line, U+0085), LS (line separator, U+2028), and -PS (paragraph separator, U+2029). -.sp -When the PCRE library is built, a default line-ending sequence is specified. -This is normally the standard sequence for the operating system. Unless -otherwise specified by this option, \fBpcregrep\fP uses the library's default. -The possible values for this option are CR, LF, CRLF, ANYCRLF, or ANY. This -makes it possible to use \fBpcregrep\fP to scan files that have come from other -environments without having to modify their line endings. If the data that is -being scanned does not agree with the convention set by this option, -\fBpcregrep\fP may behave in strange ways. Note that this option does not -apply to files specified by the \fB-f\fP, \fB--exclude-from\fP, or -\fB--include-from\fP options, which are expected to use the operating system's -standard newline sequence. -.TP -\fB-n\fP, \fB--line-number\fP -Precede each output line by its line number in the file, followed by a colon -for matching lines or a hyphen for context lines. If the filename is also being -output, it precedes the line number. This option is forced if -\fB--line-offsets\fP is used. -.TP -\fB--no-jit\fP -If the PCRE library is built with support for just-in-time compiling (which -speeds up matching), \fBpcregrep\fP automatically makes use of this, unless it -was explicitly disabled at build time. This option can be used to disable the -use of JIT at run time. It is provided for testing and working round problems. -It should never be needed in normal use. -.TP -\fB-o\fP, \fB--only-matching\fP -Show only the part of the line that matched a pattern instead of the whole -line. In this mode, no context is shown. That is, the \fB-A\fP, \fB-B\fP, and -\fB-C\fP options are ignored. If there is more than one match in a line, each -of them is shown separately. If \fB-o\fP is combined with \fB-v\fP (invert the -sense of the match to find non-matching lines), no output is generated, but the -return code is set appropriately. If the matched portion of the line is empty, -nothing is output unless the file name or line number are being printed, in -which case they are shown on an otherwise empty line. This option is mutually -exclusive with \fB--file-offsets\fP and \fB--line-offsets\fP. -.TP -\fB-o\fP\fInumber\fP, \fB--only-matching\fP=\fInumber\fP -Show only the part of the line that matched the capturing parentheses of the -given number. Up to 32 capturing parentheses are supported, and -o0 is -equivalent to \fB-o\fP without a number. Because these options can be given -without an argument (see above), if an argument is present, it must be given in -the same shell item, for example, -o3 or --only-matching=2. The comments given -for the non-argument case above also apply to this case. If the specified -capturing parentheses do not exist in the pattern, or were not set in the -match, nothing is output unless the file name or line number are being printed. -.sp -If this option is given multiple times, multiple substrings are output, in the -order the options are given. For example, -o3 -o1 -o3 causes the substrings -matched by capturing parentheses 3 and 1 and then 3 again to be output. By -default, there is no separator (but see the next option). -.TP -\fB--om-separator\fP=\fItext\fP -Specify a separating string for multiple occurrences of \fB-o\fP. The default -is an empty string. Separating strings are never coloured. -.TP -\fB-q\fP, \fB--quiet\fP -Work quietly, that is, display nothing except error messages. The exit -status indicates whether or not any matches were found. -.TP -\fB-r\fP, \fB--recursive\fP -If any given path is a directory, recursively scan the files it contains, -taking note of any \fB--include\fP and \fB--exclude\fP settings. By default, a -directory is read as a normal file; in some operating systems this gives an -immediate end-of-file. This option is a shorthand for setting the \fB-d\fP -option to "recurse". -.TP -\fB--recursion-limit\fP=\fInumber\fP -See \fB--match-limit\fP above. -.TP -\fB-s\fP, \fB--no-messages\fP -Suppress error messages about non-existent or unreadable files. Such files are -quietly skipped. However, the return code is still 2, even if matches were -found in other files. -.TP -\fB-u\fP, \fB--utf-8\fP -Operate in UTF-8 mode. This option is available only if PCRE has been compiled -with UTF-8 support. All patterns (including those for any \fB--exclude\fP and -\fB--include\fP options) and all subject lines that are scanned must be valid -strings of UTF-8 characters. -.TP -\fB-V\fP, \fB--version\fP -Write the version numbers of \fBpcregrep\fP and the PCRE library to the -standard output and then exit. Anything else on the command line is -ignored. -.TP -\fB-v\fP, \fB--invert-match\fP -Invert the sense of the match, so that lines which do \fInot\fP match any of -the patterns are the ones that are found. -.TP -\fB-w\fP, \fB--word-regex\fP, \fB--word-regexp\fP -Force the patterns to match only whole words. This is equivalent to having \eb -at the start and end of the pattern. This option applies only to the patterns -that are matched against the contents of files; it does not apply to patterns -specified by any of the \fB--include\fP or \fB--exclude\fP options. -.TP -\fB-x\fP, \fB--line-regex\fP, \fB--line-regexp\fP -Force the patterns to be anchored (each must start matching at the beginning of -a line) and in addition, require them to match entire lines. This is equivalent -to having ^ and $ characters at the start and end of each alternative branch in -every pattern. This option applies only to the patterns that are matched -against the contents of files; it does not apply to patterns specified by any -of the \fB--include\fP or \fB--exclude\fP options. -. -. -.SH "ENVIRONMENT VARIABLES" -.rs -.sp -The environment variables \fBLC_ALL\fP and \fBLC_CTYPE\fP are examined, in that -order, for a locale. The first one that is set is used. This can be overridden -by the \fB--locale\fP option. If no locale is set, the PCRE library's default -(usually the "C" locale) is used. -. -. -.SH "NEWLINES" -.rs -.sp -The \fB-N\fP (\fB--newline\fP) option allows \fBpcregrep\fP to scan files with -different newline conventions from the default. Any parts of the input files -that are written to the standard output are copied identically, with whatever -newline sequences they have in the input. However, the setting of this option -does not affect the interpretation of files specified by the \fB-f\fP, -\fB--exclude-from\fP, or \fB--include-from\fP options, which are assumed to use -the operating system's standard newline sequence, nor does it affect the way in -which \fBpcregrep\fP writes informational messages to the standard error and -output streams. For these it uses the string "\en" to indicate newlines, -relying on the C I/O library to convert this to an appropriate sequence. -. -. -.SH "OPTIONS COMPATIBILITY" -.rs -.sp -Many of the short and long forms of \fBpcregrep\fP's options are the same -as in the GNU \fBgrep\fP program. Any long option of the form -\fB--xxx-regexp\fP (GNU terminology) is also available as \fB--xxx-regex\fP -(PCRE terminology). However, the \fB--file-list\fP, \fB--file-offsets\fP, -\fB--include-dir\fP, \fB--line-offsets\fP, \fB--locale\fP, \fB--match-limit\fP, -\fB-M\fP, \fB--multiline\fP, \fB-N\fP, \fB--newline\fP, \fB--om-separator\fP, -\fB--recursion-limit\fP, \fB-u\fP, and \fB--utf-8\fP options are specific to -\fBpcregrep\fP, as is the use of the \fB--only-matching\fP option with a -capturing parentheses number. -.P -Although most of the common options work the same way, a few are different in -\fBpcregrep\fP. For example, the \fB--include\fP option's argument is a glob -for GNU \fBgrep\fP, but a regular expression for \fBpcregrep\fP. If both the -\fB-c\fP and \fB-l\fP options are given, GNU grep lists only file names, -without counts, but \fBpcregrep\fP gives the counts. -. -. -.SH "OPTIONS WITH DATA" -.rs -.sp -There are four different ways in which an option with data can be specified. -If a short form option is used, the data may follow immediately, or (with one -exception) in the next command line item. For example: -.sp - -f/some/file - -f /some/file -.sp -The exception is the \fB-o\fP option, which may appear with or without data. -Because of this, if data is present, it must follow immediately in the same -item, for example -o3. -.P -If a long form option is used, the data may appear in the same command line -item, separated by an equals character, or (with two exceptions) it may appear -in the next command line item. For example: -.sp - --file=/some/file - --file /some/file -.sp -Note, however, that if you want to supply a file name beginning with ~ as data -in a shell command, and have the shell expand ~ to a home directory, you must -separate the file name from the option, because the shell does not treat ~ -specially unless it is at the start of an item. -.P -The exceptions to the above are the \fB--colour\fP (or \fB--color\fP) and -\fB--only-matching\fP options, for which the data is optional. If one of these -options does have data, it must be given in the first form, using an equals -character. Otherwise \fBpcregrep\fP will assume that it has no data. -. -. -.SH "MATCHING ERRORS" -.rs -.sp -It is possible to supply a regular expression that takes a very long time to -fail to match certain lines. Such patterns normally involve nested indefinite -repeats, for example: (a+)*\ed when matched against a line of a's with no final -digit. The PCRE matching function has a resource limit that causes it to abort -in these circumstances. If this happens, \fBpcregrep\fP outputs an error -message and the line that caused the problem to the standard error stream. If -there are more than 20 such errors, \fBpcregrep\fP gives up. -.P -The \fB--match-limit\fP option of \fBpcregrep\fP can be used to set the overall -resource limit; there is a second option called \fB--recursion-limit\fP that -sets a limit on the amount of memory (usually stack) that is used (see the -discussion of these options above). -. -. -.SH DIAGNOSTICS -.rs -.sp -Exit status is 0 if any matches were found, 1 if no matches were found, and 2 -for syntax errors, overlong lines, non-existent or inaccessible files (even if -matches were found in other files) or too many matching errors. Using the -\fB-s\fP option to suppress error messages about inaccessible files does not -affect the return code. -. -. -.SH "SEE ALSO" -.rs -.sp -\fBpcrepattern\fP(3), \fBpcresyntax\fP(3), \fBpcretest\fP(1). -. -. -.SH AUTHOR -.rs -.sp -.nf -Philip Hazel -University Computing Service -Cambridge CB2 3QH, England. -.fi -. -. -.SH REVISION -.rs -.sp -.nf -Last updated: 03 April 2014 -Copyright (c) 1997-2014 University of Cambridge. -.fi diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man1/pcretest.1 b/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man1/pcretest.1 deleted file mode 100644 index ea7457c0..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man1/pcretest.1 +++ /dev/null @@ -1,1160 +0,0 @@ -.TH PCRETEST 1 "23 February 2017" "PCRE 8.41" -.SH NAME -pcretest - a program for testing Perl-compatible regular expressions. -.SH SYNOPSIS -.rs -.sp -.B pcretest "[options] [input file [output file]]" -.sp -\fBpcretest\fP was written as a test program for the PCRE regular expression -library itself, but it can also be used for experimenting with regular -expressions. This document describes the features of the test program; for -details of the regular expressions themselves, see the -.\" HREF -\fBpcrepattern\fP -.\" -documentation. For details of the PCRE library function calls and their -options, see the -.\" HREF -\fBpcreapi\fP -.\" -, -.\" HREF -\fBpcre16\fP -and -.\" HREF -\fBpcre32\fP -.\" -documentation. -.P -The input for \fBpcretest\fP is a sequence of regular expression patterns and -strings to be matched, as described below. The output shows the result of each -match. Options on the command line and the patterns control PCRE options and -exactly what is output. -.P -As PCRE has evolved, it has acquired many different features, and as a result, -\fBpcretest\fP now has rather a lot of obscure options for testing every -possible feature. Some of these options are specifically designed for use in -conjunction with the test script and data files that are distributed as part of -PCRE, and are unlikely to be of use otherwise. They are all documented here, -but without much justification. -. -. -.SH "INPUT DATA FORMAT" -.rs -.sp -Input to \fBpcretest\fP is processed line by line, either by calling the C -library's \fBfgets()\fP function, or via the \fBlibreadline\fP library (see -below). In Unix-like environments, \fBfgets()\fP treats any bytes other than -newline as data characters. However, in some Windows environments character 26 -(hex 1A) causes an immediate end of file, and no further data is read. For -maximum portability, therefore, it is safest to use only ASCII characters in -\fBpcretest\fP input files. -.P -The input is processed using using C's string functions, so must not -contain binary zeroes, even though in Unix-like environments, \fBfgets()\fP -treats any bytes other than newline as data characters. -. -. -.SH "PCRE's 8-BIT, 16-BIT AND 32-BIT LIBRARIES" -.rs -.sp -From release 8.30, two separate PCRE libraries can be built. The original one -supports 8-bit character strings, whereas the newer 16-bit library supports -character strings encoded in 16-bit units. From release 8.32, a third library -can be built, supporting character strings encoded in 32-bit units. The -\fBpcretest\fP program can be used to test all three libraries. However, it is -itself still an 8-bit program, reading 8-bit input and writing 8-bit output. -When testing the 16-bit or 32-bit library, the patterns and data strings are -converted to 16- or 32-bit format before being passed to the PCRE library -functions. Results are converted to 8-bit for output. -.P -References to functions and structures of the form \fBpcre[16|32]_xx\fP below -mean "\fBpcre_xx\fP when using the 8-bit library, \fBpcre16_xx\fP when using -the 16-bit library, or \fBpcre32_xx\fP when using the 32-bit library". -. -. -.SH "COMMAND LINE OPTIONS" -.rs -.TP 10 -\fB-8\fP -If both the 8-bit library has been built, this option causes the 8-bit library -to be used (which is the default); if the 8-bit library has not been built, -this option causes an error. -.TP 10 -\fB-16\fP -If both the 8-bit or the 32-bit, and the 16-bit libraries have been built, this -option causes the 16-bit library to be used. If only the 16-bit library has been -built, this is the default (so has no effect). If only the 8-bit or the 32-bit -library has been built, this option causes an error. -.TP 10 -\fB-32\fP -If both the 8-bit or the 16-bit, and the 32-bit libraries have been built, this -option causes the 32-bit library to be used. If only the 32-bit library has been -built, this is the default (so has no effect). If only the 8-bit or the 16-bit -library has been built, this option causes an error. -.TP 10 -\fB-b\fP -Behave as if each pattern has the \fB/B\fP (show byte code) modifier; the -internal form is output after compilation. -.TP 10 -\fB-C\fP -Output the version number of the PCRE library, and all available information -about the optional features that are included, and then exit with zero exit -code. All other options are ignored. -.TP 10 -\fB-C\fP \fIoption\fP -Output information about a specific build-time option, then exit. This -functionality is intended for use in scripts such as \fBRunTest\fP. The -following options output the value and set the exit code as indicated: -.sp - ebcdic-nl the code for LF (= NL) in an EBCDIC environment: - 0x15 or 0x25 - 0 if used in an ASCII environment - exit code is always 0 - linksize the configured internal link size (2, 3, or 4) - exit code is set to the link size - newline the default newline setting: - CR, LF, CRLF, ANYCRLF, or ANY - exit code is always 0 - bsr the default setting for what \eR matches: - ANYCRLF or ANY - exit code is always 0 -.sp -The following options output 1 for true or 0 for false, and set the exit code -to the same value: -.sp - ebcdic compiled for an EBCDIC environment - jit just-in-time support is available - pcre16 the 16-bit library was built - pcre32 the 32-bit library was built - pcre8 the 8-bit library was built - ucp Unicode property support is available - utf UTF-8 and/or UTF-16 and/or UTF-32 support - is available -.sp -If an unknown option is given, an error message is output; the exit code is 0. -.TP 10 -\fB-d\fP -Behave as if each pattern has the \fB/D\fP (debug) modifier; the internal -form and information about the compiled pattern is output after compilation; -\fB-d\fP is equivalent to \fB-b -i\fP. -.TP 10 -\fB-dfa\fP -Behave as if each data line contains the \eD escape sequence; this causes the -alternative matching function, \fBpcre[16|32]_dfa_exec()\fP, to be used instead -of the standard \fBpcre[16|32]_exec()\fP function (more detail is given below). -.TP 10 -\fB-help\fP -Output a brief summary these options and then exit. -.TP 10 -\fB-i\fP -Behave as if each pattern has the \fB/I\fP modifier; information about the -compiled pattern is given after compilation. -.TP 10 -\fB-M\fP -Behave as if each data line contains the \eM escape sequence; this causes -PCRE to discover the minimum MATCH_LIMIT and MATCH_LIMIT_RECURSION settings by -calling \fBpcre[16|32]_exec()\fP repeatedly with different limits. -.TP 10 -\fB-m\fP -Output the size of each compiled pattern after it has been compiled. This is -equivalent to adding \fB/M\fP to each regular expression. The size is given in -bytes for both libraries. -.TP 10 -\fB-O\fP -Behave as if each pattern has the \fB/O\fP modifier, that is disable -auto-possessification for all patterns. -.TP 10 -\fB-o\fP \fIosize\fP -Set the number of elements in the output vector that is used when calling -\fBpcre[16|32]_exec()\fP or \fBpcre[16|32]_dfa_exec()\fP to be \fIosize\fP. The -default value is 45, which is enough for 14 capturing subexpressions for -\fBpcre[16|32]_exec()\fP or 22 different matches for -\fBpcre[16|32]_dfa_exec()\fP. -The vector size can be changed for individual matching calls by including \eO -in the data line (see below). -.TP 10 -\fB-p\fP -Behave as if each pattern has the \fB/P\fP modifier; the POSIX wrapper API is -used to call PCRE. None of the other options has any effect when \fB-p\fP is -set. This option can be used only with the 8-bit library. -.TP 10 -\fB-q\fP -Do not output the version number of \fBpcretest\fP at the start of execution. -.TP 10 -\fB-S\fP \fIsize\fP -On Unix-like systems, set the size of the run-time stack to \fIsize\fP -megabytes. -.TP 10 -\fB-s\fP or \fB-s+\fP -Behave as if each pattern has the \fB/S\fP modifier; in other words, force each -pattern to be studied. If \fB-s+\fP is used, all the JIT compile options are -passed to \fBpcre[16|32]_study()\fP, causing just-in-time optimization to be set -up if it is available, for both full and partial matching. Specific JIT compile -options can be selected by following \fB-s+\fP with a digit in the range 1 to -7, which selects the JIT compile modes as follows: -.sp - 1 normal match only - 2 soft partial match only - 3 normal match and soft partial match - 4 hard partial match only - 6 soft and hard partial match - 7 all three modes (default) -.sp -If \fB-s++\fP is used instead of \fB-s+\fP (with or without a following digit), -the text "(JIT)" is added to the first output line after a match or no match -when JIT-compiled code was actually used. -.sp -Note that there are pattern options that can override \fB-s\fP, either -specifying no studying at all, or suppressing JIT compilation. -.sp -If the \fB/I\fP or \fB/D\fP option is present on a pattern (requesting output -about the compiled pattern), information about the result of studying is not -included when studying is caused only by \fB-s\fP and neither \fB-i\fP nor -\fB-d\fP is present on the command line. This behaviour means that the output -from tests that are run with and without \fB-s\fP should be identical, except -when options that output information about the actual running of a match are -set. -.sp -The \fB-M\fP, \fB-t\fP, and \fB-tm\fP options, which give information about -resources used, are likely to produce different output with and without -\fB-s\fP. Output may also differ if the \fB/C\fP option is present on an -individual pattern. This uses callouts to trace the the matching process, and -this may be different between studied and non-studied patterns. If the pattern -contains (*MARK) items there may also be differences, for the same reason. The -\fB-s\fP command line option can be overridden for specific patterns that -should never be studied (see the \fB/S\fP pattern modifier below). -.TP 10 -\fB-t\fP -Run each compile, study, and match many times with a timer, and output the -resulting times per compile, study, or match (in milliseconds). Do not set -\fB-m\fP with \fB-t\fP, because you will then get the size output a zillion -times, and the timing will be distorted. You can control the number of -iterations that are used for timing by following \fB-t\fP with a number (as a -separate item on the command line). For example, "-t 1000" iterates 1000 times. -The default is to iterate 500000 times. -.TP 10 -\fB-tm\fP -This is like \fB-t\fP except that it times only the matching phase, not the -compile or study phases. -.TP 10 -\fB-T\fP \fB-TM\fP -These behave like \fB-t\fP and \fB-tm\fP, but in addition, at the end of a run, -the total times for all compiles, studies, and matches are output. -. -. -.SH DESCRIPTION -.rs -.sp -If \fBpcretest\fP is given two filename arguments, it reads from the first and -writes to the second. If it is given only one filename argument, it reads from -that file and writes to stdout. Otherwise, it reads from stdin and writes to -stdout, and prompts for each line of input, using "re>" to prompt for regular -expressions, and "data>" to prompt for data lines. -.P -When \fBpcretest\fP is built, a configuration option can specify that it should -be linked with the \fBlibreadline\fP library. When this is done, if the input -is from a terminal, it is read using the \fBreadline()\fP function. This -provides line-editing and history facilities. The output from the \fB-help\fP -option states whether or not \fBreadline()\fP will be used. -.P -The program handles any number of sets of input on a single input file. Each -set starts with a regular expression, and continues with any number of data -lines to be matched against that pattern. -.P -Each data line is matched separately and independently. If you want to do -multi-line matches, you have to use the \en escape sequence (or \er or \er\en, -etc., depending on the newline setting) in a single line of input to encode the -newline sequences. There is no limit on the length of data lines; the input -buffer is automatically extended if it is too small. -.P -An empty line signals the end of the data lines, at which point a new regular -expression is read. The regular expressions are given enclosed in any -non-alphanumeric delimiters other than backslash, for example: -.sp - /(a|bc)x+yz/ -.sp -White space before the initial delimiter is ignored. A regular expression may -be continued over several input lines, in which case the newline characters are -included within it. It is possible to include the delimiter within the pattern -by escaping it, for example -.sp - /abc\e/def/ -.sp -If you do so, the escape and the delimiter form part of the pattern, but since -delimiters are always non-alphanumeric, this does not affect its interpretation. -If the terminating delimiter is immediately followed by a backslash, for -example, -.sp - /abc/\e -.sp -then a backslash is added to the end of the pattern. This is done to provide a -way of testing the error condition that arises if a pattern finishes with a -backslash, because -.sp - /abc\e/ -.sp -is interpreted as the first line of a pattern that starts with "abc/", causing -pcretest to read the next line as a continuation of the regular expression. -. -. -.SH "PATTERN MODIFIERS" -.rs -.sp -A pattern may be followed by any number of modifiers, which are mostly single -characters, though some of these can be qualified by further characters. -Following Perl usage, these are referred to below as, for example, "the -\fB/i\fP modifier", even though the delimiter of the pattern need not always be -a slash, and no slash is used when writing modifiers. White space may appear -between the final pattern delimiter and the first modifier, and between the -modifiers themselves. For reference, here is a complete list of modifiers. They -fall into several groups that are described in detail in the following -sections. -.sp - \fB/8\fP set UTF mode - \fB/9\fP set PCRE_NEVER_UTF (locks out UTF mode) - \fB/?\fP disable UTF validity check - \fB/+\fP show remainder of subject after match - \fB/=\fP show all captures (not just those that are set) -.sp - \fB/A\fP set PCRE_ANCHORED - \fB/B\fP show compiled code - \fB/C\fP set PCRE_AUTO_CALLOUT - \fB/D\fP same as \fB/B\fP plus \fB/I\fP - \fB/E\fP set PCRE_DOLLAR_ENDONLY - \fB/F\fP flip byte order in compiled pattern - \fB/f\fP set PCRE_FIRSTLINE - \fB/G\fP find all matches (shorten string) - \fB/g\fP find all matches (use startoffset) - \fB/I\fP show information about pattern - \fB/i\fP set PCRE_CASELESS - \fB/J\fP set PCRE_DUPNAMES - \fB/K\fP show backtracking control names - \fB/L\fP set locale - \fB/M\fP show compiled memory size - \fB/m\fP set PCRE_MULTILINE - \fB/N\fP set PCRE_NO_AUTO_CAPTURE - \fB/O\fP set PCRE_NO_AUTO_POSSESS - \fB/P\fP use the POSIX wrapper - \fB/Q\fP test external stack check function - \fB/S\fP study the pattern after compilation - \fB/s\fP set PCRE_DOTALL - \fB/T\fP select character tables - \fB/U\fP set PCRE_UNGREEDY - \fB/W\fP set PCRE_UCP - \fB/X\fP set PCRE_EXTRA - \fB/x\fP set PCRE_EXTENDED - \fB/Y\fP set PCRE_NO_START_OPTIMIZE - \fB/Z\fP don't show lengths in \fB/B\fP output -.sp - \fB/\fP set PCRE_NEWLINE_ANY - \fB/\fP set PCRE_NEWLINE_ANYCRLF - \fB/\fP set PCRE_NEWLINE_CR - \fB/\fP set PCRE_NEWLINE_CRLF - \fB/\fP set PCRE_NEWLINE_LF - \fB/\fP set PCRE_BSR_ANYCRLF - \fB/\fP set PCRE_BSR_UNICODE - \fB/\fP set PCRE_JAVASCRIPT_COMPAT -.sp -. -. -.SS "Perl-compatible modifiers" -.rs -.sp -The \fB/i\fP, \fB/m\fP, \fB/s\fP, and \fB/x\fP modifiers set the PCRE_CASELESS, -PCRE_MULTILINE, PCRE_DOTALL, or PCRE_EXTENDED options, respectively, when -\fBpcre[16|32]_compile()\fP is called. These four modifier letters have the same -effect as they do in Perl. For example: -.sp - /caseless/i -.sp -. -. -.SS "Modifiers for other PCRE options" -.rs -.sp -The following table shows additional modifiers for setting PCRE compile-time -options that do not correspond to anything in Perl: -.sp - \fB/8\fP PCRE_UTF8 ) when using the 8-bit - \fB/?\fP PCRE_NO_UTF8_CHECK ) library -.sp - \fB/8\fP PCRE_UTF16 ) when using the 16-bit - \fB/?\fP PCRE_NO_UTF16_CHECK ) library -.sp - \fB/8\fP PCRE_UTF32 ) when using the 32-bit - \fB/?\fP PCRE_NO_UTF32_CHECK ) library -.sp - \fB/9\fP PCRE_NEVER_UTF - \fB/A\fP PCRE_ANCHORED - \fB/C\fP PCRE_AUTO_CALLOUT - \fB/E\fP PCRE_DOLLAR_ENDONLY - \fB/f\fP PCRE_FIRSTLINE - \fB/J\fP PCRE_DUPNAMES - \fB/N\fP PCRE_NO_AUTO_CAPTURE - \fB/O\fP PCRE_NO_AUTO_POSSESS - \fB/U\fP PCRE_UNGREEDY - \fB/W\fP PCRE_UCP - \fB/X\fP PCRE_EXTRA - \fB/Y\fP PCRE_NO_START_OPTIMIZE - \fB/\fP PCRE_NEWLINE_ANY - \fB/\fP PCRE_NEWLINE_ANYCRLF - \fB/\fP PCRE_NEWLINE_CR - \fB/\fP PCRE_NEWLINE_CRLF - \fB/\fP PCRE_NEWLINE_LF - \fB/\fP PCRE_BSR_ANYCRLF - \fB/\fP PCRE_BSR_UNICODE - \fB/\fP PCRE_JAVASCRIPT_COMPAT -.sp -The modifiers that are enclosed in angle brackets are literal strings as shown, -including the angle brackets, but the letters within can be in either case. -This example sets multiline matching with CRLF as the line ending sequence: -.sp - /^abc/m -.sp -As well as turning on the PCRE_UTF8/16/32 option, the \fB/8\fP modifier causes -all non-printing characters in output strings to be printed using the -\ex{hh...} notation. Otherwise, those less than 0x100 are output in hex without -the curly brackets. -.P -Full details of the PCRE options are given in the -.\" HREF -\fBpcreapi\fP -.\" -documentation. -. -. -.SS "Finding all matches in a string" -.rs -.sp -Searching for all possible matches within each subject string can be requested -by the \fB/g\fP or \fB/G\fP modifier. After finding a match, PCRE is called -again to search the remainder of the subject string. The difference between -\fB/g\fP and \fB/G\fP is that the former uses the \fIstartoffset\fP argument to -\fBpcre[16|32]_exec()\fP to start searching at a new point within the entire -string (which is in effect what Perl does), whereas the latter passes over a -shortened substring. This makes a difference to the matching process if the -pattern begins with a lookbehind assertion (including \eb or \eB). -.P -If any call to \fBpcre[16|32]_exec()\fP in a \fB/g\fP or \fB/G\fP sequence matches -an empty string, the next call is done with the PCRE_NOTEMPTY_ATSTART and -PCRE_ANCHORED flags set in order to search for another, non-empty, match at the -same point. If this second match fails, the start offset is advanced, and the -normal match is retried. This imitates the way Perl handles such cases when -using the \fB/g\fP modifier or the \fBsplit()\fP function. Normally, the start -offset is advanced by one character, but if the newline convention recognizes -CRLF as a newline, and the current character is CR followed by LF, an advance -of two is used. -. -. -.SS "Other modifiers" -.rs -.sp -There are yet more modifiers for controlling the way \fBpcretest\fP -operates. -.P -The \fB/+\fP modifier requests that as well as outputting the substring that -matched the entire pattern, \fBpcretest\fP should in addition output the -remainder of the subject string. This is useful for tests where the subject -contains multiple copies of the same substring. If the \fB+\fP modifier appears -twice, the same action is taken for captured substrings. In each case the -remainder is output on the following line with a plus character following the -capture number. Note that this modifier must not immediately follow the /S -modifier because /S+ and /S++ have other meanings. -.P -The \fB/=\fP modifier requests that the values of all potential captured -parentheses be output after a match. By default, only those up to the highest -one actually used in the match are output (corresponding to the return code -from \fBpcre[16|32]_exec()\fP). Values in the offsets vector corresponding to -higher numbers should be set to -1, and these are output as "". This -modifier gives a way of checking that this is happening. -.P -The \fB/B\fP modifier is a debugging feature. It requests that \fBpcretest\fP -output a representation of the compiled code after compilation. Normally this -information contains length and offset values; however, if \fB/Z\fP is also -present, this data is replaced by spaces. This is a special feature for use in -the automatic test scripts; it ensures that the same output is generated for -different internal link sizes. -.P -The \fB/D\fP modifier is a PCRE debugging feature, and is equivalent to -\fB/BI\fP, that is, both the \fB/B\fP and the \fB/I\fP modifiers. -.P -The \fB/F\fP modifier causes \fBpcretest\fP to flip the byte order of the -2-byte and 4-byte fields in the compiled pattern. This facility is for testing -the feature in PCRE that allows it to execute patterns that were compiled on a -host with a different endianness. This feature is not available when the POSIX -interface to PCRE is being used, that is, when the \fB/P\fP pattern modifier is -specified. See also the section about saving and reloading compiled patterns -below. -.P -The \fB/I\fP modifier requests that \fBpcretest\fP output information about the -compiled pattern (whether it is anchored, has a fixed first character, and -so on). It does this by calling \fBpcre[16|32]_fullinfo()\fP after compiling a -pattern. If the pattern is studied, the results of that are also output. In -this output, the word "char" means a non-UTF character, that is, the value of a -single data item (8-bit, 16-bit, or 32-bit, depending on the library that is -being tested). -.P -The \fB/K\fP modifier requests \fBpcretest\fP to show names from backtracking -control verbs that are returned from calls to \fBpcre[16|32]_exec()\fP. It causes -\fBpcretest\fP to create a \fBpcre[16|32]_extra\fP block if one has not already -been created by a call to \fBpcre[16|32]_study()\fP, and to set the -PCRE_EXTRA_MARK flag and the \fBmark\fP field within it, every time that -\fBpcre[16|32]_exec()\fP is called. If the variable that the \fBmark\fP field -points to is non-NULL for a match, non-match, or partial match, \fBpcretest\fP -prints the string to which it points. For a match, this is shown on a line by -itself, tagged with "MK:". For a non-match it is added to the message. -.P -The \fB/L\fP modifier must be followed directly by the name of a locale, for -example, -.sp - /pattern/Lfr_FR -.sp -For this reason, it must be the last modifier. The given locale is set, -\fBpcre[16|32]_maketables()\fP is called to build a set of character tables for -the locale, and this is then passed to \fBpcre[16|32]_compile()\fP when compiling -the regular expression. Without an \fB/L\fP (or \fB/T\fP) modifier, NULL is -passed as the tables pointer; that is, \fB/L\fP applies only to the expression -on which it appears. -.P -The \fB/M\fP modifier causes the size in bytes of the memory block used to hold -the compiled pattern to be output. This does not include the size of the -\fBpcre[16|32]\fP block; it is just the actual compiled data. If the pattern is -successfully studied with the PCRE_STUDY_JIT_COMPILE option, the size of the -JIT compiled code is also output. -.P -The \fB/Q\fP modifier is used to test the use of \fBpcre_stack_guard\fP. It -must be followed by '0' or '1', specifying the return code to be given from an -external function that is passed to PCRE and used for stack checking during -compilation (see the -.\" HREF -\fBpcreapi\fP -.\" -documentation for details). -.P -The \fB/S\fP modifier causes \fBpcre[16|32]_study()\fP to be called after the -expression has been compiled, and the results used when the expression is -matched. There are a number of qualifying characters that may follow \fB/S\fP. -They may appear in any order. -.P -If \fB/S\fP is followed by an exclamation mark, \fBpcre[16|32]_study()\fP is -called with the PCRE_STUDY_EXTRA_NEEDED option, causing it always to return a -\fBpcre_extra\fP block, even when studying discovers no useful information. -.P -If \fB/S\fP is followed by a second S character, it suppresses studying, even -if it was requested externally by the \fB-s\fP command line option. This makes -it possible to specify that certain patterns are always studied, and others are -never studied, independently of \fB-s\fP. This feature is used in the test -files in a few cases where the output is different when the pattern is studied. -.P -If the \fB/S\fP modifier is followed by a + character, the call to -\fBpcre[16|32]_study()\fP is made with all the JIT study options, requesting -just-in-time optimization support if it is available, for both normal and -partial matching. If you want to restrict the JIT compiling modes, you can -follow \fB/S+\fP with a digit in the range 1 to 7: -.sp - 1 normal match only - 2 soft partial match only - 3 normal match and soft partial match - 4 hard partial match only - 6 soft and hard partial match - 7 all three modes (default) -.sp -If \fB/S++\fP is used instead of \fB/S+\fP (with or without a following digit), -the text "(JIT)" is added to the first output line after a match or no match -when JIT-compiled code was actually used. -.P -Note that there is also an independent \fB/+\fP modifier; it must not be given -immediately after \fB/S\fP or \fB/S+\fP because this will be misinterpreted. -.P -If JIT studying is successful, the compiled JIT code will automatically be used -when \fBpcre[16|32]_exec()\fP is run, except when incompatible run-time options -are specified. For more details, see the -.\" HREF -\fBpcrejit\fP -.\" -documentation. See also the \fB\eJ\fP escape sequence below for a way of -setting the size of the JIT stack. -.P -Finally, if \fB/S\fP is followed by a minus character, JIT compilation is -suppressed, even if it was requested externally by the \fB-s\fP command line -option. This makes it possible to specify that JIT is never to be used for -certain patterns. -.P -The \fB/T\fP modifier must be followed by a single digit. It causes a specific -set of built-in character tables to be passed to \fBpcre[16|32]_compile()\fP. It -is used in the standard PCRE tests to check behaviour with different character -tables. The digit specifies the tables as follows: -.sp - 0 the default ASCII tables, as distributed in - pcre_chartables.c.dist - 1 a set of tables defining ISO 8859 characters -.sp -In table 1, some characters whose codes are greater than 128 are identified as -letters, digits, spaces, etc. -. -. -.SS "Using the POSIX wrapper API" -.rs -.sp -The \fB/P\fP modifier causes \fBpcretest\fP to call PCRE via the POSIX wrapper -API rather than its native API. This supports only the 8-bit library. When -\fB/P\fP is set, the following modifiers set options for the \fBregcomp()\fP -function: -.sp - /i REG_ICASE - /m REG_NEWLINE - /N REG_NOSUB - /s REG_DOTALL ) - /U REG_UNGREEDY ) These options are not part of - /W REG_UCP ) the POSIX standard - /8 REG_UTF8 ) -.sp -The \fB/+\fP modifier works as described above. All other modifiers are -ignored. -. -. -.SS "Locking out certain modifiers" -.rs -.sp -PCRE can be compiled with or without support for certain features such as -UTF-8/16/32 or Unicode properties. Accordingly, the standard tests are split up -into a number of different files that are selected for running depending on -which features are available. When updating the tests, it is all too easy to -put a new test into the wrong file by mistake; for example, to put a test that -requires UTF support into a file that is used when it is not available. To help -detect such mistakes as early as possible, there is a facility for locking out -specific modifiers. If an input line for \fBpcretest\fP starts with the string -"< forbid " the following sequence of characters is taken as a list of -forbidden modifiers. For example, in the test files that must not use UTF or -Unicode property support, this line appears: -.sp - < forbid 8W -.sp -This locks out the /8 and /W modifiers. An immediate error is given if they are -subsequently encountered. If the character string contains < but not >, all the -multi-character modifiers that begin with < are locked out. Otherwise, such -modifiers must be explicitly listed, for example: -.sp - < forbid -.sp -There must be a single space between < and "forbid" for this feature to be -recognised. If there is not, the line is interpreted either as a request to -re-load a pre-compiled pattern (see "SAVING AND RELOADING COMPILED PATTERNS" -below) or, if there is a another < character, as a pattern that uses < as its -delimiter. -. -. -.SH "DATA LINES" -.rs -.sp -Before each data line is passed to \fBpcre[16|32]_exec()\fP, leading and trailing -white space is removed, and it is then scanned for \e escapes. Some of these -are pretty esoteric features, intended for checking out some of the more -complicated features of PCRE. If you are just testing "ordinary" regular -expressions, you probably don't need any of these. The following escapes are -recognized: -.sp - \ea alarm (BEL, \ex07) - \eb backspace (\ex08) - \ee escape (\ex27) - \ef form feed (\ex0c) - \en newline (\ex0a) -.\" JOIN - \eqdd set the PCRE_MATCH_LIMIT limit to dd - (any number of digits) - \er carriage return (\ex0d) - \et tab (\ex09) - \ev vertical tab (\ex0b) - \ennn octal character (up to 3 octal digits); always - a byte unless > 255 in UTF-8 or 16-bit or 32-bit mode - \eo{dd...} octal character (any number of octal digits} - \exhh hexadecimal byte (up to 2 hex digits) - \ex{hh...} hexadecimal character (any number of hex digits) -.\" JOIN - \eA pass the PCRE_ANCHORED option to \fBpcre[16|32]_exec()\fP - or \fBpcre[16|32]_dfa_exec()\fP -.\" JOIN - \eB pass the PCRE_NOTBOL option to \fBpcre[16|32]_exec()\fP - or \fBpcre[16|32]_dfa_exec()\fP -.\" JOIN - \eCdd call pcre[16|32]_copy_substring() for substring dd - after a successful match (number less than 32) -.\" JOIN - \eCname call pcre[16|32]_copy_named_substring() for substring - "name" after a successful match (name termin- - ated by next non alphanumeric character) -.\" JOIN - \eC+ show the current captured substrings at callout - time - \eC- do not supply a callout function -.\" JOIN - \eC!n return 1 instead of 0 when callout number n is - reached -.\" JOIN - \eC!n!m return 1 instead of 0 when callout number n is - reached for the nth time -.\" JOIN - \eC*n pass the number n (may be negative) as callout - data; this is used as the callout return value - \eD use the \fBpcre[16|32]_dfa_exec()\fP match function - \eF only shortest match for \fBpcre[16|32]_dfa_exec()\fP -.\" JOIN - \eGdd call pcre[16|32]_get_substring() for substring dd - after a successful match (number less than 32) -.\" JOIN - \eGname call pcre[16|32]_get_named_substring() for substring - "name" after a successful match (name termin- - ated by next non-alphanumeric character) -.\" JOIN - \eJdd set up a JIT stack of dd kilobytes maximum (any - number of digits) -.\" JOIN - \eL call pcre[16|32]_get_substringlist() after a - successful match -.\" JOIN - \eM discover the minimum MATCH_LIMIT and - MATCH_LIMIT_RECURSION settings -.\" JOIN - \eN pass the PCRE_NOTEMPTY option to \fBpcre[16|32]_exec()\fP - or \fBpcre[16|32]_dfa_exec()\fP; if used twice, pass the - PCRE_NOTEMPTY_ATSTART option -.\" JOIN - \eOdd set the size of the output vector passed to - \fBpcre[16|32]_exec()\fP to dd (any number of digits) -.\" JOIN - \eP pass the PCRE_PARTIAL_SOFT option to \fBpcre[16|32]_exec()\fP - or \fBpcre[16|32]_dfa_exec()\fP; if used twice, pass the - PCRE_PARTIAL_HARD option -.\" JOIN - \eQdd set the PCRE_MATCH_LIMIT_RECURSION limit to dd - (any number of digits) - \eR pass the PCRE_DFA_RESTART option to \fBpcre[16|32]_dfa_exec()\fP - \eS output details of memory get/free calls during matching -.\" JOIN - \eY pass the PCRE_NO_START_OPTIMIZE option to \fBpcre[16|32]_exec()\fP - or \fBpcre[16|32]_dfa_exec()\fP -.\" JOIN - \eZ pass the PCRE_NOTEOL option to \fBpcre[16|32]_exec()\fP - or \fBpcre[16|32]_dfa_exec()\fP -.\" JOIN - \e? pass the PCRE_NO_UTF[8|16|32]_CHECK option to - \fBpcre[16|32]_exec()\fP or \fBpcre[16|32]_dfa_exec()\fP -.\" JOIN - \e>dd start the match at offset dd (optional "-"; then - any number of digits); this sets the \fIstartoffset\fP - argument for \fBpcre[16|32]_exec()\fP or \fBpcre[16|32]_dfa_exec()\fP -.\" JOIN - \e pass the PCRE_NEWLINE_CR option to \fBpcre[16|32]_exec()\fP - or \fBpcre[16|32]_dfa_exec()\fP -.\" JOIN - \e pass the PCRE_NEWLINE_LF option to \fBpcre[16|32]_exec()\fP - or \fBpcre[16|32]_dfa_exec()\fP -.\" JOIN - \e pass the PCRE_NEWLINE_CRLF option to \fBpcre[16|32]_exec()\fP - or \fBpcre[16|32]_dfa_exec()\fP -.\" JOIN - \e pass the PCRE_NEWLINE_ANYCRLF option to \fBpcre[16|32]_exec()\fP - or \fBpcre[16|32]_dfa_exec()\fP -.\" JOIN - \e pass the PCRE_NEWLINE_ANY option to \fBpcre[16|32]_exec()\fP - or \fBpcre[16|32]_dfa_exec()\fP -.sp -The use of \ex{hh...} is not dependent on the use of the \fB/8\fP modifier on -the pattern. It is recognized always. There may be any number of hexadecimal -digits inside the braces; invalid values provoke error messages. -.P -Note that \exhh specifies one byte rather than one character in UTF-8 mode; -this makes it possible to construct invalid UTF-8 sequences for testing -purposes. On the other hand, \ex{hh} is interpreted as a UTF-8 character in -UTF-8 mode, generating more than one byte if the value is greater than 127. -When testing the 8-bit library not in UTF-8 mode, \ex{hh} generates one byte -for values less than 256, and causes an error for greater values. -.P -In UTF-16 mode, all 4-digit \ex{hhhh} values are accepted. This makes it -possible to construct invalid UTF-16 sequences for testing purposes. -.P -In UTF-32 mode, all 4- to 8-digit \ex{...} values are accepted. This makes it -possible to construct invalid UTF-32 sequences for testing purposes. -.P -The escapes that specify line ending sequences are literal strings, exactly as -shown. No more than one newline setting should be present in any data line. -.P -A backslash followed by anything else just escapes the anything else. If -the very last character is a backslash, it is ignored. This gives a way of -passing an empty line as data, since a real empty line terminates the data -input. -.P -The \fB\eJ\fP escape provides a way of setting the maximum stack size that is -used by the just-in-time optimization code. It is ignored if JIT optimization -is not being used. Providing a stack that is larger than the default 32K is -necessary only for very complicated patterns. -.P -If \eM is present, \fBpcretest\fP calls \fBpcre[16|32]_exec()\fP several times, -with different values in the \fImatch_limit\fP and \fImatch_limit_recursion\fP -fields of the \fBpcre[16|32]_extra\fP data structure, until it finds the minimum -numbers for each parameter that allow \fBpcre[16|32]_exec()\fP to complete without -error. Because this is testing a specific feature of the normal interpretive -\fBpcre[16|32]_exec()\fP execution, the use of any JIT optimization that might -have been set up by the \fB/S+\fP qualifier of \fB-s+\fP option is disabled. -.P -The \fImatch_limit\fP number is a measure of the amount of backtracking -that takes place, and checking it out can be instructive. For most simple -matches, the number is quite small, but for patterns with very large numbers of -matching possibilities, it can become large very quickly with increasing length -of subject string. The \fImatch_limit_recursion\fP number is a measure of how -much stack (or, if PCRE is compiled with NO_RECURSE, how much heap) memory is -needed to complete the match attempt. -.P -When \eO is used, the value specified may be higher or lower than the size set -by the \fB-O\fP command line option (or defaulted to 45); \eO applies only to -the call of \fBpcre[16|32]_exec()\fP for the line in which it appears. -.P -If the \fB/P\fP modifier was present on the pattern, causing the POSIX wrapper -API to be used, the only option-setting sequences that have any effect are \eB, -\eN, and \eZ, causing REG_NOTBOL, REG_NOTEMPTY, and REG_NOTEOL, respectively, -to be passed to \fBregexec()\fP. -. -. -.SH "THE ALTERNATIVE MATCHING FUNCTION" -.rs -.sp -By default, \fBpcretest\fP uses the standard PCRE matching function, -\fBpcre[16|32]_exec()\fP to match each data line. PCRE also supports an -alternative matching function, \fBpcre[16|32]_dfa_test()\fP, which operates in a -different way, and has some restrictions. The differences between the two -functions are described in the -.\" HREF -\fBpcrematching\fP -.\" -documentation. -.P -If a data line contains the \eD escape sequence, or if the command line -contains the \fB-dfa\fP option, the alternative matching function is used. -This function finds all possible matches at a given point. If, however, the \eF -escape sequence is present in the data line, it stops after the first match is -found. This is always the shortest possible match. -. -. -.SH "DEFAULT OUTPUT FROM PCRETEST" -.rs -.sp -This section describes the output when the normal matching function, -\fBpcre[16|32]_exec()\fP, is being used. -.P -When a match succeeds, \fBpcretest\fP outputs the list of captured substrings -that \fBpcre[16|32]_exec()\fP returns, starting with number 0 for the string that -matched the whole pattern. Otherwise, it outputs "No match" when the return is -PCRE_ERROR_NOMATCH, and "Partial match:" followed by the partially matching -substring when \fBpcre[16|32]_exec()\fP returns PCRE_ERROR_PARTIAL. (Note that -this is the entire substring that was inspected during the partial match; it -may include characters before the actual match start if a lookbehind assertion, -\eK, \eb, or \eB was involved.) For any other return, \fBpcretest\fP outputs -the PCRE negative error number and a short descriptive phrase. If the error is -a failed UTF string check, the offset of the start of the failing character and -the reason code are also output, provided that the size of the output vector is -at least two. Here is an example of an interactive \fBpcretest\fP run. -.sp - $ pcretest - PCRE version 8.13 2011-04-30 -.sp - re> /^abc(\ed+)/ - data> abc123 - 0: abc123 - 1: 123 - data> xyz - No match -.sp -Unset capturing substrings that are not followed by one that is set are not -returned by \fBpcre[16|32]_exec()\fP, and are not shown by \fBpcretest\fP. In the -following example, there are two capturing substrings, but when the first data -line is matched, the second, unset substring is not shown. An "internal" unset -substring is shown as "", as for the second data line. -.sp - re> /(a)|(b)/ - data> a - 0: a - 1: a - data> b - 0: b - 1: - 2: b -.sp -If the strings contain any non-printing characters, they are output as \exhh -escapes if the value is less than 256 and UTF mode is not set. Otherwise they -are output as \ex{hh...} escapes. See below for the definition of non-printing -characters. If the pattern has the \fB/+\fP modifier, the output for substring -0 is followed by the the rest of the subject string, identified by "0+" like -this: -.sp - re> /cat/+ - data> cataract - 0: cat - 0+ aract -.sp -If the pattern has the \fB/g\fP or \fB/G\fP modifier, the results of successive -matching attempts are output in sequence, like this: -.sp - re> /\eBi(\ew\ew)/g - data> Mississippi - 0: iss - 1: ss - 0: iss - 1: ss - 0: ipp - 1: pp -.sp -"No match" is output only if the first match attempt fails. Here is an example -of a failure message (the offset 4 that is specified by \e>4 is past the end of -the subject string): -.sp - re> /xyz/ - data> xyz\e>4 - Error -24 (bad offset value) -.P -If any of the sequences \fB\eC\fP, \fB\eG\fP, or \fB\eL\fP are present in a -data line that is successfully matched, the substrings extracted by the -convenience functions are output with C, G, or L after the string number -instead of a colon. This is in addition to the normal full list. The string -length (that is, the return from the extraction function) is given in -parentheses after each string for \fB\eC\fP and \fB\eG\fP. -.P -Note that whereas patterns can be continued over several lines (a plain ">" -prompt is used for continuations), data lines may not. However newlines can be -included in data by means of the \en escape (or \er, \er\en, etc., depending on -the newline sequence setting). -. -. -. -.SH "OUTPUT FROM THE ALTERNATIVE MATCHING FUNCTION" -.rs -.sp -When the alternative matching function, \fBpcre[16|32]_dfa_exec()\fP, is used (by -means of the \eD escape sequence or the \fB-dfa\fP command line option), the -output consists of a list of all the matches that start at the first point in -the subject where there is at least one match. For example: -.sp - re> /(tang|tangerine|tan)/ - data> yellow tangerine\eD - 0: tangerine - 1: tang - 2: tan -.sp -(Using the normal matching function on this data finds only "tang".) The -longest matching string is always given first (and numbered zero). After a -PCRE_ERROR_PARTIAL return, the output is "Partial match:", followed by the -partially matching substring. (Note that this is the entire substring that was -inspected during the partial match; it may include characters before the actual -match start if a lookbehind assertion, \eK, \eb, or \eB was involved.) -.P -If \fB/g\fP is present on the pattern, the search for further matches resumes -at the end of the longest match. For example: -.sp - re> /(tang|tangerine|tan)/g - data> yellow tangerine and tangy sultana\eD - 0: tangerine - 1: tang - 2: tan - 0: tang - 1: tan - 0: tan -.sp -Since the matching function does not support substring capture, the escape -sequences that are concerned with captured substrings are not relevant. -. -. -.SH "RESTARTING AFTER A PARTIAL MATCH" -.rs -.sp -When the alternative matching function has given the PCRE_ERROR_PARTIAL return, -indicating that the subject partially matched the pattern, you can restart the -match with additional subject data by means of the \eR escape sequence. For -example: -.sp - re> /^\ed?\ed(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)\ed\ed$/ - data> 23ja\eP\eD - Partial match: 23ja - data> n05\eR\eD - 0: n05 -.sp -For further information about partial matching, see the -.\" HREF -\fBpcrepartial\fP -.\" -documentation. -. -. -.SH CALLOUTS -.rs -.sp -If the pattern contains any callout requests, \fBpcretest\fP's callout function -is called during matching. This works with both matching functions. By default, -the called function displays the callout number, the start and current -positions in the text at the callout time, and the next pattern item to be -tested. For example: -.sp - --->pqrabcdef - 0 ^ ^ \ed -.sp -This output indicates that callout number 0 occurred for a match attempt -starting at the fourth character of the subject string, when the pointer was at -the seventh character of the data, and when the next pattern item was \ed. Just -one circumflex is output if the start and current positions are the same. -.P -Callouts numbered 255 are assumed to be automatic callouts, inserted as a -result of the \fB/C\fP pattern modifier. In this case, instead of showing the -callout number, the offset in the pattern, preceded by a plus, is output. For -example: -.sp - re> /\ed?[A-E]\e*/C - data> E* - --->E* - +0 ^ \ed? - +3 ^ [A-E] - +8 ^^ \e* - +10 ^ ^ - 0: E* -.sp -If a pattern contains (*MARK) items, an additional line is output whenever -a change of latest mark is passed to the callout function. For example: -.sp - re> /a(*MARK:X)bc/C - data> abc - --->abc - +0 ^ a - +1 ^^ (*MARK:X) - +10 ^^ b - Latest Mark: X - +11 ^ ^ c - +12 ^ ^ - 0: abc -.sp -The mark changes between matching "a" and "b", but stays the same for the rest -of the match, so nothing more is output. If, as a result of backtracking, the -mark reverts to being unset, the text "" is output. -.P -The callout function in \fBpcretest\fP returns zero (carry on matching) by -default, but you can use a \eC item in a data line (as described above) to -change this and other parameters of the callout. -.P -Inserting callouts can be helpful when using \fBpcretest\fP to check -complicated regular expressions. For further information about callouts, see -the -.\" HREF -\fBpcrecallout\fP -.\" -documentation. -. -. -. -.SH "NON-PRINTING CHARACTERS" -.rs -.sp -When \fBpcretest\fP is outputting text in the compiled version of a pattern, -bytes other than 32-126 are always treated as non-printing characters are are -therefore shown as hex escapes. -.P -When \fBpcretest\fP is outputting text that is a matched part of a subject -string, it behaves in the same way, unless a different locale has been set for -the pattern (using the \fB/L\fP modifier). In this case, the \fBisprint()\fP -function to distinguish printing and non-printing characters. -. -. -. -.SH "SAVING AND RELOADING COMPILED PATTERNS" -.rs -.sp -The facilities described in this section are not available when the POSIX -interface to PCRE is being used, that is, when the \fB/P\fP pattern modifier is -specified. -.P -When the POSIX interface is not in use, you can cause \fBpcretest\fP to write a -compiled pattern to a file, by following the modifiers with > and a file name. -For example: -.sp - /pattern/im >/some/file -.sp -See the -.\" HREF -\fBpcreprecompile\fP -.\" -documentation for a discussion about saving and re-using compiled patterns. -Note that if the pattern was successfully studied with JIT optimization, the -JIT data cannot be saved. -.P -The data that is written is binary. The first eight bytes are the length of the -compiled pattern data followed by the length of the optional study data, each -written as four bytes in big-endian order (most significant byte first). If -there is no study data (either the pattern was not studied, or studying did not -return any data), the second length is zero. The lengths are followed by an -exact copy of the compiled pattern. If there is additional study data, this -(excluding any JIT data) follows immediately after the compiled pattern. After -writing the file, \fBpcretest\fP expects to read a new pattern. -.P -A saved pattern can be reloaded into \fBpcretest\fP by specifying < and a file -name instead of a pattern. There must be no space between < and the file name, -which must not contain a < character, as otherwise \fBpcretest\fP will -interpret the line as a pattern delimited by < characters. For example: -.sp - re> -.\" -ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre -.\" -.P -Details of exactly which Perl regular expression features are and are not -supported by PCRE are given in separate documents. See the -.\" HREF -\fBpcrepattern\fP -.\" -and -.\" HREF -\fBpcrecompat\fP -.\" -pages. There is a syntax summary in the -.\" HREF -\fBpcresyntax\fP -.\" -page. -.P -Some features of PCRE can be included, excluded, or changed when the library is -built. The -.\" HREF -\fBpcre_config()\fP -.\" -function makes it possible for a client to discover which features are -available. The features themselves are described in the -.\" HREF -\fBpcrebuild\fP -.\" -page. Documentation about building PCRE for various operating systems can be -found in the -.\" HTML -.\" -\fBREADME\fP -.\" -and -.\" HTML -.\" -\fBNON-AUTOTOOLS_BUILD\fP -.\" -files in the source distribution. -.P -The libraries contains a number of undocumented internal functions and data -tables that are used by more than one of the exported external functions, but -which are not intended for use by external callers. Their names all begin with -"_pcre_" or "_pcre16_" or "_pcre32_", which hopefully will not provoke any name -clashes. In some environments, it is possible to control which external symbols -are exported when a shared library is built, and in these cases the -undocumented symbols are not exported. -. -. -.SH "SECURITY CONSIDERATIONS" -.rs -.sp -If you are using PCRE in a non-UTF application that permits users to supply -arbitrary patterns for compilation, you should be aware of a feature that -allows users to turn on UTF support from within a pattern, provided that PCRE -was built with UTF support. For example, an 8-bit pattern that begins with -"(*UTF8)" or "(*UTF)" turns on UTF-8 mode, which interprets patterns and -subjects as strings of UTF-8 characters instead of individual 8-bit characters. -This causes both the pattern and any data against which it is matched to be -checked for UTF-8 validity. If the data string is very long, such a check might -use sufficiently many resources as to cause your application to lose -performance. -.P -One way of guarding against this possibility is to use the -\fBpcre_fullinfo()\fP function to check the compiled pattern's options for UTF. -Alternatively, from release 8.33, you can set the PCRE_NEVER_UTF option at -compile time. This causes an compile time error if a pattern contains a -UTF-setting sequence. -.P -If your application is one that supports UTF, be aware that validity checking -can take time. If the same data string is to be matched many times, you can use -the PCRE_NO_UTF[8|16|32]_CHECK option for the second and subsequent matches to -save redundant checks. -.P -Another way that performance can be hit is by running a pattern that has a very -large search tree against a string that will never match. Nested unlimited -repeats in a pattern are a common example. PCRE provides some protection -against this: see the PCRE_EXTRA_MATCH_LIMIT feature in the -.\" HREF -\fBpcreapi\fP -.\" -page. -. -. -.SH "USER DOCUMENTATION" -.rs -.sp -The user documentation for PCRE comprises a number of different sections. In -the "man" format, each of these is a separate "man page". In the HTML format, -each is a separate page, linked from the index page. In the plain text format, -the descriptions of the \fBpcregrep\fP and \fBpcretest\fP programs are in files -called \fBpcregrep.txt\fP and \fBpcretest.txt\fP, respectively. The remaining -sections, except for the \fBpcredemo\fP section (which is a program listing), -are concatenated in \fBpcre.txt\fP, for ease of searching. The sections are as -follows: -.sp - pcre this document - pcre-config show PCRE installation configuration information - pcre16 details of the 16-bit library - pcre32 details of the 32-bit library - pcreapi details of PCRE's native C API - pcrebuild building PCRE - pcrecallout details of the callout feature - pcrecompat discussion of Perl compatibility - pcrecpp details of the C++ wrapper for the 8-bit library - pcredemo a demonstration C program that uses PCRE - pcregrep description of the \fBpcregrep\fP command (8-bit only) - pcrejit discussion of the just-in-time optimization support - pcrelimits details of size and other limits - pcrematching discussion of the two matching algorithms - pcrepartial details of the partial matching facility -.\" JOIN - pcrepattern syntax and semantics of supported - regular expressions - pcreperform discussion of performance issues - pcreposix the POSIX-compatible C API for the 8-bit library - pcreprecompile details of saving and re-using precompiled patterns - pcresample discussion of the pcredemo program - pcrestack discussion of stack usage - pcresyntax quick syntax reference - pcretest description of the \fBpcretest\fP testing command - pcreunicode discussion of Unicode and UTF-8/16/32 support -.sp -In the "man" and HTML formats, there is also a short page for each C library -function, listing its arguments and results. -. -. -.SH AUTHOR -.rs -.sp -.nf -Philip Hazel -University Computing Service -Cambridge CB2 3QH, England. -.fi -.P -Putting an actual email address here seems to have been a spam magnet, so I've -taken it away. If you want to email me, use my two initials, followed by the -two digits 10, at the domain cam.ac.uk. -. -. -.SH REVISION -.rs -.sp -.nf -Last updated: 10 February 2015 -Copyright (c) 1997-2015 University of Cambridge. -.fi diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre16.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre16.3 deleted file mode 100644 index 85126a67..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre16.3 +++ /dev/null @@ -1,371 +0,0 @@ -.TH PCRE 3 "12 May 2013" "PCRE 8.33" -.SH NAME -PCRE - Perl-compatible regular expressions -.sp -.B #include -. -. -.SH "PCRE 16-BIT API BASIC FUNCTIONS" -.rs -.sp -.nf -.B pcre16 *pcre16_compile(PCRE_SPTR16 \fIpattern\fP, int \fIoptions\fP, -.B " const char **\fIerrptr\fP, int *\fIerroffset\fP," -.B " const unsigned char *\fItableptr\fP);" -.sp -.B pcre16 *pcre16_compile2(PCRE_SPTR16 \fIpattern\fP, int \fIoptions\fP, -.B " int *\fIerrorcodeptr\fP," -.B " const char **\fIerrptr\fP, int *\fIerroffset\fP," -.B " const unsigned char *\fItableptr\fP);" -.sp -.B pcre16_extra *pcre16_study(const pcre16 *\fIcode\fP, int \fIoptions\fP, -.B " const char **\fIerrptr\fP);" -.sp -.B void pcre16_free_study(pcre16_extra *\fIextra\fP); -.sp -.B int pcre16_exec(const pcre16 *\fIcode\fP, "const pcre16_extra *\fIextra\fP," -.B " PCRE_SPTR16 \fIsubject\fP, int \fIlength\fP, int \fIstartoffset\fP," -.B " int \fIoptions\fP, int *\fIovector\fP, int \fIovecsize\fP);" -.sp -.B int pcre16_dfa_exec(const pcre16 *\fIcode\fP, "const pcre16_extra *\fIextra\fP," -.B " PCRE_SPTR16 \fIsubject\fP, int \fIlength\fP, int \fIstartoffset\fP," -.B " int \fIoptions\fP, int *\fIovector\fP, int \fIovecsize\fP," -.B " int *\fIworkspace\fP, int \fIwscount\fP);" -.fi -. -. -.SH "PCRE 16-BIT API STRING EXTRACTION FUNCTIONS" -.rs -.sp -.nf -.B int pcre16_copy_named_substring(const pcre16 *\fIcode\fP, -.B " PCRE_SPTR16 \fIsubject\fP, int *\fIovector\fP," -.B " int \fIstringcount\fP, PCRE_SPTR16 \fIstringname\fP," -.B " PCRE_UCHAR16 *\fIbuffer\fP, int \fIbuffersize\fP);" -.sp -.B int pcre16_copy_substring(PCRE_SPTR16 \fIsubject\fP, int *\fIovector\fP, -.B " int \fIstringcount\fP, int \fIstringnumber\fP, PCRE_UCHAR16 *\fIbuffer\fP," -.B " int \fIbuffersize\fP);" -.sp -.B int pcre16_get_named_substring(const pcre16 *\fIcode\fP, -.B " PCRE_SPTR16 \fIsubject\fP, int *\fIovector\fP," -.B " int \fIstringcount\fP, PCRE_SPTR16 \fIstringname\fP," -.B " PCRE_SPTR16 *\fIstringptr\fP);" -.sp -.B int pcre16_get_stringnumber(const pcre16 *\fIcode\fP, -.B " PCRE_SPTR16 \fIname\fP); -.sp -.B int pcre16_get_stringtable_entries(const pcre16 *\fIcode\fP, -.B " PCRE_SPTR16 \fIname\fP, PCRE_UCHAR16 **\fIfirst\fP, PCRE_UCHAR16 **\fIlast\fP);" -.sp -.B int pcre16_get_substring(PCRE_SPTR16 \fIsubject\fP, int *\fIovector\fP, -.B " int \fIstringcount\fP, int \fIstringnumber\fP," -.B " PCRE_SPTR16 *\fIstringptr\fP);" -.sp -.B int pcre16_get_substring_list(PCRE_SPTR16 \fIsubject\fP, -.B " int *\fIovector\fP, int \fIstringcount\fP, PCRE_SPTR16 **\fIlistptr\fP);" -.sp -.B void pcre16_free_substring(PCRE_SPTR16 \fIstringptr\fP); -.sp -.B void pcre16_free_substring_list(PCRE_SPTR16 *\fIstringptr\fP); -.fi -. -. -.SH "PCRE 16-BIT API AUXILIARY FUNCTIONS" -.rs -.sp -.nf -.B pcre16_jit_stack *pcre16_jit_stack_alloc(int \fIstartsize\fP, int \fImaxsize\fP); -.sp -.B void pcre16_jit_stack_free(pcre16_jit_stack *\fIstack\fP); -.sp -.B void pcre16_assign_jit_stack(pcre16_extra *\fIextra\fP, -.B " pcre16_jit_callback \fIcallback\fP, void *\fIdata\fP);" -.sp -.B const unsigned char *pcre16_maketables(void); -.sp -.B int pcre16_fullinfo(const pcre16 *\fIcode\fP, "const pcre16_extra *\fIextra\fP," -.B " int \fIwhat\fP, void *\fIwhere\fP);" -.sp -.B int pcre16_refcount(pcre16 *\fIcode\fP, int \fIadjust\fP); -.sp -.B int pcre16_config(int \fIwhat\fP, void *\fIwhere\fP); -.sp -.B const char *pcre16_version(void); -.sp -.B int pcre16_pattern_to_host_byte_order(pcre16 *\fIcode\fP, -.B " pcre16_extra *\fIextra\fP, const unsigned char *\fItables\fP);" -.fi -. -. -.SH "PCRE 16-BIT API INDIRECTED FUNCTIONS" -.rs -.sp -.nf -.B void *(*pcre16_malloc)(size_t); -.sp -.B void (*pcre16_free)(void *); -.sp -.B void *(*pcre16_stack_malloc)(size_t); -.sp -.B void (*pcre16_stack_free)(void *); -.sp -.B int (*pcre16_callout)(pcre16_callout_block *); -.fi -. -. -.SH "PCRE 16-BIT API 16-BIT-ONLY FUNCTION" -.rs -.sp -.nf -.B int pcre16_utf16_to_host_byte_order(PCRE_UCHAR16 *\fIoutput\fP, -.B " PCRE_SPTR16 \fIinput\fP, int \fIlength\fP, int *\fIbyte_order\fP," -.B " int \fIkeep_boms\fP);" -.fi -. -. -.SH "THE PCRE 16-BIT LIBRARY" -.rs -.sp -Starting with release 8.30, it is possible to compile a PCRE library that -supports 16-bit character strings, including UTF-16 strings, as well as or -instead of the original 8-bit library. The majority of the work to make this -possible was done by Zoltan Herczeg. The two libraries contain identical sets -of functions, used in exactly the same way. Only the names of the functions and -the data types of their arguments and results are different. To avoid -over-complication and reduce the documentation maintenance load, most of the -PCRE documentation describes the 8-bit library, with only occasional references -to the 16-bit library. This page describes what is different when you use the -16-bit library. -.P -WARNING: A single application can be linked with both libraries, but you must -take care when processing any particular pattern to use functions from just one -library. For example, if you want to study a pattern that was compiled with -\fBpcre16_compile()\fP, you must do so with \fBpcre16_study()\fP, not -\fBpcre_study()\fP, and you must free the study data with -\fBpcre16_free_study()\fP. -. -. -.SH "THE HEADER FILE" -.rs -.sp -There is only one header file, \fBpcre.h\fP. It contains prototypes for all the -functions in all libraries, as well as definitions of flags, structures, error -codes, etc. -. -. -.SH "THE LIBRARY NAME" -.rs -.sp -In Unix-like systems, the 16-bit library is called \fBlibpcre16\fP, and can -normally be accesss by adding \fB-lpcre16\fP to the command for linking an -application that uses PCRE. -. -. -.SH "STRING TYPES" -.rs -.sp -In the 8-bit library, strings are passed to PCRE library functions as vectors -of bytes with the C type "char *". In the 16-bit library, strings are passed as -vectors of unsigned 16-bit quantities. The macro PCRE_UCHAR16 specifies an -appropriate data type, and PCRE_SPTR16 is defined as "const PCRE_UCHAR16 *". In -very many environments, "short int" is a 16-bit data type. When PCRE is built, -it defines PCRE_UCHAR16 as "unsigned short int", but checks that it really is a -16-bit data type. If it is not, the build fails with an error message telling -the maintainer to modify the definition appropriately. -. -. -.SH "STRUCTURE TYPES" -.rs -.sp -The types of the opaque structures that are used for compiled 16-bit patterns -and JIT stacks are \fBpcre16\fP and \fBpcre16_jit_stack\fP respectively. The -type of the user-accessible structure that is returned by \fBpcre16_study()\fP -is \fBpcre16_extra\fP, and the type of the structure that is used for passing -data to a callout function is \fBpcre16_callout_block\fP. These structures -contain the same fields, with the same names, as their 8-bit counterparts. The -only difference is that pointers to character strings are 16-bit instead of -8-bit types. -. -. -.SH "16-BIT FUNCTIONS" -.rs -.sp -For every function in the 8-bit library there is a corresponding function in -the 16-bit library with a name that starts with \fBpcre16_\fP instead of -\fBpcre_\fP. The prototypes are listed above. In addition, there is one extra -function, \fBpcre16_utf16_to_host_byte_order()\fP. This is a utility function -that converts a UTF-16 character string to host byte order if necessary. The -other 16-bit functions expect the strings they are passed to be in host byte -order. -.P -The \fIinput\fP and \fIoutput\fP arguments of -\fBpcre16_utf16_to_host_byte_order()\fP may point to the same address, that is, -conversion in place is supported. The output buffer must be at least as long as -the input. -.P -The \fIlength\fP argument specifies the number of 16-bit data units in the -input string; a negative value specifies a zero-terminated string. -.P -If \fIbyte_order\fP is NULL, it is assumed that the string starts off in host -byte order. This may be changed by byte-order marks (BOMs) anywhere in the -string (commonly as the first character). -.P -If \fIbyte_order\fP is not NULL, a non-zero value of the integer to which it -points means that the input starts off in host byte order, otherwise the -opposite order is assumed. Again, BOMs in the string can change this. The final -byte order is passed back at the end of processing. -.P -If \fIkeep_boms\fP is not zero, byte-order mark characters (0xfeff) are copied -into the output string. Otherwise they are discarded. -.P -The result of the function is the number of 16-bit units placed into the output -buffer, including the zero terminator if the string was zero-terminated. -. -. -.SH "SUBJECT STRING OFFSETS" -.rs -.sp -The lengths and starting offsets of subject strings must be specified in 16-bit -data units, and the offsets within subject strings that are returned by the -matching functions are in also 16-bit units rather than bytes. -. -. -.SH "NAMED SUBPATTERNS" -.rs -.sp -The name-to-number translation table that is maintained for named subpatterns -uses 16-bit characters. The \fBpcre16_get_stringtable_entries()\fP function -returns the length of each entry in the table as the number of 16-bit data -units. -. -. -.SH "OPTION NAMES" -.rs -.sp -There are two new general option names, PCRE_UTF16 and PCRE_NO_UTF16_CHECK, -which correspond to PCRE_UTF8 and PCRE_NO_UTF8_CHECK in the 8-bit library. In -fact, these new options define the same bits in the options word. There is a -discussion about the -.\" HTML -.\" -validity of UTF-16 strings -.\" -in the -.\" HREF -\fBpcreunicode\fP -.\" -page. -.P -For the \fBpcre16_config()\fP function there is an option PCRE_CONFIG_UTF16 -that returns 1 if UTF-16 support is configured, otherwise 0. If this option is -given to \fBpcre_config()\fP or \fBpcre32_config()\fP, or if the -PCRE_CONFIG_UTF8 or PCRE_CONFIG_UTF32 option is given to \fBpcre16_config()\fP, -the result is the PCRE_ERROR_BADOPTION error. -. -. -.SH "CHARACTER CODES" -.rs -.sp -In 16-bit mode, when PCRE_UTF16 is not set, character values are treated in the -same way as in 8-bit, non UTF-8 mode, except, of course, that they can range -from 0 to 0xffff instead of 0 to 0xff. Character types for characters less than -0xff can therefore be influenced by the locale in the same way as before. -Characters greater than 0xff have only one case, and no "type" (such as letter -or digit). -.P -In UTF-16 mode, the character code is Unicode, in the range 0 to 0x10ffff, with -the exception of values in the range 0xd800 to 0xdfff because those are -"surrogate" values that are used in pairs to encode values greater than 0xffff. -.P -A UTF-16 string can indicate its endianness by special code knows as a -byte-order mark (BOM). The PCRE functions do not handle this, expecting strings -to be in host byte order. A utility function called -\fBpcre16_utf16_to_host_byte_order()\fP is provided to help with this (see -above). -. -. -.SH "ERROR NAMES" -.rs -.sp -The errors PCRE_ERROR_BADUTF16_OFFSET and PCRE_ERROR_SHORTUTF16 correspond to -their 8-bit counterparts. The error PCRE_ERROR_BADMODE is given when a compiled -pattern is passed to a function that processes patterns in the other -mode, for example, if a pattern compiled with \fBpcre_compile()\fP is passed to -\fBpcre16_exec()\fP. -.P -There are new error codes whose names begin with PCRE_UTF16_ERR for invalid -UTF-16 strings, corresponding to the PCRE_UTF8_ERR codes for UTF-8 strings that -are described in the section entitled -.\" HTML -.\" -"Reason codes for invalid UTF-8 strings" -.\" -in the main -.\" HREF -\fBpcreapi\fP -.\" -page. The UTF-16 errors are: -.sp - PCRE_UTF16_ERR1 Missing low surrogate at end of string - PCRE_UTF16_ERR2 Invalid low surrogate follows high surrogate - PCRE_UTF16_ERR3 Isolated low surrogate - PCRE_UTF16_ERR4 Non-character -. -. -.SH "ERROR TEXTS" -.rs -.sp -If there is an error while compiling a pattern, the error text that is passed -back by \fBpcre16_compile()\fP or \fBpcre16_compile2()\fP is still an 8-bit -character string, zero-terminated. -. -. -.SH "CALLOUTS" -.rs -.sp -The \fIsubject\fP and \fImark\fP fields in the callout block that is passed to -a callout function point to 16-bit vectors. -. -. -.SH "TESTING" -.rs -.sp -The \fBpcretest\fP program continues to operate with 8-bit input and output -files, but it can be used for testing the 16-bit library. If it is run with the -command line option \fB-16\fP, patterns and subject strings are converted from -8-bit to 16-bit before being passed to PCRE, and the 16-bit library functions -are used instead of the 8-bit ones. Returned 16-bit strings are converted to -8-bit for output. If both the 8-bit and the 32-bit libraries were not compiled, -\fBpcretest\fP defaults to 16-bit and the \fB-16\fP option is ignored. -.P -When PCRE is being built, the \fBRunTest\fP script that is called by "make -check" uses the \fBpcretest\fP \fB-C\fP option to discover which of the 8-bit, -16-bit and 32-bit libraries has been built, and runs the tests appropriately. -. -. -.SH "NOT SUPPORTED IN 16-BIT MODE" -.rs -.sp -Not all the features of the 8-bit library are available with the 16-bit -library. The C++ and POSIX wrapper functions support only the 8-bit library, -and the \fBpcregrep\fP program is at present 8-bit only. -. -. -.SH AUTHOR -.rs -.sp -.nf -Philip Hazel -University Computing Service -Cambridge CB2 3QH, England. -.fi -. -. -.SH REVISION -.rs -.sp -.nf -Last updated: 12 May 2013 -Copyright (c) 1997-2013 University of Cambridge. -.fi diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre16_assign_jit_stack.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre16_assign_jit_stack.3 deleted file mode 120000 index 40c8775a..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre16_assign_jit_stack.3 +++ /dev/null @@ -1 +0,0 @@ -pcre_assign_jit_stack.3 \ No newline at end of file diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre16_compile.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre16_compile.3 deleted file mode 120000 index 9364e751..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre16_compile.3 +++ /dev/null @@ -1 +0,0 @@ -pcre_compile.3 \ No newline at end of file diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre16_compile2.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre16_compile2.3 deleted file mode 120000 index 2d6aff35..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre16_compile2.3 +++ /dev/null @@ -1 +0,0 @@ -pcre_compile2.3 \ No newline at end of file diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre16_config.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre16_config.3 deleted file mode 120000 index db964059..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre16_config.3 +++ /dev/null @@ -1 +0,0 @@ -pcre_config.3 \ No newline at end of file diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre16_copy_named_substring.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre16_copy_named_substring.3 deleted file mode 120000 index c15b9774..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre16_copy_named_substring.3 +++ /dev/null @@ -1 +0,0 @@ -pcre_copy_named_substring.3 \ No newline at end of file diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre16_copy_substring.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre16_copy_substring.3 deleted file mode 120000 index 98d1f84d..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre16_copy_substring.3 +++ /dev/null @@ -1 +0,0 @@ -pcre_copy_substring.3 \ No newline at end of file diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre16_dfa_exec.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre16_dfa_exec.3 deleted file mode 120000 index ed408df0..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre16_dfa_exec.3 +++ /dev/null @@ -1 +0,0 @@ -pcre_dfa_exec.3 \ No newline at end of file diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre16_exec.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre16_exec.3 deleted file mode 120000 index ebaa2527..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre16_exec.3 +++ /dev/null @@ -1 +0,0 @@ -pcre_exec.3 \ No newline at end of file diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre16_free_study.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre16_free_study.3 deleted file mode 120000 index 4c53ea9f..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre16_free_study.3 +++ /dev/null @@ -1 +0,0 @@ -pcre_free_study.3 \ No newline at end of file diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre16_free_substring.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre16_free_substring.3 deleted file mode 120000 index 48567bfb..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre16_free_substring.3 +++ /dev/null @@ -1 +0,0 @@ -pcre_free_substring.3 \ No newline at end of file diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre16_free_substring_list.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre16_free_substring_list.3 deleted file mode 120000 index 84b7b7e5..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre16_free_substring_list.3 +++ /dev/null @@ -1 +0,0 @@ -pcre_free_substring_list.3 \ No newline at end of file diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre16_fullinfo.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre16_fullinfo.3 deleted file mode 120000 index b7386a98..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre16_fullinfo.3 +++ /dev/null @@ -1 +0,0 @@ -pcre_fullinfo.3 \ No newline at end of file diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre16_get_named_substring.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre16_get_named_substring.3 deleted file mode 120000 index c095ca50..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre16_get_named_substring.3 +++ /dev/null @@ -1 +0,0 @@ -pcre_get_named_substring.3 \ No newline at end of file diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre16_get_stringnumber.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre16_get_stringnumber.3 deleted file mode 120000 index f8e81d32..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre16_get_stringnumber.3 +++ /dev/null @@ -1 +0,0 @@ -pcre_get_stringnumber.3 \ No newline at end of file diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre16_get_stringtable_entries.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre16_get_stringtable_entries.3 deleted file mode 120000 index 9f8cc4a7..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre16_get_stringtable_entries.3 +++ /dev/null @@ -1 +0,0 @@ -pcre_get_stringtable_entries.3 \ No newline at end of file diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre16_get_substring.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre16_get_substring.3 deleted file mode 120000 index 26383b5d..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre16_get_substring.3 +++ /dev/null @@ -1 +0,0 @@ -pcre_get_substring.3 \ No newline at end of file diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre16_get_substring_list.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre16_get_substring_list.3 deleted file mode 120000 index 2faa865f..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre16_get_substring_list.3 +++ /dev/null @@ -1 +0,0 @@ -pcre_get_substring_list.3 \ No newline at end of file diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre16_jit_exec.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre16_jit_exec.3 deleted file mode 120000 index 59089ada..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre16_jit_exec.3 +++ /dev/null @@ -1 +0,0 @@ -pcre_jit_exec.3 \ No newline at end of file diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre16_jit_stack_alloc.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre16_jit_stack_alloc.3 deleted file mode 120000 index dab43b82..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre16_jit_stack_alloc.3 +++ /dev/null @@ -1 +0,0 @@ -pcre_jit_stack_alloc.3 \ No newline at end of file diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre16_jit_stack_free.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre16_jit_stack_free.3 deleted file mode 120000 index e92aa310..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre16_jit_stack_free.3 +++ /dev/null @@ -1 +0,0 @@ -pcre_jit_stack_free.3 \ No newline at end of file diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre16_maketables.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre16_maketables.3 deleted file mode 120000 index 3b6308e2..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre16_maketables.3 +++ /dev/null @@ -1 +0,0 @@ -pcre_maketables.3 \ No newline at end of file diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre16_pattern_to_host_byte_order.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre16_pattern_to_host_byte_order.3 deleted file mode 120000 index 6540917e..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre16_pattern_to_host_byte_order.3 +++ /dev/null @@ -1 +0,0 @@ -pcre_pattern_to_host_byte_order.3 \ No newline at end of file diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre16_refcount.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre16_refcount.3 deleted file mode 120000 index 63cece3f..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre16_refcount.3 +++ /dev/null @@ -1 +0,0 @@ -pcre_refcount.3 \ No newline at end of file diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre16_study.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre16_study.3 deleted file mode 120000 index 9871217f..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre16_study.3 +++ /dev/null @@ -1 +0,0 @@ -pcre_study.3 \ No newline at end of file diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre16_utf16_to_host_byte_order.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre16_utf16_to_host_byte_order.3 deleted file mode 120000 index d9233991..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre16_utf16_to_host_byte_order.3 +++ /dev/null @@ -1 +0,0 @@ -pcre_utf16_to_host_byte_order.3 \ No newline at end of file diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre16_version.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre16_version.3 deleted file mode 120000 index c31893c6..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre16_version.3 +++ /dev/null @@ -1 +0,0 @@ -pcre_version.3 \ No newline at end of file diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre32.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre32.3 deleted file mode 100644 index 7cde8c08..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre32.3 +++ /dev/null @@ -1,369 +0,0 @@ -.TH PCRE 3 "12 May 2013" "PCRE 8.33" -.SH NAME -PCRE - Perl-compatible regular expressions -.sp -.B #include -. -. -.SH "PCRE 32-BIT API BASIC FUNCTIONS" -.rs -.sp -.nf -.B pcre32 *pcre32_compile(PCRE_SPTR32 \fIpattern\fP, int \fIoptions\fP, -.B " const char **\fIerrptr\fP, int *\fIerroffset\fP," -.B " const unsigned char *\fItableptr\fP);" -.sp -.B pcre32 *pcre32_compile2(PCRE_SPTR32 \fIpattern\fP, int \fIoptions\fP, -.B " int *\fIerrorcodeptr\fP," -.B " const unsigned char *\fItableptr\fP);" -.sp -.B pcre32_extra *pcre32_study(const pcre32 *\fIcode\fP, int \fIoptions\fP, -.B " const char **\fIerrptr\fP);" -.sp -.B void pcre32_free_study(pcre32_extra *\fIextra\fP); -.sp -.B int pcre32_exec(const pcre32 *\fIcode\fP, "const pcre32_extra *\fIextra\fP," -.B " PCRE_SPTR32 \fIsubject\fP, int \fIlength\fP, int \fIstartoffset\fP," -.B " int \fIoptions\fP, int *\fIovector\fP, int \fIovecsize\fP);" -.sp -.B int pcre32_dfa_exec(const pcre32 *\fIcode\fP, "const pcre32_extra *\fIextra\fP," -.B " PCRE_SPTR32 \fIsubject\fP, int \fIlength\fP, int \fIstartoffset\fP," -.B " int \fIoptions\fP, int *\fIovector\fP, int \fIovecsize\fP," -.B " int *\fIworkspace\fP, int \fIwscount\fP);" -.fi -. -. -.SH "PCRE 32-BIT API STRING EXTRACTION FUNCTIONS" -.rs -.sp -.nf -.B int pcre32_copy_named_substring(const pcre32 *\fIcode\fP, -.B " PCRE_SPTR32 \fIsubject\fP, int *\fIovector\fP," -.B " int \fIstringcount\fP, PCRE_SPTR32 \fIstringname\fP," -.B " PCRE_UCHAR32 *\fIbuffer\fP, int \fIbuffersize\fP);" -.sp -.B int pcre32_copy_substring(PCRE_SPTR32 \fIsubject\fP, int *\fIovector\fP, -.B " int \fIstringcount\fP, int \fIstringnumber\fP, PCRE_UCHAR32 *\fIbuffer\fP," -.B " int \fIbuffersize\fP);" -.sp -.B int pcre32_get_named_substring(const pcre32 *\fIcode\fP, -.B " PCRE_SPTR32 \fIsubject\fP, int *\fIovector\fP," -.B " int \fIstringcount\fP, PCRE_SPTR32 \fIstringname\fP," -.B " PCRE_SPTR32 *\fIstringptr\fP);" -.sp -.B int pcre32_get_stringnumber(const pcre32 *\fIcode\fP, -.B " PCRE_SPTR32 \fIname\fP);" -.sp -.B int pcre32_get_stringtable_entries(const pcre32 *\fIcode\fP, -.B " PCRE_SPTR32 \fIname\fP, PCRE_UCHAR32 **\fIfirst\fP, PCRE_UCHAR32 **\fIlast\fP);" -.sp -.B int pcre32_get_substring(PCRE_SPTR32 \fIsubject\fP, int *\fIovector\fP, -.B " int \fIstringcount\fP, int \fIstringnumber\fP," -.B " PCRE_SPTR32 *\fIstringptr\fP);" -.sp -.B int pcre32_get_substring_list(PCRE_SPTR32 \fIsubject\fP, -.B " int *\fIovector\fP, int \fIstringcount\fP, PCRE_SPTR32 **\fIlistptr\fP);" -.sp -.B void pcre32_free_substring(PCRE_SPTR32 \fIstringptr\fP); -.sp -.B void pcre32_free_substring_list(PCRE_SPTR32 *\fIstringptr\fP); -.fi -. -. -.SH "PCRE 32-BIT API AUXILIARY FUNCTIONS" -.rs -.sp -.nf -.B pcre32_jit_stack *pcre32_jit_stack_alloc(int \fIstartsize\fP, int \fImaxsize\fP); -.sp -.B void pcre32_jit_stack_free(pcre32_jit_stack *\fIstack\fP); -.sp -.B void pcre32_assign_jit_stack(pcre32_extra *\fIextra\fP, -.B " pcre32_jit_callback \fIcallback\fP, void *\fIdata\fP);" -.sp -.B const unsigned char *pcre32_maketables(void); -.sp -.B int pcre32_fullinfo(const pcre32 *\fIcode\fP, "const pcre32_extra *\fIextra\fP," -.B " int \fIwhat\fP, void *\fIwhere\fP);" -.sp -.B int pcre32_refcount(pcre32 *\fIcode\fP, int \fIadjust\fP); -.sp -.B int pcre32_config(int \fIwhat\fP, void *\fIwhere\fP); -.sp -.B const char *pcre32_version(void); -.sp -.B int pcre32_pattern_to_host_byte_order(pcre32 *\fIcode\fP, -.B " pcre32_extra *\fIextra\fP, const unsigned char *\fItables\fP);" -.fi -. -. -.SH "PCRE 32-BIT API INDIRECTED FUNCTIONS" -.rs -.sp -.nf -.B void *(*pcre32_malloc)(size_t); -.sp -.B void (*pcre32_free)(void *); -.sp -.B void *(*pcre32_stack_malloc)(size_t); -.sp -.B void (*pcre32_stack_free)(void *); -.sp -.B int (*pcre32_callout)(pcre32_callout_block *); -.fi -. -. -.SH "PCRE 32-BIT API 32-BIT-ONLY FUNCTION" -.rs -.sp -.nf -.B int pcre32_utf32_to_host_byte_order(PCRE_UCHAR32 *\fIoutput\fP, -.B " PCRE_SPTR32 \fIinput\fP, int \fIlength\fP, int *\fIbyte_order\fP," -.B " int \fIkeep_boms\fP);" -.fi -. -. -.SH "THE PCRE 32-BIT LIBRARY" -.rs -.sp -Starting with release 8.32, it is possible to compile a PCRE library that -supports 32-bit character strings, including UTF-32 strings, as well as or -instead of the original 8-bit library. This work was done by Christian Persch, -based on the work done by Zoltan Herczeg for the 16-bit library. All three -libraries contain identical sets of functions, used in exactly the same way. -Only the names of the functions and the data types of their arguments and -results are different. To avoid over-complication and reduce the documentation -maintenance load, most of the PCRE documentation describes the 8-bit library, -with only occasional references to the 16-bit and 32-bit libraries. This page -describes what is different when you use the 32-bit library. -.P -WARNING: A single application can be linked with all or any of the three -libraries, but you must take care when processing any particular pattern -to use functions from just one library. For example, if you want to study -a pattern that was compiled with \fBpcre32_compile()\fP, you must do so -with \fBpcre32_study()\fP, not \fBpcre_study()\fP, and you must free the -study data with \fBpcre32_free_study()\fP. -. -. -.SH "THE HEADER FILE" -.rs -.sp -There is only one header file, \fBpcre.h\fP. It contains prototypes for all the -functions in all libraries, as well as definitions of flags, structures, error -codes, etc. -. -. -.SH "THE LIBRARY NAME" -.rs -.sp -In Unix-like systems, the 32-bit library is called \fBlibpcre32\fP, and can -normally be accesss by adding \fB-lpcre32\fP to the command for linking an -application that uses PCRE. -. -. -.SH "STRING TYPES" -.rs -.sp -In the 8-bit library, strings are passed to PCRE library functions as vectors -of bytes with the C type "char *". In the 32-bit library, strings are passed as -vectors of unsigned 32-bit quantities. The macro PCRE_UCHAR32 specifies an -appropriate data type, and PCRE_SPTR32 is defined as "const PCRE_UCHAR32 *". In -very many environments, "unsigned int" is a 32-bit data type. When PCRE is -built, it defines PCRE_UCHAR32 as "unsigned int", but checks that it really is -a 32-bit data type. If it is not, the build fails with an error message telling -the maintainer to modify the definition appropriately. -. -. -.SH "STRUCTURE TYPES" -.rs -.sp -The types of the opaque structures that are used for compiled 32-bit patterns -and JIT stacks are \fBpcre32\fP and \fBpcre32_jit_stack\fP respectively. The -type of the user-accessible structure that is returned by \fBpcre32_study()\fP -is \fBpcre32_extra\fP, and the type of the structure that is used for passing -data to a callout function is \fBpcre32_callout_block\fP. These structures -contain the same fields, with the same names, as their 8-bit counterparts. The -only difference is that pointers to character strings are 32-bit instead of -8-bit types. -. -. -.SH "32-BIT FUNCTIONS" -.rs -.sp -For every function in the 8-bit library there is a corresponding function in -the 32-bit library with a name that starts with \fBpcre32_\fP instead of -\fBpcre_\fP. The prototypes are listed above. In addition, there is one extra -function, \fBpcre32_utf32_to_host_byte_order()\fP. This is a utility function -that converts a UTF-32 character string to host byte order if necessary. The -other 32-bit functions expect the strings they are passed to be in host byte -order. -.P -The \fIinput\fP and \fIoutput\fP arguments of -\fBpcre32_utf32_to_host_byte_order()\fP may point to the same address, that is, -conversion in place is supported. The output buffer must be at least as long as -the input. -.P -The \fIlength\fP argument specifies the number of 32-bit data units in the -input string; a negative value specifies a zero-terminated string. -.P -If \fIbyte_order\fP is NULL, it is assumed that the string starts off in host -byte order. This may be changed by byte-order marks (BOMs) anywhere in the -string (commonly as the first character). -.P -If \fIbyte_order\fP is not NULL, a non-zero value of the integer to which it -points means that the input starts off in host byte order, otherwise the -opposite order is assumed. Again, BOMs in the string can change this. The final -byte order is passed back at the end of processing. -.P -If \fIkeep_boms\fP is not zero, byte-order mark characters (0xfeff) are copied -into the output string. Otherwise they are discarded. -.P -The result of the function is the number of 32-bit units placed into the output -buffer, including the zero terminator if the string was zero-terminated. -. -. -.SH "SUBJECT STRING OFFSETS" -.rs -.sp -The lengths and starting offsets of subject strings must be specified in 32-bit -data units, and the offsets within subject strings that are returned by the -matching functions are in also 32-bit units rather than bytes. -. -. -.SH "NAMED SUBPATTERNS" -.rs -.sp -The name-to-number translation table that is maintained for named subpatterns -uses 32-bit characters. The \fBpcre32_get_stringtable_entries()\fP function -returns the length of each entry in the table as the number of 32-bit data -units. -. -. -.SH "OPTION NAMES" -.rs -.sp -There are two new general option names, PCRE_UTF32 and PCRE_NO_UTF32_CHECK, -which correspond to PCRE_UTF8 and PCRE_NO_UTF8_CHECK in the 8-bit library. In -fact, these new options define the same bits in the options word. There is a -discussion about the -.\" HTML -.\" -validity of UTF-32 strings -.\" -in the -.\" HREF -\fBpcreunicode\fP -.\" -page. -.P -For the \fBpcre32_config()\fP function there is an option PCRE_CONFIG_UTF32 -that returns 1 if UTF-32 support is configured, otherwise 0. If this option is -given to \fBpcre_config()\fP or \fBpcre16_config()\fP, or if the -PCRE_CONFIG_UTF8 or PCRE_CONFIG_UTF16 option is given to \fBpcre32_config()\fP, -the result is the PCRE_ERROR_BADOPTION error. -. -. -.SH "CHARACTER CODES" -.rs -.sp -In 32-bit mode, when PCRE_UTF32 is not set, character values are treated in the -same way as in 8-bit, non UTF-8 mode, except, of course, that they can range -from 0 to 0x7fffffff instead of 0 to 0xff. Character types for characters less -than 0xff can therefore be influenced by the locale in the same way as before. -Characters greater than 0xff have only one case, and no "type" (such as letter -or digit). -.P -In UTF-32 mode, the character code is Unicode, in the range 0 to 0x10ffff, with -the exception of values in the range 0xd800 to 0xdfff because those are -"surrogate" values that are ill-formed in UTF-32. -.P -A UTF-32 string can indicate its endianness by special code knows as a -byte-order mark (BOM). The PCRE functions do not handle this, expecting strings -to be in host byte order. A utility function called -\fBpcre32_utf32_to_host_byte_order()\fP is provided to help with this (see -above). -. -. -.SH "ERROR NAMES" -.rs -.sp -The error PCRE_ERROR_BADUTF32 corresponds to its 8-bit counterpart. -The error PCRE_ERROR_BADMODE is given when a compiled -pattern is passed to a function that processes patterns in the other -mode, for example, if a pattern compiled with \fBpcre_compile()\fP is passed to -\fBpcre32_exec()\fP. -.P -There are new error codes whose names begin with PCRE_UTF32_ERR for invalid -UTF-32 strings, corresponding to the PCRE_UTF8_ERR codes for UTF-8 strings that -are described in the section entitled -.\" HTML -.\" -"Reason codes for invalid UTF-8 strings" -.\" -in the main -.\" HREF -\fBpcreapi\fP -.\" -page. The UTF-32 errors are: -.sp - PCRE_UTF32_ERR1 Surrogate character (range from 0xd800 to 0xdfff) - PCRE_UTF32_ERR2 Non-character - PCRE_UTF32_ERR3 Character > 0x10ffff -. -. -.SH "ERROR TEXTS" -.rs -.sp -If there is an error while compiling a pattern, the error text that is passed -back by \fBpcre32_compile()\fP or \fBpcre32_compile2()\fP is still an 8-bit -character string, zero-terminated. -. -. -.SH "CALLOUTS" -.rs -.sp -The \fIsubject\fP and \fImark\fP fields in the callout block that is passed to -a callout function point to 32-bit vectors. -. -. -.SH "TESTING" -.rs -.sp -The \fBpcretest\fP program continues to operate with 8-bit input and output -files, but it can be used for testing the 32-bit library. If it is run with the -command line option \fB-32\fP, patterns and subject strings are converted from -8-bit to 32-bit before being passed to PCRE, and the 32-bit library functions -are used instead of the 8-bit ones. Returned 32-bit strings are converted to -8-bit for output. If both the 8-bit and the 16-bit libraries were not compiled, -\fBpcretest\fP defaults to 32-bit and the \fB-32\fP option is ignored. -.P -When PCRE is being built, the \fBRunTest\fP script that is called by "make -check" uses the \fBpcretest\fP \fB-C\fP option to discover which of the 8-bit, -16-bit and 32-bit libraries has been built, and runs the tests appropriately. -. -. -.SH "NOT SUPPORTED IN 32-BIT MODE" -.rs -.sp -Not all the features of the 8-bit library are available with the 32-bit -library. The C++ and POSIX wrapper functions support only the 8-bit library, -and the \fBpcregrep\fP program is at present 8-bit only. -. -. -.SH AUTHOR -.rs -.sp -.nf -Philip Hazel -University Computing Service -Cambridge CB2 3QH, England. -.fi -. -. -.SH REVISION -.rs -.sp -.nf -Last updated: 12 May 2013 -Copyright (c) 1997-2013 University of Cambridge. -.fi diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre32_assign_jit_stack.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre32_assign_jit_stack.3 deleted file mode 120000 index 40c8775a..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre32_assign_jit_stack.3 +++ /dev/null @@ -1 +0,0 @@ -pcre_assign_jit_stack.3 \ No newline at end of file diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre32_compile.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre32_compile.3 deleted file mode 120000 index 9364e751..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre32_compile.3 +++ /dev/null @@ -1 +0,0 @@ -pcre_compile.3 \ No newline at end of file diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre32_compile2.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre32_compile2.3 deleted file mode 120000 index 2d6aff35..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre32_compile2.3 +++ /dev/null @@ -1 +0,0 @@ -pcre_compile2.3 \ No newline at end of file diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre32_config.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre32_config.3 deleted file mode 120000 index db964059..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre32_config.3 +++ /dev/null @@ -1 +0,0 @@ -pcre_config.3 \ No newline at end of file diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre32_copy_named_substring.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre32_copy_named_substring.3 deleted file mode 120000 index c15b9774..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre32_copy_named_substring.3 +++ /dev/null @@ -1 +0,0 @@ -pcre_copy_named_substring.3 \ No newline at end of file diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre32_copy_substring.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre32_copy_substring.3 deleted file mode 120000 index 98d1f84d..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre32_copy_substring.3 +++ /dev/null @@ -1 +0,0 @@ -pcre_copy_substring.3 \ No newline at end of file diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre32_dfa_exec.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre32_dfa_exec.3 deleted file mode 120000 index ed408df0..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre32_dfa_exec.3 +++ /dev/null @@ -1 +0,0 @@ -pcre_dfa_exec.3 \ No newline at end of file diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre32_exec.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre32_exec.3 deleted file mode 120000 index ebaa2527..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre32_exec.3 +++ /dev/null @@ -1 +0,0 @@ -pcre_exec.3 \ No newline at end of file diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre32_free_study.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre32_free_study.3 deleted file mode 120000 index 4c53ea9f..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre32_free_study.3 +++ /dev/null @@ -1 +0,0 @@ -pcre_free_study.3 \ No newline at end of file diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre32_free_substring.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre32_free_substring.3 deleted file mode 120000 index 48567bfb..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre32_free_substring.3 +++ /dev/null @@ -1 +0,0 @@ -pcre_free_substring.3 \ No newline at end of file diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre32_free_substring_list.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre32_free_substring_list.3 deleted file mode 120000 index 84b7b7e5..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre32_free_substring_list.3 +++ /dev/null @@ -1 +0,0 @@ -pcre_free_substring_list.3 \ No newline at end of file diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre32_fullinfo.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre32_fullinfo.3 deleted file mode 120000 index b7386a98..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre32_fullinfo.3 +++ /dev/null @@ -1 +0,0 @@ -pcre_fullinfo.3 \ No newline at end of file diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre32_get_named_substring.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre32_get_named_substring.3 deleted file mode 120000 index c095ca50..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre32_get_named_substring.3 +++ /dev/null @@ -1 +0,0 @@ -pcre_get_named_substring.3 \ No newline at end of file diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre32_get_stringnumber.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre32_get_stringnumber.3 deleted file mode 120000 index f8e81d32..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre32_get_stringnumber.3 +++ /dev/null @@ -1 +0,0 @@ -pcre_get_stringnumber.3 \ No newline at end of file diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre32_get_stringtable_entries.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre32_get_stringtable_entries.3 deleted file mode 120000 index 9f8cc4a7..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre32_get_stringtable_entries.3 +++ /dev/null @@ -1 +0,0 @@ -pcre_get_stringtable_entries.3 \ No newline at end of file diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre32_get_substring.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre32_get_substring.3 deleted file mode 120000 index 26383b5d..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre32_get_substring.3 +++ /dev/null @@ -1 +0,0 @@ -pcre_get_substring.3 \ No newline at end of file diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre32_get_substring_list.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre32_get_substring_list.3 deleted file mode 120000 index 2faa865f..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre32_get_substring_list.3 +++ /dev/null @@ -1 +0,0 @@ -pcre_get_substring_list.3 \ No newline at end of file diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre32_jit_exec.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre32_jit_exec.3 deleted file mode 120000 index 59089ada..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre32_jit_exec.3 +++ /dev/null @@ -1 +0,0 @@ -pcre_jit_exec.3 \ No newline at end of file diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre32_jit_stack_alloc.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre32_jit_stack_alloc.3 deleted file mode 120000 index dab43b82..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre32_jit_stack_alloc.3 +++ /dev/null @@ -1 +0,0 @@ -pcre_jit_stack_alloc.3 \ No newline at end of file diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre32_jit_stack_free.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre32_jit_stack_free.3 deleted file mode 120000 index e92aa310..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre32_jit_stack_free.3 +++ /dev/null @@ -1 +0,0 @@ -pcre_jit_stack_free.3 \ No newline at end of file diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre32_maketables.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre32_maketables.3 deleted file mode 120000 index 3b6308e2..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre32_maketables.3 +++ /dev/null @@ -1 +0,0 @@ -pcre_maketables.3 \ No newline at end of file diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre32_pattern_to_host_byte_order.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre32_pattern_to_host_byte_order.3 deleted file mode 120000 index 6540917e..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre32_pattern_to_host_byte_order.3 +++ /dev/null @@ -1 +0,0 @@ -pcre_pattern_to_host_byte_order.3 \ No newline at end of file diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre32_refcount.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre32_refcount.3 deleted file mode 120000 index 63cece3f..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre32_refcount.3 +++ /dev/null @@ -1 +0,0 @@ -pcre_refcount.3 \ No newline at end of file diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre32_study.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre32_study.3 deleted file mode 120000 index 9871217f..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre32_study.3 +++ /dev/null @@ -1 +0,0 @@ -pcre_study.3 \ No newline at end of file diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre32_utf32_to_host_byte_order.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre32_utf32_to_host_byte_order.3 deleted file mode 120000 index e9699f5f..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre32_utf32_to_host_byte_order.3 +++ /dev/null @@ -1 +0,0 @@ -pcre_utf32_to_host_byte_order.3 \ No newline at end of file diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre32_version.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre32_version.3 deleted file mode 120000 index c31893c6..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre32_version.3 +++ /dev/null @@ -1 +0,0 @@ -pcre_version.3 \ No newline at end of file diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre_assign_jit_stack.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre_assign_jit_stack.3 deleted file mode 100644 index 0ecf6f2c..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre_assign_jit_stack.3 +++ /dev/null @@ -1,59 +0,0 @@ -.TH PCRE_ASSIGN_JIT_STACK 3 "24 June 2012" "PCRE 8.30" -.SH NAME -PCRE - Perl-compatible regular expressions -.SH SYNOPSIS -.rs -.sp -.B #include -.PP -.nf -.B void pcre_assign_jit_stack(pcre_extra *\fIextra\fP, -.B " pcre_jit_callback \fIcallback\fP, void *\fIdata\fP);" -.sp -.B void pcre16_assign_jit_stack(pcre16_extra *\fIextra\fP, -.B " pcre16_jit_callback \fIcallback\fP, void *\fIdata\fP);" -.sp -.B void pcre32_assign_jit_stack(pcre32_extra *\fIextra\fP, -.B " pcre32_jit_callback \fIcallback\fP, void *\fIdata\fP);" -.fi -. -.SH DESCRIPTION -.rs -.sp -This function provides control over the memory used as a stack at run-time by a -call to \fBpcre[16|32]_exec()\fP with a pattern that has been successfully -compiled with JIT optimization. The arguments are: -.sp - extra the data pointer returned by \fBpcre[16|32]_study()\fP - callback a callback function - data a JIT stack or a value to be passed to the callback - function -.P -If \fIcallback\fP is NULL and \fIdata\fP is NULL, an internal 32K block on -the machine stack is used. -.P -If \fIcallback\fP is NULL and \fIdata\fP is not NULL, \fIdata\fP must -be a valid JIT stack, the result of calling \fBpcre[16|32]_jit_stack_alloc()\fP. -.P -If \fIcallback\fP not NULL, it is called with \fIdata\fP as an argument at -the start of matching, in order to set up a JIT stack. If the result is NULL, -the internal 32K stack is used; otherwise the return value must be a valid JIT -stack, the result of calling \fBpcre[16|32]_jit_stack_alloc()\fP. -.P -You may safely assign the same JIT stack to multiple patterns, as long as they -are all matched in the same thread. In a multithread application, each thread -must use its own JIT stack. For more details, see the -.\" HREF -\fBpcrejit\fP -.\" -page. -.P -There is a complete description of the PCRE native API in the -.\" HREF -\fBpcreapi\fP -.\" -page and a description of the POSIX API in the -.\" HREF -\fBpcreposix\fP -.\" -page. diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre_compile.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre_compile.3 deleted file mode 100644 index 5c16ebe2..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre_compile.3 +++ /dev/null @@ -1,96 +0,0 @@ -.TH PCRE_COMPILE 3 "01 October 2013" "PCRE 8.34" -.SH NAME -PCRE - Perl-compatible regular expressions -.SH SYNOPSIS -.rs -.sp -.B #include -.PP -.nf -.B pcre *pcre_compile(const char *\fIpattern\fP, int \fIoptions\fP, -.B " const char **\fIerrptr\fP, int *\fIerroffset\fP," -.B " const unsigned char *\fItableptr\fP);" -.sp -.B pcre16 *pcre16_compile(PCRE_SPTR16 \fIpattern\fP, int \fIoptions\fP, -.B " const char **\fIerrptr\fP, int *\fIerroffset\fP," -.B " const unsigned char *\fItableptr\fP);" -.sp -.B pcre32 *pcre32_compile(PCRE_SPTR32 \fIpattern\fP, int \fIoptions\fP, -.B " const char **\fIerrptr\fP, int *\fIerroffset\fP," -.B " const unsigned char *\fItableptr\fP);" -.fi -. -.SH DESCRIPTION -.rs -.sp -This function compiles a regular expression into an internal form. It is the -same as \fBpcre[16|32]_compile2()\fP, except for the absence of the -\fIerrorcodeptr\fP argument. Its arguments are: -.sp - \fIpattern\fP A zero-terminated string containing the - regular expression to be compiled - \fIoptions\fP Zero or more option bits - \fIerrptr\fP Where to put an error message - \fIerroffset\fP Offset in pattern where error was found - \fItableptr\fP Pointer to character tables, or NULL to - use the built-in default -.sp -The option bits are: -.sp - PCRE_ANCHORED Force pattern anchoring - PCRE_AUTO_CALLOUT Compile automatic callouts - PCRE_BSR_ANYCRLF \eR matches only CR, LF, or CRLF - PCRE_BSR_UNICODE \eR matches all Unicode line endings - PCRE_CASELESS Do caseless matching - PCRE_DOLLAR_ENDONLY $ not to match newline at end - PCRE_DOTALL . matches anything including NL - PCRE_DUPNAMES Allow duplicate names for subpatterns - PCRE_EXTENDED Ignore white space and # comments - PCRE_EXTRA PCRE extra features - (not much use currently) - PCRE_FIRSTLINE Force matching to be before newline - PCRE_JAVASCRIPT_COMPAT JavaScript compatibility - PCRE_MULTILINE ^ and $ match newlines within data - PCRE_NEVER_UTF Lock out UTF, e.g. via (*UTF) - PCRE_NEWLINE_ANY Recognize any Unicode newline sequence - PCRE_NEWLINE_ANYCRLF Recognize CR, LF, and CRLF as newline - sequences - PCRE_NEWLINE_CR Set CR as the newline sequence - PCRE_NEWLINE_CRLF Set CRLF as the newline sequence - PCRE_NEWLINE_LF Set LF as the newline sequence - PCRE_NO_AUTO_CAPTURE Disable numbered capturing paren- - theses (named ones available) - PCRE_NO_AUTO_POSSESS Disable auto-possessification - PCRE_NO_START_OPTIMIZE Disable match-time start optimizations - PCRE_NO_UTF16_CHECK Do not check the pattern for UTF-16 - validity (only relevant if - PCRE_UTF16 is set) - PCRE_NO_UTF32_CHECK Do not check the pattern for UTF-32 - validity (only relevant if - PCRE_UTF32 is set) - PCRE_NO_UTF8_CHECK Do not check the pattern for UTF-8 - validity (only relevant if - PCRE_UTF8 is set) - PCRE_UCP Use Unicode properties for \ed, \ew, etc. - PCRE_UNGREEDY Invert greediness of quantifiers - PCRE_UTF16 Run in \fBpcre16_compile()\fP UTF-16 mode - PCRE_UTF32 Run in \fBpcre32_compile()\fP UTF-32 mode - PCRE_UTF8 Run in \fBpcre_compile()\fP UTF-8 mode -.sp -PCRE must be built with UTF support in order to use PCRE_UTF8/16/32 and -PCRE_NO_UTF8/16/32_CHECK, and with UCP support if PCRE_UCP is used. -.P -The yield of the function is a pointer to a private data structure that -contains the compiled pattern, or NULL if an error was detected. Note that -compiling regular expressions with one version of PCRE for use with a different -version is not guaranteed to work and may cause crashes. -.P -There is a complete description of the PCRE native API in the -.\" HREF -\fBpcreapi\fP -.\" -page and a description of the POSIX API in the -.\" HREF -\fBpcreposix\fP -.\" -page. diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre_compile2.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre_compile2.3 deleted file mode 100644 index 37742018..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre_compile2.3 +++ /dev/null @@ -1,101 +0,0 @@ -.TH PCRE_COMPILE2 3 "01 October 2013" "PCRE 8.34" -.SH NAME -PCRE - Perl-compatible regular expressions -.SH SYNOPSIS -.rs -.sp -.B #include -.PP -.nf -.B pcre *pcre_compile2(const char *\fIpattern\fP, int \fIoptions\fP, -.B " int *\fIerrorcodeptr\fP," -.B " const char **\fIerrptr\fP, int *\fIerroffset\fP," -.B " const unsigned char *\fItableptr\fP);" -.sp -.B pcre16 *pcre16_compile2(PCRE_SPTR16 \fIpattern\fP, int \fIoptions\fP, -.B " int *\fIerrorcodeptr\fP," -.B " const char **\fIerrptr\fP, int *\fIerroffset\fP," -.B " const unsigned char *\fItableptr\fP);" -.sp -.B pcre32 *pcre32_compile2(PCRE_SPTR32 \fIpattern\fP, int \fIoptions\fP, -.B " int *\fIerrorcodeptr\fP,£ -.B " const char **\fIerrptr\fP, int *\fIerroffset\fP," -.B " const unsigned char *\fItableptr\fP);" -.fi -. -.SH DESCRIPTION -.rs -.sp -This function compiles a regular expression into an internal form. It is the -same as \fBpcre[16|32]_compile()\fP, except for the addition of the -\fIerrorcodeptr\fP argument. The arguments are: -. -.sp - \fIpattern\fP A zero-terminated string containing the - regular expression to be compiled - \fIoptions\fP Zero or more option bits - \fIerrorcodeptr\fP Where to put an error code - \fIerrptr\fP Where to put an error message - \fIerroffset\fP Offset in pattern where error was found - \fItableptr\fP Pointer to character tables, or NULL to - use the built-in default -.sp -The option bits are: -.sp - PCRE_ANCHORED Force pattern anchoring - PCRE_AUTO_CALLOUT Compile automatic callouts - PCRE_BSR_ANYCRLF \eR matches only CR, LF, or CRLF - PCRE_BSR_UNICODE \eR matches all Unicode line endings - PCRE_CASELESS Do caseless matching - PCRE_DOLLAR_ENDONLY $ not to match newline at end - PCRE_DOTALL . matches anything including NL - PCRE_DUPNAMES Allow duplicate names for subpatterns - PCRE_EXTENDED Ignore white space and # comments - PCRE_EXTRA PCRE extra features - (not much use currently) - PCRE_FIRSTLINE Force matching to be before newline - PCRE_JAVASCRIPT_COMPAT JavaScript compatibility - PCRE_MULTILINE ^ and $ match newlines within data - PCRE_NEVER_UTF Lock out UTF, e.g. via (*UTF) - PCRE_NEWLINE_ANY Recognize any Unicode newline sequence - PCRE_NEWLINE_ANYCRLF Recognize CR, LF, and CRLF as newline - sequences - PCRE_NEWLINE_CR Set CR as the newline sequence - PCRE_NEWLINE_CRLF Set CRLF as the newline sequence - PCRE_NEWLINE_LF Set LF as the newline sequence - PCRE_NO_AUTO_CAPTURE Disable numbered capturing paren- - theses (named ones available) - PCRE_NO_AUTO_POSSESS Disable auto-possessification - PCRE_NO_START_OPTIMIZE Disable match-time start optimizations - PCRE_NO_UTF16_CHECK Do not check the pattern for UTF-16 - validity (only relevant if - PCRE_UTF16 is set) - PCRE_NO_UTF32_CHECK Do not check the pattern for UTF-32 - validity (only relevant if - PCRE_UTF32 is set) - PCRE_NO_UTF8_CHECK Do not check the pattern for UTF-8 - validity (only relevant if - PCRE_UTF8 is set) - PCRE_UCP Use Unicode properties for \ed, \ew, etc. - PCRE_UNGREEDY Invert greediness of quantifiers - PCRE_UTF16 Run \fBpcre16_compile()\fP in UTF-16 mode - PCRE_UTF32 Run \fBpcre32_compile()\fP in UTF-32 mode - PCRE_UTF8 Run \fBpcre_compile()\fP in UTF-8 mode -.sp -PCRE must be built with UTF support in order to use PCRE_UTF8/16/32 and -PCRE_NO_UTF8/16/32_CHECK, and with UCP support if PCRE_UCP is used. -.P -The yield of the function is a pointer to a private data structure that -contains the compiled pattern, or NULL if an error was detected. Note that -compiling regular expressions with one version of PCRE for use with a different -version is not guaranteed to work and may cause crashes. -.P -There is a complete description of the PCRE native API in the -.\" HREF -\fBpcreapi\fP -.\" -page and a description of the POSIX API in the -.\" HREF -\fBpcreposix\fP -.\" -page. diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre_config.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre_config.3 deleted file mode 100644 index d14ffdad..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre_config.3 +++ /dev/null @@ -1,79 +0,0 @@ -.TH PCRE_CONFIG 3 "20 April 2014" "PCRE 8.36" -.SH NAME -PCRE - Perl-compatible regular expressions -.SH SYNOPSIS -.rs -.sp -.B #include -.PP -.SM -.B int pcre_config(int \fIwhat\fP, void *\fIwhere\fP); -.PP -.B int pcre16_config(int \fIwhat\fP, void *\fIwhere\fP); -.PP -.B int pcre32_config(int \fIwhat\fP, void *\fIwhere\fP); -. -.SH DESCRIPTION -.rs -.sp -This function makes it possible for a client program to find out which optional -features are available in the version of the PCRE library it is using. The -arguments are as follows: -.sp - \fIwhat\fP A code specifying what information is required - \fIwhere\fP Points to where to put the data -.sp -The \fIwhere\fP argument must point to an integer variable, except for -PCRE_CONFIG_MATCH_LIMIT, PCRE_CONFIG_MATCH_LIMIT_RECURSION, and -PCRE_CONFIG_PARENS_LIMIT, when it must point to an unsigned long integer, -and for PCRE_CONFIG_JITTARGET, when it must point to a const char*. -The available codes are: -.sp - PCRE_CONFIG_JIT Availability of just-in-time compiler - support (1=yes 0=no) - PCRE_CONFIG_JITTARGET String containing information about the - target architecture for the JIT compiler, - or NULL if there is no JIT support - PCRE_CONFIG_LINK_SIZE Internal link size: 2, 3, or 4 - PCRE_CONFIG_PARENS_LIMIT Parentheses nesting limit - PCRE_CONFIG_MATCH_LIMIT Internal resource limit - PCRE_CONFIG_MATCH_LIMIT_RECURSION - Internal recursion depth limit - PCRE_CONFIG_NEWLINE Value of the default newline sequence: - 13 (0x000d) for CR - 10 (0x000a) for LF - 3338 (0x0d0a) for CRLF - -2 for ANYCRLF - -1 for ANY - PCRE_CONFIG_BSR Indicates what \eR matches by default: - 0 all Unicode line endings - 1 CR, LF, or CRLF only - PCRE_CONFIG_POSIX_MALLOC_THRESHOLD - Threshold of return slots, above which - \fBmalloc()\fP is used by the POSIX API - PCRE_CONFIG_STACKRECURSE Recursion implementation (1=stack 0=heap) - PCRE_CONFIG_UTF16 Availability of UTF-16 support (1=yes - 0=no); option for \fBpcre16_config()\fP - PCRE_CONFIG_UTF32 Availability of UTF-32 support (1=yes - 0=no); option for \fBpcre32_config()\fP - PCRE_CONFIG_UTF8 Availability of UTF-8 support (1=yes 0=no); - option for \fBpcre_config()\fP - PCRE_CONFIG_UNICODE_PROPERTIES - Availability of Unicode property support - (1=yes 0=no) -.sp -The function yields 0 on success or PCRE_ERROR_BADOPTION otherwise. That error -is also given if PCRE_CONFIG_UTF16 or PCRE_CONFIG_UTF32 is passed to -\fBpcre_config()\fP, if PCRE_CONFIG_UTF8 or PCRE_CONFIG_UTF32 is passed to -\fBpcre16_config()\fP, or if PCRE_CONFIG_UTF8 or PCRE_CONFIG_UTF16 is passed to -\fBpcre32_config()\fP. -.P -There is a complete description of the PCRE native API in the -.\" HREF -\fBpcreapi\fP -.\" -page and a description of the POSIX API in the -.\" HREF -\fBpcreposix\fP -.\" -page. diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre_copy_named_substring.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre_copy_named_substring.3 deleted file mode 100644 index 52582aec..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre_copy_named_substring.3 +++ /dev/null @@ -1,51 +0,0 @@ -.TH PCRE_COPY_NAMED_SUBSTRING 3 "24 June 2012" "PCRE 8.30" -.SH NAME -PCRE - Perl-compatible regular expressions -.SH SYNOPSIS -.rs -.sp -.B #include -.PP -.nf -.B int pcre_copy_named_substring(const pcre *\fIcode\fP, -.B " const char *\fIsubject\fP, int *\fIovector\fP," -.B " int \fIstringcount\fP, const char *\fIstringname\fP," -.B " char *\fIbuffer\fP, int \fIbuffersize\fP);" -.sp -.B int pcre16_copy_named_substring(const pcre16 *\fIcode\fP, -.B " PCRE_SPTR16 \fIsubject\fP, int *\fIovector\fP," -.B " int \fIstringcount\fP, PCRE_SPTR16 \fIstringname\fP," -.B " PCRE_UCHAR16 *\fIbuffer\fP, int \fIbuffersize\fP);" -.sp -.B int pcre32_copy_named_substring(const pcre32 *\fIcode\fP, -.B " PCRE_SPTR32 \fIsubject\fP, int *\fIovector\fP," -.B " int \fIstringcount\fP, PCRE_SPTR32 \fIstringname\fP," -.B " PCRE_UCHAR32 *\fIbuffer\fP, int \fIbuffersize\fP);" -.fi -. -.SH DESCRIPTION -.rs -.sp -This is a convenience function for extracting a captured substring, identified -by name, into a given buffer. The arguments are: -.sp - \fIcode\fP Pattern that was successfully matched - \fIsubject\fP Subject that has been successfully matched - \fIovector\fP Offset vector that \fBpcre[16|32]_exec()\fP used - \fIstringcount\fP Value returned by \fBpcre[16|32]_exec()\fP - \fIstringname\fP Name of the required substring - \fIbuffer\fP Buffer to receive the string - \fIbuffersize\fP Size of buffer -.sp -The yield is the length of the substring, PCRE_ERROR_NOMEMORY if the buffer was -too small, or PCRE_ERROR_NOSUBSTRING if the string name is invalid. -.P -There is a complete description of the PCRE native API in the -.\" HREF -\fBpcreapi\fP -.\" -page and a description of the POSIX API in the -.\" HREF -\fBpcreposix\fP -.\" -page. diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre_copy_substring.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre_copy_substring.3 deleted file mode 100644 index 83af6e80..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre_copy_substring.3 +++ /dev/null @@ -1,47 +0,0 @@ -.TH PCRE_COPY_SUBSTRING 3 "24 June 2012" "PCRE 8.30" -.SH NAME -PCRE - Perl-compatible regular expressions -.SH SYNOPSIS -.rs -.sp -.B #include -.PP -.nf -.B int pcre_copy_substring(const char *\fIsubject\fP, int *\fIovector\fP, -.B " int \fIstringcount\fP, int \fIstringnumber\fP, char *\fIbuffer\fP," -.B " int \fIbuffersize\fP);" -.sp -.B int pcre16_copy_substring(PCRE_SPTR16 \fIsubject\fP, int *\fIovector\fP, -.B " int \fIstringcount\fP, int \fIstringnumber\fP, PCRE_UCHAR16 *\fIbuffer\fP," -.B " int \fIbuffersize\fP);" -.sp -.B int pcre32_copy_substring(PCRE_SPTR32 \fIsubject\fP, int *\fIovector\fP, -.B " int \fIstringcount\fP, int \fIstringnumber\fP, PCRE_UCHAR32 *\fIbuffer\fP," -.B " int \fIbuffersize\fP);" -.fi -. -.SH DESCRIPTION -.rs -.sp -This is a convenience function for extracting a captured substring into a given -buffer. The arguments are: -.sp - \fIsubject\fP Subject that has been successfully matched - \fIovector\fP Offset vector that \fBpcre[16|32]_exec()\fP used - \fIstringcount\fP Value returned by \fBpcre[16|32]_exec()\fP - \fIstringnumber\fP Number of the required substring - \fIbuffer\fP Buffer to receive the string - \fIbuffersize\fP Size of buffer -.sp -The yield is the length of the string, PCRE_ERROR_NOMEMORY if the buffer was -too small, or PCRE_ERROR_NOSUBSTRING if the string number is invalid. -.P -There is a complete description of the PCRE native API in the -.\" HREF -\fBpcreapi\fP -.\" -page and a description of the POSIX API in the -.\" HREF -\fBpcreposix\fP -.\" -page. diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre_dfa_exec.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre_dfa_exec.3 deleted file mode 100644 index 39c2e836..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre_dfa_exec.3 +++ /dev/null @@ -1,118 +0,0 @@ -.TH PCRE_DFA_EXEC 3 "12 May 2013" "PCRE 8.33" -.SH NAME -PCRE - Perl-compatible regular expressions -.SH SYNOPSIS -.rs -.sp -.B #include -.PP -.nf -.B int pcre_dfa_exec(const pcre *\fIcode\fP, "const pcre_extra *\fIextra\fP," -.B " const char *\fIsubject\fP, int \fIlength\fP, int \fIstartoffset\fP," -.B " int \fIoptions\fP, int *\fIovector\fP, int \fIovecsize\fP," -.B " int *\fIworkspace\fP, int \fIwscount\fP);" -.sp -.B int pcre16_dfa_exec(const pcre16 *\fIcode\fP, "const pcre16_extra *\fIextra\fP," -.B " PCRE_SPTR16 \fIsubject\fP, int \fIlength\fP, int \fIstartoffset\fP," -.B " int \fIoptions\fP, int *\fIovector\fP, int \fIovecsize\fP," -.B " int *\fIworkspace\fP, int \fIwscount\fP);" -.sp -.B int pcre32_dfa_exec(const pcre32 *\fIcode\fP, "const pcre32_extra *\fIextra\fP," -.B " PCRE_SPTR32 \fIsubject\fP, int \fIlength\fP, int \fIstartoffset\fP," -.B " int \fIoptions\fP, int *\fIovector\fP, int \fIovecsize\fP," -.B " int *\fIworkspace\fP, int \fIwscount\fP);" -.fi -. -.SH DESCRIPTION -.rs -.sp -This function matches a compiled regular expression against a given subject -string, using an alternative matching algorithm that scans the subject string -just once (\fInot\fP Perl-compatible). Note that the main, Perl-compatible, -matching function is \fBpcre[16|32]_exec()\fP. The arguments for this function -are: -.sp - \fIcode\fP Points to the compiled pattern - \fIextra\fP Points to an associated \fBpcre[16|32]_extra\fP structure, - or is NULL - \fIsubject\fP Points to the subject string - \fIlength\fP Length of the subject string - \fIstartoffset\fP Offset in the subject at which to start matching - \fIoptions\fP Option bits - \fIovector\fP Points to a vector of ints for result offsets - \fIovecsize\fP Number of elements in the vector - \fIworkspace\fP Points to a vector of ints used as working space - \fIwscount\fP Number of elements in the vector -.sp -The units for \fIlength\fP and \fIstartoffset\fP are bytes for -\fBpcre_exec()\fP, 16-bit data items for \fBpcre16_exec()\fP, and 32-bit items -for \fBpcre32_exec()\fP. The options are: -.sp - PCRE_ANCHORED Match only at the first position - PCRE_BSR_ANYCRLF \eR matches only CR, LF, or CRLF - PCRE_BSR_UNICODE \eR matches all Unicode line endings - PCRE_NEWLINE_ANY Recognize any Unicode newline sequence - PCRE_NEWLINE_ANYCRLF Recognize CR, LF, & CRLF as newline sequences - PCRE_NEWLINE_CR Recognize CR as the only newline sequence - PCRE_NEWLINE_CRLF Recognize CRLF as the only newline sequence - PCRE_NEWLINE_LF Recognize LF as the only newline sequence - PCRE_NOTBOL Subject is not the beginning of a line - PCRE_NOTEOL Subject is not the end of a line - PCRE_NOTEMPTY An empty string is not a valid match - PCRE_NOTEMPTY_ATSTART An empty string at the start of the subject - is not a valid match - PCRE_NO_START_OPTIMIZE Do not do "start-match" optimizations - PCRE_NO_UTF16_CHECK Do not check the subject for UTF-16 - validity (only relevant if PCRE_UTF16 - was set at compile time) - PCRE_NO_UTF32_CHECK Do not check the subject for UTF-32 - validity (only relevant if PCRE_UTF32 - was set at compile time) - PCRE_NO_UTF8_CHECK Do not check the subject for UTF-8 - validity (only relevant if PCRE_UTF8 - was set at compile time) - PCRE_PARTIAL ) Return PCRE_ERROR_PARTIAL for a partial - PCRE_PARTIAL_SOFT ) match if no full matches are found - PCRE_PARTIAL_HARD Return PCRE_ERROR_PARTIAL for a partial match - even if there is a full match as well - PCRE_DFA_SHORTEST Return only the shortest match - PCRE_DFA_RESTART Restart after a partial match -.sp -There are restrictions on what may appear in a pattern when using this matching -function. Details are given in the -.\" HREF -\fBpcrematching\fP -.\" -documentation. For details of partial matching, see the -.\" HREF -\fBpcrepartial\fP -.\" -page. -.P -A \fBpcre[16|32]_extra\fP structure contains the following fields: -.sp - \fIflags\fP Bits indicating which fields are set - \fIstudy_data\fP Opaque data from \fBpcre[16|32]_study()\fP - \fImatch_limit\fP Limit on internal resource use - \fImatch_limit_recursion\fP Limit on internal recursion depth - \fIcallout_data\fP Opaque data passed back to callouts - \fItables\fP Points to character tables or is NULL - \fImark\fP For passing back a *MARK pointer - \fIexecutable_jit\fP Opaque data from JIT compilation -.sp -The flag bits are PCRE_EXTRA_STUDY_DATA, PCRE_EXTRA_MATCH_LIMIT, -PCRE_EXTRA_MATCH_LIMIT_RECURSION, PCRE_EXTRA_CALLOUT_DATA, -PCRE_EXTRA_TABLES, PCRE_EXTRA_MARK and PCRE_EXTRA_EXECUTABLE_JIT. For this -matching function, the \fImatch_limit\fP and \fImatch_limit_recursion\fP fields -are not used, and must not be set. The PCRE_EXTRA_EXECUTABLE_JIT flag and -the corresponding variable are ignored. -.P -There is a complete description of the PCRE native API in the -.\" HREF -\fBpcreapi\fP -.\" -page and a description of the POSIX API in the -.\" HREF -\fBpcreposix\fP -.\" -page. diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre_exec.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre_exec.3 deleted file mode 100644 index 4686bd6d..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre_exec.3 +++ /dev/null @@ -1,99 +0,0 @@ -.TH PCRE_EXEC 3 "12 May 2013" "PCRE 8.33" -.SH NAME -PCRE - Perl-compatible regular expressions -.SH SYNOPSIS -.rs -.sp -.B #include -.PP -.nf -.B int pcre_exec(const pcre *\fIcode\fP, "const pcre_extra *\fIextra\fP," -.B " const char *\fIsubject\fP, int \fIlength\fP, int \fIstartoffset\fP," -.B " int \fIoptions\fP, int *\fIovector\fP, int \fIovecsize\fP);" -.sp -.B int pcre16_exec(const pcre16 *\fIcode\fP, "const pcre16_extra *\fIextra\fP," -.B " PCRE_SPTR16 \fIsubject\fP, int \fIlength\fP, int \fIstartoffset\fP," -.B " int \fIoptions\fP, int *\fIovector\fP, int \fIovecsize\fP);" -.sp -.B int pcre32_exec(const pcre32 *\fIcode\fP, "const pcre32_extra *\fIextra\fP," -.B " PCRE_SPTR32 \fIsubject\fP, int \fIlength\fP, int \fIstartoffset\fP," -.B " int \fIoptions\fP, int *\fIovector\fP, int \fIovecsize\fP);" -.fi -. -.SH DESCRIPTION -.rs -.sp -This function matches a compiled regular expression against a given subject -string, using a matching algorithm that is similar to Perl's. It returns -offsets to captured substrings. Its arguments are: -.sp - \fIcode\fP Points to the compiled pattern - \fIextra\fP Points to an associated \fBpcre[16|32]_extra\fP structure, - or is NULL - \fIsubject\fP Points to the subject string - \fIlength\fP Length of the subject string - \fIstartoffset\fP Offset in the subject at which to start matching - \fIoptions\fP Option bits - \fIovector\fP Points to a vector of ints for result offsets - \fIovecsize\fP Number of elements in the vector (a multiple of 3) -.sp -The units for \fIlength\fP and \fIstartoffset\fP are bytes for -\fBpcre_exec()\fP, 16-bit data items for \fBpcre16_exec()\fP, and 32-bit items -for \fBpcre32_exec()\fP. The options are: -.sp - PCRE_ANCHORED Match only at the first position - PCRE_BSR_ANYCRLF \eR matches only CR, LF, or CRLF - PCRE_BSR_UNICODE \eR matches all Unicode line endings - PCRE_NEWLINE_ANY Recognize any Unicode newline sequence - PCRE_NEWLINE_ANYCRLF Recognize CR, LF, & CRLF as newline sequences - PCRE_NEWLINE_CR Recognize CR as the only newline sequence - PCRE_NEWLINE_CRLF Recognize CRLF as the only newline sequence - PCRE_NEWLINE_LF Recognize LF as the only newline sequence - PCRE_NOTBOL Subject string is not the beginning of a line - PCRE_NOTEOL Subject string is not the end of a line - PCRE_NOTEMPTY An empty string is not a valid match - PCRE_NOTEMPTY_ATSTART An empty string at the start of the subject - is not a valid match - PCRE_NO_START_OPTIMIZE Do not do "start-match" optimizations - PCRE_NO_UTF16_CHECK Do not check the subject for UTF-16 - validity (only relevant if PCRE_UTF16 - was set at compile time) - PCRE_NO_UTF32_CHECK Do not check the subject for UTF-32 - validity (only relevant if PCRE_UTF32 - was set at compile time) - PCRE_NO_UTF8_CHECK Do not check the subject for UTF-8 - validity (only relevant if PCRE_UTF8 - was set at compile time) - PCRE_PARTIAL ) Return PCRE_ERROR_PARTIAL for a partial - PCRE_PARTIAL_SOFT ) match if no full matches are found - PCRE_PARTIAL_HARD Return PCRE_ERROR_PARTIAL for a partial match - if that is found before a full match -.sp -For details of partial matching, see the -.\" HREF -\fBpcrepartial\fP -.\" -page. A \fBpcre_extra\fP structure contains the following fields: -.sp - \fIflags\fP Bits indicating which fields are set - \fIstudy_data\fP Opaque data from \fBpcre[16|32]_study()\fP - \fImatch_limit\fP Limit on internal resource use - \fImatch_limit_recursion\fP Limit on internal recursion depth - \fIcallout_data\fP Opaque data passed back to callouts - \fItables\fP Points to character tables or is NULL - \fImark\fP For passing back a *MARK pointer - \fIexecutable_jit\fP Opaque data from JIT compilation -.sp -The flag bits are PCRE_EXTRA_STUDY_DATA, PCRE_EXTRA_MATCH_LIMIT, -PCRE_EXTRA_MATCH_LIMIT_RECURSION, PCRE_EXTRA_CALLOUT_DATA, -PCRE_EXTRA_TABLES, PCRE_EXTRA_MARK and PCRE_EXTRA_EXECUTABLE_JIT. -.P -There is a complete description of the PCRE native API in the -.\" HREF -\fBpcreapi\fP -.\" -page and a description of the POSIX API in the -.\" HREF -\fBpcreposix\fP -.\" -page. diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre_free_study.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre_free_study.3 deleted file mode 100644 index 8826b735..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre_free_study.3 +++ /dev/null @@ -1,31 +0,0 @@ -.TH PCRE_FREE_STUDY 3 "24 June 2012" "PCRE 8.30" -.SH NAME -PCRE - Perl-compatible regular expressions -.SH SYNOPSIS -.rs -.sp -.B #include -.PP -.SM -.B void pcre_free_study(pcre_extra *\fIextra\fP); -.PP -.B void pcre16_free_study(pcre16_extra *\fIextra\fP); -.PP -.B void pcre32_free_study(pcre32_extra *\fIextra\fP); -. -.SH DESCRIPTION -.rs -.sp -This function is used to free the memory used for the data generated by a call -to \fBpcre[16|32]_study()\fP when it is no longer needed. The argument must be the -result of such a call. -.P -There is a complete description of the PCRE native API in the -.\" HREF -\fBpcreapi\fP -.\" -page and a description of the POSIX API in the -.\" HREF -\fBpcreposix\fP -.\" -page. diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre_free_substring.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre_free_substring.3 deleted file mode 100644 index 88c04019..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre_free_substring.3 +++ /dev/null @@ -1,31 +0,0 @@ -.TH PCRE_FREE_SUBSTRING 3 "24 June 2012" "PCRE 8.30" -.SH NAME -PCRE - Perl-compatible regular expressions -.SH SYNOPSIS -.rs -.sp -.B #include -.PP -.SM -.B void pcre_free_substring(const char *\fIstringptr\fP); -.PP -.B void pcre16_free_substring(PCRE_SPTR16 \fIstringptr\fP); -.PP -.B void pcre32_free_substring(PCRE_SPTR32 \fIstringptr\fP); -. -.SH DESCRIPTION -.rs -.sp -This is a convenience function for freeing the store obtained by a previous -call to \fBpcre[16|32]_get_substring()\fP or \fBpcre[16|32]_get_named_substring()\fP. -Its only argument is a pointer to the string. -.P -There is a complete description of the PCRE native API in the -.\" HREF -\fBpcreapi\fP -.\" -page and a description of the POSIX API in the -.\" HREF -\fBpcreposix\fP -.\" -page. diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre_free_substring_list.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre_free_substring_list.3 deleted file mode 100644 index 248b4bd0..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre_free_substring_list.3 +++ /dev/null @@ -1,31 +0,0 @@ -.TH PCRE_FREE_SUBSTRING_LIST 3 "24 June 2012" "PCRE 8.30" -.SH NAME -PCRE - Perl-compatible regular expressions -.SH SYNOPSIS -.rs -.sp -.B #include -.PP -.SM -.B void pcre_free_substring_list(const char **\fIstringptr\fP); -.PP -.B void pcre16_free_substring_list(PCRE_SPTR16 *\fIstringptr\fP); -.PP -.B void pcre32_free_substring_list(PCRE_SPTR32 *\fIstringptr\fP); -. -.SH DESCRIPTION -.rs -.sp -This is a convenience function for freeing the store obtained by a previous -call to \fBpcre[16|32]_get_substring_list()\fP. Its only argument is a pointer to -the list of string pointers. -.P -There is a complete description of the PCRE native API in the -.\" HREF -\fBpcreapi\fP -.\" -page and a description of the POSIX API in the -.\" HREF -\fBpcreposix\fP -.\" -page. diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre_fullinfo.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre_fullinfo.3 deleted file mode 100644 index c9b2c656..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre_fullinfo.3 +++ /dev/null @@ -1,103 +0,0 @@ -.TH PCRE_FULLINFO 3 "21 April 2014" "PCRE 8.36" -.SH NAME -PCRE - Perl-compatible regular expressions -.SH SYNOPSIS -.rs -.sp -.B #include -.PP -.nf -.B int pcre_fullinfo(const pcre *\fIcode\fP, "const pcre_extra *\fIextra\fP," -.B " int \fIwhat\fP, void *\fIwhere\fP);" -.sp -.B int pcre16_fullinfo(const pcre16 *\fIcode\fP, "const pcre16_extra *\fIextra\fP," -.B " int \fIwhat\fP, void *\fIwhere\fP);" -.sp -.B int pcre32_fullinfo(const pcre32 *\fIcode\fP, "const pcre32_extra *\fIextra\fP," -.B " int \fIwhat\fP, void *\fIwhere\fP);" -.fi -. -.SH DESCRIPTION -.rs -.sp -This function returns information about a compiled pattern. Its arguments are: -.sp - \fIcode\fP Compiled regular expression - \fIextra\fP Result of \fBpcre[16|32]_study()\fP or NULL - \fIwhat\fP What information is required - \fIwhere\fP Where to put the information -.sp -The following information is available: -.sp - PCRE_INFO_BACKREFMAX Number of highest back reference - PCRE_INFO_CAPTURECOUNT Number of capturing subpatterns - PCRE_INFO_DEFAULT_TABLES Pointer to default tables - PCRE_INFO_FIRSTBYTE Fixed first data unit for a match, or - -1 for start of string - or after newline, or - -2 otherwise - PCRE_INFO_FIRSTTABLE Table of first data units (after studying) - PCRE_INFO_HASCRORLF Return 1 if explicit CR or LF matches exist - PCRE_INFO_JCHANGED Return 1 if (?J) or (?-J) was used - PCRE_INFO_JIT Return 1 after successful JIT compilation - PCRE_INFO_JITSIZE Size of JIT compiled code - PCRE_INFO_LASTLITERAL Literal last data unit required - PCRE_INFO_MINLENGTH Lower bound length of matching strings - PCRE_INFO_MATCHEMPTY Return 1 if the pattern can match an empty string, - 0 otherwise - PCRE_INFO_MATCHLIMIT Match limit if set, otherwise PCRE_RROR_UNSET - PCRE_INFO_MAXLOOKBEHIND Length (in characters) of the longest lookbehind assertion - PCRE_INFO_NAMECOUNT Number of named subpatterns - PCRE_INFO_NAMEENTRYSIZE Size of name table entry - PCRE_INFO_NAMETABLE Pointer to name table - PCRE_INFO_OKPARTIAL Return 1 if partial matching can be tried - (always returns 1 after release 8.00) - PCRE_INFO_OPTIONS Option bits used for compilation - PCRE_INFO_SIZE Size of compiled pattern - PCRE_INFO_STUDYSIZE Size of study data - PCRE_INFO_FIRSTCHARACTER Fixed first data unit for a match - PCRE_INFO_FIRSTCHARACTERFLAGS Returns - 1 if there is a first data character set, which can - then be retrieved using PCRE_INFO_FIRSTCHARACTER, - 2 if the first character is at the start of the data - string or after a newline, and - 0 otherwise - PCRE_INFO_RECURSIONLIMIT Recursion limit if set, otherwise PCRE_ERROR_UNSET - PCRE_INFO_REQUIREDCHAR Literal last data unit required - PCRE_INFO_REQUIREDCHARFLAGS Returns 1 if the last data character is set (which can then - be retrieved using PCRE_INFO_REQUIREDCHAR); 0 otherwise -.sp -The \fIwhere\fP argument must point to an integer variable, except for the -following \fIwhat\fP values: -.sp - PCRE_INFO_DEFAULT_TABLES const uint8_t * - PCRE_INFO_FIRSTCHARACTER uint32_t - PCRE_INFO_FIRSTTABLE const uint8_t * - PCRE_INFO_JITSIZE size_t - PCRE_INFO_MATCHLIMIT uint32_t - PCRE_INFO_NAMETABLE PCRE_SPTR16 (16-bit library) - PCRE_INFO_NAMETABLE PCRE_SPTR32 (32-bit library) - PCRE_INFO_NAMETABLE const unsigned char * (8-bit library) - PCRE_INFO_OPTIONS unsigned long int - PCRE_INFO_SIZE size_t - PCRE_INFO_STUDYSIZE size_t - PCRE_INFO_RECURSIONLIMIT uint32_t - PCRE_INFO_REQUIREDCHAR uint32_t -.sp -The yield of the function is zero on success or: -.sp - PCRE_ERROR_NULL the argument \fIcode\fP was NULL - the argument \fIwhere\fP was NULL - PCRE_ERROR_BADMAGIC the "magic number" was not found - PCRE_ERROR_BADOPTION the value of \fIwhat\fP was invalid - PCRE_ERROR_UNSET the option was not set -.P -There is a complete description of the PCRE native API in the -.\" HREF -\fBpcreapi\fP -.\" -page and a description of the POSIX API in the -.\" HREF -\fBpcreposix\fP -.\" -page. diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre_get_named_substring.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre_get_named_substring.3 deleted file mode 100644 index 84d4ee7d..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre_get_named_substring.3 +++ /dev/null @@ -1,54 +0,0 @@ -.TH PCRE_GET_NAMED_SUBSTRING 3 "24 June 2012" "PCRE 8.30" -.SH NAME -PCRE - Perl-compatible regular expressions -.SH SYNOPSIS -.rs -.sp -.B #include -.PP -.nf -.B int pcre_get_named_substring(const pcre *\fIcode\fP, -.B " const char *\fIsubject\fP, int *\fIovector\fP," -.B " int \fIstringcount\fP, const char *\fIstringname\fP," -.B " const char **\fIstringptr\fP);" -.sp -.B int pcre16_get_named_substring(const pcre16 *\fIcode\fP, -.B " PCRE_SPTR16 \fIsubject\fP, int *\fIovector\fP," -.B " int \fIstringcount\fP, PCRE_SPTR16 \fIstringname\fP," -.B " PCRE_SPTR16 *\fIstringptr\fP);" -.sp -.B int pcre32_get_named_substring(const pcre32 *\fIcode\fP, -.B " PCRE_SPTR32 \fIsubject\fP, int *\fIovector\fP," -.B " int \fIstringcount\fP, PCRE_SPTR32 \fIstringname\fP," -.B " PCRE_SPTR32 *\fIstringptr\fP);" -.fi -. -.SH DESCRIPTION -.rs -.sp -This is a convenience function for extracting a captured substring by name. The -arguments are: -.sp - \fIcode\fP Compiled pattern - \fIsubject\fP Subject that has been successfully matched - \fIovector\fP Offset vector that \fBpcre[16|32]_exec()\fP used - \fIstringcount\fP Value returned by \fBpcre[16|32]_exec()\fP - \fIstringname\fP Name of the required substring - \fIstringptr\fP Where to put the string pointer -.sp -The memory in which the substring is placed is obtained by calling -\fBpcre[16|32]_malloc()\fP. The convenience function -\fBpcre[16|32]_free_substring()\fP can be used to free it when it is no longer -needed. The yield of the function is the length of the extracted substring, -PCRE_ERROR_NOMEMORY if sufficient memory could not be obtained, or -PCRE_ERROR_NOSUBSTRING if the string name is invalid. -.P -There is a complete description of the PCRE native API in the -.\" HREF -\fBpcreapi\fP -.\" -page and a description of the POSIX API in the -.\" HREF -\fBpcreposix\fP -.\" -page. diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre_get_stringnumber.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre_get_stringnumber.3 deleted file mode 100644 index 9fc5291d..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre_get_stringnumber.3 +++ /dev/null @@ -1,43 +0,0 @@ -.TH PCRE_GET_STRINGNUMBER 3 "24 June 2012" "PCRE 8.30" -.SH NAME -PCRE - Perl-compatible regular expressions -.SH SYNOPSIS -.rs -.sp -.B #include -.PP -.nf -.B int pcre_get_stringnumber(const pcre *\fIcode\fP, -.B " const char *\fIname\fP);" -.sp -.B int pcre16_get_stringnumber(const pcre16 *\fIcode\fP, -.B " PCRE_SPTR16 \fIname\fP);" -.sp -.B int pcre32_get_stringnumber(const pcre32 *\fIcode\fP, -.B " PCRE_SPTR32 \fIname\fP);" -.fi -. -.SH DESCRIPTION -.rs -.sp -This convenience function finds the number of a named substring capturing -parenthesis in a compiled pattern. Its arguments are: -.sp - \fIcode\fP Compiled regular expression - \fIname\fP Name whose number is required -.sp -The yield of the function is the number of the parenthesis if the name is -found, or PCRE_ERROR_NOSUBSTRING otherwise. When duplicate names are allowed -(PCRE_DUPNAMES is set), it is not defined which of the numbers is returned by -\fBpcre[16|32]_get_stringnumber()\fP. You can obtain the complete list by calling -\fBpcre[16|32]_get_stringtable_entries()\fP. -.P -There is a complete description of the PCRE native API in the -.\" HREF -\fBpcreapi\fP -.\" -page and a description of the POSIX API in the -.\" HREF -\fBpcreposix\fP -.\" -page. diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre_get_stringtable_entries.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre_get_stringtable_entries.3 deleted file mode 100644 index 5c58c90c..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre_get_stringtable_entries.3 +++ /dev/null @@ -1,46 +0,0 @@ -.TH PCRE_GET_STRINGTABLE_ENTRIES 3 "24 June 2012" "PCRE 8.30" -.SH NAME -PCRE - Perl-compatible regular expressions -.SH SYNOPSIS -.rs -.sp -.B #include -.PP -.nf -.B int pcre_get_stringtable_entries(const pcre *\fIcode\fP, -.B " const char *\fIname\fP, char **\fIfirst\fP, char **\fIlast\fP);" -.sp -.B int pcre16_get_stringtable_entries(const pcre16 *\fIcode\fP, -.B " PCRE_SPTR16 \fIname\fP, PCRE_UCHAR16 **\fIfirst\fP, PCRE_UCHAR16 **\fIlast\fP);" -.sp -.B int pcre32_get_stringtable_entries(const pcre32 *\fIcode\fP, -.B " PCRE_SPTR32 \fIname\fP, PCRE_UCHAR32 **\fIfirst\fP, PCRE_UCHAR32 **\fIlast\fP);" -.fi -. -.SH DESCRIPTION -.rs -.sp -This convenience function finds, for a compiled pattern, the first and last -entries for a given name in the table that translates capturing parenthesis -names into numbers. When names are required to be unique (PCRE_DUPNAMES is -\fInot\fP set), it is usually easier to use \fBpcre[16|32]_get_stringnumber()\fP -instead. -.sp - \fIcode\fP Compiled regular expression - \fIname\fP Name whose entries required - \fIfirst\fP Where to return a pointer to the first entry - \fIlast\fP Where to return a pointer to the last entry -.sp -The yield of the function is the length of each entry, or -PCRE_ERROR_NOSUBSTRING if none are found. -.P -There is a complete description of the PCRE native API, including the format of -the table entries, in the -.\" HREF -\fBpcreapi\fP -.\" -page, and a description of the POSIX API in the -.\" HREF -\fBpcreposix\fP -.\" -page. diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre_get_substring.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre_get_substring.3 deleted file mode 100644 index 1e62b2c0..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre_get_substring.3 +++ /dev/null @@ -1,50 +0,0 @@ -.TH PCRE_GET_SUBSTRING 3 "24 June 2012" "PCRE 8.30" -.SH NAME -PCRE - Perl-compatible regular expressions -.SH SYNOPSIS -.rs -.sp -.B #include -.PP -.nf -.B int pcre_get_substring(const char *\fIsubject\fP, int *\fIovector\fP, -.B " int \fIstringcount\fP, int \fIstringnumber\fP," -.B " const char **\fIstringptr\fP);" -.sp -.B int pcre16_get_substring(PCRE_SPTR16 \fIsubject\fP, int *\fIovector\fP, -.B " int \fIstringcount\fP, int \fIstringnumber\fP," -.B " PCRE_SPTR16 *\fIstringptr\fP);" -.sp -.B int pcre32_get_substring(PCRE_SPTR32 \fIsubject\fP, int *\fIovector\fP, -.B " int \fIstringcount\fP, int \fIstringnumber\fP," -.B " PCRE_SPTR32 *\fIstringptr\fP);" -.fi -. -.SH DESCRIPTION -.rs -.sp -This is a convenience function for extracting a captured substring. The -arguments are: -.sp - \fIsubject\fP Subject that has been successfully matched - \fIovector\fP Offset vector that \fBpcre[16|32]_exec()\fP used - \fIstringcount\fP Value returned by \fBpcre[16|32]_exec()\fP - \fIstringnumber\fP Number of the required substring - \fIstringptr\fP Where to put the string pointer -.sp -The memory in which the substring is placed is obtained by calling -\fBpcre[16|32]_malloc()\fP. The convenience function -\fBpcre[16|32]_free_substring()\fP can be used to free it when it is no longer -needed. The yield of the function is the length of the substring, -PCRE_ERROR_NOMEMORY if sufficient memory could not be obtained, or -PCRE_ERROR_NOSUBSTRING if the string number is invalid. -.P -There is a complete description of the PCRE native API in the -.\" HREF -\fBpcreapi\fP -.\" -page and a description of the POSIX API in the -.\" HREF -\fBpcreposix\fP -.\" -page. diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre_get_substring_list.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre_get_substring_list.3 deleted file mode 100644 index 511a4a39..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre_get_substring_list.3 +++ /dev/null @@ -1,47 +0,0 @@ -.TH PCRE_GET_SUBSTRING_LIST 3 "24 June 2012" "PCRE 8.30" -.SH NAME -PCRE - Perl-compatible regular expressions -.SH SYNOPSIS -.rs -.sp -.B #include -.PP -.nf -.B int pcre_get_substring_list(const char *\fIsubject\fP, -.B " int *\fIovector\fP, int \fIstringcount\fP, const char ***\fIlistptr\fP);" -.sp -.B int pcre16_get_substring_list(PCRE_SPTR16 \fIsubject\fP, -.B " int *\fIovector\fP, int \fIstringcount\fP, PCRE_SPTR16 **\fIlistptr\fP);" -.sp -.B int pcre32_get_substring_list(PCRE_SPTR32 \fIsubject\fP, -.B " int *\fIovector\fP, int \fIstringcount\fP, PCRE_SPTR32 **\fIlistptr\fP);" -.fi -. -.SH DESCRIPTION -.rs -.sp -This is a convenience function for extracting a list of all the captured -substrings. The arguments are: -.sp - \fIsubject\fP Subject that has been successfully matched - \fIovector\fP Offset vector that \fBpcre[16|32]_exec\fP used - \fIstringcount\fP Value returned by \fBpcre[16|32]_exec\fP - \fIlistptr\fP Where to put a pointer to the list -.sp -The memory in which the substrings and the list are placed is obtained by -calling \fBpcre[16|32]_malloc()\fP. The convenience function -\fBpcre[16|32]_free_substring_list()\fP can be used to free it when it is no -longer needed. A pointer to a list of pointers is put in the variable whose -address is in \fIlistptr\fP. The list is terminated by a NULL pointer. The -yield of the function is zero on success or PCRE_ERROR_NOMEMORY if sufficient -memory could not be obtained. -.P -There is a complete description of the PCRE native API in the -.\" HREF -\fBpcreapi\fP -.\" -page and a description of the POSIX API in the -.\" HREF -\fBpcreposix\fP -.\" -page. diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre_jit_exec.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre_jit_exec.3 deleted file mode 100644 index ba851681..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre_jit_exec.3 +++ /dev/null @@ -1,96 +0,0 @@ -.TH PCRE_EXEC 3 "31 October 2012" "PCRE 8.30" -.SH NAME -PCRE - Perl-compatible regular expressions -.SH SYNOPSIS -.rs -.sp -.B #include -.PP -.nf -.B int pcre_jit_exec(const pcre *\fIcode\fP, "const pcre_extra *\fIextra\fP," -.B " const char *\fIsubject\fP, int \fIlength\fP, int \fIstartoffset\fP," -.B " int \fIoptions\fP, int *\fIovector\fP, int \fIovecsize\fP," -.B " pcre_jit_stack *\fIjstack\fP);" -.sp -.B int pcre16_jit_exec(const pcre16 *\fIcode\fP, "const pcre16_extra *\fIextra\fP," -.B " PCRE_SPTR16 \fIsubject\fP, int \fIlength\fP, int \fIstartoffset\fP," -.B " int \fIoptions\fP, int *\fIovector\fP, int \fIovecsize\fP," -.B " pcre_jit_stack *\fIjstack\fP);" -.sp -.B int pcre32_jit_exec(const pcre32 *\fIcode\fP, "const pcre32_extra *\fIextra\fP," -.B " PCRE_SPTR32 \fIsubject\fP, int \fIlength\fP, int \fIstartoffset\fP," -.B " int \fIoptions\fP, int *\fIovector\fP, int \fIovecsize\fP," -.B " pcre_jit_stack *\fIjstack\fP);" -.fi -. -.SH DESCRIPTION -.rs -.sp -This function matches a compiled regular expression that has been successfully -studied with one of the JIT options against a given subject string, using a -matching algorithm that is similar to Perl's. It is a "fast path" interface to -JIT, and it bypasses some of the sanity checks that \fBpcre_exec()\fP applies. -It returns offsets to captured substrings. Its arguments are: -.sp - \fIcode\fP Points to the compiled pattern - \fIextra\fP Points to an associated \fBpcre[16|32]_extra\fP structure, - or is NULL - \fIsubject\fP Points to the subject string - \fIlength\fP Length of the subject string, in bytes - \fIstartoffset\fP Offset in bytes in the subject at which to - start matching - \fIoptions\fP Option bits - \fIovector\fP Points to a vector of ints for result offsets - \fIovecsize\fP Number of elements in the vector (a multiple of 3) - \fIjstack\fP Pointer to a JIT stack -.sp -The allowed options are: -.sp - PCRE_NOTBOL Subject string is not the beginning of a line - PCRE_NOTEOL Subject string is not the end of a line - PCRE_NOTEMPTY An empty string is not a valid match - PCRE_NOTEMPTY_ATSTART An empty string at the start of the subject - is not a valid match - PCRE_NO_UTF16_CHECK Do not check the subject for UTF-16 - validity (only relevant if PCRE_UTF16 - was set at compile time) - PCRE_NO_UTF32_CHECK Do not check the subject for UTF-32 - validity (only relevant if PCRE_UTF32 - was set at compile time) - PCRE_NO_UTF8_CHECK Do not check the subject for UTF-8 - validity (only relevant if PCRE_UTF8 - was set at compile time) - PCRE_PARTIAL ) Return PCRE_ERROR_PARTIAL for a partial - PCRE_PARTIAL_SOFT ) match if no full matches are found - PCRE_PARTIAL_HARD Return PCRE_ERROR_PARTIAL for a partial match - if that is found before a full match -.sp -However, the PCRE_NO_UTF[8|16|32]_CHECK options have no effect, as this check -is never applied. For details of partial matching, see the -.\" HREF -\fBpcrepartial\fP -.\" -page. A \fBpcre_extra\fP structure contains the following fields: -.sp - \fIflags\fP Bits indicating which fields are set - \fIstudy_data\fP Opaque data from \fBpcre[16|32]_study()\fP - \fImatch_limit\fP Limit on internal resource use - \fImatch_limit_recursion\fP Limit on internal recursion depth - \fIcallout_data\fP Opaque data passed back to callouts - \fItables\fP Points to character tables or is NULL - \fImark\fP For passing back a *MARK pointer - \fIexecutable_jit\fP Opaque data from JIT compilation -.sp -The flag bits are PCRE_EXTRA_STUDY_DATA, PCRE_EXTRA_MATCH_LIMIT, -PCRE_EXTRA_MATCH_LIMIT_RECURSION, PCRE_EXTRA_CALLOUT_DATA, -PCRE_EXTRA_TABLES, PCRE_EXTRA_MARK and PCRE_EXTRA_EXECUTABLE_JIT. -.P -There is a complete description of the PCRE native API in the -.\" HREF -\fBpcreapi\fP -.\" -page and a description of the JIT API in the -.\" HREF -\fBpcrejit\fP -.\" -page. diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre_jit_stack_alloc.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre_jit_stack_alloc.3 deleted file mode 100644 index 11c97a0f..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre_jit_stack_alloc.3 +++ /dev/null @@ -1,43 +0,0 @@ -.TH PCRE_JIT_STACK_ALLOC 3 "24 June 2012" "PCRE 8.30" -.SH NAME -PCRE - Perl-compatible regular expressions -.SH SYNOPSIS -.rs -.sp -.B #include -.PP -.nf -.B pcre_jit_stack *pcre_jit_stack_alloc(int \fIstartsize\fP, -.B " int \fImaxsize\fP);" -.sp -.B pcre16_jit_stack *pcre16_jit_stack_alloc(int \fIstartsize\fP, -.B " int \fImaxsize\fP);" -.sp -.B pcre32_jit_stack *pcre32_jit_stack_alloc(int \fIstartsize\fP, -.B " int \fImaxsize\fP);" -.fi -. -.SH DESCRIPTION -.rs -.sp -This function is used to create a stack for use by the code compiled by the JIT -optimization of \fBpcre[16|32]_study()\fP. The arguments are a starting size for -the stack, and a maximum size to which it is allowed to grow. The result can be -passed to the JIT run-time code by \fBpcre[16|32]_assign_jit_stack()\fP, or that -function can set up a callback for obtaining a stack. A maximum stack size of -512K to 1M should be more than enough for any pattern. For more details, see -the -.\" HREF -\fBpcrejit\fP -.\" -page. -.P -There is a complete description of the PCRE native API in the -.\" HREF -\fBpcreapi\fP -.\" -page and a description of the POSIX API in the -.\" HREF -\fBpcreposix\fP -.\" -page. diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre_jit_stack_free.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre_jit_stack_free.3 deleted file mode 100644 index 494724e8..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre_jit_stack_free.3 +++ /dev/null @@ -1,35 +0,0 @@ -.TH PCRE_JIT_STACK_FREE 3 "24 June 2012" "PCRE 8.30" -.SH NAME -PCRE - Perl-compatible regular expressions -.SH SYNOPSIS -.rs -.sp -.B #include -.PP -.SM -.B void pcre_jit_stack_free(pcre_jit_stack *\fIstack\fP); -.PP -.B void pcre16_jit_stack_free(pcre16_jit_stack *\fIstack\fP); -.PP -.B void pcre32_jit_stack_free(pcre32_jit_stack *\fIstack\fP); -. -.SH DESCRIPTION -.rs -.sp -This function is used to free a JIT stack that was created by -\fBpcre[16|32]_jit_stack_alloc()\fP when it is no longer needed. For more details, -see the -.\" HREF -\fBpcrejit\fP -.\" -page. -.P -There is a complete description of the PCRE native API in the -.\" HREF -\fBpcreapi\fP -.\" -page and a description of the POSIX API in the -.\" HREF -\fBpcreposix\fP -.\" -page. diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre_maketables.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre_maketables.3 deleted file mode 100644 index b2c3d23a..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre_maketables.3 +++ /dev/null @@ -1,33 +0,0 @@ -.TH PCRE_MAKETABLES 3 "24 June 2012" "PCRE 8.30" -.SH NAME -PCRE - Perl-compatible regular expressions -.SH SYNOPSIS -.rs -.sp -.B #include -.PP -.SM -.B const unsigned char *pcre_maketables(void); -.PP -.B const unsigned char *pcre16_maketables(void); -.PP -.B const unsigned char *pcre32_maketables(void); -. -.SH DESCRIPTION -.rs -.sp -This function builds a set of character tables for character values less than -256. These can be passed to \fBpcre[16|32]_compile()\fP to override PCRE's -internal, built-in tables (which were made by \fBpcre[16|32]_maketables()\fP when -PCRE was compiled). You might want to do this if you are using a non-standard -locale. The function yields a pointer to the tables. -.P -There is a complete description of the PCRE native API in the -.\" HREF -\fBpcreapi\fP -.\" -page and a description of the POSIX API in the -.\" HREF -\fBpcreposix\fP -.\" -page. diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre_pattern_to_host_byte_order.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre_pattern_to_host_byte_order.3 deleted file mode 100644 index b0c41c38..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre_pattern_to_host_byte_order.3 +++ /dev/null @@ -1,44 +0,0 @@ -.TH PCRE_PATTERN_TO_HOST_BYTE_ORDER 3 "24 June 2012" "PCRE 8.30" -.SH NAME -PCRE - Perl-compatible regular expressions -.SH SYNOPSIS -.rs -.sp -.B #include -.PP -.nf -.B int pcre_pattern_to_host_byte_order(pcre *\fIcode\fP, -.B " pcre_extra *\fIextra\fP, const unsigned char *\fItables\fP);" -.sp -.B int pcre16_pattern_to_host_byte_order(pcre16 *\fIcode\fP, -.B " pcre16_extra *\fIextra\fP, const unsigned char *\fItables\fP);" -.sp -.B int pcre32_pattern_to_host_byte_order(pcre32 *\fIcode\fP, -.B " pcre32_extra *\fIextra\fP, const unsigned char *\fItables\fP);" -.fi -. -.SH DESCRIPTION -.rs -.sp -This function ensures that the bytes in 2-byte and 4-byte values in a compiled -pattern are in the correct order for the current host. It is useful when a -pattern that has been compiled on one host is transferred to another that might -have different endianness. The arguments are: -.sp - \fIcode\fP A compiled regular expression - \fIextra\fP Points to an associated \fBpcre[16|32]_extra\fP structure, - or is NULL - \fItables\fP Pointer to character tables, or NULL to - set the built-in default -.sp -The result is 0 for success, a negative PCRE_ERROR_xxx value otherwise. -.P -There is a complete description of the PCRE native API in the -.\" HREF -\fBpcreapi\fP -.\" -page and a description of the POSIX API in the -.\" HREF -\fBpcreposix\fP -.\" -page. diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre_refcount.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre_refcount.3 deleted file mode 100644 index 45a41fef..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre_refcount.3 +++ /dev/null @@ -1,36 +0,0 @@ -.TH PCRE_REFCOUNT 3 "24 June 2012" "PCRE 8.30" -.SH NAME -PCRE - Perl-compatible regular expressions -.SH SYNOPSIS -.rs -.sp -.B #include -.PP -.SM -.B int pcre_refcount(pcre *\fIcode\fP, int \fIadjust\fP); -.PP -.B int pcre16_refcount(pcre16 *\fIcode\fP, int \fIadjust\fP); -.PP -.B int pcre32_refcount(pcre32 *\fIcode\fP, int \fIadjust\fP); -. -.SH DESCRIPTION -.rs -.sp -This function is used to maintain a reference count inside a data block that -contains a compiled pattern. Its arguments are: -.sp - \fIcode\fP Compiled regular expression - \fIadjust\fP Adjustment to reference value -.sp -The yield of the function is the adjusted reference value, which is constrained -to lie between 0 and 65535. -.P -There is a complete description of the PCRE native API in the -.\" HREF -\fBpcreapi\fP -.\" -page and a description of the POSIX API in the -.\" HREF -\fBpcreposix\fP -.\" -page. diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre_study.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre_study.3 deleted file mode 100644 index 1200e0a6..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre_study.3 +++ /dev/null @@ -1,54 +0,0 @@ -.TH PCRE_STUDY 3 " 24 June 2012" "PCRE 8.30" -.SH NAME -PCRE - Perl-compatible regular expressions -.SH SYNOPSIS -.rs -.sp -.B #include -.PP -.nf -.B pcre_extra *pcre_study(const pcre *\fIcode\fP, int \fIoptions\fP, -.B " const char **\fIerrptr\fP);" -.sp -.B pcre16_extra *pcre16_study(const pcre16 *\fIcode\fP, int \fIoptions\fP, -.B " const char **\fIerrptr\fP);" -.sp -.B pcre32_extra *pcre32_study(const pcre32 *\fIcode\fP, int \fIoptions\fP, -.B " const char **\fIerrptr\fP);" -.fi -. -.SH DESCRIPTION -.rs -.sp -This function studies a compiled pattern, to see if additional information can -be extracted that might speed up matching. Its arguments are: -.sp - \fIcode\fP A compiled regular expression - \fIoptions\fP Options for \fBpcre[16|32]_study()\fP - \fIerrptr\fP Where to put an error message -.sp -If the function succeeds, it returns a value that can be passed to -\fBpcre[16|32]_exec()\fP or \fBpcre[16|32]_dfa_exec()\fP via their \fIextra\fP -arguments. -.P -If the function returns NULL, either it could not find any additional -information, or there was an error. You can tell the difference by looking at -the error value. It is NULL in first case. -.P -The only option is PCRE_STUDY_JIT_COMPILE. It requests just-in-time compilation -if possible. If PCRE has been compiled without JIT support, this option is -ignored. See the -.\" HREF -\fBpcrejit\fP -.\" -page for further details. -.P -There is a complete description of the PCRE native API in the -.\" HREF -\fBpcreapi\fP -.\" -page and a description of the POSIX API in the -.\" HREF -\fBpcreposix\fP -.\" -page. diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre_utf16_to_host_byte_order.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre_utf16_to_host_byte_order.3 deleted file mode 100644 index 1851b619..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre_utf16_to_host_byte_order.3 +++ /dev/null @@ -1,45 +0,0 @@ -.TH PCRE_UTF16_TO_HOST_BYTE_ORDER 3 "21 January 2012" "PCRE 8.30" -.SH NAME -PCRE - Perl-compatible regular expressions -.SH SYNOPSIS -.rs -.sp -.B #include -.PP -.nf -.B int pcre16_utf16_to_host_byte_order(PCRE_UCHAR16 *\fIoutput\fP, -.B " PCRE_SPTR16 \fIinput\fP, int \fIlength\fP, int *\fIhost_byte_order\fP," -.B " int \fIkeep_boms\fP);" -.fi -. -. -.SH DESCRIPTION -.rs -.sp -This function, which exists only in the 16-bit library, converts a UTF-16 -string to the correct order for the current host, taking account of any byte -order marks (BOMs) within the string. Its arguments are: -.sp - \fIoutput\fP pointer to output buffer, may be the same as \fIinput\fP - \fIinput\fP pointer to input buffer - \fIlength\fP number of 16-bit units in the input, or negative for - a zero-terminated string - \fIhost_byte_order\fP a NULL value or a non-zero value pointed to means - start in host byte order - \fIkeep_boms\fP if non-zero, BOMs are copied to the output string -.sp -The result of the function is the number of 16-bit units placed into the output -buffer, including the zero terminator if the string was zero-terminated. -.P -If \fIhost_byte_order\fP is not NULL, it is set to indicate the byte order that -is current at the end of the string. -.P -There is a complete description of the PCRE native API in the -.\" HREF -\fBpcreapi\fP -.\" -page and a description of the POSIX API in the -.\" HREF -\fBpcreposix\fP -.\" -page. diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre_utf32_to_host_byte_order.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre_utf32_to_host_byte_order.3 deleted file mode 100644 index a415dcf5..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre_utf32_to_host_byte_order.3 +++ /dev/null @@ -1,45 +0,0 @@ -.TH PCRE_UTF32_TO_HOST_BYTE_ORDER 3 "24 June 2012" "PCRE 8.30" -.SH NAME -PCRE - Perl-compatible regular expressions -.SH SYNOPSIS -.rs -.sp -.B #include -.PP -.nf -.B int pcre32_utf32_to_host_byte_order(PCRE_UCHAR32 *\fIoutput\fP, -.B " PCRE_SPTR32 \fIinput\fP, int \fIlength\fP, int *\fIhost_byte_order\fP," -.B " int \fIkeep_boms\fP);" -.fi -. -. -.SH DESCRIPTION -.rs -.sp -This function, which exists only in the 32-bit library, converts a UTF-32 -string to the correct order for the current host, taking account of any byte -order marks (BOMs) within the string. Its arguments are: -.sp - \fIoutput\fP pointer to output buffer, may be the same as \fIinput\fP - \fIinput\fP pointer to input buffer - \fIlength\fP number of 32-bit units in the input, or negative for - a zero-terminated string - \fIhost_byte_order\fP a NULL value or a non-zero value pointed to means - start in host byte order - \fIkeep_boms\fP if non-zero, BOMs are copied to the output string -.sp -The result of the function is the number of 32-bit units placed into the output -buffer, including the zero terminator if the string was zero-terminated. -.P -If \fIhost_byte_order\fP is not NULL, it is set to indicate the byte order that -is current at the end of the string. -.P -There is a complete description of the PCRE native API in the -.\" HREF -\fBpcreapi\fP -.\" -page and a description of the POSIX API in the -.\" HREF -\fBpcreposix\fP -.\" -page. diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre_version.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre_version.3 deleted file mode 100644 index 0f4973f9..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcre_version.3 +++ /dev/null @@ -1,31 +0,0 @@ -.TH PCRE_VERSION 3 "24 June 2012" "PCRE 8.30" -.SH NAME -PCRE - Perl-compatible regular expressions -.SH SYNOPSIS -.rs -.sp -.B #include -.PP -.SM -.B const char *pcre_version(void); -.PP -.B const char *pcre16_version(void); -.PP -.B const char *pcre32_version(void); -. -.SH DESCRIPTION -.rs -.sp -This function (even in the 16-bit and 32-bit libraries) returns a -zero-terminated, 8-bit character string that gives the version number of the -PCRE library and the date of its release. -.P -There is a complete description of the PCRE native API in the -.\" HREF -\fBpcreapi\fP -.\" -page and a description of the POSIX API in the -.\" HREF -\fBpcreposix\fP -.\" -page. diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcreapi.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcreapi.3 deleted file mode 100644 index 6e7c7c6e..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcreapi.3 +++ /dev/null @@ -1,2918 +0,0 @@ -.TH PCREAPI 3 "18 December 2015" "PCRE 8.39" -.SH NAME -PCRE - Perl-compatible regular expressions -.sp -.B #include -. -. -.SH "PCRE NATIVE API BASIC FUNCTIONS" -.rs -.sp -.nf -.B pcre *pcre_compile(const char *\fIpattern\fP, int \fIoptions\fP, -.B " const char **\fIerrptr\fP, int *\fIerroffset\fP," -.B " const unsigned char *\fItableptr\fP);" -.sp -.B pcre *pcre_compile2(const char *\fIpattern\fP, int \fIoptions\fP, -.B " int *\fIerrorcodeptr\fP," -.B " const char **\fIerrptr\fP, int *\fIerroffset\fP," -.B " const unsigned char *\fItableptr\fP);" -.sp -.B pcre_extra *pcre_study(const pcre *\fIcode\fP, int \fIoptions\fP, -.B " const char **\fIerrptr\fP);" -.sp -.B void pcre_free_study(pcre_extra *\fIextra\fP); -.sp -.B int pcre_exec(const pcre *\fIcode\fP, "const pcre_extra *\fIextra\fP," -.B " const char *\fIsubject\fP, int \fIlength\fP, int \fIstartoffset\fP," -.B " int \fIoptions\fP, int *\fIovector\fP, int \fIovecsize\fP);" -.sp -.B int pcre_dfa_exec(const pcre *\fIcode\fP, "const pcre_extra *\fIextra\fP," -.B " const char *\fIsubject\fP, int \fIlength\fP, int \fIstartoffset\fP," -.B " int \fIoptions\fP, int *\fIovector\fP, int \fIovecsize\fP," -.B " int *\fIworkspace\fP, int \fIwscount\fP);" -.fi -. -. -.SH "PCRE NATIVE API STRING EXTRACTION FUNCTIONS" -.rs -.sp -.nf -.B int pcre_copy_named_substring(const pcre *\fIcode\fP, -.B " const char *\fIsubject\fP, int *\fIovector\fP," -.B " int \fIstringcount\fP, const char *\fIstringname\fP," -.B " char *\fIbuffer\fP, int \fIbuffersize\fP);" -.sp -.B int pcre_copy_substring(const char *\fIsubject\fP, int *\fIovector\fP, -.B " int \fIstringcount\fP, int \fIstringnumber\fP, char *\fIbuffer\fP," -.B " int \fIbuffersize\fP);" -.sp -.B int pcre_get_named_substring(const pcre *\fIcode\fP, -.B " const char *\fIsubject\fP, int *\fIovector\fP," -.B " int \fIstringcount\fP, const char *\fIstringname\fP," -.B " const char **\fIstringptr\fP);" -.sp -.B int pcre_get_stringnumber(const pcre *\fIcode\fP, -.B " const char *\fIname\fP);" -.sp -.B int pcre_get_stringtable_entries(const pcre *\fIcode\fP, -.B " const char *\fIname\fP, char **\fIfirst\fP, char **\fIlast\fP);" -.sp -.B int pcre_get_substring(const char *\fIsubject\fP, int *\fIovector\fP, -.B " int \fIstringcount\fP, int \fIstringnumber\fP," -.B " const char **\fIstringptr\fP);" -.sp -.B int pcre_get_substring_list(const char *\fIsubject\fP, -.B " int *\fIovector\fP, int \fIstringcount\fP, const char ***\fIlistptr\fP);" -.sp -.B void pcre_free_substring(const char *\fIstringptr\fP); -.sp -.B void pcre_free_substring_list(const char **\fIstringptr\fP); -.fi -. -. -.SH "PCRE NATIVE API AUXILIARY FUNCTIONS" -.rs -.sp -.nf -.B int pcre_jit_exec(const pcre *\fIcode\fP, "const pcre_extra *\fIextra\fP," -.B " const char *\fIsubject\fP, int \fIlength\fP, int \fIstartoffset\fP," -.B " int \fIoptions\fP, int *\fIovector\fP, int \fIovecsize\fP," -.B " pcre_jit_stack *\fIjstack\fP);" -.sp -.B pcre_jit_stack *pcre_jit_stack_alloc(int \fIstartsize\fP, int \fImaxsize\fP); -.sp -.B void pcre_jit_stack_free(pcre_jit_stack *\fIstack\fP); -.sp -.B void pcre_assign_jit_stack(pcre_extra *\fIextra\fP, -.B " pcre_jit_callback \fIcallback\fP, void *\fIdata\fP);" -.sp -.B const unsigned char *pcre_maketables(void); -.sp -.B int pcre_fullinfo(const pcre *\fIcode\fP, "const pcre_extra *\fIextra\fP," -.B " int \fIwhat\fP, void *\fIwhere\fP);" -.sp -.B int pcre_refcount(pcre *\fIcode\fP, int \fIadjust\fP); -.sp -.B int pcre_config(int \fIwhat\fP, void *\fIwhere\fP); -.sp -.B const char *pcre_version(void); -.sp -.B int pcre_pattern_to_host_byte_order(pcre *\fIcode\fP, -.B " pcre_extra *\fIextra\fP, const unsigned char *\fItables\fP);" -.fi -. -. -.SH "PCRE NATIVE API INDIRECTED FUNCTIONS" -.rs -.sp -.nf -.B void *(*pcre_malloc)(size_t); -.sp -.B void (*pcre_free)(void *); -.sp -.B void *(*pcre_stack_malloc)(size_t); -.sp -.B void (*pcre_stack_free)(void *); -.sp -.B int (*pcre_callout)(pcre_callout_block *); -.sp -.B int (*pcre_stack_guard)(void); -.fi -. -. -.SH "PCRE 8-BIT, 16-BIT, AND 32-BIT LIBRARIES" -.rs -.sp -As well as support for 8-bit character strings, PCRE also supports 16-bit -strings (from release 8.30) and 32-bit strings (from release 8.32), by means of -two additional libraries. They can be built as well as, or instead of, the -8-bit library. To avoid too much complication, this document describes the -8-bit versions of the functions, with only occasional references to the 16-bit -and 32-bit libraries. -.P -The 16-bit and 32-bit functions operate in the same way as their 8-bit -counterparts; they just use different data types for their arguments and -results, and their names start with \fBpcre16_\fP or \fBpcre32_\fP instead of -\fBpcre_\fP. For every option that has UTF8 in its name (for example, -PCRE_UTF8), there are corresponding 16-bit and 32-bit names with UTF8 replaced -by UTF16 or UTF32, respectively. This facility is in fact just cosmetic; the -16-bit and 32-bit option names define the same bit values. -.P -References to bytes and UTF-8 in this document should be read as references to -16-bit data units and UTF-16 when using the 16-bit library, or 32-bit data -units and UTF-32 when using the 32-bit library, unless specified otherwise. -More details of the specific differences for the 16-bit and 32-bit libraries -are given in the -.\" HREF -\fBpcre16\fP -.\" -and -.\" HREF -\fBpcre32\fP -.\" -pages. -. -. -.SH "PCRE API OVERVIEW" -.rs -.sp -PCRE has its own native API, which is described in this document. There are -also some wrapper functions (for the 8-bit library only) that correspond to the -POSIX regular expression API, but they do not give access to all the -functionality. They are described in the -.\" HREF -\fBpcreposix\fP -.\" -documentation. Both of these APIs define a set of C function calls. A C++ -wrapper (again for the 8-bit library only) is also distributed with PCRE. It is -documented in the -.\" HREF -\fBpcrecpp\fP -.\" -page. -.P -The native API C function prototypes are defined in the header file -\fBpcre.h\fP, and on Unix-like systems the (8-bit) library itself is called -\fBlibpcre\fP. It can normally be accessed by adding \fB-lpcre\fP to the -command for linking an application that uses PCRE. The header file defines the -macros PCRE_MAJOR and PCRE_MINOR to contain the major and minor release numbers -for the library. Applications can use these to include support for different -releases of PCRE. -.P -In a Windows environment, if you want to statically link an application program -against a non-dll \fBpcre.a\fP file, you must define PCRE_STATIC before -including \fBpcre.h\fP or \fBpcrecpp.h\fP, because otherwise the -\fBpcre_malloc()\fP and \fBpcre_free()\fP exported functions will be declared -\fB__declspec(dllimport)\fP, with unwanted results. -.P -The functions \fBpcre_compile()\fP, \fBpcre_compile2()\fP, \fBpcre_study()\fP, -and \fBpcre_exec()\fP are used for compiling and matching regular expressions -in a Perl-compatible manner. A sample program that demonstrates the simplest -way of using them is provided in the file called \fIpcredemo.c\fP in the PCRE -source distribution. A listing of this program is given in the -.\" HREF -\fBpcredemo\fP -.\" -documentation, and the -.\" HREF -\fBpcresample\fP -.\" -documentation describes how to compile and run it. -.P -Just-in-time compiler support is an optional feature of PCRE that can be built -in appropriate hardware environments. It greatly speeds up the matching -performance of many patterns. Simple programs can easily request that it be -used if available, by setting an option that is ignored when it is not -relevant. More complicated programs might need to make use of the functions -\fBpcre_jit_stack_alloc()\fP, \fBpcre_jit_stack_free()\fP, and -\fBpcre_assign_jit_stack()\fP in order to control the JIT code's memory usage. -.P -From release 8.32 there is also a direct interface for JIT execution, which -gives improved performance. The JIT-specific functions are discussed in the -.\" HREF -\fBpcrejit\fP -.\" -documentation. -.P -A second matching function, \fBpcre_dfa_exec()\fP, which is not -Perl-compatible, is also provided. This uses a different algorithm for the -matching. The alternative algorithm finds all possible matches (at a given -point in the subject), and scans the subject just once (unless there are -lookbehind assertions). However, this algorithm does not return captured -substrings. A description of the two matching algorithms and their advantages -and disadvantages is given in the -.\" HREF -\fBpcrematching\fP -.\" -documentation. -.P -In addition to the main compiling and matching functions, there are convenience -functions for extracting captured substrings from a subject string that is -matched by \fBpcre_exec()\fP. They are: -.sp - \fBpcre_copy_substring()\fP - \fBpcre_copy_named_substring()\fP - \fBpcre_get_substring()\fP - \fBpcre_get_named_substring()\fP - \fBpcre_get_substring_list()\fP - \fBpcre_get_stringnumber()\fP - \fBpcre_get_stringtable_entries()\fP -.sp -\fBpcre_free_substring()\fP and \fBpcre_free_substring_list()\fP are also -provided, to free the memory used for extracted strings. -.P -The function \fBpcre_maketables()\fP is used to build a set of character tables -in the current locale for passing to \fBpcre_compile()\fP, \fBpcre_exec()\fP, -or \fBpcre_dfa_exec()\fP. This is an optional facility that is provided for -specialist use. Most commonly, no special tables are passed, in which case -internal tables that are generated when PCRE is built are used. -.P -The function \fBpcre_fullinfo()\fP is used to find out information about a -compiled pattern. The function \fBpcre_version()\fP returns a pointer to a -string containing the version of PCRE and its date of release. -.P -The function \fBpcre_refcount()\fP maintains a reference count in a data block -containing a compiled pattern. This is provided for the benefit of -object-oriented applications. -.P -The global variables \fBpcre_malloc\fP and \fBpcre_free\fP initially contain -the entry points of the standard \fBmalloc()\fP and \fBfree()\fP functions, -respectively. PCRE calls the memory management functions via these variables, -so a calling program can replace them if it wishes to intercept the calls. This -should be done before calling any PCRE functions. -.P -The global variables \fBpcre_stack_malloc\fP and \fBpcre_stack_free\fP are also -indirections to memory management functions. These special functions are used -only when PCRE is compiled to use the heap for remembering data, instead of -recursive function calls, when running the \fBpcre_exec()\fP function. See the -.\" HREF -\fBpcrebuild\fP -.\" -documentation for details of how to do this. It is a non-standard way of -building PCRE, for use in environments that have limited stacks. Because of the -greater use of memory management, it runs more slowly. Separate functions are -provided so that special-purpose external code can be used for this case. When -used, these functions always allocate memory blocks of the same size. There is -a discussion about PCRE's stack usage in the -.\" HREF -\fBpcrestack\fP -.\" -documentation. -.P -The global variable \fBpcre_callout\fP initially contains NULL. It can be set -by the caller to a "callout" function, which PCRE will then call at specified -points during a matching operation. Details are given in the -.\" HREF -\fBpcrecallout\fP -.\" -documentation. -.P -The global variable \fBpcre_stack_guard\fP initially contains NULL. It can be -set by the caller to a function that is called by PCRE whenever it starts -to compile a parenthesized part of a pattern. When parentheses are nested, PCRE -uses recursive function calls, which use up the system stack. This function is -provided so that applications with restricted stacks can force a compilation -error if the stack runs out. The function should return zero if all is well, or -non-zero to force an error. -. -. -.\" HTML -.SH NEWLINES -.rs -.sp -PCRE supports five different conventions for indicating line breaks in -strings: a single CR (carriage return) character, a single LF (linefeed) -character, the two-character sequence CRLF, any of the three preceding, or any -Unicode newline sequence. The Unicode newline sequences are the three just -mentioned, plus the single characters VT (vertical tab, U+000B), FF (form feed, -U+000C), NEL (next line, U+0085), LS (line separator, U+2028), and PS -(paragraph separator, U+2029). -.P -Each of the first three conventions is used by at least one operating system as -its standard newline sequence. When PCRE is built, a default can be specified. -The default default is LF, which is the Unix standard. When PCRE is run, the -default can be overridden, either when a pattern is compiled, or when it is -matched. -.P -At compile time, the newline convention can be specified by the \fIoptions\fP -argument of \fBpcre_compile()\fP, or it can be specified by special text at the -start of the pattern itself; this overrides any other settings. See the -.\" HREF -\fBpcrepattern\fP -.\" -page for details of the special character sequences. -.P -In the PCRE documentation the word "newline" is used to mean "the character or -pair of characters that indicate a line break". The choice of newline -convention affects the handling of the dot, circumflex, and dollar -metacharacters, the handling of #-comments in /x mode, and, when CRLF is a -recognized line ending sequence, the match position advancement for a -non-anchored pattern. There is more detail about this in the -.\" HTML -.\" -section on \fBpcre_exec()\fP options -.\" -below. -.P -The choice of newline convention does not affect the interpretation of -the \en or \er escape sequences, nor does it affect what \eR matches, which is -controlled in a similar way, but by separate options. -. -. -.SH MULTITHREADING -.rs -.sp -The PCRE functions can be used in multi-threading applications, with the -proviso that the memory management functions pointed to by \fBpcre_malloc\fP, -\fBpcre_free\fP, \fBpcre_stack_malloc\fP, and \fBpcre_stack_free\fP, and the -callout and stack-checking functions pointed to by \fBpcre_callout\fP and -\fBpcre_stack_guard\fP, are shared by all threads. -.P -The compiled form of a regular expression is not altered during matching, so -the same compiled pattern can safely be used by several threads at once. -.P -If the just-in-time optimization feature is being used, it needs separate -memory stack areas for each thread. See the -.\" HREF -\fBpcrejit\fP -.\" -documentation for more details. -. -. -.SH "SAVING PRECOMPILED PATTERNS FOR LATER USE" -.rs -.sp -The compiled form of a regular expression can be saved and re-used at a later -time, possibly by a different program, and even on a host other than the one on -which it was compiled. Details are given in the -.\" HREF -\fBpcreprecompile\fP -.\" -documentation, which includes a description of the -\fBpcre_pattern_to_host_byte_order()\fP function. However, compiling a regular -expression with one version of PCRE for use with a different version is not -guaranteed to work and may cause crashes. -. -. -.SH "CHECKING BUILD-TIME OPTIONS" -.rs -.sp -.B int pcre_config(int \fIwhat\fP, void *\fIwhere\fP); -.PP -The function \fBpcre_config()\fP makes it possible for a PCRE client to -discover which optional features have been compiled into the PCRE library. The -.\" HREF -\fBpcrebuild\fP -.\" -documentation has more details about these optional features. -.P -The first argument for \fBpcre_config()\fP is an integer, specifying which -information is required; the second argument is a pointer to a variable into -which the information is placed. The returned value is zero on success, or the -negative error code PCRE_ERROR_BADOPTION if the value in the first argument is -not recognized. The following information is available: -.sp - PCRE_CONFIG_UTF8 -.sp -The output is an integer that is set to one if UTF-8 support is available; -otherwise it is set to zero. This value should normally be given to the 8-bit -version of this function, \fBpcre_config()\fP. If it is given to the 16-bit -or 32-bit version of this function, the result is PCRE_ERROR_BADOPTION. -.sp - PCRE_CONFIG_UTF16 -.sp -The output is an integer that is set to one if UTF-16 support is available; -otherwise it is set to zero. This value should normally be given to the 16-bit -version of this function, \fBpcre16_config()\fP. If it is given to the 8-bit -or 32-bit version of this function, the result is PCRE_ERROR_BADOPTION. -.sp - PCRE_CONFIG_UTF32 -.sp -The output is an integer that is set to one if UTF-32 support is available; -otherwise it is set to zero. This value should normally be given to the 32-bit -version of this function, \fBpcre32_config()\fP. If it is given to the 8-bit -or 16-bit version of this function, the result is PCRE_ERROR_BADOPTION. -.sp - PCRE_CONFIG_UNICODE_PROPERTIES -.sp -The output is an integer that is set to one if support for Unicode character -properties is available; otherwise it is set to zero. -.sp - PCRE_CONFIG_JIT -.sp -The output is an integer that is set to one if support for just-in-time -compiling is available; otherwise it is set to zero. -.sp - PCRE_CONFIG_JITTARGET -.sp -The output is a pointer to a zero-terminated "const char *" string. If JIT -support is available, the string contains the name of the architecture for -which the JIT compiler is configured, for example "x86 32bit (little endian + -unaligned)". If JIT support is not available, the result is NULL. -.sp - PCRE_CONFIG_NEWLINE -.sp -The output is an integer whose value specifies the default character sequence -that is recognized as meaning "newline". The values that are supported in -ASCII/Unicode environments are: 10 for LF, 13 for CR, 3338 for CRLF, -2 for -ANYCRLF, and -1 for ANY. In EBCDIC environments, CR, ANYCRLF, and ANY yield the -same values. However, the value for LF is normally 21, though some EBCDIC -environments use 37. The corresponding values for CRLF are 3349 and 3365. The -default should normally correspond to the standard sequence for your operating -system. -.sp - PCRE_CONFIG_BSR -.sp -The output is an integer whose value indicates what character sequences the \eR -escape sequence matches by default. A value of 0 means that \eR matches any -Unicode line ending sequence; a value of 1 means that \eR matches only CR, LF, -or CRLF. The default can be overridden when a pattern is compiled or matched. -.sp - PCRE_CONFIG_LINK_SIZE -.sp -The output is an integer that contains the number of bytes used for internal -linkage in compiled regular expressions. For the 8-bit library, the value can -be 2, 3, or 4. For the 16-bit library, the value is either 2 or 4 and is still -a number of bytes. For the 32-bit library, the value is either 2 or 4 and is -still a number of bytes. The default value of 2 is sufficient for all but the -most massive patterns, since it allows the compiled pattern to be up to 64K in -size. Larger values allow larger regular expressions to be compiled, at the -expense of slower matching. -.sp - PCRE_CONFIG_POSIX_MALLOC_THRESHOLD -.sp -The output is an integer that contains the threshold above which the POSIX -interface uses \fBmalloc()\fP for output vectors. Further details are given in -the -.\" HREF -\fBpcreposix\fP -.\" -documentation. -.sp - PCRE_CONFIG_PARENS_LIMIT -.sp -The output is a long integer that gives the maximum depth of nesting of -parentheses (of any kind) in a pattern. This limit is imposed to cap the amount -of system stack used when a pattern is compiled. It is specified when PCRE is -built; the default is 250. This limit does not take into account the stack that -may already be used by the calling application. For finer control over -compilation stack usage, you can set a pointer to an external checking function -in \fBpcre_stack_guard\fP. -.sp - PCRE_CONFIG_MATCH_LIMIT -.sp -The output is a long integer that gives the default limit for the number of -internal matching function calls in a \fBpcre_exec()\fP execution. Further -details are given with \fBpcre_exec()\fP below. -.sp - PCRE_CONFIG_MATCH_LIMIT_RECURSION -.sp -The output is a long integer that gives the default limit for the depth of -recursion when calling the internal matching function in a \fBpcre_exec()\fP -execution. Further details are given with \fBpcre_exec()\fP below. -.sp - PCRE_CONFIG_STACKRECURSE -.sp -The output is an integer that is set to one if internal recursion when running -\fBpcre_exec()\fP is implemented by recursive function calls that use the stack -to remember their state. This is the usual way that PCRE is compiled. The -output is zero if PCRE was compiled to use blocks of data on the heap instead -of recursive function calls. In this case, \fBpcre_stack_malloc\fP and -\fBpcre_stack_free\fP are called to manage memory blocks on the heap, thus -avoiding the use of the stack. -. -. -.SH "COMPILING A PATTERN" -.rs -.sp -.nf -.B pcre *pcre_compile(const char *\fIpattern\fP, int \fIoptions\fP, -.B " const char **\fIerrptr\fP, int *\fIerroffset\fP," -.B " const unsigned char *\fItableptr\fP);" -.sp -.B pcre *pcre_compile2(const char *\fIpattern\fP, int \fIoptions\fP, -.B " int *\fIerrorcodeptr\fP," -.B " const char **\fIerrptr\fP, int *\fIerroffset\fP," -.B " const unsigned char *\fItableptr\fP);" -.fi -.P -Either of the functions \fBpcre_compile()\fP or \fBpcre_compile2()\fP can be -called to compile a pattern into an internal form. The only difference between -the two interfaces is that \fBpcre_compile2()\fP has an additional argument, -\fIerrorcodeptr\fP, via which a numerical error code can be returned. To avoid -too much repetition, we refer just to \fBpcre_compile()\fP below, but the -information applies equally to \fBpcre_compile2()\fP. -.P -The pattern is a C string terminated by a binary zero, and is passed in the -\fIpattern\fP argument. A pointer to a single block of memory that is obtained -via \fBpcre_malloc\fP is returned. This contains the compiled code and related -data. The \fBpcre\fP type is defined for the returned block; this is a typedef -for a structure whose contents are not externally defined. It is up to the -caller to free the memory (via \fBpcre_free\fP) when it is no longer required. -.P -Although the compiled code of a PCRE regex is relocatable, that is, it does not -depend on memory location, the complete \fBpcre\fP data block is not -fully relocatable, because it may contain a copy of the \fItableptr\fP -argument, which is an address (see below). -.P -The \fIoptions\fP argument contains various bit settings that affect the -compilation. It should be zero if no options are required. The available -options are described below. Some of them (in particular, those that are -compatible with Perl, but some others as well) can also be set and unset from -within the pattern (see the detailed description in the -.\" HREF -\fBpcrepattern\fP -.\" -documentation). For those options that can be different in different parts of -the pattern, the contents of the \fIoptions\fP argument specifies their -settings at the start of compilation and execution. The PCRE_ANCHORED, -PCRE_BSR_\fIxxx\fP, PCRE_NEWLINE_\fIxxx\fP, PCRE_NO_UTF8_CHECK, and -PCRE_NO_START_OPTIMIZE options can be set at the time of matching as well as at -compile time. -.P -If \fIerrptr\fP is NULL, \fBpcre_compile()\fP returns NULL immediately. -Otherwise, if compilation of a pattern fails, \fBpcre_compile()\fP returns -NULL, and sets the variable pointed to by \fIerrptr\fP to point to a textual -error message. This is a static string that is part of the library. You must -not try to free it. Normally, the offset from the start of the pattern to the -data unit that was being processed when the error was discovered is placed in -the variable pointed to by \fIerroffset\fP, which must not be NULL (if it is, -an immediate error is given). However, for an invalid UTF-8 or UTF-16 string, -the offset is that of the first data unit of the failing character. -.P -Some errors are not detected until the whole pattern has been scanned; in these -cases, the offset passed back is the length of the pattern. Note that the -offset is in data units, not characters, even in a UTF mode. It may sometimes -point into the middle of a UTF-8 or UTF-16 character. -.P -If \fBpcre_compile2()\fP is used instead of \fBpcre_compile()\fP, and the -\fIerrorcodeptr\fP argument is not NULL, a non-zero error code number is -returned via this argument in the event of an error. This is in addition to the -textual error message. Error codes and messages are listed below. -.P -If the final argument, \fItableptr\fP, is NULL, PCRE uses a default set of -character tables that are built when PCRE is compiled, using the default C -locale. Otherwise, \fItableptr\fP must be an address that is the result of a -call to \fBpcre_maketables()\fP. This value is stored with the compiled -pattern, and used again by \fBpcre_exec()\fP and \fBpcre_dfa_exec()\fP when the -pattern is matched. For more discussion, see the section on locale support -below. -.P -This code fragment shows a typical straightforward call to \fBpcre_compile()\fP: -.sp - pcre *re; - const char *error; - int erroffset; - re = pcre_compile( - "^A.*Z", /* the pattern */ - 0, /* default options */ - &error, /* for error message */ - &erroffset, /* for error offset */ - NULL); /* use default character tables */ -.sp -The following names for option bits are defined in the \fBpcre.h\fP header -file: -.sp - PCRE_ANCHORED -.sp -If this bit is set, the pattern is forced to be "anchored", that is, it is -constrained to match only at the first matching point in the string that is -being searched (the "subject string"). This effect can also be achieved by -appropriate constructs in the pattern itself, which is the only way to do it in -Perl. -.sp - PCRE_AUTO_CALLOUT -.sp -If this bit is set, \fBpcre_compile()\fP automatically inserts callout items, -all with number 255, before each pattern item. For discussion of the callout -facility, see the -.\" HREF -\fBpcrecallout\fP -.\" -documentation. -.sp - PCRE_BSR_ANYCRLF - PCRE_BSR_UNICODE -.sp -These options (which are mutually exclusive) control what the \eR escape -sequence matches. The choice is either to match only CR, LF, or CRLF, or to -match any Unicode newline sequence. The default is specified when PCRE is -built. It can be overridden from within the pattern, or by setting an option -when a compiled pattern is matched. -.sp - PCRE_CASELESS -.sp -If this bit is set, letters in the pattern match both upper and lower case -letters. It is equivalent to Perl's /i option, and it can be changed within a -pattern by a (?i) option setting. In UTF-8 mode, PCRE always understands the -concept of case for characters whose values are less than 128, so caseless -matching is always possible. For characters with higher values, the concept of -case is supported if PCRE is compiled with Unicode property support, but not -otherwise. If you want to use caseless matching for characters 128 and above, -you must ensure that PCRE is compiled with Unicode property support as well as -with UTF-8 support. -.sp - PCRE_DOLLAR_ENDONLY -.sp -If this bit is set, a dollar metacharacter in the pattern matches only at the -end of the subject string. Without this option, a dollar also matches -immediately before a newline at the end of the string (but not before any other -newlines). The PCRE_DOLLAR_ENDONLY option is ignored if PCRE_MULTILINE is set. -There is no equivalent to this option in Perl, and no way to set it within a -pattern. -.sp - PCRE_DOTALL -.sp -If this bit is set, a dot metacharacter in the pattern matches a character of -any value, including one that indicates a newline. However, it only ever -matches one character, even if newlines are coded as CRLF. Without this option, -a dot does not match when the current position is at a newline. This option is -equivalent to Perl's /s option, and it can be changed within a pattern by a -(?s) option setting. A negative class such as [^a] always matches newline -characters, independent of the setting of this option. -.sp - PCRE_DUPNAMES -.sp -If this bit is set, names used to identify capturing subpatterns need not be -unique. This can be helpful for certain types of pattern when it is known that -only one instance of the named subpattern can ever be matched. There are more -details of named subpatterns below; see also the -.\" HREF -\fBpcrepattern\fP -.\" -documentation. -.sp - PCRE_EXTENDED -.sp -If this bit is set, most white space characters in the pattern are totally -ignored except when escaped or inside a character class. However, white space -is not allowed within sequences such as (?> that introduce various -parenthesized subpatterns, nor within a numerical quantifier such as {1,3}. -However, ignorable white space is permitted between an item and a following -quantifier and between a quantifier and a following + that indicates -possessiveness. -.P -White space did not used to include the VT character (code 11), because Perl -did not treat this character as white space. However, Perl changed at release -5.18, so PCRE followed at release 8.34, and VT is now treated as white space. -.P -PCRE_EXTENDED also causes characters between an unescaped # outside a character -class and the next newline, inclusive, to be ignored. PCRE_EXTENDED is -equivalent to Perl's /x option, and it can be changed within a pattern by a -(?x) option setting. -.P -Which characters are interpreted as newlines is controlled by the options -passed to \fBpcre_compile()\fP or by a special sequence at the start of the -pattern, as described in the section entitled -.\" HTML -.\" -"Newline conventions" -.\" -in the \fBpcrepattern\fP documentation. Note that the end of this type of -comment is a literal newline sequence in the pattern; escape sequences that -happen to represent a newline do not count. -.P -This option makes it possible to include comments inside complicated patterns. -Note, however, that this applies only to data characters. White space characters -may never appear within special character sequences in a pattern, for example -within the sequence (?( that introduces a conditional subpattern. -.sp - PCRE_EXTRA -.sp -This option was invented in order to turn on additional functionality of PCRE -that is incompatible with Perl, but it is currently of very little use. When -set, any backslash in a pattern that is followed by a letter that has no -special meaning causes an error, thus reserving these combinations for future -expansion. By default, as in Perl, a backslash followed by a letter with no -special meaning is treated as a literal. (Perl can, however, be persuaded to -give an error for this, by running it with the -w option.) There are at present -no other features controlled by this option. It can also be set by a (?X) -option setting within a pattern. -.sp - PCRE_FIRSTLINE -.sp -If this option is set, an unanchored pattern is required to match before or at -the first newline in the subject string, though the matched text may continue -over the newline. -.sp - PCRE_JAVASCRIPT_COMPAT -.sp -If this option is set, PCRE's behaviour is changed in some ways so that it is -compatible with JavaScript rather than Perl. The changes are as follows: -.P -(1) A lone closing square bracket in a pattern causes a compile-time error, -because this is illegal in JavaScript (by default it is treated as a data -character). Thus, the pattern AB]CD becomes illegal when this option is set. -.P -(2) At run time, a back reference to an unset subpattern group matches an empty -string (by default this causes the current matching alternative to fail). A -pattern such as (\e1)(a) succeeds when this option is set (assuming it can find -an "a" in the subject), whereas it fails by default, for Perl compatibility. -.P -(3) \eU matches an upper case "U" character; by default \eU causes a compile -time error (Perl uses \eU to upper case subsequent characters). -.P -(4) \eu matches a lower case "u" character unless it is followed by four -hexadecimal digits, in which case the hexadecimal number defines the code point -to match. By default, \eu causes a compile time error (Perl uses it to upper -case the following character). -.P -(5) \ex matches a lower case "x" character unless it is followed by two -hexadecimal digits, in which case the hexadecimal number defines the code point -to match. By default, as in Perl, a hexadecimal number is always expected after -\ex, but it may have zero, one, or two digits (so, for example, \exz matches a -binary zero character followed by z). -.sp - PCRE_MULTILINE -.sp -By default, for the purposes of matching "start of line" and "end of line", -PCRE treats the subject string as consisting of a single line of characters, -even if it actually contains newlines. The "start of line" metacharacter (^) -matches only at the start of the string, and the "end of line" metacharacter -($) matches only at the end of the string, or before a terminating newline -(except when PCRE_DOLLAR_ENDONLY is set). Note, however, that unless -PCRE_DOTALL is set, the "any character" metacharacter (.) does not match at a -newline. This behaviour (for ^, $, and dot) is the same as Perl. -.P -When PCRE_MULTILINE it is set, the "start of line" and "end of line" constructs -match immediately following or immediately before internal newlines in the -subject string, respectively, as well as at the very start and end. This is -equivalent to Perl's /m option, and it can be changed within a pattern by a -(?m) option setting. If there are no newlines in a subject string, or no -occurrences of ^ or $ in a pattern, setting PCRE_MULTILINE has no effect. -.sp - PCRE_NEVER_UTF -.sp -This option locks out interpretation of the pattern as UTF-8 (or UTF-16 or -UTF-32 in the 16-bit and 32-bit libraries). In particular, it prevents the -creator of the pattern from switching to UTF interpretation by starting the -pattern with (*UTF). This may be useful in applications that process patterns -from external sources. The combination of PCRE_UTF8 and PCRE_NEVER_UTF also -causes an error. -.sp - PCRE_NEWLINE_CR - PCRE_NEWLINE_LF - PCRE_NEWLINE_CRLF - PCRE_NEWLINE_ANYCRLF - PCRE_NEWLINE_ANY -.sp -These options override the default newline definition that was chosen when PCRE -was built. Setting the first or the second specifies that a newline is -indicated by a single character (CR or LF, respectively). Setting -PCRE_NEWLINE_CRLF specifies that a newline is indicated by the two-character -CRLF sequence. Setting PCRE_NEWLINE_ANYCRLF specifies that any of the three -preceding sequences should be recognized. Setting PCRE_NEWLINE_ANY specifies -that any Unicode newline sequence should be recognized. -.P -In an ASCII/Unicode environment, the Unicode newline sequences are the three -just mentioned, plus the single characters VT (vertical tab, U+000B), FF (form -feed, U+000C), NEL (next line, U+0085), LS (line separator, U+2028), and PS -(paragraph separator, U+2029). For the 8-bit library, the last two are -recognized only in UTF-8 mode. -.P -When PCRE is compiled to run in an EBCDIC (mainframe) environment, the code for -CR is 0x0d, the same as ASCII. However, the character code for LF is normally -0x15, though in some EBCDIC environments 0x25 is used. Whichever of these is -not LF is made to correspond to Unicode's NEL character. EBCDIC codes are all -less than 256. For more details, see the -.\" HREF -\fBpcrebuild\fP -.\" -documentation. -.P -The newline setting in the options word uses three bits that are treated -as a number, giving eight possibilities. Currently only six are used (default -plus the five values above). This means that if you set more than one newline -option, the combination may or may not be sensible. For example, -PCRE_NEWLINE_CR with PCRE_NEWLINE_LF is equivalent to PCRE_NEWLINE_CRLF, but -other combinations may yield unused numbers and cause an error. -.P -The only time that a line break in a pattern is specially recognized when -compiling is when PCRE_EXTENDED is set. CR and LF are white space characters, -and so are ignored in this mode. Also, an unescaped # outside a character class -indicates a comment that lasts until after the next line break sequence. In -other circumstances, line break sequences in patterns are treated as literal -data. -.P -The newline option that is set at compile time becomes the default that is used -for \fBpcre_exec()\fP and \fBpcre_dfa_exec()\fP, but it can be overridden. -.sp - PCRE_NO_AUTO_CAPTURE -.sp -If this option is set, it disables the use of numbered capturing parentheses in -the pattern. Any opening parenthesis that is not followed by ? behaves as if it -were followed by ?: but named parentheses can still be used for capturing (and -they acquire numbers in the usual way). There is no equivalent of this option -in Perl. -.sp - PCRE_NO_AUTO_POSSESS -.sp -If this option is set, it disables "auto-possessification". This is an -optimization that, for example, turns a+b into a++b in order to avoid -backtracks into a+ that can never be successful. However, if callouts are in -use, auto-possessification means that some of them are never taken. You can set -this option if you want the matching functions to do a full unoptimized search -and run all the callouts, but it is mainly provided for testing purposes. -.sp - PCRE_NO_START_OPTIMIZE -.sp -This is an option that acts at matching time; that is, it is really an option -for \fBpcre_exec()\fP or \fBpcre_dfa_exec()\fP. If it is set at compile time, -it is remembered with the compiled pattern and assumed at matching time. This -is necessary if you want to use JIT execution, because the JIT compiler needs -to know whether or not this option is set. For details see the discussion of -PCRE_NO_START_OPTIMIZE -.\" HTML -.\" -below. -.\" -.sp - PCRE_UCP -.sp -This option changes the way PCRE processes \eB, \eb, \eD, \ed, \eS, \es, \eW, -\ew, and some of the POSIX character classes. By default, only ASCII characters -are recognized, but if PCRE_UCP is set, Unicode properties are used instead to -classify characters. More details are given in the section on -.\" HTML -.\" -generic character types -.\" -in the -.\" HREF -\fBpcrepattern\fP -.\" -page. If you set PCRE_UCP, matching one of the items it affects takes much -longer. The option is available only if PCRE has been compiled with Unicode -property support. -.sp - PCRE_UNGREEDY -.sp -This option inverts the "greediness" of the quantifiers so that they are not -greedy by default, but become greedy if followed by "?". It is not compatible -with Perl. It can also be set by a (?U) option setting within the pattern. -.sp - PCRE_UTF8 -.sp -This option causes PCRE to regard both the pattern and the subject as strings -of UTF-8 characters instead of single-byte strings. However, it is available -only when PCRE is built to include UTF support. If not, the use of this option -provokes an error. Details of how this option changes the behaviour of PCRE are -given in the -.\" HREF -\fBpcreunicode\fP -.\" -page. -.sp - PCRE_NO_UTF8_CHECK -.sp -When PCRE_UTF8 is set, the validity of the pattern as a UTF-8 string is -automatically checked. There is a discussion about the -.\" HTML -.\" -validity of UTF-8 strings -.\" -in the -.\" HREF -\fBpcreunicode\fP -.\" -page. If an invalid UTF-8 sequence is found, \fBpcre_compile()\fP returns an -error. If you already know that your pattern is valid, and you want to skip -this check for performance reasons, you can set the PCRE_NO_UTF8_CHECK option. -When it is set, the effect of passing an invalid UTF-8 string as a pattern is -undefined. It may cause your program to crash or loop. Note that this option -can also be passed to \fBpcre_exec()\fP and \fBpcre_dfa_exec()\fP, to suppress -the validity checking of subject strings only. If the same string is being -matched many times, the option can be safely set for the second and subsequent -matchings to improve performance. -. -. -.SH "COMPILATION ERROR CODES" -.rs -.sp -The following table lists the error codes than may be returned by -\fBpcre_compile2()\fP, along with the error messages that may be returned by -both compiling functions. Note that error messages are always 8-bit ASCII -strings, even in 16-bit or 32-bit mode. As PCRE has developed, some error codes -have fallen out of use. To avoid confusion, they have not been re-used. -.sp - 0 no error - 1 \e at end of pattern - 2 \ec at end of pattern - 3 unrecognized character follows \e - 4 numbers out of order in {} quantifier - 5 number too big in {} quantifier - 6 missing terminating ] for character class - 7 invalid escape sequence in character class - 8 range out of order in character class - 9 nothing to repeat - 10 [this code is not in use] - 11 internal error: unexpected repeat - 12 unrecognized character after (? or (?- - 13 POSIX named classes are supported only within a class - 14 missing ) - 15 reference to non-existent subpattern - 16 erroffset passed as NULL - 17 unknown option bit(s) set - 18 missing ) after comment - 19 [this code is not in use] - 20 regular expression is too large - 21 failed to get memory - 22 unmatched parentheses - 23 internal error: code overflow - 24 unrecognized character after (?< - 25 lookbehind assertion is not fixed length - 26 malformed number or name after (?( - 27 conditional group contains more than two branches - 28 assertion expected after (?( - 29 (?R or (?[+-]digits must be followed by ) - 30 unknown POSIX class name - 31 POSIX collating elements are not supported - 32 this version of PCRE is compiled without UTF support - 33 [this code is not in use] - 34 character value in \ex{} or \eo{} is too large - 35 invalid condition (?(0) - 36 \eC not allowed in lookbehind assertion - 37 PCRE does not support \eL, \el, \eN{name}, \eU, or \eu - 38 number after (?C is > 255 - 39 closing ) for (?C expected - 40 recursive call could loop indefinitely - 41 unrecognized character after (?P - 42 syntax error in subpattern name (missing terminator) - 43 two named subpatterns have the same name - 44 invalid UTF-8 string (specifically UTF-8) - 45 support for \eP, \ep, and \eX has not been compiled - 46 malformed \eP or \ep sequence - 47 unknown property name after \eP or \ep - 48 subpattern name is too long (maximum 32 characters) - 49 too many named subpatterns (maximum 10000) - 50 [this code is not in use] - 51 octal value is greater than \e377 in 8-bit non-UTF-8 mode - 52 internal error: overran compiling workspace - 53 internal error: previously-checked referenced subpattern - not found - 54 DEFINE group contains more than one branch - 55 repeating a DEFINE group is not allowed - 56 inconsistent NEWLINE options - 57 \eg is not followed by a braced, angle-bracketed, or quoted - name/number or by a plain number - 58 a numbered reference must not be zero - 59 an argument is not allowed for (*ACCEPT), (*FAIL), or (*COMMIT) - 60 (*VERB) not recognized or malformed - 61 number is too big - 62 subpattern name expected - 63 digit expected after (?+ - 64 ] is an invalid data character in JavaScript compatibility mode - 65 different names for subpatterns of the same number are - not allowed - 66 (*MARK) must have an argument - 67 this version of PCRE is not compiled with Unicode property - support - 68 \ec must be followed by an ASCII character - 69 \ek is not followed by a braced, angle-bracketed, or quoted name - 70 internal error: unknown opcode in find_fixedlength() - 71 \eN is not supported in a class - 72 too many forward references - 73 disallowed Unicode code point (>= 0xd800 && <= 0xdfff) - 74 invalid UTF-16 string (specifically UTF-16) - 75 name is too long in (*MARK), (*PRUNE), (*SKIP), or (*THEN) - 76 character value in \eu.... sequence is too large - 77 invalid UTF-32 string (specifically UTF-32) - 78 setting UTF is disabled by the application - 79 non-hex character in \ex{} (closing brace missing?) - 80 non-octal character in \eo{} (closing brace missing?) - 81 missing opening brace after \eo - 82 parentheses are too deeply nested - 83 invalid range in character class - 84 group name must start with a non-digit - 85 parentheses are too deeply nested (stack check) -.sp -The numbers 32 and 10000 in errors 48 and 49 are defaults; different values may -be used if the limits were changed when PCRE was built. -. -. -.\" HTML -.SH "STUDYING A PATTERN" -.rs -.sp -.nf -.B pcre_extra *pcre_study(const pcre *\fIcode\fP, int \fIoptions\fP, -.B " const char **\fIerrptr\fP);" -.fi -.PP -If a compiled pattern is going to be used several times, it is worth spending -more time analyzing it in order to speed up the time taken for matching. The -function \fBpcre_study()\fP takes a pointer to a compiled pattern as its first -argument. If studying the pattern produces additional information that will -help speed up matching, \fBpcre_study()\fP returns a pointer to a -\fBpcre_extra\fP block, in which the \fIstudy_data\fP field points to the -results of the study. -.P -The returned value from \fBpcre_study()\fP can be passed directly to -\fBpcre_exec()\fP or \fBpcre_dfa_exec()\fP. However, a \fBpcre_extra\fP block -also contains other fields that can be set by the caller before the block is -passed; these are described -.\" HTML -.\" -below -.\" -in the section on matching a pattern. -.P -If studying the pattern does not produce any useful information, -\fBpcre_study()\fP returns NULL by default. In that circumstance, if the -calling program wants to pass any of the other fields to \fBpcre_exec()\fP or -\fBpcre_dfa_exec()\fP, it must set up its own \fBpcre_extra\fP block. However, -if \fBpcre_study()\fP is called with the PCRE_STUDY_EXTRA_NEEDED option, it -returns a \fBpcre_extra\fP block even if studying did not find any additional -information. It may still return NULL, however, if an error occurs in -\fBpcre_study()\fP. -.P -The second argument of \fBpcre_study()\fP contains option bits. There are three -further options in addition to PCRE_STUDY_EXTRA_NEEDED: -.sp - PCRE_STUDY_JIT_COMPILE - PCRE_STUDY_JIT_PARTIAL_HARD_COMPILE - PCRE_STUDY_JIT_PARTIAL_SOFT_COMPILE -.sp -If any of these are set, and the just-in-time compiler is available, the -pattern is further compiled into machine code that executes much faster than -the \fBpcre_exec()\fP interpretive matching function. If the just-in-time -compiler is not available, these options are ignored. All undefined bits in the -\fIoptions\fP argument must be zero. -.P -JIT compilation is a heavyweight optimization. It can take some time for -patterns to be analyzed, and for one-off matches and simple patterns the -benefit of faster execution might be offset by a much slower study time. -Not all patterns can be optimized by the JIT compiler. For those that cannot be -handled, matching automatically falls back to the \fBpcre_exec()\fP -interpreter. For more details, see the -.\" HREF -\fBpcrejit\fP -.\" -documentation. -.P -The third argument for \fBpcre_study()\fP is a pointer for an error message. If -studying succeeds (even if no data is returned), the variable it points to is -set to NULL. Otherwise it is set to point to a textual error message. This is a -static string that is part of the library. You must not try to free it. You -should test the error pointer for NULL after calling \fBpcre_study()\fP, to be -sure that it has run successfully. -.P -When you are finished with a pattern, you can free the memory used for the -study data by calling \fBpcre_free_study()\fP. This function was added to the -API for release 8.20. For earlier versions, the memory could be freed with -\fBpcre_free()\fP, just like the pattern itself. This will still work in cases -where JIT optimization is not used, but it is advisable to change to the new -function when convenient. -.P -This is a typical way in which \fBpcre_study\fP() is used (except that in a -real application there should be tests for errors): -.sp - int rc; - pcre *re; - pcre_extra *sd; - re = pcre_compile("pattern", 0, &error, &erroroffset, NULL); - sd = pcre_study( - re, /* result of pcre_compile() */ - 0, /* no options */ - &error); /* set to NULL or points to a message */ - rc = pcre_exec( /* see below for details of pcre_exec() options */ - re, sd, "subject", 7, 0, 0, ovector, 30); - ... - pcre_free_study(sd); - pcre_free(re); -.sp -Studying a pattern does two things: first, a lower bound for the length of -subject string that is needed to match the pattern is computed. This does not -mean that there are any strings of that length that match, but it does -guarantee that no shorter strings match. The value is used to avoid wasting -time by trying to match strings that are shorter than the lower bound. You can -find out the value in a calling program via the \fBpcre_fullinfo()\fP function. -.P -Studying a pattern is also useful for non-anchored patterns that do not have a -single fixed starting character. A bitmap of possible starting bytes is -created. This speeds up finding a position in the subject at which to start -matching. (In 16-bit mode, the bitmap is used for 16-bit values less than 256. -In 32-bit mode, the bitmap is used for 32-bit values less than 256.) -.P -These two optimizations apply to both \fBpcre_exec()\fP and -\fBpcre_dfa_exec()\fP, and the information is also used by the JIT compiler. -The optimizations can be disabled by setting the PCRE_NO_START_OPTIMIZE option. -You might want to do this if your pattern contains callouts or (*MARK) and you -want to make use of these facilities in cases where matching fails. -.P -PCRE_NO_START_OPTIMIZE can be specified at either compile time or execution -time. However, if PCRE_NO_START_OPTIMIZE is passed to \fBpcre_exec()\fP, (that -is, after any JIT compilation has happened) JIT execution is disabled. For JIT -execution to work with PCRE_NO_START_OPTIMIZE, the option must be set at -compile time. -.P -There is a longer discussion of PCRE_NO_START_OPTIMIZE -.\" HTML -.\" -below. -.\" -. -. -.\" HTML -.SH "LOCALE SUPPORT" -.rs -.sp -PCRE handles caseless matching, and determines whether characters are letters, -digits, or whatever, by reference to a set of tables, indexed by character -code point. When running in UTF-8 mode, or in the 16- or 32-bit libraries, this -applies only to characters with code points less than 256. By default, -higher-valued code points never match escapes such as \ew or \ed. However, if -PCRE is built with Unicode property support, all characters can be tested with -\ep and \eP, or, alternatively, the PCRE_UCP option can be set when a pattern -is compiled; this causes \ew and friends to use Unicode property support -instead of the built-in tables. -.P -The use of locales with Unicode is discouraged. If you are handling characters -with code points greater than 128, you should either use Unicode support, or -use locales, but not try to mix the two. -.P -PCRE contains an internal set of tables that are used when the final argument -of \fBpcre_compile()\fP is NULL. These are sufficient for many applications. -Normally, the internal tables recognize only ASCII characters. However, when -PCRE is built, it is possible to cause the internal tables to be rebuilt in the -default "C" locale of the local system, which may cause them to be different. -.P -The internal tables can always be overridden by tables supplied by the -application that calls PCRE. These may be created in a different locale from -the default. As more and more applications change to using Unicode, the need -for this locale support is expected to die away. -.P -External tables are built by calling the \fBpcre_maketables()\fP function, -which has no arguments, in the relevant locale. The result can then be passed -to \fBpcre_compile()\fP as often as necessary. For example, to build and use -tables that are appropriate for the French locale (where accented characters -with values greater than 128 are treated as letters), the following code could -be used: -.sp - setlocale(LC_CTYPE, "fr_FR"); - tables = pcre_maketables(); - re = pcre_compile(..., tables); -.sp -The locale name "fr_FR" is used on Linux and other Unix-like systems; if you -are using Windows, the name for the French locale is "french". -.P -When \fBpcre_maketables()\fP runs, the tables are built in memory that is -obtained via \fBpcre_malloc\fP. It is the caller's responsibility to ensure -that the memory containing the tables remains available for as long as it is -needed. -.P -The pointer that is passed to \fBpcre_compile()\fP is saved with the compiled -pattern, and the same tables are used via this pointer by \fBpcre_study()\fP -and also by \fBpcre_exec()\fP and \fBpcre_dfa_exec()\fP. Thus, for any single -pattern, compilation, studying and matching all happen in the same locale, but -different patterns can be processed in different locales. -.P -It is possible to pass a table pointer or NULL (indicating the use of the -internal tables) to \fBpcre_exec()\fP or \fBpcre_dfa_exec()\fP (see the -discussion below in the section on matching a pattern). This facility is -provided for use with pre-compiled patterns that have been saved and reloaded. -Character tables are not saved with patterns, so if a non-standard table was -used at compile time, it must be provided again when the reloaded pattern is -matched. Attempting to use this facility to match a pattern in a different -locale from the one in which it was compiled is likely to lead to anomalous -(usually incorrect) results. -. -. -.\" HTML -.SH "INFORMATION ABOUT A PATTERN" -.rs -.sp -.nf -.B int pcre_fullinfo(const pcre *\fIcode\fP, "const pcre_extra *\fIextra\fP," -.B " int \fIwhat\fP, void *\fIwhere\fP);" -.fi -.PP -The \fBpcre_fullinfo()\fP function returns information about a compiled -pattern. It replaces the \fBpcre_info()\fP function, which was removed from the -library at version 8.30, after more than 10 years of obsolescence. -.P -The first argument for \fBpcre_fullinfo()\fP is a pointer to the compiled -pattern. The second argument is the result of \fBpcre_study()\fP, or NULL if -the pattern was not studied. The third argument specifies which piece of -information is required, and the fourth argument is a pointer to a variable -to receive the data. The yield of the function is zero for success, or one of -the following negative numbers: -.sp - PCRE_ERROR_NULL the argument \fIcode\fP was NULL - the argument \fIwhere\fP was NULL - PCRE_ERROR_BADMAGIC the "magic number" was not found - PCRE_ERROR_BADENDIANNESS the pattern was compiled with different - endianness - PCRE_ERROR_BADOPTION the value of \fIwhat\fP was invalid - PCRE_ERROR_UNSET the requested field is not set -.sp -The "magic number" is placed at the start of each compiled pattern as an simple -check against passing an arbitrary memory pointer. The endianness error can -occur if a compiled pattern is saved and reloaded on a different host. Here is -a typical call of \fBpcre_fullinfo()\fP, to obtain the length of the compiled -pattern: -.sp - int rc; - size_t length; - rc = pcre_fullinfo( - re, /* result of pcre_compile() */ - sd, /* result of pcre_study(), or NULL */ - PCRE_INFO_SIZE, /* what is required */ - &length); /* where to put the data */ -.sp -The possible values for the third argument are defined in \fBpcre.h\fP, and are -as follows: -.sp - PCRE_INFO_BACKREFMAX -.sp -Return the number of the highest back reference in the pattern. The fourth -argument should point to an \fBint\fP variable. Zero is returned if there are -no back references. -.sp - PCRE_INFO_CAPTURECOUNT -.sp -Return the number of capturing subpatterns in the pattern. The fourth argument -should point to an \fBint\fP variable. -.sp - PCRE_INFO_DEFAULT_TABLES -.sp -Return a pointer to the internal default character tables within PCRE. The -fourth argument should point to an \fBunsigned char *\fP variable. This -information call is provided for internal use by the \fBpcre_study()\fP -function. External callers can cause PCRE to use its internal tables by passing -a NULL table pointer. -.sp - PCRE_INFO_FIRSTBYTE (deprecated) -.sp -Return information about the first data unit of any matched string, for a -non-anchored pattern. The name of this option refers to the 8-bit library, -where data units are bytes. The fourth argument should point to an \fBint\fP -variable. Negative values are used for special cases. However, this means that -when the 32-bit library is in non-UTF-32 mode, the full 32-bit range of -characters cannot be returned. For this reason, this value is deprecated; use -PCRE_INFO_FIRSTCHARACTERFLAGS and PCRE_INFO_FIRSTCHARACTER instead. -.P -If there is a fixed first value, for example, the letter "c" from a pattern -such as (cat|cow|coyote), its value is returned. In the 8-bit library, the -value is always less than 256. In the 16-bit library the value can be up to -0xffff. In the 32-bit library the value can be up to 0x10ffff. -.P -If there is no fixed first value, and if either -.sp -(a) the pattern was compiled with the PCRE_MULTILINE option, and every branch -starts with "^", or -.sp -(b) every branch of the pattern starts with ".*" and PCRE_DOTALL is not set -(if it were set, the pattern would be anchored), -.sp --1 is returned, indicating that the pattern matches only at the start of a -subject string or after any newline within the string. Otherwise -2 is -returned. For anchored patterns, -2 is returned. -.sp - PCRE_INFO_FIRSTCHARACTER -.sp -Return the value of the first data unit (non-UTF character) of any matched -string in the situation where PCRE_INFO_FIRSTCHARACTERFLAGS returns 1; -otherwise return 0. The fourth argument should point to an \fBuint_t\fP -variable. -.P -In the 8-bit library, the value is always less than 256. In the 16-bit library -the value can be up to 0xffff. In the 32-bit library in UTF-32 mode the value -can be up to 0x10ffff, and up to 0xffffffff when not using UTF-32 mode. -.sp - PCRE_INFO_FIRSTCHARACTERFLAGS -.sp -Return information about the first data unit of any matched string, for a -non-anchored pattern. The fourth argument should point to an \fBint\fP -variable. -.P -If there is a fixed first value, for example, the letter "c" from a pattern -such as (cat|cow|coyote), 1 is returned, and the character value can be -retrieved using PCRE_INFO_FIRSTCHARACTER. If there is no fixed first value, and -if either -.sp -(a) the pattern was compiled with the PCRE_MULTILINE option, and every branch -starts with "^", or -.sp -(b) every branch of the pattern starts with ".*" and PCRE_DOTALL is not set -(if it were set, the pattern would be anchored), -.sp -2 is returned, indicating that the pattern matches only at the start of a -subject string or after any newline within the string. Otherwise 0 is -returned. For anchored patterns, 0 is returned. -.sp - PCRE_INFO_FIRSTTABLE -.sp -If the pattern was studied, and this resulted in the construction of a 256-bit -table indicating a fixed set of values for the first data unit in any matching -string, a pointer to the table is returned. Otherwise NULL is returned. The -fourth argument should point to an \fBunsigned char *\fP variable. -.sp - PCRE_INFO_HASCRORLF -.sp -Return 1 if the pattern contains any explicit matches for CR or LF characters, -otherwise 0. The fourth argument should point to an \fBint\fP variable. An -explicit match is either a literal CR or LF character, or \er or \en. -.sp - PCRE_INFO_JCHANGED -.sp -Return 1 if the (?J) or (?-J) option setting is used in the pattern, otherwise -0. The fourth argument should point to an \fBint\fP variable. (?J) and -(?-J) set and unset the local PCRE_DUPNAMES option, respectively. -.sp - PCRE_INFO_JIT -.sp -Return 1 if the pattern was studied with one of the JIT options, and -just-in-time compiling was successful. The fourth argument should point to an -\fBint\fP variable. A return value of 0 means that JIT support is not available -in this version of PCRE, or that the pattern was not studied with a JIT option, -or that the JIT compiler could not handle this particular pattern. See the -.\" HREF -\fBpcrejit\fP -.\" -documentation for details of what can and cannot be handled. -.sp - PCRE_INFO_JITSIZE -.sp -If the pattern was successfully studied with a JIT option, return the size of -the JIT compiled code, otherwise return zero. The fourth argument should point -to a \fBsize_t\fP variable. -.sp - PCRE_INFO_LASTLITERAL -.sp -Return the value of the rightmost literal data unit that must exist in any -matched string, other than at its start, if such a value has been recorded. The -fourth argument should point to an \fBint\fP variable. If there is no such -value, -1 is returned. For anchored patterns, a last literal value is recorded -only if it follows something of variable length. For example, for the pattern -/^a\ed+z\ed+/ the returned value is "z", but for /^a\edz\ed/ the returned value -is -1. -.P -Since for the 32-bit library using the non-UTF-32 mode, this function is unable -to return the full 32-bit range of characters, this value is deprecated; -instead the PCRE_INFO_REQUIREDCHARFLAGS and PCRE_INFO_REQUIREDCHAR values should -be used. -.sp - PCRE_INFO_MATCH_EMPTY -.sp -Return 1 if the pattern can match an empty string, otherwise 0. The fourth -argument should point to an \fBint\fP variable. -.sp - PCRE_INFO_MATCHLIMIT -.sp -If the pattern set a match limit by including an item of the form -(*LIMIT_MATCH=nnnn) at the start, the value is returned. The fourth argument -should point to an unsigned 32-bit integer. If no such value has been set, the -call to \fBpcre_fullinfo()\fP returns the error PCRE_ERROR_UNSET. -.sp - PCRE_INFO_MAXLOOKBEHIND -.sp -Return the number of characters (NB not data units) in the longest lookbehind -assertion in the pattern. This information is useful when doing multi-segment -matching using the partial matching facilities. Note that the simple assertions -\eb and \eB require a one-character lookbehind. \eA also registers a -one-character lookbehind, though it does not actually inspect the previous -character. This is to ensure that at least one character from the old segment -is retained when a new segment is processed. Otherwise, if there are no -lookbehinds in the pattern, \eA might match incorrectly at the start of a new -segment. -.sp - PCRE_INFO_MINLENGTH -.sp -If the pattern was studied and a minimum length for matching subject strings -was computed, its value is returned. Otherwise the returned value is -1. The -value is a number of characters, which in UTF mode may be different from the -number of data units. The fourth argument should point to an \fBint\fP -variable. A non-negative value is a lower bound to the length of any matching -string. There may not be any strings of that length that do actually match, but -every string that does match is at least that long. -.sp - PCRE_INFO_NAMECOUNT - PCRE_INFO_NAMEENTRYSIZE - PCRE_INFO_NAMETABLE -.sp -PCRE supports the use of named as well as numbered capturing parentheses. The -names are just an additional way of identifying the parentheses, which still -acquire numbers. Several convenience functions such as -\fBpcre_get_named_substring()\fP are provided for extracting captured -substrings by name. It is also possible to extract the data directly, by first -converting the name to a number in order to access the correct pointers in the -output vector (described with \fBpcre_exec()\fP below). To do the conversion, -you need to use the name-to-number map, which is described by these three -values. -.P -The map consists of a number of fixed-size entries. PCRE_INFO_NAMECOUNT gives -the number of entries, and PCRE_INFO_NAMEENTRYSIZE gives the size of each -entry; both of these return an \fBint\fP value. The entry size depends on the -length of the longest name. PCRE_INFO_NAMETABLE returns a pointer to the first -entry of the table. This is a pointer to \fBchar\fP in the 8-bit library, where -the first two bytes of each entry are the number of the capturing parenthesis, -most significant byte first. In the 16-bit library, the pointer points to -16-bit data units, the first of which contains the parenthesis number. In the -32-bit library, the pointer points to 32-bit data units, the first of which -contains the parenthesis number. The rest of the entry is the corresponding -name, zero terminated. -.P -The names are in alphabetical order. If (?| is used to create multiple groups -with the same number, as described in the -.\" HTML -.\" -section on duplicate subpattern numbers -.\" -in the -.\" HREF -\fBpcrepattern\fP -.\" -page, the groups may be given the same name, but there is only one entry in the -table. Different names for groups of the same number are not permitted. -Duplicate names for subpatterns with different numbers are permitted, -but only if PCRE_DUPNAMES is set. They appear in the table in the order in -which they were found in the pattern. In the absence of (?| this is the order -of increasing number; when (?| is used this is not necessarily the case because -later subpatterns may have lower numbers. -.P -As a simple example of the name/number table, consider the following pattern -after compilation by the 8-bit library (assume PCRE_EXTENDED is set, so white -space - including newlines - is ignored): -.sp -.\" JOIN - (? (?(\ed\ed)?\ed\ed) - - (?\ed\ed) - (?\ed\ed) ) -.sp -There are four named subpatterns, so the table has four entries, and each entry -in the table is eight bytes long. The table is as follows, with non-printing -bytes shows in hexadecimal, and undefined bytes shown as ??: -.sp - 00 01 d a t e 00 ?? - 00 05 d a y 00 ?? ?? - 00 04 m o n t h 00 - 00 02 y e a r 00 ?? -.sp -When writing code to extract data from named subpatterns using the -name-to-number map, remember that the length of the entries is likely to be -different for each compiled pattern. -.sp - PCRE_INFO_OKPARTIAL -.sp -Return 1 if the pattern can be used for partial matching with -\fBpcre_exec()\fP, otherwise 0. The fourth argument should point to an -\fBint\fP variable. From release 8.00, this always returns 1, because the -restrictions that previously applied to partial matching have been lifted. The -.\" HREF -\fBpcrepartial\fP -.\" -documentation gives details of partial matching. -.sp - PCRE_INFO_OPTIONS -.sp -Return a copy of the options with which the pattern was compiled. The fourth -argument should point to an \fBunsigned long int\fP variable. These option bits -are those specified in the call to \fBpcre_compile()\fP, modified by any -top-level option settings at the start of the pattern itself. In other words, -they are the options that will be in force when matching starts. For example, -if the pattern /(?im)abc(?-i)d/ is compiled with the PCRE_EXTENDED option, the -result is PCRE_CASELESS, PCRE_MULTILINE, and PCRE_EXTENDED. -.P -A pattern is automatically anchored by PCRE if all of its top-level -alternatives begin with one of the following: -.sp - ^ unless PCRE_MULTILINE is set - \eA always - \eG always -.\" JOIN - .* if PCRE_DOTALL is set and there are no back - references to the subpattern in which .* appears -.sp -For such patterns, the PCRE_ANCHORED bit is set in the options returned by -\fBpcre_fullinfo()\fP. -.sp - PCRE_INFO_RECURSIONLIMIT -.sp -If the pattern set a recursion limit by including an item of the form -(*LIMIT_RECURSION=nnnn) at the start, the value is returned. The fourth -argument should point to an unsigned 32-bit integer. If no such value has been -set, the call to \fBpcre_fullinfo()\fP returns the error PCRE_ERROR_UNSET. -.sp - PCRE_INFO_SIZE -.sp -Return the size of the compiled pattern in bytes (for all three libraries). The -fourth argument should point to a \fBsize_t\fP variable. This value does not -include the size of the \fBpcre\fP structure that is returned by -\fBpcre_compile()\fP. The value that is passed as the argument to -\fBpcre_malloc()\fP when \fBpcre_compile()\fP is getting memory in which to -place the compiled data is the value returned by this option plus the size of -the \fBpcre\fP structure. Studying a compiled pattern, with or without JIT, -does not alter the value returned by this option. -.sp - PCRE_INFO_STUDYSIZE -.sp -Return the size in bytes (for all three libraries) of the data block pointed to -by the \fIstudy_data\fP field in a \fBpcre_extra\fP block. If \fBpcre_extra\fP -is NULL, or there is no study data, zero is returned. The fourth argument -should point to a \fBsize_t\fP variable. The \fIstudy_data\fP field is set by -\fBpcre_study()\fP to record information that will speed up matching (see the -section entitled -.\" HTML -.\" -"Studying a pattern" -.\" -above). The format of the \fIstudy_data\fP block is private, but its length -is made available via this option so that it can be saved and restored (see the -.\" HREF -\fBpcreprecompile\fP -.\" -documentation for details). -.sp - PCRE_INFO_REQUIREDCHARFLAGS -.sp -Returns 1 if there is a rightmost literal data unit that must exist in any -matched string, other than at its start. The fourth argument should point to -an \fBint\fP variable. If there is no such value, 0 is returned. If returning -1, the character value itself can be retrieved using PCRE_INFO_REQUIREDCHAR. -.P -For anchored patterns, a last literal value is recorded only if it follows -something of variable length. For example, for the pattern /^a\ed+z\ed+/ the -returned value 1 (with "z" returned from PCRE_INFO_REQUIREDCHAR), but for -/^a\edz\ed/ the returned value is 0. -.sp - PCRE_INFO_REQUIREDCHAR -.sp -Return the value of the rightmost literal data unit that must exist in any -matched string, other than at its start, if such a value has been recorded. The -fourth argument should point to an \fBuint32_t\fP variable. If there is no such -value, 0 is returned. -. -. -.SH "REFERENCE COUNTS" -.rs -.sp -.B int pcre_refcount(pcre *\fIcode\fP, int \fIadjust\fP); -.PP -The \fBpcre_refcount()\fP function is used to maintain a reference count in the -data block that contains a compiled pattern. It is provided for the benefit of -applications that operate in an object-oriented manner, where different parts -of the application may be using the same compiled pattern, but you want to free -the block when they are all done. -.P -When a pattern is compiled, the reference count field is initialized to zero. -It is changed only by calling this function, whose action is to add the -\fIadjust\fP value (which may be positive or negative) to it. The yield of the -function is the new value. However, the value of the count is constrained to -lie between 0 and 65535, inclusive. If the new value is outside these limits, -it is forced to the appropriate limit value. -.P -Except when it is zero, the reference count is not correctly preserved if a -pattern is compiled on one host and then transferred to a host whose byte-order -is different. (This seems a highly unlikely scenario.) -. -. -.SH "MATCHING A PATTERN: THE TRADITIONAL FUNCTION" -.rs -.sp -.nf -.B int pcre_exec(const pcre *\fIcode\fP, "const pcre_extra *\fIextra\fP," -.B " const char *\fIsubject\fP," int \fIlength\fP, int \fIstartoffset\fP, -.B " int \fIoptions\fP, int *\fIovector\fP, int \fIovecsize\fP);" -.fi -.P -The function \fBpcre_exec()\fP is called to match a subject string against a -compiled pattern, which is passed in the \fIcode\fP argument. If the -pattern was studied, the result of the study should be passed in the -\fIextra\fP argument. You can call \fBpcre_exec()\fP with the same \fIcode\fP -and \fIextra\fP arguments as many times as you like, in order to match -different subject strings with the same pattern. -.P -This function is the main matching facility of the library, and it operates in -a Perl-like manner. For specialist use there is also an alternative matching -function, which is described -.\" HTML -.\" -below -.\" -in the section about the \fBpcre_dfa_exec()\fP function. -.P -In most applications, the pattern will have been compiled (and optionally -studied) in the same process that calls \fBpcre_exec()\fP. However, it is -possible to save compiled patterns and study data, and then use them later -in different processes, possibly even on different hosts. For a discussion -about this, see the -.\" HREF -\fBpcreprecompile\fP -.\" -documentation. -.P -Here is an example of a simple call to \fBpcre_exec()\fP: -.sp - int rc; - int ovector[30]; - rc = pcre_exec( - re, /* result of pcre_compile() */ - NULL, /* we didn't study the pattern */ - "some string", /* the subject string */ - 11, /* the length of the subject string */ - 0, /* start at offset 0 in the subject */ - 0, /* default options */ - ovector, /* vector of integers for substring information */ - 30); /* number of elements (NOT size in bytes) */ -. -. -.\" HTML -.SS "Extra data for \fBpcre_exec()\fR" -.rs -.sp -If the \fIextra\fP argument is not NULL, it must point to a \fBpcre_extra\fP -data block. The \fBpcre_study()\fP function returns such a block (when it -doesn't return NULL), but you can also create one for yourself, and pass -additional information in it. The \fBpcre_extra\fP block contains the following -fields (not necessarily in this order): -.sp - unsigned long int \fIflags\fP; - void *\fIstudy_data\fP; - void *\fIexecutable_jit\fP; - unsigned long int \fImatch_limit\fP; - unsigned long int \fImatch_limit_recursion\fP; - void *\fIcallout_data\fP; - const unsigned char *\fItables\fP; - unsigned char **\fImark\fP; -.sp -In the 16-bit version of this structure, the \fImark\fP field has type -"PCRE_UCHAR16 **". -.sp -In the 32-bit version of this structure, the \fImark\fP field has type -"PCRE_UCHAR32 **". -.P -The \fIflags\fP field is used to specify which of the other fields are set. The -flag bits are: -.sp - PCRE_EXTRA_CALLOUT_DATA - PCRE_EXTRA_EXECUTABLE_JIT - PCRE_EXTRA_MARK - PCRE_EXTRA_MATCH_LIMIT - PCRE_EXTRA_MATCH_LIMIT_RECURSION - PCRE_EXTRA_STUDY_DATA - PCRE_EXTRA_TABLES -.sp -Other flag bits should be set to zero. The \fIstudy_data\fP field and sometimes -the \fIexecutable_jit\fP field are set in the \fBpcre_extra\fP block that is -returned by \fBpcre_study()\fP, together with the appropriate flag bits. You -should not set these yourself, but you may add to the block by setting other -fields and their corresponding flag bits. -.P -The \fImatch_limit\fP field provides a means of preventing PCRE from using up a -vast amount of resources when running patterns that are not going to match, -but which have a very large number of possibilities in their search trees. The -classic example is a pattern that uses nested unlimited repeats. -.P -Internally, \fBpcre_exec()\fP uses a function called \fBmatch()\fP, which it -calls repeatedly (sometimes recursively). The limit set by \fImatch_limit\fP is -imposed on the number of times this function is called during a match, which -has the effect of limiting the amount of backtracking that can take place. For -patterns that are not anchored, the count restarts from zero for each position -in the subject string. -.P -When \fBpcre_exec()\fP is called with a pattern that was successfully studied -with a JIT option, the way that the matching is executed is entirely different. -However, there is still the possibility of runaway matching that goes on for a -very long time, and so the \fImatch_limit\fP value is also used in this case -(but in a different way) to limit how long the matching can continue. -.P -The default value for the limit can be set when PCRE is built; the default -default is 10 million, which handles all but the most extreme cases. You can -override the default by suppling \fBpcre_exec()\fP with a \fBpcre_extra\fP -block in which \fImatch_limit\fP is set, and PCRE_EXTRA_MATCH_LIMIT is set in -the \fIflags\fP field. If the limit is exceeded, \fBpcre_exec()\fP returns -PCRE_ERROR_MATCHLIMIT. -.P -A value for the match limit may also be supplied by an item at the start of a -pattern of the form -.sp - (*LIMIT_MATCH=d) -.sp -where d is a decimal number. However, such a setting is ignored unless d is -less than the limit set by the caller of \fBpcre_exec()\fP or, if no such limit -is set, less than the default. -.P -The \fImatch_limit_recursion\fP field is similar to \fImatch_limit\fP, but -instead of limiting the total number of times that \fBmatch()\fP is called, it -limits the depth of recursion. The recursion depth is a smaller number than the -total number of calls, because not all calls to \fBmatch()\fP are recursive. -This limit is of use only if it is set smaller than \fImatch_limit\fP. -.P -Limiting the recursion depth limits the amount of machine stack that can be -used, or, when PCRE has been compiled to use memory on the heap instead of the -stack, the amount of heap memory that can be used. This limit is not relevant, -and is ignored, when matching is done using JIT compiled code. -.P -The default value for \fImatch_limit_recursion\fP can be set when PCRE is -built; the default default is the same value as the default for -\fImatch_limit\fP. You can override the default by suppling \fBpcre_exec()\fP -with a \fBpcre_extra\fP block in which \fImatch_limit_recursion\fP is set, and -PCRE_EXTRA_MATCH_LIMIT_RECURSION is set in the \fIflags\fP field. If the limit -is exceeded, \fBpcre_exec()\fP returns PCRE_ERROR_RECURSIONLIMIT. -.P -A value for the recursion limit may also be supplied by an item at the start of -a pattern of the form -.sp - (*LIMIT_RECURSION=d) -.sp -where d is a decimal number. However, such a setting is ignored unless d is -less than the limit set by the caller of \fBpcre_exec()\fP or, if no such limit -is set, less than the default. -.P -The \fIcallout_data\fP field is used in conjunction with the "callout" feature, -and is described in the -.\" HREF -\fBpcrecallout\fP -.\" -documentation. -.P -The \fItables\fP field is provided for use with patterns that have been -pre-compiled using custom character tables, saved to disc or elsewhere, and -then reloaded, because the tables that were used to compile a pattern are not -saved with it. See the -.\" HREF -\fBpcreprecompile\fP -.\" -documentation for a discussion of saving compiled patterns for later use. If -NULL is passed using this mechanism, it forces PCRE's internal tables to be -used. -.P -\fBWarning:\fP The tables that \fBpcre_exec()\fP uses must be the same as those -that were used when the pattern was compiled. If this is not the case, the -behaviour of \fBpcre_exec()\fP is undefined. Therefore, when a pattern is -compiled and matched in the same process, this field should never be set. In -this (the most common) case, the correct table pointer is automatically passed -with the compiled pattern from \fBpcre_compile()\fP to \fBpcre_exec()\fP. -.P -If PCRE_EXTRA_MARK is set in the \fIflags\fP field, the \fImark\fP field must -be set to point to a suitable variable. If the pattern contains any -backtracking control verbs such as (*MARK:NAME), and the execution ends up with -a name to pass back, a pointer to the name string (zero terminated) is placed -in the variable pointed to by the \fImark\fP field. The names are within the -compiled pattern; if you wish to retain such a name you must copy it before -freeing the memory of a compiled pattern. If there is no name to pass back, the -variable pointed to by the \fImark\fP field is set to NULL. For details of the -backtracking control verbs, see the section entitled -.\" HTML -.\" -"Backtracking control" -.\" -in the -.\" HREF -\fBpcrepattern\fP -.\" -documentation. -. -. -.\" HTML -.SS "Option bits for \fBpcre_exec()\fP" -.rs -.sp -The unused bits of the \fIoptions\fP argument for \fBpcre_exec()\fP must be -zero. The only bits that may be set are PCRE_ANCHORED, PCRE_NEWLINE_\fIxxx\fP, -PCRE_NOTBOL, PCRE_NOTEOL, PCRE_NOTEMPTY, PCRE_NOTEMPTY_ATSTART, -PCRE_NO_START_OPTIMIZE, PCRE_NO_UTF8_CHECK, PCRE_PARTIAL_HARD, and -PCRE_PARTIAL_SOFT. -.P -If the pattern was successfully studied with one of the just-in-time (JIT) -compile options, the only supported options for JIT execution are -PCRE_NO_UTF8_CHECK, PCRE_NOTBOL, PCRE_NOTEOL, PCRE_NOTEMPTY, -PCRE_NOTEMPTY_ATSTART, PCRE_PARTIAL_HARD, and PCRE_PARTIAL_SOFT. If an -unsupported option is used, JIT execution is disabled and the normal -interpretive code in \fBpcre_exec()\fP is run. -.sp - PCRE_ANCHORED -.sp -The PCRE_ANCHORED option limits \fBpcre_exec()\fP to matching at the first -matching position. If a pattern was compiled with PCRE_ANCHORED, or turned out -to be anchored by virtue of its contents, it cannot be made unachored at -matching time. -.sp - PCRE_BSR_ANYCRLF - PCRE_BSR_UNICODE -.sp -These options (which are mutually exclusive) control what the \eR escape -sequence matches. The choice is either to match only CR, LF, or CRLF, or to -match any Unicode newline sequence. These options override the choice that was -made or defaulted when the pattern was compiled. -.sp - PCRE_NEWLINE_CR - PCRE_NEWLINE_LF - PCRE_NEWLINE_CRLF - PCRE_NEWLINE_ANYCRLF - PCRE_NEWLINE_ANY -.sp -These options override the newline definition that was chosen or defaulted when -the pattern was compiled. For details, see the description of -\fBpcre_compile()\fP above. During matching, the newline choice affects the -behaviour of the dot, circumflex, and dollar metacharacters. It may also alter -the way the match position is advanced after a match failure for an unanchored -pattern. -.P -When PCRE_NEWLINE_CRLF, PCRE_NEWLINE_ANYCRLF, or PCRE_NEWLINE_ANY is set, and a -match attempt for an unanchored pattern fails when the current position is at a -CRLF sequence, and the pattern contains no explicit matches for CR or LF -characters, the match position is advanced by two characters instead of one, in -other words, to after the CRLF. -.P -The above rule is a compromise that makes the most common cases work as -expected. For example, if the pattern is .+A (and the PCRE_DOTALL option is not -set), it does not match the string "\er\enA" because, after failing at the -start, it skips both the CR and the LF before retrying. However, the pattern -[\er\en]A does match that string, because it contains an explicit CR or LF -reference, and so advances only by one character after the first failure. -.P -An explicit match for CR of LF is either a literal appearance of one of those -characters, or one of the \er or \en escape sequences. Implicit matches such as -[^X] do not count, nor does \es (which includes CR and LF in the characters -that it matches). -.P -Notwithstanding the above, anomalous effects may still occur when CRLF is a -valid newline sequence and explicit \er or \en escapes appear in the pattern. -.sp - PCRE_NOTBOL -.sp -This option specifies that first character of the subject string is not the -beginning of a line, so the circumflex metacharacter should not match before -it. Setting this without PCRE_MULTILINE (at compile time) causes circumflex -never to match. This option affects only the behaviour of the circumflex -metacharacter. It does not affect \eA. -.sp - PCRE_NOTEOL -.sp -This option specifies that the end of the subject string is not the end of a -line, so the dollar metacharacter should not match it nor (except in multiline -mode) a newline immediately before it. Setting this without PCRE_MULTILINE (at -compile time) causes dollar never to match. This option affects only the -behaviour of the dollar metacharacter. It does not affect \eZ or \ez. -.sp - PCRE_NOTEMPTY -.sp -An empty string is not considered to be a valid match if this option is set. If -there are alternatives in the pattern, they are tried. If all the alternatives -match the empty string, the entire match fails. For example, if the pattern -.sp - a?b? -.sp -is applied to a string not beginning with "a" or "b", it matches an empty -string at the start of the subject. With PCRE_NOTEMPTY set, this match is not -valid, so PCRE searches further into the string for occurrences of "a" or "b". -.sp - PCRE_NOTEMPTY_ATSTART -.sp -This is like PCRE_NOTEMPTY, except that an empty string match that is not at -the start of the subject is permitted. If the pattern is anchored, such a match -can occur only if the pattern contains \eK. -.P -Perl has no direct equivalent of PCRE_NOTEMPTY or PCRE_NOTEMPTY_ATSTART, but it -does make a special case of a pattern match of the empty string within its -\fBsplit()\fP function, and when using the /g modifier. It is possible to -emulate Perl's behaviour after matching a null string by first trying the match -again at the same offset with PCRE_NOTEMPTY_ATSTART and PCRE_ANCHORED, and then -if that fails, by advancing the starting offset (see below) and trying an -ordinary match again. There is some code that demonstrates how to do this in -the -.\" HREF -\fBpcredemo\fP -.\" -sample program. In the most general case, you have to check to see if the -newline convention recognizes CRLF as a newline, and if so, and the current -character is CR followed by LF, advance the starting offset by two characters -instead of one. -.sp - PCRE_NO_START_OPTIMIZE -.sp -There are a number of optimizations that \fBpcre_exec()\fP uses at the start of -a match, in order to speed up the process. For example, if it is known that an -unanchored match must start with a specific character, it searches the subject -for that character, and fails immediately if it cannot find it, without -actually running the main matching function. This means that a special item -such as (*COMMIT) at the start of a pattern is not considered until after a -suitable starting point for the match has been found. Also, when callouts or -(*MARK) items are in use, these "start-up" optimizations can cause them to be -skipped if the pattern is never actually used. The start-up optimizations are -in effect a pre-scan of the subject that takes place before the pattern is run. -.P -The PCRE_NO_START_OPTIMIZE option disables the start-up optimizations, possibly -causing performance to suffer, but ensuring that in cases where the result is -"no match", the callouts do occur, and that items such as (*COMMIT) and (*MARK) -are considered at every possible starting position in the subject string. If -PCRE_NO_START_OPTIMIZE is set at compile time, it cannot be unset at matching -time. The use of PCRE_NO_START_OPTIMIZE at matching time (that is, passing it -to \fBpcre_exec()\fP) disables JIT execution; in this situation, matching is -always done using interpretively. -.P -Setting PCRE_NO_START_OPTIMIZE can change the outcome of a matching operation. -Consider the pattern -.sp - (*COMMIT)ABC -.sp -When this is compiled, PCRE records the fact that a match must start with the -character "A". Suppose the subject string is "DEFABC". The start-up -optimization scans along the subject, finds "A" and runs the first match -attempt from there. The (*COMMIT) item means that the pattern must match the -current starting position, which in this case, it does. However, if the same -match is run with PCRE_NO_START_OPTIMIZE set, the initial scan along the -subject string does not happen. The first match attempt is run starting from -"D" and when this fails, (*COMMIT) prevents any further matches being tried, so -the overall result is "no match". If the pattern is studied, more start-up -optimizations may be used. For example, a minimum length for the subject may be -recorded. Consider the pattern -.sp - (*MARK:A)(X|Y) -.sp -The minimum length for a match is one character. If the subject is "ABC", there -will be attempts to match "ABC", "BC", "C", and then finally an empty string. -If the pattern is studied, the final attempt does not take place, because PCRE -knows that the subject is too short, and so the (*MARK) is never encountered. -In this case, studying the pattern does not affect the overall match result, -which is still "no match", but it does affect the auxiliary information that is -returned. -.sp - PCRE_NO_UTF8_CHECK -.sp -When PCRE_UTF8 is set at compile time, the validity of the subject as a UTF-8 -string is automatically checked when \fBpcre_exec()\fP is subsequently called. -The entire string is checked before any other processing takes place. The value -of \fIstartoffset\fP is also checked to ensure that it points to the start of a -UTF-8 character. There is a discussion about the -.\" HTML -.\" -validity of UTF-8 strings -.\" -in the -.\" HREF -\fBpcreunicode\fP -.\" -page. If an invalid sequence of bytes is found, \fBpcre_exec()\fP returns the -error PCRE_ERROR_BADUTF8 or, if PCRE_PARTIAL_HARD is set and the problem is a -truncated character at the end of the subject, PCRE_ERROR_SHORTUTF8. In both -cases, information about the precise nature of the error may also be returned -(see the descriptions of these errors in the section entitled \fIError return -values from\fP \fBpcre_exec()\fP -.\" HTML -.\" -below). -.\" -If \fIstartoffset\fP contains a value that does not point to the start of a -UTF-8 character (or to the end of the subject), PCRE_ERROR_BADUTF8_OFFSET is -returned. -.P -If you already know that your subject is valid, and you want to skip these -checks for performance reasons, you can set the PCRE_NO_UTF8_CHECK option when -calling \fBpcre_exec()\fP. You might want to do this for the second and -subsequent calls to \fBpcre_exec()\fP if you are making repeated calls to find -all the matches in a single subject string. However, you should be sure that -the value of \fIstartoffset\fP points to the start of a character (or the end -of the subject). When PCRE_NO_UTF8_CHECK is set, the effect of passing an -invalid string as a subject or an invalid value of \fIstartoffset\fP is -undefined. Your program may crash or loop. -.sp - PCRE_PARTIAL_HARD - PCRE_PARTIAL_SOFT -.sp -These options turn on the partial matching feature. For backwards -compatibility, PCRE_PARTIAL is a synonym for PCRE_PARTIAL_SOFT. A partial match -occurs if the end of the subject string is reached successfully, but there are -not enough subject characters to complete the match. If this happens when -PCRE_PARTIAL_SOFT (but not PCRE_PARTIAL_HARD) is set, matching continues by -testing any remaining alternatives. Only if no complete match can be found is -PCRE_ERROR_PARTIAL returned instead of PCRE_ERROR_NOMATCH. In other words, -PCRE_PARTIAL_SOFT says that the caller is prepared to handle a partial match, -but only if no complete match can be found. -.P -If PCRE_PARTIAL_HARD is set, it overrides PCRE_PARTIAL_SOFT. In this case, if a -partial match is found, \fBpcre_exec()\fP immediately returns -PCRE_ERROR_PARTIAL, without considering any other alternatives. In other words, -when PCRE_PARTIAL_HARD is set, a partial match is considered to be more -important that an alternative complete match. -.P -In both cases, the portion of the string that was inspected when the partial -match was found is set as the first matching string. There is a more detailed -discussion of partial and multi-segment matching, with examples, in the -.\" HREF -\fBpcrepartial\fP -.\" -documentation. -. -. -.SS "The string to be matched by \fBpcre_exec()\fP" -.rs -.sp -The subject string is passed to \fBpcre_exec()\fP as a pointer in -\fIsubject\fP, a length in \fIlength\fP, and a starting offset in -\fIstartoffset\fP. The units for \fIlength\fP and \fIstartoffset\fP are bytes -for the 8-bit library, 16-bit data items for the 16-bit library, and 32-bit -data items for the 32-bit library. -.P -If \fIstartoffset\fP is negative or greater than the length of the subject, -\fBpcre_exec()\fP returns PCRE_ERROR_BADOFFSET. When the starting offset is -zero, the search for a match starts at the beginning of the subject, and this -is by far the most common case. In UTF-8 or UTF-16 mode, the offset must point -to the start of a character, or the end of the subject (in UTF-32 mode, one -data unit equals one character, so all offsets are valid). Unlike the pattern -string, the subject may contain binary zeroes. -.P -A non-zero starting offset is useful when searching for another match in the -same subject by calling \fBpcre_exec()\fP again after a previous success. -Setting \fIstartoffset\fP differs from just passing over a shortened string and -setting PCRE_NOTBOL in the case of a pattern that begins with any kind of -lookbehind. For example, consider the pattern -.sp - \eBiss\eB -.sp -which finds occurrences of "iss" in the middle of words. (\eB matches only if -the current position in the subject is not a word boundary.) When applied to -the string "Mississipi" the first call to \fBpcre_exec()\fP finds the first -occurrence. If \fBpcre_exec()\fP is called again with just the remainder of the -subject, namely "issipi", it does not match, because \eB is always false at the -start of the subject, which is deemed to be a word boundary. However, if -\fBpcre_exec()\fP is passed the entire string again, but with \fIstartoffset\fP -set to 4, it finds the second occurrence of "iss" because it is able to look -behind the starting point to discover that it is preceded by a letter. -.P -Finding all the matches in a subject is tricky when the pattern can match an -empty string. It is possible to emulate Perl's /g behaviour by first trying the -match again at the same offset, with the PCRE_NOTEMPTY_ATSTART and -PCRE_ANCHORED options, and then if that fails, advancing the starting offset -and trying an ordinary match again. There is some code that demonstrates how to -do this in the -.\" HREF -\fBpcredemo\fP -.\" -sample program. In the most general case, you have to check to see if the -newline convention recognizes CRLF as a newline, and if so, and the current -character is CR followed by LF, advance the starting offset by two characters -instead of one. -.P -If a non-zero starting offset is passed when the pattern is anchored, one -attempt to match at the given offset is made. This can only succeed if the -pattern does not require the match to be at the start of the subject. -. -. -.SS "How \fBpcre_exec()\fP returns captured substrings" -.rs -.sp -In general, a pattern matches a certain portion of the subject, and in -addition, further substrings from the subject may be picked out by parts of the -pattern. Following the usage in Jeffrey Friedl's book, this is called -"capturing" in what follows, and the phrase "capturing subpattern" is used for -a fragment of a pattern that picks out a substring. PCRE supports several other -kinds of parenthesized subpattern that do not cause substrings to be captured. -.P -Captured substrings are returned to the caller via a vector of integers whose -address is passed in \fIovector\fP. The number of elements in the vector is -passed in \fIovecsize\fP, which must be a non-negative number. \fBNote\fP: this -argument is NOT the size of \fIovector\fP in bytes. -.P -The first two-thirds of the vector is used to pass back captured substrings, -each substring using a pair of integers. The remaining third of the vector is -used as workspace by \fBpcre_exec()\fP while matching capturing subpatterns, -and is not available for passing back information. The number passed in -\fIovecsize\fP should always be a multiple of three. If it is not, it is -rounded down. -.P -When a match is successful, information about captured substrings is returned -in pairs of integers, starting at the beginning of \fIovector\fP, and -continuing up to two-thirds of its length at the most. The first element of -each pair is set to the offset of the first character in a substring, and the -second is set to the offset of the first character after the end of a -substring. These values are always data unit offsets, even in UTF mode. They -are byte offsets in the 8-bit library, 16-bit data item offsets in the 16-bit -library, and 32-bit data item offsets in the 32-bit library. \fBNote\fP: they -are not character counts. -.P -The first pair of integers, \fIovector[0]\fP and \fIovector[1]\fP, identify the -portion of the subject string matched by the entire pattern. The next pair is -used for the first capturing subpattern, and so on. The value returned by -\fBpcre_exec()\fP is one more than the highest numbered pair that has been set. -For example, if two substrings have been captured, the returned value is 3. If -there are no capturing subpatterns, the return value from a successful match is -1, indicating that just the first pair of offsets has been set. -.P -If a capturing subpattern is matched repeatedly, it is the last portion of the -string that it matched that is returned. -.P -If the vector is too small to hold all the captured substring offsets, it is -used as far as possible (up to two-thirds of its length), and the function -returns a value of zero. If neither the actual string matched nor any captured -substrings are of interest, \fBpcre_exec()\fP may be called with \fIovector\fP -passed as NULL and \fIovecsize\fP as zero. However, if the pattern contains -back references and the \fIovector\fP is not big enough to remember the related -substrings, PCRE has to get additional memory for use during matching. Thus it -is usually advisable to supply an \fIovector\fP of reasonable size. -.P -There are some cases where zero is returned (indicating vector overflow) when -in fact the vector is exactly the right size for the final match. For example, -consider the pattern -.sp - (a)(?:(b)c|bd) -.sp -If a vector of 6 elements (allowing for only 1 captured substring) is given -with subject string "abd", \fBpcre_exec()\fP will try to set the second -captured string, thereby recording a vector overflow, before failing to match -"c" and backing up to try the second alternative. The zero return, however, -does correctly indicate that the maximum number of slots (namely 2) have been -filled. In similar cases where there is temporary overflow, but the final -number of used slots is actually less than the maximum, a non-zero value is -returned. -.P -The \fBpcre_fullinfo()\fP function can be used to find out how many capturing -subpatterns there are in a compiled pattern. The smallest size for -\fIovector\fP that will allow for \fIn\fP captured substrings, in addition to -the offsets of the substring matched by the whole pattern, is (\fIn\fP+1)*3. -.P -It is possible for capturing subpattern number \fIn+1\fP to match some part of -the subject when subpattern \fIn\fP has not been used at all. For example, if -the string "abc" is matched against the pattern (a|(z))(bc) the return from the -function is 4, and subpatterns 1 and 3 are matched, but 2 is not. When this -happens, both values in the offset pairs corresponding to unused subpatterns -are set to -1. -.P -Offset values that correspond to unused subpatterns at the end of the -expression are also set to -1. For example, if the string "abc" is matched -against the pattern (abc)(x(yz)?)? subpatterns 2 and 3 are not matched. The -return from the function is 2, because the highest used capturing subpattern -number is 1, and the offsets for for the second and third capturing subpatterns -(assuming the vector is large enough, of course) are set to -1. -.P -\fBNote\fP: Elements in the first two-thirds of \fIovector\fP that do not -correspond to capturing parentheses in the pattern are never changed. That is, -if a pattern contains \fIn\fP capturing parentheses, no more than -\fIovector[0]\fP to \fIovector[2n+1]\fP are set by \fBpcre_exec()\fP. The other -elements (in the first two-thirds) retain whatever values they previously had. -.P -Some convenience functions are provided for extracting the captured substrings -as separate strings. These are described below. -. -. -.\" HTML -.SS "Error return values from \fBpcre_exec()\fP" -.rs -.sp -If \fBpcre_exec()\fP fails, it returns a negative number. The following are -defined in the header file: -.sp - PCRE_ERROR_NOMATCH (-1) -.sp -The subject string did not match the pattern. -.sp - PCRE_ERROR_NULL (-2) -.sp -Either \fIcode\fP or \fIsubject\fP was passed as NULL, or \fIovector\fP was -NULL and \fIovecsize\fP was not zero. -.sp - PCRE_ERROR_BADOPTION (-3) -.sp -An unrecognized bit was set in the \fIoptions\fP argument. -.sp - PCRE_ERROR_BADMAGIC (-4) -.sp -PCRE stores a 4-byte "magic number" at the start of the compiled code, to catch -the case when it is passed a junk pointer and to detect when a pattern that was -compiled in an environment of one endianness is run in an environment with the -other endianness. This is the error that PCRE gives when the magic number is -not present. -.sp - PCRE_ERROR_UNKNOWN_OPCODE (-5) -.sp -While running the pattern match, an unknown item was encountered in the -compiled pattern. This error could be caused by a bug in PCRE or by overwriting -of the compiled pattern. -.sp - PCRE_ERROR_NOMEMORY (-6) -.sp -If a pattern contains back references, but the \fIovector\fP that is passed to -\fBpcre_exec()\fP is not big enough to remember the referenced substrings, PCRE -gets a block of memory at the start of matching to use for this purpose. If the -call via \fBpcre_malloc()\fP fails, this error is given. The memory is -automatically freed at the end of matching. -.P -This error is also given if \fBpcre_stack_malloc()\fP fails in -\fBpcre_exec()\fP. This can happen only when PCRE has been compiled with -\fB--disable-stack-for-recursion\fP. -.sp - PCRE_ERROR_NOSUBSTRING (-7) -.sp -This error is used by the \fBpcre_copy_substring()\fP, -\fBpcre_get_substring()\fP, and \fBpcre_get_substring_list()\fP functions (see -below). It is never returned by \fBpcre_exec()\fP. -.sp - PCRE_ERROR_MATCHLIMIT (-8) -.sp -The backtracking limit, as specified by the \fImatch_limit\fP field in a -\fBpcre_extra\fP structure (or defaulted) was reached. See the description -above. -.sp - PCRE_ERROR_CALLOUT (-9) -.sp -This error is never generated by \fBpcre_exec()\fP itself. It is provided for -use by callout functions that want to yield a distinctive error code. See the -.\" HREF -\fBpcrecallout\fP -.\" -documentation for details. -.sp - PCRE_ERROR_BADUTF8 (-10) -.sp -A string that contains an invalid UTF-8 byte sequence was passed as a subject, -and the PCRE_NO_UTF8_CHECK option was not set. If the size of the output vector -(\fIovecsize\fP) is at least 2, the byte offset to the start of the the invalid -UTF-8 character is placed in the first element, and a reason code is placed in -the second element. The reason codes are listed in the -.\" HTML -.\" -following section. -.\" -For backward compatibility, if PCRE_PARTIAL_HARD is set and the problem is a -truncated UTF-8 character at the end of the subject (reason codes 1 to 5), -PCRE_ERROR_SHORTUTF8 is returned instead of PCRE_ERROR_BADUTF8. -.sp - PCRE_ERROR_BADUTF8_OFFSET (-11) -.sp -The UTF-8 byte sequence that was passed as a subject was checked and found to -be valid (the PCRE_NO_UTF8_CHECK option was not set), but the value of -\fIstartoffset\fP did not point to the beginning of a UTF-8 character or the -end of the subject. -.sp - PCRE_ERROR_PARTIAL (-12) -.sp -The subject string did not match, but it did match partially. See the -.\" HREF -\fBpcrepartial\fP -.\" -documentation for details of partial matching. -.sp - PCRE_ERROR_BADPARTIAL (-13) -.sp -This code is no longer in use. It was formerly returned when the PCRE_PARTIAL -option was used with a compiled pattern containing items that were not -supported for partial matching. From release 8.00 onwards, there are no -restrictions on partial matching. -.sp - PCRE_ERROR_INTERNAL (-14) -.sp -An unexpected internal error has occurred. This error could be caused by a bug -in PCRE or by overwriting of the compiled pattern. -.sp - PCRE_ERROR_BADCOUNT (-15) -.sp -This error is given if the value of the \fIovecsize\fP argument is negative. -.sp - PCRE_ERROR_RECURSIONLIMIT (-21) -.sp -The internal recursion limit, as specified by the \fImatch_limit_recursion\fP -field in a \fBpcre_extra\fP structure (or defaulted) was reached. See the -description above. -.sp - PCRE_ERROR_BADNEWLINE (-23) -.sp -An invalid combination of PCRE_NEWLINE_\fIxxx\fP options was given. -.sp - PCRE_ERROR_BADOFFSET (-24) -.sp -The value of \fIstartoffset\fP was negative or greater than the length of the -subject, that is, the value in \fIlength\fP. -.sp - PCRE_ERROR_SHORTUTF8 (-25) -.sp -This error is returned instead of PCRE_ERROR_BADUTF8 when the subject string -ends with a truncated UTF-8 character and the PCRE_PARTIAL_HARD option is set. -Information about the failure is returned as for PCRE_ERROR_BADUTF8. It is in -fact sufficient to detect this case, but this special error code for -PCRE_PARTIAL_HARD precedes the implementation of returned information; it is -retained for backwards compatibility. -.sp - PCRE_ERROR_RECURSELOOP (-26) -.sp -This error is returned when \fBpcre_exec()\fP detects a recursion loop within -the pattern. Specifically, it means that either the whole pattern or a -subpattern has been called recursively for the second time at the same position -in the subject string. Some simple patterns that might do this are detected and -faulted at compile time, but more complicated cases, in particular mutual -recursions between two different subpatterns, cannot be detected until run -time. -.sp - PCRE_ERROR_JIT_STACKLIMIT (-27) -.sp -This error is returned when a pattern that was successfully studied using a -JIT compile option is being matched, but the memory available for the -just-in-time processing stack is not large enough. See the -.\" HREF -\fBpcrejit\fP -.\" -documentation for more details. -.sp - PCRE_ERROR_BADMODE (-28) -.sp -This error is given if a pattern that was compiled by the 8-bit library is -passed to a 16-bit or 32-bit library function, or vice versa. -.sp - PCRE_ERROR_BADENDIANNESS (-29) -.sp -This error is given if a pattern that was compiled and saved is reloaded on a -host with different endianness. The utility function -\fBpcre_pattern_to_host_byte_order()\fP can be used to convert such a pattern -so that it runs on the new host. -.sp - PCRE_ERROR_JIT_BADOPTION -.sp -This error is returned when a pattern that was successfully studied using a JIT -compile option is being matched, but the matching mode (partial or complete -match) does not correspond to any JIT compilation mode. When the JIT fast path -function is used, this error may be also given for invalid options. See the -.\" HREF -\fBpcrejit\fP -.\" -documentation for more details. -.sp - PCRE_ERROR_BADLENGTH (-32) -.sp -This error is given if \fBpcre_exec()\fP is called with a negative value for -the \fIlength\fP argument. -.P -Error numbers -16 to -20, -22, and 30 are not used by \fBpcre_exec()\fP. -. -. -.\" HTML -.SS "Reason codes for invalid UTF-8 strings" -.rs -.sp -This section applies only to the 8-bit library. The corresponding information -for the 16-bit and 32-bit libraries is given in the -.\" HREF -\fBpcre16\fP -.\" -and -.\" HREF -\fBpcre32\fP -.\" -pages. -.P -When \fBpcre_exec()\fP returns either PCRE_ERROR_BADUTF8 or -PCRE_ERROR_SHORTUTF8, and the size of the output vector (\fIovecsize\fP) is at -least 2, the offset of the start of the invalid UTF-8 character is placed in -the first output vector element (\fIovector[0]\fP) and a reason code is placed -in the second element (\fIovector[1]\fP). The reason codes are given names in -the \fBpcre.h\fP header file: -.sp - PCRE_UTF8_ERR1 - PCRE_UTF8_ERR2 - PCRE_UTF8_ERR3 - PCRE_UTF8_ERR4 - PCRE_UTF8_ERR5 -.sp -The string ends with a truncated UTF-8 character; the code specifies how many -bytes are missing (1 to 5). Although RFC 3629 restricts UTF-8 characters to be -no longer than 4 bytes, the encoding scheme (originally defined by RFC 2279) -allows for up to 6 bytes, and this is checked first; hence the possibility of -4 or 5 missing bytes. -.sp - PCRE_UTF8_ERR6 - PCRE_UTF8_ERR7 - PCRE_UTF8_ERR8 - PCRE_UTF8_ERR9 - PCRE_UTF8_ERR10 -.sp -The two most significant bits of the 2nd, 3rd, 4th, 5th, or 6th byte of the -character do not have the binary value 0b10 (that is, either the most -significant bit is 0, or the next bit is 1). -.sp - PCRE_UTF8_ERR11 - PCRE_UTF8_ERR12 -.sp -A character that is valid by the RFC 2279 rules is either 5 or 6 bytes long; -these code points are excluded by RFC 3629. -.sp - PCRE_UTF8_ERR13 -.sp -A 4-byte character has a value greater than 0x10fff; these code points are -excluded by RFC 3629. -.sp - PCRE_UTF8_ERR14 -.sp -A 3-byte character has a value in the range 0xd800 to 0xdfff; this range of -code points are reserved by RFC 3629 for use with UTF-16, and so are excluded -from UTF-8. -.sp - PCRE_UTF8_ERR15 - PCRE_UTF8_ERR16 - PCRE_UTF8_ERR17 - PCRE_UTF8_ERR18 - PCRE_UTF8_ERR19 -.sp -A 2-, 3-, 4-, 5-, or 6-byte character is "overlong", that is, it codes for a -value that can be represented by fewer bytes, which is invalid. For example, -the two bytes 0xc0, 0xae give the value 0x2e, whose correct coding uses just -one byte. -.sp - PCRE_UTF8_ERR20 -.sp -The two most significant bits of the first byte of a character have the binary -value 0b10 (that is, the most significant bit is 1 and the second is 0). Such a -byte can only validly occur as the second or subsequent byte of a multi-byte -character. -.sp - PCRE_UTF8_ERR21 -.sp -The first byte of a character has the value 0xfe or 0xff. These values can -never occur in a valid UTF-8 string. -.sp - PCRE_UTF8_ERR22 -.sp -This error code was formerly used when the presence of a so-called -"non-character" caused an error. Unicode corrigendum #9 makes it clear that -such characters should not cause a string to be rejected, and so this code is -no longer in use and is never returned. -. -. -.SH "EXTRACTING CAPTURED SUBSTRINGS BY NUMBER" -.rs -.sp -.nf -.B int pcre_copy_substring(const char *\fIsubject\fP, int *\fIovector\fP, -.B " int \fIstringcount\fP, int \fIstringnumber\fP, char *\fIbuffer\fP," -.B " int \fIbuffersize\fP);" -.sp -.B int pcre_get_substring(const char *\fIsubject\fP, int *\fIovector\fP, -.B " int \fIstringcount\fP, int \fIstringnumber\fP," -.B " const char **\fIstringptr\fP);" -.sp -.B int pcre_get_substring_list(const char *\fIsubject\fP, -.B " int *\fIovector\fP, int \fIstringcount\fP, const char ***\fIlistptr\fP);" -.fi -.PP -Captured substrings can be accessed directly by using the offsets returned by -\fBpcre_exec()\fP in \fIovector\fP. For convenience, the functions -\fBpcre_copy_substring()\fP, \fBpcre_get_substring()\fP, and -\fBpcre_get_substring_list()\fP are provided for extracting captured substrings -as new, separate, zero-terminated strings. These functions identify substrings -by number. The next section describes functions for extracting named -substrings. -.P -A substring that contains a binary zero is correctly extracted and has a -further zero added on the end, but the result is not, of course, a C string. -However, you can process such a string by referring to the length that is -returned by \fBpcre_copy_substring()\fP and \fBpcre_get_substring()\fP. -Unfortunately, the interface to \fBpcre_get_substring_list()\fP is not adequate -for handling strings containing binary zeros, because the end of the final -string is not independently indicated. -.P -The first three arguments are the same for all three of these functions: -\fIsubject\fP is the subject string that has just been successfully matched, -\fIovector\fP is a pointer to the vector of integer offsets that was passed to -\fBpcre_exec()\fP, and \fIstringcount\fP is the number of substrings that were -captured by the match, including the substring that matched the entire regular -expression. This is the value returned by \fBpcre_exec()\fP if it is greater -than zero. If \fBpcre_exec()\fP returned zero, indicating that it ran out of -space in \fIovector\fP, the value passed as \fIstringcount\fP should be the -number of elements in the vector divided by three. -.P -The functions \fBpcre_copy_substring()\fP and \fBpcre_get_substring()\fP -extract a single substring, whose number is given as \fIstringnumber\fP. A -value of zero extracts the substring that matched the entire pattern, whereas -higher values extract the captured substrings. For \fBpcre_copy_substring()\fP, -the string is placed in \fIbuffer\fP, whose length is given by -\fIbuffersize\fP, while for \fBpcre_get_substring()\fP a new block of memory is -obtained via \fBpcre_malloc\fP, and its address is returned via -\fIstringptr\fP. The yield of the function is the length of the string, not -including the terminating zero, or one of these error codes: -.sp - PCRE_ERROR_NOMEMORY (-6) -.sp -The buffer was too small for \fBpcre_copy_substring()\fP, or the attempt to get -memory failed for \fBpcre_get_substring()\fP. -.sp - PCRE_ERROR_NOSUBSTRING (-7) -.sp -There is no substring whose number is \fIstringnumber\fP. -.P -The \fBpcre_get_substring_list()\fP function extracts all available substrings -and builds a list of pointers to them. All this is done in a single block of -memory that is obtained via \fBpcre_malloc\fP. The address of the memory block -is returned via \fIlistptr\fP, which is also the start of the list of string -pointers. The end of the list is marked by a NULL pointer. The yield of the -function is zero if all went well, or the error code -.sp - PCRE_ERROR_NOMEMORY (-6) -.sp -if the attempt to get the memory block failed. -.P -When any of these functions encounter a substring that is unset, which can -happen when capturing subpattern number \fIn+1\fP matches some part of the -subject, but subpattern \fIn\fP has not been used at all, they return an empty -string. This can be distinguished from a genuine zero-length substring by -inspecting the appropriate offset in \fIovector\fP, which is negative for unset -substrings. -.P -The two convenience functions \fBpcre_free_substring()\fP and -\fBpcre_free_substring_list()\fP can be used to free the memory returned by -a previous call of \fBpcre_get_substring()\fP or -\fBpcre_get_substring_list()\fP, respectively. They do nothing more than call -the function pointed to by \fBpcre_free\fP, which of course could be called -directly from a C program. However, PCRE is used in some situations where it is -linked via a special interface to another programming language that cannot use -\fBpcre_free\fP directly; it is for these cases that the functions are -provided. -. -. -.SH "EXTRACTING CAPTURED SUBSTRINGS BY NAME" -.rs -.sp -.nf -.B int pcre_get_stringnumber(const pcre *\fIcode\fP, -.B " const char *\fIname\fP);" -.sp -.B int pcre_copy_named_substring(const pcre *\fIcode\fP, -.B " const char *\fIsubject\fP, int *\fIovector\fP," -.B " int \fIstringcount\fP, const char *\fIstringname\fP," -.B " char *\fIbuffer\fP, int \fIbuffersize\fP);" -.sp -.B int pcre_get_named_substring(const pcre *\fIcode\fP, -.B " const char *\fIsubject\fP, int *\fIovector\fP," -.B " int \fIstringcount\fP, const char *\fIstringname\fP," -.B " const char **\fIstringptr\fP);" -.fi -.PP -To extract a substring by name, you first have to find associated number. -For example, for this pattern -.sp - (a+)b(?\ed+)... -.sp -the number of the subpattern called "xxx" is 2. If the name is known to be -unique (PCRE_DUPNAMES was not set), you can find the number from the name by -calling \fBpcre_get_stringnumber()\fP. The first argument is the compiled -pattern, and the second is the name. The yield of the function is the -subpattern number, or PCRE_ERROR_NOSUBSTRING (-7) if there is no subpattern of -that name. -.P -Given the number, you can extract the substring directly, or use one of the -functions described in the previous section. For convenience, there are also -two functions that do the whole job. -.P -Most of the arguments of \fBpcre_copy_named_substring()\fP and -\fBpcre_get_named_substring()\fP are the same as those for the similarly named -functions that extract by number. As these are described in the previous -section, they are not re-described here. There are just two differences: -.P -First, instead of a substring number, a substring name is given. Second, there -is an extra argument, given at the start, which is a pointer to the compiled -pattern. This is needed in order to gain access to the name-to-number -translation table. -.P -These functions call \fBpcre_get_stringnumber()\fP, and if it succeeds, they -then call \fBpcre_copy_substring()\fP or \fBpcre_get_substring()\fP, as -appropriate. \fBNOTE:\fP If PCRE_DUPNAMES is set and there are duplicate names, -the behaviour may not be what you want (see the next section). -.P -\fBWarning:\fP If the pattern uses the (?| feature to set up multiple -subpatterns with the same number, as described in the -.\" HTML -.\" -section on duplicate subpattern numbers -.\" -in the -.\" HREF -\fBpcrepattern\fP -.\" -page, you cannot use names to distinguish the different subpatterns, because -names are not included in the compiled code. The matching process uses only -numbers. For this reason, the use of different names for subpatterns of the -same number causes an error at compile time. -. -. -.SH "DUPLICATE SUBPATTERN NAMES" -.rs -.sp -.nf -.B int pcre_get_stringtable_entries(const pcre *\fIcode\fP, -.B " const char *\fIname\fP, char **\fIfirst\fP, char **\fIlast\fP);" -.fi -.PP -When a pattern is compiled with the PCRE_DUPNAMES option, names for subpatterns -are not required to be unique. (Duplicate names are always allowed for -subpatterns with the same number, created by using the (?| feature. Indeed, if -such subpatterns are named, they are required to use the same names.) -.P -Normally, patterns with duplicate names are such that in any one match, only -one of the named subpatterns participates. An example is shown in the -.\" HREF -\fBpcrepattern\fP -.\" -documentation. -.P -When duplicates are present, \fBpcre_copy_named_substring()\fP and -\fBpcre_get_named_substring()\fP return the first substring corresponding to -the given name that is set. If none are set, PCRE_ERROR_NOSUBSTRING (-7) is -returned; no data is returned. The \fBpcre_get_stringnumber()\fP function -returns one of the numbers that are associated with the name, but it is not -defined which it is. -.P -If you want to get full details of all captured substrings for a given name, -you must use the \fBpcre_get_stringtable_entries()\fP function. The first -argument is the compiled pattern, and the second is the name. The third and -fourth are pointers to variables which are updated by the function. After it -has run, they point to the first and last entries in the name-to-number table -for the given name. The function itself returns the length of each entry, or -PCRE_ERROR_NOSUBSTRING (-7) if there are none. The format of the table is -described above in the section entitled \fIInformation about a pattern\fP -.\" HTML -.\" -above. -.\" -Given all the relevant entries for the name, you can extract each of their -numbers, and hence the captured data, if any. -. -. -.SH "FINDING ALL POSSIBLE MATCHES" -.rs -.sp -The traditional matching function uses a similar algorithm to Perl, which stops -when it finds the first match, starting at a given point in the subject. If you -want to find all possible matches, or the longest possible match, consider -using the alternative matching function (see below) instead. If you cannot use -the alternative function, but still need to find all possible matches, you -can kludge it up by making use of the callout facility, which is described in -the -.\" HREF -\fBpcrecallout\fP -.\" -documentation. -.P -What you have to do is to insert a callout right at the end of the pattern. -When your callout function is called, extract and save the current matched -substring. Then return 1, which forces \fBpcre_exec()\fP to backtrack and try -other alternatives. Ultimately, when it runs out of matches, \fBpcre_exec()\fP -will yield PCRE_ERROR_NOMATCH. -. -. -.SH "OBTAINING AN ESTIMATE OF STACK USAGE" -.rs -.sp -Matching certain patterns using \fBpcre_exec()\fP can use a lot of process -stack, which in certain environments can be rather limited in size. Some users -find it helpful to have an estimate of the amount of stack that is used by -\fBpcre_exec()\fP, to help them set recursion limits, as described in the -.\" HREF -\fBpcrestack\fP -.\" -documentation. The estimate that is output by \fBpcretest\fP when called with -the \fB-m\fP and \fB-C\fP options is obtained by calling \fBpcre_exec\fP with -the values NULL, NULL, NULL, -999, and -999 for its first five arguments. -.P -Normally, if its first argument is NULL, \fBpcre_exec()\fP immediately returns -the negative error code PCRE_ERROR_NULL, but with this special combination of -arguments, it returns instead a negative number whose absolute value is the -approximate stack frame size in bytes. (A negative number is used so that it is -clear that no match has happened.) The value is approximate because in some -cases, recursive calls to \fBpcre_exec()\fP occur when there are one or two -additional variables on the stack. -.P -If PCRE has been compiled to use the heap instead of the stack for recursion, -the value returned is the size of each block that is obtained from the heap. -. -. -.\" HTML -.SH "MATCHING A PATTERN: THE ALTERNATIVE FUNCTION" -.rs -.sp -.nf -.B int pcre_dfa_exec(const pcre *\fIcode\fP, "const pcre_extra *\fIextra\fP," -.B " const char *\fIsubject\fP, int \fIlength\fP, int \fIstartoffset\fP," -.B " int \fIoptions\fP, int *\fIovector\fP, int \fIovecsize\fP," -.B " int *\fIworkspace\fP, int \fIwscount\fP);" -.fi -.P -The function \fBpcre_dfa_exec()\fP is called to match a subject string against -a compiled pattern, using a matching algorithm that scans the subject string -just once, and does not backtrack. This has different characteristics to the -normal algorithm, and is not compatible with Perl. Some of the features of PCRE -patterns are not supported. Nevertheless, there are times when this kind of -matching can be useful. For a discussion of the two matching algorithms, and a -list of features that \fBpcre_dfa_exec()\fP does not support, see the -.\" HREF -\fBpcrematching\fP -.\" -documentation. -.P -The arguments for the \fBpcre_dfa_exec()\fP function are the same as for -\fBpcre_exec()\fP, plus two extras. The \fIovector\fP argument is used in a -different way, and this is described below. The other common arguments are used -in the same way as for \fBpcre_exec()\fP, so their description is not repeated -here. -.P -The two additional arguments provide workspace for the function. The workspace -vector should contain at least 20 elements. It is used for keeping track of -multiple paths through the pattern tree. More workspace will be needed for -patterns and subjects where there are a lot of potential matches. -.P -Here is an example of a simple call to \fBpcre_dfa_exec()\fP: -.sp - int rc; - int ovector[10]; - int wspace[20]; - rc = pcre_dfa_exec( - re, /* result of pcre_compile() */ - NULL, /* we didn't study the pattern */ - "some string", /* the subject string */ - 11, /* the length of the subject string */ - 0, /* start at offset 0 in the subject */ - 0, /* default options */ - ovector, /* vector of integers for substring information */ - 10, /* number of elements (NOT size in bytes) */ - wspace, /* working space vector */ - 20); /* number of elements (NOT size in bytes) */ -. -.SS "Option bits for \fBpcre_dfa_exec()\fP" -.rs -.sp -The unused bits of the \fIoptions\fP argument for \fBpcre_dfa_exec()\fP must be -zero. The only bits that may be set are PCRE_ANCHORED, PCRE_NEWLINE_\fIxxx\fP, -PCRE_NOTBOL, PCRE_NOTEOL, PCRE_NOTEMPTY, PCRE_NOTEMPTY_ATSTART, -PCRE_NO_UTF8_CHECK, PCRE_BSR_ANYCRLF, PCRE_BSR_UNICODE, PCRE_NO_START_OPTIMIZE, -PCRE_PARTIAL_HARD, PCRE_PARTIAL_SOFT, PCRE_DFA_SHORTEST, and PCRE_DFA_RESTART. -All but the last four of these are exactly the same as for \fBpcre_exec()\fP, -so their description is not repeated here. -.sp - PCRE_PARTIAL_HARD - PCRE_PARTIAL_SOFT -.sp -These have the same general effect as they do for \fBpcre_exec()\fP, but the -details are slightly different. When PCRE_PARTIAL_HARD is set for -\fBpcre_dfa_exec()\fP, it returns PCRE_ERROR_PARTIAL if the end of the subject -is reached and there is still at least one matching possibility that requires -additional characters. This happens even if some complete matches have also -been found. When PCRE_PARTIAL_SOFT is set, the return code PCRE_ERROR_NOMATCH -is converted into PCRE_ERROR_PARTIAL if the end of the subject is reached, -there have been no complete matches, but there is still at least one matching -possibility. The portion of the string that was inspected when the longest -partial match was found is set as the first matching string in both cases. -There is a more detailed discussion of partial and multi-segment matching, with -examples, in the -.\" HREF -\fBpcrepartial\fP -.\" -documentation. -.sp - PCRE_DFA_SHORTEST -.sp -Setting the PCRE_DFA_SHORTEST option causes the matching algorithm to stop as -soon as it has found one match. Because of the way the alternative algorithm -works, this is necessarily the shortest possible match at the first possible -matching point in the subject string. -.sp - PCRE_DFA_RESTART -.sp -When \fBpcre_dfa_exec()\fP returns a partial match, it is possible to call it -again, with additional subject characters, and have it continue with the same -match. The PCRE_DFA_RESTART option requests this action; when it is set, the -\fIworkspace\fP and \fIwscount\fP options must reference the same vector as -before because data about the match so far is left in them after a partial -match. There is more discussion of this facility in the -.\" HREF -\fBpcrepartial\fP -.\" -documentation. -. -. -.SS "Successful returns from \fBpcre_dfa_exec()\fP" -.rs -.sp -When \fBpcre_dfa_exec()\fP succeeds, it may have matched more than one -substring in the subject. Note, however, that all the matches from one run of -the function start at the same point in the subject. The shorter matches are -all initial substrings of the longer matches. For example, if the pattern -.sp - <.*> -.sp -is matched against the string -.sp - This is no more -.sp -the three matched strings are -.sp - - - -.sp -On success, the yield of the function is a number greater than zero, which is -the number of matched substrings. The substrings themselves are returned in -\fIovector\fP. Each string uses two elements; the first is the offset to the -start, and the second is the offset to the end. In fact, all the strings have -the same start offset. (Space could have been saved by giving this only once, -but it was decided to retain some compatibility with the way \fBpcre_exec()\fP -returns data, even though the meaning of the strings is different.) -.P -The strings are returned in reverse order of length; that is, the longest -matching string is given first. If there were too many matches to fit into -\fIovector\fP, the yield of the function is zero, and the vector is filled with -the longest matches. Unlike \fBpcre_exec()\fP, \fBpcre_dfa_exec()\fP can use -the entire \fIovector\fP for returning matched strings. -.P -NOTE: PCRE's "auto-possessification" optimization usually applies to character -repeats at the end of a pattern (as well as internally). For example, the -pattern "a\ed+" is compiled as if it were "a\ed++" because there is no point -even considering the possibility of backtracking into the repeated digits. For -DFA matching, this means that only one possible match is found. If you really -do want multiple matches in such cases, either use an ungreedy repeat -("a\ed+?") or set the PCRE_NO_AUTO_POSSESS option when compiling. -. -. -.SS "Error returns from \fBpcre_dfa_exec()\fP" -.rs -.sp -The \fBpcre_dfa_exec()\fP function returns a negative number when it fails. -Many of the errors are the same as for \fBpcre_exec()\fP, and these are -described -.\" HTML -.\" -above. -.\" -There are in addition the following errors that are specific to -\fBpcre_dfa_exec()\fP: -.sp - PCRE_ERROR_DFA_UITEM (-16) -.sp -This return is given if \fBpcre_dfa_exec()\fP encounters an item in the pattern -that it does not support, for instance, the use of \eC or a back reference. -.sp - PCRE_ERROR_DFA_UCOND (-17) -.sp -This return is given if \fBpcre_dfa_exec()\fP encounters a condition item that -uses a back reference for the condition, or a test for recursion in a specific -group. These are not supported. -.sp - PCRE_ERROR_DFA_UMLIMIT (-18) -.sp -This return is given if \fBpcre_dfa_exec()\fP is called with an \fIextra\fP -block that contains a setting of the \fImatch_limit\fP or -\fImatch_limit_recursion\fP fields. This is not supported (these fields are -meaningless for DFA matching). -.sp - PCRE_ERROR_DFA_WSSIZE (-19) -.sp -This return is given if \fBpcre_dfa_exec()\fP runs out of space in the -\fIworkspace\fP vector. -.sp - PCRE_ERROR_DFA_RECURSE (-20) -.sp -When a recursive subpattern is processed, the matching function calls itself -recursively, using private vectors for \fIovector\fP and \fIworkspace\fP. This -error is given if the output vector is not large enough. This should be -extremely rare, as a vector of size 1000 is used. -.sp - PCRE_ERROR_DFA_BADRESTART (-30) -.sp -When \fBpcre_dfa_exec()\fP is called with the \fBPCRE_DFA_RESTART\fP option, -some plausibility checks are made on the contents of the workspace, which -should contain data about the previous partial match. If any of these checks -fail, this error is given. -. -. -.SH "SEE ALSO" -.rs -.sp -\fBpcre16\fP(3), \fBpcre32\fP(3), \fBpcrebuild\fP(3), \fBpcrecallout\fP(3), -\fBpcrecpp(3)\fP(3), \fBpcrematching\fP(3), \fBpcrepartial\fP(3), -\fBpcreposix\fP(3), \fBpcreprecompile\fP(3), \fBpcresample\fP(3), -\fBpcrestack\fP(3). -. -. -.SH AUTHOR -.rs -.sp -.nf -Philip Hazel -University Computing Service -Cambridge CB2 3QH, England. -.fi -. -. -.SH REVISION -.rs -.sp -.nf -Last updated: 18 December 2015 -Copyright (c) 1997-2015 University of Cambridge. -.fi diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcrebuild.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcrebuild.3 deleted file mode 100644 index 403f2ae3..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcrebuild.3 +++ /dev/null @@ -1,550 +0,0 @@ -.TH PCREBUILD 3 "12 May 2013" "PCRE 8.33" -.SH NAME -PCRE - Perl-compatible regular expressions -. -. -.SH "BUILDING PCRE" -.rs -.sp -PCRE is distributed with a \fBconfigure\fP script that can be used to build the -library in Unix-like environments using the applications known as Autotools. -Also in the distribution are files to support building using \fBCMake\fP -instead of \fBconfigure\fP. The text file -.\" HTML -.\" -\fBREADME\fP -.\" -contains general information about building with Autotools (some of which is -repeated below), and also has some comments about building on various operating -systems. There is a lot more information about building PCRE without using -Autotools (including information about using \fBCMake\fP and building "by -hand") in the text file called -.\" HTML -.\" -\fBNON-AUTOTOOLS-BUILD\fP. -.\" -You should consult this file as well as the -.\" HTML -.\" -\fBREADME\fP -.\" -file if you are building in a non-Unix-like environment. -. -. -.SH "PCRE BUILD-TIME OPTIONS" -.rs -.sp -The rest of this document describes the optional features of PCRE that can be -selected when the library is compiled. It assumes use of the \fBconfigure\fP -script, where the optional features are selected or deselected by providing -options to \fBconfigure\fP before running the \fBmake\fP command. However, the -same options can be selected in both Unix-like and non-Unix-like environments -using the GUI facility of \fBcmake-gui\fP if you are using \fBCMake\fP instead -of \fBconfigure\fP to build PCRE. -.P -If you are not using Autotools or \fBCMake\fP, option selection can be done by -editing the \fBconfig.h\fP file, or by passing parameter settings to the -compiler, as described in -.\" HTML -.\" -\fBNON-AUTOTOOLS-BUILD\fP. -.\" -.P -The complete list of options for \fBconfigure\fP (which includes the standard -ones such as the selection of the installation directory) can be obtained by -running -.sp - ./configure --help -.sp -The following sections include descriptions of options whose names begin with ---enable or --disable. These settings specify changes to the defaults for the -\fBconfigure\fP command. Because of the way that \fBconfigure\fP works, ---enable and --disable always come in pairs, so the complementary option always -exists as well, but as it specifies the default, it is not described. -. -. -.SH "BUILDING 8-BIT, 16-BIT AND 32-BIT LIBRARIES" -.rs -.sp -By default, a library called \fBlibpcre\fP is built, containing functions that -take string arguments contained in vectors of bytes, either as single-byte -characters, or interpreted as UTF-8 strings. You can also build a separate -library, called \fBlibpcre16\fP, in which strings are contained in vectors of -16-bit data units and interpreted either as single-unit characters or UTF-16 -strings, by adding -.sp - --enable-pcre16 -.sp -to the \fBconfigure\fP command. You can also build yet another separate -library, called \fBlibpcre32\fP, in which strings are contained in vectors of -32-bit data units and interpreted either as single-unit characters or UTF-32 -strings, by adding -.sp - --enable-pcre32 -.sp -to the \fBconfigure\fP command. If you do not want the 8-bit library, add -.sp - --disable-pcre8 -.sp -as well. At least one of the three libraries must be built. Note that the C++ -and POSIX wrappers are for the 8-bit library only, and that \fBpcregrep\fP is -an 8-bit program. None of these are built if you select only the 16-bit or -32-bit libraries. -. -. -.SH "BUILDING SHARED AND STATIC LIBRARIES" -.rs -.sp -The Autotools PCRE building process uses \fBlibtool\fP to build both shared and -static libraries by default. You can suppress one of these by adding one of -.sp - --disable-shared - --disable-static -.sp -to the \fBconfigure\fP command, as required. -. -. -.SH "C++ SUPPORT" -.rs -.sp -By default, if the 8-bit library is being built, the \fBconfigure\fP script -will search for a C++ compiler and C++ header files. If it finds them, it -automatically builds the C++ wrapper library (which supports only 8-bit -strings). You can disable this by adding -.sp - --disable-cpp -.sp -to the \fBconfigure\fP command. -. -. -.SH "UTF-8, UTF-16 AND UTF-32 SUPPORT" -.rs -.sp -To build PCRE with support for UTF Unicode character strings, add -.sp - --enable-utf -.sp -to the \fBconfigure\fP command. This setting applies to all three libraries, -adding support for UTF-8 to the 8-bit library, support for UTF-16 to the 16-bit -library, and support for UTF-32 to the to the 32-bit library. There are no -separate options for enabling UTF-8, UTF-16 and UTF-32 independently because -that would allow ridiculous settings such as requesting UTF-16 support while -building only the 8-bit library. It is not possible to build one library with -UTF support and another without in the same configuration. (For backwards -compatibility, --enable-utf8 is a synonym of --enable-utf.) -.P -Of itself, this setting does not make PCRE treat strings as UTF-8, UTF-16 or -UTF-32. As well as compiling PCRE with this option, you also have have to set -the PCRE_UTF8, PCRE_UTF16 or PCRE_UTF32 option (as appropriate) when you call -one of the pattern compiling functions. -.P -If you set --enable-utf when compiling in an EBCDIC environment, PCRE expects -its input to be either ASCII or UTF-8 (depending on the run-time option). It is -not possible to support both EBCDIC and UTF-8 codes in the same version of the -library. Consequently, --enable-utf and --enable-ebcdic are mutually -exclusive. -. -. -.SH "UNICODE CHARACTER PROPERTY SUPPORT" -.rs -.sp -UTF support allows the libraries to process character codepoints up to 0x10ffff -in the strings that they handle. On its own, however, it does not provide any -facilities for accessing the properties of such characters. If you want to be -able to use the pattern escapes \eP, \ep, and \eX, which refer to Unicode -character properties, you must add -.sp - --enable-unicode-properties -.sp -to the \fBconfigure\fP command. This implies UTF support, even if you have -not explicitly requested it. -.P -Including Unicode property support adds around 30K of tables to the PCRE -library. Only the general category properties such as \fILu\fP and \fINd\fP are -supported. Details are given in the -.\" HREF -\fBpcrepattern\fP -.\" -documentation. -. -. -.SH "JUST-IN-TIME COMPILER SUPPORT" -.rs -.sp -Just-in-time compiler support is included in the build by specifying -.sp - --enable-jit -.sp -This support is available only for certain hardware architectures. If this -option is set for an unsupported architecture, a compile time error occurs. -See the -.\" HREF -\fBpcrejit\fP -.\" -documentation for a discussion of JIT usage. When JIT support is enabled, -pcregrep automatically makes use of it, unless you add -.sp - --disable-pcregrep-jit -.sp -to the "configure" command. -. -. -.SH "CODE VALUE OF NEWLINE" -.rs -.sp -By default, PCRE interprets the linefeed (LF) character as indicating the end -of a line. This is the normal newline character on Unix-like systems. You can -compile PCRE to use carriage return (CR) instead, by adding -.sp - --enable-newline-is-cr -.sp -to the \fBconfigure\fP command. There is also a --enable-newline-is-lf option, -which explicitly specifies linefeed as the newline character. -.sp -Alternatively, you can specify that line endings are to be indicated by the two -character sequence CRLF. If you want this, add -.sp - --enable-newline-is-crlf -.sp -to the \fBconfigure\fP command. There is a fourth option, specified by -.sp - --enable-newline-is-anycrlf -.sp -which causes PCRE to recognize any of the three sequences CR, LF, or CRLF as -indicating a line ending. Finally, a fifth option, specified by -.sp - --enable-newline-is-any -.sp -causes PCRE to recognize any Unicode newline sequence. -.P -Whatever line ending convention is selected when PCRE is built can be -overridden when the library functions are called. At build time it is -conventional to use the standard for your operating system. -. -. -.SH "WHAT \eR MATCHES" -.rs -.sp -By default, the sequence \eR in a pattern matches any Unicode newline sequence, -whatever has been selected as the line ending sequence. If you specify -.sp - --enable-bsr-anycrlf -.sp -the default is changed so that \eR matches only CR, LF, or CRLF. Whatever is -selected when PCRE is built can be overridden when the library functions are -called. -. -. -.SH "POSIX MALLOC USAGE" -.rs -.sp -When the 8-bit library is called through the POSIX interface (see the -.\" HREF -\fBpcreposix\fP -.\" -documentation), additional working storage is required for holding the pointers -to capturing substrings, because PCRE requires three integers per substring, -whereas the POSIX interface provides only two. If the number of expected -substrings is small, the wrapper function uses space on the stack, because this -is faster than using \fBmalloc()\fP for each call. The default threshold above -which the stack is no longer used is 10; it can be changed by adding a setting -such as -.sp - --with-posix-malloc-threshold=20 -.sp -to the \fBconfigure\fP command. -. -. -.SH "HANDLING VERY LARGE PATTERNS" -.rs -.sp -Within a compiled pattern, offset values are used to point from one part to -another (for example, from an opening parenthesis to an alternation -metacharacter). By default, in the 8-bit and 16-bit libraries, two-byte values -are used for these offsets, leading to a maximum size for a compiled pattern of -around 64K. This is sufficient to handle all but the most gigantic patterns. -Nevertheless, some people do want to process truly enormous patterns, so it is -possible to compile PCRE to use three-byte or four-byte offsets by adding a -setting such as -.sp - --with-link-size=3 -.sp -to the \fBconfigure\fP command. The value given must be 2, 3, or 4. For the -16-bit library, a value of 3 is rounded up to 4. In these libraries, using -longer offsets slows down the operation of PCRE because it has to load -additional data when handling them. For the 32-bit library the value is always -4 and cannot be overridden; the value of --with-link-size is ignored. -. -. -.SH "AVOIDING EXCESSIVE STACK USAGE" -.rs -.sp -When matching with the \fBpcre_exec()\fP function, PCRE implements backtracking -by making recursive calls to an internal function called \fBmatch()\fP. In -environments where the size of the stack is limited, this can severely limit -PCRE's operation. (The Unix environment does not usually suffer from this -problem, but it may sometimes be necessary to increase the maximum stack size. -There is a discussion in the -.\" HREF -\fBpcrestack\fP -.\" -documentation.) An alternative approach to recursion that uses memory from the -heap to remember data, instead of using recursive function calls, has been -implemented to work round the problem of limited stack size. If you want to -build a version of PCRE that works this way, add -.sp - --disable-stack-for-recursion -.sp -to the \fBconfigure\fP command. With this configuration, PCRE will use the -\fBpcre_stack_malloc\fP and \fBpcre_stack_free\fP variables to call memory -management functions. By default these point to \fBmalloc()\fP and -\fBfree()\fP, but you can replace the pointers so that your own functions are -used instead. -.P -Separate functions are provided rather than using \fBpcre_malloc\fP and -\fBpcre_free\fP because the usage is very predictable: the block sizes -requested are always the same, and the blocks are always freed in reverse -order. A calling program might be able to implement optimized functions that -perform better than \fBmalloc()\fP and \fBfree()\fP. PCRE runs noticeably more -slowly when built in this way. This option affects only the \fBpcre_exec()\fP -function; it is not relevant for \fBpcre_dfa_exec()\fP. -. -. -.SH "LIMITING PCRE RESOURCE USAGE" -.rs -.sp -Internally, PCRE has a function called \fBmatch()\fP, which it calls repeatedly -(sometimes recursively) when matching a pattern with the \fBpcre_exec()\fP -function. By controlling the maximum number of times this function may be -called during a single matching operation, a limit can be placed on the -resources used by a single call to \fBpcre_exec()\fP. The limit can be changed -at run time, as described in the -.\" HREF -\fBpcreapi\fP -.\" -documentation. The default is 10 million, but this can be changed by adding a -setting such as -.sp - --with-match-limit=500000 -.sp -to the \fBconfigure\fP command. This setting has no effect on the -\fBpcre_dfa_exec()\fP matching function. -.P -In some environments it is desirable to limit the depth of recursive calls of -\fBmatch()\fP more strictly than the total number of calls, in order to -restrict the maximum amount of stack (or heap, if --disable-stack-for-recursion -is specified) that is used. A second limit controls this; it defaults to the -value that is set for --with-match-limit, which imposes no additional -constraints. However, you can set a lower limit by adding, for example, -.sp - --with-match-limit-recursion=10000 -.sp -to the \fBconfigure\fP command. This value can also be overridden at run time. -. -. -.SH "CREATING CHARACTER TABLES AT BUILD TIME" -.rs -.sp -PCRE uses fixed tables for processing characters whose code values are less -than 256. By default, PCRE is built with a set of tables that are distributed -in the file \fIpcre_chartables.c.dist\fP. These tables are for ASCII codes -only. If you add -.sp - --enable-rebuild-chartables -.sp -to the \fBconfigure\fP command, the distributed tables are no longer used. -Instead, a program called \fBdftables\fP is compiled and run. This outputs the -source for new set of tables, created in the default locale of your C run-time -system. (This method of replacing the tables does not work if you are cross -compiling, because \fBdftables\fP is run on the local host. If you need to -create alternative tables when cross compiling, you will have to do so "by -hand".) -. -. -.SH "USING EBCDIC CODE" -.rs -.sp -PCRE assumes by default that it will run in an environment where the character -code is ASCII (or Unicode, which is a superset of ASCII). This is the case for -most computer operating systems. PCRE can, however, be compiled to run in an -EBCDIC environment by adding -.sp - --enable-ebcdic -.sp -to the \fBconfigure\fP command. This setting implies ---enable-rebuild-chartables. You should only use it if you know that you are in -an EBCDIC environment (for example, an IBM mainframe operating system). The ---enable-ebcdic option is incompatible with --enable-utf. -.P -The EBCDIC character that corresponds to an ASCII LF is assumed to have the -value 0x15 by default. However, in some EBCDIC environments, 0x25 is used. In -such an environment you should use -.sp - --enable-ebcdic-nl25 -.sp -as well as, or instead of, --enable-ebcdic. The EBCDIC character for CR has the -same value as in ASCII, namely, 0x0d. Whichever of 0x15 and 0x25 is \fInot\fP -chosen as LF is made to correspond to the Unicode NEL character (which, in -Unicode, is 0x85). -.P -The options that select newline behaviour, such as --enable-newline-is-cr, -and equivalent run-time options, refer to these character values in an EBCDIC -environment. -. -. -.SH "PCREGREP OPTIONS FOR COMPRESSED FILE SUPPORT" -.rs -.sp -By default, \fBpcregrep\fP reads all files as plain text. You can build it so -that it recognizes files whose names end in \fB.gz\fP or \fB.bz2\fP, and reads -them with \fBlibz\fP or \fBlibbz2\fP, respectively, by adding one or both of -.sp - --enable-pcregrep-libz - --enable-pcregrep-libbz2 -.sp -to the \fBconfigure\fP command. These options naturally require that the -relevant libraries are installed on your system. Configuration will fail if -they are not. -. -. -.SH "PCREGREP BUFFER SIZE" -.rs -.sp -\fBpcregrep\fP uses an internal buffer to hold a "window" on the file it is -scanning, in order to be able to output "before" and "after" lines when it -finds a match. The size of the buffer is controlled by a parameter whose -default value is 20K. The buffer itself is three times this size, but because -of the way it is used for holding "before" lines, the longest line that is -guaranteed to be processable is the parameter size. You can change the default -parameter value by adding, for example, -.sp - --with-pcregrep-bufsize=50K -.sp -to the \fBconfigure\fP command. The caller of \fPpcregrep\fP can, however, -override this value by specifying a run-time option. -. -. -.SH "PCRETEST OPTION FOR LIBREADLINE SUPPORT" -.rs -.sp -If you add -.sp - --enable-pcretest-libreadline -.sp -to the \fBconfigure\fP command, \fBpcretest\fP is linked with the -\fBlibreadline\fP library, and when its input is from a terminal, it reads it -using the \fBreadline()\fP function. This provides line-editing and history -facilities. Note that \fBlibreadline\fP is GPL-licensed, so if you distribute a -binary of \fBpcretest\fP linked in this way, there may be licensing issues. -.P -Setting this option causes the \fB-lreadline\fP option to be added to the -\fBpcretest\fP build. In many operating environments with a sytem-installed -\fBlibreadline\fP this is sufficient. However, in some environments (e.g. -if an unmodified distribution version of readline is in use), some extra -configuration may be necessary. The INSTALL file for \fBlibreadline\fP says -this: -.sp - "Readline uses the termcap functions, but does not link with the - termcap or curses library itself, allowing applications which link - with readline the to choose an appropriate library." -.sp -If your environment has not been set up so that an appropriate library is -automatically included, you may need to add something like -.sp - LIBS="-ncurses" -.sp -immediately before the \fBconfigure\fP command. -. -. -.SH "DEBUGGING WITH VALGRIND SUPPORT" -.rs -.sp -By adding the -.sp - --enable-valgrind -.sp -option to to the \fBconfigure\fP command, PCRE will use valgrind annotations -to mark certain memory regions as unaddressable. This allows it to detect -invalid memory accesses, and is mostly useful for debugging PCRE itself. -. -. -.SH "CODE COVERAGE REPORTING" -.rs -.sp -If your C compiler is gcc, you can build a version of PCRE that can generate a -code coverage report for its test suite. To enable this, you must install -\fBlcov\fP version 1.6 or above. Then specify -.sp - --enable-coverage -.sp -to the \fBconfigure\fP command and build PCRE in the usual way. -.P -Note that using \fBccache\fP (a caching C compiler) is incompatible with code -coverage reporting. If you have configured \fBccache\fP to run automatically -on your system, you must set the environment variable -.sp - CCACHE_DISABLE=1 -.sp -before running \fBmake\fP to build PCRE, so that \fBccache\fP is not used. -.P -When --enable-coverage is used, the following addition targets are added to the -\fIMakefile\fP: -.sp - make coverage -.sp -This creates a fresh coverage report for the PCRE test suite. It is equivalent -to running "make coverage-reset", "make coverage-baseline", "make check", and -then "make coverage-report". -.sp - make coverage-reset -.sp -This zeroes the coverage counters, but does nothing else. -.sp - make coverage-baseline -.sp -This captures baseline coverage information. -.sp - make coverage-report -.sp -This creates the coverage report. -.sp - make coverage-clean-report -.sp -This removes the generated coverage report without cleaning the coverage data -itself. -.sp - make coverage-clean-data -.sp -This removes the captured coverage data without removing the coverage files -created at compile time (*.gcno). -.sp - make coverage-clean -.sp -This cleans all coverage data including the generated coverage report. For more -information about code coverage, see the \fBgcov\fP and \fBlcov\fP -documentation. -. -. -.SH "SEE ALSO" -.rs -.sp -\fBpcreapi\fP(3), \fBpcre16\fP, \fBpcre32\fP, \fBpcre_config\fP(3). -. -. -.SH AUTHOR -.rs -.sp -.nf -Philip Hazel -University Computing Service -Cambridge CB2 3QH, England. -.fi -. -. -.SH REVISION -.rs -.sp -.nf -Last updated: 12 May 2013 -Copyright (c) 1997-2013 University of Cambridge. -.fi diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcrecallout.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcrecallout.3 deleted file mode 100644 index 8ebc9959..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcrecallout.3 +++ /dev/null @@ -1,255 +0,0 @@ -.TH PCRECALLOUT 3 "12 November 2013" "PCRE 8.34" -.SH NAME -PCRE - Perl-compatible regular expressions -.SH SYNOPSIS -.rs -.sp -.B #include -.PP -.SM -.B int (*pcre_callout)(pcre_callout_block *); -.PP -.B int (*pcre16_callout)(pcre16_callout_block *); -.PP -.B int (*pcre32_callout)(pcre32_callout_block *); -. -.SH DESCRIPTION -.rs -.sp -PCRE provides a feature called "callout", which is a means of temporarily -passing control to the caller of PCRE in the middle of pattern matching. The -caller of PCRE provides an external function by putting its entry point in the -global variable \fIpcre_callout\fP (\fIpcre16_callout\fP for the 16-bit -library, \fIpcre32_callout\fP for the 32-bit library). By default, this -variable contains NULL, which disables all calling out. -.P -Within a regular expression, (?C) indicates the points at which the external -function is to be called. Different callout points can be identified by putting -a number less than 256 after the letter C. The default value is zero. -For example, this pattern has two callout points: -.sp - (?C1)abc(?C2)def -.sp -If the PCRE_AUTO_CALLOUT option bit is set when a pattern is compiled, PCRE -automatically inserts callouts, all with number 255, before each item in the -pattern. For example, if PCRE_AUTO_CALLOUT is used with the pattern -.sp - A(\ed{2}|--) -.sp -it is processed as if it were -.sp -(?C255)A(?C255)((?C255)\ed{2}(?C255)|(?C255)-(?C255)-(?C255))(?C255) -.sp -Notice that there is a callout before and after each parenthesis and -alternation bar. If the pattern contains a conditional group whose condition is -an assertion, an automatic callout is inserted immediately before the -condition. Such a callout may also be inserted explicitly, for example: -.sp - (?(?C9)(?=a)ab|de) -.sp -This applies only to assertion conditions (because they are themselves -independent groups). -.P -Automatic callouts can be used for tracking the progress of pattern matching. -The -.\" HREF -\fBpcretest\fP -.\" -program has a pattern qualifier (/C) that sets automatic callouts; when it is -used, the output indicates how the pattern is being matched. This is useful -information when you are trying to optimize the performance of a particular -pattern. -. -. -.SH "MISSING CALLOUTS" -.rs -.sp -You should be aware that, because of optimizations in the way PCRE compiles and -matches patterns, callouts sometimes do not happen exactly as you might expect. -.P -At compile time, PCRE "auto-possessifies" repeated items when it knows that -what follows cannot be part of the repeat. For example, a+[bc] is compiled as -if it were a++[bc]. The \fBpcretest\fP output when this pattern is anchored and -then applied with automatic callouts to the string "aaaa" is: -.sp - --->aaaa - +0 ^ ^ - +1 ^ a+ - +3 ^ ^ [bc] - No match -.sp -This indicates that when matching [bc] fails, there is no backtracking into a+ -and therefore the callouts that would be taken for the backtracks do not occur. -You can disable the auto-possessify feature by passing PCRE_NO_AUTO_POSSESS -to \fBpcre_compile()\fP, or starting the pattern with (*NO_AUTO_POSSESS). If -this is done in \fBpcretest\fP (using the /O qualifier), the output changes to -this: -.sp - --->aaaa - +0 ^ ^ - +1 ^ a+ - +3 ^ ^ [bc] - +3 ^ ^ [bc] - +3 ^ ^ [bc] - +3 ^^ [bc] - No match -.sp -This time, when matching [bc] fails, the matcher backtracks into a+ and tries -again, repeatedly, until a+ itself fails. -.P -Other optimizations that provide fast "no match" results also affect callouts. -For example, if the pattern is -.sp - ab(?C4)cd -.sp -PCRE knows that any matching string must contain the letter "d". If the subject -string is "abyz", the lack of "d" means that matching doesn't ever start, and -the callout is never reached. However, with "abyd", though the result is still -no match, the callout is obeyed. -.P -If the pattern is studied, PCRE knows the minimum length of a matching string, -and will immediately give a "no match" return without actually running a match -if the subject is not long enough, or, for unanchored patterns, if it has -been scanned far enough. -.P -You can disable these optimizations by passing the PCRE_NO_START_OPTIMIZE -option to the matching function, or by starting the pattern with -(*NO_START_OPT). This slows down the matching process, but does ensure that -callouts such as the example above are obeyed. -. -. -.SH "THE CALLOUT INTERFACE" -.rs -.sp -During matching, when PCRE reaches a callout point, the external function -defined by \fIpcre_callout\fP or \fIpcre[16|32]_callout\fP is called (if it is -set). This applies to both normal and DFA matching. The only argument to the -callout function is a pointer to a \fBpcre_callout\fP or -\fBpcre[16|32]_callout\fP block. These structures contains the following -fields: -.sp - int \fIversion\fP; - int \fIcallout_number\fP; - int *\fIoffset_vector\fP; - const char *\fIsubject\fP; (8-bit version) - PCRE_SPTR16 \fIsubject\fP; (16-bit version) - PCRE_SPTR32 \fIsubject\fP; (32-bit version) - int \fIsubject_length\fP; - int \fIstart_match\fP; - int \fIcurrent_position\fP; - int \fIcapture_top\fP; - int \fIcapture_last\fP; - void *\fIcallout_data\fP; - int \fIpattern_position\fP; - int \fInext_item_length\fP; - const unsigned char *\fImark\fP; (8-bit version) - const PCRE_UCHAR16 *\fImark\fP; (16-bit version) - const PCRE_UCHAR32 *\fImark\fP; (32-bit version) -.sp -The \fIversion\fP field is an integer containing the version number of the -block format. The initial version was 0; the current version is 2. The version -number will change again in future if additional fields are added, but the -intention is never to remove any of the existing fields. -.P -The \fIcallout_number\fP field contains the number of the callout, as compiled -into the pattern (that is, the number after ?C for manual callouts, and 255 for -automatically generated callouts). -.P -The \fIoffset_vector\fP field is a pointer to the vector of offsets that was -passed by the caller to the matching function. When \fBpcre_exec()\fP or -\fBpcre[16|32]_exec()\fP is used, the contents can be inspected, in order to -extract substrings that have been matched so far, in the same way as for -extracting substrings after a match has completed. For the DFA matching -functions, this field is not useful. -.P -The \fIsubject\fP and \fIsubject_length\fP fields contain copies of the values -that were passed to the matching function. -.P -The \fIstart_match\fP field normally contains the offset within the subject at -which the current match attempt started. However, if the escape sequence \eK -has been encountered, this value is changed to reflect the modified starting -point. If the pattern is not anchored, the callout function may be called -several times from the same point in the pattern for different starting points -in the subject. -.P -The \fIcurrent_position\fP field contains the offset within the subject of the -current match pointer. -.P -When the \fBpcre_exec()\fP or \fBpcre[16|32]_exec()\fP is used, the -\fIcapture_top\fP field contains one more than the number of the highest -numbered captured substring so far. If no substrings have been captured, the -value of \fIcapture_top\fP is one. This is always the case when the DFA -functions are used, because they do not support captured substrings. -.P -The \fIcapture_last\fP field contains the number of the most recently captured -substring. However, when a recursion exits, the value reverts to what it was -outside the recursion, as do the values of all captured substrings. If no -substrings have been captured, the value of \fIcapture_last\fP is -1. This is -always the case for the DFA matching functions. -.P -The \fIcallout_data\fP field contains a value that is passed to a matching -function specifically so that it can be passed back in callouts. It is passed -in the \fIcallout_data\fP field of a \fBpcre_extra\fP or \fBpcre[16|32]_extra\fP -data structure. If no such data was passed, the value of \fIcallout_data\fP in -a callout block is NULL. There is a description of the \fBpcre_extra\fP -structure in the -.\" HREF -\fBpcreapi\fP -.\" -documentation. -.P -The \fIpattern_position\fP field is present from version 1 of the callout -structure. It contains the offset to the next item to be matched in the pattern -string. -.P -The \fInext_item_length\fP field is present from version 1 of the callout -structure. It contains the length of the next item to be matched in the pattern -string. When the callout immediately precedes an alternation bar, a closing -parenthesis, or the end of the pattern, the length is zero. When the callout -precedes an opening parenthesis, the length is that of the entire subpattern. -.P -The \fIpattern_position\fP and \fInext_item_length\fP fields are intended to -help in distinguishing between different automatic callouts, which all have the -same callout number. However, they are set for all callouts. -.P -The \fImark\fP field is present from version 2 of the callout structure. In -callouts from \fBpcre_exec()\fP or \fBpcre[16|32]_exec()\fP it contains a -pointer to the zero-terminated name of the most recently passed (*MARK), -(*PRUNE), or (*THEN) item in the match, or NULL if no such items have been -passed. Instances of (*PRUNE) or (*THEN) without a name do not obliterate a -previous (*MARK). In callouts from the DFA matching functions this field always -contains NULL. -. -. -.SH "RETURN VALUES" -.rs -.sp -The external callout function returns an integer to PCRE. If the value is zero, -matching proceeds as normal. If the value is greater than zero, matching fails -at the current point, but the testing of other matching possibilities goes -ahead, just as if a lookahead assertion had failed. If the value is less than -zero, the match is abandoned, the matching function returns the negative value. -.P -Negative values should normally be chosen from the set of PCRE_ERROR_xxx -values. In particular, PCRE_ERROR_NOMATCH forces a standard "no match" failure. -The error number PCRE_ERROR_CALLOUT is reserved for use by callout functions; -it will never be used by PCRE itself. -. -. -.SH AUTHOR -.rs -.sp -.nf -Philip Hazel -University Computing Service -Cambridge CB2 3QH, England. -.fi -. -. -.SH REVISION -.rs -.sp -.nf -Last updated: 12 November 2013 -Copyright (c) 1997-2013 University of Cambridge. -.fi diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcrecompat.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcrecompat.3 deleted file mode 100644 index 6156e776..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcrecompat.3 +++ /dev/null @@ -1,200 +0,0 @@ -.TH PCRECOMPAT 3 "10 November 2013" "PCRE 8.34" -.SH NAME -PCRE - Perl-compatible regular expressions -.SH "DIFFERENCES BETWEEN PCRE AND PERL" -.rs -.sp -This document describes the differences in the ways that PCRE and Perl handle -regular expressions. The differences described here are with respect to Perl -versions 5.10 and above. -.P -1. PCRE has only a subset of Perl's Unicode support. Details of what it does -have are given in the -.\" HREF -\fBpcreunicode\fP -.\" -page. -.P -2. PCRE allows repeat quantifiers only on parenthesized assertions, but they do -not mean what you might think. For example, (?!a){3} does not assert that the -next three characters are not "a". It just asserts that the next character is -not "a" three times (in principle: PCRE optimizes this to run the assertion -just once). Perl allows repeat quantifiers on other assertions such as \eb, but -these do not seem to have any use. -.P -3. Capturing subpatterns that occur inside negative lookahead assertions are -counted, but their entries in the offsets vector are never set. Perl sometimes -(but not always) sets its numerical variables from inside negative assertions. -.P -4. Though binary zero characters are supported in the subject string, they are -not allowed in a pattern string because it is passed as a normal C string, -terminated by zero. The escape sequence \e0 can be used in the pattern to -represent a binary zero. -.P -5. The following Perl escape sequences are not supported: \el, \eu, \eL, -\eU, and \eN when followed by a character name or Unicode value. (\eN on its -own, matching a non-newline character, is supported.) In fact these are -implemented by Perl's general string-handling and are not part of its pattern -matching engine. If any of these are encountered by PCRE, an error is -generated by default. However, if the PCRE_JAVASCRIPT_COMPAT option is set, -\eU and \eu are interpreted as JavaScript interprets them. -.P -6. The Perl escape sequences \ep, \eP, and \eX are supported only if PCRE is -built with Unicode character property support. The properties that can be -tested with \ep and \eP are limited to the general category properties such as -Lu and Nd, script names such as Greek or Han, and the derived properties Any -and L&. PCRE does support the Cs (surrogate) property, which Perl does not; the -Perl documentation says "Because Perl hides the need for the user to understand -the internal representation of Unicode characters, there is no need to -implement the somewhat messy concept of surrogates." -.P -7. PCRE does support the \eQ...\eE escape for quoting substrings. Characters in -between are treated as literals. This is slightly different from Perl in that $ -and @ are also handled as literals inside the quotes. In Perl, they cause -variable interpolation (but of course PCRE does not have variables). Note the -following examples: -.sp - Pattern PCRE matches Perl matches -.sp -.\" JOIN - \eQabc$xyz\eE abc$xyz abc followed by the - contents of $xyz - \eQabc\e$xyz\eE abc\e$xyz abc\e$xyz - \eQabc\eE\e$\eQxyz\eE abc$xyz abc$xyz -.sp -The \eQ...\eE sequence is recognized both inside and outside character classes. -.P -8. Fairly obviously, PCRE does not support the (?{code}) and (??{code}) -constructions. However, there is support for recursive patterns. This is not -available in Perl 5.8, but it is in Perl 5.10. Also, the PCRE "callout" -feature allows an external function to be called during pattern matching. See -the -.\" HREF -\fBpcrecallout\fP -.\" -documentation for details. -.P -9. Subpatterns that are called as subroutines (whether or not recursively) are -always treated as atomic groups in PCRE. This is like Python, but unlike Perl. -Captured values that are set outside a subroutine call can be reference from -inside in PCRE, but not in Perl. There is a discussion that explains these -differences in more detail in the -.\" HTML -.\" -section on recursion differences from Perl -.\" -in the -.\" HREF -\fBpcrepattern\fP -.\" -page. -.P -10. If any of the backtracking control verbs are used in a subpattern that is -called as a subroutine (whether or not recursively), their effect is confined -to that subpattern; it does not extend to the surrounding pattern. This is not -always the case in Perl. In particular, if (*THEN) is present in a group that -is called as a subroutine, its action is limited to that group, even if the -group does not contain any | characters. Note that such subpatterns are -processed as anchored at the point where they are tested. -.P -11. If a pattern contains more than one backtracking control verb, the first -one that is backtracked onto acts. For example, in the pattern -A(*COMMIT)B(*PRUNE)C a failure in B triggers (*COMMIT), but a failure in C -triggers (*PRUNE). Perl's behaviour is more complex; in many cases it is the -same as PCRE, but there are examples where it differs. -.P -12. Most backtracking verbs in assertions have their normal actions. They are -not confined to the assertion. -.P -13. There are some differences that are concerned with the settings of captured -strings when part of a pattern is repeated. For example, matching "aba" against -the pattern /^(a(b)?)+$/ in Perl leaves $2 unset, but in PCRE it is set to "b". -.P -14. PCRE's handling of duplicate subpattern numbers and duplicate subpattern -names is not as general as Perl's. This is a consequence of the fact the PCRE -works internally just with numbers, using an external table to translate -between numbers and names. In particular, a pattern such as (?|(?A)|(?B), -where the two capturing parentheses have the same number but different names, -is not supported, and causes an error at compile time. If it were allowed, it -would not be possible to distinguish which parentheses matched, because both -names map to capturing subpattern number 1. To avoid this confusing situation, -an error is given at compile time. -.P -15. Perl recognizes comments in some places that PCRE does not, for example, -between the ( and ? at the start of a subpattern. If the /x modifier is set, -Perl allows white space between ( and ? (though current Perls warn that this is -deprecated) but PCRE never does, even if the PCRE_EXTENDED option is set. -.P -16. Perl, when in warning mode, gives warnings for character classes such as -[A-\ed] or [a-[:digit:]]. It then treats the hyphens as literals. PCRE has no -warning features, so it gives an error in these cases because they are almost -certainly user mistakes. -.P -17. In PCRE, the upper/lower case character properties Lu and Ll are not -affected when case-independent matching is specified. For example, \ep{Lu} -always matches an upper case letter. I think Perl has changed in this respect; -in the release at the time of writing (5.16), \ep{Lu} and \ep{Ll} match all -letters, regardless of case, when case independence is specified. -.P -18. PCRE provides some extensions to the Perl regular expression facilities. -Perl 5.10 includes new features that are not in earlier versions of Perl, some -of which (such as named parentheses) have been in PCRE for some time. This list -is with respect to Perl 5.10: -.sp -(a) Although lookbehind assertions in PCRE must match fixed length strings, -each alternative branch of a lookbehind assertion can match a different length -of string. Perl requires them all to have the same length. -.sp -(b) If PCRE_DOLLAR_ENDONLY is set and PCRE_MULTILINE is not set, the $ -meta-character matches only at the very end of the string. -.sp -(c) If PCRE_EXTRA is set, a backslash followed by a letter with no special -meaning is faulted. Otherwise, like Perl, the backslash is quietly ignored. -(Perl can be made to issue a warning.) -.sp -(d) If PCRE_UNGREEDY is set, the greediness of the repetition quantifiers is -inverted, that is, by default they are not greedy, but if followed by a -question mark they are. -.sp -(e) PCRE_ANCHORED can be used at matching time to force a pattern to be tried -only at the first matching position in the subject string. -.sp -(f) The PCRE_NOTBOL, PCRE_NOTEOL, PCRE_NOTEMPTY, PCRE_NOTEMPTY_ATSTART, and -PCRE_NO_AUTO_CAPTURE options for \fBpcre_exec()\fP have no Perl equivalents. -.sp -(g) The \eR escape sequence can be restricted to match only CR, LF, or CRLF -by the PCRE_BSR_ANYCRLF option. -.sp -(h) The callout facility is PCRE-specific. -.sp -(i) The partial matching facility is PCRE-specific. -.sp -(j) Patterns compiled by PCRE can be saved and re-used at a later time, even on -different hosts that have the other endianness. However, this does not apply to -optimized data created by the just-in-time compiler. -.sp -(k) The alternative matching functions (\fBpcre_dfa_exec()\fP, -\fBpcre16_dfa_exec()\fP and \fBpcre32_dfa_exec()\fP,) match in a different way -and are not Perl-compatible. -.sp -(l) PCRE recognizes some special sequences such as (*CR) at the start of -a pattern that set overall options that cannot be changed within the pattern. -. -. -.SH AUTHOR -.rs -.sp -.nf -Philip Hazel -University Computing Service -Cambridge CB2 3QH, England. -.fi -. -. -.SH REVISION -.rs -.sp -.nf -Last updated: 10 November 2013 -Copyright (c) 1997-2013 University of Cambridge. -.fi diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcrecpp.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcrecpp.3 deleted file mode 100644 index fbddd86a..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcrecpp.3 +++ /dev/null @@ -1,348 +0,0 @@ -.TH PCRECPP 3 "08 January 2012" "PCRE 8.30" -.SH NAME -PCRE - Perl-compatible regular expressions. -.SH "SYNOPSIS OF C++ WRAPPER" -.rs -.sp -.B #include -. -.SH DESCRIPTION -.rs -.sp -The C++ wrapper for PCRE was provided by Google Inc. Some additional -functionality was added by Giuseppe Maxia. This brief man page was constructed -from the notes in the \fIpcrecpp.h\fP file, which should be consulted for -further details. Note that the C++ wrapper supports only the original 8-bit -PCRE library. There is no 16-bit or 32-bit support at present. -. -. -.SH "MATCHING INTERFACE" -.rs -.sp -The "FullMatch" operation checks that supplied text matches a supplied pattern -exactly. If pointer arguments are supplied, it copies matched sub-strings that -match sub-patterns into them. -.sp - Example: successful match - pcrecpp::RE re("h.*o"); - re.FullMatch("hello"); -.sp - Example: unsuccessful match (requires full match): - pcrecpp::RE re("e"); - !re.FullMatch("hello"); -.sp - Example: creating a temporary RE object: - pcrecpp::RE("h.*o").FullMatch("hello"); -.sp -You can pass in a "const char*" or a "string" for "text". The examples below -tend to use a const char*. You can, as in the different examples above, store -the RE object explicitly in a variable or use a temporary RE object. The -examples below use one mode or the other arbitrarily. Either could correctly be -used for any of these examples. -.P -You must supply extra pointer arguments to extract matched subpieces. -.sp - Example: extracts "ruby" into "s" and 1234 into "i" - int i; - string s; - pcrecpp::RE re("(\e\ew+):(\e\ed+)"); - re.FullMatch("ruby:1234", &s, &i); -.sp - Example: does not try to extract any extra sub-patterns - re.FullMatch("ruby:1234", &s); -.sp - Example: does not try to extract into NULL - re.FullMatch("ruby:1234", NULL, &i); -.sp - Example: integer overflow causes failure - !re.FullMatch("ruby:1234567891234", NULL, &i); -.sp - Example: fails because there aren't enough sub-patterns: - !pcrecpp::RE("\e\ew+:\e\ed+").FullMatch("ruby:1234", &s); -.sp - Example: fails because string cannot be stored in integer - !pcrecpp::RE("(.*)").FullMatch("ruby", &i); -.sp -The provided pointer arguments can be pointers to any scalar numeric -type, or one of: -.sp - string (matched piece is copied to string) - StringPiece (StringPiece is mutated to point to matched piece) - T (where "bool T::ParseFrom(const char*, int)" exists) - NULL (the corresponding matched sub-pattern is not copied) -.sp -The function returns true iff all of the following conditions are satisfied: -.sp - a. "text" matches "pattern" exactly; -.sp - b. The number of matched sub-patterns is >= number of supplied - pointers; -.sp - c. The "i"th argument has a suitable type for holding the - string captured as the "i"th sub-pattern. If you pass in - void * NULL for the "i"th argument, or a non-void * NULL - of the correct type, or pass fewer arguments than the - number of sub-patterns, "i"th captured sub-pattern is - ignored. -.sp -CAVEAT: An optional sub-pattern that does not exist in the matched -string is assigned the empty string. Therefore, the following will -return false (because the empty string is not a valid number): -.sp - int number; - pcrecpp::RE::FullMatch("abc", "[a-z]+(\e\ed+)?", &number); -.sp -The matching interface supports at most 16 arguments per call. -If you need more, consider using the more general interface -\fBpcrecpp::RE::DoMatch\fP. See \fBpcrecpp.h\fP for the signature for -\fBDoMatch\fP. -.P -NOTE: Do not use \fBno_arg\fP, which is used internally to mark the end of a -list of optional arguments, as a placeholder for missing arguments, as this can -lead to segfaults. -. -. -.SH "QUOTING METACHARACTERS" -.rs -.sp -You can use the "QuoteMeta" operation to insert backslashes before all -potentially meaningful characters in a string. The returned string, used as a -regular expression, will exactly match the original string. -.sp - Example: - string quoted = RE::QuoteMeta(unquoted); -.sp -Note that it's legal to escape a character even if it has no special meaning in -a regular expression -- so this function does that. (This also makes it -identical to the perl function of the same name; see "perldoc -f quotemeta".) -For example, "1.5-2.0?" becomes "1\e.5\e-2\e.0\e?". -. -.SH "PARTIAL MATCHES" -.rs -.sp -You can use the "PartialMatch" operation when you want the pattern -to match any substring of the text. -.sp - Example: simple search for a string: - pcrecpp::RE("ell").PartialMatch("hello"); -.sp - Example: find first number in a string: - int number; - pcrecpp::RE re("(\e\ed+)"); - re.PartialMatch("x*100 + 20", &number); - assert(number == 100); -. -. -.SH "UTF-8 AND THE MATCHING INTERFACE" -.rs -.sp -By default, pattern and text are plain text, one byte per character. The UTF8 -flag, passed to the constructor, causes both pattern and string to be treated -as UTF-8 text, still a byte stream but potentially multiple bytes per -character. In practice, the text is likelier to be UTF-8 than the pattern, but -the match returned may depend on the UTF8 flag, so always use it when matching -UTF8 text. For example, "." will match one byte normally but with UTF8 set may -match up to three bytes of a multi-byte character. -.sp - Example: - pcrecpp::RE_Options options; - options.set_utf8(); - pcrecpp::RE re(utf8_pattern, options); - re.FullMatch(utf8_string); -.sp - Example: using the convenience function UTF8(): - pcrecpp::RE re(utf8_pattern, pcrecpp::UTF8()); - re.FullMatch(utf8_string); -.sp -NOTE: The UTF8 flag is ignored if pcre was not configured with the - --enable-utf8 flag. -. -. -.SH "PASSING MODIFIERS TO THE REGULAR EXPRESSION ENGINE" -.rs -.sp -PCRE defines some modifiers to change the behavior of the regular expression -engine. The C++ wrapper defines an auxiliary class, RE_Options, as a vehicle to -pass such modifiers to a RE class. Currently, the following modifiers are -supported: -.sp - modifier description Perl corresponding -.sp - PCRE_CASELESS case insensitive match /i - PCRE_MULTILINE multiple lines match /m - PCRE_DOTALL dot matches newlines /s - PCRE_DOLLAR_ENDONLY $ matches only at end N/A - PCRE_EXTRA strict escape parsing N/A - PCRE_EXTENDED ignore white spaces /x - PCRE_UTF8 handles UTF8 chars built-in - PCRE_UNGREEDY reverses * and *? N/A - PCRE_NO_AUTO_CAPTURE disables capturing parens N/A (*) -.sp -(*) Both Perl and PCRE allow non capturing parentheses by means of the -"?:" modifier within the pattern itself. e.g. (?:ab|cd) does not -capture, while (ab|cd) does. -.P -For a full account on how each modifier works, please check the -PCRE API reference page. -.P -For each modifier, there are two member functions whose name is made -out of the modifier in lowercase, without the "PCRE_" prefix. For -instance, PCRE_CASELESS is handled by -.sp - bool caseless() -.sp -which returns true if the modifier is set, and -.sp - RE_Options & set_caseless(bool) -.sp -which sets or unsets the modifier. Moreover, PCRE_EXTRA_MATCH_LIMIT can be -accessed through the \fBset_match_limit()\fP and \fBmatch_limit()\fP member -functions. Setting \fImatch_limit\fP to a non-zero value will limit the -execution of pcre to keep it from doing bad things like blowing the stack or -taking an eternity to return a result. A value of 5000 is good enough to stop -stack blowup in a 2MB thread stack. Setting \fImatch_limit\fP to zero disables -match limiting. Alternatively, you can call \fBmatch_limit_recursion()\fP -which uses PCRE_EXTRA_MATCH_LIMIT_RECURSION to limit how much PCRE -recurses. \fBmatch_limit()\fP limits the number of matches PCRE does; -\fBmatch_limit_recursion()\fP limits the depth of internal recursion, and -therefore the amount of stack that is used. -.P -Normally, to pass one or more modifiers to a RE class, you declare -a \fIRE_Options\fP object, set the appropriate options, and pass this -object to a RE constructor. Example: -.sp - RE_Options opt; - opt.set_caseless(true); - if (RE("HELLO", opt).PartialMatch("hello world")) ... -.sp -RE_options has two constructors. The default constructor takes no arguments and -creates a set of flags that are off by default. The optional parameter -\fIoption_flags\fP is to facilitate transfer of legacy code from C programs. -This lets you do -.sp - RE(pattern, - RE_Options(PCRE_CASELESS|PCRE_MULTILINE)).PartialMatch(str); -.sp -However, new code is better off doing -.sp - RE(pattern, - RE_Options().set_caseless(true).set_multiline(true)) - .PartialMatch(str); -.sp -If you are going to pass one of the most used modifiers, there are some -convenience functions that return a RE_Options class with the -appropriate modifier already set: \fBCASELESS()\fP, \fBUTF8()\fP, -\fBMULTILINE()\fP, \fBDOTALL\fP(), and \fBEXTENDED()\fP. -.P -If you need to set several options at once, and you don't want to go through -the pains of declaring a RE_Options object and setting several options, there -is a parallel method that give you such ability on the fly. You can concatenate -several \fBset_xxxxx()\fP member functions, since each of them returns a -reference to its class object. For example, to pass PCRE_CASELESS, -PCRE_EXTENDED, and PCRE_MULTILINE to a RE with one statement, you may write: -.sp - RE(" ^ xyz \e\es+ .* blah$", - RE_Options() - .set_caseless(true) - .set_extended(true) - .set_multiline(true)).PartialMatch(sometext); -.sp -. -. -.SH "SCANNING TEXT INCREMENTALLY" -.rs -.sp -The "Consume" operation may be useful if you want to repeatedly -match regular expressions at the front of a string and skip over -them as they match. This requires use of the "StringPiece" type, -which represents a sub-range of a real string. Like RE, StringPiece -is defined in the pcrecpp namespace. -.sp - Example: read lines of the form "var = value" from a string. - string contents = ...; // Fill string somehow - pcrecpp::StringPiece input(contents); // Wrap in a StringPiece -.sp - string var; - int value; - pcrecpp::RE re("(\e\ew+) = (\e\ed+)\en"); - while (re.Consume(&input, &var, &value)) { - ...; - } -.sp -Each successful call to "Consume" will set "var/value", and also -advance "input" so it points past the matched text. -.P -The "FindAndConsume" operation is similar to "Consume" but does not -anchor your match at the beginning of the string. For example, you -could extract all words from a string by repeatedly calling -.sp - pcrecpp::RE("(\e\ew+)").FindAndConsume(&input, &word) -. -. -.SH "PARSING HEX/OCTAL/C-RADIX NUMBERS" -.rs -.sp -By default, if you pass a pointer to a numeric value, the -corresponding text is interpreted as a base-10 number. You can -instead wrap the pointer with a call to one of the operators Hex(), -Octal(), or CRadix() to interpret the text in another base. The -CRadix operator interprets C-style "0" (base-8) and "0x" (base-16) -prefixes, but defaults to base-10. -.sp - Example: - int a, b, c, d; - pcrecpp::RE re("(.*) (.*) (.*) (.*)"); - re.FullMatch("100 40 0100 0x40", - pcrecpp::Octal(&a), pcrecpp::Hex(&b), - pcrecpp::CRadix(&c), pcrecpp::CRadix(&d)); -.sp -will leave 64 in a, b, c, and d. -. -. -.SH "REPLACING PARTS OF STRINGS" -.rs -.sp -You can replace the first match of "pattern" in "str" with "rewrite". -Within "rewrite", backslash-escaped digits (\e1 to \e9) can be -used to insert text matching corresponding parenthesized group -from the pattern. \e0 in "rewrite" refers to the entire matching -text. For example: -.sp - string s = "yabba dabba doo"; - pcrecpp::RE("b+").Replace("d", &s); -.sp -will leave "s" containing "yada dabba doo". The result is true if the pattern -matches and a replacement occurs, false otherwise. -.P -\fBGlobalReplace\fP is like \fBReplace\fP except that it replaces all -occurrences of the pattern in the string with the rewrite. Replacements are -not subject to re-matching. For example: -.sp - string s = "yabba dabba doo"; - pcrecpp::RE("b+").GlobalReplace("d", &s); -.sp -will leave "s" containing "yada dada doo". It returns the number of -replacements made. -.P -\fBExtract\fP is like \fBReplace\fP, except that if the pattern matches, -"rewrite" is copied into "out" (an additional argument) with substitutions. -The non-matching portions of "text" are ignored. Returns true iff a match -occurred and the extraction happened successfully; if no match occurs, the -string is left unaffected. -. -. -.SH AUTHOR -.rs -.sp -.nf -The C++ wrapper was contributed by Google Inc. -Copyright (c) 2007 Google Inc. -.fi -. -. -.SH REVISION -.rs -.sp -.nf -Last updated: 08 January 2012 -.fi diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcredemo.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcredemo.3 deleted file mode 100644 index 194629b1..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcredemo.3 +++ /dev/null @@ -1,424 +0,0 @@ -.\" Start example. -.de EX -. nr mE \\n(.f -. nf -. nh -. ft CW -.. -. -. -.\" End example. -.de EE -. ft \\n(mE -. fi -. hy \\n(HY -.. -. -.EX -/************************************************* -* PCRE DEMONSTRATION PROGRAM * -*************************************************/ - -/* This is a demonstration program to illustrate the most straightforward ways -of calling the PCRE regular expression library from a C program. See the -pcresample documentation for a short discussion ("man pcresample" if you have -the PCRE man pages installed). - -In Unix-like environments, if PCRE is installed in your standard system -libraries, you should be able to compile this program using this command: - -gcc -Wall pcredemo.c -lpcre -o pcredemo - -If PCRE is not installed in a standard place, it is likely to be installed with -support for the pkg-config mechanism. If you have pkg-config, you can compile -this program using this command: - -gcc -Wall pcredemo.c `pkg-config --cflags --libs libpcre` -o pcredemo - -If you do not have pkg-config, you may have to use this: - -gcc -Wall pcredemo.c -I/usr/local/include -L/usr/local/lib \e - -R/usr/local/lib -lpcre -o pcredemo - -Replace "/usr/local/include" and "/usr/local/lib" with wherever the include and -library files for PCRE are installed on your system. Only some operating -systems (e.g. Solaris) use the -R option. - -Building under Windows: - -If you want to statically link this program against a non-dll .a file, you must -define PCRE_STATIC before including pcre.h, otherwise the pcre_malloc() and -pcre_free() exported functions will be declared __declspec(dllimport), with -unwanted results. So in this environment, uncomment the following line. */ - -/* #define PCRE_STATIC */ - -#include -#include -#include - -#define OVECCOUNT 30 /* should be a multiple of 3 */ - - -int main(int argc, char **argv) -{ -pcre *re; -const char *error; -char *pattern; -char *subject; -unsigned char *name_table; -unsigned int option_bits; -int erroffset; -int find_all; -int crlf_is_newline; -int namecount; -int name_entry_size; -int ovector[OVECCOUNT]; -int subject_length; -int rc, i; -int utf8; - - -/************************************************************************** -* First, sort out the command line. There is only one possible option at * -* the moment, "-g" to request repeated matching to find all occurrences, * -* like Perl's /g option. We set the variable find_all to a non-zero value * -* if the -g option is present. Apart from that, there must be exactly two * -* arguments. * -**************************************************************************/ - -find_all = 0; -for (i = 1; i < argc; i++) - { - if (strcmp(argv[i], "-g") == 0) find_all = 1; - else break; - } - -/* After the options, we require exactly two arguments, which are the pattern, -and the subject string. */ - -if (argc - i != 2) - { - printf("Two arguments required: a regex and a subject string\en"); - return 1; - } - -pattern = argv[i]; -subject = argv[i+1]; -subject_length = (int)strlen(subject); - - -/************************************************************************* -* Now we are going to compile the regular expression pattern, and handle * -* and errors that are detected. * -*************************************************************************/ - -re = pcre_compile( - pattern, /* the pattern */ - 0, /* default options */ - &error, /* for error message */ - &erroffset, /* for error offset */ - NULL); /* use default character tables */ - -/* Compilation failed: print the error message and exit */ - -if (re == NULL) - { - printf("PCRE compilation failed at offset %d: %s\en", erroffset, error); - return 1; - } - - -/************************************************************************* -* If the compilation succeeded, we call PCRE again, in order to do a * -* pattern match against the subject string. This does just ONE match. If * -* further matching is needed, it will be done below. * -*************************************************************************/ - -rc = pcre_exec( - re, /* the compiled pattern */ - NULL, /* no extra data - we didn't study the pattern */ - subject, /* the subject string */ - subject_length, /* the length of the subject */ - 0, /* start at offset 0 in the subject */ - 0, /* default options */ - ovector, /* output vector for substring information */ - OVECCOUNT); /* number of elements in the output vector */ - -/* Matching failed: handle error cases */ - -if (rc < 0) - { - switch(rc) - { - case PCRE_ERROR_NOMATCH: printf("No match\en"); break; - /* - Handle other special cases if you like - */ - default: printf("Matching error %d\en", rc); break; - } - pcre_free(re); /* Release memory used for the compiled pattern */ - return 1; - } - -/* Match succeded */ - -printf("\enMatch succeeded at offset %d\en", ovector[0]); - - -/************************************************************************* -* We have found the first match within the subject string. If the output * -* vector wasn't big enough, say so. Then output any substrings that were * -* captured. * -*************************************************************************/ - -/* The output vector wasn't big enough */ - -if (rc == 0) - { - rc = OVECCOUNT/3; - printf("ovector only has room for %d captured substrings\en", rc - 1); - } - -/* Show substrings stored in the output vector by number. Obviously, in a real -application you might want to do things other than print them. */ - -for (i = 0; i < rc; i++) - { - char *substring_start = subject + ovector[2*i]; - int substring_length = ovector[2*i+1] - ovector[2*i]; - printf("%2d: %.*s\en", i, substring_length, substring_start); - } - - -/************************************************************************** -* That concludes the basic part of this demonstration program. We have * -* compiled a pattern, and performed a single match. The code that follows * -* shows first how to access named substrings, and then how to code for * -* repeated matches on the same subject. * -**************************************************************************/ - -/* See if there are any named substrings, and if so, show them by name. First -we have to extract the count of named parentheses from the pattern. */ - -(void)pcre_fullinfo( - re, /* the compiled pattern */ - NULL, /* no extra data - we didn't study the pattern */ - PCRE_INFO_NAMECOUNT, /* number of named substrings */ - &namecount); /* where to put the answer */ - -if (namecount <= 0) printf("No named substrings\en"); else - { - unsigned char *tabptr; - printf("Named substrings\en"); - - /* Before we can access the substrings, we must extract the table for - translating names to numbers, and the size of each entry in the table. */ - - (void)pcre_fullinfo( - re, /* the compiled pattern */ - NULL, /* no extra data - we didn't study the pattern */ - PCRE_INFO_NAMETABLE, /* address of the table */ - &name_table); /* where to put the answer */ - - (void)pcre_fullinfo( - re, /* the compiled pattern */ - NULL, /* no extra data - we didn't study the pattern */ - PCRE_INFO_NAMEENTRYSIZE, /* size of each entry in the table */ - &name_entry_size); /* where to put the answer */ - - /* Now we can scan the table and, for each entry, print the number, the name, - and the substring itself. */ - - tabptr = name_table; - for (i = 0; i < namecount; i++) - { - int n = (tabptr[0] << 8) | tabptr[1]; - printf("(%d) %*s: %.*s\en", n, name_entry_size - 3, tabptr + 2, - ovector[2*n+1] - ovector[2*n], subject + ovector[2*n]); - tabptr += name_entry_size; - } - } - - -/************************************************************************* -* If the "-g" option was given on the command line, we want to continue * -* to search for additional matches in the subject string, in a similar * -* way to the /g option in Perl. This turns out to be trickier than you * -* might think because of the possibility of matching an empty string. * -* What happens is as follows: * -* * -* If the previous match was NOT for an empty string, we can just start * -* the next match at the end of the previous one. * -* * -* If the previous match WAS for an empty string, we can't do that, as it * -* would lead to an infinite loop. Instead, a special call of pcre_exec() * -* is made with the PCRE_NOTEMPTY_ATSTART and PCRE_ANCHORED flags set. * -* The first of these tells PCRE that an empty string at the start of the * -* subject is not a valid match; other possibilities must be tried. The * -* second flag restricts PCRE to one match attempt at the initial string * -* position. If this match succeeds, an alternative to the empty string * -* match has been found, and we can print it and proceed round the loop, * -* advancing by the length of whatever was found. If this match does not * -* succeed, we still stay in the loop, advancing by just one character. * -* In UTF-8 mode, which can be set by (*UTF8) in the pattern, this may be * -* more than one byte. * -* * -* However, there is a complication concerned with newlines. When the * -* newline convention is such that CRLF is a valid newline, we must * -* advance by two characters rather than one. The newline convention can * -* be set in the regex by (*CR), etc.; if not, we must find the default. * -*************************************************************************/ - -if (!find_all) /* Check for -g */ - { - pcre_free(re); /* Release the memory used for the compiled pattern */ - return 0; /* Finish unless -g was given */ - } - -/* Before running the loop, check for UTF-8 and whether CRLF is a valid newline -sequence. First, find the options with which the regex was compiled; extract -the UTF-8 state, and mask off all but the newline options. */ - -(void)pcre_fullinfo(re, NULL, PCRE_INFO_OPTIONS, &option_bits); -utf8 = option_bits & PCRE_UTF8; -option_bits &= PCRE_NEWLINE_CR|PCRE_NEWLINE_LF|PCRE_NEWLINE_CRLF| - PCRE_NEWLINE_ANY|PCRE_NEWLINE_ANYCRLF; - -/* If no newline options were set, find the default newline convention from the -build configuration. */ - -if (option_bits == 0) - { - int d; - (void)pcre_config(PCRE_CONFIG_NEWLINE, &d); - /* Note that these values are always the ASCII ones, even in - EBCDIC environments. CR = 13, NL = 10. */ - option_bits = (d == 13)? PCRE_NEWLINE_CR : - (d == 10)? PCRE_NEWLINE_LF : - (d == (13<<8 | 10))? PCRE_NEWLINE_CRLF : - (d == -2)? PCRE_NEWLINE_ANYCRLF : - (d == -1)? PCRE_NEWLINE_ANY : 0; - } - -/* See if CRLF is a valid newline sequence. */ - -crlf_is_newline = - option_bits == PCRE_NEWLINE_ANY || - option_bits == PCRE_NEWLINE_CRLF || - option_bits == PCRE_NEWLINE_ANYCRLF; - -/* Loop for second and subsequent matches */ - -for (;;) - { - int options = 0; /* Normally no options */ - int start_offset = ovector[1]; /* Start at end of previous match */ - - /* If the previous match was for an empty string, we are finished if we are - at the end of the subject. Otherwise, arrange to run another match at the - same point to see if a non-empty match can be found. */ - - if (ovector[0] == ovector[1]) - { - if (ovector[0] == subject_length) break; - options = PCRE_NOTEMPTY_ATSTART | PCRE_ANCHORED; - } - - /* Run the next matching operation */ - - rc = pcre_exec( - re, /* the compiled pattern */ - NULL, /* no extra data - we didn't study the pattern */ - subject, /* the subject string */ - subject_length, /* the length of the subject */ - start_offset, /* starting offset in the subject */ - options, /* options */ - ovector, /* output vector for substring information */ - OVECCOUNT); /* number of elements in the output vector */ - - /* This time, a result of NOMATCH isn't an error. If the value in "options" - is zero, it just means we have found all possible matches, so the loop ends. - Otherwise, it means we have failed to find a non-empty-string match at a - point where there was a previous empty-string match. In this case, we do what - Perl does: advance the matching position by one character, and continue. We - do this by setting the "end of previous match" offset, because that is picked - up at the top of the loop as the point at which to start again. - - There are two complications: (a) When CRLF is a valid newline sequence, and - the current position is just before it, advance by an extra byte. (b) - Otherwise we must ensure that we skip an entire UTF-8 character if we are in - UTF-8 mode. */ - - if (rc == PCRE_ERROR_NOMATCH) - { - if (options == 0) break; /* All matches found */ - ovector[1] = start_offset + 1; /* Advance one byte */ - if (crlf_is_newline && /* If CRLF is newline & */ - start_offset < subject_length - 1 && /* we are at CRLF, */ - subject[start_offset] == '\er' && - subject[start_offset + 1] == '\en') - ovector[1] += 1; /* Advance by one more. */ - else if (utf8) /* Otherwise, ensure we */ - { /* advance a whole UTF-8 */ - while (ovector[1] < subject_length) /* character. */ - { - if ((subject[ovector[1]] & 0xc0) != 0x80) break; - ovector[1] += 1; - } - } - continue; /* Go round the loop again */ - } - - /* Other matching errors are not recoverable. */ - - if (rc < 0) - { - printf("Matching error %d\en", rc); - pcre_free(re); /* Release memory used for the compiled pattern */ - return 1; - } - - /* Match succeded */ - - printf("\enMatch succeeded again at offset %d\en", ovector[0]); - - /* The match succeeded, but the output vector wasn't big enough. */ - - if (rc == 0) - { - rc = OVECCOUNT/3; - printf("ovector only has room for %d captured substrings\en", rc - 1); - } - - /* As before, show substrings stored in the output vector by number, and then - also any named substrings. */ - - for (i = 0; i < rc; i++) - { - char *substring_start = subject + ovector[2*i]; - int substring_length = ovector[2*i+1] - ovector[2*i]; - printf("%2d: %.*s\en", i, substring_length, substring_start); - } - - if (namecount <= 0) printf("No named substrings\en"); else - { - unsigned char *tabptr = name_table; - printf("Named substrings\en"); - for (i = 0; i < namecount; i++) - { - int n = (tabptr[0] << 8) | tabptr[1]; - printf("(%d) %*s: %.*s\en", n, name_entry_size - 3, tabptr + 2, - ovector[2*n+1] - ovector[2*n], subject + ovector[2*n]); - tabptr += name_entry_size; - } - } - } /* End of loop to find second and subsequent matches */ - -printf("\en"); -pcre_free(re); /* Release memory used for the compiled pattern */ -return 0; -} - -/* End of pcredemo.c */ -.EE diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcrejit.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcrejit.3 deleted file mode 100644 index 3b785f0f..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcrejit.3 +++ /dev/null @@ -1,473 +0,0 @@ -.TH PCREJIT 3 "05 July 2017" "PCRE 8.41" -.SH NAME -PCRE - Perl-compatible regular expressions -.SH "PCRE JUST-IN-TIME COMPILER SUPPORT" -.rs -.sp -Just-in-time compiling is a heavyweight optimization that can greatly speed up -pattern matching. However, it comes at the cost of extra processing before the -match is performed. Therefore, it is of most benefit when the same pattern is -going to be matched many times. This does not necessarily mean many calls of a -matching function; if the pattern is not anchored, matching attempts may take -place many times at various positions in the subject, even for a single call. -Therefore, if the subject string is very long, it may still pay to use JIT for -one-off matches. -.P -JIT support applies only to the traditional Perl-compatible matching function. -It does not apply when the DFA matching function is being used. The code for -this support was written by Zoltan Herczeg. -. -. -.SH "8-BIT, 16-BIT AND 32-BIT SUPPORT" -.rs -.sp -JIT support is available for all of the 8-bit, 16-bit and 32-bit PCRE -libraries. To keep this documentation simple, only the 8-bit interface is -described in what follows. If you are using the 16-bit library, substitute the -16-bit functions and 16-bit structures (for example, \fIpcre16_jit_stack\fP -instead of \fIpcre_jit_stack\fP). If you are using the 32-bit library, -substitute the 32-bit functions and 32-bit structures (for example, -\fIpcre32_jit_stack\fP instead of \fIpcre_jit_stack\fP). -. -. -.SH "AVAILABILITY OF JIT SUPPORT" -.rs -.sp -JIT support is an optional feature of PCRE. The "configure" option --enable-jit -(or equivalent CMake option) must be set when PCRE is built if you want to use -JIT. The support is limited to the following hardware platforms: -.sp - ARM v5, v7, and Thumb2 - Intel x86 32-bit and 64-bit - MIPS 32-bit - Power PC 32-bit and 64-bit - SPARC 32-bit (experimental) -.sp -If --enable-jit is set on an unsupported platform, compilation fails. -.P -A program that is linked with PCRE 8.20 or later can tell if JIT support is -available by calling \fBpcre_config()\fP with the PCRE_CONFIG_JIT option. The -result is 1 when JIT is available, and 0 otherwise. However, a simple program -does not need to check this in order to use JIT. The normal API is implemented -in a way that falls back to the interpretive code if JIT is not available. For -programs that need the best possible performance, there is also a "fast path" -API that is JIT-specific. -.P -If your program may sometimes be linked with versions of PCRE that are older -than 8.20, but you want to use JIT when it is available, you can test the -values of PCRE_MAJOR and PCRE_MINOR, or the existence of a JIT macro such as -PCRE_CONFIG_JIT, for compile-time control of your code. Also beware that the -\fBpcre_jit_exec()\fP function was not available at all before 8.32, -and may not be available at all if PCRE isn't compiled with ---enable-jit. See the "JIT FAST PATH API" section below for details. -. -. -.SH "SIMPLE USE OF JIT" -.rs -.sp -You have to do two things to make use of the JIT support in the simplest way: -.sp - (1) Call \fBpcre_study()\fP with the PCRE_STUDY_JIT_COMPILE option for - each compiled pattern, and pass the resulting \fBpcre_extra\fP block to - \fBpcre_exec()\fP. -.sp - (2) Use \fBpcre_free_study()\fP to free the \fBpcre_extra\fP block when it is - no longer needed, instead of just freeing it yourself. This ensures that - any JIT data is also freed. -.sp -For a program that may be linked with pre-8.20 versions of PCRE, you can insert -.sp - #ifndef PCRE_STUDY_JIT_COMPILE - #define PCRE_STUDY_JIT_COMPILE 0 - #endif -.sp -so that no option is passed to \fBpcre_study()\fP, and then use something like -this to free the study data: -.sp - #ifdef PCRE_CONFIG_JIT - pcre_free_study(study_ptr); - #else - pcre_free(study_ptr); - #endif -.sp -PCRE_STUDY_JIT_COMPILE requests the JIT compiler to generate code for complete -matches. If you want to run partial matches using the PCRE_PARTIAL_HARD or -PCRE_PARTIAL_SOFT options of \fBpcre_exec()\fP, you should set one or both of -the following options in addition to, or instead of, PCRE_STUDY_JIT_COMPILE -when you call \fBpcre_study()\fP: -.sp - PCRE_STUDY_JIT_PARTIAL_HARD_COMPILE - PCRE_STUDY_JIT_PARTIAL_SOFT_COMPILE -.sp -If using \fBpcre_jit_exec()\fP and supporting a pre-8.32 version of -PCRE, you can insert: -.sp - #if PCRE_MAJOR >= 8 && PCRE_MINOR >= 32 - pcre_jit_exec(...); - #else - pcre_exec(...) - #endif -.sp -but as described in the "JIT FAST PATH API" section below this assumes -version 8.32 and later are compiled with --enable-jit, which may -break. -.sp -The JIT compiler generates different optimized code for each of the three -modes (normal, soft partial, hard partial). When \fBpcre_exec()\fP is called, -the appropriate code is run if it is available. Otherwise, the pattern is -matched using interpretive code. -.P -In some circumstances you may need to call additional functions. These are -described in the section entitled -.\" HTML -.\" -"Controlling the JIT stack" -.\" -below. -.P -If JIT support is not available, PCRE_STUDY_JIT_COMPILE etc. are ignored, and -no JIT data is created. Otherwise, the compiled pattern is passed to the JIT -compiler, which turns it into machine code that executes much faster than the -normal interpretive code. When \fBpcre_exec()\fP is passed a \fBpcre_extra\fP -block containing a pointer to JIT code of the appropriate mode (normal or -hard/soft partial), it obeys that code instead of running the interpreter. The -result is identical, but the compiled JIT code runs much faster. -.P -There are some \fBpcre_exec()\fP options that are not supported for JIT -execution. There are also some pattern items that JIT cannot handle. Details -are given below. In both cases, execution automatically falls back to the -interpretive code. If you want to know whether JIT was actually used for a -particular match, you should arrange for a JIT callback function to be set up -as described in the section entitled -.\" HTML -.\" -"Controlling the JIT stack" -.\" -below, even if you do not need to supply a non-default JIT stack. Such a -callback function is called whenever JIT code is about to be obeyed. If the -execution options are not right for JIT execution, the callback function is not -obeyed. -.P -If the JIT compiler finds an unsupported item, no JIT data is generated. You -can find out if JIT execution is available after studying a pattern by calling -\fBpcre_fullinfo()\fP with the PCRE_INFO_JIT option. A result of 1 means that -JIT compilation was successful. A result of 0 means that JIT support is not -available, or the pattern was not studied with PCRE_STUDY_JIT_COMPILE etc., or -the JIT compiler was not able to handle the pattern. -.P -Once a pattern has been studied, with or without JIT, it can be used as many -times as you like for matching different subject strings. -. -. -.SH "UNSUPPORTED OPTIONS AND PATTERN ITEMS" -.rs -.sp -The only \fBpcre_exec()\fP options that are supported for JIT execution are -PCRE_NO_UTF8_CHECK, PCRE_NO_UTF16_CHECK, PCRE_NO_UTF32_CHECK, PCRE_NOTBOL, -PCRE_NOTEOL, PCRE_NOTEMPTY, PCRE_NOTEMPTY_ATSTART, PCRE_PARTIAL_HARD, and -PCRE_PARTIAL_SOFT. -.P -The only unsupported pattern items are \eC (match a single data unit) when -running in a UTF mode, and a callout immediately before an assertion condition -in a conditional group. -. -. -.SH "RETURN VALUES FROM JIT EXECUTION" -.rs -.sp -When a pattern is matched using JIT execution, the return values are the same -as those given by the interpretive \fBpcre_exec()\fP code, with the addition of -one new error code: PCRE_ERROR_JIT_STACKLIMIT. This means that the memory used -for the JIT stack was insufficient. See -.\" HTML -.\" -"Controlling the JIT stack" -.\" -below for a discussion of JIT stack usage. For compatibility with the -interpretive \fBpcre_exec()\fP code, no more than two-thirds of the -\fIovector\fP argument is used for passing back captured substrings. -.P -The error code PCRE_ERROR_MATCHLIMIT is returned by the JIT code if searching a -very large pattern tree goes on for too long, as it is in the same circumstance -when JIT is not used, but the details of exactly what is counted are not the -same. The PCRE_ERROR_RECURSIONLIMIT error code is never returned by JIT -execution. -. -. -.SH "SAVING AND RESTORING COMPILED PATTERNS" -.rs -.sp -The code that is generated by the JIT compiler is architecture-specific, and is -also position dependent. For those reasons it cannot be saved (in a file or -database) and restored later like the bytecode and other data of a compiled -pattern. Saving and restoring compiled patterns is not something many people -do. More detail about this facility is given in the -.\" HREF -\fBpcreprecompile\fP -.\" -documentation. It should be possible to run \fBpcre_study()\fP on a saved and -restored pattern, and thereby recreate the JIT data, but because JIT -compilation uses significant resources, it is probably not worth doing this; -you might as well recompile the original pattern. -. -. -.\" HTML -.SH "CONTROLLING THE JIT STACK" -.rs -.sp -When the compiled JIT code runs, it needs a block of memory to use as a stack. -By default, it uses 32K on the machine stack. However, some large or -complicated patterns need more than this. The error PCRE_ERROR_JIT_STACKLIMIT -is given when there is not enough stack. Three functions are provided for -managing blocks of memory for use as JIT stacks. There is further discussion -about the use of JIT stacks in the section entitled -.\" HTML -.\" -"JIT stack FAQ" -.\" -below. -.P -The \fBpcre_jit_stack_alloc()\fP function creates a JIT stack. Its arguments -are a starting size and a maximum size, and it returns a pointer to an opaque -structure of type \fBpcre_jit_stack\fP, or NULL if there is an error. The -\fBpcre_jit_stack_free()\fP function can be used to free a stack that is no -longer needed. (For the technically minded: the address space is allocated by -mmap or VirtualAlloc.) -.P -JIT uses far less memory for recursion than the interpretive code, -and a maximum stack size of 512K to 1M should be more than enough for any -pattern. -.P -The \fBpcre_assign_jit_stack()\fP function specifies which stack JIT code -should use. Its arguments are as follows: -.sp - pcre_extra *extra - pcre_jit_callback callback - void *data -.sp -The \fIextra\fP argument must be the result of studying a pattern with -PCRE_STUDY_JIT_COMPILE etc. There are three cases for the values of the other -two options: -.sp - (1) If \fIcallback\fP is NULL and \fIdata\fP is NULL, an internal 32K block - on the machine stack is used. -.sp - (2) If \fIcallback\fP is NULL and \fIdata\fP is not NULL, \fIdata\fP must be - a valid JIT stack, the result of calling \fBpcre_jit_stack_alloc()\fP. -.sp - (3) If \fIcallback\fP is not NULL, it must point to a function that is - called with \fIdata\fP as an argument at the start of matching, in - order to set up a JIT stack. If the return from the callback - function is NULL, the internal 32K stack is used; otherwise the - return value must be a valid JIT stack, the result of calling - \fBpcre_jit_stack_alloc()\fP. -.sp -A callback function is obeyed whenever JIT code is about to be run; it is not -obeyed when \fBpcre_exec()\fP is called with options that are incompatible for -JIT execution. A callback function can therefore be used to determine whether a -match operation was executed by JIT or by the interpreter. -.P -You may safely use the same JIT stack for more than one pattern (either by -assigning directly or by callback), as long as the patterns are all matched -sequentially in the same thread. In a multithread application, if you do not -specify a JIT stack, or if you assign or pass back NULL from a callback, that -is thread-safe, because each thread has its own machine stack. However, if you -assign or pass back a non-NULL JIT stack, this must be a different stack for -each thread so that the application is thread-safe. -.P -Strictly speaking, even more is allowed. You can assign the same non-NULL stack -to any number of patterns as long as they are not used for matching by multiple -threads at the same time. For example, you can assign the same stack to all -compiled patterns, and use a global mutex in the callback to wait until the -stack is available for use. However, this is an inefficient solution, and not -recommended. -.P -This is a suggestion for how a multithreaded program that needs to set up -non-default JIT stacks might operate: -.sp - During thread initalization - thread_local_var = pcre_jit_stack_alloc(...) -.sp - During thread exit - pcre_jit_stack_free(thread_local_var) -.sp - Use a one-line callback function - return thread_local_var -.sp -All the functions described in this section do nothing if JIT is not available, -and \fBpcre_assign_jit_stack()\fP does nothing unless the \fBextra\fP argument -is non-NULL and points to a \fBpcre_extra\fP block that is the result of a -successful study with PCRE_STUDY_JIT_COMPILE etc. -. -. -.\" HTML -.SH "JIT STACK FAQ" -.rs -.sp -(1) Why do we need JIT stacks? -.sp -PCRE (and JIT) is a recursive, depth-first engine, so it needs a stack where -the local data of the current node is pushed before checking its child nodes. -Allocating real machine stack on some platforms is difficult. For example, the -stack chain needs to be updated every time if we extend the stack on PowerPC. -Although it is possible, its updating time overhead decreases performance. So -we do the recursion in memory. -.P -(2) Why don't we simply allocate blocks of memory with \fBmalloc()\fP? -.sp -Modern operating systems have a nice feature: they can reserve an address space -instead of allocating memory. We can safely allocate memory pages inside this -address space, so the stack could grow without moving memory data (this is -important because of pointers). Thus we can allocate 1M address space, and use -only a single memory page (usually 4K) if that is enough. However, we can still -grow up to 1M anytime if needed. -.P -(3) Who "owns" a JIT stack? -.sp -The owner of the stack is the user program, not the JIT studied pattern or -anything else. The user program must ensure that if a stack is used by -\fBpcre_exec()\fP, (that is, it is assigned to the pattern currently running), -that stack must not be used by any other threads (to avoid overwriting the same -memory area). The best practice for multithreaded programs is to allocate a -stack for each thread, and return this stack through the JIT callback function. -.P -(4) When should a JIT stack be freed? -.sp -You can free a JIT stack at any time, as long as it will not be used by -\fBpcre_exec()\fP again. When you assign the stack to a pattern, only a pointer -is set. There is no reference counting or any other magic. You can free the -patterns and stacks in any order, anytime. Just \fIdo not\fP call -\fBpcre_exec()\fP with a pattern pointing to an already freed stack, as that -will cause SEGFAULT. (Also, do not free a stack currently used by -\fBpcre_exec()\fP in another thread). You can also replace the stack for a -pattern at any time. You can even free the previous stack before assigning a -replacement. -.P -(5) Should I allocate/free a stack every time before/after calling -\fBpcre_exec()\fP? -.sp -No, because this is too costly in terms of resources. However, you could -implement some clever idea which release the stack if it is not used in let's -say two minutes. The JIT callback can help to achieve this without keeping a -list of the currently JIT studied patterns. -.P -(6) OK, the stack is for long term memory allocation. But what happens if a -pattern causes stack overflow with a stack of 1M? Is that 1M kept until the -stack is freed? -.sp -Especially on embedded sytems, it might be a good idea to release memory -sometimes without freeing the stack. There is no API for this at the moment. -Probably a function call which returns with the currently allocated memory for -any stack and another which allows releasing memory (shrinking the stack) would -be a good idea if someone needs this. -.P -(7) This is too much of a headache. Isn't there any better solution for JIT -stack handling? -.sp -No, thanks to Windows. If POSIX threads were used everywhere, we could throw -out this complicated API. -. -. -.SH "EXAMPLE CODE" -.rs -.sp -This is a single-threaded example that specifies a JIT stack without using a -callback. -.sp - int rc; - int ovector[30]; - pcre *re; - pcre_extra *extra; - pcre_jit_stack *jit_stack; -.sp - re = pcre_compile(pattern, 0, &error, &erroffset, NULL); - /* Check for errors */ - extra = pcre_study(re, PCRE_STUDY_JIT_COMPILE, &error); - jit_stack = pcre_jit_stack_alloc(32*1024, 512*1024); - /* Check for error (NULL) */ - pcre_assign_jit_stack(extra, NULL, jit_stack); - rc = pcre_exec(re, extra, subject, length, 0, 0, ovector, 30); - /* Check results */ - pcre_free(re); - pcre_free_study(extra); - pcre_jit_stack_free(jit_stack); -.sp -. -. -.SH "JIT FAST PATH API" -.rs -.sp -Because the API described above falls back to interpreted execution when JIT is -not available, it is convenient for programs that are written for general use -in many environments. However, calling JIT via \fBpcre_exec()\fP does have a -performance impact. Programs that are written for use where JIT is known to be -available, and which need the best possible performance, can instead use a -"fast path" API to call JIT execution directly instead of calling -\fBpcre_exec()\fP (obviously only for patterns that have been successfully -studied by JIT). -.P -The fast path function is called \fBpcre_jit_exec()\fP, and it takes exactly -the same arguments as \fBpcre_exec()\fP, plus one additional argument that -must point to a JIT stack. The JIT stack arrangements described above do not -apply. The return values are the same as for \fBpcre_exec()\fP. -.P -When you call \fBpcre_exec()\fP, as well as testing for invalid options, a -number of other sanity checks are performed on the arguments. For example, if -the subject pointer is NULL, or its length is negative, an immediate error is -given. Also, unless PCRE_NO_UTF[8|16|32] is set, a UTF subject string is tested -for validity. In the interests of speed, these checks do not happen on the JIT -fast path, and if invalid data is passed, the result is undefined. -.P -Bypassing the sanity checks and the \fBpcre_exec()\fP wrapping can give -speedups of more than 10%. -.P -Note that the \fBpcre_jit_exec()\fP function is not available in versions of -PCRE before 8.32 (released in November 2012). If you need to support versions -that old you must either use the slower \fBpcre_exec()\fP, or switch between -the two codepaths by checking the values of PCRE_MAJOR and PCRE_MINOR. -.P -Due to an unfortunate implementation oversight, even in versions 8.32 -and later there will be no \fBpcre_jit_exec()\fP stub function defined -when PCRE is compiled with --disable-jit, which is the default, and -there's no way to detect whether PCRE was compiled with --enable-jit -via a macro. -.P -If you need to support versions older than 8.32, or versions that may -not build with --enable-jit, you must either use the slower -\fBpcre_exec()\fP, or switch between the two codepaths by checking the -values of PCRE_MAJOR and PCRE_MINOR. -.P -Switching between the two by checking the version assumes that all the -versions being targeted are built with --enable-jit. To also support -builds that may use --disable-jit either \fBpcre_exec()\fP must be -used, or a compile-time check for JIT via \fBpcre_config()\fP (which -assumes the runtime environment will be the same), or as the Git -project decided to do, simply assume that \fBpcre_jit_exec()\fP is -present in 8.32 or later unless a compile-time flag is provided, see -the "grep: un-break building with PCRE >= 8.32 without --enable-jit" -commit in git.git for an example of that. -. -. -.SH "SEE ALSO" -.rs -.sp -\fBpcreapi\fP(3) -. -. -.SH AUTHOR -.rs -.sp -.nf -Philip Hazel (FAQ by Zoltan Herczeg) -University Computing Service -Cambridge CB2 3QH, England. -.fi -. -. -.SH REVISION -.rs -.sp -.nf -Last updated: 05 July 2017 -Copyright (c) 1997-2017 University of Cambridge. -.fi diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcrelimits.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcrelimits.3 deleted file mode 100644 index 423d6a27..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcrelimits.3 +++ /dev/null @@ -1,71 +0,0 @@ -.TH PCRELIMITS 3 "05 November 2013" "PCRE 8.34" -.SH NAME -PCRE - Perl-compatible regular expressions -.SH "SIZE AND OTHER LIMITATIONS" -.rs -.sp -There are some size limitations in PCRE but it is hoped that they will never in -practice be relevant. -.P -The maximum length of a compiled pattern is approximately 64K data units (bytes -for the 8-bit library, 16-bit units for the 16-bit library, and 32-bit units for -the 32-bit library) if PCRE is compiled with the default internal linkage size, -which is 2 bytes for the 8-bit and 16-bit libraries, and 4 bytes for the 32-bit -library. If you want to process regular expressions that are truly enormous, -you can compile PCRE with an internal linkage size of 3 or 4 (when building the -16-bit or 32-bit library, 3 is rounded up to 4). See the \fBREADME\fP file in -the source distribution and the -.\" HREF -\fBpcrebuild\fP -.\" -documentation for details. In these cases the limit is substantially larger. -However, the speed of execution is slower. -.P -All values in repeating quantifiers must be less than 65536. -.P -There is no limit to the number of parenthesized subpatterns, but there can be -no more than 65535 capturing subpatterns. There is, however, a limit to the -depth of nesting of parenthesized subpatterns of all kinds. This is imposed in -order to limit the amount of system stack used at compile time. The limit can -be specified when PCRE is built; the default is 250. -.P -There is a limit to the number of forward references to subsequent subpatterns -of around 200,000. Repeated forward references with fixed upper limits, for -example, (?2){0,100} when subpattern number 2 is to the right, are included in -the count. There is no limit to the number of backward references. -.P -The maximum length of name for a named subpattern is 32 characters, and the -maximum number of named subpatterns is 10000. -.P -The maximum length of a name in a (*MARK), (*PRUNE), (*SKIP), or (*THEN) verb -is 255 for the 8-bit library and 65535 for the 16-bit and 32-bit libraries. -.P -The maximum length of a subject string is the largest positive number that an -integer variable can hold. However, when using the traditional matching -function, PCRE uses recursion to handle subpatterns and indefinite repetition. -This means that the available stack space may limit the size of a subject -string that can be processed by certain patterns. For a discussion of stack -issues, see the -.\" HREF -\fBpcrestack\fP -.\" -documentation. -. -. -.SH AUTHOR -.rs -.sp -.nf -Philip Hazel -University Computing Service -Cambridge CB2 3QH, England. -.fi -. -. -.SH REVISION -.rs -.sp -.nf -Last updated: 05 November 2013 -Copyright (c) 1997-2013 University of Cambridge. -.fi diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcrematching.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcrematching.3 deleted file mode 100644 index 268baf9b..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcrematching.3 +++ /dev/null @@ -1,214 +0,0 @@ -.TH PCREMATCHING 3 "12 November 2013" "PCRE 8.34" -.SH NAME -PCRE - Perl-compatible regular expressions -.SH "PCRE MATCHING ALGORITHMS" -.rs -.sp -This document describes the two different algorithms that are available in PCRE -for matching a compiled regular expression against a given subject string. The -"standard" algorithm is the one provided by the \fBpcre_exec()\fP, -\fBpcre16_exec()\fP and \fBpcre32_exec()\fP functions. These work in the same -as as Perl's matching function, and provide a Perl-compatible matching operation. -The just-in-time (JIT) optimization that is described in the -.\" HREF -\fBpcrejit\fP -.\" -documentation is compatible with these functions. -.P -An alternative algorithm is provided by the \fBpcre_dfa_exec()\fP, -\fBpcre16_dfa_exec()\fP and \fBpcre32_dfa_exec()\fP functions; they operate in -a different way, and are not Perl-compatible. This alternative has advantages -and disadvantages compared with the standard algorithm, and these are described -below. -.P -When there is only one possible way in which a given subject string can match a -pattern, the two algorithms give the same answer. A difference arises, however, -when there are multiple possibilities. For example, if the pattern -.sp - ^<.*> -.sp -is matched against the string -.sp - -.sp -there are three possible answers. The standard algorithm finds only one of -them, whereas the alternative algorithm finds all three. -. -. -.SH "REGULAR EXPRESSIONS AS TREES" -.rs -.sp -The set of strings that are matched by a regular expression can be represented -as a tree structure. An unlimited repetition in the pattern makes the tree of -infinite size, but it is still a tree. Matching the pattern to a given subject -string (from a given starting point) can be thought of as a search of the tree. -There are two ways to search a tree: depth-first and breadth-first, and these -correspond to the two matching algorithms provided by PCRE. -. -. -.SH "THE STANDARD MATCHING ALGORITHM" -.rs -.sp -In the terminology of Jeffrey Friedl's book "Mastering Regular -Expressions", the standard algorithm is an "NFA algorithm". It conducts a -depth-first search of the pattern tree. That is, it proceeds along a single -path through the tree, checking that the subject matches what is required. When -there is a mismatch, the algorithm tries any alternatives at the current point, -and if they all fail, it backs up to the previous branch point in the tree, and -tries the next alternative branch at that level. This often involves backing up -(moving to the left) in the subject string as well. The order in which -repetition branches are tried is controlled by the greedy or ungreedy nature of -the quantifier. -.P -If a leaf node is reached, a matching string has been found, and at that point -the algorithm stops. Thus, if there is more than one possible match, this -algorithm returns the first one that it finds. Whether this is the shortest, -the longest, or some intermediate length depends on the way the greedy and -ungreedy repetition quantifiers are specified in the pattern. -.P -Because it ends up with a single path through the tree, it is relatively -straightforward for this algorithm to keep track of the substrings that are -matched by portions of the pattern in parentheses. This provides support for -capturing parentheses and back references. -. -. -.SH "THE ALTERNATIVE MATCHING ALGORITHM" -.rs -.sp -This algorithm conducts a breadth-first search of the tree. Starting from the -first matching point in the subject, it scans the subject string from left to -right, once, character by character, and as it does this, it remembers all the -paths through the tree that represent valid matches. In Friedl's terminology, -this is a kind of "DFA algorithm", though it is not implemented as a -traditional finite state machine (it keeps multiple states active -simultaneously). -.P -Although the general principle of this matching algorithm is that it scans the -subject string only once, without backtracking, there is one exception: when a -lookaround assertion is encountered, the characters following or preceding the -current point have to be independently inspected. -.P -The scan continues until either the end of the subject is reached, or there are -no more unterminated paths. At this point, terminated paths represent the -different matching possibilities (if there are none, the match has failed). -Thus, if there is more than one possible match, this algorithm finds all of -them, and in particular, it finds the longest. The matches are returned in -decreasing order of length. There is an option to stop the algorithm after the -first match (which is necessarily the shortest) is found. -.P -Note that all the matches that are found start at the same point in the -subject. If the pattern -.sp - cat(er(pillar)?)? -.sp -is matched against the string "the caterpillar catchment", the result will be -the three strings "caterpillar", "cater", and "cat" that start at the fifth -character of the subject. The algorithm does not automatically move on to find -matches that start at later positions. -.P -PCRE's "auto-possessification" optimization usually applies to character -repeats at the end of a pattern (as well as internally). For example, the -pattern "a\ed+" is compiled as if it were "a\ed++" because there is no point -even considering the possibility of backtracking into the repeated digits. For -DFA matching, this means that only one possible match is found. If you really -do want multiple matches in such cases, either use an ungreedy repeat -("a\ed+?") or set the PCRE_NO_AUTO_POSSESS option when compiling. -.P -There are a number of features of PCRE regular expressions that are not -supported by the alternative matching algorithm. They are as follows: -.P -1. Because the algorithm finds all possible matches, the greedy or ungreedy -nature of repetition quantifiers is not relevant. Greedy and ungreedy -quantifiers are treated in exactly the same way. However, possessive -quantifiers can make a difference when what follows could also match what is -quantified, for example in a pattern like this: -.sp - ^a++\ew! -.sp -This pattern matches "aaab!" but not "aaa!", which would be matched by a -non-possessive quantifier. Similarly, if an atomic group is present, it is -matched as if it were a standalone pattern at the current point, and the -longest match is then "locked in" for the rest of the overall pattern. -.P -2. When dealing with multiple paths through the tree simultaneously, it is not -straightforward to keep track of captured substrings for the different matching -possibilities, and PCRE's implementation of this algorithm does not attempt to -do this. This means that no captured substrings are available. -.P -3. Because no substrings are captured, back references within the pattern are -not supported, and cause errors if encountered. -.P -4. For the same reason, conditional expressions that use a backreference as the -condition or test for a specific group recursion are not supported. -.P -5. Because many paths through the tree may be active, the \eK escape sequence, -which resets the start of the match when encountered (but may be on some paths -and not on others), is not supported. It causes an error if encountered. -.P -6. Callouts are supported, but the value of the \fIcapture_top\fP field is -always 1, and the value of the \fIcapture_last\fP field is always -1. -.P -7. The \eC escape sequence, which (in the standard algorithm) always matches a -single data unit, even in UTF-8, UTF-16 or UTF-32 modes, is not supported in -these modes, because the alternative algorithm moves through the subject string -one character (not data unit) at a time, for all active paths through the tree. -.P -8. Except for (*FAIL), the backtracking control verbs such as (*PRUNE) are not -supported. (*FAIL) is supported, and behaves like a failing negative assertion. -. -. -.SH "ADVANTAGES OF THE ALTERNATIVE ALGORITHM" -.rs -.sp -Using the alternative matching algorithm provides the following advantages: -.P -1. All possible matches (at a single point in the subject) are automatically -found, and in particular, the longest match is found. To find more than one -match using the standard algorithm, you have to do kludgy things with -callouts. -.P -2. Because the alternative algorithm scans the subject string just once, and -never needs to backtrack (except for lookbehinds), it is possible to pass very -long subject strings to the matching function in several pieces, checking for -partial matching each time. Although it is possible to do multi-segment -matching using the standard algorithm by retaining partially matched -substrings, it is more complicated. The -.\" HREF -\fBpcrepartial\fP -.\" -documentation gives details of partial matching and discusses multi-segment -matching. -. -. -.SH "DISADVANTAGES OF THE ALTERNATIVE ALGORITHM" -.rs -.sp -The alternative algorithm suffers from a number of disadvantages: -.P -1. It is substantially slower than the standard algorithm. This is partly -because it has to search for all possible matches, but is also because it is -less susceptible to optimization. -.P -2. Capturing parentheses and back references are not supported. -.P -3. Although atomic groups are supported, their use does not provide the -performance advantage that it does for the standard algorithm. -. -. -.SH AUTHOR -.rs -.sp -.nf -Philip Hazel -University Computing Service -Cambridge CB2 3QH, England. -.fi -. -. -.SH REVISION -.rs -.sp -.nf -Last updated: 12 November 2013 -Copyright (c) 1997-2012 University of Cambridge. -.fi diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcrepartial.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcrepartial.3 deleted file mode 100644 index 14d0124f..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcrepartial.3 +++ /dev/null @@ -1,476 +0,0 @@ -.TH PCREPARTIAL 3 "02 July 2013" "PCRE 8.34" -.SH NAME -PCRE - Perl-compatible regular expressions -.SH "PARTIAL MATCHING IN PCRE" -.rs -.sp -In normal use of PCRE, if the subject string that is passed to a matching -function matches as far as it goes, but is too short to match the entire -pattern, PCRE_ERROR_NOMATCH is returned. There are circumstances where it might -be helpful to distinguish this case from other cases in which there is no -match. -.P -Consider, for example, an application where a human is required to type in data -for a field with specific formatting requirements. An example might be a date -in the form \fIddmmmyy\fP, defined by this pattern: -.sp - ^\ed?\ed(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)\ed\ed$ -.sp -If the application sees the user's keystrokes one by one, and can check that -what has been typed so far is potentially valid, it is able to raise an error -as soon as a mistake is made, by beeping and not reflecting the character that -has been typed, for example. This immediate feedback is likely to be a better -user interface than a check that is delayed until the entire string has been -entered. Partial matching can also be useful when the subject string is very -long and is not all available at once. -.P -PCRE supports partial matching by means of the PCRE_PARTIAL_SOFT and -PCRE_PARTIAL_HARD options, which can be set when calling any of the matching -functions. For backwards compatibility, PCRE_PARTIAL is a synonym for -PCRE_PARTIAL_SOFT. The essential difference between the two options is whether -or not a partial match is preferred to an alternative complete match, though -the details differ between the two types of matching function. If both options -are set, PCRE_PARTIAL_HARD takes precedence. -.P -If you want to use partial matching with just-in-time optimized code, you must -call \fBpcre_study()\fP, \fBpcre16_study()\fP or \fBpcre32_study()\fP with one -or both of these options: -.sp - PCRE_STUDY_JIT_PARTIAL_SOFT_COMPILE - PCRE_STUDY_JIT_PARTIAL_HARD_COMPILE -.sp -PCRE_STUDY_JIT_COMPILE should also be set if you are going to run non-partial -matches on the same pattern. If the appropriate JIT study mode has not been set -for a match, the interpretive matching code is used. -.P -Setting a partial matching option disables two of PCRE's standard -optimizations. PCRE remembers the last literal data unit in a pattern, and -abandons matching immediately if it is not present in the subject string. This -optimization cannot be used for a subject string that might match only -partially. If the pattern was studied, PCRE knows the minimum length of a -matching string, and does not bother to run the matching function on shorter -strings. This optimization is also disabled for partial matching. -. -. -.SH "PARTIAL MATCHING USING pcre_exec() OR pcre[16|32]_exec()" -.rs -.sp -A partial match occurs during a call to \fBpcre_exec()\fP or -\fBpcre[16|32]_exec()\fP when the end of the subject string is reached -successfully, but matching cannot continue because more characters are needed. -However, at least one character in the subject must have been inspected. This -character need not form part of the final matched string; lookbehind assertions -and the \eK escape sequence provide ways of inspecting characters before the -start of a matched substring. The requirement for inspecting at least one -character exists because an empty string can always be matched; without such a -restriction there would always be a partial match of an empty string at the end -of the subject. -.P -If there are at least two slots in the offsets vector when a partial match is -returned, the first slot is set to the offset of the earliest character that -was inspected. For convenience, the second offset points to the end of the -subject so that a substring can easily be identified. If there are at least -three slots in the offsets vector, the third slot is set to the offset of the -character where matching started. -.P -For the majority of patterns, the contents of the first and third slots will be -the same. However, for patterns that contain lookbehind assertions, or begin -with \eb or \eB, characters before the one where matching started may have been -inspected while carrying out the match. For example, consider this pattern: -.sp - /(?<=abc)123/ -.sp -This pattern matches "123", but only if it is preceded by "abc". If the subject -string is "xyzabc12", the first two offsets after a partial match are for the -substring "abc12", because all these characters were inspected. However, the -third offset is set to 6, because that is the offset where matching began. -.P -What happens when a partial match is identified depends on which of the two -partial matching options are set. -. -. -.SS "PCRE_PARTIAL_SOFT WITH pcre_exec() OR pcre[16|32]_exec()" -.rs -.sp -If PCRE_PARTIAL_SOFT is set when \fBpcre_exec()\fP or \fBpcre[16|32]_exec()\fP -identifies a partial match, the partial match is remembered, but matching -continues as normal, and other alternatives in the pattern are tried. If no -complete match can be found, PCRE_ERROR_PARTIAL is returned instead of -PCRE_ERROR_NOMATCH. -.P -This option is "soft" because it prefers a complete match over a partial match. -All the various matching items in a pattern behave as if the subject string is -potentially complete. For example, \ez, \eZ, and $ match at the end of the -subject, as normal, and for \eb and \eB the end of the subject is treated as a -non-alphanumeric. -.P -If there is more than one partial match, the first one that was found provides -the data that is returned. Consider this pattern: -.sp - /123\ew+X|dogY/ -.sp -If this is matched against the subject string "abc123dog", both -alternatives fail to match, but the end of the subject is reached during -matching, so PCRE_ERROR_PARTIAL is returned. The offsets are set to 3 and 9, -identifying "123dog" as the first partial match that was found. (In this -example, there are two partial matches, because "dog" on its own partially -matches the second alternative.) -. -. -.SS "PCRE_PARTIAL_HARD WITH pcre_exec() OR pcre[16|32]_exec()" -.rs -.sp -If PCRE_PARTIAL_HARD is set for \fBpcre_exec()\fP or \fBpcre[16|32]_exec()\fP, -PCRE_ERROR_PARTIAL is returned as soon as a partial match is found, without -continuing to search for possible complete matches. This option is "hard" -because it prefers an earlier partial match over a later complete match. For -this reason, the assumption is made that the end of the supplied subject string -may not be the true end of the available data, and so, if \ez, \eZ, \eb, \eB, -or $ are encountered at the end of the subject, the result is -PCRE_ERROR_PARTIAL, provided that at least one character in the subject has -been inspected. -.P -Setting PCRE_PARTIAL_HARD also affects the way UTF-8 and UTF-16 -subject strings are checked for validity. Normally, an invalid sequence -causes the error PCRE_ERROR_BADUTF8 or PCRE_ERROR_BADUTF16. However, in the -special case of a truncated character at the end of the subject, -PCRE_ERROR_SHORTUTF8 or PCRE_ERROR_SHORTUTF16 is returned when -PCRE_PARTIAL_HARD is set. -. -. -.SS "Comparing hard and soft partial matching" -.rs -.sp -The difference between the two partial matching options can be illustrated by a -pattern such as: -.sp - /dog(sbody)?/ -.sp -This matches either "dog" or "dogsbody", greedily (that is, it prefers the -longer string if possible). If it is matched against the string "dog" with -PCRE_PARTIAL_SOFT, it yields a complete match for "dog". However, if -PCRE_PARTIAL_HARD is set, the result is PCRE_ERROR_PARTIAL. On the other hand, -if the pattern is made ungreedy the result is different: -.sp - /dog(sbody)??/ -.sp -In this case the result is always a complete match because that is found first, -and matching never continues after finding a complete match. It might be easier -to follow this explanation by thinking of the two patterns like this: -.sp - /dog(sbody)?/ is the same as /dogsbody|dog/ - /dog(sbody)??/ is the same as /dog|dogsbody/ -.sp -The second pattern will never match "dogsbody", because it will always find the -shorter match first. -. -. -.SH "PARTIAL MATCHING USING pcre_dfa_exec() OR pcre[16|32]_dfa_exec()" -.rs -.sp -The DFA functions move along the subject string character by character, without -backtracking, searching for all possible matches simultaneously. If the end of -the subject is reached before the end of the pattern, there is the possibility -of a partial match, again provided that at least one character has been -inspected. -.P -When PCRE_PARTIAL_SOFT is set, PCRE_ERROR_PARTIAL is returned only if there -have been no complete matches. Otherwise, the complete matches are returned. -However, if PCRE_PARTIAL_HARD is set, a partial match takes precedence over any -complete matches. The portion of the string that was inspected when the longest -partial match was found is set as the first matching string, provided there are -at least two slots in the offsets vector. -.P -Because the DFA functions always search for all possible matches, and there is -no difference between greedy and ungreedy repetition, their behaviour is -different from the standard functions when PCRE_PARTIAL_HARD is set. Consider -the string "dog" matched against the ungreedy pattern shown above: -.sp - /dog(sbody)??/ -.sp -Whereas the standard functions stop as soon as they find the complete match for -"dog", the DFA functions also find the partial match for "dogsbody", and so -return that when PCRE_PARTIAL_HARD is set. -. -. -.SH "PARTIAL MATCHING AND WORD BOUNDARIES" -.rs -.sp -If a pattern ends with one of sequences \eb or \eB, which test for word -boundaries, partial matching with PCRE_PARTIAL_SOFT can give counter-intuitive -results. Consider this pattern: -.sp - /\ebcat\eb/ -.sp -This matches "cat", provided there is a word boundary at either end. If the -subject string is "the cat", the comparison of the final "t" with a following -character cannot take place, so a partial match is found. However, normal -matching carries on, and \eb matches at the end of the subject when the last -character is a letter, so a complete match is found. The result, therefore, is -\fInot\fP PCRE_ERROR_PARTIAL. Using PCRE_PARTIAL_HARD in this case does yield -PCRE_ERROR_PARTIAL, because then the partial match takes precedence. -. -. -.SH "FORMERLY RESTRICTED PATTERNS" -.rs -.sp -For releases of PCRE prior to 8.00, because of the way certain internal -optimizations were implemented in the \fBpcre_exec()\fP function, the -PCRE_PARTIAL option (predecessor of PCRE_PARTIAL_SOFT) could not be used with -all patterns. From release 8.00 onwards, the restrictions no longer apply, and -partial matching with can be requested for any pattern. -.P -Items that were formerly restricted were repeated single characters and -repeated metasequences. If PCRE_PARTIAL was set for a pattern that did not -conform to the restrictions, \fBpcre_exec()\fP returned the error code -PCRE_ERROR_BADPARTIAL (-13). This error code is no longer in use. The -PCRE_INFO_OKPARTIAL call to \fBpcre_fullinfo()\fP to find out if a compiled -pattern can be used for partial matching now always returns 1. -. -. -.SH "EXAMPLE OF PARTIAL MATCHING USING PCRETEST" -.rs -.sp -If the escape sequence \eP is present in a \fBpcretest\fP data line, the -PCRE_PARTIAL_SOFT option is used for the match. Here is a run of \fBpcretest\fP -that uses the date example quoted above: -.sp - re> /^\ed?\ed(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)\ed\ed$/ - data> 25jun04\eP - 0: 25jun04 - 1: jun - data> 25dec3\eP - Partial match: 23dec3 - data> 3ju\eP - Partial match: 3ju - data> 3juj\eP - No match - data> j\eP - No match -.sp -The first data string is matched completely, so \fBpcretest\fP shows the -matched substrings. The remaining four strings do not match the complete -pattern, but the first two are partial matches. Similar output is obtained -if DFA matching is used. -.P -If the escape sequence \eP is present more than once in a \fBpcretest\fP data -line, the PCRE_PARTIAL_HARD option is set for the match. -. -. -.SH "MULTI-SEGMENT MATCHING WITH pcre_dfa_exec() OR pcre[16|32]_dfa_exec()" -.rs -.sp -When a partial match has been found using a DFA matching function, it is -possible to continue the match by providing additional subject data and calling -the function again with the same compiled regular expression, this time setting -the PCRE_DFA_RESTART option. You must pass the same working space as before, -because this is where details of the previous partial match are stored. Here is -an example using \fBpcretest\fP, using the \eR escape sequence to set the -PCRE_DFA_RESTART option (\eD specifies the use of the DFA matching function): -.sp - re> /^\ed?\ed(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)\ed\ed$/ - data> 23ja\eP\eD - Partial match: 23ja - data> n05\eR\eD - 0: n05 -.sp -The first call has "23ja" as the subject, and requests partial matching; the -second call has "n05" as the subject for the continued (restarted) match. -Notice that when the match is complete, only the last part is shown; PCRE does -not retain the previously partially-matched string. It is up to the calling -program to do that if it needs to. -.P -That means that, for an unanchored pattern, if a continued match fails, it is -not possible to try again at a new starting point. All this facility is capable -of doing is continuing with the previous match attempt. In the previous -example, if the second set of data is "ug23" the result is no match, even -though there would be a match for "aug23" if the entire string were given at -once. Depending on the application, this may or may not be what you want. -The only way to allow for starting again at the next character is to retain the -matched part of the subject and try a new complete match. -.P -You can set the PCRE_PARTIAL_SOFT or PCRE_PARTIAL_HARD options with -PCRE_DFA_RESTART to continue partial matching over multiple segments. This -facility can be used to pass very long subject strings to the DFA matching -functions. -. -. -.SH "MULTI-SEGMENT MATCHING WITH pcre_exec() OR pcre[16|32]_exec()" -.rs -.sp -From release 8.00, the standard matching functions can also be used to do -multi-segment matching. Unlike the DFA functions, it is not possible to -restart the previous match with a new segment of data. Instead, new data must -be added to the previous subject string, and the entire match re-run, starting -from the point where the partial match occurred. Earlier data can be discarded. -.P -It is best to use PCRE_PARTIAL_HARD in this situation, because it does not -treat the end of a segment as the end of the subject when matching \ez, \eZ, -\eb, \eB, and $. Consider an unanchored pattern that matches dates: -.sp - re> /\ed?\ed(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)\ed\ed/ - data> The date is 23ja\eP\eP - Partial match: 23ja -.sp -At this stage, an application could discard the text preceding "23ja", add on -text from the next segment, and call the matching function again. Unlike the -DFA matching functions, the entire matching string must always be available, -and the complete matching process occurs for each call, so more memory and more -processing time is needed. -.P -\fBNote:\fP If the pattern contains lookbehind assertions, or \eK, or starts -with \eb or \eB, the string that is returned for a partial match includes -characters that precede the start of what would be returned for a complete -match, because it contains all the characters that were inspected during the -partial match. -. -. -.SH "ISSUES WITH MULTI-SEGMENT MATCHING" -.rs -.sp -Certain types of pattern may give problems with multi-segment matching, -whichever matching function is used. -.P -1. If the pattern contains a test for the beginning of a line, you need to pass -the PCRE_NOTBOL option when the subject string for any call does start at the -beginning of a line. There is also a PCRE_NOTEOL option, but in practice when -doing multi-segment matching you should be using PCRE_PARTIAL_HARD, which -includes the effect of PCRE_NOTEOL. -.P -2. Lookbehind assertions that have already been obeyed are catered for in the -offsets that are returned for a partial match. However a lookbehind assertion -later in the pattern could require even earlier characters to be inspected. You -can handle this case by using the PCRE_INFO_MAXLOOKBEHIND option of the -\fBpcre_fullinfo()\fP or \fBpcre[16|32]_fullinfo()\fP functions to obtain the -length of the longest lookbehind in the pattern. This length is given in -characters, not bytes. If you always retain at least that many characters -before the partially matched string, all should be well. (Of course, near the -start of the subject, fewer characters may be present; in that case all -characters should be retained.) -.P -From release 8.33, there is a more accurate way of deciding which characters to -retain. Instead of subtracting the length of the longest lookbehind from the -earliest inspected character (\fIoffsets[0]\fP), the match start position -(\fIoffsets[2]\fP) should be used, and the next match attempt started at the -\fIoffsets[2]\fP character by setting the \fIstartoffset\fP argument of -\fBpcre_exec()\fP or \fBpcre_dfa_exec()\fP. -.P -For example, if the pattern "(?<=123)abc" is partially -matched against the string "xx123a", the three offset values returned are 2, 6, -and 5. This indicates that the matching process that gave a partial match -started at offset 5, but the characters "123a" were all inspected. The maximum -lookbehind for that pattern is 3, so taking that away from 5 shows that we need -only keep "123a", and the next match attempt can be started at offset 3 (that -is, at "a") when further characters have been added. When the match start is -not the earliest inspected character, \fBpcretest\fP shows it explicitly: -.sp - re> "(?<=123)abc" - data> xx123a\eP\eP - Partial match at offset 5: 123a -.P -3. Because a partial match must always contain at least one character, what -might be considered a partial match of an empty string actually gives a "no -match" result. For example: -.sp - re> /c(?<=abc)x/ - data> ab\eP - No match -.sp -If the next segment begins "cx", a match should be found, but this will only -happen if characters from the previous segment are retained. For this reason, a -"no match" result should be interpreted as "partial match of an empty string" -when the pattern contains lookbehinds. -.P -4. Matching a subject string that is split into multiple segments may not -always produce exactly the same result as matching over one single long string, -especially when PCRE_PARTIAL_SOFT is used. The section "Partial Matching and -Word Boundaries" above describes an issue that arises if the pattern ends with -\eb or \eB. Another kind of difference may occur when there are multiple -matching possibilities, because (for PCRE_PARTIAL_SOFT) a partial match result -is given only when there are no completed matches. This means that as soon as -the shortest match has been found, continuation to a new subject segment is no -longer possible. Consider again this \fBpcretest\fP example: -.sp - re> /dog(sbody)?/ - data> dogsb\eP - 0: dog - data> do\eP\eD - Partial match: do - data> gsb\eR\eP\eD - 0: g - data> dogsbody\eD - 0: dogsbody - 1: dog -.sp -The first data line passes the string "dogsb" to a standard matching function, -setting the PCRE_PARTIAL_SOFT option. Although the string is a partial match -for "dogsbody", the result is not PCRE_ERROR_PARTIAL, because the shorter -string "dog" is a complete match. Similarly, when the subject is presented to -a DFA matching function in several parts ("do" and "gsb" being the first two) -the match stops when "dog" has been found, and it is not possible to continue. -On the other hand, if "dogsbody" is presented as a single string, a DFA -matching function finds both matches. -.P -Because of these problems, it is best to use PCRE_PARTIAL_HARD when matching -multi-segment data. The example above then behaves differently: -.sp - re> /dog(sbody)?/ - data> dogsb\eP\eP - Partial match: dogsb - data> do\eP\eD - Partial match: do - data> gsb\eR\eP\eP\eD - Partial match: gsb -.sp -5. Patterns that contain alternatives at the top level which do not all start -with the same pattern item may not work as expected when PCRE_DFA_RESTART is -used. For example, consider this pattern: -.sp - 1234|3789 -.sp -If the first part of the subject is "ABC123", a partial match of the first -alternative is found at offset 3. There is no partial match for the second -alternative, because such a match does not start at the same point in the -subject string. Attempting to continue with the string "7890" does not yield a -match because only those alternatives that match at one point in the subject -are remembered. The problem arises because the start of the second alternative -matches within the first alternative. There is no problem with anchored -patterns or patterns such as: -.sp - 1234|ABCD -.sp -where no string can be a partial match for both alternatives. This is not a -problem if a standard matching function is used, because the entire match has -to be rerun each time: -.sp - re> /1234|3789/ - data> ABC123\eP\eP - Partial match: 123 - data> 1237890 - 0: 3789 -.sp -Of course, instead of using PCRE_DFA_RESTART, the same technique of re-running -the entire match can also be used with the DFA matching functions. Another -possibility is to work with two buffers. If a partial match at offset \fIn\fP -in the first buffer is followed by "no match" when PCRE_DFA_RESTART is used on -the second buffer, you can then try a new match starting at offset \fIn+1\fP in -the first buffer. -. -. -.SH AUTHOR -.rs -.sp -.nf -Philip Hazel -University Computing Service -Cambridge CB2 3QH, England. -.fi -. -. -.SH REVISION -.rs -.sp -.nf -Last updated: 02 July 2013 -Copyright (c) 1997-2013 University of Cambridge. -.fi diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcrepattern.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcrepattern.3 deleted file mode 100644 index 97df217f..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcrepattern.3 +++ /dev/null @@ -1,3304 +0,0 @@ -.TH PCREPATTERN 3 "23 October 2016" "PCRE 8.40" -.SH NAME -PCRE - Perl-compatible regular expressions -.SH "PCRE REGULAR EXPRESSION DETAILS" -.rs -.sp -The syntax and semantics of the regular expressions that are supported by PCRE -are described in detail below. There is a quick-reference syntax summary in the -.\" HREF -\fBpcresyntax\fP -.\" -page. PCRE tries to match Perl syntax and semantics as closely as it can. PCRE -also supports some alternative regular expression syntax (which does not -conflict with the Perl syntax) in order to provide some compatibility with -regular expressions in Python, .NET, and Oniguruma. -.P -Perl's regular expressions are described in its own documentation, and -regular expressions in general are covered in a number of books, some of which -have copious examples. Jeffrey Friedl's "Mastering Regular Expressions", -published by O'Reilly, covers regular expressions in great detail. This -description of PCRE's regular expressions is intended as reference material. -.P -This document discusses the patterns that are supported by PCRE when one its -main matching functions, \fBpcre_exec()\fP (8-bit) or \fBpcre[16|32]_exec()\fP -(16- or 32-bit), is used. PCRE also has alternative matching functions, -\fBpcre_dfa_exec()\fP and \fBpcre[16|32_dfa_exec()\fP, which match using a -different algorithm that is not Perl-compatible. Some of the features discussed -below are not available when DFA matching is used. The advantages and -disadvantages of the alternative functions, and how they differ from the normal -functions, are discussed in the -.\" HREF -\fBpcrematching\fP -.\" -page. -. -. -.SH "SPECIAL START-OF-PATTERN ITEMS" -.rs -.sp -A number of options that can be passed to \fBpcre_compile()\fP can also be set -by special items at the start of a pattern. These are not Perl-compatible, but -are provided to make these options accessible to pattern writers who are not -able to change the program that processes the pattern. Any number of these -items may appear, but they must all be together right at the start of the -pattern string, and the letters must be in upper case. -. -. -.SS "UTF support" -.rs -.sp -The original operation of PCRE was on strings of one-byte characters. However, -there is now also support for UTF-8 strings in the original library, an -extra library that supports 16-bit and UTF-16 character strings, and a -third library that supports 32-bit and UTF-32 character strings. To use these -features, PCRE must be built to include appropriate support. When using UTF -strings you must either call the compiling function with the PCRE_UTF8, -PCRE_UTF16, or PCRE_UTF32 option, or the pattern must start with one of -these special sequences: -.sp - (*UTF8) - (*UTF16) - (*UTF32) - (*UTF) -.sp -(*UTF) is a generic sequence that can be used with any of the libraries. -Starting a pattern with such a sequence is equivalent to setting the relevant -option. How setting a UTF mode affects pattern matching is mentioned in several -places below. There is also a summary of features in the -.\" HREF -\fBpcreunicode\fP -.\" -page. -.P -Some applications that allow their users to supply patterns may wish to -restrict them to non-UTF data for security reasons. If the PCRE_NEVER_UTF -option is set at compile time, (*UTF) etc. are not allowed, and their -appearance causes an error. -. -. -.SS "Unicode property support" -.rs -.sp -Another special sequence that may appear at the start of a pattern is (*UCP). -This has the same effect as setting the PCRE_UCP option: it causes sequences -such as \ed and \ew to use Unicode properties to determine character types, -instead of recognizing only characters with codes less than 128 via a lookup -table. -. -. -.SS "Disabling auto-possessification" -.rs -.sp -If a pattern starts with (*NO_AUTO_POSSESS), it has the same effect as setting -the PCRE_NO_AUTO_POSSESS option at compile time. This stops PCRE from making -quantifiers possessive when what follows cannot match the repeated item. For -example, by default a+b is treated as a++b. For more details, see the -.\" HREF -\fBpcreapi\fP -.\" -documentation. -. -. -.SS "Disabling start-up optimizations" -.rs -.sp -If a pattern starts with (*NO_START_OPT), it has the same effect as setting the -PCRE_NO_START_OPTIMIZE option either at compile or matching time. This disables -several optimizations for quickly reaching "no match" results. For more -details, see the -.\" HREF -\fBpcreapi\fP -.\" -documentation. -. -. -.\" HTML -.SS "Newline conventions" -.rs -.sp -PCRE supports five different conventions for indicating line breaks in -strings: a single CR (carriage return) character, a single LF (linefeed) -character, the two-character sequence CRLF, any of the three preceding, or any -Unicode newline sequence. The -.\" HREF -\fBpcreapi\fP -.\" -page has -.\" HTML -.\" -further discussion -.\" -about newlines, and shows how to set the newline convention in the -\fIoptions\fP arguments for the compiling and matching functions. -.P -It is also possible to specify a newline convention by starting a pattern -string with one of the following five sequences: -.sp - (*CR) carriage return - (*LF) linefeed - (*CRLF) carriage return, followed by linefeed - (*ANYCRLF) any of the three above - (*ANY) all Unicode newline sequences -.sp -These override the default and the options given to the compiling function. For -example, on a Unix system where LF is the default newline sequence, the pattern -.sp - (*CR)a.b -.sp -changes the convention to CR. That pattern matches "a\enb" because LF is no -longer a newline. If more than one of these settings is present, the last one -is used. -.P -The newline convention affects where the circumflex and dollar assertions are -true. It also affects the interpretation of the dot metacharacter when -PCRE_DOTALL is not set, and the behaviour of \eN. However, it does not affect -what the \eR escape sequence matches. By default, this is any Unicode newline -sequence, for Perl compatibility. However, this can be changed; see the -description of \eR in the section entitled -.\" HTML -.\" -"Newline sequences" -.\" -below. A change of \eR setting can be combined with a change of newline -convention. -. -. -.SS "Setting match and recursion limits" -.rs -.sp -The caller of \fBpcre_exec()\fP can set a limit on the number of times the -internal \fBmatch()\fP function is called and on the maximum depth of -recursive calls. These facilities are provided to catch runaway matches that -are provoked by patterns with huge matching trees (a typical example is a -pattern with nested unlimited repeats) and to avoid running out of system stack -by too much recursion. When one of these limits is reached, \fBpcre_exec()\fP -gives an error return. The limits can also be set by items at the start of the -pattern of the form -.sp - (*LIMIT_MATCH=d) - (*LIMIT_RECURSION=d) -.sp -where d is any number of decimal digits. However, the value of the setting must -be less than the value set (or defaulted) by the caller of \fBpcre_exec()\fP -for it to have any effect. In other words, the pattern writer can lower the -limits set by the programmer, but not raise them. If there is more than one -setting of one of these limits, the lower value is used. -. -. -.SH "EBCDIC CHARACTER CODES" -.rs -.sp -PCRE can be compiled to run in an environment that uses EBCDIC as its character -code rather than ASCII or Unicode (typically a mainframe system). In the -sections below, character code values are ASCII or Unicode; in an EBCDIC -environment these characters may have different code values, and there are no -code points greater than 255. -. -. -.SH "CHARACTERS AND METACHARACTERS" -.rs -.sp -A regular expression is a pattern that is matched against a subject string from -left to right. Most characters stand for themselves in a pattern, and match the -corresponding characters in the subject. As a trivial example, the pattern -.sp - The quick brown fox -.sp -matches a portion of a subject string that is identical to itself. When -caseless matching is specified (the PCRE_CASELESS option), letters are matched -independently of case. In a UTF mode, PCRE always understands the concept of -case for characters whose values are less than 128, so caseless matching is -always possible. For characters with higher values, the concept of case is -supported if PCRE is compiled with Unicode property support, but not otherwise. -If you want to use caseless matching for characters 128 and above, you must -ensure that PCRE is compiled with Unicode property support as well as with -UTF support. -.P -The power of regular expressions comes from the ability to include alternatives -and repetitions in the pattern. These are encoded in the pattern by the use of -\fImetacharacters\fP, which do not stand for themselves but instead are -interpreted in some special way. -.P -There are two different sets of metacharacters: those that are recognized -anywhere in the pattern except within square brackets, and those that are -recognized within square brackets. Outside square brackets, the metacharacters -are as follows: -.sp - \e general escape character with several uses - ^ assert start of string (or line, in multiline mode) - $ assert end of string (or line, in multiline mode) - . match any character except newline (by default) - [ start character class definition - | start of alternative branch - ( start subpattern - ) end subpattern - ? extends the meaning of ( - also 0 or 1 quantifier - also quantifier minimizer - * 0 or more quantifier - + 1 or more quantifier - also "possessive quantifier" - { start min/max quantifier -.sp -Part of a pattern that is in square brackets is called a "character class". In -a character class the only metacharacters are: -.sp - \e general escape character - ^ negate the class, but only if the first character - - indicates character range -.\" JOIN - [ POSIX character class (only if followed by POSIX - syntax) - ] terminates the character class -.sp -The following sections describe the use of each of the metacharacters. -. -. -.SH BACKSLASH -.rs -.sp -The backslash character has several uses. Firstly, if it is followed by a -character that is not a number or a letter, it takes away any special meaning -that character may have. This use of backslash as an escape character applies -both inside and outside character classes. -.P -For example, if you want to match a * character, you write \e* in the pattern. -This escaping action applies whether or not the following character would -otherwise be interpreted as a metacharacter, so it is always safe to precede a -non-alphanumeric with backslash to specify that it stands for itself. In -particular, if you want to match a backslash, you write \e\e. -.P -In a UTF mode, only ASCII numbers and letters have any special meaning after a -backslash. All other characters (in particular, those whose codepoints are -greater than 127) are treated as literals. -.P -If a pattern is compiled with the PCRE_EXTENDED option, most white space in the -pattern (other than in a character class), and characters between a # outside a -character class and the next newline, inclusive, are ignored. An escaping -backslash can be used to include a white space or # character as part of the -pattern. -.P -If you want to remove the special meaning from a sequence of characters, you -can do so by putting them between \eQ and \eE. This is different from Perl in -that $ and @ are handled as literals in \eQ...\eE sequences in PCRE, whereas in -Perl, $ and @ cause variable interpolation. Note the following examples: -.sp - Pattern PCRE matches Perl matches -.sp -.\" JOIN - \eQabc$xyz\eE abc$xyz abc followed by the - contents of $xyz - \eQabc\e$xyz\eE abc\e$xyz abc\e$xyz - \eQabc\eE\e$\eQxyz\eE abc$xyz abc$xyz -.sp -The \eQ...\eE sequence is recognized both inside and outside character classes. -An isolated \eE that is not preceded by \eQ is ignored. If \eQ is not followed -by \eE later in the pattern, the literal interpretation continues to the end of -the pattern (that is, \eE is assumed at the end). If the isolated \eQ is inside -a character class, this causes an error, because the character class is not -terminated. -. -. -.\" HTML -.SS "Non-printing characters" -.rs -.sp -A second use of backslash provides a way of encoding non-printing characters -in patterns in a visible manner. There is no restriction on the appearance of -non-printing characters, apart from the binary zero that terminates a pattern, -but when a pattern is being prepared by text editing, it is often easier to use -one of the following escape sequences than the binary character it represents. -In an ASCII or Unicode environment, these escapes are as follows: -.sp - \ea alarm, that is, the BEL character (hex 07) - \ecx "control-x", where x is any ASCII character - \ee escape (hex 1B) - \ef form feed (hex 0C) - \en linefeed (hex 0A) - \er carriage return (hex 0D) - \et tab (hex 09) - \e0dd character with octal code 0dd - \eddd character with octal code ddd, or back reference - \eo{ddd..} character with octal code ddd.. - \exhh character with hex code hh - \ex{hhh..} character with hex code hhh.. (non-JavaScript mode) - \euhhhh character with hex code hhhh (JavaScript mode only) -.sp -The precise effect of \ecx on ASCII characters is as follows: if x is a lower -case letter, it is converted to upper case. Then bit 6 of the character (hex -40) is inverted. Thus \ecA to \ecZ become hex 01 to hex 1A (A is 41, Z is 5A), -but \ec{ becomes hex 3B ({ is 7B), and \ec; becomes hex 7B (; is 3B). If the -data item (byte or 16-bit value) following \ec has a value greater than 127, a -compile-time error occurs. This locks out non-ASCII characters in all modes. -.P -When PCRE is compiled in EBCDIC mode, \ea, \ee, \ef, \en, \er, and \et -generate the appropriate EBCDIC code values. The \ec escape is processed -as specified for Perl in the \fBperlebcdic\fP document. The only characters -that are allowed after \ec are A-Z, a-z, or one of @, [, \e, ], ^, _, or ?. Any -other character provokes a compile-time error. The sequence \ec@ encodes -character code 0; after \ec the letters (in either case) encode characters 1-26 -(hex 01 to hex 1A); [, \e, ], ^, and _ encode characters 27-31 (hex 1B to hex -1F), and \ec? becomes either 255 (hex FF) or 95 (hex 5F). -.P -Thus, apart from \ec?, these escapes generate the same character code values as -they do in an ASCII environment, though the meanings of the values mostly -differ. For example, \ecG always generates code value 7, which is BEL in ASCII -but DEL in EBCDIC. -.P -The sequence \ec? generates DEL (127, hex 7F) in an ASCII environment, but -because 127 is not a control character in EBCDIC, Perl makes it generate the -APC character. Unfortunately, there are several variants of EBCDIC. In most of -them the APC character has the value 255 (hex FF), but in the one Perl calls -POSIX-BC its value is 95 (hex 5F). If certain other characters have POSIX-BC -values, PCRE makes \ec? generate 95; otherwise it generates 255. -.P -After \e0 up to two further octal digits are read. If there are fewer than two -digits, just those that are present are used. Thus the sequence \e0\ex\e015 -specifies two binary zeros followed by a CR character (code value 13). Make -sure you supply two digits after the initial zero if the pattern character that -follows is itself an octal digit. -.P -The escape \eo must be followed by a sequence of octal digits, enclosed in -braces. An error occurs if this is not the case. This escape is a recent -addition to Perl; it provides way of specifying character code points as octal -numbers greater than 0777, and it also allows octal numbers and back references -to be unambiguously specified. -.P -For greater clarity and unambiguity, it is best to avoid following \e by a -digit greater than zero. Instead, use \eo{} or \ex{} to specify character -numbers, and \eg{} to specify back references. The following paragraphs -describe the old, ambiguous syntax. -.P -The handling of a backslash followed by a digit other than 0 is complicated, -and Perl has changed in recent releases, causing PCRE also to change. Outside a -character class, PCRE reads the digit and any following digits as a decimal -number. If the number is less than 8, or if there have been at least that many -previous capturing left parentheses in the expression, the entire sequence is -taken as a \fIback reference\fP. A description of how this works is given -.\" HTML -.\" -later, -.\" -following the discussion of -.\" HTML -.\" -parenthesized subpatterns. -.\" -.P -Inside a character class, or if the decimal number following \e is greater than -7 and there have not been that many capturing subpatterns, PCRE handles \e8 and -\e9 as the literal characters "8" and "9", and otherwise re-reads up to three -octal digits following the backslash, using them to generate a data character. -Any subsequent digits stand for themselves. For example: -.sp - \e040 is another way of writing an ASCII space -.\" JOIN - \e40 is the same, provided there are fewer than 40 - previous capturing subpatterns - \e7 is always a back reference -.\" JOIN - \e11 might be a back reference, or another way of - writing a tab - \e011 is always a tab - \e0113 is a tab followed by the character "3" -.\" JOIN - \e113 might be a back reference, otherwise the - character with octal code 113 -.\" JOIN - \e377 might be a back reference, otherwise - the value 255 (decimal) -.\" JOIN - \e81 is either a back reference, or the two - characters "8" and "1" -.sp -Note that octal values of 100 or greater that are specified using this syntax -must not be introduced by a leading zero, because no more than three octal -digits are ever read. -.P -By default, after \ex that is not followed by {, from zero to two hexadecimal -digits are read (letters can be in upper or lower case). Any number of -hexadecimal digits may appear between \ex{ and }. If a character other than -a hexadecimal digit appears between \ex{ and }, or if there is no terminating -}, an error occurs. -.P -If the PCRE_JAVASCRIPT_COMPAT option is set, the interpretation of \ex is -as just described only when it is followed by two hexadecimal digits. -Otherwise, it matches a literal "x" character. In JavaScript mode, support for -code points greater than 256 is provided by \eu, which must be followed by -four hexadecimal digits; otherwise it matches a literal "u" character. -.P -Characters whose value is less than 256 can be defined by either of the two -syntaxes for \ex (or by \eu in JavaScript mode). There is no difference in the -way they are handled. For example, \exdc is exactly the same as \ex{dc} (or -\eu00dc in JavaScript mode). -. -. -.SS "Constraints on character values" -.rs -.sp -Characters that are specified using octal or hexadecimal numbers are -limited to certain values, as follows: -.sp - 8-bit non-UTF mode less than 0x100 - 8-bit UTF-8 mode less than 0x10ffff and a valid codepoint - 16-bit non-UTF mode less than 0x10000 - 16-bit UTF-16 mode less than 0x10ffff and a valid codepoint - 32-bit non-UTF mode less than 0x100000000 - 32-bit UTF-32 mode less than 0x10ffff and a valid codepoint -.sp -Invalid Unicode codepoints are the range 0xd800 to 0xdfff (the so-called -"surrogate" codepoints), and 0xffef. -. -. -.SS "Escape sequences in character classes" -.rs -.sp -All the sequences that define a single character value can be used both inside -and outside character classes. In addition, inside a character class, \eb is -interpreted as the backspace character (hex 08). -.P -\eN is not allowed in a character class. \eB, \eR, and \eX are not special -inside a character class. Like other unrecognized escape sequences, they are -treated as the literal characters "B", "R", and "X" by default, but cause an -error if the PCRE_EXTRA option is set. Outside a character class, these -sequences have different meanings. -. -. -.SS "Unsupported escape sequences" -.rs -.sp -In Perl, the sequences \el, \eL, \eu, and \eU are recognized by its string -handler and used to modify the case of following characters. By default, PCRE -does not support these escape sequences. However, if the PCRE_JAVASCRIPT_COMPAT -option is set, \eU matches a "U" character, and \eu can be used to define a -character by code point, as described in the previous section. -. -. -.SS "Absolute and relative back references" -.rs -.sp -The sequence \eg followed by an unsigned or a negative number, optionally -enclosed in braces, is an absolute or relative back reference. A named back -reference can be coded as \eg{name}. Back references are discussed -.\" HTML -.\" -later, -.\" -following the discussion of -.\" HTML -.\" -parenthesized subpatterns. -.\" -. -. -.SS "Absolute and relative subroutine calls" -.rs -.sp -For compatibility with Oniguruma, the non-Perl syntax \eg followed by a name or -a number enclosed either in angle brackets or single quotes, is an alternative -syntax for referencing a subpattern as a "subroutine". Details are discussed -.\" HTML -.\" -later. -.\" -Note that \eg{...} (Perl syntax) and \eg<...> (Oniguruma syntax) are \fInot\fP -synonymous. The former is a back reference; the latter is a -.\" HTML -.\" -subroutine -.\" -call. -. -. -.\" HTML -.SS "Generic character types" -.rs -.sp -Another use of backslash is for specifying generic character types: -.sp - \ed any decimal digit - \eD any character that is not a decimal digit - \eh any horizontal white space character - \eH any character that is not a horizontal white space character - \es any white space character - \eS any character that is not a white space character - \ev any vertical white space character - \eV any character that is not a vertical white space character - \ew any "word" character - \eW any "non-word" character -.sp -There is also the single sequence \eN, which matches a non-newline character. -This is the same as -.\" HTML -.\" -the "." metacharacter -.\" -when PCRE_DOTALL is not set. Perl also uses \eN to match characters by name; -PCRE does not support this. -.P -Each pair of lower and upper case escape sequences partitions the complete set -of characters into two disjoint sets. Any given character matches one, and only -one, of each pair. The sequences can appear both inside and outside character -classes. They each match one character of the appropriate type. If the current -matching point is at the end of the subject string, all of them fail, because -there is no character to match. -.P -For compatibility with Perl, \es did not used to match the VT character (code -11), which made it different from the the POSIX "space" class. However, Perl -added VT at release 5.18, and PCRE followed suit at release 8.34. The default -\es characters are now HT (9), LF (10), VT (11), FF (12), CR (13), and space -(32), which are defined as white space in the "C" locale. This list may vary if -locale-specific matching is taking place. For example, in some locales the -"non-breaking space" character (\exA0) is recognized as white space, and in -others the VT character is not. -.P -A "word" character is an underscore or any character that is a letter or digit. -By default, the definition of letters and digits is controlled by PCRE's -low-valued character tables, and may vary if locale-specific matching is taking -place (see -.\" HTML -.\" -"Locale support" -.\" -in the -.\" HREF -\fBpcreapi\fP -.\" -page). For example, in a French locale such as "fr_FR" in Unix-like systems, -or "french" in Windows, some character codes greater than 127 are used for -accented letters, and these are then matched by \ew. The use of locales with -Unicode is discouraged. -.P -By default, characters whose code points are greater than 127 never match \ed, -\es, or \ew, and always match \eD, \eS, and \eW, although this may vary for -characters in the range 128-255 when locale-specific matching is happening. -These escape sequences retain their original meanings from before Unicode -support was available, mainly for efficiency reasons. If PCRE is compiled with -Unicode property support, and the PCRE_UCP option is set, the behaviour is -changed so that Unicode properties are used to determine character types, as -follows: -.sp - \ed any character that matches \ep{Nd} (decimal digit) - \es any character that matches \ep{Z} or \eh or \ev - \ew any character that matches \ep{L} or \ep{N}, plus underscore -.sp -The upper case escapes match the inverse sets of characters. Note that \ed -matches only decimal digits, whereas \ew matches any Unicode digit, as well as -any Unicode letter, and underscore. Note also that PCRE_UCP affects \eb, and -\eB because they are defined in terms of \ew and \eW. Matching these sequences -is noticeably slower when PCRE_UCP is set. -.P -The sequences \eh, \eH, \ev, and \eV are features that were added to Perl at -release 5.10. In contrast to the other sequences, which match only ASCII -characters by default, these always match certain high-valued code points, -whether or not PCRE_UCP is set. The horizontal space characters are: -.sp - U+0009 Horizontal tab (HT) - U+0020 Space - U+00A0 Non-break space - U+1680 Ogham space mark - U+180E Mongolian vowel separator - U+2000 En quad - U+2001 Em quad - U+2002 En space - U+2003 Em space - U+2004 Three-per-em space - U+2005 Four-per-em space - U+2006 Six-per-em space - U+2007 Figure space - U+2008 Punctuation space - U+2009 Thin space - U+200A Hair space - U+202F Narrow no-break space - U+205F Medium mathematical space - U+3000 Ideographic space -.sp -The vertical space characters are: -.sp - U+000A Linefeed (LF) - U+000B Vertical tab (VT) - U+000C Form feed (FF) - U+000D Carriage return (CR) - U+0085 Next line (NEL) - U+2028 Line separator - U+2029 Paragraph separator -.sp -In 8-bit, non-UTF-8 mode, only the characters with codepoints less than 256 are -relevant. -. -. -.\" HTML -.SS "Newline sequences" -.rs -.sp -Outside a character class, by default, the escape sequence \eR matches any -Unicode newline sequence. In 8-bit non-UTF-8 mode \eR is equivalent to the -following: -.sp - (?>\er\en|\en|\ex0b|\ef|\er|\ex85) -.sp -This is an example of an "atomic group", details of which are given -.\" HTML -.\" -below. -.\" -This particular group matches either the two-character sequence CR followed by -LF, or one of the single characters LF (linefeed, U+000A), VT (vertical tab, -U+000B), FF (form feed, U+000C), CR (carriage return, U+000D), or NEL (next -line, U+0085). The two-character sequence is treated as a single unit that -cannot be split. -.P -In other modes, two additional characters whose codepoints are greater than 255 -are added: LS (line separator, U+2028) and PS (paragraph separator, U+2029). -Unicode character property support is not needed for these characters to be -recognized. -.P -It is possible to restrict \eR to match only CR, LF, or CRLF (instead of the -complete set of Unicode line endings) by setting the option PCRE_BSR_ANYCRLF -either at compile time or when the pattern is matched. (BSR is an abbrevation -for "backslash R".) This can be made the default when PCRE is built; if this is -the case, the other behaviour can be requested via the PCRE_BSR_UNICODE option. -It is also possible to specify these settings by starting a pattern string with -one of the following sequences: -.sp - (*BSR_ANYCRLF) CR, LF, or CRLF only - (*BSR_UNICODE) any Unicode newline sequence -.sp -These override the default and the options given to the compiling function, but -they can themselves be overridden by options given to a matching function. Note -that these special settings, which are not Perl-compatible, are recognized only -at the very start of a pattern, and that they must be in upper case. If more -than one of them is present, the last one is used. They can be combined with a -change of newline convention; for example, a pattern can start with: -.sp - (*ANY)(*BSR_ANYCRLF) -.sp -They can also be combined with the (*UTF8), (*UTF16), (*UTF32), (*UTF) or -(*UCP) special sequences. Inside a character class, \eR is treated as an -unrecognized escape sequence, and so matches the letter "R" by default, but -causes an error if PCRE_EXTRA is set. -. -. -.\" HTML -.SS Unicode character properties -.rs -.sp -When PCRE is built with Unicode character property support, three additional -escape sequences that match characters with specific properties are available. -When in 8-bit non-UTF-8 mode, these sequences are of course limited to testing -characters whose codepoints are less than 256, but they do work in this mode. -The extra escape sequences are: -.sp - \ep{\fIxx\fP} a character with the \fIxx\fP property - \eP{\fIxx\fP} a character without the \fIxx\fP property - \eX a Unicode extended grapheme cluster -.sp -The property names represented by \fIxx\fP above are limited to the Unicode -script names, the general category properties, "Any", which matches any -character (including newline), and some special PCRE properties (described -in the -.\" HTML -.\" -next section). -.\" -Other Perl properties such as "InMusicalSymbols" are not currently supported by -PCRE. Note that \eP{Any} does not match any characters, so always causes a -match failure. -.P -Sets of Unicode characters are defined as belonging to certain scripts. A -character from one of these sets can be matched using a script name. For -example: -.sp - \ep{Greek} - \eP{Han} -.sp -Those that are not part of an identified script are lumped together as -"Common". The current list of scripts is: -.P -Arabic, -Armenian, -Avestan, -Balinese, -Bamum, -Bassa_Vah, -Batak, -Bengali, -Bopomofo, -Brahmi, -Braille, -Buginese, -Buhid, -Canadian_Aboriginal, -Carian, -Caucasian_Albanian, -Chakma, -Cham, -Cherokee, -Common, -Coptic, -Cuneiform, -Cypriot, -Cyrillic, -Deseret, -Devanagari, -Duployan, -Egyptian_Hieroglyphs, -Elbasan, -Ethiopic, -Georgian, -Glagolitic, -Gothic, -Grantha, -Greek, -Gujarati, -Gurmukhi, -Han, -Hangul, -Hanunoo, -Hebrew, -Hiragana, -Imperial_Aramaic, -Inherited, -Inscriptional_Pahlavi, -Inscriptional_Parthian, -Javanese, -Kaithi, -Kannada, -Katakana, -Kayah_Li, -Kharoshthi, -Khmer, -Khojki, -Khudawadi, -Lao, -Latin, -Lepcha, -Limbu, -Linear_A, -Linear_B, -Lisu, -Lycian, -Lydian, -Mahajani, -Malayalam, -Mandaic, -Manichaean, -Meetei_Mayek, -Mende_Kikakui, -Meroitic_Cursive, -Meroitic_Hieroglyphs, -Miao, -Modi, -Mongolian, -Mro, -Myanmar, -Nabataean, -New_Tai_Lue, -Nko, -Ogham, -Ol_Chiki, -Old_Italic, -Old_North_Arabian, -Old_Permic, -Old_Persian, -Old_South_Arabian, -Old_Turkic, -Oriya, -Osmanya, -Pahawh_Hmong, -Palmyrene, -Pau_Cin_Hau, -Phags_Pa, -Phoenician, -Psalter_Pahlavi, -Rejang, -Runic, -Samaritan, -Saurashtra, -Sharada, -Shavian, -Siddham, -Sinhala, -Sora_Sompeng, -Sundanese, -Syloti_Nagri, -Syriac, -Tagalog, -Tagbanwa, -Tai_Le, -Tai_Tham, -Tai_Viet, -Takri, -Tamil, -Telugu, -Thaana, -Thai, -Tibetan, -Tifinagh, -Tirhuta, -Ugaritic, -Vai, -Warang_Citi, -Yi. -.P -Each character has exactly one Unicode general category property, specified by -a two-letter abbreviation. For compatibility with Perl, negation can be -specified by including a circumflex between the opening brace and the property -name. For example, \ep{^Lu} is the same as \eP{Lu}. -.P -If only one letter is specified with \ep or \eP, it includes all the general -category properties that start with that letter. In this case, in the absence -of negation, the curly brackets in the escape sequence are optional; these two -examples have the same effect: -.sp - \ep{L} - \epL -.sp -The following general category property codes are supported: -.sp - C Other - Cc Control - Cf Format - Cn Unassigned - Co Private use - Cs Surrogate -.sp - L Letter - Ll Lower case letter - Lm Modifier letter - Lo Other letter - Lt Title case letter - Lu Upper case letter -.sp - M Mark - Mc Spacing mark - Me Enclosing mark - Mn Non-spacing mark -.sp - N Number - Nd Decimal number - Nl Letter number - No Other number -.sp - P Punctuation - Pc Connector punctuation - Pd Dash punctuation - Pe Close punctuation - Pf Final punctuation - Pi Initial punctuation - Po Other punctuation - Ps Open punctuation -.sp - S Symbol - Sc Currency symbol - Sk Modifier symbol - Sm Mathematical symbol - So Other symbol -.sp - Z Separator - Zl Line separator - Zp Paragraph separator - Zs Space separator -.sp -The special property L& is also supported: it matches a character that has -the Lu, Ll, or Lt property, in other words, a letter that is not classified as -a modifier or "other". -.P -The Cs (Surrogate) property applies only to characters in the range U+D800 to -U+DFFF. Such characters are not valid in Unicode strings and so -cannot be tested by PCRE, unless UTF validity checking has been turned off -(see the discussion of PCRE_NO_UTF8_CHECK, PCRE_NO_UTF16_CHECK and -PCRE_NO_UTF32_CHECK in the -.\" HREF -\fBpcreapi\fP -.\" -page). Perl does not support the Cs property. -.P -The long synonyms for property names that Perl supports (such as \ep{Letter}) -are not supported by PCRE, nor is it permitted to prefix any of these -properties with "Is". -.P -No character that is in the Unicode table has the Cn (unassigned) property. -Instead, this property is assumed for any code point that is not in the -Unicode table. -.P -Specifying caseless matching does not affect these escape sequences. For -example, \ep{Lu} always matches only upper case letters. This is different from -the behaviour of current versions of Perl. -.P -Matching characters by Unicode property is not fast, because PCRE has to do a -multistage table lookup in order to find a character's property. That is why -the traditional escape sequences such as \ed and \ew do not use Unicode -properties in PCRE by default, though you can make them do so by setting the -PCRE_UCP option or by starting the pattern with (*UCP). -. -. -.SS Extended grapheme clusters -.rs -.sp -The \eX escape matches any number of Unicode characters that form an "extended -grapheme cluster", and treats the sequence as an atomic group -.\" HTML -.\" -(see below). -.\" -Up to and including release 8.31, PCRE matched an earlier, simpler definition -that was equivalent to -.sp - (?>\ePM\epM*) -.sp -That is, it matched a character without the "mark" property, followed by zero -or more characters with the "mark" property. Characters with the "mark" -property are typically non-spacing accents that affect the preceding character. -.P -This simple definition was extended in Unicode to include more complicated -kinds of composite character by giving each character a grapheme breaking -property, and creating rules that use these properties to define the boundaries -of extended grapheme clusters. In releases of PCRE later than 8.31, \eX matches -one of these clusters. -.P -\eX always matches at least one character. Then it decides whether to add -additional characters according to the following rules for ending a cluster: -.P -1. End at the end of the subject string. -.P -2. Do not end between CR and LF; otherwise end after any control character. -.P -3. Do not break Hangul (a Korean script) syllable sequences. Hangul characters -are of five types: L, V, T, LV, and LVT. An L character may be followed by an -L, V, LV, or LVT character; an LV or V character may be followed by a V or T -character; an LVT or T character may be follwed only by a T character. -.P -4. Do not end before extending characters or spacing marks. Characters with -the "mark" property always have the "extend" grapheme breaking property. -.P -5. Do not end after prepend characters. -.P -6. Otherwise, end the cluster. -. -. -.\" HTML -.SS PCRE's additional properties -.rs -.sp -As well as the standard Unicode properties described above, PCRE supports four -more that make it possible to convert traditional escape sequences such as \ew -and \es to use Unicode properties. PCRE uses these non-standard, non-Perl -properties internally when PCRE_UCP is set. However, they may also be used -explicitly. These properties are: -.sp - Xan Any alphanumeric character - Xps Any POSIX space character - Xsp Any Perl space character - Xwd Any Perl "word" character -.sp -Xan matches characters that have either the L (letter) or the N (number) -property. Xps matches the characters tab, linefeed, vertical tab, form feed, or -carriage return, and any other character that has the Z (separator) property. -Xsp is the same as Xps; it used to exclude vertical tab, for Perl -compatibility, but Perl changed, and so PCRE followed at release 8.34. Xwd -matches the same characters as Xan, plus underscore. -.P -There is another non-standard property, Xuc, which matches any character that -can be represented by a Universal Character Name in C++ and other programming -languages. These are the characters $, @, ` (grave accent), and all characters -with Unicode code points greater than or equal to U+00A0, except for the -surrogates U+D800 to U+DFFF. Note that most base (ASCII) characters are -excluded. (Universal Character Names are of the form \euHHHH or \eUHHHHHHHH -where H is a hexadecimal digit. Note that the Xuc property does not match these -sequences but the characters that they represent.) -. -. -.\" HTML -.SS "Resetting the match start" -.rs -.sp -The escape sequence \eK causes any previously matched characters not to be -included in the final matched sequence. For example, the pattern: -.sp - foo\eKbar -.sp -matches "foobar", but reports that it has matched "bar". This feature is -similar to a lookbehind assertion -.\" HTML -.\" -(described below). -.\" -However, in this case, the part of the subject before the real match does not -have to be of fixed length, as lookbehind assertions do. The use of \eK does -not interfere with the setting of -.\" HTML -.\" -captured substrings. -.\" -For example, when the pattern -.sp - (foo)\eKbar -.sp -matches "foobar", the first substring is still set to "foo". -.P -Perl documents that the use of \eK within assertions is "not well defined". In -PCRE, \eK is acted upon when it occurs inside positive assertions, but is -ignored in negative assertions. Note that when a pattern such as (?=ab\eK) -matches, the reported start of the match can be greater than the end of the -match. -. -. -.\" HTML -.SS "Simple assertions" -.rs -.sp -The final use of backslash is for certain simple assertions. An assertion -specifies a condition that has to be met at a particular point in a match, -without consuming any characters from the subject string. The use of -subpatterns for more complicated assertions is described -.\" HTML -.\" -below. -.\" -The backslashed assertions are: -.sp - \eb matches at a word boundary - \eB matches when not at a word boundary - \eA matches at the start of the subject - \eZ matches at the end of the subject - also matches before a newline at the end of the subject - \ez matches only at the end of the subject - \eG matches at the first matching position in the subject -.sp -Inside a character class, \eb has a different meaning; it matches the backspace -character. If any other of these assertions appears in a character class, by -default it matches the corresponding literal character (for example, \eB -matches the letter B). However, if the PCRE_EXTRA option is set, an "invalid -escape sequence" error is generated instead. -.P -A word boundary is a position in the subject string where the current character -and the previous character do not both match \ew or \eW (i.e. one matches -\ew and the other matches \eW), or the start or end of the string if the -first or last character matches \ew, respectively. In a UTF mode, the meanings -of \ew and \eW can be changed by setting the PCRE_UCP option. When this is -done, it also affects \eb and \eB. Neither PCRE nor Perl has a separate "start -of word" or "end of word" metasequence. However, whatever follows \eb normally -determines which it is. For example, the fragment \eba matches "a" at the start -of a word. -.P -The \eA, \eZ, and \ez assertions differ from the traditional circumflex and -dollar (described in the next section) in that they only ever match at the very -start and end of the subject string, whatever options are set. Thus, they are -independent of multiline mode. These three assertions are not affected by the -PCRE_NOTBOL or PCRE_NOTEOL options, which affect only the behaviour of the -circumflex and dollar metacharacters. However, if the \fIstartoffset\fP -argument of \fBpcre_exec()\fP is non-zero, indicating that matching is to start -at a point other than the beginning of the subject, \eA can never match. The -difference between \eZ and \ez is that \eZ matches before a newline at the end -of the string as well as at the very end, whereas \ez matches only at the end. -.P -The \eG assertion is true only when the current matching position is at the -start point of the match, as specified by the \fIstartoffset\fP argument of -\fBpcre_exec()\fP. It differs from \eA when the value of \fIstartoffset\fP is -non-zero. By calling \fBpcre_exec()\fP multiple times with appropriate -arguments, you can mimic Perl's /g option, and it is in this kind of -implementation where \eG can be useful. -.P -Note, however, that PCRE's interpretation of \eG, as the start of the current -match, is subtly different from Perl's, which defines it as the end of the -previous match. In Perl, these can be different when the previously matched -string was empty. Because PCRE does just one match at a time, it cannot -reproduce this behaviour. -.P -If all the alternatives of a pattern begin with \eG, the expression is anchored -to the starting match position, and the "anchored" flag is set in the compiled -regular expression. -. -. -.SH "CIRCUMFLEX AND DOLLAR" -.rs -.sp -The circumflex and dollar metacharacters are zero-width assertions. That is, -they test for a particular condition being true without consuming any -characters from the subject string. -.P -Outside a character class, in the default matching mode, the circumflex -character is an assertion that is true only if the current matching point is at -the start of the subject string. If the \fIstartoffset\fP argument of -\fBpcre_exec()\fP is non-zero, circumflex can never match if the PCRE_MULTILINE -option is unset. Inside a character class, circumflex has an entirely different -meaning -.\" HTML -.\" -(see below). -.\" -.P -Circumflex need not be the first character of the pattern if a number of -alternatives are involved, but it should be the first thing in each alternative -in which it appears if the pattern is ever to match that branch. If all -possible alternatives start with a circumflex, that is, if the pattern is -constrained to match only at the start of the subject, it is said to be an -"anchored" pattern. (There are also other constructs that can cause a pattern -to be anchored.) -.P -The dollar character is an assertion that is true only if the current matching -point is at the end of the subject string, or immediately before a newline at -the end of the string (by default). Note, however, that it does not actually -match the newline. Dollar need not be the last character of the pattern if a -number of alternatives are involved, but it should be the last item in any -branch in which it appears. Dollar has no special meaning in a character class. -.P -The meaning of dollar can be changed so that it matches only at the very end of -the string, by setting the PCRE_DOLLAR_ENDONLY option at compile time. This -does not affect the \eZ assertion. -.P -The meanings of the circumflex and dollar characters are changed if the -PCRE_MULTILINE option is set. When this is the case, a circumflex matches -immediately after internal newlines as well as at the start of the subject -string. It does not match after a newline that ends the string. A dollar -matches before any newlines in the string, as well as at the very end, when -PCRE_MULTILINE is set. When newline is specified as the two-character -sequence CRLF, isolated CR and LF characters do not indicate newlines. -.P -For example, the pattern /^abc$/ matches the subject string "def\enabc" (where -\en represents a newline) in multiline mode, but not otherwise. Consequently, -patterns that are anchored in single line mode because all branches start with -^ are not anchored in multiline mode, and a match for circumflex is possible -when the \fIstartoffset\fP argument of \fBpcre_exec()\fP is non-zero. The -PCRE_DOLLAR_ENDONLY option is ignored if PCRE_MULTILINE is set. -.P -Note that the sequences \eA, \eZ, and \ez can be used to match the start and -end of the subject in both modes, and if all branches of a pattern start with -\eA it is always anchored, whether or not PCRE_MULTILINE is set. -. -. -.\" HTML -.SH "FULL STOP (PERIOD, DOT) AND \eN" -.rs -.sp -Outside a character class, a dot in the pattern matches any one character in -the subject string except (by default) a character that signifies the end of a -line. -.P -When a line ending is defined as a single character, dot never matches that -character; when the two-character sequence CRLF is used, dot does not match CR -if it is immediately followed by LF, but otherwise it matches all characters -(including isolated CRs and LFs). When any Unicode line endings are being -recognized, dot does not match CR or LF or any of the other line ending -characters. -.P -The behaviour of dot with regard to newlines can be changed. If the PCRE_DOTALL -option is set, a dot matches any one character, without exception. If the -two-character sequence CRLF is present in the subject string, it takes two dots -to match it. -.P -The handling of dot is entirely independent of the handling of circumflex and -dollar, the only relationship being that they both involve newlines. Dot has no -special meaning in a character class. -.P -The escape sequence \eN behaves like a dot, except that it is not affected by -the PCRE_DOTALL option. In other words, it matches any character except one -that signifies the end of a line. Perl also uses \eN to match characters by -name; PCRE does not support this. -. -. -.SH "MATCHING A SINGLE DATA UNIT" -.rs -.sp -Outside a character class, the escape sequence \eC matches any one data unit, -whether or not a UTF mode is set. In the 8-bit library, one data unit is one -byte; in the 16-bit library it is a 16-bit unit; in the 32-bit library it is -a 32-bit unit. Unlike a dot, \eC always -matches line-ending characters. The feature is provided in Perl in order to -match individual bytes in UTF-8 mode, but it is unclear how it can usefully be -used. Because \eC breaks up characters into individual data units, matching one -unit with \eC in a UTF mode means that the rest of the string may start with a -malformed UTF character. This has undefined results, because PCRE assumes that -it is dealing with valid UTF strings (and by default it checks this at the -start of processing unless the PCRE_NO_UTF8_CHECK, PCRE_NO_UTF16_CHECK or -PCRE_NO_UTF32_CHECK option is used). -.P -PCRE does not allow \eC to appear in lookbehind assertions -.\" HTML -.\" -(described below) -.\" -in a UTF mode, because this would make it impossible to calculate the length of -the lookbehind. -.P -In general, the \eC escape sequence is best avoided. However, one -way of using it that avoids the problem of malformed UTF characters is to use a -lookahead to check the length of the next character, as in this pattern, which -could be used with a UTF-8 string (ignore white space and line breaks): -.sp - (?| (?=[\ex00-\ex7f])(\eC) | - (?=[\ex80-\ex{7ff}])(\eC)(\eC) | - (?=[\ex{800}-\ex{ffff}])(\eC)(\eC)(\eC) | - (?=[\ex{10000}-\ex{1fffff}])(\eC)(\eC)(\eC)(\eC)) -.sp -A group that starts with (?| resets the capturing parentheses numbers in each -alternative (see -.\" HTML -.\" -"Duplicate Subpattern Numbers" -.\" -below). The assertions at the start of each branch check the next UTF-8 -character for values whose encoding uses 1, 2, 3, or 4 bytes, respectively. The -character's individual bytes are then captured by the appropriate number of -groups. -. -. -.\" HTML -.SH "SQUARE BRACKETS AND CHARACTER CLASSES" -.rs -.sp -An opening square bracket introduces a character class, terminated by a closing -square bracket. A closing square bracket on its own is not special by default. -However, if the PCRE_JAVASCRIPT_COMPAT option is set, a lone closing square -bracket causes a compile-time error. If a closing square bracket is required as -a member of the class, it should be the first data character in the class -(after an initial circumflex, if present) or escaped with a backslash. -.P -A character class matches a single character in the subject. In a UTF mode, the -character may be more than one data unit long. A matched character must be in -the set of characters defined by the class, unless the first character in the -class definition is a circumflex, in which case the subject character must not -be in the set defined by the class. If a circumflex is actually required as a -member of the class, ensure it is not the first character, or escape it with a -backslash. -.P -For example, the character class [aeiou] matches any lower case vowel, while -[^aeiou] matches any character that is not a lower case vowel. Note that a -circumflex is just a convenient notation for specifying the characters that -are in the class by enumerating those that are not. A class that starts with a -circumflex is not an assertion; it still consumes a character from the subject -string, and therefore it fails if the current pointer is at the end of the -string. -.P -In UTF-8 (UTF-16, UTF-32) mode, characters with values greater than 255 (0xffff) -can be included in a class as a literal string of data units, or by using the -\ex{ escaping mechanism. -.P -When caseless matching is set, any letters in a class represent both their -upper case and lower case versions, so for example, a caseless [aeiou] matches -"A" as well as "a", and a caseless [^aeiou] does not match "A", whereas a -caseful version would. In a UTF mode, PCRE always understands the concept of -case for characters whose values are less than 128, so caseless matching is -always possible. For characters with higher values, the concept of case is -supported if PCRE is compiled with Unicode property support, but not otherwise. -If you want to use caseless matching in a UTF mode for characters 128 and -above, you must ensure that PCRE is compiled with Unicode property support as -well as with UTF support. -.P -Characters that might indicate line breaks are never treated in any special way -when matching character classes, whatever line-ending sequence is in use, and -whatever setting of the PCRE_DOTALL and PCRE_MULTILINE options is used. A class -such as [^a] always matches one of these characters. -.P -The minus (hyphen) character can be used to specify a range of characters in a -character class. For example, [d-m] matches any letter between d and m, -inclusive. If a minus character is required in a class, it must be escaped with -a backslash or appear in a position where it cannot be interpreted as -indicating a range, typically as the first or last character in the class, or -immediately after a range. For example, [b-d-z] matches letters in the range b -to d, a hyphen character, or z. -.P -It is not possible to have the literal character "]" as the end character of a -range. A pattern such as [W-]46] is interpreted as a class of two characters -("W" and "-") followed by a literal string "46]", so it would match "W46]" or -"-46]". However, if the "]" is escaped with a backslash it is interpreted as -the end of range, so [W-\e]46] is interpreted as a class containing a range -followed by two other characters. The octal or hexadecimal representation of -"]" can also be used to end a range. -.P -An error is generated if a POSIX character class (see below) or an escape -sequence other than one that defines a single character appears at a point -where a range ending character is expected. For example, [z-\exff] is valid, -but [A-\ed] and [A-[:digit:]] are not. -.P -Ranges operate in the collating sequence of character values. They can also be -used for characters specified numerically, for example [\e000-\e037]. Ranges -can include any characters that are valid for the current mode. -.P -If a range that includes letters is used when caseless matching is set, it -matches the letters in either case. For example, [W-c] is equivalent to -[][\e\e^_`wxyzabc], matched caselessly, and in a non-UTF mode, if character -tables for a French locale are in use, [\exc8-\excb] matches accented E -characters in both cases. In UTF modes, PCRE supports the concept of case for -characters with values greater than 128 only when it is compiled with Unicode -property support. -.P -The character escape sequences \ed, \eD, \eh, \eH, \ep, \eP, \es, \eS, \ev, -\eV, \ew, and \eW may appear in a character class, and add the characters that -they match to the class. For example, [\edABCDEF] matches any hexadecimal -digit. In UTF modes, the PCRE_UCP option affects the meanings of \ed, \es, \ew -and their upper case partners, just as it does when they appear outside a -character class, as described in the section entitled -.\" HTML -.\" -"Generic character types" -.\" -above. The escape sequence \eb has a different meaning inside a character -class; it matches the backspace character. The sequences \eB, \eN, \eR, and \eX -are not special inside a character class. Like any other unrecognized escape -sequences, they are treated as the literal characters "B", "N", "R", and "X" by -default, but cause an error if the PCRE_EXTRA option is set. -.P -A circumflex can conveniently be used with the upper case character types to -specify a more restricted set of characters than the matching lower case type. -For example, the class [^\eW_] matches any letter or digit, but not underscore, -whereas [\ew] includes underscore. A positive character class should be read as -"something OR something OR ..." and a negative class as "NOT something AND NOT -something AND NOT ...". -.P -The only metacharacters that are recognized in character classes are backslash, -hyphen (only where it can be interpreted as specifying a range), circumflex -(only at the start), opening square bracket (only when it can be interpreted as -introducing a POSIX class name, or for a special compatibility feature - see -the next two sections), and the terminating closing square bracket. However, -escaping other non-alphanumeric characters does no harm. -. -. -.SH "POSIX CHARACTER CLASSES" -.rs -.sp -Perl supports the POSIX notation for character classes. This uses names -enclosed by [: and :] within the enclosing square brackets. PCRE also supports -this notation. For example, -.sp - [01[:alpha:]%] -.sp -matches "0", "1", any alphabetic character, or "%". The supported class names -are: -.sp - alnum letters and digits - alpha letters - ascii character codes 0 - 127 - blank space or tab only - cntrl control characters - digit decimal digits (same as \ed) - graph printing characters, excluding space - lower lower case letters - print printing characters, including space - punct printing characters, excluding letters and digits and space - space white space (the same as \es from PCRE 8.34) - upper upper case letters - word "word" characters (same as \ew) - xdigit hexadecimal digits -.sp -The default "space" characters are HT (9), LF (10), VT (11), FF (12), CR (13), -and space (32). If locale-specific matching is taking place, the list of space -characters may be different; there may be fewer or more of them. "Space" used -to be different to \es, which did not include VT, for Perl compatibility. -However, Perl changed at release 5.18, and PCRE followed at release 8.34. -"Space" and \es now match the same set of characters. -.P -The name "word" is a Perl extension, and "blank" is a GNU extension from Perl -5.8. Another Perl extension is negation, which is indicated by a ^ character -after the colon. For example, -.sp - [12[:^digit:]] -.sp -matches "1", "2", or any non-digit. PCRE (and Perl) also recognize the POSIX -syntax [.ch.] and [=ch=] where "ch" is a "collating element", but these are not -supported, and an error is given if they are encountered. -.P -By default, characters with values greater than 128 do not match any of the -POSIX character classes. However, if the PCRE_UCP option is passed to -\fBpcre_compile()\fP, some of the classes are changed so that Unicode character -properties are used. This is achieved by replacing certain POSIX classes by -other sequences, as follows: -.sp - [:alnum:] becomes \ep{Xan} - [:alpha:] becomes \ep{L} - [:blank:] becomes \eh - [:digit:] becomes \ep{Nd} - [:lower:] becomes \ep{Ll} - [:space:] becomes \ep{Xps} - [:upper:] becomes \ep{Lu} - [:word:] becomes \ep{Xwd} -.sp -Negated versions, such as [:^alpha:] use \eP instead of \ep. Three other POSIX -classes are handled specially in UCP mode: -.TP 10 -[:graph:] -This matches characters that have glyphs that mark the page when printed. In -Unicode property terms, it matches all characters with the L, M, N, P, S, or Cf -properties, except for: -.sp - U+061C Arabic Letter Mark - U+180E Mongolian Vowel Separator - U+2066 - U+2069 Various "isolate"s -.sp -.TP 10 -[:print:] -This matches the same characters as [:graph:] plus space characters that are -not controls, that is, characters with the Zs property. -.TP 10 -[:punct:] -This matches all characters that have the Unicode P (punctuation) property, -plus those characters whose code points are less than 128 that have the S -(Symbol) property. -.P -The other POSIX classes are unchanged, and match only characters with code -points less than 128. -. -. -.SH "COMPATIBILITY FEATURE FOR WORD BOUNDARIES" -.rs -.sp -In the POSIX.2 compliant library that was included in 4.4BSD Unix, the ugly -syntax [[:<:]] and [[:>:]] is used for matching "start of word" and "end of -word". PCRE treats these items as follows: -.sp - [[:<:]] is converted to \eb(?=\ew) - [[:>:]] is converted to \eb(?<=\ew) -.sp -Only these exact character sequences are recognized. A sequence such as -[a[:<:]b] provokes error for an unrecognized POSIX class name. This support is -not compatible with Perl. It is provided to help migrations from other -environments, and is best not used in any new patterns. Note that \eb matches -at the start and the end of a word (see -.\" HTML -.\" -"Simple assertions" -.\" -above), and in a Perl-style pattern the preceding or following character -normally shows which is wanted, without the need for the assertions that are -used above in order to give exactly the POSIX behaviour. -. -. -.SH "VERTICAL BAR" -.rs -.sp -Vertical bar characters are used to separate alternative patterns. For example, -the pattern -.sp - gilbert|sullivan -.sp -matches either "gilbert" or "sullivan". Any number of alternatives may appear, -and an empty alternative is permitted (matching the empty string). The matching -process tries each alternative in turn, from left to right, and the first one -that succeeds is used. If the alternatives are within a subpattern -.\" HTML -.\" -(defined below), -.\" -"succeeds" means matching the rest of the main pattern as well as the -alternative in the subpattern. -. -. -.SH "INTERNAL OPTION SETTING" -.rs -.sp -The settings of the PCRE_CASELESS, PCRE_MULTILINE, PCRE_DOTALL, and -PCRE_EXTENDED options (which are Perl-compatible) can be changed from within -the pattern by a sequence of Perl option letters enclosed between "(?" and ")". -The option letters are -.sp - i for PCRE_CASELESS - m for PCRE_MULTILINE - s for PCRE_DOTALL - x for PCRE_EXTENDED -.sp -For example, (?im) sets caseless, multiline matching. It is also possible to -unset these options by preceding the letter with a hyphen, and a combined -setting and unsetting such as (?im-sx), which sets PCRE_CASELESS and -PCRE_MULTILINE while unsetting PCRE_DOTALL and PCRE_EXTENDED, is also -permitted. If a letter appears both before and after the hyphen, the option is -unset. -.P -The PCRE-specific options PCRE_DUPNAMES, PCRE_UNGREEDY, and PCRE_EXTRA can be -changed in the same way as the Perl-compatible options by using the characters -J, U and X respectively. -.P -When one of these option changes occurs at top level (that is, not inside -subpattern parentheses), the change applies to the remainder of the pattern -that follows. An option change within a subpattern (see below for a description -of subpatterns) affects only that part of the subpattern that follows it, so -.sp - (a(?i)b)c -.sp -matches abc and aBc and no other strings (assuming PCRE_CASELESS is not used). -By this means, options can be made to have different settings in different -parts of the pattern. Any changes made in one alternative do carry on -into subsequent branches within the same subpattern. For example, -.sp - (a(?i)b|c) -.sp -matches "ab", "aB", "c", and "C", even though when matching "C" the first -branch is abandoned before the option setting. This is because the effects of -option settings happen at compile time. There would be some very weird -behaviour otherwise. -.P -\fBNote:\fP There are other PCRE-specific options that can be set by the -application when the compiling or matching functions are called. In some cases -the pattern can contain special leading sequences such as (*CRLF) to override -what the application has set or what has been defaulted. Details are given in -the section entitled -.\" HTML -.\" -"Newline sequences" -.\" -above. There are also the (*UTF8), (*UTF16),(*UTF32), and (*UCP) leading -sequences that can be used to set UTF and Unicode property modes; they are -equivalent to setting the PCRE_UTF8, PCRE_UTF16, PCRE_UTF32 and the PCRE_UCP -options, respectively. The (*UTF) sequence is a generic version that can be -used with any of the libraries. However, the application can set the -PCRE_NEVER_UTF option, which locks out the use of the (*UTF) sequences. -. -. -.\" HTML -.SH SUBPATTERNS -.rs -.sp -Subpatterns are delimited by parentheses (round brackets), which can be nested. -Turning part of a pattern into a subpattern does two things: -.sp -1. It localizes a set of alternatives. For example, the pattern -.sp - cat(aract|erpillar|) -.sp -matches "cataract", "caterpillar", or "cat". Without the parentheses, it would -match "cataract", "erpillar" or an empty string. -.sp -2. It sets up the subpattern as a capturing subpattern. This means that, when -the whole pattern matches, that portion of the subject string that matched the -subpattern is passed back to the caller via the \fIovector\fP argument of the -matching function. (This applies only to the traditional matching functions; -the DFA matching functions do not support capturing.) -.P -Opening parentheses are counted from left to right (starting from 1) to obtain -numbers for the capturing subpatterns. For example, if the string "the red -king" is matched against the pattern -.sp - the ((red|white) (king|queen)) -.sp -the captured substrings are "red king", "red", and "king", and are numbered 1, -2, and 3, respectively. -.P -The fact that plain parentheses fulfil two functions is not always helpful. -There are often times when a grouping subpattern is required without a -capturing requirement. If an opening parenthesis is followed by a question mark -and a colon, the subpattern does not do any capturing, and is not counted when -computing the number of any subsequent capturing subpatterns. For example, if -the string "the white queen" is matched against the pattern -.sp - the ((?:red|white) (king|queen)) -.sp -the captured substrings are "white queen" and "queen", and are numbered 1 and -2. The maximum number of capturing subpatterns is 65535. -.P -As a convenient shorthand, if any option settings are required at the start of -a non-capturing subpattern, the option letters may appear between the "?" and -the ":". Thus the two patterns -.sp - (?i:saturday|sunday) - (?:(?i)saturday|sunday) -.sp -match exactly the same set of strings. Because alternative branches are tried -from left to right, and options are not reset until the end of the subpattern -is reached, an option setting in one branch does affect subsequent branches, so -the above patterns match "SUNDAY" as well as "Saturday". -. -. -.\" HTML -.SH "DUPLICATE SUBPATTERN NUMBERS" -.rs -.sp -Perl 5.10 introduced a feature whereby each alternative in a subpattern uses -the same numbers for its capturing parentheses. Such a subpattern starts with -(?| and is itself a non-capturing subpattern. For example, consider this -pattern: -.sp - (?|(Sat)ur|(Sun))day -.sp -Because the two alternatives are inside a (?| group, both sets of capturing -parentheses are numbered one. Thus, when the pattern matches, you can look -at captured substring number one, whichever alternative matched. This construct -is useful when you want to capture part, but not all, of one of a number of -alternatives. Inside a (?| group, parentheses are numbered as usual, but the -number is reset at the start of each branch. The numbers of any capturing -parentheses that follow the subpattern start after the highest number used in -any branch. The following example is taken from the Perl documentation. The -numbers underneath show in which buffer the captured content will be stored. -.sp - # before ---------------branch-reset----------- after - / ( a ) (?| x ( y ) z | (p (q) r) | (t) u (v) ) ( z ) /x - # 1 2 2 3 2 3 4 -.sp -A back reference to a numbered subpattern uses the most recent value that is -set for that number by any subpattern. The following pattern matches "abcabc" -or "defdef": -.sp - /(?|(abc)|(def))\e1/ -.sp -In contrast, a subroutine call to a numbered subpattern always refers to the -first one in the pattern with the given number. The following pattern matches -"abcabc" or "defabc": -.sp - /(?|(abc)|(def))(?1)/ -.sp -If a -.\" HTML -.\" -condition test -.\" -for a subpattern's having matched refers to a non-unique number, the test is -true if any of the subpatterns of that number have matched. -.P -An alternative approach to using this "branch reset" feature is to use -duplicate named subpatterns, as described in the next section. -. -. -.SH "NAMED SUBPATTERNS" -.rs -.sp -Identifying capturing parentheses by number is simple, but it can be very hard -to keep track of the numbers in complicated regular expressions. Furthermore, -if an expression is modified, the numbers may change. To help with this -difficulty, PCRE supports the naming of subpatterns. This feature was not -added to Perl until release 5.10. Python had the feature earlier, and PCRE -introduced it at release 4.0, using the Python syntax. PCRE now supports both -the Perl and the Python syntax. Perl allows identically numbered subpatterns to -have different names, but PCRE does not. -.P -In PCRE, a subpattern can be named in one of three ways: (?...) or -(?'name'...) as in Perl, or (?P...) as in Python. References to capturing -parentheses from other parts of the pattern, such as -.\" HTML -.\" -back references, -.\" -.\" HTML -.\" -recursion, -.\" -and -.\" HTML -.\" -conditions, -.\" -can be made by name as well as by number. -.P -Names consist of up to 32 alphanumeric characters and underscores, but must -start with a non-digit. Named capturing parentheses are still allocated numbers -as well as names, exactly as if the names were not present. The PCRE API -provides function calls for extracting the name-to-number translation table -from a compiled pattern. There is also a convenience function for extracting a -captured substring by name. -.P -By default, a name must be unique within a pattern, but it is possible to relax -this constraint by setting the PCRE_DUPNAMES option at compile time. (Duplicate -names are also always permitted for subpatterns with the same number, set up as -described in the previous section.) Duplicate names can be useful for patterns -where only one instance of the named parentheses can match. Suppose you want to -match the name of a weekday, either as a 3-letter abbreviation or as the full -name, and in both cases you want to extract the abbreviation. This pattern -(ignoring the line breaks) does the job: -.sp - (?Mon|Fri|Sun)(?:day)?| - (?Tue)(?:sday)?| - (?Wed)(?:nesday)?| - (?Thu)(?:rsday)?| - (?Sat)(?:urday)? -.sp -There are five capturing substrings, but only one is ever set after a match. -(An alternative way of solving this problem is to use a "branch reset" -subpattern, as described in the previous section.) -.P -The convenience function for extracting the data by name returns the substring -for the first (and in this example, the only) subpattern of that name that -matched. This saves searching to find which numbered subpattern it was. -.P -If you make a back reference to a non-unique named subpattern from elsewhere in -the pattern, the subpatterns to which the name refers are checked in the order -in which they appear in the overall pattern. The first one that is set is used -for the reference. For example, this pattern matches both "foofoo" and -"barbar" but not "foobar" or "barfoo": -.sp - (?:(?foo)|(?bar))\ek -.sp -.P -If you make a subroutine call to a non-unique named subpattern, the one that -corresponds to the first occurrence of the name is used. In the absence of -duplicate numbers (see the previous section) this is the one with the lowest -number. -.P -If you use a named reference in a condition -test (see the -.\" -.\" HTML -.\" -section about conditions -.\" -below), either to check whether a subpattern has matched, or to check for -recursion, all subpatterns with the same name are tested. If the condition is -true for any one of them, the overall condition is true. This is the same -behaviour as testing by number. For further details of the interfaces for -handling named subpatterns, see the -.\" HREF -\fBpcreapi\fP -.\" -documentation. -.P -\fBWarning:\fP You cannot use different names to distinguish between two -subpatterns with the same number because PCRE uses only the numbers when -matching. For this reason, an error is given at compile time if different names -are given to subpatterns with the same number. However, you can always give the -same name to subpatterns with the same number, even when PCRE_DUPNAMES is not -set. -. -. -.SH REPETITION -.rs -.sp -Repetition is specified by quantifiers, which can follow any of the following -items: -.sp - a literal data character - the dot metacharacter - the \eC escape sequence - the \eX escape sequence - the \eR escape sequence - an escape such as \ed or \epL that matches a single character - a character class - a back reference (see next section) - a parenthesized subpattern (including assertions) - a subroutine call to a subpattern (recursive or otherwise) -.sp -The general repetition quantifier specifies a minimum and maximum number of -permitted matches, by giving the two numbers in curly brackets (braces), -separated by a comma. The numbers must be less than 65536, and the first must -be less than or equal to the second. For example: -.sp - z{2,4} -.sp -matches "zz", "zzz", or "zzzz". A closing brace on its own is not a special -character. If the second number is omitted, but the comma is present, there is -no upper limit; if the second number and the comma are both omitted, the -quantifier specifies an exact number of required matches. Thus -.sp - [aeiou]{3,} -.sp -matches at least 3 successive vowels, but may match many more, while -.sp - \ed{8} -.sp -matches exactly 8 digits. An opening curly bracket that appears in a position -where a quantifier is not allowed, or one that does not match the syntax of a -quantifier, is taken as a literal character. For example, {,6} is not a -quantifier, but a literal string of four characters. -.P -In UTF modes, quantifiers apply to characters rather than to individual data -units. Thus, for example, \ex{100}{2} matches two characters, each of -which is represented by a two-byte sequence in a UTF-8 string. Similarly, -\eX{3} matches three Unicode extended grapheme clusters, each of which may be -several data units long (and they may be of different lengths). -.P -The quantifier {0} is permitted, causing the expression to behave as if the -previous item and the quantifier were not present. This may be useful for -subpatterns that are referenced as -.\" HTML -.\" -subroutines -.\" -from elsewhere in the pattern (but see also the section entitled -.\" HTML -.\" -"Defining subpatterns for use by reference only" -.\" -below). Items other than subpatterns that have a {0} quantifier are omitted -from the compiled pattern. -.P -For convenience, the three most common quantifiers have single-character -abbreviations: -.sp - * is equivalent to {0,} - + is equivalent to {1,} - ? is equivalent to {0,1} -.sp -It is possible to construct infinite loops by following a subpattern that can -match no characters with a quantifier that has no upper limit, for example: -.sp - (a?)* -.sp -Earlier versions of Perl and PCRE used to give an error at compile time for -such patterns. However, because there are cases where this can be useful, such -patterns are now accepted, but if any repetition of the subpattern does in fact -match no characters, the loop is forcibly broken. -.P -By default, the quantifiers are "greedy", that is, they match as much as -possible (up to the maximum number of permitted times), without causing the -rest of the pattern to fail. The classic example of where this gives problems -is in trying to match comments in C programs. These appear between /* and */ -and within the comment, individual * and / characters may appear. An attempt to -match C comments by applying the pattern -.sp - /\e*.*\e*/ -.sp -to the string -.sp - /* first comment */ not comment /* second comment */ -.sp -fails, because it matches the entire string owing to the greediness of the .* -item. -.P -However, if a quantifier is followed by a question mark, it ceases to be -greedy, and instead matches the minimum number of times possible, so the -pattern -.sp - /\e*.*?\e*/ -.sp -does the right thing with the C comments. The meaning of the various -quantifiers is not otherwise changed, just the preferred number of matches. -Do not confuse this use of question mark with its use as a quantifier in its -own right. Because it has two uses, it can sometimes appear doubled, as in -.sp - \ed??\ed -.sp -which matches one digit by preference, but can match two if that is the only -way the rest of the pattern matches. -.P -If the PCRE_UNGREEDY option is set (an option that is not available in Perl), -the quantifiers are not greedy by default, but individual ones can be made -greedy by following them with a question mark. In other words, it inverts the -default behaviour. -.P -When a parenthesized subpattern is quantified with a minimum repeat count that -is greater than 1 or with a limited maximum, more memory is required for the -compiled pattern, in proportion to the size of the minimum or maximum. -.P -If a pattern starts with .* or .{0,} and the PCRE_DOTALL option (equivalent -to Perl's /s) is set, thus allowing the dot to match newlines, the pattern is -implicitly anchored, because whatever follows will be tried against every -character position in the subject string, so there is no point in retrying the -overall match at any position after the first. PCRE normally treats such a -pattern as though it were preceded by \eA. -.P -In cases where it is known that the subject string contains no newlines, it is -worth setting PCRE_DOTALL in order to obtain this optimization, or -alternatively using ^ to indicate anchoring explicitly. -.P -However, there are some cases where the optimization cannot be used. When .* -is inside capturing parentheses that are the subject of a back reference -elsewhere in the pattern, a match at the start may fail where a later one -succeeds. Consider, for example: -.sp - (.*)abc\e1 -.sp -If the subject is "xyz123abc123" the match point is the fourth character. For -this reason, such a pattern is not implicitly anchored. -.P -Another case where implicit anchoring is not applied is when the leading .* is -inside an atomic group. Once again, a match at the start may fail where a later -one succeeds. Consider this pattern: -.sp - (?>.*?a)b -.sp -It matches "ab" in the subject "aab". The use of the backtracking control verbs -(*PRUNE) and (*SKIP) also disable this optimization. -.P -When a capturing subpattern is repeated, the value captured is the substring -that matched the final iteration. For example, after -.sp - (tweedle[dume]{3}\es*)+ -.sp -has matched "tweedledum tweedledee" the value of the captured substring is -"tweedledee". However, if there are nested capturing subpatterns, the -corresponding captured values may have been set in previous iterations. For -example, after -.sp - /(a|(b))+/ -.sp -matches "aba" the value of the second captured substring is "b". -. -. -.\" HTML -.SH "ATOMIC GROUPING AND POSSESSIVE QUANTIFIERS" -.rs -.sp -With both maximizing ("greedy") and minimizing ("ungreedy" or "lazy") -repetition, failure of what follows normally causes the repeated item to be -re-evaluated to see if a different number of repeats allows the rest of the -pattern to match. Sometimes it is useful to prevent this, either to change the -nature of the match, or to cause it fail earlier than it otherwise might, when -the author of the pattern knows there is no point in carrying on. -.P -Consider, for example, the pattern \ed+foo when applied to the subject line -.sp - 123456bar -.sp -After matching all 6 digits and then failing to match "foo", the normal -action of the matcher is to try again with only 5 digits matching the \ed+ -item, and then with 4, and so on, before ultimately failing. "Atomic grouping" -(a term taken from Jeffrey Friedl's book) provides the means for specifying -that once a subpattern has matched, it is not to be re-evaluated in this way. -.P -If we use atomic grouping for the previous example, the matcher gives up -immediately on failing to match "foo" the first time. The notation is a kind of -special parenthesis, starting with (?> as in this example: -.sp - (?>\ed+)foo -.sp -This kind of parenthesis "locks up" the part of the pattern it contains once -it has matched, and a failure further into the pattern is prevented from -backtracking into it. Backtracking past it to previous items, however, works as -normal. -.P -An alternative description is that a subpattern of this type matches the string -of characters that an identical standalone pattern would match, if anchored at -the current point in the subject string. -.P -Atomic grouping subpatterns are not capturing subpatterns. Simple cases such as -the above example can be thought of as a maximizing repeat that must swallow -everything it can. So, while both \ed+ and \ed+? are prepared to adjust the -number of digits they match in order to make the rest of the pattern match, -(?>\ed+) can only match an entire sequence of digits. -.P -Atomic groups in general can of course contain arbitrarily complicated -subpatterns, and can be nested. However, when the subpattern for an atomic -group is just a single repeated item, as in the example above, a simpler -notation, called a "possessive quantifier" can be used. This consists of an -additional + character following a quantifier. Using this notation, the -previous example can be rewritten as -.sp - \ed++foo -.sp -Note that a possessive quantifier can be used with an entire group, for -example: -.sp - (abc|xyz){2,3}+ -.sp -Possessive quantifiers are always greedy; the setting of the PCRE_UNGREEDY -option is ignored. They are a convenient notation for the simpler forms of -atomic group. However, there is no difference in the meaning of a possessive -quantifier and the equivalent atomic group, though there may be a performance -difference; possessive quantifiers should be slightly faster. -.P -The possessive quantifier syntax is an extension to the Perl 5.8 syntax. -Jeffrey Friedl originated the idea (and the name) in the first edition of his -book. Mike McCloskey liked it, so implemented it when he built Sun's Java -package, and PCRE copied it from there. It ultimately found its way into Perl -at release 5.10. -.P -PCRE has an optimization that automatically "possessifies" certain simple -pattern constructs. For example, the sequence A+B is treated as A++B because -there is no point in backtracking into a sequence of A's when B must follow. -.P -When a pattern contains an unlimited repeat inside a subpattern that can itself -be repeated an unlimited number of times, the use of an atomic group is the -only way to avoid some failing matches taking a very long time indeed. The -pattern -.sp - (\eD+|<\ed+>)*[!?] -.sp -matches an unlimited number of substrings that either consist of non-digits, or -digits enclosed in <>, followed by either ! or ?. When it matches, it runs -quickly. However, if it is applied to -.sp - aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -.sp -it takes a long time before reporting failure. This is because the string can -be divided between the internal \eD+ repeat and the external * repeat in a -large number of ways, and all have to be tried. (The example uses [!?] rather -than a single character at the end, because both PCRE and Perl have an -optimization that allows for fast failure when a single character is used. They -remember the last single character that is required for a match, and fail early -if it is not present in the string.) If the pattern is changed so that it uses -an atomic group, like this: -.sp - ((?>\eD+)|<\ed+>)*[!?] -.sp -sequences of non-digits cannot be broken, and failure happens quickly. -. -. -.\" HTML -.SH "BACK REFERENCES" -.rs -.sp -Outside a character class, a backslash followed by a digit greater than 0 (and -possibly further digits) is a back reference to a capturing subpattern earlier -(that is, to its left) in the pattern, provided there have been that many -previous capturing left parentheses. -.P -However, if the decimal number following the backslash is less than 10, it is -always taken as a back reference, and causes an error only if there are not -that many capturing left parentheses in the entire pattern. In other words, the -parentheses that are referenced need not be to the left of the reference for -numbers less than 10. A "forward back reference" of this type can make sense -when a repetition is involved and the subpattern to the right has participated -in an earlier iteration. -.P -It is not possible to have a numerical "forward back reference" to a subpattern -whose number is 10 or more using this syntax because a sequence such as \e50 is -interpreted as a character defined in octal. See the subsection entitled -"Non-printing characters" -.\" HTML -.\" -above -.\" -for further details of the handling of digits following a backslash. There is -no such problem when named parentheses are used. A back reference to any -subpattern is possible using named parentheses (see below). -.P -Another way of avoiding the ambiguity inherent in the use of digits following a -backslash is to use the \eg escape sequence. This escape must be followed by an -unsigned number or a negative number, optionally enclosed in braces. These -examples are all identical: -.sp - (ring), \e1 - (ring), \eg1 - (ring), \eg{1} -.sp -An unsigned number specifies an absolute reference without the ambiguity that -is present in the older syntax. It is also useful when literal digits follow -the reference. A negative number is a relative reference. Consider this -example: -.sp - (abc(def)ghi)\eg{-1} -.sp -The sequence \eg{-1} is a reference to the most recently started capturing -subpattern before \eg, that is, is it equivalent to \e2 in this example. -Similarly, \eg{-2} would be equivalent to \e1. The use of relative references -can be helpful in long patterns, and also in patterns that are created by -joining together fragments that contain references within themselves. -.P -A back reference matches whatever actually matched the capturing subpattern in -the current subject string, rather than anything matching the subpattern -itself (see -.\" HTML -.\" -"Subpatterns as subroutines" -.\" -below for a way of doing that). So the pattern -.sp - (sens|respons)e and \e1ibility -.sp -matches "sense and sensibility" and "response and responsibility", but not -"sense and responsibility". If caseful matching is in force at the time of the -back reference, the case of letters is relevant. For example, -.sp - ((?i)rah)\es+\e1 -.sp -matches "rah rah" and "RAH RAH", but not "RAH rah", even though the original -capturing subpattern is matched caselessly. -.P -There are several different ways of writing back references to named -subpatterns. The .NET syntax \ek{name} and the Perl syntax \ek or -\ek'name' are supported, as is the Python syntax (?P=name). Perl 5.10's unified -back reference syntax, in which \eg can be used for both numeric and named -references, is also supported. We could rewrite the above example in any of -the following ways: -.sp - (?(?i)rah)\es+\ek - (?'p1'(?i)rah)\es+\ek{p1} - (?P(?i)rah)\es+(?P=p1) - (?(?i)rah)\es+\eg{p1} -.sp -A subpattern that is referenced by name may appear in the pattern before or -after the reference. -.P -There may be more than one back reference to the same subpattern. If a -subpattern has not actually been used in a particular match, any back -references to it always fail by default. For example, the pattern -.sp - (a|(bc))\e2 -.sp -always fails if it starts to match "a" rather than "bc". However, if the -PCRE_JAVASCRIPT_COMPAT option is set at compile time, a back reference to an -unset value matches an empty string. -.P -Because there may be many capturing parentheses in a pattern, all digits -following a backslash are taken as part of a potential back reference number. -If the pattern continues with a digit character, some delimiter must be used to -terminate the back reference. If the PCRE_EXTENDED option is set, this can be -white space. Otherwise, the \eg{ syntax or an empty comment (see -.\" HTML -.\" -"Comments" -.\" -below) can be used. -. -.SS "Recursive back references" -.rs -.sp -A back reference that occurs inside the parentheses to which it refers fails -when the subpattern is first used, so, for example, (a\e1) never matches. -However, such references can be useful inside repeated subpatterns. For -example, the pattern -.sp - (a|b\e1)+ -.sp -matches any number of "a"s and also "aba", "ababbaa" etc. At each iteration of -the subpattern, the back reference matches the character string corresponding -to the previous iteration. In order for this to work, the pattern must be such -that the first iteration does not need to match the back reference. This can be -done using alternation, as in the example above, or by a quantifier with a -minimum of zero. -.P -Back references of this type cause the group that they reference to be treated -as an -.\" HTML -.\" -atomic group. -.\" -Once the whole group has been matched, a subsequent matching failure cannot -cause backtracking into the middle of the group. -. -. -.\" HTML -.SH ASSERTIONS -.rs -.sp -An assertion is a test on the characters following or preceding the current -matching point that does not actually consume any characters. The simple -assertions coded as \eb, \eB, \eA, \eG, \eZ, \ez, ^ and $ are described -.\" HTML -.\" -above. -.\" -.P -More complicated assertions are coded as subpatterns. There are two kinds: -those that look ahead of the current position in the subject string, and those -that look behind it. An assertion subpattern is matched in the normal way, -except that it does not cause the current matching position to be changed. -.P -Assertion subpatterns are not capturing subpatterns. If such an assertion -contains capturing subpatterns within it, these are counted for the purposes of -numbering the capturing subpatterns in the whole pattern. However, substring -capturing is carried out only for positive assertions. (Perl sometimes, but not -always, does do capturing in negative assertions.) -.P -WARNING: If a positive assertion containing one or more capturing subpatterns -succeeds, but failure to match later in the pattern causes backtracking over -this assertion, the captures within the assertion are reset only if no higher -numbered captures are already set. This is, unfortunately, a fundamental -limitation of the current implementation, and as PCRE1 is now in -maintenance-only status, it is unlikely ever to change. -.P -For compatibility with Perl, assertion subpatterns may be repeated; though -it makes no sense to assert the same thing several times, the side effect of -capturing parentheses may occasionally be useful. In practice, there only three -cases: -.sp -(1) If the quantifier is {0}, the assertion is never obeyed during matching. -However, it may contain internal capturing parenthesized groups that are called -from elsewhere via the -.\" HTML -.\" -subroutine mechanism. -.\" -.sp -(2) If quantifier is {0,n} where n is greater than zero, it is treated as if it -were {0,1}. At run time, the rest of the pattern match is tried with and -without the assertion, the order depending on the greediness of the quantifier. -.sp -(3) If the minimum repetition is greater than zero, the quantifier is ignored. -The assertion is obeyed just once when encountered during matching. -. -. -.SS "Lookahead assertions" -.rs -.sp -Lookahead assertions start with (?= for positive assertions and (?! for -negative assertions. For example, -.sp - \ew+(?=;) -.sp -matches a word followed by a semicolon, but does not include the semicolon in -the match, and -.sp - foo(?!bar) -.sp -matches any occurrence of "foo" that is not followed by "bar". Note that the -apparently similar pattern -.sp - (?!foo)bar -.sp -does not find an occurrence of "bar" that is preceded by something other than -"foo"; it finds any occurrence of "bar" whatsoever, because the assertion -(?!foo) is always true when the next three characters are "bar". A -lookbehind assertion is needed to achieve the other effect. -.P -If you want to force a matching failure at some point in a pattern, the most -convenient way to do it is with (?!) because an empty string always matches, so -an assertion that requires there not to be an empty string must always fail. -The backtracking control verb (*FAIL) or (*F) is a synonym for (?!). -. -. -.\" HTML -.SS "Lookbehind assertions" -.rs -.sp -Lookbehind assertions start with (?<= for positive assertions and (? -.\" -(see above) -.\" -can be used instead of a lookbehind assertion to get round the fixed-length -restriction. -.P -The implementation of lookbehind assertions is, for each alternative, to -temporarily move the current position back by the fixed length and then try to -match. If there are insufficient characters before the current position, the -assertion fails. -.P -In a UTF mode, PCRE does not allow the \eC escape (which matches a single data -unit even in a UTF mode) to appear in lookbehind assertions, because it makes -it impossible to calculate the length of the lookbehind. The \eX and \eR -escapes, which can match different numbers of data units, are also not -permitted. -.P -.\" HTML -.\" -"Subroutine" -.\" -calls (see below) such as (?2) or (?&X) are permitted in lookbehinds, as long -as the subpattern matches a fixed-length string. -.\" HTML -.\" -Recursion, -.\" -however, is not supported. -.P -Possessive quantifiers can be used in conjunction with lookbehind assertions to -specify efficient matching of fixed-length strings at the end of subject -strings. Consider a simple pattern such as -.sp - abcd$ -.sp -when applied to a long string that does not match. Because matching proceeds -from left to right, PCRE will look for each "a" in the subject and then see if -what follows matches the rest of the pattern. If the pattern is specified as -.sp - ^.*abcd$ -.sp -the initial .* matches the entire string at first, but when this fails (because -there is no following "a"), it backtracks to match all but the last character, -then all but the last two characters, and so on. Once again the search for "a" -covers the entire string, from right to left, so we are no better off. However, -if the pattern is written as -.sp - ^.*+(?<=abcd) -.sp -there can be no backtracking for the .*+ item; it can match only the entire -string. The subsequent lookbehind assertion does a single test on the last four -characters. If it fails, the match fails immediately. For long strings, this -approach makes a significant difference to the processing time. -. -. -.SS "Using multiple assertions" -.rs -.sp -Several assertions (of any sort) may occur in succession. For example, -.sp - (?<=\ed{3})(? -.SH "CONDITIONAL SUBPATTERNS" -.rs -.sp -It is possible to cause the matching process to obey a subpattern -conditionally or to choose between two alternative subpatterns, depending on -the result of an assertion, or whether a specific capturing subpattern has -already been matched. The two possible forms of conditional subpattern are: -.sp - (?(condition)yes-pattern) - (?(condition)yes-pattern|no-pattern) -.sp -If the condition is satisfied, the yes-pattern is used; otherwise the -no-pattern (if present) is used. If there are more than two alternatives in the -subpattern, a compile-time error occurs. Each of the two alternatives may -itself contain nested subpatterns of any form, including conditional -subpatterns; the restriction to two alternatives applies only at the level of -the condition. This pattern fragment is an example where the alternatives are -complex: -.sp - (?(1) (A|B|C) | (D | (?(2)E|F) | E) ) -.sp -.P -There are four kinds of condition: references to subpatterns, references to -recursion, a pseudo-condition called DEFINE, and assertions. -. -.SS "Checking for a used subpattern by number" -.rs -.sp -If the text between the parentheses consists of a sequence of digits, the -condition is true if a capturing subpattern of that number has previously -matched. If there is more than one capturing subpattern with the same number -(see the earlier -.\" -.\" HTML -.\" -section about duplicate subpattern numbers), -.\" -the condition is true if any of them have matched. An alternative notation is -to precede the digits with a plus or minus sign. In this case, the subpattern -number is relative rather than absolute. The most recently opened parentheses -can be referenced by (?(-1), the next most recent by (?(-2), and so on. Inside -loops it can also make sense to refer to subsequent groups. The next -parentheses to be opened can be referenced as (?(+1), and so on. (The value -zero in any of these forms is not used; it provokes a compile-time error.) -.P -Consider the following pattern, which contains non-significant white space to -make it more readable (assume the PCRE_EXTENDED option) and to divide it into -three parts for ease of discussion: -.sp - ( \e( )? [^()]+ (?(1) \e) ) -.sp -The first part matches an optional opening parenthesis, and if that -character is present, sets it as the first captured substring. The second part -matches one or more characters that are not parentheses. The third part is a -conditional subpattern that tests whether or not the first set of parentheses -matched. If they did, that is, if subject started with an opening parenthesis, -the condition is true, and so the yes-pattern is executed and a closing -parenthesis is required. Otherwise, since no-pattern is not present, the -subpattern matches nothing. In other words, this pattern matches a sequence of -non-parentheses, optionally enclosed in parentheses. -.P -If you were embedding this pattern in a larger one, you could use a relative -reference: -.sp - ...other stuff... ( \e( )? [^()]+ (?(-1) \e) ) ... -.sp -This makes the fragment independent of the parentheses in the larger pattern. -. -.SS "Checking for a used subpattern by name" -.rs -.sp -Perl uses the syntax (?()...) or (?('name')...) to test for a used -subpattern by name. For compatibility with earlier versions of PCRE, which had -this facility before Perl, the syntax (?(name)...) is also recognized. -.P -Rewriting the above example to use a named subpattern gives this: -.sp - (? \e( )? [^()]+ (?() \e) ) -.sp -If the name used in a condition of this kind is a duplicate, the test is -applied to all subpatterns of the same name, and is true if any one of them has -matched. -. -.SS "Checking for pattern recursion" -.rs -.sp -If the condition is the string (R), and there is no subpattern with the name R, -the condition is true if a recursive call to the whole pattern or any -subpattern has been made. If digits or a name preceded by ampersand follow the -letter R, for example: -.sp - (?(R3)...) or (?(R&name)...) -.sp -the condition is true if the most recent recursion is into a subpattern whose -number or name is given. This condition does not check the entire recursion -stack. If the name used in a condition of this kind is a duplicate, the test is -applied to all subpatterns of the same name, and is true if any one of them is -the most recent recursion. -.P -At "top level", all these recursion test conditions are false. -.\" HTML -.\" -The syntax for recursive patterns -.\" -is described below. -. -.\" HTML -.SS "Defining subpatterns for use by reference only" -.rs -.sp -If the condition is the string (DEFINE), and there is no subpattern with the -name DEFINE, the condition is always false. In this case, there may be only one -alternative in the subpattern. It is always skipped if control reaches this -point in the pattern; the idea of DEFINE is that it can be used to define -subroutines that can be referenced from elsewhere. (The use of -.\" HTML -.\" -subroutines -.\" -is described below.) For example, a pattern to match an IPv4 address such as -"192.168.23.245" could be written like this (ignore white space and line -breaks): -.sp - (?(DEFINE) (? 2[0-4]\ed | 25[0-5] | 1\ed\ed | [1-9]?\ed) ) - \eb (?&byte) (\e.(?&byte)){3} \eb -.sp -The first part of the pattern is a DEFINE group inside which a another group -named "byte" is defined. This matches an individual component of an IPv4 -address (a number less than 256). When matching takes place, this part of the -pattern is skipped because DEFINE acts like a false condition. The rest of the -pattern uses references to the named group to match the four dot-separated -components of an IPv4 address, insisting on a word boundary at each end. -. -.SS "Assertion conditions" -.rs -.sp -If the condition is not in any of the above formats, it must be an assertion. -This may be a positive or negative lookahead or lookbehind assertion. Consider -this pattern, again containing non-significant white space, and with the two -alternatives on the second line: -.sp - (?(?=[^a-z]*[a-z]) - \ed{2}-[a-z]{3}-\ed{2} | \ed{2}-\ed{2}-\ed{2} ) -.sp -The condition is a positive lookahead assertion that matches an optional -sequence of non-letters followed by a letter. In other words, it tests for the -presence of at least one letter in the subject. If a letter is found, the -subject is matched against the first alternative; otherwise it is matched -against the second. This pattern matches strings in one of the two forms -dd-aaa-dd or dd-dd-dd, where aaa are letters and dd are digits. -. -. -.\" HTML -.SH COMMENTS -.rs -.sp -There are two ways of including comments in patterns that are processed by -PCRE. In both cases, the start of the comment must not be in a character class, -nor in the middle of any other sequence of related characters such as (?: or a -subpattern name or number. The characters that make up a comment play no part -in the pattern matching. -.P -The sequence (?# marks the start of a comment that continues up to the next -closing parenthesis. Nested parentheses are not permitted. If the PCRE_EXTENDED -option is set, an unescaped # character also introduces a comment, which in -this case continues to immediately after the next newline character or -character sequence in the pattern. Which characters are interpreted as newlines -is controlled by the options passed to a compiling function or by a special -sequence at the start of the pattern, as described in the section entitled -.\" HTML -.\" -"Newline conventions" -.\" -above. Note that the end of this type of comment is a literal newline sequence -in the pattern; escape sequences that happen to represent a newline do not -count. For example, consider this pattern when PCRE_EXTENDED is set, and the -default newline convention is in force: -.sp - abc #comment \en still comment -.sp -On encountering the # character, \fBpcre_compile()\fP skips along, looking for -a newline in the pattern. The sequence \en is still literal at this stage, so -it does not terminate the comment. Only an actual character with the code value -0x0a (the default newline) does so. -. -. -.\" HTML -.SH "RECURSIVE PATTERNS" -.rs -.sp -Consider the problem of matching a string in parentheses, allowing for -unlimited nested parentheses. Without the use of recursion, the best that can -be done is to use a pattern that matches up to some fixed depth of nesting. It -is not possible to handle an arbitrary nesting depth. -.P -For some time, Perl has provided a facility that allows regular expressions to -recurse (amongst other things). It does this by interpolating Perl code in the -expression at run time, and the code can refer to the expression itself. A Perl -pattern using code interpolation to solve the parentheses problem can be -created like this: -.sp - $re = qr{\e( (?: (?>[^()]+) | (?p{$re}) )* \e)}x; -.sp -The (?p{...}) item interpolates Perl code at run time, and in this case refers -recursively to the pattern in which it appears. -.P -Obviously, PCRE cannot support the interpolation of Perl code. Instead, it -supports special syntax for recursion of the entire pattern, and also for -individual subpattern recursion. After its introduction in PCRE and Python, -this kind of recursion was subsequently introduced into Perl at release 5.10. -.P -A special item that consists of (? followed by a number greater than zero and a -closing parenthesis is a recursive subroutine call of the subpattern of the -given number, provided that it occurs inside that subpattern. (If not, it is a -.\" HTML -.\" -non-recursive subroutine -.\" -call, which is described in the next section.) The special item (?R) or (?0) is -a recursive call of the entire regular expression. -.P -This PCRE pattern solves the nested parentheses problem (assume the -PCRE_EXTENDED option is set so that white space is ignored): -.sp - \e( ( [^()]++ | (?R) )* \e) -.sp -First it matches an opening parenthesis. Then it matches any number of -substrings which can either be a sequence of non-parentheses, or a recursive -match of the pattern itself (that is, a correctly parenthesized substring). -Finally there is a closing parenthesis. Note the use of a possessive quantifier -to avoid backtracking into sequences of non-parentheses. -.P -If this were part of a larger pattern, you would not want to recurse the entire -pattern, so instead you could use this: -.sp - ( \e( ( [^()]++ | (?1) )* \e) ) -.sp -We have put the pattern into parentheses, and caused the recursion to refer to -them instead of the whole pattern. -.P -In a larger pattern, keeping track of parenthesis numbers can be tricky. This -is made easier by the use of relative references. Instead of (?1) in the -pattern above you can write (?-2) to refer to the second most recently opened -parentheses preceding the recursion. In other words, a negative number counts -capturing parentheses leftwards from the point at which it is encountered. -.P -It is also possible to refer to subsequently opened parentheses, by writing -references such as (?+2). However, these cannot be recursive because the -reference is not inside the parentheses that are referenced. They are always -.\" HTML -.\" -non-recursive subroutine -.\" -calls, as described in the next section. -.P -An alternative approach is to use named parentheses instead. The Perl syntax -for this is (?&name); PCRE's earlier syntax (?P>name) is also supported. We -could rewrite the above example as follows: -.sp - (? \e( ( [^()]++ | (?&pn) )* \e) ) -.sp -If there is more than one subpattern with the same name, the earliest one is -used. -.P -This particular example pattern that we have been looking at contains nested -unlimited repeats, and so the use of a possessive quantifier for matching -strings of non-parentheses is important when applying the pattern to strings -that do not match. For example, when this pattern is applied to -.sp - (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa() -.sp -it yields "no match" quickly. However, if a possessive quantifier is not used, -the match runs for a very long time indeed because there are so many different -ways the + and * repeats can carve up the subject, and all have to be tested -before failure can be reported. -.P -At the end of a match, the values of capturing parentheses are those from -the outermost level. If you want to obtain intermediate values, a callout -function can be used (see below and the -.\" HREF -\fBpcrecallout\fP -.\" -documentation). If the pattern above is matched against -.sp - (ab(cd)ef) -.sp -the value for the inner capturing parentheses (numbered 2) is "ef", which is -the last value taken on at the top level. If a capturing subpattern is not -matched at the top level, its final captured value is unset, even if it was -(temporarily) set at a deeper level during the matching process. -.P -If there are more than 15 capturing parentheses in a pattern, PCRE has to -obtain extra memory to store data during a recursion, which it does by using -\fBpcre_malloc\fP, freeing it via \fBpcre_free\fP afterwards. If no memory can -be obtained, the match fails with the PCRE_ERROR_NOMEMORY error. -.P -Do not confuse the (?R) item with the condition (R), which tests for recursion. -Consider this pattern, which matches text in angle brackets, allowing for -arbitrary nesting. Only digits are allowed in nested brackets (that is, when -recursing), whereas any characters are permitted at the outer level. -.sp - < (?: (?(R) \ed++ | [^<>]*+) | (?R)) * > -.sp -In this pattern, (?(R) is the start of a conditional subpattern, with two -different alternatives for the recursive and non-recursive cases. The (?R) item -is the actual recursive call. -. -. -.\" HTML -.SS "Differences in recursion processing between PCRE and Perl" -.rs -.sp -Recursion processing in PCRE differs from Perl in two important ways. In PCRE -(like Python, but unlike Perl), a recursive subpattern call is always treated -as an atomic group. That is, once it has matched some of the subject string, it -is never re-entered, even if it contains untried alternatives and there is a -subsequent matching failure. This can be illustrated by the following pattern, -which purports to match a palindromic string that contains an odd number of -characters (for example, "a", "aba", "abcba", "abcdcba"): -.sp - ^(.|(.)(?1)\e2)$ -.sp -The idea is that it either matches a single character, or two identical -characters surrounding a sub-palindrome. In Perl, this pattern works; in PCRE -it does not if the pattern is longer than three characters. Consider the -subject string "abcba": -.P -At the top level, the first character is matched, but as it is not at the end -of the string, the first alternative fails; the second alternative is taken -and the recursion kicks in. The recursive call to subpattern 1 successfully -matches the next character ("b"). (Note that the beginning and end of line -tests are not part of the recursion). -.P -Back at the top level, the next character ("c") is compared with what -subpattern 2 matched, which was "a". This fails. Because the recursion is -treated as an atomic group, there are now no backtracking points, and so the -entire match fails. (Perl is able, at this point, to re-enter the recursion and -try the second alternative.) However, if the pattern is written with the -alternatives in the other order, things are different: -.sp - ^((.)(?1)\e2|.)$ -.sp -This time, the recursing alternative is tried first, and continues to recurse -until it runs out of characters, at which point the recursion fails. But this -time we do have another alternative to try at the higher level. That is the big -difference: in the previous case the remaining alternative is at a deeper -recursion level, which PCRE cannot use. -.P -To change the pattern so that it matches all palindromic strings, not just -those with an odd number of characters, it is tempting to change the pattern to -this: -.sp - ^((.)(?1)\e2|.?)$ -.sp -Again, this works in Perl, but not in PCRE, and for the same reason. When a -deeper recursion has matched a single character, it cannot be entered again in -order to match an empty string. The solution is to separate the two cases, and -write out the odd and even cases as alternatives at the higher level: -.sp - ^(?:((.)(?1)\e2|)|((.)(?3)\e4|.)) -.sp -If you want to match typical palindromic phrases, the pattern has to ignore all -non-word characters, which can be done like this: -.sp - ^\eW*+(?:((.)\eW*+(?1)\eW*+\e2|)|((.)\eW*+(?3)\eW*+\e4|\eW*+.\eW*+))\eW*+$ -.sp -If run with the PCRE_CASELESS option, this pattern matches phrases such as "A -man, a plan, a canal: Panama!" and it works well in both PCRE and Perl. Note -the use of the possessive quantifier *+ to avoid backtracking into sequences of -non-word characters. Without this, PCRE takes a great deal longer (ten times or -more) to match typical phrases, and Perl takes so long that you think it has -gone into a loop. -.P -\fBWARNING\fP: The palindrome-matching patterns above work only if the subject -string does not start with a palindrome that is shorter than the entire string. -For example, although "abcba" is correctly matched, if the subject is "ababa", -PCRE finds the palindrome "aba" at the start, then fails at top level because -the end of the string does not follow. Once again, it cannot jump back into the -recursion to try other alternatives, so the entire match fails. -.P -The second way in which PCRE and Perl differ in their recursion processing is -in the handling of captured values. In Perl, when a subpattern is called -recursively or as a subpattern (see the next section), it has no access to any -values that were captured outside the recursion, whereas in PCRE these values -can be referenced. Consider this pattern: -.sp - ^(.)(\e1|a(?2)) -.sp -In PCRE, this pattern matches "bab". The first capturing parentheses match "b", -then in the second group, when the back reference \e1 fails to match "b", the -second alternative matches "a" and then recurses. In the recursion, \e1 does -now match "b" and so the whole match succeeds. In Perl, the pattern fails to -match because inside the recursive call \e1 cannot access the externally set -value. -. -. -.\" HTML -.SH "SUBPATTERNS AS SUBROUTINES" -.rs -.sp -If the syntax for a recursive subpattern call (either by number or by -name) is used outside the parentheses to which it refers, it operates like a -subroutine in a programming language. The called subpattern may be defined -before or after the reference. A numbered reference can be absolute or -relative, as in these examples: -.sp - (...(absolute)...)...(?2)... - (...(relative)...)...(?-1)... - (...(?+1)...(relative)... -.sp -An earlier example pointed out that the pattern -.sp - (sens|respons)e and \e1ibility -.sp -matches "sense and sensibility" and "response and responsibility", but not -"sense and responsibility". If instead the pattern -.sp - (sens|respons)e and (?1)ibility -.sp -is used, it does match "sense and responsibility" as well as the other two -strings. Another example is given in the discussion of DEFINE above. -.P -All subroutine calls, whether recursive or not, are always treated as atomic -groups. That is, once a subroutine has matched some of the subject string, it -is never re-entered, even if it contains untried alternatives and there is a -subsequent matching failure. Any capturing parentheses that are set during the -subroutine call revert to their previous values afterwards. -.P -Processing options such as case-independence are fixed when a subpattern is -defined, so if it is used as a subroutine, such options cannot be changed for -different calls. For example, consider this pattern: -.sp - (abc)(?i:(?-1)) -.sp -It matches "abcabc". It does not match "abcABC" because the change of -processing option does not affect the called subpattern. -. -. -.\" HTML -.SH "ONIGURUMA SUBROUTINE SYNTAX" -.rs -.sp -For compatibility with Oniguruma, the non-Perl syntax \eg followed by a name or -a number enclosed either in angle brackets or single quotes, is an alternative -syntax for referencing a subpattern as a subroutine, possibly recursively. Here -are two of the examples used above, rewritten using this syntax: -.sp - (? \e( ( (?>[^()]+) | \eg )* \e) ) - (sens|respons)e and \eg'1'ibility -.sp -PCRE supports an extension to Oniguruma: if a number is preceded by a -plus or a minus sign it is taken as a relative reference. For example: -.sp - (abc)(?i:\eg<-1>) -.sp -Note that \eg{...} (Perl syntax) and \eg<...> (Oniguruma syntax) are \fInot\fP -synonymous. The former is a back reference; the latter is a subroutine call. -. -. -.SH CALLOUTS -.rs -.sp -Perl has a feature whereby using the sequence (?{...}) causes arbitrary Perl -code to be obeyed in the middle of matching a regular expression. This makes it -possible, amongst other things, to extract different substrings that match the -same pair of parentheses when there is a repetition. -.P -PCRE provides a similar feature, but of course it cannot obey arbitrary Perl -code. The feature is called "callout". The caller of PCRE provides an external -function by putting its entry point in the global variable \fIpcre_callout\fP -(8-bit library) or \fIpcre[16|32]_callout\fP (16-bit or 32-bit library). -By default, this variable contains NULL, which disables all calling out. -.P -Within a regular expression, (?C) indicates the points at which the external -function is to be called. If you want to identify different callout points, you -can put a number less than 256 after the letter C. The default value is zero. -For example, this pattern has two callout points: -.sp - (?C1)abc(?C2)def -.sp -If the PCRE_AUTO_CALLOUT flag is passed to a compiling function, callouts are -automatically installed before each item in the pattern. They are all numbered -255. If there is a conditional group in the pattern whose condition is an -assertion, an additional callout is inserted just before the condition. An -explicit callout may also be set at this position, as in this example: -.sp - (?(?C9)(?=a)abc|def) -.sp -Note that this applies only to assertion conditions, not to other types of -condition. -.P -During matching, when PCRE reaches a callout point, the external function is -called. It is provided with the number of the callout, the position in the -pattern, and, optionally, one item of data originally supplied by the caller of -the matching function. The callout function may cause matching to proceed, to -backtrack, or to fail altogether. -.P -By default, PCRE implements a number of optimizations at compile time and -matching time, and one side-effect is that sometimes callouts are skipped. If -you need all possible callouts to happen, you need to set options that disable -the relevant optimizations. More details, and a complete description of the -interface to the callout function, are given in the -.\" HREF -\fBpcrecallout\fP -.\" -documentation. -. -. -.\" HTML -.SH "BACKTRACKING CONTROL" -.rs -.sp -Perl 5.10 introduced a number of "Special Backtracking Control Verbs", which -are still described in the Perl documentation as "experimental and subject to -change or removal in a future version of Perl". It goes on to say: "Their usage -in production code should be noted to avoid problems during upgrades." The same -remarks apply to the PCRE features described in this section. -.P -The new verbs make use of what was previously invalid syntax: an opening -parenthesis followed by an asterisk. They are generally of the form -(*VERB) or (*VERB:NAME). Some may take either form, possibly behaving -differently depending on whether or not a name is present. A name is any -sequence of characters that does not include a closing parenthesis. The maximum -length of name is 255 in the 8-bit library and 65535 in the 16-bit and 32-bit -libraries. If the name is empty, that is, if the closing parenthesis -immediately follows the colon, the effect is as if the colon were not there. -Any number of these verbs may occur in a pattern. -.P -Since these verbs are specifically related to backtracking, most of them can be -used only when the pattern is to be matched using one of the traditional -matching functions, because these use a backtracking algorithm. With the -exception of (*FAIL), which behaves like a failing negative assertion, the -backtracking control verbs cause an error if encountered by a DFA matching -function. -.P -The behaviour of these verbs in -.\" HTML -.\" -repeated groups, -.\" -.\" HTML -.\" -assertions, -.\" -and in -.\" HTML -.\" -subpatterns called as subroutines -.\" -(whether or not recursively) is documented below. -. -. -.\" HTML -.SS "Optimizations that affect backtracking verbs" -.rs -.sp -PCRE contains some optimizations that are used to speed up matching by running -some checks at the start of each match attempt. For example, it may know the -minimum length of matching subject, or that a particular character must be -present. When one of these optimizations bypasses the running of a match, any -included backtracking verbs will not, of course, be processed. You can suppress -the start-of-match optimizations by setting the PCRE_NO_START_OPTIMIZE option -when calling \fBpcre_compile()\fP or \fBpcre_exec()\fP, or by starting the -pattern with (*NO_START_OPT). There is more discussion of this option in the -section entitled -.\" HTML -.\" -"Option bits for \fBpcre_exec()\fP" -.\" -in the -.\" HREF -\fBpcreapi\fP -.\" -documentation. -.P -Experiments with Perl suggest that it too has similar optimizations, sometimes -leading to anomalous results. -. -. -.SS "Verbs that act immediately" -.rs -.sp -The following verbs act as soon as they are encountered. They may not be -followed by a name. -.sp - (*ACCEPT) -.sp -This verb causes the match to end successfully, skipping the remainder of the -pattern. However, when it is inside a subpattern that is called as a -subroutine, only that subpattern is ended successfully. Matching then continues -at the outer level. If (*ACCEPT) in triggered in a positive assertion, the -assertion succeeds; in a negative assertion, the assertion fails. -.P -If (*ACCEPT) is inside capturing parentheses, the data so far is captured. For -example: -.sp - A((?:A|B(*ACCEPT)|C)D) -.sp -This matches "AB", "AAD", or "ACD"; when it matches "AB", "B" is captured by -the outer parentheses. -.sp - (*FAIL) or (*F) -.sp -This verb causes a matching failure, forcing backtracking to occur. It is -equivalent to (?!) but easier to read. The Perl documentation notes that it is -probably useful only when combined with (?{}) or (??{}). Those are, of course, -Perl features that are not present in PCRE. The nearest equivalent is the -callout feature, as for example in this pattern: -.sp - a+(?C)(*FAIL) -.sp -A match with the string "aaaa" always fails, but the callout is taken before -each backtrack happens (in this example, 10 times). -. -. -.SS "Recording which path was taken" -.rs -.sp -There is one verb whose main purpose is to track how a match was arrived at, -though it also has a secondary use in conjunction with advancing the match -starting point (see (*SKIP) below). -.sp - (*MARK:NAME) or (*:NAME) -.sp -A name is always required with this verb. There may be as many instances of -(*MARK) as you like in a pattern, and their names do not have to be unique. -.P -When a match succeeds, the name of the last-encountered (*MARK:NAME), -(*PRUNE:NAME), or (*THEN:NAME) on the matching path is passed back to the -caller as described in the section entitled -.\" HTML -.\" -"Extra data for \fBpcre_exec()\fP" -.\" -in the -.\" HREF -\fBpcreapi\fP -.\" -documentation. Here is an example of \fBpcretest\fP output, where the /K -modifier requests the retrieval and outputting of (*MARK) data: -.sp - re> /X(*MARK:A)Y|X(*MARK:B)Z/K - data> XY - 0: XY - MK: A - XZ - 0: XZ - MK: B -.sp -The (*MARK) name is tagged with "MK:" in this output, and in this example it -indicates which of the two alternatives matched. This is a more efficient way -of obtaining this information than putting each alternative in its own -capturing parentheses. -.P -If a verb with a name is encountered in a positive assertion that is true, the -name is recorded and passed back if it is the last-encountered. This does not -happen for negative assertions or failing positive assertions. -.P -After a partial match or a failed match, the last encountered name in the -entire match process is returned. For example: -.sp - re> /X(*MARK:A)Y|X(*MARK:B)Z/K - data> XP - No match, mark = B -.sp -Note that in this unanchored example the mark is retained from the match -attempt that started at the letter "X" in the subject. Subsequent match -attempts starting at "P" and then with an empty string do not get as far as the -(*MARK) item, but nevertheless do not reset it. -.P -If you are interested in (*MARK) values after failed matches, you should -probably set the PCRE_NO_START_OPTIMIZE option -.\" HTML -.\" -(see above) -.\" -to ensure that the match is always attempted. -. -. -.SS "Verbs that act after backtracking" -.rs -.sp -The following verbs do nothing when they are encountered. Matching continues -with what follows, but if there is no subsequent match, causing a backtrack to -the verb, a failure is forced. That is, backtracking cannot pass to the left of -the verb. However, when one of these verbs appears inside an atomic group or an -assertion that is true, its effect is confined to that group, because once the -group has been matched, there is never any backtracking into it. In this -situation, backtracking can "jump back" to the left of the entire atomic group -or assertion. (Remember also, as stated above, that this localization also -applies in subroutine calls.) -.P -These verbs differ in exactly what kind of failure occurs when backtracking -reaches them. The behaviour described below is what happens when the verb is -not in a subroutine or an assertion. Subsequent sections cover these special -cases. -.sp - (*COMMIT) -.sp -This verb, which may not be followed by a name, causes the whole match to fail -outright if there is a later matching failure that causes backtracking to reach -it. Even if the pattern is unanchored, no further attempts to find a match by -advancing the starting point take place. If (*COMMIT) is the only backtracking -verb that is encountered, once it has been passed \fBpcre_exec()\fP is -committed to finding a match at the current starting point, or not at all. For -example: -.sp - a+(*COMMIT)b -.sp -This matches "xxaab" but not "aacaab". It can be thought of as a kind of -dynamic anchor, or "I've started, so I must finish." The name of the most -recently passed (*MARK) in the path is passed back when (*COMMIT) forces a -match failure. -.P -If there is more than one backtracking verb in a pattern, a different one that -follows (*COMMIT) may be triggered first, so merely passing (*COMMIT) during a -match does not always guarantee that a match must be at this starting point. -.P -Note that (*COMMIT) at the start of a pattern is not the same as an anchor, -unless PCRE's start-of-match optimizations are turned off, as shown in this -output from \fBpcretest\fP: -.sp - re> /(*COMMIT)abc/ - data> xyzabc - 0: abc - data> xyzabc\eY - No match -.sp -For this pattern, PCRE knows that any match must start with "a", so the -optimization skips along the subject to "a" before applying the pattern to the -first set of data. The match attempt then succeeds. In the second set of data, -the escape sequence \eY is interpreted by the \fBpcretest\fP program. It causes -the PCRE_NO_START_OPTIMIZE option to be set when \fBpcre_exec()\fP is called. -This disables the optimization that skips along to the first character. The -pattern is now applied starting at "x", and so the (*COMMIT) causes the match -to fail without trying any other starting points. -.sp - (*PRUNE) or (*PRUNE:NAME) -.sp -This verb causes the match to fail at the current starting position in the -subject if there is a later matching failure that causes backtracking to reach -it. If the pattern is unanchored, the normal "bumpalong" advance to the next -starting character then happens. Backtracking can occur as usual to the left of -(*PRUNE), before it is reached, or when matching to the right of (*PRUNE), but -if there is no match to the right, backtracking cannot cross (*PRUNE). In -simple cases, the use of (*PRUNE) is just an alternative to an atomic group or -possessive quantifier, but there are some uses of (*PRUNE) that cannot be -expressed in any other way. In an anchored pattern (*PRUNE) has the same effect -as (*COMMIT). -.P -The behaviour of (*PRUNE:NAME) is the not the same as (*MARK:NAME)(*PRUNE). -It is like (*MARK:NAME) in that the name is remembered for passing back to the -caller. However, (*SKIP:NAME) searches only for names set with (*MARK). -.sp - (*SKIP) -.sp -This verb, when given without a name, is like (*PRUNE), except that if the -pattern is unanchored, the "bumpalong" advance is not to the next character, -but to the position in the subject where (*SKIP) was encountered. (*SKIP) -signifies that whatever text was matched leading up to it cannot be part of a -successful match. Consider: -.sp - a+(*SKIP)b -.sp -If the subject is "aaaac...", after the first match attempt fails (starting at -the first character in the string), the starting point skips on to start the -next attempt at "c". Note that a possessive quantifer does not have the same -effect as this example; although it would suppress backtracking during the -first match attempt, the second attempt would start at the second character -instead of skipping on to "c". -.sp - (*SKIP:NAME) -.sp -When (*SKIP) has an associated name, its behaviour is modified. When it is -triggered, the previous path through the pattern is searched for the most -recent (*MARK) that has the same name. If one is found, the "bumpalong" advance -is to the subject position that corresponds to that (*MARK) instead of to where -(*SKIP) was encountered. If no (*MARK) with a matching name is found, the -(*SKIP) is ignored. -.P -Note that (*SKIP:NAME) searches only for names set by (*MARK:NAME). It ignores -names that are set by (*PRUNE:NAME) or (*THEN:NAME). -.sp - (*THEN) or (*THEN:NAME) -.sp -This verb causes a skip to the next innermost alternative when backtracking -reaches it. That is, it cancels any further backtracking within the current -alternative. Its name comes from the observation that it can be used for a -pattern-based if-then-else block: -.sp - ( COND1 (*THEN) FOO | COND2 (*THEN) BAR | COND3 (*THEN) BAZ ) ... -.sp -If the COND1 pattern matches, FOO is tried (and possibly further items after -the end of the group if FOO succeeds); on failure, the matcher skips to the -second alternative and tries COND2, without backtracking into COND1. If that -succeeds and BAR fails, COND3 is tried. If subsequently BAZ fails, there are no -more alternatives, so there is a backtrack to whatever came before the entire -group. If (*THEN) is not inside an alternation, it acts like (*PRUNE). -.P -The behaviour of (*THEN:NAME) is the not the same as (*MARK:NAME)(*THEN). -It is like (*MARK:NAME) in that the name is remembered for passing back to the -caller. However, (*SKIP:NAME) searches only for names set with (*MARK). -.P -A subpattern that does not contain a | character is just a part of the -enclosing alternative; it is not a nested alternation with only one -alternative. The effect of (*THEN) extends beyond such a subpattern to the -enclosing alternative. Consider this pattern, where A, B, etc. are complex -pattern fragments that do not contain any | characters at this level: -.sp - A (B(*THEN)C) | D -.sp -If A and B are matched, but there is a failure in C, matching does not -backtrack into A; instead it moves to the next alternative, that is, D. -However, if the subpattern containing (*THEN) is given an alternative, it -behaves differently: -.sp - A (B(*THEN)C | (*FAIL)) | D -.sp -The effect of (*THEN) is now confined to the inner subpattern. After a failure -in C, matching moves to (*FAIL), which causes the whole subpattern to fail -because there are no more alternatives to try. In this case, matching does now -backtrack into A. -.P -Note that a conditional subpattern is not considered as having two -alternatives, because only one is ever used. In other words, the | character in -a conditional subpattern has a different meaning. Ignoring white space, -consider: -.sp - ^.*? (?(?=a) a | b(*THEN)c ) -.sp -If the subject is "ba", this pattern does not match. Because .*? is ungreedy, -it initially matches zero characters. The condition (?=a) then fails, the -character "b" is matched, but "c" is not. At this point, matching does not -backtrack to .*? as might perhaps be expected from the presence of the | -character. The conditional subpattern is part of the single alternative that -comprises the whole pattern, and so the match fails. (If there was a backtrack -into .*?, allowing it to match "b", the match would succeed.) -.P -The verbs just described provide four different "strengths" of control when -subsequent matching fails. (*THEN) is the weakest, carrying on the match at the -next alternative. (*PRUNE) comes next, failing the match at the current -starting position, but allowing an advance to the next character (for an -unanchored pattern). (*SKIP) is similar, except that the advance may be more -than one character. (*COMMIT) is the strongest, causing the entire match to -fail. -. -. -.SS "More than one backtracking verb" -.rs -.sp -If more than one backtracking verb is present in a pattern, the one that is -backtracked onto first acts. For example, consider this pattern, where A, B, -etc. are complex pattern fragments: -.sp - (A(*COMMIT)B(*THEN)C|ABD) -.sp -If A matches but B fails, the backtrack to (*COMMIT) causes the entire match to -fail. However, if A and B match, but C fails, the backtrack to (*THEN) causes -the next alternative (ABD) to be tried. This behaviour is consistent, but is -not always the same as Perl's. It means that if two or more backtracking verbs -appear in succession, all the the last of them has no effect. Consider this -example: -.sp - ...(*COMMIT)(*PRUNE)... -.sp -If there is a matching failure to the right, backtracking onto (*PRUNE) causes -it to be triggered, and its action is taken. There can never be a backtrack -onto (*COMMIT). -. -. -.\" HTML -.SS "Backtracking verbs in repeated groups" -.rs -.sp -PCRE differs from Perl in its handling of backtracking verbs in repeated -groups. For example, consider: -.sp - /(a(*COMMIT)b)+ac/ -.sp -If the subject is "abac", Perl matches, but PCRE fails because the (*COMMIT) in -the second repeat of the group acts. -. -. -.\" HTML -.SS "Backtracking verbs in assertions" -.rs -.sp -(*FAIL) in an assertion has its normal effect: it forces an immediate backtrack. -.P -(*ACCEPT) in a positive assertion causes the assertion to succeed without any -further processing. In a negative assertion, (*ACCEPT) causes the assertion to -fail without any further processing. -.P -The other backtracking verbs are not treated specially if they appear in a -positive assertion. In particular, (*THEN) skips to the next alternative in the -innermost enclosing group that has alternations, whether or not this is within -the assertion. -.P -Negative assertions are, however, different, in order to ensure that changing a -positive assertion into a negative assertion changes its result. Backtracking -into (*COMMIT), (*SKIP), or (*PRUNE) causes a negative assertion to be true, -without considering any further alternative branches in the assertion. -Backtracking into (*THEN) causes it to skip to the next enclosing alternative -within the assertion (the normal behaviour), but if the assertion does not have -such an alternative, (*THEN) behaves like (*PRUNE). -. -. -.\" HTML -.SS "Backtracking verbs in subroutines" -.rs -.sp -These behaviours occur whether or not the subpattern is called recursively. -Perl's treatment of subroutines is different in some cases. -.P -(*FAIL) in a subpattern called as a subroutine has its normal effect: it forces -an immediate backtrack. -.P -(*ACCEPT) in a subpattern called as a subroutine causes the subroutine match to -succeed without any further processing. Matching then continues after the -subroutine call. -.P -(*COMMIT), (*SKIP), and (*PRUNE) in a subpattern called as a subroutine cause -the subroutine match to fail. -.P -(*THEN) skips to the next alternative in the innermost enclosing group within -the subpattern that has alternatives. If there is no such group within the -subpattern, (*THEN) causes the subroutine match to fail. -. -. -.SH "SEE ALSO" -.rs -.sp -\fBpcreapi\fP(3), \fBpcrecallout\fP(3), \fBpcrematching\fP(3), -\fBpcresyntax\fP(3), \fBpcre\fP(3), \fBpcre16(3)\fP, \fBpcre32(3)\fP. -. -. -.SH AUTHOR -.rs -.sp -.nf -Philip Hazel -University Computing Service -Cambridge CB2 3QH, England. -.fi -. -. -.SH REVISION -.rs -.sp -.nf -Last updated: 23 October 2016 -Copyright (c) 1997-2016 University of Cambridge. -.fi diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcreperform.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcreperform.3 deleted file mode 100644 index fb2aa959..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcreperform.3 +++ /dev/null @@ -1,177 +0,0 @@ -.TH PCREPERFORM 3 "09 January 2012" "PCRE 8.30" -.SH NAME -PCRE - Perl-compatible regular expressions -.SH "PCRE PERFORMANCE" -.rs -.sp -Two aspects of performance are discussed below: memory usage and processing -time. The way you express your pattern as a regular expression can affect both -of them. -. -.SH "COMPILED PATTERN MEMORY USAGE" -.rs -.sp -Patterns are compiled by PCRE into a reasonably efficient interpretive code, so -that most simple patterns do not use much memory. However, there is one case -where the memory usage of a compiled pattern can be unexpectedly large. If a -parenthesized subpattern has a quantifier with a minimum greater than 1 and/or -a limited maximum, the whole subpattern is repeated in the compiled code. For -example, the pattern -.sp - (abc|def){2,4} -.sp -is compiled as if it were -.sp - (abc|def)(abc|def)((abc|def)(abc|def)?)? -.sp -(Technical aside: It is done this way so that backtrack points within each of -the repetitions can be independently maintained.) -.P -For regular expressions whose quantifiers use only small numbers, this is not -usually a problem. However, if the numbers are large, and particularly if such -repetitions are nested, the memory usage can become an embarrassment. For -example, the very simple pattern -.sp - ((ab){1,1000}c){1,3} -.sp -uses 51K bytes when compiled using the 8-bit library. When PCRE is compiled -with its default internal pointer size of two bytes, the size limit on a -compiled pattern is 64K data units, and this is reached with the above pattern -if the outer repetition is increased from 3 to 4. PCRE can be compiled to use -larger internal pointers and thus handle larger compiled patterns, but it is -better to try to rewrite your pattern to use less memory if you can. -.P -One way of reducing the memory usage for such patterns is to make use of PCRE's -.\" HTML -.\" -"subroutine" -.\" -facility. Re-writing the above pattern as -.sp - ((ab)(?2){0,999}c)(?1){0,2} -.sp -reduces the memory requirements to 18K, and indeed it remains under 20K even -with the outer repetition increased to 100. However, this pattern is not -exactly equivalent, because the "subroutine" calls are treated as -.\" HTML -.\" -atomic groups -.\" -into which there can be no backtracking if there is a subsequent matching -failure. Therefore, PCRE cannot do this kind of rewriting automatically. -Furthermore, there is a noticeable loss of speed when executing the modified -pattern. Nevertheless, if the atomic grouping is not a problem and the loss of -speed is acceptable, this kind of rewriting will allow you to process patterns -that PCRE cannot otherwise handle. -. -. -.SH "STACK USAGE AT RUN TIME" -.rs -.sp -When \fBpcre_exec()\fP or \fBpcre[16|32]_exec()\fP is used for matching, certain -kinds of pattern can cause it to use large amounts of the process stack. In -some environments the default process stack is quite small, and if it runs out -the result is often SIGSEGV. This issue is probably the most frequently raised -problem with PCRE. Rewriting your pattern can often help. The -.\" HREF -\fBpcrestack\fP -.\" -documentation discusses this issue in detail. -. -. -.SH "PROCESSING TIME" -.rs -.sp -Certain items in regular expression patterns are processed more efficiently -than others. It is more efficient to use a character class like [aeiou] than a -set of single-character alternatives such as (a|e|i|o|u). In general, the -simplest construction that provides the required behaviour is usually the most -efficient. Jeffrey Friedl's book contains a lot of useful general discussion -about optimizing regular expressions for efficient performance. This document -contains a few observations about PCRE. -.P -Using Unicode character properties (the \ep, \eP, and \eX escapes) is slow, -because PCRE has to use a multi-stage table lookup whenever it needs a -character's property. If you can find an alternative pattern that does not use -character properties, it will probably be faster. -.P -By default, the escape sequences \eb, \ed, \es, and \ew, and the POSIX -character classes such as [:alpha:] do not use Unicode properties, partly for -backwards compatibility, and partly for performance reasons. However, you can -set PCRE_UCP if you want Unicode character properties to be used. This can -double the matching time for items such as \ed, when matched with -a traditional matching function; the performance loss is less with -a DFA matching function, and in both cases there is not much difference for -\eb. -.P -When a pattern begins with .* not in parentheses, or in parentheses that are -not the subject of a backreference, and the PCRE_DOTALL option is set, the -pattern is implicitly anchored by PCRE, since it can match only at the start of -a subject string. However, if PCRE_DOTALL is not set, PCRE cannot make this -optimization, because the . metacharacter does not then match a newline, and if -the subject string contains newlines, the pattern may match from the character -immediately following one of them instead of from the very start. For example, -the pattern -.sp - .*second -.sp -matches the subject "first\enand second" (where \en stands for a newline -character), with the match starting at the seventh character. In order to do -this, PCRE has to retry the match starting after every newline in the subject. -.P -If you are using such a pattern with subject strings that do not contain -newlines, the best performance is obtained by setting PCRE_DOTALL, or starting -the pattern with ^.* or ^.*? to indicate explicit anchoring. That saves PCRE -from having to scan along the subject looking for a newline to restart at. -.P -Beware of patterns that contain nested indefinite repeats. These can take a -long time to run when applied to a string that does not match. Consider the -pattern fragment -.sp - ^(a+)* -.sp -This can match "aaaa" in 16 different ways, and this number increases very -rapidly as the string gets longer. (The * repeat can match 0, 1, 2, 3, or 4 -times, and for each of those cases other than 0 or 4, the + repeats can match -different numbers of times.) When the remainder of the pattern is such that the -entire match is going to fail, PCRE has in principle to try every possible -variation, and this can take an extremely long time, even for relatively short -strings. -.P -An optimization catches some of the more simple cases such as -.sp - (a+)*b -.sp -where a literal character follows. Before embarking on the standard matching -procedure, PCRE checks that there is a "b" later in the subject string, and if -there is not, it fails the match immediately. However, when there is no -following literal this optimization cannot be used. You can see the difference -by comparing the behaviour of -.sp - (a+)*\ed -.sp -with the pattern above. The former gives a failure almost instantly when -applied to a whole line of "a" characters, whereas the latter takes an -appreciable time with strings longer than about 20 characters. -.P -In many cases, the solution to this kind of performance issue is to use an -atomic group or a possessive quantifier. -. -. -.SH AUTHOR -.rs -.sp -.nf -Philip Hazel -University Computing Service -Cambridge CB2 3QH, England. -.fi -. -. -.SH REVISION -.rs -.sp -.nf -Last updated: 25 August 2012 -Copyright (c) 1997-2012 University of Cambridge. -.fi diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcreposix.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcreposix.3 deleted file mode 100644 index 77890f36..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcreposix.3 +++ /dev/null @@ -1,267 +0,0 @@ -.TH PCREPOSIX 3 "09 January 2012" "PCRE 8.30" -.SH NAME -PCRE - Perl-compatible regular expressions. -.SH "SYNOPSIS" -.rs -.sp -.B #include -.PP -.nf -.B int regcomp(regex_t *\fIpreg\fP, const char *\fIpattern\fP, -.B " int \fIcflags\fP);" -.sp -.B int regexec(regex_t *\fIpreg\fP, const char *\fIstring\fP, -.B " size_t \fInmatch\fP, regmatch_t \fIpmatch\fP[], int \fIeflags\fP);" -.B " size_t regerror(int \fIerrcode\fP, const regex_t *\fIpreg\fP," -.B " char *\fIerrbuf\fP, size_t \fIerrbuf_size\fP);" -.sp -.B void regfree(regex_t *\fIpreg\fP); -.fi -. -.SH DESCRIPTION -.rs -.sp -This set of functions provides a POSIX-style API for the PCRE regular -expression 8-bit library. See the -.\" HREF -\fBpcreapi\fP -.\" -documentation for a description of PCRE's native API, which contains much -additional functionality. There is no POSIX-style wrapper for PCRE's 16-bit -and 32-bit library. -.P -The functions described here are just wrapper functions that ultimately call -the PCRE native API. Their prototypes are defined in the \fBpcreposix.h\fP -header file, and on Unix systems the library itself is called -\fBpcreposix.a\fP, so can be accessed by adding \fB-lpcreposix\fP to the -command for linking an application that uses them. Because the POSIX functions -call the native ones, it is also necessary to add \fB-lpcre\fP. -.P -I have implemented only those POSIX option bits that can be reasonably mapped -to PCRE native options. In addition, the option REG_EXTENDED is defined with -the value zero. This has no effect, but since programs that are written to the -POSIX interface often use it, this makes it easier to slot in PCRE as a -replacement library. Other POSIX options are not even defined. -.P -There are also some other options that are not defined by POSIX. These have -been added at the request of users who want to make use of certain -PCRE-specific features via the POSIX calling interface. -.P -When PCRE is called via these functions, it is only the API that is POSIX-like -in style. The syntax and semantics of the regular expressions themselves are -still those of Perl, subject to the setting of various PCRE options, as -described below. "POSIX-like in style" means that the API approximates to the -POSIX definition; it is not fully POSIX-compatible, and in multi-byte encoding -domains it is probably even less compatible. -.P -The header for these functions is supplied as \fBpcreposix.h\fP to avoid any -potential clash with other POSIX libraries. It can, of course, be renamed or -aliased as \fBregex.h\fP, which is the "correct" name. It provides two -structure types, \fIregex_t\fP for compiled internal forms, and -\fIregmatch_t\fP for returning captured substrings. It also defines some -constants whose names start with "REG_"; these are used for setting options and -identifying error codes. -. -. -.SH "COMPILING A PATTERN" -.rs -.sp -The function \fBregcomp()\fP is called to compile a pattern into an -internal form. The pattern is a C string terminated by a binary zero, and -is passed in the argument \fIpattern\fP. The \fIpreg\fP argument is a pointer -to a \fBregex_t\fP structure that is used as a base for storing information -about the compiled regular expression. -.P -The argument \fIcflags\fP is either zero, or contains one or more of the bits -defined by the following macros: -.sp - REG_DOTALL -.sp -The PCRE_DOTALL option is set when the regular expression is passed for -compilation to the native function. Note that REG_DOTALL is not part of the -POSIX standard. -.sp - REG_ICASE -.sp -The PCRE_CASELESS option is set when the regular expression is passed for -compilation to the native function. -.sp - REG_NEWLINE -.sp -The PCRE_MULTILINE option is set when the regular expression is passed for -compilation to the native function. Note that this does \fInot\fP mimic the -defined POSIX behaviour for REG_NEWLINE (see the following section). -.sp - REG_NOSUB -.sp -The PCRE_NO_AUTO_CAPTURE option is set when the regular expression is passed -for compilation to the native function. In addition, when a pattern that is -compiled with this flag is passed to \fBregexec()\fP for matching, the -\fInmatch\fP and \fIpmatch\fP arguments are ignored, and no captured strings -are returned. -.sp - REG_UCP -.sp -The PCRE_UCP option is set when the regular expression is passed for -compilation to the native function. This causes PCRE to use Unicode properties -when matchine \ed, \ew, etc., instead of just recognizing ASCII values. Note -that REG_UTF8 is not part of the POSIX standard. -.sp - REG_UNGREEDY -.sp -The PCRE_UNGREEDY option is set when the regular expression is passed for -compilation to the native function. Note that REG_UNGREEDY is not part of the -POSIX standard. -.sp - REG_UTF8 -.sp -The PCRE_UTF8 option is set when the regular expression is passed for -compilation to the native function. This causes the pattern itself and all data -strings used for matching it to be treated as UTF-8 strings. Note that REG_UTF8 -is not part of the POSIX standard. -.P -In the absence of these flags, no options are passed to the native function. -This means the the regex is compiled with PCRE default semantics. In -particular, the way it handles newline characters in the subject string is the -Perl way, not the POSIX way. Note that setting PCRE_MULTILINE has only -\fIsome\fP of the effects specified for REG_NEWLINE. It does not affect the way -newlines are matched by . (they are not) or by a negative class such as [^a] -(they are). -.P -The yield of \fBregcomp()\fP is zero on success, and non-zero otherwise. The -\fIpreg\fP structure is filled in on success, and one member of the structure -is public: \fIre_nsub\fP contains the number of capturing subpatterns in -the regular expression. Various error codes are defined in the header file. -.P -NOTE: If the yield of \fBregcomp()\fP is non-zero, you must not attempt to -use the contents of the \fIpreg\fP structure. If, for example, you pass it to -\fBregexec()\fP, the result is undefined and your program is likely to crash. -. -. -.SH "MATCHING NEWLINE CHARACTERS" -.rs -.sp -This area is not simple, because POSIX and Perl take different views of things. -It is not possible to get PCRE to obey POSIX semantics, but then PCRE was never -intended to be a POSIX engine. The following table lists the different -possibilities for matching newline characters in PCRE: -.sp - Default Change with -.sp - . matches newline no PCRE_DOTALL - newline matches [^a] yes not changeable - $ matches \en at end yes PCRE_DOLLARENDONLY - $ matches \en in middle no PCRE_MULTILINE - ^ matches \en in middle no PCRE_MULTILINE -.sp -This is the equivalent table for POSIX: -.sp - Default Change with -.sp - . matches newline yes REG_NEWLINE - newline matches [^a] yes REG_NEWLINE - $ matches \en at end no REG_NEWLINE - $ matches \en in middle no REG_NEWLINE - ^ matches \en in middle no REG_NEWLINE -.sp -PCRE's behaviour is the same as Perl's, except that there is no equivalent for -PCRE_DOLLAR_ENDONLY in Perl. In both PCRE and Perl, there is no way to stop -newline from matching [^a]. -.P -The default POSIX newline handling can be obtained by setting PCRE_DOTALL and -PCRE_DOLLAR_ENDONLY, but there is no way to make PCRE behave exactly as for the -REG_NEWLINE action. -. -. -.SH "MATCHING A PATTERN" -.rs -.sp -The function \fBregexec()\fP is called to match a compiled pattern \fIpreg\fP -against a given \fIstring\fP, which is by default terminated by a zero byte -(but see REG_STARTEND below), subject to the options in \fIeflags\fP. These can -be: -.sp - REG_NOTBOL -.sp -The PCRE_NOTBOL option is set when calling the underlying PCRE matching -function. -.sp - REG_NOTEMPTY -.sp -The PCRE_NOTEMPTY option is set when calling the underlying PCRE matching -function. Note that REG_NOTEMPTY is not part of the POSIX standard. However, -setting this option can give more POSIX-like behaviour in some situations. -.sp - REG_NOTEOL -.sp -The PCRE_NOTEOL option is set when calling the underlying PCRE matching -function. -.sp - REG_STARTEND -.sp -The string is considered to start at \fIstring\fP + \fIpmatch[0].rm_so\fP and -to have a terminating NUL located at \fIstring\fP + \fIpmatch[0].rm_eo\fP -(there need not actually be a NUL at that location), regardless of the value of -\fInmatch\fP. This is a BSD extension, compatible with but not specified by -IEEE Standard 1003.2 (POSIX.2), and should be used with caution in software -intended to be portable to other systems. Note that a non-zero \fIrm_so\fP does -not imply REG_NOTBOL; REG_STARTEND affects only the location of the string, not -how it is matched. -.P -If the pattern was compiled with the REG_NOSUB flag, no data about any matched -strings is returned. The \fInmatch\fP and \fIpmatch\fP arguments of -\fBregexec()\fP are ignored. -.P -If the value of \fInmatch\fP is zero, or if the value \fIpmatch\fP is NULL, -no data about any matched strings is returned. -.P -Otherwise,the portion of the string that was matched, and also any captured -substrings, are returned via the \fIpmatch\fP argument, which points to an -array of \fInmatch\fP structures of type \fIregmatch_t\fP, containing the -members \fIrm_so\fP and \fIrm_eo\fP. These contain the offset to the first -character of each substring and the offset to the first character after the end -of each substring, respectively. The 0th element of the vector relates to the -entire portion of \fIstring\fP that was matched; subsequent elements relate to -the capturing subpatterns of the regular expression. Unused entries in the -array have both structure members set to -1. -.P -A successful match yields a zero return; various error codes are defined in the -header file, of which REG_NOMATCH is the "expected" failure code. -. -. -.SH "ERROR MESSAGES" -.rs -.sp -The \fBregerror()\fP function maps a non-zero errorcode from either -\fBregcomp()\fP or \fBregexec()\fP to a printable message. If \fIpreg\fP is not -NULL, the error should have arisen from the use of that structure. A message -terminated by a binary zero is placed in \fIerrbuf\fP. The length of the -message, including the zero, is limited to \fIerrbuf_size\fP. The yield of the -function is the size of buffer needed to hold the whole message. -. -. -.SH MEMORY USAGE -.rs -.sp -Compiling a regular expression causes memory to be allocated and associated -with the \fIpreg\fP structure. The function \fBregfree()\fP frees all such -memory, after which \fIpreg\fP may no longer be used as a compiled expression. -. -. -.SH AUTHOR -.rs -.sp -.nf -Philip Hazel -University Computing Service -Cambridge CB2 3QH, England. -.fi -. -. -.SH REVISION -.rs -.sp -.nf -Last updated: 09 January 2012 -Copyright (c) 1997-2012 University of Cambridge. -.fi diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcreprecompile.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcreprecompile.3 deleted file mode 100644 index 40f257a9..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcreprecompile.3 +++ /dev/null @@ -1,155 +0,0 @@ -.TH PCREPRECOMPILE 3 "12 November 2013" "PCRE 8.34" -.SH NAME -PCRE - Perl-compatible regular expressions -.SH "SAVING AND RE-USING PRECOMPILED PCRE PATTERNS" -.rs -.sp -If you are running an application that uses a large number of regular -expression patterns, it may be useful to store them in a precompiled form -instead of having to compile them every time the application is run. -If you are not using any private character tables (see the -.\" HREF -\fBpcre_maketables()\fP -.\" -documentation), this is relatively straightforward. If you are using private -tables, it is a little bit more complicated. However, if you are using the -just-in-time optimization feature, it is not possible to save and reload the -JIT data. -.P -If you save compiled patterns to a file, you can copy them to a different host -and run them there. If the two hosts have different endianness (byte order), -you should run the \fBpcre[16|32]_pattern_to_host_byte_order()\fP function on the -new host before trying to match the pattern. The matching functions return -PCRE_ERROR_BADENDIANNESS if they detect a pattern with the wrong endianness. -.P -Compiling regular expressions with one version of PCRE for use with a different -version is not guaranteed to work and may cause crashes, and saving and -restoring a compiled pattern loses any JIT optimization data. -. -. -.SH "SAVING A COMPILED PATTERN" -.rs -.sp -The value returned by \fBpcre[16|32]_compile()\fP points to a single block of -memory that holds the compiled pattern and associated data. You can find the -length of this block in bytes by calling \fBpcre[16|32]_fullinfo()\fP with an -argument of PCRE_INFO_SIZE. You can then save the data in any appropriate -manner. Here is sample code for the 8-bit library that compiles a pattern and -writes it to a file. It assumes that the variable \fIfd\fP refers to a file -that is open for output: -.sp - int erroroffset, rc, size; - char *error; - pcre *re; -.sp - re = pcre_compile("my pattern", 0, &error, &erroroffset, NULL); - if (re == NULL) { ... handle errors ... } - rc = pcre_fullinfo(re, NULL, PCRE_INFO_SIZE, &size); - if (rc < 0) { ... handle errors ... } - rc = fwrite(re, 1, size, fd); - if (rc != size) { ... handle errors ... } -.sp -In this example, the bytes that comprise the compiled pattern are copied -exactly. Note that this is binary data that may contain any of the 256 possible -byte values. On systems that make a distinction between binary and non-binary -data, be sure that the file is opened for binary output. -.P -If you want to write more than one pattern to a file, you will have to devise a -way of separating them. For binary data, preceding each pattern with its length -is probably the most straightforward approach. Another possibility is to write -out the data in hexadecimal instead of binary, one pattern to a line. -.P -Saving compiled patterns in a file is only one possible way of storing them for -later use. They could equally well be saved in a database, or in the memory of -some daemon process that passes them via sockets to the processes that want -them. -.P -If the pattern has been studied, it is also possible to save the normal study -data in a similar way to the compiled pattern itself. However, if the -PCRE_STUDY_JIT_COMPILE was used, the just-in-time data that is created cannot -be saved because it is too dependent on the current environment. When studying -generates additional information, \fBpcre[16|32]_study()\fP returns a pointer to a -\fBpcre[16|32]_extra\fP data block. Its format is defined in the -.\" HTML -.\" -section on matching a pattern -.\" -in the -.\" HREF -\fBpcreapi\fP -.\" -documentation. The \fIstudy_data\fP field points to the binary study data, and -this is what you must save (not the \fBpcre[16|32]_extra\fP block itself). The -length of the study data can be obtained by calling \fBpcre[16|32]_fullinfo()\fP -with an argument of PCRE_INFO_STUDYSIZE. Remember to check that -\fBpcre[16|32]_study()\fP did return a non-NULL value before trying to save the -study data. -. -. -.SH "RE-USING A PRECOMPILED PATTERN" -.rs -.sp -Re-using a precompiled pattern is straightforward. Having reloaded it into main -memory, called \fBpcre[16|32]_pattern_to_host_byte_order()\fP if necessary, you -pass its pointer to \fBpcre[16|32]_exec()\fP or \fBpcre[16|32]_dfa_exec()\fP in -the usual way. -.P -However, if you passed a pointer to custom character tables when the pattern -was compiled (the \fItableptr\fP argument of \fBpcre[16|32]_compile()\fP), you -must now pass a similar pointer to \fBpcre[16|32]_exec()\fP or -\fBpcre[16|32]_dfa_exec()\fP, because the value saved with the compiled pattern -will obviously be nonsense. A field in a \fBpcre[16|32]_extra()\fP block is used -to pass this data, as described in the -.\" HTML -.\" -section on matching a pattern -.\" -in the -.\" HREF -\fBpcreapi\fP -.\" -documentation. -.P -\fBWarning:\fP The tables that \fBpcre_exec()\fP and \fBpcre_dfa_exec()\fP use -must be the same as those that were used when the pattern was compiled. If this -is not the case, the behaviour is undefined. -.P -If you did not provide custom character tables when the pattern was compiled, -the pointer in the compiled pattern is NULL, which causes the matching -functions to use PCRE's internal tables. Thus, you do not need to take any -special action at run time in this case. -.P -If you saved study data with the compiled pattern, you need to create your own -\fBpcre[16|32]_extra\fP data block and set the \fIstudy_data\fP field to point -to the reloaded study data. You must also set the PCRE_EXTRA_STUDY_DATA bit in -the \fIflags\fP field to indicate that study data is present. Then pass the -\fBpcre[16|32]_extra\fP block to the matching function in the usual way. If the -pattern was studied for just-in-time optimization, that data cannot be saved, -and so is lost by a save/restore cycle. -. -. -.SH "COMPATIBILITY WITH DIFFERENT PCRE RELEASES" -.rs -.sp -In general, it is safest to recompile all saved patterns when you update to a -new PCRE release, though not all updates actually require this. -. -. -. -.SH AUTHOR -.rs -.sp -.nf -Philip Hazel -University Computing Service -Cambridge CB2 3QH, England. -.fi -. -. -.SH REVISION -.rs -.sp -.nf -Last updated: 12 November 2013 -Copyright (c) 1997-2013 University of Cambridge. -.fi diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcresample.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcresample.3 deleted file mode 100644 index d7fe7ec5..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcresample.3 +++ /dev/null @@ -1,99 +0,0 @@ -.TH PCRESAMPLE 3 "10 January 2012" "PCRE 8.30" -.SH NAME -PCRE - Perl-compatible regular expressions -.SH "PCRE SAMPLE PROGRAM" -.rs -.sp -A simple, complete demonstration program, to get you started with using PCRE, -is supplied in the file \fIpcredemo.c\fP in the PCRE distribution. A listing of -this program is given in the -.\" HREF -\fBpcredemo\fP -.\" -documentation. If you do not have a copy of the PCRE distribution, you can save -this listing to re-create \fIpcredemo.c\fP. -.P -The demonstration program, which uses the original PCRE 8-bit library, compiles -the regular expression that is its first argument, and matches it against the -subject string in its second argument. No PCRE options are set, and default -character tables are used. If matching succeeds, the program outputs the -portion of the subject that matched, together with the contents of any captured -substrings. -.P -If the -g option is given on the command line, the program then goes on to -check for further matches of the same regular expression in the same subject -string. The logic is a little bit tricky because of the possibility of matching -an empty string. Comments in the code explain what is going on. -.P -If PCRE is installed in the standard include and library directories for your -operating system, you should be able to compile the demonstration program using -this command: -.sp - gcc -o pcredemo pcredemo.c -lpcre -.sp -If PCRE is installed elsewhere, you may need to add additional options to the -command line. For example, on a Unix-like system that has PCRE installed in -\fI/usr/local\fP, you can compile the demonstration program using a command -like this: -.sp -.\" JOINSH - gcc -o pcredemo -I/usr/local/include pcredemo.c \e - -L/usr/local/lib -lpcre -.sp -In a Windows environment, if you want to statically link the program against a -non-dll \fBpcre.a\fP file, you must uncomment the line that defines PCRE_STATIC -before including \fBpcre.h\fP, because otherwise the \fBpcre_malloc()\fP and -\fBpcre_free()\fP exported functions will be declared -\fB__declspec(dllimport)\fP, with unwanted results. -.P -Once you have compiled and linked the demonstration program, you can run simple -tests like this: -.sp - ./pcredemo 'cat|dog' 'the cat sat on the mat' - ./pcredemo -g 'cat|dog' 'the dog sat on the cat' -.sp -Note that there is a much more comprehensive test program, called -.\" HREF -\fBpcretest\fP, -.\" -which supports many more facilities for testing regular expressions and both -PCRE libraries. The -.\" HREF -\fBpcredemo\fP -.\" -program is provided as a simple coding example. -.P -If you try to run -.\" HREF -\fBpcredemo\fP -.\" -when PCRE is not installed in the standard library directory, you may get an -error like this on some operating systems (e.g. Solaris): -.sp - ld.so.1: a.out: fatal: libpcre.so.0: open failed: No such file or directory -.sp -This is caused by the way shared library support works on those systems. You -need to add -.sp - -R/usr/local/lib -.sp -(for example) to the compile command to get round this problem. -. -. -.SH AUTHOR -.rs -.sp -.nf -Philip Hazel -University Computing Service -Cambridge CB2 3QH, England. -.fi -. -. -.SH REVISION -.rs -.sp -.nf -Last updated: 10 January 2012 -Copyright (c) 1997-2012 University of Cambridge. -.fi diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcrestack.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcrestack.3 deleted file mode 100644 index 798f0bca..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcrestack.3 +++ /dev/null @@ -1,215 +0,0 @@ -.TH PCRESTACK 3 "24 June 2012" "PCRE 8.30" -.SH NAME -PCRE - Perl-compatible regular expressions -.SH "PCRE DISCUSSION OF STACK USAGE" -.rs -.sp -When you call \fBpcre[16|32]_exec()\fP, it makes use of an internal function -called \fBmatch()\fP. This calls itself recursively at branch points in the -pattern, in order to remember the state of the match so that it can back up and -try a different alternative if the first one fails. As matching proceeds deeper -and deeper into the tree of possibilities, the recursion depth increases. The -\fBmatch()\fP function is also called in other circumstances, for example, -whenever a parenthesized sub-pattern is entered, and in certain cases of -repetition. -.P -Not all calls of \fBmatch()\fP increase the recursion depth; for an item such -as a* it may be called several times at the same level, after matching -different numbers of a's. Furthermore, in a number of cases where the result of -the recursive call would immediately be passed back as the result of the -current call (a "tail recursion"), the function is just restarted instead. -.P -The above comments apply when \fBpcre[16|32]_exec()\fP is run in its normal -interpretive manner. If the pattern was studied with the -PCRE_STUDY_JIT_COMPILE option, and just-in-time compiling was successful, and -the options passed to \fBpcre[16|32]_exec()\fP were not incompatible, the matching -process uses the JIT-compiled code instead of the \fBmatch()\fP function. In -this case, the memory requirements are handled entirely differently. See the -.\" HREF -\fBpcrejit\fP -.\" -documentation for details. -.P -The \fBpcre[16|32]_dfa_exec()\fP function operates in an entirely different way, -and uses recursion only when there is a regular expression recursion or -subroutine call in the pattern. This includes the processing of assertion and -"once-only" subpatterns, which are handled like subroutine calls. Normally, -these are never very deep, and the limit on the complexity of -\fBpcre[16|32]_dfa_exec()\fP is controlled by the amount of workspace it is given. -However, it is possible to write patterns with runaway infinite recursions; -such patterns will cause \fBpcre[16|32]_dfa_exec()\fP to run out of stack. At -present, there is no protection against this. -.P -The comments that follow do NOT apply to \fBpcre[16|32]_dfa_exec()\fP; they are -relevant only for \fBpcre[16|32]_exec()\fP without the JIT optimization. -. -. -.SS "Reducing \fBpcre[16|32]_exec()\fP's stack usage" -.rs -.sp -Each time that \fBmatch()\fP is actually called recursively, it uses memory -from the process stack. For certain kinds of pattern and data, very large -amounts of stack may be needed, despite the recognition of "tail recursion". -You can often reduce the amount of recursion, and therefore the amount of stack -used, by modifying the pattern that is being matched. Consider, for example, -this pattern: -.sp - ([^<]|<(?!inet))+ -.sp -It matches from wherever it starts until it encounters " -.\" -section on extra data for \fBpcre[16|32]_exec()\fP -.\" -in the -.\" HREF -\fBpcreapi\fP -.\" -documentation. -.P -As a very rough rule of thumb, you should reckon on about 500 bytes per -recursion. Thus, if you want to limit your stack usage to 8Mb, you should set -the limit at 16000 recursions. A 64Mb stack, on the other hand, can support -around 128000 recursions. -.P -In Unix-like environments, the \fBpcretest\fP test program has a command line -option (\fB-S\fP) that can be used to increase the size of its stack. As long -as the stack is large enough, another option (\fB-M\fP) can be used to find the -smallest limits that allow a particular pattern to match a given subject -string. This is done by calling \fBpcre[16|32]_exec()\fP repeatedly with different -limits. -. -. -.SS "Obtaining an estimate of stack usage" -.rs -.sp -The actual amount of stack used per recursion can vary quite a lot, depending -on the compiler that was used to build PCRE and the optimization or debugging -options that were set for it. The rule of thumb value of 500 bytes mentioned -above may be larger or smaller than what is actually needed. A better -approximation can be obtained by running this command: -.sp - pcretest -m -C -.sp -The \fB-C\fP option causes \fBpcretest\fP to output information about the -options with which PCRE was compiled. When \fB-m\fP is also given (before -\fB-C\fP), information about stack use is given in a line like this: -.sp - Match recursion uses stack: approximate frame size = 640 bytes -.sp -The value is approximate because some recursions need a bit more (up to perhaps -16 more bytes). -.P -If the above command is given when PCRE is compiled to use the heap instead of -the stack for recursion, the value that is output is the size of each block -that is obtained from the heap. -. -. -.SS "Changing stack size in Unix-like systems" -.rs -.sp -In Unix-like environments, there is not often a problem with the stack unless -very long strings are involved, though the default limit on stack size varies -from system to system. Values from 8Mb to 64Mb are common. You can find your -default limit by running the command: -.sp - ulimit -s -.sp -Unfortunately, the effect of running out of stack is often SIGSEGV, though -sometimes a more explicit error message is given. You can normally increase the -limit on stack size by code such as this: -.sp - struct rlimit rlim; - getrlimit(RLIMIT_STACK, &rlim); - rlim.rlim_cur = 100*1024*1024; - setrlimit(RLIMIT_STACK, &rlim); -.sp -This reads the current limits (soft and hard) using \fBgetrlimit()\fP, then -attempts to increase the soft limit to 100Mb using \fBsetrlimit()\fP. You must -do this before calling \fBpcre[16|32]_exec()\fP. -. -. -.SS "Changing stack size in Mac OS X" -.rs -.sp -Using \fBsetrlimit()\fP, as described above, should also work on Mac OS X. It -is also possible to set a stack size when linking a program. There is a -discussion about stack sizes in Mac OS X at this web site: -.\" HTML -.\" -http://developer.apple.com/qa/qa2005/qa1419.html. -.\" -. -. -.SH AUTHOR -.rs -.sp -.nf -Philip Hazel -University Computing Service -Cambridge CB2 3QH, England. -.fi -. -. -.SH REVISION -.rs -.sp -.nf -Last updated: 24 June 2012 -Copyright (c) 1997-2012 University of Cambridge. -.fi diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcresyntax.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcresyntax.3 deleted file mode 100644 index 0850369f..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcresyntax.3 +++ /dev/null @@ -1,540 +0,0 @@ -.TH PCRESYNTAX 3 "08 January 2014" "PCRE 8.35" -.SH NAME -PCRE - Perl-compatible regular expressions -.SH "PCRE REGULAR EXPRESSION SYNTAX SUMMARY" -.rs -.sp -The full syntax and semantics of the regular expressions that are supported by -PCRE are described in the -.\" HREF -\fBpcrepattern\fP -.\" -documentation. This document contains a quick-reference summary of the syntax. -. -. -.SH "QUOTING" -.rs -.sp - \ex where x is non-alphanumeric is a literal x - \eQ...\eE treat enclosed characters as literal -. -. -.SH "CHARACTERS" -.rs -.sp - \ea alarm, that is, the BEL character (hex 07) - \ecx "control-x", where x is any ASCII character - \ee escape (hex 1B) - \ef form feed (hex 0C) - \en newline (hex 0A) - \er carriage return (hex 0D) - \et tab (hex 09) - \e0dd character with octal code 0dd - \eddd character with octal code ddd, or backreference - \eo{ddd..} character with octal code ddd.. - \exhh character with hex code hh - \ex{hhh..} character with hex code hhh.. -.sp -Note that \e0dd is always an octal code, and that \e8 and \e9 are the literal -characters "8" and "9". -. -. -.SH "CHARACTER TYPES" -.rs -.sp - . any character except newline; - in dotall mode, any character whatsoever - \eC one data unit, even in UTF mode (best avoided) - \ed a decimal digit - \eD a character that is not a decimal digit - \eh a horizontal white space character - \eH a character that is not a horizontal white space character - \eN a character that is not a newline - \ep{\fIxx\fP} a character with the \fIxx\fP property - \eP{\fIxx\fP} a character without the \fIxx\fP property - \eR a newline sequence - \es a white space character - \eS a character that is not a white space character - \ev a vertical white space character - \eV a character that is not a vertical white space character - \ew a "word" character - \eW a "non-word" character - \eX a Unicode extended grapheme cluster -.sp -By default, \ed, \es, and \ew match only ASCII characters, even in UTF-8 mode -or in the 16- bit and 32-bit libraries. However, if locale-specific matching is -happening, \es and \ew may also match characters with code points in the range -128-255. If the PCRE_UCP option is set, the behaviour of these escape sequences -is changed to use Unicode properties and they match many more characters. -. -. -.SH "GENERAL CATEGORY PROPERTIES FOR \ep and \eP" -.rs -.sp - C Other - Cc Control - Cf Format - Cn Unassigned - Co Private use - Cs Surrogate -.sp - L Letter - Ll Lower case letter - Lm Modifier letter - Lo Other letter - Lt Title case letter - Lu Upper case letter - L& Ll, Lu, or Lt -.sp - M Mark - Mc Spacing mark - Me Enclosing mark - Mn Non-spacing mark -.sp - N Number - Nd Decimal number - Nl Letter number - No Other number -.sp - P Punctuation - Pc Connector punctuation - Pd Dash punctuation - Pe Close punctuation - Pf Final punctuation - Pi Initial punctuation - Po Other punctuation - Ps Open punctuation -.sp - S Symbol - Sc Currency symbol - Sk Modifier symbol - Sm Mathematical symbol - So Other symbol -.sp - Z Separator - Zl Line separator - Zp Paragraph separator - Zs Space separator -. -. -.SH "PCRE SPECIAL CATEGORY PROPERTIES FOR \ep and \eP" -.rs -.sp - Xan Alphanumeric: union of properties L and N - Xps POSIX space: property Z or tab, NL, VT, FF, CR - Xsp Perl space: property Z or tab, NL, VT, FF, CR - Xuc Univerally-named character: one that can be - represented by a Universal Character Name - Xwd Perl word: property Xan or underscore -.sp -Perl and POSIX space are now the same. Perl added VT to its space character set -at release 5.18 and PCRE changed at release 8.34. -. -. -.SH "SCRIPT NAMES FOR \ep AND \eP" -.rs -.sp -Arabic, -Armenian, -Avestan, -Balinese, -Bamum, -Bassa_Vah, -Batak, -Bengali, -Bopomofo, -Brahmi, -Braille, -Buginese, -Buhid, -Canadian_Aboriginal, -Carian, -Caucasian_Albanian, -Chakma, -Cham, -Cherokee, -Common, -Coptic, -Cuneiform, -Cypriot, -Cyrillic, -Deseret, -Devanagari, -Duployan, -Egyptian_Hieroglyphs, -Elbasan, -Ethiopic, -Georgian, -Glagolitic, -Gothic, -Grantha, -Greek, -Gujarati, -Gurmukhi, -Han, -Hangul, -Hanunoo, -Hebrew, -Hiragana, -Imperial_Aramaic, -Inherited, -Inscriptional_Pahlavi, -Inscriptional_Parthian, -Javanese, -Kaithi, -Kannada, -Katakana, -Kayah_Li, -Kharoshthi, -Khmer, -Khojki, -Khudawadi, -Lao, -Latin, -Lepcha, -Limbu, -Linear_A, -Linear_B, -Lisu, -Lycian, -Lydian, -Mahajani, -Malayalam, -Mandaic, -Manichaean, -Meetei_Mayek, -Mende_Kikakui, -Meroitic_Cursive, -Meroitic_Hieroglyphs, -Miao, -Modi, -Mongolian, -Mro, -Myanmar, -Nabataean, -New_Tai_Lue, -Nko, -Ogham, -Ol_Chiki, -Old_Italic, -Old_North_Arabian, -Old_Permic, -Old_Persian, -Old_South_Arabian, -Old_Turkic, -Oriya, -Osmanya, -Pahawh_Hmong, -Palmyrene, -Pau_Cin_Hau, -Phags_Pa, -Phoenician, -Psalter_Pahlavi, -Rejang, -Runic, -Samaritan, -Saurashtra, -Sharada, -Shavian, -Siddham, -Sinhala, -Sora_Sompeng, -Sundanese, -Syloti_Nagri, -Syriac, -Tagalog, -Tagbanwa, -Tai_Le, -Tai_Tham, -Tai_Viet, -Takri, -Tamil, -Telugu, -Thaana, -Thai, -Tibetan, -Tifinagh, -Tirhuta, -Ugaritic, -Vai, -Warang_Citi, -Yi. -. -. -.SH "CHARACTER CLASSES" -.rs -.sp - [...] positive character class - [^...] negative character class - [x-y] range (can be used for hex characters) - [[:xxx:]] positive POSIX named set - [[:^xxx:]] negative POSIX named set -.sp - alnum alphanumeric - alpha alphabetic - ascii 0-127 - blank space or tab - cntrl control character - digit decimal digit - graph printing, excluding space - lower lower case letter - print printing, including space - punct printing, excluding alphanumeric - space white space - upper upper case letter - word same as \ew - xdigit hexadecimal digit -.sp -In PCRE, POSIX character set names recognize only ASCII characters by default, -but some of them use Unicode properties if PCRE_UCP is set. You can use -\eQ...\eE inside a character class. -. -. -.SH "QUANTIFIERS" -.rs -.sp - ? 0 or 1, greedy - ?+ 0 or 1, possessive - ?? 0 or 1, lazy - * 0 or more, greedy - *+ 0 or more, possessive - *? 0 or more, lazy - + 1 or more, greedy - ++ 1 or more, possessive - +? 1 or more, lazy - {n} exactly n - {n,m} at least n, no more than m, greedy - {n,m}+ at least n, no more than m, possessive - {n,m}? at least n, no more than m, lazy - {n,} n or more, greedy - {n,}+ n or more, possessive - {n,}? n or more, lazy -. -. -.SH "ANCHORS AND SIMPLE ASSERTIONS" -.rs -.sp - \eb word boundary - \eB not a word boundary - ^ start of subject - also after internal newline in multiline mode - \eA start of subject - $ end of subject - also before newline at end of subject - also before internal newline in multiline mode - \eZ end of subject - also before newline at end of subject - \ez end of subject - \eG first matching position in subject -. -. -.SH "MATCH POINT RESET" -.rs -.sp - \eK reset start of match -.sp -\eK is honoured in positive assertions, but ignored in negative ones. -. -. -.SH "ALTERNATION" -.rs -.sp - expr|expr|expr... -. -. -.SH "CAPTURING" -.rs -.sp - (...) capturing group - (?...) named capturing group (Perl) - (?'name'...) named capturing group (Perl) - (?P...) named capturing group (Python) - (?:...) non-capturing group - (?|...) non-capturing group; reset group numbers for - capturing groups in each alternative -. -. -.SH "ATOMIC GROUPS" -.rs -.sp - (?>...) atomic, non-capturing group -. -. -. -. -.SH "COMMENT" -.rs -.sp - (?#....) comment (not nestable) -. -. -.SH "OPTION SETTING" -.rs -.sp - (?i) caseless - (?J) allow duplicate names - (?m) multiline - (?s) single line (dotall) - (?U) default ungreedy (lazy) - (?x) extended (ignore white space) - (?-...) unset option(s) -.sp -The following are recognized only at the very start of a pattern or after one -of the newline or \eR options with similar syntax. More than one of them may -appear. -.sp - (*LIMIT_MATCH=d) set the match limit to d (decimal number) - (*LIMIT_RECURSION=d) set the recursion limit to d (decimal number) - (*NO_AUTO_POSSESS) no auto-possessification (PCRE_NO_AUTO_POSSESS) - (*NO_START_OPT) no start-match optimization (PCRE_NO_START_OPTIMIZE) - (*UTF8) set UTF-8 mode: 8-bit library (PCRE_UTF8) - (*UTF16) set UTF-16 mode: 16-bit library (PCRE_UTF16) - (*UTF32) set UTF-32 mode: 32-bit library (PCRE_UTF32) - (*UTF) set appropriate UTF mode for the library in use - (*UCP) set PCRE_UCP (use Unicode properties for \ed etc) -.sp -Note that LIMIT_MATCH and LIMIT_RECURSION can only reduce the value of the -limits set by the caller of pcre_exec(), not increase them. -. -. -.SH "NEWLINE CONVENTION" -.rs -.sp -These are recognized only at the very start of the pattern or after option -settings with a similar syntax. -.sp - (*CR) carriage return only - (*LF) linefeed only - (*CRLF) carriage return followed by linefeed - (*ANYCRLF) all three of the above - (*ANY) any Unicode newline sequence -. -. -.SH "WHAT \eR MATCHES" -.rs -.sp -These are recognized only at the very start of the pattern or after option -setting with a similar syntax. -.sp - (*BSR_ANYCRLF) CR, LF, or CRLF - (*BSR_UNICODE) any Unicode newline sequence -. -. -.SH "LOOKAHEAD AND LOOKBEHIND ASSERTIONS" -.rs -.sp - (?=...) positive look ahead - (?!...) negative look ahead - (?<=...) positive look behind - (? reference by name (Perl) - \ek'name' reference by name (Perl) - \eg{name} reference by name (Perl) - \ek{name} reference by name (.NET) - (?P=name) reference by name (Python) -. -. -.SH "SUBROUTINE REFERENCES (POSSIBLY RECURSIVE)" -.rs -.sp - (?R) recurse whole pattern - (?n) call subpattern by absolute number - (?+n) call subpattern by relative number - (?-n) call subpattern by relative number - (?&name) call subpattern by name (Perl) - (?P>name) call subpattern by name (Python) - \eg call subpattern by name (Oniguruma) - \eg'name' call subpattern by name (Oniguruma) - \eg call subpattern by absolute number (Oniguruma) - \eg'n' call subpattern by absolute number (Oniguruma) - \eg<+n> call subpattern by relative number (PCRE extension) - \eg'+n' call subpattern by relative number (PCRE extension) - \eg<-n> call subpattern by relative number (PCRE extension) - \eg'-n' call subpattern by relative number (PCRE extension) -. -. -.SH "CONDITIONAL PATTERNS" -.rs -.sp - (?(condition)yes-pattern) - (?(condition)yes-pattern|no-pattern) -.sp - (?(n)... absolute reference condition - (?(+n)... relative reference condition - (?(-n)... relative reference condition - (?()... named reference condition (Perl) - (?('name')... named reference condition (Perl) - (?(name)... named reference condition (PCRE) - (?(R)... overall recursion condition - (?(Rn)... specific group recursion condition - (?(R&name)... specific recursion condition - (?(DEFINE)... define subpattern for reference - (?(assert)... assertion condition -. -. -.SH "BACKTRACKING CONTROL" -.rs -.sp -The following act immediately they are reached: -.sp - (*ACCEPT) force successful match - (*FAIL) force backtrack; synonym (*F) - (*MARK:NAME) set name to be passed back; synonym (*:NAME) -.sp -The following act only when a subsequent match failure causes a backtrack to -reach them. They all force a match failure, but they differ in what happens -afterwards. Those that advance the start-of-match point do so only if the -pattern is not anchored. -.sp - (*COMMIT) overall failure, no advance of starting point - (*PRUNE) advance to next starting character - (*PRUNE:NAME) equivalent to (*MARK:NAME)(*PRUNE) - (*SKIP) advance to current matching position - (*SKIP:NAME) advance to position corresponding to an earlier - (*MARK:NAME); if not found, the (*SKIP) is ignored - (*THEN) local failure, backtrack to next alternation - (*THEN:NAME) equivalent to (*MARK:NAME)(*THEN) -. -. -.SH "CALLOUTS" -.rs -.sp - (?C) callout - (?Cn) callout with data n -. -. -.SH "SEE ALSO" -.rs -.sp -\fBpcrepattern\fP(3), \fBpcreapi\fP(3), \fBpcrecallout\fP(3), -\fBpcrematching\fP(3), \fBpcre\fP(3). -. -. -.SH AUTHOR -.rs -.sp -.nf -Philip Hazel -University Computing Service -Cambridge CB2 3QH, England. -.fi -. -. -.SH REVISION -.rs -.sp -.nf -Last updated: 08 January 2014 -Copyright (c) 1997-2014 University of Cambridge. -.fi diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcreunicode.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcreunicode.3 deleted file mode 100644 index cb5e5269..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/arm64/share/man/man3/pcreunicode.3 +++ /dev/null @@ -1,249 +0,0 @@ -.TH PCREUNICODE 3 "27 February 2013" "PCRE 8.33" -.SH NAME -PCRE - Perl-compatible regular expressions -.SH "UTF-8, UTF-16, UTF-32, AND UNICODE PROPERTY SUPPORT" -.rs -.sp -As well as UTF-8 support, PCRE also supports UTF-16 (from release 8.30) and -UTF-32 (from release 8.32), by means of two additional libraries. They can be -built as well as, or instead of, the 8-bit library. -. -. -.SH "UTF-8 SUPPORT" -.rs -.sp -In order process UTF-8 strings, you must build PCRE's 8-bit library with UTF -support, and, in addition, you must call -.\" HREF -\fBpcre_compile()\fP -.\" -with the PCRE_UTF8 option flag, or the pattern must start with the sequence -(*UTF8) or (*UTF). When either of these is the case, both the pattern and any -subject strings that are matched against it are treated as UTF-8 strings -instead of strings of individual 1-byte characters. -. -. -.SH "UTF-16 AND UTF-32 SUPPORT" -.rs -.sp -In order process UTF-16 or UTF-32 strings, you must build PCRE's 16-bit or -32-bit library with UTF support, and, in addition, you must call -.\" HREF -\fBpcre16_compile()\fP -.\" -or -.\" HREF -\fBpcre32_compile()\fP -.\" -with the PCRE_UTF16 or PCRE_UTF32 option flag, as appropriate. Alternatively, -the pattern must start with the sequence (*UTF16), (*UTF32), as appropriate, or -(*UTF), which can be used with either library. When UTF mode is set, both the -pattern and any subject strings that are matched against it are treated as -UTF-16 or UTF-32 strings instead of strings of individual 16-bit or 32-bit -characters. -. -. -.SH "UTF SUPPORT OVERHEAD" -.rs -.sp -If you compile PCRE with UTF support, but do not use it at run time, the -library will be a bit bigger, but the additional run time overhead is limited -to testing the PCRE_UTF[8|16|32] flag occasionally, so should not be very big. -. -. -.SH "UNICODE PROPERTY SUPPORT" -.rs -.sp -If PCRE is built with Unicode character property support (which implies UTF -support), the escape sequences \ep{..}, \eP{..}, and \eX can be used. -The available properties that can be tested are limited to the general -category properties such as Lu for an upper case letter or Nd for a decimal -number, the Unicode script names such as Arabic or Han, and the derived -properties Any and L&. Full lists is given in the -.\" HREF -\fBpcrepattern\fP -.\" -and -.\" HREF -\fBpcresyntax\fP -.\" -documentation. Only the short names for properties are supported. For example, -\ep{L} matches a letter. Its Perl synonym, \ep{Letter}, is not supported. -Furthermore, in Perl, many properties may optionally be prefixed by "Is", for -compatibility with Perl 5.6. PCRE does not support this. -. -. -.\" HTML -.SS "Validity of UTF-8 strings" -.rs -.sp -When you set the PCRE_UTF8 flag, the byte strings passed as patterns and -subjects are (by default) checked for validity on entry to the relevant -functions. The entire string is checked before any other processing takes -place. From release 7.3 of PCRE, the check is according the rules of RFC 3629, -which are themselves derived from the Unicode specification. Earlier releases -of PCRE followed the rules of RFC 2279, which allows the full range of 31-bit -values (0 to 0x7FFFFFFF). The current check allows only values in the range U+0 -to U+10FFFF, excluding the surrogate area. (From release 8.33 the so-called -"non-character" code points are no longer excluded because Unicode corrigendum -#9 makes it clear that they should not be.) -.P -Characters in the "Surrogate Area" of Unicode are reserved for use by UTF-16, -where they are used in pairs to encode codepoints with values greater than -0xFFFF. The code points that are encoded by UTF-16 pairs are available -independently in the UTF-8 and UTF-32 encodings. (In other words, the whole -surrogate thing is a fudge for UTF-16 which unfortunately messes up UTF-8 and -UTF-32.) -.P -If an invalid UTF-8 string is passed to PCRE, an error return is given. At -compile time, the only additional information is the offset to the first byte -of the failing character. The run-time functions \fBpcre_exec()\fP and -\fBpcre_dfa_exec()\fP also pass back this information, as well as a more -detailed reason code if the caller has provided memory in which to do this. -.P -In some situations, you may already know that your strings are valid, and -therefore want to skip these checks in order to improve performance, for -example in the case of a long subject string that is being scanned repeatedly. -If you set the PCRE_NO_UTF8_CHECK flag at compile time or at run time, PCRE -assumes that the pattern or subject it is given (respectively) contains only -valid UTF-8 codes. In this case, it does not diagnose an invalid UTF-8 string. -.P -Note that passing PCRE_NO_UTF8_CHECK to \fBpcre_compile()\fP just disables the -check for the pattern; it does not also apply to subject strings. If you want -to disable the check for a subject string you must pass this option to -\fBpcre_exec()\fP or \fBpcre_dfa_exec()\fP. -.P -If you pass an invalid UTF-8 string when PCRE_NO_UTF8_CHECK is set, the result -is undefined and your program may crash. -. -. -.\" HTML -.SS "Validity of UTF-16 strings" -.rs -.sp -When you set the PCRE_UTF16 flag, the strings of 16-bit data units that are -passed as patterns and subjects are (by default) checked for validity on entry -to the relevant functions. Values other than those in the surrogate range -U+D800 to U+DFFF are independent code points. Values in the surrogate range -must be used in pairs in the correct manner. -.P -If an invalid UTF-16 string is passed to PCRE, an error return is given. At -compile time, the only additional information is the offset to the first data -unit of the failing character. The run-time functions \fBpcre16_exec()\fP and -\fBpcre16_dfa_exec()\fP also pass back this information, as well as a more -detailed reason code if the caller has provided memory in which to do this. -.P -In some situations, you may already know that your strings are valid, and -therefore want to skip these checks in order to improve performance. If you set -the PCRE_NO_UTF16_CHECK flag at compile time or at run time, PCRE assumes that -the pattern or subject it is given (respectively) contains only valid UTF-16 -sequences. In this case, it does not diagnose an invalid UTF-16 string. -However, if an invalid string is passed, the result is undefined. -. -. -.\" HTML -.SS "Validity of UTF-32 strings" -.rs -.sp -When you set the PCRE_UTF32 flag, the strings of 32-bit data units that are -passed as patterns and subjects are (by default) checked for validity on entry -to the relevant functions. This check allows only values in the range U+0 -to U+10FFFF, excluding the surrogate area U+D800 to U+DFFF. -.P -If an invalid UTF-32 string is passed to PCRE, an error return is given. At -compile time, the only additional information is the offset to the first data -unit of the failing character. The run-time functions \fBpcre32_exec()\fP and -\fBpcre32_dfa_exec()\fP also pass back this information, as well as a more -detailed reason code if the caller has provided memory in which to do this. -.P -In some situations, you may already know that your strings are valid, and -therefore want to skip these checks in order to improve performance. If you set -the PCRE_NO_UTF32_CHECK flag at compile time or at run time, PCRE assumes that -the pattern or subject it is given (respectively) contains only valid UTF-32 -sequences. In this case, it does not diagnose an invalid UTF-32 string. -However, if an invalid string is passed, the result is undefined. -. -. -.SS "General comments about UTF modes" -.rs -.sp -1. Codepoints less than 256 can be specified in patterns by either braced or -unbraced hexadecimal escape sequences (for example, \ex{b3} or \exb3). Larger -values have to use braced sequences. -.P -2. Octal numbers up to \e777 are recognized, and in UTF-8 mode they match -two-byte characters for values greater than \e177. -.P -3. Repeat quantifiers apply to complete UTF characters, not to individual -data units, for example: \ex{100}{3}. -.P -4. The dot metacharacter matches one UTF character instead of a single data -unit. -.P -5. The escape sequence \eC can be used to match a single byte in UTF-8 mode, or -a single 16-bit data unit in UTF-16 mode, or a single 32-bit data unit in -UTF-32 mode, but its use can lead to some strange effects because it breaks up -multi-unit characters (see the description of \eC in the -.\" HREF -\fBpcrepattern\fP -.\" -documentation). The use of \eC is not supported in the alternative matching -function \fBpcre[16|32]_dfa_exec()\fP, nor is it supported in UTF mode by the -JIT optimization of \fBpcre[16|32]_exec()\fP. If JIT optimization is requested -for a UTF pattern that contains \eC, it will not succeed, and so the matching -will be carried out by the normal interpretive function. -.P -6. The character escapes \eb, \eB, \ed, \eD, \es, \eS, \ew, and \eW correctly -test characters of any code value, but, by default, the characters that PCRE -recognizes as digits, spaces, or word characters remain the same set as in -non-UTF mode, all with values less than 256. This remains true even when PCRE -is built to include Unicode property support, because to do otherwise would -slow down PCRE in many common cases. Note in particular that this applies to -\eb and \eB, because they are defined in terms of \ew and \eW. If you really -want to test for a wider sense of, say, "digit", you can use explicit Unicode -property tests such as \ep{Nd}. Alternatively, if you set the PCRE_UCP option, -the way that the character escapes work is changed so that Unicode properties -are used to determine which characters match. There are more details in the -section on -.\" HTML -.\" -generic character types -.\" -in the -.\" HREF -\fBpcrepattern\fP -.\" -documentation. -.P -7. Similarly, characters that match the POSIX named character classes are all -low-valued characters, unless the PCRE_UCP option is set. -.P -8. However, the horizontal and vertical white space matching escapes (\eh, \eH, -\ev, and \eV) do match all the appropriate Unicode characters, whether or not -PCRE_UCP is set. -.P -9. Case-insensitive matching applies only to characters whose values are less -than 128, unless PCRE is built with Unicode property support. A few Unicode -characters such as Greek sigma have more than two codepoints that are -case-equivalent. Up to and including PCRE release 8.31, only one-to-one case -mappings were supported, but later releases (with Unicode property support) do -treat as case-equivalent all versions of characters such as Greek sigma. -. -. -.SH AUTHOR -.rs -.sp -.nf -Philip Hazel -University Computing Service -Cambridge CB2 3QH, England. -.fi -. -. -.SH REVISION -.rs -.sp -.nf -Last updated: 27 February 2013 -Copyright (c) 1997-2013 University of Cambridge. -.fi diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/bin/pcre-config b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/bin/pcre-config deleted file mode 100755 index bf8c7677..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/bin/pcre-config +++ /dev/null @@ -1,133 +0,0 @@ -#!/bin/sh - -prefix=/Users/sanchez/work/vied/ios/vpn/playground/ss-libev-build/ShadowSocks-libev-iOS/ShadowSocks-libev-iOS/pcre/pcre/armv7 -exec_prefix=${prefix} -exec_prefix_set=no - -cflags="[--cflags]" - -if test yes = yes ; then - libs="[--libs-cpp]" -else - libs= -fi - -if test no = yes ; then - libs="[--libs16] $libs" -fi - -if test no = yes ; then - libs="[--libs32] $libs" -fi - -if test yes = yes ; then - libs="[--libs] [--libs-posix] $libs" - cflags="$cflags [--cflags-posix]" -fi - -usage="Usage: pcre-config [--prefix] [--exec-prefix] [--version] $libs $cflags" - -if test $# -eq 0; then - echo "${usage}" 1>&2 - exit 1 -fi - -libR= -case `uname -s` in - *SunOS*) - libR=" -R${exec_prefix}/lib" - ;; - *BSD*) - libR=" -Wl,-R${exec_prefix}/lib" - ;; -esac - -libS= -if test ${exec_prefix}/lib != /usr/lib ; then - libS=-L${exec_prefix}/lib -fi - -while test $# -gt 0; do - case "$1" in - -*=*) optarg=`echo "$1" | sed 's/[-_a-zA-Z0-9]*=//'` ;; - *) optarg= ;; - esac - - case $1 in - --prefix=*) - prefix=$optarg - if test $exec_prefix_set = no ; then - exec_prefix=$optarg - fi - ;; - --prefix) - echo $prefix - ;; - --exec-prefix=*) - exec_prefix=$optarg - exec_prefix_set=yes - ;; - --exec-prefix) - echo $exec_prefix - ;; - --version) - echo 8.41 - ;; - --cflags) - if test ${prefix}/include != /usr/include ; then - includes=-I${prefix}/include - fi - echo $includes -DPCRE_STATIC - ;; - --cflags-posix) - if test yes = yes ; then - if test ${prefix}/include != /usr/include ; then - includes=-I${prefix}/include - fi - echo $includes -DPCRE_STATIC - else - echo "${usage}" 1>&2 - fi - ;; - --libs-posix) - if test yes = yes ; then - echo $libS$libR -lpcreposix -lpcre - else - echo "${usage}" 1>&2 - fi - ;; - --libs) - if test yes = yes ; then - echo $libS$libR -lpcre - else - echo "${usage}" 1>&2 - fi - ;; - --libs16) - if test no = yes ; then - echo $libS$libR -lpcre16 - else - echo "${usage}" 1>&2 - fi - ;; - --libs32) - if test no = yes ; then - echo $libS$libR -lpcre32 - else - echo "${usage}" 1>&2 - fi - ;; - --libs-cpp) - if test yes = yes ; then - echo $libS$libR -lpcrecpp -lpcre - else - echo "${usage}" 1>&2 - fi - ;; - *) - echo "${usage}" 1>&2 - exit 1 - ;; - esac - shift -done diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/bin/pcregrep b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/bin/pcregrep deleted file mode 100755 index d62169b0b5c15629af51c63f2e5dfe7c19eb2e3a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 237852 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 KJY4R8Z1FG67r43r diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/bin/pcretest b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/bin/pcretest deleted file mode 100755 index d69f19200a3fe0a6c4a06687ab2a1cc2b125e3fd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 287384 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⩔=0u!?8gjQH$( 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%0AY9^Z zLr_mh7CXZ1#T=P2SLsgN>}BpuLJx?s{HZku^Kjlh*lfT$UaexgV7R|D{*^l2MndL)z+$%{dE}G3`-pQBdYBC^;N=tT@}9{w;t|~0vFi((8~7_@&2CM zYfrV0N*J>{*X!SG$5@t8`TSqWmV4t!ji9XNwj`p0dd>0~DK(ad8TjHk>QxJa-(4tN!fi z$nE8}txfSrk6VcGzhLM+ak1s`!2dja)&`71_c3(O6&-KlE_mi{;A6W>qwznJs<4ZX zq0sm})Xq=DP2VQw^F!8b?ePx}m1IYLbHG##E9(KKxX0biX6wE(4UhIu&YtkiJ0^$! z!$YMQ<9@Gr<%m|-I4G#Ad!>7+K4KKXzRr(uw!`I4t>JJ=x&XI1-`5k{ov7^k^2{`K zL_zX#ifC`?Dr4SfpDmjAKgSGlOGzl_ac*yL3RSm7Jz^X8O!1r|=q;M1&7W z;A?$epE_mD0qio+XbU15CEjSzf(L1S%36trI6H-)1ug!}3h)flW49+PvB*O=Lyde?a5<^08CA}Co0Q99& zCYBwM2iwChzzci!5LKTnR3~L1pTaWAC#z9dl)gJUvP-9ErKeLN-|EtePvXp>KAdXA z7S6d_JJ_H6CWHdoPyj1OX9`S({`*XS619_=kO`07N8qRCN!VvPq+&pSB9GDC*i+5e_f^I7j_Ftnr8P97R=ZbtOJ2#t-cOt^f z5u(@w3O>^pRMVOU2R2?4!-LJ=&nvTHw{;D@P-Pq^nn_IjHvl8MWa^$o5XHZE$46gKzpi00XQrCjuo=TC22(437m3&b8XKfU-^HB?Y5SHJFmOvz?hfMe7z*nm-9% zdj`u$p`vv*be5Bv7I)_H^fXNJWO_5UpNrVq6`tH+E1%rP23343>~=EXMMZjw>5;Ps zu;ac!Nu!!F;90}nBOmQ|WqKgukLM=A6-skPn&ec&FE_>lcl$7mnP&Gr`XkeO;& z2l$K4SgArFa!d`6HJtr7iXh#`#>+=sKiBPBMR)Pu6?7NBiu3hccQzw;CU1RGpA%RM zy<}rMi}5>$ajwrwk(+Q`pH=V3-kG*dP-lCX;+&=#p#)!!S8BsqH6%wq7b)~42VGg@ z$XkGHMDa4#sT7c9awgIC2WXiz1uZk%>(t0wWo-<~WeR4jY=>40JXdPyoY8AHeq(FF zc&4`QFPlFvyOSZ)QdjmQVVU7Ml9@%WW&nLJi=LbT@Ey7X3>M=~M3S!SXb;lzS^``KnwUu%?;EHXT9N#xZOU!Rr+t-L+ar$j?F zqL}8*JmcJ@BYls!>v`-H^2McO;UL+4{i9%h{i$Q*_}H&MwKF%;?k4AkJ^<3c`h+Oh z{*RykyKf4w*WqCP^9NBD@fmK*G_?L8KC%1V&Xf9K30ABoi}T4=8&DvMCX%;7uXQm0(Z3k5~wAy4C_qI^d#jh~|C1 zBy`B$s3V?A*kG^*wv~Ee7#v7O+#eEdb5U+PJ?$Y6;aX}ouau#ARUtXBTX?%= zNYTvxls8+EVgxw!XhG5Z9%95EjiwZnnf)TX6>(kq!Tw*~VA{ZaWm{{MmVt}*8st(+ zEx!*rbP0iIUbJ2sM9FeU)uN?;b@7GB1BCXd(z0x7g06oU-{@DYp6v&3NeQkICljZj zl_^J>Of%p$FV67cMU1q1$iEA!bFYsSgL_TrAi_M7eXrer_$uYEOe*v{mNJ@EbBB-%%sV&nA~ zAn^Jh)&Qfy$~VLf!4@NbHAH!WSMbe}%hz{|dw&{#r+N!^18J_fVp{-ggH=O50DeYi4*?%BkSB9eu_!dX-_90GEZ{<2lpfg@I7CSo{N-BE}a_=*x44N2{!{80!3 zth$V7WcnP`$MzZfM0uHz)EJ#3w5b8$AcZMswf8G~qyefVY>vu|+V<3WaE zk*CNw)v0=`wDUPrd0>1{tCODH70zQ>ecH)v-AI3qF4J!a!v9wEiB2c;BeIbHrr-!( z6`ZU~@R#c3elExw=x$M?*JPaZQ!-XQ^kii835)VsKOzB*t>u5Kc*Glt2KErWXxzCEnk_e zl<0Rj722c#;Yi_#v%33}QKt;+>#$vF{;OXU%qs0Vz-T}G4E8TWBg$}BL!@(fTpRZ% z@)cL2+H#Bsa!c0P3LKDadb$St8oe&Kw%>%EC3Xp~x#N&Bk;BN7e?VRfjxF@rbk1Gj zM@S(k(-%P75n*Xd>~Ai9GGc#b{AEO+R##UKy^h_IVZ4@NU{AO==|llt4TZ2qH+aMy z7_rSvEOFM6 z784OPZq~3FhJM5J741ic8@3eDcFB&IFp6vS1OAsxUBVw+jV98!$MuLN5ZpZa1&r8V zU1SW^KO@Zl*XJX0<1?Ig8)CoFYx;W>A9_XqkK+FS=9~W^{}Zi;{{90W!q9tqeWOjk zzM{Crg@ z|2PZlWyTn57>yQCWp4z2j7)?5o8Qm|FFBJ+>50fr`ZmORJvd*HA~?K`;-J^SI?0%2 zWeNHez*bx%oDTPNXuP(h9J7?db_%HWbh0y$OT|^jyU~7 zK#UQtL6Sf$2Ml{x~e75haM7)SP(s zfy2{xOslK*)opI8O%Z>XnR0}0dpc8gM5fs1BAVm;^rn$-mk;@N!$t^Lcg(-?=!5@& z1exSj`}BwyqvEE&uq87^{)&TMzv_BAv)i#Rdme9Xk^~t@FBpx~QtfF9O|QGFuryG; zv!YKK<;O~LA67pGDgP)z+3o760Or9(<$)5&&PG8$gJ^HQG7}tO23jz2{*&i#zM>tv zyPRF^Syy-P;(dpwBU;h)wrcMywRdcGWztg#@l-*{dtK#T6}%`-_Y?t+>S{uW`{{uK8C{4)kTvDh!JF~FbUsJfu zzohWvzzdP(#1$_J&v7l`h#IVAYz;^ zJf;BEQ|;Lf_^QYH|IJ2qgiR{bRtO?jx1A9Z4pHi2Owf#7Are%OJq{X}{Blozu&hm6 ztE+2OM}4PHq-~OB-qUmQgNT~KF78z1T6dIq%r6x3)9b|04Jm6WZGqkt)*C@?Gh`10 zvHe)#`%MH9LN>Z!U*>rZYkKa!g&5OmI}27Zo*7Kut(9%)~^PhD8r!U(CZtilRJh^Yqu=O)>w5oH&zuHI&H zGJIiOa)g~(4(sXp!VDR0M?pcHe_VmO(=bg|!1VogqsXwQS0O5Cq5JQ}ut6d(x_Z)Q zH3{!+s%}c;r+DQ~1EMaB^Gx=R_mq0e-~}`5U0OF?9VDE)F^jWqN1qWlV8Oc-x6yCJ z+Q>hqhG&1!RtAv_Q52dtNqRSmm|{HZHM4jsdFuz)%5z@|i&k_{vWCC3`BQC#ISc@z(-*x(NZqMuisN zFnro-$~ZC0dl$x&h2}AZ zN>}}#hM1BQAqsbJ0z(S>r%-!NwWq?Fu}!P15K>%jCxtr40Cg&abeEW}SSQi3!sU%R zz#+!P7=8$GPJQjC5w5+cG)b!*qAcb_=?a;D;XVVj#6$v#RPUs-J+LvCT5^#RtO-WL zw|&x`!Ibd#VJ5dmnD!&#nxv5d4)I#q(N-N35c6`#LN64Ha$_f}O6dRY^kH!c-&Vc# zs}QtXamq8C%4h2VE}`j)2Zl~Qg?-49qzd7gjj`PW3blT|utd%RuFe-~#T%&p;0G@8=7~ zhs8a_hTO=(Mspx1#t>Kxz=W0VzD9S*Cz^YOZ5dwXvpky1_X!n?SG z&Y}@9<4}5%Ra+CN-bTIW%sx+_FUFYNg|~ZM4$$v+$?2LQeY;#SdNj6bh~RV4b@NGN zaTlQ4FGRc6U+v}FDx77y#{&E88`Ra%wnj`jr?Tm89n<+I+%sGn{2eEGZtgRc;RJ#A zHX+DnU9*gDHePviNEYf^Qg2cODx$W}D&eo+67Bd_nhqty`;^07X+d-s$Y~Rcz6wn9 z=4fVt4^tyw5S+FXk%m{z-N$%V@WT*{75@B7{SXA3)p!Ix<5cHpSx3U7lJ@X$jNf)7 zoQZxiZh9irfR>x)rmLDlCoAq=bys^H0<@+%2y$d$T;h=aTfk$f9G1Bl8~PSLbh?s* z)4Zd>-;dofHVH@ZyT4qZqiX%~T*R=8mRh|%j~@xoA0{C%ovIZ;YIJVT}tkS0kHe$^+;7xkqJ*O4-lI-ejqQ?w;O~H45?C)G< zkmMHz30#L(G%1FDYx3fOC6L^xRzq%0UIn-TZ+E;HULsk%@2zVauRJPCHzoz>4qMzZ z*WXoe^U0m?s0PTry4oWVW=fV{-jaUkeD&6foy+!`+Sr0aoykuc&w zb!(M#382%0`WdZN`%EnbRQCDG3P7QW*UUcZJ5dNS7BetktSa=t6NNmWfdZs}6*h0U z8_!yXp0R>!1IeS9@is-g`5}xY)$D$1Tg=pfO?) zNrdF`qby6Wj*u_CnxwC=yX>Z`pUA-{yZSdhcWRUcCFN4-%7}B%sFq(%lE0`@PQb68 z(=Yp8V9a>Z7f=NM{oR7=?{J=eYBcd}49-=Vn+3*_;8y$AbK>)(;)^lwqTd5TCNn(^ zW;(v?Dva@5x(=#6<{rsJI>s35bU-Olj)g`h|L|*5U*#I*&Pu-P%BkeLi=>^2hGWJL zuIyWlki&}CJIz~xev)Ud!&)*UM8`LBoO(E;}CUK8wIqF4CteVz@8b78GmDae? zZ0=!-0UbpT1QDqYa{imiEw4=T-ux=XYi|=U;(;a~6>C4tJIB?jjOSAc(xcRy89x z{NRXl<&G-f%_v!lycOyyP;w9-Xp+2!CW=+2a^HTfjKrZoE(`5X!$asD`Xd_Z4;$?d z`t=RQa5?RlyMp!!^0eYa{L&p#(bJGTzU^b|nwg@%suu5CybY&-zRrJFk;-3FbYCC_ z6<5H=`VE*k?Wbb<)x&&SoR*eAeNF7)p9n18IX_t8yeofKxQI>C&jB}p!gm+v4C|`FtBKqd53Jm+g}~l}5x*_udT--{MyYm#o5ClozX% z2D&CW?SoiN715QJ82nG~=}L^fPx7*mYvZ(uj*_|Qj<2Qpi?{9J7g@z8rg^2&+OvZ* z`~9zvC|b5Rxl>;BuP~9qlLAC{06ckFBq$LVNS~ zkkPR04bTBK57jL1Vc7>k2XMN9fIfKRd8Rq`G!iHb{-?C5*Pq@fVN%XY^b@}EO zq2X52Y!vpmc0^p7F8$h*Et2?CJ0k94x<8j)-ZC=H{~2(&j0xhUVhdam|xk$3xq2GSp%wbRuGfr_5XGnc}@ccM{P5 z>*`i^z;}3n?#1G!QbeUNN7GQcbOLrJeg5mG^vM(t{ialF9PR7Gy$_VOSli4kQ`!tI zliO09Q;>IjOPObKb8!<9F2CDtr*kB&am9;IQHo!hS%SDL&^zxHgKq#Gc*2y(YntP) zoGQaQpB@BH2e@_?Uvour^%OI0UEPbl3KnPoF;Y|x>hbvoqGyEPZF<^T zAvAB&=-quUY*KlZhwb+>2K&9>dxR62Vq5oWSx2V9VAHKMH!(UXcwwcDZ`2V)sU>m; zWX17;V!I98$H%`f2c054X6P`(L%d@02GjRvh|v13%KP_-v>krv1$Di>j%dI4yEkvK zGJax@K!SSA6~gS0jz2~5-U97jM0tF5nwMfNh*b2`I^<`B3mf-@ zm7>L7y0&$-`ntPhUW~31BbCI_6?Imva@^uw?6}$MbyQ;2&@~Hwmtm$(0V!x)pc*TY z&OMRIuvVGGbCK;HaqwKki|0%t@Qj@X=ObEeV82t6>saIFiZ>fvGVWzap$|B2_c-e& zJos`%(%ybpSF5dKi#MB+P8vWJuTih8{U|dTygnZ|8lqykoZzXp4!Wgkt9L`T!AXMF z?d{=gNDD=};?o+wJ)FaWzxxgy$rA@edT_8rrJX51ipnU2y2+mq<-_GcGbgnPvvyt* zSek?MBfu4b=l84r`!YxT@RCE4HvyyH{H@u`3$D8`1LwVbP%YQc7az5!!(`0z&^pzVZXLnAYycoX>XqB*3@))!g zh@8p$Bx37Y6pGJ?1?0%<#LLo&Z)%r|CyYi_PF|K7K4}Q(>zg8$l&VBc~ z`(AInwd2!>OIh3j85ATackq9XxQvpZuC}la_)^Ex%o044J6iZfDB<>|F}}i8pGNHP zT`8+NTq|w5724C4(4L+L?dkc@p1xXZLfjALn`Dcq$=oAjrnQl#Mf<8>`FY?2`1@jn z;>NxAGo^d)E%$0Ww5!@pJ3H%RaI0utT~6mEyt{PoojfTr08$|iIrK?M2bDQVF|TJ_ zRv*K4Ktj%xMzu^-PuDngqxc^JR^NxtCU6zHTof8CZ*0o_Q*d3~4$R9B4UBNhI|+iT zlF`r^b@wP86A>$l2zR+L*9ESKXg>*0Z*XV3B5_@!HKkvgeX{UaLerK+uW!QYFvy>G z%yx*1$9=i3?yZZCoOXvSd=sN_5V_3}RGU4yUycJ@U*tA`bH|J}OqF4k7#bAA4ajlEG^-t@+oN8k&_DD=70vBoQe!3~VYUe|q} zg@3%RY{z_|UF7V@>`1nYij!^eLF>+mj*7?DIGD#e9HPnAZB+jGeW0{%pL(^hl*E?Y+Io|nu?l^R-ZH%>*1^l)GR#&}a+m|Lh`7<5q!2vU*Op$ic5TBC~)^E_^ zB>KQj`JC(O7`?c&+?R~C0~lXl-ddGIcOIRaXX|C*`$*%33KOey3wt)Gz{wpne9}FS zY{~_%7(Og2P}W~NZui~Lm7_IDrc$ZdvA*05Qj67Ru!*>5vuCd{_7UtBCpiWle&&~p zwm0c#^nd%RTi?}JP+#Vq*UB1*kkWW7H0+5U(!Ma)NGWh~S=~4v&ni98;~{(aTRnIu zjC{wXO*~EXGY96pSq=~2($CVp>*~^4m^}O85^p*<_bb0l_olT_X!41>ybV^Lm&Z3y z*rVux?6Z~8P)JhZEe9Wk>KzWlOvEnvDXkSgeh4DBAZ;qnO<{kA@JcV$d?CV*jTBO1 z&n1|B`@#>9ky}f)OC3@^|I6X??pWWMhVSZF=xLEL9cp^giNE0vr$^+3wq;C%eI-*u z&pnC7>@9EIVEX0^BfR%^f)LLFI8ZADH}A-vEqPM;K@ygWwO)qtJdi(UXK5sp41 zm*;I{gcWa7>R|T9SgPldsvdq^X1rk&+qW$SMb!P}a^`wJ8lX|SYjk5p( zc9R0pDOZH)5;<6d*`x9rG8wHXK=-TJx8%IJmF`Lpc4e}o(jl5)ZeDbLSUN%KqtOGS zF%A*cQgjfq33p#X15UjHqydKW{mI!m-=1Gr7gtF7(i#}eE@QGV0rQyDux}LsY{|y6 zeJe(Nc^&5h?)-oT8s6APD&L3kBLbS%W&4)Gu0|LP#w`O~E(~56TY-BMuIU@fLHe8C z>NDcXh-VCFwWbT{kl7O9@%mSw2`C1hC2e@D&caW&Tib}PY)1|-y44L*yV4@H5zQSA zcH+ZdTDN=7X8<#dosY?oQPNXg-AS>=bU)>W+@Lbkgx~)7YbrBM*oY^T#-tQxh1$?Y zxhEN|q=0d#I!%I@wfY>K6ergK>pDE2eJ}E>Kyq$~$s<7hoW6c3~^w2&%pE`J<;+3u2!?1^J1w@Euy{FGMek-BUL zrEf}Km|i!od3+1-9_E*U-yN2PS41(8nZS)?VLRa*yBt!S7SQfCz=n?J*1*lABd%mT ztPUu?!vMyZn|^&(i2OLABFx(k%I)qct<*@f44P(MP9}^U#Es9Up6~R|HzO=N=081JmL}PC$933ZKY#h z1x=+zo_s&{y}C=6dos6`a{j7nvV!;P;-EYD0JQ#+PG}6N!Aj^^Ezu%bAAA#M@>?=~}Yf`J7sv21b;}{KI;;dHA zA<`_`S-_V7D>ooI*_&4dbuqsHYmIcfIfKK=1%a)J2+kq7ZH;CPIkLznDItnoI3?&= zlHuL=fRRYed+(zXt7_123F}E!%`3eGzH5&u3w*`U z7SkhAFgztVDI7lyti{~)v3j!u9s`t87xeOvns;JFCCq9S<7^SXUBHjrYT!$@Q)o`0 z*OJ-L(!gy5)*u1joNCw86UE>l+`2l%*W5aCJ2RES`eWxe z@Mh@MQ^`?R-&<~#?~cra=MDUbZHCQ6?78N;2Ce{b3e--FLPG;7TI4^56YK(fF zRQAGHzS(-b^UsmF?bg;3kG<{`_z#8-N{>lEj}h(FfH-Jw{$)UZh*D;huK#5~e2C&X z$KbQc>a$SUoT6+8-3QR4IA68h>a#^P8|ds}KAS3#m%Hop5nd+O ztuAk>U0Kp(R+W2wYEyF#){F5H)qE*zG_{s^nF(g!L{+Jz{XVG{owc`~TL+OPHuWA;n2XXb$aKATJqE`r2H z>9lL5=N{B1ovqd8!0(7r7}&(-jt(x=jyPAX&G0YAlkYYebJK$lX-E277y7t8`ZrxZxRdDgiW%oHs%fb%y_TZ@i)XN4Dwx z4AGA)uySHP*ehd@mRZxQV0Lv@nkA*NQ)+i7J*Vg?)z#4LU4 zpV!r4H5c5OQ{G~2PVzV8QfzgZLmXyVRp;*BgoOO;`8`>A8vtus_!k|!0J+a~r=}P% zGn2ndr+%x&I%ugSjMCO+T2_=HzS(E+Rf@Qp)2IcL4Sphl(WQf5liIYvn)!LMMVw15 zzNmNBw6;u3f^)9Z(j&?nX~~j{9NM~DoNVz(i`h{Cj>l~l*5ET~mwj_G&3g+*dU1OR z_H?Wt45ffC>^w_bJF~y#HJkdp89E{grZ+)E?SJwtu+5T-rXGwip52ZOFs!}LAu4GF zT`x1G9J$*;E!STK51Hs&_^$%%>ehTk$7{aOAg{-GI>G%h3X|$v=(!r@h?FUZp8U)yH(TVa*mH$_D6<_WEf#6!y{{m$#;Xuds`w&!mpGzKZSG?cf0F zAi3EN9$-6k+R{KBx*K9q=BZ`}$0nPI;B2^b|GHepaOvK;L7HRXwwc;bA_kYZljbwy zB$?ZQIyxNAnP|z{hW$xaUE6@Ykjo$ntBI~a1t@rKQ*KnJ1N#e4DAm6ea&p(; z0CR|ztwCw3dYU)C{?h&Ha~YZ{k=CsUQywTSh4KyaT&~@rF`)LHOjlIvuD8cOz`5*LU?zbwmH~9n>0?frv1^)1foy z5?*%CD5dg`SoA>^&W>#~Ra7sG&W2GaZ$$g$z?nGcQh8QE%J6s0V+7~di@h@F=R5*w zh0IxyMUkNQ}aI#{P+{4 z#PSexO>r<%3;Wo!e;mS8=uRfu4+Dp4O;Nh@>kaSLI_&Mx4i9c18mzpg0^aKTdB6~H z9-M3^MM3~kf{)r))mzEsV;kuHTUDEE(blb)y4j@RlTN}j8Z^Z2{V}!&jl#MOwb)N| z=U{Dio2FV@7h0GJRnX#N9J)Gttuk{q_8x1{E^7o;Pg696reM7fuYRJR4em>x4BK+2!ny+$Xa)D!+6p`3 zG3J)(&6SS5wbedpCIbS}6TRN*+L}%8{SJnkgxH%$kCeB{!*TLqC_$kOZPz{5wg{WF ziogMi-C#8+Yu0Kr!H<773XkRso8%O4kMj@1^1*@UkI+2NV$W~VjtM}!kf-=^39LSe zN6BN&2pK=^>6OT1ICHviU$4RWMD8Z-YT;2}GOL9ra3)af*|z3_gOO|2NJ{oQ);Pql z6T`Xfcmnvf*%uoNI_&w-qo+W?b4bq zi81`Ah8cN~Ajlv=Xd0FvbP4W;9{XHMuXI!*mF&~){IDE>-d{acle3(skQi&-^$a+# zk2L63n);NEa?Gr&Z%f0TUYSI@YURqXI%BKPBs!-ls$K5tvp1O4<%rg9n#ySPXZB+L zh4vXfa972MH?L7O(bz;-b%BKusd_ddN2Ci2dg+Rv-ND(tfV&HT)iH80ykU0-?|bt2Eg5^w1%RDNVd3^b}M8W)aB)UQdA z_c(Ipbq+{`pgH<5`x+#059OBa)H@Euu;s}kwwG<&ZYuGtJyBYh%~#awf`*Gv~q zTD>E-Qk*BY`bo#!V5XO`i+e4ki^M#NFgPXZ`Bzr%t7CgjY%@t0ZtdB-GEFNwGs?HO zj{3;3k%i#?YOy|JGA%kvdzWihmV3%U&r}em*a9tRF(7mGcHQy@8*j6LcK>Cd@rWWE zM?f)VQ7A6gUp-0ZSf^Xxzwb51Dd87-s0W`HU;E>Qb#-)aO|N?x_88+2KcSTbXig&B z0^acY{`Id}x98;v#==b+_<6) ze|b^9e?iftz-DJYbnT9-t)T9H3)%OejGk4;;d>oA!5s^OHx-TY7Zhm%Th!If&pVsI zMFKwyc2uK3W5yz7f(UY_!O5^D2r{6tsAP=R6BoUsS5)hkASI(Hf)`Q)#orWi-PjX% z^2`LH0q@KR-kH&DB9{l;)y+(=n}N>RG)Zp-Lp5#;F`NcJ)d{^45i|J?oSAnxt7<-!T!C+N z2}`Ai34W?+ofVM~H!M^K+?3xxSf0rvnnd&}YdguKycQ*RvB3S^&N?r(tkRe~o9H>6 zI0G8J_>D>kD6T;D8d70n@XJ8xZPnI>gW!Q({?birlKV^Rj)uo2kyR<3jK!E)p=NYl zutzSfGp?fjcetfT03#J1S7}`ro-8^?v36Qd3@4$blYCk_t*?6ppsA+3=}NG)?oV}O zC8JF{;{xtMJ&(5Y1}4?i9+VUrg`Zuw_T7xgjG*}#s==R5;~8RP!!DYm33^O) zTp9S#Cy8|JlKg1zF}@U6qBWE^%@5HUY5L#7Y8^X)N{e9u!ST6H?0x5mt;bfGdsxoY zT;8(T^rz0Lb;nmwcx|-K{=5`iuECOum9O+liP;025|ZH=;oZzjfkiVs9kmgFb!RVC z9^SjecsQ3g`mH#fl1Z}1a&)%F7o(#ZwO?1a@%FTe^0s^TeE!75C0Ms zF>05Rg&nH9dU85q7b56CpMCSV+gM4Ndc@K-0%C z-v>i!+ykLB;mCJ+T;0Fee%{)bDRI+vEV;F>6fq%K@j67lrfc`_5fVHVAufsY<#4r_ zD@=vA9I=ob{Tn@cG=4{q`PJVPdN-X|oC?6m7sQgnS*I1(#Qmx8Yh&_ToSa1*{F5`O zoGqlD4RazABhhn~zxiJdXN#v4el+BZ@PDGd2vrd=d=VZCfsZ)k`S9(Ky7nFW$w+GZ z$q2XqzEO8uWhX4^Nt>y+!)nV*(C=p_-)+5eayW;)R~$Fbs_9f%#vB==Xh%6BgD*si z-V3N|-?eAf87v-?`~>UdoqP|QE4QQ^Nl~ya){t4(7m8UOGfpbYlb>d&TyH$3LF5II zlZASb|0%uL52o&{r=3qhPoKdRP5HxVXu{Pn#j%uEPlAU`VibsDmIst6v|bh4BcLm} zyY%sAm7oY2GTSQdq$MQ=YxJ^!jn*_%B>W<(DToUs1TzmO1((3G!!he-q@(GVXhnV- z57~<1vk=44cpx{TQMmWl^TZCTTvrQUuU7C@r>dWi2fLv!<#rZ{-gCZnfIg?X_k52#`8gGvy)dYQhQ8aG&%fuS8dLPWxTn$TiHJQk zofUeZC45CseKPcv*ymKH>}kQ5`P%qV$V2r=-*bw4;_junB#+Vbo=BX>3O&n;9<~_T zPV9}G_1W1$n#X0Kc^V)2_dLwf4UZvpMJyLvOzWe$q5Fz@-^+fO+IA&2cDw{we{+%Y z^sGKHIC0d9%5XJZNpvc|?i|SU9hw>!*EZ}W@a(0 zB!{D}z!#0kC zw3TnWFg7;Y#?R44+WSSpvD~bXz}tg{agzcxonbo3^Vbj|0^`&80F9u;Ohg;w*n-Oe zHt1Ki)0X8^9AkZd(VPDT3V*O)|K>z)OehV01Qz-22PkjOczKuWrSMXc3F}*KdZS>B zYYWmb)trirX(8@r+t&Y}cvHm1hpM7&A^EGvibJ#dT<~Mgz^A#YhQv!gO{UszN%We8 zpGNPTWBV@7>bofya(w!yHt+_y(h5+2lO?1#PDwqgjh8fzVv6BEPuCk*chNF5F57tL#Y)vK zl(Pc<2)Y^@G3nng8;2;e70mHwxSZpDcaTh%YRnBs7VjNQmra>*Ax)E^nJ^y{U; zAG1<6Jh~%-wj$I&18qT!g1D3lSOZ{Gm}=EL>!|2x`U#n$!RFgS>}&qWJw`;K-^@ z5B~w56Jh4>L5pSDF?7dP08U_?W8YR_w-VIFiDP)EBqobaJ3*r?Jx?*Ub8q|~_UPy! z$%jT2x9w}Bkf!o85i@zz)iW=KD8ekAFS&`Ze9> zWc%8$NzopR>u$d~zdsb~v)uo$Jr)J#4CUF$+rIW@@oM+i!@eUn?0?rT=AVI9IGbm% zSE%#-fSxWg)@a3==2XGrY~T{q7md6Mo~=o*T*ORkFl9ZuS>EhB2KDMpAC>8K{Tx4$cV#r*6%-R-@-TWUPOQ(oW_1f2QyVa=ALuVqIzPS!j=uMBkVnQk7FS* z9%1_<4~tYr{5r`m;h$ep)bUi&NPkiFed^IgR|3#2WkAy^x&T9pICz&L)*!|sj~Vk^ zL|GXZr0=8mNHec*&rpY;3`r1s^-kRzK3ntlTxH2^ZFh@ zuUY7tJ!TQxk!C-nDuh>3pWxFXX<&|s_ofN2^boDue+srR;Mhq0)^E;WPLzyoJO|$) zHo_@<^ZLq{p`7bjG}}31$cIRpu(dm(*GfpMd$Vz~(#8OXXSlDg`{;RQ|4;U3qbFMf zKUnxOuLXx|Fwq|`_ABGWr#`T{gjcan-V4UH%2+D{9W`B$(;6+4A*Yr1b}`4D+~L{wpeNg4`?eTb&n#(>8`dH+jMq8MEB zEx*vW6ZkmGIn;O#WuHTx{t#^UWq2dG1#y}8^Dmn+XmXFRFIzRyFo=W zGM>M~{_GNFGW@snoQe}ek02`&r<4IJujmmo3Ap|)(B3PJTga#MliJd{Ty2fua*7B$Ib@K zJwE%dk1=e3zDba`0oM-6nHM?KKkweXzl@6gmr_zNr3gy5wME2$*=06eWi zh6UD@W?B5Xd3_skw$rsmW0Zj}#(lj!f2r_J8YjFH^SR-snAS&R?EBbNOKh*f|LC^| zjN=xZJ{n$_#C|qks7_45nKUbUJv&i>>$2$ev_uKCTZxfb_BnlKBef()G4yz+|&q(#!xv#vbP-+KUOFW||d$XFvRk;lA? za%*fO&b=F+mNd@)Zg_T5A-=1V#GSN#v~|+pyJ1bzG(0T=+|S9+v84wQjZd6eXoY6( zXc?u{5{LeF{N^{qmx+lxb{LWjDgem&Lbfa}I65~o$bs`ST9#u&xgIeO?D3hhLR%JUq5o*!{OJ2%r7OEvliNJPekOQEf*UsJ(9^Yg30j}Xgf`_ z5ozj8bR_=l6r%^sb&3b+*}nvRHab$D*@SmGA`BN-Oto2K_HlRGq?ulu6!9wV>6!cJ zR9Yu!DO#su#Za9=S|_E#Fk*b1f$xc%42zLCzNe8|0mjV;R>eO_+kt$v9qh7LJ7|tL zI-1w%DB6}`D$EtEcedKPoTqJFAzG))67A>1!*xb;qjdCi1!|L6dKxXD=(=c)wD%IU zqcI(pDsjN9WMs_Y@L#ta_Ym-=*mB-F^}=jz0$R2eoyzKbPi>`i|%{O zGWW_`5B`vhdsb$D+>$S>m!#PD^-3gjmdw54g%@o$?kS6;_gL}-z)-!N1r(iQpJQQy zDG{0SGaJ=G94uCJer6kmy-a)VvP5U#!5clt94w`)$nu!PKxxTX-+xU@CWGfOIKgN8 z9P=`K-un>OckY!k2iib3Bc|e2L^U9Gl}8Gl7I=Bsz?4dD%Dt_;)S&Q)V6!;FGxv($ z)gPki7!3BrUu(-^MfB1_z#^{tJcF4OD9RwVI~Z)PRG-uhn(? zX$gsK{}pP9JWApaF=9`+8TOh}PZ%it9K9>-W<`4TWFsVI{SBW)$`O?!<^yrq6V_F` z$iOt+$se}g#*?NBoM?QswsQ@MklU39RZAwRHikY27m>E%L<4O#ZGj<^IG-ww(;EA} zXlRKz$t2Z7@cltkoQa4z<*NqxrKa@_4yb;nIsdDH`fZKFGnFe_FA1EBl(~T{RKs5eWOP~ zg8y{G7qDAiM>fOR>UQ!Xd7W$$(T|CkNGADj@&Wl2znesv{@M51VQ^`wOM+!d= z()R9w$7LeyaGSrR@39V{`!S;-kRjT}0{ckV32m~jkE1w9$&#u}`OdQuMHkcir{ovI zN#Z|V+t5E5due{p!cla+d`Qk93S|$W?0*?ym_+8l59FS%zOioLf*+XrZX)%jTX=HW z;@<3;ee78mV(XdR z-O*<=hte$%(p3E?nJlhM6w<=?q(yglTKy(Pjy*PRz+UT6~%*cNed z(7)g1qVpir<#g@>jEQj+y}?)-sn6)7vA_2BDoELHjzTX{_HQXU=<_nA zfXUp`Jw!xHe)Qi`7?DDxwE<6CjyE&~ZB4wd%Ska~#@=L_bQ*edy z1^>n+fjR$HQjwpQQvgp$Nz>5Uyu6@HKgQ4LbNzooyh1vM@$d{!eXBu&$SZ{gobG4? z)@oujX9E0C?hfBGG+wlRSC5Q9ixc5-iLlqbI3gZjsb1fo@`m?3ogwk(jry>^UH`pb z9Q@Xg*+5C%{$G!>Bsy+p<2m5jD%S&;+Xr-ofqGcr?G8U6GWJLb)fuKUbku&A%qUZt z&vh#%t2!t0h&>3XlFut&d%0I6S_FDCA3K<85N{a`2&G>H$ju5O@$ZsI?}t&k{;0* zsFb|jC4ofq7AL)Kbv^C$zym1N1RK`Qh`mN^sd)(NN7Z|{^$O$D6% z!NvDo(uk@s<^=MCTTEGjJmk>?Xgfx>iP65SKs3F9 z@4Hpf)k~DLT~(RuEVLF0xKwjwUGQ5k#hB7rA=<>Y_5BB4Wx!zqug5pHPx)`Wf>A>h zU8=CIJ9eJaHg|`f7Z`FeM59d2?c2V<*asd6@IOkiK5pr{;(8JuU4tUXZy#l|^vQ^I z#rCE2D3Yk3)!=HG-`xR>BI;|n0bY=)uVGOzb2O_LpBUAV6A^JrOEBbmr;8tb!dtJb=Kk8J;8ZRH&v(o!{?kV&C(@ZDBXZ`HC<^-;Q?Go)8tT!BL$ZM1Scpu!DR$>#^OejZfrVf z3p`ocK9x}i5VZw$Nge?amx3+L2P~jg0Q0;3M zVEHMGb4B<4Jy?k6%7jLw%Ky&}jqO-iTz5GF5@Ljys3eR&n)$B_3CLX&d15jCYEN4N zx81xG-k@&>ZoPTYx3T~?aP%RU=`_YZiP?AoHg%TT2~C-^&vMKwf^vC zIe7oU%}G1{Y2=(v4v;x5YQ7b}=AyF1pd;5#wT&m~{=KLTvFn7r4~FfC5zc zVa0aoQZ+b_*u5UdZ8OWCqho>+Kzj91)ALb4F+igT6jVv=b!2!x@DDS1GGzuH- zI{b_5*p9{gDPU|N&pot*hwQ*ZPS*Jjt61~wR6A?L5$wvz>LYAPsVkz)L#y;?;yQ7mfS|U!gV7GX|$8SPxIcwzuYHAlIh=gCMR~N6worWphMiYA0EjAmg61vx$_+EOFzh5|JS$K5x`BJ*+sppBmoU#n{ZN~n# zy0R`*^K<;iEcs&3^U!nRxSn6Q;_8?j>NSFTWzj3VZkh;rFZ8tYsvM?pvDIT1)lsac zRys|W#8o^d_JVK2BMe&1xcX?Co1MuT6ekvoGor~>byxH4wnz`{8%D5ORb?FP3%a)H zeyxZ8E$vXPwTCG_+;Hzsc%H6@53R=@<}Tb%pV}`zwl4LQ!maTvHm^6OoDBD)lxpE$9hfcN)IYfk-U<~5#?&vE`S=KiJw9)Ef_NIAK#MMeZdUdsye^0-;IxOO@ z+!WfCSOx46+Lh8C@rk=~nmBKa{ymEUG&9;GMM7))uHH%T5x`2G#GZVQpZEEDmZTHi z!~DzAe9F72oCcnC*T1~_aVBie#aS<(`7(_~4UWUSHu0>8VBEy#eGbh>;gw6i19U@P z8TrrMI&eMf;AcO{eK;tuWRee~rK(jj!*lSWmotYU_dEzx(JPmn2XNQm22kLC9sWP@ z**NUti|q3H_AUHlt4f+GMqW(kX1_VID?OYisxp7%i<@yX!rGV&ea_K`l5KN?`s=P; zRoqD4iK=P6!IU=HfK#ghUYpEEx2MInbFh|0Mo_yVJJZFiN^3%%4sidQjIly`6x++C zEBreLH;FNOx2tbwjxHlAa&T3S>xrBr!Oiv~U+O>0?qkv$H0smd&Cq7p{nz?s(6(&?MOCC01H+Zcyq(wg`&aKU$%S7#pB;!~ zms(TJiB{-!bnNu-X`~Om2ic}%sgD+X)tk;I`_p-}F6vtnm&p+2aH)6JDwXXQw$=L- zu=ZeA^Y`#hW-+L0-q){U&F);KX<%^ACA%iMnTz&^ z7-aN}5vf=fwJBsW(u+~2MU$vN@y6IsDu_K%?%q6m+N{r zn$b^gNSt&{gAC^?wqZ~;vEhZmU$Mkf8*plvjCtxL{JSS1#Y%NZx5YY^m41Xp;BIY>~EBtZceH9R7?$eUpQVwj#H6A0MbP zvg8*4sY@rulxM?hU&Uv;_`r9@$N>dxge)_4tMqI8-UQebi2KeFv1gj>r2p?h<|CsS zHh>jVk1rSwu3-B&#{k&|zTQs)YZY22!<5s-o_ypystL??MDw{`cBa8M!RoR?8^=^y zvq96*COq$DyrC()m@Ud}%x{nhM_?gg;GcWtx{dw^Ot73+He7&ZV1<_S*8Sndje8ad zGBs&$xpZi(V|dcQuR-Q#(yqrkt7QF~%jnkyf?Q3$MTAKwOD{sH8`s21y6@jPtCaoW z_fV;~s;JBYL7|3kljwg0^d(N7p6C~K#XObV{JX0qN!QIoUrc&pDyc{(pC$4-S|BLZ z_%@~oJ}h$>Q$G{l1)GfF*zQ4KfWo%Fkbh8!(vU{&bvEBl$ixmGo_?QO&E)b%_*^9d#lZ)@;@xJY`U9b-#?_?Xb_xi;L z-IKaHU5jpy?i_oLP2!Tc>3A*1t1gT_)B7{*88)7a=Zf&U1+S(s`b_Wt-_*&JXUbRL z^*g-w;`OPHKGXX;{ZGG!<@6f;EiHOlG|T-h^s3W;!AY;fVTZ%M3;QjXp!zL0S9SH> zXuUf9YpU1q+ttsZchSvy|9`pv+h!m_5ux}cUXgeK2L~_uOz(d< z()$(nD{fKVqI^K{fI=&y7k#GpKPsoZU%3UZ2k?rQ(ThIQ`yZCusobeNiq|f@^fG$U zXL|p`au<{rl!`D#*cZw#lsPhb(Pw&J;AYYzW)=XGtfaZdR2^uo%WGluQ@udsQ5AV? zRu0i;iotL-n@v>HU_FFfpQNu`<-mPel;taM--CF|6P=wQ3XOYPX9tZQ=|zj4Jg)<7 zK2pc%E3G?#Obqnx{i8k7oy-E!p~YV8De)FH=e2A!oe3VWR|l5Wf%X-zvZ@f5$`)l? z!>9k=KUxc|dYx#qLL4W&_*593#%7)BE{8Y7pMfBeZQTdolS6?|?KDoF#yKskwZP2^ zdppOqB0lXkb$OtxQ(Nv#S#4DhD40VjMOGjfsf$|Kf)?wTm|5sg&B4n`I4Xd10oT18xSm`DaUku`mr5BOUV0 zcrLTR&iUj+Y8%+|-O{|#tg(3|jd@$&3jDg}9-hg)w^v-9mV#zR_@W!Aj}}%)ag5I0 z?%F&b@=vr@rYx}zrX*SmJXOFGU*`y)me*9`k_narqpJyz5;?6XWxqLJo7$S}%kYx@ zO|rgG#*#~jm^<-CL5nf4K?grML0MPQjPbaDk#&&1Z4tk%s5|pzdQl0Y!friS&}s~H z=;}~*N_~lEDn^*yO(owJOI}xB(n{a)-386Yz)4*V$}OeuT9B=^8~hVJ6ZFlG*V_wv zgsS@a0eR}sMACLBfkwF2JU?(b=Iog5maqw9Y`dZ1-mrXr;3H^D$xBKWvfUPgKa{Mu zE6j{=3tGR2#|}a34~VVbi`JiuUeN!QXd4a}ZNu{e-q?%OzD#XbN zih58c+nzFK3hNXz(1Svej2@EW@V)#Avtr<_*u0h*!Pvqqn{wbS+3mKw(7p-nQ|k|e zT3?0MKb4{NN2JzoSxK#*(tb{@BR|Wx<_uw-+{(kg6zB@~EyuUvr{OjGomr0dOPZ;D z*cq)-4>Iuyihx=4R-mLh%XbA>{wJK4k*AF<@2|~7_Ex8Daf-`yNcg-q1;|_Ku+qVEwV59Ey$p8sN3}W+GDqRvKk!{v zYeUeWd&YDRUn=~qmeprNLlqDI@p%Vv(kt2gLxBi8-CI+e>E24H$@8*Bba%C-=&a$z zdBCT-(oMh9uj-m#q=;kmO5@v-QsfS|()gB+jqh=Bd}qKpjgIl9u`%u#8{;3w#@PC! zF>V_-#;FHKdw#!K>KXki%W?C;_N6Iu!}q?8dS6_JXK7yf` z3=jFj9(`?X@E5T^m} z6qDUgLN3p@B`=!-JLFrj)3Gm!>-;+5{^;uHtA2XtE~dNV;@{S38&mka zEg3*H+T6Y=@pfo;KCG=6xnm)u4Dy78zgMKKV&s;E^nS8;t+`}d#mMYi_bj7ljkHbi zJZUc2#tyt0{UKH~2d6MvSJX$hAXyNu=M^@D3u`g*=0_kSicl zB+Jrf!gD79W#PH=1WLQYL%usrL0LQb?MM=c0ul%}R!g3i;-?z+`BX#O?-YGrP@^Yh zE&05RlUfMj8a;7E6gNRVD$>%My|7%*;Y|Hn?hky$NMz}U;?2(CUZlwGwdSv)={{VP zT+jksR3pyyz@K9l1`Bl4fjX-J=4>NoDD`qAw6csasWzv1zL_ZT?UpOUcfA7NkvFjN zg={XNS2Zd_>;aT5!aNPPk^IE`dsEdelHiPF-vAL_Pa;$$gc%obD zvRcCnj6)^0umsBrJVQxbZjUgnHlhHuy{@)^5%OzU!9=%=$nzA@&hr&{^IA8VrZ!gt z9~t{;+8XP#;6K7=05@dZ&il|IQtM{weF;h=T1jdz0y5m2f$N=FEo?gN_d|hCoVaJ~ z@I}C$XNNpB(w@HuUam|!Cn&o{`__%y^?!7X?)qm_Mt40ouJ8XG*Ef1qN&QpbK#QxT zzMmh|DCGrq;mMi;g6T_S)Z}R*m{;t0cLTJt{7gp zS-vx07TiYOG@nlVXI#{T)CmO>W>28|Wyyp!6Py$Finq&iSm|q!eTy4S-pxg%xM{?&b@cSs{79G@@10PBeinS_~?t zC`_n&YshQL6+W69*B9MlG8ZFX z*@@1Xgxz%&f!~N;dDM>!UTAhRjlw`ESKq!c_%wWd*uZ}~9u#z%JRfOfzMlB?LGgrmEY-L&oA*7 zcsSu`eX78*J!MbMl5G1O1HJ1?g&K^Fo}NZmT~C})x%D~7c(Ou7coyX~Z~{Z46{Ue1 zlv#r^YzdW84=Nd{Op$v9Pdtm=POCvDLX*PG4iBx%F{)*CyLG zET7U!zL&&ZXSJRQwzqx!MT}sa!0HloIlBMQmFeiDuGBrDdq(%VcvAlb536gqZ8)hP zRljhNS)|Q*Q@92g@EOEUd8fA0_|wJlv&H4s!b#G|NM0#wX7k<*w89e%zU3}s;8{p0 zd2UsA_{==yhG%D&G-?uyws=i;;ZM$rz*Ci=?^$tuB+Jtb7{y13A@6@>6O1ye(Dg{<_~$=?|-- z*OCU3@0Z<$dX)F041TOi1?nlOo|p-wsQK3AKqh{bO%tpp#X6SSnEBwQr?yE3|^Z6dHDaS_^rYpnuzH;Rp z)=%Wroq@8tQBGYyN#fLt+$9aPvp%lL^3wW+!@sQu9O0;kV|R5#4yZ&8dED)*=7jeS z(8-$GT!-C|Qiq*7gLbMuv>WK=27g~QV!Cq-ZTwCidUf2v z&cHLZxvh!FW5`a+Z(3t52Dg&C?MSfK&I-x{alY7KcwtuSP|^zn;Yw_UCSuZdRD86u*;%*dGwHHaPhnNVqbo1D|%R7o7;kWen$Sb`>aGka<@|ZM{v?P zA-G@a!wM;7C}~F0XdeY`3HP7Lnr)C;zpr<$0rqTJOn1H^4RhG;0!6USkk9DaYpOhj zr)hl#eO*%vJgru?D8J!h>vZv17Wgqjm1IS51}4_#`l9J+i;K1`u}<~Cha5Qv6RcWy z__W-n{KgU&D=_=8YRUr7%gI~;e2nuGz;EpyoS>AlC+#)m`AP+gqXSxVk`BIJ*MKOo z(PzC-L(j@2)6>3az0Yb8pO+Q#_l=hLyI5lUY?L&zLgoGf&kKWE8JBAp{$7{j^Hn7) zO9#KjD(Ln})-P9EfqRRA>t*seVR^MgR~gXtQSDs5hxBnw_T7EcAmOk@4JPa9T(7K< zNzK@T$SM6o$Uv};K##NQKt_w&m)hK73O|wJW^APjZm^`fhf#c(={By?o2yNxKwfnu zXhA|7aS}Jyu)?)9&=zVm?)HI-sNLNQ`YXT*!QBtIEOv^BXyBwA}*sX*= zAI$MS2W+QB9ou2sPm;2G%IvwSZg$o!mXW?7f-TwB=}lRugPHp&)3Zx;nv_rW#^52|G!YnP8U(jl9LMbz?8;6Lg|spV1oD78#>a>BD+Bp;E?RM5)i)AJWQUkLmc zEQxdzF}XN(`V@YiT4gM7g%2oXd2Xx`F#N)2=6mK_@?3UdN&UQ$J0L3)FGdt_-pC^H z6Vb-`WWx zjZFO|a0E1vTk~ZvjoIxG=|6!>tpJ8V3`w-Z{&Q1h*G-V8CWj>7)+%iXH2~#Z32V_Z#d;_p z`=TaU>}p~4Qx?HyC)QM?E?GvSh$#DJ;=B?4LIw1Uw3=(pLNvvmOb#;4OUY`R0`kei zVBQaABlU8)&;wa_S6#Y$zB%8+7FQ!5^aGG}w;z<`%c;$5PL{W%DR0}Gpanz)TWg34 zV!yg1U;maGqJ$@$L<#@1h7j^wjOLaym-i;2Tc%#%Va{u@` zJ+(y7fK;Ai7Y+j@u+!E139QP({x`M{YFWa=ySFaIv!O~2KYCjoCq(Q^^<=o$n@oZ# zq@#8QmO2@Io-gUV%AEmin+aa=MC~0op}&B%PBKGDL#4?5>Z~d^>E<%P`+ouHi>Usm z;Gx-joj}!P1%orARoAi&XDi1UA>xx2@=?OM@1`O@uTe;?qq7Sx7P(lHyQua9r#Ruy zp>}%gS)TCh(xFt*OMj|Q1wVb91N|XkvLga*zf)I>zX_nsFNSLT5j8r*ll1%QsXojW zgUH^YyX&46BNg6+7cVPZJ}8Z{VXW+iab=f>%0i!sxmg!#_i>bcR*V^VQ}`|T4g({N z=1t)@_FC}!y(qgXRQB$%vSGwgFf?k4elZD)F^l=)EbemTVisuz|8}m(Q-q8sZwBVs zGu*5>-R%HJdmBz`yMFAny5@~MCw`jjrPI0@{?iDlX->o)B=WO8B0uYA2Hw;```>mQ zPHZGFhij_{^#~_c#pKigNtScDN`~LLVsM?Z>Hei*6R3<}{2i5%-9=>@f-<|D+JGm5 zl)XrWe{pVAll&D`y?o@_&7u{)U>kT^9xXqN8f|FvPAad+qP#~Myn7SYaHWc}9~JnB z=f(H2o0p@EJiY8JPU}N)GU>EJCm#?`E6s>68TpT5(rwp4D|K@)voI2xsjXG%mlc7d zIIDZ>(!HhToMyJL0cUkJ&gvhqAIRGfw7{)v$!Hzjx!>4n*FIH$b=TGbnT!$sT4S)K zLpNgg(;lcZl?wOQGs25+U}x&qLl1s;y+j$A!M(L~YRC%b40PC~^#(ei(E0{Z@NDNUI=hk`?8Cd!aeY@u<9cV@xMqJVQL1$C ztOx21I7_d0OFb}y_UfxWtP*?3XdP|;{jv66$2lBrzgcYmrMj!ntqHYXD(tOig|>sz zeNie1b?BvvQAQreb9(c9B+Ffo=Ui-Mi>JE5DM6<|R;>(RSf4rwoky$Am+q}Il{7<- z+b7kX@ZmOiQ<}v7P2!EQ+OZAVs5j9+A%8~+kA-??g-+-VNtV^34@kU1Pq!o)?5@iK zUZftnjXz>7?HxJddVTl(=p15eT#;%<)CT;*=`m!&;ZDn!(=!rP+FG1J4yH8!RT zp22JbR^^v99YL9>*#I))fq8*Skz+`0tul){sEx6)whenp&z0eW)$~>tXOBJ^tnMJI ze{n^)@4gjbzT6f2ZQoc)zw@H?Uec9>v^%@*gziQE#R^7mxJ%OQd~qjPbqnsi?@rS1 zu!A?((-=#I12{)DSe2;yc>!l7;hS(w9&SR$w$Mu2o=WqmedxeJARQJaVQsg+@nfwF z;#r&}|E86RMWoo6o>RE~AaRoam2Vs>s&31_2XQ&CiP2hF^@sq1W|t8rcSrk*y=zh$ zFrL4{Ql4PWUct@y!kREWZ!6K*ERh!_JlaE$BDDoAma(ju$Q9%O??tjy8c8BdYAbqk)$I(Nj%9@0?ku;|zE5ob<#Fvl zhg;)?PH_xvQkg?ynPcP197dVX0slJUSR=AfW7adzj{*&v0 z4k}4dj=*cRBtcbLW3B(XRC@rYVAh%7`}RN*%^f=^Q!v64j{IgO&nQ$nOWd%R$ZJeJ zfeL3XJVP=(gq={-6m2fEDy$5&vKbAzF4V$m6?*bTPsM4lp_aH}-Se%mKmvdB`Zw}D z$Z*$6x7ee#Bu#0(xjse?T*@w|=|Mz>K#FeP(aoeSwRXbRU{78GO^$Ty{i;^F_0$7! zp~0<}f1oxu&-dfqiL5Q+vl;_uVz!vbFGb!Rel2@L$u_k-uZf;sJNEQ5LK6I9s}1v- z4XupSQ;yh^%UTHu5HVozb-%P9k%Ks4V&owHH44A3g)fD$>J3_RTCZ)jSJ!H5?dV#$ zYU$==sxm$AuG^rz?)Vi%zGm0Ncz``S#OUBxZ~#=@C($-Wu+?Qi%S80Ev09=pk%A8% z^Cah$wC1(2LLKy~b(p)8!1iTl*nnzES^?eXCB9-$v}iGM1l|KKv(8Kwqe5scNH)g$ z@BbC}*>9>@aN0=+CVGs^5ACyNB3EQOC!s*-Y~rGmC=!u*W`LImaLns_ZzfU zX&kVLv(h-qX&epg^!%-$NL`57E~F8W#Q+-HK!+o*rAyQx(mqXxrJuN?38LkfWDD4? zyJ#QNuW>acZg?sn!)1xfnnEYqYc-naMCUev4Q zLVJ`+e)oKaFTItWw%4RMnp~y1mb72Ds}bpz-f{7is9ib(7^Jd9E<+XLG=F!qC_maA?~&*%zjQU;IP0Qux=8tP4irotk1d&A@GtAMO6iwyhhq3 zuj~^!Ir1bCcH(`e_e`+HmE3YPSlB~;Srj*??Y)b?!`2S(=vG^XcMtCBjOt_?lRMm( z*=%|-!z;~`sfVmG>33OP1YXdWtc*C3?E`8V?)GW)0=1 z@l-g~cK@@mwP8)vMnRTg zT2L`-H|)l&u?115u@jrOU`|?{xh)S(W=rz7?6NXx_l7jE5&mLtiTL|7u!A#cY)Q$M zd#!Kd^oN7%kQoyALm#n1wy1jq{;rVWV1?JZieVF^lm7^^UEw6F?z7IHl#9EJWQ_*L zw5r#^+dYu0>Z7wMoy+IC!>`|gl7u^5nc@Z=>T{Au(+8lb(uugq$qoY1L!a+?_q+xg zi+X6rzV0Lr>Oh;McQbg(yV+Dj!zlfm?j-u>veMc;h|D0wspU4NeLl&P<(=w_Mx^P6 zWe!uRa5y9zI|3XgYfXuMOE}N!f(3EM;Nhm`G|7*Q=-4jlfVJX zm;A!2ZVjd*J5u?`M_JS&Y?76P5+=2Jd-4?g@)z+J`Zhi|t&psizT{YZzf1hSe55_| zr&~=II3TA{oE7!gv89 zgQK_CpP{oEe|sHp>^n!dn>v^4)#oz3#PPy-i_HBy03SV*Q>}=(6bO% z5jDnDXdRMWU@`7&58^xib-n~Sba%oxOyVxSwbKq75q|c8YJ`u3B!TBxFSzW zd`#r=l4e59ncAW|5#xylvdy6(CVGY+h~$u+i~aQLukfo3Sctj!HXCDmLhPk{q>2-5 zwxV~18r~J}E-N3oLxvH^rof6z*4tzoVds>O+(vP#Kyo7=$r#(bszt$69od@M(1|c6 z?HH7caVf;d%u_qS!;L^j&hwBoRt_n=+-iegAlaMQl4a+}%Aj$}3~Jnsh=Ccfa|*;P z>IB08-IE$%OUqC1vl)`ht>M6APC*3h%r<)!X;9w-2cOnilg|vjSo8d#S~(G?_nkU6 zQ*l{2G9|MoU{@4iZ|}u=y>XCqGzMFA(laJw;C*QBR>S+SM~JGGv@XU$4J2kp%;BP_ zHP|?CWh}nQ^0mNVNX>9Ni>jw^1CudV_!$K-Sk1?59!5trfLit=}2g8@s^&8mRa^ z{JLT7?${fyTBnlwIxl_-?xFMIC*U3uL$)bw0xKx2Q^d1ewN4%RGB2JHrX8ej z^BNeT;9$PD*t5|T&D#U(>PPo%;~PJH&VV@U{IO(d58Q>Xz|X>hsH#@GxJdTeX(?T;ONbdiT(wTn`7WzAl1AXyAXF~V24=79aIz&Vz>0$ zyGgh+1C3*S#RQ9VD52kwggZ0vyHKl7{7kFk_clfY`v}=;jlw52B|weefN_JL)J3^6hDOR#>DS(~1#F~f9GvTxH8cKkIRMHSW zjV&f?FwN}fm?FlF330U96ML_YD7x1)Vh)X`@@K{)>mw?9KR?%3vh~WPA$Vp98RBs zhrb?T_Kc9LzPn`oKYr4sp`P#gLC*|kUMd$h^5VgwDeS zrhvn+%aX9))3J~A2TGc}pE0RdE@gp#?R4pKf7SQ=C*^^cWB%v+#8plA$-Lg*qwG^+ z+44Y5?9bmOOT{waYyRyvF^}~m-6pcoZDI(uTJSTi{@iUcx4LBOofy>@B6Tefd?Wkm zQC+=Da;nebE_qd?-x%Q!?vhQRyJX@gqc=%xHQgj{_eFlfA|^He6VkoY-C(al{xj%p zkQo*{5$WC8;*!QmpM)3Yx)MKm6G&Q(4)|&2F*0?PeGl1byys|zMjWFn^qcA*uh1Fi zU7tW(seCy(tN{19NRQ)ztz;Cwc4W1H!xJ?&S*@>&66z<8ug`06{^vQ)pU?D66YnB; z*a8zKe>bwx!OEHGUK6^9)(xlc{@eM2me&S#3~?7zTYu@FJJPuZt1cpPihA)XHDNlX zvcPoGiB#mIQstD%8R{|Hk%o608eX^Y4b4&Piw{b3}`2f;IWrGC%CP-f9YF% z9{e@#Xi-Zh-qi)p4sq^toKF*C)(?KGwM)M_>`CWIk8KZV9ktLkL^-lr+dz}FjtS>$ za+#r<9Df*8vlA&3ol~OO5)M~1o=fli9r`qIdy>L(uomJ8juCf&S>*7yK|dj_{&kL7 z=h;FRq^ej4Q`%_vTL!^ylCy5rbMD$y>rDTf63{iU4!Q+;aezvmo!{C(B| zblGf38`(y|hw{?R`gKTVT%7X8x!1)xIb|mg@iTUskyG}6oa2BtB@<5ySw6L}YTAu- zTIN+5`?*5cAvt5eQ%61n2haWV%$R;OGqW8%=SC^Tzf;R!IIhwrikLG6UcjyZwG8aR zZu)6zIn6Lz((*F@TTn--(I&}^x~5IqHzC1KTX`J#!Pgw%*w$dI2U@8 zyltOh7aG_lNnuy{KXJEw2dnw7;ITcb%^J2>K>sJLN&48D=pYr0_bU4C(m*F^=k0-i z*lTePPTJe>_wV++b8^CDgI}ppxB@K?jd#+Ek_`Fum<+iKv5D+;C0o>T$dGO0HPiOM zmtusv=+gvx+SxfemNOyCJbB6P_M5O5Ub54zNxqs|_-Zm%+6y;TZNP4D8l~MJ;^A@~ zeo3al3Xe$?;D>PUB{;6$dx*@VPbqer!?fU7iW@v6+cUzzR;V(~1(!l`Q)PW$`7=Ea zRZaB~54F*h?zv(3@Q#_G_L;z8SWK?UEN|IKX898=JYD{)v$8%kEBkgsCLwtwRnm6a z1NS?21~$d8g%ZYWv@zHF`~a({1eZ^I26@+(Y(;ebH29x2O=~V`VM}(Kz8yL6$_Ka| z<3w%3+>xZ8(IzOb{r=Kxki+MFE~E9qdjGOdmw&o%bao3uvnxQ0_wA*BbxSjAx6sVm zS4%UCI2#vEnw94EU2&EPtCh|k#jlK>J+j%U%->&<9hf^J(f_$4KS%$Sv#wl{cg-ES zO{C~^N0$8zMW=ET(OyBcbc>h7{PZoZocaByv_8`6aD55z0?6zgUDYeYD_{BHy3QHC z{S|3t*A3tHN;cx*)(tPhH(6du?p!xK{}qOf0@9Kc5m$DB?49<&f7&I#ZfNhI-j#g!Rpy`LW>}+nu=+%-gY6sg@N7jWqU?zk^4+=eY?_ZaA&&;-DxgDj0uMp%&0BX6m==ROT#~Ont_mMd1Jprhm~Ndj$B{r_wv@T6x5oAT7fF6vn>b>G(19-{qlRL9*-MzGU~B~SYdX2 zeT5!ry#K8x`GnMn7z{kl+p@K&K{qffwLyJT8}I`W$Dq{T%on-7y_9tj=xLf?2KC`{ z1MV^EuC~Fy5C~Ecz@G^dk=az;!W&V-4gF`JePGf$k&E-wKEkFr*Si>J@@y}8POz-v zco$GM{_&A+m@yvjZR`NTjiwj)L^IoxJjiJKWqRGUtNa%p6cROWUvTn-z80kcTC(Nf zu}pW5tQ@3^9Zxr_}f%Kc#Xm z!sCKYT@THH@WyvazL1|6!lPph6OL2H+zH2lD5qp{29Gbb{P#zC!jnq{o*Z&$YWwuS zlZ)*Go}BVL#vQ5r7=NcIKN>}qQxd8i@csx@PT6;1XF_bl#0C}rPuq5ziiJNB^X5=b z*5d9%Lp_DpyVlDmG!|^jKF;q=+GRjShe%<=w{1XO1G<_L{{wYsdv}rth(bURVszI- z`}Gc?uPK#=9o_N#b`f_?b9%8wbqYvc*jGJ_-N0dN8s(M?D>ehC@2=y)!nU4(TlQ)& z1Nd-k0Mmmq^8?|V0R)IZnbQS2`k4tT^omaP2{6pew$M+`!H?QMxghkG?vQaU9t~X ztn%Q~q=ukvZs2`r%QB_DpS3b(2Tte>7+= zR<6lyV0q0&`|2E=%AVEjgLdHRJ=YfAdnUNd)qasI9?bs9K--J!{$Qx5lF`fk^b7Wc zpYo8Z_-GMfZ#CaD#4S`Hqm@Sg@fWO!tGD;H2>sK+Hip%UxO&QuKL@U!{v~|F>C@1{ zW2;hK?F#va*SmE%5#h?eeGV)q?6t!qyY$?#T z-`qa1FbaCk!A|(L9|^APnWs)HQ#JtYY0Z%@Wh*$~B2IRtAn%M&L@m($`zss{QS){xT|?TucmDrN~30Q$;7dZXW3+YceluERk#D_H~ak3T4?9X#NY+6|3;bmg^)X0Wd&yg=d ziDyMMl)`V1)lcwhum*&#rFBL4pM8o^PVg!kfWe0tDGe+4=eUi_wD?uy;(&Igb7_VN zhc9`D_%wqlkh9A#>Y_zo)Y7N+U)_=psncjA2@8j$IGu@wXbetQ_mZU-+o zc#FT!GHtBSDdYMK7xDk7&$f=VP@hrMC)*Ni6S4SI;7DV|m6}&YqjQ)d#kTt_8k!NU zbkANAXW|Ix-O3((E8_9>0go>=gvVDthR5gN+iaI@*L!qj5*}Z1U$m!m425qu$Pj#hW+%3Q26wx!hot+4ivuRlM1gE+G};674!Xuh{D%k3Ic-<7?pmjCCa4~G58ul z1GPSn>0)0LJpJs#4*P$2l6Np!G|v@0vIYeOSk=F99p+27C2zZ7Tjn;{aPMJ+>;4(% zVFDL!DDn33@RT1yKHwe(_{nSeliH2g9PmPtX&8{6(bjSXM$g}9k$3%PQe|zvWGD|&X(Sqh3?=(`-lhHA3dFzQ@iSkh zvKSXAud2H-g!k9Te}x=ROOZb+&i6|{Yq+IP=@$0M+)9JywA>3j4kG9n;117Rr7BVt zMhdgPxxp<*tj3$&bKJ&Zd*K`xKXL=)Rf;QMZIj)UNd*~~v*f;(;P-lui5=)$-Pz6S zj)tl5clN5w9p^V0buLr#N1UD+FfosqsY+i_d> zmqnZ9MX7>}yOJ6yXuhdh#TjOwVzP{WC9iZ>?&C)eRHpDh96>ri3pl%zJL2IpwQl&y z7vtd-%ILWq-laahIQdXe-mbE8Ia9jh-NxiutJYh=-6>hb9$lG1+{2vVl`pz6gLdV* zi@$pDL@tU@|E-l%A?W&nTK%X50^!=nn>td@^`WIuR%f-^X=fW7j*M}^OGgt8= z^4l0h-Hc|5s@$d)uC)W**MAoMoDIsYXM;ByEh+7$4}whP24ObP^Wt5RgEhc=jT~Ib zgyZjepxs5{7FXl15xFHIk>eo_yKv$by7Ob3CNye*p?5Z@(z{F>1m1o&=!U&B4Eyy1 zyo*OxY=g$IBOWqDyzo)*S{`-V0>XqzDHe7R!#-v%UsnTrG^l7>^f6{!T3DYKMjoO7;C+lRl zGgn_9uphA7*>?6dwugQHfB5Au$dWMnQnE^RH@A=L=HB5x;6}fte}DMP7tGa{694^1 z`a^oUD2h1GVH2+=zv+K zG*BXHatiV($DE$4GUvehv6JTnR;&9b*JBL)t*{sQ0)Xo-FgGT;pT3Raw`escohuD| zTlt_cJJils3rQn1H-9}!&JDGLR*+YiRoC41gLcf(|K!>e-KLa5wDDHu^MkjB+Sns% z+*oK?QBz*~!&;U^ity2*uATgzTe}i{&kru(o*y)^q%WXoBkGF~As4BEGv3dIpGpB2 zq-Estt^?;1n@919o*Q5^bPLtPA8%Kk16q(j)}0C7*xokyB)n#qYF#!9m53gAF0h3EFgL58;WFt!@YdZDY1&I|{=BGtn!%=8%E6!thA zN_a%nd!Rc;1}8-1&tWC}1Ep~BK%!?SPxAtAO-%=CFmgo~t>|uknm^IK6WD;vjgjIz zDn*}Y&Dl&=FS|g$W0u3=sYltSG@ADqsO#-Q#L@j2(I7tv~HW#|v} zDDwR~%)g!Fp&n$RV)c=pgk}dgR8^U_52)DIY>IBSa;Y&54Dw~Nshptbq?k?06_|JO zZ16hf4xY`|!CUm^({XN~d266avfY{B#C(R=#Z)!HAID{xFPyAqi=H+G`i^{=@CPGM z7vHg_9S4pwv!Gv9v_aG|ltRNGLq8lMbB}ei`TySDr?oLv)Ye|Htzoe(6WUTC&*mq! zVr#?x7%yg;>nCgBsOEwx6g2^8TZXou?@nym&hNI&8Q%I5Q!r2X(6QTcCx4tT8(LTw z=e{{vGaysn#o9dTp+Rai;`|9yEQQAtiyg`LgGpH0> zk!rKxo~~-HSTj-o8<9Qj3}$D&MJr5qve&K~zW-X_l|fl{DLB{{LI%`W&wU8iuil(XY28xwJss+icRp`<`a~ zUTC*z7V}R-c7u*Us{vBIEy1fX({1-$HQi2HVWopD+5|N86tQeiV6XkBNL<%mQ)!*S~(^vQf#P3lq@M(zPqni=?Bwm)z z=@D0nJCv2@U^;_j@Dm#540v;C`qH6@nBd7zT=ekG)*IZQLo zgH+mXH1>9bE0JLm>nM9b#eZ z7JDGlc@}=dmGJB95VM3Uo#n_NTNzAaj7c#r<@rP(J;~W%B_kVDX!izXIzp#r7%}5% zVT?;9=enLB1W%en-kA&fD|JA$2mJ@!%kWu-NmYPAE3UvH=&s^ zR0y&4lnt=}**Hf|RRRBKPD(dZ^{Am- zxNKj&EYck7d(^PMmlfXa!brgYwZ(r#<1-2Y2aP0`r*RM`oZw!P2p=!uD@Rfl^{%dZG+W*K={e*85vGR9 zhRQ9^1U zwnhxD)?f|vkSz)e*Pabl^=$kif=O^6L|%%Xq*Q2Rn4C7mI_X`&C}pO&UJok3wK7Jg zD-#?y2bB8PgJIH+C{Axw51f36kuTCQU0GQB9SrS&cIF!BSJN8T&!wlv=#ih|9l|r$ z9>GX(C$(1y^Xn`lknThciG)rC6njU-$L&Yr^796d>UE@7xSA_%Pnzd=+rO+wJbBR ziQy(~gcgSKc*%++{Y!*U@io?d3q9@GpiXB&#u=*dqUG5EC5w61SHgR9CwN6;FkNp9 zX6jCK1Eo>R3b!GLY58h)@Kp!6CkA}i!{8ruvVPTFbRU85(i0y6+66ju)lR4YXD
      usokUm*{2-6I}`J35Z|pJUA+~ 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 - -/* Allow for C++ users */ - -#ifdef __cplusplus -extern "C" { -#endif - -/* Public options. Some are compile-time only, some are run-time only, and some -are both. Most of the compile-time options are saved with the compiled regex so -that they can be inspected during studying (and therefore JIT compiling). Note -that pcre_study() has its own set of options. Originally, all the options -defined here used distinct bits. However, almost all the bits in a 32-bit word -are now used, so in order to conserve them, option bits that were previously -only recognized at matching time (i.e. by pcre_exec() or pcre_dfa_exec()) may -also be used for compile-time options that affect only compiling and are not -relevant for studying or JIT compiling. - -Some options for pcre_compile() change its behaviour but do not affect the -behaviour of the execution functions. Other options are passed through to the -execution functions and affect their behaviour, with or without affecting the -behaviour of pcre_compile(). - -Options that can be passed to pcre_compile() are tagged Cx below, with these -variants: - -C1 Affects compile only -C2 Does not affect compile; affects exec, dfa_exec -C3 Affects compile, exec, dfa_exec -C4 Affects compile, exec, dfa_exec, study -C5 Affects compile, exec, study - -Options that can be set for pcre_exec() and/or pcre_dfa_exec() are flagged with -E and D, respectively. They take precedence over C3, C4, and C5 settings passed -from pcre_compile(). Those that are compatible with JIT execution are flagged -with J. */ - -#define PCRE_CASELESS 0x00000001 /* C1 */ -#define PCRE_MULTILINE 0x00000002 /* C1 */ -#define PCRE_DOTALL 0x00000004 /* C1 */ -#define PCRE_EXTENDED 0x00000008 /* C1 */ -#define PCRE_ANCHORED 0x00000010 /* C4 E D */ -#define PCRE_DOLLAR_ENDONLY 0x00000020 /* C2 */ -#define PCRE_EXTRA 0x00000040 /* C1 */ -#define PCRE_NOTBOL 0x00000080 /* E D J */ -#define PCRE_NOTEOL 0x00000100 /* E D J */ -#define PCRE_UNGREEDY 0x00000200 /* C1 */ -#define PCRE_NOTEMPTY 0x00000400 /* E D J */ -#define PCRE_UTF8 0x00000800 /* C4 ) */ -#define PCRE_UTF16 0x00000800 /* C4 ) Synonyms */ -#define PCRE_UTF32 0x00000800 /* C4 ) */ -#define PCRE_NO_AUTO_CAPTURE 0x00001000 /* C1 */ -#define PCRE_NO_UTF8_CHECK 0x00002000 /* C1 E D J ) */ -#define PCRE_NO_UTF16_CHECK 0x00002000 /* C1 E D J ) Synonyms */ -#define PCRE_NO_UTF32_CHECK 0x00002000 /* C1 E D J ) */ -#define PCRE_AUTO_CALLOUT 0x00004000 /* C1 */ -#define PCRE_PARTIAL_SOFT 0x00008000 /* E D J ) Synonyms */ -#define PCRE_PARTIAL 0x00008000 /* E D J ) */ - -/* This pair use the same bit. */ -#define PCRE_NEVER_UTF 0x00010000 /* C1 ) Overlaid */ -#define PCRE_DFA_SHORTEST 0x00010000 /* D ) Overlaid */ - -/* This pair use the same bit. */ -#define PCRE_NO_AUTO_POSSESS 0x00020000 /* C1 ) Overlaid */ -#define PCRE_DFA_RESTART 0x00020000 /* D ) Overlaid */ - -#define PCRE_FIRSTLINE 0x00040000 /* C3 */ -#define PCRE_DUPNAMES 0x00080000 /* C1 */ -#define PCRE_NEWLINE_CR 0x00100000 /* C3 E D */ -#define PCRE_NEWLINE_LF 0x00200000 /* C3 E D */ -#define PCRE_NEWLINE_CRLF 0x00300000 /* C3 E D */ -#define PCRE_NEWLINE_ANY 0x00400000 /* C3 E D */ -#define PCRE_NEWLINE_ANYCRLF 0x00500000 /* C3 E D */ -#define PCRE_BSR_ANYCRLF 0x00800000 /* C3 E D */ -#define PCRE_BSR_UNICODE 0x01000000 /* C3 E D */ -#define PCRE_JAVASCRIPT_COMPAT 0x02000000 /* C5 */ -#define PCRE_NO_START_OPTIMIZE 0x04000000 /* C2 E D ) Synonyms */ -#define PCRE_NO_START_OPTIMISE 0x04000000 /* C2 E D ) */ -#define PCRE_PARTIAL_HARD 0x08000000 /* E D J */ -#define PCRE_NOTEMPTY_ATSTART 0x10000000 /* E D J */ -#define PCRE_UCP 0x20000000 /* C3 */ - -/* Exec-time and get/set-time error codes */ - -#define PCRE_ERROR_NOMATCH (-1) -#define PCRE_ERROR_NULL (-2) -#define PCRE_ERROR_BADOPTION (-3) -#define PCRE_ERROR_BADMAGIC (-4) -#define PCRE_ERROR_UNKNOWN_OPCODE (-5) -#define PCRE_ERROR_UNKNOWN_NODE (-5) /* For backward compatibility */ -#define PCRE_ERROR_NOMEMORY (-6) -#define PCRE_ERROR_NOSUBSTRING (-7) -#define PCRE_ERROR_MATCHLIMIT (-8) -#define PCRE_ERROR_CALLOUT (-9) /* Never used by PCRE itself */ -#define PCRE_ERROR_BADUTF8 (-10) /* Same for 8/16/32 */ -#define PCRE_ERROR_BADUTF16 (-10) /* Same for 8/16/32 */ -#define PCRE_ERROR_BADUTF32 (-10) /* Same for 8/16/32 */ -#define PCRE_ERROR_BADUTF8_OFFSET (-11) /* Same for 8/16 */ -#define PCRE_ERROR_BADUTF16_OFFSET (-11) /* Same for 8/16 */ -#define PCRE_ERROR_PARTIAL (-12) -#define PCRE_ERROR_BADPARTIAL (-13) -#define PCRE_ERROR_INTERNAL (-14) -#define PCRE_ERROR_BADCOUNT (-15) -#define PCRE_ERROR_DFA_UITEM (-16) -#define PCRE_ERROR_DFA_UCOND (-17) -#define PCRE_ERROR_DFA_UMLIMIT (-18) -#define PCRE_ERROR_DFA_WSSIZE (-19) -#define PCRE_ERROR_DFA_RECURSE (-20) -#define PCRE_ERROR_RECURSIONLIMIT (-21) -#define PCRE_ERROR_NULLWSLIMIT (-22) /* No longer actually used */ -#define PCRE_ERROR_BADNEWLINE (-23) -#define PCRE_ERROR_BADOFFSET (-24) -#define PCRE_ERROR_SHORTUTF8 (-25) -#define PCRE_ERROR_SHORTUTF16 (-25) /* Same for 8/16 */ -#define PCRE_ERROR_RECURSELOOP (-26) -#define PCRE_ERROR_JIT_STACKLIMIT (-27) -#define PCRE_ERROR_BADMODE (-28) -#define PCRE_ERROR_BADENDIANNESS (-29) -#define PCRE_ERROR_DFA_BADRESTART (-30) -#define PCRE_ERROR_JIT_BADOPTION (-31) -#define PCRE_ERROR_BADLENGTH (-32) -#define PCRE_ERROR_UNSET (-33) - -/* Specific error codes for UTF-8 validity checks */ - -#define PCRE_UTF8_ERR0 0 -#define PCRE_UTF8_ERR1 1 -#define PCRE_UTF8_ERR2 2 -#define PCRE_UTF8_ERR3 3 -#define PCRE_UTF8_ERR4 4 -#define PCRE_UTF8_ERR5 5 -#define PCRE_UTF8_ERR6 6 -#define PCRE_UTF8_ERR7 7 -#define PCRE_UTF8_ERR8 8 -#define PCRE_UTF8_ERR9 9 -#define PCRE_UTF8_ERR10 10 -#define PCRE_UTF8_ERR11 11 -#define PCRE_UTF8_ERR12 12 -#define PCRE_UTF8_ERR13 13 -#define PCRE_UTF8_ERR14 14 -#define PCRE_UTF8_ERR15 15 -#define PCRE_UTF8_ERR16 16 -#define PCRE_UTF8_ERR17 17 -#define PCRE_UTF8_ERR18 18 -#define PCRE_UTF8_ERR19 19 -#define PCRE_UTF8_ERR20 20 -#define PCRE_UTF8_ERR21 21 -#define PCRE_UTF8_ERR22 22 /* Unused (was non-character) */ - -/* Specific error codes for UTF-16 validity checks */ - -#define PCRE_UTF16_ERR0 0 -#define PCRE_UTF16_ERR1 1 -#define PCRE_UTF16_ERR2 2 -#define PCRE_UTF16_ERR3 3 -#define PCRE_UTF16_ERR4 4 /* Unused (was non-character) */ - -/* Specific error codes for UTF-32 validity checks */ - -#define PCRE_UTF32_ERR0 0 -#define PCRE_UTF32_ERR1 1 -#define PCRE_UTF32_ERR2 2 /* Unused (was non-character) */ -#define PCRE_UTF32_ERR3 3 - -/* Request types for pcre_fullinfo() */ - -#define PCRE_INFO_OPTIONS 0 -#define PCRE_INFO_SIZE 1 -#define PCRE_INFO_CAPTURECOUNT 2 -#define PCRE_INFO_BACKREFMAX 3 -#define PCRE_INFO_FIRSTBYTE 4 -#define PCRE_INFO_FIRSTCHAR 4 /* For backwards compatibility */ -#define PCRE_INFO_FIRSTTABLE 5 -#define PCRE_INFO_LASTLITERAL 6 -#define PCRE_INFO_NAMEENTRYSIZE 7 -#define PCRE_INFO_NAMECOUNT 8 -#define PCRE_INFO_NAMETABLE 9 -#define PCRE_INFO_STUDYSIZE 10 -#define PCRE_INFO_DEFAULT_TABLES 11 -#define PCRE_INFO_OKPARTIAL 12 -#define PCRE_INFO_JCHANGED 13 -#define PCRE_INFO_HASCRORLF 14 -#define PCRE_INFO_MINLENGTH 15 -#define PCRE_INFO_JIT 16 -#define PCRE_INFO_JITSIZE 17 -#define PCRE_INFO_MAXLOOKBEHIND 18 -#define PCRE_INFO_FIRSTCHARACTER 19 -#define PCRE_INFO_FIRSTCHARACTERFLAGS 20 -#define PCRE_INFO_REQUIREDCHAR 21 -#define PCRE_INFO_REQUIREDCHARFLAGS 22 -#define PCRE_INFO_MATCHLIMIT 23 -#define PCRE_INFO_RECURSIONLIMIT 24 -#define PCRE_INFO_MATCH_EMPTY 25 - -/* Request types for pcre_config(). Do not re-arrange, in order to remain -compatible. */ - -#define PCRE_CONFIG_UTF8 0 -#define PCRE_CONFIG_NEWLINE 1 -#define PCRE_CONFIG_LINK_SIZE 2 -#define PCRE_CONFIG_POSIX_MALLOC_THRESHOLD 3 -#define PCRE_CONFIG_MATCH_LIMIT 4 -#define PCRE_CONFIG_STACKRECURSE 5 -#define PCRE_CONFIG_UNICODE_PROPERTIES 6 -#define PCRE_CONFIG_MATCH_LIMIT_RECURSION 7 -#define PCRE_CONFIG_BSR 8 -#define PCRE_CONFIG_JIT 9 -#define PCRE_CONFIG_UTF16 10 -#define PCRE_CONFIG_JITTARGET 11 -#define PCRE_CONFIG_UTF32 12 -#define PCRE_CONFIG_PARENS_LIMIT 13 - -/* Request types for pcre_study(). Do not re-arrange, in order to remain -compatible. */ - -#define PCRE_STUDY_JIT_COMPILE 0x0001 -#define PCRE_STUDY_JIT_PARTIAL_SOFT_COMPILE 0x0002 -#define PCRE_STUDY_JIT_PARTIAL_HARD_COMPILE 0x0004 -#define PCRE_STUDY_EXTRA_NEEDED 0x0008 - -/* Bit flags for the pcre[16|32]_extra structure. Do not re-arrange or redefine -these bits, just add new ones on the end, in order to remain compatible. */ - -#define PCRE_EXTRA_STUDY_DATA 0x0001 -#define PCRE_EXTRA_MATCH_LIMIT 0x0002 -#define PCRE_EXTRA_CALLOUT_DATA 0x0004 -#define PCRE_EXTRA_TABLES 0x0008 -#define PCRE_EXTRA_MATCH_LIMIT_RECURSION 0x0010 -#define PCRE_EXTRA_MARK 0x0020 -#define PCRE_EXTRA_EXECUTABLE_JIT 0x0040 - -/* Types */ - -struct real_pcre; /* declaration; the definition is private */ -typedef struct real_pcre pcre; - -struct real_pcre16; /* declaration; the definition is private */ -typedef struct real_pcre16 pcre16; - -struct real_pcre32; /* declaration; the definition is private */ -typedef struct real_pcre32 pcre32; - -struct real_pcre_jit_stack; /* declaration; the definition is private */ -typedef struct real_pcre_jit_stack pcre_jit_stack; - -struct real_pcre16_jit_stack; /* declaration; the definition is private */ -typedef struct real_pcre16_jit_stack pcre16_jit_stack; - -struct real_pcre32_jit_stack; /* declaration; the definition is private */ -typedef struct real_pcre32_jit_stack pcre32_jit_stack; - -/* If PCRE is compiled with 16 bit character support, PCRE_UCHAR16 must contain -a 16 bit wide signed data type. Otherwise it can be a dummy data type since -pcre16 functions are not implemented. There is a check for this in pcre_internal.h. */ -#ifndef PCRE_UCHAR16 -#define PCRE_UCHAR16 unsigned short -#endif - -#ifndef PCRE_SPTR16 -#define PCRE_SPTR16 const PCRE_UCHAR16 * -#endif - -/* If PCRE is compiled with 32 bit character support, PCRE_UCHAR32 must contain -a 32 bit wide signed data type. Otherwise it can be a dummy data type since -pcre32 functions are not implemented. There is a check for this in pcre_internal.h. */ -#ifndef PCRE_UCHAR32 -#define PCRE_UCHAR32 unsigned int -#endif - -#ifndef PCRE_SPTR32 -#define PCRE_SPTR32 const PCRE_UCHAR32 * -#endif - -/* When PCRE is compiled as a C++ library, the subject pointer type can be -replaced with a custom type. For conventional use, the public interface is a -const char *. */ - -#ifndef PCRE_SPTR -#define PCRE_SPTR const char * -#endif - -/* The structure for passing additional data to pcre_exec(). This is defined in -such as way as to be extensible. Always add new fields at the end, in order to -remain compatible. */ - -typedef struct pcre_extra { - unsigned long int flags; /* Bits for which fields are set */ - void *study_data; /* Opaque data from pcre_study() */ - unsigned long int match_limit; /* Maximum number of calls to match() */ - void *callout_data; /* Data passed back in callouts */ - const unsigned char *tables; /* Pointer to character tables */ - unsigned long int match_limit_recursion; /* Max recursive calls to match() */ - unsigned char **mark; /* For passing back a mark pointer */ - void *executable_jit; /* Contains a pointer to a compiled jit code */ -} pcre_extra; - -/* Same structure as above, but with 16 bit char pointers. */ - -typedef struct pcre16_extra { - unsigned long int flags; /* Bits for which fields are set */ - void *study_data; /* Opaque data from pcre_study() */ - unsigned long int match_limit; /* Maximum number of calls to match() */ - void *callout_data; /* Data passed back in callouts */ - const unsigned char *tables; /* Pointer to character tables */ - unsigned long int match_limit_recursion; /* Max recursive calls to match() */ - PCRE_UCHAR16 **mark; /* For passing back a mark pointer */ - void *executable_jit; /* Contains a pointer to a compiled jit code */ -} pcre16_extra; - -/* Same structure as above, but with 32 bit char pointers. */ - -typedef struct pcre32_extra { - unsigned long int flags; /* Bits for which fields are set */ - void *study_data; /* Opaque data from pcre_study() */ - unsigned long int match_limit; /* Maximum number of calls to match() */ - void *callout_data; /* Data passed back in callouts */ - const unsigned char *tables; /* Pointer to character tables */ - unsigned long int match_limit_recursion; /* Max recursive calls to match() */ - PCRE_UCHAR32 **mark; /* For passing back a mark pointer */ - void *executable_jit; /* Contains a pointer to a compiled jit code */ -} pcre32_extra; - -/* The structure for passing out data via the pcre_callout_function. We use a -structure so that new fields can be added on the end in future versions, -without changing the API of the function, thereby allowing old clients to work -without modification. */ - -typedef struct pcre_callout_block { - int version; /* Identifies version of block */ - /* ------------------------ Version 0 ------------------------------- */ - int callout_number; /* Number compiled into pattern */ - int *offset_vector; /* The offset vector */ - PCRE_SPTR subject; /* The subject being matched */ - int subject_length; /* The length of the subject */ - int start_match; /* Offset to start of this match attempt */ - int current_position; /* Where we currently are in the subject */ - int capture_top; /* Max current capture */ - int capture_last; /* Most recently closed capture */ - void *callout_data; /* Data passed in with the call */ - /* ------------------- Added for Version 1 -------------------------- */ - int pattern_position; /* Offset to next item in the pattern */ - int next_item_length; /* Length of next item in the pattern */ - /* ------------------- Added for Version 2 -------------------------- */ - const unsigned char *mark; /* Pointer to current mark or NULL */ - /* ------------------------------------------------------------------ */ -} pcre_callout_block; - -/* Same structure as above, but with 16 bit char pointers. */ - -typedef struct pcre16_callout_block { - int version; /* Identifies version of block */ - /* ------------------------ Version 0 ------------------------------- */ - int callout_number; /* Number compiled into pattern */ - int *offset_vector; /* The offset vector */ - PCRE_SPTR16 subject; /* The subject being matched */ - int subject_length; /* The length of the subject */ - int start_match; /* Offset to start of this match attempt */ - int current_position; /* Where we currently are in the subject */ - int capture_top; /* Max current capture */ - int capture_last; /* Most recently closed capture */ - void *callout_data; /* Data passed in with the call */ - /* ------------------- Added for Version 1 -------------------------- */ - int pattern_position; /* Offset to next item in the pattern */ - int next_item_length; /* Length of next item in the pattern */ - /* ------------------- Added for Version 2 -------------------------- */ - const PCRE_UCHAR16 *mark; /* Pointer to current mark or NULL */ - /* ------------------------------------------------------------------ */ -} pcre16_callout_block; - -/* Same structure as above, but with 32 bit char pointers. */ - -typedef struct pcre32_callout_block { - int version; /* Identifies version of block */ - /* ------------------------ Version 0 ------------------------------- */ - int callout_number; /* Number compiled into pattern */ - int *offset_vector; /* The offset vector */ - PCRE_SPTR32 subject; /* The subject being matched */ - int subject_length; /* The length of the subject */ - int start_match; /* Offset to start of this match attempt */ - int current_position; /* Where we currently are in the subject */ - int capture_top; /* Max current capture */ - int capture_last; /* Most recently closed capture */ - void *callout_data; /* Data passed in with the call */ - /* ------------------- Added for Version 1 -------------------------- */ - int pattern_position; /* Offset to next item in the pattern */ - int next_item_length; /* Length of next item in the pattern */ - /* ------------------- Added for Version 2 -------------------------- */ - const PCRE_UCHAR32 *mark; /* Pointer to current mark or NULL */ - /* ------------------------------------------------------------------ */ -} pcre32_callout_block; - -/* Indirection for store get and free functions. These can be set to -alternative malloc/free functions if required. Special ones are used in the -non-recursive case for "frames". There is also an optional callout function -that is triggered by the (?) regex item. For Virtual Pascal, these definitions -have to take another form. */ - -#ifndef VPCOMPAT -PCRE_EXP_DECL void *(*pcre_malloc)(size_t); -PCRE_EXP_DECL void (*pcre_free)(void *); -PCRE_EXP_DECL void *(*pcre_stack_malloc)(size_t); -PCRE_EXP_DECL void (*pcre_stack_free)(void *); -PCRE_EXP_DECL int (*pcre_callout)(pcre_callout_block *); -PCRE_EXP_DECL int (*pcre_stack_guard)(void); - -PCRE_EXP_DECL void *(*pcre16_malloc)(size_t); -PCRE_EXP_DECL void (*pcre16_free)(void *); -PCRE_EXP_DECL void *(*pcre16_stack_malloc)(size_t); -PCRE_EXP_DECL void (*pcre16_stack_free)(void *); -PCRE_EXP_DECL int (*pcre16_callout)(pcre16_callout_block *); -PCRE_EXP_DECL int (*pcre16_stack_guard)(void); - -PCRE_EXP_DECL void *(*pcre32_malloc)(size_t); -PCRE_EXP_DECL void (*pcre32_free)(void *); -PCRE_EXP_DECL void *(*pcre32_stack_malloc)(size_t); -PCRE_EXP_DECL void (*pcre32_stack_free)(void *); -PCRE_EXP_DECL int (*pcre32_callout)(pcre32_callout_block *); -PCRE_EXP_DECL int (*pcre32_stack_guard)(void); -#else /* VPCOMPAT */ -PCRE_EXP_DECL void *pcre_malloc(size_t); -PCRE_EXP_DECL void pcre_free(void *); -PCRE_EXP_DECL void *pcre_stack_malloc(size_t); -PCRE_EXP_DECL void pcre_stack_free(void *); -PCRE_EXP_DECL int pcre_callout(pcre_callout_block *); -PCRE_EXP_DECL int pcre_stack_guard(void); - -PCRE_EXP_DECL void *pcre16_malloc(size_t); -PCRE_EXP_DECL void pcre16_free(void *); -PCRE_EXP_DECL void *pcre16_stack_malloc(size_t); -PCRE_EXP_DECL void pcre16_stack_free(void *); -PCRE_EXP_DECL int pcre16_callout(pcre16_callout_block *); -PCRE_EXP_DECL int pcre16_stack_guard(void); - -PCRE_EXP_DECL void *pcre32_malloc(size_t); -PCRE_EXP_DECL void pcre32_free(void *); -PCRE_EXP_DECL void *pcre32_stack_malloc(size_t); -PCRE_EXP_DECL void pcre32_stack_free(void *); -PCRE_EXP_DECL int pcre32_callout(pcre32_callout_block *); -PCRE_EXP_DECL int pcre32_stack_guard(void); -#endif /* VPCOMPAT */ - -/* User defined callback which provides a stack just before the match starts. */ - -typedef pcre_jit_stack *(*pcre_jit_callback)(void *); -typedef pcre16_jit_stack *(*pcre16_jit_callback)(void *); -typedef pcre32_jit_stack *(*pcre32_jit_callback)(void *); - -/* Exported PCRE functions */ - -PCRE_EXP_DECL pcre *pcre_compile(const char *, int, const char **, int *, - const unsigned char *); -PCRE_EXP_DECL pcre16 *pcre16_compile(PCRE_SPTR16, int, const char **, int *, - const unsigned char *); -PCRE_EXP_DECL pcre32 *pcre32_compile(PCRE_SPTR32, int, const char **, int *, - const unsigned char *); -PCRE_EXP_DECL pcre *pcre_compile2(const char *, int, int *, const char **, - int *, const unsigned char *); -PCRE_EXP_DECL pcre16 *pcre16_compile2(PCRE_SPTR16, int, int *, const char **, - int *, const unsigned char *); -PCRE_EXP_DECL pcre32 *pcre32_compile2(PCRE_SPTR32, int, int *, const char **, - int *, const unsigned char *); -PCRE_EXP_DECL int pcre_config(int, void *); -PCRE_EXP_DECL int pcre16_config(int, void *); -PCRE_EXP_DECL int pcre32_config(int, void *); -PCRE_EXP_DECL int pcre_copy_named_substring(const pcre *, const char *, - int *, int, const char *, char *, int); -PCRE_EXP_DECL int pcre16_copy_named_substring(const pcre16 *, PCRE_SPTR16, - int *, int, PCRE_SPTR16, PCRE_UCHAR16 *, int); -PCRE_EXP_DECL int pcre32_copy_named_substring(const pcre32 *, PCRE_SPTR32, - int *, int, PCRE_SPTR32, PCRE_UCHAR32 *, int); -PCRE_EXP_DECL int pcre_copy_substring(const char *, int *, int, int, - char *, int); -PCRE_EXP_DECL int pcre16_copy_substring(PCRE_SPTR16, int *, int, int, - PCRE_UCHAR16 *, int); -PCRE_EXP_DECL int pcre32_copy_substring(PCRE_SPTR32, int *, int, int, - PCRE_UCHAR32 *, int); -PCRE_EXP_DECL int pcre_dfa_exec(const pcre *, const pcre_extra *, - const char *, int, int, int, int *, int , int *, int); -PCRE_EXP_DECL int pcre16_dfa_exec(const pcre16 *, const pcre16_extra *, - PCRE_SPTR16, int, int, int, int *, int , int *, int); -PCRE_EXP_DECL int pcre32_dfa_exec(const pcre32 *, const pcre32_extra *, - PCRE_SPTR32, int, int, int, int *, int , int *, int); -PCRE_EXP_DECL int pcre_exec(const pcre *, const pcre_extra *, PCRE_SPTR, - int, int, int, int *, int); -PCRE_EXP_DECL int pcre16_exec(const pcre16 *, const pcre16_extra *, - PCRE_SPTR16, int, int, int, int *, int); -PCRE_EXP_DECL int pcre32_exec(const pcre32 *, const pcre32_extra *, - PCRE_SPTR32, int, int, int, int *, int); -PCRE_EXP_DECL int pcre_jit_exec(const pcre *, const pcre_extra *, - PCRE_SPTR, int, int, int, int *, int, - pcre_jit_stack *); -PCRE_EXP_DECL int pcre16_jit_exec(const pcre16 *, const pcre16_extra *, - PCRE_SPTR16, int, int, int, int *, int, - pcre16_jit_stack *); -PCRE_EXP_DECL int pcre32_jit_exec(const pcre32 *, const pcre32_extra *, - PCRE_SPTR32, int, int, int, int *, int, - pcre32_jit_stack *); -PCRE_EXP_DECL void pcre_free_substring(const char *); -PCRE_EXP_DECL void pcre16_free_substring(PCRE_SPTR16); -PCRE_EXP_DECL void pcre32_free_substring(PCRE_SPTR32); -PCRE_EXP_DECL void pcre_free_substring_list(const char **); -PCRE_EXP_DECL void pcre16_free_substring_list(PCRE_SPTR16 *); -PCRE_EXP_DECL void pcre32_free_substring_list(PCRE_SPTR32 *); -PCRE_EXP_DECL int pcre_fullinfo(const pcre *, const pcre_extra *, int, - void *); -PCRE_EXP_DECL int pcre16_fullinfo(const pcre16 *, const pcre16_extra *, int, - void *); -PCRE_EXP_DECL int pcre32_fullinfo(const pcre32 *, const pcre32_extra *, int, - void *); -PCRE_EXP_DECL int pcre_get_named_substring(const pcre *, const char *, - int *, int, const char *, const char **); -PCRE_EXP_DECL int pcre16_get_named_substring(const pcre16 *, PCRE_SPTR16, - int *, int, PCRE_SPTR16, PCRE_SPTR16 *); -PCRE_EXP_DECL int pcre32_get_named_substring(const pcre32 *, PCRE_SPTR32, - int *, int, PCRE_SPTR32, PCRE_SPTR32 *); -PCRE_EXP_DECL int pcre_get_stringnumber(const pcre *, const char *); -PCRE_EXP_DECL int pcre16_get_stringnumber(const pcre16 *, PCRE_SPTR16); -PCRE_EXP_DECL int pcre32_get_stringnumber(const pcre32 *, PCRE_SPTR32); -PCRE_EXP_DECL int pcre_get_stringtable_entries(const pcre *, const char *, - char **, char **); -PCRE_EXP_DECL int pcre16_get_stringtable_entries(const pcre16 *, PCRE_SPTR16, - PCRE_UCHAR16 **, PCRE_UCHAR16 **); -PCRE_EXP_DECL int pcre32_get_stringtable_entries(const pcre32 *, PCRE_SPTR32, - PCRE_UCHAR32 **, PCRE_UCHAR32 **); -PCRE_EXP_DECL int pcre_get_substring(const char *, int *, int, int, - const char **); -PCRE_EXP_DECL int pcre16_get_substring(PCRE_SPTR16, int *, int, int, - PCRE_SPTR16 *); -PCRE_EXP_DECL int pcre32_get_substring(PCRE_SPTR32, int *, int, int, - PCRE_SPTR32 *); -PCRE_EXP_DECL int pcre_get_substring_list(const char *, int *, int, - const char ***); -PCRE_EXP_DECL int pcre16_get_substring_list(PCRE_SPTR16, int *, int, - PCRE_SPTR16 **); -PCRE_EXP_DECL int pcre32_get_substring_list(PCRE_SPTR32, int *, int, - PCRE_SPTR32 **); -PCRE_EXP_DECL const unsigned char *pcre_maketables(void); -PCRE_EXP_DECL const unsigned char *pcre16_maketables(void); -PCRE_EXP_DECL const unsigned char *pcre32_maketables(void); -PCRE_EXP_DECL int pcre_refcount(pcre *, int); -PCRE_EXP_DECL int pcre16_refcount(pcre16 *, int); -PCRE_EXP_DECL int pcre32_refcount(pcre32 *, int); -PCRE_EXP_DECL pcre_extra *pcre_study(const pcre *, int, const char **); -PCRE_EXP_DECL pcre16_extra *pcre16_study(const pcre16 *, int, const char **); -PCRE_EXP_DECL pcre32_extra *pcre32_study(const pcre32 *, int, const char **); -PCRE_EXP_DECL void pcre_free_study(pcre_extra *); -PCRE_EXP_DECL void pcre16_free_study(pcre16_extra *); -PCRE_EXP_DECL void pcre32_free_study(pcre32_extra *); -PCRE_EXP_DECL const char *pcre_version(void); -PCRE_EXP_DECL const char *pcre16_version(void); -PCRE_EXP_DECL const char *pcre32_version(void); - -/* Utility functions for byte order swaps. */ -PCRE_EXP_DECL int pcre_pattern_to_host_byte_order(pcre *, pcre_extra *, - const unsigned char *); -PCRE_EXP_DECL int pcre16_pattern_to_host_byte_order(pcre16 *, pcre16_extra *, - const unsigned char *); -PCRE_EXP_DECL int pcre32_pattern_to_host_byte_order(pcre32 *, pcre32_extra *, - const unsigned char *); -PCRE_EXP_DECL int pcre16_utf16_to_host_byte_order(PCRE_UCHAR16 *, - PCRE_SPTR16, int, int *, int); -PCRE_EXP_DECL int pcre32_utf32_to_host_byte_order(PCRE_UCHAR32 *, - PCRE_SPTR32, int, int *, int); - -/* JIT compiler related functions. */ - -PCRE_EXP_DECL pcre_jit_stack *pcre_jit_stack_alloc(int, int); -PCRE_EXP_DECL pcre16_jit_stack *pcre16_jit_stack_alloc(int, int); -PCRE_EXP_DECL pcre32_jit_stack *pcre32_jit_stack_alloc(int, int); -PCRE_EXP_DECL void pcre_jit_stack_free(pcre_jit_stack *); -PCRE_EXP_DECL void pcre16_jit_stack_free(pcre16_jit_stack *); -PCRE_EXP_DECL void pcre32_jit_stack_free(pcre32_jit_stack *); -PCRE_EXP_DECL void pcre_assign_jit_stack(pcre_extra *, - pcre_jit_callback, void *); -PCRE_EXP_DECL void pcre16_assign_jit_stack(pcre16_extra *, - pcre16_jit_callback, void *); -PCRE_EXP_DECL void pcre32_assign_jit_stack(pcre32_extra *, - pcre32_jit_callback, void *); -PCRE_EXP_DECL void pcre_jit_free_unused_memory(void); -PCRE_EXP_DECL void pcre16_jit_free_unused_memory(void); -PCRE_EXP_DECL void pcre32_jit_free_unused_memory(void); - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /* End of pcre.h */ diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/include/pcre_scanner.h b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/include/pcre_scanner.h deleted file mode 100644 index 5617e451..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/include/pcre_scanner.h +++ /dev/null @@ -1,172 +0,0 @@ -// Copyright (c) 2005, Google Inc. -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -// -// Author: Sanjay Ghemawat -// -// Regular-expression based scanner for parsing an input stream. -// -// Example 1: parse a sequence of "var = number" entries from input: -// -// Scanner scanner(input); -// string var; -// int number; -// scanner.SetSkipExpression("\\s+"); // Skip any white space we encounter -// while (scanner.Consume("(\\w+) = (\\d+)", &var, &number)) { -// ...; -// } - -#ifndef _PCRE_SCANNER_H -#define _PCRE_SCANNER_H - -#include -#include -#include - -#include -#include - -namespace pcrecpp { - -class PCRECPP_EXP_DEFN Scanner { - public: - Scanner(); - explicit Scanner(const std::string& input); - ~Scanner(); - - // Return current line number. The returned line-number is - // one-based. I.e. it returns 1 + the number of consumed newlines. - // - // Note: this method may be slow. It may take time proportional to - // the size of the input. - int LineNumber() const; - - // Return the byte-offset that the scanner is looking in the - // input data; - int Offset() const; - - // Return true iff the start of the remaining input matches "re" - bool LookingAt(const RE& re) const; - - // Return true iff all of the following are true - // a. the start of the remaining input matches "re", - // b. if any arguments are supplied, matched sub-patterns can be - // parsed and stored into the arguments. - // If it returns true, it skips over the matched input and any - // following input that matches the "skip" regular expression. - bool Consume(const RE& re, - const Arg& arg0 = RE::no_arg, - const Arg& arg1 = RE::no_arg, - const Arg& arg2 = RE::no_arg - // TODO: Allow more arguments? - ); - - // Set the "skip" regular expression. If after consuming some data, - // a prefix of the input matches this RE, it is automatically - // skipped. For example, a programming language scanner would use - // a skip RE that matches white space and comments. - // - // scanner.SetSkipExpression("\\s+|//.*|/[*](.|\n)*?[*]/"); - // - // Skipping repeats as long as it succeeds. We used to let people do - // this by writing "(...)*" in the regular expression, but that added - // up to lots of recursive calls within the pcre library, so now we - // control repetition explicitly via the function call API. - // - // You can pass NULL for "re" if you do not want any data to be skipped. - void Skip(const char* re); // DEPRECATED; does *not* repeat - void SetSkipExpression(const char* re); - - // Temporarily pause "skip"ing. This - // Skip("Foo"); code ; DisableSkip(); code; EnableSkip() - // is similar to - // Skip("Foo"); code ; Skip(NULL); code ; Skip("Foo"); - // but avoids creating/deleting new RE objects. - void DisableSkip(); - - // Reenable previously paused skipping. Any prefix of the input - // that matches the skip pattern is immediately dropped. - void EnableSkip(); - - /***** Special wrappers around SetSkip() for some common idioms *****/ - - // Arranges to skip whitespace, C comments, C++ comments. - // The overall RE is a disjunction of the following REs: - // \\s whitespace - // //.*\n C++ comment - // /[*](.|\n)*?[*]/ C comment (x*? means minimal repetitions of x) - // We get repetition via the semantics of SetSkipExpression, not by using * - void SkipCXXComments() { - SetSkipExpression("\\s|//.*\n|/[*](?:\n|.)*?[*]/"); - } - - void set_save_comments(bool comments) { - save_comments_ = comments; - } - - bool save_comments() { - return save_comments_; - } - - // Append to vector ranges the comments found in the - // byte range [start,end] (inclusive) of the input data. - // Only comments that were extracted entirely within that - // range are returned: no range splitting of atomically-extracted - // comments is performed. - void GetComments(int start, int end, std::vector *ranges); - - // Append to vector ranges the comments added - // since the last time this was called. This - // functionality is provided for efficiency when - // interleaving scanning with parsing. - void GetNextComments(std::vector *ranges); - - private: - std::string data_; // All the input data - StringPiece input_; // Unprocessed input - RE* skip_; // If non-NULL, RE for skipping input - bool should_skip_; // If true, use skip_ - bool skip_repeat_; // If true, repeat skip_ as long as it works - bool save_comments_; // If true, aggregate the skip expression - - // the skipped comments - // TODO: later consider requiring that the StringPieces be added - // in order by their start position - std::vector *comments_; - - // the offset into comments_ that has been returned by GetNextComments - int comments_offset_; - - // helper function to consume *skip_ and honour - // save_comments_ - void ConsumeSkip(); -}; - -} // namespace pcrecpp - -#endif /* _PCRE_SCANNER_H */ diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/include/pcre_stringpiece.h b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/include/pcre_stringpiece.h deleted file mode 100644 index cb94f52a..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/include/pcre_stringpiece.h +++ /dev/null @@ -1,180 +0,0 @@ -// Copyright (c) 2005, Google Inc. -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -// -// Author: Sanjay Ghemawat -// -// A string like object that points into another piece of memory. -// Useful for providing an interface that allows clients to easily -// pass in either a "const char*" or a "string". -// -// Arghh! I wish C++ literals were automatically of type "string". - -#ifndef _PCRE_STRINGPIECE_H -#define _PCRE_STRINGPIECE_H - -#include -#include -#include // for ostream forward-declaration - -#if 0 -#define HAVE_TYPE_TRAITS -#include -#elif 0 -#define HAVE_TYPE_TRAITS -#include -#endif - -#include - -namespace pcrecpp { - -using std::memcmp; -using std::strlen; -using std::string; - -class PCRECPP_EXP_DEFN StringPiece { - private: - const char* ptr_; - int length_; - - public: - // We provide non-explicit singleton constructors so users can pass - // in a "const char*" or a "string" wherever a "StringPiece" is - // expected. - StringPiece() - : ptr_(NULL), length_(0) { } - StringPiece(const char* str) - : ptr_(str), length_(static_cast(strlen(ptr_))) { } - StringPiece(const unsigned char* str) - : ptr_(reinterpret_cast(str)), - length_(static_cast(strlen(ptr_))) { } - StringPiece(const string& str) - : ptr_(str.data()), length_(static_cast(str.size())) { } - StringPiece(const char* offset, int len) - : ptr_(offset), length_(len) { } - - // data() may return a pointer to a buffer with embedded NULs, and the - // returned buffer may or may not be null terminated. Therefore it is - // typically a mistake to pass data() to a routine that expects a NUL - // terminated string. Use "as_string().c_str()" if you really need to do - // this. Or better yet, change your routine so it does not rely on NUL - // termination. - const char* data() const { return ptr_; } - int size() const { return length_; } - bool empty() const { return length_ == 0; } - - void clear() { ptr_ = NULL; length_ = 0; } - void set(const char* buffer, int len) { ptr_ = buffer; length_ = len; } - void set(const char* str) { - ptr_ = str; - length_ = static_cast(strlen(str)); - } - void set(const void* buffer, int len) { - ptr_ = reinterpret_cast(buffer); - length_ = len; - } - - char operator[](int i) const { return ptr_[i]; } - - void remove_prefix(int n) { - ptr_ += n; - length_ -= n; - } - - void remove_suffix(int n) { - length_ -= n; - } - - bool operator==(const StringPiece& x) const { - return ((length_ == x.length_) && - (memcmp(ptr_, x.ptr_, length_) == 0)); - } - bool operator!=(const StringPiece& x) const { - return !(*this == x); - } - -#define STRINGPIECE_BINARY_PREDICATE(cmp,auxcmp) \ - bool operator cmp (const StringPiece& x) const { \ - int r = memcmp(ptr_, x.ptr_, length_ < x.length_ ? length_ : x.length_); \ - return ((r auxcmp 0) || ((r == 0) && (length_ cmp x.length_))); \ - } - STRINGPIECE_BINARY_PREDICATE(<, <); - STRINGPIECE_BINARY_PREDICATE(<=, <); - STRINGPIECE_BINARY_PREDICATE(>=, >); - STRINGPIECE_BINARY_PREDICATE(>, >); -#undef STRINGPIECE_BINARY_PREDICATE - - int compare(const StringPiece& x) const { - int r = memcmp(ptr_, x.ptr_, length_ < x.length_ ? length_ : x.length_); - if (r == 0) { - if (length_ < x.length_) r = -1; - else if (length_ > x.length_) r = +1; - } - return r; - } - - string as_string() const { - return string(data(), size()); - } - - void CopyToString(string* target) const { - target->assign(ptr_, length_); - } - - // Does "this" start with "x" - bool starts_with(const StringPiece& x) const { - return ((length_ >= x.length_) && (memcmp(ptr_, x.ptr_, x.length_) == 0)); - } -}; - -} // namespace pcrecpp - -// ------------------------------------------------------------------ -// Functions used to create STL containers that use StringPiece -// Remember that a StringPiece's lifetime had better be less than -// that of the underlying string or char*. If it is not, then you -// cannot safely store a StringPiece into an STL container -// ------------------------------------------------------------------ - -#ifdef HAVE_TYPE_TRAITS -// This makes vector really fast for some STL implementations -template<> struct __type_traits { - typedef __true_type has_trivial_default_constructor; - typedef __true_type has_trivial_copy_constructor; - typedef __true_type has_trivial_assignment_operator; - typedef __true_type has_trivial_destructor; - typedef __true_type is_POD_type; -}; -#endif - -// allow StringPiece to be logged -PCRECPP_EXP_DECL std::ostream& operator<<(std::ostream& o, - const pcrecpp::StringPiece& piece); - -#endif /* _PCRE_STRINGPIECE_H */ diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/include/pcrecpp.h b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/include/pcrecpp.h deleted file mode 100644 index 3e594b0d..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/include/pcrecpp.h +++ /dev/null @@ -1,710 +0,0 @@ -// Copyright (c) 2005, Google Inc. -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -// -// Author: Sanjay Ghemawat -// Support for PCRE_XXX modifiers added by Giuseppe Maxia, July 2005 - -#ifndef _PCRECPP_H -#define _PCRECPP_H - -// C++ interface to the pcre regular-expression library. RE supports -// Perl-style regular expressions (with extensions like \d, \w, \s, -// ...). -// -// ----------------------------------------------------------------------- -// REGEXP SYNTAX: -// -// This module is part of the pcre library and hence supports its syntax -// for regular expressions. -// -// The syntax is pretty similar to Perl's. For those not familiar -// with Perl's regular expressions, here are some examples of the most -// commonly used extensions: -// -// "hello (\\w+) world" -- \w matches a "word" character -// "version (\\d+)" -- \d matches a digit -// "hello\\s+world" -- \s matches any whitespace character -// "\\b(\\w+)\\b" -- \b matches empty string at a word boundary -// "(?i)hello" -- (?i) turns on case-insensitive matching -// "/\\*(.*?)\\*/" -- .*? matches . minimum no. of times possible -// -// ----------------------------------------------------------------------- -// MATCHING INTERFACE: -// -// The "FullMatch" operation checks that supplied text matches a -// supplied pattern exactly. -// -// Example: successful match -// pcrecpp::RE re("h.*o"); -// re.FullMatch("hello"); -// -// Example: unsuccessful match (requires full match): -// pcrecpp::RE re("e"); -// !re.FullMatch("hello"); -// -// Example: creating a temporary RE object: -// pcrecpp::RE("h.*o").FullMatch("hello"); -// -// You can pass in a "const char*" or a "string" for "text". The -// examples below tend to use a const char*. -// -// You can, as in the different examples above, store the RE object -// explicitly in a variable or use a temporary RE object. The -// examples below use one mode or the other arbitrarily. Either -// could correctly be used for any of these examples. -// -// ----------------------------------------------------------------------- -// MATCHING WITH SUB-STRING EXTRACTION: -// -// You can supply extra pointer arguments to extract matched subpieces. -// -// Example: extracts "ruby" into "s" and 1234 into "i" -// int i; -// string s; -// pcrecpp::RE re("(\\w+):(\\d+)"); -// re.FullMatch("ruby:1234", &s, &i); -// -// Example: does not try to extract any extra sub-patterns -// re.FullMatch("ruby:1234", &s); -// -// Example: does not try to extract into NULL -// re.FullMatch("ruby:1234", NULL, &i); -// -// Example: integer overflow causes failure -// !re.FullMatch("ruby:1234567891234", NULL, &i); -// -// Example: fails because there aren't enough sub-patterns: -// !pcrecpp::RE("\\w+:\\d+").FullMatch("ruby:1234", &s); -// -// Example: fails because string cannot be stored in integer -// !pcrecpp::RE("(.*)").FullMatch("ruby", &i); -// -// The provided pointer arguments can be pointers to any scalar numeric -// type, or one of -// string (matched piece is copied to string) -// StringPiece (StringPiece is mutated to point to matched piece) -// T (where "bool T::ParseFrom(const char*, int)" exists) -// NULL (the corresponding matched sub-pattern is not copied) -// -// CAVEAT: An optional sub-pattern that does not exist in the matched -// string is assigned the empty string. Therefore, the following will -// return false (because the empty string is not a valid number): -// int number; -// pcrecpp::RE::FullMatch("abc", "[a-z]+(\\d+)?", &number); -// -// ----------------------------------------------------------------------- -// DO_MATCH -// -// The matching interface supports at most 16 arguments per call. -// If you need more, consider using the more general interface -// pcrecpp::RE::DoMatch(). See pcrecpp.h for the signature for DoMatch. -// -// ----------------------------------------------------------------------- -// PARTIAL MATCHES -// -// You can use the "PartialMatch" operation when you want the pattern -// to match any substring of the text. -// -// Example: simple search for a string: -// pcrecpp::RE("ell").PartialMatch("hello"); -// -// Example: find first number in a string: -// int number; -// pcrecpp::RE re("(\\d+)"); -// re.PartialMatch("x*100 + 20", &number); -// assert(number == 100); -// -// ----------------------------------------------------------------------- -// UTF-8 AND THE MATCHING INTERFACE: -// -// By default, pattern and text are plain text, one byte per character. -// The UTF8 flag, passed to the constructor, causes both pattern -// and string to be treated as UTF-8 text, still a byte stream but -// potentially multiple bytes per character. In practice, the text -// is likelier to be UTF-8 than the pattern, but the match returned -// may depend on the UTF8 flag, so always use it when matching -// UTF8 text. E.g., "." will match one byte normally but with UTF8 -// set may match up to three bytes of a multi-byte character. -// -// Example: -// pcrecpp::RE_Options options; -// options.set_utf8(); -// pcrecpp::RE re(utf8_pattern, options); -// re.FullMatch(utf8_string); -// -// Example: using the convenience function UTF8(): -// pcrecpp::RE re(utf8_pattern, pcrecpp::UTF8()); -// re.FullMatch(utf8_string); -// -// NOTE: The UTF8 option is ignored if pcre was not configured with the -// --enable-utf8 flag. -// -// ----------------------------------------------------------------------- -// PASSING MODIFIERS TO THE REGULAR EXPRESSION ENGINE -// -// PCRE defines some modifiers to change the behavior of the regular -// expression engine. -// The C++ wrapper defines an auxiliary class, RE_Options, as a vehicle -// to pass such modifiers to a RE class. -// -// Currently, the following modifiers are supported -// -// modifier description Perl corresponding -// -// PCRE_CASELESS case insensitive match /i -// PCRE_MULTILINE multiple lines match /m -// PCRE_DOTALL dot matches newlines /s -// PCRE_DOLLAR_ENDONLY $ matches only at end N/A -// PCRE_EXTRA strict escape parsing N/A -// PCRE_EXTENDED ignore whitespaces /x -// PCRE_UTF8 handles UTF8 chars built-in -// PCRE_UNGREEDY reverses * and *? N/A -// PCRE_NO_AUTO_CAPTURE disables matching parens N/A (*) -// -// (For a full account on how each modifier works, please check the -// PCRE API reference manual). -// -// (*) Both Perl and PCRE allow non matching parentheses by means of the -// "?:" modifier within the pattern itself. e.g. (?:ab|cd) does not -// capture, while (ab|cd) does. -// -// For each modifier, there are two member functions whose name is made -// out of the modifier in lowercase, without the "PCRE_" prefix. For -// instance, PCRE_CASELESS is handled by -// bool caseless(), -// which returns true if the modifier is set, and -// RE_Options & set_caseless(bool), -// which sets or unsets the modifier. -// -// Moreover, PCRE_EXTRA_MATCH_LIMIT can be accessed through the -// set_match_limit() and match_limit() member functions. -// Setting match_limit to a non-zero value will limit the executation of -// pcre to keep it from doing bad things like blowing the stack or taking -// an eternity to return a result. A value of 5000 is good enough to stop -// stack blowup in a 2MB thread stack. Setting match_limit to zero will -// disable match limiting. Alternately, you can set match_limit_recursion() -// which uses PCRE_EXTRA_MATCH_LIMIT_RECURSION to limit how much pcre -// recurses. match_limit() caps the number of matches pcre does; -// match_limit_recrusion() caps the depth of recursion. -// -// Normally, to pass one or more modifiers to a RE class, you declare -// a RE_Options object, set the appropriate options, and pass this -// object to a RE constructor. Example: -// -// RE_options opt; -// opt.set_caseless(true); -// -// if (RE("HELLO", opt).PartialMatch("hello world")) ... -// -// RE_options has two constructors. The default constructor takes no -// arguments and creates a set of flags that are off by default. -// -// The optional parameter 'option_flags' is to facilitate transfer -// of legacy code from C programs. This lets you do -// RE(pattern, RE_Options(PCRE_CASELESS|PCRE_MULTILINE)).PartialMatch(str); -// -// But new code is better off doing -// RE(pattern, -// RE_Options().set_caseless(true).set_multiline(true)).PartialMatch(str); -// (See below) -// -// If you are going to pass one of the most used modifiers, there are some -// convenience functions that return a RE_Options class with the -// appropriate modifier already set: -// CASELESS(), UTF8(), MULTILINE(), DOTALL(), EXTENDED() -// -// If you need to set several options at once, and you don't want to go -// through the pains of declaring a RE_Options object and setting several -// options, there is a parallel method that give you such ability on the -// fly. You can concatenate several set_xxxxx member functions, since each -// of them returns a reference to its class object. e.g.: to pass -// PCRE_CASELESS, PCRE_EXTENDED, and PCRE_MULTILINE to a RE with one -// statement, you may write -// -// RE(" ^ xyz \\s+ .* blah$", RE_Options() -// .set_caseless(true) -// .set_extended(true) -// .set_multiline(true)).PartialMatch(sometext); -// -// ----------------------------------------------------------------------- -// SCANNING TEXT INCREMENTALLY -// -// The "Consume" operation may be useful if you want to repeatedly -// match regular expressions at the front of a string and skip over -// them as they match. This requires use of the "StringPiece" type, -// which represents a sub-range of a real string. Like RE, StringPiece -// is defined in the pcrecpp namespace. -// -// Example: read lines of the form "var = value" from a string. -// string contents = ...; // Fill string somehow -// pcrecpp::StringPiece input(contents); // Wrap in a StringPiece -// -// string var; -// int value; -// pcrecpp::RE re("(\\w+) = (\\d+)\n"); -// while (re.Consume(&input, &var, &value)) { -// ...; -// } -// -// Each successful call to "Consume" will set "var/value", and also -// advance "input" so it points past the matched text. -// -// The "FindAndConsume" operation is similar to "Consume" but does not -// anchor your match at the beginning of the string. For example, you -// could extract all words from a string by repeatedly calling -// pcrecpp::RE("(\\w+)").FindAndConsume(&input, &word) -// -// ----------------------------------------------------------------------- -// PARSING HEX/OCTAL/C-RADIX NUMBERS -// -// By default, if you pass a pointer to a numeric value, the -// corresponding text is interpreted as a base-10 number. You can -// instead wrap the pointer with a call to one of the operators Hex(), -// Octal(), or CRadix() to interpret the text in another base. The -// CRadix operator interprets C-style "0" (base-8) and "0x" (base-16) -// prefixes, but defaults to base-10. -// -// Example: -// int a, b, c, d; -// pcrecpp::RE re("(.*) (.*) (.*) (.*)"); -// re.FullMatch("100 40 0100 0x40", -// pcrecpp::Octal(&a), pcrecpp::Hex(&b), -// pcrecpp::CRadix(&c), pcrecpp::CRadix(&d)); -// will leave 64 in a, b, c, and d. -// -// ----------------------------------------------------------------------- -// REPLACING PARTS OF STRINGS -// -// You can replace the first match of "pattern" in "str" with -// "rewrite". Within "rewrite", backslash-escaped digits (\1 to \9) -// can be used to insert text matching corresponding parenthesized -// group from the pattern. \0 in "rewrite" refers to the entire -// matching text. E.g., -// -// string s = "yabba dabba doo"; -// pcrecpp::RE("b+").Replace("d", &s); -// -// will leave "s" containing "yada dabba doo". The result is true if -// the pattern matches and a replacement occurs, or false otherwise. -// -// GlobalReplace() is like Replace(), except that it replaces all -// occurrences of the pattern in the string with the rewrite. -// Replacements are not subject to re-matching. E.g., -// -// string s = "yabba dabba doo"; -// pcrecpp::RE("b+").GlobalReplace("d", &s); -// -// will leave "s" containing "yada dada doo". It returns the number -// of replacements made. -// -// Extract() is like Replace(), except that if the pattern matches, -// "rewrite" is copied into "out" (an additional argument) with -// substitutions. The non-matching portions of "text" are ignored. -// Returns true iff a match occurred and the extraction happened -// successfully. If no match occurs, the string is left unaffected. - - -#include -#include -#include // defines the Arg class -// This isn't technically needed here, but we include it -// anyway so folks who include pcrecpp.h don't have to. -#include - -namespace pcrecpp { - -#define PCRE_SET_OR_CLEAR(b, o) \ - if (b) all_options_ |= (o); else all_options_ &= ~(o); \ - return *this - -#define PCRE_IS_SET(o) \ - (all_options_ & o) == o - -/***** Compiling regular expressions: the RE class *****/ - -// RE_Options allow you to set options to be passed along to pcre, -// along with other options we put on top of pcre. -// Only 9 modifiers, plus match_limit and match_limit_recursion, -// are supported now. -class PCRECPP_EXP_DEFN RE_Options { - public: - // constructor - RE_Options() : match_limit_(0), match_limit_recursion_(0), all_options_(0) {} - - // alternative constructor. - // To facilitate transfer of legacy code from C programs - // - // This lets you do - // RE(pattern, RE_Options(PCRE_CASELESS|PCRE_MULTILINE)).PartialMatch(str); - // But new code is better off doing - // RE(pattern, - // RE_Options().set_caseless(true).set_multiline(true)).PartialMatch(str); - RE_Options(int option_flags) : match_limit_(0), match_limit_recursion_(0), - all_options_(option_flags) {} - // we're fine with the default destructor, copy constructor, etc. - - // accessors and mutators - int match_limit() const { return match_limit_; }; - RE_Options &set_match_limit(int limit) { - match_limit_ = limit; - return *this; - } - - int match_limit_recursion() const { return match_limit_recursion_; }; - RE_Options &set_match_limit_recursion(int limit) { - match_limit_recursion_ = limit; - return *this; - } - - bool caseless() const { - return PCRE_IS_SET(PCRE_CASELESS); - } - RE_Options &set_caseless(bool x) { - PCRE_SET_OR_CLEAR(x, PCRE_CASELESS); - } - - bool multiline() const { - return PCRE_IS_SET(PCRE_MULTILINE); - } - RE_Options &set_multiline(bool x) { - PCRE_SET_OR_CLEAR(x, PCRE_MULTILINE); - } - - bool dotall() const { - return PCRE_IS_SET(PCRE_DOTALL); - } - RE_Options &set_dotall(bool x) { - PCRE_SET_OR_CLEAR(x, PCRE_DOTALL); - } - - bool extended() const { - return PCRE_IS_SET(PCRE_EXTENDED); - } - RE_Options &set_extended(bool x) { - PCRE_SET_OR_CLEAR(x, PCRE_EXTENDED); - } - - bool dollar_endonly() const { - return PCRE_IS_SET(PCRE_DOLLAR_ENDONLY); - } - RE_Options &set_dollar_endonly(bool x) { - PCRE_SET_OR_CLEAR(x, PCRE_DOLLAR_ENDONLY); - } - - bool extra() const { - return PCRE_IS_SET(PCRE_EXTRA); - } - RE_Options &set_extra(bool x) { - PCRE_SET_OR_CLEAR(x, PCRE_EXTRA); - } - - bool ungreedy() const { - return PCRE_IS_SET(PCRE_UNGREEDY); - } - RE_Options &set_ungreedy(bool x) { - PCRE_SET_OR_CLEAR(x, PCRE_UNGREEDY); - } - - bool utf8() const { - return PCRE_IS_SET(PCRE_UTF8); - } - RE_Options &set_utf8(bool x) { - PCRE_SET_OR_CLEAR(x, PCRE_UTF8); - } - - bool no_auto_capture() const { - return PCRE_IS_SET(PCRE_NO_AUTO_CAPTURE); - } - RE_Options &set_no_auto_capture(bool x) { - PCRE_SET_OR_CLEAR(x, PCRE_NO_AUTO_CAPTURE); - } - - RE_Options &set_all_options(int opt) { - all_options_ = opt; - return *this; - } - int all_options() const { - return all_options_ ; - } - - // TODO: add other pcre flags - - private: - int match_limit_; - int match_limit_recursion_; - int all_options_; -}; - -// These functions return some common RE_Options -static inline RE_Options UTF8() { - return RE_Options().set_utf8(true); -} - -static inline RE_Options CASELESS() { - return RE_Options().set_caseless(true); -} -static inline RE_Options MULTILINE() { - return RE_Options().set_multiline(true); -} - -static inline RE_Options DOTALL() { - return RE_Options().set_dotall(true); -} - -static inline RE_Options EXTENDED() { - return RE_Options().set_extended(true); -} - -// Interface for regular expression matching. Also corresponds to a -// pre-compiled regular expression. An "RE" object is safe for -// concurrent use by multiple threads. -class PCRECPP_EXP_DEFN RE { - public: - // We provide implicit conversions from strings so that users can - // pass in a string or a "const char*" wherever an "RE" is expected. - RE(const string& pat) { Init(pat, NULL); } - RE(const string& pat, const RE_Options& option) { Init(pat, &option); } - RE(const char* pat) { Init(pat, NULL); } - RE(const char* pat, const RE_Options& option) { Init(pat, &option); } - RE(const unsigned char* pat) { - Init(reinterpret_cast(pat), NULL); - } - RE(const unsigned char* pat, const RE_Options& option) { - Init(reinterpret_cast(pat), &option); - } - - // Copy constructor & assignment - note that these are expensive - // because they recompile the expression. - RE(const RE& re) { Init(re.pattern_, &re.options_); } - const RE& operator=(const RE& re) { - if (this != &re) { - Cleanup(); - - // This is the code that originally came from Google - // Init(re.pattern_.c_str(), &re.options_); - - // This is the replacement from Ari Pollak - Init(re.pattern_, &re.options_); - } - return *this; - } - - - ~RE(); - - // The string specification for this RE. E.g. - // RE re("ab*c?d+"); - // re.pattern(); // "ab*c?d+" - const string& pattern() const { return pattern_; } - - // If RE could not be created properly, returns an error string. - // Else returns the empty string. - const string& error() const { return *error_; } - - /***** The useful part: the matching interface *****/ - - // This is provided so one can do pattern.ReplaceAll() just as - // easily as ReplaceAll(pattern-text, ....) - - bool FullMatch(const StringPiece& text, - const Arg& ptr1 = no_arg, - const Arg& ptr2 = no_arg, - const Arg& ptr3 = no_arg, - const Arg& ptr4 = no_arg, - const Arg& ptr5 = no_arg, - const Arg& ptr6 = no_arg, - const Arg& ptr7 = no_arg, - const Arg& ptr8 = no_arg, - const Arg& ptr9 = no_arg, - const Arg& ptr10 = no_arg, - const Arg& ptr11 = no_arg, - const Arg& ptr12 = no_arg, - const Arg& ptr13 = no_arg, - const Arg& ptr14 = no_arg, - const Arg& ptr15 = no_arg, - const Arg& ptr16 = no_arg) const; - - bool PartialMatch(const StringPiece& text, - const Arg& ptr1 = no_arg, - const Arg& ptr2 = no_arg, - const Arg& ptr3 = no_arg, - const Arg& ptr4 = no_arg, - const Arg& ptr5 = no_arg, - const Arg& ptr6 = no_arg, - const Arg& ptr7 = no_arg, - const Arg& ptr8 = no_arg, - const Arg& ptr9 = no_arg, - const Arg& ptr10 = no_arg, - const Arg& ptr11 = no_arg, - const Arg& ptr12 = no_arg, - const Arg& ptr13 = no_arg, - const Arg& ptr14 = no_arg, - const Arg& ptr15 = no_arg, - const Arg& ptr16 = no_arg) const; - - bool Consume(StringPiece* input, - const Arg& ptr1 = no_arg, - const Arg& ptr2 = no_arg, - const Arg& ptr3 = no_arg, - const Arg& ptr4 = no_arg, - const Arg& ptr5 = no_arg, - const Arg& ptr6 = no_arg, - const Arg& ptr7 = no_arg, - const Arg& ptr8 = no_arg, - const Arg& ptr9 = no_arg, - const Arg& ptr10 = no_arg, - const Arg& ptr11 = no_arg, - const Arg& ptr12 = no_arg, - const Arg& ptr13 = no_arg, - const Arg& ptr14 = no_arg, - const Arg& ptr15 = no_arg, - const Arg& ptr16 = no_arg) const; - - bool FindAndConsume(StringPiece* input, - const Arg& ptr1 = no_arg, - const Arg& ptr2 = no_arg, - const Arg& ptr3 = no_arg, - const Arg& ptr4 = no_arg, - const Arg& ptr5 = no_arg, - const Arg& ptr6 = no_arg, - const Arg& ptr7 = no_arg, - const Arg& ptr8 = no_arg, - const Arg& ptr9 = no_arg, - const Arg& ptr10 = no_arg, - const Arg& ptr11 = no_arg, - const Arg& ptr12 = no_arg, - const Arg& ptr13 = no_arg, - const Arg& ptr14 = no_arg, - const Arg& ptr15 = no_arg, - const Arg& ptr16 = no_arg) const; - - bool Replace(const StringPiece& rewrite, - string *str) const; - - int GlobalReplace(const StringPiece& rewrite, - string *str) const; - - bool Extract(const StringPiece &rewrite, - const StringPiece &text, - string *out) const; - - // Escapes all potentially meaningful regexp characters in - // 'unquoted'. The returned string, used as a regular expression, - // will exactly match the original string. For example, - // 1.5-2.0? - // may become: - // 1\.5\-2\.0\? - // Note QuoteMeta behaves the same as perl's QuoteMeta function, - // *except* that it escapes the NUL character (\0) as backslash + 0, - // rather than backslash + NUL. - static string QuoteMeta(const StringPiece& unquoted); - - - /***** Generic matching interface *****/ - - // Type of match (TODO: Should be restructured as part of RE_Options) - enum Anchor { - UNANCHORED, // No anchoring - ANCHOR_START, // Anchor at start only - ANCHOR_BOTH // Anchor at start and end - }; - - // General matching routine. Stores the length of the match in - // "*consumed" if successful. - bool DoMatch(const StringPiece& text, - Anchor anchor, - int* consumed, - const Arg* const* args, int n) const; - - // Return the number of capturing subpatterns, or -1 if the - // regexp wasn't valid on construction. - int NumberOfCapturingGroups() const; - - // The default value for an argument, to indicate the end of the argument - // list. This must be used only in optional argument defaults. It should NOT - // be passed explicitly. Some people have tried to use it like this: - // - // FullMatch(x, y, &z, no_arg, &w); - // - // This is a mistake, and will not work. - static Arg no_arg; - - private: - - void Init(const string& pattern, const RE_Options* options); - void Cleanup(); - - // Match against "text", filling in "vec" (up to "vecsize" * 2/3) with - // pairs of integers for the beginning and end positions of matched - // text. The first pair corresponds to the entire matched text; - // subsequent pairs correspond, in order, to parentheses-captured - // matches. Returns the number of pairs (one more than the number of - // the last subpattern with a match) if matching was successful - // and zero if the match failed. - // I.e. for RE("(foo)|(bar)|(baz)") it will return 2, 3, and 4 when matching - // against "foo", "bar", and "baz" respectively. - // When matching RE("(foo)|hello") against "hello", it will return 1. - // But the values for all subpattern are filled in into "vec". - int TryMatch(const StringPiece& text, - int startpos, - Anchor anchor, - bool empty_ok, - int *vec, - int vecsize) const; - - // Append the "rewrite" string, with backslash subsitutions from "text" - // and "vec", to string "out". - bool Rewrite(string *out, - const StringPiece& rewrite, - const StringPiece& text, - int *vec, - int veclen) const; - - // internal implementation for DoMatch - bool DoMatchImpl(const StringPiece& text, - Anchor anchor, - int* consumed, - const Arg* const args[], - int n, - int* vec, - int vecsize) const; - - // Compile the regexp for the specified anchoring mode - pcre* Compile(Anchor anchor); - - string pattern_; - RE_Options options_; - pcre* re_full_; // For full matches - pcre* re_partial_; // For partial matches - const string* error_; // Error indicator (or points to empty string) -}; - -} // namespace pcrecpp - -#endif /* _PCRECPP_H */ diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/include/pcrecpparg.h b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/include/pcrecpparg.h deleted file mode 100644 index b4f9c3f4..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/include/pcrecpparg.h +++ /dev/null @@ -1,174 +0,0 @@ -// Copyright (c) 2005, Google Inc. -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -// -// Author: Sanjay Ghemawat - -#ifndef _PCRECPPARG_H -#define _PCRECPPARG_H - -#include // for NULL -#include - -#include - -namespace pcrecpp { - -class StringPiece; - -// Hex/Octal/Binary? - -// Special class for parsing into objects that define a ParseFrom() method -template -class _RE_MatchObject { - public: - static inline bool Parse(const char* str, int n, void* dest) { - if (dest == NULL) return true; - T* object = reinterpret_cast(dest); - return object->ParseFrom(str, n); - } -}; - -class PCRECPP_EXP_DEFN Arg { - public: - // Empty constructor so we can declare arrays of Arg - Arg(); - - // Constructor specially designed for NULL arguments - Arg(void*); - - typedef bool (*Parser)(const char* str, int n, void* dest); - -// Type-specific parsers -#define PCRE_MAKE_PARSER(type,name) \ - Arg(type* p) : arg_(p), parser_(name) { } \ - Arg(type* p, Parser parser) : arg_(p), parser_(parser) { } - - - PCRE_MAKE_PARSER(char, parse_char); - PCRE_MAKE_PARSER(unsigned char, parse_uchar); - PCRE_MAKE_PARSER(short, parse_short); - PCRE_MAKE_PARSER(unsigned short, parse_ushort); - PCRE_MAKE_PARSER(int, parse_int); - PCRE_MAKE_PARSER(unsigned int, parse_uint); - PCRE_MAKE_PARSER(long, parse_long); - PCRE_MAKE_PARSER(unsigned long, parse_ulong); -#if 1 - PCRE_MAKE_PARSER(long long, parse_longlong); -#endif -#if 1 - PCRE_MAKE_PARSER(unsigned long long, parse_ulonglong); -#endif - PCRE_MAKE_PARSER(float, parse_float); - PCRE_MAKE_PARSER(double, parse_double); - PCRE_MAKE_PARSER(std::string, parse_string); - PCRE_MAKE_PARSER(StringPiece, parse_stringpiece); - -#undef PCRE_MAKE_PARSER - - // Generic constructor - template Arg(T*, Parser parser); - // Generic constructor template - template Arg(T* p) - : arg_(p), parser_(_RE_MatchObject::Parse) { - } - - // Parse the data - bool Parse(const char* str, int n) const; - - private: - void* arg_; - Parser parser_; - - static bool parse_null (const char* str, int n, void* dest); - static bool parse_char (const char* str, int n, void* dest); - static bool parse_uchar (const char* str, int n, void* dest); - static bool parse_float (const char* str, int n, void* dest); - static bool parse_double (const char* str, int n, void* dest); - static bool parse_string (const char* str, int n, void* dest); - static bool parse_stringpiece (const char* str, int n, void* dest); - -#define PCRE_DECLARE_INTEGER_PARSER(name) \ - private: \ - static bool parse_ ## name(const char* str, int n, void* dest); \ - static bool parse_ ## name ## _radix( \ - const char* str, int n, void* dest, int radix); \ - public: \ - static bool parse_ ## name ## _hex(const char* str, int n, void* dest); \ - static bool parse_ ## name ## _octal(const char* str, int n, void* dest); \ - static bool parse_ ## name ## _cradix(const char* str, int n, void* dest) - - PCRE_DECLARE_INTEGER_PARSER(short); - PCRE_DECLARE_INTEGER_PARSER(ushort); - PCRE_DECLARE_INTEGER_PARSER(int); - PCRE_DECLARE_INTEGER_PARSER(uint); - PCRE_DECLARE_INTEGER_PARSER(long); - PCRE_DECLARE_INTEGER_PARSER(ulong); - PCRE_DECLARE_INTEGER_PARSER(longlong); - PCRE_DECLARE_INTEGER_PARSER(ulonglong); - -#undef PCRE_DECLARE_INTEGER_PARSER -}; - -inline Arg::Arg() : arg_(NULL), parser_(parse_null) { } -inline Arg::Arg(void* p) : arg_(p), parser_(parse_null) { } - -inline bool Arg::Parse(const char* str, int n) const { - return (*parser_)(str, n, arg_); -} - -// This part of the parser, appropriate only for ints, deals with bases -#define MAKE_INTEGER_PARSER(type, name) \ - inline Arg Hex(type* ptr) { \ - return Arg(ptr, Arg::parse_ ## name ## _hex); } \ - inline Arg Octal(type* ptr) { \ - return Arg(ptr, Arg::parse_ ## name ## _octal); } \ - inline Arg CRadix(type* ptr) { \ - return Arg(ptr, Arg::parse_ ## name ## _cradix); } - -MAKE_INTEGER_PARSER(short, short) /* */ -MAKE_INTEGER_PARSER(unsigned short, ushort) /* */ -MAKE_INTEGER_PARSER(int, int) /* Don't use semicolons */ -MAKE_INTEGER_PARSER(unsigned int, uint) /* after these statement */ -MAKE_INTEGER_PARSER(long, long) /* because they can cause */ -MAKE_INTEGER_PARSER(unsigned long, ulong) /* compiler warnings if */ -#if 1 /* the checking level is */ -MAKE_INTEGER_PARSER(long long, longlong) /* turned up high enough. */ -#endif /* */ -#if 1 /* */ -MAKE_INTEGER_PARSER(unsigned long long, ulonglong) /* */ -#endif - -#undef PCRE_IS_SET -#undef PCRE_SET_OR_CLEAR -#undef MAKE_INTEGER_PARSER - -} // namespace pcrecpp - - -#endif /* _PCRECPPARG_H */ diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/include/pcreposix.h b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/include/pcreposix.h deleted file mode 100644 index c77c0b05..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/include/pcreposix.h +++ /dev/null @@ -1,146 +0,0 @@ -/************************************************* -* Perl-Compatible Regular Expressions * -*************************************************/ - -#ifndef _PCREPOSIX_H -#define _PCREPOSIX_H - -/* This is the header for the POSIX wrapper interface to the PCRE Perl- -Compatible Regular Expression library. It defines the things POSIX says should -be there. I hope. - - Copyright (c) 1997-2012 University of Cambridge - ------------------------------------------------------------------------------ -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - - * Neither the name of the University of Cambridge nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. ------------------------------------------------------------------------------ -*/ - -/* Have to include stdlib.h in order to ensure that size_t is defined. */ - -#include - -/* Allow for C++ users */ - -#ifdef __cplusplus -extern "C" { -#endif - -/* Options, mostly defined by POSIX, but with some extras. */ - -#define REG_ICASE 0x0001 /* Maps to PCRE_CASELESS */ -#define REG_NEWLINE 0x0002 /* Maps to PCRE_MULTILINE */ -#define REG_NOTBOL 0x0004 /* Maps to PCRE_NOTBOL */ -#define REG_NOTEOL 0x0008 /* Maps to PCRE_NOTEOL */ -#define REG_DOTALL 0x0010 /* NOT defined by POSIX; maps to PCRE_DOTALL */ -#define REG_NOSUB 0x0020 /* Maps to PCRE_NO_AUTO_CAPTURE */ -#define REG_UTF8 0x0040 /* NOT defined by POSIX; maps to PCRE_UTF8 */ -#define REG_STARTEND 0x0080 /* BSD feature: pass subject string by so,eo */ -#define REG_NOTEMPTY 0x0100 /* NOT defined by POSIX; maps to PCRE_NOTEMPTY */ -#define REG_UNGREEDY 0x0200 /* NOT defined by POSIX; maps to PCRE_UNGREEDY */ -#define REG_UCP 0x0400 /* NOT defined by POSIX; maps to PCRE_UCP */ - -/* This is not used by PCRE, but by defining it we make it easier -to slot PCRE into existing programs that make POSIX calls. */ - -#define REG_EXTENDED 0 - -/* Error values. Not all these are relevant or used by the wrapper. */ - -enum { - REG_ASSERT = 1, /* internal error ? */ - REG_BADBR, /* invalid repeat counts in {} */ - REG_BADPAT, /* pattern error */ - REG_BADRPT, /* ? * + invalid */ - REG_EBRACE, /* unbalanced {} */ - REG_EBRACK, /* unbalanced [] */ - REG_ECOLLATE, /* collation error - not relevant */ - REG_ECTYPE, /* bad class */ - REG_EESCAPE, /* bad escape sequence */ - REG_EMPTY, /* empty expression */ - REG_EPAREN, /* unbalanced () */ - REG_ERANGE, /* bad range inside [] */ - REG_ESIZE, /* expression too big */ - REG_ESPACE, /* failed to get memory */ - REG_ESUBREG, /* bad back reference */ - REG_INVARG, /* bad argument */ - REG_NOMATCH /* match failed */ -}; - - -/* The structure representing a compiled regular expression. */ - -typedef struct { - void *re_pcre; - size_t re_nsub; - size_t re_erroffset; -} regex_t; - -/* The structure in which a captured offset is returned. */ - -typedef int regoff_t; - -typedef struct { - regoff_t rm_so; - regoff_t rm_eo; -} regmatch_t; - -/* When an application links to a PCRE DLL in Windows, the symbols that are -imported have to be identified as such. When building PCRE, the appropriate -export settings are needed, and are set in pcreposix.c before including this -file. */ - -#if defined(_WIN32) && !defined(PCRE_STATIC) && !defined(PCREPOSIX_EXP_DECL) -# define PCREPOSIX_EXP_DECL extern __declspec(dllimport) -# define PCREPOSIX_EXP_DEFN __declspec(dllimport) -#endif - -/* By default, we use the standard "extern" declarations. */ - -#ifndef PCREPOSIX_EXP_DECL -# ifdef __cplusplus -# define PCREPOSIX_EXP_DECL extern "C" -# define PCREPOSIX_EXP_DEFN extern "C" -# else -# define PCREPOSIX_EXP_DECL extern -# define PCREPOSIX_EXP_DEFN extern -# endif -#endif - -/* The functions */ - -PCREPOSIX_EXP_DECL int regcomp(regex_t *, const char *, int); -PCREPOSIX_EXP_DECL int regexec(const regex_t *, const char *, size_t, - regmatch_t *, int); -PCREPOSIX_EXP_DECL size_t regerror(int, const regex_t *, char *, size_t); -PCREPOSIX_EXP_DECL void regfree(regex_t *); - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /* End of pcreposix.h */ diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/lib/libpcre.a b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/lib/libpcre.a deleted file mode 100644 index 70e72eed62f809b9482038dd83228d66524d4561..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 228016 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 G5dRNu>{EaM diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/lib/libpcre.la b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/lib/libpcre.la deleted file mode 100755 index 66367366..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/lib/libpcre.la +++ /dev/null @@ -1,41 +0,0 @@ -# libpcre.la - a libtool library file -# Generated by libtool (GNU libtool) 2.4.6 -# -# Please DO NOT delete this file! -# It is necessary for linking the library. - -# The name that we can dlopen(3). -dlname='' - -# Names of this library. -library_names='' - -# The name of the static archive. -old_library='libpcre.a' - -# Linker flags that cannot go in dependency_libs. -inherited_linker_flags=' ' - -# Libraries that this one depends upon. -dependency_libs=' -L/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS15.2.sdk/usr/lib' - -# Names of additional weak libraries provided by this library -weak_library_names='' - -# Version information for libpcre. -current=3 -age=2 -revision=9 - -# Is this an already installed library? -installed=yes - -# Should we warn about portability when linking against -modules? -shouldnotlink=no - -# Files to dlopen/dlpreopen -dlopen='' -dlpreopen='' - -# Directory that this library needs to be installed in: -libdir='/Users/sanchez/work/vied/ios/vpn/playground/ss-libev-build/ShadowSocks-libev-iOS/ShadowSocks-libev-iOS/pcre/pcre/armv7/lib' diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/lib/libpcrecpp.a b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/lib/libpcrecpp.a deleted file mode 100644 index 1321792d3778c1f92636f994e69b7aae1f35ee11..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34272 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
      T}Qu!XkKb+%~(|-U^E(Z>+fTTwX$Lahnh3h!P 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 diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/lib/libpcreposix.la b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/lib/libpcreposix.la deleted file mode 100755 index c3cbdaef..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/lib/libpcreposix.la +++ /dev/null @@ -1,41 +0,0 @@ -# libpcreposix.la - a libtool library file -# Generated by libtool (GNU libtool) 2.4.6 -# -# Please DO NOT delete this file! -# It is necessary for linking the library. - -# The name that we can dlopen(3). -dlname='' - -# Names of this library. -library_names='' - -# The name of the static archive. -old_library='libpcreposix.a' - -# Linker flags that cannot go in dependency_libs. -inherited_linker_flags=' ' - -# Libraries that this one depends upon. -dependency_libs=' -L/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS15.2.sdk/usr/lib /Users/sanchez/work/vied/ios/vpn/playground/ss-libev-build/ShadowSocks-libev-iOS/ShadowSocks-libev-iOS/pcre/pcre/armv7/lib/libpcre.la' - -# Names of additional weak libraries provided by this library -weak_library_names='' - -# Version information for libpcreposix. -current=0 -age=0 -revision=5 - -# Is this an already installed library? -installed=yes - -# Should we warn about portability when linking against -modules? -shouldnotlink=no - -# Files to dlopen/dlpreopen -dlopen='' -dlpreopen='' - -# Directory that this library needs to be installed in: -libdir='/Users/sanchez/work/vied/ios/vpn/playground/ss-libev-build/ShadowSocks-libev-iOS/ShadowSocks-libev-iOS/pcre/pcre/armv7/lib' diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/lib/pkgconfig/libpcre.pc b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/lib/pkgconfig/libpcre.pc deleted file mode 100644 index 8949761e..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/lib/pkgconfig/libpcre.pc +++ /dev/null @@ -1,13 +0,0 @@ -# Package Information for pkg-config - -prefix=/Users/sanchez/work/vied/ios/vpn/playground/ss-libev-build/ShadowSocks-libev-iOS/ShadowSocks-libev-iOS/pcre/pcre/armv7 -exec_prefix=${prefix} -libdir=${exec_prefix}/lib -includedir=${prefix}/include - -Name: libpcre -Description: PCRE - Perl compatible regular expressions C library with 8 bit character support -Version: 8.41 -Libs: -L${libdir} -lpcre -Libs.private: -Cflags: -I${includedir} -DPCRE_STATIC diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/lib/pkgconfig/libpcrecpp.pc b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/lib/pkgconfig/libpcrecpp.pc deleted file mode 100644 index 3207e1aa..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/lib/pkgconfig/libpcrecpp.pc +++ /dev/null @@ -1,12 +0,0 @@ -# Package Information for pkg-config - -prefix=/Users/sanchez/work/vied/ios/vpn/playground/ss-libev-build/ShadowSocks-libev-iOS/ShadowSocks-libev-iOS/pcre/pcre/armv7 -exec_prefix=${prefix} -libdir=${exec_prefix}/lib -includedir=${prefix}/include - -Name: libpcrecpp -Description: PCRECPP - C++ wrapper for PCRE -Version: 8.41 -Libs: -L${libdir} -lpcre -lpcrecpp -Cflags: -I${includedir} -DPCRE_STATIC diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/lib/pkgconfig/libpcreposix.pc b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/lib/pkgconfig/libpcreposix.pc deleted file mode 100644 index 983ee1f0..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/lib/pkgconfig/libpcreposix.pc +++ /dev/null @@ -1,13 +0,0 @@ -# Package Information for pkg-config - -prefix=/Users/sanchez/work/vied/ios/vpn/playground/ss-libev-build/ShadowSocks-libev-iOS/ShadowSocks-libev-iOS/pcre/pcre/armv7 -exec_prefix=${prefix} -libdir=${exec_prefix}/lib -includedir=${prefix}/include - -Name: libpcreposix -Description: PCREPosix - Posix compatible interface to libpcre -Version: 8.41 -Libs: -L${libdir} -lpcreposix -Cflags: -I${includedir} -DPCRE_STATIC -Requires.private: libpcre diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/AUTHORS b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/AUTHORS deleted file mode 100644 index 291657ca..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/AUTHORS +++ /dev/null @@ -1,45 +0,0 @@ -THE MAIN PCRE LIBRARY ---------------------- - -Written by: Philip Hazel -Email local part: ph10 -Email domain: cam.ac.uk - -University of Cambridge Computing Service, -Cambridge, England. - -Copyright (c) 1997-2017 University of Cambridge -All rights reserved - - -PCRE JUST-IN-TIME COMPILATION SUPPORT -------------------------------------- - -Written by: Zoltan Herczeg -Email local part: hzmester -Emain domain: freemail.hu - -Copyright(c) 2010-2017 Zoltan Herczeg -All rights reserved. - - -STACK-LESS JUST-IN-TIME COMPILER --------------------------------- - -Written by: Zoltan Herczeg -Email local part: hzmester -Emain domain: freemail.hu - -Copyright(c) 2009-2017 Zoltan Herczeg -All rights reserved. - - -THE C++ WRAPPER LIBRARY ------------------------ - -Written by: Google Inc. - -Copyright (c) 2007-2012 Google Inc -All rights reserved - -#### diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/COPYING b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/COPYING deleted file mode 100644 index 58eed01b..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/COPYING +++ /dev/null @@ -1,5 +0,0 @@ -PCRE LICENCE - -Please see the file LICENCE in the PCRE distribution for licensing details. - -End diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/ChangeLog b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/ChangeLog deleted file mode 100644 index 590a7542..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/ChangeLog +++ /dev/null @@ -1,6104 +0,0 @@ -ChangeLog for PCRE ------------------- - -Note that the PCRE 8.xx series (PCRE1) is now in a bugfix-only state. All -development is happening in the PCRE2 10.xx series. - -Version 8.41 05-July-2017 -------------------------- - -1. Fixed typo in CMakeLists.txt (wrong number of arguments for -PCRE_STATIC_RUNTIME (affects MSVC only). - -2. Issue 1 for 8.40 below was not correctly fixed. If pcregrep in multiline -mode with --only-matching matched several lines, it restarted scanning at the -next line instead of moving on to the end of the matched string, which can be -several lines after the start. - -3. Fix a missing else in the JIT compiler reported by 'idaifish'. - -4. A (?# style comment is now ignored between a basic quantifier and a -following '+' or '?' (example: /X+(?#comment)?Y/. - -5. Avoid use of a potentially overflowing buffer in pcregrep (patch by Petr -Pisar). - -6. Fuzzers have reported issues in pcretest. These are NOT serious (it is, -after all, just a test program). However, to stop the reports, some easy ones -are fixed: - - (a) Check for values < 256 when calling isprint() in pcretest. - (b) Give an error for too big a number after \O. - -7. In the 32-bit library in non-UTF mode, an attempt to find a Unicode -property for a character with a code point greater than 0x10ffff (the Unicode -maximum) caused a crash. - -8. The alternative matching function, pcre_dfa_exec() misbehaved if it -encountered a character class with a possessive repeat, for example [a-f]{3}+. - -9. When pcretest called pcre_copy_substring() in 32-bit mode, it set the buffer -length incorrectly, which could result in buffer overflow. - -10. Remove redundant line of code (accidentally left in ages ago). - -11. Applied C++ patch from Irfan Adilovic to guard 'using std::' directives -with namespace pcrecpp (Bugzilla #2084). - -12. Remove a duplication typo in pcre_tables.c. - -13. Fix returned offsets from regexec() when REG_STARTEND is used with a -starting offset greater than zero. - - -Version 8.40 11-January-2017 ----------------------------- - -1. Using -o with -M in pcregrep could cause unnecessary repeated output when - the match extended over a line boundary. - -2. Applied Chris Wilson's second patch (Bugzilla #1681) to CMakeLists.txt for - MSVC static compilation, putting the first patch under a new option. - -3. Fix register overwite in JIT when SSE2 acceleration is enabled. - -4. Ignore "show all captures" (/=) for DFA matching. - -5. Fix JIT unaligned accesses on x86. Patch by Marc Mutz. - -6. In any wide-character mode (8-bit UTF or any 16-bit or 32-bit mode), - without PCRE_UCP set, a negative character type such as \D in a positive - class should cause all characters greater than 255 to match, whatever else - is in the class. There was a bug that caused this not to happen if a - Unicode property item was added to such a class, for example [\D\P{Nd}] or - [\W\pL]. - -7. When pcretest was outputing information from a callout, the caret indicator - for the current position in the subject line was incorrect if it was after - an escape sequence for a character whose code point was greater than - \x{ff}. - -8. A pattern such as (?abc)(?(R)xyz) was incorrectly compiled such that - the conditional was interpreted as a reference to capturing group 1 instead - of a test for recursion. Any group whose name began with R was - misinterpreted in this way. (The reference interpretation should only - happen if the group's name is precisely "R".) - -9. A number of bugs have been mended relating to match start-up optimizations - when the first thing in a pattern is a positive lookahead. These all - applied only when PCRE_NO_START_OPTIMIZE was *not* set: - - (a) A pattern such as (?=.*X)X$ was incorrectly optimized as if it needed - both an initial 'X' and a following 'X'. - (b) Some patterns starting with an assertion that started with .* were - incorrectly optimized as having to match at the start of the subject or - after a newline. There are cases where this is not true, for example, - (?=.*[A-Z])(?=.{8,16})(?!.*[\s]) matches after the start in lines that - start with spaces. Starting .* in an assertion is no longer taken as an - indication of matching at the start (or after a newline). - - -Version 8.39 14-June-2016 -------------------------- - -1. If PCRE_AUTO_CALLOUT was set on a pattern that had a (?# comment between - an item and its qualifier (for example, A(?#comment)?B) pcre_compile() - misbehaved. This bug was found by the LLVM fuzzer. - -2. Similar to the above, if an isolated \E was present between an item and its - qualifier when PCRE_AUTO_CALLOUT was set, pcre_compile() misbehaved. This - bug was found by the LLVM fuzzer. - -3. Further to 8.38/46, negated classes such as [^[:^ascii:]\d] were also not - working correctly in UCP mode. - -4. The POSIX wrapper function regexec() crashed if the option REG_STARTEND - was set when the pmatch argument was NULL. It now returns REG_INVARG. - -5. Allow for up to 32-bit numbers in the ordin() function in pcregrep. - -6. An empty \Q\E sequence between an item and its qualifier caused - pcre_compile() to misbehave when auto callouts were enabled. This bug was - found by the LLVM fuzzer. - -7. If a pattern that was compiled with PCRE_EXTENDED started with white - space or a #-type comment that was followed by (?-x), which turns off - PCRE_EXTENDED, and there was no subsequent (?x) to turn it on again, - pcre_compile() assumed that (?-x) applied to the whole pattern and - consequently mis-compiled it. This bug was found by the LLVM fuzzer. - -8. A call of pcre_copy_named_substring() for a named substring whose number - was greater than the space in the ovector could cause a crash. - -9. Yet another buffer overflow bug involved duplicate named groups with a - group that reset capture numbers (compare 8.38/7 below). Once again, I have - just allowed for more memory, even if not needed. (A proper fix is - implemented in PCRE2, but it involves a lot of refactoring.) - -10. pcre_get_substring_list() crashed if the use of \K in a match caused the - start of the match to be earlier than the end. - -11. Migrating appropriate PCRE2 JIT improvements to PCRE. - -12. A pattern such as /(?<=((?C)0))/, which has a callout inside a lookbehind - assertion, caused pcretest to generate incorrect output, and also to read - uninitialized memory (detected by ASAN or valgrind). - -13. A pattern that included (*ACCEPT) in the middle of a sufficiently deeply - nested set of parentheses of sufficient size caused an overflow of the - compiling workspace (which was diagnosed, but of course is not desirable). - -14. And yet another buffer overflow bug involving duplicate named groups, this - time nested, with a nested back reference. Yet again, I have just allowed - for more memory, because anything more needs all the refactoring that has - been done for PCRE2. An example pattern that provoked this bug is: - /((?J)(?'R'(?'R'(?'R'(?'R'(?'R'(?|(\k'R'))))))))/ and the bug was - registered as CVE-2016-1283. - -15. pcretest went into a loop if global matching was requested with an ovector - size less than 2. It now gives an error message. This bug was found by - afl-fuzz. - -16. An invalid pattern fragment such as (?(?C)0 was not diagnosing an error - ("assertion expected") when (?(?C) was not followed by an opening - parenthesis. - -17. Fixed typo ("&&" for "&") in pcre_study(). Fortunately, this could not - actually affect anything, by sheer luck. - -18. Applied Chris Wilson's patch (Bugzilla #1681) to CMakeLists.txt for MSVC - static compilation. - -19. Modified the RunTest script to incorporate a valgrind suppressions file so - that certain errors, provoked by the SSE2 instruction set when JIT is used, - are ignored. - -20. A racing condition is fixed in JIT reported by Mozilla. - -21. Minor code refactor to avoid "array subscript is below array bounds" - compiler warning. - -22. Minor code refactor to avoid "left shift of negative number" warning. - -23. Fix typo causing compile error when 16- or 32-bit JIT is compiled without - UCP support. - -24. Refactor to avoid compiler warnings in pcrecpp.cc. - -25. Refactor to fix a typo in pcre_jit_test.c - -26. Patch to support compiling pcrecpp.cc with Intel compiler. - - -Version 8.38 23-November-2015 ------------------------------ - -1. If a group that contained a recursive back reference also contained a - forward reference subroutine call followed by a non-forward-reference - subroutine call, for example /.((?2)(?R)\1)()/, pcre_compile() failed to - compile correct code, leading to undefined behaviour or an internally - detected error. This bug was discovered by the LLVM fuzzer. - -2. Quantification of certain items (e.g. atomic back references) could cause - incorrect code to be compiled when recursive forward references were - involved. For example, in this pattern: /(?1)()((((((\1++))\x85)+)|))/. - This bug was discovered by the LLVM fuzzer. - -3. A repeated conditional group whose condition was a reference by name caused - a buffer overflow if there was more than one group with the given name. - This bug was discovered by the LLVM fuzzer. - -4. A recursive back reference by name within a group that had the same name as - another group caused a buffer overflow. For example: - /(?J)(?'d'(?'d'\g{d}))/. This bug was discovered by the LLVM fuzzer. - -5. A forward reference by name to a group whose number is the same as the - current group, for example in this pattern: /(?|(\k'Pm')|(?'Pm'))/, caused - a buffer overflow at compile time. This bug was discovered by the LLVM - fuzzer. - -6. A lookbehind assertion within a set of mutually recursive subpatterns could - provoke a buffer overflow. This bug was discovered by the LLVM fuzzer. - -7. Another buffer overflow bug involved duplicate named groups with a - reference between their definition, with a group that reset capture - numbers, for example: /(?J:(?|(?'R')(\k'R')|((?'R'))))/. This has been - fixed by always allowing for more memory, even if not needed. (A proper fix - is implemented in PCRE2, but it involves more refactoring.) - -8. There was no check for integer overflow in subroutine calls such as (?123). - -9. The table entry for \l in EBCDIC environments was incorrect, leading to its - being treated as a literal 'l' instead of causing an error. - -10. There was a buffer overflow if pcre_exec() was called with an ovector of - size 1. This bug was found by american fuzzy lop. - -11. If a non-capturing group containing a conditional group that could match - an empty string was repeated, it was not identified as matching an empty - string itself. For example: /^(?:(?(1)x|)+)+$()/. - -12. In an EBCDIC environment, pcretest was mishandling the escape sequences - \a and \e in test subject lines. - -13. In an EBCDIC environment, \a in a pattern was converted to the ASCII - instead of the EBCDIC value. - -14. The handling of \c in an EBCDIC environment has been revised so that it is - now compatible with the specification in Perl's perlebcdic page. - -15. The EBCDIC character 0x41 is a non-breaking space, equivalent to 0xa0 in - ASCII/Unicode. This has now been added to the list of characters that are - recognized as white space in EBCDIC. - -16. When PCRE was compiled without UCP support, the use of \p and \P gave an - error (correctly) when used outside a class, but did not give an error - within a class. - -17. \h within a class was incorrectly compiled in EBCDIC environments. - -18. A pattern with an unmatched closing parenthesis that contained a backward - assertion which itself contained a forward reference caused buffer - overflow. And example pattern is: /(?=di(?<=(?1))|(?=(.))))/. - -19. JIT should return with error when the compiled pattern requires more stack - space than the maximum. - -20. A possessively repeated conditional group that could match an empty string, - for example, /(?(R))*+/, was incorrectly compiled. - -21. Fix infinite recursion in the JIT compiler when certain patterns such as - /(?:|a|){100}x/ are analysed. - -22. Some patterns with character classes involving [: and \\ were incorrectly - compiled and could cause reading from uninitialized memory or an incorrect - error diagnosis. - -23. Pathological patterns containing many nested occurrences of [: caused - pcre_compile() to run for a very long time. - -24. A conditional group with only one branch has an implicit empty alternative - branch and must therefore be treated as potentially matching an empty - string. - -25. If (?R was followed by - or + incorrect behaviour happened instead of a - diagnostic. - -26. Arrange to give up on finding the minimum matching length for overly - complex patterns. - -27. Similar to (4) above: in a pattern with duplicated named groups and an - occurrence of (?| it is possible for an apparently non-recursive back - reference to become recursive if a later named group with the relevant - number is encountered. This could lead to a buffer overflow. Wen Guanxing - from Venustech ADLAB discovered this bug. - -28. If pcregrep was given the -q option with -c or -l, or when handling a - binary file, it incorrectly wrote output to stdout. - -29. The JIT compiler did not restore the control verb head in case of *THEN - control verbs. This issue was found by Karl Skomski with a custom LLVM - fuzzer. - -30. Error messages for syntax errors following \g and \k were giving inaccurate - offsets in the pattern. - -31. Added a check for integer overflow in conditions (?() and - (?(R). This omission was discovered by Karl Skomski with the LLVM - fuzzer. - -32. Handling recursive references such as (?2) when the reference is to a group - later in the pattern uses code that is very hacked about and error-prone. - It has been re-written for PCRE2. Here in PCRE1, a check has been added to - give an internal error if it is obvious that compiling has gone wrong. - -33. The JIT compiler should not check repeats after a {0,1} repeat byte code. - This issue was found by Karl Skomski with a custom LLVM fuzzer. - -34. The JIT compiler should restore the control chain for empty possessive - repeats. This issue was found by Karl Skomski with a custom LLVM fuzzer. - -35. Match limit check added to JIT recursion. This issue was found by Karl - Skomski with a custom LLVM fuzzer. - -36. Yet another case similar to 27 above has been circumvented by an - unconditional allocation of extra memory. This issue is fixed "properly" in - PCRE2 by refactoring the way references are handled. Wen Guanxing - from Venustech ADLAB discovered this bug. - -37. Fix two assertion fails in JIT. These issues were found by Karl Skomski - with a custom LLVM fuzzer. - -38. Fixed a corner case of range optimization in JIT. - -39. An incorrect error "overran compiling workspace" was given if there were - exactly enough group forward references such that the last one extended - into the workspace safety margin. The next one would have expanded the - workspace. The test for overflow was not including the safety margin. - -40. A match limit issue is fixed in JIT which was found by Karl Skomski - with a custom LLVM fuzzer. - -41. Remove the use of /dev/null in testdata/testinput2, because it doesn't - work under Windows. (Why has it taken so long for anyone to notice?) - -42. In a character class such as [\W\p{Any}] where both a negative-type escape - ("not a word character") and a property escape were present, the property - escape was being ignored. - -43. Fix crash caused by very long (*MARK) or (*THEN) names. - -44. A sequence such as [[:punct:]b] that is, a POSIX character class followed - by a single ASCII character in a class item, was incorrectly compiled in - UCP mode. The POSIX class got lost, but only if the single character - followed it. - -45. [:punct:] in UCP mode was matching some characters in the range 128-255 - that should not have been matched. - -46. If [:^ascii:] or [:^xdigit:] or [:^cntrl:] are present in a non-negated - class, all characters with code points greater than 255 are in the class. - When a Unicode property was also in the class (if PCRE_UCP is set, escapes - such as \w are turned into Unicode properties), wide characters were not - correctly handled, and could fail to match. - - -Version 8.37 28-April-2015 --------------------------- - -1. When an (*ACCEPT) is triggered inside capturing parentheses, it arranges - for those parentheses to be closed with whatever has been captured so far. - However, it was failing to mark any other groups between the hightest - capture so far and the currrent group as "unset". Thus, the ovector for - those groups contained whatever was previously there. An example is the - pattern /(x)|((*ACCEPT))/ when matched against "abcd". - -2. If an assertion condition was quantified with a minimum of zero (an odd - thing to do, but it happened), SIGSEGV or other misbehaviour could occur. - -3. If a pattern in pcretest input had the P (POSIX) modifier followed by an - unrecognized modifier, a crash could occur. - -4. An attempt to do global matching in pcretest with a zero-length ovector - caused a crash. - -5. Fixed a memory leak during matching that could occur for a subpattern - subroutine call (recursive or otherwise) if the number of captured groups - that had to be saved was greater than ten. - -6. Catch a bad opcode during auto-possessification after compiling a bad UTF - string with NO_UTF_CHECK. This is a tidyup, not a bug fix, as passing bad - UTF with NO_UTF_CHECK is documented as having an undefined outcome. - -7. A UTF pattern containing a "not" match of a non-ASCII character and a - subroutine reference could loop at compile time. Example: /[^\xff]((?1))/. - -8. When a pattern is compiled, it remembers the highest back reference so that - when matching, if the ovector is too small, extra memory can be obtained to - use instead. A conditional subpattern whose condition is a check on a - capture having happened, such as, for example in the pattern - /^(?:(a)|b)(?(1)A|B)/, is another kind of back reference, but it was not - setting the highest backreference number. This mattered only if pcre_exec() - was called with an ovector that was too small to hold the capture, and there - was no other kind of back reference (a situation which is probably quite - rare). The effect of the bug was that the condition was always treated as - FALSE when the capture could not be consulted, leading to a incorrect - behaviour by pcre_exec(). This bug has been fixed. - -9. A reference to a duplicated named group (either a back reference or a test - for being set in a conditional) that occurred in a part of the pattern where - PCRE_DUPNAMES was not set caused the amount of memory needed for the pattern - to be incorrectly calculated, leading to overwriting. - -10. A mutually recursive set of back references such as (\2)(\1) caused a - segfault at study time (while trying to find the minimum matching length). - The infinite loop is now broken (with the minimum length unset, that is, - zero). - -11. If an assertion that was used as a condition was quantified with a minimum - of zero, matching went wrong. In particular, if the whole group had - unlimited repetition and could match an empty string, a segfault was - likely. The pattern (?(?=0)?)+ is an example that caused this. Perl allows - assertions to be quantified, but not if they are being used as conditions, - so the above pattern is faulted by Perl. PCRE has now been changed so that - it also rejects such patterns. - -12. A possessive capturing group such as (a)*+ with a minimum repeat of zero - failed to allow the zero-repeat case if pcre2_exec() was called with an - ovector too small to capture the group. - -13. Fixed two bugs in pcretest that were discovered by fuzzing and reported by - Red Hat Product Security: - - (a) A crash if /K and /F were both set with the option to save the compiled - pattern. - - (b) Another crash if the option to print captured substrings in a callout - was combined with setting a null ovector, for example \O\C+ as a subject - string. - -14. A pattern such as "((?2){0,1999}())?", which has a group containing a - forward reference repeated a large (but limited) number of times within a - repeated outer group that has a zero minimum quantifier, caused incorrect - code to be compiled, leading to the error "internal error: - previously-checked referenced subpattern not found" when an incorrect - memory address was read. This bug was reported as "heap overflow", - discovered by Kai Lu of Fortinet's FortiGuard Labs and given the CVE number - CVE-2015-2325. - -23. A pattern such as "((?+1)(\1))/" containing a forward reference subroutine - call within a group that also contained a recursive back reference caused - incorrect code to be compiled. This bug was reported as "heap overflow", - discovered by Kai Lu of Fortinet's FortiGuard Labs, and given the CVE - number CVE-2015-2326. - -24. Computing the size of the JIT read-only data in advance has been a source - of various issues, and new ones are still appear unfortunately. To fix - existing and future issues, size computation is eliminated from the code, - and replaced by on-demand memory allocation. - -25. A pattern such as /(?i)[A-`]/, where characters in the other case are - adjacent to the end of the range, and the range contained characters with - more than one other case, caused incorrect behaviour when compiled in UTF - mode. In that example, the range a-j was left out of the class. - -26. Fix JIT compilation of conditional blocks, which assertion - is converted to (*FAIL). E.g: /(?(?!))/. - -27. The pattern /(?(?!)^)/ caused references to random memory. This bug was - discovered by the LLVM fuzzer. - -28. The assertion (?!) is optimized to (*FAIL). This was not handled correctly - when this assertion was used as a condition, for example (?(?!)a|b). In - pcre2_match() it worked by luck; in pcre2_dfa_match() it gave an incorrect - error about an unsupported item. - -29. For some types of pattern, for example /Z*(|d*){216}/, the auto- - possessification code could take exponential time to complete. A recursion - depth limit of 1000 has been imposed to limit the resources used by this - optimization. - -30. A pattern such as /(*UTF)[\S\V\H]/, which contains a negated special class - such as \S in non-UCP mode, explicit wide characters (> 255) can be ignored - because \S ensures they are all in the class. The code for doing this was - interacting badly with the code for computing the amount of space needed to - compile the pattern, leading to a buffer overflow. This bug was discovered - by the LLVM fuzzer. - -31. A pattern such as /((?2)+)((?1))/ which has mutual recursion nested inside - other kinds of group caused stack overflow at compile time. This bug was - discovered by the LLVM fuzzer. - -32. A pattern such as /(?1)(?#?'){8}(a)/ which had a parenthesized comment - between a subroutine call and its quantifier was incorrectly compiled, - leading to buffer overflow or other errors. This bug was discovered by the - LLVM fuzzer. - -33. The illegal pattern /(?(?.*!.*)?)/ was not being diagnosed as missing an - assertion after (?(. The code was failing to check the character after - (?(?< for the ! or = that would indicate a lookbehind assertion. This bug - was discovered by the LLVM fuzzer. - -34. A pattern such as /X((?2)()*+){2}+/ which has a possessive quantifier with - a fixed maximum following a group that contains a subroutine reference was - incorrectly compiled and could trigger buffer overflow. This bug was - discovered by the LLVM fuzzer. - -35. A mutual recursion within a lookbehind assertion such as (?<=((?2))((?1))) - caused a stack overflow instead of the diagnosis of a non-fixed length - lookbehind assertion. This bug was discovered by the LLVM fuzzer. - -36. The use of \K in a positive lookbehind assertion in a non-anchored pattern - (e.g. /(?<=\Ka)/) could make pcregrep loop. - -37. There was a similar problem to 36 in pcretest for global matches. - -38. If a greedy quantified \X was preceded by \C in UTF mode (e.g. \C\X*), - and a subsequent item in the pattern caused a non-match, backtracking over - the repeated \X did not stop, but carried on past the start of the subject, - causing reference to random memory and/or a segfault. There were also some - other cases where backtracking after \C could crash. This set of bugs was - discovered by the LLVM fuzzer. - -39. The function for finding the minimum length of a matching string could take - a very long time if mutual recursion was present many times in a pattern, - for example, /((?2){73}(?2))((?1))/. A better mutual recursion detection - method has been implemented. This infelicity was discovered by the LLVM - fuzzer. - -40. Static linking against the PCRE library using the pkg-config module was - failing on missing pthread symbols. - - -Version 8.36 26-September-2014 ------------------------------- - -1. Got rid of some compiler warnings in the C++ modules that were shown up by - -Wmissing-field-initializers and -Wunused-parameter. - -2. The tests for quantifiers being too big (greater than 65535) were being - applied after reading the number, and stupidly assuming that integer - overflow would give a negative number. The tests are now applied as the - numbers are read. - -3. Tidy code in pcre_exec.c where two branches that used to be different are - now the same. - -4. The JIT compiler did not generate match limit checks for certain - bracketed expressions with quantifiers. This may lead to exponential - backtracking, instead of returning with PCRE_ERROR_MATCHLIMIT. This - issue should be resolved now. - -5. Fixed an issue, which occures when nested alternatives are optimized - with table jumps. - -6. Inserted two casts and changed some ints to size_t in the light of some - reported 64-bit compiler warnings (Bugzilla 1477). - -7. Fixed a bug concerned with zero-minimum possessive groups that could match - an empty string, which sometimes were behaving incorrectly in the - interpreter (though correctly in the JIT matcher). This pcretest input is - an example: - - '\A(?:[^"]++|"(?:[^"]*+|"")*+")++' - NON QUOTED "QUOT""ED" AFTER "NOT MATCHED - - the interpreter was reporting a match of 'NON QUOTED ' only, whereas the - JIT matcher and Perl both matched 'NON QUOTED "QUOT""ED" AFTER '. The test - for an empty string was breaking the inner loop and carrying on at a lower - level, when possessive repeated groups should always return to a higher - level as they have no backtrack points in them. The empty string test now - occurs at the outer level. - -8. Fixed a bug that was incorrectly auto-possessifying \w+ in the pattern - ^\w+(?>\s*)(?<=\w) which caused it not to match "test test". - -9. Give a compile-time error for \o{} (as Perl does) and for \x{} (which Perl - doesn't). - -10. Change 8.34/15 introduced a bug that caused the amount of memory needed - to hold a pattern to be incorrectly computed (too small) when there were - named back references to duplicated names. This could cause "internal - error: code overflow" or "double free or corruption" or other memory - handling errors. - -11. When named subpatterns had the same prefixes, back references could be - confused. For example, in this pattern: - - /(?Pa)?(?Pb)?(?()c|d)*l/ - - the reference to 'Name' was incorrectly treated as a reference to a - duplicate name. - -12. A pattern such as /^s?c/mi8 where the optional character has more than - one "other case" was incorrectly compiled such that it would only try to - match starting at "c". - -13. When a pattern starting with \s was studied, VT was not included in the - list of possible starting characters; this should have been part of the - 8.34/18 patch. - -14. If a character class started [\Qx]... where x is any character, the class - was incorrectly terminated at the ]. - -15. If a pattern that started with a caseless match for a character with more - than one "other case" was studied, PCRE did not set up the starting code - unit bit map for the list of possible characters. Now it does. This is an - optimization improvement, not a bug fix. - -16. The Unicode data tables have been updated to Unicode 7.0.0. - -17. Fixed a number of memory leaks in pcregrep. - -18. Avoid a compiler warning (from some compilers) for a function call with - a cast that removes "const" from an lvalue by using an intermediate - variable (to which the compiler does not object). - -19. Incorrect code was compiled if a group that contained an internal recursive - back reference was optional (had quantifier with a minimum of zero). This - example compiled incorrect code: /(((a\2)|(a*)\g<-1>))*/ and other examples - caused segmentation faults because of stack overflows at compile time. - -20. A pattern such as /((?(R)a|(?1)))+/, which contains a recursion within a - group that is quantified with an indefinite repeat, caused a compile-time - loop which used up all the system stack and provoked a segmentation fault. - This was not the same bug as 19 above. - -21. Add PCRECPP_EXP_DECL declaration to operator<< in pcre_stringpiece.h. - Patch by Mike Frysinger. - - -Version 8.35 04-April-2014 --------------------------- - -1. A new flag is set, when property checks are present in an XCLASS. - When this flag is not set, PCRE can perform certain optimizations - such as studying these XCLASS-es. - -2. The auto-possessification of character sets were improved: a normal - and an extended character set can be compared now. Furthermore - the JIT compiler optimizes more character set checks. - -3. Got rid of some compiler warnings for potentially uninitialized variables - that show up only when compiled with -O2. - -4. A pattern such as (?=ab\K) that uses \K in an assertion can set the start - of a match later then the end of the match. The pcretest program was not - handling the case sensibly - it was outputting from the start to the next - binary zero. It now reports this situation in a message, and outputs the - text from the end to the start. - -5. Fast forward search is improved in JIT. Instead of the first three - characters, any three characters with fixed position can be searched. - Search order: first, last, middle. - -6. Improve character range checks in JIT. Characters are read by an inprecise - function now, which returns with an unknown value if the character code is - above a certain threshold (e.g: 256). The only limitation is that the value - must be bigger than the threshold as well. This function is useful when - the characters above the threshold are handled in the same way. - -7. The macros whose names start with RAWUCHAR are placeholders for a future - mode in which only the bottom 21 bits of 32-bit data items are used. To - make this more memorable for those maintaining the code, the names have - been changed to start with UCHAR21, and an extensive comment has been added - to their definition. - -8. Add missing (new) files sljitNativeTILEGX.c and sljitNativeTILEGX-encoder.c - to the export list in Makefile.am (they were accidentally omitted from the - 8.34 tarball). - -9. The informational output from pcretest used the phrase "starting byte set" - which is inappropriate for the 16-bit and 32-bit libraries. As the output - for "first char" and "need char" really means "non-UTF-char", I've changed - "byte" to "char", and slightly reworded the output. The documentation about - these values has also been (I hope) clarified. - -10. Another JIT related optimization: use table jumps for selecting the correct - backtracking path, when more than four alternatives are present inside a - bracket. - -11. Empty match is not possible, when the minimum length is greater than zero, - and there is no \K in the pattern. JIT should avoid empty match checks in - such cases. - -12. In a caseless character class with UCP support, when a character with more - than one alternative case was not the first character of a range, not all - the alternative cases were added to the class. For example, s and \x{17f} - are both alternative cases for S: the class [RST] was handled correctly, - but [R-T] was not. - -13. The configure.ac file always checked for pthread support when JIT was - enabled. This is not used in Windows, so I have put this test inside a - check for the presence of windows.h (which was already tested for). - -14. Improve pattern prefix search by a simplified Boyer-Moore algorithm in JIT. - The algorithm provides a way to skip certain starting offsets, and usually - faster than linear prefix searches. - -15. Change 13 for 8.20 updated RunTest to check for the 'fr' locale as well - as for 'fr_FR' and 'french'. For some reason, however, it then used the - Windows-specific input and output files, which have 'french' screwed in. - So this could never have worked. One of the problems with locales is that - they aren't always the same. I have now updated RunTest so that it checks - the output of the locale test (test 3) against three different output - files, and it allows the test to pass if any one of them matches. With luck - this should make the test pass on some versions of Solaris where it was - failing. Because of the uncertainty, the script did not used to stop if - test 3 failed; it now does. If further versions of a French locale ever - come to light, they can now easily be added. - -16. If --with-pcregrep-bufsize was given a non-integer value such as "50K", - there was a message during ./configure, but it did not stop. This now - provokes an error. The invalid example in README has been corrected. - If a value less than the minimum is given, the minimum value has always - been used, but now a warning is given. - -17. If --enable-bsr-anycrlf was set, the special 16/32-bit test failed. This - was a bug in the test system, which is now fixed. Also, the list of various - configurations that are tested for each release did not have one with both - 16/32 bits and --enable-bar-anycrlf. It now does. - -18. pcretest was missing "-C bsr" for displaying the \R default setting. - -19. Little endian PowerPC systems are supported now by the JIT compiler. - -20. The fast forward newline mechanism could enter to an infinite loop on - certain invalid UTF-8 input. Although we don't support these cases - this issue can be fixed by a performance optimization. - -21. Change 33 of 8.34 is not sufficient to ensure stack safety because it does - not take account if existing stack usage. There is now a new global - variable called pcre_stack_guard that can be set to point to an external - function to check stack availability. It is called at the start of - processing every parenthesized group. - -22. A typo in the code meant that in ungreedy mode the max/min qualifier - behaved like a min-possessive qualifier, and, for example, /a{1,3}b/U did - not match "ab". - -23. When UTF was disabled, the JIT program reported some incorrect compile - errors. These messages are silenced now. - -24. Experimental support for ARM-64 and MIPS-64 has been added to the JIT - compiler. - -25. Change all the temporary files used in RunGrepTest to be different to those - used by RunTest so that the tests can be run simultaneously, for example by - "make -j check". - - -Version 8.34 15-December-2013 ------------------------------ - -1. Add pcre[16|32]_jit_free_unused_memory to forcibly free unused JIT - executable memory. Patch inspired by Carsten Klein. - -2. ./configure --enable-coverage defined SUPPORT_GCOV in config.h, although - this macro is never tested and has no effect, because the work to support - coverage involves only compiling and linking options and special targets in - the Makefile. The comment in config.h implied that defining the macro would - enable coverage support, which is totally false. There was also support for - setting this macro in the CMake files (my fault, I just copied it from - configure). SUPPORT_GCOV has now been removed. - -3. Make a small performance improvement in strlen16() and strlen32() in - pcretest. - -4. Change 36 for 8.33 left some unreachable statements in pcre_exec.c, - detected by the Solaris compiler (gcc doesn't seem to be able to diagnose - these cases). There was also one in pcretest.c. - -5. Cleaned up a "may be uninitialized" compiler warning in pcre_exec.c. - -6. In UTF mode, the code for checking whether a group could match an empty - string (which is used for indefinitely repeated groups to allow for - breaking an infinite loop) was broken when the group contained a repeated - negated single-character class with a character that occupied more than one - data item and had a minimum repetition of zero (for example, [^\x{100}]* in - UTF-8 mode). The effect was undefined: the group might or might not be - deemed as matching an empty string, or the program might have crashed. - -7. The code for checking whether a group could match an empty string was not - recognizing that \h, \H, \v, \V, and \R must match a character. - -8. Implemented PCRE_INFO_MATCH_EMPTY, which yields 1 if the pattern can match - an empty string. If it can, pcretest shows this in its information output. - -9. Fixed two related bugs that applied to Unicode extended grapheme clusters - that were repeated with a maximizing qualifier (e.g. \X* or \X{2,5}) when - matched by pcre_exec() without using JIT: - - (a) If the rest of the pattern did not match after a maximal run of - grapheme clusters, the code for backing up to try with fewer of them - did not always back up over a full grapheme when characters that do not - have the modifier quality were involved, e.g. Hangul syllables. - - (b) If the match point in a subject started with modifier character, and - there was no match, the code could incorrectly back up beyond the match - point, and potentially beyond the first character in the subject, - leading to a segfault or an incorrect match result. - -10. A conditional group with an assertion condition could lead to PCRE - recording an incorrect first data item for a match if no other first data - item was recorded. For example, the pattern (?(?=ab)ab) recorded "a" as a - first data item, and therefore matched "ca" after "c" instead of at the - start. - -11. Change 40 for 8.33 (allowing pcregrep to find empty strings) showed up a - bug that caused the command "echo a | ./pcregrep -M '|a'" to loop. - -12. The source of pcregrep now includes z/OS-specific code so that it can be - compiled for z/OS as part of the special z/OS distribution. - -13. Added the -T and -TM options to pcretest. - -14. The code in pcre_compile.c for creating the table of named capturing groups - has been refactored. Instead of creating the table dynamically during the - actual compiling pass, the information is remembered during the pre-compile - pass (on the stack unless there are more than 20 named groups, in which - case malloc() is used) and the whole table is created before the actual - compile happens. This has simplified the code (it is now nearly 150 lines - shorter) and prepared the way for better handling of references to groups - with duplicate names. - -15. A back reference to a named subpattern when there is more than one of the - same name now checks them in the order in which they appear in the pattern. - The first one that is set is used for the reference. Previously only the - first one was inspected. This change makes PCRE more compatible with Perl. - -16. Unicode character properties were updated from Unicode 6.3.0. - -17. The compile-time code for auto-possessification has been refactored, based - on a patch by Zoltan Herczeg. It now happens after instead of during - compilation. The code is cleaner, and more cases are handled. The option - PCRE_NO_AUTO_POSSESS is added for testing purposes, and the -O and /O - options in pcretest are provided to set it. It can also be set by - (*NO_AUTO_POSSESS) at the start of a pattern. - -18. The character VT has been added to the default ("C" locale) set of - characters that match \s and are generally treated as white space, - following this same change in Perl 5.18. There is now no difference between - "Perl space" and "POSIX space". Whether VT is treated as white space in - other locales depends on the locale. - -19. The code for checking named groups as conditions, either for being set or - for being recursed, has been refactored (this is related to 14 and 15 - above). Processing unduplicated named groups should now be as fast at - numerical groups, and processing duplicated groups should be faster than - before. - -20. Two patches to the CMake build system, by Alexander Barkov: - - (1) Replace the "source" command by "." in CMakeLists.txt because - "source" is a bash-ism. - - (2) Add missing HAVE_STDINT_H and HAVE_INTTYPES_H to config-cmake.h.in; - without these the CMake build does not work on Solaris. - -21. Perl has changed its handling of \8 and \9. If there is no previously - encountered capturing group of those numbers, they are treated as the - literal characters 8 and 9 instead of a binary zero followed by the - literals. PCRE now does the same. - -22. Following Perl, added \o{} to specify codepoints in octal, making it - possible to specify values greater than 0777 and also making them - unambiguous. - -23. Perl now gives an error for missing closing braces after \x{... instead of - treating the string as literal. PCRE now does the same. - -24. RunTest used to grumble if an inappropriate test was selected explicitly, - but just skip it when running all tests. This make it awkward to run ranges - of tests when one of them was inappropriate. Now it just skips any - inappropriate tests, as it always did when running all tests. - -25. If PCRE_AUTO_CALLOUT and PCRE_UCP were set for a pattern that contained - character types such as \d or \w, too many callouts were inserted, and the - data that they returned was rubbish. - -26. In UCP mode, \s was not matching two of the characters that Perl matches, - namely NEL (U+0085) and MONGOLIAN VOWEL SEPARATOR (U+180E), though they - were matched by \h. The code has now been refactored so that the lists of - the horizontal and vertical whitespace characters used for \h and \v (which - are defined only in one place) are now also used for \s. - -27. Add JIT support for the 64 bit TileGX architecture. - Patch by Jiong Wang (Tilera Corporation). - -28. Possessive quantifiers for classes (both explicit and automatically - generated) now use special opcodes instead of wrapping in ONCE brackets. - -29. Whereas an item such as A{4}+ ignored the possessivenes of the quantifier - (because it's meaningless), this was not happening when PCRE_CASELESS was - set. Not wrong, but inefficient. - -30. Updated perltest.pl to add /u (force Unicode mode) when /W (use Unicode - properties for \w, \d, etc) is present in a test regex. Otherwise if the - test contains no characters greater than 255, Perl doesn't realise it - should be using Unicode semantics. - -31. Upgraded the handling of the POSIX classes [:graph:], [:print:], and - [:punct:] when PCRE_UCP is set so as to include the same characters as Perl - does in Unicode mode. - -32. Added the "forbid" facility to pcretest so that putting tests into the - wrong test files can sometimes be quickly detected. - -33. There is now a limit (default 250) on the depth of nesting of parentheses. - This limit is imposed to control the amount of system stack used at compile - time. It can be changed at build time by --with-parens-nest-limit=xxx or - the equivalent in CMake. - -34. Character classes such as [A-\d] or [a-[:digit:]] now cause compile-time - errors. Perl warns for these when in warning mode, but PCRE has no facility - for giving warnings. - -35. Change 34 for 8.13 allowed quantifiers on assertions, because Perl does. - However, this was not working for (?!) because it is optimized to (*FAIL), - for which PCRE does not allow quantifiers. The optimization is now disabled - when a quantifier follows (?!). I can't see any use for this, but it makes - things uniform. - -36. Perl no longer allows group names to start with digits, so I have made this - change also in PCRE. It simplifies the code a bit. - -37. In extended mode, Perl ignores spaces before a + that indicates a - possessive quantifier. PCRE allowed a space before the quantifier, but not - before the possessive +. It now does. - -38. The use of \K (reset reported match start) within a repeated possessive - group such as (a\Kb)*+ was not working. - -40. Document that the same character tables must be used at compile time and - run time, and that the facility to pass tables to pcre_exec() and - pcre_dfa_exec() is for use only with saved/restored patterns. - -41. Applied Jeff Trawick's patch CMakeLists.txt, which "provides two new - features for Builds with MSVC: - - 1. Support pcre.rc and/or pcreposix.rc (as is already done for MinGW - builds). The .rc files can be used to set FileDescription and many other - attributes. - - 2. Add an option (-DINSTALL_MSVC_PDB) to enable installation of .pdb files. - This allows higher-level build scripts which want .pdb files to avoid - hard-coding the exact files needed." - -42. Added support for [[:<:]] and [[:>:]] as used in the BSD POSIX library to - mean "start of word" and "end of word", respectively, as a transition aid. - -43. A minimizing repeat of a class containing codepoints greater than 255 in - non-UTF 16-bit or 32-bit modes caused an internal error when PCRE was - compiled to use the heap for recursion. - -44. Got rid of some compiler warnings for unused variables when UTF but not UCP - is configured. - - -Version 8.33 28-May-2013 ------------------------- - -1. Added 'U' to some constants that are compared to unsigned integers, to - avoid compiler signed/unsigned warnings. Added (int) casts to unsigned - variables that are added to signed variables, to ensure the result is - signed and can be negated. - -2. Applied patch by Daniel Richard G for quashing MSVC warnings to the - CMake config files. - -3. Revise the creation of config.h.generic so that all boolean macros are - #undefined, whereas non-boolean macros are #ifndef/#endif-ed. This makes - overriding via -D on the command line possible. - -4. Changing the definition of the variable "op" in pcre_exec.c from pcre_uchar - to unsigned int is reported to make a quite noticeable speed difference in - a specific Windows environment. Testing on Linux did also appear to show - some benefit (and it is clearly not harmful). Also fixed the definition of - Xop which should be unsigned. - -5. Related to (4), changing the definition of the intermediate variable cc - in repeated character loops from pcre_uchar to pcre_uint32 also gave speed - improvements. - -6. Fix forward search in JIT when link size is 3 or greater. Also removed some - unnecessary spaces. - -7. Adjust autogen.sh and configure.ac to lose warnings given by automake 1.12 - and later. - -8. Fix two buffer over read issues in 16 and 32 bit modes. Affects JIT only. - -9. Optimizing fast_forward_start_bits in JIT. - -10. Adding support for callouts in JIT, and fixing some issues revealed - during this work. Namely: - - (a) Unoptimized capturing brackets incorrectly reset on backtrack. - - (b) Minimum length was not checked before the matching is started. - -11. The value of capture_last that is passed to callouts was incorrect in some - cases when there was a capture on one path that was subsequently abandoned - after a backtrack. Also, the capture_last value is now reset after a - recursion, since all captures are also reset in this case. - -12. The interpreter no longer returns the "too many substrings" error in the - case when an overflowing capture is in a branch that is subsequently - abandoned after a backtrack. - -13. In the pathological case when an offset vector of size 2 is used, pcretest - now prints out the matched string after a yield of 0 or 1. - -14. Inlining subpatterns in recursions, when certain conditions are fulfilled. - Only supported by the JIT compiler at the moment. - -15. JIT compiler now supports 32 bit Macs thanks to Lawrence Velazquez. - -16. Partial matches now set offsets[2] to the "bumpalong" value, that is, the - offset of the starting point of the matching process, provided the offsets - vector is large enough. - -17. The \A escape now records a lookbehind value of 1, though its execution - does not actually inspect the previous character. This is to ensure that, - in partial multi-segment matching, at least one character from the old - segment is retained when a new segment is processed. Otherwise, if there - are no lookbehinds in the pattern, \A might match incorrectly at the start - of a new segment. - -18. Added some #ifdef __VMS code into pcretest.c to help VMS implementations. - -19. Redefined some pcre_uchar variables in pcre_exec.c as pcre_uint32; this - gives some modest performance improvement in 8-bit mode. - -20. Added the PCRE-specific property \p{Xuc} for matching characters that can - be expressed in certain programming languages using Universal Character - Names. - -21. Unicode validation has been updated in the light of Unicode Corrigendum #9, - which points out that "non characters" are not "characters that may not - appear in Unicode strings" but rather "characters that are reserved for - internal use and have only local meaning". - -22. When a pattern was compiled with automatic callouts (PCRE_AUTO_CALLOUT) and - there was a conditional group that depended on an assertion, if the - assertion was false, the callout that immediately followed the alternation - in the condition was skipped when pcre_exec() was used for matching. - -23. Allow an explicit callout to be inserted before an assertion that is the - condition for a conditional group, for compatibility with automatic - callouts, which always insert a callout at this point. - -24. In 8.31, (*COMMIT) was confined to within a recursive subpattern. Perl also - confines (*SKIP) and (*PRUNE) in the same way, and this has now been done. - -25. (*PRUNE) is now supported by the JIT compiler. - -26. Fix infinite loop when /(?<=(*SKIP)ac)a/ is matched against aa. - -27. Fix the case where there are two or more SKIPs with arguments that may be - ignored. - -28. (*SKIP) is now supported by the JIT compiler. - -29. (*THEN) is now supported by the JIT compiler. - -30. Update RunTest with additional test selector options. - -31. The way PCRE handles backtracking verbs has been changed in two ways. - - (1) Previously, in something like (*COMMIT)(*SKIP), COMMIT would override - SKIP. Now, PCRE acts on whichever backtracking verb is reached first by - backtracking. In some cases this makes it more Perl-compatible, but Perl's - rather obscure rules do not always do the same thing. - - (2) Previously, backtracking verbs were confined within assertions. This is - no longer the case for positive assertions, except for (*ACCEPT). Again, - this sometimes improves Perl compatibility, and sometimes does not. - -32. A number of tests that were in test 2 because Perl did things differently - have been moved to test 1, because either Perl or PCRE has changed, and - these tests are now compatible. - -32. Backtracking control verbs are now handled in the same way in JIT and - interpreter. - -33. An opening parenthesis in a MARK/PRUNE/SKIP/THEN name in a pattern that - contained a forward subroutine reference caused a compile error. - -34. Auto-detect and optimize limited repetitions in JIT. - -35. Implement PCRE_NEVER_UTF to lock out the use of UTF, in particular, - blocking (*UTF) etc. - -36. In the interpreter, maximizing pattern repetitions for characters and - character types now use tail recursion, which reduces stack usage. - -37. The value of the max lookbehind was not correctly preserved if a compiled - and saved regex was reloaded on a host of different endianness. - -38. Implemented (*LIMIT_MATCH) and (*LIMIT_RECURSION). As part of the extension - of the compiled pattern block, expand the flags field from 16 to 32 bits - because it was almost full. - -39. Try madvise first before posix_madvise. - -40. Change 7 for PCRE 7.9 made it impossible for pcregrep to find empty lines - with a pattern such as ^$. It has taken 4 years for anybody to notice! The - original change locked out all matches of empty strings. This has been - changed so that one match of an empty string per line is recognized. - Subsequent searches on the same line (for colouring or for --only-matching, - for example) do not recognize empty strings. - -41. Applied a user patch to fix a number of spelling mistakes in comments. - -42. Data lines longer than 65536 caused pcretest to crash. - -43. Clarified the data type for length and startoffset arguments for pcre_exec - and pcre_dfa_exec in the function-specific man pages, where they were - explicitly stated to be in bytes, never having been updated. I also added - some clarification to the pcreapi man page. - -44. A call to pcre_dfa_exec() with an output vector size less than 2 caused - a segmentation fault. - - -Version 8.32 30-November-2012 ------------------------------ - -1. Improved JIT compiler optimizations for first character search and single - character iterators. - -2. Supporting IBM XL C compilers for PPC architectures in the JIT compiler. - Patch by Daniel Richard G. - -3. Single character iterator optimizations in the JIT compiler. - -4. Improved JIT compiler optimizations for character ranges. - -5. Rename the "leave" variable names to "quit" to improve WinCE compatibility. - Reported by Giuseppe D'Angelo. - -6. The PCRE_STARTLINE bit, indicating that a match can occur only at the start - of a line, was being set incorrectly in cases where .* appeared inside - atomic brackets at the start of a pattern, or where there was a subsequent - *PRUNE or *SKIP. - -7. Improved instruction cache flush for POWER/PowerPC. - Patch by Daniel Richard G. - -8. Fixed a number of issues in pcregrep, making it more compatible with GNU - grep: - - (a) There is now no limit to the number of patterns to be matched. - - (b) An error is given if a pattern is too long. - - (c) Multiple uses of --exclude, --exclude-dir, --include, and --include-dir - are now supported. - - (d) --exclude-from and --include-from (multiple use) have been added. - - (e) Exclusions and inclusions now apply to all files and directories, not - just to those obtained from scanning a directory recursively. - - (f) Multiple uses of -f and --file-list are now supported. - - (g) In a Windows environment, the default for -d has been changed from - "read" (the GNU grep default) to "skip", because otherwise the presence - of a directory in the file list provokes an error. - - (h) The documentation has been revised and clarified in places. - -9. Improve the matching speed of capturing brackets. - -10. Changed the meaning of \X so that it now matches a Unicode extended - grapheme cluster. - -11. Patch by Daniel Richard G to the autoconf files to add a macro for sorting - out POSIX threads when JIT support is configured. - -12. Added support for PCRE_STUDY_EXTRA_NEEDED. - -13. In the POSIX wrapper regcomp() function, setting re_nsub field in the preg - structure could go wrong in environments where size_t is not the same size - as int. - -14. Applied user-supplied patch to pcrecpp.cc to allow PCRE_NO_UTF8_CHECK to be - set. - -15. The EBCDIC support had decayed; later updates to the code had included - explicit references to (e.g.) \x0a instead of CHAR_LF. There has been a - general tidy up of EBCDIC-related issues, and the documentation was also - not quite right. There is now a test that can be run on ASCII systems to - check some of the EBCDIC-related things (but is it not a full test). - -16. The new PCRE_STUDY_EXTRA_NEEDED option is now used by pcregrep, resulting - in a small tidy to the code. - -17. Fix JIT tests when UTF is disabled and both 8 and 16 bit mode are enabled. - -18. If the --only-matching (-o) option in pcregrep is specified multiple - times, each one causes appropriate output. For example, -o1 -o2 outputs the - substrings matched by the 1st and 2nd capturing parentheses. A separating - string can be specified by --om-separator (default empty). - -19. Improving the first n character searches. - -20. Turn case lists for horizontal and vertical white space into macros so that - they are defined only once. - -21. This set of changes together give more compatible Unicode case-folding - behaviour for characters that have more than one other case when UCP - support is available. - - (a) The Unicode property table now has offsets into a new table of sets of - three or more characters that are case-equivalent. The MultiStage2.py - script that generates these tables (the pcre_ucd.c file) now scans - CaseFolding.txt instead of UnicodeData.txt for character case - information. - - (b) The code for adding characters or ranges of characters to a character - class has been abstracted into a generalized function that also handles - case-independence. In UTF-mode with UCP support, this uses the new data - to handle characters with more than one other case. - - (c) A bug that is fixed as a result of (b) is that codepoints less than 256 - whose other case is greater than 256 are now correctly matched - caselessly. Previously, the high codepoint matched the low one, but not - vice versa. - - (d) The processing of \h, \H, \v, and \ in character classes now makes use - of the new class addition function, using character lists defined as - macros alongside the case definitions of 20 above. - - (e) Caseless back references now work with characters that have more than - one other case. - - (f) General caseless matching of characters with more than one other case - is supported. - -22. Unicode character properties were updated from Unicode 6.2.0 - -23. Improved CMake support under Windows. Patch by Daniel Richard G. - -24. Add support for 32-bit character strings, and UTF-32 - -25. Major JIT compiler update (code refactoring and bugfixing). - Experimental Sparc 32 support is added. - -26. Applied a modified version of Daniel Richard G's patch to create - pcre.h.generic and config.h.generic by "make" instead of in the - PrepareRelease script. - -27. Added a definition for CHAR_NULL (helpful for the z/OS port), and use it in - pcre_compile.c when checking for a zero character. - -28. Introducing a native interface for JIT. Through this interface, the compiled - machine code can be directly executed. The purpose of this interface is to - provide fast pattern matching, so several sanity checks are not performed. - However, feature tests are still performed. The new interface provides - 1.4x speedup compared to the old one. - -29. If pcre_exec() or pcre_dfa_exec() was called with a negative value for - the subject string length, the error given was PCRE_ERROR_BADOFFSET, which - was confusing. There is now a new error PCRE_ERROR_BADLENGTH for this case. - -30. In 8-bit UTF-8 mode, pcretest failed to give an error for data codepoints - greater than 0x7fffffff (which cannot be represented in UTF-8, even under - the "old" RFC 2279). Instead, it ended up passing a negative length to - pcre_exec(). - -31. Add support for GCC's visibility feature to hide internal functions. - -32. Running "pcretest -C pcre8" or "pcretest -C pcre16" gave a spurious error - "unknown -C option" after outputting 0 or 1. - -33. There is now support for generating a code coverage report for the test - suite in environments where gcc is the compiler and lcov is installed. This - is mainly for the benefit of the developers. - -34. If PCRE is built with --enable-valgrind, certain memory regions are marked - unaddressable using valgrind annotations, allowing valgrind to detect - invalid memory accesses. This is mainly for the benefit of the developers. - -25. (*UTF) can now be used to start a pattern in any of the three libraries. - -26. Give configure error if --enable-cpp but no C++ compiler found. - - -Version 8.31 06-July-2012 -------------------------- - -1. Fixing a wrong JIT test case and some compiler warnings. - -2. Removed a bashism from the RunTest script. - -3. Add a cast to pcre_exec.c to fix the warning "unary minus operator applied - to unsigned type, result still unsigned" that was given by an MS compiler - on encountering the code "-sizeof(xxx)". - -4. Partial matching support is added to the JIT compiler. - -5. Fixed several bugs concerned with partial matching of items that consist - of more than one character: - - (a) /^(..)\1/ did not partially match "aba" because checking references was - done on an "all or nothing" basis. This also applied to repeated - references. - - (b) \R did not give a hard partial match if \r was found at the end of the - subject. - - (c) \X did not give a hard partial match after matching one or more - characters at the end of the subject. - - (d) When newline was set to CRLF, a pattern such as /a$/ did not recognize - a partial match for the string "\r". - - (e) When newline was set to CRLF, the metacharacter "." did not recognize - a partial match for a CR character at the end of the subject string. - -6. If JIT is requested using /S++ or -s++ (instead of just /S+ or -s+) when - running pcretest, the text "(JIT)" added to the output whenever JIT is - actually used to run the match. - -7. Individual JIT compile options can be set in pcretest by following -s+[+] - or /S+[+] with a digit between 1 and 7. - -8. OP_NOT now supports any UTF character not just single-byte ones. - -9. (*MARK) control verb is now supported by the JIT compiler. - -10. The command "./RunTest list" lists the available tests without actually - running any of them. (Because I keep forgetting what they all are.) - -11. Add PCRE_INFO_MAXLOOKBEHIND. - -12. Applied a (slightly modified) user-supplied patch that improves performance - when the heap is used for recursion (compiled with --disable-stack-for- - recursion). Instead of malloc and free for each heap frame each time a - logical recursion happens, frames are retained on a chain and re-used where - possible. This sometimes gives as much as 30% improvement. - -13. As documented, (*COMMIT) is now confined to within a recursive subpattern - call. - -14. As documented, (*COMMIT) is now confined to within a positive assertion. - -15. It is now possible to link pcretest with libedit as an alternative to - libreadline. - -16. (*COMMIT) control verb is now supported by the JIT compiler. - -17. The Unicode data tables have been updated to Unicode 6.1.0. - -18. Added --file-list option to pcregrep. - -19. Added binary file support to pcregrep, including the -a, --binary-files, - -I, and --text options. - -20. The madvise function is renamed for posix_madvise for QNX compatibility - reasons. Fixed by Giuseppe D'Angelo. - -21. Fixed a bug for backward assertions with REVERSE 0 in the JIT compiler. - -22. Changed the option for creating symbolic links for 16-bit man pages from - -s to -sf so that re-installing does not cause issues. - -23. Support PCRE_NO_START_OPTIMIZE in JIT as (*MARK) support requires it. - -24. Fixed a very old bug in pcretest that caused errors with restarted DFA - matches in certain environments (the workspace was not being correctly - retained). Also added to pcre_dfa_exec() a simple plausibility check on - some of the workspace data at the beginning of a restart. - -25. \s*\R was auto-possessifying the \s* when it should not, whereas \S*\R - was not doing so when it should - probably a typo introduced by SVN 528 - (change 8.10/14). - -26. When PCRE_UCP was not set, \w+\x{c4} was incorrectly auto-possessifying the - \w+ when the character tables indicated that \x{c4} was a word character. - There were several related cases, all because the tests for doing a table - lookup were testing for characters less than 127 instead of 255. - -27. If a pattern contains capturing parentheses that are not used in a match, - their slots in the ovector are set to -1. For those that are higher than - any matched groups, this happens at the end of processing. In the case when - there were back references that the ovector was too small to contain - (causing temporary malloc'd memory to be used during matching), and the - highest capturing number was not used, memory off the end of the ovector - was incorrectly being set to -1. (It was using the size of the temporary - memory instead of the true size.) - -28. To catch bugs like 27 using valgrind, when pcretest is asked to specify an - ovector size, it uses memory at the end of the block that it has got. - -29. Check for an overlong MARK name and give an error at compile time. The - limit is 255 for the 8-bit library and 65535 for the 16-bit library. - -30. JIT compiler update. - -31. JIT is now supported on jailbroken iOS devices. Thanks for Ruiger - Rill for the patch. - -32. Put spaces around SLJIT_PRINT_D in the JIT compiler. Required by CXX11. - -33. Variable renamings in the PCRE-JIT compiler. No functionality change. - -34. Fixed typos in pcregrep: in two places there was SUPPORT_LIBZ2 instead of - SUPPORT_LIBBZ2. This caused a build problem when bzip2 but not gzip (zlib) - was enabled. - -35. Improve JIT code generation for greedy plus quantifier. - -36. When /((?:a?)*)*c/ or /((?>a?)*)*c/ was matched against "aac", it set group - 1 to "aa" instead of to an empty string. The bug affected repeated groups - that could potentially match an empty string. - -37. Optimizing single character iterators in JIT. - -38. Wide characters specified with \uxxxx in JavaScript mode are now subject to - the same checks as \x{...} characters in non-JavaScript mode. Specifically, - codepoints that are too big for the mode are faulted, and in a UTF mode, - disallowed codepoints are also faulted. - -39. If PCRE was compiled with UTF support, in three places in the DFA - matcher there was code that should only have been obeyed in UTF mode, but - was being obeyed unconditionally. In 8-bit mode this could cause incorrect - processing when bytes with values greater than 127 were present. In 16-bit - mode the bug would be provoked by values in the range 0xfc00 to 0xdc00. In - both cases the values are those that cannot be the first data item in a UTF - character. The three items that might have provoked this were recursions, - possessively repeated groups, and atomic groups. - -40. Ensure that libpcre is explicitly listed in the link commands for pcretest - and pcregrep, because some OS require shared objects to be explicitly - passed to ld, causing the link step to fail if they are not. - -41. There were two incorrect #ifdefs in pcre_study.c, meaning that, in 16-bit - mode, patterns that started with \h* or \R* might be incorrectly matched. - - -Version 8.30 04-February-2012 ------------------------------ - -1. Renamed "isnumber" as "is_a_number" because in some Mac environments this - name is defined in ctype.h. - -2. Fixed a bug in fixed-length calculation for lookbehinds that would show up - only in quite long subpatterns. - -3. Removed the function pcre_info(), which has been obsolete and deprecated - since it was replaced by pcre_fullinfo() in February 2000. - -4. For a non-anchored pattern, if (*SKIP) was given with a name that did not - match a (*MARK), and the match failed at the start of the subject, a - reference to memory before the start of the subject could occur. This bug - was introduced by fix 17 of release 8.21. - -5. A reference to an unset group with zero minimum repetition was giving - totally wrong answers (in non-JavaScript-compatibility mode). For example, - /(another)?(\1?)test/ matched against "hello world test". This bug was - introduced in release 8.13. - -6. Add support for 16-bit character strings (a large amount of work involving - many changes and refactorings). - -7. RunGrepTest failed on msys because \r\n was replaced by whitespace when the - command "pattern=`printf 'xxx\r\njkl'`" was run. The pattern is now taken - from a file. - -8. Ovector size of 2 is also supported by JIT based pcre_exec (the ovector size - rounding is not applied in this particular case). - -9. The invalid Unicode surrogate codepoints U+D800 to U+DFFF are now rejected - if they appear, or are escaped, in patterns. - -10. Get rid of a number of -Wunused-but-set-variable warnings. - -11. The pattern /(?=(*:x))(q|)/ matches an empty string, and returns the mark - "x". The similar pattern /(?=(*:x))((*:y)q|)/ did not return a mark at all. - Oddly, Perl behaves the same way. PCRE has been fixed so that this pattern - also returns the mark "x". This bug applied to capturing parentheses, - non-capturing parentheses, and atomic parentheses. It also applied to some - assertions. - -12. Stephen Kelly's patch to CMakeLists.txt allows it to parse the version - information out of configure.ac instead of relying on pcre.h.generic, which - is not stored in the repository. - -13. Applied Dmitry V. Levin's patch for a more portable method for linking with - -lreadline. - -14. ZH added PCRE_CONFIG_JITTARGET; added its output to pcretest -C. - -15. Applied Graycode's patch to put the top-level frame on the stack rather - than the heap when not using the stack for recursion. This gives a - performance improvement in many cases when recursion is not deep. - -16. Experimental code added to "pcretest -C" to output the stack frame size. - - -Version 8.21 12-Dec-2011 ------------------------- - -1. Updating the JIT compiler. - -2. JIT compiler now supports OP_NCREF, OP_RREF and OP_NRREF. New test cases - are added as well. - -3. Fix cache-flush issue on PowerPC (It is still an experimental JIT port). - PCRE_EXTRA_TABLES is not suported by JIT, and should be checked before - calling _pcre_jit_exec. Some extra comments are added. - -4. (*MARK) settings inside atomic groups that do not contain any capturing - parentheses, for example, (?>a(*:m)), were not being passed out. This bug - was introduced by change 18 for 8.20. - -5. Supporting of \x, \U and \u in JavaScript compatibility mode based on the - ECMA-262 standard. - -6. Lookbehinds such as (?<=a{2}b) that contained a fixed repetition were - erroneously being rejected as "not fixed length" if PCRE_CASELESS was set. - This bug was probably introduced by change 9 of 8.13. - -7. While fixing 6 above, I noticed that a number of other items were being - incorrectly rejected as "not fixed length". This arose partly because newer - opcodes had not been added to the fixed-length checking code. I have (a) - corrected the bug and added tests for these items, and (b) arranged for an - error to occur if an unknown opcode is encountered while checking for fixed - length instead of just assuming "not fixed length". The items that were - rejected were: (*ACCEPT), (*COMMIT), (*FAIL), (*MARK), (*PRUNE), (*SKIP), - (*THEN), \h, \H, \v, \V, and single character negative classes with fixed - repetitions, e.g. [^a]{3}, with and without PCRE_CASELESS. - -8. A possessively repeated conditional subpattern such as (?(?=c)c|d)++ was - being incorrectly compiled and would have given unpredicatble results. - -9. A possessively repeated subpattern with minimum repeat count greater than - one behaved incorrectly. For example, (A){2,}+ behaved as if it was - (A)(A)++ which meant that, after a subsequent mismatch, backtracking into - the first (A) could occur when it should not. - -10. Add a cast and remove a redundant test from the code. - -11. JIT should use pcre_malloc/pcre_free for allocation. - -12. Updated pcre-config so that it no longer shows -L/usr/lib, which seems - best practice nowadays, and helps with cross-compiling. (If the exec_prefix - is anything other than /usr, -L is still shown). - -13. In non-UTF-8 mode, \C is now supported in lookbehinds and DFA matching. - -14. Perl does not support \N without a following name in a [] class; PCRE now - also gives an error. - -15. If a forward reference was repeated with an upper limit of around 2000, - it caused the error "internal error: overran compiling workspace". The - maximum number of forward references (including repeats) was limited by the - internal workspace, and dependent on the LINK_SIZE. The code has been - rewritten so that the workspace expands (via pcre_malloc) if necessary, and - the default depends on LINK_SIZE. There is a new upper limit (for safety) - of around 200,000 forward references. While doing this, I also speeded up - the filling in of repeated forward references. - -16. A repeated forward reference in a pattern such as (a)(?2){2}(.) was - incorrectly expecting the subject to contain another "a" after the start. - -17. When (*SKIP:name) is activated without a corresponding (*MARK:name) earlier - in the match, the SKIP should be ignored. This was not happening; instead - the SKIP was being treated as NOMATCH. For patterns such as - /A(*MARK:A)A+(*SKIP:B)Z|AAC/ this meant that the AAC branch was never - tested. - -18. The behaviour of (*MARK), (*PRUNE), and (*THEN) has been reworked and is - now much more compatible with Perl, in particular in cases where the result - is a non-match for a non-anchored pattern. For example, if - /b(*:m)f|a(*:n)w/ is matched against "abc", the non-match returns the name - "m", where previously it did not return a name. A side effect of this - change is that for partial matches, the last encountered mark name is - returned, as for non matches. A number of tests that were previously not - Perl-compatible have been moved into the Perl-compatible test files. The - refactoring has had the pleasing side effect of removing one argument from - the match() function, thus reducing its stack requirements. - -19. If the /S+ option was used in pcretest to study a pattern using JIT, - subsequent uses of /S (without +) incorrectly behaved like /S+. - -21. Retrieve executable code size support for the JIT compiler and fixing - some warnings. - -22. A caseless match of a UTF-8 character whose other case uses fewer bytes did - not work when the shorter character appeared right at the end of the - subject string. - -23. Added some (int) casts to non-JIT modules to reduce warnings on 64-bit - systems. - -24. Added PCRE_INFO_JITSIZE to pass on the value from (21) above, and also - output it when the /M option is used in pcretest. - -25. The CheckMan script was not being included in the distribution. Also, added - an explicit "perl" to run Perl scripts from the PrepareRelease script - because this is reportedly needed in Windows. - -26. If study data was being save in a file and studying had not found a set of - "starts with" bytes for the pattern, the data written to the file (though - never used) was taken from uninitialized memory and so caused valgrind to - complain. - -27. Updated RunTest.bat as provided by Sheri Pierce. - -28. Fixed a possible uninitialized memory bug in pcre_jit_compile.c. - -29. Computation of memory usage for the table of capturing group names was - giving an unnecessarily large value. - - -Version 8.20 21-Oct-2011 ------------------------- - -1. Change 37 of 8.13 broke patterns like [:a]...[b:] because it thought it had - a POSIX class. After further experiments with Perl, which convinced me that - Perl has bugs and confusions, a closing square bracket is no longer allowed - in a POSIX name. This bug also affected patterns with classes that started - with full stops. - -2. If a pattern such as /(a)b|ac/ is matched against "ac", there is no - captured substring, but while checking the failing first alternative, - substring 1 is temporarily captured. If the output vector supplied to - pcre_exec() was not big enough for this capture, the yield of the function - was still zero ("insufficient space for captured substrings"). This cannot - be totally fixed without adding another stack variable, which seems a lot - of expense for a edge case. However, I have improved the situation in cases - such as /(a)(b)x|abc/ matched against "abc", where the return code - indicates that fewer than the maximum number of slots in the ovector have - been set. - -3. Related to (2) above: when there are more back references in a pattern than - slots in the output vector, pcre_exec() uses temporary memory during - matching, and copies in the captures as far as possible afterwards. It was - using the entire output vector, but this conflicts with the specification - that only 2/3 is used for passing back captured substrings. Now it uses - only the first 2/3, for compatibility. This is, of course, another edge - case. - -4. Zoltan Herczeg's just-in-time compiler support has been integrated into the - main code base, and can be used by building with --enable-jit. When this is - done, pcregrep automatically uses it unless --disable-pcregrep-jit or the - runtime --no-jit option is given. - -5. When the number of matches in a pcre_dfa_exec() run exactly filled the - ovector, the return from the function was zero, implying that there were - other matches that did not fit. The correct "exactly full" value is now - returned. - -6. If a subpattern that was called recursively or as a subroutine contained - (*PRUNE) or any other control that caused it to give a non-standard return, - invalid errors such as "Error -26 (nested recursion at the same subject - position)" or even infinite loops could occur. - -7. If a pattern such as /a(*SKIP)c|b(*ACCEPT)|/ was studied, it stopped - computing the minimum length on reaching *ACCEPT, and so ended up with the - wrong value of 1 rather than 0. Further investigation indicates that - computing a minimum subject length in the presence of *ACCEPT is difficult - (think back references, subroutine calls), and so I have changed the code - so that no minimum is registered for a pattern that contains *ACCEPT. - -8. If (*THEN) was present in the first (true) branch of a conditional group, - it was not handled as intended. [But see 16 below.] - -9. Replaced RunTest.bat and CMakeLists.txt with improved versions provided by - Sheri Pierce. - -10. A pathological pattern such as /(*ACCEPT)a/ was miscompiled, thinking that - the first byte in a match must be "a". - -11. Change 17 for 8.13 increased the recursion depth for patterns like - /a(?:.)*?a/ drastically. I've improved things by remembering whether a - pattern contains any instances of (*THEN). If it does not, the old - optimizations are restored. It would be nice to do this on a per-group - basis, but at the moment that is not feasible. - -12. In some environments, the output of pcretest -C is CRLF terminated. This - broke RunTest's code that checks for the link size. A single white space - character after the value is now allowed for. - -13. RunTest now checks for the "fr" locale as well as for "fr_FR" and "french". - For "fr", it uses the Windows-specific input and output files. - -14. If (*THEN) appeared in a group that was called recursively or as a - subroutine, it did not work as intended. [But see next item.] - -15. Consider the pattern /A (B(*THEN)C) | D/ where A, B, C, and D are complex - pattern fragments (but not containing any | characters). If A and B are - matched, but there is a failure in C so that it backtracks to (*THEN), PCRE - was behaving differently to Perl. PCRE backtracked into A, but Perl goes to - D. In other words, Perl considers parentheses that do not contain any | - characters to be part of a surrounding alternative, whereas PCRE was - treading (B(*THEN)C) the same as (B(*THEN)C|(*FAIL)) -- which Perl handles - differently. PCRE now behaves in the same way as Perl, except in the case - of subroutine/recursion calls such as (?1) which have in any case always - been different (but PCRE had them first :-). - -16. Related to 15 above: Perl does not treat the | in a conditional group as - creating alternatives. Such a group is treated in the same way as an - ordinary group without any | characters when processing (*THEN). PCRE has - been changed to match Perl's behaviour. - -17. If a user had set PCREGREP_COLO(U)R to something other than 1:31, the - RunGrepTest script failed. - -18. Change 22 for version 13 caused atomic groups to use more stack. This is - inevitable for groups that contain captures, but it can lead to a lot of - stack use in large patterns. The old behaviour has been restored for atomic - groups that do not contain any capturing parentheses. - -19. If the PCRE_NO_START_OPTIMIZE option was set for pcre_compile(), it did not - suppress the check for a minimum subject length at run time. (If it was - given to pcre_exec() or pcre_dfa_exec() it did work.) - -20. Fixed an ASCII-dependent infelicity in pcretest that would have made it - fail to work when decoding hex characters in data strings in EBCDIC - environments. - -21. It appears that in at least one Mac OS environment, the isxdigit() function - is implemented as a macro that evaluates to its argument more than once, - contravening the C 90 Standard (I haven't checked a later standard). There - was an instance in pcretest which caused it to go wrong when processing - \x{...} escapes in subject strings. The has been rewritten to avoid using - things like p++ in the argument of isxdigit(). - - -Version 8.13 16-Aug-2011 ------------------------- - -1. The Unicode data tables have been updated to Unicode 6.0.0. - -2. Two minor typos in pcre_internal.h have been fixed. - -3. Added #include to pcre_scanner_unittest.cc, pcrecpp.cc, and - pcrecpp_unittest.cc. They are needed for strcmp(), memset(), and strchr() - in some environments (e.g. Solaris 10/SPARC using Sun Studio 12U2). - -4. There were a number of related bugs in the code for matching backrefences - caselessly in UTF-8 mode when codes for the characters concerned were - different numbers of bytes. For example, U+023A and U+2C65 are an upper - and lower case pair, using 2 and 3 bytes, respectively. The main bugs were: - (a) A reference to 3 copies of a 2-byte code matched only 2 of a 3-byte - code. (b) A reference to 2 copies of a 3-byte code would not match 2 of a - 2-byte code at the end of the subject (it thought there wasn't enough data - left). - -5. Comprehensive information about what went wrong is now returned by - pcre_exec() and pcre_dfa_exec() when the UTF-8 string check fails, as long - as the output vector has at least 2 elements. The offset of the start of - the failing character and a reason code are placed in the vector. - -6. When the UTF-8 string check fails for pcre_compile(), the offset that is - now returned is for the first byte of the failing character, instead of the - last byte inspected. This is an incompatible change, but I hope it is small - enough not to be a problem. It makes the returned offset consistent with - pcre_exec() and pcre_dfa_exec(). - -7. pcretest now gives a text phrase as well as the error number when - pcre_exec() or pcre_dfa_exec() fails; if the error is a UTF-8 check - failure, the offset and reason code are output. - -8. When \R was used with a maximizing quantifier it failed to skip backwards - over a \r\n pair if the subsequent match failed. Instead, it just skipped - back over a single character (\n). This seems wrong (because it treated the - two characters as a single entity when going forwards), conflicts with the - documentation that \R is equivalent to (?>\r\n|\n|...etc), and makes the - behaviour of \R* different to (\R)*, which also seems wrong. The behaviour - has been changed. - -9. Some internal refactoring has changed the processing so that the handling - of the PCRE_CASELESS and PCRE_MULTILINE options is done entirely at compile - time (the PCRE_DOTALL option was changed this way some time ago: version - 7.7 change 16). This has made it possible to abolish the OP_OPT op code, - which was always a bit of a fudge. It also means that there is one less - argument for the match() function, which reduces its stack requirements - slightly. This change also fixes an incompatibility with Perl: the pattern - (?i:([^b]))(?1) should not match "ab", but previously PCRE gave a match. - -10. More internal refactoring has drastically reduced the number of recursive - calls to match() for possessively repeated groups such as (abc)++ when - using pcre_exec(). - -11. While implementing 10, a number of bugs in the handling of groups were - discovered and fixed: - - (?<=(a)+) was not diagnosed as invalid (non-fixed-length lookbehind). - (a|)*(?1) gave a compile-time internal error. - ((a|)+)+ did not notice that the outer group could match an empty string. - (^a|^)+ was not marked as anchored. - (.*a|.*)+ was not marked as matching at start or after a newline. - -12. Yet more internal refactoring has removed another argument from the match() - function. Special calls to this function are now indicated by setting a - value in a variable in the "match data" data block. - -13. Be more explicit in pcre_study() instead of relying on "default" for - opcodes that mean there is no starting character; this means that when new - ones are added and accidentally left out of pcre_study(), testing should - pick them up. - -14. The -s option of pcretest has been documented for ages as being an old - synonym of -m (show memory usage). I have changed it to mean "force study - for every regex", that is, assume /S for every regex. This is similar to -i - and -d etc. It's slightly incompatible, but I'm hoping nobody is still - using it. It makes it easier to run collections of tests with and without - study enabled, and thereby test pcre_study() more easily. All the standard - tests are now run with and without -s (but some patterns can be marked as - "never study" - see 20 below). - -15. When (*ACCEPT) was used in a subpattern that was called recursively, the - restoration of the capturing data to the outer values was not happening - correctly. - -16. If a recursively called subpattern ended with (*ACCEPT) and matched an - empty string, and PCRE_NOTEMPTY was set, pcre_exec() thought the whole - pattern had matched an empty string, and so incorrectly returned a no - match. - -17. There was optimizing code for the last branch of non-capturing parentheses, - and also for the obeyed branch of a conditional subexpression, which used - tail recursion to cut down on stack usage. Unfortunately, now that there is - the possibility of (*THEN) occurring in these branches, tail recursion is - no longer possible because the return has to be checked for (*THEN). These - two optimizations have therefore been removed. [But see 8.20/11 above.] - -18. If a pattern containing \R was studied, it was assumed that \R always - matched two bytes, thus causing the minimum subject length to be - incorrectly computed because \R can also match just one byte. - -19. If a pattern containing (*ACCEPT) was studied, the minimum subject length - was incorrectly computed. - -20. If /S is present twice on a test pattern in pcretest input, it now - *disables* studying, thereby overriding the use of -s on the command line - (see 14 above). This is necessary for one or two tests to keep the output - identical in both cases. - -21. When (*ACCEPT) was used in an assertion that matched an empty string and - PCRE_NOTEMPTY was set, PCRE applied the non-empty test to the assertion. - -22. When an atomic group that contained a capturing parenthesis was - successfully matched, but the branch in which it appeared failed, the - capturing was not being forgotten if a higher numbered group was later - captured. For example, /(?>(a))b|(a)c/ when matching "ac" set capturing - group 1 to "a", when in fact it should be unset. This applied to multi- - branched capturing and non-capturing groups, repeated or not, and also to - positive assertions (capturing in negative assertions does not happen - in PCRE) and also to nested atomic groups. - -23. Add the ++ qualifier feature to pcretest, to show the remainder of the - subject after a captured substring, to make it easier to tell which of a - number of identical substrings has been captured. - -24. The way atomic groups are processed by pcre_exec() has been changed so that - if they are repeated, backtracking one repetition now resets captured - values correctly. For example, if ((?>(a+)b)+aabab) is matched against - "aaaabaaabaabab" the value of captured group 2 is now correctly recorded as - "aaa". Previously, it would have been "a". As part of this code - refactoring, the way recursive calls are handled has also been changed. - -25. If an assertion condition captured any substrings, they were not passed - back unless some other capturing happened later. For example, if - (?(?=(a))a) was matched against "a", no capturing was returned. - -26. When studying a pattern that contained subroutine calls or assertions, - the code for finding the minimum length of a possible match was handling - direct recursions such as (xxx(?1)|yyy) but not mutual recursions (where - group 1 called group 2 while simultaneously a separate group 2 called group - 1). A stack overflow occurred in this case. I have fixed this by limiting - the recursion depth to 10. - -27. Updated RunTest.bat in the distribution to the version supplied by Tom - Fortmann. This supports explicit test numbers on the command line, and has - argument validation and error reporting. - -28. An instance of \X with an unlimited repeat could fail if at any point the - first character it looked at was a mark character. - -29. Some minor code refactoring concerning Unicode properties and scripts - should reduce the stack requirement of match() slightly. - -30. Added the '=' option to pcretest to check the setting of unused capturing - slots at the end of the pattern, which are documented as being -1, but are - not included in the return count. - -31. If \k was not followed by a braced, angle-bracketed, or quoted name, PCRE - compiled something random. Now it gives a compile-time error (as does - Perl). - -32. A *MARK encountered during the processing of a positive assertion is now - recorded and passed back (compatible with Perl). - -33. If --only-matching or --colour was set on a pcregrep call whose pattern - had alternative anchored branches, the search for a second match in a line - was done as if at the line start. Thus, for example, /^01|^02/ incorrectly - matched the line "0102" twice. The same bug affected patterns that started - with a backwards assertion. For example /\b01|\b02/ also matched "0102" - twice. - -34. Previously, PCRE did not allow quantification of assertions. However, Perl - does, and because of capturing effects, quantifying parenthesized - assertions may at times be useful. Quantifiers are now allowed for - parenthesized assertions. - -35. A minor code tidy in pcre_compile() when checking options for \R usage. - -36. \g was being checked for fancy things in a character class, when it should - just be a literal "g". - -37. PCRE was rejecting [:a[:digit:]] whereas Perl was not. It seems that the - appearance of a nested POSIX class supersedes an apparent external class. - For example, [:a[:digit:]b:] matches "a", "b", ":", or a digit. Also, - unescaped square brackets may also appear as part of class names. For - example, [:a[:abc]b:] gives unknown class "[:abc]b:]". PCRE now behaves - more like Perl. (But see 8.20/1 above.) - -38. PCRE was giving an error for \N with a braced quantifier such as {1,} (this - was because it thought it was \N{name}, which is not supported). - -39. Add minix to OS list not supporting the -S option in pcretest. - -40. PCRE tries to detect cases of infinite recursion at compile time, but it - cannot analyze patterns in sufficient detail to catch mutual recursions - such as ((?1))((?2)). There is now a runtime test that gives an error if a - subgroup is called recursively as a subpattern for a second time at the - same position in the subject string. In previous releases this might have - been caught by the recursion limit, or it might have run out of stack. - -41. A pattern such as /(?(R)a+|(?R)b)/ is quite safe, as the recursion can - happen only once. PCRE was, however incorrectly giving a compile time error - "recursive call could loop indefinitely" because it cannot analyze the - pattern in sufficient detail. The compile time test no longer happens when - PCRE is compiling a conditional subpattern, but actual runaway loops are - now caught at runtime (see 40 above). - -42. It seems that Perl allows any characters other than a closing parenthesis - to be part of the NAME in (*MARK:NAME) and other backtracking verbs. PCRE - has been changed to be the same. - -43. Updated configure.ac to put in more quoting round AC_LANG_PROGRAM etc. so - as not to get warnings when autogen.sh is called. Also changed - AC_PROG_LIBTOOL (deprecated) to LT_INIT (the current macro). - -44. To help people who use pcregrep to scan files containing exceedingly long - lines, the following changes have been made: - - (a) The default value of the buffer size parameter has been increased from - 8K to 20K. (The actual buffer used is three times this size.) - - (b) The default can be changed by ./configure --with-pcregrep-bufsize when - PCRE is built. - - (c) A --buffer-size=n option has been added to pcregrep, to allow the size - to be set at run time. - - (d) Numerical values in pcregrep options can be followed by K or M, for - example --buffer-size=50K. - - (e) If a line being scanned overflows pcregrep's buffer, an error is now - given and the return code is set to 2. - -45. Add a pointer to the latest mark to the callout data block. - -46. The pattern /.(*F)/, when applied to "abc" with PCRE_PARTIAL_HARD, gave a - partial match of an empty string instead of no match. This was specific to - the use of ".". - -47. The pattern /f.*/8s, when applied to "for" with PCRE_PARTIAL_HARD, gave a - complete match instead of a partial match. This bug was dependent on both - the PCRE_UTF8 and PCRE_DOTALL options being set. - -48. For a pattern such as /\babc|\bdef/ pcre_study() was failing to set up the - starting byte set, because \b was not being ignored. - - -Version 8.12 15-Jan-2011 ------------------------- - -1. Fixed some typos in the markup of the man pages, and wrote a script that - checks for such things as part of the documentation building process. - -2. On a big-endian 64-bit system, pcregrep did not correctly process the - --match-limit and --recursion-limit options (added for 8.11). In - particular, this made one of the standard tests fail. (The integer value - went into the wrong half of a long int.) - -3. If the --colour option was given to pcregrep with -v (invert match), it - did strange things, either producing crazy output, or crashing. It should, - of course, ignore a request for colour when reporting lines that do not - match. - -4. Another pcregrep bug caused similar problems if --colour was specified with - -M (multiline) and the pattern match finished with a line ending. - -5. In pcregrep, when a pattern that ended with a literal newline sequence was - matched in multiline mode, the following line was shown as part of the - match. This seems wrong, so I have changed it. - -6. Another pcregrep bug in multiline mode, when --colour was specified, caused - the check for further matches in the same line (so they could be coloured) - to overrun the end of the current line. If another match was found, it was - incorrectly shown (and then shown again when found in the next line). - -7. If pcregrep was compiled under Windows, there was a reference to the - function pcregrep_exit() before it was defined. I am assuming this was - the cause of the "error C2371: 'pcregrep_exit' : redefinition;" that was - reported by a user. I've moved the definition above the reference. - - -Version 8.11 10-Dec-2010 ------------------------- - -1. (*THEN) was not working properly if there were untried alternatives prior - to it in the current branch. For example, in ((a|b)(*THEN)(*F)|c..) it - backtracked to try for "b" instead of moving to the next alternative branch - at the same level (in this case, to look for "c"). The Perl documentation - is clear that when (*THEN) is backtracked onto, it goes to the "next - alternative in the innermost enclosing group". - -2. (*COMMIT) was not overriding (*THEN), as it does in Perl. In a pattern - such as (A(*COMMIT)B(*THEN)C|D) any failure after matching A should - result in overall failure. Similarly, (*COMMIT) now overrides (*PRUNE) and - (*SKIP), (*SKIP) overrides (*PRUNE) and (*THEN), and (*PRUNE) overrides - (*THEN). - -3. If \s appeared in a character class, it removed the VT character from - the class, even if it had been included by some previous item, for example - in [\x00-\xff\s]. (This was a bug related to the fact that VT is not part - of \s, but is part of the POSIX "space" class.) - -4. A partial match never returns an empty string (because you can always - match an empty string at the end of the subject); however the checking for - an empty string was starting at the "start of match" point. This has been - changed to the "earliest inspected character" point, because the returned - data for a partial match starts at this character. This means that, for - example, /(?<=abc)def/ gives a partial match for the subject "abc" - (previously it gave "no match"). - -5. Changes have been made to the way PCRE_PARTIAL_HARD affects the matching - of $, \z, \Z, \b, and \B. If the match point is at the end of the string, - previously a full match would be given. However, setting PCRE_PARTIAL_HARD - has an implication that the given string is incomplete (because a partial - match is preferred over a full match). For this reason, these items now - give a partial match in this situation. [Aside: previously, the one case - /t\b/ matched against "cat" with PCRE_PARTIAL_HARD set did return a partial - match rather than a full match, which was wrong by the old rules, but is - now correct.] - -6. There was a bug in the handling of #-introduced comments, recognized when - PCRE_EXTENDED is set, when PCRE_NEWLINE_ANY and PCRE_UTF8 were also set. - If a UTF-8 multi-byte character included the byte 0x85 (e.g. +U0445, whose - UTF-8 encoding is 0xd1,0x85), this was misinterpreted as a newline when - scanning for the end of the comment. (*Character* 0x85 is an "any" newline, - but *byte* 0x85 is not, in UTF-8 mode). This bug was present in several - places in pcre_compile(). - -7. Related to (6) above, when pcre_compile() was skipping #-introduced - comments when looking ahead for named forward references to subpatterns, - the only newline sequence it recognized was NL. It now handles newlines - according to the set newline convention. - -8. SunOS4 doesn't have strerror() or strtoul(); pcregrep dealt with the - former, but used strtoul(), whereas pcretest avoided strtoul() but did not - cater for a lack of strerror(). These oversights have been fixed. - -9. Added --match-limit and --recursion-limit to pcregrep. - -10. Added two casts needed to build with Visual Studio when NO_RECURSE is set. - -11. When the -o option was used, pcregrep was setting a return code of 1, even - when matches were found, and --line-buffered was not being honoured. - -12. Added an optional parentheses number to the -o and --only-matching options - of pcregrep. - -13. Imitating Perl's /g action for multiple matches is tricky when the pattern - can match an empty string. The code to do it in pcretest and pcredemo - needed fixing: - - (a) When the newline convention was "crlf", pcretest got it wrong, skipping - only one byte after an empty string match just before CRLF (this case - just got forgotten; "any" and "anycrlf" were OK). - - (b) The pcretest code also had a bug, causing it to loop forever in UTF-8 - mode when an empty string match preceded an ASCII character followed by - a non-ASCII character. (The code for advancing by one character rather - than one byte was nonsense.) - - (c) The pcredemo.c sample program did not have any code at all to handle - the cases when CRLF is a valid newline sequence. - -14. Neither pcre_exec() nor pcre_dfa_exec() was checking that the value given - as a starting offset was within the subject string. There is now a new - error, PCRE_ERROR_BADOFFSET, which is returned if the starting offset is - negative or greater than the length of the string. In order to test this, - pcretest is extended to allow the setting of negative starting offsets. - -15. In both pcre_exec() and pcre_dfa_exec() the code for checking that the - starting offset points to the beginning of a UTF-8 character was - unnecessarily clumsy. I tidied it up. - -16. Added PCRE_ERROR_SHORTUTF8 to make it possible to distinguish between a - bad UTF-8 sequence and one that is incomplete when using PCRE_PARTIAL_HARD. - -17. Nobody had reported that the --include_dir option, which was added in - release 7.7 should have been called --include-dir (hyphen, not underscore) - for compatibility with GNU grep. I have changed it to --include-dir, but - left --include_dir as an undocumented synonym, and the same for - --exclude-dir, though that is not available in GNU grep, at least as of - release 2.5.4. - -18. At a user's suggestion, the macros GETCHAR and friends (which pick up UTF-8 - characters from a string of bytes) have been redefined so as not to use - loops, in order to improve performance in some environments. At the same - time, I abstracted some of the common code into auxiliary macros to save - repetition (this should not affect the compiled code). - -19. If \c was followed by a multibyte UTF-8 character, bad things happened. A - compile-time error is now given if \c is not followed by an ASCII - character, that is, a byte less than 128. (In EBCDIC mode, the code is - different, and any byte value is allowed.) - -20. Recognize (*NO_START_OPT) at the start of a pattern to set the PCRE_NO_ - START_OPTIMIZE option, which is now allowed at compile time - but just - passed through to pcre_exec() or pcre_dfa_exec(). This makes it available - to pcregrep and other applications that have no direct access to PCRE - options. The new /Y option in pcretest sets this option when calling - pcre_compile(). - -21. Change 18 of release 8.01 broke the use of named subpatterns for recursive - back references. Groups containing recursive back references were forced to - be atomic by that change, but in the case of named groups, the amount of - memory required was incorrectly computed, leading to "Failed: internal - error: code overflow". This has been fixed. - -22. Some patches to pcre_stringpiece.h, pcre_stringpiece_unittest.cc, and - pcretest.c, to avoid build problems in some Borland environments. - - -Version 8.10 25-Jun-2010 ------------------------- - -1. Added support for (*MARK:ARG) and for ARG additions to PRUNE, SKIP, and - THEN. - -2. (*ACCEPT) was not working when inside an atomic group. - -3. Inside a character class, \B is treated as a literal by default, but - faulted if PCRE_EXTRA is set. This mimics Perl's behaviour (the -w option - causes the error). The code is unchanged, but I tidied the documentation. - -4. Inside a character class, PCRE always treated \R and \X as literals, - whereas Perl faults them if its -w option is set. I have changed PCRE so - that it faults them when PCRE_EXTRA is set. - -5. Added support for \N, which always matches any character other than - newline. (It is the same as "." when PCRE_DOTALL is not set.) - -6. When compiling pcregrep with newer versions of gcc which may have - FORTIFY_SOURCE set, several warnings "ignoring return value of 'fwrite', - declared with attribute warn_unused_result" were given. Just casting the - result to (void) does not stop the warnings; a more elaborate fudge is - needed. I've used a macro to implement this. - -7. Minor change to pcretest.c to avoid a compiler warning. - -8. Added four artifical Unicode properties to help with an option to make - \s etc use properties (see next item). The new properties are: Xan - (alphanumeric), Xsp (Perl space), Xps (POSIX space), and Xwd (word). - -9. Added PCRE_UCP to make \b, \d, \s, \w, and certain POSIX character classes - use Unicode properties. (*UCP) at the start of a pattern can be used to set - this option. Modified pcretest to add /W to test this facility. Added - REG_UCP to make it available via the POSIX interface. - -10. Added --line-buffered to pcregrep. - -11. In UTF-8 mode, if a pattern that was compiled with PCRE_CASELESS was - studied, and the match started with a letter with a code point greater than - 127 whose first byte was different to the first byte of the other case of - the letter, the other case of this starting letter was not recognized - (#976). - -12. If a pattern that was studied started with a repeated Unicode property - test, for example, \p{Nd}+, there was the theoretical possibility of - setting up an incorrect bitmap of starting bytes, but fortunately it could - not have actually happened in practice until change 8 above was made (it - added property types that matched character-matching opcodes). - -13. pcre_study() now recognizes \h, \v, and \R when constructing a bit map of - possible starting bytes for non-anchored patterns. - -14. Extended the "auto-possessify" feature of pcre_compile(). It now recognizes - \R, and also a number of cases that involve Unicode properties, both - explicit and implicit when PCRE_UCP is set. - -15. If a repeated Unicode property match (e.g. \p{Lu}*) was used with non-UTF-8 - input, it could crash or give wrong results if characters with values - greater than 0xc0 were present in the subject string. (Detail: it assumed - UTF-8 input when processing these items.) - -16. Added a lot of (int) casts to avoid compiler warnings in systems where - size_t is 64-bit (#991). - -17. Added a check for running out of memory when PCRE is compiled with - --disable-stack-for-recursion (#990). - -18. If the last data line in a file for pcretest does not have a newline on - the end, a newline was missing in the output. - -19. The default pcre_chartables.c file recognizes only ASCII characters (values - less than 128) in its various bitmaps. However, there is a facility for - generating tables according to the current locale when PCRE is compiled. It - turns out that in some environments, 0x85 and 0xa0, which are Unicode space - characters, are recognized by isspace() and therefore were getting set in - these tables, and indeed these tables seem to approximate to ISO 8859. This - caused a problem in UTF-8 mode when pcre_study() was used to create a list - of bytes that can start a match. For \s, it was including 0x85 and 0xa0, - which of course cannot start UTF-8 characters. I have changed the code so - that only real ASCII characters (less than 128) and the correct starting - bytes for UTF-8 encodings are set for characters greater than 127 when in - UTF-8 mode. (When PCRE_UCP is set - see 9 above - the code is different - altogether.) - -20. Added the /T option to pcretest so as to be able to run tests with non- - standard character tables, thus making it possible to include the tests - used for 19 above in the standard set of tests. - -21. A pattern such as (?&t)(?#()(?(DEFINE)(?a)) which has a forward - reference to a subpattern the other side of a comment that contains an - opening parenthesis caused either an internal compiling error, or a - reference to the wrong subpattern. - - -Version 8.02 19-Mar-2010 ------------------------- - -1. The Unicode data tables have been updated to Unicode 5.2.0. - -2. Added the option --libs-cpp to pcre-config, but only when C++ support is - configured. - -3. Updated the licensing terms in the pcregexp.pas file, as agreed with the - original author of that file, following a query about its status. - -4. On systems that do not have stdint.h (e.g. Solaris), check for and include - inttypes.h instead. This fixes a bug that was introduced by change 8.01/8. - -5. A pattern such as (?&t)*+(?(DEFINE)(?.)) which has a possessive - quantifier applied to a forward-referencing subroutine call, could compile - incorrect code or give the error "internal error: previously-checked - referenced subpattern not found". - -6. Both MS Visual Studio and Symbian OS have problems with initializing - variables to point to external functions. For these systems, therefore, - pcre_malloc etc. are now initialized to local functions that call the - relevant global functions. - -7. There were two entries missing in the vectors called coptable and poptable - in pcre_dfa_exec.c. This could lead to memory accesses outsize the vectors. - I've fixed the data, and added a kludgy way of testing at compile time that - the lengths are correct (equal to the number of opcodes). - -8. Following on from 7, I added a similar kludge to check the length of the - eint vector in pcreposix.c. - -9. Error texts for pcre_compile() are held as one long string to avoid too - much relocation at load time. To find a text, the string is searched, - counting zeros. There was no check for running off the end of the string, - which could happen if a new error number was added without updating the - string. - -10. \K gave a compile-time error if it appeared in a lookbehind assersion. - -11. \K was not working if it appeared in an atomic group or in a group that - was called as a "subroutine", or in an assertion. Perl 5.11 documents that - \K is "not well defined" if used in an assertion. PCRE now accepts it if - the assertion is positive, but not if it is negative. - -12. Change 11 fortuitously reduced the size of the stack frame used in the - "match()" function of pcre_exec.c by one pointer. Forthcoming - implementation of support for (*MARK) will need an extra pointer on the - stack; I have reserved it now, so that the stack frame size does not - decrease. - -13. A pattern such as (?P(?P0)|(?P>L2)(?P>L1)) in which the only other - item in branch that calls a recursion is a subroutine call - as in the - second branch in the above example - was incorrectly given the compile- - time error "recursive call could loop indefinitely" because pcre_compile() - was not correctly checking the subroutine for matching a non-empty string. - -14. The checks for overrunning compiling workspace could trigger after an - overrun had occurred. This is a "should never occur" error, but it can be - triggered by pathological patterns such as hundreds of nested parentheses. - The checks now trigger 100 bytes before the end of the workspace. - -15. Fix typo in configure.ac: "srtoq" should be "strtoq". - - -Version 8.01 19-Jan-2010 ------------------------- - -1. If a pattern contained a conditional subpattern with only one branch (in - particular, this includes all (*DEFINE) patterns), a call to pcre_study() - computed the wrong minimum data length (which is of course zero for such - subpatterns). This could cause incorrect "no match" results. - -2. For patterns such as (?i)a(?-i)b|c where an option setting at the start of - the pattern is reset in the first branch, pcre_compile() failed with - "internal error: code overflow at offset...". This happened only when - the reset was to the original external option setting. (An optimization - abstracts leading options settings into an external setting, which was the - cause of this.) - -3. A pattern such as ^(?!a(*SKIP)b) where a negative assertion contained one - of the verbs SKIP, PRUNE, or COMMIT, did not work correctly. When the - assertion pattern did not match (meaning that the assertion was true), it - was incorrectly treated as false if the SKIP had been reached during the - matching. This also applied to assertions used as conditions. - -4. If an item that is not supported by pcre_dfa_exec() was encountered in an - assertion subpattern, including such a pattern used as a condition, - unpredictable results occurred, instead of the error return - PCRE_ERROR_DFA_UITEM. - -5. The C++ GlobalReplace function was not working like Perl for the special - situation when an empty string is matched. It now does the fancy magic - stuff that is necessary. - -6. In pcre_internal.h, obsolete includes to setjmp.h and stdarg.h have been - removed. (These were left over from very, very early versions of PCRE.) - -7. Some cosmetic changes to the code to make life easier when compiling it - as part of something else: - - (a) Change DEBUG to PCRE_DEBUG. - - (b) In pcre_compile(), rename the member of the "branch_chain" structure - called "current" as "current_branch", to prevent a collision with the - Linux macro when compiled as a kernel module. - - (c) In pcre_study(), rename the function set_bit() as set_table_bit(), to - prevent a collision with the Linux macro when compiled as a kernel - module. - -8. In pcre_compile() there are some checks for integer overflows that used to - cast potentially large values to (double). This has been changed to that - when building, a check for int64_t is made, and if it is found, it is used - instead, thus avoiding the use of floating point arithmetic. (There is no - other use of FP in PCRE.) If int64_t is not found, the fallback is to - double. - -9. Added two casts to avoid signed/unsigned warnings from VS Studio Express - 2005 (difference between two addresses compared to an unsigned value). - -10. Change the standard AC_CHECK_LIB test for libbz2 in configure.ac to a - custom one, because of the following reported problem in Windows: - - - libbz2 uses the Pascal calling convention (WINAPI) for the functions - under Win32. - - The standard autoconf AC_CHECK_LIB fails to include "bzlib.h", - therefore missing the function definition. - - The compiler thus generates a "C" signature for the test function. - - The linker fails to find the "C" function. - - PCRE fails to configure if asked to do so against libbz2. - -11. When running libtoolize from libtool-2.2.6b as part of autogen.sh, these - messages were output: - - Consider adding `AC_CONFIG_MACRO_DIR([m4])' to configure.ac and - rerunning libtoolize, to keep the correct libtool macros in-tree. - Consider adding `-I m4' to ACLOCAL_AMFLAGS in Makefile.am. - - I have done both of these things. - -12. Although pcre_dfa_exec() does not use nearly as much stack as pcre_exec() - most of the time, it *can* run out if it is given a pattern that contains a - runaway infinite recursion. I updated the discussion in the pcrestack man - page. - -13. Now that we have gone to the x.xx style of version numbers, the minor - version may start with zero. Using 08 or 09 is a bad idea because users - might check the value of PCRE_MINOR in their code, and 08 or 09 may be - interpreted as invalid octal numbers. I've updated the previous comment in - configure.ac, and also added a check that gives an error if 08 or 09 are - used. - -14. Change 8.00/11 was not quite complete: code had been accidentally omitted, - causing partial matching to fail when the end of the subject matched \W - in a UTF-8 pattern where \W was quantified with a minimum of 3. - -15. There were some discrepancies between the declarations in pcre_internal.h - of _pcre_is_newline(), _pcre_was_newline(), and _pcre_valid_utf8() and - their definitions. The declarations used "const uschar *" and the - definitions used USPTR. Even though USPTR is normally defined as "const - unsigned char *" (and uschar is typedeffed as "unsigned char"), it was - reported that: "This difference in casting confuses some C++ compilers, for - example, SunCC recognizes above declarations as different functions and - generates broken code for hbpcre." I have changed the declarations to use - USPTR. - -16. GNU libtool is named differently on some systems. The autogen.sh script now - tries several variants such as glibtoolize (MacOSX) and libtoolize1x - (FreeBSD). - -17. Applied Craig's patch that fixes an HP aCC compile error in pcre 8.00 - (strtoXX undefined when compiling pcrecpp.cc). The patch contains this - comment: "Figure out how to create a longlong from a string: strtoll and - equivalent. It's not enough to call AC_CHECK_FUNCS: hpux has a strtoll, for - instance, but it only takes 2 args instead of 3!" - -18. A subtle bug concerned with back references has been fixed by a change of - specification, with a corresponding code fix. A pattern such as - ^(xa|=?\1a)+$ which contains a back reference inside the group to which it - refers, was giving matches when it shouldn't. For example, xa=xaaa would - match that pattern. Interestingly, Perl (at least up to 5.11.3) has the - same bug. Such groups have to be quantified to be useful, or contained - inside another quantified group. (If there's no repetition, the reference - can never match.) The problem arises because, having left the group and - moved on to the rest of the pattern, a later failure that backtracks into - the group uses the captured value from the final iteration of the group - rather than the correct earlier one. I have fixed this in PCRE by forcing - any group that contains a reference to itself to be an atomic group; that - is, there cannot be any backtracking into it once it has completed. This is - similar to recursive and subroutine calls. - - -Version 8.00 19-Oct-09 ----------------------- - -1. The table for translating pcre_compile() error codes into POSIX error codes - was out-of-date, and there was no check on the pcre_compile() error code - being within the table. This could lead to an OK return being given in - error. - -2. Changed the call to open a subject file in pcregrep from fopen(pathname, - "r") to fopen(pathname, "rb"), which fixed a problem with some of the tests - in a Windows environment. - -3. The pcregrep --count option prints the count for each file even when it is - zero, as does GNU grep. However, pcregrep was also printing all files when - --files-with-matches was added. Now, when both options are given, it prints - counts only for those files that have at least one match. (GNU grep just - prints the file name in this circumstance, but including the count seems - more useful - otherwise, why use --count?) Also ensured that the - combination -clh just lists non-zero counts, with no names. - -4. The long form of the pcregrep -F option was incorrectly implemented as - --fixed_strings instead of --fixed-strings. This is an incompatible change, - but it seems right to fix it, and I didn't think it was worth preserving - the old behaviour. - -5. The command line items --regex=pattern and --regexp=pattern were not - recognized by pcregrep, which required --regex pattern or --regexp pattern - (with a space rather than an '='). The man page documented the '=' forms, - which are compatible with GNU grep; these now work. - -6. No libpcreposix.pc file was created for pkg-config; there was just - libpcre.pc and libpcrecpp.pc. The omission has been rectified. - -7. Added #ifndef SUPPORT_UCP into the pcre_ucd.c module, to reduce its size - when UCP support is not needed, by modifying the Python script that - generates it from Unicode data files. This should not matter if the module - is correctly used as a library, but I received one complaint about 50K of - unwanted data. My guess is that the person linked everything into his - program rather than using a library. Anyway, it does no harm. - -8. A pattern such as /\x{123}{2,2}+/8 was incorrectly compiled; the trigger - was a minimum greater than 1 for a wide character in a possessive - repetition. The same bug could also affect patterns like /(\x{ff}{0,2})*/8 - which had an unlimited repeat of a nested, fixed maximum repeat of a wide - character. Chaos in the form of incorrect output or a compiling loop could - result. - -9. The restrictions on what a pattern can contain when partial matching is - requested for pcre_exec() have been removed. All patterns can now be - partially matched by this function. In addition, if there are at least two - slots in the offset vector, the offset of the earliest inspected character - for the match and the offset of the end of the subject are set in them when - PCRE_ERROR_PARTIAL is returned. - -10. Partial matching has been split into two forms: PCRE_PARTIAL_SOFT, which is - synonymous with PCRE_PARTIAL, for backwards compatibility, and - PCRE_PARTIAL_HARD, which causes a partial match to supersede a full match, - and may be more useful for multi-segment matching. - -11. Partial matching with pcre_exec() is now more intuitive. A partial match - used to be given if ever the end of the subject was reached; now it is - given only if matching could not proceed because another character was - needed. This makes a difference in some odd cases such as Z(*FAIL) with the - string "Z", which now yields "no match" instead of "partial match". In the - case of pcre_dfa_exec(), "no match" is given if every matching path for the - final character ended with (*FAIL). - -12. Restarting a match using pcre_dfa_exec() after a partial match did not work - if the pattern had a "must contain" character that was already found in the - earlier partial match, unless partial matching was again requested. For - example, with the pattern /dog.(body)?/, the "must contain" character is - "g". If the first part-match was for the string "dog", restarting with - "sbody" failed. This bug has been fixed. - -13. The string returned by pcre_dfa_exec() after a partial match has been - changed so that it starts at the first inspected character rather than the - first character of the match. This makes a difference only if the pattern - starts with a lookbehind assertion or \b or \B (\K is not supported by - pcre_dfa_exec()). It's an incompatible change, but it makes the two - matching functions compatible, and I think it's the right thing to do. - -14. Added a pcredemo man page, created automatically from the pcredemo.c file, - so that the demonstration program is easily available in environments where - PCRE has not been installed from source. - -15. Arranged to add -DPCRE_STATIC to cflags in libpcre.pc, libpcreposix.cp, - libpcrecpp.pc and pcre-config when PCRE is not compiled as a shared - library. - -16. Added REG_UNGREEDY to the pcreposix interface, at the request of a user. - It maps to PCRE_UNGREEDY. It is not, of course, POSIX-compatible, but it - is not the first non-POSIX option to be added. Clearly some people find - these options useful. - -17. If a caller to the POSIX matching function regexec() passes a non-zero - value for nmatch with a NULL value for pmatch, the value of - nmatch is forced to zero. - -18. RunGrepTest did not have a test for the availability of the -u option of - the diff command, as RunTest does. It now checks in the same way as - RunTest, and also checks for the -b option. - -19. If an odd number of negated classes containing just a single character - interposed, within parentheses, between a forward reference to a named - subpattern and the definition of the subpattern, compilation crashed with - an internal error, complaining that it could not find the referenced - subpattern. An example of a crashing pattern is /(?&A)(([^m])(?))/. - [The bug was that it was starting one character too far in when skipping - over the character class, thus treating the ] as data rather than - terminating the class. This meant it could skip too much.] - -20. Added PCRE_NOTEMPTY_ATSTART in order to be able to correctly implement the - /g option in pcretest when the pattern contains \K, which makes it possible - to have an empty string match not at the start, even when the pattern is - anchored. Updated pcretest and pcredemo to use this option. - -21. If the maximum number of capturing subpatterns in a recursion was greater - than the maximum at the outer level, the higher number was returned, but - with unset values at the outer level. The correct (outer level) value is - now given. - -22. If (*ACCEPT) appeared inside capturing parentheses, previous releases of - PCRE did not set those parentheses (unlike Perl). I have now found a way to - make it do so. The string so far is captured, making this feature - compatible with Perl. - -23. The tests have been re-organized, adding tests 11 and 12, to make it - possible to check the Perl 5.10 features against Perl 5.10. - -24. Perl 5.10 allows subroutine calls in lookbehinds, as long as the subroutine - pattern matches a fixed length string. PCRE did not allow this; now it - does. Neither allows recursion. - -25. I finally figured out how to implement a request to provide the minimum - length of subject string that was needed in order to match a given pattern. - (It was back references and recursion that I had previously got hung up - on.) This code has now been added to pcre_study(); it finds a lower bound - to the length of subject needed. It is not necessarily the greatest lower - bound, but using it to avoid searching strings that are too short does give - some useful speed-ups. The value is available to calling programs via - pcre_fullinfo(). - -26. While implementing 25, I discovered to my embarrassment that pcretest had - not been passing the result of pcre_study() to pcre_dfa_exec(), so the - study optimizations had never been tested with that matching function. - Oops. What is worse, even when it was passed study data, there was a bug in - pcre_dfa_exec() that meant it never actually used it. Double oops. There - were also very few tests of studied patterns with pcre_dfa_exec(). - -27. If (?| is used to create subpatterns with duplicate numbers, they are now - allowed to have the same name, even if PCRE_DUPNAMES is not set. However, - on the other side of the coin, they are no longer allowed to have different - names, because these cannot be distinguished in PCRE, and this has caused - confusion. (This is a difference from Perl.) - -28. When duplicate subpattern names are present (necessarily with different - numbers, as required by 27 above), and a test is made by name in a - conditional pattern, either for a subpattern having been matched, or for - recursion in such a pattern, all the associated numbered subpatterns are - tested, and the overall condition is true if the condition is true for any - one of them. This is the way Perl works, and is also more like the way - testing by number works. - - -Version 7.9 11-Apr-09 ---------------------- - -1. When building with support for bzlib/zlib (pcregrep) and/or readline - (pcretest), all targets were linked against these libraries. This included - libpcre, libpcreposix, and libpcrecpp, even though they do not use these - libraries. This caused unwanted dependencies to be created. This problem - has been fixed, and now only pcregrep is linked with bzlib/zlib and only - pcretest is linked with readline. - -2. The "typedef int BOOL" in pcre_internal.h that was included inside the - "#ifndef FALSE" condition by an earlier change (probably 7.8/18) has been - moved outside it again, because FALSE and TRUE are already defined in AIX, - but BOOL is not. - -3. The pcre_config() function was treating the PCRE_MATCH_LIMIT and - PCRE_MATCH_LIMIT_RECURSION values as ints, when they should be long ints. - -4. The pcregrep documentation said spaces were inserted as well as colons (or - hyphens) following file names and line numbers when outputting matching - lines. This is not true; no spaces are inserted. I have also clarified the - wording for the --colour (or --color) option. - -5. In pcregrep, when --colour was used with -o, the list of matching strings - was not coloured; this is different to GNU grep, so I have changed it to be - the same. - -6. When --colo(u)r was used in pcregrep, only the first matching substring in - each matching line was coloured. Now it goes on to look for further matches - of any of the test patterns, which is the same behaviour as GNU grep. - -7. A pattern that could match an empty string could cause pcregrep to loop; it - doesn't make sense to accept an empty string match in pcregrep, so I have - locked it out (using PCRE's PCRE_NOTEMPTY option). By experiment, this - seems to be how GNU grep behaves. [But see later change 40 for release - 8.33.] - -8. The pattern (?(?=.*b)b|^) was incorrectly compiled as "match must be at - start or after a newline", because the conditional assertion was not being - correctly handled. The rule now is that both the assertion and what follows - in the first alternative must satisfy the test. - -9. If auto-callout was enabled in a pattern with a conditional group whose - condition was an assertion, PCRE could crash during matching, both with - pcre_exec() and pcre_dfa_exec(). - -10. The PCRE_DOLLAR_ENDONLY option was not working when pcre_dfa_exec() was - used for matching. - -11. Unicode property support in character classes was not working for - characters (bytes) greater than 127 when not in UTF-8 mode. - -12. Added the -M command line option to pcretest. - -14. Added the non-standard REG_NOTEMPTY option to the POSIX interface. - -15. Added the PCRE_NO_START_OPTIMIZE match-time option. - -16. Added comments and documentation about mis-use of no_arg in the C++ - wrapper. - -17. Implemented support for UTF-8 encoding in EBCDIC environments, a patch - from Martin Jerabek that uses macro names for all relevant character and - string constants. - -18. Added to pcre_internal.h two configuration checks: (a) If both EBCDIC and - SUPPORT_UTF8 are set, give an error; (b) If SUPPORT_UCP is set without - SUPPORT_UTF8, define SUPPORT_UTF8. The "configure" script handles both of - these, but not everybody uses configure. - -19. A conditional group that had only one branch was not being correctly - recognized as an item that could match an empty string. This meant that an - enclosing group might also not be so recognized, causing infinite looping - (and probably a segfault) for patterns such as ^"((?(?=[a])[^"])|b)*"$ - with the subject "ab", where knowledge that the repeated group can match - nothing is needed in order to break the loop. - -20. If a pattern that was compiled with callouts was matched using pcre_dfa_ - exec(), but without supplying a callout function, matching went wrong. - -21. If PCRE_ERROR_MATCHLIMIT occurred during a recursion, there was a memory - leak if the size of the offset vector was greater than 30. When the vector - is smaller, the saved offsets during recursion go onto a local stack - vector, but for larger vectors malloc() is used. It was failing to free - when the recursion yielded PCRE_ERROR_MATCH_LIMIT (or any other "abnormal" - error, in fact). - -22. There was a missing #ifdef SUPPORT_UTF8 round one of the variables in the - heapframe that is used only when UTF-8 support is enabled. This caused no - problem, but was untidy. - -23. Steven Van Ingelgem's patch to CMakeLists.txt to change the name - CMAKE_BINARY_DIR to PROJECT_BINARY_DIR so that it works when PCRE is - included within another project. - -24. Steven Van Ingelgem's patches to add more options to the CMake support, - slightly modified by me: - - (a) PCRE_BUILD_TESTS can be set OFF not to build the tests, including - not building pcregrep. - - (b) PCRE_BUILD_PCREGREP can be see OFF not to build pcregrep, but only - if PCRE_BUILD_TESTS is also set OFF, because the tests use pcregrep. - -25. Forward references, both numeric and by name, in patterns that made use of - duplicate group numbers, could behave incorrectly or give incorrect errors, - because when scanning forward to find the reference group, PCRE was not - taking into account the duplicate group numbers. A pattern such as - ^X(?3)(a)(?|(b)|(q))(Y) is an example. - -26. Changed a few more instances of "const unsigned char *" to USPTR, making - the feature of a custom pointer more persuasive (as requested by a user). - -27. Wrapped the definitions of fileno and isatty for Windows, which appear in - pcretest.c, inside #ifndefs, because it seems they are sometimes already - pre-defined. - -28. Added support for (*UTF8) at the start of a pattern. - -29. Arrange for flags added by the "release type" setting in CMake to be shown - in the configuration summary. - - -Version 7.8 05-Sep-08 ---------------------- - -1. Replaced UCP searching code with optimized version as implemented for Ad - Muncher (http://www.admuncher.com/) by Peter Kankowski. This uses a two- - stage table and inline lookup instead of a function, giving speed ups of 2 - to 5 times on some simple patterns that I tested. Permission was given to - distribute the MultiStage2.py script that generates the tables (it's not in - the tarball, but is in the Subversion repository). - -2. Updated the Unicode datatables to Unicode 5.1.0. This adds yet more - scripts. - -3. Change 12 for 7.7 introduced a bug in pcre_study() when a pattern contained - a group with a zero qualifier. The result of the study could be incorrect, - or the function might crash, depending on the pattern. - -4. Caseless matching was not working for non-ASCII characters in back - references. For example, /(\x{de})\1/8i was not matching \x{de}\x{fe}. - It now works when Unicode Property Support is available. - -5. In pcretest, an escape such as \x{de} in the data was always generating - a UTF-8 string, even in non-UTF-8 mode. Now it generates a single byte in - non-UTF-8 mode. If the value is greater than 255, it gives a warning about - truncation. - -6. Minor bugfix in pcrecpp.cc (change "" == ... to NULL == ...). - -7. Added two (int) casts to pcregrep when printing the difference of two - pointers, in case they are 64-bit values. - -8. Added comments about Mac OS X stack usage to the pcrestack man page and to - test 2 if it fails. - -9. Added PCRE_CALL_CONVENTION just before the names of all exported functions, - and a #define of that name to empty if it is not externally set. This is to - allow users of MSVC to set it if necessary. - -10. The PCRE_EXP_DEFN macro which precedes exported functions was missing from - the convenience functions in the pcre_get.c source file. - -11. An option change at the start of a pattern that had top-level alternatives - could cause overwriting and/or a crash. This command provoked a crash in - some environments: - - printf "/(?i)[\xc3\xa9\xc3\xbd]|[\xc3\xa9\xc3\xbdA]/8\n" | pcretest - - This potential security problem was recorded as CVE-2008-2371. - -12. For a pattern where the match had to start at the beginning or immediately - after a newline (e.g /.*anything/ without the DOTALL flag), pcre_exec() and - pcre_dfa_exec() could read past the end of the passed subject if there was - no match. To help with detecting such bugs (e.g. with valgrind), I modified - pcretest so that it places the subject at the end of its malloc-ed buffer. - -13. The change to pcretest in 12 above threw up a couple more cases when pcre_ - exec() might read past the end of the data buffer in UTF-8 mode. - -14. A similar bug to 7.3/2 existed when the PCRE_FIRSTLINE option was set and - the data contained the byte 0x85 as part of a UTF-8 character within its - first line. This applied both to normal and DFA matching. - -15. Lazy qualifiers were not working in some cases in UTF-8 mode. For example, - /^[^d]*?$/8 failed to match "abc". - -16. Added a missing copyright notice to pcrecpp_internal.h. - -17. Make it more clear in the documentation that values returned from - pcre_exec() in ovector are byte offsets, not character counts. - -18. Tidied a few places to stop certain compilers from issuing warnings. - -19. Updated the Virtual Pascal + BCC files to compile the latest v7.7, as - supplied by Stefan Weber. I made a further small update for 7.8 because - there is a change of source arrangements: the pcre_searchfuncs.c module is - replaced by pcre_ucd.c. - - -Version 7.7 07-May-08 ---------------------- - -1. Applied Craig's patch to sort out a long long problem: "If we can't convert - a string to a long long, pretend we don't even have a long long." This is - done by checking for the strtoq, strtoll, and _strtoi64 functions. - -2. Applied Craig's patch to pcrecpp.cc to restore ABI compatibility with - pre-7.6 versions, which defined a global no_arg variable instead of putting - it in the RE class. (See also #8 below.) - -3. Remove a line of dead code, identified by coverity and reported by Nuno - Lopes. - -4. Fixed two related pcregrep bugs involving -r with --include or --exclude: - - (1) The include/exclude patterns were being applied to the whole pathnames - of files, instead of just to the final components. - - (2) If there was more than one level of directory, the subdirectories were - skipped unless they satisfied the include/exclude conditions. This is - inconsistent with GNU grep (and could even be seen as contrary to the - pcregrep specification - which I improved to make it absolutely clear). - The action now is always to scan all levels of directory, and just - apply the include/exclude patterns to regular files. - -5. Added the --include_dir and --exclude_dir patterns to pcregrep, and used - --exclude_dir in the tests to avoid scanning .svn directories. - -6. Applied Craig's patch to the QuoteMeta function so that it escapes the - NUL character as backslash + 0 rather than backslash + NUL, because PCRE - doesn't support NULs in patterns. - -7. Added some missing "const"s to declarations of static tables in - pcre_compile.c and pcre_dfa_exec.c. - -8. Applied Craig's patch to pcrecpp.cc to fix a problem in OS X that was - caused by fix #2 above. (Subsequently also a second patch to fix the - first patch. And a third patch - this was a messy problem.) - -9. Applied Craig's patch to remove the use of push_back(). - -10. Applied Alan Lehotsky's patch to add REG_STARTEND support to the POSIX - matching function regexec(). - -11. Added support for the Oniguruma syntax \g, \g, \g'name', \g'n', - which, however, unlike Perl's \g{...}, are subroutine calls, not back - references. PCRE supports relative numbers with this syntax (I don't think - Oniguruma does). - -12. Previously, a group with a zero repeat such as (...){0} was completely - omitted from the compiled regex. However, this means that if the group - was called as a subroutine from elsewhere in the pattern, things went wrong - (an internal error was given). Such groups are now left in the compiled - pattern, with a new opcode that causes them to be skipped at execution - time. - -13. Added the PCRE_JAVASCRIPT_COMPAT option. This makes the following changes - to the way PCRE behaves: - - (a) A lone ] character is dis-allowed (Perl treats it as data). - - (b) A back reference to an unmatched subpattern matches an empty string - (Perl fails the current match path). - - (c) A data ] in a character class must be notated as \] because if the - first data character in a class is ], it defines an empty class. (In - Perl it is not possible to have an empty class.) The empty class [] - never matches; it forces failure and is equivalent to (*FAIL) or (?!). - The negative empty class [^] matches any one character, independently - of the DOTALL setting. - -14. A pattern such as /(?2)[]a()b](abc)/ which had a forward reference to a - non-existent subpattern following a character class starting with ']' and - containing () gave an internal compiling error instead of "reference to - non-existent subpattern". Fortunately, when the pattern did exist, the - compiled code was correct. (When scanning forwards to check for the - existence of the subpattern, it was treating the data ']' as terminating - the class, so got the count wrong. When actually compiling, the reference - was subsequently set up correctly.) - -15. The "always fail" assertion (?!) is optimzed to (*FAIL) by pcre_compile; - it was being rejected as not supported by pcre_dfa_exec(), even though - other assertions are supported. I have made pcre_dfa_exec() support - (*FAIL). - -16. The implementation of 13c above involved the invention of a new opcode, - OP_ALLANY, which is like OP_ANY but doesn't check the /s flag. Since /s - cannot be changed at match time, I realized I could make a small - improvement to matching performance by compiling OP_ALLANY instead of - OP_ANY for "." when DOTALL was set, and then removing the runtime tests - on the OP_ANY path. - -17. Compiling pcretest on Windows with readline support failed without the - following two fixes: (1) Make the unistd.h include conditional on - HAVE_UNISTD_H; (2) #define isatty and fileno as _isatty and _fileno. - -18. Changed CMakeLists.txt and cmake/FindReadline.cmake to arrange for the - ncurses library to be included for pcretest when ReadLine support is - requested, but also to allow for it to be overridden. This patch came from - Daniel Bergström. - -19. There was a typo in the file ucpinternal.h where f0_rangeflag was defined - as 0x00f00000 instead of 0x00800000. Luckily, this would not have caused - any errors with the current Unicode tables. Thanks to Peter Kankowski for - spotting this. - - -Version 7.6 28-Jan-08 ---------------------- - -1. A character class containing a very large number of characters with - codepoints greater than 255 (in UTF-8 mode, of course) caused a buffer - overflow. - -2. Patch to cut out the "long long" test in pcrecpp_unittest when - HAVE_LONG_LONG is not defined. - -3. Applied Christian Ehrlicher's patch to update the CMake build files to - bring them up to date and include new features. This patch includes: - - - Fixed PH's badly added libz and libbz2 support. - - Fixed a problem with static linking. - - Added pcredemo. [But later removed - see 7 below.] - - Fixed dftables problem and added an option. - - Added a number of HAVE_XXX tests, including HAVE_WINDOWS_H and - HAVE_LONG_LONG. - - Added readline support for pcretest. - - Added an listing of the option settings after cmake has run. - -4. A user submitted a patch to Makefile that makes it easy to create - "pcre.dll" under mingw when using Configure/Make. I added stuff to - Makefile.am that cause it to include this special target, without - affecting anything else. Note that the same mingw target plus all - the other distribution libraries and programs are now supported - when configuring with CMake (see 6 below) instead of with - Configure/Make. - -5. Applied Craig's patch that moves no_arg into the RE class in the C++ code. - This is an attempt to solve the reported problem "pcrecpp::no_arg is not - exported in the Windows port". It has not yet been confirmed that the patch - solves the problem, but it does no harm. - -6. Applied Sheri's patch to CMakeLists.txt to add NON_STANDARD_LIB_PREFIX and - NON_STANDARD_LIB_SUFFIX for dll names built with mingw when configured - with CMake, and also correct the comment about stack recursion. - -7. Remove the automatic building of pcredemo from the ./configure system and - from CMakeLists.txt. The whole idea of pcredemo.c is that it is an example - of a program that users should build themselves after PCRE is installed, so - building it automatically is not really right. What is more, it gave - trouble in some build environments. - -8. Further tidies to CMakeLists.txt from Sheri and Christian. - - -Version 7.5 10-Jan-08 ---------------------- - -1. Applied a patch from Craig: "This patch makes it possible to 'ignore' - values in parens when parsing an RE using the C++ wrapper." - -2. Negative specials like \S did not work in character classes in UTF-8 mode. - Characters greater than 255 were excluded from the class instead of being - included. - -3. The same bug as (2) above applied to negated POSIX classes such as - [:^space:]. - -4. PCRECPP_STATIC was referenced in pcrecpp_internal.h, but nowhere was it - defined or documented. It seems to have been a typo for PCRE_STATIC, so - I have changed it. - -5. The construct (?&) was not diagnosed as a syntax error (it referenced the - first named subpattern) and a construct such as (?&a) would reference the - first named subpattern whose name started with "a" (in other words, the - length check was missing). Both these problems are fixed. "Subpattern name - expected" is now given for (?&) (a zero-length name), and this patch also - makes it give the same error for \k'' (previously it complained that that - was a reference to a non-existent subpattern). - -6. The erroneous patterns (?+-a) and (?-+a) give different error messages; - this is right because (?- can be followed by option settings as well as by - digits. I have, however, made the messages clearer. - -7. Patterns such as (?(1)a|b) (a pattern that contains fewer subpatterns - than the number used in the conditional) now cause a compile-time error. - This is actually not compatible with Perl, which accepts such patterns, but - treats the conditional as always being FALSE (as PCRE used to), but it - seems to me that giving a diagnostic is better. - -8. Change "alphameric" to the more common word "alphanumeric" in comments - and messages. - -9. Fix two occurrences of "backslash" in comments that should have been - "backspace". - -10. Remove two redundant lines of code that can never be obeyed (their function - was moved elsewhere). - -11. The program that makes PCRE's Unicode character property table had a bug - which caused it to generate incorrect table entries for sequences of - characters that have the same character type, but are in different scripts. - It amalgamated them into a single range, with the script of the first of - them. In other words, some characters were in the wrong script. There were - thirteen such cases, affecting characters in the following ranges: - - U+002b0 - U+002c1 - U+0060c - U+0060d - U+0061e - U+00612 - U+0064b - U+0065e - U+0074d - U+0076d - U+01800 - U+01805 - U+01d00 - U+01d77 - U+01d9b - U+01dbf - U+0200b - U+0200f - U+030fc - U+030fe - U+03260 - U+0327f - U+0fb46 - U+0fbb1 - U+10450 - U+1049d - -12. The -o option (show only the matching part of a line) for pcregrep was not - compatible with GNU grep in that, if there was more than one match in a - line, it showed only the first of them. It now behaves in the same way as - GNU grep. - -13. If the -o and -v options were combined for pcregrep, it printed a blank - line for every non-matching line. GNU grep prints nothing, and pcregrep now - does the same. The return code can be used to tell if there were any - non-matching lines. - -14. Added --file-offsets and --line-offsets to pcregrep. - -15. The pattern (?=something)(?R) was not being diagnosed as a potentially - infinitely looping recursion. The bug was that positive lookaheads were not - being skipped when checking for a possible empty match (negative lookaheads - and both kinds of lookbehind were skipped). - -16. Fixed two typos in the Windows-only code in pcregrep.c, and moved the - inclusion of to before rather than after the definition of - INVALID_FILE_ATTRIBUTES (patch from David Byron). - -17. Specifying a possessive quantifier with a specific limit for a Unicode - character property caused pcre_compile() to compile bad code, which led at - runtime to PCRE_ERROR_INTERNAL (-14). Examples of patterns that caused this - are: /\p{Zl}{2,3}+/8 and /\p{Cc}{2}+/8. It was the possessive "+" that - caused the error; without that there was no problem. - -18. Added --enable-pcregrep-libz and --enable-pcregrep-libbz2. - -19. Added --enable-pcretest-libreadline. - -20. In pcrecpp.cc, the variable 'count' was incremented twice in - RE::GlobalReplace(). As a result, the number of replacements returned was - double what it should be. I removed one of the increments, but Craig sent a - later patch that removed the other one (the right fix) and added unit tests - that check the return values (which was not done before). - -21. Several CMake things: - - (1) Arranged that, when cmake is used on Unix, the libraries end up with - the names libpcre and libpcreposix, not just pcre and pcreposix. - - (2) The above change means that pcretest and pcregrep are now correctly - linked with the newly-built libraries, not previously installed ones. - - (3) Added PCRE_SUPPORT_LIBREADLINE, PCRE_SUPPORT_LIBZ, PCRE_SUPPORT_LIBBZ2. - -22. In UTF-8 mode, with newline set to "any", a pattern such as .*a.*=.b.* - crashed when matching a string such as a\x{2029}b (note that \x{2029} is a - UTF-8 newline character). The key issue is that the pattern starts .*; - this means that the match must be either at the beginning, or after a - newline. The bug was in the code for advancing after a failed match and - checking that the new position followed a newline. It was not taking - account of UTF-8 characters correctly. - -23. PCRE was behaving differently from Perl in the way it recognized POSIX - character classes. PCRE was not treating the sequence [:...:] as a - character class unless the ... were all letters. Perl, however, seems to - allow any characters between [: and :], though of course it rejects as - unknown any "names" that contain non-letters, because all the known class - names consist only of letters. Thus, Perl gives an error for [[:1234:]], - for example, whereas PCRE did not - it did not recognize a POSIX character - class. This seemed a bit dangerous, so the code has been changed to be - closer to Perl. The behaviour is not identical to Perl, because PCRE will - diagnose an unknown class for, for example, [[:l\ower:]] where Perl will - treat it as [[:lower:]]. However, PCRE does now give "unknown" errors where - Perl does, and where it didn't before. - -24. Rewrite so as to remove the single use of %n from pcregrep because in some - Windows environments %n is disabled by default. - - -Version 7.4 21-Sep-07 ---------------------- - -1. Change 7.3/28 was implemented for classes by looking at the bitmap. This - means that a class such as [\s] counted as "explicit reference to CR or - LF". That isn't really right - the whole point of the change was to try to - help when there was an actual mention of one of the two characters. So now - the change happens only if \r or \n (or a literal CR or LF) character is - encountered. - -2. The 32-bit options word was also used for 6 internal flags, but the numbers - of both had grown to the point where there were only 3 bits left. - Fortunately, there was spare space in the data structure, and so I have - moved the internal flags into a new 16-bit field to free up more option - bits. - -3. The appearance of (?J) at the start of a pattern set the DUPNAMES option, - but did not set the internal JCHANGED flag - either of these is enough to - control the way the "get" function works - but the PCRE_INFO_JCHANGED - facility is supposed to tell if (?J) was ever used, so now (?J) at the - start sets both bits. - -4. Added options (at build time, compile time, exec time) to change \R from - matching any Unicode line ending sequence to just matching CR, LF, or CRLF. - -5. doc/pcresyntax.html was missing from the distribution. - -6. Put back the definition of PCRE_ERROR_NULLWSLIMIT, for backward - compatibility, even though it is no longer used. - -7. Added macro for snprintf to pcrecpp_unittest.cc and also for strtoll and - strtoull to pcrecpp.cc to select the available functions in WIN32 when the - windows.h file is present (where different names are used). [This was - reversed later after testing - see 16 below.] - -8. Changed all #include to #include "config.h". There were also - some further cases that I changed to "pcre.h". - -9. When pcregrep was used with the --colour option, it missed the line ending - sequence off the lines that it output. - -10. It was pointed out to me that arrays of string pointers cause lots of - relocations when a shared library is dynamically loaded. A technique of - using a single long string with a table of offsets can drastically reduce - these. I have refactored PCRE in four places to do this. The result is - dramatic: - - Originally: 290 - After changing UCP table: 187 - After changing error message table: 43 - After changing table of "verbs" 36 - After changing table of Posix names 22 - - Thanks to the folks working on Gregex for glib for this insight. - -11. --disable-stack-for-recursion caused compiling to fail unless -enable- - unicode-properties was also set. - -12. Updated the tests so that they work when \R is defaulted to ANYCRLF. - -13. Added checks for ANY and ANYCRLF to pcrecpp.cc where it previously - checked only for CRLF. - -14. Added casts to pcretest.c to avoid compiler warnings. - -15. Added Craig's patch to various pcrecpp modules to avoid compiler warnings. - -16. Added Craig's patch to remove the WINDOWS_H tests, that were not working, - and instead check for _strtoi64 explicitly, and avoid the use of snprintf() - entirely. This removes changes made in 7 above. - -17. The CMake files have been updated, and there is now more information about - building with CMake in the NON-UNIX-USE document. - - -Version 7.3 28-Aug-07 ---------------------- - - 1. In the rejigging of the build system that eventually resulted in 7.1, the - line "#include " was included in pcre_internal.h. The use of angle - brackets there is not right, since it causes compilers to look for an - installed pcre.h, not the version that is in the source that is being - compiled (which of course may be different). I have changed it back to: - - #include "pcre.h" - - I have a vague recollection that the change was concerned with compiling in - different directories, but in the new build system, that is taken care of - by the VPATH setting the Makefile. - - 2. The pattern .*$ when run in not-DOTALL UTF-8 mode with newline=any failed - when the subject happened to end in the byte 0x85 (e.g. if the last - character was \x{1ec5}). *Character* 0x85 is one of the "any" newline - characters but of course it shouldn't be taken as a newline when it is part - of another character. The bug was that, for an unlimited repeat of . in - not-DOTALL UTF-8 mode, PCRE was advancing by bytes rather than by - characters when looking for a newline. - - 3. A small performance improvement in the DOTALL UTF-8 mode .* case. - - 4. Debugging: adjusted the names of opcodes for different kinds of parentheses - in debug output. - - 5. Arrange to use "%I64d" instead of "%lld" and "%I64u" instead of "%llu" for - long printing in the pcrecpp unittest when running under MinGW. - - 6. ESC_K was left out of the EBCDIC table. - - 7. Change 7.0/38 introduced a new limit on the number of nested non-capturing - parentheses; I made it 1000, which seemed large enough. Unfortunately, the - limit also applies to "virtual nesting" when a pattern is recursive, and in - this case 1000 isn't so big. I have been able to remove this limit at the - expense of backing off one optimization in certain circumstances. Normally, - when pcre_exec() would call its internal match() function recursively and - immediately return the result unconditionally, it uses a "tail recursion" - feature to save stack. However, when a subpattern that can match an empty - string has an unlimited repetition quantifier, it no longer makes this - optimization. That gives it a stack frame in which to save the data for - checking that an empty string has been matched. Previously this was taken - from the 1000-entry workspace that had been reserved. So now there is no - explicit limit, but more stack is used. - - 8. Applied Daniel's patches to solve problems with the import/export magic - syntax that is required for Windows, and which was going wrong for the - pcreposix and pcrecpp parts of the library. These were overlooked when this - problem was solved for the main library. - - 9. There were some crude static tests to avoid integer overflow when computing - the size of patterns that contain repeated groups with explicit upper - limits. As the maximum quantifier is 65535, the maximum group length was - set at 30,000 so that the product of these two numbers did not overflow a - 32-bit integer. However, it turns out that people want to use groups that - are longer than 30,000 bytes (though not repeat them that many times). - Change 7.0/17 (the refactoring of the way the pattern size is computed) has - made it possible to implement the integer overflow checks in a much more - dynamic way, which I have now done. The artificial limitation on group - length has been removed - we now have only the limit on the total length of - the compiled pattern, which depends on the LINK_SIZE setting. - -10. Fixed a bug in the documentation for get/copy named substring when - duplicate names are permitted. If none of the named substrings are set, the - functions return PCRE_ERROR_NOSUBSTRING (7); the doc said they returned an - empty string. - -11. Because Perl interprets \Q...\E at a high level, and ignores orphan \E - instances, patterns such as [\Q\E] or [\E] or even [^\E] cause an error, - because the ] is interpreted as the first data character and the - terminating ] is not found. PCRE has been made compatible with Perl in this - regard. Previously, it interpreted [\Q\E] as an empty class, and [\E] could - cause memory overwriting. - -10. Like Perl, PCRE automatically breaks an unlimited repeat after an empty - string has been matched (to stop an infinite loop). It was not recognizing - a conditional subpattern that could match an empty string if that - subpattern was within another subpattern. For example, it looped when - trying to match (((?(1)X|))*) but it was OK with ((?(1)X|)*) where the - condition was not nested. This bug has been fixed. - -12. A pattern like \X?\d or \P{L}?\d in non-UTF-8 mode could cause a backtrack - past the start of the subject in the presence of bytes with the top bit - set, for example "\x8aBCD". - -13. Added Perl 5.10 experimental backtracking controls (*FAIL), (*F), (*PRUNE), - (*SKIP), (*THEN), (*COMMIT), and (*ACCEPT). - -14. Optimized (?!) to (*FAIL). - -15. Updated the test for a valid UTF-8 string to conform to the later RFC 3629. - This restricts code points to be within the range 0 to 0x10FFFF, excluding - the "low surrogate" sequence 0xD800 to 0xDFFF. Previously, PCRE allowed the - full range 0 to 0x7FFFFFFF, as defined by RFC 2279. Internally, it still - does: it's just the validity check that is more restrictive. - -16. Inserted checks for integer overflows during escape sequence (backslash) - processing, and also fixed erroneous offset values for syntax errors during - backslash processing. - -17. Fixed another case of looking too far back in non-UTF-8 mode (cf 12 above) - for patterns like [\PPP\x8a]{1,}\x80 with the subject "A\x80". - -18. An unterminated class in a pattern like (?1)\c[ with a "forward reference" - caused an overrun. - -19. A pattern like (?:[\PPa*]*){8,} which had an "extended class" (one with - something other than just ASCII characters) inside a group that had an - unlimited repeat caused a loop at compile time (while checking to see - whether the group could match an empty string). - -20. Debugging a pattern containing \p or \P could cause a crash. For example, - [\P{Any}] did so. (Error in the code for printing property names.) - -21. An orphan \E inside a character class could cause a crash. - -22. A repeated capturing bracket such as (A)? could cause a wild memory - reference during compilation. - -23. There are several functions in pcre_compile() that scan along a compiled - expression for various reasons (e.g. to see if it's fixed length for look - behind). There were bugs in these functions when a repeated \p or \P was - present in the pattern. These operators have additional parameters compared - with \d, etc, and these were not being taken into account when moving along - the compiled data. Specifically: - - (a) A item such as \p{Yi}{3} in a lookbehind was not treated as fixed - length. - - (b) An item such as \pL+ within a repeated group could cause crashes or - loops. - - (c) A pattern such as \p{Yi}+(\P{Yi}+)(?1) could give an incorrect - "reference to non-existent subpattern" error. - - (d) A pattern like (\P{Yi}{2}\277)? could loop at compile time. - -24. A repeated \S or \W in UTF-8 mode could give wrong answers when multibyte - characters were involved (for example /\S{2}/8g with "A\x{a3}BC"). - -25. Using pcregrep in multiline, inverted mode (-Mv) caused it to loop. - -26. Patterns such as [\P{Yi}A] which include \p or \P and just one other - character were causing crashes (broken optimization). - -27. Patterns such as (\P{Yi}*\277)* (group with possible zero repeat containing - \p or \P) caused a compile-time loop. - -28. More problems have arisen in unanchored patterns when CRLF is a valid line - break. For example, the unstudied pattern [\r\n]A does not match the string - "\r\nA" because change 7.0/46 below moves the current point on by two - characters after failing to match at the start. However, the pattern \nA - *does* match, because it doesn't start till \n, and if [\r\n]A is studied, - the same is true. There doesn't seem any very clean way out of this, but - what I have chosen to do makes the common cases work: PCRE now takes note - of whether there can be an explicit match for \r or \n anywhere in the - pattern, and if so, 7.0/46 no longer applies. As part of this change, - there's a new PCRE_INFO_HASCRORLF option for finding out whether a compiled - pattern has explicit CR or LF references. - -29. Added (*CR) etc for changing newline setting at start of pattern. - - -Version 7.2 19-Jun-07 ---------------------- - - 1. If the fr_FR locale cannot be found for test 3, try the "french" locale, - which is apparently normally available under Windows. - - 2. Re-jig the pcregrep tests with different newline settings in an attempt - to make them independent of the local environment's newline setting. - - 3. Add code to configure.ac to remove -g from the CFLAGS default settings. - - 4. Some of the "internals" tests were previously cut out when the link size - was not 2, because the output contained actual offsets. The recent new - "Z" feature of pcretest means that these can be cut out, making the tests - usable with all link sizes. - - 5. Implemented Stan Switzer's goto replacement for longjmp() when not using - stack recursion. This gives a massive performance boost under BSD, but just - a small improvement under Linux. However, it saves one field in the frame - in all cases. - - 6. Added more features from the forthcoming Perl 5.10: - - (a) (?-n) (where n is a string of digits) is a relative subroutine or - recursion call. It refers to the nth most recently opened parentheses. - - (b) (?+n) is also a relative subroutine call; it refers to the nth next - to be opened parentheses. - - (c) Conditions that refer to capturing parentheses can be specified - relatively, for example, (?(-2)... or (?(+3)... - - (d) \K resets the start of the current match so that everything before - is not part of it. - - (e) \k{name} is synonymous with \k and \k'name' (.NET compatible). - - (f) \g{name} is another synonym - part of Perl 5.10's unification of - reference syntax. - - (g) (?| introduces a group in which the numbering of parentheses in each - alternative starts with the same number. - - (h) \h, \H, \v, and \V match horizontal and vertical whitespace. - - 7. Added two new calls to pcre_fullinfo(): PCRE_INFO_OKPARTIAL and - PCRE_INFO_JCHANGED. - - 8. A pattern such as (.*(.)?)* caused pcre_exec() to fail by either not - terminating or by crashing. Diagnosed by Viktor Griph; it was in the code - for detecting groups that can match an empty string. - - 9. A pattern with a very large number of alternatives (more than several - hundred) was running out of internal workspace during the pre-compile - phase, where pcre_compile() figures out how much memory will be needed. A - bit of new cunning has reduced the workspace needed for groups with - alternatives. The 1000-alternative test pattern now uses 12 bytes of - workspace instead of running out of the 4096 that are available. - -10. Inserted some missing (unsigned int) casts to get rid of compiler warnings. - -11. Applied patch from Google to remove an optimization that didn't quite work. - The report of the bug said: - - pcrecpp::RE("a*").FullMatch("aaa") matches, while - pcrecpp::RE("a*?").FullMatch("aaa") does not, and - pcrecpp::RE("a*?\\z").FullMatch("aaa") does again. - -12. If \p or \P was used in non-UTF-8 mode on a character greater than 127 - it matched the wrong number of bytes. - - -Version 7.1 24-Apr-07 ---------------------- - - 1. Applied Bob Rossi and Daniel G's patches to convert the build system to one - that is more "standard", making use of automake and other Autotools. There - is some re-arrangement of the files and adjustment of comments consequent - on this. - - 2. Part of the patch fixed a problem with the pcregrep tests. The test of -r - for recursive directory scanning broke on some systems because the files - are not scanned in any specific order and on different systems the order - was different. A call to "sort" has been inserted into RunGrepTest for the - approprate test as a short-term fix. In the longer term there may be an - alternative. - - 3. I had an email from Eric Raymond about problems translating some of PCRE's - man pages to HTML (despite the fact that I distribute HTML pages, some - people do their own conversions for various reasons). The problems - concerned the use of low-level troff macros .br and .in. I have therefore - removed all such uses from the man pages (some were redundant, some could - be replaced by .nf/.fi pairs). The 132html script that I use to generate - HTML has been updated to handle .nf/.fi and to complain if it encounters - .br or .in. - - 4. Updated comments in configure.ac that get placed in config.h.in and also - arranged for config.h to be included in the distribution, with the name - config.h.generic, for the benefit of those who have to compile without - Autotools (compare pcre.h, which is now distributed as pcre.h.generic). - - 5. Updated the support (such as it is) for Virtual Pascal, thanks to Stefan - Weber: (1) pcre_internal.h was missing some function renames; (2) updated - makevp.bat for the current PCRE, using the additional files - makevp_c.txt, makevp_l.txt, and pcregexp.pas. - - 6. A Windows user reported a minor discrepancy with test 2, which turned out - to be caused by a trailing space on an input line that had got lost in his - copy. The trailing space was an accident, so I've just removed it. - - 7. Add -Wl,-R... flags in pcre-config.in for *BSD* systems, as I'm told - that is needed. - - 8. Mark ucp_table (in ucptable.h) and ucp_gentype (in pcre_ucp_searchfuncs.c) - as "const" (a) because they are and (b) because it helps the PHP - maintainers who have recently made a script to detect big data structures - in the php code that should be moved to the .rodata section. I remembered - to update Builducptable as well, so it won't revert if ucptable.h is ever - re-created. - - 9. Added some extra #ifdef SUPPORT_UTF8 conditionals into pcretest.c, - pcre_printint.src, pcre_compile.c, pcre_study.c, and pcre_tables.c, in - order to be able to cut out the UTF-8 tables in the latter when UTF-8 - support is not required. This saves 1.5-2K of code, which is important in - some applications. - - Later: more #ifdefs are needed in pcre_ord2utf8.c and pcre_valid_utf8.c - so as not to refer to the tables, even though these functions will never be - called when UTF-8 support is disabled. Otherwise there are problems with a - shared library. - -10. Fixed two bugs in the emulated memmove() function in pcre_internal.h: - - (a) It was defining its arguments as char * instead of void *. - - (b) It was assuming that all moves were upwards in memory; this was true - a long time ago when I wrote it, but is no longer the case. - - The emulated memove() is provided for those environments that have neither - memmove() nor bcopy(). I didn't think anyone used it these days, but that - is clearly not the case, as these two bugs were recently reported. - -11. The script PrepareRelease is now distributed: it calls 132html, CleanTxt, - and Detrail to create the HTML documentation, the .txt form of the man - pages, and it removes trailing spaces from listed files. It also creates - pcre.h.generic and config.h.generic from pcre.h and config.h. In the latter - case, it wraps all the #defines with #ifndefs. This script should be run - before "make dist". - -12. Fixed two fairly obscure bugs concerned with quantified caseless matching - with Unicode property support. - - (a) For a maximizing quantifier, if the two different cases of the - character were of different lengths in their UTF-8 codings (there are - some cases like this - I found 11), and the matching function had to - back up over a mixture of the two cases, it incorrectly assumed they - were both the same length. - - (b) When PCRE was configured to use the heap rather than the stack for - recursion during matching, it was not correctly preserving the data for - the other case of a UTF-8 character when checking ahead for a match - while processing a minimizing repeat. If the check also involved - matching a wide character, but failed, corruption could cause an - erroneous result when trying to check for a repeat of the original - character. - -13. Some tidying changes to the testing mechanism: - - (a) The RunTest script now detects the internal link size and whether there - is UTF-8 and UCP support by running ./pcretest -C instead of relying on - values substituted by "configure". (The RunGrepTest script already did - this for UTF-8.) The configure.ac script no longer substitutes the - relevant variables. - - (b) The debugging options /B and /D in pcretest show the compiled bytecode - with length and offset values. This means that the output is different - for different internal link sizes. Test 2 is skipped for link sizes - other than 2 because of this, bypassing the problem. Unfortunately, - there was also a test in test 3 (the locale tests) that used /B and - failed for link sizes other than 2. Rather than cut the whole test out, - I have added a new /Z option to pcretest that replaces the length and - offset values with spaces. This is now used to make test 3 independent - of link size. (Test 2 will be tidied up later.) - -14. If erroroffset was passed as NULL to pcre_compile, it provoked a - segmentation fault instead of returning the appropriate error message. - -15. In multiline mode when the newline sequence was set to "any", the pattern - ^$ would give a match between the \r and \n of a subject such as "A\r\nB". - This doesn't seem right; it now treats the CRLF combination as the line - ending, and so does not match in that case. It's only a pattern such as ^$ - that would hit this one: something like ^ABC$ would have failed after \r - and then tried again after \r\n. - -16. Changed the comparison command for RunGrepTest from "diff -u" to "diff -ub" - in an attempt to make files that differ only in their line terminators - compare equal. This works on Linux. - -17. Under certain error circumstances pcregrep might try to free random memory - as it exited. This is now fixed, thanks to valgrind. - -19. In pcretest, if the pattern /(?m)^$/g was matched against the string - "abc\r\n\r\n", it found an unwanted second match after the second \r. This - was because its rules for how to advance for /g after matching an empty - string at the end of a line did not allow for this case. They now check for - it specially. - -20. pcretest is supposed to handle patterns and data of any length, by - extending its buffers when necessary. It was getting this wrong when the - buffer for a data line had to be extended. - -21. Added PCRE_NEWLINE_ANYCRLF which is like ANY, but matches only CR, LF, or - CRLF as a newline sequence. - -22. Code for handling Unicode properties in pcre_dfa_exec() wasn't being cut - out by #ifdef SUPPORT_UCP. This did no harm, as it could never be used, but - I have nevertheless tidied it up. - -23. Added some casts to kill warnings from HP-UX ia64 compiler. - -24. Added a man page for pcre-config. - - -Version 7.0 19-Dec-06 ---------------------- - - 1. Fixed a signed/unsigned compiler warning in pcre_compile.c, shown up by - moving to gcc 4.1.1. - - 2. The -S option for pcretest uses setrlimit(); I had omitted to #include - sys/time.h, which is documented as needed for this function. It doesn't - seem to matter on Linux, but it showed up on some releases of OS X. - - 3. It seems that there are systems where bytes whose values are greater than - 127 match isprint() in the "C" locale. The "C" locale should be the - default when a C program starts up. In most systems, only ASCII printing - characters match isprint(). This difference caused the output from pcretest - to vary, making some of the tests fail. I have changed pcretest so that: - - (a) When it is outputting text in the compiled version of a pattern, bytes - other than 32-126 are always shown as hex escapes. - - (b) When it is outputting text that is a matched part of a subject string, - it does the same, unless a different locale has been set for the match - (using the /L modifier). In this case, it uses isprint() to decide. - - 4. Fixed a major bug that caused incorrect computation of the amount of memory - required for a compiled pattern when options that changed within the - pattern affected the logic of the preliminary scan that determines the - length. The relevant options are -x, and -i in UTF-8 mode. The result was - that the computed length was too small. The symptoms of this bug were - either the PCRE error "internal error: code overflow" from pcre_compile(), - or a glibc crash with a message such as "pcretest: free(): invalid next - size (fast)". Examples of patterns that provoked this bug (shown in - pcretest format) are: - - /(?-x: )/x - /(?x)(?-x: \s*#\s*)/ - /((?i)[\x{c0}])/8 - /(?i:[\x{c0}])/8 - - HOWEVER: Change 17 below makes this fix obsolete as the memory computation - is now done differently. - - 5. Applied patches from Google to: (a) add a QuoteMeta function to the C++ - wrapper classes; (b) implement a new function in the C++ scanner that is - more efficient than the old way of doing things because it avoids levels of - recursion in the regex matching; (c) add a paragraph to the documentation - for the FullMatch() function. - - 6. The escape sequence \n was being treated as whatever was defined as - "newline". Not only was this contrary to the documentation, which states - that \n is character 10 (hex 0A), but it also went horribly wrong when - "newline" was defined as CRLF. This has been fixed. - - 7. In pcre_dfa_exec.c the value of an unsigned integer (the variable called c) - was being set to -1 for the "end of line" case (supposedly a value that no - character can have). Though this value is never used (the check for end of - line is "zero bytes in current character"), it caused compiler complaints. - I've changed it to 0xffffffff. - - 8. In pcre_version.c, the version string was being built by a sequence of - C macros that, in the event of PCRE_PRERELEASE being defined as an empty - string (as it is for production releases) called a macro with an empty - argument. The C standard says the result of this is undefined. The gcc - compiler treats it as an empty string (which was what was wanted) but it is - reported that Visual C gives an error. The source has been hacked around to - avoid this problem. - - 9. On the advice of a Windows user, included and in Windows - builds of pcretest, and changed the call to _setmode() to use _O_BINARY - instead of 0x8000. Made all the #ifdefs test both _WIN32 and WIN32 (not all - of them did). - -10. Originally, pcretest opened its input and output without "b"; then I was - told that "b" was needed in some environments, so it was added for release - 5.0 to both the input and output. (It makes no difference on Unix-like - systems.) Later I was told that it is wrong for the input on Windows. I've - now abstracted the modes into two macros, to make it easier to fiddle with - them, and removed "b" from the input mode under Windows. - -11. Added pkgconfig support for the C++ wrapper library, libpcrecpp. - -12. Added -help and --help to pcretest as an official way of being reminded - of the options. - -13. Removed some redundant semicolons after macro calls in pcrecpparg.h.in - and pcrecpp.cc because they annoy compilers at high warning levels. - -14. A bit of tidying/refactoring in pcre_exec.c in the main bumpalong loop. - -15. Fixed an occurrence of == in configure.ac that should have been = (shell - scripts are not C programs :-) and which was not noticed because it works - on Linux. - -16. pcretest is supposed to handle any length of pattern and data line (as one - line or as a continued sequence of lines) by extending its input buffer if - necessary. This feature was broken for very long pattern lines, leading to - a string of junk being passed to pcre_compile() if the pattern was longer - than about 50K. - -17. I have done a major re-factoring of the way pcre_compile() computes the - amount of memory needed for a compiled pattern. Previously, there was code - that made a preliminary scan of the pattern in order to do this. That was - OK when PCRE was new, but as the facilities have expanded, it has become - harder and harder to keep it in step with the real compile phase, and there - have been a number of bugs (see for example, 4 above). I have now found a - cunning way of running the real compile function in a "fake" mode that - enables it to compute how much memory it would need, while actually only - ever using a few hundred bytes of working memory and without too many - tests of the mode. This should make future maintenance and development - easier. A side effect of this work is that the limit of 200 on the nesting - depth of parentheses has been removed (though this was never a serious - limitation, I suspect). However, there is a downside: pcre_compile() now - runs more slowly than before (30% or more, depending on the pattern). I - hope this isn't a big issue. There is no effect on runtime performance. - -18. Fixed a minor bug in pcretest: if a pattern line was not terminated by a - newline (only possible for the last line of a file) and it was a - pattern that set a locale (followed by /Lsomething), pcretest crashed. - -19. Added additional timing features to pcretest. (1) The -tm option now times - matching only, not compiling. (2) Both -t and -tm can be followed, as a - separate command line item, by a number that specifies the number of - repeats to use when timing. The default is 50000; this gives better - precision, but takes uncomfortably long for very large patterns. - -20. Extended pcre_study() to be more clever in cases where a branch of a - subpattern has no definite first character. For example, (a*|b*)[cd] would - previously give no result from pcre_study(). Now it recognizes that the - first character must be a, b, c, or d. - -21. There was an incorrect error "recursive call could loop indefinitely" if - a subpattern (or the entire pattern) that was being tested for matching an - empty string contained only one non-empty item after a nested subpattern. - For example, the pattern (?>\x{100}*)\d(?R) provoked this error - incorrectly, because the \d was being skipped in the check. - -22. The pcretest program now has a new pattern option /B and a command line - option -b, which is equivalent to adding /B to every pattern. This causes - it to show the compiled bytecode, without the additional information that - -d shows. The effect of -d is now the same as -b with -i (and similarly, /D - is the same as /B/I). - -23. A new optimization is now able automatically to treat some sequences such - as a*b as a*+b. More specifically, if something simple (such as a character - or a simple class like \d) has an unlimited quantifier, and is followed by - something that cannot possibly match the quantified thing, the quantifier - is automatically "possessified". - -24. A recursive reference to a subpattern whose number was greater than 39 - went wrong under certain circumstances in UTF-8 mode. This bug could also - have affected the operation of pcre_study(). - -25. Realized that a little bit of performance could be had by replacing - (c & 0xc0) == 0xc0 with c >= 0xc0 when processing UTF-8 characters. - -26. Timing data from pcretest is now shown to 4 decimal places instead of 3. - -27. Possessive quantifiers such as a++ were previously implemented by turning - them into atomic groups such as ($>a+). Now they have their own opcodes, - which improves performance. This includes the automatically created ones - from 23 above. - -28. A pattern such as (?=(\w+))\1: which simulates an atomic group using a - lookahead was broken if it was not anchored. PCRE was mistakenly expecting - the first matched character to be a colon. This applied both to named and - numbered groups. - -29. The ucpinternal.h header file was missing its idempotency #ifdef. - -30. I was sent a "project" file called libpcre.a.dev which I understand makes - building PCRE on Windows easier, so I have included it in the distribution. - -31. There is now a check in pcretest against a ridiculously large number being - returned by pcre_exec() or pcre_dfa_exec(). If this happens in a /g or /G - loop, the loop is abandoned. - -32. Forward references to subpatterns in conditions such as (?(2)...) where - subpattern 2 is defined later cause pcre_compile() to search forwards in - the pattern for the relevant set of parentheses. This search went wrong - when there were unescaped parentheses in a character class, parentheses - escaped with \Q...\E, or parentheses in a #-comment in /x mode. - -33. "Subroutine" calls and backreferences were previously restricted to - referencing subpatterns earlier in the regex. This restriction has now - been removed. - -34. Added a number of extra features that are going to be in Perl 5.10. On the - whole, these are just syntactic alternatives for features that PCRE had - previously implemented using the Python syntax or my own invention. The - other formats are all retained for compatibility. - - (a) Named groups can now be defined as (?...) or (?'name'...) as well - as (?P...). The new forms, as well as being in Perl 5.10, are - also .NET compatible. - - (b) A recursion or subroutine call to a named group can now be defined as - (?&name) as well as (?P>name). - - (c) A backreference to a named group can now be defined as \k or - \k'name' as well as (?P=name). The new forms, as well as being in Perl - 5.10, are also .NET compatible. - - (d) A conditional reference to a named group can now use the syntax - (?() or (?('name') as well as (?(name). - - (e) A "conditional group" of the form (?(DEFINE)...) can be used to define - groups (named and numbered) that are never evaluated inline, but can be - called as "subroutines" from elsewhere. In effect, the DEFINE condition - is always false. There may be only one alternative in such a group. - - (f) A test for recursion can be given as (?(R1).. or (?(R&name)... as well - as the simple (?(R). The condition is true only if the most recent - recursion is that of the given number or name. It does not search out - through the entire recursion stack. - - (g) The escape \gN or \g{N} has been added, where N is a positive or - negative number, specifying an absolute or relative reference. - -35. Tidied to get rid of some further signed/unsigned compiler warnings and - some "unreachable code" warnings. - -36. Updated the Unicode property tables to Unicode version 5.0.0. Amongst other - things, this adds five new scripts. - -37. Perl ignores orphaned \E escapes completely. PCRE now does the same. - There were also incompatibilities regarding the handling of \Q..\E inside - character classes, for example with patterns like [\Qa\E-\Qz\E] where the - hyphen was adjacent to \Q or \E. I hope I've cleared all this up now. - -38. Like Perl, PCRE detects when an indefinitely repeated parenthesized group - matches an empty string, and forcibly breaks the loop. There were bugs in - this code in non-simple cases. For a pattern such as ^(a()*)* matched - against aaaa the result was just "a" rather than "aaaa", for example. Two - separate and independent bugs (that affected different cases) have been - fixed. - -39. Refactored the code to abolish the use of different opcodes for small - capturing bracket numbers. This is a tidy that I avoided doing when I - removed the limit on the number of capturing brackets for 3.5 back in 2001. - The new approach is not only tidier, it makes it possible to reduce the - memory needed to fix the previous bug (38). - -40. Implemented PCRE_NEWLINE_ANY to recognize any of the Unicode newline - sequences (http://unicode.org/unicode/reports/tr18/) as "newline" when - processing dot, circumflex, or dollar metacharacters, or #-comments in /x - mode. - -41. Add \R to match any Unicode newline sequence, as suggested in the Unicode - report. - -42. Applied patch, originally from Ari Pollak, modified by Google, to allow - copy construction and assignment in the C++ wrapper. - -43. Updated pcregrep to support "--newline=any". In the process, I fixed a - couple of bugs that could have given wrong results in the "--newline=crlf" - case. - -44. Added a number of casts and did some reorganization of signed/unsigned int - variables following suggestions from Dair Grant. Also renamed the variable - "this" as "item" because it is a C++ keyword. - -45. Arranged for dftables to add - - #include "pcre_internal.h" - - to pcre_chartables.c because without it, gcc 4.x may remove the array - definition from the final binary if PCRE is built into a static library and - dead code stripping is activated. - -46. For an unanchored pattern, if a match attempt fails at the start of a - newline sequence, and the newline setting is CRLF or ANY, and the next two - characters are CRLF, advance by two characters instead of one. - - -Version 6.7 04-Jul-06 ---------------------- - - 1. In order to handle tests when input lines are enormously long, pcretest has - been re-factored so that it automatically extends its buffers when - necessary. The code is crude, but this _is_ just a test program. The - default size has been increased from 32K to 50K. - - 2. The code in pcre_study() was using the value of the re argument before - testing it for NULL. (Of course, in any sensible call of the function, it - won't be NULL.) - - 3. The memmove() emulation function in pcre_internal.h, which is used on - systems that lack both memmove() and bcopy() - that is, hardly ever - - was missing a "static" storage class specifier. - - 4. When UTF-8 mode was not set, PCRE looped when compiling certain patterns - containing an extended class (one that cannot be represented by a bitmap - because it contains high-valued characters or Unicode property items, e.g. - [\pZ]). Almost always one would set UTF-8 mode when processing such a - pattern, but PCRE should not loop if you do not (it no longer does). - [Detail: two cases were found: (a) a repeated subpattern containing an - extended class; (b) a recursive reference to a subpattern that followed a - previous extended class. It wasn't skipping over the extended class - correctly when UTF-8 mode was not set.] - - 5. A negated single-character class was not being recognized as fixed-length - in lookbehind assertions such as (?<=[^f]), leading to an incorrect - compile error "lookbehind assertion is not fixed length". - - 6. The RunPerlTest auxiliary script was showing an unexpected difference - between PCRE and Perl for UTF-8 tests. It turns out that it is hard to - write a Perl script that can interpret lines of an input file either as - byte characters or as UTF-8, which is what "perltest" was being required to - do for the non-UTF-8 and UTF-8 tests, respectively. Essentially what you - can't do is switch easily at run time between having the "use utf8;" pragma - or not. In the end, I fudged it by using the RunPerlTest script to insert - "use utf8;" explicitly for the UTF-8 tests. - - 7. In multiline (/m) mode, PCRE was matching ^ after a terminating newline at - the end of the subject string, contrary to the documentation and to what - Perl does. This was true of both matching functions. Now it matches only at - the start of the subject and immediately after *internal* newlines. - - 8. A call of pcre_fullinfo() from pcretest to get the option bits was passing - a pointer to an int instead of a pointer to an unsigned long int. This - caused problems on 64-bit systems. - - 9. Applied a patch from the folks at Google to pcrecpp.cc, to fix "another - instance of the 'standard' template library not being so standard". - -10. There was no check on the number of named subpatterns nor the maximum - length of a subpattern name. The product of these values is used to compute - the size of the memory block for a compiled pattern. By supplying a very - long subpattern name and a large number of named subpatterns, the size - computation could be caused to overflow. This is now prevented by limiting - the length of names to 32 characters, and the number of named subpatterns - to 10,000. - -11. Subpatterns that are repeated with specific counts have to be replicated in - the compiled pattern. The size of memory for this was computed from the - length of the subpattern and the repeat count. The latter is limited to - 65535, but there was no limit on the former, meaning that integer overflow - could in principle occur. The compiled length of a repeated subpattern is - now limited to 30,000 bytes in order to prevent this. - -12. Added the optional facility to have named substrings with the same name. - -13. Added the ability to use a named substring as a condition, using the - Python syntax: (?(name)yes|no). This overloads (?(R)... and names that - are numbers (not recommended). Forward references are permitted. - -14. Added forward references in named backreferences (if you see what I mean). - -15. In UTF-8 mode, with the PCRE_DOTALL option set, a quantified dot in the - pattern could run off the end of the subject. For example, the pattern - "(?s)(.{1,5})"8 did this with the subject "ab". - -16. If PCRE_DOTALL or PCRE_MULTILINE were set, pcre_dfa_exec() behaved as if - PCRE_CASELESS was set when matching characters that were quantified with ? - or *. - -17. A character class other than a single negated character that had a minimum - but no maximum quantifier - for example [ab]{6,} - was not handled - correctly by pce_dfa_exec(). It would match only one character. - -18. A valid (though odd) pattern that looked like a POSIX character - class but used an invalid character after [ (for example [[,abc,]]) caused - pcre_compile() to give the error "Failed: internal error: code overflow" or - in some cases to crash with a glibc free() error. This could even happen if - the pattern terminated after [[ but there just happened to be a sequence of - letters, a binary zero, and a closing ] in the memory that followed. - -19. Perl's treatment of octal escapes in the range \400 to \777 has changed - over the years. Originally (before any Unicode support), just the bottom 8 - bits were taken. Thus, for example, \500 really meant \100. Nowadays the - output from "man perlunicode" includes this: - - The regular expression compiler produces polymorphic opcodes. That - is, the pattern adapts to the data and automatically switches to - the Unicode character scheme when presented with Unicode data--or - instead uses a traditional byte scheme when presented with byte - data. - - Sadly, a wide octal escape does not cause a switch, and in a string with - no other multibyte characters, these octal escapes are treated as before. - Thus, in Perl, the pattern /\500/ actually matches \100 but the pattern - /\500|\x{1ff}/ matches \500 or \777 because the whole thing is treated as a - Unicode string. - - I have not perpetrated such confusion in PCRE. Up till now, it took just - the bottom 8 bits, as in old Perl. I have now made octal escapes with - values greater than \377 illegal in non-UTF-8 mode. In UTF-8 mode they - translate to the appropriate multibyte character. - -29. Applied some refactoring to reduce the number of warnings from Microsoft - and Borland compilers. This has included removing the fudge introduced - seven years ago for the OS/2 compiler (see 2.02/2 below) because it caused - a warning about an unused variable. - -21. PCRE has not included VT (character 0x0b) in the set of whitespace - characters since release 4.0, because Perl (from release 5.004) does not. - [Or at least, is documented not to: some releases seem to be in conflict - with the documentation.] However, when a pattern was studied with - pcre_study() and all its branches started with \s, PCRE still included VT - as a possible starting character. Of course, this did no harm; it just - caused an unnecessary match attempt. - -22. Removed a now-redundant internal flag bit that recorded the fact that case - dependency changed within the pattern. This was once needed for "required - byte" processing, but is no longer used. This recovers a now-scarce options - bit. Also moved the least significant internal flag bit to the most- - significant bit of the word, which was not previously used (hangover from - the days when it was an int rather than a uint) to free up another bit for - the future. - -23. Added support for CRLF line endings as well as CR and LF. As well as the - default being selectable at build time, it can now be changed at runtime - via the PCRE_NEWLINE_xxx flags. There are now options for pcregrep to - specify that it is scanning data with non-default line endings. - -24. Changed the definition of CXXLINK to make it agree with the definition of - LINK in the Makefile, by replacing LDFLAGS to CXXFLAGS. - -25. Applied Ian Taylor's patches to avoid using another stack frame for tail - recursions. This makes a big different to stack usage for some patterns. - -26. If a subpattern containing a named recursion or subroutine reference such - as (?P>B) was quantified, for example (xxx(?P>B)){3}, the calculation of - the space required for the compiled pattern went wrong and gave too small a - value. Depending on the environment, this could lead to "Failed: internal - error: code overflow at offset 49" or "glibc detected double free or - corruption" errors. - -27. Applied patches from Google (a) to support the new newline modes and (b) to - advance over multibyte UTF-8 characters in GlobalReplace. - -28. Change free() to pcre_free() in pcredemo.c. Apparently this makes a - difference for some implementation of PCRE in some Windows version. - -29. Added some extra testing facilities to pcretest: - - \q in a data line sets the "match limit" value - \Q in a data line sets the "match recursion limt" value - -S sets the stack size, where is in megabytes - - The -S option isn't available for Windows. - - -Version 6.6 06-Feb-06 ---------------------- - - 1. Change 16(a) for 6.5 broke things, because PCRE_DATA_SCOPE was not defined - in pcreposix.h. I have copied the definition from pcre.h. - - 2. Change 25 for 6.5 broke compilation in a build directory out-of-tree - because pcre.h is no longer a built file. - - 3. Added Jeff Friedl's additional debugging patches to pcregrep. These are - not normally included in the compiled code. - - -Version 6.5 01-Feb-06 ---------------------- - - 1. When using the partial match feature with pcre_dfa_exec(), it was not - anchoring the second and subsequent partial matches at the new starting - point. This could lead to incorrect results. For example, with the pattern - /1234/, partially matching against "123" and then "a4" gave a match. - - 2. Changes to pcregrep: - - (a) All non-match returns from pcre_exec() were being treated as failures - to match the line. Now, unless the error is PCRE_ERROR_NOMATCH, an - error message is output. Some extra information is given for the - PCRE_ERROR_MATCHLIMIT and PCRE_ERROR_RECURSIONLIMIT errors, which are - probably the only errors that are likely to be caused by users (by - specifying a regex that has nested indefinite repeats, for instance). - If there are more than 20 of these errors, pcregrep is abandoned. - - (b) A binary zero was treated as data while matching, but terminated the - output line if it was written out. This has been fixed: binary zeroes - are now no different to any other data bytes. - - (c) Whichever of the LC_ALL or LC_CTYPE environment variables is set is - used to set a locale for matching. The --locale=xxxx long option has - been added (no short equivalent) to specify a locale explicitly on the - pcregrep command, overriding the environment variables. - - (d) When -B was used with -n, some line numbers in the output were one less - than they should have been. - - (e) Added the -o (--only-matching) option. - - (f) If -A or -C was used with -c (count only), some lines of context were - accidentally printed for the final match. - - (g) Added the -H (--with-filename) option. - - (h) The combination of options -rh failed to suppress file names for files - that were found from directory arguments. - - (i) Added the -D (--devices) and -d (--directories) options. - - (j) Added the -F (--fixed-strings) option. - - (k) Allow "-" to be used as a file name for -f as well as for a data file. - - (l) Added the --colo(u)r option. - - (m) Added Jeffrey Friedl's -S testing option, but within #ifdefs so that it - is not present by default. - - 3. A nasty bug was discovered in the handling of recursive patterns, that is, - items such as (?R) or (?1), when the recursion could match a number of - alternatives. If it matched one of the alternatives, but subsequently, - outside the recursion, there was a failure, the code tried to back up into - the recursion. However, because of the way PCRE is implemented, this is not - possible, and the result was an incorrect result from the match. - - In order to prevent this happening, the specification of recursion has - been changed so that all such subpatterns are automatically treated as - atomic groups. Thus, for example, (?R) is treated as if it were (?>(?R)). - - 4. I had overlooked the fact that, in some locales, there are characters for - which isalpha() is true but neither isupper() nor islower() are true. In - the fr_FR locale, for instance, the \xAA and \xBA characters (ordmasculine - and ordfeminine) are like this. This affected the treatment of \w and \W - when they appeared in character classes, but not when they appeared outside - a character class. The bit map for "word" characters is now created - separately from the results of isalnum() instead of just taking it from the - upper, lower, and digit maps. (Plus the underscore character, of course.) - - 5. The above bug also affected the handling of POSIX character classes such as - [[:alpha:]] and [[:alnum:]]. These do not have their own bit maps in PCRE's - permanent tables. Instead, the bit maps for such a class were previously - created as the appropriate unions of the upper, lower, and digit bitmaps. - Now they are created by subtraction from the [[:word:]] class, which has - its own bitmap. - - 6. The [[:blank:]] character class matches horizontal, but not vertical space. - It is created by subtracting the vertical space characters (\x09, \x0a, - \x0b, \x0c) from the [[:space:]] bitmap. Previously, however, the - subtraction was done in the overall bitmap for a character class, meaning - that a class such as [\x0c[:blank:]] was incorrect because \x0c would not - be recognized. This bug has been fixed. - - 7. Patches from the folks at Google: - - (a) pcrecpp.cc: "to handle a corner case that may or may not happen in - real life, but is still worth protecting against". - - (b) pcrecpp.cc: "corrects a bug when negative radixes are used with - regular expressions". - - (c) pcre_scanner.cc: avoid use of std::count() because not all systems - have it. - - (d) Split off pcrecpparg.h from pcrecpp.h and had the former built by - "configure" and the latter not, in order to fix a problem somebody had - with compiling the Arg class on HP-UX. - - (e) Improve the error-handling of the C++ wrapper a little bit. - - (f) New tests for checking recursion limiting. - - 8. The pcre_memmove() function, which is used only if the environment does not - have a standard memmove() function (and is therefore rarely compiled), - contained two bugs: (a) use of int instead of size_t, and (b) it was not - returning a result (though PCRE never actually uses the result). - - 9. In the POSIX regexec() interface, if nmatch is specified as a ridiculously - large number - greater than INT_MAX/(3*sizeof(int)) - REG_ESPACE is - returned instead of calling malloc() with an overflowing number that would - most likely cause subsequent chaos. - -10. The debugging option of pcretest was not showing the NO_AUTO_CAPTURE flag. - -11. The POSIX flag REG_NOSUB is now supported. When a pattern that was compiled - with this option is matched, the nmatch and pmatch options of regexec() are - ignored. - -12. Added REG_UTF8 to the POSIX interface. This is not defined by POSIX, but is - provided in case anyone wants to the the POSIX interface with UTF-8 - strings. - -13. Added CXXLDFLAGS to the Makefile parameters to provide settings only on the - C++ linking (needed for some HP-UX environments). - -14. Avoid compiler warnings in get_ucpname() when compiled without UCP support - (unused parameter) and in the pcre_printint() function (omitted "default" - switch label when the default is to do nothing). - -15. Added some code to make it possible, when PCRE is compiled as a C++ - library, to replace subject pointers for pcre_exec() with a smart pointer - class, thus making it possible to process discontinuous strings. - -16. The two macros PCRE_EXPORT and PCRE_DATA_SCOPE are confusing, and perform - much the same function. They were added by different people who were trying - to make PCRE easy to compile on non-Unix systems. It has been suggested - that PCRE_EXPORT be abolished now that there is more automatic apparatus - for compiling on Windows systems. I have therefore replaced it with - PCRE_DATA_SCOPE. This is set automatically for Windows; if not set it - defaults to "extern" for C or "extern C" for C++, which works fine on - Unix-like systems. It is now possible to override the value of PCRE_DATA_ - SCOPE with something explicit in config.h. In addition: - - (a) pcreposix.h still had just "extern" instead of either of these macros; - I have replaced it with PCRE_DATA_SCOPE. - - (b) Functions such as _pcre_xclass(), which are internal to the library, - but external in the C sense, all had PCRE_EXPORT in their definitions. - This is apparently wrong for the Windows case, so I have removed it. - (It makes no difference on Unix-like systems.) - -17. Added a new limit, MATCH_LIMIT_RECURSION, which limits the depth of nesting - of recursive calls to match(). This is different to MATCH_LIMIT because - that limits the total number of calls to match(), not all of which increase - the depth of recursion. Limiting the recursion depth limits the amount of - stack (or heap if NO_RECURSE is set) that is used. The default can be set - when PCRE is compiled, and changed at run time. A patch from Google adds - this functionality to the C++ interface. - -18. Changes to the handling of Unicode character properties: - - (a) Updated the table to Unicode 4.1.0. - - (b) Recognize characters that are not in the table as "Cn" (undefined). - - (c) I revised the way the table is implemented to a much improved format - which includes recognition of ranges. It now supports the ranges that - are defined in UnicodeData.txt, and it also amalgamates other - characters into ranges. This has reduced the number of entries in the - table from around 16,000 to around 3,000, thus reducing its size - considerably. I realized I did not need to use a tree structure after - all - a binary chop search is just as efficient. Having reduced the - number of entries, I extended their size from 6 bytes to 8 bytes to - allow for more data. - - (d) Added support for Unicode script names via properties such as \p{Han}. - -19. In UTF-8 mode, a backslash followed by a non-Ascii character was not - matching that character. - -20. When matching a repeated Unicode property with a minimum greater than zero, - (for example \pL{2,}), PCRE could look past the end of the subject if it - reached it while seeking the minimum number of characters. This could - happen only if some of the characters were more than one byte long, because - there is a check for at least the minimum number of bytes. - -21. Refactored the implementation of \p and \P so as to be more general, to - allow for more different types of property in future. This has changed the - compiled form incompatibly. Anybody with saved compiled patterns that use - \p or \P will have to recompile them. - -22. Added "Any" and "L&" to the supported property types. - -23. Recognize \x{...} as a code point specifier, even when not in UTF-8 mode, - but give a compile time error if the value is greater than 0xff. - -24. The man pages for pcrepartial, pcreprecompile, and pcre_compile2 were - accidentally not being installed or uninstalled. - -25. The pcre.h file was built from pcre.h.in, but the only changes that were - made were to insert the current release number. This seemed silly, because - it made things harder for people building PCRE on systems that don't run - "configure". I have turned pcre.h into a distributed file, no longer built - by "configure", with the version identification directly included. There is - no longer a pcre.h.in file. - - However, this change necessitated a change to the pcre-config script as - well. It is built from pcre-config.in, and one of the substitutions was the - release number. I have updated configure.ac so that ./configure now finds - the release number by grepping pcre.h. - -26. Added the ability to run the tests under valgrind. - - -Version 6.4 05-Sep-05 ---------------------- - - 1. Change 6.0/10/(l) to pcregrep introduced a bug that caused separator lines - "--" to be printed when multiple files were scanned, even when none of the - -A, -B, or -C options were used. This is not compatible with Gnu grep, so I - consider it to be a bug, and have restored the previous behaviour. - - 2. A couple of code tidies to get rid of compiler warnings. - - 3. The pcretest program used to cheat by referring to symbols in the library - whose names begin with _pcre_. These are internal symbols that are not - really supposed to be visible externally, and in some environments it is - possible to suppress them. The cheating is now confined to including - certain files from the library's source, which is a bit cleaner. - - 4. Renamed pcre.in as pcre.h.in to go with pcrecpp.h.in; it also makes the - file's purpose clearer. - - 5. Reorganized pcre_ucp_findchar(). - - -Version 6.3 15-Aug-05 ---------------------- - - 1. The file libpcre.pc.in did not have general read permission in the tarball. - - 2. There were some problems when building without C++ support: - - (a) If C++ support was not built, "make install" and "make test" still - tried to test it. - - (b) There were problems when the value of CXX was explicitly set. Some - changes have been made to try to fix these, and ... - - (c) --disable-cpp can now be used to explicitly disable C++ support. - - (d) The use of @CPP_OBJ@ directly caused a blank line preceded by a - backslash in a target when C++ was disabled. This confuses some - versions of "make", apparently. Using an intermediate variable solves - this. (Same for CPP_LOBJ.) - - 3. $(LINK_FOR_BUILD) now includes $(CFLAGS_FOR_BUILD) and $(LINK) - (non-Windows) now includes $(CFLAGS) because these flags are sometimes - necessary on certain architectures. - - 4. Added a setting of -export-symbols-regex to the link command to remove - those symbols that are exported in the C sense, but actually are local - within the library, and not documented. Their names all begin with - "_pcre_". This is not a perfect job, because (a) we have to except some - symbols that pcretest ("illegally") uses, and (b) the facility isn't always - available (and never for static libraries). I have made a note to try to - find a way round (a) in the future. - - -Version 6.2 01-Aug-05 ---------------------- - - 1. There was no test for integer overflow of quantifier values. A construction - such as {1111111111111111} would give undefined results. What is worse, if - a minimum quantifier for a parenthesized subpattern overflowed and became - negative, the calculation of the memory size went wrong. This could have - led to memory overwriting. - - 2. Building PCRE using VPATH was broken. Hopefully it is now fixed. - - 3. Added "b" to the 2nd argument of fopen() in dftables.c, for non-Unix-like - operating environments where this matters. - - 4. Applied Giuseppe Maxia's patch to add additional features for controlling - PCRE options from within the C++ wrapper. - - 5. Named capturing subpatterns were not being correctly counted when a pattern - was compiled. This caused two problems: (a) If there were more than 100 - such subpatterns, the calculation of the memory needed for the whole - compiled pattern went wrong, leading to an overflow error. (b) Numerical - back references of the form \12, where the number was greater than 9, were - not recognized as back references, even though there were sufficient - previous subpatterns. - - 6. Two minor patches to pcrecpp.cc in order to allow it to compile on older - versions of gcc, e.g. 2.95.4. - - -Version 6.1 21-Jun-05 ---------------------- - - 1. There was one reference to the variable "posix" in pcretest.c that was not - surrounded by "#if !defined NOPOSIX". - - 2. Make it possible to compile pcretest without DFA support, UTF8 support, or - the cross-check on the old pcre_info() function, for the benefit of the - cut-down version of PCRE that is currently imported into Exim. - - 3. A (silly) pattern starting with (?i)(?-i) caused an internal space - allocation error. I've done the easy fix, which wastes 2 bytes for sensible - patterns that start (?i) but I don't think that matters. The use of (?i) is - just an example; this all applies to the other options as well. - - 4. Since libtool seems to echo the compile commands it is issuing, the output - from "make" can be reduced a bit by putting "@" in front of each libtool - compile command. - - 5. Patch from the folks at Google for configure.in to be a bit more thorough - in checking for a suitable C++ installation before trying to compile the - C++ stuff. This should fix a reported problem when a compiler was present, - but no suitable headers. - - 6. The man pages all had just "PCRE" as their title. I have changed them to - be the relevant file name. I have also arranged that these names are - retained in the file doc/pcre.txt, which is a concatenation in text format - of all the man pages except the little individual ones for each function. - - 7. The NON-UNIX-USE file had not been updated for the different set of source - files that come with release 6. I also added a few comments about the C++ - wrapper. - - -Version 6.0 07-Jun-05 ---------------------- - - 1. Some minor internal re-organization to help with my DFA experiments. - - 2. Some missing #ifdef SUPPORT_UCP conditionals in pcretest and printint that - didn't matter for the library itself when fully configured, but did matter - when compiling without UCP support, or within Exim, where the ucp files are - not imported. - - 3. Refactoring of the library code to split up the various functions into - different source modules. The addition of the new DFA matching code (see - below) to a single monolithic source would have made it really too - unwieldy, quite apart from causing all the code to be include in a - statically linked application, when only some functions are used. This is - relevant even without the DFA addition now that patterns can be compiled in - one application and matched in another. - - The downside of splitting up is that there have to be some external - functions and data tables that are used internally in different modules of - the library but which are not part of the API. These have all had their - names changed to start with "_pcre_" so that they are unlikely to clash - with other external names. - - 4. Added an alternate matching function, pcre_dfa_exec(), which matches using - a different (DFA) algorithm. Although it is slower than the original - function, it does have some advantages for certain types of matching - problem. - - 5. Upgrades to pcretest in order to test the features of pcre_dfa_exec(), - including restarting after a partial match. - - 6. A patch for pcregrep that defines INVALID_FILE_ATTRIBUTES if it is not - defined when compiling for Windows was sent to me. I have put it into the - code, though I have no means of testing or verifying it. - - 7. Added the pcre_refcount() auxiliary function. - - 8. Added the PCRE_FIRSTLINE option. This constrains an unanchored pattern to - match before or at the first newline in the subject string. In pcretest, - the /f option on a pattern can be used to set this. - - 9. A repeated \w when used in UTF-8 mode with characters greater than 256 - would behave wrongly. This has been present in PCRE since release 4.0. - -10. A number of changes to the pcregrep command: - - (a) Refactored how -x works; insert ^(...)$ instead of setting - PCRE_ANCHORED and checking the length, in preparation for adding - something similar for -w. - - (b) Added the -w (match as a word) option. - - (c) Refactored the way lines are read and buffered so as to have more - than one at a time available. - - (d) Implemented a pcregrep test script. - - (e) Added the -M (multiline match) option. This allows patterns to match - over several lines of the subject. The buffering ensures that at least - 8K, or the rest of the document (whichever is the shorter) is available - for matching (and similarly the previous 8K for lookbehind assertions). - - (f) Changed the --help output so that it now says - - -w, --word-regex(p) - - instead of two lines, one with "regex" and the other with "regexp" - because that confused at least one person since the short forms are the - same. (This required a bit of code, as the output is generated - automatically from a table. It wasn't just a text change.) - - (g) -- can be used to terminate pcregrep options if the next thing isn't an - option but starts with a hyphen. Could be a pattern or a path name - starting with a hyphen, for instance. - - (h) "-" can be given as a file name to represent stdin. - - (i) When file names are being printed, "(standard input)" is used for - the standard input, for compatibility with GNU grep. Previously - "" was used. - - (j) The option --label=xxx can be used to supply a name to be used for - stdin when file names are being printed. There is no short form. - - (k) Re-factored the options decoding logic because we are going to add - two more options that take data. Such options can now be given in four - different ways, e.g. "-fname", "-f name", "--file=name", "--file name". - - (l) Added the -A, -B, and -C options for requesting that lines of context - around matches be printed. - - (m) Added the -L option to print the names of files that do not contain - any matching lines, that is, the complement of -l. - - (n) The return code is 2 if any file cannot be opened, but pcregrep does - continue to scan other files. - - (o) The -s option was incorrectly implemented. For compatibility with other - greps, it now suppresses the error message for a non-existent or non- - accessible file (but not the return code). There is a new option called - -q that suppresses the output of matching lines, which was what -s was - previously doing. - - (p) Added --include and --exclude options to specify files for inclusion - and exclusion when recursing. - -11. The Makefile was not using the Autoconf-supported LDFLAGS macro properly. - Hopefully, it now does. - -12. Missing cast in pcre_study(). - -13. Added an "uninstall" target to the makefile. - -14. Replaced "extern" in the function prototypes in Makefile.in with - "PCRE_DATA_SCOPE", which defaults to 'extern' or 'extern "C"' in the Unix - world, but is set differently for Windows. - -15. Added a second compiling function called pcre_compile2(). The only - difference is that it has an extra argument, which is a pointer to an - integer error code. When there is a compile-time failure, this is set - non-zero, in addition to the error test pointer being set to point to an - error message. The new argument may be NULL if no error number is required - (but then you may as well call pcre_compile(), which is now just a - wrapper). This facility is provided because some applications need a - numeric error indication, but it has also enabled me to tidy up the way - compile-time errors are handled in the POSIX wrapper. - -16. Added VPATH=.libs to the makefile; this should help when building with one - prefix path and installing with another. (Or so I'm told by someone who - knows more about this stuff than I do.) - -17. Added a new option, REG_DOTALL, to the POSIX function regcomp(). This - passes PCRE_DOTALL to the pcre_compile() function, making the "." character - match everything, including newlines. This is not POSIX-compatible, but - somebody wanted the feature. From pcretest it can be activated by using - both the P and the s flags. - -18. AC_PROG_LIBTOOL appeared twice in Makefile.in. Removed one. - -19. libpcre.pc was being incorrectly installed as executable. - -20. A couple of places in pcretest check for end-of-line by looking for '\n'; - it now also looks for '\r' so that it will work unmodified on Windows. - -21. Added Google's contributed C++ wrapper to the distribution. - -22. Added some untidy missing memory free() calls in pcretest, to keep - Electric Fence happy when testing. - - - -Version 5.0 13-Sep-04 ---------------------- - - 1. Internal change: literal characters are no longer packed up into items - containing multiple characters in a single byte-string. Each character - is now matched using a separate opcode. However, there may be more than one - byte in the character in UTF-8 mode. - - 2. The pcre_callout_block structure has two new fields: pattern_position and - next_item_length. These contain the offset in the pattern to the next match - item, and its length, respectively. - - 3. The PCRE_AUTO_CALLOUT option for pcre_compile() requests the automatic - insertion of callouts before each pattern item. Added the /C option to - pcretest to make use of this. - - 4. On the advice of a Windows user, the lines - - #if defined(_WIN32) || defined(WIN32) - _setmode( _fileno( stdout ), 0x8000 ); - #endif /* defined(_WIN32) || defined(WIN32) */ - - have been added to the source of pcretest. This apparently does useful - magic in relation to line terminators. - - 5. Changed "r" and "w" in the calls to fopen() in pcretest to "rb" and "wb" - for the benefit of those environments where the "b" makes a difference. - - 6. The icc compiler has the same options as gcc, but "configure" doesn't seem - to know about it. I have put a hack into configure.in that adds in code - to set GCC=yes if CC=icc. This seems to end up at a point in the - generated configure script that is early enough to affect the setting of - compiler options, which is what is needed, but I have no means of testing - whether it really works. (The user who reported this had patched the - generated configure script, which of course I cannot do.) - - LATER: After change 22 below (new libtool files), the configure script - seems to know about icc (and also ecc). Therefore, I have commented out - this hack in configure.in. - - 7. Added support for pkg-config (2 patches were sent in). - - 8. Negated POSIX character classes that used a combination of internal tables - were completely broken. These were [[:^alpha:]], [[:^alnum:]], and - [[:^ascii]]. Typically, they would match almost any characters. The other - POSIX classes were not broken in this way. - - 9. Matching the pattern "\b.*?" against "ab cd", starting at offset 1, failed - to find the match, as PCRE was deluded into thinking that the match had to - start at the start point or following a newline. The same bug applied to - patterns with negative forward assertions or any backward assertions - preceding ".*" at the start, unless the pattern required a fixed first - character. This was a failing pattern: "(?!.bcd).*". The bug is now fixed. - -10. In UTF-8 mode, when moving forwards in the subject after a failed match - starting at the last subject character, bytes beyond the end of the subject - string were read. - -11. Renamed the variable "class" as "classbits" to make life easier for C++ - users. (Previously there was a macro definition, but it apparently wasn't - enough.) - -12. Added the new field "tables" to the extra data so that tables can be passed - in at exec time, or the internal tables can be re-selected. This allows - a compiled regex to be saved and re-used at a later time by a different - program that might have everything at different addresses. - -13. Modified the pcre-config script so that, when run on Solaris, it shows a - -R library as well as a -L library. - -14. The debugging options of pcretest (-d on the command line or D on a - pattern) showed incorrect output for anything following an extended class - that contained multibyte characters and which was followed by a quantifier. - -15. Added optional support for general category Unicode character properties - via the \p, \P, and \X escapes. Unicode property support implies UTF-8 - support. It adds about 90K to the size of the library. The meanings of the - inbuilt class escapes such as \d and \s have NOT been changed. - -16. Updated pcredemo.c to include calls to free() to release the memory for the - compiled pattern. - -17. The generated file chartables.c was being created in the source directory - instead of in the building directory. This caused the build to fail if the - source directory was different from the building directory, and was - read-only. - -18. Added some sample Win commands from Mark Tetrode into the NON-UNIX-USE - file. No doubt somebody will tell me if they don't make sense... Also added - Dan Mooney's comments about building on OpenVMS. - -19. Added support for partial matching via the PCRE_PARTIAL option for - pcre_exec() and the \P data escape in pcretest. - -20. Extended pcretest with 3 new pattern features: - - (i) A pattern option of the form ">rest-of-line" causes pcretest to - write the compiled pattern to the file whose name is "rest-of-line". - This is a straight binary dump of the data, with the saved pointer to - the character tables forced to be NULL. The study data, if any, is - written too. After writing, pcretest reads a new pattern. - - (ii) If, instead of a pattern, ": new target - : new target - : use native compiler - : use native linker - : handle Windows platform correctly - : ditto - : ditto - copy DLL to top builddir before testing - - As part of these changes, -no-undefined was removed again. This was reported - to give trouble on HP-UX 11.0, so getting rid of it seems like a good idea - in any case. - -3. Some tidies to get rid of compiler warnings: - - . In the match_data structure, match_limit was an unsigned long int, whereas - match_call_count was an int. I've made them both unsigned long ints. - - . In pcretest the fact that a const uschar * doesn't automatically cast to - a void * provoked a warning. - - . Turning on some more compiler warnings threw up some "shadow" variables - and a few more missing casts. - -4. If PCRE was complied with UTF-8 support, but called without the PCRE_UTF8 - option, a class that contained a single character with a value between 128 - and 255 (e.g. /[\xFF]/) caused PCRE to crash. - -5. If PCRE was compiled with UTF-8 support, but called without the PCRE_UTF8 - option, a class that contained several characters, but with at least one - whose value was between 128 and 255 caused PCRE to crash. - - -Version 4.1 12-Mar-03 ---------------------- - -1. Compiling with gcc -pedantic found a couple of places where casts were -needed, and a string in dftables.c that was longer than standard compilers are -required to support. - -2. Compiling with Sun's compiler found a few more places where the code could -be tidied up in order to avoid warnings. - -3. The variables for cross-compiling were called HOST_CC and HOST_CFLAGS; the -first of these names is deprecated in the latest Autoconf in favour of the name -CC_FOR_BUILD, because "host" is typically used to mean the system on which the -compiled code will be run. I can't find a reference for HOST_CFLAGS, but by -analogy I have changed it to CFLAGS_FOR_BUILD. - -4. Added -no-undefined to the linking command in the Makefile, because this is -apparently helpful for Windows. To make it work, also added "-L. -lpcre" to the -linking step for the pcreposix library. - -5. PCRE was failing to diagnose the case of two named groups with the same -name. - -6. A problem with one of PCRE's optimizations was discovered. PCRE remembers a -literal character that is needed in the subject for a match, and scans along to -ensure that it is present before embarking on the full matching process. This -saves time in cases of nested unlimited repeats that are never going to match. -Problem: the scan can take a lot of time if the subject is very long (e.g. -megabytes), thus penalizing straightforward matches. It is now done only if the -amount of subject to be scanned is less than 1000 bytes. - -7. A lesser problem with the same optimization is that it was recording the -first character of an anchored pattern as "needed", thus provoking a search -right along the subject, even when the first match of the pattern was going to -fail. The "needed" character is now not set for anchored patterns, unless it -follows something in the pattern that is of non-fixed length. Thus, it still -fulfils its original purpose of finding quick non-matches in cases of nested -unlimited repeats, but isn't used for simple anchored patterns such as /^abc/. - - -Version 4.0 17-Feb-03 ---------------------- - -1. If a comment in an extended regex that started immediately after a meta-item -extended to the end of string, PCRE compiled incorrect data. This could lead to -all kinds of weird effects. Example: /#/ was bad; /()#/ was bad; /a#/ was not. - -2. Moved to autoconf 2.53 and libtool 1.4.2. - -3. Perl 5.8 no longer needs "use utf8" for doing UTF-8 things. Consequently, -the special perltest8 script is no longer needed - all the tests can be run -from a single perltest script. - -4. From 5.004, Perl has not included the VT character (0x0b) in the set defined -by \s. It has now been removed in PCRE. This means it isn't recognized as -whitespace in /x regexes too, which is the same as Perl. Note that the POSIX -class [:space:] *does* include VT, thereby creating a mess. - -5. Added the class [:blank:] (a GNU extension from Perl 5.8) to match only -space and tab. - -6. Perl 5.005 was a long time ago. It's time to amalgamate the tests that use -its new features into the main test script, reducing the number of scripts. - -7. Perl 5.8 has changed the meaning of patterns like /a(?i)b/. Earlier versions -were backward compatible, and made the (?i) apply to the whole pattern, as if -/i were given. Now it behaves more logically, and applies the option setting -only to what follows. PCRE has been changed to follow suit. However, if it -finds options settings right at the start of the pattern, it extracts them into -the global options, as before. Thus, they show up in the info data. - -8. Added support for the \Q...\E escape sequence. Characters in between are -treated as literals. This is slightly different from Perl in that $ and @ are -also handled as literals inside the quotes. In Perl, they will cause variable -interpolation. Note the following examples: - - Pattern PCRE matches Perl matches - - \Qabc$xyz\E abc$xyz abc followed by the contents of $xyz - \Qabc\$xyz\E abc\$xyz abc\$xyz - \Qabc\E\$\Qxyz\E abc$xyz abc$xyz - -For compatibility with Perl, \Q...\E sequences are recognized inside character -classes as well as outside them. - -9. Re-organized 3 code statements in pcretest to avoid "overflow in -floating-point constant arithmetic" warnings from a Microsoft compiler. Added a -(size_t) cast to one statement in pcretest and one in pcreposix to avoid -signed/unsigned warnings. - -10. SunOS4 doesn't have strtoul(). This was used only for unpicking the -o -option for pcretest, so I've replaced it by a simple function that does just -that job. - -11. pcregrep was ending with code 0 instead of 2 for the commands "pcregrep" or -"pcregrep -". - -12. Added "possessive quantifiers" ?+, *+, ++, and {,}+ which come from Sun's -Java package. This provides some syntactic sugar for simple cases of what my -documentation calls "once-only subpatterns". A pattern such as x*+ is the same -as (?>x*). In other words, if what is inside (?>...) is just a single repeated -item, you can use this simplified notation. Note that only makes sense with -greedy quantifiers. Consequently, the use of the possessive quantifier forces -greediness, whatever the setting of the PCRE_UNGREEDY option. - -13. A change of greediness default within a pattern was not taking effect at -the current level for patterns like /(b+(?U)a+)/. It did apply to parenthesized -subpatterns that followed. Patterns like /b+(?U)a+/ worked because the option -was abstracted outside. - -14. PCRE now supports the \G assertion. It is true when the current matching -position is at the start point of the match. This differs from \A when the -starting offset is non-zero. Used with the /g option of pcretest (or similar -code), it works in the same way as it does for Perl's /g option. If all -alternatives of a regex begin with \G, the expression is anchored to the start -match position, and the "anchored" flag is set in the compiled expression. - -15. Some bugs concerning the handling of certain option changes within patterns -have been fixed. These applied to options other than (?ims). For example, -"a(?x: b c )d" did not match "XabcdY" but did match "Xa b c dY". It should have -been the other way round. Some of this was related to change 7 above. - -16. PCRE now gives errors for /[.x.]/ and /[=x=]/ as unsupported POSIX -features, as Perl does. Previously, PCRE gave the warnings only for /[[.x.]]/ -and /[[=x=]]/. PCRE now also gives an error for /[:name:]/ because it supports -POSIX classes only within a class (e.g. /[[:alpha:]]/). - -17. Added support for Perl's \C escape. This matches one byte, even in UTF8 -mode. Unlike ".", it always matches newline, whatever the setting of -PCRE_DOTALL. However, PCRE does not permit \C to appear in lookbehind -assertions. Perl allows it, but it doesn't (in general) work because it can't -calculate the length of the lookbehind. At least, that's the case for Perl -5.8.0 - I've been told they are going to document that it doesn't work in -future. - -18. Added an error diagnosis for escapes that PCRE does not support: these are -\L, \l, \N, \P, \p, \U, \u, and \X. - -19. Although correctly diagnosing a missing ']' in a character class, PCRE was -reading past the end of the pattern in cases such as /[abcd/. - -20. PCRE was getting more memory than necessary for patterns with classes that -contained both POSIX named classes and other characters, e.g. /[[:space:]abc/. - -21. Added some code, conditional on #ifdef VPCOMPAT, to make life easier for -compiling PCRE for use with Virtual Pascal. - -22. Small fix to the Makefile to make it work properly if the build is done -outside the source tree. - -23. Added a new extension: a condition to go with recursion. If a conditional -subpattern starts with (?(R) the "true" branch is used if recursion has -happened, whereas the "false" branch is used only at the top level. - -24. When there was a very long string of literal characters (over 255 bytes -without UTF support, over 250 bytes with UTF support), the computation of how -much memory was required could be incorrect, leading to segfaults or other -strange effects. - -25. PCRE was incorrectly assuming anchoring (either to start of subject or to -start of line for a non-DOTALL pattern) when a pattern started with (.*) and -there was a subsequent back reference to those brackets. This meant that, for -example, /(.*)\d+\1/ failed to match "abc123bc". Unfortunately, it isn't -possible to check for precisely this case. All we can do is abandon the -optimization if .* occurs inside capturing brackets when there are any back -references whatsoever. (See below for a better fix that came later.) - -26. The handling of the optimization for finding the first character of a -non-anchored pattern, and for finding a character that is required later in the -match were failing in some cases. This didn't break the matching; it just -failed to optimize when it could. The way this is done has been re-implemented. - -27. Fixed typo in error message for invalid (?R item (it said "(?p"). - -28. Added a new feature that provides some of the functionality that Perl -provides with (?{...}). The facility is termed a "callout". The way it is done -in PCRE is for the caller to provide an optional function, by setting -pcre_callout to its entry point. Like pcre_malloc and pcre_free, this is a -global variable. By default it is unset, which disables all calling out. To get -the function called, the regex must include (?C) at appropriate points. This -is, in fact, equivalent to (?C0), and any number <= 255 may be given with (?C). -This provides a means of identifying different callout points. When PCRE -reaches such a point in the regex, if pcre_callout has been set, the external -function is called. It is provided with data in a structure called -pcre_callout_block, which is defined in pcre.h. If the function returns 0, -matching continues; if it returns a non-zero value, the match at the current -point fails. However, backtracking will occur if possible. [This was changed -later and other features added - see item 49 below.] - -29. pcretest is upgraded to test the callout functionality. It provides a -callout function that displays information. By default, it shows the start of -the match and the current position in the text. There are some new data escapes -to vary what happens: - - \C+ in addition, show current contents of captured substrings - \C- do not supply a callout function - \C!n return 1 when callout number n is reached - \C!n!m return 1 when callout number n is reached for the mth time - -30. If pcregrep was called with the -l option and just a single file name, it -output "" if a match was found, instead of the file name. - -31. Improve the efficiency of the POSIX API to PCRE. If the number of capturing -slots is less than POSIX_MALLOC_THRESHOLD, use a block on the stack to pass to -pcre_exec(). This saves a malloc/free per call. The default value of -POSIX_MALLOC_THRESHOLD is 10; it can be changed by --with-posix-malloc-threshold -when configuring. - -32. The default maximum size of a compiled pattern is 64K. There have been a -few cases of people hitting this limit. The code now uses macros to handle the -storing of links as offsets within the compiled pattern. It defaults to 2-byte -links, but this can be changed to 3 or 4 bytes by --with-link-size when -configuring. Tests 2 and 5 work only with 2-byte links because they output -debugging information about compiled patterns. - -33. Internal code re-arrangements: - -(a) Moved the debugging function for printing out a compiled regex into - its own source file (printint.c) and used #include to pull it into - pcretest.c and, when DEBUG is defined, into pcre.c, instead of having two - separate copies. - -(b) Defined the list of op-code names for debugging as a macro in - internal.h so that it is next to the definition of the opcodes. - -(c) Defined a table of op-code lengths for simpler skipping along compiled - code. This is again a macro in internal.h so that it is next to the - definition of the opcodes. - -34. Added support for recursive calls to individual subpatterns, along the -lines of Robin Houston's patch (but implemented somewhat differently). - -35. Further mods to the Makefile to help Win32. Also, added code to pcregrep to -allow it to read and process whole directories in Win32. This code was -contributed by Lionel Fourquaux; it has not been tested by me. - -36. Added support for named subpatterns. The Python syntax (?P...) is -used to name a group. Names consist of alphanumerics and underscores, and must -be unique. Back references use the syntax (?P=name) and recursive calls use -(?P>name) which is a PCRE extension to the Python extension. Groups still have -numbers. The function pcre_fullinfo() can be used after compilation to extract -a name/number map. There are three relevant calls: - - PCRE_INFO_NAMEENTRYSIZE yields the size of each entry in the map - PCRE_INFO_NAMECOUNT yields the number of entries - PCRE_INFO_NAMETABLE yields a pointer to the map. - -The map is a vector of fixed-size entries. The size of each entry depends on -the length of the longest name used. The first two bytes of each entry are the -group number, most significant byte first. There follows the corresponding -name, zero terminated. The names are in alphabetical order. - -37. Make the maximum literal string in the compiled code 250 for the non-UTF-8 -case instead of 255. Making it the same both with and without UTF-8 support -means that the same test output works with both. - -38. There was a case of malloc(0) in the POSIX testing code in pcretest. Avoid -calling malloc() with a zero argument. - -39. Change 25 above had to resort to a heavy-handed test for the .* anchoring -optimization. I've improved things by keeping a bitmap of backreferences with -numbers 1-31 so that if .* occurs inside capturing brackets that are not in -fact referenced, the optimization can be applied. It is unlikely that a -relevant occurrence of .* (i.e. one which might indicate anchoring or forcing -the match to follow \n) will appear inside brackets with a number greater than -31, but if it does, any back reference > 31 suppresses the optimization. - -40. Added a new compile-time option PCRE_NO_AUTO_CAPTURE. This has the effect -of disabling numbered capturing parentheses. Any opening parenthesis that is -not followed by ? behaves as if it were followed by ?: but named parentheses -can still be used for capturing (and they will acquire numbers in the usual -way). - -41. Redesigned the return codes from the match() function into yes/no/error so -that errors can be passed back from deep inside the nested calls. A malloc -failure while inside a recursive subpattern call now causes the -PCRE_ERROR_NOMEMORY return instead of quietly going wrong. - -42. It is now possible to set a limit on the number of times the match() -function is called in a call to pcre_exec(). This facility makes it possible to -limit the amount of recursion and backtracking, though not in a directly -obvious way, because the match() function is used in a number of different -circumstances. The count starts from zero for each position in the subject -string (for non-anchored patterns). The default limit is, for compatibility, a -large number, namely 10 000 000. You can change this in two ways: - -(a) When configuring PCRE before making, you can use --with-match-limit=n - to set a default value for the compiled library. - -(b) For each call to pcre_exec(), you can pass a pcre_extra block in which - a different value is set. See 45 below. - -If the limit is exceeded, pcre_exec() returns PCRE_ERROR_MATCHLIMIT. - -43. Added a new function pcre_config(int, void *) to enable run-time extraction -of things that can be changed at compile time. The first argument specifies -what is wanted and the second points to where the information is to be placed. -The current list of available information is: - - PCRE_CONFIG_UTF8 - -The output is an integer that is set to one if UTF-8 support is available; -otherwise it is set to zero. - - PCRE_CONFIG_NEWLINE - -The output is an integer that it set to the value of the code that is used for -newline. It is either LF (10) or CR (13). - - PCRE_CONFIG_LINK_SIZE - -The output is an integer that contains the number of bytes used for internal -linkage in compiled expressions. The value is 2, 3, or 4. See item 32 above. - - PCRE_CONFIG_POSIX_MALLOC_THRESHOLD - -The output is an integer that contains the threshold above which the POSIX -interface uses malloc() for output vectors. See item 31 above. - - PCRE_CONFIG_MATCH_LIMIT - -The output is an unsigned integer that contains the default limit of the number -of match() calls in a pcre_exec() execution. See 42 above. - -44. pcretest has been upgraded by the addition of the -C option. This causes it -to extract all the available output from the new pcre_config() function, and to -output it. The program then exits immediately. - -45. A need has arisen to pass over additional data with calls to pcre_exec() in -order to support additional features. One way would have been to define -pcre_exec2() (for example) with extra arguments, but this would not have been -extensible, and would also have required all calls to the original function to -be mapped to the new one. Instead, I have chosen to extend the mechanism that -is used for passing in "extra" data from pcre_study(). - -The pcre_extra structure is now exposed and defined in pcre.h. It currently -contains the following fields: - - flags a bitmap indicating which of the following fields are set - study_data opaque data from pcre_study() - match_limit a way of specifying a limit on match() calls for a specific - call to pcre_exec() - callout_data data for callouts (see 49 below) - -The flag bits are also defined in pcre.h, and are - - PCRE_EXTRA_STUDY_DATA - PCRE_EXTRA_MATCH_LIMIT - PCRE_EXTRA_CALLOUT_DATA - -The pcre_study() function now returns one of these new pcre_extra blocks, with -the actual study data pointed to by the study_data field, and the -PCRE_EXTRA_STUDY_DATA flag set. This can be passed directly to pcre_exec() as -before. That is, this change is entirely upwards-compatible and requires no -change to existing code. - -If you want to pass in additional data to pcre_exec(), you can either place it -in a pcre_extra block provided by pcre_study(), or create your own pcre_extra -block. - -46. pcretest has been extended to test the PCRE_EXTRA_MATCH_LIMIT feature. If a -data string contains the escape sequence \M, pcretest calls pcre_exec() several -times with different match limits, until it finds the minimum value needed for -pcre_exec() to complete. The value is then output. This can be instructive; for -most simple matches the number is quite small, but for pathological cases it -gets very large very quickly. - -47. There's a new option for pcre_fullinfo() called PCRE_INFO_STUDYSIZE. It -returns the size of the data block pointed to by the study_data field in a -pcre_extra block, that is, the value that was passed as the argument to -pcre_malloc() when PCRE was getting memory in which to place the information -created by pcre_study(). The fourth argument should point to a size_t variable. -pcretest has been extended so that this information is shown after a successful -pcre_study() call when information about the compiled regex is being displayed. - -48. Cosmetic change to Makefile: there's no need to have / after $(DESTDIR) -because what follows is always an absolute path. (Later: it turns out that this -is more than cosmetic for MinGW, because it doesn't like empty path -components.) - -49. Some changes have been made to the callout feature (see 28 above): - -(i) A callout function now has three choices for what it returns: - - 0 => success, carry on matching - > 0 => failure at this point, but backtrack if possible - < 0 => serious error, return this value from pcre_exec() - - Negative values should normally be chosen from the set of PCRE_ERROR_xxx - values. In particular, returning PCRE_ERROR_NOMATCH forces a standard - "match failed" error. The error number PCRE_ERROR_CALLOUT is reserved for - use by callout functions. It will never be used by PCRE itself. - -(ii) The pcre_extra structure (see 45 above) has a void * field called - callout_data, with corresponding flag bit PCRE_EXTRA_CALLOUT_DATA. The - pcre_callout_block structure has a field of the same name. The contents of - the field passed in the pcre_extra structure are passed to the callout - function in the corresponding field in the callout block. This makes it - easier to use the same callout-containing regex from multiple threads. For - testing, the pcretest program has a new data escape - - \C*n pass the number n (may be negative) as callout_data - - If the callout function in pcretest receives a non-zero value as - callout_data, it returns that value. - -50. Makefile wasn't handling CFLAGS properly when compiling dftables. Also, -there were some redundant $(CFLAGS) in commands that are now specified as -$(LINK), which already includes $(CFLAGS). - -51. Extensions to UTF-8 support are listed below. These all apply when (a) PCRE -has been compiled with UTF-8 support *and* pcre_compile() has been compiled -with the PCRE_UTF8 flag. Patterns that are compiled without that flag assume -one-byte characters throughout. Note that case-insensitive matching applies -only to characters whose values are less than 256. PCRE doesn't support the -notion of cases for higher-valued characters. - -(i) A character class whose characters are all within 0-255 is handled as - a bit map, and the map is inverted for negative classes. Previously, a - character > 255 always failed to match such a class; however it should - match if the class was a negative one (e.g. [^ab]). This has been fixed. - -(ii) A negated character class with a single character < 255 is coded as - "not this character" (OP_NOT). This wasn't working properly when the test - character was multibyte, either singly or repeated. - -(iii) Repeats of multibyte characters are now handled correctly in UTF-8 - mode, for example: \x{100}{2,3}. - -(iv) The character escapes \b, \B, \d, \D, \s, \S, \w, and \W (either - singly or repeated) now correctly test multibyte characters. However, - PCRE doesn't recognize any characters with values greater than 255 as - digits, spaces, or word characters. Such characters always match \D, \S, - and \W, and never match \d, \s, or \w. - -(v) Classes may now contain characters and character ranges with values - greater than 255. For example: [ab\x{100}-\x{400}]. - -(vi) pcregrep now has a --utf-8 option (synonym -u) which makes it call - PCRE in UTF-8 mode. - -52. The info request value PCRE_INFO_FIRSTCHAR has been renamed -PCRE_INFO_FIRSTBYTE because it is a byte value. However, the old name is -retained for backwards compatibility. (Note that LASTLITERAL is also a byte -value.) - -53. The single man page has become too large. I have therefore split it up into -a number of separate man pages. These also give rise to individual HTML pages; -these are now put in a separate directory, and there is an index.html page that -lists them all. Some hyperlinking between the pages has been installed. - -54. Added convenience functions for handling named capturing parentheses. - -55. Unknown escapes inside character classes (e.g. [\M]) and escapes that -aren't interpreted therein (e.g. [\C]) are literals in Perl. This is now also -true in PCRE, except when the PCRE_EXTENDED option is set, in which case they -are faulted. - -56. Introduced HOST_CC and HOST_CFLAGS which can be set in the environment when -calling configure. These values are used when compiling the dftables.c program -which is run to generate the source of the default character tables. They -default to the values of CC and CFLAGS. If you are cross-compiling PCRE, -you will need to set these values. - -57. Updated the building process for Windows DLL, as provided by Fred Cox. - - -Version 3.9 02-Jan-02 ---------------------- - -1. A bit of extraneous text had somehow crept into the pcregrep documentation. - -2. If --disable-static was given, the building process failed when trying to -build pcretest and pcregrep. (For some reason it was using libtool to compile -them, which is not right, as they aren't part of the library.) - - -Version 3.8 18-Dec-01 ---------------------- - -1. The experimental UTF-8 code was completely screwed up. It was packing the -bytes in the wrong order. How dumb can you get? - - -Version 3.7 29-Oct-01 ---------------------- - -1. In updating pcretest to check change 1 of version 3.6, I screwed up. -This caused pcretest, when used on the test data, to segfault. Unfortunately, -this didn't happen under Solaris 8, where I normally test things. - -2. The Makefile had to be changed to make it work on BSD systems, where 'make' -doesn't seem to recognize that ./xxx and xxx are the same file. (This entry -isn't in ChangeLog distributed with 3.7 because I forgot when I hastily made -this fix an hour or so after the initial 3.7 release.) - - -Version 3.6 23-Oct-01 ---------------------- - -1. Crashed with /(sens|respons)e and \1ibility/ and "sense and sensibility" if -offsets passed as NULL with zero offset count. - -2. The config.guess and config.sub files had not been updated when I moved to -the latest autoconf. - - -Version 3.5 15-Aug-01 ---------------------- - -1. Added some missing #if !defined NOPOSIX conditionals in pcretest.c that -had been forgotten. - -2. By using declared but undefined structures, we can avoid using "void" -definitions in pcre.h while keeping the internal definitions of the structures -private. - -3. The distribution is now built using autoconf 2.50 and libtool 1.4. From a -user point of view, this means that both static and shared libraries are built -by default, but this can be individually controlled. More of the work of -handling this static/shared cases is now inside libtool instead of PCRE's make -file. - -4. The pcretest utility is now installed along with pcregrep because it is -useful for users (to test regexs) and by doing this, it automatically gets -relinked by libtool. The documentation has been turned into a man page, so -there are now .1, .txt, and .html versions in /doc. - -5. Upgrades to pcregrep: - (i) Added long-form option names like gnu grep. - (ii) Added --help to list all options with an explanatory phrase. - (iii) Added -r, --recursive to recurse into sub-directories. - (iv) Added -f, --file to read patterns from a file. - -6. pcre_exec() was referring to its "code" argument before testing that -argument for NULL (and giving an error if it was NULL). - -7. Upgraded Makefile.in to allow for compiling in a different directory from -the source directory. - -8. Tiny buglet in pcretest: when pcre_fullinfo() was called to retrieve the -options bits, the pointer it was passed was to an int instead of to an unsigned -long int. This mattered only on 64-bit systems. - -9. Fixed typo (3.4/1) in pcre.h again. Sigh. I had changed pcre.h (which is -generated) instead of pcre.in, which it its source. Also made the same change -in several of the .c files. - -10. A new release of gcc defines printf() as a macro, which broke pcretest -because it had an ifdef in the middle of a string argument for printf(). Fixed -by using separate calls to printf(). - -11. Added --enable-newline-is-cr and --enable-newline-is-lf to the configure -script, to force use of CR or LF instead of \n in the source. On non-Unix -systems, the value can be set in config.h. - -12. The limit of 200 on non-capturing parentheses is a _nesting_ limit, not an -absolute limit. Changed the text of the error message to make this clear, and -likewise updated the man page. - -13. The limit of 99 on the number of capturing subpatterns has been removed. -The new limit is 65535, which I hope will not be a "real" limit. - - -Version 3.4 22-Aug-00 ---------------------- - -1. Fixed typo in pcre.h: unsigned const char * changed to const unsigned char *. - -2. Diagnose condition (?(0) as an error instead of crashing on matching. - - -Version 3.3 01-Aug-00 ---------------------- - -1. If an octal character was given, but the value was greater than \377, it -was not getting masked to the least significant bits, as documented. This could -lead to crashes in some systems. - -2. Perl 5.6 (if not earlier versions) accepts classes like [a-\d] and treats -the hyphen as a literal. PCRE used to give an error; it now behaves like Perl. - -3. Added the functions pcre_free_substring() and pcre_free_substring_list(). -These just pass their arguments on to (pcre_free)(), but they are provided -because some uses of PCRE bind it to non-C systems that can call its functions, -but cannot call free() or pcre_free() directly. - -4. Add "make test" as a synonym for "make check". Corrected some comments in -the Makefile. - -5. Add $(DESTDIR)/ in front of all the paths in the "install" target in the -Makefile. - -6. Changed the name of pgrep to pcregrep, because Solaris has introduced a -command called pgrep for grepping around the active processes. - -7. Added the beginnings of support for UTF-8 character strings. - -8. Arranged for the Makefile to pass over the settings of CC, CFLAGS, and -RANLIB to ./ltconfig so that they are used by libtool. I think these are all -the relevant ones. (AR is not passed because ./ltconfig does its own figuring -out for the ar command.) - - -Version 3.2 12-May-00 ---------------------- - -This is purely a bug fixing release. - -1. If the pattern /((Z)+|A)*/ was matched agained ZABCDEFG it matched Z instead -of ZA. This was just one example of several cases that could provoke this bug, -which was introduced by change 9 of version 2.00. The code for breaking -infinite loops after an iteration that matches an empty string was't working -correctly. - -2. The pcretest program was not imitating Perl correctly for the pattern /a*/g -when matched against abbab (for example). After matching an empty string, it -wasn't forcing anchoring when setting PCRE_NOTEMPTY for the next attempt; this -caused it to match further down the string than it should. - -3. The code contained an inclusion of sys/types.h. It isn't clear why this -was there because it doesn't seem to be needed, and it causes trouble on some -systems, as it is not a Standard C header. It has been removed. - -4. Made 4 silly changes to the source to avoid stupid compiler warnings that -were reported on the Macintosh. The changes were from - - while ((c = *(++ptr)) != 0 && c != '\n'); -to - while ((c = *(++ptr)) != 0 && c != '\n') ; - -Totally extraordinary, but if that's what it takes... - -5. PCRE is being used in one environment where neither memmove() nor bcopy() is -available. Added HAVE_BCOPY and an autoconf test for it; if neither -HAVE_MEMMOVE nor HAVE_BCOPY is set, use a built-in emulation function which -assumes the way PCRE uses memmove() (always moving upwards). - -6. PCRE is being used in one environment where strchr() is not available. There -was only one use in pcre.c, and writing it out to avoid strchr() probably gives -faster code anyway. - - -Version 3.1 09-Feb-00 ---------------------- - -The only change in this release is the fixing of some bugs in Makefile.in for -the "install" target: - -(1) It was failing to install pcreposix.h. - -(2) It was overwriting the pcre.3 man page with the pcreposix.3 man page. - - -Version 3.0 01-Feb-00 ---------------------- - -1. Add support for the /+ modifier to perltest (to output $` like it does in -pcretest). - -2. Add support for the /g modifier to perltest. - -3. Fix pcretest so that it behaves even more like Perl for /g when the pattern -matches null strings. - -4. Fix perltest so that it doesn't do unwanted things when fed an empty -pattern. Perl treats empty patterns specially - it reuses the most recent -pattern, which is not what we want. Replace // by /(?#)/ in order to avoid this -effect. - -5. The POSIX interface was broken in that it was just handing over the POSIX -captured string vector to pcre_exec(), but (since release 2.00) PCRE has -required a bigger vector, with some working space on the end. This means that -the POSIX wrapper now has to get and free some memory, and copy the results. - -6. Added some simple autoconf support, placing the test data and the -documentation in separate directories, re-organizing some of the -information files, and making it build pcre-config (a GNU standard). Also added -libtool support for building PCRE as a shared library, which is now the -default. - -7. Got rid of the leading zero in the definition of PCRE_MINOR because 08 and -09 are not valid octal constants. Single digits will be used for minor values -less than 10. - -8. Defined REG_EXTENDED and REG_NOSUB as zero in the POSIX header, so that -existing programs that set these in the POSIX interface can use PCRE without -modification. - -9. Added a new function, pcre_fullinfo() with an extensible interface. It can -return all that pcre_info() returns, plus additional data. The pcre_info() -function is retained for compatibility, but is considered to be obsolete. - -10. Added experimental recursion feature (?R) to handle one common case that -Perl 5.6 will be able to do with (?p{...}). - -11. Added support for POSIX character classes like [:alpha:], which Perl is -adopting. - - -Version 2.08 31-Aug-99 ----------------------- - -1. When startoffset was not zero and the pattern began with ".*", PCRE was not -trying to match at the startoffset position, but instead was moving forward to -the next newline as if a previous match had failed. - -2. pcretest was not making use of PCRE_NOTEMPTY when repeating for /g and /G, -and could get into a loop if a null string was matched other than at the start -of the subject. - -3. Added definitions of PCRE_MAJOR and PCRE_MINOR to pcre.h so the version can -be distinguished at compile time, and for completeness also added PCRE_DATE. - -5. Added Paul Sokolovsky's minor changes to make it easy to compile a Win32 DLL -in GnuWin32 environments. - - -Version 2.07 29-Jul-99 ----------------------- - -1. The documentation is now supplied in plain text form and HTML as well as in -the form of man page sources. - -2. C++ compilers don't like assigning (void *) values to other pointer types. -In particular this affects malloc(). Although there is no problem in Standard -C, I've put in casts to keep C++ compilers happy. - -3. Typo on pcretest.c; a cast of (unsigned char *) in the POSIX regexec() call -should be (const char *). - -4. If NOPOSIX is defined, pcretest.c compiles without POSIX support. This may -be useful for non-Unix systems who don't want to bother with the POSIX stuff. -However, I haven't made this a standard facility. The documentation doesn't -mention it, and the Makefile doesn't support it. - -5. The Makefile now contains an "install" target, with editable destinations at -the top of the file. The pcretest program is not installed. - -6. pgrep -V now gives the PCRE version number and date. - -7. Fixed bug: a zero repetition after a literal string (e.g. /abcde{0}/) was -causing the entire string to be ignored, instead of just the last character. - -8. If a pattern like /"([^\\"]+|\\.)*"/ is applied in the normal way to a -non-matching string, it can take a very, very long time, even for strings of -quite modest length, because of the nested recursion. PCRE now does better in -some of these cases. It does this by remembering the last required literal -character in the pattern, and pre-searching the subject to ensure it is present -before running the real match. In other words, it applies a heuristic to detect -some types of certain failure quickly, and in the above example, if presented -with a string that has no trailing " it gives "no match" very quickly. - -9. A new runtime option PCRE_NOTEMPTY causes null string matches to be ignored; -other alternatives are tried instead. - - -Version 2.06 09-Jun-99 ----------------------- - -1. Change pcretest's output for amount of store used to show just the code -space, because the remainder (the data block) varies in size between 32-bit and -64-bit systems. - -2. Added an extra argument to pcre_exec() to supply an offset in the subject to -start matching at. This allows lookbehinds to work when searching for multiple -occurrences in a string. - -3. Added additional options to pcretest for testing multiple occurrences: - - /+ outputs the rest of the string that follows a match - /g loops for multiple occurrences, using the new startoffset argument - /G loops for multiple occurrences by passing an incremented pointer - -4. PCRE wasn't doing the "first character" optimization for patterns starting -with \b or \B, though it was doing it for other lookbehind assertions. That is, -it wasn't noticing that a match for a pattern such as /\bxyz/ has to start with -the letter 'x'. On long subject strings, this gives a significant speed-up. - - -Version 2.05 21-Apr-99 ----------------------- - -1. Changed the type of magic_number from int to long int so that it works -properly on 16-bit systems. - -2. Fixed a bug which caused patterns starting with .* not to work correctly -when the subject string contained newline characters. PCRE was assuming -anchoring for such patterns in all cases, which is not correct because .* will -not pass a newline unless PCRE_DOTALL is set. It now assumes anchoring only if -DOTALL is set at top level; otherwise it knows that patterns starting with .* -must be retried after every newline in the subject. - - -Version 2.04 18-Feb-99 ----------------------- - -1. For parenthesized subpatterns with repeats whose minimum was zero, the -computation of the store needed to hold the pattern was incorrect (too large). -If such patterns were nested a few deep, this could multiply and become a real -problem. - -2. Added /M option to pcretest to show the memory requirement of a specific -pattern. Made -m a synonym of -s (which does this globally) for compatibility. - -3. Subpatterns of the form (regex){n,m} (i.e. limited maximum) were being -compiled in such a way that the backtracking after subsequent failure was -pessimal. Something like (a){0,3} was compiled as (a)?(a)?(a)? instead of -((a)((a)(a)?)?)? with disastrous performance if the maximum was of any size. - - -Version 2.03 02-Feb-99 ----------------------- - -1. Fixed typo and small mistake in man page. - -2. Added 4th condition (GPL supersedes if conflict) and created separate -LICENCE file containing the conditions. - -3. Updated pcretest so that patterns such as /abc\/def/ work like they do in -Perl, that is the internal \ allows the delimiter to be included in the -pattern. Locked out the use of \ as a delimiter. If \ immediately follows -the final delimiter, add \ to the end of the pattern (to test the error). - -4. Added the convenience functions for extracting substrings after a successful -match. Updated pcretest to make it able to test these functions. - - -Version 2.02 14-Jan-99 ----------------------- - -1. Initialized the working variables associated with each extraction so that -their saving and restoring doesn't refer to uninitialized store. - -2. Put dummy code into study.c in order to trick the optimizer of the IBM C -compiler for OS/2 into generating correct code. Apparently IBM isn't going to -fix the problem. - -3. Pcretest: the timing code wasn't using LOOPREPEAT for timing execution -calls, and wasn't printing the correct value for compiling calls. Increased the -default value of LOOPREPEAT, and the number of significant figures in the -times. - -4. Changed "/bin/rm" in the Makefile to "-rm" so it works on Windows NT. - -5. Renamed "deftables" as "dftables" to get it down to 8 characters, to avoid -a building problem on Windows NT with a FAT file system. - - -Version 2.01 21-Oct-98 ----------------------- - -1. Changed the API for pcre_compile() to allow for the provision of a pointer -to character tables built by pcre_maketables() in the current locale. If NULL -is passed, the default tables are used. - - -Version 2.00 24-Sep-98 ----------------------- - -1. Since the (>?) facility is in Perl 5.005, don't require PCRE_EXTRA to enable -it any more. - -2. Allow quantification of (?>) groups, and make it work correctly. - -3. The first character computation wasn't working for (?>) groups. - -4. Correct the implementation of \Z (it is permitted to match on the \n at the -end of the subject) and add 5.005's \z, which really does match only at the -very end of the subject. - -5. Remove the \X "cut" facility; Perl doesn't have it, and (?> is neater. - -6. Remove the ability to specify CASELESS, MULTILINE, DOTALL, and -DOLLAR_END_ONLY at runtime, to make it possible to implement the Perl 5.005 -localized options. All options to pcre_study() were also removed. - -7. Add other new features from 5.005: - - $(?<= positive lookbehind - $(?a*))*/ (a PCRE_EXTRA facility). - - -Version 1.00 18-Nov-97 ----------------------- - -1. Added compile-time macros to support systems such as SunOS4 which don't have -memmove() or strerror() but have other things that can be used instead. - -2. Arranged that "make clean" removes the executables. - - -Version 0.99 27-Oct-97 ----------------------- - -1. Fixed bug in code for optimizing classes with only one character. It was -initializing a 32-byte map regardless, which could cause it to run off the end -of the memory it had got. - -2. Added, conditional on PCRE_EXTRA, the proposed (?>REGEX) construction. - - -Version 0.98 22-Oct-97 ----------------------- - -1. Fixed bug in code for handling temporary memory usage when there are more -back references than supplied space in the ovector. This could cause segfaults. - - -Version 0.97 21-Oct-97 ----------------------- - -1. Added the \X "cut" facility, conditional on PCRE_EXTRA. - -2. Optimized negated single characters not to use a bit map. - -3. Brought error texts together as macro definitions; clarified some of them; -fixed one that was wrong - it said "range out of order" when it meant "invalid -escape sequence". - -4. Changed some char * arguments to const char *. - -5. Added PCRE_NOTBOL and PCRE_NOTEOL (from POSIX). - -6. Added the POSIX-style API wrapper in pcreposix.a and testing facilities in -pcretest. - - -Version 0.96 16-Oct-97 ----------------------- - -1. Added a simple "pgrep" utility to the distribution. - -2. Fixed an incompatibility with Perl: "{" is now treated as a normal character -unless it appears in one of the precise forms "{ddd}", "{ddd,}", or "{ddd,ddd}" -where "ddd" means "one or more decimal digits". - -3. Fixed serious bug. If a pattern had a back reference, but the call to -pcre_exec() didn't supply a large enough ovector to record the related -identifying subpattern, the match always failed. PCRE now remembers the number -of the largest back reference, and gets some temporary memory in which to save -the offsets during matching if necessary, in order to ensure that -backreferences always work. - -4. Increased the compatibility with Perl in a number of ways: - - (a) . no longer matches \n by default; an option PCRE_DOTALL is provided - to request this handling. The option can be set at compile or exec time. - - (b) $ matches before a terminating newline by default; an option - PCRE_DOLLAR_ENDONLY is provided to override this (but not in multiline - mode). The option can be set at compile or exec time. - - (c) The handling of \ followed by a digit other than 0 is now supposed to be - the same as Perl's. If the decimal number it represents is less than 10 - or there aren't that many previous left capturing parentheses, an octal - escape is read. Inside a character class, it's always an octal escape, - even if it is a single digit. - - (d) An escaped but undefined alphabetic character is taken as a literal, - unless PCRE_EXTRA is set. Currently this just reserves the remaining - escapes. - - (e) {0} is now permitted. (The previous item is removed from the compiled - pattern). - -5. Changed all the names of code files so that the basic parts are no longer -than 10 characters, and abolished the teeny "globals.c" file. - -6. Changed the handling of character classes; they are now done with a 32-byte -bit map always. - -7. Added the -d and /D options to pcretest to make it possible to look at the -internals of compilation without having to recompile pcre. - - -Version 0.95 23-Sep-97 ----------------------- - -1. Fixed bug in pre-pass concerning escaped "normal" characters such as \x5c or -\x20 at the start of a run of normal characters. These were being treated as -real characters, instead of the source characters being re-checked. - - -Version 0.94 18-Sep-97 ----------------------- - -1. The functions are now thread-safe, with the caveat that the global variables -containing pointers to malloc() and free() or alternative functions are the -same for all threads. - -2. Get pcre_study() to generate a bitmap of initial characters for non- -anchored patterns when this is possible, and use it if passed to pcre_exec(). - - -Version 0.93 15-Sep-97 ----------------------- - -1. /(b)|(:+)/ was computing an incorrect first character. - -2. Add pcre_study() to the API and the passing of pcre_extra to pcre_exec(), -but not actually doing anything yet. - -3. Treat "-" characters in classes that cannot be part of ranges as literals, -as Perl does (e.g. [-az] or [az-]). - -4. Set the anchored flag if a branch starts with .* or .*? because that tests -all possible positions. - -5. Split up into different modules to avoid including unneeded functions in a -compiled binary. However, compile and exec are still in one module. The "study" -function is split off. - -6. The character tables are now in a separate module whose source is generated -by an auxiliary program - but can then be edited by hand if required. There are -now no calls to isalnum(), isspace(), isdigit(), isxdigit(), tolower() or -toupper() in the code. - -7. Turn the malloc/free funtions variables into pcre_malloc and pcre_free and -make them global. Abolish the function for setting them, as the caller can now -set them directly. - - -Version 0.92 11-Sep-97 ----------------------- - -1. A repeat with a fixed maximum and a minimum of 1 for an ordinary character -(e.g. /a{1,3}/) was broken (I mis-optimized it). - -2. Caseless matching was not working in character classes if the characters in -the pattern were in upper case. - -3. Make ranges like [W-c] work in the same way as Perl for caseless matching. - -4. Make PCRE_ANCHORED public and accept as a compile option. - -5. Add an options word to pcre_exec() and accept PCRE_ANCHORED and -PCRE_CASELESS at run time. Add escapes \A and \I to pcretest to cause it to -pass them. - -6. Give an error if bad option bits passed at compile or run time. - -7. Add PCRE_MULTILINE at compile and exec time, and (?m) as well. Add \M to -pcretest to cause it to pass that flag. - -8. Add pcre_info(), to get the number of identifying subpatterns, the stored -options, and the first character, if set. - -9. Recognize C+ or C{n,m} where n >= 1 as providing a fixed starting character. - - -Version 0.91 10-Sep-97 ----------------------- - -1. PCRE was failing to diagnose unlimited repeats of subpatterns that could -match the empty string as in /(a*)*/. It was looping and ultimately crashing. - -2. PCRE was looping on encountering an indefinitely repeated back reference to -a subpattern that had matched an empty string, e.g. /(a|)\1*/. It now does what -Perl does - treats the match as successful. - -**** diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/LICENCE b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/LICENCE deleted file mode 100644 index dd9071a8..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/LICENCE +++ /dev/null @@ -1,93 +0,0 @@ -PCRE LICENCE ------------- - -PCRE is a library of functions to support regular expressions whose syntax -and semantics are as close as possible to those of the Perl 5 language. - -Release 8 of PCRE is distributed under the terms of the "BSD" licence, as -specified below. The documentation for PCRE, supplied in the "doc" -directory, is distributed under the same terms as the software itself. The data -in the testdata directory is not copyrighted and is in the public domain. - -The basic library functions are written in C and are freestanding. Also -included in the distribution is a set of C++ wrapper functions, and a -just-in-time compiler that can be used to optimize pattern matching. These -are both optional features that can be omitted when the library is built. - - -THE BASIC LIBRARY FUNCTIONS ---------------------------- - -Written by: Philip Hazel -Email local part: ph10 -Email domain: cam.ac.uk - -University of Cambridge Computing Service, -Cambridge, England. - -Copyright (c) 1997-2017 University of Cambridge -All rights reserved. - - -PCRE JUST-IN-TIME COMPILATION SUPPORT -------------------------------------- - -Written by: Zoltan Herczeg -Email local part: hzmester -Emain domain: freemail.hu - -Copyright(c) 2010-2017 Zoltan Herczeg -All rights reserved. - - -STACK-LESS JUST-IN-TIME COMPILER --------------------------------- - -Written by: Zoltan Herczeg -Email local part: hzmester -Emain domain: freemail.hu - -Copyright(c) 2009-2017 Zoltan Herczeg -All rights reserved. - - -THE C++ WRAPPER FUNCTIONS -------------------------- - -Contributed by: Google Inc. - -Copyright (c) 2007-2012, Google Inc. -All rights reserved. - - -THE "BSD" LICENCE ------------------ - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - - * Neither the name of the University of Cambridge nor the name of Google - Inc. nor the names of their contributors may be used to endorse or - promote products derived from this software without specific prior - written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. - -End diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/NEWS b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/NEWS deleted file mode 100644 index 36be07cb..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/NEWS +++ /dev/null @@ -1,737 +0,0 @@ -News about PCRE releases ------------------------- - -Release 8.41 13-June-2017 -------------------------- - -This is a bug-fix release. - - -Release 8.40 11-January-2017 ----------------------------- - -This is a bug-fix release. - - -Release 8.39 14-June-2016 -------------------------- - -Some appropriate PCRE2 JIT improvements have been retro-fitted to PCRE1. Apart -from that, this is another bug-fix release. Note that this library (now called -PCRE1) is now being maintained for bug fixes only. New projects are advised to -use the new PCRE2 libraries. - - -Release 8.38 23-November-2015 ------------------------------ - -This is bug-fix release. Note that this library (now called PCRE1) is now being -maintained for bug fixes only. New projects are advised to use the new PCRE2 -libraries. - - -Release 8.37 28-April-2015 --------------------------- - -This is bug-fix release. Note that this library (now called PCRE1) is now being -maintained for bug fixes only. New projects are advised to use the new PCRE2 -libraries. - - -Release 8.36 26-September-2014 ------------------------------- - -This is primarily a bug-fix release. However, in addition, the Unicode data -tables have been updated to Unicode 7.0.0. - - -Release 8.35 04-April-2014 --------------------------- - -There have been performance improvements for classes containing non-ASCII -characters and the "auto-possessification" feature has been extended. Other -minor improvements have been implemented and bugs fixed. There is a new callout -feature to enable applications to do detailed stack checks at compile time, to -avoid running out of stack for deeply nested parentheses. The JIT compiler has -been extended with experimental support for ARM-64, MIPS-64, and PPC-LE. - - -Release 8.34 15-December-2013 ------------------------------ - -As well as fixing the inevitable bugs, performance has been improved by -refactoring and extending the amount of "auto-possessification" that PCRE does. -Other notable changes: - -. Implemented PCRE_INFO_MATCH_EMPTY, which yields 1 if the pattern can match - an empty string. If it can, pcretest shows this in its information output. - -. A back reference to a named subpattern when there is more than one of the - same name now checks them in the order in which they appear in the pattern. - The first one that is set is used for the reference. Previously only the - first one was inspected. This change makes PCRE more compatible with Perl. - -. Unicode character properties were updated from Unicode 6.3.0. - -. The character VT has been added to the set of characters that match \s and - are generally treated as white space, following this same change in Perl - 5.18. There is now no difference between "Perl space" and "POSIX space". - -. Perl has changed its handling of \8 and \9. If there is no previously - encountered capturing group of those numbers, they are treated as the - literal characters 8 and 9 instead of a binary zero followed by the - literals. PCRE now does the same. - -. Following Perl, added \o{} to specify codepoints in octal, making it - possible to specify values greater than 0777 and also making them - unambiguous. - -. In UCP mode, \s was not matching two of the characters that Perl matches, - namely NEL (U+0085) and MONGOLIAN VOWEL SEPARATOR (U+180E), though they - were matched by \h. - -. Add JIT support for the 64 bit TileGX architecture. - -. Upgraded the handling of the POSIX classes [:graph:], [:print:], and - [:punct:] when PCRE_UCP is set so as to include the same characters as Perl - does in Unicode mode. - -. Perl no longer allows group names to start with digits, so I have made this - change also in PCRE. - -. Added support for [[:<:]] and [[:>:]] as used in the BSD POSIX library to - mean "start of word" and "end of word", respectively, as a transition aid. - - -Release 8.33 28-May-2013 --------------------------- - -A number of bugs are fixed, and some performance improvements have been made. -There are also some new features, of which these are the most important: - -. The behaviour of the backtracking verbs has been rationalized and - documented in more detail. - -. JIT now supports callouts and all of the backtracking verbs. - -. Unicode validation has been updated in the light of Unicode Corrigendum #9, - which points out that "non characters" are not "characters that may not - appear in Unicode strings" but rather "characters that are reserved for - internal use and have only local meaning". - -. (*LIMIT_MATCH=d) and (*LIMIT_RECURSION=d) have been added so that the - creator of a pattern can specify lower (but not higher) limits for the - matching process. - -. The PCRE_NEVER_UTF option is available to prevent pattern-writers from using - the (*UTF) feature, as this could be a security issue. - - -Release 8.32 30-November-2012 ------------------------------ - -This release fixes a number of bugs, but also has some new features. These are -the highlights: - -. There is now support for 32-bit character strings and UTF-32. Like the - 16-bit support, this is done by compiling a separate 32-bit library. - -. \X now matches a Unicode extended grapheme cluster. - -. Case-independent matching of Unicode characters that have more than one - "other case" now makes all three (or more) characters equivalent. This - applies, for example, to Greek Sigma, which has two lowercase versions. - -. Unicode character properties are updated to Unicode 6.2.0. - -. The EBCDIC support, which had decayed, has had a spring clean. - -. A number of JIT optimizations have been added, which give faster JIT - execution speed. In addition, a new direct interface to JIT execution is - available. This bypasses some of the sanity checks of pcre_exec() to give a - noticeable speed-up. - -. A number of issues in pcregrep have been fixed, making it more compatible - with GNU grep. In particular, --exclude and --include (and variants) apply - to all files now, not just those obtained from scanning a directory - recursively. In Windows environments, the default action for directories is - now "skip" instead of "read" (which provokes an error). - -. If the --only-matching (-o) option in pcregrep is specified multiple - times, each one causes appropriate output. For example, -o1 -o2 outputs the - substrings matched by the 1st and 2nd capturing parentheses. A separating - string can be specified by --om-separator (default empty). - -. When PCRE is built via Autotools using a version of gcc that has the - "visibility" feature, it is used to hide internal library functions that are - not part of the public API. - - -Release 8.31 06-July-2012 -------------------------- - -This is mainly a bug-fixing release, with a small number of developments: - -. The JIT compiler now supports partial matching and the (*MARK) and - (*COMMIT) verbs. - -. PCRE_INFO_MAXLOOKBEHIND can be used to find the longest lookbehind in a - pattern. - -. There should be a performance improvement when using the heap instead of the - stack for recursion. - -. pcregrep can now be linked with libedit as an alternative to libreadline. - -. pcregrep now has a --file-list option where the list of files to scan is - given as a file. - -. pcregrep now recognizes binary files and there are related options. - -. The Unicode tables have been updated to 6.1.0. - -As always, the full list of changes is in the ChangeLog file. - - -Release 8.30 04-February-2012 ------------------------------ - -Release 8.30 introduces a major new feature: support for 16-bit character -strings, compiled as a separate library. There are a few changes to the -8-bit library, in addition to some bug fixes. - -. The pcre_info() function, which has been obsolete for over 10 years, has - been removed. - -. When a compiled pattern was saved to a file and later reloaded on a host - with different endianness, PCRE used automatically to swap the bytes in some - of the data fields. With the advent of the 16-bit library, where more of this - swapping is needed, it is no longer done automatically. Instead, the bad - endianness is detected and a specific error is given. The user can then call - a new function called pcre_pattern_to_host_byte_order() (or an equivalent - 16-bit function) to do the swap. - -. In UTF-8 mode, the values 0xd800 to 0xdfff are not legal Unicode - code points and are now faulted. (They are the so-called "surrogates" - that are reserved for coding high values in UTF-16.) - - -Release 8.21 12-Dec-2011 ------------------------- - -This is almost entirely a bug-fix release. The only new feature is the ability -to obtain the size of the memory used by the JIT compiler. - - -Release 8.20 21-Oct-2011 ------------------------- - -The main change in this release is the inclusion of Zoltan Herczeg's -just-in-time compiler support, which can be accessed by building PCRE with ---enable-jit. Large performance benefits can be had in many situations. 8.20 -also fixes an unfortunate bug that was introduced in 8.13 as well as tidying up -a number of infelicities and differences from Perl. - - -Release 8.13 16-Aug-2011 ------------------------- - -This is mainly a bug-fix release. There has been a lot of internal refactoring. -The Unicode tables have been updated. The only new feature in the library is -the passing of *MARK information to callouts. Some additions have been made to -pcretest to make testing easier and more comprehensive. There is a new option -for pcregrep to adjust its internal buffer size. - - -Release 8.12 15-Jan-2011 ------------------------- - -This release fixes some bugs in pcregrep, one of which caused the tests to fail -on 64-bit big-endian systems. There are no changes to the code of the library. - - -Release 8.11 10-Dec-2010 ------------------------- - -A number of bugs in the library and in pcregrep have been fixed. As always, see -ChangeLog for details. The following are the non-bug-fix changes: - -. Added --match-limit and --recursion-limit to pcregrep. - -. Added an optional parentheses number to the -o and --only-matching options - of pcregrep. - -. Changed the way PCRE_PARTIAL_HARD affects the matching of $, \z, \Z, \b, and - \B. - -. Added PCRE_ERROR_SHORTUTF8 to make it possible to distinguish between a - bad UTF-8 sequence and one that is incomplete when using PCRE_PARTIAL_HARD. - -. Recognize (*NO_START_OPT) at the start of a pattern to set the PCRE_NO_ - START_OPTIMIZE option, which is now allowed at compile time - - -Release 8.10 25-Jun-2010 ------------------------- - -There are two major additions: support for (*MARK) and friends, and the option -PCRE_UCP, which changes the behaviour of \b, \d, \s, and \w (and their -opposites) so that they make use of Unicode properties. There are also a number -of lesser new features, and several bugs have been fixed. A new option, ---line-buffered, has been added to pcregrep, for use when it is connected to -pipes. - - -Release 8.02 19-Mar-2010 ------------------------- - -Another bug-fix release. - - -Release 8.01 19-Jan-2010 ------------------------- - -This is a bug-fix release. Several bugs in the code itself and some bugs and -infelicities in the build system have been fixed. - - -Release 8.00 19-Oct-09 ----------------------- - -Bugs have been fixed in the library and in pcregrep. There are also some -enhancements. Restrictions on patterns used for partial matching have been -removed, extra information is given for partial matches, the partial matching -process has been improved, and an option to make a partial match override a -full match is available. The "study" process has been enhanced by finding a -lower bound matching length. Groups with duplicate numbers may now have -duplicated names without the use of PCRE_DUPNAMES. However, they may not have -different names. The documentation has been revised to reflect these changes. -The version number has been expanded to 3 digits as it is clear that the rate -of change is not slowing down. - - -Release 7.9 11-Apr-09 ---------------------- - -Mostly bugfixes and tidies with just a couple of minor functional additions. - - -Release 7.8 05-Sep-08 ---------------------- - -More bug fixes, plus a performance improvement in Unicode character property -lookup. - - -Release 7.7 07-May-08 ---------------------- - -This is once again mainly a bug-fix release, but there are a couple of new -features. - - -Release 7.6 28-Jan-08 ---------------------- - -The main reason for having this release so soon after 7.5 is because it fixes a -potential buffer overflow problem in pcre_compile() when run in UTF-8 mode. In -addition, the CMake configuration files have been brought up to date. - - -Release 7.5 10-Jan-08 ---------------------- - -This is mainly a bug-fix release. However the ability to link pcregrep with -libz or libbz2 and the ability to link pcretest with libreadline have been -added. Also the --line-offsets and --file-offsets options were added to -pcregrep. - - -Release 7.4 21-Sep-07 ---------------------- - -The only change of specification is the addition of options to control whether -\R matches any Unicode line ending (the default) or just CR, LF, and CRLF. -Otherwise, the changes are bug fixes and a refactoring to reduce the number of -relocations needed in a shared library. There have also been some documentation -updates, in particular, some more information about using CMake to build PCRE -has been added to the NON-UNIX-USE file. - - -Release 7.3 28-Aug-07 ---------------------- - -Most changes are bug fixes. Some that are not: - -1. There is some support for Perl 5.10's experimental "backtracking control - verbs" such as (*PRUNE). - -2. UTF-8 checking is now as per RFC 3629 instead of RFC 2279; this is more - restrictive in the strings it accepts. - -3. Checking for potential integer overflow has been made more dynamic, and as a - consequence there is no longer a hard limit on the size of a subpattern that - has a limited repeat count. - -4. When CRLF is a valid line-ending sequence, pcre_exec() and pcre_dfa_exec() - no longer advance by two characters instead of one when an unanchored match - fails at CRLF if there are explicit CR or LF matches within the pattern. - This gets rid of some anomalous effects that previously occurred. - -5. Some PCRE-specific settings for varying the newline options at the start of - a pattern have been added. - - -Release 7.2 19-Jun-07 ---------------------- - -WARNING: saved patterns that were compiled by earlier versions of PCRE must be -recompiled for use with 7.2 (necessitated by the addition of \K, \h, \H, \v, -and \V). - -Correction to the notes for 7.1: the note about shared libraries for Windows is -wrong. Previously, three libraries were built, but each could function -independently. For example, the pcreposix library also included all the -functions from the basic pcre library. The change is that the three libraries -are no longer independent. They are like the Unix libraries. To use the -pcreposix functions, for example, you need to link with both the pcreposix and -the basic pcre library. - -Some more features from Perl 5.10 have been added: - - (?-n) and (?+n) relative references for recursion and subroutines. - - (?(-n) and (?(+n) relative references as conditions. - - \k{name} and \g{name} are synonyms for \k. - - \K to reset the start of the matched string; for example, (foo)\Kbar - matches bar preceded by foo, but only sets bar as the matched string. - - (?| introduces a group where the capturing parentheses in each alternative - start from the same number; for example, (?|(abc)|(xyz)) sets capturing - parentheses number 1 in both cases. - - \h, \H, \v, \V match horizontal and vertical whitespace, respectively. - - -Release 7.1 24-Apr-07 ---------------------- - -There is only one new feature in this release: a linebreak setting of -PCRE_NEWLINE_ANYCRLF. It is a cut-down version of PCRE_NEWLINE_ANY, which -recognizes only CRLF, CR, and LF as linebreaks. - -A few bugs are fixed (see ChangeLog for details), but the major change is a -complete re-implementation of the build system. This now has full Autotools -support and so is now "standard" in some sense. It should help with compiling -PCRE in a wide variety of environments. - -NOTE: when building shared libraries for Windows, three dlls are now built, -called libpcre, libpcreposix, and libpcrecpp. Previously, everything was -included in a single dll. - -Another important change is that the dftables auxiliary program is no longer -compiled and run at "make" time by default. Instead, a default set of character -tables (assuming ASCII coding) is used. If you want to use dftables to generate -the character tables as previously, add --enable-rebuild-chartables to the -"configure" command. You must do this if you are compiling PCRE to run on a -system that uses EBCDIC code. - -There is a discussion about character tables in the README file. The default is -not to use dftables so that that there is no problem when cross-compiling. - - -Release 7.0 19-Dec-06 ---------------------- - -This release has a new major number because there have been some internal -upheavals to facilitate the addition of new optimizations and other facilities, -and to make subsequent maintenance and extension easier. Compilation is likely -to be a bit slower, but there should be no major effect on runtime performance. -Previously compiled patterns are NOT upwards compatible with this release. If -you have saved compiled patterns from a previous release, you will have to -re-compile them. Important changes that are visible to users are: - -1. The Unicode property tables have been updated to Unicode 5.0.0, which adds - some more scripts. - -2. The option PCRE_NEWLINE_ANY causes PCRE to recognize any Unicode newline - sequence as a newline. - -3. The \R escape matches a single Unicode newline sequence as a single unit. - -4. New features that will appear in Perl 5.10 are now in PCRE. These include - alternative Perl syntax for named parentheses, and Perl syntax for - recursion. - -5. The C++ wrapper interface has been extended by the addition of a - QuoteMeta function and the ability to allow copy construction and - assignment. - -For a complete list of changes, see the ChangeLog file. - - -Release 6.7 04-Jul-06 ---------------------- - -The main additions to this release are the ability to use the same name for -multiple sets of parentheses, and support for CRLF line endings in both the -library and pcregrep (and in pcretest for testing). - -Thanks to Ian Taylor, the stack usage for many kinds of pattern has been -significantly reduced for certain subject strings. - - -Release 6.5 01-Feb-06 ---------------------- - -Important changes in this release: - -1. A number of new features have been added to pcregrep. - -2. The Unicode property tables have been updated to Unicode 4.1.0, and the - supported properties have been extended with script names such as "Arabic", - and the derived properties "Any" and "L&". This has necessitated a change to - the interal format of compiled patterns. Any saved compiled patterns that - use \p or \P must be recompiled. - -3. The specification of recursion in patterns has been changed so that all - recursive subpatterns are automatically treated as atomic groups. Thus, for - example, (?R) is treated as if it were (?>(?R)). This is necessary because - otherwise there are situations where recursion does not work. - -See the ChangeLog for a complete list of changes, which include a number of bug -fixes and tidies. - - -Release 6.0 07-Jun-05 ---------------------- - -The release number has been increased to 6.0 because of the addition of several -major new pieces of functionality. - -A new function, pcre_dfa_exec(), which implements pattern matching using a DFA -algorithm, has been added. This has a number of advantages for certain cases, -though it does run more slowly, and lacks the ability to capture substrings. On -the other hand, it does find all matches, not just the first, and it works -better for partial matching. The pcrematching man page discusses the -differences. - -The pcretest program has been enhanced so that it can make use of the new -pcre_dfa_exec() matching function and the extra features it provides. - -The distribution now includes a C++ wrapper library. This is built -automatically if a C++ compiler is found. The pcrecpp man page discusses this -interface. - -The code itself has been re-organized into many more files, one for each -function, so it no longer requires everything to be linked in when static -linkage is used. As a consequence, some internal functions have had to have -their names exposed. These functions all have names starting with _pcre_. They -are undocumented, and are not intended for use by outside callers. - -The pcregrep program has been enhanced with new functionality such as -multiline-matching and options for output more matching context. See the -ChangeLog for a complete list of changes to the library and the utility -programs. - - -Release 5.0 13-Sep-04 ---------------------- - -The licence under which PCRE is released has been changed to the more -conventional "BSD" licence. - -In the code, some bugs have been fixed, and there are also some major changes -in this release (which is why I've increased the number to 5.0). Some changes -are internal rearrangements, and some provide a number of new facilities. The -new features are: - -1. There's an "automatic callout" feature that inserts callouts before every - item in the regex, and there's a new callout field that gives the position - in the pattern - useful for debugging and tracing. - -2. The extra_data structure can now be used to pass in a set of character - tables at exec time. This is useful if compiled regex are saved and re-used - at a later time when the tables may not be at the same address. If the - default internal tables are used, the pointer saved with the compiled - pattern is now set to NULL, which means that you don't need to do anything - special unless you are using custom tables. - -3. It is possible, with some restrictions on the content of the regex, to - request "partial" matching. A special return code is given if all of the - subject string matched part of the regex. This could be useful for testing - an input field as it is being typed. - -4. There is now some optional support for Unicode character properties, which - means that the patterns items such as \p{Lu} and \X can now be used. Only - the general category properties are supported. If PCRE is compiled with this - support, an additional 90K data structure is include, which increases the - size of the library dramatically. - -5. There is support for saving compiled patterns and re-using them later. - -6. There is support for running regular expressions that were compiled on a - different host with the opposite endianness. - -7. The pcretest program has been extended to accommodate the new features. - -The main internal rearrangement is that sequences of literal characters are no -longer handled as strings. Instead, each character is handled on its own. This -makes some UTF-8 handling easier, and makes the support of partial matching -possible. Compiled patterns containing long literal strings will be larger as a -result of this change; I hope that performance will not be much affected. - - -Release 4.5 01-Dec-03 ---------------------- - -Again mainly a bug-fix and tidying release, with only a couple of new features: - -1. It's possible now to compile PCRE so that it does not use recursive -function calls when matching. Instead it gets memory from the heap. This slows -things down, but may be necessary on systems with limited stacks. - -2. UTF-8 string checking has been tightened to reject overlong sequences and to -check that a starting offset points to the start of a character. Failure of the -latter returns a new error code: PCRE_ERROR_BADUTF8_OFFSET. - -3. PCRE can now be compiled for systems that use EBCDIC code. - - -Release 4.4 21-Aug-03 ---------------------- - -This is mainly a bug-fix and tidying release. The only new feature is that PCRE -checks UTF-8 strings for validity by default. There is an option to suppress -this, just in case anybody wants that teeny extra bit of performance. - - -Releases 4.1 - 4.3 ------------------- - -Sorry, I forgot about updating the NEWS file for these releases. Please take a -look at ChangeLog. - - -Release 4.0 17-Feb-03 ---------------------- - -There have been a lot of changes for the 4.0 release, adding additional -functionality and mending bugs. Below is a list of the highlights of the new -functionality. For full details of these features, please consult the -documentation. For a complete list of changes, see the ChangeLog file. - -1. Support for Perl's \Q...\E escapes. - -2. "Possessive quantifiers" ?+, *+, ++, and {,}+ which come from Sun's Java -package. They provide some syntactic sugar for simple cases of "atomic -grouping". - -3. Support for the \G assertion. It is true when the current matching position -is at the start point of the match. - -4. A new feature that provides some of the functionality that Perl provides -with (?{...}). The facility is termed a "callout". The way it is done in PCRE -is for the caller to provide an optional function, by setting pcre_callout to -its entry point. To get the function called, the regex must include (?C) at -appropriate points. - -5. Support for recursive calls to individual subpatterns. This makes it really -easy to get totally confused. - -6. Support for named subpatterns. The Python syntax (?P...) is used to -name a group. - -7. Several extensions to UTF-8 support; it is now fairly complete. There is an -option for pcregrep to make it operate in UTF-8 mode. - -8. The single man page has been split into a number of separate man pages. -These also give rise to individual HTML pages which are put in a separate -directory. There is an index.html page that lists them all. Some hyperlinking -between the pages has been installed. - - -Release 3.5 15-Aug-01 ---------------------- - -1. The configuring system has been upgraded to use later versions of autoconf -and libtool. By default it builds both a shared and a static library if the OS -supports it. You can use --disable-shared or --disable-static on the configure -command if you want only one of them. - -2. The pcretest utility is now installed along with pcregrep because it is -useful for users (to test regexs) and by doing this, it automatically gets -relinked by libtool. The documentation has been turned into a man page, so -there are now .1, .txt, and .html versions in /doc. - -3. Upgrades to pcregrep: - (i) Added long-form option names like gnu grep. - (ii) Added --help to list all options with an explanatory phrase. - (iii) Added -r, --recursive to recurse into sub-directories. - (iv) Added -f, --file to read patterns from a file. - -4. Added --enable-newline-is-cr and --enable-newline-is-lf to the configure -script, to force use of CR or LF instead of \n in the source. On non-Unix -systems, the value can be set in config.h. - -5. The limit of 200 on non-capturing parentheses is a _nesting_ limit, not an -absolute limit. Changed the text of the error message to make this clear, and -likewise updated the man page. - -6. The limit of 99 on the number of capturing subpatterns has been removed. -The new limit is 65535, which I hope will not be a "real" limit. - - -Release 3.3 01-Aug-00 ---------------------- - -There is some support for UTF-8 character strings. This is incomplete and -experimental. The documentation describes what is and what is not implemented. -Otherwise, this is just a bug-fixing release. - - -Release 3.0 01-Feb-00 ---------------------- - -1. A "configure" script is now used to configure PCRE for Unix systems. It -builds a Makefile, a config.h file, and the pcre-config script. - -2. PCRE is built as a shared library by default. - -3. There is support for POSIX classes such as [:alpha:]. - -5. There is an experimental recursion feature. - ----------------------------------------------------------------------------- - IMPORTANT FOR THOSE UPGRADING FROM VERSIONS BEFORE 2.00 - -Please note that there has been a change in the API such that a larger -ovector is required at matching time, to provide some additional workspace. -The new man page has details. This change was necessary in order to support -some of the new functionality in Perl 5.005. - - IMPORTANT FOR THOSE UPGRADING FROM VERSION 2.00 - -Another (I hope this is the last!) change has been made to the API for the -pcre_compile() function. An additional argument has been added to make it -possible to pass over a pointer to character tables built in the current -locale by pcre_maketables(). To use the default tables, this new argument -should be passed as NULL. - - IMPORTANT FOR THOSE UPGRADING FROM VERSION 2.05 - -Yet another (and again I hope this really is the last) change has been made -to the API for the pcre_exec() function. An additional argument has been -added to make it possible to start the match other than at the start of the -subject string. This is important if there are lookbehinds. The new man -page has the details, but you just want to convert existing programs, all -you need to do is to stick in a new fifth argument to pcre_exec(), with a -value of zero. For example, change - - pcre_exec(pattern, extra, subject, length, options, ovec, ovecsize) -to - pcre_exec(pattern, extra, subject, length, 0, options, ovec, ovecsize) - -**** diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/README b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/README deleted file mode 100644 index 4887ebf3..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/README +++ /dev/null @@ -1,1002 +0,0 @@ -README file for PCRE (Perl-compatible regular expression library) ------------------------------------------------------------------ - -NOTE: This set of files relates to PCRE releases that use the original API, -with library names libpcre, libpcre16, and libpcre32. January 2015 saw the -first release of a new API, known as PCRE2, with release numbers starting at -10.00 and library names libpcre2-8, libpcre2-16, and libpcre2-32. The old -libraries (now called PCRE1) are still being maintained for bug fixes, but -there will be no new development. New projects are advised to use the new PCRE2 -libraries. - - -The latest release of PCRE1 is always available in three alternative formats -from: - - ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-xxx.tar.gz - ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-xxx.tar.bz2 - ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-xxx.zip - -There is a mailing list for discussion about the development of PCRE at -pcre-dev@exim.org. You can access the archives and subscribe or manage your -subscription here: - - https://lists.exim.org/mailman/listinfo/pcre-dev - -Please read the NEWS file if you are upgrading from a previous release. -The contents of this README file are: - - The PCRE APIs - Documentation for PCRE - Contributions by users of PCRE - Building PCRE on non-Unix-like systems - Building PCRE without using autotools - Building PCRE using autotools - Retrieving configuration information - Shared libraries - Cross-compiling using autotools - Using HP's ANSI C++ compiler (aCC) - Compiling in Tru64 using native compilers - Using Sun's compilers for Solaris - Using PCRE from MySQL - Making new tarballs - Testing PCRE - Character tables - File manifest - - -The PCRE APIs -------------- - -PCRE is written in C, and it has its own API. There are three sets of -functions, one for the 8-bit library, which processes strings of bytes, one for -the 16-bit library, which processes strings of 16-bit values, and one for the -32-bit library, which processes strings of 32-bit values. The distribution also -includes a set of C++ wrapper functions (see the pcrecpp man page for details), -courtesy of Google Inc., which can be used to call the 8-bit PCRE library from -C++. Other C++ wrappers have been created from time to time. See, for example: -https://github.com/YasserAsmi/regexp, which aims to be simple and similar in -style to the C API. - -The distribution also contains a set of C wrapper functions (again, just for -the 8-bit library) that are based on the POSIX regular expression API (see the -pcreposix man page). These end up in the library called libpcreposix. Note that -this just provides a POSIX calling interface to PCRE; the regular expressions -themselves still follow Perl syntax and semantics. The POSIX API is restricted, -and does not give full access to all of PCRE's facilities. - -The header file for the POSIX-style functions is called pcreposix.h. The -official POSIX name is regex.h, but I did not want to risk possible problems -with existing files of that name by distributing it that way. To use PCRE with -an existing program that uses the POSIX API, pcreposix.h will have to be -renamed or pointed at by a link. - -If you are using the POSIX interface to PCRE and there is already a POSIX regex -library installed on your system, as well as worrying about the regex.h header -file (as mentioned above), you must also take care when linking programs to -ensure that they link with PCRE's libpcreposix library. Otherwise they may pick -up the POSIX functions of the same name from the other library. - -One way of avoiding this confusion is to compile PCRE with the addition of --Dregcomp=PCREregcomp (and similarly for the other POSIX functions) to the -compiler flags (CFLAGS if you are using "configure" -- see below). This has the -effect of renaming the functions so that the names no longer clash. Of course, -you have to do the same thing for your applications, or write them using the -new names. - - -Documentation for PCRE ----------------------- - -If you install PCRE in the normal way on a Unix-like system, you will end up -with a set of man pages whose names all start with "pcre". The one that is just -called "pcre" lists all the others. In addition to these man pages, the PCRE -documentation is supplied in two other forms: - - 1. There are files called doc/pcre.txt, doc/pcregrep.txt, and - doc/pcretest.txt in the source distribution. The first of these is a - concatenation of the text forms of all the section 3 man pages except - the listing of pcredemo.c and those that summarize individual functions. - The other two are the text forms of the section 1 man pages for the - pcregrep and pcretest commands. These text forms are provided for ease of - scanning with text editors or similar tools. They are installed in - /share/doc/pcre, where is the installation prefix - (defaulting to /usr/local). - - 2. A set of files containing all the documentation in HTML form, hyperlinked - in various ways, and rooted in a file called index.html, is distributed in - doc/html and installed in /share/doc/pcre/html. - -Users of PCRE have contributed files containing the documentation for various -releases in CHM format. These can be found in the Contrib directory of the FTP -site (see next section). - - -Contributions by users of PCRE ------------------------------- - -You can find contributions from PCRE users in the directory - - ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/Contrib - -There is a README file giving brief descriptions of what they are. Some are -complete in themselves; others are pointers to URLs containing relevant files. -Some of this material is likely to be well out-of-date. Several of the earlier -contributions provided support for compiling PCRE on various flavours of -Windows (I myself do not use Windows). Nowadays there is more Windows support -in the standard distribution, so these contibutions have been archived. - -A PCRE user maintains downloadable Windows binaries of the pcregrep and -pcretest programs here: - - http://www.rexegg.com/pcregrep-pcretest.html - - -Building PCRE on non-Unix-like systems --------------------------------------- - -For a non-Unix-like system, please read the comments in the file -NON-AUTOTOOLS-BUILD, though if your system supports the use of "configure" and -"make" you may be able to build PCRE using autotools in the same way as for -many Unix-like systems. - -PCRE can also be configured using the GUI facility provided by CMake's -cmake-gui command. This creates Makefiles, solution files, etc. The file -NON-AUTOTOOLS-BUILD has information about CMake. - -PCRE has been compiled on many different operating systems. It should be -straightforward to build PCRE on any system that has a Standard C compiler and -library, because it uses only Standard C functions. - - -Building PCRE without using autotools -------------------------------------- - -The use of autotools (in particular, libtool) is problematic in some -environments, even some that are Unix or Unix-like. See the NON-AUTOTOOLS-BUILD -file for ways of building PCRE without using autotools. - - -Building PCRE using autotools ------------------------------ - -If you are using HP's ANSI C++ compiler (aCC), please see the special note -in the section entitled "Using HP's ANSI C++ compiler (aCC)" below. - -The following instructions assume the use of the widely used "configure; make; -make install" (autotools) process. - -To build PCRE on system that supports autotools, first run the "configure" -command from the PCRE distribution directory, with your current directory set -to the directory where you want the files to be created. This command is a -standard GNU "autoconf" configuration script, for which generic instructions -are supplied in the file INSTALL. - -Most commonly, people build PCRE within its own distribution directory, and in -this case, on many systems, just running "./configure" is sufficient. However, -the usual methods of changing standard defaults are available. For example: - -CFLAGS='-O2 -Wall' ./configure --prefix=/opt/local - -This command specifies that the C compiler should be run with the flags '-O2 --Wall' instead of the default, and that "make install" should install PCRE -under /opt/local instead of the default /usr/local. - -If you want to build in a different directory, just run "configure" with that -directory as current. For example, suppose you have unpacked the PCRE source -into /source/pcre/pcre-xxx, but you want to build it in /build/pcre/pcre-xxx: - -cd /build/pcre/pcre-xxx -/source/pcre/pcre-xxx/configure - -PCRE is written in C and is normally compiled as a C library. However, it is -possible to build it as a C++ library, though the provided building apparatus -does not have any features to support this. - -There are some optional features that can be included or omitted from the PCRE -library. They are also documented in the pcrebuild man page. - -. By default, both shared and static libraries are built. You can change this - by adding one of these options to the "configure" command: - - --disable-shared - --disable-static - - (See also "Shared libraries on Unix-like systems" below.) - -. By default, only the 8-bit library is built. If you add --enable-pcre16 to - the "configure" command, the 16-bit library is also built. If you add - --enable-pcre32 to the "configure" command, the 32-bit library is also built. - If you want only the 16-bit or 32-bit library, use --disable-pcre8 to disable - building the 8-bit library. - -. If you are building the 8-bit library and want to suppress the building of - the C++ wrapper library, you can add --disable-cpp to the "configure" - command. Otherwise, when "configure" is run without --disable-pcre8, it will - try to find a C++ compiler and C++ header files, and if it succeeds, it will - try to build the C++ wrapper. - -. If you want to include support for just-in-time compiling, which can give - large performance improvements on certain platforms, add --enable-jit to the - "configure" command. This support is available only for certain hardware - architectures. If you try to enable it on an unsupported architecture, there - will be a compile time error. - -. When JIT support is enabled, pcregrep automatically makes use of it, unless - you add --disable-pcregrep-jit to the "configure" command. - -. If you want to make use of the support for UTF-8 Unicode character strings in - the 8-bit library, or UTF-16 Unicode character strings in the 16-bit library, - or UTF-32 Unicode character strings in the 32-bit library, you must add - --enable-utf to the "configure" command. Without it, the code for handling - UTF-8, UTF-16 and UTF-8 is not included in the relevant library. Even - when --enable-utf is included, the use of a UTF encoding still has to be - enabled by an option at run time. When PCRE is compiled with this option, its - input can only either be ASCII or UTF-8/16/32, even when running on EBCDIC - platforms. It is not possible to use both --enable-utf and --enable-ebcdic at - the same time. - -. There are no separate options for enabling UTF-8, UTF-16 and UTF-32 - independently because that would allow ridiculous settings such as requesting - UTF-16 support while building only the 8-bit library. However, the option - --enable-utf8 is retained for backwards compatibility with earlier releases - that did not support 16-bit or 32-bit character strings. It is synonymous with - --enable-utf. It is not possible to configure one library with UTF support - and the other without in the same configuration. - -. If, in addition to support for UTF-8/16/32 character strings, you want to - include support for the \P, \p, and \X sequences that recognize Unicode - character properties, you must add --enable-unicode-properties to the - "configure" command. This adds about 30K to the size of the library (in the - form of a property table); only the basic two-letter properties such as Lu - are supported. - -. You can build PCRE to recognize either CR or LF or the sequence CRLF or any - of the preceding, or any of the Unicode newline sequences as indicating the - end of a line. Whatever you specify at build time is the default; the caller - of PCRE can change the selection at run time. The default newline indicator - is a single LF character (the Unix standard). You can specify the default - newline indicator by adding --enable-newline-is-cr or --enable-newline-is-lf - or --enable-newline-is-crlf or --enable-newline-is-anycrlf or - --enable-newline-is-any to the "configure" command, respectively. - - If you specify --enable-newline-is-cr or --enable-newline-is-crlf, some of - the standard tests will fail, because the lines in the test files end with - LF. Even if the files are edited to change the line endings, there are likely - to be some failures. With --enable-newline-is-anycrlf or - --enable-newline-is-any, many tests should succeed, but there may be some - failures. - -. By default, the sequence \R in a pattern matches any Unicode line ending - sequence. This is independent of the option specifying what PCRE considers to - be the end of a line (see above). However, the caller of PCRE can restrict \R - to match only CR, LF, or CRLF. You can make this the default by adding - --enable-bsr-anycrlf to the "configure" command (bsr = "backslash R"). - -. When called via the POSIX interface, PCRE uses malloc() to get additional - storage for processing capturing parentheses if there are more than 10 of - them in a pattern. You can increase this threshold by setting, for example, - - --with-posix-malloc-threshold=20 - - on the "configure" command. - -. PCRE has a counter that limits the depth of nesting of parentheses in a - pattern. This limits the amount of system stack that a pattern uses when it - is compiled. The default is 250, but you can change it by setting, for - example, - - --with-parens-nest-limit=500 - -. PCRE has a counter that can be set to limit the amount of resources it uses - when matching a pattern. If the limit is exceeded during a match, the match - fails. The default is ten million. You can change the default by setting, for - example, - - --with-match-limit=500000 - - on the "configure" command. This is just the default; individual calls to - pcre_exec() can supply their own value. There is more discussion on the - pcreapi man page. - -. There is a separate counter that limits the depth of recursive function calls - during a matching process. This also has a default of ten million, which is - essentially "unlimited". You can change the default by setting, for example, - - --with-match-limit-recursion=500000 - - Recursive function calls use up the runtime stack; running out of stack can - cause programs to crash in strange ways. There is a discussion about stack - sizes in the pcrestack man page. - -. The default maximum compiled pattern size is around 64K. You can increase - this by adding --with-link-size=3 to the "configure" command. In the 8-bit - library, PCRE then uses three bytes instead of two for offsets to different - parts of the compiled pattern. In the 16-bit library, --with-link-size=3 is - the same as --with-link-size=4, which (in both libraries) uses four-byte - offsets. Increasing the internal link size reduces performance. In the 32-bit - library, the only supported link size is 4. - -. You can build PCRE so that its internal match() function that is called from - pcre_exec() does not call itself recursively. Instead, it uses memory blocks - obtained from the heap via the special functions pcre_stack_malloc() and - pcre_stack_free() to save data that would otherwise be saved on the stack. To - build PCRE like this, use - - --disable-stack-for-recursion - - on the "configure" command. PCRE runs more slowly in this mode, but it may be - necessary in environments with limited stack sizes. This applies only to the - normal execution of the pcre_exec() function; if JIT support is being - successfully used, it is not relevant. Equally, it does not apply to - pcre_dfa_exec(), which does not use deeply nested recursion. There is a - discussion about stack sizes in the pcrestack man page. - -. For speed, PCRE uses four tables for manipulating and identifying characters - whose code point values are less than 256. By default, it uses a set of - tables for ASCII encoding that is part of the distribution. If you specify - - --enable-rebuild-chartables - - a program called dftables is compiled and run in the default C locale when - you obey "make". It builds a source file called pcre_chartables.c. If you do - not specify this option, pcre_chartables.c is created as a copy of - pcre_chartables.c.dist. See "Character tables" below for further information. - -. It is possible to compile PCRE for use on systems that use EBCDIC as their - character code (as opposed to ASCII/Unicode) by specifying - - --enable-ebcdic - - This automatically implies --enable-rebuild-chartables (see above). However, - when PCRE is built this way, it always operates in EBCDIC. It cannot support - both EBCDIC and UTF-8/16/32. There is a second option, --enable-ebcdic-nl25, - which specifies that the code value for the EBCDIC NL character is 0x25 - instead of the default 0x15. - -. In environments where valgrind is installed, if you specify - - --enable-valgrind - - PCRE will use valgrind annotations to mark certain memory regions as - unaddressable. This allows it to detect invalid memory accesses, and is - mostly useful for debugging PCRE itself. - -. In environments where the gcc compiler is used and lcov version 1.6 or above - is installed, if you specify - - --enable-coverage - - the build process implements a code coverage report for the test suite. The - report is generated by running "make coverage". If ccache is installed on - your system, it must be disabled when building PCRE for coverage reporting. - You can do this by setting the environment variable CCACHE_DISABLE=1 before - running "make" to build PCRE. There is more information about coverage - reporting in the "pcrebuild" documentation. - -. The pcregrep program currently supports only 8-bit data files, and so - requires the 8-bit PCRE library. It is possible to compile pcregrep to use - libz and/or libbz2, in order to read .gz and .bz2 files (respectively), by - specifying one or both of - - --enable-pcregrep-libz - --enable-pcregrep-libbz2 - - Of course, the relevant libraries must be installed on your system. - -. The default size (in bytes) of the internal buffer used by pcregrep can be - set by, for example: - - --with-pcregrep-bufsize=51200 - - The value must be a plain integer. The default is 20480. - -. It is possible to compile pcretest so that it links with the libreadline - or libedit libraries, by specifying, respectively, - - --enable-pcretest-libreadline or --enable-pcretest-libedit - - If this is done, when pcretest's input is from a terminal, it reads it using - the readline() function. This provides line-editing and history facilities. - Note that libreadline is GPL-licenced, so if you distribute a binary of - pcretest linked in this way, there may be licensing issues. These can be - avoided by linking with libedit (which has a BSD licence) instead. - - Enabling libreadline causes the -lreadline option to be added to the pcretest - build. In many operating environments with a sytem-installed readline - library this is sufficient. However, in some environments (e.g. if an - unmodified distribution version of readline is in use), it may be necessary - to specify something like LIBS="-lncurses" as well. This is because, to quote - the readline INSTALL, "Readline uses the termcap functions, but does not link - with the termcap or curses library itself, allowing applications which link - with readline the to choose an appropriate library." If you get error - messages about missing functions tgetstr, tgetent, tputs, tgetflag, or tgoto, - this is the problem, and linking with the ncurses library should fix it. - -The "configure" script builds the following files for the basic C library: - -. Makefile the makefile that builds the library -. config.h build-time configuration options for the library -. pcre.h the public PCRE header file -. pcre-config script that shows the building settings such as CFLAGS - that were set for "configure" -. libpcre.pc ) data for the pkg-config command -. libpcre16.pc ) -. libpcre32.pc ) -. libpcreposix.pc ) -. libtool script that builds shared and/or static libraries - -Versions of config.h and pcre.h are distributed in the PCRE tarballs under the -names config.h.generic and pcre.h.generic. These are provided for those who -have to built PCRE without using "configure" or CMake. If you use "configure" -or CMake, the .generic versions are not used. - -When building the 8-bit library, if a C++ compiler is found, the following -files are also built: - -. libpcrecpp.pc data for the pkg-config command -. pcrecpparg.h header file for calling PCRE via the C++ wrapper -. pcre_stringpiece.h header for the C++ "stringpiece" functions - -The "configure" script also creates config.status, which is an executable -script that can be run to recreate the configuration, and config.log, which -contains compiler output from tests that "configure" runs. - -Once "configure" has run, you can run "make". This builds the the libraries -libpcre, libpcre16 and/or libpcre32, and a test program called pcretest. If you -enabled JIT support with --enable-jit, a test program called pcre_jit_test is -built as well. - -If the 8-bit library is built, libpcreposix and the pcregrep command are also -built, and if a C++ compiler was found on your system, and you did not disable -it with --disable-cpp, "make" builds the C++ wrapper library, which is called -libpcrecpp, as well as some test programs called pcrecpp_unittest, -pcre_scanner_unittest, and pcre_stringpiece_unittest. - -The command "make check" runs all the appropriate tests. Details of the PCRE -tests are given below in a separate section of this document. - -You can use "make install" to install PCRE into live directories on your -system. The following are installed (file names are all relative to the - that is set when "configure" is run): - - Commands (bin): - pcretest - pcregrep (if 8-bit support is enabled) - pcre-config - - Libraries (lib): - libpcre16 (if 16-bit support is enabled) - libpcre32 (if 32-bit support is enabled) - libpcre (if 8-bit support is enabled) - libpcreposix (if 8-bit support is enabled) - libpcrecpp (if 8-bit and C++ support is enabled) - - Configuration information (lib/pkgconfig): - libpcre16.pc - libpcre32.pc - libpcre.pc - libpcreposix.pc - libpcrecpp.pc (if C++ support is enabled) - - Header files (include): - pcre.h - pcreposix.h - pcre_scanner.h ) - pcre_stringpiece.h ) if C++ support is enabled - pcrecpp.h ) - pcrecpparg.h ) - - Man pages (share/man/man{1,3}): - pcregrep.1 - pcretest.1 - pcre-config.1 - pcre.3 - pcre*.3 (lots more pages, all starting "pcre") - - HTML documentation (share/doc/pcre/html): - index.html - *.html (lots more pages, hyperlinked from index.html) - - Text file documentation (share/doc/pcre): - AUTHORS - COPYING - ChangeLog - LICENCE - NEWS - README - pcre.txt (a concatenation of the man(3) pages) - pcretest.txt the pcretest man page - pcregrep.txt the pcregrep man page - pcre-config.txt the pcre-config man page - -If you want to remove PCRE from your system, you can run "make uninstall". -This removes all the files that "make install" installed. However, it does not -remove any directories, because these are often shared with other programs. - - -Retrieving configuration information ------------------------------------- - -Running "make install" installs the command pcre-config, which can be used to -recall information about the PCRE configuration and installation. For example: - - pcre-config --version - -prints the version number, and - - pcre-config --libs - -outputs information about where the library is installed. This command can be -included in makefiles for programs that use PCRE, saving the programmer from -having to remember too many details. - -The pkg-config command is another system for saving and retrieving information -about installed libraries. Instead of separate commands for each library, a -single command is used. For example: - - pkg-config --cflags pcre - -The data is held in *.pc files that are installed in a directory called -/lib/pkgconfig. - - -Shared libraries ----------------- - -The default distribution builds PCRE as shared libraries and static libraries, -as long as the operating system supports shared libraries. Shared library -support relies on the "libtool" script which is built as part of the -"configure" process. - -The libtool script is used to compile and link both shared and static -libraries. They are placed in a subdirectory called .libs when they are newly -built. The programs pcretest and pcregrep are built to use these uninstalled -libraries (by means of wrapper scripts in the case of shared libraries). When -you use "make install" to install shared libraries, pcregrep and pcretest are -automatically re-built to use the newly installed shared libraries before being -installed themselves. However, the versions left in the build directory still -use the uninstalled libraries. - -To build PCRE using static libraries only you must use --disable-shared when -configuring it. For example: - -./configure --prefix=/usr/gnu --disable-shared - -Then run "make" in the usual way. Similarly, you can use --disable-static to -build only shared libraries. - - -Cross-compiling using autotools -------------------------------- - -You can specify CC and CFLAGS in the normal way to the "configure" command, in -order to cross-compile PCRE for some other host. However, you should NOT -specify --enable-rebuild-chartables, because if you do, the dftables.c source -file is compiled and run on the local host, in order to generate the inbuilt -character tables (the pcre_chartables.c file). This will probably not work, -because dftables.c needs to be compiled with the local compiler, not the cross -compiler. - -When --enable-rebuild-chartables is not specified, pcre_chartables.c is created -by making a copy of pcre_chartables.c.dist, which is a default set of tables -that assumes ASCII code. Cross-compiling with the default tables should not be -a problem. - -If you need to modify the character tables when cross-compiling, you should -move pcre_chartables.c.dist out of the way, then compile dftables.c by hand and -run it on the local host to make a new version of pcre_chartables.c.dist. -Then when you cross-compile PCRE this new version of the tables will be used. - - -Using HP's ANSI C++ compiler (aCC) ----------------------------------- - -Unless C++ support is disabled by specifying the "--disable-cpp" option of the -"configure" script, you must include the "-AA" option in the CXXFLAGS -environment variable in order for the C++ components to compile correctly. - -Also, note that the aCC compiler on PA-RISC platforms may have a defect whereby -needed libraries fail to get included when specifying the "-AA" compiler -option. If you experience unresolved symbols when linking the C++ programs, -use the workaround of specifying the following environment variable prior to -running the "configure" script: - - CXXLDFLAGS="-lstd_v2 -lCsup_v2" - - -Compiling in Tru64 using native compilers ------------------------------------------ - -The following error may occur when compiling with native compilers in the Tru64 -operating system: - - CXX libpcrecpp_la-pcrecpp.lo -cxx: Error: /usr/lib/cmplrs/cxx/V7.1-006/include/cxx/iosfwd, line 58: #error - directive: "cannot include iosfwd -- define __USE_STD_IOSTREAM to - override default - see section 7.1.2 of the C++ Using Guide" -#error "cannot include iosfwd -- define __USE_STD_IOSTREAM to override default -- see section 7.1.2 of the C++ Using Guide" - -This may be followed by other errors, complaining that 'namespace "std" has no -member'. The solution to this is to add the line - -#define __USE_STD_IOSTREAM 1 - -to the config.h file. - - -Using Sun's compilers for Solaris ---------------------------------- - -A user reports that the following configurations work on Solaris 9 sparcv9 and -Solaris 9 x86 (32-bit): - - Solaris 9 sparcv9: ./configure --disable-cpp CC=/bin/cc CFLAGS="-m64 -g" - Solaris 9 x86: ./configure --disable-cpp CC=/bin/cc CFLAGS="-g" - - -Using PCRE from MySQL ---------------------- - -On systems where both PCRE and MySQL are installed, it is possible to make use -of PCRE from within MySQL, as an alternative to the built-in pattern matching. -There is a web page that tells you how to do this: - - http://www.mysqludf.org/lib_mysqludf_preg/index.php - - -Making new tarballs -------------------- - -The command "make dist" creates three PCRE tarballs, in tar.gz, tar.bz2, and -zip formats. The command "make distcheck" does the same, but then does a trial -build of the new distribution to ensure that it works. - -If you have modified any of the man page sources in the doc directory, you -should first run the PrepareRelease script before making a distribution. This -script creates the .txt and HTML forms of the documentation from the man pages. - - -Testing PCRE ------------- - -To test the basic PCRE library on a Unix-like system, run the RunTest script. -There is another script called RunGrepTest that tests the options of the -pcregrep command. If the C++ wrapper library is built, three test programs -called pcrecpp_unittest, pcre_scanner_unittest, and pcre_stringpiece_unittest -are also built. When JIT support is enabled, another test program called -pcre_jit_test is built. - -Both the scripts and all the program tests are run if you obey "make check" or -"make test". For other environments, see the instructions in -NON-AUTOTOOLS-BUILD. - -The RunTest script runs the pcretest test program (which is documented in its -own man page) on each of the relevant testinput files in the testdata -directory, and compares the output with the contents of the corresponding -testoutput files. RunTest uses a file called testtry to hold the main output -from pcretest. Other files whose names begin with "test" are used as working -files in some tests. - -Some tests are relevant only when certain build-time options were selected. For -example, the tests for UTF-8/16/32 support are run only if --enable-utf was -used. RunTest outputs a comment when it skips a test. - -Many of the tests that are not skipped are run up to three times. The second -run forces pcre_study() to be called for all patterns except for a few in some -tests that are marked "never study" (see the pcretest program for how this is -done). If JIT support is available, the non-DFA tests are run a third time, -this time with a forced pcre_study() with the PCRE_STUDY_JIT_COMPILE option. -This testing can be suppressed by putting "nojit" on the RunTest command line. - -The entire set of tests is run once for each of the 8-bit, 16-bit and 32-bit -libraries that are enabled. If you want to run just one set of tests, call -RunTest with either the -8, -16 or -32 option. - -If valgrind is installed, you can run the tests under it by putting "valgrind" -on the RunTest command line. To run pcretest on just one or more specific test -files, give their numbers as arguments to RunTest, for example: - - RunTest 2 7 11 - -You can also specify ranges of tests such as 3-6 or 3- (meaning 3 to the -end), or a number preceded by ~ to exclude a test. For example: - - Runtest 3-15 ~10 - -This runs tests 3 to 15, excluding test 10, and just ~13 runs all the tests -except test 13. Whatever order the arguments are in, the tests are always run -in numerical order. - -You can also call RunTest with the single argument "list" to cause it to output -a list of tests. - -The first test file can be fed directly into the perltest.pl script to check -that Perl gives the same results. The only difference you should see is in the -first few lines, where the Perl version is given instead of the PCRE version. - -The second set of tests check pcre_fullinfo(), pcre_study(), -pcre_copy_substring(), pcre_get_substring(), pcre_get_substring_list(), error -detection, and run-time flags that are specific to PCRE, as well as the POSIX -wrapper API. It also uses the debugging flags to check some of the internals of -pcre_compile(). - -If you build PCRE with a locale setting that is not the standard C locale, the -character tables may be different (see next paragraph). In some cases, this may -cause failures in the second set of tests. For example, in a locale where the -isprint() function yields TRUE for characters in the range 128-255, the use of -[:isascii:] inside a character class defines a different set of characters, and -this shows up in this test as a difference in the compiled code, which is being -listed for checking. Where the comparison test output contains [\x00-\x7f] the -test will contain [\x00-\xff], and similarly in some other cases. This is not a -bug in PCRE. - -The third set of tests checks pcre_maketables(), the facility for building a -set of character tables for a specific locale and using them instead of the -default tables. The tests make use of the "fr_FR" (French) locale. Before -running the test, the script checks for the presence of this locale by running -the "locale" command. If that command fails, or if it doesn't include "fr_FR" -in the list of available locales, the third test cannot be run, and a comment -is output to say why. If running this test produces instances of the error - - ** Failed to set locale "fr_FR" - -in the comparison output, it means that locale is not available on your system, -despite being listed by "locale". This does not mean that PCRE is broken. - -[If you are trying to run this test on Windows, you may be able to get it to -work by changing "fr_FR" to "french" everywhere it occurs. Alternatively, use -RunTest.bat. The version of RunTest.bat included with PCRE 7.4 and above uses -Windows versions of test 2. More info on using RunTest.bat is included in the -document entitled NON-UNIX-USE.] - -The fourth and fifth tests check the UTF-8/16/32 support and error handling and -internal UTF features of PCRE that are not relevant to Perl, respectively. The -sixth and seventh tests do the same for Unicode character properties support. - -The eighth, ninth, and tenth tests check the pcre_dfa_exec() alternative -matching function, in non-UTF-8/16/32 mode, UTF-8/16/32 mode, and UTF-8/16/32 -mode with Unicode property support, respectively. - -The eleventh test checks some internal offsets and code size features; it is -run only when the default "link size" of 2 is set (in other cases the sizes -change) and when Unicode property support is enabled. - -The twelfth test is run only when JIT support is available, and the thirteenth -test is run only when JIT support is not available. They test some JIT-specific -features such as information output from pcretest about JIT compilation. - -The fourteenth, fifteenth, and sixteenth tests are run only in 8-bit mode, and -the seventeenth, eighteenth, and nineteenth tests are run only in 16/32-bit -mode. These are tests that generate different output in the two modes. They are -for general cases, UTF-8/16/32 support, and Unicode property support, -respectively. - -The twentieth test is run only in 16/32-bit mode. It tests some specific -16/32-bit features of the DFA matching engine. - -The twenty-first and twenty-second tests are run only in 16/32-bit mode, when -the link size is set to 2 for the 16-bit library. They test reloading -pre-compiled patterns. - -The twenty-third and twenty-fourth tests are run only in 16-bit mode. They are -for general cases, and UTF-16 support, respectively. - -The twenty-fifth and twenty-sixth tests are run only in 32-bit mode. They are -for general cases, and UTF-32 support, respectively. - - -Character tables ----------------- - -For speed, PCRE uses four tables for manipulating and identifying characters -whose code point values are less than 256. The final argument of the -pcre_compile() function is a pointer to a block of memory containing the -concatenated tables. A call to pcre_maketables() can be used to generate a set -of tables in the current locale. If the final argument for pcre_compile() is -passed as NULL, a set of default tables that is built into the binary is used. - -The source file called pcre_chartables.c contains the default set of tables. By -default, this is created as a copy of pcre_chartables.c.dist, which contains -tables for ASCII coding. However, if --enable-rebuild-chartables is specified -for ./configure, a different version of pcre_chartables.c is built by the -program dftables (compiled from dftables.c), which uses the ANSI C character -handling functions such as isalnum(), isalpha(), isupper(), islower(), etc. to -build the table sources. This means that the default C locale which is set for -your system will control the contents of these default tables. You can change -the default tables by editing pcre_chartables.c and then re-building PCRE. If -you do this, you should take care to ensure that the file does not get -automatically re-generated. The best way to do this is to move -pcre_chartables.c.dist out of the way and replace it with your customized -tables. - -When the dftables program is run as a result of --enable-rebuild-chartables, -it uses the default C locale that is set on your system. It does not pay -attention to the LC_xxx environment variables. In other words, it uses the -system's default locale rather than whatever the compiling user happens to have -set. If you really do want to build a source set of character tables in a -locale that is specified by the LC_xxx variables, you can run the dftables -program by hand with the -L option. For example: - - ./dftables -L pcre_chartables.c.special - -The first two 256-byte tables provide lower casing and case flipping functions, -respectively. The next table consists of three 32-byte bit maps which identify -digits, "word" characters, and white space, respectively. These are used when -building 32-byte bit maps that represent character classes for code points less -than 256. - -The final 256-byte table has bits indicating various character types, as -follows: - - 1 white space character - 2 letter - 4 decimal digit - 8 hexadecimal digit - 16 alphanumeric or '_' - 128 regular expression metacharacter or binary zero - -You should not alter the set of characters that contain the 128 bit, as that -will cause PCRE to malfunction. - - -File manifest -------------- - -The distribution should contain the files listed below. Where a file name is -given as pcre[16|32]_xxx it means that there are three files, one with the name -pcre_xxx, one with the name pcre16_xx, and a third with the name pcre32_xxx. - -(A) Source files of the PCRE library functions and their headers: - - dftables.c auxiliary program for building pcre_chartables.c - when --enable-rebuild-chartables is specified - - pcre_chartables.c.dist a default set of character tables that assume ASCII - coding; used, unless --enable-rebuild-chartables is - specified, by copying to pcre[16]_chartables.c - - pcreposix.c ) - pcre[16|32]_byte_order.c ) - pcre[16|32]_compile.c ) - pcre[16|32]_config.c ) - pcre[16|32]_dfa_exec.c ) - pcre[16|32]_exec.c ) - pcre[16|32]_fullinfo.c ) - pcre[16|32]_get.c ) sources for the functions in the library, - pcre[16|32]_globals.c ) and some internal functions that they use - pcre[16|32]_jit_compile.c ) - pcre[16|32]_maketables.c ) - pcre[16|32]_newline.c ) - pcre[16|32]_refcount.c ) - pcre[16|32]_string_utils.c ) - pcre[16|32]_study.c ) - pcre[16|32]_tables.c ) - pcre[16|32]_ucd.c ) - pcre[16|32]_version.c ) - pcre[16|32]_xclass.c ) - pcre_ord2utf8.c ) - pcre_valid_utf8.c ) - pcre16_ord2utf16.c ) - pcre16_utf16_utils.c ) - pcre16_valid_utf16.c ) - pcre32_utf32_utils.c ) - pcre32_valid_utf32.c ) - - pcre[16|32]_printint.c ) debugging function that is used by pcretest, - ) and can also be #included in pcre_compile() - - pcre.h.in template for pcre.h when built by "configure" - pcreposix.h header for the external POSIX wrapper API - pcre_internal.h header for internal use - sljit/* 16 files that make up the JIT compiler - ucp.h header for Unicode property handling - - config.h.in template for config.h, which is built by "configure" - - pcrecpp.h public header file for the C++ wrapper - pcrecpparg.h.in template for another C++ header file - pcre_scanner.h public header file for C++ scanner functions - pcrecpp.cc ) - pcre_scanner.cc ) source for the C++ wrapper library - - pcre_stringpiece.h.in template for pcre_stringpiece.h, the header for the - C++ stringpiece functions - pcre_stringpiece.cc source for the C++ stringpiece functions - -(B) Source files for programs that use PCRE: - - pcredemo.c simple demonstration of coding calls to PCRE - pcregrep.c source of a grep utility that uses PCRE - pcretest.c comprehensive test program - -(C) Auxiliary files: - - 132html script to turn "man" pages into HTML - AUTHORS information about the author of PCRE - ChangeLog log of changes to the code - CleanTxt script to clean nroff output for txt man pages - Detrail script to remove trailing spaces - HACKING some notes about the internals of PCRE - INSTALL generic installation instructions - LICENCE conditions for the use of PCRE - COPYING the same, using GNU's standard name - Makefile.in ) template for Unix Makefile, which is built by - ) "configure" - Makefile.am ) the automake input that was used to create - ) Makefile.in - NEWS important changes in this release - NON-UNIX-USE the previous name for NON-AUTOTOOLS-BUILD - NON-AUTOTOOLS-BUILD notes on building PCRE without using autotools - PrepareRelease script to make preparations for "make dist" - README this file - RunTest a Unix shell script for running tests - RunGrepTest a Unix shell script for pcregrep tests - aclocal.m4 m4 macros (generated by "aclocal") - config.guess ) files used by libtool, - config.sub ) used only when building a shared library - configure a configuring shell script (built by autoconf) - configure.ac ) the autoconf input that was used to build - ) "configure" and config.h - depcomp ) script to find program dependencies, generated by - ) automake - doc/*.3 man page sources for PCRE - doc/*.1 man page sources for pcregrep and pcretest - doc/index.html.src the base HTML page - doc/html/* HTML documentation - doc/pcre.txt plain text version of the man pages - doc/pcretest.txt plain text documentation of test program - doc/perltest.txt plain text documentation of Perl test program - install-sh a shell script for installing files - libpcre16.pc.in template for libpcre16.pc for pkg-config - libpcre32.pc.in template for libpcre32.pc for pkg-config - libpcre.pc.in template for libpcre.pc for pkg-config - libpcreposix.pc.in template for libpcreposix.pc for pkg-config - libpcrecpp.pc.in template for libpcrecpp.pc for pkg-config - ltmain.sh file used to build a libtool script - missing ) common stub for a few missing GNU programs while - ) installing, generated by automake - mkinstalldirs script for making install directories - perltest.pl Perl test program - pcre-config.in source of script which retains PCRE information - pcre_jit_test.c test program for the JIT compiler - pcrecpp_unittest.cc ) - pcre_scanner_unittest.cc ) test programs for the C++ wrapper - pcre_stringpiece_unittest.cc ) - testdata/testinput* test data for main library tests - testdata/testoutput* expected test results - testdata/grep* input and output for pcregrep tests - testdata/* other supporting test files - -(D) Auxiliary files for cmake support - - cmake/COPYING-CMAKE-SCRIPTS - cmake/FindPackageHandleStandardArgs.cmake - cmake/FindEditline.cmake - cmake/FindReadline.cmake - CMakeLists.txt - config-cmake.h.in - -(E) Auxiliary files for VPASCAL - - makevp.bat - makevp_c.txt - makevp_l.txt - pcregexp.pas - -(F) Auxiliary files for building PCRE "by hand" - - pcre.h.generic ) a version of the public PCRE header file - ) for use in non-"configure" environments - config.h.generic ) a version of config.h for use in non-"configure" - ) environments - -(F) Miscellaneous - - RunTest.bat a script for running tests under Windows - -Philip Hazel -Email local part: ph10 -Email domain: cam.ac.uk -Last updated: 10 February 2015 diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/NON-AUTOTOOLS-BUILD.txt b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/NON-AUTOTOOLS-BUILD.txt deleted file mode 100644 index 39100591..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/NON-AUTOTOOLS-BUILD.txt +++ /dev/null @@ -1,772 +0,0 @@ -Building PCRE without using autotools -------------------------------------- - -NOTE: This document relates to PCRE releases that use the original API, with -library names libpcre, libpcre16, and libpcre32. January 2015 saw the first -release of a new API, known as PCRE2, with release numbers starting at 10.00 -and library names libpcre2-8, libpcre2-16, and libpcre2-32. The old libraries -(now called PCRE1) are still being maintained for bug fixes, but there will be -no new development. New projects are advised to use the new PCRE2 libraries. - - -This document contains the following sections: - - General - Generic instructions for the PCRE C library - The C++ wrapper functions - Building for virtual Pascal - Stack size in Windows environments - Linking programs in Windows environments - Calling conventions in Windows environments - Comments about Win32 builds - Building PCRE on Windows with CMake - Use of relative paths with CMake on Windows - Testing with RunTest.bat - Building under Windows CE with Visual Studio 200x - Building under Windows with BCC5.5 - Building using Borland C++ Builder 2007 (CB2007) and higher - Building PCRE on OpenVMS - Building PCRE on Stratus OpenVOS - Building PCRE on native z/OS and z/VM - - -GENERAL - -I (Philip Hazel) have no experience of Windows or VMS sytems and how their -libraries work. The items in the PCRE distribution and Makefile that relate to -anything other than Linux systems are untested by me. - -There are some other comments and files (including some documentation in CHM -format) in the Contrib directory on the FTP site: - - ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/Contrib - -The basic PCRE library consists entirely of code written in Standard C, and so -should compile successfully on any system that has a Standard C compiler and -library. The C++ wrapper functions are a separate issue (see below). - -The PCRE distribution includes a "configure" file for use by the configure/make -(autotools) build system, as found in many Unix-like environments. The README -file contains information about the options for "configure". - -There is also support for CMake, which some users prefer, especially in Windows -environments, though it can also be run in Unix-like environments. See the -section entitled "Building PCRE on Windows with CMake" below. - -Versions of config.h and pcre.h are distributed in the PCRE tarballs under the -names config.h.generic and pcre.h.generic. These are provided for those who -build PCRE without using "configure" or CMake. If you use "configure" or CMake, -the .generic versions are not used. - - -GENERIC INSTRUCTIONS FOR THE PCRE C LIBRARY - -The following are generic instructions for building the PCRE C library "by -hand". If you are going to use CMake, this section does not apply to you; you -can skip ahead to the CMake section. - - (1) Copy or rename the file config.h.generic as config.h, and edit the macro - settings that it contains to whatever is appropriate for your environment. - - In particular, you can alter the definition of the NEWLINE macro to - specify what character(s) you want to be interpreted as line terminators. - In an EBCDIC environment, you MUST change NEWLINE, because its default - value is 10, an ASCII LF. The usual EBCDIC newline character is 21 (0x15, - NL), though in some cases it may be 37 (0x25). - - When you compile any of the PCRE modules, you must specify -DHAVE_CONFIG_H - to your compiler so that config.h is included in the sources. - - An alternative approach is not to edit config.h, but to use -D on the - compiler command line to make any changes that you need to the - configuration options. In this case -DHAVE_CONFIG_H must not be set. - - NOTE: There have been occasions when the way in which certain parameters - in config.h are used has changed between releases. (In the configure/make - world, this is handled automatically.) When upgrading to a new release, - you are strongly advised to review config.h.generic before re-using what - you had previously. - - (2) Copy or rename the file pcre.h.generic as pcre.h. - - (3) EITHER: - Copy or rename file pcre_chartables.c.dist as pcre_chartables.c. - - OR: - Compile dftables.c as a stand-alone program (using -DHAVE_CONFIG_H if - you have set up config.h), and then run it with the single argument - "pcre_chartables.c". This generates a set of standard character tables - and writes them to that file. The tables are generated using the default - C locale for your system. If you want to use a locale that is specified - by LC_xxx environment variables, add the -L option to the dftables - command. You must use this method if you are building on a system that - uses EBCDIC code. - - The tables in pcre_chartables.c are defaults. The caller of PCRE can - specify alternative tables at run time. - - (4) Ensure that you have the following header files: - - pcre_internal.h - ucp.h - - (5) For an 8-bit library, compile the following source files, setting - -DHAVE_CONFIG_H as a compiler option if you have set up config.h with your - configuration, or else use other -D settings to change the configuration - as required. - - pcre_byte_order.c - pcre_chartables.c - pcre_compile.c - pcre_config.c - pcre_dfa_exec.c - pcre_exec.c - pcre_fullinfo.c - pcre_get.c - pcre_globals.c - pcre_jit_compile.c - pcre_maketables.c - pcre_newline.c - pcre_ord2utf8.c - pcre_refcount.c - pcre_string_utils.c - pcre_study.c - pcre_tables.c - pcre_ucd.c - pcre_valid_utf8.c - pcre_version.c - pcre_xclass.c - - Make sure that you include -I. in the compiler command (or equivalent for - an unusual compiler) so that all included PCRE header files are first - sought in the current directory. Otherwise you run the risk of picking up - a previously-installed file from somewhere else. - - Note that you must still compile pcre_jit_compile.c, even if you have not - defined SUPPORT_JIT in config.h, because when JIT support is not - configured, dummy functions are compiled. When JIT support IS configured, - pcre_jit_compile.c #includes sources from the sljit subdirectory, where - there should be 16 files, all of whose names begin with "sljit". - - (6) Now link all the compiled code into an object library in whichever form - your system keeps such libraries. This is the basic PCRE C 8-bit library. - If your system has static and shared libraries, you may have to do this - once for each type. - - (7) If you want to build a 16-bit library (as well as, or instead of the 8-bit - or 32-bit libraries) repeat steps 5-6 with the following files: - - pcre16_byte_order.c - pcre16_chartables.c - pcre16_compile.c - pcre16_config.c - pcre16_dfa_exec.c - pcre16_exec.c - pcre16_fullinfo.c - pcre16_get.c - pcre16_globals.c - pcre16_jit_compile.c - pcre16_maketables.c - pcre16_newline.c - pcre16_ord2utf16.c - pcre16_refcount.c - pcre16_string_utils.c - pcre16_study.c - pcre16_tables.c - pcre16_ucd.c - pcre16_utf16_utils.c - pcre16_valid_utf16.c - pcre16_version.c - pcre16_xclass.c - - (8) If you want to build a 32-bit library (as well as, or instead of the 8-bit - or 16-bit libraries) repeat steps 5-6 with the following files: - - pcre32_byte_order.c - pcre32_chartables.c - pcre32_compile.c - pcre32_config.c - pcre32_dfa_exec.c - pcre32_exec.c - pcre32_fullinfo.c - pcre32_get.c - pcre32_globals.c - pcre32_jit_compile.c - pcre32_maketables.c - pcre32_newline.c - pcre32_ord2utf32.c - pcre32_refcount.c - pcre32_string_utils.c - pcre32_study.c - pcre32_tables.c - pcre32_ucd.c - pcre32_utf32_utils.c - pcre32_valid_utf32.c - pcre32_version.c - pcre32_xclass.c - - (9) If you want to build the POSIX wrapper functions (which apply only to the - 8-bit library), ensure that you have the pcreposix.h file and then compile - pcreposix.c (remembering -DHAVE_CONFIG_H if necessary). Link the result - (on its own) as the pcreposix library. - -(10) The pcretest program can be linked with any combination of the 8-bit, - 16-bit and 32-bit libraries (depending on what you selected in config.h). - Compile pcretest.c and pcre_printint.c (again, don't forget - -DHAVE_CONFIG_H) and link them together with the appropriate library/ies. - If you compiled an 8-bit library, pcretest also needs the pcreposix - wrapper library unless you compiled it with -DNOPOSIX. - -(11) Run pcretest on the testinput files in the testdata directory, and check - that the output matches the corresponding testoutput files. There are - comments about what each test does in the section entitled "Testing PCRE" - in the README file. If you compiled more than one of the 8-bit, 16-bit and - 32-bit libraries, you need to run pcretest with the -16 option to do - 16-bit tests and with the -32 option to do 32-bit tests. - - Some tests are relevant only when certain build-time options are selected. - For example, test 4 is for UTF-8/UTF-16/UTF-32 support, and will not run - if you have built PCRE without it. See the comments at the start of each - testinput file. If you have a suitable Unix-like shell, the RunTest script - will run the appropriate tests for you. The command "RunTest list" will - output a list of all the tests. - - Note that the supplied files are in Unix format, with just LF characters - as line terminators. You may need to edit them to change this if your - system uses a different convention. If you are using Windows, you probably - should use the wintestinput3 file instead of testinput3 (and the - corresponding output file). This is a locale test; wintestinput3 sets the - locale to "french" rather than "fr_FR", and there some minor output - differences. - -(12) If you have built PCRE with SUPPORT_JIT, the JIT features will be tested - by the testdata files. However, you might also like to build and run - the freestanding JIT test program, pcre_jit_test.c. - -(13) If you want to use the pcregrep command, compile and link pcregrep.c; it - uses only the basic 8-bit PCRE library (it does not need the pcreposix - library). - - -THE C++ WRAPPER FUNCTIONS - -The PCRE distribution also contains some C++ wrapper functions and tests, -applicable to the 8-bit library, which were contributed by Google Inc. On a -system that can use "configure" and "make", the functions are automatically -built into a library called pcrecpp. It should be straightforward to compile -the .cc files manually on other systems. The files called xxx_unittest.cc are -test programs for each of the corresponding xxx.cc files. - - -BUILDING FOR VIRTUAL PASCAL - -A script for building PCRE using Borland's C++ compiler for use with VPASCAL -was contributed by Alexander Tokarev. Stefan Weber updated the script and added -additional files. The following files in the distribution are for building PCRE -for use with VP/Borland: makevp_c.txt, makevp_l.txt, makevp.bat, pcregexp.pas. - - -STACK SIZE IN WINDOWS ENVIRONMENTS - -The default processor stack size of 1Mb in some Windows environments is too -small for matching patterns that need much recursion. In particular, test 2 may -fail because of this. Normally, running out of stack causes a crash, but there -have been cases where the test program has just died silently. See your linker -documentation for how to increase stack size if you experience problems. The -Linux default of 8Mb is a reasonable choice for the stack, though even that can -be too small for some pattern/subject combinations. - -PCRE has a compile configuration option to disable the use of stack for -recursion so that heap is used instead. However, pattern matching is -significantly slower when this is done. There is more about stack usage in the -"pcrestack" documentation. - - -LINKING PROGRAMS IN WINDOWS ENVIRONMENTS - -If you want to statically link a program against a PCRE library in the form of -a non-dll .a file, you must define PCRE_STATIC before including pcre.h or -pcrecpp.h, otherwise the pcre_malloc() and pcre_free() exported functions will -be declared __declspec(dllimport), with unwanted results. - - -CALLING CONVENTIONS IN WINDOWS ENVIRONMENTS - -It is possible to compile programs to use different calling conventions using -MSVC. Search the web for "calling conventions" for more information. To make it -easier to change the calling convention for the exported functions in the -PCRE library, the macro PCRE_CALL_CONVENTION is present in all the external -definitions. It can be set externally when compiling (e.g. in CFLAGS). If it is -not set, it defaults to empty; the default calling convention is then used -(which is what is wanted most of the time). - - -COMMENTS ABOUT WIN32 BUILDS (see also "BUILDING PCRE ON WINDOWS WITH CMAKE") - -There are two ways of building PCRE using the "configure, make, make install" -paradigm on Windows systems: using MinGW or using Cygwin. These are not at all -the same thing; they are completely different from each other. There is also -support for building using CMake, which some users find a more straightforward -way of building PCRE under Windows. - -The MinGW home page (http://www.mingw.org/) says this: - - MinGW: A collection of freely available and freely distributable Windows - specific header files and import libraries combined with GNU toolsets that - allow one to produce native Windows programs that do not rely on any - 3rd-party C runtime DLLs. - -The Cygwin home page (http://www.cygwin.com/) says this: - - Cygwin is a Linux-like environment for Windows. It consists of two parts: - - . A DLL (cygwin1.dll) which acts as a Linux API emulation layer providing - substantial Linux API functionality - - . A collection of tools which provide Linux look and feel. - - The Cygwin DLL currently works with all recent, commercially released x86 32 - bit and 64 bit versions of Windows, with the exception of Windows CE. - -On both MinGW and Cygwin, PCRE should build correctly using: - - ./configure && make && make install - -This should create two libraries called libpcre and libpcreposix, and, if you -have enabled building the C++ wrapper, a third one called libpcrecpp. These are -independent libraries: when you link with libpcreposix or libpcrecpp you must -also link with libpcre, which contains the basic functions. (Some earlier -releases of PCRE included the basic libpcre functions in libpcreposix. This no -longer happens.) - -A user submitted a special-purpose patch that makes it easy to create -"pcre.dll" under mingw32 using the "msys" environment. It provides "pcre.dll" -as a special target. If you use this target, no other files are built, and in -particular, the pcretest and pcregrep programs are not built. An example of how -this might be used is: - - ./configure --enable-utf --disable-cpp CFLAGS="-03 -s"; make pcre.dll - -Using Cygwin's compiler generates libraries and executables that depend on -cygwin1.dll. If a library that is generated this way is distributed, -cygwin1.dll has to be distributed as well. Since cygwin1.dll is under the GPL -licence, this forces not only PCRE to be under the GPL, but also the entire -application. A distributor who wants to keep their own code proprietary must -purchase an appropriate Cygwin licence. - -MinGW has no such restrictions. The MinGW compiler generates a library or -executable that can run standalone on Windows without any third party dll or -licensing issues. - -But there is more complication: - -If a Cygwin user uses the -mno-cygwin Cygwin gcc flag, what that really does is -to tell Cygwin's gcc to use the MinGW gcc. Cygwin's gcc is only acting as a -front end to MinGW's gcc (if you install Cygwin's gcc, you get both Cygwin's -gcc and MinGW's gcc). So, a user can: - -. Build native binaries by using MinGW or by getting Cygwin and using - -mno-cygwin. - -. Build binaries that depend on cygwin1.dll by using Cygwin with the normal - compiler flags. - -The test files that are supplied with PCRE are in UNIX format, with LF -characters as line terminators. Unless your PCRE library uses a default newline -option that includes LF as a valid newline, it may be necessary to change the -line terminators in the test files to get some of the tests to work. - - -BUILDING PCRE ON WINDOWS WITH CMAKE - -CMake is an alternative configuration facility that can be used instead of -"configure". CMake creates project files (make files, solution files, etc.) -tailored to numerous development environments, including Visual Studio, -Borland, Msys, MinGW, NMake, and Unix. If possible, use short paths with no -spaces in the names for your CMake installation and your PCRE source and build -directories. - -The following instructions were contributed by a PCRE user. If they are not -followed exactly, errors may occur. In the event that errors do occur, it is -recommended that you delete the CMake cache before attempting to repeat the -CMake build process. In the CMake GUI, the cache can be deleted by selecting -"File > Delete Cache". - -1. Install the latest CMake version available from http://www.cmake.org/, and - ensure that cmake\bin is on your path. - -2. Unzip (retaining folder structure) the PCRE source tree into a source - directory such as C:\pcre. You should ensure your local date and time - is not earlier than the file dates in your source dir if the release is - very new. - -3. Create a new, empty build directory, preferably a subdirectory of the - source dir. For example, C:\pcre\pcre-xx\build. - -4. Run cmake-gui from the Shell envirornment of your build tool, for example, - Msys for Msys/MinGW or Visual Studio Command Prompt for VC/VC++. Do not try - to start Cmake from the Windows Start menu, as this can lead to errors. - -5. Enter C:\pcre\pcre-xx and C:\pcre\pcre-xx\build for the source and build - directories, respectively. - -6. Hit the "Configure" button. - -7. Select the particular IDE / build tool that you are using (Visual - Studio, MSYS makefiles, MinGW makefiles, etc.) - -8. The GUI will then list several configuration options. This is where - you can enable UTF-8 support or other PCRE optional features. - -9. Hit "Configure" again. The adjacent "Generate" button should now be - active. - -10. Hit "Generate". - -11. The build directory should now contain a usable build system, be it a - solution file for Visual Studio, makefiles for MinGW, etc. Exit from - cmake-gui and use the generated build system with your compiler or IDE. - E.g., for MinGW you can run "make", or for Visual Studio, open the PCRE - solution, select the desired configuration (Debug, or Release, etc.) and - build the ALL_BUILD project. - -12. If during configuration with cmake-gui you've elected to build the test - programs, you can execute them by building the test project. E.g., for - MinGW: "make test"; for Visual Studio build the RUN_TESTS project. The - most recent build configuration is targeted by the tests. A summary of - test results is presented. Complete test output is subsequently - available for review in Testing\Temporary under your build dir. - - -USE OF RELATIVE PATHS WITH CMAKE ON WINDOWS - -A PCRE user comments as follows: I thought that others may want to know the -current state of CMAKE_USE_RELATIVE_PATHS support on Windows. Here it is: - --- AdditionalIncludeDirectories is only partially modified (only the - first path - see below) --- Only some of the contained file paths are modified - shown below for - pcre.vcproj --- It properly modifies - -I am sure CMake people can fix that if they want to. Until then one will -need to replace existing absolute paths in project files with relative -paths manually (e.g. from VS) - relative to project file location. I did -just that before being told to try CMAKE_USE_RELATIVE_PATHS. Not a big -deal. - -AdditionalIncludeDirectories="E:\builds\pcre\build;E:\builds\pcre\pcre-7.5;" -AdditionalIncludeDirectories=".;E:\builds\pcre\pcre-7.5;" - -RelativePath="pcre.h" -RelativePath="pcre_chartables.c" -RelativePath="pcre_chartables.c.rule" - - -TESTING WITH RUNTEST.BAT - -If configured with CMake, building the test project ("make test" or building -ALL_TESTS in Visual Studio) creates (and runs) pcre_test.bat (and depending -on your configuration options, possibly other test programs) in the build -directory. Pcre_test.bat runs RunTest.Bat with correct source and exe paths. - -For manual testing with RunTest.bat, provided the build dir is a subdirectory -of the source directory: Open command shell window. Chdir to the location -of your pcretest.exe and pcregrep.exe programs. Call RunTest.bat with -"..\RunTest.Bat" or "..\..\RunTest.bat" as appropriate. - -To run only a particular test with RunTest.Bat provide a test number argument. - -Otherwise: - -1. Copy RunTest.bat into the directory where pcretest.exe and pcregrep.exe - have been created. - -2. Edit RunTest.bat to indentify the full or relative location of - the pcre source (wherein which the testdata folder resides), e.g.: - - set srcdir=C:\pcre\pcre-8.20 - -3. In a Windows command environment, chdir to the location of your bat and - exe programs. - -4. Run RunTest.bat. Test outputs will automatically be compared to expected - results, and discrepancies will be identified in the console output. - -To independently test the just-in-time compiler, run pcre_jit_test.exe. -To test pcrecpp, run pcrecpp_unittest.exe, pcre_stringpiece_unittest.exe and -pcre_scanner_unittest.exe. - - -BUILDING UNDER WINDOWS CE WITH VISUAL STUDIO 200x - -Vincent Richomme sent a zip archive of files to help with this process. They -can be found in the file "pcre-vsbuild.zip" in the Contrib directory of the FTP -site. - - -BUILDING UNDER WINDOWS WITH BCC5.5 - -Michael Roy sent these comments about building PCRE under Windows with BCC5.5: - -Some of the core BCC libraries have a version of PCRE from 1998 built in, which -can lead to pcre_exec() giving an erroneous PCRE_ERROR_NULL from a version -mismatch. I'm including an easy workaround below, if you'd like to include it -in the non-unix instructions: - -When linking a project with BCC5.5, pcre.lib must be included before any of the -libraries cw32.lib, cw32i.lib, cw32mt.lib, and cw32mti.lib on the command line. - - -BUILDING USING BORLAND C++ BUILDER 2007 (CB2007) AND HIGHER - -A PCRE user sent these comments about this environment (see also the comment -from another user that follows them): - -The XE versions of C++ Builder come with a RegularExpressionsCore class which -contain a version of TPerlRegEx. However, direct use of the C PCRE library may -be desirable. - -The default makevp.bat, however, supplied with PCRE builds a version of PCRE -that is not usable with any version of C++ Builder because the compiler ships -with an embedded version of PCRE, version 2.01 from 1998! [See also the note -about BCC5.5 above.] If you want to use PCRE you'll need to rename the -functions (pcre_compile to pcre_compile_bcc, etc) or do as I have done and just -use the 16 bit versions. I'm using std::wstring everywhere anyway. Since the -embedded version of PCRE does not have the 16 bit function names, there is no -conflict. - -Building PCRE using a C++ Builder static library project file (recommended): - -1. Rename or remove pcre.h, pcreposi.h, and pcreposix.h from your C++ Builder -original include path. - -2. Download PCRE from pcre.org and extract to a directory. - -3. Rename pcre_chartables.c.dist to pcre_chartables.c, pcre.h.generic to -pcre.h, and config.h.generic to config.h. - -4. Edit pcre.h and pcre_config.c so that they include config.h. - -5. Edit config.h like so: - -Comment out the following lines: -#define PACKAGE "pcre" -#define PACKAGE_BUGREPORT "" -#define PACKAGE_NAME "PCRE" -#define PACKAGE_STRING "PCRE 8.32" -#define PACKAGE_TARNAME "pcre" -#define PACKAGE_URL "" -#define PACKAGE_VERSION "8.32" - -Add the following lines: -#ifndef SUPPORT_UTF -#define SUPPORT_UTF 100 // any value is fine -#endif - -#ifndef SUPPORT_UCP -#define SUPPORT_UCP 101 // any value is fine -#endif - -#ifndef SUPPORT_UCP -#define SUPPORT_PCRE16 102 // any value is fine -#endif - -#ifndef SUPPORT_UTF8 -#define SUPPORT_UTF8 103 // any value is fine -#endif - -6. Build a C++ Builder project using the IDE. Go to File / New / Other and -choose Static Library. You can name it pcre.cbproj or whatever. Now set your -paths by going to Project / Options. Set the Include path. Do this from the -"Base" option to apply to both Release and Debug builds. Now add the following -files to the project: - -pcre.h -pcre16_byte_order.c -pcre16_chartables.c -pcre16_compile.c -pcre16_config.c -pcre16_dfa_exec.c -pcre16_exec.c -pcre16_fullinfo.c -pcre16_get.c -pcre16_globals.c -pcre16_maketables.c -pcre16_newline.c -pcre16_ord2utf16.c -pcre16_printint.c -pcre16_refcount.c -pcre16_string_utils.c -pcre16_study.c -pcre16_tables.c -pcre16_ucd.c -pcre16_utf16_utils.c -pcre16_valid_utf16.c -pcre16_version.c -pcre16_xclass.c - -//Optional -pcre_version.c - -7. After compiling the .lib file, copy the .lib and header files to a project -you want to use PCRE with. Enjoy. - -Optional ... Building PCRE using the makevp.bat file: - -1. Edit makevp_c.txt and makevp_l.txt and change all the names to the 16 bit -versions. - -2. Edit makevp.bat and set the path to C++ Builder. Run makevp.bat. - -Another PCRE user added this comment: - -Another approach I successfully used for some years with BCB 5 and 6 was to -make sure that include and library paths of PCRE are configured before the -default paths of the IDE in the dialogs where one can manage those paths. -Afterwards one can open the project files using a text editor and manually add -the self created library for pcre itself, pcrecpp doesn't ship with the IDE, in -the library nodes where the IDE manages its own libraries to link against in -front of the IDE-own libraries. This way one can use the default PCRE function -names without getting access violations on runtime. - - - - -BUILDING PCRE ON OPENVMS - -Stephen Hoffman sent the following, in December 2012: - -"Here is a very short write-up on the -OpenVMS port and here - - - -is a zip with the OpenVMS files, and with one modified testing-related PCRE -file." This is a port of PCRE 8.32. - -Earlier, Dan Mooney sent the following comments about building PCRE on OpenVMS. -They relate to an older version of PCRE that used fewer source files, so the -exact commands will need changing. See the current list of source files above. - -"It was quite easy to compile and link the library. I don't have a formal -make file but the attached file [reproduced below] contains the OpenVMS DCL -commands I used to build the library. I had to add #define -POSIX_MALLOC_THRESHOLD 10 to pcre.h since it was not defined anywhere. - -The library was built on: -O/S: HP OpenVMS v7.3-1 -Compiler: Compaq C v6.5-001-48BCD -Linker: vA13-01 - -The test results did not match 100% due to the issues you mention in your -documentation regarding isprint(), iscntrl(), isgraph() and ispunct(). I -modified some of the character tables temporarily and was able to get the -results to match. Tests using the fr locale did not match since I don't have -that locale loaded. The study size was always reported to be 3 less than the -value in the standard test output files." - -========================= -$! This DCL procedure builds PCRE on OpenVMS -$! -$! I followed the instructions in the non-unix-use file in the distribution. -$! -$ COMPILE == "CC/LIST/NOMEMBER_ALIGNMENT/PREFIX_LIBRARY_ENTRIES=ALL_ENTRIES -$ COMPILE DFTABLES.C -$ LINK/EXE=DFTABLES.EXE DFTABLES.OBJ -$ RUN DFTABLES.EXE/OUTPUT=CHARTABLES.C -$ COMPILE MAKETABLES.C -$ COMPILE GET.C -$ COMPILE STUDY.C -$! I had to set POSIX_MALLOC_THRESHOLD to 10 in PCRE.H since the symbol -$! did not seem to be defined anywhere. -$! I edited pcre.h and added #DEFINE SUPPORT_UTF8 to enable UTF8 support. -$ COMPILE PCRE.C -$ LIB/CREATE PCRE MAKETABLES.OBJ, GET.OBJ, STUDY.OBJ, PCRE.OBJ -$! I had to set POSIX_MALLOC_THRESHOLD to 10 in PCRE.H since the symbol -$! did not seem to be defined anywhere. -$ COMPILE PCREPOSIX.C -$ LIB/CREATE PCREPOSIX PCREPOSIX.OBJ -$ COMPILE PCRETEST.C -$ LINK/EXE=PCRETEST.EXE PCRETEST.OBJ, PCRE/LIB, PCREPOSIX/LIB -$! C programs that want access to command line arguments must be -$! defined as a symbol -$ PCRETEST :== "$ SYS$ROADSUSERS:[DMOONEY.REGEXP]PCRETEST.EXE" -$! Arguments must be enclosed in quotes. -$ PCRETEST "-C" -$! Test results: -$! -$! The test results did not match 100%. The functions isprint(), iscntrl(), -$! isgraph() and ispunct() on OpenVMS must not produce the same results -$! as the system that built the test output files provided with the -$! distribution. -$! -$! The study size did not match and was always 3 less on OpenVMS. -$! -$! Locale could not be set to fr -$! -========================= - - -BUILDING PCRE ON STRATUS OPENVOS - -These notes on the port of PCRE to VOS (lightly edited) were supplied by -Ashutosh Warikoo, whose email address has the local part awarikoo and the -domain nse.co.in. The port was for version 7.9 in August 2009. - -1. Building PCRE - -I built pcre on OpenVOS Release 17.0.1at using GNU Tools 3.4a without any -problems. I used the following packages to build PCRE: - - ftp://ftp.stratus.com/pub/vos/posix/ga/posix.save.evf.gz - -Please read and follow the instructions that come with these packages. To start -the build of pcre, from the root of the package type: - - ./build.sh - -2. Installing PCRE - -Once you have successfully built PCRE, login to the SysAdmin group, switch to -the root user, and type - - [ !create_dir (master_disk)>usr --if needed ] - [ !create_dir (master_disk)>usr>local --if needed ] - !gmake install - -This installs PCRE and its man pages into /usr/local. You can add -(master_disk)>usr>local>bin to your command search paths, or if you are in -BASH, add /usr/local/bin to the PATH environment variable. - -4. Restrictions - -This port requires readline library optionally. However during the build I -faced some yet unexplored errors while linking with readline. As it was an -optional component I chose to disable it. - -5. Known Problems - -I ran the test suite, but you will have to be your own judge of whether this -command, and this port, suits your purposes. If you find any problems that -appear to be related to the port itself, please let me know. Please see the -build.log file in the root of the package also. - - -BUILDING PCRE ON NATIVE Z/OS AND Z/VM - -z/OS and z/VM are operating systems for mainframe computers, produced by IBM. -The character code used is EBCDIC, not ASCII or Unicode. In z/OS, UNIX APIs and -applications can be supported through UNIX System Services, and in such an -environment PCRE can be built in the same way as in other systems. However, in -native z/OS (without UNIX System Services) and in z/VM, special ports are -required. For details, please see this web site: - - http://www.zaconsultants.net - -You may download PCRE from WWW.CBTTAPE.ORG, file 882.  Everything, source and -executable, is in EBCDIC and native z/OS file formats and this is the -recommended download site. - -========================== -Last Updated: 25 June 2015 diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/README.txt b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/README.txt deleted file mode 100644 index 4887ebf3..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/README.txt +++ /dev/null @@ -1,1002 +0,0 @@ -README file for PCRE (Perl-compatible regular expression library) ------------------------------------------------------------------ - -NOTE: This set of files relates to PCRE releases that use the original API, -with library names libpcre, libpcre16, and libpcre32. January 2015 saw the -first release of a new API, known as PCRE2, with release numbers starting at -10.00 and library names libpcre2-8, libpcre2-16, and libpcre2-32. The old -libraries (now called PCRE1) are still being maintained for bug fixes, but -there will be no new development. New projects are advised to use the new PCRE2 -libraries. - - -The latest release of PCRE1 is always available in three alternative formats -from: - - ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-xxx.tar.gz - ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-xxx.tar.bz2 - ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-xxx.zip - -There is a mailing list for discussion about the development of PCRE at -pcre-dev@exim.org. You can access the archives and subscribe or manage your -subscription here: - - https://lists.exim.org/mailman/listinfo/pcre-dev - -Please read the NEWS file if you are upgrading from a previous release. -The contents of this README file are: - - The PCRE APIs - Documentation for PCRE - Contributions by users of PCRE - Building PCRE on non-Unix-like systems - Building PCRE without using autotools - Building PCRE using autotools - Retrieving configuration information - Shared libraries - Cross-compiling using autotools - Using HP's ANSI C++ compiler (aCC) - Compiling in Tru64 using native compilers - Using Sun's compilers for Solaris - Using PCRE from MySQL - Making new tarballs - Testing PCRE - Character tables - File manifest - - -The PCRE APIs -------------- - -PCRE is written in C, and it has its own API. There are three sets of -functions, one for the 8-bit library, which processes strings of bytes, one for -the 16-bit library, which processes strings of 16-bit values, and one for the -32-bit library, which processes strings of 32-bit values. The distribution also -includes a set of C++ wrapper functions (see the pcrecpp man page for details), -courtesy of Google Inc., which can be used to call the 8-bit PCRE library from -C++. Other C++ wrappers have been created from time to time. See, for example: -https://github.com/YasserAsmi/regexp, which aims to be simple and similar in -style to the C API. - -The distribution also contains a set of C wrapper functions (again, just for -the 8-bit library) that are based on the POSIX regular expression API (see the -pcreposix man page). These end up in the library called libpcreposix. Note that -this just provides a POSIX calling interface to PCRE; the regular expressions -themselves still follow Perl syntax and semantics. The POSIX API is restricted, -and does not give full access to all of PCRE's facilities. - -The header file for the POSIX-style functions is called pcreposix.h. The -official POSIX name is regex.h, but I did not want to risk possible problems -with existing files of that name by distributing it that way. To use PCRE with -an existing program that uses the POSIX API, pcreposix.h will have to be -renamed or pointed at by a link. - -If you are using the POSIX interface to PCRE and there is already a POSIX regex -library installed on your system, as well as worrying about the regex.h header -file (as mentioned above), you must also take care when linking programs to -ensure that they link with PCRE's libpcreposix library. Otherwise they may pick -up the POSIX functions of the same name from the other library. - -One way of avoiding this confusion is to compile PCRE with the addition of --Dregcomp=PCREregcomp (and similarly for the other POSIX functions) to the -compiler flags (CFLAGS if you are using "configure" -- see below). This has the -effect of renaming the functions so that the names no longer clash. Of course, -you have to do the same thing for your applications, or write them using the -new names. - - -Documentation for PCRE ----------------------- - -If you install PCRE in the normal way on a Unix-like system, you will end up -with a set of man pages whose names all start with "pcre". The one that is just -called "pcre" lists all the others. In addition to these man pages, the PCRE -documentation is supplied in two other forms: - - 1. There are files called doc/pcre.txt, doc/pcregrep.txt, and - doc/pcretest.txt in the source distribution. The first of these is a - concatenation of the text forms of all the section 3 man pages except - the listing of pcredemo.c and those that summarize individual functions. - The other two are the text forms of the section 1 man pages for the - pcregrep and pcretest commands. These text forms are provided for ease of - scanning with text editors or similar tools. They are installed in - /share/doc/pcre, where is the installation prefix - (defaulting to /usr/local). - - 2. A set of files containing all the documentation in HTML form, hyperlinked - in various ways, and rooted in a file called index.html, is distributed in - doc/html and installed in /share/doc/pcre/html. - -Users of PCRE have contributed files containing the documentation for various -releases in CHM format. These can be found in the Contrib directory of the FTP -site (see next section). - - -Contributions by users of PCRE ------------------------------- - -You can find contributions from PCRE users in the directory - - ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/Contrib - -There is a README file giving brief descriptions of what they are. Some are -complete in themselves; others are pointers to URLs containing relevant files. -Some of this material is likely to be well out-of-date. Several of the earlier -contributions provided support for compiling PCRE on various flavours of -Windows (I myself do not use Windows). Nowadays there is more Windows support -in the standard distribution, so these contibutions have been archived. - -A PCRE user maintains downloadable Windows binaries of the pcregrep and -pcretest programs here: - - http://www.rexegg.com/pcregrep-pcretest.html - - -Building PCRE on non-Unix-like systems --------------------------------------- - -For a non-Unix-like system, please read the comments in the file -NON-AUTOTOOLS-BUILD, though if your system supports the use of "configure" and -"make" you may be able to build PCRE using autotools in the same way as for -many Unix-like systems. - -PCRE can also be configured using the GUI facility provided by CMake's -cmake-gui command. This creates Makefiles, solution files, etc. The file -NON-AUTOTOOLS-BUILD has information about CMake. - -PCRE has been compiled on many different operating systems. It should be -straightforward to build PCRE on any system that has a Standard C compiler and -library, because it uses only Standard C functions. - - -Building PCRE without using autotools -------------------------------------- - -The use of autotools (in particular, libtool) is problematic in some -environments, even some that are Unix or Unix-like. See the NON-AUTOTOOLS-BUILD -file for ways of building PCRE without using autotools. - - -Building PCRE using autotools ------------------------------ - -If you are using HP's ANSI C++ compiler (aCC), please see the special note -in the section entitled "Using HP's ANSI C++ compiler (aCC)" below. - -The following instructions assume the use of the widely used "configure; make; -make install" (autotools) process. - -To build PCRE on system that supports autotools, first run the "configure" -command from the PCRE distribution directory, with your current directory set -to the directory where you want the files to be created. This command is a -standard GNU "autoconf" configuration script, for which generic instructions -are supplied in the file INSTALL. - -Most commonly, people build PCRE within its own distribution directory, and in -this case, on many systems, just running "./configure" is sufficient. However, -the usual methods of changing standard defaults are available. For example: - -CFLAGS='-O2 -Wall' ./configure --prefix=/opt/local - -This command specifies that the C compiler should be run with the flags '-O2 --Wall' instead of the default, and that "make install" should install PCRE -under /opt/local instead of the default /usr/local. - -If you want to build in a different directory, just run "configure" with that -directory as current. For example, suppose you have unpacked the PCRE source -into /source/pcre/pcre-xxx, but you want to build it in /build/pcre/pcre-xxx: - -cd /build/pcre/pcre-xxx -/source/pcre/pcre-xxx/configure - -PCRE is written in C and is normally compiled as a C library. However, it is -possible to build it as a C++ library, though the provided building apparatus -does not have any features to support this. - -There are some optional features that can be included or omitted from the PCRE -library. They are also documented in the pcrebuild man page. - -. By default, both shared and static libraries are built. You can change this - by adding one of these options to the "configure" command: - - --disable-shared - --disable-static - - (See also "Shared libraries on Unix-like systems" below.) - -. By default, only the 8-bit library is built. If you add --enable-pcre16 to - the "configure" command, the 16-bit library is also built. If you add - --enable-pcre32 to the "configure" command, the 32-bit library is also built. - If you want only the 16-bit or 32-bit library, use --disable-pcre8 to disable - building the 8-bit library. - -. If you are building the 8-bit library and want to suppress the building of - the C++ wrapper library, you can add --disable-cpp to the "configure" - command. Otherwise, when "configure" is run without --disable-pcre8, it will - try to find a C++ compiler and C++ header files, and if it succeeds, it will - try to build the C++ wrapper. - -. If you want to include support for just-in-time compiling, which can give - large performance improvements on certain platforms, add --enable-jit to the - "configure" command. This support is available only for certain hardware - architectures. If you try to enable it on an unsupported architecture, there - will be a compile time error. - -. When JIT support is enabled, pcregrep automatically makes use of it, unless - you add --disable-pcregrep-jit to the "configure" command. - -. If you want to make use of the support for UTF-8 Unicode character strings in - the 8-bit library, or UTF-16 Unicode character strings in the 16-bit library, - or UTF-32 Unicode character strings in the 32-bit library, you must add - --enable-utf to the "configure" command. Without it, the code for handling - UTF-8, UTF-16 and UTF-8 is not included in the relevant library. Even - when --enable-utf is included, the use of a UTF encoding still has to be - enabled by an option at run time. When PCRE is compiled with this option, its - input can only either be ASCII or UTF-8/16/32, even when running on EBCDIC - platforms. It is not possible to use both --enable-utf and --enable-ebcdic at - the same time. - -. There are no separate options for enabling UTF-8, UTF-16 and UTF-32 - independently because that would allow ridiculous settings such as requesting - UTF-16 support while building only the 8-bit library. However, the option - --enable-utf8 is retained for backwards compatibility with earlier releases - that did not support 16-bit or 32-bit character strings. It is synonymous with - --enable-utf. It is not possible to configure one library with UTF support - and the other without in the same configuration. - -. If, in addition to support for UTF-8/16/32 character strings, you want to - include support for the \P, \p, and \X sequences that recognize Unicode - character properties, you must add --enable-unicode-properties to the - "configure" command. This adds about 30K to the size of the library (in the - form of a property table); only the basic two-letter properties such as Lu - are supported. - -. You can build PCRE to recognize either CR or LF or the sequence CRLF or any - of the preceding, or any of the Unicode newline sequences as indicating the - end of a line. Whatever you specify at build time is the default; the caller - of PCRE can change the selection at run time. The default newline indicator - is a single LF character (the Unix standard). You can specify the default - newline indicator by adding --enable-newline-is-cr or --enable-newline-is-lf - or --enable-newline-is-crlf or --enable-newline-is-anycrlf or - --enable-newline-is-any to the "configure" command, respectively. - - If you specify --enable-newline-is-cr or --enable-newline-is-crlf, some of - the standard tests will fail, because the lines in the test files end with - LF. Even if the files are edited to change the line endings, there are likely - to be some failures. With --enable-newline-is-anycrlf or - --enable-newline-is-any, many tests should succeed, but there may be some - failures. - -. By default, the sequence \R in a pattern matches any Unicode line ending - sequence. This is independent of the option specifying what PCRE considers to - be the end of a line (see above). However, the caller of PCRE can restrict \R - to match only CR, LF, or CRLF. You can make this the default by adding - --enable-bsr-anycrlf to the "configure" command (bsr = "backslash R"). - -. When called via the POSIX interface, PCRE uses malloc() to get additional - storage for processing capturing parentheses if there are more than 10 of - them in a pattern. You can increase this threshold by setting, for example, - - --with-posix-malloc-threshold=20 - - on the "configure" command. - -. PCRE has a counter that limits the depth of nesting of parentheses in a - pattern. This limits the amount of system stack that a pattern uses when it - is compiled. The default is 250, but you can change it by setting, for - example, - - --with-parens-nest-limit=500 - -. PCRE has a counter that can be set to limit the amount of resources it uses - when matching a pattern. If the limit is exceeded during a match, the match - fails. The default is ten million. You can change the default by setting, for - example, - - --with-match-limit=500000 - - on the "configure" command. This is just the default; individual calls to - pcre_exec() can supply their own value. There is more discussion on the - pcreapi man page. - -. There is a separate counter that limits the depth of recursive function calls - during a matching process. This also has a default of ten million, which is - essentially "unlimited". You can change the default by setting, for example, - - --with-match-limit-recursion=500000 - - Recursive function calls use up the runtime stack; running out of stack can - cause programs to crash in strange ways. There is a discussion about stack - sizes in the pcrestack man page. - -. The default maximum compiled pattern size is around 64K. You can increase - this by adding --with-link-size=3 to the "configure" command. In the 8-bit - library, PCRE then uses three bytes instead of two for offsets to different - parts of the compiled pattern. In the 16-bit library, --with-link-size=3 is - the same as --with-link-size=4, which (in both libraries) uses four-byte - offsets. Increasing the internal link size reduces performance. In the 32-bit - library, the only supported link size is 4. - -. You can build PCRE so that its internal match() function that is called from - pcre_exec() does not call itself recursively. Instead, it uses memory blocks - obtained from the heap via the special functions pcre_stack_malloc() and - pcre_stack_free() to save data that would otherwise be saved on the stack. To - build PCRE like this, use - - --disable-stack-for-recursion - - on the "configure" command. PCRE runs more slowly in this mode, but it may be - necessary in environments with limited stack sizes. This applies only to the - normal execution of the pcre_exec() function; if JIT support is being - successfully used, it is not relevant. Equally, it does not apply to - pcre_dfa_exec(), which does not use deeply nested recursion. There is a - discussion about stack sizes in the pcrestack man page. - -. For speed, PCRE uses four tables for manipulating and identifying characters - whose code point values are less than 256. By default, it uses a set of - tables for ASCII encoding that is part of the distribution. If you specify - - --enable-rebuild-chartables - - a program called dftables is compiled and run in the default C locale when - you obey "make". It builds a source file called pcre_chartables.c. If you do - not specify this option, pcre_chartables.c is created as a copy of - pcre_chartables.c.dist. See "Character tables" below for further information. - -. It is possible to compile PCRE for use on systems that use EBCDIC as their - character code (as opposed to ASCII/Unicode) by specifying - - --enable-ebcdic - - This automatically implies --enable-rebuild-chartables (see above). However, - when PCRE is built this way, it always operates in EBCDIC. It cannot support - both EBCDIC and UTF-8/16/32. There is a second option, --enable-ebcdic-nl25, - which specifies that the code value for the EBCDIC NL character is 0x25 - instead of the default 0x15. - -. In environments where valgrind is installed, if you specify - - --enable-valgrind - - PCRE will use valgrind annotations to mark certain memory regions as - unaddressable. This allows it to detect invalid memory accesses, and is - mostly useful for debugging PCRE itself. - -. In environments where the gcc compiler is used and lcov version 1.6 or above - is installed, if you specify - - --enable-coverage - - the build process implements a code coverage report for the test suite. The - report is generated by running "make coverage". If ccache is installed on - your system, it must be disabled when building PCRE for coverage reporting. - You can do this by setting the environment variable CCACHE_DISABLE=1 before - running "make" to build PCRE. There is more information about coverage - reporting in the "pcrebuild" documentation. - -. The pcregrep program currently supports only 8-bit data files, and so - requires the 8-bit PCRE library. It is possible to compile pcregrep to use - libz and/or libbz2, in order to read .gz and .bz2 files (respectively), by - specifying one or both of - - --enable-pcregrep-libz - --enable-pcregrep-libbz2 - - Of course, the relevant libraries must be installed on your system. - -. The default size (in bytes) of the internal buffer used by pcregrep can be - set by, for example: - - --with-pcregrep-bufsize=51200 - - The value must be a plain integer. The default is 20480. - -. It is possible to compile pcretest so that it links with the libreadline - or libedit libraries, by specifying, respectively, - - --enable-pcretest-libreadline or --enable-pcretest-libedit - - If this is done, when pcretest's input is from a terminal, it reads it using - the readline() function. This provides line-editing and history facilities. - Note that libreadline is GPL-licenced, so if you distribute a binary of - pcretest linked in this way, there may be licensing issues. These can be - avoided by linking with libedit (which has a BSD licence) instead. - - Enabling libreadline causes the -lreadline option to be added to the pcretest - build. In many operating environments with a sytem-installed readline - library this is sufficient. However, in some environments (e.g. if an - unmodified distribution version of readline is in use), it may be necessary - to specify something like LIBS="-lncurses" as well. This is because, to quote - the readline INSTALL, "Readline uses the termcap functions, but does not link - with the termcap or curses library itself, allowing applications which link - with readline the to choose an appropriate library." If you get error - messages about missing functions tgetstr, tgetent, tputs, tgetflag, or tgoto, - this is the problem, and linking with the ncurses library should fix it. - -The "configure" script builds the following files for the basic C library: - -. Makefile the makefile that builds the library -. config.h build-time configuration options for the library -. pcre.h the public PCRE header file -. pcre-config script that shows the building settings such as CFLAGS - that were set for "configure" -. libpcre.pc ) data for the pkg-config command -. libpcre16.pc ) -. libpcre32.pc ) -. libpcreposix.pc ) -. libtool script that builds shared and/or static libraries - -Versions of config.h and pcre.h are distributed in the PCRE tarballs under the -names config.h.generic and pcre.h.generic. These are provided for those who -have to built PCRE without using "configure" or CMake. If you use "configure" -or CMake, the .generic versions are not used. - -When building the 8-bit library, if a C++ compiler is found, the following -files are also built: - -. libpcrecpp.pc data for the pkg-config command -. pcrecpparg.h header file for calling PCRE via the C++ wrapper -. pcre_stringpiece.h header for the C++ "stringpiece" functions - -The "configure" script also creates config.status, which is an executable -script that can be run to recreate the configuration, and config.log, which -contains compiler output from tests that "configure" runs. - -Once "configure" has run, you can run "make". This builds the the libraries -libpcre, libpcre16 and/or libpcre32, and a test program called pcretest. If you -enabled JIT support with --enable-jit, a test program called pcre_jit_test is -built as well. - -If the 8-bit library is built, libpcreposix and the pcregrep command are also -built, and if a C++ compiler was found on your system, and you did not disable -it with --disable-cpp, "make" builds the C++ wrapper library, which is called -libpcrecpp, as well as some test programs called pcrecpp_unittest, -pcre_scanner_unittest, and pcre_stringpiece_unittest. - -The command "make check" runs all the appropriate tests. Details of the PCRE -tests are given below in a separate section of this document. - -You can use "make install" to install PCRE into live directories on your -system. The following are installed (file names are all relative to the - that is set when "configure" is run): - - Commands (bin): - pcretest - pcregrep (if 8-bit support is enabled) - pcre-config - - Libraries (lib): - libpcre16 (if 16-bit support is enabled) - libpcre32 (if 32-bit support is enabled) - libpcre (if 8-bit support is enabled) - libpcreposix (if 8-bit support is enabled) - libpcrecpp (if 8-bit and C++ support is enabled) - - Configuration information (lib/pkgconfig): - libpcre16.pc - libpcre32.pc - libpcre.pc - libpcreposix.pc - libpcrecpp.pc (if C++ support is enabled) - - Header files (include): - pcre.h - pcreposix.h - pcre_scanner.h ) - pcre_stringpiece.h ) if C++ support is enabled - pcrecpp.h ) - pcrecpparg.h ) - - Man pages (share/man/man{1,3}): - pcregrep.1 - pcretest.1 - pcre-config.1 - pcre.3 - pcre*.3 (lots more pages, all starting "pcre") - - HTML documentation (share/doc/pcre/html): - index.html - *.html (lots more pages, hyperlinked from index.html) - - Text file documentation (share/doc/pcre): - AUTHORS - COPYING - ChangeLog - LICENCE - NEWS - README - pcre.txt (a concatenation of the man(3) pages) - pcretest.txt the pcretest man page - pcregrep.txt the pcregrep man page - pcre-config.txt the pcre-config man page - -If you want to remove PCRE from your system, you can run "make uninstall". -This removes all the files that "make install" installed. However, it does not -remove any directories, because these are often shared with other programs. - - -Retrieving configuration information ------------------------------------- - -Running "make install" installs the command pcre-config, which can be used to -recall information about the PCRE configuration and installation. For example: - - pcre-config --version - -prints the version number, and - - pcre-config --libs - -outputs information about where the library is installed. This command can be -included in makefiles for programs that use PCRE, saving the programmer from -having to remember too many details. - -The pkg-config command is another system for saving and retrieving information -about installed libraries. Instead of separate commands for each library, a -single command is used. For example: - - pkg-config --cflags pcre - -The data is held in *.pc files that are installed in a directory called -/lib/pkgconfig. - - -Shared libraries ----------------- - -The default distribution builds PCRE as shared libraries and static libraries, -as long as the operating system supports shared libraries. Shared library -support relies on the "libtool" script which is built as part of the -"configure" process. - -The libtool script is used to compile and link both shared and static -libraries. They are placed in a subdirectory called .libs when they are newly -built. The programs pcretest and pcregrep are built to use these uninstalled -libraries (by means of wrapper scripts in the case of shared libraries). When -you use "make install" to install shared libraries, pcregrep and pcretest are -automatically re-built to use the newly installed shared libraries before being -installed themselves. However, the versions left in the build directory still -use the uninstalled libraries. - -To build PCRE using static libraries only you must use --disable-shared when -configuring it. For example: - -./configure --prefix=/usr/gnu --disable-shared - -Then run "make" in the usual way. Similarly, you can use --disable-static to -build only shared libraries. - - -Cross-compiling using autotools -------------------------------- - -You can specify CC and CFLAGS in the normal way to the "configure" command, in -order to cross-compile PCRE for some other host. However, you should NOT -specify --enable-rebuild-chartables, because if you do, the dftables.c source -file is compiled and run on the local host, in order to generate the inbuilt -character tables (the pcre_chartables.c file). This will probably not work, -because dftables.c needs to be compiled with the local compiler, not the cross -compiler. - -When --enable-rebuild-chartables is not specified, pcre_chartables.c is created -by making a copy of pcre_chartables.c.dist, which is a default set of tables -that assumes ASCII code. Cross-compiling with the default tables should not be -a problem. - -If you need to modify the character tables when cross-compiling, you should -move pcre_chartables.c.dist out of the way, then compile dftables.c by hand and -run it on the local host to make a new version of pcre_chartables.c.dist. -Then when you cross-compile PCRE this new version of the tables will be used. - - -Using HP's ANSI C++ compiler (aCC) ----------------------------------- - -Unless C++ support is disabled by specifying the "--disable-cpp" option of the -"configure" script, you must include the "-AA" option in the CXXFLAGS -environment variable in order for the C++ components to compile correctly. - -Also, note that the aCC compiler on PA-RISC platforms may have a defect whereby -needed libraries fail to get included when specifying the "-AA" compiler -option. If you experience unresolved symbols when linking the C++ programs, -use the workaround of specifying the following environment variable prior to -running the "configure" script: - - CXXLDFLAGS="-lstd_v2 -lCsup_v2" - - -Compiling in Tru64 using native compilers ------------------------------------------ - -The following error may occur when compiling with native compilers in the Tru64 -operating system: - - CXX libpcrecpp_la-pcrecpp.lo -cxx: Error: /usr/lib/cmplrs/cxx/V7.1-006/include/cxx/iosfwd, line 58: #error - directive: "cannot include iosfwd -- define __USE_STD_IOSTREAM to - override default - see section 7.1.2 of the C++ Using Guide" -#error "cannot include iosfwd -- define __USE_STD_IOSTREAM to override default -- see section 7.1.2 of the C++ Using Guide" - -This may be followed by other errors, complaining that 'namespace "std" has no -member'. The solution to this is to add the line - -#define __USE_STD_IOSTREAM 1 - -to the config.h file. - - -Using Sun's compilers for Solaris ---------------------------------- - -A user reports that the following configurations work on Solaris 9 sparcv9 and -Solaris 9 x86 (32-bit): - - Solaris 9 sparcv9: ./configure --disable-cpp CC=/bin/cc CFLAGS="-m64 -g" - Solaris 9 x86: ./configure --disable-cpp CC=/bin/cc CFLAGS="-g" - - -Using PCRE from MySQL ---------------------- - -On systems where both PCRE and MySQL are installed, it is possible to make use -of PCRE from within MySQL, as an alternative to the built-in pattern matching. -There is a web page that tells you how to do this: - - http://www.mysqludf.org/lib_mysqludf_preg/index.php - - -Making new tarballs -------------------- - -The command "make dist" creates three PCRE tarballs, in tar.gz, tar.bz2, and -zip formats. The command "make distcheck" does the same, but then does a trial -build of the new distribution to ensure that it works. - -If you have modified any of the man page sources in the doc directory, you -should first run the PrepareRelease script before making a distribution. This -script creates the .txt and HTML forms of the documentation from the man pages. - - -Testing PCRE ------------- - -To test the basic PCRE library on a Unix-like system, run the RunTest script. -There is another script called RunGrepTest that tests the options of the -pcregrep command. If the C++ wrapper library is built, three test programs -called pcrecpp_unittest, pcre_scanner_unittest, and pcre_stringpiece_unittest -are also built. When JIT support is enabled, another test program called -pcre_jit_test is built. - -Both the scripts and all the program tests are run if you obey "make check" or -"make test". For other environments, see the instructions in -NON-AUTOTOOLS-BUILD. - -The RunTest script runs the pcretest test program (which is documented in its -own man page) on each of the relevant testinput files in the testdata -directory, and compares the output with the contents of the corresponding -testoutput files. RunTest uses a file called testtry to hold the main output -from pcretest. Other files whose names begin with "test" are used as working -files in some tests. - -Some tests are relevant only when certain build-time options were selected. For -example, the tests for UTF-8/16/32 support are run only if --enable-utf was -used. RunTest outputs a comment when it skips a test. - -Many of the tests that are not skipped are run up to three times. The second -run forces pcre_study() to be called for all patterns except for a few in some -tests that are marked "never study" (see the pcretest program for how this is -done). If JIT support is available, the non-DFA tests are run a third time, -this time with a forced pcre_study() with the PCRE_STUDY_JIT_COMPILE option. -This testing can be suppressed by putting "nojit" on the RunTest command line. - -The entire set of tests is run once for each of the 8-bit, 16-bit and 32-bit -libraries that are enabled. If you want to run just one set of tests, call -RunTest with either the -8, -16 or -32 option. - -If valgrind is installed, you can run the tests under it by putting "valgrind" -on the RunTest command line. To run pcretest on just one or more specific test -files, give their numbers as arguments to RunTest, for example: - - RunTest 2 7 11 - -You can also specify ranges of tests such as 3-6 or 3- (meaning 3 to the -end), or a number preceded by ~ to exclude a test. For example: - - Runtest 3-15 ~10 - -This runs tests 3 to 15, excluding test 10, and just ~13 runs all the tests -except test 13. Whatever order the arguments are in, the tests are always run -in numerical order. - -You can also call RunTest with the single argument "list" to cause it to output -a list of tests. - -The first test file can be fed directly into the perltest.pl script to check -that Perl gives the same results. The only difference you should see is in the -first few lines, where the Perl version is given instead of the PCRE version. - -The second set of tests check pcre_fullinfo(), pcre_study(), -pcre_copy_substring(), pcre_get_substring(), pcre_get_substring_list(), error -detection, and run-time flags that are specific to PCRE, as well as the POSIX -wrapper API. It also uses the debugging flags to check some of the internals of -pcre_compile(). - -If you build PCRE with a locale setting that is not the standard C locale, the -character tables may be different (see next paragraph). In some cases, this may -cause failures in the second set of tests. For example, in a locale where the -isprint() function yields TRUE for characters in the range 128-255, the use of -[:isascii:] inside a character class defines a different set of characters, and -this shows up in this test as a difference in the compiled code, which is being -listed for checking. Where the comparison test output contains [\x00-\x7f] the -test will contain [\x00-\xff], and similarly in some other cases. This is not a -bug in PCRE. - -The third set of tests checks pcre_maketables(), the facility for building a -set of character tables for a specific locale and using them instead of the -default tables. The tests make use of the "fr_FR" (French) locale. Before -running the test, the script checks for the presence of this locale by running -the "locale" command. If that command fails, or if it doesn't include "fr_FR" -in the list of available locales, the third test cannot be run, and a comment -is output to say why. If running this test produces instances of the error - - ** Failed to set locale "fr_FR" - -in the comparison output, it means that locale is not available on your system, -despite being listed by "locale". This does not mean that PCRE is broken. - -[If you are trying to run this test on Windows, you may be able to get it to -work by changing "fr_FR" to "french" everywhere it occurs. Alternatively, use -RunTest.bat. The version of RunTest.bat included with PCRE 7.4 and above uses -Windows versions of test 2. More info on using RunTest.bat is included in the -document entitled NON-UNIX-USE.] - -The fourth and fifth tests check the UTF-8/16/32 support and error handling and -internal UTF features of PCRE that are not relevant to Perl, respectively. The -sixth and seventh tests do the same for Unicode character properties support. - -The eighth, ninth, and tenth tests check the pcre_dfa_exec() alternative -matching function, in non-UTF-8/16/32 mode, UTF-8/16/32 mode, and UTF-8/16/32 -mode with Unicode property support, respectively. - -The eleventh test checks some internal offsets and code size features; it is -run only when the default "link size" of 2 is set (in other cases the sizes -change) and when Unicode property support is enabled. - -The twelfth test is run only when JIT support is available, and the thirteenth -test is run only when JIT support is not available. They test some JIT-specific -features such as information output from pcretest about JIT compilation. - -The fourteenth, fifteenth, and sixteenth tests are run only in 8-bit mode, and -the seventeenth, eighteenth, and nineteenth tests are run only in 16/32-bit -mode. These are tests that generate different output in the two modes. They are -for general cases, UTF-8/16/32 support, and Unicode property support, -respectively. - -The twentieth test is run only in 16/32-bit mode. It tests some specific -16/32-bit features of the DFA matching engine. - -The twenty-first and twenty-second tests are run only in 16/32-bit mode, when -the link size is set to 2 for the 16-bit library. They test reloading -pre-compiled patterns. - -The twenty-third and twenty-fourth tests are run only in 16-bit mode. They are -for general cases, and UTF-16 support, respectively. - -The twenty-fifth and twenty-sixth tests are run only in 32-bit mode. They are -for general cases, and UTF-32 support, respectively. - - -Character tables ----------------- - -For speed, PCRE uses four tables for manipulating and identifying characters -whose code point values are less than 256. The final argument of the -pcre_compile() function is a pointer to a block of memory containing the -concatenated tables. A call to pcre_maketables() can be used to generate a set -of tables in the current locale. If the final argument for pcre_compile() is -passed as NULL, a set of default tables that is built into the binary is used. - -The source file called pcre_chartables.c contains the default set of tables. By -default, this is created as a copy of pcre_chartables.c.dist, which contains -tables for ASCII coding. However, if --enable-rebuild-chartables is specified -for ./configure, a different version of pcre_chartables.c is built by the -program dftables (compiled from dftables.c), which uses the ANSI C character -handling functions such as isalnum(), isalpha(), isupper(), islower(), etc. to -build the table sources. This means that the default C locale which is set for -your system will control the contents of these default tables. You can change -the default tables by editing pcre_chartables.c and then re-building PCRE. If -you do this, you should take care to ensure that the file does not get -automatically re-generated. The best way to do this is to move -pcre_chartables.c.dist out of the way and replace it with your customized -tables. - -When the dftables program is run as a result of --enable-rebuild-chartables, -it uses the default C locale that is set on your system. It does not pay -attention to the LC_xxx environment variables. In other words, it uses the -system's default locale rather than whatever the compiling user happens to have -set. If you really do want to build a source set of character tables in a -locale that is specified by the LC_xxx variables, you can run the dftables -program by hand with the -L option. For example: - - ./dftables -L pcre_chartables.c.special - -The first two 256-byte tables provide lower casing and case flipping functions, -respectively. The next table consists of three 32-byte bit maps which identify -digits, "word" characters, and white space, respectively. These are used when -building 32-byte bit maps that represent character classes for code points less -than 256. - -The final 256-byte table has bits indicating various character types, as -follows: - - 1 white space character - 2 letter - 4 decimal digit - 8 hexadecimal digit - 16 alphanumeric or '_' - 128 regular expression metacharacter or binary zero - -You should not alter the set of characters that contain the 128 bit, as that -will cause PCRE to malfunction. - - -File manifest -------------- - -The distribution should contain the files listed below. Where a file name is -given as pcre[16|32]_xxx it means that there are three files, one with the name -pcre_xxx, one with the name pcre16_xx, and a third with the name pcre32_xxx. - -(A) Source files of the PCRE library functions and their headers: - - dftables.c auxiliary program for building pcre_chartables.c - when --enable-rebuild-chartables is specified - - pcre_chartables.c.dist a default set of character tables that assume ASCII - coding; used, unless --enable-rebuild-chartables is - specified, by copying to pcre[16]_chartables.c - - pcreposix.c ) - pcre[16|32]_byte_order.c ) - pcre[16|32]_compile.c ) - pcre[16|32]_config.c ) - pcre[16|32]_dfa_exec.c ) - pcre[16|32]_exec.c ) - pcre[16|32]_fullinfo.c ) - pcre[16|32]_get.c ) sources for the functions in the library, - pcre[16|32]_globals.c ) and some internal functions that they use - pcre[16|32]_jit_compile.c ) - pcre[16|32]_maketables.c ) - pcre[16|32]_newline.c ) - pcre[16|32]_refcount.c ) - pcre[16|32]_string_utils.c ) - pcre[16|32]_study.c ) - pcre[16|32]_tables.c ) - pcre[16|32]_ucd.c ) - pcre[16|32]_version.c ) - pcre[16|32]_xclass.c ) - pcre_ord2utf8.c ) - pcre_valid_utf8.c ) - pcre16_ord2utf16.c ) - pcre16_utf16_utils.c ) - pcre16_valid_utf16.c ) - pcre32_utf32_utils.c ) - pcre32_valid_utf32.c ) - - pcre[16|32]_printint.c ) debugging function that is used by pcretest, - ) and can also be #included in pcre_compile() - - pcre.h.in template for pcre.h when built by "configure" - pcreposix.h header for the external POSIX wrapper API - pcre_internal.h header for internal use - sljit/* 16 files that make up the JIT compiler - ucp.h header for Unicode property handling - - config.h.in template for config.h, which is built by "configure" - - pcrecpp.h public header file for the C++ wrapper - pcrecpparg.h.in template for another C++ header file - pcre_scanner.h public header file for C++ scanner functions - pcrecpp.cc ) - pcre_scanner.cc ) source for the C++ wrapper library - - pcre_stringpiece.h.in template for pcre_stringpiece.h, the header for the - C++ stringpiece functions - pcre_stringpiece.cc source for the C++ stringpiece functions - -(B) Source files for programs that use PCRE: - - pcredemo.c simple demonstration of coding calls to PCRE - pcregrep.c source of a grep utility that uses PCRE - pcretest.c comprehensive test program - -(C) Auxiliary files: - - 132html script to turn "man" pages into HTML - AUTHORS information about the author of PCRE - ChangeLog log of changes to the code - CleanTxt script to clean nroff output for txt man pages - Detrail script to remove trailing spaces - HACKING some notes about the internals of PCRE - INSTALL generic installation instructions - LICENCE conditions for the use of PCRE - COPYING the same, using GNU's standard name - Makefile.in ) template for Unix Makefile, which is built by - ) "configure" - Makefile.am ) the automake input that was used to create - ) Makefile.in - NEWS important changes in this release - NON-UNIX-USE the previous name for NON-AUTOTOOLS-BUILD - NON-AUTOTOOLS-BUILD notes on building PCRE without using autotools - PrepareRelease script to make preparations for "make dist" - README this file - RunTest a Unix shell script for running tests - RunGrepTest a Unix shell script for pcregrep tests - aclocal.m4 m4 macros (generated by "aclocal") - config.guess ) files used by libtool, - config.sub ) used only when building a shared library - configure a configuring shell script (built by autoconf) - configure.ac ) the autoconf input that was used to build - ) "configure" and config.h - depcomp ) script to find program dependencies, generated by - ) automake - doc/*.3 man page sources for PCRE - doc/*.1 man page sources for pcregrep and pcretest - doc/index.html.src the base HTML page - doc/html/* HTML documentation - doc/pcre.txt plain text version of the man pages - doc/pcretest.txt plain text documentation of test program - doc/perltest.txt plain text documentation of Perl test program - install-sh a shell script for installing files - libpcre16.pc.in template for libpcre16.pc for pkg-config - libpcre32.pc.in template for libpcre32.pc for pkg-config - libpcre.pc.in template for libpcre.pc for pkg-config - libpcreposix.pc.in template for libpcreposix.pc for pkg-config - libpcrecpp.pc.in template for libpcrecpp.pc for pkg-config - ltmain.sh file used to build a libtool script - missing ) common stub for a few missing GNU programs while - ) installing, generated by automake - mkinstalldirs script for making install directories - perltest.pl Perl test program - pcre-config.in source of script which retains PCRE information - pcre_jit_test.c test program for the JIT compiler - pcrecpp_unittest.cc ) - pcre_scanner_unittest.cc ) test programs for the C++ wrapper - pcre_stringpiece_unittest.cc ) - testdata/testinput* test data for main library tests - testdata/testoutput* expected test results - testdata/grep* input and output for pcregrep tests - testdata/* other supporting test files - -(D) Auxiliary files for cmake support - - cmake/COPYING-CMAKE-SCRIPTS - cmake/FindPackageHandleStandardArgs.cmake - cmake/FindEditline.cmake - cmake/FindReadline.cmake - CMakeLists.txt - config-cmake.h.in - -(E) Auxiliary files for VPASCAL - - makevp.bat - makevp_c.txt - makevp_l.txt - pcregexp.pas - -(F) Auxiliary files for building PCRE "by hand" - - pcre.h.generic ) a version of the public PCRE header file - ) for use in non-"configure" environments - config.h.generic ) a version of config.h for use in non-"configure" - ) environments - -(F) Miscellaneous - - RunTest.bat a script for running tests under Windows - -Philip Hazel -Email local part: ph10 -Email domain: cam.ac.uk -Last updated: 10 February 2015 diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/index.html b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/index.html deleted file mode 100644 index 352c55df..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/index.html +++ /dev/null @@ -1,185 +0,0 @@ - - - -PCRE specification - - -

      Perl-compatible Regular Expressions (PCRE)

      -

      -The HTML documentation for PCRE consists of a number of pages that are listed -below in alphabetical order. If you are new to PCRE, please read the first one -first. -

      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      pcre  Introductory page
      pcre-config  Information about the installation configuration
      pcre16  Discussion of the 16-bit PCRE library
      pcre32  Discussion of the 32-bit PCRE library
      pcreapi  PCRE's native API
      pcrebuild  Building PCRE
      pcrecallout  The callout facility
      pcrecompat  Compability with Perl
      pcrecpp  The C++ wrapper for the PCRE library
      pcredemo  A demonstration C program that uses the PCRE library
      pcregrep  The pcregrep command
      pcrejit  Discussion of the just-in-time optimization support
      pcrelimits  Details of size and other limits
      pcrematching  Discussion of the two matching algorithms
      pcrepartial  Using PCRE for partial matching
      pcrepattern  Specification of the regular expressions supported by PCRE
      pcreperform  Some comments on performance
      pcreposix  The POSIX API to the PCRE 8-bit library
      pcreprecompile  How to save and re-use compiled patterns
      pcresample  Discussion of the pcredemo program
      pcrestack  Discussion of PCRE's stack usage
      pcresyntax  Syntax quick-reference summary
      pcretest  The pcretest command for testing PCRE
      pcreunicode  Discussion of Unicode and UTF-8/UTF-16/UTF-32 support
      - -

      -There are also individual pages that summarize the interface for each function -in the library. There is a single page for each triple of 8-bit/16-bit/32-bit -functions. -

      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      pcre_assign_jit_stack  Assign stack for JIT matching
      pcre_compile  Compile a regular expression
      pcre_compile2  Compile a regular expression (alternate interface)
      pcre_config  Show build-time configuration options
      pcre_copy_named_substring  Extract named substring into given buffer
      pcre_copy_substring  Extract numbered substring into given buffer
      pcre_dfa_exec  Match a compiled pattern to a subject string - (DFA algorithm; not Perl compatible)
      pcre_exec  Match a compiled pattern to a subject string - (Perl compatible)
      pcre_free_study  Free study data
      pcre_free_substring  Free extracted substring
      pcre_free_substring_list  Free list of extracted substrings
      pcre_fullinfo  Extract information about a pattern
      pcre_get_named_substring  Extract named substring into new memory
      pcre_get_stringnumber  Convert captured string name to number
      pcre_get_stringtable_entries  Find table entries for given string name
      pcre_get_substring  Extract numbered substring into new memory
      pcre_get_substring_list  Extract all substrings into new memory
      pcre_jit_exec  Fast path interface to JIT matching
      pcre_jit_stack_alloc  Create a stack for JIT matching
      pcre_jit_stack_free  Free a JIT matching stack
      pcre_maketables  Build character tables in current locale
      pcre_pattern_to_host_byte_order  Convert compiled pattern to host byte order if necessary
      pcre_refcount  Maintain reference count in compiled pattern
      pcre_study  Study a compiled pattern
      pcre_utf16_to_host_byte_order  Convert UTF-16 string to host byte order if necessary
      pcre_utf32_to_host_byte_order  Convert UTF-32 string to host byte order if necessary
      pcre_version  Return PCRE version and release date
      - - diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcre-config.html b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcre-config.html deleted file mode 100644 index 56a80604..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcre-config.html +++ /dev/null @@ -1,109 +0,0 @@ - - -pcre-config specification - - -

      pcre-config man page

      -

      -Return to the PCRE index page. -

      -

      -This page is part of the PCRE HTML documentation. It was generated automatically -from the original man page. If there is any nonsense in it, please consult the -man page, in case the conversion went wrong. -
      -

      -
      SYNOPSIS
      -

      -pcre-config [--prefix] [--exec-prefix] [--version] [--libs] - [--libs16] [--libs32] [--libs-cpp] [--libs-posix] - [--cflags] [--cflags-posix] -

      -
      DESCRIPTION
      -

      -pcre-config returns the configuration of the installed PCRE -libraries and the options required to compile a program to use them. Some of -the options apply only to the 8-bit, or 16-bit, or 32-bit libraries, -respectively, and are -not available if only one of those libraries has been built. If an unavailable -option is encountered, the "usage" information is output. -

      -
      OPTIONS
      -

      ---prefix -Writes the directory prefix used in the PCRE installation for architecture -independent files (/usr on many systems, /usr/local on some -systems) to the standard output. -

      -

      ---exec-prefix -Writes the directory prefix used in the PCRE installation for architecture -dependent files (normally the same as --prefix) to the standard output. -

      -

      ---version -Writes the version number of the installed PCRE libraries to the standard -output. -

      -

      ---libs -Writes to the standard output the command line options required to link -with the 8-bit PCRE library (-lpcre on many systems). -

      -

      ---libs16 -Writes to the standard output the command line options required to link -with the 16-bit PCRE library (-lpcre16 on many systems). -

      -

      ---libs32 -Writes to the standard output the command line options required to link -with the 32-bit PCRE library (-lpcre32 on many systems). -

      -

      ---libs-cpp -Writes to the standard output the command line options required to link with -PCRE's C++ wrapper library (-lpcrecpp -lpcre on many -systems). -

      -

      ---libs-posix -Writes to the standard output the command line options required to link with -PCRE's POSIX API wrapper library (-lpcreposix -lpcre on many -systems). -

      -

      ---cflags -Writes to the standard output the command line options required to compile -files that use PCRE (this may include some -I options, but is blank on -many systems). -

      -

      ---cflags-posix -Writes to the standard output the command line options required to compile -files that use PCRE's POSIX API wrapper library (this may include some -I -options, but is blank on many systems). -

      -
      SEE ALSO
      -

      -pcre(3) -

      -
      AUTHOR
      -

      -This manual page was originally written by Mark Baker for the Debian GNU/Linux -system. It has been subsequently revised as a generic PCRE man page. -

      -
      REVISION
      -

      -Last updated: 24 June 2012 -
      -

      -Return to the PCRE index page. -

      diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcre.html b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcre.html deleted file mode 100644 index c87b1066..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcre.html +++ /dev/null @@ -1,224 +0,0 @@ - - -pcre specification - - -

      pcre man page

      -

      -Return to the PCRE index page. -

      -

      -This page is part of the PCRE HTML documentation. It was generated automatically -from the original man page. If there is any nonsense in it, please consult the -man page, in case the conversion went wrong. -
      -

      -
      PLEASE TAKE NOTE
      -

      -This document relates to PCRE releases that use the original API, -with library names libpcre, libpcre16, and libpcre32. January 2015 saw the -first release of a new API, known as PCRE2, with release numbers starting at -10.00 and library names libpcre2-8, libpcre2-16, and libpcre2-32. The old -libraries (now called PCRE1) are still being maintained for bug fixes, but -there will be no new development. New projects are advised to use the new PCRE2 -libraries. -

      -
      INTRODUCTION
      -

      -The PCRE library is a set of functions that implement regular expression -pattern matching using the same syntax and semantics as Perl, with just a few -differences. Some features that appeared in Python and PCRE before they -appeared in Perl are also available using the Python syntax, there is some -support for one or two .NET and Oniguruma syntax items, and there is an option -for requesting some minor changes that give better JavaScript compatibility. -

      -

      -Starting with release 8.30, it is possible to compile two separate PCRE -libraries: the original, which supports 8-bit character strings (including -UTF-8 strings), and a second library that supports 16-bit character strings -(including UTF-16 strings). The build process allows either one or both to be -built. The majority of the work to make this possible was done by Zoltan -Herczeg. -

      -

      -Starting with release 8.32 it is possible to compile a third separate PCRE -library that supports 32-bit character strings (including UTF-32 strings). The -build process allows any combination of the 8-, 16- and 32-bit libraries. The -work to make this possible was done by Christian Persch. -

      -

      -The three libraries contain identical sets of functions, except that the names -in the 16-bit library start with pcre16_ instead of pcre_, and the -names in the 32-bit library start with pcre32_ instead of pcre_. To -avoid over-complication and reduce the documentation maintenance load, most of -the documentation describes the 8-bit library, with the differences for the -16-bit and 32-bit libraries described separately in the -pcre16 -and -pcre32 -pages. References to functions or structures of the form pcre[16|32]_xxx -should be read as meaning "pcre_xxx when using the 8-bit library, -pcre16_xxx when using the 16-bit library, or pcre32_xxx when using -the 32-bit library". -

      -

      -The current implementation of PCRE corresponds approximately with Perl 5.12, -including support for UTF-8/16/32 encoded strings and Unicode general category -properties. However, UTF-8/16/32 and Unicode support has to be explicitly -enabled; it is not the default. The Unicode tables correspond to Unicode -release 6.3.0. -

      -

      -In addition to the Perl-compatible matching function, PCRE contains an -alternative function that matches the same compiled patterns in a different -way. In certain circumstances, the alternative function has some advantages. -For a discussion of the two matching algorithms, see the -pcrematching -page. -

      -

      -PCRE is written in C and released as a C library. A number of people have -written wrappers and interfaces of various kinds. In particular, Google Inc. -have provided a comprehensive C++ wrapper for the 8-bit library. This is now -included as part of the PCRE distribution. The -pcrecpp -page has details of this interface. Other people's contributions can be found -in the Contrib directory at the primary FTP site, which is: -ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre -

      -

      -Details of exactly which Perl regular expression features are and are not -supported by PCRE are given in separate documents. See the -pcrepattern -and -pcrecompat -pages. There is a syntax summary in the -pcresyntax -page. -

      -

      -Some features of PCRE can be included, excluded, or changed when the library is -built. The -pcre_config() -function makes it possible for a client to discover which features are -available. The features themselves are described in the -pcrebuild -page. Documentation about building PCRE for various operating systems can be -found in the -README -and -NON-AUTOTOOLS_BUILD -files in the source distribution. -

      -

      -The libraries contains a number of undocumented internal functions and data -tables that are used by more than one of the exported external functions, but -which are not intended for use by external callers. Their names all begin with -"_pcre_" or "_pcre16_" or "_pcre32_", which hopefully will not provoke any name -clashes. In some environments, it is possible to control which external symbols -are exported when a shared library is built, and in these cases the -undocumented symbols are not exported. -

      -
      SECURITY CONSIDERATIONS
      -

      -If you are using PCRE in a non-UTF application that permits users to supply -arbitrary patterns for compilation, you should be aware of a feature that -allows users to turn on UTF support from within a pattern, provided that PCRE -was built with UTF support. For example, an 8-bit pattern that begins with -"(*UTF8)" or "(*UTF)" turns on UTF-8 mode, which interprets patterns and -subjects as strings of UTF-8 characters instead of individual 8-bit characters. -This causes both the pattern and any data against which it is matched to be -checked for UTF-8 validity. If the data string is very long, such a check might -use sufficiently many resources as to cause your application to lose -performance. -

      -

      -One way of guarding against this possibility is to use the -pcre_fullinfo() function to check the compiled pattern's options for UTF. -Alternatively, from release 8.33, you can set the PCRE_NEVER_UTF option at -compile time. This causes an compile time error if a pattern contains a -UTF-setting sequence. -

      -

      -If your application is one that supports UTF, be aware that validity checking -can take time. If the same data string is to be matched many times, you can use -the PCRE_NO_UTF[8|16|32]_CHECK option for the second and subsequent matches to -save redundant checks. -

      -

      -Another way that performance can be hit is by running a pattern that has a very -large search tree against a string that will never match. Nested unlimited -repeats in a pattern are a common example. PCRE provides some protection -against this: see the PCRE_EXTRA_MATCH_LIMIT feature in the -pcreapi -page. -

      -
      USER DOCUMENTATION
      -

      -The user documentation for PCRE comprises a number of different sections. In -the "man" format, each of these is a separate "man page". In the HTML format, -each is a separate page, linked from the index page. In the plain text format, -the descriptions of the pcregrep and pcretest programs are in files -called pcregrep.txt and pcretest.txt, respectively. The remaining -sections, except for the pcredemo section (which is a program listing), -are concatenated in pcre.txt, for ease of searching. The sections are as -follows: -

      -  pcre              this document
      -  pcre-config       show PCRE installation configuration information
      -  pcre16            details of the 16-bit library
      -  pcre32            details of the 32-bit library
      -  pcreapi           details of PCRE's native C API
      -  pcrebuild         building PCRE
      -  pcrecallout       details of the callout feature
      -  pcrecompat        discussion of Perl compatibility
      -  pcrecpp           details of the C++ wrapper for the 8-bit library
      -  pcredemo          a demonstration C program that uses PCRE
      -  pcregrep          description of the pcregrep command (8-bit only)
      -  pcrejit           discussion of the just-in-time optimization support
      -  pcrelimits        details of size and other limits
      -  pcrematching      discussion of the two matching algorithms
      -  pcrepartial       details of the partial matching facility
      -  pcrepattern       syntax and semantics of supported regular expressions
      -  pcreperform       discussion of performance issues
      -  pcreposix         the POSIX-compatible C API for the 8-bit library
      -  pcreprecompile    details of saving and re-using precompiled patterns
      -  pcresample        discussion of the pcredemo program
      -  pcrestack         discussion of stack usage
      -  pcresyntax        quick syntax reference
      -  pcretest          description of the pcretest testing command
      -  pcreunicode       discussion of Unicode and UTF-8/16/32 support
      -
      -In the "man" and HTML formats, there is also a short page for each C library -function, listing its arguments and results. -

      -
      AUTHOR
      -

      -Philip Hazel -
      -University Computing Service -
      -Cambridge CB2 3QH, England. -
      -

      -

      -Putting an actual email address here seems to have been a spam magnet, so I've -taken it away. If you want to email me, use my two initials, followed by the -two digits 10, at the domain cam.ac.uk. -

      -
      REVISION
      -

      -Last updated: 10 February 2015 -
      -Copyright © 1997-2015 University of Cambridge. -
      -

      -Return to the PCRE index page. -

      diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcre16.html b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcre16.html deleted file mode 100644 index f00859f0..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcre16.html +++ /dev/null @@ -1,384 +0,0 @@ - - -pcre16 specification - - -

      pcre16 man page

      -

      -Return to the PCRE index page. -

      -

      -This page is part of the PCRE HTML documentation. It was generated automatically -from the original man page. If there is any nonsense in it, please consult the -man page, in case the conversion went wrong. -
      -

      -

      -#include <pcre.h> -

      -
      PCRE 16-BIT API BASIC FUNCTIONS
      -

      -pcre16 *pcre16_compile(PCRE_SPTR16 pattern, int options, - const char **errptr, int *erroffset, - const unsigned char *tableptr); -
      -
      -pcre16 *pcre16_compile2(PCRE_SPTR16 pattern, int options, - int *errorcodeptr, - const char **errptr, int *erroffset, - const unsigned char *tableptr); -
      -
      -pcre16_extra *pcre16_study(const pcre16 *code, int options, - const char **errptr); -
      -
      -void pcre16_free_study(pcre16_extra *extra); -
      -
      -int pcre16_exec(const pcre16 *code, const pcre16_extra *extra, - PCRE_SPTR16 subject, int length, int startoffset, - int options, int *ovector, int ovecsize); -
      -
      -int pcre16_dfa_exec(const pcre16 *code, const pcre16_extra *extra, - PCRE_SPTR16 subject, int length, int startoffset, - int options, int *ovector, int ovecsize, - int *workspace, int wscount); -

      -
      PCRE 16-BIT API STRING EXTRACTION FUNCTIONS
      -

      -int pcre16_copy_named_substring(const pcre16 *code, - PCRE_SPTR16 subject, int *ovector, - int stringcount, PCRE_SPTR16 stringname, - PCRE_UCHAR16 *buffer, int buffersize); -
      -
      -int pcre16_copy_substring(PCRE_SPTR16 subject, int *ovector, - int stringcount, int stringnumber, PCRE_UCHAR16 *buffer, - int buffersize); -
      -
      -int pcre16_get_named_substring(const pcre16 *code, - PCRE_SPTR16 subject, int *ovector, - int stringcount, PCRE_SPTR16 stringname, - PCRE_SPTR16 *stringptr); -
      -
      -int pcre16_get_stringnumber(const pcre16 *code, -" PCRE_SPTR16 name); -
      -
      -int pcre16_get_stringtable_entries(const pcre16 *code, - PCRE_SPTR16 name, PCRE_UCHAR16 **first, PCRE_UCHAR16 **last); -
      -
      -int pcre16_get_substring(PCRE_SPTR16 subject, int *ovector, - int stringcount, int stringnumber, - PCRE_SPTR16 *stringptr); -
      -
      -int pcre16_get_substring_list(PCRE_SPTR16 subject, - int *ovector, int stringcount, PCRE_SPTR16 **listptr); -
      -
      -void pcre16_free_substring(PCRE_SPTR16 stringptr); -
      -
      -void pcre16_free_substring_list(PCRE_SPTR16 *stringptr); -

      -
      PCRE 16-BIT API AUXILIARY FUNCTIONS
      -

      -pcre16_jit_stack *pcre16_jit_stack_alloc(int startsize, int maxsize); -
      -
      -void pcre16_jit_stack_free(pcre16_jit_stack *stack); -
      -
      -void pcre16_assign_jit_stack(pcre16_extra *extra, - pcre16_jit_callback callback, void *data); -
      -
      -const unsigned char *pcre16_maketables(void); -
      -
      -int pcre16_fullinfo(const pcre16 *code, const pcre16_extra *extra, - int what, void *where); -
      -
      -int pcre16_refcount(pcre16 *code, int adjust); -
      -
      -int pcre16_config(int what, void *where); -
      -
      -const char *pcre16_version(void); -
      -
      -int pcre16_pattern_to_host_byte_order(pcre16 *code, - pcre16_extra *extra, const unsigned char *tables); -

      -
      PCRE 16-BIT API INDIRECTED FUNCTIONS
      -

      -void *(*pcre16_malloc)(size_t); -
      -
      -void (*pcre16_free)(void *); -
      -
      -void *(*pcre16_stack_malloc)(size_t); -
      -
      -void (*pcre16_stack_free)(void *); -
      -
      -int (*pcre16_callout)(pcre16_callout_block *); -

      -
      PCRE 16-BIT API 16-BIT-ONLY FUNCTION
      -

      -int pcre16_utf16_to_host_byte_order(PCRE_UCHAR16 *output, - PCRE_SPTR16 input, int length, int *byte_order, - int keep_boms); -

      -
      THE PCRE 16-BIT LIBRARY
      -

      -Starting with release 8.30, it is possible to compile a PCRE library that -supports 16-bit character strings, including UTF-16 strings, as well as or -instead of the original 8-bit library. The majority of the work to make this -possible was done by Zoltan Herczeg. The two libraries contain identical sets -of functions, used in exactly the same way. Only the names of the functions and -the data types of their arguments and results are different. To avoid -over-complication and reduce the documentation maintenance load, most of the -PCRE documentation describes the 8-bit library, with only occasional references -to the 16-bit library. This page describes what is different when you use the -16-bit library. -

      -

      -WARNING: A single application can be linked with both libraries, but you must -take care when processing any particular pattern to use functions from just one -library. For example, if you want to study a pattern that was compiled with -pcre16_compile(), you must do so with pcre16_study(), not -pcre_study(), and you must free the study data with -pcre16_free_study(). -

      -
      THE HEADER FILE
      -

      -There is only one header file, pcre.h. It contains prototypes for all the -functions in all libraries, as well as definitions of flags, structures, error -codes, etc. -

      -
      THE LIBRARY NAME
      -

      -In Unix-like systems, the 16-bit library is called libpcre16, and can -normally be accesss by adding -lpcre16 to the command for linking an -application that uses PCRE. -

      -
      STRING TYPES
      -

      -In the 8-bit library, strings are passed to PCRE library functions as vectors -of bytes with the C type "char *". In the 16-bit library, strings are passed as -vectors of unsigned 16-bit quantities. The macro PCRE_UCHAR16 specifies an -appropriate data type, and PCRE_SPTR16 is defined as "const PCRE_UCHAR16 *". In -very many environments, "short int" is a 16-bit data type. When PCRE is built, -it defines PCRE_UCHAR16 as "unsigned short int", but checks that it really is a -16-bit data type. If it is not, the build fails with an error message telling -the maintainer to modify the definition appropriately. -

      -
      STRUCTURE TYPES
      -

      -The types of the opaque structures that are used for compiled 16-bit patterns -and JIT stacks are pcre16 and pcre16_jit_stack respectively. The -type of the user-accessible structure that is returned by pcre16_study() -is pcre16_extra, and the type of the structure that is used for passing -data to a callout function is pcre16_callout_block. These structures -contain the same fields, with the same names, as their 8-bit counterparts. The -only difference is that pointers to character strings are 16-bit instead of -8-bit types. -

      -
      16-BIT FUNCTIONS
      -

      -For every function in the 8-bit library there is a corresponding function in -the 16-bit library with a name that starts with pcre16_ instead of -pcre_. The prototypes are listed above. In addition, there is one extra -function, pcre16_utf16_to_host_byte_order(). This is a utility function -that converts a UTF-16 character string to host byte order if necessary. The -other 16-bit functions expect the strings they are passed to be in host byte -order. -

      -

      -The input and output arguments of -pcre16_utf16_to_host_byte_order() may point to the same address, that is, -conversion in place is supported. The output buffer must be at least as long as -the input. -

      -

      -The length argument specifies the number of 16-bit data units in the -input string; a negative value specifies a zero-terminated string. -

      -

      -If byte_order is NULL, it is assumed that the string starts off in host -byte order. This may be changed by byte-order marks (BOMs) anywhere in the -string (commonly as the first character). -

      -

      -If byte_order is not NULL, a non-zero value of the integer to which it -points means that the input starts off in host byte order, otherwise the -opposite order is assumed. Again, BOMs in the string can change this. The final -byte order is passed back at the end of processing. -

      -

      -If keep_boms is not zero, byte-order mark characters (0xfeff) are copied -into the output string. Otherwise they are discarded. -

      -

      -The result of the function is the number of 16-bit units placed into the output -buffer, including the zero terminator if the string was zero-terminated. -

      -
      SUBJECT STRING OFFSETS
      -

      -The lengths and starting offsets of subject strings must be specified in 16-bit -data units, and the offsets within subject strings that are returned by the -matching functions are in also 16-bit units rather than bytes. -

      -
      NAMED SUBPATTERNS
      -

      -The name-to-number translation table that is maintained for named subpatterns -uses 16-bit characters. The pcre16_get_stringtable_entries() function -returns the length of each entry in the table as the number of 16-bit data -units. -

      -
      OPTION NAMES
      -

      -There are two new general option names, PCRE_UTF16 and PCRE_NO_UTF16_CHECK, -which correspond to PCRE_UTF8 and PCRE_NO_UTF8_CHECK in the 8-bit library. In -fact, these new options define the same bits in the options word. There is a -discussion about the -validity of UTF-16 strings -in the -pcreunicode -page. -

      -

      -For the pcre16_config() function there is an option PCRE_CONFIG_UTF16 -that returns 1 if UTF-16 support is configured, otherwise 0. If this option is -given to pcre_config() or pcre32_config(), or if the -PCRE_CONFIG_UTF8 or PCRE_CONFIG_UTF32 option is given to pcre16_config(), -the result is the PCRE_ERROR_BADOPTION error. -

      -
      CHARACTER CODES
      -

      -In 16-bit mode, when PCRE_UTF16 is not set, character values are treated in the -same way as in 8-bit, non UTF-8 mode, except, of course, that they can range -from 0 to 0xffff instead of 0 to 0xff. Character types for characters less than -0xff can therefore be influenced by the locale in the same way as before. -Characters greater than 0xff have only one case, and no "type" (such as letter -or digit). -

      -

      -In UTF-16 mode, the character code is Unicode, in the range 0 to 0x10ffff, with -the exception of values in the range 0xd800 to 0xdfff because those are -"surrogate" values that are used in pairs to encode values greater than 0xffff. -

      -

      -A UTF-16 string can indicate its endianness by special code knows as a -byte-order mark (BOM). The PCRE functions do not handle this, expecting strings -to be in host byte order. A utility function called -pcre16_utf16_to_host_byte_order() is provided to help with this (see -above). -

      -
      ERROR NAMES
      -

      -The errors PCRE_ERROR_BADUTF16_OFFSET and PCRE_ERROR_SHORTUTF16 correspond to -their 8-bit counterparts. The error PCRE_ERROR_BADMODE is given when a compiled -pattern is passed to a function that processes patterns in the other -mode, for example, if a pattern compiled with pcre_compile() is passed to -pcre16_exec(). -

      -

      -There are new error codes whose names begin with PCRE_UTF16_ERR for invalid -UTF-16 strings, corresponding to the PCRE_UTF8_ERR codes for UTF-8 strings that -are described in the section entitled -"Reason codes for invalid UTF-8 strings" -in the main -pcreapi -page. The UTF-16 errors are: -

      -  PCRE_UTF16_ERR1  Missing low surrogate at end of string
      -  PCRE_UTF16_ERR2  Invalid low surrogate follows high surrogate
      -  PCRE_UTF16_ERR3  Isolated low surrogate
      -  PCRE_UTF16_ERR4  Non-character
      -
      -

      -
      ERROR TEXTS
      -

      -If there is an error while compiling a pattern, the error text that is passed -back by pcre16_compile() or pcre16_compile2() is still an 8-bit -character string, zero-terminated. -

      -
      CALLOUTS
      -

      -The subject and mark fields in the callout block that is passed to -a callout function point to 16-bit vectors. -

      -
      TESTING
      -

      -The pcretest program continues to operate with 8-bit input and output -files, but it can be used for testing the 16-bit library. If it is run with the -command line option -16, patterns and subject strings are converted from -8-bit to 16-bit before being passed to PCRE, and the 16-bit library functions -are used instead of the 8-bit ones. Returned 16-bit strings are converted to -8-bit for output. If both the 8-bit and the 32-bit libraries were not compiled, -pcretest defaults to 16-bit and the -16 option is ignored. -

      -

      -When PCRE is being built, the RunTest script that is called by "make -check" uses the pcretest -C option to discover which of the 8-bit, -16-bit and 32-bit libraries has been built, and runs the tests appropriately. -

      -
      NOT SUPPORTED IN 16-BIT MODE
      -

      -Not all the features of the 8-bit library are available with the 16-bit -library. The C++ and POSIX wrapper functions support only the 8-bit library, -and the pcregrep program is at present 8-bit only. -

      -
      AUTHOR
      -

      -Philip Hazel -
      -University Computing Service -
      -Cambridge CB2 3QH, England. -
      -

      -
      REVISION
      -

      -Last updated: 12 May 2013 -
      -Copyright © 1997-2013 University of Cambridge. -
      -

      -Return to the PCRE index page. -

      diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcre32.html b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcre32.html deleted file mode 100644 index f96876e7..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcre32.html +++ /dev/null @@ -1,382 +0,0 @@ - - -pcre32 specification - - -

      pcre32 man page

      -

      -Return to the PCRE index page. -

      -

      -This page is part of the PCRE HTML documentation. It was generated automatically -from the original man page. If there is any nonsense in it, please consult the -man page, in case the conversion went wrong. -
      -

      -

      -#include <pcre.h> -

      -
      PCRE 32-BIT API BASIC FUNCTIONS
      -

      -pcre32 *pcre32_compile(PCRE_SPTR32 pattern, int options, - const char **errptr, int *erroffset, - const unsigned char *tableptr); -
      -
      -pcre32 *pcre32_compile2(PCRE_SPTR32 pattern, int options, - int *errorcodeptr, - const unsigned char *tableptr); -
      -
      -pcre32_extra *pcre32_study(const pcre32 *code, int options, - const char **errptr); -
      -
      -void pcre32_free_study(pcre32_extra *extra); -
      -
      -int pcre32_exec(const pcre32 *code, const pcre32_extra *extra, - PCRE_SPTR32 subject, int length, int startoffset, - int options, int *ovector, int ovecsize); -
      -
      -int pcre32_dfa_exec(const pcre32 *code, const pcre32_extra *extra, - PCRE_SPTR32 subject, int length, int startoffset, - int options, int *ovector, int ovecsize, - int *workspace, int wscount); -

      -
      PCRE 32-BIT API STRING EXTRACTION FUNCTIONS
      -

      -int pcre32_copy_named_substring(const pcre32 *code, - PCRE_SPTR32 subject, int *ovector, - int stringcount, PCRE_SPTR32 stringname, - PCRE_UCHAR32 *buffer, int buffersize); -
      -
      -int pcre32_copy_substring(PCRE_SPTR32 subject, int *ovector, - int stringcount, int stringnumber, PCRE_UCHAR32 *buffer, - int buffersize); -
      -
      -int pcre32_get_named_substring(const pcre32 *code, - PCRE_SPTR32 subject, int *ovector, - int stringcount, PCRE_SPTR32 stringname, - PCRE_SPTR32 *stringptr); -
      -
      -int pcre32_get_stringnumber(const pcre32 *code, - PCRE_SPTR32 name); -
      -
      -int pcre32_get_stringtable_entries(const pcre32 *code, - PCRE_SPTR32 name, PCRE_UCHAR32 **first, PCRE_UCHAR32 **last); -
      -
      -int pcre32_get_substring(PCRE_SPTR32 subject, int *ovector, - int stringcount, int stringnumber, - PCRE_SPTR32 *stringptr); -
      -
      -int pcre32_get_substring_list(PCRE_SPTR32 subject, - int *ovector, int stringcount, PCRE_SPTR32 **listptr); -
      -
      -void pcre32_free_substring(PCRE_SPTR32 stringptr); -
      -
      -void pcre32_free_substring_list(PCRE_SPTR32 *stringptr); -

      -
      PCRE 32-BIT API AUXILIARY FUNCTIONS
      -

      -pcre32_jit_stack *pcre32_jit_stack_alloc(int startsize, int maxsize); -
      -
      -void pcre32_jit_stack_free(pcre32_jit_stack *stack); -
      -
      -void pcre32_assign_jit_stack(pcre32_extra *extra, - pcre32_jit_callback callback, void *data); -
      -
      -const unsigned char *pcre32_maketables(void); -
      -
      -int pcre32_fullinfo(const pcre32 *code, const pcre32_extra *extra, - int what, void *where); -
      -
      -int pcre32_refcount(pcre32 *code, int adjust); -
      -
      -int pcre32_config(int what, void *where); -
      -
      -const char *pcre32_version(void); -
      -
      -int pcre32_pattern_to_host_byte_order(pcre32 *code, - pcre32_extra *extra, const unsigned char *tables); -

      -
      PCRE 32-BIT API INDIRECTED FUNCTIONS
      -

      -void *(*pcre32_malloc)(size_t); -
      -
      -void (*pcre32_free)(void *); -
      -
      -void *(*pcre32_stack_malloc)(size_t); -
      -
      -void (*pcre32_stack_free)(void *); -
      -
      -int (*pcre32_callout)(pcre32_callout_block *); -

      -
      PCRE 32-BIT API 32-BIT-ONLY FUNCTION
      -

      -int pcre32_utf32_to_host_byte_order(PCRE_UCHAR32 *output, - PCRE_SPTR32 input, int length, int *byte_order, - int keep_boms); -

      -
      THE PCRE 32-BIT LIBRARY
      -

      -Starting with release 8.32, it is possible to compile a PCRE library that -supports 32-bit character strings, including UTF-32 strings, as well as or -instead of the original 8-bit library. This work was done by Christian Persch, -based on the work done by Zoltan Herczeg for the 16-bit library. All three -libraries contain identical sets of functions, used in exactly the same way. -Only the names of the functions and the data types of their arguments and -results are different. To avoid over-complication and reduce the documentation -maintenance load, most of the PCRE documentation describes the 8-bit library, -with only occasional references to the 16-bit and 32-bit libraries. This page -describes what is different when you use the 32-bit library. -

      -

      -WARNING: A single application can be linked with all or any of the three -libraries, but you must take care when processing any particular pattern -to use functions from just one library. For example, if you want to study -a pattern that was compiled with pcre32_compile(), you must do so -with pcre32_study(), not pcre_study(), and you must free the -study data with pcre32_free_study(). -

      -
      THE HEADER FILE
      -

      -There is only one header file, pcre.h. It contains prototypes for all the -functions in all libraries, as well as definitions of flags, structures, error -codes, etc. -

      -
      THE LIBRARY NAME
      -

      -In Unix-like systems, the 32-bit library is called libpcre32, and can -normally be accesss by adding -lpcre32 to the command for linking an -application that uses PCRE. -

      -
      STRING TYPES
      -

      -In the 8-bit library, strings are passed to PCRE library functions as vectors -of bytes with the C type "char *". In the 32-bit library, strings are passed as -vectors of unsigned 32-bit quantities. The macro PCRE_UCHAR32 specifies an -appropriate data type, and PCRE_SPTR32 is defined as "const PCRE_UCHAR32 *". In -very many environments, "unsigned int" is a 32-bit data type. When PCRE is -built, it defines PCRE_UCHAR32 as "unsigned int", but checks that it really is -a 32-bit data type. If it is not, the build fails with an error message telling -the maintainer to modify the definition appropriately. -

      -
      STRUCTURE TYPES
      -

      -The types of the opaque structures that are used for compiled 32-bit patterns -and JIT stacks are pcre32 and pcre32_jit_stack respectively. The -type of the user-accessible structure that is returned by pcre32_study() -is pcre32_extra, and the type of the structure that is used for passing -data to a callout function is pcre32_callout_block. These structures -contain the same fields, with the same names, as their 8-bit counterparts. The -only difference is that pointers to character strings are 32-bit instead of -8-bit types. -

      -
      32-BIT FUNCTIONS
      -

      -For every function in the 8-bit library there is a corresponding function in -the 32-bit library with a name that starts with pcre32_ instead of -pcre_. The prototypes are listed above. In addition, there is one extra -function, pcre32_utf32_to_host_byte_order(). This is a utility function -that converts a UTF-32 character string to host byte order if necessary. The -other 32-bit functions expect the strings they are passed to be in host byte -order. -

      -

      -The input and output arguments of -pcre32_utf32_to_host_byte_order() may point to the same address, that is, -conversion in place is supported. The output buffer must be at least as long as -the input. -

      -

      -The length argument specifies the number of 32-bit data units in the -input string; a negative value specifies a zero-terminated string. -

      -

      -If byte_order is NULL, it is assumed that the string starts off in host -byte order. This may be changed by byte-order marks (BOMs) anywhere in the -string (commonly as the first character). -

      -

      -If byte_order is not NULL, a non-zero value of the integer to which it -points means that the input starts off in host byte order, otherwise the -opposite order is assumed. Again, BOMs in the string can change this. The final -byte order is passed back at the end of processing. -

      -

      -If keep_boms is not zero, byte-order mark characters (0xfeff) are copied -into the output string. Otherwise they are discarded. -

      -

      -The result of the function is the number of 32-bit units placed into the output -buffer, including the zero terminator if the string was zero-terminated. -

      -
      SUBJECT STRING OFFSETS
      -

      -The lengths and starting offsets of subject strings must be specified in 32-bit -data units, and the offsets within subject strings that are returned by the -matching functions are in also 32-bit units rather than bytes. -

      -
      NAMED SUBPATTERNS
      -

      -The name-to-number translation table that is maintained for named subpatterns -uses 32-bit characters. The pcre32_get_stringtable_entries() function -returns the length of each entry in the table as the number of 32-bit data -units. -

      -
      OPTION NAMES
      -

      -There are two new general option names, PCRE_UTF32 and PCRE_NO_UTF32_CHECK, -which correspond to PCRE_UTF8 and PCRE_NO_UTF8_CHECK in the 8-bit library. In -fact, these new options define the same bits in the options word. There is a -discussion about the -validity of UTF-32 strings -in the -pcreunicode -page. -

      -

      -For the pcre32_config() function there is an option PCRE_CONFIG_UTF32 -that returns 1 if UTF-32 support is configured, otherwise 0. If this option is -given to pcre_config() or pcre16_config(), or if the -PCRE_CONFIG_UTF8 or PCRE_CONFIG_UTF16 option is given to pcre32_config(), -the result is the PCRE_ERROR_BADOPTION error. -

      -
      CHARACTER CODES
      -

      -In 32-bit mode, when PCRE_UTF32 is not set, character values are treated in the -same way as in 8-bit, non UTF-8 mode, except, of course, that they can range -from 0 to 0x7fffffff instead of 0 to 0xff. Character types for characters less -than 0xff can therefore be influenced by the locale in the same way as before. -Characters greater than 0xff have only one case, and no "type" (such as letter -or digit). -

      -

      -In UTF-32 mode, the character code is Unicode, in the range 0 to 0x10ffff, with -the exception of values in the range 0xd800 to 0xdfff because those are -"surrogate" values that are ill-formed in UTF-32. -

      -

      -A UTF-32 string can indicate its endianness by special code knows as a -byte-order mark (BOM). The PCRE functions do not handle this, expecting strings -to be in host byte order. A utility function called -pcre32_utf32_to_host_byte_order() is provided to help with this (see -above). -

      -
      ERROR NAMES
      -

      -The error PCRE_ERROR_BADUTF32 corresponds to its 8-bit counterpart. -The error PCRE_ERROR_BADMODE is given when a compiled -pattern is passed to a function that processes patterns in the other -mode, for example, if a pattern compiled with pcre_compile() is passed to -pcre32_exec(). -

      -

      -There are new error codes whose names begin with PCRE_UTF32_ERR for invalid -UTF-32 strings, corresponding to the PCRE_UTF8_ERR codes for UTF-8 strings that -are described in the section entitled -"Reason codes for invalid UTF-8 strings" -in the main -pcreapi -page. The UTF-32 errors are: -

      -  PCRE_UTF32_ERR1  Surrogate character (range from 0xd800 to 0xdfff)
      -  PCRE_UTF32_ERR2  Non-character
      -  PCRE_UTF32_ERR3  Character > 0x10ffff
      -
      -

      -
      ERROR TEXTS
      -

      -If there is an error while compiling a pattern, the error text that is passed -back by pcre32_compile() or pcre32_compile2() is still an 8-bit -character string, zero-terminated. -

      -
      CALLOUTS
      -

      -The subject and mark fields in the callout block that is passed to -a callout function point to 32-bit vectors. -

      -
      TESTING
      -

      -The pcretest program continues to operate with 8-bit input and output -files, but it can be used for testing the 32-bit library. If it is run with the -command line option -32, patterns and subject strings are converted from -8-bit to 32-bit before being passed to PCRE, and the 32-bit library functions -are used instead of the 8-bit ones. Returned 32-bit strings are converted to -8-bit for output. If both the 8-bit and the 16-bit libraries were not compiled, -pcretest defaults to 32-bit and the -32 option is ignored. -

      -

      -When PCRE is being built, the RunTest script that is called by "make -check" uses the pcretest -C option to discover which of the 8-bit, -16-bit and 32-bit libraries has been built, and runs the tests appropriately. -

      -
      NOT SUPPORTED IN 32-BIT MODE
      -

      -Not all the features of the 8-bit library are available with the 32-bit -library. The C++ and POSIX wrapper functions support only the 8-bit library, -and the pcregrep program is at present 8-bit only. -

      -
      AUTHOR
      -

      -Philip Hazel -
      -University Computing Service -
      -Cambridge CB2 3QH, England. -
      -

      -
      REVISION
      -

      -Last updated: 12 May 2013 -
      -Copyright © 1997-2013 University of Cambridge. -
      -

      -Return to the PCRE index page. -

      diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcre_assign_jit_stack.html b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcre_assign_jit_stack.html deleted file mode 100644 index b2eef704..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcre_assign_jit_stack.html +++ /dev/null @@ -1,76 +0,0 @@ - - -pcre_assign_jit_stack specification - - -

      pcre_assign_jit_stack man page

      -

      -Return to the PCRE index page. -

      -

      -This page is part of the PCRE HTML documentation. It was generated automatically -from the original man page. If there is any nonsense in it, please consult the -man page, in case the conversion went wrong. -
      -
      -SYNOPSIS -
      -

      -#include <pcre.h> -

      -

      -void pcre_assign_jit_stack(pcre_extra *extra, - pcre_jit_callback callback, void *data); -
      -
      -void pcre16_assign_jit_stack(pcre16_extra *extra, - pcre16_jit_callback callback, void *data); -
      -
      -void pcre32_assign_jit_stack(pcre32_extra *extra, - pcre32_jit_callback callback, void *data); -

      -
      -DESCRIPTION -
      -

      -This function provides control over the memory used as a stack at run-time by a -call to pcre[16|32]_exec() with a pattern that has been successfully -compiled with JIT optimization. The arguments are: -

      -  extra     the data pointer returned by pcre[16|32]_study()
      -  callback  a callback function
      -  data      a JIT stack or a value to be passed to the callback
      -              function
      -
      -

      -

      -If callback is NULL and data is NULL, an internal 32K block on -the machine stack is used. -

      -

      -If callback is NULL and data is not NULL, data must -be a valid JIT stack, the result of calling pcre[16|32]_jit_stack_alloc(). -

      -

      -If callback not NULL, it is called with data as an argument at -the start of matching, in order to set up a JIT stack. If the result is NULL, -the internal 32K stack is used; otherwise the return value must be a valid JIT -stack, the result of calling pcre[16|32]_jit_stack_alloc(). -

      -

      -You may safely assign the same JIT stack to multiple patterns, as long as they -are all matched in the same thread. In a multithread application, each thread -must use its own JIT stack. For more details, see the -pcrejit -page. -

      -

      -There is a complete description of the PCRE native API in the -pcreapi -page and a description of the POSIX API in the -pcreposix -page. -

      -Return to the PCRE index page. -

      diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcre_compile.html b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcre_compile.html deleted file mode 100644 index 95b4bec6..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcre_compile.html +++ /dev/null @@ -1,111 +0,0 @@ - - -pcre_compile specification - - -

      pcre_compile man page

      -

      -Return to the PCRE index page. -

      -

      -This page is part of the PCRE HTML documentation. It was generated automatically -from the original man page. If there is any nonsense in it, please consult the -man page, in case the conversion went wrong. -
      -
      -SYNOPSIS -
      -

      -#include <pcre.h> -

      -

      -pcre *pcre_compile(const char *pattern, int options, - const char **errptr, int *erroffset, - const unsigned char *tableptr); -
      -
      -pcre16 *pcre16_compile(PCRE_SPTR16 pattern, int options, - const char **errptr, int *erroffset, - const unsigned char *tableptr); -
      -
      -pcre32 *pcre32_compile(PCRE_SPTR32 pattern, int options, - const char **errptr, int *erroffset, - const unsigned char *tableptr); -

      -
      -DESCRIPTION -
      -

      -This function compiles a regular expression into an internal form. It is the -same as pcre[16|32]_compile2(), except for the absence of the -errorcodeptr argument. Its arguments are: -

      -  pattern       A zero-terminated string containing the
      -                  regular expression to be compiled
      -  options       Zero or more option bits
      -  errptr        Where to put an error message
      -  erroffset     Offset in pattern where error was found
      -  tableptr      Pointer to character tables, or NULL to
      -                  use the built-in default
      -
      -The option bits are: -
      -  PCRE_ANCHORED           Force pattern anchoring
      -  PCRE_AUTO_CALLOUT       Compile automatic callouts
      -  PCRE_BSR_ANYCRLF        \R matches only CR, LF, or CRLF
      -  PCRE_BSR_UNICODE        \R matches all Unicode line endings
      -  PCRE_CASELESS           Do caseless matching
      -  PCRE_DOLLAR_ENDONLY     $ not to match newline at end
      -  PCRE_DOTALL             . matches anything including NL
      -  PCRE_DUPNAMES           Allow duplicate names for subpatterns
      -  PCRE_EXTENDED           Ignore white space and # comments
      -  PCRE_EXTRA              PCRE extra features
      -                            (not much use currently)
      -  PCRE_FIRSTLINE          Force matching to be before newline
      -  PCRE_JAVASCRIPT_COMPAT  JavaScript compatibility
      -  PCRE_MULTILINE          ^ and $ match newlines within data
      -  PCRE_NEVER_UTF          Lock out UTF, e.g. via (*UTF)
      -  PCRE_NEWLINE_ANY        Recognize any Unicode newline sequence
      -  PCRE_NEWLINE_ANYCRLF    Recognize CR, LF, and CRLF as newline
      -                            sequences
      -  PCRE_NEWLINE_CR         Set CR as the newline sequence
      -  PCRE_NEWLINE_CRLF       Set CRLF as the newline sequence
      -  PCRE_NEWLINE_LF         Set LF as the newline sequence
      -  PCRE_NO_AUTO_CAPTURE    Disable numbered capturing paren-
      -                            theses (named ones available)
      -  PCRE_NO_AUTO_POSSESS    Disable auto-possessification
      -  PCRE_NO_START_OPTIMIZE  Disable match-time start optimizations
      -  PCRE_NO_UTF16_CHECK     Do not check the pattern for UTF-16
      -                            validity (only relevant if
      -                            PCRE_UTF16 is set)
      -  PCRE_NO_UTF32_CHECK     Do not check the pattern for UTF-32
      -                            validity (only relevant if
      -                            PCRE_UTF32 is set)
      -  PCRE_NO_UTF8_CHECK      Do not check the pattern for UTF-8
      -                            validity (only relevant if
      -                            PCRE_UTF8 is set)
      -  PCRE_UCP                Use Unicode properties for \d, \w, etc.
      -  PCRE_UNGREEDY           Invert greediness of quantifiers
      -  PCRE_UTF16              Run in pcre16_compile() UTF-16 mode
      -  PCRE_UTF32              Run in pcre32_compile() UTF-32 mode
      -  PCRE_UTF8               Run in pcre_compile() UTF-8 mode
      -
      -PCRE must be built with UTF support in order to use PCRE_UTF8/16/32 and -PCRE_NO_UTF8/16/32_CHECK, and with UCP support if PCRE_UCP is used. -

      -

      -The yield of the function is a pointer to a private data structure that -contains the compiled pattern, or NULL if an error was detected. Note that -compiling regular expressions with one version of PCRE for use with a different -version is not guaranteed to work and may cause crashes. -

      -

      -There is a complete description of the PCRE native API in the -pcreapi -page and a description of the POSIX API in the -pcreposix -page. -

      -Return to the PCRE index page. -

      diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcre_compile2.html b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcre_compile2.html deleted file mode 100644 index 9cd56a23..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcre_compile2.html +++ /dev/null @@ -1,115 +0,0 @@ - - -pcre_compile2 specification - - -

      pcre_compile2 man page

      -

      -Return to the PCRE index page. -

      -

      -This page is part of the PCRE HTML documentation. It was generated automatically -from the original man page. If there is any nonsense in it, please consult the -man page, in case the conversion went wrong. -
      -
      -SYNOPSIS -
      -

      -#include <pcre.h> -

      -

      -pcre *pcre_compile2(const char *pattern, int options, - int *errorcodeptr, - const char **errptr, int *erroffset, - const unsigned char *tableptr); -
      -
      -pcre16 *pcre16_compile2(PCRE_SPTR16 pattern, int options, - int *errorcodeptr, - const char **errptr, int *erroffset, - const unsigned char *tableptr); -
      -
      -pcre32 *pcre32_compile2(PCRE_SPTR32 pattern, int options, -" int *errorcodeptr,£ - const char **errptr, int *erroffset, - const unsigned char *tableptr); -

      -
      -DESCRIPTION -
      -

      -This function compiles a regular expression into an internal form. It is the -same as pcre[16|32]_compile(), except for the addition of the -errorcodeptr argument. The arguments are: -

      -  pattern       A zero-terminated string containing the
      -                  regular expression to be compiled
      -  options       Zero or more option bits
      -  errorcodeptr  Where to put an error code
      -  errptr        Where to put an error message
      -  erroffset     Offset in pattern where error was found
      -  tableptr      Pointer to character tables, or NULL to
      -                  use the built-in default
      -
      -The option bits are: -
      -  PCRE_ANCHORED           Force pattern anchoring
      -  PCRE_AUTO_CALLOUT       Compile automatic callouts
      -  PCRE_BSR_ANYCRLF        \R matches only CR, LF, or CRLF
      -  PCRE_BSR_UNICODE        \R matches all Unicode line endings
      -  PCRE_CASELESS           Do caseless matching
      -  PCRE_DOLLAR_ENDONLY     $ not to match newline at end
      -  PCRE_DOTALL             . matches anything including NL
      -  PCRE_DUPNAMES           Allow duplicate names for subpatterns
      -  PCRE_EXTENDED           Ignore white space and # comments
      -  PCRE_EXTRA              PCRE extra features
      -                            (not much use currently)
      -  PCRE_FIRSTLINE          Force matching to be before newline
      -  PCRE_JAVASCRIPT_COMPAT  JavaScript compatibility
      -  PCRE_MULTILINE          ^ and $ match newlines within data
      -  PCRE_NEVER_UTF          Lock out UTF, e.g. via (*UTF)
      -  PCRE_NEWLINE_ANY        Recognize any Unicode newline sequence
      -  PCRE_NEWLINE_ANYCRLF    Recognize CR, LF, and CRLF as newline
      -                            sequences
      -  PCRE_NEWLINE_CR         Set CR as the newline sequence
      -  PCRE_NEWLINE_CRLF       Set CRLF as the newline sequence
      -  PCRE_NEWLINE_LF         Set LF as the newline sequence
      -  PCRE_NO_AUTO_CAPTURE    Disable numbered capturing paren-
      -                            theses (named ones available)
      -  PCRE_NO_AUTO_POSSESS    Disable auto-possessification
      -  PCRE_NO_START_OPTIMIZE  Disable match-time start optimizations
      -  PCRE_NO_UTF16_CHECK     Do not check the pattern for UTF-16
      -                            validity (only relevant if
      -                            PCRE_UTF16 is set)
      -  PCRE_NO_UTF32_CHECK     Do not check the pattern for UTF-32
      -                            validity (only relevant if
      -                            PCRE_UTF32 is set)
      -  PCRE_NO_UTF8_CHECK      Do not check the pattern for UTF-8
      -                            validity (only relevant if
      -                            PCRE_UTF8 is set)
      -  PCRE_UCP                Use Unicode properties for \d, \w, etc.
      -  PCRE_UNGREEDY           Invert greediness of quantifiers
      -  PCRE_UTF16              Run pcre16_compile() in UTF-16 mode
      -  PCRE_UTF32              Run pcre32_compile() in UTF-32 mode
      -  PCRE_UTF8               Run pcre_compile() in UTF-8 mode
      -
      -PCRE must be built with UTF support in order to use PCRE_UTF8/16/32 and -PCRE_NO_UTF8/16/32_CHECK, and with UCP support if PCRE_UCP is used. -

      -

      -The yield of the function is a pointer to a private data structure that -contains the compiled pattern, or NULL if an error was detected. Note that -compiling regular expressions with one version of PCRE for use with a different -version is not guaranteed to work and may cause crashes. -

      -

      -There is a complete description of the PCRE native API in the -pcreapi -page and a description of the POSIX API in the -pcreposix -page. -

      -Return to the PCRE index page. -

      diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcre_config.html b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcre_config.html deleted file mode 100644 index 72fb9caa..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcre_config.html +++ /dev/null @@ -1,94 +0,0 @@ - - -pcre_config specification - - -

      pcre_config man page

      -

      -Return to the PCRE index page. -

      -

      -This page is part of the PCRE HTML documentation. It was generated automatically -from the original man page. If there is any nonsense in it, please consult the -man page, in case the conversion went wrong. -
      -
      -SYNOPSIS -
      -

      -#include <pcre.h> -

      -

      -int pcre_config(int what, void *where); -

      -

      -int pcre16_config(int what, void *where); -

      -

      -int pcre32_config(int what, void *where); -

      -
      -DESCRIPTION -
      -

      -This function makes it possible for a client program to find out which optional -features are available in the version of the PCRE library it is using. The -arguments are as follows: -

      -  what     A code specifying what information is required
      -  where    Points to where to put the data
      -
      -The where argument must point to an integer variable, except for -PCRE_CONFIG_MATCH_LIMIT, PCRE_CONFIG_MATCH_LIMIT_RECURSION, and -PCRE_CONFIG_PARENS_LIMIT, when it must point to an unsigned long integer, -and for PCRE_CONFIG_JITTARGET, when it must point to a const char*. -The available codes are: -
      -  PCRE_CONFIG_JIT           Availability of just-in-time compiler
      -                              support (1=yes 0=no)
      -  PCRE_CONFIG_JITTARGET     String containing information about the
      -                              target architecture for the JIT compiler,
      -                              or NULL if there is no JIT support
      -  PCRE_CONFIG_LINK_SIZE     Internal link size: 2, 3, or 4
      -  PCRE_CONFIG_PARENS_LIMIT  Parentheses nesting limit
      -  PCRE_CONFIG_MATCH_LIMIT   Internal resource limit
      -  PCRE_CONFIG_MATCH_LIMIT_RECURSION
      -                            Internal recursion depth limit
      -  PCRE_CONFIG_NEWLINE       Value of the default newline sequence:
      -                                13 (0x000d)    for CR
      -                                10 (0x000a)    for LF
      -                              3338 (0x0d0a)    for CRLF
      -                                -2             for ANYCRLF
      -                                -1             for ANY
      -  PCRE_CONFIG_BSR           Indicates what \R matches by default:
      -                                 0             all Unicode line endings
      -                                 1             CR, LF, or CRLF only
      -  PCRE_CONFIG_POSIX_MALLOC_THRESHOLD
      -                            Threshold of return slots, above which
      -                              malloc() is used by the POSIX API
      -  PCRE_CONFIG_STACKRECURSE  Recursion implementation (1=stack 0=heap)
      -  PCRE_CONFIG_UTF16         Availability of UTF-16 support (1=yes
      -                               0=no); option for pcre16_config()
      -  PCRE_CONFIG_UTF32         Availability of UTF-32 support (1=yes
      -                               0=no); option for pcre32_config()
      -  PCRE_CONFIG_UTF8          Availability of UTF-8 support (1=yes 0=no);
      -                              option for pcre_config()
      -  PCRE_CONFIG_UNICODE_PROPERTIES
      -                            Availability of Unicode property support
      -                              (1=yes 0=no)
      -
      -The function yields 0 on success or PCRE_ERROR_BADOPTION otherwise. That error -is also given if PCRE_CONFIG_UTF16 or PCRE_CONFIG_UTF32 is passed to -pcre_config(), if PCRE_CONFIG_UTF8 or PCRE_CONFIG_UTF32 is passed to -pcre16_config(), or if PCRE_CONFIG_UTF8 or PCRE_CONFIG_UTF16 is passed to -pcre32_config(). -

      -

      -There is a complete description of the PCRE native API in the -pcreapi -page and a description of the POSIX API in the -pcreposix -page. -

      -Return to the PCRE index page. -

      diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcre_copy_named_substring.html b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcre_copy_named_substring.html deleted file mode 100644 index 77b48043..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcre_copy_named_substring.html +++ /dev/null @@ -1,65 +0,0 @@ - - -pcre_copy_named_substring specification - - -

      pcre_copy_named_substring man page

      -

      -Return to the PCRE index page. -

      -

      -This page is part of the PCRE HTML documentation. It was generated automatically -from the original man page. If there is any nonsense in it, please consult the -man page, in case the conversion went wrong. -
      -
      -SYNOPSIS -
      -

      -#include <pcre.h> -

      -

      -int pcre_copy_named_substring(const pcre *code, - const char *subject, int *ovector, - int stringcount, const char *stringname, - char *buffer, int buffersize); -
      -
      -int pcre16_copy_named_substring(const pcre16 *code, - PCRE_SPTR16 subject, int *ovector, - int stringcount, PCRE_SPTR16 stringname, - PCRE_UCHAR16 *buffer, int buffersize); -
      -
      -int pcre32_copy_named_substring(const pcre32 *code, - PCRE_SPTR32 subject, int *ovector, - int stringcount, PCRE_SPTR32 stringname, - PCRE_UCHAR32 *buffer, int buffersize); -

      -
      -DESCRIPTION -
      -

      -This is a convenience function for extracting a captured substring, identified -by name, into a given buffer. The arguments are: -

      -  code          Pattern that was successfully matched
      -  subject       Subject that has been successfully matched
      -  ovector       Offset vector that pcre[16|32]_exec() used
      -  stringcount   Value returned by pcre[16|32]_exec()
      -  stringname    Name of the required substring
      -  buffer        Buffer to receive the string
      -  buffersize    Size of buffer
      -
      -The yield is the length of the substring, PCRE_ERROR_NOMEMORY if the buffer was -too small, or PCRE_ERROR_NOSUBSTRING if the string name is invalid. -

      -

      -There is a complete description of the PCRE native API in the -pcreapi -page and a description of the POSIX API in the -pcreposix -page. -

      -Return to the PCRE index page. -

      diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcre_copy_substring.html b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcre_copy_substring.html deleted file mode 100644 index ecaebe85..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcre_copy_substring.html +++ /dev/null @@ -1,61 +0,0 @@ - - -pcre_copy_substring specification - - -

      pcre_copy_substring man page

      -

      -Return to the PCRE index page. -

      -

      -This page is part of the PCRE HTML documentation. It was generated automatically -from the original man page. If there is any nonsense in it, please consult the -man page, in case the conversion went wrong. -
      -
      -SYNOPSIS -
      -

      -#include <pcre.h> -

      -

      -int pcre_copy_substring(const char *subject, int *ovector, - int stringcount, int stringnumber, char *buffer, - int buffersize); -
      -
      -int pcre16_copy_substring(PCRE_SPTR16 subject, int *ovector, - int stringcount, int stringnumber, PCRE_UCHAR16 *buffer, - int buffersize); -
      -
      -int pcre32_copy_substring(PCRE_SPTR32 subject, int *ovector, - int stringcount, int stringnumber, PCRE_UCHAR32 *buffer, - int buffersize); -

      -
      -DESCRIPTION -
      -

      -This is a convenience function for extracting a captured substring into a given -buffer. The arguments are: -

      -  subject       Subject that has been successfully matched
      -  ovector       Offset vector that pcre[16|32]_exec() used
      -  stringcount   Value returned by pcre[16|32]_exec()
      -  stringnumber  Number of the required substring
      -  buffer        Buffer to receive the string
      -  buffersize    Size of buffer
      -
      -The yield is the length of the string, PCRE_ERROR_NOMEMORY if the buffer was -too small, or PCRE_ERROR_NOSUBSTRING if the string number is invalid. -

      -

      -There is a complete description of the PCRE native API in the -pcreapi -page and a description of the POSIX API in the -pcreposix -page. -

      -Return to the PCRE index page. -

      diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcre_dfa_exec.html b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcre_dfa_exec.html deleted file mode 100644 index 5fff6a7e..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcre_dfa_exec.html +++ /dev/null @@ -1,129 +0,0 @@ - - -pcre_dfa_exec specification - - -

      pcre_dfa_exec man page

      -

      -Return to the PCRE index page. -

      -

      -This page is part of the PCRE HTML documentation. It was generated automatically -from the original man page. If there is any nonsense in it, please consult the -man page, in case the conversion went wrong. -
      -
      -SYNOPSIS -
      -

      -#include <pcre.h> -

      -

      -int pcre_dfa_exec(const pcre *code, const pcre_extra *extra, - const char *subject, int length, int startoffset, - int options, int *ovector, int ovecsize, - int *workspace, int wscount); -
      -
      -int pcre16_dfa_exec(const pcre16 *code, const pcre16_extra *extra, - PCRE_SPTR16 subject, int length, int startoffset, - int options, int *ovector, int ovecsize, - int *workspace, int wscount); -
      -
      -int pcre32_dfa_exec(const pcre32 *code, const pcre32_extra *extra, - PCRE_SPTR32 subject, int length, int startoffset, - int options, int *ovector, int ovecsize, - int *workspace, int wscount); -

      -
      -DESCRIPTION -
      -

      -This function matches a compiled regular expression against a given subject -string, using an alternative matching algorithm that scans the subject string -just once (not Perl-compatible). Note that the main, Perl-compatible, -matching function is pcre[16|32]_exec(). The arguments for this function -are: -

      -  code         Points to the compiled pattern
      -  extra        Points to an associated pcre[16|32]_extra structure,
      -                 or is NULL
      -  subject      Points to the subject string
      -  length       Length of the subject string
      -  startoffset  Offset in the subject at which to start matching
      -  options      Option bits
      -  ovector      Points to a vector of ints for result offsets
      -  ovecsize     Number of elements in the vector
      -  workspace    Points to a vector of ints used as working space
      -  wscount      Number of elements in the vector
      -
      -The units for length and startoffset are bytes for -pcre_exec(), 16-bit data items for pcre16_exec(), and 32-bit items -for pcre32_exec(). The options are: -
      -  PCRE_ANCHORED          Match only at the first position
      -  PCRE_BSR_ANYCRLF       \R matches only CR, LF, or CRLF
      -  PCRE_BSR_UNICODE       \R matches all Unicode line endings
      -  PCRE_NEWLINE_ANY       Recognize any Unicode newline sequence
      -  PCRE_NEWLINE_ANYCRLF   Recognize CR, LF, & CRLF as newline sequences
      -  PCRE_NEWLINE_CR        Recognize CR as the only newline sequence
      -  PCRE_NEWLINE_CRLF      Recognize CRLF as the only newline sequence
      -  PCRE_NEWLINE_LF        Recognize LF as the only newline sequence
      -  PCRE_NOTBOL            Subject is not the beginning of a line
      -  PCRE_NOTEOL            Subject is not the end of a line
      -  PCRE_NOTEMPTY          An empty string is not a valid match
      -  PCRE_NOTEMPTY_ATSTART  An empty string at the start of the subject
      -                           is not a valid match
      -  PCRE_NO_START_OPTIMIZE Do not do "start-match" optimizations
      -  PCRE_NO_UTF16_CHECK    Do not check the subject for UTF-16
      -                           validity (only relevant if PCRE_UTF16
      -                           was set at compile time)
      -  PCRE_NO_UTF32_CHECK    Do not check the subject for UTF-32
      -                           validity (only relevant if PCRE_UTF32
      -                           was set at compile time)
      -  PCRE_NO_UTF8_CHECK     Do not check the subject for UTF-8
      -                           validity (only relevant if PCRE_UTF8
      -                           was set at compile time)
      -  PCRE_PARTIAL           ) Return PCRE_ERROR_PARTIAL for a partial
      -  PCRE_PARTIAL_SOFT      )   match if no full matches are found
      -  PCRE_PARTIAL_HARD      Return PCRE_ERROR_PARTIAL for a partial match
      -                           even if there is a full match as well
      -  PCRE_DFA_SHORTEST      Return only the shortest match
      -  PCRE_DFA_RESTART       Restart after a partial match
      -
      -There are restrictions on what may appear in a pattern when using this matching -function. Details are given in the -pcrematching -documentation. For details of partial matching, see the -pcrepartial -page. -

      -

      -A pcre[16|32]_extra structure contains the following fields: -

      -  flags            Bits indicating which fields are set
      -  study_data       Opaque data from pcre[16|32]_study()
      -  match_limit      Limit on internal resource use
      -  match_limit_recursion  Limit on internal recursion depth
      -  callout_data     Opaque data passed back to callouts
      -  tables           Points to character tables or is NULL
      -  mark             For passing back a *MARK pointer
      -  executable_jit   Opaque data from JIT compilation
      -
      -The flag bits are PCRE_EXTRA_STUDY_DATA, PCRE_EXTRA_MATCH_LIMIT, -PCRE_EXTRA_MATCH_LIMIT_RECURSION, PCRE_EXTRA_CALLOUT_DATA, -PCRE_EXTRA_TABLES, PCRE_EXTRA_MARK and PCRE_EXTRA_EXECUTABLE_JIT. For this -matching function, the match_limit and match_limit_recursion fields -are not used, and must not be set. The PCRE_EXTRA_EXECUTABLE_JIT flag and -the corresponding variable are ignored. -

      -

      -There is a complete description of the PCRE native API in the -pcreapi -page and a description of the POSIX API in the -pcreposix -page. -

      -Return to the PCRE index page. -

      diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcre_exec.html b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcre_exec.html deleted file mode 100644 index 18e1a13f..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcre_exec.html +++ /dev/null @@ -1,111 +0,0 @@ - - -pcre_exec specification - - -

      pcre_exec man page

      -

      -Return to the PCRE index page. -

      -

      -This page is part of the PCRE HTML documentation. It was generated automatically -from the original man page. If there is any nonsense in it, please consult the -man page, in case the conversion went wrong. -
      -
      -SYNOPSIS -
      -

      -#include <pcre.h> -

      -

      -int pcre_exec(const pcre *code, const pcre_extra *extra, - const char *subject, int length, int startoffset, - int options, int *ovector, int ovecsize); -
      -
      -int pcre16_exec(const pcre16 *code, const pcre16_extra *extra, - PCRE_SPTR16 subject, int length, int startoffset, - int options, int *ovector, int ovecsize); -
      -
      -int pcre32_exec(const pcre32 *code, const pcre32_extra *extra, - PCRE_SPTR32 subject, int length, int startoffset, - int options, int *ovector, int ovecsize); -

      -
      -DESCRIPTION -
      -

      -This function matches a compiled regular expression against a given subject -string, using a matching algorithm that is similar to Perl's. It returns -offsets to captured substrings. Its arguments are: -

      -  code         Points to the compiled pattern
      -  extra        Points to an associated pcre[16|32]_extra structure,
      -                 or is NULL
      -  subject      Points to the subject string
      -  length       Length of the subject string
      -  startoffset  Offset in the subject at which to start matching
      -  options      Option bits
      -  ovector      Points to a vector of ints for result offsets
      -  ovecsize     Number of elements in the vector (a multiple of 3)
      -
      -The units for length and startoffset are bytes for -pcre_exec(), 16-bit data items for pcre16_exec(), and 32-bit items -for pcre32_exec(). The options are: -
      -  PCRE_ANCHORED          Match only at the first position
      -  PCRE_BSR_ANYCRLF       \R matches only CR, LF, or CRLF
      -  PCRE_BSR_UNICODE       \R matches all Unicode line endings
      -  PCRE_NEWLINE_ANY       Recognize any Unicode newline sequence
      -  PCRE_NEWLINE_ANYCRLF   Recognize CR, LF, & CRLF as newline sequences
      -  PCRE_NEWLINE_CR        Recognize CR as the only newline sequence
      -  PCRE_NEWLINE_CRLF      Recognize CRLF as the only newline sequence
      -  PCRE_NEWLINE_LF        Recognize LF as the only newline sequence
      -  PCRE_NOTBOL            Subject string is not the beginning of a line
      -  PCRE_NOTEOL            Subject string is not the end of a line
      -  PCRE_NOTEMPTY          An empty string is not a valid match
      -  PCRE_NOTEMPTY_ATSTART  An empty string at the start of the subject
      -                           is not a valid match
      -  PCRE_NO_START_OPTIMIZE Do not do "start-match" optimizations
      -  PCRE_NO_UTF16_CHECK    Do not check the subject for UTF-16
      -                           validity (only relevant if PCRE_UTF16
      -                           was set at compile time)
      -  PCRE_NO_UTF32_CHECK    Do not check the subject for UTF-32
      -                           validity (only relevant if PCRE_UTF32
      -                           was set at compile time)
      -  PCRE_NO_UTF8_CHECK     Do not check the subject for UTF-8
      -                           validity (only relevant if PCRE_UTF8
      -                           was set at compile time)
      -  PCRE_PARTIAL           ) Return PCRE_ERROR_PARTIAL for a partial
      -  PCRE_PARTIAL_SOFT      )   match if no full matches are found
      -  PCRE_PARTIAL_HARD      Return PCRE_ERROR_PARTIAL for a partial match
      -                           if that is found before a full match
      -
      -For details of partial matching, see the -pcrepartial -page. A pcre_extra structure contains the following fields: -
      -  flags            Bits indicating which fields are set
      -  study_data       Opaque data from pcre[16|32]_study()
      -  match_limit      Limit on internal resource use
      -  match_limit_recursion  Limit on internal recursion depth
      -  callout_data     Opaque data passed back to callouts
      -  tables           Points to character tables or is NULL
      -  mark             For passing back a *MARK pointer
      -  executable_jit   Opaque data from JIT compilation
      -
      -The flag bits are PCRE_EXTRA_STUDY_DATA, PCRE_EXTRA_MATCH_LIMIT, -PCRE_EXTRA_MATCH_LIMIT_RECURSION, PCRE_EXTRA_CALLOUT_DATA, -PCRE_EXTRA_TABLES, PCRE_EXTRA_MARK and PCRE_EXTRA_EXECUTABLE_JIT. -

      -

      -There is a complete description of the PCRE native API in the -pcreapi -page and a description of the POSIX API in the -pcreposix -page. -

      -Return to the PCRE index page. -

      diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcre_free_study.html b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcre_free_study.html deleted file mode 100644 index 7f9e10e8..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcre_free_study.html +++ /dev/null @@ -1,46 +0,0 @@ - - -pcre_free_study specification - - -

      pcre_free_study man page

      -

      -Return to the PCRE index page. -

      -

      -This page is part of the PCRE HTML documentation. It was generated automatically -from the original man page. If there is any nonsense in it, please consult the -man page, in case the conversion went wrong. -
      -
      -SYNOPSIS -
      -

      -#include <pcre.h> -

      -

      -void pcre_free_study(pcre_extra *extra); -

      -

      -void pcre16_free_study(pcre16_extra *extra); -

      -

      -void pcre32_free_study(pcre32_extra *extra); -

      -
      -DESCRIPTION -
      -

      -This function is used to free the memory used for the data generated by a call -to pcre[16|32]_study() when it is no longer needed. The argument must be the -result of such a call. -

      -

      -There is a complete description of the PCRE native API in the -pcreapi -page and a description of the POSIX API in the -pcreposix -page. -

      -Return to the PCRE index page. -

      diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcre_free_substring.html b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcre_free_substring.html deleted file mode 100644 index 1fe66107..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcre_free_substring.html +++ /dev/null @@ -1,46 +0,0 @@ - - -pcre_free_substring specification - - -

      pcre_free_substring man page

      -

      -Return to the PCRE index page. -

      -

      -This page is part of the PCRE HTML documentation. It was generated automatically -from the original man page. If there is any nonsense in it, please consult the -man page, in case the conversion went wrong. -
      -
      -SYNOPSIS -
      -

      -#include <pcre.h> -

      -

      -void pcre_free_substring(const char *stringptr); -

      -

      -void pcre16_free_substring(PCRE_SPTR16 stringptr); -

      -

      -void pcre32_free_substring(PCRE_SPTR32 stringptr); -

      -
      -DESCRIPTION -
      -

      -This is a convenience function for freeing the store obtained by a previous -call to pcre[16|32]_get_substring() or pcre[16|32]_get_named_substring(). -Its only argument is a pointer to the string. -

      -

      -There is a complete description of the PCRE native API in the -pcreapi -page and a description of the POSIX API in the -pcreposix -page. -

      -Return to the PCRE index page. -

      diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcre_free_substring_list.html b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcre_free_substring_list.html deleted file mode 100644 index c0861780..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcre_free_substring_list.html +++ /dev/null @@ -1,46 +0,0 @@ - - -pcre_free_substring_list specification - - -

      pcre_free_substring_list man page

      -

      -Return to the PCRE index page. -

      -

      -This page is part of the PCRE HTML documentation. It was generated automatically -from the original man page. If there is any nonsense in it, please consult the -man page, in case the conversion went wrong. -
      -
      -SYNOPSIS -
      -

      -#include <pcre.h> -

      -

      -void pcre_free_substring_list(const char **stringptr); -

      -

      -void pcre16_free_substring_list(PCRE_SPTR16 *stringptr); -

      -

      -void pcre32_free_substring_list(PCRE_SPTR32 *stringptr); -

      -
      -DESCRIPTION -
      -

      -This is a convenience function for freeing the store obtained by a previous -call to pcre[16|32]_get_substring_list(). Its only argument is a pointer to -the list of string pointers. -

      -

      -There is a complete description of the PCRE native API in the -pcreapi -page and a description of the POSIX API in the -pcreposix -page. -

      -Return to the PCRE index page. -

      diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcre_fullinfo.html b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcre_fullinfo.html deleted file mode 100644 index 2b7c72b3..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcre_fullinfo.html +++ /dev/null @@ -1,118 +0,0 @@ - - -pcre_fullinfo specification - - -

      pcre_fullinfo man page

      -

      -Return to the PCRE index page. -

      -

      -This page is part of the PCRE HTML documentation. It was generated automatically -from the original man page. If there is any nonsense in it, please consult the -man page, in case the conversion went wrong. -
      -
      -SYNOPSIS -
      -

      -#include <pcre.h> -

      -

      -int pcre_fullinfo(const pcre *code, const pcre_extra *extra, - int what, void *where); -
      -
      -int pcre16_fullinfo(const pcre16 *code, const pcre16_extra *extra, - int what, void *where); -
      -
      -int pcre32_fullinfo(const pcre32 *code, const pcre32_extra *extra, - int what, void *where); -

      -
      -DESCRIPTION -
      -

      -This function returns information about a compiled pattern. Its arguments are: -

      -  code                      Compiled regular expression
      -  extra                     Result of pcre[16|32]_study() or NULL
      -  what                      What information is required
      -  where                     Where to put the information
      -
      -The following information is available: -
      -  PCRE_INFO_BACKREFMAX      Number of highest back reference
      -  PCRE_INFO_CAPTURECOUNT    Number of capturing subpatterns
      -  PCRE_INFO_DEFAULT_TABLES  Pointer to default tables
      -  PCRE_INFO_FIRSTBYTE       Fixed first data unit for a match, or
      -                              -1 for start of string
      -                                 or after newline, or
      -                              -2 otherwise
      -  PCRE_INFO_FIRSTTABLE      Table of first data units (after studying)
      -  PCRE_INFO_HASCRORLF       Return 1 if explicit CR or LF matches exist
      -  PCRE_INFO_JCHANGED        Return 1 if (?J) or (?-J) was used
      -  PCRE_INFO_JIT             Return 1 after successful JIT compilation
      -  PCRE_INFO_JITSIZE         Size of JIT compiled code
      -  PCRE_INFO_LASTLITERAL     Literal last data unit required
      -  PCRE_INFO_MINLENGTH       Lower bound length of matching strings
      -  PCRE_INFO_MATCHEMPTY      Return 1 if the pattern can match an empty string,
      -                               0 otherwise
      -  PCRE_INFO_MATCHLIMIT      Match limit if set, otherwise PCRE_RROR_UNSET
      -  PCRE_INFO_MAXLOOKBEHIND   Length (in characters) of the longest lookbehind assertion
      -  PCRE_INFO_NAMECOUNT       Number of named subpatterns
      -  PCRE_INFO_NAMEENTRYSIZE   Size of name table entry
      -  PCRE_INFO_NAMETABLE       Pointer to name table
      -  PCRE_INFO_OKPARTIAL       Return 1 if partial matching can be tried
      -                              (always returns 1 after release 8.00)
      -  PCRE_INFO_OPTIONS         Option bits used for compilation
      -  PCRE_INFO_SIZE            Size of compiled pattern
      -  PCRE_INFO_STUDYSIZE       Size of study data
      -  PCRE_INFO_FIRSTCHARACTER      Fixed first data unit for a match
      -  PCRE_INFO_FIRSTCHARACTERFLAGS Returns
      -                                  1 if there is a first data character set, which can
      -                                    then be retrieved using PCRE_INFO_FIRSTCHARACTER,
      -                                  2 if the first character is at the start of the data
      -                                    string or after a newline, and
      -                                  0 otherwise
      -  PCRE_INFO_RECURSIONLIMIT    Recursion limit if set, otherwise PCRE_ERROR_UNSET
      -  PCRE_INFO_REQUIREDCHAR      Literal last data unit required
      -  PCRE_INFO_REQUIREDCHARFLAGS Returns 1 if the last data character is set (which can then
      -                              be retrieved using PCRE_INFO_REQUIREDCHAR); 0 otherwise
      -
      -The where argument must point to an integer variable, except for the -following what values: -
      -  PCRE_INFO_DEFAULT_TABLES  const uint8_t *
      -  PCRE_INFO_FIRSTCHARACTER  uint32_t
      -  PCRE_INFO_FIRSTTABLE      const uint8_t *
      -  PCRE_INFO_JITSIZE         size_t
      -  PCRE_INFO_MATCHLIMIT      uint32_t
      -  PCRE_INFO_NAMETABLE       PCRE_SPTR16           (16-bit library)
      -  PCRE_INFO_NAMETABLE       PCRE_SPTR32           (32-bit library)
      -  PCRE_INFO_NAMETABLE       const unsigned char * (8-bit library)
      -  PCRE_INFO_OPTIONS         unsigned long int
      -  PCRE_INFO_SIZE            size_t
      -  PCRE_INFO_STUDYSIZE       size_t
      -  PCRE_INFO_RECURSIONLIMIT  uint32_t
      -  PCRE_INFO_REQUIREDCHAR    uint32_t
      -
      -The yield of the function is zero on success or: -
      -  PCRE_ERROR_NULL           the argument code was NULL
      -                            the argument where was NULL
      -  PCRE_ERROR_BADMAGIC       the "magic number" was not found
      -  PCRE_ERROR_BADOPTION      the value of what was invalid
      -  PCRE_ERROR_UNSET          the option was not set
      -
      -

      -

      -There is a complete description of the PCRE native API in the -pcreapi -page and a description of the POSIX API in the -pcreposix -page. -

      -Return to the PCRE index page. -

      diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcre_get_named_substring.html b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcre_get_named_substring.html deleted file mode 100644 index 72924d9b..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcre_get_named_substring.html +++ /dev/null @@ -1,68 +0,0 @@ - - -pcre_get_named_substring specification - - -

      pcre_get_named_substring man page

      -

      -Return to the PCRE index page. -

      -

      -This page is part of the PCRE HTML documentation. It was generated automatically -from the original man page. If there is any nonsense in it, please consult the -man page, in case the conversion went wrong. -
      -
      -SYNOPSIS -
      -

      -#include <pcre.h> -

      -

      -int pcre_get_named_substring(const pcre *code, - const char *subject, int *ovector, - int stringcount, const char *stringname, - const char **stringptr); -
      -
      -int pcre16_get_named_substring(const pcre16 *code, - PCRE_SPTR16 subject, int *ovector, - int stringcount, PCRE_SPTR16 stringname, - PCRE_SPTR16 *stringptr); -
      -
      -int pcre32_get_named_substring(const pcre32 *code, - PCRE_SPTR32 subject, int *ovector, - int stringcount, PCRE_SPTR32 stringname, - PCRE_SPTR32 *stringptr); -

      -
      -DESCRIPTION -
      -

      -This is a convenience function for extracting a captured substring by name. The -arguments are: -

      -  code          Compiled pattern
      -  subject       Subject that has been successfully matched
      -  ovector       Offset vector that pcre[16|32]_exec() used
      -  stringcount   Value returned by pcre[16|32]_exec()
      -  stringname    Name of the required substring
      -  stringptr     Where to put the string pointer
      -
      -The memory in which the substring is placed is obtained by calling -pcre[16|32]_malloc(). The convenience function -pcre[16|32]_free_substring() can be used to free it when it is no longer -needed. The yield of the function is the length of the extracted substring, -PCRE_ERROR_NOMEMORY if sufficient memory could not be obtained, or -PCRE_ERROR_NOSUBSTRING if the string name is invalid. -

      -

      -There is a complete description of the PCRE native API in the -pcreapi -page and a description of the POSIX API in the -pcreposix -page. -

      -Return to the PCRE index page. -

      diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcre_get_stringnumber.html b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcre_get_stringnumber.html deleted file mode 100644 index 7324d782..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcre_get_stringnumber.html +++ /dev/null @@ -1,57 +0,0 @@ - - -pcre_get_stringnumber specification - - -

      pcre_get_stringnumber man page

      -

      -Return to the PCRE index page. -

      -

      -This page is part of the PCRE HTML documentation. It was generated automatically -from the original man page. If there is any nonsense in it, please consult the -man page, in case the conversion went wrong. -
      -
      -SYNOPSIS -
      -

      -#include <pcre.h> -

      -

      -int pcre_get_stringnumber(const pcre *code, - const char *name); -
      -
      -int pcre16_get_stringnumber(const pcre16 *code, - PCRE_SPTR16 name); -
      -
      -int pcre32_get_stringnumber(const pcre32 *code, - PCRE_SPTR32 name); -

      -
      -DESCRIPTION -
      -

      -This convenience function finds the number of a named substring capturing -parenthesis in a compiled pattern. Its arguments are: -

      -  code    Compiled regular expression
      -  name    Name whose number is required
      -
      -The yield of the function is the number of the parenthesis if the name is -found, or PCRE_ERROR_NOSUBSTRING otherwise. When duplicate names are allowed -(PCRE_DUPNAMES is set), it is not defined which of the numbers is returned by -pcre[16|32]_get_stringnumber(). You can obtain the complete list by calling -pcre[16|32]_get_stringtable_entries(). -

      -

      -There is a complete description of the PCRE native API in the -pcreapi -page and a description of the POSIX API in the -pcreposix -page. -

      -Return to the PCRE index page. -

      diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcre_get_stringtable_entries.html b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcre_get_stringtable_entries.html deleted file mode 100644 index 79906798..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcre_get_stringtable_entries.html +++ /dev/null @@ -1,60 +0,0 @@ - - -pcre_get_stringtable_entries specification - - -

      pcre_get_stringtable_entries man page

      -

      -Return to the PCRE index page. -

      -

      -This page is part of the PCRE HTML documentation. It was generated automatically -from the original man page. If there is any nonsense in it, please consult the -man page, in case the conversion went wrong. -
      -
      -SYNOPSIS -
      -

      -#include <pcre.h> -

      -

      -int pcre_get_stringtable_entries(const pcre *code, - const char *name, char **first, char **last); -
      -
      -int pcre16_get_stringtable_entries(const pcre16 *code, - PCRE_SPTR16 name, PCRE_UCHAR16 **first, PCRE_UCHAR16 **last); -
      -
      -int pcre32_get_stringtable_entries(const pcre32 *code, - PCRE_SPTR32 name, PCRE_UCHAR32 **first, PCRE_UCHAR32 **last); -

      -
      -DESCRIPTION -
      -

      -This convenience function finds, for a compiled pattern, the first and last -entries for a given name in the table that translates capturing parenthesis -names into numbers. When names are required to be unique (PCRE_DUPNAMES is -not set), it is usually easier to use pcre[16|32]_get_stringnumber() -instead. -

      -  code    Compiled regular expression
      -  name    Name whose entries required
      -  first   Where to return a pointer to the first entry
      -  last    Where to return a pointer to the last entry
      -
      -The yield of the function is the length of each entry, or -PCRE_ERROR_NOSUBSTRING if none are found. -

      -

      -There is a complete description of the PCRE native API, including the format of -the table entries, in the -pcreapi -page, and a description of the POSIX API in the -pcreposix -page. -

      -Return to the PCRE index page. -

      diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcre_get_substring.html b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcre_get_substring.html deleted file mode 100644 index 1a8e4f5a..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcre_get_substring.html +++ /dev/null @@ -1,64 +0,0 @@ - - -pcre_get_substring specification - - -

      pcre_get_substring man page

      -

      -Return to the PCRE index page. -

      -

      -This page is part of the PCRE HTML documentation. It was generated automatically -from the original man page. If there is any nonsense in it, please consult the -man page, in case the conversion went wrong. -
      -
      -SYNOPSIS -
      -

      -#include <pcre.h> -

      -

      -int pcre_get_substring(const char *subject, int *ovector, - int stringcount, int stringnumber, - const char **stringptr); -
      -
      -int pcre16_get_substring(PCRE_SPTR16 subject, int *ovector, - int stringcount, int stringnumber, - PCRE_SPTR16 *stringptr); -
      -
      -int pcre32_get_substring(PCRE_SPTR32 subject, int *ovector, - int stringcount, int stringnumber, - PCRE_SPTR32 *stringptr); -

      -
      -DESCRIPTION -
      -

      -This is a convenience function for extracting a captured substring. The -arguments are: -

      -  subject       Subject that has been successfully matched
      -  ovector       Offset vector that pcre[16|32]_exec() used
      -  stringcount   Value returned by pcre[16|32]_exec()
      -  stringnumber  Number of the required substring
      -  stringptr     Where to put the string pointer
      -
      -The memory in which the substring is placed is obtained by calling -pcre[16|32]_malloc(). The convenience function -pcre[16|32]_free_substring() can be used to free it when it is no longer -needed. The yield of the function is the length of the substring, -PCRE_ERROR_NOMEMORY if sufficient memory could not be obtained, or -PCRE_ERROR_NOSUBSTRING if the string number is invalid. -

      -

      -There is a complete description of the PCRE native API in the -pcreapi -page and a description of the POSIX API in the -pcreposix -page. -

      -Return to the PCRE index page. -

      diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcre_get_substring_list.html b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcre_get_substring_list.html deleted file mode 100644 index 7e8c6bc8..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcre_get_substring_list.html +++ /dev/null @@ -1,61 +0,0 @@ - - -pcre_get_substring_list specification - - -

      pcre_get_substring_list man page

      -

      -Return to the PCRE index page. -

      -

      -This page is part of the PCRE HTML documentation. It was generated automatically -from the original man page. If there is any nonsense in it, please consult the -man page, in case the conversion went wrong. -
      -
      -SYNOPSIS -
      -

      -#include <pcre.h> -

      -

      -int pcre_get_substring_list(const char *subject, - int *ovector, int stringcount, const char ***listptr); -
      -
      -int pcre16_get_substring_list(PCRE_SPTR16 subject, - int *ovector, int stringcount, PCRE_SPTR16 **listptr); -
      -
      -int pcre32_get_substring_list(PCRE_SPTR32 subject, - int *ovector, int stringcount, PCRE_SPTR32 **listptr); -

      -
      -DESCRIPTION -
      -

      -This is a convenience function for extracting a list of all the captured -substrings. The arguments are: -

      -  subject       Subject that has been successfully matched
      -  ovector       Offset vector that pcre[16|32]_exec used
      -  stringcount   Value returned by pcre[16|32]_exec
      -  listptr       Where to put a pointer to the list
      -
      -The memory in which the substrings and the list are placed is obtained by -calling pcre[16|32]_malloc(). The convenience function -pcre[16|32]_free_substring_list() can be used to free it when it is no -longer needed. A pointer to a list of pointers is put in the variable whose -address is in listptr. The list is terminated by a NULL pointer. The -yield of the function is zero on success or PCRE_ERROR_NOMEMORY if sufficient -memory could not be obtained. -

      -

      -There is a complete description of the PCRE native API in the -pcreapi -page and a description of the POSIX API in the -pcreposix -page. -

      -Return to the PCRE index page. -

      diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcre_jit_exec.html b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcre_jit_exec.html deleted file mode 100644 index 4ebb0cbc..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcre_jit_exec.html +++ /dev/null @@ -1,108 +0,0 @@ - - -pcre_jit_exec specification - - -

      pcre_jit_exec man page

      -

      -Return to the PCRE index page. -

      -

      -This page is part of the PCRE HTML documentation. It was generated automatically -from the original man page. If there is any nonsense in it, please consult the -man page, in case the conversion went wrong. -
      -
      -SYNOPSIS -
      -

      -#include <pcre.h> -

      -

      -int pcre_jit_exec(const pcre *code, const pcre_extra *extra, - const char *subject, int length, int startoffset, - int options, int *ovector, int ovecsize, - pcre_jit_stack *jstack); -
      -
      -int pcre16_jit_exec(const pcre16 *code, const pcre16_extra *extra, - PCRE_SPTR16 subject, int length, int startoffset, - int options, int *ovector, int ovecsize, - pcre_jit_stack *jstack); -
      -
      -int pcre32_jit_exec(const pcre32 *code, const pcre32_extra *extra, - PCRE_SPTR32 subject, int length, int startoffset, - int options, int *ovector, int ovecsize, - pcre_jit_stack *jstack); -

      -
      -DESCRIPTION -
      -

      -This function matches a compiled regular expression that has been successfully -studied with one of the JIT options against a given subject string, using a -matching algorithm that is similar to Perl's. It is a "fast path" interface to -JIT, and it bypasses some of the sanity checks that pcre_exec() applies. -It returns offsets to captured substrings. Its arguments are: -

      -  code         Points to the compiled pattern
      -  extra        Points to an associated pcre[16|32]_extra structure,
      -                 or is NULL
      -  subject      Points to the subject string
      -  length       Length of the subject string, in bytes
      -  startoffset  Offset in bytes in the subject at which to
      -                 start matching
      -  options      Option bits
      -  ovector      Points to a vector of ints for result offsets
      -  ovecsize     Number of elements in the vector (a multiple of 3)
      -  jstack       Pointer to a JIT stack
      -
      -The allowed options are: -
      -  PCRE_NOTBOL            Subject string is not the beginning of a line
      -  PCRE_NOTEOL            Subject string is not the end of a line
      -  PCRE_NOTEMPTY          An empty string is not a valid match
      -  PCRE_NOTEMPTY_ATSTART  An empty string at the start of the subject
      -                           is not a valid match
      -  PCRE_NO_UTF16_CHECK    Do not check the subject for UTF-16
      -                           validity (only relevant if PCRE_UTF16
      -                           was set at compile time)
      -  PCRE_NO_UTF32_CHECK    Do not check the subject for UTF-32
      -                           validity (only relevant if PCRE_UTF32
      -                           was set at compile time)
      -  PCRE_NO_UTF8_CHECK     Do not check the subject for UTF-8
      -                           validity (only relevant if PCRE_UTF8
      -                           was set at compile time)
      -  PCRE_PARTIAL           ) Return PCRE_ERROR_PARTIAL for a partial
      -  PCRE_PARTIAL_SOFT      )   match if no full matches are found
      -  PCRE_PARTIAL_HARD      Return PCRE_ERROR_PARTIAL for a partial match
      -                           if that is found before a full match
      -
      -However, the PCRE_NO_UTF[8|16|32]_CHECK options have no effect, as this check -is never applied. For details of partial matching, see the -pcrepartial -page. A pcre_extra structure contains the following fields: -
      -  flags            Bits indicating which fields are set
      -  study_data       Opaque data from pcre[16|32]_study()
      -  match_limit      Limit on internal resource use
      -  match_limit_recursion  Limit on internal recursion depth
      -  callout_data     Opaque data passed back to callouts
      -  tables           Points to character tables or is NULL
      -  mark             For passing back a *MARK pointer
      -  executable_jit   Opaque data from JIT compilation
      -
      -The flag bits are PCRE_EXTRA_STUDY_DATA, PCRE_EXTRA_MATCH_LIMIT, -PCRE_EXTRA_MATCH_LIMIT_RECURSION, PCRE_EXTRA_CALLOUT_DATA, -PCRE_EXTRA_TABLES, PCRE_EXTRA_MARK and PCRE_EXTRA_EXECUTABLE_JIT. -

      -

      -There is a complete description of the PCRE native API in the -pcreapi -page and a description of the JIT API in the -pcrejit -page. -

      -Return to the PCRE index page. -

      diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcre_jit_stack_alloc.html b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcre_jit_stack_alloc.html deleted file mode 100644 index 23ba4507..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcre_jit_stack_alloc.html +++ /dev/null @@ -1,55 +0,0 @@ - - -pcre_jit_stack_alloc specification - - -

      pcre_jit_stack_alloc man page

      -

      -Return to the PCRE index page. -

      -

      -This page is part of the PCRE HTML documentation. It was generated automatically -from the original man page. If there is any nonsense in it, please consult the -man page, in case the conversion went wrong. -
      -
      -SYNOPSIS -
      -

      -#include <pcre.h> -

      -

      -pcre_jit_stack *pcre_jit_stack_alloc(int startsize, - int maxsize); -
      -
      -pcre16_jit_stack *pcre16_jit_stack_alloc(int startsize, - int maxsize); -
      -
      -pcre32_jit_stack *pcre32_jit_stack_alloc(int startsize, - int maxsize); -

      -
      -DESCRIPTION -
      -

      -This function is used to create a stack for use by the code compiled by the JIT -optimization of pcre[16|32]_study(). The arguments are a starting size for -the stack, and a maximum size to which it is allowed to grow. The result can be -passed to the JIT run-time code by pcre[16|32]_assign_jit_stack(), or that -function can set up a callback for obtaining a stack. A maximum stack size of -512K to 1M should be more than enough for any pattern. For more details, see -the -pcrejit -page. -

      -

      -There is a complete description of the PCRE native API in the -pcreapi -page and a description of the POSIX API in the -pcreposix -page. -

      -Return to the PCRE index page. -

      diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcre_jit_stack_free.html b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcre_jit_stack_free.html deleted file mode 100644 index 8bd06e46..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcre_jit_stack_free.html +++ /dev/null @@ -1,48 +0,0 @@ - - -pcre_jit_stack_free specification - - -

      pcre_jit_stack_free man page

      -

      -Return to the PCRE index page. -

      -

      -This page is part of the PCRE HTML documentation. It was generated automatically -from the original man page. If there is any nonsense in it, please consult the -man page, in case the conversion went wrong. -
      -
      -SYNOPSIS -
      -

      -#include <pcre.h> -

      -

      -void pcre_jit_stack_free(pcre_jit_stack *stack); -

      -

      -void pcre16_jit_stack_free(pcre16_jit_stack *stack); -

      -

      -void pcre32_jit_stack_free(pcre32_jit_stack *stack); -

      -
      -DESCRIPTION -
      -

      -This function is used to free a JIT stack that was created by -pcre[16|32]_jit_stack_alloc() when it is no longer needed. For more details, -see the -pcrejit -page. -

      -

      -There is a complete description of the PCRE native API in the -pcreapi -page and a description of the POSIX API in the -pcreposix -page. -

      -Return to the PCRE index page. -

      diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcre_maketables.html b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcre_maketables.html deleted file mode 100644 index 3a7b5ebc..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcre_maketables.html +++ /dev/null @@ -1,48 +0,0 @@ - - -pcre_maketables specification - - -

      pcre_maketables man page

      -

      -Return to the PCRE index page. -

      -

      -This page is part of the PCRE HTML documentation. It was generated automatically -from the original man page. If there is any nonsense in it, please consult the -man page, in case the conversion went wrong. -
      -
      -SYNOPSIS -
      -

      -#include <pcre.h> -

      -

      -const unsigned char *pcre_maketables(void); -

      -

      -const unsigned char *pcre16_maketables(void); -

      -

      -const unsigned char *pcre32_maketables(void); -

      -
      -DESCRIPTION -
      -

      -This function builds a set of character tables for character values less than -256. These can be passed to pcre[16|32]_compile() to override PCRE's -internal, built-in tables (which were made by pcre[16|32]_maketables() when -PCRE was compiled). You might want to do this if you are using a non-standard -locale. The function yields a pointer to the tables. -

      -

      -There is a complete description of the PCRE native API in the -pcreapi -page and a description of the POSIX API in the -pcreposix -page. -

      -Return to the PCRE index page. -

      diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcre_pattern_to_host_byte_order.html b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcre_pattern_to_host_byte_order.html deleted file mode 100644 index 1b1c8037..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcre_pattern_to_host_byte_order.html +++ /dev/null @@ -1,58 +0,0 @@ - - -pcre_pattern_to_host_byte_order specification - - -

      pcre_pattern_to_host_byte_order man page

      -

      -Return to the PCRE index page. -

      -

      -This page is part of the PCRE HTML documentation. It was generated automatically -from the original man page. If there is any nonsense in it, please consult the -man page, in case the conversion went wrong. -
      -
      -SYNOPSIS -
      -

      -#include <pcre.h> -

      -

      -int pcre_pattern_to_host_byte_order(pcre *code, - pcre_extra *extra, const unsigned char *tables); -
      -
      -int pcre16_pattern_to_host_byte_order(pcre16 *code, - pcre16_extra *extra, const unsigned char *tables); -
      -
      -int pcre32_pattern_to_host_byte_order(pcre32 *code, - pcre32_extra *extra, const unsigned char *tables); -

      -
      -DESCRIPTION -
      -

      -This function ensures that the bytes in 2-byte and 4-byte values in a compiled -pattern are in the correct order for the current host. It is useful when a -pattern that has been compiled on one host is transferred to another that might -have different endianness. The arguments are: -

      -  code         A compiled regular expression
      -  extra        Points to an associated pcre[16|32]_extra structure,
      -                 or is NULL
      -  tables       Pointer to character tables, or NULL to
      -                 set the built-in default
      -
      -The result is 0 for success, a negative PCRE_ERROR_xxx value otherwise. -

      -

      -There is a complete description of the PCRE native API in the -pcreapi -page and a description of the POSIX API in the -pcreposix -page. -

      -Return to the PCRE index page. -

      diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcre_refcount.html b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcre_refcount.html deleted file mode 100644 index bfb92e6d..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcre_refcount.html +++ /dev/null @@ -1,51 +0,0 @@ - - -pcre_refcount specification - - -

      pcre_refcount man page

      -

      -Return to the PCRE index page. -

      -

      -This page is part of the PCRE HTML documentation. It was generated automatically -from the original man page. If there is any nonsense in it, please consult the -man page, in case the conversion went wrong. -
      -
      -SYNOPSIS -
      -

      -#include <pcre.h> -

      -

      -int pcre_refcount(pcre *code, int adjust); -

      -

      -int pcre16_refcount(pcre16 *code, int adjust); -

      -

      -int pcre32_refcount(pcre32 *code, int adjust); -

      -
      -DESCRIPTION -
      -

      -This function is used to maintain a reference count inside a data block that -contains a compiled pattern. Its arguments are: -

      -  code                      Compiled regular expression
      -  adjust                    Adjustment to reference value
      -
      -The yield of the function is the adjusted reference value, which is constrained -to lie between 0 and 65535. -

      -

      -There is a complete description of the PCRE native API in the -pcreapi -page and a description of the POSIX API in the -pcreposix -page. -

      -Return to the PCRE index page. -

      diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcre_study.html b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcre_study.html deleted file mode 100644 index af82f114..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcre_study.html +++ /dev/null @@ -1,68 +0,0 @@ - - -pcre_study specification - - -

      pcre_study man page

      -

      -Return to the PCRE index page. -

      -

      -This page is part of the PCRE HTML documentation. It was generated automatically -from the original man page. If there is any nonsense in it, please consult the -man page, in case the conversion went wrong. -
      -
      -SYNOPSIS -
      -

      -#include <pcre.h> -

      -

      -pcre_extra *pcre_study(const pcre *code, int options, - const char **errptr); -
      -
      -pcre16_extra *pcre16_study(const pcre16 *code, int options, - const char **errptr); -
      -
      -pcre32_extra *pcre32_study(const pcre32 *code, int options, - const char **errptr); -

      -
      -DESCRIPTION -
      -

      -This function studies a compiled pattern, to see if additional information can -be extracted that might speed up matching. Its arguments are: -

      -  code       A compiled regular expression
      -  options    Options for pcre[16|32]_study()
      -  errptr     Where to put an error message
      -
      -If the function succeeds, it returns a value that can be passed to -pcre[16|32]_exec() or pcre[16|32]_dfa_exec() via their extra -arguments. -

      -

      -If the function returns NULL, either it could not find any additional -information, or there was an error. You can tell the difference by looking at -the error value. It is NULL in first case. -

      -

      -The only option is PCRE_STUDY_JIT_COMPILE. It requests just-in-time compilation -if possible. If PCRE has been compiled without JIT support, this option is -ignored. See the -pcrejit -page for further details. -

      -

      -There is a complete description of the PCRE native API in the -pcreapi -page and a description of the POSIX API in the -pcreposix -page. -

      -Return to the PCRE index page. -

      diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcre_utf16_to_host_byte_order.html b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcre_utf16_to_host_byte_order.html deleted file mode 100644 index 18e7788f..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcre_utf16_to_host_byte_order.html +++ /dev/null @@ -1,57 +0,0 @@ - - -pcre_utf16_to_host_byte_order specification - - -

      pcre_utf16_to_host_byte_order man page

      -

      -Return to the PCRE index page. -

      -

      -This page is part of the PCRE HTML documentation. It was generated automatically -from the original man page. If there is any nonsense in it, please consult the -man page, in case the conversion went wrong. -
      -
      -SYNOPSIS -
      -

      -#include <pcre.h> -

      -

      -int pcre16_utf16_to_host_byte_order(PCRE_UCHAR16 *output, - PCRE_SPTR16 input, int length, int *host_byte_order, - int keep_boms); -

      -
      -DESCRIPTION -
      -

      -This function, which exists only in the 16-bit library, converts a UTF-16 -string to the correct order for the current host, taking account of any byte -order marks (BOMs) within the string. Its arguments are: -

      -  output           pointer to output buffer, may be the same as input
      -  input            pointer to input buffer
      -  length           number of 16-bit units in the input, or negative for
      -                     a zero-terminated string
      -  host_byte_order  a NULL value or a non-zero value pointed to means
      -                     start in host byte order
      -  keep_boms        if non-zero, BOMs are copied to the output string
      -
      -The result of the function is the number of 16-bit units placed into the output -buffer, including the zero terminator if the string was zero-terminated. -

      -

      -If host_byte_order is not NULL, it is set to indicate the byte order that -is current at the end of the string. -

      -

      -There is a complete description of the PCRE native API in the -pcreapi -page and a description of the POSIX API in the -pcreposix -page. -

      -Return to the PCRE index page. -

      diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcre_utf32_to_host_byte_order.html b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcre_utf32_to_host_byte_order.html deleted file mode 100644 index 772ae40c..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcre_utf32_to_host_byte_order.html +++ /dev/null @@ -1,57 +0,0 @@ - - -pcre_utf32_to_host_byte_order specification - - -

      pcre_utf32_to_host_byte_order man page

      -

      -Return to the PCRE index page. -

      -

      -This page is part of the PCRE HTML documentation. It was generated automatically -from the original man page. If there is any nonsense in it, please consult the -man page, in case the conversion went wrong. -
      -
      -SYNOPSIS -
      -

      -#include <pcre.h> -

      -

      -int pcre32_utf32_to_host_byte_order(PCRE_UCHAR32 *output, - PCRE_SPTR32 input, int length, int *host_byte_order, - int keep_boms); -

      -
      -DESCRIPTION -
      -

      -This function, which exists only in the 32-bit library, converts a UTF-32 -string to the correct order for the current host, taking account of any byte -order marks (BOMs) within the string. Its arguments are: -

      -  output           pointer to output buffer, may be the same as input
      -  input            pointer to input buffer
      -  length           number of 32-bit units in the input, or negative for
      -                     a zero-terminated string
      -  host_byte_order  a NULL value or a non-zero value pointed to means
      -                     start in host byte order
      -  keep_boms        if non-zero, BOMs are copied to the output string
      -
      -The result of the function is the number of 32-bit units placed into the output -buffer, including the zero terminator if the string was zero-terminated. -

      -

      -If host_byte_order is not NULL, it is set to indicate the byte order that -is current at the end of the string. -

      -

      -There is a complete description of the PCRE native API in the -pcreapi -page and a description of the POSIX API in the -pcreposix -page. -

      -Return to the PCRE index page. -

      diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcre_version.html b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcre_version.html deleted file mode 100644 index d33e7189..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcre_version.html +++ /dev/null @@ -1,46 +0,0 @@ - - -pcre_version specification - - -

      pcre_version man page

      -

      -Return to the PCRE index page. -

      -

      -This page is part of the PCRE HTML documentation. It was generated automatically -from the original man page. If there is any nonsense in it, please consult the -man page, in case the conversion went wrong. -
      -
      -SYNOPSIS -
      -

      -#include <pcre.h> -

      -

      -const char *pcre_version(void); -

      -

      -const char *pcre16_version(void); -

      -

      -const char *pcre32_version(void); -

      -
      -DESCRIPTION -
      -

      -This function (even in the 16-bit and 32-bit libraries) returns a -zero-terminated, 8-bit character string that gives the version number of the -PCRE library and the date of its release. -

      -

      -There is a complete description of the PCRE native API in the -pcreapi -page and a description of the POSIX API in the -pcreposix -page. -

      -Return to the PCRE index page. -

      diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcreapi.html b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcreapi.html deleted file mode 100644 index 2d7adf18..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcreapi.html +++ /dev/null @@ -1,2921 +0,0 @@ - - -pcreapi specification - - -

      pcreapi man page

      -

      -Return to the PCRE index page. -

      -

      -This page is part of the PCRE HTML documentation. It was generated automatically -from the original man page. If there is any nonsense in it, please consult the -man page, in case the conversion went wrong. -
      -

      -

      -#include <pcre.h> -

      -
      PCRE NATIVE API BASIC FUNCTIONS
      -

      -pcre *pcre_compile(const char *pattern, int options, - const char **errptr, int *erroffset, - const unsigned char *tableptr); -
      -
      -pcre *pcre_compile2(const char *pattern, int options, - int *errorcodeptr, - const char **errptr, int *erroffset, - const unsigned char *tableptr); -
      -
      -pcre_extra *pcre_study(const pcre *code, int options, - const char **errptr); -
      -
      -void pcre_free_study(pcre_extra *extra); -
      -
      -int pcre_exec(const pcre *code, const pcre_extra *extra, - const char *subject, int length, int startoffset, - int options, int *ovector, int ovecsize); -
      -
      -int pcre_dfa_exec(const pcre *code, const pcre_extra *extra, - const char *subject, int length, int startoffset, - int options, int *ovector, int ovecsize, - int *workspace, int wscount); -

      -
      PCRE NATIVE API STRING EXTRACTION FUNCTIONS
      -

      -int pcre_copy_named_substring(const pcre *code, - const char *subject, int *ovector, - int stringcount, const char *stringname, - char *buffer, int buffersize); -
      -
      -int pcre_copy_substring(const char *subject, int *ovector, - int stringcount, int stringnumber, char *buffer, - int buffersize); -
      -
      -int pcre_get_named_substring(const pcre *code, - const char *subject, int *ovector, - int stringcount, const char *stringname, - const char **stringptr); -
      -
      -int pcre_get_stringnumber(const pcre *code, - const char *name); -
      -
      -int pcre_get_stringtable_entries(const pcre *code, - const char *name, char **first, char **last); -
      -
      -int pcre_get_substring(const char *subject, int *ovector, - int stringcount, int stringnumber, - const char **stringptr); -
      -
      -int pcre_get_substring_list(const char *subject, - int *ovector, int stringcount, const char ***listptr); -
      -
      -void pcre_free_substring(const char *stringptr); -
      -
      -void pcre_free_substring_list(const char **stringptr); -

      -
      PCRE NATIVE API AUXILIARY FUNCTIONS
      -

      -int pcre_jit_exec(const pcre *code, const pcre_extra *extra, - const char *subject, int length, int startoffset, - int options, int *ovector, int ovecsize, - pcre_jit_stack *jstack); -
      -
      -pcre_jit_stack *pcre_jit_stack_alloc(int startsize, int maxsize); -
      -
      -void pcre_jit_stack_free(pcre_jit_stack *stack); -
      -
      -void pcre_assign_jit_stack(pcre_extra *extra, - pcre_jit_callback callback, void *data); -
      -
      -const unsigned char *pcre_maketables(void); -
      -
      -int pcre_fullinfo(const pcre *code, const pcre_extra *extra, - int what, void *where); -
      -
      -int pcre_refcount(pcre *code, int adjust); -
      -
      -int pcre_config(int what, void *where); -
      -
      -const char *pcre_version(void); -
      -
      -int pcre_pattern_to_host_byte_order(pcre *code, - pcre_extra *extra, const unsigned char *tables); -

      -
      PCRE NATIVE API INDIRECTED FUNCTIONS
      -

      -void *(*pcre_malloc)(size_t); -
      -
      -void (*pcre_free)(void *); -
      -
      -void *(*pcre_stack_malloc)(size_t); -
      -
      -void (*pcre_stack_free)(void *); -
      -
      -int (*pcre_callout)(pcre_callout_block *); -
      -
      -int (*pcre_stack_guard)(void); -

      -
      PCRE 8-BIT, 16-BIT, AND 32-BIT LIBRARIES
      -

      -As well as support for 8-bit character strings, PCRE also supports 16-bit -strings (from release 8.30) and 32-bit strings (from release 8.32), by means of -two additional libraries. They can be built as well as, or instead of, the -8-bit library. To avoid too much complication, this document describes the -8-bit versions of the functions, with only occasional references to the 16-bit -and 32-bit libraries. -

      -

      -The 16-bit and 32-bit functions operate in the same way as their 8-bit -counterparts; they just use different data types for their arguments and -results, and their names start with pcre16_ or pcre32_ instead of -pcre_. For every option that has UTF8 in its name (for example, -PCRE_UTF8), there are corresponding 16-bit and 32-bit names with UTF8 replaced -by UTF16 or UTF32, respectively. This facility is in fact just cosmetic; the -16-bit and 32-bit option names define the same bit values. -

      -

      -References to bytes and UTF-8 in this document should be read as references to -16-bit data units and UTF-16 when using the 16-bit library, or 32-bit data -units and UTF-32 when using the 32-bit library, unless specified otherwise. -More details of the specific differences for the 16-bit and 32-bit libraries -are given in the -pcre16 -and -pcre32 -pages. -

      -
      PCRE API OVERVIEW
      -

      -PCRE has its own native API, which is described in this document. There are -also some wrapper functions (for the 8-bit library only) that correspond to the -POSIX regular expression API, but they do not give access to all the -functionality. They are described in the -pcreposix -documentation. Both of these APIs define a set of C function calls. A C++ -wrapper (again for the 8-bit library only) is also distributed with PCRE. It is -documented in the -pcrecpp -page. -

      -

      -The native API C function prototypes are defined in the header file -pcre.h, and on Unix-like systems the (8-bit) library itself is called -libpcre. It can normally be accessed by adding -lpcre to the -command for linking an application that uses PCRE. The header file defines the -macros PCRE_MAJOR and PCRE_MINOR to contain the major and minor release numbers -for the library. Applications can use these to include support for different -releases of PCRE. -

      -

      -In a Windows environment, if you want to statically link an application program -against a non-dll pcre.a file, you must define PCRE_STATIC before -including pcre.h or pcrecpp.h, because otherwise the -pcre_malloc() and pcre_free() exported functions will be declared -__declspec(dllimport), with unwanted results. -

      -

      -The functions pcre_compile(), pcre_compile2(), pcre_study(), -and pcre_exec() are used for compiling and matching regular expressions -in a Perl-compatible manner. A sample program that demonstrates the simplest -way of using them is provided in the file called pcredemo.c in the PCRE -source distribution. A listing of this program is given in the -pcredemo -documentation, and the -pcresample -documentation describes how to compile and run it. -

      -

      -Just-in-time compiler support is an optional feature of PCRE that can be built -in appropriate hardware environments. It greatly speeds up the matching -performance of many patterns. Simple programs can easily request that it be -used if available, by setting an option that is ignored when it is not -relevant. More complicated programs might need to make use of the functions -pcre_jit_stack_alloc(), pcre_jit_stack_free(), and -pcre_assign_jit_stack() in order to control the JIT code's memory usage. -

      -

      -From release 8.32 there is also a direct interface for JIT execution, which -gives improved performance. The JIT-specific functions are discussed in the -pcrejit -documentation. -

      -

      -A second matching function, pcre_dfa_exec(), which is not -Perl-compatible, is also provided. This uses a different algorithm for the -matching. The alternative algorithm finds all possible matches (at a given -point in the subject), and scans the subject just once (unless there are -lookbehind assertions). However, this algorithm does not return captured -substrings. A description of the two matching algorithms and their advantages -and disadvantages is given in the -pcrematching -documentation. -

      -

      -In addition to the main compiling and matching functions, there are convenience -functions for extracting captured substrings from a subject string that is -matched by pcre_exec(). They are: -

      -  pcre_copy_substring()
      -  pcre_copy_named_substring()
      -  pcre_get_substring()
      -  pcre_get_named_substring()
      -  pcre_get_substring_list()
      -  pcre_get_stringnumber()
      -  pcre_get_stringtable_entries()
      -
      -pcre_free_substring() and pcre_free_substring_list() are also -provided, to free the memory used for extracted strings. -

      -

      -The function pcre_maketables() is used to build a set of character tables -in the current locale for passing to pcre_compile(), pcre_exec(), -or pcre_dfa_exec(). This is an optional facility that is provided for -specialist use. Most commonly, no special tables are passed, in which case -internal tables that are generated when PCRE is built are used. -

      -

      -The function pcre_fullinfo() is used to find out information about a -compiled pattern. The function pcre_version() returns a pointer to a -string containing the version of PCRE and its date of release. -

      -

      -The function pcre_refcount() maintains a reference count in a data block -containing a compiled pattern. This is provided for the benefit of -object-oriented applications. -

      -

      -The global variables pcre_malloc and pcre_free initially contain -the entry points of the standard malloc() and free() functions, -respectively. PCRE calls the memory management functions via these variables, -so a calling program can replace them if it wishes to intercept the calls. This -should be done before calling any PCRE functions. -

      -

      -The global variables pcre_stack_malloc and pcre_stack_free are also -indirections to memory management functions. These special functions are used -only when PCRE is compiled to use the heap for remembering data, instead of -recursive function calls, when running the pcre_exec() function. See the -pcrebuild -documentation for details of how to do this. It is a non-standard way of -building PCRE, for use in environments that have limited stacks. Because of the -greater use of memory management, it runs more slowly. Separate functions are -provided so that special-purpose external code can be used for this case. When -used, these functions always allocate memory blocks of the same size. There is -a discussion about PCRE's stack usage in the -pcrestack -documentation. -

      -

      -The global variable pcre_callout initially contains NULL. It can be set -by the caller to a "callout" function, which PCRE will then call at specified -points during a matching operation. Details are given in the -pcrecallout -documentation. -

      -

      -The global variable pcre_stack_guard initially contains NULL. It can be -set by the caller to a function that is called by PCRE whenever it starts -to compile a parenthesized part of a pattern. When parentheses are nested, PCRE -uses recursive function calls, which use up the system stack. This function is -provided so that applications with restricted stacks can force a compilation -error if the stack runs out. The function should return zero if all is well, or -non-zero to force an error. -

      -
      NEWLINES
      -

      -PCRE supports five different conventions for indicating line breaks in -strings: a single CR (carriage return) character, a single LF (linefeed) -character, the two-character sequence CRLF, any of the three preceding, or any -Unicode newline sequence. The Unicode newline sequences are the three just -mentioned, plus the single characters VT (vertical tab, U+000B), FF (form feed, -U+000C), NEL (next line, U+0085), LS (line separator, U+2028), and PS -(paragraph separator, U+2029). -

      -

      -Each of the first three conventions is used by at least one operating system as -its standard newline sequence. When PCRE is built, a default can be specified. -The default default is LF, which is the Unix standard. When PCRE is run, the -default can be overridden, either when a pattern is compiled, or when it is -matched. -

      -

      -At compile time, the newline convention can be specified by the options -argument of pcre_compile(), or it can be specified by special text at the -start of the pattern itself; this overrides any other settings. See the -pcrepattern -page for details of the special character sequences. -

      -

      -In the PCRE documentation the word "newline" is used to mean "the character or -pair of characters that indicate a line break". The choice of newline -convention affects the handling of the dot, circumflex, and dollar -metacharacters, the handling of #-comments in /x mode, and, when CRLF is a -recognized line ending sequence, the match position advancement for a -non-anchored pattern. There is more detail about this in the -section on pcre_exec() options -below. -

      -

      -The choice of newline convention does not affect the interpretation of -the \n or \r escape sequences, nor does it affect what \R matches, which is -controlled in a similar way, but by separate options. -

      -
      MULTITHREADING
      -

      -The PCRE functions can be used in multi-threading applications, with the -proviso that the memory management functions pointed to by pcre_malloc, -pcre_free, pcre_stack_malloc, and pcre_stack_free, and the -callout and stack-checking functions pointed to by pcre_callout and -pcre_stack_guard, are shared by all threads. -

      -

      -The compiled form of a regular expression is not altered during matching, so -the same compiled pattern can safely be used by several threads at once. -

      -

      -If the just-in-time optimization feature is being used, it needs separate -memory stack areas for each thread. See the -pcrejit -documentation for more details. -

      -
      SAVING PRECOMPILED PATTERNS FOR LATER USE
      -

      -The compiled form of a regular expression can be saved and re-used at a later -time, possibly by a different program, and even on a host other than the one on -which it was compiled. Details are given in the -pcreprecompile -documentation, which includes a description of the -pcre_pattern_to_host_byte_order() function. However, compiling a regular -expression with one version of PCRE for use with a different version is not -guaranteed to work and may cause crashes. -

      -
      CHECKING BUILD-TIME OPTIONS
      -

      -int pcre_config(int what, void *where); -

      -

      -The function pcre_config() makes it possible for a PCRE client to -discover which optional features have been compiled into the PCRE library. The -pcrebuild -documentation has more details about these optional features. -

      -

      -The first argument for pcre_config() is an integer, specifying which -information is required; the second argument is a pointer to a variable into -which the information is placed. The returned value is zero on success, or the -negative error code PCRE_ERROR_BADOPTION if the value in the first argument is -not recognized. The following information is available: -

      -  PCRE_CONFIG_UTF8
      -
      -The output is an integer that is set to one if UTF-8 support is available; -otherwise it is set to zero. This value should normally be given to the 8-bit -version of this function, pcre_config(). If it is given to the 16-bit -or 32-bit version of this function, the result is PCRE_ERROR_BADOPTION. -
      -  PCRE_CONFIG_UTF16
      -
      -The output is an integer that is set to one if UTF-16 support is available; -otherwise it is set to zero. This value should normally be given to the 16-bit -version of this function, pcre16_config(). If it is given to the 8-bit -or 32-bit version of this function, the result is PCRE_ERROR_BADOPTION. -
      -  PCRE_CONFIG_UTF32
      -
      -The output is an integer that is set to one if UTF-32 support is available; -otherwise it is set to zero. This value should normally be given to the 32-bit -version of this function, pcre32_config(). If it is given to the 8-bit -or 16-bit version of this function, the result is PCRE_ERROR_BADOPTION. -
      -  PCRE_CONFIG_UNICODE_PROPERTIES
      -
      -The output is an integer that is set to one if support for Unicode character -properties is available; otherwise it is set to zero. -
      -  PCRE_CONFIG_JIT
      -
      -The output is an integer that is set to one if support for just-in-time -compiling is available; otherwise it is set to zero. -
      -  PCRE_CONFIG_JITTARGET
      -
      -The output is a pointer to a zero-terminated "const char *" string. If JIT -support is available, the string contains the name of the architecture for -which the JIT compiler is configured, for example "x86 32bit (little endian + -unaligned)". If JIT support is not available, the result is NULL. -
      -  PCRE_CONFIG_NEWLINE
      -
      -The output is an integer whose value specifies the default character sequence -that is recognized as meaning "newline". The values that are supported in -ASCII/Unicode environments are: 10 for LF, 13 for CR, 3338 for CRLF, -2 for -ANYCRLF, and -1 for ANY. In EBCDIC environments, CR, ANYCRLF, and ANY yield the -same values. However, the value for LF is normally 21, though some EBCDIC -environments use 37. The corresponding values for CRLF are 3349 and 3365. The -default should normally correspond to the standard sequence for your operating -system. -
      -  PCRE_CONFIG_BSR
      -
      -The output is an integer whose value indicates what character sequences the \R -escape sequence matches by default. A value of 0 means that \R matches any -Unicode line ending sequence; a value of 1 means that \R matches only CR, LF, -or CRLF. The default can be overridden when a pattern is compiled or matched. -
      -  PCRE_CONFIG_LINK_SIZE
      -
      -The output is an integer that contains the number of bytes used for internal -linkage in compiled regular expressions. For the 8-bit library, the value can -be 2, 3, or 4. For the 16-bit library, the value is either 2 or 4 and is still -a number of bytes. For the 32-bit library, the value is either 2 or 4 and is -still a number of bytes. The default value of 2 is sufficient for all but the -most massive patterns, since it allows the compiled pattern to be up to 64K in -size. Larger values allow larger regular expressions to be compiled, at the -expense of slower matching. -
      -  PCRE_CONFIG_POSIX_MALLOC_THRESHOLD
      -
      -The output is an integer that contains the threshold above which the POSIX -interface uses malloc() for output vectors. Further details are given in -the -pcreposix -documentation. -
      -  PCRE_CONFIG_PARENS_LIMIT
      -
      -The output is a long integer that gives the maximum depth of nesting of -parentheses (of any kind) in a pattern. This limit is imposed to cap the amount -of system stack used when a pattern is compiled. It is specified when PCRE is -built; the default is 250. This limit does not take into account the stack that -may already be used by the calling application. For finer control over -compilation stack usage, you can set a pointer to an external checking function -in pcre_stack_guard. -
      -  PCRE_CONFIG_MATCH_LIMIT
      -
      -The output is a long integer that gives the default limit for the number of -internal matching function calls in a pcre_exec() execution. Further -details are given with pcre_exec() below. -
      -  PCRE_CONFIG_MATCH_LIMIT_RECURSION
      -
      -The output is a long integer that gives the default limit for the depth of -recursion when calling the internal matching function in a pcre_exec() -execution. Further details are given with pcre_exec() below. -
      -  PCRE_CONFIG_STACKRECURSE
      -
      -The output is an integer that is set to one if internal recursion when running -pcre_exec() is implemented by recursive function calls that use the stack -to remember their state. This is the usual way that PCRE is compiled. The -output is zero if PCRE was compiled to use blocks of data on the heap instead -of recursive function calls. In this case, pcre_stack_malloc and -pcre_stack_free are called to manage memory blocks on the heap, thus -avoiding the use of the stack. -

      -
      COMPILING A PATTERN
      -

      -pcre *pcre_compile(const char *pattern, int options, - const char **errptr, int *erroffset, - const unsigned char *tableptr); -
      -
      -pcre *pcre_compile2(const char *pattern, int options, - int *errorcodeptr, - const char **errptr, int *erroffset, - const unsigned char *tableptr); -

      -

      -Either of the functions pcre_compile() or pcre_compile2() can be -called to compile a pattern into an internal form. The only difference between -the two interfaces is that pcre_compile2() has an additional argument, -errorcodeptr, via which a numerical error code can be returned. To avoid -too much repetition, we refer just to pcre_compile() below, but the -information applies equally to pcre_compile2(). -

      -

      -The pattern is a C string terminated by a binary zero, and is passed in the -pattern argument. A pointer to a single block of memory that is obtained -via pcre_malloc is returned. This contains the compiled code and related -data. The pcre type is defined for the returned block; this is a typedef -for a structure whose contents are not externally defined. It is up to the -caller to free the memory (via pcre_free) when it is no longer required. -

      -

      -Although the compiled code of a PCRE regex is relocatable, that is, it does not -depend on memory location, the complete pcre data block is not -fully relocatable, because it may contain a copy of the tableptr -argument, which is an address (see below). -

      -

      -The options argument contains various bit settings that affect the -compilation. It should be zero if no options are required. The available -options are described below. Some of them (in particular, those that are -compatible with Perl, but some others as well) can also be set and unset from -within the pattern (see the detailed description in the -pcrepattern -documentation). For those options that can be different in different parts of -the pattern, the contents of the options argument specifies their -settings at the start of compilation and execution. The PCRE_ANCHORED, -PCRE_BSR_xxx, PCRE_NEWLINE_xxx, PCRE_NO_UTF8_CHECK, and -PCRE_NO_START_OPTIMIZE options can be set at the time of matching as well as at -compile time. -

      -

      -If errptr is NULL, pcre_compile() returns NULL immediately. -Otherwise, if compilation of a pattern fails, pcre_compile() returns -NULL, and sets the variable pointed to by errptr to point to a textual -error message. This is a static string that is part of the library. You must -not try to free it. Normally, the offset from the start of the pattern to the -data unit that was being processed when the error was discovered is placed in -the variable pointed to by erroffset, which must not be NULL (if it is, -an immediate error is given). However, for an invalid UTF-8 or UTF-16 string, -the offset is that of the first data unit of the failing character. -

      -

      -Some errors are not detected until the whole pattern has been scanned; in these -cases, the offset passed back is the length of the pattern. Note that the -offset is in data units, not characters, even in a UTF mode. It may sometimes -point into the middle of a UTF-8 or UTF-16 character. -

      -

      -If pcre_compile2() is used instead of pcre_compile(), and the -errorcodeptr argument is not NULL, a non-zero error code number is -returned via this argument in the event of an error. This is in addition to the -textual error message. Error codes and messages are listed below. -

      -

      -If the final argument, tableptr, is NULL, PCRE uses a default set of -character tables that are built when PCRE is compiled, using the default C -locale. Otherwise, tableptr must be an address that is the result of a -call to pcre_maketables(). This value is stored with the compiled -pattern, and used again by pcre_exec() and pcre_dfa_exec() when the -pattern is matched. For more discussion, see the section on locale support -below. -

      -

      -This code fragment shows a typical straightforward call to pcre_compile(): -

      -  pcre *re;
      -  const char *error;
      -  int erroffset;
      -  re = pcre_compile(
      -    "^A.*Z",          /* the pattern */
      -    0,                /* default options */
      -    &error,           /* for error message */
      -    &erroffset,       /* for error offset */
      -    NULL);            /* use default character tables */
      -
      -The following names for option bits are defined in the pcre.h header -file: -
      -  PCRE_ANCHORED
      -
      -If this bit is set, the pattern is forced to be "anchored", that is, it is -constrained to match only at the first matching point in the string that is -being searched (the "subject string"). This effect can also be achieved by -appropriate constructs in the pattern itself, which is the only way to do it in -Perl. -
      -  PCRE_AUTO_CALLOUT
      -
      -If this bit is set, pcre_compile() automatically inserts callout items, -all with number 255, before each pattern item. For discussion of the callout -facility, see the -pcrecallout -documentation. -
      -  PCRE_BSR_ANYCRLF
      -  PCRE_BSR_UNICODE
      -
      -These options (which are mutually exclusive) control what the \R escape -sequence matches. The choice is either to match only CR, LF, or CRLF, or to -match any Unicode newline sequence. The default is specified when PCRE is -built. It can be overridden from within the pattern, or by setting an option -when a compiled pattern is matched. -
      -  PCRE_CASELESS
      -
      -If this bit is set, letters in the pattern match both upper and lower case -letters. It is equivalent to Perl's /i option, and it can be changed within a -pattern by a (?i) option setting. In UTF-8 mode, PCRE always understands the -concept of case for characters whose values are less than 128, so caseless -matching is always possible. For characters with higher values, the concept of -case is supported if PCRE is compiled with Unicode property support, but not -otherwise. If you want to use caseless matching for characters 128 and above, -you must ensure that PCRE is compiled with Unicode property support as well as -with UTF-8 support. -
      -  PCRE_DOLLAR_ENDONLY
      -
      -If this bit is set, a dollar metacharacter in the pattern matches only at the -end of the subject string. Without this option, a dollar also matches -immediately before a newline at the end of the string (but not before any other -newlines). The PCRE_DOLLAR_ENDONLY option is ignored if PCRE_MULTILINE is set. -There is no equivalent to this option in Perl, and no way to set it within a -pattern. -
      -  PCRE_DOTALL
      -
      -If this bit is set, a dot metacharacter in the pattern matches a character of -any value, including one that indicates a newline. However, it only ever -matches one character, even if newlines are coded as CRLF. Without this option, -a dot does not match when the current position is at a newline. This option is -equivalent to Perl's /s option, and it can be changed within a pattern by a -(?s) option setting. A negative class such as [^a] always matches newline -characters, independent of the setting of this option. -
      -  PCRE_DUPNAMES
      -
      -If this bit is set, names used to identify capturing subpatterns need not be -unique. This can be helpful for certain types of pattern when it is known that -only one instance of the named subpattern can ever be matched. There are more -details of named subpatterns below; see also the -pcrepattern -documentation. -
      -  PCRE_EXTENDED
      -
      -If this bit is set, most white space characters in the pattern are totally -ignored except when escaped or inside a character class. However, white space -is not allowed within sequences such as (?> that introduce various -parenthesized subpatterns, nor within a numerical quantifier such as {1,3}. -However, ignorable white space is permitted between an item and a following -quantifier and between a quantifier and a following + that indicates -possessiveness. -

      -

      -White space did not used to include the VT character (code 11), because Perl -did not treat this character as white space. However, Perl changed at release -5.18, so PCRE followed at release 8.34, and VT is now treated as white space. -

      -

      -PCRE_EXTENDED also causes characters between an unescaped # outside a character -class and the next newline, inclusive, to be ignored. PCRE_EXTENDED is -equivalent to Perl's /x option, and it can be changed within a pattern by a -(?x) option setting. -

      -

      -Which characters are interpreted as newlines is controlled by the options -passed to pcre_compile() or by a special sequence at the start of the -pattern, as described in the section entitled -"Newline conventions" -in the pcrepattern documentation. Note that the end of this type of -comment is a literal newline sequence in the pattern; escape sequences that -happen to represent a newline do not count. -

      -

      -This option makes it possible to include comments inside complicated patterns. -Note, however, that this applies only to data characters. White space characters -may never appear within special character sequences in a pattern, for example -within the sequence (?( that introduces a conditional subpattern. -

      -  PCRE_EXTRA
      -
      -This option was invented in order to turn on additional functionality of PCRE -that is incompatible with Perl, but it is currently of very little use. When -set, any backslash in a pattern that is followed by a letter that has no -special meaning causes an error, thus reserving these combinations for future -expansion. By default, as in Perl, a backslash followed by a letter with no -special meaning is treated as a literal. (Perl can, however, be persuaded to -give an error for this, by running it with the -w option.) There are at present -no other features controlled by this option. It can also be set by a (?X) -option setting within a pattern. -
      -  PCRE_FIRSTLINE
      -
      -If this option is set, an unanchored pattern is required to match before or at -the first newline in the subject string, though the matched text may continue -over the newline. -
      -  PCRE_JAVASCRIPT_COMPAT
      -
      -If this option is set, PCRE's behaviour is changed in some ways so that it is -compatible with JavaScript rather than Perl. The changes are as follows: -

      -

      -(1) A lone closing square bracket in a pattern causes a compile-time error, -because this is illegal in JavaScript (by default it is treated as a data -character). Thus, the pattern AB]CD becomes illegal when this option is set. -

      -

      -(2) At run time, a back reference to an unset subpattern group matches an empty -string (by default this causes the current matching alternative to fail). A -pattern such as (\1)(a) succeeds when this option is set (assuming it can find -an "a" in the subject), whereas it fails by default, for Perl compatibility. -

      -

      -(3) \U matches an upper case "U" character; by default \U causes a compile -time error (Perl uses \U to upper case subsequent characters). -

      -

      -(4) \u matches a lower case "u" character unless it is followed by four -hexadecimal digits, in which case the hexadecimal number defines the code point -to match. By default, \u causes a compile time error (Perl uses it to upper -case the following character). -

      -

      -(5) \x matches a lower case "x" character unless it is followed by two -hexadecimal digits, in which case the hexadecimal number defines the code point -to match. By default, as in Perl, a hexadecimal number is always expected after -\x, but it may have zero, one, or two digits (so, for example, \xz matches a -binary zero character followed by z). -

      -  PCRE_MULTILINE
      -
      -By default, for the purposes of matching "start of line" and "end of line", -PCRE treats the subject string as consisting of a single line of characters, -even if it actually contains newlines. The "start of line" metacharacter (^) -matches only at the start of the string, and the "end of line" metacharacter -($) matches only at the end of the string, or before a terminating newline -(except when PCRE_DOLLAR_ENDONLY is set). Note, however, that unless -PCRE_DOTALL is set, the "any character" metacharacter (.) does not match at a -newline. This behaviour (for ^, $, and dot) is the same as Perl. -

      -

      -When PCRE_MULTILINE it is set, the "start of line" and "end of line" constructs -match immediately following or immediately before internal newlines in the -subject string, respectively, as well as at the very start and end. This is -equivalent to Perl's /m option, and it can be changed within a pattern by a -(?m) option setting. If there are no newlines in a subject string, or no -occurrences of ^ or $ in a pattern, setting PCRE_MULTILINE has no effect. -

      -  PCRE_NEVER_UTF
      -
      -This option locks out interpretation of the pattern as UTF-8 (or UTF-16 or -UTF-32 in the 16-bit and 32-bit libraries). In particular, it prevents the -creator of the pattern from switching to UTF interpretation by starting the -pattern with (*UTF). This may be useful in applications that process patterns -from external sources. The combination of PCRE_UTF8 and PCRE_NEVER_UTF also -causes an error. -
      -  PCRE_NEWLINE_CR
      -  PCRE_NEWLINE_LF
      -  PCRE_NEWLINE_CRLF
      -  PCRE_NEWLINE_ANYCRLF
      -  PCRE_NEWLINE_ANY
      -
      -These options override the default newline definition that was chosen when PCRE -was built. Setting the first or the second specifies that a newline is -indicated by a single character (CR or LF, respectively). Setting -PCRE_NEWLINE_CRLF specifies that a newline is indicated by the two-character -CRLF sequence. Setting PCRE_NEWLINE_ANYCRLF specifies that any of the three -preceding sequences should be recognized. Setting PCRE_NEWLINE_ANY specifies -that any Unicode newline sequence should be recognized. -

      -

      -In an ASCII/Unicode environment, the Unicode newline sequences are the three -just mentioned, plus the single characters VT (vertical tab, U+000B), FF (form -feed, U+000C), NEL (next line, U+0085), LS (line separator, U+2028), and PS -(paragraph separator, U+2029). For the 8-bit library, the last two are -recognized only in UTF-8 mode. -

      -

      -When PCRE is compiled to run in an EBCDIC (mainframe) environment, the code for -CR is 0x0d, the same as ASCII. However, the character code for LF is normally -0x15, though in some EBCDIC environments 0x25 is used. Whichever of these is -not LF is made to correspond to Unicode's NEL character. EBCDIC codes are all -less than 256. For more details, see the -pcrebuild -documentation. -

      -

      -The newline setting in the options word uses three bits that are treated -as a number, giving eight possibilities. Currently only six are used (default -plus the five values above). This means that if you set more than one newline -option, the combination may or may not be sensible. For example, -PCRE_NEWLINE_CR with PCRE_NEWLINE_LF is equivalent to PCRE_NEWLINE_CRLF, but -other combinations may yield unused numbers and cause an error. -

      -

      -The only time that a line break in a pattern is specially recognized when -compiling is when PCRE_EXTENDED is set. CR and LF are white space characters, -and so are ignored in this mode. Also, an unescaped # outside a character class -indicates a comment that lasts until after the next line break sequence. In -other circumstances, line break sequences in patterns are treated as literal -data. -

      -

      -The newline option that is set at compile time becomes the default that is used -for pcre_exec() and pcre_dfa_exec(), but it can be overridden. -

      -  PCRE_NO_AUTO_CAPTURE
      -
      -If this option is set, it disables the use of numbered capturing parentheses in -the pattern. Any opening parenthesis that is not followed by ? behaves as if it -were followed by ?: but named parentheses can still be used for capturing (and -they acquire numbers in the usual way). There is no equivalent of this option -in Perl. -
      -  PCRE_NO_AUTO_POSSESS
      -
      -If this option is set, it disables "auto-possessification". This is an -optimization that, for example, turns a+b into a++b in order to avoid -backtracks into a+ that can never be successful. However, if callouts are in -use, auto-possessification means that some of them are never taken. You can set -this option if you want the matching functions to do a full unoptimized search -and run all the callouts, but it is mainly provided for testing purposes. -
      -  PCRE_NO_START_OPTIMIZE
      -
      -This is an option that acts at matching time; that is, it is really an option -for pcre_exec() or pcre_dfa_exec(). If it is set at compile time, -it is remembered with the compiled pattern and assumed at matching time. This -is necessary if you want to use JIT execution, because the JIT compiler needs -to know whether or not this option is set. For details see the discussion of -PCRE_NO_START_OPTIMIZE -below. -
      -  PCRE_UCP
      -
      -This option changes the way PCRE processes \B, \b, \D, \d, \S, \s, \W, -\w, and some of the POSIX character classes. By default, only ASCII characters -are recognized, but if PCRE_UCP is set, Unicode properties are used instead to -classify characters. More details are given in the section on -generic character types -in the -pcrepattern -page. If you set PCRE_UCP, matching one of the items it affects takes much -longer. The option is available only if PCRE has been compiled with Unicode -property support. -
      -  PCRE_UNGREEDY
      -
      -This option inverts the "greediness" of the quantifiers so that they are not -greedy by default, but become greedy if followed by "?". It is not compatible -with Perl. It can also be set by a (?U) option setting within the pattern. -
      -  PCRE_UTF8
      -
      -This option causes PCRE to regard both the pattern and the subject as strings -of UTF-8 characters instead of single-byte strings. However, it is available -only when PCRE is built to include UTF support. If not, the use of this option -provokes an error. Details of how this option changes the behaviour of PCRE are -given in the -pcreunicode -page. -
      -  PCRE_NO_UTF8_CHECK
      -
      -When PCRE_UTF8 is set, the validity of the pattern as a UTF-8 string is -automatically checked. There is a discussion about the -validity of UTF-8 strings -in the -pcreunicode -page. If an invalid UTF-8 sequence is found, pcre_compile() returns an -error. If you already know that your pattern is valid, and you want to skip -this check for performance reasons, you can set the PCRE_NO_UTF8_CHECK option. -When it is set, the effect of passing an invalid UTF-8 string as a pattern is -undefined. It may cause your program to crash or loop. Note that this option -can also be passed to pcre_exec() and pcre_dfa_exec(), to suppress -the validity checking of subject strings only. If the same string is being -matched many times, the option can be safely set for the second and subsequent -matchings to improve performance. -

      -
      COMPILATION ERROR CODES
      -

      -The following table lists the error codes than may be returned by -pcre_compile2(), along with the error messages that may be returned by -both compiling functions. Note that error messages are always 8-bit ASCII -strings, even in 16-bit or 32-bit mode. As PCRE has developed, some error codes -have fallen out of use. To avoid confusion, they have not been re-used. -

      -   0  no error
      -   1  \ at end of pattern
      -   2  \c at end of pattern
      -   3  unrecognized character follows \
      -   4  numbers out of order in {} quantifier
      -   5  number too big in {} quantifier
      -   6  missing terminating ] for character class
      -   7  invalid escape sequence in character class
      -   8  range out of order in character class
      -   9  nothing to repeat
      -  10  [this code is not in use]
      -  11  internal error: unexpected repeat
      -  12  unrecognized character after (? or (?-
      -  13  POSIX named classes are supported only within a class
      -  14  missing )
      -  15  reference to non-existent subpattern
      -  16  erroffset passed as NULL
      -  17  unknown option bit(s) set
      -  18  missing ) after comment
      -  19  [this code is not in use]
      -  20  regular expression is too large
      -  21  failed to get memory
      -  22  unmatched parentheses
      -  23  internal error: code overflow
      -  24  unrecognized character after (?<
      -  25  lookbehind assertion is not fixed length
      -  26  malformed number or name after (?(
      -  27  conditional group contains more than two branches
      -  28  assertion expected after (?(
      -  29  (?R or (?[+-]digits must be followed by )
      -  30  unknown POSIX class name
      -  31  POSIX collating elements are not supported
      -  32  this version of PCRE is compiled without UTF support
      -  33  [this code is not in use]
      -  34  character value in \x{} or \o{} is too large
      -  35  invalid condition (?(0)
      -  36  \C not allowed in lookbehind assertion
      -  37  PCRE does not support \L, \l, \N{name}, \U, or \u
      -  38  number after (?C is > 255
      -  39  closing ) for (?C expected
      -  40  recursive call could loop indefinitely
      -  41  unrecognized character after (?P
      -  42  syntax error in subpattern name (missing terminator)
      -  43  two named subpatterns have the same name
      -  44  invalid UTF-8 string (specifically UTF-8)
      -  45  support for \P, \p, and \X has not been compiled
      -  46  malformed \P or \p sequence
      -  47  unknown property name after \P or \p
      -  48  subpattern name is too long (maximum 32 characters)
      -  49  too many named subpatterns (maximum 10000)
      -  50  [this code is not in use]
      -  51  octal value is greater than \377 in 8-bit non-UTF-8 mode
      -  52  internal error: overran compiling workspace
      -  53  internal error: previously-checked referenced subpattern
      -        not found
      -  54  DEFINE group contains more than one branch
      -  55  repeating a DEFINE group is not allowed
      -  56  inconsistent NEWLINE options
      -  57  \g is not followed by a braced, angle-bracketed, or quoted
      -        name/number or by a plain number
      -  58  a numbered reference must not be zero
      -  59  an argument is not allowed for (*ACCEPT), (*FAIL), or (*COMMIT)
      -  60  (*VERB) not recognized or malformed
      -  61  number is too big
      -  62  subpattern name expected
      -  63  digit expected after (?+
      -  64  ] is an invalid data character in JavaScript compatibility mode
      -  65  different names for subpatterns of the same number are
      -        not allowed
      -  66  (*MARK) must have an argument
      -  67  this version of PCRE is not compiled with Unicode property
      -        support
      -  68  \c must be followed by an ASCII character
      -  69  \k is not followed by a braced, angle-bracketed, or quoted name
      -  70  internal error: unknown opcode in find_fixedlength()
      -  71  \N is not supported in a class
      -  72  too many forward references
      -  73  disallowed Unicode code point (>= 0xd800 && <= 0xdfff)
      -  74  invalid UTF-16 string (specifically UTF-16)
      -  75  name is too long in (*MARK), (*PRUNE), (*SKIP), or (*THEN)
      -  76  character value in \u.... sequence is too large
      -  77  invalid UTF-32 string (specifically UTF-32)
      -  78  setting UTF is disabled by the application
      -  79  non-hex character in \x{} (closing brace missing?)
      -  80  non-octal character in \o{} (closing brace missing?)
      -  81  missing opening brace after \o
      -  82  parentheses are too deeply nested
      -  83  invalid range in character class
      -  84  group name must start with a non-digit
      -  85  parentheses are too deeply nested (stack check)
      -
      -The numbers 32 and 10000 in errors 48 and 49 are defaults; different values may -be used if the limits were changed when PCRE was built. -

      -
      STUDYING A PATTERN
      -

      -pcre_extra *pcre_study(const pcre *code, int options, - const char **errptr); -

      -

      -If a compiled pattern is going to be used several times, it is worth spending -more time analyzing it in order to speed up the time taken for matching. The -function pcre_study() takes a pointer to a compiled pattern as its first -argument. If studying the pattern produces additional information that will -help speed up matching, pcre_study() returns a pointer to a -pcre_extra block, in which the study_data field points to the -results of the study. -

      -

      -The returned value from pcre_study() can be passed directly to -pcre_exec() or pcre_dfa_exec(). However, a pcre_extra block -also contains other fields that can be set by the caller before the block is -passed; these are described -below -in the section on matching a pattern. -

      -

      -If studying the pattern does not produce any useful information, -pcre_study() returns NULL by default. In that circumstance, if the -calling program wants to pass any of the other fields to pcre_exec() or -pcre_dfa_exec(), it must set up its own pcre_extra block. However, -if pcre_study() is called with the PCRE_STUDY_EXTRA_NEEDED option, it -returns a pcre_extra block even if studying did not find any additional -information. It may still return NULL, however, if an error occurs in -pcre_study(). -

      -

      -The second argument of pcre_study() contains option bits. There are three -further options in addition to PCRE_STUDY_EXTRA_NEEDED: -

      -  PCRE_STUDY_JIT_COMPILE
      -  PCRE_STUDY_JIT_PARTIAL_HARD_COMPILE
      -  PCRE_STUDY_JIT_PARTIAL_SOFT_COMPILE
      -
      -If any of these are set, and the just-in-time compiler is available, the -pattern is further compiled into machine code that executes much faster than -the pcre_exec() interpretive matching function. If the just-in-time -compiler is not available, these options are ignored. All undefined bits in the -options argument must be zero. -

      -

      -JIT compilation is a heavyweight optimization. It can take some time for -patterns to be analyzed, and for one-off matches and simple patterns the -benefit of faster execution might be offset by a much slower study time. -Not all patterns can be optimized by the JIT compiler. For those that cannot be -handled, matching automatically falls back to the pcre_exec() -interpreter. For more details, see the -pcrejit -documentation. -

      -

      -The third argument for pcre_study() is a pointer for an error message. If -studying succeeds (even if no data is returned), the variable it points to is -set to NULL. Otherwise it is set to point to a textual error message. This is a -static string that is part of the library. You must not try to free it. You -should test the error pointer for NULL after calling pcre_study(), to be -sure that it has run successfully. -

      -

      -When you are finished with a pattern, you can free the memory used for the -study data by calling pcre_free_study(). This function was added to the -API for release 8.20. For earlier versions, the memory could be freed with -pcre_free(), just like the pattern itself. This will still work in cases -where JIT optimization is not used, but it is advisable to change to the new -function when convenient. -

      -

      -This is a typical way in which pcre_study() is used (except that in a -real application there should be tests for errors): -

      -  int rc;
      -  pcre *re;
      -  pcre_extra *sd;
      -  re = pcre_compile("pattern", 0, &error, &erroroffset, NULL);
      -  sd = pcre_study(
      -    re,             /* result of pcre_compile() */
      -    0,              /* no options */
      -    &error);        /* set to NULL or points to a message */
      -  rc = pcre_exec(   /* see below for details of pcre_exec() options */
      -    re, sd, "subject", 7, 0, 0, ovector, 30);
      -  ...
      -  pcre_free_study(sd);
      -  pcre_free(re);
      -
      -Studying a pattern does two things: first, a lower bound for the length of -subject string that is needed to match the pattern is computed. This does not -mean that there are any strings of that length that match, but it does -guarantee that no shorter strings match. The value is used to avoid wasting -time by trying to match strings that are shorter than the lower bound. You can -find out the value in a calling program via the pcre_fullinfo() function. -

      -

      -Studying a pattern is also useful for non-anchored patterns that do not have a -single fixed starting character. A bitmap of possible starting bytes is -created. This speeds up finding a position in the subject at which to start -matching. (In 16-bit mode, the bitmap is used for 16-bit values less than 256. -In 32-bit mode, the bitmap is used for 32-bit values less than 256.) -

      -

      -These two optimizations apply to both pcre_exec() and -pcre_dfa_exec(), and the information is also used by the JIT compiler. -The optimizations can be disabled by setting the PCRE_NO_START_OPTIMIZE option. -You might want to do this if your pattern contains callouts or (*MARK) and you -want to make use of these facilities in cases where matching fails. -

      -

      -PCRE_NO_START_OPTIMIZE can be specified at either compile time or execution -time. However, if PCRE_NO_START_OPTIMIZE is passed to pcre_exec(), (that -is, after any JIT compilation has happened) JIT execution is disabled. For JIT -execution to work with PCRE_NO_START_OPTIMIZE, the option must be set at -compile time. -

      -

      -There is a longer discussion of PCRE_NO_START_OPTIMIZE -below. -

      -
      LOCALE SUPPORT
      -

      -PCRE handles caseless matching, and determines whether characters are letters, -digits, or whatever, by reference to a set of tables, indexed by character -code point. When running in UTF-8 mode, or in the 16- or 32-bit libraries, this -applies only to characters with code points less than 256. By default, -higher-valued code points never match escapes such as \w or \d. However, if -PCRE is built with Unicode property support, all characters can be tested with -\p and \P, or, alternatively, the PCRE_UCP option can be set when a pattern -is compiled; this causes \w and friends to use Unicode property support -instead of the built-in tables. -

      -

      -The use of locales with Unicode is discouraged. If you are handling characters -with code points greater than 128, you should either use Unicode support, or -use locales, but not try to mix the two. -

      -

      -PCRE contains an internal set of tables that are used when the final argument -of pcre_compile() is NULL. These are sufficient for many applications. -Normally, the internal tables recognize only ASCII characters. However, when -PCRE is built, it is possible to cause the internal tables to be rebuilt in the -default "C" locale of the local system, which may cause them to be different. -

      -

      -The internal tables can always be overridden by tables supplied by the -application that calls PCRE. These may be created in a different locale from -the default. As more and more applications change to using Unicode, the need -for this locale support is expected to die away. -

      -

      -External tables are built by calling the pcre_maketables() function, -which has no arguments, in the relevant locale. The result can then be passed -to pcre_compile() as often as necessary. For example, to build and use -tables that are appropriate for the French locale (where accented characters -with values greater than 128 are treated as letters), the following code could -be used: -

      -  setlocale(LC_CTYPE, "fr_FR");
      -  tables = pcre_maketables();
      -  re = pcre_compile(..., tables);
      -
      -The locale name "fr_FR" is used on Linux and other Unix-like systems; if you -are using Windows, the name for the French locale is "french". -

      -

      -When pcre_maketables() runs, the tables are built in memory that is -obtained via pcre_malloc. It is the caller's responsibility to ensure -that the memory containing the tables remains available for as long as it is -needed. -

      -

      -The pointer that is passed to pcre_compile() is saved with the compiled -pattern, and the same tables are used via this pointer by pcre_study() -and also by pcre_exec() and pcre_dfa_exec(). Thus, for any single -pattern, compilation, studying and matching all happen in the same locale, but -different patterns can be processed in different locales. -

      -

      -It is possible to pass a table pointer or NULL (indicating the use of the -internal tables) to pcre_exec() or pcre_dfa_exec() (see the -discussion below in the section on matching a pattern). This facility is -provided for use with pre-compiled patterns that have been saved and reloaded. -Character tables are not saved with patterns, so if a non-standard table was -used at compile time, it must be provided again when the reloaded pattern is -matched. Attempting to use this facility to match a pattern in a different -locale from the one in which it was compiled is likely to lead to anomalous -(usually incorrect) results. -

      -
      INFORMATION ABOUT A PATTERN
      -

      -int pcre_fullinfo(const pcre *code, const pcre_extra *extra, - int what, void *where); -

      -

      -The pcre_fullinfo() function returns information about a compiled -pattern. It replaces the pcre_info() function, which was removed from the -library at version 8.30, after more than 10 years of obsolescence. -

      -

      -The first argument for pcre_fullinfo() is a pointer to the compiled -pattern. The second argument is the result of pcre_study(), or NULL if -the pattern was not studied. The third argument specifies which piece of -information is required, and the fourth argument is a pointer to a variable -to receive the data. The yield of the function is zero for success, or one of -the following negative numbers: -

      -  PCRE_ERROR_NULL           the argument code was NULL
      -                            the argument where was NULL
      -  PCRE_ERROR_BADMAGIC       the "magic number" was not found
      -  PCRE_ERROR_BADENDIANNESS  the pattern was compiled with different
      -                            endianness
      -  PCRE_ERROR_BADOPTION      the value of what was invalid
      -  PCRE_ERROR_UNSET          the requested field is not set
      -
      -The "magic number" is placed at the start of each compiled pattern as an simple -check against passing an arbitrary memory pointer. The endianness error can -occur if a compiled pattern is saved and reloaded on a different host. Here is -a typical call of pcre_fullinfo(), to obtain the length of the compiled -pattern: -
      -  int rc;
      -  size_t length;
      -  rc = pcre_fullinfo(
      -    re,               /* result of pcre_compile() */
      -    sd,               /* result of pcre_study(), or NULL */
      -    PCRE_INFO_SIZE,   /* what is required */
      -    &length);         /* where to put the data */
      -
      -The possible values for the third argument are defined in pcre.h, and are -as follows: -
      -  PCRE_INFO_BACKREFMAX
      -
      -Return the number of the highest back reference in the pattern. The fourth -argument should point to an int variable. Zero is returned if there are -no back references. -
      -  PCRE_INFO_CAPTURECOUNT
      -
      -Return the number of capturing subpatterns in the pattern. The fourth argument -should point to an int variable. -
      -  PCRE_INFO_DEFAULT_TABLES
      -
      -Return a pointer to the internal default character tables within PCRE. The -fourth argument should point to an unsigned char * variable. This -information call is provided for internal use by the pcre_study() -function. External callers can cause PCRE to use its internal tables by passing -a NULL table pointer. -
      -  PCRE_INFO_FIRSTBYTE (deprecated)
      -
      -Return information about the first data unit of any matched string, for a -non-anchored pattern. The name of this option refers to the 8-bit library, -where data units are bytes. The fourth argument should point to an int -variable. Negative values are used for special cases. However, this means that -when the 32-bit library is in non-UTF-32 mode, the full 32-bit range of -characters cannot be returned. For this reason, this value is deprecated; use -PCRE_INFO_FIRSTCHARACTERFLAGS and PCRE_INFO_FIRSTCHARACTER instead. -

      -

      -If there is a fixed first value, for example, the letter "c" from a pattern -such as (cat|cow|coyote), its value is returned. In the 8-bit library, the -value is always less than 256. In the 16-bit library the value can be up to -0xffff. In the 32-bit library the value can be up to 0x10ffff. -

      -

      -If there is no fixed first value, and if either -
      -
      -(a) the pattern was compiled with the PCRE_MULTILINE option, and every branch -starts with "^", or -
      -
      -(b) every branch of the pattern starts with ".*" and PCRE_DOTALL is not set -(if it were set, the pattern would be anchored), -
      -
      --1 is returned, indicating that the pattern matches only at the start of a -subject string or after any newline within the string. Otherwise -2 is -returned. For anchored patterns, -2 is returned. -

      -  PCRE_INFO_FIRSTCHARACTER
      -
      -Return the value of the first data unit (non-UTF character) of any matched -string in the situation where PCRE_INFO_FIRSTCHARACTERFLAGS returns 1; -otherwise return 0. The fourth argument should point to an uint_t -variable. -

      -

      -In the 8-bit library, the value is always less than 256. In the 16-bit library -the value can be up to 0xffff. In the 32-bit library in UTF-32 mode the value -can be up to 0x10ffff, and up to 0xffffffff when not using UTF-32 mode. -

      -  PCRE_INFO_FIRSTCHARACTERFLAGS
      -
      -Return information about the first data unit of any matched string, for a -non-anchored pattern. The fourth argument should point to an int -variable. -

      -

      -If there is a fixed first value, for example, the letter "c" from a pattern -such as (cat|cow|coyote), 1 is returned, and the character value can be -retrieved using PCRE_INFO_FIRSTCHARACTER. If there is no fixed first value, and -if either -
      -
      -(a) the pattern was compiled with the PCRE_MULTILINE option, and every branch -starts with "^", or -
      -
      -(b) every branch of the pattern starts with ".*" and PCRE_DOTALL is not set -(if it were set, the pattern would be anchored), -
      -
      -2 is returned, indicating that the pattern matches only at the start of a -subject string or after any newline within the string. Otherwise 0 is -returned. For anchored patterns, 0 is returned. -

      -  PCRE_INFO_FIRSTTABLE
      -
      -If the pattern was studied, and this resulted in the construction of a 256-bit -table indicating a fixed set of values for the first data unit in any matching -string, a pointer to the table is returned. Otherwise NULL is returned. The -fourth argument should point to an unsigned char * variable. -
      -  PCRE_INFO_HASCRORLF
      -
      -Return 1 if the pattern contains any explicit matches for CR or LF characters, -otherwise 0. The fourth argument should point to an int variable. An -explicit match is either a literal CR or LF character, or \r or \n. -
      -  PCRE_INFO_JCHANGED
      -
      -Return 1 if the (?J) or (?-J) option setting is used in the pattern, otherwise -0. The fourth argument should point to an int variable. (?J) and -(?-J) set and unset the local PCRE_DUPNAMES option, respectively. -
      -  PCRE_INFO_JIT
      -
      -Return 1 if the pattern was studied with one of the JIT options, and -just-in-time compiling was successful. The fourth argument should point to an -int variable. A return value of 0 means that JIT support is not available -in this version of PCRE, or that the pattern was not studied with a JIT option, -or that the JIT compiler could not handle this particular pattern. See the -pcrejit -documentation for details of what can and cannot be handled. -
      -  PCRE_INFO_JITSIZE
      -
      -If the pattern was successfully studied with a JIT option, return the size of -the JIT compiled code, otherwise return zero. The fourth argument should point -to a size_t variable. -
      -  PCRE_INFO_LASTLITERAL
      -
      -Return the value of the rightmost literal data unit that must exist in any -matched string, other than at its start, if such a value has been recorded. The -fourth argument should point to an int variable. If there is no such -value, -1 is returned. For anchored patterns, a last literal value is recorded -only if it follows something of variable length. For example, for the pattern -/^a\d+z\d+/ the returned value is "z", but for /^a\dz\d/ the returned value -is -1. -

      -

      -Since for the 32-bit library using the non-UTF-32 mode, this function is unable -to return the full 32-bit range of characters, this value is deprecated; -instead the PCRE_INFO_REQUIREDCHARFLAGS and PCRE_INFO_REQUIREDCHAR values should -be used. -

      -  PCRE_INFO_MATCH_EMPTY
      -
      -Return 1 if the pattern can match an empty string, otherwise 0. The fourth -argument should point to an int variable. -
      -  PCRE_INFO_MATCHLIMIT
      -
      -If the pattern set a match limit by including an item of the form -(*LIMIT_MATCH=nnnn) at the start, the value is returned. The fourth argument -should point to an unsigned 32-bit integer. If no such value has been set, the -call to pcre_fullinfo() returns the error PCRE_ERROR_UNSET. -
      -  PCRE_INFO_MAXLOOKBEHIND
      -
      -Return the number of characters (NB not data units) in the longest lookbehind -assertion in the pattern. This information is useful when doing multi-segment -matching using the partial matching facilities. Note that the simple assertions -\b and \B require a one-character lookbehind. \A also registers a -one-character lookbehind, though it does not actually inspect the previous -character. This is to ensure that at least one character from the old segment -is retained when a new segment is processed. Otherwise, if there are no -lookbehinds in the pattern, \A might match incorrectly at the start of a new -segment. -
      -  PCRE_INFO_MINLENGTH
      -
      -If the pattern was studied and a minimum length for matching subject strings -was computed, its value is returned. Otherwise the returned value is -1. The -value is a number of characters, which in UTF mode may be different from the -number of data units. The fourth argument should point to an int -variable. A non-negative value is a lower bound to the length of any matching -string. There may not be any strings of that length that do actually match, but -every string that does match is at least that long. -
      -  PCRE_INFO_NAMECOUNT
      -  PCRE_INFO_NAMEENTRYSIZE
      -  PCRE_INFO_NAMETABLE
      -
      -PCRE supports the use of named as well as numbered capturing parentheses. The -names are just an additional way of identifying the parentheses, which still -acquire numbers. Several convenience functions such as -pcre_get_named_substring() are provided for extracting captured -substrings by name. It is also possible to extract the data directly, by first -converting the name to a number in order to access the correct pointers in the -output vector (described with pcre_exec() below). To do the conversion, -you need to use the name-to-number map, which is described by these three -values. -

      -

      -The map consists of a number of fixed-size entries. PCRE_INFO_NAMECOUNT gives -the number of entries, and PCRE_INFO_NAMEENTRYSIZE gives the size of each -entry; both of these return an int value. The entry size depends on the -length of the longest name. PCRE_INFO_NAMETABLE returns a pointer to the first -entry of the table. This is a pointer to char in the 8-bit library, where -the first two bytes of each entry are the number of the capturing parenthesis, -most significant byte first. In the 16-bit library, the pointer points to -16-bit data units, the first of which contains the parenthesis number. In the -32-bit library, the pointer points to 32-bit data units, the first of which -contains the parenthesis number. The rest of the entry is the corresponding -name, zero terminated. -

      -

      -The names are in alphabetical order. If (?| is used to create multiple groups -with the same number, as described in the -section on duplicate subpattern numbers -in the -pcrepattern -page, the groups may be given the same name, but there is only one entry in the -table. Different names for groups of the same number are not permitted. -Duplicate names for subpatterns with different numbers are permitted, -but only if PCRE_DUPNAMES is set. They appear in the table in the order in -which they were found in the pattern. In the absence of (?| this is the order -of increasing number; when (?| is used this is not necessarily the case because -later subpatterns may have lower numbers. -

      -

      -As a simple example of the name/number table, consider the following pattern -after compilation by the 8-bit library (assume PCRE_EXTENDED is set, so white -space - including newlines - is ignored): -

      -  (?<date> (?<year>(\d\d)?\d\d) - (?<month>\d\d) - (?<day>\d\d) )
      -
      -There are four named subpatterns, so the table has four entries, and each entry -in the table is eight bytes long. The table is as follows, with non-printing -bytes shows in hexadecimal, and undefined bytes shown as ??: -
      -  00 01 d  a  t  e  00 ??
      -  00 05 d  a  y  00 ?? ??
      -  00 04 m  o  n  t  h  00
      -  00 02 y  e  a  r  00 ??
      -
      -When writing code to extract data from named subpatterns using the -name-to-number map, remember that the length of the entries is likely to be -different for each compiled pattern. -
      -  PCRE_INFO_OKPARTIAL
      -
      -Return 1 if the pattern can be used for partial matching with -pcre_exec(), otherwise 0. The fourth argument should point to an -int variable. From release 8.00, this always returns 1, because the -restrictions that previously applied to partial matching have been lifted. The -pcrepartial -documentation gives details of partial matching. -
      -  PCRE_INFO_OPTIONS
      -
      -Return a copy of the options with which the pattern was compiled. The fourth -argument should point to an unsigned long int variable. These option bits -are those specified in the call to pcre_compile(), modified by any -top-level option settings at the start of the pattern itself. In other words, -they are the options that will be in force when matching starts. For example, -if the pattern /(?im)abc(?-i)d/ is compiled with the PCRE_EXTENDED option, the -result is PCRE_CASELESS, PCRE_MULTILINE, and PCRE_EXTENDED. -

      -

      -A pattern is automatically anchored by PCRE if all of its top-level -alternatives begin with one of the following: -

      -  ^     unless PCRE_MULTILINE is set
      -  \A    always
      -  \G    always
      -  .*    if PCRE_DOTALL is set and there are no back references to the subpattern in which .* appears
      -
      -For such patterns, the PCRE_ANCHORED bit is set in the options returned by -pcre_fullinfo(). -
      -  PCRE_INFO_RECURSIONLIMIT
      -
      -If the pattern set a recursion limit by including an item of the form -(*LIMIT_RECURSION=nnnn) at the start, the value is returned. The fourth -argument should point to an unsigned 32-bit integer. If no such value has been -set, the call to pcre_fullinfo() returns the error PCRE_ERROR_UNSET. -
      -  PCRE_INFO_SIZE
      -
      -Return the size of the compiled pattern in bytes (for all three libraries). The -fourth argument should point to a size_t variable. This value does not -include the size of the pcre structure that is returned by -pcre_compile(). The value that is passed as the argument to -pcre_malloc() when pcre_compile() is getting memory in which to -place the compiled data is the value returned by this option plus the size of -the pcre structure. Studying a compiled pattern, with or without JIT, -does not alter the value returned by this option. -
      -  PCRE_INFO_STUDYSIZE
      -
      -Return the size in bytes (for all three libraries) of the data block pointed to -by the study_data field in a pcre_extra block. If pcre_extra -is NULL, or there is no study data, zero is returned. The fourth argument -should point to a size_t variable. The study_data field is set by -pcre_study() to record information that will speed up matching (see the -section entitled -"Studying a pattern" -above). The format of the study_data block is private, but its length -is made available via this option so that it can be saved and restored (see the -pcreprecompile -documentation for details). -
      -  PCRE_INFO_REQUIREDCHARFLAGS
      -
      -Returns 1 if there is a rightmost literal data unit that must exist in any -matched string, other than at its start. The fourth argument should point to -an int variable. If there is no such value, 0 is returned. If returning -1, the character value itself can be retrieved using PCRE_INFO_REQUIREDCHAR. -

      -

      -For anchored patterns, a last literal value is recorded only if it follows -something of variable length. For example, for the pattern /^a\d+z\d+/ the -returned value 1 (with "z" returned from PCRE_INFO_REQUIREDCHAR), but for -/^a\dz\d/ the returned value is 0. -

      -  PCRE_INFO_REQUIREDCHAR
      -
      -Return the value of the rightmost literal data unit that must exist in any -matched string, other than at its start, if such a value has been recorded. The -fourth argument should point to an uint32_t variable. If there is no such -value, 0 is returned. -

      -
      REFERENCE COUNTS
      -

      -int pcre_refcount(pcre *code, int adjust); -

      -

      -The pcre_refcount() function is used to maintain a reference count in the -data block that contains a compiled pattern. It is provided for the benefit of -applications that operate in an object-oriented manner, where different parts -of the application may be using the same compiled pattern, but you want to free -the block when they are all done. -

      -

      -When a pattern is compiled, the reference count field is initialized to zero. -It is changed only by calling this function, whose action is to add the -adjust value (which may be positive or negative) to it. The yield of the -function is the new value. However, the value of the count is constrained to -lie between 0 and 65535, inclusive. If the new value is outside these limits, -it is forced to the appropriate limit value. -

      -

      -Except when it is zero, the reference count is not correctly preserved if a -pattern is compiled on one host and then transferred to a host whose byte-order -is different. (This seems a highly unlikely scenario.) -

      -
      MATCHING A PATTERN: THE TRADITIONAL FUNCTION
      -

      -int pcre_exec(const pcre *code, const pcre_extra *extra, - const char *subject, int length, int startoffset, - int options, int *ovector, int ovecsize); -

      -

      -The function pcre_exec() is called to match a subject string against a -compiled pattern, which is passed in the code argument. If the -pattern was studied, the result of the study should be passed in the -extra argument. You can call pcre_exec() with the same code -and extra arguments as many times as you like, in order to match -different subject strings with the same pattern. -

      -

      -This function is the main matching facility of the library, and it operates in -a Perl-like manner. For specialist use there is also an alternative matching -function, which is described -below -in the section about the pcre_dfa_exec() function. -

      -

      -In most applications, the pattern will have been compiled (and optionally -studied) in the same process that calls pcre_exec(). However, it is -possible to save compiled patterns and study data, and then use them later -in different processes, possibly even on different hosts. For a discussion -about this, see the -pcreprecompile -documentation. -

      -

      -Here is an example of a simple call to pcre_exec(): -

      -  int rc;
      -  int ovector[30];
      -  rc = pcre_exec(
      -    re,             /* result of pcre_compile() */
      -    NULL,           /* we didn't study the pattern */
      -    "some string",  /* the subject string */
      -    11,             /* the length of the subject string */
      -    0,              /* start at offset 0 in the subject */
      -    0,              /* default options */
      -    ovector,        /* vector of integers for substring information */
      -    30);            /* number of elements (NOT size in bytes) */
      -
      -

      -
      -Extra data for pcre_exec() -
      -

      -If the extra argument is not NULL, it must point to a pcre_extra -data block. The pcre_study() function returns such a block (when it -doesn't return NULL), but you can also create one for yourself, and pass -additional information in it. The pcre_extra block contains the following -fields (not necessarily in this order): -

      -  unsigned long int flags;
      -  void *study_data;
      -  void *executable_jit;
      -  unsigned long int match_limit;
      -  unsigned long int match_limit_recursion;
      -  void *callout_data;
      -  const unsigned char *tables;
      -  unsigned char **mark;
      -
      -In the 16-bit version of this structure, the mark field has type -"PCRE_UCHAR16 **". -
      -
      -In the 32-bit version of this structure, the mark field has type -"PCRE_UCHAR32 **". -

      -

      -The flags field is used to specify which of the other fields are set. The -flag bits are: -

      -  PCRE_EXTRA_CALLOUT_DATA
      -  PCRE_EXTRA_EXECUTABLE_JIT
      -  PCRE_EXTRA_MARK
      -  PCRE_EXTRA_MATCH_LIMIT
      -  PCRE_EXTRA_MATCH_LIMIT_RECURSION
      -  PCRE_EXTRA_STUDY_DATA
      -  PCRE_EXTRA_TABLES
      -
      -Other flag bits should be set to zero. The study_data field and sometimes -the executable_jit field are set in the pcre_extra block that is -returned by pcre_study(), together with the appropriate flag bits. You -should not set these yourself, but you may add to the block by setting other -fields and their corresponding flag bits. -

      -

      -The match_limit field provides a means of preventing PCRE from using up a -vast amount of resources when running patterns that are not going to match, -but which have a very large number of possibilities in their search trees. The -classic example is a pattern that uses nested unlimited repeats. -

      -

      -Internally, pcre_exec() uses a function called match(), which it -calls repeatedly (sometimes recursively). The limit set by match_limit is -imposed on the number of times this function is called during a match, which -has the effect of limiting the amount of backtracking that can take place. For -patterns that are not anchored, the count restarts from zero for each position -in the subject string. -

      -

      -When pcre_exec() is called with a pattern that was successfully studied -with a JIT option, the way that the matching is executed is entirely different. -However, there is still the possibility of runaway matching that goes on for a -very long time, and so the match_limit value is also used in this case -(but in a different way) to limit how long the matching can continue. -

      -

      -The default value for the limit can be set when PCRE is built; the default -default is 10 million, which handles all but the most extreme cases. You can -override the default by suppling pcre_exec() with a pcre_extra -block in which match_limit is set, and PCRE_EXTRA_MATCH_LIMIT is set in -the flags field. If the limit is exceeded, pcre_exec() returns -PCRE_ERROR_MATCHLIMIT. -

      -

      -A value for the match limit may also be supplied by an item at the start of a -pattern of the form -

      -  (*LIMIT_MATCH=d)
      -
      -where d is a decimal number. However, such a setting is ignored unless d is -less than the limit set by the caller of pcre_exec() or, if no such limit -is set, less than the default. -

      -

      -The match_limit_recursion field is similar to match_limit, but -instead of limiting the total number of times that match() is called, it -limits the depth of recursion. The recursion depth is a smaller number than the -total number of calls, because not all calls to match() are recursive. -This limit is of use only if it is set smaller than match_limit. -

      -

      -Limiting the recursion depth limits the amount of machine stack that can be -used, or, when PCRE has been compiled to use memory on the heap instead of the -stack, the amount of heap memory that can be used. This limit is not relevant, -and is ignored, when matching is done using JIT compiled code. -

      -

      -The default value for match_limit_recursion can be set when PCRE is -built; the default default is the same value as the default for -match_limit. You can override the default by suppling pcre_exec() -with a pcre_extra block in which match_limit_recursion is set, and -PCRE_EXTRA_MATCH_LIMIT_RECURSION is set in the flags field. If the limit -is exceeded, pcre_exec() returns PCRE_ERROR_RECURSIONLIMIT. -

      -

      -A value for the recursion limit may also be supplied by an item at the start of -a pattern of the form -

      -  (*LIMIT_RECURSION=d)
      -
      -where d is a decimal number. However, such a setting is ignored unless d is -less than the limit set by the caller of pcre_exec() or, if no such limit -is set, less than the default. -

      -

      -The callout_data field is used in conjunction with the "callout" feature, -and is described in the -pcrecallout -documentation. -

      -

      -The tables field is provided for use with patterns that have been -pre-compiled using custom character tables, saved to disc or elsewhere, and -then reloaded, because the tables that were used to compile a pattern are not -saved with it. See the -pcreprecompile -documentation for a discussion of saving compiled patterns for later use. If -NULL is passed using this mechanism, it forces PCRE's internal tables to be -used. -

      -

      -Warning: The tables that pcre_exec() uses must be the same as those -that were used when the pattern was compiled. If this is not the case, the -behaviour of pcre_exec() is undefined. Therefore, when a pattern is -compiled and matched in the same process, this field should never be set. In -this (the most common) case, the correct table pointer is automatically passed -with the compiled pattern from pcre_compile() to pcre_exec(). -

      -

      -If PCRE_EXTRA_MARK is set in the flags field, the mark field must -be set to point to a suitable variable. If the pattern contains any -backtracking control verbs such as (*MARK:NAME), and the execution ends up with -a name to pass back, a pointer to the name string (zero terminated) is placed -in the variable pointed to by the mark field. The names are within the -compiled pattern; if you wish to retain such a name you must copy it before -freeing the memory of a compiled pattern. If there is no name to pass back, the -variable pointed to by the mark field is set to NULL. For details of the -backtracking control verbs, see the section entitled -"Backtracking control" -in the -pcrepattern -documentation. -

      -
      -Option bits for pcre_exec() -
      -

      -The unused bits of the options argument for pcre_exec() must be -zero. The only bits that may be set are PCRE_ANCHORED, PCRE_NEWLINE_xxx, -PCRE_NOTBOL, PCRE_NOTEOL, PCRE_NOTEMPTY, PCRE_NOTEMPTY_ATSTART, -PCRE_NO_START_OPTIMIZE, PCRE_NO_UTF8_CHECK, PCRE_PARTIAL_HARD, and -PCRE_PARTIAL_SOFT. -

      -

      -If the pattern was successfully studied with one of the just-in-time (JIT) -compile options, the only supported options for JIT execution are -PCRE_NO_UTF8_CHECK, PCRE_NOTBOL, PCRE_NOTEOL, PCRE_NOTEMPTY, -PCRE_NOTEMPTY_ATSTART, PCRE_PARTIAL_HARD, and PCRE_PARTIAL_SOFT. If an -unsupported option is used, JIT execution is disabled and the normal -interpretive code in pcre_exec() is run. -

      -  PCRE_ANCHORED
      -
      -The PCRE_ANCHORED option limits pcre_exec() to matching at the first -matching position. If a pattern was compiled with PCRE_ANCHORED, or turned out -to be anchored by virtue of its contents, it cannot be made unachored at -matching time. -
      -  PCRE_BSR_ANYCRLF
      -  PCRE_BSR_UNICODE
      -
      -These options (which are mutually exclusive) control what the \R escape -sequence matches. The choice is either to match only CR, LF, or CRLF, or to -match any Unicode newline sequence. These options override the choice that was -made or defaulted when the pattern was compiled. -
      -  PCRE_NEWLINE_CR
      -  PCRE_NEWLINE_LF
      -  PCRE_NEWLINE_CRLF
      -  PCRE_NEWLINE_ANYCRLF
      -  PCRE_NEWLINE_ANY
      -
      -These options override the newline definition that was chosen or defaulted when -the pattern was compiled. For details, see the description of -pcre_compile() above. During matching, the newline choice affects the -behaviour of the dot, circumflex, and dollar metacharacters. It may also alter -the way the match position is advanced after a match failure for an unanchored -pattern. -

      -

      -When PCRE_NEWLINE_CRLF, PCRE_NEWLINE_ANYCRLF, or PCRE_NEWLINE_ANY is set, and a -match attempt for an unanchored pattern fails when the current position is at a -CRLF sequence, and the pattern contains no explicit matches for CR or LF -characters, the match position is advanced by two characters instead of one, in -other words, to after the CRLF. -

      -

      -The above rule is a compromise that makes the most common cases work as -expected. For example, if the pattern is .+A (and the PCRE_DOTALL option is not -set), it does not match the string "\r\nA" because, after failing at the -start, it skips both the CR and the LF before retrying. However, the pattern -[\r\n]A does match that string, because it contains an explicit CR or LF -reference, and so advances only by one character after the first failure. -

      -

      -An explicit match for CR of LF is either a literal appearance of one of those -characters, or one of the \r or \n escape sequences. Implicit matches such as -[^X] do not count, nor does \s (which includes CR and LF in the characters -that it matches). -

      -

      -Notwithstanding the above, anomalous effects may still occur when CRLF is a -valid newline sequence and explicit \r or \n escapes appear in the pattern. -

      -  PCRE_NOTBOL
      -
      -This option specifies that first character of the subject string is not the -beginning of a line, so the circumflex metacharacter should not match before -it. Setting this without PCRE_MULTILINE (at compile time) causes circumflex -never to match. This option affects only the behaviour of the circumflex -metacharacter. It does not affect \A. -
      -  PCRE_NOTEOL
      -
      -This option specifies that the end of the subject string is not the end of a -line, so the dollar metacharacter should not match it nor (except in multiline -mode) a newline immediately before it. Setting this without PCRE_MULTILINE (at -compile time) causes dollar never to match. This option affects only the -behaviour of the dollar metacharacter. It does not affect \Z or \z. -
      -  PCRE_NOTEMPTY
      -
      -An empty string is not considered to be a valid match if this option is set. If -there are alternatives in the pattern, they are tried. If all the alternatives -match the empty string, the entire match fails. For example, if the pattern -
      -  a?b?
      -
      -is applied to a string not beginning with "a" or "b", it matches an empty -string at the start of the subject. With PCRE_NOTEMPTY set, this match is not -valid, so PCRE searches further into the string for occurrences of "a" or "b". -
      -  PCRE_NOTEMPTY_ATSTART
      -
      -This is like PCRE_NOTEMPTY, except that an empty string match that is not at -the start of the subject is permitted. If the pattern is anchored, such a match -can occur only if the pattern contains \K. -

      -

      -Perl has no direct equivalent of PCRE_NOTEMPTY or PCRE_NOTEMPTY_ATSTART, but it -does make a special case of a pattern match of the empty string within its -split() function, and when using the /g modifier. It is possible to -emulate Perl's behaviour after matching a null string by first trying the match -again at the same offset with PCRE_NOTEMPTY_ATSTART and PCRE_ANCHORED, and then -if that fails, by advancing the starting offset (see below) and trying an -ordinary match again. There is some code that demonstrates how to do this in -the -pcredemo -sample program. In the most general case, you have to check to see if the -newline convention recognizes CRLF as a newline, and if so, and the current -character is CR followed by LF, advance the starting offset by two characters -instead of one. -

      -  PCRE_NO_START_OPTIMIZE
      -
      -There are a number of optimizations that pcre_exec() uses at the start of -a match, in order to speed up the process. For example, if it is known that an -unanchored match must start with a specific character, it searches the subject -for that character, and fails immediately if it cannot find it, without -actually running the main matching function. This means that a special item -such as (*COMMIT) at the start of a pattern is not considered until after a -suitable starting point for the match has been found. Also, when callouts or -(*MARK) items are in use, these "start-up" optimizations can cause them to be -skipped if the pattern is never actually used. The start-up optimizations are -in effect a pre-scan of the subject that takes place before the pattern is run. -

      -

      -The PCRE_NO_START_OPTIMIZE option disables the start-up optimizations, possibly -causing performance to suffer, but ensuring that in cases where the result is -"no match", the callouts do occur, and that items such as (*COMMIT) and (*MARK) -are considered at every possible starting position in the subject string. If -PCRE_NO_START_OPTIMIZE is set at compile time, it cannot be unset at matching -time. The use of PCRE_NO_START_OPTIMIZE at matching time (that is, passing it -to pcre_exec()) disables JIT execution; in this situation, matching is -always done using interpretively. -

      -

      -Setting PCRE_NO_START_OPTIMIZE can change the outcome of a matching operation. -Consider the pattern -

      -  (*COMMIT)ABC
      -
      -When this is compiled, PCRE records the fact that a match must start with the -character "A". Suppose the subject string is "DEFABC". The start-up -optimization scans along the subject, finds "A" and runs the first match -attempt from there. The (*COMMIT) item means that the pattern must match the -current starting position, which in this case, it does. However, if the same -match is run with PCRE_NO_START_OPTIMIZE set, the initial scan along the -subject string does not happen. The first match attempt is run starting from -"D" and when this fails, (*COMMIT) prevents any further matches being tried, so -the overall result is "no match". If the pattern is studied, more start-up -optimizations may be used. For example, a minimum length for the subject may be -recorded. Consider the pattern -
      -  (*MARK:A)(X|Y)
      -
      -The minimum length for a match is one character. If the subject is "ABC", there -will be attempts to match "ABC", "BC", "C", and then finally an empty string. -If the pattern is studied, the final attempt does not take place, because PCRE -knows that the subject is too short, and so the (*MARK) is never encountered. -In this case, studying the pattern does not affect the overall match result, -which is still "no match", but it does affect the auxiliary information that is -returned. -
      -  PCRE_NO_UTF8_CHECK
      -
      -When PCRE_UTF8 is set at compile time, the validity of the subject as a UTF-8 -string is automatically checked when pcre_exec() is subsequently called. -The entire string is checked before any other processing takes place. The value -of startoffset is also checked to ensure that it points to the start of a -UTF-8 character. There is a discussion about the -validity of UTF-8 strings -in the -pcreunicode -page. If an invalid sequence of bytes is found, pcre_exec() returns the -error PCRE_ERROR_BADUTF8 or, if PCRE_PARTIAL_HARD is set and the problem is a -truncated character at the end of the subject, PCRE_ERROR_SHORTUTF8. In both -cases, information about the precise nature of the error may also be returned -(see the descriptions of these errors in the section entitled \fIError return -values from\fP pcre_exec() -below). -If startoffset contains a value that does not point to the start of a -UTF-8 character (or to the end of the subject), PCRE_ERROR_BADUTF8_OFFSET is -returned. -

      -

      -If you already know that your subject is valid, and you want to skip these -checks for performance reasons, you can set the PCRE_NO_UTF8_CHECK option when -calling pcre_exec(). You might want to do this for the second and -subsequent calls to pcre_exec() if you are making repeated calls to find -all the matches in a single subject string. However, you should be sure that -the value of startoffset points to the start of a character (or the end -of the subject). When PCRE_NO_UTF8_CHECK is set, the effect of passing an -invalid string as a subject or an invalid value of startoffset is -undefined. Your program may crash or loop. -

      -  PCRE_PARTIAL_HARD
      -  PCRE_PARTIAL_SOFT
      -
      -These options turn on the partial matching feature. For backwards -compatibility, PCRE_PARTIAL is a synonym for PCRE_PARTIAL_SOFT. A partial match -occurs if the end of the subject string is reached successfully, but there are -not enough subject characters to complete the match. If this happens when -PCRE_PARTIAL_SOFT (but not PCRE_PARTIAL_HARD) is set, matching continues by -testing any remaining alternatives. Only if no complete match can be found is -PCRE_ERROR_PARTIAL returned instead of PCRE_ERROR_NOMATCH. In other words, -PCRE_PARTIAL_SOFT says that the caller is prepared to handle a partial match, -but only if no complete match can be found. -

      -

      -If PCRE_PARTIAL_HARD is set, it overrides PCRE_PARTIAL_SOFT. In this case, if a -partial match is found, pcre_exec() immediately returns -PCRE_ERROR_PARTIAL, without considering any other alternatives. In other words, -when PCRE_PARTIAL_HARD is set, a partial match is considered to be more -important that an alternative complete match. -

      -

      -In both cases, the portion of the string that was inspected when the partial -match was found is set as the first matching string. There is a more detailed -discussion of partial and multi-segment matching, with examples, in the -pcrepartial -documentation. -

      -
      -The string to be matched by pcre_exec() -
      -

      -The subject string is passed to pcre_exec() as a pointer in -subject, a length in length, and a starting offset in -startoffset. The units for length and startoffset are bytes -for the 8-bit library, 16-bit data items for the 16-bit library, and 32-bit -data items for the 32-bit library. -

      -

      -If startoffset is negative or greater than the length of the subject, -pcre_exec() returns PCRE_ERROR_BADOFFSET. When the starting offset is -zero, the search for a match starts at the beginning of the subject, and this -is by far the most common case. In UTF-8 or UTF-16 mode, the offset must point -to the start of a character, or the end of the subject (in UTF-32 mode, one -data unit equals one character, so all offsets are valid). Unlike the pattern -string, the subject may contain binary zeroes. -

      -

      -A non-zero starting offset is useful when searching for another match in the -same subject by calling pcre_exec() again after a previous success. -Setting startoffset differs from just passing over a shortened string and -setting PCRE_NOTBOL in the case of a pattern that begins with any kind of -lookbehind. For example, consider the pattern -

      -  \Biss\B
      -
      -which finds occurrences of "iss" in the middle of words. (\B matches only if -the current position in the subject is not a word boundary.) When applied to -the string "Mississipi" the first call to pcre_exec() finds the first -occurrence. If pcre_exec() is called again with just the remainder of the -subject, namely "issipi", it does not match, because \B is always false at the -start of the subject, which is deemed to be a word boundary. However, if -pcre_exec() is passed the entire string again, but with startoffset -set to 4, it finds the second occurrence of "iss" because it is able to look -behind the starting point to discover that it is preceded by a letter. -

      -

      -Finding all the matches in a subject is tricky when the pattern can match an -empty string. It is possible to emulate Perl's /g behaviour by first trying the -match again at the same offset, with the PCRE_NOTEMPTY_ATSTART and -PCRE_ANCHORED options, and then if that fails, advancing the starting offset -and trying an ordinary match again. There is some code that demonstrates how to -do this in the -pcredemo -sample program. In the most general case, you have to check to see if the -newline convention recognizes CRLF as a newline, and if so, and the current -character is CR followed by LF, advance the starting offset by two characters -instead of one. -

      -

      -If a non-zero starting offset is passed when the pattern is anchored, one -attempt to match at the given offset is made. This can only succeed if the -pattern does not require the match to be at the start of the subject. -

      -
      -How pcre_exec() returns captured substrings -
      -

      -In general, a pattern matches a certain portion of the subject, and in -addition, further substrings from the subject may be picked out by parts of the -pattern. Following the usage in Jeffrey Friedl's book, this is called -"capturing" in what follows, and the phrase "capturing subpattern" is used for -a fragment of a pattern that picks out a substring. PCRE supports several other -kinds of parenthesized subpattern that do not cause substrings to be captured. -

      -

      -Captured substrings are returned to the caller via a vector of integers whose -address is passed in ovector. The number of elements in the vector is -passed in ovecsize, which must be a non-negative number. Note: this -argument is NOT the size of ovector in bytes. -

      -

      -The first two-thirds of the vector is used to pass back captured substrings, -each substring using a pair of integers. The remaining third of the vector is -used as workspace by pcre_exec() while matching capturing subpatterns, -and is not available for passing back information. The number passed in -ovecsize should always be a multiple of three. If it is not, it is -rounded down. -

      -

      -When a match is successful, information about captured substrings is returned -in pairs of integers, starting at the beginning of ovector, and -continuing up to two-thirds of its length at the most. The first element of -each pair is set to the offset of the first character in a substring, and the -second is set to the offset of the first character after the end of a -substring. These values are always data unit offsets, even in UTF mode. They -are byte offsets in the 8-bit library, 16-bit data item offsets in the 16-bit -library, and 32-bit data item offsets in the 32-bit library. Note: they -are not character counts. -

      -

      -The first pair of integers, ovector[0] and ovector[1], identify the -portion of the subject string matched by the entire pattern. The next pair is -used for the first capturing subpattern, and so on. The value returned by -pcre_exec() is one more than the highest numbered pair that has been set. -For example, if two substrings have been captured, the returned value is 3. If -there are no capturing subpatterns, the return value from a successful match is -1, indicating that just the first pair of offsets has been set. -

      -

      -If a capturing subpattern is matched repeatedly, it is the last portion of the -string that it matched that is returned. -

      -

      -If the vector is too small to hold all the captured substring offsets, it is -used as far as possible (up to two-thirds of its length), and the function -returns a value of zero. If neither the actual string matched nor any captured -substrings are of interest, pcre_exec() may be called with ovector -passed as NULL and ovecsize as zero. However, if the pattern contains -back references and the ovector is not big enough to remember the related -substrings, PCRE has to get additional memory for use during matching. Thus it -is usually advisable to supply an ovector of reasonable size. -

      -

      -There are some cases where zero is returned (indicating vector overflow) when -in fact the vector is exactly the right size for the final match. For example, -consider the pattern -

      -  (a)(?:(b)c|bd)
      -
      -If a vector of 6 elements (allowing for only 1 captured substring) is given -with subject string "abd", pcre_exec() will try to set the second -captured string, thereby recording a vector overflow, before failing to match -"c" and backing up to try the second alternative. The zero return, however, -does correctly indicate that the maximum number of slots (namely 2) have been -filled. In similar cases where there is temporary overflow, but the final -number of used slots is actually less than the maximum, a non-zero value is -returned. -

      -

      -The pcre_fullinfo() function can be used to find out how many capturing -subpatterns there are in a compiled pattern. The smallest size for -ovector that will allow for n captured substrings, in addition to -the offsets of the substring matched by the whole pattern, is (n+1)*3. -

      -

      -It is possible for capturing subpattern number n+1 to match some part of -the subject when subpattern n has not been used at all. For example, if -the string "abc" is matched against the pattern (a|(z))(bc) the return from the -function is 4, and subpatterns 1 and 3 are matched, but 2 is not. When this -happens, both values in the offset pairs corresponding to unused subpatterns -are set to -1. -

      -

      -Offset values that correspond to unused subpatterns at the end of the -expression are also set to -1. For example, if the string "abc" is matched -against the pattern (abc)(x(yz)?)? subpatterns 2 and 3 are not matched. The -return from the function is 2, because the highest used capturing subpattern -number is 1, and the offsets for for the second and third capturing subpatterns -(assuming the vector is large enough, of course) are set to -1. -

      -

      -Note: Elements in the first two-thirds of ovector that do not -correspond to capturing parentheses in the pattern are never changed. That is, -if a pattern contains n capturing parentheses, no more than -ovector[0] to ovector[2n+1] are set by pcre_exec(). The other -elements (in the first two-thirds) retain whatever values they previously had. -

      -

      -Some convenience functions are provided for extracting the captured substrings -as separate strings. These are described below. -

      -
      -Error return values from pcre_exec() -
      -

      -If pcre_exec() fails, it returns a negative number. The following are -defined in the header file: -

      -  PCRE_ERROR_NOMATCH        (-1)
      -
      -The subject string did not match the pattern. -
      -  PCRE_ERROR_NULL           (-2)
      -
      -Either code or subject was passed as NULL, or ovector was -NULL and ovecsize was not zero. -
      -  PCRE_ERROR_BADOPTION      (-3)
      -
      -An unrecognized bit was set in the options argument. -
      -  PCRE_ERROR_BADMAGIC       (-4)
      -
      -PCRE stores a 4-byte "magic number" at the start of the compiled code, to catch -the case when it is passed a junk pointer and to detect when a pattern that was -compiled in an environment of one endianness is run in an environment with the -other endianness. This is the error that PCRE gives when the magic number is -not present. -
      -  PCRE_ERROR_UNKNOWN_OPCODE (-5)
      -
      -While running the pattern match, an unknown item was encountered in the -compiled pattern. This error could be caused by a bug in PCRE or by overwriting -of the compiled pattern. -
      -  PCRE_ERROR_NOMEMORY       (-6)
      -
      -If a pattern contains back references, but the ovector that is passed to -pcre_exec() is not big enough to remember the referenced substrings, PCRE -gets a block of memory at the start of matching to use for this purpose. If the -call via pcre_malloc() fails, this error is given. The memory is -automatically freed at the end of matching. -

      -

      -This error is also given if pcre_stack_malloc() fails in -pcre_exec(). This can happen only when PCRE has been compiled with ---disable-stack-for-recursion. -

      -  PCRE_ERROR_NOSUBSTRING    (-7)
      -
      -This error is used by the pcre_copy_substring(), -pcre_get_substring(), and pcre_get_substring_list() functions (see -below). It is never returned by pcre_exec(). -
      -  PCRE_ERROR_MATCHLIMIT     (-8)
      -
      -The backtracking limit, as specified by the match_limit field in a -pcre_extra structure (or defaulted) was reached. See the description -above. -
      -  PCRE_ERROR_CALLOUT        (-9)
      -
      -This error is never generated by pcre_exec() itself. It is provided for -use by callout functions that want to yield a distinctive error code. See the -pcrecallout -documentation for details. -
      -  PCRE_ERROR_BADUTF8        (-10)
      -
      -A string that contains an invalid UTF-8 byte sequence was passed as a subject, -and the PCRE_NO_UTF8_CHECK option was not set. If the size of the output vector -(ovecsize) is at least 2, the byte offset to the start of the the invalid -UTF-8 character is placed in the first element, and a reason code is placed in -the second element. The reason codes are listed in the -following section. -For backward compatibility, if PCRE_PARTIAL_HARD is set and the problem is a -truncated UTF-8 character at the end of the subject (reason codes 1 to 5), -PCRE_ERROR_SHORTUTF8 is returned instead of PCRE_ERROR_BADUTF8. -
      -  PCRE_ERROR_BADUTF8_OFFSET (-11)
      -
      -The UTF-8 byte sequence that was passed as a subject was checked and found to -be valid (the PCRE_NO_UTF8_CHECK option was not set), but the value of -startoffset did not point to the beginning of a UTF-8 character or the -end of the subject. -
      -  PCRE_ERROR_PARTIAL        (-12)
      -
      -The subject string did not match, but it did match partially. See the -pcrepartial -documentation for details of partial matching. -
      -  PCRE_ERROR_BADPARTIAL     (-13)
      -
      -This code is no longer in use. It was formerly returned when the PCRE_PARTIAL -option was used with a compiled pattern containing items that were not -supported for partial matching. From release 8.00 onwards, there are no -restrictions on partial matching. -
      -  PCRE_ERROR_INTERNAL       (-14)
      -
      -An unexpected internal error has occurred. This error could be caused by a bug -in PCRE or by overwriting of the compiled pattern. -
      -  PCRE_ERROR_BADCOUNT       (-15)
      -
      -This error is given if the value of the ovecsize argument is negative. -
      -  PCRE_ERROR_RECURSIONLIMIT (-21)
      -
      -The internal recursion limit, as specified by the match_limit_recursion -field in a pcre_extra structure (or defaulted) was reached. See the -description above. -
      -  PCRE_ERROR_BADNEWLINE     (-23)
      -
      -An invalid combination of PCRE_NEWLINE_xxx options was given. -
      -  PCRE_ERROR_BADOFFSET      (-24)
      -
      -The value of startoffset was negative or greater than the length of the -subject, that is, the value in length. -
      -  PCRE_ERROR_SHORTUTF8      (-25)
      -
      -This error is returned instead of PCRE_ERROR_BADUTF8 when the subject string -ends with a truncated UTF-8 character and the PCRE_PARTIAL_HARD option is set. -Information about the failure is returned as for PCRE_ERROR_BADUTF8. It is in -fact sufficient to detect this case, but this special error code for -PCRE_PARTIAL_HARD precedes the implementation of returned information; it is -retained for backwards compatibility. -
      -  PCRE_ERROR_RECURSELOOP    (-26)
      -
      -This error is returned when pcre_exec() detects a recursion loop within -the pattern. Specifically, it means that either the whole pattern or a -subpattern has been called recursively for the second time at the same position -in the subject string. Some simple patterns that might do this are detected and -faulted at compile time, but more complicated cases, in particular mutual -recursions between two different subpatterns, cannot be detected until run -time. -
      -  PCRE_ERROR_JIT_STACKLIMIT (-27)
      -
      -This error is returned when a pattern that was successfully studied using a -JIT compile option is being matched, but the memory available for the -just-in-time processing stack is not large enough. See the -pcrejit -documentation for more details. -
      -  PCRE_ERROR_BADMODE        (-28)
      -
      -This error is given if a pattern that was compiled by the 8-bit library is -passed to a 16-bit or 32-bit library function, or vice versa. -
      -  PCRE_ERROR_BADENDIANNESS  (-29)
      -
      -This error is given if a pattern that was compiled and saved is reloaded on a -host with different endianness. The utility function -pcre_pattern_to_host_byte_order() can be used to convert such a pattern -so that it runs on the new host. -
      -  PCRE_ERROR_JIT_BADOPTION
      -
      -This error is returned when a pattern that was successfully studied using a JIT -compile option is being matched, but the matching mode (partial or complete -match) does not correspond to any JIT compilation mode. When the JIT fast path -function is used, this error may be also given for invalid options. See the -pcrejit -documentation for more details. -
      -  PCRE_ERROR_BADLENGTH      (-32)
      -
      -This error is given if pcre_exec() is called with a negative value for -the length argument. -

      -

      -Error numbers -16 to -20, -22, and 30 are not used by pcre_exec(). -

      -
      -Reason codes for invalid UTF-8 strings -
      -

      -This section applies only to the 8-bit library. The corresponding information -for the 16-bit and 32-bit libraries is given in the -pcre16 -and -pcre32 -pages. -

      -

      -When pcre_exec() returns either PCRE_ERROR_BADUTF8 or -PCRE_ERROR_SHORTUTF8, and the size of the output vector (ovecsize) is at -least 2, the offset of the start of the invalid UTF-8 character is placed in -the first output vector element (ovector[0]) and a reason code is placed -in the second element (ovector[1]). The reason codes are given names in -the pcre.h header file: -

      -  PCRE_UTF8_ERR1
      -  PCRE_UTF8_ERR2
      -  PCRE_UTF8_ERR3
      -  PCRE_UTF8_ERR4
      -  PCRE_UTF8_ERR5
      -
      -The string ends with a truncated UTF-8 character; the code specifies how many -bytes are missing (1 to 5). Although RFC 3629 restricts UTF-8 characters to be -no longer than 4 bytes, the encoding scheme (originally defined by RFC 2279) -allows for up to 6 bytes, and this is checked first; hence the possibility of -4 or 5 missing bytes. -
      -  PCRE_UTF8_ERR6
      -  PCRE_UTF8_ERR7
      -  PCRE_UTF8_ERR8
      -  PCRE_UTF8_ERR9
      -  PCRE_UTF8_ERR10
      -
      -The two most significant bits of the 2nd, 3rd, 4th, 5th, or 6th byte of the -character do not have the binary value 0b10 (that is, either the most -significant bit is 0, or the next bit is 1). -
      -  PCRE_UTF8_ERR11
      -  PCRE_UTF8_ERR12
      -
      -A character that is valid by the RFC 2279 rules is either 5 or 6 bytes long; -these code points are excluded by RFC 3629. -
      -  PCRE_UTF8_ERR13
      -
      -A 4-byte character has a value greater than 0x10fff; these code points are -excluded by RFC 3629. -
      -  PCRE_UTF8_ERR14
      -
      -A 3-byte character has a value in the range 0xd800 to 0xdfff; this range of -code points are reserved by RFC 3629 for use with UTF-16, and so are excluded -from UTF-8. -
      -  PCRE_UTF8_ERR15
      -  PCRE_UTF8_ERR16
      -  PCRE_UTF8_ERR17
      -  PCRE_UTF8_ERR18
      -  PCRE_UTF8_ERR19
      -
      -A 2-, 3-, 4-, 5-, or 6-byte character is "overlong", that is, it codes for a -value that can be represented by fewer bytes, which is invalid. For example, -the two bytes 0xc0, 0xae give the value 0x2e, whose correct coding uses just -one byte. -
      -  PCRE_UTF8_ERR20
      -
      -The two most significant bits of the first byte of a character have the binary -value 0b10 (that is, the most significant bit is 1 and the second is 0). Such a -byte can only validly occur as the second or subsequent byte of a multi-byte -character. -
      -  PCRE_UTF8_ERR21
      -
      -The first byte of a character has the value 0xfe or 0xff. These values can -never occur in a valid UTF-8 string. -
      -  PCRE_UTF8_ERR22
      -
      -This error code was formerly used when the presence of a so-called -"non-character" caused an error. Unicode corrigendum #9 makes it clear that -such characters should not cause a string to be rejected, and so this code is -no longer in use and is never returned. -

      -
      EXTRACTING CAPTURED SUBSTRINGS BY NUMBER
      -

      -int pcre_copy_substring(const char *subject, int *ovector, - int stringcount, int stringnumber, char *buffer, - int buffersize); -
      -
      -int pcre_get_substring(const char *subject, int *ovector, - int stringcount, int stringnumber, - const char **stringptr); -
      -
      -int pcre_get_substring_list(const char *subject, - int *ovector, int stringcount, const char ***listptr); -

      -

      -Captured substrings can be accessed directly by using the offsets returned by -pcre_exec() in ovector. For convenience, the functions -pcre_copy_substring(), pcre_get_substring(), and -pcre_get_substring_list() are provided for extracting captured substrings -as new, separate, zero-terminated strings. These functions identify substrings -by number. The next section describes functions for extracting named -substrings. -

      -

      -A substring that contains a binary zero is correctly extracted and has a -further zero added on the end, but the result is not, of course, a C string. -However, you can process such a string by referring to the length that is -returned by pcre_copy_substring() and pcre_get_substring(). -Unfortunately, the interface to pcre_get_substring_list() is not adequate -for handling strings containing binary zeros, because the end of the final -string is not independently indicated. -

      -

      -The first three arguments are the same for all three of these functions: -subject is the subject string that has just been successfully matched, -ovector is a pointer to the vector of integer offsets that was passed to -pcre_exec(), and stringcount is the number of substrings that were -captured by the match, including the substring that matched the entire regular -expression. This is the value returned by pcre_exec() if it is greater -than zero. If pcre_exec() returned zero, indicating that it ran out of -space in ovector, the value passed as stringcount should be the -number of elements in the vector divided by three. -

      -

      -The functions pcre_copy_substring() and pcre_get_substring() -extract a single substring, whose number is given as stringnumber. A -value of zero extracts the substring that matched the entire pattern, whereas -higher values extract the captured substrings. For pcre_copy_substring(), -the string is placed in buffer, whose length is given by -buffersize, while for pcre_get_substring() a new block of memory is -obtained via pcre_malloc, and its address is returned via -stringptr. The yield of the function is the length of the string, not -including the terminating zero, or one of these error codes: -

      -  PCRE_ERROR_NOMEMORY       (-6)
      -
      -The buffer was too small for pcre_copy_substring(), or the attempt to get -memory failed for pcre_get_substring(). -
      -  PCRE_ERROR_NOSUBSTRING    (-7)
      -
      -There is no substring whose number is stringnumber. -

      -

      -The pcre_get_substring_list() function extracts all available substrings -and builds a list of pointers to them. All this is done in a single block of -memory that is obtained via pcre_malloc. The address of the memory block -is returned via listptr, which is also the start of the list of string -pointers. The end of the list is marked by a NULL pointer. The yield of the -function is zero if all went well, or the error code -

      -  PCRE_ERROR_NOMEMORY       (-6)
      -
      -if the attempt to get the memory block failed. -

      -

      -When any of these functions encounter a substring that is unset, which can -happen when capturing subpattern number n+1 matches some part of the -subject, but subpattern n has not been used at all, they return an empty -string. This can be distinguished from a genuine zero-length substring by -inspecting the appropriate offset in ovector, which is negative for unset -substrings. -

      -

      -The two convenience functions pcre_free_substring() and -pcre_free_substring_list() can be used to free the memory returned by -a previous call of pcre_get_substring() or -pcre_get_substring_list(), respectively. They do nothing more than call -the function pointed to by pcre_free, which of course could be called -directly from a C program. However, PCRE is used in some situations where it is -linked via a special interface to another programming language that cannot use -pcre_free directly; it is for these cases that the functions are -provided. -

      -
      EXTRACTING CAPTURED SUBSTRINGS BY NAME
      -

      -int pcre_get_stringnumber(const pcre *code, - const char *name); -
      -
      -int pcre_copy_named_substring(const pcre *code, - const char *subject, int *ovector, - int stringcount, const char *stringname, - char *buffer, int buffersize); -
      -
      -int pcre_get_named_substring(const pcre *code, - const char *subject, int *ovector, - int stringcount, const char *stringname, - const char **stringptr); -

      -

      -To extract a substring by name, you first have to find associated number. -For example, for this pattern -

      -  (a+)b(?<xxx>\d+)...
      -
      -the number of the subpattern called "xxx" is 2. If the name is known to be -unique (PCRE_DUPNAMES was not set), you can find the number from the name by -calling pcre_get_stringnumber(). The first argument is the compiled -pattern, and the second is the name. The yield of the function is the -subpattern number, or PCRE_ERROR_NOSUBSTRING (-7) if there is no subpattern of -that name. -

      -

      -Given the number, you can extract the substring directly, or use one of the -functions described in the previous section. For convenience, there are also -two functions that do the whole job. -

      -

      -Most of the arguments of pcre_copy_named_substring() and -pcre_get_named_substring() are the same as those for the similarly named -functions that extract by number. As these are described in the previous -section, they are not re-described here. There are just two differences: -

      -

      -First, instead of a substring number, a substring name is given. Second, there -is an extra argument, given at the start, which is a pointer to the compiled -pattern. This is needed in order to gain access to the name-to-number -translation table. -

      -

      -These functions call pcre_get_stringnumber(), and if it succeeds, they -then call pcre_copy_substring() or pcre_get_substring(), as -appropriate. NOTE: If PCRE_DUPNAMES is set and there are duplicate names, -the behaviour may not be what you want (see the next section). -

      -

      -Warning: If the pattern uses the (?| feature to set up multiple -subpatterns with the same number, as described in the -section on duplicate subpattern numbers -in the -pcrepattern -page, you cannot use names to distinguish the different subpatterns, because -names are not included in the compiled code. The matching process uses only -numbers. For this reason, the use of different names for subpatterns of the -same number causes an error at compile time. -

      -
      DUPLICATE SUBPATTERN NAMES
      -

      -int pcre_get_stringtable_entries(const pcre *code, - const char *name, char **first, char **last); -

      -

      -When a pattern is compiled with the PCRE_DUPNAMES option, names for subpatterns -are not required to be unique. (Duplicate names are always allowed for -subpatterns with the same number, created by using the (?| feature. Indeed, if -such subpatterns are named, they are required to use the same names.) -

      -

      -Normally, patterns with duplicate names are such that in any one match, only -one of the named subpatterns participates. An example is shown in the -pcrepattern -documentation. -

      -

      -When duplicates are present, pcre_copy_named_substring() and -pcre_get_named_substring() return the first substring corresponding to -the given name that is set. If none are set, PCRE_ERROR_NOSUBSTRING (-7) is -returned; no data is returned. The pcre_get_stringnumber() function -returns one of the numbers that are associated with the name, but it is not -defined which it is. -

      -

      -If you want to get full details of all captured substrings for a given name, -you must use the pcre_get_stringtable_entries() function. The first -argument is the compiled pattern, and the second is the name. The third and -fourth are pointers to variables which are updated by the function. After it -has run, they point to the first and last entries in the name-to-number table -for the given name. The function itself returns the length of each entry, or -PCRE_ERROR_NOSUBSTRING (-7) if there are none. The format of the table is -described above in the section entitled Information about a pattern -above. -Given all the relevant entries for the name, you can extract each of their -numbers, and hence the captured data, if any. -

      -
      FINDING ALL POSSIBLE MATCHES
      -

      -The traditional matching function uses a similar algorithm to Perl, which stops -when it finds the first match, starting at a given point in the subject. If you -want to find all possible matches, or the longest possible match, consider -using the alternative matching function (see below) instead. If you cannot use -the alternative function, but still need to find all possible matches, you -can kludge it up by making use of the callout facility, which is described in -the -pcrecallout -documentation. -

      -

      -What you have to do is to insert a callout right at the end of the pattern. -When your callout function is called, extract and save the current matched -substring. Then return 1, which forces pcre_exec() to backtrack and try -other alternatives. Ultimately, when it runs out of matches, pcre_exec() -will yield PCRE_ERROR_NOMATCH. -

      -
      OBTAINING AN ESTIMATE OF STACK USAGE
      -

      -Matching certain patterns using pcre_exec() can use a lot of process -stack, which in certain environments can be rather limited in size. Some users -find it helpful to have an estimate of the amount of stack that is used by -pcre_exec(), to help them set recursion limits, as described in the -pcrestack -documentation. The estimate that is output by pcretest when called with -the -m and -C options is obtained by calling pcre_exec with -the values NULL, NULL, NULL, -999, and -999 for its first five arguments. -

      -

      -Normally, if its first argument is NULL, pcre_exec() immediately returns -the negative error code PCRE_ERROR_NULL, but with this special combination of -arguments, it returns instead a negative number whose absolute value is the -approximate stack frame size in bytes. (A negative number is used so that it is -clear that no match has happened.) The value is approximate because in some -cases, recursive calls to pcre_exec() occur when there are one or two -additional variables on the stack. -

      -

      -If PCRE has been compiled to use the heap instead of the stack for recursion, -the value returned is the size of each block that is obtained from the heap. -

      -
      MATCHING A PATTERN: THE ALTERNATIVE FUNCTION
      -

      -int pcre_dfa_exec(const pcre *code, const pcre_extra *extra, - const char *subject, int length, int startoffset, - int options, int *ovector, int ovecsize, - int *workspace, int wscount); -

      -

      -The function pcre_dfa_exec() is called to match a subject string against -a compiled pattern, using a matching algorithm that scans the subject string -just once, and does not backtrack. This has different characteristics to the -normal algorithm, and is not compatible with Perl. Some of the features of PCRE -patterns are not supported. Nevertheless, there are times when this kind of -matching can be useful. For a discussion of the two matching algorithms, and a -list of features that pcre_dfa_exec() does not support, see the -pcrematching -documentation. -

      -

      -The arguments for the pcre_dfa_exec() function are the same as for -pcre_exec(), plus two extras. The ovector argument is used in a -different way, and this is described below. The other common arguments are used -in the same way as for pcre_exec(), so their description is not repeated -here. -

      -

      -The two additional arguments provide workspace for the function. The workspace -vector should contain at least 20 elements. It is used for keeping track of -multiple paths through the pattern tree. More workspace will be needed for -patterns and subjects where there are a lot of potential matches. -

      -

      -Here is an example of a simple call to pcre_dfa_exec(): -

      -  int rc;
      -  int ovector[10];
      -  int wspace[20];
      -  rc = pcre_dfa_exec(
      -    re,             /* result of pcre_compile() */
      -    NULL,           /* we didn't study the pattern */
      -    "some string",  /* the subject string */
      -    11,             /* the length of the subject string */
      -    0,              /* start at offset 0 in the subject */
      -    0,              /* default options */
      -    ovector,        /* vector of integers for substring information */
      -    10,             /* number of elements (NOT size in bytes) */
      -    wspace,         /* working space vector */
      -    20);            /* number of elements (NOT size in bytes) */
      -
      -

      -
      -Option bits for pcre_dfa_exec() -
      -

      -The unused bits of the options argument for pcre_dfa_exec() must be -zero. The only bits that may be set are PCRE_ANCHORED, PCRE_NEWLINE_xxx, -PCRE_NOTBOL, PCRE_NOTEOL, PCRE_NOTEMPTY, PCRE_NOTEMPTY_ATSTART, -PCRE_NO_UTF8_CHECK, PCRE_BSR_ANYCRLF, PCRE_BSR_UNICODE, PCRE_NO_START_OPTIMIZE, -PCRE_PARTIAL_HARD, PCRE_PARTIAL_SOFT, PCRE_DFA_SHORTEST, and PCRE_DFA_RESTART. -All but the last four of these are exactly the same as for pcre_exec(), -so their description is not repeated here. -

      -  PCRE_PARTIAL_HARD
      -  PCRE_PARTIAL_SOFT
      -
      -These have the same general effect as they do for pcre_exec(), but the -details are slightly different. When PCRE_PARTIAL_HARD is set for -pcre_dfa_exec(), it returns PCRE_ERROR_PARTIAL if the end of the subject -is reached and there is still at least one matching possibility that requires -additional characters. This happens even if some complete matches have also -been found. When PCRE_PARTIAL_SOFT is set, the return code PCRE_ERROR_NOMATCH -is converted into PCRE_ERROR_PARTIAL if the end of the subject is reached, -there have been no complete matches, but there is still at least one matching -possibility. The portion of the string that was inspected when the longest -partial match was found is set as the first matching string in both cases. -There is a more detailed discussion of partial and multi-segment matching, with -examples, in the -pcrepartial -documentation. -
      -  PCRE_DFA_SHORTEST
      -
      -Setting the PCRE_DFA_SHORTEST option causes the matching algorithm to stop as -soon as it has found one match. Because of the way the alternative algorithm -works, this is necessarily the shortest possible match at the first possible -matching point in the subject string. -
      -  PCRE_DFA_RESTART
      -
      -When pcre_dfa_exec() returns a partial match, it is possible to call it -again, with additional subject characters, and have it continue with the same -match. The PCRE_DFA_RESTART option requests this action; when it is set, the -workspace and wscount options must reference the same vector as -before because data about the match so far is left in them after a partial -match. There is more discussion of this facility in the -pcrepartial -documentation. -

      -
      -Successful returns from pcre_dfa_exec() -
      -

      -When pcre_dfa_exec() succeeds, it may have matched more than one -substring in the subject. Note, however, that all the matches from one run of -the function start at the same point in the subject. The shorter matches are -all initial substrings of the longer matches. For example, if the pattern -

      -  <.*>
      -
      -is matched against the string -
      -  This is <something> <something else> <something further> no more
      -
      -the three matched strings are -
      -  <something>
      -  <something> <something else>
      -  <something> <something else> <something further>
      -
      -On success, the yield of the function is a number greater than zero, which is -the number of matched substrings. The substrings themselves are returned in -ovector. Each string uses two elements; the first is the offset to the -start, and the second is the offset to the end. In fact, all the strings have -the same start offset. (Space could have been saved by giving this only once, -but it was decided to retain some compatibility with the way pcre_exec() -returns data, even though the meaning of the strings is different.) -

      -

      -The strings are returned in reverse order of length; that is, the longest -matching string is given first. If there were too many matches to fit into -ovector, the yield of the function is zero, and the vector is filled with -the longest matches. Unlike pcre_exec(), pcre_dfa_exec() can use -the entire ovector for returning matched strings. -

      -

      -NOTE: PCRE's "auto-possessification" optimization usually applies to character -repeats at the end of a pattern (as well as internally). For example, the -pattern "a\d+" is compiled as if it were "a\d++" because there is no point -even considering the possibility of backtracking into the repeated digits. For -DFA matching, this means that only one possible match is found. If you really -do want multiple matches in such cases, either use an ungreedy repeat -("a\d+?") or set the PCRE_NO_AUTO_POSSESS option when compiling. -

      -
      -Error returns from pcre_dfa_exec() -
      -

      -The pcre_dfa_exec() function returns a negative number when it fails. -Many of the errors are the same as for pcre_exec(), and these are -described -above. -There are in addition the following errors that are specific to -pcre_dfa_exec(): -

      -  PCRE_ERROR_DFA_UITEM      (-16)
      -
      -This return is given if pcre_dfa_exec() encounters an item in the pattern -that it does not support, for instance, the use of \C or a back reference. -
      -  PCRE_ERROR_DFA_UCOND      (-17)
      -
      -This return is given if pcre_dfa_exec() encounters a condition item that -uses a back reference for the condition, or a test for recursion in a specific -group. These are not supported. -
      -  PCRE_ERROR_DFA_UMLIMIT    (-18)
      -
      -This return is given if pcre_dfa_exec() is called with an extra -block that contains a setting of the match_limit or -match_limit_recursion fields. This is not supported (these fields are -meaningless for DFA matching). -
      -  PCRE_ERROR_DFA_WSSIZE     (-19)
      -
      -This return is given if pcre_dfa_exec() runs out of space in the -workspace vector. -
      -  PCRE_ERROR_DFA_RECURSE    (-20)
      -
      -When a recursive subpattern is processed, the matching function calls itself -recursively, using private vectors for ovector and workspace. This -error is given if the output vector is not large enough. This should be -extremely rare, as a vector of size 1000 is used. -
      -  PCRE_ERROR_DFA_BADRESTART (-30)
      -
      -When pcre_dfa_exec() is called with the PCRE_DFA_RESTART option, -some plausibility checks are made on the contents of the workspace, which -should contain data about the previous partial match. If any of these checks -fail, this error is given. -

      -
      SEE ALSO
      -

      -pcre16(3), pcre32(3), pcrebuild(3), pcrecallout(3), -pcrecpp(3)(3), pcrematching(3), pcrepartial(3), -pcreposix(3), pcreprecompile(3), pcresample(3), -pcrestack(3). -

      -
      AUTHOR
      -

      -Philip Hazel -
      -University Computing Service -
      -Cambridge CB2 3QH, England. -
      -

      -
      REVISION
      -

      -Last updated: 18 December 2015 -
      -Copyright © 1997-2015 University of Cambridge. -
      -

      -Return to the PCRE index page. -

      diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcrebuild.html b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcrebuild.html deleted file mode 100644 index 03c8cbe0..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcrebuild.html +++ /dev/null @@ -1,534 +0,0 @@ - - -pcrebuild specification - - -

      pcrebuild man page

      -

      -Return to the PCRE index page. -

      -

      -This page is part of the PCRE HTML documentation. It was generated automatically -from the original man page. If there is any nonsense in it, please consult the -man page, in case the conversion went wrong. -
      -

      -
      BUILDING PCRE
      -

      -PCRE is distributed with a configure script that can be used to build the -library in Unix-like environments using the applications known as Autotools. -Also in the distribution are files to support building using CMake -instead of configure. The text file -README -contains general information about building with Autotools (some of which is -repeated below), and also has some comments about building on various operating -systems. There is a lot more information about building PCRE without using -Autotools (including information about using CMake and building "by -hand") in the text file called -NON-AUTOTOOLS-BUILD. -You should consult this file as well as the -README -file if you are building in a non-Unix-like environment. -

      -
      PCRE BUILD-TIME OPTIONS
      -

      -The rest of this document describes the optional features of PCRE that can be -selected when the library is compiled. It assumes use of the configure -script, where the optional features are selected or deselected by providing -options to configure before running the make command. However, the -same options can be selected in both Unix-like and non-Unix-like environments -using the GUI facility of cmake-gui if you are using CMake instead -of configure to build PCRE. -

      -

      -If you are not using Autotools or CMake, option selection can be done by -editing the config.h file, or by passing parameter settings to the -compiler, as described in -NON-AUTOTOOLS-BUILD. -

      -

      -The complete list of options for configure (which includes the standard -ones such as the selection of the installation directory) can be obtained by -running -

      -  ./configure --help
      -
      -The following sections include descriptions of options whose names begin with ---enable or --disable. These settings specify changes to the defaults for the -configure command. Because of the way that configure works, ---enable and --disable always come in pairs, so the complementary option always -exists as well, but as it specifies the default, it is not described. -

      -
      BUILDING 8-BIT, 16-BIT AND 32-BIT LIBRARIES
      -

      -By default, a library called libpcre is built, containing functions that -take string arguments contained in vectors of bytes, either as single-byte -characters, or interpreted as UTF-8 strings. You can also build a separate -library, called libpcre16, in which strings are contained in vectors of -16-bit data units and interpreted either as single-unit characters or UTF-16 -strings, by adding -

      -  --enable-pcre16
      -
      -to the configure command. You can also build yet another separate -library, called libpcre32, in which strings are contained in vectors of -32-bit data units and interpreted either as single-unit characters or UTF-32 -strings, by adding -
      -  --enable-pcre32
      -
      -to the configure command. If you do not want the 8-bit library, add -
      -  --disable-pcre8
      -
      -as well. At least one of the three libraries must be built. Note that the C++ -and POSIX wrappers are for the 8-bit library only, and that pcregrep is -an 8-bit program. None of these are built if you select only the 16-bit or -32-bit libraries. -

      -
      BUILDING SHARED AND STATIC LIBRARIES
      -

      -The Autotools PCRE building process uses libtool to build both shared and -static libraries by default. You can suppress one of these by adding one of -

      -  --disable-shared
      -  --disable-static
      -
      -to the configure command, as required. -

      -
      C++ SUPPORT
      -

      -By default, if the 8-bit library is being built, the configure script -will search for a C++ compiler and C++ header files. If it finds them, it -automatically builds the C++ wrapper library (which supports only 8-bit -strings). You can disable this by adding -

      -  --disable-cpp
      -
      -to the configure command. -

      -
      UTF-8, UTF-16 AND UTF-32 SUPPORT
      -

      -To build PCRE with support for UTF Unicode character strings, add -

      -  --enable-utf
      -
      -to the configure command. This setting applies to all three libraries, -adding support for UTF-8 to the 8-bit library, support for UTF-16 to the 16-bit -library, and support for UTF-32 to the to the 32-bit library. There are no -separate options for enabling UTF-8, UTF-16 and UTF-32 independently because -that would allow ridiculous settings such as requesting UTF-16 support while -building only the 8-bit library. It is not possible to build one library with -UTF support and another without in the same configuration. (For backwards -compatibility, --enable-utf8 is a synonym of --enable-utf.) -

      -

      -Of itself, this setting does not make PCRE treat strings as UTF-8, UTF-16 or -UTF-32. As well as compiling PCRE with this option, you also have have to set -the PCRE_UTF8, PCRE_UTF16 or PCRE_UTF32 option (as appropriate) when you call -one of the pattern compiling functions. -

      -

      -If you set --enable-utf when compiling in an EBCDIC environment, PCRE expects -its input to be either ASCII or UTF-8 (depending on the run-time option). It is -not possible to support both EBCDIC and UTF-8 codes in the same version of the -library. Consequently, --enable-utf and --enable-ebcdic are mutually -exclusive. -

      -
      UNICODE CHARACTER PROPERTY SUPPORT
      -

      -UTF support allows the libraries to process character codepoints up to 0x10ffff -in the strings that they handle. On its own, however, it does not provide any -facilities for accessing the properties of such characters. If you want to be -able to use the pattern escapes \P, \p, and \X, which refer to Unicode -character properties, you must add -

      -  --enable-unicode-properties
      -
      -to the configure command. This implies UTF support, even if you have -not explicitly requested it. -

      -

      -Including Unicode property support adds around 30K of tables to the PCRE -library. Only the general category properties such as Lu and Nd are -supported. Details are given in the -pcrepattern -documentation. -

      -
      JUST-IN-TIME COMPILER SUPPORT
      -

      -Just-in-time compiler support is included in the build by specifying -

      -  --enable-jit
      -
      -This support is available only for certain hardware architectures. If this -option is set for an unsupported architecture, a compile time error occurs. -See the -pcrejit -documentation for a discussion of JIT usage. When JIT support is enabled, -pcregrep automatically makes use of it, unless you add -
      -  --disable-pcregrep-jit
      -
      -to the "configure" command. -

      -
      CODE VALUE OF NEWLINE
      -

      -By default, PCRE interprets the linefeed (LF) character as indicating the end -of a line. This is the normal newline character on Unix-like systems. You can -compile PCRE to use carriage return (CR) instead, by adding -

      -  --enable-newline-is-cr
      -
      -to the configure command. There is also a --enable-newline-is-lf option, -which explicitly specifies linefeed as the newline character. -
      -
      -Alternatively, you can specify that line endings are to be indicated by the two -character sequence CRLF. If you want this, add -
      -  --enable-newline-is-crlf
      -
      -to the configure command. There is a fourth option, specified by -
      -  --enable-newline-is-anycrlf
      -
      -which causes PCRE to recognize any of the three sequences CR, LF, or CRLF as -indicating a line ending. Finally, a fifth option, specified by -
      -  --enable-newline-is-any
      -
      -causes PCRE to recognize any Unicode newline sequence. -

      -

      -Whatever line ending convention is selected when PCRE is built can be -overridden when the library functions are called. At build time it is -conventional to use the standard for your operating system. -

      -
      WHAT \R MATCHES
      -

      -By default, the sequence \R in a pattern matches any Unicode newline sequence, -whatever has been selected as the line ending sequence. If you specify -

      -  --enable-bsr-anycrlf
      -
      -the default is changed so that \R matches only CR, LF, or CRLF. Whatever is -selected when PCRE is built can be overridden when the library functions are -called. -

      -
      POSIX MALLOC USAGE
      -

      -When the 8-bit library is called through the POSIX interface (see the -pcreposix -documentation), additional working storage is required for holding the pointers -to capturing substrings, because PCRE requires three integers per substring, -whereas the POSIX interface provides only two. If the number of expected -substrings is small, the wrapper function uses space on the stack, because this -is faster than using malloc() for each call. The default threshold above -which the stack is no longer used is 10; it can be changed by adding a setting -such as -

      -  --with-posix-malloc-threshold=20
      -
      -to the configure command. -

      -
      HANDLING VERY LARGE PATTERNS
      -

      -Within a compiled pattern, offset values are used to point from one part to -another (for example, from an opening parenthesis to an alternation -metacharacter). By default, in the 8-bit and 16-bit libraries, two-byte values -are used for these offsets, leading to a maximum size for a compiled pattern of -around 64K. This is sufficient to handle all but the most gigantic patterns. -Nevertheless, some people do want to process truly enormous patterns, so it is -possible to compile PCRE to use three-byte or four-byte offsets by adding a -setting such as -

      -  --with-link-size=3
      -
      -to the configure command. The value given must be 2, 3, or 4. For the -16-bit library, a value of 3 is rounded up to 4. In these libraries, using -longer offsets slows down the operation of PCRE because it has to load -additional data when handling them. For the 32-bit library the value is always -4 and cannot be overridden; the value of --with-link-size is ignored. -

      -
      AVOIDING EXCESSIVE STACK USAGE
      -

      -When matching with the pcre_exec() function, PCRE implements backtracking -by making recursive calls to an internal function called match(). In -environments where the size of the stack is limited, this can severely limit -PCRE's operation. (The Unix environment does not usually suffer from this -problem, but it may sometimes be necessary to increase the maximum stack size. -There is a discussion in the -pcrestack -documentation.) An alternative approach to recursion that uses memory from the -heap to remember data, instead of using recursive function calls, has been -implemented to work round the problem of limited stack size. If you want to -build a version of PCRE that works this way, add -

      -  --disable-stack-for-recursion
      -
      -to the configure command. With this configuration, PCRE will use the -pcre_stack_malloc and pcre_stack_free variables to call memory -management functions. By default these point to malloc() and -free(), but you can replace the pointers so that your own functions are -used instead. -

      -

      -Separate functions are provided rather than using pcre_malloc and -pcre_free because the usage is very predictable: the block sizes -requested are always the same, and the blocks are always freed in reverse -order. A calling program might be able to implement optimized functions that -perform better than malloc() and free(). PCRE runs noticeably more -slowly when built in this way. This option affects only the pcre_exec() -function; it is not relevant for pcre_dfa_exec(). -

      -
      LIMITING PCRE RESOURCE USAGE
      -

      -Internally, PCRE has a function called match(), which it calls repeatedly -(sometimes recursively) when matching a pattern with the pcre_exec() -function. By controlling the maximum number of times this function may be -called during a single matching operation, a limit can be placed on the -resources used by a single call to pcre_exec(). The limit can be changed -at run time, as described in the -pcreapi -documentation. The default is 10 million, but this can be changed by adding a -setting such as -

      -  --with-match-limit=500000
      -
      -to the configure command. This setting has no effect on the -pcre_dfa_exec() matching function. -

      -

      -In some environments it is desirable to limit the depth of recursive calls of -match() more strictly than the total number of calls, in order to -restrict the maximum amount of stack (or heap, if --disable-stack-for-recursion -is specified) that is used. A second limit controls this; it defaults to the -value that is set for --with-match-limit, which imposes no additional -constraints. However, you can set a lower limit by adding, for example, -

      -  --with-match-limit-recursion=10000
      -
      -to the configure command. This value can also be overridden at run time. -

      -
      CREATING CHARACTER TABLES AT BUILD TIME
      -

      -PCRE uses fixed tables for processing characters whose code values are less -than 256. By default, PCRE is built with a set of tables that are distributed -in the file pcre_chartables.c.dist. These tables are for ASCII codes -only. If you add -

      -  --enable-rebuild-chartables
      -
      -to the configure command, the distributed tables are no longer used. -Instead, a program called dftables is compiled and run. This outputs the -source for new set of tables, created in the default locale of your C run-time -system. (This method of replacing the tables does not work if you are cross -compiling, because dftables is run on the local host. If you need to -create alternative tables when cross compiling, you will have to do so "by -hand".) -

      -
      USING EBCDIC CODE
      -

      -PCRE assumes by default that it will run in an environment where the character -code is ASCII (or Unicode, which is a superset of ASCII). This is the case for -most computer operating systems. PCRE can, however, be compiled to run in an -EBCDIC environment by adding -

      -  --enable-ebcdic
      -
      -to the configure command. This setting implies ---enable-rebuild-chartables. You should only use it if you know that you are in -an EBCDIC environment (for example, an IBM mainframe operating system). The ---enable-ebcdic option is incompatible with --enable-utf. -

      -

      -The EBCDIC character that corresponds to an ASCII LF is assumed to have the -value 0x15 by default. However, in some EBCDIC environments, 0x25 is used. In -such an environment you should use -

      -  --enable-ebcdic-nl25
      -
      -as well as, or instead of, --enable-ebcdic. The EBCDIC character for CR has the -same value as in ASCII, namely, 0x0d. Whichever of 0x15 and 0x25 is not -chosen as LF is made to correspond to the Unicode NEL character (which, in -Unicode, is 0x85). -

      -

      -The options that select newline behaviour, such as --enable-newline-is-cr, -and equivalent run-time options, refer to these character values in an EBCDIC -environment. -

      -
      PCREGREP OPTIONS FOR COMPRESSED FILE SUPPORT
      -

      -By default, pcregrep reads all files as plain text. You can build it so -that it recognizes files whose names end in .gz or .bz2, and reads -them with libz or libbz2, respectively, by adding one or both of -

      -  --enable-pcregrep-libz
      -  --enable-pcregrep-libbz2
      -
      -to the configure command. These options naturally require that the -relevant libraries are installed on your system. Configuration will fail if -they are not. -

      -
      PCREGREP BUFFER SIZE
      -

      -pcregrep uses an internal buffer to hold a "window" on the file it is -scanning, in order to be able to output "before" and "after" lines when it -finds a match. The size of the buffer is controlled by a parameter whose -default value is 20K. The buffer itself is three times this size, but because -of the way it is used for holding "before" lines, the longest line that is -guaranteed to be processable is the parameter size. You can change the default -parameter value by adding, for example, -

      -  --with-pcregrep-bufsize=50K
      -
      -to the configure command. The caller of \fPpcregrep\fP can, however, -override this value by specifying a run-time option. -

      -
      PCRETEST OPTION FOR LIBREADLINE SUPPORT
      -

      -If you add -

      -  --enable-pcretest-libreadline
      -
      -to the configure command, pcretest is linked with the -libreadline library, and when its input is from a terminal, it reads it -using the readline() function. This provides line-editing and history -facilities. Note that libreadline is GPL-licensed, so if you distribute a -binary of pcretest linked in this way, there may be licensing issues. -

      -

      -Setting this option causes the -lreadline option to be added to the -pcretest build. In many operating environments with a sytem-installed -libreadline this is sufficient. However, in some environments (e.g. -if an unmodified distribution version of readline is in use), some extra -configuration may be necessary. The INSTALL file for libreadline says -this: -

      -  "Readline uses the termcap functions, but does not link with the
      -  termcap or curses library itself, allowing applications which link
      -  with readline the to choose an appropriate library."
      -
      -If your environment has not been set up so that an appropriate library is -automatically included, you may need to add something like -
      -  LIBS="-ncurses"
      -
      -immediately before the configure command. -

      -
      DEBUGGING WITH VALGRIND SUPPORT
      -

      -By adding the -

      -  --enable-valgrind
      -
      -option to to the configure command, PCRE will use valgrind annotations -to mark certain memory regions as unaddressable. This allows it to detect -invalid memory accesses, and is mostly useful for debugging PCRE itself. -

      -
      CODE COVERAGE REPORTING
      -

      -If your C compiler is gcc, you can build a version of PCRE that can generate a -code coverage report for its test suite. To enable this, you must install -lcov version 1.6 or above. Then specify -

      -  --enable-coverage
      -
      -to the configure command and build PCRE in the usual way. -

      -

      -Note that using ccache (a caching C compiler) is incompatible with code -coverage reporting. If you have configured ccache to run automatically -on your system, you must set the environment variable -

      -  CCACHE_DISABLE=1
      -
      -before running make to build PCRE, so that ccache is not used. -

      -

      -When --enable-coverage is used, the following addition targets are added to the -Makefile: -

      -  make coverage
      -
      -This creates a fresh coverage report for the PCRE test suite. It is equivalent -to running "make coverage-reset", "make coverage-baseline", "make check", and -then "make coverage-report". -
      -  make coverage-reset
      -
      -This zeroes the coverage counters, but does nothing else. -
      -  make coverage-baseline
      -
      -This captures baseline coverage information. -
      -  make coverage-report
      -
      -This creates the coverage report. -
      -  make coverage-clean-report
      -
      -This removes the generated coverage report without cleaning the coverage data -itself. -
      -  make coverage-clean-data
      -
      -This removes the captured coverage data without removing the coverage files -created at compile time (*.gcno). -
      -  make coverage-clean
      -
      -This cleans all coverage data including the generated coverage report. For more -information about code coverage, see the gcov and lcov -documentation. -

      -
      SEE ALSO
      -

      -pcreapi(3), pcre16, pcre32, pcre_config(3). -

      -
      AUTHOR
      -

      -Philip Hazel -
      -University Computing Service -
      -Cambridge CB2 3QH, England. -
      -

      -
      REVISION
      -

      -Last updated: 12 May 2013 -
      -Copyright © 1997-2013 University of Cambridge. -
      -

      -Return to the PCRE index page. -

      diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcrecallout.html b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcrecallout.html deleted file mode 100644 index 53a937f5..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcrecallout.html +++ /dev/null @@ -1,286 +0,0 @@ - - -pcrecallout specification - - -

      pcrecallout man page

      -

      -Return to the PCRE index page. -

      -

      -This page is part of the PCRE HTML documentation. It was generated automatically -from the original man page. If there is any nonsense in it, please consult the -man page, in case the conversion went wrong. -
      -

      -
      SYNOPSIS
      -

      -#include <pcre.h> -

      -

      -int (*pcre_callout)(pcre_callout_block *); -

      -

      -int (*pcre16_callout)(pcre16_callout_block *); -

      -

      -int (*pcre32_callout)(pcre32_callout_block *); -

      -
      DESCRIPTION
      -

      -PCRE provides a feature called "callout", which is a means of temporarily -passing control to the caller of PCRE in the middle of pattern matching. The -caller of PCRE provides an external function by putting its entry point in the -global variable pcre_callout (pcre16_callout for the 16-bit -library, pcre32_callout for the 32-bit library). By default, this -variable contains NULL, which disables all calling out. -

      -

      -Within a regular expression, (?C) indicates the points at which the external -function is to be called. Different callout points can be identified by putting -a number less than 256 after the letter C. The default value is zero. -For example, this pattern has two callout points: -

      -  (?C1)abc(?C2)def
      -
      -If the PCRE_AUTO_CALLOUT option bit is set when a pattern is compiled, PCRE -automatically inserts callouts, all with number 255, before each item in the -pattern. For example, if PCRE_AUTO_CALLOUT is used with the pattern -
      -  A(\d{2}|--)
      -
      -it is processed as if it were -
      -
      -(?C255)A(?C255)((?C255)\d{2}(?C255)|(?C255)-(?C255)-(?C255))(?C255) -
      -
      -Notice that there is a callout before and after each parenthesis and -alternation bar. If the pattern contains a conditional group whose condition is -an assertion, an automatic callout is inserted immediately before the -condition. Such a callout may also be inserted explicitly, for example: -
      -  (?(?C9)(?=a)ab|de)
      -
      -This applies only to assertion conditions (because they are themselves -independent groups). -

      -

      -Automatic callouts can be used for tracking the progress of pattern matching. -The -pcretest -program has a pattern qualifier (/C) that sets automatic callouts; when it is -used, the output indicates how the pattern is being matched. This is useful -information when you are trying to optimize the performance of a particular -pattern. -

      -
      MISSING CALLOUTS
      -

      -You should be aware that, because of optimizations in the way PCRE compiles and -matches patterns, callouts sometimes do not happen exactly as you might expect. -

      -

      -At compile time, PCRE "auto-possessifies" repeated items when it knows that -what follows cannot be part of the repeat. For example, a+[bc] is compiled as -if it were a++[bc]. The pcretest output when this pattern is anchored and -then applied with automatic callouts to the string "aaaa" is: -

      -  --->aaaa
      -   +0 ^        ^
      -   +1 ^        a+
      -   +3 ^   ^    [bc]
      -  No match
      -
      -This indicates that when matching [bc] fails, there is no backtracking into a+ -and therefore the callouts that would be taken for the backtracks do not occur. -You can disable the auto-possessify feature by passing PCRE_NO_AUTO_POSSESS -to pcre_compile(), or starting the pattern with (*NO_AUTO_POSSESS). If -this is done in pcretest (using the /O qualifier), the output changes to -this: -
      -  --->aaaa
      -   +0 ^        ^
      -   +1 ^        a+
      -   +3 ^   ^    [bc]
      -   +3 ^  ^     [bc]
      -   +3 ^ ^      [bc]
      -   +3 ^^       [bc]
      -  No match
      -
      -This time, when matching [bc] fails, the matcher backtracks into a+ and tries -again, repeatedly, until a+ itself fails. -

      -

      -Other optimizations that provide fast "no match" results also affect callouts. -For example, if the pattern is -

      -  ab(?C4)cd
      -
      -PCRE knows that any matching string must contain the letter "d". If the subject -string is "abyz", the lack of "d" means that matching doesn't ever start, and -the callout is never reached. However, with "abyd", though the result is still -no match, the callout is obeyed. -

      -

      -If the pattern is studied, PCRE knows the minimum length of a matching string, -and will immediately give a "no match" return without actually running a match -if the subject is not long enough, or, for unanchored patterns, if it has -been scanned far enough. -

      -

      -You can disable these optimizations by passing the PCRE_NO_START_OPTIMIZE -option to the matching function, or by starting the pattern with -(*NO_START_OPT). This slows down the matching process, but does ensure that -callouts such as the example above are obeyed. -

      -
      THE CALLOUT INTERFACE
      -

      -During matching, when PCRE reaches a callout point, the external function -defined by pcre_callout or pcre[16|32]_callout is called (if it is -set). This applies to both normal and DFA matching. The only argument to the -callout function is a pointer to a pcre_callout or -pcre[16|32]_callout block. These structures contains the following -fields: -

      -  int           version;
      -  int           callout_number;
      -  int          *offset_vector;
      -  const char   *subject;           (8-bit version)
      -  PCRE_SPTR16   subject;           (16-bit version)
      -  PCRE_SPTR32   subject;           (32-bit version)
      -  int           subject_length;
      -  int           start_match;
      -  int           current_position;
      -  int           capture_top;
      -  int           capture_last;
      -  void         *callout_data;
      -  int           pattern_position;
      -  int           next_item_length;
      -  const unsigned char *mark;       (8-bit version)
      -  const PCRE_UCHAR16  *mark;       (16-bit version)
      -  const PCRE_UCHAR32  *mark;       (32-bit version)
      -
      -The version field is an integer containing the version number of the -block format. The initial version was 0; the current version is 2. The version -number will change again in future if additional fields are added, but the -intention is never to remove any of the existing fields. -

      -

      -The callout_number field contains the number of the callout, as compiled -into the pattern (that is, the number after ?C for manual callouts, and 255 for -automatically generated callouts). -

      -

      -The offset_vector field is a pointer to the vector of offsets that was -passed by the caller to the matching function. When pcre_exec() or -pcre[16|32]_exec() is used, the contents can be inspected, in order to -extract substrings that have been matched so far, in the same way as for -extracting substrings after a match has completed. For the DFA matching -functions, this field is not useful. -

      -

      -The subject and subject_length fields contain copies of the values -that were passed to the matching function. -

      -

      -The start_match field normally contains the offset within the subject at -which the current match attempt started. However, if the escape sequence \K -has been encountered, this value is changed to reflect the modified starting -point. If the pattern is not anchored, the callout function may be called -several times from the same point in the pattern for different starting points -in the subject. -

      -

      -The current_position field contains the offset within the subject of the -current match pointer. -

      -

      -When the pcre_exec() or pcre[16|32]_exec() is used, the -capture_top field contains one more than the number of the highest -numbered captured substring so far. If no substrings have been captured, the -value of capture_top is one. This is always the case when the DFA -functions are used, because they do not support captured substrings. -

      -

      -The capture_last field contains the number of the most recently captured -substring. However, when a recursion exits, the value reverts to what it was -outside the recursion, as do the values of all captured substrings. If no -substrings have been captured, the value of capture_last is -1. This is -always the case for the DFA matching functions. -

      -

      -The callout_data field contains a value that is passed to a matching -function specifically so that it can be passed back in callouts. It is passed -in the callout_data field of a pcre_extra or pcre[16|32]_extra -data structure. If no such data was passed, the value of callout_data in -a callout block is NULL. There is a description of the pcre_extra -structure in the -pcreapi -documentation. -

      -

      -The pattern_position field is present from version 1 of the callout -structure. It contains the offset to the next item to be matched in the pattern -string. -

      -

      -The next_item_length field is present from version 1 of the callout -structure. It contains the length of the next item to be matched in the pattern -string. When the callout immediately precedes an alternation bar, a closing -parenthesis, or the end of the pattern, the length is zero. When the callout -precedes an opening parenthesis, the length is that of the entire subpattern. -

      -

      -The pattern_position and next_item_length fields are intended to -help in distinguishing between different automatic callouts, which all have the -same callout number. However, they are set for all callouts. -

      -

      -The mark field is present from version 2 of the callout structure. In -callouts from pcre_exec() or pcre[16|32]_exec() it contains a -pointer to the zero-terminated name of the most recently passed (*MARK), -(*PRUNE), or (*THEN) item in the match, or NULL if no such items have been -passed. Instances of (*PRUNE) or (*THEN) without a name do not obliterate a -previous (*MARK). In callouts from the DFA matching functions this field always -contains NULL. -

      -
      RETURN VALUES
      -

      -The external callout function returns an integer to PCRE. If the value is zero, -matching proceeds as normal. If the value is greater than zero, matching fails -at the current point, but the testing of other matching possibilities goes -ahead, just as if a lookahead assertion had failed. If the value is less than -zero, the match is abandoned, the matching function returns the negative value. -

      -

      -Negative values should normally be chosen from the set of PCRE_ERROR_xxx -values. In particular, PCRE_ERROR_NOMATCH forces a standard "no match" failure. -The error number PCRE_ERROR_CALLOUT is reserved for use by callout functions; -it will never be used by PCRE itself. -

      -
      AUTHOR
      -

      -Philip Hazel -
      -University Computing Service -
      -Cambridge CB2 3QH, England. -
      -

      -
      REVISION
      -

      -Last updated: 12 November 2013 -
      -Copyright © 1997-2013 University of Cambridge. -
      -

      -Return to the PCRE index page. -

      diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcrecompat.html b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcrecompat.html deleted file mode 100644 index d95570ef..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcrecompat.html +++ /dev/null @@ -1,235 +0,0 @@ - - -pcrecompat specification - - -

      pcrecompat man page

      -

      -Return to the PCRE index page. -

      -

      -This page is part of the PCRE HTML documentation. It was generated automatically -from the original man page. If there is any nonsense in it, please consult the -man page, in case the conversion went wrong. -
      -
      -DIFFERENCES BETWEEN PCRE AND PERL -
      -

      -This document describes the differences in the ways that PCRE and Perl handle -regular expressions. The differences described here are with respect to Perl -versions 5.10 and above. -

      -

      -1. PCRE has only a subset of Perl's Unicode support. Details of what it does -have are given in the -pcreunicode -page. -

      -

      -2. PCRE allows repeat quantifiers only on parenthesized assertions, but they do -not mean what you might think. For example, (?!a){3} does not assert that the -next three characters are not "a". It just asserts that the next character is -not "a" three times (in principle: PCRE optimizes this to run the assertion -just once). Perl allows repeat quantifiers on other assertions such as \b, but -these do not seem to have any use. -

      -

      -3. Capturing subpatterns that occur inside negative lookahead assertions are -counted, but their entries in the offsets vector are never set. Perl sometimes -(but not always) sets its numerical variables from inside negative assertions. -

      -

      -4. Though binary zero characters are supported in the subject string, they are -not allowed in a pattern string because it is passed as a normal C string, -terminated by zero. The escape sequence \0 can be used in the pattern to -represent a binary zero. -

      -

      -5. The following Perl escape sequences are not supported: \l, \u, \L, -\U, and \N when followed by a character name or Unicode value. (\N on its -own, matching a non-newline character, is supported.) In fact these are -implemented by Perl's general string-handling and are not part of its pattern -matching engine. If any of these are encountered by PCRE, an error is -generated by default. However, if the PCRE_JAVASCRIPT_COMPAT option is set, -\U and \u are interpreted as JavaScript interprets them. -

      -

      -6. The Perl escape sequences \p, \P, and \X are supported only if PCRE is -built with Unicode character property support. The properties that can be -tested with \p and \P are limited to the general category properties such as -Lu and Nd, script names such as Greek or Han, and the derived properties Any -and L&. PCRE does support the Cs (surrogate) property, which Perl does not; the -Perl documentation says "Because Perl hides the need for the user to understand -the internal representation of Unicode characters, there is no need to -implement the somewhat messy concept of surrogates." -

      -

      -7. PCRE does support the \Q...\E escape for quoting substrings. Characters in -between are treated as literals. This is slightly different from Perl in that $ -and @ are also handled as literals inside the quotes. In Perl, they cause -variable interpolation (but of course PCRE does not have variables). Note the -following examples: -

      -    Pattern            PCRE matches      Perl matches
      -
      -    \Qabc$xyz\E        abc$xyz           abc followed by the contents of $xyz
      -    \Qabc\$xyz\E       abc\$xyz          abc\$xyz
      -    \Qabc\E\$\Qxyz\E   abc$xyz           abc$xyz
      -
      -The \Q...\E sequence is recognized both inside and outside character classes. -

      -

      -8. Fairly obviously, PCRE does not support the (?{code}) and (??{code}) -constructions. However, there is support for recursive patterns. This is not -available in Perl 5.8, but it is in Perl 5.10. Also, the PCRE "callout" -feature allows an external function to be called during pattern matching. See -the -pcrecallout -documentation for details. -

      -

      -9. Subpatterns that are called as subroutines (whether or not recursively) are -always treated as atomic groups in PCRE. This is like Python, but unlike Perl. -Captured values that are set outside a subroutine call can be reference from -inside in PCRE, but not in Perl. There is a discussion that explains these -differences in more detail in the -section on recursion differences from Perl -in the -pcrepattern -page. -

      -

      -10. If any of the backtracking control verbs are used in a subpattern that is -called as a subroutine (whether or not recursively), their effect is confined -to that subpattern; it does not extend to the surrounding pattern. This is not -always the case in Perl. In particular, if (*THEN) is present in a group that -is called as a subroutine, its action is limited to that group, even if the -group does not contain any | characters. Note that such subpatterns are -processed as anchored at the point where they are tested. -

      -

      -11. If a pattern contains more than one backtracking control verb, the first -one that is backtracked onto acts. For example, in the pattern -A(*COMMIT)B(*PRUNE)C a failure in B triggers (*COMMIT), but a failure in C -triggers (*PRUNE). Perl's behaviour is more complex; in many cases it is the -same as PCRE, but there are examples where it differs. -

      -

      -12. Most backtracking verbs in assertions have their normal actions. They are -not confined to the assertion. -

      -

      -13. There are some differences that are concerned with the settings of captured -strings when part of a pattern is repeated. For example, matching "aba" against -the pattern /^(a(b)?)+$/ in Perl leaves $2 unset, but in PCRE it is set to "b". -

      -

      -14. PCRE's handling of duplicate subpattern numbers and duplicate subpattern -names is not as general as Perl's. This is a consequence of the fact the PCRE -works internally just with numbers, using an external table to translate -between numbers and names. In particular, a pattern such as (?|(?<a>A)|(?<b>B), -where the two capturing parentheses have the same number but different names, -is not supported, and causes an error at compile time. If it were allowed, it -would not be possible to distinguish which parentheses matched, because both -names map to capturing subpattern number 1. To avoid this confusing situation, -an error is given at compile time. -

      -

      -15. Perl recognizes comments in some places that PCRE does not, for example, -between the ( and ? at the start of a subpattern. If the /x modifier is set, -Perl allows white space between ( and ? (though current Perls warn that this is -deprecated) but PCRE never does, even if the PCRE_EXTENDED option is set. -

      -

      -16. Perl, when in warning mode, gives warnings for character classes such as -[A-\d] or [a-[:digit:]]. It then treats the hyphens as literals. PCRE has no -warning features, so it gives an error in these cases because they are almost -certainly user mistakes. -

      -

      -17. In PCRE, the upper/lower case character properties Lu and Ll are not -affected when case-independent matching is specified. For example, \p{Lu} -always matches an upper case letter. I think Perl has changed in this respect; -in the release at the time of writing (5.16), \p{Lu} and \p{Ll} match all -letters, regardless of case, when case independence is specified. -

      -

      -18. PCRE provides some extensions to the Perl regular expression facilities. -Perl 5.10 includes new features that are not in earlier versions of Perl, some -of which (such as named parentheses) have been in PCRE for some time. This list -is with respect to Perl 5.10: -
      -
      -(a) Although lookbehind assertions in PCRE must match fixed length strings, -each alternative branch of a lookbehind assertion can match a different length -of string. Perl requires them all to have the same length. -
      -
      -(b) If PCRE_DOLLAR_ENDONLY is set and PCRE_MULTILINE is not set, the $ -meta-character matches only at the very end of the string. -
      -
      -(c) If PCRE_EXTRA is set, a backslash followed by a letter with no special -meaning is faulted. Otherwise, like Perl, the backslash is quietly ignored. -(Perl can be made to issue a warning.) -
      -
      -(d) If PCRE_UNGREEDY is set, the greediness of the repetition quantifiers is -inverted, that is, by default they are not greedy, but if followed by a -question mark they are. -
      -
      -(e) PCRE_ANCHORED can be used at matching time to force a pattern to be tried -only at the first matching position in the subject string. -
      -
      -(f) The PCRE_NOTBOL, PCRE_NOTEOL, PCRE_NOTEMPTY, PCRE_NOTEMPTY_ATSTART, and -PCRE_NO_AUTO_CAPTURE options for pcre_exec() have no Perl equivalents. -
      -
      -(g) The \R escape sequence can be restricted to match only CR, LF, or CRLF -by the PCRE_BSR_ANYCRLF option. -
      -
      -(h) The callout facility is PCRE-specific. -
      -
      -(i) The partial matching facility is PCRE-specific. -
      -
      -(j) Patterns compiled by PCRE can be saved and re-used at a later time, even on -different hosts that have the other endianness. However, this does not apply to -optimized data created by the just-in-time compiler. -
      -
      -(k) The alternative matching functions (pcre_dfa_exec(), -pcre16_dfa_exec() and pcre32_dfa_exec(),) match in a different way -and are not Perl-compatible. -
      -
      -(l) PCRE recognizes some special sequences such as (*CR) at the start of -a pattern that set overall options that cannot be changed within the pattern. -

      -
      -AUTHOR -
      -

      -Philip Hazel -
      -University Computing Service -
      -Cambridge CB2 3QH, England. -
      -

      -
      -REVISION -
      -

      -Last updated: 10 November 2013 -
      -Copyright © 1997-2013 University of Cambridge. -
      -

      -Return to the PCRE index page. -

      diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcrecpp.html b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcrecpp.html deleted file mode 100644 index b7eac3a3..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcrecpp.html +++ /dev/null @@ -1,368 +0,0 @@ - - -pcrecpp specification - - -

      pcrecpp man page

      -

      -Return to the PCRE index page. -

      -

      -This page is part of the PCRE HTML documentation. It was generated automatically -from the original man page. If there is any nonsense in it, please consult the -man page, in case the conversion went wrong. -
      -

      -
      SYNOPSIS OF C++ WRAPPER
      -

      -#include <pcrecpp.h> -

      -
      DESCRIPTION
      -

      -The C++ wrapper for PCRE was provided by Google Inc. Some additional -functionality was added by Giuseppe Maxia. This brief man page was constructed -from the notes in the pcrecpp.h file, which should be consulted for -further details. Note that the C++ wrapper supports only the original 8-bit -PCRE library. There is no 16-bit or 32-bit support at present. -

      -
      MATCHING INTERFACE
      -

      -The "FullMatch" operation checks that supplied text matches a supplied pattern -exactly. If pointer arguments are supplied, it copies matched sub-strings that -match sub-patterns into them. -

      -  Example: successful match
      -     pcrecpp::RE re("h.*o");
      -     re.FullMatch("hello");
      -
      -  Example: unsuccessful match (requires full match):
      -     pcrecpp::RE re("e");
      -     !re.FullMatch("hello");
      -
      -  Example: creating a temporary RE object:
      -     pcrecpp::RE("h.*o").FullMatch("hello");
      -
      -You can pass in a "const char*" or a "string" for "text". The examples below -tend to use a const char*. You can, as in the different examples above, store -the RE object explicitly in a variable or use a temporary RE object. The -examples below use one mode or the other arbitrarily. Either could correctly be -used for any of these examples. -

      -

      -You must supply extra pointer arguments to extract matched subpieces. -

      -  Example: extracts "ruby" into "s" and 1234 into "i"
      -     int i;
      -     string s;
      -     pcrecpp::RE re("(\\w+):(\\d+)");
      -     re.FullMatch("ruby:1234", &s, &i);
      -
      -  Example: does not try to extract any extra sub-patterns
      -     re.FullMatch("ruby:1234", &s);
      -
      -  Example: does not try to extract into NULL
      -     re.FullMatch("ruby:1234", NULL, &i);
      -
      -  Example: integer overflow causes failure
      -     !re.FullMatch("ruby:1234567891234", NULL, &i);
      -
      -  Example: fails because there aren't enough sub-patterns:
      -     !pcrecpp::RE("\\w+:\\d+").FullMatch("ruby:1234", &s);
      -
      -  Example: fails because string cannot be stored in integer
      -     !pcrecpp::RE("(.*)").FullMatch("ruby", &i);
      -
      -The provided pointer arguments can be pointers to any scalar numeric -type, or one of: -
      -   string        (matched piece is copied to string)
      -   StringPiece   (StringPiece is mutated to point to matched piece)
      -   T             (where "bool T::ParseFrom(const char*, int)" exists)
      -   NULL          (the corresponding matched sub-pattern is not copied)
      -
      -The function returns true iff all of the following conditions are satisfied: -
      -  a. "text" matches "pattern" exactly;
      -
      -  b. The number of matched sub-patterns is >= number of supplied
      -     pointers;
      -
      -  c. The "i"th argument has a suitable type for holding the
      -     string captured as the "i"th sub-pattern. If you pass in
      -     void * NULL for the "i"th argument, or a non-void * NULL
      -     of the correct type, or pass fewer arguments than the
      -     number of sub-patterns, "i"th captured sub-pattern is
      -     ignored.
      -
      -CAVEAT: An optional sub-pattern that does not exist in the matched -string is assigned the empty string. Therefore, the following will -return false (because the empty string is not a valid number): -
      -   int number;
      -   pcrecpp::RE::FullMatch("abc", "[a-z]+(\\d+)?", &number);
      -
      -The matching interface supports at most 16 arguments per call. -If you need more, consider using the more general interface -pcrecpp::RE::DoMatch. See pcrecpp.h for the signature for -DoMatch. -

      -

      -NOTE: Do not use no_arg, which is used internally to mark the end of a -list of optional arguments, as a placeholder for missing arguments, as this can -lead to segfaults. -

      -
      QUOTING METACHARACTERS
      -

      -You can use the "QuoteMeta" operation to insert backslashes before all -potentially meaningful characters in a string. The returned string, used as a -regular expression, will exactly match the original string. -

      -  Example:
      -     string quoted = RE::QuoteMeta(unquoted);
      -
      -Note that it's legal to escape a character even if it has no special meaning in -a regular expression -- so this function does that. (This also makes it -identical to the perl function of the same name; see "perldoc -f quotemeta".) -For example, "1.5-2.0?" becomes "1\.5\-2\.0\?". -

      -
      PARTIAL MATCHES
      -

      -You can use the "PartialMatch" operation when you want the pattern -to match any substring of the text. -

      -  Example: simple search for a string:
      -     pcrecpp::RE("ell").PartialMatch("hello");
      -
      -  Example: find first number in a string:
      -     int number;
      -     pcrecpp::RE re("(\\d+)");
      -     re.PartialMatch("x*100 + 20", &number);
      -     assert(number == 100);
      -
      -

      -
      UTF-8 AND THE MATCHING INTERFACE
      -

      -By default, pattern and text are plain text, one byte per character. The UTF8 -flag, passed to the constructor, causes both pattern and string to be treated -as UTF-8 text, still a byte stream but potentially multiple bytes per -character. In practice, the text is likelier to be UTF-8 than the pattern, but -the match returned may depend on the UTF8 flag, so always use it when matching -UTF8 text. For example, "." will match one byte normally but with UTF8 set may -match up to three bytes of a multi-byte character. -

      -  Example:
      -     pcrecpp::RE_Options options;
      -     options.set_utf8();
      -     pcrecpp::RE re(utf8_pattern, options);
      -     re.FullMatch(utf8_string);
      -
      -  Example: using the convenience function UTF8():
      -     pcrecpp::RE re(utf8_pattern, pcrecpp::UTF8());
      -     re.FullMatch(utf8_string);
      -
      -NOTE: The UTF8 flag is ignored if pcre was not configured with the -
      -      --enable-utf8 flag.
      -
      -

      -
      PASSING MODIFIERS TO THE REGULAR EXPRESSION ENGINE
      -

      -PCRE defines some modifiers to change the behavior of the regular expression -engine. The C++ wrapper defines an auxiliary class, RE_Options, as a vehicle to -pass such modifiers to a RE class. Currently, the following modifiers are -supported: -

      -   modifier              description               Perl corresponding
      -
      -   PCRE_CASELESS         case insensitive match      /i
      -   PCRE_MULTILINE        multiple lines match        /m
      -   PCRE_DOTALL           dot matches newlines        /s
      -   PCRE_DOLLAR_ENDONLY   $ matches only at end       N/A
      -   PCRE_EXTRA            strict escape parsing       N/A
      -   PCRE_EXTENDED         ignore white spaces         /x
      -   PCRE_UTF8             handles UTF8 chars          built-in
      -   PCRE_UNGREEDY         reverses * and *?           N/A
      -   PCRE_NO_AUTO_CAPTURE  disables capturing parens   N/A (*)
      -
      -(*) Both Perl and PCRE allow non capturing parentheses by means of the -"?:" modifier within the pattern itself. e.g. (?:ab|cd) does not -capture, while (ab|cd) does. -

      -

      -For a full account on how each modifier works, please check the -PCRE API reference page. -

      -

      -For each modifier, there are two member functions whose name is made -out of the modifier in lowercase, without the "PCRE_" prefix. For -instance, PCRE_CASELESS is handled by -

      -  bool caseless()
      -
      -which returns true if the modifier is set, and -
      -  RE_Options & set_caseless(bool)
      -
      -which sets or unsets the modifier. Moreover, PCRE_EXTRA_MATCH_LIMIT can be -accessed through the set_match_limit() and match_limit() member -functions. Setting match_limit to a non-zero value will limit the -execution of pcre to keep it from doing bad things like blowing the stack or -taking an eternity to return a result. A value of 5000 is good enough to stop -stack blowup in a 2MB thread stack. Setting match_limit to zero disables -match limiting. Alternatively, you can call match_limit_recursion() -which uses PCRE_EXTRA_MATCH_LIMIT_RECURSION to limit how much PCRE -recurses. match_limit() limits the number of matches PCRE does; -match_limit_recursion() limits the depth of internal recursion, and -therefore the amount of stack that is used. -

      -

      -Normally, to pass one or more modifiers to a RE class, you declare -a RE_Options object, set the appropriate options, and pass this -object to a RE constructor. Example: -

      -   RE_Options opt;
      -   opt.set_caseless(true);
      -   if (RE("HELLO", opt).PartialMatch("hello world")) ...
      -
      -RE_options has two constructors. The default constructor takes no arguments and -creates a set of flags that are off by default. The optional parameter -option_flags is to facilitate transfer of legacy code from C programs. -This lets you do -
      -   RE(pattern,
      -     RE_Options(PCRE_CASELESS|PCRE_MULTILINE)).PartialMatch(str);
      -
      -However, new code is better off doing -
      -   RE(pattern,
      -     RE_Options().set_caseless(true).set_multiline(true))
      -       .PartialMatch(str);
      -
      -If you are going to pass one of the most used modifiers, there are some -convenience functions that return a RE_Options class with the -appropriate modifier already set: CASELESS(), UTF8(), -MULTILINE(), DOTALL(), and EXTENDED(). -

      -

      -If you need to set several options at once, and you don't want to go through -the pains of declaring a RE_Options object and setting several options, there -is a parallel method that give you such ability on the fly. You can concatenate -several set_xxxxx() member functions, since each of them returns a -reference to its class object. For example, to pass PCRE_CASELESS, -PCRE_EXTENDED, and PCRE_MULTILINE to a RE with one statement, you may write: -

      -   RE(" ^ xyz \\s+ .* blah$",
      -     RE_Options()
      -       .set_caseless(true)
      -       .set_extended(true)
      -       .set_multiline(true)).PartialMatch(sometext);
      -
      -
      -

      -
      SCANNING TEXT INCREMENTALLY
      -

      -The "Consume" operation may be useful if you want to repeatedly -match regular expressions at the front of a string and skip over -them as they match. This requires use of the "StringPiece" type, -which represents a sub-range of a real string. Like RE, StringPiece -is defined in the pcrecpp namespace. -

      -  Example: read lines of the form "var = value" from a string.
      -     string contents = ...;                 // Fill string somehow
      -     pcrecpp::StringPiece input(contents);  // Wrap in a StringPiece
      -
      -     string var;
      -     int value;
      -     pcrecpp::RE re("(\\w+) = (\\d+)\n");
      -     while (re.Consume(&input, &var, &value)) {
      -       ...;
      -     }
      -
      -Each successful call to "Consume" will set "var/value", and also -advance "input" so it points past the matched text. -

      -

      -The "FindAndConsume" operation is similar to "Consume" but does not -anchor your match at the beginning of the string. For example, you -could extract all words from a string by repeatedly calling -

      -  pcrecpp::RE("(\\w+)").FindAndConsume(&input, &word)
      -
      -

      -
      PARSING HEX/OCTAL/C-RADIX NUMBERS
      -

      -By default, if you pass a pointer to a numeric value, the -corresponding text is interpreted as a base-10 number. You can -instead wrap the pointer with a call to one of the operators Hex(), -Octal(), or CRadix() to interpret the text in another base. The -CRadix operator interprets C-style "0" (base-8) and "0x" (base-16) -prefixes, but defaults to base-10. -

      -  Example:
      -    int a, b, c, d;
      -    pcrecpp::RE re("(.*) (.*) (.*) (.*)");
      -    re.FullMatch("100 40 0100 0x40",
      -                 pcrecpp::Octal(&a), pcrecpp::Hex(&b),
      -                 pcrecpp::CRadix(&c), pcrecpp::CRadix(&d));
      -
      -will leave 64 in a, b, c, and d. -

      -
      REPLACING PARTS OF STRINGS
      -

      -You can replace the first match of "pattern" in "str" with "rewrite". -Within "rewrite", backslash-escaped digits (\1 to \9) can be -used to insert text matching corresponding parenthesized group -from the pattern. \0 in "rewrite" refers to the entire matching -text. For example: -

      -  string s = "yabba dabba doo";
      -  pcrecpp::RE("b+").Replace("d", &s);
      -
      -will leave "s" containing "yada dabba doo". The result is true if the pattern -matches and a replacement occurs, false otherwise. -

      -

      -GlobalReplace is like Replace except that it replaces all -occurrences of the pattern in the string with the rewrite. Replacements are -not subject to re-matching. For example: -

      -  string s = "yabba dabba doo";
      -  pcrecpp::RE("b+").GlobalReplace("d", &s);
      -
      -will leave "s" containing "yada dada doo". It returns the number of -replacements made. -

      -

      -Extract is like Replace, except that if the pattern matches, -"rewrite" is copied into "out" (an additional argument) with substitutions. -The non-matching portions of "text" are ignored. Returns true iff a match -occurred and the extraction happened successfully; if no match occurs, the -string is left unaffected. -

      -
      AUTHOR
      -

      -The C++ wrapper was contributed by Google Inc. -
      -Copyright © 2007 Google Inc. -
      -

      -
      REVISION
      -

      -Last updated: 08 January 2012 -
      -

      -Return to the PCRE index page. -

      diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcredemo.html b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcredemo.html deleted file mode 100644 index 894a9308..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcredemo.html +++ /dev/null @@ -1,426 +0,0 @@ - - -pcredemo specification - - -

      pcredemo man page

      -

      -Return to the PCRE index page. -

      -

      -This page is part of the PCRE HTML documentation. It was generated automatically -from the original man page. If there is any nonsense in it, please consult the -man page, in case the conversion went wrong. -
      -

        -
      -
      -/*************************************************
      -*           PCRE DEMONSTRATION PROGRAM           *
      -*************************************************/
      -
      -/* This is a demonstration program to illustrate the most straightforward ways
      -of calling the PCRE regular expression library from a C program. See the
      -pcresample documentation for a short discussion ("man pcresample" if you have
      -the PCRE man pages installed).
      -
      -In Unix-like environments, if PCRE is installed in your standard system
      -libraries, you should be able to compile this program using this command:
      -
      -gcc -Wall pcredemo.c -lpcre -o pcredemo
      -
      -If PCRE is not installed in a standard place, it is likely to be installed with
      -support for the pkg-config mechanism. If you have pkg-config, you can compile
      -this program using this command:
      -
      -gcc -Wall pcredemo.c `pkg-config --cflags --libs libpcre` -o pcredemo
      -
      -If you do not have pkg-config, you may have to use this:
      -
      -gcc -Wall pcredemo.c -I/usr/local/include -L/usr/local/lib \
      -  -R/usr/local/lib -lpcre -o pcredemo
      -
      -Replace "/usr/local/include" and "/usr/local/lib" with wherever the include and
      -library files for PCRE are installed on your system. Only some operating
      -systems (e.g. Solaris) use the -R option.
      -
      -Building under Windows:
      -
      -If you want to statically link this program against a non-dll .a file, you must
      -define PCRE_STATIC before including pcre.h, otherwise the pcre_malloc() and
      -pcre_free() exported functions will be declared __declspec(dllimport), with
      -unwanted results. So in this environment, uncomment the following line. */
      -
      -/* #define PCRE_STATIC */
      -
      -#include <stdio.h>
      -#include <string.h>
      -#include <pcre.h>
      -
      -#define OVECCOUNT 30    /* should be a multiple of 3 */
      -
      -
      -int main(int argc, char **argv)
      -{
      -pcre *re;
      -const char *error;
      -char *pattern;
      -char *subject;
      -unsigned char *name_table;
      -unsigned int option_bits;
      -int erroffset;
      -int find_all;
      -int crlf_is_newline;
      -int namecount;
      -int name_entry_size;
      -int ovector[OVECCOUNT];
      -int subject_length;
      -int rc, i;
      -int utf8;
      -
      -
      -/**************************************************************************
      -* First, sort out the command line. There is only one possible option at  *
      -* the moment, "-g" to request repeated matching to find all occurrences,  *
      -* like Perl's /g option. We set the variable find_all to a non-zero value *
      -* if the -g option is present. Apart from that, there must be exactly two *
      -* arguments.                                                              *
      -**************************************************************************/
      -
      -find_all = 0;
      -for (i = 1; i < argc; i++)
      -  {
      -  if (strcmp(argv[i], "-g") == 0) find_all = 1;
      -    else break;
      -  }
      -
      -/* After the options, we require exactly two arguments, which are the pattern,
      -and the subject string. */
      -
      -if (argc - i != 2)
      -  {
      -  printf("Two arguments required: a regex and a subject string\n");
      -  return 1;
      -  }
      -
      -pattern = argv[i];
      -subject = argv[i+1];
      -subject_length = (int)strlen(subject);
      -
      -
      -/*************************************************************************
      -* Now we are going to compile the regular expression pattern, and handle *
      -* and errors that are detected.                                          *
      -*************************************************************************/
      -
      -re = pcre_compile(
      -  pattern,              /* the pattern */
      -  0,                    /* default options */
      -  &error,               /* for error message */
      -  &erroffset,           /* for error offset */
      -  NULL);                /* use default character tables */
      -
      -/* Compilation failed: print the error message and exit */
      -
      -if (re == NULL)
      -  {
      -  printf("PCRE compilation failed at offset %d: %s\n", erroffset, error);
      -  return 1;
      -  }
      -
      -
      -/*************************************************************************
      -* If the compilation succeeded, we call PCRE again, in order to do a     *
      -* pattern match against the subject string. This does just ONE match. If *
      -* further matching is needed, it will be done below.                     *
      -*************************************************************************/
      -
      -rc = pcre_exec(
      -  re,                   /* the compiled pattern */
      -  NULL,                 /* no extra data - we didn't study the pattern */
      -  subject,              /* the subject string */
      -  subject_length,       /* the length of the subject */
      -  0,                    /* start at offset 0 in the subject */
      -  0,                    /* default options */
      -  ovector,              /* output vector for substring information */
      -  OVECCOUNT);           /* number of elements in the output vector */
      -
      -/* Matching failed: handle error cases */
      -
      -if (rc < 0)
      -  {
      -  switch(rc)
      -    {
      -    case PCRE_ERROR_NOMATCH: printf("No match\n"); break;
      -    /*
      -    Handle other special cases if you like
      -    */
      -    default: printf("Matching error %d\n", rc); break;
      -    }
      -  pcre_free(re);     /* Release memory used for the compiled pattern */
      -  return 1;
      -  }
      -
      -/* Match succeded */
      -
      -printf("\nMatch succeeded at offset %d\n", ovector[0]);
      -
      -
      -/*************************************************************************
      -* We have found the first match within the subject string. If the output *
      -* vector wasn't big enough, say so. Then output any substrings that were *
      -* captured.                                                              *
      -*************************************************************************/
      -
      -/* The output vector wasn't big enough */
      -
      -if (rc == 0)
      -  {
      -  rc = OVECCOUNT/3;
      -  printf("ovector only has room for %d captured substrings\n", rc - 1);
      -  }
      -
      -/* Show substrings stored in the output vector by number. Obviously, in a real
      -application you might want to do things other than print them. */
      -
      -for (i = 0; i < rc; i++)
      -  {
      -  char *substring_start = subject + ovector[2*i];
      -  int substring_length = ovector[2*i+1] - ovector[2*i];
      -  printf("%2d: %.*s\n", i, substring_length, substring_start);
      -  }
      -
      -
      -/**************************************************************************
      -* That concludes the basic part of this demonstration program. We have    *
      -* compiled a pattern, and performed a single match. The code that follows *
      -* shows first how to access named substrings, and then how to code for    *
      -* repeated matches on the same subject.                                   *
      -**************************************************************************/
      -
      -/* See if there are any named substrings, and if so, show them by name. First
      -we have to extract the count of named parentheses from the pattern. */
      -
      -(void)pcre_fullinfo(
      -  re,                   /* the compiled pattern */
      -  NULL,                 /* no extra data - we didn't study the pattern */
      -  PCRE_INFO_NAMECOUNT,  /* number of named substrings */
      -  &namecount);          /* where to put the answer */
      -
      -if (namecount <= 0) printf("No named substrings\n"); else
      -  {
      -  unsigned char *tabptr;
      -  printf("Named substrings\n");
      -
      -  /* Before we can access the substrings, we must extract the table for
      -  translating names to numbers, and the size of each entry in the table. */
      -
      -  (void)pcre_fullinfo(
      -    re,                       /* the compiled pattern */
      -    NULL,                     /* no extra data - we didn't study the pattern */
      -    PCRE_INFO_NAMETABLE,      /* address of the table */
      -    &name_table);             /* where to put the answer */
      -
      -  (void)pcre_fullinfo(
      -    re,                       /* the compiled pattern */
      -    NULL,                     /* no extra data - we didn't study the pattern */
      -    PCRE_INFO_NAMEENTRYSIZE,  /* size of each entry in the table */
      -    &name_entry_size);        /* where to put the answer */
      -
      -  /* Now we can scan the table and, for each entry, print the number, the name,
      -  and the substring itself. */
      -
      -  tabptr = name_table;
      -  for (i = 0; i < namecount; i++)
      -    {
      -    int n = (tabptr[0] << 8) | tabptr[1];
      -    printf("(%d) %*s: %.*s\n", n, name_entry_size - 3, tabptr + 2,
      -      ovector[2*n+1] - ovector[2*n], subject + ovector[2*n]);
      -    tabptr += name_entry_size;
      -    }
      -  }
      -
      -
      -/*************************************************************************
      -* If the "-g" option was given on the command line, we want to continue  *
      -* to search for additional matches in the subject string, in a similar   *
      -* way to the /g option in Perl. This turns out to be trickier than you   *
      -* might think because of the possibility of matching an empty string.    *
      -* What happens is as follows:                                            *
      -*                                                                        *
      -* If the previous match was NOT for an empty string, we can just start   *
      -* the next match at the end of the previous one.                         *
      -*                                                                        *
      -* If the previous match WAS for an empty string, we can't do that, as it *
      -* would lead to an infinite loop. Instead, a special call of pcre_exec() *
      -* is made with the PCRE_NOTEMPTY_ATSTART and PCRE_ANCHORED flags set.    *
      -* The first of these tells PCRE that an empty string at the start of the *
      -* subject is not a valid match; other possibilities must be tried. The   *
      -* second flag restricts PCRE to one match attempt at the initial string  *
      -* position. If this match succeeds, an alternative to the empty string   *
      -* match has been found, and we can print it and proceed round the loop,  *
      -* advancing by the length of whatever was found. If this match does not  *
      -* succeed, we still stay in the loop, advancing by just one character.   *
      -* In UTF-8 mode, which can be set by (*UTF8) in the pattern, this may be *
      -* more than one byte.                                                    *
      -*                                                                        *
      -* However, there is a complication concerned with newlines. When the     *
      -* newline convention is such that CRLF is a valid newline, we must       *
      -* advance by two characters rather than one. The newline convention can  *
      -* be set in the regex by (*CR), etc.; if not, we must find the default.  *
      -*************************************************************************/
      -
      -if (!find_all)     /* Check for -g */
      -  {
      -  pcre_free(re);   /* Release the memory used for the compiled pattern */
      -  return 0;        /* Finish unless -g was given */
      -  }
      -
      -/* Before running the loop, check for UTF-8 and whether CRLF is a valid newline
      -sequence. First, find the options with which the regex was compiled; extract
      -the UTF-8 state, and mask off all but the newline options. */
      -
      -(void)pcre_fullinfo(re, NULL, PCRE_INFO_OPTIONS, &option_bits);
      -utf8 = option_bits & PCRE_UTF8;
      -option_bits &= PCRE_NEWLINE_CR|PCRE_NEWLINE_LF|PCRE_NEWLINE_CRLF|
      -               PCRE_NEWLINE_ANY|PCRE_NEWLINE_ANYCRLF;
      -
      -/* If no newline options were set, find the default newline convention from the
      -build configuration. */
      -
      -if (option_bits == 0)
      -  {
      -  int d;
      -  (void)pcre_config(PCRE_CONFIG_NEWLINE, &d);
      -  /* Note that these values are always the ASCII ones, even in
      -  EBCDIC environments. CR = 13, NL = 10. */
      -  option_bits = (d == 13)? PCRE_NEWLINE_CR :
      -          (d == 10)? PCRE_NEWLINE_LF :
      -          (d == (13<<8 | 10))? PCRE_NEWLINE_CRLF :
      -          (d == -2)? PCRE_NEWLINE_ANYCRLF :
      -          (d == -1)? PCRE_NEWLINE_ANY : 0;
      -  }
      -
      -/* See if CRLF is a valid newline sequence. */
      -
      -crlf_is_newline =
      -     option_bits == PCRE_NEWLINE_ANY ||
      -     option_bits == PCRE_NEWLINE_CRLF ||
      -     option_bits == PCRE_NEWLINE_ANYCRLF;
      -
      -/* Loop for second and subsequent matches */
      -
      -for (;;)
      -  {
      -  int options = 0;                 /* Normally no options */
      -  int start_offset = ovector[1];   /* Start at end of previous match */
      -
      -  /* If the previous match was for an empty string, we are finished if we are
      -  at the end of the subject. Otherwise, arrange to run another match at the
      -  same point to see if a non-empty match can be found. */
      -
      -  if (ovector[0] == ovector[1])
      -    {
      -    if (ovector[0] == subject_length) break;
      -    options = PCRE_NOTEMPTY_ATSTART | PCRE_ANCHORED;
      -    }
      -
      -  /* Run the next matching operation */
      -
      -  rc = pcre_exec(
      -    re,                   /* the compiled pattern */
      -    NULL,                 /* no extra data - we didn't study the pattern */
      -    subject,              /* the subject string */
      -    subject_length,       /* the length of the subject */
      -    start_offset,         /* starting offset in the subject */
      -    options,              /* options */
      -    ovector,              /* output vector for substring information */
      -    OVECCOUNT);           /* number of elements in the output vector */
      -
      -  /* This time, a result of NOMATCH isn't an error. If the value in "options"
      -  is zero, it just means we have found all possible matches, so the loop ends.
      -  Otherwise, it means we have failed to find a non-empty-string match at a
      -  point where there was a previous empty-string match. In this case, we do what
      -  Perl does: advance the matching position by one character, and continue. We
      -  do this by setting the "end of previous match" offset, because that is picked
      -  up at the top of the loop as the point at which to start again.
      -
      -  There are two complications: (a) When CRLF is a valid newline sequence, and
      -  the current position is just before it, advance by an extra byte. (b)
      -  Otherwise we must ensure that we skip an entire UTF-8 character if we are in
      -  UTF-8 mode. */
      -
      -  if (rc == PCRE_ERROR_NOMATCH)
      -    {
      -    if (options == 0) break;                    /* All matches found */
      -    ovector[1] = start_offset + 1;              /* Advance one byte */
      -    if (crlf_is_newline &&                      /* If CRLF is newline & */
      -        start_offset < subject_length - 1 &&    /* we are at CRLF, */
      -        subject[start_offset] == '\r' &&
      -        subject[start_offset + 1] == '\n')
      -      ovector[1] += 1;                          /* Advance by one more. */
      -    else if (utf8)                              /* Otherwise, ensure we */
      -      {                                         /* advance a whole UTF-8 */
      -      while (ovector[1] < subject_length)       /* character. */
      -        {
      -        if ((subject[ovector[1]] & 0xc0) != 0x80) break;
      -        ovector[1] += 1;
      -        }
      -      }
      -    continue;    /* Go round the loop again */
      -    }
      -
      -  /* Other matching errors are not recoverable. */
      -
      -  if (rc < 0)
      -    {
      -    printf("Matching error %d\n", rc);
      -    pcre_free(re);    /* Release memory used for the compiled pattern */
      -    return 1;
      -    }
      -
      -  /* Match succeded */
      -
      -  printf("\nMatch succeeded again at offset %d\n", ovector[0]);
      -
      -  /* The match succeeded, but the output vector wasn't big enough. */
      -
      -  if (rc == 0)
      -    {
      -    rc = OVECCOUNT/3;
      -    printf("ovector only has room for %d captured substrings\n", rc - 1);
      -    }
      -
      -  /* As before, show substrings stored in the output vector by number, and then
      -  also any named substrings. */
      -
      -  for (i = 0; i < rc; i++)
      -    {
      -    char *substring_start = subject + ovector[2*i];
      -    int substring_length = ovector[2*i+1] - ovector[2*i];
      -    printf("%2d: %.*s\n", i, substring_length, substring_start);
      -    }
      -
      -  if (namecount <= 0) printf("No named substrings\n"); else
      -    {
      -    unsigned char *tabptr = name_table;
      -    printf("Named substrings\n");
      -    for (i = 0; i < namecount; i++)
      -      {
      -      int n = (tabptr[0] << 8) | tabptr[1];
      -      printf("(%d) %*s: %.*s\n", n, name_entry_size - 3, tabptr + 2,
      -        ovector[2*n+1] - ovector[2*n], subject + ovector[2*n]);
      -      tabptr += name_entry_size;
      -      }
      -    }
      -  }      /* End of loop to find second and subsequent matches */
      -
      -printf("\n");
      -pcre_free(re);       /* Release memory used for the compiled pattern */
      -return 0;
      -}
      -
      -/* End of pcredemo.c */
      -

      -Return to the PCRE index page. -

      diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcregrep.html b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcregrep.html deleted file mode 100644 index dacbb499..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcregrep.html +++ /dev/null @@ -1,759 +0,0 @@ - - -pcregrep specification - - -

      pcregrep man page

      -

      -Return to the PCRE index page. -

      -

      -This page is part of the PCRE HTML documentation. It was generated automatically -from the original man page. If there is any nonsense in it, please consult the -man page, in case the conversion went wrong. -
      -

      -
      SYNOPSIS
      -

      -pcregrep [options] [long options] [pattern] [path1 path2 ...] -

      -
      DESCRIPTION
      -

      -pcregrep searches files for character patterns, in the same way as other -grep commands do, but it uses the PCRE regular expression library to support -patterns that are compatible with the regular expressions of Perl 5. See -pcresyntax(3) -for a quick-reference summary of pattern syntax, or -pcrepattern(3) -for a full description of the syntax and semantics of the regular expressions -that PCRE supports. -

      -

      -Patterns, whether supplied on the command line or in a separate file, are given -without delimiters. For example: -

      -  pcregrep Thursday /etc/motd
      -
      -If you attempt to use delimiters (for example, by surrounding a pattern with -slashes, as is common in Perl scripts), they are interpreted as part of the -pattern. Quotes can of course be used to delimit patterns on the command line -because they are interpreted by the shell, and indeed quotes are required if a -pattern contains white space or shell metacharacters. -

      -

      -The first argument that follows any option settings is treated as the single -pattern to be matched when neither -e nor -f is present. -Conversely, when one or both of these options are used to specify patterns, all -arguments are treated as path names. At least one of -e, -f, or an -argument pattern must be provided. -

      -

      -If no files are specified, pcregrep reads the standard input. The -standard input can also be referenced by a name consisting of a single hyphen. -For example: -

      -  pcregrep some-pattern /file1 - /file3
      -
      -By default, each line that matches a pattern is copied to the standard -output, and if there is more than one file, the file name is output at the -start of each line, followed by a colon. However, there are options that can -change how pcregrep behaves. In particular, the -M option makes it -possible to search for patterns that span line boundaries. What defines a line -boundary is controlled by the -N (--newline) option. -

      -

      -The amount of memory used for buffering files that are being scanned is -controlled by a parameter that can be set by the --buffer-size option. -The default value for this parameter is specified when pcregrep is built, -with the default default being 20K. A block of memory three times this size is -used (to allow for buffering "before" and "after" lines). An error occurs if a -line overflows the buffer. -

      -

      -Patterns can be no longer than 8K or BUFSIZ bytes, whichever is the greater. -BUFSIZ is defined in <stdio.h>. When there is more than one pattern -(specified by the use of -e and/or -f), each pattern is applied to -each line in the order in which they are defined, except that all the -e -patterns are tried before the -f patterns. -

      -

      -By default, as soon as one pattern matches a line, no further patterns are -considered. However, if --colour (or --color) is used to colour the -matching substrings, or if --only-matching, --file-offsets, or ---line-offsets is used to output only the part of the line that matched -(either shown literally, or as an offset), scanning resumes immediately -following the match, so that further matches on the same line can be found. If -there are multiple patterns, they are all tried on the remainder of the line, -but patterns that follow the one that matched are not tried on the earlier part -of the line. -

      -

      -This behaviour means that the order in which multiple patterns are specified -can affect the output when one of the above options is used. This is no longer -the same behaviour as GNU grep, which now manages to display earlier matches -for later patterns (as long as there is no overlap). -

      -

      -Patterns that can match an empty string are accepted, but empty string -matches are never recognized. An example is the pattern "(super)?(man)?", in -which all components are optional. This pattern finds all occurrences of both -"super" and "man"; the output differs from matching with "super|man" when only -the matching substrings are being shown. -

      -

      -If the LC_ALL or LC_CTYPE environment variable is set, -pcregrep uses the value to set a locale when calling the PCRE library. -The --locale option can be used to override this. -

      -
      SUPPORT FOR COMPRESSED FILES
      -

      -It is possible to compile pcregrep so that it uses libz or -libbz2 to read files whose names end in .gz or .bz2, -respectively. You can find out whether your binary has support for one or both -of these file types by running it with the --help option. If the -appropriate support is not present, files are treated as plain text. The -standard input is always so treated. -

      -
      BINARY FILES
      -

      -By default, a file that contains a binary zero byte within the first 1024 bytes -is identified as a binary file, and is processed specially. (GNU grep also -identifies binary files in this manner.) See the --binary-files option -for a means of changing the way binary files are handled. -

      -
      OPTIONS
      -

      -The order in which some of the options appear can affect the output. For -example, both the -h and -l options affect the printing of file -names. Whichever comes later in the command line will be the one that takes -effect. Similarly, except where noted below, if an option is given twice, the -later setting is used. Numerical values for options may be followed by K or M, -to signify multiplication by 1024 or 1024*1024 respectively. -

      -

      --- -This terminates the list of options. It is useful if the next item on the -command line starts with a hyphen but is not an option. This allows for the -processing of patterns and filenames that start with hyphens. -

      -

      --A number, --after-context=number -Output number lines of context after each matching line. If filenames -and/or line numbers are being output, a hyphen separator is used instead of a -colon for the context lines. A line containing "--" is output between each -group of lines, unless they are in fact contiguous in the input file. The value -of number is expected to be relatively small. However, pcregrep -guarantees to have up to 8K of following text available for context output. -

      -

      --a, --text -Treat binary files as text. This is equivalent to ---binary-files=text. -

      -

      --B number, --before-context=number -Output number lines of context before each matching line. If filenames -and/or line numbers are being output, a hyphen separator is used instead of a -colon for the context lines. A line containing "--" is output between each -group of lines, unless they are in fact contiguous in the input file. The value -of number is expected to be relatively small. However, pcregrep -guarantees to have up to 8K of preceding text available for context output. -

      -

      ---binary-files=word -Specify how binary files are to be processed. If the word is "binary" (the -default), pattern matching is performed on binary files, but the only output is -"Binary file <name> matches" when a match succeeds. If the word is "text", -which is equivalent to the -a or --text option, binary files are -processed in the same way as any other file. In this case, when a match -succeeds, the output may be binary garbage, which can have nasty effects if -sent to a terminal. If the word is "without-match", which is equivalent to the --I option, binary files are not processed at all; they are assumed not to -be of interest. -

      -

      ---buffer-size=number -Set the parameter that controls how much memory is used for buffering files -that are being scanned. -

      -

      --C number, --context=number -Output number lines of context both before and after each matching line. -This is equivalent to setting both -A and -B to the same value. -

      -

      --c, --count -Do not output individual lines from the files that are being scanned; instead -output the number of lines that would otherwise have been shown. If no lines -are selected, the number zero is output. If several files are are being -scanned, a count is output for each of them. However, if the ---files-with-matches option is also used, only those files whose counts -are greater than zero are listed. When -c is used, the -A, --B, and -C options are ignored. -

      -

      ---colour, --color -If this option is given without any data, it is equivalent to "--colour=auto". -If data is required, it must be given in the same shell item, separated by an -equals sign. -

      -

      ---colour=value, --color=value -This option specifies under what circumstances the parts of a line that matched -a pattern should be coloured in the output. By default, the output is not -coloured. The value (which is optional, see above) may be "never", "always", or -"auto". In the latter case, colouring happens only if the standard output is -connected to a terminal. More resources are used when colouring is enabled, -because pcregrep has to search for all possible matches in a line, not -just one, in order to colour them all. -
      -
      -The colour that is used can be specified by setting the environment variable -PCREGREP_COLOUR or PCREGREP_COLOR. The value of this variable should be a -string of two numbers, separated by a semicolon. They are copied directly into -the control string for setting colour on a terminal, so it is your -responsibility to ensure that they make sense. If neither of the environment -variables is set, the default is "1;31", which gives red. -

      -

      --D action, --devices=action -If an input path is not a regular file or a directory, "action" specifies how -it is to be processed. Valid values are "read" (the default) or "skip" -(silently skip the path). -

      -

      --d action, --directories=action -If an input path is a directory, "action" specifies how it is to be processed. -Valid values are "read" (the default in non-Windows environments, for -compatibility with GNU grep), "recurse" (equivalent to the -r option), or -"skip" (silently skip the path, the default in Windows environments). In the -"read" case, directories are read as if they were ordinary files. In some -operating systems the effect of reading a directory like this is an immediate -end-of-file; in others it may provoke an error. -

      -

      --e pattern, --regex=pattern, --regexp=pattern -Specify a pattern to be matched. This option can be used multiple times in -order to specify several patterns. It can also be used as a way of specifying a -single pattern that starts with a hyphen. When -e is used, no argument -pattern is taken from the command line; all arguments are treated as file -names. There is no limit to the number of patterns. They are applied to each -line in the order in which they are defined until one matches. -
      -
      -If -f is used with -e, the command line patterns are matched first, -followed by the patterns from the file(s), independent of the order in which -these options are specified. Note that multiple use of -e is not the same -as a single pattern with alternatives. For example, X|Y finds the first -character in a line that is X or Y, whereas if the two patterns are given -separately, with X first, pcregrep finds X if it is present, even if it -follows Y in the line. It finds Y only if there is no X in the line. This -matters only if you are using -o or --colo(u)r to show the part(s) -of the line that matched. -

      -

      ---exclude=pattern -Files (but not directories) whose names match the pattern are skipped without -being processed. This applies to all files, whether listed on the command line, -obtained from --file-list, or by scanning a directory. The pattern is a -PCRE regular expression, and is matched against the final component of the file -name, not the entire path. The -F, -w, and -x options do not -apply to this pattern. The option may be given any number of times in order to -specify multiple patterns. If a file name matches both an --include -and an --exclude pattern, it is excluded. There is no short form for this -option. -

      -

      ---exclude-from=filename -Treat each non-empty line of the file as the data for an --exclude -option. What constitutes a newline when reading the file is the operating -system's default. The --newline option has no effect on this option. This -option may be given more than once in order to specify a number of files to -read. -

      -

      ---exclude-dir=pattern -Directories whose names match the pattern are skipped without being processed, -whatever the setting of the --recursive option. This applies to all -directories, whether listed on the command line, obtained from ---file-list, or by scanning a parent directory. The pattern is a PCRE -regular expression, and is matched against the final component of the directory -name, not the entire path. The -F, -w, and -x options do not -apply to this pattern. The option may be given any number of times in order to -specify more than one pattern. If a directory matches both --include-dir -and --exclude-dir, it is excluded. There is no short form for this -option. -

      -

      --F, --fixed-strings -Interpret each data-matching pattern as a list of fixed strings, separated by -newlines, instead of as a regular expression. What constitutes a newline for -this purpose is controlled by the --newline option. The -w (match -as a word) and -x (match whole line) options can be used with -F. -They apply to each of the fixed strings. A line is selected if any of the fixed -strings are found in it (subject to -w or -x, if present). This -option applies only to the patterns that are matched against the contents of -files; it does not apply to patterns specified by any of the --include or ---exclude options. -

      -

      --f filename, --file=filename -Read patterns from the file, one per line, and match them against -each line of input. What constitutes a newline when reading the file is the -operating system's default. The --newline option has no effect on this -option. Trailing white space is removed from each line, and blank lines are -ignored. An empty file contains no patterns and therefore matches nothing. See -also the comments about multiple patterns versus a single pattern with -alternatives in the description of -e above. -
      -
      -If this option is given more than once, all the specified files are -read. A data line is output if any of the patterns match it. A filename can -be given as "-" to refer to the standard input. When -f is used, patterns -specified on the command line using -e may also be present; they are -tested before the file's patterns. However, no other pattern is taken from the -command line; all arguments are treated as the names of paths to be searched. -

      -

      ---file-list=filename -Read a list of files and/or directories that are to be scanned from the given -file, one per line. Trailing white space is removed from each line, and blank -lines are ignored. These paths are processed before any that are listed on the -command line. The filename can be given as "-" to refer to the standard input. -If --file and --file-list are both specified as "-", patterns are -read first. This is useful only when the standard input is a terminal, from -which further lines (the list of files) can be read after an end-of-file -indication. If this option is given more than once, all the specified files are -read. -

      -

      ---file-offsets -Instead of showing lines or parts of lines that match, show each match as an -offset from the start of the file and a length, separated by a comma. In this -mode, no context is shown. That is, the -A, -B, and -C -options are ignored. If there is more than one match in a line, each of them is -shown separately. This option is mutually exclusive with --line-offsets -and --only-matching. -

      -

      --H, --with-filename -Force the inclusion of the filename at the start of output lines when searching -a single file. By default, the filename is not shown in this case. For matching -lines, the filename is followed by a colon; for context lines, a hyphen -separator is used. If a line number is also being output, it follows the file -name. -

      -

      --h, --no-filename -Suppress the output filenames when searching multiple files. By default, -filenames are shown when multiple files are searched. For matching lines, the -filename is followed by a colon; for context lines, a hyphen separator is used. -If a line number is also being output, it follows the file name. -

      -

      ---help -Output a help message, giving brief details of the command options and file -type support, and then exit. Anything else on the command line is -ignored. -

      -

      --I -Treat binary files as never matching. This is equivalent to ---binary-files=without-match. -

      -

      --i, --ignore-case -Ignore upper/lower case distinctions during comparisons. -

      -

      ---include=pattern -If any --include patterns are specified, the only files that are -processed are those that match one of the patterns (and do not match an ---exclude pattern). This option does not affect directories, but it -applies to all files, whether listed on the command line, obtained from ---file-list, or by scanning a directory. The pattern is a PCRE regular -expression, and is matched against the final component of the file name, not -the entire path. The -F, -w, and -x options do not apply to -this pattern. The option may be given any number of times. If a file name -matches both an --include and an --exclude pattern, it is excluded. -There is no short form for this option. -

      -

      ---include-from=filename -Treat each non-empty line of the file as the data for an --include -option. What constitutes a newline for this purpose is the operating system's -default. The --newline option has no effect on this option. This option -may be given any number of times; all the files are read. -

      -

      ---include-dir=pattern -If any --include-dir patterns are specified, the only directories that -are processed are those that match one of the patterns (and do not match an ---exclude-dir pattern). This applies to all directories, whether listed -on the command line, obtained from --file-list, or by scanning a parent -directory. The pattern is a PCRE regular expression, and is matched against the -final component of the directory name, not the entire path. The -F, --w, and -x options do not apply to this pattern. The option may be -given any number of times. If a directory matches both --include-dir and ---exclude-dir, it is excluded. There is no short form for this option. -

      -

      --L, --files-without-match -Instead of outputting lines from the files, just output the names of the files -that do not contain any lines that would have been output. Each file name is -output once, on a separate line. -

      -

      --l, --files-with-matches -Instead of outputting lines from the files, just output the names of the files -containing lines that would have been output. Each file name is output -once, on a separate line. Searching normally stops as soon as a matching line -is found in a file. However, if the -c (count) option is also used, -matching continues in order to obtain the correct count, and those files that -have at least one match are listed along with their counts. Using this option -with -c is a way of suppressing the listing of files with no matches. -

      -

      ---label=name -This option supplies a name to be used for the standard input when file names -are being output. If not supplied, "(standard input)" is used. There is no -short form for this option. -

      -

      ---line-buffered -When this option is given, input is read and processed line by line, and the -output is flushed after each write. By default, input is read in large chunks, -unless pcregrep can determine that it is reading from a terminal (which -is currently possible only in Unix-like environments). Output to terminal is -normally automatically flushed by the operating system. This option can be -useful when the input or output is attached to a pipe and you do not want -pcregrep to buffer up large amounts of data. However, its use will affect -performance, and the -M (multiline) option ceases to work. -

      -

      ---line-offsets -Instead of showing lines or parts of lines that match, show each match as a -line number, the offset from the start of the line, and a length. The line -number is terminated by a colon (as usual; see the -n option), and the -offset and length are separated by a comma. In this mode, no context is shown. -That is, the -A, -B, and -C options are ignored. If there is -more than one match in a line, each of them is shown separately. This option is -mutually exclusive with --file-offsets and --only-matching. -

      -

      ---locale=locale-name -This option specifies a locale to be used for pattern matching. It overrides -the value in the LC_ALL or LC_CTYPE environment variables. If no -locale is specified, the PCRE library's default (usually the "C" locale) is -used. There is no short form for this option. -

      -

      ---match-limit=number -Processing some regular expression patterns can require a very large amount of -memory, leading in some cases to a program crash if not enough is available. -Other patterns may take a very long time to search for all possible matching -strings. The pcre_exec() function that is called by pcregrep to do -the matching has two parameters that can limit the resources that it uses. -
      -
      -The --match-limit option provides a means of limiting resource usage -when processing patterns that are not going to match, but which have a very -large number of possibilities in their search trees. The classic example is a -pattern that uses nested unlimited repeats. Internally, PCRE uses a function -called match() which it calls repeatedly (sometimes recursively). The -limit set by --match-limit is imposed on the number of times this -function is called during a match, which has the effect of limiting the amount -of backtracking that can take place. -
      -
      -The --recursion-limit option is similar to --match-limit, but -instead of limiting the total number of times that match() is called, it -limits the depth of recursive calls, which in turn limits the amount of memory -that can be used. The recursion depth is a smaller number than the total number -of calls, because not all calls to match() are recursive. This limit is -of use only if it is set smaller than --match-limit. -
      -
      -There are no short forms for these options. The default settings are specified -when the PCRE library is compiled, with the default default being 10 million. -

      -

      --M, --multiline -Allow patterns to match more than one line. When this option is given, patterns -may usefully contain literal newline characters and internal occurrences of ^ -and $ characters. The output for a successful match may consist of more than -one line, the last of which is the one in which the match ended. If the matched -string ends with a newline sequence the output ends at the end of that line. -
      -
      -When this option is set, the PCRE library is called in "multiline" mode. -There is a limit to the number of lines that can be matched, imposed by the way -that pcregrep buffers the input file as it scans it. However, -pcregrep ensures that at least 8K characters or the rest of the document -(whichever is the shorter) are available for forward matching, and similarly -the previous 8K characters (or all the previous characters, if fewer than 8K) -are guaranteed to be available for lookbehind assertions. This option does not -work when input is read line by line (see \fP--line-buffered\fP.) -

      -

      --N newline-type, --newline=newline-type -The PCRE library supports five different conventions for indicating -the ends of lines. They are the single-character sequences CR (carriage return) -and LF (linefeed), the two-character sequence CRLF, an "anycrlf" convention, -which recognizes any of the preceding three types, and an "any" convention, in -which any Unicode line ending sequence is assumed to end a line. The Unicode -sequences are the three just mentioned, plus VT (vertical tab, U+000B), FF -(form feed, U+000C), NEL (next line, U+0085), LS (line separator, U+2028), and -PS (paragraph separator, U+2029). -
      -
      -When the PCRE library is built, a default line-ending sequence is specified. -This is normally the standard sequence for the operating system. Unless -otherwise specified by this option, pcregrep uses the library's default. -The possible values for this option are CR, LF, CRLF, ANYCRLF, or ANY. This -makes it possible to use pcregrep to scan files that have come from other -environments without having to modify their line endings. If the data that is -being scanned does not agree with the convention set by this option, -pcregrep may behave in strange ways. Note that this option does not -apply to files specified by the -f, --exclude-from, or ---include-from options, which are expected to use the operating system's -standard newline sequence. -

      -

      --n, --line-number -Precede each output line by its line number in the file, followed by a colon -for matching lines or a hyphen for context lines. If the filename is also being -output, it precedes the line number. This option is forced if ---line-offsets is used. -

      -

      ---no-jit -If the PCRE library is built with support for just-in-time compiling (which -speeds up matching), pcregrep automatically makes use of this, unless it -was explicitly disabled at build time. This option can be used to disable the -use of JIT at run time. It is provided for testing and working round problems. -It should never be needed in normal use. -

      -

      --o, --only-matching -Show only the part of the line that matched a pattern instead of the whole -line. In this mode, no context is shown. That is, the -A, -B, and --C options are ignored. If there is more than one match in a line, each -of them is shown separately. If -o is combined with -v (invert the -sense of the match to find non-matching lines), no output is generated, but the -return code is set appropriately. If the matched portion of the line is empty, -nothing is output unless the file name or line number are being printed, in -which case they are shown on an otherwise empty line. This option is mutually -exclusive with --file-offsets and --line-offsets. -

      -

      --onumber, --only-matching=number -Show only the part of the line that matched the capturing parentheses of the -given number. Up to 32 capturing parentheses are supported, and -o0 is -equivalent to -o without a number. Because these options can be given -without an argument (see above), if an argument is present, it must be given in -the same shell item, for example, -o3 or --only-matching=2. The comments given -for the non-argument case above also apply to this case. If the specified -capturing parentheses do not exist in the pattern, or were not set in the -match, nothing is output unless the file name or line number are being printed. -
      -
      -If this option is given multiple times, multiple substrings are output, in the -order the options are given. For example, -o3 -o1 -o3 causes the substrings -matched by capturing parentheses 3 and 1 and then 3 again to be output. By -default, there is no separator (but see the next option). -

      -

      ---om-separator=text -Specify a separating string for multiple occurrences of -o. The default -is an empty string. Separating strings are never coloured. -

      -

      --q, --quiet -Work quietly, that is, display nothing except error messages. The exit -status indicates whether or not any matches were found. -

      -

      --r, --recursive -If any given path is a directory, recursively scan the files it contains, -taking note of any --include and --exclude settings. By default, a -directory is read as a normal file; in some operating systems this gives an -immediate end-of-file. This option is a shorthand for setting the -d -option to "recurse". -

      -

      ---recursion-limit=number -See --match-limit above. -

      -

      --s, --no-messages -Suppress error messages about non-existent or unreadable files. Such files are -quietly skipped. However, the return code is still 2, even if matches were -found in other files. -

      -

      --u, --utf-8 -Operate in UTF-8 mode. This option is available only if PCRE has been compiled -with UTF-8 support. All patterns (including those for any --exclude and ---include options) and all subject lines that are scanned must be valid -strings of UTF-8 characters. -

      -

      --V, --version -Write the version numbers of pcregrep and the PCRE library to the -standard output and then exit. Anything else on the command line is -ignored. -

      -

      --v, --invert-match -Invert the sense of the match, so that lines which do not match any of -the patterns are the ones that are found. -

      -

      --w, --word-regex, --word-regexp -Force the patterns to match only whole words. This is equivalent to having \b -at the start and end of the pattern. This option applies only to the patterns -that are matched against the contents of files; it does not apply to patterns -specified by any of the --include or --exclude options. -

      -

      --x, --line-regex, --line-regexp -Force the patterns to be anchored (each must start matching at the beginning of -a line) and in addition, require them to match entire lines. This is equivalent -to having ^ and $ characters at the start and end of each alternative branch in -every pattern. This option applies only to the patterns that are matched -against the contents of files; it does not apply to patterns specified by any -of the --include or --exclude options. -

      -
      ENVIRONMENT VARIABLES
      -

      -The environment variables LC_ALL and LC_CTYPE are examined, in that -order, for a locale. The first one that is set is used. This can be overridden -by the --locale option. If no locale is set, the PCRE library's default -(usually the "C" locale) is used. -

      -
      NEWLINES
      -

      -The -N (--newline) option allows pcregrep to scan files with -different newline conventions from the default. Any parts of the input files -that are written to the standard output are copied identically, with whatever -newline sequences they have in the input. However, the setting of this option -does not affect the interpretation of files specified by the -f, ---exclude-from, or --include-from options, which are assumed to use -the operating system's standard newline sequence, nor does it affect the way in -which pcregrep writes informational messages to the standard error and -output streams. For these it uses the string "\n" to indicate newlines, -relying on the C I/O library to convert this to an appropriate sequence. -

      -
      OPTIONS COMPATIBILITY
      -

      -Many of the short and long forms of pcregrep's options are the same -as in the GNU grep program. Any long option of the form ---xxx-regexp (GNU terminology) is also available as --xxx-regex -(PCRE terminology). However, the --file-list, --file-offsets, ---include-dir, --line-offsets, --locale, --match-limit, --M, --multiline, -N, --newline, --om-separator, ---recursion-limit, -u, and --utf-8 options are specific to -pcregrep, as is the use of the --only-matching option with a -capturing parentheses number. -

      -

      -Although most of the common options work the same way, a few are different in -pcregrep. For example, the --include option's argument is a glob -for GNU grep, but a regular expression for pcregrep. If both the --c and -l options are given, GNU grep lists only file names, -without counts, but pcregrep gives the counts. -

      -
      OPTIONS WITH DATA
      -

      -There are four different ways in which an option with data can be specified. -If a short form option is used, the data may follow immediately, or (with one -exception) in the next command line item. For example: -

      -  -f/some/file
      -  -f /some/file
      -
      -The exception is the -o option, which may appear with or without data. -Because of this, if data is present, it must follow immediately in the same -item, for example -o3. -

      -

      -If a long form option is used, the data may appear in the same command line -item, separated by an equals character, or (with two exceptions) it may appear -in the next command line item. For example: -

      -  --file=/some/file
      -  --file /some/file
      -
      -Note, however, that if you want to supply a file name beginning with ~ as data -in a shell command, and have the shell expand ~ to a home directory, you must -separate the file name from the option, because the shell does not treat ~ -specially unless it is at the start of an item. -

      -

      -The exceptions to the above are the --colour (or --color) and ---only-matching options, for which the data is optional. If one of these -options does have data, it must be given in the first form, using an equals -character. Otherwise pcregrep will assume that it has no data. -

      -
      MATCHING ERRORS
      -

      -It is possible to supply a regular expression that takes a very long time to -fail to match certain lines. Such patterns normally involve nested indefinite -repeats, for example: (a+)*\d when matched against a line of a's with no final -digit. The PCRE matching function has a resource limit that causes it to abort -in these circumstances. If this happens, pcregrep outputs an error -message and the line that caused the problem to the standard error stream. If -there are more than 20 such errors, pcregrep gives up. -

      -

      -The --match-limit option of pcregrep can be used to set the overall -resource limit; there is a second option called --recursion-limit that -sets a limit on the amount of memory (usually stack) that is used (see the -discussion of these options above). -

      -
      DIAGNOSTICS
      -

      -Exit status is 0 if any matches were found, 1 if no matches were found, and 2 -for syntax errors, overlong lines, non-existent or inaccessible files (even if -matches were found in other files) or too many matching errors. Using the --s option to suppress error messages about inaccessible files does not -affect the return code. -

      -
      SEE ALSO
      -

      -pcrepattern(3), pcresyntax(3), pcretest(1). -

      -
      AUTHOR
      -

      -Philip Hazel -
      -University Computing Service -
      -Cambridge CB2 3QH, England. -
      -

      -
      REVISION
      -

      -Last updated: 03 April 2014 -
      -Copyright © 1997-2014 University of Cambridge. -
      -

      -Return to the PCRE index page. -

      diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcrejit.html b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcrejit.html deleted file mode 100644 index abb34252..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcrejit.html +++ /dev/null @@ -1,499 +0,0 @@ - - -pcrejit specification - - -

      pcrejit man page

      -

      -Return to the PCRE index page. -

      -

      -This page is part of the PCRE HTML documentation. It was generated automatically -from the original man page. If there is any nonsense in it, please consult the -man page, in case the conversion went wrong. -
      -

      -
      PCRE JUST-IN-TIME COMPILER SUPPORT
      -

      -Just-in-time compiling is a heavyweight optimization that can greatly speed up -pattern matching. However, it comes at the cost of extra processing before the -match is performed. Therefore, it is of most benefit when the same pattern is -going to be matched many times. This does not necessarily mean many calls of a -matching function; if the pattern is not anchored, matching attempts may take -place many times at various positions in the subject, even for a single call. -Therefore, if the subject string is very long, it may still pay to use JIT for -one-off matches. -

      -

      -JIT support applies only to the traditional Perl-compatible matching function. -It does not apply when the DFA matching function is being used. The code for -this support was written by Zoltan Herczeg. -

      -
      8-BIT, 16-BIT AND 32-BIT SUPPORT
      -

      -JIT support is available for all of the 8-bit, 16-bit and 32-bit PCRE -libraries. To keep this documentation simple, only the 8-bit interface is -described in what follows. If you are using the 16-bit library, substitute the -16-bit functions and 16-bit structures (for example, pcre16_jit_stack -instead of pcre_jit_stack). If you are using the 32-bit library, -substitute the 32-bit functions and 32-bit structures (for example, -pcre32_jit_stack instead of pcre_jit_stack). -

      -
      AVAILABILITY OF JIT SUPPORT
      -

      -JIT support is an optional feature of PCRE. The "configure" option --enable-jit -(or equivalent CMake option) must be set when PCRE is built if you want to use -JIT. The support is limited to the following hardware platforms: -

      -  ARM v5, v7, and Thumb2
      -  Intel x86 32-bit and 64-bit
      -  MIPS 32-bit
      -  Power PC 32-bit and 64-bit
      -  SPARC 32-bit (experimental)
      -
      -If --enable-jit is set on an unsupported platform, compilation fails. -

      -

      -A program that is linked with PCRE 8.20 or later can tell if JIT support is -available by calling pcre_config() with the PCRE_CONFIG_JIT option. The -result is 1 when JIT is available, and 0 otherwise. However, a simple program -does not need to check this in order to use JIT. The normal API is implemented -in a way that falls back to the interpretive code if JIT is not available. For -programs that need the best possible performance, there is also a "fast path" -API that is JIT-specific. -

      -

      -If your program may sometimes be linked with versions of PCRE that are older -than 8.20, but you want to use JIT when it is available, you can test the -values of PCRE_MAJOR and PCRE_MINOR, or the existence of a JIT macro such as -PCRE_CONFIG_JIT, for compile-time control of your code. Also beware that the -pcre_jit_exec() function was not available at all before 8.32, -and may not be available at all if PCRE isn't compiled with ---enable-jit. See the "JIT FAST PATH API" section below for details. -

      -
      SIMPLE USE OF JIT
      -

      -You have to do two things to make use of the JIT support in the simplest way: -

      -  (1) Call pcre_study() with the PCRE_STUDY_JIT_COMPILE option for
      -      each compiled pattern, and pass the resulting pcre_extra block to
      -      pcre_exec().
      -
      -  (2) Use pcre_free_study() to free the pcre_extra block when it is
      -      no longer needed, instead of just freeing it yourself. This ensures that
      -      any JIT data is also freed.
      -
      -For a program that may be linked with pre-8.20 versions of PCRE, you can insert -
      -  #ifndef PCRE_STUDY_JIT_COMPILE
      -  #define PCRE_STUDY_JIT_COMPILE 0
      -  #endif
      -
      -so that no option is passed to pcre_study(), and then use something like -this to free the study data: -
      -  #ifdef PCRE_CONFIG_JIT
      -      pcre_free_study(study_ptr);
      -  #else
      -      pcre_free(study_ptr);
      -  #endif
      -
      -PCRE_STUDY_JIT_COMPILE requests the JIT compiler to generate code for complete -matches. If you want to run partial matches using the PCRE_PARTIAL_HARD or -PCRE_PARTIAL_SOFT options of pcre_exec(), you should set one or both of -the following options in addition to, or instead of, PCRE_STUDY_JIT_COMPILE -when you call pcre_study(): -
      -  PCRE_STUDY_JIT_PARTIAL_HARD_COMPILE
      -  PCRE_STUDY_JIT_PARTIAL_SOFT_COMPILE
      -
      -If using pcre_jit_exec() and supporting a pre-8.32 version of -PCRE, you can insert: -
      -   #if PCRE_MAJOR >= 8 && PCRE_MINOR >= 32
      -   pcre_jit_exec(...);
      -   #else
      -   pcre_exec(...)
      -   #endif
      -
      -but as described in the "JIT FAST PATH API" section below this assumes -version 8.32 and later are compiled with --enable-jit, which may -break. -
      -
      -The JIT compiler generates different optimized code for each of the three -modes (normal, soft partial, hard partial). When pcre_exec() is called, -the appropriate code is run if it is available. Otherwise, the pattern is -matched using interpretive code. -

      -

      -In some circumstances you may need to call additional functions. These are -described in the section entitled -"Controlling the JIT stack" -below. -

      -

      -If JIT support is not available, PCRE_STUDY_JIT_COMPILE etc. are ignored, and -no JIT data is created. Otherwise, the compiled pattern is passed to the JIT -compiler, which turns it into machine code that executes much faster than the -normal interpretive code. When pcre_exec() is passed a pcre_extra -block containing a pointer to JIT code of the appropriate mode (normal or -hard/soft partial), it obeys that code instead of running the interpreter. The -result is identical, but the compiled JIT code runs much faster. -

      -

      -There are some pcre_exec() options that are not supported for JIT -execution. There are also some pattern items that JIT cannot handle. Details -are given below. In both cases, execution automatically falls back to the -interpretive code. If you want to know whether JIT was actually used for a -particular match, you should arrange for a JIT callback function to be set up -as described in the section entitled -"Controlling the JIT stack" -below, even if you do not need to supply a non-default JIT stack. Such a -callback function is called whenever JIT code is about to be obeyed. If the -execution options are not right for JIT execution, the callback function is not -obeyed. -

      -

      -If the JIT compiler finds an unsupported item, no JIT data is generated. You -can find out if JIT execution is available after studying a pattern by calling -pcre_fullinfo() with the PCRE_INFO_JIT option. A result of 1 means that -JIT compilation was successful. A result of 0 means that JIT support is not -available, or the pattern was not studied with PCRE_STUDY_JIT_COMPILE etc., or -the JIT compiler was not able to handle the pattern. -

      -

      -Once a pattern has been studied, with or without JIT, it can be used as many -times as you like for matching different subject strings. -

      -
      UNSUPPORTED OPTIONS AND PATTERN ITEMS
      -

      -The only pcre_exec() options that are supported for JIT execution are -PCRE_NO_UTF8_CHECK, PCRE_NO_UTF16_CHECK, PCRE_NO_UTF32_CHECK, PCRE_NOTBOL, -PCRE_NOTEOL, PCRE_NOTEMPTY, PCRE_NOTEMPTY_ATSTART, PCRE_PARTIAL_HARD, and -PCRE_PARTIAL_SOFT. -

      -

      -The only unsupported pattern items are \C (match a single data unit) when -running in a UTF mode, and a callout immediately before an assertion condition -in a conditional group. -

      -
      RETURN VALUES FROM JIT EXECUTION
      -

      -When a pattern is matched using JIT execution, the return values are the same -as those given by the interpretive pcre_exec() code, with the addition of -one new error code: PCRE_ERROR_JIT_STACKLIMIT. This means that the memory used -for the JIT stack was insufficient. See -"Controlling the JIT stack" -below for a discussion of JIT stack usage. For compatibility with the -interpretive pcre_exec() code, no more than two-thirds of the -ovector argument is used for passing back captured substrings. -

      -

      -The error code PCRE_ERROR_MATCHLIMIT is returned by the JIT code if searching a -very large pattern tree goes on for too long, as it is in the same circumstance -when JIT is not used, but the details of exactly what is counted are not the -same. The PCRE_ERROR_RECURSIONLIMIT error code is never returned by JIT -execution. -

      -
      SAVING AND RESTORING COMPILED PATTERNS
      -

      -The code that is generated by the JIT compiler is architecture-specific, and is -also position dependent. For those reasons it cannot be saved (in a file or -database) and restored later like the bytecode and other data of a compiled -pattern. Saving and restoring compiled patterns is not something many people -do. More detail about this facility is given in the -pcreprecompile -documentation. It should be possible to run pcre_study() on a saved and -restored pattern, and thereby recreate the JIT data, but because JIT -compilation uses significant resources, it is probably not worth doing this; -you might as well recompile the original pattern. -

      -
      CONTROLLING THE JIT STACK
      -

      -When the compiled JIT code runs, it needs a block of memory to use as a stack. -By default, it uses 32K on the machine stack. However, some large or -complicated patterns need more than this. The error PCRE_ERROR_JIT_STACKLIMIT -is given when there is not enough stack. Three functions are provided for -managing blocks of memory for use as JIT stacks. There is further discussion -about the use of JIT stacks in the section entitled -"JIT stack FAQ" -below. -

      -

      -The pcre_jit_stack_alloc() function creates a JIT stack. Its arguments -are a starting size and a maximum size, and it returns a pointer to an opaque -structure of type pcre_jit_stack, or NULL if there is an error. The -pcre_jit_stack_free() function can be used to free a stack that is no -longer needed. (For the technically minded: the address space is allocated by -mmap or VirtualAlloc.) -

      -

      -JIT uses far less memory for recursion than the interpretive code, -and a maximum stack size of 512K to 1M should be more than enough for any -pattern. -

      -

      -The pcre_assign_jit_stack() function specifies which stack JIT code -should use. Its arguments are as follows: -

      -  pcre_extra         *extra
      -  pcre_jit_callback  callback
      -  void               *data
      -
      -The extra argument must be the result of studying a pattern with -PCRE_STUDY_JIT_COMPILE etc. There are three cases for the values of the other -two options: -
      -  (1) If callback is NULL and data is NULL, an internal 32K block
      -      on the machine stack is used.
      -
      -  (2) If callback is NULL and data is not NULL, data must be
      -      a valid JIT stack, the result of calling pcre_jit_stack_alloc().
      -
      -  (3) If callback is not NULL, it must point to a function that is
      -      called with data as an argument at the start of matching, in
      -      order to set up a JIT stack. If the return from the callback
      -      function is NULL, the internal 32K stack is used; otherwise the
      -      return value must be a valid JIT stack, the result of calling
      -      pcre_jit_stack_alloc().
      -
      -A callback function is obeyed whenever JIT code is about to be run; it is not -obeyed when pcre_exec() is called with options that are incompatible for -JIT execution. A callback function can therefore be used to determine whether a -match operation was executed by JIT or by the interpreter. -

      -

      -You may safely use the same JIT stack for more than one pattern (either by -assigning directly or by callback), as long as the patterns are all matched -sequentially in the same thread. In a multithread application, if you do not -specify a JIT stack, or if you assign or pass back NULL from a callback, that -is thread-safe, because each thread has its own machine stack. However, if you -assign or pass back a non-NULL JIT stack, this must be a different stack for -each thread so that the application is thread-safe. -

      -

      -Strictly speaking, even more is allowed. You can assign the same non-NULL stack -to any number of patterns as long as they are not used for matching by multiple -threads at the same time. For example, you can assign the same stack to all -compiled patterns, and use a global mutex in the callback to wait until the -stack is available for use. However, this is an inefficient solution, and not -recommended. -

      -

      -This is a suggestion for how a multithreaded program that needs to set up -non-default JIT stacks might operate: -

      -  During thread initalization
      -    thread_local_var = pcre_jit_stack_alloc(...)
      -
      -  During thread exit
      -    pcre_jit_stack_free(thread_local_var)
      -
      -  Use a one-line callback function
      -    return thread_local_var
      -
      -All the functions described in this section do nothing if JIT is not available, -and pcre_assign_jit_stack() does nothing unless the extra argument -is non-NULL and points to a pcre_extra block that is the result of a -successful study with PCRE_STUDY_JIT_COMPILE etc. -

      -
      JIT STACK FAQ
      -

      -(1) Why do we need JIT stacks? -
      -
      -PCRE (and JIT) is a recursive, depth-first engine, so it needs a stack where -the local data of the current node is pushed before checking its child nodes. -Allocating real machine stack on some platforms is difficult. For example, the -stack chain needs to be updated every time if we extend the stack on PowerPC. -Although it is possible, its updating time overhead decreases performance. So -we do the recursion in memory. -

      -

      -(2) Why don't we simply allocate blocks of memory with malloc()? -
      -
      -Modern operating systems have a nice feature: they can reserve an address space -instead of allocating memory. We can safely allocate memory pages inside this -address space, so the stack could grow without moving memory data (this is -important because of pointers). Thus we can allocate 1M address space, and use -only a single memory page (usually 4K) if that is enough. However, we can still -grow up to 1M anytime if needed. -

      -

      -(3) Who "owns" a JIT stack? -
      -
      -The owner of the stack is the user program, not the JIT studied pattern or -anything else. The user program must ensure that if a stack is used by -pcre_exec(), (that is, it is assigned to the pattern currently running), -that stack must not be used by any other threads (to avoid overwriting the same -memory area). The best practice for multithreaded programs is to allocate a -stack for each thread, and return this stack through the JIT callback function. -

      -

      -(4) When should a JIT stack be freed? -
      -
      -You can free a JIT stack at any time, as long as it will not be used by -pcre_exec() again. When you assign the stack to a pattern, only a pointer -is set. There is no reference counting or any other magic. You can free the -patterns and stacks in any order, anytime. Just do not call -pcre_exec() with a pattern pointing to an already freed stack, as that -will cause SEGFAULT. (Also, do not free a stack currently used by -pcre_exec() in another thread). You can also replace the stack for a -pattern at any time. You can even free the previous stack before assigning a -replacement. -

      -

      -(5) Should I allocate/free a stack every time before/after calling -pcre_exec()? -
      -
      -No, because this is too costly in terms of resources. However, you could -implement some clever idea which release the stack if it is not used in let's -say two minutes. The JIT callback can help to achieve this without keeping a -list of the currently JIT studied patterns. -

      -

      -(6) OK, the stack is for long term memory allocation. But what happens if a -pattern causes stack overflow with a stack of 1M? Is that 1M kept until the -stack is freed? -
      -
      -Especially on embedded sytems, it might be a good idea to release memory -sometimes without freeing the stack. There is no API for this at the moment. -Probably a function call which returns with the currently allocated memory for -any stack and another which allows releasing memory (shrinking the stack) would -be a good idea if someone needs this. -

      -

      -(7) This is too much of a headache. Isn't there any better solution for JIT -stack handling? -
      -
      -No, thanks to Windows. If POSIX threads were used everywhere, we could throw -out this complicated API. -

      -
      EXAMPLE CODE
      -

      -This is a single-threaded example that specifies a JIT stack without using a -callback. -

      -  int rc;
      -  int ovector[30];
      -  pcre *re;
      -  pcre_extra *extra;
      -  pcre_jit_stack *jit_stack;
      -
      -  re = pcre_compile(pattern, 0, &error, &erroffset, NULL);
      -  /* Check for errors */
      -  extra = pcre_study(re, PCRE_STUDY_JIT_COMPILE, &error);
      -  jit_stack = pcre_jit_stack_alloc(32*1024, 512*1024);
      -  /* Check for error (NULL) */
      -  pcre_assign_jit_stack(extra, NULL, jit_stack);
      -  rc = pcre_exec(re, extra, subject, length, 0, 0, ovector, 30);
      -  /* Check results */
      -  pcre_free(re);
      -  pcre_free_study(extra);
      -  pcre_jit_stack_free(jit_stack);
      -
      -
      -

      -
      JIT FAST PATH API
      -

      -Because the API described above falls back to interpreted execution when JIT is -not available, it is convenient for programs that are written for general use -in many environments. However, calling JIT via pcre_exec() does have a -performance impact. Programs that are written for use where JIT is known to be -available, and which need the best possible performance, can instead use a -"fast path" API to call JIT execution directly instead of calling -pcre_exec() (obviously only for patterns that have been successfully -studied by JIT). -

      -

      -The fast path function is called pcre_jit_exec(), and it takes exactly -the same arguments as pcre_exec(), plus one additional argument that -must point to a JIT stack. The JIT stack arrangements described above do not -apply. The return values are the same as for pcre_exec(). -

      -

      -When you call pcre_exec(), as well as testing for invalid options, a -number of other sanity checks are performed on the arguments. For example, if -the subject pointer is NULL, or its length is negative, an immediate error is -given. Also, unless PCRE_NO_UTF[8|16|32] is set, a UTF subject string is tested -for validity. In the interests of speed, these checks do not happen on the JIT -fast path, and if invalid data is passed, the result is undefined. -

      -

      -Bypassing the sanity checks and the pcre_exec() wrapping can give -speedups of more than 10%. -

      -

      -Note that the pcre_jit_exec() function is not available in versions of -PCRE before 8.32 (released in November 2012). If you need to support versions -that old you must either use the slower pcre_exec(), or switch between -the two codepaths by checking the values of PCRE_MAJOR and PCRE_MINOR. -

      -

      -Due to an unfortunate implementation oversight, even in versions 8.32 -and later there will be no pcre_jit_exec() stub function defined -when PCRE is compiled with --disable-jit, which is the default, and -there's no way to detect whether PCRE was compiled with --enable-jit -via a macro. -

      -

      -If you need to support versions older than 8.32, or versions that may -not build with --enable-jit, you must either use the slower -pcre_exec(), or switch between the two codepaths by checking the -values of PCRE_MAJOR and PCRE_MINOR. -

      -

      -Switching between the two by checking the version assumes that all the -versions being targeted are built with --enable-jit. To also support -builds that may use --disable-jit either pcre_exec() must be -used, or a compile-time check for JIT via pcre_config() (which -assumes the runtime environment will be the same), or as the Git -project decided to do, simply assume that pcre_jit_exec() is -present in 8.32 or later unless a compile-time flag is provided, see -the "grep: un-break building with PCRE >= 8.32 without --enable-jit" -commit in git.git for an example of that. -

      -
      SEE ALSO
      -

      -pcreapi(3) -

      -
      AUTHOR
      -

      -Philip Hazel (FAQ by Zoltan Herczeg) -
      -University Computing Service -
      -Cambridge CB2 3QH, England. -
      -

      -
      REVISION
      -

      -Last updated: 05 July 2017 -
      -Copyright © 1997-2017 University of Cambridge. -
      -

      -Return to the PCRE index page. -

      diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcrelimits.html b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcrelimits.html deleted file mode 100644 index ee5ebf03..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcrelimits.html +++ /dev/null @@ -1,90 +0,0 @@ - - -pcrelimits specification - - -

      pcrelimits man page

      -

      -Return to the PCRE index page. -

      -

      -This page is part of the PCRE HTML documentation. It was generated automatically -from the original man page. If there is any nonsense in it, please consult the -man page, in case the conversion went wrong. -
      -
      -SIZE AND OTHER LIMITATIONS -
      -

      -There are some size limitations in PCRE but it is hoped that they will never in -practice be relevant. -

      -

      -The maximum length of a compiled pattern is approximately 64K data units (bytes -for the 8-bit library, 16-bit units for the 16-bit library, and 32-bit units for -the 32-bit library) if PCRE is compiled with the default internal linkage size, -which is 2 bytes for the 8-bit and 16-bit libraries, and 4 bytes for the 32-bit -library. If you want to process regular expressions that are truly enormous, -you can compile PCRE with an internal linkage size of 3 or 4 (when building the -16-bit or 32-bit library, 3 is rounded up to 4). See the README file in -the source distribution and the -pcrebuild -documentation for details. In these cases the limit is substantially larger. -However, the speed of execution is slower. -

      -

      -All values in repeating quantifiers must be less than 65536. -

      -

      -There is no limit to the number of parenthesized subpatterns, but there can be -no more than 65535 capturing subpatterns. There is, however, a limit to the -depth of nesting of parenthesized subpatterns of all kinds. This is imposed in -order to limit the amount of system stack used at compile time. The limit can -be specified when PCRE is built; the default is 250. -

      -

      -There is a limit to the number of forward references to subsequent subpatterns -of around 200,000. Repeated forward references with fixed upper limits, for -example, (?2){0,100} when subpattern number 2 is to the right, are included in -the count. There is no limit to the number of backward references. -

      -

      -The maximum length of name for a named subpattern is 32 characters, and the -maximum number of named subpatterns is 10000. -

      -

      -The maximum length of a name in a (*MARK), (*PRUNE), (*SKIP), or (*THEN) verb -is 255 for the 8-bit library and 65535 for the 16-bit and 32-bit libraries. -

      -

      -The maximum length of a subject string is the largest positive number that an -integer variable can hold. However, when using the traditional matching -function, PCRE uses recursion to handle subpatterns and indefinite repetition. -This means that the available stack space may limit the size of a subject -string that can be processed by certain patterns. For a discussion of stack -issues, see the -pcrestack -documentation. -

      -
      -AUTHOR -
      -

      -Philip Hazel -
      -University Computing Service -
      -Cambridge CB2 3QH, England. -
      -

      -
      -REVISION -
      -

      -Last updated: 05 November 2013 -
      -Copyright © 1997-2013 University of Cambridge. -
      -

      -Return to the PCRE index page. -

      diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcrematching.html b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcrematching.html deleted file mode 100644 index a1af39b6..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcrematching.html +++ /dev/null @@ -1,242 +0,0 @@ - - -pcrematching specification - - -

      pcrematching man page

      -

      -Return to the PCRE index page. -

      -

      -This page is part of the PCRE HTML documentation. It was generated automatically -from the original man page. If there is any nonsense in it, please consult the -man page, in case the conversion went wrong. -
      -

      -
      PCRE MATCHING ALGORITHMS
      -

      -This document describes the two different algorithms that are available in PCRE -for matching a compiled regular expression against a given subject string. The -"standard" algorithm is the one provided by the pcre_exec(), -pcre16_exec() and pcre32_exec() functions. These work in the same -as as Perl's matching function, and provide a Perl-compatible matching operation. -The just-in-time (JIT) optimization that is described in the -pcrejit -documentation is compatible with these functions. -

      -

      -An alternative algorithm is provided by the pcre_dfa_exec(), -pcre16_dfa_exec() and pcre32_dfa_exec() functions; they operate in -a different way, and are not Perl-compatible. This alternative has advantages -and disadvantages compared with the standard algorithm, and these are described -below. -

      -

      -When there is only one possible way in which a given subject string can match a -pattern, the two algorithms give the same answer. A difference arises, however, -when there are multiple possibilities. For example, if the pattern -

      -  ^<.*>
      -
      -is matched against the string -
      -  <something> <something else> <something further>
      -
      -there are three possible answers. The standard algorithm finds only one of -them, whereas the alternative algorithm finds all three. -

      -
      REGULAR EXPRESSIONS AS TREES
      -

      -The set of strings that are matched by a regular expression can be represented -as a tree structure. An unlimited repetition in the pattern makes the tree of -infinite size, but it is still a tree. Matching the pattern to a given subject -string (from a given starting point) can be thought of as a search of the tree. -There are two ways to search a tree: depth-first and breadth-first, and these -correspond to the two matching algorithms provided by PCRE. -

      -
      THE STANDARD MATCHING ALGORITHM
      -

      -In the terminology of Jeffrey Friedl's book "Mastering Regular -Expressions", the standard algorithm is an "NFA algorithm". It conducts a -depth-first search of the pattern tree. That is, it proceeds along a single -path through the tree, checking that the subject matches what is required. When -there is a mismatch, the algorithm tries any alternatives at the current point, -and if they all fail, it backs up to the previous branch point in the tree, and -tries the next alternative branch at that level. This often involves backing up -(moving to the left) in the subject string as well. The order in which -repetition branches are tried is controlled by the greedy or ungreedy nature of -the quantifier. -

      -

      -If a leaf node is reached, a matching string has been found, and at that point -the algorithm stops. Thus, if there is more than one possible match, this -algorithm returns the first one that it finds. Whether this is the shortest, -the longest, or some intermediate length depends on the way the greedy and -ungreedy repetition quantifiers are specified in the pattern. -

      -

      -Because it ends up with a single path through the tree, it is relatively -straightforward for this algorithm to keep track of the substrings that are -matched by portions of the pattern in parentheses. This provides support for -capturing parentheses and back references. -

      -
      THE ALTERNATIVE MATCHING ALGORITHM
      -

      -This algorithm conducts a breadth-first search of the tree. Starting from the -first matching point in the subject, it scans the subject string from left to -right, once, character by character, and as it does this, it remembers all the -paths through the tree that represent valid matches. In Friedl's terminology, -this is a kind of "DFA algorithm", though it is not implemented as a -traditional finite state machine (it keeps multiple states active -simultaneously). -

      -

      -Although the general principle of this matching algorithm is that it scans the -subject string only once, without backtracking, there is one exception: when a -lookaround assertion is encountered, the characters following or preceding the -current point have to be independently inspected. -

      -

      -The scan continues until either the end of the subject is reached, or there are -no more unterminated paths. At this point, terminated paths represent the -different matching possibilities (if there are none, the match has failed). -Thus, if there is more than one possible match, this algorithm finds all of -them, and in particular, it finds the longest. The matches are returned in -decreasing order of length. There is an option to stop the algorithm after the -first match (which is necessarily the shortest) is found. -

      -

      -Note that all the matches that are found start at the same point in the -subject. If the pattern -

      -  cat(er(pillar)?)?
      -
      -is matched against the string "the caterpillar catchment", the result will be -the three strings "caterpillar", "cater", and "cat" that start at the fifth -character of the subject. The algorithm does not automatically move on to find -matches that start at later positions. -

      -

      -PCRE's "auto-possessification" optimization usually applies to character -repeats at the end of a pattern (as well as internally). For example, the -pattern "a\d+" is compiled as if it were "a\d++" because there is no point -even considering the possibility of backtracking into the repeated digits. For -DFA matching, this means that only one possible match is found. If you really -do want multiple matches in such cases, either use an ungreedy repeat -("a\d+?") or set the PCRE_NO_AUTO_POSSESS option when compiling. -

      -

      -There are a number of features of PCRE regular expressions that are not -supported by the alternative matching algorithm. They are as follows: -

      -

      -1. Because the algorithm finds all possible matches, the greedy or ungreedy -nature of repetition quantifiers is not relevant. Greedy and ungreedy -quantifiers are treated in exactly the same way. However, possessive -quantifiers can make a difference when what follows could also match what is -quantified, for example in a pattern like this: -

      -  ^a++\w!
      -
      -This pattern matches "aaab!" but not "aaa!", which would be matched by a -non-possessive quantifier. Similarly, if an atomic group is present, it is -matched as if it were a standalone pattern at the current point, and the -longest match is then "locked in" for the rest of the overall pattern. -

      -

      -2. When dealing with multiple paths through the tree simultaneously, it is not -straightforward to keep track of captured substrings for the different matching -possibilities, and PCRE's implementation of this algorithm does not attempt to -do this. This means that no captured substrings are available. -

      -

      -3. Because no substrings are captured, back references within the pattern are -not supported, and cause errors if encountered. -

      -

      -4. For the same reason, conditional expressions that use a backreference as the -condition or test for a specific group recursion are not supported. -

      -

      -5. Because many paths through the tree may be active, the \K escape sequence, -which resets the start of the match when encountered (but may be on some paths -and not on others), is not supported. It causes an error if encountered. -

      -

      -6. Callouts are supported, but the value of the capture_top field is -always 1, and the value of the capture_last field is always -1. -

      -

      -7. The \C escape sequence, which (in the standard algorithm) always matches a -single data unit, even in UTF-8, UTF-16 or UTF-32 modes, is not supported in -these modes, because the alternative algorithm moves through the subject string -one character (not data unit) at a time, for all active paths through the tree. -

      -

      -8. Except for (*FAIL), the backtracking control verbs such as (*PRUNE) are not -supported. (*FAIL) is supported, and behaves like a failing negative assertion. -

      -
      ADVANTAGES OF THE ALTERNATIVE ALGORITHM
      -

      -Using the alternative matching algorithm provides the following advantages: -

      -

      -1. All possible matches (at a single point in the subject) are automatically -found, and in particular, the longest match is found. To find more than one -match using the standard algorithm, you have to do kludgy things with -callouts. -

      -

      -2. Because the alternative algorithm scans the subject string just once, and -never needs to backtrack (except for lookbehinds), it is possible to pass very -long subject strings to the matching function in several pieces, checking for -partial matching each time. Although it is possible to do multi-segment -matching using the standard algorithm by retaining partially matched -substrings, it is more complicated. The -pcrepartial -documentation gives details of partial matching and discusses multi-segment -matching. -

      -
      DISADVANTAGES OF THE ALTERNATIVE ALGORITHM
      -

      -The alternative algorithm suffers from a number of disadvantages: -

      -

      -1. It is substantially slower than the standard algorithm. This is partly -because it has to search for all possible matches, but is also because it is -less susceptible to optimization. -

      -

      -2. Capturing parentheses and back references are not supported. -

      -

      -3. Although atomic groups are supported, their use does not provide the -performance advantage that it does for the standard algorithm. -

      -
      AUTHOR
      -

      -Philip Hazel -
      -University Computing Service -
      -Cambridge CB2 3QH, England. -
      -

      -
      REVISION
      -

      -Last updated: 12 November 2013 -
      -Copyright © 1997-2012 University of Cambridge. -
      -

      -Return to the PCRE index page. -

      diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcrepartial.html b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcrepartial.html deleted file mode 100644 index 4faeafcb..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcrepartial.html +++ /dev/null @@ -1,509 +0,0 @@ - - -pcrepartial specification - - -

      pcrepartial man page

      -

      -Return to the PCRE index page. -

      -

      -This page is part of the PCRE HTML documentation. It was generated automatically -from the original man page. If there is any nonsense in it, please consult the -man page, in case the conversion went wrong. -
      -

      -
      PARTIAL MATCHING IN PCRE
      -

      -In normal use of PCRE, if the subject string that is passed to a matching -function matches as far as it goes, but is too short to match the entire -pattern, PCRE_ERROR_NOMATCH is returned. There are circumstances where it might -be helpful to distinguish this case from other cases in which there is no -match. -

      -

      -Consider, for example, an application where a human is required to type in data -for a field with specific formatting requirements. An example might be a date -in the form ddmmmyy, defined by this pattern: -

      -  ^\d?\d(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)\d\d$
      -
      -If the application sees the user's keystrokes one by one, and can check that -what has been typed so far is potentially valid, it is able to raise an error -as soon as a mistake is made, by beeping and not reflecting the character that -has been typed, for example. This immediate feedback is likely to be a better -user interface than a check that is delayed until the entire string has been -entered. Partial matching can also be useful when the subject string is very -long and is not all available at once. -

      -

      -PCRE supports partial matching by means of the PCRE_PARTIAL_SOFT and -PCRE_PARTIAL_HARD options, which can be set when calling any of the matching -functions. For backwards compatibility, PCRE_PARTIAL is a synonym for -PCRE_PARTIAL_SOFT. The essential difference between the two options is whether -or not a partial match is preferred to an alternative complete match, though -the details differ between the two types of matching function. If both options -are set, PCRE_PARTIAL_HARD takes precedence. -

      -

      -If you want to use partial matching with just-in-time optimized code, you must -call pcre_study(), pcre16_study() or pcre32_study() with one -or both of these options: -

      -  PCRE_STUDY_JIT_PARTIAL_SOFT_COMPILE
      -  PCRE_STUDY_JIT_PARTIAL_HARD_COMPILE
      -
      -PCRE_STUDY_JIT_COMPILE should also be set if you are going to run non-partial -matches on the same pattern. If the appropriate JIT study mode has not been set -for a match, the interpretive matching code is used. -

      -

      -Setting a partial matching option disables two of PCRE's standard -optimizations. PCRE remembers the last literal data unit in a pattern, and -abandons matching immediately if it is not present in the subject string. This -optimization cannot be used for a subject string that might match only -partially. If the pattern was studied, PCRE knows the minimum length of a -matching string, and does not bother to run the matching function on shorter -strings. This optimization is also disabled for partial matching. -

      -
      PARTIAL MATCHING USING pcre_exec() OR pcre[16|32]_exec()
      -

      -A partial match occurs during a call to pcre_exec() or -pcre[16|32]_exec() when the end of the subject string is reached -successfully, but matching cannot continue because more characters are needed. -However, at least one character in the subject must have been inspected. This -character need not form part of the final matched string; lookbehind assertions -and the \K escape sequence provide ways of inspecting characters before the -start of a matched substring. The requirement for inspecting at least one -character exists because an empty string can always be matched; without such a -restriction there would always be a partial match of an empty string at the end -of the subject. -

      -

      -If there are at least two slots in the offsets vector when a partial match is -returned, the first slot is set to the offset of the earliest character that -was inspected. For convenience, the second offset points to the end of the -subject so that a substring can easily be identified. If there are at least -three slots in the offsets vector, the third slot is set to the offset of the -character where matching started. -

      -

      -For the majority of patterns, the contents of the first and third slots will be -the same. However, for patterns that contain lookbehind assertions, or begin -with \b or \B, characters before the one where matching started may have been -inspected while carrying out the match. For example, consider this pattern: -

      -  /(?<=abc)123/
      -
      -This pattern matches "123", but only if it is preceded by "abc". If the subject -string is "xyzabc12", the first two offsets after a partial match are for the -substring "abc12", because all these characters were inspected. However, the -third offset is set to 6, because that is the offset where matching began. -

      -

      -What happens when a partial match is identified depends on which of the two -partial matching options are set. -

      -
      -PCRE_PARTIAL_SOFT WITH pcre_exec() OR pcre[16|32]_exec() -
      -

      -If PCRE_PARTIAL_SOFT is set when pcre_exec() or pcre[16|32]_exec() -identifies a partial match, the partial match is remembered, but matching -continues as normal, and other alternatives in the pattern are tried. If no -complete match can be found, PCRE_ERROR_PARTIAL is returned instead of -PCRE_ERROR_NOMATCH. -

      -

      -This option is "soft" because it prefers a complete match over a partial match. -All the various matching items in a pattern behave as if the subject string is -potentially complete. For example, \z, \Z, and $ match at the end of the -subject, as normal, and for \b and \B the end of the subject is treated as a -non-alphanumeric. -

      -

      -If there is more than one partial match, the first one that was found provides -the data that is returned. Consider this pattern: -

      -  /123\w+X|dogY/
      -
      -If this is matched against the subject string "abc123dog", both -alternatives fail to match, but the end of the subject is reached during -matching, so PCRE_ERROR_PARTIAL is returned. The offsets are set to 3 and 9, -identifying "123dog" as the first partial match that was found. (In this -example, there are two partial matches, because "dog" on its own partially -matches the second alternative.) -

      -
      -PCRE_PARTIAL_HARD WITH pcre_exec() OR pcre[16|32]_exec() -
      -

      -If PCRE_PARTIAL_HARD is set for pcre_exec() or pcre[16|32]_exec(), -PCRE_ERROR_PARTIAL is returned as soon as a partial match is found, without -continuing to search for possible complete matches. This option is "hard" -because it prefers an earlier partial match over a later complete match. For -this reason, the assumption is made that the end of the supplied subject string -may not be the true end of the available data, and so, if \z, \Z, \b, \B, -or $ are encountered at the end of the subject, the result is -PCRE_ERROR_PARTIAL, provided that at least one character in the subject has -been inspected. -

      -

      -Setting PCRE_PARTIAL_HARD also affects the way UTF-8 and UTF-16 -subject strings are checked for validity. Normally, an invalid sequence -causes the error PCRE_ERROR_BADUTF8 or PCRE_ERROR_BADUTF16. However, in the -special case of a truncated character at the end of the subject, -PCRE_ERROR_SHORTUTF8 or PCRE_ERROR_SHORTUTF16 is returned when -PCRE_PARTIAL_HARD is set. -

      -
      -Comparing hard and soft partial matching -
      -

      -The difference between the two partial matching options can be illustrated by a -pattern such as: -

      -  /dog(sbody)?/
      -
      -This matches either "dog" or "dogsbody", greedily (that is, it prefers the -longer string if possible). If it is matched against the string "dog" with -PCRE_PARTIAL_SOFT, it yields a complete match for "dog". However, if -PCRE_PARTIAL_HARD is set, the result is PCRE_ERROR_PARTIAL. On the other hand, -if the pattern is made ungreedy the result is different: -
      -  /dog(sbody)??/
      -
      -In this case the result is always a complete match because that is found first, -and matching never continues after finding a complete match. It might be easier -to follow this explanation by thinking of the two patterns like this: -
      -  /dog(sbody)?/    is the same as  /dogsbody|dog/
      -  /dog(sbody)??/   is the same as  /dog|dogsbody/
      -
      -The second pattern will never match "dogsbody", because it will always find the -shorter match first. -

      -
      PARTIAL MATCHING USING pcre_dfa_exec() OR pcre[16|32]_dfa_exec()
      -

      -The DFA functions move along the subject string character by character, without -backtracking, searching for all possible matches simultaneously. If the end of -the subject is reached before the end of the pattern, there is the possibility -of a partial match, again provided that at least one character has been -inspected. -

      -

      -When PCRE_PARTIAL_SOFT is set, PCRE_ERROR_PARTIAL is returned only if there -have been no complete matches. Otherwise, the complete matches are returned. -However, if PCRE_PARTIAL_HARD is set, a partial match takes precedence over any -complete matches. The portion of the string that was inspected when the longest -partial match was found is set as the first matching string, provided there are -at least two slots in the offsets vector. -

      -

      -Because the DFA functions always search for all possible matches, and there is -no difference between greedy and ungreedy repetition, their behaviour is -different from the standard functions when PCRE_PARTIAL_HARD is set. Consider -the string "dog" matched against the ungreedy pattern shown above: -

      -  /dog(sbody)??/
      -
      -Whereas the standard functions stop as soon as they find the complete match for -"dog", the DFA functions also find the partial match for "dogsbody", and so -return that when PCRE_PARTIAL_HARD is set. -

      -
      PARTIAL MATCHING AND WORD BOUNDARIES
      -

      -If a pattern ends with one of sequences \b or \B, which test for word -boundaries, partial matching with PCRE_PARTIAL_SOFT can give counter-intuitive -results. Consider this pattern: -

      -  /\bcat\b/
      -
      -This matches "cat", provided there is a word boundary at either end. If the -subject string is "the cat", the comparison of the final "t" with a following -character cannot take place, so a partial match is found. However, normal -matching carries on, and \b matches at the end of the subject when the last -character is a letter, so a complete match is found. The result, therefore, is -not PCRE_ERROR_PARTIAL. Using PCRE_PARTIAL_HARD in this case does yield -PCRE_ERROR_PARTIAL, because then the partial match takes precedence. -

      -
      FORMERLY RESTRICTED PATTERNS
      -

      -For releases of PCRE prior to 8.00, because of the way certain internal -optimizations were implemented in the pcre_exec() function, the -PCRE_PARTIAL option (predecessor of PCRE_PARTIAL_SOFT) could not be used with -all patterns. From release 8.00 onwards, the restrictions no longer apply, and -partial matching with can be requested for any pattern. -

      -

      -Items that were formerly restricted were repeated single characters and -repeated metasequences. If PCRE_PARTIAL was set for a pattern that did not -conform to the restrictions, pcre_exec() returned the error code -PCRE_ERROR_BADPARTIAL (-13). This error code is no longer in use. The -PCRE_INFO_OKPARTIAL call to pcre_fullinfo() to find out if a compiled -pattern can be used for partial matching now always returns 1. -

      -
      EXAMPLE OF PARTIAL MATCHING USING PCRETEST
      -

      -If the escape sequence \P is present in a pcretest data line, the -PCRE_PARTIAL_SOFT option is used for the match. Here is a run of pcretest -that uses the date example quoted above: -

      -    re> /^\d?\d(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)\d\d$/
      -  data> 25jun04\P
      -   0: 25jun04
      -   1: jun
      -  data> 25dec3\P
      -  Partial match: 23dec3
      -  data> 3ju\P
      -  Partial match: 3ju
      -  data> 3juj\P
      -  No match
      -  data> j\P
      -  No match
      -
      -The first data string is matched completely, so pcretest shows the -matched substrings. The remaining four strings do not match the complete -pattern, but the first two are partial matches. Similar output is obtained -if DFA matching is used. -

      -

      -If the escape sequence \P is present more than once in a pcretest data -line, the PCRE_PARTIAL_HARD option is set for the match. -

      -
      MULTI-SEGMENT MATCHING WITH pcre_dfa_exec() OR pcre[16|32]_dfa_exec()
      -

      -When a partial match has been found using a DFA matching function, it is -possible to continue the match by providing additional subject data and calling -the function again with the same compiled regular expression, this time setting -the PCRE_DFA_RESTART option. You must pass the same working space as before, -because this is where details of the previous partial match are stored. Here is -an example using pcretest, using the \R escape sequence to set the -PCRE_DFA_RESTART option (\D specifies the use of the DFA matching function): -

      -    re> /^\d?\d(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)\d\d$/
      -  data> 23ja\P\D
      -  Partial match: 23ja
      -  data> n05\R\D
      -   0: n05
      -
      -The first call has "23ja" as the subject, and requests partial matching; the -second call has "n05" as the subject for the continued (restarted) match. -Notice that when the match is complete, only the last part is shown; PCRE does -not retain the previously partially-matched string. It is up to the calling -program to do that if it needs to. -

      -

      -That means that, for an unanchored pattern, if a continued match fails, it is -not possible to try again at a new starting point. All this facility is capable -of doing is continuing with the previous match attempt. In the previous -example, if the second set of data is "ug23" the result is no match, even -though there would be a match for "aug23" if the entire string were given at -once. Depending on the application, this may or may not be what you want. -The only way to allow for starting again at the next character is to retain the -matched part of the subject and try a new complete match. -

      -

      -You can set the PCRE_PARTIAL_SOFT or PCRE_PARTIAL_HARD options with -PCRE_DFA_RESTART to continue partial matching over multiple segments. This -facility can be used to pass very long subject strings to the DFA matching -functions. -

      -
      MULTI-SEGMENT MATCHING WITH pcre_exec() OR pcre[16|32]_exec()
      -

      -From release 8.00, the standard matching functions can also be used to do -multi-segment matching. Unlike the DFA functions, it is not possible to -restart the previous match with a new segment of data. Instead, new data must -be added to the previous subject string, and the entire match re-run, starting -from the point where the partial match occurred. Earlier data can be discarded. -

      -

      -It is best to use PCRE_PARTIAL_HARD in this situation, because it does not -treat the end of a segment as the end of the subject when matching \z, \Z, -\b, \B, and $. Consider an unanchored pattern that matches dates: -

      -    re> /\d?\d(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)\d\d/
      -  data> The date is 23ja\P\P
      -  Partial match: 23ja
      -
      -At this stage, an application could discard the text preceding "23ja", add on -text from the next segment, and call the matching function again. Unlike the -DFA matching functions, the entire matching string must always be available, -and the complete matching process occurs for each call, so more memory and more -processing time is needed. -

      -

      -Note: If the pattern contains lookbehind assertions, or \K, or starts -with \b or \B, the string that is returned for a partial match includes -characters that precede the start of what would be returned for a complete -match, because it contains all the characters that were inspected during the -partial match. -

      -
      ISSUES WITH MULTI-SEGMENT MATCHING
      -

      -Certain types of pattern may give problems with multi-segment matching, -whichever matching function is used. -

      -

      -1. If the pattern contains a test for the beginning of a line, you need to pass -the PCRE_NOTBOL option when the subject string for any call does start at the -beginning of a line. There is also a PCRE_NOTEOL option, but in practice when -doing multi-segment matching you should be using PCRE_PARTIAL_HARD, which -includes the effect of PCRE_NOTEOL. -

      -

      -2. Lookbehind assertions that have already been obeyed are catered for in the -offsets that are returned for a partial match. However a lookbehind assertion -later in the pattern could require even earlier characters to be inspected. You -can handle this case by using the PCRE_INFO_MAXLOOKBEHIND option of the -pcre_fullinfo() or pcre[16|32]_fullinfo() functions to obtain the -length of the longest lookbehind in the pattern. This length is given in -characters, not bytes. If you always retain at least that many characters -before the partially matched string, all should be well. (Of course, near the -start of the subject, fewer characters may be present; in that case all -characters should be retained.) -

      -

      -From release 8.33, there is a more accurate way of deciding which characters to -retain. Instead of subtracting the length of the longest lookbehind from the -earliest inspected character (offsets[0]), the match start position -(offsets[2]) should be used, and the next match attempt started at the -offsets[2] character by setting the startoffset argument of -pcre_exec() or pcre_dfa_exec(). -

      -

      -For example, if the pattern "(?<=123)abc" is partially -matched against the string "xx123a", the three offset values returned are 2, 6, -and 5. This indicates that the matching process that gave a partial match -started at offset 5, but the characters "123a" were all inspected. The maximum -lookbehind for that pattern is 3, so taking that away from 5 shows that we need -only keep "123a", and the next match attempt can be started at offset 3 (that -is, at "a") when further characters have been added. When the match start is -not the earliest inspected character, pcretest shows it explicitly: -

      -    re> "(?<=123)abc"
      -  data> xx123a\P\P
      -  Partial match at offset 5: 123a
      -
      -

      -

      -3. Because a partial match must always contain at least one character, what -might be considered a partial match of an empty string actually gives a "no -match" result. For example: -

      -    re> /c(?<=abc)x/
      -  data> ab\P
      -  No match
      -
      -If the next segment begins "cx", a match should be found, but this will only -happen if characters from the previous segment are retained. For this reason, a -"no match" result should be interpreted as "partial match of an empty string" -when the pattern contains lookbehinds. -

      -

      -4. Matching a subject string that is split into multiple segments may not -always produce exactly the same result as matching over one single long string, -especially when PCRE_PARTIAL_SOFT is used. The section "Partial Matching and -Word Boundaries" above describes an issue that arises if the pattern ends with -\b or \B. Another kind of difference may occur when there are multiple -matching possibilities, because (for PCRE_PARTIAL_SOFT) a partial match result -is given only when there are no completed matches. This means that as soon as -the shortest match has been found, continuation to a new subject segment is no -longer possible. Consider again this pcretest example: -

      -    re> /dog(sbody)?/
      -  data> dogsb\P
      -   0: dog
      -  data> do\P\D
      -  Partial match: do
      -  data> gsb\R\P\D
      -   0: g
      -  data> dogsbody\D
      -   0: dogsbody
      -   1: dog
      -
      -The first data line passes the string "dogsb" to a standard matching function, -setting the PCRE_PARTIAL_SOFT option. Although the string is a partial match -for "dogsbody", the result is not PCRE_ERROR_PARTIAL, because the shorter -string "dog" is a complete match. Similarly, when the subject is presented to -a DFA matching function in several parts ("do" and "gsb" being the first two) -the match stops when "dog" has been found, and it is not possible to continue. -On the other hand, if "dogsbody" is presented as a single string, a DFA -matching function finds both matches. -

      -

      -Because of these problems, it is best to use PCRE_PARTIAL_HARD when matching -multi-segment data. The example above then behaves differently: -

      -    re> /dog(sbody)?/
      -  data> dogsb\P\P
      -  Partial match: dogsb
      -  data> do\P\D
      -  Partial match: do
      -  data> gsb\R\P\P\D
      -  Partial match: gsb
      -
      -5. Patterns that contain alternatives at the top level which do not all start -with the same pattern item may not work as expected when PCRE_DFA_RESTART is -used. For example, consider this pattern: -
      -  1234|3789
      -
      -If the first part of the subject is "ABC123", a partial match of the first -alternative is found at offset 3. There is no partial match for the second -alternative, because such a match does not start at the same point in the -subject string. Attempting to continue with the string "7890" does not yield a -match because only those alternatives that match at one point in the subject -are remembered. The problem arises because the start of the second alternative -matches within the first alternative. There is no problem with anchored -patterns or patterns such as: -
      -  1234|ABCD
      -
      -where no string can be a partial match for both alternatives. This is not a -problem if a standard matching function is used, because the entire match has -to be rerun each time: -
      -    re> /1234|3789/
      -  data> ABC123\P\P
      -  Partial match: 123
      -  data> 1237890
      -   0: 3789
      -
      -Of course, instead of using PCRE_DFA_RESTART, the same technique of re-running -the entire match can also be used with the DFA matching functions. Another -possibility is to work with two buffers. If a partial match at offset n -in the first buffer is followed by "no match" when PCRE_DFA_RESTART is used on -the second buffer, you can then try a new match starting at offset n+1 in -the first buffer. -

      -
      AUTHOR
      -

      -Philip Hazel -
      -University Computing Service -
      -Cambridge CB2 3QH, England. -
      -

      -
      REVISION
      -

      -Last updated: 02 July 2013 -
      -Copyright © 1997-2013 University of Cambridge. -
      -

      -Return to the PCRE index page. -

      diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcrepattern.html b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcrepattern.html deleted file mode 100644 index 96fc7298..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcrepattern.html +++ /dev/null @@ -1,3276 +0,0 @@ - - -pcrepattern specification - - -

      pcrepattern man page

      -

      -Return to the PCRE index page. -

      -

      -This page is part of the PCRE HTML documentation. It was generated automatically -from the original man page. If there is any nonsense in it, please consult the -man page, in case the conversion went wrong. -
      -

      -
      PCRE REGULAR EXPRESSION DETAILS
      -

      -The syntax and semantics of the regular expressions that are supported by PCRE -are described in detail below. There is a quick-reference syntax summary in the -pcresyntax -page. PCRE tries to match Perl syntax and semantics as closely as it can. PCRE -also supports some alternative regular expression syntax (which does not -conflict with the Perl syntax) in order to provide some compatibility with -regular expressions in Python, .NET, and Oniguruma. -

      -

      -Perl's regular expressions are described in its own documentation, and -regular expressions in general are covered in a number of books, some of which -have copious examples. Jeffrey Friedl's "Mastering Regular Expressions", -published by O'Reilly, covers regular expressions in great detail. This -description of PCRE's regular expressions is intended as reference material. -

      -

      -This document discusses the patterns that are supported by PCRE when one its -main matching functions, pcre_exec() (8-bit) or pcre[16|32]_exec() -(16- or 32-bit), is used. PCRE also has alternative matching functions, -pcre_dfa_exec() and pcre[16|32_dfa_exec(), which match using a -different algorithm that is not Perl-compatible. Some of the features discussed -below are not available when DFA matching is used. The advantages and -disadvantages of the alternative functions, and how they differ from the normal -functions, are discussed in the -pcrematching -page. -

      -
      SPECIAL START-OF-PATTERN ITEMS
      -

      -A number of options that can be passed to pcre_compile() can also be set -by special items at the start of a pattern. These are not Perl-compatible, but -are provided to make these options accessible to pattern writers who are not -able to change the program that processes the pattern. Any number of these -items may appear, but they must all be together right at the start of the -pattern string, and the letters must be in upper case. -

      -
      -UTF support -
      -

      -The original operation of PCRE was on strings of one-byte characters. However, -there is now also support for UTF-8 strings in the original library, an -extra library that supports 16-bit and UTF-16 character strings, and a -third library that supports 32-bit and UTF-32 character strings. To use these -features, PCRE must be built to include appropriate support. When using UTF -strings you must either call the compiling function with the PCRE_UTF8, -PCRE_UTF16, or PCRE_UTF32 option, or the pattern must start with one of -these special sequences: -

      -  (*UTF8)
      -  (*UTF16)
      -  (*UTF32)
      -  (*UTF)
      -
      -(*UTF) is a generic sequence that can be used with any of the libraries. -Starting a pattern with such a sequence is equivalent to setting the relevant -option. How setting a UTF mode affects pattern matching is mentioned in several -places below. There is also a summary of features in the -pcreunicode -page. -

      -

      -Some applications that allow their users to supply patterns may wish to -restrict them to non-UTF data for security reasons. If the PCRE_NEVER_UTF -option is set at compile time, (*UTF) etc. are not allowed, and their -appearance causes an error. -

      -
      -Unicode property support -
      -

      -Another special sequence that may appear at the start of a pattern is (*UCP). -This has the same effect as setting the PCRE_UCP option: it causes sequences -such as \d and \w to use Unicode properties to determine character types, -instead of recognizing only characters with codes less than 128 via a lookup -table. -

      -
      -Disabling auto-possessification -
      -

      -If a pattern starts with (*NO_AUTO_POSSESS), it has the same effect as setting -the PCRE_NO_AUTO_POSSESS option at compile time. This stops PCRE from making -quantifiers possessive when what follows cannot match the repeated item. For -example, by default a+b is treated as a++b. For more details, see the -pcreapi -documentation. -

      -
      -Disabling start-up optimizations -
      -

      -If a pattern starts with (*NO_START_OPT), it has the same effect as setting the -PCRE_NO_START_OPTIMIZE option either at compile or matching time. This disables -several optimizations for quickly reaching "no match" results. For more -details, see the -pcreapi -documentation. -

      -
      -Newline conventions -
      -

      -PCRE supports five different conventions for indicating line breaks in -strings: a single CR (carriage return) character, a single LF (linefeed) -character, the two-character sequence CRLF, any of the three preceding, or any -Unicode newline sequence. The -pcreapi -page has -further discussion -about newlines, and shows how to set the newline convention in the -options arguments for the compiling and matching functions. -

      -

      -It is also possible to specify a newline convention by starting a pattern -string with one of the following five sequences: -

      -  (*CR)        carriage return
      -  (*LF)        linefeed
      -  (*CRLF)      carriage return, followed by linefeed
      -  (*ANYCRLF)   any of the three above
      -  (*ANY)       all Unicode newline sequences
      -
      -These override the default and the options given to the compiling function. For -example, on a Unix system where LF is the default newline sequence, the pattern -
      -  (*CR)a.b
      -
      -changes the convention to CR. That pattern matches "a\nb" because LF is no -longer a newline. If more than one of these settings is present, the last one -is used. -

      -

      -The newline convention affects where the circumflex and dollar assertions are -true. It also affects the interpretation of the dot metacharacter when -PCRE_DOTALL is not set, and the behaviour of \N. However, it does not affect -what the \R escape sequence matches. By default, this is any Unicode newline -sequence, for Perl compatibility. However, this can be changed; see the -description of \R in the section entitled -"Newline sequences" -below. A change of \R setting can be combined with a change of newline -convention. -

      -
      -Setting match and recursion limits -
      -

      -The caller of pcre_exec() can set a limit on the number of times the -internal match() function is called and on the maximum depth of -recursive calls. These facilities are provided to catch runaway matches that -are provoked by patterns with huge matching trees (a typical example is a -pattern with nested unlimited repeats) and to avoid running out of system stack -by too much recursion. When one of these limits is reached, pcre_exec() -gives an error return. The limits can also be set by items at the start of the -pattern of the form -

      -  (*LIMIT_MATCH=d)
      -  (*LIMIT_RECURSION=d)
      -
      -where d is any number of decimal digits. However, the value of the setting must -be less than the value set (or defaulted) by the caller of pcre_exec() -for it to have any effect. In other words, the pattern writer can lower the -limits set by the programmer, but not raise them. If there is more than one -setting of one of these limits, the lower value is used. -

      -
      EBCDIC CHARACTER CODES
      -

      -PCRE can be compiled to run in an environment that uses EBCDIC as its character -code rather than ASCII or Unicode (typically a mainframe system). In the -sections below, character code values are ASCII or Unicode; in an EBCDIC -environment these characters may have different code values, and there are no -code points greater than 255. -

      -
      CHARACTERS AND METACHARACTERS
      -

      -A regular expression is a pattern that is matched against a subject string from -left to right. Most characters stand for themselves in a pattern, and match the -corresponding characters in the subject. As a trivial example, the pattern -

      -  The quick brown fox
      -
      -matches a portion of a subject string that is identical to itself. When -caseless matching is specified (the PCRE_CASELESS option), letters are matched -independently of case. In a UTF mode, PCRE always understands the concept of -case for characters whose values are less than 128, so caseless matching is -always possible. For characters with higher values, the concept of case is -supported if PCRE is compiled with Unicode property support, but not otherwise. -If you want to use caseless matching for characters 128 and above, you must -ensure that PCRE is compiled with Unicode property support as well as with -UTF support. -

      -

      -The power of regular expressions comes from the ability to include alternatives -and repetitions in the pattern. These are encoded in the pattern by the use of -metacharacters, which do not stand for themselves but instead are -interpreted in some special way. -

      -

      -There are two different sets of metacharacters: those that are recognized -anywhere in the pattern except within square brackets, and those that are -recognized within square brackets. Outside square brackets, the metacharacters -are as follows: -

      -  \      general escape character with several uses
      -  ^      assert start of string (or line, in multiline mode)
      -  $      assert end of string (or line, in multiline mode)
      -  .      match any character except newline (by default)
      -  [      start character class definition
      -  |      start of alternative branch
      -  (      start subpattern
      -  )      end subpattern
      -  ?      extends the meaning of (
      -         also 0 or 1 quantifier
      -         also quantifier minimizer
      -  *      0 or more quantifier
      -  +      1 or more quantifier
      -         also "possessive quantifier"
      -  {      start min/max quantifier
      -
      -Part of a pattern that is in square brackets is called a "character class". In -a character class the only metacharacters are: -
      -  \      general escape character
      -  ^      negate the class, but only if the first character
      -  -      indicates character range
      -  [      POSIX character class (only if followed by POSIX syntax)
      -  ]      terminates the character class
      -
      -The following sections describe the use of each of the metacharacters. -

      -
      BACKSLASH
      -

      -The backslash character has several uses. Firstly, if it is followed by a -character that is not a number or a letter, it takes away any special meaning -that character may have. This use of backslash as an escape character applies -both inside and outside character classes. -

      -

      -For example, if you want to match a * character, you write \* in the pattern. -This escaping action applies whether or not the following character would -otherwise be interpreted as a metacharacter, so it is always safe to precede a -non-alphanumeric with backslash to specify that it stands for itself. In -particular, if you want to match a backslash, you write \\. -

      -

      -In a UTF mode, only ASCII numbers and letters have any special meaning after a -backslash. All other characters (in particular, those whose codepoints are -greater than 127) are treated as literals. -

      -

      -If a pattern is compiled with the PCRE_EXTENDED option, most white space in the -pattern (other than in a character class), and characters between a # outside a -character class and the next newline, inclusive, are ignored. An escaping -backslash can be used to include a white space or # character as part of the -pattern. -

      -

      -If you want to remove the special meaning from a sequence of characters, you -can do so by putting them between \Q and \E. This is different from Perl in -that $ and @ are handled as literals in \Q...\E sequences in PCRE, whereas in -Perl, $ and @ cause variable interpolation. Note the following examples: -

      -  Pattern            PCRE matches   Perl matches
      -
      -  \Qabc$xyz\E        abc$xyz        abc followed by the contents of $xyz
      -  \Qabc\$xyz\E       abc\$xyz       abc\$xyz
      -  \Qabc\E\$\Qxyz\E   abc$xyz        abc$xyz
      -
      -The \Q...\E sequence is recognized both inside and outside character classes. -An isolated \E that is not preceded by \Q is ignored. If \Q is not followed -by \E later in the pattern, the literal interpretation continues to the end of -the pattern (that is, \E is assumed at the end). If the isolated \Q is inside -a character class, this causes an error, because the character class is not -terminated. -

      -
      -Non-printing characters -
      -

      -A second use of backslash provides a way of encoding non-printing characters -in patterns in a visible manner. There is no restriction on the appearance of -non-printing characters, apart from the binary zero that terminates a pattern, -but when a pattern is being prepared by text editing, it is often easier to use -one of the following escape sequences than the binary character it represents. -In an ASCII or Unicode environment, these escapes are as follows: -

      -  \a        alarm, that is, the BEL character (hex 07)
      -  \cx       "control-x", where x is any ASCII character
      -  \e        escape (hex 1B)
      -  \f        form feed (hex 0C)
      -  \n        linefeed (hex 0A)
      -  \r        carriage return (hex 0D)
      -  \t        tab (hex 09)
      -  \0dd      character with octal code 0dd
      -  \ddd      character with octal code ddd, or back reference
      -  \o{ddd..} character with octal code ddd..
      -  \xhh      character with hex code hh
      -  \x{hhh..} character with hex code hhh.. (non-JavaScript mode)
      -  \uhhhh    character with hex code hhhh (JavaScript mode only)
      -
      -The precise effect of \cx on ASCII characters is as follows: if x is a lower -case letter, it is converted to upper case. Then bit 6 of the character (hex -40) is inverted. Thus \cA to \cZ become hex 01 to hex 1A (A is 41, Z is 5A), -but \c{ becomes hex 3B ({ is 7B), and \c; becomes hex 7B (; is 3B). If the -data item (byte or 16-bit value) following \c has a value greater than 127, a -compile-time error occurs. This locks out non-ASCII characters in all modes. -

      -

      -When PCRE is compiled in EBCDIC mode, \a, \e, \f, \n, \r, and \t -generate the appropriate EBCDIC code values. The \c escape is processed -as specified for Perl in the perlebcdic document. The only characters -that are allowed after \c are A-Z, a-z, or one of @, [, \, ], ^, _, or ?. Any -other character provokes a compile-time error. The sequence \c@ encodes -character code 0; after \c the letters (in either case) encode characters 1-26 -(hex 01 to hex 1A); [, \, ], ^, and _ encode characters 27-31 (hex 1B to hex -1F), and \c? becomes either 255 (hex FF) or 95 (hex 5F). -

      -

      -Thus, apart from \c?, these escapes generate the same character code values as -they do in an ASCII environment, though the meanings of the values mostly -differ. For example, \cG always generates code value 7, which is BEL in ASCII -but DEL in EBCDIC. -

      -

      -The sequence \c? generates DEL (127, hex 7F) in an ASCII environment, but -because 127 is not a control character in EBCDIC, Perl makes it generate the -APC character. Unfortunately, there are several variants of EBCDIC. In most of -them the APC character has the value 255 (hex FF), but in the one Perl calls -POSIX-BC its value is 95 (hex 5F). If certain other characters have POSIX-BC -values, PCRE makes \c? generate 95; otherwise it generates 255. -

      -

      -After \0 up to two further octal digits are read. If there are fewer than two -digits, just those that are present are used. Thus the sequence \0\x\015 -specifies two binary zeros followed by a CR character (code value 13). Make -sure you supply two digits after the initial zero if the pattern character that -follows is itself an octal digit. -

      -

      -The escape \o must be followed by a sequence of octal digits, enclosed in -braces. An error occurs if this is not the case. This escape is a recent -addition to Perl; it provides way of specifying character code points as octal -numbers greater than 0777, and it also allows octal numbers and back references -to be unambiguously specified. -

      -

      -For greater clarity and unambiguity, it is best to avoid following \ by a -digit greater than zero. Instead, use \o{} or \x{} to specify character -numbers, and \g{} to specify back references. The following paragraphs -describe the old, ambiguous syntax. -

      -

      -The handling of a backslash followed by a digit other than 0 is complicated, -and Perl has changed in recent releases, causing PCRE also to change. Outside a -character class, PCRE reads the digit and any following digits as a decimal -number. If the number is less than 8, or if there have been at least that many -previous capturing left parentheses in the expression, the entire sequence is -taken as a back reference. A description of how this works is given -later, -following the discussion of -parenthesized subpatterns. -

      -

      -Inside a character class, or if the decimal number following \ is greater than -7 and there have not been that many capturing subpatterns, PCRE handles \8 and -\9 as the literal characters "8" and "9", and otherwise re-reads up to three -octal digits following the backslash, using them to generate a data character. -Any subsequent digits stand for themselves. For example: -

      -  \040   is another way of writing an ASCII space
      -  \40    is the same, provided there are fewer than 40 previous capturing subpatterns
      -  \7     is always a back reference
      -  \11    might be a back reference, or another way of writing a tab
      -  \011   is always a tab
      -  \0113  is a tab followed by the character "3"
      -  \113   might be a back reference, otherwise the character with octal code 113
      -  \377   might be a back reference, otherwise the value 255 (decimal)
      -  \81    is either a back reference, or the two characters "8" and "1"
      -
      -Note that octal values of 100 or greater that are specified using this syntax -must not be introduced by a leading zero, because no more than three octal -digits are ever read. -

      -

      -By default, after \x that is not followed by {, from zero to two hexadecimal -digits are read (letters can be in upper or lower case). Any number of -hexadecimal digits may appear between \x{ and }. If a character other than -a hexadecimal digit appears between \x{ and }, or if there is no terminating -}, an error occurs. -

      -

      -If the PCRE_JAVASCRIPT_COMPAT option is set, the interpretation of \x is -as just described only when it is followed by two hexadecimal digits. -Otherwise, it matches a literal "x" character. In JavaScript mode, support for -code points greater than 256 is provided by \u, which must be followed by -four hexadecimal digits; otherwise it matches a literal "u" character. -

      -

      -Characters whose value is less than 256 can be defined by either of the two -syntaxes for \x (or by \u in JavaScript mode). There is no difference in the -way they are handled. For example, \xdc is exactly the same as \x{dc} (or -\u00dc in JavaScript mode). -

      -
      -Constraints on character values -
      -

      -Characters that are specified using octal or hexadecimal numbers are -limited to certain values, as follows: -

      -  8-bit non-UTF mode    less than 0x100
      -  8-bit UTF-8 mode      less than 0x10ffff and a valid codepoint
      -  16-bit non-UTF mode   less than 0x10000
      -  16-bit UTF-16 mode    less than 0x10ffff and a valid codepoint
      -  32-bit non-UTF mode   less than 0x100000000
      -  32-bit UTF-32 mode    less than 0x10ffff and a valid codepoint
      -
      -Invalid Unicode codepoints are the range 0xd800 to 0xdfff (the so-called -"surrogate" codepoints), and 0xffef. -

      -
      -Escape sequences in character classes -
      -

      -All the sequences that define a single character value can be used both inside -and outside character classes. In addition, inside a character class, \b is -interpreted as the backspace character (hex 08). -

      -

      -\N is not allowed in a character class. \B, \R, and \X are not special -inside a character class. Like other unrecognized escape sequences, they are -treated as the literal characters "B", "R", and "X" by default, but cause an -error if the PCRE_EXTRA option is set. Outside a character class, these -sequences have different meanings. -

      -
      -Unsupported escape sequences -
      -

      -In Perl, the sequences \l, \L, \u, and \U are recognized by its string -handler and used to modify the case of following characters. By default, PCRE -does not support these escape sequences. However, if the PCRE_JAVASCRIPT_COMPAT -option is set, \U matches a "U" character, and \u can be used to define a -character by code point, as described in the previous section. -

      -
      -Absolute and relative back references -
      -

      -The sequence \g followed by an unsigned or a negative number, optionally -enclosed in braces, is an absolute or relative back reference. A named back -reference can be coded as \g{name}. Back references are discussed -later, -following the discussion of -parenthesized subpatterns. -

      -
      -Absolute and relative subroutine calls -
      -

      -For compatibility with Oniguruma, the non-Perl syntax \g followed by a name or -a number enclosed either in angle brackets or single quotes, is an alternative -syntax for referencing a subpattern as a "subroutine". Details are discussed -later. -Note that \g{...} (Perl syntax) and \g<...> (Oniguruma syntax) are not -synonymous. The former is a back reference; the latter is a -subroutine -call. -

      -
      -Generic character types -
      -

      -Another use of backslash is for specifying generic character types: -

      -  \d     any decimal digit
      -  \D     any character that is not a decimal digit
      -  \h     any horizontal white space character
      -  \H     any character that is not a horizontal white space character
      -  \s     any white space character
      -  \S     any character that is not a white space character
      -  \v     any vertical white space character
      -  \V     any character that is not a vertical white space character
      -  \w     any "word" character
      -  \W     any "non-word" character
      -
      -There is also the single sequence \N, which matches a non-newline character. -This is the same as -the "." metacharacter -when PCRE_DOTALL is not set. Perl also uses \N to match characters by name; -PCRE does not support this. -

      -

      -Each pair of lower and upper case escape sequences partitions the complete set -of characters into two disjoint sets. Any given character matches one, and only -one, of each pair. The sequences can appear both inside and outside character -classes. They each match one character of the appropriate type. If the current -matching point is at the end of the subject string, all of them fail, because -there is no character to match. -

      -

      -For compatibility with Perl, \s did not used to match the VT character (code -11), which made it different from the the POSIX "space" class. However, Perl -added VT at release 5.18, and PCRE followed suit at release 8.34. The default -\s characters are now HT (9), LF (10), VT (11), FF (12), CR (13), and space -(32), which are defined as white space in the "C" locale. This list may vary if -locale-specific matching is taking place. For example, in some locales the -"non-breaking space" character (\xA0) is recognized as white space, and in -others the VT character is not. -

      -

      -A "word" character is an underscore or any character that is a letter or digit. -By default, the definition of letters and digits is controlled by PCRE's -low-valued character tables, and may vary if locale-specific matching is taking -place (see -"Locale support" -in the -pcreapi -page). For example, in a French locale such as "fr_FR" in Unix-like systems, -or "french" in Windows, some character codes greater than 127 are used for -accented letters, and these are then matched by \w. The use of locales with -Unicode is discouraged. -

      -

      -By default, characters whose code points are greater than 127 never match \d, -\s, or \w, and always match \D, \S, and \W, although this may vary for -characters in the range 128-255 when locale-specific matching is happening. -These escape sequences retain their original meanings from before Unicode -support was available, mainly for efficiency reasons. If PCRE is compiled with -Unicode property support, and the PCRE_UCP option is set, the behaviour is -changed so that Unicode properties are used to determine character types, as -follows: -

      -  \d  any character that matches \p{Nd} (decimal digit)
      -  \s  any character that matches \p{Z} or \h or \v
      -  \w  any character that matches \p{L} or \p{N}, plus underscore
      -
      -The upper case escapes match the inverse sets of characters. Note that \d -matches only decimal digits, whereas \w matches any Unicode digit, as well as -any Unicode letter, and underscore. Note also that PCRE_UCP affects \b, and -\B because they are defined in terms of \w and \W. Matching these sequences -is noticeably slower when PCRE_UCP is set. -

      -

      -The sequences \h, \H, \v, and \V are features that were added to Perl at -release 5.10. In contrast to the other sequences, which match only ASCII -characters by default, these always match certain high-valued code points, -whether or not PCRE_UCP is set. The horizontal space characters are: -

      -  U+0009     Horizontal tab (HT)
      -  U+0020     Space
      -  U+00A0     Non-break space
      -  U+1680     Ogham space mark
      -  U+180E     Mongolian vowel separator
      -  U+2000     En quad
      -  U+2001     Em quad
      -  U+2002     En space
      -  U+2003     Em space
      -  U+2004     Three-per-em space
      -  U+2005     Four-per-em space
      -  U+2006     Six-per-em space
      -  U+2007     Figure space
      -  U+2008     Punctuation space
      -  U+2009     Thin space
      -  U+200A     Hair space
      -  U+202F     Narrow no-break space
      -  U+205F     Medium mathematical space
      -  U+3000     Ideographic space
      -
      -The vertical space characters are: -
      -  U+000A     Linefeed (LF)
      -  U+000B     Vertical tab (VT)
      -  U+000C     Form feed (FF)
      -  U+000D     Carriage return (CR)
      -  U+0085     Next line (NEL)
      -  U+2028     Line separator
      -  U+2029     Paragraph separator
      -
      -In 8-bit, non-UTF-8 mode, only the characters with codepoints less than 256 are -relevant. -

      -
      -Newline sequences -
      -

      -Outside a character class, by default, the escape sequence \R matches any -Unicode newline sequence. In 8-bit non-UTF-8 mode \R is equivalent to the -following: -

      -  (?>\r\n|\n|\x0b|\f|\r|\x85)
      -
      -This is an example of an "atomic group", details of which are given -below. -This particular group matches either the two-character sequence CR followed by -LF, or one of the single characters LF (linefeed, U+000A), VT (vertical tab, -U+000B), FF (form feed, U+000C), CR (carriage return, U+000D), or NEL (next -line, U+0085). The two-character sequence is treated as a single unit that -cannot be split. -

      -

      -In other modes, two additional characters whose codepoints are greater than 255 -are added: LS (line separator, U+2028) and PS (paragraph separator, U+2029). -Unicode character property support is not needed for these characters to be -recognized. -

      -

      -It is possible to restrict \R to match only CR, LF, or CRLF (instead of the -complete set of Unicode line endings) by setting the option PCRE_BSR_ANYCRLF -either at compile time or when the pattern is matched. (BSR is an abbrevation -for "backslash R".) This can be made the default when PCRE is built; if this is -the case, the other behaviour can be requested via the PCRE_BSR_UNICODE option. -It is also possible to specify these settings by starting a pattern string with -one of the following sequences: -

      -  (*BSR_ANYCRLF)   CR, LF, or CRLF only
      -  (*BSR_UNICODE)   any Unicode newline sequence
      -
      -These override the default and the options given to the compiling function, but -they can themselves be overridden by options given to a matching function. Note -that these special settings, which are not Perl-compatible, are recognized only -at the very start of a pattern, and that they must be in upper case. If more -than one of them is present, the last one is used. They can be combined with a -change of newline convention; for example, a pattern can start with: -
      -  (*ANY)(*BSR_ANYCRLF)
      -
      -They can also be combined with the (*UTF8), (*UTF16), (*UTF32), (*UTF) or -(*UCP) special sequences. Inside a character class, \R is treated as an -unrecognized escape sequence, and so matches the letter "R" by default, but -causes an error if PCRE_EXTRA is set. -

      -
      -Unicode character properties -
      -

      -When PCRE is built with Unicode character property support, three additional -escape sequences that match characters with specific properties are available. -When in 8-bit non-UTF-8 mode, these sequences are of course limited to testing -characters whose codepoints are less than 256, but they do work in this mode. -The extra escape sequences are: -

      -  \p{xx}   a character with the xx property
      -  \P{xx}   a character without the xx property
      -  \X       a Unicode extended grapheme cluster
      -
      -The property names represented by xx above are limited to the Unicode -script names, the general category properties, "Any", which matches any -character (including newline), and some special PCRE properties (described -in the -next section). -Other Perl properties such as "InMusicalSymbols" are not currently supported by -PCRE. Note that \P{Any} does not match any characters, so always causes a -match failure. -

      -

      -Sets of Unicode characters are defined as belonging to certain scripts. A -character from one of these sets can be matched using a script name. For -example: -

      -  \p{Greek}
      -  \P{Han}
      -
      -Those that are not part of an identified script are lumped together as -"Common". The current list of scripts is: -

      -

      -Arabic, -Armenian, -Avestan, -Balinese, -Bamum, -Bassa_Vah, -Batak, -Bengali, -Bopomofo, -Brahmi, -Braille, -Buginese, -Buhid, -Canadian_Aboriginal, -Carian, -Caucasian_Albanian, -Chakma, -Cham, -Cherokee, -Common, -Coptic, -Cuneiform, -Cypriot, -Cyrillic, -Deseret, -Devanagari, -Duployan, -Egyptian_Hieroglyphs, -Elbasan, -Ethiopic, -Georgian, -Glagolitic, -Gothic, -Grantha, -Greek, -Gujarati, -Gurmukhi, -Han, -Hangul, -Hanunoo, -Hebrew, -Hiragana, -Imperial_Aramaic, -Inherited, -Inscriptional_Pahlavi, -Inscriptional_Parthian, -Javanese, -Kaithi, -Kannada, -Katakana, -Kayah_Li, -Kharoshthi, -Khmer, -Khojki, -Khudawadi, -Lao, -Latin, -Lepcha, -Limbu, -Linear_A, -Linear_B, -Lisu, -Lycian, -Lydian, -Mahajani, -Malayalam, -Mandaic, -Manichaean, -Meetei_Mayek, -Mende_Kikakui, -Meroitic_Cursive, -Meroitic_Hieroglyphs, -Miao, -Modi, -Mongolian, -Mro, -Myanmar, -Nabataean, -New_Tai_Lue, -Nko, -Ogham, -Ol_Chiki, -Old_Italic, -Old_North_Arabian, -Old_Permic, -Old_Persian, -Old_South_Arabian, -Old_Turkic, -Oriya, -Osmanya, -Pahawh_Hmong, -Palmyrene, -Pau_Cin_Hau, -Phags_Pa, -Phoenician, -Psalter_Pahlavi, -Rejang, -Runic, -Samaritan, -Saurashtra, -Sharada, -Shavian, -Siddham, -Sinhala, -Sora_Sompeng, -Sundanese, -Syloti_Nagri, -Syriac, -Tagalog, -Tagbanwa, -Tai_Le, -Tai_Tham, -Tai_Viet, -Takri, -Tamil, -Telugu, -Thaana, -Thai, -Tibetan, -Tifinagh, -Tirhuta, -Ugaritic, -Vai, -Warang_Citi, -Yi. -

      -

      -Each character has exactly one Unicode general category property, specified by -a two-letter abbreviation. For compatibility with Perl, negation can be -specified by including a circumflex between the opening brace and the property -name. For example, \p{^Lu} is the same as \P{Lu}. -

      -

      -If only one letter is specified with \p or \P, it includes all the general -category properties that start with that letter. In this case, in the absence -of negation, the curly brackets in the escape sequence are optional; these two -examples have the same effect: -

      -  \p{L}
      -  \pL
      -
      -The following general category property codes are supported: -
      -  C     Other
      -  Cc    Control
      -  Cf    Format
      -  Cn    Unassigned
      -  Co    Private use
      -  Cs    Surrogate
      -
      -  L     Letter
      -  Ll    Lower case letter
      -  Lm    Modifier letter
      -  Lo    Other letter
      -  Lt    Title case letter
      -  Lu    Upper case letter
      -
      -  M     Mark
      -  Mc    Spacing mark
      -  Me    Enclosing mark
      -  Mn    Non-spacing mark
      -
      -  N     Number
      -  Nd    Decimal number
      -  Nl    Letter number
      -  No    Other number
      -
      -  P     Punctuation
      -  Pc    Connector punctuation
      -  Pd    Dash punctuation
      -  Pe    Close punctuation
      -  Pf    Final punctuation
      -  Pi    Initial punctuation
      -  Po    Other punctuation
      -  Ps    Open punctuation
      -
      -  S     Symbol
      -  Sc    Currency symbol
      -  Sk    Modifier symbol
      -  Sm    Mathematical symbol
      -  So    Other symbol
      -
      -  Z     Separator
      -  Zl    Line separator
      -  Zp    Paragraph separator
      -  Zs    Space separator
      -
      -The special property L& is also supported: it matches a character that has -the Lu, Ll, or Lt property, in other words, a letter that is not classified as -a modifier or "other". -

      -

      -The Cs (Surrogate) property applies only to characters in the range U+D800 to -U+DFFF. Such characters are not valid in Unicode strings and so -cannot be tested by PCRE, unless UTF validity checking has been turned off -(see the discussion of PCRE_NO_UTF8_CHECK, PCRE_NO_UTF16_CHECK and -PCRE_NO_UTF32_CHECK in the -pcreapi -page). Perl does not support the Cs property. -

      -

      -The long synonyms for property names that Perl supports (such as \p{Letter}) -are not supported by PCRE, nor is it permitted to prefix any of these -properties with "Is". -

      -

      -No character that is in the Unicode table has the Cn (unassigned) property. -Instead, this property is assumed for any code point that is not in the -Unicode table. -

      -

      -Specifying caseless matching does not affect these escape sequences. For -example, \p{Lu} always matches only upper case letters. This is different from -the behaviour of current versions of Perl. -

      -

      -Matching characters by Unicode property is not fast, because PCRE has to do a -multistage table lookup in order to find a character's property. That is why -the traditional escape sequences such as \d and \w do not use Unicode -properties in PCRE by default, though you can make them do so by setting the -PCRE_UCP option or by starting the pattern with (*UCP). -

      -
      -Extended grapheme clusters -
      -

      -The \X escape matches any number of Unicode characters that form an "extended -grapheme cluster", and treats the sequence as an atomic group -(see below). -Up to and including release 8.31, PCRE matched an earlier, simpler definition -that was equivalent to -

      -  (?>\PM\pM*)
      -
      -That is, it matched a character without the "mark" property, followed by zero -or more characters with the "mark" property. Characters with the "mark" -property are typically non-spacing accents that affect the preceding character. -

      -

      -This simple definition was extended in Unicode to include more complicated -kinds of composite character by giving each character a grapheme breaking -property, and creating rules that use these properties to define the boundaries -of extended grapheme clusters. In releases of PCRE later than 8.31, \X matches -one of these clusters. -

      -

      -\X always matches at least one character. Then it decides whether to add -additional characters according to the following rules for ending a cluster: -

      -

      -1. End at the end of the subject string. -

      -

      -2. Do not end between CR and LF; otherwise end after any control character. -

      -

      -3. Do not break Hangul (a Korean script) syllable sequences. Hangul characters -are of five types: L, V, T, LV, and LVT. An L character may be followed by an -L, V, LV, or LVT character; an LV or V character may be followed by a V or T -character; an LVT or T character may be follwed only by a T character. -

      -

      -4. Do not end before extending characters or spacing marks. Characters with -the "mark" property always have the "extend" grapheme breaking property. -

      -

      -5. Do not end after prepend characters. -

      -

      -6. Otherwise, end the cluster. -

      -
      -PCRE's additional properties -
      -

      -As well as the standard Unicode properties described above, PCRE supports four -more that make it possible to convert traditional escape sequences such as \w -and \s to use Unicode properties. PCRE uses these non-standard, non-Perl -properties internally when PCRE_UCP is set. However, they may also be used -explicitly. These properties are: -

      -  Xan   Any alphanumeric character
      -  Xps   Any POSIX space character
      -  Xsp   Any Perl space character
      -  Xwd   Any Perl "word" character
      -
      -Xan matches characters that have either the L (letter) or the N (number) -property. Xps matches the characters tab, linefeed, vertical tab, form feed, or -carriage return, and any other character that has the Z (separator) property. -Xsp is the same as Xps; it used to exclude vertical tab, for Perl -compatibility, but Perl changed, and so PCRE followed at release 8.34. Xwd -matches the same characters as Xan, plus underscore. -

      -

      -There is another non-standard property, Xuc, which matches any character that -can be represented by a Universal Character Name in C++ and other programming -languages. These are the characters $, @, ` (grave accent), and all characters -with Unicode code points greater than or equal to U+00A0, except for the -surrogates U+D800 to U+DFFF. Note that most base (ASCII) characters are -excluded. (Universal Character Names are of the form \uHHHH or \UHHHHHHHH -where H is a hexadecimal digit. Note that the Xuc property does not match these -sequences but the characters that they represent.) -

      -
      -Resetting the match start -
      -

      -The escape sequence \K causes any previously matched characters not to be -included in the final matched sequence. For example, the pattern: -

      -  foo\Kbar
      -
      -matches "foobar", but reports that it has matched "bar". This feature is -similar to a lookbehind assertion -(described below). -However, in this case, the part of the subject before the real match does not -have to be of fixed length, as lookbehind assertions do. The use of \K does -not interfere with the setting of -captured substrings. -For example, when the pattern -
      -  (foo)\Kbar
      -
      -matches "foobar", the first substring is still set to "foo". -

      -

      -Perl documents that the use of \K within assertions is "not well defined". In -PCRE, \K is acted upon when it occurs inside positive assertions, but is -ignored in negative assertions. Note that when a pattern such as (?=ab\K) -matches, the reported start of the match can be greater than the end of the -match. -

      -
      -Simple assertions -
      -

      -The final use of backslash is for certain simple assertions. An assertion -specifies a condition that has to be met at a particular point in a match, -without consuming any characters from the subject string. The use of -subpatterns for more complicated assertions is described -below. -The backslashed assertions are: -

      -  \b     matches at a word boundary
      -  \B     matches when not at a word boundary
      -  \A     matches at the start of the subject
      -  \Z     matches at the end of the subject
      -          also matches before a newline at the end of the subject
      -  \z     matches only at the end of the subject
      -  \G     matches at the first matching position in the subject
      -
      -Inside a character class, \b has a different meaning; it matches the backspace -character. If any other of these assertions appears in a character class, by -default it matches the corresponding literal character (for example, \B -matches the letter B). However, if the PCRE_EXTRA option is set, an "invalid -escape sequence" error is generated instead. -

      -

      -A word boundary is a position in the subject string where the current character -and the previous character do not both match \w or \W (i.e. one matches -\w and the other matches \W), or the start or end of the string if the -first or last character matches \w, respectively. In a UTF mode, the meanings -of \w and \W can be changed by setting the PCRE_UCP option. When this is -done, it also affects \b and \B. Neither PCRE nor Perl has a separate "start -of word" or "end of word" metasequence. However, whatever follows \b normally -determines which it is. For example, the fragment \ba matches "a" at the start -of a word. -

      -

      -The \A, \Z, and \z assertions differ from the traditional circumflex and -dollar (described in the next section) in that they only ever match at the very -start and end of the subject string, whatever options are set. Thus, they are -independent of multiline mode. These three assertions are not affected by the -PCRE_NOTBOL or PCRE_NOTEOL options, which affect only the behaviour of the -circumflex and dollar metacharacters. However, if the startoffset -argument of pcre_exec() is non-zero, indicating that matching is to start -at a point other than the beginning of the subject, \A can never match. The -difference between \Z and \z is that \Z matches before a newline at the end -of the string as well as at the very end, whereas \z matches only at the end. -

      -

      -The \G assertion is true only when the current matching position is at the -start point of the match, as specified by the startoffset argument of -pcre_exec(). It differs from \A when the value of startoffset is -non-zero. By calling pcre_exec() multiple times with appropriate -arguments, you can mimic Perl's /g option, and it is in this kind of -implementation where \G can be useful. -

      -

      -Note, however, that PCRE's interpretation of \G, as the start of the current -match, is subtly different from Perl's, which defines it as the end of the -previous match. In Perl, these can be different when the previously matched -string was empty. Because PCRE does just one match at a time, it cannot -reproduce this behaviour. -

      -

      -If all the alternatives of a pattern begin with \G, the expression is anchored -to the starting match position, and the "anchored" flag is set in the compiled -regular expression. -

      -
      CIRCUMFLEX AND DOLLAR
      -

      -The circumflex and dollar metacharacters are zero-width assertions. That is, -they test for a particular condition being true without consuming any -characters from the subject string. -

      -

      -Outside a character class, in the default matching mode, the circumflex -character is an assertion that is true only if the current matching point is at -the start of the subject string. If the startoffset argument of -pcre_exec() is non-zero, circumflex can never match if the PCRE_MULTILINE -option is unset. Inside a character class, circumflex has an entirely different -meaning -(see below). -

      -

      -Circumflex need not be the first character of the pattern if a number of -alternatives are involved, but it should be the first thing in each alternative -in which it appears if the pattern is ever to match that branch. If all -possible alternatives start with a circumflex, that is, if the pattern is -constrained to match only at the start of the subject, it is said to be an -"anchored" pattern. (There are also other constructs that can cause a pattern -to be anchored.) -

      -

      -The dollar character is an assertion that is true only if the current matching -point is at the end of the subject string, or immediately before a newline at -the end of the string (by default). Note, however, that it does not actually -match the newline. Dollar need not be the last character of the pattern if a -number of alternatives are involved, but it should be the last item in any -branch in which it appears. Dollar has no special meaning in a character class. -

      -

      -The meaning of dollar can be changed so that it matches only at the very end of -the string, by setting the PCRE_DOLLAR_ENDONLY option at compile time. This -does not affect the \Z assertion. -

      -

      -The meanings of the circumflex and dollar characters are changed if the -PCRE_MULTILINE option is set. When this is the case, a circumflex matches -immediately after internal newlines as well as at the start of the subject -string. It does not match after a newline that ends the string. A dollar -matches before any newlines in the string, as well as at the very end, when -PCRE_MULTILINE is set. When newline is specified as the two-character -sequence CRLF, isolated CR and LF characters do not indicate newlines. -

      -

      -For example, the pattern /^abc$/ matches the subject string "def\nabc" (where -\n represents a newline) in multiline mode, but not otherwise. Consequently, -patterns that are anchored in single line mode because all branches start with -^ are not anchored in multiline mode, and a match for circumflex is possible -when the startoffset argument of pcre_exec() is non-zero. The -PCRE_DOLLAR_ENDONLY option is ignored if PCRE_MULTILINE is set. -

      -

      -Note that the sequences \A, \Z, and \z can be used to match the start and -end of the subject in both modes, and if all branches of a pattern start with -\A it is always anchored, whether or not PCRE_MULTILINE is set. -

      -
      FULL STOP (PERIOD, DOT) AND \N
      -

      -Outside a character class, a dot in the pattern matches any one character in -the subject string except (by default) a character that signifies the end of a -line. -

      -

      -When a line ending is defined as a single character, dot never matches that -character; when the two-character sequence CRLF is used, dot does not match CR -if it is immediately followed by LF, but otherwise it matches all characters -(including isolated CRs and LFs). When any Unicode line endings are being -recognized, dot does not match CR or LF or any of the other line ending -characters. -

      -

      -The behaviour of dot with regard to newlines can be changed. If the PCRE_DOTALL -option is set, a dot matches any one character, without exception. If the -two-character sequence CRLF is present in the subject string, it takes two dots -to match it. -

      -

      -The handling of dot is entirely independent of the handling of circumflex and -dollar, the only relationship being that they both involve newlines. Dot has no -special meaning in a character class. -

      -

      -The escape sequence \N behaves like a dot, except that it is not affected by -the PCRE_DOTALL option. In other words, it matches any character except one -that signifies the end of a line. Perl also uses \N to match characters by -name; PCRE does not support this. -

      -
      MATCHING A SINGLE DATA UNIT
      -

      -Outside a character class, the escape sequence \C matches any one data unit, -whether or not a UTF mode is set. In the 8-bit library, one data unit is one -byte; in the 16-bit library it is a 16-bit unit; in the 32-bit library it is -a 32-bit unit. Unlike a dot, \C always -matches line-ending characters. The feature is provided in Perl in order to -match individual bytes in UTF-8 mode, but it is unclear how it can usefully be -used. Because \C breaks up characters into individual data units, matching one -unit with \C in a UTF mode means that the rest of the string may start with a -malformed UTF character. This has undefined results, because PCRE assumes that -it is dealing with valid UTF strings (and by default it checks this at the -start of processing unless the PCRE_NO_UTF8_CHECK, PCRE_NO_UTF16_CHECK or -PCRE_NO_UTF32_CHECK option is used). -

      -

      -PCRE does not allow \C to appear in lookbehind assertions -(described below) -in a UTF mode, because this would make it impossible to calculate the length of -the lookbehind. -

      -

      -In general, the \C escape sequence is best avoided. However, one -way of using it that avoids the problem of malformed UTF characters is to use a -lookahead to check the length of the next character, as in this pattern, which -could be used with a UTF-8 string (ignore white space and line breaks): -

      -  (?| (?=[\x00-\x7f])(\C) |
      -      (?=[\x80-\x{7ff}])(\C)(\C) |
      -      (?=[\x{800}-\x{ffff}])(\C)(\C)(\C) |
      -      (?=[\x{10000}-\x{1fffff}])(\C)(\C)(\C)(\C))
      -
      -A group that starts with (?| resets the capturing parentheses numbers in each -alternative (see -"Duplicate Subpattern Numbers" -below). The assertions at the start of each branch check the next UTF-8 -character for values whose encoding uses 1, 2, 3, or 4 bytes, respectively. The -character's individual bytes are then captured by the appropriate number of -groups. -

      -
      SQUARE BRACKETS AND CHARACTER CLASSES
      -

      -An opening square bracket introduces a character class, terminated by a closing -square bracket. A closing square bracket on its own is not special by default. -However, if the PCRE_JAVASCRIPT_COMPAT option is set, a lone closing square -bracket causes a compile-time error. If a closing square bracket is required as -a member of the class, it should be the first data character in the class -(after an initial circumflex, if present) or escaped with a backslash. -

      -

      -A character class matches a single character in the subject. In a UTF mode, the -character may be more than one data unit long. A matched character must be in -the set of characters defined by the class, unless the first character in the -class definition is a circumflex, in which case the subject character must not -be in the set defined by the class. If a circumflex is actually required as a -member of the class, ensure it is not the first character, or escape it with a -backslash. -

      -

      -For example, the character class [aeiou] matches any lower case vowel, while -[^aeiou] matches any character that is not a lower case vowel. Note that a -circumflex is just a convenient notation for specifying the characters that -are in the class by enumerating those that are not. A class that starts with a -circumflex is not an assertion; it still consumes a character from the subject -string, and therefore it fails if the current pointer is at the end of the -string. -

      -

      -In UTF-8 (UTF-16, UTF-32) mode, characters with values greater than 255 (0xffff) -can be included in a class as a literal string of data units, or by using the -\x{ escaping mechanism. -

      -

      -When caseless matching is set, any letters in a class represent both their -upper case and lower case versions, so for example, a caseless [aeiou] matches -"A" as well as "a", and a caseless [^aeiou] does not match "A", whereas a -caseful version would. In a UTF mode, PCRE always understands the concept of -case for characters whose values are less than 128, so caseless matching is -always possible. For characters with higher values, the concept of case is -supported if PCRE is compiled with Unicode property support, but not otherwise. -If you want to use caseless matching in a UTF mode for characters 128 and -above, you must ensure that PCRE is compiled with Unicode property support as -well as with UTF support. -

      -

      -Characters that might indicate line breaks are never treated in any special way -when matching character classes, whatever line-ending sequence is in use, and -whatever setting of the PCRE_DOTALL and PCRE_MULTILINE options is used. A class -such as [^a] always matches one of these characters. -

      -

      -The minus (hyphen) character can be used to specify a range of characters in a -character class. For example, [d-m] matches any letter between d and m, -inclusive. If a minus character is required in a class, it must be escaped with -a backslash or appear in a position where it cannot be interpreted as -indicating a range, typically as the first or last character in the class, or -immediately after a range. For example, [b-d-z] matches letters in the range b -to d, a hyphen character, or z. -

      -

      -It is not possible to have the literal character "]" as the end character of a -range. A pattern such as [W-]46] is interpreted as a class of two characters -("W" and "-") followed by a literal string "46]", so it would match "W46]" or -"-46]". However, if the "]" is escaped with a backslash it is interpreted as -the end of range, so [W-\]46] is interpreted as a class containing a range -followed by two other characters. The octal or hexadecimal representation of -"]" can also be used to end a range. -

      -

      -An error is generated if a POSIX character class (see below) or an escape -sequence other than one that defines a single character appears at a point -where a range ending character is expected. For example, [z-\xff] is valid, -but [A-\d] and [A-[:digit:]] are not. -

      -

      -Ranges operate in the collating sequence of character values. They can also be -used for characters specified numerically, for example [\000-\037]. Ranges -can include any characters that are valid for the current mode. -

      -

      -If a range that includes letters is used when caseless matching is set, it -matches the letters in either case. For example, [W-c] is equivalent to -[][\\^_`wxyzabc], matched caselessly, and in a non-UTF mode, if character -tables for a French locale are in use, [\xc8-\xcb] matches accented E -characters in both cases. In UTF modes, PCRE supports the concept of case for -characters with values greater than 128 only when it is compiled with Unicode -property support. -

      -

      -The character escape sequences \d, \D, \h, \H, \p, \P, \s, \S, \v, -\V, \w, and \W may appear in a character class, and add the characters that -they match to the class. For example, [\dABCDEF] matches any hexadecimal -digit. In UTF modes, the PCRE_UCP option affects the meanings of \d, \s, \w -and their upper case partners, just as it does when they appear outside a -character class, as described in the section entitled -"Generic character types" -above. The escape sequence \b has a different meaning inside a character -class; it matches the backspace character. The sequences \B, \N, \R, and \X -are not special inside a character class. Like any other unrecognized escape -sequences, they are treated as the literal characters "B", "N", "R", and "X" by -default, but cause an error if the PCRE_EXTRA option is set. -

      -

      -A circumflex can conveniently be used with the upper case character types to -specify a more restricted set of characters than the matching lower case type. -For example, the class [^\W_] matches any letter or digit, but not underscore, -whereas [\w] includes underscore. A positive character class should be read as -"something OR something OR ..." and a negative class as "NOT something AND NOT -something AND NOT ...". -

      -

      -The only metacharacters that are recognized in character classes are backslash, -hyphen (only where it can be interpreted as specifying a range), circumflex -(only at the start), opening square bracket (only when it can be interpreted as -introducing a POSIX class name, or for a special compatibility feature - see -the next two sections), and the terminating closing square bracket. However, -escaping other non-alphanumeric characters does no harm. -

      -
      POSIX CHARACTER CLASSES
      -

      -Perl supports the POSIX notation for character classes. This uses names -enclosed by [: and :] within the enclosing square brackets. PCRE also supports -this notation. For example, -

      -  [01[:alpha:]%]
      -
      -matches "0", "1", any alphabetic character, or "%". The supported class names -are: -
      -  alnum    letters and digits
      -  alpha    letters
      -  ascii    character codes 0 - 127
      -  blank    space or tab only
      -  cntrl    control characters
      -  digit    decimal digits (same as \d)
      -  graph    printing characters, excluding space
      -  lower    lower case letters
      -  print    printing characters, including space
      -  punct    printing characters, excluding letters and digits and space
      -  space    white space (the same as \s from PCRE 8.34)
      -  upper    upper case letters
      -  word     "word" characters (same as \w)
      -  xdigit   hexadecimal digits
      -
      -The default "space" characters are HT (9), LF (10), VT (11), FF (12), CR (13), -and space (32). If locale-specific matching is taking place, the list of space -characters may be different; there may be fewer or more of them. "Space" used -to be different to \s, which did not include VT, for Perl compatibility. -However, Perl changed at release 5.18, and PCRE followed at release 8.34. -"Space" and \s now match the same set of characters. -

      -

      -The name "word" is a Perl extension, and "blank" is a GNU extension from Perl -5.8. Another Perl extension is negation, which is indicated by a ^ character -after the colon. For example, -

      -  [12[:^digit:]]
      -
      -matches "1", "2", or any non-digit. PCRE (and Perl) also recognize the POSIX -syntax [.ch.] and [=ch=] where "ch" is a "collating element", but these are not -supported, and an error is given if they are encountered. -

      -

      -By default, characters with values greater than 128 do not match any of the -POSIX character classes. However, if the PCRE_UCP option is passed to -pcre_compile(), some of the classes are changed so that Unicode character -properties are used. This is achieved by replacing certain POSIX classes by -other sequences, as follows: -

      -  [:alnum:]  becomes  \p{Xan}
      -  [:alpha:]  becomes  \p{L}
      -  [:blank:]  becomes  \h
      -  [:digit:]  becomes  \p{Nd}
      -  [:lower:]  becomes  \p{Ll}
      -  [:space:]  becomes  \p{Xps}
      -  [:upper:]  becomes  \p{Lu}
      -  [:word:]   becomes  \p{Xwd}
      -
      -Negated versions, such as [:^alpha:] use \P instead of \p. Three other POSIX -classes are handled specially in UCP mode: -

      -

      -[:graph:] -This matches characters that have glyphs that mark the page when printed. In -Unicode property terms, it matches all characters with the L, M, N, P, S, or Cf -properties, except for: -

      -  U+061C           Arabic Letter Mark
      -  U+180E           Mongolian Vowel Separator
      -  U+2066 - U+2069  Various "isolate"s
      -
      -
      -

      -

      -[:print:] -This matches the same characters as [:graph:] plus space characters that are -not controls, that is, characters with the Zs property. -

      -

      -[:punct:] -This matches all characters that have the Unicode P (punctuation) property, -plus those characters whose code points are less than 128 that have the S -(Symbol) property. -

      -

      -The other POSIX classes are unchanged, and match only characters with code -points less than 128. -

      -
      COMPATIBILITY FEATURE FOR WORD BOUNDARIES
      -

      -In the POSIX.2 compliant library that was included in 4.4BSD Unix, the ugly -syntax [[:<:]] and [[:>:]] is used for matching "start of word" and "end of -word". PCRE treats these items as follows: -

      -  [[:<:]]  is converted to  \b(?=\w)
      -  [[:>:]]  is converted to  \b(?<=\w)
      -
      -Only these exact character sequences are recognized. A sequence such as -[a[:<:]b] provokes error for an unrecognized POSIX class name. This support is -not compatible with Perl. It is provided to help migrations from other -environments, and is best not used in any new patterns. Note that \b matches -at the start and the end of a word (see -"Simple assertions" -above), and in a Perl-style pattern the preceding or following character -normally shows which is wanted, without the need for the assertions that are -used above in order to give exactly the POSIX behaviour. -

      -
      VERTICAL BAR
      -

      -Vertical bar characters are used to separate alternative patterns. For example, -the pattern -

      -  gilbert|sullivan
      -
      -matches either "gilbert" or "sullivan". Any number of alternatives may appear, -and an empty alternative is permitted (matching the empty string). The matching -process tries each alternative in turn, from left to right, and the first one -that succeeds is used. If the alternatives are within a subpattern -(defined below), -"succeeds" means matching the rest of the main pattern as well as the -alternative in the subpattern. -

      -
      INTERNAL OPTION SETTING
      -

      -The settings of the PCRE_CASELESS, PCRE_MULTILINE, PCRE_DOTALL, and -PCRE_EXTENDED options (which are Perl-compatible) can be changed from within -the pattern by a sequence of Perl option letters enclosed between "(?" and ")". -The option letters are -

      -  i  for PCRE_CASELESS
      -  m  for PCRE_MULTILINE
      -  s  for PCRE_DOTALL
      -  x  for PCRE_EXTENDED
      -
      -For example, (?im) sets caseless, multiline matching. It is also possible to -unset these options by preceding the letter with a hyphen, and a combined -setting and unsetting such as (?im-sx), which sets PCRE_CASELESS and -PCRE_MULTILINE while unsetting PCRE_DOTALL and PCRE_EXTENDED, is also -permitted. If a letter appears both before and after the hyphen, the option is -unset. -

      -

      -The PCRE-specific options PCRE_DUPNAMES, PCRE_UNGREEDY, and PCRE_EXTRA can be -changed in the same way as the Perl-compatible options by using the characters -J, U and X respectively. -

      -

      -When one of these option changes occurs at top level (that is, not inside -subpattern parentheses), the change applies to the remainder of the pattern -that follows. An option change within a subpattern (see below for a description -of subpatterns) affects only that part of the subpattern that follows it, so -

      -  (a(?i)b)c
      -
      -matches abc and aBc and no other strings (assuming PCRE_CASELESS is not used). -By this means, options can be made to have different settings in different -parts of the pattern. Any changes made in one alternative do carry on -into subsequent branches within the same subpattern. For example, -
      -  (a(?i)b|c)
      -
      -matches "ab", "aB", "c", and "C", even though when matching "C" the first -branch is abandoned before the option setting. This is because the effects of -option settings happen at compile time. There would be some very weird -behaviour otherwise. -

      -

      -Note: There are other PCRE-specific options that can be set by the -application when the compiling or matching functions are called. In some cases -the pattern can contain special leading sequences such as (*CRLF) to override -what the application has set or what has been defaulted. Details are given in -the section entitled -"Newline sequences" -above. There are also the (*UTF8), (*UTF16),(*UTF32), and (*UCP) leading -sequences that can be used to set UTF and Unicode property modes; they are -equivalent to setting the PCRE_UTF8, PCRE_UTF16, PCRE_UTF32 and the PCRE_UCP -options, respectively. The (*UTF) sequence is a generic version that can be -used with any of the libraries. However, the application can set the -PCRE_NEVER_UTF option, which locks out the use of the (*UTF) sequences. -

      -
      SUBPATTERNS
      -

      -Subpatterns are delimited by parentheses (round brackets), which can be nested. -Turning part of a pattern into a subpattern does two things: -
      -
      -1. It localizes a set of alternatives. For example, the pattern -

      -  cat(aract|erpillar|)
      -
      -matches "cataract", "caterpillar", or "cat". Without the parentheses, it would -match "cataract", "erpillar" or an empty string. -
      -
      -2. It sets up the subpattern as a capturing subpattern. This means that, when -the whole pattern matches, that portion of the subject string that matched the -subpattern is passed back to the caller via the ovector argument of the -matching function. (This applies only to the traditional matching functions; -the DFA matching functions do not support capturing.) -

      -

      -Opening parentheses are counted from left to right (starting from 1) to obtain -numbers for the capturing subpatterns. For example, if the string "the red -king" is matched against the pattern -

      -  the ((red|white) (king|queen))
      -
      -the captured substrings are "red king", "red", and "king", and are numbered 1, -2, and 3, respectively. -

      -

      -The fact that plain parentheses fulfil two functions is not always helpful. -There are often times when a grouping subpattern is required without a -capturing requirement. If an opening parenthesis is followed by a question mark -and a colon, the subpattern does not do any capturing, and is not counted when -computing the number of any subsequent capturing subpatterns. For example, if -the string "the white queen" is matched against the pattern -

      -  the ((?:red|white) (king|queen))
      -
      -the captured substrings are "white queen" and "queen", and are numbered 1 and -2. The maximum number of capturing subpatterns is 65535. -

      -

      -As a convenient shorthand, if any option settings are required at the start of -a non-capturing subpattern, the option letters may appear between the "?" and -the ":". Thus the two patterns -

      -  (?i:saturday|sunday)
      -  (?:(?i)saturday|sunday)
      -
      -match exactly the same set of strings. Because alternative branches are tried -from left to right, and options are not reset until the end of the subpattern -is reached, an option setting in one branch does affect subsequent branches, so -the above patterns match "SUNDAY" as well as "Saturday". -

      -
      DUPLICATE SUBPATTERN NUMBERS
      -

      -Perl 5.10 introduced a feature whereby each alternative in a subpattern uses -the same numbers for its capturing parentheses. Such a subpattern starts with -(?| and is itself a non-capturing subpattern. For example, consider this -pattern: -

      -  (?|(Sat)ur|(Sun))day
      -
      -Because the two alternatives are inside a (?| group, both sets of capturing -parentheses are numbered one. Thus, when the pattern matches, you can look -at captured substring number one, whichever alternative matched. This construct -is useful when you want to capture part, but not all, of one of a number of -alternatives. Inside a (?| group, parentheses are numbered as usual, but the -number is reset at the start of each branch. The numbers of any capturing -parentheses that follow the subpattern start after the highest number used in -any branch. The following example is taken from the Perl documentation. The -numbers underneath show in which buffer the captured content will be stored. -
      -  # before  ---------------branch-reset----------- after
      -  / ( a )  (?| x ( y ) z | (p (q) r) | (t) u (v) ) ( z ) /x
      -  # 1            2         2  3        2     3     4
      -
      -A back reference to a numbered subpattern uses the most recent value that is -set for that number by any subpattern. The following pattern matches "abcabc" -or "defdef": -
      -  /(?|(abc)|(def))\1/
      -
      -In contrast, a subroutine call to a numbered subpattern always refers to the -first one in the pattern with the given number. The following pattern matches -"abcabc" or "defabc": -
      -  /(?|(abc)|(def))(?1)/
      -
      -If a -condition test -for a subpattern's having matched refers to a non-unique number, the test is -true if any of the subpatterns of that number have matched. -

      -

      -An alternative approach to using this "branch reset" feature is to use -duplicate named subpatterns, as described in the next section. -

      -
      NAMED SUBPATTERNS
      -

      -Identifying capturing parentheses by number is simple, but it can be very hard -to keep track of the numbers in complicated regular expressions. Furthermore, -if an expression is modified, the numbers may change. To help with this -difficulty, PCRE supports the naming of subpatterns. This feature was not -added to Perl until release 5.10. Python had the feature earlier, and PCRE -introduced it at release 4.0, using the Python syntax. PCRE now supports both -the Perl and the Python syntax. Perl allows identically numbered subpatterns to -have different names, but PCRE does not. -

      -

      -In PCRE, a subpattern can be named in one of three ways: (?<name>...) or -(?'name'...) as in Perl, or (?P<name>...) as in Python. References to capturing -parentheses from other parts of the pattern, such as -back references, -recursion, -and -conditions, -can be made by name as well as by number. -

      -

      -Names consist of up to 32 alphanumeric characters and underscores, but must -start with a non-digit. Named capturing parentheses are still allocated numbers -as well as names, exactly as if the names were not present. The PCRE API -provides function calls for extracting the name-to-number translation table -from a compiled pattern. There is also a convenience function for extracting a -captured substring by name. -

      -

      -By default, a name must be unique within a pattern, but it is possible to relax -this constraint by setting the PCRE_DUPNAMES option at compile time. (Duplicate -names are also always permitted for subpatterns with the same number, set up as -described in the previous section.) Duplicate names can be useful for patterns -where only one instance of the named parentheses can match. Suppose you want to -match the name of a weekday, either as a 3-letter abbreviation or as the full -name, and in both cases you want to extract the abbreviation. This pattern -(ignoring the line breaks) does the job: -

      -  (?<DN>Mon|Fri|Sun)(?:day)?|
      -  (?<DN>Tue)(?:sday)?|
      -  (?<DN>Wed)(?:nesday)?|
      -  (?<DN>Thu)(?:rsday)?|
      -  (?<DN>Sat)(?:urday)?
      -
      -There are five capturing substrings, but only one is ever set after a match. -(An alternative way of solving this problem is to use a "branch reset" -subpattern, as described in the previous section.) -

      -

      -The convenience function for extracting the data by name returns the substring -for the first (and in this example, the only) subpattern of that name that -matched. This saves searching to find which numbered subpattern it was. -

      -

      -If you make a back reference to a non-unique named subpattern from elsewhere in -the pattern, the subpatterns to which the name refers are checked in the order -in which they appear in the overall pattern. The first one that is set is used -for the reference. For example, this pattern matches both "foofoo" and -"barbar" but not "foobar" or "barfoo": -

      -  (?:(?<n>foo)|(?<n>bar))\k<n>
      -
      -
      -

      -

      -If you make a subroutine call to a non-unique named subpattern, the one that -corresponds to the first occurrence of the name is used. In the absence of -duplicate numbers (see the previous section) this is the one with the lowest -number. -

      -

      -If you use a named reference in a condition -test (see the -section about conditions -below), either to check whether a subpattern has matched, or to check for -recursion, all subpatterns with the same name are tested. If the condition is -true for any one of them, the overall condition is true. This is the same -behaviour as testing by number. For further details of the interfaces for -handling named subpatterns, see the -pcreapi -documentation. -

      -

      -Warning: You cannot use different names to distinguish between two -subpatterns with the same number because PCRE uses only the numbers when -matching. For this reason, an error is given at compile time if different names -are given to subpatterns with the same number. However, you can always give the -same name to subpatterns with the same number, even when PCRE_DUPNAMES is not -set. -

      -
      REPETITION
      -

      -Repetition is specified by quantifiers, which can follow any of the following -items: -

      -  a literal data character
      -  the dot metacharacter
      -  the \C escape sequence
      -  the \X escape sequence
      -  the \R escape sequence
      -  an escape such as \d or \pL that matches a single character
      -  a character class
      -  a back reference (see next section)
      -  a parenthesized subpattern (including assertions)
      -  a subroutine call to a subpattern (recursive or otherwise)
      -
      -The general repetition quantifier specifies a minimum and maximum number of -permitted matches, by giving the two numbers in curly brackets (braces), -separated by a comma. The numbers must be less than 65536, and the first must -be less than or equal to the second. For example: -
      -  z{2,4}
      -
      -matches "zz", "zzz", or "zzzz". A closing brace on its own is not a special -character. If the second number is omitted, but the comma is present, there is -no upper limit; if the second number and the comma are both omitted, the -quantifier specifies an exact number of required matches. Thus -
      -  [aeiou]{3,}
      -
      -matches at least 3 successive vowels, but may match many more, while -
      -  \d{8}
      -
      -matches exactly 8 digits. An opening curly bracket that appears in a position -where a quantifier is not allowed, or one that does not match the syntax of a -quantifier, is taken as a literal character. For example, {,6} is not a -quantifier, but a literal string of four characters. -

      -

      -In UTF modes, quantifiers apply to characters rather than to individual data -units. Thus, for example, \x{100}{2} matches two characters, each of -which is represented by a two-byte sequence in a UTF-8 string. Similarly, -\X{3} matches three Unicode extended grapheme clusters, each of which may be -several data units long (and they may be of different lengths). -

      -

      -The quantifier {0} is permitted, causing the expression to behave as if the -previous item and the quantifier were not present. This may be useful for -subpatterns that are referenced as -subroutines -from elsewhere in the pattern (but see also the section entitled -"Defining subpatterns for use by reference only" -below). Items other than subpatterns that have a {0} quantifier are omitted -from the compiled pattern. -

      -

      -For convenience, the three most common quantifiers have single-character -abbreviations: -

      -  *    is equivalent to {0,}
      -  +    is equivalent to {1,}
      -  ?    is equivalent to {0,1}
      -
      -It is possible to construct infinite loops by following a subpattern that can -match no characters with a quantifier that has no upper limit, for example: -
      -  (a?)*
      -
      -Earlier versions of Perl and PCRE used to give an error at compile time for -such patterns. However, because there are cases where this can be useful, such -patterns are now accepted, but if any repetition of the subpattern does in fact -match no characters, the loop is forcibly broken. -

      -

      -By default, the quantifiers are "greedy", that is, they match as much as -possible (up to the maximum number of permitted times), without causing the -rest of the pattern to fail. The classic example of where this gives problems -is in trying to match comments in C programs. These appear between /* and */ -and within the comment, individual * and / characters may appear. An attempt to -match C comments by applying the pattern -

      -  /\*.*\*/
      -
      -to the string -
      -  /* first comment */  not comment  /* second comment */
      -
      -fails, because it matches the entire string owing to the greediness of the .* -item. -

      -

      -However, if a quantifier is followed by a question mark, it ceases to be -greedy, and instead matches the minimum number of times possible, so the -pattern -

      -  /\*.*?\*/
      -
      -does the right thing with the C comments. The meaning of the various -quantifiers is not otherwise changed, just the preferred number of matches. -Do not confuse this use of question mark with its use as a quantifier in its -own right. Because it has two uses, it can sometimes appear doubled, as in -
      -  \d??\d
      -
      -which matches one digit by preference, but can match two if that is the only -way the rest of the pattern matches. -

      -

      -If the PCRE_UNGREEDY option is set (an option that is not available in Perl), -the quantifiers are not greedy by default, but individual ones can be made -greedy by following them with a question mark. In other words, it inverts the -default behaviour. -

      -

      -When a parenthesized subpattern is quantified with a minimum repeat count that -is greater than 1 or with a limited maximum, more memory is required for the -compiled pattern, in proportion to the size of the minimum or maximum. -

      -

      -If a pattern starts with .* or .{0,} and the PCRE_DOTALL option (equivalent -to Perl's /s) is set, thus allowing the dot to match newlines, the pattern is -implicitly anchored, because whatever follows will be tried against every -character position in the subject string, so there is no point in retrying the -overall match at any position after the first. PCRE normally treats such a -pattern as though it were preceded by \A. -

      -

      -In cases where it is known that the subject string contains no newlines, it is -worth setting PCRE_DOTALL in order to obtain this optimization, or -alternatively using ^ to indicate anchoring explicitly. -

      -

      -However, there are some cases where the optimization cannot be used. When .* -is inside capturing parentheses that are the subject of a back reference -elsewhere in the pattern, a match at the start may fail where a later one -succeeds. Consider, for example: -

      -  (.*)abc\1
      -
      -If the subject is "xyz123abc123" the match point is the fourth character. For -this reason, such a pattern is not implicitly anchored. -

      -

      -Another case where implicit anchoring is not applied is when the leading .* is -inside an atomic group. Once again, a match at the start may fail where a later -one succeeds. Consider this pattern: -

      -  (?>.*?a)b
      -
      -It matches "ab" in the subject "aab". The use of the backtracking control verbs -(*PRUNE) and (*SKIP) also disable this optimization. -

      -

      -When a capturing subpattern is repeated, the value captured is the substring -that matched the final iteration. For example, after -

      -  (tweedle[dume]{3}\s*)+
      -
      -has matched "tweedledum tweedledee" the value of the captured substring is -"tweedledee". However, if there are nested capturing subpatterns, the -corresponding captured values may have been set in previous iterations. For -example, after -
      -  /(a|(b))+/
      -
      -matches "aba" the value of the second captured substring is "b". -

      -
      ATOMIC GROUPING AND POSSESSIVE QUANTIFIERS
      -

      -With both maximizing ("greedy") and minimizing ("ungreedy" or "lazy") -repetition, failure of what follows normally causes the repeated item to be -re-evaluated to see if a different number of repeats allows the rest of the -pattern to match. Sometimes it is useful to prevent this, either to change the -nature of the match, or to cause it fail earlier than it otherwise might, when -the author of the pattern knows there is no point in carrying on. -

      -

      -Consider, for example, the pattern \d+foo when applied to the subject line -

      -  123456bar
      -
      -After matching all 6 digits and then failing to match "foo", the normal -action of the matcher is to try again with only 5 digits matching the \d+ -item, and then with 4, and so on, before ultimately failing. "Atomic grouping" -(a term taken from Jeffrey Friedl's book) provides the means for specifying -that once a subpattern has matched, it is not to be re-evaluated in this way. -

      -

      -If we use atomic grouping for the previous example, the matcher gives up -immediately on failing to match "foo" the first time. The notation is a kind of -special parenthesis, starting with (?> as in this example: -

      -  (?>\d+)foo
      -
      -This kind of parenthesis "locks up" the part of the pattern it contains once -it has matched, and a failure further into the pattern is prevented from -backtracking into it. Backtracking past it to previous items, however, works as -normal. -

      -

      -An alternative description is that a subpattern of this type matches the string -of characters that an identical standalone pattern would match, if anchored at -the current point in the subject string. -

      -

      -Atomic grouping subpatterns are not capturing subpatterns. Simple cases such as -the above example can be thought of as a maximizing repeat that must swallow -everything it can. So, while both \d+ and \d+? are prepared to adjust the -number of digits they match in order to make the rest of the pattern match, -(?>\d+) can only match an entire sequence of digits. -

      -

      -Atomic groups in general can of course contain arbitrarily complicated -subpatterns, and can be nested. However, when the subpattern for an atomic -group is just a single repeated item, as in the example above, a simpler -notation, called a "possessive quantifier" can be used. This consists of an -additional + character following a quantifier. Using this notation, the -previous example can be rewritten as -

      -  \d++foo
      -
      -Note that a possessive quantifier can be used with an entire group, for -example: -
      -  (abc|xyz){2,3}+
      -
      -Possessive quantifiers are always greedy; the setting of the PCRE_UNGREEDY -option is ignored. They are a convenient notation for the simpler forms of -atomic group. However, there is no difference in the meaning of a possessive -quantifier and the equivalent atomic group, though there may be a performance -difference; possessive quantifiers should be slightly faster. -

      -

      -The possessive quantifier syntax is an extension to the Perl 5.8 syntax. -Jeffrey Friedl originated the idea (and the name) in the first edition of his -book. Mike McCloskey liked it, so implemented it when he built Sun's Java -package, and PCRE copied it from there. It ultimately found its way into Perl -at release 5.10. -

      -

      -PCRE has an optimization that automatically "possessifies" certain simple -pattern constructs. For example, the sequence A+B is treated as A++B because -there is no point in backtracking into a sequence of A's when B must follow. -

      -

      -When a pattern contains an unlimited repeat inside a subpattern that can itself -be repeated an unlimited number of times, the use of an atomic group is the -only way to avoid some failing matches taking a very long time indeed. The -pattern -

      -  (\D+|<\d+>)*[!?]
      -
      -matches an unlimited number of substrings that either consist of non-digits, or -digits enclosed in <>, followed by either ! or ?. When it matches, it runs -quickly. However, if it is applied to -
      -  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
      -
      -it takes a long time before reporting failure. This is because the string can -be divided between the internal \D+ repeat and the external * repeat in a -large number of ways, and all have to be tried. (The example uses [!?] rather -than a single character at the end, because both PCRE and Perl have an -optimization that allows for fast failure when a single character is used. They -remember the last single character that is required for a match, and fail early -if it is not present in the string.) If the pattern is changed so that it uses -an atomic group, like this: -
      -  ((?>\D+)|<\d+>)*[!?]
      -
      -sequences of non-digits cannot be broken, and failure happens quickly. -

      -
      BACK REFERENCES
      -

      -Outside a character class, a backslash followed by a digit greater than 0 (and -possibly further digits) is a back reference to a capturing subpattern earlier -(that is, to its left) in the pattern, provided there have been that many -previous capturing left parentheses. -

      -

      -However, if the decimal number following the backslash is less than 10, it is -always taken as a back reference, and causes an error only if there are not -that many capturing left parentheses in the entire pattern. In other words, the -parentheses that are referenced need not be to the left of the reference for -numbers less than 10. A "forward back reference" of this type can make sense -when a repetition is involved and the subpattern to the right has participated -in an earlier iteration. -

      -

      -It is not possible to have a numerical "forward back reference" to a subpattern -whose number is 10 or more using this syntax because a sequence such as \50 is -interpreted as a character defined in octal. See the subsection entitled -"Non-printing characters" -above -for further details of the handling of digits following a backslash. There is -no such problem when named parentheses are used. A back reference to any -subpattern is possible using named parentheses (see below). -

      -

      -Another way of avoiding the ambiguity inherent in the use of digits following a -backslash is to use the \g escape sequence. This escape must be followed by an -unsigned number or a negative number, optionally enclosed in braces. These -examples are all identical: -

      -  (ring), \1
      -  (ring), \g1
      -  (ring), \g{1}
      -
      -An unsigned number specifies an absolute reference without the ambiguity that -is present in the older syntax. It is also useful when literal digits follow -the reference. A negative number is a relative reference. Consider this -example: -
      -  (abc(def)ghi)\g{-1}
      -
      -The sequence \g{-1} is a reference to the most recently started capturing -subpattern before \g, that is, is it equivalent to \2 in this example. -Similarly, \g{-2} would be equivalent to \1. The use of relative references -can be helpful in long patterns, and also in patterns that are created by -joining together fragments that contain references within themselves. -

      -

      -A back reference matches whatever actually matched the capturing subpattern in -the current subject string, rather than anything matching the subpattern -itself (see -"Subpatterns as subroutines" -below for a way of doing that). So the pattern -

      -  (sens|respons)e and \1ibility
      -
      -matches "sense and sensibility" and "response and responsibility", but not -"sense and responsibility". If caseful matching is in force at the time of the -back reference, the case of letters is relevant. For example, -
      -  ((?i)rah)\s+\1
      -
      -matches "rah rah" and "RAH RAH", but not "RAH rah", even though the original -capturing subpattern is matched caselessly. -

      -

      -There are several different ways of writing back references to named -subpatterns. The .NET syntax \k{name} and the Perl syntax \k<name> or -\k'name' are supported, as is the Python syntax (?P=name). Perl 5.10's unified -back reference syntax, in which \g can be used for both numeric and named -references, is also supported. We could rewrite the above example in any of -the following ways: -

      -  (?<p1>(?i)rah)\s+\k<p1>
      -  (?'p1'(?i)rah)\s+\k{p1}
      -  (?P<p1>(?i)rah)\s+(?P=p1)
      -  (?<p1>(?i)rah)\s+\g{p1}
      -
      -A subpattern that is referenced by name may appear in the pattern before or -after the reference. -

      -

      -There may be more than one back reference to the same subpattern. If a -subpattern has not actually been used in a particular match, any back -references to it always fail by default. For example, the pattern -

      -  (a|(bc))\2
      -
      -always fails if it starts to match "a" rather than "bc". However, if the -PCRE_JAVASCRIPT_COMPAT option is set at compile time, a back reference to an -unset value matches an empty string. -

      -

      -Because there may be many capturing parentheses in a pattern, all digits -following a backslash are taken as part of a potential back reference number. -If the pattern continues with a digit character, some delimiter must be used to -terminate the back reference. If the PCRE_EXTENDED option is set, this can be -white space. Otherwise, the \g{ syntax or an empty comment (see -"Comments" -below) can be used. -

      -
      -Recursive back references -
      -

      -A back reference that occurs inside the parentheses to which it refers fails -when the subpattern is first used, so, for example, (a\1) never matches. -However, such references can be useful inside repeated subpatterns. For -example, the pattern -

      -  (a|b\1)+
      -
      -matches any number of "a"s and also "aba", "ababbaa" etc. At each iteration of -the subpattern, the back reference matches the character string corresponding -to the previous iteration. In order for this to work, the pattern must be such -that the first iteration does not need to match the back reference. This can be -done using alternation, as in the example above, or by a quantifier with a -minimum of zero. -

      -

      -Back references of this type cause the group that they reference to be treated -as an -atomic group. -Once the whole group has been matched, a subsequent matching failure cannot -cause backtracking into the middle of the group. -

      -
      ASSERTIONS
      -

      -An assertion is a test on the characters following or preceding the current -matching point that does not actually consume any characters. The simple -assertions coded as \b, \B, \A, \G, \Z, \z, ^ and $ are described -above. -

      -

      -More complicated assertions are coded as subpatterns. There are two kinds: -those that look ahead of the current position in the subject string, and those -that look behind it. An assertion subpattern is matched in the normal way, -except that it does not cause the current matching position to be changed. -

      -

      -Assertion subpatterns are not capturing subpatterns. If such an assertion -contains capturing subpatterns within it, these are counted for the purposes of -numbering the capturing subpatterns in the whole pattern. However, substring -capturing is carried out only for positive assertions. (Perl sometimes, but not -always, does do capturing in negative assertions.) -

      -

      -WARNING: If a positive assertion containing one or more capturing subpatterns -succeeds, but failure to match later in the pattern causes backtracking over -this assertion, the captures within the assertion are reset only if no higher -numbered captures are already set. This is, unfortunately, a fundamental -limitation of the current implementation, and as PCRE1 is now in -maintenance-only status, it is unlikely ever to change. -

      -

      -For compatibility with Perl, assertion subpatterns may be repeated; though -it makes no sense to assert the same thing several times, the side effect of -capturing parentheses may occasionally be useful. In practice, there only three -cases: -
      -
      -(1) If the quantifier is {0}, the assertion is never obeyed during matching. -However, it may contain internal capturing parenthesized groups that are called -from elsewhere via the -subroutine mechanism. -
      -
      -(2) If quantifier is {0,n} where n is greater than zero, it is treated as if it -were {0,1}. At run time, the rest of the pattern match is tried with and -without the assertion, the order depending on the greediness of the quantifier. -
      -
      -(3) If the minimum repetition is greater than zero, the quantifier is ignored. -The assertion is obeyed just once when encountered during matching. -

      -
      -Lookahead assertions -
      -

      -Lookahead assertions start with (?= for positive assertions and (?! for -negative assertions. For example, -

      -  \w+(?=;)
      -
      -matches a word followed by a semicolon, but does not include the semicolon in -the match, and -
      -  foo(?!bar)
      -
      -matches any occurrence of "foo" that is not followed by "bar". Note that the -apparently similar pattern -
      -  (?!foo)bar
      -
      -does not find an occurrence of "bar" that is preceded by something other than -"foo"; it finds any occurrence of "bar" whatsoever, because the assertion -(?!foo) is always true when the next three characters are "bar". A -lookbehind assertion is needed to achieve the other effect. -

      -

      -If you want to force a matching failure at some point in a pattern, the most -convenient way to do it is with (?!) because an empty string always matches, so -an assertion that requires there not to be an empty string must always fail. -The backtracking control verb (*FAIL) or (*F) is a synonym for (?!). -

      -
      -Lookbehind assertions -
      -

      -Lookbehind assertions start with (?<= for positive assertions and (?<! for -negative assertions. For example, -

      -  (?<!foo)bar
      -
      -does find an occurrence of "bar" that is not preceded by "foo". The contents of -a lookbehind assertion are restricted such that all the strings it matches must -have a fixed length. However, if there are several top-level alternatives, they -do not all have to have the same fixed length. Thus -
      -  (?<=bullock|donkey)
      -
      -is permitted, but -
      -  (?<!dogs?|cats?)
      -
      -causes an error at compile time. Branches that match different length strings -are permitted only at the top level of a lookbehind assertion. This is an -extension compared with Perl, which requires all branches to match the same -length of string. An assertion such as -
      -  (?<=ab(c|de))
      -
      -is not permitted, because its single top-level branch can match two different -lengths, but it is acceptable to PCRE if rewritten to use two top-level -branches: -
      -  (?<=abc|abde)
      -
      -In some cases, the escape sequence \K -(see above) -can be used instead of a lookbehind assertion to get round the fixed-length -restriction. -

      -

      -The implementation of lookbehind assertions is, for each alternative, to -temporarily move the current position back by the fixed length and then try to -match. If there are insufficient characters before the current position, the -assertion fails. -

      -

      -In a UTF mode, PCRE does not allow the \C escape (which matches a single data -unit even in a UTF mode) to appear in lookbehind assertions, because it makes -it impossible to calculate the length of the lookbehind. The \X and \R -escapes, which can match different numbers of data units, are also not -permitted. -

      -

      -"Subroutine" -calls (see below) such as (?2) or (?&X) are permitted in lookbehinds, as long -as the subpattern matches a fixed-length string. -Recursion, -however, is not supported. -

      -

      -Possessive quantifiers can be used in conjunction with lookbehind assertions to -specify efficient matching of fixed-length strings at the end of subject -strings. Consider a simple pattern such as -

      -  abcd$
      -
      -when applied to a long string that does not match. Because matching proceeds -from left to right, PCRE will look for each "a" in the subject and then see if -what follows matches the rest of the pattern. If the pattern is specified as -
      -  ^.*abcd$
      -
      -the initial .* matches the entire string at first, but when this fails (because -there is no following "a"), it backtracks to match all but the last character, -then all but the last two characters, and so on. Once again the search for "a" -covers the entire string, from right to left, so we are no better off. However, -if the pattern is written as -
      -  ^.*+(?<=abcd)
      -
      -there can be no backtracking for the .*+ item; it can match only the entire -string. The subsequent lookbehind assertion does a single test on the last four -characters. If it fails, the match fails immediately. For long strings, this -approach makes a significant difference to the processing time. -

      -
      -Using multiple assertions -
      -

      -Several assertions (of any sort) may occur in succession. For example, -

      -  (?<=\d{3})(?<!999)foo
      -
      -matches "foo" preceded by three digits that are not "999". Notice that each of -the assertions is applied independently at the same point in the subject -string. First there is a check that the previous three characters are all -digits, and then there is a check that the same three characters are not "999". -This pattern does not match "foo" preceded by six characters, the first -of which are digits and the last three of which are not "999". For example, it -doesn't match "123abcfoo". A pattern to do that is -
      -  (?<=\d{3}...)(?<!999)foo
      -
      -This time the first assertion looks at the preceding six characters, checking -that the first three are digits, and then the second assertion checks that the -preceding three characters are not "999". -

      -

      -Assertions can be nested in any combination. For example, -

      -  (?<=(?<!foo)bar)baz
      -
      -matches an occurrence of "baz" that is preceded by "bar" which in turn is not -preceded by "foo", while -
      -  (?<=\d{3}(?!999)...)foo
      -
      -is another pattern that matches "foo" preceded by three digits and any three -characters that are not "999". -

      -
      CONDITIONAL SUBPATTERNS
      -

      -It is possible to cause the matching process to obey a subpattern -conditionally or to choose between two alternative subpatterns, depending on -the result of an assertion, or whether a specific capturing subpattern has -already been matched. The two possible forms of conditional subpattern are: -

      -  (?(condition)yes-pattern)
      -  (?(condition)yes-pattern|no-pattern)
      -
      -If the condition is satisfied, the yes-pattern is used; otherwise the -no-pattern (if present) is used. If there are more than two alternatives in the -subpattern, a compile-time error occurs. Each of the two alternatives may -itself contain nested subpatterns of any form, including conditional -subpatterns; the restriction to two alternatives applies only at the level of -the condition. This pattern fragment is an example where the alternatives are -complex: -
      -  (?(1) (A|B|C) | (D | (?(2)E|F) | E) )
      -
      -
      -

      -

      -There are four kinds of condition: references to subpatterns, references to -recursion, a pseudo-condition called DEFINE, and assertions. -

      -
      -Checking for a used subpattern by number -
      -

      -If the text between the parentheses consists of a sequence of digits, the -condition is true if a capturing subpattern of that number has previously -matched. If there is more than one capturing subpattern with the same number -(see the earlier -section about duplicate subpattern numbers), -the condition is true if any of them have matched. An alternative notation is -to precede the digits with a plus or minus sign. In this case, the subpattern -number is relative rather than absolute. The most recently opened parentheses -can be referenced by (?(-1), the next most recent by (?(-2), and so on. Inside -loops it can also make sense to refer to subsequent groups. The next -parentheses to be opened can be referenced as (?(+1), and so on. (The value -zero in any of these forms is not used; it provokes a compile-time error.) -

      -

      -Consider the following pattern, which contains non-significant white space to -make it more readable (assume the PCRE_EXTENDED option) and to divide it into -three parts for ease of discussion: -

      -  ( \( )?    [^()]+    (?(1) \) )
      -
      -The first part matches an optional opening parenthesis, and if that -character is present, sets it as the first captured substring. The second part -matches one or more characters that are not parentheses. The third part is a -conditional subpattern that tests whether or not the first set of parentheses -matched. If they did, that is, if subject started with an opening parenthesis, -the condition is true, and so the yes-pattern is executed and a closing -parenthesis is required. Otherwise, since no-pattern is not present, the -subpattern matches nothing. In other words, this pattern matches a sequence of -non-parentheses, optionally enclosed in parentheses. -

      -

      -If you were embedding this pattern in a larger one, you could use a relative -reference: -

      -  ...other stuff... ( \( )?    [^()]+    (?(-1) \) ) ...
      -
      -This makes the fragment independent of the parentheses in the larger pattern. -

      -
      -Checking for a used subpattern by name -
      -

      -Perl uses the syntax (?(<name>)...) or (?('name')...) to test for a used -subpattern by name. For compatibility with earlier versions of PCRE, which had -this facility before Perl, the syntax (?(name)...) is also recognized. -

      -

      -Rewriting the above example to use a named subpattern gives this: -

      -  (?<OPEN> \( )?    [^()]+    (?(<OPEN>) \) )
      -
      -If the name used in a condition of this kind is a duplicate, the test is -applied to all subpatterns of the same name, and is true if any one of them has -matched. -

      -
      -Checking for pattern recursion -
      -

      -If the condition is the string (R), and there is no subpattern with the name R, -the condition is true if a recursive call to the whole pattern or any -subpattern has been made. If digits or a name preceded by ampersand follow the -letter R, for example: -

      -  (?(R3)...) or (?(R&name)...)
      -
      -the condition is true if the most recent recursion is into a subpattern whose -number or name is given. This condition does not check the entire recursion -stack. If the name used in a condition of this kind is a duplicate, the test is -applied to all subpatterns of the same name, and is true if any one of them is -the most recent recursion. -

      -

      -At "top level", all these recursion test conditions are false. -The syntax for recursive patterns -is described below. -

      -
      -Defining subpatterns for use by reference only -
      -

      -If the condition is the string (DEFINE), and there is no subpattern with the -name DEFINE, the condition is always false. In this case, there may be only one -alternative in the subpattern. It is always skipped if control reaches this -point in the pattern; the idea of DEFINE is that it can be used to define -subroutines that can be referenced from elsewhere. (The use of -subroutines -is described below.) For example, a pattern to match an IPv4 address such as -"192.168.23.245" could be written like this (ignore white space and line -breaks): -

      -  (?(DEFINE) (?<byte> 2[0-4]\d | 25[0-5] | 1\d\d | [1-9]?\d) )
      -  \b (?&byte) (\.(?&byte)){3} \b
      -
      -The first part of the pattern is a DEFINE group inside which a another group -named "byte" is defined. This matches an individual component of an IPv4 -address (a number less than 256). When matching takes place, this part of the -pattern is skipped because DEFINE acts like a false condition. The rest of the -pattern uses references to the named group to match the four dot-separated -components of an IPv4 address, insisting on a word boundary at each end. -

      -
      -Assertion conditions -
      -

      -If the condition is not in any of the above formats, it must be an assertion. -This may be a positive or negative lookahead or lookbehind assertion. Consider -this pattern, again containing non-significant white space, and with the two -alternatives on the second line: -

      -  (?(?=[^a-z]*[a-z])
      -  \d{2}-[a-z]{3}-\d{2}  |  \d{2}-\d{2}-\d{2} )
      -
      -The condition is a positive lookahead assertion that matches an optional -sequence of non-letters followed by a letter. In other words, it tests for the -presence of at least one letter in the subject. If a letter is found, the -subject is matched against the first alternative; otherwise it is matched -against the second. This pattern matches strings in one of the two forms -dd-aaa-dd or dd-dd-dd, where aaa are letters and dd are digits. -

      -
      COMMENTS
      -

      -There are two ways of including comments in patterns that are processed by -PCRE. In both cases, the start of the comment must not be in a character class, -nor in the middle of any other sequence of related characters such as (?: or a -subpattern name or number. The characters that make up a comment play no part -in the pattern matching. -

      -

      -The sequence (?# marks the start of a comment that continues up to the next -closing parenthesis. Nested parentheses are not permitted. If the PCRE_EXTENDED -option is set, an unescaped # character also introduces a comment, which in -this case continues to immediately after the next newline character or -character sequence in the pattern. Which characters are interpreted as newlines -is controlled by the options passed to a compiling function or by a special -sequence at the start of the pattern, as described in the section entitled -"Newline conventions" -above. Note that the end of this type of comment is a literal newline sequence -in the pattern; escape sequences that happen to represent a newline do not -count. For example, consider this pattern when PCRE_EXTENDED is set, and the -default newline convention is in force: -

      -  abc #comment \n still comment
      -
      -On encountering the # character, pcre_compile() skips along, looking for -a newline in the pattern. The sequence \n is still literal at this stage, so -it does not terminate the comment. Only an actual character with the code value -0x0a (the default newline) does so. -

      -
      RECURSIVE PATTERNS
      -

      -Consider the problem of matching a string in parentheses, allowing for -unlimited nested parentheses. Without the use of recursion, the best that can -be done is to use a pattern that matches up to some fixed depth of nesting. It -is not possible to handle an arbitrary nesting depth. -

      -

      -For some time, Perl has provided a facility that allows regular expressions to -recurse (amongst other things). It does this by interpolating Perl code in the -expression at run time, and the code can refer to the expression itself. A Perl -pattern using code interpolation to solve the parentheses problem can be -created like this: -

      -  $re = qr{\( (?: (?>[^()]+) | (?p{$re}) )* \)}x;
      -
      -The (?p{...}) item interpolates Perl code at run time, and in this case refers -recursively to the pattern in which it appears. -

      -

      -Obviously, PCRE cannot support the interpolation of Perl code. Instead, it -supports special syntax for recursion of the entire pattern, and also for -individual subpattern recursion. After its introduction in PCRE and Python, -this kind of recursion was subsequently introduced into Perl at release 5.10. -

      -

      -A special item that consists of (? followed by a number greater than zero and a -closing parenthesis is a recursive subroutine call of the subpattern of the -given number, provided that it occurs inside that subpattern. (If not, it is a -non-recursive subroutine -call, which is described in the next section.) The special item (?R) or (?0) is -a recursive call of the entire regular expression. -

      -

      -This PCRE pattern solves the nested parentheses problem (assume the -PCRE_EXTENDED option is set so that white space is ignored): -

      -  \( ( [^()]++ | (?R) )* \)
      -
      -First it matches an opening parenthesis. Then it matches any number of -substrings which can either be a sequence of non-parentheses, or a recursive -match of the pattern itself (that is, a correctly parenthesized substring). -Finally there is a closing parenthesis. Note the use of a possessive quantifier -to avoid backtracking into sequences of non-parentheses. -

      -

      -If this were part of a larger pattern, you would not want to recurse the entire -pattern, so instead you could use this: -

      -  ( \( ( [^()]++ | (?1) )* \) )
      -
      -We have put the pattern into parentheses, and caused the recursion to refer to -them instead of the whole pattern. -

      -

      -In a larger pattern, keeping track of parenthesis numbers can be tricky. This -is made easier by the use of relative references. Instead of (?1) in the -pattern above you can write (?-2) to refer to the second most recently opened -parentheses preceding the recursion. In other words, a negative number counts -capturing parentheses leftwards from the point at which it is encountered. -

      -

      -It is also possible to refer to subsequently opened parentheses, by writing -references such as (?+2). However, these cannot be recursive because the -reference is not inside the parentheses that are referenced. They are always -non-recursive subroutine -calls, as described in the next section. -

      -

      -An alternative approach is to use named parentheses instead. The Perl syntax -for this is (?&name); PCRE's earlier syntax (?P>name) is also supported. We -could rewrite the above example as follows: -

      -  (?<pn> \( ( [^()]++ | (?&pn) )* \) )
      -
      -If there is more than one subpattern with the same name, the earliest one is -used. -

      -

      -This particular example pattern that we have been looking at contains nested -unlimited repeats, and so the use of a possessive quantifier for matching -strings of non-parentheses is important when applying the pattern to strings -that do not match. For example, when this pattern is applied to -

      -  (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()
      -
      -it yields "no match" quickly. However, if a possessive quantifier is not used, -the match runs for a very long time indeed because there are so many different -ways the + and * repeats can carve up the subject, and all have to be tested -before failure can be reported. -

      -

      -At the end of a match, the values of capturing parentheses are those from -the outermost level. If you want to obtain intermediate values, a callout -function can be used (see below and the -pcrecallout -documentation). If the pattern above is matched against -

      -  (ab(cd)ef)
      -
      -the value for the inner capturing parentheses (numbered 2) is "ef", which is -the last value taken on at the top level. If a capturing subpattern is not -matched at the top level, its final captured value is unset, even if it was -(temporarily) set at a deeper level during the matching process. -

      -

      -If there are more than 15 capturing parentheses in a pattern, PCRE has to -obtain extra memory to store data during a recursion, which it does by using -pcre_malloc, freeing it via pcre_free afterwards. If no memory can -be obtained, the match fails with the PCRE_ERROR_NOMEMORY error. -

      -

      -Do not confuse the (?R) item with the condition (R), which tests for recursion. -Consider this pattern, which matches text in angle brackets, allowing for -arbitrary nesting. Only digits are allowed in nested brackets (that is, when -recursing), whereas any characters are permitted at the outer level. -

      -  < (?: (?(R) \d++  | [^<>]*+) | (?R)) * >
      -
      -In this pattern, (?(R) is the start of a conditional subpattern, with two -different alternatives for the recursive and non-recursive cases. The (?R) item -is the actual recursive call. -

      -
      -Differences in recursion processing between PCRE and Perl -
      -

      -Recursion processing in PCRE differs from Perl in two important ways. In PCRE -(like Python, but unlike Perl), a recursive subpattern call is always treated -as an atomic group. That is, once it has matched some of the subject string, it -is never re-entered, even if it contains untried alternatives and there is a -subsequent matching failure. This can be illustrated by the following pattern, -which purports to match a palindromic string that contains an odd number of -characters (for example, "a", "aba", "abcba", "abcdcba"): -

      -  ^(.|(.)(?1)\2)$
      -
      -The idea is that it either matches a single character, or two identical -characters surrounding a sub-palindrome. In Perl, this pattern works; in PCRE -it does not if the pattern is longer than three characters. Consider the -subject string "abcba": -

      -

      -At the top level, the first character is matched, but as it is not at the end -of the string, the first alternative fails; the second alternative is taken -and the recursion kicks in. The recursive call to subpattern 1 successfully -matches the next character ("b"). (Note that the beginning and end of line -tests are not part of the recursion). -

      -

      -Back at the top level, the next character ("c") is compared with what -subpattern 2 matched, which was "a". This fails. Because the recursion is -treated as an atomic group, there are now no backtracking points, and so the -entire match fails. (Perl is able, at this point, to re-enter the recursion and -try the second alternative.) However, if the pattern is written with the -alternatives in the other order, things are different: -

      -  ^((.)(?1)\2|.)$
      -
      -This time, the recursing alternative is tried first, and continues to recurse -until it runs out of characters, at which point the recursion fails. But this -time we do have another alternative to try at the higher level. That is the big -difference: in the previous case the remaining alternative is at a deeper -recursion level, which PCRE cannot use. -

      -

      -To change the pattern so that it matches all palindromic strings, not just -those with an odd number of characters, it is tempting to change the pattern to -this: -

      -  ^((.)(?1)\2|.?)$
      -
      -Again, this works in Perl, but not in PCRE, and for the same reason. When a -deeper recursion has matched a single character, it cannot be entered again in -order to match an empty string. The solution is to separate the two cases, and -write out the odd and even cases as alternatives at the higher level: -
      -  ^(?:((.)(?1)\2|)|((.)(?3)\4|.))
      -
      -If you want to match typical palindromic phrases, the pattern has to ignore all -non-word characters, which can be done like this: -
      -  ^\W*+(?:((.)\W*+(?1)\W*+\2|)|((.)\W*+(?3)\W*+\4|\W*+.\W*+))\W*+$
      -
      -If run with the PCRE_CASELESS option, this pattern matches phrases such as "A -man, a plan, a canal: Panama!" and it works well in both PCRE and Perl. Note -the use of the possessive quantifier *+ to avoid backtracking into sequences of -non-word characters. Without this, PCRE takes a great deal longer (ten times or -more) to match typical phrases, and Perl takes so long that you think it has -gone into a loop. -

      -

      -WARNING: The palindrome-matching patterns above work only if the subject -string does not start with a palindrome that is shorter than the entire string. -For example, although "abcba" is correctly matched, if the subject is "ababa", -PCRE finds the palindrome "aba" at the start, then fails at top level because -the end of the string does not follow. Once again, it cannot jump back into the -recursion to try other alternatives, so the entire match fails. -

      -

      -The second way in which PCRE and Perl differ in their recursion processing is -in the handling of captured values. In Perl, when a subpattern is called -recursively or as a subpattern (see the next section), it has no access to any -values that were captured outside the recursion, whereas in PCRE these values -can be referenced. Consider this pattern: -

      -  ^(.)(\1|a(?2))
      -
      -In PCRE, this pattern matches "bab". The first capturing parentheses match "b", -then in the second group, when the back reference \1 fails to match "b", the -second alternative matches "a" and then recurses. In the recursion, \1 does -now match "b" and so the whole match succeeds. In Perl, the pattern fails to -match because inside the recursive call \1 cannot access the externally set -value. -

      -
      SUBPATTERNS AS SUBROUTINES
      -

      -If the syntax for a recursive subpattern call (either by number or by -name) is used outside the parentheses to which it refers, it operates like a -subroutine in a programming language. The called subpattern may be defined -before or after the reference. A numbered reference can be absolute or -relative, as in these examples: -

      -  (...(absolute)...)...(?2)...
      -  (...(relative)...)...(?-1)...
      -  (...(?+1)...(relative)...
      -
      -An earlier example pointed out that the pattern -
      -  (sens|respons)e and \1ibility
      -
      -matches "sense and sensibility" and "response and responsibility", but not -"sense and responsibility". If instead the pattern -
      -  (sens|respons)e and (?1)ibility
      -
      -is used, it does match "sense and responsibility" as well as the other two -strings. Another example is given in the discussion of DEFINE above. -

      -

      -All subroutine calls, whether recursive or not, are always treated as atomic -groups. That is, once a subroutine has matched some of the subject string, it -is never re-entered, even if it contains untried alternatives and there is a -subsequent matching failure. Any capturing parentheses that are set during the -subroutine call revert to their previous values afterwards. -

      -

      -Processing options such as case-independence are fixed when a subpattern is -defined, so if it is used as a subroutine, such options cannot be changed for -different calls. For example, consider this pattern: -

      -  (abc)(?i:(?-1))
      -
      -It matches "abcabc". It does not match "abcABC" because the change of -processing option does not affect the called subpattern. -

      -
      ONIGURUMA SUBROUTINE SYNTAX
      -

      -For compatibility with Oniguruma, the non-Perl syntax \g followed by a name or -a number enclosed either in angle brackets or single quotes, is an alternative -syntax for referencing a subpattern as a subroutine, possibly recursively. Here -are two of the examples used above, rewritten using this syntax: -

      -  (?<pn> \( ( (?>[^()]+) | \g<pn> )* \) )
      -  (sens|respons)e and \g'1'ibility
      -
      -PCRE supports an extension to Oniguruma: if a number is preceded by a -plus or a minus sign it is taken as a relative reference. For example: -
      -  (abc)(?i:\g<-1>)
      -
      -Note that \g{...} (Perl syntax) and \g<...> (Oniguruma syntax) are not -synonymous. The former is a back reference; the latter is a subroutine call. -

      -
      CALLOUTS
      -

      -Perl has a feature whereby using the sequence (?{...}) causes arbitrary Perl -code to be obeyed in the middle of matching a regular expression. This makes it -possible, amongst other things, to extract different substrings that match the -same pair of parentheses when there is a repetition. -

      -

      -PCRE provides a similar feature, but of course it cannot obey arbitrary Perl -code. The feature is called "callout". The caller of PCRE provides an external -function by putting its entry point in the global variable pcre_callout -(8-bit library) or pcre[16|32]_callout (16-bit or 32-bit library). -By default, this variable contains NULL, which disables all calling out. -

      -

      -Within a regular expression, (?C) indicates the points at which the external -function is to be called. If you want to identify different callout points, you -can put a number less than 256 after the letter C. The default value is zero. -For example, this pattern has two callout points: -

      -  (?C1)abc(?C2)def
      -
      -If the PCRE_AUTO_CALLOUT flag is passed to a compiling function, callouts are -automatically installed before each item in the pattern. They are all numbered -255. If there is a conditional group in the pattern whose condition is an -assertion, an additional callout is inserted just before the condition. An -explicit callout may also be set at this position, as in this example: -
      -  (?(?C9)(?=a)abc|def)
      -
      -Note that this applies only to assertion conditions, not to other types of -condition. -

      -

      -During matching, when PCRE reaches a callout point, the external function is -called. It is provided with the number of the callout, the position in the -pattern, and, optionally, one item of data originally supplied by the caller of -the matching function. The callout function may cause matching to proceed, to -backtrack, or to fail altogether. -

      -

      -By default, PCRE implements a number of optimizations at compile time and -matching time, and one side-effect is that sometimes callouts are skipped. If -you need all possible callouts to happen, you need to set options that disable -the relevant optimizations. More details, and a complete description of the -interface to the callout function, are given in the -pcrecallout -documentation. -

      -
      BACKTRACKING CONTROL
      -

      -Perl 5.10 introduced a number of "Special Backtracking Control Verbs", which -are still described in the Perl documentation as "experimental and subject to -change or removal in a future version of Perl". It goes on to say: "Their usage -in production code should be noted to avoid problems during upgrades." The same -remarks apply to the PCRE features described in this section. -

      -

      -The new verbs make use of what was previously invalid syntax: an opening -parenthesis followed by an asterisk. They are generally of the form -(*VERB) or (*VERB:NAME). Some may take either form, possibly behaving -differently depending on whether or not a name is present. A name is any -sequence of characters that does not include a closing parenthesis. The maximum -length of name is 255 in the 8-bit library and 65535 in the 16-bit and 32-bit -libraries. If the name is empty, that is, if the closing parenthesis -immediately follows the colon, the effect is as if the colon were not there. -Any number of these verbs may occur in a pattern. -

      -

      -Since these verbs are specifically related to backtracking, most of them can be -used only when the pattern is to be matched using one of the traditional -matching functions, because these use a backtracking algorithm. With the -exception of (*FAIL), which behaves like a failing negative assertion, the -backtracking control verbs cause an error if encountered by a DFA matching -function. -

      -

      -The behaviour of these verbs in -repeated groups, -assertions, -and in -subpatterns called as subroutines -(whether or not recursively) is documented below. -

      -
      -Optimizations that affect backtracking verbs -
      -

      -PCRE contains some optimizations that are used to speed up matching by running -some checks at the start of each match attempt. For example, it may know the -minimum length of matching subject, or that a particular character must be -present. When one of these optimizations bypasses the running of a match, any -included backtracking verbs will not, of course, be processed. You can suppress -the start-of-match optimizations by setting the PCRE_NO_START_OPTIMIZE option -when calling pcre_compile() or pcre_exec(), or by starting the -pattern with (*NO_START_OPT). There is more discussion of this option in the -section entitled -"Option bits for pcre_exec()" -in the -pcreapi -documentation. -

      -

      -Experiments with Perl suggest that it too has similar optimizations, sometimes -leading to anomalous results. -

      -
      -Verbs that act immediately -
      -

      -The following verbs act as soon as they are encountered. They may not be -followed by a name. -

      -   (*ACCEPT)
      -
      -This verb causes the match to end successfully, skipping the remainder of the -pattern. However, when it is inside a subpattern that is called as a -subroutine, only that subpattern is ended successfully. Matching then continues -at the outer level. If (*ACCEPT) in triggered in a positive assertion, the -assertion succeeds; in a negative assertion, the assertion fails. -

      -

      -If (*ACCEPT) is inside capturing parentheses, the data so far is captured. For -example: -

      -  A((?:A|B(*ACCEPT)|C)D)
      -
      -This matches "AB", "AAD", or "ACD"; when it matches "AB", "B" is captured by -the outer parentheses. -
      -  (*FAIL) or (*F)
      -
      -This verb causes a matching failure, forcing backtracking to occur. It is -equivalent to (?!) but easier to read. The Perl documentation notes that it is -probably useful only when combined with (?{}) or (??{}). Those are, of course, -Perl features that are not present in PCRE. The nearest equivalent is the -callout feature, as for example in this pattern: -
      -  a+(?C)(*FAIL)
      -
      -A match with the string "aaaa" always fails, but the callout is taken before -each backtrack happens (in this example, 10 times). -

      -
      -Recording which path was taken -
      -

      -There is one verb whose main purpose is to track how a match was arrived at, -though it also has a secondary use in conjunction with advancing the match -starting point (see (*SKIP) below). -

      -  (*MARK:NAME) or (*:NAME)
      -
      -A name is always required with this verb. There may be as many instances of -(*MARK) as you like in a pattern, and their names do not have to be unique. -

      -

      -When a match succeeds, the name of the last-encountered (*MARK:NAME), -(*PRUNE:NAME), or (*THEN:NAME) on the matching path is passed back to the -caller as described in the section entitled -"Extra data for pcre_exec()" -in the -pcreapi -documentation. Here is an example of pcretest output, where the /K -modifier requests the retrieval and outputting of (*MARK) data: -

      -    re> /X(*MARK:A)Y|X(*MARK:B)Z/K
      -  data> XY
      -   0: XY
      -  MK: A
      -  XZ
      -   0: XZ
      -  MK: B
      -
      -The (*MARK) name is tagged with "MK:" in this output, and in this example it -indicates which of the two alternatives matched. This is a more efficient way -of obtaining this information than putting each alternative in its own -capturing parentheses. -

      -

      -If a verb with a name is encountered in a positive assertion that is true, the -name is recorded and passed back if it is the last-encountered. This does not -happen for negative assertions or failing positive assertions. -

      -

      -After a partial match or a failed match, the last encountered name in the -entire match process is returned. For example: -

      -    re> /X(*MARK:A)Y|X(*MARK:B)Z/K
      -  data> XP
      -  No match, mark = B
      -
      -Note that in this unanchored example the mark is retained from the match -attempt that started at the letter "X" in the subject. Subsequent match -attempts starting at "P" and then with an empty string do not get as far as the -(*MARK) item, but nevertheless do not reset it. -

      -

      -If you are interested in (*MARK) values after failed matches, you should -probably set the PCRE_NO_START_OPTIMIZE option -(see above) -to ensure that the match is always attempted. -

      -
      -Verbs that act after backtracking -
      -

      -The following verbs do nothing when they are encountered. Matching continues -with what follows, but if there is no subsequent match, causing a backtrack to -the verb, a failure is forced. That is, backtracking cannot pass to the left of -the verb. However, when one of these verbs appears inside an atomic group or an -assertion that is true, its effect is confined to that group, because once the -group has been matched, there is never any backtracking into it. In this -situation, backtracking can "jump back" to the left of the entire atomic group -or assertion. (Remember also, as stated above, that this localization also -applies in subroutine calls.) -

      -

      -These verbs differ in exactly what kind of failure occurs when backtracking -reaches them. The behaviour described below is what happens when the verb is -not in a subroutine or an assertion. Subsequent sections cover these special -cases. -

      -  (*COMMIT)
      -
      -This verb, which may not be followed by a name, causes the whole match to fail -outright if there is a later matching failure that causes backtracking to reach -it. Even if the pattern is unanchored, no further attempts to find a match by -advancing the starting point take place. If (*COMMIT) is the only backtracking -verb that is encountered, once it has been passed pcre_exec() is -committed to finding a match at the current starting point, or not at all. For -example: -
      -  a+(*COMMIT)b
      -
      -This matches "xxaab" but not "aacaab". It can be thought of as a kind of -dynamic anchor, or "I've started, so I must finish." The name of the most -recently passed (*MARK) in the path is passed back when (*COMMIT) forces a -match failure. -

      -

      -If there is more than one backtracking verb in a pattern, a different one that -follows (*COMMIT) may be triggered first, so merely passing (*COMMIT) during a -match does not always guarantee that a match must be at this starting point. -

      -

      -Note that (*COMMIT) at the start of a pattern is not the same as an anchor, -unless PCRE's start-of-match optimizations are turned off, as shown in this -output from pcretest: -

      -    re> /(*COMMIT)abc/
      -  data> xyzabc
      -   0: abc
      -  data> xyzabc\Y
      -  No match
      -
      -For this pattern, PCRE knows that any match must start with "a", so the -optimization skips along the subject to "a" before applying the pattern to the -first set of data. The match attempt then succeeds. In the second set of data, -the escape sequence \Y is interpreted by the pcretest program. It causes -the PCRE_NO_START_OPTIMIZE option to be set when pcre_exec() is called. -This disables the optimization that skips along to the first character. The -pattern is now applied starting at "x", and so the (*COMMIT) causes the match -to fail without trying any other starting points. -
      -  (*PRUNE) or (*PRUNE:NAME)
      -
      -This verb causes the match to fail at the current starting position in the -subject if there is a later matching failure that causes backtracking to reach -it. If the pattern is unanchored, the normal "bumpalong" advance to the next -starting character then happens. Backtracking can occur as usual to the left of -(*PRUNE), before it is reached, or when matching to the right of (*PRUNE), but -if there is no match to the right, backtracking cannot cross (*PRUNE). In -simple cases, the use of (*PRUNE) is just an alternative to an atomic group or -possessive quantifier, but there are some uses of (*PRUNE) that cannot be -expressed in any other way. In an anchored pattern (*PRUNE) has the same effect -as (*COMMIT). -

      -

      -The behaviour of (*PRUNE:NAME) is the not the same as (*MARK:NAME)(*PRUNE). -It is like (*MARK:NAME) in that the name is remembered for passing back to the -caller. However, (*SKIP:NAME) searches only for names set with (*MARK). -

      -  (*SKIP)
      -
      -This verb, when given without a name, is like (*PRUNE), except that if the -pattern is unanchored, the "bumpalong" advance is not to the next character, -but to the position in the subject where (*SKIP) was encountered. (*SKIP) -signifies that whatever text was matched leading up to it cannot be part of a -successful match. Consider: -
      -  a+(*SKIP)b
      -
      -If the subject is "aaaac...", after the first match attempt fails (starting at -the first character in the string), the starting point skips on to start the -next attempt at "c". Note that a possessive quantifer does not have the same -effect as this example; although it would suppress backtracking during the -first match attempt, the second attempt would start at the second character -instead of skipping on to "c". -
      -  (*SKIP:NAME)
      -
      -When (*SKIP) has an associated name, its behaviour is modified. When it is -triggered, the previous path through the pattern is searched for the most -recent (*MARK) that has the same name. If one is found, the "bumpalong" advance -is to the subject position that corresponds to that (*MARK) instead of to where -(*SKIP) was encountered. If no (*MARK) with a matching name is found, the -(*SKIP) is ignored. -

      -

      -Note that (*SKIP:NAME) searches only for names set by (*MARK:NAME). It ignores -names that are set by (*PRUNE:NAME) or (*THEN:NAME). -

      -  (*THEN) or (*THEN:NAME)
      -
      -This verb causes a skip to the next innermost alternative when backtracking -reaches it. That is, it cancels any further backtracking within the current -alternative. Its name comes from the observation that it can be used for a -pattern-based if-then-else block: -
      -  ( COND1 (*THEN) FOO | COND2 (*THEN) BAR | COND3 (*THEN) BAZ ) ...
      -
      -If the COND1 pattern matches, FOO is tried (and possibly further items after -the end of the group if FOO succeeds); on failure, the matcher skips to the -second alternative and tries COND2, without backtracking into COND1. If that -succeeds and BAR fails, COND3 is tried. If subsequently BAZ fails, there are no -more alternatives, so there is a backtrack to whatever came before the entire -group. If (*THEN) is not inside an alternation, it acts like (*PRUNE). -

      -

      -The behaviour of (*THEN:NAME) is the not the same as (*MARK:NAME)(*THEN). -It is like (*MARK:NAME) in that the name is remembered for passing back to the -caller. However, (*SKIP:NAME) searches only for names set with (*MARK). -

      -

      -A subpattern that does not contain a | character is just a part of the -enclosing alternative; it is not a nested alternation with only one -alternative. The effect of (*THEN) extends beyond such a subpattern to the -enclosing alternative. Consider this pattern, where A, B, etc. are complex -pattern fragments that do not contain any | characters at this level: -

      -  A (B(*THEN)C) | D
      -
      -If A and B are matched, but there is a failure in C, matching does not -backtrack into A; instead it moves to the next alternative, that is, D. -However, if the subpattern containing (*THEN) is given an alternative, it -behaves differently: -
      -  A (B(*THEN)C | (*FAIL)) | D
      -
      -The effect of (*THEN) is now confined to the inner subpattern. After a failure -in C, matching moves to (*FAIL), which causes the whole subpattern to fail -because there are no more alternatives to try. In this case, matching does now -backtrack into A. -

      -

      -Note that a conditional subpattern is not considered as having two -alternatives, because only one is ever used. In other words, the | character in -a conditional subpattern has a different meaning. Ignoring white space, -consider: -

      -  ^.*? (?(?=a) a | b(*THEN)c )
      -
      -If the subject is "ba", this pattern does not match. Because .*? is ungreedy, -it initially matches zero characters. The condition (?=a) then fails, the -character "b" is matched, but "c" is not. At this point, matching does not -backtrack to .*? as might perhaps be expected from the presence of the | -character. The conditional subpattern is part of the single alternative that -comprises the whole pattern, and so the match fails. (If there was a backtrack -into .*?, allowing it to match "b", the match would succeed.) -

      -

      -The verbs just described provide four different "strengths" of control when -subsequent matching fails. (*THEN) is the weakest, carrying on the match at the -next alternative. (*PRUNE) comes next, failing the match at the current -starting position, but allowing an advance to the next character (for an -unanchored pattern). (*SKIP) is similar, except that the advance may be more -than one character. (*COMMIT) is the strongest, causing the entire match to -fail. -

      -
      -More than one backtracking verb -
      -

      -If more than one backtracking verb is present in a pattern, the one that is -backtracked onto first acts. For example, consider this pattern, where A, B, -etc. are complex pattern fragments: -

      -  (A(*COMMIT)B(*THEN)C|ABD)
      -
      -If A matches but B fails, the backtrack to (*COMMIT) causes the entire match to -fail. However, if A and B match, but C fails, the backtrack to (*THEN) causes -the next alternative (ABD) to be tried. This behaviour is consistent, but is -not always the same as Perl's. It means that if two or more backtracking verbs -appear in succession, all the the last of them has no effect. Consider this -example: -
      -  ...(*COMMIT)(*PRUNE)...
      -
      -If there is a matching failure to the right, backtracking onto (*PRUNE) causes -it to be triggered, and its action is taken. There can never be a backtrack -onto (*COMMIT). -

      -
      -Backtracking verbs in repeated groups -
      -

      -PCRE differs from Perl in its handling of backtracking verbs in repeated -groups. For example, consider: -

      -  /(a(*COMMIT)b)+ac/
      -
      -If the subject is "abac", Perl matches, but PCRE fails because the (*COMMIT) in -the second repeat of the group acts. -

      -
      -Backtracking verbs in assertions -
      -

      -(*FAIL) in an assertion has its normal effect: it forces an immediate backtrack. -

      -

      -(*ACCEPT) in a positive assertion causes the assertion to succeed without any -further processing. In a negative assertion, (*ACCEPT) causes the assertion to -fail without any further processing. -

      -

      -The other backtracking verbs are not treated specially if they appear in a -positive assertion. In particular, (*THEN) skips to the next alternative in the -innermost enclosing group that has alternations, whether or not this is within -the assertion. -

      -

      -Negative assertions are, however, different, in order to ensure that changing a -positive assertion into a negative assertion changes its result. Backtracking -into (*COMMIT), (*SKIP), or (*PRUNE) causes a negative assertion to be true, -without considering any further alternative branches in the assertion. -Backtracking into (*THEN) causes it to skip to the next enclosing alternative -within the assertion (the normal behaviour), but if the assertion does not have -such an alternative, (*THEN) behaves like (*PRUNE). -

      -
      -Backtracking verbs in subroutines -
      -

      -These behaviours occur whether or not the subpattern is called recursively. -Perl's treatment of subroutines is different in some cases. -

      -

      -(*FAIL) in a subpattern called as a subroutine has its normal effect: it forces -an immediate backtrack. -

      -

      -(*ACCEPT) in a subpattern called as a subroutine causes the subroutine match to -succeed without any further processing. Matching then continues after the -subroutine call. -

      -

      -(*COMMIT), (*SKIP), and (*PRUNE) in a subpattern called as a subroutine cause -the subroutine match to fail. -

      -

      -(*THEN) skips to the next alternative in the innermost enclosing group within -the subpattern that has alternatives. If there is no such group within the -subpattern, (*THEN) causes the subroutine match to fail. -

      -
      SEE ALSO
      -

      -pcreapi(3), pcrecallout(3), pcrematching(3), -pcresyntax(3), pcre(3), pcre16(3), pcre32(3). -

      -
      AUTHOR
      -

      -Philip Hazel -
      -University Computing Service -
      -Cambridge CB2 3QH, England. -
      -

      -
      REVISION
      -

      -Last updated: 23 October 2016 -
      -Copyright © 1997-2016 University of Cambridge. -
      -

      -Return to the PCRE index page. -

      diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcreperform.html b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcreperform.html deleted file mode 100644 index dda207f9..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcreperform.html +++ /dev/null @@ -1,195 +0,0 @@ - - -pcreperform specification - - -

      pcreperform man page

      -

      -Return to the PCRE index page. -

      -

      -This page is part of the PCRE HTML documentation. It was generated automatically -from the original man page. If there is any nonsense in it, please consult the -man page, in case the conversion went wrong. -
      -
      -PCRE PERFORMANCE -
      -

      -Two aspects of performance are discussed below: memory usage and processing -time. The way you express your pattern as a regular expression can affect both -of them. -

      -
      -COMPILED PATTERN MEMORY USAGE -
      -

      -Patterns are compiled by PCRE into a reasonably efficient interpretive code, so -that most simple patterns do not use much memory. However, there is one case -where the memory usage of a compiled pattern can be unexpectedly large. If a -parenthesized subpattern has a quantifier with a minimum greater than 1 and/or -a limited maximum, the whole subpattern is repeated in the compiled code. For -example, the pattern -

      -  (abc|def){2,4}
      -
      -is compiled as if it were -
      -  (abc|def)(abc|def)((abc|def)(abc|def)?)?
      -
      -(Technical aside: It is done this way so that backtrack points within each of -the repetitions can be independently maintained.) -

      -

      -For regular expressions whose quantifiers use only small numbers, this is not -usually a problem. However, if the numbers are large, and particularly if such -repetitions are nested, the memory usage can become an embarrassment. For -example, the very simple pattern -

      -  ((ab){1,1000}c){1,3}
      -
      -uses 51K bytes when compiled using the 8-bit library. When PCRE is compiled -with its default internal pointer size of two bytes, the size limit on a -compiled pattern is 64K data units, and this is reached with the above pattern -if the outer repetition is increased from 3 to 4. PCRE can be compiled to use -larger internal pointers and thus handle larger compiled patterns, but it is -better to try to rewrite your pattern to use less memory if you can. -

      -

      -One way of reducing the memory usage for such patterns is to make use of PCRE's -"subroutine" -facility. Re-writing the above pattern as -

      -  ((ab)(?2){0,999}c)(?1){0,2}
      -
      -reduces the memory requirements to 18K, and indeed it remains under 20K even -with the outer repetition increased to 100. However, this pattern is not -exactly equivalent, because the "subroutine" calls are treated as -atomic groups -into which there can be no backtracking if there is a subsequent matching -failure. Therefore, PCRE cannot do this kind of rewriting automatically. -Furthermore, there is a noticeable loss of speed when executing the modified -pattern. Nevertheless, if the atomic grouping is not a problem and the loss of -speed is acceptable, this kind of rewriting will allow you to process patterns -that PCRE cannot otherwise handle. -

      -
      -STACK USAGE AT RUN TIME -
      -

      -When pcre_exec() or pcre[16|32]_exec() is used for matching, certain -kinds of pattern can cause it to use large amounts of the process stack. In -some environments the default process stack is quite small, and if it runs out -the result is often SIGSEGV. This issue is probably the most frequently raised -problem with PCRE. Rewriting your pattern can often help. The -pcrestack -documentation discusses this issue in detail. -

      -
      -PROCESSING TIME -
      -

      -Certain items in regular expression patterns are processed more efficiently -than others. It is more efficient to use a character class like [aeiou] than a -set of single-character alternatives such as (a|e|i|o|u). In general, the -simplest construction that provides the required behaviour is usually the most -efficient. Jeffrey Friedl's book contains a lot of useful general discussion -about optimizing regular expressions for efficient performance. This document -contains a few observations about PCRE. -

      -

      -Using Unicode character properties (the \p, \P, and \X escapes) is slow, -because PCRE has to use a multi-stage table lookup whenever it needs a -character's property. If you can find an alternative pattern that does not use -character properties, it will probably be faster. -

      -

      -By default, the escape sequences \b, \d, \s, and \w, and the POSIX -character classes such as [:alpha:] do not use Unicode properties, partly for -backwards compatibility, and partly for performance reasons. However, you can -set PCRE_UCP if you want Unicode character properties to be used. This can -double the matching time for items such as \d, when matched with -a traditional matching function; the performance loss is less with -a DFA matching function, and in both cases there is not much difference for -\b. -

      -

      -When a pattern begins with .* not in parentheses, or in parentheses that are -not the subject of a backreference, and the PCRE_DOTALL option is set, the -pattern is implicitly anchored by PCRE, since it can match only at the start of -a subject string. However, if PCRE_DOTALL is not set, PCRE cannot make this -optimization, because the . metacharacter does not then match a newline, and if -the subject string contains newlines, the pattern may match from the character -immediately following one of them instead of from the very start. For example, -the pattern -

      -  .*second
      -
      -matches the subject "first\nand second" (where \n stands for a newline -character), with the match starting at the seventh character. In order to do -this, PCRE has to retry the match starting after every newline in the subject. -

      -

      -If you are using such a pattern with subject strings that do not contain -newlines, the best performance is obtained by setting PCRE_DOTALL, or starting -the pattern with ^.* or ^.*? to indicate explicit anchoring. That saves PCRE -from having to scan along the subject looking for a newline to restart at. -

      -

      -Beware of patterns that contain nested indefinite repeats. These can take a -long time to run when applied to a string that does not match. Consider the -pattern fragment -

      -  ^(a+)*
      -
      -This can match "aaaa" in 16 different ways, and this number increases very -rapidly as the string gets longer. (The * repeat can match 0, 1, 2, 3, or 4 -times, and for each of those cases other than 0 or 4, the + repeats can match -different numbers of times.) When the remainder of the pattern is such that the -entire match is going to fail, PCRE has in principle to try every possible -variation, and this can take an extremely long time, even for relatively short -strings. -

      -

      -An optimization catches some of the more simple cases such as -

      -  (a+)*b
      -
      -where a literal character follows. Before embarking on the standard matching -procedure, PCRE checks that there is a "b" later in the subject string, and if -there is not, it fails the match immediately. However, when there is no -following literal this optimization cannot be used. You can see the difference -by comparing the behaviour of -
      -  (a+)*\d
      -
      -with the pattern above. The former gives a failure almost instantly when -applied to a whole line of "a" characters, whereas the latter takes an -appreciable time with strings longer than about 20 characters. -

      -

      -In many cases, the solution to this kind of performance issue is to use an -atomic group or a possessive quantifier. -

      -
      -AUTHOR -
      -

      -Philip Hazel -
      -University Computing Service -
      -Cambridge CB2 3QH, England. -
      -

      -
      -REVISION -
      -

      -Last updated: 25 August 2012 -
      -Copyright © 1997-2012 University of Cambridge. -
      -

      -Return to the PCRE index page. -

      diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcreposix.html b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcreposix.html deleted file mode 100644 index 18924cf7..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcreposix.html +++ /dev/null @@ -1,290 +0,0 @@ - - -pcreposix specification - - -

      pcreposix man page

      -

      -Return to the PCRE index page. -

      -

      -This page is part of the PCRE HTML documentation. It was generated automatically -from the original man page. If there is any nonsense in it, please consult the -man page, in case the conversion went wrong. -
      -

      -
      SYNOPSIS
      -

      -#include <pcreposix.h> -

      -

      -int regcomp(regex_t *preg, const char *pattern, - int cflags); -
      -
      -int regexec(regex_t *preg, const char *string, - size_t nmatch, regmatch_t pmatch[], int eflags); - size_t regerror(int errcode, const regex_t *preg, - char *errbuf, size_t errbuf_size); -
      -
      -void regfree(regex_t *preg); -

      -
      DESCRIPTION
      -

      -This set of functions provides a POSIX-style API for the PCRE regular -expression 8-bit library. See the -pcreapi -documentation for a description of PCRE's native API, which contains much -additional functionality. There is no POSIX-style wrapper for PCRE's 16-bit -and 32-bit library. -

      -

      -The functions described here are just wrapper functions that ultimately call -the PCRE native API. Their prototypes are defined in the pcreposix.h -header file, and on Unix systems the library itself is called -pcreposix.a, so can be accessed by adding -lpcreposix to the -command for linking an application that uses them. Because the POSIX functions -call the native ones, it is also necessary to add -lpcre. -

      -

      -I have implemented only those POSIX option bits that can be reasonably mapped -to PCRE native options. In addition, the option REG_EXTENDED is defined with -the value zero. This has no effect, but since programs that are written to the -POSIX interface often use it, this makes it easier to slot in PCRE as a -replacement library. Other POSIX options are not even defined. -

      -

      -There are also some other options that are not defined by POSIX. These have -been added at the request of users who want to make use of certain -PCRE-specific features via the POSIX calling interface. -

      -

      -When PCRE is called via these functions, it is only the API that is POSIX-like -in style. The syntax and semantics of the regular expressions themselves are -still those of Perl, subject to the setting of various PCRE options, as -described below. "POSIX-like in style" means that the API approximates to the -POSIX definition; it is not fully POSIX-compatible, and in multi-byte encoding -domains it is probably even less compatible. -

      -

      -The header for these functions is supplied as pcreposix.h to avoid any -potential clash with other POSIX libraries. It can, of course, be renamed or -aliased as regex.h, which is the "correct" name. It provides two -structure types, regex_t for compiled internal forms, and -regmatch_t for returning captured substrings. It also defines some -constants whose names start with "REG_"; these are used for setting options and -identifying error codes. -

      -
      COMPILING A PATTERN
      -

      -The function regcomp() is called to compile a pattern into an -internal form. The pattern is a C string terminated by a binary zero, and -is passed in the argument pattern. The preg argument is a pointer -to a regex_t structure that is used as a base for storing information -about the compiled regular expression. -

      -

      -The argument cflags is either zero, or contains one or more of the bits -defined by the following macros: -

      -  REG_DOTALL
      -
      -The PCRE_DOTALL option is set when the regular expression is passed for -compilation to the native function. Note that REG_DOTALL is not part of the -POSIX standard. -
      -  REG_ICASE
      -
      -The PCRE_CASELESS option is set when the regular expression is passed for -compilation to the native function. -
      -  REG_NEWLINE
      -
      -The PCRE_MULTILINE option is set when the regular expression is passed for -compilation to the native function. Note that this does not mimic the -defined POSIX behaviour for REG_NEWLINE (see the following section). -
      -  REG_NOSUB
      -
      -The PCRE_NO_AUTO_CAPTURE option is set when the regular expression is passed -for compilation to the native function. In addition, when a pattern that is -compiled with this flag is passed to regexec() for matching, the -nmatch and pmatch arguments are ignored, and no captured strings -are returned. -
      -  REG_UCP
      -
      -The PCRE_UCP option is set when the regular expression is passed for -compilation to the native function. This causes PCRE to use Unicode properties -when matchine \d, \w, etc., instead of just recognizing ASCII values. Note -that REG_UTF8 is not part of the POSIX standard. -
      -  REG_UNGREEDY
      -
      -The PCRE_UNGREEDY option is set when the regular expression is passed for -compilation to the native function. Note that REG_UNGREEDY is not part of the -POSIX standard. -
      -  REG_UTF8
      -
      -The PCRE_UTF8 option is set when the regular expression is passed for -compilation to the native function. This causes the pattern itself and all data -strings used for matching it to be treated as UTF-8 strings. Note that REG_UTF8 -is not part of the POSIX standard. -

      -

      -In the absence of these flags, no options are passed to the native function. -This means the the regex is compiled with PCRE default semantics. In -particular, the way it handles newline characters in the subject string is the -Perl way, not the POSIX way. Note that setting PCRE_MULTILINE has only -some of the effects specified for REG_NEWLINE. It does not affect the way -newlines are matched by . (they are not) or by a negative class such as [^a] -(they are). -

      -

      -The yield of regcomp() is zero on success, and non-zero otherwise. The -preg structure is filled in on success, and one member of the structure -is public: re_nsub contains the number of capturing subpatterns in -the regular expression. Various error codes are defined in the header file. -

      -

      -NOTE: If the yield of regcomp() is non-zero, you must not attempt to -use the contents of the preg structure. If, for example, you pass it to -regexec(), the result is undefined and your program is likely to crash. -

      -
      MATCHING NEWLINE CHARACTERS
      -

      -This area is not simple, because POSIX and Perl take different views of things. -It is not possible to get PCRE to obey POSIX semantics, but then PCRE was never -intended to be a POSIX engine. The following table lists the different -possibilities for matching newline characters in PCRE: -

      -                          Default   Change with
      -
      -  . matches newline          no     PCRE_DOTALL
      -  newline matches [^a]       yes    not changeable
      -  $ matches \n at end        yes    PCRE_DOLLARENDONLY
      -  $ matches \n in middle     no     PCRE_MULTILINE
      -  ^ matches \n in middle     no     PCRE_MULTILINE
      -
      -This is the equivalent table for POSIX: -
      -                          Default   Change with
      -
      -  . matches newline          yes    REG_NEWLINE
      -  newline matches [^a]       yes    REG_NEWLINE
      -  $ matches \n at end        no     REG_NEWLINE
      -  $ matches \n in middle     no     REG_NEWLINE
      -  ^ matches \n in middle     no     REG_NEWLINE
      -
      -PCRE's behaviour is the same as Perl's, except that there is no equivalent for -PCRE_DOLLAR_ENDONLY in Perl. In both PCRE and Perl, there is no way to stop -newline from matching [^a]. -

      -

      -The default POSIX newline handling can be obtained by setting PCRE_DOTALL and -PCRE_DOLLAR_ENDONLY, but there is no way to make PCRE behave exactly as for the -REG_NEWLINE action. -

      -
      MATCHING A PATTERN
      -

      -The function regexec() is called to match a compiled pattern preg -against a given string, which is by default terminated by a zero byte -(but see REG_STARTEND below), subject to the options in eflags. These can -be: -

      -  REG_NOTBOL
      -
      -The PCRE_NOTBOL option is set when calling the underlying PCRE matching -function. -
      -  REG_NOTEMPTY
      -
      -The PCRE_NOTEMPTY option is set when calling the underlying PCRE matching -function. Note that REG_NOTEMPTY is not part of the POSIX standard. However, -setting this option can give more POSIX-like behaviour in some situations. -
      -  REG_NOTEOL
      -
      -The PCRE_NOTEOL option is set when calling the underlying PCRE matching -function. -
      -  REG_STARTEND
      -
      -The string is considered to start at string + pmatch[0].rm_so and -to have a terminating NUL located at string + pmatch[0].rm_eo -(there need not actually be a NUL at that location), regardless of the value of -nmatch. This is a BSD extension, compatible with but not specified by -IEEE Standard 1003.2 (POSIX.2), and should be used with caution in software -intended to be portable to other systems. Note that a non-zero rm_so does -not imply REG_NOTBOL; REG_STARTEND affects only the location of the string, not -how it is matched. -

      -

      -If the pattern was compiled with the REG_NOSUB flag, no data about any matched -strings is returned. The nmatch and pmatch arguments of -regexec() are ignored. -

      -

      -If the value of nmatch is zero, or if the value pmatch is NULL, -no data about any matched strings is returned. -

      -

      -Otherwise,the portion of the string that was matched, and also any captured -substrings, are returned via the pmatch argument, which points to an -array of nmatch structures of type regmatch_t, containing the -members rm_so and rm_eo. These contain the offset to the first -character of each substring and the offset to the first character after the end -of each substring, respectively. The 0th element of the vector relates to the -entire portion of string that was matched; subsequent elements relate to -the capturing subpatterns of the regular expression. Unused entries in the -array have both structure members set to -1. -

      -

      -A successful match yields a zero return; various error codes are defined in the -header file, of which REG_NOMATCH is the "expected" failure code. -

      -
      ERROR MESSAGES
      -

      -The regerror() function maps a non-zero errorcode from either -regcomp() or regexec() to a printable message. If preg is not -NULL, the error should have arisen from the use of that structure. A message -terminated by a binary zero is placed in errbuf. The length of the -message, including the zero, is limited to errbuf_size. The yield of the -function is the size of buffer needed to hold the whole message. -

      -
      MEMORY USAGE
      -

      -Compiling a regular expression causes memory to be allocated and associated -with the preg structure. The function regfree() frees all such -memory, after which preg may no longer be used as a compiled expression. -

      -
      AUTHOR
      -

      -Philip Hazel -
      -University Computing Service -
      -Cambridge CB2 3QH, England. -
      -

      -
      REVISION
      -

      -Last updated: 09 January 2012 -
      -Copyright © 1997-2012 University of Cambridge. -
      -

      -Return to the PCRE index page. -

      diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcreprecompile.html b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcreprecompile.html deleted file mode 100644 index decb1d6c..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcreprecompile.html +++ /dev/null @@ -1,163 +0,0 @@ - - -pcreprecompile specification - - -

      pcreprecompile man page

      -

      -Return to the PCRE index page. -

      -

      -This page is part of the PCRE HTML documentation. It was generated automatically -from the original man page. If there is any nonsense in it, please consult the -man page, in case the conversion went wrong. -
      -

      -
      SAVING AND RE-USING PRECOMPILED PCRE PATTERNS
      -

      -If you are running an application that uses a large number of regular -expression patterns, it may be useful to store them in a precompiled form -instead of having to compile them every time the application is run. -If you are not using any private character tables (see the -pcre_maketables() -documentation), this is relatively straightforward. If you are using private -tables, it is a little bit more complicated. However, if you are using the -just-in-time optimization feature, it is not possible to save and reload the -JIT data. -

      -

      -If you save compiled patterns to a file, you can copy them to a different host -and run them there. If the two hosts have different endianness (byte order), -you should run the pcre[16|32]_pattern_to_host_byte_order() function on the -new host before trying to match the pattern. The matching functions return -PCRE_ERROR_BADENDIANNESS if they detect a pattern with the wrong endianness. -

      -

      -Compiling regular expressions with one version of PCRE for use with a different -version is not guaranteed to work and may cause crashes, and saving and -restoring a compiled pattern loses any JIT optimization data. -

      -
      SAVING A COMPILED PATTERN
      -

      -The value returned by pcre[16|32]_compile() points to a single block of -memory that holds the compiled pattern and associated data. You can find the -length of this block in bytes by calling pcre[16|32]_fullinfo() with an -argument of PCRE_INFO_SIZE. You can then save the data in any appropriate -manner. Here is sample code for the 8-bit library that compiles a pattern and -writes it to a file. It assumes that the variable fd refers to a file -that is open for output: -

      -  int erroroffset, rc, size;
      -  char *error;
      -  pcre *re;
      -
      -  re = pcre_compile("my pattern", 0, &error, &erroroffset, NULL);
      -  if (re == NULL) { ... handle errors ... }
      -  rc = pcre_fullinfo(re, NULL, PCRE_INFO_SIZE, &size);
      -  if (rc < 0) { ... handle errors ... }
      -  rc = fwrite(re, 1, size, fd);
      -  if (rc != size) { ... handle errors ... }
      -
      -In this example, the bytes that comprise the compiled pattern are copied -exactly. Note that this is binary data that may contain any of the 256 possible -byte values. On systems that make a distinction between binary and non-binary -data, be sure that the file is opened for binary output. -

      -

      -If you want to write more than one pattern to a file, you will have to devise a -way of separating them. For binary data, preceding each pattern with its length -is probably the most straightforward approach. Another possibility is to write -out the data in hexadecimal instead of binary, one pattern to a line. -

      -

      -Saving compiled patterns in a file is only one possible way of storing them for -later use. They could equally well be saved in a database, or in the memory of -some daemon process that passes them via sockets to the processes that want -them. -

      -

      -If the pattern has been studied, it is also possible to save the normal study -data in a similar way to the compiled pattern itself. However, if the -PCRE_STUDY_JIT_COMPILE was used, the just-in-time data that is created cannot -be saved because it is too dependent on the current environment. When studying -generates additional information, pcre[16|32]_study() returns a pointer to a -pcre[16|32]_extra data block. Its format is defined in the -section on matching a pattern -in the -pcreapi -documentation. The study_data field points to the binary study data, and -this is what you must save (not the pcre[16|32]_extra block itself). The -length of the study data can be obtained by calling pcre[16|32]_fullinfo() -with an argument of PCRE_INFO_STUDYSIZE. Remember to check that -pcre[16|32]_study() did return a non-NULL value before trying to save the -study data. -

      -
      RE-USING A PRECOMPILED PATTERN
      -

      -Re-using a precompiled pattern is straightforward. Having reloaded it into main -memory, called pcre[16|32]_pattern_to_host_byte_order() if necessary, you -pass its pointer to pcre[16|32]_exec() or pcre[16|32]_dfa_exec() in -the usual way. -

      -

      -However, if you passed a pointer to custom character tables when the pattern -was compiled (the tableptr argument of pcre[16|32]_compile()), you -must now pass a similar pointer to pcre[16|32]_exec() or -pcre[16|32]_dfa_exec(), because the value saved with the compiled pattern -will obviously be nonsense. A field in a pcre[16|32]_extra() block is used -to pass this data, as described in the -section on matching a pattern -in the -pcreapi -documentation. -

      -

      -Warning: The tables that pcre_exec() and pcre_dfa_exec() use -must be the same as those that were used when the pattern was compiled. If this -is not the case, the behaviour is undefined. -

      -

      -If you did not provide custom character tables when the pattern was compiled, -the pointer in the compiled pattern is NULL, which causes the matching -functions to use PCRE's internal tables. Thus, you do not need to take any -special action at run time in this case. -

      -

      -If you saved study data with the compiled pattern, you need to create your own -pcre[16|32]_extra data block and set the study_data field to point -to the reloaded study data. You must also set the PCRE_EXTRA_STUDY_DATA bit in -the flags field to indicate that study data is present. Then pass the -pcre[16|32]_extra block to the matching function in the usual way. If the -pattern was studied for just-in-time optimization, that data cannot be saved, -and so is lost by a save/restore cycle. -

      -
      COMPATIBILITY WITH DIFFERENT PCRE RELEASES
      -

      -In general, it is safest to recompile all saved patterns when you update to a -new PCRE release, though not all updates actually require this. -

      -
      AUTHOR
      -

      -Philip Hazel -
      -University Computing Service -
      -Cambridge CB2 3QH, England. -
      -

      -
      REVISION
      -

      -Last updated: 12 November 2013 -
      -Copyright © 1997-2013 University of Cambridge. -
      -

      -Return to the PCRE index page. -

      diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcresample.html b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcresample.html deleted file mode 100644 index aca9184e..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcresample.html +++ /dev/null @@ -1,110 +0,0 @@ - - -pcresample specification - - -

      pcresample man page

      -

      -Return to the PCRE index page. -

      -

      -This page is part of the PCRE HTML documentation. It was generated automatically -from the original man page. If there is any nonsense in it, please consult the -man page, in case the conversion went wrong. -
      -
      -PCRE SAMPLE PROGRAM -
      -

      -A simple, complete demonstration program, to get you started with using PCRE, -is supplied in the file pcredemo.c in the PCRE distribution. A listing of -this program is given in the -pcredemo -documentation. If you do not have a copy of the PCRE distribution, you can save -this listing to re-create pcredemo.c. -

      -

      -The demonstration program, which uses the original PCRE 8-bit library, compiles -the regular expression that is its first argument, and matches it against the -subject string in its second argument. No PCRE options are set, and default -character tables are used. If matching succeeds, the program outputs the -portion of the subject that matched, together with the contents of any captured -substrings. -

      -

      -If the -g option is given on the command line, the program then goes on to -check for further matches of the same regular expression in the same subject -string. The logic is a little bit tricky because of the possibility of matching -an empty string. Comments in the code explain what is going on. -

      -

      -If PCRE is installed in the standard include and library directories for your -operating system, you should be able to compile the demonstration program using -this command: -

      -  gcc -o pcredemo pcredemo.c -lpcre
      -
      -If PCRE is installed elsewhere, you may need to add additional options to the -command line. For example, on a Unix-like system that has PCRE installed in -/usr/local, you can compile the demonstration program using a command -like this: -
      -  gcc -o pcredemo -I/usr/local/include pcredemo.c -L/usr/local/lib -lpcre
      -
      -In a Windows environment, if you want to statically link the program against a -non-dll pcre.a file, you must uncomment the line that defines PCRE_STATIC -before including pcre.h, because otherwise the pcre_malloc() and -pcre_free() exported functions will be declared -__declspec(dllimport), with unwanted results. -

      -

      -Once you have compiled and linked the demonstration program, you can run simple -tests like this: -

      -  ./pcredemo 'cat|dog' 'the cat sat on the mat'
      -  ./pcredemo -g 'cat|dog' 'the dog sat on the cat'
      -
      -Note that there is a much more comprehensive test program, called -pcretest, -which supports many more facilities for testing regular expressions and both -PCRE libraries. The -pcredemo -program is provided as a simple coding example. -

      -

      -If you try to run -pcredemo -when PCRE is not installed in the standard library directory, you may get an -error like this on some operating systems (e.g. Solaris): -

      -  ld.so.1: a.out: fatal: libpcre.so.0: open failed: No such file or directory
      -
      -This is caused by the way shared library support works on those systems. You -need to add -
      -  -R/usr/local/lib
      -
      -(for example) to the compile command to get round this problem. -

      -
      -AUTHOR -
      -

      -Philip Hazel -
      -University Computing Service -
      -Cambridge CB2 3QH, England. -
      -

      -
      -REVISION -
      -

      -Last updated: 10 January 2012 -
      -Copyright © 1997-2012 University of Cambridge. -
      -

      -Return to the PCRE index page. -

      diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcrestack.html b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcrestack.html deleted file mode 100644 index af6406d0..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcrestack.html +++ /dev/null @@ -1,225 +0,0 @@ - - -pcrestack specification - - -

      pcrestack man page

      -

      -Return to the PCRE index page. -

      -

      -This page is part of the PCRE HTML documentation. It was generated automatically -from the original man page. If there is any nonsense in it, please consult the -man page, in case the conversion went wrong. -
      -
      -PCRE DISCUSSION OF STACK USAGE -
      -

      -When you call pcre[16|32]_exec(), it makes use of an internal function -called match(). This calls itself recursively at branch points in the -pattern, in order to remember the state of the match so that it can back up and -try a different alternative if the first one fails. As matching proceeds deeper -and deeper into the tree of possibilities, the recursion depth increases. The -match() function is also called in other circumstances, for example, -whenever a parenthesized sub-pattern is entered, and in certain cases of -repetition. -

      -

      -Not all calls of match() increase the recursion depth; for an item such -as a* it may be called several times at the same level, after matching -different numbers of a's. Furthermore, in a number of cases where the result of -the recursive call would immediately be passed back as the result of the -current call (a "tail recursion"), the function is just restarted instead. -

      -

      -The above comments apply when pcre[16|32]_exec() is run in its normal -interpretive manner. If the pattern was studied with the -PCRE_STUDY_JIT_COMPILE option, and just-in-time compiling was successful, and -the options passed to pcre[16|32]_exec() were not incompatible, the matching -process uses the JIT-compiled code instead of the match() function. In -this case, the memory requirements are handled entirely differently. See the -pcrejit -documentation for details. -

      -

      -The pcre[16|32]_dfa_exec() function operates in an entirely different way, -and uses recursion only when there is a regular expression recursion or -subroutine call in the pattern. This includes the processing of assertion and -"once-only" subpatterns, which are handled like subroutine calls. Normally, -these are never very deep, and the limit on the complexity of -pcre[16|32]_dfa_exec() is controlled by the amount of workspace it is given. -However, it is possible to write patterns with runaway infinite recursions; -such patterns will cause pcre[16|32]_dfa_exec() to run out of stack. At -present, there is no protection against this. -

      -

      -The comments that follow do NOT apply to pcre[16|32]_dfa_exec(); they are -relevant only for pcre[16|32]_exec() without the JIT optimization. -

      -
      -Reducing pcre[16|32]_exec()'s stack usage -
      -

      -Each time that match() is actually called recursively, it uses memory -from the process stack. For certain kinds of pattern and data, very large -amounts of stack may be needed, despite the recognition of "tail recursion". -You can often reduce the amount of recursion, and therefore the amount of stack -used, by modifying the pattern that is being matched. Consider, for example, -this pattern: -

      -  ([^<]|<(?!inet))+
      -
      -It matches from wherever it starts until it encounters "<inet" or the end of -the data, and is the kind of pattern that might be used when processing an XML -file. Each iteration of the outer parentheses matches either one character that -is not "<" or a "<" that is not followed by "inet". However, each time a -parenthesis is processed, a recursion occurs, so this formulation uses a stack -frame for each matched character. For a long string, a lot of stack is -required. Consider now this rewritten pattern, which matches exactly the same -strings: -
      -  ([^<]++|<(?!inet))+
      -
      -This uses very much less stack, because runs of characters that do not contain -"<" are "swallowed" in one item inside the parentheses. Recursion happens only -when a "<" character that is not followed by "inet" is encountered (and we -assume this is relatively rare). A possessive quantifier is used to stop any -backtracking into the runs of non-"<" characters, but that is not related to -stack usage. -

      -

      -This example shows that one way of avoiding stack problems when matching long -subject strings is to write repeated parenthesized subpatterns to match more -than one character whenever possible. -

      -
      -Compiling PCRE to use heap instead of stack for pcre[16|32]_exec() -
      -

      -In environments where stack memory is constrained, you might want to compile -PCRE to use heap memory instead of stack for remembering back-up points when -pcre[16|32]_exec() is running. This makes it run a lot more slowly, however. -Details of how to do this are given in the -pcrebuild -documentation. When built in this way, instead of using the stack, PCRE obtains -and frees memory by calling the functions that are pointed to by the -pcre[16|32]_stack_malloc and pcre[16|32]_stack_free variables. By -default, these point to malloc() and free(), but you can replace -the pointers to cause PCRE to use your own functions. Since the block sizes are -always the same, and are always freed in reverse order, it may be possible to -implement customized memory handlers that are more efficient than the standard -functions. -

      -
      -Limiting pcre[16|32]_exec()'s stack usage -
      -

      -You can set limits on the number of times that match() is called, both in -total and recursively. If a limit is exceeded, pcre[16|32]_exec() returns an -error code. Setting suitable limits should prevent it from running out of -stack. The default values of the limits are very large, and unlikely ever to -operate. They can be changed when PCRE is built, and they can also be set when -pcre[16|32]_exec() is called. For details of these interfaces, see the -pcrebuild -documentation and the -section on extra data for pcre[16|32]_exec() -in the -pcreapi -documentation. -

      -

      -As a very rough rule of thumb, you should reckon on about 500 bytes per -recursion. Thus, if you want to limit your stack usage to 8Mb, you should set -the limit at 16000 recursions. A 64Mb stack, on the other hand, can support -around 128000 recursions. -

      -

      -In Unix-like environments, the pcretest test program has a command line -option (-S) that can be used to increase the size of its stack. As long -as the stack is large enough, another option (-M) can be used to find the -smallest limits that allow a particular pattern to match a given subject -string. This is done by calling pcre[16|32]_exec() repeatedly with different -limits. -

      -
      -Obtaining an estimate of stack usage -
      -

      -The actual amount of stack used per recursion can vary quite a lot, depending -on the compiler that was used to build PCRE and the optimization or debugging -options that were set for it. The rule of thumb value of 500 bytes mentioned -above may be larger or smaller than what is actually needed. A better -approximation can be obtained by running this command: -

      -  pcretest -m -C
      -
      -The -C option causes pcretest to output information about the -options with which PCRE was compiled. When -m is also given (before --C), information about stack use is given in a line like this: -
      -  Match recursion uses stack: approximate frame size = 640 bytes
      -
      -The value is approximate because some recursions need a bit more (up to perhaps -16 more bytes). -

      -

      -If the above command is given when PCRE is compiled to use the heap instead of -the stack for recursion, the value that is output is the size of each block -that is obtained from the heap. -

      -
      -Changing stack size in Unix-like systems -
      -

      -In Unix-like environments, there is not often a problem with the stack unless -very long strings are involved, though the default limit on stack size varies -from system to system. Values from 8Mb to 64Mb are common. You can find your -default limit by running the command: -

      -  ulimit -s
      -
      -Unfortunately, the effect of running out of stack is often SIGSEGV, though -sometimes a more explicit error message is given. You can normally increase the -limit on stack size by code such as this: -
      -  struct rlimit rlim;
      -  getrlimit(RLIMIT_STACK, &rlim);
      -  rlim.rlim_cur = 100*1024*1024;
      -  setrlimit(RLIMIT_STACK, &rlim);
      -
      -This reads the current limits (soft and hard) using getrlimit(), then -attempts to increase the soft limit to 100Mb using setrlimit(). You must -do this before calling pcre[16|32]_exec(). -

      -
      -Changing stack size in Mac OS X -
      -

      -Using setrlimit(), as described above, should also work on Mac OS X. It -is also possible to set a stack size when linking a program. There is a -discussion about stack sizes in Mac OS X at this web site: -http://developer.apple.com/qa/qa2005/qa1419.html. -

      -
      -AUTHOR -
      -

      -Philip Hazel -
      -University Computing Service -
      -Cambridge CB2 3QH, England. -
      -

      -
      -REVISION -
      -

      -Last updated: 24 June 2012 -
      -Copyright © 1997-2012 University of Cambridge. -
      -

      -Return to the PCRE index page. -

      diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcresyntax.html b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcresyntax.html deleted file mode 100644 index 5896b9e0..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcresyntax.html +++ /dev/null @@ -1,561 +0,0 @@ - - -pcresyntax specification - - -

      pcresyntax man page

      -

      -Return to the PCRE index page. -

      -

      -This page is part of the PCRE HTML documentation. It was generated automatically -from the original man page. If there is any nonsense in it, please consult the -man page, in case the conversion went wrong. -
      -

      -
      PCRE REGULAR EXPRESSION SYNTAX SUMMARY
      -

      -The full syntax and semantics of the regular expressions that are supported by -PCRE are described in the -pcrepattern -documentation. This document contains a quick-reference summary of the syntax. -

      -
      QUOTING
      -

      -

      -  \x         where x is non-alphanumeric is a literal x
      -  \Q...\E    treat enclosed characters as literal
      -
      -

      -
      CHARACTERS
      -

      -

      -  \a         alarm, that is, the BEL character (hex 07)
      -  \cx        "control-x", where x is any ASCII character
      -  \e         escape (hex 1B)
      -  \f         form feed (hex 0C)
      -  \n         newline (hex 0A)
      -  \r         carriage return (hex 0D)
      -  \t         tab (hex 09)
      -  \0dd       character with octal code 0dd
      -  \ddd       character with octal code ddd, or backreference
      -  \o{ddd..}  character with octal code ddd..
      -  \xhh       character with hex code hh
      -  \x{hhh..}  character with hex code hhh..
      -
      -Note that \0dd is always an octal code, and that \8 and \9 are the literal -characters "8" and "9". -

      -
      CHARACTER TYPES
      -

      -

      -  .          any character except newline;
      -               in dotall mode, any character whatsoever
      -  \C         one data unit, even in UTF mode (best avoided)
      -  \d         a decimal digit
      -  \D         a character that is not a decimal digit
      -  \h         a horizontal white space character
      -  \H         a character that is not a horizontal white space character
      -  \N         a character that is not a newline
      -  \p{xx}     a character with the xx property
      -  \P{xx}     a character without the xx property
      -  \R         a newline sequence
      -  \s         a white space character
      -  \S         a character that is not a white space character
      -  \v         a vertical white space character
      -  \V         a character that is not a vertical white space character
      -  \w         a "word" character
      -  \W         a "non-word" character
      -  \X         a Unicode extended grapheme cluster
      -
      -By default, \d, \s, and \w match only ASCII characters, even in UTF-8 mode -or in the 16- bit and 32-bit libraries. However, if locale-specific matching is -happening, \s and \w may also match characters with code points in the range -128-255. If the PCRE_UCP option is set, the behaviour of these escape sequences -is changed to use Unicode properties and they match many more characters. -

      -
      GENERAL CATEGORY PROPERTIES FOR \p and \P
      -

      -

      -  C          Other
      -  Cc         Control
      -  Cf         Format
      -  Cn         Unassigned
      -  Co         Private use
      -  Cs         Surrogate
      -
      -  L          Letter
      -  Ll         Lower case letter
      -  Lm         Modifier letter
      -  Lo         Other letter
      -  Lt         Title case letter
      -  Lu         Upper case letter
      -  L&         Ll, Lu, or Lt
      -
      -  M          Mark
      -  Mc         Spacing mark
      -  Me         Enclosing mark
      -  Mn         Non-spacing mark
      -
      -  N          Number
      -  Nd         Decimal number
      -  Nl         Letter number
      -  No         Other number
      -
      -  P          Punctuation
      -  Pc         Connector punctuation
      -  Pd         Dash punctuation
      -  Pe         Close punctuation
      -  Pf         Final punctuation
      -  Pi         Initial punctuation
      -  Po         Other punctuation
      -  Ps         Open punctuation
      -
      -  S          Symbol
      -  Sc         Currency symbol
      -  Sk         Modifier symbol
      -  Sm         Mathematical symbol
      -  So         Other symbol
      -
      -  Z          Separator
      -  Zl         Line separator
      -  Zp         Paragraph separator
      -  Zs         Space separator
      -
      -

      -
      PCRE SPECIAL CATEGORY PROPERTIES FOR \p and \P
      -

      -

      -  Xan        Alphanumeric: union of properties L and N
      -  Xps        POSIX space: property Z or tab, NL, VT, FF, CR
      -  Xsp        Perl space: property Z or tab, NL, VT, FF, CR
      -  Xuc        Univerally-named character: one that can be
      -               represented by a Universal Character Name
      -  Xwd        Perl word: property Xan or underscore
      -
      -Perl and POSIX space are now the same. Perl added VT to its space character set -at release 5.18 and PCRE changed at release 8.34. -

      -
      SCRIPT NAMES FOR \p AND \P
      -

      -Arabic, -Armenian, -Avestan, -Balinese, -Bamum, -Bassa_Vah, -Batak, -Bengali, -Bopomofo, -Brahmi, -Braille, -Buginese, -Buhid, -Canadian_Aboriginal, -Carian, -Caucasian_Albanian, -Chakma, -Cham, -Cherokee, -Common, -Coptic, -Cuneiform, -Cypriot, -Cyrillic, -Deseret, -Devanagari, -Duployan, -Egyptian_Hieroglyphs, -Elbasan, -Ethiopic, -Georgian, -Glagolitic, -Gothic, -Grantha, -Greek, -Gujarati, -Gurmukhi, -Han, -Hangul, -Hanunoo, -Hebrew, -Hiragana, -Imperial_Aramaic, -Inherited, -Inscriptional_Pahlavi, -Inscriptional_Parthian, -Javanese, -Kaithi, -Kannada, -Katakana, -Kayah_Li, -Kharoshthi, -Khmer, -Khojki, -Khudawadi, -Lao, -Latin, -Lepcha, -Limbu, -Linear_A, -Linear_B, -Lisu, -Lycian, -Lydian, -Mahajani, -Malayalam, -Mandaic, -Manichaean, -Meetei_Mayek, -Mende_Kikakui, -Meroitic_Cursive, -Meroitic_Hieroglyphs, -Miao, -Modi, -Mongolian, -Mro, -Myanmar, -Nabataean, -New_Tai_Lue, -Nko, -Ogham, -Ol_Chiki, -Old_Italic, -Old_North_Arabian, -Old_Permic, -Old_Persian, -Old_South_Arabian, -Old_Turkic, -Oriya, -Osmanya, -Pahawh_Hmong, -Palmyrene, -Pau_Cin_Hau, -Phags_Pa, -Phoenician, -Psalter_Pahlavi, -Rejang, -Runic, -Samaritan, -Saurashtra, -Sharada, -Shavian, -Siddham, -Sinhala, -Sora_Sompeng, -Sundanese, -Syloti_Nagri, -Syriac, -Tagalog, -Tagbanwa, -Tai_Le, -Tai_Tham, -Tai_Viet, -Takri, -Tamil, -Telugu, -Thaana, -Thai, -Tibetan, -Tifinagh, -Tirhuta, -Ugaritic, -Vai, -Warang_Citi, -Yi. -

      -
      CHARACTER CLASSES
      -

      -

      -  [...]       positive character class
      -  [^...]      negative character class
      -  [x-y]       range (can be used for hex characters)
      -  [[:xxx:]]   positive POSIX named set
      -  [[:^xxx:]]  negative POSIX named set
      -
      -  alnum       alphanumeric
      -  alpha       alphabetic
      -  ascii       0-127
      -  blank       space or tab
      -  cntrl       control character
      -  digit       decimal digit
      -  graph       printing, excluding space
      -  lower       lower case letter
      -  print       printing, including space
      -  punct       printing, excluding alphanumeric
      -  space       white space
      -  upper       upper case letter
      -  word        same as \w
      -  xdigit      hexadecimal digit
      -
      -In PCRE, POSIX character set names recognize only ASCII characters by default, -but some of them use Unicode properties if PCRE_UCP is set. You can use -\Q...\E inside a character class. -

      -
      QUANTIFIERS
      -

      -

      -  ?           0 or 1, greedy
      -  ?+          0 or 1, possessive
      -  ??          0 or 1, lazy
      -  *           0 or more, greedy
      -  *+          0 or more, possessive
      -  *?          0 or more, lazy
      -  +           1 or more, greedy
      -  ++          1 or more, possessive
      -  +?          1 or more, lazy
      -  {n}         exactly n
      -  {n,m}       at least n, no more than m, greedy
      -  {n,m}+      at least n, no more than m, possessive
      -  {n,m}?      at least n, no more than m, lazy
      -  {n,}        n or more, greedy
      -  {n,}+       n or more, possessive
      -  {n,}?       n or more, lazy
      -
      -

      -
      ANCHORS AND SIMPLE ASSERTIONS
      -

      -

      -  \b          word boundary
      -  \B          not a word boundary
      -  ^           start of subject
      -               also after internal newline in multiline mode
      -  \A          start of subject
      -  $           end of subject
      -               also before newline at end of subject
      -               also before internal newline in multiline mode
      -  \Z          end of subject
      -               also before newline at end of subject
      -  \z          end of subject
      -  \G          first matching position in subject
      -
      -

      -
      MATCH POINT RESET
      -

      -

      -  \K          reset start of match
      -
      -\K is honoured in positive assertions, but ignored in negative ones. -

      -
      ALTERNATION
      -

      -

      -  expr|expr|expr...
      -
      -

      -
      CAPTURING
      -

      -

      -  (...)           capturing group
      -  (?<name>...)    named capturing group (Perl)
      -  (?'name'...)    named capturing group (Perl)
      -  (?P<name>...)   named capturing group (Python)
      -  (?:...)         non-capturing group
      -  (?|...)         non-capturing group; reset group numbers for
      -                   capturing groups in each alternative
      -
      -

      -
      ATOMIC GROUPS
      -

      -

      -  (?>...)         atomic, non-capturing group
      -
      -

      -
      COMMENT
      -

      -

      -  (?#....)        comment (not nestable)
      -
      -

      -
      OPTION SETTING
      -

      -

      -  (?i)            caseless
      -  (?J)            allow duplicate names
      -  (?m)            multiline
      -  (?s)            single line (dotall)
      -  (?U)            default ungreedy (lazy)
      -  (?x)            extended (ignore white space)
      -  (?-...)         unset option(s)
      -
      -The following are recognized only at the very start of a pattern or after one -of the newline or \R options with similar syntax. More than one of them may -appear. -
      -  (*LIMIT_MATCH=d) set the match limit to d (decimal number)
      -  (*LIMIT_RECURSION=d) set the recursion limit to d (decimal number)
      -  (*NO_AUTO_POSSESS) no auto-possessification (PCRE_NO_AUTO_POSSESS)
      -  (*NO_START_OPT) no start-match optimization (PCRE_NO_START_OPTIMIZE)
      -  (*UTF8)         set UTF-8 mode: 8-bit library (PCRE_UTF8)
      -  (*UTF16)        set UTF-16 mode: 16-bit library (PCRE_UTF16)
      -  (*UTF32)        set UTF-32 mode: 32-bit library (PCRE_UTF32)
      -  (*UTF)          set appropriate UTF mode for the library in use
      -  (*UCP)          set PCRE_UCP (use Unicode properties for \d etc)
      -
      -Note that LIMIT_MATCH and LIMIT_RECURSION can only reduce the value of the -limits set by the caller of pcre_exec(), not increase them. -

      -
      NEWLINE CONVENTION
      -

      -These are recognized only at the very start of the pattern or after option -settings with a similar syntax. -

      -  (*CR)           carriage return only
      -  (*LF)           linefeed only
      -  (*CRLF)         carriage return followed by linefeed
      -  (*ANYCRLF)      all three of the above
      -  (*ANY)          any Unicode newline sequence
      -
      -

      -
      WHAT \R MATCHES
      -

      -These are recognized only at the very start of the pattern or after option -setting with a similar syntax. -

      -  (*BSR_ANYCRLF)  CR, LF, or CRLF
      -  (*BSR_UNICODE)  any Unicode newline sequence
      -
      -

      -
      LOOKAHEAD AND LOOKBEHIND ASSERTIONS
      -

      -

      -  (?=...)         positive look ahead
      -  (?!...)         negative look ahead
      -  (?<=...)        positive look behind
      -  (?<!...)        negative look behind
      -
      -Each top-level branch of a look behind must be of a fixed length. -

      -
      BACKREFERENCES
      -

      -

      -  \n              reference by number (can be ambiguous)
      -  \gn             reference by number
      -  \g{n}           reference by number
      -  \g{-n}          relative reference by number
      -  \k<name>        reference by name (Perl)
      -  \k'name'        reference by name (Perl)
      -  \g{name}        reference by name (Perl)
      -  \k{name}        reference by name (.NET)
      -  (?P=name)       reference by name (Python)
      -
      -

      -
      SUBROUTINE REFERENCES (POSSIBLY RECURSIVE)
      -

      -

      -  (?R)            recurse whole pattern
      -  (?n)            call subpattern by absolute number
      -  (?+n)           call subpattern by relative number
      -  (?-n)           call subpattern by relative number
      -  (?&name)        call subpattern by name (Perl)
      -  (?P>name)       call subpattern by name (Python)
      -  \g<name>        call subpattern by name (Oniguruma)
      -  \g'name'        call subpattern by name (Oniguruma)
      -  \g<n>           call subpattern by absolute number (Oniguruma)
      -  \g'n'           call subpattern by absolute number (Oniguruma)
      -  \g<+n>          call subpattern by relative number (PCRE extension)
      -  \g'+n'          call subpattern by relative number (PCRE extension)
      -  \g<-n>          call subpattern by relative number (PCRE extension)
      -  \g'-n'          call subpattern by relative number (PCRE extension)
      -
      -

      -
      CONDITIONAL PATTERNS
      -

      -

      -  (?(condition)yes-pattern)
      -  (?(condition)yes-pattern|no-pattern)
      -
      -  (?(n)...        absolute reference condition
      -  (?(+n)...       relative reference condition
      -  (?(-n)...       relative reference condition
      -  (?(<name>)...   named reference condition (Perl)
      -  (?('name')...   named reference condition (Perl)
      -  (?(name)...     named reference condition (PCRE)
      -  (?(R)...        overall recursion condition
      -  (?(Rn)...       specific group recursion condition
      -  (?(R&name)...   specific recursion condition
      -  (?(DEFINE)...   define subpattern for reference
      -  (?(assert)...   assertion condition
      -
      -

      -
      BACKTRACKING CONTROL
      -

      -The following act immediately they are reached: -

      -  (*ACCEPT)       force successful match
      -  (*FAIL)         force backtrack; synonym (*F)
      -  (*MARK:NAME)    set name to be passed back; synonym (*:NAME)
      -
      -The following act only when a subsequent match failure causes a backtrack to -reach them. They all force a match failure, but they differ in what happens -afterwards. Those that advance the start-of-match point do so only if the -pattern is not anchored. -
      -  (*COMMIT)       overall failure, no advance of starting point
      -  (*PRUNE)        advance to next starting character
      -  (*PRUNE:NAME)   equivalent to (*MARK:NAME)(*PRUNE)
      -  (*SKIP)         advance to current matching position
      -  (*SKIP:NAME)    advance to position corresponding to an earlier
      -                  (*MARK:NAME); if not found, the (*SKIP) is ignored
      -  (*THEN)         local failure, backtrack to next alternation
      -  (*THEN:NAME)    equivalent to (*MARK:NAME)(*THEN)
      -
      -

      -
      CALLOUTS
      -

      -

      -  (?C)      callout
      -  (?Cn)     callout with data n
      -
      -

      -
      SEE ALSO
      -

      -pcrepattern(3), pcreapi(3), pcrecallout(3), -pcrematching(3), pcre(3). -

      -
      AUTHOR
      -

      -Philip Hazel -
      -University Computing Service -
      -Cambridge CB2 3QH, England. -
      -

      -
      REVISION
      -

      -Last updated: 08 January 2014 -
      -Copyright © 1997-2014 University of Cambridge. -
      -

      -Return to the PCRE index page. -

      diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcretest.html b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcretest.html deleted file mode 100644 index ba540d3c..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcretest.html +++ /dev/null @@ -1,1163 +0,0 @@ - - -pcretest specification - - -

      pcretest man page

      -

      -Return to the PCRE index page. -

      -

      -This page is part of the PCRE HTML documentation. It was generated automatically -from the original man page. If there is any nonsense in it, please consult the -man page, in case the conversion went wrong. -
      -

      -
      SYNOPSIS
      -

      -pcretest [options] [input file [output file]] -
      -
      -pcretest was written as a test program for the PCRE regular expression -library itself, but it can also be used for experimenting with regular -expressions. This document describes the features of the test program; for -details of the regular expressions themselves, see the -pcrepattern -documentation. For details of the PCRE library function calls and their -options, see the -pcreapi -, -pcre16 -and -pcre32 -documentation. -

      -

      -The input for pcretest is a sequence of regular expression patterns and -strings to be matched, as described below. The output shows the result of each -match. Options on the command line and the patterns control PCRE options and -exactly what is output. -

      -

      -As PCRE has evolved, it has acquired many different features, and as a result, -pcretest now has rather a lot of obscure options for testing every -possible feature. Some of these options are specifically designed for use in -conjunction with the test script and data files that are distributed as part of -PCRE, and are unlikely to be of use otherwise. They are all documented here, -but without much justification. -

      -
      INPUT DATA FORMAT
      -

      -Input to pcretest is processed line by line, either by calling the C -library's fgets() function, or via the libreadline library (see -below). In Unix-like environments, fgets() treats any bytes other than -newline as data characters. However, in some Windows environments character 26 -(hex 1A) causes an immediate end of file, and no further data is read. For -maximum portability, therefore, it is safest to use only ASCII characters in -pcretest input files. -

      -

      -The input is processed using using C's string functions, so must not -contain binary zeroes, even though in Unix-like environments, fgets() -treats any bytes other than newline as data characters. -

      -
      PCRE's 8-BIT, 16-BIT AND 32-BIT LIBRARIES
      -

      -From release 8.30, two separate PCRE libraries can be built. The original one -supports 8-bit character strings, whereas the newer 16-bit library supports -character strings encoded in 16-bit units. From release 8.32, a third library -can be built, supporting character strings encoded in 32-bit units. The -pcretest program can be used to test all three libraries. However, it is -itself still an 8-bit program, reading 8-bit input and writing 8-bit output. -When testing the 16-bit or 32-bit library, the patterns and data strings are -converted to 16- or 32-bit format before being passed to the PCRE library -functions. Results are converted to 8-bit for output. -

      -

      -References to functions and structures of the form pcre[16|32]_xx below -mean "pcre_xx when using the 8-bit library, pcre16_xx when using -the 16-bit library, or pcre32_xx when using the 32-bit library". -

      -
      COMMAND LINE OPTIONS
      -

      --8 -If both the 8-bit library has been built, this option causes the 8-bit library -to be used (which is the default); if the 8-bit library has not been built, -this option causes an error. -

      -

      --16 -If both the 8-bit or the 32-bit, and the 16-bit libraries have been built, this -option causes the 16-bit library to be used. If only the 16-bit library has been -built, this is the default (so has no effect). If only the 8-bit or the 32-bit -library has been built, this option causes an error. -

      -

      --32 -If both the 8-bit or the 16-bit, and the 32-bit libraries have been built, this -option causes the 32-bit library to be used. If only the 32-bit library has been -built, this is the default (so has no effect). If only the 8-bit or the 16-bit -library has been built, this option causes an error. -

      -

      --b -Behave as if each pattern has the /B (show byte code) modifier; the -internal form is output after compilation. -

      -

      --C -Output the version number of the PCRE library, and all available information -about the optional features that are included, and then exit with zero exit -code. All other options are ignored. -

      -

      --C option -Output information about a specific build-time option, then exit. This -functionality is intended for use in scripts such as RunTest. The -following options output the value and set the exit code as indicated: -

      -  ebcdic-nl  the code for LF (= NL) in an EBCDIC environment:
      -               0x15 or 0x25
      -               0 if used in an ASCII environment
      -               exit code is always 0
      -  linksize   the configured internal link size (2, 3, or 4)
      -               exit code is set to the link size
      -  newline    the default newline setting:
      -               CR, LF, CRLF, ANYCRLF, or ANY
      -               exit code is always 0
      -  bsr        the default setting for what \R matches:
      -               ANYCRLF or ANY
      -               exit code is always 0
      -
      -The following options output 1 for true or 0 for false, and set the exit code -to the same value: -
      -  ebcdic     compiled for an EBCDIC environment
      -  jit        just-in-time support is available
      -  pcre16     the 16-bit library was built
      -  pcre32     the 32-bit library was built
      -  pcre8      the 8-bit library was built
      -  ucp        Unicode property support is available
      -  utf        UTF-8 and/or UTF-16 and/or UTF-32 support
      -               is available
      -
      -If an unknown option is given, an error message is output; the exit code is 0. -

      -

      --d -Behave as if each pattern has the /D (debug) modifier; the internal -form and information about the compiled pattern is output after compilation; --d is equivalent to -b -i. -

      -

      --dfa -Behave as if each data line contains the \D escape sequence; this causes the -alternative matching function, pcre[16|32]_dfa_exec(), to be used instead -of the standard pcre[16|32]_exec() function (more detail is given below). -

      -

      --help -Output a brief summary these options and then exit. -

      -

      --i -Behave as if each pattern has the /I modifier; information about the -compiled pattern is given after compilation. -

      -

      --M -Behave as if each data line contains the \M escape sequence; this causes -PCRE to discover the minimum MATCH_LIMIT and MATCH_LIMIT_RECURSION settings by -calling pcre[16|32]_exec() repeatedly with different limits. -

      -

      --m -Output the size of each compiled pattern after it has been compiled. This is -equivalent to adding /M to each regular expression. The size is given in -bytes for both libraries. -

      -

      --O -Behave as if each pattern has the /O modifier, that is disable -auto-possessification for all patterns. -

      -

      --o osize -Set the number of elements in the output vector that is used when calling -pcre[16|32]_exec() or pcre[16|32]_dfa_exec() to be osize. The -default value is 45, which is enough for 14 capturing subexpressions for -pcre[16|32]_exec() or 22 different matches for -pcre[16|32]_dfa_exec(). -The vector size can be changed for individual matching calls by including \O -in the data line (see below). -

      -

      --p -Behave as if each pattern has the /P modifier; the POSIX wrapper API is -used to call PCRE. None of the other options has any effect when -p is -set. This option can be used only with the 8-bit library. -

      -

      --q -Do not output the version number of pcretest at the start of execution. -

      -

      --S size -On Unix-like systems, set the size of the run-time stack to size -megabytes. -

      -

      --s or -s+ -Behave as if each pattern has the /S modifier; in other words, force each -pattern to be studied. If -s+ is used, all the JIT compile options are -passed to pcre[16|32]_study(), causing just-in-time optimization to be set -up if it is available, for both full and partial matching. Specific JIT compile -options can be selected by following -s+ with a digit in the range 1 to -7, which selects the JIT compile modes as follows: -

      -  1  normal match only
      -  2  soft partial match only
      -  3  normal match and soft partial match
      -  4  hard partial match only
      -  6  soft and hard partial match
      -  7  all three modes (default)
      -
      -If -s++ is used instead of -s+ (with or without a following digit), -the text "(JIT)" is added to the first output line after a match or no match -when JIT-compiled code was actually used. -
      -
      -Note that there are pattern options that can override -s, either -specifying no studying at all, or suppressing JIT compilation. -
      -
      -If the /I or /D option is present on a pattern (requesting output -about the compiled pattern), information about the result of studying is not -included when studying is caused only by -s and neither -i nor --d is present on the command line. This behaviour means that the output -from tests that are run with and without -s should be identical, except -when options that output information about the actual running of a match are -set. -
      -
      -The -M, -t, and -tm options, which give information about -resources used, are likely to produce different output with and without --s. Output may also differ if the /C option is present on an -individual pattern. This uses callouts to trace the the matching process, and -this may be different between studied and non-studied patterns. If the pattern -contains (*MARK) items there may also be differences, for the same reason. The --s command line option can be overridden for specific patterns that -should never be studied (see the /S pattern modifier below). -

      -

      --t -Run each compile, study, and match many times with a timer, and output the -resulting times per compile, study, or match (in milliseconds). Do not set --m with -t, because you will then get the size output a zillion -times, and the timing will be distorted. You can control the number of -iterations that are used for timing by following -t with a number (as a -separate item on the command line). For example, "-t 1000" iterates 1000 times. -The default is to iterate 500000 times. -

      -

      --tm -This is like -t except that it times only the matching phase, not the -compile or study phases. -

      -

      --T -TM -These behave like -t and -tm, but in addition, at the end of a run, -the total times for all compiles, studies, and matches are output. -

      -
      DESCRIPTION
      -

      -If pcretest is given two filename arguments, it reads from the first and -writes to the second. If it is given only one filename argument, it reads from -that file and writes to stdout. Otherwise, it reads from stdin and writes to -stdout, and prompts for each line of input, using "re>" to prompt for regular -expressions, and "data>" to prompt for data lines. -

      -

      -When pcretest is built, a configuration option can specify that it should -be linked with the libreadline library. When this is done, if the input -is from a terminal, it is read using the readline() function. This -provides line-editing and history facilities. The output from the -help -option states whether or not readline() will be used. -

      -

      -The program handles any number of sets of input on a single input file. Each -set starts with a regular expression, and continues with any number of data -lines to be matched against that pattern. -

      -

      -Each data line is matched separately and independently. If you want to do -multi-line matches, you have to use the \n escape sequence (or \r or \r\n, -etc., depending on the newline setting) in a single line of input to encode the -newline sequences. There is no limit on the length of data lines; the input -buffer is automatically extended if it is too small. -

      -

      -An empty line signals the end of the data lines, at which point a new regular -expression is read. The regular expressions are given enclosed in any -non-alphanumeric delimiters other than backslash, for example: -

      -  /(a|bc)x+yz/
      -
      -White space before the initial delimiter is ignored. A regular expression may -be continued over several input lines, in which case the newline characters are -included within it. It is possible to include the delimiter within the pattern -by escaping it, for example -
      -  /abc\/def/
      -
      -If you do so, the escape and the delimiter form part of the pattern, but since -delimiters are always non-alphanumeric, this does not affect its interpretation. -If the terminating delimiter is immediately followed by a backslash, for -example, -
      -  /abc/\
      -
      -then a backslash is added to the end of the pattern. This is done to provide a -way of testing the error condition that arises if a pattern finishes with a -backslash, because -
      -  /abc\/
      -
      -is interpreted as the first line of a pattern that starts with "abc/", causing -pcretest to read the next line as a continuation of the regular expression. -

      -
      PATTERN MODIFIERS
      -

      -A pattern may be followed by any number of modifiers, which are mostly single -characters, though some of these can be qualified by further characters. -Following Perl usage, these are referred to below as, for example, "the -/i modifier", even though the delimiter of the pattern need not always be -a slash, and no slash is used when writing modifiers. White space may appear -between the final pattern delimiter and the first modifier, and between the -modifiers themselves. For reference, here is a complete list of modifiers. They -fall into several groups that are described in detail in the following -sections. -

      -  /8              set UTF mode
      -  /9              set PCRE_NEVER_UTF (locks out UTF mode)
      -  /?              disable UTF validity check
      -  /+              show remainder of subject after match
      -  /=              show all captures (not just those that are set)
      -
      -  /A              set PCRE_ANCHORED
      -  /B              show compiled code
      -  /C              set PCRE_AUTO_CALLOUT
      -  /D              same as /B plus /I
      -  /E              set PCRE_DOLLAR_ENDONLY
      -  /F              flip byte order in compiled pattern
      -  /f              set PCRE_FIRSTLINE
      -  /G              find all matches (shorten string)
      -  /g              find all matches (use startoffset)
      -  /I              show information about pattern
      -  /i              set PCRE_CASELESS
      -  /J              set PCRE_DUPNAMES
      -  /K              show backtracking control names
      -  /L              set locale
      -  /M              show compiled memory size
      -  /m              set PCRE_MULTILINE
      -  /N              set PCRE_NO_AUTO_CAPTURE
      -  /O              set PCRE_NO_AUTO_POSSESS
      -  /P              use the POSIX wrapper
      -  /Q              test external stack check function
      -  /S              study the pattern after compilation
      -  /s              set PCRE_DOTALL
      -  /T              select character tables
      -  /U              set PCRE_UNGREEDY
      -  /W              set PCRE_UCP
      -  /X              set PCRE_EXTRA
      -  /x              set PCRE_EXTENDED
      -  /Y              set PCRE_NO_START_OPTIMIZE
      -  /Z              don't show lengths in /B output
      -
      -  /<any>          set PCRE_NEWLINE_ANY
      -  /<anycrlf>      set PCRE_NEWLINE_ANYCRLF
      -  /<cr>           set PCRE_NEWLINE_CR
      -  /<crlf>         set PCRE_NEWLINE_CRLF
      -  /<lf>           set PCRE_NEWLINE_LF
      -  /<bsr_anycrlf>  set PCRE_BSR_ANYCRLF
      -  /<bsr_unicode>  set PCRE_BSR_UNICODE
      -  /<JS>           set PCRE_JAVASCRIPT_COMPAT
      -
      -
      -

      -
      -Perl-compatible modifiers -
      -

      -The /i, /m, /s, and /x modifiers set the PCRE_CASELESS, -PCRE_MULTILINE, PCRE_DOTALL, or PCRE_EXTENDED options, respectively, when -pcre[16|32]_compile() is called. These four modifier letters have the same -effect as they do in Perl. For example: -

      -  /caseless/i
      -
      -
      -

      -
      -Modifiers for other PCRE options -
      -

      -The following table shows additional modifiers for setting PCRE compile-time -options that do not correspond to anything in Perl: -

      -  /8              PCRE_UTF8           ) when using the 8-bit
      -  /?              PCRE_NO_UTF8_CHECK  )   library
      -
      -  /8              PCRE_UTF16          ) when using the 16-bit
      -  /?              PCRE_NO_UTF16_CHECK )   library
      -
      -  /8              PCRE_UTF32          ) when using the 32-bit
      -  /?              PCRE_NO_UTF32_CHECK )   library
      -
      -  /9              PCRE_NEVER_UTF
      -  /A              PCRE_ANCHORED
      -  /C              PCRE_AUTO_CALLOUT
      -  /E              PCRE_DOLLAR_ENDONLY
      -  /f              PCRE_FIRSTLINE
      -  /J              PCRE_DUPNAMES
      -  /N              PCRE_NO_AUTO_CAPTURE
      -  /O              PCRE_NO_AUTO_POSSESS
      -  /U              PCRE_UNGREEDY
      -  /W              PCRE_UCP
      -  /X              PCRE_EXTRA
      -  /Y              PCRE_NO_START_OPTIMIZE
      -  /<any>          PCRE_NEWLINE_ANY
      -  /<anycrlf>      PCRE_NEWLINE_ANYCRLF
      -  /<cr>           PCRE_NEWLINE_CR
      -  /<crlf>         PCRE_NEWLINE_CRLF
      -  /<lf>           PCRE_NEWLINE_LF
      -  /<bsr_anycrlf>  PCRE_BSR_ANYCRLF
      -  /<bsr_unicode>  PCRE_BSR_UNICODE
      -  /<JS>           PCRE_JAVASCRIPT_COMPAT
      -
      -The modifiers that are enclosed in angle brackets are literal strings as shown, -including the angle brackets, but the letters within can be in either case. -This example sets multiline matching with CRLF as the line ending sequence: -
      -  /^abc/m<CRLF>
      -
      -As well as turning on the PCRE_UTF8/16/32 option, the /8 modifier causes -all non-printing characters in output strings to be printed using the -\x{hh...} notation. Otherwise, those less than 0x100 are output in hex without -the curly brackets. -

      -

      -Full details of the PCRE options are given in the -pcreapi -documentation. -

      -
      -Finding all matches in a string -
      -

      -Searching for all possible matches within each subject string can be requested -by the /g or /G modifier. After finding a match, PCRE is called -again to search the remainder of the subject string. The difference between -/g and /G is that the former uses the startoffset argument to -pcre[16|32]_exec() to start searching at a new point within the entire -string (which is in effect what Perl does), whereas the latter passes over a -shortened substring. This makes a difference to the matching process if the -pattern begins with a lookbehind assertion (including \b or \B). -

      -

      -If any call to pcre[16|32]_exec() in a /g or /G sequence matches -an empty string, the next call is done with the PCRE_NOTEMPTY_ATSTART and -PCRE_ANCHORED flags set in order to search for another, non-empty, match at the -same point. If this second match fails, the start offset is advanced, and the -normal match is retried. This imitates the way Perl handles such cases when -using the /g modifier or the split() function. Normally, the start -offset is advanced by one character, but if the newline convention recognizes -CRLF as a newline, and the current character is CR followed by LF, an advance -of two is used. -

      -
      -Other modifiers -
      -

      -There are yet more modifiers for controlling the way pcretest -operates. -

      -

      -The /+ modifier requests that as well as outputting the substring that -matched the entire pattern, pcretest should in addition output the -remainder of the subject string. This is useful for tests where the subject -contains multiple copies of the same substring. If the + modifier appears -twice, the same action is taken for captured substrings. In each case the -remainder is output on the following line with a plus character following the -capture number. Note that this modifier must not immediately follow the /S -modifier because /S+ and /S++ have other meanings. -

      -

      -The /= modifier requests that the values of all potential captured -parentheses be output after a match. By default, only those up to the highest -one actually used in the match are output (corresponding to the return code -from pcre[16|32]_exec()). Values in the offsets vector corresponding to -higher numbers should be set to -1, and these are output as "<unset>". This -modifier gives a way of checking that this is happening. -

      -

      -The /B modifier is a debugging feature. It requests that pcretest -output a representation of the compiled code after compilation. Normally this -information contains length and offset values; however, if /Z is also -present, this data is replaced by spaces. This is a special feature for use in -the automatic test scripts; it ensures that the same output is generated for -different internal link sizes. -

      -

      -The /D modifier is a PCRE debugging feature, and is equivalent to -/BI, that is, both the /B and the /I modifiers. -

      -

      -The /F modifier causes pcretest to flip the byte order of the -2-byte and 4-byte fields in the compiled pattern. This facility is for testing -the feature in PCRE that allows it to execute patterns that were compiled on a -host with a different endianness. This feature is not available when the POSIX -interface to PCRE is being used, that is, when the /P pattern modifier is -specified. See also the section about saving and reloading compiled patterns -below. -

      -

      -The /I modifier requests that pcretest output information about the -compiled pattern (whether it is anchored, has a fixed first character, and -so on). It does this by calling pcre[16|32]_fullinfo() after compiling a -pattern. If the pattern is studied, the results of that are also output. In -this output, the word "char" means a non-UTF character, that is, the value of a -single data item (8-bit, 16-bit, or 32-bit, depending on the library that is -being tested). -

      -

      -The /K modifier requests pcretest to show names from backtracking -control verbs that are returned from calls to pcre[16|32]_exec(). It causes -pcretest to create a pcre[16|32]_extra block if one has not already -been created by a call to pcre[16|32]_study(), and to set the -PCRE_EXTRA_MARK flag and the mark field within it, every time that -pcre[16|32]_exec() is called. If the variable that the mark field -points to is non-NULL for a match, non-match, or partial match, pcretest -prints the string to which it points. For a match, this is shown on a line by -itself, tagged with "MK:". For a non-match it is added to the message. -

      -

      -The /L modifier must be followed directly by the name of a locale, for -example, -

      -  /pattern/Lfr_FR
      -
      -For this reason, it must be the last modifier. The given locale is set, -pcre[16|32]_maketables() is called to build a set of character tables for -the locale, and this is then passed to pcre[16|32]_compile() when compiling -the regular expression. Without an /L (or /T) modifier, NULL is -passed as the tables pointer; that is, /L applies only to the expression -on which it appears. -

      -

      -The /M modifier causes the size in bytes of the memory block used to hold -the compiled pattern to be output. This does not include the size of the -pcre[16|32] block; it is just the actual compiled data. If the pattern is -successfully studied with the PCRE_STUDY_JIT_COMPILE option, the size of the -JIT compiled code is also output. -

      -

      -The /Q modifier is used to test the use of pcre_stack_guard. It -must be followed by '0' or '1', specifying the return code to be given from an -external function that is passed to PCRE and used for stack checking during -compilation (see the -pcreapi -documentation for details). -

      -

      -The /S modifier causes pcre[16|32]_study() to be called after the -expression has been compiled, and the results used when the expression is -matched. There are a number of qualifying characters that may follow /S. -They may appear in any order. -

      -

      -If /S is followed by an exclamation mark, pcre[16|32]_study() is -called with the PCRE_STUDY_EXTRA_NEEDED option, causing it always to return a -pcre_extra block, even when studying discovers no useful information. -

      -

      -If /S is followed by a second S character, it suppresses studying, even -if it was requested externally by the -s command line option. This makes -it possible to specify that certain patterns are always studied, and others are -never studied, independently of -s. This feature is used in the test -files in a few cases where the output is different when the pattern is studied. -

      -

      -If the /S modifier is followed by a + character, the call to -pcre[16|32]_study() is made with all the JIT study options, requesting -just-in-time optimization support if it is available, for both normal and -partial matching. If you want to restrict the JIT compiling modes, you can -follow /S+ with a digit in the range 1 to 7: -

      -  1  normal match only
      -  2  soft partial match only
      -  3  normal match and soft partial match
      -  4  hard partial match only
      -  6  soft and hard partial match
      -  7  all three modes (default)
      -
      -If /S++ is used instead of /S+ (with or without a following digit), -the text "(JIT)" is added to the first output line after a match or no match -when JIT-compiled code was actually used. -

      -

      -Note that there is also an independent /+ modifier; it must not be given -immediately after /S or /S+ because this will be misinterpreted. -

      -

      -If JIT studying is successful, the compiled JIT code will automatically be used -when pcre[16|32]_exec() is run, except when incompatible run-time options -are specified. For more details, see the -pcrejit -documentation. See also the \J escape sequence below for a way of -setting the size of the JIT stack. -

      -

      -Finally, if /S is followed by a minus character, JIT compilation is -suppressed, even if it was requested externally by the -s command line -option. This makes it possible to specify that JIT is never to be used for -certain patterns. -

      -

      -The /T modifier must be followed by a single digit. It causes a specific -set of built-in character tables to be passed to pcre[16|32]_compile(). It -is used in the standard PCRE tests to check behaviour with different character -tables. The digit specifies the tables as follows: -

      -  0   the default ASCII tables, as distributed in
      -        pcre_chartables.c.dist
      -  1   a set of tables defining ISO 8859 characters
      -
      -In table 1, some characters whose codes are greater than 128 are identified as -letters, digits, spaces, etc. -

      -
      -Using the POSIX wrapper API -
      -

      -The /P modifier causes pcretest to call PCRE via the POSIX wrapper -API rather than its native API. This supports only the 8-bit library. When -/P is set, the following modifiers set options for the regcomp() -function: -

      -  /i    REG_ICASE
      -  /m    REG_NEWLINE
      -  /N    REG_NOSUB
      -  /s    REG_DOTALL     )
      -  /U    REG_UNGREEDY   ) These options are not part of
      -  /W    REG_UCP        )   the POSIX standard
      -  /8    REG_UTF8       )
      -
      -The /+ modifier works as described above. All other modifiers are -ignored. -

      -
      -Locking out certain modifiers -
      -

      -PCRE can be compiled with or without support for certain features such as -UTF-8/16/32 or Unicode properties. Accordingly, the standard tests are split up -into a number of different files that are selected for running depending on -which features are available. When updating the tests, it is all too easy to -put a new test into the wrong file by mistake; for example, to put a test that -requires UTF support into a file that is used when it is not available. To help -detect such mistakes as early as possible, there is a facility for locking out -specific modifiers. If an input line for pcretest starts with the string -"< forbid " the following sequence of characters is taken as a list of -forbidden modifiers. For example, in the test files that must not use UTF or -Unicode property support, this line appears: -

      -  < forbid 8W
      -
      -This locks out the /8 and /W modifiers. An immediate error is given if they are -subsequently encountered. If the character string contains < but not >, all the -multi-character modifiers that begin with < are locked out. Otherwise, such -modifiers must be explicitly listed, for example: -
      -  < forbid <JS><cr>
      -
      -There must be a single space between < and "forbid" for this feature to be -recognised. If there is not, the line is interpreted either as a request to -re-load a pre-compiled pattern (see "SAVING AND RELOADING COMPILED PATTERNS" -below) or, if there is a another < character, as a pattern that uses < as its -delimiter. -

      -
      DATA LINES
      -

      -Before each data line is passed to pcre[16|32]_exec(), leading and trailing -white space is removed, and it is then scanned for \ escapes. Some of these -are pretty esoteric features, intended for checking out some of the more -complicated features of PCRE. If you are just testing "ordinary" regular -expressions, you probably don't need any of these. The following escapes are -recognized: -

      -  \a         alarm (BEL, \x07)
      -  \b         backspace (\x08)
      -  \e         escape (\x27)
      -  \f         form feed (\x0c)
      -  \n         newline (\x0a)
      -  \qdd       set the PCRE_MATCH_LIMIT limit to dd (any number of digits)
      -  \r         carriage return (\x0d)
      -  \t         tab (\x09)
      -  \v         vertical tab (\x0b)
      -  \nnn       octal character (up to 3 octal digits); always
      -               a byte unless > 255 in UTF-8 or 16-bit or 32-bit mode
      -  \o{dd...}  octal character (any number of octal digits}
      -  \xhh       hexadecimal byte (up to 2 hex digits)
      -  \x{hh...}  hexadecimal character (any number of hex digits)
      -  \A         pass the PCRE_ANCHORED option to pcre[16|32]_exec() or pcre[16|32]_dfa_exec()
      -  \B         pass the PCRE_NOTBOL option to pcre[16|32]_exec() or pcre[16|32]_dfa_exec()
      -  \Cdd       call pcre[16|32]_copy_substring() for substring dd after a successful match (number less than 32)
      -  \Cname     call pcre[16|32]_copy_named_substring() for substring "name" after a successful match (name termin-
      -               ated by next non alphanumeric character)
      -  \C+        show the current captured substrings at callout time
      -  \C-        do not supply a callout function
      -  \C!n       return 1 instead of 0 when callout number n is reached
      -  \C!n!m     return 1 instead of 0 when callout number n is reached for the nth time
      -  \C*n       pass the number n (may be negative) as callout data; this is used as the callout return value
      -  \D         use the pcre[16|32]_dfa_exec() match function
      -  \F         only shortest match for pcre[16|32]_dfa_exec()
      -  \Gdd       call pcre[16|32]_get_substring() for substring dd after a successful match (number less than 32)
      -  \Gname     call pcre[16|32]_get_named_substring() for substring "name" after a successful match (name termin-
      -               ated by next non-alphanumeric character)
      -  \Jdd       set up a JIT stack of dd kilobytes maximum (any number of digits)
      -  \L         call pcre[16|32]_get_substringlist() after a successful match
      -  \M         discover the minimum MATCH_LIMIT and MATCH_LIMIT_RECURSION settings
      -  \N         pass the PCRE_NOTEMPTY option to pcre[16|32]_exec() or pcre[16|32]_dfa_exec(); if used twice, pass the
      -               PCRE_NOTEMPTY_ATSTART option
      -  \Odd       set the size of the output vector passed to pcre[16|32]_exec() to dd (any number of digits)
      -  \P         pass the PCRE_PARTIAL_SOFT option to pcre[16|32]_exec() or pcre[16|32]_dfa_exec(); if used twice, pass the
      -               PCRE_PARTIAL_HARD option
      -  \Qdd       set the PCRE_MATCH_LIMIT_RECURSION limit to dd (any number of digits)
      -  \R         pass the PCRE_DFA_RESTART option to pcre[16|32]_dfa_exec()
      -  \S         output details of memory get/free calls during matching
      -  \Y         pass the PCRE_NO_START_OPTIMIZE option to pcre[16|32]_exec() or pcre[16|32]_dfa_exec()
      -  \Z         pass the PCRE_NOTEOL option to pcre[16|32]_exec() or pcre[16|32]_dfa_exec()
      -  \?         pass the PCRE_NO_UTF[8|16|32]_CHECK option to pcre[16|32]_exec() or pcre[16|32]_dfa_exec()
      -  \>dd       start the match at offset dd (optional "-"; then any number of digits); this sets the startoffset
      -               argument for pcre[16|32]_exec() or pcre[16|32]_dfa_exec()
      -  \<cr>      pass the PCRE_NEWLINE_CR option to pcre[16|32]_exec() or pcre[16|32]_dfa_exec()
      -  \<lf>      pass the PCRE_NEWLINE_LF option to pcre[16|32]_exec() or pcre[16|32]_dfa_exec()
      -  \<crlf>    pass the PCRE_NEWLINE_CRLF option to pcre[16|32]_exec() or pcre[16|32]_dfa_exec()
      -  \<anycrlf> pass the PCRE_NEWLINE_ANYCRLF option to pcre[16|32]_exec() or pcre[16|32]_dfa_exec()
      -  \<any>     pass the PCRE_NEWLINE_ANY option to pcre[16|32]_exec() or pcre[16|32]_dfa_exec()
      -
      -The use of \x{hh...} is not dependent on the use of the /8 modifier on -the pattern. It is recognized always. There may be any number of hexadecimal -digits inside the braces; invalid values provoke error messages. -

      -

      -Note that \xhh specifies one byte rather than one character in UTF-8 mode; -this makes it possible to construct invalid UTF-8 sequences for testing -purposes. On the other hand, \x{hh} is interpreted as a UTF-8 character in -UTF-8 mode, generating more than one byte if the value is greater than 127. -When testing the 8-bit library not in UTF-8 mode, \x{hh} generates one byte -for values less than 256, and causes an error for greater values. -

      -

      -In UTF-16 mode, all 4-digit \x{hhhh} values are accepted. This makes it -possible to construct invalid UTF-16 sequences for testing purposes. -

      -

      -In UTF-32 mode, all 4- to 8-digit \x{...} values are accepted. This makes it -possible to construct invalid UTF-32 sequences for testing purposes. -

      -

      -The escapes that specify line ending sequences are literal strings, exactly as -shown. No more than one newline setting should be present in any data line. -

      -

      -A backslash followed by anything else just escapes the anything else. If -the very last character is a backslash, it is ignored. This gives a way of -passing an empty line as data, since a real empty line terminates the data -input. -

      -

      -The \J escape provides a way of setting the maximum stack size that is -used by the just-in-time optimization code. It is ignored if JIT optimization -is not being used. Providing a stack that is larger than the default 32K is -necessary only for very complicated patterns. -

      -

      -If \M is present, pcretest calls pcre[16|32]_exec() several times, -with different values in the match_limit and match_limit_recursion -fields of the pcre[16|32]_extra data structure, until it finds the minimum -numbers for each parameter that allow pcre[16|32]_exec() to complete without -error. Because this is testing a specific feature of the normal interpretive -pcre[16|32]_exec() execution, the use of any JIT optimization that might -have been set up by the /S+ qualifier of -s+ option is disabled. -

      -

      -The match_limit number is a measure of the amount of backtracking -that takes place, and checking it out can be instructive. For most simple -matches, the number is quite small, but for patterns with very large numbers of -matching possibilities, it can become large very quickly with increasing length -of subject string. The match_limit_recursion number is a measure of how -much stack (or, if PCRE is compiled with NO_RECURSE, how much heap) memory is -needed to complete the match attempt. -

      -

      -When \O is used, the value specified may be higher or lower than the size set -by the -O command line option (or defaulted to 45); \O applies only to -the call of pcre[16|32]_exec() for the line in which it appears. -

      -

      -If the /P modifier was present on the pattern, causing the POSIX wrapper -API to be used, the only option-setting sequences that have any effect are \B, -\N, and \Z, causing REG_NOTBOL, REG_NOTEMPTY, and REG_NOTEOL, respectively, -to be passed to regexec(). -

      -
      THE ALTERNATIVE MATCHING FUNCTION
      -

      -By default, pcretest uses the standard PCRE matching function, -pcre[16|32]_exec() to match each data line. PCRE also supports an -alternative matching function, pcre[16|32]_dfa_test(), which operates in a -different way, and has some restrictions. The differences between the two -functions are described in the -pcrematching -documentation. -

      -

      -If a data line contains the \D escape sequence, or if the command line -contains the -dfa option, the alternative matching function is used. -This function finds all possible matches at a given point. If, however, the \F -escape sequence is present in the data line, it stops after the first match is -found. This is always the shortest possible match. -

      -
      DEFAULT OUTPUT FROM PCRETEST
      -

      -This section describes the output when the normal matching function, -pcre[16|32]_exec(), is being used. -

      -

      -When a match succeeds, pcretest outputs the list of captured substrings -that pcre[16|32]_exec() returns, starting with number 0 for the string that -matched the whole pattern. Otherwise, it outputs "No match" when the return is -PCRE_ERROR_NOMATCH, and "Partial match:" followed by the partially matching -substring when pcre[16|32]_exec() returns PCRE_ERROR_PARTIAL. (Note that -this is the entire substring that was inspected during the partial match; it -may include characters before the actual match start if a lookbehind assertion, -\K, \b, or \B was involved.) For any other return, pcretest outputs -the PCRE negative error number and a short descriptive phrase. If the error is -a failed UTF string check, the offset of the start of the failing character and -the reason code are also output, provided that the size of the output vector is -at least two. Here is an example of an interactive pcretest run. -

      -  $ pcretest
      -  PCRE version 8.13 2011-04-30
      -
      -    re> /^abc(\d+)/
      -  data> abc123
      -   0: abc123
      -   1: 123
      -  data> xyz
      -  No match
      -
      -Unset capturing substrings that are not followed by one that is set are not -returned by pcre[16|32]_exec(), and are not shown by pcretest. In the -following example, there are two capturing substrings, but when the first data -line is matched, the second, unset substring is not shown. An "internal" unset -substring is shown as "<unset>", as for the second data line. -
      -    re> /(a)|(b)/
      -  data> a
      -   0: a
      -   1: a
      -  data> b
      -   0: b
      -   1: <unset>
      -   2: b
      -
      -If the strings contain any non-printing characters, they are output as \xhh -escapes if the value is less than 256 and UTF mode is not set. Otherwise they -are output as \x{hh...} escapes. See below for the definition of non-printing -characters. If the pattern has the /+ modifier, the output for substring -0 is followed by the the rest of the subject string, identified by "0+" like -this: -
      -    re> /cat/+
      -  data> cataract
      -   0: cat
      -   0+ aract
      -
      -If the pattern has the /g or /G modifier, the results of successive -matching attempts are output in sequence, like this: -
      -    re> /\Bi(\w\w)/g
      -  data> Mississippi
      -   0: iss
      -   1: ss
      -   0: iss
      -   1: ss
      -   0: ipp
      -   1: pp
      -
      -"No match" is output only if the first match attempt fails. Here is an example -of a failure message (the offset 4 that is specified by \>4 is past the end of -the subject string): -
      -    re> /xyz/
      -  data> xyz\>4
      -  Error -24 (bad offset value)
      -
      -

      -

      -If any of the sequences \C, \G, or \L are present in a -data line that is successfully matched, the substrings extracted by the -convenience functions are output with C, G, or L after the string number -instead of a colon. This is in addition to the normal full list. The string -length (that is, the return from the extraction function) is given in -parentheses after each string for \C and \G. -

      -

      -Note that whereas patterns can be continued over several lines (a plain ">" -prompt is used for continuations), data lines may not. However newlines can be -included in data by means of the \n escape (or \r, \r\n, etc., depending on -the newline sequence setting). -

      -
      OUTPUT FROM THE ALTERNATIVE MATCHING FUNCTION
      -

      -When the alternative matching function, pcre[16|32]_dfa_exec(), is used (by -means of the \D escape sequence or the -dfa command line option), the -output consists of a list of all the matches that start at the first point in -the subject where there is at least one match. For example: -

      -    re> /(tang|tangerine|tan)/
      -  data> yellow tangerine\D
      -   0: tangerine
      -   1: tang
      -   2: tan
      -
      -(Using the normal matching function on this data finds only "tang".) The -longest matching string is always given first (and numbered zero). After a -PCRE_ERROR_PARTIAL return, the output is "Partial match:", followed by the -partially matching substring. (Note that this is the entire substring that was -inspected during the partial match; it may include characters before the actual -match start if a lookbehind assertion, \K, \b, or \B was involved.) -

      -

      -If /g is present on the pattern, the search for further matches resumes -at the end of the longest match. For example: -

      -    re> /(tang|tangerine|tan)/g
      -  data> yellow tangerine and tangy sultana\D
      -   0: tangerine
      -   1: tang
      -   2: tan
      -   0: tang
      -   1: tan
      -   0: tan
      -
      -Since the matching function does not support substring capture, the escape -sequences that are concerned with captured substrings are not relevant. -

      -
      RESTARTING AFTER A PARTIAL MATCH
      -

      -When the alternative matching function has given the PCRE_ERROR_PARTIAL return, -indicating that the subject partially matched the pattern, you can restart the -match with additional subject data by means of the \R escape sequence. For -example: -

      -    re> /^\d?\d(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)\d\d$/
      -  data> 23ja\P\D
      -  Partial match: 23ja
      -  data> n05\R\D
      -   0: n05
      -
      -For further information about partial matching, see the -pcrepartial -documentation. -

      -
      CALLOUTS
      -

      -If the pattern contains any callout requests, pcretest's callout function -is called during matching. This works with both matching functions. By default, -the called function displays the callout number, the start and current -positions in the text at the callout time, and the next pattern item to be -tested. For example: -

      -  --->pqrabcdef
      -    0    ^  ^     \d
      -
      -This output indicates that callout number 0 occurred for a match attempt -starting at the fourth character of the subject string, when the pointer was at -the seventh character of the data, and when the next pattern item was \d. Just -one circumflex is output if the start and current positions are the same. -

      -

      -Callouts numbered 255 are assumed to be automatic callouts, inserted as a -result of the /C pattern modifier. In this case, instead of showing the -callout number, the offset in the pattern, preceded by a plus, is output. For -example: -

      -    re> /\d?[A-E]\*/C
      -  data> E*
      -  --->E*
      -   +0 ^      \d?
      -   +3 ^      [A-E]
      -   +8 ^^     \*
      -  +10 ^ ^
      -   0: E*
      -
      -If a pattern contains (*MARK) items, an additional line is output whenever -a change of latest mark is passed to the callout function. For example: -
      -    re> /a(*MARK:X)bc/C
      -  data> abc
      -  --->abc
      -   +0 ^       a
      -   +1 ^^      (*MARK:X)
      -  +10 ^^      b
      -  Latest Mark: X
      -  +11 ^ ^     c
      -  +12 ^  ^
      -   0: abc
      -
      -The mark changes between matching "a" and "b", but stays the same for the rest -of the match, so nothing more is output. If, as a result of backtracking, the -mark reverts to being unset, the text "<unset>" is output. -

      -

      -The callout function in pcretest returns zero (carry on matching) by -default, but you can use a \C item in a data line (as described above) to -change this and other parameters of the callout. -

      -

      -Inserting callouts can be helpful when using pcretest to check -complicated regular expressions. For further information about callouts, see -the -pcrecallout -documentation. -

      -
      NON-PRINTING CHARACTERS
      -

      -When pcretest is outputting text in the compiled version of a pattern, -bytes other than 32-126 are always treated as non-printing characters are are -therefore shown as hex escapes. -

      -

      -When pcretest is outputting text that is a matched part of a subject -string, it behaves in the same way, unless a different locale has been set for -the pattern (using the /L modifier). In this case, the isprint() -function to distinguish printing and non-printing characters. -

      -
      SAVING AND RELOADING COMPILED PATTERNS
      -

      -The facilities described in this section are not available when the POSIX -interface to PCRE is being used, that is, when the /P pattern modifier is -specified. -

      -

      -When the POSIX interface is not in use, you can cause pcretest to write a -compiled pattern to a file, by following the modifiers with > and a file name. -For example: -

      -  /pattern/im >/some/file
      -
      -See the -pcreprecompile -documentation for a discussion about saving and re-using compiled patterns. -Note that if the pattern was successfully studied with JIT optimization, the -JIT data cannot be saved. -

      -

      -The data that is written is binary. The first eight bytes are the length of the -compiled pattern data followed by the length of the optional study data, each -written as four bytes in big-endian order (most significant byte first). If -there is no study data (either the pattern was not studied, or studying did not -return any data), the second length is zero. The lengths are followed by an -exact copy of the compiled pattern. If there is additional study data, this -(excluding any JIT data) follows immediately after the compiled pattern. After -writing the file, pcretest expects to read a new pattern. -

      -

      -A saved pattern can be reloaded into pcretest by specifying < and a file -name instead of a pattern. There must be no space between < and the file name, -which must not contain a < character, as otherwise pcretest will -interpret the line as a pattern delimited by < characters. For example: -

      -   re> </some/file
      -  Compiled pattern loaded from /some/file
      -  No study data
      -
      -If the pattern was previously studied with the JIT optimization, the JIT -information cannot be saved and restored, and so is lost. When the pattern has -been loaded, pcretest proceeds to read data lines in the usual way. -

      -

      -You can copy a file written by pcretest to a different host and reload it -there, even if the new host has opposite endianness to the one on which the -pattern was compiled. For example, you can compile on an i86 machine and run on -a SPARC machine. When a pattern is reloaded on a host with different -endianness, the confirmation message is changed to: -

      -  Compiled pattern (byte-inverted) loaded from /some/file
      -
      -The test suite contains some saved pre-compiled patterns with different -endianness. These are reloaded using "<!" instead of just "<". This suppresses -the "(byte-inverted)" text so that the output is the same on all hosts. It also -forces debugging output once the pattern has been reloaded. -

      -

      -File names for saving and reloading can be absolute or relative, but note that -the shell facility of expanding a file name that starts with a tilde (~) is not -available. -

      -

      -The ability to save and reload files in pcretest is intended for testing -and experimentation. It is not intended for production use because only a -single pattern can be written to a file. Furthermore, there is no facility for -supplying custom character tables for use with a reloaded pattern. If the -original pattern was compiled with custom tables, an attempt to match a subject -string using a reloaded pattern is likely to cause pcretest to crash. -Finally, if you attempt to load a file that is not in the correct format, the -result is undefined. -

      -
      SEE ALSO
      -

      -pcre(3), pcre16(3), pcre32(3), pcreapi(3), -pcrecallout(3), -pcrejit, pcrematching(3), pcrepartial(d), -pcrepattern(3), pcreprecompile(3). -

      -
      AUTHOR
      -

      -Philip Hazel -
      -University Computing Service -
      -Cambridge CB2 3QH, England. -
      -

      -
      REVISION
      -

      -Last updated: 23 February 2017 -
      -Copyright © 1997-2017 University of Cambridge. -
      -

      -Return to the PCRE index page. -

      diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcreunicode.html b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcreunicode.html deleted file mode 100644 index ab36bc61..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/html/pcreunicode.html +++ /dev/null @@ -1,262 +0,0 @@ - - -pcreunicode specification - - -

      pcreunicode man page

      -

      -Return to the PCRE index page. -

      -

      -This page is part of the PCRE HTML documentation. It was generated automatically -from the original man page. If there is any nonsense in it, please consult the -man page, in case the conversion went wrong. -
      -
      -UTF-8, UTF-16, UTF-32, AND UNICODE PROPERTY SUPPORT -
      -

      -As well as UTF-8 support, PCRE also supports UTF-16 (from release 8.30) and -UTF-32 (from release 8.32), by means of two additional libraries. They can be -built as well as, or instead of, the 8-bit library. -

      -
      -UTF-8 SUPPORT -
      -

      -In order process UTF-8 strings, you must build PCRE's 8-bit library with UTF -support, and, in addition, you must call -pcre_compile() -with the PCRE_UTF8 option flag, or the pattern must start with the sequence -(*UTF8) or (*UTF). When either of these is the case, both the pattern and any -subject strings that are matched against it are treated as UTF-8 strings -instead of strings of individual 1-byte characters. -

      -
      -UTF-16 AND UTF-32 SUPPORT -
      -

      -In order process UTF-16 or UTF-32 strings, you must build PCRE's 16-bit or -32-bit library with UTF support, and, in addition, you must call -pcre16_compile() -or -pcre32_compile() -with the PCRE_UTF16 or PCRE_UTF32 option flag, as appropriate. Alternatively, -the pattern must start with the sequence (*UTF16), (*UTF32), as appropriate, or -(*UTF), which can be used with either library. When UTF mode is set, both the -pattern and any subject strings that are matched against it are treated as -UTF-16 or UTF-32 strings instead of strings of individual 16-bit or 32-bit -characters. -

      -
      -UTF SUPPORT OVERHEAD -
      -

      -If you compile PCRE with UTF support, but do not use it at run time, the -library will be a bit bigger, but the additional run time overhead is limited -to testing the PCRE_UTF[8|16|32] flag occasionally, so should not be very big. -

      -
      -UNICODE PROPERTY SUPPORT -
      -

      -If PCRE is built with Unicode character property support (which implies UTF -support), the escape sequences \p{..}, \P{..}, and \X can be used. -The available properties that can be tested are limited to the general -category properties such as Lu for an upper case letter or Nd for a decimal -number, the Unicode script names such as Arabic or Han, and the derived -properties Any and L&. Full lists is given in the -pcrepattern -and -pcresyntax -documentation. Only the short names for properties are supported. For example, -\p{L} matches a letter. Its Perl synonym, \p{Letter}, is not supported. -Furthermore, in Perl, many properties may optionally be prefixed by "Is", for -compatibility with Perl 5.6. PCRE does not support this. -

      -
      -Validity of UTF-8 strings -
      -

      -When you set the PCRE_UTF8 flag, the byte strings passed as patterns and -subjects are (by default) checked for validity on entry to the relevant -functions. The entire string is checked before any other processing takes -place. From release 7.3 of PCRE, the check is according the rules of RFC 3629, -which are themselves derived from the Unicode specification. Earlier releases -of PCRE followed the rules of RFC 2279, which allows the full range of 31-bit -values (0 to 0x7FFFFFFF). The current check allows only values in the range U+0 -to U+10FFFF, excluding the surrogate area. (From release 8.33 the so-called -"non-character" code points are no longer excluded because Unicode corrigendum -#9 makes it clear that they should not be.) -

      -

      -Characters in the "Surrogate Area" of Unicode are reserved for use by UTF-16, -where they are used in pairs to encode codepoints with values greater than -0xFFFF. The code points that are encoded by UTF-16 pairs are available -independently in the UTF-8 and UTF-32 encodings. (In other words, the whole -surrogate thing is a fudge for UTF-16 which unfortunately messes up UTF-8 and -UTF-32.) -

      -

      -If an invalid UTF-8 string is passed to PCRE, an error return is given. At -compile time, the only additional information is the offset to the first byte -of the failing character. The run-time functions pcre_exec() and -pcre_dfa_exec() also pass back this information, as well as a more -detailed reason code if the caller has provided memory in which to do this. -

      -

      -In some situations, you may already know that your strings are valid, and -therefore want to skip these checks in order to improve performance, for -example in the case of a long subject string that is being scanned repeatedly. -If you set the PCRE_NO_UTF8_CHECK flag at compile time or at run time, PCRE -assumes that the pattern or subject it is given (respectively) contains only -valid UTF-8 codes. In this case, it does not diagnose an invalid UTF-8 string. -

      -

      -Note that passing PCRE_NO_UTF8_CHECK to pcre_compile() just disables the -check for the pattern; it does not also apply to subject strings. If you want -to disable the check for a subject string you must pass this option to -pcre_exec() or pcre_dfa_exec(). -

      -

      -If you pass an invalid UTF-8 string when PCRE_NO_UTF8_CHECK is set, the result -is undefined and your program may crash. -

      -
      -Validity of UTF-16 strings -
      -

      -When you set the PCRE_UTF16 flag, the strings of 16-bit data units that are -passed as patterns and subjects are (by default) checked for validity on entry -to the relevant functions. Values other than those in the surrogate range -U+D800 to U+DFFF are independent code points. Values in the surrogate range -must be used in pairs in the correct manner. -

      -

      -If an invalid UTF-16 string is passed to PCRE, an error return is given. At -compile time, the only additional information is the offset to the first data -unit of the failing character. The run-time functions pcre16_exec() and -pcre16_dfa_exec() also pass back this information, as well as a more -detailed reason code if the caller has provided memory in which to do this. -

      -

      -In some situations, you may already know that your strings are valid, and -therefore want to skip these checks in order to improve performance. If you set -the PCRE_NO_UTF16_CHECK flag at compile time or at run time, PCRE assumes that -the pattern or subject it is given (respectively) contains only valid UTF-16 -sequences. In this case, it does not diagnose an invalid UTF-16 string. -However, if an invalid string is passed, the result is undefined. -

      -
      -Validity of UTF-32 strings -
      -

      -When you set the PCRE_UTF32 flag, the strings of 32-bit data units that are -passed as patterns and subjects are (by default) checked for validity on entry -to the relevant functions. This check allows only values in the range U+0 -to U+10FFFF, excluding the surrogate area U+D800 to U+DFFF. -

      -

      -If an invalid UTF-32 string is passed to PCRE, an error return is given. At -compile time, the only additional information is the offset to the first data -unit of the failing character. The run-time functions pcre32_exec() and -pcre32_dfa_exec() also pass back this information, as well as a more -detailed reason code if the caller has provided memory in which to do this. -

      -

      -In some situations, you may already know that your strings are valid, and -therefore want to skip these checks in order to improve performance. If you set -the PCRE_NO_UTF32_CHECK flag at compile time or at run time, PCRE assumes that -the pattern or subject it is given (respectively) contains only valid UTF-32 -sequences. In this case, it does not diagnose an invalid UTF-32 string. -However, if an invalid string is passed, the result is undefined. -

      -
      -General comments about UTF modes -
      -

      -1. Codepoints less than 256 can be specified in patterns by either braced or -unbraced hexadecimal escape sequences (for example, \x{b3} or \xb3). Larger -values have to use braced sequences. -

      -

      -2. Octal numbers up to \777 are recognized, and in UTF-8 mode they match -two-byte characters for values greater than \177. -

      -

      -3. Repeat quantifiers apply to complete UTF characters, not to individual -data units, for example: \x{100}{3}. -

      -

      -4. The dot metacharacter matches one UTF character instead of a single data -unit. -

      -

      -5. The escape sequence \C can be used to match a single byte in UTF-8 mode, or -a single 16-bit data unit in UTF-16 mode, or a single 32-bit data unit in -UTF-32 mode, but its use can lead to some strange effects because it breaks up -multi-unit characters (see the description of \C in the -pcrepattern -documentation). The use of \C is not supported in the alternative matching -function pcre[16|32]_dfa_exec(), nor is it supported in UTF mode by the -JIT optimization of pcre[16|32]_exec(). If JIT optimization is requested -for a UTF pattern that contains \C, it will not succeed, and so the matching -will be carried out by the normal interpretive function. -

      -

      -6. The character escapes \b, \B, \d, \D, \s, \S, \w, and \W correctly -test characters of any code value, but, by default, the characters that PCRE -recognizes as digits, spaces, or word characters remain the same set as in -non-UTF mode, all with values less than 256. This remains true even when PCRE -is built to include Unicode property support, because to do otherwise would -slow down PCRE in many common cases. Note in particular that this applies to -\b and \B, because they are defined in terms of \w and \W. If you really -want to test for a wider sense of, say, "digit", you can use explicit Unicode -property tests such as \p{Nd}. Alternatively, if you set the PCRE_UCP option, -the way that the character escapes work is changed so that Unicode properties -are used to determine which characters match. There are more details in the -section on -generic character types -in the -pcrepattern -documentation. -

      -

      -7. Similarly, characters that match the POSIX named character classes are all -low-valued characters, unless the PCRE_UCP option is set. -

      -

      -8. However, the horizontal and vertical white space matching escapes (\h, \H, -\v, and \V) do match all the appropriate Unicode characters, whether or not -PCRE_UCP is set. -

      -

      -9. Case-insensitive matching applies only to characters whose values are less -than 128, unless PCRE is built with Unicode property support. A few Unicode -characters such as Greek sigma have more than two codepoints that are -case-equivalent. Up to and including PCRE release 8.31, only one-to-one case -mappings were supported, but later releases (with Unicode property support) do -treat as case-equivalent all versions of characters such as Greek sigma. -

      -
      -AUTHOR -
      -

      -Philip Hazel -
      -University Computing Service -
      -Cambridge CB2 3QH, England. -
      -

      -
      -REVISION -
      -

      -Last updated: 27 February 2013 -
      -Copyright © 1997-2013 University of Cambridge. -
      -

      -Return to the PCRE index page. -

      diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/pcre-config.txt b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/pcre-config.txt deleted file mode 100644 index 8503ab0e..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/pcre-config.txt +++ /dev/null @@ -1,86 +0,0 @@ -PCRE-CONFIG(1) General Commands Manual PCRE-CONFIG(1) - - - -NAME - pcre-config - program to return PCRE configuration - -SYNOPSIS - - pcre-config [--prefix] [--exec-prefix] [--version] [--libs] - [--libs16] [--libs32] [--libs-cpp] [--libs-posix] - [--cflags] [--cflags-posix] - - -DESCRIPTION - - pcre-config returns the configuration of the installed PCRE libraries - and the options required to compile a program to use them. Some of the - options apply only to the 8-bit, or 16-bit, or 32-bit libraries, - respectively, and are not available if only one of those libraries has - been built. If an unavailable option is encountered, the "usage" infor- - mation is output. - - -OPTIONS - - --prefix Writes the directory prefix used in the PCRE installation for - architecture independent files (/usr on many systems, - /usr/local on some systems) to the standard output. - - --exec-prefix - Writes the directory prefix used in the PCRE installation for - architecture dependent files (normally the same as --prefix) - to the standard output. - - --version Writes the version number of the installed PCRE libraries to - the standard output. - - --libs Writes to the standard output the command line options - required to link with the 8-bit PCRE library (-lpcre on many - systems). - - --libs16 Writes to the standard output the command line options - required to link with the 16-bit PCRE library (-lpcre16 on - many systems). - - --libs32 Writes to the standard output the command line options - required to link with the 32-bit PCRE library (-lpcre32 on - many systems). - - --libs-cpp - Writes to the standard output the command line options - required to link with PCRE's C++ wrapper library (-lpcrecpp - -lpcre on many systems). - - --libs-posix - Writes to the standard output the command line options - required to link with PCRE's POSIX API wrapper library - (-lpcreposix -lpcre on many systems). - - --cflags Writes to the standard output the command line options - required to compile files that use PCRE (this may include - some -I options, but is blank on many systems). - - --cflags-posix - Writes to the standard output the command line options - required to compile files that use PCRE's POSIX API wrapper - library (this may include some -I options, but is blank on - many systems). - - -SEE ALSO - - pcre(3) - - -AUTHOR - - This manual page was originally written by Mark Baker for the Debian - GNU/Linux system. It has been subsequently revised as a generic PCRE - man page. - - -REVISION - - Last updated: 24 June 2012 diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/pcre.txt b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/pcre.txt deleted file mode 100644 index c027538f..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/pcre.txt +++ /dev/null @@ -1,10502 +0,0 @@ ------------------------------------------------------------------------------ -This file contains a concatenation of the PCRE man pages, converted to plain -text format for ease of searching with a text editor, or for use on systems -that do not have a man page processor. The small individual files that give -synopses of each function in the library have not been included. Neither has -the pcredemo program. There are separate text files for the pcregrep and -pcretest commands. ------------------------------------------------------------------------------ - - -PCRE(3) Library Functions Manual PCRE(3) - - - -NAME - PCRE - Perl-compatible regular expressions (original API) - -PLEASE TAKE NOTE - - This document relates to PCRE releases that use the original API, with - library names libpcre, libpcre16, and libpcre32. January 2015 saw the - first release of a new API, known as PCRE2, with release numbers start- - ing at 10.00 and library names libpcre2-8, libpcre2-16, and - libpcre2-32. The old libraries (now called PCRE1) are still being main- - tained for bug fixes, but there will be no new development. New - projects are advised to use the new PCRE2 libraries. - - -INTRODUCTION - - The PCRE library is a set of functions that implement regular expres- - sion pattern matching using the same syntax and semantics as Perl, with - just a few differences. Some features that appeared in Python and PCRE - before they appeared in Perl are also available using the Python syn- - tax, there is some support for one or two .NET and Oniguruma syntax - items, and there is an option for requesting some minor changes that - give better JavaScript compatibility. - - Starting with release 8.30, it is possible to compile two separate PCRE - libraries: the original, which supports 8-bit character strings - (including UTF-8 strings), and a second library that supports 16-bit - character strings (including UTF-16 strings). The build process allows - either one or both to be built. The majority of the work to make this - possible was done by Zoltan Herczeg. - - Starting with release 8.32 it is possible to compile a third separate - PCRE library that supports 32-bit character strings (including UTF-32 - strings). The build process allows any combination of the 8-, 16- and - 32-bit libraries. The work to make this possible was done by Christian - Persch. - - The three libraries contain identical sets of functions, except that - the names in the 16-bit library start with pcre16_ instead of pcre_, - and the names in the 32-bit library start with pcre32_ instead of - pcre_. To avoid over-complication and reduce the documentation mainte- - nance load, most of the documentation describes the 8-bit library, with - the differences for the 16-bit and 32-bit libraries described sepa- - rately in the pcre16 and pcre32 pages. References to functions or - structures of the form pcre[16|32]_xxx should be read as meaning - "pcre_xxx when using the 8-bit library, pcre16_xxx when using the - 16-bit library, or pcre32_xxx when using the 32-bit library". - - The current implementation of PCRE corresponds approximately with Perl - 5.12, including support for UTF-8/16/32 encoded strings and Unicode - general category properties. However, UTF-8/16/32 and Unicode support - has to be explicitly enabled; it is not the default. The Unicode tables - correspond to Unicode release 6.3.0. - - In addition to the Perl-compatible matching function, PCRE contains an - alternative function that matches the same compiled patterns in a dif- - ferent way. In certain circumstances, the alternative function has some - advantages. For a discussion of the two matching algorithms, see the - pcrematching page. - - PCRE is written in C and released as a C library. A number of people - have written wrappers and interfaces of various kinds. In particular, - Google Inc. have provided a comprehensive C++ wrapper for the 8-bit - library. This is now included as part of the PCRE distribution. The - pcrecpp page has details of this interface. Other people's contribu- - tions can be found in the Contrib directory at the primary FTP site, - which is: - - ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre - - Details of exactly which Perl regular expression features are and are - not supported by PCRE are given in separate documents. See the pcrepat- - tern and pcrecompat pages. There is a syntax summary in the pcresyntax - page. - - Some features of PCRE can be included, excluded, or changed when the - library is built. The pcre_config() function makes it possible for a - client to discover which features are available. The features them- - selves are described in the pcrebuild page. Documentation about build- - ing PCRE for various operating systems can be found in the README and - NON-AUTOTOOLS_BUILD files in the source distribution. - - The libraries contains a number of undocumented internal functions and - data tables that are used by more than one of the exported external - functions, but which are not intended for use by external callers. - Their names all begin with "_pcre_" or "_pcre16_" or "_pcre32_", which - hopefully will not provoke any name clashes. In some environments, it - is possible to control which external symbols are exported when a - shared library is built, and in these cases the undocumented symbols - are not exported. - - -SECURITY CONSIDERATIONS - - If you are using PCRE in a non-UTF application that permits users to - supply arbitrary patterns for compilation, you should be aware of a - feature that allows users to turn on UTF support from within a pattern, - provided that PCRE was built with UTF support. For example, an 8-bit - pattern that begins with "(*UTF8)" or "(*UTF)" turns on UTF-8 mode, - which interprets patterns and subjects as strings of UTF-8 characters - instead of individual 8-bit characters. This causes both the pattern - and any data against which it is matched to be checked for UTF-8 valid- - ity. If the data string is very long, such a check might use suffi- - ciently many resources as to cause your application to lose perfor- - mance. - - One way of guarding against this possibility is to use the - pcre_fullinfo() function to check the compiled pattern's options for - UTF. Alternatively, from release 8.33, you can set the PCRE_NEVER_UTF - option at compile time. This causes an compile time error if a pattern - contains a UTF-setting sequence. - - If your application is one that supports UTF, be aware that validity - checking can take time. If the same data string is to be matched many - times, you can use the PCRE_NO_UTF[8|16|32]_CHECK option for the second - and subsequent matches to save redundant checks. - - Another way that performance can be hit is by running a pattern that - has a very large search tree against a string that will never match. - Nested unlimited repeats in a pattern are a common example. PCRE pro- - vides some protection against this: see the PCRE_EXTRA_MATCH_LIMIT fea- - ture in the pcreapi page. - - -USER DOCUMENTATION - - The user documentation for PCRE comprises a number of different sec- - tions. In the "man" format, each of these is a separate "man page". In - the HTML format, each is a separate page, linked from the index page. - In the plain text format, the descriptions of the pcregrep and pcretest - programs are in files called pcregrep.txt and pcretest.txt, respec- - tively. The remaining sections, except for the pcredemo section (which - is a program listing), are concatenated in pcre.txt, for ease of - searching. The sections are as follows: - - pcre this document - pcre-config show PCRE installation configuration information - pcre16 details of the 16-bit library - pcre32 details of the 32-bit library - pcreapi details of PCRE's native C API - pcrebuild building PCRE - pcrecallout details of the callout feature - pcrecompat discussion of Perl compatibility - pcrecpp details of the C++ wrapper for the 8-bit library - pcredemo a demonstration C program that uses PCRE - pcregrep description of the pcregrep command (8-bit only) - pcrejit discussion of the just-in-time optimization support - pcrelimits details of size and other limits - pcrematching discussion of the two matching algorithms - pcrepartial details of the partial matching facility - pcrepattern syntax and semantics of supported - regular expressions - pcreperform discussion of performance issues - pcreposix the POSIX-compatible C API for the 8-bit library - pcreprecompile details of saving and re-using precompiled patterns - pcresample discussion of the pcredemo program - pcrestack discussion of stack usage - pcresyntax quick syntax reference - pcretest description of the pcretest testing command - pcreunicode discussion of Unicode and UTF-8/16/32 support - - In the "man" and HTML formats, there is also a short page for each C - library function, listing its arguments and results. - - -AUTHOR - - Philip Hazel - University Computing Service - Cambridge CB2 3QH, England. - - Putting an actual email address here seems to have been a spam magnet, - so I've taken it away. If you want to email me, use my two initials, - followed by the two digits 10, at the domain cam.ac.uk. - - -REVISION - - Last updated: 10 February 2015 - Copyright (c) 1997-2015 University of Cambridge. ------------------------------------------------------------------------------- - - -PCRE(3) Library Functions Manual PCRE(3) - - - -NAME - PCRE - Perl-compatible regular expressions - - #include - - -PCRE 16-BIT API BASIC FUNCTIONS - - pcre16 *pcre16_compile(PCRE_SPTR16 pattern, int options, - const char **errptr, int *erroffset, - const unsigned char *tableptr); - - pcre16 *pcre16_compile2(PCRE_SPTR16 pattern, int options, - int *errorcodeptr, - const char **errptr, int *erroffset, - const unsigned char *tableptr); - - pcre16_extra *pcre16_study(const pcre16 *code, int options, - const char **errptr); - - void pcre16_free_study(pcre16_extra *extra); - - int pcre16_exec(const pcre16 *code, const pcre16_extra *extra, - PCRE_SPTR16 subject, int length, int startoffset, - int options, int *ovector, int ovecsize); - - int pcre16_dfa_exec(const pcre16 *code, const pcre16_extra *extra, - PCRE_SPTR16 subject, int length, int startoffset, - int options, int *ovector, int ovecsize, - int *workspace, int wscount); - - -PCRE 16-BIT API STRING EXTRACTION FUNCTIONS - - int pcre16_copy_named_substring(const pcre16 *code, - PCRE_SPTR16 subject, int *ovector, - int stringcount, PCRE_SPTR16 stringname, - PCRE_UCHAR16 *buffer, int buffersize); - - int pcre16_copy_substring(PCRE_SPTR16 subject, int *ovector, - int stringcount, int stringnumber, PCRE_UCHAR16 *buffer, - int buffersize); - - int pcre16_get_named_substring(const pcre16 *code, - PCRE_SPTR16 subject, int *ovector, - int stringcount, PCRE_SPTR16 stringname, - PCRE_SPTR16 *stringptr); - - int pcre16_get_stringnumber(const pcre16 *code, - PCRE_SPTR16 name); - - int pcre16_get_stringtable_entries(const pcre16 *code, - PCRE_SPTR16 name, PCRE_UCHAR16 **first, PCRE_UCHAR16 **last); - - int pcre16_get_substring(PCRE_SPTR16 subject, int *ovector, - int stringcount, int stringnumber, - PCRE_SPTR16 *stringptr); - - int pcre16_get_substring_list(PCRE_SPTR16 subject, - int *ovector, int stringcount, PCRE_SPTR16 **listptr); - - void pcre16_free_substring(PCRE_SPTR16 stringptr); - - void pcre16_free_substring_list(PCRE_SPTR16 *stringptr); - - -PCRE 16-BIT API AUXILIARY FUNCTIONS - - pcre16_jit_stack *pcre16_jit_stack_alloc(int startsize, int maxsize); - - void pcre16_jit_stack_free(pcre16_jit_stack *stack); - - void pcre16_assign_jit_stack(pcre16_extra *extra, - pcre16_jit_callback callback, void *data); - - const unsigned char *pcre16_maketables(void); - - int pcre16_fullinfo(const pcre16 *code, const pcre16_extra *extra, - int what, void *where); - - int pcre16_refcount(pcre16 *code, int adjust); - - int pcre16_config(int what, void *where); - - const char *pcre16_version(void); - - int pcre16_pattern_to_host_byte_order(pcre16 *code, - pcre16_extra *extra, const unsigned char *tables); - - -PCRE 16-BIT API INDIRECTED FUNCTIONS - - void *(*pcre16_malloc)(size_t); - - void (*pcre16_free)(void *); - - void *(*pcre16_stack_malloc)(size_t); - - void (*pcre16_stack_free)(void *); - - int (*pcre16_callout)(pcre16_callout_block *); - - -PCRE 16-BIT API 16-BIT-ONLY FUNCTION - - int pcre16_utf16_to_host_byte_order(PCRE_UCHAR16 *output, - PCRE_SPTR16 input, int length, int *byte_order, - int keep_boms); - - -THE PCRE 16-BIT LIBRARY - - Starting with release 8.30, it is possible to compile a PCRE library - that supports 16-bit character strings, including UTF-16 strings, as - well as or instead of the original 8-bit library. The majority of the - work to make this possible was done by Zoltan Herczeg. The two - libraries contain identical sets of functions, used in exactly the same - way. Only the names of the functions and the data types of their argu- - ments and results are different. To avoid over-complication and reduce - the documentation maintenance load, most of the PCRE documentation - describes the 8-bit library, with only occasional references to the - 16-bit library. This page describes what is different when you use the - 16-bit library. - - WARNING: A single application can be linked with both libraries, but - you must take care when processing any particular pattern to use func- - tions from just one library. For example, if you want to study a pat- - tern that was compiled with pcre16_compile(), you must do so with - pcre16_study(), not pcre_study(), and you must free the study data with - pcre16_free_study(). - - -THE HEADER FILE - - There is only one header file, pcre.h. It contains prototypes for all - the functions in all libraries, as well as definitions of flags, struc- - tures, error codes, etc. - - -THE LIBRARY NAME - - In Unix-like systems, the 16-bit library is called libpcre16, and can - normally be accesss by adding -lpcre16 to the command for linking an - application that uses PCRE. - - -STRING TYPES - - In the 8-bit library, strings are passed to PCRE library functions as - vectors of bytes with the C type "char *". In the 16-bit library, - strings are passed as vectors of unsigned 16-bit quantities. The macro - PCRE_UCHAR16 specifies an appropriate data type, and PCRE_SPTR16 is - defined as "const PCRE_UCHAR16 *". In very many environments, "short - int" is a 16-bit data type. When PCRE is built, it defines PCRE_UCHAR16 - as "unsigned short int", but checks that it really is a 16-bit data - type. If it is not, the build fails with an error message telling the - maintainer to modify the definition appropriately. - - -STRUCTURE TYPES - - The types of the opaque structures that are used for compiled 16-bit - patterns and JIT stacks are pcre16 and pcre16_jit_stack respectively. - The type of the user-accessible structure that is returned by - pcre16_study() is pcre16_extra, and the type of the structure that is - used for passing data to a callout function is pcre16_callout_block. - These structures contain the same fields, with the same names, as their - 8-bit counterparts. The only difference is that pointers to character - strings are 16-bit instead of 8-bit types. - - -16-BIT FUNCTIONS - - For every function in the 8-bit library there is a corresponding func- - tion in the 16-bit library with a name that starts with pcre16_ instead - of pcre_. The prototypes are listed above. In addition, there is one - extra function, pcre16_utf16_to_host_byte_order(). This is a utility - function that converts a UTF-16 character string to host byte order if - necessary. The other 16-bit functions expect the strings they are - passed to be in host byte order. - - The input and output arguments of pcre16_utf16_to_host_byte_order() may - point to the same address, that is, conversion in place is supported. - The output buffer must be at least as long as the input. - - The length argument specifies the number of 16-bit data units in the - input string; a negative value specifies a zero-terminated string. - - If byte_order is NULL, it is assumed that the string starts off in host - byte order. This may be changed by byte-order marks (BOMs) anywhere in - the string (commonly as the first character). - - If byte_order is not NULL, a non-zero value of the integer to which it - points means that the input starts off in host byte order, otherwise - the opposite order is assumed. Again, BOMs in the string can change - this. The final byte order is passed back at the end of processing. - - If keep_boms is not zero, byte-order mark characters (0xfeff) are - copied into the output string. Otherwise they are discarded. - - The result of the function is the number of 16-bit units placed into - the output buffer, including the zero terminator if the string was - zero-terminated. - - -SUBJECT STRING OFFSETS - - The lengths and starting offsets of subject strings must be specified - in 16-bit data units, and the offsets within subject strings that are - returned by the matching functions are in also 16-bit units rather than - bytes. - - -NAMED SUBPATTERNS - - The name-to-number translation table that is maintained for named sub- - patterns uses 16-bit characters. The pcre16_get_stringtable_entries() - function returns the length of each entry in the table as the number of - 16-bit data units. - - -OPTION NAMES - - There are two new general option names, PCRE_UTF16 and - PCRE_NO_UTF16_CHECK, which correspond to PCRE_UTF8 and - PCRE_NO_UTF8_CHECK in the 8-bit library. In fact, these new options - define the same bits in the options word. There is a discussion about - the validity of UTF-16 strings in the pcreunicode page. - - For the pcre16_config() function there is an option PCRE_CONFIG_UTF16 - that returns 1 if UTF-16 support is configured, otherwise 0. If this - option is given to pcre_config() or pcre32_config(), or if the - PCRE_CONFIG_UTF8 or PCRE_CONFIG_UTF32 option is given to pcre16_con- - fig(), the result is the PCRE_ERROR_BADOPTION error. - - -CHARACTER CODES - - In 16-bit mode, when PCRE_UTF16 is not set, character values are - treated in the same way as in 8-bit, non UTF-8 mode, except, of course, - that they can range from 0 to 0xffff instead of 0 to 0xff. Character - types for characters less than 0xff can therefore be influenced by the - locale in the same way as before. Characters greater than 0xff have - only one case, and no "type" (such as letter or digit). - - In UTF-16 mode, the character code is Unicode, in the range 0 to - 0x10ffff, with the exception of values in the range 0xd800 to 0xdfff - because those are "surrogate" values that are used in pairs to encode - values greater than 0xffff. - - A UTF-16 string can indicate its endianness by special code knows as a - byte-order mark (BOM). The PCRE functions do not handle this, expecting - strings to be in host byte order. A utility function called - pcre16_utf16_to_host_byte_order() is provided to help with this (see - above). - - -ERROR NAMES - - The errors PCRE_ERROR_BADUTF16_OFFSET and PCRE_ERROR_SHORTUTF16 corre- - spond to their 8-bit counterparts. The error PCRE_ERROR_BADMODE is - given when a compiled pattern is passed to a function that processes - patterns in the other mode, for example, if a pattern compiled with - pcre_compile() is passed to pcre16_exec(). - - There are new error codes whose names begin with PCRE_UTF16_ERR for - invalid UTF-16 strings, corresponding to the PCRE_UTF8_ERR codes for - UTF-8 strings that are described in the section entitled "Reason codes - for invalid UTF-8 strings" in the main pcreapi page. The UTF-16 errors - are: - - PCRE_UTF16_ERR1 Missing low surrogate at end of string - PCRE_UTF16_ERR2 Invalid low surrogate follows high surrogate - PCRE_UTF16_ERR3 Isolated low surrogate - PCRE_UTF16_ERR4 Non-character - - -ERROR TEXTS - - If there is an error while compiling a pattern, the error text that is - passed back by pcre16_compile() or pcre16_compile2() is still an 8-bit - character string, zero-terminated. - - -CALLOUTS - - The subject and mark fields in the callout block that is passed to a - callout function point to 16-bit vectors. - - -TESTING - - The pcretest program continues to operate with 8-bit input and output - files, but it can be used for testing the 16-bit library. If it is run - with the command line option -16, patterns and subject strings are con- - verted from 8-bit to 16-bit before being passed to PCRE, and the 16-bit - library functions are used instead of the 8-bit ones. Returned 16-bit - strings are converted to 8-bit for output. If both the 8-bit and the - 32-bit libraries were not compiled, pcretest defaults to 16-bit and the - -16 option is ignored. - - When PCRE is being built, the RunTest script that is called by "make - check" uses the pcretest -C option to discover which of the 8-bit, - 16-bit and 32-bit libraries has been built, and runs the tests appro- - priately. - - -NOT SUPPORTED IN 16-BIT MODE - - Not all the features of the 8-bit library are available with the 16-bit - library. The C++ and POSIX wrapper functions support only the 8-bit - library, and the pcregrep program is at present 8-bit only. - - -AUTHOR - - Philip Hazel - University Computing Service - Cambridge CB2 3QH, England. - - -REVISION - - Last updated: 12 May 2013 - Copyright (c) 1997-2013 University of Cambridge. ------------------------------------------------------------------------------- - - -PCRE(3) Library Functions Manual PCRE(3) - - - -NAME - PCRE - Perl-compatible regular expressions - - #include - - -PCRE 32-BIT API BASIC FUNCTIONS - - pcre32 *pcre32_compile(PCRE_SPTR32 pattern, int options, - const char **errptr, int *erroffset, - const unsigned char *tableptr); - - pcre32 *pcre32_compile2(PCRE_SPTR32 pattern, int options, - int *errorcodeptr, - const unsigned char *tableptr); - - pcre32_extra *pcre32_study(const pcre32 *code, int options, - const char **errptr); - - void pcre32_free_study(pcre32_extra *extra); - - int pcre32_exec(const pcre32 *code, const pcre32_extra *extra, - PCRE_SPTR32 subject, int length, int startoffset, - int options, int *ovector, int ovecsize); - - int pcre32_dfa_exec(const pcre32 *code, const pcre32_extra *extra, - PCRE_SPTR32 subject, int length, int startoffset, - int options, int *ovector, int ovecsize, - int *workspace, int wscount); - - -PCRE 32-BIT API STRING EXTRACTION FUNCTIONS - - int pcre32_copy_named_substring(const pcre32 *code, - PCRE_SPTR32 subject, int *ovector, - int stringcount, PCRE_SPTR32 stringname, - PCRE_UCHAR32 *buffer, int buffersize); - - int pcre32_copy_substring(PCRE_SPTR32 subject, int *ovector, - int stringcount, int stringnumber, PCRE_UCHAR32 *buffer, - int buffersize); - - int pcre32_get_named_substring(const pcre32 *code, - PCRE_SPTR32 subject, int *ovector, - int stringcount, PCRE_SPTR32 stringname, - PCRE_SPTR32 *stringptr); - - int pcre32_get_stringnumber(const pcre32 *code, - PCRE_SPTR32 name); - - int pcre32_get_stringtable_entries(const pcre32 *code, - PCRE_SPTR32 name, PCRE_UCHAR32 **first, PCRE_UCHAR32 **last); - - int pcre32_get_substring(PCRE_SPTR32 subject, int *ovector, - int stringcount, int stringnumber, - PCRE_SPTR32 *stringptr); - - int pcre32_get_substring_list(PCRE_SPTR32 subject, - int *ovector, int stringcount, PCRE_SPTR32 **listptr); - - void pcre32_free_substring(PCRE_SPTR32 stringptr); - - void pcre32_free_substring_list(PCRE_SPTR32 *stringptr); - - -PCRE 32-BIT API AUXILIARY FUNCTIONS - - pcre32_jit_stack *pcre32_jit_stack_alloc(int startsize, int maxsize); - - void pcre32_jit_stack_free(pcre32_jit_stack *stack); - - void pcre32_assign_jit_stack(pcre32_extra *extra, - pcre32_jit_callback callback, void *data); - - const unsigned char *pcre32_maketables(void); - - int pcre32_fullinfo(const pcre32 *code, const pcre32_extra *extra, - int what, void *where); - - int pcre32_refcount(pcre32 *code, int adjust); - - int pcre32_config(int what, void *where); - - const char *pcre32_version(void); - - int pcre32_pattern_to_host_byte_order(pcre32 *code, - pcre32_extra *extra, const unsigned char *tables); - - -PCRE 32-BIT API INDIRECTED FUNCTIONS - - void *(*pcre32_malloc)(size_t); - - void (*pcre32_free)(void *); - - void *(*pcre32_stack_malloc)(size_t); - - void (*pcre32_stack_free)(void *); - - int (*pcre32_callout)(pcre32_callout_block *); - - -PCRE 32-BIT API 32-BIT-ONLY FUNCTION - - int pcre32_utf32_to_host_byte_order(PCRE_UCHAR32 *output, - PCRE_SPTR32 input, int length, int *byte_order, - int keep_boms); - - -THE PCRE 32-BIT LIBRARY - - Starting with release 8.32, it is possible to compile a PCRE library - that supports 32-bit character strings, including UTF-32 strings, as - well as or instead of the original 8-bit library. This work was done by - Christian Persch, based on the work done by Zoltan Herczeg for the - 16-bit library. All three libraries contain identical sets of func- - tions, used in exactly the same way. Only the names of the functions - and the data types of their arguments and results are different. To - avoid over-complication and reduce the documentation maintenance load, - most of the PCRE documentation describes the 8-bit library, with only - occasional references to the 16-bit and 32-bit libraries. This page - describes what is different when you use the 32-bit library. - - WARNING: A single application can be linked with all or any of the - three libraries, but you must take care when processing any particular - pattern to use functions from just one library. For example, if you - want to study a pattern that was compiled with pcre32_compile(), you - must do so with pcre32_study(), not pcre_study(), and you must free the - study data with pcre32_free_study(). - - -THE HEADER FILE - - There is only one header file, pcre.h. It contains prototypes for all - the functions in all libraries, as well as definitions of flags, struc- - tures, error codes, etc. - - -THE LIBRARY NAME - - In Unix-like systems, the 32-bit library is called libpcre32, and can - normally be accesss by adding -lpcre32 to the command for linking an - application that uses PCRE. - - -STRING TYPES - - In the 8-bit library, strings are passed to PCRE library functions as - vectors of bytes with the C type "char *". In the 32-bit library, - strings are passed as vectors of unsigned 32-bit quantities. The macro - PCRE_UCHAR32 specifies an appropriate data type, and PCRE_SPTR32 is - defined as "const PCRE_UCHAR32 *". In very many environments, "unsigned - int" is a 32-bit data type. When PCRE is built, it defines PCRE_UCHAR32 - as "unsigned int", but checks that it really is a 32-bit data type. If - it is not, the build fails with an error message telling the maintainer - to modify the definition appropriately. - - -STRUCTURE TYPES - - The types of the opaque structures that are used for compiled 32-bit - patterns and JIT stacks are pcre32 and pcre32_jit_stack respectively. - The type of the user-accessible structure that is returned by - pcre32_study() is pcre32_extra, and the type of the structure that is - used for passing data to a callout function is pcre32_callout_block. - These structures contain the same fields, with the same names, as their - 8-bit counterparts. The only difference is that pointers to character - strings are 32-bit instead of 8-bit types. - - -32-BIT FUNCTIONS - - For every function in the 8-bit library there is a corresponding func- - tion in the 32-bit library with a name that starts with pcre32_ instead - of pcre_. The prototypes are listed above. In addition, there is one - extra function, pcre32_utf32_to_host_byte_order(). This is a utility - function that converts a UTF-32 character string to host byte order if - necessary. The other 32-bit functions expect the strings they are - passed to be in host byte order. - - The input and output arguments of pcre32_utf32_to_host_byte_order() may - point to the same address, that is, conversion in place is supported. - The output buffer must be at least as long as the input. - - The length argument specifies the number of 32-bit data units in the - input string; a negative value specifies a zero-terminated string. - - If byte_order is NULL, it is assumed that the string starts off in host - byte order. This may be changed by byte-order marks (BOMs) anywhere in - the string (commonly as the first character). - - If byte_order is not NULL, a non-zero value of the integer to which it - points means that the input starts off in host byte order, otherwise - the opposite order is assumed. Again, BOMs in the string can change - this. The final byte order is passed back at the end of processing. - - If keep_boms is not zero, byte-order mark characters (0xfeff) are - copied into the output string. Otherwise they are discarded. - - The result of the function is the number of 32-bit units placed into - the output buffer, including the zero terminator if the string was - zero-terminated. - - -SUBJECT STRING OFFSETS - - The lengths and starting offsets of subject strings must be specified - in 32-bit data units, and the offsets within subject strings that are - returned by the matching functions are in also 32-bit units rather than - bytes. - - -NAMED SUBPATTERNS - - The name-to-number translation table that is maintained for named sub- - patterns uses 32-bit characters. The pcre32_get_stringtable_entries() - function returns the length of each entry in the table as the number of - 32-bit data units. - - -OPTION NAMES - - There are two new general option names, PCRE_UTF32 and - PCRE_NO_UTF32_CHECK, which correspond to PCRE_UTF8 and - PCRE_NO_UTF8_CHECK in the 8-bit library. In fact, these new options - define the same bits in the options word. There is a discussion about - the validity of UTF-32 strings in the pcreunicode page. - - For the pcre32_config() function there is an option PCRE_CONFIG_UTF32 - that returns 1 if UTF-32 support is configured, otherwise 0. If this - option is given to pcre_config() or pcre16_config(), or if the - PCRE_CONFIG_UTF8 or PCRE_CONFIG_UTF16 option is given to pcre32_con- - fig(), the result is the PCRE_ERROR_BADOPTION error. - - -CHARACTER CODES - - In 32-bit mode, when PCRE_UTF32 is not set, character values are - treated in the same way as in 8-bit, non UTF-8 mode, except, of course, - that they can range from 0 to 0x7fffffff instead of 0 to 0xff. Charac- - ter types for characters less than 0xff can therefore be influenced by - the locale in the same way as before. Characters greater than 0xff - have only one case, and no "type" (such as letter or digit). - - In UTF-32 mode, the character code is Unicode, in the range 0 to - 0x10ffff, with the exception of values in the range 0xd800 to 0xdfff - because those are "surrogate" values that are ill-formed in UTF-32. - - A UTF-32 string can indicate its endianness by special code knows as a - byte-order mark (BOM). The PCRE functions do not handle this, expecting - strings to be in host byte order. A utility function called - pcre32_utf32_to_host_byte_order() is provided to help with this (see - above). - - -ERROR NAMES - - The error PCRE_ERROR_BADUTF32 corresponds to its 8-bit counterpart. - The error PCRE_ERROR_BADMODE is given when a compiled pattern is passed - to a function that processes patterns in the other mode, for example, - if a pattern compiled with pcre_compile() is passed to pcre32_exec(). - - There are new error codes whose names begin with PCRE_UTF32_ERR for - invalid UTF-32 strings, corresponding to the PCRE_UTF8_ERR codes for - UTF-8 strings that are described in the section entitled "Reason codes - for invalid UTF-8 strings" in the main pcreapi page. The UTF-32 errors - are: - - PCRE_UTF32_ERR1 Surrogate character (range from 0xd800 to 0xdfff) - PCRE_UTF32_ERR2 Non-character - PCRE_UTF32_ERR3 Character > 0x10ffff - - -ERROR TEXTS - - If there is an error while compiling a pattern, the error text that is - passed back by pcre32_compile() or pcre32_compile2() is still an 8-bit - character string, zero-terminated. - - -CALLOUTS - - The subject and mark fields in the callout block that is passed to a - callout function point to 32-bit vectors. - - -TESTING - - The pcretest program continues to operate with 8-bit input and output - files, but it can be used for testing the 32-bit library. If it is run - with the command line option -32, patterns and subject strings are con- - verted from 8-bit to 32-bit before being passed to PCRE, and the 32-bit - library functions are used instead of the 8-bit ones. Returned 32-bit - strings are converted to 8-bit for output. If both the 8-bit and the - 16-bit libraries were not compiled, pcretest defaults to 32-bit and the - -32 option is ignored. - - When PCRE is being built, the RunTest script that is called by "make - check" uses the pcretest -C option to discover which of the 8-bit, - 16-bit and 32-bit libraries has been built, and runs the tests appro- - priately. - - -NOT SUPPORTED IN 32-BIT MODE - - Not all the features of the 8-bit library are available with the 32-bit - library. The C++ and POSIX wrapper functions support only the 8-bit - library, and the pcregrep program is at present 8-bit only. - - -AUTHOR - - Philip Hazel - University Computing Service - Cambridge CB2 3QH, England. - - -REVISION - - Last updated: 12 May 2013 - Copyright (c) 1997-2013 University of Cambridge. ------------------------------------------------------------------------------- - - -PCREBUILD(3) Library Functions Manual PCREBUILD(3) - - - -NAME - PCRE - Perl-compatible regular expressions - -BUILDING PCRE - - PCRE is distributed with a configure script that can be used to build - the library in Unix-like environments using the applications known as - Autotools. Also in the distribution are files to support building - using CMake instead of configure. The text file README contains general - information about building with Autotools (some of which is repeated - below), and also has some comments about building on various operating - systems. There is a lot more information about building PCRE without - using Autotools (including information about using CMake and building - "by hand") in the text file called NON-AUTOTOOLS-BUILD. You should - consult this file as well as the README file if you are building in a - non-Unix-like environment. - - -PCRE BUILD-TIME OPTIONS - - The rest of this document describes the optional features of PCRE that - can be selected when the library is compiled. It assumes use of the - configure script, where the optional features are selected or dese- - lected by providing options to configure before running the make com- - mand. However, the same options can be selected in both Unix-like and - non-Unix-like environments using the GUI facility of cmake-gui if you - are using CMake instead of configure to build PCRE. - - If you are not using Autotools or CMake, option selection can be done - by editing the config.h file, or by passing parameter settings to the - compiler, as described in NON-AUTOTOOLS-BUILD. - - The complete list of options for configure (which includes the standard - ones such as the selection of the installation directory) can be - obtained by running - - ./configure --help - - The following sections include descriptions of options whose names - begin with --enable or --disable. These settings specify changes to the - defaults for the configure command. Because of the way that configure - works, --enable and --disable always come in pairs, so the complemen- - tary option always exists as well, but as it specifies the default, it - is not described. - - -BUILDING 8-BIT, 16-BIT AND 32-BIT LIBRARIES - - By default, a library called libpcre is built, containing functions - that take string arguments contained in vectors of bytes, either as - single-byte characters, or interpreted as UTF-8 strings. You can also - build a separate library, called libpcre16, in which strings are con- - tained in vectors of 16-bit data units and interpreted either as sin- - gle-unit characters or UTF-16 strings, by adding - - --enable-pcre16 - - to the configure command. You can also build yet another separate - library, called libpcre32, in which strings are contained in vectors of - 32-bit data units and interpreted either as single-unit characters or - UTF-32 strings, by adding - - --enable-pcre32 - - to the configure command. If you do not want the 8-bit library, add - - --disable-pcre8 - - as well. At least one of the three libraries must be built. Note that - the C++ and POSIX wrappers are for the 8-bit library only, and that - pcregrep is an 8-bit program. None of these are built if you select - only the 16-bit or 32-bit libraries. - - -BUILDING SHARED AND STATIC LIBRARIES - - The Autotools PCRE building process uses libtool to build both shared - and static libraries by default. You can suppress one of these by - adding one of - - --disable-shared - --disable-static - - to the configure command, as required. - - -C++ SUPPORT - - By default, if the 8-bit library is being built, the configure script - will search for a C++ compiler and C++ header files. If it finds them, - it automatically builds the C++ wrapper library (which supports only - 8-bit strings). You can disable this by adding - - --disable-cpp - - to the configure command. - - -UTF-8, UTF-16 AND UTF-32 SUPPORT - - To build PCRE with support for UTF Unicode character strings, add - - --enable-utf - - to the configure command. This setting applies to all three libraries, - adding support for UTF-8 to the 8-bit library, support for UTF-16 to - the 16-bit library, and support for UTF-32 to the to the 32-bit - library. There are no separate options for enabling UTF-8, UTF-16 and - UTF-32 independently because that would allow ridiculous settings such - as requesting UTF-16 support while building only the 8-bit library. It - is not possible to build one library with UTF support and another with- - out in the same configuration. (For backwards compatibility, --enable- - utf8 is a synonym of --enable-utf.) - - Of itself, this setting does not make PCRE treat strings as UTF-8, - UTF-16 or UTF-32. As well as compiling PCRE with this option, you also - have have to set the PCRE_UTF8, PCRE_UTF16 or PCRE_UTF32 option (as - appropriate) when you call one of the pattern compiling functions. - - If you set --enable-utf when compiling in an EBCDIC environment, PCRE - expects its input to be either ASCII or UTF-8 (depending on the run- - time option). It is not possible to support both EBCDIC and UTF-8 codes - in the same version of the library. Consequently, --enable-utf and - --enable-ebcdic are mutually exclusive. - - -UNICODE CHARACTER PROPERTY SUPPORT - - UTF support allows the libraries to process character codepoints up to - 0x10ffff in the strings that they handle. On its own, however, it does - not provide any facilities for accessing the properties of such charac- - ters. If you want to be able to use the pattern escapes \P, \p, and \X, - which refer to Unicode character properties, you must add - - --enable-unicode-properties - - to the configure command. This implies UTF support, even if you have - not explicitly requested it. - - Including Unicode property support adds around 30K of tables to the - PCRE library. Only the general category properties such as Lu and Nd - are supported. Details are given in the pcrepattern documentation. - - -JUST-IN-TIME COMPILER SUPPORT - - Just-in-time compiler support is included in the build by specifying - - --enable-jit - - This support is available only for certain hardware architectures. If - this option is set for an unsupported architecture, a compile time - error occurs. See the pcrejit documentation for a discussion of JIT - usage. When JIT support is enabled, pcregrep automatically makes use of - it, unless you add - - --disable-pcregrep-jit - - to the "configure" command. - - -CODE VALUE OF NEWLINE - - By default, PCRE interprets the linefeed (LF) character as indicating - the end of a line. This is the normal newline character on Unix-like - systems. You can compile PCRE to use carriage return (CR) instead, by - adding - - --enable-newline-is-cr - - to the configure command. There is also a --enable-newline-is-lf - option, which explicitly specifies linefeed as the newline character. - - Alternatively, you can specify that line endings are to be indicated by - the two character sequence CRLF. If you want this, add - - --enable-newline-is-crlf - - to the configure command. There is a fourth option, specified by - - --enable-newline-is-anycrlf - - which causes PCRE to recognize any of the three sequences CR, LF, or - CRLF as indicating a line ending. Finally, a fifth option, specified by - - --enable-newline-is-any - - causes PCRE to recognize any Unicode newline sequence. - - Whatever line ending convention is selected when PCRE is built can be - overridden when the library functions are called. At build time it is - conventional to use the standard for your operating system. - - -WHAT \R MATCHES - - By default, the sequence \R in a pattern matches any Unicode newline - sequence, whatever has been selected as the line ending sequence. If - you specify - - --enable-bsr-anycrlf - - the default is changed so that \R matches only CR, LF, or CRLF. What- - ever is selected when PCRE is built can be overridden when the library - functions are called. - - -POSIX MALLOC USAGE - - When the 8-bit library is called through the POSIX interface (see the - pcreposix documentation), additional working storage is required for - holding the pointers to capturing substrings, because PCRE requires - three integers per substring, whereas the POSIX interface provides only - two. If the number of expected substrings is small, the wrapper func- - tion uses space on the stack, because this is faster than using mal- - loc() for each call. The default threshold above which the stack is no - longer used is 10; it can be changed by adding a setting such as - - --with-posix-malloc-threshold=20 - - to the configure command. - - -HANDLING VERY LARGE PATTERNS - - Within a compiled pattern, offset values are used to point from one - part to another (for example, from an opening parenthesis to an alter- - nation metacharacter). By default, in the 8-bit and 16-bit libraries, - two-byte values are used for these offsets, leading to a maximum size - for a compiled pattern of around 64K. This is sufficient to handle all - but the most gigantic patterns. Nevertheless, some people do want to - process truly enormous patterns, so it is possible to compile PCRE to - use three-byte or four-byte offsets by adding a setting such as - - --with-link-size=3 - - to the configure command. The value given must be 2, 3, or 4. For the - 16-bit library, a value of 3 is rounded up to 4. In these libraries, - using longer offsets slows down the operation of PCRE because it has to - load additional data when handling them. For the 32-bit library the - value is always 4 and cannot be overridden; the value of --with-link- - size is ignored. - - -AVOIDING EXCESSIVE STACK USAGE - - When matching with the pcre_exec() function, PCRE implements backtrack- - ing by making recursive calls to an internal function called match(). - In environments where the size of the stack is limited, this can se- - verely limit PCRE's operation. (The Unix environment does not usually - suffer from this problem, but it may sometimes be necessary to increase - the maximum stack size. There is a discussion in the pcrestack docu- - mentation.) An alternative approach to recursion that uses memory from - the heap to remember data, instead of using recursive function calls, - has been implemented to work round the problem of limited stack size. - If you want to build a version of PCRE that works this way, add - - --disable-stack-for-recursion - - to the configure command. With this configuration, PCRE will use the - pcre_stack_malloc and pcre_stack_free variables to call memory manage- - ment functions. By default these point to malloc() and free(), but you - can replace the pointers so that your own functions are used instead. - - Separate functions are provided rather than using pcre_malloc and - pcre_free because the usage is very predictable: the block sizes - requested are always the same, and the blocks are always freed in - reverse order. A calling program might be able to implement optimized - functions that perform better than malloc() and free(). PCRE runs - noticeably more slowly when built in this way. This option affects only - the pcre_exec() function; it is not relevant for pcre_dfa_exec(). - - -LIMITING PCRE RESOURCE USAGE - - Internally, PCRE has a function called match(), which it calls repeat- - edly (sometimes recursively) when matching a pattern with the - pcre_exec() function. By controlling the maximum number of times this - function may be called during a single matching operation, a limit can - be placed on the resources used by a single call to pcre_exec(). The - limit can be changed at run time, as described in the pcreapi documen- - tation. The default is 10 million, but this can be changed by adding a - setting such as - - --with-match-limit=500000 - - to the configure command. This setting has no effect on the - pcre_dfa_exec() matching function. - - In some environments it is desirable to limit the depth of recursive - calls of match() more strictly than the total number of calls, in order - to restrict the maximum amount of stack (or heap, if --disable-stack- - for-recursion is specified) that is used. A second limit controls this; - it defaults to the value that is set for --with-match-limit, which - imposes no additional constraints. However, you can set a lower limit - by adding, for example, - - --with-match-limit-recursion=10000 - - to the configure command. This value can also be overridden at run - time. - - -CREATING CHARACTER TABLES AT BUILD TIME - - PCRE uses fixed tables for processing characters whose code values are - less than 256. By default, PCRE is built with a set of tables that are - distributed in the file pcre_chartables.c.dist. These tables are for - ASCII codes only. If you add - - --enable-rebuild-chartables - - to the configure command, the distributed tables are no longer used. - Instead, a program called dftables is compiled and run. This outputs - the source for new set of tables, created in the default locale of your - C run-time system. (This method of replacing the tables does not work - if you are cross compiling, because dftables is run on the local host. - If you need to create alternative tables when cross compiling, you will - have to do so "by hand".) - - -USING EBCDIC CODE - - PCRE assumes by default that it will run in an environment where the - character code is ASCII (or Unicode, which is a superset of ASCII). - This is the case for most computer operating systems. PCRE can, how- - ever, be compiled to run in an EBCDIC environment by adding - - --enable-ebcdic - - to the configure command. This setting implies --enable-rebuild-charta- - bles. You should only use it if you know that you are in an EBCDIC - environment (for example, an IBM mainframe operating system). The - --enable-ebcdic option is incompatible with --enable-utf. - - The EBCDIC character that corresponds to an ASCII LF is assumed to have - the value 0x15 by default. However, in some EBCDIC environments, 0x25 - is used. In such an environment you should use - - --enable-ebcdic-nl25 - - as well as, or instead of, --enable-ebcdic. The EBCDIC character for CR - has the same value as in ASCII, namely, 0x0d. Whichever of 0x15 and - 0x25 is not chosen as LF is made to correspond to the Unicode NEL char- - acter (which, in Unicode, is 0x85). - - The options that select newline behaviour, such as --enable-newline-is- - cr, and equivalent run-time options, refer to these character values in - an EBCDIC environment. - - -PCREGREP OPTIONS FOR COMPRESSED FILE SUPPORT - - By default, pcregrep reads all files as plain text. You can build it so - that it recognizes files whose names end in .gz or .bz2, and reads them - with libz or libbz2, respectively, by adding one or both of - - --enable-pcregrep-libz - --enable-pcregrep-libbz2 - - to the configure command. These options naturally require that the rel- - evant libraries are installed on your system. Configuration will fail - if they are not. - - -PCREGREP BUFFER SIZE - - pcregrep uses an internal buffer to hold a "window" on the file it is - scanning, in order to be able to output "before" and "after" lines when - it finds a match. The size of the buffer is controlled by a parameter - whose default value is 20K. The buffer itself is three times this size, - but because of the way it is used for holding "before" lines, the long- - est line that is guaranteed to be processable is the parameter size. - You can change the default parameter value by adding, for example, - - --with-pcregrep-bufsize=50K - - to the configure command. The caller of pcregrep can, however, override - this value by specifying a run-time option. - - -PCRETEST OPTION FOR LIBREADLINE SUPPORT - - If you add - - --enable-pcretest-libreadline - - to the configure command, pcretest is linked with the libreadline - library, and when its input is from a terminal, it reads it using the - readline() function. This provides line-editing and history facilities. - Note that libreadline is GPL-licensed, so if you distribute a binary of - pcretest linked in this way, there may be licensing issues. - - Setting this option causes the -lreadline option to be added to the - pcretest build. In many operating environments with a sytem-installed - libreadline this is sufficient. However, in some environments (e.g. if - an unmodified distribution version of readline is in use), some extra - configuration may be necessary. The INSTALL file for libreadline says - this: - - "Readline uses the termcap functions, but does not link with the - termcap or curses library itself, allowing applications which link - with readline the to choose an appropriate library." - - If your environment has not been set up so that an appropriate library - is automatically included, you may need to add something like - - LIBS="-ncurses" - - immediately before the configure command. - - -DEBUGGING WITH VALGRIND SUPPORT - - By adding the - - --enable-valgrind - - option to to the configure command, PCRE will use valgrind annotations - to mark certain memory regions as unaddressable. This allows it to - detect invalid memory accesses, and is mostly useful for debugging PCRE - itself. - - -CODE COVERAGE REPORTING - - If your C compiler is gcc, you can build a version of PCRE that can - generate a code coverage report for its test suite. To enable this, you - must install lcov version 1.6 or above. Then specify - - --enable-coverage - - to the configure command and build PCRE in the usual way. - - Note that using ccache (a caching C compiler) is incompatible with code - coverage reporting. If you have configured ccache to run automatically - on your system, you must set the environment variable - - CCACHE_DISABLE=1 - - before running make to build PCRE, so that ccache is not used. - - When --enable-coverage is used, the following addition targets are - added to the Makefile: - - make coverage - - This creates a fresh coverage report for the PCRE test suite. It is - equivalent to running "make coverage-reset", "make coverage-baseline", - "make check", and then "make coverage-report". - - make coverage-reset - - This zeroes the coverage counters, but does nothing else. - - make coverage-baseline - - This captures baseline coverage information. - - make coverage-report - - This creates the coverage report. - - make coverage-clean-report - - This removes the generated coverage report without cleaning the cover- - age data itself. - - make coverage-clean-data - - This removes the captured coverage data without removing the coverage - files created at compile time (*.gcno). - - make coverage-clean - - This cleans all coverage data including the generated coverage report. - For more information about code coverage, see the gcov and lcov docu- - mentation. - - -SEE ALSO - - pcreapi(3), pcre16, pcre32, pcre_config(3). - - -AUTHOR - - Philip Hazel - University Computing Service - Cambridge CB2 3QH, England. - - -REVISION - - Last updated: 12 May 2013 - Copyright (c) 1997-2013 University of Cambridge. ------------------------------------------------------------------------------- - - -PCREMATCHING(3) Library Functions Manual PCREMATCHING(3) - - - -NAME - PCRE - Perl-compatible regular expressions - -PCRE MATCHING ALGORITHMS - - This document describes the two different algorithms that are available - in PCRE for matching a compiled regular expression against a given sub- - ject string. The "standard" algorithm is the one provided by the - pcre_exec(), pcre16_exec() and pcre32_exec() functions. These work in - the same as as Perl's matching function, and provide a Perl-compatible - matching operation. The just-in-time (JIT) optimization that is - described in the pcrejit documentation is compatible with these func- - tions. - - An alternative algorithm is provided by the pcre_dfa_exec(), - pcre16_dfa_exec() and pcre32_dfa_exec() functions; they operate in a - different way, and are not Perl-compatible. This alternative has advan- - tages and disadvantages compared with the standard algorithm, and these - are described below. - - When there is only one possible way in which a given subject string can - match a pattern, the two algorithms give the same answer. A difference - arises, however, when there are multiple possibilities. For example, if - the pattern - - ^<.*> - - is matched against the string - - - - there are three possible answers. The standard algorithm finds only one - of them, whereas the alternative algorithm finds all three. - - -REGULAR EXPRESSIONS AS TREES - - The set of strings that are matched by a regular expression can be rep- - resented as a tree structure. An unlimited repetition in the pattern - makes the tree of infinite size, but it is still a tree. Matching the - pattern to a given subject string (from a given starting point) can be - thought of as a search of the tree. There are two ways to search a - tree: depth-first and breadth-first, and these correspond to the two - matching algorithms provided by PCRE. - - -THE STANDARD MATCHING ALGORITHM - - In the terminology of Jeffrey Friedl's book "Mastering Regular Expres- - sions", the standard algorithm is an "NFA algorithm". It conducts a - depth-first search of the pattern tree. That is, it proceeds along a - single path through the tree, checking that the subject matches what is - required. When there is a mismatch, the algorithm tries any alterna- - tives at the current point, and if they all fail, it backs up to the - previous branch point in the tree, and tries the next alternative - branch at that level. This often involves backing up (moving to the - left) in the subject string as well. The order in which repetition - branches are tried is controlled by the greedy or ungreedy nature of - the quantifier. - - If a leaf node is reached, a matching string has been found, and at - that point the algorithm stops. Thus, if there is more than one possi- - ble match, this algorithm returns the first one that it finds. Whether - this is the shortest, the longest, or some intermediate length depends - on the way the greedy and ungreedy repetition quantifiers are specified - in the pattern. - - Because it ends up with a single path through the tree, it is rela- - tively straightforward for this algorithm to keep track of the sub- - strings that are matched by portions of the pattern in parentheses. - This provides support for capturing parentheses and back references. - - -THE ALTERNATIVE MATCHING ALGORITHM - - This algorithm conducts a breadth-first search of the tree. Starting - from the first matching point in the subject, it scans the subject - string from left to right, once, character by character, and as it does - this, it remembers all the paths through the tree that represent valid - matches. In Friedl's terminology, this is a kind of "DFA algorithm", - though it is not implemented as a traditional finite state machine (it - keeps multiple states active simultaneously). - - Although the general principle of this matching algorithm is that it - scans the subject string only once, without backtracking, there is one - exception: when a lookaround assertion is encountered, the characters - following or preceding the current point have to be independently - inspected. - - The scan continues until either the end of the subject is reached, or - there are no more unterminated paths. At this point, terminated paths - represent the different matching possibilities (if there are none, the - match has failed). Thus, if there is more than one possible match, - this algorithm finds all of them, and in particular, it finds the long- - est. The matches are returned in decreasing order of length. There is - an option to stop the algorithm after the first match (which is neces- - sarily the shortest) is found. - - Note that all the matches that are found start at the same point in the - subject. If the pattern - - cat(er(pillar)?)? - - is matched against the string "the caterpillar catchment", the result - will be the three strings "caterpillar", "cater", and "cat" that start - at the fifth character of the subject. The algorithm does not automati- - cally move on to find matches that start at later positions. - - PCRE's "auto-possessification" optimization usually applies to charac- - ter repeats at the end of a pattern (as well as internally). For exam- - ple, the pattern "a\d+" is compiled as if it were "a\d++" because there - is no point even considering the possibility of backtracking into the - repeated digits. For DFA matching, this means that only one possible - match is found. If you really do want multiple matches in such cases, - either use an ungreedy repeat ("a\d+?") or set the PCRE_NO_AUTO_POSSESS - option when compiling. - - There are a number of features of PCRE regular expressions that are not - supported by the alternative matching algorithm. They are as follows: - - 1. Because the algorithm finds all possible matches, the greedy or - ungreedy nature of repetition quantifiers is not relevant. Greedy and - ungreedy quantifiers are treated in exactly the same way. However, pos- - sessive quantifiers can make a difference when what follows could also - match what is quantified, for example in a pattern like this: - - ^a++\w! - - This pattern matches "aaab!" but not "aaa!", which would be matched by - a non-possessive quantifier. Similarly, if an atomic group is present, - it is matched as if it were a standalone pattern at the current point, - and the longest match is then "locked in" for the rest of the overall - pattern. - - 2. When dealing with multiple paths through the tree simultaneously, it - is not straightforward to keep track of captured substrings for the - different matching possibilities, and PCRE's implementation of this - algorithm does not attempt to do this. This means that no captured sub- - strings are available. - - 3. Because no substrings are captured, back references within the pat- - tern are not supported, and cause errors if encountered. - - 4. For the same reason, conditional expressions that use a backrefer- - ence as the condition or test for a specific group recursion are not - supported. - - 5. Because many paths through the tree may be active, the \K escape - sequence, which resets the start of the match when encountered (but may - be on some paths and not on others), is not supported. It causes an - error if encountered. - - 6. Callouts are supported, but the value of the capture_top field is - always 1, and the value of the capture_last field is always -1. - - 7. The \C escape sequence, which (in the standard algorithm) always - matches a single data unit, even in UTF-8, UTF-16 or UTF-32 modes, is - not supported in these modes, because the alternative algorithm moves - through the subject string one character (not data unit) at a time, for - all active paths through the tree. - - 8. Except for (*FAIL), the backtracking control verbs such as (*PRUNE) - are not supported. (*FAIL) is supported, and behaves like a failing - negative assertion. - - -ADVANTAGES OF THE ALTERNATIVE ALGORITHM - - Using the alternative matching algorithm provides the following advan- - tages: - - 1. All possible matches (at a single point in the subject) are automat- - ically found, and in particular, the longest match is found. To find - more than one match using the standard algorithm, you have to do kludgy - things with callouts. - - 2. Because the alternative algorithm scans the subject string just - once, and never needs to backtrack (except for lookbehinds), it is pos- - sible to pass very long subject strings to the matching function in - several pieces, checking for partial matching each time. Although it is - possible to do multi-segment matching using the standard algorithm by - retaining partially matched substrings, it is more complicated. The - pcrepartial documentation gives details of partial matching and dis- - cusses multi-segment matching. - - -DISADVANTAGES OF THE ALTERNATIVE ALGORITHM - - The alternative algorithm suffers from a number of disadvantages: - - 1. It is substantially slower than the standard algorithm. This is - partly because it has to search for all possible matches, but is also - because it is less susceptible to optimization. - - 2. Capturing parentheses and back references are not supported. - - 3. Although atomic groups are supported, their use does not provide the - performance advantage that it does for the standard algorithm. - - -AUTHOR - - Philip Hazel - University Computing Service - Cambridge CB2 3QH, England. - - -REVISION - - Last updated: 12 November 2013 - Copyright (c) 1997-2012 University of Cambridge. ------------------------------------------------------------------------------- - - -PCREAPI(3) Library Functions Manual PCREAPI(3) - - - -NAME - PCRE - Perl-compatible regular expressions - - #include - - -PCRE NATIVE API BASIC FUNCTIONS - - pcre *pcre_compile(const char *pattern, int options, - const char **errptr, int *erroffset, - const unsigned char *tableptr); - - pcre *pcre_compile2(const char *pattern, int options, - int *errorcodeptr, - const char **errptr, int *erroffset, - const unsigned char *tableptr); - - pcre_extra *pcre_study(const pcre *code, int options, - const char **errptr); - - void pcre_free_study(pcre_extra *extra); - - int pcre_exec(const pcre *code, const pcre_extra *extra, - const char *subject, int length, int startoffset, - int options, int *ovector, int ovecsize); - - int pcre_dfa_exec(const pcre *code, const pcre_extra *extra, - const char *subject, int length, int startoffset, - int options, int *ovector, int ovecsize, - int *workspace, int wscount); - - -PCRE NATIVE API STRING EXTRACTION FUNCTIONS - - int pcre_copy_named_substring(const pcre *code, - const char *subject, int *ovector, - int stringcount, const char *stringname, - char *buffer, int buffersize); - - int pcre_copy_substring(const char *subject, int *ovector, - int stringcount, int stringnumber, char *buffer, - int buffersize); - - int pcre_get_named_substring(const pcre *code, - const char *subject, int *ovector, - int stringcount, const char *stringname, - const char **stringptr); - - int pcre_get_stringnumber(const pcre *code, - const char *name); - - int pcre_get_stringtable_entries(const pcre *code, - const char *name, char **first, char **last); - - int pcre_get_substring(const char *subject, int *ovector, - int stringcount, int stringnumber, - const char **stringptr); - - int pcre_get_substring_list(const char *subject, - int *ovector, int stringcount, const char ***listptr); - - void pcre_free_substring(const char *stringptr); - - void pcre_free_substring_list(const char **stringptr); - - -PCRE NATIVE API AUXILIARY FUNCTIONS - - int pcre_jit_exec(const pcre *code, const pcre_extra *extra, - const char *subject, int length, int startoffset, - int options, int *ovector, int ovecsize, - pcre_jit_stack *jstack); - - pcre_jit_stack *pcre_jit_stack_alloc(int startsize, int maxsize); - - void pcre_jit_stack_free(pcre_jit_stack *stack); - - void pcre_assign_jit_stack(pcre_extra *extra, - pcre_jit_callback callback, void *data); - - const unsigned char *pcre_maketables(void); - - int pcre_fullinfo(const pcre *code, const pcre_extra *extra, - int what, void *where); - - int pcre_refcount(pcre *code, int adjust); - - int pcre_config(int what, void *where); - - const char *pcre_version(void); - - int pcre_pattern_to_host_byte_order(pcre *code, - pcre_extra *extra, const unsigned char *tables); - - -PCRE NATIVE API INDIRECTED FUNCTIONS - - void *(*pcre_malloc)(size_t); - - void (*pcre_free)(void *); - - void *(*pcre_stack_malloc)(size_t); - - void (*pcre_stack_free)(void *); - - int (*pcre_callout)(pcre_callout_block *); - - int (*pcre_stack_guard)(void); - - -PCRE 8-BIT, 16-BIT, AND 32-BIT LIBRARIES - - As well as support for 8-bit character strings, PCRE also supports - 16-bit strings (from release 8.30) and 32-bit strings (from release - 8.32), by means of two additional libraries. They can be built as well - as, or instead of, the 8-bit library. To avoid too much complication, - this document describes the 8-bit versions of the functions, with only - occasional references to the 16-bit and 32-bit libraries. - - The 16-bit and 32-bit functions operate in the same way as their 8-bit - counterparts; they just use different data types for their arguments - and results, and their names start with pcre16_ or pcre32_ instead of - pcre_. For every option that has UTF8 in its name (for example, - PCRE_UTF8), there are corresponding 16-bit and 32-bit names with UTF8 - replaced by UTF16 or UTF32, respectively. This facility is in fact just - cosmetic; the 16-bit and 32-bit option names define the same bit val- - ues. - - References to bytes and UTF-8 in this document should be read as refer- - ences to 16-bit data units and UTF-16 when using the 16-bit library, or - 32-bit data units and UTF-32 when using the 32-bit library, unless - specified otherwise. More details of the specific differences for the - 16-bit and 32-bit libraries are given in the pcre16 and pcre32 pages. - - -PCRE API OVERVIEW - - PCRE has its own native API, which is described in this document. There - are also some wrapper functions (for the 8-bit library only) that cor- - respond to the POSIX regular expression API, but they do not give - access to all the functionality. They are described in the pcreposix - documentation. Both of these APIs define a set of C function calls. A - C++ wrapper (again for the 8-bit library only) is also distributed with - PCRE. It is documented in the pcrecpp page. - - The native API C function prototypes are defined in the header file - pcre.h, and on Unix-like systems the (8-bit) library itself is called - libpcre. It can normally be accessed by adding -lpcre to the command - for linking an application that uses PCRE. The header file defines the - macros PCRE_MAJOR and PCRE_MINOR to contain the major and minor release - numbers for the library. Applications can use these to include support - for different releases of PCRE. - - In a Windows environment, if you want to statically link an application - program against a non-dll pcre.a file, you must define PCRE_STATIC - before including pcre.h or pcrecpp.h, because otherwise the pcre_mal- - loc() and pcre_free() exported functions will be declared - __declspec(dllimport), with unwanted results. - - The functions pcre_compile(), pcre_compile2(), pcre_study(), and - pcre_exec() are used for compiling and matching regular expressions in - a Perl-compatible manner. A sample program that demonstrates the sim- - plest way of using them is provided in the file called pcredemo.c in - the PCRE source distribution. A listing of this program is given in the - pcredemo documentation, and the pcresample documentation describes how - to compile and run it. - - Just-in-time compiler support is an optional feature of PCRE that can - be built in appropriate hardware environments. It greatly speeds up the - matching performance of many patterns. Simple programs can easily - request that it be used if available, by setting an option that is - ignored when it is not relevant. More complicated programs might need - to make use of the functions pcre_jit_stack_alloc(), - pcre_jit_stack_free(), and pcre_assign_jit_stack() in order to control - the JIT code's memory usage. - - From release 8.32 there is also a direct interface for JIT execution, - which gives improved performance. The JIT-specific functions are dis- - cussed in the pcrejit documentation. - - A second matching function, pcre_dfa_exec(), which is not Perl-compati- - ble, is also provided. This uses a different algorithm for the match- - ing. The alternative algorithm finds all possible matches (at a given - point in the subject), and scans the subject just once (unless there - are lookbehind assertions). However, this algorithm does not return - captured substrings. A description of the two matching algorithms and - their advantages and disadvantages is given in the pcrematching docu- - mentation. - - In addition to the main compiling and matching functions, there are - convenience functions for extracting captured substrings from a subject - string that is matched by pcre_exec(). They are: - - pcre_copy_substring() - pcre_copy_named_substring() - pcre_get_substring() - pcre_get_named_substring() - pcre_get_substring_list() - pcre_get_stringnumber() - pcre_get_stringtable_entries() - - pcre_free_substring() and pcre_free_substring_list() are also provided, - to free the memory used for extracted strings. - - The function pcre_maketables() is used to build a set of character - tables in the current locale for passing to pcre_compile(), - pcre_exec(), or pcre_dfa_exec(). This is an optional facility that is - provided for specialist use. Most commonly, no special tables are - passed, in which case internal tables that are generated when PCRE is - built are used. - - The function pcre_fullinfo() is used to find out information about a - compiled pattern. The function pcre_version() returns a pointer to a - string containing the version of PCRE and its date of release. - - The function pcre_refcount() maintains a reference count in a data - block containing a compiled pattern. This is provided for the benefit - of object-oriented applications. - - The global variables pcre_malloc and pcre_free initially contain the - entry points of the standard malloc() and free() functions, respec- - tively. PCRE calls the memory management functions via these variables, - so a calling program can replace them if it wishes to intercept the - calls. This should be done before calling any PCRE functions. - - The global variables pcre_stack_malloc and pcre_stack_free are also - indirections to memory management functions. These special functions - are used only when PCRE is compiled to use the heap for remembering - data, instead of recursive function calls, when running the pcre_exec() - function. See the pcrebuild documentation for details of how to do - this. It is a non-standard way of building PCRE, for use in environ- - ments that have limited stacks. Because of the greater use of memory - management, it runs more slowly. Separate functions are provided so - that special-purpose external code can be used for this case. When - used, these functions always allocate memory blocks of the same size. - There is a discussion about PCRE's stack usage in the pcrestack docu- - mentation. - - The global variable pcre_callout initially contains NULL. It can be set - by the caller to a "callout" function, which PCRE will then call at - specified points during a matching operation. Details are given in the - pcrecallout documentation. - - The global variable pcre_stack_guard initially contains NULL. It can be - set by the caller to a function that is called by PCRE whenever it - starts to compile a parenthesized part of a pattern. When parentheses - are nested, PCRE uses recursive function calls, which use up the system - stack. This function is provided so that applications with restricted - stacks can force a compilation error if the stack runs out. The func- - tion should return zero if all is well, or non-zero to force an error. - - -NEWLINES - - PCRE supports five different conventions for indicating line breaks in - strings: a single CR (carriage return) character, a single LF (line- - feed) character, the two-character sequence CRLF, any of the three pre- - ceding, or any Unicode newline sequence. The Unicode newline sequences - are the three just mentioned, plus the single characters VT (vertical - tab, U+000B), FF (form feed, U+000C), NEL (next line, U+0085), LS (line - separator, U+2028), and PS (paragraph separator, U+2029). - - Each of the first three conventions is used by at least one operating - system as its standard newline sequence. When PCRE is built, a default - can be specified. The default default is LF, which is the Unix stan- - dard. When PCRE is run, the default can be overridden, either when a - pattern is compiled, or when it is matched. - - At compile time, the newline convention can be specified by the options - argument of pcre_compile(), or it can be specified by special text at - the start of the pattern itself; this overrides any other settings. See - the pcrepattern page for details of the special character sequences. - - In the PCRE documentation the word "newline" is used to mean "the char- - acter or pair of characters that indicate a line break". The choice of - newline convention affects the handling of the dot, circumflex, and - dollar metacharacters, the handling of #-comments in /x mode, and, when - CRLF is a recognized line ending sequence, the match position advance- - ment for a non-anchored pattern. There is more detail about this in the - section on pcre_exec() options below. - - The choice of newline convention does not affect the interpretation of - the \n or \r escape sequences, nor does it affect what \R matches, - which is controlled in a similar way, but by separate options. - - -MULTITHREADING - - The PCRE functions can be used in multi-threading applications, with - the proviso that the memory management functions pointed to by - pcre_malloc, pcre_free, pcre_stack_malloc, and pcre_stack_free, and the - callout and stack-checking functions pointed to by pcre_callout and - pcre_stack_guard, are shared by all threads. - - The compiled form of a regular expression is not altered during match- - ing, so the same compiled pattern can safely be used by several threads - at once. - - If the just-in-time optimization feature is being used, it needs sepa- - rate memory stack areas for each thread. See the pcrejit documentation - for more details. - - -SAVING PRECOMPILED PATTERNS FOR LATER USE - - The compiled form of a regular expression can be saved and re-used at a - later time, possibly by a different program, and even on a host other - than the one on which it was compiled. Details are given in the - pcreprecompile documentation, which includes a description of the - pcre_pattern_to_host_byte_order() function. However, compiling a regu- - lar expression with one version of PCRE for use with a different ver- - sion is not guaranteed to work and may cause crashes. - - -CHECKING BUILD-TIME OPTIONS - - int pcre_config(int what, void *where); - - The function pcre_config() makes it possible for a PCRE client to dis- - cover which optional features have been compiled into the PCRE library. - The pcrebuild documentation has more details about these optional fea- - tures. - - The first argument for pcre_config() is an integer, specifying which - information is required; the second argument is a pointer to a variable - into which the information is placed. The returned value is zero on - success, or the negative error code PCRE_ERROR_BADOPTION if the value - in the first argument is not recognized. The following information is - available: - - PCRE_CONFIG_UTF8 - - The output is an integer that is set to one if UTF-8 support is avail- - able; otherwise it is set to zero. This value should normally be given - to the 8-bit version of this function, pcre_config(). If it is given to - the 16-bit or 32-bit version of this function, the result is - PCRE_ERROR_BADOPTION. - - PCRE_CONFIG_UTF16 - - The output is an integer that is set to one if UTF-16 support is avail- - able; otherwise it is set to zero. This value should normally be given - to the 16-bit version of this function, pcre16_config(). If it is given - to the 8-bit or 32-bit version of this function, the result is - PCRE_ERROR_BADOPTION. - - PCRE_CONFIG_UTF32 - - The output is an integer that is set to one if UTF-32 support is avail- - able; otherwise it is set to zero. This value should normally be given - to the 32-bit version of this function, pcre32_config(). If it is given - to the 8-bit or 16-bit version of this function, the result is - PCRE_ERROR_BADOPTION. - - PCRE_CONFIG_UNICODE_PROPERTIES - - The output is an integer that is set to one if support for Unicode - character properties is available; otherwise it is set to zero. - - PCRE_CONFIG_JIT - - The output is an integer that is set to one if support for just-in-time - compiling is available; otherwise it is set to zero. - - PCRE_CONFIG_JITTARGET - - The output is a pointer to a zero-terminated "const char *" string. If - JIT support is available, the string contains the name of the architec- - ture for which the JIT compiler is configured, for example "x86 32bit - (little endian + unaligned)". If JIT support is not available, the - result is NULL. - - PCRE_CONFIG_NEWLINE - - The output is an integer whose value specifies the default character - sequence that is recognized as meaning "newline". The values that are - supported in ASCII/Unicode environments are: 10 for LF, 13 for CR, 3338 - for CRLF, -2 for ANYCRLF, and -1 for ANY. In EBCDIC environments, CR, - ANYCRLF, and ANY yield the same values. However, the value for LF is - normally 21, though some EBCDIC environments use 37. The corresponding - values for CRLF are 3349 and 3365. The default should normally corre- - spond to the standard sequence for your operating system. - - PCRE_CONFIG_BSR - - The output is an integer whose value indicates what character sequences - the \R escape sequence matches by default. A value of 0 means that \R - matches any Unicode line ending sequence; a value of 1 means that \R - matches only CR, LF, or CRLF. The default can be overridden when a pat- - tern is compiled or matched. - - PCRE_CONFIG_LINK_SIZE - - The output is an integer that contains the number of bytes used for - internal linkage in compiled regular expressions. For the 8-bit - library, the value can be 2, 3, or 4. For the 16-bit library, the value - is either 2 or 4 and is still a number of bytes. For the 32-bit - library, the value is either 2 or 4 and is still a number of bytes. The - default value of 2 is sufficient for all but the most massive patterns, - since it allows the compiled pattern to be up to 64K in size. Larger - values allow larger regular expressions to be compiled, at the expense - of slower matching. - - PCRE_CONFIG_POSIX_MALLOC_THRESHOLD - - The output is an integer that contains the threshold above which the - POSIX interface uses malloc() for output vectors. Further details are - given in the pcreposix documentation. - - PCRE_CONFIG_PARENS_LIMIT - - The output is a long integer that gives the maximum depth of nesting of - parentheses (of any kind) in a pattern. This limit is imposed to cap - the amount of system stack used when a pattern is compiled. It is spec- - ified when PCRE is built; the default is 250. This limit does not take - into account the stack that may already be used by the calling applica- - tion. For finer control over compilation stack usage, you can set a - pointer to an external checking function in pcre_stack_guard. - - PCRE_CONFIG_MATCH_LIMIT - - The output is a long integer that gives the default limit for the num- - ber of internal matching function calls in a pcre_exec() execution. - Further details are given with pcre_exec() below. - - PCRE_CONFIG_MATCH_LIMIT_RECURSION - - The output is a long integer that gives the default limit for the depth - of recursion when calling the internal matching function in a - pcre_exec() execution. Further details are given with pcre_exec() - below. - - PCRE_CONFIG_STACKRECURSE - - The output is an integer that is set to one if internal recursion when - running pcre_exec() is implemented by recursive function calls that use - the stack to remember their state. This is the usual way that PCRE is - compiled. The output is zero if PCRE was compiled to use blocks of data - on the heap instead of recursive function calls. In this case, - pcre_stack_malloc and pcre_stack_free are called to manage memory - blocks on the heap, thus avoiding the use of the stack. - - -COMPILING A PATTERN - - pcre *pcre_compile(const char *pattern, int options, - const char **errptr, int *erroffset, - const unsigned char *tableptr); - - pcre *pcre_compile2(const char *pattern, int options, - int *errorcodeptr, - const char **errptr, int *erroffset, - const unsigned char *tableptr); - - Either of the functions pcre_compile() or pcre_compile2() can be called - to compile a pattern into an internal form. The only difference between - the two interfaces is that pcre_compile2() has an additional argument, - errorcodeptr, via which a numerical error code can be returned. To - avoid too much repetition, we refer just to pcre_compile() below, but - the information applies equally to pcre_compile2(). - - The pattern is a C string terminated by a binary zero, and is passed in - the pattern argument. A pointer to a single block of memory that is - obtained via pcre_malloc is returned. This contains the compiled code - and related data. The pcre type is defined for the returned block; this - is a typedef for a structure whose contents are not externally defined. - It is up to the caller to free the memory (via pcre_free) when it is no - longer required. - - Although the compiled code of a PCRE regex is relocatable, that is, it - does not depend on memory location, the complete pcre data block is not - fully relocatable, because it may contain a copy of the tableptr argu- - ment, which is an address (see below). - - The options argument contains various bit settings that affect the com- - pilation. It should be zero if no options are required. The available - options are described below. Some of them (in particular, those that - are compatible with Perl, but some others as well) can also be set and - unset from within the pattern (see the detailed description in the - pcrepattern documentation). For those options that can be different in - different parts of the pattern, the contents of the options argument - specifies their settings at the start of compilation and execution. The - PCRE_ANCHORED, PCRE_BSR_xxx, PCRE_NEWLINE_xxx, PCRE_NO_UTF8_CHECK, and - PCRE_NO_START_OPTIMIZE options can be set at the time of matching as - well as at compile time. - - If errptr is NULL, pcre_compile() returns NULL immediately. Otherwise, - if compilation of a pattern fails, pcre_compile() returns NULL, and - sets the variable pointed to by errptr to point to a textual error mes- - sage. This is a static string that is part of the library. You must not - try to free it. Normally, the offset from the start of the pattern to - the data unit that was being processed when the error was discovered is - placed in the variable pointed to by erroffset, which must not be NULL - (if it is, an immediate error is given). However, for an invalid UTF-8 - or UTF-16 string, the offset is that of the first data unit of the - failing character. - - Some errors are not detected until the whole pattern has been scanned; - in these cases, the offset passed back is the length of the pattern. - Note that the offset is in data units, not characters, even in a UTF - mode. It may sometimes point into the middle of a UTF-8 or UTF-16 char- - acter. - - If pcre_compile2() is used instead of pcre_compile(), and the error- - codeptr argument is not NULL, a non-zero error code number is returned - via this argument in the event of an error. This is in addition to the - textual error message. Error codes and messages are listed below. - - If the final argument, tableptr, is NULL, PCRE uses a default set of - character tables that are built when PCRE is compiled, using the - default C locale. Otherwise, tableptr must be an address that is the - result of a call to pcre_maketables(). This value is stored with the - compiled pattern, and used again by pcre_exec() and pcre_dfa_exec() - when the pattern is matched. For more discussion, see the section on - locale support below. - - This code fragment shows a typical straightforward call to pcre_com- - pile(): - - pcre *re; - const char *error; - int erroffset; - re = pcre_compile( - "^A.*Z", /* the pattern */ - 0, /* default options */ - &error, /* for error message */ - &erroffset, /* for error offset */ - NULL); /* use default character tables */ - - The following names for option bits are defined in the pcre.h header - file: - - PCRE_ANCHORED - - If this bit is set, the pattern is forced to be "anchored", that is, it - is constrained to match only at the first matching point in the string - that is being searched (the "subject string"). This effect can also be - achieved by appropriate constructs in the pattern itself, which is the - only way to do it in Perl. - - PCRE_AUTO_CALLOUT - - If this bit is set, pcre_compile() automatically inserts callout items, - all with number 255, before each pattern item. For discussion of the - callout facility, see the pcrecallout documentation. - - PCRE_BSR_ANYCRLF - PCRE_BSR_UNICODE - - These options (which are mutually exclusive) control what the \R escape - sequence matches. The choice is either to match only CR, LF, or CRLF, - or to match any Unicode newline sequence. The default is specified when - PCRE is built. It can be overridden from within the pattern, or by set- - ting an option when a compiled pattern is matched. - - PCRE_CASELESS - - If this bit is set, letters in the pattern match both upper and lower - case letters. It is equivalent to Perl's /i option, and it can be - changed within a pattern by a (?i) option setting. In UTF-8 mode, PCRE - always understands the concept of case for characters whose values are - less than 128, so caseless matching is always possible. For characters - with higher values, the concept of case is supported if PCRE is com- - piled with Unicode property support, but not otherwise. If you want to - use caseless matching for characters 128 and above, you must ensure - that PCRE is compiled with Unicode property support as well as with - UTF-8 support. - - PCRE_DOLLAR_ENDONLY - - If this bit is set, a dollar metacharacter in the pattern matches only - at the end of the subject string. Without this option, a dollar also - matches immediately before a newline at the end of the string (but not - before any other newlines). The PCRE_DOLLAR_ENDONLY option is ignored - if PCRE_MULTILINE is set. There is no equivalent to this option in - Perl, and no way to set it within a pattern. - - PCRE_DOTALL - - If this bit is set, a dot metacharacter in the pattern matches a char- - acter of any value, including one that indicates a newline. However, it - only ever matches one character, even if newlines are coded as CRLF. - Without this option, a dot does not match when the current position is - at a newline. This option is equivalent to Perl's /s option, and it can - be changed within a pattern by a (?s) option setting. A negative class - such as [^a] always matches newline characters, independent of the set- - ting of this option. - - PCRE_DUPNAMES - - If this bit is set, names used to identify capturing subpatterns need - not be unique. This can be helpful for certain types of pattern when it - is known that only one instance of the named subpattern can ever be - matched. There are more details of named subpatterns below; see also - the pcrepattern documentation. - - PCRE_EXTENDED - - If this bit is set, most white space characters in the pattern are - totally ignored except when escaped or inside a character class. How- - ever, white space is not allowed within sequences such as (?> that - introduce various parenthesized subpatterns, nor within a numerical - quantifier such as {1,3}. However, ignorable white space is permitted - between an item and a following quantifier and between a quantifier and - a following + that indicates possessiveness. - - White space did not used to include the VT character (code 11), because - Perl did not treat this character as white space. However, Perl changed - at release 5.18, so PCRE followed at release 8.34, and VT is now - treated as white space. - - PCRE_EXTENDED also causes characters between an unescaped # outside a - character class and the next newline, inclusive, to be ignored. - PCRE_EXTENDED is equivalent to Perl's /x option, and it can be changed - within a pattern by a (?x) option setting. - - Which characters are interpreted as newlines is controlled by the - options passed to pcre_compile() or by a special sequence at the start - of the pattern, as described in the section entitled "Newline conven- - tions" in the pcrepattern documentation. Note that the end of this type - of comment is a literal newline sequence in the pattern; escape - sequences that happen to represent a newline do not count. - - This option makes it possible to include comments inside complicated - patterns. Note, however, that this applies only to data characters. - White space characters may never appear within special character - sequences in a pattern, for example within the sequence (?( that intro- - duces a conditional subpattern. - - PCRE_EXTRA - - This option was invented in order to turn on additional functionality - of PCRE that is incompatible with Perl, but it is currently of very - little use. When set, any backslash in a pattern that is followed by a - letter that has no special meaning causes an error, thus reserving - these combinations for future expansion. By default, as in Perl, a - backslash followed by a letter with no special meaning is treated as a - literal. (Perl can, however, be persuaded to give an error for this, by - running it with the -w option.) There are at present no other features - controlled by this option. It can also be set by a (?X) option setting - within a pattern. - - PCRE_FIRSTLINE - - If this option is set, an unanchored pattern is required to match - before or at the first newline in the subject string, though the - matched text may continue over the newline. - - PCRE_JAVASCRIPT_COMPAT - - If this option is set, PCRE's behaviour is changed in some ways so that - it is compatible with JavaScript rather than Perl. The changes are as - follows: - - (1) A lone closing square bracket in a pattern causes a compile-time - error, because this is illegal in JavaScript (by default it is treated - as a data character). Thus, the pattern AB]CD becomes illegal when this - option is set. - - (2) At run time, a back reference to an unset subpattern group matches - an empty string (by default this causes the current matching alterna- - tive to fail). A pattern such as (\1)(a) succeeds when this option is - set (assuming it can find an "a" in the subject), whereas it fails by - default, for Perl compatibility. - - (3) \U matches an upper case "U" character; by default \U causes a com- - pile time error (Perl uses \U to upper case subsequent characters). - - (4) \u matches a lower case "u" character unless it is followed by four - hexadecimal digits, in which case the hexadecimal number defines the - code point to match. By default, \u causes a compile time error (Perl - uses it to upper case the following character). - - (5) \x matches a lower case "x" character unless it is followed by two - hexadecimal digits, in which case the hexadecimal number defines the - code point to match. By default, as in Perl, a hexadecimal number is - always expected after \x, but it may have zero, one, or two digits (so, - for example, \xz matches a binary zero character followed by z). - - PCRE_MULTILINE - - By default, for the purposes of matching "start of line" and "end of - line", PCRE treats the subject string as consisting of a single line of - characters, even if it actually contains newlines. The "start of line" - metacharacter (^) matches only at the start of the string, and the "end - of line" metacharacter ($) matches only at the end of the string, or - before a terminating newline (except when PCRE_DOLLAR_ENDONLY is set). - Note, however, that unless PCRE_DOTALL is set, the "any character" - metacharacter (.) does not match at a newline. This behaviour (for ^, - $, and dot) is the same as Perl. - - When PCRE_MULTILINE it is set, the "start of line" and "end of line" - constructs match immediately following or immediately before internal - newlines in the subject string, respectively, as well as at the very - start and end. This is equivalent to Perl's /m option, and it can be - changed within a pattern by a (?m) option setting. If there are no new- - lines in a subject string, or no occurrences of ^ or $ in a pattern, - setting PCRE_MULTILINE has no effect. - - PCRE_NEVER_UTF - - This option locks out interpretation of the pattern as UTF-8 (or UTF-16 - or UTF-32 in the 16-bit and 32-bit libraries). In particular, it pre- - vents the creator of the pattern from switching to UTF interpretation - by starting the pattern with (*UTF). This may be useful in applications - that process patterns from external sources. The combination of - PCRE_UTF8 and PCRE_NEVER_UTF also causes an error. - - PCRE_NEWLINE_CR - PCRE_NEWLINE_LF - PCRE_NEWLINE_CRLF - PCRE_NEWLINE_ANYCRLF - PCRE_NEWLINE_ANY - - These options override the default newline definition that was chosen - when PCRE was built. Setting the first or the second specifies that a - newline is indicated by a single character (CR or LF, respectively). - Setting PCRE_NEWLINE_CRLF specifies that a newline is indicated by the - two-character CRLF sequence. Setting PCRE_NEWLINE_ANYCRLF specifies - that any of the three preceding sequences should be recognized. Setting - PCRE_NEWLINE_ANY specifies that any Unicode newline sequence should be - recognized. - - In an ASCII/Unicode environment, the Unicode newline sequences are the - three just mentioned, plus the single characters VT (vertical tab, - U+000B), FF (form feed, U+000C), NEL (next line, U+0085), LS (line sep- - arator, U+2028), and PS (paragraph separator, U+2029). For the 8-bit - library, the last two are recognized only in UTF-8 mode. - - When PCRE is compiled to run in an EBCDIC (mainframe) environment, the - code for CR is 0x0d, the same as ASCII. However, the character code for - LF is normally 0x15, though in some EBCDIC environments 0x25 is used. - Whichever of these is not LF is made to correspond to Unicode's NEL - character. EBCDIC codes are all less than 256. For more details, see - the pcrebuild documentation. - - The newline setting in the options word uses three bits that are - treated as a number, giving eight possibilities. Currently only six are - used (default plus the five values above). This means that if you set - more than one newline option, the combination may or may not be sensi- - ble. For example, PCRE_NEWLINE_CR with PCRE_NEWLINE_LF is equivalent to - PCRE_NEWLINE_CRLF, but other combinations may yield unused numbers and - cause an error. - - The only time that a line break in a pattern is specially recognized - when compiling is when PCRE_EXTENDED is set. CR and LF are white space - characters, and so are ignored in this mode. Also, an unescaped # out- - side a character class indicates a comment that lasts until after the - next line break sequence. In other circumstances, line break sequences - in patterns are treated as literal data. - - The newline option that is set at compile time becomes the default that - is used for pcre_exec() and pcre_dfa_exec(), but it can be overridden. - - PCRE_NO_AUTO_CAPTURE - - If this option is set, it disables the use of numbered capturing paren- - theses in the pattern. Any opening parenthesis that is not followed by - ? behaves as if it were followed by ?: but named parentheses can still - be used for capturing (and they acquire numbers in the usual way). - There is no equivalent of this option in Perl. - - PCRE_NO_AUTO_POSSESS - - If this option is set, it disables "auto-possessification". This is an - optimization that, for example, turns a+b into a++b in order to avoid - backtracks into a+ that can never be successful. However, if callouts - are in use, auto-possessification means that some of them are never - taken. You can set this option if you want the matching functions to do - a full unoptimized search and run all the callouts, but it is mainly - provided for testing purposes. - - PCRE_NO_START_OPTIMIZE - - This is an option that acts at matching time; that is, it is really an - option for pcre_exec() or pcre_dfa_exec(). If it is set at compile - time, it is remembered with the compiled pattern and assumed at match- - ing time. This is necessary if you want to use JIT execution, because - the JIT compiler needs to know whether or not this option is set. For - details see the discussion of PCRE_NO_START_OPTIMIZE below. - - PCRE_UCP - - This option changes the way PCRE processes \B, \b, \D, \d, \S, \s, \W, - \w, and some of the POSIX character classes. By default, only ASCII - characters are recognized, but if PCRE_UCP is set, Unicode properties - are used instead to classify characters. More details are given in the - section on generic character types in the pcrepattern page. If you set - PCRE_UCP, matching one of the items it affects takes much longer. The - option is available only if PCRE has been compiled with Unicode prop- - erty support. - - PCRE_UNGREEDY - - This option inverts the "greediness" of the quantifiers so that they - are not greedy by default, but become greedy if followed by "?". It is - not compatible with Perl. It can also be set by a (?U) option setting - within the pattern. - - PCRE_UTF8 - - This option causes PCRE to regard both the pattern and the subject as - strings of UTF-8 characters instead of single-byte strings. However, it - is available only when PCRE is built to include UTF support. If not, - the use of this option provokes an error. Details of how this option - changes the behaviour of PCRE are given in the pcreunicode page. - - PCRE_NO_UTF8_CHECK - - When PCRE_UTF8 is set, the validity of the pattern as a UTF-8 string is - automatically checked. There is a discussion about the validity of - UTF-8 strings in the pcreunicode page. If an invalid UTF-8 sequence is - found, pcre_compile() returns an error. If you already know that your - pattern is valid, and you want to skip this check for performance rea- - sons, you can set the PCRE_NO_UTF8_CHECK option. When it is set, the - effect of passing an invalid UTF-8 string as a pattern is undefined. It - may cause your program to crash or loop. Note that this option can also - be passed to pcre_exec() and pcre_dfa_exec(), to suppress the validity - checking of subject strings only. If the same string is being matched - many times, the option can be safely set for the second and subsequent - matchings to improve performance. - - -COMPILATION ERROR CODES - - The following table lists the error codes than may be returned by - pcre_compile2(), along with the error messages that may be returned by - both compiling functions. Note that error messages are always 8-bit - ASCII strings, even in 16-bit or 32-bit mode. As PCRE has developed, - some error codes have fallen out of use. To avoid confusion, they have - not been re-used. - - 0 no error - 1 \ at end of pattern - 2 \c at end of pattern - 3 unrecognized character follows \ - 4 numbers out of order in {} quantifier - 5 number too big in {} quantifier - 6 missing terminating ] for character class - 7 invalid escape sequence in character class - 8 range out of order in character class - 9 nothing to repeat - 10 [this code is not in use] - 11 internal error: unexpected repeat - 12 unrecognized character after (? or (?- - 13 POSIX named classes are supported only within a class - 14 missing ) - 15 reference to non-existent subpattern - 16 erroffset passed as NULL - 17 unknown option bit(s) set - 18 missing ) after comment - 19 [this code is not in use] - 20 regular expression is too large - 21 failed to get memory - 22 unmatched parentheses - 23 internal error: code overflow - 24 unrecognized character after (?< - 25 lookbehind assertion is not fixed length - 26 malformed number or name after (?( - 27 conditional group contains more than two branches - 28 assertion expected after (?( - 29 (?R or (?[+-]digits must be followed by ) - 30 unknown POSIX class name - 31 POSIX collating elements are not supported - 32 this version of PCRE is compiled without UTF support - 33 [this code is not in use] - 34 character value in \x{} or \o{} is too large - 35 invalid condition (?(0) - 36 \C not allowed in lookbehind assertion - 37 PCRE does not support \L, \l, \N{name}, \U, or \u - 38 number after (?C is > 255 - 39 closing ) for (?C expected - 40 recursive call could loop indefinitely - 41 unrecognized character after (?P - 42 syntax error in subpattern name (missing terminator) - 43 two named subpatterns have the same name - 44 invalid UTF-8 string (specifically UTF-8) - 45 support for \P, \p, and \X has not been compiled - 46 malformed \P or \p sequence - 47 unknown property name after \P or \p - 48 subpattern name is too long (maximum 32 characters) - 49 too many named subpatterns (maximum 10000) - 50 [this code is not in use] - 51 octal value is greater than \377 in 8-bit non-UTF-8 mode - 52 internal error: overran compiling workspace - 53 internal error: previously-checked referenced subpattern - not found - 54 DEFINE group contains more than one branch - 55 repeating a DEFINE group is not allowed - 56 inconsistent NEWLINE options - 57 \g is not followed by a braced, angle-bracketed, or quoted - name/number or by a plain number - 58 a numbered reference must not be zero - 59 an argument is not allowed for (*ACCEPT), (*FAIL), or (*COMMIT) - 60 (*VERB) not recognized or malformed - 61 number is too big - 62 subpattern name expected - 63 digit expected after (?+ - 64 ] is an invalid data character in JavaScript compatibility mode - 65 different names for subpatterns of the same number are - not allowed - 66 (*MARK) must have an argument - 67 this version of PCRE is not compiled with Unicode property - support - 68 \c must be followed by an ASCII character - 69 \k is not followed by a braced, angle-bracketed, or quoted name - 70 internal error: unknown opcode in find_fixedlength() - 71 \N is not supported in a class - 72 too many forward references - 73 disallowed Unicode code point (>= 0xd800 && <= 0xdfff) - 74 invalid UTF-16 string (specifically UTF-16) - 75 name is too long in (*MARK), (*PRUNE), (*SKIP), or (*THEN) - 76 character value in \u.... sequence is too large - 77 invalid UTF-32 string (specifically UTF-32) - 78 setting UTF is disabled by the application - 79 non-hex character in \x{} (closing brace missing?) - 80 non-octal character in \o{} (closing brace missing?) - 81 missing opening brace after \o - 82 parentheses are too deeply nested - 83 invalid range in character class - 84 group name must start with a non-digit - 85 parentheses are too deeply nested (stack check) - - The numbers 32 and 10000 in errors 48 and 49 are defaults; different - values may be used if the limits were changed when PCRE was built. - - -STUDYING A PATTERN - - pcre_extra *pcre_study(const pcre *code, int options, - const char **errptr); - - If a compiled pattern is going to be used several times, it is worth - spending more time analyzing it in order to speed up the time taken for - matching. The function pcre_study() takes a pointer to a compiled pat- - tern as its first argument. If studying the pattern produces additional - information that will help speed up matching, pcre_study() returns a - pointer to a pcre_extra block, in which the study_data field points to - the results of the study. - - The returned value from pcre_study() can be passed directly to - pcre_exec() or pcre_dfa_exec(). However, a pcre_extra block also con- - tains other fields that can be set by the caller before the block is - passed; these are described below in the section on matching a pattern. - - If studying the pattern does not produce any useful information, - pcre_study() returns NULL by default. In that circumstance, if the - calling program wants to pass any of the other fields to pcre_exec() or - pcre_dfa_exec(), it must set up its own pcre_extra block. However, if - pcre_study() is called with the PCRE_STUDY_EXTRA_NEEDED option, it - returns a pcre_extra block even if studying did not find any additional - information. It may still return NULL, however, if an error occurs in - pcre_study(). - - The second argument of pcre_study() contains option bits. There are - three further options in addition to PCRE_STUDY_EXTRA_NEEDED: - - PCRE_STUDY_JIT_COMPILE - PCRE_STUDY_JIT_PARTIAL_HARD_COMPILE - PCRE_STUDY_JIT_PARTIAL_SOFT_COMPILE - - If any of these are set, and the just-in-time compiler is available, - the pattern is further compiled into machine code that executes much - faster than the pcre_exec() interpretive matching function. If the - just-in-time compiler is not available, these options are ignored. All - undefined bits in the options argument must be zero. - - JIT compilation is a heavyweight optimization. It can take some time - for patterns to be analyzed, and for one-off matches and simple pat- - terns the benefit of faster execution might be offset by a much slower - study time. Not all patterns can be optimized by the JIT compiler. For - those that cannot be handled, matching automatically falls back to the - pcre_exec() interpreter. For more details, see the pcrejit documenta- - tion. - - The third argument for pcre_study() is a pointer for an error message. - If studying succeeds (even if no data is returned), the variable it - points to is set to NULL. Otherwise it is set to point to a textual - error message. This is a static string that is part of the library. You - must not try to free it. You should test the error pointer for NULL - after calling pcre_study(), to be sure that it has run successfully. - - When you are finished with a pattern, you can free the memory used for - the study data by calling pcre_free_study(). This function was added to - the API for release 8.20. For earlier versions, the memory could be - freed with pcre_free(), just like the pattern itself. This will still - work in cases where JIT optimization is not used, but it is advisable - to change to the new function when convenient. - - This is a typical way in which pcre_study() is used (except that in a - real application there should be tests for errors): - - int rc; - pcre *re; - pcre_extra *sd; - re = pcre_compile("pattern", 0, &error, &erroroffset, NULL); - sd = pcre_study( - re, /* result of pcre_compile() */ - 0, /* no options */ - &error); /* set to NULL or points to a message */ - rc = pcre_exec( /* see below for details of pcre_exec() options */ - re, sd, "subject", 7, 0, 0, ovector, 30); - ... - pcre_free_study(sd); - pcre_free(re); - - Studying a pattern does two things: first, a lower bound for the length - of subject string that is needed to match the pattern is computed. This - does not mean that there are any strings of that length that match, but - it does guarantee that no shorter strings match. The value is used to - avoid wasting time by trying to match strings that are shorter than the - lower bound. You can find out the value in a calling program via the - pcre_fullinfo() function. - - Studying a pattern is also useful for non-anchored patterns that do not - have a single fixed starting character. A bitmap of possible starting - bytes is created. This speeds up finding a position in the subject at - which to start matching. (In 16-bit mode, the bitmap is used for 16-bit - values less than 256. In 32-bit mode, the bitmap is used for 32-bit - values less than 256.) - - These two optimizations apply to both pcre_exec() and pcre_dfa_exec(), - and the information is also used by the JIT compiler. The optimiza- - tions can be disabled by setting the PCRE_NO_START_OPTIMIZE option. - You might want to do this if your pattern contains callouts or (*MARK) - and you want to make use of these facilities in cases where matching - fails. - - PCRE_NO_START_OPTIMIZE can be specified at either compile time or exe- - cution time. However, if PCRE_NO_START_OPTIMIZE is passed to - pcre_exec(), (that is, after any JIT compilation has happened) JIT exe- - cution is disabled. For JIT execution to work with PCRE_NO_START_OPTI- - MIZE, the option must be set at compile time. - - There is a longer discussion of PCRE_NO_START_OPTIMIZE below. - - -LOCALE SUPPORT - - PCRE handles caseless matching, and determines whether characters are - letters, digits, or whatever, by reference to a set of tables, indexed - by character code point. When running in UTF-8 mode, or in the 16- or - 32-bit libraries, this applies only to characters with code points less - than 256. By default, higher-valued code points never match escapes - such as \w or \d. However, if PCRE is built with Unicode property sup- - port, all characters can be tested with \p and \P, or, alternatively, - the PCRE_UCP option can be set when a pattern is compiled; this causes - \w and friends to use Unicode property support instead of the built-in - tables. - - The use of locales with Unicode is discouraged. If you are handling - characters with code points greater than 128, you should either use - Unicode support, or use locales, but not try to mix the two. - - PCRE contains an internal set of tables that are used when the final - argument of pcre_compile() is NULL. These are sufficient for many - applications. Normally, the internal tables recognize only ASCII char- - acters. However, when PCRE is built, it is possible to cause the inter- - nal tables to be rebuilt in the default "C" locale of the local system, - which may cause them to be different. - - The internal tables can always be overridden by tables supplied by the - application that calls PCRE. These may be created in a different locale - from the default. As more and more applications change to using Uni- - code, the need for this locale support is expected to die away. - - External tables are built by calling the pcre_maketables() function, - which has no arguments, in the relevant locale. The result can then be - passed to pcre_compile() as often as necessary. For example, to build - and use tables that are appropriate for the French locale (where - accented characters with values greater than 128 are treated as let- - ters), the following code could be used: - - setlocale(LC_CTYPE, "fr_FR"); - tables = pcre_maketables(); - re = pcre_compile(..., tables); - - The locale name "fr_FR" is used on Linux and other Unix-like systems; - if you are using Windows, the name for the French locale is "french". - - When pcre_maketables() runs, the tables are built in memory that is - obtained via pcre_malloc. It is the caller's responsibility to ensure - that the memory containing the tables remains available for as long as - it is needed. - - The pointer that is passed to pcre_compile() is saved with the compiled - pattern, and the same tables are used via this pointer by pcre_study() - and also by pcre_exec() and pcre_dfa_exec(). Thus, for any single pat- - tern, compilation, studying and matching all happen in the same locale, - but different patterns can be processed in different locales. - - It is possible to pass a table pointer or NULL (indicating the use of - the internal tables) to pcre_exec() or pcre_dfa_exec() (see the discus- - sion below in the section on matching a pattern). This facility is pro- - vided for use with pre-compiled patterns that have been saved and - reloaded. Character tables are not saved with patterns, so if a non- - standard table was used at compile time, it must be provided again when - the reloaded pattern is matched. Attempting to use this facility to - match a pattern in a different locale from the one in which it was com- - piled is likely to lead to anomalous (usually incorrect) results. - - -INFORMATION ABOUT A PATTERN - - int pcre_fullinfo(const pcre *code, const pcre_extra *extra, - int what, void *where); - - The pcre_fullinfo() function returns information about a compiled pat- - tern. It replaces the pcre_info() function, which was removed from the - library at version 8.30, after more than 10 years of obsolescence. - - The first argument for pcre_fullinfo() is a pointer to the compiled - pattern. The second argument is the result of pcre_study(), or NULL if - the pattern was not studied. The third argument specifies which piece - of information is required, and the fourth argument is a pointer to a - variable to receive the data. The yield of the function is zero for - success, or one of the following negative numbers: - - PCRE_ERROR_NULL the argument code was NULL - the argument where was NULL - PCRE_ERROR_BADMAGIC the "magic number" was not found - PCRE_ERROR_BADENDIANNESS the pattern was compiled with different - endianness - PCRE_ERROR_BADOPTION the value of what was invalid - PCRE_ERROR_UNSET the requested field is not set - - The "magic number" is placed at the start of each compiled pattern as - an simple check against passing an arbitrary memory pointer. The endi- - anness error can occur if a compiled pattern is saved and reloaded on a - different host. Here is a typical call of pcre_fullinfo(), to obtain - the length of the compiled pattern: - - int rc; - size_t length; - rc = pcre_fullinfo( - re, /* result of pcre_compile() */ - sd, /* result of pcre_study(), or NULL */ - PCRE_INFO_SIZE, /* what is required */ - &length); /* where to put the data */ - - The possible values for the third argument are defined in pcre.h, and - are as follows: - - PCRE_INFO_BACKREFMAX - - Return the number of the highest back reference in the pattern. The - fourth argument should point to an int variable. Zero is returned if - there are no back references. - - PCRE_INFO_CAPTURECOUNT - - Return the number of capturing subpatterns in the pattern. The fourth - argument should point to an int variable. - - PCRE_INFO_DEFAULT_TABLES - - Return a pointer to the internal default character tables within PCRE. - The fourth argument should point to an unsigned char * variable. This - information call is provided for internal use by the pcre_study() func- - tion. External callers can cause PCRE to use its internal tables by - passing a NULL table pointer. - - PCRE_INFO_FIRSTBYTE (deprecated) - - Return information about the first data unit of any matched string, for - a non-anchored pattern. The name of this option refers to the 8-bit - library, where data units are bytes. The fourth argument should point - to an int variable. Negative values are used for special cases. How- - ever, this means that when the 32-bit library is in non-UTF-32 mode, - the full 32-bit range of characters cannot be returned. For this rea- - son, this value is deprecated; use PCRE_INFO_FIRSTCHARACTERFLAGS and - PCRE_INFO_FIRSTCHARACTER instead. - - If there is a fixed first value, for example, the letter "c" from a - pattern such as (cat|cow|coyote), its value is returned. In the 8-bit - library, the value is always less than 256. In the 16-bit library the - value can be up to 0xffff. In the 32-bit library the value can be up to - 0x10ffff. - - If there is no fixed first value, and if either - - (a) the pattern was compiled with the PCRE_MULTILINE option, and every - branch starts with "^", or - - (b) every branch of the pattern starts with ".*" and PCRE_DOTALL is not - set (if it were set, the pattern would be anchored), - - -1 is returned, indicating that the pattern matches only at the start - of a subject string or after any newline within the string. Otherwise - -2 is returned. For anchored patterns, -2 is returned. - - PCRE_INFO_FIRSTCHARACTER - - Return the value of the first data unit (non-UTF character) of any - matched string in the situation where PCRE_INFO_FIRSTCHARACTERFLAGS - returns 1; otherwise return 0. The fourth argument should point to an - uint_t variable. - - In the 8-bit library, the value is always less than 256. In the 16-bit - library the value can be up to 0xffff. In the 32-bit library in UTF-32 - mode the value can be up to 0x10ffff, and up to 0xffffffff when not - using UTF-32 mode. - - PCRE_INFO_FIRSTCHARACTERFLAGS - - Return information about the first data unit of any matched string, for - a non-anchored pattern. The fourth argument should point to an int - variable. - - If there is a fixed first value, for example, the letter "c" from a - pattern such as (cat|cow|coyote), 1 is returned, and the character - value can be retrieved using PCRE_INFO_FIRSTCHARACTER. If there is no - fixed first value, and if either - - (a) the pattern was compiled with the PCRE_MULTILINE option, and every - branch starts with "^", or - - (b) every branch of the pattern starts with ".*" and PCRE_DOTALL is not - set (if it were set, the pattern would be anchored), - - 2 is returned, indicating that the pattern matches only at the start of - a subject string or after any newline within the string. Otherwise 0 is - returned. For anchored patterns, 0 is returned. - - PCRE_INFO_FIRSTTABLE - - If the pattern was studied, and this resulted in the construction of a - 256-bit table indicating a fixed set of values for the first data unit - in any matching string, a pointer to the table is returned. Otherwise - NULL is returned. The fourth argument should point to an unsigned char - * variable. - - PCRE_INFO_HASCRORLF - - Return 1 if the pattern contains any explicit matches for CR or LF - characters, otherwise 0. The fourth argument should point to an int - variable. An explicit match is either a literal CR or LF character, or - \r or \n. - - PCRE_INFO_JCHANGED - - Return 1 if the (?J) or (?-J) option setting is used in the pattern, - otherwise 0. The fourth argument should point to an int variable. (?J) - and (?-J) set and unset the local PCRE_DUPNAMES option, respectively. - - PCRE_INFO_JIT - - Return 1 if the pattern was studied with one of the JIT options, and - just-in-time compiling was successful. The fourth argument should point - to an int variable. A return value of 0 means that JIT support is not - available in this version of PCRE, or that the pattern was not studied - with a JIT option, or that the JIT compiler could not handle this par- - ticular pattern. See the pcrejit documentation for details of what can - and cannot be handled. - - PCRE_INFO_JITSIZE - - If the pattern was successfully studied with a JIT option, return the - size of the JIT compiled code, otherwise return zero. The fourth argu- - ment should point to a size_t variable. - - PCRE_INFO_LASTLITERAL - - Return the value of the rightmost literal data unit that must exist in - any matched string, other than at its start, if such a value has been - recorded. The fourth argument should point to an int variable. If there - is no such value, -1 is returned. For anchored patterns, a last literal - value is recorded only if it follows something of variable length. For - example, for the pattern /^a\d+z\d+/ the returned value is "z", but for - /^a\dz\d/ the returned value is -1. - - Since for the 32-bit library using the non-UTF-32 mode, this function - is unable to return the full 32-bit range of characters, this value is - deprecated; instead the PCRE_INFO_REQUIREDCHARFLAGS and - PCRE_INFO_REQUIREDCHAR values should be used. - - PCRE_INFO_MATCH_EMPTY - - Return 1 if the pattern can match an empty string, otherwise 0. The - fourth argument should point to an int variable. - - PCRE_INFO_MATCHLIMIT - - If the pattern set a match limit by including an item of the form - (*LIMIT_MATCH=nnnn) at the start, the value is returned. The fourth - argument should point to an unsigned 32-bit integer. If no such value - has been set, the call to pcre_fullinfo() returns the error - PCRE_ERROR_UNSET. - - PCRE_INFO_MAXLOOKBEHIND - - Return the number of characters (NB not data units) in the longest - lookbehind assertion in the pattern. This information is useful when - doing multi-segment matching using the partial matching facilities. - Note that the simple assertions \b and \B require a one-character look- - behind. \A also registers a one-character lookbehind, though it does - not actually inspect the previous character. This is to ensure that at - least one character from the old segment is retained when a new segment - is processed. Otherwise, if there are no lookbehinds in the pattern, \A - might match incorrectly at the start of a new segment. - - PCRE_INFO_MINLENGTH - - If the pattern was studied and a minimum length for matching subject - strings was computed, its value is returned. Otherwise the returned - value is -1. The value is a number of characters, which in UTF mode may - be different from the number of data units. The fourth argument should - point to an int variable. A non-negative value is a lower bound to the - length of any matching string. There may not be any strings of that - length that do actually match, but every string that does match is at - least that long. - - PCRE_INFO_NAMECOUNT - PCRE_INFO_NAMEENTRYSIZE - PCRE_INFO_NAMETABLE - - PCRE supports the use of named as well as numbered capturing parenthe- - ses. The names are just an additional way of identifying the parenthe- - ses, which still acquire numbers. Several convenience functions such as - pcre_get_named_substring() are provided for extracting captured sub- - strings by name. It is also possible to extract the data directly, by - first converting the name to a number in order to access the correct - pointers in the output vector (described with pcre_exec() below). To do - the conversion, you need to use the name-to-number map, which is - described by these three values. - - The map consists of a number of fixed-size entries. PCRE_INFO_NAMECOUNT - gives the number of entries, and PCRE_INFO_NAMEENTRYSIZE gives the size - of each entry; both of these return an int value. The entry size - depends on the length of the longest name. PCRE_INFO_NAMETABLE returns - a pointer to the first entry of the table. This is a pointer to char in - the 8-bit library, where the first two bytes of each entry are the num- - ber of the capturing parenthesis, most significant byte first. In the - 16-bit library, the pointer points to 16-bit data units, the first of - which contains the parenthesis number. In the 32-bit library, the - pointer points to 32-bit data units, the first of which contains the - parenthesis number. The rest of the entry is the corresponding name, - zero terminated. - - The names are in alphabetical order. If (?| is used to create multiple - groups with the same number, as described in the section on duplicate - subpattern numbers in the pcrepattern page, the groups may be given the - same name, but there is only one entry in the table. Different names - for groups of the same number are not permitted. Duplicate names for - subpatterns with different numbers are permitted, but only if PCRE_DUP- - NAMES is set. They appear in the table in the order in which they were - found in the pattern. In the absence of (?| this is the order of - increasing number; when (?| is used this is not necessarily the case - because later subpatterns may have lower numbers. - - As a simple example of the name/number table, consider the following - pattern after compilation by the 8-bit library (assume PCRE_EXTENDED is - set, so white space - including newlines - is ignored): - - (? (?(\d\d)?\d\d) - - (?\d\d) - (?\d\d) ) - - There are four named subpatterns, so the table has four entries, and - each entry in the table is eight bytes long. The table is as follows, - with non-printing bytes shows in hexadecimal, and undefined bytes shown - as ??: - - 00 01 d a t e 00 ?? - 00 05 d a y 00 ?? ?? - 00 04 m o n t h 00 - 00 02 y e a r 00 ?? - - When writing code to extract data from named subpatterns using the - name-to-number map, remember that the length of the entries is likely - to be different for each compiled pattern. - - PCRE_INFO_OKPARTIAL - - Return 1 if the pattern can be used for partial matching with - pcre_exec(), otherwise 0. The fourth argument should point to an int - variable. From release 8.00, this always returns 1, because the - restrictions that previously applied to partial matching have been - lifted. The pcrepartial documentation gives details of partial match- - ing. - - PCRE_INFO_OPTIONS - - Return a copy of the options with which the pattern was compiled. The - fourth argument should point to an unsigned long int variable. These - option bits are those specified in the call to pcre_compile(), modified - by any top-level option settings at the start of the pattern itself. In - other words, they are the options that will be in force when matching - starts. For example, if the pattern /(?im)abc(?-i)d/ is compiled with - the PCRE_EXTENDED option, the result is PCRE_CASELESS, PCRE_MULTILINE, - and PCRE_EXTENDED. - - A pattern is automatically anchored by PCRE if all of its top-level - alternatives begin with one of the following: - - ^ unless PCRE_MULTILINE is set - \A always - \G always - .* if PCRE_DOTALL is set and there are no back - references to the subpattern in which .* appears - - For such patterns, the PCRE_ANCHORED bit is set in the options returned - by pcre_fullinfo(). - - PCRE_INFO_RECURSIONLIMIT - - If the pattern set a recursion limit by including an item of the form - (*LIMIT_RECURSION=nnnn) at the start, the value is returned. The fourth - argument should point to an unsigned 32-bit integer. If no such value - has been set, the call to pcre_fullinfo() returns the error - PCRE_ERROR_UNSET. - - PCRE_INFO_SIZE - - Return the size of the compiled pattern in bytes (for all three - libraries). The fourth argument should point to a size_t variable. This - value does not include the size of the pcre structure that is returned - by pcre_compile(). The value that is passed as the argument to - pcre_malloc() when pcre_compile() is getting memory in which to place - the compiled data is the value returned by this option plus the size of - the pcre structure. Studying a compiled pattern, with or without JIT, - does not alter the value returned by this option. - - PCRE_INFO_STUDYSIZE - - Return the size in bytes (for all three libraries) of the data block - pointed to by the study_data field in a pcre_extra block. If pcre_extra - is NULL, or there is no study data, zero is returned. The fourth argu- - ment should point to a size_t variable. The study_data field is set by - pcre_study() to record information that will speed up matching (see the - section entitled "Studying a pattern" above). The format of the - study_data block is private, but its length is made available via this - option so that it can be saved and restored (see the pcreprecompile - documentation for details). - - PCRE_INFO_REQUIREDCHARFLAGS - - Returns 1 if there is a rightmost literal data unit that must exist in - any matched string, other than at its start. The fourth argument should - point to an int variable. If there is no such value, 0 is returned. If - returning 1, the character value itself can be retrieved using - PCRE_INFO_REQUIREDCHAR. - - For anchored patterns, a last literal value is recorded only if it fol- - lows something of variable length. For example, for the pattern - /^a\d+z\d+/ the returned value 1 (with "z" returned from - PCRE_INFO_REQUIREDCHAR), but for /^a\dz\d/ the returned value is 0. - - PCRE_INFO_REQUIREDCHAR - - Return the value of the rightmost literal data unit that must exist in - any matched string, other than at its start, if such a value has been - recorded. The fourth argument should point to an uint32_t variable. If - there is no such value, 0 is returned. - - -REFERENCE COUNTS - - int pcre_refcount(pcre *code, int adjust); - - The pcre_refcount() function is used to maintain a reference count in - the data block that contains a compiled pattern. It is provided for the - benefit of applications that operate in an object-oriented manner, - where different parts of the application may be using the same compiled - pattern, but you want to free the block when they are all done. - - When a pattern is compiled, the reference count field is initialized to - zero. It is changed only by calling this function, whose action is to - add the adjust value (which may be positive or negative) to it. The - yield of the function is the new value. However, the value of the count - is constrained to lie between 0 and 65535, inclusive. If the new value - is outside these limits, it is forced to the appropriate limit value. - - Except when it is zero, the reference count is not correctly preserved - if a pattern is compiled on one host and then transferred to a host - whose byte-order is different. (This seems a highly unlikely scenario.) - - -MATCHING A PATTERN: THE TRADITIONAL FUNCTION - - int pcre_exec(const pcre *code, const pcre_extra *extra, - const char *subject, int length, int startoffset, - int options, int *ovector, int ovecsize); - - The function pcre_exec() is called to match a subject string against a - compiled pattern, which is passed in the code argument. If the pattern - was studied, the result of the study should be passed in the extra - argument. You can call pcre_exec() with the same code and extra argu- - ments as many times as you like, in order to match different subject - strings with the same pattern. - - This function is the main matching facility of the library, and it - operates in a Perl-like manner. For specialist use there is also an - alternative matching function, which is described below in the section - about the pcre_dfa_exec() function. - - In most applications, the pattern will have been compiled (and option- - ally studied) in the same process that calls pcre_exec(). However, it - is possible to save compiled patterns and study data, and then use them - later in different processes, possibly even on different hosts. For a - discussion about this, see the pcreprecompile documentation. - - Here is an example of a simple call to pcre_exec(): - - int rc; - int ovector[30]; - rc = pcre_exec( - re, /* result of pcre_compile() */ - NULL, /* we didn't study the pattern */ - "some string", /* the subject string */ - 11, /* the length of the subject string */ - 0, /* start at offset 0 in the subject */ - 0, /* default options */ - ovector, /* vector of integers for substring information */ - 30); /* number of elements (NOT size in bytes) */ - - Extra data for pcre_exec() - - If the extra argument is not NULL, it must point to a pcre_extra data - block. The pcre_study() function returns such a block (when it doesn't - return NULL), but you can also create one for yourself, and pass addi- - tional information in it. The pcre_extra block contains the following - fields (not necessarily in this order): - - unsigned long int flags; - void *study_data; - void *executable_jit; - unsigned long int match_limit; - unsigned long int match_limit_recursion; - void *callout_data; - const unsigned char *tables; - unsigned char **mark; - - In the 16-bit version of this structure, the mark field has type - "PCRE_UCHAR16 **". - - In the 32-bit version of this structure, the mark field has type - "PCRE_UCHAR32 **". - - The flags field is used to specify which of the other fields are set. - The flag bits are: - - PCRE_EXTRA_CALLOUT_DATA - PCRE_EXTRA_EXECUTABLE_JIT - PCRE_EXTRA_MARK - PCRE_EXTRA_MATCH_LIMIT - PCRE_EXTRA_MATCH_LIMIT_RECURSION - PCRE_EXTRA_STUDY_DATA - PCRE_EXTRA_TABLES - - Other flag bits should be set to zero. The study_data field and some- - times the executable_jit field are set in the pcre_extra block that is - returned by pcre_study(), together with the appropriate flag bits. You - should not set these yourself, but you may add to the block by setting - other fields and their corresponding flag bits. - - The match_limit field provides a means of preventing PCRE from using up - a vast amount of resources when running patterns that are not going to - match, but which have a very large number of possibilities in their - search trees. The classic example is a pattern that uses nested unlim- - ited repeats. - - Internally, pcre_exec() uses a function called match(), which it calls - repeatedly (sometimes recursively). The limit set by match_limit is - imposed on the number of times this function is called during a match, - which has the effect of limiting the amount of backtracking that can - take place. For patterns that are not anchored, the count restarts from - zero for each position in the subject string. - - When pcre_exec() is called with a pattern that was successfully studied - with a JIT option, the way that the matching is executed is entirely - different. However, there is still the possibility of runaway matching - that goes on for a very long time, and so the match_limit value is also - used in this case (but in a different way) to limit how long the match- - ing can continue. - - The default value for the limit can be set when PCRE is built; the - default default is 10 million, which handles all but the most extreme - cases. You can override the default by suppling pcre_exec() with a - pcre_extra block in which match_limit is set, and - PCRE_EXTRA_MATCH_LIMIT is set in the flags field. If the limit is - exceeded, pcre_exec() returns PCRE_ERROR_MATCHLIMIT. - - A value for the match limit may also be supplied by an item at the - start of a pattern of the form - - (*LIMIT_MATCH=d) - - where d is a decimal number. However, such a setting is ignored unless - d is less than the limit set by the caller of pcre_exec() or, if no - such limit is set, less than the default. - - The match_limit_recursion field is similar to match_limit, but instead - of limiting the total number of times that match() is called, it limits - the depth of recursion. The recursion depth is a smaller number than - the total number of calls, because not all calls to match() are recur- - sive. This limit is of use only if it is set smaller than match_limit. - - Limiting the recursion depth limits the amount of machine stack that - can be used, or, when PCRE has been compiled to use memory on the heap - instead of the stack, the amount of heap memory that can be used. This - limit is not relevant, and is ignored, when matching is done using JIT - compiled code. - - The default value for match_limit_recursion can be set when PCRE is - built; the default default is the same value as the default for - match_limit. You can override the default by suppling pcre_exec() with - a pcre_extra block in which match_limit_recursion is set, and - PCRE_EXTRA_MATCH_LIMIT_RECURSION is set in the flags field. If the - limit is exceeded, pcre_exec() returns PCRE_ERROR_RECURSIONLIMIT. - - A value for the recursion limit may also be supplied by an item at the - start of a pattern of the form - - (*LIMIT_RECURSION=d) - - where d is a decimal number. However, such a setting is ignored unless - d is less than the limit set by the caller of pcre_exec() or, if no - such limit is set, less than the default. - - The callout_data field is used in conjunction with the "callout" fea- - ture, and is described in the pcrecallout documentation. - - The tables field is provided for use with patterns that have been pre- - compiled using custom character tables, saved to disc or elsewhere, and - then reloaded, because the tables that were used to compile a pattern - are not saved with it. See the pcreprecompile documentation for a dis- - cussion of saving compiled patterns for later use. If NULL is passed - using this mechanism, it forces PCRE's internal tables to be used. - - Warning: The tables that pcre_exec() uses must be the same as those - that were used when the pattern was compiled. If this is not the case, - the behaviour of pcre_exec() is undefined. Therefore, when a pattern is - compiled and matched in the same process, this field should never be - set. In this (the most common) case, the correct table pointer is auto- - matically passed with the compiled pattern from pcre_compile() to - pcre_exec(). - - If PCRE_EXTRA_MARK is set in the flags field, the mark field must be - set to point to a suitable variable. If the pattern contains any back- - tracking control verbs such as (*MARK:NAME), and the execution ends up - with a name to pass back, a pointer to the name string (zero termi- - nated) is placed in the variable pointed to by the mark field. The - names are within the compiled pattern; if you wish to retain such a - name you must copy it before freeing the memory of a compiled pattern. - If there is no name to pass back, the variable pointed to by the mark - field is set to NULL. For details of the backtracking control verbs, - see the section entitled "Backtracking control" in the pcrepattern doc- - umentation. - - Option bits for pcre_exec() - - The unused bits of the options argument for pcre_exec() must be zero. - The only bits that may be set are PCRE_ANCHORED, PCRE_NEWLINE_xxx, - PCRE_NOTBOL, PCRE_NOTEOL, PCRE_NOTEMPTY, PCRE_NOTEMPTY_ATSTART, - PCRE_NO_START_OPTIMIZE, PCRE_NO_UTF8_CHECK, PCRE_PARTIAL_HARD, and - PCRE_PARTIAL_SOFT. - - If the pattern was successfully studied with one of the just-in-time - (JIT) compile options, the only supported options for JIT execution are - PCRE_NO_UTF8_CHECK, PCRE_NOTBOL, PCRE_NOTEOL, PCRE_NOTEMPTY, - PCRE_NOTEMPTY_ATSTART, PCRE_PARTIAL_HARD, and PCRE_PARTIAL_SOFT. If an - unsupported option is used, JIT execution is disabled and the normal - interpretive code in pcre_exec() is run. - - PCRE_ANCHORED - - The PCRE_ANCHORED option limits pcre_exec() to matching at the first - matching position. If a pattern was compiled with PCRE_ANCHORED, or - turned out to be anchored by virtue of its contents, it cannot be made - unachored at matching time. - - PCRE_BSR_ANYCRLF - PCRE_BSR_UNICODE - - These options (which are mutually exclusive) control what the \R escape - sequence matches. The choice is either to match only CR, LF, or CRLF, - or to match any Unicode newline sequence. These options override the - choice that was made or defaulted when the pattern was compiled. - - PCRE_NEWLINE_CR - PCRE_NEWLINE_LF - PCRE_NEWLINE_CRLF - PCRE_NEWLINE_ANYCRLF - PCRE_NEWLINE_ANY - - These options override the newline definition that was chosen or - defaulted when the pattern was compiled. For details, see the descrip- - tion of pcre_compile() above. During matching, the newline choice - affects the behaviour of the dot, circumflex, and dollar metacharac- - ters. It may also alter the way the match position is advanced after a - match failure for an unanchored pattern. - - When PCRE_NEWLINE_CRLF, PCRE_NEWLINE_ANYCRLF, or PCRE_NEWLINE_ANY is - set, and a match attempt for an unanchored pattern fails when the cur- - rent position is at a CRLF sequence, and the pattern contains no - explicit matches for CR or LF characters, the match position is - advanced by two characters instead of one, in other words, to after the - CRLF. - - The above rule is a compromise that makes the most common cases work as - expected. For example, if the pattern is .+A (and the PCRE_DOTALL - option is not set), it does not match the string "\r\nA" because, after - failing at the start, it skips both the CR and the LF before retrying. - However, the pattern [\r\n]A does match that string, because it con- - tains an explicit CR or LF reference, and so advances only by one char- - acter after the first failure. - - An explicit match for CR of LF is either a literal appearance of one of - those characters, or one of the \r or \n escape sequences. Implicit - matches such as [^X] do not count, nor does \s (which includes CR and - LF in the characters that it matches). - - Notwithstanding the above, anomalous effects may still occur when CRLF - is a valid newline sequence and explicit \r or \n escapes appear in the - pattern. - - PCRE_NOTBOL - - This option specifies that first character of the subject string is not - the beginning of a line, so the circumflex metacharacter should not - match before it. Setting this without PCRE_MULTILINE (at compile time) - causes circumflex never to match. This option affects only the behav- - iour of the circumflex metacharacter. It does not affect \A. - - PCRE_NOTEOL - - This option specifies that the end of the subject string is not the end - of a line, so the dollar metacharacter should not match it nor (except - in multiline mode) a newline immediately before it. Setting this with- - out PCRE_MULTILINE (at compile time) causes dollar never to match. This - option affects only the behaviour of the dollar metacharacter. It does - not affect \Z or \z. - - PCRE_NOTEMPTY - - An empty string is not considered to be a valid match if this option is - set. If there are alternatives in the pattern, they are tried. If all - the alternatives match the empty string, the entire match fails. For - example, if the pattern - - a?b? - - is applied to a string not beginning with "a" or "b", it matches an - empty string at the start of the subject. With PCRE_NOTEMPTY set, this - match is not valid, so PCRE searches further into the string for occur- - rences of "a" or "b". - - PCRE_NOTEMPTY_ATSTART - - This is like PCRE_NOTEMPTY, except that an empty string match that is - not at the start of the subject is permitted. If the pattern is - anchored, such a match can occur only if the pattern contains \K. - - Perl has no direct equivalent of PCRE_NOTEMPTY or - PCRE_NOTEMPTY_ATSTART, but it does make a special case of a pattern - match of the empty string within its split() function, and when using - the /g modifier. It is possible to emulate Perl's behaviour after - matching a null string by first trying the match again at the same off- - set with PCRE_NOTEMPTY_ATSTART and PCRE_ANCHORED, and then if that - fails, by advancing the starting offset (see below) and trying an ordi- - nary match again. There is some code that demonstrates how to do this - in the pcredemo sample program. In the most general case, you have to - check to see if the newline convention recognizes CRLF as a newline, - and if so, and the current character is CR followed by LF, advance the - starting offset by two characters instead of one. - - PCRE_NO_START_OPTIMIZE - - There are a number of optimizations that pcre_exec() uses at the start - of a match, in order to speed up the process. For example, if it is - known that an unanchored match must start with a specific character, it - searches the subject for that character, and fails immediately if it - cannot find it, without actually running the main matching function. - This means that a special item such as (*COMMIT) at the start of a pat- - tern is not considered until after a suitable starting point for the - match has been found. Also, when callouts or (*MARK) items are in use, - these "start-up" optimizations can cause them to be skipped if the pat- - tern is never actually used. The start-up optimizations are in effect a - pre-scan of the subject that takes place before the pattern is run. - - The PCRE_NO_START_OPTIMIZE option disables the start-up optimizations, - possibly causing performance to suffer, but ensuring that in cases - where the result is "no match", the callouts do occur, and that items - such as (*COMMIT) and (*MARK) are considered at every possible starting - position in the subject string. If PCRE_NO_START_OPTIMIZE is set at - compile time, it cannot be unset at matching time. The use of - PCRE_NO_START_OPTIMIZE at matching time (that is, passing it to - pcre_exec()) disables JIT execution; in this situation, matching is - always done using interpretively. - - Setting PCRE_NO_START_OPTIMIZE can change the outcome of a matching - operation. Consider the pattern - - (*COMMIT)ABC - - When this is compiled, PCRE records the fact that a match must start - with the character "A". Suppose the subject string is "DEFABC". The - start-up optimization scans along the subject, finds "A" and runs the - first match attempt from there. The (*COMMIT) item means that the pat- - tern must match the current starting position, which in this case, it - does. However, if the same match is run with PCRE_NO_START_OPTIMIZE - set, the initial scan along the subject string does not happen. The - first match attempt is run starting from "D" and when this fails, - (*COMMIT) prevents any further matches being tried, so the overall - result is "no match". If the pattern is studied, more start-up opti- - mizations may be used. For example, a minimum length for the subject - may be recorded. Consider the pattern - - (*MARK:A)(X|Y) - - The minimum length for a match is one character. If the subject is - "ABC", there will be attempts to match "ABC", "BC", "C", and then - finally an empty string. If the pattern is studied, the final attempt - does not take place, because PCRE knows that the subject is too short, - and so the (*MARK) is never encountered. In this case, studying the - pattern does not affect the overall match result, which is still "no - match", but it does affect the auxiliary information that is returned. - - PCRE_NO_UTF8_CHECK - - When PCRE_UTF8 is set at compile time, the validity of the subject as a - UTF-8 string is automatically checked when pcre_exec() is subsequently - called. The entire string is checked before any other processing takes - place. The value of startoffset is also checked to ensure that it - points to the start of a UTF-8 character. There is a discussion about - the validity of UTF-8 strings in the pcreunicode page. If an invalid - sequence of bytes is found, pcre_exec() returns the error - PCRE_ERROR_BADUTF8 or, if PCRE_PARTIAL_HARD is set and the problem is a - truncated character at the end of the subject, PCRE_ERROR_SHORTUTF8. In - both cases, information about the precise nature of the error may also - be returned (see the descriptions of these errors in the section enti- - tled Error return values from pcre_exec() below). If startoffset con- - tains a value that does not point to the start of a UTF-8 character (or - to the end of the subject), PCRE_ERROR_BADUTF8_OFFSET is returned. - - If you already know that your subject is valid, and you want to skip - these checks for performance reasons, you can set the - PCRE_NO_UTF8_CHECK option when calling pcre_exec(). You might want to - do this for the second and subsequent calls to pcre_exec() if you are - making repeated calls to find all the matches in a single subject - string. However, you should be sure that the value of startoffset - points to the start of a character (or the end of the subject). When - PCRE_NO_UTF8_CHECK is set, the effect of passing an invalid string as a - subject or an invalid value of startoffset is undefined. Your program - may crash or loop. - - PCRE_PARTIAL_HARD - PCRE_PARTIAL_SOFT - - These options turn on the partial matching feature. For backwards com- - patibility, PCRE_PARTIAL is a synonym for PCRE_PARTIAL_SOFT. A partial - match occurs if the end of the subject string is reached successfully, - but there are not enough subject characters to complete the match. If - this happens when PCRE_PARTIAL_SOFT (but not PCRE_PARTIAL_HARD) is set, - matching continues by testing any remaining alternatives. Only if no - complete match can be found is PCRE_ERROR_PARTIAL returned instead of - PCRE_ERROR_NOMATCH. In other words, PCRE_PARTIAL_SOFT says that the - caller is prepared to handle a partial match, but only if no complete - match can be found. - - If PCRE_PARTIAL_HARD is set, it overrides PCRE_PARTIAL_SOFT. In this - case, if a partial match is found, pcre_exec() immediately returns - PCRE_ERROR_PARTIAL, without considering any other alternatives. In - other words, when PCRE_PARTIAL_HARD is set, a partial match is consid- - ered to be more important that an alternative complete match. - - In both cases, the portion of the string that was inspected when the - partial match was found is set as the first matching string. There is a - more detailed discussion of partial and multi-segment matching, with - examples, in the pcrepartial documentation. - - The string to be matched by pcre_exec() - - The subject string is passed to pcre_exec() as a pointer in subject, a - length in length, and a starting offset in startoffset. The units for - length and startoffset are bytes for the 8-bit library, 16-bit data - items for the 16-bit library, and 32-bit data items for the 32-bit - library. - - If startoffset is negative or greater than the length of the subject, - pcre_exec() returns PCRE_ERROR_BADOFFSET. When the starting offset is - zero, the search for a match starts at the beginning of the subject, - and this is by far the most common case. In UTF-8 or UTF-16 mode, the - offset must point to the start of a character, or the end of the sub- - ject (in UTF-32 mode, one data unit equals one character, so all off- - sets are valid). Unlike the pattern string, the subject may contain - binary zeroes. - - A non-zero starting offset is useful when searching for another match - in the same subject by calling pcre_exec() again after a previous suc- - cess. Setting startoffset differs from just passing over a shortened - string and setting PCRE_NOTBOL in the case of a pattern that begins - with any kind of lookbehind. For example, consider the pattern - - \Biss\B - - which finds occurrences of "iss" in the middle of words. (\B matches - only if the current position in the subject is not a word boundary.) - When applied to the string "Mississipi" the first call to pcre_exec() - finds the first occurrence. If pcre_exec() is called again with just - the remainder of the subject, namely "issipi", it does not match, - because \B is always false at the start of the subject, which is deemed - to be a word boundary. However, if pcre_exec() is passed the entire - string again, but with startoffset set to 4, it finds the second occur- - rence of "iss" because it is able to look behind the starting point to - discover that it is preceded by a letter. - - Finding all the matches in a subject is tricky when the pattern can - match an empty string. It is possible to emulate Perl's /g behaviour by - first trying the match again at the same offset, with the - PCRE_NOTEMPTY_ATSTART and PCRE_ANCHORED options, and then if that - fails, advancing the starting offset and trying an ordinary match - again. There is some code that demonstrates how to do this in the pcre- - demo sample program. In the most general case, you have to check to see - if the newline convention recognizes CRLF as a newline, and if so, and - the current character is CR followed by LF, advance the starting offset - by two characters instead of one. - - If a non-zero starting offset is passed when the pattern is anchored, - one attempt to match at the given offset is made. This can only succeed - if the pattern does not require the match to be at the start of the - subject. - - How pcre_exec() returns captured substrings - - In general, a pattern matches a certain portion of the subject, and in - addition, further substrings from the subject may be picked out by - parts of the pattern. Following the usage in Jeffrey Friedl's book, - this is called "capturing" in what follows, and the phrase "capturing - subpattern" is used for a fragment of a pattern that picks out a sub- - string. PCRE supports several other kinds of parenthesized subpattern - that do not cause substrings to be captured. - - Captured substrings are returned to the caller via a vector of integers - whose address is passed in ovector. The number of elements in the vec- - tor is passed in ovecsize, which must be a non-negative number. Note: - this argument is NOT the size of ovector in bytes. - - The first two-thirds of the vector is used to pass back captured sub- - strings, each substring using a pair of integers. The remaining third - of the vector is used as workspace by pcre_exec() while matching cap- - turing subpatterns, and is not available for passing back information. - The number passed in ovecsize should always be a multiple of three. If - it is not, it is rounded down. - - When a match is successful, information about captured substrings is - returned in pairs of integers, starting at the beginning of ovector, - and continuing up to two-thirds of its length at the most. The first - element of each pair is set to the offset of the first character in a - substring, and the second is set to the offset of the first character - after the end of a substring. These values are always data unit off- - sets, even in UTF mode. They are byte offsets in the 8-bit library, - 16-bit data item offsets in the 16-bit library, and 32-bit data item - offsets in the 32-bit library. Note: they are not character counts. - - The first pair of integers, ovector[0] and ovector[1], identify the - portion of the subject string matched by the entire pattern. The next - pair is used for the first capturing subpattern, and so on. The value - returned by pcre_exec() is one more than the highest numbered pair that - has been set. For example, if two substrings have been captured, the - returned value is 3. If there are no capturing subpatterns, the return - value from a successful match is 1, indicating that just the first pair - of offsets has been set. - - If a capturing subpattern is matched repeatedly, it is the last portion - of the string that it matched that is returned. - - If the vector is too small to hold all the captured substring offsets, - it is used as far as possible (up to two-thirds of its length), and the - function returns a value of zero. If neither the actual string matched - nor any captured substrings are of interest, pcre_exec() may be called - with ovector passed as NULL and ovecsize as zero. However, if the pat- - tern contains back references and the ovector is not big enough to - remember the related substrings, PCRE has to get additional memory for - use during matching. Thus it is usually advisable to supply an ovector - of reasonable size. - - There are some cases where zero is returned (indicating vector over- - flow) when in fact the vector is exactly the right size for the final - match. For example, consider the pattern - - (a)(?:(b)c|bd) - - If a vector of 6 elements (allowing for only 1 captured substring) is - given with subject string "abd", pcre_exec() will try to set the second - captured string, thereby recording a vector overflow, before failing to - match "c" and backing up to try the second alternative. The zero - return, however, does correctly indicate that the maximum number of - slots (namely 2) have been filled. In similar cases where there is tem- - porary overflow, but the final number of used slots is actually less - than the maximum, a non-zero value is returned. - - The pcre_fullinfo() function can be used to find out how many capturing - subpatterns there are in a compiled pattern. The smallest size for - ovector that will allow for n captured substrings, in addition to the - offsets of the substring matched by the whole pattern, is (n+1)*3. - - It is possible for capturing subpattern number n+1 to match some part - of the subject when subpattern n has not been used at all. For example, - if the string "abc" is matched against the pattern (a|(z))(bc) the - return from the function is 4, and subpatterns 1 and 3 are matched, but - 2 is not. When this happens, both values in the offset pairs corre- - sponding to unused subpatterns are set to -1. - - Offset values that correspond to unused subpatterns at the end of the - expression are also set to -1. For example, if the string "abc" is - matched against the pattern (abc)(x(yz)?)? subpatterns 2 and 3 are not - matched. The return from the function is 2, because the highest used - capturing subpattern number is 1, and the offsets for for the second - and third capturing subpatterns (assuming the vector is large enough, - of course) are set to -1. - - Note: Elements in the first two-thirds of ovector that do not corre- - spond to capturing parentheses in the pattern are never changed. That - is, if a pattern contains n capturing parentheses, no more than ovec- - tor[0] to ovector[2n+1] are set by pcre_exec(). The other elements (in - the first two-thirds) retain whatever values they previously had. - - Some convenience functions are provided for extracting the captured - substrings as separate strings. These are described below. - - Error return values from pcre_exec() - - If pcre_exec() fails, it returns a negative number. The following are - defined in the header file: - - PCRE_ERROR_NOMATCH (-1) - - The subject string did not match the pattern. - - PCRE_ERROR_NULL (-2) - - Either code or subject was passed as NULL, or ovector was NULL and - ovecsize was not zero. - - PCRE_ERROR_BADOPTION (-3) - - An unrecognized bit was set in the options argument. - - PCRE_ERROR_BADMAGIC (-4) - - PCRE stores a 4-byte "magic number" at the start of the compiled code, - to catch the case when it is passed a junk pointer and to detect when a - pattern that was compiled in an environment of one endianness is run in - an environment with the other endianness. This is the error that PCRE - gives when the magic number is not present. - - PCRE_ERROR_UNKNOWN_OPCODE (-5) - - While running the pattern match, an unknown item was encountered in the - compiled pattern. This error could be caused by a bug in PCRE or by - overwriting of the compiled pattern. - - PCRE_ERROR_NOMEMORY (-6) - - If a pattern contains back references, but the ovector that is passed - to pcre_exec() is not big enough to remember the referenced substrings, - PCRE gets a block of memory at the start of matching to use for this - purpose. If the call via pcre_malloc() fails, this error is given. The - memory is automatically freed at the end of matching. - - This error is also given if pcre_stack_malloc() fails in pcre_exec(). - This can happen only when PCRE has been compiled with --disable-stack- - for-recursion. - - PCRE_ERROR_NOSUBSTRING (-7) - - This error is used by the pcre_copy_substring(), pcre_get_substring(), - and pcre_get_substring_list() functions (see below). It is never - returned by pcre_exec(). - - PCRE_ERROR_MATCHLIMIT (-8) - - The backtracking limit, as specified by the match_limit field in a - pcre_extra structure (or defaulted) was reached. See the description - above. - - PCRE_ERROR_CALLOUT (-9) - - This error is never generated by pcre_exec() itself. It is provided for - use by callout functions that want to yield a distinctive error code. - See the pcrecallout documentation for details. - - PCRE_ERROR_BADUTF8 (-10) - - A string that contains an invalid UTF-8 byte sequence was passed as a - subject, and the PCRE_NO_UTF8_CHECK option was not set. If the size of - the output vector (ovecsize) is at least 2, the byte offset to the - start of the the invalid UTF-8 character is placed in the first ele- - ment, and a reason code is placed in the second element. The reason - codes are listed in the following section. For backward compatibility, - if PCRE_PARTIAL_HARD is set and the problem is a truncated UTF-8 char- - acter at the end of the subject (reason codes 1 to 5), - PCRE_ERROR_SHORTUTF8 is returned instead of PCRE_ERROR_BADUTF8. - - PCRE_ERROR_BADUTF8_OFFSET (-11) - - The UTF-8 byte sequence that was passed as a subject was checked and - found to be valid (the PCRE_NO_UTF8_CHECK option was not set), but the - value of startoffset did not point to the beginning of a UTF-8 charac- - ter or the end of the subject. - - PCRE_ERROR_PARTIAL (-12) - - The subject string did not match, but it did match partially. See the - pcrepartial documentation for details of partial matching. - - PCRE_ERROR_BADPARTIAL (-13) - - This code is no longer in use. It was formerly returned when the - PCRE_PARTIAL option was used with a compiled pattern containing items - that were not supported for partial matching. From release 8.00 - onwards, there are no restrictions on partial matching. - - PCRE_ERROR_INTERNAL (-14) - - An unexpected internal error has occurred. This error could be caused - by a bug in PCRE or by overwriting of the compiled pattern. - - PCRE_ERROR_BADCOUNT (-15) - - This error is given if the value of the ovecsize argument is negative. - - PCRE_ERROR_RECURSIONLIMIT (-21) - - The internal recursion limit, as specified by the match_limit_recursion - field in a pcre_extra structure (or defaulted) was reached. See the - description above. - - PCRE_ERROR_BADNEWLINE (-23) - - An invalid combination of PCRE_NEWLINE_xxx options was given. - - PCRE_ERROR_BADOFFSET (-24) - - The value of startoffset was negative or greater than the length of the - subject, that is, the value in length. - - PCRE_ERROR_SHORTUTF8 (-25) - - This error is returned instead of PCRE_ERROR_BADUTF8 when the subject - string ends with a truncated UTF-8 character and the PCRE_PARTIAL_HARD - option is set. Information about the failure is returned as for - PCRE_ERROR_BADUTF8. It is in fact sufficient to detect this case, but - this special error code for PCRE_PARTIAL_HARD precedes the implementa- - tion of returned information; it is retained for backwards compatibil- - ity. - - PCRE_ERROR_RECURSELOOP (-26) - - This error is returned when pcre_exec() detects a recursion loop within - the pattern. Specifically, it means that either the whole pattern or a - subpattern has been called recursively for the second time at the same - position in the subject string. Some simple patterns that might do this - are detected and faulted at compile time, but more complicated cases, - in particular mutual recursions between two different subpatterns, can- - not be detected until run time. - - PCRE_ERROR_JIT_STACKLIMIT (-27) - - This error is returned when a pattern that was successfully studied - using a JIT compile option is being matched, but the memory available - for the just-in-time processing stack is not large enough. See the - pcrejit documentation for more details. - - PCRE_ERROR_BADMODE (-28) - - This error is given if a pattern that was compiled by the 8-bit library - is passed to a 16-bit or 32-bit library function, or vice versa. - - PCRE_ERROR_BADENDIANNESS (-29) - - This error is given if a pattern that was compiled and saved is - reloaded on a host with different endianness. The utility function - pcre_pattern_to_host_byte_order() can be used to convert such a pattern - so that it runs on the new host. - - PCRE_ERROR_JIT_BADOPTION - - This error is returned when a pattern that was successfully studied - using a JIT compile option is being matched, but the matching mode - (partial or complete match) does not correspond to any JIT compilation - mode. When the JIT fast path function is used, this error may be also - given for invalid options. See the pcrejit documentation for more - details. - - PCRE_ERROR_BADLENGTH (-32) - - This error is given if pcre_exec() is called with a negative value for - the length argument. - - Error numbers -16 to -20, -22, and 30 are not used by pcre_exec(). - - Reason codes for invalid UTF-8 strings - - This section applies only to the 8-bit library. The corresponding - information for the 16-bit and 32-bit libraries is given in the pcre16 - and pcre32 pages. - - When pcre_exec() returns either PCRE_ERROR_BADUTF8 or PCRE_ERROR_SHORT- - UTF8, and the size of the output vector (ovecsize) is at least 2, the - offset of the start of the invalid UTF-8 character is placed in the - first output vector element (ovector[0]) and a reason code is placed in - the second element (ovector[1]). The reason codes are given names in - the pcre.h header file: - - PCRE_UTF8_ERR1 - PCRE_UTF8_ERR2 - PCRE_UTF8_ERR3 - PCRE_UTF8_ERR4 - PCRE_UTF8_ERR5 - - The string ends with a truncated UTF-8 character; the code specifies - how many bytes are missing (1 to 5). Although RFC 3629 restricts UTF-8 - characters to be no longer than 4 bytes, the encoding scheme (origi- - nally defined by RFC 2279) allows for up to 6 bytes, and this is - checked first; hence the possibility of 4 or 5 missing bytes. - - PCRE_UTF8_ERR6 - PCRE_UTF8_ERR7 - PCRE_UTF8_ERR8 - PCRE_UTF8_ERR9 - PCRE_UTF8_ERR10 - - The two most significant bits of the 2nd, 3rd, 4th, 5th, or 6th byte of - the character do not have the binary value 0b10 (that is, either the - most significant bit is 0, or the next bit is 1). - - PCRE_UTF8_ERR11 - PCRE_UTF8_ERR12 - - A character that is valid by the RFC 2279 rules is either 5 or 6 bytes - long; these code points are excluded by RFC 3629. - - PCRE_UTF8_ERR13 - - A 4-byte character has a value greater than 0x10fff; these code points - are excluded by RFC 3629. - - PCRE_UTF8_ERR14 - - A 3-byte character has a value in the range 0xd800 to 0xdfff; this - range of code points are reserved by RFC 3629 for use with UTF-16, and - so are excluded from UTF-8. - - PCRE_UTF8_ERR15 - PCRE_UTF8_ERR16 - PCRE_UTF8_ERR17 - PCRE_UTF8_ERR18 - PCRE_UTF8_ERR19 - - A 2-, 3-, 4-, 5-, or 6-byte character is "overlong", that is, it codes - for a value that can be represented by fewer bytes, which is invalid. - For example, the two bytes 0xc0, 0xae give the value 0x2e, whose cor- - rect coding uses just one byte. - - PCRE_UTF8_ERR20 - - The two most significant bits of the first byte of a character have the - binary value 0b10 (that is, the most significant bit is 1 and the sec- - ond is 0). Such a byte can only validly occur as the second or subse- - quent byte of a multi-byte character. - - PCRE_UTF8_ERR21 - - The first byte of a character has the value 0xfe or 0xff. These values - can never occur in a valid UTF-8 string. - - PCRE_UTF8_ERR22 - - This error code was formerly used when the presence of a so-called - "non-character" caused an error. Unicode corrigendum #9 makes it clear - that such characters should not cause a string to be rejected, and so - this code is no longer in use and is never returned. - - -EXTRACTING CAPTURED SUBSTRINGS BY NUMBER - - int pcre_copy_substring(const char *subject, int *ovector, - int stringcount, int stringnumber, char *buffer, - int buffersize); - - int pcre_get_substring(const char *subject, int *ovector, - int stringcount, int stringnumber, - const char **stringptr); - - int pcre_get_substring_list(const char *subject, - int *ovector, int stringcount, const char ***listptr); - - Captured substrings can be accessed directly by using the offsets - returned by pcre_exec() in ovector. For convenience, the functions - pcre_copy_substring(), pcre_get_substring(), and pcre_get_sub- - string_list() are provided for extracting captured substrings as new, - separate, zero-terminated strings. These functions identify substrings - by number. The next section describes functions for extracting named - substrings. - - A substring that contains a binary zero is correctly extracted and has - a further zero added on the end, but the result is not, of course, a C - string. However, you can process such a string by referring to the - length that is returned by pcre_copy_substring() and pcre_get_sub- - string(). Unfortunately, the interface to pcre_get_substring_list() is - not adequate for handling strings containing binary zeros, because the - end of the final string is not independently indicated. - - The first three arguments are the same for all three of these func- - tions: subject is the subject string that has just been successfully - matched, ovector is a pointer to the vector of integer offsets that was - passed to pcre_exec(), and stringcount is the number of substrings that - were captured by the match, including the substring that matched the - entire regular expression. This is the value returned by pcre_exec() if - it is greater than zero. If pcre_exec() returned zero, indicating that - it ran out of space in ovector, the value passed as stringcount should - be the number of elements in the vector divided by three. - - The functions pcre_copy_substring() and pcre_get_substring() extract a - single substring, whose number is given as stringnumber. A value of - zero extracts the substring that matched the entire pattern, whereas - higher values extract the captured substrings. For pcre_copy_sub- - string(), the string is placed in buffer, whose length is given by - buffersize, while for pcre_get_substring() a new block of memory is - obtained via pcre_malloc, and its address is returned via stringptr. - The yield of the function is the length of the string, not including - the terminating zero, or one of these error codes: - - PCRE_ERROR_NOMEMORY (-6) - - The buffer was too small for pcre_copy_substring(), or the attempt to - get memory failed for pcre_get_substring(). - - PCRE_ERROR_NOSUBSTRING (-7) - - There is no substring whose number is stringnumber. - - The pcre_get_substring_list() function extracts all available sub- - strings and builds a list of pointers to them. All this is done in a - single block of memory that is obtained via pcre_malloc. The address of - the memory block is returned via listptr, which is also the start of - the list of string pointers. The end of the list is marked by a NULL - pointer. The yield of the function is zero if all went well, or the - error code - - PCRE_ERROR_NOMEMORY (-6) - - if the attempt to get the memory block failed. - - When any of these functions encounter a substring that is unset, which - can happen when capturing subpattern number n+1 matches some part of - the subject, but subpattern n has not been used at all, they return an - empty string. This can be distinguished from a genuine zero-length sub- - string by inspecting the appropriate offset in ovector, which is nega- - tive for unset substrings. - - The two convenience functions pcre_free_substring() and pcre_free_sub- - string_list() can be used to free the memory returned by a previous - call of pcre_get_substring() or pcre_get_substring_list(), respec- - tively. They do nothing more than call the function pointed to by - pcre_free, which of course could be called directly from a C program. - However, PCRE is used in some situations where it is linked via a spe- - cial interface to another programming language that cannot use - pcre_free directly; it is for these cases that the functions are pro- - vided. - - -EXTRACTING CAPTURED SUBSTRINGS BY NAME - - int pcre_get_stringnumber(const pcre *code, - const char *name); - - int pcre_copy_named_substring(const pcre *code, - const char *subject, int *ovector, - int stringcount, const char *stringname, - char *buffer, int buffersize); - - int pcre_get_named_substring(const pcre *code, - const char *subject, int *ovector, - int stringcount, const char *stringname, - const char **stringptr); - - To extract a substring by name, you first have to find associated num- - ber. For example, for this pattern - - (a+)b(?\d+)... - - the number of the subpattern called "xxx" is 2. If the name is known to - be unique (PCRE_DUPNAMES was not set), you can find the number from the - name by calling pcre_get_stringnumber(). The first argument is the com- - piled pattern, and the second is the name. The yield of the function is - the subpattern number, or PCRE_ERROR_NOSUBSTRING (-7) if there is no - subpattern of that name. - - Given the number, you can extract the substring directly, or use one of - the functions described in the previous section. For convenience, there - are also two functions that do the whole job. - - Most of the arguments of pcre_copy_named_substring() and - pcre_get_named_substring() are the same as those for the similarly - named functions that extract by number. As these are described in the - previous section, they are not re-described here. There are just two - differences: - - First, instead of a substring number, a substring name is given. Sec- - ond, there is an extra argument, given at the start, which is a pointer - to the compiled pattern. This is needed in order to gain access to the - name-to-number translation table. - - These functions call pcre_get_stringnumber(), and if it succeeds, they - then call pcre_copy_substring() or pcre_get_substring(), as appropri- - ate. NOTE: If PCRE_DUPNAMES is set and there are duplicate names, the - behaviour may not be what you want (see the next section). - - Warning: If the pattern uses the (?| feature to set up multiple subpat- - terns with the same number, as described in the section on duplicate - subpattern numbers in the pcrepattern page, you cannot use names to - distinguish the different subpatterns, because names are not included - in the compiled code. The matching process uses only numbers. For this - reason, the use of different names for subpatterns of the same number - causes an error at compile time. - - -DUPLICATE SUBPATTERN NAMES - - int pcre_get_stringtable_entries(const pcre *code, - const char *name, char **first, char **last); - - When a pattern is compiled with the PCRE_DUPNAMES option, names for - subpatterns are not required to be unique. (Duplicate names are always - allowed for subpatterns with the same number, created by using the (?| - feature. Indeed, if such subpatterns are named, they are required to - use the same names.) - - Normally, patterns with duplicate names are such that in any one match, - only one of the named subpatterns participates. An example is shown in - the pcrepattern documentation. - - When duplicates are present, pcre_copy_named_substring() and - pcre_get_named_substring() return the first substring corresponding to - the given name that is set. If none are set, PCRE_ERROR_NOSUBSTRING - (-7) is returned; no data is returned. The pcre_get_stringnumber() - function returns one of the numbers that are associated with the name, - but it is not defined which it is. - - If you want to get full details of all captured substrings for a given - name, you must use the pcre_get_stringtable_entries() function. The - first argument is the compiled pattern, and the second is the name. The - third and fourth are pointers to variables which are updated by the - function. After it has run, they point to the first and last entries in - the name-to-number table for the given name. The function itself - returns the length of each entry, or PCRE_ERROR_NOSUBSTRING (-7) if - there are none. The format of the table is described above in the sec- - tion entitled Information about a pattern above. Given all the rele- - vant entries for the name, you can extract each of their numbers, and - hence the captured data, if any. - - -FINDING ALL POSSIBLE MATCHES - - The traditional matching function uses a similar algorithm to Perl, - which stops when it finds the first match, starting at a given point in - the subject. If you want to find all possible matches, or the longest - possible match, consider using the alternative matching function (see - below) instead. If you cannot use the alternative function, but still - need to find all possible matches, you can kludge it up by making use - of the callout facility, which is described in the pcrecallout documen- - tation. - - What you have to do is to insert a callout right at the end of the pat- - tern. When your callout function is called, extract and save the cur- - rent matched substring. Then return 1, which forces pcre_exec() to - backtrack and try other alternatives. Ultimately, when it runs out of - matches, pcre_exec() will yield PCRE_ERROR_NOMATCH. - - -OBTAINING AN ESTIMATE OF STACK USAGE - - Matching certain patterns using pcre_exec() can use a lot of process - stack, which in certain environments can be rather limited in size. - Some users find it helpful to have an estimate of the amount of stack - that is used by pcre_exec(), to help them set recursion limits, as - described in the pcrestack documentation. The estimate that is output - by pcretest when called with the -m and -C options is obtained by call- - ing pcre_exec with the values NULL, NULL, NULL, -999, and -999 for its - first five arguments. - - Normally, if its first argument is NULL, pcre_exec() immediately - returns the negative error code PCRE_ERROR_NULL, but with this special - combination of arguments, it returns instead a negative number whose - absolute value is the approximate stack frame size in bytes. (A nega- - tive number is used so that it is clear that no match has happened.) - The value is approximate because in some cases, recursive calls to - pcre_exec() occur when there are one or two additional variables on the - stack. - - If PCRE has been compiled to use the heap instead of the stack for - recursion, the value returned is the size of each block that is - obtained from the heap. - - -MATCHING A PATTERN: THE ALTERNATIVE FUNCTION - - int pcre_dfa_exec(const pcre *code, const pcre_extra *extra, - const char *subject, int length, int startoffset, - int options, int *ovector, int ovecsize, - int *workspace, int wscount); - - The function pcre_dfa_exec() is called to match a subject string - against a compiled pattern, using a matching algorithm that scans the - subject string just once, and does not backtrack. This has different - characteristics to the normal algorithm, and is not compatible with - Perl. Some of the features of PCRE patterns are not supported. Never- - theless, there are times when this kind of matching can be useful. For - a discussion of the two matching algorithms, and a list of features - that pcre_dfa_exec() does not support, see the pcrematching documenta- - tion. - - The arguments for the pcre_dfa_exec() function are the same as for - pcre_exec(), plus two extras. The ovector argument is used in a differ- - ent way, and this is described below. The other common arguments are - used in the same way as for pcre_exec(), so their description is not - repeated here. - - The two additional arguments provide workspace for the function. The - workspace vector should contain at least 20 elements. It is used for - keeping track of multiple paths through the pattern tree. More - workspace will be needed for patterns and subjects where there are a - lot of potential matches. - - Here is an example of a simple call to pcre_dfa_exec(): - - int rc; - int ovector[10]; - int wspace[20]; - rc = pcre_dfa_exec( - re, /* result of pcre_compile() */ - NULL, /* we didn't study the pattern */ - "some string", /* the subject string */ - 11, /* the length of the subject string */ - 0, /* start at offset 0 in the subject */ - 0, /* default options */ - ovector, /* vector of integers for substring information */ - 10, /* number of elements (NOT size in bytes) */ - wspace, /* working space vector */ - 20); /* number of elements (NOT size in bytes) */ - - Option bits for pcre_dfa_exec() - - The unused bits of the options argument for pcre_dfa_exec() must be - zero. The only bits that may be set are PCRE_ANCHORED, PCRE_NEW- - LINE_xxx, PCRE_NOTBOL, PCRE_NOTEOL, PCRE_NOTEMPTY, - PCRE_NOTEMPTY_ATSTART, PCRE_NO_UTF8_CHECK, PCRE_BSR_ANYCRLF, - PCRE_BSR_UNICODE, PCRE_NO_START_OPTIMIZE, PCRE_PARTIAL_HARD, PCRE_PAR- - TIAL_SOFT, PCRE_DFA_SHORTEST, and PCRE_DFA_RESTART. All but the last - four of these are exactly the same as for pcre_exec(), so their - description is not repeated here. - - PCRE_PARTIAL_HARD - PCRE_PARTIAL_SOFT - - These have the same general effect as they do for pcre_exec(), but the - details are slightly different. When PCRE_PARTIAL_HARD is set for - pcre_dfa_exec(), it returns PCRE_ERROR_PARTIAL if the end of the sub- - ject is reached and there is still at least one matching possibility - that requires additional characters. This happens even if some complete - matches have also been found. When PCRE_PARTIAL_SOFT is set, the return - code PCRE_ERROR_NOMATCH is converted into PCRE_ERROR_PARTIAL if the end - of the subject is reached, there have been no complete matches, but - there is still at least one matching possibility. The portion of the - string that was inspected when the longest partial match was found is - set as the first matching string in both cases. There is a more - detailed discussion of partial and multi-segment matching, with exam- - ples, in the pcrepartial documentation. - - PCRE_DFA_SHORTEST - - Setting the PCRE_DFA_SHORTEST option causes the matching algorithm to - stop as soon as it has found one match. Because of the way the alterna- - tive algorithm works, this is necessarily the shortest possible match - at the first possible matching point in the subject string. - - PCRE_DFA_RESTART - - When pcre_dfa_exec() returns a partial match, it is possible to call it - again, with additional subject characters, and have it continue with - the same match. The PCRE_DFA_RESTART option requests this action; when - it is set, the workspace and wscount options must reference the same - vector as before because data about the match so far is left in them - after a partial match. There is more discussion of this facility in the - pcrepartial documentation. - - Successful returns from pcre_dfa_exec() - - When pcre_dfa_exec() succeeds, it may have matched more than one sub- - string in the subject. Note, however, that all the matches from one run - of the function start at the same point in the subject. The shorter - matches are all initial substrings of the longer matches. For example, - if the pattern - - <.*> - - is matched against the string - - This is no more - - the three matched strings are - - - - - - On success, the yield of the function is a number greater than zero, - which is the number of matched substrings. The substrings themselves - are returned in ovector. Each string uses two elements; the first is - the offset to the start, and the second is the offset to the end. In - fact, all the strings have the same start offset. (Space could have - been saved by giving this only once, but it was decided to retain some - compatibility with the way pcre_exec() returns data, even though the - meaning of the strings is different.) - - The strings are returned in reverse order of length; that is, the long- - est matching string is given first. If there were too many matches to - fit into ovector, the yield of the function is zero, and the vector is - filled with the longest matches. Unlike pcre_exec(), pcre_dfa_exec() - can use the entire ovector for returning matched strings. - - NOTE: PCRE's "auto-possessification" optimization usually applies to - character repeats at the end of a pattern (as well as internally). For - example, the pattern "a\d+" is compiled as if it were "a\d++" because - there is no point even considering the possibility of backtracking into - the repeated digits. For DFA matching, this means that only one possi- - ble match is found. If you really do want multiple matches in such - cases, either use an ungreedy repeat ("a\d+?") or set the - PCRE_NO_AUTO_POSSESS option when compiling. - - Error returns from pcre_dfa_exec() - - The pcre_dfa_exec() function returns a negative number when it fails. - Many of the errors are the same as for pcre_exec(), and these are - described above. There are in addition the following errors that are - specific to pcre_dfa_exec(): - - PCRE_ERROR_DFA_UITEM (-16) - - This return is given if pcre_dfa_exec() encounters an item in the pat- - tern that it does not support, for instance, the use of \C or a back - reference. - - PCRE_ERROR_DFA_UCOND (-17) - - This return is given if pcre_dfa_exec() encounters a condition item - that uses a back reference for the condition, or a test for recursion - in a specific group. These are not supported. - - PCRE_ERROR_DFA_UMLIMIT (-18) - - This return is given if pcre_dfa_exec() is called with an extra block - that contains a setting of the match_limit or match_limit_recursion - fields. This is not supported (these fields are meaningless for DFA - matching). - - PCRE_ERROR_DFA_WSSIZE (-19) - - This return is given if pcre_dfa_exec() runs out of space in the - workspace vector. - - PCRE_ERROR_DFA_RECURSE (-20) - - When a recursive subpattern is processed, the matching function calls - itself recursively, using private vectors for ovector and workspace. - This error is given if the output vector is not large enough. This - should be extremely rare, as a vector of size 1000 is used. - - PCRE_ERROR_DFA_BADRESTART (-30) - - When pcre_dfa_exec() is called with the PCRE_DFA_RESTART option, some - plausibility checks are made on the contents of the workspace, which - should contain data about the previous partial match. If any of these - checks fail, this error is given. - - -SEE ALSO - - pcre16(3), pcre32(3), pcrebuild(3), pcrecallout(3), pcrecpp(3)(3), - pcrematching(3), pcrepartial(3), pcreposix(3), pcreprecompile(3), pcre- - sample(3), pcrestack(3). - - -AUTHOR - - Philip Hazel - University Computing Service - Cambridge CB2 3QH, England. - - -REVISION - - Last updated: 18 December 2015 - Copyright (c) 1997-2015 University of Cambridge. ------------------------------------------------------------------------------- - - -PCRECALLOUT(3) Library Functions Manual PCRECALLOUT(3) - - - -NAME - PCRE - Perl-compatible regular expressions - -SYNOPSIS - - #include - - int (*pcre_callout)(pcre_callout_block *); - - int (*pcre16_callout)(pcre16_callout_block *); - - int (*pcre32_callout)(pcre32_callout_block *); - - -DESCRIPTION - - PCRE provides a feature called "callout", which is a means of temporar- - ily passing control to the caller of PCRE in the middle of pattern - matching. The caller of PCRE provides an external function by putting - its entry point in the global variable pcre_callout (pcre16_callout for - the 16-bit library, pcre32_callout for the 32-bit library). By default, - this variable contains NULL, which disables all calling out. - - Within a regular expression, (?C) indicates the points at which the - external function is to be called. Different callout points can be - identified by putting a number less than 256 after the letter C. The - default value is zero. For example, this pattern has two callout - points: - - (?C1)abc(?C2)def - - If the PCRE_AUTO_CALLOUT option bit is set when a pattern is compiled, - PCRE automatically inserts callouts, all with number 255, before each - item in the pattern. For example, if PCRE_AUTO_CALLOUT is used with the - pattern - - A(\d{2}|--) - - it is processed as if it were - - (?C255)A(?C255)((?C255)\d{2}(?C255)|(?C255)-(?C255)-(?C255))(?C255) - - Notice that there is a callout before and after each parenthesis and - alternation bar. If the pattern contains a conditional group whose con- - dition is an assertion, an automatic callout is inserted immediately - before the condition. Such a callout may also be inserted explicitly, - for example: - - (?(?C9)(?=a)ab|de) - - This applies only to assertion conditions (because they are themselves - independent groups). - - Automatic callouts can be used for tracking the progress of pattern - matching. The pcretest program has a pattern qualifier (/C) that sets - automatic callouts; when it is used, the output indicates how the pat- - tern is being matched. This is useful information when you are trying - to optimize the performance of a particular pattern. - - -MISSING CALLOUTS - - You should be aware that, because of optimizations in the way PCRE com- - piles and matches patterns, callouts sometimes do not happen exactly as - you might expect. - - At compile time, PCRE "auto-possessifies" repeated items when it knows - that what follows cannot be part of the repeat. For example, a+[bc] is - compiled as if it were a++[bc]. The pcretest output when this pattern - is anchored and then applied with automatic callouts to the string - "aaaa" is: - - --->aaaa - +0 ^ ^ - +1 ^ a+ - +3 ^ ^ [bc] - No match - - This indicates that when matching [bc] fails, there is no backtracking - into a+ and therefore the callouts that would be taken for the back- - tracks do not occur. You can disable the auto-possessify feature by - passing PCRE_NO_AUTO_POSSESS to pcre_compile(), or starting the pattern - with (*NO_AUTO_POSSESS). If this is done in pcretest (using the /O - qualifier), the output changes to this: - - --->aaaa - +0 ^ ^ - +1 ^ a+ - +3 ^ ^ [bc] - +3 ^ ^ [bc] - +3 ^ ^ [bc] - +3 ^^ [bc] - No match - - This time, when matching [bc] fails, the matcher backtracks into a+ and - tries again, repeatedly, until a+ itself fails. - - Other optimizations that provide fast "no match" results also affect - callouts. For example, if the pattern is - - ab(?C4)cd - - PCRE knows that any matching string must contain the letter "d". If the - subject string is "abyz", the lack of "d" means that matching doesn't - ever start, and the callout is never reached. However, with "abyd", - though the result is still no match, the callout is obeyed. - - If the pattern is studied, PCRE knows the minimum length of a matching - string, and will immediately give a "no match" return without actually - running a match if the subject is not long enough, or, for unanchored - patterns, if it has been scanned far enough. - - You can disable these optimizations by passing the PCRE_NO_START_OPTI- - MIZE option to the matching function, or by starting the pattern with - (*NO_START_OPT). This slows down the matching process, but does ensure - that callouts such as the example above are obeyed. - - -THE CALLOUT INTERFACE - - During matching, when PCRE reaches a callout point, the external func- - tion defined by pcre_callout or pcre[16|32]_callout is called (if it is - set). This applies to both normal and DFA matching. The only argument - to the callout function is a pointer to a pcre_callout or - pcre[16|32]_callout block. These structures contains the following - fields: - - int version; - int callout_number; - int *offset_vector; - const char *subject; (8-bit version) - PCRE_SPTR16 subject; (16-bit version) - PCRE_SPTR32 subject; (32-bit version) - int subject_length; - int start_match; - int current_position; - int capture_top; - int capture_last; - void *callout_data; - int pattern_position; - int next_item_length; - const unsigned char *mark; (8-bit version) - const PCRE_UCHAR16 *mark; (16-bit version) - const PCRE_UCHAR32 *mark; (32-bit version) - - The version field is an integer containing the version number of the - block format. The initial version was 0; the current version is 2. The - version number will change again in future if additional fields are - added, but the intention is never to remove any of the existing fields. - - The callout_number field contains the number of the callout, as com- - piled into the pattern (that is, the number after ?C for manual call- - outs, and 255 for automatically generated callouts). - - The offset_vector field is a pointer to the vector of offsets that was - passed by the caller to the matching function. When pcre_exec() or - pcre[16|32]_exec() is used, the contents can be inspected, in order to - extract substrings that have been matched so far, in the same way as - for extracting substrings after a match has completed. For the DFA - matching functions, this field is not useful. - - The subject and subject_length fields contain copies of the values that - were passed to the matching function. - - The start_match field normally contains the offset within the subject - at which the current match attempt started. However, if the escape - sequence \K has been encountered, this value is changed to reflect the - modified starting point. If the pattern is not anchored, the callout - function may be called several times from the same point in the pattern - for different starting points in the subject. - - The current_position field contains the offset within the subject of - the current match pointer. - - When the pcre_exec() or pcre[16|32]_exec() is used, the capture_top - field contains one more than the number of the highest numbered cap- - tured substring so far. If no substrings have been captured, the value - of capture_top is one. This is always the case when the DFA functions - are used, because they do not support captured substrings. - - The capture_last field contains the number of the most recently cap- - tured substring. However, when a recursion exits, the value reverts to - what it was outside the recursion, as do the values of all captured - substrings. If no substrings have been captured, the value of cap- - ture_last is -1. This is always the case for the DFA matching func- - tions. - - The callout_data field contains a value that is passed to a matching - function specifically so that it can be passed back in callouts. It is - passed in the callout_data field of a pcre_extra or pcre[16|32]_extra - data structure. If no such data was passed, the value of callout_data - in a callout block is NULL. There is a description of the pcre_extra - structure in the pcreapi documentation. - - The pattern_position field is present from version 1 of the callout - structure. It contains the offset to the next item to be matched in the - pattern string. - - The next_item_length field is present from version 1 of the callout - structure. It contains the length of the next item to be matched in the - pattern string. When the callout immediately precedes an alternation - bar, a closing parenthesis, or the end of the pattern, the length is - zero. When the callout precedes an opening parenthesis, the length is - that of the entire subpattern. - - The pattern_position and next_item_length fields are intended to help - in distinguishing between different automatic callouts, which all have - the same callout number. However, they are set for all callouts. - - The mark field is present from version 2 of the callout structure. In - callouts from pcre_exec() or pcre[16|32]_exec() it contains a pointer - to the zero-terminated name of the most recently passed (*MARK), - (*PRUNE), or (*THEN) item in the match, or NULL if no such items have - been passed. Instances of (*PRUNE) or (*THEN) without a name do not - obliterate a previous (*MARK). In callouts from the DFA matching func- - tions this field always contains NULL. - - -RETURN VALUES - - The external callout function returns an integer to PCRE. If the value - is zero, matching proceeds as normal. If the value is greater than - zero, matching fails at the current point, but the testing of other - matching possibilities goes ahead, just as if a lookahead assertion had - failed. If the value is less than zero, the match is abandoned, the - matching function returns the negative value. - - Negative values should normally be chosen from the set of - PCRE_ERROR_xxx values. In particular, PCRE_ERROR_NOMATCH forces a stan- - dard "no match" failure. The error number PCRE_ERROR_CALLOUT is - reserved for use by callout functions; it will never be used by PCRE - itself. - - -AUTHOR - - Philip Hazel - University Computing Service - Cambridge CB2 3QH, England. - - -REVISION - - Last updated: 12 November 2013 - Copyright (c) 1997-2013 University of Cambridge. ------------------------------------------------------------------------------- - - -PCRECOMPAT(3) Library Functions Manual PCRECOMPAT(3) - - - -NAME - PCRE - Perl-compatible regular expressions - -DIFFERENCES BETWEEN PCRE AND PERL - - This document describes the differences in the ways that PCRE and Perl - handle regular expressions. The differences described here are with - respect to Perl versions 5.10 and above. - - 1. PCRE has only a subset of Perl's Unicode support. Details of what it - does have are given in the pcreunicode page. - - 2. PCRE allows repeat quantifiers only on parenthesized assertions, but - they do not mean what you might think. For example, (?!a){3} does not - assert that the next three characters are not "a". It just asserts that - the next character is not "a" three times (in principle: PCRE optimizes - this to run the assertion just once). Perl allows repeat quantifiers on - other assertions such as \b, but these do not seem to have any use. - - 3. Capturing subpatterns that occur inside negative lookahead asser- - tions are counted, but their entries in the offsets vector are never - set. Perl sometimes (but not always) sets its numerical variables from - inside negative assertions. - - 4. Though binary zero characters are supported in the subject string, - they are not allowed in a pattern string because it is passed as a nor- - mal C string, terminated by zero. The escape sequence \0 can be used in - the pattern to represent a binary zero. - - 5. The following Perl escape sequences are not supported: \l, \u, \L, - \U, and \N when followed by a character name or Unicode value. (\N on - its own, matching a non-newline character, is supported.) In fact these - are implemented by Perl's general string-handling and are not part of - its pattern matching engine. If any of these are encountered by PCRE, - an error is generated by default. However, if the PCRE_JAVASCRIPT_COM- - PAT option is set, \U and \u are interpreted as JavaScript interprets - them. - - 6. The Perl escape sequences \p, \P, and \X are supported only if PCRE - is built with Unicode character property support. The properties that - can be tested with \p and \P are limited to the general category prop- - erties such as Lu and Nd, script names such as Greek or Han, and the - derived properties Any and L&. PCRE does support the Cs (surrogate) - property, which Perl does not; the Perl documentation says "Because - Perl hides the need for the user to understand the internal representa- - tion of Unicode characters, there is no need to implement the somewhat - messy concept of surrogates." - - 7. PCRE does support the \Q...\E escape for quoting substrings. Charac- - ters in between are treated as literals. This is slightly different - from Perl in that $ and @ are also handled as literals inside the - quotes. In Perl, they cause variable interpolation (but of course PCRE - does not have variables). Note the following examples: - - Pattern PCRE matches Perl matches - - \Qabc$xyz\E abc$xyz abc followed by the - contents of $xyz - \Qabc\$xyz\E abc\$xyz abc\$xyz - \Qabc\E\$\Qxyz\E abc$xyz abc$xyz - - The \Q...\E sequence is recognized both inside and outside character - classes. - - 8. Fairly obviously, PCRE does not support the (?{code}) and (??{code}) - constructions. However, there is support for recursive patterns. This - is not available in Perl 5.8, but it is in Perl 5.10. Also, the PCRE - "callout" feature allows an external function to be called during pat- - tern matching. See the pcrecallout documentation for details. - - 9. Subpatterns that are called as subroutines (whether or not recur- - sively) are always treated as atomic groups in PCRE. This is like - Python, but unlike Perl. Captured values that are set outside a sub- - routine call can be reference from inside in PCRE, but not in Perl. - There is a discussion that explains these differences in more detail in - the section on recursion differences from Perl in the pcrepattern page. - - 10. If any of the backtracking control verbs are used in a subpattern - that is called as a subroutine (whether or not recursively), their - effect is confined to that subpattern; it does not extend to the sur- - rounding pattern. This is not always the case in Perl. In particular, - if (*THEN) is present in a group that is called as a subroutine, its - action is limited to that group, even if the group does not contain any - | characters. Note that such subpatterns are processed as anchored at - the point where they are tested. - - 11. If a pattern contains more than one backtracking control verb, the - first one that is backtracked onto acts. For example, in the pattern - A(*COMMIT)B(*PRUNE)C a failure in B triggers (*COMMIT), but a failure - in C triggers (*PRUNE). Perl's behaviour is more complex; in many cases - it is the same as PCRE, but there are examples where it differs. - - 12. Most backtracking verbs in assertions have their normal actions. - They are not confined to the assertion. - - 13. There are some differences that are concerned with the settings of - captured strings when part of a pattern is repeated. For example, - matching "aba" against the pattern /^(a(b)?)+$/ in Perl leaves $2 - unset, but in PCRE it is set to "b". - - 14. PCRE's handling of duplicate subpattern numbers and duplicate sub- - pattern names is not as general as Perl's. This is a consequence of the - fact the PCRE works internally just with numbers, using an external ta- - ble to translate between numbers and names. In particular, a pattern - such as (?|(?A)|(?B), where the two capturing parentheses have - the same number but different names, is not supported, and causes an - error at compile time. If it were allowed, it would not be possible to - distinguish which parentheses matched, because both names map to cap- - turing subpattern number 1. To avoid this confusing situation, an error - is given at compile time. - - 15. Perl recognizes comments in some places that PCRE does not, for - example, between the ( and ? at the start of a subpattern. If the /x - modifier is set, Perl allows white space between ( and ? (though cur- - rent Perls warn that this is deprecated) but PCRE never does, even if - the PCRE_EXTENDED option is set. - - 16. Perl, when in warning mode, gives warnings for character classes - such as [A-\d] or [a-[:digit:]]. It then treats the hyphens as liter- - als. PCRE has no warning features, so it gives an error in these cases - because they are almost certainly user mistakes. - - 17. In PCRE, the upper/lower case character properties Lu and Ll are - not affected when case-independent matching is specified. For example, - \p{Lu} always matches an upper case letter. I think Perl has changed in - this respect; in the release at the time of writing (5.16), \p{Lu} and - \p{Ll} match all letters, regardless of case, when case independence is - specified. - - 18. PCRE provides some extensions to the Perl regular expression facil- - ities. Perl 5.10 includes new features that are not in earlier ver- - sions of Perl, some of which (such as named parentheses) have been in - PCRE for some time. This list is with respect to Perl 5.10: - - (a) Although lookbehind assertions in PCRE must match fixed length - strings, each alternative branch of a lookbehind assertion can match a - different length of string. Perl requires them all to have the same - length. - - (b) If PCRE_DOLLAR_ENDONLY is set and PCRE_MULTILINE is not set, the $ - meta-character matches only at the very end of the string. - - (c) If PCRE_EXTRA is set, a backslash followed by a letter with no spe- - cial meaning is faulted. Otherwise, like Perl, the backslash is quietly - ignored. (Perl can be made to issue a warning.) - - (d) If PCRE_UNGREEDY is set, the greediness of the repetition quanti- - fiers is inverted, that is, by default they are not greedy, but if fol- - lowed by a question mark they are. - - (e) PCRE_ANCHORED can be used at matching time to force a pattern to be - tried only at the first matching position in the subject string. - - (f) The PCRE_NOTBOL, PCRE_NOTEOL, PCRE_NOTEMPTY, PCRE_NOTEMPTY_ATSTART, - and PCRE_NO_AUTO_CAPTURE options for pcre_exec() have no Perl equiva- - lents. - - (g) The \R escape sequence can be restricted to match only CR, LF, or - CRLF by the PCRE_BSR_ANYCRLF option. - - (h) The callout facility is PCRE-specific. - - (i) The partial matching facility is PCRE-specific. - - (j) Patterns compiled by PCRE can be saved and re-used at a later time, - even on different hosts that have the other endianness. However, this - does not apply to optimized data created by the just-in-time compiler. - - (k) The alternative matching functions (pcre_dfa_exec(), - pcre16_dfa_exec() and pcre32_dfa_exec(),) match in a different way and - are not Perl-compatible. - - (l) PCRE recognizes some special sequences such as (*CR) at the start - of a pattern that set overall options that cannot be changed within the - pattern. - - -AUTHOR - - Philip Hazel - University Computing Service - Cambridge CB2 3QH, England. - - -REVISION - - Last updated: 10 November 2013 - Copyright (c) 1997-2013 University of Cambridge. ------------------------------------------------------------------------------- - - -PCREPATTERN(3) Library Functions Manual PCREPATTERN(3) - - - -NAME - PCRE - Perl-compatible regular expressions - -PCRE REGULAR EXPRESSION DETAILS - - The syntax and semantics of the regular expressions that are supported - by PCRE are described in detail below. There is a quick-reference syn- - tax summary in the pcresyntax page. PCRE tries to match Perl syntax and - semantics as closely as it can. PCRE also supports some alternative - regular expression syntax (which does not conflict with the Perl syn- - tax) in order to provide some compatibility with regular expressions in - Python, .NET, and Oniguruma. - - Perl's regular expressions are described in its own documentation, and - regular expressions in general are covered in a number of books, some - of which have copious examples. Jeffrey Friedl's "Mastering Regular - Expressions", published by O'Reilly, covers regular expressions in - great detail. This description of PCRE's regular expressions is - intended as reference material. - - This document discusses the patterns that are supported by PCRE when - one its main matching functions, pcre_exec() (8-bit) or - pcre[16|32]_exec() (16- or 32-bit), is used. PCRE also has alternative - matching functions, pcre_dfa_exec() and pcre[16|32_dfa_exec(), which - match using a different algorithm that is not Perl-compatible. Some of - the features discussed below are not available when DFA matching is - used. The advantages and disadvantages of the alternative functions, - and how they differ from the normal functions, are discussed in the - pcrematching page. - - -SPECIAL START-OF-PATTERN ITEMS - - A number of options that can be passed to pcre_compile() can also be - set by special items at the start of a pattern. These are not Perl-com- - patible, but are provided to make these options accessible to pattern - writers who are not able to change the program that processes the pat- - tern. Any number of these items may appear, but they must all be - together right at the start of the pattern string, and the letters must - be in upper case. - - UTF support - - The original operation of PCRE was on strings of one-byte characters. - However, there is now also support for UTF-8 strings in the original - library, an extra library that supports 16-bit and UTF-16 character - strings, and a third library that supports 32-bit and UTF-32 character - strings. To use these features, PCRE must be built to include appropri- - ate support. When using UTF strings you must either call the compiling - function with the PCRE_UTF8, PCRE_UTF16, or PCRE_UTF32 option, or the - pattern must start with one of these special sequences: - - (*UTF8) - (*UTF16) - (*UTF32) - (*UTF) - - (*UTF) is a generic sequence that can be used with any of the - libraries. Starting a pattern with such a sequence is equivalent to - setting the relevant option. How setting a UTF mode affects pattern - matching is mentioned in several places below. There is also a summary - of features in the pcreunicode page. - - Some applications that allow their users to supply patterns may wish to - restrict them to non-UTF data for security reasons. If the - PCRE_NEVER_UTF option is set at compile time, (*UTF) etc. are not - allowed, and their appearance causes an error. - - Unicode property support - - Another special sequence that may appear at the start of a pattern is - (*UCP). This has the same effect as setting the PCRE_UCP option: it - causes sequences such as \d and \w to use Unicode properties to deter- - mine character types, instead of recognizing only characters with codes - less than 128 via a lookup table. - - Disabling auto-possessification - - If a pattern starts with (*NO_AUTO_POSSESS), it has the same effect as - setting the PCRE_NO_AUTO_POSSESS option at compile time. This stops - PCRE from making quantifiers possessive when what follows cannot match - the repeated item. For example, by default a+b is treated as a++b. For - more details, see the pcreapi documentation. - - Disabling start-up optimizations - - If a pattern starts with (*NO_START_OPT), it has the same effect as - setting the PCRE_NO_START_OPTIMIZE option either at compile or matching - time. This disables several optimizations for quickly reaching "no - match" results. For more details, see the pcreapi documentation. - - Newline conventions - - PCRE supports five different conventions for indicating line breaks in - strings: a single CR (carriage return) character, a single LF (line- - feed) character, the two-character sequence CRLF, any of the three pre- - ceding, or any Unicode newline sequence. The pcreapi page has further - discussion about newlines, and shows how to set the newline convention - in the options arguments for the compiling and matching functions. - - It is also possible to specify a newline convention by starting a pat- - tern string with one of the following five sequences: - - (*CR) carriage return - (*LF) linefeed - (*CRLF) carriage return, followed by linefeed - (*ANYCRLF) any of the three above - (*ANY) all Unicode newline sequences - - These override the default and the options given to the compiling func- - tion. For example, on a Unix system where LF is the default newline - sequence, the pattern - - (*CR)a.b - - changes the convention to CR. That pattern matches "a\nb" because LF is - no longer a newline. If more than one of these settings is present, the - last one is used. - - The newline convention affects where the circumflex and dollar asser- - tions are true. It also affects the interpretation of the dot metachar- - acter when PCRE_DOTALL is not set, and the behaviour of \N. However, it - does not affect what the \R escape sequence matches. By default, this - is any Unicode newline sequence, for Perl compatibility. However, this - can be changed; see the description of \R in the section entitled "New- - line sequences" below. A change of \R setting can be combined with a - change of newline convention. - - Setting match and recursion limits - - The caller of pcre_exec() can set a limit on the number of times the - internal match() function is called and on the maximum depth of recur- - sive calls. These facilities are provided to catch runaway matches that - are provoked by patterns with huge matching trees (a typical example is - a pattern with nested unlimited repeats) and to avoid running out of - system stack by too much recursion. When one of these limits is - reached, pcre_exec() gives an error return. The limits can also be set - by items at the start of the pattern of the form - - (*LIMIT_MATCH=d) - (*LIMIT_RECURSION=d) - - where d is any number of decimal digits. However, the value of the set- - ting must be less than the value set (or defaulted) by the caller of - pcre_exec() for it to have any effect. In other words, the pattern - writer can lower the limits set by the programmer, but not raise them. - If there is more than one setting of one of these limits, the lower - value is used. - - -EBCDIC CHARACTER CODES - - PCRE can be compiled to run in an environment that uses EBCDIC as its - character code rather than ASCII or Unicode (typically a mainframe sys- - tem). In the sections below, character code values are ASCII or Uni- - code; in an EBCDIC environment these characters may have different code - values, and there are no code points greater than 255. - - -CHARACTERS AND METACHARACTERS - - A regular expression is a pattern that is matched against a subject - string from left to right. Most characters stand for themselves in a - pattern, and match the corresponding characters in the subject. As a - trivial example, the pattern - - The quick brown fox - - matches a portion of a subject string that is identical to itself. When - caseless matching is specified (the PCRE_CASELESS option), letters are - matched independently of case. In a UTF mode, PCRE always understands - the concept of case for characters whose values are less than 128, so - caseless matching is always possible. For characters with higher val- - ues, the concept of case is supported if PCRE is compiled with Unicode - property support, but not otherwise. If you want to use caseless - matching for characters 128 and above, you must ensure that PCRE is - compiled with Unicode property support as well as with UTF support. - - The power of regular expressions comes from the ability to include - alternatives and repetitions in the pattern. These are encoded in the - pattern by the use of metacharacters, which do not stand for themselves - but instead are interpreted in some special way. - - There are two different sets of metacharacters: those that are recog- - nized anywhere in the pattern except within square brackets, and those - that are recognized within square brackets. Outside square brackets, - the metacharacters are as follows: - - \ general escape character with several uses - ^ assert start of string (or line, in multiline mode) - $ assert end of string (or line, in multiline mode) - . match any character except newline (by default) - [ start character class definition - | start of alternative branch - ( start subpattern - ) end subpattern - ? extends the meaning of ( - also 0 or 1 quantifier - also quantifier minimizer - * 0 or more quantifier - + 1 or more quantifier - also "possessive quantifier" - { start min/max quantifier - - Part of a pattern that is in square brackets is called a "character - class". In a character class the only metacharacters are: - - \ general escape character - ^ negate the class, but only if the first character - - indicates character range - [ POSIX character class (only if followed by POSIX - syntax) - ] terminates the character class - - The following sections describe the use of each of the metacharacters. - - -BACKSLASH - - The backslash character has several uses. Firstly, if it is followed by - a character that is not a number or a letter, it takes away any special - meaning that character may have. This use of backslash as an escape - character applies both inside and outside character classes. - - For example, if you want to match a * character, you write \* in the - pattern. This escaping action applies whether or not the following - character would otherwise be interpreted as a metacharacter, so it is - always safe to precede a non-alphanumeric with backslash to specify - that it stands for itself. In particular, if you want to match a back- - slash, you write \\. - - In a UTF mode, only ASCII numbers and letters have any special meaning - after a backslash. All other characters (in particular, those whose - codepoints are greater than 127) are treated as literals. - - If a pattern is compiled with the PCRE_EXTENDED option, most white - space in the pattern (other than in a character class), and characters - between a # outside a character class and the next newline, inclusive, - are ignored. An escaping backslash can be used to include a white space - or # character as part of the pattern. - - If you want to remove the special meaning from a sequence of charac- - ters, you can do so by putting them between \Q and \E. This is differ- - ent from Perl in that $ and @ are handled as literals in \Q...\E - sequences in PCRE, whereas in Perl, $ and @ cause variable interpola- - tion. Note the following examples: - - Pattern PCRE matches Perl matches - - \Qabc$xyz\E abc$xyz abc followed by the - contents of $xyz - \Qabc\$xyz\E abc\$xyz abc\$xyz - \Qabc\E\$\Qxyz\E abc$xyz abc$xyz - - The \Q...\E sequence is recognized both inside and outside character - classes. An isolated \E that is not preceded by \Q is ignored. If \Q - is not followed by \E later in the pattern, the literal interpretation - continues to the end of the pattern (that is, \E is assumed at the - end). If the isolated \Q is inside a character class, this causes an - error, because the character class is not terminated. - - Non-printing characters - - A second use of backslash provides a way of encoding non-printing char- - acters in patterns in a visible manner. There is no restriction on the - appearance of non-printing characters, apart from the binary zero that - terminates a pattern, but when a pattern is being prepared by text - editing, it is often easier to use one of the following escape - sequences than the binary character it represents. In an ASCII or Uni- - code environment, these escapes are as follows: - - \a alarm, that is, the BEL character (hex 07) - \cx "control-x", where x is any ASCII character - \e escape (hex 1B) - \f form feed (hex 0C) - \n linefeed (hex 0A) - \r carriage return (hex 0D) - \t tab (hex 09) - \0dd character with octal code 0dd - \ddd character with octal code ddd, or back reference - \o{ddd..} character with octal code ddd.. - \xhh character with hex code hh - \x{hhh..} character with hex code hhh.. (non-JavaScript mode) - \uhhhh character with hex code hhhh (JavaScript mode only) - - The precise effect of \cx on ASCII characters is as follows: if x is a - lower case letter, it is converted to upper case. Then bit 6 of the - character (hex 40) is inverted. Thus \cA to \cZ become hex 01 to hex 1A - (A is 41, Z is 5A), but \c{ becomes hex 3B ({ is 7B), and \c; becomes - hex 7B (; is 3B). If the data item (byte or 16-bit value) following \c - has a value greater than 127, a compile-time error occurs. This locks - out non-ASCII characters in all modes. - - When PCRE is compiled in EBCDIC mode, \a, \e, \f, \n, \r, and \t gener- - ate the appropriate EBCDIC code values. The \c escape is processed as - specified for Perl in the perlebcdic document. The only characters that - are allowed after \c are A-Z, a-z, or one of @, [, \, ], ^, _, or ?. - Any other character provokes a compile-time error. The sequence \c@ - encodes character code 0; after \c the letters (in either case) encode - characters 1-26 (hex 01 to hex 1A); [, \, ], ^, and _ encode characters - 27-31 (hex 1B to hex 1F), and \c? becomes either 255 (hex FF) or 95 - (hex 5F). - - Thus, apart from \c?, these escapes generate the same character code - values as they do in an ASCII environment, though the meanings of the - values mostly differ. For example, \cG always generates code value 7, - which is BEL in ASCII but DEL in EBCDIC. - - The sequence \c? generates DEL (127, hex 7F) in an ASCII environment, - but because 127 is not a control character in EBCDIC, Perl makes it - generate the APC character. Unfortunately, there are several variants - of EBCDIC. In most of them the APC character has the value 255 (hex - FF), but in the one Perl calls POSIX-BC its value is 95 (hex 5F). If - certain other characters have POSIX-BC values, PCRE makes \c? generate - 95; otherwise it generates 255. - - After \0 up to two further octal digits are read. If there are fewer - than two digits, just those that are present are used. Thus the - sequence \0\x\015 specifies two binary zeros followed by a CR character - (code value 13). Make sure you supply two digits after the initial zero - if the pattern character that follows is itself an octal digit. - - The escape \o must be followed by a sequence of octal digits, enclosed - in braces. An error occurs if this is not the case. This escape is a - recent addition to Perl; it provides way of specifying character code - points as octal numbers greater than 0777, and it also allows octal - numbers and back references to be unambiguously specified. - - For greater clarity and unambiguity, it is best to avoid following \ by - a digit greater than zero. Instead, use \o{} or \x{} to specify charac- - ter numbers, and \g{} to specify back references. The following para- - graphs describe the old, ambiguous syntax. - - The handling of a backslash followed by a digit other than 0 is compli- - cated, and Perl has changed in recent releases, causing PCRE also to - change. Outside a character class, PCRE reads the digit and any follow- - ing digits as a decimal number. If the number is less than 8, or if - there have been at least that many previous capturing left parentheses - in the expression, the entire sequence is taken as a back reference. A - description of how this works is given later, following the discussion - of parenthesized subpatterns. - - Inside a character class, or if the decimal number following \ is - greater than 7 and there have not been that many capturing subpatterns, - PCRE handles \8 and \9 as the literal characters "8" and "9", and oth- - erwise re-reads up to three octal digits following the backslash, using - them to generate a data character. Any subsequent digits stand for - themselves. For example: - - \040 is another way of writing an ASCII space - \40 is the same, provided there are fewer than 40 - previous capturing subpatterns - \7 is always a back reference - \11 might be a back reference, or another way of - writing a tab - \011 is always a tab - \0113 is a tab followed by the character "3" - \113 might be a back reference, otherwise the - character with octal code 113 - \377 might be a back reference, otherwise - the value 255 (decimal) - \81 is either a back reference, or the two - characters "8" and "1" - - Note that octal values of 100 or greater that are specified using this - syntax must not be introduced by a leading zero, because no more than - three octal digits are ever read. - - By default, after \x that is not followed by {, from zero to two hexa- - decimal digits are read (letters can be in upper or lower case). Any - number of hexadecimal digits may appear between \x{ and }. If a charac- - ter other than a hexadecimal digit appears between \x{ and }, or if - there is no terminating }, an error occurs. - - If the PCRE_JAVASCRIPT_COMPAT option is set, the interpretation of \x - is as just described only when it is followed by two hexadecimal dig- - its. Otherwise, it matches a literal "x" character. In JavaScript - mode, support for code points greater than 256 is provided by \u, which - must be followed by four hexadecimal digits; otherwise it matches a - literal "u" character. - - Characters whose value is less than 256 can be defined by either of the - two syntaxes for \x (or by \u in JavaScript mode). There is no differ- - ence in the way they are handled. For example, \xdc is exactly the same - as \x{dc} (or \u00dc in JavaScript mode). - - Constraints on character values - - Characters that are specified using octal or hexadecimal numbers are - limited to certain values, as follows: - - 8-bit non-UTF mode less than 0x100 - 8-bit UTF-8 mode less than 0x10ffff and a valid codepoint - 16-bit non-UTF mode less than 0x10000 - 16-bit UTF-16 mode less than 0x10ffff and a valid codepoint - 32-bit non-UTF mode less than 0x100000000 - 32-bit UTF-32 mode less than 0x10ffff and a valid codepoint - - Invalid Unicode codepoints are the range 0xd800 to 0xdfff (the so- - called "surrogate" codepoints), and 0xffef. - - Escape sequences in character classes - - All the sequences that define a single character value can be used both - inside and outside character classes. In addition, inside a character - class, \b is interpreted as the backspace character (hex 08). - - \N is not allowed in a character class. \B, \R, and \X are not special - inside a character class. Like other unrecognized escape sequences, - they are treated as the literal characters "B", "R", and "X" by - default, but cause an error if the PCRE_EXTRA option is set. Outside a - character class, these sequences have different meanings. - - Unsupported escape sequences - - In Perl, the sequences \l, \L, \u, and \U are recognized by its string - handler and used to modify the case of following characters. By - default, PCRE does not support these escape sequences. However, if the - PCRE_JAVASCRIPT_COMPAT option is set, \U matches a "U" character, and - \u can be used to define a character by code point, as described in the - previous section. - - Absolute and relative back references - - The sequence \g followed by an unsigned or a negative number, option- - ally enclosed in braces, is an absolute or relative back reference. A - named back reference can be coded as \g{name}. Back references are dis- - cussed later, following the discussion of parenthesized subpatterns. - - Absolute and relative subroutine calls - - For compatibility with Oniguruma, the non-Perl syntax \g followed by a - name or a number enclosed either in angle brackets or single quotes, is - an alternative syntax for referencing a subpattern as a "subroutine". - Details are discussed later. Note that \g{...} (Perl syntax) and - \g<...> (Oniguruma syntax) are not synonymous. The former is a back - reference; the latter is a subroutine call. - - Generic character types - - Another use of backslash is for specifying generic character types: - - \d any decimal digit - \D any character that is not a decimal digit - \h any horizontal white space character - \H any character that is not a horizontal white space character - \s any white space character - \S any character that is not a white space character - \v any vertical white space character - \V any character that is not a vertical white space character - \w any "word" character - \W any "non-word" character - - There is also the single sequence \N, which matches a non-newline char- - acter. This is the same as the "." metacharacter when PCRE_DOTALL is - not set. Perl also uses \N to match characters by name; PCRE does not - support this. - - Each pair of lower and upper case escape sequences partitions the com- - plete set of characters into two disjoint sets. Any given character - matches one, and only one, of each pair. The sequences can appear both - inside and outside character classes. They each match one character of - the appropriate type. If the current matching point is at the end of - the subject string, all of them fail, because there is no character to - match. - - For compatibility with Perl, \s did not used to match the VT character - (code 11), which made it different from the the POSIX "space" class. - However, Perl added VT at release 5.18, and PCRE followed suit at - release 8.34. The default \s characters are now HT (9), LF (10), VT - (11), FF (12), CR (13), and space (32), which are defined as white - space in the "C" locale. This list may vary if locale-specific matching - is taking place. For example, in some locales the "non-breaking space" - character (\xA0) is recognized as white space, and in others the VT - character is not. - - A "word" character is an underscore or any character that is a letter - or digit. By default, the definition of letters and digits is con- - trolled by PCRE's low-valued character tables, and may vary if locale- - specific matching is taking place (see "Locale support" in the pcreapi - page). For example, in a French locale such as "fr_FR" in Unix-like - systems, or "french" in Windows, some character codes greater than 127 - are used for accented letters, and these are then matched by \w. The - use of locales with Unicode is discouraged. - - By default, characters whose code points are greater than 127 never - match \d, \s, or \w, and always match \D, \S, and \W, although this may - vary for characters in the range 128-255 when locale-specific matching - is happening. These escape sequences retain their original meanings - from before Unicode support was available, mainly for efficiency rea- - sons. If PCRE is compiled with Unicode property support, and the - PCRE_UCP option is set, the behaviour is changed so that Unicode prop- - erties are used to determine character types, as follows: - - \d any character that matches \p{Nd} (decimal digit) - \s any character that matches \p{Z} or \h or \v - \w any character that matches \p{L} or \p{N}, plus underscore - - The upper case escapes match the inverse sets of characters. Note that - \d matches only decimal digits, whereas \w matches any Unicode digit, - as well as any Unicode letter, and underscore. Note also that PCRE_UCP - affects \b, and \B because they are defined in terms of \w and \W. - Matching these sequences is noticeably slower when PCRE_UCP is set. - - The sequences \h, \H, \v, and \V are features that were added to Perl - at release 5.10. In contrast to the other sequences, which match only - ASCII characters by default, these always match certain high-valued - code points, whether or not PCRE_UCP is set. The horizontal space char- - acters are: - - U+0009 Horizontal tab (HT) - U+0020 Space - U+00A0 Non-break space - U+1680 Ogham space mark - U+180E Mongolian vowel separator - U+2000 En quad - U+2001 Em quad - U+2002 En space - U+2003 Em space - U+2004 Three-per-em space - U+2005 Four-per-em space - U+2006 Six-per-em space - U+2007 Figure space - U+2008 Punctuation space - U+2009 Thin space - U+200A Hair space - U+202F Narrow no-break space - U+205F Medium mathematical space - U+3000 Ideographic space - - The vertical space characters are: - - U+000A Linefeed (LF) - U+000B Vertical tab (VT) - U+000C Form feed (FF) - U+000D Carriage return (CR) - U+0085 Next line (NEL) - U+2028 Line separator - U+2029 Paragraph separator - - In 8-bit, non-UTF-8 mode, only the characters with codepoints less than - 256 are relevant. - - Newline sequences - - Outside a character class, by default, the escape sequence \R matches - any Unicode newline sequence. In 8-bit non-UTF-8 mode \R is equivalent - to the following: - - (?>\r\n|\n|\x0b|\f|\r|\x85) - - This is an example of an "atomic group", details of which are given - below. This particular group matches either the two-character sequence - CR followed by LF, or one of the single characters LF (linefeed, - U+000A), VT (vertical tab, U+000B), FF (form feed, U+000C), CR (car- - riage return, U+000D), or NEL (next line, U+0085). The two-character - sequence is treated as a single unit that cannot be split. - - In other modes, two additional characters whose codepoints are greater - than 255 are added: LS (line separator, U+2028) and PS (paragraph sepa- - rator, U+2029). Unicode character property support is not needed for - these characters to be recognized. - - It is possible to restrict \R to match only CR, LF, or CRLF (instead of - the complete set of Unicode line endings) by setting the option - PCRE_BSR_ANYCRLF either at compile time or when the pattern is matched. - (BSR is an abbrevation for "backslash R".) This can be made the default - when PCRE is built; if this is the case, the other behaviour can be - requested via the PCRE_BSR_UNICODE option. It is also possible to - specify these settings by starting a pattern string with one of the - following sequences: - - (*BSR_ANYCRLF) CR, LF, or CRLF only - (*BSR_UNICODE) any Unicode newline sequence - - These override the default and the options given to the compiling func- - tion, but they can themselves be overridden by options given to a - matching function. Note that these special settings, which are not - Perl-compatible, are recognized only at the very start of a pattern, - and that they must be in upper case. If more than one of them is - present, the last one is used. They can be combined with a change of - newline convention; for example, a pattern can start with: - - (*ANY)(*BSR_ANYCRLF) - - They can also be combined with the (*UTF8), (*UTF16), (*UTF32), (*UTF) - or (*UCP) special sequences. Inside a character class, \R is treated as - an unrecognized escape sequence, and so matches the letter "R" by - default, but causes an error if PCRE_EXTRA is set. - - Unicode character properties - - When PCRE is built with Unicode character property support, three addi- - tional escape sequences that match characters with specific properties - are available. When in 8-bit non-UTF-8 mode, these sequences are of - course limited to testing characters whose codepoints are less than - 256, but they do work in this mode. The extra escape sequences are: - - \p{xx} a character with the xx property - \P{xx} a character without the xx property - \X a Unicode extended grapheme cluster - - The property names represented by xx above are limited to the Unicode - script names, the general category properties, "Any", which matches any - character (including newline), and some special PCRE properties - (described in the next section). Other Perl properties such as "InMu- - sicalSymbols" are not currently supported by PCRE. Note that \P{Any} - does not match any characters, so always causes a match failure. - - Sets of Unicode characters are defined as belonging to certain scripts. - A character from one of these sets can be matched using a script name. - For example: - - \p{Greek} - \P{Han} - - Those that are not part of an identified script are lumped together as - "Common". The current list of scripts is: - - Arabic, Armenian, Avestan, Balinese, Bamum, Bassa_Vah, Batak, Bengali, - Bopomofo, Brahmi, Braille, Buginese, Buhid, Canadian_Aboriginal, Car- - ian, Caucasian_Albanian, Chakma, Cham, Cherokee, Common, Coptic, Cunei- - form, Cypriot, Cyrillic, Deseret, Devanagari, Duployan, Egyptian_Hiero- - glyphs, Elbasan, Ethiopic, Georgian, Glagolitic, Gothic, Grantha, - Greek, Gujarati, Gurmukhi, Han, Hangul, Hanunoo, Hebrew, Hiragana, - Imperial_Aramaic, Inherited, Inscriptional_Pahlavi, Inscrip- - tional_Parthian, Javanese, Kaithi, Kannada, Katakana, Kayah_Li, - Kharoshthi, Khmer, Khojki, Khudawadi, Lao, Latin, Lepcha, Limbu, Lin- - ear_A, Linear_B, Lisu, Lycian, Lydian, Mahajani, Malayalam, Mandaic, - Manichaean, Meetei_Mayek, Mende_Kikakui, Meroitic_Cursive, - Meroitic_Hieroglyphs, Miao, Modi, Mongolian, Mro, Myanmar, Nabataean, - New_Tai_Lue, Nko, Ogham, Ol_Chiki, Old_Italic, Old_North_Arabian, - Old_Permic, Old_Persian, Old_South_Arabian, Old_Turkic, Oriya, Osmanya, - Pahawh_Hmong, Palmyrene, Pau_Cin_Hau, Phags_Pa, Phoenician, - Psalter_Pahlavi, Rejang, Runic, Samaritan, Saurashtra, Sharada, Sha- - vian, Siddham, Sinhala, Sora_Sompeng, Sundanese, Syloti_Nagri, Syriac, - Tagalog, Tagbanwa, Tai_Le, Tai_Tham, Tai_Viet, Takri, Tamil, Telugu, - Thaana, Thai, Tibetan, Tifinagh, Tirhuta, Ugaritic, Vai, Warang_Citi, - Yi. - - Each character has exactly one Unicode general category property, spec- - ified by a two-letter abbreviation. For compatibility with Perl, nega- - tion can be specified by including a circumflex between the opening - brace and the property name. For example, \p{^Lu} is the same as - \P{Lu}. - - If only one letter is specified with \p or \P, it includes all the gen- - eral category properties that start with that letter. In this case, in - the absence of negation, the curly brackets in the escape sequence are - optional; these two examples have the same effect: - - \p{L} - \pL - - The following general category property codes are supported: - - C Other - Cc Control - Cf Format - Cn Unassigned - Co Private use - Cs Surrogate - - L Letter - Ll Lower case letter - Lm Modifier letter - Lo Other letter - Lt Title case letter - Lu Upper case letter - - M Mark - Mc Spacing mark - Me Enclosing mark - Mn Non-spacing mark - - N Number - Nd Decimal number - Nl Letter number - No Other number - - P Punctuation - Pc Connector punctuation - Pd Dash punctuation - Pe Close punctuation - Pf Final punctuation - Pi Initial punctuation - Po Other punctuation - Ps Open punctuation - - S Symbol - Sc Currency symbol - Sk Modifier symbol - Sm Mathematical symbol - So Other symbol - - Z Separator - Zl Line separator - Zp Paragraph separator - Zs Space separator - - The special property L& is also supported: it matches a character that - has the Lu, Ll, or Lt property, in other words, a letter that is not - classified as a modifier or "other". - - The Cs (Surrogate) property applies only to characters in the range - U+D800 to U+DFFF. Such characters are not valid in Unicode strings and - so cannot be tested by PCRE, unless UTF validity checking has been - turned off (see the discussion of PCRE_NO_UTF8_CHECK, - PCRE_NO_UTF16_CHECK and PCRE_NO_UTF32_CHECK in the pcreapi page). Perl - does not support the Cs property. - - The long synonyms for property names that Perl supports (such as - \p{Letter}) are not supported by PCRE, nor is it permitted to prefix - any of these properties with "Is". - - No character that is in the Unicode table has the Cn (unassigned) prop- - erty. Instead, this property is assumed for any code point that is not - in the Unicode table. - - Specifying caseless matching does not affect these escape sequences. - For example, \p{Lu} always matches only upper case letters. This is - different from the behaviour of current versions of Perl. - - Matching characters by Unicode property is not fast, because PCRE has - to do a multistage table lookup in order to find a character's prop- - erty. That is why the traditional escape sequences such as \d and \w do - not use Unicode properties in PCRE by default, though you can make them - do so by setting the PCRE_UCP option or by starting the pattern with - (*UCP). - - Extended grapheme clusters - - The \X escape matches any number of Unicode characters that form an - "extended grapheme cluster", and treats the sequence as an atomic group - (see below). Up to and including release 8.31, PCRE matched an ear- - lier, simpler definition that was equivalent to - - (?>\PM\pM*) - - That is, it matched a character without the "mark" property, followed - by zero or more characters with the "mark" property. Characters with - the "mark" property are typically non-spacing accents that affect the - preceding character. - - This simple definition was extended in Unicode to include more compli- - cated kinds of composite character by giving each character a grapheme - breaking property, and creating rules that use these properties to - define the boundaries of extended grapheme clusters. In releases of - PCRE later than 8.31, \X matches one of these clusters. - - \X always matches at least one character. Then it decides whether to - add additional characters according to the following rules for ending a - cluster: - - 1. End at the end of the subject string. - - 2. Do not end between CR and LF; otherwise end after any control char- - acter. - - 3. Do not break Hangul (a Korean script) syllable sequences. Hangul - characters are of five types: L, V, T, LV, and LVT. An L character may - be followed by an L, V, LV, or LVT character; an LV or V character may - be followed by a V or T character; an LVT or T character may be follwed - only by a T character. - - 4. Do not end before extending characters or spacing marks. Characters - with the "mark" property always have the "extend" grapheme breaking - property. - - 5. Do not end after prepend characters. - - 6. Otherwise, end the cluster. - - PCRE's additional properties - - As well as the standard Unicode properties described above, PCRE sup- - ports four more that make it possible to convert traditional escape - sequences such as \w and \s to use Unicode properties. PCRE uses these - non-standard, non-Perl properties internally when PCRE_UCP is set. How- - ever, they may also be used explicitly. These properties are: - - Xan Any alphanumeric character - Xps Any POSIX space character - Xsp Any Perl space character - Xwd Any Perl "word" character - - Xan matches characters that have either the L (letter) or the N (num- - ber) property. Xps matches the characters tab, linefeed, vertical tab, - form feed, or carriage return, and any other character that has the Z - (separator) property. Xsp is the same as Xps; it used to exclude ver- - tical tab, for Perl compatibility, but Perl changed, and so PCRE fol- - lowed at release 8.34. Xwd matches the same characters as Xan, plus - underscore. - - There is another non-standard property, Xuc, which matches any charac- - ter that can be represented by a Universal Character Name in C++ and - other programming languages. These are the characters $, @, ` (grave - accent), and all characters with Unicode code points greater than or - equal to U+00A0, except for the surrogates U+D800 to U+DFFF. Note that - most base (ASCII) characters are excluded. (Universal Character Names - are of the form \uHHHH or \UHHHHHHHH where H is a hexadecimal digit. - Note that the Xuc property does not match these sequences but the char- - acters that they represent.) - - Resetting the match start - - The escape sequence \K causes any previously matched characters not to - be included in the final matched sequence. For example, the pattern: - - foo\Kbar - - matches "foobar", but reports that it has matched "bar". This feature - is similar to a lookbehind assertion (described below). However, in - this case, the part of the subject before the real match does not have - to be of fixed length, as lookbehind assertions do. The use of \K does - not interfere with the setting of captured substrings. For example, - when the pattern - - (foo)\Kbar - - matches "foobar", the first substring is still set to "foo". - - Perl documents that the use of \K within assertions is "not well - defined". In PCRE, \K is acted upon when it occurs inside positive - assertions, but is ignored in negative assertions. Note that when a - pattern such as (?=ab\K) matches, the reported start of the match can - be greater than the end of the match. - - Simple assertions - - The final use of backslash is for certain simple assertions. An asser- - tion specifies a condition that has to be met at a particular point in - a match, without consuming any characters from the subject string. The - use of subpatterns for more complicated assertions is described below. - The backslashed assertions are: - - \b matches at a word boundary - \B matches when not at a word boundary - \A matches at the start of the subject - \Z matches at the end of the subject - also matches before a newline at the end of the subject - \z matches only at the end of the subject - \G matches at the first matching position in the subject - - Inside a character class, \b has a different meaning; it matches the - backspace character. If any other of these assertions appears in a - character class, by default it matches the corresponding literal char- - acter (for example, \B matches the letter B). However, if the - PCRE_EXTRA option is set, an "invalid escape sequence" error is gener- - ated instead. - - A word boundary is a position in the subject string where the current - character and the previous character do not both match \w or \W (i.e. - one matches \w and the other matches \W), or the start or end of the - string if the first or last character matches \w, respectively. In a - UTF mode, the meanings of \w and \W can be changed by setting the - PCRE_UCP option. When this is done, it also affects \b and \B. Neither - PCRE nor Perl has a separate "start of word" or "end of word" metase- - quence. However, whatever follows \b normally determines which it is. - For example, the fragment \ba matches "a" at the start of a word. - - The \A, \Z, and \z assertions differ from the traditional circumflex - and dollar (described in the next section) in that they only ever match - at the very start and end of the subject string, whatever options are - set. Thus, they are independent of multiline mode. These three asser- - tions are not affected by the PCRE_NOTBOL or PCRE_NOTEOL options, which - affect only the behaviour of the circumflex and dollar metacharacters. - However, if the startoffset argument of pcre_exec() is non-zero, indi- - cating that matching is to start at a point other than the beginning of - the subject, \A can never match. The difference between \Z and \z is - that \Z matches before a newline at the end of the string as well as at - the very end, whereas \z matches only at the end. - - The \G assertion is true only when the current matching position is at - the start point of the match, as specified by the startoffset argument - of pcre_exec(). It differs from \A when the value of startoffset is - non-zero. By calling pcre_exec() multiple times with appropriate argu- - ments, you can mimic Perl's /g option, and it is in this kind of imple- - mentation where \G can be useful. - - Note, however, that PCRE's interpretation of \G, as the start of the - current match, is subtly different from Perl's, which defines it as the - end of the previous match. In Perl, these can be different when the - previously matched string was empty. Because PCRE does just one match - at a time, it cannot reproduce this behaviour. - - If all the alternatives of a pattern begin with \G, the expression is - anchored to the starting match position, and the "anchored" flag is set - in the compiled regular expression. - - -CIRCUMFLEX AND DOLLAR - - The circumflex and dollar metacharacters are zero-width assertions. - That is, they test for a particular condition being true without con- - suming any characters from the subject string. - - Outside a character class, in the default matching mode, the circumflex - character is an assertion that is true only if the current matching - point is at the start of the subject string. If the startoffset argu- - ment of pcre_exec() is non-zero, circumflex can never match if the - PCRE_MULTILINE option is unset. Inside a character class, circumflex - has an entirely different meaning (see below). - - Circumflex need not be the first character of the pattern if a number - of alternatives are involved, but it should be the first thing in each - alternative in which it appears if the pattern is ever to match that - branch. If all possible alternatives start with a circumflex, that is, - if the pattern is constrained to match only at the start of the sub- - ject, it is said to be an "anchored" pattern. (There are also other - constructs that can cause a pattern to be anchored.) - - The dollar character is an assertion that is true only if the current - matching point is at the end of the subject string, or immediately - before a newline at the end of the string (by default). Note, however, - that it does not actually match the newline. Dollar need not be the - last character of the pattern if a number of alternatives are involved, - but it should be the last item in any branch in which it appears. Dol- - lar has no special meaning in a character class. - - The meaning of dollar can be changed so that it matches only at the - very end of the string, by setting the PCRE_DOLLAR_ENDONLY option at - compile time. This does not affect the \Z assertion. - - The meanings of the circumflex and dollar characters are changed if the - PCRE_MULTILINE option is set. When this is the case, a circumflex - matches immediately after internal newlines as well as at the start of - the subject string. It does not match after a newline that ends the - string. A dollar matches before any newlines in the string, as well as - at the very end, when PCRE_MULTILINE is set. When newline is specified - as the two-character sequence CRLF, isolated CR and LF characters do - not indicate newlines. - - For example, the pattern /^abc$/ matches the subject string "def\nabc" - (where \n represents a newline) in multiline mode, but not otherwise. - Consequently, patterns that are anchored in single line mode because - all branches start with ^ are not anchored in multiline mode, and a - match for circumflex is possible when the startoffset argument of - pcre_exec() is non-zero. The PCRE_DOLLAR_ENDONLY option is ignored if - PCRE_MULTILINE is set. - - Note that the sequences \A, \Z, and \z can be used to match the start - and end of the subject in both modes, and if all branches of a pattern - start with \A it is always anchored, whether or not PCRE_MULTILINE is - set. - - -FULL STOP (PERIOD, DOT) AND \N - - Outside a character class, a dot in the pattern matches any one charac- - ter in the subject string except (by default) a character that signi- - fies the end of a line. - - When a line ending is defined as a single character, dot never matches - that character; when the two-character sequence CRLF is used, dot does - not match CR if it is immediately followed by LF, but otherwise it - matches all characters (including isolated CRs and LFs). When any Uni- - code line endings are being recognized, dot does not match CR or LF or - any of the other line ending characters. - - The behaviour of dot with regard to newlines can be changed. If the - PCRE_DOTALL option is set, a dot matches any one character, without - exception. If the two-character sequence CRLF is present in the subject - string, it takes two dots to match it. - - The handling of dot is entirely independent of the handling of circum- - flex and dollar, the only relationship being that they both involve - newlines. Dot has no special meaning in a character class. - - The escape sequence \N behaves like a dot, except that it is not - affected by the PCRE_DOTALL option. In other words, it matches any - character except one that signifies the end of a line. Perl also uses - \N to match characters by name; PCRE does not support this. - - -MATCHING A SINGLE DATA UNIT - - Outside a character class, the escape sequence \C matches any one data - unit, whether or not a UTF mode is set. In the 8-bit library, one data - unit is one byte; in the 16-bit library it is a 16-bit unit; in the - 32-bit library it is a 32-bit unit. Unlike a dot, \C always matches - line-ending characters. The feature is provided in Perl in order to - match individual bytes in UTF-8 mode, but it is unclear how it can use- - fully be used. Because \C breaks up characters into individual data - units, matching one unit with \C in a UTF mode means that the rest of - the string may start with a malformed UTF character. This has undefined - results, because PCRE assumes that it is dealing with valid UTF strings - (and by default it checks this at the start of processing unless the - PCRE_NO_UTF8_CHECK, PCRE_NO_UTF16_CHECK or PCRE_NO_UTF32_CHECK option - is used). - - PCRE does not allow \C to appear in lookbehind assertions (described - below) in a UTF mode, because this would make it impossible to calcu- - late the length of the lookbehind. - - In general, the \C escape sequence is best avoided. However, one way of - using it that avoids the problem of malformed UTF characters is to use - a lookahead to check the length of the next character, as in this pat- - tern, which could be used with a UTF-8 string (ignore white space and - line breaks): - - (?| (?=[\x00-\x7f])(\C) | - (?=[\x80-\x{7ff}])(\C)(\C) | - (?=[\x{800}-\x{ffff}])(\C)(\C)(\C) | - (?=[\x{10000}-\x{1fffff}])(\C)(\C)(\C)(\C)) - - A group that starts with (?| resets the capturing parentheses numbers - in each alternative (see "Duplicate Subpattern Numbers" below). The - assertions at the start of each branch check the next UTF-8 character - for values whose encoding uses 1, 2, 3, or 4 bytes, respectively. The - character's individual bytes are then captured by the appropriate num- - ber of groups. - - -SQUARE BRACKETS AND CHARACTER CLASSES - - An opening square bracket introduces a character class, terminated by a - closing square bracket. A closing square bracket on its own is not spe- - cial by default. However, if the PCRE_JAVASCRIPT_COMPAT option is set, - a lone closing square bracket causes a compile-time error. If a closing - square bracket is required as a member of the class, it should be the - first data character in the class (after an initial circumflex, if - present) or escaped with a backslash. - - A character class matches a single character in the subject. In a UTF - mode, the character may be more than one data unit long. A matched - character must be in the set of characters defined by the class, unless - the first character in the class definition is a circumflex, in which - case the subject character must not be in the set defined by the class. - If a circumflex is actually required as a member of the class, ensure - it is not the first character, or escape it with a backslash. - - For example, the character class [aeiou] matches any lower case vowel, - while [^aeiou] matches any character that is not a lower case vowel. - Note that a circumflex is just a convenient notation for specifying the - characters that are in the class by enumerating those that are not. A - class that starts with a circumflex is not an assertion; it still con- - sumes a character from the subject string, and therefore it fails if - the current pointer is at the end of the string. - - In UTF-8 (UTF-16, UTF-32) mode, characters with values greater than 255 - (0xffff) can be included in a class as a literal string of data units, - or by using the \x{ escaping mechanism. - - When caseless matching is set, any letters in a class represent both - their upper case and lower case versions, so for example, a caseless - [aeiou] matches "A" as well as "a", and a caseless [^aeiou] does not - match "A", whereas a caseful version would. In a UTF mode, PCRE always - understands the concept of case for characters whose values are less - than 128, so caseless matching is always possible. For characters with - higher values, the concept of case is supported if PCRE is compiled - with Unicode property support, but not otherwise. If you want to use - caseless matching in a UTF mode for characters 128 and above, you must - ensure that PCRE is compiled with Unicode property support as well as - with UTF support. - - Characters that might indicate line breaks are never treated in any - special way when matching character classes, whatever line-ending - sequence is in use, and whatever setting of the PCRE_DOTALL and - PCRE_MULTILINE options is used. A class such as [^a] always matches one - of these characters. - - The minus (hyphen) character can be used to specify a range of charac- - ters in a character class. For example, [d-m] matches any letter - between d and m, inclusive. If a minus character is required in a - class, it must be escaped with a backslash or appear in a position - where it cannot be interpreted as indicating a range, typically as the - first or last character in the class, or immediately after a range. For - example, [b-d-z] matches letters in the range b to d, a hyphen charac- - ter, or z. - - It is not possible to have the literal character "]" as the end charac- - ter of a range. A pattern such as [W-]46] is interpreted as a class of - two characters ("W" and "-") followed by a literal string "46]", so it - would match "W46]" or "-46]". However, if the "]" is escaped with a - backslash it is interpreted as the end of range, so [W-\]46] is inter- - preted as a class containing a range followed by two other characters. - The octal or hexadecimal representation of "]" can also be used to end - a range. - - An error is generated if a POSIX character class (see below) or an - escape sequence other than one that defines a single character appears - at a point where a range ending character is expected. For example, - [z-\xff] is valid, but [A-\d] and [A-[:digit:]] are not. - - Ranges operate in the collating sequence of character values. They can - also be used for characters specified numerically, for example - [\000-\037]. Ranges can include any characters that are valid for the - current mode. - - If a range that includes letters is used when caseless matching is set, - it matches the letters in either case. For example, [W-c] is equivalent - to [][\\^_`wxyzabc], matched caselessly, and in a non-UTF mode, if - character tables for a French locale are in use, [\xc8-\xcb] matches - accented E characters in both cases. In UTF modes, PCRE supports the - concept of case for characters with values greater than 128 only when - it is compiled with Unicode property support. - - The character escape sequences \d, \D, \h, \H, \p, \P, \s, \S, \v, \V, - \w, and \W may appear in a character class, and add the characters that - they match to the class. For example, [\dABCDEF] matches any hexadeci- - mal digit. In UTF modes, the PCRE_UCP option affects the meanings of - \d, \s, \w and their upper case partners, just as it does when they - appear outside a character class, as described in the section entitled - "Generic character types" above. The escape sequence \b has a different - meaning inside a character class; it matches the backspace character. - The sequences \B, \N, \R, and \X are not special inside a character - class. Like any other unrecognized escape sequences, they are treated - as the literal characters "B", "N", "R", and "X" by default, but cause - an error if the PCRE_EXTRA option is set. - - A circumflex can conveniently be used with the upper case character - types to specify a more restricted set of characters than the matching - lower case type. For example, the class [^\W_] matches any letter or - digit, but not underscore, whereas [\w] includes underscore. A positive - character class should be read as "something OR something OR ..." and a - negative class as "NOT something AND NOT something AND NOT ...". - - The only metacharacters that are recognized in character classes are - backslash, hyphen (only where it can be interpreted as specifying a - range), circumflex (only at the start), opening square bracket (only - when it can be interpreted as introducing a POSIX class name, or for a - special compatibility feature - see the next two sections), and the - terminating closing square bracket. However, escaping other non- - alphanumeric characters does no harm. - - -POSIX CHARACTER CLASSES - - Perl supports the POSIX notation for character classes. This uses names - enclosed by [: and :] within the enclosing square brackets. PCRE also - supports this notation. For example, - - [01[:alpha:]%] - - matches "0", "1", any alphabetic character, or "%". The supported class - names are: - - alnum letters and digits - alpha letters - ascii character codes 0 - 127 - blank space or tab only - cntrl control characters - digit decimal digits (same as \d) - graph printing characters, excluding space - lower lower case letters - print printing characters, including space - punct printing characters, excluding letters and digits and space - space white space (the same as \s from PCRE 8.34) - upper upper case letters - word "word" characters (same as \w) - xdigit hexadecimal digits - - The default "space" characters are HT (9), LF (10), VT (11), FF (12), - CR (13), and space (32). If locale-specific matching is taking place, - the list of space characters may be different; there may be fewer or - more of them. "Space" used to be different to \s, which did not include - VT, for Perl compatibility. However, Perl changed at release 5.18, and - PCRE followed at release 8.34. "Space" and \s now match the same set - of characters. - - The name "word" is a Perl extension, and "blank" is a GNU extension - from Perl 5.8. Another Perl extension is negation, which is indicated - by a ^ character after the colon. For example, - - [12[:^digit:]] - - matches "1", "2", or any non-digit. PCRE (and Perl) also recognize the - POSIX syntax [.ch.] and [=ch=] where "ch" is a "collating element", but - these are not supported, and an error is given if they are encountered. - - By default, characters with values greater than 128 do not match any of - the POSIX character classes. However, if the PCRE_UCP option is passed - to pcre_compile(), some of the classes are changed so that Unicode - character properties are used. This is achieved by replacing certain - POSIX classes by other sequences, as follows: - - [:alnum:] becomes \p{Xan} - [:alpha:] becomes \p{L} - [:blank:] becomes \h - [:digit:] becomes \p{Nd} - [:lower:] becomes \p{Ll} - [:space:] becomes \p{Xps} - [:upper:] becomes \p{Lu} - [:word:] becomes \p{Xwd} - - Negated versions, such as [:^alpha:] use \P instead of \p. Three other - POSIX classes are handled specially in UCP mode: - - [:graph:] This matches characters that have glyphs that mark the page - when printed. In Unicode property terms, it matches all char- - acters with the L, M, N, P, S, or Cf properties, except for: - - U+061C Arabic Letter Mark - U+180E Mongolian Vowel Separator - U+2066 - U+2069 Various "isolate"s - - - [:print:] This matches the same characters as [:graph:] plus space - characters that are not controls, that is, characters with - the Zs property. - - [:punct:] This matches all characters that have the Unicode P (punctua- - tion) property, plus those characters whose code points are - less than 128 that have the S (Symbol) property. - - The other POSIX classes are unchanged, and match only characters with - code points less than 128. - - -COMPATIBILITY FEATURE FOR WORD BOUNDARIES - - In the POSIX.2 compliant library that was included in 4.4BSD Unix, the - ugly syntax [[:<:]] and [[:>:]] is used for matching "start of word" - and "end of word". PCRE treats these items as follows: - - [[:<:]] is converted to \b(?=\w) - [[:>:]] is converted to \b(?<=\w) - - Only these exact character sequences are recognized. A sequence such as - [a[:<:]b] provokes error for an unrecognized POSIX class name. This - support is not compatible with Perl. It is provided to help migrations - from other environments, and is best not used in any new patterns. Note - that \b matches at the start and the end of a word (see "Simple asser- - tions" above), and in a Perl-style pattern the preceding or following - character normally shows which is wanted, without the need for the - assertions that are used above in order to give exactly the POSIX be- - haviour. - - -VERTICAL BAR - - Vertical bar characters are used to separate alternative patterns. For - example, the pattern - - gilbert|sullivan - - matches either "gilbert" or "sullivan". Any number of alternatives may - appear, and an empty alternative is permitted (matching the empty - string). The matching process tries each alternative in turn, from left - to right, and the first one that succeeds is used. If the alternatives - are within a subpattern (defined below), "succeeds" means matching the - rest of the main pattern as well as the alternative in the subpattern. - - -INTERNAL OPTION SETTING - - The settings of the PCRE_CASELESS, PCRE_MULTILINE, PCRE_DOTALL, and - PCRE_EXTENDED options (which are Perl-compatible) can be changed from - within the pattern by a sequence of Perl option letters enclosed - between "(?" and ")". The option letters are - - i for PCRE_CASELESS - m for PCRE_MULTILINE - s for PCRE_DOTALL - x for PCRE_EXTENDED - - For example, (?im) sets caseless, multiline matching. It is also possi- - ble to unset these options by preceding the letter with a hyphen, and a - combined setting and unsetting such as (?im-sx), which sets PCRE_CASE- - LESS and PCRE_MULTILINE while unsetting PCRE_DOTALL and PCRE_EXTENDED, - is also permitted. If a letter appears both before and after the - hyphen, the option is unset. - - The PCRE-specific options PCRE_DUPNAMES, PCRE_UNGREEDY, and PCRE_EXTRA - can be changed in the same way as the Perl-compatible options by using - the characters J, U and X respectively. - - When one of these option changes occurs at top level (that is, not - inside subpattern parentheses), the change applies to the remainder of - the pattern that follows. An option change within a subpattern (see - below for a description of subpatterns) affects only that part of the - subpattern that follows it, so - - (a(?i)b)c - - matches abc and aBc and no other strings (assuming PCRE_CASELESS is not - used). By this means, options can be made to have different settings - in different parts of the pattern. Any changes made in one alternative - do carry on into subsequent branches within the same subpattern. For - example, - - (a(?i)b|c) - - matches "ab", "aB", "c", and "C", even though when matching "C" the - first branch is abandoned before the option setting. This is because - the effects of option settings happen at compile time. There would be - some very weird behaviour otherwise. - - Note: There are other PCRE-specific options that can be set by the - application when the compiling or matching functions are called. In - some cases the pattern can contain special leading sequences such as - (*CRLF) to override what the application has set or what has been - defaulted. Details are given in the section entitled "Newline - sequences" above. There are also the (*UTF8), (*UTF16),(*UTF32), and - (*UCP) leading sequences that can be used to set UTF and Unicode prop- - erty modes; they are equivalent to setting the PCRE_UTF8, PCRE_UTF16, - PCRE_UTF32 and the PCRE_UCP options, respectively. The (*UTF) sequence - is a generic version that can be used with any of the libraries. How- - ever, the application can set the PCRE_NEVER_UTF option, which locks - out the use of the (*UTF) sequences. - - -SUBPATTERNS - - Subpatterns are delimited by parentheses (round brackets), which can be - nested. Turning part of a pattern into a subpattern does two things: - - 1. It localizes a set of alternatives. For example, the pattern - - cat(aract|erpillar|) - - matches "cataract", "caterpillar", or "cat". Without the parentheses, - it would match "cataract", "erpillar" or an empty string. - - 2. It sets up the subpattern as a capturing subpattern. This means - that, when the whole pattern matches, that portion of the subject - string that matched the subpattern is passed back to the caller via the - ovector argument of the matching function. (This applies only to the - traditional matching functions; the DFA matching functions do not sup- - port capturing.) - - Opening parentheses are counted from left to right (starting from 1) to - obtain numbers for the capturing subpatterns. For example, if the - string "the red king" is matched against the pattern - - the ((red|white) (king|queen)) - - the captured substrings are "red king", "red", and "king", and are num- - bered 1, 2, and 3, respectively. - - The fact that plain parentheses fulfil two functions is not always - helpful. There are often times when a grouping subpattern is required - without a capturing requirement. If an opening parenthesis is followed - by a question mark and a colon, the subpattern does not do any captur- - ing, and is not counted when computing the number of any subsequent - capturing subpatterns. For example, if the string "the white queen" is - matched against the pattern - - the ((?:red|white) (king|queen)) - - the captured substrings are "white queen" and "queen", and are numbered - 1 and 2. The maximum number of capturing subpatterns is 65535. - - As a convenient shorthand, if any option settings are required at the - start of a non-capturing subpattern, the option letters may appear - between the "?" and the ":". Thus the two patterns - - (?i:saturday|sunday) - (?:(?i)saturday|sunday) - - match exactly the same set of strings. Because alternative branches are - tried from left to right, and options are not reset until the end of - the subpattern is reached, an option setting in one branch does affect - subsequent branches, so the above patterns match "SUNDAY" as well as - "Saturday". - - -DUPLICATE SUBPATTERN NUMBERS - - Perl 5.10 introduced a feature whereby each alternative in a subpattern - uses the same numbers for its capturing parentheses. Such a subpattern - starts with (?| and is itself a non-capturing subpattern. For example, - consider this pattern: - - (?|(Sat)ur|(Sun))day - - Because the two alternatives are inside a (?| group, both sets of cap- - turing parentheses are numbered one. Thus, when the pattern matches, - you can look at captured substring number one, whichever alternative - matched. This construct is useful when you want to capture part, but - not all, of one of a number of alternatives. Inside a (?| group, paren- - theses are numbered as usual, but the number is reset at the start of - each branch. The numbers of any capturing parentheses that follow the - subpattern start after the highest number used in any branch. The fol- - lowing example is taken from the Perl documentation. The numbers under- - neath show in which buffer the captured content will be stored. - - # before ---------------branch-reset----------- after - / ( a ) (?| x ( y ) z | (p (q) r) | (t) u (v) ) ( z ) /x - # 1 2 2 3 2 3 4 - - A back reference to a numbered subpattern uses the most recent value - that is set for that number by any subpattern. The following pattern - matches "abcabc" or "defdef": - - /(?|(abc)|(def))\1/ - - In contrast, a subroutine call to a numbered subpattern always refers - to the first one in the pattern with the given number. The following - pattern matches "abcabc" or "defabc": - - /(?|(abc)|(def))(?1)/ - - If a condition test for a subpattern's having matched refers to a non- - unique number, the test is true if any of the subpatterns of that num- - ber have matched. - - An alternative approach to using this "branch reset" feature is to use - duplicate named subpatterns, as described in the next section. - - -NAMED SUBPATTERNS - - Identifying capturing parentheses by number is simple, but it can be - very hard to keep track of the numbers in complicated regular expres- - sions. Furthermore, if an expression is modified, the numbers may - change. To help with this difficulty, PCRE supports the naming of sub- - patterns. This feature was not added to Perl until release 5.10. Python - had the feature earlier, and PCRE introduced it at release 4.0, using - the Python syntax. PCRE now supports both the Perl and the Python syn- - tax. Perl allows identically numbered subpatterns to have different - names, but PCRE does not. - - In PCRE, a subpattern can be named in one of three ways: (?...) - or (?'name'...) as in Perl, or (?P...) as in Python. References - to capturing parentheses from other parts of the pattern, such as back - references, recursion, and conditions, can be made by name as well as - by number. - - Names consist of up to 32 alphanumeric characters and underscores, but - must start with a non-digit. Named capturing parentheses are still - allocated numbers as well as names, exactly as if the names were not - present. The PCRE API provides function calls for extracting the name- - to-number translation table from a compiled pattern. There is also a - convenience function for extracting a captured substring by name. - - By default, a name must be unique within a pattern, but it is possible - to relax this constraint by setting the PCRE_DUPNAMES option at compile - time. (Duplicate names are also always permitted for subpatterns with - the same number, set up as described in the previous section.) Dupli- - cate names can be useful for patterns where only one instance of the - named parentheses can match. Suppose you want to match the name of a - weekday, either as a 3-letter abbreviation or as the full name, and in - both cases you want to extract the abbreviation. This pattern (ignoring - the line breaks) does the job: - - (?Mon|Fri|Sun)(?:day)?| - (?Tue)(?:sday)?| - (?Wed)(?:nesday)?| - (?Thu)(?:rsday)?| - (?Sat)(?:urday)? - - There are five capturing substrings, but only one is ever set after a - match. (An alternative way of solving this problem is to use a "branch - reset" subpattern, as described in the previous section.) - - The convenience function for extracting the data by name returns the - substring for the first (and in this example, the only) subpattern of - that name that matched. This saves searching to find which numbered - subpattern it was. - - If you make a back reference to a non-unique named subpattern from - elsewhere in the pattern, the subpatterns to which the name refers are - checked in the order in which they appear in the overall pattern. The - first one that is set is used for the reference. For example, this pat- - tern matches both "foofoo" and "barbar" but not "foobar" or "barfoo": - - (?:(?foo)|(?bar))\k - - - If you make a subroutine call to a non-unique named subpattern, the one - that corresponds to the first occurrence of the name is used. In the - absence of duplicate numbers (see the previous section) this is the one - with the lowest number. - - If you use a named reference in a condition test (see the section about - conditions below), either to check whether a subpattern has matched, or - to check for recursion, all subpatterns with the same name are tested. - If the condition is true for any one of them, the overall condition is - true. This is the same behaviour as testing by number. For further - details of the interfaces for handling named subpatterns, see the - pcreapi documentation. - - Warning: You cannot use different names to distinguish between two sub- - patterns with the same number because PCRE uses only the numbers when - matching. For this reason, an error is given at compile time if differ- - ent names are given to subpatterns with the same number. However, you - can always give the same name to subpatterns with the same number, even - when PCRE_DUPNAMES is not set. - - -REPETITION - - Repetition is specified by quantifiers, which can follow any of the - following items: - - a literal data character - the dot metacharacter - the \C escape sequence - the \X escape sequence - the \R escape sequence - an escape such as \d or \pL that matches a single character - a character class - a back reference (see next section) - a parenthesized subpattern (including assertions) - a subroutine call to a subpattern (recursive or otherwise) - - The general repetition quantifier specifies a minimum and maximum num- - ber of permitted matches, by giving the two numbers in curly brackets - (braces), separated by a comma. The numbers must be less than 65536, - and the first must be less than or equal to the second. For example: - - z{2,4} - - matches "zz", "zzz", or "zzzz". A closing brace on its own is not a - special character. If the second number is omitted, but the comma is - present, there is no upper limit; if the second number and the comma - are both omitted, the quantifier specifies an exact number of required - matches. Thus - - [aeiou]{3,} - - matches at least 3 successive vowels, but may match many more, while - - \d{8} - - matches exactly 8 digits. An opening curly bracket that appears in a - position where a quantifier is not allowed, or one that does not match - the syntax of a quantifier, is taken as a literal character. For exam- - ple, {,6} is not a quantifier, but a literal string of four characters. - - In UTF modes, quantifiers apply to characters rather than to individual - data units. Thus, for example, \x{100}{2} matches two characters, each - of which is represented by a two-byte sequence in a UTF-8 string. Simi- - larly, \X{3} matches three Unicode extended grapheme clusters, each of - which may be several data units long (and they may be of different - lengths). - - The quantifier {0} is permitted, causing the expression to behave as if - the previous item and the quantifier were not present. This may be use- - ful for subpatterns that are referenced as subroutines from elsewhere - in the pattern (but see also the section entitled "Defining subpatterns - for use by reference only" below). Items other than subpatterns that - have a {0} quantifier are omitted from the compiled pattern. - - For convenience, the three most common quantifiers have single-charac- - ter abbreviations: - - * is equivalent to {0,} - + is equivalent to {1,} - ? is equivalent to {0,1} - - It is possible to construct infinite loops by following a subpattern - that can match no characters with a quantifier that has no upper limit, - for example: - - (a?)* - - Earlier versions of Perl and PCRE used to give an error at compile time - for such patterns. However, because there are cases where this can be - useful, such patterns are now accepted, but if any repetition of the - subpattern does in fact match no characters, the loop is forcibly bro- - ken. - - By default, the quantifiers are "greedy", that is, they match as much - as possible (up to the maximum number of permitted times), without - causing the rest of the pattern to fail. The classic example of where - this gives problems is in trying to match comments in C programs. These - appear between /* and */ and within the comment, individual * and / - characters may appear. An attempt to match C comments by applying the - pattern - - /\*.*\*/ - - to the string - - /* first comment */ not comment /* second comment */ - - fails, because it matches the entire string owing to the greediness of - the .* item. - - However, if a quantifier is followed by a question mark, it ceases to - be greedy, and instead matches the minimum number of times possible, so - the pattern - - /\*.*?\*/ - - does the right thing with the C comments. The meaning of the various - quantifiers is not otherwise changed, just the preferred number of - matches. Do not confuse this use of question mark with its use as a - quantifier in its own right. Because it has two uses, it can sometimes - appear doubled, as in - - \d??\d - - which matches one digit by preference, but can match two if that is the - only way the rest of the pattern matches. - - If the PCRE_UNGREEDY option is set (an option that is not available in - Perl), the quantifiers are not greedy by default, but individual ones - can be made greedy by following them with a question mark. In other - words, it inverts the default behaviour. - - When a parenthesized subpattern is quantified with a minimum repeat - count that is greater than 1 or with a limited maximum, more memory is - required for the compiled pattern, in proportion to the size of the - minimum or maximum. - - If a pattern starts with .* or .{0,} and the PCRE_DOTALL option (equiv- - alent to Perl's /s) is set, thus allowing the dot to match newlines, - the pattern is implicitly anchored, because whatever follows will be - tried against every character position in the subject string, so there - is no point in retrying the overall match at any position after the - first. PCRE normally treats such a pattern as though it were preceded - by \A. - - In cases where it is known that the subject string contains no new- - lines, it is worth setting PCRE_DOTALL in order to obtain this opti- - mization, or alternatively using ^ to indicate anchoring explicitly. - - However, there are some cases where the optimization cannot be used. - When .* is inside capturing parentheses that are the subject of a back - reference elsewhere in the pattern, a match at the start may fail where - a later one succeeds. Consider, for example: - - (.*)abc\1 - - If the subject is "xyz123abc123" the match point is the fourth charac- - ter. For this reason, such a pattern is not implicitly anchored. - - Another case where implicit anchoring is not applied is when the lead- - ing .* is inside an atomic group. Once again, a match at the start may - fail where a later one succeeds. Consider this pattern: - - (?>.*?a)b - - It matches "ab" in the subject "aab". The use of the backtracking con- - trol verbs (*PRUNE) and (*SKIP) also disable this optimization. - - When a capturing subpattern is repeated, the value captured is the sub- - string that matched the final iteration. For example, after - - (tweedle[dume]{3}\s*)+ - - has matched "tweedledum tweedledee" the value of the captured substring - is "tweedledee". However, if there are nested capturing subpatterns, - the corresponding captured values may have been set in previous itera- - tions. For example, after - - /(a|(b))+/ - - matches "aba" the value of the second captured substring is "b". - - -ATOMIC GROUPING AND POSSESSIVE QUANTIFIERS - - With both maximizing ("greedy") and minimizing ("ungreedy" or "lazy") - repetition, failure of what follows normally causes the repeated item - to be re-evaluated to see if a different number of repeats allows the - rest of the pattern to match. Sometimes it is useful to prevent this, - either to change the nature of the match, or to cause it fail earlier - than it otherwise might, when the author of the pattern knows there is - no point in carrying on. - - Consider, for example, the pattern \d+foo when applied to the subject - line - - 123456bar - - After matching all 6 digits and then failing to match "foo", the normal - action of the matcher is to try again with only 5 digits matching the - \d+ item, and then with 4, and so on, before ultimately failing. - "Atomic grouping" (a term taken from Jeffrey Friedl's book) provides - the means for specifying that once a subpattern has matched, it is not - to be re-evaluated in this way. - - If we use atomic grouping for the previous example, the matcher gives - up immediately on failing to match "foo" the first time. The notation - is a kind of special parenthesis, starting with (?> as in this example: - - (?>\d+)foo - - This kind of parenthesis "locks up" the part of the pattern it con- - tains once it has matched, and a failure further into the pattern is - prevented from backtracking into it. Backtracking past it to previous - items, however, works as normal. - - An alternative description is that a subpattern of this type matches - the string of characters that an identical standalone pattern would - match, if anchored at the current point in the subject string. - - Atomic grouping subpatterns are not capturing subpatterns. Simple cases - such as the above example can be thought of as a maximizing repeat that - must swallow everything it can. So, while both \d+ and \d+? are pre- - pared to adjust the number of digits they match in order to make the - rest of the pattern match, (?>\d+) can only match an entire sequence of - digits. - - Atomic groups in general can of course contain arbitrarily complicated - subpatterns, and can be nested. However, when the subpattern for an - atomic group is just a single repeated item, as in the example above, a - simpler notation, called a "possessive quantifier" can be used. This - consists of an additional + character following a quantifier. Using - this notation, the previous example can be rewritten as - - \d++foo - - Note that a possessive quantifier can be used with an entire group, for - example: - - (abc|xyz){2,3}+ - - Possessive quantifiers are always greedy; the setting of the - PCRE_UNGREEDY option is ignored. They are a convenient notation for the - simpler forms of atomic group. However, there is no difference in the - meaning of a possessive quantifier and the equivalent atomic group, - though there may be a performance difference; possessive quantifiers - should be slightly faster. - - The possessive quantifier syntax is an extension to the Perl 5.8 syn- - tax. Jeffrey Friedl originated the idea (and the name) in the first - edition of his book. Mike McCloskey liked it, so implemented it when he - built Sun's Java package, and PCRE copied it from there. It ultimately - found its way into Perl at release 5.10. - - PCRE has an optimization that automatically "possessifies" certain sim- - ple pattern constructs. For example, the sequence A+B is treated as - A++B because there is no point in backtracking into a sequence of A's - when B must follow. - - When a pattern contains an unlimited repeat inside a subpattern that - can itself be repeated an unlimited number of times, the use of an - atomic group is the only way to avoid some failing matches taking a - very long time indeed. The pattern - - (\D+|<\d+>)*[!?] - - matches an unlimited number of substrings that either consist of non- - digits, or digits enclosed in <>, followed by either ! or ?. When it - matches, it runs quickly. However, if it is applied to - - aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa - - it takes a long time before reporting failure. This is because the - string can be divided between the internal \D+ repeat and the external - * repeat in a large number of ways, and all have to be tried. (The - example uses [!?] rather than a single character at the end, because - both PCRE and Perl have an optimization that allows for fast failure - when a single character is used. They remember the last single charac- - ter that is required for a match, and fail early if it is not present - in the string.) If the pattern is changed so that it uses an atomic - group, like this: - - ((?>\D+)|<\d+>)*[!?] - - sequences of non-digits cannot be broken, and failure happens quickly. - - -BACK REFERENCES - - Outside a character class, a backslash followed by a digit greater than - 0 (and possibly further digits) is a back reference to a capturing sub- - pattern earlier (that is, to its left) in the pattern, provided there - have been that many previous capturing left parentheses. - - However, if the decimal number following the backslash is less than 10, - it is always taken as a back reference, and causes an error only if - there are not that many capturing left parentheses in the entire pat- - tern. In other words, the parentheses that are referenced need not be - to the left of the reference for numbers less than 10. A "forward back - reference" of this type can make sense when a repetition is involved - and the subpattern to the right has participated in an earlier itera- - tion. - - It is not possible to have a numerical "forward back reference" to a - subpattern whose number is 10 or more using this syntax because a - sequence such as \50 is interpreted as a character defined in octal. - See the subsection entitled "Non-printing characters" above for further - details of the handling of digits following a backslash. There is no - such problem when named parentheses are used. A back reference to any - subpattern is possible using named parentheses (see below). - - Another way of avoiding the ambiguity inherent in the use of digits - following a backslash is to use the \g escape sequence. This escape - must be followed by an unsigned number or a negative number, optionally - enclosed in braces. These examples are all identical: - - (ring), \1 - (ring), \g1 - (ring), \g{1} - - An unsigned number specifies an absolute reference without the ambigu- - ity that is present in the older syntax. It is also useful when literal - digits follow the reference. A negative number is a relative reference. - Consider this example: - - (abc(def)ghi)\g{-1} - - The sequence \g{-1} is a reference to the most recently started captur- - ing subpattern before \g, that is, is it equivalent to \2 in this exam- - ple. Similarly, \g{-2} would be equivalent to \1. The use of relative - references can be helpful in long patterns, and also in patterns that - are created by joining together fragments that contain references - within themselves. - - A back reference matches whatever actually matched the capturing sub- - pattern in the current subject string, rather than anything matching - the subpattern itself (see "Subpatterns as subroutines" below for a way - of doing that). So the pattern - - (sens|respons)e and \1ibility - - matches "sense and sensibility" and "response and responsibility", but - not "sense and responsibility". If caseful matching is in force at the - time of the back reference, the case of letters is relevant. For exam- - ple, - - ((?i)rah)\s+\1 - - matches "rah rah" and "RAH RAH", but not "RAH rah", even though the - original capturing subpattern is matched caselessly. - - There are several different ways of writing back references to named - subpatterns. The .NET syntax \k{name} and the Perl syntax \k or - \k'name' are supported, as is the Python syntax (?P=name). Perl 5.10's - unified back reference syntax, in which \g can be used for both numeric - and named references, is also supported. We could rewrite the above - example in any of the following ways: - - (?(?i)rah)\s+\k - (?'p1'(?i)rah)\s+\k{p1} - (?P(?i)rah)\s+(?P=p1) - (?(?i)rah)\s+\g{p1} - - A subpattern that is referenced by name may appear in the pattern - before or after the reference. - - There may be more than one back reference to the same subpattern. If a - subpattern has not actually been used in a particular match, any back - references to it always fail by default. For example, the pattern - - (a|(bc))\2 - - always fails if it starts to match "a" rather than "bc". However, if - the PCRE_JAVASCRIPT_COMPAT option is set at compile time, a back refer- - ence to an unset value matches an empty string. - - Because there may be many capturing parentheses in a pattern, all dig- - its following a backslash are taken as part of a potential back refer- - ence number. If the pattern continues with a digit character, some - delimiter must be used to terminate the back reference. If the - PCRE_EXTENDED option is set, this can be white space. Otherwise, the - \g{ syntax or an empty comment (see "Comments" below) can be used. - - Recursive back references - - A back reference that occurs inside the parentheses to which it refers - fails when the subpattern is first used, so, for example, (a\1) never - matches. However, such references can be useful inside repeated sub- - patterns. For example, the pattern - - (a|b\1)+ - - matches any number of "a"s and also "aba", "ababbaa" etc. At each iter- - ation of the subpattern, the back reference matches the character - string corresponding to the previous iteration. In order for this to - work, the pattern must be such that the first iteration does not need - to match the back reference. This can be done using alternation, as in - the example above, or by a quantifier with a minimum of zero. - - Back references of this type cause the group that they reference to be - treated as an atomic group. Once the whole group has been matched, a - subsequent matching failure cannot cause backtracking into the middle - of the group. - - -ASSERTIONS - - An assertion is a test on the characters following or preceding the - current matching point that does not actually consume any characters. - The simple assertions coded as \b, \B, \A, \G, \Z, \z, ^ and $ are - described above. - - More complicated assertions are coded as subpatterns. There are two - kinds: those that look ahead of the current position in the subject - string, and those that look behind it. An assertion subpattern is - matched in the normal way, except that it does not cause the current - matching position to be changed. - - Assertion subpatterns are not capturing subpatterns. If such an asser- - tion contains capturing subpatterns within it, these are counted for - the purposes of numbering the capturing subpatterns in the whole pat- - tern. However, substring capturing is carried out only for positive - assertions. (Perl sometimes, but not always, does do capturing in nega- - tive assertions.) - - WARNING: If a positive assertion containing one or more capturing sub- - patterns succeeds, but failure to match later in the pattern causes - backtracking over this assertion, the captures within the assertion are - reset only if no higher numbered captures are already set. This is, - unfortunately, a fundamental limitation of the current implementation, - and as PCRE1 is now in maintenance-only status, it is unlikely ever to - change. - - For compatibility with Perl, assertion subpatterns may be repeated; - though it makes no sense to assert the same thing several times, the - side effect of capturing parentheses may occasionally be useful. In - practice, there only three cases: - - (1) If the quantifier is {0}, the assertion is never obeyed during - matching. However, it may contain internal capturing parenthesized - groups that are called from elsewhere via the subroutine mechanism. - - (2) If quantifier is {0,n} where n is greater than zero, it is treated - as if it were {0,1}. At run time, the rest of the pattern match is - tried with and without the assertion, the order depending on the greed- - iness of the quantifier. - - (3) If the minimum repetition is greater than zero, the quantifier is - ignored. The assertion is obeyed just once when encountered during - matching. - - Lookahead assertions - - Lookahead assertions start with (?= for positive assertions and (?! for - negative assertions. For example, - - \w+(?=;) - - matches a word followed by a semicolon, but does not include the semi- - colon in the match, and - - foo(?!bar) - - matches any occurrence of "foo" that is not followed by "bar". Note - that the apparently similar pattern - - (?!foo)bar - - does not find an occurrence of "bar" that is preceded by something - other than "foo"; it finds any occurrence of "bar" whatsoever, because - the assertion (?!foo) is always true when the next three characters are - "bar". A lookbehind assertion is needed to achieve the other effect. - - If you want to force a matching failure at some point in a pattern, the - most convenient way to do it is with (?!) because an empty string - always matches, so an assertion that requires there not to be an empty - string must always fail. The backtracking control verb (*FAIL) or (*F) - is a synonym for (?!). - - Lookbehind assertions - - Lookbehind assertions start with (?<= for positive assertions and (?)...) or (?('name')...) to test for a - used subpattern by name. For compatibility with earlier versions of - PCRE, which had this facility before Perl, the syntax (?(name)...) is - also recognized. - - Rewriting the above example to use a named subpattern gives this: - - (? \( )? [^()]+ (?() \) ) - - If the name used in a condition of this kind is a duplicate, the test - is applied to all subpatterns of the same name, and is true if any one - of them has matched. - - Checking for pattern recursion - - If the condition is the string (R), and there is no subpattern with the - name R, the condition is true if a recursive call to the whole pattern - or any subpattern has been made. If digits or a name preceded by amper- - sand follow the letter R, for example: - - (?(R3)...) or (?(R&name)...) - - the condition is true if the most recent recursion is into a subpattern - whose number or name is given. This condition does not check the entire - recursion stack. If the name used in a condition of this kind is a - duplicate, the test is applied to all subpatterns of the same name, and - is true if any one of them is the most recent recursion. - - At "top level", all these recursion test conditions are false. The - syntax for recursive patterns is described below. - - Defining subpatterns for use by reference only - - If the condition is the string (DEFINE), and there is no subpattern - with the name DEFINE, the condition is always false. In this case, - there may be only one alternative in the subpattern. It is always - skipped if control reaches this point in the pattern; the idea of - DEFINE is that it can be used to define subroutines that can be refer- - enced from elsewhere. (The use of subroutines is described below.) For - example, a pattern to match an IPv4 address such as "192.168.23.245" - could be written like this (ignore white space and line breaks): - - (?(DEFINE) (? 2[0-4]\d | 25[0-5] | 1\d\d | [1-9]?\d) ) - \b (?&byte) (\.(?&byte)){3} \b - - The first part of the pattern is a DEFINE group inside which a another - group named "byte" is defined. This matches an individual component of - an IPv4 address (a number less than 256). When matching takes place, - this part of the pattern is skipped because DEFINE acts like a false - condition. The rest of the pattern uses references to the named group - to match the four dot-separated components of an IPv4 address, insist- - ing on a word boundary at each end. - - Assertion conditions - - If the condition is not in any of the above formats, it must be an - assertion. This may be a positive or negative lookahead or lookbehind - assertion. Consider this pattern, again containing non-significant - white space, and with the two alternatives on the second line: - - (?(?=[^a-z]*[a-z]) - \d{2}-[a-z]{3}-\d{2} | \d{2}-\d{2}-\d{2} ) - - The condition is a positive lookahead assertion that matches an - optional sequence of non-letters followed by a letter. In other words, - it tests for the presence of at least one letter in the subject. If a - letter is found, the subject is matched against the first alternative; - otherwise it is matched against the second. This pattern matches - strings in one of the two forms dd-aaa-dd or dd-dd-dd, where aaa are - letters and dd are digits. - - -COMMENTS - - There are two ways of including comments in patterns that are processed - by PCRE. In both cases, the start of the comment must not be in a char- - acter class, nor in the middle of any other sequence of related charac- - ters such as (?: or a subpattern name or number. The characters that - make up a comment play no part in the pattern matching. - - The sequence (?# marks the start of a comment that continues up to the - next closing parenthesis. Nested parentheses are not permitted. If the - PCRE_EXTENDED option is set, an unescaped # character also introduces a - comment, which in this case continues to immediately after the next - newline character or character sequence in the pattern. Which charac- - ters are interpreted as newlines is controlled by the options passed to - a compiling function or by a special sequence at the start of the pat- - tern, as described in the section entitled "Newline conventions" above. - Note that the end of this type of comment is a literal newline sequence - in the pattern; escape sequences that happen to represent a newline do - not count. For example, consider this pattern when PCRE_EXTENDED is - set, and the default newline convention is in force: - - abc #comment \n still comment - - On encountering the # character, pcre_compile() skips along, looking - for a newline in the pattern. The sequence \n is still literal at this - stage, so it does not terminate the comment. Only an actual character - with the code value 0x0a (the default newline) does so. - - -RECURSIVE PATTERNS - - Consider the problem of matching a string in parentheses, allowing for - unlimited nested parentheses. Without the use of recursion, the best - that can be done is to use a pattern that matches up to some fixed - depth of nesting. It is not possible to handle an arbitrary nesting - depth. - - For some time, Perl has provided a facility that allows regular expres- - sions to recurse (amongst other things). It does this by interpolating - Perl code in the expression at run time, and the code can refer to the - expression itself. A Perl pattern using code interpolation to solve the - parentheses problem can be created like this: - - $re = qr{\( (?: (?>[^()]+) | (?p{$re}) )* \)}x; - - The (?p{...}) item interpolates Perl code at run time, and in this case - refers recursively to the pattern in which it appears. - - Obviously, PCRE cannot support the interpolation of Perl code. Instead, - it supports special syntax for recursion of the entire pattern, and - also for individual subpattern recursion. After its introduction in - PCRE and Python, this kind of recursion was subsequently introduced - into Perl at release 5.10. - - A special item that consists of (? followed by a number greater than - zero and a closing parenthesis is a recursive subroutine call of the - subpattern of the given number, provided that it occurs inside that - subpattern. (If not, it is a non-recursive subroutine call, which is - described in the next section.) The special item (?R) or (?0) is a - recursive call of the entire regular expression. - - This PCRE pattern solves the nested parentheses problem (assume the - PCRE_EXTENDED option is set so that white space is ignored): - - \( ( [^()]++ | (?R) )* \) - - First it matches an opening parenthesis. Then it matches any number of - substrings which can either be a sequence of non-parentheses, or a - recursive match of the pattern itself (that is, a correctly parenthe- - sized substring). Finally there is a closing parenthesis. Note the use - of a possessive quantifier to avoid backtracking into sequences of non- - parentheses. - - If this were part of a larger pattern, you would not want to recurse - the entire pattern, so instead you could use this: - - ( \( ( [^()]++ | (?1) )* \) ) - - We have put the pattern into parentheses, and caused the recursion to - refer to them instead of the whole pattern. - - In a larger pattern, keeping track of parenthesis numbers can be - tricky. This is made easier by the use of relative references. Instead - of (?1) in the pattern above you can write (?-2) to refer to the second - most recently opened parentheses preceding the recursion. In other - words, a negative number counts capturing parentheses leftwards from - the point at which it is encountered. - - It is also possible to refer to subsequently opened parentheses, by - writing references such as (?+2). However, these cannot be recursive - because the reference is not inside the parentheses that are refer- - enced. They are always non-recursive subroutine calls, as described in - the next section. - - An alternative approach is to use named parentheses instead. The Perl - syntax for this is (?&name); PCRE's earlier syntax (?P>name) is also - supported. We could rewrite the above example as follows: - - (? \( ( [^()]++ | (?&pn) )* \) ) - - If there is more than one subpattern with the same name, the earliest - one is used. - - This particular example pattern that we have been looking at contains - nested unlimited repeats, and so the use of a possessive quantifier for - matching strings of non-parentheses is important when applying the pat- - tern to strings that do not match. For example, when this pattern is - applied to - - (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa() - - it yields "no match" quickly. However, if a possessive quantifier is - not used, the match runs for a very long time indeed because there are - so many different ways the + and * repeats can carve up the subject, - and all have to be tested before failure can be reported. - - At the end of a match, the values of capturing parentheses are those - from the outermost level. If you want to obtain intermediate values, a - callout function can be used (see below and the pcrecallout documenta- - tion). If the pattern above is matched against - - (ab(cd)ef) - - the value for the inner capturing parentheses (numbered 2) is "ef", - which is the last value taken on at the top level. If a capturing sub- - pattern is not matched at the top level, its final captured value is - unset, even if it was (temporarily) set at a deeper level during the - matching process. - - If there are more than 15 capturing parentheses in a pattern, PCRE has - to obtain extra memory to store data during a recursion, which it does - by using pcre_malloc, freeing it via pcre_free afterwards. If no memory - can be obtained, the match fails with the PCRE_ERROR_NOMEMORY error. - - Do not confuse the (?R) item with the condition (R), which tests for - recursion. Consider this pattern, which matches text in angle brack- - ets, allowing for arbitrary nesting. Only digits are allowed in nested - brackets (that is, when recursing), whereas any characters are permit- - ted at the outer level. - - < (?: (?(R) \d++ | [^<>]*+) | (?R)) * > - - In this pattern, (?(R) is the start of a conditional subpattern, with - two different alternatives for the recursive and non-recursive cases. - The (?R) item is the actual recursive call. - - Differences in recursion processing between PCRE and Perl - - Recursion processing in PCRE differs from Perl in two important ways. - In PCRE (like Python, but unlike Perl), a recursive subpattern call is - always treated as an atomic group. That is, once it has matched some of - the subject string, it is never re-entered, even if it contains untried - alternatives and there is a subsequent matching failure. This can be - illustrated by the following pattern, which purports to match a palin- - dromic string that contains an odd number of characters (for example, - "a", "aba", "abcba", "abcdcba"): - - ^(.|(.)(?1)\2)$ - - The idea is that it either matches a single character, or two identical - characters surrounding a sub-palindrome. In Perl, this pattern works; - in PCRE it does not if the pattern is longer than three characters. - Consider the subject string "abcba": - - At the top level, the first character is matched, but as it is not at - the end of the string, the first alternative fails; the second alterna- - tive is taken and the recursion kicks in. The recursive call to subpat- - tern 1 successfully matches the next character ("b"). (Note that the - beginning and end of line tests are not part of the recursion). - - Back at the top level, the next character ("c") is compared with what - subpattern 2 matched, which was "a". This fails. Because the recursion - is treated as an atomic group, there are now no backtracking points, - and so the entire match fails. (Perl is able, at this point, to re- - enter the recursion and try the second alternative.) However, if the - pattern is written with the alternatives in the other order, things are - different: - - ^((.)(?1)\2|.)$ - - This time, the recursing alternative is tried first, and continues to - recurse until it runs out of characters, at which point the recursion - fails. But this time we do have another alternative to try at the - higher level. That is the big difference: in the previous case the - remaining alternative is at a deeper recursion level, which PCRE cannot - use. - - To change the pattern so that it matches all palindromic strings, not - just those with an odd number of characters, it is tempting to change - the pattern to this: - - ^((.)(?1)\2|.?)$ - - Again, this works in Perl, but not in PCRE, and for the same reason. - When a deeper recursion has matched a single character, it cannot be - entered again in order to match an empty string. The solution is to - separate the two cases, and write out the odd and even cases as alter- - natives at the higher level: - - ^(?:((.)(?1)\2|)|((.)(?3)\4|.)) - - If you want to match typical palindromic phrases, the pattern has to - ignore all non-word characters, which can be done like this: - - ^\W*+(?:((.)\W*+(?1)\W*+\2|)|((.)\W*+(?3)\W*+\4|\W*+.\W*+))\W*+$ - - If run with the PCRE_CASELESS option, this pattern matches phrases such - as "A man, a plan, a canal: Panama!" and it works well in both PCRE and - Perl. Note the use of the possessive quantifier *+ to avoid backtrack- - ing into sequences of non-word characters. Without this, PCRE takes a - great deal longer (ten times or more) to match typical phrases, and - Perl takes so long that you think it has gone into a loop. - - WARNING: The palindrome-matching patterns above work only if the sub- - ject string does not start with a palindrome that is shorter than the - entire string. For example, although "abcba" is correctly matched, if - the subject is "ababa", PCRE finds the palindrome "aba" at the start, - then fails at top level because the end of the string does not follow. - Once again, it cannot jump back into the recursion to try other alter- - natives, so the entire match fails. - - The second way in which PCRE and Perl differ in their recursion pro- - cessing is in the handling of captured values. In Perl, when a subpat- - tern is called recursively or as a subpattern (see the next section), - it has no access to any values that were captured outside the recur- - sion, whereas in PCRE these values can be referenced. Consider this - pattern: - - ^(.)(\1|a(?2)) - - In PCRE, this pattern matches "bab". The first capturing parentheses - match "b", then in the second group, when the back reference \1 fails - to match "b", the second alternative matches "a" and then recurses. In - the recursion, \1 does now match "b" and so the whole match succeeds. - In Perl, the pattern fails to match because inside the recursive call - \1 cannot access the externally set value. - - -SUBPATTERNS AS SUBROUTINES - - If the syntax for a recursive subpattern call (either by number or by - name) is used outside the parentheses to which it refers, it operates - like a subroutine in a programming language. The called subpattern may - be defined before or after the reference. A numbered reference can be - absolute or relative, as in these examples: - - (...(absolute)...)...(?2)... - (...(relative)...)...(?-1)... - (...(?+1)...(relative)... - - An earlier example pointed out that the pattern - - (sens|respons)e and \1ibility - - matches "sense and sensibility" and "response and responsibility", but - not "sense and responsibility". If instead the pattern - - (sens|respons)e and (?1)ibility - - is used, it does match "sense and responsibility" as well as the other - two strings. Another example is given in the discussion of DEFINE - above. - - All subroutine calls, whether recursive or not, are always treated as - atomic groups. That is, once a subroutine has matched some of the sub- - ject string, it is never re-entered, even if it contains untried alter- - natives and there is a subsequent matching failure. Any capturing - parentheses that are set during the subroutine call revert to their - previous values afterwards. - - Processing options such as case-independence are fixed when a subpat- - tern is defined, so if it is used as a subroutine, such options cannot - be changed for different calls. For example, consider this pattern: - - (abc)(?i:(?-1)) - - It matches "abcabc". It does not match "abcABC" because the change of - processing option does not affect the called subpattern. - - -ONIGURUMA SUBROUTINE SYNTAX - - For compatibility with Oniguruma, the non-Perl syntax \g followed by a - name or a number enclosed either in angle brackets or single quotes, is - an alternative syntax for referencing a subpattern as a subroutine, - possibly recursively. Here are two of the examples used above, rewrit- - ten using this syntax: - - (? \( ( (?>[^()]+) | \g )* \) ) - (sens|respons)e and \g'1'ibility - - PCRE supports an extension to Oniguruma: if a number is preceded by a - plus or a minus sign it is taken as a relative reference. For example: - - (abc)(?i:\g<-1>) - - Note that \g{...} (Perl syntax) and \g<...> (Oniguruma syntax) are not - synonymous. The former is a back reference; the latter is a subroutine - call. - - -CALLOUTS - - Perl has a feature whereby using the sequence (?{...}) causes arbitrary - Perl code to be obeyed in the middle of matching a regular expression. - This makes it possible, amongst other things, to extract different sub- - strings that match the same pair of parentheses when there is a repeti- - tion. - - PCRE provides a similar feature, but of course it cannot obey arbitrary - Perl code. The feature is called "callout". The caller of PCRE provides - an external function by putting its entry point in the global variable - pcre_callout (8-bit library) or pcre[16|32]_callout (16-bit or 32-bit - library). By default, this variable contains NULL, which disables all - calling out. - - Within a regular expression, (?C) indicates the points at which the - external function is to be called. If you want to identify different - callout points, you can put a number less than 256 after the letter C. - The default value is zero. For example, this pattern has two callout - points: - - (?C1)abc(?C2)def - - If the PCRE_AUTO_CALLOUT flag is passed to a compiling function, call- - outs are automatically installed before each item in the pattern. They - are all numbered 255. If there is a conditional group in the pattern - whose condition is an assertion, an additional callout is inserted just - before the condition. An explicit callout may also be set at this posi- - tion, as in this example: - - (?(?C9)(?=a)abc|def) - - Note that this applies only to assertion conditions, not to other types - of condition. - - During matching, when PCRE reaches a callout point, the external func- - tion is called. It is provided with the number of the callout, the - position in the pattern, and, optionally, one item of data originally - supplied by the caller of the matching function. The callout function - may cause matching to proceed, to backtrack, or to fail altogether. - - By default, PCRE implements a number of optimizations at compile time - and matching time, and one side-effect is that sometimes callouts are - skipped. If you need all possible callouts to happen, you need to set - options that disable the relevant optimizations. More details, and a - complete description of the interface to the callout function, are - given in the pcrecallout documentation. - - -BACKTRACKING CONTROL - - Perl 5.10 introduced a number of "Special Backtracking Control Verbs", - which are still described in the Perl documentation as "experimental - and subject to change or removal in a future version of Perl". It goes - on to say: "Their usage in production code should be noted to avoid - problems during upgrades." The same remarks apply to the PCRE features - described in this section. - - The new verbs make use of what was previously invalid syntax: an open- - ing parenthesis followed by an asterisk. They are generally of the form - (*VERB) or (*VERB:NAME). Some may take either form, possibly behaving - differently depending on whether or not a name is present. A name is - any sequence of characters that does not include a closing parenthesis. - The maximum length of name is 255 in the 8-bit library and 65535 in the - 16-bit and 32-bit libraries. If the name is empty, that is, if the - closing parenthesis immediately follows the colon, the effect is as if - the colon were not there. Any number of these verbs may occur in a - pattern. - - Since these verbs are specifically related to backtracking, most of - them can be used only when the pattern is to be matched using one of - the traditional matching functions, because these use a backtracking - algorithm. With the exception of (*FAIL), which behaves like a failing - negative assertion, the backtracking control verbs cause an error if - encountered by a DFA matching function. - - The behaviour of these verbs in repeated groups, assertions, and in - subpatterns called as subroutines (whether or not recursively) is docu- - mented below. - - Optimizations that affect backtracking verbs - - PCRE contains some optimizations that are used to speed up matching by - running some checks at the start of each match attempt. For example, it - may know the minimum length of matching subject, or that a particular - character must be present. When one of these optimizations bypasses the - running of a match, any included backtracking verbs will not, of - course, be processed. You can suppress the start-of-match optimizations - by setting the PCRE_NO_START_OPTIMIZE option when calling pcre_com- - pile() or pcre_exec(), or by starting the pattern with (*NO_START_OPT). - There is more discussion of this option in the section entitled "Option - bits for pcre_exec()" in the pcreapi documentation. - - Experiments with Perl suggest that it too has similar optimizations, - sometimes leading to anomalous results. - - Verbs that act immediately - - The following verbs act as soon as they are encountered. They may not - be followed by a name. - - (*ACCEPT) - - This verb causes the match to end successfully, skipping the remainder - of the pattern. However, when it is inside a subpattern that is called - as a subroutine, only that subpattern is ended successfully. Matching - then continues at the outer level. If (*ACCEPT) in triggered in a posi- - tive assertion, the assertion succeeds; in a negative assertion, the - assertion fails. - - If (*ACCEPT) is inside capturing parentheses, the data so far is cap- - tured. For example: - - A((?:A|B(*ACCEPT)|C)D) - - This matches "AB", "AAD", or "ACD"; when it matches "AB", "B" is cap- - tured by the outer parentheses. - - (*FAIL) or (*F) - - This verb causes a matching failure, forcing backtracking to occur. It - is equivalent to (?!) but easier to read. The Perl documentation notes - that it is probably useful only when combined with (?{}) or (??{}). - Those are, of course, Perl features that are not present in PCRE. The - nearest equivalent is the callout feature, as for example in this pat- - tern: - - a+(?C)(*FAIL) - - A match with the string "aaaa" always fails, but the callout is taken - before each backtrack happens (in this example, 10 times). - - Recording which path was taken - - There is one verb whose main purpose is to track how a match was - arrived at, though it also has a secondary use in conjunction with - advancing the match starting point (see (*SKIP) below). - - (*MARK:NAME) or (*:NAME) - - A name is always required with this verb. There may be as many - instances of (*MARK) as you like in a pattern, and their names do not - have to be unique. - - When a match succeeds, the name of the last-encountered (*MARK:NAME), - (*PRUNE:NAME), or (*THEN:NAME) on the matching path is passed back to - the caller as described in the section entitled "Extra data for - pcre_exec()" in the pcreapi documentation. Here is an example of - pcretest output, where the /K modifier requests the retrieval and out- - putting of (*MARK) data: - - re> /X(*MARK:A)Y|X(*MARK:B)Z/K - data> XY - 0: XY - MK: A - XZ - 0: XZ - MK: B - - The (*MARK) name is tagged with "MK:" in this output, and in this exam- - ple it indicates which of the two alternatives matched. This is a more - efficient way of obtaining this information than putting each alterna- - tive in its own capturing parentheses. - - If a verb with a name is encountered in a positive assertion that is - true, the name is recorded and passed back if it is the last-encoun- - tered. This does not happen for negative assertions or failing positive - assertions. - - After a partial match or a failed match, the last encountered name in - the entire match process is returned. For example: - - re> /X(*MARK:A)Y|X(*MARK:B)Z/K - data> XP - No match, mark = B - - Note that in this unanchored example the mark is retained from the - match attempt that started at the letter "X" in the subject. Subsequent - match attempts starting at "P" and then with an empty string do not get - as far as the (*MARK) item, but nevertheless do not reset it. - - If you are interested in (*MARK) values after failed matches, you - should probably set the PCRE_NO_START_OPTIMIZE option (see above) to - ensure that the match is always attempted. - - Verbs that act after backtracking - - The following verbs do nothing when they are encountered. Matching con- - tinues with what follows, but if there is no subsequent match, causing - a backtrack to the verb, a failure is forced. That is, backtracking - cannot pass to the left of the verb. However, when one of these verbs - appears inside an atomic group or an assertion that is true, its effect - is confined to that group, because once the group has been matched, - there is never any backtracking into it. In this situation, backtrack- - ing can "jump back" to the left of the entire atomic group or asser- - tion. (Remember also, as stated above, that this localization also - applies in subroutine calls.) - - These verbs differ in exactly what kind of failure occurs when back- - tracking reaches them. The behaviour described below is what happens - when the verb is not in a subroutine or an assertion. Subsequent sec- - tions cover these special cases. - - (*COMMIT) - - This verb, which may not be followed by a name, causes the whole match - to fail outright if there is a later matching failure that causes back- - tracking to reach it. Even if the pattern is unanchored, no further - attempts to find a match by advancing the starting point take place. If - (*COMMIT) is the only backtracking verb that is encountered, once it - has been passed pcre_exec() is committed to finding a match at the cur- - rent starting point, or not at all. For example: - - a+(*COMMIT)b - - This matches "xxaab" but not "aacaab". It can be thought of as a kind - of dynamic anchor, or "I've started, so I must finish." The name of the - most recently passed (*MARK) in the path is passed back when (*COMMIT) - forces a match failure. - - If there is more than one backtracking verb in a pattern, a different - one that follows (*COMMIT) may be triggered first, so merely passing - (*COMMIT) during a match does not always guarantee that a match must be - at this starting point. - - Note that (*COMMIT) at the start of a pattern is not the same as an - anchor, unless PCRE's start-of-match optimizations are turned off, as - shown in this output from pcretest: - - re> /(*COMMIT)abc/ - data> xyzabc - 0: abc - data> xyzabc\Y - No match - - For this pattern, PCRE knows that any match must start with "a", so the - optimization skips along the subject to "a" before applying the pattern - to the first set of data. The match attempt then succeeds. In the sec- - ond set of data, the escape sequence \Y is interpreted by the pcretest - program. It causes the PCRE_NO_START_OPTIMIZE option to be set when - pcre_exec() is called. This disables the optimization that skips along - to the first character. The pattern is now applied starting at "x", and - so the (*COMMIT) causes the match to fail without trying any other - starting points. - - (*PRUNE) or (*PRUNE:NAME) - - This verb causes the match to fail at the current starting position in - the subject if there is a later matching failure that causes backtrack- - ing to reach it. If the pattern is unanchored, the normal "bumpalong" - advance to the next starting character then happens. Backtracking can - occur as usual to the left of (*PRUNE), before it is reached, or when - matching to the right of (*PRUNE), but if there is no match to the - right, backtracking cannot cross (*PRUNE). In simple cases, the use of - (*PRUNE) is just an alternative to an atomic group or possessive quan- - tifier, but there are some uses of (*PRUNE) that cannot be expressed in - any other way. In an anchored pattern (*PRUNE) has the same effect as - (*COMMIT). - - The behaviour of (*PRUNE:NAME) is the not the same as - (*MARK:NAME)(*PRUNE). It is like (*MARK:NAME) in that the name is - remembered for passing back to the caller. However, (*SKIP:NAME) - searches only for names set with (*MARK). - - (*SKIP) - - This verb, when given without a name, is like (*PRUNE), except that if - the pattern is unanchored, the "bumpalong" advance is not to the next - character, but to the position in the subject where (*SKIP) was encoun- - tered. (*SKIP) signifies that whatever text was matched leading up to - it cannot be part of a successful match. Consider: - - a+(*SKIP)b - - If the subject is "aaaac...", after the first match attempt fails - (starting at the first character in the string), the starting point - skips on to start the next attempt at "c". Note that a possessive quan- - tifer does not have the same effect as this example; although it would - suppress backtracking during the first match attempt, the second - attempt would start at the second character instead of skipping on to - "c". - - (*SKIP:NAME) - - When (*SKIP) has an associated name, its behaviour is modified. When it - is triggered, the previous path through the pattern is searched for the - most recent (*MARK) that has the same name. If one is found, the - "bumpalong" advance is to the subject position that corresponds to that - (*MARK) instead of to where (*SKIP) was encountered. If no (*MARK) with - a matching name is found, the (*SKIP) is ignored. - - Note that (*SKIP:NAME) searches only for names set by (*MARK:NAME). It - ignores names that are set by (*PRUNE:NAME) or (*THEN:NAME). - - (*THEN) or (*THEN:NAME) - - This verb causes a skip to the next innermost alternative when back- - tracking reaches it. That is, it cancels any further backtracking - within the current alternative. Its name comes from the observation - that it can be used for a pattern-based if-then-else block: - - ( COND1 (*THEN) FOO | COND2 (*THEN) BAR | COND3 (*THEN) BAZ ) ... - - If the COND1 pattern matches, FOO is tried (and possibly further items - after the end of the group if FOO succeeds); on failure, the matcher - skips to the second alternative and tries COND2, without backtracking - into COND1. If that succeeds and BAR fails, COND3 is tried. If subse- - quently BAZ fails, there are no more alternatives, so there is a back- - track to whatever came before the entire group. If (*THEN) is not - inside an alternation, it acts like (*PRUNE). - - The behaviour of (*THEN:NAME) is the not the same as - (*MARK:NAME)(*THEN). It is like (*MARK:NAME) in that the name is - remembered for passing back to the caller. However, (*SKIP:NAME) - searches only for names set with (*MARK). - - A subpattern that does not contain a | character is just a part of the - enclosing alternative; it is not a nested alternation with only one - alternative. The effect of (*THEN) extends beyond such a subpattern to - the enclosing alternative. Consider this pattern, where A, B, etc. are - complex pattern fragments that do not contain any | characters at this - level: - - A (B(*THEN)C) | D - - If A and B are matched, but there is a failure in C, matching does not - backtrack into A; instead it moves to the next alternative, that is, D. - However, if the subpattern containing (*THEN) is given an alternative, - it behaves differently: - - A (B(*THEN)C | (*FAIL)) | D - - The effect of (*THEN) is now confined to the inner subpattern. After a - failure in C, matching moves to (*FAIL), which causes the whole subpat- - tern to fail because there are no more alternatives to try. In this - case, matching does now backtrack into A. - - Note that a conditional subpattern is not considered as having two - alternatives, because only one is ever used. In other words, the | - character in a conditional subpattern has a different meaning. Ignoring - white space, consider: - - ^.*? (?(?=a) a | b(*THEN)c ) - - If the subject is "ba", this pattern does not match. Because .*? is - ungreedy, it initially matches zero characters. The condition (?=a) - then fails, the character "b" is matched, but "c" is not. At this - point, matching does not backtrack to .*? as might perhaps be expected - from the presence of the | character. The conditional subpattern is - part of the single alternative that comprises the whole pattern, and so - the match fails. (If there was a backtrack into .*?, allowing it to - match "b", the match would succeed.) - - The verbs just described provide four different "strengths" of control - when subsequent matching fails. (*THEN) is the weakest, carrying on the - match at the next alternative. (*PRUNE) comes next, failing the match - at the current starting position, but allowing an advance to the next - character (for an unanchored pattern). (*SKIP) is similar, except that - the advance may be more than one character. (*COMMIT) is the strongest, - causing the entire match to fail. - - More than one backtracking verb - - If more than one backtracking verb is present in a pattern, the one - that is backtracked onto first acts. For example, consider this pat- - tern, where A, B, etc. are complex pattern fragments: - - (A(*COMMIT)B(*THEN)C|ABD) - - If A matches but B fails, the backtrack to (*COMMIT) causes the entire - match to fail. However, if A and B match, but C fails, the backtrack to - (*THEN) causes the next alternative (ABD) to be tried. This behaviour - is consistent, but is not always the same as Perl's. It means that if - two or more backtracking verbs appear in succession, all the the last - of them has no effect. Consider this example: - - ...(*COMMIT)(*PRUNE)... - - If there is a matching failure to the right, backtracking onto (*PRUNE) - causes it to be triggered, and its action is taken. There can never be - a backtrack onto (*COMMIT). - - Backtracking verbs in repeated groups - - PCRE differs from Perl in its handling of backtracking verbs in - repeated groups. For example, consider: - - /(a(*COMMIT)b)+ac/ - - If the subject is "abac", Perl matches, but PCRE fails because the - (*COMMIT) in the second repeat of the group acts. - - Backtracking verbs in assertions - - (*FAIL) in an assertion has its normal effect: it forces an immediate - backtrack. - - (*ACCEPT) in a positive assertion causes the assertion to succeed with- - out any further processing. In a negative assertion, (*ACCEPT) causes - the assertion to fail without any further processing. - - The other backtracking verbs are not treated specially if they appear - in a positive assertion. In particular, (*THEN) skips to the next - alternative in the innermost enclosing group that has alternations, - whether or not this is within the assertion. - - Negative assertions are, however, different, in order to ensure that - changing a positive assertion into a negative assertion changes its - result. Backtracking into (*COMMIT), (*SKIP), or (*PRUNE) causes a neg- - ative assertion to be true, without considering any further alternative - branches in the assertion. Backtracking into (*THEN) causes it to skip - to the next enclosing alternative within the assertion (the normal be- - haviour), but if the assertion does not have such an alternative, - (*THEN) behaves like (*PRUNE). - - Backtracking verbs in subroutines - - These behaviours occur whether or not the subpattern is called recur- - sively. Perl's treatment of subroutines is different in some cases. - - (*FAIL) in a subpattern called as a subroutine has its normal effect: - it forces an immediate backtrack. - - (*ACCEPT) in a subpattern called as a subroutine causes the subroutine - match to succeed without any further processing. Matching then contin- - ues after the subroutine call. - - (*COMMIT), (*SKIP), and (*PRUNE) in a subpattern called as a subroutine - cause the subroutine match to fail. - - (*THEN) skips to the next alternative in the innermost enclosing group - within the subpattern that has alternatives. If there is no such group - within the subpattern, (*THEN) causes the subroutine match to fail. - - -SEE ALSO - - pcreapi(3), pcrecallout(3), pcrematching(3), pcresyntax(3), pcre(3), - pcre16(3), pcre32(3). - - -AUTHOR - - Philip Hazel - University Computing Service - Cambridge CB2 3QH, England. - - -REVISION - - Last updated: 23 October 2016 - Copyright (c) 1997-2016 University of Cambridge. ------------------------------------------------------------------------------- - - -PCRESYNTAX(3) Library Functions Manual PCRESYNTAX(3) - - - -NAME - PCRE - Perl-compatible regular expressions - -PCRE REGULAR EXPRESSION SYNTAX SUMMARY - - The full syntax and semantics of the regular expressions that are sup- - ported by PCRE are described in the pcrepattern documentation. This - document contains a quick-reference summary of the syntax. - - -QUOTING - - \x where x is non-alphanumeric is a literal x - \Q...\E treat enclosed characters as literal - - -CHARACTERS - - \a alarm, that is, the BEL character (hex 07) - \cx "control-x", where x is any ASCII character - \e escape (hex 1B) - \f form feed (hex 0C) - \n newline (hex 0A) - \r carriage return (hex 0D) - \t tab (hex 09) - \0dd character with octal code 0dd - \ddd character with octal code ddd, or backreference - \o{ddd..} character with octal code ddd.. - \xhh character with hex code hh - \x{hhh..} character with hex code hhh.. - - Note that \0dd is always an octal code, and that \8 and \9 are the lit- - eral characters "8" and "9". - - -CHARACTER TYPES - - . any character except newline; - in dotall mode, any character whatsoever - \C one data unit, even in UTF mode (best avoided) - \d a decimal digit - \D a character that is not a decimal digit - \h a horizontal white space character - \H a character that is not a horizontal white space character - \N a character that is not a newline - \p{xx} a character with the xx property - \P{xx} a character without the xx property - \R a newline sequence - \s a white space character - \S a character that is not a white space character - \v a vertical white space character - \V a character that is not a vertical white space character - \w a "word" character - \W a "non-word" character - \X a Unicode extended grapheme cluster - - By default, \d, \s, and \w match only ASCII characters, even in UTF-8 - mode or in the 16- bit and 32-bit libraries. However, if locale-spe- - cific matching is happening, \s and \w may also match characters with - code points in the range 128-255. If the PCRE_UCP option is set, the - behaviour of these escape sequences is changed to use Unicode proper- - ties and they match many more characters. - - -GENERAL CATEGORY PROPERTIES FOR \p and \P - - C Other - Cc Control - Cf Format - Cn Unassigned - Co Private use - Cs Surrogate - - L Letter - Ll Lower case letter - Lm Modifier letter - Lo Other letter - Lt Title case letter - Lu Upper case letter - L& Ll, Lu, or Lt - - M Mark - Mc Spacing mark - Me Enclosing mark - Mn Non-spacing mark - - N Number - Nd Decimal number - Nl Letter number - No Other number - - P Punctuation - Pc Connector punctuation - Pd Dash punctuation - Pe Close punctuation - Pf Final punctuation - Pi Initial punctuation - Po Other punctuation - Ps Open punctuation - - S Symbol - Sc Currency symbol - Sk Modifier symbol - Sm Mathematical symbol - So Other symbol - - Z Separator - Zl Line separator - Zp Paragraph separator - Zs Space separator - - -PCRE SPECIAL CATEGORY PROPERTIES FOR \p and \P - - Xan Alphanumeric: union of properties L and N - Xps POSIX space: property Z or tab, NL, VT, FF, CR - Xsp Perl space: property Z or tab, NL, VT, FF, CR - Xuc Univerally-named character: one that can be - represented by a Universal Character Name - Xwd Perl word: property Xan or underscore - - Perl and POSIX space are now the same. Perl added VT to its space char- - acter set at release 5.18 and PCRE changed at release 8.34. - - -SCRIPT NAMES FOR \p AND \P - - Arabic, Armenian, Avestan, Balinese, Bamum, Bassa_Vah, Batak, Bengali, - Bopomofo, Brahmi, Braille, Buginese, Buhid, Canadian_Aboriginal, Car- - ian, Caucasian_Albanian, Chakma, Cham, Cherokee, Common, Coptic, Cunei- - form, Cypriot, Cyrillic, Deseret, Devanagari, Duployan, Egyptian_Hiero- - glyphs, Elbasan, Ethiopic, Georgian, Glagolitic, Gothic, Grantha, - Greek, Gujarati, Gurmukhi, Han, Hangul, Hanunoo, Hebrew, Hiragana, - Imperial_Aramaic, Inherited, Inscriptional_Pahlavi, Inscrip- - tional_Parthian, Javanese, Kaithi, Kannada, Katakana, Kayah_Li, - Kharoshthi, Khmer, Khojki, Khudawadi, Lao, Latin, Lepcha, Limbu, Lin- - ear_A, Linear_B, Lisu, Lycian, Lydian, Mahajani, Malayalam, Mandaic, - Manichaean, Meetei_Mayek, Mende_Kikakui, Meroitic_Cursive, - Meroitic_Hieroglyphs, Miao, Modi, Mongolian, Mro, Myanmar, Nabataean, - New_Tai_Lue, Nko, Ogham, Ol_Chiki, Old_Italic, Old_North_Arabian, - Old_Permic, Old_Persian, Old_South_Arabian, Old_Turkic, Oriya, Osmanya, - Pahawh_Hmong, Palmyrene, Pau_Cin_Hau, Phags_Pa, Phoenician, - Psalter_Pahlavi, Rejang, Runic, Samaritan, Saurashtra, Sharada, Sha- - vian, Siddham, Sinhala, Sora_Sompeng, Sundanese, Syloti_Nagri, Syriac, - Tagalog, Tagbanwa, Tai_Le, Tai_Tham, Tai_Viet, Takri, Tamil, Telugu, - Thaana, Thai, Tibetan, Tifinagh, Tirhuta, Ugaritic, Vai, Warang_Citi, - Yi. - - -CHARACTER CLASSES - - [...] positive character class - [^...] negative character class - [x-y] range (can be used for hex characters) - [[:xxx:]] positive POSIX named set - [[:^xxx:]] negative POSIX named set - - alnum alphanumeric - alpha alphabetic - ascii 0-127 - blank space or tab - cntrl control character - digit decimal digit - graph printing, excluding space - lower lower case letter - print printing, including space - punct printing, excluding alphanumeric - space white space - upper upper case letter - word same as \w - xdigit hexadecimal digit - - In PCRE, POSIX character set names recognize only ASCII characters by - default, but some of them use Unicode properties if PCRE_UCP is set. - You can use \Q...\E inside a character class. - - -QUANTIFIERS - - ? 0 or 1, greedy - ?+ 0 or 1, possessive - ?? 0 or 1, lazy - * 0 or more, greedy - *+ 0 or more, possessive - *? 0 or more, lazy - + 1 or more, greedy - ++ 1 or more, possessive - +? 1 or more, lazy - {n} exactly n - {n,m} at least n, no more than m, greedy - {n,m}+ at least n, no more than m, possessive - {n,m}? at least n, no more than m, lazy - {n,} n or more, greedy - {n,}+ n or more, possessive - {n,}? n or more, lazy - - -ANCHORS AND SIMPLE ASSERTIONS - - \b word boundary - \B not a word boundary - ^ start of subject - also after internal newline in multiline mode - \A start of subject - $ end of subject - also before newline at end of subject - also before internal newline in multiline mode - \Z end of subject - also before newline at end of subject - \z end of subject - \G first matching position in subject - - -MATCH POINT RESET - - \K reset start of match - - \K is honoured in positive assertions, but ignored in negative ones. - - -ALTERNATION - - expr|expr|expr... - - -CAPTURING - - (...) capturing group - (?...) named capturing group (Perl) - (?'name'...) named capturing group (Perl) - (?P...) named capturing group (Python) - (?:...) non-capturing group - (?|...) non-capturing group; reset group numbers for - capturing groups in each alternative - - -ATOMIC GROUPS - - (?>...) atomic, non-capturing group - - -COMMENT - - (?#....) comment (not nestable) - - -OPTION SETTING - - (?i) caseless - (?J) allow duplicate names - (?m) multiline - (?s) single line (dotall) - (?U) default ungreedy (lazy) - (?x) extended (ignore white space) - (?-...) unset option(s) - - The following are recognized only at the very start of a pattern or - after one of the newline or \R options with similar syntax. More than - one of them may appear. - - (*LIMIT_MATCH=d) set the match limit to d (decimal number) - (*LIMIT_RECURSION=d) set the recursion limit to d (decimal number) - (*NO_AUTO_POSSESS) no auto-possessification (PCRE_NO_AUTO_POSSESS) - (*NO_START_OPT) no start-match optimization (PCRE_NO_START_OPTIMIZE) - (*UTF8) set UTF-8 mode: 8-bit library (PCRE_UTF8) - (*UTF16) set UTF-16 mode: 16-bit library (PCRE_UTF16) - (*UTF32) set UTF-32 mode: 32-bit library (PCRE_UTF32) - (*UTF) set appropriate UTF mode for the library in use - (*UCP) set PCRE_UCP (use Unicode properties for \d etc) - - Note that LIMIT_MATCH and LIMIT_RECURSION can only reduce the value of - the limits set by the caller of pcre_exec(), not increase them. - - -NEWLINE CONVENTION - - These are recognized only at the very start of the pattern or after - option settings with a similar syntax. - - (*CR) carriage return only - (*LF) linefeed only - (*CRLF) carriage return followed by linefeed - (*ANYCRLF) all three of the above - (*ANY) any Unicode newline sequence - - -WHAT \R MATCHES - - These are recognized only at the very start of the pattern or after - option setting with a similar syntax. - - (*BSR_ANYCRLF) CR, LF, or CRLF - (*BSR_UNICODE) any Unicode newline sequence - - -LOOKAHEAD AND LOOKBEHIND ASSERTIONS - - (?=...) positive look ahead - (?!...) negative look ahead - (?<=...) positive look behind - (? reference by name (Perl) - \k'name' reference by name (Perl) - \g{name} reference by name (Perl) - \k{name} reference by name (.NET) - (?P=name) reference by name (Python) - - -SUBROUTINE REFERENCES (POSSIBLY RECURSIVE) - - (?R) recurse whole pattern - (?n) call subpattern by absolute number - (?+n) call subpattern by relative number - (?-n) call subpattern by relative number - (?&name) call subpattern by name (Perl) - (?P>name) call subpattern by name (Python) - \g call subpattern by name (Oniguruma) - \g'name' call subpattern by name (Oniguruma) - \g call subpattern by absolute number (Oniguruma) - \g'n' call subpattern by absolute number (Oniguruma) - \g<+n> call subpattern by relative number (PCRE extension) - \g'+n' call subpattern by relative number (PCRE extension) - \g<-n> call subpattern by relative number (PCRE extension) - \g'-n' call subpattern by relative number (PCRE extension) - - -CONDITIONAL PATTERNS - - (?(condition)yes-pattern) - (?(condition)yes-pattern|no-pattern) - - (?(n)... absolute reference condition - (?(+n)... relative reference condition - (?(-n)... relative reference condition - (?()... named reference condition (Perl) - (?('name')... named reference condition (Perl) - (?(name)... named reference condition (PCRE) - (?(R)... overall recursion condition - (?(Rn)... specific group recursion condition - (?(R&name)... specific recursion condition - (?(DEFINE)... define subpattern for reference - (?(assert)... assertion condition - - -BACKTRACKING CONTROL - - The following act immediately they are reached: - - (*ACCEPT) force successful match - (*FAIL) force backtrack; synonym (*F) - (*MARK:NAME) set name to be passed back; synonym (*:NAME) - - The following act only when a subsequent match failure causes a back- - track to reach them. They all force a match failure, but they differ in - what happens afterwards. Those that advance the start-of-match point do - so only if the pattern is not anchored. - - (*COMMIT) overall failure, no advance of starting point - (*PRUNE) advance to next starting character - (*PRUNE:NAME) equivalent to (*MARK:NAME)(*PRUNE) - (*SKIP) advance to current matching position - (*SKIP:NAME) advance to position corresponding to an earlier - (*MARK:NAME); if not found, the (*SKIP) is ignored - (*THEN) local failure, backtrack to next alternation - (*THEN:NAME) equivalent to (*MARK:NAME)(*THEN) - - -CALLOUTS - - (?C) callout - (?Cn) callout with data n - - -SEE ALSO - - pcrepattern(3), pcreapi(3), pcrecallout(3), pcrematching(3), pcre(3). - - -AUTHOR - - Philip Hazel - University Computing Service - Cambridge CB2 3QH, England. - - -REVISION - - Last updated: 08 January 2014 - Copyright (c) 1997-2014 University of Cambridge. ------------------------------------------------------------------------------- - - -PCREUNICODE(3) Library Functions Manual PCREUNICODE(3) - - - -NAME - PCRE - Perl-compatible regular expressions - -UTF-8, UTF-16, UTF-32, AND UNICODE PROPERTY SUPPORT - - As well as UTF-8 support, PCRE also supports UTF-16 (from release 8.30) - and UTF-32 (from release 8.32), by means of two additional libraries. - They can be built as well as, or instead of, the 8-bit library. - - -UTF-8 SUPPORT - - In order process UTF-8 strings, you must build PCRE's 8-bit library - with UTF support, and, in addition, you must call pcre_compile() with - the PCRE_UTF8 option flag, or the pattern must start with the sequence - (*UTF8) or (*UTF). When either of these is the case, both the pattern - and any subject strings that are matched against it are treated as - UTF-8 strings instead of strings of individual 1-byte characters. - - -UTF-16 AND UTF-32 SUPPORT - - In order process UTF-16 or UTF-32 strings, you must build PCRE's 16-bit - or 32-bit library with UTF support, and, in addition, you must call - pcre16_compile() or pcre32_compile() with the PCRE_UTF16 or PCRE_UTF32 - option flag, as appropriate. Alternatively, the pattern must start with - the sequence (*UTF16), (*UTF32), as appropriate, or (*UTF), which can - be used with either library. When UTF mode is set, both the pattern and - any subject strings that are matched against it are treated as UTF-16 - or UTF-32 strings instead of strings of individual 16-bit or 32-bit - characters. - - -UTF SUPPORT OVERHEAD - - If you compile PCRE with UTF support, but do not use it at run time, - the library will be a bit bigger, but the additional run time overhead - is limited to testing the PCRE_UTF[8|16|32] flag occasionally, so - should not be very big. - - -UNICODE PROPERTY SUPPORT - - If PCRE is built with Unicode character property support (which implies - UTF support), the escape sequences \p{..}, \P{..}, and \X can be used. - The available properties that can be tested are limited to the general - category properties such as Lu for an upper case letter or Nd for a - decimal number, the Unicode script names such as Arabic or Han, and the - derived properties Any and L&. Full lists is given in the pcrepattern - and pcresyntax documentation. Only the short names for properties are - supported. For example, \p{L} matches a letter. Its Perl synonym, - \p{Letter}, is not supported. Furthermore, in Perl, many properties - may optionally be prefixed by "Is", for compatibility with Perl 5.6. - PCRE does not support this. - - Validity of UTF-8 strings - - When you set the PCRE_UTF8 flag, the byte strings passed as patterns - and subjects are (by default) checked for validity on entry to the rel- - evant functions. The entire string is checked before any other process- - ing takes place. From release 7.3 of PCRE, the check is according the - rules of RFC 3629, which are themselves derived from the Unicode speci- - fication. Earlier releases of PCRE followed the rules of RFC 2279, - which allows the full range of 31-bit values (0 to 0x7FFFFFFF). The - current check allows only values in the range U+0 to U+10FFFF, exclud- - ing the surrogate area. (From release 8.33 the so-called "non-charac- - ter" code points are no longer excluded because Unicode corrigendum #9 - makes it clear that they should not be.) - - Characters in the "Surrogate Area" of Unicode are reserved for use by - UTF-16, where they are used in pairs to encode codepoints with values - greater than 0xFFFF. The code points that are encoded by UTF-16 pairs - are available independently in the UTF-8 and UTF-32 encodings. (In - other words, the whole surrogate thing is a fudge for UTF-16 which - unfortunately messes up UTF-8 and UTF-32.) - - If an invalid UTF-8 string is passed to PCRE, an error return is given. - At compile time, the only additional information is the offset to the - first byte of the failing character. The run-time functions pcre_exec() - and pcre_dfa_exec() also pass back this information, as well as a more - detailed reason code if the caller has provided memory in which to do - this. - - In some situations, you may already know that your strings are valid, - and therefore want to skip these checks in order to improve perfor- - mance, for example in the case of a long subject string that is being - scanned repeatedly. If you set the PCRE_NO_UTF8_CHECK flag at compile - time or at run time, PCRE assumes that the pattern or subject it is - given (respectively) contains only valid UTF-8 codes. In this case, it - does not diagnose an invalid UTF-8 string. - - Note that passing PCRE_NO_UTF8_CHECK to pcre_compile() just disables - the check for the pattern; it does not also apply to subject strings. - If you want to disable the check for a subject string you must pass - this option to pcre_exec() or pcre_dfa_exec(). - - If you pass an invalid UTF-8 string when PCRE_NO_UTF8_CHECK is set, the - result is undefined and your program may crash. - - Validity of UTF-16 strings - - When you set the PCRE_UTF16 flag, the strings of 16-bit data units that - are passed as patterns and subjects are (by default) checked for valid- - ity on entry to the relevant functions. Values other than those in the - surrogate range U+D800 to U+DFFF are independent code points. Values in - the surrogate range must be used in pairs in the correct manner. - - If an invalid UTF-16 string is passed to PCRE, an error return is - given. At compile time, the only additional information is the offset - to the first data unit of the failing character. The run-time functions - pcre16_exec() and pcre16_dfa_exec() also pass back this information, as - well as a more detailed reason code if the caller has provided memory - in which to do this. - - In some situations, you may already know that your strings are valid, - and therefore want to skip these checks in order to improve perfor- - mance. If you set the PCRE_NO_UTF16_CHECK flag at compile time or at - run time, PCRE assumes that the pattern or subject it is given (respec- - tively) contains only valid UTF-16 sequences. In this case, it does not - diagnose an invalid UTF-16 string. However, if an invalid string is - passed, the result is undefined. - - Validity of UTF-32 strings - - When you set the PCRE_UTF32 flag, the strings of 32-bit data units that - are passed as patterns and subjects are (by default) checked for valid- - ity on entry to the relevant functions. This check allows only values - in the range U+0 to U+10FFFF, excluding the surrogate area U+D800 to - U+DFFF. - - If an invalid UTF-32 string is passed to PCRE, an error return is - given. At compile time, the only additional information is the offset - to the first data unit of the failing character. The run-time functions - pcre32_exec() and pcre32_dfa_exec() also pass back this information, as - well as a more detailed reason code if the caller has provided memory - in which to do this. - - In some situations, you may already know that your strings are valid, - and therefore want to skip these checks in order to improve perfor- - mance. If you set the PCRE_NO_UTF32_CHECK flag at compile time or at - run time, PCRE assumes that the pattern or subject it is given (respec- - tively) contains only valid UTF-32 sequences. In this case, it does not - diagnose an invalid UTF-32 string. However, if an invalid string is - passed, the result is undefined. - - General comments about UTF modes - - 1. Codepoints less than 256 can be specified in patterns by either - braced or unbraced hexadecimal escape sequences (for example, \x{b3} or - \xb3). Larger values have to use braced sequences. - - 2. Octal numbers up to \777 are recognized, and in UTF-8 mode they - match two-byte characters for values greater than \177. - - 3. Repeat quantifiers apply to complete UTF characters, not to individ- - ual data units, for example: \x{100}{3}. - - 4. The dot metacharacter matches one UTF character instead of a single - data unit. - - 5. The escape sequence \C can be used to match a single byte in UTF-8 - mode, or a single 16-bit data unit in UTF-16 mode, or a single 32-bit - data unit in UTF-32 mode, but its use can lead to some strange effects - because it breaks up multi-unit characters (see the description of \C - in the pcrepattern documentation). The use of \C is not supported in - the alternative matching function pcre[16|32]_dfa_exec(), nor is it - supported in UTF mode by the JIT optimization of pcre[16|32]_exec(). If - JIT optimization is requested for a UTF pattern that contains \C, it - will not succeed, and so the matching will be carried out by the normal - interpretive function. - - 6. The character escapes \b, \B, \d, \D, \s, \S, \w, and \W correctly - test characters of any code value, but, by default, the characters that - PCRE recognizes as digits, spaces, or word characters remain the same - set as in non-UTF mode, all with values less than 256. This remains - true even when PCRE is built to include Unicode property support, - because to do otherwise would slow down PCRE in many common cases. Note - in particular that this applies to \b and \B, because they are defined - in terms of \w and \W. If you really want to test for a wider sense of, - say, "digit", you can use explicit Unicode property tests such as - \p{Nd}. Alternatively, if you set the PCRE_UCP option, the way that the - character escapes work is changed so that Unicode properties are used - to determine which characters match. There are more details in the sec- - tion on generic character types in the pcrepattern documentation. - - 7. Similarly, characters that match the POSIX named character classes - are all low-valued characters, unless the PCRE_UCP option is set. - - 8. However, the horizontal and vertical white space matching escapes - (\h, \H, \v, and \V) do match all the appropriate Unicode characters, - whether or not PCRE_UCP is set. - - 9. Case-insensitive matching applies only to characters whose values - are less than 128, unless PCRE is built with Unicode property support. - A few Unicode characters such as Greek sigma have more than two code- - points that are case-equivalent. Up to and including PCRE release 8.31, - only one-to-one case mappings were supported, but later releases (with - Unicode property support) do treat as case-equivalent all versions of - characters such as Greek sigma. - - -AUTHOR - - Philip Hazel - University Computing Service - Cambridge CB2 3QH, England. - - -REVISION - - Last updated: 27 February 2013 - Copyright (c) 1997-2013 University of Cambridge. ------------------------------------------------------------------------------- - - -PCREJIT(3) Library Functions Manual PCREJIT(3) - - - -NAME - PCRE - Perl-compatible regular expressions - -PCRE JUST-IN-TIME COMPILER SUPPORT - - Just-in-time compiling is a heavyweight optimization that can greatly - speed up pattern matching. However, it comes at the cost of extra pro- - cessing before the match is performed. Therefore, it is of most benefit - when the same pattern is going to be matched many times. This does not - necessarily mean many calls of a matching function; if the pattern is - not anchored, matching attempts may take place many times at various - positions in the subject, even for a single call. Therefore, if the - subject string is very long, it may still pay to use JIT for one-off - matches. - - JIT support applies only to the traditional Perl-compatible matching - function. It does not apply when the DFA matching function is being - used. The code for this support was written by Zoltan Herczeg. - - -8-BIT, 16-BIT AND 32-BIT SUPPORT - - JIT support is available for all of the 8-bit, 16-bit and 32-bit PCRE - libraries. To keep this documentation simple, only the 8-bit interface - is described in what follows. If you are using the 16-bit library, sub- - stitute the 16-bit functions and 16-bit structures (for example, - pcre16_jit_stack instead of pcre_jit_stack). If you are using the - 32-bit library, substitute the 32-bit functions and 32-bit structures - (for example, pcre32_jit_stack instead of pcre_jit_stack). - - -AVAILABILITY OF JIT SUPPORT - - JIT support is an optional feature of PCRE. The "configure" option - --enable-jit (or equivalent CMake option) must be set when PCRE is - built if you want to use JIT. The support is limited to the following - hardware platforms: - - ARM v5, v7, and Thumb2 - Intel x86 32-bit and 64-bit - MIPS 32-bit - Power PC 32-bit and 64-bit - SPARC 32-bit (experimental) - - If --enable-jit is set on an unsupported platform, compilation fails. - - A program that is linked with PCRE 8.20 or later can tell if JIT sup- - port is available by calling pcre_config() with the PCRE_CONFIG_JIT - option. The result is 1 when JIT is available, and 0 otherwise. How- - ever, a simple program does not need to check this in order to use JIT. - The normal API is implemented in a way that falls back to the interpre- - tive code if JIT is not available. For programs that need the best pos- - sible performance, there is also a "fast path" API that is JIT-spe- - cific. - - If your program may sometimes be linked with versions of PCRE that are - older than 8.20, but you want to use JIT when it is available, you can - test the values of PCRE_MAJOR and PCRE_MINOR, or the existence of a JIT - macro such as PCRE_CONFIG_JIT, for compile-time control of your code. - Also beware that the pcre_jit_exec() function was not available at all - before 8.32, and may not be available at all if PCRE isn't compiled - with --enable-jit. See the "JIT FAST PATH API" section below for - details. - - -SIMPLE USE OF JIT - - You have to do two things to make use of the JIT support in the sim- - plest way: - - (1) Call pcre_study() with the PCRE_STUDY_JIT_COMPILE option for - each compiled pattern, and pass the resulting pcre_extra block to - pcre_exec(). - - (2) Use pcre_free_study() to free the pcre_extra block when it is - no longer needed, instead of just freeing it yourself. This - ensures that - any JIT data is also freed. - - For a program that may be linked with pre-8.20 versions of PCRE, you - can insert - - #ifndef PCRE_STUDY_JIT_COMPILE - #define PCRE_STUDY_JIT_COMPILE 0 - #endif - - so that no option is passed to pcre_study(), and then use something - like this to free the study data: - - #ifdef PCRE_CONFIG_JIT - pcre_free_study(study_ptr); - #else - pcre_free(study_ptr); - #endif - - PCRE_STUDY_JIT_COMPILE requests the JIT compiler to generate code for - complete matches. If you want to run partial matches using the - PCRE_PARTIAL_HARD or PCRE_PARTIAL_SOFT options of pcre_exec(), you - should set one or both of the following options in addition to, or - instead of, PCRE_STUDY_JIT_COMPILE when you call pcre_study(): - - PCRE_STUDY_JIT_PARTIAL_HARD_COMPILE - PCRE_STUDY_JIT_PARTIAL_SOFT_COMPILE - - If using pcre_jit_exec() and supporting a pre-8.32 version of PCRE, you - can insert: - - #if PCRE_MAJOR >= 8 && PCRE_MINOR >= 32 - pcre_jit_exec(...); - #else - pcre_exec(...) - #endif - - but as described in the "JIT FAST PATH API" section below this assumes - version 8.32 and later are compiled with --enable-jit, which may break. - - The JIT compiler generates different optimized code for each of the - three modes (normal, soft partial, hard partial). When pcre_exec() is - called, the appropriate code is run if it is available. Otherwise, the - pattern is matched using interpretive code. - - In some circumstances you may need to call additional functions. These - are described in the section entitled "Controlling the JIT stack" - below. - - If JIT support is not available, PCRE_STUDY_JIT_COMPILE etc. are - ignored, and no JIT data is created. Otherwise, the compiled pattern is - passed to the JIT compiler, which turns it into machine code that exe- - cutes much faster than the normal interpretive code. When pcre_exec() - is passed a pcre_extra block containing a pointer to JIT code of the - appropriate mode (normal or hard/soft partial), it obeys that code - instead of running the interpreter. The result is identical, but the - compiled JIT code runs much faster. - - There are some pcre_exec() options that are not supported for JIT exe- - cution. There are also some pattern items that JIT cannot handle. - Details are given below. In both cases, execution automatically falls - back to the interpretive code. If you want to know whether JIT was - actually used for a particular match, you should arrange for a JIT - callback function to be set up as described in the section entitled - "Controlling the JIT stack" below, even if you do not need to supply a - non-default JIT stack. Such a callback function is called whenever JIT - code is about to be obeyed. If the execution options are not right for - JIT execution, the callback function is not obeyed. - - If the JIT compiler finds an unsupported item, no JIT data is gener- - ated. You can find out if JIT execution is available after studying a - pattern by calling pcre_fullinfo() with the PCRE_INFO_JIT option. A - result of 1 means that JIT compilation was successful. A result of 0 - means that JIT support is not available, or the pattern was not studied - with PCRE_STUDY_JIT_COMPILE etc., or the JIT compiler was not able to - handle the pattern. - - Once a pattern has been studied, with or without JIT, it can be used as - many times as you like for matching different subject strings. - - -UNSUPPORTED OPTIONS AND PATTERN ITEMS - - The only pcre_exec() options that are supported for JIT execution are - PCRE_NO_UTF8_CHECK, PCRE_NO_UTF16_CHECK, PCRE_NO_UTF32_CHECK, PCRE_NOT- - BOL, PCRE_NOTEOL, PCRE_NOTEMPTY, PCRE_NOTEMPTY_ATSTART, PCRE_PAR- - TIAL_HARD, and PCRE_PARTIAL_SOFT. - - The only unsupported pattern items are \C (match a single data unit) - when running in a UTF mode, and a callout immediately before an asser- - tion condition in a conditional group. - - -RETURN VALUES FROM JIT EXECUTION - - When a pattern is matched using JIT execution, the return values are - the same as those given by the interpretive pcre_exec() code, with the - addition of one new error code: PCRE_ERROR_JIT_STACKLIMIT. This means - that the memory used for the JIT stack was insufficient. See "Control- - ling the JIT stack" below for a discussion of JIT stack usage. For com- - patibility with the interpretive pcre_exec() code, no more than two- - thirds of the ovector argument is used for passing back captured sub- - strings. - - The error code PCRE_ERROR_MATCHLIMIT is returned by the JIT code if - searching a very large pattern tree goes on for too long, as it is in - the same circumstance when JIT is not used, but the details of exactly - what is counted are not the same. The PCRE_ERROR_RECURSIONLIMIT error - code is never returned by JIT execution. - - -SAVING AND RESTORING COMPILED PATTERNS - - The code that is generated by the JIT compiler is architecture-spe- - cific, and is also position dependent. For those reasons it cannot be - saved (in a file or database) and restored later like the bytecode and - other data of a compiled pattern. Saving and restoring compiled pat- - terns is not something many people do. More detail about this facility - is given in the pcreprecompile documentation. It should be possible to - run pcre_study() on a saved and restored pattern, and thereby recreate - the JIT data, but because JIT compilation uses significant resources, - it is probably not worth doing this; you might as well recompile the - original pattern. - - -CONTROLLING THE JIT STACK - - When the compiled JIT code runs, it needs a block of memory to use as a - stack. By default, it uses 32K on the machine stack. However, some - large or complicated patterns need more than this. The error - PCRE_ERROR_JIT_STACKLIMIT is given when there is not enough stack. - Three functions are provided for managing blocks of memory for use as - JIT stacks. There is further discussion about the use of JIT stacks in - the section entitled "JIT stack FAQ" below. - - The pcre_jit_stack_alloc() function creates a JIT stack. Its arguments - are a starting size and a maximum size, and it returns a pointer to an - opaque structure of type pcre_jit_stack, or NULL if there is an error. - The pcre_jit_stack_free() function can be used to free a stack that is - no longer needed. (For the technically minded: the address space is - allocated by mmap or VirtualAlloc.) - - JIT uses far less memory for recursion than the interpretive code, and - a maximum stack size of 512K to 1M should be more than enough for any - pattern. - - The pcre_assign_jit_stack() function specifies which stack JIT code - should use. Its arguments are as follows: - - pcre_extra *extra - pcre_jit_callback callback - void *data - - The extra argument must be the result of studying a pattern with - PCRE_STUDY_JIT_COMPILE etc. There are three cases for the values of the - other two options: - - (1) If callback is NULL and data is NULL, an internal 32K block - on the machine stack is used. - - (2) If callback is NULL and data is not NULL, data must be - a valid JIT stack, the result of calling pcre_jit_stack_alloc(). - - (3) If callback is not NULL, it must point to a function that is - called with data as an argument at the start of matching, in - order to set up a JIT stack. If the return from the callback - function is NULL, the internal 32K stack is used; otherwise the - return value must be a valid JIT stack, the result of calling - pcre_jit_stack_alloc(). - - A callback function is obeyed whenever JIT code is about to be run; it - is not obeyed when pcre_exec() is called with options that are incom- - patible for JIT execution. A callback function can therefore be used to - determine whether a match operation was executed by JIT or by the - interpreter. - - You may safely use the same JIT stack for more than one pattern (either - by assigning directly or by callback), as long as the patterns are all - matched sequentially in the same thread. In a multithread application, - if you do not specify a JIT stack, or if you assign or pass back NULL - from a callback, that is thread-safe, because each thread has its own - machine stack. However, if you assign or pass back a non-NULL JIT - stack, this must be a different stack for each thread so that the - application is thread-safe. - - Strictly speaking, even more is allowed. You can assign the same non- - NULL stack to any number of patterns as long as they are not used for - matching by multiple threads at the same time. For example, you can - assign the same stack to all compiled patterns, and use a global mutex - in the callback to wait until the stack is available for use. However, - this is an inefficient solution, and not recommended. - - This is a suggestion for how a multithreaded program that needs to set - up non-default JIT stacks might operate: - - During thread initalization - thread_local_var = pcre_jit_stack_alloc(...) - - During thread exit - pcre_jit_stack_free(thread_local_var) - - Use a one-line callback function - return thread_local_var - - All the functions described in this section do nothing if JIT is not - available, and pcre_assign_jit_stack() does nothing unless the extra - argument is non-NULL and points to a pcre_extra block that is the - result of a successful study with PCRE_STUDY_JIT_COMPILE etc. - - -JIT STACK FAQ - - (1) Why do we need JIT stacks? - - PCRE (and JIT) is a recursive, depth-first engine, so it needs a stack - where the local data of the current node is pushed before checking its - child nodes. Allocating real machine stack on some platforms is diffi- - cult. For example, the stack chain needs to be updated every time if we - extend the stack on PowerPC. Although it is possible, its updating - time overhead decreases performance. So we do the recursion in memory. - - (2) Why don't we simply allocate blocks of memory with malloc()? - - Modern operating systems have a nice feature: they can reserve an - address space instead of allocating memory. We can safely allocate mem- - ory pages inside this address space, so the stack could grow without - moving memory data (this is important because of pointers). Thus we can - allocate 1M address space, and use only a single memory page (usually - 4K) if that is enough. However, we can still grow up to 1M anytime if - needed. - - (3) Who "owns" a JIT stack? - - The owner of the stack is the user program, not the JIT studied pattern - or anything else. The user program must ensure that if a stack is used - by pcre_exec(), (that is, it is assigned to the pattern currently run- - ning), that stack must not be used by any other threads (to avoid over- - writing the same memory area). The best practice for multithreaded pro- - grams is to allocate a stack for each thread, and return this stack - through the JIT callback function. - - (4) When should a JIT stack be freed? - - You can free a JIT stack at any time, as long as it will not be used by - pcre_exec() again. When you assign the stack to a pattern, only a - pointer is set. There is no reference counting or any other magic. You - can free the patterns and stacks in any order, anytime. Just do not - call pcre_exec() with a pattern pointing to an already freed stack, as - that will cause SEGFAULT. (Also, do not free a stack currently used by - pcre_exec() in another thread). You can also replace the stack for a - pattern at any time. You can even free the previous stack before - assigning a replacement. - - (5) Should I allocate/free a stack every time before/after calling - pcre_exec()? - - No, because this is too costly in terms of resources. However, you - could implement some clever idea which release the stack if it is not - used in let's say two minutes. The JIT callback can help to achieve - this without keeping a list of the currently JIT studied patterns. - - (6) OK, the stack is for long term memory allocation. But what happens - if a pattern causes stack overflow with a stack of 1M? Is that 1M kept - until the stack is freed? - - Especially on embedded sytems, it might be a good idea to release mem- - ory sometimes without freeing the stack. There is no API for this at - the moment. Probably a function call which returns with the currently - allocated memory for any stack and another which allows releasing mem- - ory (shrinking the stack) would be a good idea if someone needs this. - - (7) This is too much of a headache. Isn't there any better solution for - JIT stack handling? - - No, thanks to Windows. If POSIX threads were used everywhere, we could - throw out this complicated API. - - -EXAMPLE CODE - - This is a single-threaded example that specifies a JIT stack without - using a callback. - - int rc; - int ovector[30]; - pcre *re; - pcre_extra *extra; - pcre_jit_stack *jit_stack; - - re = pcre_compile(pattern, 0, &error, &erroffset, NULL); - /* Check for errors */ - extra = pcre_study(re, PCRE_STUDY_JIT_COMPILE, &error); - jit_stack = pcre_jit_stack_alloc(32*1024, 512*1024); - /* Check for error (NULL) */ - pcre_assign_jit_stack(extra, NULL, jit_stack); - rc = pcre_exec(re, extra, subject, length, 0, 0, ovector, 30); - /* Check results */ - pcre_free(re); - pcre_free_study(extra); - pcre_jit_stack_free(jit_stack); - - -JIT FAST PATH API - - Because the API described above falls back to interpreted execution - when JIT is not available, it is convenient for programs that are writ- - ten for general use in many environments. However, calling JIT via - pcre_exec() does have a performance impact. Programs that are written - for use where JIT is known to be available, and which need the best - possible performance, can instead use a "fast path" API to call JIT - execution directly instead of calling pcre_exec() (obviously only for - patterns that have been successfully studied by JIT). - - The fast path function is called pcre_jit_exec(), and it takes exactly - the same arguments as pcre_exec(), plus one additional argument that - must point to a JIT stack. The JIT stack arrangements described above - do not apply. The return values are the same as for pcre_exec(). - - When you call pcre_exec(), as well as testing for invalid options, a - number of other sanity checks are performed on the arguments. For exam- - ple, if the subject pointer is NULL, or its length is negative, an - immediate error is given. Also, unless PCRE_NO_UTF[8|16|32] is set, a - UTF subject string is tested for validity. In the interests of speed, - these checks do not happen on the JIT fast path, and if invalid data is - passed, the result is undefined. - - Bypassing the sanity checks and the pcre_exec() wrapping can give - speedups of more than 10%. - - Note that the pcre_jit_exec() function is not available in versions of - PCRE before 8.32 (released in November 2012). If you need to support - versions that old you must either use the slower pcre_exec(), or switch - between the two codepaths by checking the values of PCRE_MAJOR and - PCRE_MINOR. - - Due to an unfortunate implementation oversight, even in versions 8.32 - and later there will be no pcre_jit_exec() stub function defined when - PCRE is compiled with --disable-jit, which is the default, and there's - no way to detect whether PCRE was compiled with --enable-jit via a - macro. - - If you need to support versions older than 8.32, or versions that may - not build with --enable-jit, you must either use the slower - pcre_exec(), or switch between the two codepaths by checking the values - of PCRE_MAJOR and PCRE_MINOR. - - Switching between the two by checking the version assumes that all the - versions being targeted are built with --enable-jit. To also support - builds that may use --disable-jit either pcre_exec() must be used, or a - compile-time check for JIT via pcre_config() (which assumes the runtime - environment will be the same), or as the Git project decided to do, - simply assume that pcre_jit_exec() is present in 8.32 or later unless a - compile-time flag is provided, see the "grep: un-break building with - PCRE >= 8.32 without --enable-jit" commit in git.git for an example of - that. - - -SEE ALSO - - pcreapi(3) - - -AUTHOR - - Philip Hazel (FAQ by Zoltan Herczeg) - University Computing Service - Cambridge CB2 3QH, England. - - -REVISION - - Last updated: 05 July 2017 - Copyright (c) 1997-2017 University of Cambridge. ------------------------------------------------------------------------------- - - -PCREPARTIAL(3) Library Functions Manual PCREPARTIAL(3) - - - -NAME - PCRE - Perl-compatible regular expressions - -PARTIAL MATCHING IN PCRE - - In normal use of PCRE, if the subject string that is passed to a match- - ing function matches as far as it goes, but is too short to match the - entire pattern, PCRE_ERROR_NOMATCH is returned. There are circumstances - where it might be helpful to distinguish this case from other cases in - which there is no match. - - Consider, for example, an application where a human is required to type - in data for a field with specific formatting requirements. An example - might be a date in the form ddmmmyy, defined by this pattern: - - ^\d?\d(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)\d\d$ - - If the application sees the user's keystrokes one by one, and can check - that what has been typed so far is potentially valid, it is able to - raise an error as soon as a mistake is made, by beeping and not - reflecting the character that has been typed, for example. This immedi- - ate feedback is likely to be a better user interface than a check that - is delayed until the entire string has been entered. Partial matching - can also be useful when the subject string is very long and is not all - available at once. - - PCRE supports partial matching by means of the PCRE_PARTIAL_SOFT and - PCRE_PARTIAL_HARD options, which can be set when calling any of the - matching functions. For backwards compatibility, PCRE_PARTIAL is a syn- - onym for PCRE_PARTIAL_SOFT. The essential difference between the two - options is whether or not a partial match is preferred to an alterna- - tive complete match, though the details differ between the two types of - matching function. If both options are set, PCRE_PARTIAL_HARD takes - precedence. - - If you want to use partial matching with just-in-time optimized code, - you must call pcre_study(), pcre16_study() or pcre32_study() with one - or both of these options: - - PCRE_STUDY_JIT_PARTIAL_SOFT_COMPILE - PCRE_STUDY_JIT_PARTIAL_HARD_COMPILE - - PCRE_STUDY_JIT_COMPILE should also be set if you are going to run non- - partial matches on the same pattern. If the appropriate JIT study mode - has not been set for a match, the interpretive matching code is used. - - Setting a partial matching option disables two of PCRE's standard opti- - mizations. PCRE remembers the last literal data unit in a pattern, and - abandons matching immediately if it is not present in the subject - string. This optimization cannot be used for a subject string that - might match only partially. If the pattern was studied, PCRE knows the - minimum length of a matching string, and does not bother to run the - matching function on shorter strings. This optimization is also dis- - abled for partial matching. - - -PARTIAL MATCHING USING pcre_exec() OR pcre[16|32]_exec() - - A partial match occurs during a call to pcre_exec() or - pcre[16|32]_exec() when the end of the subject string is reached suc- - cessfully, but matching cannot continue because more characters are - needed. However, at least one character in the subject must have been - inspected. This character need not form part of the final matched - string; lookbehind assertions and the \K escape sequence provide ways - of inspecting characters before the start of a matched substring. The - requirement for inspecting at least one character exists because an - empty string can always be matched; without such a restriction there - would always be a partial match of an empty string at the end of the - subject. - - If there are at least two slots in the offsets vector when a partial - match is returned, the first slot is set to the offset of the earliest - character that was inspected. For convenience, the second offset points - to the end of the subject so that a substring can easily be identified. - If there are at least three slots in the offsets vector, the third slot - is set to the offset of the character where matching started. - - For the majority of patterns, the contents of the first and third slots - will be the same. However, for patterns that contain lookbehind asser- - tions, or begin with \b or \B, characters before the one where matching - started may have been inspected while carrying out the match. For exam- - ple, consider this pattern: - - /(?<=abc)123/ - - This pattern matches "123", but only if it is preceded by "abc". If the - subject string is "xyzabc12", the first two offsets after a partial - match are for the substring "abc12", because all these characters were - inspected. However, the third offset is set to 6, because that is the - offset where matching began. - - What happens when a partial match is identified depends on which of the - two partial matching options are set. - - PCRE_PARTIAL_SOFT WITH pcre_exec() OR pcre[16|32]_exec() - - If PCRE_PARTIAL_SOFT is set when pcre_exec() or pcre[16|32]_exec() - identifies a partial match, the partial match is remembered, but match- - ing continues as normal, and other alternatives in the pattern are - tried. If no complete match can be found, PCRE_ERROR_PARTIAL is - returned instead of PCRE_ERROR_NOMATCH. - - This option is "soft" because it prefers a complete match over a par- - tial match. All the various matching items in a pattern behave as if - the subject string is potentially complete. For example, \z, \Z, and $ - match at the end of the subject, as normal, and for \b and \B the end - of the subject is treated as a non-alphanumeric. - - If there is more than one partial match, the first one that was found - provides the data that is returned. Consider this pattern: - - /123\w+X|dogY/ - - If this is matched against the subject string "abc123dog", both alter- - natives fail to match, but the end of the subject is reached during - matching, so PCRE_ERROR_PARTIAL is returned. The offsets are set to 3 - and 9, identifying "123dog" as the first partial match that was found. - (In this example, there are two partial matches, because "dog" on its - own partially matches the second alternative.) - - PCRE_PARTIAL_HARD WITH pcre_exec() OR pcre[16|32]_exec() - - If PCRE_PARTIAL_HARD is set for pcre_exec() or pcre[16|32]_exec(), - PCRE_ERROR_PARTIAL is returned as soon as a partial match is found, - without continuing to search for possible complete matches. This option - is "hard" because it prefers an earlier partial match over a later com- - plete match. For this reason, the assumption is made that the end of - the supplied subject string may not be the true end of the available - data, and so, if \z, \Z, \b, \B, or $ are encountered at the end of the - subject, the result is PCRE_ERROR_PARTIAL, provided that at least one - character in the subject has been inspected. - - Setting PCRE_PARTIAL_HARD also affects the way UTF-8 and UTF-16 subject - strings are checked for validity. Normally, an invalid sequence causes - the error PCRE_ERROR_BADUTF8 or PCRE_ERROR_BADUTF16. However, in the - special case of a truncated character at the end of the subject, - PCRE_ERROR_SHORTUTF8 or PCRE_ERROR_SHORTUTF16 is returned when - PCRE_PARTIAL_HARD is set. - - Comparing hard and soft partial matching - - The difference between the two partial matching options can be illus- - trated by a pattern such as: - - /dog(sbody)?/ - - This matches either "dog" or "dogsbody", greedily (that is, it prefers - the longer string if possible). If it is matched against the string - "dog" with PCRE_PARTIAL_SOFT, it yields a complete match for "dog". - However, if PCRE_PARTIAL_HARD is set, the result is PCRE_ERROR_PARTIAL. - On the other hand, if the pattern is made ungreedy the result is dif- - ferent: - - /dog(sbody)??/ - - In this case the result is always a complete match because that is - found first, and matching never continues after finding a complete - match. It might be easier to follow this explanation by thinking of the - two patterns like this: - - /dog(sbody)?/ is the same as /dogsbody|dog/ - /dog(sbody)??/ is the same as /dog|dogsbody/ - - The second pattern will never match "dogsbody", because it will always - find the shorter match first. - - -PARTIAL MATCHING USING pcre_dfa_exec() OR pcre[16|32]_dfa_exec() - - The DFA functions move along the subject string character by character, - without backtracking, searching for all possible matches simultane- - ously. If the end of the subject is reached before the end of the pat- - tern, there is the possibility of a partial match, again provided that - at least one character has been inspected. - - When PCRE_PARTIAL_SOFT is set, PCRE_ERROR_PARTIAL is returned only if - there have been no complete matches. Otherwise, the complete matches - are returned. However, if PCRE_PARTIAL_HARD is set, a partial match - takes precedence over any complete matches. The portion of the string - that was inspected when the longest partial match was found is set as - the first matching string, provided there are at least two slots in the - offsets vector. - - Because the DFA functions always search for all possible matches, and - there is no difference between greedy and ungreedy repetition, their - behaviour is different from the standard functions when PCRE_PAR- - TIAL_HARD is set. Consider the string "dog" matched against the - ungreedy pattern shown above: - - /dog(sbody)??/ - - Whereas the standard functions stop as soon as they find the complete - match for "dog", the DFA functions also find the partial match for - "dogsbody", and so return that when PCRE_PARTIAL_HARD is set. - - -PARTIAL MATCHING AND WORD BOUNDARIES - - If a pattern ends with one of sequences \b or \B, which test for word - boundaries, partial matching with PCRE_PARTIAL_SOFT can give counter- - intuitive results. Consider this pattern: - - /\bcat\b/ - - This matches "cat", provided there is a word boundary at either end. If - the subject string is "the cat", the comparison of the final "t" with a - following character cannot take place, so a partial match is found. - However, normal matching carries on, and \b matches at the end of the - subject when the last character is a letter, so a complete match is - found. The result, therefore, is not PCRE_ERROR_PARTIAL. Using - PCRE_PARTIAL_HARD in this case does yield PCRE_ERROR_PARTIAL, because - then the partial match takes precedence. - - -FORMERLY RESTRICTED PATTERNS - - For releases of PCRE prior to 8.00, because of the way certain internal - optimizations were implemented in the pcre_exec() function, the - PCRE_PARTIAL option (predecessor of PCRE_PARTIAL_SOFT) could not be - used with all patterns. From release 8.00 onwards, the restrictions no - longer apply, and partial matching with can be requested for any pat- - tern. - - Items that were formerly restricted were repeated single characters and - repeated metasequences. If PCRE_PARTIAL was set for a pattern that did - not conform to the restrictions, pcre_exec() returned the error code - PCRE_ERROR_BADPARTIAL (-13). This error code is no longer in use. The - PCRE_INFO_OKPARTIAL call to pcre_fullinfo() to find out if a compiled - pattern can be used for partial matching now always returns 1. - - -EXAMPLE OF PARTIAL MATCHING USING PCRETEST - - If the escape sequence \P is present in a pcretest data line, the - PCRE_PARTIAL_SOFT option is used for the match. Here is a run of - pcretest that uses the date example quoted above: - - re> /^\d?\d(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)\d\d$/ - data> 25jun04\P - 0: 25jun04 - 1: jun - data> 25dec3\P - Partial match: 23dec3 - data> 3ju\P - Partial match: 3ju - data> 3juj\P - No match - data> j\P - No match - - The first data string is matched completely, so pcretest shows the - matched substrings. The remaining four strings do not match the com- - plete pattern, but the first two are partial matches. Similar output is - obtained if DFA matching is used. - - If the escape sequence \P is present more than once in a pcretest data - line, the PCRE_PARTIAL_HARD option is set for the match. - - -MULTI-SEGMENT MATCHING WITH pcre_dfa_exec() OR pcre[16|32]_dfa_exec() - - When a partial match has been found using a DFA matching function, it - is possible to continue the match by providing additional subject data - and calling the function again with the same compiled regular expres- - sion, this time setting the PCRE_DFA_RESTART option. You must pass the - same working space as before, because this is where details of the pre- - vious partial match are stored. Here is an example using pcretest, - using the \R escape sequence to set the PCRE_DFA_RESTART option (\D - specifies the use of the DFA matching function): - - re> /^\d?\d(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)\d\d$/ - data> 23ja\P\D - Partial match: 23ja - data> n05\R\D - 0: n05 - - The first call has "23ja" as the subject, and requests partial match- - ing; the second call has "n05" as the subject for the continued - (restarted) match. Notice that when the match is complete, only the - last part is shown; PCRE does not retain the previously partially- - matched string. It is up to the calling program to do that if it needs - to. - - That means that, for an unanchored pattern, if a continued match fails, - it is not possible to try again at a new starting point. All this - facility is capable of doing is continuing with the previous match - attempt. In the previous example, if the second set of data is "ug23" - the result is no match, even though there would be a match for "aug23" - if the entire string were given at once. Depending on the application, - this may or may not be what you want. The only way to allow for start- - ing again at the next character is to retain the matched part of the - subject and try a new complete match. - - You can set the PCRE_PARTIAL_SOFT or PCRE_PARTIAL_HARD options with - PCRE_DFA_RESTART to continue partial matching over multiple segments. - This facility can be used to pass very long subject strings to the DFA - matching functions. - - -MULTI-SEGMENT MATCHING WITH pcre_exec() OR pcre[16|32]_exec() - - From release 8.00, the standard matching functions can also be used to - do multi-segment matching. Unlike the DFA functions, it is not possible - to restart the previous match with a new segment of data. Instead, new - data must be added to the previous subject string, and the entire match - re-run, starting from the point where the partial match occurred. Ear- - lier data can be discarded. - - It is best to use PCRE_PARTIAL_HARD in this situation, because it does - not treat the end of a segment as the end of the subject when matching - \z, \Z, \b, \B, and $. Consider an unanchored pattern that matches - dates: - - re> /\d?\d(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)\d\d/ - data> The date is 23ja\P\P - Partial match: 23ja - - At this stage, an application could discard the text preceding "23ja", - add on text from the next segment, and call the matching function - again. Unlike the DFA matching functions, the entire matching string - must always be available, and the complete matching process occurs for - each call, so more memory and more processing time is needed. - - Note: If the pattern contains lookbehind assertions, or \K, or starts - with \b or \B, the string that is returned for a partial match includes - characters that precede the start of what would be returned for a com- - plete match, because it contains all the characters that were inspected - during the partial match. - - -ISSUES WITH MULTI-SEGMENT MATCHING - - Certain types of pattern may give problems with multi-segment matching, - whichever matching function is used. - - 1. If the pattern contains a test for the beginning of a line, you need - to pass the PCRE_NOTBOL option when the subject string for any call - does start at the beginning of a line. There is also a PCRE_NOTEOL - option, but in practice when doing multi-segment matching you should be - using PCRE_PARTIAL_HARD, which includes the effect of PCRE_NOTEOL. - - 2. Lookbehind assertions that have already been obeyed are catered for - in the offsets that are returned for a partial match. However a lookbe- - hind assertion later in the pattern could require even earlier charac- - ters to be inspected. You can handle this case by using the - PCRE_INFO_MAXLOOKBEHIND option of the pcre_fullinfo() or - pcre[16|32]_fullinfo() functions to obtain the length of the longest - lookbehind in the pattern. This length is given in characters, not - bytes. If you always retain at least that many characters before the - partially matched string, all should be well. (Of course, near the - start of the subject, fewer characters may be present; in that case all - characters should be retained.) - - From release 8.33, there is a more accurate way of deciding which char- - acters to retain. Instead of subtracting the length of the longest - lookbehind from the earliest inspected character (offsets[0]), the - match start position (offsets[2]) should be used, and the next match - attempt started at the offsets[2] character by setting the startoffset - argument of pcre_exec() or pcre_dfa_exec(). - - For example, if the pattern "(?<=123)abc" is partially matched against - the string "xx123a", the three offset values returned are 2, 6, and 5. - This indicates that the matching process that gave a partial match - started at offset 5, but the characters "123a" were all inspected. The - maximum lookbehind for that pattern is 3, so taking that away from 5 - shows that we need only keep "123a", and the next match attempt can be - started at offset 3 (that is, at "a") when further characters have been - added. When the match start is not the earliest inspected character, - pcretest shows it explicitly: - - re> "(?<=123)abc" - data> xx123a\P\P - Partial match at offset 5: 123a - - 3. Because a partial match must always contain at least one character, - what might be considered a partial match of an empty string actually - gives a "no match" result. For example: - - re> /c(?<=abc)x/ - data> ab\P - No match - - If the next segment begins "cx", a match should be found, but this will - only happen if characters from the previous segment are retained. For - this reason, a "no match" result should be interpreted as "partial - match of an empty string" when the pattern contains lookbehinds. - - 4. Matching a subject string that is split into multiple segments may - not always produce exactly the same result as matching over one single - long string, especially when PCRE_PARTIAL_SOFT is used. The section - "Partial Matching and Word Boundaries" above describes an issue that - arises if the pattern ends with \b or \B. Another kind of difference - may occur when there are multiple matching possibilities, because (for - PCRE_PARTIAL_SOFT) a partial match result is given only when there are - no completed matches. This means that as soon as the shortest match has - been found, continuation to a new subject segment is no longer possi- - ble. Consider again this pcretest example: - - re> /dog(sbody)?/ - data> dogsb\P - 0: dog - data> do\P\D - Partial match: do - data> gsb\R\P\D - 0: g - data> dogsbody\D - 0: dogsbody - 1: dog - - The first data line passes the string "dogsb" to a standard matching - function, setting the PCRE_PARTIAL_SOFT option. Although the string is - a partial match for "dogsbody", the result is not PCRE_ERROR_PARTIAL, - because the shorter string "dog" is a complete match. Similarly, when - the subject is presented to a DFA matching function in several parts - ("do" and "gsb" being the first two) the match stops when "dog" has - been found, and it is not possible to continue. On the other hand, if - "dogsbody" is presented as a single string, a DFA matching function - finds both matches. - - Because of these problems, it is best to use PCRE_PARTIAL_HARD when - matching multi-segment data. The example above then behaves differ- - ently: - - re> /dog(sbody)?/ - data> dogsb\P\P - Partial match: dogsb - data> do\P\D - Partial match: do - data> gsb\R\P\P\D - Partial match: gsb - - 5. Patterns that contain alternatives at the top level which do not all - start with the same pattern item may not work as expected when - PCRE_DFA_RESTART is used. For example, consider this pattern: - - 1234|3789 - - If the first part of the subject is "ABC123", a partial match of the - first alternative is found at offset 3. There is no partial match for - the second alternative, because such a match does not start at the same - point in the subject string. Attempting to continue with the string - "7890" does not yield a match because only those alternatives that - match at one point in the subject are remembered. The problem arises - because the start of the second alternative matches within the first - alternative. There is no problem with anchored patterns or patterns - such as: - - 1234|ABCD - - where no string can be a partial match for both alternatives. This is - not a problem if a standard matching function is used, because the - entire match has to be rerun each time: - - re> /1234|3789/ - data> ABC123\P\P - Partial match: 123 - data> 1237890 - 0: 3789 - - Of course, instead of using PCRE_DFA_RESTART, the same technique of re- - running the entire match can also be used with the DFA matching func- - tions. Another possibility is to work with two buffers. If a partial - match at offset n in the first buffer is followed by "no match" when - PCRE_DFA_RESTART is used on the second buffer, you can then try a new - match starting at offset n+1 in the first buffer. - - -AUTHOR - - Philip Hazel - University Computing Service - Cambridge CB2 3QH, England. - - -REVISION - - Last updated: 02 July 2013 - Copyright (c) 1997-2013 University of Cambridge. ------------------------------------------------------------------------------- - - -PCREPRECOMPILE(3) Library Functions Manual PCREPRECOMPILE(3) - - - -NAME - PCRE - Perl-compatible regular expressions - -SAVING AND RE-USING PRECOMPILED PCRE PATTERNS - - If you are running an application that uses a large number of regular - expression patterns, it may be useful to store them in a precompiled - form instead of having to compile them every time the application is - run. If you are not using any private character tables (see the - pcre_maketables() documentation), this is relatively straightforward. - If you are using private tables, it is a little bit more complicated. - However, if you are using the just-in-time optimization feature, it is - not possible to save and reload the JIT data. - - If you save compiled patterns to a file, you can copy them to a differ- - ent host and run them there. If the two hosts have different endianness - (byte order), you should run the pcre[16|32]_pat- - tern_to_host_byte_order() function on the new host before trying to - match the pattern. The matching functions return PCRE_ERROR_BADENDIAN- - NESS if they detect a pattern with the wrong endianness. - - Compiling regular expressions with one version of PCRE for use with a - different version is not guaranteed to work and may cause crashes, and - saving and restoring a compiled pattern loses any JIT optimization - data. - - -SAVING A COMPILED PATTERN - - The value returned by pcre[16|32]_compile() points to a single block of - memory that holds the compiled pattern and associated data. You can - find the length of this block in bytes by calling - pcre[16|32]_fullinfo() with an argument of PCRE_INFO_SIZE. You can then - save the data in any appropriate manner. Here is sample code for the - 8-bit library that compiles a pattern and writes it to a file. It - assumes that the variable fd refers to a file that is open for output: - - int erroroffset, rc, size; - char *error; - pcre *re; - - re = pcre_compile("my pattern", 0, &error, &erroroffset, NULL); - if (re == NULL) { ... handle errors ... } - rc = pcre_fullinfo(re, NULL, PCRE_INFO_SIZE, &size); - if (rc < 0) { ... handle errors ... } - rc = fwrite(re, 1, size, fd); - if (rc != size) { ... handle errors ... } - - In this example, the bytes that comprise the compiled pattern are - copied exactly. Note that this is binary data that may contain any of - the 256 possible byte values. On systems that make a distinction - between binary and non-binary data, be sure that the file is opened for - binary output. - - If you want to write more than one pattern to a file, you will have to - devise a way of separating them. For binary data, preceding each pat- - tern with its length is probably the most straightforward approach. - Another possibility is to write out the data in hexadecimal instead of - binary, one pattern to a line. - - Saving compiled patterns in a file is only one possible way of storing - them for later use. They could equally well be saved in a database, or - in the memory of some daemon process that passes them via sockets to - the processes that want them. - - If the pattern has been studied, it is also possible to save the normal - study data in a similar way to the compiled pattern itself. However, if - the PCRE_STUDY_JIT_COMPILE was used, the just-in-time data that is cre- - ated cannot be saved because it is too dependent on the current envi- - ronment. When studying generates additional information, - pcre[16|32]_study() returns a pointer to a pcre[16|32]_extra data - block. Its format is defined in the section on matching a pattern in - the pcreapi documentation. The study_data field points to the binary - study data, and this is what you must save (not the pcre[16|32]_extra - block itself). The length of the study data can be obtained by calling - pcre[16|32]_fullinfo() with an argument of PCRE_INFO_STUDYSIZE. Remem- - ber to check that pcre[16|32]_study() did return a non-NULL value - before trying to save the study data. - - -RE-USING A PRECOMPILED PATTERN - - Re-using a precompiled pattern is straightforward. Having reloaded it - into main memory, called pcre[16|32]_pattern_to_host_byte_order() if - necessary, you pass its pointer to pcre[16|32]_exec() or - pcre[16|32]_dfa_exec() in the usual way. - - However, if you passed a pointer to custom character tables when the - pattern was compiled (the tableptr argument of pcre[16|32]_compile()), - you must now pass a similar pointer to pcre[16|32]_exec() or - pcre[16|32]_dfa_exec(), because the value saved with the compiled pat- - tern will obviously be nonsense. A field in a pcre[16|32]_extra() block - is used to pass this data, as described in the section on matching a - pattern in the pcreapi documentation. - - Warning: The tables that pcre_exec() and pcre_dfa_exec() use must be - the same as those that were used when the pattern was compiled. If this - is not the case, the behaviour is undefined. - - If you did not provide custom character tables when the pattern was - compiled, the pointer in the compiled pattern is NULL, which causes the - matching functions to use PCRE's internal tables. Thus, you do not need - to take any special action at run time in this case. - - If you saved study data with the compiled pattern, you need to create - your own pcre[16|32]_extra data block and set the study_data field to - point to the reloaded study data. You must also set the - PCRE_EXTRA_STUDY_DATA bit in the flags field to indicate that study - data is present. Then pass the pcre[16|32]_extra block to the matching - function in the usual way. If the pattern was studied for just-in-time - optimization, that data cannot be saved, and so is lost by a - save/restore cycle. - - -COMPATIBILITY WITH DIFFERENT PCRE RELEASES - - In general, it is safest to recompile all saved patterns when you - update to a new PCRE release, though not all updates actually require - this. - - -AUTHOR - - Philip Hazel - University Computing Service - Cambridge CB2 3QH, England. - - -REVISION - - Last updated: 12 November 2013 - Copyright (c) 1997-2013 University of Cambridge. ------------------------------------------------------------------------------- - - -PCREPERFORM(3) Library Functions Manual PCREPERFORM(3) - - - -NAME - PCRE - Perl-compatible regular expressions - -PCRE PERFORMANCE - - Two aspects of performance are discussed below: memory usage and pro- - cessing time. The way you express your pattern as a regular expression - can affect both of them. - - -COMPILED PATTERN MEMORY USAGE - - Patterns are compiled by PCRE into a reasonably efficient interpretive - code, so that most simple patterns do not use much memory. However, - there is one case where the memory usage of a compiled pattern can be - unexpectedly large. If a parenthesized subpattern has a quantifier with - a minimum greater than 1 and/or a limited maximum, the whole subpattern - is repeated in the compiled code. For example, the pattern - - (abc|def){2,4} - - is compiled as if it were - - (abc|def)(abc|def)((abc|def)(abc|def)?)? - - (Technical aside: It is done this way so that backtrack points within - each of the repetitions can be independently maintained.) - - For regular expressions whose quantifiers use only small numbers, this - is not usually a problem. However, if the numbers are large, and par- - ticularly if such repetitions are nested, the memory usage can become - an embarrassment. For example, the very simple pattern - - ((ab){1,1000}c){1,3} - - uses 51K bytes when compiled using the 8-bit library. When PCRE is com- - piled with its default internal pointer size of two bytes, the size - limit on a compiled pattern is 64K data units, and this is reached with - the above pattern if the outer repetition is increased from 3 to 4. - PCRE can be compiled to use larger internal pointers and thus handle - larger compiled patterns, but it is better to try to rewrite your pat- - tern to use less memory if you can. - - One way of reducing the memory usage for such patterns is to make use - of PCRE's "subroutine" facility. Re-writing the above pattern as - - ((ab)(?2){0,999}c)(?1){0,2} - - reduces the memory requirements to 18K, and indeed it remains under 20K - even with the outer repetition increased to 100. However, this pattern - is not exactly equivalent, because the "subroutine" calls are treated - as atomic groups into which there can be no backtracking if there is a - subsequent matching failure. Therefore, PCRE cannot do this kind of - rewriting automatically. Furthermore, there is a noticeable loss of - speed when executing the modified pattern. Nevertheless, if the atomic - grouping is not a problem and the loss of speed is acceptable, this - kind of rewriting will allow you to process patterns that PCRE cannot - otherwise handle. - - -STACK USAGE AT RUN TIME - - When pcre_exec() or pcre[16|32]_exec() is used for matching, certain - kinds of pattern can cause it to use large amounts of the process - stack. In some environments the default process stack is quite small, - and if it runs out the result is often SIGSEGV. This issue is probably - the most frequently raised problem with PCRE. Rewriting your pattern - can often help. The pcrestack documentation discusses this issue in - detail. - - -PROCESSING TIME - - Certain items in regular expression patterns are processed more effi- - ciently than others. It is more efficient to use a character class like - [aeiou] than a set of single-character alternatives such as - (a|e|i|o|u). In general, the simplest construction that provides the - required behaviour is usually the most efficient. Jeffrey Friedl's book - contains a lot of useful general discussion about optimizing regular - expressions for efficient performance. This document contains a few - observations about PCRE. - - Using Unicode character properties (the \p, \P, and \X escapes) is - slow, because PCRE has to use a multi-stage table lookup whenever it - needs a character's property. If you can find an alternative pattern - that does not use character properties, it will probably be faster. - - By default, the escape sequences \b, \d, \s, and \w, and the POSIX - character classes such as [:alpha:] do not use Unicode properties, - partly for backwards compatibility, and partly for performance reasons. - However, you can set PCRE_UCP if you want Unicode character properties - to be used. This can double the matching time for items such as \d, - when matched with a traditional matching function; the performance loss - is less with a DFA matching function, and in both cases there is not - much difference for \b. - - When a pattern begins with .* not in parentheses, or in parentheses - that are not the subject of a backreference, and the PCRE_DOTALL option - is set, the pattern is implicitly anchored by PCRE, since it can match - only at the start of a subject string. However, if PCRE_DOTALL is not - set, PCRE cannot make this optimization, because the . metacharacter - does not then match a newline, and if the subject string contains new- - lines, the pattern may match from the character immediately following - one of them instead of from the very start. For example, the pattern - - .*second - - matches the subject "first\nand second" (where \n stands for a newline - character), with the match starting at the seventh character. In order - to do this, PCRE has to retry the match starting after every newline in - the subject. - - If you are using such a pattern with subject strings that do not con- - tain newlines, the best performance is obtained by setting PCRE_DOTALL, - or starting the pattern with ^.* or ^.*? to indicate explicit anchor- - ing. That saves PCRE from having to scan along the subject looking for - a newline to restart at. - - Beware of patterns that contain nested indefinite repeats. These can - take a long time to run when applied to a string that does not match. - Consider the pattern fragment - - ^(a+)* - - This can match "aaaa" in 16 different ways, and this number increases - very rapidly as the string gets longer. (The * repeat can match 0, 1, - 2, 3, or 4 times, and for each of those cases other than 0 or 4, the + - repeats can match different numbers of times.) When the remainder of - the pattern is such that the entire match is going to fail, PCRE has in - principle to try every possible variation, and this can take an - extremely long time, even for relatively short strings. - - An optimization catches some of the more simple cases such as - - (a+)*b - - where a literal character follows. Before embarking on the standard - matching procedure, PCRE checks that there is a "b" later in the sub- - ject string, and if there is not, it fails the match immediately. How- - ever, when there is no following literal this optimization cannot be - used. You can see the difference by comparing the behaviour of - - (a+)*\d - - with the pattern above. The former gives a failure almost instantly - when applied to a whole line of "a" characters, whereas the latter - takes an appreciable time with strings longer than about 20 characters. - - In many cases, the solution to this kind of performance issue is to use - an atomic group or a possessive quantifier. - - -AUTHOR - - Philip Hazel - University Computing Service - Cambridge CB2 3QH, England. - - -REVISION - - Last updated: 25 August 2012 - Copyright (c) 1997-2012 University of Cambridge. ------------------------------------------------------------------------------- - - -PCREPOSIX(3) Library Functions Manual PCREPOSIX(3) - - - -NAME - PCRE - Perl-compatible regular expressions. - -SYNOPSIS - - #include - - int regcomp(regex_t *preg, const char *pattern, - int cflags); - - int regexec(regex_t *preg, const char *string, - size_t nmatch, regmatch_t pmatch[], int eflags); - size_t regerror(int errcode, const regex_t *preg, - char *errbuf, size_t errbuf_size); - - void regfree(regex_t *preg); - - -DESCRIPTION - - This set of functions provides a POSIX-style API for the PCRE regular - expression 8-bit library. See the pcreapi documentation for a descrip- - tion of PCRE's native API, which contains much additional functional- - ity. There is no POSIX-style wrapper for PCRE's 16-bit and 32-bit - library. - - The functions described here are just wrapper functions that ultimately - call the PCRE native API. Their prototypes are defined in the - pcreposix.h header file, and on Unix systems the library itself is - called pcreposix.a, so can be accessed by adding -lpcreposix to the - command for linking an application that uses them. Because the POSIX - functions call the native ones, it is also necessary to add -lpcre. - - I have implemented only those POSIX option bits that can be reasonably - mapped to PCRE native options. In addition, the option REG_EXTENDED is - defined with the value zero. This has no effect, but since programs - that are written to the POSIX interface often use it, this makes it - easier to slot in PCRE as a replacement library. Other POSIX options - are not even defined. - - There are also some other options that are not defined by POSIX. These - have been added at the request of users who want to make use of certain - PCRE-specific features via the POSIX calling interface. - - When PCRE is called via these functions, it is only the API that is - POSIX-like in style. The syntax and semantics of the regular expres- - sions themselves are still those of Perl, subject to the setting of - various PCRE options, as described below. "POSIX-like in style" means - that the API approximates to the POSIX definition; it is not fully - POSIX-compatible, and in multi-byte encoding domains it is probably - even less compatible. - - The header for these functions is supplied as pcreposix.h to avoid any - potential clash with other POSIX libraries. It can, of course, be - renamed or aliased as regex.h, which is the "correct" name. It provides - two structure types, regex_t for compiled internal forms, and reg- - match_t for returning captured substrings. It also defines some con- - stants whose names start with "REG_"; these are used for setting - options and identifying error codes. - - -COMPILING A PATTERN - - The function regcomp() is called to compile a pattern into an internal - form. The pattern is a C string terminated by a binary zero, and is - passed in the argument pattern. The preg argument is a pointer to a - regex_t structure that is used as a base for storing information about - the compiled regular expression. - - The argument cflags is either zero, or contains one or more of the bits - defined by the following macros: - - REG_DOTALL - - The PCRE_DOTALL option is set when the regular expression is passed for - compilation to the native function. Note that REG_DOTALL is not part of - the POSIX standard. - - REG_ICASE - - The PCRE_CASELESS option is set when the regular expression is passed - for compilation to the native function. - - REG_NEWLINE - - The PCRE_MULTILINE option is set when the regular expression is passed - for compilation to the native function. Note that this does not mimic - the defined POSIX behaviour for REG_NEWLINE (see the following sec- - tion). - - REG_NOSUB - - The PCRE_NO_AUTO_CAPTURE option is set when the regular expression is - passed for compilation to the native function. In addition, when a pat- - tern that is compiled with this flag is passed to regexec() for match- - ing, the nmatch and pmatch arguments are ignored, and no captured - strings are returned. - - REG_UCP - - The PCRE_UCP option is set when the regular expression is passed for - compilation to the native function. This causes PCRE to use Unicode - properties when matchine \d, \w, etc., instead of just recognizing - ASCII values. Note that REG_UTF8 is not part of the POSIX standard. - - REG_UNGREEDY - - The PCRE_UNGREEDY option is set when the regular expression is passed - for compilation to the native function. Note that REG_UNGREEDY is not - part of the POSIX standard. - - REG_UTF8 - - The PCRE_UTF8 option is set when the regular expression is passed for - compilation to the native function. This causes the pattern itself and - all data strings used for matching it to be treated as UTF-8 strings. - Note that REG_UTF8 is not part of the POSIX standard. - - In the absence of these flags, no options are passed to the native - function. This means the the regex is compiled with PCRE default - semantics. In particular, the way it handles newline characters in the - subject string is the Perl way, not the POSIX way. Note that setting - PCRE_MULTILINE has only some of the effects specified for REG_NEWLINE. - It does not affect the way newlines are matched by . (they are not) or - by a negative class such as [^a] (they are). - - The yield of regcomp() is zero on success, and non-zero otherwise. The - preg structure is filled in on success, and one member of the structure - is public: re_nsub contains the number of capturing subpatterns in the - regular expression. Various error codes are defined in the header file. - - NOTE: If the yield of regcomp() is non-zero, you must not attempt to - use the contents of the preg structure. If, for example, you pass it to - regexec(), the result is undefined and your program is likely to crash. - - -MATCHING NEWLINE CHARACTERS - - This area is not simple, because POSIX and Perl take different views of - things. It is not possible to get PCRE to obey POSIX semantics, but - then PCRE was never intended to be a POSIX engine. The following table - lists the different possibilities for matching newline characters in - PCRE: - - Default Change with - - . matches newline no PCRE_DOTALL - newline matches [^a] yes not changeable - $ matches \n at end yes PCRE_DOLLARENDONLY - $ matches \n in middle no PCRE_MULTILINE - ^ matches \n in middle no PCRE_MULTILINE - - This is the equivalent table for POSIX: - - Default Change with - - . matches newline yes REG_NEWLINE - newline matches [^a] yes REG_NEWLINE - $ matches \n at end no REG_NEWLINE - $ matches \n in middle no REG_NEWLINE - ^ matches \n in middle no REG_NEWLINE - - PCRE's behaviour is the same as Perl's, except that there is no equiva- - lent for PCRE_DOLLAR_ENDONLY in Perl. In both PCRE and Perl, there is - no way to stop newline from matching [^a]. - - The default POSIX newline handling can be obtained by setting - PCRE_DOTALL and PCRE_DOLLAR_ENDONLY, but there is no way to make PCRE - behave exactly as for the REG_NEWLINE action. - - -MATCHING A PATTERN - - The function regexec() is called to match a compiled pattern preg - against a given string, which is by default terminated by a zero byte - (but see REG_STARTEND below), subject to the options in eflags. These - can be: - - REG_NOTBOL - - The PCRE_NOTBOL option is set when calling the underlying PCRE matching - function. - - REG_NOTEMPTY - - The PCRE_NOTEMPTY option is set when calling the underlying PCRE match- - ing function. Note that REG_NOTEMPTY is not part of the POSIX standard. - However, setting this option can give more POSIX-like behaviour in some - situations. - - REG_NOTEOL - - The PCRE_NOTEOL option is set when calling the underlying PCRE matching - function. - - REG_STARTEND - - The string is considered to start at string + pmatch[0].rm_so and to - have a terminating NUL located at string + pmatch[0].rm_eo (there need - not actually be a NUL at that location), regardless of the value of - nmatch. This is a BSD extension, compatible with but not specified by - IEEE Standard 1003.2 (POSIX.2), and should be used with caution in - software intended to be portable to other systems. Note that a non-zero - rm_so does not imply REG_NOTBOL; REG_STARTEND affects only the location - of the string, not how it is matched. - - If the pattern was compiled with the REG_NOSUB flag, no data about any - matched strings is returned. The nmatch and pmatch arguments of - regexec() are ignored. - - If the value of nmatch is zero, or if the value pmatch is NULL, no data - about any matched strings is returned. - - Otherwise,the portion of the string that was matched, and also any cap- - tured substrings, are returned via the pmatch argument, which points to - an array of nmatch structures of type regmatch_t, containing the mem- - bers rm_so and rm_eo. These contain the offset to the first character - of each substring and the offset to the first character after the end - of each substring, respectively. The 0th element of the vector relates - to the entire portion of string that was matched; subsequent elements - relate to the capturing subpatterns of the regular expression. Unused - entries in the array have both structure members set to -1. - - A successful match yields a zero return; various error codes are - defined in the header file, of which REG_NOMATCH is the "expected" - failure code. - - -ERROR MESSAGES - - The regerror() function maps a non-zero errorcode from either regcomp() - or regexec() to a printable message. If preg is not NULL, the error - should have arisen from the use of that structure. A message terminated - by a binary zero is placed in errbuf. The length of the message, - including the zero, is limited to errbuf_size. The yield of the func- - tion is the size of buffer needed to hold the whole message. - - -MEMORY USAGE - - Compiling a regular expression causes memory to be allocated and asso- - ciated with the preg structure. The function regfree() frees all such - memory, after which preg may no longer be used as a compiled expres- - sion. - - -AUTHOR - - Philip Hazel - University Computing Service - Cambridge CB2 3QH, England. - - -REVISION - - Last updated: 09 January 2012 - Copyright (c) 1997-2012 University of Cambridge. ------------------------------------------------------------------------------- - - -PCRECPP(3) Library Functions Manual PCRECPP(3) - - - -NAME - PCRE - Perl-compatible regular expressions. - -SYNOPSIS OF C++ WRAPPER - - #include - - -DESCRIPTION - - The C++ wrapper for PCRE was provided by Google Inc. Some additional - functionality was added by Giuseppe Maxia. This brief man page was con- - structed from the notes in the pcrecpp.h file, which should be con- - sulted for further details. Note that the C++ wrapper supports only the - original 8-bit PCRE library. There is no 16-bit or 32-bit support at - present. - - -MATCHING INTERFACE - - The "FullMatch" operation checks that supplied text matches a supplied - pattern exactly. If pointer arguments are supplied, it copies matched - sub-strings that match sub-patterns into them. - - Example: successful match - pcrecpp::RE re("h.*o"); - re.FullMatch("hello"); - - Example: unsuccessful match (requires full match): - pcrecpp::RE re("e"); - !re.FullMatch("hello"); - - Example: creating a temporary RE object: - pcrecpp::RE("h.*o").FullMatch("hello"); - - You can pass in a "const char*" or a "string" for "text". The examples - below tend to use a const char*. You can, as in the different examples - above, store the RE object explicitly in a variable or use a temporary - RE object. The examples below use one mode or the other arbitrarily. - Either could correctly be used for any of these examples. - - You must supply extra pointer arguments to extract matched subpieces. - - Example: extracts "ruby" into "s" and 1234 into "i" - int i; - string s; - pcrecpp::RE re("(\\w+):(\\d+)"); - re.FullMatch("ruby:1234", &s, &i); - - Example: does not try to extract any extra sub-patterns - re.FullMatch("ruby:1234", &s); - - Example: does not try to extract into NULL - re.FullMatch("ruby:1234", NULL, &i); - - Example: integer overflow causes failure - !re.FullMatch("ruby:1234567891234", NULL, &i); - - Example: fails because there aren't enough sub-patterns: - !pcrecpp::RE("\\w+:\\d+").FullMatch("ruby:1234", &s); - - Example: fails because string cannot be stored in integer - !pcrecpp::RE("(.*)").FullMatch("ruby", &i); - - The provided pointer arguments can be pointers to any scalar numeric - type, or one of: - - string (matched piece is copied to string) - StringPiece (StringPiece is mutated to point to matched piece) - T (where "bool T::ParseFrom(const char*, int)" exists) - NULL (the corresponding matched sub-pattern is not copied) - - The function returns true iff all of the following conditions are sat- - isfied: - - a. "text" matches "pattern" exactly; - - b. The number of matched sub-patterns is >= number of supplied - pointers; - - c. The "i"th argument has a suitable type for holding the - string captured as the "i"th sub-pattern. If you pass in - void * NULL for the "i"th argument, or a non-void * NULL - of the correct type, or pass fewer arguments than the - number of sub-patterns, "i"th captured sub-pattern is - ignored. - - CAVEAT: An optional sub-pattern that does not exist in the matched - string is assigned the empty string. Therefore, the following will - return false (because the empty string is not a valid number): - - int number; - pcrecpp::RE::FullMatch("abc", "[a-z]+(\\d+)?", &number); - - The matching interface supports at most 16 arguments per call. If you - need more, consider using the more general interface - pcrecpp::RE::DoMatch. See pcrecpp.h for the signature for DoMatch. - - NOTE: Do not use no_arg, which is used internally to mark the end of a - list of optional arguments, as a placeholder for missing arguments, as - this can lead to segfaults. - - -QUOTING METACHARACTERS - - You can use the "QuoteMeta" operation to insert backslashes before all - potentially meaningful characters in a string. The returned string, - used as a regular expression, will exactly match the original string. - - Example: - string quoted = RE::QuoteMeta(unquoted); - - Note that it's legal to escape a character even if it has no special - meaning in a regular expression -- so this function does that. (This - also makes it identical to the perl function of the same name; see - "perldoc -f quotemeta".) For example, "1.5-2.0?" becomes - "1\.5\-2\.0\?". - - -PARTIAL MATCHES - - You can use the "PartialMatch" operation when you want the pattern to - match any substring of the text. - - Example: simple search for a string: - pcrecpp::RE("ell").PartialMatch("hello"); - - Example: find first number in a string: - int number; - pcrecpp::RE re("(\\d+)"); - re.PartialMatch("x*100 + 20", &number); - assert(number == 100); - - -UTF-8 AND THE MATCHING INTERFACE - - By default, pattern and text are plain text, one byte per character. - The UTF8 flag, passed to the constructor, causes both pattern and - string to be treated as UTF-8 text, still a byte stream but potentially - multiple bytes per character. In practice, the text is likelier to be - UTF-8 than the pattern, but the match returned may depend on the UTF8 - flag, so always use it when matching UTF8 text. For example, "." will - match one byte normally but with UTF8 set may match up to three bytes - of a multi-byte character. - - Example: - pcrecpp::RE_Options options; - options.set_utf8(); - pcrecpp::RE re(utf8_pattern, options); - re.FullMatch(utf8_string); - - Example: using the convenience function UTF8(): - pcrecpp::RE re(utf8_pattern, pcrecpp::UTF8()); - re.FullMatch(utf8_string); - - NOTE: The UTF8 flag is ignored if pcre was not configured with the - --enable-utf8 flag. - - -PASSING MODIFIERS TO THE REGULAR EXPRESSION ENGINE - - PCRE defines some modifiers to change the behavior of the regular - expression engine. The C++ wrapper defines an auxiliary class, - RE_Options, as a vehicle to pass such modifiers to a RE class. Cur- - rently, the following modifiers are supported: - - modifier description Perl corresponding - - PCRE_CASELESS case insensitive match /i - PCRE_MULTILINE multiple lines match /m - PCRE_DOTALL dot matches newlines /s - PCRE_DOLLAR_ENDONLY $ matches only at end N/A - PCRE_EXTRA strict escape parsing N/A - PCRE_EXTENDED ignore white spaces /x - PCRE_UTF8 handles UTF8 chars built-in - PCRE_UNGREEDY reverses * and *? N/A - PCRE_NO_AUTO_CAPTURE disables capturing parens N/A (*) - - (*) Both Perl and PCRE allow non capturing parentheses by means of the - "?:" modifier within the pattern itself. e.g. (?:ab|cd) does not cap- - ture, while (ab|cd) does. - - For a full account on how each modifier works, please check the PCRE - API reference page. - - For each modifier, there are two member functions whose name is made - out of the modifier in lowercase, without the "PCRE_" prefix. For - instance, PCRE_CASELESS is handled by - - bool caseless() - - which returns true if the modifier is set, and - - RE_Options & set_caseless(bool) - - which sets or unsets the modifier. Moreover, PCRE_EXTRA_MATCH_LIMIT can - be accessed through the set_match_limit() and match_limit() member - functions. Setting match_limit to a non-zero value will limit the exe- - cution of pcre to keep it from doing bad things like blowing the stack - or taking an eternity to return a result. A value of 5000 is good - enough to stop stack blowup in a 2MB thread stack. Setting match_limit - to zero disables match limiting. Alternatively, you can call - match_limit_recursion() which uses PCRE_EXTRA_MATCH_LIMIT_RECURSION to - limit how much PCRE recurses. match_limit() limits the number of - matches PCRE does; match_limit_recursion() limits the depth of internal - recursion, and therefore the amount of stack that is used. - - Normally, to pass one or more modifiers to a RE class, you declare a - RE_Options object, set the appropriate options, and pass this object to - a RE constructor. Example: - - RE_Options opt; - opt.set_caseless(true); - if (RE("HELLO", opt).PartialMatch("hello world")) ... - - RE_options has two constructors. The default constructor takes no argu- - ments and creates a set of flags that are off by default. The optional - parameter option_flags is to facilitate transfer of legacy code from C - programs. This lets you do - - RE(pattern, - RE_Options(PCRE_CASELESS|PCRE_MULTILINE)).PartialMatch(str); - - However, new code is better off doing - - RE(pattern, - RE_Options().set_caseless(true).set_multiline(true)) - .PartialMatch(str); - - If you are going to pass one of the most used modifiers, there are some - convenience functions that return a RE_Options class with the appropri- - ate modifier already set: CASELESS(), UTF8(), MULTILINE(), DOTALL(), - and EXTENDED(). - - If you need to set several options at once, and you don't want to go - through the pains of declaring a RE_Options object and setting several - options, there is a parallel method that give you such ability on the - fly. You can concatenate several set_xxxxx() member functions, since - each of them returns a reference to its class object. For example, to - pass PCRE_CASELESS, PCRE_EXTENDED, and PCRE_MULTILINE to a RE with one - statement, you may write: - - RE(" ^ xyz \\s+ .* blah$", - RE_Options() - .set_caseless(true) - .set_extended(true) - .set_multiline(true)).PartialMatch(sometext); - - -SCANNING TEXT INCREMENTALLY - - The "Consume" operation may be useful if you want to repeatedly match - regular expressions at the front of a string and skip over them as they - match. This requires use of the "StringPiece" type, which represents a - sub-range of a real string. Like RE, StringPiece is defined in the - pcrecpp namespace. - - Example: read lines of the form "var = value" from a string. - string contents = ...; // Fill string somehow - pcrecpp::StringPiece input(contents); // Wrap in a StringPiece - - string var; - int value; - pcrecpp::RE re("(\\w+) = (\\d+)\n"); - while (re.Consume(&input, &var, &value)) { - ...; - } - - Each successful call to "Consume" will set "var/value", and also - advance "input" so it points past the matched text. - - The "FindAndConsume" operation is similar to "Consume" but does not - anchor your match at the beginning of the string. For example, you - could extract all words from a string by repeatedly calling - - pcrecpp::RE("(\\w+)").FindAndConsume(&input, &word) - - -PARSING HEX/OCTAL/C-RADIX NUMBERS - - By default, if you pass a pointer to a numeric value, the corresponding - text is interpreted as a base-10 number. You can instead wrap the - pointer with a call to one of the operators Hex(), Octal(), or CRadix() - to interpret the text in another base. The CRadix operator interprets - C-style "0" (base-8) and "0x" (base-16) prefixes, but defaults to - base-10. - - Example: - int a, b, c, d; - pcrecpp::RE re("(.*) (.*) (.*) (.*)"); - re.FullMatch("100 40 0100 0x40", - pcrecpp::Octal(&a), pcrecpp::Hex(&b), - pcrecpp::CRadix(&c), pcrecpp::CRadix(&d)); - - will leave 64 in a, b, c, and d. - - -REPLACING PARTS OF STRINGS - - You can replace the first match of "pattern" in "str" with "rewrite". - Within "rewrite", backslash-escaped digits (\1 to \9) can be used to - insert text matching corresponding parenthesized group from the pat- - tern. \0 in "rewrite" refers to the entire matching text. For example: - - string s = "yabba dabba doo"; - pcrecpp::RE("b+").Replace("d", &s); - - will leave "s" containing "yada dabba doo". The result is true if the - pattern matches and a replacement occurs, false otherwise. - - GlobalReplace is like Replace except that it replaces all occurrences - of the pattern in the string with the rewrite. Replacements are not - subject to re-matching. For example: - - string s = "yabba dabba doo"; - pcrecpp::RE("b+").GlobalReplace("d", &s); - - will leave "s" containing "yada dada doo". It returns the number of - replacements made. - - Extract is like Replace, except that if the pattern matches, "rewrite" - is copied into "out" (an additional argument) with substitutions. The - non-matching portions of "text" are ignored. Returns true iff a match - occurred and the extraction happened successfully; if no match occurs, - the string is left unaffected. - - -AUTHOR - - The C++ wrapper was contributed by Google Inc. - Copyright (c) 2007 Google Inc. - - -REVISION - - Last updated: 08 January 2012 ------------------------------------------------------------------------------- - - -PCRESAMPLE(3) Library Functions Manual PCRESAMPLE(3) - - - -NAME - PCRE - Perl-compatible regular expressions - -PCRE SAMPLE PROGRAM - - A simple, complete demonstration program, to get you started with using - PCRE, is supplied in the file pcredemo.c in the PCRE distribution. A - listing of this program is given in the pcredemo documentation. If you - do not have a copy of the PCRE distribution, you can save this listing - to re-create pcredemo.c. - - The demonstration program, which uses the original PCRE 8-bit library, - compiles the regular expression that is its first argument, and matches - it against the subject string in its second argument. No PCRE options - are set, and default character tables are used. If matching succeeds, - the program outputs the portion of the subject that matched, together - with the contents of any captured substrings. - - If the -g option is given on the command line, the program then goes on - to check for further matches of the same regular expression in the same - subject string. The logic is a little bit tricky because of the possi- - bility of matching an empty string. Comments in the code explain what - is going on. - - If PCRE is installed in the standard include and library directories - for your operating system, you should be able to compile the demonstra- - tion program using this command: - - gcc -o pcredemo pcredemo.c -lpcre - - If PCRE is installed elsewhere, you may need to add additional options - to the command line. For example, on a Unix-like system that has PCRE - installed in /usr/local, you can compile the demonstration program - using a command like this: - - gcc -o pcredemo -I/usr/local/include pcredemo.c \ - -L/usr/local/lib -lpcre - - In a Windows environment, if you want to statically link the program - against a non-dll pcre.a file, you must uncomment the line that defines - PCRE_STATIC before including pcre.h, because otherwise the pcre_mal- - loc() and pcre_free() exported functions will be declared - __declspec(dllimport), with unwanted results. - - Once you have compiled and linked the demonstration program, you can - run simple tests like this: - - ./pcredemo 'cat|dog' 'the cat sat on the mat' - ./pcredemo -g 'cat|dog' 'the dog sat on the cat' - - Note that there is a much more comprehensive test program, called - pcretest, which supports many more facilities for testing regular - expressions and both PCRE libraries. The pcredemo program is provided - as a simple coding example. - - If you try to run pcredemo when PCRE is not installed in the standard - library directory, you may get an error like this on some operating - systems (e.g. Solaris): - - ld.so.1: a.out: fatal: libpcre.so.0: open failed: No such file or - directory - - This is caused by the way shared library support works on those sys- - tems. You need to add - - -R/usr/local/lib - - (for example) to the compile command to get round this problem. - - -AUTHOR - - Philip Hazel - University Computing Service - Cambridge CB2 3QH, England. - - -REVISION - - Last updated: 10 January 2012 - Copyright (c) 1997-2012 University of Cambridge. ------------------------------------------------------------------------------- -PCRELIMITS(3) Library Functions Manual PCRELIMITS(3) - - - -NAME - PCRE - Perl-compatible regular expressions - -SIZE AND OTHER LIMITATIONS - - There are some size limitations in PCRE but it is hoped that they will - never in practice be relevant. - - The maximum length of a compiled pattern is approximately 64K data - units (bytes for the 8-bit library, 16-bit units for the 16-bit - library, and 32-bit units for the 32-bit library) if PCRE is compiled - with the default internal linkage size, which is 2 bytes for the 8-bit - and 16-bit libraries, and 4 bytes for the 32-bit library. If you want - to process regular expressions that are truly enormous, you can compile - PCRE with an internal linkage size of 3 or 4 (when building the 16-bit - or 32-bit library, 3 is rounded up to 4). See the README file in the - source distribution and the pcrebuild documentation for details. In - these cases the limit is substantially larger. However, the speed of - execution is slower. - - All values in repeating quantifiers must be less than 65536. - - There is no limit to the number of parenthesized subpatterns, but there - can be no more than 65535 capturing subpatterns. There is, however, a - limit to the depth of nesting of parenthesized subpatterns of all - kinds. This is imposed in order to limit the amount of system stack - used at compile time. The limit can be specified when PCRE is built; - the default is 250. - - There is a limit to the number of forward references to subsequent sub- - patterns of around 200,000. Repeated forward references with fixed - upper limits, for example, (?2){0,100} when subpattern number 2 is to - the right, are included in the count. There is no limit to the number - of backward references. - - The maximum length of name for a named subpattern is 32 characters, and - the maximum number of named subpatterns is 10000. - - The maximum length of a name in a (*MARK), (*PRUNE), (*SKIP), or - (*THEN) verb is 255 for the 8-bit library and 65535 for the 16-bit and - 32-bit libraries. - - The maximum length of a subject string is the largest positive number - that an integer variable can hold. However, when using the traditional - matching function, PCRE uses recursion to handle subpatterns and indef- - inite repetition. This means that the available stack space may limit - the size of a subject string that can be processed by certain patterns. - For a discussion of stack issues, see the pcrestack documentation. - - -AUTHOR - - Philip Hazel - University Computing Service - Cambridge CB2 3QH, England. - - -REVISION - - Last updated: 05 November 2013 - Copyright (c) 1997-2013 University of Cambridge. ------------------------------------------------------------------------------- - - -PCRESTACK(3) Library Functions Manual PCRESTACK(3) - - - -NAME - PCRE - Perl-compatible regular expressions - -PCRE DISCUSSION OF STACK USAGE - - When you call pcre[16|32]_exec(), it makes use of an internal function - called match(). This calls itself recursively at branch points in the - pattern, in order to remember the state of the match so that it can - back up and try a different alternative if the first one fails. As - matching proceeds deeper and deeper into the tree of possibilities, the - recursion depth increases. The match() function is also called in other - circumstances, for example, whenever a parenthesized sub-pattern is - entered, and in certain cases of repetition. - - Not all calls of match() increase the recursion depth; for an item such - as a* it may be called several times at the same level, after matching - different numbers of a's. Furthermore, in a number of cases where the - result of the recursive call would immediately be passed back as the - result of the current call (a "tail recursion"), the function is just - restarted instead. - - The above comments apply when pcre[16|32]_exec() is run in its normal - interpretive manner. If the pattern was studied with the - PCRE_STUDY_JIT_COMPILE option, and just-in-time compiling was success- - ful, and the options passed to pcre[16|32]_exec() were not incompati- - ble, the matching process uses the JIT-compiled code instead of the - match() function. In this case, the memory requirements are handled - entirely differently. See the pcrejit documentation for details. - - The pcre[16|32]_dfa_exec() function operates in an entirely different - way, and uses recursion only when there is a regular expression recur- - sion or subroutine call in the pattern. This includes the processing of - assertion and "once-only" subpatterns, which are handled like subrou- - tine calls. Normally, these are never very deep, and the limit on the - complexity of pcre[16|32]_dfa_exec() is controlled by the amount of - workspace it is given. However, it is possible to write patterns with - runaway infinite recursions; such patterns will cause - pcre[16|32]_dfa_exec() to run out of stack. At present, there is no - protection against this. - - The comments that follow do NOT apply to pcre[16|32]_dfa_exec(); they - are relevant only for pcre[16|32]_exec() without the JIT optimization. - - Reducing pcre[16|32]_exec()'s stack usage - - Each time that match() is actually called recursively, it uses memory - from the process stack. For certain kinds of pattern and data, very - large amounts of stack may be needed, despite the recognition of "tail - recursion". You can often reduce the amount of recursion, and there- - fore the amount of stack used, by modifying the pattern that is being - matched. Consider, for example, this pattern: - - ([^<]|<(?!inet))+ - - It matches from wherever it starts until it encounters ". When there is more than one - pattern (specified by the use of -e and/or -f), each pattern is applied - to each line in the order in which they are defined, except that all - the -e patterns are tried before the -f patterns. - - By default, as soon as one pattern matches a line, no further patterns - are considered. However, if --colour (or --color) is used to colour the - matching substrings, or if --only-matching, --file-offsets, or --line- - offsets is used to output only the part of the line that matched - (either shown literally, or as an offset), scanning resumes immediately - following the match, so that further matches on the same line can be - found. If there are multiple patterns, they are all tried on the - remainder of the line, but patterns that follow the one that matched - are not tried on the earlier part of the line. - - This behaviour means that the order in which multiple patterns are - specified can affect the output when one of the above options is used. - This is no longer the same behaviour as GNU grep, which now manages to - display earlier matches for later patterns (as long as there is no - overlap). - - Patterns that can match an empty string are accepted, but empty string - matches are never recognized. An example is the pattern - "(super)?(man)?", in which all components are optional. This pattern - finds all occurrences of both "super" and "man"; the output differs - from matching with "super|man" when only the matching substrings are - being shown. - - If the LC_ALL or LC_CTYPE environment variable is set, pcregrep uses - the value to set a locale when calling the PCRE library. The --locale - option can be used to override this. - - -SUPPORT FOR COMPRESSED FILES - - It is possible to compile pcregrep so that it uses libz or libbz2 to - read files whose names end in .gz or .bz2, respectively. You can find - out whether your binary has support for one or both of these file types - by running it with the --help option. If the appropriate support is not - present, files are treated as plain text. The standard input is always - so treated. - - -BINARY FILES - - By default, a file that contains a binary zero byte within the first - 1024 bytes is identified as a binary file, and is processed specially. - (GNU grep also identifies binary files in this manner.) See the - --binary-files option for a means of changing the way binary files are - handled. - - -OPTIONS - - The order in which some of the options appear can affect the output. - For example, both the -h and -l options affect the printing of file - names. Whichever comes later in the command line will be the one that - takes effect. Similarly, except where noted below, if an option is - given twice, the later setting is used. Numerical values for options - may be followed by K or M, to signify multiplication by 1024 or - 1024*1024 respectively. - - -- This terminates the list of options. It is useful if the next - item on the command line starts with a hyphen but is not an - option. This allows for the processing of patterns and file- - names that start with hyphens. - - -A number, --after-context=number - Output number lines of context after each matching line. If - filenames and/or line numbers are being output, a hyphen sep- - arator is used instead of a colon for the context lines. A - line containing "--" is output between each group of lines, - unless they are in fact contiguous in the input file. The - value of number is expected to be relatively small. However, - pcregrep guarantees to have up to 8K of following text avail- - able for context output. - - -a, --text - Treat binary files as text. This is equivalent to --binary- - files=text. - - -B number, --before-context=number - Output number lines of context before each matching line. If - filenames and/or line numbers are being output, a hyphen sep- - arator is used instead of a colon for the context lines. A - line containing "--" is output between each group of lines, - unless they are in fact contiguous in the input file. The - value of number is expected to be relatively small. However, - pcregrep guarantees to have up to 8K of preceding text avail- - able for context output. - - --binary-files=word - Specify how binary files are to be processed. If the word is - "binary" (the default), pattern matching is performed on - binary files, but the only output is "Binary file - matches" when a match succeeds. If the word is "text", which - is equivalent to the -a or --text option, binary files are - processed in the same way as any other file. In this case, - when a match succeeds, the output may be binary garbage, - which can have nasty effects if sent to a terminal. If the - word is "without-match", which is equivalent to the -I - option, binary files are not processed at all; they are - assumed not to be of interest. - - --buffer-size=number - Set the parameter that controls how much memory is used for - buffering files that are being scanned. - - -C number, --context=number - Output number lines of context both before and after each - matching line. This is equivalent to setting both -A and -B - to the same value. - - -c, --count - Do not output individual lines from the files that are being - scanned; instead output the number of lines that would other- - wise have been shown. If no lines are selected, the number - zero is output. If several files are are being scanned, a - count is output for each of them. However, if the --files- - with-matches option is also used, only those files whose - counts are greater than zero are listed. When -c is used, the - -A, -B, and -C options are ignored. - - --colour, --color - If this option is given without any data, it is equivalent to - "--colour=auto". If data is required, it must be given in - the same shell item, separated by an equals sign. - - --colour=value, --color=value - This option specifies under what circumstances the parts of a - line that matched a pattern should be coloured in the output. - By default, the output is not coloured. The value (which is - optional, see above) may be "never", "always", or "auto". In - the latter case, colouring happens only if the standard out- - put is connected to a terminal. More resources are used when - colouring is enabled, because pcregrep has to search for all - possible matches in a line, not just one, in order to colour - them all. - - The colour that is used can be specified by setting the envi- - ronment variable PCREGREP_COLOUR or PCREGREP_COLOR. The value - of this variable should be a string of two numbers, separated - by a semicolon. They are copied directly into the control - string for setting colour on a terminal, so it is your - responsibility to ensure that they make sense. If neither of - the environment variables is set, the default is "1;31", - which gives red. - - -D action, --devices=action - If an input path is not a regular file or a directory, - "action" specifies how it is to be processed. Valid values - are "read" (the default) or "skip" (silently skip the path). - - -d action, --directories=action - If an input path is a directory, "action" specifies how it is - to be processed. Valid values are "read" (the default in - non-Windows environments, for compatibility with GNU grep), - "recurse" (equivalent to the -r option), or "skip" (silently - skip the path, the default in Windows environments). In the - "read" case, directories are read as if they were ordinary - files. In some operating systems the effect of reading a - directory like this is an immediate end-of-file; in others it - may provoke an error. - - -e pattern, --regex=pattern, --regexp=pattern - Specify a pattern to be matched. This option can be used mul- - tiple times in order to specify several patterns. It can also - be used as a way of specifying a single pattern that starts - with a hyphen. When -e is used, no argument pattern is taken - from the command line; all arguments are treated as file - names. There is no limit to the number of patterns. They are - applied to each line in the order in which they are defined - until one matches. - - If -f is used with -e, the command line patterns are matched - first, followed by the patterns from the file(s), independent - of the order in which these options are specified. Note that - multiple use of -e is not the same as a single pattern with - alternatives. For example, X|Y finds the first character in a - line that is X or Y, whereas if the two patterns are given - separately, with X first, pcregrep finds X if it is present, - even if it follows Y in the line. It finds Y only if there is - no X in the line. This matters only if you are using -o or - --colo(u)r to show the part(s) of the line that matched. - - --exclude=pattern - Files (but not directories) whose names match the pattern are - skipped without being processed. This applies to all files, - whether listed on the command line, obtained from --file- - list, or by scanning a directory. The pattern is a PCRE regu- - lar expression, and is matched against the final component of - the file name, not the entire path. The -F, -w, and -x - options do not apply to this pattern. The option may be given - any number of times in order to specify multiple patterns. If - a file name matches both an --include and an --exclude pat- - tern, it is excluded. There is no short form for this option. - - --exclude-from=filename - Treat each non-empty line of the file as the data for an - --exclude option. What constitutes a newline when reading the - file is the operating system's default. The --newline option - has no effect on this option. This option may be given more - than once in order to specify a number of files to read. - - --exclude-dir=pattern - Directories whose names match the pattern are skipped without - being processed, whatever the setting of the --recursive - option. This applies to all directories, whether listed on - the command line, obtained from --file-list, or by scanning a - parent directory. The pattern is a PCRE regular expression, - and is matched against the final component of the directory - name, not the entire path. The -F, -w, and -x options do not - apply to this pattern. The option may be given any number of - times in order to specify more than one pattern. If a direc- - tory matches both --include-dir and --exclude-dir, it is - excluded. There is no short form for this option. - - -F, --fixed-strings - Interpret each data-matching pattern as a list of fixed - strings, separated by newlines, instead of as a regular - expression. What constitutes a newline for this purpose is - controlled by the --newline option. The -w (match as a word) - and -x (match whole line) options can be used with -F. They - apply to each of the fixed strings. A line is selected if any - of the fixed strings are found in it (subject to -w or -x, if - present). This option applies only to the patterns that are - matched against the contents of files; it does not apply to - patterns specified by any of the --include or --exclude - options. - - -f filename, --file=filename - Read patterns from the file, one per line, and match them - against each line of input. What constitutes a newline when - reading the file is the operating system's default. The - --newline option has no effect on this option. Trailing white - space is removed from each line, and blank lines are ignored. - An empty file contains no patterns and therefore matches - nothing. See also the comments about multiple patterns versus - a single pattern with alternatives in the description of -e - above. - - If this option is given more than once, all the specified - files are read. A data line is output if any of the patterns - match it. A filename can be given as "-" to refer to the - standard input. When -f is used, patterns specified on the - command line using -e may also be present; they are tested - before the file's patterns. However, no other pattern is - taken from the command line; all arguments are treated as the - names of paths to be searched. - - --file-list=filename - Read a list of files and/or directories that are to be - scanned from the given file, one per line. Trailing white - space is removed from each line, and blank lines are ignored. - These paths are processed before any that are listed on the - command line. The filename can be given as "-" to refer to - the standard input. If --file and --file-list are both spec- - ified as "-", patterns are read first. This is useful only - when the standard input is a terminal, from which further - lines (the list of files) can be read after an end-of-file - indication. If this option is given more than once, all the - specified files are read. - - --file-offsets - Instead of showing lines or parts of lines that match, show - each match as an offset from the start of the file and a - length, separated by a comma. In this mode, no context is - shown. That is, the -A, -B, and -C options are ignored. If - there is more than one match in a line, each of them is shown - separately. This option is mutually exclusive with --line- - offsets and --only-matching. - - -H, --with-filename - Force the inclusion of the filename at the start of output - lines when searching a single file. By default, the filename - is not shown in this case. For matching lines, the filename - is followed by a colon; for context lines, a hyphen separator - is used. If a line number is also being output, it follows - the file name. - - -h, --no-filename - Suppress the output filenames when searching multiple files. - By default, filenames are shown when multiple files are - searched. For matching lines, the filename is followed by a - colon; for context lines, a hyphen separator is used. If a - line number is also being output, it follows the file name. - - --help Output a help message, giving brief details of the command - options and file type support, and then exit. Anything else - on the command line is ignored. - - -I Treat binary files as never matching. This is equivalent to - --binary-files=without-match. - - -i, --ignore-case - Ignore upper/lower case distinctions during comparisons. - - --include=pattern - If any --include patterns are specified, the only files that - are processed are those that match one of the patterns (and - do not match an --exclude pattern). This option does not - affect directories, but it applies to all files, whether - listed on the command line, obtained from --file-list, or by - scanning a directory. The pattern is a PCRE regular expres- - sion, and is matched against the final component of the file - name, not the entire path. The -F, -w, and -x options do not - apply to this pattern. The option may be given any number of - times. If a file name matches both an --include and an - --exclude pattern, it is excluded. There is no short form - for this option. - - --include-from=filename - Treat each non-empty line of the file as the data for an - --include option. What constitutes a newline for this purpose - is the operating system's default. The --newline option has - no effect on this option. This option may be given any number - of times; all the files are read. - - --include-dir=pattern - If any --include-dir patterns are specified, the only direc- - tories that are processed are those that match one of the - patterns (and do not match an --exclude-dir pattern). This - applies to all directories, whether listed on the command - line, obtained from --file-list, or by scanning a parent - directory. The pattern is a PCRE regular expression, and is - matched against the final component of the directory name, - not the entire path. The -F, -w, and -x options do not apply - to this pattern. The option may be given any number of times. - If a directory matches both --include-dir and --exclude-dir, - it is excluded. There is no short form for this option. - - -L, --files-without-match - Instead of outputting lines from the files, just output the - names of the files that do not contain any lines that would - have been output. Each file name is output once, on a sepa- - rate line. - - -l, --files-with-matches - Instead of outputting lines from the files, just output the - names of the files containing lines that would have been out- - put. Each file name is output once, on a separate line. - Searching normally stops as soon as a matching line is found - in a file. However, if the -c (count) option is also used, - matching continues in order to obtain the correct count, and - those files that have at least one match are listed along - with their counts. Using this option with -c is a way of sup- - pressing the listing of files with no matches. - - --label=name - This option supplies a name to be used for the standard input - when file names are being output. If not supplied, "(standard - input)" is used. There is no short form for this option. - - --line-buffered - When this option is given, input is read and processed line - by line, and the output is flushed after each write. By - default, input is read in large chunks, unless pcregrep can - determine that it is reading from a terminal (which is cur- - rently possible only in Unix-like environments). Output to - terminal is normally automatically flushed by the operating - system. This option can be useful when the input or output is - attached to a pipe and you do not want pcregrep to buffer up - large amounts of data. However, its use will affect perfor- - mance, and the -M (multiline) option ceases to work. - - --line-offsets - Instead of showing lines or parts of lines that match, show - each match as a line number, the offset from the start of the - line, and a length. The line number is terminated by a colon - (as usual; see the -n option), and the offset and length are - separated by a comma. In this mode, no context is shown. - That is, the -A, -B, and -C options are ignored. If there is - more than one match in a line, each of them is shown sepa- - rately. This option is mutually exclusive with --file-offsets - and --only-matching. - - --locale=locale-name - This option specifies a locale to be used for pattern match- - ing. It overrides the value in the LC_ALL or LC_CTYPE envi- - ronment variables. If no locale is specified, the PCRE - library's default (usually the "C" locale) is used. There is - no short form for this option. - - --match-limit=number - Processing some regular expression patterns can require a - very large amount of memory, leading in some cases to a pro- - gram crash if not enough is available. Other patterns may - take a very long time to search for all possible matching - strings. The pcre_exec() function that is called by pcregrep - to do the matching has two parameters that can limit the - resources that it uses. - - The --match-limit option provides a means of limiting - resource usage when processing patterns that are not going to - match, but which have a very large number of possibilities in - their search trees. The classic example is a pattern that - uses nested unlimited repeats. Internally, PCRE uses a func- - tion called match() which it calls repeatedly (sometimes - recursively). The limit set by --match-limit is imposed on - the number of times this function is called during a match, - which has the effect of limiting the amount of backtracking - that can take place. - - The --recursion-limit option is similar to --match-limit, but - instead of limiting the total number of times that match() is - called, it limits the depth of recursive calls, which in turn - limits the amount of memory that can be used. The recursion - depth is a smaller number than the total number of calls, - because not all calls to match() are recursive. This limit is - of use only if it is set smaller than --match-limit. - - There are no short forms for these options. The default set- - tings are specified when the PCRE library is compiled, with - the default default being 10 million. - - -M, --multiline - Allow patterns to match more than one line. When this option - is given, patterns may usefully contain literal newline char- - acters and internal occurrences of ^ and $ characters. The - output for a successful match may consist of more than one - line, the last of which is the one in which the match ended. - If the matched string ends with a newline sequence the output - ends at the end of that line. - - When this option is set, the PCRE library is called in "mul- - tiline" mode. There is a limit to the number of lines that - can be matched, imposed by the way that pcregrep buffers the - input file as it scans it. However, pcregrep ensures that at - least 8K characters or the rest of the document (whichever is - the shorter) are available for forward matching, and simi- - larly the previous 8K characters (or all the previous charac- - ters, if fewer than 8K) are guaranteed to be available for - lookbehind assertions. This option does not work when input - is read line by line (see --line-buffered.) - - -N newline-type, --newline=newline-type - The PCRE library supports five different conventions for - indicating the ends of lines. They are the single-character - sequences CR (carriage return) and LF (linefeed), the two- - character sequence CRLF, an "anycrlf" convention, which rec- - ognizes any of the preceding three types, and an "any" con- - vention, in which any Unicode line ending sequence is assumed - to end a line. The Unicode sequences are the three just men- - tioned, plus VT (vertical tab, U+000B), FF (form feed, - U+000C), NEL (next line, U+0085), LS (line separator, - U+2028), and PS (paragraph separator, U+2029). - - When the PCRE library is built, a default line-ending - sequence is specified. This is normally the standard - sequence for the operating system. Unless otherwise specified - by this option, pcregrep uses the library's default. The - possible values for this option are CR, LF, CRLF, ANYCRLF, or - ANY. This makes it possible to use pcregrep to scan files - that have come from other environments without having to mod- - ify their line endings. If the data that is being scanned - does not agree with the convention set by this option, pcre- - grep may behave in strange ways. Note that this option does - not apply to files specified by the -f, --exclude-from, or - --include-from options, which are expected to use the operat- - ing system's standard newline sequence. - - -n, --line-number - Precede each output line by its line number in the file, fol- - lowed by a colon for matching lines or a hyphen for context - lines. If the filename is also being output, it precedes the - line number. This option is forced if --line-offsets is used. - - --no-jit If the PCRE library is built with support for just-in-time - compiling (which speeds up matching), pcregrep automatically - makes use of this, unless it was explicitly disabled at build - time. This option can be used to disable the use of JIT at - run time. It is provided for testing and working round prob- - lems. It should never be needed in normal use. - - -o, --only-matching - Show only the part of the line that matched a pattern instead - of the whole line. In this mode, no context is shown. That - is, the -A, -B, and -C options are ignored. If there is more - than one match in a line, each of them is shown separately. - If -o is combined with -v (invert the sense of the match to - find non-matching lines), no output is generated, but the - return code is set appropriately. If the matched portion of - the line is empty, nothing is output unless the file name or - line number are being printed, in which case they are shown - on an otherwise empty line. This option is mutually exclusive - with --file-offsets and --line-offsets. - - -onumber, --only-matching=number - Show only the part of the line that matched the capturing - parentheses of the given number. Up to 32 capturing parenthe- - ses are supported, and -o0 is equivalent to -o without a num- - ber. Because these options can be given without an argument - (see above), if an argument is present, it must be given in - the same shell item, for example, -o3 or --only-matching=2. - The comments given for the non-argument case above also apply - to this case. If the specified capturing parentheses do not - exist in the pattern, or were not set in the match, nothing - is output unless the file name or line number are being - printed. - - If this option is given multiple times, multiple substrings - are output, in the order the options are given. For example, - -o3 -o1 -o3 causes the substrings matched by capturing paren- - theses 3 and 1 and then 3 again to be output. By default, - there is no separator (but see the next option). - - --om-separator=text - Specify a separating string for multiple occurrences of -o. - The default is an empty string. Separating strings are never - coloured. - - -q, --quiet - Work quietly, that is, display nothing except error messages. - The exit status indicates whether or not any matches were - found. - - -r, --recursive - If any given path is a directory, recursively scan the files - it contains, taking note of any --include and --exclude set- - tings. By default, a directory is read as a normal file; in - some operating systems this gives an immediate end-of-file. - This option is a shorthand for setting the -d option to - "recurse". - - --recursion-limit=number - See --match-limit above. - - -s, --no-messages - Suppress error messages about non-existent or unreadable - files. Such files are quietly skipped. However, the return - code is still 2, even if matches were found in other files. - - -u, --utf-8 - Operate in UTF-8 mode. This option is available only if PCRE - has been compiled with UTF-8 support. All patterns (including - those for any --exclude and --include options) and all sub- - ject lines that are scanned must be valid strings of UTF-8 - characters. - - -V, --version - Write the version numbers of pcregrep and the PCRE library to - the standard output and then exit. Anything else on the com- - mand line is ignored. - - -v, --invert-match - Invert the sense of the match, so that lines which do not - match any of the patterns are the ones that are found. - - -w, --word-regex, --word-regexp - Force the patterns to match only whole words. This is equiva- - lent to having \b at the start and end of the pattern. This - option applies only to the patterns that are matched against - the contents of files; it does not apply to patterns speci- - fied by any of the --include or --exclude options. - - -x, --line-regex, --line-regexp - Force the patterns to be anchored (each must start matching - at the beginning of a line) and in addition, require them to - match entire lines. This is equivalent to having ^ and $ - characters at the start and end of each alternative branch in - every pattern. This option applies only to the patterns that - are matched against the contents of files; it does not apply - to patterns specified by any of the --include or --exclude - options. - - -ENVIRONMENT VARIABLES - - The environment variables LC_ALL and LC_CTYPE are examined, in that - order, for a locale. The first one that is set is used. This can be - overridden by the --locale option. If no locale is set, the PCRE - library's default (usually the "C" locale) is used. - - -NEWLINES - - The -N (--newline) option allows pcregrep to scan files with different - newline conventions from the default. Any parts of the input files that - are written to the standard output are copied identically, with what- - ever newline sequences they have in the input. However, the setting of - this option does not affect the interpretation of files specified by - the -f, --exclude-from, or --include-from options, which are assumed to - use the operating system's standard newline sequence, nor does it - affect the way in which pcregrep writes informational messages to the - standard error and output streams. For these it uses the string "\n" to - indicate newlines, relying on the C I/O library to convert this to an - appropriate sequence. - - -OPTIONS COMPATIBILITY - - Many of the short and long forms of pcregrep's options are the same as - in the GNU grep program. Any long option of the form --xxx-regexp (GNU - terminology) is also available as --xxx-regex (PCRE terminology). How- - ever, the --file-list, --file-offsets, --include-dir, --line-offsets, - --locale, --match-limit, -M, --multiline, -N, --newline, --om-separa- - tor, --recursion-limit, -u, and --utf-8 options are specific to pcre- - grep, as is the use of the --only-matching option with a capturing - parentheses number. - - Although most of the common options work the same way, a few are dif- - ferent in pcregrep. For example, the --include option's argument is a - glob for GNU grep, but a regular expression for pcregrep. If both the - -c and -l options are given, GNU grep lists only file names, without - counts, but pcregrep gives the counts. - - -OPTIONS WITH DATA - - There are four different ways in which an option with data can be spec- - ified. If a short form option is used, the data may follow immedi- - ately, or (with one exception) in the next command line item. For exam- - ple: - - -f/some/file - -f /some/file - - The exception is the -o option, which may appear with or without data. - Because of this, if data is present, it must follow immediately in the - same item, for example -o3. - - If a long form option is used, the data may appear in the same command - line item, separated by an equals character, or (with two exceptions) - it may appear in the next command line item. For example: - - --file=/some/file - --file /some/file - - Note, however, that if you want to supply a file name beginning with ~ - as data in a shell command, and have the shell expand ~ to a home - directory, you must separate the file name from the option, because the - shell does not treat ~ specially unless it is at the start of an item. - - The exceptions to the above are the --colour (or --color) and --only- - matching options, for which the data is optional. If one of these - options does have data, it must be given in the first form, using an - equals character. Otherwise pcregrep will assume that it has no data. - - -MATCHING ERRORS - - It is possible to supply a regular expression that takes a very long - time to fail to match certain lines. Such patterns normally involve - nested indefinite repeats, for example: (a+)*\d when matched against a - line of a's with no final digit. The PCRE matching function has a - resource limit that causes it to abort in these circumstances. If this - happens, pcregrep outputs an error message and the line that caused the - problem to the standard error stream. If there are more than 20 such - errors, pcregrep gives up. - - The --match-limit option of pcregrep can be used to set the overall - resource limit; there is a second option called --recursion-limit that - sets a limit on the amount of memory (usually stack) that is used (see - the discussion of these options above). - - -DIAGNOSTICS - - Exit status is 0 if any matches were found, 1 if no matches were found, - and 2 for syntax errors, overlong lines, non-existent or inaccessible - files (even if matches were found in other files) or too many matching - errors. Using the -s option to suppress error messages about inaccessi- - ble files does not affect the return code. - - -SEE ALSO - - pcrepattern(3), pcresyntax(3), pcretest(1). - - -AUTHOR - - Philip Hazel - University Computing Service - Cambridge CB2 3QH, England. - - -REVISION - - Last updated: 03 April 2014 - Copyright (c) 1997-2014 University of Cambridge. diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/pcretest.txt b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/pcretest.txt deleted file mode 100644 index 6d7305cf..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/doc/pcre/pcretest.txt +++ /dev/null @@ -1,1091 +0,0 @@ -PCRETEST(1) General Commands Manual PCRETEST(1) - - - -NAME - pcretest - a program for testing Perl-compatible regular expressions. - -SYNOPSIS - - pcretest [options] [input file [output file]] - - pcretest was written as a test program for the PCRE regular expression - library itself, but it can also be used for experimenting with regular - expressions. This document describes the features of the test program; - for details of the regular expressions themselves, see the pcrepattern - documentation. For details of the PCRE library function calls and their - options, see the pcreapi , pcre16 and pcre32 documentation. - - The input for pcretest is a sequence of regular expression patterns and - strings to be matched, as described below. The output shows the result - of each match. Options on the command line and the patterns control - PCRE options and exactly what is output. - - As PCRE has evolved, it has acquired many different features, and as a - result, pcretest now has rather a lot of obscure options for testing - every possible feature. Some of these options are specifically designed - for use in conjunction with the test script and data files that are - distributed as part of PCRE, and are unlikely to be of use otherwise. - They are all documented here, but without much justification. - - -INPUT DATA FORMAT - - Input to pcretest is processed line by line, either by calling the C - library's fgets() function, or via the libreadline library (see below). - In Unix-like environments, fgets() treats any bytes other than newline - as data characters. However, in some Windows environments character 26 - (hex 1A) causes an immediate end of file, and no further data is read. - For maximum portability, therefore, it is safest to use only ASCII - characters in pcretest input files. - - The input is processed using using C's string functions, so must not - contain binary zeroes, even though in Unix-like environments, fgets() - treats any bytes other than newline as data characters. - - -PCRE's 8-BIT, 16-BIT AND 32-BIT LIBRARIES - - From release 8.30, two separate PCRE libraries can be built. The origi- - nal one supports 8-bit character strings, whereas the newer 16-bit - library supports character strings encoded in 16-bit units. From - release 8.32, a third library can be built, supporting character - strings encoded in 32-bit units. The pcretest program can be used to - test all three libraries. However, it is itself still an 8-bit program, - reading 8-bit input and writing 8-bit output. When testing the 16-bit - or 32-bit library, the patterns and data strings are converted to 16- - or 32-bit format before being passed to the PCRE library functions. - Results are converted to 8-bit for output. - - References to functions and structures of the form pcre[16|32]_xx below - mean "pcre_xx when using the 8-bit library, pcre16_xx when using the - 16-bit library, or pcre32_xx when using the 32-bit library". - - -COMMAND LINE OPTIONS - - -8 If both the 8-bit library has been built, this option causes - the 8-bit library to be used (which is the default); if the - 8-bit library has not been built, this option causes an - error. - - -16 If both the 8-bit or the 32-bit, and the 16-bit libraries - have been built, this option causes the 16-bit library to be - used. If only the 16-bit library has been built, this is the - default (so has no effect). If only the 8-bit or the 32-bit - library has been built, this option causes an error. - - -32 If both the 8-bit or the 16-bit, and the 32-bit libraries - have been built, this option causes the 32-bit library to be - used. If only the 32-bit library has been built, this is the - default (so has no effect). If only the 8-bit or the 16-bit - library has been built, this option causes an error. - - -b Behave as if each pattern has the /B (show byte code) modi- - fier; the internal form is output after compilation. - - -C Output the version number of the PCRE library, and all avail- - able information about the optional features that are - included, and then exit with zero exit code. All other - options are ignored. - - -C option Output information about a specific build-time option, then - exit. This functionality is intended for use in scripts such - as RunTest. The following options output the value and set - the exit code as indicated: - - ebcdic-nl the code for LF (= NL) in an EBCDIC environment: - 0x15 or 0x25 - 0 if used in an ASCII environment - exit code is always 0 - linksize the configured internal link size (2, 3, or 4) - exit code is set to the link size - newline the default newline setting: - CR, LF, CRLF, ANYCRLF, or ANY - exit code is always 0 - bsr the default setting for what \R matches: - ANYCRLF or ANY - exit code is always 0 - - The following options output 1 for true or 0 for false, and - set the exit code to the same value: - - ebcdic compiled for an EBCDIC environment - jit just-in-time support is available - pcre16 the 16-bit library was built - pcre32 the 32-bit library was built - pcre8 the 8-bit library was built - ucp Unicode property support is available - utf UTF-8 and/or UTF-16 and/or UTF-32 support - is available - - If an unknown option is given, an error message is output; - the exit code is 0. - - -d Behave as if each pattern has the /D (debug) modifier; the - internal form and information about the compiled pattern is - output after compilation; -d is equivalent to -b -i. - - -dfa Behave as if each data line contains the \D escape sequence; - this causes the alternative matching function, - pcre[16|32]_dfa_exec(), to be used instead of the standard - pcre[16|32]_exec() function (more detail is given below). - - -help Output a brief summary these options and then exit. - - -i Behave as if each pattern has the /I modifier; information - about the compiled pattern is given after compilation. - - -M Behave as if each data line contains the \M escape sequence; - this causes PCRE to discover the minimum MATCH_LIMIT and - MATCH_LIMIT_RECURSION settings by calling pcre[16|32]_exec() - repeatedly with different limits. - - -m Output the size of each compiled pattern after it has been - compiled. This is equivalent to adding /M to each regular - expression. The size is given in bytes for both libraries. - - -O Behave as if each pattern has the /O modifier, that is dis- - able auto-possessification for all patterns. - - -o osize Set the number of elements in the output vector that is used - when calling pcre[16|32]_exec() or pcre[16|32]_dfa_exec() to - be osize. The default value is 45, which is enough for 14 - capturing subexpressions for pcre[16|32]_exec() or 22 differ- - ent matches for pcre[16|32]_dfa_exec(). The vector size can - be changed for individual matching calls by including \O in - the data line (see below). - - -p Behave as if each pattern has the /P modifier; the POSIX - wrapper API is used to call PCRE. None of the other options - has any effect when -p is set. This option can be used only - with the 8-bit library. - - -q Do not output the version number of pcretest at the start of - execution. - - -S size On Unix-like systems, set the size of the run-time stack to - size megabytes. - - -s or -s+ Behave as if each pattern has the /S modifier; in other - words, force each pattern to be studied. If -s+ is used, all - the JIT compile options are passed to pcre[16|32]_study(), - causing just-in-time optimization to be set up if it is - available, for both full and partial matching. Specific JIT - compile options can be selected by following -s+ with a digit - in the range 1 to 7, which selects the JIT compile modes as - follows: - - 1 normal match only - 2 soft partial match only - 3 normal match and soft partial match - 4 hard partial match only - 6 soft and hard partial match - 7 all three modes (default) - - If -s++ is used instead of -s+ (with or without a following - digit), the text "(JIT)" is added to the first output line - after a match or no match when JIT-compiled code was actually - used. - - Note that there are pattern options that can override -s, - either specifying no studying at all, or suppressing JIT com- - pilation. - - If the /I or /D option is present on a pattern (requesting - output about the compiled pattern), information about the - result of studying is not included when studying is caused - only by -s and neither -i nor -d is present on the command - line. This behaviour means that the output from tests that - are run with and without -s should be identical, except when - options that output information about the actual running of a - match are set. - - The -M, -t, and -tm options, which give information about - resources used, are likely to produce different output with - and without -s. Output may also differ if the /C option is - present on an individual pattern. This uses callouts to trace - the the matching process, and this may be different between - studied and non-studied patterns. If the pattern contains - (*MARK) items there may also be differences, for the same - reason. The -s command line option can be overridden for spe- - cific patterns that should never be studied (see the /S pat- - tern modifier below). - - -t Run each compile, study, and match many times with a timer, - and output the resulting times per compile, study, or match - (in milliseconds). Do not set -m with -t, because you will - then get the size output a zillion times, and the timing will - be distorted. You can control the number of iterations that - are used for timing by following -t with a number (as a sepa- - rate item on the command line). For example, "-t 1000" iter- - ates 1000 times. The default is to iterate 500000 times. - - -tm This is like -t except that it times only the matching phase, - not the compile or study phases. - - -T -TM These behave like -t and -tm, but in addition, at the end of - a run, the total times for all compiles, studies, and matches - are output. - - -DESCRIPTION - - If pcretest is given two filename arguments, it reads from the first - and writes to the second. If it is given only one filename argument, it - reads from that file and writes to stdout. Otherwise, it reads from - stdin and writes to stdout, and prompts for each line of input, using - "re>" to prompt for regular expressions, and "data>" to prompt for data - lines. - - When pcretest is built, a configuration option can specify that it - should be linked with the libreadline library. When this is done, if - the input is from a terminal, it is read using the readline() function. - This provides line-editing and history facilities. The output from the - -help option states whether or not readline() will be used. - - The program handles any number of sets of input on a single input file. - Each set starts with a regular expression, and continues with any num- - ber of data lines to be matched against that pattern. - - Each data line is matched separately and independently. If you want to - do multi-line matches, you have to use the \n escape sequence (or \r or - \r\n, etc., depending on the newline setting) in a single line of input - to encode the newline sequences. There is no limit on the length of - data lines; the input buffer is automatically extended if it is too - small. - - An empty line signals the end of the data lines, at which point a new - regular expression is read. The regular expressions are given enclosed - in any non-alphanumeric delimiters other than backslash, for example: - - /(a|bc)x+yz/ - - White space before the initial delimiter is ignored. A regular expres- - sion may be continued over several input lines, in which case the new- - line characters are included within it. It is possible to include the - delimiter within the pattern by escaping it, for example - - /abc\/def/ - - If you do so, the escape and the delimiter form part of the pattern, - but since delimiters are always non-alphanumeric, this does not affect - its interpretation. If the terminating delimiter is immediately fol- - lowed by a backslash, for example, - - /abc/\ - - then a backslash is added to the end of the pattern. This is done to - provide a way of testing the error condition that arises if a pattern - finishes with a backslash, because - - /abc\/ - - is interpreted as the first line of a pattern that starts with "abc/", - causing pcretest to read the next line as a continuation of the regular - expression. - - -PATTERN MODIFIERS - - A pattern may be followed by any number of modifiers, which are mostly - single characters, though some of these can be qualified by further - characters. Following Perl usage, these are referred to below as, for - example, "the /i modifier", even though the delimiter of the pattern - need not always be a slash, and no slash is used when writing modi- - fiers. White space may appear between the final pattern delimiter and - the first modifier, and between the modifiers themselves. For refer- - ence, here is a complete list of modifiers. They fall into several - groups that are described in detail in the following sections. - - /8 set UTF mode - /9 set PCRE_NEVER_UTF (locks out UTF mode) - /? disable UTF validity check - /+ show remainder of subject after match - /= show all captures (not just those that are set) - - /A set PCRE_ANCHORED - /B show compiled code - /C set PCRE_AUTO_CALLOUT - /D same as /B plus /I - /E set PCRE_DOLLAR_ENDONLY - /F flip byte order in compiled pattern - /f set PCRE_FIRSTLINE - /G find all matches (shorten string) - /g find all matches (use startoffset) - /I show information about pattern - /i set PCRE_CASELESS - /J set PCRE_DUPNAMES - /K show backtracking control names - /L set locale - /M show compiled memory size - /m set PCRE_MULTILINE - /N set PCRE_NO_AUTO_CAPTURE - /O set PCRE_NO_AUTO_POSSESS - /P use the POSIX wrapper - /Q test external stack check function - /S study the pattern after compilation - /s set PCRE_DOTALL - /T select character tables - /U set PCRE_UNGREEDY - /W set PCRE_UCP - /X set PCRE_EXTRA - /x set PCRE_EXTENDED - /Y set PCRE_NO_START_OPTIMIZE - /Z don't show lengths in /B output - - / set PCRE_NEWLINE_ANY - / set PCRE_NEWLINE_ANYCRLF - / set PCRE_NEWLINE_CR - / set PCRE_NEWLINE_CRLF - / set PCRE_NEWLINE_LF - / set PCRE_BSR_ANYCRLF - / set PCRE_BSR_UNICODE - / set PCRE_JAVASCRIPT_COMPAT - - - Perl-compatible modifiers - - The /i, /m, /s, and /x modifiers set the PCRE_CASELESS, PCRE_MULTILINE, - PCRE_DOTALL, or PCRE_EXTENDED options, respectively, when - pcre[16|32]_compile() is called. These four modifier letters have the - same effect as they do in Perl. For example: - - /caseless/i - - - Modifiers for other PCRE options - - The following table shows additional modifiers for setting PCRE com- - pile-time options that do not correspond to anything in Perl: - - /8 PCRE_UTF8 ) when using the 8-bit - /? PCRE_NO_UTF8_CHECK ) library - - /8 PCRE_UTF16 ) when using the 16-bit - /? PCRE_NO_UTF16_CHECK ) library - - /8 PCRE_UTF32 ) when using the 32-bit - /? PCRE_NO_UTF32_CHECK ) library - - /9 PCRE_NEVER_UTF - /A PCRE_ANCHORED - /C PCRE_AUTO_CALLOUT - /E PCRE_DOLLAR_ENDONLY - /f PCRE_FIRSTLINE - /J PCRE_DUPNAMES - /N PCRE_NO_AUTO_CAPTURE - /O PCRE_NO_AUTO_POSSESS - /U PCRE_UNGREEDY - /W PCRE_UCP - /X PCRE_EXTRA - /Y PCRE_NO_START_OPTIMIZE - / PCRE_NEWLINE_ANY - / PCRE_NEWLINE_ANYCRLF - / PCRE_NEWLINE_CR - / PCRE_NEWLINE_CRLF - / PCRE_NEWLINE_LF - / PCRE_BSR_ANYCRLF - / PCRE_BSR_UNICODE - / PCRE_JAVASCRIPT_COMPAT - - The modifiers that are enclosed in angle brackets are literal strings - as shown, including the angle brackets, but the letters within can be - in either case. This example sets multiline matching with CRLF as the - line ending sequence: - - /^abc/m - - As well as turning on the PCRE_UTF8/16/32 option, the /8 modifier - causes all non-printing characters in output strings to be printed - using the \x{hh...} notation. Otherwise, those less than 0x100 are out- - put in hex without the curly brackets. - - Full details of the PCRE options are given in the pcreapi documenta- - tion. - - Finding all matches in a string - - Searching for all possible matches within each subject string can be - requested by the /g or /G modifier. After finding a match, PCRE is - called again to search the remainder of the subject string. The differ- - ence between /g and /G is that the former uses the startoffset argument - to pcre[16|32]_exec() to start searching at a new point within the - entire string (which is in effect what Perl does), whereas the latter - passes over a shortened substring. This makes a difference to the - matching process if the pattern begins with a lookbehind assertion - (including \b or \B). - - If any call to pcre[16|32]_exec() in a /g or /G sequence matches an - empty string, the next call is done with the PCRE_NOTEMPTY_ATSTART and - PCRE_ANCHORED flags set in order to search for another, non-empty, - match at the same point. If this second match fails, the start offset - is advanced, and the normal match is retried. This imitates the way - Perl handles such cases when using the /g modifier or the split() func- - tion. Normally, the start offset is advanced by one character, but if - the newline convention recognizes CRLF as a newline, and the current - character is CR followed by LF, an advance of two is used. - - Other modifiers - - There are yet more modifiers for controlling the way pcretest operates. - - The /+ modifier requests that as well as outputting the substring that - matched the entire pattern, pcretest should in addition output the - remainder of the subject string. This is useful for tests where the - subject contains multiple copies of the same substring. If the + modi- - fier appears twice, the same action is taken for captured substrings. - In each case the remainder is output on the following line with a plus - character following the capture number. Note that this modifier must - not immediately follow the /S modifier because /S+ and /S++ have other - meanings. - - The /= modifier requests that the values of all potential captured - parentheses be output after a match. By default, only those up to the - highest one actually used in the match are output (corresponding to the - return code from pcre[16|32]_exec()). Values in the offsets vector cor- - responding to higher numbers should be set to -1, and these are output - as "". This modifier gives a way of checking that this is hap- - pening. - - The /B modifier is a debugging feature. It requests that pcretest out- - put a representation of the compiled code after compilation. Normally - this information contains length and offset values; however, if /Z is - also present, this data is replaced by spaces. This is a special fea- - ture for use in the automatic test scripts; it ensures that the same - output is generated for different internal link sizes. - - The /D modifier is a PCRE debugging feature, and is equivalent to /BI, - that is, both the /B and the /I modifiers. - - The /F modifier causes pcretest to flip the byte order of the 2-byte - and 4-byte fields in the compiled pattern. This facility is for testing - the feature in PCRE that allows it to execute patterns that were com- - piled on a host with a different endianness. This feature is not avail- - able when the POSIX interface to PCRE is being used, that is, when the - /P pattern modifier is specified. See also the section about saving and - reloading compiled patterns below. - - The /I modifier requests that pcretest output information about the - compiled pattern (whether it is anchored, has a fixed first character, - and so on). It does this by calling pcre[16|32]_fullinfo() after com- - piling a pattern. If the pattern is studied, the results of that are - also output. In this output, the word "char" means a non-UTF character, - that is, the value of a single data item (8-bit, 16-bit, or 32-bit, - depending on the library that is being tested). - - The /K modifier requests pcretest to show names from backtracking con- - trol verbs that are returned from calls to pcre[16|32]_exec(). It - causes pcretest to create a pcre[16|32]_extra block if one has not - already been created by a call to pcre[16|32]_study(), and to set the - PCRE_EXTRA_MARK flag and the mark field within it, every time that - pcre[16|32]_exec() is called. If the variable that the mark field - points to is non-NULL for a match, non-match, or partial match, - pcretest prints the string to which it points. For a match, this is - shown on a line by itself, tagged with "MK:". For a non-match it is - added to the message. - - The /L modifier must be followed directly by the name of a locale, for - example, - - /pattern/Lfr_FR - - For this reason, it must be the last modifier. The given locale is set, - pcre[16|32]_maketables() is called to build a set of character tables - for the locale, and this is then passed to pcre[16|32]_compile() when - compiling the regular expression. Without an /L (or /T) modifier, NULL - is passed as the tables pointer; that is, /L applies only to the - expression on which it appears. - - The /M modifier causes the size in bytes of the memory block used to - hold the compiled pattern to be output. This does not include the size - of the pcre[16|32] block; it is just the actual compiled data. If the - pattern is successfully studied with the PCRE_STUDY_JIT_COMPILE option, - the size of the JIT compiled code is also output. - - The /Q modifier is used to test the use of pcre_stack_guard. It must be - followed by '0' or '1', specifying the return code to be given from an - external function that is passed to PCRE and used for stack checking - during compilation (see the pcreapi documentation for details). - - The /S modifier causes pcre[16|32]_study() to be called after the - expression has been compiled, and the results used when the expression - is matched. There are a number of qualifying characters that may follow - /S. They may appear in any order. - - If /S is followed by an exclamation mark, pcre[16|32]_study() is called - with the PCRE_STUDY_EXTRA_NEEDED option, causing it always to return a - pcre_extra block, even when studying discovers no useful information. - - If /S is followed by a second S character, it suppresses studying, even - if it was requested externally by the -s command line option. This - makes it possible to specify that certain patterns are always studied, - and others are never studied, independently of -s. This feature is used - in the test files in a few cases where the output is different when the - pattern is studied. - - If the /S modifier is followed by a + character, the call to - pcre[16|32]_study() is made with all the JIT study options, requesting - just-in-time optimization support if it is available, for both normal - and partial matching. If you want to restrict the JIT compiling modes, - you can follow /S+ with a digit in the range 1 to 7: - - 1 normal match only - 2 soft partial match only - 3 normal match and soft partial match - 4 hard partial match only - 6 soft and hard partial match - 7 all three modes (default) - - If /S++ is used instead of /S+ (with or without a following digit), the - text "(JIT)" is added to the first output line after a match or no - match when JIT-compiled code was actually used. - - Note that there is also an independent /+ modifier; it must not be - given immediately after /S or /S+ because this will be misinterpreted. - - If JIT studying is successful, the compiled JIT code will automatically - be used when pcre[16|32]_exec() is run, except when incompatible run- - time options are specified. For more details, see the pcrejit documen- - tation. See also the \J escape sequence below for a way of setting the - size of the JIT stack. - - Finally, if /S is followed by a minus character, JIT compilation is - suppressed, even if it was requested externally by the -s command line - option. This makes it possible to specify that JIT is never to be used - for certain patterns. - - The /T modifier must be followed by a single digit. It causes a spe- - cific set of built-in character tables to be passed to pcre[16|32]_com- - pile(). It is used in the standard PCRE tests to check behaviour with - different character tables. The digit specifies the tables as follows: - - 0 the default ASCII tables, as distributed in - pcre_chartables.c.dist - 1 a set of tables defining ISO 8859 characters - - In table 1, some characters whose codes are greater than 128 are iden- - tified as letters, digits, spaces, etc. - - Using the POSIX wrapper API - - The /P modifier causes pcretest to call PCRE via the POSIX wrapper API - rather than its native API. This supports only the 8-bit library. When - /P is set, the following modifiers set options for the regcomp() func- - tion: - - /i REG_ICASE - /m REG_NEWLINE - /N REG_NOSUB - /s REG_DOTALL ) - /U REG_UNGREEDY ) These options are not part of - /W REG_UCP ) the POSIX standard - /8 REG_UTF8 ) - - The /+ modifier works as described above. All other modifiers are - ignored. - - Locking out certain modifiers - - PCRE can be compiled with or without support for certain features such - as UTF-8/16/32 or Unicode properties. Accordingly, the standard tests - are split up into a number of different files that are selected for - running depending on which features are available. When updating the - tests, it is all too easy to put a new test into the wrong file by mis- - take; for example, to put a test that requires UTF support into a file - that is used when it is not available. To help detect such mistakes as - early as possible, there is a facility for locking out specific modi- - fiers. If an input line for pcretest starts with the string "< forbid " - the following sequence of characters is taken as a list of forbidden - modifiers. For example, in the test files that must not use UTF or Uni- - code property support, this line appears: - - < forbid 8W - - This locks out the /8 and /W modifiers. An immediate error is given if - they are subsequently encountered. If the character string contains < - but not >, all the multi-character modifiers that begin with < are - locked out. Otherwise, such modifiers must be explicitly listed, for - example: - - < forbid - - There must be a single space between < and "forbid" for this feature to - be recognised. If there is not, the line is interpreted either as a - request to re-load a pre-compiled pattern (see "SAVING AND RELOADING - COMPILED PATTERNS" below) or, if there is a another < character, as a - pattern that uses < as its delimiter. - - -DATA LINES - - Before each data line is passed to pcre[16|32]_exec(), leading and - trailing white space is removed, and it is then scanned for \ escapes. - Some of these are pretty esoteric features, intended for checking out - some of the more complicated features of PCRE. If you are just testing - "ordinary" regular expressions, you probably don't need any of these. - The following escapes are recognized: - - \a alarm (BEL, \x07) - \b backspace (\x08) - \e escape (\x27) - \f form feed (\x0c) - \n newline (\x0a) - \qdd set the PCRE_MATCH_LIMIT limit to dd - (any number of digits) - \r carriage return (\x0d) - \t tab (\x09) - \v vertical tab (\x0b) - \nnn octal character (up to 3 octal digits); always - a byte unless > 255 in UTF-8 or 16-bit or 32-bit mode - \o{dd...} octal character (any number of octal digits} - \xhh hexadecimal byte (up to 2 hex digits) - \x{hh...} hexadecimal character (any number of hex digits) - \A pass the PCRE_ANCHORED option to pcre[16|32]_exec() - or pcre[16|32]_dfa_exec() - \B pass the PCRE_NOTBOL option to pcre[16|32]_exec() - or pcre[16|32]_dfa_exec() - \Cdd call pcre[16|32]_copy_substring() for substring dd - after a successful match (number less than 32) - \Cname call pcre[16|32]_copy_named_substring() for substring - "name" after a successful match (name termin- - ated by next non alphanumeric character) - \C+ show the current captured substrings at callout - time - \C- do not supply a callout function - \C!n return 1 instead of 0 when callout number n is - reached - \C!n!m return 1 instead of 0 when callout number n is - reached for the nth time - \C*n pass the number n (may be negative) as callout - data; this is used as the callout return value - \D use the pcre[16|32]_dfa_exec() match function - \F only shortest match for pcre[16|32]_dfa_exec() - \Gdd call pcre[16|32]_get_substring() for substring dd - after a successful match (number less than 32) - \Gname call pcre[16|32]_get_named_substring() for substring - "name" after a successful match (name termin- - ated by next non-alphanumeric character) - \Jdd set up a JIT stack of dd kilobytes maximum (any - number of digits) - \L call pcre[16|32]_get_substringlist() after a - successful match - \M discover the minimum MATCH_LIMIT and - MATCH_LIMIT_RECURSION settings - \N pass the PCRE_NOTEMPTY option to pcre[16|32]_exec() - or pcre[16|32]_dfa_exec(); if used twice, pass the - PCRE_NOTEMPTY_ATSTART option - \Odd set the size of the output vector passed to - pcre[16|32]_exec() to dd (any number of digits) - \P pass the PCRE_PARTIAL_SOFT option to pcre[16|32]_exec() - or pcre[16|32]_dfa_exec(); if used twice, pass the - PCRE_PARTIAL_HARD option - \Qdd set the PCRE_MATCH_LIMIT_RECURSION limit to dd - (any number of digits) - \R pass the PCRE_DFA_RESTART option to pcre[16|32]_dfa_exec() - \S output details of memory get/free calls during matching - \Y pass the PCRE_NO_START_OPTIMIZE option to - pcre[16|32]_exec() - or pcre[16|32]_dfa_exec() - \Z pass the PCRE_NOTEOL option to pcre[16|32]_exec() - or pcre[16|32]_dfa_exec() - \? pass the PCRE_NO_UTF[8|16|32]_CHECK option to - pcre[16|32]_exec() or pcre[16|32]_dfa_exec() - \>dd start the match at offset dd (optional "-"; then - any number of digits); this sets the startoffset - argument for pcre[16|32]_exec() or - pcre[16|32]_dfa_exec() - \ pass the PCRE_NEWLINE_CR option to pcre[16|32]_exec() - or pcre[16|32]_dfa_exec() - \ pass the PCRE_NEWLINE_LF option to pcre[16|32]_exec() - or pcre[16|32]_dfa_exec() - \ pass the PCRE_NEWLINE_CRLF option to pcre[16|32]_exec() - or pcre[16|32]_dfa_exec() - \ pass the PCRE_NEWLINE_ANYCRLF option to pcre[16|32]_exec() - or pcre[16|32]_dfa_exec() - \ pass the PCRE_NEWLINE_ANY option to pcre[16|32]_exec() - or pcre[16|32]_dfa_exec() - - The use of \x{hh...} is not dependent on the use of the /8 modifier on - the pattern. It is recognized always. There may be any number of hexa- - decimal digits inside the braces; invalid values provoke error mes- - sages. - - Note that \xhh specifies one byte rather than one character in UTF-8 - mode; this makes it possible to construct invalid UTF-8 sequences for - testing purposes. On the other hand, \x{hh} is interpreted as a UTF-8 - character in UTF-8 mode, generating more than one byte if the value is - greater than 127. When testing the 8-bit library not in UTF-8 mode, - \x{hh} generates one byte for values less than 256, and causes an error - for greater values. - - In UTF-16 mode, all 4-digit \x{hhhh} values are accepted. This makes it - possible to construct invalid UTF-16 sequences for testing purposes. - - In UTF-32 mode, all 4- to 8-digit \x{...} values are accepted. This - makes it possible to construct invalid UTF-32 sequences for testing - purposes. - - The escapes that specify line ending sequences are literal strings, - exactly as shown. No more than one newline setting should be present in - any data line. - - A backslash followed by anything else just escapes the anything else. - If the very last character is a backslash, it is ignored. This gives a - way of passing an empty line as data, since a real empty line termi- - nates the data input. - - The \J escape provides a way of setting the maximum stack size that is - used by the just-in-time optimization code. It is ignored if JIT opti- - mization is not being used. Providing a stack that is larger than the - default 32K is necessary only for very complicated patterns. - - If \M is present, pcretest calls pcre[16|32]_exec() several times, with - different values in the match_limit and match_limit_recursion fields of - the pcre[16|32]_extra data structure, until it finds the minimum num- - bers for each parameter that allow pcre[16|32]_exec() to complete with- - out error. Because this is testing a specific feature of the normal - interpretive pcre[16|32]_exec() execution, the use of any JIT optimiza- - tion that might have been set up by the /S+ qualifier of -s+ option is - disabled. - - The match_limit number is a measure of the amount of backtracking that - takes place, and checking it out can be instructive. For most simple - matches, the number is quite small, but for patterns with very large - numbers of matching possibilities, it can become large very quickly - with increasing length of subject string. The match_limit_recursion - number is a measure of how much stack (or, if PCRE is compiled with - NO_RECURSE, how much heap) memory is needed to complete the match - attempt. - - When \O is used, the value specified may be higher or lower than the - size set by the -O command line option (or defaulted to 45); \O applies - only to the call of pcre[16|32]_exec() for the line in which it - appears. - - If the /P modifier was present on the pattern, causing the POSIX wrap- - per API to be used, the only option-setting sequences that have any - effect are \B, \N, and \Z, causing REG_NOTBOL, REG_NOTEMPTY, and - REG_NOTEOL, respectively, to be passed to regexec(). - - -THE ALTERNATIVE MATCHING FUNCTION - - By default, pcretest uses the standard PCRE matching function, - pcre[16|32]_exec() to match each data line. PCRE also supports an - alternative matching function, pcre[16|32]_dfa_test(), which operates - in a different way, and has some restrictions. The differences between - the two functions are described in the pcrematching documentation. - - If a data line contains the \D escape sequence, or if the command line - contains the -dfa option, the alternative matching function is used. - This function finds all possible matches at a given point. If, however, - the \F escape sequence is present in the data line, it stops after the - first match is found. This is always the shortest possible match. - - -DEFAULT OUTPUT FROM PCRETEST - - This section describes the output when the normal matching function, - pcre[16|32]_exec(), is being used. - - When a match succeeds, pcretest outputs the list of captured substrings - that pcre[16|32]_exec() returns, starting with number 0 for the string - that matched the whole pattern. Otherwise, it outputs "No match" when - the return is PCRE_ERROR_NOMATCH, and "Partial match:" followed by the - partially matching substring when pcre[16|32]_exec() returns - PCRE_ERROR_PARTIAL. (Note that this is the entire substring that was - inspected during the partial match; it may include characters before - the actual match start if a lookbehind assertion, \K, \b, or \B was - involved.) For any other return, pcretest outputs the PCRE negative - error number and a short descriptive phrase. If the error is a failed - UTF string check, the offset of the start of the failing character and - the reason code are also output, provided that the size of the output - vector is at least two. Here is an example of an interactive pcretest - run. - - $ pcretest - PCRE version 8.13 2011-04-30 - - re> /^abc(\d+)/ - data> abc123 - 0: abc123 - 1: 123 - data> xyz - No match - - Unset capturing substrings that are not followed by one that is set are - not returned by pcre[16|32]_exec(), and are not shown by pcretest. In - the following example, there are two capturing substrings, but when the - first data line is matched, the second, unset substring is not shown. - An "internal" unset substring is shown as "", as for the second - data line. - - re> /(a)|(b)/ - data> a - 0: a - 1: a - data> b - 0: b - 1: - 2: b - - If the strings contain any non-printing characters, they are output as - \xhh escapes if the value is less than 256 and UTF mode is not set. - Otherwise they are output as \x{hh...} escapes. See below for the defi- - nition of non-printing characters. If the pattern has the /+ modifier, - the output for substring 0 is followed by the the rest of the subject - string, identified by "0+" like this: - - re> /cat/+ - data> cataract - 0: cat - 0+ aract - - If the pattern has the /g or /G modifier, the results of successive - matching attempts are output in sequence, like this: - - re> /\Bi(\w\w)/g - data> Mississippi - 0: iss - 1: ss - 0: iss - 1: ss - 0: ipp - 1: pp - - "No match" is output only if the first match attempt fails. Here is an - example of a failure message (the offset 4 that is specified by \>4 is - past the end of the subject string): - - re> /xyz/ - data> xyz\>4 - Error -24 (bad offset value) - - If any of the sequences \C, \G, or \L are present in a data line that - is successfully matched, the substrings extracted by the convenience - functions are output with C, G, or L after the string number instead of - a colon. This is in addition to the normal full list. The string length - (that is, the return from the extraction function) is given in paren- - theses after each string for \C and \G. - - Note that whereas patterns can be continued over several lines (a plain - ">" prompt is used for continuations), data lines may not. However new- - lines can be included in data by means of the \n escape (or \r, \r\n, - etc., depending on the newline sequence setting). - - -OUTPUT FROM THE ALTERNATIVE MATCHING FUNCTION - - When the alternative matching function, pcre[16|32]_dfa_exec(), is used - (by means of the \D escape sequence or the -dfa command line option), - the output consists of a list of all the matches that start at the - first point in the subject where there is at least one match. For exam- - ple: - - re> /(tang|tangerine|tan)/ - data> yellow tangerine\D - 0: tangerine - 1: tang - 2: tan - - (Using the normal matching function on this data finds only "tang".) - The longest matching string is always given first (and numbered zero). - After a PCRE_ERROR_PARTIAL return, the output is "Partial match:", fol- - lowed by the partially matching substring. (Note that this is the - entire substring that was inspected during the partial match; it may - include characters before the actual match start if a lookbehind asser- - tion, \K, \b, or \B was involved.) - - If /g is present on the pattern, the search for further matches resumes - at the end of the longest match. For example: - - re> /(tang|tangerine|tan)/g - data> yellow tangerine and tangy sultana\D - 0: tangerine - 1: tang - 2: tan - 0: tang - 1: tan - 0: tan - - Since the matching function does not support substring capture, the - escape sequences that are concerned with captured substrings are not - relevant. - - -RESTARTING AFTER A PARTIAL MATCH - - When the alternative matching function has given the PCRE_ERROR_PARTIAL - return, indicating that the subject partially matched the pattern, you - can restart the match with additional subject data by means of the \R - escape sequence. For example: - - re> /^\d?\d(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)\d\d$/ - data> 23ja\P\D - Partial match: 23ja - data> n05\R\D - 0: n05 - - For further information about partial matching, see the pcrepartial - documentation. - - -CALLOUTS - - If the pattern contains any callout requests, pcretest's callout func- - tion is called during matching. This works with both matching func- - tions. By default, the called function displays the callout number, the - start and current positions in the text at the callout time, and the - next pattern item to be tested. For example: - - --->pqrabcdef - 0 ^ ^ \d - - This output indicates that callout number 0 occurred for a match - attempt starting at the fourth character of the subject string, when - the pointer was at the seventh character of the data, and when the next - pattern item was \d. Just one circumflex is output if the start and - current positions are the same. - - Callouts numbered 255 are assumed to be automatic callouts, inserted as - a result of the /C pattern modifier. In this case, instead of showing - the callout number, the offset in the pattern, preceded by a plus, is - output. For example: - - re> /\d?[A-E]\*/C - data> E* - --->E* - +0 ^ \d? - +3 ^ [A-E] - +8 ^^ \* - +10 ^ ^ - 0: E* - - If a pattern contains (*MARK) items, an additional line is output when- - ever a change of latest mark is passed to the callout function. For - example: - - re> /a(*MARK:X)bc/C - data> abc - --->abc - +0 ^ a - +1 ^^ (*MARK:X) - +10 ^^ b - Latest Mark: X - +11 ^ ^ c - +12 ^ ^ - 0: abc - - The mark changes between matching "a" and "b", but stays the same for - the rest of the match, so nothing more is output. If, as a result of - backtracking, the mark reverts to being unset, the text "" is - output. - - The callout function in pcretest returns zero (carry on matching) by - default, but you can use a \C item in a data line (as described above) - to change this and other parameters of the callout. - - Inserting callouts can be helpful when using pcretest to check compli- - cated regular expressions. For further information about callouts, see - the pcrecallout documentation. - - -NON-PRINTING CHARACTERS - - When pcretest is outputting text in the compiled version of a pattern, - bytes other than 32-126 are always treated as non-printing characters - are are therefore shown as hex escapes. - - When pcretest is outputting text that is a matched part of a subject - string, it behaves in the same way, unless a different locale has been - set for the pattern (using the /L modifier). In this case, the - isprint() function to distinguish printing and non-printing characters. - - -SAVING AND RELOADING COMPILED PATTERNS - - The facilities described in this section are not available when the - POSIX interface to PCRE is being used, that is, when the /P pattern - modifier is specified. - - When the POSIX interface is not in use, you can cause pcretest to write - a compiled pattern to a file, by following the modifiers with > and a - file name. For example: - - /pattern/im >/some/file - - See the pcreprecompile documentation for a discussion about saving and - re-using compiled patterns. Note that if the pattern was successfully - studied with JIT optimization, the JIT data cannot be saved. - - The data that is written is binary. The first eight bytes are the - length of the compiled pattern data followed by the length of the - optional study data, each written as four bytes in big-endian order - (most significant byte first). If there is no study data (either the - pattern was not studied, or studying did not return any data), the sec- - ond length is zero. The lengths are followed by an exact copy of the - compiled pattern. If there is additional study data, this (excluding - any JIT data) follows immediately after the compiled pattern. After - writing the file, pcretest expects to read a new pattern. - - A saved pattern can be reloaded into pcretest by specifying < and a - file name instead of a pattern. There must be no space between < and - the file name, which must not contain a < character, as otherwise - pcretest will interpret the line as a pattern delimited by < charac- - ters. For example: - - re> \fP. When there is more than one pattern -(specified by the use of \fB-e\fP and/or \fB-f\fP), each pattern is applied to -each line in the order in which they are defined, except that all the \fB-e\fP -patterns are tried before the \fB-f\fP patterns. -.P -By default, as soon as one pattern matches a line, no further patterns are -considered. However, if \fB--colour\fP (or \fB--color\fP) is used to colour the -matching substrings, or if \fB--only-matching\fP, \fB--file-offsets\fP, or -\fB--line-offsets\fP is used to output only the part of the line that matched -(either shown literally, or as an offset), scanning resumes immediately -following the match, so that further matches on the same line can be found. If -there are multiple patterns, they are all tried on the remainder of the line, -but patterns that follow the one that matched are not tried on the earlier part -of the line. -.P -This behaviour means that the order in which multiple patterns are specified -can affect the output when one of the above options is used. This is no longer -the same behaviour as GNU grep, which now manages to display earlier matches -for later patterns (as long as there is no overlap). -.P -Patterns that can match an empty string are accepted, but empty string -matches are never recognized. An example is the pattern "(super)?(man)?", in -which all components are optional. This pattern finds all occurrences of both -"super" and "man"; the output differs from matching with "super|man" when only -the matching substrings are being shown. -.P -If the \fBLC_ALL\fP or \fBLC_CTYPE\fP environment variable is set, -\fBpcregrep\fP uses the value to set a locale when calling the PCRE library. -The \fB--locale\fP option can be used to override this. -. -. -.SH "SUPPORT FOR COMPRESSED FILES" -.rs -.sp -It is possible to compile \fBpcregrep\fP so that it uses \fBlibz\fP or -\fBlibbz2\fP to read files whose names end in \fB.gz\fP or \fB.bz2\fP, -respectively. You can find out whether your binary has support for one or both -of these file types by running it with the \fB--help\fP option. If the -appropriate support is not present, files are treated as plain text. The -standard input is always so treated. -. -. -.SH "BINARY FILES" -.rs -.sp -By default, a file that contains a binary zero byte within the first 1024 bytes -is identified as a binary file, and is processed specially. (GNU grep also -identifies binary files in this manner.) See the \fB--binary-files\fP option -for a means of changing the way binary files are handled. -. -. -.SH OPTIONS -.rs -.sp -The order in which some of the options appear can affect the output. For -example, both the \fB-h\fP and \fB-l\fP options affect the printing of file -names. Whichever comes later in the command line will be the one that takes -effect. Similarly, except where noted below, if an option is given twice, the -later setting is used. Numerical values for options may be followed by K or M, -to signify multiplication by 1024 or 1024*1024 respectively. -.TP 10 -\fB--\fP -This terminates the list of options. It is useful if the next item on the -command line starts with a hyphen but is not an option. This allows for the -processing of patterns and filenames that start with hyphens. -.TP -\fB-A\fP \fInumber\fP, \fB--after-context=\fP\fInumber\fP -Output \fInumber\fP lines of context after each matching line. If filenames -and/or line numbers are being output, a hyphen separator is used instead of a -colon for the context lines. A line containing "--" is output between each -group of lines, unless they are in fact contiguous in the input file. The value -of \fInumber\fP is expected to be relatively small. However, \fBpcregrep\fP -guarantees to have up to 8K of following text available for context output. -.TP -\fB-a\fP, \fB--text\fP -Treat binary files as text. This is equivalent to -\fB--binary-files\fP=\fItext\fP. -.TP -\fB-B\fP \fInumber\fP, \fB--before-context=\fP\fInumber\fP -Output \fInumber\fP lines of context before each matching line. If filenames -and/or line numbers are being output, a hyphen separator is used instead of a -colon for the context lines. A line containing "--" is output between each -group of lines, unless they are in fact contiguous in the input file. The value -of \fInumber\fP is expected to be relatively small. However, \fBpcregrep\fP -guarantees to have up to 8K of preceding text available for context output. -.TP -\fB--binary-files=\fP\fIword\fP -Specify how binary files are to be processed. If the word is "binary" (the -default), pattern matching is performed on binary files, but the only output is -"Binary file matches" when a match succeeds. If the word is "text", -which is equivalent to the \fB-a\fP or \fB--text\fP option, binary files are -processed in the same way as any other file. In this case, when a match -succeeds, the output may be binary garbage, which can have nasty effects if -sent to a terminal. If the word is "without-match", which is equivalent to the -\fB-I\fP option, binary files are not processed at all; they are assumed not to -be of interest. -.TP -\fB--buffer-size=\fP\fInumber\fP -Set the parameter that controls how much memory is used for buffering files -that are being scanned. -.TP -\fB-C\fP \fInumber\fP, \fB--context=\fP\fInumber\fP -Output \fInumber\fP lines of context both before and after each matching line. -This is equivalent to setting both \fB-A\fP and \fB-B\fP to the same value. -.TP -\fB-c\fP, \fB--count\fP -Do not output individual lines from the files that are being scanned; instead -output the number of lines that would otherwise have been shown. If no lines -are selected, the number zero is output. If several files are are being -scanned, a count is output for each of them. However, if the -\fB--files-with-matches\fP option is also used, only those files whose counts -are greater than zero are listed. When \fB-c\fP is used, the \fB-A\fP, -\fB-B\fP, and \fB-C\fP options are ignored. -.TP -\fB--colour\fP, \fB--color\fP -If this option is given without any data, it is equivalent to "--colour=auto". -If data is required, it must be given in the same shell item, separated by an -equals sign. -.TP -\fB--colour=\fP\fIvalue\fP, \fB--color=\fP\fIvalue\fP -This option specifies under what circumstances the parts of a line that matched -a pattern should be coloured in the output. By default, the output is not -coloured. The value (which is optional, see above) may be "never", "always", or -"auto". In the latter case, colouring happens only if the standard output is -connected to a terminal. More resources are used when colouring is enabled, -because \fBpcregrep\fP has to search for all possible matches in a line, not -just one, in order to colour them all. -.sp -The colour that is used can be specified by setting the environment variable -PCREGREP_COLOUR or PCREGREP_COLOR. The value of this variable should be a -string of two numbers, separated by a semicolon. They are copied directly into -the control string for setting colour on a terminal, so it is your -responsibility to ensure that they make sense. If neither of the environment -variables is set, the default is "1;31", which gives red. -.TP -\fB-D\fP \fIaction\fP, \fB--devices=\fP\fIaction\fP -If an input path is not a regular file or a directory, "action" specifies how -it is to be processed. Valid values are "read" (the default) or "skip" -(silently skip the path). -.TP -\fB-d\fP \fIaction\fP, \fB--directories=\fP\fIaction\fP -If an input path is a directory, "action" specifies how it is to be processed. -Valid values are "read" (the default in non-Windows environments, for -compatibility with GNU grep), "recurse" (equivalent to the \fB-r\fP option), or -"skip" (silently skip the path, the default in Windows environments). In the -"read" case, directories are read as if they were ordinary files. In some -operating systems the effect of reading a directory like this is an immediate -end-of-file; in others it may provoke an error. -.TP -\fB-e\fP \fIpattern\fP, \fB--regex=\fP\fIpattern\fP, \fB--regexp=\fP\fIpattern\fP -Specify a pattern to be matched. This option can be used multiple times in -order to specify several patterns. It can also be used as a way of specifying a -single pattern that starts with a hyphen. When \fB-e\fP is used, no argument -pattern is taken from the command line; all arguments are treated as file -names. There is no limit to the number of patterns. They are applied to each -line in the order in which they are defined until one matches. -.sp -If \fB-f\fP is used with \fB-e\fP, the command line patterns are matched first, -followed by the patterns from the file(s), independent of the order in which -these options are specified. Note that multiple use of \fB-e\fP is not the same -as a single pattern with alternatives. For example, X|Y finds the first -character in a line that is X or Y, whereas if the two patterns are given -separately, with X first, \fBpcregrep\fP finds X if it is present, even if it -follows Y in the line. It finds Y only if there is no X in the line. This -matters only if you are using \fB-o\fP or \fB--colo(u)r\fP to show the part(s) -of the line that matched. -.TP -\fB--exclude\fP=\fIpattern\fP -Files (but not directories) whose names match the pattern are skipped without -being processed. This applies to all files, whether listed on the command line, -obtained from \fB--file-list\fP, or by scanning a directory. The pattern is a -PCRE regular expression, and is matched against the final component of the file -name, not the entire path. The \fB-F\fP, \fB-w\fP, and \fB-x\fP options do not -apply to this pattern. The option may be given any number of times in order to -specify multiple patterns. If a file name matches both an \fB--include\fP -and an \fB--exclude\fP pattern, it is excluded. There is no short form for this -option. -.TP -\fB--exclude-from=\fP\fIfilename\fP -Treat each non-empty line of the file as the data for an \fB--exclude\fP -option. What constitutes a newline when reading the file is the operating -system's default. The \fB--newline\fP option has no effect on this option. This -option may be given more than once in order to specify a number of files to -read. -.TP -\fB--exclude-dir\fP=\fIpattern\fP -Directories whose names match the pattern are skipped without being processed, -whatever the setting of the \fB--recursive\fP option. This applies to all -directories, whether listed on the command line, obtained from -\fB--file-list\fP, or by scanning a parent directory. The pattern is a PCRE -regular expression, and is matched against the final component of the directory -name, not the entire path. The \fB-F\fP, \fB-w\fP, and \fB-x\fP options do not -apply to this pattern. The option may be given any number of times in order to -specify more than one pattern. If a directory matches both \fB--include-dir\fP -and \fB--exclude-dir\fP, it is excluded. There is no short form for this -option. -.TP -\fB-F\fP, \fB--fixed-strings\fP -Interpret each data-matching pattern as a list of fixed strings, separated by -newlines, instead of as a regular expression. What constitutes a newline for -this purpose is controlled by the \fB--newline\fP option. The \fB-w\fP (match -as a word) and \fB-x\fP (match whole line) options can be used with \fB-F\fP. -They apply to each of the fixed strings. A line is selected if any of the fixed -strings are found in it (subject to \fB-w\fP or \fB-x\fP, if present). This -option applies only to the patterns that are matched against the contents of -files; it does not apply to patterns specified by any of the \fB--include\fP or -\fB--exclude\fP options. -.TP -\fB-f\fP \fIfilename\fP, \fB--file=\fP\fIfilename\fP -Read patterns from the file, one per line, and match them against -each line of input. What constitutes a newline when reading the file is the -operating system's default. The \fB--newline\fP option has no effect on this -option. Trailing white space is removed from each line, and blank lines are -ignored. An empty file contains no patterns and therefore matches nothing. See -also the comments about multiple patterns versus a single pattern with -alternatives in the description of \fB-e\fP above. -.sp -If this option is given more than once, all the specified files are -read. A data line is output if any of the patterns match it. A filename can -be given as "-" to refer to the standard input. When \fB-f\fP is used, patterns -specified on the command line using \fB-e\fP may also be present; they are -tested before the file's patterns. However, no other pattern is taken from the -command line; all arguments are treated as the names of paths to be searched. -.TP -\fB--file-list\fP=\fIfilename\fP -Read a list of files and/or directories that are to be scanned from the given -file, one per line. Trailing white space is removed from each line, and blank -lines are ignored. These paths are processed before any that are listed on the -command line. The filename can be given as "-" to refer to the standard input. -If \fB--file\fP and \fB--file-list\fP are both specified as "-", patterns are -read first. This is useful only when the standard input is a terminal, from -which further lines (the list of files) can be read after an end-of-file -indication. If this option is given more than once, all the specified files are -read. -.TP -\fB--file-offsets\fP -Instead of showing lines or parts of lines that match, show each match as an -offset from the start of the file and a length, separated by a comma. In this -mode, no context is shown. That is, the \fB-A\fP, \fB-B\fP, and \fB-C\fP -options are ignored. If there is more than one match in a line, each of them is -shown separately. This option is mutually exclusive with \fB--line-offsets\fP -and \fB--only-matching\fP. -.TP -\fB-H\fP, \fB--with-filename\fP -Force the inclusion of the filename at the start of output lines when searching -a single file. By default, the filename is not shown in this case. For matching -lines, the filename is followed by a colon; for context lines, a hyphen -separator is used. If a line number is also being output, it follows the file -name. -.TP -\fB-h\fP, \fB--no-filename\fP -Suppress the output filenames when searching multiple files. By default, -filenames are shown when multiple files are searched. For matching lines, the -filename is followed by a colon; for context lines, a hyphen separator is used. -If a line number is also being output, it follows the file name. -.TP -\fB--help\fP -Output a help message, giving brief details of the command options and file -type support, and then exit. Anything else on the command line is -ignored. -.TP -\fB-I\fP -Treat binary files as never matching. This is equivalent to -\fB--binary-files\fP=\fIwithout-match\fP. -.TP -\fB-i\fP, \fB--ignore-case\fP -Ignore upper/lower case distinctions during comparisons. -.TP -\fB--include\fP=\fIpattern\fP -If any \fB--include\fP patterns are specified, the only files that are -processed are those that match one of the patterns (and do not match an -\fB--exclude\fP pattern). This option does not affect directories, but it -applies to all files, whether listed on the command line, obtained from -\fB--file-list\fP, or by scanning a directory. The pattern is a PCRE regular -expression, and is matched against the final component of the file name, not -the entire path. The \fB-F\fP, \fB-w\fP, and \fB-x\fP options do not apply to -this pattern. The option may be given any number of times. If a file name -matches both an \fB--include\fP and an \fB--exclude\fP pattern, it is excluded. -There is no short form for this option. -.TP -\fB--include-from=\fP\fIfilename\fP -Treat each non-empty line of the file as the data for an \fB--include\fP -option. What constitutes a newline for this purpose is the operating system's -default. The \fB--newline\fP option has no effect on this option. This option -may be given any number of times; all the files are read. -.TP -\fB--include-dir\fP=\fIpattern\fP -If any \fB--include-dir\fP patterns are specified, the only directories that -are processed are those that match one of the patterns (and do not match an -\fB--exclude-dir\fP pattern). This applies to all directories, whether listed -on the command line, obtained from \fB--file-list\fP, or by scanning a parent -directory. The pattern is a PCRE regular expression, and is matched against the -final component of the directory name, not the entire path. The \fB-F\fP, -\fB-w\fP, and \fB-x\fP options do not apply to this pattern. The option may be -given any number of times. If a directory matches both \fB--include-dir\fP and -\fB--exclude-dir\fP, it is excluded. There is no short form for this option. -.TP -\fB-L\fP, \fB--files-without-match\fP -Instead of outputting lines from the files, just output the names of the files -that do not contain any lines that would have been output. Each file name is -output once, on a separate line. -.TP -\fB-l\fP, \fB--files-with-matches\fP -Instead of outputting lines from the files, just output the names of the files -containing lines that would have been output. Each file name is output -once, on a separate line. Searching normally stops as soon as a matching line -is found in a file. However, if the \fB-c\fP (count) option is also used, -matching continues in order to obtain the correct count, and those files that -have at least one match are listed along with their counts. Using this option -with \fB-c\fP is a way of suppressing the listing of files with no matches. -.TP -\fB--label\fP=\fIname\fP -This option supplies a name to be used for the standard input when file names -are being output. If not supplied, "(standard input)" is used. There is no -short form for this option. -.TP -\fB--line-buffered\fP -When this option is given, input is read and processed line by line, and the -output is flushed after each write. By default, input is read in large chunks, -unless \fBpcregrep\fP can determine that it is reading from a terminal (which -is currently possible only in Unix-like environments). Output to terminal is -normally automatically flushed by the operating system. This option can be -useful when the input or output is attached to a pipe and you do not want -\fBpcregrep\fP to buffer up large amounts of data. However, its use will affect -performance, and the \fB-M\fP (multiline) option ceases to work. -.TP -\fB--line-offsets\fP -Instead of showing lines or parts of lines that match, show each match as a -line number, the offset from the start of the line, and a length. The line -number is terminated by a colon (as usual; see the \fB-n\fP option), and the -offset and length are separated by a comma. In this mode, no context is shown. -That is, the \fB-A\fP, \fB-B\fP, and \fB-C\fP options are ignored. If there is -more than one match in a line, each of them is shown separately. This option is -mutually exclusive with \fB--file-offsets\fP and \fB--only-matching\fP. -.TP -\fB--locale\fP=\fIlocale-name\fP -This option specifies a locale to be used for pattern matching. It overrides -the value in the \fBLC_ALL\fP or \fBLC_CTYPE\fP environment variables. If no -locale is specified, the PCRE library's default (usually the "C" locale) is -used. There is no short form for this option. -.TP -\fB--match-limit\fP=\fInumber\fP -Processing some regular expression patterns can require a very large amount of -memory, leading in some cases to a program crash if not enough is available. -Other patterns may take a very long time to search for all possible matching -strings. The \fBpcre_exec()\fP function that is called by \fBpcregrep\fP to do -the matching has two parameters that can limit the resources that it uses. -.sp -The \fB--match-limit\fP option provides a means of limiting resource usage -when processing patterns that are not going to match, but which have a very -large number of possibilities in their search trees. The classic example is a -pattern that uses nested unlimited repeats. Internally, PCRE uses a function -called \fBmatch()\fP which it calls repeatedly (sometimes recursively). The -limit set by \fB--match-limit\fP is imposed on the number of times this -function is called during a match, which has the effect of limiting the amount -of backtracking that can take place. -.sp -The \fB--recursion-limit\fP option is similar to \fB--match-limit\fP, but -instead of limiting the total number of times that \fBmatch()\fP is called, it -limits the depth of recursive calls, which in turn limits the amount of memory -that can be used. The recursion depth is a smaller number than the total number -of calls, because not all calls to \fBmatch()\fP are recursive. This limit is -of use only if it is set smaller than \fB--match-limit\fP. -.sp -There are no short forms for these options. The default settings are specified -when the PCRE library is compiled, with the default default being 10 million. -.TP -\fB-M\fP, \fB--multiline\fP -Allow patterns to match more than one line. When this option is given, patterns -may usefully contain literal newline characters and internal occurrences of ^ -and $ characters. The output for a successful match may consist of more than -one line, the last of which is the one in which the match ended. If the matched -string ends with a newline sequence the output ends at the end of that line. -.sp -When this option is set, the PCRE library is called in "multiline" mode. -There is a limit to the number of lines that can be matched, imposed by the way -that \fBpcregrep\fP buffers the input file as it scans it. However, -\fBpcregrep\fP ensures that at least 8K characters or the rest of the document -(whichever is the shorter) are available for forward matching, and similarly -the previous 8K characters (or all the previous characters, if fewer than 8K) -are guaranteed to be available for lookbehind assertions. This option does not -work when input is read line by line (see \fP--line-buffered\fP.) -.TP -\fB-N\fP \fInewline-type\fP, \fB--newline\fP=\fInewline-type\fP -The PCRE library supports five different conventions for indicating -the ends of lines. They are the single-character sequences CR (carriage return) -and LF (linefeed), the two-character sequence CRLF, an "anycrlf" convention, -which recognizes any of the preceding three types, and an "any" convention, in -which any Unicode line ending sequence is assumed to end a line. The Unicode -sequences are the three just mentioned, plus VT (vertical tab, U+000B), FF -(form feed, U+000C), NEL (next line, U+0085), LS (line separator, U+2028), and -PS (paragraph separator, U+2029). -.sp -When the PCRE library is built, a default line-ending sequence is specified. -This is normally the standard sequence for the operating system. Unless -otherwise specified by this option, \fBpcregrep\fP uses the library's default. -The possible values for this option are CR, LF, CRLF, ANYCRLF, or ANY. This -makes it possible to use \fBpcregrep\fP to scan files that have come from other -environments without having to modify their line endings. If the data that is -being scanned does not agree with the convention set by this option, -\fBpcregrep\fP may behave in strange ways. Note that this option does not -apply to files specified by the \fB-f\fP, \fB--exclude-from\fP, or -\fB--include-from\fP options, which are expected to use the operating system's -standard newline sequence. -.TP -\fB-n\fP, \fB--line-number\fP -Precede each output line by its line number in the file, followed by a colon -for matching lines or a hyphen for context lines. If the filename is also being -output, it precedes the line number. This option is forced if -\fB--line-offsets\fP is used. -.TP -\fB--no-jit\fP -If the PCRE library is built with support for just-in-time compiling (which -speeds up matching), \fBpcregrep\fP automatically makes use of this, unless it -was explicitly disabled at build time. This option can be used to disable the -use of JIT at run time. It is provided for testing and working round problems. -It should never be needed in normal use. -.TP -\fB-o\fP, \fB--only-matching\fP -Show only the part of the line that matched a pattern instead of the whole -line. In this mode, no context is shown. That is, the \fB-A\fP, \fB-B\fP, and -\fB-C\fP options are ignored. If there is more than one match in a line, each -of them is shown separately. If \fB-o\fP is combined with \fB-v\fP (invert the -sense of the match to find non-matching lines), no output is generated, but the -return code is set appropriately. If the matched portion of the line is empty, -nothing is output unless the file name or line number are being printed, in -which case they are shown on an otherwise empty line. This option is mutually -exclusive with \fB--file-offsets\fP and \fB--line-offsets\fP. -.TP -\fB-o\fP\fInumber\fP, \fB--only-matching\fP=\fInumber\fP -Show only the part of the line that matched the capturing parentheses of the -given number. Up to 32 capturing parentheses are supported, and -o0 is -equivalent to \fB-o\fP without a number. Because these options can be given -without an argument (see above), if an argument is present, it must be given in -the same shell item, for example, -o3 or --only-matching=2. The comments given -for the non-argument case above also apply to this case. If the specified -capturing parentheses do not exist in the pattern, or were not set in the -match, nothing is output unless the file name or line number are being printed. -.sp -If this option is given multiple times, multiple substrings are output, in the -order the options are given. For example, -o3 -o1 -o3 causes the substrings -matched by capturing parentheses 3 and 1 and then 3 again to be output. By -default, there is no separator (but see the next option). -.TP -\fB--om-separator\fP=\fItext\fP -Specify a separating string for multiple occurrences of \fB-o\fP. The default -is an empty string. Separating strings are never coloured. -.TP -\fB-q\fP, \fB--quiet\fP -Work quietly, that is, display nothing except error messages. The exit -status indicates whether or not any matches were found. -.TP -\fB-r\fP, \fB--recursive\fP -If any given path is a directory, recursively scan the files it contains, -taking note of any \fB--include\fP and \fB--exclude\fP settings. By default, a -directory is read as a normal file; in some operating systems this gives an -immediate end-of-file. This option is a shorthand for setting the \fB-d\fP -option to "recurse". -.TP -\fB--recursion-limit\fP=\fInumber\fP -See \fB--match-limit\fP above. -.TP -\fB-s\fP, \fB--no-messages\fP -Suppress error messages about non-existent or unreadable files. Such files are -quietly skipped. However, the return code is still 2, even if matches were -found in other files. -.TP -\fB-u\fP, \fB--utf-8\fP -Operate in UTF-8 mode. This option is available only if PCRE has been compiled -with UTF-8 support. All patterns (including those for any \fB--exclude\fP and -\fB--include\fP options) and all subject lines that are scanned must be valid -strings of UTF-8 characters. -.TP -\fB-V\fP, \fB--version\fP -Write the version numbers of \fBpcregrep\fP and the PCRE library to the -standard output and then exit. Anything else on the command line is -ignored. -.TP -\fB-v\fP, \fB--invert-match\fP -Invert the sense of the match, so that lines which do \fInot\fP match any of -the patterns are the ones that are found. -.TP -\fB-w\fP, \fB--word-regex\fP, \fB--word-regexp\fP -Force the patterns to match only whole words. This is equivalent to having \eb -at the start and end of the pattern. This option applies only to the patterns -that are matched against the contents of files; it does not apply to patterns -specified by any of the \fB--include\fP or \fB--exclude\fP options. -.TP -\fB-x\fP, \fB--line-regex\fP, \fB--line-regexp\fP -Force the patterns to be anchored (each must start matching at the beginning of -a line) and in addition, require them to match entire lines. This is equivalent -to having ^ and $ characters at the start and end of each alternative branch in -every pattern. This option applies only to the patterns that are matched -against the contents of files; it does not apply to patterns specified by any -of the \fB--include\fP or \fB--exclude\fP options. -. -. -.SH "ENVIRONMENT VARIABLES" -.rs -.sp -The environment variables \fBLC_ALL\fP and \fBLC_CTYPE\fP are examined, in that -order, for a locale. The first one that is set is used. This can be overridden -by the \fB--locale\fP option. If no locale is set, the PCRE library's default -(usually the "C" locale) is used. -. -. -.SH "NEWLINES" -.rs -.sp -The \fB-N\fP (\fB--newline\fP) option allows \fBpcregrep\fP to scan files with -different newline conventions from the default. Any parts of the input files -that are written to the standard output are copied identically, with whatever -newline sequences they have in the input. However, the setting of this option -does not affect the interpretation of files specified by the \fB-f\fP, -\fB--exclude-from\fP, or \fB--include-from\fP options, which are assumed to use -the operating system's standard newline sequence, nor does it affect the way in -which \fBpcregrep\fP writes informational messages to the standard error and -output streams. For these it uses the string "\en" to indicate newlines, -relying on the C I/O library to convert this to an appropriate sequence. -. -. -.SH "OPTIONS COMPATIBILITY" -.rs -.sp -Many of the short and long forms of \fBpcregrep\fP's options are the same -as in the GNU \fBgrep\fP program. Any long option of the form -\fB--xxx-regexp\fP (GNU terminology) is also available as \fB--xxx-regex\fP -(PCRE terminology). However, the \fB--file-list\fP, \fB--file-offsets\fP, -\fB--include-dir\fP, \fB--line-offsets\fP, \fB--locale\fP, \fB--match-limit\fP, -\fB-M\fP, \fB--multiline\fP, \fB-N\fP, \fB--newline\fP, \fB--om-separator\fP, -\fB--recursion-limit\fP, \fB-u\fP, and \fB--utf-8\fP options are specific to -\fBpcregrep\fP, as is the use of the \fB--only-matching\fP option with a -capturing parentheses number. -.P -Although most of the common options work the same way, a few are different in -\fBpcregrep\fP. For example, the \fB--include\fP option's argument is a glob -for GNU \fBgrep\fP, but a regular expression for \fBpcregrep\fP. If both the -\fB-c\fP and \fB-l\fP options are given, GNU grep lists only file names, -without counts, but \fBpcregrep\fP gives the counts. -. -. -.SH "OPTIONS WITH DATA" -.rs -.sp -There are four different ways in which an option with data can be specified. -If a short form option is used, the data may follow immediately, or (with one -exception) in the next command line item. For example: -.sp - -f/some/file - -f /some/file -.sp -The exception is the \fB-o\fP option, which may appear with or without data. -Because of this, if data is present, it must follow immediately in the same -item, for example -o3. -.P -If a long form option is used, the data may appear in the same command line -item, separated by an equals character, or (with two exceptions) it may appear -in the next command line item. For example: -.sp - --file=/some/file - --file /some/file -.sp -Note, however, that if you want to supply a file name beginning with ~ as data -in a shell command, and have the shell expand ~ to a home directory, you must -separate the file name from the option, because the shell does not treat ~ -specially unless it is at the start of an item. -.P -The exceptions to the above are the \fB--colour\fP (or \fB--color\fP) and -\fB--only-matching\fP options, for which the data is optional. If one of these -options does have data, it must be given in the first form, using an equals -character. Otherwise \fBpcregrep\fP will assume that it has no data. -. -. -.SH "MATCHING ERRORS" -.rs -.sp -It is possible to supply a regular expression that takes a very long time to -fail to match certain lines. Such patterns normally involve nested indefinite -repeats, for example: (a+)*\ed when matched against a line of a's with no final -digit. The PCRE matching function has a resource limit that causes it to abort -in these circumstances. If this happens, \fBpcregrep\fP outputs an error -message and the line that caused the problem to the standard error stream. If -there are more than 20 such errors, \fBpcregrep\fP gives up. -.P -The \fB--match-limit\fP option of \fBpcregrep\fP can be used to set the overall -resource limit; there is a second option called \fB--recursion-limit\fP that -sets a limit on the amount of memory (usually stack) that is used (see the -discussion of these options above). -. -. -.SH DIAGNOSTICS -.rs -.sp -Exit status is 0 if any matches were found, 1 if no matches were found, and 2 -for syntax errors, overlong lines, non-existent or inaccessible files (even if -matches were found in other files) or too many matching errors. Using the -\fB-s\fP option to suppress error messages about inaccessible files does not -affect the return code. -. -. -.SH "SEE ALSO" -.rs -.sp -\fBpcrepattern\fP(3), \fBpcresyntax\fP(3), \fBpcretest\fP(1). -. -. -.SH AUTHOR -.rs -.sp -.nf -Philip Hazel -University Computing Service -Cambridge CB2 3QH, England. -.fi -. -. -.SH REVISION -.rs -.sp -.nf -Last updated: 03 April 2014 -Copyright (c) 1997-2014 University of Cambridge. -.fi diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man1/pcretest.1 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man1/pcretest.1 deleted file mode 100644 index ea7457c0..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man1/pcretest.1 +++ /dev/null @@ -1,1160 +0,0 @@ -.TH PCRETEST 1 "23 February 2017" "PCRE 8.41" -.SH NAME -pcretest - a program for testing Perl-compatible regular expressions. -.SH SYNOPSIS -.rs -.sp -.B pcretest "[options] [input file [output file]]" -.sp -\fBpcretest\fP was written as a test program for the PCRE regular expression -library itself, but it can also be used for experimenting with regular -expressions. This document describes the features of the test program; for -details of the regular expressions themselves, see the -.\" HREF -\fBpcrepattern\fP -.\" -documentation. For details of the PCRE library function calls and their -options, see the -.\" HREF -\fBpcreapi\fP -.\" -, -.\" HREF -\fBpcre16\fP -and -.\" HREF -\fBpcre32\fP -.\" -documentation. -.P -The input for \fBpcretest\fP is a sequence of regular expression patterns and -strings to be matched, as described below. The output shows the result of each -match. Options on the command line and the patterns control PCRE options and -exactly what is output. -.P -As PCRE has evolved, it has acquired many different features, and as a result, -\fBpcretest\fP now has rather a lot of obscure options for testing every -possible feature. Some of these options are specifically designed for use in -conjunction with the test script and data files that are distributed as part of -PCRE, and are unlikely to be of use otherwise. They are all documented here, -but without much justification. -. -. -.SH "INPUT DATA FORMAT" -.rs -.sp -Input to \fBpcretest\fP is processed line by line, either by calling the C -library's \fBfgets()\fP function, or via the \fBlibreadline\fP library (see -below). In Unix-like environments, \fBfgets()\fP treats any bytes other than -newline as data characters. However, in some Windows environments character 26 -(hex 1A) causes an immediate end of file, and no further data is read. For -maximum portability, therefore, it is safest to use only ASCII characters in -\fBpcretest\fP input files. -.P -The input is processed using using C's string functions, so must not -contain binary zeroes, even though in Unix-like environments, \fBfgets()\fP -treats any bytes other than newline as data characters. -. -. -.SH "PCRE's 8-BIT, 16-BIT AND 32-BIT LIBRARIES" -.rs -.sp -From release 8.30, two separate PCRE libraries can be built. The original one -supports 8-bit character strings, whereas the newer 16-bit library supports -character strings encoded in 16-bit units. From release 8.32, a third library -can be built, supporting character strings encoded in 32-bit units. The -\fBpcretest\fP program can be used to test all three libraries. However, it is -itself still an 8-bit program, reading 8-bit input and writing 8-bit output. -When testing the 16-bit or 32-bit library, the patterns and data strings are -converted to 16- or 32-bit format before being passed to the PCRE library -functions. Results are converted to 8-bit for output. -.P -References to functions and structures of the form \fBpcre[16|32]_xx\fP below -mean "\fBpcre_xx\fP when using the 8-bit library, \fBpcre16_xx\fP when using -the 16-bit library, or \fBpcre32_xx\fP when using the 32-bit library". -. -. -.SH "COMMAND LINE OPTIONS" -.rs -.TP 10 -\fB-8\fP -If both the 8-bit library has been built, this option causes the 8-bit library -to be used (which is the default); if the 8-bit library has not been built, -this option causes an error. -.TP 10 -\fB-16\fP -If both the 8-bit or the 32-bit, and the 16-bit libraries have been built, this -option causes the 16-bit library to be used. If only the 16-bit library has been -built, this is the default (so has no effect). If only the 8-bit or the 32-bit -library has been built, this option causes an error. -.TP 10 -\fB-32\fP -If both the 8-bit or the 16-bit, and the 32-bit libraries have been built, this -option causes the 32-bit library to be used. If only the 32-bit library has been -built, this is the default (so has no effect). If only the 8-bit or the 16-bit -library has been built, this option causes an error. -.TP 10 -\fB-b\fP -Behave as if each pattern has the \fB/B\fP (show byte code) modifier; the -internal form is output after compilation. -.TP 10 -\fB-C\fP -Output the version number of the PCRE library, and all available information -about the optional features that are included, and then exit with zero exit -code. All other options are ignored. -.TP 10 -\fB-C\fP \fIoption\fP -Output information about a specific build-time option, then exit. This -functionality is intended for use in scripts such as \fBRunTest\fP. The -following options output the value and set the exit code as indicated: -.sp - ebcdic-nl the code for LF (= NL) in an EBCDIC environment: - 0x15 or 0x25 - 0 if used in an ASCII environment - exit code is always 0 - linksize the configured internal link size (2, 3, or 4) - exit code is set to the link size - newline the default newline setting: - CR, LF, CRLF, ANYCRLF, or ANY - exit code is always 0 - bsr the default setting for what \eR matches: - ANYCRLF or ANY - exit code is always 0 -.sp -The following options output 1 for true or 0 for false, and set the exit code -to the same value: -.sp - ebcdic compiled for an EBCDIC environment - jit just-in-time support is available - pcre16 the 16-bit library was built - pcre32 the 32-bit library was built - pcre8 the 8-bit library was built - ucp Unicode property support is available - utf UTF-8 and/or UTF-16 and/or UTF-32 support - is available -.sp -If an unknown option is given, an error message is output; the exit code is 0. -.TP 10 -\fB-d\fP -Behave as if each pattern has the \fB/D\fP (debug) modifier; the internal -form and information about the compiled pattern is output after compilation; -\fB-d\fP is equivalent to \fB-b -i\fP. -.TP 10 -\fB-dfa\fP -Behave as if each data line contains the \eD escape sequence; this causes the -alternative matching function, \fBpcre[16|32]_dfa_exec()\fP, to be used instead -of the standard \fBpcre[16|32]_exec()\fP function (more detail is given below). -.TP 10 -\fB-help\fP -Output a brief summary these options and then exit. -.TP 10 -\fB-i\fP -Behave as if each pattern has the \fB/I\fP modifier; information about the -compiled pattern is given after compilation. -.TP 10 -\fB-M\fP -Behave as if each data line contains the \eM escape sequence; this causes -PCRE to discover the minimum MATCH_LIMIT and MATCH_LIMIT_RECURSION settings by -calling \fBpcre[16|32]_exec()\fP repeatedly with different limits. -.TP 10 -\fB-m\fP -Output the size of each compiled pattern after it has been compiled. This is -equivalent to adding \fB/M\fP to each regular expression. The size is given in -bytes for both libraries. -.TP 10 -\fB-O\fP -Behave as if each pattern has the \fB/O\fP modifier, that is disable -auto-possessification for all patterns. -.TP 10 -\fB-o\fP \fIosize\fP -Set the number of elements in the output vector that is used when calling -\fBpcre[16|32]_exec()\fP or \fBpcre[16|32]_dfa_exec()\fP to be \fIosize\fP. The -default value is 45, which is enough for 14 capturing subexpressions for -\fBpcre[16|32]_exec()\fP or 22 different matches for -\fBpcre[16|32]_dfa_exec()\fP. -The vector size can be changed for individual matching calls by including \eO -in the data line (see below). -.TP 10 -\fB-p\fP -Behave as if each pattern has the \fB/P\fP modifier; the POSIX wrapper API is -used to call PCRE. None of the other options has any effect when \fB-p\fP is -set. This option can be used only with the 8-bit library. -.TP 10 -\fB-q\fP -Do not output the version number of \fBpcretest\fP at the start of execution. -.TP 10 -\fB-S\fP \fIsize\fP -On Unix-like systems, set the size of the run-time stack to \fIsize\fP -megabytes. -.TP 10 -\fB-s\fP or \fB-s+\fP -Behave as if each pattern has the \fB/S\fP modifier; in other words, force each -pattern to be studied. If \fB-s+\fP is used, all the JIT compile options are -passed to \fBpcre[16|32]_study()\fP, causing just-in-time optimization to be set -up if it is available, for both full and partial matching. Specific JIT compile -options can be selected by following \fB-s+\fP with a digit in the range 1 to -7, which selects the JIT compile modes as follows: -.sp - 1 normal match only - 2 soft partial match only - 3 normal match and soft partial match - 4 hard partial match only - 6 soft and hard partial match - 7 all three modes (default) -.sp -If \fB-s++\fP is used instead of \fB-s+\fP (with or without a following digit), -the text "(JIT)" is added to the first output line after a match or no match -when JIT-compiled code was actually used. -.sp -Note that there are pattern options that can override \fB-s\fP, either -specifying no studying at all, or suppressing JIT compilation. -.sp -If the \fB/I\fP or \fB/D\fP option is present on a pattern (requesting output -about the compiled pattern), information about the result of studying is not -included when studying is caused only by \fB-s\fP and neither \fB-i\fP nor -\fB-d\fP is present on the command line. This behaviour means that the output -from tests that are run with and without \fB-s\fP should be identical, except -when options that output information about the actual running of a match are -set. -.sp -The \fB-M\fP, \fB-t\fP, and \fB-tm\fP options, which give information about -resources used, are likely to produce different output with and without -\fB-s\fP. Output may also differ if the \fB/C\fP option is present on an -individual pattern. This uses callouts to trace the the matching process, and -this may be different between studied and non-studied patterns. If the pattern -contains (*MARK) items there may also be differences, for the same reason. The -\fB-s\fP command line option can be overridden for specific patterns that -should never be studied (see the \fB/S\fP pattern modifier below). -.TP 10 -\fB-t\fP -Run each compile, study, and match many times with a timer, and output the -resulting times per compile, study, or match (in milliseconds). Do not set -\fB-m\fP with \fB-t\fP, because you will then get the size output a zillion -times, and the timing will be distorted. You can control the number of -iterations that are used for timing by following \fB-t\fP with a number (as a -separate item on the command line). For example, "-t 1000" iterates 1000 times. -The default is to iterate 500000 times. -.TP 10 -\fB-tm\fP -This is like \fB-t\fP except that it times only the matching phase, not the -compile or study phases. -.TP 10 -\fB-T\fP \fB-TM\fP -These behave like \fB-t\fP and \fB-tm\fP, but in addition, at the end of a run, -the total times for all compiles, studies, and matches are output. -. -. -.SH DESCRIPTION -.rs -.sp -If \fBpcretest\fP is given two filename arguments, it reads from the first and -writes to the second. If it is given only one filename argument, it reads from -that file and writes to stdout. Otherwise, it reads from stdin and writes to -stdout, and prompts for each line of input, using "re>" to prompt for regular -expressions, and "data>" to prompt for data lines. -.P -When \fBpcretest\fP is built, a configuration option can specify that it should -be linked with the \fBlibreadline\fP library. When this is done, if the input -is from a terminal, it is read using the \fBreadline()\fP function. This -provides line-editing and history facilities. The output from the \fB-help\fP -option states whether or not \fBreadline()\fP will be used. -.P -The program handles any number of sets of input on a single input file. Each -set starts with a regular expression, and continues with any number of data -lines to be matched against that pattern. -.P -Each data line is matched separately and independently. If you want to do -multi-line matches, you have to use the \en escape sequence (or \er or \er\en, -etc., depending on the newline setting) in a single line of input to encode the -newline sequences. There is no limit on the length of data lines; the input -buffer is automatically extended if it is too small. -.P -An empty line signals the end of the data lines, at which point a new regular -expression is read. The regular expressions are given enclosed in any -non-alphanumeric delimiters other than backslash, for example: -.sp - /(a|bc)x+yz/ -.sp -White space before the initial delimiter is ignored. A regular expression may -be continued over several input lines, in which case the newline characters are -included within it. It is possible to include the delimiter within the pattern -by escaping it, for example -.sp - /abc\e/def/ -.sp -If you do so, the escape and the delimiter form part of the pattern, but since -delimiters are always non-alphanumeric, this does not affect its interpretation. -If the terminating delimiter is immediately followed by a backslash, for -example, -.sp - /abc/\e -.sp -then a backslash is added to the end of the pattern. This is done to provide a -way of testing the error condition that arises if a pattern finishes with a -backslash, because -.sp - /abc\e/ -.sp -is interpreted as the first line of a pattern that starts with "abc/", causing -pcretest to read the next line as a continuation of the regular expression. -. -. -.SH "PATTERN MODIFIERS" -.rs -.sp -A pattern may be followed by any number of modifiers, which are mostly single -characters, though some of these can be qualified by further characters. -Following Perl usage, these are referred to below as, for example, "the -\fB/i\fP modifier", even though the delimiter of the pattern need not always be -a slash, and no slash is used when writing modifiers. White space may appear -between the final pattern delimiter and the first modifier, and between the -modifiers themselves. For reference, here is a complete list of modifiers. They -fall into several groups that are described in detail in the following -sections. -.sp - \fB/8\fP set UTF mode - \fB/9\fP set PCRE_NEVER_UTF (locks out UTF mode) - \fB/?\fP disable UTF validity check - \fB/+\fP show remainder of subject after match - \fB/=\fP show all captures (not just those that are set) -.sp - \fB/A\fP set PCRE_ANCHORED - \fB/B\fP show compiled code - \fB/C\fP set PCRE_AUTO_CALLOUT - \fB/D\fP same as \fB/B\fP plus \fB/I\fP - \fB/E\fP set PCRE_DOLLAR_ENDONLY - \fB/F\fP flip byte order in compiled pattern - \fB/f\fP set PCRE_FIRSTLINE - \fB/G\fP find all matches (shorten string) - \fB/g\fP find all matches (use startoffset) - \fB/I\fP show information about pattern - \fB/i\fP set PCRE_CASELESS - \fB/J\fP set PCRE_DUPNAMES - \fB/K\fP show backtracking control names - \fB/L\fP set locale - \fB/M\fP show compiled memory size - \fB/m\fP set PCRE_MULTILINE - \fB/N\fP set PCRE_NO_AUTO_CAPTURE - \fB/O\fP set PCRE_NO_AUTO_POSSESS - \fB/P\fP use the POSIX wrapper - \fB/Q\fP test external stack check function - \fB/S\fP study the pattern after compilation - \fB/s\fP set PCRE_DOTALL - \fB/T\fP select character tables - \fB/U\fP set PCRE_UNGREEDY - \fB/W\fP set PCRE_UCP - \fB/X\fP set PCRE_EXTRA - \fB/x\fP set PCRE_EXTENDED - \fB/Y\fP set PCRE_NO_START_OPTIMIZE - \fB/Z\fP don't show lengths in \fB/B\fP output -.sp - \fB/\fP set PCRE_NEWLINE_ANY - \fB/\fP set PCRE_NEWLINE_ANYCRLF - \fB/\fP set PCRE_NEWLINE_CR - \fB/\fP set PCRE_NEWLINE_CRLF - \fB/\fP set PCRE_NEWLINE_LF - \fB/\fP set PCRE_BSR_ANYCRLF - \fB/\fP set PCRE_BSR_UNICODE - \fB/\fP set PCRE_JAVASCRIPT_COMPAT -.sp -. -. -.SS "Perl-compatible modifiers" -.rs -.sp -The \fB/i\fP, \fB/m\fP, \fB/s\fP, and \fB/x\fP modifiers set the PCRE_CASELESS, -PCRE_MULTILINE, PCRE_DOTALL, or PCRE_EXTENDED options, respectively, when -\fBpcre[16|32]_compile()\fP is called. These four modifier letters have the same -effect as they do in Perl. For example: -.sp - /caseless/i -.sp -. -. -.SS "Modifiers for other PCRE options" -.rs -.sp -The following table shows additional modifiers for setting PCRE compile-time -options that do not correspond to anything in Perl: -.sp - \fB/8\fP PCRE_UTF8 ) when using the 8-bit - \fB/?\fP PCRE_NO_UTF8_CHECK ) library -.sp - \fB/8\fP PCRE_UTF16 ) when using the 16-bit - \fB/?\fP PCRE_NO_UTF16_CHECK ) library -.sp - \fB/8\fP PCRE_UTF32 ) when using the 32-bit - \fB/?\fP PCRE_NO_UTF32_CHECK ) library -.sp - \fB/9\fP PCRE_NEVER_UTF - \fB/A\fP PCRE_ANCHORED - \fB/C\fP PCRE_AUTO_CALLOUT - \fB/E\fP PCRE_DOLLAR_ENDONLY - \fB/f\fP PCRE_FIRSTLINE - \fB/J\fP PCRE_DUPNAMES - \fB/N\fP PCRE_NO_AUTO_CAPTURE - \fB/O\fP PCRE_NO_AUTO_POSSESS - \fB/U\fP PCRE_UNGREEDY - \fB/W\fP PCRE_UCP - \fB/X\fP PCRE_EXTRA - \fB/Y\fP PCRE_NO_START_OPTIMIZE - \fB/\fP PCRE_NEWLINE_ANY - \fB/\fP PCRE_NEWLINE_ANYCRLF - \fB/\fP PCRE_NEWLINE_CR - \fB/\fP PCRE_NEWLINE_CRLF - \fB/\fP PCRE_NEWLINE_LF - \fB/\fP PCRE_BSR_ANYCRLF - \fB/\fP PCRE_BSR_UNICODE - \fB/\fP PCRE_JAVASCRIPT_COMPAT -.sp -The modifiers that are enclosed in angle brackets are literal strings as shown, -including the angle brackets, but the letters within can be in either case. -This example sets multiline matching with CRLF as the line ending sequence: -.sp - /^abc/m -.sp -As well as turning on the PCRE_UTF8/16/32 option, the \fB/8\fP modifier causes -all non-printing characters in output strings to be printed using the -\ex{hh...} notation. Otherwise, those less than 0x100 are output in hex without -the curly brackets. -.P -Full details of the PCRE options are given in the -.\" HREF -\fBpcreapi\fP -.\" -documentation. -. -. -.SS "Finding all matches in a string" -.rs -.sp -Searching for all possible matches within each subject string can be requested -by the \fB/g\fP or \fB/G\fP modifier. After finding a match, PCRE is called -again to search the remainder of the subject string. The difference between -\fB/g\fP and \fB/G\fP is that the former uses the \fIstartoffset\fP argument to -\fBpcre[16|32]_exec()\fP to start searching at a new point within the entire -string (which is in effect what Perl does), whereas the latter passes over a -shortened substring. This makes a difference to the matching process if the -pattern begins with a lookbehind assertion (including \eb or \eB). -.P -If any call to \fBpcre[16|32]_exec()\fP in a \fB/g\fP or \fB/G\fP sequence matches -an empty string, the next call is done with the PCRE_NOTEMPTY_ATSTART and -PCRE_ANCHORED flags set in order to search for another, non-empty, match at the -same point. If this second match fails, the start offset is advanced, and the -normal match is retried. This imitates the way Perl handles such cases when -using the \fB/g\fP modifier or the \fBsplit()\fP function. Normally, the start -offset is advanced by one character, but if the newline convention recognizes -CRLF as a newline, and the current character is CR followed by LF, an advance -of two is used. -. -. -.SS "Other modifiers" -.rs -.sp -There are yet more modifiers for controlling the way \fBpcretest\fP -operates. -.P -The \fB/+\fP modifier requests that as well as outputting the substring that -matched the entire pattern, \fBpcretest\fP should in addition output the -remainder of the subject string. This is useful for tests where the subject -contains multiple copies of the same substring. If the \fB+\fP modifier appears -twice, the same action is taken for captured substrings. In each case the -remainder is output on the following line with a plus character following the -capture number. Note that this modifier must not immediately follow the /S -modifier because /S+ and /S++ have other meanings. -.P -The \fB/=\fP modifier requests that the values of all potential captured -parentheses be output after a match. By default, only those up to the highest -one actually used in the match are output (corresponding to the return code -from \fBpcre[16|32]_exec()\fP). Values in the offsets vector corresponding to -higher numbers should be set to -1, and these are output as "". This -modifier gives a way of checking that this is happening. -.P -The \fB/B\fP modifier is a debugging feature. It requests that \fBpcretest\fP -output a representation of the compiled code after compilation. Normally this -information contains length and offset values; however, if \fB/Z\fP is also -present, this data is replaced by spaces. This is a special feature for use in -the automatic test scripts; it ensures that the same output is generated for -different internal link sizes. -.P -The \fB/D\fP modifier is a PCRE debugging feature, and is equivalent to -\fB/BI\fP, that is, both the \fB/B\fP and the \fB/I\fP modifiers. -.P -The \fB/F\fP modifier causes \fBpcretest\fP to flip the byte order of the -2-byte and 4-byte fields in the compiled pattern. This facility is for testing -the feature in PCRE that allows it to execute patterns that were compiled on a -host with a different endianness. This feature is not available when the POSIX -interface to PCRE is being used, that is, when the \fB/P\fP pattern modifier is -specified. See also the section about saving and reloading compiled patterns -below. -.P -The \fB/I\fP modifier requests that \fBpcretest\fP output information about the -compiled pattern (whether it is anchored, has a fixed first character, and -so on). It does this by calling \fBpcre[16|32]_fullinfo()\fP after compiling a -pattern. If the pattern is studied, the results of that are also output. In -this output, the word "char" means a non-UTF character, that is, the value of a -single data item (8-bit, 16-bit, or 32-bit, depending on the library that is -being tested). -.P -The \fB/K\fP modifier requests \fBpcretest\fP to show names from backtracking -control verbs that are returned from calls to \fBpcre[16|32]_exec()\fP. It causes -\fBpcretest\fP to create a \fBpcre[16|32]_extra\fP block if one has not already -been created by a call to \fBpcre[16|32]_study()\fP, and to set the -PCRE_EXTRA_MARK flag and the \fBmark\fP field within it, every time that -\fBpcre[16|32]_exec()\fP is called. If the variable that the \fBmark\fP field -points to is non-NULL for a match, non-match, or partial match, \fBpcretest\fP -prints the string to which it points. For a match, this is shown on a line by -itself, tagged with "MK:". For a non-match it is added to the message. -.P -The \fB/L\fP modifier must be followed directly by the name of a locale, for -example, -.sp - /pattern/Lfr_FR -.sp -For this reason, it must be the last modifier. The given locale is set, -\fBpcre[16|32]_maketables()\fP is called to build a set of character tables for -the locale, and this is then passed to \fBpcre[16|32]_compile()\fP when compiling -the regular expression. Without an \fB/L\fP (or \fB/T\fP) modifier, NULL is -passed as the tables pointer; that is, \fB/L\fP applies only to the expression -on which it appears. -.P -The \fB/M\fP modifier causes the size in bytes of the memory block used to hold -the compiled pattern to be output. This does not include the size of the -\fBpcre[16|32]\fP block; it is just the actual compiled data. If the pattern is -successfully studied with the PCRE_STUDY_JIT_COMPILE option, the size of the -JIT compiled code is also output. -.P -The \fB/Q\fP modifier is used to test the use of \fBpcre_stack_guard\fP. It -must be followed by '0' or '1', specifying the return code to be given from an -external function that is passed to PCRE and used for stack checking during -compilation (see the -.\" HREF -\fBpcreapi\fP -.\" -documentation for details). -.P -The \fB/S\fP modifier causes \fBpcre[16|32]_study()\fP to be called after the -expression has been compiled, and the results used when the expression is -matched. There are a number of qualifying characters that may follow \fB/S\fP. -They may appear in any order. -.P -If \fB/S\fP is followed by an exclamation mark, \fBpcre[16|32]_study()\fP is -called with the PCRE_STUDY_EXTRA_NEEDED option, causing it always to return a -\fBpcre_extra\fP block, even when studying discovers no useful information. -.P -If \fB/S\fP is followed by a second S character, it suppresses studying, even -if it was requested externally by the \fB-s\fP command line option. This makes -it possible to specify that certain patterns are always studied, and others are -never studied, independently of \fB-s\fP. This feature is used in the test -files in a few cases where the output is different when the pattern is studied. -.P -If the \fB/S\fP modifier is followed by a + character, the call to -\fBpcre[16|32]_study()\fP is made with all the JIT study options, requesting -just-in-time optimization support if it is available, for both normal and -partial matching. If you want to restrict the JIT compiling modes, you can -follow \fB/S+\fP with a digit in the range 1 to 7: -.sp - 1 normal match only - 2 soft partial match only - 3 normal match and soft partial match - 4 hard partial match only - 6 soft and hard partial match - 7 all three modes (default) -.sp -If \fB/S++\fP is used instead of \fB/S+\fP (with or without a following digit), -the text "(JIT)" is added to the first output line after a match or no match -when JIT-compiled code was actually used. -.P -Note that there is also an independent \fB/+\fP modifier; it must not be given -immediately after \fB/S\fP or \fB/S+\fP because this will be misinterpreted. -.P -If JIT studying is successful, the compiled JIT code will automatically be used -when \fBpcre[16|32]_exec()\fP is run, except when incompatible run-time options -are specified. For more details, see the -.\" HREF -\fBpcrejit\fP -.\" -documentation. See also the \fB\eJ\fP escape sequence below for a way of -setting the size of the JIT stack. -.P -Finally, if \fB/S\fP is followed by a minus character, JIT compilation is -suppressed, even if it was requested externally by the \fB-s\fP command line -option. This makes it possible to specify that JIT is never to be used for -certain patterns. -.P -The \fB/T\fP modifier must be followed by a single digit. It causes a specific -set of built-in character tables to be passed to \fBpcre[16|32]_compile()\fP. It -is used in the standard PCRE tests to check behaviour with different character -tables. The digit specifies the tables as follows: -.sp - 0 the default ASCII tables, as distributed in - pcre_chartables.c.dist - 1 a set of tables defining ISO 8859 characters -.sp -In table 1, some characters whose codes are greater than 128 are identified as -letters, digits, spaces, etc. -. -. -.SS "Using the POSIX wrapper API" -.rs -.sp -The \fB/P\fP modifier causes \fBpcretest\fP to call PCRE via the POSIX wrapper -API rather than its native API. This supports only the 8-bit library. When -\fB/P\fP is set, the following modifiers set options for the \fBregcomp()\fP -function: -.sp - /i REG_ICASE - /m REG_NEWLINE - /N REG_NOSUB - /s REG_DOTALL ) - /U REG_UNGREEDY ) These options are not part of - /W REG_UCP ) the POSIX standard - /8 REG_UTF8 ) -.sp -The \fB/+\fP modifier works as described above. All other modifiers are -ignored. -. -. -.SS "Locking out certain modifiers" -.rs -.sp -PCRE can be compiled with or without support for certain features such as -UTF-8/16/32 or Unicode properties. Accordingly, the standard tests are split up -into a number of different files that are selected for running depending on -which features are available. When updating the tests, it is all too easy to -put a new test into the wrong file by mistake; for example, to put a test that -requires UTF support into a file that is used when it is not available. To help -detect such mistakes as early as possible, there is a facility for locking out -specific modifiers. If an input line for \fBpcretest\fP starts with the string -"< forbid " the following sequence of characters is taken as a list of -forbidden modifiers. For example, in the test files that must not use UTF or -Unicode property support, this line appears: -.sp - < forbid 8W -.sp -This locks out the /8 and /W modifiers. An immediate error is given if they are -subsequently encountered. If the character string contains < but not >, all the -multi-character modifiers that begin with < are locked out. Otherwise, such -modifiers must be explicitly listed, for example: -.sp - < forbid -.sp -There must be a single space between < and "forbid" for this feature to be -recognised. If there is not, the line is interpreted either as a request to -re-load a pre-compiled pattern (see "SAVING AND RELOADING COMPILED PATTERNS" -below) or, if there is a another < character, as a pattern that uses < as its -delimiter. -. -. -.SH "DATA LINES" -.rs -.sp -Before each data line is passed to \fBpcre[16|32]_exec()\fP, leading and trailing -white space is removed, and it is then scanned for \e escapes. Some of these -are pretty esoteric features, intended for checking out some of the more -complicated features of PCRE. If you are just testing "ordinary" regular -expressions, you probably don't need any of these. The following escapes are -recognized: -.sp - \ea alarm (BEL, \ex07) - \eb backspace (\ex08) - \ee escape (\ex27) - \ef form feed (\ex0c) - \en newline (\ex0a) -.\" JOIN - \eqdd set the PCRE_MATCH_LIMIT limit to dd - (any number of digits) - \er carriage return (\ex0d) - \et tab (\ex09) - \ev vertical tab (\ex0b) - \ennn octal character (up to 3 octal digits); always - a byte unless > 255 in UTF-8 or 16-bit or 32-bit mode - \eo{dd...} octal character (any number of octal digits} - \exhh hexadecimal byte (up to 2 hex digits) - \ex{hh...} hexadecimal character (any number of hex digits) -.\" JOIN - \eA pass the PCRE_ANCHORED option to \fBpcre[16|32]_exec()\fP - or \fBpcre[16|32]_dfa_exec()\fP -.\" JOIN - \eB pass the PCRE_NOTBOL option to \fBpcre[16|32]_exec()\fP - or \fBpcre[16|32]_dfa_exec()\fP -.\" JOIN - \eCdd call pcre[16|32]_copy_substring() for substring dd - after a successful match (number less than 32) -.\" JOIN - \eCname call pcre[16|32]_copy_named_substring() for substring - "name" after a successful match (name termin- - ated by next non alphanumeric character) -.\" JOIN - \eC+ show the current captured substrings at callout - time - \eC- do not supply a callout function -.\" JOIN - \eC!n return 1 instead of 0 when callout number n is - reached -.\" JOIN - \eC!n!m return 1 instead of 0 when callout number n is - reached for the nth time -.\" JOIN - \eC*n pass the number n (may be negative) as callout - data; this is used as the callout return value - \eD use the \fBpcre[16|32]_dfa_exec()\fP match function - \eF only shortest match for \fBpcre[16|32]_dfa_exec()\fP -.\" JOIN - \eGdd call pcre[16|32]_get_substring() for substring dd - after a successful match (number less than 32) -.\" JOIN - \eGname call pcre[16|32]_get_named_substring() for substring - "name" after a successful match (name termin- - ated by next non-alphanumeric character) -.\" JOIN - \eJdd set up a JIT stack of dd kilobytes maximum (any - number of digits) -.\" JOIN - \eL call pcre[16|32]_get_substringlist() after a - successful match -.\" JOIN - \eM discover the minimum MATCH_LIMIT and - MATCH_LIMIT_RECURSION settings -.\" JOIN - \eN pass the PCRE_NOTEMPTY option to \fBpcre[16|32]_exec()\fP - or \fBpcre[16|32]_dfa_exec()\fP; if used twice, pass the - PCRE_NOTEMPTY_ATSTART option -.\" JOIN - \eOdd set the size of the output vector passed to - \fBpcre[16|32]_exec()\fP to dd (any number of digits) -.\" JOIN - \eP pass the PCRE_PARTIAL_SOFT option to \fBpcre[16|32]_exec()\fP - or \fBpcre[16|32]_dfa_exec()\fP; if used twice, pass the - PCRE_PARTIAL_HARD option -.\" JOIN - \eQdd set the PCRE_MATCH_LIMIT_RECURSION limit to dd - (any number of digits) - \eR pass the PCRE_DFA_RESTART option to \fBpcre[16|32]_dfa_exec()\fP - \eS output details of memory get/free calls during matching -.\" JOIN - \eY pass the PCRE_NO_START_OPTIMIZE option to \fBpcre[16|32]_exec()\fP - or \fBpcre[16|32]_dfa_exec()\fP -.\" JOIN - \eZ pass the PCRE_NOTEOL option to \fBpcre[16|32]_exec()\fP - or \fBpcre[16|32]_dfa_exec()\fP -.\" JOIN - \e? pass the PCRE_NO_UTF[8|16|32]_CHECK option to - \fBpcre[16|32]_exec()\fP or \fBpcre[16|32]_dfa_exec()\fP -.\" JOIN - \e>dd start the match at offset dd (optional "-"; then - any number of digits); this sets the \fIstartoffset\fP - argument for \fBpcre[16|32]_exec()\fP or \fBpcre[16|32]_dfa_exec()\fP -.\" JOIN - \e pass the PCRE_NEWLINE_CR option to \fBpcre[16|32]_exec()\fP - or \fBpcre[16|32]_dfa_exec()\fP -.\" JOIN - \e pass the PCRE_NEWLINE_LF option to \fBpcre[16|32]_exec()\fP - or \fBpcre[16|32]_dfa_exec()\fP -.\" JOIN - \e pass the PCRE_NEWLINE_CRLF option to \fBpcre[16|32]_exec()\fP - or \fBpcre[16|32]_dfa_exec()\fP -.\" JOIN - \e pass the PCRE_NEWLINE_ANYCRLF option to \fBpcre[16|32]_exec()\fP - or \fBpcre[16|32]_dfa_exec()\fP -.\" JOIN - \e pass the PCRE_NEWLINE_ANY option to \fBpcre[16|32]_exec()\fP - or \fBpcre[16|32]_dfa_exec()\fP -.sp -The use of \ex{hh...} is not dependent on the use of the \fB/8\fP modifier on -the pattern. It is recognized always. There may be any number of hexadecimal -digits inside the braces; invalid values provoke error messages. -.P -Note that \exhh specifies one byte rather than one character in UTF-8 mode; -this makes it possible to construct invalid UTF-8 sequences for testing -purposes. On the other hand, \ex{hh} is interpreted as a UTF-8 character in -UTF-8 mode, generating more than one byte if the value is greater than 127. -When testing the 8-bit library not in UTF-8 mode, \ex{hh} generates one byte -for values less than 256, and causes an error for greater values. -.P -In UTF-16 mode, all 4-digit \ex{hhhh} values are accepted. This makes it -possible to construct invalid UTF-16 sequences for testing purposes. -.P -In UTF-32 mode, all 4- to 8-digit \ex{...} values are accepted. This makes it -possible to construct invalid UTF-32 sequences for testing purposes. -.P -The escapes that specify line ending sequences are literal strings, exactly as -shown. No more than one newline setting should be present in any data line. -.P -A backslash followed by anything else just escapes the anything else. If -the very last character is a backslash, it is ignored. This gives a way of -passing an empty line as data, since a real empty line terminates the data -input. -.P -The \fB\eJ\fP escape provides a way of setting the maximum stack size that is -used by the just-in-time optimization code. It is ignored if JIT optimization -is not being used. Providing a stack that is larger than the default 32K is -necessary only for very complicated patterns. -.P -If \eM is present, \fBpcretest\fP calls \fBpcre[16|32]_exec()\fP several times, -with different values in the \fImatch_limit\fP and \fImatch_limit_recursion\fP -fields of the \fBpcre[16|32]_extra\fP data structure, until it finds the minimum -numbers for each parameter that allow \fBpcre[16|32]_exec()\fP to complete without -error. Because this is testing a specific feature of the normal interpretive -\fBpcre[16|32]_exec()\fP execution, the use of any JIT optimization that might -have been set up by the \fB/S+\fP qualifier of \fB-s+\fP option is disabled. -.P -The \fImatch_limit\fP number is a measure of the amount of backtracking -that takes place, and checking it out can be instructive. For most simple -matches, the number is quite small, but for patterns with very large numbers of -matching possibilities, it can become large very quickly with increasing length -of subject string. The \fImatch_limit_recursion\fP number is a measure of how -much stack (or, if PCRE is compiled with NO_RECURSE, how much heap) memory is -needed to complete the match attempt. -.P -When \eO is used, the value specified may be higher or lower than the size set -by the \fB-O\fP command line option (or defaulted to 45); \eO applies only to -the call of \fBpcre[16|32]_exec()\fP for the line in which it appears. -.P -If the \fB/P\fP modifier was present on the pattern, causing the POSIX wrapper -API to be used, the only option-setting sequences that have any effect are \eB, -\eN, and \eZ, causing REG_NOTBOL, REG_NOTEMPTY, and REG_NOTEOL, respectively, -to be passed to \fBregexec()\fP. -. -. -.SH "THE ALTERNATIVE MATCHING FUNCTION" -.rs -.sp -By default, \fBpcretest\fP uses the standard PCRE matching function, -\fBpcre[16|32]_exec()\fP to match each data line. PCRE also supports an -alternative matching function, \fBpcre[16|32]_dfa_test()\fP, which operates in a -different way, and has some restrictions. The differences between the two -functions are described in the -.\" HREF -\fBpcrematching\fP -.\" -documentation. -.P -If a data line contains the \eD escape sequence, or if the command line -contains the \fB-dfa\fP option, the alternative matching function is used. -This function finds all possible matches at a given point. If, however, the \eF -escape sequence is present in the data line, it stops after the first match is -found. This is always the shortest possible match. -. -. -.SH "DEFAULT OUTPUT FROM PCRETEST" -.rs -.sp -This section describes the output when the normal matching function, -\fBpcre[16|32]_exec()\fP, is being used. -.P -When a match succeeds, \fBpcretest\fP outputs the list of captured substrings -that \fBpcre[16|32]_exec()\fP returns, starting with number 0 for the string that -matched the whole pattern. Otherwise, it outputs "No match" when the return is -PCRE_ERROR_NOMATCH, and "Partial match:" followed by the partially matching -substring when \fBpcre[16|32]_exec()\fP returns PCRE_ERROR_PARTIAL. (Note that -this is the entire substring that was inspected during the partial match; it -may include characters before the actual match start if a lookbehind assertion, -\eK, \eb, or \eB was involved.) For any other return, \fBpcretest\fP outputs -the PCRE negative error number and a short descriptive phrase. If the error is -a failed UTF string check, the offset of the start of the failing character and -the reason code are also output, provided that the size of the output vector is -at least two. Here is an example of an interactive \fBpcretest\fP run. -.sp - $ pcretest - PCRE version 8.13 2011-04-30 -.sp - re> /^abc(\ed+)/ - data> abc123 - 0: abc123 - 1: 123 - data> xyz - No match -.sp -Unset capturing substrings that are not followed by one that is set are not -returned by \fBpcre[16|32]_exec()\fP, and are not shown by \fBpcretest\fP. In the -following example, there are two capturing substrings, but when the first data -line is matched, the second, unset substring is not shown. An "internal" unset -substring is shown as "", as for the second data line. -.sp - re> /(a)|(b)/ - data> a - 0: a - 1: a - data> b - 0: b - 1: - 2: b -.sp -If the strings contain any non-printing characters, they are output as \exhh -escapes if the value is less than 256 and UTF mode is not set. Otherwise they -are output as \ex{hh...} escapes. See below for the definition of non-printing -characters. If the pattern has the \fB/+\fP modifier, the output for substring -0 is followed by the the rest of the subject string, identified by "0+" like -this: -.sp - re> /cat/+ - data> cataract - 0: cat - 0+ aract -.sp -If the pattern has the \fB/g\fP or \fB/G\fP modifier, the results of successive -matching attempts are output in sequence, like this: -.sp - re> /\eBi(\ew\ew)/g - data> Mississippi - 0: iss - 1: ss - 0: iss - 1: ss - 0: ipp - 1: pp -.sp -"No match" is output only if the first match attempt fails. Here is an example -of a failure message (the offset 4 that is specified by \e>4 is past the end of -the subject string): -.sp - re> /xyz/ - data> xyz\e>4 - Error -24 (bad offset value) -.P -If any of the sequences \fB\eC\fP, \fB\eG\fP, or \fB\eL\fP are present in a -data line that is successfully matched, the substrings extracted by the -convenience functions are output with C, G, or L after the string number -instead of a colon. This is in addition to the normal full list. The string -length (that is, the return from the extraction function) is given in -parentheses after each string for \fB\eC\fP and \fB\eG\fP. -.P -Note that whereas patterns can be continued over several lines (a plain ">" -prompt is used for continuations), data lines may not. However newlines can be -included in data by means of the \en escape (or \er, \er\en, etc., depending on -the newline sequence setting). -. -. -. -.SH "OUTPUT FROM THE ALTERNATIVE MATCHING FUNCTION" -.rs -.sp -When the alternative matching function, \fBpcre[16|32]_dfa_exec()\fP, is used (by -means of the \eD escape sequence or the \fB-dfa\fP command line option), the -output consists of a list of all the matches that start at the first point in -the subject where there is at least one match. For example: -.sp - re> /(tang|tangerine|tan)/ - data> yellow tangerine\eD - 0: tangerine - 1: tang - 2: tan -.sp -(Using the normal matching function on this data finds only "tang".) The -longest matching string is always given first (and numbered zero). After a -PCRE_ERROR_PARTIAL return, the output is "Partial match:", followed by the -partially matching substring. (Note that this is the entire substring that was -inspected during the partial match; it may include characters before the actual -match start if a lookbehind assertion, \eK, \eb, or \eB was involved.) -.P -If \fB/g\fP is present on the pattern, the search for further matches resumes -at the end of the longest match. For example: -.sp - re> /(tang|tangerine|tan)/g - data> yellow tangerine and tangy sultana\eD - 0: tangerine - 1: tang - 2: tan - 0: tang - 1: tan - 0: tan -.sp -Since the matching function does not support substring capture, the escape -sequences that are concerned with captured substrings are not relevant. -. -. -.SH "RESTARTING AFTER A PARTIAL MATCH" -.rs -.sp -When the alternative matching function has given the PCRE_ERROR_PARTIAL return, -indicating that the subject partially matched the pattern, you can restart the -match with additional subject data by means of the \eR escape sequence. For -example: -.sp - re> /^\ed?\ed(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)\ed\ed$/ - data> 23ja\eP\eD - Partial match: 23ja - data> n05\eR\eD - 0: n05 -.sp -For further information about partial matching, see the -.\" HREF -\fBpcrepartial\fP -.\" -documentation. -. -. -.SH CALLOUTS -.rs -.sp -If the pattern contains any callout requests, \fBpcretest\fP's callout function -is called during matching. This works with both matching functions. By default, -the called function displays the callout number, the start and current -positions in the text at the callout time, and the next pattern item to be -tested. For example: -.sp - --->pqrabcdef - 0 ^ ^ \ed -.sp -This output indicates that callout number 0 occurred for a match attempt -starting at the fourth character of the subject string, when the pointer was at -the seventh character of the data, and when the next pattern item was \ed. Just -one circumflex is output if the start and current positions are the same. -.P -Callouts numbered 255 are assumed to be automatic callouts, inserted as a -result of the \fB/C\fP pattern modifier. In this case, instead of showing the -callout number, the offset in the pattern, preceded by a plus, is output. For -example: -.sp - re> /\ed?[A-E]\e*/C - data> E* - --->E* - +0 ^ \ed? - +3 ^ [A-E] - +8 ^^ \e* - +10 ^ ^ - 0: E* -.sp -If a pattern contains (*MARK) items, an additional line is output whenever -a change of latest mark is passed to the callout function. For example: -.sp - re> /a(*MARK:X)bc/C - data> abc - --->abc - +0 ^ a - +1 ^^ (*MARK:X) - +10 ^^ b - Latest Mark: X - +11 ^ ^ c - +12 ^ ^ - 0: abc -.sp -The mark changes between matching "a" and "b", but stays the same for the rest -of the match, so nothing more is output. If, as a result of backtracking, the -mark reverts to being unset, the text "" is output. -.P -The callout function in \fBpcretest\fP returns zero (carry on matching) by -default, but you can use a \eC item in a data line (as described above) to -change this and other parameters of the callout. -.P -Inserting callouts can be helpful when using \fBpcretest\fP to check -complicated regular expressions. For further information about callouts, see -the -.\" HREF -\fBpcrecallout\fP -.\" -documentation. -. -. -. -.SH "NON-PRINTING CHARACTERS" -.rs -.sp -When \fBpcretest\fP is outputting text in the compiled version of a pattern, -bytes other than 32-126 are always treated as non-printing characters are are -therefore shown as hex escapes. -.P -When \fBpcretest\fP is outputting text that is a matched part of a subject -string, it behaves in the same way, unless a different locale has been set for -the pattern (using the \fB/L\fP modifier). In this case, the \fBisprint()\fP -function to distinguish printing and non-printing characters. -. -. -. -.SH "SAVING AND RELOADING COMPILED PATTERNS" -.rs -.sp -The facilities described in this section are not available when the POSIX -interface to PCRE is being used, that is, when the \fB/P\fP pattern modifier is -specified. -.P -When the POSIX interface is not in use, you can cause \fBpcretest\fP to write a -compiled pattern to a file, by following the modifiers with > and a file name. -For example: -.sp - /pattern/im >/some/file -.sp -See the -.\" HREF -\fBpcreprecompile\fP -.\" -documentation for a discussion about saving and re-using compiled patterns. -Note that if the pattern was successfully studied with JIT optimization, the -JIT data cannot be saved. -.P -The data that is written is binary. The first eight bytes are the length of the -compiled pattern data followed by the length of the optional study data, each -written as four bytes in big-endian order (most significant byte first). If -there is no study data (either the pattern was not studied, or studying did not -return any data), the second length is zero. The lengths are followed by an -exact copy of the compiled pattern. If there is additional study data, this -(excluding any JIT data) follows immediately after the compiled pattern. After -writing the file, \fBpcretest\fP expects to read a new pattern. -.P -A saved pattern can be reloaded into \fBpcretest\fP by specifying < and a file -name instead of a pattern. There must be no space between < and the file name, -which must not contain a < character, as otherwise \fBpcretest\fP will -interpret the line as a pattern delimited by < characters. For example: -.sp - re> -.\" -ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre -.\" -.P -Details of exactly which Perl regular expression features are and are not -supported by PCRE are given in separate documents. See the -.\" HREF -\fBpcrepattern\fP -.\" -and -.\" HREF -\fBpcrecompat\fP -.\" -pages. There is a syntax summary in the -.\" HREF -\fBpcresyntax\fP -.\" -page. -.P -Some features of PCRE can be included, excluded, or changed when the library is -built. The -.\" HREF -\fBpcre_config()\fP -.\" -function makes it possible for a client to discover which features are -available. The features themselves are described in the -.\" HREF -\fBpcrebuild\fP -.\" -page. Documentation about building PCRE for various operating systems can be -found in the -.\" HTML -.\" -\fBREADME\fP -.\" -and -.\" HTML -.\" -\fBNON-AUTOTOOLS_BUILD\fP -.\" -files in the source distribution. -.P -The libraries contains a number of undocumented internal functions and data -tables that are used by more than one of the exported external functions, but -which are not intended for use by external callers. Their names all begin with -"_pcre_" or "_pcre16_" or "_pcre32_", which hopefully will not provoke any name -clashes. In some environments, it is possible to control which external symbols -are exported when a shared library is built, and in these cases the -undocumented symbols are not exported. -. -. -.SH "SECURITY CONSIDERATIONS" -.rs -.sp -If you are using PCRE in a non-UTF application that permits users to supply -arbitrary patterns for compilation, you should be aware of a feature that -allows users to turn on UTF support from within a pattern, provided that PCRE -was built with UTF support. For example, an 8-bit pattern that begins with -"(*UTF8)" or "(*UTF)" turns on UTF-8 mode, which interprets patterns and -subjects as strings of UTF-8 characters instead of individual 8-bit characters. -This causes both the pattern and any data against which it is matched to be -checked for UTF-8 validity. If the data string is very long, such a check might -use sufficiently many resources as to cause your application to lose -performance. -.P -One way of guarding against this possibility is to use the -\fBpcre_fullinfo()\fP function to check the compiled pattern's options for UTF. -Alternatively, from release 8.33, you can set the PCRE_NEVER_UTF option at -compile time. This causes an compile time error if a pattern contains a -UTF-setting sequence. -.P -If your application is one that supports UTF, be aware that validity checking -can take time. If the same data string is to be matched many times, you can use -the PCRE_NO_UTF[8|16|32]_CHECK option for the second and subsequent matches to -save redundant checks. -.P -Another way that performance can be hit is by running a pattern that has a very -large search tree against a string that will never match. Nested unlimited -repeats in a pattern are a common example. PCRE provides some protection -against this: see the PCRE_EXTRA_MATCH_LIMIT feature in the -.\" HREF -\fBpcreapi\fP -.\" -page. -. -. -.SH "USER DOCUMENTATION" -.rs -.sp -The user documentation for PCRE comprises a number of different sections. In -the "man" format, each of these is a separate "man page". In the HTML format, -each is a separate page, linked from the index page. In the plain text format, -the descriptions of the \fBpcregrep\fP and \fBpcretest\fP programs are in files -called \fBpcregrep.txt\fP and \fBpcretest.txt\fP, respectively. The remaining -sections, except for the \fBpcredemo\fP section (which is a program listing), -are concatenated in \fBpcre.txt\fP, for ease of searching. The sections are as -follows: -.sp - pcre this document - pcre-config show PCRE installation configuration information - pcre16 details of the 16-bit library - pcre32 details of the 32-bit library - pcreapi details of PCRE's native C API - pcrebuild building PCRE - pcrecallout details of the callout feature - pcrecompat discussion of Perl compatibility - pcrecpp details of the C++ wrapper for the 8-bit library - pcredemo a demonstration C program that uses PCRE - pcregrep description of the \fBpcregrep\fP command (8-bit only) - pcrejit discussion of the just-in-time optimization support - pcrelimits details of size and other limits - pcrematching discussion of the two matching algorithms - pcrepartial details of the partial matching facility -.\" JOIN - pcrepattern syntax and semantics of supported - regular expressions - pcreperform discussion of performance issues - pcreposix the POSIX-compatible C API for the 8-bit library - pcreprecompile details of saving and re-using precompiled patterns - pcresample discussion of the pcredemo program - pcrestack discussion of stack usage - pcresyntax quick syntax reference - pcretest description of the \fBpcretest\fP testing command - pcreunicode discussion of Unicode and UTF-8/16/32 support -.sp -In the "man" and HTML formats, there is also a short page for each C library -function, listing its arguments and results. -. -. -.SH AUTHOR -.rs -.sp -.nf -Philip Hazel -University Computing Service -Cambridge CB2 3QH, England. -.fi -.P -Putting an actual email address here seems to have been a spam magnet, so I've -taken it away. If you want to email me, use my two initials, followed by the -two digits 10, at the domain cam.ac.uk. -. -. -.SH REVISION -.rs -.sp -.nf -Last updated: 10 February 2015 -Copyright (c) 1997-2015 University of Cambridge. -.fi diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre16.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre16.3 deleted file mode 100644 index 85126a67..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre16.3 +++ /dev/null @@ -1,371 +0,0 @@ -.TH PCRE 3 "12 May 2013" "PCRE 8.33" -.SH NAME -PCRE - Perl-compatible regular expressions -.sp -.B #include -. -. -.SH "PCRE 16-BIT API BASIC FUNCTIONS" -.rs -.sp -.nf -.B pcre16 *pcre16_compile(PCRE_SPTR16 \fIpattern\fP, int \fIoptions\fP, -.B " const char **\fIerrptr\fP, int *\fIerroffset\fP," -.B " const unsigned char *\fItableptr\fP);" -.sp -.B pcre16 *pcre16_compile2(PCRE_SPTR16 \fIpattern\fP, int \fIoptions\fP, -.B " int *\fIerrorcodeptr\fP," -.B " const char **\fIerrptr\fP, int *\fIerroffset\fP," -.B " const unsigned char *\fItableptr\fP);" -.sp -.B pcre16_extra *pcre16_study(const pcre16 *\fIcode\fP, int \fIoptions\fP, -.B " const char **\fIerrptr\fP);" -.sp -.B void pcre16_free_study(pcre16_extra *\fIextra\fP); -.sp -.B int pcre16_exec(const pcre16 *\fIcode\fP, "const pcre16_extra *\fIextra\fP," -.B " PCRE_SPTR16 \fIsubject\fP, int \fIlength\fP, int \fIstartoffset\fP," -.B " int \fIoptions\fP, int *\fIovector\fP, int \fIovecsize\fP);" -.sp -.B int pcre16_dfa_exec(const pcre16 *\fIcode\fP, "const pcre16_extra *\fIextra\fP," -.B " PCRE_SPTR16 \fIsubject\fP, int \fIlength\fP, int \fIstartoffset\fP," -.B " int \fIoptions\fP, int *\fIovector\fP, int \fIovecsize\fP," -.B " int *\fIworkspace\fP, int \fIwscount\fP);" -.fi -. -. -.SH "PCRE 16-BIT API STRING EXTRACTION FUNCTIONS" -.rs -.sp -.nf -.B int pcre16_copy_named_substring(const pcre16 *\fIcode\fP, -.B " PCRE_SPTR16 \fIsubject\fP, int *\fIovector\fP," -.B " int \fIstringcount\fP, PCRE_SPTR16 \fIstringname\fP," -.B " PCRE_UCHAR16 *\fIbuffer\fP, int \fIbuffersize\fP);" -.sp -.B int pcre16_copy_substring(PCRE_SPTR16 \fIsubject\fP, int *\fIovector\fP, -.B " int \fIstringcount\fP, int \fIstringnumber\fP, PCRE_UCHAR16 *\fIbuffer\fP," -.B " int \fIbuffersize\fP);" -.sp -.B int pcre16_get_named_substring(const pcre16 *\fIcode\fP, -.B " PCRE_SPTR16 \fIsubject\fP, int *\fIovector\fP," -.B " int \fIstringcount\fP, PCRE_SPTR16 \fIstringname\fP," -.B " PCRE_SPTR16 *\fIstringptr\fP);" -.sp -.B int pcre16_get_stringnumber(const pcre16 *\fIcode\fP, -.B " PCRE_SPTR16 \fIname\fP); -.sp -.B int pcre16_get_stringtable_entries(const pcre16 *\fIcode\fP, -.B " PCRE_SPTR16 \fIname\fP, PCRE_UCHAR16 **\fIfirst\fP, PCRE_UCHAR16 **\fIlast\fP);" -.sp -.B int pcre16_get_substring(PCRE_SPTR16 \fIsubject\fP, int *\fIovector\fP, -.B " int \fIstringcount\fP, int \fIstringnumber\fP," -.B " PCRE_SPTR16 *\fIstringptr\fP);" -.sp -.B int pcre16_get_substring_list(PCRE_SPTR16 \fIsubject\fP, -.B " int *\fIovector\fP, int \fIstringcount\fP, PCRE_SPTR16 **\fIlistptr\fP);" -.sp -.B void pcre16_free_substring(PCRE_SPTR16 \fIstringptr\fP); -.sp -.B void pcre16_free_substring_list(PCRE_SPTR16 *\fIstringptr\fP); -.fi -. -. -.SH "PCRE 16-BIT API AUXILIARY FUNCTIONS" -.rs -.sp -.nf -.B pcre16_jit_stack *pcre16_jit_stack_alloc(int \fIstartsize\fP, int \fImaxsize\fP); -.sp -.B void pcre16_jit_stack_free(pcre16_jit_stack *\fIstack\fP); -.sp -.B void pcre16_assign_jit_stack(pcre16_extra *\fIextra\fP, -.B " pcre16_jit_callback \fIcallback\fP, void *\fIdata\fP);" -.sp -.B const unsigned char *pcre16_maketables(void); -.sp -.B int pcre16_fullinfo(const pcre16 *\fIcode\fP, "const pcre16_extra *\fIextra\fP," -.B " int \fIwhat\fP, void *\fIwhere\fP);" -.sp -.B int pcre16_refcount(pcre16 *\fIcode\fP, int \fIadjust\fP); -.sp -.B int pcre16_config(int \fIwhat\fP, void *\fIwhere\fP); -.sp -.B const char *pcre16_version(void); -.sp -.B int pcre16_pattern_to_host_byte_order(pcre16 *\fIcode\fP, -.B " pcre16_extra *\fIextra\fP, const unsigned char *\fItables\fP);" -.fi -. -. -.SH "PCRE 16-BIT API INDIRECTED FUNCTIONS" -.rs -.sp -.nf -.B void *(*pcre16_malloc)(size_t); -.sp -.B void (*pcre16_free)(void *); -.sp -.B void *(*pcre16_stack_malloc)(size_t); -.sp -.B void (*pcre16_stack_free)(void *); -.sp -.B int (*pcre16_callout)(pcre16_callout_block *); -.fi -. -. -.SH "PCRE 16-BIT API 16-BIT-ONLY FUNCTION" -.rs -.sp -.nf -.B int pcre16_utf16_to_host_byte_order(PCRE_UCHAR16 *\fIoutput\fP, -.B " PCRE_SPTR16 \fIinput\fP, int \fIlength\fP, int *\fIbyte_order\fP," -.B " int \fIkeep_boms\fP);" -.fi -. -. -.SH "THE PCRE 16-BIT LIBRARY" -.rs -.sp -Starting with release 8.30, it is possible to compile a PCRE library that -supports 16-bit character strings, including UTF-16 strings, as well as or -instead of the original 8-bit library. The majority of the work to make this -possible was done by Zoltan Herczeg. The two libraries contain identical sets -of functions, used in exactly the same way. Only the names of the functions and -the data types of their arguments and results are different. To avoid -over-complication and reduce the documentation maintenance load, most of the -PCRE documentation describes the 8-bit library, with only occasional references -to the 16-bit library. This page describes what is different when you use the -16-bit library. -.P -WARNING: A single application can be linked with both libraries, but you must -take care when processing any particular pattern to use functions from just one -library. For example, if you want to study a pattern that was compiled with -\fBpcre16_compile()\fP, you must do so with \fBpcre16_study()\fP, not -\fBpcre_study()\fP, and you must free the study data with -\fBpcre16_free_study()\fP. -. -. -.SH "THE HEADER FILE" -.rs -.sp -There is only one header file, \fBpcre.h\fP. It contains prototypes for all the -functions in all libraries, as well as definitions of flags, structures, error -codes, etc. -. -. -.SH "THE LIBRARY NAME" -.rs -.sp -In Unix-like systems, the 16-bit library is called \fBlibpcre16\fP, and can -normally be accesss by adding \fB-lpcre16\fP to the command for linking an -application that uses PCRE. -. -. -.SH "STRING TYPES" -.rs -.sp -In the 8-bit library, strings are passed to PCRE library functions as vectors -of bytes with the C type "char *". In the 16-bit library, strings are passed as -vectors of unsigned 16-bit quantities. The macro PCRE_UCHAR16 specifies an -appropriate data type, and PCRE_SPTR16 is defined as "const PCRE_UCHAR16 *". In -very many environments, "short int" is a 16-bit data type. When PCRE is built, -it defines PCRE_UCHAR16 as "unsigned short int", but checks that it really is a -16-bit data type. If it is not, the build fails with an error message telling -the maintainer to modify the definition appropriately. -. -. -.SH "STRUCTURE TYPES" -.rs -.sp -The types of the opaque structures that are used for compiled 16-bit patterns -and JIT stacks are \fBpcre16\fP and \fBpcre16_jit_stack\fP respectively. The -type of the user-accessible structure that is returned by \fBpcre16_study()\fP -is \fBpcre16_extra\fP, and the type of the structure that is used for passing -data to a callout function is \fBpcre16_callout_block\fP. These structures -contain the same fields, with the same names, as their 8-bit counterparts. The -only difference is that pointers to character strings are 16-bit instead of -8-bit types. -. -. -.SH "16-BIT FUNCTIONS" -.rs -.sp -For every function in the 8-bit library there is a corresponding function in -the 16-bit library with a name that starts with \fBpcre16_\fP instead of -\fBpcre_\fP. The prototypes are listed above. In addition, there is one extra -function, \fBpcre16_utf16_to_host_byte_order()\fP. This is a utility function -that converts a UTF-16 character string to host byte order if necessary. The -other 16-bit functions expect the strings they are passed to be in host byte -order. -.P -The \fIinput\fP and \fIoutput\fP arguments of -\fBpcre16_utf16_to_host_byte_order()\fP may point to the same address, that is, -conversion in place is supported. The output buffer must be at least as long as -the input. -.P -The \fIlength\fP argument specifies the number of 16-bit data units in the -input string; a negative value specifies a zero-terminated string. -.P -If \fIbyte_order\fP is NULL, it is assumed that the string starts off in host -byte order. This may be changed by byte-order marks (BOMs) anywhere in the -string (commonly as the first character). -.P -If \fIbyte_order\fP is not NULL, a non-zero value of the integer to which it -points means that the input starts off in host byte order, otherwise the -opposite order is assumed. Again, BOMs in the string can change this. The final -byte order is passed back at the end of processing. -.P -If \fIkeep_boms\fP is not zero, byte-order mark characters (0xfeff) are copied -into the output string. Otherwise they are discarded. -.P -The result of the function is the number of 16-bit units placed into the output -buffer, including the zero terminator if the string was zero-terminated. -. -. -.SH "SUBJECT STRING OFFSETS" -.rs -.sp -The lengths and starting offsets of subject strings must be specified in 16-bit -data units, and the offsets within subject strings that are returned by the -matching functions are in also 16-bit units rather than bytes. -. -. -.SH "NAMED SUBPATTERNS" -.rs -.sp -The name-to-number translation table that is maintained for named subpatterns -uses 16-bit characters. The \fBpcre16_get_stringtable_entries()\fP function -returns the length of each entry in the table as the number of 16-bit data -units. -. -. -.SH "OPTION NAMES" -.rs -.sp -There are two new general option names, PCRE_UTF16 and PCRE_NO_UTF16_CHECK, -which correspond to PCRE_UTF8 and PCRE_NO_UTF8_CHECK in the 8-bit library. In -fact, these new options define the same bits in the options word. There is a -discussion about the -.\" HTML -.\" -validity of UTF-16 strings -.\" -in the -.\" HREF -\fBpcreunicode\fP -.\" -page. -.P -For the \fBpcre16_config()\fP function there is an option PCRE_CONFIG_UTF16 -that returns 1 if UTF-16 support is configured, otherwise 0. If this option is -given to \fBpcre_config()\fP or \fBpcre32_config()\fP, or if the -PCRE_CONFIG_UTF8 or PCRE_CONFIG_UTF32 option is given to \fBpcre16_config()\fP, -the result is the PCRE_ERROR_BADOPTION error. -. -. -.SH "CHARACTER CODES" -.rs -.sp -In 16-bit mode, when PCRE_UTF16 is not set, character values are treated in the -same way as in 8-bit, non UTF-8 mode, except, of course, that they can range -from 0 to 0xffff instead of 0 to 0xff. Character types for characters less than -0xff can therefore be influenced by the locale in the same way as before. -Characters greater than 0xff have only one case, and no "type" (such as letter -or digit). -.P -In UTF-16 mode, the character code is Unicode, in the range 0 to 0x10ffff, with -the exception of values in the range 0xd800 to 0xdfff because those are -"surrogate" values that are used in pairs to encode values greater than 0xffff. -.P -A UTF-16 string can indicate its endianness by special code knows as a -byte-order mark (BOM). The PCRE functions do not handle this, expecting strings -to be in host byte order. A utility function called -\fBpcre16_utf16_to_host_byte_order()\fP is provided to help with this (see -above). -. -. -.SH "ERROR NAMES" -.rs -.sp -The errors PCRE_ERROR_BADUTF16_OFFSET and PCRE_ERROR_SHORTUTF16 correspond to -their 8-bit counterparts. The error PCRE_ERROR_BADMODE is given when a compiled -pattern is passed to a function that processes patterns in the other -mode, for example, if a pattern compiled with \fBpcre_compile()\fP is passed to -\fBpcre16_exec()\fP. -.P -There are new error codes whose names begin with PCRE_UTF16_ERR for invalid -UTF-16 strings, corresponding to the PCRE_UTF8_ERR codes for UTF-8 strings that -are described in the section entitled -.\" HTML -.\" -"Reason codes for invalid UTF-8 strings" -.\" -in the main -.\" HREF -\fBpcreapi\fP -.\" -page. The UTF-16 errors are: -.sp - PCRE_UTF16_ERR1 Missing low surrogate at end of string - PCRE_UTF16_ERR2 Invalid low surrogate follows high surrogate - PCRE_UTF16_ERR3 Isolated low surrogate - PCRE_UTF16_ERR4 Non-character -. -. -.SH "ERROR TEXTS" -.rs -.sp -If there is an error while compiling a pattern, the error text that is passed -back by \fBpcre16_compile()\fP or \fBpcre16_compile2()\fP is still an 8-bit -character string, zero-terminated. -. -. -.SH "CALLOUTS" -.rs -.sp -The \fIsubject\fP and \fImark\fP fields in the callout block that is passed to -a callout function point to 16-bit vectors. -. -. -.SH "TESTING" -.rs -.sp -The \fBpcretest\fP program continues to operate with 8-bit input and output -files, but it can be used for testing the 16-bit library. If it is run with the -command line option \fB-16\fP, patterns and subject strings are converted from -8-bit to 16-bit before being passed to PCRE, and the 16-bit library functions -are used instead of the 8-bit ones. Returned 16-bit strings are converted to -8-bit for output. If both the 8-bit and the 32-bit libraries were not compiled, -\fBpcretest\fP defaults to 16-bit and the \fB-16\fP option is ignored. -.P -When PCRE is being built, the \fBRunTest\fP script that is called by "make -check" uses the \fBpcretest\fP \fB-C\fP option to discover which of the 8-bit, -16-bit and 32-bit libraries has been built, and runs the tests appropriately. -. -. -.SH "NOT SUPPORTED IN 16-BIT MODE" -.rs -.sp -Not all the features of the 8-bit library are available with the 16-bit -library. The C++ and POSIX wrapper functions support only the 8-bit library, -and the \fBpcregrep\fP program is at present 8-bit only. -. -. -.SH AUTHOR -.rs -.sp -.nf -Philip Hazel -University Computing Service -Cambridge CB2 3QH, England. -.fi -. -. -.SH REVISION -.rs -.sp -.nf -Last updated: 12 May 2013 -Copyright (c) 1997-2013 University of Cambridge. -.fi diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre16_assign_jit_stack.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre16_assign_jit_stack.3 deleted file mode 120000 index 40c8775a..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre16_assign_jit_stack.3 +++ /dev/null @@ -1 +0,0 @@ -pcre_assign_jit_stack.3 \ No newline at end of file diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre16_compile.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre16_compile.3 deleted file mode 120000 index 9364e751..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre16_compile.3 +++ /dev/null @@ -1 +0,0 @@ -pcre_compile.3 \ No newline at end of file diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre16_compile2.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre16_compile2.3 deleted file mode 120000 index 2d6aff35..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre16_compile2.3 +++ /dev/null @@ -1 +0,0 @@ -pcre_compile2.3 \ No newline at end of file diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre16_config.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre16_config.3 deleted file mode 120000 index db964059..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre16_config.3 +++ /dev/null @@ -1 +0,0 @@ -pcre_config.3 \ No newline at end of file diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre16_copy_named_substring.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre16_copy_named_substring.3 deleted file mode 120000 index c15b9774..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre16_copy_named_substring.3 +++ /dev/null @@ -1 +0,0 @@ -pcre_copy_named_substring.3 \ No newline at end of file diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre16_copy_substring.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre16_copy_substring.3 deleted file mode 120000 index 98d1f84d..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre16_copy_substring.3 +++ /dev/null @@ -1 +0,0 @@ -pcre_copy_substring.3 \ No newline at end of file diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre16_dfa_exec.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre16_dfa_exec.3 deleted file mode 120000 index ed408df0..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre16_dfa_exec.3 +++ /dev/null @@ -1 +0,0 @@ -pcre_dfa_exec.3 \ No newline at end of file diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre16_exec.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre16_exec.3 deleted file mode 120000 index ebaa2527..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre16_exec.3 +++ /dev/null @@ -1 +0,0 @@ -pcre_exec.3 \ No newline at end of file diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre16_free_study.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre16_free_study.3 deleted file mode 120000 index 4c53ea9f..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre16_free_study.3 +++ /dev/null @@ -1 +0,0 @@ -pcre_free_study.3 \ No newline at end of file diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre16_free_substring.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre16_free_substring.3 deleted file mode 120000 index 48567bfb..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre16_free_substring.3 +++ /dev/null @@ -1 +0,0 @@ -pcre_free_substring.3 \ No newline at end of file diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre16_free_substring_list.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre16_free_substring_list.3 deleted file mode 120000 index 84b7b7e5..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre16_free_substring_list.3 +++ /dev/null @@ -1 +0,0 @@ -pcre_free_substring_list.3 \ No newline at end of file diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre16_fullinfo.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre16_fullinfo.3 deleted file mode 120000 index b7386a98..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre16_fullinfo.3 +++ /dev/null @@ -1 +0,0 @@ -pcre_fullinfo.3 \ No newline at end of file diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre16_get_named_substring.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre16_get_named_substring.3 deleted file mode 120000 index c095ca50..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre16_get_named_substring.3 +++ /dev/null @@ -1 +0,0 @@ -pcre_get_named_substring.3 \ No newline at end of file diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre16_get_stringnumber.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre16_get_stringnumber.3 deleted file mode 120000 index f8e81d32..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre16_get_stringnumber.3 +++ /dev/null @@ -1 +0,0 @@ -pcre_get_stringnumber.3 \ No newline at end of file diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre16_get_stringtable_entries.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre16_get_stringtable_entries.3 deleted file mode 120000 index 9f8cc4a7..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre16_get_stringtable_entries.3 +++ /dev/null @@ -1 +0,0 @@ -pcre_get_stringtable_entries.3 \ No newline at end of file diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre16_get_substring.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre16_get_substring.3 deleted file mode 120000 index 26383b5d..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre16_get_substring.3 +++ /dev/null @@ -1 +0,0 @@ -pcre_get_substring.3 \ No newline at end of file diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre16_get_substring_list.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre16_get_substring_list.3 deleted file mode 120000 index 2faa865f..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre16_get_substring_list.3 +++ /dev/null @@ -1 +0,0 @@ -pcre_get_substring_list.3 \ No newline at end of file diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre16_jit_exec.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre16_jit_exec.3 deleted file mode 120000 index 59089ada..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre16_jit_exec.3 +++ /dev/null @@ -1 +0,0 @@ -pcre_jit_exec.3 \ No newline at end of file diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre16_jit_stack_alloc.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre16_jit_stack_alloc.3 deleted file mode 120000 index dab43b82..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre16_jit_stack_alloc.3 +++ /dev/null @@ -1 +0,0 @@ -pcre_jit_stack_alloc.3 \ No newline at end of file diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre16_jit_stack_free.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre16_jit_stack_free.3 deleted file mode 120000 index e92aa310..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre16_jit_stack_free.3 +++ /dev/null @@ -1 +0,0 @@ -pcre_jit_stack_free.3 \ No newline at end of file diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre16_maketables.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre16_maketables.3 deleted file mode 120000 index 3b6308e2..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre16_maketables.3 +++ /dev/null @@ -1 +0,0 @@ -pcre_maketables.3 \ No newline at end of file diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre16_pattern_to_host_byte_order.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre16_pattern_to_host_byte_order.3 deleted file mode 120000 index 6540917e..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre16_pattern_to_host_byte_order.3 +++ /dev/null @@ -1 +0,0 @@ -pcre_pattern_to_host_byte_order.3 \ No newline at end of file diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre16_refcount.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre16_refcount.3 deleted file mode 120000 index 63cece3f..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre16_refcount.3 +++ /dev/null @@ -1 +0,0 @@ -pcre_refcount.3 \ No newline at end of file diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre16_study.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre16_study.3 deleted file mode 120000 index 9871217f..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre16_study.3 +++ /dev/null @@ -1 +0,0 @@ -pcre_study.3 \ No newline at end of file diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre16_utf16_to_host_byte_order.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre16_utf16_to_host_byte_order.3 deleted file mode 120000 index d9233991..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre16_utf16_to_host_byte_order.3 +++ /dev/null @@ -1 +0,0 @@ -pcre_utf16_to_host_byte_order.3 \ No newline at end of file diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre16_version.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre16_version.3 deleted file mode 120000 index c31893c6..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre16_version.3 +++ /dev/null @@ -1 +0,0 @@ -pcre_version.3 \ No newline at end of file diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre32.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre32.3 deleted file mode 100644 index 7cde8c08..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre32.3 +++ /dev/null @@ -1,369 +0,0 @@ -.TH PCRE 3 "12 May 2013" "PCRE 8.33" -.SH NAME -PCRE - Perl-compatible regular expressions -.sp -.B #include -. -. -.SH "PCRE 32-BIT API BASIC FUNCTIONS" -.rs -.sp -.nf -.B pcre32 *pcre32_compile(PCRE_SPTR32 \fIpattern\fP, int \fIoptions\fP, -.B " const char **\fIerrptr\fP, int *\fIerroffset\fP," -.B " const unsigned char *\fItableptr\fP);" -.sp -.B pcre32 *pcre32_compile2(PCRE_SPTR32 \fIpattern\fP, int \fIoptions\fP, -.B " int *\fIerrorcodeptr\fP," -.B " const unsigned char *\fItableptr\fP);" -.sp -.B pcre32_extra *pcre32_study(const pcre32 *\fIcode\fP, int \fIoptions\fP, -.B " const char **\fIerrptr\fP);" -.sp -.B void pcre32_free_study(pcre32_extra *\fIextra\fP); -.sp -.B int pcre32_exec(const pcre32 *\fIcode\fP, "const pcre32_extra *\fIextra\fP," -.B " PCRE_SPTR32 \fIsubject\fP, int \fIlength\fP, int \fIstartoffset\fP," -.B " int \fIoptions\fP, int *\fIovector\fP, int \fIovecsize\fP);" -.sp -.B int pcre32_dfa_exec(const pcre32 *\fIcode\fP, "const pcre32_extra *\fIextra\fP," -.B " PCRE_SPTR32 \fIsubject\fP, int \fIlength\fP, int \fIstartoffset\fP," -.B " int \fIoptions\fP, int *\fIovector\fP, int \fIovecsize\fP," -.B " int *\fIworkspace\fP, int \fIwscount\fP);" -.fi -. -. -.SH "PCRE 32-BIT API STRING EXTRACTION FUNCTIONS" -.rs -.sp -.nf -.B int pcre32_copy_named_substring(const pcre32 *\fIcode\fP, -.B " PCRE_SPTR32 \fIsubject\fP, int *\fIovector\fP," -.B " int \fIstringcount\fP, PCRE_SPTR32 \fIstringname\fP," -.B " PCRE_UCHAR32 *\fIbuffer\fP, int \fIbuffersize\fP);" -.sp -.B int pcre32_copy_substring(PCRE_SPTR32 \fIsubject\fP, int *\fIovector\fP, -.B " int \fIstringcount\fP, int \fIstringnumber\fP, PCRE_UCHAR32 *\fIbuffer\fP," -.B " int \fIbuffersize\fP);" -.sp -.B int pcre32_get_named_substring(const pcre32 *\fIcode\fP, -.B " PCRE_SPTR32 \fIsubject\fP, int *\fIovector\fP," -.B " int \fIstringcount\fP, PCRE_SPTR32 \fIstringname\fP," -.B " PCRE_SPTR32 *\fIstringptr\fP);" -.sp -.B int pcre32_get_stringnumber(const pcre32 *\fIcode\fP, -.B " PCRE_SPTR32 \fIname\fP);" -.sp -.B int pcre32_get_stringtable_entries(const pcre32 *\fIcode\fP, -.B " PCRE_SPTR32 \fIname\fP, PCRE_UCHAR32 **\fIfirst\fP, PCRE_UCHAR32 **\fIlast\fP);" -.sp -.B int pcre32_get_substring(PCRE_SPTR32 \fIsubject\fP, int *\fIovector\fP, -.B " int \fIstringcount\fP, int \fIstringnumber\fP," -.B " PCRE_SPTR32 *\fIstringptr\fP);" -.sp -.B int pcre32_get_substring_list(PCRE_SPTR32 \fIsubject\fP, -.B " int *\fIovector\fP, int \fIstringcount\fP, PCRE_SPTR32 **\fIlistptr\fP);" -.sp -.B void pcre32_free_substring(PCRE_SPTR32 \fIstringptr\fP); -.sp -.B void pcre32_free_substring_list(PCRE_SPTR32 *\fIstringptr\fP); -.fi -. -. -.SH "PCRE 32-BIT API AUXILIARY FUNCTIONS" -.rs -.sp -.nf -.B pcre32_jit_stack *pcre32_jit_stack_alloc(int \fIstartsize\fP, int \fImaxsize\fP); -.sp -.B void pcre32_jit_stack_free(pcre32_jit_stack *\fIstack\fP); -.sp -.B void pcre32_assign_jit_stack(pcre32_extra *\fIextra\fP, -.B " pcre32_jit_callback \fIcallback\fP, void *\fIdata\fP);" -.sp -.B const unsigned char *pcre32_maketables(void); -.sp -.B int pcre32_fullinfo(const pcre32 *\fIcode\fP, "const pcre32_extra *\fIextra\fP," -.B " int \fIwhat\fP, void *\fIwhere\fP);" -.sp -.B int pcre32_refcount(pcre32 *\fIcode\fP, int \fIadjust\fP); -.sp -.B int pcre32_config(int \fIwhat\fP, void *\fIwhere\fP); -.sp -.B const char *pcre32_version(void); -.sp -.B int pcre32_pattern_to_host_byte_order(pcre32 *\fIcode\fP, -.B " pcre32_extra *\fIextra\fP, const unsigned char *\fItables\fP);" -.fi -. -. -.SH "PCRE 32-BIT API INDIRECTED FUNCTIONS" -.rs -.sp -.nf -.B void *(*pcre32_malloc)(size_t); -.sp -.B void (*pcre32_free)(void *); -.sp -.B void *(*pcre32_stack_malloc)(size_t); -.sp -.B void (*pcre32_stack_free)(void *); -.sp -.B int (*pcre32_callout)(pcre32_callout_block *); -.fi -. -. -.SH "PCRE 32-BIT API 32-BIT-ONLY FUNCTION" -.rs -.sp -.nf -.B int pcre32_utf32_to_host_byte_order(PCRE_UCHAR32 *\fIoutput\fP, -.B " PCRE_SPTR32 \fIinput\fP, int \fIlength\fP, int *\fIbyte_order\fP," -.B " int \fIkeep_boms\fP);" -.fi -. -. -.SH "THE PCRE 32-BIT LIBRARY" -.rs -.sp -Starting with release 8.32, it is possible to compile a PCRE library that -supports 32-bit character strings, including UTF-32 strings, as well as or -instead of the original 8-bit library. This work was done by Christian Persch, -based on the work done by Zoltan Herczeg for the 16-bit library. All three -libraries contain identical sets of functions, used in exactly the same way. -Only the names of the functions and the data types of their arguments and -results are different. To avoid over-complication and reduce the documentation -maintenance load, most of the PCRE documentation describes the 8-bit library, -with only occasional references to the 16-bit and 32-bit libraries. This page -describes what is different when you use the 32-bit library. -.P -WARNING: A single application can be linked with all or any of the three -libraries, but you must take care when processing any particular pattern -to use functions from just one library. For example, if you want to study -a pattern that was compiled with \fBpcre32_compile()\fP, you must do so -with \fBpcre32_study()\fP, not \fBpcre_study()\fP, and you must free the -study data with \fBpcre32_free_study()\fP. -. -. -.SH "THE HEADER FILE" -.rs -.sp -There is only one header file, \fBpcre.h\fP. It contains prototypes for all the -functions in all libraries, as well as definitions of flags, structures, error -codes, etc. -. -. -.SH "THE LIBRARY NAME" -.rs -.sp -In Unix-like systems, the 32-bit library is called \fBlibpcre32\fP, and can -normally be accesss by adding \fB-lpcre32\fP to the command for linking an -application that uses PCRE. -. -. -.SH "STRING TYPES" -.rs -.sp -In the 8-bit library, strings are passed to PCRE library functions as vectors -of bytes with the C type "char *". In the 32-bit library, strings are passed as -vectors of unsigned 32-bit quantities. The macro PCRE_UCHAR32 specifies an -appropriate data type, and PCRE_SPTR32 is defined as "const PCRE_UCHAR32 *". In -very many environments, "unsigned int" is a 32-bit data type. When PCRE is -built, it defines PCRE_UCHAR32 as "unsigned int", but checks that it really is -a 32-bit data type. If it is not, the build fails with an error message telling -the maintainer to modify the definition appropriately. -. -. -.SH "STRUCTURE TYPES" -.rs -.sp -The types of the opaque structures that are used for compiled 32-bit patterns -and JIT stacks are \fBpcre32\fP and \fBpcre32_jit_stack\fP respectively. The -type of the user-accessible structure that is returned by \fBpcre32_study()\fP -is \fBpcre32_extra\fP, and the type of the structure that is used for passing -data to a callout function is \fBpcre32_callout_block\fP. These structures -contain the same fields, with the same names, as their 8-bit counterparts. The -only difference is that pointers to character strings are 32-bit instead of -8-bit types. -. -. -.SH "32-BIT FUNCTIONS" -.rs -.sp -For every function in the 8-bit library there is a corresponding function in -the 32-bit library with a name that starts with \fBpcre32_\fP instead of -\fBpcre_\fP. The prototypes are listed above. In addition, there is one extra -function, \fBpcre32_utf32_to_host_byte_order()\fP. This is a utility function -that converts a UTF-32 character string to host byte order if necessary. The -other 32-bit functions expect the strings they are passed to be in host byte -order. -.P -The \fIinput\fP and \fIoutput\fP arguments of -\fBpcre32_utf32_to_host_byte_order()\fP may point to the same address, that is, -conversion in place is supported. The output buffer must be at least as long as -the input. -.P -The \fIlength\fP argument specifies the number of 32-bit data units in the -input string; a negative value specifies a zero-terminated string. -.P -If \fIbyte_order\fP is NULL, it is assumed that the string starts off in host -byte order. This may be changed by byte-order marks (BOMs) anywhere in the -string (commonly as the first character). -.P -If \fIbyte_order\fP is not NULL, a non-zero value of the integer to which it -points means that the input starts off in host byte order, otherwise the -opposite order is assumed. Again, BOMs in the string can change this. The final -byte order is passed back at the end of processing. -.P -If \fIkeep_boms\fP is not zero, byte-order mark characters (0xfeff) are copied -into the output string. Otherwise they are discarded. -.P -The result of the function is the number of 32-bit units placed into the output -buffer, including the zero terminator if the string was zero-terminated. -. -. -.SH "SUBJECT STRING OFFSETS" -.rs -.sp -The lengths and starting offsets of subject strings must be specified in 32-bit -data units, and the offsets within subject strings that are returned by the -matching functions are in also 32-bit units rather than bytes. -. -. -.SH "NAMED SUBPATTERNS" -.rs -.sp -The name-to-number translation table that is maintained for named subpatterns -uses 32-bit characters. The \fBpcre32_get_stringtable_entries()\fP function -returns the length of each entry in the table as the number of 32-bit data -units. -. -. -.SH "OPTION NAMES" -.rs -.sp -There are two new general option names, PCRE_UTF32 and PCRE_NO_UTF32_CHECK, -which correspond to PCRE_UTF8 and PCRE_NO_UTF8_CHECK in the 8-bit library. In -fact, these new options define the same bits in the options word. There is a -discussion about the -.\" HTML -.\" -validity of UTF-32 strings -.\" -in the -.\" HREF -\fBpcreunicode\fP -.\" -page. -.P -For the \fBpcre32_config()\fP function there is an option PCRE_CONFIG_UTF32 -that returns 1 if UTF-32 support is configured, otherwise 0. If this option is -given to \fBpcre_config()\fP or \fBpcre16_config()\fP, or if the -PCRE_CONFIG_UTF8 or PCRE_CONFIG_UTF16 option is given to \fBpcre32_config()\fP, -the result is the PCRE_ERROR_BADOPTION error. -. -. -.SH "CHARACTER CODES" -.rs -.sp -In 32-bit mode, when PCRE_UTF32 is not set, character values are treated in the -same way as in 8-bit, non UTF-8 mode, except, of course, that they can range -from 0 to 0x7fffffff instead of 0 to 0xff. Character types for characters less -than 0xff can therefore be influenced by the locale in the same way as before. -Characters greater than 0xff have only one case, and no "type" (such as letter -or digit). -.P -In UTF-32 mode, the character code is Unicode, in the range 0 to 0x10ffff, with -the exception of values in the range 0xd800 to 0xdfff because those are -"surrogate" values that are ill-formed in UTF-32. -.P -A UTF-32 string can indicate its endianness by special code knows as a -byte-order mark (BOM). The PCRE functions do not handle this, expecting strings -to be in host byte order. A utility function called -\fBpcre32_utf32_to_host_byte_order()\fP is provided to help with this (see -above). -. -. -.SH "ERROR NAMES" -.rs -.sp -The error PCRE_ERROR_BADUTF32 corresponds to its 8-bit counterpart. -The error PCRE_ERROR_BADMODE is given when a compiled -pattern is passed to a function that processes patterns in the other -mode, for example, if a pattern compiled with \fBpcre_compile()\fP is passed to -\fBpcre32_exec()\fP. -.P -There are new error codes whose names begin with PCRE_UTF32_ERR for invalid -UTF-32 strings, corresponding to the PCRE_UTF8_ERR codes for UTF-8 strings that -are described in the section entitled -.\" HTML -.\" -"Reason codes for invalid UTF-8 strings" -.\" -in the main -.\" HREF -\fBpcreapi\fP -.\" -page. The UTF-32 errors are: -.sp - PCRE_UTF32_ERR1 Surrogate character (range from 0xd800 to 0xdfff) - PCRE_UTF32_ERR2 Non-character - PCRE_UTF32_ERR3 Character > 0x10ffff -. -. -.SH "ERROR TEXTS" -.rs -.sp -If there is an error while compiling a pattern, the error text that is passed -back by \fBpcre32_compile()\fP or \fBpcre32_compile2()\fP is still an 8-bit -character string, zero-terminated. -. -. -.SH "CALLOUTS" -.rs -.sp -The \fIsubject\fP and \fImark\fP fields in the callout block that is passed to -a callout function point to 32-bit vectors. -. -. -.SH "TESTING" -.rs -.sp -The \fBpcretest\fP program continues to operate with 8-bit input and output -files, but it can be used for testing the 32-bit library. If it is run with the -command line option \fB-32\fP, patterns and subject strings are converted from -8-bit to 32-bit before being passed to PCRE, and the 32-bit library functions -are used instead of the 8-bit ones. Returned 32-bit strings are converted to -8-bit for output. If both the 8-bit and the 16-bit libraries were not compiled, -\fBpcretest\fP defaults to 32-bit and the \fB-32\fP option is ignored. -.P -When PCRE is being built, the \fBRunTest\fP script that is called by "make -check" uses the \fBpcretest\fP \fB-C\fP option to discover which of the 8-bit, -16-bit and 32-bit libraries has been built, and runs the tests appropriately. -. -. -.SH "NOT SUPPORTED IN 32-BIT MODE" -.rs -.sp -Not all the features of the 8-bit library are available with the 32-bit -library. The C++ and POSIX wrapper functions support only the 8-bit library, -and the \fBpcregrep\fP program is at present 8-bit only. -. -. -.SH AUTHOR -.rs -.sp -.nf -Philip Hazel -University Computing Service -Cambridge CB2 3QH, England. -.fi -. -. -.SH REVISION -.rs -.sp -.nf -Last updated: 12 May 2013 -Copyright (c) 1997-2013 University of Cambridge. -.fi diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre32_assign_jit_stack.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre32_assign_jit_stack.3 deleted file mode 120000 index 40c8775a..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre32_assign_jit_stack.3 +++ /dev/null @@ -1 +0,0 @@ -pcre_assign_jit_stack.3 \ No newline at end of file diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre32_compile.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre32_compile.3 deleted file mode 120000 index 9364e751..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre32_compile.3 +++ /dev/null @@ -1 +0,0 @@ -pcre_compile.3 \ No newline at end of file diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre32_compile2.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre32_compile2.3 deleted file mode 120000 index 2d6aff35..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre32_compile2.3 +++ /dev/null @@ -1 +0,0 @@ -pcre_compile2.3 \ No newline at end of file diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre32_config.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre32_config.3 deleted file mode 120000 index db964059..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre32_config.3 +++ /dev/null @@ -1 +0,0 @@ -pcre_config.3 \ No newline at end of file diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre32_copy_named_substring.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre32_copy_named_substring.3 deleted file mode 120000 index c15b9774..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre32_copy_named_substring.3 +++ /dev/null @@ -1 +0,0 @@ -pcre_copy_named_substring.3 \ No newline at end of file diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre32_copy_substring.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre32_copy_substring.3 deleted file mode 120000 index 98d1f84d..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre32_copy_substring.3 +++ /dev/null @@ -1 +0,0 @@ -pcre_copy_substring.3 \ No newline at end of file diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre32_dfa_exec.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre32_dfa_exec.3 deleted file mode 120000 index ed408df0..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre32_dfa_exec.3 +++ /dev/null @@ -1 +0,0 @@ -pcre_dfa_exec.3 \ No newline at end of file diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre32_exec.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre32_exec.3 deleted file mode 120000 index ebaa2527..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre32_exec.3 +++ /dev/null @@ -1 +0,0 @@ -pcre_exec.3 \ No newline at end of file diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre32_free_study.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre32_free_study.3 deleted file mode 120000 index 4c53ea9f..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre32_free_study.3 +++ /dev/null @@ -1 +0,0 @@ -pcre_free_study.3 \ No newline at end of file diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre32_free_substring.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre32_free_substring.3 deleted file mode 120000 index 48567bfb..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre32_free_substring.3 +++ /dev/null @@ -1 +0,0 @@ -pcre_free_substring.3 \ No newline at end of file diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre32_free_substring_list.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre32_free_substring_list.3 deleted file mode 120000 index 84b7b7e5..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre32_free_substring_list.3 +++ /dev/null @@ -1 +0,0 @@ -pcre_free_substring_list.3 \ No newline at end of file diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre32_fullinfo.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre32_fullinfo.3 deleted file mode 120000 index b7386a98..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre32_fullinfo.3 +++ /dev/null @@ -1 +0,0 @@ -pcre_fullinfo.3 \ No newline at end of file diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre32_get_named_substring.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre32_get_named_substring.3 deleted file mode 120000 index c095ca50..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre32_get_named_substring.3 +++ /dev/null @@ -1 +0,0 @@ -pcre_get_named_substring.3 \ No newline at end of file diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre32_get_stringnumber.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre32_get_stringnumber.3 deleted file mode 120000 index f8e81d32..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre32_get_stringnumber.3 +++ /dev/null @@ -1 +0,0 @@ -pcre_get_stringnumber.3 \ No newline at end of file diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre32_get_stringtable_entries.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre32_get_stringtable_entries.3 deleted file mode 120000 index 9f8cc4a7..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre32_get_stringtable_entries.3 +++ /dev/null @@ -1 +0,0 @@ -pcre_get_stringtable_entries.3 \ No newline at end of file diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre32_get_substring.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre32_get_substring.3 deleted file mode 120000 index 26383b5d..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre32_get_substring.3 +++ /dev/null @@ -1 +0,0 @@ -pcre_get_substring.3 \ No newline at end of file diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre32_get_substring_list.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre32_get_substring_list.3 deleted file mode 120000 index 2faa865f..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre32_get_substring_list.3 +++ /dev/null @@ -1 +0,0 @@ -pcre_get_substring_list.3 \ No newline at end of file diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre32_jit_exec.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre32_jit_exec.3 deleted file mode 120000 index 59089ada..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre32_jit_exec.3 +++ /dev/null @@ -1 +0,0 @@ -pcre_jit_exec.3 \ No newline at end of file diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre32_jit_stack_alloc.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre32_jit_stack_alloc.3 deleted file mode 120000 index dab43b82..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre32_jit_stack_alloc.3 +++ /dev/null @@ -1 +0,0 @@ -pcre_jit_stack_alloc.3 \ No newline at end of file diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre32_jit_stack_free.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre32_jit_stack_free.3 deleted file mode 120000 index e92aa310..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre32_jit_stack_free.3 +++ /dev/null @@ -1 +0,0 @@ -pcre_jit_stack_free.3 \ No newline at end of file diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre32_maketables.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre32_maketables.3 deleted file mode 120000 index 3b6308e2..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre32_maketables.3 +++ /dev/null @@ -1 +0,0 @@ -pcre_maketables.3 \ No newline at end of file diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre32_pattern_to_host_byte_order.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre32_pattern_to_host_byte_order.3 deleted file mode 120000 index 6540917e..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre32_pattern_to_host_byte_order.3 +++ /dev/null @@ -1 +0,0 @@ -pcre_pattern_to_host_byte_order.3 \ No newline at end of file diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre32_refcount.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre32_refcount.3 deleted file mode 120000 index 63cece3f..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre32_refcount.3 +++ /dev/null @@ -1 +0,0 @@ -pcre_refcount.3 \ No newline at end of file diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre32_study.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre32_study.3 deleted file mode 120000 index 9871217f..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre32_study.3 +++ /dev/null @@ -1 +0,0 @@ -pcre_study.3 \ No newline at end of file diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre32_utf32_to_host_byte_order.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre32_utf32_to_host_byte_order.3 deleted file mode 120000 index e9699f5f..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre32_utf32_to_host_byte_order.3 +++ /dev/null @@ -1 +0,0 @@ -pcre_utf32_to_host_byte_order.3 \ No newline at end of file diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre32_version.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre32_version.3 deleted file mode 120000 index c31893c6..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre32_version.3 +++ /dev/null @@ -1 +0,0 @@ -pcre_version.3 \ No newline at end of file diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre_assign_jit_stack.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre_assign_jit_stack.3 deleted file mode 100644 index 0ecf6f2c..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre_assign_jit_stack.3 +++ /dev/null @@ -1,59 +0,0 @@ -.TH PCRE_ASSIGN_JIT_STACK 3 "24 June 2012" "PCRE 8.30" -.SH NAME -PCRE - Perl-compatible regular expressions -.SH SYNOPSIS -.rs -.sp -.B #include -.PP -.nf -.B void pcre_assign_jit_stack(pcre_extra *\fIextra\fP, -.B " pcre_jit_callback \fIcallback\fP, void *\fIdata\fP);" -.sp -.B void pcre16_assign_jit_stack(pcre16_extra *\fIextra\fP, -.B " pcre16_jit_callback \fIcallback\fP, void *\fIdata\fP);" -.sp -.B void pcre32_assign_jit_stack(pcre32_extra *\fIextra\fP, -.B " pcre32_jit_callback \fIcallback\fP, void *\fIdata\fP);" -.fi -. -.SH DESCRIPTION -.rs -.sp -This function provides control over the memory used as a stack at run-time by a -call to \fBpcre[16|32]_exec()\fP with a pattern that has been successfully -compiled with JIT optimization. The arguments are: -.sp - extra the data pointer returned by \fBpcre[16|32]_study()\fP - callback a callback function - data a JIT stack or a value to be passed to the callback - function -.P -If \fIcallback\fP is NULL and \fIdata\fP is NULL, an internal 32K block on -the machine stack is used. -.P -If \fIcallback\fP is NULL and \fIdata\fP is not NULL, \fIdata\fP must -be a valid JIT stack, the result of calling \fBpcre[16|32]_jit_stack_alloc()\fP. -.P -If \fIcallback\fP not NULL, it is called with \fIdata\fP as an argument at -the start of matching, in order to set up a JIT stack. If the result is NULL, -the internal 32K stack is used; otherwise the return value must be a valid JIT -stack, the result of calling \fBpcre[16|32]_jit_stack_alloc()\fP. -.P -You may safely assign the same JIT stack to multiple patterns, as long as they -are all matched in the same thread. In a multithread application, each thread -must use its own JIT stack. For more details, see the -.\" HREF -\fBpcrejit\fP -.\" -page. -.P -There is a complete description of the PCRE native API in the -.\" HREF -\fBpcreapi\fP -.\" -page and a description of the POSIX API in the -.\" HREF -\fBpcreposix\fP -.\" -page. diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre_compile.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre_compile.3 deleted file mode 100644 index 5c16ebe2..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre_compile.3 +++ /dev/null @@ -1,96 +0,0 @@ -.TH PCRE_COMPILE 3 "01 October 2013" "PCRE 8.34" -.SH NAME -PCRE - Perl-compatible regular expressions -.SH SYNOPSIS -.rs -.sp -.B #include -.PP -.nf -.B pcre *pcre_compile(const char *\fIpattern\fP, int \fIoptions\fP, -.B " const char **\fIerrptr\fP, int *\fIerroffset\fP," -.B " const unsigned char *\fItableptr\fP);" -.sp -.B pcre16 *pcre16_compile(PCRE_SPTR16 \fIpattern\fP, int \fIoptions\fP, -.B " const char **\fIerrptr\fP, int *\fIerroffset\fP," -.B " const unsigned char *\fItableptr\fP);" -.sp -.B pcre32 *pcre32_compile(PCRE_SPTR32 \fIpattern\fP, int \fIoptions\fP, -.B " const char **\fIerrptr\fP, int *\fIerroffset\fP," -.B " const unsigned char *\fItableptr\fP);" -.fi -. -.SH DESCRIPTION -.rs -.sp -This function compiles a regular expression into an internal form. It is the -same as \fBpcre[16|32]_compile2()\fP, except for the absence of the -\fIerrorcodeptr\fP argument. Its arguments are: -.sp - \fIpattern\fP A zero-terminated string containing the - regular expression to be compiled - \fIoptions\fP Zero or more option bits - \fIerrptr\fP Where to put an error message - \fIerroffset\fP Offset in pattern where error was found - \fItableptr\fP Pointer to character tables, or NULL to - use the built-in default -.sp -The option bits are: -.sp - PCRE_ANCHORED Force pattern anchoring - PCRE_AUTO_CALLOUT Compile automatic callouts - PCRE_BSR_ANYCRLF \eR matches only CR, LF, or CRLF - PCRE_BSR_UNICODE \eR matches all Unicode line endings - PCRE_CASELESS Do caseless matching - PCRE_DOLLAR_ENDONLY $ not to match newline at end - PCRE_DOTALL . matches anything including NL - PCRE_DUPNAMES Allow duplicate names for subpatterns - PCRE_EXTENDED Ignore white space and # comments - PCRE_EXTRA PCRE extra features - (not much use currently) - PCRE_FIRSTLINE Force matching to be before newline - PCRE_JAVASCRIPT_COMPAT JavaScript compatibility - PCRE_MULTILINE ^ and $ match newlines within data - PCRE_NEVER_UTF Lock out UTF, e.g. via (*UTF) - PCRE_NEWLINE_ANY Recognize any Unicode newline sequence - PCRE_NEWLINE_ANYCRLF Recognize CR, LF, and CRLF as newline - sequences - PCRE_NEWLINE_CR Set CR as the newline sequence - PCRE_NEWLINE_CRLF Set CRLF as the newline sequence - PCRE_NEWLINE_LF Set LF as the newline sequence - PCRE_NO_AUTO_CAPTURE Disable numbered capturing paren- - theses (named ones available) - PCRE_NO_AUTO_POSSESS Disable auto-possessification - PCRE_NO_START_OPTIMIZE Disable match-time start optimizations - PCRE_NO_UTF16_CHECK Do not check the pattern for UTF-16 - validity (only relevant if - PCRE_UTF16 is set) - PCRE_NO_UTF32_CHECK Do not check the pattern for UTF-32 - validity (only relevant if - PCRE_UTF32 is set) - PCRE_NO_UTF8_CHECK Do not check the pattern for UTF-8 - validity (only relevant if - PCRE_UTF8 is set) - PCRE_UCP Use Unicode properties for \ed, \ew, etc. - PCRE_UNGREEDY Invert greediness of quantifiers - PCRE_UTF16 Run in \fBpcre16_compile()\fP UTF-16 mode - PCRE_UTF32 Run in \fBpcre32_compile()\fP UTF-32 mode - PCRE_UTF8 Run in \fBpcre_compile()\fP UTF-8 mode -.sp -PCRE must be built with UTF support in order to use PCRE_UTF8/16/32 and -PCRE_NO_UTF8/16/32_CHECK, and with UCP support if PCRE_UCP is used. -.P -The yield of the function is a pointer to a private data structure that -contains the compiled pattern, or NULL if an error was detected. Note that -compiling regular expressions with one version of PCRE for use with a different -version is not guaranteed to work and may cause crashes. -.P -There is a complete description of the PCRE native API in the -.\" HREF -\fBpcreapi\fP -.\" -page and a description of the POSIX API in the -.\" HREF -\fBpcreposix\fP -.\" -page. diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre_compile2.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre_compile2.3 deleted file mode 100644 index 37742018..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre_compile2.3 +++ /dev/null @@ -1,101 +0,0 @@ -.TH PCRE_COMPILE2 3 "01 October 2013" "PCRE 8.34" -.SH NAME -PCRE - Perl-compatible regular expressions -.SH SYNOPSIS -.rs -.sp -.B #include -.PP -.nf -.B pcre *pcre_compile2(const char *\fIpattern\fP, int \fIoptions\fP, -.B " int *\fIerrorcodeptr\fP," -.B " const char **\fIerrptr\fP, int *\fIerroffset\fP," -.B " const unsigned char *\fItableptr\fP);" -.sp -.B pcre16 *pcre16_compile2(PCRE_SPTR16 \fIpattern\fP, int \fIoptions\fP, -.B " int *\fIerrorcodeptr\fP," -.B " const char **\fIerrptr\fP, int *\fIerroffset\fP," -.B " const unsigned char *\fItableptr\fP);" -.sp -.B pcre32 *pcre32_compile2(PCRE_SPTR32 \fIpattern\fP, int \fIoptions\fP, -.B " int *\fIerrorcodeptr\fP,£ -.B " const char **\fIerrptr\fP, int *\fIerroffset\fP," -.B " const unsigned char *\fItableptr\fP);" -.fi -. -.SH DESCRIPTION -.rs -.sp -This function compiles a regular expression into an internal form. It is the -same as \fBpcre[16|32]_compile()\fP, except for the addition of the -\fIerrorcodeptr\fP argument. The arguments are: -. -.sp - \fIpattern\fP A zero-terminated string containing the - regular expression to be compiled - \fIoptions\fP Zero or more option bits - \fIerrorcodeptr\fP Where to put an error code - \fIerrptr\fP Where to put an error message - \fIerroffset\fP Offset in pattern where error was found - \fItableptr\fP Pointer to character tables, or NULL to - use the built-in default -.sp -The option bits are: -.sp - PCRE_ANCHORED Force pattern anchoring - PCRE_AUTO_CALLOUT Compile automatic callouts - PCRE_BSR_ANYCRLF \eR matches only CR, LF, or CRLF - PCRE_BSR_UNICODE \eR matches all Unicode line endings - PCRE_CASELESS Do caseless matching - PCRE_DOLLAR_ENDONLY $ not to match newline at end - PCRE_DOTALL . matches anything including NL - PCRE_DUPNAMES Allow duplicate names for subpatterns - PCRE_EXTENDED Ignore white space and # comments - PCRE_EXTRA PCRE extra features - (not much use currently) - PCRE_FIRSTLINE Force matching to be before newline - PCRE_JAVASCRIPT_COMPAT JavaScript compatibility - PCRE_MULTILINE ^ and $ match newlines within data - PCRE_NEVER_UTF Lock out UTF, e.g. via (*UTF) - PCRE_NEWLINE_ANY Recognize any Unicode newline sequence - PCRE_NEWLINE_ANYCRLF Recognize CR, LF, and CRLF as newline - sequences - PCRE_NEWLINE_CR Set CR as the newline sequence - PCRE_NEWLINE_CRLF Set CRLF as the newline sequence - PCRE_NEWLINE_LF Set LF as the newline sequence - PCRE_NO_AUTO_CAPTURE Disable numbered capturing paren- - theses (named ones available) - PCRE_NO_AUTO_POSSESS Disable auto-possessification - PCRE_NO_START_OPTIMIZE Disable match-time start optimizations - PCRE_NO_UTF16_CHECK Do not check the pattern for UTF-16 - validity (only relevant if - PCRE_UTF16 is set) - PCRE_NO_UTF32_CHECK Do not check the pattern for UTF-32 - validity (only relevant if - PCRE_UTF32 is set) - PCRE_NO_UTF8_CHECK Do not check the pattern for UTF-8 - validity (only relevant if - PCRE_UTF8 is set) - PCRE_UCP Use Unicode properties for \ed, \ew, etc. - PCRE_UNGREEDY Invert greediness of quantifiers - PCRE_UTF16 Run \fBpcre16_compile()\fP in UTF-16 mode - PCRE_UTF32 Run \fBpcre32_compile()\fP in UTF-32 mode - PCRE_UTF8 Run \fBpcre_compile()\fP in UTF-8 mode -.sp -PCRE must be built with UTF support in order to use PCRE_UTF8/16/32 and -PCRE_NO_UTF8/16/32_CHECK, and with UCP support if PCRE_UCP is used. -.P -The yield of the function is a pointer to a private data structure that -contains the compiled pattern, or NULL if an error was detected. Note that -compiling regular expressions with one version of PCRE for use with a different -version is not guaranteed to work and may cause crashes. -.P -There is a complete description of the PCRE native API in the -.\" HREF -\fBpcreapi\fP -.\" -page and a description of the POSIX API in the -.\" HREF -\fBpcreposix\fP -.\" -page. diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre_config.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre_config.3 deleted file mode 100644 index d14ffdad..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre_config.3 +++ /dev/null @@ -1,79 +0,0 @@ -.TH PCRE_CONFIG 3 "20 April 2014" "PCRE 8.36" -.SH NAME -PCRE - Perl-compatible regular expressions -.SH SYNOPSIS -.rs -.sp -.B #include -.PP -.SM -.B int pcre_config(int \fIwhat\fP, void *\fIwhere\fP); -.PP -.B int pcre16_config(int \fIwhat\fP, void *\fIwhere\fP); -.PP -.B int pcre32_config(int \fIwhat\fP, void *\fIwhere\fP); -. -.SH DESCRIPTION -.rs -.sp -This function makes it possible for a client program to find out which optional -features are available in the version of the PCRE library it is using. The -arguments are as follows: -.sp - \fIwhat\fP A code specifying what information is required - \fIwhere\fP Points to where to put the data -.sp -The \fIwhere\fP argument must point to an integer variable, except for -PCRE_CONFIG_MATCH_LIMIT, PCRE_CONFIG_MATCH_LIMIT_RECURSION, and -PCRE_CONFIG_PARENS_LIMIT, when it must point to an unsigned long integer, -and for PCRE_CONFIG_JITTARGET, when it must point to a const char*. -The available codes are: -.sp - PCRE_CONFIG_JIT Availability of just-in-time compiler - support (1=yes 0=no) - PCRE_CONFIG_JITTARGET String containing information about the - target architecture for the JIT compiler, - or NULL if there is no JIT support - PCRE_CONFIG_LINK_SIZE Internal link size: 2, 3, or 4 - PCRE_CONFIG_PARENS_LIMIT Parentheses nesting limit - PCRE_CONFIG_MATCH_LIMIT Internal resource limit - PCRE_CONFIG_MATCH_LIMIT_RECURSION - Internal recursion depth limit - PCRE_CONFIG_NEWLINE Value of the default newline sequence: - 13 (0x000d) for CR - 10 (0x000a) for LF - 3338 (0x0d0a) for CRLF - -2 for ANYCRLF - -1 for ANY - PCRE_CONFIG_BSR Indicates what \eR matches by default: - 0 all Unicode line endings - 1 CR, LF, or CRLF only - PCRE_CONFIG_POSIX_MALLOC_THRESHOLD - Threshold of return slots, above which - \fBmalloc()\fP is used by the POSIX API - PCRE_CONFIG_STACKRECURSE Recursion implementation (1=stack 0=heap) - PCRE_CONFIG_UTF16 Availability of UTF-16 support (1=yes - 0=no); option for \fBpcre16_config()\fP - PCRE_CONFIG_UTF32 Availability of UTF-32 support (1=yes - 0=no); option for \fBpcre32_config()\fP - PCRE_CONFIG_UTF8 Availability of UTF-8 support (1=yes 0=no); - option for \fBpcre_config()\fP - PCRE_CONFIG_UNICODE_PROPERTIES - Availability of Unicode property support - (1=yes 0=no) -.sp -The function yields 0 on success or PCRE_ERROR_BADOPTION otherwise. That error -is also given if PCRE_CONFIG_UTF16 or PCRE_CONFIG_UTF32 is passed to -\fBpcre_config()\fP, if PCRE_CONFIG_UTF8 or PCRE_CONFIG_UTF32 is passed to -\fBpcre16_config()\fP, or if PCRE_CONFIG_UTF8 or PCRE_CONFIG_UTF16 is passed to -\fBpcre32_config()\fP. -.P -There is a complete description of the PCRE native API in the -.\" HREF -\fBpcreapi\fP -.\" -page and a description of the POSIX API in the -.\" HREF -\fBpcreposix\fP -.\" -page. diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre_copy_named_substring.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre_copy_named_substring.3 deleted file mode 100644 index 52582aec..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre_copy_named_substring.3 +++ /dev/null @@ -1,51 +0,0 @@ -.TH PCRE_COPY_NAMED_SUBSTRING 3 "24 June 2012" "PCRE 8.30" -.SH NAME -PCRE - Perl-compatible regular expressions -.SH SYNOPSIS -.rs -.sp -.B #include -.PP -.nf -.B int pcre_copy_named_substring(const pcre *\fIcode\fP, -.B " const char *\fIsubject\fP, int *\fIovector\fP," -.B " int \fIstringcount\fP, const char *\fIstringname\fP," -.B " char *\fIbuffer\fP, int \fIbuffersize\fP);" -.sp -.B int pcre16_copy_named_substring(const pcre16 *\fIcode\fP, -.B " PCRE_SPTR16 \fIsubject\fP, int *\fIovector\fP," -.B " int \fIstringcount\fP, PCRE_SPTR16 \fIstringname\fP," -.B " PCRE_UCHAR16 *\fIbuffer\fP, int \fIbuffersize\fP);" -.sp -.B int pcre32_copy_named_substring(const pcre32 *\fIcode\fP, -.B " PCRE_SPTR32 \fIsubject\fP, int *\fIovector\fP," -.B " int \fIstringcount\fP, PCRE_SPTR32 \fIstringname\fP," -.B " PCRE_UCHAR32 *\fIbuffer\fP, int \fIbuffersize\fP);" -.fi -. -.SH DESCRIPTION -.rs -.sp -This is a convenience function for extracting a captured substring, identified -by name, into a given buffer. The arguments are: -.sp - \fIcode\fP Pattern that was successfully matched - \fIsubject\fP Subject that has been successfully matched - \fIovector\fP Offset vector that \fBpcre[16|32]_exec()\fP used - \fIstringcount\fP Value returned by \fBpcre[16|32]_exec()\fP - \fIstringname\fP Name of the required substring - \fIbuffer\fP Buffer to receive the string - \fIbuffersize\fP Size of buffer -.sp -The yield is the length of the substring, PCRE_ERROR_NOMEMORY if the buffer was -too small, or PCRE_ERROR_NOSUBSTRING if the string name is invalid. -.P -There is a complete description of the PCRE native API in the -.\" HREF -\fBpcreapi\fP -.\" -page and a description of the POSIX API in the -.\" HREF -\fBpcreposix\fP -.\" -page. diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre_copy_substring.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre_copy_substring.3 deleted file mode 100644 index 83af6e80..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre_copy_substring.3 +++ /dev/null @@ -1,47 +0,0 @@ -.TH PCRE_COPY_SUBSTRING 3 "24 June 2012" "PCRE 8.30" -.SH NAME -PCRE - Perl-compatible regular expressions -.SH SYNOPSIS -.rs -.sp -.B #include -.PP -.nf -.B int pcre_copy_substring(const char *\fIsubject\fP, int *\fIovector\fP, -.B " int \fIstringcount\fP, int \fIstringnumber\fP, char *\fIbuffer\fP," -.B " int \fIbuffersize\fP);" -.sp -.B int pcre16_copy_substring(PCRE_SPTR16 \fIsubject\fP, int *\fIovector\fP, -.B " int \fIstringcount\fP, int \fIstringnumber\fP, PCRE_UCHAR16 *\fIbuffer\fP," -.B " int \fIbuffersize\fP);" -.sp -.B int pcre32_copy_substring(PCRE_SPTR32 \fIsubject\fP, int *\fIovector\fP, -.B " int \fIstringcount\fP, int \fIstringnumber\fP, PCRE_UCHAR32 *\fIbuffer\fP," -.B " int \fIbuffersize\fP);" -.fi -. -.SH DESCRIPTION -.rs -.sp -This is a convenience function for extracting a captured substring into a given -buffer. The arguments are: -.sp - \fIsubject\fP Subject that has been successfully matched - \fIovector\fP Offset vector that \fBpcre[16|32]_exec()\fP used - \fIstringcount\fP Value returned by \fBpcre[16|32]_exec()\fP - \fIstringnumber\fP Number of the required substring - \fIbuffer\fP Buffer to receive the string - \fIbuffersize\fP Size of buffer -.sp -The yield is the length of the string, PCRE_ERROR_NOMEMORY if the buffer was -too small, or PCRE_ERROR_NOSUBSTRING if the string number is invalid. -.P -There is a complete description of the PCRE native API in the -.\" HREF -\fBpcreapi\fP -.\" -page and a description of the POSIX API in the -.\" HREF -\fBpcreposix\fP -.\" -page. diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre_dfa_exec.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre_dfa_exec.3 deleted file mode 100644 index 39c2e836..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre_dfa_exec.3 +++ /dev/null @@ -1,118 +0,0 @@ -.TH PCRE_DFA_EXEC 3 "12 May 2013" "PCRE 8.33" -.SH NAME -PCRE - Perl-compatible regular expressions -.SH SYNOPSIS -.rs -.sp -.B #include -.PP -.nf -.B int pcre_dfa_exec(const pcre *\fIcode\fP, "const pcre_extra *\fIextra\fP," -.B " const char *\fIsubject\fP, int \fIlength\fP, int \fIstartoffset\fP," -.B " int \fIoptions\fP, int *\fIovector\fP, int \fIovecsize\fP," -.B " int *\fIworkspace\fP, int \fIwscount\fP);" -.sp -.B int pcre16_dfa_exec(const pcre16 *\fIcode\fP, "const pcre16_extra *\fIextra\fP," -.B " PCRE_SPTR16 \fIsubject\fP, int \fIlength\fP, int \fIstartoffset\fP," -.B " int \fIoptions\fP, int *\fIovector\fP, int \fIovecsize\fP," -.B " int *\fIworkspace\fP, int \fIwscount\fP);" -.sp -.B int pcre32_dfa_exec(const pcre32 *\fIcode\fP, "const pcre32_extra *\fIextra\fP," -.B " PCRE_SPTR32 \fIsubject\fP, int \fIlength\fP, int \fIstartoffset\fP," -.B " int \fIoptions\fP, int *\fIovector\fP, int \fIovecsize\fP," -.B " int *\fIworkspace\fP, int \fIwscount\fP);" -.fi -. -.SH DESCRIPTION -.rs -.sp -This function matches a compiled regular expression against a given subject -string, using an alternative matching algorithm that scans the subject string -just once (\fInot\fP Perl-compatible). Note that the main, Perl-compatible, -matching function is \fBpcre[16|32]_exec()\fP. The arguments for this function -are: -.sp - \fIcode\fP Points to the compiled pattern - \fIextra\fP Points to an associated \fBpcre[16|32]_extra\fP structure, - or is NULL - \fIsubject\fP Points to the subject string - \fIlength\fP Length of the subject string - \fIstartoffset\fP Offset in the subject at which to start matching - \fIoptions\fP Option bits - \fIovector\fP Points to a vector of ints for result offsets - \fIovecsize\fP Number of elements in the vector - \fIworkspace\fP Points to a vector of ints used as working space - \fIwscount\fP Number of elements in the vector -.sp -The units for \fIlength\fP and \fIstartoffset\fP are bytes for -\fBpcre_exec()\fP, 16-bit data items for \fBpcre16_exec()\fP, and 32-bit items -for \fBpcre32_exec()\fP. The options are: -.sp - PCRE_ANCHORED Match only at the first position - PCRE_BSR_ANYCRLF \eR matches only CR, LF, or CRLF - PCRE_BSR_UNICODE \eR matches all Unicode line endings - PCRE_NEWLINE_ANY Recognize any Unicode newline sequence - PCRE_NEWLINE_ANYCRLF Recognize CR, LF, & CRLF as newline sequences - PCRE_NEWLINE_CR Recognize CR as the only newline sequence - PCRE_NEWLINE_CRLF Recognize CRLF as the only newline sequence - PCRE_NEWLINE_LF Recognize LF as the only newline sequence - PCRE_NOTBOL Subject is not the beginning of a line - PCRE_NOTEOL Subject is not the end of a line - PCRE_NOTEMPTY An empty string is not a valid match - PCRE_NOTEMPTY_ATSTART An empty string at the start of the subject - is not a valid match - PCRE_NO_START_OPTIMIZE Do not do "start-match" optimizations - PCRE_NO_UTF16_CHECK Do not check the subject for UTF-16 - validity (only relevant if PCRE_UTF16 - was set at compile time) - PCRE_NO_UTF32_CHECK Do not check the subject for UTF-32 - validity (only relevant if PCRE_UTF32 - was set at compile time) - PCRE_NO_UTF8_CHECK Do not check the subject for UTF-8 - validity (only relevant if PCRE_UTF8 - was set at compile time) - PCRE_PARTIAL ) Return PCRE_ERROR_PARTIAL for a partial - PCRE_PARTIAL_SOFT ) match if no full matches are found - PCRE_PARTIAL_HARD Return PCRE_ERROR_PARTIAL for a partial match - even if there is a full match as well - PCRE_DFA_SHORTEST Return only the shortest match - PCRE_DFA_RESTART Restart after a partial match -.sp -There are restrictions on what may appear in a pattern when using this matching -function. Details are given in the -.\" HREF -\fBpcrematching\fP -.\" -documentation. For details of partial matching, see the -.\" HREF -\fBpcrepartial\fP -.\" -page. -.P -A \fBpcre[16|32]_extra\fP structure contains the following fields: -.sp - \fIflags\fP Bits indicating which fields are set - \fIstudy_data\fP Opaque data from \fBpcre[16|32]_study()\fP - \fImatch_limit\fP Limit on internal resource use - \fImatch_limit_recursion\fP Limit on internal recursion depth - \fIcallout_data\fP Opaque data passed back to callouts - \fItables\fP Points to character tables or is NULL - \fImark\fP For passing back a *MARK pointer - \fIexecutable_jit\fP Opaque data from JIT compilation -.sp -The flag bits are PCRE_EXTRA_STUDY_DATA, PCRE_EXTRA_MATCH_LIMIT, -PCRE_EXTRA_MATCH_LIMIT_RECURSION, PCRE_EXTRA_CALLOUT_DATA, -PCRE_EXTRA_TABLES, PCRE_EXTRA_MARK and PCRE_EXTRA_EXECUTABLE_JIT. For this -matching function, the \fImatch_limit\fP and \fImatch_limit_recursion\fP fields -are not used, and must not be set. The PCRE_EXTRA_EXECUTABLE_JIT flag and -the corresponding variable are ignored. -.P -There is a complete description of the PCRE native API in the -.\" HREF -\fBpcreapi\fP -.\" -page and a description of the POSIX API in the -.\" HREF -\fBpcreposix\fP -.\" -page. diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre_exec.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre_exec.3 deleted file mode 100644 index 4686bd6d..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre_exec.3 +++ /dev/null @@ -1,99 +0,0 @@ -.TH PCRE_EXEC 3 "12 May 2013" "PCRE 8.33" -.SH NAME -PCRE - Perl-compatible regular expressions -.SH SYNOPSIS -.rs -.sp -.B #include -.PP -.nf -.B int pcre_exec(const pcre *\fIcode\fP, "const pcre_extra *\fIextra\fP," -.B " const char *\fIsubject\fP, int \fIlength\fP, int \fIstartoffset\fP," -.B " int \fIoptions\fP, int *\fIovector\fP, int \fIovecsize\fP);" -.sp -.B int pcre16_exec(const pcre16 *\fIcode\fP, "const pcre16_extra *\fIextra\fP," -.B " PCRE_SPTR16 \fIsubject\fP, int \fIlength\fP, int \fIstartoffset\fP," -.B " int \fIoptions\fP, int *\fIovector\fP, int \fIovecsize\fP);" -.sp -.B int pcre32_exec(const pcre32 *\fIcode\fP, "const pcre32_extra *\fIextra\fP," -.B " PCRE_SPTR32 \fIsubject\fP, int \fIlength\fP, int \fIstartoffset\fP," -.B " int \fIoptions\fP, int *\fIovector\fP, int \fIovecsize\fP);" -.fi -. -.SH DESCRIPTION -.rs -.sp -This function matches a compiled regular expression against a given subject -string, using a matching algorithm that is similar to Perl's. It returns -offsets to captured substrings. Its arguments are: -.sp - \fIcode\fP Points to the compiled pattern - \fIextra\fP Points to an associated \fBpcre[16|32]_extra\fP structure, - or is NULL - \fIsubject\fP Points to the subject string - \fIlength\fP Length of the subject string - \fIstartoffset\fP Offset in the subject at which to start matching - \fIoptions\fP Option bits - \fIovector\fP Points to a vector of ints for result offsets - \fIovecsize\fP Number of elements in the vector (a multiple of 3) -.sp -The units for \fIlength\fP and \fIstartoffset\fP are bytes for -\fBpcre_exec()\fP, 16-bit data items for \fBpcre16_exec()\fP, and 32-bit items -for \fBpcre32_exec()\fP. The options are: -.sp - PCRE_ANCHORED Match only at the first position - PCRE_BSR_ANYCRLF \eR matches only CR, LF, or CRLF - PCRE_BSR_UNICODE \eR matches all Unicode line endings - PCRE_NEWLINE_ANY Recognize any Unicode newline sequence - PCRE_NEWLINE_ANYCRLF Recognize CR, LF, & CRLF as newline sequences - PCRE_NEWLINE_CR Recognize CR as the only newline sequence - PCRE_NEWLINE_CRLF Recognize CRLF as the only newline sequence - PCRE_NEWLINE_LF Recognize LF as the only newline sequence - PCRE_NOTBOL Subject string is not the beginning of a line - PCRE_NOTEOL Subject string is not the end of a line - PCRE_NOTEMPTY An empty string is not a valid match - PCRE_NOTEMPTY_ATSTART An empty string at the start of the subject - is not a valid match - PCRE_NO_START_OPTIMIZE Do not do "start-match" optimizations - PCRE_NO_UTF16_CHECK Do not check the subject for UTF-16 - validity (only relevant if PCRE_UTF16 - was set at compile time) - PCRE_NO_UTF32_CHECK Do not check the subject for UTF-32 - validity (only relevant if PCRE_UTF32 - was set at compile time) - PCRE_NO_UTF8_CHECK Do not check the subject for UTF-8 - validity (only relevant if PCRE_UTF8 - was set at compile time) - PCRE_PARTIAL ) Return PCRE_ERROR_PARTIAL for a partial - PCRE_PARTIAL_SOFT ) match if no full matches are found - PCRE_PARTIAL_HARD Return PCRE_ERROR_PARTIAL for a partial match - if that is found before a full match -.sp -For details of partial matching, see the -.\" HREF -\fBpcrepartial\fP -.\" -page. A \fBpcre_extra\fP structure contains the following fields: -.sp - \fIflags\fP Bits indicating which fields are set - \fIstudy_data\fP Opaque data from \fBpcre[16|32]_study()\fP - \fImatch_limit\fP Limit on internal resource use - \fImatch_limit_recursion\fP Limit on internal recursion depth - \fIcallout_data\fP Opaque data passed back to callouts - \fItables\fP Points to character tables or is NULL - \fImark\fP For passing back a *MARK pointer - \fIexecutable_jit\fP Opaque data from JIT compilation -.sp -The flag bits are PCRE_EXTRA_STUDY_DATA, PCRE_EXTRA_MATCH_LIMIT, -PCRE_EXTRA_MATCH_LIMIT_RECURSION, PCRE_EXTRA_CALLOUT_DATA, -PCRE_EXTRA_TABLES, PCRE_EXTRA_MARK and PCRE_EXTRA_EXECUTABLE_JIT. -.P -There is a complete description of the PCRE native API in the -.\" HREF -\fBpcreapi\fP -.\" -page and a description of the POSIX API in the -.\" HREF -\fBpcreposix\fP -.\" -page. diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre_free_study.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre_free_study.3 deleted file mode 100644 index 8826b735..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre_free_study.3 +++ /dev/null @@ -1,31 +0,0 @@ -.TH PCRE_FREE_STUDY 3 "24 June 2012" "PCRE 8.30" -.SH NAME -PCRE - Perl-compatible regular expressions -.SH SYNOPSIS -.rs -.sp -.B #include -.PP -.SM -.B void pcre_free_study(pcre_extra *\fIextra\fP); -.PP -.B void pcre16_free_study(pcre16_extra *\fIextra\fP); -.PP -.B void pcre32_free_study(pcre32_extra *\fIextra\fP); -. -.SH DESCRIPTION -.rs -.sp -This function is used to free the memory used for the data generated by a call -to \fBpcre[16|32]_study()\fP when it is no longer needed. The argument must be the -result of such a call. -.P -There is a complete description of the PCRE native API in the -.\" HREF -\fBpcreapi\fP -.\" -page and a description of the POSIX API in the -.\" HREF -\fBpcreposix\fP -.\" -page. diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre_free_substring.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre_free_substring.3 deleted file mode 100644 index 88c04019..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre_free_substring.3 +++ /dev/null @@ -1,31 +0,0 @@ -.TH PCRE_FREE_SUBSTRING 3 "24 June 2012" "PCRE 8.30" -.SH NAME -PCRE - Perl-compatible regular expressions -.SH SYNOPSIS -.rs -.sp -.B #include -.PP -.SM -.B void pcre_free_substring(const char *\fIstringptr\fP); -.PP -.B void pcre16_free_substring(PCRE_SPTR16 \fIstringptr\fP); -.PP -.B void pcre32_free_substring(PCRE_SPTR32 \fIstringptr\fP); -. -.SH DESCRIPTION -.rs -.sp -This is a convenience function for freeing the store obtained by a previous -call to \fBpcre[16|32]_get_substring()\fP or \fBpcre[16|32]_get_named_substring()\fP. -Its only argument is a pointer to the string. -.P -There is a complete description of the PCRE native API in the -.\" HREF -\fBpcreapi\fP -.\" -page and a description of the POSIX API in the -.\" HREF -\fBpcreposix\fP -.\" -page. diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre_free_substring_list.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre_free_substring_list.3 deleted file mode 100644 index 248b4bd0..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre_free_substring_list.3 +++ /dev/null @@ -1,31 +0,0 @@ -.TH PCRE_FREE_SUBSTRING_LIST 3 "24 June 2012" "PCRE 8.30" -.SH NAME -PCRE - Perl-compatible regular expressions -.SH SYNOPSIS -.rs -.sp -.B #include -.PP -.SM -.B void pcre_free_substring_list(const char **\fIstringptr\fP); -.PP -.B void pcre16_free_substring_list(PCRE_SPTR16 *\fIstringptr\fP); -.PP -.B void pcre32_free_substring_list(PCRE_SPTR32 *\fIstringptr\fP); -. -.SH DESCRIPTION -.rs -.sp -This is a convenience function for freeing the store obtained by a previous -call to \fBpcre[16|32]_get_substring_list()\fP. Its only argument is a pointer to -the list of string pointers. -.P -There is a complete description of the PCRE native API in the -.\" HREF -\fBpcreapi\fP -.\" -page and a description of the POSIX API in the -.\" HREF -\fBpcreposix\fP -.\" -page. diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre_fullinfo.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre_fullinfo.3 deleted file mode 100644 index c9b2c656..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre_fullinfo.3 +++ /dev/null @@ -1,103 +0,0 @@ -.TH PCRE_FULLINFO 3 "21 April 2014" "PCRE 8.36" -.SH NAME -PCRE - Perl-compatible regular expressions -.SH SYNOPSIS -.rs -.sp -.B #include -.PP -.nf -.B int pcre_fullinfo(const pcre *\fIcode\fP, "const pcre_extra *\fIextra\fP," -.B " int \fIwhat\fP, void *\fIwhere\fP);" -.sp -.B int pcre16_fullinfo(const pcre16 *\fIcode\fP, "const pcre16_extra *\fIextra\fP," -.B " int \fIwhat\fP, void *\fIwhere\fP);" -.sp -.B int pcre32_fullinfo(const pcre32 *\fIcode\fP, "const pcre32_extra *\fIextra\fP," -.B " int \fIwhat\fP, void *\fIwhere\fP);" -.fi -. -.SH DESCRIPTION -.rs -.sp -This function returns information about a compiled pattern. Its arguments are: -.sp - \fIcode\fP Compiled regular expression - \fIextra\fP Result of \fBpcre[16|32]_study()\fP or NULL - \fIwhat\fP What information is required - \fIwhere\fP Where to put the information -.sp -The following information is available: -.sp - PCRE_INFO_BACKREFMAX Number of highest back reference - PCRE_INFO_CAPTURECOUNT Number of capturing subpatterns - PCRE_INFO_DEFAULT_TABLES Pointer to default tables - PCRE_INFO_FIRSTBYTE Fixed first data unit for a match, or - -1 for start of string - or after newline, or - -2 otherwise - PCRE_INFO_FIRSTTABLE Table of first data units (after studying) - PCRE_INFO_HASCRORLF Return 1 if explicit CR or LF matches exist - PCRE_INFO_JCHANGED Return 1 if (?J) or (?-J) was used - PCRE_INFO_JIT Return 1 after successful JIT compilation - PCRE_INFO_JITSIZE Size of JIT compiled code - PCRE_INFO_LASTLITERAL Literal last data unit required - PCRE_INFO_MINLENGTH Lower bound length of matching strings - PCRE_INFO_MATCHEMPTY Return 1 if the pattern can match an empty string, - 0 otherwise - PCRE_INFO_MATCHLIMIT Match limit if set, otherwise PCRE_RROR_UNSET - PCRE_INFO_MAXLOOKBEHIND Length (in characters) of the longest lookbehind assertion - PCRE_INFO_NAMECOUNT Number of named subpatterns - PCRE_INFO_NAMEENTRYSIZE Size of name table entry - PCRE_INFO_NAMETABLE Pointer to name table - PCRE_INFO_OKPARTIAL Return 1 if partial matching can be tried - (always returns 1 after release 8.00) - PCRE_INFO_OPTIONS Option bits used for compilation - PCRE_INFO_SIZE Size of compiled pattern - PCRE_INFO_STUDYSIZE Size of study data - PCRE_INFO_FIRSTCHARACTER Fixed first data unit for a match - PCRE_INFO_FIRSTCHARACTERFLAGS Returns - 1 if there is a first data character set, which can - then be retrieved using PCRE_INFO_FIRSTCHARACTER, - 2 if the first character is at the start of the data - string or after a newline, and - 0 otherwise - PCRE_INFO_RECURSIONLIMIT Recursion limit if set, otherwise PCRE_ERROR_UNSET - PCRE_INFO_REQUIREDCHAR Literal last data unit required - PCRE_INFO_REQUIREDCHARFLAGS Returns 1 if the last data character is set (which can then - be retrieved using PCRE_INFO_REQUIREDCHAR); 0 otherwise -.sp -The \fIwhere\fP argument must point to an integer variable, except for the -following \fIwhat\fP values: -.sp - PCRE_INFO_DEFAULT_TABLES const uint8_t * - PCRE_INFO_FIRSTCHARACTER uint32_t - PCRE_INFO_FIRSTTABLE const uint8_t * - PCRE_INFO_JITSIZE size_t - PCRE_INFO_MATCHLIMIT uint32_t - PCRE_INFO_NAMETABLE PCRE_SPTR16 (16-bit library) - PCRE_INFO_NAMETABLE PCRE_SPTR32 (32-bit library) - PCRE_INFO_NAMETABLE const unsigned char * (8-bit library) - PCRE_INFO_OPTIONS unsigned long int - PCRE_INFO_SIZE size_t - PCRE_INFO_STUDYSIZE size_t - PCRE_INFO_RECURSIONLIMIT uint32_t - PCRE_INFO_REQUIREDCHAR uint32_t -.sp -The yield of the function is zero on success or: -.sp - PCRE_ERROR_NULL the argument \fIcode\fP was NULL - the argument \fIwhere\fP was NULL - PCRE_ERROR_BADMAGIC the "magic number" was not found - PCRE_ERROR_BADOPTION the value of \fIwhat\fP was invalid - PCRE_ERROR_UNSET the option was not set -.P -There is a complete description of the PCRE native API in the -.\" HREF -\fBpcreapi\fP -.\" -page and a description of the POSIX API in the -.\" HREF -\fBpcreposix\fP -.\" -page. diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre_get_named_substring.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre_get_named_substring.3 deleted file mode 100644 index 84d4ee7d..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre_get_named_substring.3 +++ /dev/null @@ -1,54 +0,0 @@ -.TH PCRE_GET_NAMED_SUBSTRING 3 "24 June 2012" "PCRE 8.30" -.SH NAME -PCRE - Perl-compatible regular expressions -.SH SYNOPSIS -.rs -.sp -.B #include -.PP -.nf -.B int pcre_get_named_substring(const pcre *\fIcode\fP, -.B " const char *\fIsubject\fP, int *\fIovector\fP," -.B " int \fIstringcount\fP, const char *\fIstringname\fP," -.B " const char **\fIstringptr\fP);" -.sp -.B int pcre16_get_named_substring(const pcre16 *\fIcode\fP, -.B " PCRE_SPTR16 \fIsubject\fP, int *\fIovector\fP," -.B " int \fIstringcount\fP, PCRE_SPTR16 \fIstringname\fP," -.B " PCRE_SPTR16 *\fIstringptr\fP);" -.sp -.B int pcre32_get_named_substring(const pcre32 *\fIcode\fP, -.B " PCRE_SPTR32 \fIsubject\fP, int *\fIovector\fP," -.B " int \fIstringcount\fP, PCRE_SPTR32 \fIstringname\fP," -.B " PCRE_SPTR32 *\fIstringptr\fP);" -.fi -. -.SH DESCRIPTION -.rs -.sp -This is a convenience function for extracting a captured substring by name. The -arguments are: -.sp - \fIcode\fP Compiled pattern - \fIsubject\fP Subject that has been successfully matched - \fIovector\fP Offset vector that \fBpcre[16|32]_exec()\fP used - \fIstringcount\fP Value returned by \fBpcre[16|32]_exec()\fP - \fIstringname\fP Name of the required substring - \fIstringptr\fP Where to put the string pointer -.sp -The memory in which the substring is placed is obtained by calling -\fBpcre[16|32]_malloc()\fP. The convenience function -\fBpcre[16|32]_free_substring()\fP can be used to free it when it is no longer -needed. The yield of the function is the length of the extracted substring, -PCRE_ERROR_NOMEMORY if sufficient memory could not be obtained, or -PCRE_ERROR_NOSUBSTRING if the string name is invalid. -.P -There is a complete description of the PCRE native API in the -.\" HREF -\fBpcreapi\fP -.\" -page and a description of the POSIX API in the -.\" HREF -\fBpcreposix\fP -.\" -page. diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre_get_stringnumber.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre_get_stringnumber.3 deleted file mode 100644 index 9fc5291d..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre_get_stringnumber.3 +++ /dev/null @@ -1,43 +0,0 @@ -.TH PCRE_GET_STRINGNUMBER 3 "24 June 2012" "PCRE 8.30" -.SH NAME -PCRE - Perl-compatible regular expressions -.SH SYNOPSIS -.rs -.sp -.B #include -.PP -.nf -.B int pcre_get_stringnumber(const pcre *\fIcode\fP, -.B " const char *\fIname\fP);" -.sp -.B int pcre16_get_stringnumber(const pcre16 *\fIcode\fP, -.B " PCRE_SPTR16 \fIname\fP);" -.sp -.B int pcre32_get_stringnumber(const pcre32 *\fIcode\fP, -.B " PCRE_SPTR32 \fIname\fP);" -.fi -. -.SH DESCRIPTION -.rs -.sp -This convenience function finds the number of a named substring capturing -parenthesis in a compiled pattern. Its arguments are: -.sp - \fIcode\fP Compiled regular expression - \fIname\fP Name whose number is required -.sp -The yield of the function is the number of the parenthesis if the name is -found, or PCRE_ERROR_NOSUBSTRING otherwise. When duplicate names are allowed -(PCRE_DUPNAMES is set), it is not defined which of the numbers is returned by -\fBpcre[16|32]_get_stringnumber()\fP. You can obtain the complete list by calling -\fBpcre[16|32]_get_stringtable_entries()\fP. -.P -There is a complete description of the PCRE native API in the -.\" HREF -\fBpcreapi\fP -.\" -page and a description of the POSIX API in the -.\" HREF -\fBpcreposix\fP -.\" -page. diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre_get_stringtable_entries.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre_get_stringtable_entries.3 deleted file mode 100644 index 5c58c90c..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre_get_stringtable_entries.3 +++ /dev/null @@ -1,46 +0,0 @@ -.TH PCRE_GET_STRINGTABLE_ENTRIES 3 "24 June 2012" "PCRE 8.30" -.SH NAME -PCRE - Perl-compatible regular expressions -.SH SYNOPSIS -.rs -.sp -.B #include -.PP -.nf -.B int pcre_get_stringtable_entries(const pcre *\fIcode\fP, -.B " const char *\fIname\fP, char **\fIfirst\fP, char **\fIlast\fP);" -.sp -.B int pcre16_get_stringtable_entries(const pcre16 *\fIcode\fP, -.B " PCRE_SPTR16 \fIname\fP, PCRE_UCHAR16 **\fIfirst\fP, PCRE_UCHAR16 **\fIlast\fP);" -.sp -.B int pcre32_get_stringtable_entries(const pcre32 *\fIcode\fP, -.B " PCRE_SPTR32 \fIname\fP, PCRE_UCHAR32 **\fIfirst\fP, PCRE_UCHAR32 **\fIlast\fP);" -.fi -. -.SH DESCRIPTION -.rs -.sp -This convenience function finds, for a compiled pattern, the first and last -entries for a given name in the table that translates capturing parenthesis -names into numbers. When names are required to be unique (PCRE_DUPNAMES is -\fInot\fP set), it is usually easier to use \fBpcre[16|32]_get_stringnumber()\fP -instead. -.sp - \fIcode\fP Compiled regular expression - \fIname\fP Name whose entries required - \fIfirst\fP Where to return a pointer to the first entry - \fIlast\fP Where to return a pointer to the last entry -.sp -The yield of the function is the length of each entry, or -PCRE_ERROR_NOSUBSTRING if none are found. -.P -There is a complete description of the PCRE native API, including the format of -the table entries, in the -.\" HREF -\fBpcreapi\fP -.\" -page, and a description of the POSIX API in the -.\" HREF -\fBpcreposix\fP -.\" -page. diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre_get_substring.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre_get_substring.3 deleted file mode 100644 index 1e62b2c0..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre_get_substring.3 +++ /dev/null @@ -1,50 +0,0 @@ -.TH PCRE_GET_SUBSTRING 3 "24 June 2012" "PCRE 8.30" -.SH NAME -PCRE - Perl-compatible regular expressions -.SH SYNOPSIS -.rs -.sp -.B #include -.PP -.nf -.B int pcre_get_substring(const char *\fIsubject\fP, int *\fIovector\fP, -.B " int \fIstringcount\fP, int \fIstringnumber\fP," -.B " const char **\fIstringptr\fP);" -.sp -.B int pcre16_get_substring(PCRE_SPTR16 \fIsubject\fP, int *\fIovector\fP, -.B " int \fIstringcount\fP, int \fIstringnumber\fP," -.B " PCRE_SPTR16 *\fIstringptr\fP);" -.sp -.B int pcre32_get_substring(PCRE_SPTR32 \fIsubject\fP, int *\fIovector\fP, -.B " int \fIstringcount\fP, int \fIstringnumber\fP," -.B " PCRE_SPTR32 *\fIstringptr\fP);" -.fi -. -.SH DESCRIPTION -.rs -.sp -This is a convenience function for extracting a captured substring. The -arguments are: -.sp - \fIsubject\fP Subject that has been successfully matched - \fIovector\fP Offset vector that \fBpcre[16|32]_exec()\fP used - \fIstringcount\fP Value returned by \fBpcre[16|32]_exec()\fP - \fIstringnumber\fP Number of the required substring - \fIstringptr\fP Where to put the string pointer -.sp -The memory in which the substring is placed is obtained by calling -\fBpcre[16|32]_malloc()\fP. The convenience function -\fBpcre[16|32]_free_substring()\fP can be used to free it when it is no longer -needed. The yield of the function is the length of the substring, -PCRE_ERROR_NOMEMORY if sufficient memory could not be obtained, or -PCRE_ERROR_NOSUBSTRING if the string number is invalid. -.P -There is a complete description of the PCRE native API in the -.\" HREF -\fBpcreapi\fP -.\" -page and a description of the POSIX API in the -.\" HREF -\fBpcreposix\fP -.\" -page. diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre_get_substring_list.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre_get_substring_list.3 deleted file mode 100644 index 511a4a39..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre_get_substring_list.3 +++ /dev/null @@ -1,47 +0,0 @@ -.TH PCRE_GET_SUBSTRING_LIST 3 "24 June 2012" "PCRE 8.30" -.SH NAME -PCRE - Perl-compatible regular expressions -.SH SYNOPSIS -.rs -.sp -.B #include -.PP -.nf -.B int pcre_get_substring_list(const char *\fIsubject\fP, -.B " int *\fIovector\fP, int \fIstringcount\fP, const char ***\fIlistptr\fP);" -.sp -.B int pcre16_get_substring_list(PCRE_SPTR16 \fIsubject\fP, -.B " int *\fIovector\fP, int \fIstringcount\fP, PCRE_SPTR16 **\fIlistptr\fP);" -.sp -.B int pcre32_get_substring_list(PCRE_SPTR32 \fIsubject\fP, -.B " int *\fIovector\fP, int \fIstringcount\fP, PCRE_SPTR32 **\fIlistptr\fP);" -.fi -. -.SH DESCRIPTION -.rs -.sp -This is a convenience function for extracting a list of all the captured -substrings. The arguments are: -.sp - \fIsubject\fP Subject that has been successfully matched - \fIovector\fP Offset vector that \fBpcre[16|32]_exec\fP used - \fIstringcount\fP Value returned by \fBpcre[16|32]_exec\fP - \fIlistptr\fP Where to put a pointer to the list -.sp -The memory in which the substrings and the list are placed is obtained by -calling \fBpcre[16|32]_malloc()\fP. The convenience function -\fBpcre[16|32]_free_substring_list()\fP can be used to free it when it is no -longer needed. A pointer to a list of pointers is put in the variable whose -address is in \fIlistptr\fP. The list is terminated by a NULL pointer. The -yield of the function is zero on success or PCRE_ERROR_NOMEMORY if sufficient -memory could not be obtained. -.P -There is a complete description of the PCRE native API in the -.\" HREF -\fBpcreapi\fP -.\" -page and a description of the POSIX API in the -.\" HREF -\fBpcreposix\fP -.\" -page. diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre_jit_exec.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre_jit_exec.3 deleted file mode 100644 index ba851681..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre_jit_exec.3 +++ /dev/null @@ -1,96 +0,0 @@ -.TH PCRE_EXEC 3 "31 October 2012" "PCRE 8.30" -.SH NAME -PCRE - Perl-compatible regular expressions -.SH SYNOPSIS -.rs -.sp -.B #include -.PP -.nf -.B int pcre_jit_exec(const pcre *\fIcode\fP, "const pcre_extra *\fIextra\fP," -.B " const char *\fIsubject\fP, int \fIlength\fP, int \fIstartoffset\fP," -.B " int \fIoptions\fP, int *\fIovector\fP, int \fIovecsize\fP," -.B " pcre_jit_stack *\fIjstack\fP);" -.sp -.B int pcre16_jit_exec(const pcre16 *\fIcode\fP, "const pcre16_extra *\fIextra\fP," -.B " PCRE_SPTR16 \fIsubject\fP, int \fIlength\fP, int \fIstartoffset\fP," -.B " int \fIoptions\fP, int *\fIovector\fP, int \fIovecsize\fP," -.B " pcre_jit_stack *\fIjstack\fP);" -.sp -.B int pcre32_jit_exec(const pcre32 *\fIcode\fP, "const pcre32_extra *\fIextra\fP," -.B " PCRE_SPTR32 \fIsubject\fP, int \fIlength\fP, int \fIstartoffset\fP," -.B " int \fIoptions\fP, int *\fIovector\fP, int \fIovecsize\fP," -.B " pcre_jit_stack *\fIjstack\fP);" -.fi -. -.SH DESCRIPTION -.rs -.sp -This function matches a compiled regular expression that has been successfully -studied with one of the JIT options against a given subject string, using a -matching algorithm that is similar to Perl's. It is a "fast path" interface to -JIT, and it bypasses some of the sanity checks that \fBpcre_exec()\fP applies. -It returns offsets to captured substrings. Its arguments are: -.sp - \fIcode\fP Points to the compiled pattern - \fIextra\fP Points to an associated \fBpcre[16|32]_extra\fP structure, - or is NULL - \fIsubject\fP Points to the subject string - \fIlength\fP Length of the subject string, in bytes - \fIstartoffset\fP Offset in bytes in the subject at which to - start matching - \fIoptions\fP Option bits - \fIovector\fP Points to a vector of ints for result offsets - \fIovecsize\fP Number of elements in the vector (a multiple of 3) - \fIjstack\fP Pointer to a JIT stack -.sp -The allowed options are: -.sp - PCRE_NOTBOL Subject string is not the beginning of a line - PCRE_NOTEOL Subject string is not the end of a line - PCRE_NOTEMPTY An empty string is not a valid match - PCRE_NOTEMPTY_ATSTART An empty string at the start of the subject - is not a valid match - PCRE_NO_UTF16_CHECK Do not check the subject for UTF-16 - validity (only relevant if PCRE_UTF16 - was set at compile time) - PCRE_NO_UTF32_CHECK Do not check the subject for UTF-32 - validity (only relevant if PCRE_UTF32 - was set at compile time) - PCRE_NO_UTF8_CHECK Do not check the subject for UTF-8 - validity (only relevant if PCRE_UTF8 - was set at compile time) - PCRE_PARTIAL ) Return PCRE_ERROR_PARTIAL for a partial - PCRE_PARTIAL_SOFT ) match if no full matches are found - PCRE_PARTIAL_HARD Return PCRE_ERROR_PARTIAL for a partial match - if that is found before a full match -.sp -However, the PCRE_NO_UTF[8|16|32]_CHECK options have no effect, as this check -is never applied. For details of partial matching, see the -.\" HREF -\fBpcrepartial\fP -.\" -page. A \fBpcre_extra\fP structure contains the following fields: -.sp - \fIflags\fP Bits indicating which fields are set - \fIstudy_data\fP Opaque data from \fBpcre[16|32]_study()\fP - \fImatch_limit\fP Limit on internal resource use - \fImatch_limit_recursion\fP Limit on internal recursion depth - \fIcallout_data\fP Opaque data passed back to callouts - \fItables\fP Points to character tables or is NULL - \fImark\fP For passing back a *MARK pointer - \fIexecutable_jit\fP Opaque data from JIT compilation -.sp -The flag bits are PCRE_EXTRA_STUDY_DATA, PCRE_EXTRA_MATCH_LIMIT, -PCRE_EXTRA_MATCH_LIMIT_RECURSION, PCRE_EXTRA_CALLOUT_DATA, -PCRE_EXTRA_TABLES, PCRE_EXTRA_MARK and PCRE_EXTRA_EXECUTABLE_JIT. -.P -There is a complete description of the PCRE native API in the -.\" HREF -\fBpcreapi\fP -.\" -page and a description of the JIT API in the -.\" HREF -\fBpcrejit\fP -.\" -page. diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre_jit_stack_alloc.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre_jit_stack_alloc.3 deleted file mode 100644 index 11c97a0f..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre_jit_stack_alloc.3 +++ /dev/null @@ -1,43 +0,0 @@ -.TH PCRE_JIT_STACK_ALLOC 3 "24 June 2012" "PCRE 8.30" -.SH NAME -PCRE - Perl-compatible regular expressions -.SH SYNOPSIS -.rs -.sp -.B #include -.PP -.nf -.B pcre_jit_stack *pcre_jit_stack_alloc(int \fIstartsize\fP, -.B " int \fImaxsize\fP);" -.sp -.B pcre16_jit_stack *pcre16_jit_stack_alloc(int \fIstartsize\fP, -.B " int \fImaxsize\fP);" -.sp -.B pcre32_jit_stack *pcre32_jit_stack_alloc(int \fIstartsize\fP, -.B " int \fImaxsize\fP);" -.fi -. -.SH DESCRIPTION -.rs -.sp -This function is used to create a stack for use by the code compiled by the JIT -optimization of \fBpcre[16|32]_study()\fP. The arguments are a starting size for -the stack, and a maximum size to which it is allowed to grow. The result can be -passed to the JIT run-time code by \fBpcre[16|32]_assign_jit_stack()\fP, or that -function can set up a callback for obtaining a stack. A maximum stack size of -512K to 1M should be more than enough for any pattern. For more details, see -the -.\" HREF -\fBpcrejit\fP -.\" -page. -.P -There is a complete description of the PCRE native API in the -.\" HREF -\fBpcreapi\fP -.\" -page and a description of the POSIX API in the -.\" HREF -\fBpcreposix\fP -.\" -page. diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre_jit_stack_free.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre_jit_stack_free.3 deleted file mode 100644 index 494724e8..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre_jit_stack_free.3 +++ /dev/null @@ -1,35 +0,0 @@ -.TH PCRE_JIT_STACK_FREE 3 "24 June 2012" "PCRE 8.30" -.SH NAME -PCRE - Perl-compatible regular expressions -.SH SYNOPSIS -.rs -.sp -.B #include -.PP -.SM -.B void pcre_jit_stack_free(pcre_jit_stack *\fIstack\fP); -.PP -.B void pcre16_jit_stack_free(pcre16_jit_stack *\fIstack\fP); -.PP -.B void pcre32_jit_stack_free(pcre32_jit_stack *\fIstack\fP); -. -.SH DESCRIPTION -.rs -.sp -This function is used to free a JIT stack that was created by -\fBpcre[16|32]_jit_stack_alloc()\fP when it is no longer needed. For more details, -see the -.\" HREF -\fBpcrejit\fP -.\" -page. -.P -There is a complete description of the PCRE native API in the -.\" HREF -\fBpcreapi\fP -.\" -page and a description of the POSIX API in the -.\" HREF -\fBpcreposix\fP -.\" -page. diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre_maketables.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre_maketables.3 deleted file mode 100644 index b2c3d23a..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre_maketables.3 +++ /dev/null @@ -1,33 +0,0 @@ -.TH PCRE_MAKETABLES 3 "24 June 2012" "PCRE 8.30" -.SH NAME -PCRE - Perl-compatible regular expressions -.SH SYNOPSIS -.rs -.sp -.B #include -.PP -.SM -.B const unsigned char *pcre_maketables(void); -.PP -.B const unsigned char *pcre16_maketables(void); -.PP -.B const unsigned char *pcre32_maketables(void); -. -.SH DESCRIPTION -.rs -.sp -This function builds a set of character tables for character values less than -256. These can be passed to \fBpcre[16|32]_compile()\fP to override PCRE's -internal, built-in tables (which were made by \fBpcre[16|32]_maketables()\fP when -PCRE was compiled). You might want to do this if you are using a non-standard -locale. The function yields a pointer to the tables. -.P -There is a complete description of the PCRE native API in the -.\" HREF -\fBpcreapi\fP -.\" -page and a description of the POSIX API in the -.\" HREF -\fBpcreposix\fP -.\" -page. diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre_pattern_to_host_byte_order.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre_pattern_to_host_byte_order.3 deleted file mode 100644 index b0c41c38..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre_pattern_to_host_byte_order.3 +++ /dev/null @@ -1,44 +0,0 @@ -.TH PCRE_PATTERN_TO_HOST_BYTE_ORDER 3 "24 June 2012" "PCRE 8.30" -.SH NAME -PCRE - Perl-compatible regular expressions -.SH SYNOPSIS -.rs -.sp -.B #include -.PP -.nf -.B int pcre_pattern_to_host_byte_order(pcre *\fIcode\fP, -.B " pcre_extra *\fIextra\fP, const unsigned char *\fItables\fP);" -.sp -.B int pcre16_pattern_to_host_byte_order(pcre16 *\fIcode\fP, -.B " pcre16_extra *\fIextra\fP, const unsigned char *\fItables\fP);" -.sp -.B int pcre32_pattern_to_host_byte_order(pcre32 *\fIcode\fP, -.B " pcre32_extra *\fIextra\fP, const unsigned char *\fItables\fP);" -.fi -. -.SH DESCRIPTION -.rs -.sp -This function ensures that the bytes in 2-byte and 4-byte values in a compiled -pattern are in the correct order for the current host. It is useful when a -pattern that has been compiled on one host is transferred to another that might -have different endianness. The arguments are: -.sp - \fIcode\fP A compiled regular expression - \fIextra\fP Points to an associated \fBpcre[16|32]_extra\fP structure, - or is NULL - \fItables\fP Pointer to character tables, or NULL to - set the built-in default -.sp -The result is 0 for success, a negative PCRE_ERROR_xxx value otherwise. -.P -There is a complete description of the PCRE native API in the -.\" HREF -\fBpcreapi\fP -.\" -page and a description of the POSIX API in the -.\" HREF -\fBpcreposix\fP -.\" -page. diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre_refcount.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre_refcount.3 deleted file mode 100644 index 45a41fef..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre_refcount.3 +++ /dev/null @@ -1,36 +0,0 @@ -.TH PCRE_REFCOUNT 3 "24 June 2012" "PCRE 8.30" -.SH NAME -PCRE - Perl-compatible regular expressions -.SH SYNOPSIS -.rs -.sp -.B #include -.PP -.SM -.B int pcre_refcount(pcre *\fIcode\fP, int \fIadjust\fP); -.PP -.B int pcre16_refcount(pcre16 *\fIcode\fP, int \fIadjust\fP); -.PP -.B int pcre32_refcount(pcre32 *\fIcode\fP, int \fIadjust\fP); -. -.SH DESCRIPTION -.rs -.sp -This function is used to maintain a reference count inside a data block that -contains a compiled pattern. Its arguments are: -.sp - \fIcode\fP Compiled regular expression - \fIadjust\fP Adjustment to reference value -.sp -The yield of the function is the adjusted reference value, which is constrained -to lie between 0 and 65535. -.P -There is a complete description of the PCRE native API in the -.\" HREF -\fBpcreapi\fP -.\" -page and a description of the POSIX API in the -.\" HREF -\fBpcreposix\fP -.\" -page. diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre_study.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre_study.3 deleted file mode 100644 index 1200e0a6..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre_study.3 +++ /dev/null @@ -1,54 +0,0 @@ -.TH PCRE_STUDY 3 " 24 June 2012" "PCRE 8.30" -.SH NAME -PCRE - Perl-compatible regular expressions -.SH SYNOPSIS -.rs -.sp -.B #include -.PP -.nf -.B pcre_extra *pcre_study(const pcre *\fIcode\fP, int \fIoptions\fP, -.B " const char **\fIerrptr\fP);" -.sp -.B pcre16_extra *pcre16_study(const pcre16 *\fIcode\fP, int \fIoptions\fP, -.B " const char **\fIerrptr\fP);" -.sp -.B pcre32_extra *pcre32_study(const pcre32 *\fIcode\fP, int \fIoptions\fP, -.B " const char **\fIerrptr\fP);" -.fi -. -.SH DESCRIPTION -.rs -.sp -This function studies a compiled pattern, to see if additional information can -be extracted that might speed up matching. Its arguments are: -.sp - \fIcode\fP A compiled regular expression - \fIoptions\fP Options for \fBpcre[16|32]_study()\fP - \fIerrptr\fP Where to put an error message -.sp -If the function succeeds, it returns a value that can be passed to -\fBpcre[16|32]_exec()\fP or \fBpcre[16|32]_dfa_exec()\fP via their \fIextra\fP -arguments. -.P -If the function returns NULL, either it could not find any additional -information, or there was an error. You can tell the difference by looking at -the error value. It is NULL in first case. -.P -The only option is PCRE_STUDY_JIT_COMPILE. It requests just-in-time compilation -if possible. If PCRE has been compiled without JIT support, this option is -ignored. See the -.\" HREF -\fBpcrejit\fP -.\" -page for further details. -.P -There is a complete description of the PCRE native API in the -.\" HREF -\fBpcreapi\fP -.\" -page and a description of the POSIX API in the -.\" HREF -\fBpcreposix\fP -.\" -page. diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre_utf16_to_host_byte_order.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre_utf16_to_host_byte_order.3 deleted file mode 100644 index 1851b619..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre_utf16_to_host_byte_order.3 +++ /dev/null @@ -1,45 +0,0 @@ -.TH PCRE_UTF16_TO_HOST_BYTE_ORDER 3 "21 January 2012" "PCRE 8.30" -.SH NAME -PCRE - Perl-compatible regular expressions -.SH SYNOPSIS -.rs -.sp -.B #include -.PP -.nf -.B int pcre16_utf16_to_host_byte_order(PCRE_UCHAR16 *\fIoutput\fP, -.B " PCRE_SPTR16 \fIinput\fP, int \fIlength\fP, int *\fIhost_byte_order\fP," -.B " int \fIkeep_boms\fP);" -.fi -. -. -.SH DESCRIPTION -.rs -.sp -This function, which exists only in the 16-bit library, converts a UTF-16 -string to the correct order for the current host, taking account of any byte -order marks (BOMs) within the string. Its arguments are: -.sp - \fIoutput\fP pointer to output buffer, may be the same as \fIinput\fP - \fIinput\fP pointer to input buffer - \fIlength\fP number of 16-bit units in the input, or negative for - a zero-terminated string - \fIhost_byte_order\fP a NULL value or a non-zero value pointed to means - start in host byte order - \fIkeep_boms\fP if non-zero, BOMs are copied to the output string -.sp -The result of the function is the number of 16-bit units placed into the output -buffer, including the zero terminator if the string was zero-terminated. -.P -If \fIhost_byte_order\fP is not NULL, it is set to indicate the byte order that -is current at the end of the string. -.P -There is a complete description of the PCRE native API in the -.\" HREF -\fBpcreapi\fP -.\" -page and a description of the POSIX API in the -.\" HREF -\fBpcreposix\fP -.\" -page. diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre_utf32_to_host_byte_order.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre_utf32_to_host_byte_order.3 deleted file mode 100644 index a415dcf5..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre_utf32_to_host_byte_order.3 +++ /dev/null @@ -1,45 +0,0 @@ -.TH PCRE_UTF32_TO_HOST_BYTE_ORDER 3 "24 June 2012" "PCRE 8.30" -.SH NAME -PCRE - Perl-compatible regular expressions -.SH SYNOPSIS -.rs -.sp -.B #include -.PP -.nf -.B int pcre32_utf32_to_host_byte_order(PCRE_UCHAR32 *\fIoutput\fP, -.B " PCRE_SPTR32 \fIinput\fP, int \fIlength\fP, int *\fIhost_byte_order\fP," -.B " int \fIkeep_boms\fP);" -.fi -. -. -.SH DESCRIPTION -.rs -.sp -This function, which exists only in the 32-bit library, converts a UTF-32 -string to the correct order for the current host, taking account of any byte -order marks (BOMs) within the string. Its arguments are: -.sp - \fIoutput\fP pointer to output buffer, may be the same as \fIinput\fP - \fIinput\fP pointer to input buffer - \fIlength\fP number of 32-bit units in the input, or negative for - a zero-terminated string - \fIhost_byte_order\fP a NULL value or a non-zero value pointed to means - start in host byte order - \fIkeep_boms\fP if non-zero, BOMs are copied to the output string -.sp -The result of the function is the number of 32-bit units placed into the output -buffer, including the zero terminator if the string was zero-terminated. -.P -If \fIhost_byte_order\fP is not NULL, it is set to indicate the byte order that -is current at the end of the string. -.P -There is a complete description of the PCRE native API in the -.\" HREF -\fBpcreapi\fP -.\" -page and a description of the POSIX API in the -.\" HREF -\fBpcreposix\fP -.\" -page. diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre_version.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre_version.3 deleted file mode 100644 index 0f4973f9..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcre_version.3 +++ /dev/null @@ -1,31 +0,0 @@ -.TH PCRE_VERSION 3 "24 June 2012" "PCRE 8.30" -.SH NAME -PCRE - Perl-compatible regular expressions -.SH SYNOPSIS -.rs -.sp -.B #include -.PP -.SM -.B const char *pcre_version(void); -.PP -.B const char *pcre16_version(void); -.PP -.B const char *pcre32_version(void); -. -.SH DESCRIPTION -.rs -.sp -This function (even in the 16-bit and 32-bit libraries) returns a -zero-terminated, 8-bit character string that gives the version number of the -PCRE library and the date of its release. -.P -There is a complete description of the PCRE native API in the -.\" HREF -\fBpcreapi\fP -.\" -page and a description of the POSIX API in the -.\" HREF -\fBpcreposix\fP -.\" -page. diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcreapi.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcreapi.3 deleted file mode 100644 index 6e7c7c6e..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcreapi.3 +++ /dev/null @@ -1,2918 +0,0 @@ -.TH PCREAPI 3 "18 December 2015" "PCRE 8.39" -.SH NAME -PCRE - Perl-compatible regular expressions -.sp -.B #include -. -. -.SH "PCRE NATIVE API BASIC FUNCTIONS" -.rs -.sp -.nf -.B pcre *pcre_compile(const char *\fIpattern\fP, int \fIoptions\fP, -.B " const char **\fIerrptr\fP, int *\fIerroffset\fP," -.B " const unsigned char *\fItableptr\fP);" -.sp -.B pcre *pcre_compile2(const char *\fIpattern\fP, int \fIoptions\fP, -.B " int *\fIerrorcodeptr\fP," -.B " const char **\fIerrptr\fP, int *\fIerroffset\fP," -.B " const unsigned char *\fItableptr\fP);" -.sp -.B pcre_extra *pcre_study(const pcre *\fIcode\fP, int \fIoptions\fP, -.B " const char **\fIerrptr\fP);" -.sp -.B void pcre_free_study(pcre_extra *\fIextra\fP); -.sp -.B int pcre_exec(const pcre *\fIcode\fP, "const pcre_extra *\fIextra\fP," -.B " const char *\fIsubject\fP, int \fIlength\fP, int \fIstartoffset\fP," -.B " int \fIoptions\fP, int *\fIovector\fP, int \fIovecsize\fP);" -.sp -.B int pcre_dfa_exec(const pcre *\fIcode\fP, "const pcre_extra *\fIextra\fP," -.B " const char *\fIsubject\fP, int \fIlength\fP, int \fIstartoffset\fP," -.B " int \fIoptions\fP, int *\fIovector\fP, int \fIovecsize\fP," -.B " int *\fIworkspace\fP, int \fIwscount\fP);" -.fi -. -. -.SH "PCRE NATIVE API STRING EXTRACTION FUNCTIONS" -.rs -.sp -.nf -.B int pcre_copy_named_substring(const pcre *\fIcode\fP, -.B " const char *\fIsubject\fP, int *\fIovector\fP," -.B " int \fIstringcount\fP, const char *\fIstringname\fP," -.B " char *\fIbuffer\fP, int \fIbuffersize\fP);" -.sp -.B int pcre_copy_substring(const char *\fIsubject\fP, int *\fIovector\fP, -.B " int \fIstringcount\fP, int \fIstringnumber\fP, char *\fIbuffer\fP," -.B " int \fIbuffersize\fP);" -.sp -.B int pcre_get_named_substring(const pcre *\fIcode\fP, -.B " const char *\fIsubject\fP, int *\fIovector\fP," -.B " int \fIstringcount\fP, const char *\fIstringname\fP," -.B " const char **\fIstringptr\fP);" -.sp -.B int pcre_get_stringnumber(const pcre *\fIcode\fP, -.B " const char *\fIname\fP);" -.sp -.B int pcre_get_stringtable_entries(const pcre *\fIcode\fP, -.B " const char *\fIname\fP, char **\fIfirst\fP, char **\fIlast\fP);" -.sp -.B int pcre_get_substring(const char *\fIsubject\fP, int *\fIovector\fP, -.B " int \fIstringcount\fP, int \fIstringnumber\fP," -.B " const char **\fIstringptr\fP);" -.sp -.B int pcre_get_substring_list(const char *\fIsubject\fP, -.B " int *\fIovector\fP, int \fIstringcount\fP, const char ***\fIlistptr\fP);" -.sp -.B void pcre_free_substring(const char *\fIstringptr\fP); -.sp -.B void pcre_free_substring_list(const char **\fIstringptr\fP); -.fi -. -. -.SH "PCRE NATIVE API AUXILIARY FUNCTIONS" -.rs -.sp -.nf -.B int pcre_jit_exec(const pcre *\fIcode\fP, "const pcre_extra *\fIextra\fP," -.B " const char *\fIsubject\fP, int \fIlength\fP, int \fIstartoffset\fP," -.B " int \fIoptions\fP, int *\fIovector\fP, int \fIovecsize\fP," -.B " pcre_jit_stack *\fIjstack\fP);" -.sp -.B pcre_jit_stack *pcre_jit_stack_alloc(int \fIstartsize\fP, int \fImaxsize\fP); -.sp -.B void pcre_jit_stack_free(pcre_jit_stack *\fIstack\fP); -.sp -.B void pcre_assign_jit_stack(pcre_extra *\fIextra\fP, -.B " pcre_jit_callback \fIcallback\fP, void *\fIdata\fP);" -.sp -.B const unsigned char *pcre_maketables(void); -.sp -.B int pcre_fullinfo(const pcre *\fIcode\fP, "const pcre_extra *\fIextra\fP," -.B " int \fIwhat\fP, void *\fIwhere\fP);" -.sp -.B int pcre_refcount(pcre *\fIcode\fP, int \fIadjust\fP); -.sp -.B int pcre_config(int \fIwhat\fP, void *\fIwhere\fP); -.sp -.B const char *pcre_version(void); -.sp -.B int pcre_pattern_to_host_byte_order(pcre *\fIcode\fP, -.B " pcre_extra *\fIextra\fP, const unsigned char *\fItables\fP);" -.fi -. -. -.SH "PCRE NATIVE API INDIRECTED FUNCTIONS" -.rs -.sp -.nf -.B void *(*pcre_malloc)(size_t); -.sp -.B void (*pcre_free)(void *); -.sp -.B void *(*pcre_stack_malloc)(size_t); -.sp -.B void (*pcre_stack_free)(void *); -.sp -.B int (*pcre_callout)(pcre_callout_block *); -.sp -.B int (*pcre_stack_guard)(void); -.fi -. -. -.SH "PCRE 8-BIT, 16-BIT, AND 32-BIT LIBRARIES" -.rs -.sp -As well as support for 8-bit character strings, PCRE also supports 16-bit -strings (from release 8.30) and 32-bit strings (from release 8.32), by means of -two additional libraries. They can be built as well as, or instead of, the -8-bit library. To avoid too much complication, this document describes the -8-bit versions of the functions, with only occasional references to the 16-bit -and 32-bit libraries. -.P -The 16-bit and 32-bit functions operate in the same way as their 8-bit -counterparts; they just use different data types for their arguments and -results, and their names start with \fBpcre16_\fP or \fBpcre32_\fP instead of -\fBpcre_\fP. For every option that has UTF8 in its name (for example, -PCRE_UTF8), there are corresponding 16-bit and 32-bit names with UTF8 replaced -by UTF16 or UTF32, respectively. This facility is in fact just cosmetic; the -16-bit and 32-bit option names define the same bit values. -.P -References to bytes and UTF-8 in this document should be read as references to -16-bit data units and UTF-16 when using the 16-bit library, or 32-bit data -units and UTF-32 when using the 32-bit library, unless specified otherwise. -More details of the specific differences for the 16-bit and 32-bit libraries -are given in the -.\" HREF -\fBpcre16\fP -.\" -and -.\" HREF -\fBpcre32\fP -.\" -pages. -. -. -.SH "PCRE API OVERVIEW" -.rs -.sp -PCRE has its own native API, which is described in this document. There are -also some wrapper functions (for the 8-bit library only) that correspond to the -POSIX regular expression API, but they do not give access to all the -functionality. They are described in the -.\" HREF -\fBpcreposix\fP -.\" -documentation. Both of these APIs define a set of C function calls. A C++ -wrapper (again for the 8-bit library only) is also distributed with PCRE. It is -documented in the -.\" HREF -\fBpcrecpp\fP -.\" -page. -.P -The native API C function prototypes are defined in the header file -\fBpcre.h\fP, and on Unix-like systems the (8-bit) library itself is called -\fBlibpcre\fP. It can normally be accessed by adding \fB-lpcre\fP to the -command for linking an application that uses PCRE. The header file defines the -macros PCRE_MAJOR and PCRE_MINOR to contain the major and minor release numbers -for the library. Applications can use these to include support for different -releases of PCRE. -.P -In a Windows environment, if you want to statically link an application program -against a non-dll \fBpcre.a\fP file, you must define PCRE_STATIC before -including \fBpcre.h\fP or \fBpcrecpp.h\fP, because otherwise the -\fBpcre_malloc()\fP and \fBpcre_free()\fP exported functions will be declared -\fB__declspec(dllimport)\fP, with unwanted results. -.P -The functions \fBpcre_compile()\fP, \fBpcre_compile2()\fP, \fBpcre_study()\fP, -and \fBpcre_exec()\fP are used for compiling and matching regular expressions -in a Perl-compatible manner. A sample program that demonstrates the simplest -way of using them is provided in the file called \fIpcredemo.c\fP in the PCRE -source distribution. A listing of this program is given in the -.\" HREF -\fBpcredemo\fP -.\" -documentation, and the -.\" HREF -\fBpcresample\fP -.\" -documentation describes how to compile and run it. -.P -Just-in-time compiler support is an optional feature of PCRE that can be built -in appropriate hardware environments. It greatly speeds up the matching -performance of many patterns. Simple programs can easily request that it be -used if available, by setting an option that is ignored when it is not -relevant. More complicated programs might need to make use of the functions -\fBpcre_jit_stack_alloc()\fP, \fBpcre_jit_stack_free()\fP, and -\fBpcre_assign_jit_stack()\fP in order to control the JIT code's memory usage. -.P -From release 8.32 there is also a direct interface for JIT execution, which -gives improved performance. The JIT-specific functions are discussed in the -.\" HREF -\fBpcrejit\fP -.\" -documentation. -.P -A second matching function, \fBpcre_dfa_exec()\fP, which is not -Perl-compatible, is also provided. This uses a different algorithm for the -matching. The alternative algorithm finds all possible matches (at a given -point in the subject), and scans the subject just once (unless there are -lookbehind assertions). However, this algorithm does not return captured -substrings. A description of the two matching algorithms and their advantages -and disadvantages is given in the -.\" HREF -\fBpcrematching\fP -.\" -documentation. -.P -In addition to the main compiling and matching functions, there are convenience -functions for extracting captured substrings from a subject string that is -matched by \fBpcre_exec()\fP. They are: -.sp - \fBpcre_copy_substring()\fP - \fBpcre_copy_named_substring()\fP - \fBpcre_get_substring()\fP - \fBpcre_get_named_substring()\fP - \fBpcre_get_substring_list()\fP - \fBpcre_get_stringnumber()\fP - \fBpcre_get_stringtable_entries()\fP -.sp -\fBpcre_free_substring()\fP and \fBpcre_free_substring_list()\fP are also -provided, to free the memory used for extracted strings. -.P -The function \fBpcre_maketables()\fP is used to build a set of character tables -in the current locale for passing to \fBpcre_compile()\fP, \fBpcre_exec()\fP, -or \fBpcre_dfa_exec()\fP. This is an optional facility that is provided for -specialist use. Most commonly, no special tables are passed, in which case -internal tables that are generated when PCRE is built are used. -.P -The function \fBpcre_fullinfo()\fP is used to find out information about a -compiled pattern. The function \fBpcre_version()\fP returns a pointer to a -string containing the version of PCRE and its date of release. -.P -The function \fBpcre_refcount()\fP maintains a reference count in a data block -containing a compiled pattern. This is provided for the benefit of -object-oriented applications. -.P -The global variables \fBpcre_malloc\fP and \fBpcre_free\fP initially contain -the entry points of the standard \fBmalloc()\fP and \fBfree()\fP functions, -respectively. PCRE calls the memory management functions via these variables, -so a calling program can replace them if it wishes to intercept the calls. This -should be done before calling any PCRE functions. -.P -The global variables \fBpcre_stack_malloc\fP and \fBpcre_stack_free\fP are also -indirections to memory management functions. These special functions are used -only when PCRE is compiled to use the heap for remembering data, instead of -recursive function calls, when running the \fBpcre_exec()\fP function. See the -.\" HREF -\fBpcrebuild\fP -.\" -documentation for details of how to do this. It is a non-standard way of -building PCRE, for use in environments that have limited stacks. Because of the -greater use of memory management, it runs more slowly. Separate functions are -provided so that special-purpose external code can be used for this case. When -used, these functions always allocate memory blocks of the same size. There is -a discussion about PCRE's stack usage in the -.\" HREF -\fBpcrestack\fP -.\" -documentation. -.P -The global variable \fBpcre_callout\fP initially contains NULL. It can be set -by the caller to a "callout" function, which PCRE will then call at specified -points during a matching operation. Details are given in the -.\" HREF -\fBpcrecallout\fP -.\" -documentation. -.P -The global variable \fBpcre_stack_guard\fP initially contains NULL. It can be -set by the caller to a function that is called by PCRE whenever it starts -to compile a parenthesized part of a pattern. When parentheses are nested, PCRE -uses recursive function calls, which use up the system stack. This function is -provided so that applications with restricted stacks can force a compilation -error if the stack runs out. The function should return zero if all is well, or -non-zero to force an error. -. -. -.\" HTML -.SH NEWLINES -.rs -.sp -PCRE supports five different conventions for indicating line breaks in -strings: a single CR (carriage return) character, a single LF (linefeed) -character, the two-character sequence CRLF, any of the three preceding, or any -Unicode newline sequence. The Unicode newline sequences are the three just -mentioned, plus the single characters VT (vertical tab, U+000B), FF (form feed, -U+000C), NEL (next line, U+0085), LS (line separator, U+2028), and PS -(paragraph separator, U+2029). -.P -Each of the first three conventions is used by at least one operating system as -its standard newline sequence. When PCRE is built, a default can be specified. -The default default is LF, which is the Unix standard. When PCRE is run, the -default can be overridden, either when a pattern is compiled, or when it is -matched. -.P -At compile time, the newline convention can be specified by the \fIoptions\fP -argument of \fBpcre_compile()\fP, or it can be specified by special text at the -start of the pattern itself; this overrides any other settings. See the -.\" HREF -\fBpcrepattern\fP -.\" -page for details of the special character sequences. -.P -In the PCRE documentation the word "newline" is used to mean "the character or -pair of characters that indicate a line break". The choice of newline -convention affects the handling of the dot, circumflex, and dollar -metacharacters, the handling of #-comments in /x mode, and, when CRLF is a -recognized line ending sequence, the match position advancement for a -non-anchored pattern. There is more detail about this in the -.\" HTML -.\" -section on \fBpcre_exec()\fP options -.\" -below. -.P -The choice of newline convention does not affect the interpretation of -the \en or \er escape sequences, nor does it affect what \eR matches, which is -controlled in a similar way, but by separate options. -. -. -.SH MULTITHREADING -.rs -.sp -The PCRE functions can be used in multi-threading applications, with the -proviso that the memory management functions pointed to by \fBpcre_malloc\fP, -\fBpcre_free\fP, \fBpcre_stack_malloc\fP, and \fBpcre_stack_free\fP, and the -callout and stack-checking functions pointed to by \fBpcre_callout\fP and -\fBpcre_stack_guard\fP, are shared by all threads. -.P -The compiled form of a regular expression is not altered during matching, so -the same compiled pattern can safely be used by several threads at once. -.P -If the just-in-time optimization feature is being used, it needs separate -memory stack areas for each thread. See the -.\" HREF -\fBpcrejit\fP -.\" -documentation for more details. -. -. -.SH "SAVING PRECOMPILED PATTERNS FOR LATER USE" -.rs -.sp -The compiled form of a regular expression can be saved and re-used at a later -time, possibly by a different program, and even on a host other than the one on -which it was compiled. Details are given in the -.\" HREF -\fBpcreprecompile\fP -.\" -documentation, which includes a description of the -\fBpcre_pattern_to_host_byte_order()\fP function. However, compiling a regular -expression with one version of PCRE for use with a different version is not -guaranteed to work and may cause crashes. -. -. -.SH "CHECKING BUILD-TIME OPTIONS" -.rs -.sp -.B int pcre_config(int \fIwhat\fP, void *\fIwhere\fP); -.PP -The function \fBpcre_config()\fP makes it possible for a PCRE client to -discover which optional features have been compiled into the PCRE library. The -.\" HREF -\fBpcrebuild\fP -.\" -documentation has more details about these optional features. -.P -The first argument for \fBpcre_config()\fP is an integer, specifying which -information is required; the second argument is a pointer to a variable into -which the information is placed. The returned value is zero on success, or the -negative error code PCRE_ERROR_BADOPTION if the value in the first argument is -not recognized. The following information is available: -.sp - PCRE_CONFIG_UTF8 -.sp -The output is an integer that is set to one if UTF-8 support is available; -otherwise it is set to zero. This value should normally be given to the 8-bit -version of this function, \fBpcre_config()\fP. If it is given to the 16-bit -or 32-bit version of this function, the result is PCRE_ERROR_BADOPTION. -.sp - PCRE_CONFIG_UTF16 -.sp -The output is an integer that is set to one if UTF-16 support is available; -otherwise it is set to zero. This value should normally be given to the 16-bit -version of this function, \fBpcre16_config()\fP. If it is given to the 8-bit -or 32-bit version of this function, the result is PCRE_ERROR_BADOPTION. -.sp - PCRE_CONFIG_UTF32 -.sp -The output is an integer that is set to one if UTF-32 support is available; -otherwise it is set to zero. This value should normally be given to the 32-bit -version of this function, \fBpcre32_config()\fP. If it is given to the 8-bit -or 16-bit version of this function, the result is PCRE_ERROR_BADOPTION. -.sp - PCRE_CONFIG_UNICODE_PROPERTIES -.sp -The output is an integer that is set to one if support for Unicode character -properties is available; otherwise it is set to zero. -.sp - PCRE_CONFIG_JIT -.sp -The output is an integer that is set to one if support for just-in-time -compiling is available; otherwise it is set to zero. -.sp - PCRE_CONFIG_JITTARGET -.sp -The output is a pointer to a zero-terminated "const char *" string. If JIT -support is available, the string contains the name of the architecture for -which the JIT compiler is configured, for example "x86 32bit (little endian + -unaligned)". If JIT support is not available, the result is NULL. -.sp - PCRE_CONFIG_NEWLINE -.sp -The output is an integer whose value specifies the default character sequence -that is recognized as meaning "newline". The values that are supported in -ASCII/Unicode environments are: 10 for LF, 13 for CR, 3338 for CRLF, -2 for -ANYCRLF, and -1 for ANY. In EBCDIC environments, CR, ANYCRLF, and ANY yield the -same values. However, the value for LF is normally 21, though some EBCDIC -environments use 37. The corresponding values for CRLF are 3349 and 3365. The -default should normally correspond to the standard sequence for your operating -system. -.sp - PCRE_CONFIG_BSR -.sp -The output is an integer whose value indicates what character sequences the \eR -escape sequence matches by default. A value of 0 means that \eR matches any -Unicode line ending sequence; a value of 1 means that \eR matches only CR, LF, -or CRLF. The default can be overridden when a pattern is compiled or matched. -.sp - PCRE_CONFIG_LINK_SIZE -.sp -The output is an integer that contains the number of bytes used for internal -linkage in compiled regular expressions. For the 8-bit library, the value can -be 2, 3, or 4. For the 16-bit library, the value is either 2 or 4 and is still -a number of bytes. For the 32-bit library, the value is either 2 or 4 and is -still a number of bytes. The default value of 2 is sufficient for all but the -most massive patterns, since it allows the compiled pattern to be up to 64K in -size. Larger values allow larger regular expressions to be compiled, at the -expense of slower matching. -.sp - PCRE_CONFIG_POSIX_MALLOC_THRESHOLD -.sp -The output is an integer that contains the threshold above which the POSIX -interface uses \fBmalloc()\fP for output vectors. Further details are given in -the -.\" HREF -\fBpcreposix\fP -.\" -documentation. -.sp - PCRE_CONFIG_PARENS_LIMIT -.sp -The output is a long integer that gives the maximum depth of nesting of -parentheses (of any kind) in a pattern. This limit is imposed to cap the amount -of system stack used when a pattern is compiled. It is specified when PCRE is -built; the default is 250. This limit does not take into account the stack that -may already be used by the calling application. For finer control over -compilation stack usage, you can set a pointer to an external checking function -in \fBpcre_stack_guard\fP. -.sp - PCRE_CONFIG_MATCH_LIMIT -.sp -The output is a long integer that gives the default limit for the number of -internal matching function calls in a \fBpcre_exec()\fP execution. Further -details are given with \fBpcre_exec()\fP below. -.sp - PCRE_CONFIG_MATCH_LIMIT_RECURSION -.sp -The output is a long integer that gives the default limit for the depth of -recursion when calling the internal matching function in a \fBpcre_exec()\fP -execution. Further details are given with \fBpcre_exec()\fP below. -.sp - PCRE_CONFIG_STACKRECURSE -.sp -The output is an integer that is set to one if internal recursion when running -\fBpcre_exec()\fP is implemented by recursive function calls that use the stack -to remember their state. This is the usual way that PCRE is compiled. The -output is zero if PCRE was compiled to use blocks of data on the heap instead -of recursive function calls. In this case, \fBpcre_stack_malloc\fP and -\fBpcre_stack_free\fP are called to manage memory blocks on the heap, thus -avoiding the use of the stack. -. -. -.SH "COMPILING A PATTERN" -.rs -.sp -.nf -.B pcre *pcre_compile(const char *\fIpattern\fP, int \fIoptions\fP, -.B " const char **\fIerrptr\fP, int *\fIerroffset\fP," -.B " const unsigned char *\fItableptr\fP);" -.sp -.B pcre *pcre_compile2(const char *\fIpattern\fP, int \fIoptions\fP, -.B " int *\fIerrorcodeptr\fP," -.B " const char **\fIerrptr\fP, int *\fIerroffset\fP," -.B " const unsigned char *\fItableptr\fP);" -.fi -.P -Either of the functions \fBpcre_compile()\fP or \fBpcre_compile2()\fP can be -called to compile a pattern into an internal form. The only difference between -the two interfaces is that \fBpcre_compile2()\fP has an additional argument, -\fIerrorcodeptr\fP, via which a numerical error code can be returned. To avoid -too much repetition, we refer just to \fBpcre_compile()\fP below, but the -information applies equally to \fBpcre_compile2()\fP. -.P -The pattern is a C string terminated by a binary zero, and is passed in the -\fIpattern\fP argument. A pointer to a single block of memory that is obtained -via \fBpcre_malloc\fP is returned. This contains the compiled code and related -data. The \fBpcre\fP type is defined for the returned block; this is a typedef -for a structure whose contents are not externally defined. It is up to the -caller to free the memory (via \fBpcre_free\fP) when it is no longer required. -.P -Although the compiled code of a PCRE regex is relocatable, that is, it does not -depend on memory location, the complete \fBpcre\fP data block is not -fully relocatable, because it may contain a copy of the \fItableptr\fP -argument, which is an address (see below). -.P -The \fIoptions\fP argument contains various bit settings that affect the -compilation. It should be zero if no options are required. The available -options are described below. Some of them (in particular, those that are -compatible with Perl, but some others as well) can also be set and unset from -within the pattern (see the detailed description in the -.\" HREF -\fBpcrepattern\fP -.\" -documentation). For those options that can be different in different parts of -the pattern, the contents of the \fIoptions\fP argument specifies their -settings at the start of compilation and execution. The PCRE_ANCHORED, -PCRE_BSR_\fIxxx\fP, PCRE_NEWLINE_\fIxxx\fP, PCRE_NO_UTF8_CHECK, and -PCRE_NO_START_OPTIMIZE options can be set at the time of matching as well as at -compile time. -.P -If \fIerrptr\fP is NULL, \fBpcre_compile()\fP returns NULL immediately. -Otherwise, if compilation of a pattern fails, \fBpcre_compile()\fP returns -NULL, and sets the variable pointed to by \fIerrptr\fP to point to a textual -error message. This is a static string that is part of the library. You must -not try to free it. Normally, the offset from the start of the pattern to the -data unit that was being processed when the error was discovered is placed in -the variable pointed to by \fIerroffset\fP, which must not be NULL (if it is, -an immediate error is given). However, for an invalid UTF-8 or UTF-16 string, -the offset is that of the first data unit of the failing character. -.P -Some errors are not detected until the whole pattern has been scanned; in these -cases, the offset passed back is the length of the pattern. Note that the -offset is in data units, not characters, even in a UTF mode. It may sometimes -point into the middle of a UTF-8 or UTF-16 character. -.P -If \fBpcre_compile2()\fP is used instead of \fBpcre_compile()\fP, and the -\fIerrorcodeptr\fP argument is not NULL, a non-zero error code number is -returned via this argument in the event of an error. This is in addition to the -textual error message. Error codes and messages are listed below. -.P -If the final argument, \fItableptr\fP, is NULL, PCRE uses a default set of -character tables that are built when PCRE is compiled, using the default C -locale. Otherwise, \fItableptr\fP must be an address that is the result of a -call to \fBpcre_maketables()\fP. This value is stored with the compiled -pattern, and used again by \fBpcre_exec()\fP and \fBpcre_dfa_exec()\fP when the -pattern is matched. For more discussion, see the section on locale support -below. -.P -This code fragment shows a typical straightforward call to \fBpcre_compile()\fP: -.sp - pcre *re; - const char *error; - int erroffset; - re = pcre_compile( - "^A.*Z", /* the pattern */ - 0, /* default options */ - &error, /* for error message */ - &erroffset, /* for error offset */ - NULL); /* use default character tables */ -.sp -The following names for option bits are defined in the \fBpcre.h\fP header -file: -.sp - PCRE_ANCHORED -.sp -If this bit is set, the pattern is forced to be "anchored", that is, it is -constrained to match only at the first matching point in the string that is -being searched (the "subject string"). This effect can also be achieved by -appropriate constructs in the pattern itself, which is the only way to do it in -Perl. -.sp - PCRE_AUTO_CALLOUT -.sp -If this bit is set, \fBpcre_compile()\fP automatically inserts callout items, -all with number 255, before each pattern item. For discussion of the callout -facility, see the -.\" HREF -\fBpcrecallout\fP -.\" -documentation. -.sp - PCRE_BSR_ANYCRLF - PCRE_BSR_UNICODE -.sp -These options (which are mutually exclusive) control what the \eR escape -sequence matches. The choice is either to match only CR, LF, or CRLF, or to -match any Unicode newline sequence. The default is specified when PCRE is -built. It can be overridden from within the pattern, or by setting an option -when a compiled pattern is matched. -.sp - PCRE_CASELESS -.sp -If this bit is set, letters in the pattern match both upper and lower case -letters. It is equivalent to Perl's /i option, and it can be changed within a -pattern by a (?i) option setting. In UTF-8 mode, PCRE always understands the -concept of case for characters whose values are less than 128, so caseless -matching is always possible. For characters with higher values, the concept of -case is supported if PCRE is compiled with Unicode property support, but not -otherwise. If you want to use caseless matching for characters 128 and above, -you must ensure that PCRE is compiled with Unicode property support as well as -with UTF-8 support. -.sp - PCRE_DOLLAR_ENDONLY -.sp -If this bit is set, a dollar metacharacter in the pattern matches only at the -end of the subject string. Without this option, a dollar also matches -immediately before a newline at the end of the string (but not before any other -newlines). The PCRE_DOLLAR_ENDONLY option is ignored if PCRE_MULTILINE is set. -There is no equivalent to this option in Perl, and no way to set it within a -pattern. -.sp - PCRE_DOTALL -.sp -If this bit is set, a dot metacharacter in the pattern matches a character of -any value, including one that indicates a newline. However, it only ever -matches one character, even if newlines are coded as CRLF. Without this option, -a dot does not match when the current position is at a newline. This option is -equivalent to Perl's /s option, and it can be changed within a pattern by a -(?s) option setting. A negative class such as [^a] always matches newline -characters, independent of the setting of this option. -.sp - PCRE_DUPNAMES -.sp -If this bit is set, names used to identify capturing subpatterns need not be -unique. This can be helpful for certain types of pattern when it is known that -only one instance of the named subpattern can ever be matched. There are more -details of named subpatterns below; see also the -.\" HREF -\fBpcrepattern\fP -.\" -documentation. -.sp - PCRE_EXTENDED -.sp -If this bit is set, most white space characters in the pattern are totally -ignored except when escaped or inside a character class. However, white space -is not allowed within sequences such as (?> that introduce various -parenthesized subpatterns, nor within a numerical quantifier such as {1,3}. -However, ignorable white space is permitted between an item and a following -quantifier and between a quantifier and a following + that indicates -possessiveness. -.P -White space did not used to include the VT character (code 11), because Perl -did not treat this character as white space. However, Perl changed at release -5.18, so PCRE followed at release 8.34, and VT is now treated as white space. -.P -PCRE_EXTENDED also causes characters between an unescaped # outside a character -class and the next newline, inclusive, to be ignored. PCRE_EXTENDED is -equivalent to Perl's /x option, and it can be changed within a pattern by a -(?x) option setting. -.P -Which characters are interpreted as newlines is controlled by the options -passed to \fBpcre_compile()\fP or by a special sequence at the start of the -pattern, as described in the section entitled -.\" HTML -.\" -"Newline conventions" -.\" -in the \fBpcrepattern\fP documentation. Note that the end of this type of -comment is a literal newline sequence in the pattern; escape sequences that -happen to represent a newline do not count. -.P -This option makes it possible to include comments inside complicated patterns. -Note, however, that this applies only to data characters. White space characters -may never appear within special character sequences in a pattern, for example -within the sequence (?( that introduces a conditional subpattern. -.sp - PCRE_EXTRA -.sp -This option was invented in order to turn on additional functionality of PCRE -that is incompatible with Perl, but it is currently of very little use. When -set, any backslash in a pattern that is followed by a letter that has no -special meaning causes an error, thus reserving these combinations for future -expansion. By default, as in Perl, a backslash followed by a letter with no -special meaning is treated as a literal. (Perl can, however, be persuaded to -give an error for this, by running it with the -w option.) There are at present -no other features controlled by this option. It can also be set by a (?X) -option setting within a pattern. -.sp - PCRE_FIRSTLINE -.sp -If this option is set, an unanchored pattern is required to match before or at -the first newline in the subject string, though the matched text may continue -over the newline. -.sp - PCRE_JAVASCRIPT_COMPAT -.sp -If this option is set, PCRE's behaviour is changed in some ways so that it is -compatible with JavaScript rather than Perl. The changes are as follows: -.P -(1) A lone closing square bracket in a pattern causes a compile-time error, -because this is illegal in JavaScript (by default it is treated as a data -character). Thus, the pattern AB]CD becomes illegal when this option is set. -.P -(2) At run time, a back reference to an unset subpattern group matches an empty -string (by default this causes the current matching alternative to fail). A -pattern such as (\e1)(a) succeeds when this option is set (assuming it can find -an "a" in the subject), whereas it fails by default, for Perl compatibility. -.P -(3) \eU matches an upper case "U" character; by default \eU causes a compile -time error (Perl uses \eU to upper case subsequent characters). -.P -(4) \eu matches a lower case "u" character unless it is followed by four -hexadecimal digits, in which case the hexadecimal number defines the code point -to match. By default, \eu causes a compile time error (Perl uses it to upper -case the following character). -.P -(5) \ex matches a lower case "x" character unless it is followed by two -hexadecimal digits, in which case the hexadecimal number defines the code point -to match. By default, as in Perl, a hexadecimal number is always expected after -\ex, but it may have zero, one, or two digits (so, for example, \exz matches a -binary zero character followed by z). -.sp - PCRE_MULTILINE -.sp -By default, for the purposes of matching "start of line" and "end of line", -PCRE treats the subject string as consisting of a single line of characters, -even if it actually contains newlines. The "start of line" metacharacter (^) -matches only at the start of the string, and the "end of line" metacharacter -($) matches only at the end of the string, or before a terminating newline -(except when PCRE_DOLLAR_ENDONLY is set). Note, however, that unless -PCRE_DOTALL is set, the "any character" metacharacter (.) does not match at a -newline. This behaviour (for ^, $, and dot) is the same as Perl. -.P -When PCRE_MULTILINE it is set, the "start of line" and "end of line" constructs -match immediately following or immediately before internal newlines in the -subject string, respectively, as well as at the very start and end. This is -equivalent to Perl's /m option, and it can be changed within a pattern by a -(?m) option setting. If there are no newlines in a subject string, or no -occurrences of ^ or $ in a pattern, setting PCRE_MULTILINE has no effect. -.sp - PCRE_NEVER_UTF -.sp -This option locks out interpretation of the pattern as UTF-8 (or UTF-16 or -UTF-32 in the 16-bit and 32-bit libraries). In particular, it prevents the -creator of the pattern from switching to UTF interpretation by starting the -pattern with (*UTF). This may be useful in applications that process patterns -from external sources. The combination of PCRE_UTF8 and PCRE_NEVER_UTF also -causes an error. -.sp - PCRE_NEWLINE_CR - PCRE_NEWLINE_LF - PCRE_NEWLINE_CRLF - PCRE_NEWLINE_ANYCRLF - PCRE_NEWLINE_ANY -.sp -These options override the default newline definition that was chosen when PCRE -was built. Setting the first or the second specifies that a newline is -indicated by a single character (CR or LF, respectively). Setting -PCRE_NEWLINE_CRLF specifies that a newline is indicated by the two-character -CRLF sequence. Setting PCRE_NEWLINE_ANYCRLF specifies that any of the three -preceding sequences should be recognized. Setting PCRE_NEWLINE_ANY specifies -that any Unicode newline sequence should be recognized. -.P -In an ASCII/Unicode environment, the Unicode newline sequences are the three -just mentioned, plus the single characters VT (vertical tab, U+000B), FF (form -feed, U+000C), NEL (next line, U+0085), LS (line separator, U+2028), and PS -(paragraph separator, U+2029). For the 8-bit library, the last two are -recognized only in UTF-8 mode. -.P -When PCRE is compiled to run in an EBCDIC (mainframe) environment, the code for -CR is 0x0d, the same as ASCII. However, the character code for LF is normally -0x15, though in some EBCDIC environments 0x25 is used. Whichever of these is -not LF is made to correspond to Unicode's NEL character. EBCDIC codes are all -less than 256. For more details, see the -.\" HREF -\fBpcrebuild\fP -.\" -documentation. -.P -The newline setting in the options word uses three bits that are treated -as a number, giving eight possibilities. Currently only six are used (default -plus the five values above). This means that if you set more than one newline -option, the combination may or may not be sensible. For example, -PCRE_NEWLINE_CR with PCRE_NEWLINE_LF is equivalent to PCRE_NEWLINE_CRLF, but -other combinations may yield unused numbers and cause an error. -.P -The only time that a line break in a pattern is specially recognized when -compiling is when PCRE_EXTENDED is set. CR and LF are white space characters, -and so are ignored in this mode. Also, an unescaped # outside a character class -indicates a comment that lasts until after the next line break sequence. In -other circumstances, line break sequences in patterns are treated as literal -data. -.P -The newline option that is set at compile time becomes the default that is used -for \fBpcre_exec()\fP and \fBpcre_dfa_exec()\fP, but it can be overridden. -.sp - PCRE_NO_AUTO_CAPTURE -.sp -If this option is set, it disables the use of numbered capturing parentheses in -the pattern. Any opening parenthesis that is not followed by ? behaves as if it -were followed by ?: but named parentheses can still be used for capturing (and -they acquire numbers in the usual way). There is no equivalent of this option -in Perl. -.sp - PCRE_NO_AUTO_POSSESS -.sp -If this option is set, it disables "auto-possessification". This is an -optimization that, for example, turns a+b into a++b in order to avoid -backtracks into a+ that can never be successful. However, if callouts are in -use, auto-possessification means that some of them are never taken. You can set -this option if you want the matching functions to do a full unoptimized search -and run all the callouts, but it is mainly provided for testing purposes. -.sp - PCRE_NO_START_OPTIMIZE -.sp -This is an option that acts at matching time; that is, it is really an option -for \fBpcre_exec()\fP or \fBpcre_dfa_exec()\fP. If it is set at compile time, -it is remembered with the compiled pattern and assumed at matching time. This -is necessary if you want to use JIT execution, because the JIT compiler needs -to know whether or not this option is set. For details see the discussion of -PCRE_NO_START_OPTIMIZE -.\" HTML -.\" -below. -.\" -.sp - PCRE_UCP -.sp -This option changes the way PCRE processes \eB, \eb, \eD, \ed, \eS, \es, \eW, -\ew, and some of the POSIX character classes. By default, only ASCII characters -are recognized, but if PCRE_UCP is set, Unicode properties are used instead to -classify characters. More details are given in the section on -.\" HTML -.\" -generic character types -.\" -in the -.\" HREF -\fBpcrepattern\fP -.\" -page. If you set PCRE_UCP, matching one of the items it affects takes much -longer. The option is available only if PCRE has been compiled with Unicode -property support. -.sp - PCRE_UNGREEDY -.sp -This option inverts the "greediness" of the quantifiers so that they are not -greedy by default, but become greedy if followed by "?". It is not compatible -with Perl. It can also be set by a (?U) option setting within the pattern. -.sp - PCRE_UTF8 -.sp -This option causes PCRE to regard both the pattern and the subject as strings -of UTF-8 characters instead of single-byte strings. However, it is available -only when PCRE is built to include UTF support. If not, the use of this option -provokes an error. Details of how this option changes the behaviour of PCRE are -given in the -.\" HREF -\fBpcreunicode\fP -.\" -page. -.sp - PCRE_NO_UTF8_CHECK -.sp -When PCRE_UTF8 is set, the validity of the pattern as a UTF-8 string is -automatically checked. There is a discussion about the -.\" HTML -.\" -validity of UTF-8 strings -.\" -in the -.\" HREF -\fBpcreunicode\fP -.\" -page. If an invalid UTF-8 sequence is found, \fBpcre_compile()\fP returns an -error. If you already know that your pattern is valid, and you want to skip -this check for performance reasons, you can set the PCRE_NO_UTF8_CHECK option. -When it is set, the effect of passing an invalid UTF-8 string as a pattern is -undefined. It may cause your program to crash or loop. Note that this option -can also be passed to \fBpcre_exec()\fP and \fBpcre_dfa_exec()\fP, to suppress -the validity checking of subject strings only. If the same string is being -matched many times, the option can be safely set for the second and subsequent -matchings to improve performance. -. -. -.SH "COMPILATION ERROR CODES" -.rs -.sp -The following table lists the error codes than may be returned by -\fBpcre_compile2()\fP, along with the error messages that may be returned by -both compiling functions. Note that error messages are always 8-bit ASCII -strings, even in 16-bit or 32-bit mode. As PCRE has developed, some error codes -have fallen out of use. To avoid confusion, they have not been re-used. -.sp - 0 no error - 1 \e at end of pattern - 2 \ec at end of pattern - 3 unrecognized character follows \e - 4 numbers out of order in {} quantifier - 5 number too big in {} quantifier - 6 missing terminating ] for character class - 7 invalid escape sequence in character class - 8 range out of order in character class - 9 nothing to repeat - 10 [this code is not in use] - 11 internal error: unexpected repeat - 12 unrecognized character after (? or (?- - 13 POSIX named classes are supported only within a class - 14 missing ) - 15 reference to non-existent subpattern - 16 erroffset passed as NULL - 17 unknown option bit(s) set - 18 missing ) after comment - 19 [this code is not in use] - 20 regular expression is too large - 21 failed to get memory - 22 unmatched parentheses - 23 internal error: code overflow - 24 unrecognized character after (?< - 25 lookbehind assertion is not fixed length - 26 malformed number or name after (?( - 27 conditional group contains more than two branches - 28 assertion expected after (?( - 29 (?R or (?[+-]digits must be followed by ) - 30 unknown POSIX class name - 31 POSIX collating elements are not supported - 32 this version of PCRE is compiled without UTF support - 33 [this code is not in use] - 34 character value in \ex{} or \eo{} is too large - 35 invalid condition (?(0) - 36 \eC not allowed in lookbehind assertion - 37 PCRE does not support \eL, \el, \eN{name}, \eU, or \eu - 38 number after (?C is > 255 - 39 closing ) for (?C expected - 40 recursive call could loop indefinitely - 41 unrecognized character after (?P - 42 syntax error in subpattern name (missing terminator) - 43 two named subpatterns have the same name - 44 invalid UTF-8 string (specifically UTF-8) - 45 support for \eP, \ep, and \eX has not been compiled - 46 malformed \eP or \ep sequence - 47 unknown property name after \eP or \ep - 48 subpattern name is too long (maximum 32 characters) - 49 too many named subpatterns (maximum 10000) - 50 [this code is not in use] - 51 octal value is greater than \e377 in 8-bit non-UTF-8 mode - 52 internal error: overran compiling workspace - 53 internal error: previously-checked referenced subpattern - not found - 54 DEFINE group contains more than one branch - 55 repeating a DEFINE group is not allowed - 56 inconsistent NEWLINE options - 57 \eg is not followed by a braced, angle-bracketed, or quoted - name/number or by a plain number - 58 a numbered reference must not be zero - 59 an argument is not allowed for (*ACCEPT), (*FAIL), or (*COMMIT) - 60 (*VERB) not recognized or malformed - 61 number is too big - 62 subpattern name expected - 63 digit expected after (?+ - 64 ] is an invalid data character in JavaScript compatibility mode - 65 different names for subpatterns of the same number are - not allowed - 66 (*MARK) must have an argument - 67 this version of PCRE is not compiled with Unicode property - support - 68 \ec must be followed by an ASCII character - 69 \ek is not followed by a braced, angle-bracketed, or quoted name - 70 internal error: unknown opcode in find_fixedlength() - 71 \eN is not supported in a class - 72 too many forward references - 73 disallowed Unicode code point (>= 0xd800 && <= 0xdfff) - 74 invalid UTF-16 string (specifically UTF-16) - 75 name is too long in (*MARK), (*PRUNE), (*SKIP), or (*THEN) - 76 character value in \eu.... sequence is too large - 77 invalid UTF-32 string (specifically UTF-32) - 78 setting UTF is disabled by the application - 79 non-hex character in \ex{} (closing brace missing?) - 80 non-octal character in \eo{} (closing brace missing?) - 81 missing opening brace after \eo - 82 parentheses are too deeply nested - 83 invalid range in character class - 84 group name must start with a non-digit - 85 parentheses are too deeply nested (stack check) -.sp -The numbers 32 and 10000 in errors 48 and 49 are defaults; different values may -be used if the limits were changed when PCRE was built. -. -. -.\" HTML -.SH "STUDYING A PATTERN" -.rs -.sp -.nf -.B pcre_extra *pcre_study(const pcre *\fIcode\fP, int \fIoptions\fP, -.B " const char **\fIerrptr\fP);" -.fi -.PP -If a compiled pattern is going to be used several times, it is worth spending -more time analyzing it in order to speed up the time taken for matching. The -function \fBpcre_study()\fP takes a pointer to a compiled pattern as its first -argument. If studying the pattern produces additional information that will -help speed up matching, \fBpcre_study()\fP returns a pointer to a -\fBpcre_extra\fP block, in which the \fIstudy_data\fP field points to the -results of the study. -.P -The returned value from \fBpcre_study()\fP can be passed directly to -\fBpcre_exec()\fP or \fBpcre_dfa_exec()\fP. However, a \fBpcre_extra\fP block -also contains other fields that can be set by the caller before the block is -passed; these are described -.\" HTML -.\" -below -.\" -in the section on matching a pattern. -.P -If studying the pattern does not produce any useful information, -\fBpcre_study()\fP returns NULL by default. In that circumstance, if the -calling program wants to pass any of the other fields to \fBpcre_exec()\fP or -\fBpcre_dfa_exec()\fP, it must set up its own \fBpcre_extra\fP block. However, -if \fBpcre_study()\fP is called with the PCRE_STUDY_EXTRA_NEEDED option, it -returns a \fBpcre_extra\fP block even if studying did not find any additional -information. It may still return NULL, however, if an error occurs in -\fBpcre_study()\fP. -.P -The second argument of \fBpcre_study()\fP contains option bits. There are three -further options in addition to PCRE_STUDY_EXTRA_NEEDED: -.sp - PCRE_STUDY_JIT_COMPILE - PCRE_STUDY_JIT_PARTIAL_HARD_COMPILE - PCRE_STUDY_JIT_PARTIAL_SOFT_COMPILE -.sp -If any of these are set, and the just-in-time compiler is available, the -pattern is further compiled into machine code that executes much faster than -the \fBpcre_exec()\fP interpretive matching function. If the just-in-time -compiler is not available, these options are ignored. All undefined bits in the -\fIoptions\fP argument must be zero. -.P -JIT compilation is a heavyweight optimization. It can take some time for -patterns to be analyzed, and for one-off matches and simple patterns the -benefit of faster execution might be offset by a much slower study time. -Not all patterns can be optimized by the JIT compiler. For those that cannot be -handled, matching automatically falls back to the \fBpcre_exec()\fP -interpreter. For more details, see the -.\" HREF -\fBpcrejit\fP -.\" -documentation. -.P -The third argument for \fBpcre_study()\fP is a pointer for an error message. If -studying succeeds (even if no data is returned), the variable it points to is -set to NULL. Otherwise it is set to point to a textual error message. This is a -static string that is part of the library. You must not try to free it. You -should test the error pointer for NULL after calling \fBpcre_study()\fP, to be -sure that it has run successfully. -.P -When you are finished with a pattern, you can free the memory used for the -study data by calling \fBpcre_free_study()\fP. This function was added to the -API for release 8.20. For earlier versions, the memory could be freed with -\fBpcre_free()\fP, just like the pattern itself. This will still work in cases -where JIT optimization is not used, but it is advisable to change to the new -function when convenient. -.P -This is a typical way in which \fBpcre_study\fP() is used (except that in a -real application there should be tests for errors): -.sp - int rc; - pcre *re; - pcre_extra *sd; - re = pcre_compile("pattern", 0, &error, &erroroffset, NULL); - sd = pcre_study( - re, /* result of pcre_compile() */ - 0, /* no options */ - &error); /* set to NULL or points to a message */ - rc = pcre_exec( /* see below for details of pcre_exec() options */ - re, sd, "subject", 7, 0, 0, ovector, 30); - ... - pcre_free_study(sd); - pcre_free(re); -.sp -Studying a pattern does two things: first, a lower bound for the length of -subject string that is needed to match the pattern is computed. This does not -mean that there are any strings of that length that match, but it does -guarantee that no shorter strings match. The value is used to avoid wasting -time by trying to match strings that are shorter than the lower bound. You can -find out the value in a calling program via the \fBpcre_fullinfo()\fP function. -.P -Studying a pattern is also useful for non-anchored patterns that do not have a -single fixed starting character. A bitmap of possible starting bytes is -created. This speeds up finding a position in the subject at which to start -matching. (In 16-bit mode, the bitmap is used for 16-bit values less than 256. -In 32-bit mode, the bitmap is used for 32-bit values less than 256.) -.P -These two optimizations apply to both \fBpcre_exec()\fP and -\fBpcre_dfa_exec()\fP, and the information is also used by the JIT compiler. -The optimizations can be disabled by setting the PCRE_NO_START_OPTIMIZE option. -You might want to do this if your pattern contains callouts or (*MARK) and you -want to make use of these facilities in cases where matching fails. -.P -PCRE_NO_START_OPTIMIZE can be specified at either compile time or execution -time. However, if PCRE_NO_START_OPTIMIZE is passed to \fBpcre_exec()\fP, (that -is, after any JIT compilation has happened) JIT execution is disabled. For JIT -execution to work with PCRE_NO_START_OPTIMIZE, the option must be set at -compile time. -.P -There is a longer discussion of PCRE_NO_START_OPTIMIZE -.\" HTML -.\" -below. -.\" -. -. -.\" HTML -.SH "LOCALE SUPPORT" -.rs -.sp -PCRE handles caseless matching, and determines whether characters are letters, -digits, or whatever, by reference to a set of tables, indexed by character -code point. When running in UTF-8 mode, or in the 16- or 32-bit libraries, this -applies only to characters with code points less than 256. By default, -higher-valued code points never match escapes such as \ew or \ed. However, if -PCRE is built with Unicode property support, all characters can be tested with -\ep and \eP, or, alternatively, the PCRE_UCP option can be set when a pattern -is compiled; this causes \ew and friends to use Unicode property support -instead of the built-in tables. -.P -The use of locales with Unicode is discouraged. If you are handling characters -with code points greater than 128, you should either use Unicode support, or -use locales, but not try to mix the two. -.P -PCRE contains an internal set of tables that are used when the final argument -of \fBpcre_compile()\fP is NULL. These are sufficient for many applications. -Normally, the internal tables recognize only ASCII characters. However, when -PCRE is built, it is possible to cause the internal tables to be rebuilt in the -default "C" locale of the local system, which may cause them to be different. -.P -The internal tables can always be overridden by tables supplied by the -application that calls PCRE. These may be created in a different locale from -the default. As more and more applications change to using Unicode, the need -for this locale support is expected to die away. -.P -External tables are built by calling the \fBpcre_maketables()\fP function, -which has no arguments, in the relevant locale. The result can then be passed -to \fBpcre_compile()\fP as often as necessary. For example, to build and use -tables that are appropriate for the French locale (where accented characters -with values greater than 128 are treated as letters), the following code could -be used: -.sp - setlocale(LC_CTYPE, "fr_FR"); - tables = pcre_maketables(); - re = pcre_compile(..., tables); -.sp -The locale name "fr_FR" is used on Linux and other Unix-like systems; if you -are using Windows, the name for the French locale is "french". -.P -When \fBpcre_maketables()\fP runs, the tables are built in memory that is -obtained via \fBpcre_malloc\fP. It is the caller's responsibility to ensure -that the memory containing the tables remains available for as long as it is -needed. -.P -The pointer that is passed to \fBpcre_compile()\fP is saved with the compiled -pattern, and the same tables are used via this pointer by \fBpcre_study()\fP -and also by \fBpcre_exec()\fP and \fBpcre_dfa_exec()\fP. Thus, for any single -pattern, compilation, studying and matching all happen in the same locale, but -different patterns can be processed in different locales. -.P -It is possible to pass a table pointer or NULL (indicating the use of the -internal tables) to \fBpcre_exec()\fP or \fBpcre_dfa_exec()\fP (see the -discussion below in the section on matching a pattern). This facility is -provided for use with pre-compiled patterns that have been saved and reloaded. -Character tables are not saved with patterns, so if a non-standard table was -used at compile time, it must be provided again when the reloaded pattern is -matched. Attempting to use this facility to match a pattern in a different -locale from the one in which it was compiled is likely to lead to anomalous -(usually incorrect) results. -. -. -.\" HTML -.SH "INFORMATION ABOUT A PATTERN" -.rs -.sp -.nf -.B int pcre_fullinfo(const pcre *\fIcode\fP, "const pcre_extra *\fIextra\fP," -.B " int \fIwhat\fP, void *\fIwhere\fP);" -.fi -.PP -The \fBpcre_fullinfo()\fP function returns information about a compiled -pattern. It replaces the \fBpcre_info()\fP function, which was removed from the -library at version 8.30, after more than 10 years of obsolescence. -.P -The first argument for \fBpcre_fullinfo()\fP is a pointer to the compiled -pattern. The second argument is the result of \fBpcre_study()\fP, or NULL if -the pattern was not studied. The third argument specifies which piece of -information is required, and the fourth argument is a pointer to a variable -to receive the data. The yield of the function is zero for success, or one of -the following negative numbers: -.sp - PCRE_ERROR_NULL the argument \fIcode\fP was NULL - the argument \fIwhere\fP was NULL - PCRE_ERROR_BADMAGIC the "magic number" was not found - PCRE_ERROR_BADENDIANNESS the pattern was compiled with different - endianness - PCRE_ERROR_BADOPTION the value of \fIwhat\fP was invalid - PCRE_ERROR_UNSET the requested field is not set -.sp -The "magic number" is placed at the start of each compiled pattern as an simple -check against passing an arbitrary memory pointer. The endianness error can -occur if a compiled pattern is saved and reloaded on a different host. Here is -a typical call of \fBpcre_fullinfo()\fP, to obtain the length of the compiled -pattern: -.sp - int rc; - size_t length; - rc = pcre_fullinfo( - re, /* result of pcre_compile() */ - sd, /* result of pcre_study(), or NULL */ - PCRE_INFO_SIZE, /* what is required */ - &length); /* where to put the data */ -.sp -The possible values for the third argument are defined in \fBpcre.h\fP, and are -as follows: -.sp - PCRE_INFO_BACKREFMAX -.sp -Return the number of the highest back reference in the pattern. The fourth -argument should point to an \fBint\fP variable. Zero is returned if there are -no back references. -.sp - PCRE_INFO_CAPTURECOUNT -.sp -Return the number of capturing subpatterns in the pattern. The fourth argument -should point to an \fBint\fP variable. -.sp - PCRE_INFO_DEFAULT_TABLES -.sp -Return a pointer to the internal default character tables within PCRE. The -fourth argument should point to an \fBunsigned char *\fP variable. This -information call is provided for internal use by the \fBpcre_study()\fP -function. External callers can cause PCRE to use its internal tables by passing -a NULL table pointer. -.sp - PCRE_INFO_FIRSTBYTE (deprecated) -.sp -Return information about the first data unit of any matched string, for a -non-anchored pattern. The name of this option refers to the 8-bit library, -where data units are bytes. The fourth argument should point to an \fBint\fP -variable. Negative values are used for special cases. However, this means that -when the 32-bit library is in non-UTF-32 mode, the full 32-bit range of -characters cannot be returned. For this reason, this value is deprecated; use -PCRE_INFO_FIRSTCHARACTERFLAGS and PCRE_INFO_FIRSTCHARACTER instead. -.P -If there is a fixed first value, for example, the letter "c" from a pattern -such as (cat|cow|coyote), its value is returned. In the 8-bit library, the -value is always less than 256. In the 16-bit library the value can be up to -0xffff. In the 32-bit library the value can be up to 0x10ffff. -.P -If there is no fixed first value, and if either -.sp -(a) the pattern was compiled with the PCRE_MULTILINE option, and every branch -starts with "^", or -.sp -(b) every branch of the pattern starts with ".*" and PCRE_DOTALL is not set -(if it were set, the pattern would be anchored), -.sp --1 is returned, indicating that the pattern matches only at the start of a -subject string or after any newline within the string. Otherwise -2 is -returned. For anchored patterns, -2 is returned. -.sp - PCRE_INFO_FIRSTCHARACTER -.sp -Return the value of the first data unit (non-UTF character) of any matched -string in the situation where PCRE_INFO_FIRSTCHARACTERFLAGS returns 1; -otherwise return 0. The fourth argument should point to an \fBuint_t\fP -variable. -.P -In the 8-bit library, the value is always less than 256. In the 16-bit library -the value can be up to 0xffff. In the 32-bit library in UTF-32 mode the value -can be up to 0x10ffff, and up to 0xffffffff when not using UTF-32 mode. -.sp - PCRE_INFO_FIRSTCHARACTERFLAGS -.sp -Return information about the first data unit of any matched string, for a -non-anchored pattern. The fourth argument should point to an \fBint\fP -variable. -.P -If there is a fixed first value, for example, the letter "c" from a pattern -such as (cat|cow|coyote), 1 is returned, and the character value can be -retrieved using PCRE_INFO_FIRSTCHARACTER. If there is no fixed first value, and -if either -.sp -(a) the pattern was compiled with the PCRE_MULTILINE option, and every branch -starts with "^", or -.sp -(b) every branch of the pattern starts with ".*" and PCRE_DOTALL is not set -(if it were set, the pattern would be anchored), -.sp -2 is returned, indicating that the pattern matches only at the start of a -subject string or after any newline within the string. Otherwise 0 is -returned. For anchored patterns, 0 is returned. -.sp - PCRE_INFO_FIRSTTABLE -.sp -If the pattern was studied, and this resulted in the construction of a 256-bit -table indicating a fixed set of values for the first data unit in any matching -string, a pointer to the table is returned. Otherwise NULL is returned. The -fourth argument should point to an \fBunsigned char *\fP variable. -.sp - PCRE_INFO_HASCRORLF -.sp -Return 1 if the pattern contains any explicit matches for CR or LF characters, -otherwise 0. The fourth argument should point to an \fBint\fP variable. An -explicit match is either a literal CR or LF character, or \er or \en. -.sp - PCRE_INFO_JCHANGED -.sp -Return 1 if the (?J) or (?-J) option setting is used in the pattern, otherwise -0. The fourth argument should point to an \fBint\fP variable. (?J) and -(?-J) set and unset the local PCRE_DUPNAMES option, respectively. -.sp - PCRE_INFO_JIT -.sp -Return 1 if the pattern was studied with one of the JIT options, and -just-in-time compiling was successful. The fourth argument should point to an -\fBint\fP variable. A return value of 0 means that JIT support is not available -in this version of PCRE, or that the pattern was not studied with a JIT option, -or that the JIT compiler could not handle this particular pattern. See the -.\" HREF -\fBpcrejit\fP -.\" -documentation for details of what can and cannot be handled. -.sp - PCRE_INFO_JITSIZE -.sp -If the pattern was successfully studied with a JIT option, return the size of -the JIT compiled code, otherwise return zero. The fourth argument should point -to a \fBsize_t\fP variable. -.sp - PCRE_INFO_LASTLITERAL -.sp -Return the value of the rightmost literal data unit that must exist in any -matched string, other than at its start, if such a value has been recorded. The -fourth argument should point to an \fBint\fP variable. If there is no such -value, -1 is returned. For anchored patterns, a last literal value is recorded -only if it follows something of variable length. For example, for the pattern -/^a\ed+z\ed+/ the returned value is "z", but for /^a\edz\ed/ the returned value -is -1. -.P -Since for the 32-bit library using the non-UTF-32 mode, this function is unable -to return the full 32-bit range of characters, this value is deprecated; -instead the PCRE_INFO_REQUIREDCHARFLAGS and PCRE_INFO_REQUIREDCHAR values should -be used. -.sp - PCRE_INFO_MATCH_EMPTY -.sp -Return 1 if the pattern can match an empty string, otherwise 0. The fourth -argument should point to an \fBint\fP variable. -.sp - PCRE_INFO_MATCHLIMIT -.sp -If the pattern set a match limit by including an item of the form -(*LIMIT_MATCH=nnnn) at the start, the value is returned. The fourth argument -should point to an unsigned 32-bit integer. If no such value has been set, the -call to \fBpcre_fullinfo()\fP returns the error PCRE_ERROR_UNSET. -.sp - PCRE_INFO_MAXLOOKBEHIND -.sp -Return the number of characters (NB not data units) in the longest lookbehind -assertion in the pattern. This information is useful when doing multi-segment -matching using the partial matching facilities. Note that the simple assertions -\eb and \eB require a one-character lookbehind. \eA also registers a -one-character lookbehind, though it does not actually inspect the previous -character. This is to ensure that at least one character from the old segment -is retained when a new segment is processed. Otherwise, if there are no -lookbehinds in the pattern, \eA might match incorrectly at the start of a new -segment. -.sp - PCRE_INFO_MINLENGTH -.sp -If the pattern was studied and a minimum length for matching subject strings -was computed, its value is returned. Otherwise the returned value is -1. The -value is a number of characters, which in UTF mode may be different from the -number of data units. The fourth argument should point to an \fBint\fP -variable. A non-negative value is a lower bound to the length of any matching -string. There may not be any strings of that length that do actually match, but -every string that does match is at least that long. -.sp - PCRE_INFO_NAMECOUNT - PCRE_INFO_NAMEENTRYSIZE - PCRE_INFO_NAMETABLE -.sp -PCRE supports the use of named as well as numbered capturing parentheses. The -names are just an additional way of identifying the parentheses, which still -acquire numbers. Several convenience functions such as -\fBpcre_get_named_substring()\fP are provided for extracting captured -substrings by name. It is also possible to extract the data directly, by first -converting the name to a number in order to access the correct pointers in the -output vector (described with \fBpcre_exec()\fP below). To do the conversion, -you need to use the name-to-number map, which is described by these three -values. -.P -The map consists of a number of fixed-size entries. PCRE_INFO_NAMECOUNT gives -the number of entries, and PCRE_INFO_NAMEENTRYSIZE gives the size of each -entry; both of these return an \fBint\fP value. The entry size depends on the -length of the longest name. PCRE_INFO_NAMETABLE returns a pointer to the first -entry of the table. This is a pointer to \fBchar\fP in the 8-bit library, where -the first two bytes of each entry are the number of the capturing parenthesis, -most significant byte first. In the 16-bit library, the pointer points to -16-bit data units, the first of which contains the parenthesis number. In the -32-bit library, the pointer points to 32-bit data units, the first of which -contains the parenthesis number. The rest of the entry is the corresponding -name, zero terminated. -.P -The names are in alphabetical order. If (?| is used to create multiple groups -with the same number, as described in the -.\" HTML -.\" -section on duplicate subpattern numbers -.\" -in the -.\" HREF -\fBpcrepattern\fP -.\" -page, the groups may be given the same name, but there is only one entry in the -table. Different names for groups of the same number are not permitted. -Duplicate names for subpatterns with different numbers are permitted, -but only if PCRE_DUPNAMES is set. They appear in the table in the order in -which they were found in the pattern. In the absence of (?| this is the order -of increasing number; when (?| is used this is not necessarily the case because -later subpatterns may have lower numbers. -.P -As a simple example of the name/number table, consider the following pattern -after compilation by the 8-bit library (assume PCRE_EXTENDED is set, so white -space - including newlines - is ignored): -.sp -.\" JOIN - (? (?(\ed\ed)?\ed\ed) - - (?\ed\ed) - (?\ed\ed) ) -.sp -There are four named subpatterns, so the table has four entries, and each entry -in the table is eight bytes long. The table is as follows, with non-printing -bytes shows in hexadecimal, and undefined bytes shown as ??: -.sp - 00 01 d a t e 00 ?? - 00 05 d a y 00 ?? ?? - 00 04 m o n t h 00 - 00 02 y e a r 00 ?? -.sp -When writing code to extract data from named subpatterns using the -name-to-number map, remember that the length of the entries is likely to be -different for each compiled pattern. -.sp - PCRE_INFO_OKPARTIAL -.sp -Return 1 if the pattern can be used for partial matching with -\fBpcre_exec()\fP, otherwise 0. The fourth argument should point to an -\fBint\fP variable. From release 8.00, this always returns 1, because the -restrictions that previously applied to partial matching have been lifted. The -.\" HREF -\fBpcrepartial\fP -.\" -documentation gives details of partial matching. -.sp - PCRE_INFO_OPTIONS -.sp -Return a copy of the options with which the pattern was compiled. The fourth -argument should point to an \fBunsigned long int\fP variable. These option bits -are those specified in the call to \fBpcre_compile()\fP, modified by any -top-level option settings at the start of the pattern itself. In other words, -they are the options that will be in force when matching starts. For example, -if the pattern /(?im)abc(?-i)d/ is compiled with the PCRE_EXTENDED option, the -result is PCRE_CASELESS, PCRE_MULTILINE, and PCRE_EXTENDED. -.P -A pattern is automatically anchored by PCRE if all of its top-level -alternatives begin with one of the following: -.sp - ^ unless PCRE_MULTILINE is set - \eA always - \eG always -.\" JOIN - .* if PCRE_DOTALL is set and there are no back - references to the subpattern in which .* appears -.sp -For such patterns, the PCRE_ANCHORED bit is set in the options returned by -\fBpcre_fullinfo()\fP. -.sp - PCRE_INFO_RECURSIONLIMIT -.sp -If the pattern set a recursion limit by including an item of the form -(*LIMIT_RECURSION=nnnn) at the start, the value is returned. The fourth -argument should point to an unsigned 32-bit integer. If no such value has been -set, the call to \fBpcre_fullinfo()\fP returns the error PCRE_ERROR_UNSET. -.sp - PCRE_INFO_SIZE -.sp -Return the size of the compiled pattern in bytes (for all three libraries). The -fourth argument should point to a \fBsize_t\fP variable. This value does not -include the size of the \fBpcre\fP structure that is returned by -\fBpcre_compile()\fP. The value that is passed as the argument to -\fBpcre_malloc()\fP when \fBpcre_compile()\fP is getting memory in which to -place the compiled data is the value returned by this option plus the size of -the \fBpcre\fP structure. Studying a compiled pattern, with or without JIT, -does not alter the value returned by this option. -.sp - PCRE_INFO_STUDYSIZE -.sp -Return the size in bytes (for all three libraries) of the data block pointed to -by the \fIstudy_data\fP field in a \fBpcre_extra\fP block. If \fBpcre_extra\fP -is NULL, or there is no study data, zero is returned. The fourth argument -should point to a \fBsize_t\fP variable. The \fIstudy_data\fP field is set by -\fBpcre_study()\fP to record information that will speed up matching (see the -section entitled -.\" HTML -.\" -"Studying a pattern" -.\" -above). The format of the \fIstudy_data\fP block is private, but its length -is made available via this option so that it can be saved and restored (see the -.\" HREF -\fBpcreprecompile\fP -.\" -documentation for details). -.sp - PCRE_INFO_REQUIREDCHARFLAGS -.sp -Returns 1 if there is a rightmost literal data unit that must exist in any -matched string, other than at its start. The fourth argument should point to -an \fBint\fP variable. If there is no such value, 0 is returned. If returning -1, the character value itself can be retrieved using PCRE_INFO_REQUIREDCHAR. -.P -For anchored patterns, a last literal value is recorded only if it follows -something of variable length. For example, for the pattern /^a\ed+z\ed+/ the -returned value 1 (with "z" returned from PCRE_INFO_REQUIREDCHAR), but for -/^a\edz\ed/ the returned value is 0. -.sp - PCRE_INFO_REQUIREDCHAR -.sp -Return the value of the rightmost literal data unit that must exist in any -matched string, other than at its start, if such a value has been recorded. The -fourth argument should point to an \fBuint32_t\fP variable. If there is no such -value, 0 is returned. -. -. -.SH "REFERENCE COUNTS" -.rs -.sp -.B int pcre_refcount(pcre *\fIcode\fP, int \fIadjust\fP); -.PP -The \fBpcre_refcount()\fP function is used to maintain a reference count in the -data block that contains a compiled pattern. It is provided for the benefit of -applications that operate in an object-oriented manner, where different parts -of the application may be using the same compiled pattern, but you want to free -the block when they are all done. -.P -When a pattern is compiled, the reference count field is initialized to zero. -It is changed only by calling this function, whose action is to add the -\fIadjust\fP value (which may be positive or negative) to it. The yield of the -function is the new value. However, the value of the count is constrained to -lie between 0 and 65535, inclusive. If the new value is outside these limits, -it is forced to the appropriate limit value. -.P -Except when it is zero, the reference count is not correctly preserved if a -pattern is compiled on one host and then transferred to a host whose byte-order -is different. (This seems a highly unlikely scenario.) -. -. -.SH "MATCHING A PATTERN: THE TRADITIONAL FUNCTION" -.rs -.sp -.nf -.B int pcre_exec(const pcre *\fIcode\fP, "const pcre_extra *\fIextra\fP," -.B " const char *\fIsubject\fP," int \fIlength\fP, int \fIstartoffset\fP, -.B " int \fIoptions\fP, int *\fIovector\fP, int \fIovecsize\fP);" -.fi -.P -The function \fBpcre_exec()\fP is called to match a subject string against a -compiled pattern, which is passed in the \fIcode\fP argument. If the -pattern was studied, the result of the study should be passed in the -\fIextra\fP argument. You can call \fBpcre_exec()\fP with the same \fIcode\fP -and \fIextra\fP arguments as many times as you like, in order to match -different subject strings with the same pattern. -.P -This function is the main matching facility of the library, and it operates in -a Perl-like manner. For specialist use there is also an alternative matching -function, which is described -.\" HTML -.\" -below -.\" -in the section about the \fBpcre_dfa_exec()\fP function. -.P -In most applications, the pattern will have been compiled (and optionally -studied) in the same process that calls \fBpcre_exec()\fP. However, it is -possible to save compiled patterns and study data, and then use them later -in different processes, possibly even on different hosts. For a discussion -about this, see the -.\" HREF -\fBpcreprecompile\fP -.\" -documentation. -.P -Here is an example of a simple call to \fBpcre_exec()\fP: -.sp - int rc; - int ovector[30]; - rc = pcre_exec( - re, /* result of pcre_compile() */ - NULL, /* we didn't study the pattern */ - "some string", /* the subject string */ - 11, /* the length of the subject string */ - 0, /* start at offset 0 in the subject */ - 0, /* default options */ - ovector, /* vector of integers for substring information */ - 30); /* number of elements (NOT size in bytes) */ -. -. -.\" HTML -.SS "Extra data for \fBpcre_exec()\fR" -.rs -.sp -If the \fIextra\fP argument is not NULL, it must point to a \fBpcre_extra\fP -data block. The \fBpcre_study()\fP function returns such a block (when it -doesn't return NULL), but you can also create one for yourself, and pass -additional information in it. The \fBpcre_extra\fP block contains the following -fields (not necessarily in this order): -.sp - unsigned long int \fIflags\fP; - void *\fIstudy_data\fP; - void *\fIexecutable_jit\fP; - unsigned long int \fImatch_limit\fP; - unsigned long int \fImatch_limit_recursion\fP; - void *\fIcallout_data\fP; - const unsigned char *\fItables\fP; - unsigned char **\fImark\fP; -.sp -In the 16-bit version of this structure, the \fImark\fP field has type -"PCRE_UCHAR16 **". -.sp -In the 32-bit version of this structure, the \fImark\fP field has type -"PCRE_UCHAR32 **". -.P -The \fIflags\fP field is used to specify which of the other fields are set. The -flag bits are: -.sp - PCRE_EXTRA_CALLOUT_DATA - PCRE_EXTRA_EXECUTABLE_JIT - PCRE_EXTRA_MARK - PCRE_EXTRA_MATCH_LIMIT - PCRE_EXTRA_MATCH_LIMIT_RECURSION - PCRE_EXTRA_STUDY_DATA - PCRE_EXTRA_TABLES -.sp -Other flag bits should be set to zero. The \fIstudy_data\fP field and sometimes -the \fIexecutable_jit\fP field are set in the \fBpcre_extra\fP block that is -returned by \fBpcre_study()\fP, together with the appropriate flag bits. You -should not set these yourself, but you may add to the block by setting other -fields and their corresponding flag bits. -.P -The \fImatch_limit\fP field provides a means of preventing PCRE from using up a -vast amount of resources when running patterns that are not going to match, -but which have a very large number of possibilities in their search trees. The -classic example is a pattern that uses nested unlimited repeats. -.P -Internally, \fBpcre_exec()\fP uses a function called \fBmatch()\fP, which it -calls repeatedly (sometimes recursively). The limit set by \fImatch_limit\fP is -imposed on the number of times this function is called during a match, which -has the effect of limiting the amount of backtracking that can take place. For -patterns that are not anchored, the count restarts from zero for each position -in the subject string. -.P -When \fBpcre_exec()\fP is called with a pattern that was successfully studied -with a JIT option, the way that the matching is executed is entirely different. -However, there is still the possibility of runaway matching that goes on for a -very long time, and so the \fImatch_limit\fP value is also used in this case -(but in a different way) to limit how long the matching can continue. -.P -The default value for the limit can be set when PCRE is built; the default -default is 10 million, which handles all but the most extreme cases. You can -override the default by suppling \fBpcre_exec()\fP with a \fBpcre_extra\fP -block in which \fImatch_limit\fP is set, and PCRE_EXTRA_MATCH_LIMIT is set in -the \fIflags\fP field. If the limit is exceeded, \fBpcre_exec()\fP returns -PCRE_ERROR_MATCHLIMIT. -.P -A value for the match limit may also be supplied by an item at the start of a -pattern of the form -.sp - (*LIMIT_MATCH=d) -.sp -where d is a decimal number. However, such a setting is ignored unless d is -less than the limit set by the caller of \fBpcre_exec()\fP or, if no such limit -is set, less than the default. -.P -The \fImatch_limit_recursion\fP field is similar to \fImatch_limit\fP, but -instead of limiting the total number of times that \fBmatch()\fP is called, it -limits the depth of recursion. The recursion depth is a smaller number than the -total number of calls, because not all calls to \fBmatch()\fP are recursive. -This limit is of use only if it is set smaller than \fImatch_limit\fP. -.P -Limiting the recursion depth limits the amount of machine stack that can be -used, or, when PCRE has been compiled to use memory on the heap instead of the -stack, the amount of heap memory that can be used. This limit is not relevant, -and is ignored, when matching is done using JIT compiled code. -.P -The default value for \fImatch_limit_recursion\fP can be set when PCRE is -built; the default default is the same value as the default for -\fImatch_limit\fP. You can override the default by suppling \fBpcre_exec()\fP -with a \fBpcre_extra\fP block in which \fImatch_limit_recursion\fP is set, and -PCRE_EXTRA_MATCH_LIMIT_RECURSION is set in the \fIflags\fP field. If the limit -is exceeded, \fBpcre_exec()\fP returns PCRE_ERROR_RECURSIONLIMIT. -.P -A value for the recursion limit may also be supplied by an item at the start of -a pattern of the form -.sp - (*LIMIT_RECURSION=d) -.sp -where d is a decimal number. However, such a setting is ignored unless d is -less than the limit set by the caller of \fBpcre_exec()\fP or, if no such limit -is set, less than the default. -.P -The \fIcallout_data\fP field is used in conjunction with the "callout" feature, -and is described in the -.\" HREF -\fBpcrecallout\fP -.\" -documentation. -.P -The \fItables\fP field is provided for use with patterns that have been -pre-compiled using custom character tables, saved to disc or elsewhere, and -then reloaded, because the tables that were used to compile a pattern are not -saved with it. See the -.\" HREF -\fBpcreprecompile\fP -.\" -documentation for a discussion of saving compiled patterns for later use. If -NULL is passed using this mechanism, it forces PCRE's internal tables to be -used. -.P -\fBWarning:\fP The tables that \fBpcre_exec()\fP uses must be the same as those -that were used when the pattern was compiled. If this is not the case, the -behaviour of \fBpcre_exec()\fP is undefined. Therefore, when a pattern is -compiled and matched in the same process, this field should never be set. In -this (the most common) case, the correct table pointer is automatically passed -with the compiled pattern from \fBpcre_compile()\fP to \fBpcre_exec()\fP. -.P -If PCRE_EXTRA_MARK is set in the \fIflags\fP field, the \fImark\fP field must -be set to point to a suitable variable. If the pattern contains any -backtracking control verbs such as (*MARK:NAME), and the execution ends up with -a name to pass back, a pointer to the name string (zero terminated) is placed -in the variable pointed to by the \fImark\fP field. The names are within the -compiled pattern; if you wish to retain such a name you must copy it before -freeing the memory of a compiled pattern. If there is no name to pass back, the -variable pointed to by the \fImark\fP field is set to NULL. For details of the -backtracking control verbs, see the section entitled -.\" HTML -.\" -"Backtracking control" -.\" -in the -.\" HREF -\fBpcrepattern\fP -.\" -documentation. -. -. -.\" HTML -.SS "Option bits for \fBpcre_exec()\fP" -.rs -.sp -The unused bits of the \fIoptions\fP argument for \fBpcre_exec()\fP must be -zero. The only bits that may be set are PCRE_ANCHORED, PCRE_NEWLINE_\fIxxx\fP, -PCRE_NOTBOL, PCRE_NOTEOL, PCRE_NOTEMPTY, PCRE_NOTEMPTY_ATSTART, -PCRE_NO_START_OPTIMIZE, PCRE_NO_UTF8_CHECK, PCRE_PARTIAL_HARD, and -PCRE_PARTIAL_SOFT. -.P -If the pattern was successfully studied with one of the just-in-time (JIT) -compile options, the only supported options for JIT execution are -PCRE_NO_UTF8_CHECK, PCRE_NOTBOL, PCRE_NOTEOL, PCRE_NOTEMPTY, -PCRE_NOTEMPTY_ATSTART, PCRE_PARTIAL_HARD, and PCRE_PARTIAL_SOFT. If an -unsupported option is used, JIT execution is disabled and the normal -interpretive code in \fBpcre_exec()\fP is run. -.sp - PCRE_ANCHORED -.sp -The PCRE_ANCHORED option limits \fBpcre_exec()\fP to matching at the first -matching position. If a pattern was compiled with PCRE_ANCHORED, or turned out -to be anchored by virtue of its contents, it cannot be made unachored at -matching time. -.sp - PCRE_BSR_ANYCRLF - PCRE_BSR_UNICODE -.sp -These options (which are mutually exclusive) control what the \eR escape -sequence matches. The choice is either to match only CR, LF, or CRLF, or to -match any Unicode newline sequence. These options override the choice that was -made or defaulted when the pattern was compiled. -.sp - PCRE_NEWLINE_CR - PCRE_NEWLINE_LF - PCRE_NEWLINE_CRLF - PCRE_NEWLINE_ANYCRLF - PCRE_NEWLINE_ANY -.sp -These options override the newline definition that was chosen or defaulted when -the pattern was compiled. For details, see the description of -\fBpcre_compile()\fP above. During matching, the newline choice affects the -behaviour of the dot, circumflex, and dollar metacharacters. It may also alter -the way the match position is advanced after a match failure for an unanchored -pattern. -.P -When PCRE_NEWLINE_CRLF, PCRE_NEWLINE_ANYCRLF, or PCRE_NEWLINE_ANY is set, and a -match attempt for an unanchored pattern fails when the current position is at a -CRLF sequence, and the pattern contains no explicit matches for CR or LF -characters, the match position is advanced by two characters instead of one, in -other words, to after the CRLF. -.P -The above rule is a compromise that makes the most common cases work as -expected. For example, if the pattern is .+A (and the PCRE_DOTALL option is not -set), it does not match the string "\er\enA" because, after failing at the -start, it skips both the CR and the LF before retrying. However, the pattern -[\er\en]A does match that string, because it contains an explicit CR or LF -reference, and so advances only by one character after the first failure. -.P -An explicit match for CR of LF is either a literal appearance of one of those -characters, or one of the \er or \en escape sequences. Implicit matches such as -[^X] do not count, nor does \es (which includes CR and LF in the characters -that it matches). -.P -Notwithstanding the above, anomalous effects may still occur when CRLF is a -valid newline sequence and explicit \er or \en escapes appear in the pattern. -.sp - PCRE_NOTBOL -.sp -This option specifies that first character of the subject string is not the -beginning of a line, so the circumflex metacharacter should not match before -it. Setting this without PCRE_MULTILINE (at compile time) causes circumflex -never to match. This option affects only the behaviour of the circumflex -metacharacter. It does not affect \eA. -.sp - PCRE_NOTEOL -.sp -This option specifies that the end of the subject string is not the end of a -line, so the dollar metacharacter should not match it nor (except in multiline -mode) a newline immediately before it. Setting this without PCRE_MULTILINE (at -compile time) causes dollar never to match. This option affects only the -behaviour of the dollar metacharacter. It does not affect \eZ or \ez. -.sp - PCRE_NOTEMPTY -.sp -An empty string is not considered to be a valid match if this option is set. If -there are alternatives in the pattern, they are tried. If all the alternatives -match the empty string, the entire match fails. For example, if the pattern -.sp - a?b? -.sp -is applied to a string not beginning with "a" or "b", it matches an empty -string at the start of the subject. With PCRE_NOTEMPTY set, this match is not -valid, so PCRE searches further into the string for occurrences of "a" or "b". -.sp - PCRE_NOTEMPTY_ATSTART -.sp -This is like PCRE_NOTEMPTY, except that an empty string match that is not at -the start of the subject is permitted. If the pattern is anchored, such a match -can occur only if the pattern contains \eK. -.P -Perl has no direct equivalent of PCRE_NOTEMPTY or PCRE_NOTEMPTY_ATSTART, but it -does make a special case of a pattern match of the empty string within its -\fBsplit()\fP function, and when using the /g modifier. It is possible to -emulate Perl's behaviour after matching a null string by first trying the match -again at the same offset with PCRE_NOTEMPTY_ATSTART and PCRE_ANCHORED, and then -if that fails, by advancing the starting offset (see below) and trying an -ordinary match again. There is some code that demonstrates how to do this in -the -.\" HREF -\fBpcredemo\fP -.\" -sample program. In the most general case, you have to check to see if the -newline convention recognizes CRLF as a newline, and if so, and the current -character is CR followed by LF, advance the starting offset by two characters -instead of one. -.sp - PCRE_NO_START_OPTIMIZE -.sp -There are a number of optimizations that \fBpcre_exec()\fP uses at the start of -a match, in order to speed up the process. For example, if it is known that an -unanchored match must start with a specific character, it searches the subject -for that character, and fails immediately if it cannot find it, without -actually running the main matching function. This means that a special item -such as (*COMMIT) at the start of a pattern is not considered until after a -suitable starting point for the match has been found. Also, when callouts or -(*MARK) items are in use, these "start-up" optimizations can cause them to be -skipped if the pattern is never actually used. The start-up optimizations are -in effect a pre-scan of the subject that takes place before the pattern is run. -.P -The PCRE_NO_START_OPTIMIZE option disables the start-up optimizations, possibly -causing performance to suffer, but ensuring that in cases where the result is -"no match", the callouts do occur, and that items such as (*COMMIT) and (*MARK) -are considered at every possible starting position in the subject string. If -PCRE_NO_START_OPTIMIZE is set at compile time, it cannot be unset at matching -time. The use of PCRE_NO_START_OPTIMIZE at matching time (that is, passing it -to \fBpcre_exec()\fP) disables JIT execution; in this situation, matching is -always done using interpretively. -.P -Setting PCRE_NO_START_OPTIMIZE can change the outcome of a matching operation. -Consider the pattern -.sp - (*COMMIT)ABC -.sp -When this is compiled, PCRE records the fact that a match must start with the -character "A". Suppose the subject string is "DEFABC". The start-up -optimization scans along the subject, finds "A" and runs the first match -attempt from there. The (*COMMIT) item means that the pattern must match the -current starting position, which in this case, it does. However, if the same -match is run with PCRE_NO_START_OPTIMIZE set, the initial scan along the -subject string does not happen. The first match attempt is run starting from -"D" and when this fails, (*COMMIT) prevents any further matches being tried, so -the overall result is "no match". If the pattern is studied, more start-up -optimizations may be used. For example, a minimum length for the subject may be -recorded. Consider the pattern -.sp - (*MARK:A)(X|Y) -.sp -The minimum length for a match is one character. If the subject is "ABC", there -will be attempts to match "ABC", "BC", "C", and then finally an empty string. -If the pattern is studied, the final attempt does not take place, because PCRE -knows that the subject is too short, and so the (*MARK) is never encountered. -In this case, studying the pattern does not affect the overall match result, -which is still "no match", but it does affect the auxiliary information that is -returned. -.sp - PCRE_NO_UTF8_CHECK -.sp -When PCRE_UTF8 is set at compile time, the validity of the subject as a UTF-8 -string is automatically checked when \fBpcre_exec()\fP is subsequently called. -The entire string is checked before any other processing takes place. The value -of \fIstartoffset\fP is also checked to ensure that it points to the start of a -UTF-8 character. There is a discussion about the -.\" HTML -.\" -validity of UTF-8 strings -.\" -in the -.\" HREF -\fBpcreunicode\fP -.\" -page. If an invalid sequence of bytes is found, \fBpcre_exec()\fP returns the -error PCRE_ERROR_BADUTF8 or, if PCRE_PARTIAL_HARD is set and the problem is a -truncated character at the end of the subject, PCRE_ERROR_SHORTUTF8. In both -cases, information about the precise nature of the error may also be returned -(see the descriptions of these errors in the section entitled \fIError return -values from\fP \fBpcre_exec()\fP -.\" HTML -.\" -below). -.\" -If \fIstartoffset\fP contains a value that does not point to the start of a -UTF-8 character (or to the end of the subject), PCRE_ERROR_BADUTF8_OFFSET is -returned. -.P -If you already know that your subject is valid, and you want to skip these -checks for performance reasons, you can set the PCRE_NO_UTF8_CHECK option when -calling \fBpcre_exec()\fP. You might want to do this for the second and -subsequent calls to \fBpcre_exec()\fP if you are making repeated calls to find -all the matches in a single subject string. However, you should be sure that -the value of \fIstartoffset\fP points to the start of a character (or the end -of the subject). When PCRE_NO_UTF8_CHECK is set, the effect of passing an -invalid string as a subject or an invalid value of \fIstartoffset\fP is -undefined. Your program may crash or loop. -.sp - PCRE_PARTIAL_HARD - PCRE_PARTIAL_SOFT -.sp -These options turn on the partial matching feature. For backwards -compatibility, PCRE_PARTIAL is a synonym for PCRE_PARTIAL_SOFT. A partial match -occurs if the end of the subject string is reached successfully, but there are -not enough subject characters to complete the match. If this happens when -PCRE_PARTIAL_SOFT (but not PCRE_PARTIAL_HARD) is set, matching continues by -testing any remaining alternatives. Only if no complete match can be found is -PCRE_ERROR_PARTIAL returned instead of PCRE_ERROR_NOMATCH. In other words, -PCRE_PARTIAL_SOFT says that the caller is prepared to handle a partial match, -but only if no complete match can be found. -.P -If PCRE_PARTIAL_HARD is set, it overrides PCRE_PARTIAL_SOFT. In this case, if a -partial match is found, \fBpcre_exec()\fP immediately returns -PCRE_ERROR_PARTIAL, without considering any other alternatives. In other words, -when PCRE_PARTIAL_HARD is set, a partial match is considered to be more -important that an alternative complete match. -.P -In both cases, the portion of the string that was inspected when the partial -match was found is set as the first matching string. There is a more detailed -discussion of partial and multi-segment matching, with examples, in the -.\" HREF -\fBpcrepartial\fP -.\" -documentation. -. -. -.SS "The string to be matched by \fBpcre_exec()\fP" -.rs -.sp -The subject string is passed to \fBpcre_exec()\fP as a pointer in -\fIsubject\fP, a length in \fIlength\fP, and a starting offset in -\fIstartoffset\fP. The units for \fIlength\fP and \fIstartoffset\fP are bytes -for the 8-bit library, 16-bit data items for the 16-bit library, and 32-bit -data items for the 32-bit library. -.P -If \fIstartoffset\fP is negative or greater than the length of the subject, -\fBpcre_exec()\fP returns PCRE_ERROR_BADOFFSET. When the starting offset is -zero, the search for a match starts at the beginning of the subject, and this -is by far the most common case. In UTF-8 or UTF-16 mode, the offset must point -to the start of a character, or the end of the subject (in UTF-32 mode, one -data unit equals one character, so all offsets are valid). Unlike the pattern -string, the subject may contain binary zeroes. -.P -A non-zero starting offset is useful when searching for another match in the -same subject by calling \fBpcre_exec()\fP again after a previous success. -Setting \fIstartoffset\fP differs from just passing over a shortened string and -setting PCRE_NOTBOL in the case of a pattern that begins with any kind of -lookbehind. For example, consider the pattern -.sp - \eBiss\eB -.sp -which finds occurrences of "iss" in the middle of words. (\eB matches only if -the current position in the subject is not a word boundary.) When applied to -the string "Mississipi" the first call to \fBpcre_exec()\fP finds the first -occurrence. If \fBpcre_exec()\fP is called again with just the remainder of the -subject, namely "issipi", it does not match, because \eB is always false at the -start of the subject, which is deemed to be a word boundary. However, if -\fBpcre_exec()\fP is passed the entire string again, but with \fIstartoffset\fP -set to 4, it finds the second occurrence of "iss" because it is able to look -behind the starting point to discover that it is preceded by a letter. -.P -Finding all the matches in a subject is tricky when the pattern can match an -empty string. It is possible to emulate Perl's /g behaviour by first trying the -match again at the same offset, with the PCRE_NOTEMPTY_ATSTART and -PCRE_ANCHORED options, and then if that fails, advancing the starting offset -and trying an ordinary match again. There is some code that demonstrates how to -do this in the -.\" HREF -\fBpcredemo\fP -.\" -sample program. In the most general case, you have to check to see if the -newline convention recognizes CRLF as a newline, and if so, and the current -character is CR followed by LF, advance the starting offset by two characters -instead of one. -.P -If a non-zero starting offset is passed when the pattern is anchored, one -attempt to match at the given offset is made. This can only succeed if the -pattern does not require the match to be at the start of the subject. -. -. -.SS "How \fBpcre_exec()\fP returns captured substrings" -.rs -.sp -In general, a pattern matches a certain portion of the subject, and in -addition, further substrings from the subject may be picked out by parts of the -pattern. Following the usage in Jeffrey Friedl's book, this is called -"capturing" in what follows, and the phrase "capturing subpattern" is used for -a fragment of a pattern that picks out a substring. PCRE supports several other -kinds of parenthesized subpattern that do not cause substrings to be captured. -.P -Captured substrings are returned to the caller via a vector of integers whose -address is passed in \fIovector\fP. The number of elements in the vector is -passed in \fIovecsize\fP, which must be a non-negative number. \fBNote\fP: this -argument is NOT the size of \fIovector\fP in bytes. -.P -The first two-thirds of the vector is used to pass back captured substrings, -each substring using a pair of integers. The remaining third of the vector is -used as workspace by \fBpcre_exec()\fP while matching capturing subpatterns, -and is not available for passing back information. The number passed in -\fIovecsize\fP should always be a multiple of three. If it is not, it is -rounded down. -.P -When a match is successful, information about captured substrings is returned -in pairs of integers, starting at the beginning of \fIovector\fP, and -continuing up to two-thirds of its length at the most. The first element of -each pair is set to the offset of the first character in a substring, and the -second is set to the offset of the first character after the end of a -substring. These values are always data unit offsets, even in UTF mode. They -are byte offsets in the 8-bit library, 16-bit data item offsets in the 16-bit -library, and 32-bit data item offsets in the 32-bit library. \fBNote\fP: they -are not character counts. -.P -The first pair of integers, \fIovector[0]\fP and \fIovector[1]\fP, identify the -portion of the subject string matched by the entire pattern. The next pair is -used for the first capturing subpattern, and so on. The value returned by -\fBpcre_exec()\fP is one more than the highest numbered pair that has been set. -For example, if two substrings have been captured, the returned value is 3. If -there are no capturing subpatterns, the return value from a successful match is -1, indicating that just the first pair of offsets has been set. -.P -If a capturing subpattern is matched repeatedly, it is the last portion of the -string that it matched that is returned. -.P -If the vector is too small to hold all the captured substring offsets, it is -used as far as possible (up to two-thirds of its length), and the function -returns a value of zero. If neither the actual string matched nor any captured -substrings are of interest, \fBpcre_exec()\fP may be called with \fIovector\fP -passed as NULL and \fIovecsize\fP as zero. However, if the pattern contains -back references and the \fIovector\fP is not big enough to remember the related -substrings, PCRE has to get additional memory for use during matching. Thus it -is usually advisable to supply an \fIovector\fP of reasonable size. -.P -There are some cases where zero is returned (indicating vector overflow) when -in fact the vector is exactly the right size for the final match. For example, -consider the pattern -.sp - (a)(?:(b)c|bd) -.sp -If a vector of 6 elements (allowing for only 1 captured substring) is given -with subject string "abd", \fBpcre_exec()\fP will try to set the second -captured string, thereby recording a vector overflow, before failing to match -"c" and backing up to try the second alternative. The zero return, however, -does correctly indicate that the maximum number of slots (namely 2) have been -filled. In similar cases where there is temporary overflow, but the final -number of used slots is actually less than the maximum, a non-zero value is -returned. -.P -The \fBpcre_fullinfo()\fP function can be used to find out how many capturing -subpatterns there are in a compiled pattern. The smallest size for -\fIovector\fP that will allow for \fIn\fP captured substrings, in addition to -the offsets of the substring matched by the whole pattern, is (\fIn\fP+1)*3. -.P -It is possible for capturing subpattern number \fIn+1\fP to match some part of -the subject when subpattern \fIn\fP has not been used at all. For example, if -the string "abc" is matched against the pattern (a|(z))(bc) the return from the -function is 4, and subpatterns 1 and 3 are matched, but 2 is not. When this -happens, both values in the offset pairs corresponding to unused subpatterns -are set to -1. -.P -Offset values that correspond to unused subpatterns at the end of the -expression are also set to -1. For example, if the string "abc" is matched -against the pattern (abc)(x(yz)?)? subpatterns 2 and 3 are not matched. The -return from the function is 2, because the highest used capturing subpattern -number is 1, and the offsets for for the second and third capturing subpatterns -(assuming the vector is large enough, of course) are set to -1. -.P -\fBNote\fP: Elements in the first two-thirds of \fIovector\fP that do not -correspond to capturing parentheses in the pattern are never changed. That is, -if a pattern contains \fIn\fP capturing parentheses, no more than -\fIovector[0]\fP to \fIovector[2n+1]\fP are set by \fBpcre_exec()\fP. The other -elements (in the first two-thirds) retain whatever values they previously had. -.P -Some convenience functions are provided for extracting the captured substrings -as separate strings. These are described below. -. -. -.\" HTML -.SS "Error return values from \fBpcre_exec()\fP" -.rs -.sp -If \fBpcre_exec()\fP fails, it returns a negative number. The following are -defined in the header file: -.sp - PCRE_ERROR_NOMATCH (-1) -.sp -The subject string did not match the pattern. -.sp - PCRE_ERROR_NULL (-2) -.sp -Either \fIcode\fP or \fIsubject\fP was passed as NULL, or \fIovector\fP was -NULL and \fIovecsize\fP was not zero. -.sp - PCRE_ERROR_BADOPTION (-3) -.sp -An unrecognized bit was set in the \fIoptions\fP argument. -.sp - PCRE_ERROR_BADMAGIC (-4) -.sp -PCRE stores a 4-byte "magic number" at the start of the compiled code, to catch -the case when it is passed a junk pointer and to detect when a pattern that was -compiled in an environment of one endianness is run in an environment with the -other endianness. This is the error that PCRE gives when the magic number is -not present. -.sp - PCRE_ERROR_UNKNOWN_OPCODE (-5) -.sp -While running the pattern match, an unknown item was encountered in the -compiled pattern. This error could be caused by a bug in PCRE or by overwriting -of the compiled pattern. -.sp - PCRE_ERROR_NOMEMORY (-6) -.sp -If a pattern contains back references, but the \fIovector\fP that is passed to -\fBpcre_exec()\fP is not big enough to remember the referenced substrings, PCRE -gets a block of memory at the start of matching to use for this purpose. If the -call via \fBpcre_malloc()\fP fails, this error is given. The memory is -automatically freed at the end of matching. -.P -This error is also given if \fBpcre_stack_malloc()\fP fails in -\fBpcre_exec()\fP. This can happen only when PCRE has been compiled with -\fB--disable-stack-for-recursion\fP. -.sp - PCRE_ERROR_NOSUBSTRING (-7) -.sp -This error is used by the \fBpcre_copy_substring()\fP, -\fBpcre_get_substring()\fP, and \fBpcre_get_substring_list()\fP functions (see -below). It is never returned by \fBpcre_exec()\fP. -.sp - PCRE_ERROR_MATCHLIMIT (-8) -.sp -The backtracking limit, as specified by the \fImatch_limit\fP field in a -\fBpcre_extra\fP structure (or defaulted) was reached. See the description -above. -.sp - PCRE_ERROR_CALLOUT (-9) -.sp -This error is never generated by \fBpcre_exec()\fP itself. It is provided for -use by callout functions that want to yield a distinctive error code. See the -.\" HREF -\fBpcrecallout\fP -.\" -documentation for details. -.sp - PCRE_ERROR_BADUTF8 (-10) -.sp -A string that contains an invalid UTF-8 byte sequence was passed as a subject, -and the PCRE_NO_UTF8_CHECK option was not set. If the size of the output vector -(\fIovecsize\fP) is at least 2, the byte offset to the start of the the invalid -UTF-8 character is placed in the first element, and a reason code is placed in -the second element. The reason codes are listed in the -.\" HTML -.\" -following section. -.\" -For backward compatibility, if PCRE_PARTIAL_HARD is set and the problem is a -truncated UTF-8 character at the end of the subject (reason codes 1 to 5), -PCRE_ERROR_SHORTUTF8 is returned instead of PCRE_ERROR_BADUTF8. -.sp - PCRE_ERROR_BADUTF8_OFFSET (-11) -.sp -The UTF-8 byte sequence that was passed as a subject was checked and found to -be valid (the PCRE_NO_UTF8_CHECK option was not set), but the value of -\fIstartoffset\fP did not point to the beginning of a UTF-8 character or the -end of the subject. -.sp - PCRE_ERROR_PARTIAL (-12) -.sp -The subject string did not match, but it did match partially. See the -.\" HREF -\fBpcrepartial\fP -.\" -documentation for details of partial matching. -.sp - PCRE_ERROR_BADPARTIAL (-13) -.sp -This code is no longer in use. It was formerly returned when the PCRE_PARTIAL -option was used with a compiled pattern containing items that were not -supported for partial matching. From release 8.00 onwards, there are no -restrictions on partial matching. -.sp - PCRE_ERROR_INTERNAL (-14) -.sp -An unexpected internal error has occurred. This error could be caused by a bug -in PCRE or by overwriting of the compiled pattern. -.sp - PCRE_ERROR_BADCOUNT (-15) -.sp -This error is given if the value of the \fIovecsize\fP argument is negative. -.sp - PCRE_ERROR_RECURSIONLIMIT (-21) -.sp -The internal recursion limit, as specified by the \fImatch_limit_recursion\fP -field in a \fBpcre_extra\fP structure (or defaulted) was reached. See the -description above. -.sp - PCRE_ERROR_BADNEWLINE (-23) -.sp -An invalid combination of PCRE_NEWLINE_\fIxxx\fP options was given. -.sp - PCRE_ERROR_BADOFFSET (-24) -.sp -The value of \fIstartoffset\fP was negative or greater than the length of the -subject, that is, the value in \fIlength\fP. -.sp - PCRE_ERROR_SHORTUTF8 (-25) -.sp -This error is returned instead of PCRE_ERROR_BADUTF8 when the subject string -ends with a truncated UTF-8 character and the PCRE_PARTIAL_HARD option is set. -Information about the failure is returned as for PCRE_ERROR_BADUTF8. It is in -fact sufficient to detect this case, but this special error code for -PCRE_PARTIAL_HARD precedes the implementation of returned information; it is -retained for backwards compatibility. -.sp - PCRE_ERROR_RECURSELOOP (-26) -.sp -This error is returned when \fBpcre_exec()\fP detects a recursion loop within -the pattern. Specifically, it means that either the whole pattern or a -subpattern has been called recursively for the second time at the same position -in the subject string. Some simple patterns that might do this are detected and -faulted at compile time, but more complicated cases, in particular mutual -recursions between two different subpatterns, cannot be detected until run -time. -.sp - PCRE_ERROR_JIT_STACKLIMIT (-27) -.sp -This error is returned when a pattern that was successfully studied using a -JIT compile option is being matched, but the memory available for the -just-in-time processing stack is not large enough. See the -.\" HREF -\fBpcrejit\fP -.\" -documentation for more details. -.sp - PCRE_ERROR_BADMODE (-28) -.sp -This error is given if a pattern that was compiled by the 8-bit library is -passed to a 16-bit or 32-bit library function, or vice versa. -.sp - PCRE_ERROR_BADENDIANNESS (-29) -.sp -This error is given if a pattern that was compiled and saved is reloaded on a -host with different endianness. The utility function -\fBpcre_pattern_to_host_byte_order()\fP can be used to convert such a pattern -so that it runs on the new host. -.sp - PCRE_ERROR_JIT_BADOPTION -.sp -This error is returned when a pattern that was successfully studied using a JIT -compile option is being matched, but the matching mode (partial or complete -match) does not correspond to any JIT compilation mode. When the JIT fast path -function is used, this error may be also given for invalid options. See the -.\" HREF -\fBpcrejit\fP -.\" -documentation for more details. -.sp - PCRE_ERROR_BADLENGTH (-32) -.sp -This error is given if \fBpcre_exec()\fP is called with a negative value for -the \fIlength\fP argument. -.P -Error numbers -16 to -20, -22, and 30 are not used by \fBpcre_exec()\fP. -. -. -.\" HTML -.SS "Reason codes for invalid UTF-8 strings" -.rs -.sp -This section applies only to the 8-bit library. The corresponding information -for the 16-bit and 32-bit libraries is given in the -.\" HREF -\fBpcre16\fP -.\" -and -.\" HREF -\fBpcre32\fP -.\" -pages. -.P -When \fBpcre_exec()\fP returns either PCRE_ERROR_BADUTF8 or -PCRE_ERROR_SHORTUTF8, and the size of the output vector (\fIovecsize\fP) is at -least 2, the offset of the start of the invalid UTF-8 character is placed in -the first output vector element (\fIovector[0]\fP) and a reason code is placed -in the second element (\fIovector[1]\fP). The reason codes are given names in -the \fBpcre.h\fP header file: -.sp - PCRE_UTF8_ERR1 - PCRE_UTF8_ERR2 - PCRE_UTF8_ERR3 - PCRE_UTF8_ERR4 - PCRE_UTF8_ERR5 -.sp -The string ends with a truncated UTF-8 character; the code specifies how many -bytes are missing (1 to 5). Although RFC 3629 restricts UTF-8 characters to be -no longer than 4 bytes, the encoding scheme (originally defined by RFC 2279) -allows for up to 6 bytes, and this is checked first; hence the possibility of -4 or 5 missing bytes. -.sp - PCRE_UTF8_ERR6 - PCRE_UTF8_ERR7 - PCRE_UTF8_ERR8 - PCRE_UTF8_ERR9 - PCRE_UTF8_ERR10 -.sp -The two most significant bits of the 2nd, 3rd, 4th, 5th, or 6th byte of the -character do not have the binary value 0b10 (that is, either the most -significant bit is 0, or the next bit is 1). -.sp - PCRE_UTF8_ERR11 - PCRE_UTF8_ERR12 -.sp -A character that is valid by the RFC 2279 rules is either 5 or 6 bytes long; -these code points are excluded by RFC 3629. -.sp - PCRE_UTF8_ERR13 -.sp -A 4-byte character has a value greater than 0x10fff; these code points are -excluded by RFC 3629. -.sp - PCRE_UTF8_ERR14 -.sp -A 3-byte character has a value in the range 0xd800 to 0xdfff; this range of -code points are reserved by RFC 3629 for use with UTF-16, and so are excluded -from UTF-8. -.sp - PCRE_UTF8_ERR15 - PCRE_UTF8_ERR16 - PCRE_UTF8_ERR17 - PCRE_UTF8_ERR18 - PCRE_UTF8_ERR19 -.sp -A 2-, 3-, 4-, 5-, or 6-byte character is "overlong", that is, it codes for a -value that can be represented by fewer bytes, which is invalid. For example, -the two bytes 0xc0, 0xae give the value 0x2e, whose correct coding uses just -one byte. -.sp - PCRE_UTF8_ERR20 -.sp -The two most significant bits of the first byte of a character have the binary -value 0b10 (that is, the most significant bit is 1 and the second is 0). Such a -byte can only validly occur as the second or subsequent byte of a multi-byte -character. -.sp - PCRE_UTF8_ERR21 -.sp -The first byte of a character has the value 0xfe or 0xff. These values can -never occur in a valid UTF-8 string. -.sp - PCRE_UTF8_ERR22 -.sp -This error code was formerly used when the presence of a so-called -"non-character" caused an error. Unicode corrigendum #9 makes it clear that -such characters should not cause a string to be rejected, and so this code is -no longer in use and is never returned. -. -. -.SH "EXTRACTING CAPTURED SUBSTRINGS BY NUMBER" -.rs -.sp -.nf -.B int pcre_copy_substring(const char *\fIsubject\fP, int *\fIovector\fP, -.B " int \fIstringcount\fP, int \fIstringnumber\fP, char *\fIbuffer\fP," -.B " int \fIbuffersize\fP);" -.sp -.B int pcre_get_substring(const char *\fIsubject\fP, int *\fIovector\fP, -.B " int \fIstringcount\fP, int \fIstringnumber\fP," -.B " const char **\fIstringptr\fP);" -.sp -.B int pcre_get_substring_list(const char *\fIsubject\fP, -.B " int *\fIovector\fP, int \fIstringcount\fP, const char ***\fIlistptr\fP);" -.fi -.PP -Captured substrings can be accessed directly by using the offsets returned by -\fBpcre_exec()\fP in \fIovector\fP. For convenience, the functions -\fBpcre_copy_substring()\fP, \fBpcre_get_substring()\fP, and -\fBpcre_get_substring_list()\fP are provided for extracting captured substrings -as new, separate, zero-terminated strings. These functions identify substrings -by number. The next section describes functions for extracting named -substrings. -.P -A substring that contains a binary zero is correctly extracted and has a -further zero added on the end, but the result is not, of course, a C string. -However, you can process such a string by referring to the length that is -returned by \fBpcre_copy_substring()\fP and \fBpcre_get_substring()\fP. -Unfortunately, the interface to \fBpcre_get_substring_list()\fP is not adequate -for handling strings containing binary zeros, because the end of the final -string is not independently indicated. -.P -The first three arguments are the same for all three of these functions: -\fIsubject\fP is the subject string that has just been successfully matched, -\fIovector\fP is a pointer to the vector of integer offsets that was passed to -\fBpcre_exec()\fP, and \fIstringcount\fP is the number of substrings that were -captured by the match, including the substring that matched the entire regular -expression. This is the value returned by \fBpcre_exec()\fP if it is greater -than zero. If \fBpcre_exec()\fP returned zero, indicating that it ran out of -space in \fIovector\fP, the value passed as \fIstringcount\fP should be the -number of elements in the vector divided by three. -.P -The functions \fBpcre_copy_substring()\fP and \fBpcre_get_substring()\fP -extract a single substring, whose number is given as \fIstringnumber\fP. A -value of zero extracts the substring that matched the entire pattern, whereas -higher values extract the captured substrings. For \fBpcre_copy_substring()\fP, -the string is placed in \fIbuffer\fP, whose length is given by -\fIbuffersize\fP, while for \fBpcre_get_substring()\fP a new block of memory is -obtained via \fBpcre_malloc\fP, and its address is returned via -\fIstringptr\fP. The yield of the function is the length of the string, not -including the terminating zero, or one of these error codes: -.sp - PCRE_ERROR_NOMEMORY (-6) -.sp -The buffer was too small for \fBpcre_copy_substring()\fP, or the attempt to get -memory failed for \fBpcre_get_substring()\fP. -.sp - PCRE_ERROR_NOSUBSTRING (-7) -.sp -There is no substring whose number is \fIstringnumber\fP. -.P -The \fBpcre_get_substring_list()\fP function extracts all available substrings -and builds a list of pointers to them. All this is done in a single block of -memory that is obtained via \fBpcre_malloc\fP. The address of the memory block -is returned via \fIlistptr\fP, which is also the start of the list of string -pointers. The end of the list is marked by a NULL pointer. The yield of the -function is zero if all went well, or the error code -.sp - PCRE_ERROR_NOMEMORY (-6) -.sp -if the attempt to get the memory block failed. -.P -When any of these functions encounter a substring that is unset, which can -happen when capturing subpattern number \fIn+1\fP matches some part of the -subject, but subpattern \fIn\fP has not been used at all, they return an empty -string. This can be distinguished from a genuine zero-length substring by -inspecting the appropriate offset in \fIovector\fP, which is negative for unset -substrings. -.P -The two convenience functions \fBpcre_free_substring()\fP and -\fBpcre_free_substring_list()\fP can be used to free the memory returned by -a previous call of \fBpcre_get_substring()\fP or -\fBpcre_get_substring_list()\fP, respectively. They do nothing more than call -the function pointed to by \fBpcre_free\fP, which of course could be called -directly from a C program. However, PCRE is used in some situations where it is -linked via a special interface to another programming language that cannot use -\fBpcre_free\fP directly; it is for these cases that the functions are -provided. -. -. -.SH "EXTRACTING CAPTURED SUBSTRINGS BY NAME" -.rs -.sp -.nf -.B int pcre_get_stringnumber(const pcre *\fIcode\fP, -.B " const char *\fIname\fP);" -.sp -.B int pcre_copy_named_substring(const pcre *\fIcode\fP, -.B " const char *\fIsubject\fP, int *\fIovector\fP," -.B " int \fIstringcount\fP, const char *\fIstringname\fP," -.B " char *\fIbuffer\fP, int \fIbuffersize\fP);" -.sp -.B int pcre_get_named_substring(const pcre *\fIcode\fP, -.B " const char *\fIsubject\fP, int *\fIovector\fP," -.B " int \fIstringcount\fP, const char *\fIstringname\fP," -.B " const char **\fIstringptr\fP);" -.fi -.PP -To extract a substring by name, you first have to find associated number. -For example, for this pattern -.sp - (a+)b(?\ed+)... -.sp -the number of the subpattern called "xxx" is 2. If the name is known to be -unique (PCRE_DUPNAMES was not set), you can find the number from the name by -calling \fBpcre_get_stringnumber()\fP. The first argument is the compiled -pattern, and the second is the name. The yield of the function is the -subpattern number, or PCRE_ERROR_NOSUBSTRING (-7) if there is no subpattern of -that name. -.P -Given the number, you can extract the substring directly, or use one of the -functions described in the previous section. For convenience, there are also -two functions that do the whole job. -.P -Most of the arguments of \fBpcre_copy_named_substring()\fP and -\fBpcre_get_named_substring()\fP are the same as those for the similarly named -functions that extract by number. As these are described in the previous -section, they are not re-described here. There are just two differences: -.P -First, instead of a substring number, a substring name is given. Second, there -is an extra argument, given at the start, which is a pointer to the compiled -pattern. This is needed in order to gain access to the name-to-number -translation table. -.P -These functions call \fBpcre_get_stringnumber()\fP, and if it succeeds, they -then call \fBpcre_copy_substring()\fP or \fBpcre_get_substring()\fP, as -appropriate. \fBNOTE:\fP If PCRE_DUPNAMES is set and there are duplicate names, -the behaviour may not be what you want (see the next section). -.P -\fBWarning:\fP If the pattern uses the (?| feature to set up multiple -subpatterns with the same number, as described in the -.\" HTML -.\" -section on duplicate subpattern numbers -.\" -in the -.\" HREF -\fBpcrepattern\fP -.\" -page, you cannot use names to distinguish the different subpatterns, because -names are not included in the compiled code. The matching process uses only -numbers. For this reason, the use of different names for subpatterns of the -same number causes an error at compile time. -. -. -.SH "DUPLICATE SUBPATTERN NAMES" -.rs -.sp -.nf -.B int pcre_get_stringtable_entries(const pcre *\fIcode\fP, -.B " const char *\fIname\fP, char **\fIfirst\fP, char **\fIlast\fP);" -.fi -.PP -When a pattern is compiled with the PCRE_DUPNAMES option, names for subpatterns -are not required to be unique. (Duplicate names are always allowed for -subpatterns with the same number, created by using the (?| feature. Indeed, if -such subpatterns are named, they are required to use the same names.) -.P -Normally, patterns with duplicate names are such that in any one match, only -one of the named subpatterns participates. An example is shown in the -.\" HREF -\fBpcrepattern\fP -.\" -documentation. -.P -When duplicates are present, \fBpcre_copy_named_substring()\fP and -\fBpcre_get_named_substring()\fP return the first substring corresponding to -the given name that is set. If none are set, PCRE_ERROR_NOSUBSTRING (-7) is -returned; no data is returned. The \fBpcre_get_stringnumber()\fP function -returns one of the numbers that are associated with the name, but it is not -defined which it is. -.P -If you want to get full details of all captured substrings for a given name, -you must use the \fBpcre_get_stringtable_entries()\fP function. The first -argument is the compiled pattern, and the second is the name. The third and -fourth are pointers to variables which are updated by the function. After it -has run, they point to the first and last entries in the name-to-number table -for the given name. The function itself returns the length of each entry, or -PCRE_ERROR_NOSUBSTRING (-7) if there are none. The format of the table is -described above in the section entitled \fIInformation about a pattern\fP -.\" HTML -.\" -above. -.\" -Given all the relevant entries for the name, you can extract each of their -numbers, and hence the captured data, if any. -. -. -.SH "FINDING ALL POSSIBLE MATCHES" -.rs -.sp -The traditional matching function uses a similar algorithm to Perl, which stops -when it finds the first match, starting at a given point in the subject. If you -want to find all possible matches, or the longest possible match, consider -using the alternative matching function (see below) instead. If you cannot use -the alternative function, but still need to find all possible matches, you -can kludge it up by making use of the callout facility, which is described in -the -.\" HREF -\fBpcrecallout\fP -.\" -documentation. -.P -What you have to do is to insert a callout right at the end of the pattern. -When your callout function is called, extract and save the current matched -substring. Then return 1, which forces \fBpcre_exec()\fP to backtrack and try -other alternatives. Ultimately, when it runs out of matches, \fBpcre_exec()\fP -will yield PCRE_ERROR_NOMATCH. -. -. -.SH "OBTAINING AN ESTIMATE OF STACK USAGE" -.rs -.sp -Matching certain patterns using \fBpcre_exec()\fP can use a lot of process -stack, which in certain environments can be rather limited in size. Some users -find it helpful to have an estimate of the amount of stack that is used by -\fBpcre_exec()\fP, to help them set recursion limits, as described in the -.\" HREF -\fBpcrestack\fP -.\" -documentation. The estimate that is output by \fBpcretest\fP when called with -the \fB-m\fP and \fB-C\fP options is obtained by calling \fBpcre_exec\fP with -the values NULL, NULL, NULL, -999, and -999 for its first five arguments. -.P -Normally, if its first argument is NULL, \fBpcre_exec()\fP immediately returns -the negative error code PCRE_ERROR_NULL, but with this special combination of -arguments, it returns instead a negative number whose absolute value is the -approximate stack frame size in bytes. (A negative number is used so that it is -clear that no match has happened.) The value is approximate because in some -cases, recursive calls to \fBpcre_exec()\fP occur when there are one or two -additional variables on the stack. -.P -If PCRE has been compiled to use the heap instead of the stack for recursion, -the value returned is the size of each block that is obtained from the heap. -. -. -.\" HTML -.SH "MATCHING A PATTERN: THE ALTERNATIVE FUNCTION" -.rs -.sp -.nf -.B int pcre_dfa_exec(const pcre *\fIcode\fP, "const pcre_extra *\fIextra\fP," -.B " const char *\fIsubject\fP, int \fIlength\fP, int \fIstartoffset\fP," -.B " int \fIoptions\fP, int *\fIovector\fP, int \fIovecsize\fP," -.B " int *\fIworkspace\fP, int \fIwscount\fP);" -.fi -.P -The function \fBpcre_dfa_exec()\fP is called to match a subject string against -a compiled pattern, using a matching algorithm that scans the subject string -just once, and does not backtrack. This has different characteristics to the -normal algorithm, and is not compatible with Perl. Some of the features of PCRE -patterns are not supported. Nevertheless, there are times when this kind of -matching can be useful. For a discussion of the two matching algorithms, and a -list of features that \fBpcre_dfa_exec()\fP does not support, see the -.\" HREF -\fBpcrematching\fP -.\" -documentation. -.P -The arguments for the \fBpcre_dfa_exec()\fP function are the same as for -\fBpcre_exec()\fP, plus two extras. The \fIovector\fP argument is used in a -different way, and this is described below. The other common arguments are used -in the same way as for \fBpcre_exec()\fP, so their description is not repeated -here. -.P -The two additional arguments provide workspace for the function. The workspace -vector should contain at least 20 elements. It is used for keeping track of -multiple paths through the pattern tree. More workspace will be needed for -patterns and subjects where there are a lot of potential matches. -.P -Here is an example of a simple call to \fBpcre_dfa_exec()\fP: -.sp - int rc; - int ovector[10]; - int wspace[20]; - rc = pcre_dfa_exec( - re, /* result of pcre_compile() */ - NULL, /* we didn't study the pattern */ - "some string", /* the subject string */ - 11, /* the length of the subject string */ - 0, /* start at offset 0 in the subject */ - 0, /* default options */ - ovector, /* vector of integers for substring information */ - 10, /* number of elements (NOT size in bytes) */ - wspace, /* working space vector */ - 20); /* number of elements (NOT size in bytes) */ -. -.SS "Option bits for \fBpcre_dfa_exec()\fP" -.rs -.sp -The unused bits of the \fIoptions\fP argument for \fBpcre_dfa_exec()\fP must be -zero. The only bits that may be set are PCRE_ANCHORED, PCRE_NEWLINE_\fIxxx\fP, -PCRE_NOTBOL, PCRE_NOTEOL, PCRE_NOTEMPTY, PCRE_NOTEMPTY_ATSTART, -PCRE_NO_UTF8_CHECK, PCRE_BSR_ANYCRLF, PCRE_BSR_UNICODE, PCRE_NO_START_OPTIMIZE, -PCRE_PARTIAL_HARD, PCRE_PARTIAL_SOFT, PCRE_DFA_SHORTEST, and PCRE_DFA_RESTART. -All but the last four of these are exactly the same as for \fBpcre_exec()\fP, -so their description is not repeated here. -.sp - PCRE_PARTIAL_HARD - PCRE_PARTIAL_SOFT -.sp -These have the same general effect as they do for \fBpcre_exec()\fP, but the -details are slightly different. When PCRE_PARTIAL_HARD is set for -\fBpcre_dfa_exec()\fP, it returns PCRE_ERROR_PARTIAL if the end of the subject -is reached and there is still at least one matching possibility that requires -additional characters. This happens even if some complete matches have also -been found. When PCRE_PARTIAL_SOFT is set, the return code PCRE_ERROR_NOMATCH -is converted into PCRE_ERROR_PARTIAL if the end of the subject is reached, -there have been no complete matches, but there is still at least one matching -possibility. The portion of the string that was inspected when the longest -partial match was found is set as the first matching string in both cases. -There is a more detailed discussion of partial and multi-segment matching, with -examples, in the -.\" HREF -\fBpcrepartial\fP -.\" -documentation. -.sp - PCRE_DFA_SHORTEST -.sp -Setting the PCRE_DFA_SHORTEST option causes the matching algorithm to stop as -soon as it has found one match. Because of the way the alternative algorithm -works, this is necessarily the shortest possible match at the first possible -matching point in the subject string. -.sp - PCRE_DFA_RESTART -.sp -When \fBpcre_dfa_exec()\fP returns a partial match, it is possible to call it -again, with additional subject characters, and have it continue with the same -match. The PCRE_DFA_RESTART option requests this action; when it is set, the -\fIworkspace\fP and \fIwscount\fP options must reference the same vector as -before because data about the match so far is left in them after a partial -match. There is more discussion of this facility in the -.\" HREF -\fBpcrepartial\fP -.\" -documentation. -. -. -.SS "Successful returns from \fBpcre_dfa_exec()\fP" -.rs -.sp -When \fBpcre_dfa_exec()\fP succeeds, it may have matched more than one -substring in the subject. Note, however, that all the matches from one run of -the function start at the same point in the subject. The shorter matches are -all initial substrings of the longer matches. For example, if the pattern -.sp - <.*> -.sp -is matched against the string -.sp - This is no more -.sp -the three matched strings are -.sp - - - -.sp -On success, the yield of the function is a number greater than zero, which is -the number of matched substrings. The substrings themselves are returned in -\fIovector\fP. Each string uses two elements; the first is the offset to the -start, and the second is the offset to the end. In fact, all the strings have -the same start offset. (Space could have been saved by giving this only once, -but it was decided to retain some compatibility with the way \fBpcre_exec()\fP -returns data, even though the meaning of the strings is different.) -.P -The strings are returned in reverse order of length; that is, the longest -matching string is given first. If there were too many matches to fit into -\fIovector\fP, the yield of the function is zero, and the vector is filled with -the longest matches. Unlike \fBpcre_exec()\fP, \fBpcre_dfa_exec()\fP can use -the entire \fIovector\fP for returning matched strings. -.P -NOTE: PCRE's "auto-possessification" optimization usually applies to character -repeats at the end of a pattern (as well as internally). For example, the -pattern "a\ed+" is compiled as if it were "a\ed++" because there is no point -even considering the possibility of backtracking into the repeated digits. For -DFA matching, this means that only one possible match is found. If you really -do want multiple matches in such cases, either use an ungreedy repeat -("a\ed+?") or set the PCRE_NO_AUTO_POSSESS option when compiling. -. -. -.SS "Error returns from \fBpcre_dfa_exec()\fP" -.rs -.sp -The \fBpcre_dfa_exec()\fP function returns a negative number when it fails. -Many of the errors are the same as for \fBpcre_exec()\fP, and these are -described -.\" HTML -.\" -above. -.\" -There are in addition the following errors that are specific to -\fBpcre_dfa_exec()\fP: -.sp - PCRE_ERROR_DFA_UITEM (-16) -.sp -This return is given if \fBpcre_dfa_exec()\fP encounters an item in the pattern -that it does not support, for instance, the use of \eC or a back reference. -.sp - PCRE_ERROR_DFA_UCOND (-17) -.sp -This return is given if \fBpcre_dfa_exec()\fP encounters a condition item that -uses a back reference for the condition, or a test for recursion in a specific -group. These are not supported. -.sp - PCRE_ERROR_DFA_UMLIMIT (-18) -.sp -This return is given if \fBpcre_dfa_exec()\fP is called with an \fIextra\fP -block that contains a setting of the \fImatch_limit\fP or -\fImatch_limit_recursion\fP fields. This is not supported (these fields are -meaningless for DFA matching). -.sp - PCRE_ERROR_DFA_WSSIZE (-19) -.sp -This return is given if \fBpcre_dfa_exec()\fP runs out of space in the -\fIworkspace\fP vector. -.sp - PCRE_ERROR_DFA_RECURSE (-20) -.sp -When a recursive subpattern is processed, the matching function calls itself -recursively, using private vectors for \fIovector\fP and \fIworkspace\fP. This -error is given if the output vector is not large enough. This should be -extremely rare, as a vector of size 1000 is used. -.sp - PCRE_ERROR_DFA_BADRESTART (-30) -.sp -When \fBpcre_dfa_exec()\fP is called with the \fBPCRE_DFA_RESTART\fP option, -some plausibility checks are made on the contents of the workspace, which -should contain data about the previous partial match. If any of these checks -fail, this error is given. -. -. -.SH "SEE ALSO" -.rs -.sp -\fBpcre16\fP(3), \fBpcre32\fP(3), \fBpcrebuild\fP(3), \fBpcrecallout\fP(3), -\fBpcrecpp(3)\fP(3), \fBpcrematching\fP(3), \fBpcrepartial\fP(3), -\fBpcreposix\fP(3), \fBpcreprecompile\fP(3), \fBpcresample\fP(3), -\fBpcrestack\fP(3). -. -. -.SH AUTHOR -.rs -.sp -.nf -Philip Hazel -University Computing Service -Cambridge CB2 3QH, England. -.fi -. -. -.SH REVISION -.rs -.sp -.nf -Last updated: 18 December 2015 -Copyright (c) 1997-2015 University of Cambridge. -.fi diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcrebuild.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcrebuild.3 deleted file mode 100644 index 403f2ae3..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcrebuild.3 +++ /dev/null @@ -1,550 +0,0 @@ -.TH PCREBUILD 3 "12 May 2013" "PCRE 8.33" -.SH NAME -PCRE - Perl-compatible regular expressions -. -. -.SH "BUILDING PCRE" -.rs -.sp -PCRE is distributed with a \fBconfigure\fP script that can be used to build the -library in Unix-like environments using the applications known as Autotools. -Also in the distribution are files to support building using \fBCMake\fP -instead of \fBconfigure\fP. The text file -.\" HTML -.\" -\fBREADME\fP -.\" -contains general information about building with Autotools (some of which is -repeated below), and also has some comments about building on various operating -systems. There is a lot more information about building PCRE without using -Autotools (including information about using \fBCMake\fP and building "by -hand") in the text file called -.\" HTML -.\" -\fBNON-AUTOTOOLS-BUILD\fP. -.\" -You should consult this file as well as the -.\" HTML -.\" -\fBREADME\fP -.\" -file if you are building in a non-Unix-like environment. -. -. -.SH "PCRE BUILD-TIME OPTIONS" -.rs -.sp -The rest of this document describes the optional features of PCRE that can be -selected when the library is compiled. It assumes use of the \fBconfigure\fP -script, where the optional features are selected or deselected by providing -options to \fBconfigure\fP before running the \fBmake\fP command. However, the -same options can be selected in both Unix-like and non-Unix-like environments -using the GUI facility of \fBcmake-gui\fP if you are using \fBCMake\fP instead -of \fBconfigure\fP to build PCRE. -.P -If you are not using Autotools or \fBCMake\fP, option selection can be done by -editing the \fBconfig.h\fP file, or by passing parameter settings to the -compiler, as described in -.\" HTML -.\" -\fBNON-AUTOTOOLS-BUILD\fP. -.\" -.P -The complete list of options for \fBconfigure\fP (which includes the standard -ones such as the selection of the installation directory) can be obtained by -running -.sp - ./configure --help -.sp -The following sections include descriptions of options whose names begin with ---enable or --disable. These settings specify changes to the defaults for the -\fBconfigure\fP command. Because of the way that \fBconfigure\fP works, ---enable and --disable always come in pairs, so the complementary option always -exists as well, but as it specifies the default, it is not described. -. -. -.SH "BUILDING 8-BIT, 16-BIT AND 32-BIT LIBRARIES" -.rs -.sp -By default, a library called \fBlibpcre\fP is built, containing functions that -take string arguments contained in vectors of bytes, either as single-byte -characters, or interpreted as UTF-8 strings. You can also build a separate -library, called \fBlibpcre16\fP, in which strings are contained in vectors of -16-bit data units and interpreted either as single-unit characters or UTF-16 -strings, by adding -.sp - --enable-pcre16 -.sp -to the \fBconfigure\fP command. You can also build yet another separate -library, called \fBlibpcre32\fP, in which strings are contained in vectors of -32-bit data units and interpreted either as single-unit characters or UTF-32 -strings, by adding -.sp - --enable-pcre32 -.sp -to the \fBconfigure\fP command. If you do not want the 8-bit library, add -.sp - --disable-pcre8 -.sp -as well. At least one of the three libraries must be built. Note that the C++ -and POSIX wrappers are for the 8-bit library only, and that \fBpcregrep\fP is -an 8-bit program. None of these are built if you select only the 16-bit or -32-bit libraries. -. -. -.SH "BUILDING SHARED AND STATIC LIBRARIES" -.rs -.sp -The Autotools PCRE building process uses \fBlibtool\fP to build both shared and -static libraries by default. You can suppress one of these by adding one of -.sp - --disable-shared - --disable-static -.sp -to the \fBconfigure\fP command, as required. -. -. -.SH "C++ SUPPORT" -.rs -.sp -By default, if the 8-bit library is being built, the \fBconfigure\fP script -will search for a C++ compiler and C++ header files. If it finds them, it -automatically builds the C++ wrapper library (which supports only 8-bit -strings). You can disable this by adding -.sp - --disable-cpp -.sp -to the \fBconfigure\fP command. -. -. -.SH "UTF-8, UTF-16 AND UTF-32 SUPPORT" -.rs -.sp -To build PCRE with support for UTF Unicode character strings, add -.sp - --enable-utf -.sp -to the \fBconfigure\fP command. This setting applies to all three libraries, -adding support for UTF-8 to the 8-bit library, support for UTF-16 to the 16-bit -library, and support for UTF-32 to the to the 32-bit library. There are no -separate options for enabling UTF-8, UTF-16 and UTF-32 independently because -that would allow ridiculous settings such as requesting UTF-16 support while -building only the 8-bit library. It is not possible to build one library with -UTF support and another without in the same configuration. (For backwards -compatibility, --enable-utf8 is a synonym of --enable-utf.) -.P -Of itself, this setting does not make PCRE treat strings as UTF-8, UTF-16 or -UTF-32. As well as compiling PCRE with this option, you also have have to set -the PCRE_UTF8, PCRE_UTF16 or PCRE_UTF32 option (as appropriate) when you call -one of the pattern compiling functions. -.P -If you set --enable-utf when compiling in an EBCDIC environment, PCRE expects -its input to be either ASCII or UTF-8 (depending on the run-time option). It is -not possible to support both EBCDIC and UTF-8 codes in the same version of the -library. Consequently, --enable-utf and --enable-ebcdic are mutually -exclusive. -. -. -.SH "UNICODE CHARACTER PROPERTY SUPPORT" -.rs -.sp -UTF support allows the libraries to process character codepoints up to 0x10ffff -in the strings that they handle. On its own, however, it does not provide any -facilities for accessing the properties of such characters. If you want to be -able to use the pattern escapes \eP, \ep, and \eX, which refer to Unicode -character properties, you must add -.sp - --enable-unicode-properties -.sp -to the \fBconfigure\fP command. This implies UTF support, even if you have -not explicitly requested it. -.P -Including Unicode property support adds around 30K of tables to the PCRE -library. Only the general category properties such as \fILu\fP and \fINd\fP are -supported. Details are given in the -.\" HREF -\fBpcrepattern\fP -.\" -documentation. -. -. -.SH "JUST-IN-TIME COMPILER SUPPORT" -.rs -.sp -Just-in-time compiler support is included in the build by specifying -.sp - --enable-jit -.sp -This support is available only for certain hardware architectures. If this -option is set for an unsupported architecture, a compile time error occurs. -See the -.\" HREF -\fBpcrejit\fP -.\" -documentation for a discussion of JIT usage. When JIT support is enabled, -pcregrep automatically makes use of it, unless you add -.sp - --disable-pcregrep-jit -.sp -to the "configure" command. -. -. -.SH "CODE VALUE OF NEWLINE" -.rs -.sp -By default, PCRE interprets the linefeed (LF) character as indicating the end -of a line. This is the normal newline character on Unix-like systems. You can -compile PCRE to use carriage return (CR) instead, by adding -.sp - --enable-newline-is-cr -.sp -to the \fBconfigure\fP command. There is also a --enable-newline-is-lf option, -which explicitly specifies linefeed as the newline character. -.sp -Alternatively, you can specify that line endings are to be indicated by the two -character sequence CRLF. If you want this, add -.sp - --enable-newline-is-crlf -.sp -to the \fBconfigure\fP command. There is a fourth option, specified by -.sp - --enable-newline-is-anycrlf -.sp -which causes PCRE to recognize any of the three sequences CR, LF, or CRLF as -indicating a line ending. Finally, a fifth option, specified by -.sp - --enable-newline-is-any -.sp -causes PCRE to recognize any Unicode newline sequence. -.P -Whatever line ending convention is selected when PCRE is built can be -overridden when the library functions are called. At build time it is -conventional to use the standard for your operating system. -. -. -.SH "WHAT \eR MATCHES" -.rs -.sp -By default, the sequence \eR in a pattern matches any Unicode newline sequence, -whatever has been selected as the line ending sequence. If you specify -.sp - --enable-bsr-anycrlf -.sp -the default is changed so that \eR matches only CR, LF, or CRLF. Whatever is -selected when PCRE is built can be overridden when the library functions are -called. -. -. -.SH "POSIX MALLOC USAGE" -.rs -.sp -When the 8-bit library is called through the POSIX interface (see the -.\" HREF -\fBpcreposix\fP -.\" -documentation), additional working storage is required for holding the pointers -to capturing substrings, because PCRE requires three integers per substring, -whereas the POSIX interface provides only two. If the number of expected -substrings is small, the wrapper function uses space on the stack, because this -is faster than using \fBmalloc()\fP for each call. The default threshold above -which the stack is no longer used is 10; it can be changed by adding a setting -such as -.sp - --with-posix-malloc-threshold=20 -.sp -to the \fBconfigure\fP command. -. -. -.SH "HANDLING VERY LARGE PATTERNS" -.rs -.sp -Within a compiled pattern, offset values are used to point from one part to -another (for example, from an opening parenthesis to an alternation -metacharacter). By default, in the 8-bit and 16-bit libraries, two-byte values -are used for these offsets, leading to a maximum size for a compiled pattern of -around 64K. This is sufficient to handle all but the most gigantic patterns. -Nevertheless, some people do want to process truly enormous patterns, so it is -possible to compile PCRE to use three-byte or four-byte offsets by adding a -setting such as -.sp - --with-link-size=3 -.sp -to the \fBconfigure\fP command. The value given must be 2, 3, or 4. For the -16-bit library, a value of 3 is rounded up to 4. In these libraries, using -longer offsets slows down the operation of PCRE because it has to load -additional data when handling them. For the 32-bit library the value is always -4 and cannot be overridden; the value of --with-link-size is ignored. -. -. -.SH "AVOIDING EXCESSIVE STACK USAGE" -.rs -.sp -When matching with the \fBpcre_exec()\fP function, PCRE implements backtracking -by making recursive calls to an internal function called \fBmatch()\fP. In -environments where the size of the stack is limited, this can severely limit -PCRE's operation. (The Unix environment does not usually suffer from this -problem, but it may sometimes be necessary to increase the maximum stack size. -There is a discussion in the -.\" HREF -\fBpcrestack\fP -.\" -documentation.) An alternative approach to recursion that uses memory from the -heap to remember data, instead of using recursive function calls, has been -implemented to work round the problem of limited stack size. If you want to -build a version of PCRE that works this way, add -.sp - --disable-stack-for-recursion -.sp -to the \fBconfigure\fP command. With this configuration, PCRE will use the -\fBpcre_stack_malloc\fP and \fBpcre_stack_free\fP variables to call memory -management functions. By default these point to \fBmalloc()\fP and -\fBfree()\fP, but you can replace the pointers so that your own functions are -used instead. -.P -Separate functions are provided rather than using \fBpcre_malloc\fP and -\fBpcre_free\fP because the usage is very predictable: the block sizes -requested are always the same, and the blocks are always freed in reverse -order. A calling program might be able to implement optimized functions that -perform better than \fBmalloc()\fP and \fBfree()\fP. PCRE runs noticeably more -slowly when built in this way. This option affects only the \fBpcre_exec()\fP -function; it is not relevant for \fBpcre_dfa_exec()\fP. -. -. -.SH "LIMITING PCRE RESOURCE USAGE" -.rs -.sp -Internally, PCRE has a function called \fBmatch()\fP, which it calls repeatedly -(sometimes recursively) when matching a pattern with the \fBpcre_exec()\fP -function. By controlling the maximum number of times this function may be -called during a single matching operation, a limit can be placed on the -resources used by a single call to \fBpcre_exec()\fP. The limit can be changed -at run time, as described in the -.\" HREF -\fBpcreapi\fP -.\" -documentation. The default is 10 million, but this can be changed by adding a -setting such as -.sp - --with-match-limit=500000 -.sp -to the \fBconfigure\fP command. This setting has no effect on the -\fBpcre_dfa_exec()\fP matching function. -.P -In some environments it is desirable to limit the depth of recursive calls of -\fBmatch()\fP more strictly than the total number of calls, in order to -restrict the maximum amount of stack (or heap, if --disable-stack-for-recursion -is specified) that is used. A second limit controls this; it defaults to the -value that is set for --with-match-limit, which imposes no additional -constraints. However, you can set a lower limit by adding, for example, -.sp - --with-match-limit-recursion=10000 -.sp -to the \fBconfigure\fP command. This value can also be overridden at run time. -. -. -.SH "CREATING CHARACTER TABLES AT BUILD TIME" -.rs -.sp -PCRE uses fixed tables for processing characters whose code values are less -than 256. By default, PCRE is built with a set of tables that are distributed -in the file \fIpcre_chartables.c.dist\fP. These tables are for ASCII codes -only. If you add -.sp - --enable-rebuild-chartables -.sp -to the \fBconfigure\fP command, the distributed tables are no longer used. -Instead, a program called \fBdftables\fP is compiled and run. This outputs the -source for new set of tables, created in the default locale of your C run-time -system. (This method of replacing the tables does not work if you are cross -compiling, because \fBdftables\fP is run on the local host. If you need to -create alternative tables when cross compiling, you will have to do so "by -hand".) -. -. -.SH "USING EBCDIC CODE" -.rs -.sp -PCRE assumes by default that it will run in an environment where the character -code is ASCII (or Unicode, which is a superset of ASCII). This is the case for -most computer operating systems. PCRE can, however, be compiled to run in an -EBCDIC environment by adding -.sp - --enable-ebcdic -.sp -to the \fBconfigure\fP command. This setting implies ---enable-rebuild-chartables. You should only use it if you know that you are in -an EBCDIC environment (for example, an IBM mainframe operating system). The ---enable-ebcdic option is incompatible with --enable-utf. -.P -The EBCDIC character that corresponds to an ASCII LF is assumed to have the -value 0x15 by default. However, in some EBCDIC environments, 0x25 is used. In -such an environment you should use -.sp - --enable-ebcdic-nl25 -.sp -as well as, or instead of, --enable-ebcdic. The EBCDIC character for CR has the -same value as in ASCII, namely, 0x0d. Whichever of 0x15 and 0x25 is \fInot\fP -chosen as LF is made to correspond to the Unicode NEL character (which, in -Unicode, is 0x85). -.P -The options that select newline behaviour, such as --enable-newline-is-cr, -and equivalent run-time options, refer to these character values in an EBCDIC -environment. -. -. -.SH "PCREGREP OPTIONS FOR COMPRESSED FILE SUPPORT" -.rs -.sp -By default, \fBpcregrep\fP reads all files as plain text. You can build it so -that it recognizes files whose names end in \fB.gz\fP or \fB.bz2\fP, and reads -them with \fBlibz\fP or \fBlibbz2\fP, respectively, by adding one or both of -.sp - --enable-pcregrep-libz - --enable-pcregrep-libbz2 -.sp -to the \fBconfigure\fP command. These options naturally require that the -relevant libraries are installed on your system. Configuration will fail if -they are not. -. -. -.SH "PCREGREP BUFFER SIZE" -.rs -.sp -\fBpcregrep\fP uses an internal buffer to hold a "window" on the file it is -scanning, in order to be able to output "before" and "after" lines when it -finds a match. The size of the buffer is controlled by a parameter whose -default value is 20K. The buffer itself is three times this size, but because -of the way it is used for holding "before" lines, the longest line that is -guaranteed to be processable is the parameter size. You can change the default -parameter value by adding, for example, -.sp - --with-pcregrep-bufsize=50K -.sp -to the \fBconfigure\fP command. The caller of \fPpcregrep\fP can, however, -override this value by specifying a run-time option. -. -. -.SH "PCRETEST OPTION FOR LIBREADLINE SUPPORT" -.rs -.sp -If you add -.sp - --enable-pcretest-libreadline -.sp -to the \fBconfigure\fP command, \fBpcretest\fP is linked with the -\fBlibreadline\fP library, and when its input is from a terminal, it reads it -using the \fBreadline()\fP function. This provides line-editing and history -facilities. Note that \fBlibreadline\fP is GPL-licensed, so if you distribute a -binary of \fBpcretest\fP linked in this way, there may be licensing issues. -.P -Setting this option causes the \fB-lreadline\fP option to be added to the -\fBpcretest\fP build. In many operating environments with a sytem-installed -\fBlibreadline\fP this is sufficient. However, in some environments (e.g. -if an unmodified distribution version of readline is in use), some extra -configuration may be necessary. The INSTALL file for \fBlibreadline\fP says -this: -.sp - "Readline uses the termcap functions, but does not link with the - termcap or curses library itself, allowing applications which link - with readline the to choose an appropriate library." -.sp -If your environment has not been set up so that an appropriate library is -automatically included, you may need to add something like -.sp - LIBS="-ncurses" -.sp -immediately before the \fBconfigure\fP command. -. -. -.SH "DEBUGGING WITH VALGRIND SUPPORT" -.rs -.sp -By adding the -.sp - --enable-valgrind -.sp -option to to the \fBconfigure\fP command, PCRE will use valgrind annotations -to mark certain memory regions as unaddressable. This allows it to detect -invalid memory accesses, and is mostly useful for debugging PCRE itself. -. -. -.SH "CODE COVERAGE REPORTING" -.rs -.sp -If your C compiler is gcc, you can build a version of PCRE that can generate a -code coverage report for its test suite. To enable this, you must install -\fBlcov\fP version 1.6 or above. Then specify -.sp - --enable-coverage -.sp -to the \fBconfigure\fP command and build PCRE in the usual way. -.P -Note that using \fBccache\fP (a caching C compiler) is incompatible with code -coverage reporting. If you have configured \fBccache\fP to run automatically -on your system, you must set the environment variable -.sp - CCACHE_DISABLE=1 -.sp -before running \fBmake\fP to build PCRE, so that \fBccache\fP is not used. -.P -When --enable-coverage is used, the following addition targets are added to the -\fIMakefile\fP: -.sp - make coverage -.sp -This creates a fresh coverage report for the PCRE test suite. It is equivalent -to running "make coverage-reset", "make coverage-baseline", "make check", and -then "make coverage-report". -.sp - make coverage-reset -.sp -This zeroes the coverage counters, but does nothing else. -.sp - make coverage-baseline -.sp -This captures baseline coverage information. -.sp - make coverage-report -.sp -This creates the coverage report. -.sp - make coverage-clean-report -.sp -This removes the generated coverage report without cleaning the coverage data -itself. -.sp - make coverage-clean-data -.sp -This removes the captured coverage data without removing the coverage files -created at compile time (*.gcno). -.sp - make coverage-clean -.sp -This cleans all coverage data including the generated coverage report. For more -information about code coverage, see the \fBgcov\fP and \fBlcov\fP -documentation. -. -. -.SH "SEE ALSO" -.rs -.sp -\fBpcreapi\fP(3), \fBpcre16\fP, \fBpcre32\fP, \fBpcre_config\fP(3). -. -. -.SH AUTHOR -.rs -.sp -.nf -Philip Hazel -University Computing Service -Cambridge CB2 3QH, England. -.fi -. -. -.SH REVISION -.rs -.sp -.nf -Last updated: 12 May 2013 -Copyright (c) 1997-2013 University of Cambridge. -.fi diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcrecallout.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcrecallout.3 deleted file mode 100644 index 8ebc9959..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcrecallout.3 +++ /dev/null @@ -1,255 +0,0 @@ -.TH PCRECALLOUT 3 "12 November 2013" "PCRE 8.34" -.SH NAME -PCRE - Perl-compatible regular expressions -.SH SYNOPSIS -.rs -.sp -.B #include -.PP -.SM -.B int (*pcre_callout)(pcre_callout_block *); -.PP -.B int (*pcre16_callout)(pcre16_callout_block *); -.PP -.B int (*pcre32_callout)(pcre32_callout_block *); -. -.SH DESCRIPTION -.rs -.sp -PCRE provides a feature called "callout", which is a means of temporarily -passing control to the caller of PCRE in the middle of pattern matching. The -caller of PCRE provides an external function by putting its entry point in the -global variable \fIpcre_callout\fP (\fIpcre16_callout\fP for the 16-bit -library, \fIpcre32_callout\fP for the 32-bit library). By default, this -variable contains NULL, which disables all calling out. -.P -Within a regular expression, (?C) indicates the points at which the external -function is to be called. Different callout points can be identified by putting -a number less than 256 after the letter C. The default value is zero. -For example, this pattern has two callout points: -.sp - (?C1)abc(?C2)def -.sp -If the PCRE_AUTO_CALLOUT option bit is set when a pattern is compiled, PCRE -automatically inserts callouts, all with number 255, before each item in the -pattern. For example, if PCRE_AUTO_CALLOUT is used with the pattern -.sp - A(\ed{2}|--) -.sp -it is processed as if it were -.sp -(?C255)A(?C255)((?C255)\ed{2}(?C255)|(?C255)-(?C255)-(?C255))(?C255) -.sp -Notice that there is a callout before and after each parenthesis and -alternation bar. If the pattern contains a conditional group whose condition is -an assertion, an automatic callout is inserted immediately before the -condition. Such a callout may also be inserted explicitly, for example: -.sp - (?(?C9)(?=a)ab|de) -.sp -This applies only to assertion conditions (because they are themselves -independent groups). -.P -Automatic callouts can be used for tracking the progress of pattern matching. -The -.\" HREF -\fBpcretest\fP -.\" -program has a pattern qualifier (/C) that sets automatic callouts; when it is -used, the output indicates how the pattern is being matched. This is useful -information when you are trying to optimize the performance of a particular -pattern. -. -. -.SH "MISSING CALLOUTS" -.rs -.sp -You should be aware that, because of optimizations in the way PCRE compiles and -matches patterns, callouts sometimes do not happen exactly as you might expect. -.P -At compile time, PCRE "auto-possessifies" repeated items when it knows that -what follows cannot be part of the repeat. For example, a+[bc] is compiled as -if it were a++[bc]. The \fBpcretest\fP output when this pattern is anchored and -then applied with automatic callouts to the string "aaaa" is: -.sp - --->aaaa - +0 ^ ^ - +1 ^ a+ - +3 ^ ^ [bc] - No match -.sp -This indicates that when matching [bc] fails, there is no backtracking into a+ -and therefore the callouts that would be taken for the backtracks do not occur. -You can disable the auto-possessify feature by passing PCRE_NO_AUTO_POSSESS -to \fBpcre_compile()\fP, or starting the pattern with (*NO_AUTO_POSSESS). If -this is done in \fBpcretest\fP (using the /O qualifier), the output changes to -this: -.sp - --->aaaa - +0 ^ ^ - +1 ^ a+ - +3 ^ ^ [bc] - +3 ^ ^ [bc] - +3 ^ ^ [bc] - +3 ^^ [bc] - No match -.sp -This time, when matching [bc] fails, the matcher backtracks into a+ and tries -again, repeatedly, until a+ itself fails. -.P -Other optimizations that provide fast "no match" results also affect callouts. -For example, if the pattern is -.sp - ab(?C4)cd -.sp -PCRE knows that any matching string must contain the letter "d". If the subject -string is "abyz", the lack of "d" means that matching doesn't ever start, and -the callout is never reached. However, with "abyd", though the result is still -no match, the callout is obeyed. -.P -If the pattern is studied, PCRE knows the minimum length of a matching string, -and will immediately give a "no match" return without actually running a match -if the subject is not long enough, or, for unanchored patterns, if it has -been scanned far enough. -.P -You can disable these optimizations by passing the PCRE_NO_START_OPTIMIZE -option to the matching function, or by starting the pattern with -(*NO_START_OPT). This slows down the matching process, but does ensure that -callouts such as the example above are obeyed. -. -. -.SH "THE CALLOUT INTERFACE" -.rs -.sp -During matching, when PCRE reaches a callout point, the external function -defined by \fIpcre_callout\fP or \fIpcre[16|32]_callout\fP is called (if it is -set). This applies to both normal and DFA matching. The only argument to the -callout function is a pointer to a \fBpcre_callout\fP or -\fBpcre[16|32]_callout\fP block. These structures contains the following -fields: -.sp - int \fIversion\fP; - int \fIcallout_number\fP; - int *\fIoffset_vector\fP; - const char *\fIsubject\fP; (8-bit version) - PCRE_SPTR16 \fIsubject\fP; (16-bit version) - PCRE_SPTR32 \fIsubject\fP; (32-bit version) - int \fIsubject_length\fP; - int \fIstart_match\fP; - int \fIcurrent_position\fP; - int \fIcapture_top\fP; - int \fIcapture_last\fP; - void *\fIcallout_data\fP; - int \fIpattern_position\fP; - int \fInext_item_length\fP; - const unsigned char *\fImark\fP; (8-bit version) - const PCRE_UCHAR16 *\fImark\fP; (16-bit version) - const PCRE_UCHAR32 *\fImark\fP; (32-bit version) -.sp -The \fIversion\fP field is an integer containing the version number of the -block format. The initial version was 0; the current version is 2. The version -number will change again in future if additional fields are added, but the -intention is never to remove any of the existing fields. -.P -The \fIcallout_number\fP field contains the number of the callout, as compiled -into the pattern (that is, the number after ?C for manual callouts, and 255 for -automatically generated callouts). -.P -The \fIoffset_vector\fP field is a pointer to the vector of offsets that was -passed by the caller to the matching function. When \fBpcre_exec()\fP or -\fBpcre[16|32]_exec()\fP is used, the contents can be inspected, in order to -extract substrings that have been matched so far, in the same way as for -extracting substrings after a match has completed. For the DFA matching -functions, this field is not useful. -.P -The \fIsubject\fP and \fIsubject_length\fP fields contain copies of the values -that were passed to the matching function. -.P -The \fIstart_match\fP field normally contains the offset within the subject at -which the current match attempt started. However, if the escape sequence \eK -has been encountered, this value is changed to reflect the modified starting -point. If the pattern is not anchored, the callout function may be called -several times from the same point in the pattern for different starting points -in the subject. -.P -The \fIcurrent_position\fP field contains the offset within the subject of the -current match pointer. -.P -When the \fBpcre_exec()\fP or \fBpcre[16|32]_exec()\fP is used, the -\fIcapture_top\fP field contains one more than the number of the highest -numbered captured substring so far. If no substrings have been captured, the -value of \fIcapture_top\fP is one. This is always the case when the DFA -functions are used, because they do not support captured substrings. -.P -The \fIcapture_last\fP field contains the number of the most recently captured -substring. However, when a recursion exits, the value reverts to what it was -outside the recursion, as do the values of all captured substrings. If no -substrings have been captured, the value of \fIcapture_last\fP is -1. This is -always the case for the DFA matching functions. -.P -The \fIcallout_data\fP field contains a value that is passed to a matching -function specifically so that it can be passed back in callouts. It is passed -in the \fIcallout_data\fP field of a \fBpcre_extra\fP or \fBpcre[16|32]_extra\fP -data structure. If no such data was passed, the value of \fIcallout_data\fP in -a callout block is NULL. There is a description of the \fBpcre_extra\fP -structure in the -.\" HREF -\fBpcreapi\fP -.\" -documentation. -.P -The \fIpattern_position\fP field is present from version 1 of the callout -structure. It contains the offset to the next item to be matched in the pattern -string. -.P -The \fInext_item_length\fP field is present from version 1 of the callout -structure. It contains the length of the next item to be matched in the pattern -string. When the callout immediately precedes an alternation bar, a closing -parenthesis, or the end of the pattern, the length is zero. When the callout -precedes an opening parenthesis, the length is that of the entire subpattern. -.P -The \fIpattern_position\fP and \fInext_item_length\fP fields are intended to -help in distinguishing between different automatic callouts, which all have the -same callout number. However, they are set for all callouts. -.P -The \fImark\fP field is present from version 2 of the callout structure. In -callouts from \fBpcre_exec()\fP or \fBpcre[16|32]_exec()\fP it contains a -pointer to the zero-terminated name of the most recently passed (*MARK), -(*PRUNE), or (*THEN) item in the match, or NULL if no such items have been -passed. Instances of (*PRUNE) or (*THEN) without a name do not obliterate a -previous (*MARK). In callouts from the DFA matching functions this field always -contains NULL. -. -. -.SH "RETURN VALUES" -.rs -.sp -The external callout function returns an integer to PCRE. If the value is zero, -matching proceeds as normal. If the value is greater than zero, matching fails -at the current point, but the testing of other matching possibilities goes -ahead, just as if a lookahead assertion had failed. If the value is less than -zero, the match is abandoned, the matching function returns the negative value. -.P -Negative values should normally be chosen from the set of PCRE_ERROR_xxx -values. In particular, PCRE_ERROR_NOMATCH forces a standard "no match" failure. -The error number PCRE_ERROR_CALLOUT is reserved for use by callout functions; -it will never be used by PCRE itself. -. -. -.SH AUTHOR -.rs -.sp -.nf -Philip Hazel -University Computing Service -Cambridge CB2 3QH, England. -.fi -. -. -.SH REVISION -.rs -.sp -.nf -Last updated: 12 November 2013 -Copyright (c) 1997-2013 University of Cambridge. -.fi diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcrecompat.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcrecompat.3 deleted file mode 100644 index 6156e776..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcrecompat.3 +++ /dev/null @@ -1,200 +0,0 @@ -.TH PCRECOMPAT 3 "10 November 2013" "PCRE 8.34" -.SH NAME -PCRE - Perl-compatible regular expressions -.SH "DIFFERENCES BETWEEN PCRE AND PERL" -.rs -.sp -This document describes the differences in the ways that PCRE and Perl handle -regular expressions. The differences described here are with respect to Perl -versions 5.10 and above. -.P -1. PCRE has only a subset of Perl's Unicode support. Details of what it does -have are given in the -.\" HREF -\fBpcreunicode\fP -.\" -page. -.P -2. PCRE allows repeat quantifiers only on parenthesized assertions, but they do -not mean what you might think. For example, (?!a){3} does not assert that the -next three characters are not "a". It just asserts that the next character is -not "a" three times (in principle: PCRE optimizes this to run the assertion -just once). Perl allows repeat quantifiers on other assertions such as \eb, but -these do not seem to have any use. -.P -3. Capturing subpatterns that occur inside negative lookahead assertions are -counted, but their entries in the offsets vector are never set. Perl sometimes -(but not always) sets its numerical variables from inside negative assertions. -.P -4. Though binary zero characters are supported in the subject string, they are -not allowed in a pattern string because it is passed as a normal C string, -terminated by zero. The escape sequence \e0 can be used in the pattern to -represent a binary zero. -.P -5. The following Perl escape sequences are not supported: \el, \eu, \eL, -\eU, and \eN when followed by a character name or Unicode value. (\eN on its -own, matching a non-newline character, is supported.) In fact these are -implemented by Perl's general string-handling and are not part of its pattern -matching engine. If any of these are encountered by PCRE, an error is -generated by default. However, if the PCRE_JAVASCRIPT_COMPAT option is set, -\eU and \eu are interpreted as JavaScript interprets them. -.P -6. The Perl escape sequences \ep, \eP, and \eX are supported only if PCRE is -built with Unicode character property support. The properties that can be -tested with \ep and \eP are limited to the general category properties such as -Lu and Nd, script names such as Greek or Han, and the derived properties Any -and L&. PCRE does support the Cs (surrogate) property, which Perl does not; the -Perl documentation says "Because Perl hides the need for the user to understand -the internal representation of Unicode characters, there is no need to -implement the somewhat messy concept of surrogates." -.P -7. PCRE does support the \eQ...\eE escape for quoting substrings. Characters in -between are treated as literals. This is slightly different from Perl in that $ -and @ are also handled as literals inside the quotes. In Perl, they cause -variable interpolation (but of course PCRE does not have variables). Note the -following examples: -.sp - Pattern PCRE matches Perl matches -.sp -.\" JOIN - \eQabc$xyz\eE abc$xyz abc followed by the - contents of $xyz - \eQabc\e$xyz\eE abc\e$xyz abc\e$xyz - \eQabc\eE\e$\eQxyz\eE abc$xyz abc$xyz -.sp -The \eQ...\eE sequence is recognized both inside and outside character classes. -.P -8. Fairly obviously, PCRE does not support the (?{code}) and (??{code}) -constructions. However, there is support for recursive patterns. This is not -available in Perl 5.8, but it is in Perl 5.10. Also, the PCRE "callout" -feature allows an external function to be called during pattern matching. See -the -.\" HREF -\fBpcrecallout\fP -.\" -documentation for details. -.P -9. Subpatterns that are called as subroutines (whether or not recursively) are -always treated as atomic groups in PCRE. This is like Python, but unlike Perl. -Captured values that are set outside a subroutine call can be reference from -inside in PCRE, but not in Perl. There is a discussion that explains these -differences in more detail in the -.\" HTML -.\" -section on recursion differences from Perl -.\" -in the -.\" HREF -\fBpcrepattern\fP -.\" -page. -.P -10. If any of the backtracking control verbs are used in a subpattern that is -called as a subroutine (whether or not recursively), their effect is confined -to that subpattern; it does not extend to the surrounding pattern. This is not -always the case in Perl. In particular, if (*THEN) is present in a group that -is called as a subroutine, its action is limited to that group, even if the -group does not contain any | characters. Note that such subpatterns are -processed as anchored at the point where they are tested. -.P -11. If a pattern contains more than one backtracking control verb, the first -one that is backtracked onto acts. For example, in the pattern -A(*COMMIT)B(*PRUNE)C a failure in B triggers (*COMMIT), but a failure in C -triggers (*PRUNE). Perl's behaviour is more complex; in many cases it is the -same as PCRE, but there are examples where it differs. -.P -12. Most backtracking verbs in assertions have their normal actions. They are -not confined to the assertion. -.P -13. There are some differences that are concerned with the settings of captured -strings when part of a pattern is repeated. For example, matching "aba" against -the pattern /^(a(b)?)+$/ in Perl leaves $2 unset, but in PCRE it is set to "b". -.P -14. PCRE's handling of duplicate subpattern numbers and duplicate subpattern -names is not as general as Perl's. This is a consequence of the fact the PCRE -works internally just with numbers, using an external table to translate -between numbers and names. In particular, a pattern such as (?|(?A)|(?B), -where the two capturing parentheses have the same number but different names, -is not supported, and causes an error at compile time. If it were allowed, it -would not be possible to distinguish which parentheses matched, because both -names map to capturing subpattern number 1. To avoid this confusing situation, -an error is given at compile time. -.P -15. Perl recognizes comments in some places that PCRE does not, for example, -between the ( and ? at the start of a subpattern. If the /x modifier is set, -Perl allows white space between ( and ? (though current Perls warn that this is -deprecated) but PCRE never does, even if the PCRE_EXTENDED option is set. -.P -16. Perl, when in warning mode, gives warnings for character classes such as -[A-\ed] or [a-[:digit:]]. It then treats the hyphens as literals. PCRE has no -warning features, so it gives an error in these cases because they are almost -certainly user mistakes. -.P -17. In PCRE, the upper/lower case character properties Lu and Ll are not -affected when case-independent matching is specified. For example, \ep{Lu} -always matches an upper case letter. I think Perl has changed in this respect; -in the release at the time of writing (5.16), \ep{Lu} and \ep{Ll} match all -letters, regardless of case, when case independence is specified. -.P -18. PCRE provides some extensions to the Perl regular expression facilities. -Perl 5.10 includes new features that are not in earlier versions of Perl, some -of which (such as named parentheses) have been in PCRE for some time. This list -is with respect to Perl 5.10: -.sp -(a) Although lookbehind assertions in PCRE must match fixed length strings, -each alternative branch of a lookbehind assertion can match a different length -of string. Perl requires them all to have the same length. -.sp -(b) If PCRE_DOLLAR_ENDONLY is set and PCRE_MULTILINE is not set, the $ -meta-character matches only at the very end of the string. -.sp -(c) If PCRE_EXTRA is set, a backslash followed by a letter with no special -meaning is faulted. Otherwise, like Perl, the backslash is quietly ignored. -(Perl can be made to issue a warning.) -.sp -(d) If PCRE_UNGREEDY is set, the greediness of the repetition quantifiers is -inverted, that is, by default they are not greedy, but if followed by a -question mark they are. -.sp -(e) PCRE_ANCHORED can be used at matching time to force a pattern to be tried -only at the first matching position in the subject string. -.sp -(f) The PCRE_NOTBOL, PCRE_NOTEOL, PCRE_NOTEMPTY, PCRE_NOTEMPTY_ATSTART, and -PCRE_NO_AUTO_CAPTURE options for \fBpcre_exec()\fP have no Perl equivalents. -.sp -(g) The \eR escape sequence can be restricted to match only CR, LF, or CRLF -by the PCRE_BSR_ANYCRLF option. -.sp -(h) The callout facility is PCRE-specific. -.sp -(i) The partial matching facility is PCRE-specific. -.sp -(j) Patterns compiled by PCRE can be saved and re-used at a later time, even on -different hosts that have the other endianness. However, this does not apply to -optimized data created by the just-in-time compiler. -.sp -(k) The alternative matching functions (\fBpcre_dfa_exec()\fP, -\fBpcre16_dfa_exec()\fP and \fBpcre32_dfa_exec()\fP,) match in a different way -and are not Perl-compatible. -.sp -(l) PCRE recognizes some special sequences such as (*CR) at the start of -a pattern that set overall options that cannot be changed within the pattern. -. -. -.SH AUTHOR -.rs -.sp -.nf -Philip Hazel -University Computing Service -Cambridge CB2 3QH, England. -.fi -. -. -.SH REVISION -.rs -.sp -.nf -Last updated: 10 November 2013 -Copyright (c) 1997-2013 University of Cambridge. -.fi diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcrecpp.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcrecpp.3 deleted file mode 100644 index fbddd86a..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcrecpp.3 +++ /dev/null @@ -1,348 +0,0 @@ -.TH PCRECPP 3 "08 January 2012" "PCRE 8.30" -.SH NAME -PCRE - Perl-compatible regular expressions. -.SH "SYNOPSIS OF C++ WRAPPER" -.rs -.sp -.B #include -. -.SH DESCRIPTION -.rs -.sp -The C++ wrapper for PCRE was provided by Google Inc. Some additional -functionality was added by Giuseppe Maxia. This brief man page was constructed -from the notes in the \fIpcrecpp.h\fP file, which should be consulted for -further details. Note that the C++ wrapper supports only the original 8-bit -PCRE library. There is no 16-bit or 32-bit support at present. -. -. -.SH "MATCHING INTERFACE" -.rs -.sp -The "FullMatch" operation checks that supplied text matches a supplied pattern -exactly. If pointer arguments are supplied, it copies matched sub-strings that -match sub-patterns into them. -.sp - Example: successful match - pcrecpp::RE re("h.*o"); - re.FullMatch("hello"); -.sp - Example: unsuccessful match (requires full match): - pcrecpp::RE re("e"); - !re.FullMatch("hello"); -.sp - Example: creating a temporary RE object: - pcrecpp::RE("h.*o").FullMatch("hello"); -.sp -You can pass in a "const char*" or a "string" for "text". The examples below -tend to use a const char*. You can, as in the different examples above, store -the RE object explicitly in a variable or use a temporary RE object. The -examples below use one mode or the other arbitrarily. Either could correctly be -used for any of these examples. -.P -You must supply extra pointer arguments to extract matched subpieces. -.sp - Example: extracts "ruby" into "s" and 1234 into "i" - int i; - string s; - pcrecpp::RE re("(\e\ew+):(\e\ed+)"); - re.FullMatch("ruby:1234", &s, &i); -.sp - Example: does not try to extract any extra sub-patterns - re.FullMatch("ruby:1234", &s); -.sp - Example: does not try to extract into NULL - re.FullMatch("ruby:1234", NULL, &i); -.sp - Example: integer overflow causes failure - !re.FullMatch("ruby:1234567891234", NULL, &i); -.sp - Example: fails because there aren't enough sub-patterns: - !pcrecpp::RE("\e\ew+:\e\ed+").FullMatch("ruby:1234", &s); -.sp - Example: fails because string cannot be stored in integer - !pcrecpp::RE("(.*)").FullMatch("ruby", &i); -.sp -The provided pointer arguments can be pointers to any scalar numeric -type, or one of: -.sp - string (matched piece is copied to string) - StringPiece (StringPiece is mutated to point to matched piece) - T (where "bool T::ParseFrom(const char*, int)" exists) - NULL (the corresponding matched sub-pattern is not copied) -.sp -The function returns true iff all of the following conditions are satisfied: -.sp - a. "text" matches "pattern" exactly; -.sp - b. The number of matched sub-patterns is >= number of supplied - pointers; -.sp - c. The "i"th argument has a suitable type for holding the - string captured as the "i"th sub-pattern. If you pass in - void * NULL for the "i"th argument, or a non-void * NULL - of the correct type, or pass fewer arguments than the - number of sub-patterns, "i"th captured sub-pattern is - ignored. -.sp -CAVEAT: An optional sub-pattern that does not exist in the matched -string is assigned the empty string. Therefore, the following will -return false (because the empty string is not a valid number): -.sp - int number; - pcrecpp::RE::FullMatch("abc", "[a-z]+(\e\ed+)?", &number); -.sp -The matching interface supports at most 16 arguments per call. -If you need more, consider using the more general interface -\fBpcrecpp::RE::DoMatch\fP. See \fBpcrecpp.h\fP for the signature for -\fBDoMatch\fP. -.P -NOTE: Do not use \fBno_arg\fP, which is used internally to mark the end of a -list of optional arguments, as a placeholder for missing arguments, as this can -lead to segfaults. -. -. -.SH "QUOTING METACHARACTERS" -.rs -.sp -You can use the "QuoteMeta" operation to insert backslashes before all -potentially meaningful characters in a string. The returned string, used as a -regular expression, will exactly match the original string. -.sp - Example: - string quoted = RE::QuoteMeta(unquoted); -.sp -Note that it's legal to escape a character even if it has no special meaning in -a regular expression -- so this function does that. (This also makes it -identical to the perl function of the same name; see "perldoc -f quotemeta".) -For example, "1.5-2.0?" becomes "1\e.5\e-2\e.0\e?". -. -.SH "PARTIAL MATCHES" -.rs -.sp -You can use the "PartialMatch" operation when you want the pattern -to match any substring of the text. -.sp - Example: simple search for a string: - pcrecpp::RE("ell").PartialMatch("hello"); -.sp - Example: find first number in a string: - int number; - pcrecpp::RE re("(\e\ed+)"); - re.PartialMatch("x*100 + 20", &number); - assert(number == 100); -. -. -.SH "UTF-8 AND THE MATCHING INTERFACE" -.rs -.sp -By default, pattern and text are plain text, one byte per character. The UTF8 -flag, passed to the constructor, causes both pattern and string to be treated -as UTF-8 text, still a byte stream but potentially multiple bytes per -character. In practice, the text is likelier to be UTF-8 than the pattern, but -the match returned may depend on the UTF8 flag, so always use it when matching -UTF8 text. For example, "." will match one byte normally but with UTF8 set may -match up to three bytes of a multi-byte character. -.sp - Example: - pcrecpp::RE_Options options; - options.set_utf8(); - pcrecpp::RE re(utf8_pattern, options); - re.FullMatch(utf8_string); -.sp - Example: using the convenience function UTF8(): - pcrecpp::RE re(utf8_pattern, pcrecpp::UTF8()); - re.FullMatch(utf8_string); -.sp -NOTE: The UTF8 flag is ignored if pcre was not configured with the - --enable-utf8 flag. -. -. -.SH "PASSING MODIFIERS TO THE REGULAR EXPRESSION ENGINE" -.rs -.sp -PCRE defines some modifiers to change the behavior of the regular expression -engine. The C++ wrapper defines an auxiliary class, RE_Options, as a vehicle to -pass such modifiers to a RE class. Currently, the following modifiers are -supported: -.sp - modifier description Perl corresponding -.sp - PCRE_CASELESS case insensitive match /i - PCRE_MULTILINE multiple lines match /m - PCRE_DOTALL dot matches newlines /s - PCRE_DOLLAR_ENDONLY $ matches only at end N/A - PCRE_EXTRA strict escape parsing N/A - PCRE_EXTENDED ignore white spaces /x - PCRE_UTF8 handles UTF8 chars built-in - PCRE_UNGREEDY reverses * and *? N/A - PCRE_NO_AUTO_CAPTURE disables capturing parens N/A (*) -.sp -(*) Both Perl and PCRE allow non capturing parentheses by means of the -"?:" modifier within the pattern itself. e.g. (?:ab|cd) does not -capture, while (ab|cd) does. -.P -For a full account on how each modifier works, please check the -PCRE API reference page. -.P -For each modifier, there are two member functions whose name is made -out of the modifier in lowercase, without the "PCRE_" prefix. For -instance, PCRE_CASELESS is handled by -.sp - bool caseless() -.sp -which returns true if the modifier is set, and -.sp - RE_Options & set_caseless(bool) -.sp -which sets or unsets the modifier. Moreover, PCRE_EXTRA_MATCH_LIMIT can be -accessed through the \fBset_match_limit()\fP and \fBmatch_limit()\fP member -functions. Setting \fImatch_limit\fP to a non-zero value will limit the -execution of pcre to keep it from doing bad things like blowing the stack or -taking an eternity to return a result. A value of 5000 is good enough to stop -stack blowup in a 2MB thread stack. Setting \fImatch_limit\fP to zero disables -match limiting. Alternatively, you can call \fBmatch_limit_recursion()\fP -which uses PCRE_EXTRA_MATCH_LIMIT_RECURSION to limit how much PCRE -recurses. \fBmatch_limit()\fP limits the number of matches PCRE does; -\fBmatch_limit_recursion()\fP limits the depth of internal recursion, and -therefore the amount of stack that is used. -.P -Normally, to pass one or more modifiers to a RE class, you declare -a \fIRE_Options\fP object, set the appropriate options, and pass this -object to a RE constructor. Example: -.sp - RE_Options opt; - opt.set_caseless(true); - if (RE("HELLO", opt).PartialMatch("hello world")) ... -.sp -RE_options has two constructors. The default constructor takes no arguments and -creates a set of flags that are off by default. The optional parameter -\fIoption_flags\fP is to facilitate transfer of legacy code from C programs. -This lets you do -.sp - RE(pattern, - RE_Options(PCRE_CASELESS|PCRE_MULTILINE)).PartialMatch(str); -.sp -However, new code is better off doing -.sp - RE(pattern, - RE_Options().set_caseless(true).set_multiline(true)) - .PartialMatch(str); -.sp -If you are going to pass one of the most used modifiers, there are some -convenience functions that return a RE_Options class with the -appropriate modifier already set: \fBCASELESS()\fP, \fBUTF8()\fP, -\fBMULTILINE()\fP, \fBDOTALL\fP(), and \fBEXTENDED()\fP. -.P -If you need to set several options at once, and you don't want to go through -the pains of declaring a RE_Options object and setting several options, there -is a parallel method that give you such ability on the fly. You can concatenate -several \fBset_xxxxx()\fP member functions, since each of them returns a -reference to its class object. For example, to pass PCRE_CASELESS, -PCRE_EXTENDED, and PCRE_MULTILINE to a RE with one statement, you may write: -.sp - RE(" ^ xyz \e\es+ .* blah$", - RE_Options() - .set_caseless(true) - .set_extended(true) - .set_multiline(true)).PartialMatch(sometext); -.sp -. -. -.SH "SCANNING TEXT INCREMENTALLY" -.rs -.sp -The "Consume" operation may be useful if you want to repeatedly -match regular expressions at the front of a string and skip over -them as they match. This requires use of the "StringPiece" type, -which represents a sub-range of a real string. Like RE, StringPiece -is defined in the pcrecpp namespace. -.sp - Example: read lines of the form "var = value" from a string. - string contents = ...; // Fill string somehow - pcrecpp::StringPiece input(contents); // Wrap in a StringPiece -.sp - string var; - int value; - pcrecpp::RE re("(\e\ew+) = (\e\ed+)\en"); - while (re.Consume(&input, &var, &value)) { - ...; - } -.sp -Each successful call to "Consume" will set "var/value", and also -advance "input" so it points past the matched text. -.P -The "FindAndConsume" operation is similar to "Consume" but does not -anchor your match at the beginning of the string. For example, you -could extract all words from a string by repeatedly calling -.sp - pcrecpp::RE("(\e\ew+)").FindAndConsume(&input, &word) -. -. -.SH "PARSING HEX/OCTAL/C-RADIX NUMBERS" -.rs -.sp -By default, if you pass a pointer to a numeric value, the -corresponding text is interpreted as a base-10 number. You can -instead wrap the pointer with a call to one of the operators Hex(), -Octal(), or CRadix() to interpret the text in another base. The -CRadix operator interprets C-style "0" (base-8) and "0x" (base-16) -prefixes, but defaults to base-10. -.sp - Example: - int a, b, c, d; - pcrecpp::RE re("(.*) (.*) (.*) (.*)"); - re.FullMatch("100 40 0100 0x40", - pcrecpp::Octal(&a), pcrecpp::Hex(&b), - pcrecpp::CRadix(&c), pcrecpp::CRadix(&d)); -.sp -will leave 64 in a, b, c, and d. -. -. -.SH "REPLACING PARTS OF STRINGS" -.rs -.sp -You can replace the first match of "pattern" in "str" with "rewrite". -Within "rewrite", backslash-escaped digits (\e1 to \e9) can be -used to insert text matching corresponding parenthesized group -from the pattern. \e0 in "rewrite" refers to the entire matching -text. For example: -.sp - string s = "yabba dabba doo"; - pcrecpp::RE("b+").Replace("d", &s); -.sp -will leave "s" containing "yada dabba doo". The result is true if the pattern -matches and a replacement occurs, false otherwise. -.P -\fBGlobalReplace\fP is like \fBReplace\fP except that it replaces all -occurrences of the pattern in the string with the rewrite. Replacements are -not subject to re-matching. For example: -.sp - string s = "yabba dabba doo"; - pcrecpp::RE("b+").GlobalReplace("d", &s); -.sp -will leave "s" containing "yada dada doo". It returns the number of -replacements made. -.P -\fBExtract\fP is like \fBReplace\fP, except that if the pattern matches, -"rewrite" is copied into "out" (an additional argument) with substitutions. -The non-matching portions of "text" are ignored. Returns true iff a match -occurred and the extraction happened successfully; if no match occurs, the -string is left unaffected. -. -. -.SH AUTHOR -.rs -.sp -.nf -The C++ wrapper was contributed by Google Inc. -Copyright (c) 2007 Google Inc. -.fi -. -. -.SH REVISION -.rs -.sp -.nf -Last updated: 08 January 2012 -.fi diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcredemo.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcredemo.3 deleted file mode 100644 index 194629b1..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcredemo.3 +++ /dev/null @@ -1,424 +0,0 @@ -.\" Start example. -.de EX -. nr mE \\n(.f -. nf -. nh -. ft CW -.. -. -. -.\" End example. -.de EE -. ft \\n(mE -. fi -. hy \\n(HY -.. -. -.EX -/************************************************* -* PCRE DEMONSTRATION PROGRAM * -*************************************************/ - -/* This is a demonstration program to illustrate the most straightforward ways -of calling the PCRE regular expression library from a C program. See the -pcresample documentation for a short discussion ("man pcresample" if you have -the PCRE man pages installed). - -In Unix-like environments, if PCRE is installed in your standard system -libraries, you should be able to compile this program using this command: - -gcc -Wall pcredemo.c -lpcre -o pcredemo - -If PCRE is not installed in a standard place, it is likely to be installed with -support for the pkg-config mechanism. If you have pkg-config, you can compile -this program using this command: - -gcc -Wall pcredemo.c `pkg-config --cflags --libs libpcre` -o pcredemo - -If you do not have pkg-config, you may have to use this: - -gcc -Wall pcredemo.c -I/usr/local/include -L/usr/local/lib \e - -R/usr/local/lib -lpcre -o pcredemo - -Replace "/usr/local/include" and "/usr/local/lib" with wherever the include and -library files for PCRE are installed on your system. Only some operating -systems (e.g. Solaris) use the -R option. - -Building under Windows: - -If you want to statically link this program against a non-dll .a file, you must -define PCRE_STATIC before including pcre.h, otherwise the pcre_malloc() and -pcre_free() exported functions will be declared __declspec(dllimport), with -unwanted results. So in this environment, uncomment the following line. */ - -/* #define PCRE_STATIC */ - -#include -#include -#include - -#define OVECCOUNT 30 /* should be a multiple of 3 */ - - -int main(int argc, char **argv) -{ -pcre *re; -const char *error; -char *pattern; -char *subject; -unsigned char *name_table; -unsigned int option_bits; -int erroffset; -int find_all; -int crlf_is_newline; -int namecount; -int name_entry_size; -int ovector[OVECCOUNT]; -int subject_length; -int rc, i; -int utf8; - - -/************************************************************************** -* First, sort out the command line. There is only one possible option at * -* the moment, "-g" to request repeated matching to find all occurrences, * -* like Perl's /g option. We set the variable find_all to a non-zero value * -* if the -g option is present. Apart from that, there must be exactly two * -* arguments. * -**************************************************************************/ - -find_all = 0; -for (i = 1; i < argc; i++) - { - if (strcmp(argv[i], "-g") == 0) find_all = 1; - else break; - } - -/* After the options, we require exactly two arguments, which are the pattern, -and the subject string. */ - -if (argc - i != 2) - { - printf("Two arguments required: a regex and a subject string\en"); - return 1; - } - -pattern = argv[i]; -subject = argv[i+1]; -subject_length = (int)strlen(subject); - - -/************************************************************************* -* Now we are going to compile the regular expression pattern, and handle * -* and errors that are detected. * -*************************************************************************/ - -re = pcre_compile( - pattern, /* the pattern */ - 0, /* default options */ - &error, /* for error message */ - &erroffset, /* for error offset */ - NULL); /* use default character tables */ - -/* Compilation failed: print the error message and exit */ - -if (re == NULL) - { - printf("PCRE compilation failed at offset %d: %s\en", erroffset, error); - return 1; - } - - -/************************************************************************* -* If the compilation succeeded, we call PCRE again, in order to do a * -* pattern match against the subject string. This does just ONE match. If * -* further matching is needed, it will be done below. * -*************************************************************************/ - -rc = pcre_exec( - re, /* the compiled pattern */ - NULL, /* no extra data - we didn't study the pattern */ - subject, /* the subject string */ - subject_length, /* the length of the subject */ - 0, /* start at offset 0 in the subject */ - 0, /* default options */ - ovector, /* output vector for substring information */ - OVECCOUNT); /* number of elements in the output vector */ - -/* Matching failed: handle error cases */ - -if (rc < 0) - { - switch(rc) - { - case PCRE_ERROR_NOMATCH: printf("No match\en"); break; - /* - Handle other special cases if you like - */ - default: printf("Matching error %d\en", rc); break; - } - pcre_free(re); /* Release memory used for the compiled pattern */ - return 1; - } - -/* Match succeded */ - -printf("\enMatch succeeded at offset %d\en", ovector[0]); - - -/************************************************************************* -* We have found the first match within the subject string. If the output * -* vector wasn't big enough, say so. Then output any substrings that were * -* captured. * -*************************************************************************/ - -/* The output vector wasn't big enough */ - -if (rc == 0) - { - rc = OVECCOUNT/3; - printf("ovector only has room for %d captured substrings\en", rc - 1); - } - -/* Show substrings stored in the output vector by number. Obviously, in a real -application you might want to do things other than print them. */ - -for (i = 0; i < rc; i++) - { - char *substring_start = subject + ovector[2*i]; - int substring_length = ovector[2*i+1] - ovector[2*i]; - printf("%2d: %.*s\en", i, substring_length, substring_start); - } - - -/************************************************************************** -* That concludes the basic part of this demonstration program. We have * -* compiled a pattern, and performed a single match. The code that follows * -* shows first how to access named substrings, and then how to code for * -* repeated matches on the same subject. * -**************************************************************************/ - -/* See if there are any named substrings, and if so, show them by name. First -we have to extract the count of named parentheses from the pattern. */ - -(void)pcre_fullinfo( - re, /* the compiled pattern */ - NULL, /* no extra data - we didn't study the pattern */ - PCRE_INFO_NAMECOUNT, /* number of named substrings */ - &namecount); /* where to put the answer */ - -if (namecount <= 0) printf("No named substrings\en"); else - { - unsigned char *tabptr; - printf("Named substrings\en"); - - /* Before we can access the substrings, we must extract the table for - translating names to numbers, and the size of each entry in the table. */ - - (void)pcre_fullinfo( - re, /* the compiled pattern */ - NULL, /* no extra data - we didn't study the pattern */ - PCRE_INFO_NAMETABLE, /* address of the table */ - &name_table); /* where to put the answer */ - - (void)pcre_fullinfo( - re, /* the compiled pattern */ - NULL, /* no extra data - we didn't study the pattern */ - PCRE_INFO_NAMEENTRYSIZE, /* size of each entry in the table */ - &name_entry_size); /* where to put the answer */ - - /* Now we can scan the table and, for each entry, print the number, the name, - and the substring itself. */ - - tabptr = name_table; - for (i = 0; i < namecount; i++) - { - int n = (tabptr[0] << 8) | tabptr[1]; - printf("(%d) %*s: %.*s\en", n, name_entry_size - 3, tabptr + 2, - ovector[2*n+1] - ovector[2*n], subject + ovector[2*n]); - tabptr += name_entry_size; - } - } - - -/************************************************************************* -* If the "-g" option was given on the command line, we want to continue * -* to search for additional matches in the subject string, in a similar * -* way to the /g option in Perl. This turns out to be trickier than you * -* might think because of the possibility of matching an empty string. * -* What happens is as follows: * -* * -* If the previous match was NOT for an empty string, we can just start * -* the next match at the end of the previous one. * -* * -* If the previous match WAS for an empty string, we can't do that, as it * -* would lead to an infinite loop. Instead, a special call of pcre_exec() * -* is made with the PCRE_NOTEMPTY_ATSTART and PCRE_ANCHORED flags set. * -* The first of these tells PCRE that an empty string at the start of the * -* subject is not a valid match; other possibilities must be tried. The * -* second flag restricts PCRE to one match attempt at the initial string * -* position. If this match succeeds, an alternative to the empty string * -* match has been found, and we can print it and proceed round the loop, * -* advancing by the length of whatever was found. If this match does not * -* succeed, we still stay in the loop, advancing by just one character. * -* In UTF-8 mode, which can be set by (*UTF8) in the pattern, this may be * -* more than one byte. * -* * -* However, there is a complication concerned with newlines. When the * -* newline convention is such that CRLF is a valid newline, we must * -* advance by two characters rather than one. The newline convention can * -* be set in the regex by (*CR), etc.; if not, we must find the default. * -*************************************************************************/ - -if (!find_all) /* Check for -g */ - { - pcre_free(re); /* Release the memory used for the compiled pattern */ - return 0; /* Finish unless -g was given */ - } - -/* Before running the loop, check for UTF-8 and whether CRLF is a valid newline -sequence. First, find the options with which the regex was compiled; extract -the UTF-8 state, and mask off all but the newline options. */ - -(void)pcre_fullinfo(re, NULL, PCRE_INFO_OPTIONS, &option_bits); -utf8 = option_bits & PCRE_UTF8; -option_bits &= PCRE_NEWLINE_CR|PCRE_NEWLINE_LF|PCRE_NEWLINE_CRLF| - PCRE_NEWLINE_ANY|PCRE_NEWLINE_ANYCRLF; - -/* If no newline options were set, find the default newline convention from the -build configuration. */ - -if (option_bits == 0) - { - int d; - (void)pcre_config(PCRE_CONFIG_NEWLINE, &d); - /* Note that these values are always the ASCII ones, even in - EBCDIC environments. CR = 13, NL = 10. */ - option_bits = (d == 13)? PCRE_NEWLINE_CR : - (d == 10)? PCRE_NEWLINE_LF : - (d == (13<<8 | 10))? PCRE_NEWLINE_CRLF : - (d == -2)? PCRE_NEWLINE_ANYCRLF : - (d == -1)? PCRE_NEWLINE_ANY : 0; - } - -/* See if CRLF is a valid newline sequence. */ - -crlf_is_newline = - option_bits == PCRE_NEWLINE_ANY || - option_bits == PCRE_NEWLINE_CRLF || - option_bits == PCRE_NEWLINE_ANYCRLF; - -/* Loop for second and subsequent matches */ - -for (;;) - { - int options = 0; /* Normally no options */ - int start_offset = ovector[1]; /* Start at end of previous match */ - - /* If the previous match was for an empty string, we are finished if we are - at the end of the subject. Otherwise, arrange to run another match at the - same point to see if a non-empty match can be found. */ - - if (ovector[0] == ovector[1]) - { - if (ovector[0] == subject_length) break; - options = PCRE_NOTEMPTY_ATSTART | PCRE_ANCHORED; - } - - /* Run the next matching operation */ - - rc = pcre_exec( - re, /* the compiled pattern */ - NULL, /* no extra data - we didn't study the pattern */ - subject, /* the subject string */ - subject_length, /* the length of the subject */ - start_offset, /* starting offset in the subject */ - options, /* options */ - ovector, /* output vector for substring information */ - OVECCOUNT); /* number of elements in the output vector */ - - /* This time, a result of NOMATCH isn't an error. If the value in "options" - is zero, it just means we have found all possible matches, so the loop ends. - Otherwise, it means we have failed to find a non-empty-string match at a - point where there was a previous empty-string match. In this case, we do what - Perl does: advance the matching position by one character, and continue. We - do this by setting the "end of previous match" offset, because that is picked - up at the top of the loop as the point at which to start again. - - There are two complications: (a) When CRLF is a valid newline sequence, and - the current position is just before it, advance by an extra byte. (b) - Otherwise we must ensure that we skip an entire UTF-8 character if we are in - UTF-8 mode. */ - - if (rc == PCRE_ERROR_NOMATCH) - { - if (options == 0) break; /* All matches found */ - ovector[1] = start_offset + 1; /* Advance one byte */ - if (crlf_is_newline && /* If CRLF is newline & */ - start_offset < subject_length - 1 && /* we are at CRLF, */ - subject[start_offset] == '\er' && - subject[start_offset + 1] == '\en') - ovector[1] += 1; /* Advance by one more. */ - else if (utf8) /* Otherwise, ensure we */ - { /* advance a whole UTF-8 */ - while (ovector[1] < subject_length) /* character. */ - { - if ((subject[ovector[1]] & 0xc0) != 0x80) break; - ovector[1] += 1; - } - } - continue; /* Go round the loop again */ - } - - /* Other matching errors are not recoverable. */ - - if (rc < 0) - { - printf("Matching error %d\en", rc); - pcre_free(re); /* Release memory used for the compiled pattern */ - return 1; - } - - /* Match succeded */ - - printf("\enMatch succeeded again at offset %d\en", ovector[0]); - - /* The match succeeded, but the output vector wasn't big enough. */ - - if (rc == 0) - { - rc = OVECCOUNT/3; - printf("ovector only has room for %d captured substrings\en", rc - 1); - } - - /* As before, show substrings stored in the output vector by number, and then - also any named substrings. */ - - for (i = 0; i < rc; i++) - { - char *substring_start = subject + ovector[2*i]; - int substring_length = ovector[2*i+1] - ovector[2*i]; - printf("%2d: %.*s\en", i, substring_length, substring_start); - } - - if (namecount <= 0) printf("No named substrings\en"); else - { - unsigned char *tabptr = name_table; - printf("Named substrings\en"); - for (i = 0; i < namecount; i++) - { - int n = (tabptr[0] << 8) | tabptr[1]; - printf("(%d) %*s: %.*s\en", n, name_entry_size - 3, tabptr + 2, - ovector[2*n+1] - ovector[2*n], subject + ovector[2*n]); - tabptr += name_entry_size; - } - } - } /* End of loop to find second and subsequent matches */ - -printf("\en"); -pcre_free(re); /* Release memory used for the compiled pattern */ -return 0; -} - -/* End of pcredemo.c */ -.EE diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcrejit.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcrejit.3 deleted file mode 100644 index 3b785f0f..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcrejit.3 +++ /dev/null @@ -1,473 +0,0 @@ -.TH PCREJIT 3 "05 July 2017" "PCRE 8.41" -.SH NAME -PCRE - Perl-compatible regular expressions -.SH "PCRE JUST-IN-TIME COMPILER SUPPORT" -.rs -.sp -Just-in-time compiling is a heavyweight optimization that can greatly speed up -pattern matching. However, it comes at the cost of extra processing before the -match is performed. Therefore, it is of most benefit when the same pattern is -going to be matched many times. This does not necessarily mean many calls of a -matching function; if the pattern is not anchored, matching attempts may take -place many times at various positions in the subject, even for a single call. -Therefore, if the subject string is very long, it may still pay to use JIT for -one-off matches. -.P -JIT support applies only to the traditional Perl-compatible matching function. -It does not apply when the DFA matching function is being used. The code for -this support was written by Zoltan Herczeg. -. -. -.SH "8-BIT, 16-BIT AND 32-BIT SUPPORT" -.rs -.sp -JIT support is available for all of the 8-bit, 16-bit and 32-bit PCRE -libraries. To keep this documentation simple, only the 8-bit interface is -described in what follows. If you are using the 16-bit library, substitute the -16-bit functions and 16-bit structures (for example, \fIpcre16_jit_stack\fP -instead of \fIpcre_jit_stack\fP). If you are using the 32-bit library, -substitute the 32-bit functions and 32-bit structures (for example, -\fIpcre32_jit_stack\fP instead of \fIpcre_jit_stack\fP). -. -. -.SH "AVAILABILITY OF JIT SUPPORT" -.rs -.sp -JIT support is an optional feature of PCRE. The "configure" option --enable-jit -(or equivalent CMake option) must be set when PCRE is built if you want to use -JIT. The support is limited to the following hardware platforms: -.sp - ARM v5, v7, and Thumb2 - Intel x86 32-bit and 64-bit - MIPS 32-bit - Power PC 32-bit and 64-bit - SPARC 32-bit (experimental) -.sp -If --enable-jit is set on an unsupported platform, compilation fails. -.P -A program that is linked with PCRE 8.20 or later can tell if JIT support is -available by calling \fBpcre_config()\fP with the PCRE_CONFIG_JIT option. The -result is 1 when JIT is available, and 0 otherwise. However, a simple program -does not need to check this in order to use JIT. The normal API is implemented -in a way that falls back to the interpretive code if JIT is not available. For -programs that need the best possible performance, there is also a "fast path" -API that is JIT-specific. -.P -If your program may sometimes be linked with versions of PCRE that are older -than 8.20, but you want to use JIT when it is available, you can test the -values of PCRE_MAJOR and PCRE_MINOR, or the existence of a JIT macro such as -PCRE_CONFIG_JIT, for compile-time control of your code. Also beware that the -\fBpcre_jit_exec()\fP function was not available at all before 8.32, -and may not be available at all if PCRE isn't compiled with ---enable-jit. See the "JIT FAST PATH API" section below for details. -. -. -.SH "SIMPLE USE OF JIT" -.rs -.sp -You have to do two things to make use of the JIT support in the simplest way: -.sp - (1) Call \fBpcre_study()\fP with the PCRE_STUDY_JIT_COMPILE option for - each compiled pattern, and pass the resulting \fBpcre_extra\fP block to - \fBpcre_exec()\fP. -.sp - (2) Use \fBpcre_free_study()\fP to free the \fBpcre_extra\fP block when it is - no longer needed, instead of just freeing it yourself. This ensures that - any JIT data is also freed. -.sp -For a program that may be linked with pre-8.20 versions of PCRE, you can insert -.sp - #ifndef PCRE_STUDY_JIT_COMPILE - #define PCRE_STUDY_JIT_COMPILE 0 - #endif -.sp -so that no option is passed to \fBpcre_study()\fP, and then use something like -this to free the study data: -.sp - #ifdef PCRE_CONFIG_JIT - pcre_free_study(study_ptr); - #else - pcre_free(study_ptr); - #endif -.sp -PCRE_STUDY_JIT_COMPILE requests the JIT compiler to generate code for complete -matches. If you want to run partial matches using the PCRE_PARTIAL_HARD or -PCRE_PARTIAL_SOFT options of \fBpcre_exec()\fP, you should set one or both of -the following options in addition to, or instead of, PCRE_STUDY_JIT_COMPILE -when you call \fBpcre_study()\fP: -.sp - PCRE_STUDY_JIT_PARTIAL_HARD_COMPILE - PCRE_STUDY_JIT_PARTIAL_SOFT_COMPILE -.sp -If using \fBpcre_jit_exec()\fP and supporting a pre-8.32 version of -PCRE, you can insert: -.sp - #if PCRE_MAJOR >= 8 && PCRE_MINOR >= 32 - pcre_jit_exec(...); - #else - pcre_exec(...) - #endif -.sp -but as described in the "JIT FAST PATH API" section below this assumes -version 8.32 and later are compiled with --enable-jit, which may -break. -.sp -The JIT compiler generates different optimized code for each of the three -modes (normal, soft partial, hard partial). When \fBpcre_exec()\fP is called, -the appropriate code is run if it is available. Otherwise, the pattern is -matched using interpretive code. -.P -In some circumstances you may need to call additional functions. These are -described in the section entitled -.\" HTML -.\" -"Controlling the JIT stack" -.\" -below. -.P -If JIT support is not available, PCRE_STUDY_JIT_COMPILE etc. are ignored, and -no JIT data is created. Otherwise, the compiled pattern is passed to the JIT -compiler, which turns it into machine code that executes much faster than the -normal interpretive code. When \fBpcre_exec()\fP is passed a \fBpcre_extra\fP -block containing a pointer to JIT code of the appropriate mode (normal or -hard/soft partial), it obeys that code instead of running the interpreter. The -result is identical, but the compiled JIT code runs much faster. -.P -There are some \fBpcre_exec()\fP options that are not supported for JIT -execution. There are also some pattern items that JIT cannot handle. Details -are given below. In both cases, execution automatically falls back to the -interpretive code. If you want to know whether JIT was actually used for a -particular match, you should arrange for a JIT callback function to be set up -as described in the section entitled -.\" HTML -.\" -"Controlling the JIT stack" -.\" -below, even if you do not need to supply a non-default JIT stack. Such a -callback function is called whenever JIT code is about to be obeyed. If the -execution options are not right for JIT execution, the callback function is not -obeyed. -.P -If the JIT compiler finds an unsupported item, no JIT data is generated. You -can find out if JIT execution is available after studying a pattern by calling -\fBpcre_fullinfo()\fP with the PCRE_INFO_JIT option. A result of 1 means that -JIT compilation was successful. A result of 0 means that JIT support is not -available, or the pattern was not studied with PCRE_STUDY_JIT_COMPILE etc., or -the JIT compiler was not able to handle the pattern. -.P -Once a pattern has been studied, with or without JIT, it can be used as many -times as you like for matching different subject strings. -. -. -.SH "UNSUPPORTED OPTIONS AND PATTERN ITEMS" -.rs -.sp -The only \fBpcre_exec()\fP options that are supported for JIT execution are -PCRE_NO_UTF8_CHECK, PCRE_NO_UTF16_CHECK, PCRE_NO_UTF32_CHECK, PCRE_NOTBOL, -PCRE_NOTEOL, PCRE_NOTEMPTY, PCRE_NOTEMPTY_ATSTART, PCRE_PARTIAL_HARD, and -PCRE_PARTIAL_SOFT. -.P -The only unsupported pattern items are \eC (match a single data unit) when -running in a UTF mode, and a callout immediately before an assertion condition -in a conditional group. -. -. -.SH "RETURN VALUES FROM JIT EXECUTION" -.rs -.sp -When a pattern is matched using JIT execution, the return values are the same -as those given by the interpretive \fBpcre_exec()\fP code, with the addition of -one new error code: PCRE_ERROR_JIT_STACKLIMIT. This means that the memory used -for the JIT stack was insufficient. See -.\" HTML -.\" -"Controlling the JIT stack" -.\" -below for a discussion of JIT stack usage. For compatibility with the -interpretive \fBpcre_exec()\fP code, no more than two-thirds of the -\fIovector\fP argument is used for passing back captured substrings. -.P -The error code PCRE_ERROR_MATCHLIMIT is returned by the JIT code if searching a -very large pattern tree goes on for too long, as it is in the same circumstance -when JIT is not used, but the details of exactly what is counted are not the -same. The PCRE_ERROR_RECURSIONLIMIT error code is never returned by JIT -execution. -. -. -.SH "SAVING AND RESTORING COMPILED PATTERNS" -.rs -.sp -The code that is generated by the JIT compiler is architecture-specific, and is -also position dependent. For those reasons it cannot be saved (in a file or -database) and restored later like the bytecode and other data of a compiled -pattern. Saving and restoring compiled patterns is not something many people -do. More detail about this facility is given in the -.\" HREF -\fBpcreprecompile\fP -.\" -documentation. It should be possible to run \fBpcre_study()\fP on a saved and -restored pattern, and thereby recreate the JIT data, but because JIT -compilation uses significant resources, it is probably not worth doing this; -you might as well recompile the original pattern. -. -. -.\" HTML -.SH "CONTROLLING THE JIT STACK" -.rs -.sp -When the compiled JIT code runs, it needs a block of memory to use as a stack. -By default, it uses 32K on the machine stack. However, some large or -complicated patterns need more than this. The error PCRE_ERROR_JIT_STACKLIMIT -is given when there is not enough stack. Three functions are provided for -managing blocks of memory for use as JIT stacks. There is further discussion -about the use of JIT stacks in the section entitled -.\" HTML -.\" -"JIT stack FAQ" -.\" -below. -.P -The \fBpcre_jit_stack_alloc()\fP function creates a JIT stack. Its arguments -are a starting size and a maximum size, and it returns a pointer to an opaque -structure of type \fBpcre_jit_stack\fP, or NULL if there is an error. The -\fBpcre_jit_stack_free()\fP function can be used to free a stack that is no -longer needed. (For the technically minded: the address space is allocated by -mmap or VirtualAlloc.) -.P -JIT uses far less memory for recursion than the interpretive code, -and a maximum stack size of 512K to 1M should be more than enough for any -pattern. -.P -The \fBpcre_assign_jit_stack()\fP function specifies which stack JIT code -should use. Its arguments are as follows: -.sp - pcre_extra *extra - pcre_jit_callback callback - void *data -.sp -The \fIextra\fP argument must be the result of studying a pattern with -PCRE_STUDY_JIT_COMPILE etc. There are three cases for the values of the other -two options: -.sp - (1) If \fIcallback\fP is NULL and \fIdata\fP is NULL, an internal 32K block - on the machine stack is used. -.sp - (2) If \fIcallback\fP is NULL and \fIdata\fP is not NULL, \fIdata\fP must be - a valid JIT stack, the result of calling \fBpcre_jit_stack_alloc()\fP. -.sp - (3) If \fIcallback\fP is not NULL, it must point to a function that is - called with \fIdata\fP as an argument at the start of matching, in - order to set up a JIT stack. If the return from the callback - function is NULL, the internal 32K stack is used; otherwise the - return value must be a valid JIT stack, the result of calling - \fBpcre_jit_stack_alloc()\fP. -.sp -A callback function is obeyed whenever JIT code is about to be run; it is not -obeyed when \fBpcre_exec()\fP is called with options that are incompatible for -JIT execution. A callback function can therefore be used to determine whether a -match operation was executed by JIT or by the interpreter. -.P -You may safely use the same JIT stack for more than one pattern (either by -assigning directly or by callback), as long as the patterns are all matched -sequentially in the same thread. In a multithread application, if you do not -specify a JIT stack, or if you assign or pass back NULL from a callback, that -is thread-safe, because each thread has its own machine stack. However, if you -assign or pass back a non-NULL JIT stack, this must be a different stack for -each thread so that the application is thread-safe. -.P -Strictly speaking, even more is allowed. You can assign the same non-NULL stack -to any number of patterns as long as they are not used for matching by multiple -threads at the same time. For example, you can assign the same stack to all -compiled patterns, and use a global mutex in the callback to wait until the -stack is available for use. However, this is an inefficient solution, and not -recommended. -.P -This is a suggestion for how a multithreaded program that needs to set up -non-default JIT stacks might operate: -.sp - During thread initalization - thread_local_var = pcre_jit_stack_alloc(...) -.sp - During thread exit - pcre_jit_stack_free(thread_local_var) -.sp - Use a one-line callback function - return thread_local_var -.sp -All the functions described in this section do nothing if JIT is not available, -and \fBpcre_assign_jit_stack()\fP does nothing unless the \fBextra\fP argument -is non-NULL and points to a \fBpcre_extra\fP block that is the result of a -successful study with PCRE_STUDY_JIT_COMPILE etc. -. -. -.\" HTML -.SH "JIT STACK FAQ" -.rs -.sp -(1) Why do we need JIT stacks? -.sp -PCRE (and JIT) is a recursive, depth-first engine, so it needs a stack where -the local data of the current node is pushed before checking its child nodes. -Allocating real machine stack on some platforms is difficult. For example, the -stack chain needs to be updated every time if we extend the stack on PowerPC. -Although it is possible, its updating time overhead decreases performance. So -we do the recursion in memory. -.P -(2) Why don't we simply allocate blocks of memory with \fBmalloc()\fP? -.sp -Modern operating systems have a nice feature: they can reserve an address space -instead of allocating memory. We can safely allocate memory pages inside this -address space, so the stack could grow without moving memory data (this is -important because of pointers). Thus we can allocate 1M address space, and use -only a single memory page (usually 4K) if that is enough. However, we can still -grow up to 1M anytime if needed. -.P -(3) Who "owns" a JIT stack? -.sp -The owner of the stack is the user program, not the JIT studied pattern or -anything else. The user program must ensure that if a stack is used by -\fBpcre_exec()\fP, (that is, it is assigned to the pattern currently running), -that stack must not be used by any other threads (to avoid overwriting the same -memory area). The best practice for multithreaded programs is to allocate a -stack for each thread, and return this stack through the JIT callback function. -.P -(4) When should a JIT stack be freed? -.sp -You can free a JIT stack at any time, as long as it will not be used by -\fBpcre_exec()\fP again. When you assign the stack to a pattern, only a pointer -is set. There is no reference counting or any other magic. You can free the -patterns and stacks in any order, anytime. Just \fIdo not\fP call -\fBpcre_exec()\fP with a pattern pointing to an already freed stack, as that -will cause SEGFAULT. (Also, do not free a stack currently used by -\fBpcre_exec()\fP in another thread). You can also replace the stack for a -pattern at any time. You can even free the previous stack before assigning a -replacement. -.P -(5) Should I allocate/free a stack every time before/after calling -\fBpcre_exec()\fP? -.sp -No, because this is too costly in terms of resources. However, you could -implement some clever idea which release the stack if it is not used in let's -say two minutes. The JIT callback can help to achieve this without keeping a -list of the currently JIT studied patterns. -.P -(6) OK, the stack is for long term memory allocation. But what happens if a -pattern causes stack overflow with a stack of 1M? Is that 1M kept until the -stack is freed? -.sp -Especially on embedded sytems, it might be a good idea to release memory -sometimes without freeing the stack. There is no API for this at the moment. -Probably a function call which returns with the currently allocated memory for -any stack and another which allows releasing memory (shrinking the stack) would -be a good idea if someone needs this. -.P -(7) This is too much of a headache. Isn't there any better solution for JIT -stack handling? -.sp -No, thanks to Windows. If POSIX threads were used everywhere, we could throw -out this complicated API. -. -. -.SH "EXAMPLE CODE" -.rs -.sp -This is a single-threaded example that specifies a JIT stack without using a -callback. -.sp - int rc; - int ovector[30]; - pcre *re; - pcre_extra *extra; - pcre_jit_stack *jit_stack; -.sp - re = pcre_compile(pattern, 0, &error, &erroffset, NULL); - /* Check for errors */ - extra = pcre_study(re, PCRE_STUDY_JIT_COMPILE, &error); - jit_stack = pcre_jit_stack_alloc(32*1024, 512*1024); - /* Check for error (NULL) */ - pcre_assign_jit_stack(extra, NULL, jit_stack); - rc = pcre_exec(re, extra, subject, length, 0, 0, ovector, 30); - /* Check results */ - pcre_free(re); - pcre_free_study(extra); - pcre_jit_stack_free(jit_stack); -.sp -. -. -.SH "JIT FAST PATH API" -.rs -.sp -Because the API described above falls back to interpreted execution when JIT is -not available, it is convenient for programs that are written for general use -in many environments. However, calling JIT via \fBpcre_exec()\fP does have a -performance impact. Programs that are written for use where JIT is known to be -available, and which need the best possible performance, can instead use a -"fast path" API to call JIT execution directly instead of calling -\fBpcre_exec()\fP (obviously only for patterns that have been successfully -studied by JIT). -.P -The fast path function is called \fBpcre_jit_exec()\fP, and it takes exactly -the same arguments as \fBpcre_exec()\fP, plus one additional argument that -must point to a JIT stack. The JIT stack arrangements described above do not -apply. The return values are the same as for \fBpcre_exec()\fP. -.P -When you call \fBpcre_exec()\fP, as well as testing for invalid options, a -number of other sanity checks are performed on the arguments. For example, if -the subject pointer is NULL, or its length is negative, an immediate error is -given. Also, unless PCRE_NO_UTF[8|16|32] is set, a UTF subject string is tested -for validity. In the interests of speed, these checks do not happen on the JIT -fast path, and if invalid data is passed, the result is undefined. -.P -Bypassing the sanity checks and the \fBpcre_exec()\fP wrapping can give -speedups of more than 10%. -.P -Note that the \fBpcre_jit_exec()\fP function is not available in versions of -PCRE before 8.32 (released in November 2012). If you need to support versions -that old you must either use the slower \fBpcre_exec()\fP, or switch between -the two codepaths by checking the values of PCRE_MAJOR and PCRE_MINOR. -.P -Due to an unfortunate implementation oversight, even in versions 8.32 -and later there will be no \fBpcre_jit_exec()\fP stub function defined -when PCRE is compiled with --disable-jit, which is the default, and -there's no way to detect whether PCRE was compiled with --enable-jit -via a macro. -.P -If you need to support versions older than 8.32, or versions that may -not build with --enable-jit, you must either use the slower -\fBpcre_exec()\fP, or switch between the two codepaths by checking the -values of PCRE_MAJOR and PCRE_MINOR. -.P -Switching between the two by checking the version assumes that all the -versions being targeted are built with --enable-jit. To also support -builds that may use --disable-jit either \fBpcre_exec()\fP must be -used, or a compile-time check for JIT via \fBpcre_config()\fP (which -assumes the runtime environment will be the same), or as the Git -project decided to do, simply assume that \fBpcre_jit_exec()\fP is -present in 8.32 or later unless a compile-time flag is provided, see -the "grep: un-break building with PCRE >= 8.32 without --enable-jit" -commit in git.git for an example of that. -. -. -.SH "SEE ALSO" -.rs -.sp -\fBpcreapi\fP(3) -. -. -.SH AUTHOR -.rs -.sp -.nf -Philip Hazel (FAQ by Zoltan Herczeg) -University Computing Service -Cambridge CB2 3QH, England. -.fi -. -. -.SH REVISION -.rs -.sp -.nf -Last updated: 05 July 2017 -Copyright (c) 1997-2017 University of Cambridge. -.fi diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcrelimits.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcrelimits.3 deleted file mode 100644 index 423d6a27..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcrelimits.3 +++ /dev/null @@ -1,71 +0,0 @@ -.TH PCRELIMITS 3 "05 November 2013" "PCRE 8.34" -.SH NAME -PCRE - Perl-compatible regular expressions -.SH "SIZE AND OTHER LIMITATIONS" -.rs -.sp -There are some size limitations in PCRE but it is hoped that they will never in -practice be relevant. -.P -The maximum length of a compiled pattern is approximately 64K data units (bytes -for the 8-bit library, 16-bit units for the 16-bit library, and 32-bit units for -the 32-bit library) if PCRE is compiled with the default internal linkage size, -which is 2 bytes for the 8-bit and 16-bit libraries, and 4 bytes for the 32-bit -library. If you want to process regular expressions that are truly enormous, -you can compile PCRE with an internal linkage size of 3 or 4 (when building the -16-bit or 32-bit library, 3 is rounded up to 4). See the \fBREADME\fP file in -the source distribution and the -.\" HREF -\fBpcrebuild\fP -.\" -documentation for details. In these cases the limit is substantially larger. -However, the speed of execution is slower. -.P -All values in repeating quantifiers must be less than 65536. -.P -There is no limit to the number of parenthesized subpatterns, but there can be -no more than 65535 capturing subpatterns. There is, however, a limit to the -depth of nesting of parenthesized subpatterns of all kinds. This is imposed in -order to limit the amount of system stack used at compile time. The limit can -be specified when PCRE is built; the default is 250. -.P -There is a limit to the number of forward references to subsequent subpatterns -of around 200,000. Repeated forward references with fixed upper limits, for -example, (?2){0,100} when subpattern number 2 is to the right, are included in -the count. There is no limit to the number of backward references. -.P -The maximum length of name for a named subpattern is 32 characters, and the -maximum number of named subpatterns is 10000. -.P -The maximum length of a name in a (*MARK), (*PRUNE), (*SKIP), or (*THEN) verb -is 255 for the 8-bit library and 65535 for the 16-bit and 32-bit libraries. -.P -The maximum length of a subject string is the largest positive number that an -integer variable can hold. However, when using the traditional matching -function, PCRE uses recursion to handle subpatterns and indefinite repetition. -This means that the available stack space may limit the size of a subject -string that can be processed by certain patterns. For a discussion of stack -issues, see the -.\" HREF -\fBpcrestack\fP -.\" -documentation. -. -. -.SH AUTHOR -.rs -.sp -.nf -Philip Hazel -University Computing Service -Cambridge CB2 3QH, England. -.fi -. -. -.SH REVISION -.rs -.sp -.nf -Last updated: 05 November 2013 -Copyright (c) 1997-2013 University of Cambridge. -.fi diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcrematching.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcrematching.3 deleted file mode 100644 index 268baf9b..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcrematching.3 +++ /dev/null @@ -1,214 +0,0 @@ -.TH PCREMATCHING 3 "12 November 2013" "PCRE 8.34" -.SH NAME -PCRE - Perl-compatible regular expressions -.SH "PCRE MATCHING ALGORITHMS" -.rs -.sp -This document describes the two different algorithms that are available in PCRE -for matching a compiled regular expression against a given subject string. The -"standard" algorithm is the one provided by the \fBpcre_exec()\fP, -\fBpcre16_exec()\fP and \fBpcre32_exec()\fP functions. These work in the same -as as Perl's matching function, and provide a Perl-compatible matching operation. -The just-in-time (JIT) optimization that is described in the -.\" HREF -\fBpcrejit\fP -.\" -documentation is compatible with these functions. -.P -An alternative algorithm is provided by the \fBpcre_dfa_exec()\fP, -\fBpcre16_dfa_exec()\fP and \fBpcre32_dfa_exec()\fP functions; they operate in -a different way, and are not Perl-compatible. This alternative has advantages -and disadvantages compared with the standard algorithm, and these are described -below. -.P -When there is only one possible way in which a given subject string can match a -pattern, the two algorithms give the same answer. A difference arises, however, -when there are multiple possibilities. For example, if the pattern -.sp - ^<.*> -.sp -is matched against the string -.sp - -.sp -there are three possible answers. The standard algorithm finds only one of -them, whereas the alternative algorithm finds all three. -. -. -.SH "REGULAR EXPRESSIONS AS TREES" -.rs -.sp -The set of strings that are matched by a regular expression can be represented -as a tree structure. An unlimited repetition in the pattern makes the tree of -infinite size, but it is still a tree. Matching the pattern to a given subject -string (from a given starting point) can be thought of as a search of the tree. -There are two ways to search a tree: depth-first and breadth-first, and these -correspond to the two matching algorithms provided by PCRE. -. -. -.SH "THE STANDARD MATCHING ALGORITHM" -.rs -.sp -In the terminology of Jeffrey Friedl's book "Mastering Regular -Expressions", the standard algorithm is an "NFA algorithm". It conducts a -depth-first search of the pattern tree. That is, it proceeds along a single -path through the tree, checking that the subject matches what is required. When -there is a mismatch, the algorithm tries any alternatives at the current point, -and if they all fail, it backs up to the previous branch point in the tree, and -tries the next alternative branch at that level. This often involves backing up -(moving to the left) in the subject string as well. The order in which -repetition branches are tried is controlled by the greedy or ungreedy nature of -the quantifier. -.P -If a leaf node is reached, a matching string has been found, and at that point -the algorithm stops. Thus, if there is more than one possible match, this -algorithm returns the first one that it finds. Whether this is the shortest, -the longest, or some intermediate length depends on the way the greedy and -ungreedy repetition quantifiers are specified in the pattern. -.P -Because it ends up with a single path through the tree, it is relatively -straightforward for this algorithm to keep track of the substrings that are -matched by portions of the pattern in parentheses. This provides support for -capturing parentheses and back references. -. -. -.SH "THE ALTERNATIVE MATCHING ALGORITHM" -.rs -.sp -This algorithm conducts a breadth-first search of the tree. Starting from the -first matching point in the subject, it scans the subject string from left to -right, once, character by character, and as it does this, it remembers all the -paths through the tree that represent valid matches. In Friedl's terminology, -this is a kind of "DFA algorithm", though it is not implemented as a -traditional finite state machine (it keeps multiple states active -simultaneously). -.P -Although the general principle of this matching algorithm is that it scans the -subject string only once, without backtracking, there is one exception: when a -lookaround assertion is encountered, the characters following or preceding the -current point have to be independently inspected. -.P -The scan continues until either the end of the subject is reached, or there are -no more unterminated paths. At this point, terminated paths represent the -different matching possibilities (if there are none, the match has failed). -Thus, if there is more than one possible match, this algorithm finds all of -them, and in particular, it finds the longest. The matches are returned in -decreasing order of length. There is an option to stop the algorithm after the -first match (which is necessarily the shortest) is found. -.P -Note that all the matches that are found start at the same point in the -subject. If the pattern -.sp - cat(er(pillar)?)? -.sp -is matched against the string "the caterpillar catchment", the result will be -the three strings "caterpillar", "cater", and "cat" that start at the fifth -character of the subject. The algorithm does not automatically move on to find -matches that start at later positions. -.P -PCRE's "auto-possessification" optimization usually applies to character -repeats at the end of a pattern (as well as internally). For example, the -pattern "a\ed+" is compiled as if it were "a\ed++" because there is no point -even considering the possibility of backtracking into the repeated digits. For -DFA matching, this means that only one possible match is found. If you really -do want multiple matches in such cases, either use an ungreedy repeat -("a\ed+?") or set the PCRE_NO_AUTO_POSSESS option when compiling. -.P -There are a number of features of PCRE regular expressions that are not -supported by the alternative matching algorithm. They are as follows: -.P -1. Because the algorithm finds all possible matches, the greedy or ungreedy -nature of repetition quantifiers is not relevant. Greedy and ungreedy -quantifiers are treated in exactly the same way. However, possessive -quantifiers can make a difference when what follows could also match what is -quantified, for example in a pattern like this: -.sp - ^a++\ew! -.sp -This pattern matches "aaab!" but not "aaa!", which would be matched by a -non-possessive quantifier. Similarly, if an atomic group is present, it is -matched as if it were a standalone pattern at the current point, and the -longest match is then "locked in" for the rest of the overall pattern. -.P -2. When dealing with multiple paths through the tree simultaneously, it is not -straightforward to keep track of captured substrings for the different matching -possibilities, and PCRE's implementation of this algorithm does not attempt to -do this. This means that no captured substrings are available. -.P -3. Because no substrings are captured, back references within the pattern are -not supported, and cause errors if encountered. -.P -4. For the same reason, conditional expressions that use a backreference as the -condition or test for a specific group recursion are not supported. -.P -5. Because many paths through the tree may be active, the \eK escape sequence, -which resets the start of the match when encountered (but may be on some paths -and not on others), is not supported. It causes an error if encountered. -.P -6. Callouts are supported, but the value of the \fIcapture_top\fP field is -always 1, and the value of the \fIcapture_last\fP field is always -1. -.P -7. The \eC escape sequence, which (in the standard algorithm) always matches a -single data unit, even in UTF-8, UTF-16 or UTF-32 modes, is not supported in -these modes, because the alternative algorithm moves through the subject string -one character (not data unit) at a time, for all active paths through the tree. -.P -8. Except for (*FAIL), the backtracking control verbs such as (*PRUNE) are not -supported. (*FAIL) is supported, and behaves like a failing negative assertion. -. -. -.SH "ADVANTAGES OF THE ALTERNATIVE ALGORITHM" -.rs -.sp -Using the alternative matching algorithm provides the following advantages: -.P -1. All possible matches (at a single point in the subject) are automatically -found, and in particular, the longest match is found. To find more than one -match using the standard algorithm, you have to do kludgy things with -callouts. -.P -2. Because the alternative algorithm scans the subject string just once, and -never needs to backtrack (except for lookbehinds), it is possible to pass very -long subject strings to the matching function in several pieces, checking for -partial matching each time. Although it is possible to do multi-segment -matching using the standard algorithm by retaining partially matched -substrings, it is more complicated. The -.\" HREF -\fBpcrepartial\fP -.\" -documentation gives details of partial matching and discusses multi-segment -matching. -. -. -.SH "DISADVANTAGES OF THE ALTERNATIVE ALGORITHM" -.rs -.sp -The alternative algorithm suffers from a number of disadvantages: -.P -1. It is substantially slower than the standard algorithm. This is partly -because it has to search for all possible matches, but is also because it is -less susceptible to optimization. -.P -2. Capturing parentheses and back references are not supported. -.P -3. Although atomic groups are supported, their use does not provide the -performance advantage that it does for the standard algorithm. -. -. -.SH AUTHOR -.rs -.sp -.nf -Philip Hazel -University Computing Service -Cambridge CB2 3QH, England. -.fi -. -. -.SH REVISION -.rs -.sp -.nf -Last updated: 12 November 2013 -Copyright (c) 1997-2012 University of Cambridge. -.fi diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcrepartial.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcrepartial.3 deleted file mode 100644 index 14d0124f..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcrepartial.3 +++ /dev/null @@ -1,476 +0,0 @@ -.TH PCREPARTIAL 3 "02 July 2013" "PCRE 8.34" -.SH NAME -PCRE - Perl-compatible regular expressions -.SH "PARTIAL MATCHING IN PCRE" -.rs -.sp -In normal use of PCRE, if the subject string that is passed to a matching -function matches as far as it goes, but is too short to match the entire -pattern, PCRE_ERROR_NOMATCH is returned. There are circumstances where it might -be helpful to distinguish this case from other cases in which there is no -match. -.P -Consider, for example, an application where a human is required to type in data -for a field with specific formatting requirements. An example might be a date -in the form \fIddmmmyy\fP, defined by this pattern: -.sp - ^\ed?\ed(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)\ed\ed$ -.sp -If the application sees the user's keystrokes one by one, and can check that -what has been typed so far is potentially valid, it is able to raise an error -as soon as a mistake is made, by beeping and not reflecting the character that -has been typed, for example. This immediate feedback is likely to be a better -user interface than a check that is delayed until the entire string has been -entered. Partial matching can also be useful when the subject string is very -long and is not all available at once. -.P -PCRE supports partial matching by means of the PCRE_PARTIAL_SOFT and -PCRE_PARTIAL_HARD options, which can be set when calling any of the matching -functions. For backwards compatibility, PCRE_PARTIAL is a synonym for -PCRE_PARTIAL_SOFT. The essential difference between the two options is whether -or not a partial match is preferred to an alternative complete match, though -the details differ between the two types of matching function. If both options -are set, PCRE_PARTIAL_HARD takes precedence. -.P -If you want to use partial matching with just-in-time optimized code, you must -call \fBpcre_study()\fP, \fBpcre16_study()\fP or \fBpcre32_study()\fP with one -or both of these options: -.sp - PCRE_STUDY_JIT_PARTIAL_SOFT_COMPILE - PCRE_STUDY_JIT_PARTIAL_HARD_COMPILE -.sp -PCRE_STUDY_JIT_COMPILE should also be set if you are going to run non-partial -matches on the same pattern. If the appropriate JIT study mode has not been set -for a match, the interpretive matching code is used. -.P -Setting a partial matching option disables two of PCRE's standard -optimizations. PCRE remembers the last literal data unit in a pattern, and -abandons matching immediately if it is not present in the subject string. This -optimization cannot be used for a subject string that might match only -partially. If the pattern was studied, PCRE knows the minimum length of a -matching string, and does not bother to run the matching function on shorter -strings. This optimization is also disabled for partial matching. -. -. -.SH "PARTIAL MATCHING USING pcre_exec() OR pcre[16|32]_exec()" -.rs -.sp -A partial match occurs during a call to \fBpcre_exec()\fP or -\fBpcre[16|32]_exec()\fP when the end of the subject string is reached -successfully, but matching cannot continue because more characters are needed. -However, at least one character in the subject must have been inspected. This -character need not form part of the final matched string; lookbehind assertions -and the \eK escape sequence provide ways of inspecting characters before the -start of a matched substring. The requirement for inspecting at least one -character exists because an empty string can always be matched; without such a -restriction there would always be a partial match of an empty string at the end -of the subject. -.P -If there are at least two slots in the offsets vector when a partial match is -returned, the first slot is set to the offset of the earliest character that -was inspected. For convenience, the second offset points to the end of the -subject so that a substring can easily be identified. If there are at least -three slots in the offsets vector, the third slot is set to the offset of the -character where matching started. -.P -For the majority of patterns, the contents of the first and third slots will be -the same. However, for patterns that contain lookbehind assertions, or begin -with \eb or \eB, characters before the one where matching started may have been -inspected while carrying out the match. For example, consider this pattern: -.sp - /(?<=abc)123/ -.sp -This pattern matches "123", but only if it is preceded by "abc". If the subject -string is "xyzabc12", the first two offsets after a partial match are for the -substring "abc12", because all these characters were inspected. However, the -third offset is set to 6, because that is the offset where matching began. -.P -What happens when a partial match is identified depends on which of the two -partial matching options are set. -. -. -.SS "PCRE_PARTIAL_SOFT WITH pcre_exec() OR pcre[16|32]_exec()" -.rs -.sp -If PCRE_PARTIAL_SOFT is set when \fBpcre_exec()\fP or \fBpcre[16|32]_exec()\fP -identifies a partial match, the partial match is remembered, but matching -continues as normal, and other alternatives in the pattern are tried. If no -complete match can be found, PCRE_ERROR_PARTIAL is returned instead of -PCRE_ERROR_NOMATCH. -.P -This option is "soft" because it prefers a complete match over a partial match. -All the various matching items in a pattern behave as if the subject string is -potentially complete. For example, \ez, \eZ, and $ match at the end of the -subject, as normal, and for \eb and \eB the end of the subject is treated as a -non-alphanumeric. -.P -If there is more than one partial match, the first one that was found provides -the data that is returned. Consider this pattern: -.sp - /123\ew+X|dogY/ -.sp -If this is matched against the subject string "abc123dog", both -alternatives fail to match, but the end of the subject is reached during -matching, so PCRE_ERROR_PARTIAL is returned. The offsets are set to 3 and 9, -identifying "123dog" as the first partial match that was found. (In this -example, there are two partial matches, because "dog" on its own partially -matches the second alternative.) -. -. -.SS "PCRE_PARTIAL_HARD WITH pcre_exec() OR pcre[16|32]_exec()" -.rs -.sp -If PCRE_PARTIAL_HARD is set for \fBpcre_exec()\fP or \fBpcre[16|32]_exec()\fP, -PCRE_ERROR_PARTIAL is returned as soon as a partial match is found, without -continuing to search for possible complete matches. This option is "hard" -because it prefers an earlier partial match over a later complete match. For -this reason, the assumption is made that the end of the supplied subject string -may not be the true end of the available data, and so, if \ez, \eZ, \eb, \eB, -or $ are encountered at the end of the subject, the result is -PCRE_ERROR_PARTIAL, provided that at least one character in the subject has -been inspected. -.P -Setting PCRE_PARTIAL_HARD also affects the way UTF-8 and UTF-16 -subject strings are checked for validity. Normally, an invalid sequence -causes the error PCRE_ERROR_BADUTF8 or PCRE_ERROR_BADUTF16. However, in the -special case of a truncated character at the end of the subject, -PCRE_ERROR_SHORTUTF8 or PCRE_ERROR_SHORTUTF16 is returned when -PCRE_PARTIAL_HARD is set. -. -. -.SS "Comparing hard and soft partial matching" -.rs -.sp -The difference between the two partial matching options can be illustrated by a -pattern such as: -.sp - /dog(sbody)?/ -.sp -This matches either "dog" or "dogsbody", greedily (that is, it prefers the -longer string if possible). If it is matched against the string "dog" with -PCRE_PARTIAL_SOFT, it yields a complete match for "dog". However, if -PCRE_PARTIAL_HARD is set, the result is PCRE_ERROR_PARTIAL. On the other hand, -if the pattern is made ungreedy the result is different: -.sp - /dog(sbody)??/ -.sp -In this case the result is always a complete match because that is found first, -and matching never continues after finding a complete match. It might be easier -to follow this explanation by thinking of the two patterns like this: -.sp - /dog(sbody)?/ is the same as /dogsbody|dog/ - /dog(sbody)??/ is the same as /dog|dogsbody/ -.sp -The second pattern will never match "dogsbody", because it will always find the -shorter match first. -. -. -.SH "PARTIAL MATCHING USING pcre_dfa_exec() OR pcre[16|32]_dfa_exec()" -.rs -.sp -The DFA functions move along the subject string character by character, without -backtracking, searching for all possible matches simultaneously. If the end of -the subject is reached before the end of the pattern, there is the possibility -of a partial match, again provided that at least one character has been -inspected. -.P -When PCRE_PARTIAL_SOFT is set, PCRE_ERROR_PARTIAL is returned only if there -have been no complete matches. Otherwise, the complete matches are returned. -However, if PCRE_PARTIAL_HARD is set, a partial match takes precedence over any -complete matches. The portion of the string that was inspected when the longest -partial match was found is set as the first matching string, provided there are -at least two slots in the offsets vector. -.P -Because the DFA functions always search for all possible matches, and there is -no difference between greedy and ungreedy repetition, their behaviour is -different from the standard functions when PCRE_PARTIAL_HARD is set. Consider -the string "dog" matched against the ungreedy pattern shown above: -.sp - /dog(sbody)??/ -.sp -Whereas the standard functions stop as soon as they find the complete match for -"dog", the DFA functions also find the partial match for "dogsbody", and so -return that when PCRE_PARTIAL_HARD is set. -. -. -.SH "PARTIAL MATCHING AND WORD BOUNDARIES" -.rs -.sp -If a pattern ends with one of sequences \eb or \eB, which test for word -boundaries, partial matching with PCRE_PARTIAL_SOFT can give counter-intuitive -results. Consider this pattern: -.sp - /\ebcat\eb/ -.sp -This matches "cat", provided there is a word boundary at either end. If the -subject string is "the cat", the comparison of the final "t" with a following -character cannot take place, so a partial match is found. However, normal -matching carries on, and \eb matches at the end of the subject when the last -character is a letter, so a complete match is found. The result, therefore, is -\fInot\fP PCRE_ERROR_PARTIAL. Using PCRE_PARTIAL_HARD in this case does yield -PCRE_ERROR_PARTIAL, because then the partial match takes precedence. -. -. -.SH "FORMERLY RESTRICTED PATTERNS" -.rs -.sp -For releases of PCRE prior to 8.00, because of the way certain internal -optimizations were implemented in the \fBpcre_exec()\fP function, the -PCRE_PARTIAL option (predecessor of PCRE_PARTIAL_SOFT) could not be used with -all patterns. From release 8.00 onwards, the restrictions no longer apply, and -partial matching with can be requested for any pattern. -.P -Items that were formerly restricted were repeated single characters and -repeated metasequences. If PCRE_PARTIAL was set for a pattern that did not -conform to the restrictions, \fBpcre_exec()\fP returned the error code -PCRE_ERROR_BADPARTIAL (-13). This error code is no longer in use. The -PCRE_INFO_OKPARTIAL call to \fBpcre_fullinfo()\fP to find out if a compiled -pattern can be used for partial matching now always returns 1. -. -. -.SH "EXAMPLE OF PARTIAL MATCHING USING PCRETEST" -.rs -.sp -If the escape sequence \eP is present in a \fBpcretest\fP data line, the -PCRE_PARTIAL_SOFT option is used for the match. Here is a run of \fBpcretest\fP -that uses the date example quoted above: -.sp - re> /^\ed?\ed(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)\ed\ed$/ - data> 25jun04\eP - 0: 25jun04 - 1: jun - data> 25dec3\eP - Partial match: 23dec3 - data> 3ju\eP - Partial match: 3ju - data> 3juj\eP - No match - data> j\eP - No match -.sp -The first data string is matched completely, so \fBpcretest\fP shows the -matched substrings. The remaining four strings do not match the complete -pattern, but the first two are partial matches. Similar output is obtained -if DFA matching is used. -.P -If the escape sequence \eP is present more than once in a \fBpcretest\fP data -line, the PCRE_PARTIAL_HARD option is set for the match. -. -. -.SH "MULTI-SEGMENT MATCHING WITH pcre_dfa_exec() OR pcre[16|32]_dfa_exec()" -.rs -.sp -When a partial match has been found using a DFA matching function, it is -possible to continue the match by providing additional subject data and calling -the function again with the same compiled regular expression, this time setting -the PCRE_DFA_RESTART option. You must pass the same working space as before, -because this is where details of the previous partial match are stored. Here is -an example using \fBpcretest\fP, using the \eR escape sequence to set the -PCRE_DFA_RESTART option (\eD specifies the use of the DFA matching function): -.sp - re> /^\ed?\ed(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)\ed\ed$/ - data> 23ja\eP\eD - Partial match: 23ja - data> n05\eR\eD - 0: n05 -.sp -The first call has "23ja" as the subject, and requests partial matching; the -second call has "n05" as the subject for the continued (restarted) match. -Notice that when the match is complete, only the last part is shown; PCRE does -not retain the previously partially-matched string. It is up to the calling -program to do that if it needs to. -.P -That means that, for an unanchored pattern, if a continued match fails, it is -not possible to try again at a new starting point. All this facility is capable -of doing is continuing with the previous match attempt. In the previous -example, if the second set of data is "ug23" the result is no match, even -though there would be a match for "aug23" if the entire string were given at -once. Depending on the application, this may or may not be what you want. -The only way to allow for starting again at the next character is to retain the -matched part of the subject and try a new complete match. -.P -You can set the PCRE_PARTIAL_SOFT or PCRE_PARTIAL_HARD options with -PCRE_DFA_RESTART to continue partial matching over multiple segments. This -facility can be used to pass very long subject strings to the DFA matching -functions. -. -. -.SH "MULTI-SEGMENT MATCHING WITH pcre_exec() OR pcre[16|32]_exec()" -.rs -.sp -From release 8.00, the standard matching functions can also be used to do -multi-segment matching. Unlike the DFA functions, it is not possible to -restart the previous match with a new segment of data. Instead, new data must -be added to the previous subject string, and the entire match re-run, starting -from the point where the partial match occurred. Earlier data can be discarded. -.P -It is best to use PCRE_PARTIAL_HARD in this situation, because it does not -treat the end of a segment as the end of the subject when matching \ez, \eZ, -\eb, \eB, and $. Consider an unanchored pattern that matches dates: -.sp - re> /\ed?\ed(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)\ed\ed/ - data> The date is 23ja\eP\eP - Partial match: 23ja -.sp -At this stage, an application could discard the text preceding "23ja", add on -text from the next segment, and call the matching function again. Unlike the -DFA matching functions, the entire matching string must always be available, -and the complete matching process occurs for each call, so more memory and more -processing time is needed. -.P -\fBNote:\fP If the pattern contains lookbehind assertions, or \eK, or starts -with \eb or \eB, the string that is returned for a partial match includes -characters that precede the start of what would be returned for a complete -match, because it contains all the characters that were inspected during the -partial match. -. -. -.SH "ISSUES WITH MULTI-SEGMENT MATCHING" -.rs -.sp -Certain types of pattern may give problems with multi-segment matching, -whichever matching function is used. -.P -1. If the pattern contains a test for the beginning of a line, you need to pass -the PCRE_NOTBOL option when the subject string for any call does start at the -beginning of a line. There is also a PCRE_NOTEOL option, but in practice when -doing multi-segment matching you should be using PCRE_PARTIAL_HARD, which -includes the effect of PCRE_NOTEOL. -.P -2. Lookbehind assertions that have already been obeyed are catered for in the -offsets that are returned for a partial match. However a lookbehind assertion -later in the pattern could require even earlier characters to be inspected. You -can handle this case by using the PCRE_INFO_MAXLOOKBEHIND option of the -\fBpcre_fullinfo()\fP or \fBpcre[16|32]_fullinfo()\fP functions to obtain the -length of the longest lookbehind in the pattern. This length is given in -characters, not bytes. If you always retain at least that many characters -before the partially matched string, all should be well. (Of course, near the -start of the subject, fewer characters may be present; in that case all -characters should be retained.) -.P -From release 8.33, there is a more accurate way of deciding which characters to -retain. Instead of subtracting the length of the longest lookbehind from the -earliest inspected character (\fIoffsets[0]\fP), the match start position -(\fIoffsets[2]\fP) should be used, and the next match attempt started at the -\fIoffsets[2]\fP character by setting the \fIstartoffset\fP argument of -\fBpcre_exec()\fP or \fBpcre_dfa_exec()\fP. -.P -For example, if the pattern "(?<=123)abc" is partially -matched against the string "xx123a", the three offset values returned are 2, 6, -and 5. This indicates that the matching process that gave a partial match -started at offset 5, but the characters "123a" were all inspected. The maximum -lookbehind for that pattern is 3, so taking that away from 5 shows that we need -only keep "123a", and the next match attempt can be started at offset 3 (that -is, at "a") when further characters have been added. When the match start is -not the earliest inspected character, \fBpcretest\fP shows it explicitly: -.sp - re> "(?<=123)abc" - data> xx123a\eP\eP - Partial match at offset 5: 123a -.P -3. Because a partial match must always contain at least one character, what -might be considered a partial match of an empty string actually gives a "no -match" result. For example: -.sp - re> /c(?<=abc)x/ - data> ab\eP - No match -.sp -If the next segment begins "cx", a match should be found, but this will only -happen if characters from the previous segment are retained. For this reason, a -"no match" result should be interpreted as "partial match of an empty string" -when the pattern contains lookbehinds. -.P -4. Matching a subject string that is split into multiple segments may not -always produce exactly the same result as matching over one single long string, -especially when PCRE_PARTIAL_SOFT is used. The section "Partial Matching and -Word Boundaries" above describes an issue that arises if the pattern ends with -\eb or \eB. Another kind of difference may occur when there are multiple -matching possibilities, because (for PCRE_PARTIAL_SOFT) a partial match result -is given only when there are no completed matches. This means that as soon as -the shortest match has been found, continuation to a new subject segment is no -longer possible. Consider again this \fBpcretest\fP example: -.sp - re> /dog(sbody)?/ - data> dogsb\eP - 0: dog - data> do\eP\eD - Partial match: do - data> gsb\eR\eP\eD - 0: g - data> dogsbody\eD - 0: dogsbody - 1: dog -.sp -The first data line passes the string "dogsb" to a standard matching function, -setting the PCRE_PARTIAL_SOFT option. Although the string is a partial match -for "dogsbody", the result is not PCRE_ERROR_PARTIAL, because the shorter -string "dog" is a complete match. Similarly, when the subject is presented to -a DFA matching function in several parts ("do" and "gsb" being the first two) -the match stops when "dog" has been found, and it is not possible to continue. -On the other hand, if "dogsbody" is presented as a single string, a DFA -matching function finds both matches. -.P -Because of these problems, it is best to use PCRE_PARTIAL_HARD when matching -multi-segment data. The example above then behaves differently: -.sp - re> /dog(sbody)?/ - data> dogsb\eP\eP - Partial match: dogsb - data> do\eP\eD - Partial match: do - data> gsb\eR\eP\eP\eD - Partial match: gsb -.sp -5. Patterns that contain alternatives at the top level which do not all start -with the same pattern item may not work as expected when PCRE_DFA_RESTART is -used. For example, consider this pattern: -.sp - 1234|3789 -.sp -If the first part of the subject is "ABC123", a partial match of the first -alternative is found at offset 3. There is no partial match for the second -alternative, because such a match does not start at the same point in the -subject string. Attempting to continue with the string "7890" does not yield a -match because only those alternatives that match at one point in the subject -are remembered. The problem arises because the start of the second alternative -matches within the first alternative. There is no problem with anchored -patterns or patterns such as: -.sp - 1234|ABCD -.sp -where no string can be a partial match for both alternatives. This is not a -problem if a standard matching function is used, because the entire match has -to be rerun each time: -.sp - re> /1234|3789/ - data> ABC123\eP\eP - Partial match: 123 - data> 1237890 - 0: 3789 -.sp -Of course, instead of using PCRE_DFA_RESTART, the same technique of re-running -the entire match can also be used with the DFA matching functions. Another -possibility is to work with two buffers. If a partial match at offset \fIn\fP -in the first buffer is followed by "no match" when PCRE_DFA_RESTART is used on -the second buffer, you can then try a new match starting at offset \fIn+1\fP in -the first buffer. -. -. -.SH AUTHOR -.rs -.sp -.nf -Philip Hazel -University Computing Service -Cambridge CB2 3QH, England. -.fi -. -. -.SH REVISION -.rs -.sp -.nf -Last updated: 02 July 2013 -Copyright (c) 1997-2013 University of Cambridge. -.fi diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcrepattern.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcrepattern.3 deleted file mode 100644 index 97df217f..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcrepattern.3 +++ /dev/null @@ -1,3304 +0,0 @@ -.TH PCREPATTERN 3 "23 October 2016" "PCRE 8.40" -.SH NAME -PCRE - Perl-compatible regular expressions -.SH "PCRE REGULAR EXPRESSION DETAILS" -.rs -.sp -The syntax and semantics of the regular expressions that are supported by PCRE -are described in detail below. There is a quick-reference syntax summary in the -.\" HREF -\fBpcresyntax\fP -.\" -page. PCRE tries to match Perl syntax and semantics as closely as it can. PCRE -also supports some alternative regular expression syntax (which does not -conflict with the Perl syntax) in order to provide some compatibility with -regular expressions in Python, .NET, and Oniguruma. -.P -Perl's regular expressions are described in its own documentation, and -regular expressions in general are covered in a number of books, some of which -have copious examples. Jeffrey Friedl's "Mastering Regular Expressions", -published by O'Reilly, covers regular expressions in great detail. This -description of PCRE's regular expressions is intended as reference material. -.P -This document discusses the patterns that are supported by PCRE when one its -main matching functions, \fBpcre_exec()\fP (8-bit) or \fBpcre[16|32]_exec()\fP -(16- or 32-bit), is used. PCRE also has alternative matching functions, -\fBpcre_dfa_exec()\fP and \fBpcre[16|32_dfa_exec()\fP, which match using a -different algorithm that is not Perl-compatible. Some of the features discussed -below are not available when DFA matching is used. The advantages and -disadvantages of the alternative functions, and how they differ from the normal -functions, are discussed in the -.\" HREF -\fBpcrematching\fP -.\" -page. -. -. -.SH "SPECIAL START-OF-PATTERN ITEMS" -.rs -.sp -A number of options that can be passed to \fBpcre_compile()\fP can also be set -by special items at the start of a pattern. These are not Perl-compatible, but -are provided to make these options accessible to pattern writers who are not -able to change the program that processes the pattern. Any number of these -items may appear, but they must all be together right at the start of the -pattern string, and the letters must be in upper case. -. -. -.SS "UTF support" -.rs -.sp -The original operation of PCRE was on strings of one-byte characters. However, -there is now also support for UTF-8 strings in the original library, an -extra library that supports 16-bit and UTF-16 character strings, and a -third library that supports 32-bit and UTF-32 character strings. To use these -features, PCRE must be built to include appropriate support. When using UTF -strings you must either call the compiling function with the PCRE_UTF8, -PCRE_UTF16, or PCRE_UTF32 option, or the pattern must start with one of -these special sequences: -.sp - (*UTF8) - (*UTF16) - (*UTF32) - (*UTF) -.sp -(*UTF) is a generic sequence that can be used with any of the libraries. -Starting a pattern with such a sequence is equivalent to setting the relevant -option. How setting a UTF mode affects pattern matching is mentioned in several -places below. There is also a summary of features in the -.\" HREF -\fBpcreunicode\fP -.\" -page. -.P -Some applications that allow their users to supply patterns may wish to -restrict them to non-UTF data for security reasons. If the PCRE_NEVER_UTF -option is set at compile time, (*UTF) etc. are not allowed, and their -appearance causes an error. -. -. -.SS "Unicode property support" -.rs -.sp -Another special sequence that may appear at the start of a pattern is (*UCP). -This has the same effect as setting the PCRE_UCP option: it causes sequences -such as \ed and \ew to use Unicode properties to determine character types, -instead of recognizing only characters with codes less than 128 via a lookup -table. -. -. -.SS "Disabling auto-possessification" -.rs -.sp -If a pattern starts with (*NO_AUTO_POSSESS), it has the same effect as setting -the PCRE_NO_AUTO_POSSESS option at compile time. This stops PCRE from making -quantifiers possessive when what follows cannot match the repeated item. For -example, by default a+b is treated as a++b. For more details, see the -.\" HREF -\fBpcreapi\fP -.\" -documentation. -. -. -.SS "Disabling start-up optimizations" -.rs -.sp -If a pattern starts with (*NO_START_OPT), it has the same effect as setting the -PCRE_NO_START_OPTIMIZE option either at compile or matching time. This disables -several optimizations for quickly reaching "no match" results. For more -details, see the -.\" HREF -\fBpcreapi\fP -.\" -documentation. -. -. -.\" HTML -.SS "Newline conventions" -.rs -.sp -PCRE supports five different conventions for indicating line breaks in -strings: a single CR (carriage return) character, a single LF (linefeed) -character, the two-character sequence CRLF, any of the three preceding, or any -Unicode newline sequence. The -.\" HREF -\fBpcreapi\fP -.\" -page has -.\" HTML -.\" -further discussion -.\" -about newlines, and shows how to set the newline convention in the -\fIoptions\fP arguments for the compiling and matching functions. -.P -It is also possible to specify a newline convention by starting a pattern -string with one of the following five sequences: -.sp - (*CR) carriage return - (*LF) linefeed - (*CRLF) carriage return, followed by linefeed - (*ANYCRLF) any of the three above - (*ANY) all Unicode newline sequences -.sp -These override the default and the options given to the compiling function. For -example, on a Unix system where LF is the default newline sequence, the pattern -.sp - (*CR)a.b -.sp -changes the convention to CR. That pattern matches "a\enb" because LF is no -longer a newline. If more than one of these settings is present, the last one -is used. -.P -The newline convention affects where the circumflex and dollar assertions are -true. It also affects the interpretation of the dot metacharacter when -PCRE_DOTALL is not set, and the behaviour of \eN. However, it does not affect -what the \eR escape sequence matches. By default, this is any Unicode newline -sequence, for Perl compatibility. However, this can be changed; see the -description of \eR in the section entitled -.\" HTML -.\" -"Newline sequences" -.\" -below. A change of \eR setting can be combined with a change of newline -convention. -. -. -.SS "Setting match and recursion limits" -.rs -.sp -The caller of \fBpcre_exec()\fP can set a limit on the number of times the -internal \fBmatch()\fP function is called and on the maximum depth of -recursive calls. These facilities are provided to catch runaway matches that -are provoked by patterns with huge matching trees (a typical example is a -pattern with nested unlimited repeats) and to avoid running out of system stack -by too much recursion. When one of these limits is reached, \fBpcre_exec()\fP -gives an error return. The limits can also be set by items at the start of the -pattern of the form -.sp - (*LIMIT_MATCH=d) - (*LIMIT_RECURSION=d) -.sp -where d is any number of decimal digits. However, the value of the setting must -be less than the value set (or defaulted) by the caller of \fBpcre_exec()\fP -for it to have any effect. In other words, the pattern writer can lower the -limits set by the programmer, but not raise them. If there is more than one -setting of one of these limits, the lower value is used. -. -. -.SH "EBCDIC CHARACTER CODES" -.rs -.sp -PCRE can be compiled to run in an environment that uses EBCDIC as its character -code rather than ASCII or Unicode (typically a mainframe system). In the -sections below, character code values are ASCII or Unicode; in an EBCDIC -environment these characters may have different code values, and there are no -code points greater than 255. -. -. -.SH "CHARACTERS AND METACHARACTERS" -.rs -.sp -A regular expression is a pattern that is matched against a subject string from -left to right. Most characters stand for themselves in a pattern, and match the -corresponding characters in the subject. As a trivial example, the pattern -.sp - The quick brown fox -.sp -matches a portion of a subject string that is identical to itself. When -caseless matching is specified (the PCRE_CASELESS option), letters are matched -independently of case. In a UTF mode, PCRE always understands the concept of -case for characters whose values are less than 128, so caseless matching is -always possible. For characters with higher values, the concept of case is -supported if PCRE is compiled with Unicode property support, but not otherwise. -If you want to use caseless matching for characters 128 and above, you must -ensure that PCRE is compiled with Unicode property support as well as with -UTF support. -.P -The power of regular expressions comes from the ability to include alternatives -and repetitions in the pattern. These are encoded in the pattern by the use of -\fImetacharacters\fP, which do not stand for themselves but instead are -interpreted in some special way. -.P -There are two different sets of metacharacters: those that are recognized -anywhere in the pattern except within square brackets, and those that are -recognized within square brackets. Outside square brackets, the metacharacters -are as follows: -.sp - \e general escape character with several uses - ^ assert start of string (or line, in multiline mode) - $ assert end of string (or line, in multiline mode) - . match any character except newline (by default) - [ start character class definition - | start of alternative branch - ( start subpattern - ) end subpattern - ? extends the meaning of ( - also 0 or 1 quantifier - also quantifier minimizer - * 0 or more quantifier - + 1 or more quantifier - also "possessive quantifier" - { start min/max quantifier -.sp -Part of a pattern that is in square brackets is called a "character class". In -a character class the only metacharacters are: -.sp - \e general escape character - ^ negate the class, but only if the first character - - indicates character range -.\" JOIN - [ POSIX character class (only if followed by POSIX - syntax) - ] terminates the character class -.sp -The following sections describe the use of each of the metacharacters. -. -. -.SH BACKSLASH -.rs -.sp -The backslash character has several uses. Firstly, if it is followed by a -character that is not a number or a letter, it takes away any special meaning -that character may have. This use of backslash as an escape character applies -both inside and outside character classes. -.P -For example, if you want to match a * character, you write \e* in the pattern. -This escaping action applies whether or not the following character would -otherwise be interpreted as a metacharacter, so it is always safe to precede a -non-alphanumeric with backslash to specify that it stands for itself. In -particular, if you want to match a backslash, you write \e\e. -.P -In a UTF mode, only ASCII numbers and letters have any special meaning after a -backslash. All other characters (in particular, those whose codepoints are -greater than 127) are treated as literals. -.P -If a pattern is compiled with the PCRE_EXTENDED option, most white space in the -pattern (other than in a character class), and characters between a # outside a -character class and the next newline, inclusive, are ignored. An escaping -backslash can be used to include a white space or # character as part of the -pattern. -.P -If you want to remove the special meaning from a sequence of characters, you -can do so by putting them between \eQ and \eE. This is different from Perl in -that $ and @ are handled as literals in \eQ...\eE sequences in PCRE, whereas in -Perl, $ and @ cause variable interpolation. Note the following examples: -.sp - Pattern PCRE matches Perl matches -.sp -.\" JOIN - \eQabc$xyz\eE abc$xyz abc followed by the - contents of $xyz - \eQabc\e$xyz\eE abc\e$xyz abc\e$xyz - \eQabc\eE\e$\eQxyz\eE abc$xyz abc$xyz -.sp -The \eQ...\eE sequence is recognized both inside and outside character classes. -An isolated \eE that is not preceded by \eQ is ignored. If \eQ is not followed -by \eE later in the pattern, the literal interpretation continues to the end of -the pattern (that is, \eE is assumed at the end). If the isolated \eQ is inside -a character class, this causes an error, because the character class is not -terminated. -. -. -.\" HTML -.SS "Non-printing characters" -.rs -.sp -A second use of backslash provides a way of encoding non-printing characters -in patterns in a visible manner. There is no restriction on the appearance of -non-printing characters, apart from the binary zero that terminates a pattern, -but when a pattern is being prepared by text editing, it is often easier to use -one of the following escape sequences than the binary character it represents. -In an ASCII or Unicode environment, these escapes are as follows: -.sp - \ea alarm, that is, the BEL character (hex 07) - \ecx "control-x", where x is any ASCII character - \ee escape (hex 1B) - \ef form feed (hex 0C) - \en linefeed (hex 0A) - \er carriage return (hex 0D) - \et tab (hex 09) - \e0dd character with octal code 0dd - \eddd character with octal code ddd, or back reference - \eo{ddd..} character with octal code ddd.. - \exhh character with hex code hh - \ex{hhh..} character with hex code hhh.. (non-JavaScript mode) - \euhhhh character with hex code hhhh (JavaScript mode only) -.sp -The precise effect of \ecx on ASCII characters is as follows: if x is a lower -case letter, it is converted to upper case. Then bit 6 of the character (hex -40) is inverted. Thus \ecA to \ecZ become hex 01 to hex 1A (A is 41, Z is 5A), -but \ec{ becomes hex 3B ({ is 7B), and \ec; becomes hex 7B (; is 3B). If the -data item (byte or 16-bit value) following \ec has a value greater than 127, a -compile-time error occurs. This locks out non-ASCII characters in all modes. -.P -When PCRE is compiled in EBCDIC mode, \ea, \ee, \ef, \en, \er, and \et -generate the appropriate EBCDIC code values. The \ec escape is processed -as specified for Perl in the \fBperlebcdic\fP document. The only characters -that are allowed after \ec are A-Z, a-z, or one of @, [, \e, ], ^, _, or ?. Any -other character provokes a compile-time error. The sequence \ec@ encodes -character code 0; after \ec the letters (in either case) encode characters 1-26 -(hex 01 to hex 1A); [, \e, ], ^, and _ encode characters 27-31 (hex 1B to hex -1F), and \ec? becomes either 255 (hex FF) or 95 (hex 5F). -.P -Thus, apart from \ec?, these escapes generate the same character code values as -they do in an ASCII environment, though the meanings of the values mostly -differ. For example, \ecG always generates code value 7, which is BEL in ASCII -but DEL in EBCDIC. -.P -The sequence \ec? generates DEL (127, hex 7F) in an ASCII environment, but -because 127 is not a control character in EBCDIC, Perl makes it generate the -APC character. Unfortunately, there are several variants of EBCDIC. In most of -them the APC character has the value 255 (hex FF), but in the one Perl calls -POSIX-BC its value is 95 (hex 5F). If certain other characters have POSIX-BC -values, PCRE makes \ec? generate 95; otherwise it generates 255. -.P -After \e0 up to two further octal digits are read. If there are fewer than two -digits, just those that are present are used. Thus the sequence \e0\ex\e015 -specifies two binary zeros followed by a CR character (code value 13). Make -sure you supply two digits after the initial zero if the pattern character that -follows is itself an octal digit. -.P -The escape \eo must be followed by a sequence of octal digits, enclosed in -braces. An error occurs if this is not the case. This escape is a recent -addition to Perl; it provides way of specifying character code points as octal -numbers greater than 0777, and it also allows octal numbers and back references -to be unambiguously specified. -.P -For greater clarity and unambiguity, it is best to avoid following \e by a -digit greater than zero. Instead, use \eo{} or \ex{} to specify character -numbers, and \eg{} to specify back references. The following paragraphs -describe the old, ambiguous syntax. -.P -The handling of a backslash followed by a digit other than 0 is complicated, -and Perl has changed in recent releases, causing PCRE also to change. Outside a -character class, PCRE reads the digit and any following digits as a decimal -number. If the number is less than 8, or if there have been at least that many -previous capturing left parentheses in the expression, the entire sequence is -taken as a \fIback reference\fP. A description of how this works is given -.\" HTML -.\" -later, -.\" -following the discussion of -.\" HTML -.\" -parenthesized subpatterns. -.\" -.P -Inside a character class, or if the decimal number following \e is greater than -7 and there have not been that many capturing subpatterns, PCRE handles \e8 and -\e9 as the literal characters "8" and "9", and otherwise re-reads up to three -octal digits following the backslash, using them to generate a data character. -Any subsequent digits stand for themselves. For example: -.sp - \e040 is another way of writing an ASCII space -.\" JOIN - \e40 is the same, provided there are fewer than 40 - previous capturing subpatterns - \e7 is always a back reference -.\" JOIN - \e11 might be a back reference, or another way of - writing a tab - \e011 is always a tab - \e0113 is a tab followed by the character "3" -.\" JOIN - \e113 might be a back reference, otherwise the - character with octal code 113 -.\" JOIN - \e377 might be a back reference, otherwise - the value 255 (decimal) -.\" JOIN - \e81 is either a back reference, or the two - characters "8" and "1" -.sp -Note that octal values of 100 or greater that are specified using this syntax -must not be introduced by a leading zero, because no more than three octal -digits are ever read. -.P -By default, after \ex that is not followed by {, from zero to two hexadecimal -digits are read (letters can be in upper or lower case). Any number of -hexadecimal digits may appear between \ex{ and }. If a character other than -a hexadecimal digit appears between \ex{ and }, or if there is no terminating -}, an error occurs. -.P -If the PCRE_JAVASCRIPT_COMPAT option is set, the interpretation of \ex is -as just described only when it is followed by two hexadecimal digits. -Otherwise, it matches a literal "x" character. In JavaScript mode, support for -code points greater than 256 is provided by \eu, which must be followed by -four hexadecimal digits; otherwise it matches a literal "u" character. -.P -Characters whose value is less than 256 can be defined by either of the two -syntaxes for \ex (or by \eu in JavaScript mode). There is no difference in the -way they are handled. For example, \exdc is exactly the same as \ex{dc} (or -\eu00dc in JavaScript mode). -. -. -.SS "Constraints on character values" -.rs -.sp -Characters that are specified using octal or hexadecimal numbers are -limited to certain values, as follows: -.sp - 8-bit non-UTF mode less than 0x100 - 8-bit UTF-8 mode less than 0x10ffff and a valid codepoint - 16-bit non-UTF mode less than 0x10000 - 16-bit UTF-16 mode less than 0x10ffff and a valid codepoint - 32-bit non-UTF mode less than 0x100000000 - 32-bit UTF-32 mode less than 0x10ffff and a valid codepoint -.sp -Invalid Unicode codepoints are the range 0xd800 to 0xdfff (the so-called -"surrogate" codepoints), and 0xffef. -. -. -.SS "Escape sequences in character classes" -.rs -.sp -All the sequences that define a single character value can be used both inside -and outside character classes. In addition, inside a character class, \eb is -interpreted as the backspace character (hex 08). -.P -\eN is not allowed in a character class. \eB, \eR, and \eX are not special -inside a character class. Like other unrecognized escape sequences, they are -treated as the literal characters "B", "R", and "X" by default, but cause an -error if the PCRE_EXTRA option is set. Outside a character class, these -sequences have different meanings. -. -. -.SS "Unsupported escape sequences" -.rs -.sp -In Perl, the sequences \el, \eL, \eu, and \eU are recognized by its string -handler and used to modify the case of following characters. By default, PCRE -does not support these escape sequences. However, if the PCRE_JAVASCRIPT_COMPAT -option is set, \eU matches a "U" character, and \eu can be used to define a -character by code point, as described in the previous section. -. -. -.SS "Absolute and relative back references" -.rs -.sp -The sequence \eg followed by an unsigned or a negative number, optionally -enclosed in braces, is an absolute or relative back reference. A named back -reference can be coded as \eg{name}. Back references are discussed -.\" HTML -.\" -later, -.\" -following the discussion of -.\" HTML -.\" -parenthesized subpatterns. -.\" -. -. -.SS "Absolute and relative subroutine calls" -.rs -.sp -For compatibility with Oniguruma, the non-Perl syntax \eg followed by a name or -a number enclosed either in angle brackets or single quotes, is an alternative -syntax for referencing a subpattern as a "subroutine". Details are discussed -.\" HTML -.\" -later. -.\" -Note that \eg{...} (Perl syntax) and \eg<...> (Oniguruma syntax) are \fInot\fP -synonymous. The former is a back reference; the latter is a -.\" HTML -.\" -subroutine -.\" -call. -. -. -.\" HTML -.SS "Generic character types" -.rs -.sp -Another use of backslash is for specifying generic character types: -.sp - \ed any decimal digit - \eD any character that is not a decimal digit - \eh any horizontal white space character - \eH any character that is not a horizontal white space character - \es any white space character - \eS any character that is not a white space character - \ev any vertical white space character - \eV any character that is not a vertical white space character - \ew any "word" character - \eW any "non-word" character -.sp -There is also the single sequence \eN, which matches a non-newline character. -This is the same as -.\" HTML -.\" -the "." metacharacter -.\" -when PCRE_DOTALL is not set. Perl also uses \eN to match characters by name; -PCRE does not support this. -.P -Each pair of lower and upper case escape sequences partitions the complete set -of characters into two disjoint sets. Any given character matches one, and only -one, of each pair. The sequences can appear both inside and outside character -classes. They each match one character of the appropriate type. If the current -matching point is at the end of the subject string, all of them fail, because -there is no character to match. -.P -For compatibility with Perl, \es did not used to match the VT character (code -11), which made it different from the the POSIX "space" class. However, Perl -added VT at release 5.18, and PCRE followed suit at release 8.34. The default -\es characters are now HT (9), LF (10), VT (11), FF (12), CR (13), and space -(32), which are defined as white space in the "C" locale. This list may vary if -locale-specific matching is taking place. For example, in some locales the -"non-breaking space" character (\exA0) is recognized as white space, and in -others the VT character is not. -.P -A "word" character is an underscore or any character that is a letter or digit. -By default, the definition of letters and digits is controlled by PCRE's -low-valued character tables, and may vary if locale-specific matching is taking -place (see -.\" HTML -.\" -"Locale support" -.\" -in the -.\" HREF -\fBpcreapi\fP -.\" -page). For example, in a French locale such as "fr_FR" in Unix-like systems, -or "french" in Windows, some character codes greater than 127 are used for -accented letters, and these are then matched by \ew. The use of locales with -Unicode is discouraged. -.P -By default, characters whose code points are greater than 127 never match \ed, -\es, or \ew, and always match \eD, \eS, and \eW, although this may vary for -characters in the range 128-255 when locale-specific matching is happening. -These escape sequences retain their original meanings from before Unicode -support was available, mainly for efficiency reasons. If PCRE is compiled with -Unicode property support, and the PCRE_UCP option is set, the behaviour is -changed so that Unicode properties are used to determine character types, as -follows: -.sp - \ed any character that matches \ep{Nd} (decimal digit) - \es any character that matches \ep{Z} or \eh or \ev - \ew any character that matches \ep{L} or \ep{N}, plus underscore -.sp -The upper case escapes match the inverse sets of characters. Note that \ed -matches only decimal digits, whereas \ew matches any Unicode digit, as well as -any Unicode letter, and underscore. Note also that PCRE_UCP affects \eb, and -\eB because they are defined in terms of \ew and \eW. Matching these sequences -is noticeably slower when PCRE_UCP is set. -.P -The sequences \eh, \eH, \ev, and \eV are features that were added to Perl at -release 5.10. In contrast to the other sequences, which match only ASCII -characters by default, these always match certain high-valued code points, -whether or not PCRE_UCP is set. The horizontal space characters are: -.sp - U+0009 Horizontal tab (HT) - U+0020 Space - U+00A0 Non-break space - U+1680 Ogham space mark - U+180E Mongolian vowel separator - U+2000 En quad - U+2001 Em quad - U+2002 En space - U+2003 Em space - U+2004 Three-per-em space - U+2005 Four-per-em space - U+2006 Six-per-em space - U+2007 Figure space - U+2008 Punctuation space - U+2009 Thin space - U+200A Hair space - U+202F Narrow no-break space - U+205F Medium mathematical space - U+3000 Ideographic space -.sp -The vertical space characters are: -.sp - U+000A Linefeed (LF) - U+000B Vertical tab (VT) - U+000C Form feed (FF) - U+000D Carriage return (CR) - U+0085 Next line (NEL) - U+2028 Line separator - U+2029 Paragraph separator -.sp -In 8-bit, non-UTF-8 mode, only the characters with codepoints less than 256 are -relevant. -. -. -.\" HTML -.SS "Newline sequences" -.rs -.sp -Outside a character class, by default, the escape sequence \eR matches any -Unicode newline sequence. In 8-bit non-UTF-8 mode \eR is equivalent to the -following: -.sp - (?>\er\en|\en|\ex0b|\ef|\er|\ex85) -.sp -This is an example of an "atomic group", details of which are given -.\" HTML -.\" -below. -.\" -This particular group matches either the two-character sequence CR followed by -LF, or one of the single characters LF (linefeed, U+000A), VT (vertical tab, -U+000B), FF (form feed, U+000C), CR (carriage return, U+000D), or NEL (next -line, U+0085). The two-character sequence is treated as a single unit that -cannot be split. -.P -In other modes, two additional characters whose codepoints are greater than 255 -are added: LS (line separator, U+2028) and PS (paragraph separator, U+2029). -Unicode character property support is not needed for these characters to be -recognized. -.P -It is possible to restrict \eR to match only CR, LF, or CRLF (instead of the -complete set of Unicode line endings) by setting the option PCRE_BSR_ANYCRLF -either at compile time or when the pattern is matched. (BSR is an abbrevation -for "backslash R".) This can be made the default when PCRE is built; if this is -the case, the other behaviour can be requested via the PCRE_BSR_UNICODE option. -It is also possible to specify these settings by starting a pattern string with -one of the following sequences: -.sp - (*BSR_ANYCRLF) CR, LF, or CRLF only - (*BSR_UNICODE) any Unicode newline sequence -.sp -These override the default and the options given to the compiling function, but -they can themselves be overridden by options given to a matching function. Note -that these special settings, which are not Perl-compatible, are recognized only -at the very start of a pattern, and that they must be in upper case. If more -than one of them is present, the last one is used. They can be combined with a -change of newline convention; for example, a pattern can start with: -.sp - (*ANY)(*BSR_ANYCRLF) -.sp -They can also be combined with the (*UTF8), (*UTF16), (*UTF32), (*UTF) or -(*UCP) special sequences. Inside a character class, \eR is treated as an -unrecognized escape sequence, and so matches the letter "R" by default, but -causes an error if PCRE_EXTRA is set. -. -. -.\" HTML -.SS Unicode character properties -.rs -.sp -When PCRE is built with Unicode character property support, three additional -escape sequences that match characters with specific properties are available. -When in 8-bit non-UTF-8 mode, these sequences are of course limited to testing -characters whose codepoints are less than 256, but they do work in this mode. -The extra escape sequences are: -.sp - \ep{\fIxx\fP} a character with the \fIxx\fP property - \eP{\fIxx\fP} a character without the \fIxx\fP property - \eX a Unicode extended grapheme cluster -.sp -The property names represented by \fIxx\fP above are limited to the Unicode -script names, the general category properties, "Any", which matches any -character (including newline), and some special PCRE properties (described -in the -.\" HTML -.\" -next section). -.\" -Other Perl properties such as "InMusicalSymbols" are not currently supported by -PCRE. Note that \eP{Any} does not match any characters, so always causes a -match failure. -.P -Sets of Unicode characters are defined as belonging to certain scripts. A -character from one of these sets can be matched using a script name. For -example: -.sp - \ep{Greek} - \eP{Han} -.sp -Those that are not part of an identified script are lumped together as -"Common". The current list of scripts is: -.P -Arabic, -Armenian, -Avestan, -Balinese, -Bamum, -Bassa_Vah, -Batak, -Bengali, -Bopomofo, -Brahmi, -Braille, -Buginese, -Buhid, -Canadian_Aboriginal, -Carian, -Caucasian_Albanian, -Chakma, -Cham, -Cherokee, -Common, -Coptic, -Cuneiform, -Cypriot, -Cyrillic, -Deseret, -Devanagari, -Duployan, -Egyptian_Hieroglyphs, -Elbasan, -Ethiopic, -Georgian, -Glagolitic, -Gothic, -Grantha, -Greek, -Gujarati, -Gurmukhi, -Han, -Hangul, -Hanunoo, -Hebrew, -Hiragana, -Imperial_Aramaic, -Inherited, -Inscriptional_Pahlavi, -Inscriptional_Parthian, -Javanese, -Kaithi, -Kannada, -Katakana, -Kayah_Li, -Kharoshthi, -Khmer, -Khojki, -Khudawadi, -Lao, -Latin, -Lepcha, -Limbu, -Linear_A, -Linear_B, -Lisu, -Lycian, -Lydian, -Mahajani, -Malayalam, -Mandaic, -Manichaean, -Meetei_Mayek, -Mende_Kikakui, -Meroitic_Cursive, -Meroitic_Hieroglyphs, -Miao, -Modi, -Mongolian, -Mro, -Myanmar, -Nabataean, -New_Tai_Lue, -Nko, -Ogham, -Ol_Chiki, -Old_Italic, -Old_North_Arabian, -Old_Permic, -Old_Persian, -Old_South_Arabian, -Old_Turkic, -Oriya, -Osmanya, -Pahawh_Hmong, -Palmyrene, -Pau_Cin_Hau, -Phags_Pa, -Phoenician, -Psalter_Pahlavi, -Rejang, -Runic, -Samaritan, -Saurashtra, -Sharada, -Shavian, -Siddham, -Sinhala, -Sora_Sompeng, -Sundanese, -Syloti_Nagri, -Syriac, -Tagalog, -Tagbanwa, -Tai_Le, -Tai_Tham, -Tai_Viet, -Takri, -Tamil, -Telugu, -Thaana, -Thai, -Tibetan, -Tifinagh, -Tirhuta, -Ugaritic, -Vai, -Warang_Citi, -Yi. -.P -Each character has exactly one Unicode general category property, specified by -a two-letter abbreviation. For compatibility with Perl, negation can be -specified by including a circumflex between the opening brace and the property -name. For example, \ep{^Lu} is the same as \eP{Lu}. -.P -If only one letter is specified with \ep or \eP, it includes all the general -category properties that start with that letter. In this case, in the absence -of negation, the curly brackets in the escape sequence are optional; these two -examples have the same effect: -.sp - \ep{L} - \epL -.sp -The following general category property codes are supported: -.sp - C Other - Cc Control - Cf Format - Cn Unassigned - Co Private use - Cs Surrogate -.sp - L Letter - Ll Lower case letter - Lm Modifier letter - Lo Other letter - Lt Title case letter - Lu Upper case letter -.sp - M Mark - Mc Spacing mark - Me Enclosing mark - Mn Non-spacing mark -.sp - N Number - Nd Decimal number - Nl Letter number - No Other number -.sp - P Punctuation - Pc Connector punctuation - Pd Dash punctuation - Pe Close punctuation - Pf Final punctuation - Pi Initial punctuation - Po Other punctuation - Ps Open punctuation -.sp - S Symbol - Sc Currency symbol - Sk Modifier symbol - Sm Mathematical symbol - So Other symbol -.sp - Z Separator - Zl Line separator - Zp Paragraph separator - Zs Space separator -.sp -The special property L& is also supported: it matches a character that has -the Lu, Ll, or Lt property, in other words, a letter that is not classified as -a modifier or "other". -.P -The Cs (Surrogate) property applies only to characters in the range U+D800 to -U+DFFF. Such characters are not valid in Unicode strings and so -cannot be tested by PCRE, unless UTF validity checking has been turned off -(see the discussion of PCRE_NO_UTF8_CHECK, PCRE_NO_UTF16_CHECK and -PCRE_NO_UTF32_CHECK in the -.\" HREF -\fBpcreapi\fP -.\" -page). Perl does not support the Cs property. -.P -The long synonyms for property names that Perl supports (such as \ep{Letter}) -are not supported by PCRE, nor is it permitted to prefix any of these -properties with "Is". -.P -No character that is in the Unicode table has the Cn (unassigned) property. -Instead, this property is assumed for any code point that is not in the -Unicode table. -.P -Specifying caseless matching does not affect these escape sequences. For -example, \ep{Lu} always matches only upper case letters. This is different from -the behaviour of current versions of Perl. -.P -Matching characters by Unicode property is not fast, because PCRE has to do a -multistage table lookup in order to find a character's property. That is why -the traditional escape sequences such as \ed and \ew do not use Unicode -properties in PCRE by default, though you can make them do so by setting the -PCRE_UCP option or by starting the pattern with (*UCP). -. -. -.SS Extended grapheme clusters -.rs -.sp -The \eX escape matches any number of Unicode characters that form an "extended -grapheme cluster", and treats the sequence as an atomic group -.\" HTML -.\" -(see below). -.\" -Up to and including release 8.31, PCRE matched an earlier, simpler definition -that was equivalent to -.sp - (?>\ePM\epM*) -.sp -That is, it matched a character without the "mark" property, followed by zero -or more characters with the "mark" property. Characters with the "mark" -property are typically non-spacing accents that affect the preceding character. -.P -This simple definition was extended in Unicode to include more complicated -kinds of composite character by giving each character a grapheme breaking -property, and creating rules that use these properties to define the boundaries -of extended grapheme clusters. In releases of PCRE later than 8.31, \eX matches -one of these clusters. -.P -\eX always matches at least one character. Then it decides whether to add -additional characters according to the following rules for ending a cluster: -.P -1. End at the end of the subject string. -.P -2. Do not end between CR and LF; otherwise end after any control character. -.P -3. Do not break Hangul (a Korean script) syllable sequences. Hangul characters -are of five types: L, V, T, LV, and LVT. An L character may be followed by an -L, V, LV, or LVT character; an LV or V character may be followed by a V or T -character; an LVT or T character may be follwed only by a T character. -.P -4. Do not end before extending characters or spacing marks. Characters with -the "mark" property always have the "extend" grapheme breaking property. -.P -5. Do not end after prepend characters. -.P -6. Otherwise, end the cluster. -. -. -.\" HTML -.SS PCRE's additional properties -.rs -.sp -As well as the standard Unicode properties described above, PCRE supports four -more that make it possible to convert traditional escape sequences such as \ew -and \es to use Unicode properties. PCRE uses these non-standard, non-Perl -properties internally when PCRE_UCP is set. However, they may also be used -explicitly. These properties are: -.sp - Xan Any alphanumeric character - Xps Any POSIX space character - Xsp Any Perl space character - Xwd Any Perl "word" character -.sp -Xan matches characters that have either the L (letter) or the N (number) -property. Xps matches the characters tab, linefeed, vertical tab, form feed, or -carriage return, and any other character that has the Z (separator) property. -Xsp is the same as Xps; it used to exclude vertical tab, for Perl -compatibility, but Perl changed, and so PCRE followed at release 8.34. Xwd -matches the same characters as Xan, plus underscore. -.P -There is another non-standard property, Xuc, which matches any character that -can be represented by a Universal Character Name in C++ and other programming -languages. These are the characters $, @, ` (grave accent), and all characters -with Unicode code points greater than or equal to U+00A0, except for the -surrogates U+D800 to U+DFFF. Note that most base (ASCII) characters are -excluded. (Universal Character Names are of the form \euHHHH or \eUHHHHHHHH -where H is a hexadecimal digit. Note that the Xuc property does not match these -sequences but the characters that they represent.) -. -. -.\" HTML -.SS "Resetting the match start" -.rs -.sp -The escape sequence \eK causes any previously matched characters not to be -included in the final matched sequence. For example, the pattern: -.sp - foo\eKbar -.sp -matches "foobar", but reports that it has matched "bar". This feature is -similar to a lookbehind assertion -.\" HTML -.\" -(described below). -.\" -However, in this case, the part of the subject before the real match does not -have to be of fixed length, as lookbehind assertions do. The use of \eK does -not interfere with the setting of -.\" HTML -.\" -captured substrings. -.\" -For example, when the pattern -.sp - (foo)\eKbar -.sp -matches "foobar", the first substring is still set to "foo". -.P -Perl documents that the use of \eK within assertions is "not well defined". In -PCRE, \eK is acted upon when it occurs inside positive assertions, but is -ignored in negative assertions. Note that when a pattern such as (?=ab\eK) -matches, the reported start of the match can be greater than the end of the -match. -. -. -.\" HTML -.SS "Simple assertions" -.rs -.sp -The final use of backslash is for certain simple assertions. An assertion -specifies a condition that has to be met at a particular point in a match, -without consuming any characters from the subject string. The use of -subpatterns for more complicated assertions is described -.\" HTML -.\" -below. -.\" -The backslashed assertions are: -.sp - \eb matches at a word boundary - \eB matches when not at a word boundary - \eA matches at the start of the subject - \eZ matches at the end of the subject - also matches before a newline at the end of the subject - \ez matches only at the end of the subject - \eG matches at the first matching position in the subject -.sp -Inside a character class, \eb has a different meaning; it matches the backspace -character. If any other of these assertions appears in a character class, by -default it matches the corresponding literal character (for example, \eB -matches the letter B). However, if the PCRE_EXTRA option is set, an "invalid -escape sequence" error is generated instead. -.P -A word boundary is a position in the subject string where the current character -and the previous character do not both match \ew or \eW (i.e. one matches -\ew and the other matches \eW), or the start or end of the string if the -first or last character matches \ew, respectively. In a UTF mode, the meanings -of \ew and \eW can be changed by setting the PCRE_UCP option. When this is -done, it also affects \eb and \eB. Neither PCRE nor Perl has a separate "start -of word" or "end of word" metasequence. However, whatever follows \eb normally -determines which it is. For example, the fragment \eba matches "a" at the start -of a word. -.P -The \eA, \eZ, and \ez assertions differ from the traditional circumflex and -dollar (described in the next section) in that they only ever match at the very -start and end of the subject string, whatever options are set. Thus, they are -independent of multiline mode. These three assertions are not affected by the -PCRE_NOTBOL or PCRE_NOTEOL options, which affect only the behaviour of the -circumflex and dollar metacharacters. However, if the \fIstartoffset\fP -argument of \fBpcre_exec()\fP is non-zero, indicating that matching is to start -at a point other than the beginning of the subject, \eA can never match. The -difference between \eZ and \ez is that \eZ matches before a newline at the end -of the string as well as at the very end, whereas \ez matches only at the end. -.P -The \eG assertion is true only when the current matching position is at the -start point of the match, as specified by the \fIstartoffset\fP argument of -\fBpcre_exec()\fP. It differs from \eA when the value of \fIstartoffset\fP is -non-zero. By calling \fBpcre_exec()\fP multiple times with appropriate -arguments, you can mimic Perl's /g option, and it is in this kind of -implementation where \eG can be useful. -.P -Note, however, that PCRE's interpretation of \eG, as the start of the current -match, is subtly different from Perl's, which defines it as the end of the -previous match. In Perl, these can be different when the previously matched -string was empty. Because PCRE does just one match at a time, it cannot -reproduce this behaviour. -.P -If all the alternatives of a pattern begin with \eG, the expression is anchored -to the starting match position, and the "anchored" flag is set in the compiled -regular expression. -. -. -.SH "CIRCUMFLEX AND DOLLAR" -.rs -.sp -The circumflex and dollar metacharacters are zero-width assertions. That is, -they test for a particular condition being true without consuming any -characters from the subject string. -.P -Outside a character class, in the default matching mode, the circumflex -character is an assertion that is true only if the current matching point is at -the start of the subject string. If the \fIstartoffset\fP argument of -\fBpcre_exec()\fP is non-zero, circumflex can never match if the PCRE_MULTILINE -option is unset. Inside a character class, circumflex has an entirely different -meaning -.\" HTML -.\" -(see below). -.\" -.P -Circumflex need not be the first character of the pattern if a number of -alternatives are involved, but it should be the first thing in each alternative -in which it appears if the pattern is ever to match that branch. If all -possible alternatives start with a circumflex, that is, if the pattern is -constrained to match only at the start of the subject, it is said to be an -"anchored" pattern. (There are also other constructs that can cause a pattern -to be anchored.) -.P -The dollar character is an assertion that is true only if the current matching -point is at the end of the subject string, or immediately before a newline at -the end of the string (by default). Note, however, that it does not actually -match the newline. Dollar need not be the last character of the pattern if a -number of alternatives are involved, but it should be the last item in any -branch in which it appears. Dollar has no special meaning in a character class. -.P -The meaning of dollar can be changed so that it matches only at the very end of -the string, by setting the PCRE_DOLLAR_ENDONLY option at compile time. This -does not affect the \eZ assertion. -.P -The meanings of the circumflex and dollar characters are changed if the -PCRE_MULTILINE option is set. When this is the case, a circumflex matches -immediately after internal newlines as well as at the start of the subject -string. It does not match after a newline that ends the string. A dollar -matches before any newlines in the string, as well as at the very end, when -PCRE_MULTILINE is set. When newline is specified as the two-character -sequence CRLF, isolated CR and LF characters do not indicate newlines. -.P -For example, the pattern /^abc$/ matches the subject string "def\enabc" (where -\en represents a newline) in multiline mode, but not otherwise. Consequently, -patterns that are anchored in single line mode because all branches start with -^ are not anchored in multiline mode, and a match for circumflex is possible -when the \fIstartoffset\fP argument of \fBpcre_exec()\fP is non-zero. The -PCRE_DOLLAR_ENDONLY option is ignored if PCRE_MULTILINE is set. -.P -Note that the sequences \eA, \eZ, and \ez can be used to match the start and -end of the subject in both modes, and if all branches of a pattern start with -\eA it is always anchored, whether or not PCRE_MULTILINE is set. -. -. -.\" HTML -.SH "FULL STOP (PERIOD, DOT) AND \eN" -.rs -.sp -Outside a character class, a dot in the pattern matches any one character in -the subject string except (by default) a character that signifies the end of a -line. -.P -When a line ending is defined as a single character, dot never matches that -character; when the two-character sequence CRLF is used, dot does not match CR -if it is immediately followed by LF, but otherwise it matches all characters -(including isolated CRs and LFs). When any Unicode line endings are being -recognized, dot does not match CR or LF or any of the other line ending -characters. -.P -The behaviour of dot with regard to newlines can be changed. If the PCRE_DOTALL -option is set, a dot matches any one character, without exception. If the -two-character sequence CRLF is present in the subject string, it takes two dots -to match it. -.P -The handling of dot is entirely independent of the handling of circumflex and -dollar, the only relationship being that they both involve newlines. Dot has no -special meaning in a character class. -.P -The escape sequence \eN behaves like a dot, except that it is not affected by -the PCRE_DOTALL option. In other words, it matches any character except one -that signifies the end of a line. Perl also uses \eN to match characters by -name; PCRE does not support this. -. -. -.SH "MATCHING A SINGLE DATA UNIT" -.rs -.sp -Outside a character class, the escape sequence \eC matches any one data unit, -whether or not a UTF mode is set. In the 8-bit library, one data unit is one -byte; in the 16-bit library it is a 16-bit unit; in the 32-bit library it is -a 32-bit unit. Unlike a dot, \eC always -matches line-ending characters. The feature is provided in Perl in order to -match individual bytes in UTF-8 mode, but it is unclear how it can usefully be -used. Because \eC breaks up characters into individual data units, matching one -unit with \eC in a UTF mode means that the rest of the string may start with a -malformed UTF character. This has undefined results, because PCRE assumes that -it is dealing with valid UTF strings (and by default it checks this at the -start of processing unless the PCRE_NO_UTF8_CHECK, PCRE_NO_UTF16_CHECK or -PCRE_NO_UTF32_CHECK option is used). -.P -PCRE does not allow \eC to appear in lookbehind assertions -.\" HTML -.\" -(described below) -.\" -in a UTF mode, because this would make it impossible to calculate the length of -the lookbehind. -.P -In general, the \eC escape sequence is best avoided. However, one -way of using it that avoids the problem of malformed UTF characters is to use a -lookahead to check the length of the next character, as in this pattern, which -could be used with a UTF-8 string (ignore white space and line breaks): -.sp - (?| (?=[\ex00-\ex7f])(\eC) | - (?=[\ex80-\ex{7ff}])(\eC)(\eC) | - (?=[\ex{800}-\ex{ffff}])(\eC)(\eC)(\eC) | - (?=[\ex{10000}-\ex{1fffff}])(\eC)(\eC)(\eC)(\eC)) -.sp -A group that starts with (?| resets the capturing parentheses numbers in each -alternative (see -.\" HTML -.\" -"Duplicate Subpattern Numbers" -.\" -below). The assertions at the start of each branch check the next UTF-8 -character for values whose encoding uses 1, 2, 3, or 4 bytes, respectively. The -character's individual bytes are then captured by the appropriate number of -groups. -. -. -.\" HTML -.SH "SQUARE BRACKETS AND CHARACTER CLASSES" -.rs -.sp -An opening square bracket introduces a character class, terminated by a closing -square bracket. A closing square bracket on its own is not special by default. -However, if the PCRE_JAVASCRIPT_COMPAT option is set, a lone closing square -bracket causes a compile-time error. If a closing square bracket is required as -a member of the class, it should be the first data character in the class -(after an initial circumflex, if present) or escaped with a backslash. -.P -A character class matches a single character in the subject. In a UTF mode, the -character may be more than one data unit long. A matched character must be in -the set of characters defined by the class, unless the first character in the -class definition is a circumflex, in which case the subject character must not -be in the set defined by the class. If a circumflex is actually required as a -member of the class, ensure it is not the first character, or escape it with a -backslash. -.P -For example, the character class [aeiou] matches any lower case vowel, while -[^aeiou] matches any character that is not a lower case vowel. Note that a -circumflex is just a convenient notation for specifying the characters that -are in the class by enumerating those that are not. A class that starts with a -circumflex is not an assertion; it still consumes a character from the subject -string, and therefore it fails if the current pointer is at the end of the -string. -.P -In UTF-8 (UTF-16, UTF-32) mode, characters with values greater than 255 (0xffff) -can be included in a class as a literal string of data units, or by using the -\ex{ escaping mechanism. -.P -When caseless matching is set, any letters in a class represent both their -upper case and lower case versions, so for example, a caseless [aeiou] matches -"A" as well as "a", and a caseless [^aeiou] does not match "A", whereas a -caseful version would. In a UTF mode, PCRE always understands the concept of -case for characters whose values are less than 128, so caseless matching is -always possible. For characters with higher values, the concept of case is -supported if PCRE is compiled with Unicode property support, but not otherwise. -If you want to use caseless matching in a UTF mode for characters 128 and -above, you must ensure that PCRE is compiled with Unicode property support as -well as with UTF support. -.P -Characters that might indicate line breaks are never treated in any special way -when matching character classes, whatever line-ending sequence is in use, and -whatever setting of the PCRE_DOTALL and PCRE_MULTILINE options is used. A class -such as [^a] always matches one of these characters. -.P -The minus (hyphen) character can be used to specify a range of characters in a -character class. For example, [d-m] matches any letter between d and m, -inclusive. If a minus character is required in a class, it must be escaped with -a backslash or appear in a position where it cannot be interpreted as -indicating a range, typically as the first or last character in the class, or -immediately after a range. For example, [b-d-z] matches letters in the range b -to d, a hyphen character, or z. -.P -It is not possible to have the literal character "]" as the end character of a -range. A pattern such as [W-]46] is interpreted as a class of two characters -("W" and "-") followed by a literal string "46]", so it would match "W46]" or -"-46]". However, if the "]" is escaped with a backslash it is interpreted as -the end of range, so [W-\e]46] is interpreted as a class containing a range -followed by two other characters. The octal or hexadecimal representation of -"]" can also be used to end a range. -.P -An error is generated if a POSIX character class (see below) or an escape -sequence other than one that defines a single character appears at a point -where a range ending character is expected. For example, [z-\exff] is valid, -but [A-\ed] and [A-[:digit:]] are not. -.P -Ranges operate in the collating sequence of character values. They can also be -used for characters specified numerically, for example [\e000-\e037]. Ranges -can include any characters that are valid for the current mode. -.P -If a range that includes letters is used when caseless matching is set, it -matches the letters in either case. For example, [W-c] is equivalent to -[][\e\e^_`wxyzabc], matched caselessly, and in a non-UTF mode, if character -tables for a French locale are in use, [\exc8-\excb] matches accented E -characters in both cases. In UTF modes, PCRE supports the concept of case for -characters with values greater than 128 only when it is compiled with Unicode -property support. -.P -The character escape sequences \ed, \eD, \eh, \eH, \ep, \eP, \es, \eS, \ev, -\eV, \ew, and \eW may appear in a character class, and add the characters that -they match to the class. For example, [\edABCDEF] matches any hexadecimal -digit. In UTF modes, the PCRE_UCP option affects the meanings of \ed, \es, \ew -and their upper case partners, just as it does when they appear outside a -character class, as described in the section entitled -.\" HTML -.\" -"Generic character types" -.\" -above. The escape sequence \eb has a different meaning inside a character -class; it matches the backspace character. The sequences \eB, \eN, \eR, and \eX -are not special inside a character class. Like any other unrecognized escape -sequences, they are treated as the literal characters "B", "N", "R", and "X" by -default, but cause an error if the PCRE_EXTRA option is set. -.P -A circumflex can conveniently be used with the upper case character types to -specify a more restricted set of characters than the matching lower case type. -For example, the class [^\eW_] matches any letter or digit, but not underscore, -whereas [\ew] includes underscore. A positive character class should be read as -"something OR something OR ..." and a negative class as "NOT something AND NOT -something AND NOT ...". -.P -The only metacharacters that are recognized in character classes are backslash, -hyphen (only where it can be interpreted as specifying a range), circumflex -(only at the start), opening square bracket (only when it can be interpreted as -introducing a POSIX class name, or for a special compatibility feature - see -the next two sections), and the terminating closing square bracket. However, -escaping other non-alphanumeric characters does no harm. -. -. -.SH "POSIX CHARACTER CLASSES" -.rs -.sp -Perl supports the POSIX notation for character classes. This uses names -enclosed by [: and :] within the enclosing square brackets. PCRE also supports -this notation. For example, -.sp - [01[:alpha:]%] -.sp -matches "0", "1", any alphabetic character, or "%". The supported class names -are: -.sp - alnum letters and digits - alpha letters - ascii character codes 0 - 127 - blank space or tab only - cntrl control characters - digit decimal digits (same as \ed) - graph printing characters, excluding space - lower lower case letters - print printing characters, including space - punct printing characters, excluding letters and digits and space - space white space (the same as \es from PCRE 8.34) - upper upper case letters - word "word" characters (same as \ew) - xdigit hexadecimal digits -.sp -The default "space" characters are HT (9), LF (10), VT (11), FF (12), CR (13), -and space (32). If locale-specific matching is taking place, the list of space -characters may be different; there may be fewer or more of them. "Space" used -to be different to \es, which did not include VT, for Perl compatibility. -However, Perl changed at release 5.18, and PCRE followed at release 8.34. -"Space" and \es now match the same set of characters. -.P -The name "word" is a Perl extension, and "blank" is a GNU extension from Perl -5.8. Another Perl extension is negation, which is indicated by a ^ character -after the colon. For example, -.sp - [12[:^digit:]] -.sp -matches "1", "2", or any non-digit. PCRE (and Perl) also recognize the POSIX -syntax [.ch.] and [=ch=] where "ch" is a "collating element", but these are not -supported, and an error is given if they are encountered. -.P -By default, characters with values greater than 128 do not match any of the -POSIX character classes. However, if the PCRE_UCP option is passed to -\fBpcre_compile()\fP, some of the classes are changed so that Unicode character -properties are used. This is achieved by replacing certain POSIX classes by -other sequences, as follows: -.sp - [:alnum:] becomes \ep{Xan} - [:alpha:] becomes \ep{L} - [:blank:] becomes \eh - [:digit:] becomes \ep{Nd} - [:lower:] becomes \ep{Ll} - [:space:] becomes \ep{Xps} - [:upper:] becomes \ep{Lu} - [:word:] becomes \ep{Xwd} -.sp -Negated versions, such as [:^alpha:] use \eP instead of \ep. Three other POSIX -classes are handled specially in UCP mode: -.TP 10 -[:graph:] -This matches characters that have glyphs that mark the page when printed. In -Unicode property terms, it matches all characters with the L, M, N, P, S, or Cf -properties, except for: -.sp - U+061C Arabic Letter Mark - U+180E Mongolian Vowel Separator - U+2066 - U+2069 Various "isolate"s -.sp -.TP 10 -[:print:] -This matches the same characters as [:graph:] plus space characters that are -not controls, that is, characters with the Zs property. -.TP 10 -[:punct:] -This matches all characters that have the Unicode P (punctuation) property, -plus those characters whose code points are less than 128 that have the S -(Symbol) property. -.P -The other POSIX classes are unchanged, and match only characters with code -points less than 128. -. -. -.SH "COMPATIBILITY FEATURE FOR WORD BOUNDARIES" -.rs -.sp -In the POSIX.2 compliant library that was included in 4.4BSD Unix, the ugly -syntax [[:<:]] and [[:>:]] is used for matching "start of word" and "end of -word". PCRE treats these items as follows: -.sp - [[:<:]] is converted to \eb(?=\ew) - [[:>:]] is converted to \eb(?<=\ew) -.sp -Only these exact character sequences are recognized. A sequence such as -[a[:<:]b] provokes error for an unrecognized POSIX class name. This support is -not compatible with Perl. It is provided to help migrations from other -environments, and is best not used in any new patterns. Note that \eb matches -at the start and the end of a word (see -.\" HTML -.\" -"Simple assertions" -.\" -above), and in a Perl-style pattern the preceding or following character -normally shows which is wanted, without the need for the assertions that are -used above in order to give exactly the POSIX behaviour. -. -. -.SH "VERTICAL BAR" -.rs -.sp -Vertical bar characters are used to separate alternative patterns. For example, -the pattern -.sp - gilbert|sullivan -.sp -matches either "gilbert" or "sullivan". Any number of alternatives may appear, -and an empty alternative is permitted (matching the empty string). The matching -process tries each alternative in turn, from left to right, and the first one -that succeeds is used. If the alternatives are within a subpattern -.\" HTML -.\" -(defined below), -.\" -"succeeds" means matching the rest of the main pattern as well as the -alternative in the subpattern. -. -. -.SH "INTERNAL OPTION SETTING" -.rs -.sp -The settings of the PCRE_CASELESS, PCRE_MULTILINE, PCRE_DOTALL, and -PCRE_EXTENDED options (which are Perl-compatible) can be changed from within -the pattern by a sequence of Perl option letters enclosed between "(?" and ")". -The option letters are -.sp - i for PCRE_CASELESS - m for PCRE_MULTILINE - s for PCRE_DOTALL - x for PCRE_EXTENDED -.sp -For example, (?im) sets caseless, multiline matching. It is also possible to -unset these options by preceding the letter with a hyphen, and a combined -setting and unsetting such as (?im-sx), which sets PCRE_CASELESS and -PCRE_MULTILINE while unsetting PCRE_DOTALL and PCRE_EXTENDED, is also -permitted. If a letter appears both before and after the hyphen, the option is -unset. -.P -The PCRE-specific options PCRE_DUPNAMES, PCRE_UNGREEDY, and PCRE_EXTRA can be -changed in the same way as the Perl-compatible options by using the characters -J, U and X respectively. -.P -When one of these option changes occurs at top level (that is, not inside -subpattern parentheses), the change applies to the remainder of the pattern -that follows. An option change within a subpattern (see below for a description -of subpatterns) affects only that part of the subpattern that follows it, so -.sp - (a(?i)b)c -.sp -matches abc and aBc and no other strings (assuming PCRE_CASELESS is not used). -By this means, options can be made to have different settings in different -parts of the pattern. Any changes made in one alternative do carry on -into subsequent branches within the same subpattern. For example, -.sp - (a(?i)b|c) -.sp -matches "ab", "aB", "c", and "C", even though when matching "C" the first -branch is abandoned before the option setting. This is because the effects of -option settings happen at compile time. There would be some very weird -behaviour otherwise. -.P -\fBNote:\fP There are other PCRE-specific options that can be set by the -application when the compiling or matching functions are called. In some cases -the pattern can contain special leading sequences such as (*CRLF) to override -what the application has set or what has been defaulted. Details are given in -the section entitled -.\" HTML -.\" -"Newline sequences" -.\" -above. There are also the (*UTF8), (*UTF16),(*UTF32), and (*UCP) leading -sequences that can be used to set UTF and Unicode property modes; they are -equivalent to setting the PCRE_UTF8, PCRE_UTF16, PCRE_UTF32 and the PCRE_UCP -options, respectively. The (*UTF) sequence is a generic version that can be -used with any of the libraries. However, the application can set the -PCRE_NEVER_UTF option, which locks out the use of the (*UTF) sequences. -. -. -.\" HTML -.SH SUBPATTERNS -.rs -.sp -Subpatterns are delimited by parentheses (round brackets), which can be nested. -Turning part of a pattern into a subpattern does two things: -.sp -1. It localizes a set of alternatives. For example, the pattern -.sp - cat(aract|erpillar|) -.sp -matches "cataract", "caterpillar", or "cat". Without the parentheses, it would -match "cataract", "erpillar" or an empty string. -.sp -2. It sets up the subpattern as a capturing subpattern. This means that, when -the whole pattern matches, that portion of the subject string that matched the -subpattern is passed back to the caller via the \fIovector\fP argument of the -matching function. (This applies only to the traditional matching functions; -the DFA matching functions do not support capturing.) -.P -Opening parentheses are counted from left to right (starting from 1) to obtain -numbers for the capturing subpatterns. For example, if the string "the red -king" is matched against the pattern -.sp - the ((red|white) (king|queen)) -.sp -the captured substrings are "red king", "red", and "king", and are numbered 1, -2, and 3, respectively. -.P -The fact that plain parentheses fulfil two functions is not always helpful. -There are often times when a grouping subpattern is required without a -capturing requirement. If an opening parenthesis is followed by a question mark -and a colon, the subpattern does not do any capturing, and is not counted when -computing the number of any subsequent capturing subpatterns. For example, if -the string "the white queen" is matched against the pattern -.sp - the ((?:red|white) (king|queen)) -.sp -the captured substrings are "white queen" and "queen", and are numbered 1 and -2. The maximum number of capturing subpatterns is 65535. -.P -As a convenient shorthand, if any option settings are required at the start of -a non-capturing subpattern, the option letters may appear between the "?" and -the ":". Thus the two patterns -.sp - (?i:saturday|sunday) - (?:(?i)saturday|sunday) -.sp -match exactly the same set of strings. Because alternative branches are tried -from left to right, and options are not reset until the end of the subpattern -is reached, an option setting in one branch does affect subsequent branches, so -the above patterns match "SUNDAY" as well as "Saturday". -. -. -.\" HTML -.SH "DUPLICATE SUBPATTERN NUMBERS" -.rs -.sp -Perl 5.10 introduced a feature whereby each alternative in a subpattern uses -the same numbers for its capturing parentheses. Such a subpattern starts with -(?| and is itself a non-capturing subpattern. For example, consider this -pattern: -.sp - (?|(Sat)ur|(Sun))day -.sp -Because the two alternatives are inside a (?| group, both sets of capturing -parentheses are numbered one. Thus, when the pattern matches, you can look -at captured substring number one, whichever alternative matched. This construct -is useful when you want to capture part, but not all, of one of a number of -alternatives. Inside a (?| group, parentheses are numbered as usual, but the -number is reset at the start of each branch. The numbers of any capturing -parentheses that follow the subpattern start after the highest number used in -any branch. The following example is taken from the Perl documentation. The -numbers underneath show in which buffer the captured content will be stored. -.sp - # before ---------------branch-reset----------- after - / ( a ) (?| x ( y ) z | (p (q) r) | (t) u (v) ) ( z ) /x - # 1 2 2 3 2 3 4 -.sp -A back reference to a numbered subpattern uses the most recent value that is -set for that number by any subpattern. The following pattern matches "abcabc" -or "defdef": -.sp - /(?|(abc)|(def))\e1/ -.sp -In contrast, a subroutine call to a numbered subpattern always refers to the -first one in the pattern with the given number. The following pattern matches -"abcabc" or "defabc": -.sp - /(?|(abc)|(def))(?1)/ -.sp -If a -.\" HTML -.\" -condition test -.\" -for a subpattern's having matched refers to a non-unique number, the test is -true if any of the subpatterns of that number have matched. -.P -An alternative approach to using this "branch reset" feature is to use -duplicate named subpatterns, as described in the next section. -. -. -.SH "NAMED SUBPATTERNS" -.rs -.sp -Identifying capturing parentheses by number is simple, but it can be very hard -to keep track of the numbers in complicated regular expressions. Furthermore, -if an expression is modified, the numbers may change. To help with this -difficulty, PCRE supports the naming of subpatterns. This feature was not -added to Perl until release 5.10. Python had the feature earlier, and PCRE -introduced it at release 4.0, using the Python syntax. PCRE now supports both -the Perl and the Python syntax. Perl allows identically numbered subpatterns to -have different names, but PCRE does not. -.P -In PCRE, a subpattern can be named in one of three ways: (?...) or -(?'name'...) as in Perl, or (?P...) as in Python. References to capturing -parentheses from other parts of the pattern, such as -.\" HTML -.\" -back references, -.\" -.\" HTML -.\" -recursion, -.\" -and -.\" HTML -.\" -conditions, -.\" -can be made by name as well as by number. -.P -Names consist of up to 32 alphanumeric characters and underscores, but must -start with a non-digit. Named capturing parentheses are still allocated numbers -as well as names, exactly as if the names were not present. The PCRE API -provides function calls for extracting the name-to-number translation table -from a compiled pattern. There is also a convenience function for extracting a -captured substring by name. -.P -By default, a name must be unique within a pattern, but it is possible to relax -this constraint by setting the PCRE_DUPNAMES option at compile time. (Duplicate -names are also always permitted for subpatterns with the same number, set up as -described in the previous section.) Duplicate names can be useful for patterns -where only one instance of the named parentheses can match. Suppose you want to -match the name of a weekday, either as a 3-letter abbreviation or as the full -name, and in both cases you want to extract the abbreviation. This pattern -(ignoring the line breaks) does the job: -.sp - (?Mon|Fri|Sun)(?:day)?| - (?Tue)(?:sday)?| - (?Wed)(?:nesday)?| - (?Thu)(?:rsday)?| - (?Sat)(?:urday)? -.sp -There are five capturing substrings, but only one is ever set after a match. -(An alternative way of solving this problem is to use a "branch reset" -subpattern, as described in the previous section.) -.P -The convenience function for extracting the data by name returns the substring -for the first (and in this example, the only) subpattern of that name that -matched. This saves searching to find which numbered subpattern it was. -.P -If you make a back reference to a non-unique named subpattern from elsewhere in -the pattern, the subpatterns to which the name refers are checked in the order -in which they appear in the overall pattern. The first one that is set is used -for the reference. For example, this pattern matches both "foofoo" and -"barbar" but not "foobar" or "barfoo": -.sp - (?:(?foo)|(?bar))\ek -.sp -.P -If you make a subroutine call to a non-unique named subpattern, the one that -corresponds to the first occurrence of the name is used. In the absence of -duplicate numbers (see the previous section) this is the one with the lowest -number. -.P -If you use a named reference in a condition -test (see the -.\" -.\" HTML -.\" -section about conditions -.\" -below), either to check whether a subpattern has matched, or to check for -recursion, all subpatterns with the same name are tested. If the condition is -true for any one of them, the overall condition is true. This is the same -behaviour as testing by number. For further details of the interfaces for -handling named subpatterns, see the -.\" HREF -\fBpcreapi\fP -.\" -documentation. -.P -\fBWarning:\fP You cannot use different names to distinguish between two -subpatterns with the same number because PCRE uses only the numbers when -matching. For this reason, an error is given at compile time if different names -are given to subpatterns with the same number. However, you can always give the -same name to subpatterns with the same number, even when PCRE_DUPNAMES is not -set. -. -. -.SH REPETITION -.rs -.sp -Repetition is specified by quantifiers, which can follow any of the following -items: -.sp - a literal data character - the dot metacharacter - the \eC escape sequence - the \eX escape sequence - the \eR escape sequence - an escape such as \ed or \epL that matches a single character - a character class - a back reference (see next section) - a parenthesized subpattern (including assertions) - a subroutine call to a subpattern (recursive or otherwise) -.sp -The general repetition quantifier specifies a minimum and maximum number of -permitted matches, by giving the two numbers in curly brackets (braces), -separated by a comma. The numbers must be less than 65536, and the first must -be less than or equal to the second. For example: -.sp - z{2,4} -.sp -matches "zz", "zzz", or "zzzz". A closing brace on its own is not a special -character. If the second number is omitted, but the comma is present, there is -no upper limit; if the second number and the comma are both omitted, the -quantifier specifies an exact number of required matches. Thus -.sp - [aeiou]{3,} -.sp -matches at least 3 successive vowels, but may match many more, while -.sp - \ed{8} -.sp -matches exactly 8 digits. An opening curly bracket that appears in a position -where a quantifier is not allowed, or one that does not match the syntax of a -quantifier, is taken as a literal character. For example, {,6} is not a -quantifier, but a literal string of four characters. -.P -In UTF modes, quantifiers apply to characters rather than to individual data -units. Thus, for example, \ex{100}{2} matches two characters, each of -which is represented by a two-byte sequence in a UTF-8 string. Similarly, -\eX{3} matches three Unicode extended grapheme clusters, each of which may be -several data units long (and they may be of different lengths). -.P -The quantifier {0} is permitted, causing the expression to behave as if the -previous item and the quantifier were not present. This may be useful for -subpatterns that are referenced as -.\" HTML -.\" -subroutines -.\" -from elsewhere in the pattern (but see also the section entitled -.\" HTML -.\" -"Defining subpatterns for use by reference only" -.\" -below). Items other than subpatterns that have a {0} quantifier are omitted -from the compiled pattern. -.P -For convenience, the three most common quantifiers have single-character -abbreviations: -.sp - * is equivalent to {0,} - + is equivalent to {1,} - ? is equivalent to {0,1} -.sp -It is possible to construct infinite loops by following a subpattern that can -match no characters with a quantifier that has no upper limit, for example: -.sp - (a?)* -.sp -Earlier versions of Perl and PCRE used to give an error at compile time for -such patterns. However, because there are cases where this can be useful, such -patterns are now accepted, but if any repetition of the subpattern does in fact -match no characters, the loop is forcibly broken. -.P -By default, the quantifiers are "greedy", that is, they match as much as -possible (up to the maximum number of permitted times), without causing the -rest of the pattern to fail. The classic example of where this gives problems -is in trying to match comments in C programs. These appear between /* and */ -and within the comment, individual * and / characters may appear. An attempt to -match C comments by applying the pattern -.sp - /\e*.*\e*/ -.sp -to the string -.sp - /* first comment */ not comment /* second comment */ -.sp -fails, because it matches the entire string owing to the greediness of the .* -item. -.P -However, if a quantifier is followed by a question mark, it ceases to be -greedy, and instead matches the minimum number of times possible, so the -pattern -.sp - /\e*.*?\e*/ -.sp -does the right thing with the C comments. The meaning of the various -quantifiers is not otherwise changed, just the preferred number of matches. -Do not confuse this use of question mark with its use as a quantifier in its -own right. Because it has two uses, it can sometimes appear doubled, as in -.sp - \ed??\ed -.sp -which matches one digit by preference, but can match two if that is the only -way the rest of the pattern matches. -.P -If the PCRE_UNGREEDY option is set (an option that is not available in Perl), -the quantifiers are not greedy by default, but individual ones can be made -greedy by following them with a question mark. In other words, it inverts the -default behaviour. -.P -When a parenthesized subpattern is quantified with a minimum repeat count that -is greater than 1 or with a limited maximum, more memory is required for the -compiled pattern, in proportion to the size of the minimum or maximum. -.P -If a pattern starts with .* or .{0,} and the PCRE_DOTALL option (equivalent -to Perl's /s) is set, thus allowing the dot to match newlines, the pattern is -implicitly anchored, because whatever follows will be tried against every -character position in the subject string, so there is no point in retrying the -overall match at any position after the first. PCRE normally treats such a -pattern as though it were preceded by \eA. -.P -In cases where it is known that the subject string contains no newlines, it is -worth setting PCRE_DOTALL in order to obtain this optimization, or -alternatively using ^ to indicate anchoring explicitly. -.P -However, there are some cases where the optimization cannot be used. When .* -is inside capturing parentheses that are the subject of a back reference -elsewhere in the pattern, a match at the start may fail where a later one -succeeds. Consider, for example: -.sp - (.*)abc\e1 -.sp -If the subject is "xyz123abc123" the match point is the fourth character. For -this reason, such a pattern is not implicitly anchored. -.P -Another case where implicit anchoring is not applied is when the leading .* is -inside an atomic group. Once again, a match at the start may fail where a later -one succeeds. Consider this pattern: -.sp - (?>.*?a)b -.sp -It matches "ab" in the subject "aab". The use of the backtracking control verbs -(*PRUNE) and (*SKIP) also disable this optimization. -.P -When a capturing subpattern is repeated, the value captured is the substring -that matched the final iteration. For example, after -.sp - (tweedle[dume]{3}\es*)+ -.sp -has matched "tweedledum tweedledee" the value of the captured substring is -"tweedledee". However, if there are nested capturing subpatterns, the -corresponding captured values may have been set in previous iterations. For -example, after -.sp - /(a|(b))+/ -.sp -matches "aba" the value of the second captured substring is "b". -. -. -.\" HTML -.SH "ATOMIC GROUPING AND POSSESSIVE QUANTIFIERS" -.rs -.sp -With both maximizing ("greedy") and minimizing ("ungreedy" or "lazy") -repetition, failure of what follows normally causes the repeated item to be -re-evaluated to see if a different number of repeats allows the rest of the -pattern to match. Sometimes it is useful to prevent this, either to change the -nature of the match, or to cause it fail earlier than it otherwise might, when -the author of the pattern knows there is no point in carrying on. -.P -Consider, for example, the pattern \ed+foo when applied to the subject line -.sp - 123456bar -.sp -After matching all 6 digits and then failing to match "foo", the normal -action of the matcher is to try again with only 5 digits matching the \ed+ -item, and then with 4, and so on, before ultimately failing. "Atomic grouping" -(a term taken from Jeffrey Friedl's book) provides the means for specifying -that once a subpattern has matched, it is not to be re-evaluated in this way. -.P -If we use atomic grouping for the previous example, the matcher gives up -immediately on failing to match "foo" the first time. The notation is a kind of -special parenthesis, starting with (?> as in this example: -.sp - (?>\ed+)foo -.sp -This kind of parenthesis "locks up" the part of the pattern it contains once -it has matched, and a failure further into the pattern is prevented from -backtracking into it. Backtracking past it to previous items, however, works as -normal. -.P -An alternative description is that a subpattern of this type matches the string -of characters that an identical standalone pattern would match, if anchored at -the current point in the subject string. -.P -Atomic grouping subpatterns are not capturing subpatterns. Simple cases such as -the above example can be thought of as a maximizing repeat that must swallow -everything it can. So, while both \ed+ and \ed+? are prepared to adjust the -number of digits they match in order to make the rest of the pattern match, -(?>\ed+) can only match an entire sequence of digits. -.P -Atomic groups in general can of course contain arbitrarily complicated -subpatterns, and can be nested. However, when the subpattern for an atomic -group is just a single repeated item, as in the example above, a simpler -notation, called a "possessive quantifier" can be used. This consists of an -additional + character following a quantifier. Using this notation, the -previous example can be rewritten as -.sp - \ed++foo -.sp -Note that a possessive quantifier can be used with an entire group, for -example: -.sp - (abc|xyz){2,3}+ -.sp -Possessive quantifiers are always greedy; the setting of the PCRE_UNGREEDY -option is ignored. They are a convenient notation for the simpler forms of -atomic group. However, there is no difference in the meaning of a possessive -quantifier and the equivalent atomic group, though there may be a performance -difference; possessive quantifiers should be slightly faster. -.P -The possessive quantifier syntax is an extension to the Perl 5.8 syntax. -Jeffrey Friedl originated the idea (and the name) in the first edition of his -book. Mike McCloskey liked it, so implemented it when he built Sun's Java -package, and PCRE copied it from there. It ultimately found its way into Perl -at release 5.10. -.P -PCRE has an optimization that automatically "possessifies" certain simple -pattern constructs. For example, the sequence A+B is treated as A++B because -there is no point in backtracking into a sequence of A's when B must follow. -.P -When a pattern contains an unlimited repeat inside a subpattern that can itself -be repeated an unlimited number of times, the use of an atomic group is the -only way to avoid some failing matches taking a very long time indeed. The -pattern -.sp - (\eD+|<\ed+>)*[!?] -.sp -matches an unlimited number of substrings that either consist of non-digits, or -digits enclosed in <>, followed by either ! or ?. When it matches, it runs -quickly. However, if it is applied to -.sp - aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -.sp -it takes a long time before reporting failure. This is because the string can -be divided between the internal \eD+ repeat and the external * repeat in a -large number of ways, and all have to be tried. (The example uses [!?] rather -than a single character at the end, because both PCRE and Perl have an -optimization that allows for fast failure when a single character is used. They -remember the last single character that is required for a match, and fail early -if it is not present in the string.) If the pattern is changed so that it uses -an atomic group, like this: -.sp - ((?>\eD+)|<\ed+>)*[!?] -.sp -sequences of non-digits cannot be broken, and failure happens quickly. -. -. -.\" HTML -.SH "BACK REFERENCES" -.rs -.sp -Outside a character class, a backslash followed by a digit greater than 0 (and -possibly further digits) is a back reference to a capturing subpattern earlier -(that is, to its left) in the pattern, provided there have been that many -previous capturing left parentheses. -.P -However, if the decimal number following the backslash is less than 10, it is -always taken as a back reference, and causes an error only if there are not -that many capturing left parentheses in the entire pattern. In other words, the -parentheses that are referenced need not be to the left of the reference for -numbers less than 10. A "forward back reference" of this type can make sense -when a repetition is involved and the subpattern to the right has participated -in an earlier iteration. -.P -It is not possible to have a numerical "forward back reference" to a subpattern -whose number is 10 or more using this syntax because a sequence such as \e50 is -interpreted as a character defined in octal. See the subsection entitled -"Non-printing characters" -.\" HTML -.\" -above -.\" -for further details of the handling of digits following a backslash. There is -no such problem when named parentheses are used. A back reference to any -subpattern is possible using named parentheses (see below). -.P -Another way of avoiding the ambiguity inherent in the use of digits following a -backslash is to use the \eg escape sequence. This escape must be followed by an -unsigned number or a negative number, optionally enclosed in braces. These -examples are all identical: -.sp - (ring), \e1 - (ring), \eg1 - (ring), \eg{1} -.sp -An unsigned number specifies an absolute reference without the ambiguity that -is present in the older syntax. It is also useful when literal digits follow -the reference. A negative number is a relative reference. Consider this -example: -.sp - (abc(def)ghi)\eg{-1} -.sp -The sequence \eg{-1} is a reference to the most recently started capturing -subpattern before \eg, that is, is it equivalent to \e2 in this example. -Similarly, \eg{-2} would be equivalent to \e1. The use of relative references -can be helpful in long patterns, and also in patterns that are created by -joining together fragments that contain references within themselves. -.P -A back reference matches whatever actually matched the capturing subpattern in -the current subject string, rather than anything matching the subpattern -itself (see -.\" HTML -.\" -"Subpatterns as subroutines" -.\" -below for a way of doing that). So the pattern -.sp - (sens|respons)e and \e1ibility -.sp -matches "sense and sensibility" and "response and responsibility", but not -"sense and responsibility". If caseful matching is in force at the time of the -back reference, the case of letters is relevant. For example, -.sp - ((?i)rah)\es+\e1 -.sp -matches "rah rah" and "RAH RAH", but not "RAH rah", even though the original -capturing subpattern is matched caselessly. -.P -There are several different ways of writing back references to named -subpatterns. The .NET syntax \ek{name} and the Perl syntax \ek or -\ek'name' are supported, as is the Python syntax (?P=name). Perl 5.10's unified -back reference syntax, in which \eg can be used for both numeric and named -references, is also supported. We could rewrite the above example in any of -the following ways: -.sp - (?(?i)rah)\es+\ek - (?'p1'(?i)rah)\es+\ek{p1} - (?P(?i)rah)\es+(?P=p1) - (?(?i)rah)\es+\eg{p1} -.sp -A subpattern that is referenced by name may appear in the pattern before or -after the reference. -.P -There may be more than one back reference to the same subpattern. If a -subpattern has not actually been used in a particular match, any back -references to it always fail by default. For example, the pattern -.sp - (a|(bc))\e2 -.sp -always fails if it starts to match "a" rather than "bc". However, if the -PCRE_JAVASCRIPT_COMPAT option is set at compile time, a back reference to an -unset value matches an empty string. -.P -Because there may be many capturing parentheses in a pattern, all digits -following a backslash are taken as part of a potential back reference number. -If the pattern continues with a digit character, some delimiter must be used to -terminate the back reference. If the PCRE_EXTENDED option is set, this can be -white space. Otherwise, the \eg{ syntax or an empty comment (see -.\" HTML -.\" -"Comments" -.\" -below) can be used. -. -.SS "Recursive back references" -.rs -.sp -A back reference that occurs inside the parentheses to which it refers fails -when the subpattern is first used, so, for example, (a\e1) never matches. -However, such references can be useful inside repeated subpatterns. For -example, the pattern -.sp - (a|b\e1)+ -.sp -matches any number of "a"s and also "aba", "ababbaa" etc. At each iteration of -the subpattern, the back reference matches the character string corresponding -to the previous iteration. In order for this to work, the pattern must be such -that the first iteration does not need to match the back reference. This can be -done using alternation, as in the example above, or by a quantifier with a -minimum of zero. -.P -Back references of this type cause the group that they reference to be treated -as an -.\" HTML -.\" -atomic group. -.\" -Once the whole group has been matched, a subsequent matching failure cannot -cause backtracking into the middle of the group. -. -. -.\" HTML -.SH ASSERTIONS -.rs -.sp -An assertion is a test on the characters following or preceding the current -matching point that does not actually consume any characters. The simple -assertions coded as \eb, \eB, \eA, \eG, \eZ, \ez, ^ and $ are described -.\" HTML -.\" -above. -.\" -.P -More complicated assertions are coded as subpatterns. There are two kinds: -those that look ahead of the current position in the subject string, and those -that look behind it. An assertion subpattern is matched in the normal way, -except that it does not cause the current matching position to be changed. -.P -Assertion subpatterns are not capturing subpatterns. If such an assertion -contains capturing subpatterns within it, these are counted for the purposes of -numbering the capturing subpatterns in the whole pattern. However, substring -capturing is carried out only for positive assertions. (Perl sometimes, but not -always, does do capturing in negative assertions.) -.P -WARNING: If a positive assertion containing one or more capturing subpatterns -succeeds, but failure to match later in the pattern causes backtracking over -this assertion, the captures within the assertion are reset only if no higher -numbered captures are already set. This is, unfortunately, a fundamental -limitation of the current implementation, and as PCRE1 is now in -maintenance-only status, it is unlikely ever to change. -.P -For compatibility with Perl, assertion subpatterns may be repeated; though -it makes no sense to assert the same thing several times, the side effect of -capturing parentheses may occasionally be useful. In practice, there only three -cases: -.sp -(1) If the quantifier is {0}, the assertion is never obeyed during matching. -However, it may contain internal capturing parenthesized groups that are called -from elsewhere via the -.\" HTML -.\" -subroutine mechanism. -.\" -.sp -(2) If quantifier is {0,n} where n is greater than zero, it is treated as if it -were {0,1}. At run time, the rest of the pattern match is tried with and -without the assertion, the order depending on the greediness of the quantifier. -.sp -(3) If the minimum repetition is greater than zero, the quantifier is ignored. -The assertion is obeyed just once when encountered during matching. -. -. -.SS "Lookahead assertions" -.rs -.sp -Lookahead assertions start with (?= for positive assertions and (?! for -negative assertions. For example, -.sp - \ew+(?=;) -.sp -matches a word followed by a semicolon, but does not include the semicolon in -the match, and -.sp - foo(?!bar) -.sp -matches any occurrence of "foo" that is not followed by "bar". Note that the -apparently similar pattern -.sp - (?!foo)bar -.sp -does not find an occurrence of "bar" that is preceded by something other than -"foo"; it finds any occurrence of "bar" whatsoever, because the assertion -(?!foo) is always true when the next three characters are "bar". A -lookbehind assertion is needed to achieve the other effect. -.P -If you want to force a matching failure at some point in a pattern, the most -convenient way to do it is with (?!) because an empty string always matches, so -an assertion that requires there not to be an empty string must always fail. -The backtracking control verb (*FAIL) or (*F) is a synonym for (?!). -. -. -.\" HTML -.SS "Lookbehind assertions" -.rs -.sp -Lookbehind assertions start with (?<= for positive assertions and (? -.\" -(see above) -.\" -can be used instead of a lookbehind assertion to get round the fixed-length -restriction. -.P -The implementation of lookbehind assertions is, for each alternative, to -temporarily move the current position back by the fixed length and then try to -match. If there are insufficient characters before the current position, the -assertion fails. -.P -In a UTF mode, PCRE does not allow the \eC escape (which matches a single data -unit even in a UTF mode) to appear in lookbehind assertions, because it makes -it impossible to calculate the length of the lookbehind. The \eX and \eR -escapes, which can match different numbers of data units, are also not -permitted. -.P -.\" HTML -.\" -"Subroutine" -.\" -calls (see below) such as (?2) or (?&X) are permitted in lookbehinds, as long -as the subpattern matches a fixed-length string. -.\" HTML -.\" -Recursion, -.\" -however, is not supported. -.P -Possessive quantifiers can be used in conjunction with lookbehind assertions to -specify efficient matching of fixed-length strings at the end of subject -strings. Consider a simple pattern such as -.sp - abcd$ -.sp -when applied to a long string that does not match. Because matching proceeds -from left to right, PCRE will look for each "a" in the subject and then see if -what follows matches the rest of the pattern. If the pattern is specified as -.sp - ^.*abcd$ -.sp -the initial .* matches the entire string at first, but when this fails (because -there is no following "a"), it backtracks to match all but the last character, -then all but the last two characters, and so on. Once again the search for "a" -covers the entire string, from right to left, so we are no better off. However, -if the pattern is written as -.sp - ^.*+(?<=abcd) -.sp -there can be no backtracking for the .*+ item; it can match only the entire -string. The subsequent lookbehind assertion does a single test on the last four -characters. If it fails, the match fails immediately. For long strings, this -approach makes a significant difference to the processing time. -. -. -.SS "Using multiple assertions" -.rs -.sp -Several assertions (of any sort) may occur in succession. For example, -.sp - (?<=\ed{3})(? -.SH "CONDITIONAL SUBPATTERNS" -.rs -.sp -It is possible to cause the matching process to obey a subpattern -conditionally or to choose between two alternative subpatterns, depending on -the result of an assertion, or whether a specific capturing subpattern has -already been matched. The two possible forms of conditional subpattern are: -.sp - (?(condition)yes-pattern) - (?(condition)yes-pattern|no-pattern) -.sp -If the condition is satisfied, the yes-pattern is used; otherwise the -no-pattern (if present) is used. If there are more than two alternatives in the -subpattern, a compile-time error occurs. Each of the two alternatives may -itself contain nested subpatterns of any form, including conditional -subpatterns; the restriction to two alternatives applies only at the level of -the condition. This pattern fragment is an example where the alternatives are -complex: -.sp - (?(1) (A|B|C) | (D | (?(2)E|F) | E) ) -.sp -.P -There are four kinds of condition: references to subpatterns, references to -recursion, a pseudo-condition called DEFINE, and assertions. -. -.SS "Checking for a used subpattern by number" -.rs -.sp -If the text between the parentheses consists of a sequence of digits, the -condition is true if a capturing subpattern of that number has previously -matched. If there is more than one capturing subpattern with the same number -(see the earlier -.\" -.\" HTML -.\" -section about duplicate subpattern numbers), -.\" -the condition is true if any of them have matched. An alternative notation is -to precede the digits with a plus or minus sign. In this case, the subpattern -number is relative rather than absolute. The most recently opened parentheses -can be referenced by (?(-1), the next most recent by (?(-2), and so on. Inside -loops it can also make sense to refer to subsequent groups. The next -parentheses to be opened can be referenced as (?(+1), and so on. (The value -zero in any of these forms is not used; it provokes a compile-time error.) -.P -Consider the following pattern, which contains non-significant white space to -make it more readable (assume the PCRE_EXTENDED option) and to divide it into -three parts for ease of discussion: -.sp - ( \e( )? [^()]+ (?(1) \e) ) -.sp -The first part matches an optional opening parenthesis, and if that -character is present, sets it as the first captured substring. The second part -matches one or more characters that are not parentheses. The third part is a -conditional subpattern that tests whether or not the first set of parentheses -matched. If they did, that is, if subject started with an opening parenthesis, -the condition is true, and so the yes-pattern is executed and a closing -parenthesis is required. Otherwise, since no-pattern is not present, the -subpattern matches nothing. In other words, this pattern matches a sequence of -non-parentheses, optionally enclosed in parentheses. -.P -If you were embedding this pattern in a larger one, you could use a relative -reference: -.sp - ...other stuff... ( \e( )? [^()]+ (?(-1) \e) ) ... -.sp -This makes the fragment independent of the parentheses in the larger pattern. -. -.SS "Checking for a used subpattern by name" -.rs -.sp -Perl uses the syntax (?()...) or (?('name')...) to test for a used -subpattern by name. For compatibility with earlier versions of PCRE, which had -this facility before Perl, the syntax (?(name)...) is also recognized. -.P -Rewriting the above example to use a named subpattern gives this: -.sp - (? \e( )? [^()]+ (?() \e) ) -.sp -If the name used in a condition of this kind is a duplicate, the test is -applied to all subpatterns of the same name, and is true if any one of them has -matched. -. -.SS "Checking for pattern recursion" -.rs -.sp -If the condition is the string (R), and there is no subpattern with the name R, -the condition is true if a recursive call to the whole pattern or any -subpattern has been made. If digits or a name preceded by ampersand follow the -letter R, for example: -.sp - (?(R3)...) or (?(R&name)...) -.sp -the condition is true if the most recent recursion is into a subpattern whose -number or name is given. This condition does not check the entire recursion -stack. If the name used in a condition of this kind is a duplicate, the test is -applied to all subpatterns of the same name, and is true if any one of them is -the most recent recursion. -.P -At "top level", all these recursion test conditions are false. -.\" HTML -.\" -The syntax for recursive patterns -.\" -is described below. -. -.\" HTML -.SS "Defining subpatterns for use by reference only" -.rs -.sp -If the condition is the string (DEFINE), and there is no subpattern with the -name DEFINE, the condition is always false. In this case, there may be only one -alternative in the subpattern. It is always skipped if control reaches this -point in the pattern; the idea of DEFINE is that it can be used to define -subroutines that can be referenced from elsewhere. (The use of -.\" HTML -.\" -subroutines -.\" -is described below.) For example, a pattern to match an IPv4 address such as -"192.168.23.245" could be written like this (ignore white space and line -breaks): -.sp - (?(DEFINE) (? 2[0-4]\ed | 25[0-5] | 1\ed\ed | [1-9]?\ed) ) - \eb (?&byte) (\e.(?&byte)){3} \eb -.sp -The first part of the pattern is a DEFINE group inside which a another group -named "byte" is defined. This matches an individual component of an IPv4 -address (a number less than 256). When matching takes place, this part of the -pattern is skipped because DEFINE acts like a false condition. The rest of the -pattern uses references to the named group to match the four dot-separated -components of an IPv4 address, insisting on a word boundary at each end. -. -.SS "Assertion conditions" -.rs -.sp -If the condition is not in any of the above formats, it must be an assertion. -This may be a positive or negative lookahead or lookbehind assertion. Consider -this pattern, again containing non-significant white space, and with the two -alternatives on the second line: -.sp - (?(?=[^a-z]*[a-z]) - \ed{2}-[a-z]{3}-\ed{2} | \ed{2}-\ed{2}-\ed{2} ) -.sp -The condition is a positive lookahead assertion that matches an optional -sequence of non-letters followed by a letter. In other words, it tests for the -presence of at least one letter in the subject. If a letter is found, the -subject is matched against the first alternative; otherwise it is matched -against the second. This pattern matches strings in one of the two forms -dd-aaa-dd or dd-dd-dd, where aaa are letters and dd are digits. -. -. -.\" HTML -.SH COMMENTS -.rs -.sp -There are two ways of including comments in patterns that are processed by -PCRE. In both cases, the start of the comment must not be in a character class, -nor in the middle of any other sequence of related characters such as (?: or a -subpattern name or number. The characters that make up a comment play no part -in the pattern matching. -.P -The sequence (?# marks the start of a comment that continues up to the next -closing parenthesis. Nested parentheses are not permitted. If the PCRE_EXTENDED -option is set, an unescaped # character also introduces a comment, which in -this case continues to immediately after the next newline character or -character sequence in the pattern. Which characters are interpreted as newlines -is controlled by the options passed to a compiling function or by a special -sequence at the start of the pattern, as described in the section entitled -.\" HTML -.\" -"Newline conventions" -.\" -above. Note that the end of this type of comment is a literal newline sequence -in the pattern; escape sequences that happen to represent a newline do not -count. For example, consider this pattern when PCRE_EXTENDED is set, and the -default newline convention is in force: -.sp - abc #comment \en still comment -.sp -On encountering the # character, \fBpcre_compile()\fP skips along, looking for -a newline in the pattern. The sequence \en is still literal at this stage, so -it does not terminate the comment. Only an actual character with the code value -0x0a (the default newline) does so. -. -. -.\" HTML -.SH "RECURSIVE PATTERNS" -.rs -.sp -Consider the problem of matching a string in parentheses, allowing for -unlimited nested parentheses. Without the use of recursion, the best that can -be done is to use a pattern that matches up to some fixed depth of nesting. It -is not possible to handle an arbitrary nesting depth. -.P -For some time, Perl has provided a facility that allows regular expressions to -recurse (amongst other things). It does this by interpolating Perl code in the -expression at run time, and the code can refer to the expression itself. A Perl -pattern using code interpolation to solve the parentheses problem can be -created like this: -.sp - $re = qr{\e( (?: (?>[^()]+) | (?p{$re}) )* \e)}x; -.sp -The (?p{...}) item interpolates Perl code at run time, and in this case refers -recursively to the pattern in which it appears. -.P -Obviously, PCRE cannot support the interpolation of Perl code. Instead, it -supports special syntax for recursion of the entire pattern, and also for -individual subpattern recursion. After its introduction in PCRE and Python, -this kind of recursion was subsequently introduced into Perl at release 5.10. -.P -A special item that consists of (? followed by a number greater than zero and a -closing parenthesis is a recursive subroutine call of the subpattern of the -given number, provided that it occurs inside that subpattern. (If not, it is a -.\" HTML -.\" -non-recursive subroutine -.\" -call, which is described in the next section.) The special item (?R) or (?0) is -a recursive call of the entire regular expression. -.P -This PCRE pattern solves the nested parentheses problem (assume the -PCRE_EXTENDED option is set so that white space is ignored): -.sp - \e( ( [^()]++ | (?R) )* \e) -.sp -First it matches an opening parenthesis. Then it matches any number of -substrings which can either be a sequence of non-parentheses, or a recursive -match of the pattern itself (that is, a correctly parenthesized substring). -Finally there is a closing parenthesis. Note the use of a possessive quantifier -to avoid backtracking into sequences of non-parentheses. -.P -If this were part of a larger pattern, you would not want to recurse the entire -pattern, so instead you could use this: -.sp - ( \e( ( [^()]++ | (?1) )* \e) ) -.sp -We have put the pattern into parentheses, and caused the recursion to refer to -them instead of the whole pattern. -.P -In a larger pattern, keeping track of parenthesis numbers can be tricky. This -is made easier by the use of relative references. Instead of (?1) in the -pattern above you can write (?-2) to refer to the second most recently opened -parentheses preceding the recursion. In other words, a negative number counts -capturing parentheses leftwards from the point at which it is encountered. -.P -It is also possible to refer to subsequently opened parentheses, by writing -references such as (?+2). However, these cannot be recursive because the -reference is not inside the parentheses that are referenced. They are always -.\" HTML -.\" -non-recursive subroutine -.\" -calls, as described in the next section. -.P -An alternative approach is to use named parentheses instead. The Perl syntax -for this is (?&name); PCRE's earlier syntax (?P>name) is also supported. We -could rewrite the above example as follows: -.sp - (? \e( ( [^()]++ | (?&pn) )* \e) ) -.sp -If there is more than one subpattern with the same name, the earliest one is -used. -.P -This particular example pattern that we have been looking at contains nested -unlimited repeats, and so the use of a possessive quantifier for matching -strings of non-parentheses is important when applying the pattern to strings -that do not match. For example, when this pattern is applied to -.sp - (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa() -.sp -it yields "no match" quickly. However, if a possessive quantifier is not used, -the match runs for a very long time indeed because there are so many different -ways the + and * repeats can carve up the subject, and all have to be tested -before failure can be reported. -.P -At the end of a match, the values of capturing parentheses are those from -the outermost level. If you want to obtain intermediate values, a callout -function can be used (see below and the -.\" HREF -\fBpcrecallout\fP -.\" -documentation). If the pattern above is matched against -.sp - (ab(cd)ef) -.sp -the value for the inner capturing parentheses (numbered 2) is "ef", which is -the last value taken on at the top level. If a capturing subpattern is not -matched at the top level, its final captured value is unset, even if it was -(temporarily) set at a deeper level during the matching process. -.P -If there are more than 15 capturing parentheses in a pattern, PCRE has to -obtain extra memory to store data during a recursion, which it does by using -\fBpcre_malloc\fP, freeing it via \fBpcre_free\fP afterwards. If no memory can -be obtained, the match fails with the PCRE_ERROR_NOMEMORY error. -.P -Do not confuse the (?R) item with the condition (R), which tests for recursion. -Consider this pattern, which matches text in angle brackets, allowing for -arbitrary nesting. Only digits are allowed in nested brackets (that is, when -recursing), whereas any characters are permitted at the outer level. -.sp - < (?: (?(R) \ed++ | [^<>]*+) | (?R)) * > -.sp -In this pattern, (?(R) is the start of a conditional subpattern, with two -different alternatives for the recursive and non-recursive cases. The (?R) item -is the actual recursive call. -. -. -.\" HTML -.SS "Differences in recursion processing between PCRE and Perl" -.rs -.sp -Recursion processing in PCRE differs from Perl in two important ways. In PCRE -(like Python, but unlike Perl), a recursive subpattern call is always treated -as an atomic group. That is, once it has matched some of the subject string, it -is never re-entered, even if it contains untried alternatives and there is a -subsequent matching failure. This can be illustrated by the following pattern, -which purports to match a palindromic string that contains an odd number of -characters (for example, "a", "aba", "abcba", "abcdcba"): -.sp - ^(.|(.)(?1)\e2)$ -.sp -The idea is that it either matches a single character, or two identical -characters surrounding a sub-palindrome. In Perl, this pattern works; in PCRE -it does not if the pattern is longer than three characters. Consider the -subject string "abcba": -.P -At the top level, the first character is matched, but as it is not at the end -of the string, the first alternative fails; the second alternative is taken -and the recursion kicks in. The recursive call to subpattern 1 successfully -matches the next character ("b"). (Note that the beginning and end of line -tests are not part of the recursion). -.P -Back at the top level, the next character ("c") is compared with what -subpattern 2 matched, which was "a". This fails. Because the recursion is -treated as an atomic group, there are now no backtracking points, and so the -entire match fails. (Perl is able, at this point, to re-enter the recursion and -try the second alternative.) However, if the pattern is written with the -alternatives in the other order, things are different: -.sp - ^((.)(?1)\e2|.)$ -.sp -This time, the recursing alternative is tried first, and continues to recurse -until it runs out of characters, at which point the recursion fails. But this -time we do have another alternative to try at the higher level. That is the big -difference: in the previous case the remaining alternative is at a deeper -recursion level, which PCRE cannot use. -.P -To change the pattern so that it matches all palindromic strings, not just -those with an odd number of characters, it is tempting to change the pattern to -this: -.sp - ^((.)(?1)\e2|.?)$ -.sp -Again, this works in Perl, but not in PCRE, and for the same reason. When a -deeper recursion has matched a single character, it cannot be entered again in -order to match an empty string. The solution is to separate the two cases, and -write out the odd and even cases as alternatives at the higher level: -.sp - ^(?:((.)(?1)\e2|)|((.)(?3)\e4|.)) -.sp -If you want to match typical palindromic phrases, the pattern has to ignore all -non-word characters, which can be done like this: -.sp - ^\eW*+(?:((.)\eW*+(?1)\eW*+\e2|)|((.)\eW*+(?3)\eW*+\e4|\eW*+.\eW*+))\eW*+$ -.sp -If run with the PCRE_CASELESS option, this pattern matches phrases such as "A -man, a plan, a canal: Panama!" and it works well in both PCRE and Perl. Note -the use of the possessive quantifier *+ to avoid backtracking into sequences of -non-word characters. Without this, PCRE takes a great deal longer (ten times or -more) to match typical phrases, and Perl takes so long that you think it has -gone into a loop. -.P -\fBWARNING\fP: The palindrome-matching patterns above work only if the subject -string does not start with a palindrome that is shorter than the entire string. -For example, although "abcba" is correctly matched, if the subject is "ababa", -PCRE finds the palindrome "aba" at the start, then fails at top level because -the end of the string does not follow. Once again, it cannot jump back into the -recursion to try other alternatives, so the entire match fails. -.P -The second way in which PCRE and Perl differ in their recursion processing is -in the handling of captured values. In Perl, when a subpattern is called -recursively or as a subpattern (see the next section), it has no access to any -values that were captured outside the recursion, whereas in PCRE these values -can be referenced. Consider this pattern: -.sp - ^(.)(\e1|a(?2)) -.sp -In PCRE, this pattern matches "bab". The first capturing parentheses match "b", -then in the second group, when the back reference \e1 fails to match "b", the -second alternative matches "a" and then recurses. In the recursion, \e1 does -now match "b" and so the whole match succeeds. In Perl, the pattern fails to -match because inside the recursive call \e1 cannot access the externally set -value. -. -. -.\" HTML -.SH "SUBPATTERNS AS SUBROUTINES" -.rs -.sp -If the syntax for a recursive subpattern call (either by number or by -name) is used outside the parentheses to which it refers, it operates like a -subroutine in a programming language. The called subpattern may be defined -before or after the reference. A numbered reference can be absolute or -relative, as in these examples: -.sp - (...(absolute)...)...(?2)... - (...(relative)...)...(?-1)... - (...(?+1)...(relative)... -.sp -An earlier example pointed out that the pattern -.sp - (sens|respons)e and \e1ibility -.sp -matches "sense and sensibility" and "response and responsibility", but not -"sense and responsibility". If instead the pattern -.sp - (sens|respons)e and (?1)ibility -.sp -is used, it does match "sense and responsibility" as well as the other two -strings. Another example is given in the discussion of DEFINE above. -.P -All subroutine calls, whether recursive or not, are always treated as atomic -groups. That is, once a subroutine has matched some of the subject string, it -is never re-entered, even if it contains untried alternatives and there is a -subsequent matching failure. Any capturing parentheses that are set during the -subroutine call revert to their previous values afterwards. -.P -Processing options such as case-independence are fixed when a subpattern is -defined, so if it is used as a subroutine, such options cannot be changed for -different calls. For example, consider this pattern: -.sp - (abc)(?i:(?-1)) -.sp -It matches "abcabc". It does not match "abcABC" because the change of -processing option does not affect the called subpattern. -. -. -.\" HTML -.SH "ONIGURUMA SUBROUTINE SYNTAX" -.rs -.sp -For compatibility with Oniguruma, the non-Perl syntax \eg followed by a name or -a number enclosed either in angle brackets or single quotes, is an alternative -syntax for referencing a subpattern as a subroutine, possibly recursively. Here -are two of the examples used above, rewritten using this syntax: -.sp - (? \e( ( (?>[^()]+) | \eg )* \e) ) - (sens|respons)e and \eg'1'ibility -.sp -PCRE supports an extension to Oniguruma: if a number is preceded by a -plus or a minus sign it is taken as a relative reference. For example: -.sp - (abc)(?i:\eg<-1>) -.sp -Note that \eg{...} (Perl syntax) and \eg<...> (Oniguruma syntax) are \fInot\fP -synonymous. The former is a back reference; the latter is a subroutine call. -. -. -.SH CALLOUTS -.rs -.sp -Perl has a feature whereby using the sequence (?{...}) causes arbitrary Perl -code to be obeyed in the middle of matching a regular expression. This makes it -possible, amongst other things, to extract different substrings that match the -same pair of parentheses when there is a repetition. -.P -PCRE provides a similar feature, but of course it cannot obey arbitrary Perl -code. The feature is called "callout". The caller of PCRE provides an external -function by putting its entry point in the global variable \fIpcre_callout\fP -(8-bit library) or \fIpcre[16|32]_callout\fP (16-bit or 32-bit library). -By default, this variable contains NULL, which disables all calling out. -.P -Within a regular expression, (?C) indicates the points at which the external -function is to be called. If you want to identify different callout points, you -can put a number less than 256 after the letter C. The default value is zero. -For example, this pattern has two callout points: -.sp - (?C1)abc(?C2)def -.sp -If the PCRE_AUTO_CALLOUT flag is passed to a compiling function, callouts are -automatically installed before each item in the pattern. They are all numbered -255. If there is a conditional group in the pattern whose condition is an -assertion, an additional callout is inserted just before the condition. An -explicit callout may also be set at this position, as in this example: -.sp - (?(?C9)(?=a)abc|def) -.sp -Note that this applies only to assertion conditions, not to other types of -condition. -.P -During matching, when PCRE reaches a callout point, the external function is -called. It is provided with the number of the callout, the position in the -pattern, and, optionally, one item of data originally supplied by the caller of -the matching function. The callout function may cause matching to proceed, to -backtrack, or to fail altogether. -.P -By default, PCRE implements a number of optimizations at compile time and -matching time, and one side-effect is that sometimes callouts are skipped. If -you need all possible callouts to happen, you need to set options that disable -the relevant optimizations. More details, and a complete description of the -interface to the callout function, are given in the -.\" HREF -\fBpcrecallout\fP -.\" -documentation. -. -. -.\" HTML -.SH "BACKTRACKING CONTROL" -.rs -.sp -Perl 5.10 introduced a number of "Special Backtracking Control Verbs", which -are still described in the Perl documentation as "experimental and subject to -change or removal in a future version of Perl". It goes on to say: "Their usage -in production code should be noted to avoid problems during upgrades." The same -remarks apply to the PCRE features described in this section. -.P -The new verbs make use of what was previously invalid syntax: an opening -parenthesis followed by an asterisk. They are generally of the form -(*VERB) or (*VERB:NAME). Some may take either form, possibly behaving -differently depending on whether or not a name is present. A name is any -sequence of characters that does not include a closing parenthesis. The maximum -length of name is 255 in the 8-bit library and 65535 in the 16-bit and 32-bit -libraries. If the name is empty, that is, if the closing parenthesis -immediately follows the colon, the effect is as if the colon were not there. -Any number of these verbs may occur in a pattern. -.P -Since these verbs are specifically related to backtracking, most of them can be -used only when the pattern is to be matched using one of the traditional -matching functions, because these use a backtracking algorithm. With the -exception of (*FAIL), which behaves like a failing negative assertion, the -backtracking control verbs cause an error if encountered by a DFA matching -function. -.P -The behaviour of these verbs in -.\" HTML -.\" -repeated groups, -.\" -.\" HTML -.\" -assertions, -.\" -and in -.\" HTML -.\" -subpatterns called as subroutines -.\" -(whether or not recursively) is documented below. -. -. -.\" HTML -.SS "Optimizations that affect backtracking verbs" -.rs -.sp -PCRE contains some optimizations that are used to speed up matching by running -some checks at the start of each match attempt. For example, it may know the -minimum length of matching subject, or that a particular character must be -present. When one of these optimizations bypasses the running of a match, any -included backtracking verbs will not, of course, be processed. You can suppress -the start-of-match optimizations by setting the PCRE_NO_START_OPTIMIZE option -when calling \fBpcre_compile()\fP or \fBpcre_exec()\fP, or by starting the -pattern with (*NO_START_OPT). There is more discussion of this option in the -section entitled -.\" HTML -.\" -"Option bits for \fBpcre_exec()\fP" -.\" -in the -.\" HREF -\fBpcreapi\fP -.\" -documentation. -.P -Experiments with Perl suggest that it too has similar optimizations, sometimes -leading to anomalous results. -. -. -.SS "Verbs that act immediately" -.rs -.sp -The following verbs act as soon as they are encountered. They may not be -followed by a name. -.sp - (*ACCEPT) -.sp -This verb causes the match to end successfully, skipping the remainder of the -pattern. However, when it is inside a subpattern that is called as a -subroutine, only that subpattern is ended successfully. Matching then continues -at the outer level. If (*ACCEPT) in triggered in a positive assertion, the -assertion succeeds; in a negative assertion, the assertion fails. -.P -If (*ACCEPT) is inside capturing parentheses, the data so far is captured. For -example: -.sp - A((?:A|B(*ACCEPT)|C)D) -.sp -This matches "AB", "AAD", or "ACD"; when it matches "AB", "B" is captured by -the outer parentheses. -.sp - (*FAIL) or (*F) -.sp -This verb causes a matching failure, forcing backtracking to occur. It is -equivalent to (?!) but easier to read. The Perl documentation notes that it is -probably useful only when combined with (?{}) or (??{}). Those are, of course, -Perl features that are not present in PCRE. The nearest equivalent is the -callout feature, as for example in this pattern: -.sp - a+(?C)(*FAIL) -.sp -A match with the string "aaaa" always fails, but the callout is taken before -each backtrack happens (in this example, 10 times). -. -. -.SS "Recording which path was taken" -.rs -.sp -There is one verb whose main purpose is to track how a match was arrived at, -though it also has a secondary use in conjunction with advancing the match -starting point (see (*SKIP) below). -.sp - (*MARK:NAME) or (*:NAME) -.sp -A name is always required with this verb. There may be as many instances of -(*MARK) as you like in a pattern, and their names do not have to be unique. -.P -When a match succeeds, the name of the last-encountered (*MARK:NAME), -(*PRUNE:NAME), or (*THEN:NAME) on the matching path is passed back to the -caller as described in the section entitled -.\" HTML -.\" -"Extra data for \fBpcre_exec()\fP" -.\" -in the -.\" HREF -\fBpcreapi\fP -.\" -documentation. Here is an example of \fBpcretest\fP output, where the /K -modifier requests the retrieval and outputting of (*MARK) data: -.sp - re> /X(*MARK:A)Y|X(*MARK:B)Z/K - data> XY - 0: XY - MK: A - XZ - 0: XZ - MK: B -.sp -The (*MARK) name is tagged with "MK:" in this output, and in this example it -indicates which of the two alternatives matched. This is a more efficient way -of obtaining this information than putting each alternative in its own -capturing parentheses. -.P -If a verb with a name is encountered in a positive assertion that is true, the -name is recorded and passed back if it is the last-encountered. This does not -happen for negative assertions or failing positive assertions. -.P -After a partial match or a failed match, the last encountered name in the -entire match process is returned. For example: -.sp - re> /X(*MARK:A)Y|X(*MARK:B)Z/K - data> XP - No match, mark = B -.sp -Note that in this unanchored example the mark is retained from the match -attempt that started at the letter "X" in the subject. Subsequent match -attempts starting at "P" and then with an empty string do not get as far as the -(*MARK) item, but nevertheless do not reset it. -.P -If you are interested in (*MARK) values after failed matches, you should -probably set the PCRE_NO_START_OPTIMIZE option -.\" HTML -.\" -(see above) -.\" -to ensure that the match is always attempted. -. -. -.SS "Verbs that act after backtracking" -.rs -.sp -The following verbs do nothing when they are encountered. Matching continues -with what follows, but if there is no subsequent match, causing a backtrack to -the verb, a failure is forced. That is, backtracking cannot pass to the left of -the verb. However, when one of these verbs appears inside an atomic group or an -assertion that is true, its effect is confined to that group, because once the -group has been matched, there is never any backtracking into it. In this -situation, backtracking can "jump back" to the left of the entire atomic group -or assertion. (Remember also, as stated above, that this localization also -applies in subroutine calls.) -.P -These verbs differ in exactly what kind of failure occurs when backtracking -reaches them. The behaviour described below is what happens when the verb is -not in a subroutine or an assertion. Subsequent sections cover these special -cases. -.sp - (*COMMIT) -.sp -This verb, which may not be followed by a name, causes the whole match to fail -outright if there is a later matching failure that causes backtracking to reach -it. Even if the pattern is unanchored, no further attempts to find a match by -advancing the starting point take place. If (*COMMIT) is the only backtracking -verb that is encountered, once it has been passed \fBpcre_exec()\fP is -committed to finding a match at the current starting point, or not at all. For -example: -.sp - a+(*COMMIT)b -.sp -This matches "xxaab" but not "aacaab". It can be thought of as a kind of -dynamic anchor, or "I've started, so I must finish." The name of the most -recently passed (*MARK) in the path is passed back when (*COMMIT) forces a -match failure. -.P -If there is more than one backtracking verb in a pattern, a different one that -follows (*COMMIT) may be triggered first, so merely passing (*COMMIT) during a -match does not always guarantee that a match must be at this starting point. -.P -Note that (*COMMIT) at the start of a pattern is not the same as an anchor, -unless PCRE's start-of-match optimizations are turned off, as shown in this -output from \fBpcretest\fP: -.sp - re> /(*COMMIT)abc/ - data> xyzabc - 0: abc - data> xyzabc\eY - No match -.sp -For this pattern, PCRE knows that any match must start with "a", so the -optimization skips along the subject to "a" before applying the pattern to the -first set of data. The match attempt then succeeds. In the second set of data, -the escape sequence \eY is interpreted by the \fBpcretest\fP program. It causes -the PCRE_NO_START_OPTIMIZE option to be set when \fBpcre_exec()\fP is called. -This disables the optimization that skips along to the first character. The -pattern is now applied starting at "x", and so the (*COMMIT) causes the match -to fail without trying any other starting points. -.sp - (*PRUNE) or (*PRUNE:NAME) -.sp -This verb causes the match to fail at the current starting position in the -subject if there is a later matching failure that causes backtracking to reach -it. If the pattern is unanchored, the normal "bumpalong" advance to the next -starting character then happens. Backtracking can occur as usual to the left of -(*PRUNE), before it is reached, or when matching to the right of (*PRUNE), but -if there is no match to the right, backtracking cannot cross (*PRUNE). In -simple cases, the use of (*PRUNE) is just an alternative to an atomic group or -possessive quantifier, but there are some uses of (*PRUNE) that cannot be -expressed in any other way. In an anchored pattern (*PRUNE) has the same effect -as (*COMMIT). -.P -The behaviour of (*PRUNE:NAME) is the not the same as (*MARK:NAME)(*PRUNE). -It is like (*MARK:NAME) in that the name is remembered for passing back to the -caller. However, (*SKIP:NAME) searches only for names set with (*MARK). -.sp - (*SKIP) -.sp -This verb, when given without a name, is like (*PRUNE), except that if the -pattern is unanchored, the "bumpalong" advance is not to the next character, -but to the position in the subject where (*SKIP) was encountered. (*SKIP) -signifies that whatever text was matched leading up to it cannot be part of a -successful match. Consider: -.sp - a+(*SKIP)b -.sp -If the subject is "aaaac...", after the first match attempt fails (starting at -the first character in the string), the starting point skips on to start the -next attempt at "c". Note that a possessive quantifer does not have the same -effect as this example; although it would suppress backtracking during the -first match attempt, the second attempt would start at the second character -instead of skipping on to "c". -.sp - (*SKIP:NAME) -.sp -When (*SKIP) has an associated name, its behaviour is modified. When it is -triggered, the previous path through the pattern is searched for the most -recent (*MARK) that has the same name. If one is found, the "bumpalong" advance -is to the subject position that corresponds to that (*MARK) instead of to where -(*SKIP) was encountered. If no (*MARK) with a matching name is found, the -(*SKIP) is ignored. -.P -Note that (*SKIP:NAME) searches only for names set by (*MARK:NAME). It ignores -names that are set by (*PRUNE:NAME) or (*THEN:NAME). -.sp - (*THEN) or (*THEN:NAME) -.sp -This verb causes a skip to the next innermost alternative when backtracking -reaches it. That is, it cancels any further backtracking within the current -alternative. Its name comes from the observation that it can be used for a -pattern-based if-then-else block: -.sp - ( COND1 (*THEN) FOO | COND2 (*THEN) BAR | COND3 (*THEN) BAZ ) ... -.sp -If the COND1 pattern matches, FOO is tried (and possibly further items after -the end of the group if FOO succeeds); on failure, the matcher skips to the -second alternative and tries COND2, without backtracking into COND1. If that -succeeds and BAR fails, COND3 is tried. If subsequently BAZ fails, there are no -more alternatives, so there is a backtrack to whatever came before the entire -group. If (*THEN) is not inside an alternation, it acts like (*PRUNE). -.P -The behaviour of (*THEN:NAME) is the not the same as (*MARK:NAME)(*THEN). -It is like (*MARK:NAME) in that the name is remembered for passing back to the -caller. However, (*SKIP:NAME) searches only for names set with (*MARK). -.P -A subpattern that does not contain a | character is just a part of the -enclosing alternative; it is not a nested alternation with only one -alternative. The effect of (*THEN) extends beyond such a subpattern to the -enclosing alternative. Consider this pattern, where A, B, etc. are complex -pattern fragments that do not contain any | characters at this level: -.sp - A (B(*THEN)C) | D -.sp -If A and B are matched, but there is a failure in C, matching does not -backtrack into A; instead it moves to the next alternative, that is, D. -However, if the subpattern containing (*THEN) is given an alternative, it -behaves differently: -.sp - A (B(*THEN)C | (*FAIL)) | D -.sp -The effect of (*THEN) is now confined to the inner subpattern. After a failure -in C, matching moves to (*FAIL), which causes the whole subpattern to fail -because there are no more alternatives to try. In this case, matching does now -backtrack into A. -.P -Note that a conditional subpattern is not considered as having two -alternatives, because only one is ever used. In other words, the | character in -a conditional subpattern has a different meaning. Ignoring white space, -consider: -.sp - ^.*? (?(?=a) a | b(*THEN)c ) -.sp -If the subject is "ba", this pattern does not match. Because .*? is ungreedy, -it initially matches zero characters. The condition (?=a) then fails, the -character "b" is matched, but "c" is not. At this point, matching does not -backtrack to .*? as might perhaps be expected from the presence of the | -character. The conditional subpattern is part of the single alternative that -comprises the whole pattern, and so the match fails. (If there was a backtrack -into .*?, allowing it to match "b", the match would succeed.) -.P -The verbs just described provide four different "strengths" of control when -subsequent matching fails. (*THEN) is the weakest, carrying on the match at the -next alternative. (*PRUNE) comes next, failing the match at the current -starting position, but allowing an advance to the next character (for an -unanchored pattern). (*SKIP) is similar, except that the advance may be more -than one character. (*COMMIT) is the strongest, causing the entire match to -fail. -. -. -.SS "More than one backtracking verb" -.rs -.sp -If more than one backtracking verb is present in a pattern, the one that is -backtracked onto first acts. For example, consider this pattern, where A, B, -etc. are complex pattern fragments: -.sp - (A(*COMMIT)B(*THEN)C|ABD) -.sp -If A matches but B fails, the backtrack to (*COMMIT) causes the entire match to -fail. However, if A and B match, but C fails, the backtrack to (*THEN) causes -the next alternative (ABD) to be tried. This behaviour is consistent, but is -not always the same as Perl's. It means that if two or more backtracking verbs -appear in succession, all the the last of them has no effect. Consider this -example: -.sp - ...(*COMMIT)(*PRUNE)... -.sp -If there is a matching failure to the right, backtracking onto (*PRUNE) causes -it to be triggered, and its action is taken. There can never be a backtrack -onto (*COMMIT). -. -. -.\" HTML -.SS "Backtracking verbs in repeated groups" -.rs -.sp -PCRE differs from Perl in its handling of backtracking verbs in repeated -groups. For example, consider: -.sp - /(a(*COMMIT)b)+ac/ -.sp -If the subject is "abac", Perl matches, but PCRE fails because the (*COMMIT) in -the second repeat of the group acts. -. -. -.\" HTML -.SS "Backtracking verbs in assertions" -.rs -.sp -(*FAIL) in an assertion has its normal effect: it forces an immediate backtrack. -.P -(*ACCEPT) in a positive assertion causes the assertion to succeed without any -further processing. In a negative assertion, (*ACCEPT) causes the assertion to -fail without any further processing. -.P -The other backtracking verbs are not treated specially if they appear in a -positive assertion. In particular, (*THEN) skips to the next alternative in the -innermost enclosing group that has alternations, whether or not this is within -the assertion. -.P -Negative assertions are, however, different, in order to ensure that changing a -positive assertion into a negative assertion changes its result. Backtracking -into (*COMMIT), (*SKIP), or (*PRUNE) causes a negative assertion to be true, -without considering any further alternative branches in the assertion. -Backtracking into (*THEN) causes it to skip to the next enclosing alternative -within the assertion (the normal behaviour), but if the assertion does not have -such an alternative, (*THEN) behaves like (*PRUNE). -. -. -.\" HTML -.SS "Backtracking verbs in subroutines" -.rs -.sp -These behaviours occur whether or not the subpattern is called recursively. -Perl's treatment of subroutines is different in some cases. -.P -(*FAIL) in a subpattern called as a subroutine has its normal effect: it forces -an immediate backtrack. -.P -(*ACCEPT) in a subpattern called as a subroutine causes the subroutine match to -succeed without any further processing. Matching then continues after the -subroutine call. -.P -(*COMMIT), (*SKIP), and (*PRUNE) in a subpattern called as a subroutine cause -the subroutine match to fail. -.P -(*THEN) skips to the next alternative in the innermost enclosing group within -the subpattern that has alternatives. If there is no such group within the -subpattern, (*THEN) causes the subroutine match to fail. -. -. -.SH "SEE ALSO" -.rs -.sp -\fBpcreapi\fP(3), \fBpcrecallout\fP(3), \fBpcrematching\fP(3), -\fBpcresyntax\fP(3), \fBpcre\fP(3), \fBpcre16(3)\fP, \fBpcre32(3)\fP. -. -. -.SH AUTHOR -.rs -.sp -.nf -Philip Hazel -University Computing Service -Cambridge CB2 3QH, England. -.fi -. -. -.SH REVISION -.rs -.sp -.nf -Last updated: 23 October 2016 -Copyright (c) 1997-2016 University of Cambridge. -.fi diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcreperform.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcreperform.3 deleted file mode 100644 index fb2aa959..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcreperform.3 +++ /dev/null @@ -1,177 +0,0 @@ -.TH PCREPERFORM 3 "09 January 2012" "PCRE 8.30" -.SH NAME -PCRE - Perl-compatible regular expressions -.SH "PCRE PERFORMANCE" -.rs -.sp -Two aspects of performance are discussed below: memory usage and processing -time. The way you express your pattern as a regular expression can affect both -of them. -. -.SH "COMPILED PATTERN MEMORY USAGE" -.rs -.sp -Patterns are compiled by PCRE into a reasonably efficient interpretive code, so -that most simple patterns do not use much memory. However, there is one case -where the memory usage of a compiled pattern can be unexpectedly large. If a -parenthesized subpattern has a quantifier with a minimum greater than 1 and/or -a limited maximum, the whole subpattern is repeated in the compiled code. For -example, the pattern -.sp - (abc|def){2,4} -.sp -is compiled as if it were -.sp - (abc|def)(abc|def)((abc|def)(abc|def)?)? -.sp -(Technical aside: It is done this way so that backtrack points within each of -the repetitions can be independently maintained.) -.P -For regular expressions whose quantifiers use only small numbers, this is not -usually a problem. However, if the numbers are large, and particularly if such -repetitions are nested, the memory usage can become an embarrassment. For -example, the very simple pattern -.sp - ((ab){1,1000}c){1,3} -.sp -uses 51K bytes when compiled using the 8-bit library. When PCRE is compiled -with its default internal pointer size of two bytes, the size limit on a -compiled pattern is 64K data units, and this is reached with the above pattern -if the outer repetition is increased from 3 to 4. PCRE can be compiled to use -larger internal pointers and thus handle larger compiled patterns, but it is -better to try to rewrite your pattern to use less memory if you can. -.P -One way of reducing the memory usage for such patterns is to make use of PCRE's -.\" HTML -.\" -"subroutine" -.\" -facility. Re-writing the above pattern as -.sp - ((ab)(?2){0,999}c)(?1){0,2} -.sp -reduces the memory requirements to 18K, and indeed it remains under 20K even -with the outer repetition increased to 100. However, this pattern is not -exactly equivalent, because the "subroutine" calls are treated as -.\" HTML -.\" -atomic groups -.\" -into which there can be no backtracking if there is a subsequent matching -failure. Therefore, PCRE cannot do this kind of rewriting automatically. -Furthermore, there is a noticeable loss of speed when executing the modified -pattern. Nevertheless, if the atomic grouping is not a problem and the loss of -speed is acceptable, this kind of rewriting will allow you to process patterns -that PCRE cannot otherwise handle. -. -. -.SH "STACK USAGE AT RUN TIME" -.rs -.sp -When \fBpcre_exec()\fP or \fBpcre[16|32]_exec()\fP is used for matching, certain -kinds of pattern can cause it to use large amounts of the process stack. In -some environments the default process stack is quite small, and if it runs out -the result is often SIGSEGV. This issue is probably the most frequently raised -problem with PCRE. Rewriting your pattern can often help. The -.\" HREF -\fBpcrestack\fP -.\" -documentation discusses this issue in detail. -. -. -.SH "PROCESSING TIME" -.rs -.sp -Certain items in regular expression patterns are processed more efficiently -than others. It is more efficient to use a character class like [aeiou] than a -set of single-character alternatives such as (a|e|i|o|u). In general, the -simplest construction that provides the required behaviour is usually the most -efficient. Jeffrey Friedl's book contains a lot of useful general discussion -about optimizing regular expressions for efficient performance. This document -contains a few observations about PCRE. -.P -Using Unicode character properties (the \ep, \eP, and \eX escapes) is slow, -because PCRE has to use a multi-stage table lookup whenever it needs a -character's property. If you can find an alternative pattern that does not use -character properties, it will probably be faster. -.P -By default, the escape sequences \eb, \ed, \es, and \ew, and the POSIX -character classes such as [:alpha:] do not use Unicode properties, partly for -backwards compatibility, and partly for performance reasons. However, you can -set PCRE_UCP if you want Unicode character properties to be used. This can -double the matching time for items such as \ed, when matched with -a traditional matching function; the performance loss is less with -a DFA matching function, and in both cases there is not much difference for -\eb. -.P -When a pattern begins with .* not in parentheses, or in parentheses that are -not the subject of a backreference, and the PCRE_DOTALL option is set, the -pattern is implicitly anchored by PCRE, since it can match only at the start of -a subject string. However, if PCRE_DOTALL is not set, PCRE cannot make this -optimization, because the . metacharacter does not then match a newline, and if -the subject string contains newlines, the pattern may match from the character -immediately following one of them instead of from the very start. For example, -the pattern -.sp - .*second -.sp -matches the subject "first\enand second" (where \en stands for a newline -character), with the match starting at the seventh character. In order to do -this, PCRE has to retry the match starting after every newline in the subject. -.P -If you are using such a pattern with subject strings that do not contain -newlines, the best performance is obtained by setting PCRE_DOTALL, or starting -the pattern with ^.* or ^.*? to indicate explicit anchoring. That saves PCRE -from having to scan along the subject looking for a newline to restart at. -.P -Beware of patterns that contain nested indefinite repeats. These can take a -long time to run when applied to a string that does not match. Consider the -pattern fragment -.sp - ^(a+)* -.sp -This can match "aaaa" in 16 different ways, and this number increases very -rapidly as the string gets longer. (The * repeat can match 0, 1, 2, 3, or 4 -times, and for each of those cases other than 0 or 4, the + repeats can match -different numbers of times.) When the remainder of the pattern is such that the -entire match is going to fail, PCRE has in principle to try every possible -variation, and this can take an extremely long time, even for relatively short -strings. -.P -An optimization catches some of the more simple cases such as -.sp - (a+)*b -.sp -where a literal character follows. Before embarking on the standard matching -procedure, PCRE checks that there is a "b" later in the subject string, and if -there is not, it fails the match immediately. However, when there is no -following literal this optimization cannot be used. You can see the difference -by comparing the behaviour of -.sp - (a+)*\ed -.sp -with the pattern above. The former gives a failure almost instantly when -applied to a whole line of "a" characters, whereas the latter takes an -appreciable time with strings longer than about 20 characters. -.P -In many cases, the solution to this kind of performance issue is to use an -atomic group or a possessive quantifier. -. -. -.SH AUTHOR -.rs -.sp -.nf -Philip Hazel -University Computing Service -Cambridge CB2 3QH, England. -.fi -. -. -.SH REVISION -.rs -.sp -.nf -Last updated: 25 August 2012 -Copyright (c) 1997-2012 University of Cambridge. -.fi diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcreposix.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcreposix.3 deleted file mode 100644 index 77890f36..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcreposix.3 +++ /dev/null @@ -1,267 +0,0 @@ -.TH PCREPOSIX 3 "09 January 2012" "PCRE 8.30" -.SH NAME -PCRE - Perl-compatible regular expressions. -.SH "SYNOPSIS" -.rs -.sp -.B #include -.PP -.nf -.B int regcomp(regex_t *\fIpreg\fP, const char *\fIpattern\fP, -.B " int \fIcflags\fP);" -.sp -.B int regexec(regex_t *\fIpreg\fP, const char *\fIstring\fP, -.B " size_t \fInmatch\fP, regmatch_t \fIpmatch\fP[], int \fIeflags\fP);" -.B " size_t regerror(int \fIerrcode\fP, const regex_t *\fIpreg\fP," -.B " char *\fIerrbuf\fP, size_t \fIerrbuf_size\fP);" -.sp -.B void regfree(regex_t *\fIpreg\fP); -.fi -. -.SH DESCRIPTION -.rs -.sp -This set of functions provides a POSIX-style API for the PCRE regular -expression 8-bit library. See the -.\" HREF -\fBpcreapi\fP -.\" -documentation for a description of PCRE's native API, which contains much -additional functionality. There is no POSIX-style wrapper for PCRE's 16-bit -and 32-bit library. -.P -The functions described here are just wrapper functions that ultimately call -the PCRE native API. Their prototypes are defined in the \fBpcreposix.h\fP -header file, and on Unix systems the library itself is called -\fBpcreposix.a\fP, so can be accessed by adding \fB-lpcreposix\fP to the -command for linking an application that uses them. Because the POSIX functions -call the native ones, it is also necessary to add \fB-lpcre\fP. -.P -I have implemented only those POSIX option bits that can be reasonably mapped -to PCRE native options. In addition, the option REG_EXTENDED is defined with -the value zero. This has no effect, but since programs that are written to the -POSIX interface often use it, this makes it easier to slot in PCRE as a -replacement library. Other POSIX options are not even defined. -.P -There are also some other options that are not defined by POSIX. These have -been added at the request of users who want to make use of certain -PCRE-specific features via the POSIX calling interface. -.P -When PCRE is called via these functions, it is only the API that is POSIX-like -in style. The syntax and semantics of the regular expressions themselves are -still those of Perl, subject to the setting of various PCRE options, as -described below. "POSIX-like in style" means that the API approximates to the -POSIX definition; it is not fully POSIX-compatible, and in multi-byte encoding -domains it is probably even less compatible. -.P -The header for these functions is supplied as \fBpcreposix.h\fP to avoid any -potential clash with other POSIX libraries. It can, of course, be renamed or -aliased as \fBregex.h\fP, which is the "correct" name. It provides two -structure types, \fIregex_t\fP for compiled internal forms, and -\fIregmatch_t\fP for returning captured substrings. It also defines some -constants whose names start with "REG_"; these are used for setting options and -identifying error codes. -. -. -.SH "COMPILING A PATTERN" -.rs -.sp -The function \fBregcomp()\fP is called to compile a pattern into an -internal form. The pattern is a C string terminated by a binary zero, and -is passed in the argument \fIpattern\fP. The \fIpreg\fP argument is a pointer -to a \fBregex_t\fP structure that is used as a base for storing information -about the compiled regular expression. -.P -The argument \fIcflags\fP is either zero, or contains one or more of the bits -defined by the following macros: -.sp - REG_DOTALL -.sp -The PCRE_DOTALL option is set when the regular expression is passed for -compilation to the native function. Note that REG_DOTALL is not part of the -POSIX standard. -.sp - REG_ICASE -.sp -The PCRE_CASELESS option is set when the regular expression is passed for -compilation to the native function. -.sp - REG_NEWLINE -.sp -The PCRE_MULTILINE option is set when the regular expression is passed for -compilation to the native function. Note that this does \fInot\fP mimic the -defined POSIX behaviour for REG_NEWLINE (see the following section). -.sp - REG_NOSUB -.sp -The PCRE_NO_AUTO_CAPTURE option is set when the regular expression is passed -for compilation to the native function. In addition, when a pattern that is -compiled with this flag is passed to \fBregexec()\fP for matching, the -\fInmatch\fP and \fIpmatch\fP arguments are ignored, and no captured strings -are returned. -.sp - REG_UCP -.sp -The PCRE_UCP option is set when the regular expression is passed for -compilation to the native function. This causes PCRE to use Unicode properties -when matchine \ed, \ew, etc., instead of just recognizing ASCII values. Note -that REG_UTF8 is not part of the POSIX standard. -.sp - REG_UNGREEDY -.sp -The PCRE_UNGREEDY option is set when the regular expression is passed for -compilation to the native function. Note that REG_UNGREEDY is not part of the -POSIX standard. -.sp - REG_UTF8 -.sp -The PCRE_UTF8 option is set when the regular expression is passed for -compilation to the native function. This causes the pattern itself and all data -strings used for matching it to be treated as UTF-8 strings. Note that REG_UTF8 -is not part of the POSIX standard. -.P -In the absence of these flags, no options are passed to the native function. -This means the the regex is compiled with PCRE default semantics. In -particular, the way it handles newline characters in the subject string is the -Perl way, not the POSIX way. Note that setting PCRE_MULTILINE has only -\fIsome\fP of the effects specified for REG_NEWLINE. It does not affect the way -newlines are matched by . (they are not) or by a negative class such as [^a] -(they are). -.P -The yield of \fBregcomp()\fP is zero on success, and non-zero otherwise. The -\fIpreg\fP structure is filled in on success, and one member of the structure -is public: \fIre_nsub\fP contains the number of capturing subpatterns in -the regular expression. Various error codes are defined in the header file. -.P -NOTE: If the yield of \fBregcomp()\fP is non-zero, you must not attempt to -use the contents of the \fIpreg\fP structure. If, for example, you pass it to -\fBregexec()\fP, the result is undefined and your program is likely to crash. -. -. -.SH "MATCHING NEWLINE CHARACTERS" -.rs -.sp -This area is not simple, because POSIX and Perl take different views of things. -It is not possible to get PCRE to obey POSIX semantics, but then PCRE was never -intended to be a POSIX engine. The following table lists the different -possibilities for matching newline characters in PCRE: -.sp - Default Change with -.sp - . matches newline no PCRE_DOTALL - newline matches [^a] yes not changeable - $ matches \en at end yes PCRE_DOLLARENDONLY - $ matches \en in middle no PCRE_MULTILINE - ^ matches \en in middle no PCRE_MULTILINE -.sp -This is the equivalent table for POSIX: -.sp - Default Change with -.sp - . matches newline yes REG_NEWLINE - newline matches [^a] yes REG_NEWLINE - $ matches \en at end no REG_NEWLINE - $ matches \en in middle no REG_NEWLINE - ^ matches \en in middle no REG_NEWLINE -.sp -PCRE's behaviour is the same as Perl's, except that there is no equivalent for -PCRE_DOLLAR_ENDONLY in Perl. In both PCRE and Perl, there is no way to stop -newline from matching [^a]. -.P -The default POSIX newline handling can be obtained by setting PCRE_DOTALL and -PCRE_DOLLAR_ENDONLY, but there is no way to make PCRE behave exactly as for the -REG_NEWLINE action. -. -. -.SH "MATCHING A PATTERN" -.rs -.sp -The function \fBregexec()\fP is called to match a compiled pattern \fIpreg\fP -against a given \fIstring\fP, which is by default terminated by a zero byte -(but see REG_STARTEND below), subject to the options in \fIeflags\fP. These can -be: -.sp - REG_NOTBOL -.sp -The PCRE_NOTBOL option is set when calling the underlying PCRE matching -function. -.sp - REG_NOTEMPTY -.sp -The PCRE_NOTEMPTY option is set when calling the underlying PCRE matching -function. Note that REG_NOTEMPTY is not part of the POSIX standard. However, -setting this option can give more POSIX-like behaviour in some situations. -.sp - REG_NOTEOL -.sp -The PCRE_NOTEOL option is set when calling the underlying PCRE matching -function. -.sp - REG_STARTEND -.sp -The string is considered to start at \fIstring\fP + \fIpmatch[0].rm_so\fP and -to have a terminating NUL located at \fIstring\fP + \fIpmatch[0].rm_eo\fP -(there need not actually be a NUL at that location), regardless of the value of -\fInmatch\fP. This is a BSD extension, compatible with but not specified by -IEEE Standard 1003.2 (POSIX.2), and should be used with caution in software -intended to be portable to other systems. Note that a non-zero \fIrm_so\fP does -not imply REG_NOTBOL; REG_STARTEND affects only the location of the string, not -how it is matched. -.P -If the pattern was compiled with the REG_NOSUB flag, no data about any matched -strings is returned. The \fInmatch\fP and \fIpmatch\fP arguments of -\fBregexec()\fP are ignored. -.P -If the value of \fInmatch\fP is zero, or if the value \fIpmatch\fP is NULL, -no data about any matched strings is returned. -.P -Otherwise,the portion of the string that was matched, and also any captured -substrings, are returned via the \fIpmatch\fP argument, which points to an -array of \fInmatch\fP structures of type \fIregmatch_t\fP, containing the -members \fIrm_so\fP and \fIrm_eo\fP. These contain the offset to the first -character of each substring and the offset to the first character after the end -of each substring, respectively. The 0th element of the vector relates to the -entire portion of \fIstring\fP that was matched; subsequent elements relate to -the capturing subpatterns of the regular expression. Unused entries in the -array have both structure members set to -1. -.P -A successful match yields a zero return; various error codes are defined in the -header file, of which REG_NOMATCH is the "expected" failure code. -. -. -.SH "ERROR MESSAGES" -.rs -.sp -The \fBregerror()\fP function maps a non-zero errorcode from either -\fBregcomp()\fP or \fBregexec()\fP to a printable message. If \fIpreg\fP is not -NULL, the error should have arisen from the use of that structure. A message -terminated by a binary zero is placed in \fIerrbuf\fP. The length of the -message, including the zero, is limited to \fIerrbuf_size\fP. The yield of the -function is the size of buffer needed to hold the whole message. -. -. -.SH MEMORY USAGE -.rs -.sp -Compiling a regular expression causes memory to be allocated and associated -with the \fIpreg\fP structure. The function \fBregfree()\fP frees all such -memory, after which \fIpreg\fP may no longer be used as a compiled expression. -. -. -.SH AUTHOR -.rs -.sp -.nf -Philip Hazel -University Computing Service -Cambridge CB2 3QH, England. -.fi -. -. -.SH REVISION -.rs -.sp -.nf -Last updated: 09 January 2012 -Copyright (c) 1997-2012 University of Cambridge. -.fi diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcreprecompile.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcreprecompile.3 deleted file mode 100644 index 40f257a9..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcreprecompile.3 +++ /dev/null @@ -1,155 +0,0 @@ -.TH PCREPRECOMPILE 3 "12 November 2013" "PCRE 8.34" -.SH NAME -PCRE - Perl-compatible regular expressions -.SH "SAVING AND RE-USING PRECOMPILED PCRE PATTERNS" -.rs -.sp -If you are running an application that uses a large number of regular -expression patterns, it may be useful to store them in a precompiled form -instead of having to compile them every time the application is run. -If you are not using any private character tables (see the -.\" HREF -\fBpcre_maketables()\fP -.\" -documentation), this is relatively straightforward. If you are using private -tables, it is a little bit more complicated. However, if you are using the -just-in-time optimization feature, it is not possible to save and reload the -JIT data. -.P -If you save compiled patterns to a file, you can copy them to a different host -and run them there. If the two hosts have different endianness (byte order), -you should run the \fBpcre[16|32]_pattern_to_host_byte_order()\fP function on the -new host before trying to match the pattern. The matching functions return -PCRE_ERROR_BADENDIANNESS if they detect a pattern with the wrong endianness. -.P -Compiling regular expressions with one version of PCRE for use with a different -version is not guaranteed to work and may cause crashes, and saving and -restoring a compiled pattern loses any JIT optimization data. -. -. -.SH "SAVING A COMPILED PATTERN" -.rs -.sp -The value returned by \fBpcre[16|32]_compile()\fP points to a single block of -memory that holds the compiled pattern and associated data. You can find the -length of this block in bytes by calling \fBpcre[16|32]_fullinfo()\fP with an -argument of PCRE_INFO_SIZE. You can then save the data in any appropriate -manner. Here is sample code for the 8-bit library that compiles a pattern and -writes it to a file. It assumes that the variable \fIfd\fP refers to a file -that is open for output: -.sp - int erroroffset, rc, size; - char *error; - pcre *re; -.sp - re = pcre_compile("my pattern", 0, &error, &erroroffset, NULL); - if (re == NULL) { ... handle errors ... } - rc = pcre_fullinfo(re, NULL, PCRE_INFO_SIZE, &size); - if (rc < 0) { ... handle errors ... } - rc = fwrite(re, 1, size, fd); - if (rc != size) { ... handle errors ... } -.sp -In this example, the bytes that comprise the compiled pattern are copied -exactly. Note that this is binary data that may contain any of the 256 possible -byte values. On systems that make a distinction between binary and non-binary -data, be sure that the file is opened for binary output. -.P -If you want to write more than one pattern to a file, you will have to devise a -way of separating them. For binary data, preceding each pattern with its length -is probably the most straightforward approach. Another possibility is to write -out the data in hexadecimal instead of binary, one pattern to a line. -.P -Saving compiled patterns in a file is only one possible way of storing them for -later use. They could equally well be saved in a database, or in the memory of -some daemon process that passes them via sockets to the processes that want -them. -.P -If the pattern has been studied, it is also possible to save the normal study -data in a similar way to the compiled pattern itself. However, if the -PCRE_STUDY_JIT_COMPILE was used, the just-in-time data that is created cannot -be saved because it is too dependent on the current environment. When studying -generates additional information, \fBpcre[16|32]_study()\fP returns a pointer to a -\fBpcre[16|32]_extra\fP data block. Its format is defined in the -.\" HTML -.\" -section on matching a pattern -.\" -in the -.\" HREF -\fBpcreapi\fP -.\" -documentation. The \fIstudy_data\fP field points to the binary study data, and -this is what you must save (not the \fBpcre[16|32]_extra\fP block itself). The -length of the study data can be obtained by calling \fBpcre[16|32]_fullinfo()\fP -with an argument of PCRE_INFO_STUDYSIZE. Remember to check that -\fBpcre[16|32]_study()\fP did return a non-NULL value before trying to save the -study data. -. -. -.SH "RE-USING A PRECOMPILED PATTERN" -.rs -.sp -Re-using a precompiled pattern is straightforward. Having reloaded it into main -memory, called \fBpcre[16|32]_pattern_to_host_byte_order()\fP if necessary, you -pass its pointer to \fBpcre[16|32]_exec()\fP or \fBpcre[16|32]_dfa_exec()\fP in -the usual way. -.P -However, if you passed a pointer to custom character tables when the pattern -was compiled (the \fItableptr\fP argument of \fBpcre[16|32]_compile()\fP), you -must now pass a similar pointer to \fBpcre[16|32]_exec()\fP or -\fBpcre[16|32]_dfa_exec()\fP, because the value saved with the compiled pattern -will obviously be nonsense. A field in a \fBpcre[16|32]_extra()\fP block is used -to pass this data, as described in the -.\" HTML -.\" -section on matching a pattern -.\" -in the -.\" HREF -\fBpcreapi\fP -.\" -documentation. -.P -\fBWarning:\fP The tables that \fBpcre_exec()\fP and \fBpcre_dfa_exec()\fP use -must be the same as those that were used when the pattern was compiled. If this -is not the case, the behaviour is undefined. -.P -If you did not provide custom character tables when the pattern was compiled, -the pointer in the compiled pattern is NULL, which causes the matching -functions to use PCRE's internal tables. Thus, you do not need to take any -special action at run time in this case. -.P -If you saved study data with the compiled pattern, you need to create your own -\fBpcre[16|32]_extra\fP data block and set the \fIstudy_data\fP field to point -to the reloaded study data. You must also set the PCRE_EXTRA_STUDY_DATA bit in -the \fIflags\fP field to indicate that study data is present. Then pass the -\fBpcre[16|32]_extra\fP block to the matching function in the usual way. If the -pattern was studied for just-in-time optimization, that data cannot be saved, -and so is lost by a save/restore cycle. -. -. -.SH "COMPATIBILITY WITH DIFFERENT PCRE RELEASES" -.rs -.sp -In general, it is safest to recompile all saved patterns when you update to a -new PCRE release, though not all updates actually require this. -. -. -. -.SH AUTHOR -.rs -.sp -.nf -Philip Hazel -University Computing Service -Cambridge CB2 3QH, England. -.fi -. -. -.SH REVISION -.rs -.sp -.nf -Last updated: 12 November 2013 -Copyright (c) 1997-2013 University of Cambridge. -.fi diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcresample.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcresample.3 deleted file mode 100644 index d7fe7ec5..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcresample.3 +++ /dev/null @@ -1,99 +0,0 @@ -.TH PCRESAMPLE 3 "10 January 2012" "PCRE 8.30" -.SH NAME -PCRE - Perl-compatible regular expressions -.SH "PCRE SAMPLE PROGRAM" -.rs -.sp -A simple, complete demonstration program, to get you started with using PCRE, -is supplied in the file \fIpcredemo.c\fP in the PCRE distribution. A listing of -this program is given in the -.\" HREF -\fBpcredemo\fP -.\" -documentation. If you do not have a copy of the PCRE distribution, you can save -this listing to re-create \fIpcredemo.c\fP. -.P -The demonstration program, which uses the original PCRE 8-bit library, compiles -the regular expression that is its first argument, and matches it against the -subject string in its second argument. No PCRE options are set, and default -character tables are used. If matching succeeds, the program outputs the -portion of the subject that matched, together with the contents of any captured -substrings. -.P -If the -g option is given on the command line, the program then goes on to -check for further matches of the same regular expression in the same subject -string. The logic is a little bit tricky because of the possibility of matching -an empty string. Comments in the code explain what is going on. -.P -If PCRE is installed in the standard include and library directories for your -operating system, you should be able to compile the demonstration program using -this command: -.sp - gcc -o pcredemo pcredemo.c -lpcre -.sp -If PCRE is installed elsewhere, you may need to add additional options to the -command line. For example, on a Unix-like system that has PCRE installed in -\fI/usr/local\fP, you can compile the demonstration program using a command -like this: -.sp -.\" JOINSH - gcc -o pcredemo -I/usr/local/include pcredemo.c \e - -L/usr/local/lib -lpcre -.sp -In a Windows environment, if you want to statically link the program against a -non-dll \fBpcre.a\fP file, you must uncomment the line that defines PCRE_STATIC -before including \fBpcre.h\fP, because otherwise the \fBpcre_malloc()\fP and -\fBpcre_free()\fP exported functions will be declared -\fB__declspec(dllimport)\fP, with unwanted results. -.P -Once you have compiled and linked the demonstration program, you can run simple -tests like this: -.sp - ./pcredemo 'cat|dog' 'the cat sat on the mat' - ./pcredemo -g 'cat|dog' 'the dog sat on the cat' -.sp -Note that there is a much more comprehensive test program, called -.\" HREF -\fBpcretest\fP, -.\" -which supports many more facilities for testing regular expressions and both -PCRE libraries. The -.\" HREF -\fBpcredemo\fP -.\" -program is provided as a simple coding example. -.P -If you try to run -.\" HREF -\fBpcredemo\fP -.\" -when PCRE is not installed in the standard library directory, you may get an -error like this on some operating systems (e.g. Solaris): -.sp - ld.so.1: a.out: fatal: libpcre.so.0: open failed: No such file or directory -.sp -This is caused by the way shared library support works on those systems. You -need to add -.sp - -R/usr/local/lib -.sp -(for example) to the compile command to get round this problem. -. -. -.SH AUTHOR -.rs -.sp -.nf -Philip Hazel -University Computing Service -Cambridge CB2 3QH, England. -.fi -. -. -.SH REVISION -.rs -.sp -.nf -Last updated: 10 January 2012 -Copyright (c) 1997-2012 University of Cambridge. -.fi diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcrestack.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcrestack.3 deleted file mode 100644 index 798f0bca..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcrestack.3 +++ /dev/null @@ -1,215 +0,0 @@ -.TH PCRESTACK 3 "24 June 2012" "PCRE 8.30" -.SH NAME -PCRE - Perl-compatible regular expressions -.SH "PCRE DISCUSSION OF STACK USAGE" -.rs -.sp -When you call \fBpcre[16|32]_exec()\fP, it makes use of an internal function -called \fBmatch()\fP. This calls itself recursively at branch points in the -pattern, in order to remember the state of the match so that it can back up and -try a different alternative if the first one fails. As matching proceeds deeper -and deeper into the tree of possibilities, the recursion depth increases. The -\fBmatch()\fP function is also called in other circumstances, for example, -whenever a parenthesized sub-pattern is entered, and in certain cases of -repetition. -.P -Not all calls of \fBmatch()\fP increase the recursion depth; for an item such -as a* it may be called several times at the same level, after matching -different numbers of a's. Furthermore, in a number of cases where the result of -the recursive call would immediately be passed back as the result of the -current call (a "tail recursion"), the function is just restarted instead. -.P -The above comments apply when \fBpcre[16|32]_exec()\fP is run in its normal -interpretive manner. If the pattern was studied with the -PCRE_STUDY_JIT_COMPILE option, and just-in-time compiling was successful, and -the options passed to \fBpcre[16|32]_exec()\fP were not incompatible, the matching -process uses the JIT-compiled code instead of the \fBmatch()\fP function. In -this case, the memory requirements are handled entirely differently. See the -.\" HREF -\fBpcrejit\fP -.\" -documentation for details. -.P -The \fBpcre[16|32]_dfa_exec()\fP function operates in an entirely different way, -and uses recursion only when there is a regular expression recursion or -subroutine call in the pattern. This includes the processing of assertion and -"once-only" subpatterns, which are handled like subroutine calls. Normally, -these are never very deep, and the limit on the complexity of -\fBpcre[16|32]_dfa_exec()\fP is controlled by the amount of workspace it is given. -However, it is possible to write patterns with runaway infinite recursions; -such patterns will cause \fBpcre[16|32]_dfa_exec()\fP to run out of stack. At -present, there is no protection against this. -.P -The comments that follow do NOT apply to \fBpcre[16|32]_dfa_exec()\fP; they are -relevant only for \fBpcre[16|32]_exec()\fP without the JIT optimization. -. -. -.SS "Reducing \fBpcre[16|32]_exec()\fP's stack usage" -.rs -.sp -Each time that \fBmatch()\fP is actually called recursively, it uses memory -from the process stack. For certain kinds of pattern and data, very large -amounts of stack may be needed, despite the recognition of "tail recursion". -You can often reduce the amount of recursion, and therefore the amount of stack -used, by modifying the pattern that is being matched. Consider, for example, -this pattern: -.sp - ([^<]|<(?!inet))+ -.sp -It matches from wherever it starts until it encounters " -.\" -section on extra data for \fBpcre[16|32]_exec()\fP -.\" -in the -.\" HREF -\fBpcreapi\fP -.\" -documentation. -.P -As a very rough rule of thumb, you should reckon on about 500 bytes per -recursion. Thus, if you want to limit your stack usage to 8Mb, you should set -the limit at 16000 recursions. A 64Mb stack, on the other hand, can support -around 128000 recursions. -.P -In Unix-like environments, the \fBpcretest\fP test program has a command line -option (\fB-S\fP) that can be used to increase the size of its stack. As long -as the stack is large enough, another option (\fB-M\fP) can be used to find the -smallest limits that allow a particular pattern to match a given subject -string. This is done by calling \fBpcre[16|32]_exec()\fP repeatedly with different -limits. -. -. -.SS "Obtaining an estimate of stack usage" -.rs -.sp -The actual amount of stack used per recursion can vary quite a lot, depending -on the compiler that was used to build PCRE and the optimization or debugging -options that were set for it. The rule of thumb value of 500 bytes mentioned -above may be larger or smaller than what is actually needed. A better -approximation can be obtained by running this command: -.sp - pcretest -m -C -.sp -The \fB-C\fP option causes \fBpcretest\fP to output information about the -options with which PCRE was compiled. When \fB-m\fP is also given (before -\fB-C\fP), information about stack use is given in a line like this: -.sp - Match recursion uses stack: approximate frame size = 640 bytes -.sp -The value is approximate because some recursions need a bit more (up to perhaps -16 more bytes). -.P -If the above command is given when PCRE is compiled to use the heap instead of -the stack for recursion, the value that is output is the size of each block -that is obtained from the heap. -. -. -.SS "Changing stack size in Unix-like systems" -.rs -.sp -In Unix-like environments, there is not often a problem with the stack unless -very long strings are involved, though the default limit on stack size varies -from system to system. Values from 8Mb to 64Mb are common. You can find your -default limit by running the command: -.sp - ulimit -s -.sp -Unfortunately, the effect of running out of stack is often SIGSEGV, though -sometimes a more explicit error message is given. You can normally increase the -limit on stack size by code such as this: -.sp - struct rlimit rlim; - getrlimit(RLIMIT_STACK, &rlim); - rlim.rlim_cur = 100*1024*1024; - setrlimit(RLIMIT_STACK, &rlim); -.sp -This reads the current limits (soft and hard) using \fBgetrlimit()\fP, then -attempts to increase the soft limit to 100Mb using \fBsetrlimit()\fP. You must -do this before calling \fBpcre[16|32]_exec()\fP. -. -. -.SS "Changing stack size in Mac OS X" -.rs -.sp -Using \fBsetrlimit()\fP, as described above, should also work on Mac OS X. It -is also possible to set a stack size when linking a program. There is a -discussion about stack sizes in Mac OS X at this web site: -.\" HTML -.\" -http://developer.apple.com/qa/qa2005/qa1419.html. -.\" -. -. -.SH AUTHOR -.rs -.sp -.nf -Philip Hazel -University Computing Service -Cambridge CB2 3QH, England. -.fi -. -. -.SH REVISION -.rs -.sp -.nf -Last updated: 24 June 2012 -Copyright (c) 1997-2012 University of Cambridge. -.fi diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcresyntax.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcresyntax.3 deleted file mode 100644 index 0850369f..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcresyntax.3 +++ /dev/null @@ -1,540 +0,0 @@ -.TH PCRESYNTAX 3 "08 January 2014" "PCRE 8.35" -.SH NAME -PCRE - Perl-compatible regular expressions -.SH "PCRE REGULAR EXPRESSION SYNTAX SUMMARY" -.rs -.sp -The full syntax and semantics of the regular expressions that are supported by -PCRE are described in the -.\" HREF -\fBpcrepattern\fP -.\" -documentation. This document contains a quick-reference summary of the syntax. -. -. -.SH "QUOTING" -.rs -.sp - \ex where x is non-alphanumeric is a literal x - \eQ...\eE treat enclosed characters as literal -. -. -.SH "CHARACTERS" -.rs -.sp - \ea alarm, that is, the BEL character (hex 07) - \ecx "control-x", where x is any ASCII character - \ee escape (hex 1B) - \ef form feed (hex 0C) - \en newline (hex 0A) - \er carriage return (hex 0D) - \et tab (hex 09) - \e0dd character with octal code 0dd - \eddd character with octal code ddd, or backreference - \eo{ddd..} character with octal code ddd.. - \exhh character with hex code hh - \ex{hhh..} character with hex code hhh.. -.sp -Note that \e0dd is always an octal code, and that \e8 and \e9 are the literal -characters "8" and "9". -. -. -.SH "CHARACTER TYPES" -.rs -.sp - . any character except newline; - in dotall mode, any character whatsoever - \eC one data unit, even in UTF mode (best avoided) - \ed a decimal digit - \eD a character that is not a decimal digit - \eh a horizontal white space character - \eH a character that is not a horizontal white space character - \eN a character that is not a newline - \ep{\fIxx\fP} a character with the \fIxx\fP property - \eP{\fIxx\fP} a character without the \fIxx\fP property - \eR a newline sequence - \es a white space character - \eS a character that is not a white space character - \ev a vertical white space character - \eV a character that is not a vertical white space character - \ew a "word" character - \eW a "non-word" character - \eX a Unicode extended grapheme cluster -.sp -By default, \ed, \es, and \ew match only ASCII characters, even in UTF-8 mode -or in the 16- bit and 32-bit libraries. However, if locale-specific matching is -happening, \es and \ew may also match characters with code points in the range -128-255. If the PCRE_UCP option is set, the behaviour of these escape sequences -is changed to use Unicode properties and they match many more characters. -. -. -.SH "GENERAL CATEGORY PROPERTIES FOR \ep and \eP" -.rs -.sp - C Other - Cc Control - Cf Format - Cn Unassigned - Co Private use - Cs Surrogate -.sp - L Letter - Ll Lower case letter - Lm Modifier letter - Lo Other letter - Lt Title case letter - Lu Upper case letter - L& Ll, Lu, or Lt -.sp - M Mark - Mc Spacing mark - Me Enclosing mark - Mn Non-spacing mark -.sp - N Number - Nd Decimal number - Nl Letter number - No Other number -.sp - P Punctuation - Pc Connector punctuation - Pd Dash punctuation - Pe Close punctuation - Pf Final punctuation - Pi Initial punctuation - Po Other punctuation - Ps Open punctuation -.sp - S Symbol - Sc Currency symbol - Sk Modifier symbol - Sm Mathematical symbol - So Other symbol -.sp - Z Separator - Zl Line separator - Zp Paragraph separator - Zs Space separator -. -. -.SH "PCRE SPECIAL CATEGORY PROPERTIES FOR \ep and \eP" -.rs -.sp - Xan Alphanumeric: union of properties L and N - Xps POSIX space: property Z or tab, NL, VT, FF, CR - Xsp Perl space: property Z or tab, NL, VT, FF, CR - Xuc Univerally-named character: one that can be - represented by a Universal Character Name - Xwd Perl word: property Xan or underscore -.sp -Perl and POSIX space are now the same. Perl added VT to its space character set -at release 5.18 and PCRE changed at release 8.34. -. -. -.SH "SCRIPT NAMES FOR \ep AND \eP" -.rs -.sp -Arabic, -Armenian, -Avestan, -Balinese, -Bamum, -Bassa_Vah, -Batak, -Bengali, -Bopomofo, -Brahmi, -Braille, -Buginese, -Buhid, -Canadian_Aboriginal, -Carian, -Caucasian_Albanian, -Chakma, -Cham, -Cherokee, -Common, -Coptic, -Cuneiform, -Cypriot, -Cyrillic, -Deseret, -Devanagari, -Duployan, -Egyptian_Hieroglyphs, -Elbasan, -Ethiopic, -Georgian, -Glagolitic, -Gothic, -Grantha, -Greek, -Gujarati, -Gurmukhi, -Han, -Hangul, -Hanunoo, -Hebrew, -Hiragana, -Imperial_Aramaic, -Inherited, -Inscriptional_Pahlavi, -Inscriptional_Parthian, -Javanese, -Kaithi, -Kannada, -Katakana, -Kayah_Li, -Kharoshthi, -Khmer, -Khojki, -Khudawadi, -Lao, -Latin, -Lepcha, -Limbu, -Linear_A, -Linear_B, -Lisu, -Lycian, -Lydian, -Mahajani, -Malayalam, -Mandaic, -Manichaean, -Meetei_Mayek, -Mende_Kikakui, -Meroitic_Cursive, -Meroitic_Hieroglyphs, -Miao, -Modi, -Mongolian, -Mro, -Myanmar, -Nabataean, -New_Tai_Lue, -Nko, -Ogham, -Ol_Chiki, -Old_Italic, -Old_North_Arabian, -Old_Permic, -Old_Persian, -Old_South_Arabian, -Old_Turkic, -Oriya, -Osmanya, -Pahawh_Hmong, -Palmyrene, -Pau_Cin_Hau, -Phags_Pa, -Phoenician, -Psalter_Pahlavi, -Rejang, -Runic, -Samaritan, -Saurashtra, -Sharada, -Shavian, -Siddham, -Sinhala, -Sora_Sompeng, -Sundanese, -Syloti_Nagri, -Syriac, -Tagalog, -Tagbanwa, -Tai_Le, -Tai_Tham, -Tai_Viet, -Takri, -Tamil, -Telugu, -Thaana, -Thai, -Tibetan, -Tifinagh, -Tirhuta, -Ugaritic, -Vai, -Warang_Citi, -Yi. -. -. -.SH "CHARACTER CLASSES" -.rs -.sp - [...] positive character class - [^...] negative character class - [x-y] range (can be used for hex characters) - [[:xxx:]] positive POSIX named set - [[:^xxx:]] negative POSIX named set -.sp - alnum alphanumeric - alpha alphabetic - ascii 0-127 - blank space or tab - cntrl control character - digit decimal digit - graph printing, excluding space - lower lower case letter - print printing, including space - punct printing, excluding alphanumeric - space white space - upper upper case letter - word same as \ew - xdigit hexadecimal digit -.sp -In PCRE, POSIX character set names recognize only ASCII characters by default, -but some of them use Unicode properties if PCRE_UCP is set. You can use -\eQ...\eE inside a character class. -. -. -.SH "QUANTIFIERS" -.rs -.sp - ? 0 or 1, greedy - ?+ 0 or 1, possessive - ?? 0 or 1, lazy - * 0 or more, greedy - *+ 0 or more, possessive - *? 0 or more, lazy - + 1 or more, greedy - ++ 1 or more, possessive - +? 1 or more, lazy - {n} exactly n - {n,m} at least n, no more than m, greedy - {n,m}+ at least n, no more than m, possessive - {n,m}? at least n, no more than m, lazy - {n,} n or more, greedy - {n,}+ n or more, possessive - {n,}? n or more, lazy -. -. -.SH "ANCHORS AND SIMPLE ASSERTIONS" -.rs -.sp - \eb word boundary - \eB not a word boundary - ^ start of subject - also after internal newline in multiline mode - \eA start of subject - $ end of subject - also before newline at end of subject - also before internal newline in multiline mode - \eZ end of subject - also before newline at end of subject - \ez end of subject - \eG first matching position in subject -. -. -.SH "MATCH POINT RESET" -.rs -.sp - \eK reset start of match -.sp -\eK is honoured in positive assertions, but ignored in negative ones. -. -. -.SH "ALTERNATION" -.rs -.sp - expr|expr|expr... -. -. -.SH "CAPTURING" -.rs -.sp - (...) capturing group - (?...) named capturing group (Perl) - (?'name'...) named capturing group (Perl) - (?P...) named capturing group (Python) - (?:...) non-capturing group - (?|...) non-capturing group; reset group numbers for - capturing groups in each alternative -. -. -.SH "ATOMIC GROUPS" -.rs -.sp - (?>...) atomic, non-capturing group -. -. -. -. -.SH "COMMENT" -.rs -.sp - (?#....) comment (not nestable) -. -. -.SH "OPTION SETTING" -.rs -.sp - (?i) caseless - (?J) allow duplicate names - (?m) multiline - (?s) single line (dotall) - (?U) default ungreedy (lazy) - (?x) extended (ignore white space) - (?-...) unset option(s) -.sp -The following are recognized only at the very start of a pattern or after one -of the newline or \eR options with similar syntax. More than one of them may -appear. -.sp - (*LIMIT_MATCH=d) set the match limit to d (decimal number) - (*LIMIT_RECURSION=d) set the recursion limit to d (decimal number) - (*NO_AUTO_POSSESS) no auto-possessification (PCRE_NO_AUTO_POSSESS) - (*NO_START_OPT) no start-match optimization (PCRE_NO_START_OPTIMIZE) - (*UTF8) set UTF-8 mode: 8-bit library (PCRE_UTF8) - (*UTF16) set UTF-16 mode: 16-bit library (PCRE_UTF16) - (*UTF32) set UTF-32 mode: 32-bit library (PCRE_UTF32) - (*UTF) set appropriate UTF mode for the library in use - (*UCP) set PCRE_UCP (use Unicode properties for \ed etc) -.sp -Note that LIMIT_MATCH and LIMIT_RECURSION can only reduce the value of the -limits set by the caller of pcre_exec(), not increase them. -. -. -.SH "NEWLINE CONVENTION" -.rs -.sp -These are recognized only at the very start of the pattern or after option -settings with a similar syntax. -.sp - (*CR) carriage return only - (*LF) linefeed only - (*CRLF) carriage return followed by linefeed - (*ANYCRLF) all three of the above - (*ANY) any Unicode newline sequence -. -. -.SH "WHAT \eR MATCHES" -.rs -.sp -These are recognized only at the very start of the pattern or after option -setting with a similar syntax. -.sp - (*BSR_ANYCRLF) CR, LF, or CRLF - (*BSR_UNICODE) any Unicode newline sequence -. -. -.SH "LOOKAHEAD AND LOOKBEHIND ASSERTIONS" -.rs -.sp - (?=...) positive look ahead - (?!...) negative look ahead - (?<=...) positive look behind - (? reference by name (Perl) - \ek'name' reference by name (Perl) - \eg{name} reference by name (Perl) - \ek{name} reference by name (.NET) - (?P=name) reference by name (Python) -. -. -.SH "SUBROUTINE REFERENCES (POSSIBLY RECURSIVE)" -.rs -.sp - (?R) recurse whole pattern - (?n) call subpattern by absolute number - (?+n) call subpattern by relative number - (?-n) call subpattern by relative number - (?&name) call subpattern by name (Perl) - (?P>name) call subpattern by name (Python) - \eg call subpattern by name (Oniguruma) - \eg'name' call subpattern by name (Oniguruma) - \eg call subpattern by absolute number (Oniguruma) - \eg'n' call subpattern by absolute number (Oniguruma) - \eg<+n> call subpattern by relative number (PCRE extension) - \eg'+n' call subpattern by relative number (PCRE extension) - \eg<-n> call subpattern by relative number (PCRE extension) - \eg'-n' call subpattern by relative number (PCRE extension) -. -. -.SH "CONDITIONAL PATTERNS" -.rs -.sp - (?(condition)yes-pattern) - (?(condition)yes-pattern|no-pattern) -.sp - (?(n)... absolute reference condition - (?(+n)... relative reference condition - (?(-n)... relative reference condition - (?()... named reference condition (Perl) - (?('name')... named reference condition (Perl) - (?(name)... named reference condition (PCRE) - (?(R)... overall recursion condition - (?(Rn)... specific group recursion condition - (?(R&name)... specific recursion condition - (?(DEFINE)... define subpattern for reference - (?(assert)... assertion condition -. -. -.SH "BACKTRACKING CONTROL" -.rs -.sp -The following act immediately they are reached: -.sp - (*ACCEPT) force successful match - (*FAIL) force backtrack; synonym (*F) - (*MARK:NAME) set name to be passed back; synonym (*:NAME) -.sp -The following act only when a subsequent match failure causes a backtrack to -reach them. They all force a match failure, but they differ in what happens -afterwards. Those that advance the start-of-match point do so only if the -pattern is not anchored. -.sp - (*COMMIT) overall failure, no advance of starting point - (*PRUNE) advance to next starting character - (*PRUNE:NAME) equivalent to (*MARK:NAME)(*PRUNE) - (*SKIP) advance to current matching position - (*SKIP:NAME) advance to position corresponding to an earlier - (*MARK:NAME); if not found, the (*SKIP) is ignored - (*THEN) local failure, backtrack to next alternation - (*THEN:NAME) equivalent to (*MARK:NAME)(*THEN) -. -. -.SH "CALLOUTS" -.rs -.sp - (?C) callout - (?Cn) callout with data n -. -. -.SH "SEE ALSO" -.rs -.sp -\fBpcrepattern\fP(3), \fBpcreapi\fP(3), \fBpcrecallout\fP(3), -\fBpcrematching\fP(3), \fBpcre\fP(3). -. -. -.SH AUTHOR -.rs -.sp -.nf -Philip Hazel -University Computing Service -Cambridge CB2 3QH, England. -.fi -. -. -.SH REVISION -.rs -.sp -.nf -Last updated: 08 January 2014 -Copyright (c) 1997-2014 University of Cambridge. -.fi diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcreunicode.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcreunicode.3 deleted file mode 100644 index cb5e5269..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7/share/man/man3/pcreunicode.3 +++ /dev/null @@ -1,249 +0,0 @@ -.TH PCREUNICODE 3 "27 February 2013" "PCRE 8.33" -.SH NAME -PCRE - Perl-compatible regular expressions -.SH "UTF-8, UTF-16, UTF-32, AND UNICODE PROPERTY SUPPORT" -.rs -.sp -As well as UTF-8 support, PCRE also supports UTF-16 (from release 8.30) and -UTF-32 (from release 8.32), by means of two additional libraries. They can be -built as well as, or instead of, the 8-bit library. -. -. -.SH "UTF-8 SUPPORT" -.rs -.sp -In order process UTF-8 strings, you must build PCRE's 8-bit library with UTF -support, and, in addition, you must call -.\" HREF -\fBpcre_compile()\fP -.\" -with the PCRE_UTF8 option flag, or the pattern must start with the sequence -(*UTF8) or (*UTF). When either of these is the case, both the pattern and any -subject strings that are matched against it are treated as UTF-8 strings -instead of strings of individual 1-byte characters. -. -. -.SH "UTF-16 AND UTF-32 SUPPORT" -.rs -.sp -In order process UTF-16 or UTF-32 strings, you must build PCRE's 16-bit or -32-bit library with UTF support, and, in addition, you must call -.\" HREF -\fBpcre16_compile()\fP -.\" -or -.\" HREF -\fBpcre32_compile()\fP -.\" -with the PCRE_UTF16 or PCRE_UTF32 option flag, as appropriate. Alternatively, -the pattern must start with the sequence (*UTF16), (*UTF32), as appropriate, or -(*UTF), which can be used with either library. When UTF mode is set, both the -pattern and any subject strings that are matched against it are treated as -UTF-16 or UTF-32 strings instead of strings of individual 16-bit or 32-bit -characters. -. -. -.SH "UTF SUPPORT OVERHEAD" -.rs -.sp -If you compile PCRE with UTF support, but do not use it at run time, the -library will be a bit bigger, but the additional run time overhead is limited -to testing the PCRE_UTF[8|16|32] flag occasionally, so should not be very big. -. -. -.SH "UNICODE PROPERTY SUPPORT" -.rs -.sp -If PCRE is built with Unicode character property support (which implies UTF -support), the escape sequences \ep{..}, \eP{..}, and \eX can be used. -The available properties that can be tested are limited to the general -category properties such as Lu for an upper case letter or Nd for a decimal -number, the Unicode script names such as Arabic or Han, and the derived -properties Any and L&. Full lists is given in the -.\" HREF -\fBpcrepattern\fP -.\" -and -.\" HREF -\fBpcresyntax\fP -.\" -documentation. Only the short names for properties are supported. For example, -\ep{L} matches a letter. Its Perl synonym, \ep{Letter}, is not supported. -Furthermore, in Perl, many properties may optionally be prefixed by "Is", for -compatibility with Perl 5.6. PCRE does not support this. -. -. -.\" HTML -.SS "Validity of UTF-8 strings" -.rs -.sp -When you set the PCRE_UTF8 flag, the byte strings passed as patterns and -subjects are (by default) checked for validity on entry to the relevant -functions. The entire string is checked before any other processing takes -place. From release 7.3 of PCRE, the check is according the rules of RFC 3629, -which are themselves derived from the Unicode specification. Earlier releases -of PCRE followed the rules of RFC 2279, which allows the full range of 31-bit -values (0 to 0x7FFFFFFF). The current check allows only values in the range U+0 -to U+10FFFF, excluding the surrogate area. (From release 8.33 the so-called -"non-character" code points are no longer excluded because Unicode corrigendum -#9 makes it clear that they should not be.) -.P -Characters in the "Surrogate Area" of Unicode are reserved for use by UTF-16, -where they are used in pairs to encode codepoints with values greater than -0xFFFF. The code points that are encoded by UTF-16 pairs are available -independently in the UTF-8 and UTF-32 encodings. (In other words, the whole -surrogate thing is a fudge for UTF-16 which unfortunately messes up UTF-8 and -UTF-32.) -.P -If an invalid UTF-8 string is passed to PCRE, an error return is given. At -compile time, the only additional information is the offset to the first byte -of the failing character. The run-time functions \fBpcre_exec()\fP and -\fBpcre_dfa_exec()\fP also pass back this information, as well as a more -detailed reason code if the caller has provided memory in which to do this. -.P -In some situations, you may already know that your strings are valid, and -therefore want to skip these checks in order to improve performance, for -example in the case of a long subject string that is being scanned repeatedly. -If you set the PCRE_NO_UTF8_CHECK flag at compile time or at run time, PCRE -assumes that the pattern or subject it is given (respectively) contains only -valid UTF-8 codes. In this case, it does not diagnose an invalid UTF-8 string. -.P -Note that passing PCRE_NO_UTF8_CHECK to \fBpcre_compile()\fP just disables the -check for the pattern; it does not also apply to subject strings. If you want -to disable the check for a subject string you must pass this option to -\fBpcre_exec()\fP or \fBpcre_dfa_exec()\fP. -.P -If you pass an invalid UTF-8 string when PCRE_NO_UTF8_CHECK is set, the result -is undefined and your program may crash. -. -. -.\" HTML -.SS "Validity of UTF-16 strings" -.rs -.sp -When you set the PCRE_UTF16 flag, the strings of 16-bit data units that are -passed as patterns and subjects are (by default) checked for validity on entry -to the relevant functions. Values other than those in the surrogate range -U+D800 to U+DFFF are independent code points. Values in the surrogate range -must be used in pairs in the correct manner. -.P -If an invalid UTF-16 string is passed to PCRE, an error return is given. At -compile time, the only additional information is the offset to the first data -unit of the failing character. The run-time functions \fBpcre16_exec()\fP and -\fBpcre16_dfa_exec()\fP also pass back this information, as well as a more -detailed reason code if the caller has provided memory in which to do this. -.P -In some situations, you may already know that your strings are valid, and -therefore want to skip these checks in order to improve performance. If you set -the PCRE_NO_UTF16_CHECK flag at compile time or at run time, PCRE assumes that -the pattern or subject it is given (respectively) contains only valid UTF-16 -sequences. In this case, it does not diagnose an invalid UTF-16 string. -However, if an invalid string is passed, the result is undefined. -. -. -.\" HTML -.SS "Validity of UTF-32 strings" -.rs -.sp -When you set the PCRE_UTF32 flag, the strings of 32-bit data units that are -passed as patterns and subjects are (by default) checked for validity on entry -to the relevant functions. This check allows only values in the range U+0 -to U+10FFFF, excluding the surrogate area U+D800 to U+DFFF. -.P -If an invalid UTF-32 string is passed to PCRE, an error return is given. At -compile time, the only additional information is the offset to the first data -unit of the failing character. The run-time functions \fBpcre32_exec()\fP and -\fBpcre32_dfa_exec()\fP also pass back this information, as well as a more -detailed reason code if the caller has provided memory in which to do this. -.P -In some situations, you may already know that your strings are valid, and -therefore want to skip these checks in order to improve performance. If you set -the PCRE_NO_UTF32_CHECK flag at compile time or at run time, PCRE assumes that -the pattern or subject it is given (respectively) contains only valid UTF-32 -sequences. In this case, it does not diagnose an invalid UTF-32 string. -However, if an invalid string is passed, the result is undefined. -. -. -.SS "General comments about UTF modes" -.rs -.sp -1. Codepoints less than 256 can be specified in patterns by either braced or -unbraced hexadecimal escape sequences (for example, \ex{b3} or \exb3). Larger -values have to use braced sequences. -.P -2. Octal numbers up to \e777 are recognized, and in UTF-8 mode they match -two-byte characters for values greater than \e177. -.P -3. Repeat quantifiers apply to complete UTF characters, not to individual -data units, for example: \ex{100}{3}. -.P -4. The dot metacharacter matches one UTF character instead of a single data -unit. -.P -5. The escape sequence \eC can be used to match a single byte in UTF-8 mode, or -a single 16-bit data unit in UTF-16 mode, or a single 32-bit data unit in -UTF-32 mode, but its use can lead to some strange effects because it breaks up -multi-unit characters (see the description of \eC in the -.\" HREF -\fBpcrepattern\fP -.\" -documentation). The use of \eC is not supported in the alternative matching -function \fBpcre[16|32]_dfa_exec()\fP, nor is it supported in UTF mode by the -JIT optimization of \fBpcre[16|32]_exec()\fP. If JIT optimization is requested -for a UTF pattern that contains \eC, it will not succeed, and so the matching -will be carried out by the normal interpretive function. -.P -6. The character escapes \eb, \eB, \ed, \eD, \es, \eS, \ew, and \eW correctly -test characters of any code value, but, by default, the characters that PCRE -recognizes as digits, spaces, or word characters remain the same set as in -non-UTF mode, all with values less than 256. This remains true even when PCRE -is built to include Unicode property support, because to do otherwise would -slow down PCRE in many common cases. Note in particular that this applies to -\eb and \eB, because they are defined in terms of \ew and \eW. If you really -want to test for a wider sense of, say, "digit", you can use explicit Unicode -property tests such as \ep{Nd}. Alternatively, if you set the PCRE_UCP option, -the way that the character escapes work is changed so that Unicode properties -are used to determine which characters match. There are more details in the -section on -.\" HTML -.\" -generic character types -.\" -in the -.\" HREF -\fBpcrepattern\fP -.\" -documentation. -.P -7. Similarly, characters that match the POSIX named character classes are all -low-valued characters, unless the PCRE_UCP option is set. -.P -8. However, the horizontal and vertical white space matching escapes (\eh, \eH, -\ev, and \eV) do match all the appropriate Unicode characters, whether or not -PCRE_UCP is set. -.P -9. Case-insensitive matching applies only to characters whose values are less -than 128, unless PCRE is built with Unicode property support. A few Unicode -characters such as Greek sigma have more than two codepoints that are -case-equivalent. Up to and including PCRE release 8.31, only one-to-one case -mappings were supported, but later releases (with Unicode property support) do -treat as case-equivalent all versions of characters such as Greek sigma. -. -. -.SH AUTHOR -.rs -.sp -.nf -Philip Hazel -University Computing Service -Cambridge CB2 3QH, England. -.fi -. -. -.SH REVISION -.rs -.sp -.nf -Last updated: 27 February 2013 -Copyright (c) 1997-2013 University of Cambridge. -.fi diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/bin/pcre-config b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/bin/pcre-config deleted file mode 100755 index 282d092b..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/bin/pcre-config +++ /dev/null @@ -1,133 +0,0 @@ -#!/bin/sh - -prefix=/Users/sanchez/work/vied/ios/vpn/playground/ss-libev-build/ShadowSocks-libev-iOS/ShadowSocks-libev-iOS/pcre/pcre/armv7s -exec_prefix=${prefix} -exec_prefix_set=no - -cflags="[--cflags]" - -if test yes = yes ; then - libs="[--libs-cpp]" -else - libs= -fi - -if test no = yes ; then - libs="[--libs16] $libs" -fi - -if test no = yes ; then - libs="[--libs32] $libs" -fi - -if test yes = yes ; then - libs="[--libs] [--libs-posix] $libs" - cflags="$cflags [--cflags-posix]" -fi - -usage="Usage: pcre-config [--prefix] [--exec-prefix] [--version] $libs $cflags" - -if test $# -eq 0; then - echo "${usage}" 1>&2 - exit 1 -fi - -libR= -case `uname -s` in - *SunOS*) - libR=" -R${exec_prefix}/lib" - ;; - *BSD*) - libR=" -Wl,-R${exec_prefix}/lib" - ;; -esac - -libS= -if test ${exec_prefix}/lib != /usr/lib ; then - libS=-L${exec_prefix}/lib -fi - -while test $# -gt 0; do - case "$1" in - -*=*) optarg=`echo "$1" | sed 's/[-_a-zA-Z0-9]*=//'` ;; - *) optarg= ;; - esac - - case $1 in - --prefix=*) - prefix=$optarg - if test $exec_prefix_set = no ; then - exec_prefix=$optarg - fi - ;; - --prefix) - echo $prefix - ;; - --exec-prefix=*) - exec_prefix=$optarg - exec_prefix_set=yes - ;; - --exec-prefix) - echo $exec_prefix - ;; - --version) - echo 8.41 - ;; - --cflags) - if test ${prefix}/include != /usr/include ; then - includes=-I${prefix}/include - fi - echo $includes -DPCRE_STATIC - ;; - --cflags-posix) - if test yes = yes ; then - if test ${prefix}/include != /usr/include ; then - includes=-I${prefix}/include - fi - echo $includes -DPCRE_STATIC - else - echo "${usage}" 1>&2 - fi - ;; - --libs-posix) - if test yes = yes ; then - echo $libS$libR -lpcreposix -lpcre - else - echo "${usage}" 1>&2 - fi - ;; - --libs) - if test yes = yes ; then - echo $libS$libR -lpcre - else - echo "${usage}" 1>&2 - fi - ;; - --libs16) - if test no = yes ; then - echo $libS$libR -lpcre16 - else - echo "${usage}" 1>&2 - fi - ;; - --libs32) - if test no = yes ; then - echo $libS$libR -lpcre32 - else - echo "${usage}" 1>&2 - fi - ;; - --libs-cpp) - if test yes = yes ; then - echo $libS$libR -lpcrecpp -lpcre - else - echo "${usage}" 1>&2 - fi - ;; - *) - echo "${usage}" 1>&2 - exit 1 - ;; - esac - shift -done diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/bin/pcregrep b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/bin/pcregrep deleted file mode 100755 index 85eb7a3f36982e58ab0a66120fcf646310181358..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 237852 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ɠs{xgkS{Bx${Zxeis!7@*ek@D7x+%;J2xRTx| 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 diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/bin/pcretest b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/bin/pcretest deleted file mode 100755 index 05c6e4eb67e8022b20c2bad0b995642e464cc5ad..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 287384 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

      Perl-compatible Regular Expressions (PCRE)

      -

      -The HTML documentation for PCRE consists of a number of pages that are listed -below in alphabetical order. If you are new to PCRE, please read the first one -first. -

      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      pcre  Introductory page
      pcre-config  Information about the installation configuration
      pcre16  Discussion of the 16-bit PCRE library
      pcre32  Discussion of the 32-bit PCRE library
      pcreapi  PCRE's native API
      pcrebuild  Building PCRE
      pcrecallout  The callout facility
      pcrecompat  Compability with Perl
      pcrecpp  The C++ wrapper for the PCRE library
      pcredemo  A demonstration C program that uses the PCRE library
      pcregrep  The pcregrep command
      pcrejit  Discussion of the just-in-time optimization support
      pcrelimits  Details of size and other limits
      pcrematching  Discussion of the two matching algorithms
      pcrepartial  Using PCRE for partial matching
      pcrepattern  Specification of the regular expressions supported by PCRE
      pcreperform  Some comments on performance
      pcreposix  The POSIX API to the PCRE 8-bit library
      pcreprecompile  How to save and re-use compiled patterns
      pcresample  Discussion of the pcredemo program
      pcrestack  Discussion of PCRE's stack usage
      pcresyntax  Syntax quick-reference summary
      pcretest  The pcretest command for testing PCRE
      pcreunicode  Discussion of Unicode and UTF-8/UTF-16/UTF-32 support
      - -

      -There are also individual pages that summarize the interface for each function -in the library. There is a single page for each triple of 8-bit/16-bit/32-bit -functions. -

      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      pcre_assign_jit_stack  Assign stack for JIT matching
      pcre_compile  Compile a regular expression
      pcre_compile2  Compile a regular expression (alternate interface)
      pcre_config  Show build-time configuration options
      pcre_copy_named_substring  Extract named substring into given buffer
      pcre_copy_substring  Extract numbered substring into given buffer
      pcre_dfa_exec  Match a compiled pattern to a subject string - (DFA algorithm; not Perl compatible)
      pcre_exec  Match a compiled pattern to a subject string - (Perl compatible)
      pcre_free_study  Free study data
      pcre_free_substring  Free extracted substring
      pcre_free_substring_list  Free list of extracted substrings
      pcre_fullinfo  Extract information about a pattern
      pcre_get_named_substring  Extract named substring into new memory
      pcre_get_stringnumber  Convert captured string name to number
      pcre_get_stringtable_entries  Find table entries for given string name
      pcre_get_substring  Extract numbered substring into new memory
      pcre_get_substring_list  Extract all substrings into new memory
      pcre_jit_exec  Fast path interface to JIT matching
      pcre_jit_stack_alloc  Create a stack for JIT matching
      pcre_jit_stack_free  Free a JIT matching stack
      pcre_maketables  Build character tables in current locale
      pcre_pattern_to_host_byte_order  Convert compiled pattern to host byte order if necessary
      pcre_refcount  Maintain reference count in compiled pattern
      pcre_study  Study a compiled pattern
      pcre_utf16_to_host_byte_order  Convert UTF-16 string to host byte order if necessary
      pcre_utf32_to_host_byte_order  Convert UTF-32 string to host byte order if necessary
      pcre_version  Return PCRE version and release date
      - - diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcre-config.html b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcre-config.html deleted file mode 100644 index 56a80604..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcre-config.html +++ /dev/null @@ -1,109 +0,0 @@ - - -pcre-config specification - - -

      pcre-config man page

      -

      -Return to the PCRE index page. -

      -

      -This page is part of the PCRE HTML documentation. It was generated automatically -from the original man page. If there is any nonsense in it, please consult the -man page, in case the conversion went wrong. -
      -

      -
      SYNOPSIS
      -

      -pcre-config [--prefix] [--exec-prefix] [--version] [--libs] - [--libs16] [--libs32] [--libs-cpp] [--libs-posix] - [--cflags] [--cflags-posix] -

      -
      DESCRIPTION
      -

      -pcre-config returns the configuration of the installed PCRE -libraries and the options required to compile a program to use them. Some of -the options apply only to the 8-bit, or 16-bit, or 32-bit libraries, -respectively, and are -not available if only one of those libraries has been built. If an unavailable -option is encountered, the "usage" information is output. -

      -
      OPTIONS
      -

      ---prefix -Writes the directory prefix used in the PCRE installation for architecture -independent files (/usr on many systems, /usr/local on some -systems) to the standard output. -

      -

      ---exec-prefix -Writes the directory prefix used in the PCRE installation for architecture -dependent files (normally the same as --prefix) to the standard output. -

      -

      ---version -Writes the version number of the installed PCRE libraries to the standard -output. -

      -

      ---libs -Writes to the standard output the command line options required to link -with the 8-bit PCRE library (-lpcre on many systems). -

      -

      ---libs16 -Writes to the standard output the command line options required to link -with the 16-bit PCRE library (-lpcre16 on many systems). -

      -

      ---libs32 -Writes to the standard output the command line options required to link -with the 32-bit PCRE library (-lpcre32 on many systems). -

      -

      ---libs-cpp -Writes to the standard output the command line options required to link with -PCRE's C++ wrapper library (-lpcrecpp -lpcre on many -systems). -

      -

      ---libs-posix -Writes to the standard output the command line options required to link with -PCRE's POSIX API wrapper library (-lpcreposix -lpcre on many -systems). -

      -

      ---cflags -Writes to the standard output the command line options required to compile -files that use PCRE (this may include some -I options, but is blank on -many systems). -

      -

      ---cflags-posix -Writes to the standard output the command line options required to compile -files that use PCRE's POSIX API wrapper library (this may include some -I -options, but is blank on many systems). -

      -
      SEE ALSO
      -

      -pcre(3) -

      -
      AUTHOR
      -

      -This manual page was originally written by Mark Baker for the Debian GNU/Linux -system. It has been subsequently revised as a generic PCRE man page. -

      -
      REVISION
      -

      -Last updated: 24 June 2012 -
      -

      -Return to the PCRE index page. -

      diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcre.html b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcre.html deleted file mode 100644 index c87b1066..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcre.html +++ /dev/null @@ -1,224 +0,0 @@ - - -pcre specification - - -

      pcre man page

      -

      -Return to the PCRE index page. -

      -

      -This page is part of the PCRE HTML documentation. It was generated automatically -from the original man page. If there is any nonsense in it, please consult the -man page, in case the conversion went wrong. -
      -

      -
      PLEASE TAKE NOTE
      -

      -This document relates to PCRE releases that use the original API, -with library names libpcre, libpcre16, and libpcre32. January 2015 saw the -first release of a new API, known as PCRE2, with release numbers starting at -10.00 and library names libpcre2-8, libpcre2-16, and libpcre2-32. The old -libraries (now called PCRE1) are still being maintained for bug fixes, but -there will be no new development. New projects are advised to use the new PCRE2 -libraries. -

      -
      INTRODUCTION
      -

      -The PCRE library is a set of functions that implement regular expression -pattern matching using the same syntax and semantics as Perl, with just a few -differences. Some features that appeared in Python and PCRE before they -appeared in Perl are also available using the Python syntax, there is some -support for one or two .NET and Oniguruma syntax items, and there is an option -for requesting some minor changes that give better JavaScript compatibility. -

      -

      -Starting with release 8.30, it is possible to compile two separate PCRE -libraries: the original, which supports 8-bit character strings (including -UTF-8 strings), and a second library that supports 16-bit character strings -(including UTF-16 strings). The build process allows either one or both to be -built. The majority of the work to make this possible was done by Zoltan -Herczeg. -

      -

      -Starting with release 8.32 it is possible to compile a third separate PCRE -library that supports 32-bit character strings (including UTF-32 strings). The -build process allows any combination of the 8-, 16- and 32-bit libraries. The -work to make this possible was done by Christian Persch. -

      -

      -The three libraries contain identical sets of functions, except that the names -in the 16-bit library start with pcre16_ instead of pcre_, and the -names in the 32-bit library start with pcre32_ instead of pcre_. To -avoid over-complication and reduce the documentation maintenance load, most of -the documentation describes the 8-bit library, with the differences for the -16-bit and 32-bit libraries described separately in the -pcre16 -and -pcre32 -pages. References to functions or structures of the form pcre[16|32]_xxx -should be read as meaning "pcre_xxx when using the 8-bit library, -pcre16_xxx when using the 16-bit library, or pcre32_xxx when using -the 32-bit library". -

      -

      -The current implementation of PCRE corresponds approximately with Perl 5.12, -including support for UTF-8/16/32 encoded strings and Unicode general category -properties. However, UTF-8/16/32 and Unicode support has to be explicitly -enabled; it is not the default. The Unicode tables correspond to Unicode -release 6.3.0. -

      -

      -In addition to the Perl-compatible matching function, PCRE contains an -alternative function that matches the same compiled patterns in a different -way. In certain circumstances, the alternative function has some advantages. -For a discussion of the two matching algorithms, see the -pcrematching -page. -

      -

      -PCRE is written in C and released as a C library. A number of people have -written wrappers and interfaces of various kinds. In particular, Google Inc. -have provided a comprehensive C++ wrapper for the 8-bit library. This is now -included as part of the PCRE distribution. The -pcrecpp -page has details of this interface. Other people's contributions can be found -in the Contrib directory at the primary FTP site, which is: -ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre -

      -

      -Details of exactly which Perl regular expression features are and are not -supported by PCRE are given in separate documents. See the -pcrepattern -and -pcrecompat -pages. There is a syntax summary in the -pcresyntax -page. -

      -

      -Some features of PCRE can be included, excluded, or changed when the library is -built. The -pcre_config() -function makes it possible for a client to discover which features are -available. The features themselves are described in the -pcrebuild -page. Documentation about building PCRE for various operating systems can be -found in the -README -and -NON-AUTOTOOLS_BUILD -files in the source distribution. -

      -

      -The libraries contains a number of undocumented internal functions and data -tables that are used by more than one of the exported external functions, but -which are not intended for use by external callers. Their names all begin with -"_pcre_" or "_pcre16_" or "_pcre32_", which hopefully will not provoke any name -clashes. In some environments, it is possible to control which external symbols -are exported when a shared library is built, and in these cases the -undocumented symbols are not exported. -

      -
      SECURITY CONSIDERATIONS
      -

      -If you are using PCRE in a non-UTF application that permits users to supply -arbitrary patterns for compilation, you should be aware of a feature that -allows users to turn on UTF support from within a pattern, provided that PCRE -was built with UTF support. For example, an 8-bit pattern that begins with -"(*UTF8)" or "(*UTF)" turns on UTF-8 mode, which interprets patterns and -subjects as strings of UTF-8 characters instead of individual 8-bit characters. -This causes both the pattern and any data against which it is matched to be -checked for UTF-8 validity. If the data string is very long, such a check might -use sufficiently many resources as to cause your application to lose -performance. -

      -

      -One way of guarding against this possibility is to use the -pcre_fullinfo() function to check the compiled pattern's options for UTF. -Alternatively, from release 8.33, you can set the PCRE_NEVER_UTF option at -compile time. This causes an compile time error if a pattern contains a -UTF-setting sequence. -

      -

      -If your application is one that supports UTF, be aware that validity checking -can take time. If the same data string is to be matched many times, you can use -the PCRE_NO_UTF[8|16|32]_CHECK option for the second and subsequent matches to -save redundant checks. -

      -

      -Another way that performance can be hit is by running a pattern that has a very -large search tree against a string that will never match. Nested unlimited -repeats in a pattern are a common example. PCRE provides some protection -against this: see the PCRE_EXTRA_MATCH_LIMIT feature in the -pcreapi -page. -

      -
      USER DOCUMENTATION
      -

      -The user documentation for PCRE comprises a number of different sections. In -the "man" format, each of these is a separate "man page". In the HTML format, -each is a separate page, linked from the index page. In the plain text format, -the descriptions of the pcregrep and pcretest programs are in files -called pcregrep.txt and pcretest.txt, respectively. The remaining -sections, except for the pcredemo section (which is a program listing), -are concatenated in pcre.txt, for ease of searching. The sections are as -follows: -

      -  pcre              this document
      -  pcre-config       show PCRE installation configuration information
      -  pcre16            details of the 16-bit library
      -  pcre32            details of the 32-bit library
      -  pcreapi           details of PCRE's native C API
      -  pcrebuild         building PCRE
      -  pcrecallout       details of the callout feature
      -  pcrecompat        discussion of Perl compatibility
      -  pcrecpp           details of the C++ wrapper for the 8-bit library
      -  pcredemo          a demonstration C program that uses PCRE
      -  pcregrep          description of the pcregrep command (8-bit only)
      -  pcrejit           discussion of the just-in-time optimization support
      -  pcrelimits        details of size and other limits
      -  pcrematching      discussion of the two matching algorithms
      -  pcrepartial       details of the partial matching facility
      -  pcrepattern       syntax and semantics of supported regular expressions
      -  pcreperform       discussion of performance issues
      -  pcreposix         the POSIX-compatible C API for the 8-bit library
      -  pcreprecompile    details of saving and re-using precompiled patterns
      -  pcresample        discussion of the pcredemo program
      -  pcrestack         discussion of stack usage
      -  pcresyntax        quick syntax reference
      -  pcretest          description of the pcretest testing command
      -  pcreunicode       discussion of Unicode and UTF-8/16/32 support
      -
      -In the "man" and HTML formats, there is also a short page for each C library -function, listing its arguments and results. -

      -
      AUTHOR
      -

      -Philip Hazel -
      -University Computing Service -
      -Cambridge CB2 3QH, England. -
      -

      -

      -Putting an actual email address here seems to have been a spam magnet, so I've -taken it away. If you want to email me, use my two initials, followed by the -two digits 10, at the domain cam.ac.uk. -

      -
      REVISION
      -

      -Last updated: 10 February 2015 -
      -Copyright © 1997-2015 University of Cambridge. -
      -

      -Return to the PCRE index page. -

      diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcre16.html b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcre16.html deleted file mode 100644 index f00859f0..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcre16.html +++ /dev/null @@ -1,384 +0,0 @@ - - -pcre16 specification - - -

      pcre16 man page

      -

      -Return to the PCRE index page. -

      -

      -This page is part of the PCRE HTML documentation. It was generated automatically -from the original man page. If there is any nonsense in it, please consult the -man page, in case the conversion went wrong. -
      -

      -

      -#include <pcre.h> -

      -
      PCRE 16-BIT API BASIC FUNCTIONS
      -

      -pcre16 *pcre16_compile(PCRE_SPTR16 pattern, int options, - const char **errptr, int *erroffset, - const unsigned char *tableptr); -
      -
      -pcre16 *pcre16_compile2(PCRE_SPTR16 pattern, int options, - int *errorcodeptr, - const char **errptr, int *erroffset, - const unsigned char *tableptr); -
      -
      -pcre16_extra *pcre16_study(const pcre16 *code, int options, - const char **errptr); -
      -
      -void pcre16_free_study(pcre16_extra *extra); -
      -
      -int pcre16_exec(const pcre16 *code, const pcre16_extra *extra, - PCRE_SPTR16 subject, int length, int startoffset, - int options, int *ovector, int ovecsize); -
      -
      -int pcre16_dfa_exec(const pcre16 *code, const pcre16_extra *extra, - PCRE_SPTR16 subject, int length, int startoffset, - int options, int *ovector, int ovecsize, - int *workspace, int wscount); -

      -
      PCRE 16-BIT API STRING EXTRACTION FUNCTIONS
      -

      -int pcre16_copy_named_substring(const pcre16 *code, - PCRE_SPTR16 subject, int *ovector, - int stringcount, PCRE_SPTR16 stringname, - PCRE_UCHAR16 *buffer, int buffersize); -
      -
      -int pcre16_copy_substring(PCRE_SPTR16 subject, int *ovector, - int stringcount, int stringnumber, PCRE_UCHAR16 *buffer, - int buffersize); -
      -
      -int pcre16_get_named_substring(const pcre16 *code, - PCRE_SPTR16 subject, int *ovector, - int stringcount, PCRE_SPTR16 stringname, - PCRE_SPTR16 *stringptr); -
      -
      -int pcre16_get_stringnumber(const pcre16 *code, -" PCRE_SPTR16 name); -
      -
      -int pcre16_get_stringtable_entries(const pcre16 *code, - PCRE_SPTR16 name, PCRE_UCHAR16 **first, PCRE_UCHAR16 **last); -
      -
      -int pcre16_get_substring(PCRE_SPTR16 subject, int *ovector, - int stringcount, int stringnumber, - PCRE_SPTR16 *stringptr); -
      -
      -int pcre16_get_substring_list(PCRE_SPTR16 subject, - int *ovector, int stringcount, PCRE_SPTR16 **listptr); -
      -
      -void pcre16_free_substring(PCRE_SPTR16 stringptr); -
      -
      -void pcre16_free_substring_list(PCRE_SPTR16 *stringptr); -

      -
      PCRE 16-BIT API AUXILIARY FUNCTIONS
      -

      -pcre16_jit_stack *pcre16_jit_stack_alloc(int startsize, int maxsize); -
      -
      -void pcre16_jit_stack_free(pcre16_jit_stack *stack); -
      -
      -void pcre16_assign_jit_stack(pcre16_extra *extra, - pcre16_jit_callback callback, void *data); -
      -
      -const unsigned char *pcre16_maketables(void); -
      -
      -int pcre16_fullinfo(const pcre16 *code, const pcre16_extra *extra, - int what, void *where); -
      -
      -int pcre16_refcount(pcre16 *code, int adjust); -
      -
      -int pcre16_config(int what, void *where); -
      -
      -const char *pcre16_version(void); -
      -
      -int pcre16_pattern_to_host_byte_order(pcre16 *code, - pcre16_extra *extra, const unsigned char *tables); -

      -
      PCRE 16-BIT API INDIRECTED FUNCTIONS
      -

      -void *(*pcre16_malloc)(size_t); -
      -
      -void (*pcre16_free)(void *); -
      -
      -void *(*pcre16_stack_malloc)(size_t); -
      -
      -void (*pcre16_stack_free)(void *); -
      -
      -int (*pcre16_callout)(pcre16_callout_block *); -

      -
      PCRE 16-BIT API 16-BIT-ONLY FUNCTION
      -

      -int pcre16_utf16_to_host_byte_order(PCRE_UCHAR16 *output, - PCRE_SPTR16 input, int length, int *byte_order, - int keep_boms); -

      -
      THE PCRE 16-BIT LIBRARY
      -

      -Starting with release 8.30, it is possible to compile a PCRE library that -supports 16-bit character strings, including UTF-16 strings, as well as or -instead of the original 8-bit library. The majority of the work to make this -possible was done by Zoltan Herczeg. The two libraries contain identical sets -of functions, used in exactly the same way. Only the names of the functions and -the data types of their arguments and results are different. To avoid -over-complication and reduce the documentation maintenance load, most of the -PCRE documentation describes the 8-bit library, with only occasional references -to the 16-bit library. This page describes what is different when you use the -16-bit library. -

      -

      -WARNING: A single application can be linked with both libraries, but you must -take care when processing any particular pattern to use functions from just one -library. For example, if you want to study a pattern that was compiled with -pcre16_compile(), you must do so with pcre16_study(), not -pcre_study(), and you must free the study data with -pcre16_free_study(). -

      -
      THE HEADER FILE
      -

      -There is only one header file, pcre.h. It contains prototypes for all the -functions in all libraries, as well as definitions of flags, structures, error -codes, etc. -

      -
      THE LIBRARY NAME
      -

      -In Unix-like systems, the 16-bit library is called libpcre16, and can -normally be accesss by adding -lpcre16 to the command for linking an -application that uses PCRE. -

      -
      STRING TYPES
      -

      -In the 8-bit library, strings are passed to PCRE library functions as vectors -of bytes with the C type "char *". In the 16-bit library, strings are passed as -vectors of unsigned 16-bit quantities. The macro PCRE_UCHAR16 specifies an -appropriate data type, and PCRE_SPTR16 is defined as "const PCRE_UCHAR16 *". In -very many environments, "short int" is a 16-bit data type. When PCRE is built, -it defines PCRE_UCHAR16 as "unsigned short int", but checks that it really is a -16-bit data type. If it is not, the build fails with an error message telling -the maintainer to modify the definition appropriately. -

      -
      STRUCTURE TYPES
      -

      -The types of the opaque structures that are used for compiled 16-bit patterns -and JIT stacks are pcre16 and pcre16_jit_stack respectively. The -type of the user-accessible structure that is returned by pcre16_study() -is pcre16_extra, and the type of the structure that is used for passing -data to a callout function is pcre16_callout_block. These structures -contain the same fields, with the same names, as their 8-bit counterparts. The -only difference is that pointers to character strings are 16-bit instead of -8-bit types. -

      -
      16-BIT FUNCTIONS
      -

      -For every function in the 8-bit library there is a corresponding function in -the 16-bit library with a name that starts with pcre16_ instead of -pcre_. The prototypes are listed above. In addition, there is one extra -function, pcre16_utf16_to_host_byte_order(). This is a utility function -that converts a UTF-16 character string to host byte order if necessary. The -other 16-bit functions expect the strings they are passed to be in host byte -order. -

      -

      -The input and output arguments of -pcre16_utf16_to_host_byte_order() may point to the same address, that is, -conversion in place is supported. The output buffer must be at least as long as -the input. -

      -

      -The length argument specifies the number of 16-bit data units in the -input string; a negative value specifies a zero-terminated string. -

      -

      -If byte_order is NULL, it is assumed that the string starts off in host -byte order. This may be changed by byte-order marks (BOMs) anywhere in the -string (commonly as the first character). -

      -

      -If byte_order is not NULL, a non-zero value of the integer to which it -points means that the input starts off in host byte order, otherwise the -opposite order is assumed. Again, BOMs in the string can change this. The final -byte order is passed back at the end of processing. -

      -

      -If keep_boms is not zero, byte-order mark characters (0xfeff) are copied -into the output string. Otherwise they are discarded. -

      -

      -The result of the function is the number of 16-bit units placed into the output -buffer, including the zero terminator if the string was zero-terminated. -

      -
      SUBJECT STRING OFFSETS
      -

      -The lengths and starting offsets of subject strings must be specified in 16-bit -data units, and the offsets within subject strings that are returned by the -matching functions are in also 16-bit units rather than bytes. -

      -
      NAMED SUBPATTERNS
      -

      -The name-to-number translation table that is maintained for named subpatterns -uses 16-bit characters. The pcre16_get_stringtable_entries() function -returns the length of each entry in the table as the number of 16-bit data -units. -

      -
      OPTION NAMES
      -

      -There are two new general option names, PCRE_UTF16 and PCRE_NO_UTF16_CHECK, -which correspond to PCRE_UTF8 and PCRE_NO_UTF8_CHECK in the 8-bit library. In -fact, these new options define the same bits in the options word. There is a -discussion about the -validity of UTF-16 strings -in the -pcreunicode -page. -

      -

      -For the pcre16_config() function there is an option PCRE_CONFIG_UTF16 -that returns 1 if UTF-16 support is configured, otherwise 0. If this option is -given to pcre_config() or pcre32_config(), or if the -PCRE_CONFIG_UTF8 or PCRE_CONFIG_UTF32 option is given to pcre16_config(), -the result is the PCRE_ERROR_BADOPTION error. -

      -
      CHARACTER CODES
      -

      -In 16-bit mode, when PCRE_UTF16 is not set, character values are treated in the -same way as in 8-bit, non UTF-8 mode, except, of course, that they can range -from 0 to 0xffff instead of 0 to 0xff. Character types for characters less than -0xff can therefore be influenced by the locale in the same way as before. -Characters greater than 0xff have only one case, and no "type" (such as letter -or digit). -

      -

      -In UTF-16 mode, the character code is Unicode, in the range 0 to 0x10ffff, with -the exception of values in the range 0xd800 to 0xdfff because those are -"surrogate" values that are used in pairs to encode values greater than 0xffff. -

      -

      -A UTF-16 string can indicate its endianness by special code knows as a -byte-order mark (BOM). The PCRE functions do not handle this, expecting strings -to be in host byte order. A utility function called -pcre16_utf16_to_host_byte_order() is provided to help with this (see -above). -

      -
      ERROR NAMES
      -

      -The errors PCRE_ERROR_BADUTF16_OFFSET and PCRE_ERROR_SHORTUTF16 correspond to -their 8-bit counterparts. The error PCRE_ERROR_BADMODE is given when a compiled -pattern is passed to a function that processes patterns in the other -mode, for example, if a pattern compiled with pcre_compile() is passed to -pcre16_exec(). -

      -

      -There are new error codes whose names begin with PCRE_UTF16_ERR for invalid -UTF-16 strings, corresponding to the PCRE_UTF8_ERR codes for UTF-8 strings that -are described in the section entitled -"Reason codes for invalid UTF-8 strings" -in the main -pcreapi -page. The UTF-16 errors are: -

      -  PCRE_UTF16_ERR1  Missing low surrogate at end of string
      -  PCRE_UTF16_ERR2  Invalid low surrogate follows high surrogate
      -  PCRE_UTF16_ERR3  Isolated low surrogate
      -  PCRE_UTF16_ERR4  Non-character
      -
      -

      -
      ERROR TEXTS
      -

      -If there is an error while compiling a pattern, the error text that is passed -back by pcre16_compile() or pcre16_compile2() is still an 8-bit -character string, zero-terminated. -

      -
      CALLOUTS
      -

      -The subject and mark fields in the callout block that is passed to -a callout function point to 16-bit vectors. -

      -
      TESTING
      -

      -The pcretest program continues to operate with 8-bit input and output -files, but it can be used for testing the 16-bit library. If it is run with the -command line option -16, patterns and subject strings are converted from -8-bit to 16-bit before being passed to PCRE, and the 16-bit library functions -are used instead of the 8-bit ones. Returned 16-bit strings are converted to -8-bit for output. If both the 8-bit and the 32-bit libraries were not compiled, -pcretest defaults to 16-bit and the -16 option is ignored. -

      -

      -When PCRE is being built, the RunTest script that is called by "make -check" uses the pcretest -C option to discover which of the 8-bit, -16-bit and 32-bit libraries has been built, and runs the tests appropriately. -

      -
      NOT SUPPORTED IN 16-BIT MODE
      -

      -Not all the features of the 8-bit library are available with the 16-bit -library. The C++ and POSIX wrapper functions support only the 8-bit library, -and the pcregrep program is at present 8-bit only. -

      -
      AUTHOR
      -

      -Philip Hazel -
      -University Computing Service -
      -Cambridge CB2 3QH, England. -
      -

      -
      REVISION
      -

      -Last updated: 12 May 2013 -
      -Copyright © 1997-2013 University of Cambridge. -
      -

      -Return to the PCRE index page. -

      diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcre32.html b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcre32.html deleted file mode 100644 index f96876e7..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcre32.html +++ /dev/null @@ -1,382 +0,0 @@ - - -pcre32 specification - - -

      pcre32 man page

      -

      -Return to the PCRE index page. -

      -

      -This page is part of the PCRE HTML documentation. It was generated automatically -from the original man page. If there is any nonsense in it, please consult the -man page, in case the conversion went wrong. -
      -

      -

      -#include <pcre.h> -

      -
      PCRE 32-BIT API BASIC FUNCTIONS
      -

      -pcre32 *pcre32_compile(PCRE_SPTR32 pattern, int options, - const char **errptr, int *erroffset, - const unsigned char *tableptr); -
      -
      -pcre32 *pcre32_compile2(PCRE_SPTR32 pattern, int options, - int *errorcodeptr, - const unsigned char *tableptr); -
      -
      -pcre32_extra *pcre32_study(const pcre32 *code, int options, - const char **errptr); -
      -
      -void pcre32_free_study(pcre32_extra *extra); -
      -
      -int pcre32_exec(const pcre32 *code, const pcre32_extra *extra, - PCRE_SPTR32 subject, int length, int startoffset, - int options, int *ovector, int ovecsize); -
      -
      -int pcre32_dfa_exec(const pcre32 *code, const pcre32_extra *extra, - PCRE_SPTR32 subject, int length, int startoffset, - int options, int *ovector, int ovecsize, - int *workspace, int wscount); -

      -
      PCRE 32-BIT API STRING EXTRACTION FUNCTIONS
      -

      -int pcre32_copy_named_substring(const pcre32 *code, - PCRE_SPTR32 subject, int *ovector, - int stringcount, PCRE_SPTR32 stringname, - PCRE_UCHAR32 *buffer, int buffersize); -
      -
      -int pcre32_copy_substring(PCRE_SPTR32 subject, int *ovector, - int stringcount, int stringnumber, PCRE_UCHAR32 *buffer, - int buffersize); -
      -
      -int pcre32_get_named_substring(const pcre32 *code, - PCRE_SPTR32 subject, int *ovector, - int stringcount, PCRE_SPTR32 stringname, - PCRE_SPTR32 *stringptr); -
      -
      -int pcre32_get_stringnumber(const pcre32 *code, - PCRE_SPTR32 name); -
      -
      -int pcre32_get_stringtable_entries(const pcre32 *code, - PCRE_SPTR32 name, PCRE_UCHAR32 **first, PCRE_UCHAR32 **last); -
      -
      -int pcre32_get_substring(PCRE_SPTR32 subject, int *ovector, - int stringcount, int stringnumber, - PCRE_SPTR32 *stringptr); -
      -
      -int pcre32_get_substring_list(PCRE_SPTR32 subject, - int *ovector, int stringcount, PCRE_SPTR32 **listptr); -
      -
      -void pcre32_free_substring(PCRE_SPTR32 stringptr); -
      -
      -void pcre32_free_substring_list(PCRE_SPTR32 *stringptr); -

      -
      PCRE 32-BIT API AUXILIARY FUNCTIONS
      -

      -pcre32_jit_stack *pcre32_jit_stack_alloc(int startsize, int maxsize); -
      -
      -void pcre32_jit_stack_free(pcre32_jit_stack *stack); -
      -
      -void pcre32_assign_jit_stack(pcre32_extra *extra, - pcre32_jit_callback callback, void *data); -
      -
      -const unsigned char *pcre32_maketables(void); -
      -
      -int pcre32_fullinfo(const pcre32 *code, const pcre32_extra *extra, - int what, void *where); -
      -
      -int pcre32_refcount(pcre32 *code, int adjust); -
      -
      -int pcre32_config(int what, void *where); -
      -
      -const char *pcre32_version(void); -
      -
      -int pcre32_pattern_to_host_byte_order(pcre32 *code, - pcre32_extra *extra, const unsigned char *tables); -

      -
      PCRE 32-BIT API INDIRECTED FUNCTIONS
      -

      -void *(*pcre32_malloc)(size_t); -
      -
      -void (*pcre32_free)(void *); -
      -
      -void *(*pcre32_stack_malloc)(size_t); -
      -
      -void (*pcre32_stack_free)(void *); -
      -
      -int (*pcre32_callout)(pcre32_callout_block *); -

      -
      PCRE 32-BIT API 32-BIT-ONLY FUNCTION
      -

      -int pcre32_utf32_to_host_byte_order(PCRE_UCHAR32 *output, - PCRE_SPTR32 input, int length, int *byte_order, - int keep_boms); -

      -
      THE PCRE 32-BIT LIBRARY
      -

      -Starting with release 8.32, it is possible to compile a PCRE library that -supports 32-bit character strings, including UTF-32 strings, as well as or -instead of the original 8-bit library. This work was done by Christian Persch, -based on the work done by Zoltan Herczeg for the 16-bit library. All three -libraries contain identical sets of functions, used in exactly the same way. -Only the names of the functions and the data types of their arguments and -results are different. To avoid over-complication and reduce the documentation -maintenance load, most of the PCRE documentation describes the 8-bit library, -with only occasional references to the 16-bit and 32-bit libraries. This page -describes what is different when you use the 32-bit library. -

      -

      -WARNING: A single application can be linked with all or any of the three -libraries, but you must take care when processing any particular pattern -to use functions from just one library. For example, if you want to study -a pattern that was compiled with pcre32_compile(), you must do so -with pcre32_study(), not pcre_study(), and you must free the -study data with pcre32_free_study(). -

      -
      THE HEADER FILE
      -

      -There is only one header file, pcre.h. It contains prototypes for all the -functions in all libraries, as well as definitions of flags, structures, error -codes, etc. -

      -
      THE LIBRARY NAME
      -

      -In Unix-like systems, the 32-bit library is called libpcre32, and can -normally be accesss by adding -lpcre32 to the command for linking an -application that uses PCRE. -

      -
      STRING TYPES
      -

      -In the 8-bit library, strings are passed to PCRE library functions as vectors -of bytes with the C type "char *". In the 32-bit library, strings are passed as -vectors of unsigned 32-bit quantities. The macro PCRE_UCHAR32 specifies an -appropriate data type, and PCRE_SPTR32 is defined as "const PCRE_UCHAR32 *". In -very many environments, "unsigned int" is a 32-bit data type. When PCRE is -built, it defines PCRE_UCHAR32 as "unsigned int", but checks that it really is -a 32-bit data type. If it is not, the build fails with an error message telling -the maintainer to modify the definition appropriately. -

      -
      STRUCTURE TYPES
      -

      -The types of the opaque structures that are used for compiled 32-bit patterns -and JIT stacks are pcre32 and pcre32_jit_stack respectively. The -type of the user-accessible structure that is returned by pcre32_study() -is pcre32_extra, and the type of the structure that is used for passing -data to a callout function is pcre32_callout_block. These structures -contain the same fields, with the same names, as their 8-bit counterparts. The -only difference is that pointers to character strings are 32-bit instead of -8-bit types. -

      -
      32-BIT FUNCTIONS
      -

      -For every function in the 8-bit library there is a corresponding function in -the 32-bit library with a name that starts with pcre32_ instead of -pcre_. The prototypes are listed above. In addition, there is one extra -function, pcre32_utf32_to_host_byte_order(). This is a utility function -that converts a UTF-32 character string to host byte order if necessary. The -other 32-bit functions expect the strings they are passed to be in host byte -order. -

      -

      -The input and output arguments of -pcre32_utf32_to_host_byte_order() may point to the same address, that is, -conversion in place is supported. The output buffer must be at least as long as -the input. -

      -

      -The length argument specifies the number of 32-bit data units in the -input string; a negative value specifies a zero-terminated string. -

      -

      -If byte_order is NULL, it is assumed that the string starts off in host -byte order. This may be changed by byte-order marks (BOMs) anywhere in the -string (commonly as the first character). -

      -

      -If byte_order is not NULL, a non-zero value of the integer to which it -points means that the input starts off in host byte order, otherwise the -opposite order is assumed. Again, BOMs in the string can change this. The final -byte order is passed back at the end of processing. -

      -

      -If keep_boms is not zero, byte-order mark characters (0xfeff) are copied -into the output string. Otherwise they are discarded. -

      -

      -The result of the function is the number of 32-bit units placed into the output -buffer, including the zero terminator if the string was zero-terminated. -

      -
      SUBJECT STRING OFFSETS
      -

      -The lengths and starting offsets of subject strings must be specified in 32-bit -data units, and the offsets within subject strings that are returned by the -matching functions are in also 32-bit units rather than bytes. -

      -
      NAMED SUBPATTERNS
      -

      -The name-to-number translation table that is maintained for named subpatterns -uses 32-bit characters. The pcre32_get_stringtable_entries() function -returns the length of each entry in the table as the number of 32-bit data -units. -

      -
      OPTION NAMES
      -

      -There are two new general option names, PCRE_UTF32 and PCRE_NO_UTF32_CHECK, -which correspond to PCRE_UTF8 and PCRE_NO_UTF8_CHECK in the 8-bit library. In -fact, these new options define the same bits in the options word. There is a -discussion about the -validity of UTF-32 strings -in the -pcreunicode -page. -

      -

      -For the pcre32_config() function there is an option PCRE_CONFIG_UTF32 -that returns 1 if UTF-32 support is configured, otherwise 0. If this option is -given to pcre_config() or pcre16_config(), or if the -PCRE_CONFIG_UTF8 or PCRE_CONFIG_UTF16 option is given to pcre32_config(), -the result is the PCRE_ERROR_BADOPTION error. -

      -
      CHARACTER CODES
      -

      -In 32-bit mode, when PCRE_UTF32 is not set, character values are treated in the -same way as in 8-bit, non UTF-8 mode, except, of course, that they can range -from 0 to 0x7fffffff instead of 0 to 0xff. Character types for characters less -than 0xff can therefore be influenced by the locale in the same way as before. -Characters greater than 0xff have only one case, and no "type" (such as letter -or digit). -

      -

      -In UTF-32 mode, the character code is Unicode, in the range 0 to 0x10ffff, with -the exception of values in the range 0xd800 to 0xdfff because those are -"surrogate" values that are ill-formed in UTF-32. -

      -

      -A UTF-32 string can indicate its endianness by special code knows as a -byte-order mark (BOM). The PCRE functions do not handle this, expecting strings -to be in host byte order. A utility function called -pcre32_utf32_to_host_byte_order() is provided to help with this (see -above). -

      -
      ERROR NAMES
      -

      -The error PCRE_ERROR_BADUTF32 corresponds to its 8-bit counterpart. -The error PCRE_ERROR_BADMODE is given when a compiled -pattern is passed to a function that processes patterns in the other -mode, for example, if a pattern compiled with pcre_compile() is passed to -pcre32_exec(). -

      -

      -There are new error codes whose names begin with PCRE_UTF32_ERR for invalid -UTF-32 strings, corresponding to the PCRE_UTF8_ERR codes for UTF-8 strings that -are described in the section entitled -"Reason codes for invalid UTF-8 strings" -in the main -pcreapi -page. The UTF-32 errors are: -

      -  PCRE_UTF32_ERR1  Surrogate character (range from 0xd800 to 0xdfff)
      -  PCRE_UTF32_ERR2  Non-character
      -  PCRE_UTF32_ERR3  Character > 0x10ffff
      -
      -

      -
      ERROR TEXTS
      -

      -If there is an error while compiling a pattern, the error text that is passed -back by pcre32_compile() or pcre32_compile2() is still an 8-bit -character string, zero-terminated. -

      -
      CALLOUTS
      -

      -The subject and mark fields in the callout block that is passed to -a callout function point to 32-bit vectors. -

      -
      TESTING
      -

      -The pcretest program continues to operate with 8-bit input and output -files, but it can be used for testing the 32-bit library. If it is run with the -command line option -32, patterns and subject strings are converted from -8-bit to 32-bit before being passed to PCRE, and the 32-bit library functions -are used instead of the 8-bit ones. Returned 32-bit strings are converted to -8-bit for output. If both the 8-bit and the 16-bit libraries were not compiled, -pcretest defaults to 32-bit and the -32 option is ignored. -

      -

      -When PCRE is being built, the RunTest script that is called by "make -check" uses the pcretest -C option to discover which of the 8-bit, -16-bit and 32-bit libraries has been built, and runs the tests appropriately. -

      -
      NOT SUPPORTED IN 32-BIT MODE
      -

      -Not all the features of the 8-bit library are available with the 32-bit -library. The C++ and POSIX wrapper functions support only the 8-bit library, -and the pcregrep program is at present 8-bit only. -

      -
      AUTHOR
      -

      -Philip Hazel -
      -University Computing Service -
      -Cambridge CB2 3QH, England. -
      -

      -
      REVISION
      -

      -Last updated: 12 May 2013 -
      -Copyright © 1997-2013 University of Cambridge. -
      -

      -Return to the PCRE index page. -

      diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcre_assign_jit_stack.html b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcre_assign_jit_stack.html deleted file mode 100644 index b2eef704..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcre_assign_jit_stack.html +++ /dev/null @@ -1,76 +0,0 @@ - - -pcre_assign_jit_stack specification - - -

      pcre_assign_jit_stack man page

      -

      -Return to the PCRE index page. -

      -

      -This page is part of the PCRE HTML documentation. It was generated automatically -from the original man page. If there is any nonsense in it, please consult the -man page, in case the conversion went wrong. -
      -
      -SYNOPSIS -
      -

      -#include <pcre.h> -

      -

      -void pcre_assign_jit_stack(pcre_extra *extra, - pcre_jit_callback callback, void *data); -
      -
      -void pcre16_assign_jit_stack(pcre16_extra *extra, - pcre16_jit_callback callback, void *data); -
      -
      -void pcre32_assign_jit_stack(pcre32_extra *extra, - pcre32_jit_callback callback, void *data); -

      -
      -DESCRIPTION -
      -

      -This function provides control over the memory used as a stack at run-time by a -call to pcre[16|32]_exec() with a pattern that has been successfully -compiled with JIT optimization. The arguments are: -

      -  extra     the data pointer returned by pcre[16|32]_study()
      -  callback  a callback function
      -  data      a JIT stack or a value to be passed to the callback
      -              function
      -
      -

      -

      -If callback is NULL and data is NULL, an internal 32K block on -the machine stack is used. -

      -

      -If callback is NULL and data is not NULL, data must -be a valid JIT stack, the result of calling pcre[16|32]_jit_stack_alloc(). -

      -

      -If callback not NULL, it is called with data as an argument at -the start of matching, in order to set up a JIT stack. If the result is NULL, -the internal 32K stack is used; otherwise the return value must be a valid JIT -stack, the result of calling pcre[16|32]_jit_stack_alloc(). -

      -

      -You may safely assign the same JIT stack to multiple patterns, as long as they -are all matched in the same thread. In a multithread application, each thread -must use its own JIT stack. For more details, see the -pcrejit -page. -

      -

      -There is a complete description of the PCRE native API in the -pcreapi -page and a description of the POSIX API in the -pcreposix -page. -

      -Return to the PCRE index page. -

      diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcre_compile.html b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcre_compile.html deleted file mode 100644 index 95b4bec6..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcre_compile.html +++ /dev/null @@ -1,111 +0,0 @@ - - -pcre_compile specification - - -

      pcre_compile man page

      -

      -Return to the PCRE index page. -

      -

      -This page is part of the PCRE HTML documentation. It was generated automatically -from the original man page. If there is any nonsense in it, please consult the -man page, in case the conversion went wrong. -
      -
      -SYNOPSIS -
      -

      -#include <pcre.h> -

      -

      -pcre *pcre_compile(const char *pattern, int options, - const char **errptr, int *erroffset, - const unsigned char *tableptr); -
      -
      -pcre16 *pcre16_compile(PCRE_SPTR16 pattern, int options, - const char **errptr, int *erroffset, - const unsigned char *tableptr); -
      -
      -pcre32 *pcre32_compile(PCRE_SPTR32 pattern, int options, - const char **errptr, int *erroffset, - const unsigned char *tableptr); -

      -
      -DESCRIPTION -
      -

      -This function compiles a regular expression into an internal form. It is the -same as pcre[16|32]_compile2(), except for the absence of the -errorcodeptr argument. Its arguments are: -

      -  pattern       A zero-terminated string containing the
      -                  regular expression to be compiled
      -  options       Zero or more option bits
      -  errptr        Where to put an error message
      -  erroffset     Offset in pattern where error was found
      -  tableptr      Pointer to character tables, or NULL to
      -                  use the built-in default
      -
      -The option bits are: -
      -  PCRE_ANCHORED           Force pattern anchoring
      -  PCRE_AUTO_CALLOUT       Compile automatic callouts
      -  PCRE_BSR_ANYCRLF        \R matches only CR, LF, or CRLF
      -  PCRE_BSR_UNICODE        \R matches all Unicode line endings
      -  PCRE_CASELESS           Do caseless matching
      -  PCRE_DOLLAR_ENDONLY     $ not to match newline at end
      -  PCRE_DOTALL             . matches anything including NL
      -  PCRE_DUPNAMES           Allow duplicate names for subpatterns
      -  PCRE_EXTENDED           Ignore white space and # comments
      -  PCRE_EXTRA              PCRE extra features
      -                            (not much use currently)
      -  PCRE_FIRSTLINE          Force matching to be before newline
      -  PCRE_JAVASCRIPT_COMPAT  JavaScript compatibility
      -  PCRE_MULTILINE          ^ and $ match newlines within data
      -  PCRE_NEVER_UTF          Lock out UTF, e.g. via (*UTF)
      -  PCRE_NEWLINE_ANY        Recognize any Unicode newline sequence
      -  PCRE_NEWLINE_ANYCRLF    Recognize CR, LF, and CRLF as newline
      -                            sequences
      -  PCRE_NEWLINE_CR         Set CR as the newline sequence
      -  PCRE_NEWLINE_CRLF       Set CRLF as the newline sequence
      -  PCRE_NEWLINE_LF         Set LF as the newline sequence
      -  PCRE_NO_AUTO_CAPTURE    Disable numbered capturing paren-
      -                            theses (named ones available)
      -  PCRE_NO_AUTO_POSSESS    Disable auto-possessification
      -  PCRE_NO_START_OPTIMIZE  Disable match-time start optimizations
      -  PCRE_NO_UTF16_CHECK     Do not check the pattern for UTF-16
      -                            validity (only relevant if
      -                            PCRE_UTF16 is set)
      -  PCRE_NO_UTF32_CHECK     Do not check the pattern for UTF-32
      -                            validity (only relevant if
      -                            PCRE_UTF32 is set)
      -  PCRE_NO_UTF8_CHECK      Do not check the pattern for UTF-8
      -                            validity (only relevant if
      -                            PCRE_UTF8 is set)
      -  PCRE_UCP                Use Unicode properties for \d, \w, etc.
      -  PCRE_UNGREEDY           Invert greediness of quantifiers
      -  PCRE_UTF16              Run in pcre16_compile() UTF-16 mode
      -  PCRE_UTF32              Run in pcre32_compile() UTF-32 mode
      -  PCRE_UTF8               Run in pcre_compile() UTF-8 mode
      -
      -PCRE must be built with UTF support in order to use PCRE_UTF8/16/32 and -PCRE_NO_UTF8/16/32_CHECK, and with UCP support if PCRE_UCP is used. -

      -

      -The yield of the function is a pointer to a private data structure that -contains the compiled pattern, or NULL if an error was detected. Note that -compiling regular expressions with one version of PCRE for use with a different -version is not guaranteed to work and may cause crashes. -

      -

      -There is a complete description of the PCRE native API in the -pcreapi -page and a description of the POSIX API in the -pcreposix -page. -

      -Return to the PCRE index page. -

      diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcre_compile2.html b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcre_compile2.html deleted file mode 100644 index 9cd56a23..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcre_compile2.html +++ /dev/null @@ -1,115 +0,0 @@ - - -pcre_compile2 specification - - -

      pcre_compile2 man page

      -

      -Return to the PCRE index page. -

      -

      -This page is part of the PCRE HTML documentation. It was generated automatically -from the original man page. If there is any nonsense in it, please consult the -man page, in case the conversion went wrong. -
      -
      -SYNOPSIS -
      -

      -#include <pcre.h> -

      -

      -pcre *pcre_compile2(const char *pattern, int options, - int *errorcodeptr, - const char **errptr, int *erroffset, - const unsigned char *tableptr); -
      -
      -pcre16 *pcre16_compile2(PCRE_SPTR16 pattern, int options, - int *errorcodeptr, - const char **errptr, int *erroffset, - const unsigned char *tableptr); -
      -
      -pcre32 *pcre32_compile2(PCRE_SPTR32 pattern, int options, -" int *errorcodeptr,£ - const char **errptr, int *erroffset, - const unsigned char *tableptr); -

      -
      -DESCRIPTION -
      -

      -This function compiles a regular expression into an internal form. It is the -same as pcre[16|32]_compile(), except for the addition of the -errorcodeptr argument. The arguments are: -

      -  pattern       A zero-terminated string containing the
      -                  regular expression to be compiled
      -  options       Zero or more option bits
      -  errorcodeptr  Where to put an error code
      -  errptr        Where to put an error message
      -  erroffset     Offset in pattern where error was found
      -  tableptr      Pointer to character tables, or NULL to
      -                  use the built-in default
      -
      -The option bits are: -
      -  PCRE_ANCHORED           Force pattern anchoring
      -  PCRE_AUTO_CALLOUT       Compile automatic callouts
      -  PCRE_BSR_ANYCRLF        \R matches only CR, LF, or CRLF
      -  PCRE_BSR_UNICODE        \R matches all Unicode line endings
      -  PCRE_CASELESS           Do caseless matching
      -  PCRE_DOLLAR_ENDONLY     $ not to match newline at end
      -  PCRE_DOTALL             . matches anything including NL
      -  PCRE_DUPNAMES           Allow duplicate names for subpatterns
      -  PCRE_EXTENDED           Ignore white space and # comments
      -  PCRE_EXTRA              PCRE extra features
      -                            (not much use currently)
      -  PCRE_FIRSTLINE          Force matching to be before newline
      -  PCRE_JAVASCRIPT_COMPAT  JavaScript compatibility
      -  PCRE_MULTILINE          ^ and $ match newlines within data
      -  PCRE_NEVER_UTF          Lock out UTF, e.g. via (*UTF)
      -  PCRE_NEWLINE_ANY        Recognize any Unicode newline sequence
      -  PCRE_NEWLINE_ANYCRLF    Recognize CR, LF, and CRLF as newline
      -                            sequences
      -  PCRE_NEWLINE_CR         Set CR as the newline sequence
      -  PCRE_NEWLINE_CRLF       Set CRLF as the newline sequence
      -  PCRE_NEWLINE_LF         Set LF as the newline sequence
      -  PCRE_NO_AUTO_CAPTURE    Disable numbered capturing paren-
      -                            theses (named ones available)
      -  PCRE_NO_AUTO_POSSESS    Disable auto-possessification
      -  PCRE_NO_START_OPTIMIZE  Disable match-time start optimizations
      -  PCRE_NO_UTF16_CHECK     Do not check the pattern for UTF-16
      -                            validity (only relevant if
      -                            PCRE_UTF16 is set)
      -  PCRE_NO_UTF32_CHECK     Do not check the pattern for UTF-32
      -                            validity (only relevant if
      -                            PCRE_UTF32 is set)
      -  PCRE_NO_UTF8_CHECK      Do not check the pattern for UTF-8
      -                            validity (only relevant if
      -                            PCRE_UTF8 is set)
      -  PCRE_UCP                Use Unicode properties for \d, \w, etc.
      -  PCRE_UNGREEDY           Invert greediness of quantifiers
      -  PCRE_UTF16              Run pcre16_compile() in UTF-16 mode
      -  PCRE_UTF32              Run pcre32_compile() in UTF-32 mode
      -  PCRE_UTF8               Run pcre_compile() in UTF-8 mode
      -
      -PCRE must be built with UTF support in order to use PCRE_UTF8/16/32 and -PCRE_NO_UTF8/16/32_CHECK, and with UCP support if PCRE_UCP is used. -

      -

      -The yield of the function is a pointer to a private data structure that -contains the compiled pattern, or NULL if an error was detected. Note that -compiling regular expressions with one version of PCRE for use with a different -version is not guaranteed to work and may cause crashes. -

      -

      -There is a complete description of the PCRE native API in the -pcreapi -page and a description of the POSIX API in the -pcreposix -page. -

      -Return to the PCRE index page. -

      diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcre_config.html b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcre_config.html deleted file mode 100644 index 72fb9caa..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcre_config.html +++ /dev/null @@ -1,94 +0,0 @@ - - -pcre_config specification - - -

      pcre_config man page

      -

      -Return to the PCRE index page. -

      -

      -This page is part of the PCRE HTML documentation. It was generated automatically -from the original man page. If there is any nonsense in it, please consult the -man page, in case the conversion went wrong. -
      -
      -SYNOPSIS -
      -

      -#include <pcre.h> -

      -

      -int pcre_config(int what, void *where); -

      -

      -int pcre16_config(int what, void *where); -

      -

      -int pcre32_config(int what, void *where); -

      -
      -DESCRIPTION -
      -

      -This function makes it possible for a client program to find out which optional -features are available in the version of the PCRE library it is using. The -arguments are as follows: -

      -  what     A code specifying what information is required
      -  where    Points to where to put the data
      -
      -The where argument must point to an integer variable, except for -PCRE_CONFIG_MATCH_LIMIT, PCRE_CONFIG_MATCH_LIMIT_RECURSION, and -PCRE_CONFIG_PARENS_LIMIT, when it must point to an unsigned long integer, -and for PCRE_CONFIG_JITTARGET, when it must point to a const char*. -The available codes are: -
      -  PCRE_CONFIG_JIT           Availability of just-in-time compiler
      -                              support (1=yes 0=no)
      -  PCRE_CONFIG_JITTARGET     String containing information about the
      -                              target architecture for the JIT compiler,
      -                              or NULL if there is no JIT support
      -  PCRE_CONFIG_LINK_SIZE     Internal link size: 2, 3, or 4
      -  PCRE_CONFIG_PARENS_LIMIT  Parentheses nesting limit
      -  PCRE_CONFIG_MATCH_LIMIT   Internal resource limit
      -  PCRE_CONFIG_MATCH_LIMIT_RECURSION
      -                            Internal recursion depth limit
      -  PCRE_CONFIG_NEWLINE       Value of the default newline sequence:
      -                                13 (0x000d)    for CR
      -                                10 (0x000a)    for LF
      -                              3338 (0x0d0a)    for CRLF
      -                                -2             for ANYCRLF
      -                                -1             for ANY
      -  PCRE_CONFIG_BSR           Indicates what \R matches by default:
      -                                 0             all Unicode line endings
      -                                 1             CR, LF, or CRLF only
      -  PCRE_CONFIG_POSIX_MALLOC_THRESHOLD
      -                            Threshold of return slots, above which
      -                              malloc() is used by the POSIX API
      -  PCRE_CONFIG_STACKRECURSE  Recursion implementation (1=stack 0=heap)
      -  PCRE_CONFIG_UTF16         Availability of UTF-16 support (1=yes
      -                               0=no); option for pcre16_config()
      -  PCRE_CONFIG_UTF32         Availability of UTF-32 support (1=yes
      -                               0=no); option for pcre32_config()
      -  PCRE_CONFIG_UTF8          Availability of UTF-8 support (1=yes 0=no);
      -                              option for pcre_config()
      -  PCRE_CONFIG_UNICODE_PROPERTIES
      -                            Availability of Unicode property support
      -                              (1=yes 0=no)
      -
      -The function yields 0 on success or PCRE_ERROR_BADOPTION otherwise. That error -is also given if PCRE_CONFIG_UTF16 or PCRE_CONFIG_UTF32 is passed to -pcre_config(), if PCRE_CONFIG_UTF8 or PCRE_CONFIG_UTF32 is passed to -pcre16_config(), or if PCRE_CONFIG_UTF8 or PCRE_CONFIG_UTF16 is passed to -pcre32_config(). -

      -

      -There is a complete description of the PCRE native API in the -pcreapi -page and a description of the POSIX API in the -pcreposix -page. -

      -Return to the PCRE index page. -

      diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcre_copy_named_substring.html b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcre_copy_named_substring.html deleted file mode 100644 index 77b48043..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcre_copy_named_substring.html +++ /dev/null @@ -1,65 +0,0 @@ - - -pcre_copy_named_substring specification - - -

      pcre_copy_named_substring man page

      -

      -Return to the PCRE index page. -

      -

      -This page is part of the PCRE HTML documentation. It was generated automatically -from the original man page. If there is any nonsense in it, please consult the -man page, in case the conversion went wrong. -
      -
      -SYNOPSIS -
      -

      -#include <pcre.h> -

      -

      -int pcre_copy_named_substring(const pcre *code, - const char *subject, int *ovector, - int stringcount, const char *stringname, - char *buffer, int buffersize); -
      -
      -int pcre16_copy_named_substring(const pcre16 *code, - PCRE_SPTR16 subject, int *ovector, - int stringcount, PCRE_SPTR16 stringname, - PCRE_UCHAR16 *buffer, int buffersize); -
      -
      -int pcre32_copy_named_substring(const pcre32 *code, - PCRE_SPTR32 subject, int *ovector, - int stringcount, PCRE_SPTR32 stringname, - PCRE_UCHAR32 *buffer, int buffersize); -

      -
      -DESCRIPTION -
      -

      -This is a convenience function for extracting a captured substring, identified -by name, into a given buffer. The arguments are: -

      -  code          Pattern that was successfully matched
      -  subject       Subject that has been successfully matched
      -  ovector       Offset vector that pcre[16|32]_exec() used
      -  stringcount   Value returned by pcre[16|32]_exec()
      -  stringname    Name of the required substring
      -  buffer        Buffer to receive the string
      -  buffersize    Size of buffer
      -
      -The yield is the length of the substring, PCRE_ERROR_NOMEMORY if the buffer was -too small, or PCRE_ERROR_NOSUBSTRING if the string name is invalid. -

      -

      -There is a complete description of the PCRE native API in the -pcreapi -page and a description of the POSIX API in the -pcreposix -page. -

      -Return to the PCRE index page. -

      diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcre_copy_substring.html b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcre_copy_substring.html deleted file mode 100644 index ecaebe85..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcre_copy_substring.html +++ /dev/null @@ -1,61 +0,0 @@ - - -pcre_copy_substring specification - - -

      pcre_copy_substring man page

      -

      -Return to the PCRE index page. -

      -

      -This page is part of the PCRE HTML documentation. It was generated automatically -from the original man page. If there is any nonsense in it, please consult the -man page, in case the conversion went wrong. -
      -
      -SYNOPSIS -
      -

      -#include <pcre.h> -

      -

      -int pcre_copy_substring(const char *subject, int *ovector, - int stringcount, int stringnumber, char *buffer, - int buffersize); -
      -
      -int pcre16_copy_substring(PCRE_SPTR16 subject, int *ovector, - int stringcount, int stringnumber, PCRE_UCHAR16 *buffer, - int buffersize); -
      -
      -int pcre32_copy_substring(PCRE_SPTR32 subject, int *ovector, - int stringcount, int stringnumber, PCRE_UCHAR32 *buffer, - int buffersize); -

      -
      -DESCRIPTION -
      -

      -This is a convenience function for extracting a captured substring into a given -buffer. The arguments are: -

      -  subject       Subject that has been successfully matched
      -  ovector       Offset vector that pcre[16|32]_exec() used
      -  stringcount   Value returned by pcre[16|32]_exec()
      -  stringnumber  Number of the required substring
      -  buffer        Buffer to receive the string
      -  buffersize    Size of buffer
      -
      -The yield is the length of the string, PCRE_ERROR_NOMEMORY if the buffer was -too small, or PCRE_ERROR_NOSUBSTRING if the string number is invalid. -

      -

      -There is a complete description of the PCRE native API in the -pcreapi -page and a description of the POSIX API in the -pcreposix -page. -

      -Return to the PCRE index page. -

      diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcre_dfa_exec.html b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcre_dfa_exec.html deleted file mode 100644 index 5fff6a7e..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcre_dfa_exec.html +++ /dev/null @@ -1,129 +0,0 @@ - - -pcre_dfa_exec specification - - -

      pcre_dfa_exec man page

      -

      -Return to the PCRE index page. -

      -

      -This page is part of the PCRE HTML documentation. It was generated automatically -from the original man page. If there is any nonsense in it, please consult the -man page, in case the conversion went wrong. -
      -
      -SYNOPSIS -
      -

      -#include <pcre.h> -

      -

      -int pcre_dfa_exec(const pcre *code, const pcre_extra *extra, - const char *subject, int length, int startoffset, - int options, int *ovector, int ovecsize, - int *workspace, int wscount); -
      -
      -int pcre16_dfa_exec(const pcre16 *code, const pcre16_extra *extra, - PCRE_SPTR16 subject, int length, int startoffset, - int options, int *ovector, int ovecsize, - int *workspace, int wscount); -
      -
      -int pcre32_dfa_exec(const pcre32 *code, const pcre32_extra *extra, - PCRE_SPTR32 subject, int length, int startoffset, - int options, int *ovector, int ovecsize, - int *workspace, int wscount); -

      -
      -DESCRIPTION -
      -

      -This function matches a compiled regular expression against a given subject -string, using an alternative matching algorithm that scans the subject string -just once (not Perl-compatible). Note that the main, Perl-compatible, -matching function is pcre[16|32]_exec(). The arguments for this function -are: -

      -  code         Points to the compiled pattern
      -  extra        Points to an associated pcre[16|32]_extra structure,
      -                 or is NULL
      -  subject      Points to the subject string
      -  length       Length of the subject string
      -  startoffset  Offset in the subject at which to start matching
      -  options      Option bits
      -  ovector      Points to a vector of ints for result offsets
      -  ovecsize     Number of elements in the vector
      -  workspace    Points to a vector of ints used as working space
      -  wscount      Number of elements in the vector
      -
      -The units for length and startoffset are bytes for -pcre_exec(), 16-bit data items for pcre16_exec(), and 32-bit items -for pcre32_exec(). The options are: -
      -  PCRE_ANCHORED          Match only at the first position
      -  PCRE_BSR_ANYCRLF       \R matches only CR, LF, or CRLF
      -  PCRE_BSR_UNICODE       \R matches all Unicode line endings
      -  PCRE_NEWLINE_ANY       Recognize any Unicode newline sequence
      -  PCRE_NEWLINE_ANYCRLF   Recognize CR, LF, & CRLF as newline sequences
      -  PCRE_NEWLINE_CR        Recognize CR as the only newline sequence
      -  PCRE_NEWLINE_CRLF      Recognize CRLF as the only newline sequence
      -  PCRE_NEWLINE_LF        Recognize LF as the only newline sequence
      -  PCRE_NOTBOL            Subject is not the beginning of a line
      -  PCRE_NOTEOL            Subject is not the end of a line
      -  PCRE_NOTEMPTY          An empty string is not a valid match
      -  PCRE_NOTEMPTY_ATSTART  An empty string at the start of the subject
      -                           is not a valid match
      -  PCRE_NO_START_OPTIMIZE Do not do "start-match" optimizations
      -  PCRE_NO_UTF16_CHECK    Do not check the subject for UTF-16
      -                           validity (only relevant if PCRE_UTF16
      -                           was set at compile time)
      -  PCRE_NO_UTF32_CHECK    Do not check the subject for UTF-32
      -                           validity (only relevant if PCRE_UTF32
      -                           was set at compile time)
      -  PCRE_NO_UTF8_CHECK     Do not check the subject for UTF-8
      -                           validity (only relevant if PCRE_UTF8
      -                           was set at compile time)
      -  PCRE_PARTIAL           ) Return PCRE_ERROR_PARTIAL for a partial
      -  PCRE_PARTIAL_SOFT      )   match if no full matches are found
      -  PCRE_PARTIAL_HARD      Return PCRE_ERROR_PARTIAL for a partial match
      -                           even if there is a full match as well
      -  PCRE_DFA_SHORTEST      Return only the shortest match
      -  PCRE_DFA_RESTART       Restart after a partial match
      -
      -There are restrictions on what may appear in a pattern when using this matching -function. Details are given in the -pcrematching -documentation. For details of partial matching, see the -pcrepartial -page. -

      -

      -A pcre[16|32]_extra structure contains the following fields: -

      -  flags            Bits indicating which fields are set
      -  study_data       Opaque data from pcre[16|32]_study()
      -  match_limit      Limit on internal resource use
      -  match_limit_recursion  Limit on internal recursion depth
      -  callout_data     Opaque data passed back to callouts
      -  tables           Points to character tables or is NULL
      -  mark             For passing back a *MARK pointer
      -  executable_jit   Opaque data from JIT compilation
      -
      -The flag bits are PCRE_EXTRA_STUDY_DATA, PCRE_EXTRA_MATCH_LIMIT, -PCRE_EXTRA_MATCH_LIMIT_RECURSION, PCRE_EXTRA_CALLOUT_DATA, -PCRE_EXTRA_TABLES, PCRE_EXTRA_MARK and PCRE_EXTRA_EXECUTABLE_JIT. For this -matching function, the match_limit and match_limit_recursion fields -are not used, and must not be set. The PCRE_EXTRA_EXECUTABLE_JIT flag and -the corresponding variable are ignored. -

      -

      -There is a complete description of the PCRE native API in the -pcreapi -page and a description of the POSIX API in the -pcreposix -page. -

      -Return to the PCRE index page. -

      diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcre_exec.html b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcre_exec.html deleted file mode 100644 index 18e1a13f..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcre_exec.html +++ /dev/null @@ -1,111 +0,0 @@ - - -pcre_exec specification - - -

      pcre_exec man page

      -

      -Return to the PCRE index page. -

      -

      -This page is part of the PCRE HTML documentation. It was generated automatically -from the original man page. If there is any nonsense in it, please consult the -man page, in case the conversion went wrong. -
      -
      -SYNOPSIS -
      -

      -#include <pcre.h> -

      -

      -int pcre_exec(const pcre *code, const pcre_extra *extra, - const char *subject, int length, int startoffset, - int options, int *ovector, int ovecsize); -
      -
      -int pcre16_exec(const pcre16 *code, const pcre16_extra *extra, - PCRE_SPTR16 subject, int length, int startoffset, - int options, int *ovector, int ovecsize); -
      -
      -int pcre32_exec(const pcre32 *code, const pcre32_extra *extra, - PCRE_SPTR32 subject, int length, int startoffset, - int options, int *ovector, int ovecsize); -

      -
      -DESCRIPTION -
      -

      -This function matches a compiled regular expression against a given subject -string, using a matching algorithm that is similar to Perl's. It returns -offsets to captured substrings. Its arguments are: -

      -  code         Points to the compiled pattern
      -  extra        Points to an associated pcre[16|32]_extra structure,
      -                 or is NULL
      -  subject      Points to the subject string
      -  length       Length of the subject string
      -  startoffset  Offset in the subject at which to start matching
      -  options      Option bits
      -  ovector      Points to a vector of ints for result offsets
      -  ovecsize     Number of elements in the vector (a multiple of 3)
      -
      -The units for length and startoffset are bytes for -pcre_exec(), 16-bit data items for pcre16_exec(), and 32-bit items -for pcre32_exec(). The options are: -
      -  PCRE_ANCHORED          Match only at the first position
      -  PCRE_BSR_ANYCRLF       \R matches only CR, LF, or CRLF
      -  PCRE_BSR_UNICODE       \R matches all Unicode line endings
      -  PCRE_NEWLINE_ANY       Recognize any Unicode newline sequence
      -  PCRE_NEWLINE_ANYCRLF   Recognize CR, LF, & CRLF as newline sequences
      -  PCRE_NEWLINE_CR        Recognize CR as the only newline sequence
      -  PCRE_NEWLINE_CRLF      Recognize CRLF as the only newline sequence
      -  PCRE_NEWLINE_LF        Recognize LF as the only newline sequence
      -  PCRE_NOTBOL            Subject string is not the beginning of a line
      -  PCRE_NOTEOL            Subject string is not the end of a line
      -  PCRE_NOTEMPTY          An empty string is not a valid match
      -  PCRE_NOTEMPTY_ATSTART  An empty string at the start of the subject
      -                           is not a valid match
      -  PCRE_NO_START_OPTIMIZE Do not do "start-match" optimizations
      -  PCRE_NO_UTF16_CHECK    Do not check the subject for UTF-16
      -                           validity (only relevant if PCRE_UTF16
      -                           was set at compile time)
      -  PCRE_NO_UTF32_CHECK    Do not check the subject for UTF-32
      -                           validity (only relevant if PCRE_UTF32
      -                           was set at compile time)
      -  PCRE_NO_UTF8_CHECK     Do not check the subject for UTF-8
      -                           validity (only relevant if PCRE_UTF8
      -                           was set at compile time)
      -  PCRE_PARTIAL           ) Return PCRE_ERROR_PARTIAL for a partial
      -  PCRE_PARTIAL_SOFT      )   match if no full matches are found
      -  PCRE_PARTIAL_HARD      Return PCRE_ERROR_PARTIAL for a partial match
      -                           if that is found before a full match
      -
      -For details of partial matching, see the -pcrepartial -page. A pcre_extra structure contains the following fields: -
      -  flags            Bits indicating which fields are set
      -  study_data       Opaque data from pcre[16|32]_study()
      -  match_limit      Limit on internal resource use
      -  match_limit_recursion  Limit on internal recursion depth
      -  callout_data     Opaque data passed back to callouts
      -  tables           Points to character tables or is NULL
      -  mark             For passing back a *MARK pointer
      -  executable_jit   Opaque data from JIT compilation
      -
      -The flag bits are PCRE_EXTRA_STUDY_DATA, PCRE_EXTRA_MATCH_LIMIT, -PCRE_EXTRA_MATCH_LIMIT_RECURSION, PCRE_EXTRA_CALLOUT_DATA, -PCRE_EXTRA_TABLES, PCRE_EXTRA_MARK and PCRE_EXTRA_EXECUTABLE_JIT. -

      -

      -There is a complete description of the PCRE native API in the -pcreapi -page and a description of the POSIX API in the -pcreposix -page. -

      -Return to the PCRE index page. -

      diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcre_free_study.html b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcre_free_study.html deleted file mode 100644 index 7f9e10e8..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcre_free_study.html +++ /dev/null @@ -1,46 +0,0 @@ - - -pcre_free_study specification - - -

      pcre_free_study man page

      -

      -Return to the PCRE index page. -

      -

      -This page is part of the PCRE HTML documentation. It was generated automatically -from the original man page. If there is any nonsense in it, please consult the -man page, in case the conversion went wrong. -
      -
      -SYNOPSIS -
      -

      -#include <pcre.h> -

      -

      -void pcre_free_study(pcre_extra *extra); -

      -

      -void pcre16_free_study(pcre16_extra *extra); -

      -

      -void pcre32_free_study(pcre32_extra *extra); -

      -
      -DESCRIPTION -
      -

      -This function is used to free the memory used for the data generated by a call -to pcre[16|32]_study() when it is no longer needed. The argument must be the -result of such a call. -

      -

      -There is a complete description of the PCRE native API in the -pcreapi -page and a description of the POSIX API in the -pcreposix -page. -

      -Return to the PCRE index page. -

      diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcre_free_substring.html b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcre_free_substring.html deleted file mode 100644 index 1fe66107..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcre_free_substring.html +++ /dev/null @@ -1,46 +0,0 @@ - - -pcre_free_substring specification - - -

      pcre_free_substring man page

      -

      -Return to the PCRE index page. -

      -

      -This page is part of the PCRE HTML documentation. It was generated automatically -from the original man page. If there is any nonsense in it, please consult the -man page, in case the conversion went wrong. -
      -
      -SYNOPSIS -
      -

      -#include <pcre.h> -

      -

      -void pcre_free_substring(const char *stringptr); -

      -

      -void pcre16_free_substring(PCRE_SPTR16 stringptr); -

      -

      -void pcre32_free_substring(PCRE_SPTR32 stringptr); -

      -
      -DESCRIPTION -
      -

      -This is a convenience function for freeing the store obtained by a previous -call to pcre[16|32]_get_substring() or pcre[16|32]_get_named_substring(). -Its only argument is a pointer to the string. -

      -

      -There is a complete description of the PCRE native API in the -pcreapi -page and a description of the POSIX API in the -pcreposix -page. -

      -Return to the PCRE index page. -

      diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcre_free_substring_list.html b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcre_free_substring_list.html deleted file mode 100644 index c0861780..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcre_free_substring_list.html +++ /dev/null @@ -1,46 +0,0 @@ - - -pcre_free_substring_list specification - - -

      pcre_free_substring_list man page

      -

      -Return to the PCRE index page. -

      -

      -This page is part of the PCRE HTML documentation. It was generated automatically -from the original man page. If there is any nonsense in it, please consult the -man page, in case the conversion went wrong. -
      -
      -SYNOPSIS -
      -

      -#include <pcre.h> -

      -

      -void pcre_free_substring_list(const char **stringptr); -

      -

      -void pcre16_free_substring_list(PCRE_SPTR16 *stringptr); -

      -

      -void pcre32_free_substring_list(PCRE_SPTR32 *stringptr); -

      -
      -DESCRIPTION -
      -

      -This is a convenience function for freeing the store obtained by a previous -call to pcre[16|32]_get_substring_list(). Its only argument is a pointer to -the list of string pointers. -

      -

      -There is a complete description of the PCRE native API in the -pcreapi -page and a description of the POSIX API in the -pcreposix -page. -

      -Return to the PCRE index page. -

      diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcre_fullinfo.html b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcre_fullinfo.html deleted file mode 100644 index 2b7c72b3..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcre_fullinfo.html +++ /dev/null @@ -1,118 +0,0 @@ - - -pcre_fullinfo specification - - -

      pcre_fullinfo man page

      -

      -Return to the PCRE index page. -

      -

      -This page is part of the PCRE HTML documentation. It was generated automatically -from the original man page. If there is any nonsense in it, please consult the -man page, in case the conversion went wrong. -
      -
      -SYNOPSIS -
      -

      -#include <pcre.h> -

      -

      -int pcre_fullinfo(const pcre *code, const pcre_extra *extra, - int what, void *where); -
      -
      -int pcre16_fullinfo(const pcre16 *code, const pcre16_extra *extra, - int what, void *where); -
      -
      -int pcre32_fullinfo(const pcre32 *code, const pcre32_extra *extra, - int what, void *where); -

      -
      -DESCRIPTION -
      -

      -This function returns information about a compiled pattern. Its arguments are: -

      -  code                      Compiled regular expression
      -  extra                     Result of pcre[16|32]_study() or NULL
      -  what                      What information is required
      -  where                     Where to put the information
      -
      -The following information is available: -
      -  PCRE_INFO_BACKREFMAX      Number of highest back reference
      -  PCRE_INFO_CAPTURECOUNT    Number of capturing subpatterns
      -  PCRE_INFO_DEFAULT_TABLES  Pointer to default tables
      -  PCRE_INFO_FIRSTBYTE       Fixed first data unit for a match, or
      -                              -1 for start of string
      -                                 or after newline, or
      -                              -2 otherwise
      -  PCRE_INFO_FIRSTTABLE      Table of first data units (after studying)
      -  PCRE_INFO_HASCRORLF       Return 1 if explicit CR or LF matches exist
      -  PCRE_INFO_JCHANGED        Return 1 if (?J) or (?-J) was used
      -  PCRE_INFO_JIT             Return 1 after successful JIT compilation
      -  PCRE_INFO_JITSIZE         Size of JIT compiled code
      -  PCRE_INFO_LASTLITERAL     Literal last data unit required
      -  PCRE_INFO_MINLENGTH       Lower bound length of matching strings
      -  PCRE_INFO_MATCHEMPTY      Return 1 if the pattern can match an empty string,
      -                               0 otherwise
      -  PCRE_INFO_MATCHLIMIT      Match limit if set, otherwise PCRE_RROR_UNSET
      -  PCRE_INFO_MAXLOOKBEHIND   Length (in characters) of the longest lookbehind assertion
      -  PCRE_INFO_NAMECOUNT       Number of named subpatterns
      -  PCRE_INFO_NAMEENTRYSIZE   Size of name table entry
      -  PCRE_INFO_NAMETABLE       Pointer to name table
      -  PCRE_INFO_OKPARTIAL       Return 1 if partial matching can be tried
      -                              (always returns 1 after release 8.00)
      -  PCRE_INFO_OPTIONS         Option bits used for compilation
      -  PCRE_INFO_SIZE            Size of compiled pattern
      -  PCRE_INFO_STUDYSIZE       Size of study data
      -  PCRE_INFO_FIRSTCHARACTER      Fixed first data unit for a match
      -  PCRE_INFO_FIRSTCHARACTERFLAGS Returns
      -                                  1 if there is a first data character set, which can
      -                                    then be retrieved using PCRE_INFO_FIRSTCHARACTER,
      -                                  2 if the first character is at the start of the data
      -                                    string or after a newline, and
      -                                  0 otherwise
      -  PCRE_INFO_RECURSIONLIMIT    Recursion limit if set, otherwise PCRE_ERROR_UNSET
      -  PCRE_INFO_REQUIREDCHAR      Literal last data unit required
      -  PCRE_INFO_REQUIREDCHARFLAGS Returns 1 if the last data character is set (which can then
      -                              be retrieved using PCRE_INFO_REQUIREDCHAR); 0 otherwise
      -
      -The where argument must point to an integer variable, except for the -following what values: -
      -  PCRE_INFO_DEFAULT_TABLES  const uint8_t *
      -  PCRE_INFO_FIRSTCHARACTER  uint32_t
      -  PCRE_INFO_FIRSTTABLE      const uint8_t *
      -  PCRE_INFO_JITSIZE         size_t
      -  PCRE_INFO_MATCHLIMIT      uint32_t
      -  PCRE_INFO_NAMETABLE       PCRE_SPTR16           (16-bit library)
      -  PCRE_INFO_NAMETABLE       PCRE_SPTR32           (32-bit library)
      -  PCRE_INFO_NAMETABLE       const unsigned char * (8-bit library)
      -  PCRE_INFO_OPTIONS         unsigned long int
      -  PCRE_INFO_SIZE            size_t
      -  PCRE_INFO_STUDYSIZE       size_t
      -  PCRE_INFO_RECURSIONLIMIT  uint32_t
      -  PCRE_INFO_REQUIREDCHAR    uint32_t
      -
      -The yield of the function is zero on success or: -
      -  PCRE_ERROR_NULL           the argument code was NULL
      -                            the argument where was NULL
      -  PCRE_ERROR_BADMAGIC       the "magic number" was not found
      -  PCRE_ERROR_BADOPTION      the value of what was invalid
      -  PCRE_ERROR_UNSET          the option was not set
      -
      -

      -

      -There is a complete description of the PCRE native API in the -pcreapi -page and a description of the POSIX API in the -pcreposix -page. -

      -Return to the PCRE index page. -

      diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcre_get_named_substring.html b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcre_get_named_substring.html deleted file mode 100644 index 72924d9b..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcre_get_named_substring.html +++ /dev/null @@ -1,68 +0,0 @@ - - -pcre_get_named_substring specification - - -

      pcre_get_named_substring man page

      -

      -Return to the PCRE index page. -

      -

      -This page is part of the PCRE HTML documentation. It was generated automatically -from the original man page. If there is any nonsense in it, please consult the -man page, in case the conversion went wrong. -
      -
      -SYNOPSIS -
      -

      -#include <pcre.h> -

      -

      -int pcre_get_named_substring(const pcre *code, - const char *subject, int *ovector, - int stringcount, const char *stringname, - const char **stringptr); -
      -
      -int pcre16_get_named_substring(const pcre16 *code, - PCRE_SPTR16 subject, int *ovector, - int stringcount, PCRE_SPTR16 stringname, - PCRE_SPTR16 *stringptr); -
      -
      -int pcre32_get_named_substring(const pcre32 *code, - PCRE_SPTR32 subject, int *ovector, - int stringcount, PCRE_SPTR32 stringname, - PCRE_SPTR32 *stringptr); -

      -
      -DESCRIPTION -
      -

      -This is a convenience function for extracting a captured substring by name. The -arguments are: -

      -  code          Compiled pattern
      -  subject       Subject that has been successfully matched
      -  ovector       Offset vector that pcre[16|32]_exec() used
      -  stringcount   Value returned by pcre[16|32]_exec()
      -  stringname    Name of the required substring
      -  stringptr     Where to put the string pointer
      -
      -The memory in which the substring is placed is obtained by calling -pcre[16|32]_malloc(). The convenience function -pcre[16|32]_free_substring() can be used to free it when it is no longer -needed. The yield of the function is the length of the extracted substring, -PCRE_ERROR_NOMEMORY if sufficient memory could not be obtained, or -PCRE_ERROR_NOSUBSTRING if the string name is invalid. -

      -

      -There is a complete description of the PCRE native API in the -pcreapi -page and a description of the POSIX API in the -pcreposix -page. -

      -Return to the PCRE index page. -

      diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcre_get_stringnumber.html b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcre_get_stringnumber.html deleted file mode 100644 index 7324d782..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcre_get_stringnumber.html +++ /dev/null @@ -1,57 +0,0 @@ - - -pcre_get_stringnumber specification - - -

      pcre_get_stringnumber man page

      -

      -Return to the PCRE index page. -

      -

      -This page is part of the PCRE HTML documentation. It was generated automatically -from the original man page. If there is any nonsense in it, please consult the -man page, in case the conversion went wrong. -
      -
      -SYNOPSIS -
      -

      -#include <pcre.h> -

      -

      -int pcre_get_stringnumber(const pcre *code, - const char *name); -
      -
      -int pcre16_get_stringnumber(const pcre16 *code, - PCRE_SPTR16 name); -
      -
      -int pcre32_get_stringnumber(const pcre32 *code, - PCRE_SPTR32 name); -

      -
      -DESCRIPTION -
      -

      -This convenience function finds the number of a named substring capturing -parenthesis in a compiled pattern. Its arguments are: -

      -  code    Compiled regular expression
      -  name    Name whose number is required
      -
      -The yield of the function is the number of the parenthesis if the name is -found, or PCRE_ERROR_NOSUBSTRING otherwise. When duplicate names are allowed -(PCRE_DUPNAMES is set), it is not defined which of the numbers is returned by -pcre[16|32]_get_stringnumber(). You can obtain the complete list by calling -pcre[16|32]_get_stringtable_entries(). -

      -

      -There is a complete description of the PCRE native API in the -pcreapi -page and a description of the POSIX API in the -pcreposix -page. -

      -Return to the PCRE index page. -

      diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcre_get_stringtable_entries.html b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcre_get_stringtable_entries.html deleted file mode 100644 index 79906798..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcre_get_stringtable_entries.html +++ /dev/null @@ -1,60 +0,0 @@ - - -pcre_get_stringtable_entries specification - - -

      pcre_get_stringtable_entries man page

      -

      -Return to the PCRE index page. -

      -

      -This page is part of the PCRE HTML documentation. It was generated automatically -from the original man page. If there is any nonsense in it, please consult the -man page, in case the conversion went wrong. -
      -
      -SYNOPSIS -
      -

      -#include <pcre.h> -

      -

      -int pcre_get_stringtable_entries(const pcre *code, - const char *name, char **first, char **last); -
      -
      -int pcre16_get_stringtable_entries(const pcre16 *code, - PCRE_SPTR16 name, PCRE_UCHAR16 **first, PCRE_UCHAR16 **last); -
      -
      -int pcre32_get_stringtable_entries(const pcre32 *code, - PCRE_SPTR32 name, PCRE_UCHAR32 **first, PCRE_UCHAR32 **last); -

      -
      -DESCRIPTION -
      -

      -This convenience function finds, for a compiled pattern, the first and last -entries for a given name in the table that translates capturing parenthesis -names into numbers. When names are required to be unique (PCRE_DUPNAMES is -not set), it is usually easier to use pcre[16|32]_get_stringnumber() -instead. -

      -  code    Compiled regular expression
      -  name    Name whose entries required
      -  first   Where to return a pointer to the first entry
      -  last    Where to return a pointer to the last entry
      -
      -The yield of the function is the length of each entry, or -PCRE_ERROR_NOSUBSTRING if none are found. -

      -

      -There is a complete description of the PCRE native API, including the format of -the table entries, in the -pcreapi -page, and a description of the POSIX API in the -pcreposix -page. -

      -Return to the PCRE index page. -

      diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcre_get_substring.html b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcre_get_substring.html deleted file mode 100644 index 1a8e4f5a..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcre_get_substring.html +++ /dev/null @@ -1,64 +0,0 @@ - - -pcre_get_substring specification - - -

      pcre_get_substring man page

      -

      -Return to the PCRE index page. -

      -

      -This page is part of the PCRE HTML documentation. It was generated automatically -from the original man page. If there is any nonsense in it, please consult the -man page, in case the conversion went wrong. -
      -
      -SYNOPSIS -
      -

      -#include <pcre.h> -

      -

      -int pcre_get_substring(const char *subject, int *ovector, - int stringcount, int stringnumber, - const char **stringptr); -
      -
      -int pcre16_get_substring(PCRE_SPTR16 subject, int *ovector, - int stringcount, int stringnumber, - PCRE_SPTR16 *stringptr); -
      -
      -int pcre32_get_substring(PCRE_SPTR32 subject, int *ovector, - int stringcount, int stringnumber, - PCRE_SPTR32 *stringptr); -

      -
      -DESCRIPTION -
      -

      -This is a convenience function for extracting a captured substring. The -arguments are: -

      -  subject       Subject that has been successfully matched
      -  ovector       Offset vector that pcre[16|32]_exec() used
      -  stringcount   Value returned by pcre[16|32]_exec()
      -  stringnumber  Number of the required substring
      -  stringptr     Where to put the string pointer
      -
      -The memory in which the substring is placed is obtained by calling -pcre[16|32]_malloc(). The convenience function -pcre[16|32]_free_substring() can be used to free it when it is no longer -needed. The yield of the function is the length of the substring, -PCRE_ERROR_NOMEMORY if sufficient memory could not be obtained, or -PCRE_ERROR_NOSUBSTRING if the string number is invalid. -

      -

      -There is a complete description of the PCRE native API in the -pcreapi -page and a description of the POSIX API in the -pcreposix -page. -

      -Return to the PCRE index page. -

      diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcre_get_substring_list.html b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcre_get_substring_list.html deleted file mode 100644 index 7e8c6bc8..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcre_get_substring_list.html +++ /dev/null @@ -1,61 +0,0 @@ - - -pcre_get_substring_list specification - - -

      pcre_get_substring_list man page

      -

      -Return to the PCRE index page. -

      -

      -This page is part of the PCRE HTML documentation. It was generated automatically -from the original man page. If there is any nonsense in it, please consult the -man page, in case the conversion went wrong. -
      -
      -SYNOPSIS -
      -

      -#include <pcre.h> -

      -

      -int pcre_get_substring_list(const char *subject, - int *ovector, int stringcount, const char ***listptr); -
      -
      -int pcre16_get_substring_list(PCRE_SPTR16 subject, - int *ovector, int stringcount, PCRE_SPTR16 **listptr); -
      -
      -int pcre32_get_substring_list(PCRE_SPTR32 subject, - int *ovector, int stringcount, PCRE_SPTR32 **listptr); -

      -
      -DESCRIPTION -
      -

      -This is a convenience function for extracting a list of all the captured -substrings. The arguments are: -

      -  subject       Subject that has been successfully matched
      -  ovector       Offset vector that pcre[16|32]_exec used
      -  stringcount   Value returned by pcre[16|32]_exec
      -  listptr       Where to put a pointer to the list
      -
      -The memory in which the substrings and the list are placed is obtained by -calling pcre[16|32]_malloc(). The convenience function -pcre[16|32]_free_substring_list() can be used to free it when it is no -longer needed. A pointer to a list of pointers is put in the variable whose -address is in listptr. The list is terminated by a NULL pointer. The -yield of the function is zero on success or PCRE_ERROR_NOMEMORY if sufficient -memory could not be obtained. -

      -

      -There is a complete description of the PCRE native API in the -pcreapi -page and a description of the POSIX API in the -pcreposix -page. -

      -Return to the PCRE index page. -

      diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcre_jit_exec.html b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcre_jit_exec.html deleted file mode 100644 index 4ebb0cbc..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcre_jit_exec.html +++ /dev/null @@ -1,108 +0,0 @@ - - -pcre_jit_exec specification - - -

      pcre_jit_exec man page

      -

      -Return to the PCRE index page. -

      -

      -This page is part of the PCRE HTML documentation. It was generated automatically -from the original man page. If there is any nonsense in it, please consult the -man page, in case the conversion went wrong. -
      -
      -SYNOPSIS -
      -

      -#include <pcre.h> -

      -

      -int pcre_jit_exec(const pcre *code, const pcre_extra *extra, - const char *subject, int length, int startoffset, - int options, int *ovector, int ovecsize, - pcre_jit_stack *jstack); -
      -
      -int pcre16_jit_exec(const pcre16 *code, const pcre16_extra *extra, - PCRE_SPTR16 subject, int length, int startoffset, - int options, int *ovector, int ovecsize, - pcre_jit_stack *jstack); -
      -
      -int pcre32_jit_exec(const pcre32 *code, const pcre32_extra *extra, - PCRE_SPTR32 subject, int length, int startoffset, - int options, int *ovector, int ovecsize, - pcre_jit_stack *jstack); -

      -
      -DESCRIPTION -
      -

      -This function matches a compiled regular expression that has been successfully -studied with one of the JIT options against a given subject string, using a -matching algorithm that is similar to Perl's. It is a "fast path" interface to -JIT, and it bypasses some of the sanity checks that pcre_exec() applies. -It returns offsets to captured substrings. Its arguments are: -

      -  code         Points to the compiled pattern
      -  extra        Points to an associated pcre[16|32]_extra structure,
      -                 or is NULL
      -  subject      Points to the subject string
      -  length       Length of the subject string, in bytes
      -  startoffset  Offset in bytes in the subject at which to
      -                 start matching
      -  options      Option bits
      -  ovector      Points to a vector of ints for result offsets
      -  ovecsize     Number of elements in the vector (a multiple of 3)
      -  jstack       Pointer to a JIT stack
      -
      -The allowed options are: -
      -  PCRE_NOTBOL            Subject string is not the beginning of a line
      -  PCRE_NOTEOL            Subject string is not the end of a line
      -  PCRE_NOTEMPTY          An empty string is not a valid match
      -  PCRE_NOTEMPTY_ATSTART  An empty string at the start of the subject
      -                           is not a valid match
      -  PCRE_NO_UTF16_CHECK    Do not check the subject for UTF-16
      -                           validity (only relevant if PCRE_UTF16
      -                           was set at compile time)
      -  PCRE_NO_UTF32_CHECK    Do not check the subject for UTF-32
      -                           validity (only relevant if PCRE_UTF32
      -                           was set at compile time)
      -  PCRE_NO_UTF8_CHECK     Do not check the subject for UTF-8
      -                           validity (only relevant if PCRE_UTF8
      -                           was set at compile time)
      -  PCRE_PARTIAL           ) Return PCRE_ERROR_PARTIAL for a partial
      -  PCRE_PARTIAL_SOFT      )   match if no full matches are found
      -  PCRE_PARTIAL_HARD      Return PCRE_ERROR_PARTIAL for a partial match
      -                           if that is found before a full match
      -
      -However, the PCRE_NO_UTF[8|16|32]_CHECK options have no effect, as this check -is never applied. For details of partial matching, see the -pcrepartial -page. A pcre_extra structure contains the following fields: -
      -  flags            Bits indicating which fields are set
      -  study_data       Opaque data from pcre[16|32]_study()
      -  match_limit      Limit on internal resource use
      -  match_limit_recursion  Limit on internal recursion depth
      -  callout_data     Opaque data passed back to callouts
      -  tables           Points to character tables or is NULL
      -  mark             For passing back a *MARK pointer
      -  executable_jit   Opaque data from JIT compilation
      -
      -The flag bits are PCRE_EXTRA_STUDY_DATA, PCRE_EXTRA_MATCH_LIMIT, -PCRE_EXTRA_MATCH_LIMIT_RECURSION, PCRE_EXTRA_CALLOUT_DATA, -PCRE_EXTRA_TABLES, PCRE_EXTRA_MARK and PCRE_EXTRA_EXECUTABLE_JIT. -

      -

      -There is a complete description of the PCRE native API in the -pcreapi -page and a description of the JIT API in the -pcrejit -page. -

      -Return to the PCRE index page. -

      diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcre_jit_stack_alloc.html b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcre_jit_stack_alloc.html deleted file mode 100644 index 23ba4507..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcre_jit_stack_alloc.html +++ /dev/null @@ -1,55 +0,0 @@ - - -pcre_jit_stack_alloc specification - - -

      pcre_jit_stack_alloc man page

      -

      -Return to the PCRE index page. -

      -

      -This page is part of the PCRE HTML documentation. It was generated automatically -from the original man page. If there is any nonsense in it, please consult the -man page, in case the conversion went wrong. -
      -
      -SYNOPSIS -
      -

      -#include <pcre.h> -

      -

      -pcre_jit_stack *pcre_jit_stack_alloc(int startsize, - int maxsize); -
      -
      -pcre16_jit_stack *pcre16_jit_stack_alloc(int startsize, - int maxsize); -
      -
      -pcre32_jit_stack *pcre32_jit_stack_alloc(int startsize, - int maxsize); -

      -
      -DESCRIPTION -
      -

      -This function is used to create a stack for use by the code compiled by the JIT -optimization of pcre[16|32]_study(). The arguments are a starting size for -the stack, and a maximum size to which it is allowed to grow. The result can be -passed to the JIT run-time code by pcre[16|32]_assign_jit_stack(), or that -function can set up a callback for obtaining a stack. A maximum stack size of -512K to 1M should be more than enough for any pattern. For more details, see -the -pcrejit -page. -

      -

      -There is a complete description of the PCRE native API in the -pcreapi -page and a description of the POSIX API in the -pcreposix -page. -

      -Return to the PCRE index page. -

      diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcre_jit_stack_free.html b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcre_jit_stack_free.html deleted file mode 100644 index 8bd06e46..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcre_jit_stack_free.html +++ /dev/null @@ -1,48 +0,0 @@ - - -pcre_jit_stack_free specification - - -

      pcre_jit_stack_free man page

      -

      -Return to the PCRE index page. -

      -

      -This page is part of the PCRE HTML documentation. It was generated automatically -from the original man page. If there is any nonsense in it, please consult the -man page, in case the conversion went wrong. -
      -
      -SYNOPSIS -
      -

      -#include <pcre.h> -

      -

      -void pcre_jit_stack_free(pcre_jit_stack *stack); -

      -

      -void pcre16_jit_stack_free(pcre16_jit_stack *stack); -

      -

      -void pcre32_jit_stack_free(pcre32_jit_stack *stack); -

      -
      -DESCRIPTION -
      -

      -This function is used to free a JIT stack that was created by -pcre[16|32]_jit_stack_alloc() when it is no longer needed. For more details, -see the -pcrejit -page. -

      -

      -There is a complete description of the PCRE native API in the -pcreapi -page and a description of the POSIX API in the -pcreposix -page. -

      -Return to the PCRE index page. -

      diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcre_maketables.html b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcre_maketables.html deleted file mode 100644 index 3a7b5ebc..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcre_maketables.html +++ /dev/null @@ -1,48 +0,0 @@ - - -pcre_maketables specification - - -

      pcre_maketables man page

      -

      -Return to the PCRE index page. -

      -

      -This page is part of the PCRE HTML documentation. It was generated automatically -from the original man page. If there is any nonsense in it, please consult the -man page, in case the conversion went wrong. -
      -
      -SYNOPSIS -
      -

      -#include <pcre.h> -

      -

      -const unsigned char *pcre_maketables(void); -

      -

      -const unsigned char *pcre16_maketables(void); -

      -

      -const unsigned char *pcre32_maketables(void); -

      -
      -DESCRIPTION -
      -

      -This function builds a set of character tables for character values less than -256. These can be passed to pcre[16|32]_compile() to override PCRE's -internal, built-in tables (which were made by pcre[16|32]_maketables() when -PCRE was compiled). You might want to do this if you are using a non-standard -locale. The function yields a pointer to the tables. -

      -

      -There is a complete description of the PCRE native API in the -pcreapi -page and a description of the POSIX API in the -pcreposix -page. -

      -Return to the PCRE index page. -

      diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcre_pattern_to_host_byte_order.html b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcre_pattern_to_host_byte_order.html deleted file mode 100644 index 1b1c8037..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcre_pattern_to_host_byte_order.html +++ /dev/null @@ -1,58 +0,0 @@ - - -pcre_pattern_to_host_byte_order specification - - -

      pcre_pattern_to_host_byte_order man page

      -

      -Return to the PCRE index page. -

      -

      -This page is part of the PCRE HTML documentation. It was generated automatically -from the original man page. If there is any nonsense in it, please consult the -man page, in case the conversion went wrong. -
      -
      -SYNOPSIS -
      -

      -#include <pcre.h> -

      -

      -int pcre_pattern_to_host_byte_order(pcre *code, - pcre_extra *extra, const unsigned char *tables); -
      -
      -int pcre16_pattern_to_host_byte_order(pcre16 *code, - pcre16_extra *extra, const unsigned char *tables); -
      -
      -int pcre32_pattern_to_host_byte_order(pcre32 *code, - pcre32_extra *extra, const unsigned char *tables); -

      -
      -DESCRIPTION -
      -

      -This function ensures that the bytes in 2-byte and 4-byte values in a compiled -pattern are in the correct order for the current host. It is useful when a -pattern that has been compiled on one host is transferred to another that might -have different endianness. The arguments are: -

      -  code         A compiled regular expression
      -  extra        Points to an associated pcre[16|32]_extra structure,
      -                 or is NULL
      -  tables       Pointer to character tables, or NULL to
      -                 set the built-in default
      -
      -The result is 0 for success, a negative PCRE_ERROR_xxx value otherwise. -

      -

      -There is a complete description of the PCRE native API in the -pcreapi -page and a description of the POSIX API in the -pcreposix -page. -

      -Return to the PCRE index page. -

      diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcre_refcount.html b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcre_refcount.html deleted file mode 100644 index bfb92e6d..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcre_refcount.html +++ /dev/null @@ -1,51 +0,0 @@ - - -pcre_refcount specification - - -

      pcre_refcount man page

      -

      -Return to the PCRE index page. -

      -

      -This page is part of the PCRE HTML documentation. It was generated automatically -from the original man page. If there is any nonsense in it, please consult the -man page, in case the conversion went wrong. -
      -
      -SYNOPSIS -
      -

      -#include <pcre.h> -

      -

      -int pcre_refcount(pcre *code, int adjust); -

      -

      -int pcre16_refcount(pcre16 *code, int adjust); -

      -

      -int pcre32_refcount(pcre32 *code, int adjust); -

      -
      -DESCRIPTION -
      -

      -This function is used to maintain a reference count inside a data block that -contains a compiled pattern. Its arguments are: -

      -  code                      Compiled regular expression
      -  adjust                    Adjustment to reference value
      -
      -The yield of the function is the adjusted reference value, which is constrained -to lie between 0 and 65535. -

      -

      -There is a complete description of the PCRE native API in the -pcreapi -page and a description of the POSIX API in the -pcreposix -page. -

      -Return to the PCRE index page. -

      diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcre_study.html b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcre_study.html deleted file mode 100644 index af82f114..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcre_study.html +++ /dev/null @@ -1,68 +0,0 @@ - - -pcre_study specification - - -

      pcre_study man page

      -

      -Return to the PCRE index page. -

      -

      -This page is part of the PCRE HTML documentation. It was generated automatically -from the original man page. If there is any nonsense in it, please consult the -man page, in case the conversion went wrong. -
      -
      -SYNOPSIS -
      -

      -#include <pcre.h> -

      -

      -pcre_extra *pcre_study(const pcre *code, int options, - const char **errptr); -
      -
      -pcre16_extra *pcre16_study(const pcre16 *code, int options, - const char **errptr); -
      -
      -pcre32_extra *pcre32_study(const pcre32 *code, int options, - const char **errptr); -

      -
      -DESCRIPTION -
      -

      -This function studies a compiled pattern, to see if additional information can -be extracted that might speed up matching. Its arguments are: -

      -  code       A compiled regular expression
      -  options    Options for pcre[16|32]_study()
      -  errptr     Where to put an error message
      -
      -If the function succeeds, it returns a value that can be passed to -pcre[16|32]_exec() or pcre[16|32]_dfa_exec() via their extra -arguments. -

      -

      -If the function returns NULL, either it could not find any additional -information, or there was an error. You can tell the difference by looking at -the error value. It is NULL in first case. -

      -

      -The only option is PCRE_STUDY_JIT_COMPILE. It requests just-in-time compilation -if possible. If PCRE has been compiled without JIT support, this option is -ignored. See the -pcrejit -page for further details. -

      -

      -There is a complete description of the PCRE native API in the -pcreapi -page and a description of the POSIX API in the -pcreposix -page. -

      -Return to the PCRE index page. -

      diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcre_utf16_to_host_byte_order.html b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcre_utf16_to_host_byte_order.html deleted file mode 100644 index 18e7788f..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcre_utf16_to_host_byte_order.html +++ /dev/null @@ -1,57 +0,0 @@ - - -pcre_utf16_to_host_byte_order specification - - -

      pcre_utf16_to_host_byte_order man page

      -

      -Return to the PCRE index page. -

      -

      -This page is part of the PCRE HTML documentation. It was generated automatically -from the original man page. If there is any nonsense in it, please consult the -man page, in case the conversion went wrong. -
      -
      -SYNOPSIS -
      -

      -#include <pcre.h> -

      -

      -int pcre16_utf16_to_host_byte_order(PCRE_UCHAR16 *output, - PCRE_SPTR16 input, int length, int *host_byte_order, - int keep_boms); -

      -
      -DESCRIPTION -
      -

      -This function, which exists only in the 16-bit library, converts a UTF-16 -string to the correct order for the current host, taking account of any byte -order marks (BOMs) within the string. Its arguments are: -

      -  output           pointer to output buffer, may be the same as input
      -  input            pointer to input buffer
      -  length           number of 16-bit units in the input, or negative for
      -                     a zero-terminated string
      -  host_byte_order  a NULL value or a non-zero value pointed to means
      -                     start in host byte order
      -  keep_boms        if non-zero, BOMs are copied to the output string
      -
      -The result of the function is the number of 16-bit units placed into the output -buffer, including the zero terminator if the string was zero-terminated. -

      -

      -If host_byte_order is not NULL, it is set to indicate the byte order that -is current at the end of the string. -

      -

      -There is a complete description of the PCRE native API in the -pcreapi -page and a description of the POSIX API in the -pcreposix -page. -

      -Return to the PCRE index page. -

      diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcre_utf32_to_host_byte_order.html b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcre_utf32_to_host_byte_order.html deleted file mode 100644 index 772ae40c..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcre_utf32_to_host_byte_order.html +++ /dev/null @@ -1,57 +0,0 @@ - - -pcre_utf32_to_host_byte_order specification - - -

      pcre_utf32_to_host_byte_order man page

      -

      -Return to the PCRE index page. -

      -

      -This page is part of the PCRE HTML documentation. It was generated automatically -from the original man page. If there is any nonsense in it, please consult the -man page, in case the conversion went wrong. -
      -
      -SYNOPSIS -
      -

      -#include <pcre.h> -

      -

      -int pcre32_utf32_to_host_byte_order(PCRE_UCHAR32 *output, - PCRE_SPTR32 input, int length, int *host_byte_order, - int keep_boms); -

      -
      -DESCRIPTION -
      -

      -This function, which exists only in the 32-bit library, converts a UTF-32 -string to the correct order for the current host, taking account of any byte -order marks (BOMs) within the string. Its arguments are: -

      -  output           pointer to output buffer, may be the same as input
      -  input            pointer to input buffer
      -  length           number of 32-bit units in the input, or negative for
      -                     a zero-terminated string
      -  host_byte_order  a NULL value or a non-zero value pointed to means
      -                     start in host byte order
      -  keep_boms        if non-zero, BOMs are copied to the output string
      -
      -The result of the function is the number of 32-bit units placed into the output -buffer, including the zero terminator if the string was zero-terminated. -

      -

      -If host_byte_order is not NULL, it is set to indicate the byte order that -is current at the end of the string. -

      -

      -There is a complete description of the PCRE native API in the -pcreapi -page and a description of the POSIX API in the -pcreposix -page. -

      -Return to the PCRE index page. -

      diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcre_version.html b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcre_version.html deleted file mode 100644 index d33e7189..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcre_version.html +++ /dev/null @@ -1,46 +0,0 @@ - - -pcre_version specification - - -

      pcre_version man page

      -

      -Return to the PCRE index page. -

      -

      -This page is part of the PCRE HTML documentation. It was generated automatically -from the original man page. If there is any nonsense in it, please consult the -man page, in case the conversion went wrong. -
      -
      -SYNOPSIS -
      -

      -#include <pcre.h> -

      -

      -const char *pcre_version(void); -

      -

      -const char *pcre16_version(void); -

      -

      -const char *pcre32_version(void); -

      -
      -DESCRIPTION -
      -

      -This function (even in the 16-bit and 32-bit libraries) returns a -zero-terminated, 8-bit character string that gives the version number of the -PCRE library and the date of its release. -

      -

      -There is a complete description of the PCRE native API in the -pcreapi -page and a description of the POSIX API in the -pcreposix -page. -

      -Return to the PCRE index page. -

      diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcreapi.html b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcreapi.html deleted file mode 100644 index 2d7adf18..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcreapi.html +++ /dev/null @@ -1,2921 +0,0 @@ - - -pcreapi specification - - -

      pcreapi man page

      -

      -Return to the PCRE index page. -

      -

      -This page is part of the PCRE HTML documentation. It was generated automatically -from the original man page. If there is any nonsense in it, please consult the -man page, in case the conversion went wrong. -
      -

      -

      -#include <pcre.h> -

      -
      PCRE NATIVE API BASIC FUNCTIONS
      -

      -pcre *pcre_compile(const char *pattern, int options, - const char **errptr, int *erroffset, - const unsigned char *tableptr); -
      -
      -pcre *pcre_compile2(const char *pattern, int options, - int *errorcodeptr, - const char **errptr, int *erroffset, - const unsigned char *tableptr); -
      -
      -pcre_extra *pcre_study(const pcre *code, int options, - const char **errptr); -
      -
      -void pcre_free_study(pcre_extra *extra); -
      -
      -int pcre_exec(const pcre *code, const pcre_extra *extra, - const char *subject, int length, int startoffset, - int options, int *ovector, int ovecsize); -
      -
      -int pcre_dfa_exec(const pcre *code, const pcre_extra *extra, - const char *subject, int length, int startoffset, - int options, int *ovector, int ovecsize, - int *workspace, int wscount); -

      -
      PCRE NATIVE API STRING EXTRACTION FUNCTIONS
      -

      -int pcre_copy_named_substring(const pcre *code, - const char *subject, int *ovector, - int stringcount, const char *stringname, - char *buffer, int buffersize); -
      -
      -int pcre_copy_substring(const char *subject, int *ovector, - int stringcount, int stringnumber, char *buffer, - int buffersize); -
      -
      -int pcre_get_named_substring(const pcre *code, - const char *subject, int *ovector, - int stringcount, const char *stringname, - const char **stringptr); -
      -
      -int pcre_get_stringnumber(const pcre *code, - const char *name); -
      -
      -int pcre_get_stringtable_entries(const pcre *code, - const char *name, char **first, char **last); -
      -
      -int pcre_get_substring(const char *subject, int *ovector, - int stringcount, int stringnumber, - const char **stringptr); -
      -
      -int pcre_get_substring_list(const char *subject, - int *ovector, int stringcount, const char ***listptr); -
      -
      -void pcre_free_substring(const char *stringptr); -
      -
      -void pcre_free_substring_list(const char **stringptr); -

      -
      PCRE NATIVE API AUXILIARY FUNCTIONS
      -

      -int pcre_jit_exec(const pcre *code, const pcre_extra *extra, - const char *subject, int length, int startoffset, - int options, int *ovector, int ovecsize, - pcre_jit_stack *jstack); -
      -
      -pcre_jit_stack *pcre_jit_stack_alloc(int startsize, int maxsize); -
      -
      -void pcre_jit_stack_free(pcre_jit_stack *stack); -
      -
      -void pcre_assign_jit_stack(pcre_extra *extra, - pcre_jit_callback callback, void *data); -
      -
      -const unsigned char *pcre_maketables(void); -
      -
      -int pcre_fullinfo(const pcre *code, const pcre_extra *extra, - int what, void *where); -
      -
      -int pcre_refcount(pcre *code, int adjust); -
      -
      -int pcre_config(int what, void *where); -
      -
      -const char *pcre_version(void); -
      -
      -int pcre_pattern_to_host_byte_order(pcre *code, - pcre_extra *extra, const unsigned char *tables); -

      -
      PCRE NATIVE API INDIRECTED FUNCTIONS
      -

      -void *(*pcre_malloc)(size_t); -
      -
      -void (*pcre_free)(void *); -
      -
      -void *(*pcre_stack_malloc)(size_t); -
      -
      -void (*pcre_stack_free)(void *); -
      -
      -int (*pcre_callout)(pcre_callout_block *); -
      -
      -int (*pcre_stack_guard)(void); -

      -
      PCRE 8-BIT, 16-BIT, AND 32-BIT LIBRARIES
      -

      -As well as support for 8-bit character strings, PCRE also supports 16-bit -strings (from release 8.30) and 32-bit strings (from release 8.32), by means of -two additional libraries. They can be built as well as, or instead of, the -8-bit library. To avoid too much complication, this document describes the -8-bit versions of the functions, with only occasional references to the 16-bit -and 32-bit libraries. -

      -

      -The 16-bit and 32-bit functions operate in the same way as their 8-bit -counterparts; they just use different data types for their arguments and -results, and their names start with pcre16_ or pcre32_ instead of -pcre_. For every option that has UTF8 in its name (for example, -PCRE_UTF8), there are corresponding 16-bit and 32-bit names with UTF8 replaced -by UTF16 or UTF32, respectively. This facility is in fact just cosmetic; the -16-bit and 32-bit option names define the same bit values. -

      -

      -References to bytes and UTF-8 in this document should be read as references to -16-bit data units and UTF-16 when using the 16-bit library, or 32-bit data -units and UTF-32 when using the 32-bit library, unless specified otherwise. -More details of the specific differences for the 16-bit and 32-bit libraries -are given in the -pcre16 -and -pcre32 -pages. -

      -
      PCRE API OVERVIEW
      -

      -PCRE has its own native API, which is described in this document. There are -also some wrapper functions (for the 8-bit library only) that correspond to the -POSIX regular expression API, but they do not give access to all the -functionality. They are described in the -pcreposix -documentation. Both of these APIs define a set of C function calls. A C++ -wrapper (again for the 8-bit library only) is also distributed with PCRE. It is -documented in the -pcrecpp -page. -

      -

      -The native API C function prototypes are defined in the header file -pcre.h, and on Unix-like systems the (8-bit) library itself is called -libpcre. It can normally be accessed by adding -lpcre to the -command for linking an application that uses PCRE. The header file defines the -macros PCRE_MAJOR and PCRE_MINOR to contain the major and minor release numbers -for the library. Applications can use these to include support for different -releases of PCRE. -

      -

      -In a Windows environment, if you want to statically link an application program -against a non-dll pcre.a file, you must define PCRE_STATIC before -including pcre.h or pcrecpp.h, because otherwise the -pcre_malloc() and pcre_free() exported functions will be declared -__declspec(dllimport), with unwanted results. -

      -

      -The functions pcre_compile(), pcre_compile2(), pcre_study(), -and pcre_exec() are used for compiling and matching regular expressions -in a Perl-compatible manner. A sample program that demonstrates the simplest -way of using them is provided in the file called pcredemo.c in the PCRE -source distribution. A listing of this program is given in the -pcredemo -documentation, and the -pcresample -documentation describes how to compile and run it. -

      -

      -Just-in-time compiler support is an optional feature of PCRE that can be built -in appropriate hardware environments. It greatly speeds up the matching -performance of many patterns. Simple programs can easily request that it be -used if available, by setting an option that is ignored when it is not -relevant. More complicated programs might need to make use of the functions -pcre_jit_stack_alloc(), pcre_jit_stack_free(), and -pcre_assign_jit_stack() in order to control the JIT code's memory usage. -

      -

      -From release 8.32 there is also a direct interface for JIT execution, which -gives improved performance. The JIT-specific functions are discussed in the -pcrejit -documentation. -

      -

      -A second matching function, pcre_dfa_exec(), which is not -Perl-compatible, is also provided. This uses a different algorithm for the -matching. The alternative algorithm finds all possible matches (at a given -point in the subject), and scans the subject just once (unless there are -lookbehind assertions). However, this algorithm does not return captured -substrings. A description of the two matching algorithms and their advantages -and disadvantages is given in the -pcrematching -documentation. -

      -

      -In addition to the main compiling and matching functions, there are convenience -functions for extracting captured substrings from a subject string that is -matched by pcre_exec(). They are: -

      -  pcre_copy_substring()
      -  pcre_copy_named_substring()
      -  pcre_get_substring()
      -  pcre_get_named_substring()
      -  pcre_get_substring_list()
      -  pcre_get_stringnumber()
      -  pcre_get_stringtable_entries()
      -
      -pcre_free_substring() and pcre_free_substring_list() are also -provided, to free the memory used for extracted strings. -

      -

      -The function pcre_maketables() is used to build a set of character tables -in the current locale for passing to pcre_compile(), pcre_exec(), -or pcre_dfa_exec(). This is an optional facility that is provided for -specialist use. Most commonly, no special tables are passed, in which case -internal tables that are generated when PCRE is built are used. -

      -

      -The function pcre_fullinfo() is used to find out information about a -compiled pattern. The function pcre_version() returns a pointer to a -string containing the version of PCRE and its date of release. -

      -

      -The function pcre_refcount() maintains a reference count in a data block -containing a compiled pattern. This is provided for the benefit of -object-oriented applications. -

      -

      -The global variables pcre_malloc and pcre_free initially contain -the entry points of the standard malloc() and free() functions, -respectively. PCRE calls the memory management functions via these variables, -so a calling program can replace them if it wishes to intercept the calls. This -should be done before calling any PCRE functions. -

      -

      -The global variables pcre_stack_malloc and pcre_stack_free are also -indirections to memory management functions. These special functions are used -only when PCRE is compiled to use the heap for remembering data, instead of -recursive function calls, when running the pcre_exec() function. See the -pcrebuild -documentation for details of how to do this. It is a non-standard way of -building PCRE, for use in environments that have limited stacks. Because of the -greater use of memory management, it runs more slowly. Separate functions are -provided so that special-purpose external code can be used for this case. When -used, these functions always allocate memory blocks of the same size. There is -a discussion about PCRE's stack usage in the -pcrestack -documentation. -

      -

      -The global variable pcre_callout initially contains NULL. It can be set -by the caller to a "callout" function, which PCRE will then call at specified -points during a matching operation. Details are given in the -pcrecallout -documentation. -

      -

      -The global variable pcre_stack_guard initially contains NULL. It can be -set by the caller to a function that is called by PCRE whenever it starts -to compile a parenthesized part of a pattern. When parentheses are nested, PCRE -uses recursive function calls, which use up the system stack. This function is -provided so that applications with restricted stacks can force a compilation -error if the stack runs out. The function should return zero if all is well, or -non-zero to force an error. -

      -
      NEWLINES
      -

      -PCRE supports five different conventions for indicating line breaks in -strings: a single CR (carriage return) character, a single LF (linefeed) -character, the two-character sequence CRLF, any of the three preceding, or any -Unicode newline sequence. The Unicode newline sequences are the three just -mentioned, plus the single characters VT (vertical tab, U+000B), FF (form feed, -U+000C), NEL (next line, U+0085), LS (line separator, U+2028), and PS -(paragraph separator, U+2029). -

      -

      -Each of the first three conventions is used by at least one operating system as -its standard newline sequence. When PCRE is built, a default can be specified. -The default default is LF, which is the Unix standard. When PCRE is run, the -default can be overridden, either when a pattern is compiled, or when it is -matched. -

      -

      -At compile time, the newline convention can be specified by the options -argument of pcre_compile(), or it can be specified by special text at the -start of the pattern itself; this overrides any other settings. See the -pcrepattern -page for details of the special character sequences. -

      -

      -In the PCRE documentation the word "newline" is used to mean "the character or -pair of characters that indicate a line break". The choice of newline -convention affects the handling of the dot, circumflex, and dollar -metacharacters, the handling of #-comments in /x mode, and, when CRLF is a -recognized line ending sequence, the match position advancement for a -non-anchored pattern. There is more detail about this in the -section on pcre_exec() options -below. -

      -

      -The choice of newline convention does not affect the interpretation of -the \n or \r escape sequences, nor does it affect what \R matches, which is -controlled in a similar way, but by separate options. -

      -
      MULTITHREADING
      -

      -The PCRE functions can be used in multi-threading applications, with the -proviso that the memory management functions pointed to by pcre_malloc, -pcre_free, pcre_stack_malloc, and pcre_stack_free, and the -callout and stack-checking functions pointed to by pcre_callout and -pcre_stack_guard, are shared by all threads. -

      -

      -The compiled form of a regular expression is not altered during matching, so -the same compiled pattern can safely be used by several threads at once. -

      -

      -If the just-in-time optimization feature is being used, it needs separate -memory stack areas for each thread. See the -pcrejit -documentation for more details. -

      -
      SAVING PRECOMPILED PATTERNS FOR LATER USE
      -

      -The compiled form of a regular expression can be saved and re-used at a later -time, possibly by a different program, and even on a host other than the one on -which it was compiled. Details are given in the -pcreprecompile -documentation, which includes a description of the -pcre_pattern_to_host_byte_order() function. However, compiling a regular -expression with one version of PCRE for use with a different version is not -guaranteed to work and may cause crashes. -

      -
      CHECKING BUILD-TIME OPTIONS
      -

      -int pcre_config(int what, void *where); -

      -

      -The function pcre_config() makes it possible for a PCRE client to -discover which optional features have been compiled into the PCRE library. The -pcrebuild -documentation has more details about these optional features. -

      -

      -The first argument for pcre_config() is an integer, specifying which -information is required; the second argument is a pointer to a variable into -which the information is placed. The returned value is zero on success, or the -negative error code PCRE_ERROR_BADOPTION if the value in the first argument is -not recognized. The following information is available: -

      -  PCRE_CONFIG_UTF8
      -
      -The output is an integer that is set to one if UTF-8 support is available; -otherwise it is set to zero. This value should normally be given to the 8-bit -version of this function, pcre_config(). If it is given to the 16-bit -or 32-bit version of this function, the result is PCRE_ERROR_BADOPTION. -
      -  PCRE_CONFIG_UTF16
      -
      -The output is an integer that is set to one if UTF-16 support is available; -otherwise it is set to zero. This value should normally be given to the 16-bit -version of this function, pcre16_config(). If it is given to the 8-bit -or 32-bit version of this function, the result is PCRE_ERROR_BADOPTION. -
      -  PCRE_CONFIG_UTF32
      -
      -The output is an integer that is set to one if UTF-32 support is available; -otherwise it is set to zero. This value should normally be given to the 32-bit -version of this function, pcre32_config(). If it is given to the 8-bit -or 16-bit version of this function, the result is PCRE_ERROR_BADOPTION. -
      -  PCRE_CONFIG_UNICODE_PROPERTIES
      -
      -The output is an integer that is set to one if support for Unicode character -properties is available; otherwise it is set to zero. -
      -  PCRE_CONFIG_JIT
      -
      -The output is an integer that is set to one if support for just-in-time -compiling is available; otherwise it is set to zero. -
      -  PCRE_CONFIG_JITTARGET
      -
      -The output is a pointer to a zero-terminated "const char *" string. If JIT -support is available, the string contains the name of the architecture for -which the JIT compiler is configured, for example "x86 32bit (little endian + -unaligned)". If JIT support is not available, the result is NULL. -
      -  PCRE_CONFIG_NEWLINE
      -
      -The output is an integer whose value specifies the default character sequence -that is recognized as meaning "newline". The values that are supported in -ASCII/Unicode environments are: 10 for LF, 13 for CR, 3338 for CRLF, -2 for -ANYCRLF, and -1 for ANY. In EBCDIC environments, CR, ANYCRLF, and ANY yield the -same values. However, the value for LF is normally 21, though some EBCDIC -environments use 37. The corresponding values for CRLF are 3349 and 3365. The -default should normally correspond to the standard sequence for your operating -system. -
      -  PCRE_CONFIG_BSR
      -
      -The output is an integer whose value indicates what character sequences the \R -escape sequence matches by default. A value of 0 means that \R matches any -Unicode line ending sequence; a value of 1 means that \R matches only CR, LF, -or CRLF. The default can be overridden when a pattern is compiled or matched. -
      -  PCRE_CONFIG_LINK_SIZE
      -
      -The output is an integer that contains the number of bytes used for internal -linkage in compiled regular expressions. For the 8-bit library, the value can -be 2, 3, or 4. For the 16-bit library, the value is either 2 or 4 and is still -a number of bytes. For the 32-bit library, the value is either 2 or 4 and is -still a number of bytes. The default value of 2 is sufficient for all but the -most massive patterns, since it allows the compiled pattern to be up to 64K in -size. Larger values allow larger regular expressions to be compiled, at the -expense of slower matching. -
      -  PCRE_CONFIG_POSIX_MALLOC_THRESHOLD
      -
      -The output is an integer that contains the threshold above which the POSIX -interface uses malloc() for output vectors. Further details are given in -the -pcreposix -documentation. -
      -  PCRE_CONFIG_PARENS_LIMIT
      -
      -The output is a long integer that gives the maximum depth of nesting of -parentheses (of any kind) in a pattern. This limit is imposed to cap the amount -of system stack used when a pattern is compiled. It is specified when PCRE is -built; the default is 250. This limit does not take into account the stack that -may already be used by the calling application. For finer control over -compilation stack usage, you can set a pointer to an external checking function -in pcre_stack_guard. -
      -  PCRE_CONFIG_MATCH_LIMIT
      -
      -The output is a long integer that gives the default limit for the number of -internal matching function calls in a pcre_exec() execution. Further -details are given with pcre_exec() below. -
      -  PCRE_CONFIG_MATCH_LIMIT_RECURSION
      -
      -The output is a long integer that gives the default limit for the depth of -recursion when calling the internal matching function in a pcre_exec() -execution. Further details are given with pcre_exec() below. -
      -  PCRE_CONFIG_STACKRECURSE
      -
      -The output is an integer that is set to one if internal recursion when running -pcre_exec() is implemented by recursive function calls that use the stack -to remember their state. This is the usual way that PCRE is compiled. The -output is zero if PCRE was compiled to use blocks of data on the heap instead -of recursive function calls. In this case, pcre_stack_malloc and -pcre_stack_free are called to manage memory blocks on the heap, thus -avoiding the use of the stack. -

      -
      COMPILING A PATTERN
      -

      -pcre *pcre_compile(const char *pattern, int options, - const char **errptr, int *erroffset, - const unsigned char *tableptr); -
      -
      -pcre *pcre_compile2(const char *pattern, int options, - int *errorcodeptr, - const char **errptr, int *erroffset, - const unsigned char *tableptr); -

      -

      -Either of the functions pcre_compile() or pcre_compile2() can be -called to compile a pattern into an internal form. The only difference between -the two interfaces is that pcre_compile2() has an additional argument, -errorcodeptr, via which a numerical error code can be returned. To avoid -too much repetition, we refer just to pcre_compile() below, but the -information applies equally to pcre_compile2(). -

      -

      -The pattern is a C string terminated by a binary zero, and is passed in the -pattern argument. A pointer to a single block of memory that is obtained -via pcre_malloc is returned. This contains the compiled code and related -data. The pcre type is defined for the returned block; this is a typedef -for a structure whose contents are not externally defined. It is up to the -caller to free the memory (via pcre_free) when it is no longer required. -

      -

      -Although the compiled code of a PCRE regex is relocatable, that is, it does not -depend on memory location, the complete pcre data block is not -fully relocatable, because it may contain a copy of the tableptr -argument, which is an address (see below). -

      -

      -The options argument contains various bit settings that affect the -compilation. It should be zero if no options are required. The available -options are described below. Some of them (in particular, those that are -compatible with Perl, but some others as well) can also be set and unset from -within the pattern (see the detailed description in the -pcrepattern -documentation). For those options that can be different in different parts of -the pattern, the contents of the options argument specifies their -settings at the start of compilation and execution. The PCRE_ANCHORED, -PCRE_BSR_xxx, PCRE_NEWLINE_xxx, PCRE_NO_UTF8_CHECK, and -PCRE_NO_START_OPTIMIZE options can be set at the time of matching as well as at -compile time. -

      -

      -If errptr is NULL, pcre_compile() returns NULL immediately. -Otherwise, if compilation of a pattern fails, pcre_compile() returns -NULL, and sets the variable pointed to by errptr to point to a textual -error message. This is a static string that is part of the library. You must -not try to free it. Normally, the offset from the start of the pattern to the -data unit that was being processed when the error was discovered is placed in -the variable pointed to by erroffset, which must not be NULL (if it is, -an immediate error is given). However, for an invalid UTF-8 or UTF-16 string, -the offset is that of the first data unit of the failing character. -

      -

      -Some errors are not detected until the whole pattern has been scanned; in these -cases, the offset passed back is the length of the pattern. Note that the -offset is in data units, not characters, even in a UTF mode. It may sometimes -point into the middle of a UTF-8 or UTF-16 character. -

      -

      -If pcre_compile2() is used instead of pcre_compile(), and the -errorcodeptr argument is not NULL, a non-zero error code number is -returned via this argument in the event of an error. This is in addition to the -textual error message. Error codes and messages are listed below. -

      -

      -If the final argument, tableptr, is NULL, PCRE uses a default set of -character tables that are built when PCRE is compiled, using the default C -locale. Otherwise, tableptr must be an address that is the result of a -call to pcre_maketables(). This value is stored with the compiled -pattern, and used again by pcre_exec() and pcre_dfa_exec() when the -pattern is matched. For more discussion, see the section on locale support -below. -

      -

      -This code fragment shows a typical straightforward call to pcre_compile(): -

      -  pcre *re;
      -  const char *error;
      -  int erroffset;
      -  re = pcre_compile(
      -    "^A.*Z",          /* the pattern */
      -    0,                /* default options */
      -    &error,           /* for error message */
      -    &erroffset,       /* for error offset */
      -    NULL);            /* use default character tables */
      -
      -The following names for option bits are defined in the pcre.h header -file: -
      -  PCRE_ANCHORED
      -
      -If this bit is set, the pattern is forced to be "anchored", that is, it is -constrained to match only at the first matching point in the string that is -being searched (the "subject string"). This effect can also be achieved by -appropriate constructs in the pattern itself, which is the only way to do it in -Perl. -
      -  PCRE_AUTO_CALLOUT
      -
      -If this bit is set, pcre_compile() automatically inserts callout items, -all with number 255, before each pattern item. For discussion of the callout -facility, see the -pcrecallout -documentation. -
      -  PCRE_BSR_ANYCRLF
      -  PCRE_BSR_UNICODE
      -
      -These options (which are mutually exclusive) control what the \R escape -sequence matches. The choice is either to match only CR, LF, or CRLF, or to -match any Unicode newline sequence. The default is specified when PCRE is -built. It can be overridden from within the pattern, or by setting an option -when a compiled pattern is matched. -
      -  PCRE_CASELESS
      -
      -If this bit is set, letters in the pattern match both upper and lower case -letters. It is equivalent to Perl's /i option, and it can be changed within a -pattern by a (?i) option setting. In UTF-8 mode, PCRE always understands the -concept of case for characters whose values are less than 128, so caseless -matching is always possible. For characters with higher values, the concept of -case is supported if PCRE is compiled with Unicode property support, but not -otherwise. If you want to use caseless matching for characters 128 and above, -you must ensure that PCRE is compiled with Unicode property support as well as -with UTF-8 support. -
      -  PCRE_DOLLAR_ENDONLY
      -
      -If this bit is set, a dollar metacharacter in the pattern matches only at the -end of the subject string. Without this option, a dollar also matches -immediately before a newline at the end of the string (but not before any other -newlines). The PCRE_DOLLAR_ENDONLY option is ignored if PCRE_MULTILINE is set. -There is no equivalent to this option in Perl, and no way to set it within a -pattern. -
      -  PCRE_DOTALL
      -
      -If this bit is set, a dot metacharacter in the pattern matches a character of -any value, including one that indicates a newline. However, it only ever -matches one character, even if newlines are coded as CRLF. Without this option, -a dot does not match when the current position is at a newline. This option is -equivalent to Perl's /s option, and it can be changed within a pattern by a -(?s) option setting. A negative class such as [^a] always matches newline -characters, independent of the setting of this option. -
      -  PCRE_DUPNAMES
      -
      -If this bit is set, names used to identify capturing subpatterns need not be -unique. This can be helpful for certain types of pattern when it is known that -only one instance of the named subpattern can ever be matched. There are more -details of named subpatterns below; see also the -pcrepattern -documentation. -
      -  PCRE_EXTENDED
      -
      -If this bit is set, most white space characters in the pattern are totally -ignored except when escaped or inside a character class. However, white space -is not allowed within sequences such as (?> that introduce various -parenthesized subpatterns, nor within a numerical quantifier such as {1,3}. -However, ignorable white space is permitted between an item and a following -quantifier and between a quantifier and a following + that indicates -possessiveness. -

      -

      -White space did not used to include the VT character (code 11), because Perl -did not treat this character as white space. However, Perl changed at release -5.18, so PCRE followed at release 8.34, and VT is now treated as white space. -

      -

      -PCRE_EXTENDED also causes characters between an unescaped # outside a character -class and the next newline, inclusive, to be ignored. PCRE_EXTENDED is -equivalent to Perl's /x option, and it can be changed within a pattern by a -(?x) option setting. -

      -

      -Which characters are interpreted as newlines is controlled by the options -passed to pcre_compile() or by a special sequence at the start of the -pattern, as described in the section entitled -"Newline conventions" -in the pcrepattern documentation. Note that the end of this type of -comment is a literal newline sequence in the pattern; escape sequences that -happen to represent a newline do not count. -

      -

      -This option makes it possible to include comments inside complicated patterns. -Note, however, that this applies only to data characters. White space characters -may never appear within special character sequences in a pattern, for example -within the sequence (?( that introduces a conditional subpattern. -

      -  PCRE_EXTRA
      -
      -This option was invented in order to turn on additional functionality of PCRE -that is incompatible with Perl, but it is currently of very little use. When -set, any backslash in a pattern that is followed by a letter that has no -special meaning causes an error, thus reserving these combinations for future -expansion. By default, as in Perl, a backslash followed by a letter with no -special meaning is treated as a literal. (Perl can, however, be persuaded to -give an error for this, by running it with the -w option.) There are at present -no other features controlled by this option. It can also be set by a (?X) -option setting within a pattern. -
      -  PCRE_FIRSTLINE
      -
      -If this option is set, an unanchored pattern is required to match before or at -the first newline in the subject string, though the matched text may continue -over the newline. -
      -  PCRE_JAVASCRIPT_COMPAT
      -
      -If this option is set, PCRE's behaviour is changed in some ways so that it is -compatible with JavaScript rather than Perl. The changes are as follows: -

      -

      -(1) A lone closing square bracket in a pattern causes a compile-time error, -because this is illegal in JavaScript (by default it is treated as a data -character). Thus, the pattern AB]CD becomes illegal when this option is set. -

      -

      -(2) At run time, a back reference to an unset subpattern group matches an empty -string (by default this causes the current matching alternative to fail). A -pattern such as (\1)(a) succeeds when this option is set (assuming it can find -an "a" in the subject), whereas it fails by default, for Perl compatibility. -

      -

      -(3) \U matches an upper case "U" character; by default \U causes a compile -time error (Perl uses \U to upper case subsequent characters). -

      -

      -(4) \u matches a lower case "u" character unless it is followed by four -hexadecimal digits, in which case the hexadecimal number defines the code point -to match. By default, \u causes a compile time error (Perl uses it to upper -case the following character). -

      -

      -(5) \x matches a lower case "x" character unless it is followed by two -hexadecimal digits, in which case the hexadecimal number defines the code point -to match. By default, as in Perl, a hexadecimal number is always expected after -\x, but it may have zero, one, or two digits (so, for example, \xz matches a -binary zero character followed by z). -

      -  PCRE_MULTILINE
      -
      -By default, for the purposes of matching "start of line" and "end of line", -PCRE treats the subject string as consisting of a single line of characters, -even if it actually contains newlines. The "start of line" metacharacter (^) -matches only at the start of the string, and the "end of line" metacharacter -($) matches only at the end of the string, or before a terminating newline -(except when PCRE_DOLLAR_ENDONLY is set). Note, however, that unless -PCRE_DOTALL is set, the "any character" metacharacter (.) does not match at a -newline. This behaviour (for ^, $, and dot) is the same as Perl. -

      -

      -When PCRE_MULTILINE it is set, the "start of line" and "end of line" constructs -match immediately following or immediately before internal newlines in the -subject string, respectively, as well as at the very start and end. This is -equivalent to Perl's /m option, and it can be changed within a pattern by a -(?m) option setting. If there are no newlines in a subject string, or no -occurrences of ^ or $ in a pattern, setting PCRE_MULTILINE has no effect. -

      -  PCRE_NEVER_UTF
      -
      -This option locks out interpretation of the pattern as UTF-8 (or UTF-16 or -UTF-32 in the 16-bit and 32-bit libraries). In particular, it prevents the -creator of the pattern from switching to UTF interpretation by starting the -pattern with (*UTF). This may be useful in applications that process patterns -from external sources. The combination of PCRE_UTF8 and PCRE_NEVER_UTF also -causes an error. -
      -  PCRE_NEWLINE_CR
      -  PCRE_NEWLINE_LF
      -  PCRE_NEWLINE_CRLF
      -  PCRE_NEWLINE_ANYCRLF
      -  PCRE_NEWLINE_ANY
      -
      -These options override the default newline definition that was chosen when PCRE -was built. Setting the first or the second specifies that a newline is -indicated by a single character (CR or LF, respectively). Setting -PCRE_NEWLINE_CRLF specifies that a newline is indicated by the two-character -CRLF sequence. Setting PCRE_NEWLINE_ANYCRLF specifies that any of the three -preceding sequences should be recognized. Setting PCRE_NEWLINE_ANY specifies -that any Unicode newline sequence should be recognized. -

      -

      -In an ASCII/Unicode environment, the Unicode newline sequences are the three -just mentioned, plus the single characters VT (vertical tab, U+000B), FF (form -feed, U+000C), NEL (next line, U+0085), LS (line separator, U+2028), and PS -(paragraph separator, U+2029). For the 8-bit library, the last two are -recognized only in UTF-8 mode. -

      -

      -When PCRE is compiled to run in an EBCDIC (mainframe) environment, the code for -CR is 0x0d, the same as ASCII. However, the character code for LF is normally -0x15, though in some EBCDIC environments 0x25 is used. Whichever of these is -not LF is made to correspond to Unicode's NEL character. EBCDIC codes are all -less than 256. For more details, see the -pcrebuild -documentation. -

      -

      -The newline setting in the options word uses three bits that are treated -as a number, giving eight possibilities. Currently only six are used (default -plus the five values above). This means that if you set more than one newline -option, the combination may or may not be sensible. For example, -PCRE_NEWLINE_CR with PCRE_NEWLINE_LF is equivalent to PCRE_NEWLINE_CRLF, but -other combinations may yield unused numbers and cause an error. -

      -

      -The only time that a line break in a pattern is specially recognized when -compiling is when PCRE_EXTENDED is set. CR and LF are white space characters, -and so are ignored in this mode. Also, an unescaped # outside a character class -indicates a comment that lasts until after the next line break sequence. In -other circumstances, line break sequences in patterns are treated as literal -data. -

      -

      -The newline option that is set at compile time becomes the default that is used -for pcre_exec() and pcre_dfa_exec(), but it can be overridden. -

      -  PCRE_NO_AUTO_CAPTURE
      -
      -If this option is set, it disables the use of numbered capturing parentheses in -the pattern. Any opening parenthesis that is not followed by ? behaves as if it -were followed by ?: but named parentheses can still be used for capturing (and -they acquire numbers in the usual way). There is no equivalent of this option -in Perl. -
      -  PCRE_NO_AUTO_POSSESS
      -
      -If this option is set, it disables "auto-possessification". This is an -optimization that, for example, turns a+b into a++b in order to avoid -backtracks into a+ that can never be successful. However, if callouts are in -use, auto-possessification means that some of them are never taken. You can set -this option if you want the matching functions to do a full unoptimized search -and run all the callouts, but it is mainly provided for testing purposes. -
      -  PCRE_NO_START_OPTIMIZE
      -
      -This is an option that acts at matching time; that is, it is really an option -for pcre_exec() or pcre_dfa_exec(). If it is set at compile time, -it is remembered with the compiled pattern and assumed at matching time. This -is necessary if you want to use JIT execution, because the JIT compiler needs -to know whether or not this option is set. For details see the discussion of -PCRE_NO_START_OPTIMIZE -below. -
      -  PCRE_UCP
      -
      -This option changes the way PCRE processes \B, \b, \D, \d, \S, \s, \W, -\w, and some of the POSIX character classes. By default, only ASCII characters -are recognized, but if PCRE_UCP is set, Unicode properties are used instead to -classify characters. More details are given in the section on -generic character types -in the -pcrepattern -page. If you set PCRE_UCP, matching one of the items it affects takes much -longer. The option is available only if PCRE has been compiled with Unicode -property support. -
      -  PCRE_UNGREEDY
      -
      -This option inverts the "greediness" of the quantifiers so that they are not -greedy by default, but become greedy if followed by "?". It is not compatible -with Perl. It can also be set by a (?U) option setting within the pattern. -
      -  PCRE_UTF8
      -
      -This option causes PCRE to regard both the pattern and the subject as strings -of UTF-8 characters instead of single-byte strings. However, it is available -only when PCRE is built to include UTF support. If not, the use of this option -provokes an error. Details of how this option changes the behaviour of PCRE are -given in the -pcreunicode -page. -
      -  PCRE_NO_UTF8_CHECK
      -
      -When PCRE_UTF8 is set, the validity of the pattern as a UTF-8 string is -automatically checked. There is a discussion about the -validity of UTF-8 strings -in the -pcreunicode -page. If an invalid UTF-8 sequence is found, pcre_compile() returns an -error. If you already know that your pattern is valid, and you want to skip -this check for performance reasons, you can set the PCRE_NO_UTF8_CHECK option. -When it is set, the effect of passing an invalid UTF-8 string as a pattern is -undefined. It may cause your program to crash or loop. Note that this option -can also be passed to pcre_exec() and pcre_dfa_exec(), to suppress -the validity checking of subject strings only. If the same string is being -matched many times, the option can be safely set for the second and subsequent -matchings to improve performance. -

      -
      COMPILATION ERROR CODES
      -

      -The following table lists the error codes than may be returned by -pcre_compile2(), along with the error messages that may be returned by -both compiling functions. Note that error messages are always 8-bit ASCII -strings, even in 16-bit or 32-bit mode. As PCRE has developed, some error codes -have fallen out of use. To avoid confusion, they have not been re-used. -

      -   0  no error
      -   1  \ at end of pattern
      -   2  \c at end of pattern
      -   3  unrecognized character follows \
      -   4  numbers out of order in {} quantifier
      -   5  number too big in {} quantifier
      -   6  missing terminating ] for character class
      -   7  invalid escape sequence in character class
      -   8  range out of order in character class
      -   9  nothing to repeat
      -  10  [this code is not in use]
      -  11  internal error: unexpected repeat
      -  12  unrecognized character after (? or (?-
      -  13  POSIX named classes are supported only within a class
      -  14  missing )
      -  15  reference to non-existent subpattern
      -  16  erroffset passed as NULL
      -  17  unknown option bit(s) set
      -  18  missing ) after comment
      -  19  [this code is not in use]
      -  20  regular expression is too large
      -  21  failed to get memory
      -  22  unmatched parentheses
      -  23  internal error: code overflow
      -  24  unrecognized character after (?<
      -  25  lookbehind assertion is not fixed length
      -  26  malformed number or name after (?(
      -  27  conditional group contains more than two branches
      -  28  assertion expected after (?(
      -  29  (?R or (?[+-]digits must be followed by )
      -  30  unknown POSIX class name
      -  31  POSIX collating elements are not supported
      -  32  this version of PCRE is compiled without UTF support
      -  33  [this code is not in use]
      -  34  character value in \x{} or \o{} is too large
      -  35  invalid condition (?(0)
      -  36  \C not allowed in lookbehind assertion
      -  37  PCRE does not support \L, \l, \N{name}, \U, or \u
      -  38  number after (?C is > 255
      -  39  closing ) for (?C expected
      -  40  recursive call could loop indefinitely
      -  41  unrecognized character after (?P
      -  42  syntax error in subpattern name (missing terminator)
      -  43  two named subpatterns have the same name
      -  44  invalid UTF-8 string (specifically UTF-8)
      -  45  support for \P, \p, and \X has not been compiled
      -  46  malformed \P or \p sequence
      -  47  unknown property name after \P or \p
      -  48  subpattern name is too long (maximum 32 characters)
      -  49  too many named subpatterns (maximum 10000)
      -  50  [this code is not in use]
      -  51  octal value is greater than \377 in 8-bit non-UTF-8 mode
      -  52  internal error: overran compiling workspace
      -  53  internal error: previously-checked referenced subpattern
      -        not found
      -  54  DEFINE group contains more than one branch
      -  55  repeating a DEFINE group is not allowed
      -  56  inconsistent NEWLINE options
      -  57  \g is not followed by a braced, angle-bracketed, or quoted
      -        name/number or by a plain number
      -  58  a numbered reference must not be zero
      -  59  an argument is not allowed for (*ACCEPT), (*FAIL), or (*COMMIT)
      -  60  (*VERB) not recognized or malformed
      -  61  number is too big
      -  62  subpattern name expected
      -  63  digit expected after (?+
      -  64  ] is an invalid data character in JavaScript compatibility mode
      -  65  different names for subpatterns of the same number are
      -        not allowed
      -  66  (*MARK) must have an argument
      -  67  this version of PCRE is not compiled with Unicode property
      -        support
      -  68  \c must be followed by an ASCII character
      -  69  \k is not followed by a braced, angle-bracketed, or quoted name
      -  70  internal error: unknown opcode in find_fixedlength()
      -  71  \N is not supported in a class
      -  72  too many forward references
      -  73  disallowed Unicode code point (>= 0xd800 && <= 0xdfff)
      -  74  invalid UTF-16 string (specifically UTF-16)
      -  75  name is too long in (*MARK), (*PRUNE), (*SKIP), or (*THEN)
      -  76  character value in \u.... sequence is too large
      -  77  invalid UTF-32 string (specifically UTF-32)
      -  78  setting UTF is disabled by the application
      -  79  non-hex character in \x{} (closing brace missing?)
      -  80  non-octal character in \o{} (closing brace missing?)
      -  81  missing opening brace after \o
      -  82  parentheses are too deeply nested
      -  83  invalid range in character class
      -  84  group name must start with a non-digit
      -  85  parentheses are too deeply nested (stack check)
      -
      -The numbers 32 and 10000 in errors 48 and 49 are defaults; different values may -be used if the limits were changed when PCRE was built. -

      -
      STUDYING A PATTERN
      -

      -pcre_extra *pcre_study(const pcre *code, int options, - const char **errptr); -

      -

      -If a compiled pattern is going to be used several times, it is worth spending -more time analyzing it in order to speed up the time taken for matching. The -function pcre_study() takes a pointer to a compiled pattern as its first -argument. If studying the pattern produces additional information that will -help speed up matching, pcre_study() returns a pointer to a -pcre_extra block, in which the study_data field points to the -results of the study. -

      -

      -The returned value from pcre_study() can be passed directly to -pcre_exec() or pcre_dfa_exec(). However, a pcre_extra block -also contains other fields that can be set by the caller before the block is -passed; these are described -below -in the section on matching a pattern. -

      -

      -If studying the pattern does not produce any useful information, -pcre_study() returns NULL by default. In that circumstance, if the -calling program wants to pass any of the other fields to pcre_exec() or -pcre_dfa_exec(), it must set up its own pcre_extra block. However, -if pcre_study() is called with the PCRE_STUDY_EXTRA_NEEDED option, it -returns a pcre_extra block even if studying did not find any additional -information. It may still return NULL, however, if an error occurs in -pcre_study(). -

      -

      -The second argument of pcre_study() contains option bits. There are three -further options in addition to PCRE_STUDY_EXTRA_NEEDED: -

      -  PCRE_STUDY_JIT_COMPILE
      -  PCRE_STUDY_JIT_PARTIAL_HARD_COMPILE
      -  PCRE_STUDY_JIT_PARTIAL_SOFT_COMPILE
      -
      -If any of these are set, and the just-in-time compiler is available, the -pattern is further compiled into machine code that executes much faster than -the pcre_exec() interpretive matching function. If the just-in-time -compiler is not available, these options are ignored. All undefined bits in the -options argument must be zero. -

      -

      -JIT compilation is a heavyweight optimization. It can take some time for -patterns to be analyzed, and for one-off matches and simple patterns the -benefit of faster execution might be offset by a much slower study time. -Not all patterns can be optimized by the JIT compiler. For those that cannot be -handled, matching automatically falls back to the pcre_exec() -interpreter. For more details, see the -pcrejit -documentation. -

      -

      -The third argument for pcre_study() is a pointer for an error message. If -studying succeeds (even if no data is returned), the variable it points to is -set to NULL. Otherwise it is set to point to a textual error message. This is a -static string that is part of the library. You must not try to free it. You -should test the error pointer for NULL after calling pcre_study(), to be -sure that it has run successfully. -

      -

      -When you are finished with a pattern, you can free the memory used for the -study data by calling pcre_free_study(). This function was added to the -API for release 8.20. For earlier versions, the memory could be freed with -pcre_free(), just like the pattern itself. This will still work in cases -where JIT optimization is not used, but it is advisable to change to the new -function when convenient. -

      -

      -This is a typical way in which pcre_study() is used (except that in a -real application there should be tests for errors): -

      -  int rc;
      -  pcre *re;
      -  pcre_extra *sd;
      -  re = pcre_compile("pattern", 0, &error, &erroroffset, NULL);
      -  sd = pcre_study(
      -    re,             /* result of pcre_compile() */
      -    0,              /* no options */
      -    &error);        /* set to NULL or points to a message */
      -  rc = pcre_exec(   /* see below for details of pcre_exec() options */
      -    re, sd, "subject", 7, 0, 0, ovector, 30);
      -  ...
      -  pcre_free_study(sd);
      -  pcre_free(re);
      -
      -Studying a pattern does two things: first, a lower bound for the length of -subject string that is needed to match the pattern is computed. This does not -mean that there are any strings of that length that match, but it does -guarantee that no shorter strings match. The value is used to avoid wasting -time by trying to match strings that are shorter than the lower bound. You can -find out the value in a calling program via the pcre_fullinfo() function. -

      -

      -Studying a pattern is also useful for non-anchored patterns that do not have a -single fixed starting character. A bitmap of possible starting bytes is -created. This speeds up finding a position in the subject at which to start -matching. (In 16-bit mode, the bitmap is used for 16-bit values less than 256. -In 32-bit mode, the bitmap is used for 32-bit values less than 256.) -

      -

      -These two optimizations apply to both pcre_exec() and -pcre_dfa_exec(), and the information is also used by the JIT compiler. -The optimizations can be disabled by setting the PCRE_NO_START_OPTIMIZE option. -You might want to do this if your pattern contains callouts or (*MARK) and you -want to make use of these facilities in cases where matching fails. -

      -

      -PCRE_NO_START_OPTIMIZE can be specified at either compile time or execution -time. However, if PCRE_NO_START_OPTIMIZE is passed to pcre_exec(), (that -is, after any JIT compilation has happened) JIT execution is disabled. For JIT -execution to work with PCRE_NO_START_OPTIMIZE, the option must be set at -compile time. -

      -

      -There is a longer discussion of PCRE_NO_START_OPTIMIZE -below. -

      -
      LOCALE SUPPORT
      -

      -PCRE handles caseless matching, and determines whether characters are letters, -digits, or whatever, by reference to a set of tables, indexed by character -code point. When running in UTF-8 mode, or in the 16- or 32-bit libraries, this -applies only to characters with code points less than 256. By default, -higher-valued code points never match escapes such as \w or \d. However, if -PCRE is built with Unicode property support, all characters can be tested with -\p and \P, or, alternatively, the PCRE_UCP option can be set when a pattern -is compiled; this causes \w and friends to use Unicode property support -instead of the built-in tables. -

      -

      -The use of locales with Unicode is discouraged. If you are handling characters -with code points greater than 128, you should either use Unicode support, or -use locales, but not try to mix the two. -

      -

      -PCRE contains an internal set of tables that are used when the final argument -of pcre_compile() is NULL. These are sufficient for many applications. -Normally, the internal tables recognize only ASCII characters. However, when -PCRE is built, it is possible to cause the internal tables to be rebuilt in the -default "C" locale of the local system, which may cause them to be different. -

      -

      -The internal tables can always be overridden by tables supplied by the -application that calls PCRE. These may be created in a different locale from -the default. As more and more applications change to using Unicode, the need -for this locale support is expected to die away. -

      -

      -External tables are built by calling the pcre_maketables() function, -which has no arguments, in the relevant locale. The result can then be passed -to pcre_compile() as often as necessary. For example, to build and use -tables that are appropriate for the French locale (where accented characters -with values greater than 128 are treated as letters), the following code could -be used: -

      -  setlocale(LC_CTYPE, "fr_FR");
      -  tables = pcre_maketables();
      -  re = pcre_compile(..., tables);
      -
      -The locale name "fr_FR" is used on Linux and other Unix-like systems; if you -are using Windows, the name for the French locale is "french". -

      -

      -When pcre_maketables() runs, the tables are built in memory that is -obtained via pcre_malloc. It is the caller's responsibility to ensure -that the memory containing the tables remains available for as long as it is -needed. -

      -

      -The pointer that is passed to pcre_compile() is saved with the compiled -pattern, and the same tables are used via this pointer by pcre_study() -and also by pcre_exec() and pcre_dfa_exec(). Thus, for any single -pattern, compilation, studying and matching all happen in the same locale, but -different patterns can be processed in different locales. -

      -

      -It is possible to pass a table pointer or NULL (indicating the use of the -internal tables) to pcre_exec() or pcre_dfa_exec() (see the -discussion below in the section on matching a pattern). This facility is -provided for use with pre-compiled patterns that have been saved and reloaded. -Character tables are not saved with patterns, so if a non-standard table was -used at compile time, it must be provided again when the reloaded pattern is -matched. Attempting to use this facility to match a pattern in a different -locale from the one in which it was compiled is likely to lead to anomalous -(usually incorrect) results. -

      -
      INFORMATION ABOUT A PATTERN
      -

      -int pcre_fullinfo(const pcre *code, const pcre_extra *extra, - int what, void *where); -

      -

      -The pcre_fullinfo() function returns information about a compiled -pattern. It replaces the pcre_info() function, which was removed from the -library at version 8.30, after more than 10 years of obsolescence. -

      -

      -The first argument for pcre_fullinfo() is a pointer to the compiled -pattern. The second argument is the result of pcre_study(), or NULL if -the pattern was not studied. The third argument specifies which piece of -information is required, and the fourth argument is a pointer to a variable -to receive the data. The yield of the function is zero for success, or one of -the following negative numbers: -

      -  PCRE_ERROR_NULL           the argument code was NULL
      -                            the argument where was NULL
      -  PCRE_ERROR_BADMAGIC       the "magic number" was not found
      -  PCRE_ERROR_BADENDIANNESS  the pattern was compiled with different
      -                            endianness
      -  PCRE_ERROR_BADOPTION      the value of what was invalid
      -  PCRE_ERROR_UNSET          the requested field is not set
      -
      -The "magic number" is placed at the start of each compiled pattern as an simple -check against passing an arbitrary memory pointer. The endianness error can -occur if a compiled pattern is saved and reloaded on a different host. Here is -a typical call of pcre_fullinfo(), to obtain the length of the compiled -pattern: -
      -  int rc;
      -  size_t length;
      -  rc = pcre_fullinfo(
      -    re,               /* result of pcre_compile() */
      -    sd,               /* result of pcre_study(), or NULL */
      -    PCRE_INFO_SIZE,   /* what is required */
      -    &length);         /* where to put the data */
      -
      -The possible values for the third argument are defined in pcre.h, and are -as follows: -
      -  PCRE_INFO_BACKREFMAX
      -
      -Return the number of the highest back reference in the pattern. The fourth -argument should point to an int variable. Zero is returned if there are -no back references. -
      -  PCRE_INFO_CAPTURECOUNT
      -
      -Return the number of capturing subpatterns in the pattern. The fourth argument -should point to an int variable. -
      -  PCRE_INFO_DEFAULT_TABLES
      -
      -Return a pointer to the internal default character tables within PCRE. The -fourth argument should point to an unsigned char * variable. This -information call is provided for internal use by the pcre_study() -function. External callers can cause PCRE to use its internal tables by passing -a NULL table pointer. -
      -  PCRE_INFO_FIRSTBYTE (deprecated)
      -
      -Return information about the first data unit of any matched string, for a -non-anchored pattern. The name of this option refers to the 8-bit library, -where data units are bytes. The fourth argument should point to an int -variable. Negative values are used for special cases. However, this means that -when the 32-bit library is in non-UTF-32 mode, the full 32-bit range of -characters cannot be returned. For this reason, this value is deprecated; use -PCRE_INFO_FIRSTCHARACTERFLAGS and PCRE_INFO_FIRSTCHARACTER instead. -

      -

      -If there is a fixed first value, for example, the letter "c" from a pattern -such as (cat|cow|coyote), its value is returned. In the 8-bit library, the -value is always less than 256. In the 16-bit library the value can be up to -0xffff. In the 32-bit library the value can be up to 0x10ffff. -

      -

      -If there is no fixed first value, and if either -
      -
      -(a) the pattern was compiled with the PCRE_MULTILINE option, and every branch -starts with "^", or -
      -
      -(b) every branch of the pattern starts with ".*" and PCRE_DOTALL is not set -(if it were set, the pattern would be anchored), -
      -
      --1 is returned, indicating that the pattern matches only at the start of a -subject string or after any newline within the string. Otherwise -2 is -returned. For anchored patterns, -2 is returned. -

      -  PCRE_INFO_FIRSTCHARACTER
      -
      -Return the value of the first data unit (non-UTF character) of any matched -string in the situation where PCRE_INFO_FIRSTCHARACTERFLAGS returns 1; -otherwise return 0. The fourth argument should point to an uint_t -variable. -

      -

      -In the 8-bit library, the value is always less than 256. In the 16-bit library -the value can be up to 0xffff. In the 32-bit library in UTF-32 mode the value -can be up to 0x10ffff, and up to 0xffffffff when not using UTF-32 mode. -

      -  PCRE_INFO_FIRSTCHARACTERFLAGS
      -
      -Return information about the first data unit of any matched string, for a -non-anchored pattern. The fourth argument should point to an int -variable. -

      -

      -If there is a fixed first value, for example, the letter "c" from a pattern -such as (cat|cow|coyote), 1 is returned, and the character value can be -retrieved using PCRE_INFO_FIRSTCHARACTER. If there is no fixed first value, and -if either -
      -
      -(a) the pattern was compiled with the PCRE_MULTILINE option, and every branch -starts with "^", or -
      -
      -(b) every branch of the pattern starts with ".*" and PCRE_DOTALL is not set -(if it were set, the pattern would be anchored), -
      -
      -2 is returned, indicating that the pattern matches only at the start of a -subject string or after any newline within the string. Otherwise 0 is -returned. For anchored patterns, 0 is returned. -

      -  PCRE_INFO_FIRSTTABLE
      -
      -If the pattern was studied, and this resulted in the construction of a 256-bit -table indicating a fixed set of values for the first data unit in any matching -string, a pointer to the table is returned. Otherwise NULL is returned. The -fourth argument should point to an unsigned char * variable. -
      -  PCRE_INFO_HASCRORLF
      -
      -Return 1 if the pattern contains any explicit matches for CR or LF characters, -otherwise 0. The fourth argument should point to an int variable. An -explicit match is either a literal CR or LF character, or \r or \n. -
      -  PCRE_INFO_JCHANGED
      -
      -Return 1 if the (?J) or (?-J) option setting is used in the pattern, otherwise -0. The fourth argument should point to an int variable. (?J) and -(?-J) set and unset the local PCRE_DUPNAMES option, respectively. -
      -  PCRE_INFO_JIT
      -
      -Return 1 if the pattern was studied with one of the JIT options, and -just-in-time compiling was successful. The fourth argument should point to an -int variable. A return value of 0 means that JIT support is not available -in this version of PCRE, or that the pattern was not studied with a JIT option, -or that the JIT compiler could not handle this particular pattern. See the -pcrejit -documentation for details of what can and cannot be handled. -
      -  PCRE_INFO_JITSIZE
      -
      -If the pattern was successfully studied with a JIT option, return the size of -the JIT compiled code, otherwise return zero. The fourth argument should point -to a size_t variable. -
      -  PCRE_INFO_LASTLITERAL
      -
      -Return the value of the rightmost literal data unit that must exist in any -matched string, other than at its start, if such a value has been recorded. The -fourth argument should point to an int variable. If there is no such -value, -1 is returned. For anchored patterns, a last literal value is recorded -only if it follows something of variable length. For example, for the pattern -/^a\d+z\d+/ the returned value is "z", but for /^a\dz\d/ the returned value -is -1. -

      -

      -Since for the 32-bit library using the non-UTF-32 mode, this function is unable -to return the full 32-bit range of characters, this value is deprecated; -instead the PCRE_INFO_REQUIREDCHARFLAGS and PCRE_INFO_REQUIREDCHAR values should -be used. -

      -  PCRE_INFO_MATCH_EMPTY
      -
      -Return 1 if the pattern can match an empty string, otherwise 0. The fourth -argument should point to an int variable. -
      -  PCRE_INFO_MATCHLIMIT
      -
      -If the pattern set a match limit by including an item of the form -(*LIMIT_MATCH=nnnn) at the start, the value is returned. The fourth argument -should point to an unsigned 32-bit integer. If no such value has been set, the -call to pcre_fullinfo() returns the error PCRE_ERROR_UNSET. -
      -  PCRE_INFO_MAXLOOKBEHIND
      -
      -Return the number of characters (NB not data units) in the longest lookbehind -assertion in the pattern. This information is useful when doing multi-segment -matching using the partial matching facilities. Note that the simple assertions -\b and \B require a one-character lookbehind. \A also registers a -one-character lookbehind, though it does not actually inspect the previous -character. This is to ensure that at least one character from the old segment -is retained when a new segment is processed. Otherwise, if there are no -lookbehinds in the pattern, \A might match incorrectly at the start of a new -segment. -
      -  PCRE_INFO_MINLENGTH
      -
      -If the pattern was studied and a minimum length for matching subject strings -was computed, its value is returned. Otherwise the returned value is -1. The -value is a number of characters, which in UTF mode may be different from the -number of data units. The fourth argument should point to an int -variable. A non-negative value is a lower bound to the length of any matching -string. There may not be any strings of that length that do actually match, but -every string that does match is at least that long. -
      -  PCRE_INFO_NAMECOUNT
      -  PCRE_INFO_NAMEENTRYSIZE
      -  PCRE_INFO_NAMETABLE
      -
      -PCRE supports the use of named as well as numbered capturing parentheses. The -names are just an additional way of identifying the parentheses, which still -acquire numbers. Several convenience functions such as -pcre_get_named_substring() are provided for extracting captured -substrings by name. It is also possible to extract the data directly, by first -converting the name to a number in order to access the correct pointers in the -output vector (described with pcre_exec() below). To do the conversion, -you need to use the name-to-number map, which is described by these three -values. -

      -

      -The map consists of a number of fixed-size entries. PCRE_INFO_NAMECOUNT gives -the number of entries, and PCRE_INFO_NAMEENTRYSIZE gives the size of each -entry; both of these return an int value. The entry size depends on the -length of the longest name. PCRE_INFO_NAMETABLE returns a pointer to the first -entry of the table. This is a pointer to char in the 8-bit library, where -the first two bytes of each entry are the number of the capturing parenthesis, -most significant byte first. In the 16-bit library, the pointer points to -16-bit data units, the first of which contains the parenthesis number. In the -32-bit library, the pointer points to 32-bit data units, the first of which -contains the parenthesis number. The rest of the entry is the corresponding -name, zero terminated. -

      -

      -The names are in alphabetical order. If (?| is used to create multiple groups -with the same number, as described in the -section on duplicate subpattern numbers -in the -pcrepattern -page, the groups may be given the same name, but there is only one entry in the -table. Different names for groups of the same number are not permitted. -Duplicate names for subpatterns with different numbers are permitted, -but only if PCRE_DUPNAMES is set. They appear in the table in the order in -which they were found in the pattern. In the absence of (?| this is the order -of increasing number; when (?| is used this is not necessarily the case because -later subpatterns may have lower numbers. -

      -

      -As a simple example of the name/number table, consider the following pattern -after compilation by the 8-bit library (assume PCRE_EXTENDED is set, so white -space - including newlines - is ignored): -

      -  (?<date> (?<year>(\d\d)?\d\d) - (?<month>\d\d) - (?<day>\d\d) )
      -
      -There are four named subpatterns, so the table has four entries, and each entry -in the table is eight bytes long. The table is as follows, with non-printing -bytes shows in hexadecimal, and undefined bytes shown as ??: -
      -  00 01 d  a  t  e  00 ??
      -  00 05 d  a  y  00 ?? ??
      -  00 04 m  o  n  t  h  00
      -  00 02 y  e  a  r  00 ??
      -
      -When writing code to extract data from named subpatterns using the -name-to-number map, remember that the length of the entries is likely to be -different for each compiled pattern. -
      -  PCRE_INFO_OKPARTIAL
      -
      -Return 1 if the pattern can be used for partial matching with -pcre_exec(), otherwise 0. The fourth argument should point to an -int variable. From release 8.00, this always returns 1, because the -restrictions that previously applied to partial matching have been lifted. The -pcrepartial -documentation gives details of partial matching. -
      -  PCRE_INFO_OPTIONS
      -
      -Return a copy of the options with which the pattern was compiled. The fourth -argument should point to an unsigned long int variable. These option bits -are those specified in the call to pcre_compile(), modified by any -top-level option settings at the start of the pattern itself. In other words, -they are the options that will be in force when matching starts. For example, -if the pattern /(?im)abc(?-i)d/ is compiled with the PCRE_EXTENDED option, the -result is PCRE_CASELESS, PCRE_MULTILINE, and PCRE_EXTENDED. -

      -

      -A pattern is automatically anchored by PCRE if all of its top-level -alternatives begin with one of the following: -

      -  ^     unless PCRE_MULTILINE is set
      -  \A    always
      -  \G    always
      -  .*    if PCRE_DOTALL is set and there are no back references to the subpattern in which .* appears
      -
      -For such patterns, the PCRE_ANCHORED bit is set in the options returned by -pcre_fullinfo(). -
      -  PCRE_INFO_RECURSIONLIMIT
      -
      -If the pattern set a recursion limit by including an item of the form -(*LIMIT_RECURSION=nnnn) at the start, the value is returned. The fourth -argument should point to an unsigned 32-bit integer. If no such value has been -set, the call to pcre_fullinfo() returns the error PCRE_ERROR_UNSET. -
      -  PCRE_INFO_SIZE
      -
      -Return the size of the compiled pattern in bytes (for all three libraries). The -fourth argument should point to a size_t variable. This value does not -include the size of the pcre structure that is returned by -pcre_compile(). The value that is passed as the argument to -pcre_malloc() when pcre_compile() is getting memory in which to -place the compiled data is the value returned by this option plus the size of -the pcre structure. Studying a compiled pattern, with or without JIT, -does not alter the value returned by this option. -
      -  PCRE_INFO_STUDYSIZE
      -
      -Return the size in bytes (for all three libraries) of the data block pointed to -by the study_data field in a pcre_extra block. If pcre_extra -is NULL, or there is no study data, zero is returned. The fourth argument -should point to a size_t variable. The study_data field is set by -pcre_study() to record information that will speed up matching (see the -section entitled -"Studying a pattern" -above). The format of the study_data block is private, but its length -is made available via this option so that it can be saved and restored (see the -pcreprecompile -documentation for details). -
      -  PCRE_INFO_REQUIREDCHARFLAGS
      -
      -Returns 1 if there is a rightmost literal data unit that must exist in any -matched string, other than at its start. The fourth argument should point to -an int variable. If there is no such value, 0 is returned. If returning -1, the character value itself can be retrieved using PCRE_INFO_REQUIREDCHAR. -

      -

      -For anchored patterns, a last literal value is recorded only if it follows -something of variable length. For example, for the pattern /^a\d+z\d+/ the -returned value 1 (with "z" returned from PCRE_INFO_REQUIREDCHAR), but for -/^a\dz\d/ the returned value is 0. -

      -  PCRE_INFO_REQUIREDCHAR
      -
      -Return the value of the rightmost literal data unit that must exist in any -matched string, other than at its start, if such a value has been recorded. The -fourth argument should point to an uint32_t variable. If there is no such -value, 0 is returned. -

      -
      REFERENCE COUNTS
      -

      -int pcre_refcount(pcre *code, int adjust); -

      -

      -The pcre_refcount() function is used to maintain a reference count in the -data block that contains a compiled pattern. It is provided for the benefit of -applications that operate in an object-oriented manner, where different parts -of the application may be using the same compiled pattern, but you want to free -the block when they are all done. -

      -

      -When a pattern is compiled, the reference count field is initialized to zero. -It is changed only by calling this function, whose action is to add the -adjust value (which may be positive or negative) to it. The yield of the -function is the new value. However, the value of the count is constrained to -lie between 0 and 65535, inclusive. If the new value is outside these limits, -it is forced to the appropriate limit value. -

      -

      -Except when it is zero, the reference count is not correctly preserved if a -pattern is compiled on one host and then transferred to a host whose byte-order -is different. (This seems a highly unlikely scenario.) -

      -
      MATCHING A PATTERN: THE TRADITIONAL FUNCTION
      -

      -int pcre_exec(const pcre *code, const pcre_extra *extra, - const char *subject, int length, int startoffset, - int options, int *ovector, int ovecsize); -

      -

      -The function pcre_exec() is called to match a subject string against a -compiled pattern, which is passed in the code argument. If the -pattern was studied, the result of the study should be passed in the -extra argument. You can call pcre_exec() with the same code -and extra arguments as many times as you like, in order to match -different subject strings with the same pattern. -

      -

      -This function is the main matching facility of the library, and it operates in -a Perl-like manner. For specialist use there is also an alternative matching -function, which is described -below -in the section about the pcre_dfa_exec() function. -

      -

      -In most applications, the pattern will have been compiled (and optionally -studied) in the same process that calls pcre_exec(). However, it is -possible to save compiled patterns and study data, and then use them later -in different processes, possibly even on different hosts. For a discussion -about this, see the -pcreprecompile -documentation. -

      -

      -Here is an example of a simple call to pcre_exec(): -

      -  int rc;
      -  int ovector[30];
      -  rc = pcre_exec(
      -    re,             /* result of pcre_compile() */
      -    NULL,           /* we didn't study the pattern */
      -    "some string",  /* the subject string */
      -    11,             /* the length of the subject string */
      -    0,              /* start at offset 0 in the subject */
      -    0,              /* default options */
      -    ovector,        /* vector of integers for substring information */
      -    30);            /* number of elements (NOT size in bytes) */
      -
      -

      -
      -Extra data for pcre_exec() -
      -

      -If the extra argument is not NULL, it must point to a pcre_extra -data block. The pcre_study() function returns such a block (when it -doesn't return NULL), but you can also create one for yourself, and pass -additional information in it. The pcre_extra block contains the following -fields (not necessarily in this order): -

      -  unsigned long int flags;
      -  void *study_data;
      -  void *executable_jit;
      -  unsigned long int match_limit;
      -  unsigned long int match_limit_recursion;
      -  void *callout_data;
      -  const unsigned char *tables;
      -  unsigned char **mark;
      -
      -In the 16-bit version of this structure, the mark field has type -"PCRE_UCHAR16 **". -
      -
      -In the 32-bit version of this structure, the mark field has type -"PCRE_UCHAR32 **". -

      -

      -The flags field is used to specify which of the other fields are set. The -flag bits are: -

      -  PCRE_EXTRA_CALLOUT_DATA
      -  PCRE_EXTRA_EXECUTABLE_JIT
      -  PCRE_EXTRA_MARK
      -  PCRE_EXTRA_MATCH_LIMIT
      -  PCRE_EXTRA_MATCH_LIMIT_RECURSION
      -  PCRE_EXTRA_STUDY_DATA
      -  PCRE_EXTRA_TABLES
      -
      -Other flag bits should be set to zero. The study_data field and sometimes -the executable_jit field are set in the pcre_extra block that is -returned by pcre_study(), together with the appropriate flag bits. You -should not set these yourself, but you may add to the block by setting other -fields and their corresponding flag bits. -

      -

      -The match_limit field provides a means of preventing PCRE from using up a -vast amount of resources when running patterns that are not going to match, -but which have a very large number of possibilities in their search trees. The -classic example is a pattern that uses nested unlimited repeats. -

      -

      -Internally, pcre_exec() uses a function called match(), which it -calls repeatedly (sometimes recursively). The limit set by match_limit is -imposed on the number of times this function is called during a match, which -has the effect of limiting the amount of backtracking that can take place. For -patterns that are not anchored, the count restarts from zero for each position -in the subject string. -

      -

      -When pcre_exec() is called with a pattern that was successfully studied -with a JIT option, the way that the matching is executed is entirely different. -However, there is still the possibility of runaway matching that goes on for a -very long time, and so the match_limit value is also used in this case -(but in a different way) to limit how long the matching can continue. -

      -

      -The default value for the limit can be set when PCRE is built; the default -default is 10 million, which handles all but the most extreme cases. You can -override the default by suppling pcre_exec() with a pcre_extra -block in which match_limit is set, and PCRE_EXTRA_MATCH_LIMIT is set in -the flags field. If the limit is exceeded, pcre_exec() returns -PCRE_ERROR_MATCHLIMIT. -

      -

      -A value for the match limit may also be supplied by an item at the start of a -pattern of the form -

      -  (*LIMIT_MATCH=d)
      -
      -where d is a decimal number. However, such a setting is ignored unless d is -less than the limit set by the caller of pcre_exec() or, if no such limit -is set, less than the default. -

      -

      -The match_limit_recursion field is similar to match_limit, but -instead of limiting the total number of times that match() is called, it -limits the depth of recursion. The recursion depth is a smaller number than the -total number of calls, because not all calls to match() are recursive. -This limit is of use only if it is set smaller than match_limit. -

      -

      -Limiting the recursion depth limits the amount of machine stack that can be -used, or, when PCRE has been compiled to use memory on the heap instead of the -stack, the amount of heap memory that can be used. This limit is not relevant, -and is ignored, when matching is done using JIT compiled code. -

      -

      -The default value for match_limit_recursion can be set when PCRE is -built; the default default is the same value as the default for -match_limit. You can override the default by suppling pcre_exec() -with a pcre_extra block in which match_limit_recursion is set, and -PCRE_EXTRA_MATCH_LIMIT_RECURSION is set in the flags field. If the limit -is exceeded, pcre_exec() returns PCRE_ERROR_RECURSIONLIMIT. -

      -

      -A value for the recursion limit may also be supplied by an item at the start of -a pattern of the form -

      -  (*LIMIT_RECURSION=d)
      -
      -where d is a decimal number. However, such a setting is ignored unless d is -less than the limit set by the caller of pcre_exec() or, if no such limit -is set, less than the default. -

      -

      -The callout_data field is used in conjunction with the "callout" feature, -and is described in the -pcrecallout -documentation. -

      -

      -The tables field is provided for use with patterns that have been -pre-compiled using custom character tables, saved to disc or elsewhere, and -then reloaded, because the tables that were used to compile a pattern are not -saved with it. See the -pcreprecompile -documentation for a discussion of saving compiled patterns for later use. If -NULL is passed using this mechanism, it forces PCRE's internal tables to be -used. -

      -

      -Warning: The tables that pcre_exec() uses must be the same as those -that were used when the pattern was compiled. If this is not the case, the -behaviour of pcre_exec() is undefined. Therefore, when a pattern is -compiled and matched in the same process, this field should never be set. In -this (the most common) case, the correct table pointer is automatically passed -with the compiled pattern from pcre_compile() to pcre_exec(). -

      -

      -If PCRE_EXTRA_MARK is set in the flags field, the mark field must -be set to point to a suitable variable. If the pattern contains any -backtracking control verbs such as (*MARK:NAME), and the execution ends up with -a name to pass back, a pointer to the name string (zero terminated) is placed -in the variable pointed to by the mark field. The names are within the -compiled pattern; if you wish to retain such a name you must copy it before -freeing the memory of a compiled pattern. If there is no name to pass back, the -variable pointed to by the mark field is set to NULL. For details of the -backtracking control verbs, see the section entitled -"Backtracking control" -in the -pcrepattern -documentation. -

      -
      -Option bits for pcre_exec() -
      -

      -The unused bits of the options argument for pcre_exec() must be -zero. The only bits that may be set are PCRE_ANCHORED, PCRE_NEWLINE_xxx, -PCRE_NOTBOL, PCRE_NOTEOL, PCRE_NOTEMPTY, PCRE_NOTEMPTY_ATSTART, -PCRE_NO_START_OPTIMIZE, PCRE_NO_UTF8_CHECK, PCRE_PARTIAL_HARD, and -PCRE_PARTIAL_SOFT. -

      -

      -If the pattern was successfully studied with one of the just-in-time (JIT) -compile options, the only supported options for JIT execution are -PCRE_NO_UTF8_CHECK, PCRE_NOTBOL, PCRE_NOTEOL, PCRE_NOTEMPTY, -PCRE_NOTEMPTY_ATSTART, PCRE_PARTIAL_HARD, and PCRE_PARTIAL_SOFT. If an -unsupported option is used, JIT execution is disabled and the normal -interpretive code in pcre_exec() is run. -

      -  PCRE_ANCHORED
      -
      -The PCRE_ANCHORED option limits pcre_exec() to matching at the first -matching position. If a pattern was compiled with PCRE_ANCHORED, or turned out -to be anchored by virtue of its contents, it cannot be made unachored at -matching time. -
      -  PCRE_BSR_ANYCRLF
      -  PCRE_BSR_UNICODE
      -
      -These options (which are mutually exclusive) control what the \R escape -sequence matches. The choice is either to match only CR, LF, or CRLF, or to -match any Unicode newline sequence. These options override the choice that was -made or defaulted when the pattern was compiled. -
      -  PCRE_NEWLINE_CR
      -  PCRE_NEWLINE_LF
      -  PCRE_NEWLINE_CRLF
      -  PCRE_NEWLINE_ANYCRLF
      -  PCRE_NEWLINE_ANY
      -
      -These options override the newline definition that was chosen or defaulted when -the pattern was compiled. For details, see the description of -pcre_compile() above. During matching, the newline choice affects the -behaviour of the dot, circumflex, and dollar metacharacters. It may also alter -the way the match position is advanced after a match failure for an unanchored -pattern. -

      -

      -When PCRE_NEWLINE_CRLF, PCRE_NEWLINE_ANYCRLF, or PCRE_NEWLINE_ANY is set, and a -match attempt for an unanchored pattern fails when the current position is at a -CRLF sequence, and the pattern contains no explicit matches for CR or LF -characters, the match position is advanced by two characters instead of one, in -other words, to after the CRLF. -

      -

      -The above rule is a compromise that makes the most common cases work as -expected. For example, if the pattern is .+A (and the PCRE_DOTALL option is not -set), it does not match the string "\r\nA" because, after failing at the -start, it skips both the CR and the LF before retrying. However, the pattern -[\r\n]A does match that string, because it contains an explicit CR or LF -reference, and so advances only by one character after the first failure. -

      -

      -An explicit match for CR of LF is either a literal appearance of one of those -characters, or one of the \r or \n escape sequences. Implicit matches such as -[^X] do not count, nor does \s (which includes CR and LF in the characters -that it matches). -

      -

      -Notwithstanding the above, anomalous effects may still occur when CRLF is a -valid newline sequence and explicit \r or \n escapes appear in the pattern. -

      -  PCRE_NOTBOL
      -
      -This option specifies that first character of the subject string is not the -beginning of a line, so the circumflex metacharacter should not match before -it. Setting this without PCRE_MULTILINE (at compile time) causes circumflex -never to match. This option affects only the behaviour of the circumflex -metacharacter. It does not affect \A. -
      -  PCRE_NOTEOL
      -
      -This option specifies that the end of the subject string is not the end of a -line, so the dollar metacharacter should not match it nor (except in multiline -mode) a newline immediately before it. Setting this without PCRE_MULTILINE (at -compile time) causes dollar never to match. This option affects only the -behaviour of the dollar metacharacter. It does not affect \Z or \z. -
      -  PCRE_NOTEMPTY
      -
      -An empty string is not considered to be a valid match if this option is set. If -there are alternatives in the pattern, they are tried. If all the alternatives -match the empty string, the entire match fails. For example, if the pattern -
      -  a?b?
      -
      -is applied to a string not beginning with "a" or "b", it matches an empty -string at the start of the subject. With PCRE_NOTEMPTY set, this match is not -valid, so PCRE searches further into the string for occurrences of "a" or "b". -
      -  PCRE_NOTEMPTY_ATSTART
      -
      -This is like PCRE_NOTEMPTY, except that an empty string match that is not at -the start of the subject is permitted. If the pattern is anchored, such a match -can occur only if the pattern contains \K. -

      -

      -Perl has no direct equivalent of PCRE_NOTEMPTY or PCRE_NOTEMPTY_ATSTART, but it -does make a special case of a pattern match of the empty string within its -split() function, and when using the /g modifier. It is possible to -emulate Perl's behaviour after matching a null string by first trying the match -again at the same offset with PCRE_NOTEMPTY_ATSTART and PCRE_ANCHORED, and then -if that fails, by advancing the starting offset (see below) and trying an -ordinary match again. There is some code that demonstrates how to do this in -the -pcredemo -sample program. In the most general case, you have to check to see if the -newline convention recognizes CRLF as a newline, and if so, and the current -character is CR followed by LF, advance the starting offset by two characters -instead of one. -

      -  PCRE_NO_START_OPTIMIZE
      -
      -There are a number of optimizations that pcre_exec() uses at the start of -a match, in order to speed up the process. For example, if it is known that an -unanchored match must start with a specific character, it searches the subject -for that character, and fails immediately if it cannot find it, without -actually running the main matching function. This means that a special item -such as (*COMMIT) at the start of a pattern is not considered until after a -suitable starting point for the match has been found. Also, when callouts or -(*MARK) items are in use, these "start-up" optimizations can cause them to be -skipped if the pattern is never actually used. The start-up optimizations are -in effect a pre-scan of the subject that takes place before the pattern is run. -

      -

      -The PCRE_NO_START_OPTIMIZE option disables the start-up optimizations, possibly -causing performance to suffer, but ensuring that in cases where the result is -"no match", the callouts do occur, and that items such as (*COMMIT) and (*MARK) -are considered at every possible starting position in the subject string. If -PCRE_NO_START_OPTIMIZE is set at compile time, it cannot be unset at matching -time. The use of PCRE_NO_START_OPTIMIZE at matching time (that is, passing it -to pcre_exec()) disables JIT execution; in this situation, matching is -always done using interpretively. -

      -

      -Setting PCRE_NO_START_OPTIMIZE can change the outcome of a matching operation. -Consider the pattern -

      -  (*COMMIT)ABC
      -
      -When this is compiled, PCRE records the fact that a match must start with the -character "A". Suppose the subject string is "DEFABC". The start-up -optimization scans along the subject, finds "A" and runs the first match -attempt from there. The (*COMMIT) item means that the pattern must match the -current starting position, which in this case, it does. However, if the same -match is run with PCRE_NO_START_OPTIMIZE set, the initial scan along the -subject string does not happen. The first match attempt is run starting from -"D" and when this fails, (*COMMIT) prevents any further matches being tried, so -the overall result is "no match". If the pattern is studied, more start-up -optimizations may be used. For example, a minimum length for the subject may be -recorded. Consider the pattern -
      -  (*MARK:A)(X|Y)
      -
      -The minimum length for a match is one character. If the subject is "ABC", there -will be attempts to match "ABC", "BC", "C", and then finally an empty string. -If the pattern is studied, the final attempt does not take place, because PCRE -knows that the subject is too short, and so the (*MARK) is never encountered. -In this case, studying the pattern does not affect the overall match result, -which is still "no match", but it does affect the auxiliary information that is -returned. -
      -  PCRE_NO_UTF8_CHECK
      -
      -When PCRE_UTF8 is set at compile time, the validity of the subject as a UTF-8 -string is automatically checked when pcre_exec() is subsequently called. -The entire string is checked before any other processing takes place. The value -of startoffset is also checked to ensure that it points to the start of a -UTF-8 character. There is a discussion about the -validity of UTF-8 strings -in the -pcreunicode -page. If an invalid sequence of bytes is found, pcre_exec() returns the -error PCRE_ERROR_BADUTF8 or, if PCRE_PARTIAL_HARD is set and the problem is a -truncated character at the end of the subject, PCRE_ERROR_SHORTUTF8. In both -cases, information about the precise nature of the error may also be returned -(see the descriptions of these errors in the section entitled \fIError return -values from\fP pcre_exec() -below). -If startoffset contains a value that does not point to the start of a -UTF-8 character (or to the end of the subject), PCRE_ERROR_BADUTF8_OFFSET is -returned. -

      -

      -If you already know that your subject is valid, and you want to skip these -checks for performance reasons, you can set the PCRE_NO_UTF8_CHECK option when -calling pcre_exec(). You might want to do this for the second and -subsequent calls to pcre_exec() if you are making repeated calls to find -all the matches in a single subject string. However, you should be sure that -the value of startoffset points to the start of a character (or the end -of the subject). When PCRE_NO_UTF8_CHECK is set, the effect of passing an -invalid string as a subject or an invalid value of startoffset is -undefined. Your program may crash or loop. -

      -  PCRE_PARTIAL_HARD
      -  PCRE_PARTIAL_SOFT
      -
      -These options turn on the partial matching feature. For backwards -compatibility, PCRE_PARTIAL is a synonym for PCRE_PARTIAL_SOFT. A partial match -occurs if the end of the subject string is reached successfully, but there are -not enough subject characters to complete the match. If this happens when -PCRE_PARTIAL_SOFT (but not PCRE_PARTIAL_HARD) is set, matching continues by -testing any remaining alternatives. Only if no complete match can be found is -PCRE_ERROR_PARTIAL returned instead of PCRE_ERROR_NOMATCH. In other words, -PCRE_PARTIAL_SOFT says that the caller is prepared to handle a partial match, -but only if no complete match can be found. -

      -

      -If PCRE_PARTIAL_HARD is set, it overrides PCRE_PARTIAL_SOFT. In this case, if a -partial match is found, pcre_exec() immediately returns -PCRE_ERROR_PARTIAL, without considering any other alternatives. In other words, -when PCRE_PARTIAL_HARD is set, a partial match is considered to be more -important that an alternative complete match. -

      -

      -In both cases, the portion of the string that was inspected when the partial -match was found is set as the first matching string. There is a more detailed -discussion of partial and multi-segment matching, with examples, in the -pcrepartial -documentation. -

      -
      -The string to be matched by pcre_exec() -
      -

      -The subject string is passed to pcre_exec() as a pointer in -subject, a length in length, and a starting offset in -startoffset. The units for length and startoffset are bytes -for the 8-bit library, 16-bit data items for the 16-bit library, and 32-bit -data items for the 32-bit library. -

      -

      -If startoffset is negative or greater than the length of the subject, -pcre_exec() returns PCRE_ERROR_BADOFFSET. When the starting offset is -zero, the search for a match starts at the beginning of the subject, and this -is by far the most common case. In UTF-8 or UTF-16 mode, the offset must point -to the start of a character, or the end of the subject (in UTF-32 mode, one -data unit equals one character, so all offsets are valid). Unlike the pattern -string, the subject may contain binary zeroes. -

      -

      -A non-zero starting offset is useful when searching for another match in the -same subject by calling pcre_exec() again after a previous success. -Setting startoffset differs from just passing over a shortened string and -setting PCRE_NOTBOL in the case of a pattern that begins with any kind of -lookbehind. For example, consider the pattern -

      -  \Biss\B
      -
      -which finds occurrences of "iss" in the middle of words. (\B matches only if -the current position in the subject is not a word boundary.) When applied to -the string "Mississipi" the first call to pcre_exec() finds the first -occurrence. If pcre_exec() is called again with just the remainder of the -subject, namely "issipi", it does not match, because \B is always false at the -start of the subject, which is deemed to be a word boundary. However, if -pcre_exec() is passed the entire string again, but with startoffset -set to 4, it finds the second occurrence of "iss" because it is able to look -behind the starting point to discover that it is preceded by a letter. -

      -

      -Finding all the matches in a subject is tricky when the pattern can match an -empty string. It is possible to emulate Perl's /g behaviour by first trying the -match again at the same offset, with the PCRE_NOTEMPTY_ATSTART and -PCRE_ANCHORED options, and then if that fails, advancing the starting offset -and trying an ordinary match again. There is some code that demonstrates how to -do this in the -pcredemo -sample program. In the most general case, you have to check to see if the -newline convention recognizes CRLF as a newline, and if so, and the current -character is CR followed by LF, advance the starting offset by two characters -instead of one. -

      -

      -If a non-zero starting offset is passed when the pattern is anchored, one -attempt to match at the given offset is made. This can only succeed if the -pattern does not require the match to be at the start of the subject. -

      -
      -How pcre_exec() returns captured substrings -
      -

      -In general, a pattern matches a certain portion of the subject, and in -addition, further substrings from the subject may be picked out by parts of the -pattern. Following the usage in Jeffrey Friedl's book, this is called -"capturing" in what follows, and the phrase "capturing subpattern" is used for -a fragment of a pattern that picks out a substring. PCRE supports several other -kinds of parenthesized subpattern that do not cause substrings to be captured. -

      -

      -Captured substrings are returned to the caller via a vector of integers whose -address is passed in ovector. The number of elements in the vector is -passed in ovecsize, which must be a non-negative number. Note: this -argument is NOT the size of ovector in bytes. -

      -

      -The first two-thirds of the vector is used to pass back captured substrings, -each substring using a pair of integers. The remaining third of the vector is -used as workspace by pcre_exec() while matching capturing subpatterns, -and is not available for passing back information. The number passed in -ovecsize should always be a multiple of three. If it is not, it is -rounded down. -

      -

      -When a match is successful, information about captured substrings is returned -in pairs of integers, starting at the beginning of ovector, and -continuing up to two-thirds of its length at the most. The first element of -each pair is set to the offset of the first character in a substring, and the -second is set to the offset of the first character after the end of a -substring. These values are always data unit offsets, even in UTF mode. They -are byte offsets in the 8-bit library, 16-bit data item offsets in the 16-bit -library, and 32-bit data item offsets in the 32-bit library. Note: they -are not character counts. -

      -

      -The first pair of integers, ovector[0] and ovector[1], identify the -portion of the subject string matched by the entire pattern. The next pair is -used for the first capturing subpattern, and so on. The value returned by -pcre_exec() is one more than the highest numbered pair that has been set. -For example, if two substrings have been captured, the returned value is 3. If -there are no capturing subpatterns, the return value from a successful match is -1, indicating that just the first pair of offsets has been set. -

      -

      -If a capturing subpattern is matched repeatedly, it is the last portion of the -string that it matched that is returned. -

      -

      -If the vector is too small to hold all the captured substring offsets, it is -used as far as possible (up to two-thirds of its length), and the function -returns a value of zero. If neither the actual string matched nor any captured -substrings are of interest, pcre_exec() may be called with ovector -passed as NULL and ovecsize as zero. However, if the pattern contains -back references and the ovector is not big enough to remember the related -substrings, PCRE has to get additional memory for use during matching. Thus it -is usually advisable to supply an ovector of reasonable size. -

      -

      -There are some cases where zero is returned (indicating vector overflow) when -in fact the vector is exactly the right size for the final match. For example, -consider the pattern -

      -  (a)(?:(b)c|bd)
      -
      -If a vector of 6 elements (allowing for only 1 captured substring) is given -with subject string "abd", pcre_exec() will try to set the second -captured string, thereby recording a vector overflow, before failing to match -"c" and backing up to try the second alternative. The zero return, however, -does correctly indicate that the maximum number of slots (namely 2) have been -filled. In similar cases where there is temporary overflow, but the final -number of used slots is actually less than the maximum, a non-zero value is -returned. -

      -

      -The pcre_fullinfo() function can be used to find out how many capturing -subpatterns there are in a compiled pattern. The smallest size for -ovector that will allow for n captured substrings, in addition to -the offsets of the substring matched by the whole pattern, is (n+1)*3. -

      -

      -It is possible for capturing subpattern number n+1 to match some part of -the subject when subpattern n has not been used at all. For example, if -the string "abc" is matched against the pattern (a|(z))(bc) the return from the -function is 4, and subpatterns 1 and 3 are matched, but 2 is not. When this -happens, both values in the offset pairs corresponding to unused subpatterns -are set to -1. -

      -

      -Offset values that correspond to unused subpatterns at the end of the -expression are also set to -1. For example, if the string "abc" is matched -against the pattern (abc)(x(yz)?)? subpatterns 2 and 3 are not matched. The -return from the function is 2, because the highest used capturing subpattern -number is 1, and the offsets for for the second and third capturing subpatterns -(assuming the vector is large enough, of course) are set to -1. -

      -

      -Note: Elements in the first two-thirds of ovector that do not -correspond to capturing parentheses in the pattern are never changed. That is, -if a pattern contains n capturing parentheses, no more than -ovector[0] to ovector[2n+1] are set by pcre_exec(). The other -elements (in the first two-thirds) retain whatever values they previously had. -

      -

      -Some convenience functions are provided for extracting the captured substrings -as separate strings. These are described below. -

      -
      -Error return values from pcre_exec() -
      -

      -If pcre_exec() fails, it returns a negative number. The following are -defined in the header file: -

      -  PCRE_ERROR_NOMATCH        (-1)
      -
      -The subject string did not match the pattern. -
      -  PCRE_ERROR_NULL           (-2)
      -
      -Either code or subject was passed as NULL, or ovector was -NULL and ovecsize was not zero. -
      -  PCRE_ERROR_BADOPTION      (-3)
      -
      -An unrecognized bit was set in the options argument. -
      -  PCRE_ERROR_BADMAGIC       (-4)
      -
      -PCRE stores a 4-byte "magic number" at the start of the compiled code, to catch -the case when it is passed a junk pointer and to detect when a pattern that was -compiled in an environment of one endianness is run in an environment with the -other endianness. This is the error that PCRE gives when the magic number is -not present. -
      -  PCRE_ERROR_UNKNOWN_OPCODE (-5)
      -
      -While running the pattern match, an unknown item was encountered in the -compiled pattern. This error could be caused by a bug in PCRE or by overwriting -of the compiled pattern. -
      -  PCRE_ERROR_NOMEMORY       (-6)
      -
      -If a pattern contains back references, but the ovector that is passed to -pcre_exec() is not big enough to remember the referenced substrings, PCRE -gets a block of memory at the start of matching to use for this purpose. If the -call via pcre_malloc() fails, this error is given. The memory is -automatically freed at the end of matching. -

      -

      -This error is also given if pcre_stack_malloc() fails in -pcre_exec(). This can happen only when PCRE has been compiled with ---disable-stack-for-recursion. -

      -  PCRE_ERROR_NOSUBSTRING    (-7)
      -
      -This error is used by the pcre_copy_substring(), -pcre_get_substring(), and pcre_get_substring_list() functions (see -below). It is never returned by pcre_exec(). -
      -  PCRE_ERROR_MATCHLIMIT     (-8)
      -
      -The backtracking limit, as specified by the match_limit field in a -pcre_extra structure (or defaulted) was reached. See the description -above. -
      -  PCRE_ERROR_CALLOUT        (-9)
      -
      -This error is never generated by pcre_exec() itself. It is provided for -use by callout functions that want to yield a distinctive error code. See the -pcrecallout -documentation for details. -
      -  PCRE_ERROR_BADUTF8        (-10)
      -
      -A string that contains an invalid UTF-8 byte sequence was passed as a subject, -and the PCRE_NO_UTF8_CHECK option was not set. If the size of the output vector -(ovecsize) is at least 2, the byte offset to the start of the the invalid -UTF-8 character is placed in the first element, and a reason code is placed in -the second element. The reason codes are listed in the -following section. -For backward compatibility, if PCRE_PARTIAL_HARD is set and the problem is a -truncated UTF-8 character at the end of the subject (reason codes 1 to 5), -PCRE_ERROR_SHORTUTF8 is returned instead of PCRE_ERROR_BADUTF8. -
      -  PCRE_ERROR_BADUTF8_OFFSET (-11)
      -
      -The UTF-8 byte sequence that was passed as a subject was checked and found to -be valid (the PCRE_NO_UTF8_CHECK option was not set), but the value of -startoffset did not point to the beginning of a UTF-8 character or the -end of the subject. -
      -  PCRE_ERROR_PARTIAL        (-12)
      -
      -The subject string did not match, but it did match partially. See the -pcrepartial -documentation for details of partial matching. -
      -  PCRE_ERROR_BADPARTIAL     (-13)
      -
      -This code is no longer in use. It was formerly returned when the PCRE_PARTIAL -option was used with a compiled pattern containing items that were not -supported for partial matching. From release 8.00 onwards, there are no -restrictions on partial matching. -
      -  PCRE_ERROR_INTERNAL       (-14)
      -
      -An unexpected internal error has occurred. This error could be caused by a bug -in PCRE or by overwriting of the compiled pattern. -
      -  PCRE_ERROR_BADCOUNT       (-15)
      -
      -This error is given if the value of the ovecsize argument is negative. -
      -  PCRE_ERROR_RECURSIONLIMIT (-21)
      -
      -The internal recursion limit, as specified by the match_limit_recursion -field in a pcre_extra structure (or defaulted) was reached. See the -description above. -
      -  PCRE_ERROR_BADNEWLINE     (-23)
      -
      -An invalid combination of PCRE_NEWLINE_xxx options was given. -
      -  PCRE_ERROR_BADOFFSET      (-24)
      -
      -The value of startoffset was negative or greater than the length of the -subject, that is, the value in length. -
      -  PCRE_ERROR_SHORTUTF8      (-25)
      -
      -This error is returned instead of PCRE_ERROR_BADUTF8 when the subject string -ends with a truncated UTF-8 character and the PCRE_PARTIAL_HARD option is set. -Information about the failure is returned as for PCRE_ERROR_BADUTF8. It is in -fact sufficient to detect this case, but this special error code for -PCRE_PARTIAL_HARD precedes the implementation of returned information; it is -retained for backwards compatibility. -
      -  PCRE_ERROR_RECURSELOOP    (-26)
      -
      -This error is returned when pcre_exec() detects a recursion loop within -the pattern. Specifically, it means that either the whole pattern or a -subpattern has been called recursively for the second time at the same position -in the subject string. Some simple patterns that might do this are detected and -faulted at compile time, but more complicated cases, in particular mutual -recursions between two different subpatterns, cannot be detected until run -time. -
      -  PCRE_ERROR_JIT_STACKLIMIT (-27)
      -
      -This error is returned when a pattern that was successfully studied using a -JIT compile option is being matched, but the memory available for the -just-in-time processing stack is not large enough. See the -pcrejit -documentation for more details. -
      -  PCRE_ERROR_BADMODE        (-28)
      -
      -This error is given if a pattern that was compiled by the 8-bit library is -passed to a 16-bit or 32-bit library function, or vice versa. -
      -  PCRE_ERROR_BADENDIANNESS  (-29)
      -
      -This error is given if a pattern that was compiled and saved is reloaded on a -host with different endianness. The utility function -pcre_pattern_to_host_byte_order() can be used to convert such a pattern -so that it runs on the new host. -
      -  PCRE_ERROR_JIT_BADOPTION
      -
      -This error is returned when a pattern that was successfully studied using a JIT -compile option is being matched, but the matching mode (partial or complete -match) does not correspond to any JIT compilation mode. When the JIT fast path -function is used, this error may be also given for invalid options. See the -pcrejit -documentation for more details. -
      -  PCRE_ERROR_BADLENGTH      (-32)
      -
      -This error is given if pcre_exec() is called with a negative value for -the length argument. -

      -

      -Error numbers -16 to -20, -22, and 30 are not used by pcre_exec(). -

      -
      -Reason codes for invalid UTF-8 strings -
      -

      -This section applies only to the 8-bit library. The corresponding information -for the 16-bit and 32-bit libraries is given in the -pcre16 -and -pcre32 -pages. -

      -

      -When pcre_exec() returns either PCRE_ERROR_BADUTF8 or -PCRE_ERROR_SHORTUTF8, and the size of the output vector (ovecsize) is at -least 2, the offset of the start of the invalid UTF-8 character is placed in -the first output vector element (ovector[0]) and a reason code is placed -in the second element (ovector[1]). The reason codes are given names in -the pcre.h header file: -

      -  PCRE_UTF8_ERR1
      -  PCRE_UTF8_ERR2
      -  PCRE_UTF8_ERR3
      -  PCRE_UTF8_ERR4
      -  PCRE_UTF8_ERR5
      -
      -The string ends with a truncated UTF-8 character; the code specifies how many -bytes are missing (1 to 5). Although RFC 3629 restricts UTF-8 characters to be -no longer than 4 bytes, the encoding scheme (originally defined by RFC 2279) -allows for up to 6 bytes, and this is checked first; hence the possibility of -4 or 5 missing bytes. -
      -  PCRE_UTF8_ERR6
      -  PCRE_UTF8_ERR7
      -  PCRE_UTF8_ERR8
      -  PCRE_UTF8_ERR9
      -  PCRE_UTF8_ERR10
      -
      -The two most significant bits of the 2nd, 3rd, 4th, 5th, or 6th byte of the -character do not have the binary value 0b10 (that is, either the most -significant bit is 0, or the next bit is 1). -
      -  PCRE_UTF8_ERR11
      -  PCRE_UTF8_ERR12
      -
      -A character that is valid by the RFC 2279 rules is either 5 or 6 bytes long; -these code points are excluded by RFC 3629. -
      -  PCRE_UTF8_ERR13
      -
      -A 4-byte character has a value greater than 0x10fff; these code points are -excluded by RFC 3629. -
      -  PCRE_UTF8_ERR14
      -
      -A 3-byte character has a value in the range 0xd800 to 0xdfff; this range of -code points are reserved by RFC 3629 for use with UTF-16, and so are excluded -from UTF-8. -
      -  PCRE_UTF8_ERR15
      -  PCRE_UTF8_ERR16
      -  PCRE_UTF8_ERR17
      -  PCRE_UTF8_ERR18
      -  PCRE_UTF8_ERR19
      -
      -A 2-, 3-, 4-, 5-, or 6-byte character is "overlong", that is, it codes for a -value that can be represented by fewer bytes, which is invalid. For example, -the two bytes 0xc0, 0xae give the value 0x2e, whose correct coding uses just -one byte. -
      -  PCRE_UTF8_ERR20
      -
      -The two most significant bits of the first byte of a character have the binary -value 0b10 (that is, the most significant bit is 1 and the second is 0). Such a -byte can only validly occur as the second or subsequent byte of a multi-byte -character. -
      -  PCRE_UTF8_ERR21
      -
      -The first byte of a character has the value 0xfe or 0xff. These values can -never occur in a valid UTF-8 string. -
      -  PCRE_UTF8_ERR22
      -
      -This error code was formerly used when the presence of a so-called -"non-character" caused an error. Unicode corrigendum #9 makes it clear that -such characters should not cause a string to be rejected, and so this code is -no longer in use and is never returned. -

      -
      EXTRACTING CAPTURED SUBSTRINGS BY NUMBER
      -

      -int pcre_copy_substring(const char *subject, int *ovector, - int stringcount, int stringnumber, char *buffer, - int buffersize); -
      -
      -int pcre_get_substring(const char *subject, int *ovector, - int stringcount, int stringnumber, - const char **stringptr); -
      -
      -int pcre_get_substring_list(const char *subject, - int *ovector, int stringcount, const char ***listptr); -

      -

      -Captured substrings can be accessed directly by using the offsets returned by -pcre_exec() in ovector. For convenience, the functions -pcre_copy_substring(), pcre_get_substring(), and -pcre_get_substring_list() are provided for extracting captured substrings -as new, separate, zero-terminated strings. These functions identify substrings -by number. The next section describes functions for extracting named -substrings. -

      -

      -A substring that contains a binary zero is correctly extracted and has a -further zero added on the end, but the result is not, of course, a C string. -However, you can process such a string by referring to the length that is -returned by pcre_copy_substring() and pcre_get_substring(). -Unfortunately, the interface to pcre_get_substring_list() is not adequate -for handling strings containing binary zeros, because the end of the final -string is not independently indicated. -

      -

      -The first three arguments are the same for all three of these functions: -subject is the subject string that has just been successfully matched, -ovector is a pointer to the vector of integer offsets that was passed to -pcre_exec(), and stringcount is the number of substrings that were -captured by the match, including the substring that matched the entire regular -expression. This is the value returned by pcre_exec() if it is greater -than zero. If pcre_exec() returned zero, indicating that it ran out of -space in ovector, the value passed as stringcount should be the -number of elements in the vector divided by three. -

      -

      -The functions pcre_copy_substring() and pcre_get_substring() -extract a single substring, whose number is given as stringnumber. A -value of zero extracts the substring that matched the entire pattern, whereas -higher values extract the captured substrings. For pcre_copy_substring(), -the string is placed in buffer, whose length is given by -buffersize, while for pcre_get_substring() a new block of memory is -obtained via pcre_malloc, and its address is returned via -stringptr. The yield of the function is the length of the string, not -including the terminating zero, or one of these error codes: -

      -  PCRE_ERROR_NOMEMORY       (-6)
      -
      -The buffer was too small for pcre_copy_substring(), or the attempt to get -memory failed for pcre_get_substring(). -
      -  PCRE_ERROR_NOSUBSTRING    (-7)
      -
      -There is no substring whose number is stringnumber. -

      -

      -The pcre_get_substring_list() function extracts all available substrings -and builds a list of pointers to them. All this is done in a single block of -memory that is obtained via pcre_malloc. The address of the memory block -is returned via listptr, which is also the start of the list of string -pointers. The end of the list is marked by a NULL pointer. The yield of the -function is zero if all went well, or the error code -

      -  PCRE_ERROR_NOMEMORY       (-6)
      -
      -if the attempt to get the memory block failed. -

      -

      -When any of these functions encounter a substring that is unset, which can -happen when capturing subpattern number n+1 matches some part of the -subject, but subpattern n has not been used at all, they return an empty -string. This can be distinguished from a genuine zero-length substring by -inspecting the appropriate offset in ovector, which is negative for unset -substrings. -

      -

      -The two convenience functions pcre_free_substring() and -pcre_free_substring_list() can be used to free the memory returned by -a previous call of pcre_get_substring() or -pcre_get_substring_list(), respectively. They do nothing more than call -the function pointed to by pcre_free, which of course could be called -directly from a C program. However, PCRE is used in some situations where it is -linked via a special interface to another programming language that cannot use -pcre_free directly; it is for these cases that the functions are -provided. -

      -
      EXTRACTING CAPTURED SUBSTRINGS BY NAME
      -

      -int pcre_get_stringnumber(const pcre *code, - const char *name); -
      -
      -int pcre_copy_named_substring(const pcre *code, - const char *subject, int *ovector, - int stringcount, const char *stringname, - char *buffer, int buffersize); -
      -
      -int pcre_get_named_substring(const pcre *code, - const char *subject, int *ovector, - int stringcount, const char *stringname, - const char **stringptr); -

      -

      -To extract a substring by name, you first have to find associated number. -For example, for this pattern -

      -  (a+)b(?<xxx>\d+)...
      -
      -the number of the subpattern called "xxx" is 2. If the name is known to be -unique (PCRE_DUPNAMES was not set), you can find the number from the name by -calling pcre_get_stringnumber(). The first argument is the compiled -pattern, and the second is the name. The yield of the function is the -subpattern number, or PCRE_ERROR_NOSUBSTRING (-7) if there is no subpattern of -that name. -

      -

      -Given the number, you can extract the substring directly, or use one of the -functions described in the previous section. For convenience, there are also -two functions that do the whole job. -

      -

      -Most of the arguments of pcre_copy_named_substring() and -pcre_get_named_substring() are the same as those for the similarly named -functions that extract by number. As these are described in the previous -section, they are not re-described here. There are just two differences: -

      -

      -First, instead of a substring number, a substring name is given. Second, there -is an extra argument, given at the start, which is a pointer to the compiled -pattern. This is needed in order to gain access to the name-to-number -translation table. -

      -

      -These functions call pcre_get_stringnumber(), and if it succeeds, they -then call pcre_copy_substring() or pcre_get_substring(), as -appropriate. NOTE: If PCRE_DUPNAMES is set and there are duplicate names, -the behaviour may not be what you want (see the next section). -

      -

      -Warning: If the pattern uses the (?| feature to set up multiple -subpatterns with the same number, as described in the -section on duplicate subpattern numbers -in the -pcrepattern -page, you cannot use names to distinguish the different subpatterns, because -names are not included in the compiled code. The matching process uses only -numbers. For this reason, the use of different names for subpatterns of the -same number causes an error at compile time. -

      -
      DUPLICATE SUBPATTERN NAMES
      -

      -int pcre_get_stringtable_entries(const pcre *code, - const char *name, char **first, char **last); -

      -

      -When a pattern is compiled with the PCRE_DUPNAMES option, names for subpatterns -are not required to be unique. (Duplicate names are always allowed for -subpatterns with the same number, created by using the (?| feature. Indeed, if -such subpatterns are named, they are required to use the same names.) -

      -

      -Normally, patterns with duplicate names are such that in any one match, only -one of the named subpatterns participates. An example is shown in the -pcrepattern -documentation. -

      -

      -When duplicates are present, pcre_copy_named_substring() and -pcre_get_named_substring() return the first substring corresponding to -the given name that is set. If none are set, PCRE_ERROR_NOSUBSTRING (-7) is -returned; no data is returned. The pcre_get_stringnumber() function -returns one of the numbers that are associated with the name, but it is not -defined which it is. -

      -

      -If you want to get full details of all captured substrings for a given name, -you must use the pcre_get_stringtable_entries() function. The first -argument is the compiled pattern, and the second is the name. The third and -fourth are pointers to variables which are updated by the function. After it -has run, they point to the first and last entries in the name-to-number table -for the given name. The function itself returns the length of each entry, or -PCRE_ERROR_NOSUBSTRING (-7) if there are none. The format of the table is -described above in the section entitled Information about a pattern -above. -Given all the relevant entries for the name, you can extract each of their -numbers, and hence the captured data, if any. -

      -
      FINDING ALL POSSIBLE MATCHES
      -

      -The traditional matching function uses a similar algorithm to Perl, which stops -when it finds the first match, starting at a given point in the subject. If you -want to find all possible matches, or the longest possible match, consider -using the alternative matching function (see below) instead. If you cannot use -the alternative function, but still need to find all possible matches, you -can kludge it up by making use of the callout facility, which is described in -the -pcrecallout -documentation. -

      -

      -What you have to do is to insert a callout right at the end of the pattern. -When your callout function is called, extract and save the current matched -substring. Then return 1, which forces pcre_exec() to backtrack and try -other alternatives. Ultimately, when it runs out of matches, pcre_exec() -will yield PCRE_ERROR_NOMATCH. -

      -
      OBTAINING AN ESTIMATE OF STACK USAGE
      -

      -Matching certain patterns using pcre_exec() can use a lot of process -stack, which in certain environments can be rather limited in size. Some users -find it helpful to have an estimate of the amount of stack that is used by -pcre_exec(), to help them set recursion limits, as described in the -pcrestack -documentation. The estimate that is output by pcretest when called with -the -m and -C options is obtained by calling pcre_exec with -the values NULL, NULL, NULL, -999, and -999 for its first five arguments. -

      -

      -Normally, if its first argument is NULL, pcre_exec() immediately returns -the negative error code PCRE_ERROR_NULL, but with this special combination of -arguments, it returns instead a negative number whose absolute value is the -approximate stack frame size in bytes. (A negative number is used so that it is -clear that no match has happened.) The value is approximate because in some -cases, recursive calls to pcre_exec() occur when there are one or two -additional variables on the stack. -

      -

      -If PCRE has been compiled to use the heap instead of the stack for recursion, -the value returned is the size of each block that is obtained from the heap. -

      -
      MATCHING A PATTERN: THE ALTERNATIVE FUNCTION
      -

      -int pcre_dfa_exec(const pcre *code, const pcre_extra *extra, - const char *subject, int length, int startoffset, - int options, int *ovector, int ovecsize, - int *workspace, int wscount); -

      -

      -The function pcre_dfa_exec() is called to match a subject string against -a compiled pattern, using a matching algorithm that scans the subject string -just once, and does not backtrack. This has different characteristics to the -normal algorithm, and is not compatible with Perl. Some of the features of PCRE -patterns are not supported. Nevertheless, there are times when this kind of -matching can be useful. For a discussion of the two matching algorithms, and a -list of features that pcre_dfa_exec() does not support, see the -pcrematching -documentation. -

      -

      -The arguments for the pcre_dfa_exec() function are the same as for -pcre_exec(), plus two extras. The ovector argument is used in a -different way, and this is described below. The other common arguments are used -in the same way as for pcre_exec(), so their description is not repeated -here. -

      -

      -The two additional arguments provide workspace for the function. The workspace -vector should contain at least 20 elements. It is used for keeping track of -multiple paths through the pattern tree. More workspace will be needed for -patterns and subjects where there are a lot of potential matches. -

      -

      -Here is an example of a simple call to pcre_dfa_exec(): -

      -  int rc;
      -  int ovector[10];
      -  int wspace[20];
      -  rc = pcre_dfa_exec(
      -    re,             /* result of pcre_compile() */
      -    NULL,           /* we didn't study the pattern */
      -    "some string",  /* the subject string */
      -    11,             /* the length of the subject string */
      -    0,              /* start at offset 0 in the subject */
      -    0,              /* default options */
      -    ovector,        /* vector of integers for substring information */
      -    10,             /* number of elements (NOT size in bytes) */
      -    wspace,         /* working space vector */
      -    20);            /* number of elements (NOT size in bytes) */
      -
      -

      -
      -Option bits for pcre_dfa_exec() -
      -

      -The unused bits of the options argument for pcre_dfa_exec() must be -zero. The only bits that may be set are PCRE_ANCHORED, PCRE_NEWLINE_xxx, -PCRE_NOTBOL, PCRE_NOTEOL, PCRE_NOTEMPTY, PCRE_NOTEMPTY_ATSTART, -PCRE_NO_UTF8_CHECK, PCRE_BSR_ANYCRLF, PCRE_BSR_UNICODE, PCRE_NO_START_OPTIMIZE, -PCRE_PARTIAL_HARD, PCRE_PARTIAL_SOFT, PCRE_DFA_SHORTEST, and PCRE_DFA_RESTART. -All but the last four of these are exactly the same as for pcre_exec(), -so their description is not repeated here. -

      -  PCRE_PARTIAL_HARD
      -  PCRE_PARTIAL_SOFT
      -
      -These have the same general effect as they do for pcre_exec(), but the -details are slightly different. When PCRE_PARTIAL_HARD is set for -pcre_dfa_exec(), it returns PCRE_ERROR_PARTIAL if the end of the subject -is reached and there is still at least one matching possibility that requires -additional characters. This happens even if some complete matches have also -been found. When PCRE_PARTIAL_SOFT is set, the return code PCRE_ERROR_NOMATCH -is converted into PCRE_ERROR_PARTIAL if the end of the subject is reached, -there have been no complete matches, but there is still at least one matching -possibility. The portion of the string that was inspected when the longest -partial match was found is set as the first matching string in both cases. -There is a more detailed discussion of partial and multi-segment matching, with -examples, in the -pcrepartial -documentation. -
      -  PCRE_DFA_SHORTEST
      -
      -Setting the PCRE_DFA_SHORTEST option causes the matching algorithm to stop as -soon as it has found one match. Because of the way the alternative algorithm -works, this is necessarily the shortest possible match at the first possible -matching point in the subject string. -
      -  PCRE_DFA_RESTART
      -
      -When pcre_dfa_exec() returns a partial match, it is possible to call it -again, with additional subject characters, and have it continue with the same -match. The PCRE_DFA_RESTART option requests this action; when it is set, the -workspace and wscount options must reference the same vector as -before because data about the match so far is left in them after a partial -match. There is more discussion of this facility in the -pcrepartial -documentation. -

      -
      -Successful returns from pcre_dfa_exec() -
      -

      -When pcre_dfa_exec() succeeds, it may have matched more than one -substring in the subject. Note, however, that all the matches from one run of -the function start at the same point in the subject. The shorter matches are -all initial substrings of the longer matches. For example, if the pattern -

      -  <.*>
      -
      -is matched against the string -
      -  This is <something> <something else> <something further> no more
      -
      -the three matched strings are -
      -  <something>
      -  <something> <something else>
      -  <something> <something else> <something further>
      -
      -On success, the yield of the function is a number greater than zero, which is -the number of matched substrings. The substrings themselves are returned in -ovector. Each string uses two elements; the first is the offset to the -start, and the second is the offset to the end. In fact, all the strings have -the same start offset. (Space could have been saved by giving this only once, -but it was decided to retain some compatibility with the way pcre_exec() -returns data, even though the meaning of the strings is different.) -

      -

      -The strings are returned in reverse order of length; that is, the longest -matching string is given first. If there were too many matches to fit into -ovector, the yield of the function is zero, and the vector is filled with -the longest matches. Unlike pcre_exec(), pcre_dfa_exec() can use -the entire ovector for returning matched strings. -

      -

      -NOTE: PCRE's "auto-possessification" optimization usually applies to character -repeats at the end of a pattern (as well as internally). For example, the -pattern "a\d+" is compiled as if it were "a\d++" because there is no point -even considering the possibility of backtracking into the repeated digits. For -DFA matching, this means that only one possible match is found. If you really -do want multiple matches in such cases, either use an ungreedy repeat -("a\d+?") or set the PCRE_NO_AUTO_POSSESS option when compiling. -

      -
      -Error returns from pcre_dfa_exec() -
      -

      -The pcre_dfa_exec() function returns a negative number when it fails. -Many of the errors are the same as for pcre_exec(), and these are -described -above. -There are in addition the following errors that are specific to -pcre_dfa_exec(): -

      -  PCRE_ERROR_DFA_UITEM      (-16)
      -
      -This return is given if pcre_dfa_exec() encounters an item in the pattern -that it does not support, for instance, the use of \C or a back reference. -
      -  PCRE_ERROR_DFA_UCOND      (-17)
      -
      -This return is given if pcre_dfa_exec() encounters a condition item that -uses a back reference for the condition, or a test for recursion in a specific -group. These are not supported. -
      -  PCRE_ERROR_DFA_UMLIMIT    (-18)
      -
      -This return is given if pcre_dfa_exec() is called with an extra -block that contains a setting of the match_limit or -match_limit_recursion fields. This is not supported (these fields are -meaningless for DFA matching). -
      -  PCRE_ERROR_DFA_WSSIZE     (-19)
      -
      -This return is given if pcre_dfa_exec() runs out of space in the -workspace vector. -
      -  PCRE_ERROR_DFA_RECURSE    (-20)
      -
      -When a recursive subpattern is processed, the matching function calls itself -recursively, using private vectors for ovector and workspace. This -error is given if the output vector is not large enough. This should be -extremely rare, as a vector of size 1000 is used. -
      -  PCRE_ERROR_DFA_BADRESTART (-30)
      -
      -When pcre_dfa_exec() is called with the PCRE_DFA_RESTART option, -some plausibility checks are made on the contents of the workspace, which -should contain data about the previous partial match. If any of these checks -fail, this error is given. -

      -
      SEE ALSO
      -

      -pcre16(3), pcre32(3), pcrebuild(3), pcrecallout(3), -pcrecpp(3)(3), pcrematching(3), pcrepartial(3), -pcreposix(3), pcreprecompile(3), pcresample(3), -pcrestack(3). -

      -
      AUTHOR
      -

      -Philip Hazel -
      -University Computing Service -
      -Cambridge CB2 3QH, England. -
      -

      -
      REVISION
      -

      -Last updated: 18 December 2015 -
      -Copyright © 1997-2015 University of Cambridge. -
      -

      -Return to the PCRE index page. -

      diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcrebuild.html b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcrebuild.html deleted file mode 100644 index 03c8cbe0..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcrebuild.html +++ /dev/null @@ -1,534 +0,0 @@ - - -pcrebuild specification - - -

      pcrebuild man page

      -

      -Return to the PCRE index page. -

      -

      -This page is part of the PCRE HTML documentation. It was generated automatically -from the original man page. If there is any nonsense in it, please consult the -man page, in case the conversion went wrong. -
      -

      -
      BUILDING PCRE
      -

      -PCRE is distributed with a configure script that can be used to build the -library in Unix-like environments using the applications known as Autotools. -Also in the distribution are files to support building using CMake -instead of configure. The text file -README -contains general information about building with Autotools (some of which is -repeated below), and also has some comments about building on various operating -systems. There is a lot more information about building PCRE without using -Autotools (including information about using CMake and building "by -hand") in the text file called -NON-AUTOTOOLS-BUILD. -You should consult this file as well as the -README -file if you are building in a non-Unix-like environment. -

      -
      PCRE BUILD-TIME OPTIONS
      -

      -The rest of this document describes the optional features of PCRE that can be -selected when the library is compiled. It assumes use of the configure -script, where the optional features are selected or deselected by providing -options to configure before running the make command. However, the -same options can be selected in both Unix-like and non-Unix-like environments -using the GUI facility of cmake-gui if you are using CMake instead -of configure to build PCRE. -

      -

      -If you are not using Autotools or CMake, option selection can be done by -editing the config.h file, or by passing parameter settings to the -compiler, as described in -NON-AUTOTOOLS-BUILD. -

      -

      -The complete list of options for configure (which includes the standard -ones such as the selection of the installation directory) can be obtained by -running -

      -  ./configure --help
      -
      -The following sections include descriptions of options whose names begin with ---enable or --disable. These settings specify changes to the defaults for the -configure command. Because of the way that configure works, ---enable and --disable always come in pairs, so the complementary option always -exists as well, but as it specifies the default, it is not described. -

      -
      BUILDING 8-BIT, 16-BIT AND 32-BIT LIBRARIES
      -

      -By default, a library called libpcre is built, containing functions that -take string arguments contained in vectors of bytes, either as single-byte -characters, or interpreted as UTF-8 strings. You can also build a separate -library, called libpcre16, in which strings are contained in vectors of -16-bit data units and interpreted either as single-unit characters or UTF-16 -strings, by adding -

      -  --enable-pcre16
      -
      -to the configure command. You can also build yet another separate -library, called libpcre32, in which strings are contained in vectors of -32-bit data units and interpreted either as single-unit characters or UTF-32 -strings, by adding -
      -  --enable-pcre32
      -
      -to the configure command. If you do not want the 8-bit library, add -
      -  --disable-pcre8
      -
      -as well. At least one of the three libraries must be built. Note that the C++ -and POSIX wrappers are for the 8-bit library only, and that pcregrep is -an 8-bit program. None of these are built if you select only the 16-bit or -32-bit libraries. -

      -
      BUILDING SHARED AND STATIC LIBRARIES
      -

      -The Autotools PCRE building process uses libtool to build both shared and -static libraries by default. You can suppress one of these by adding one of -

      -  --disable-shared
      -  --disable-static
      -
      -to the configure command, as required. -

      -
      C++ SUPPORT
      -

      -By default, if the 8-bit library is being built, the configure script -will search for a C++ compiler and C++ header files. If it finds them, it -automatically builds the C++ wrapper library (which supports only 8-bit -strings). You can disable this by adding -

      -  --disable-cpp
      -
      -to the configure command. -

      -
      UTF-8, UTF-16 AND UTF-32 SUPPORT
      -

      -To build PCRE with support for UTF Unicode character strings, add -

      -  --enable-utf
      -
      -to the configure command. This setting applies to all three libraries, -adding support for UTF-8 to the 8-bit library, support for UTF-16 to the 16-bit -library, and support for UTF-32 to the to the 32-bit library. There are no -separate options for enabling UTF-8, UTF-16 and UTF-32 independently because -that would allow ridiculous settings such as requesting UTF-16 support while -building only the 8-bit library. It is not possible to build one library with -UTF support and another without in the same configuration. (For backwards -compatibility, --enable-utf8 is a synonym of --enable-utf.) -

      -

      -Of itself, this setting does not make PCRE treat strings as UTF-8, UTF-16 or -UTF-32. As well as compiling PCRE with this option, you also have have to set -the PCRE_UTF8, PCRE_UTF16 or PCRE_UTF32 option (as appropriate) when you call -one of the pattern compiling functions. -

      -

      -If you set --enable-utf when compiling in an EBCDIC environment, PCRE expects -its input to be either ASCII or UTF-8 (depending on the run-time option). It is -not possible to support both EBCDIC and UTF-8 codes in the same version of the -library. Consequently, --enable-utf and --enable-ebcdic are mutually -exclusive. -

      -
      UNICODE CHARACTER PROPERTY SUPPORT
      -

      -UTF support allows the libraries to process character codepoints up to 0x10ffff -in the strings that they handle. On its own, however, it does not provide any -facilities for accessing the properties of such characters. If you want to be -able to use the pattern escapes \P, \p, and \X, which refer to Unicode -character properties, you must add -

      -  --enable-unicode-properties
      -
      -to the configure command. This implies UTF support, even if you have -not explicitly requested it. -

      -

      -Including Unicode property support adds around 30K of tables to the PCRE -library. Only the general category properties such as Lu and Nd are -supported. Details are given in the -pcrepattern -documentation. -

      -
      JUST-IN-TIME COMPILER SUPPORT
      -

      -Just-in-time compiler support is included in the build by specifying -

      -  --enable-jit
      -
      -This support is available only for certain hardware architectures. If this -option is set for an unsupported architecture, a compile time error occurs. -See the -pcrejit -documentation for a discussion of JIT usage. When JIT support is enabled, -pcregrep automatically makes use of it, unless you add -
      -  --disable-pcregrep-jit
      -
      -to the "configure" command. -

      -
      CODE VALUE OF NEWLINE
      -

      -By default, PCRE interprets the linefeed (LF) character as indicating the end -of a line. This is the normal newline character on Unix-like systems. You can -compile PCRE to use carriage return (CR) instead, by adding -

      -  --enable-newline-is-cr
      -
      -to the configure command. There is also a --enable-newline-is-lf option, -which explicitly specifies linefeed as the newline character. -
      -
      -Alternatively, you can specify that line endings are to be indicated by the two -character sequence CRLF. If you want this, add -
      -  --enable-newline-is-crlf
      -
      -to the configure command. There is a fourth option, specified by -
      -  --enable-newline-is-anycrlf
      -
      -which causes PCRE to recognize any of the three sequences CR, LF, or CRLF as -indicating a line ending. Finally, a fifth option, specified by -
      -  --enable-newline-is-any
      -
      -causes PCRE to recognize any Unicode newline sequence. -

      -

      -Whatever line ending convention is selected when PCRE is built can be -overridden when the library functions are called. At build time it is -conventional to use the standard for your operating system. -

      -
      WHAT \R MATCHES
      -

      -By default, the sequence \R in a pattern matches any Unicode newline sequence, -whatever has been selected as the line ending sequence. If you specify -

      -  --enable-bsr-anycrlf
      -
      -the default is changed so that \R matches only CR, LF, or CRLF. Whatever is -selected when PCRE is built can be overridden when the library functions are -called. -

      -
      POSIX MALLOC USAGE
      -

      -When the 8-bit library is called through the POSIX interface (see the -pcreposix -documentation), additional working storage is required for holding the pointers -to capturing substrings, because PCRE requires three integers per substring, -whereas the POSIX interface provides only two. If the number of expected -substrings is small, the wrapper function uses space on the stack, because this -is faster than using malloc() for each call. The default threshold above -which the stack is no longer used is 10; it can be changed by adding a setting -such as -

      -  --with-posix-malloc-threshold=20
      -
      -to the configure command. -

      -
      HANDLING VERY LARGE PATTERNS
      -

      -Within a compiled pattern, offset values are used to point from one part to -another (for example, from an opening parenthesis to an alternation -metacharacter). By default, in the 8-bit and 16-bit libraries, two-byte values -are used for these offsets, leading to a maximum size for a compiled pattern of -around 64K. This is sufficient to handle all but the most gigantic patterns. -Nevertheless, some people do want to process truly enormous patterns, so it is -possible to compile PCRE to use three-byte or four-byte offsets by adding a -setting such as -

      -  --with-link-size=3
      -
      -to the configure command. The value given must be 2, 3, or 4. For the -16-bit library, a value of 3 is rounded up to 4. In these libraries, using -longer offsets slows down the operation of PCRE because it has to load -additional data when handling them. For the 32-bit library the value is always -4 and cannot be overridden; the value of --with-link-size is ignored. -

      -
      AVOIDING EXCESSIVE STACK USAGE
      -

      -When matching with the pcre_exec() function, PCRE implements backtracking -by making recursive calls to an internal function called match(). In -environments where the size of the stack is limited, this can severely limit -PCRE's operation. (The Unix environment does not usually suffer from this -problem, but it may sometimes be necessary to increase the maximum stack size. -There is a discussion in the -pcrestack -documentation.) An alternative approach to recursion that uses memory from the -heap to remember data, instead of using recursive function calls, has been -implemented to work round the problem of limited stack size. If you want to -build a version of PCRE that works this way, add -

      -  --disable-stack-for-recursion
      -
      -to the configure command. With this configuration, PCRE will use the -pcre_stack_malloc and pcre_stack_free variables to call memory -management functions. By default these point to malloc() and -free(), but you can replace the pointers so that your own functions are -used instead. -

      -

      -Separate functions are provided rather than using pcre_malloc and -pcre_free because the usage is very predictable: the block sizes -requested are always the same, and the blocks are always freed in reverse -order. A calling program might be able to implement optimized functions that -perform better than malloc() and free(). PCRE runs noticeably more -slowly when built in this way. This option affects only the pcre_exec() -function; it is not relevant for pcre_dfa_exec(). -

      -
      LIMITING PCRE RESOURCE USAGE
      -

      -Internally, PCRE has a function called match(), which it calls repeatedly -(sometimes recursively) when matching a pattern with the pcre_exec() -function. By controlling the maximum number of times this function may be -called during a single matching operation, a limit can be placed on the -resources used by a single call to pcre_exec(). The limit can be changed -at run time, as described in the -pcreapi -documentation. The default is 10 million, but this can be changed by adding a -setting such as -

      -  --with-match-limit=500000
      -
      -to the configure command. This setting has no effect on the -pcre_dfa_exec() matching function. -

      -

      -In some environments it is desirable to limit the depth of recursive calls of -match() more strictly than the total number of calls, in order to -restrict the maximum amount of stack (or heap, if --disable-stack-for-recursion -is specified) that is used. A second limit controls this; it defaults to the -value that is set for --with-match-limit, which imposes no additional -constraints. However, you can set a lower limit by adding, for example, -

      -  --with-match-limit-recursion=10000
      -
      -to the configure command. This value can also be overridden at run time. -

      -
      CREATING CHARACTER TABLES AT BUILD TIME
      -

      -PCRE uses fixed tables for processing characters whose code values are less -than 256. By default, PCRE is built with a set of tables that are distributed -in the file pcre_chartables.c.dist. These tables are for ASCII codes -only. If you add -

      -  --enable-rebuild-chartables
      -
      -to the configure command, the distributed tables are no longer used. -Instead, a program called dftables is compiled and run. This outputs the -source for new set of tables, created in the default locale of your C run-time -system. (This method of replacing the tables does not work if you are cross -compiling, because dftables is run on the local host. If you need to -create alternative tables when cross compiling, you will have to do so "by -hand".) -

      -
      USING EBCDIC CODE
      -

      -PCRE assumes by default that it will run in an environment where the character -code is ASCII (or Unicode, which is a superset of ASCII). This is the case for -most computer operating systems. PCRE can, however, be compiled to run in an -EBCDIC environment by adding -

      -  --enable-ebcdic
      -
      -to the configure command. This setting implies ---enable-rebuild-chartables. You should only use it if you know that you are in -an EBCDIC environment (for example, an IBM mainframe operating system). The ---enable-ebcdic option is incompatible with --enable-utf. -

      -

      -The EBCDIC character that corresponds to an ASCII LF is assumed to have the -value 0x15 by default. However, in some EBCDIC environments, 0x25 is used. In -such an environment you should use -

      -  --enable-ebcdic-nl25
      -
      -as well as, or instead of, --enable-ebcdic. The EBCDIC character for CR has the -same value as in ASCII, namely, 0x0d. Whichever of 0x15 and 0x25 is not -chosen as LF is made to correspond to the Unicode NEL character (which, in -Unicode, is 0x85). -

      -

      -The options that select newline behaviour, such as --enable-newline-is-cr, -and equivalent run-time options, refer to these character values in an EBCDIC -environment. -

      -
      PCREGREP OPTIONS FOR COMPRESSED FILE SUPPORT
      -

      -By default, pcregrep reads all files as plain text. You can build it so -that it recognizes files whose names end in .gz or .bz2, and reads -them with libz or libbz2, respectively, by adding one or both of -

      -  --enable-pcregrep-libz
      -  --enable-pcregrep-libbz2
      -
      -to the configure command. These options naturally require that the -relevant libraries are installed on your system. Configuration will fail if -they are not. -

      -
      PCREGREP BUFFER SIZE
      -

      -pcregrep uses an internal buffer to hold a "window" on the file it is -scanning, in order to be able to output "before" and "after" lines when it -finds a match. The size of the buffer is controlled by a parameter whose -default value is 20K. The buffer itself is three times this size, but because -of the way it is used for holding "before" lines, the longest line that is -guaranteed to be processable is the parameter size. You can change the default -parameter value by adding, for example, -

      -  --with-pcregrep-bufsize=50K
      -
      -to the configure command. The caller of \fPpcregrep\fP can, however, -override this value by specifying a run-time option. -

      -
      PCRETEST OPTION FOR LIBREADLINE SUPPORT
      -

      -If you add -

      -  --enable-pcretest-libreadline
      -
      -to the configure command, pcretest is linked with the -libreadline library, and when its input is from a terminal, it reads it -using the readline() function. This provides line-editing and history -facilities. Note that libreadline is GPL-licensed, so if you distribute a -binary of pcretest linked in this way, there may be licensing issues. -

      -

      -Setting this option causes the -lreadline option to be added to the -pcretest build. In many operating environments with a sytem-installed -libreadline this is sufficient. However, in some environments (e.g. -if an unmodified distribution version of readline is in use), some extra -configuration may be necessary. The INSTALL file for libreadline says -this: -

      -  "Readline uses the termcap functions, but does not link with the
      -  termcap or curses library itself, allowing applications which link
      -  with readline the to choose an appropriate library."
      -
      -If your environment has not been set up so that an appropriate library is -automatically included, you may need to add something like -
      -  LIBS="-ncurses"
      -
      -immediately before the configure command. -

      -
      DEBUGGING WITH VALGRIND SUPPORT
      -

      -By adding the -

      -  --enable-valgrind
      -
      -option to to the configure command, PCRE will use valgrind annotations -to mark certain memory regions as unaddressable. This allows it to detect -invalid memory accesses, and is mostly useful for debugging PCRE itself. -

      -
      CODE COVERAGE REPORTING
      -

      -If your C compiler is gcc, you can build a version of PCRE that can generate a -code coverage report for its test suite. To enable this, you must install -lcov version 1.6 or above. Then specify -

      -  --enable-coverage
      -
      -to the configure command and build PCRE in the usual way. -

      -

      -Note that using ccache (a caching C compiler) is incompatible with code -coverage reporting. If you have configured ccache to run automatically -on your system, you must set the environment variable -

      -  CCACHE_DISABLE=1
      -
      -before running make to build PCRE, so that ccache is not used. -

      -

      -When --enable-coverage is used, the following addition targets are added to the -Makefile: -

      -  make coverage
      -
      -This creates a fresh coverage report for the PCRE test suite. It is equivalent -to running "make coverage-reset", "make coverage-baseline", "make check", and -then "make coverage-report". -
      -  make coverage-reset
      -
      -This zeroes the coverage counters, but does nothing else. -
      -  make coverage-baseline
      -
      -This captures baseline coverage information. -
      -  make coverage-report
      -
      -This creates the coverage report. -
      -  make coverage-clean-report
      -
      -This removes the generated coverage report without cleaning the coverage data -itself. -
      -  make coverage-clean-data
      -
      -This removes the captured coverage data without removing the coverage files -created at compile time (*.gcno). -
      -  make coverage-clean
      -
      -This cleans all coverage data including the generated coverage report. For more -information about code coverage, see the gcov and lcov -documentation. -

      -
      SEE ALSO
      -

      -pcreapi(3), pcre16, pcre32, pcre_config(3). -

      -
      AUTHOR
      -

      -Philip Hazel -
      -University Computing Service -
      -Cambridge CB2 3QH, England. -
      -

      -
      REVISION
      -

      -Last updated: 12 May 2013 -
      -Copyright © 1997-2013 University of Cambridge. -
      -

      -Return to the PCRE index page. -

      diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcrecallout.html b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcrecallout.html deleted file mode 100644 index 53a937f5..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcrecallout.html +++ /dev/null @@ -1,286 +0,0 @@ - - -pcrecallout specification - - -

      pcrecallout man page

      -

      -Return to the PCRE index page. -

      -

      -This page is part of the PCRE HTML documentation. It was generated automatically -from the original man page. If there is any nonsense in it, please consult the -man page, in case the conversion went wrong. -
      -

      -
      SYNOPSIS
      -

      -#include <pcre.h> -

      -

      -int (*pcre_callout)(pcre_callout_block *); -

      -

      -int (*pcre16_callout)(pcre16_callout_block *); -

      -

      -int (*pcre32_callout)(pcre32_callout_block *); -

      -
      DESCRIPTION
      -

      -PCRE provides a feature called "callout", which is a means of temporarily -passing control to the caller of PCRE in the middle of pattern matching. The -caller of PCRE provides an external function by putting its entry point in the -global variable pcre_callout (pcre16_callout for the 16-bit -library, pcre32_callout for the 32-bit library). By default, this -variable contains NULL, which disables all calling out. -

      -

      -Within a regular expression, (?C) indicates the points at which the external -function is to be called. Different callout points can be identified by putting -a number less than 256 after the letter C. The default value is zero. -For example, this pattern has two callout points: -

      -  (?C1)abc(?C2)def
      -
      -If the PCRE_AUTO_CALLOUT option bit is set when a pattern is compiled, PCRE -automatically inserts callouts, all with number 255, before each item in the -pattern. For example, if PCRE_AUTO_CALLOUT is used with the pattern -
      -  A(\d{2}|--)
      -
      -it is processed as if it were -
      -
      -(?C255)A(?C255)((?C255)\d{2}(?C255)|(?C255)-(?C255)-(?C255))(?C255) -
      -
      -Notice that there is a callout before and after each parenthesis and -alternation bar. If the pattern contains a conditional group whose condition is -an assertion, an automatic callout is inserted immediately before the -condition. Such a callout may also be inserted explicitly, for example: -
      -  (?(?C9)(?=a)ab|de)
      -
      -This applies only to assertion conditions (because they are themselves -independent groups). -

      -

      -Automatic callouts can be used for tracking the progress of pattern matching. -The -pcretest -program has a pattern qualifier (/C) that sets automatic callouts; when it is -used, the output indicates how the pattern is being matched. This is useful -information when you are trying to optimize the performance of a particular -pattern. -

      -
      MISSING CALLOUTS
      -

      -You should be aware that, because of optimizations in the way PCRE compiles and -matches patterns, callouts sometimes do not happen exactly as you might expect. -

      -

      -At compile time, PCRE "auto-possessifies" repeated items when it knows that -what follows cannot be part of the repeat. For example, a+[bc] is compiled as -if it were a++[bc]. The pcretest output when this pattern is anchored and -then applied with automatic callouts to the string "aaaa" is: -

      -  --->aaaa
      -   +0 ^        ^
      -   +1 ^        a+
      -   +3 ^   ^    [bc]
      -  No match
      -
      -This indicates that when matching [bc] fails, there is no backtracking into a+ -and therefore the callouts that would be taken for the backtracks do not occur. -You can disable the auto-possessify feature by passing PCRE_NO_AUTO_POSSESS -to pcre_compile(), or starting the pattern with (*NO_AUTO_POSSESS). If -this is done in pcretest (using the /O qualifier), the output changes to -this: -
      -  --->aaaa
      -   +0 ^        ^
      -   +1 ^        a+
      -   +3 ^   ^    [bc]
      -   +3 ^  ^     [bc]
      -   +3 ^ ^      [bc]
      -   +3 ^^       [bc]
      -  No match
      -
      -This time, when matching [bc] fails, the matcher backtracks into a+ and tries -again, repeatedly, until a+ itself fails. -

      -

      -Other optimizations that provide fast "no match" results also affect callouts. -For example, if the pattern is -

      -  ab(?C4)cd
      -
      -PCRE knows that any matching string must contain the letter "d". If the subject -string is "abyz", the lack of "d" means that matching doesn't ever start, and -the callout is never reached. However, with "abyd", though the result is still -no match, the callout is obeyed. -

      -

      -If the pattern is studied, PCRE knows the minimum length of a matching string, -and will immediately give a "no match" return without actually running a match -if the subject is not long enough, or, for unanchored patterns, if it has -been scanned far enough. -

      -

      -You can disable these optimizations by passing the PCRE_NO_START_OPTIMIZE -option to the matching function, or by starting the pattern with -(*NO_START_OPT). This slows down the matching process, but does ensure that -callouts such as the example above are obeyed. -

      -
      THE CALLOUT INTERFACE
      -

      -During matching, when PCRE reaches a callout point, the external function -defined by pcre_callout or pcre[16|32]_callout is called (if it is -set). This applies to both normal and DFA matching. The only argument to the -callout function is a pointer to a pcre_callout or -pcre[16|32]_callout block. These structures contains the following -fields: -

      -  int           version;
      -  int           callout_number;
      -  int          *offset_vector;
      -  const char   *subject;           (8-bit version)
      -  PCRE_SPTR16   subject;           (16-bit version)
      -  PCRE_SPTR32   subject;           (32-bit version)
      -  int           subject_length;
      -  int           start_match;
      -  int           current_position;
      -  int           capture_top;
      -  int           capture_last;
      -  void         *callout_data;
      -  int           pattern_position;
      -  int           next_item_length;
      -  const unsigned char *mark;       (8-bit version)
      -  const PCRE_UCHAR16  *mark;       (16-bit version)
      -  const PCRE_UCHAR32  *mark;       (32-bit version)
      -
      -The version field is an integer containing the version number of the -block format. The initial version was 0; the current version is 2. The version -number will change again in future if additional fields are added, but the -intention is never to remove any of the existing fields. -

      -

      -The callout_number field contains the number of the callout, as compiled -into the pattern (that is, the number after ?C for manual callouts, and 255 for -automatically generated callouts). -

      -

      -The offset_vector field is a pointer to the vector of offsets that was -passed by the caller to the matching function. When pcre_exec() or -pcre[16|32]_exec() is used, the contents can be inspected, in order to -extract substrings that have been matched so far, in the same way as for -extracting substrings after a match has completed. For the DFA matching -functions, this field is not useful. -

      -

      -The subject and subject_length fields contain copies of the values -that were passed to the matching function. -

      -

      -The start_match field normally contains the offset within the subject at -which the current match attempt started. However, if the escape sequence \K -has been encountered, this value is changed to reflect the modified starting -point. If the pattern is not anchored, the callout function may be called -several times from the same point in the pattern for different starting points -in the subject. -

      -

      -The current_position field contains the offset within the subject of the -current match pointer. -

      -

      -When the pcre_exec() or pcre[16|32]_exec() is used, the -capture_top field contains one more than the number of the highest -numbered captured substring so far. If no substrings have been captured, the -value of capture_top is one. This is always the case when the DFA -functions are used, because they do not support captured substrings. -

      -

      -The capture_last field contains the number of the most recently captured -substring. However, when a recursion exits, the value reverts to what it was -outside the recursion, as do the values of all captured substrings. If no -substrings have been captured, the value of capture_last is -1. This is -always the case for the DFA matching functions. -

      -

      -The callout_data field contains a value that is passed to a matching -function specifically so that it can be passed back in callouts. It is passed -in the callout_data field of a pcre_extra or pcre[16|32]_extra -data structure. If no such data was passed, the value of callout_data in -a callout block is NULL. There is a description of the pcre_extra -structure in the -pcreapi -documentation. -

      -

      -The pattern_position field is present from version 1 of the callout -structure. It contains the offset to the next item to be matched in the pattern -string. -

      -

      -The next_item_length field is present from version 1 of the callout -structure. It contains the length of the next item to be matched in the pattern -string. When the callout immediately precedes an alternation bar, a closing -parenthesis, or the end of the pattern, the length is zero. When the callout -precedes an opening parenthesis, the length is that of the entire subpattern. -

      -

      -The pattern_position and next_item_length fields are intended to -help in distinguishing between different automatic callouts, which all have the -same callout number. However, they are set for all callouts. -

      -

      -The mark field is present from version 2 of the callout structure. In -callouts from pcre_exec() or pcre[16|32]_exec() it contains a -pointer to the zero-terminated name of the most recently passed (*MARK), -(*PRUNE), or (*THEN) item in the match, or NULL if no such items have been -passed. Instances of (*PRUNE) or (*THEN) without a name do not obliterate a -previous (*MARK). In callouts from the DFA matching functions this field always -contains NULL. -

      -
      RETURN VALUES
      -

      -The external callout function returns an integer to PCRE. If the value is zero, -matching proceeds as normal. If the value is greater than zero, matching fails -at the current point, but the testing of other matching possibilities goes -ahead, just as if a lookahead assertion had failed. If the value is less than -zero, the match is abandoned, the matching function returns the negative value. -

      -

      -Negative values should normally be chosen from the set of PCRE_ERROR_xxx -values. In particular, PCRE_ERROR_NOMATCH forces a standard "no match" failure. -The error number PCRE_ERROR_CALLOUT is reserved for use by callout functions; -it will never be used by PCRE itself. -

      -
      AUTHOR
      -

      -Philip Hazel -
      -University Computing Service -
      -Cambridge CB2 3QH, England. -
      -

      -
      REVISION
      -

      -Last updated: 12 November 2013 -
      -Copyright © 1997-2013 University of Cambridge. -
      -

      -Return to the PCRE index page. -

      diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcrecompat.html b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcrecompat.html deleted file mode 100644 index d95570ef..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcrecompat.html +++ /dev/null @@ -1,235 +0,0 @@ - - -pcrecompat specification - - -

      pcrecompat man page

      -

      -Return to the PCRE index page. -

      -

      -This page is part of the PCRE HTML documentation. It was generated automatically -from the original man page. If there is any nonsense in it, please consult the -man page, in case the conversion went wrong. -
      -
      -DIFFERENCES BETWEEN PCRE AND PERL -
      -

      -This document describes the differences in the ways that PCRE and Perl handle -regular expressions. The differences described here are with respect to Perl -versions 5.10 and above. -

      -

      -1. PCRE has only a subset of Perl's Unicode support. Details of what it does -have are given in the -pcreunicode -page. -

      -

      -2. PCRE allows repeat quantifiers only on parenthesized assertions, but they do -not mean what you might think. For example, (?!a){3} does not assert that the -next three characters are not "a". It just asserts that the next character is -not "a" three times (in principle: PCRE optimizes this to run the assertion -just once). Perl allows repeat quantifiers on other assertions such as \b, but -these do not seem to have any use. -

      -

      -3. Capturing subpatterns that occur inside negative lookahead assertions are -counted, but their entries in the offsets vector are never set. Perl sometimes -(but not always) sets its numerical variables from inside negative assertions. -

      -

      -4. Though binary zero characters are supported in the subject string, they are -not allowed in a pattern string because it is passed as a normal C string, -terminated by zero. The escape sequence \0 can be used in the pattern to -represent a binary zero. -

      -

      -5. The following Perl escape sequences are not supported: \l, \u, \L, -\U, and \N when followed by a character name or Unicode value. (\N on its -own, matching a non-newline character, is supported.) In fact these are -implemented by Perl's general string-handling and are not part of its pattern -matching engine. If any of these are encountered by PCRE, an error is -generated by default. However, if the PCRE_JAVASCRIPT_COMPAT option is set, -\U and \u are interpreted as JavaScript interprets them. -

      -

      -6. The Perl escape sequences \p, \P, and \X are supported only if PCRE is -built with Unicode character property support. The properties that can be -tested with \p and \P are limited to the general category properties such as -Lu and Nd, script names such as Greek or Han, and the derived properties Any -and L&. PCRE does support the Cs (surrogate) property, which Perl does not; the -Perl documentation says "Because Perl hides the need for the user to understand -the internal representation of Unicode characters, there is no need to -implement the somewhat messy concept of surrogates." -

      -

      -7. PCRE does support the \Q...\E escape for quoting substrings. Characters in -between are treated as literals. This is slightly different from Perl in that $ -and @ are also handled as literals inside the quotes. In Perl, they cause -variable interpolation (but of course PCRE does not have variables). Note the -following examples: -

      -    Pattern            PCRE matches      Perl matches
      -
      -    \Qabc$xyz\E        abc$xyz           abc followed by the contents of $xyz
      -    \Qabc\$xyz\E       abc\$xyz          abc\$xyz
      -    \Qabc\E\$\Qxyz\E   abc$xyz           abc$xyz
      -
      -The \Q...\E sequence is recognized both inside and outside character classes. -

      -

      -8. Fairly obviously, PCRE does not support the (?{code}) and (??{code}) -constructions. However, there is support for recursive patterns. This is not -available in Perl 5.8, but it is in Perl 5.10. Also, the PCRE "callout" -feature allows an external function to be called during pattern matching. See -the -pcrecallout -documentation for details. -

      -

      -9. Subpatterns that are called as subroutines (whether or not recursively) are -always treated as atomic groups in PCRE. This is like Python, but unlike Perl. -Captured values that are set outside a subroutine call can be reference from -inside in PCRE, but not in Perl. There is a discussion that explains these -differences in more detail in the -section on recursion differences from Perl -in the -pcrepattern -page. -

      -

      -10. If any of the backtracking control verbs are used in a subpattern that is -called as a subroutine (whether or not recursively), their effect is confined -to that subpattern; it does not extend to the surrounding pattern. This is not -always the case in Perl. In particular, if (*THEN) is present in a group that -is called as a subroutine, its action is limited to that group, even if the -group does not contain any | characters. Note that such subpatterns are -processed as anchored at the point where they are tested. -

      -

      -11. If a pattern contains more than one backtracking control verb, the first -one that is backtracked onto acts. For example, in the pattern -A(*COMMIT)B(*PRUNE)C a failure in B triggers (*COMMIT), but a failure in C -triggers (*PRUNE). Perl's behaviour is more complex; in many cases it is the -same as PCRE, but there are examples where it differs. -

      -

      -12. Most backtracking verbs in assertions have their normal actions. They are -not confined to the assertion. -

      -

      -13. There are some differences that are concerned with the settings of captured -strings when part of a pattern is repeated. For example, matching "aba" against -the pattern /^(a(b)?)+$/ in Perl leaves $2 unset, but in PCRE it is set to "b". -

      -

      -14. PCRE's handling of duplicate subpattern numbers and duplicate subpattern -names is not as general as Perl's. This is a consequence of the fact the PCRE -works internally just with numbers, using an external table to translate -between numbers and names. In particular, a pattern such as (?|(?<a>A)|(?<b>B), -where the two capturing parentheses have the same number but different names, -is not supported, and causes an error at compile time. If it were allowed, it -would not be possible to distinguish which parentheses matched, because both -names map to capturing subpattern number 1. To avoid this confusing situation, -an error is given at compile time. -

      -

      -15. Perl recognizes comments in some places that PCRE does not, for example, -between the ( and ? at the start of a subpattern. If the /x modifier is set, -Perl allows white space between ( and ? (though current Perls warn that this is -deprecated) but PCRE never does, even if the PCRE_EXTENDED option is set. -

      -

      -16. Perl, when in warning mode, gives warnings for character classes such as -[A-\d] or [a-[:digit:]]. It then treats the hyphens as literals. PCRE has no -warning features, so it gives an error in these cases because they are almost -certainly user mistakes. -

      -

      -17. In PCRE, the upper/lower case character properties Lu and Ll are not -affected when case-independent matching is specified. For example, \p{Lu} -always matches an upper case letter. I think Perl has changed in this respect; -in the release at the time of writing (5.16), \p{Lu} and \p{Ll} match all -letters, regardless of case, when case independence is specified. -

      -

      -18. PCRE provides some extensions to the Perl regular expression facilities. -Perl 5.10 includes new features that are not in earlier versions of Perl, some -of which (such as named parentheses) have been in PCRE for some time. This list -is with respect to Perl 5.10: -
      -
      -(a) Although lookbehind assertions in PCRE must match fixed length strings, -each alternative branch of a lookbehind assertion can match a different length -of string. Perl requires them all to have the same length. -
      -
      -(b) If PCRE_DOLLAR_ENDONLY is set and PCRE_MULTILINE is not set, the $ -meta-character matches only at the very end of the string. -
      -
      -(c) If PCRE_EXTRA is set, a backslash followed by a letter with no special -meaning is faulted. Otherwise, like Perl, the backslash is quietly ignored. -(Perl can be made to issue a warning.) -
      -
      -(d) If PCRE_UNGREEDY is set, the greediness of the repetition quantifiers is -inverted, that is, by default they are not greedy, but if followed by a -question mark they are. -
      -
      -(e) PCRE_ANCHORED can be used at matching time to force a pattern to be tried -only at the first matching position in the subject string. -
      -
      -(f) The PCRE_NOTBOL, PCRE_NOTEOL, PCRE_NOTEMPTY, PCRE_NOTEMPTY_ATSTART, and -PCRE_NO_AUTO_CAPTURE options for pcre_exec() have no Perl equivalents. -
      -
      -(g) The \R escape sequence can be restricted to match only CR, LF, or CRLF -by the PCRE_BSR_ANYCRLF option. -
      -
      -(h) The callout facility is PCRE-specific. -
      -
      -(i) The partial matching facility is PCRE-specific. -
      -
      -(j) Patterns compiled by PCRE can be saved and re-used at a later time, even on -different hosts that have the other endianness. However, this does not apply to -optimized data created by the just-in-time compiler. -
      -
      -(k) The alternative matching functions (pcre_dfa_exec(), -pcre16_dfa_exec() and pcre32_dfa_exec(),) match in a different way -and are not Perl-compatible. -
      -
      -(l) PCRE recognizes some special sequences such as (*CR) at the start of -a pattern that set overall options that cannot be changed within the pattern. -

      -
      -AUTHOR -
      -

      -Philip Hazel -
      -University Computing Service -
      -Cambridge CB2 3QH, England. -
      -

      -
      -REVISION -
      -

      -Last updated: 10 November 2013 -
      -Copyright © 1997-2013 University of Cambridge. -
      -

      -Return to the PCRE index page. -

      diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcrecpp.html b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcrecpp.html deleted file mode 100644 index b7eac3a3..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcrecpp.html +++ /dev/null @@ -1,368 +0,0 @@ - - -pcrecpp specification - - -

      pcrecpp man page

      -

      -Return to the PCRE index page. -

      -

      -This page is part of the PCRE HTML documentation. It was generated automatically -from the original man page. If there is any nonsense in it, please consult the -man page, in case the conversion went wrong. -
      -

      -
      SYNOPSIS OF C++ WRAPPER
      -

      -#include <pcrecpp.h> -

      -
      DESCRIPTION
      -

      -The C++ wrapper for PCRE was provided by Google Inc. Some additional -functionality was added by Giuseppe Maxia. This brief man page was constructed -from the notes in the pcrecpp.h file, which should be consulted for -further details. Note that the C++ wrapper supports only the original 8-bit -PCRE library. There is no 16-bit or 32-bit support at present. -

      -
      MATCHING INTERFACE
      -

      -The "FullMatch" operation checks that supplied text matches a supplied pattern -exactly. If pointer arguments are supplied, it copies matched sub-strings that -match sub-patterns into them. -

      -  Example: successful match
      -     pcrecpp::RE re("h.*o");
      -     re.FullMatch("hello");
      -
      -  Example: unsuccessful match (requires full match):
      -     pcrecpp::RE re("e");
      -     !re.FullMatch("hello");
      -
      -  Example: creating a temporary RE object:
      -     pcrecpp::RE("h.*o").FullMatch("hello");
      -
      -You can pass in a "const char*" or a "string" for "text". The examples below -tend to use a const char*. You can, as in the different examples above, store -the RE object explicitly in a variable or use a temporary RE object. The -examples below use one mode or the other arbitrarily. Either could correctly be -used for any of these examples. -

      -

      -You must supply extra pointer arguments to extract matched subpieces. -

      -  Example: extracts "ruby" into "s" and 1234 into "i"
      -     int i;
      -     string s;
      -     pcrecpp::RE re("(\\w+):(\\d+)");
      -     re.FullMatch("ruby:1234", &s, &i);
      -
      -  Example: does not try to extract any extra sub-patterns
      -     re.FullMatch("ruby:1234", &s);
      -
      -  Example: does not try to extract into NULL
      -     re.FullMatch("ruby:1234", NULL, &i);
      -
      -  Example: integer overflow causes failure
      -     !re.FullMatch("ruby:1234567891234", NULL, &i);
      -
      -  Example: fails because there aren't enough sub-patterns:
      -     !pcrecpp::RE("\\w+:\\d+").FullMatch("ruby:1234", &s);
      -
      -  Example: fails because string cannot be stored in integer
      -     !pcrecpp::RE("(.*)").FullMatch("ruby", &i);
      -
      -The provided pointer arguments can be pointers to any scalar numeric -type, or one of: -
      -   string        (matched piece is copied to string)
      -   StringPiece   (StringPiece is mutated to point to matched piece)
      -   T             (where "bool T::ParseFrom(const char*, int)" exists)
      -   NULL          (the corresponding matched sub-pattern is not copied)
      -
      -The function returns true iff all of the following conditions are satisfied: -
      -  a. "text" matches "pattern" exactly;
      -
      -  b. The number of matched sub-patterns is >= number of supplied
      -     pointers;
      -
      -  c. The "i"th argument has a suitable type for holding the
      -     string captured as the "i"th sub-pattern. If you pass in
      -     void * NULL for the "i"th argument, or a non-void * NULL
      -     of the correct type, or pass fewer arguments than the
      -     number of sub-patterns, "i"th captured sub-pattern is
      -     ignored.
      -
      -CAVEAT: An optional sub-pattern that does not exist in the matched -string is assigned the empty string. Therefore, the following will -return false (because the empty string is not a valid number): -
      -   int number;
      -   pcrecpp::RE::FullMatch("abc", "[a-z]+(\\d+)?", &number);
      -
      -The matching interface supports at most 16 arguments per call. -If you need more, consider using the more general interface -pcrecpp::RE::DoMatch. See pcrecpp.h for the signature for -DoMatch. -

      -

      -NOTE: Do not use no_arg, which is used internally to mark the end of a -list of optional arguments, as a placeholder for missing arguments, as this can -lead to segfaults. -

      -
      QUOTING METACHARACTERS
      -

      -You can use the "QuoteMeta" operation to insert backslashes before all -potentially meaningful characters in a string. The returned string, used as a -regular expression, will exactly match the original string. -

      -  Example:
      -     string quoted = RE::QuoteMeta(unquoted);
      -
      -Note that it's legal to escape a character even if it has no special meaning in -a regular expression -- so this function does that. (This also makes it -identical to the perl function of the same name; see "perldoc -f quotemeta".) -For example, "1.5-2.0?" becomes "1\.5\-2\.0\?". -

      -
      PARTIAL MATCHES
      -

      -You can use the "PartialMatch" operation when you want the pattern -to match any substring of the text. -

      -  Example: simple search for a string:
      -     pcrecpp::RE("ell").PartialMatch("hello");
      -
      -  Example: find first number in a string:
      -     int number;
      -     pcrecpp::RE re("(\\d+)");
      -     re.PartialMatch("x*100 + 20", &number);
      -     assert(number == 100);
      -
      -

      -
      UTF-8 AND THE MATCHING INTERFACE
      -

      -By default, pattern and text are plain text, one byte per character. The UTF8 -flag, passed to the constructor, causes both pattern and string to be treated -as UTF-8 text, still a byte stream but potentially multiple bytes per -character. In practice, the text is likelier to be UTF-8 than the pattern, but -the match returned may depend on the UTF8 flag, so always use it when matching -UTF8 text. For example, "." will match one byte normally but with UTF8 set may -match up to three bytes of a multi-byte character. -

      -  Example:
      -     pcrecpp::RE_Options options;
      -     options.set_utf8();
      -     pcrecpp::RE re(utf8_pattern, options);
      -     re.FullMatch(utf8_string);
      -
      -  Example: using the convenience function UTF8():
      -     pcrecpp::RE re(utf8_pattern, pcrecpp::UTF8());
      -     re.FullMatch(utf8_string);
      -
      -NOTE: The UTF8 flag is ignored if pcre was not configured with the -
      -      --enable-utf8 flag.
      -
      -

      -
      PASSING MODIFIERS TO THE REGULAR EXPRESSION ENGINE
      -

      -PCRE defines some modifiers to change the behavior of the regular expression -engine. The C++ wrapper defines an auxiliary class, RE_Options, as a vehicle to -pass such modifiers to a RE class. Currently, the following modifiers are -supported: -

      -   modifier              description               Perl corresponding
      -
      -   PCRE_CASELESS         case insensitive match      /i
      -   PCRE_MULTILINE        multiple lines match        /m
      -   PCRE_DOTALL           dot matches newlines        /s
      -   PCRE_DOLLAR_ENDONLY   $ matches only at end       N/A
      -   PCRE_EXTRA            strict escape parsing       N/A
      -   PCRE_EXTENDED         ignore white spaces         /x
      -   PCRE_UTF8             handles UTF8 chars          built-in
      -   PCRE_UNGREEDY         reverses * and *?           N/A
      -   PCRE_NO_AUTO_CAPTURE  disables capturing parens   N/A (*)
      -
      -(*) Both Perl and PCRE allow non capturing parentheses by means of the -"?:" modifier within the pattern itself. e.g. (?:ab|cd) does not -capture, while (ab|cd) does. -

      -

      -For a full account on how each modifier works, please check the -PCRE API reference page. -

      -

      -For each modifier, there are two member functions whose name is made -out of the modifier in lowercase, without the "PCRE_" prefix. For -instance, PCRE_CASELESS is handled by -

      -  bool caseless()
      -
      -which returns true if the modifier is set, and -
      -  RE_Options & set_caseless(bool)
      -
      -which sets or unsets the modifier. Moreover, PCRE_EXTRA_MATCH_LIMIT can be -accessed through the set_match_limit() and match_limit() member -functions. Setting match_limit to a non-zero value will limit the -execution of pcre to keep it from doing bad things like blowing the stack or -taking an eternity to return a result. A value of 5000 is good enough to stop -stack blowup in a 2MB thread stack. Setting match_limit to zero disables -match limiting. Alternatively, you can call match_limit_recursion() -which uses PCRE_EXTRA_MATCH_LIMIT_RECURSION to limit how much PCRE -recurses. match_limit() limits the number of matches PCRE does; -match_limit_recursion() limits the depth of internal recursion, and -therefore the amount of stack that is used. -

      -

      -Normally, to pass one or more modifiers to a RE class, you declare -a RE_Options object, set the appropriate options, and pass this -object to a RE constructor. Example: -

      -   RE_Options opt;
      -   opt.set_caseless(true);
      -   if (RE("HELLO", opt).PartialMatch("hello world")) ...
      -
      -RE_options has two constructors. The default constructor takes no arguments and -creates a set of flags that are off by default. The optional parameter -option_flags is to facilitate transfer of legacy code from C programs. -This lets you do -
      -   RE(pattern,
      -     RE_Options(PCRE_CASELESS|PCRE_MULTILINE)).PartialMatch(str);
      -
      -However, new code is better off doing -
      -   RE(pattern,
      -     RE_Options().set_caseless(true).set_multiline(true))
      -       .PartialMatch(str);
      -
      -If you are going to pass one of the most used modifiers, there are some -convenience functions that return a RE_Options class with the -appropriate modifier already set: CASELESS(), UTF8(), -MULTILINE(), DOTALL(), and EXTENDED(). -

      -

      -If you need to set several options at once, and you don't want to go through -the pains of declaring a RE_Options object and setting several options, there -is a parallel method that give you such ability on the fly. You can concatenate -several set_xxxxx() member functions, since each of them returns a -reference to its class object. For example, to pass PCRE_CASELESS, -PCRE_EXTENDED, and PCRE_MULTILINE to a RE with one statement, you may write: -

      -   RE(" ^ xyz \\s+ .* blah$",
      -     RE_Options()
      -       .set_caseless(true)
      -       .set_extended(true)
      -       .set_multiline(true)).PartialMatch(sometext);
      -
      -
      -

      -
      SCANNING TEXT INCREMENTALLY
      -

      -The "Consume" operation may be useful if you want to repeatedly -match regular expressions at the front of a string and skip over -them as they match. This requires use of the "StringPiece" type, -which represents a sub-range of a real string. Like RE, StringPiece -is defined in the pcrecpp namespace. -

      -  Example: read lines of the form "var = value" from a string.
      -     string contents = ...;                 // Fill string somehow
      -     pcrecpp::StringPiece input(contents);  // Wrap in a StringPiece
      -
      -     string var;
      -     int value;
      -     pcrecpp::RE re("(\\w+) = (\\d+)\n");
      -     while (re.Consume(&input, &var, &value)) {
      -       ...;
      -     }
      -
      -Each successful call to "Consume" will set "var/value", and also -advance "input" so it points past the matched text. -

      -

      -The "FindAndConsume" operation is similar to "Consume" but does not -anchor your match at the beginning of the string. For example, you -could extract all words from a string by repeatedly calling -

      -  pcrecpp::RE("(\\w+)").FindAndConsume(&input, &word)
      -
      -

      -
      PARSING HEX/OCTAL/C-RADIX NUMBERS
      -

      -By default, if you pass a pointer to a numeric value, the -corresponding text is interpreted as a base-10 number. You can -instead wrap the pointer with a call to one of the operators Hex(), -Octal(), or CRadix() to interpret the text in another base. The -CRadix operator interprets C-style "0" (base-8) and "0x" (base-16) -prefixes, but defaults to base-10. -

      -  Example:
      -    int a, b, c, d;
      -    pcrecpp::RE re("(.*) (.*) (.*) (.*)");
      -    re.FullMatch("100 40 0100 0x40",
      -                 pcrecpp::Octal(&a), pcrecpp::Hex(&b),
      -                 pcrecpp::CRadix(&c), pcrecpp::CRadix(&d));
      -
      -will leave 64 in a, b, c, and d. -

      -
      REPLACING PARTS OF STRINGS
      -

      -You can replace the first match of "pattern" in "str" with "rewrite". -Within "rewrite", backslash-escaped digits (\1 to \9) can be -used to insert text matching corresponding parenthesized group -from the pattern. \0 in "rewrite" refers to the entire matching -text. For example: -

      -  string s = "yabba dabba doo";
      -  pcrecpp::RE("b+").Replace("d", &s);
      -
      -will leave "s" containing "yada dabba doo". The result is true if the pattern -matches and a replacement occurs, false otherwise. -

      -

      -GlobalReplace is like Replace except that it replaces all -occurrences of the pattern in the string with the rewrite. Replacements are -not subject to re-matching. For example: -

      -  string s = "yabba dabba doo";
      -  pcrecpp::RE("b+").GlobalReplace("d", &s);
      -
      -will leave "s" containing "yada dada doo". It returns the number of -replacements made. -

      -

      -Extract is like Replace, except that if the pattern matches, -"rewrite" is copied into "out" (an additional argument) with substitutions. -The non-matching portions of "text" are ignored. Returns true iff a match -occurred and the extraction happened successfully; if no match occurs, the -string is left unaffected. -

      -
      AUTHOR
      -

      -The C++ wrapper was contributed by Google Inc. -
      -Copyright © 2007 Google Inc. -
      -

      -
      REVISION
      -

      -Last updated: 08 January 2012 -
      -

      -Return to the PCRE index page. -

      diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcredemo.html b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcredemo.html deleted file mode 100644 index 894a9308..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcredemo.html +++ /dev/null @@ -1,426 +0,0 @@ - - -pcredemo specification - - -

      pcredemo man page

      -

      -Return to the PCRE index page. -

      -

      -This page is part of the PCRE HTML documentation. It was generated automatically -from the original man page. If there is any nonsense in it, please consult the -man page, in case the conversion went wrong. -
      -

        -
      -
      -/*************************************************
      -*           PCRE DEMONSTRATION PROGRAM           *
      -*************************************************/
      -
      -/* This is a demonstration program to illustrate the most straightforward ways
      -of calling the PCRE regular expression library from a C program. See the
      -pcresample documentation for a short discussion ("man pcresample" if you have
      -the PCRE man pages installed).
      -
      -In Unix-like environments, if PCRE is installed in your standard system
      -libraries, you should be able to compile this program using this command:
      -
      -gcc -Wall pcredemo.c -lpcre -o pcredemo
      -
      -If PCRE is not installed in a standard place, it is likely to be installed with
      -support for the pkg-config mechanism. If you have pkg-config, you can compile
      -this program using this command:
      -
      -gcc -Wall pcredemo.c `pkg-config --cflags --libs libpcre` -o pcredemo
      -
      -If you do not have pkg-config, you may have to use this:
      -
      -gcc -Wall pcredemo.c -I/usr/local/include -L/usr/local/lib \
      -  -R/usr/local/lib -lpcre -o pcredemo
      -
      -Replace "/usr/local/include" and "/usr/local/lib" with wherever the include and
      -library files for PCRE are installed on your system. Only some operating
      -systems (e.g. Solaris) use the -R option.
      -
      -Building under Windows:
      -
      -If you want to statically link this program against a non-dll .a file, you must
      -define PCRE_STATIC before including pcre.h, otherwise the pcre_malloc() and
      -pcre_free() exported functions will be declared __declspec(dllimport), with
      -unwanted results. So in this environment, uncomment the following line. */
      -
      -/* #define PCRE_STATIC */
      -
      -#include <stdio.h>
      -#include <string.h>
      -#include <pcre.h>
      -
      -#define OVECCOUNT 30    /* should be a multiple of 3 */
      -
      -
      -int main(int argc, char **argv)
      -{
      -pcre *re;
      -const char *error;
      -char *pattern;
      -char *subject;
      -unsigned char *name_table;
      -unsigned int option_bits;
      -int erroffset;
      -int find_all;
      -int crlf_is_newline;
      -int namecount;
      -int name_entry_size;
      -int ovector[OVECCOUNT];
      -int subject_length;
      -int rc, i;
      -int utf8;
      -
      -
      -/**************************************************************************
      -* First, sort out the command line. There is only one possible option at  *
      -* the moment, "-g" to request repeated matching to find all occurrences,  *
      -* like Perl's /g option. We set the variable find_all to a non-zero value *
      -* if the -g option is present. Apart from that, there must be exactly two *
      -* arguments.                                                              *
      -**************************************************************************/
      -
      -find_all = 0;
      -for (i = 1; i < argc; i++)
      -  {
      -  if (strcmp(argv[i], "-g") == 0) find_all = 1;
      -    else break;
      -  }
      -
      -/* After the options, we require exactly two arguments, which are the pattern,
      -and the subject string. */
      -
      -if (argc - i != 2)
      -  {
      -  printf("Two arguments required: a regex and a subject string\n");
      -  return 1;
      -  }
      -
      -pattern = argv[i];
      -subject = argv[i+1];
      -subject_length = (int)strlen(subject);
      -
      -
      -/*************************************************************************
      -* Now we are going to compile the regular expression pattern, and handle *
      -* and errors that are detected.                                          *
      -*************************************************************************/
      -
      -re = pcre_compile(
      -  pattern,              /* the pattern */
      -  0,                    /* default options */
      -  &error,               /* for error message */
      -  &erroffset,           /* for error offset */
      -  NULL);                /* use default character tables */
      -
      -/* Compilation failed: print the error message and exit */
      -
      -if (re == NULL)
      -  {
      -  printf("PCRE compilation failed at offset %d: %s\n", erroffset, error);
      -  return 1;
      -  }
      -
      -
      -/*************************************************************************
      -* If the compilation succeeded, we call PCRE again, in order to do a     *
      -* pattern match against the subject string. This does just ONE match. If *
      -* further matching is needed, it will be done below.                     *
      -*************************************************************************/
      -
      -rc = pcre_exec(
      -  re,                   /* the compiled pattern */
      -  NULL,                 /* no extra data - we didn't study the pattern */
      -  subject,              /* the subject string */
      -  subject_length,       /* the length of the subject */
      -  0,                    /* start at offset 0 in the subject */
      -  0,                    /* default options */
      -  ovector,              /* output vector for substring information */
      -  OVECCOUNT);           /* number of elements in the output vector */
      -
      -/* Matching failed: handle error cases */
      -
      -if (rc < 0)
      -  {
      -  switch(rc)
      -    {
      -    case PCRE_ERROR_NOMATCH: printf("No match\n"); break;
      -    /*
      -    Handle other special cases if you like
      -    */
      -    default: printf("Matching error %d\n", rc); break;
      -    }
      -  pcre_free(re);     /* Release memory used for the compiled pattern */
      -  return 1;
      -  }
      -
      -/* Match succeded */
      -
      -printf("\nMatch succeeded at offset %d\n", ovector[0]);
      -
      -
      -/*************************************************************************
      -* We have found the first match within the subject string. If the output *
      -* vector wasn't big enough, say so. Then output any substrings that were *
      -* captured.                                                              *
      -*************************************************************************/
      -
      -/* The output vector wasn't big enough */
      -
      -if (rc == 0)
      -  {
      -  rc = OVECCOUNT/3;
      -  printf("ovector only has room for %d captured substrings\n", rc - 1);
      -  }
      -
      -/* Show substrings stored in the output vector by number. Obviously, in a real
      -application you might want to do things other than print them. */
      -
      -for (i = 0; i < rc; i++)
      -  {
      -  char *substring_start = subject + ovector[2*i];
      -  int substring_length = ovector[2*i+1] - ovector[2*i];
      -  printf("%2d: %.*s\n", i, substring_length, substring_start);
      -  }
      -
      -
      -/**************************************************************************
      -* That concludes the basic part of this demonstration program. We have    *
      -* compiled a pattern, and performed a single match. The code that follows *
      -* shows first how to access named substrings, and then how to code for    *
      -* repeated matches on the same subject.                                   *
      -**************************************************************************/
      -
      -/* See if there are any named substrings, and if so, show them by name. First
      -we have to extract the count of named parentheses from the pattern. */
      -
      -(void)pcre_fullinfo(
      -  re,                   /* the compiled pattern */
      -  NULL,                 /* no extra data - we didn't study the pattern */
      -  PCRE_INFO_NAMECOUNT,  /* number of named substrings */
      -  &namecount);          /* where to put the answer */
      -
      -if (namecount <= 0) printf("No named substrings\n"); else
      -  {
      -  unsigned char *tabptr;
      -  printf("Named substrings\n");
      -
      -  /* Before we can access the substrings, we must extract the table for
      -  translating names to numbers, and the size of each entry in the table. */
      -
      -  (void)pcre_fullinfo(
      -    re,                       /* the compiled pattern */
      -    NULL,                     /* no extra data - we didn't study the pattern */
      -    PCRE_INFO_NAMETABLE,      /* address of the table */
      -    &name_table);             /* where to put the answer */
      -
      -  (void)pcre_fullinfo(
      -    re,                       /* the compiled pattern */
      -    NULL,                     /* no extra data - we didn't study the pattern */
      -    PCRE_INFO_NAMEENTRYSIZE,  /* size of each entry in the table */
      -    &name_entry_size);        /* where to put the answer */
      -
      -  /* Now we can scan the table and, for each entry, print the number, the name,
      -  and the substring itself. */
      -
      -  tabptr = name_table;
      -  for (i = 0; i < namecount; i++)
      -    {
      -    int n = (tabptr[0] << 8) | tabptr[1];
      -    printf("(%d) %*s: %.*s\n", n, name_entry_size - 3, tabptr + 2,
      -      ovector[2*n+1] - ovector[2*n], subject + ovector[2*n]);
      -    tabptr += name_entry_size;
      -    }
      -  }
      -
      -
      -/*************************************************************************
      -* If the "-g" option was given on the command line, we want to continue  *
      -* to search for additional matches in the subject string, in a similar   *
      -* way to the /g option in Perl. This turns out to be trickier than you   *
      -* might think because of the possibility of matching an empty string.    *
      -* What happens is as follows:                                            *
      -*                                                                        *
      -* If the previous match was NOT for an empty string, we can just start   *
      -* the next match at the end of the previous one.                         *
      -*                                                                        *
      -* If the previous match WAS for an empty string, we can't do that, as it *
      -* would lead to an infinite loop. Instead, a special call of pcre_exec() *
      -* is made with the PCRE_NOTEMPTY_ATSTART and PCRE_ANCHORED flags set.    *
      -* The first of these tells PCRE that an empty string at the start of the *
      -* subject is not a valid match; other possibilities must be tried. The   *
      -* second flag restricts PCRE to one match attempt at the initial string  *
      -* position. If this match succeeds, an alternative to the empty string   *
      -* match has been found, and we can print it and proceed round the loop,  *
      -* advancing by the length of whatever was found. If this match does not  *
      -* succeed, we still stay in the loop, advancing by just one character.   *
      -* In UTF-8 mode, which can be set by (*UTF8) in the pattern, this may be *
      -* more than one byte.                                                    *
      -*                                                                        *
      -* However, there is a complication concerned with newlines. When the     *
      -* newline convention is such that CRLF is a valid newline, we must       *
      -* advance by two characters rather than one. The newline convention can  *
      -* be set in the regex by (*CR), etc.; if not, we must find the default.  *
      -*************************************************************************/
      -
      -if (!find_all)     /* Check for -g */
      -  {
      -  pcre_free(re);   /* Release the memory used for the compiled pattern */
      -  return 0;        /* Finish unless -g was given */
      -  }
      -
      -/* Before running the loop, check for UTF-8 and whether CRLF is a valid newline
      -sequence. First, find the options with which the regex was compiled; extract
      -the UTF-8 state, and mask off all but the newline options. */
      -
      -(void)pcre_fullinfo(re, NULL, PCRE_INFO_OPTIONS, &option_bits);
      -utf8 = option_bits & PCRE_UTF8;
      -option_bits &= PCRE_NEWLINE_CR|PCRE_NEWLINE_LF|PCRE_NEWLINE_CRLF|
      -               PCRE_NEWLINE_ANY|PCRE_NEWLINE_ANYCRLF;
      -
      -/* If no newline options were set, find the default newline convention from the
      -build configuration. */
      -
      -if (option_bits == 0)
      -  {
      -  int d;
      -  (void)pcre_config(PCRE_CONFIG_NEWLINE, &d);
      -  /* Note that these values are always the ASCII ones, even in
      -  EBCDIC environments. CR = 13, NL = 10. */
      -  option_bits = (d == 13)? PCRE_NEWLINE_CR :
      -          (d == 10)? PCRE_NEWLINE_LF :
      -          (d == (13<<8 | 10))? PCRE_NEWLINE_CRLF :
      -          (d == -2)? PCRE_NEWLINE_ANYCRLF :
      -          (d == -1)? PCRE_NEWLINE_ANY : 0;
      -  }
      -
      -/* See if CRLF is a valid newline sequence. */
      -
      -crlf_is_newline =
      -     option_bits == PCRE_NEWLINE_ANY ||
      -     option_bits == PCRE_NEWLINE_CRLF ||
      -     option_bits == PCRE_NEWLINE_ANYCRLF;
      -
      -/* Loop for second and subsequent matches */
      -
      -for (;;)
      -  {
      -  int options = 0;                 /* Normally no options */
      -  int start_offset = ovector[1];   /* Start at end of previous match */
      -
      -  /* If the previous match was for an empty string, we are finished if we are
      -  at the end of the subject. Otherwise, arrange to run another match at the
      -  same point to see if a non-empty match can be found. */
      -
      -  if (ovector[0] == ovector[1])
      -    {
      -    if (ovector[0] == subject_length) break;
      -    options = PCRE_NOTEMPTY_ATSTART | PCRE_ANCHORED;
      -    }
      -
      -  /* Run the next matching operation */
      -
      -  rc = pcre_exec(
      -    re,                   /* the compiled pattern */
      -    NULL,                 /* no extra data - we didn't study the pattern */
      -    subject,              /* the subject string */
      -    subject_length,       /* the length of the subject */
      -    start_offset,         /* starting offset in the subject */
      -    options,              /* options */
      -    ovector,              /* output vector for substring information */
      -    OVECCOUNT);           /* number of elements in the output vector */
      -
      -  /* This time, a result of NOMATCH isn't an error. If the value in "options"
      -  is zero, it just means we have found all possible matches, so the loop ends.
      -  Otherwise, it means we have failed to find a non-empty-string match at a
      -  point where there was a previous empty-string match. In this case, we do what
      -  Perl does: advance the matching position by one character, and continue. We
      -  do this by setting the "end of previous match" offset, because that is picked
      -  up at the top of the loop as the point at which to start again.
      -
      -  There are two complications: (a) When CRLF is a valid newline sequence, and
      -  the current position is just before it, advance by an extra byte. (b)
      -  Otherwise we must ensure that we skip an entire UTF-8 character if we are in
      -  UTF-8 mode. */
      -
      -  if (rc == PCRE_ERROR_NOMATCH)
      -    {
      -    if (options == 0) break;                    /* All matches found */
      -    ovector[1] = start_offset + 1;              /* Advance one byte */
      -    if (crlf_is_newline &&                      /* If CRLF is newline & */
      -        start_offset < subject_length - 1 &&    /* we are at CRLF, */
      -        subject[start_offset] == '\r' &&
      -        subject[start_offset + 1] == '\n')
      -      ovector[1] += 1;                          /* Advance by one more. */
      -    else if (utf8)                              /* Otherwise, ensure we */
      -      {                                         /* advance a whole UTF-8 */
      -      while (ovector[1] < subject_length)       /* character. */
      -        {
      -        if ((subject[ovector[1]] & 0xc0) != 0x80) break;
      -        ovector[1] += 1;
      -        }
      -      }
      -    continue;    /* Go round the loop again */
      -    }
      -
      -  /* Other matching errors are not recoverable. */
      -
      -  if (rc < 0)
      -    {
      -    printf("Matching error %d\n", rc);
      -    pcre_free(re);    /* Release memory used for the compiled pattern */
      -    return 1;
      -    }
      -
      -  /* Match succeded */
      -
      -  printf("\nMatch succeeded again at offset %d\n", ovector[0]);
      -
      -  /* The match succeeded, but the output vector wasn't big enough. */
      -
      -  if (rc == 0)
      -    {
      -    rc = OVECCOUNT/3;
      -    printf("ovector only has room for %d captured substrings\n", rc - 1);
      -    }
      -
      -  /* As before, show substrings stored in the output vector by number, and then
      -  also any named substrings. */
      -
      -  for (i = 0; i < rc; i++)
      -    {
      -    char *substring_start = subject + ovector[2*i];
      -    int substring_length = ovector[2*i+1] - ovector[2*i];
      -    printf("%2d: %.*s\n", i, substring_length, substring_start);
      -    }
      -
      -  if (namecount <= 0) printf("No named substrings\n"); else
      -    {
      -    unsigned char *tabptr = name_table;
      -    printf("Named substrings\n");
      -    for (i = 0; i < namecount; i++)
      -      {
      -      int n = (tabptr[0] << 8) | tabptr[1];
      -      printf("(%d) %*s: %.*s\n", n, name_entry_size - 3, tabptr + 2,
      -        ovector[2*n+1] - ovector[2*n], subject + ovector[2*n]);
      -      tabptr += name_entry_size;
      -      }
      -    }
      -  }      /* End of loop to find second and subsequent matches */
      -
      -printf("\n");
      -pcre_free(re);       /* Release memory used for the compiled pattern */
      -return 0;
      -}
      -
      -/* End of pcredemo.c */
      -

      -Return to the PCRE index page. -

      diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcregrep.html b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcregrep.html deleted file mode 100644 index dacbb499..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcregrep.html +++ /dev/null @@ -1,759 +0,0 @@ - - -pcregrep specification - - -

      pcregrep man page

      -

      -Return to the PCRE index page. -

      -

      -This page is part of the PCRE HTML documentation. It was generated automatically -from the original man page. If there is any nonsense in it, please consult the -man page, in case the conversion went wrong. -
      -

      -
      SYNOPSIS
      -

      -pcregrep [options] [long options] [pattern] [path1 path2 ...] -

      -
      DESCRIPTION
      -

      -pcregrep searches files for character patterns, in the same way as other -grep commands do, but it uses the PCRE regular expression library to support -patterns that are compatible with the regular expressions of Perl 5. See -pcresyntax(3) -for a quick-reference summary of pattern syntax, or -pcrepattern(3) -for a full description of the syntax and semantics of the regular expressions -that PCRE supports. -

      -

      -Patterns, whether supplied on the command line or in a separate file, are given -without delimiters. For example: -

      -  pcregrep Thursday /etc/motd
      -
      -If you attempt to use delimiters (for example, by surrounding a pattern with -slashes, as is common in Perl scripts), they are interpreted as part of the -pattern. Quotes can of course be used to delimit patterns on the command line -because they are interpreted by the shell, and indeed quotes are required if a -pattern contains white space or shell metacharacters. -

      -

      -The first argument that follows any option settings is treated as the single -pattern to be matched when neither -e nor -f is present. -Conversely, when one or both of these options are used to specify patterns, all -arguments are treated as path names. At least one of -e, -f, or an -argument pattern must be provided. -

      -

      -If no files are specified, pcregrep reads the standard input. The -standard input can also be referenced by a name consisting of a single hyphen. -For example: -

      -  pcregrep some-pattern /file1 - /file3
      -
      -By default, each line that matches a pattern is copied to the standard -output, and if there is more than one file, the file name is output at the -start of each line, followed by a colon. However, there are options that can -change how pcregrep behaves. In particular, the -M option makes it -possible to search for patterns that span line boundaries. What defines a line -boundary is controlled by the -N (--newline) option. -

      -

      -The amount of memory used for buffering files that are being scanned is -controlled by a parameter that can be set by the --buffer-size option. -The default value for this parameter is specified when pcregrep is built, -with the default default being 20K. A block of memory three times this size is -used (to allow for buffering "before" and "after" lines). An error occurs if a -line overflows the buffer. -

      -

      -Patterns can be no longer than 8K or BUFSIZ bytes, whichever is the greater. -BUFSIZ is defined in <stdio.h>. When there is more than one pattern -(specified by the use of -e and/or -f), each pattern is applied to -each line in the order in which they are defined, except that all the -e -patterns are tried before the -f patterns. -

      -

      -By default, as soon as one pattern matches a line, no further patterns are -considered. However, if --colour (or --color) is used to colour the -matching substrings, or if --only-matching, --file-offsets, or ---line-offsets is used to output only the part of the line that matched -(either shown literally, or as an offset), scanning resumes immediately -following the match, so that further matches on the same line can be found. If -there are multiple patterns, they are all tried on the remainder of the line, -but patterns that follow the one that matched are not tried on the earlier part -of the line. -

      -

      -This behaviour means that the order in which multiple patterns are specified -can affect the output when one of the above options is used. This is no longer -the same behaviour as GNU grep, which now manages to display earlier matches -for later patterns (as long as there is no overlap). -

      -

      -Patterns that can match an empty string are accepted, but empty string -matches are never recognized. An example is the pattern "(super)?(man)?", in -which all components are optional. This pattern finds all occurrences of both -"super" and "man"; the output differs from matching with "super|man" when only -the matching substrings are being shown. -

      -

      -If the LC_ALL or LC_CTYPE environment variable is set, -pcregrep uses the value to set a locale when calling the PCRE library. -The --locale option can be used to override this. -

      -
      SUPPORT FOR COMPRESSED FILES
      -

      -It is possible to compile pcregrep so that it uses libz or -libbz2 to read files whose names end in .gz or .bz2, -respectively. You can find out whether your binary has support for one or both -of these file types by running it with the --help option. If the -appropriate support is not present, files are treated as plain text. The -standard input is always so treated. -

      -
      BINARY FILES
      -

      -By default, a file that contains a binary zero byte within the first 1024 bytes -is identified as a binary file, and is processed specially. (GNU grep also -identifies binary files in this manner.) See the --binary-files option -for a means of changing the way binary files are handled. -

      -
      OPTIONS
      -

      -The order in which some of the options appear can affect the output. For -example, both the -h and -l options affect the printing of file -names. Whichever comes later in the command line will be the one that takes -effect. Similarly, except where noted below, if an option is given twice, the -later setting is used. Numerical values for options may be followed by K or M, -to signify multiplication by 1024 or 1024*1024 respectively. -

      -

      --- -This terminates the list of options. It is useful if the next item on the -command line starts with a hyphen but is not an option. This allows for the -processing of patterns and filenames that start with hyphens. -

      -

      --A number, --after-context=number -Output number lines of context after each matching line. If filenames -and/or line numbers are being output, a hyphen separator is used instead of a -colon for the context lines. A line containing "--" is output between each -group of lines, unless they are in fact contiguous in the input file. The value -of number is expected to be relatively small. However, pcregrep -guarantees to have up to 8K of following text available for context output. -

      -

      --a, --text -Treat binary files as text. This is equivalent to ---binary-files=text. -

      -

      --B number, --before-context=number -Output number lines of context before each matching line. If filenames -and/or line numbers are being output, a hyphen separator is used instead of a -colon for the context lines. A line containing "--" is output between each -group of lines, unless they are in fact contiguous in the input file. The value -of number is expected to be relatively small. However, pcregrep -guarantees to have up to 8K of preceding text available for context output. -

      -

      ---binary-files=word -Specify how binary files are to be processed. If the word is "binary" (the -default), pattern matching is performed on binary files, but the only output is -"Binary file <name> matches" when a match succeeds. If the word is "text", -which is equivalent to the -a or --text option, binary files are -processed in the same way as any other file. In this case, when a match -succeeds, the output may be binary garbage, which can have nasty effects if -sent to a terminal. If the word is "without-match", which is equivalent to the --I option, binary files are not processed at all; they are assumed not to -be of interest. -

      -

      ---buffer-size=number -Set the parameter that controls how much memory is used for buffering files -that are being scanned. -

      -

      --C number, --context=number -Output number lines of context both before and after each matching line. -This is equivalent to setting both -A and -B to the same value. -

      -

      --c, --count -Do not output individual lines from the files that are being scanned; instead -output the number of lines that would otherwise have been shown. If no lines -are selected, the number zero is output. If several files are are being -scanned, a count is output for each of them. However, if the ---files-with-matches option is also used, only those files whose counts -are greater than zero are listed. When -c is used, the -A, --B, and -C options are ignored. -

      -

      ---colour, --color -If this option is given without any data, it is equivalent to "--colour=auto". -If data is required, it must be given in the same shell item, separated by an -equals sign. -

      -

      ---colour=value, --color=value -This option specifies under what circumstances the parts of a line that matched -a pattern should be coloured in the output. By default, the output is not -coloured. The value (which is optional, see above) may be "never", "always", or -"auto". In the latter case, colouring happens only if the standard output is -connected to a terminal. More resources are used when colouring is enabled, -because pcregrep has to search for all possible matches in a line, not -just one, in order to colour them all. -
      -
      -The colour that is used can be specified by setting the environment variable -PCREGREP_COLOUR or PCREGREP_COLOR. The value of this variable should be a -string of two numbers, separated by a semicolon. They are copied directly into -the control string for setting colour on a terminal, so it is your -responsibility to ensure that they make sense. If neither of the environment -variables is set, the default is "1;31", which gives red. -

      -

      --D action, --devices=action -If an input path is not a regular file or a directory, "action" specifies how -it is to be processed. Valid values are "read" (the default) or "skip" -(silently skip the path). -

      -

      --d action, --directories=action -If an input path is a directory, "action" specifies how it is to be processed. -Valid values are "read" (the default in non-Windows environments, for -compatibility with GNU grep), "recurse" (equivalent to the -r option), or -"skip" (silently skip the path, the default in Windows environments). In the -"read" case, directories are read as if they were ordinary files. In some -operating systems the effect of reading a directory like this is an immediate -end-of-file; in others it may provoke an error. -

      -

      --e pattern, --regex=pattern, --regexp=pattern -Specify a pattern to be matched. This option can be used multiple times in -order to specify several patterns. It can also be used as a way of specifying a -single pattern that starts with a hyphen. When -e is used, no argument -pattern is taken from the command line; all arguments are treated as file -names. There is no limit to the number of patterns. They are applied to each -line in the order in which they are defined until one matches. -
      -
      -If -f is used with -e, the command line patterns are matched first, -followed by the patterns from the file(s), independent of the order in which -these options are specified. Note that multiple use of -e is not the same -as a single pattern with alternatives. For example, X|Y finds the first -character in a line that is X or Y, whereas if the two patterns are given -separately, with X first, pcregrep finds X if it is present, even if it -follows Y in the line. It finds Y only if there is no X in the line. This -matters only if you are using -o or --colo(u)r to show the part(s) -of the line that matched. -

      -

      ---exclude=pattern -Files (but not directories) whose names match the pattern are skipped without -being processed. This applies to all files, whether listed on the command line, -obtained from --file-list, or by scanning a directory. The pattern is a -PCRE regular expression, and is matched against the final component of the file -name, not the entire path. The -F, -w, and -x options do not -apply to this pattern. The option may be given any number of times in order to -specify multiple patterns. If a file name matches both an --include -and an --exclude pattern, it is excluded. There is no short form for this -option. -

      -

      ---exclude-from=filename -Treat each non-empty line of the file as the data for an --exclude -option. What constitutes a newline when reading the file is the operating -system's default. The --newline option has no effect on this option. This -option may be given more than once in order to specify a number of files to -read. -

      -

      ---exclude-dir=pattern -Directories whose names match the pattern are skipped without being processed, -whatever the setting of the --recursive option. This applies to all -directories, whether listed on the command line, obtained from ---file-list, or by scanning a parent directory. The pattern is a PCRE -regular expression, and is matched against the final component of the directory -name, not the entire path. The -F, -w, and -x options do not -apply to this pattern. The option may be given any number of times in order to -specify more than one pattern. If a directory matches both --include-dir -and --exclude-dir, it is excluded. There is no short form for this -option. -

      -

      --F, --fixed-strings -Interpret each data-matching pattern as a list of fixed strings, separated by -newlines, instead of as a regular expression. What constitutes a newline for -this purpose is controlled by the --newline option. The -w (match -as a word) and -x (match whole line) options can be used with -F. -They apply to each of the fixed strings. A line is selected if any of the fixed -strings are found in it (subject to -w or -x, if present). This -option applies only to the patterns that are matched against the contents of -files; it does not apply to patterns specified by any of the --include or ---exclude options. -

      -

      --f filename, --file=filename -Read patterns from the file, one per line, and match them against -each line of input. What constitutes a newline when reading the file is the -operating system's default. The --newline option has no effect on this -option. Trailing white space is removed from each line, and blank lines are -ignored. An empty file contains no patterns and therefore matches nothing. See -also the comments about multiple patterns versus a single pattern with -alternatives in the description of -e above. -
      -
      -If this option is given more than once, all the specified files are -read. A data line is output if any of the patterns match it. A filename can -be given as "-" to refer to the standard input. When -f is used, patterns -specified on the command line using -e may also be present; they are -tested before the file's patterns. However, no other pattern is taken from the -command line; all arguments are treated as the names of paths to be searched. -

      -

      ---file-list=filename -Read a list of files and/or directories that are to be scanned from the given -file, one per line. Trailing white space is removed from each line, and blank -lines are ignored. These paths are processed before any that are listed on the -command line. The filename can be given as "-" to refer to the standard input. -If --file and --file-list are both specified as "-", patterns are -read first. This is useful only when the standard input is a terminal, from -which further lines (the list of files) can be read after an end-of-file -indication. If this option is given more than once, all the specified files are -read. -

      -

      ---file-offsets -Instead of showing lines or parts of lines that match, show each match as an -offset from the start of the file and a length, separated by a comma. In this -mode, no context is shown. That is, the -A, -B, and -C -options are ignored. If there is more than one match in a line, each of them is -shown separately. This option is mutually exclusive with --line-offsets -and --only-matching. -

      -

      --H, --with-filename -Force the inclusion of the filename at the start of output lines when searching -a single file. By default, the filename is not shown in this case. For matching -lines, the filename is followed by a colon; for context lines, a hyphen -separator is used. If a line number is also being output, it follows the file -name. -

      -

      --h, --no-filename -Suppress the output filenames when searching multiple files. By default, -filenames are shown when multiple files are searched. For matching lines, the -filename is followed by a colon; for context lines, a hyphen separator is used. -If a line number is also being output, it follows the file name. -

      -

      ---help -Output a help message, giving brief details of the command options and file -type support, and then exit. Anything else on the command line is -ignored. -

      -

      --I -Treat binary files as never matching. This is equivalent to ---binary-files=without-match. -

      -

      --i, --ignore-case -Ignore upper/lower case distinctions during comparisons. -

      -

      ---include=pattern -If any --include patterns are specified, the only files that are -processed are those that match one of the patterns (and do not match an ---exclude pattern). This option does not affect directories, but it -applies to all files, whether listed on the command line, obtained from ---file-list, or by scanning a directory. The pattern is a PCRE regular -expression, and is matched against the final component of the file name, not -the entire path. The -F, -w, and -x options do not apply to -this pattern. The option may be given any number of times. If a file name -matches both an --include and an --exclude pattern, it is excluded. -There is no short form for this option. -

      -

      ---include-from=filename -Treat each non-empty line of the file as the data for an --include -option. What constitutes a newline for this purpose is the operating system's -default. The --newline option has no effect on this option. This option -may be given any number of times; all the files are read. -

      -

      ---include-dir=pattern -If any --include-dir patterns are specified, the only directories that -are processed are those that match one of the patterns (and do not match an ---exclude-dir pattern). This applies to all directories, whether listed -on the command line, obtained from --file-list, or by scanning a parent -directory. The pattern is a PCRE regular expression, and is matched against the -final component of the directory name, not the entire path. The -F, --w, and -x options do not apply to this pattern. The option may be -given any number of times. If a directory matches both --include-dir and ---exclude-dir, it is excluded. There is no short form for this option. -

      -

      --L, --files-without-match -Instead of outputting lines from the files, just output the names of the files -that do not contain any lines that would have been output. Each file name is -output once, on a separate line. -

      -

      --l, --files-with-matches -Instead of outputting lines from the files, just output the names of the files -containing lines that would have been output. Each file name is output -once, on a separate line. Searching normally stops as soon as a matching line -is found in a file. However, if the -c (count) option is also used, -matching continues in order to obtain the correct count, and those files that -have at least one match are listed along with their counts. Using this option -with -c is a way of suppressing the listing of files with no matches. -

      -

      ---label=name -This option supplies a name to be used for the standard input when file names -are being output. If not supplied, "(standard input)" is used. There is no -short form for this option. -

      -

      ---line-buffered -When this option is given, input is read and processed line by line, and the -output is flushed after each write. By default, input is read in large chunks, -unless pcregrep can determine that it is reading from a terminal (which -is currently possible only in Unix-like environments). Output to terminal is -normally automatically flushed by the operating system. This option can be -useful when the input or output is attached to a pipe and you do not want -pcregrep to buffer up large amounts of data. However, its use will affect -performance, and the -M (multiline) option ceases to work. -

      -

      ---line-offsets -Instead of showing lines or parts of lines that match, show each match as a -line number, the offset from the start of the line, and a length. The line -number is terminated by a colon (as usual; see the -n option), and the -offset and length are separated by a comma. In this mode, no context is shown. -That is, the -A, -B, and -C options are ignored. If there is -more than one match in a line, each of them is shown separately. This option is -mutually exclusive with --file-offsets and --only-matching. -

      -

      ---locale=locale-name -This option specifies a locale to be used for pattern matching. It overrides -the value in the LC_ALL or LC_CTYPE environment variables. If no -locale is specified, the PCRE library's default (usually the "C" locale) is -used. There is no short form for this option. -

      -

      ---match-limit=number -Processing some regular expression patterns can require a very large amount of -memory, leading in some cases to a program crash if not enough is available. -Other patterns may take a very long time to search for all possible matching -strings. The pcre_exec() function that is called by pcregrep to do -the matching has two parameters that can limit the resources that it uses. -
      -
      -The --match-limit option provides a means of limiting resource usage -when processing patterns that are not going to match, but which have a very -large number of possibilities in their search trees. The classic example is a -pattern that uses nested unlimited repeats. Internally, PCRE uses a function -called match() which it calls repeatedly (sometimes recursively). The -limit set by --match-limit is imposed on the number of times this -function is called during a match, which has the effect of limiting the amount -of backtracking that can take place. -
      -
      -The --recursion-limit option is similar to --match-limit, but -instead of limiting the total number of times that match() is called, it -limits the depth of recursive calls, which in turn limits the amount of memory -that can be used. The recursion depth is a smaller number than the total number -of calls, because not all calls to match() are recursive. This limit is -of use only if it is set smaller than --match-limit. -
      -
      -There are no short forms for these options. The default settings are specified -when the PCRE library is compiled, with the default default being 10 million. -

      -

      --M, --multiline -Allow patterns to match more than one line. When this option is given, patterns -may usefully contain literal newline characters and internal occurrences of ^ -and $ characters. The output for a successful match may consist of more than -one line, the last of which is the one in which the match ended. If the matched -string ends with a newline sequence the output ends at the end of that line. -
      -
      -When this option is set, the PCRE library is called in "multiline" mode. -There is a limit to the number of lines that can be matched, imposed by the way -that pcregrep buffers the input file as it scans it. However, -pcregrep ensures that at least 8K characters or the rest of the document -(whichever is the shorter) are available for forward matching, and similarly -the previous 8K characters (or all the previous characters, if fewer than 8K) -are guaranteed to be available for lookbehind assertions. This option does not -work when input is read line by line (see \fP--line-buffered\fP.) -

      -

      --N newline-type, --newline=newline-type -The PCRE library supports five different conventions for indicating -the ends of lines. They are the single-character sequences CR (carriage return) -and LF (linefeed), the two-character sequence CRLF, an "anycrlf" convention, -which recognizes any of the preceding three types, and an "any" convention, in -which any Unicode line ending sequence is assumed to end a line. The Unicode -sequences are the three just mentioned, plus VT (vertical tab, U+000B), FF -(form feed, U+000C), NEL (next line, U+0085), LS (line separator, U+2028), and -PS (paragraph separator, U+2029). -
      -
      -When the PCRE library is built, a default line-ending sequence is specified. -This is normally the standard sequence for the operating system. Unless -otherwise specified by this option, pcregrep uses the library's default. -The possible values for this option are CR, LF, CRLF, ANYCRLF, or ANY. This -makes it possible to use pcregrep to scan files that have come from other -environments without having to modify their line endings. If the data that is -being scanned does not agree with the convention set by this option, -pcregrep may behave in strange ways. Note that this option does not -apply to files specified by the -f, --exclude-from, or ---include-from options, which are expected to use the operating system's -standard newline sequence. -

      -

      --n, --line-number -Precede each output line by its line number in the file, followed by a colon -for matching lines or a hyphen for context lines. If the filename is also being -output, it precedes the line number. This option is forced if ---line-offsets is used. -

      -

      ---no-jit -If the PCRE library is built with support for just-in-time compiling (which -speeds up matching), pcregrep automatically makes use of this, unless it -was explicitly disabled at build time. This option can be used to disable the -use of JIT at run time. It is provided for testing and working round problems. -It should never be needed in normal use. -

      -

      --o, --only-matching -Show only the part of the line that matched a pattern instead of the whole -line. In this mode, no context is shown. That is, the -A, -B, and --C options are ignored. If there is more than one match in a line, each -of them is shown separately. If -o is combined with -v (invert the -sense of the match to find non-matching lines), no output is generated, but the -return code is set appropriately. If the matched portion of the line is empty, -nothing is output unless the file name or line number are being printed, in -which case they are shown on an otherwise empty line. This option is mutually -exclusive with --file-offsets and --line-offsets. -

      -

      --onumber, --only-matching=number -Show only the part of the line that matched the capturing parentheses of the -given number. Up to 32 capturing parentheses are supported, and -o0 is -equivalent to -o without a number. Because these options can be given -without an argument (see above), if an argument is present, it must be given in -the same shell item, for example, -o3 or --only-matching=2. The comments given -for the non-argument case above also apply to this case. If the specified -capturing parentheses do not exist in the pattern, or were not set in the -match, nothing is output unless the file name or line number are being printed. -
      -
      -If this option is given multiple times, multiple substrings are output, in the -order the options are given. For example, -o3 -o1 -o3 causes the substrings -matched by capturing parentheses 3 and 1 and then 3 again to be output. By -default, there is no separator (but see the next option). -

      -

      ---om-separator=text -Specify a separating string for multiple occurrences of -o. The default -is an empty string. Separating strings are never coloured. -

      -

      --q, --quiet -Work quietly, that is, display nothing except error messages. The exit -status indicates whether or not any matches were found. -

      -

      --r, --recursive -If any given path is a directory, recursively scan the files it contains, -taking note of any --include and --exclude settings. By default, a -directory is read as a normal file; in some operating systems this gives an -immediate end-of-file. This option is a shorthand for setting the -d -option to "recurse". -

      -

      ---recursion-limit=number -See --match-limit above. -

      -

      --s, --no-messages -Suppress error messages about non-existent or unreadable files. Such files are -quietly skipped. However, the return code is still 2, even if matches were -found in other files. -

      -

      --u, --utf-8 -Operate in UTF-8 mode. This option is available only if PCRE has been compiled -with UTF-8 support. All patterns (including those for any --exclude and ---include options) and all subject lines that are scanned must be valid -strings of UTF-8 characters. -

      -

      --V, --version -Write the version numbers of pcregrep and the PCRE library to the -standard output and then exit. Anything else on the command line is -ignored. -

      -

      --v, --invert-match -Invert the sense of the match, so that lines which do not match any of -the patterns are the ones that are found. -

      -

      --w, --word-regex, --word-regexp -Force the patterns to match only whole words. This is equivalent to having \b -at the start and end of the pattern. This option applies only to the patterns -that are matched against the contents of files; it does not apply to patterns -specified by any of the --include or --exclude options. -

      -

      --x, --line-regex, --line-regexp -Force the patterns to be anchored (each must start matching at the beginning of -a line) and in addition, require them to match entire lines. This is equivalent -to having ^ and $ characters at the start and end of each alternative branch in -every pattern. This option applies only to the patterns that are matched -against the contents of files; it does not apply to patterns specified by any -of the --include or --exclude options. -

      -
      ENVIRONMENT VARIABLES
      -

      -The environment variables LC_ALL and LC_CTYPE are examined, in that -order, for a locale. The first one that is set is used. This can be overridden -by the --locale option. If no locale is set, the PCRE library's default -(usually the "C" locale) is used. -

      -
      NEWLINES
      -

      -The -N (--newline) option allows pcregrep to scan files with -different newline conventions from the default. Any parts of the input files -that are written to the standard output are copied identically, with whatever -newline sequences they have in the input. However, the setting of this option -does not affect the interpretation of files specified by the -f, ---exclude-from, or --include-from options, which are assumed to use -the operating system's standard newline sequence, nor does it affect the way in -which pcregrep writes informational messages to the standard error and -output streams. For these it uses the string "\n" to indicate newlines, -relying on the C I/O library to convert this to an appropriate sequence. -

      -
      OPTIONS COMPATIBILITY
      -

      -Many of the short and long forms of pcregrep's options are the same -as in the GNU grep program. Any long option of the form ---xxx-regexp (GNU terminology) is also available as --xxx-regex -(PCRE terminology). However, the --file-list, --file-offsets, ---include-dir, --line-offsets, --locale, --match-limit, --M, --multiline, -N, --newline, --om-separator, ---recursion-limit, -u, and --utf-8 options are specific to -pcregrep, as is the use of the --only-matching option with a -capturing parentheses number. -

      -

      -Although most of the common options work the same way, a few are different in -pcregrep. For example, the --include option's argument is a glob -for GNU grep, but a regular expression for pcregrep. If both the --c and -l options are given, GNU grep lists only file names, -without counts, but pcregrep gives the counts. -

      -
      OPTIONS WITH DATA
      -

      -There are four different ways in which an option with data can be specified. -If a short form option is used, the data may follow immediately, or (with one -exception) in the next command line item. For example: -

      -  -f/some/file
      -  -f /some/file
      -
      -The exception is the -o option, which may appear with or without data. -Because of this, if data is present, it must follow immediately in the same -item, for example -o3. -

      -

      -If a long form option is used, the data may appear in the same command line -item, separated by an equals character, or (with two exceptions) it may appear -in the next command line item. For example: -

      -  --file=/some/file
      -  --file /some/file
      -
      -Note, however, that if you want to supply a file name beginning with ~ as data -in a shell command, and have the shell expand ~ to a home directory, you must -separate the file name from the option, because the shell does not treat ~ -specially unless it is at the start of an item. -

      -

      -The exceptions to the above are the --colour (or --color) and ---only-matching options, for which the data is optional. If one of these -options does have data, it must be given in the first form, using an equals -character. Otherwise pcregrep will assume that it has no data. -

      -
      MATCHING ERRORS
      -

      -It is possible to supply a regular expression that takes a very long time to -fail to match certain lines. Such patterns normally involve nested indefinite -repeats, for example: (a+)*\d when matched against a line of a's with no final -digit. The PCRE matching function has a resource limit that causes it to abort -in these circumstances. If this happens, pcregrep outputs an error -message and the line that caused the problem to the standard error stream. If -there are more than 20 such errors, pcregrep gives up. -

      -

      -The --match-limit option of pcregrep can be used to set the overall -resource limit; there is a second option called --recursion-limit that -sets a limit on the amount of memory (usually stack) that is used (see the -discussion of these options above). -

      -
      DIAGNOSTICS
      -

      -Exit status is 0 if any matches were found, 1 if no matches were found, and 2 -for syntax errors, overlong lines, non-existent or inaccessible files (even if -matches were found in other files) or too many matching errors. Using the --s option to suppress error messages about inaccessible files does not -affect the return code. -

      -
      SEE ALSO
      -

      -pcrepattern(3), pcresyntax(3), pcretest(1). -

      -
      AUTHOR
      -

      -Philip Hazel -
      -University Computing Service -
      -Cambridge CB2 3QH, England. -
      -

      -
      REVISION
      -

      -Last updated: 03 April 2014 -
      -Copyright © 1997-2014 University of Cambridge. -
      -

      -Return to the PCRE index page. -

      diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcrejit.html b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcrejit.html deleted file mode 100644 index abb34252..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcrejit.html +++ /dev/null @@ -1,499 +0,0 @@ - - -pcrejit specification - - -

      pcrejit man page

      -

      -Return to the PCRE index page. -

      -

      -This page is part of the PCRE HTML documentation. It was generated automatically -from the original man page. If there is any nonsense in it, please consult the -man page, in case the conversion went wrong. -
      -

      -
      PCRE JUST-IN-TIME COMPILER SUPPORT
      -

      -Just-in-time compiling is a heavyweight optimization that can greatly speed up -pattern matching. However, it comes at the cost of extra processing before the -match is performed. Therefore, it is of most benefit when the same pattern is -going to be matched many times. This does not necessarily mean many calls of a -matching function; if the pattern is not anchored, matching attempts may take -place many times at various positions in the subject, even for a single call. -Therefore, if the subject string is very long, it may still pay to use JIT for -one-off matches. -

      -

      -JIT support applies only to the traditional Perl-compatible matching function. -It does not apply when the DFA matching function is being used. The code for -this support was written by Zoltan Herczeg. -

      -
      8-BIT, 16-BIT AND 32-BIT SUPPORT
      -

      -JIT support is available for all of the 8-bit, 16-bit and 32-bit PCRE -libraries. To keep this documentation simple, only the 8-bit interface is -described in what follows. If you are using the 16-bit library, substitute the -16-bit functions and 16-bit structures (for example, pcre16_jit_stack -instead of pcre_jit_stack). If you are using the 32-bit library, -substitute the 32-bit functions and 32-bit structures (for example, -pcre32_jit_stack instead of pcre_jit_stack). -

      -
      AVAILABILITY OF JIT SUPPORT
      -

      -JIT support is an optional feature of PCRE. The "configure" option --enable-jit -(or equivalent CMake option) must be set when PCRE is built if you want to use -JIT. The support is limited to the following hardware platforms: -

      -  ARM v5, v7, and Thumb2
      -  Intel x86 32-bit and 64-bit
      -  MIPS 32-bit
      -  Power PC 32-bit and 64-bit
      -  SPARC 32-bit (experimental)
      -
      -If --enable-jit is set on an unsupported platform, compilation fails. -

      -

      -A program that is linked with PCRE 8.20 or later can tell if JIT support is -available by calling pcre_config() with the PCRE_CONFIG_JIT option. The -result is 1 when JIT is available, and 0 otherwise. However, a simple program -does not need to check this in order to use JIT. The normal API is implemented -in a way that falls back to the interpretive code if JIT is not available. For -programs that need the best possible performance, there is also a "fast path" -API that is JIT-specific. -

      -

      -If your program may sometimes be linked with versions of PCRE that are older -than 8.20, but you want to use JIT when it is available, you can test the -values of PCRE_MAJOR and PCRE_MINOR, or the existence of a JIT macro such as -PCRE_CONFIG_JIT, for compile-time control of your code. Also beware that the -pcre_jit_exec() function was not available at all before 8.32, -and may not be available at all if PCRE isn't compiled with ---enable-jit. See the "JIT FAST PATH API" section below for details. -

      -
      SIMPLE USE OF JIT
      -

      -You have to do two things to make use of the JIT support in the simplest way: -

      -  (1) Call pcre_study() with the PCRE_STUDY_JIT_COMPILE option for
      -      each compiled pattern, and pass the resulting pcre_extra block to
      -      pcre_exec().
      -
      -  (2) Use pcre_free_study() to free the pcre_extra block when it is
      -      no longer needed, instead of just freeing it yourself. This ensures that
      -      any JIT data is also freed.
      -
      -For a program that may be linked with pre-8.20 versions of PCRE, you can insert -
      -  #ifndef PCRE_STUDY_JIT_COMPILE
      -  #define PCRE_STUDY_JIT_COMPILE 0
      -  #endif
      -
      -so that no option is passed to pcre_study(), and then use something like -this to free the study data: -
      -  #ifdef PCRE_CONFIG_JIT
      -      pcre_free_study(study_ptr);
      -  #else
      -      pcre_free(study_ptr);
      -  #endif
      -
      -PCRE_STUDY_JIT_COMPILE requests the JIT compiler to generate code for complete -matches. If you want to run partial matches using the PCRE_PARTIAL_HARD or -PCRE_PARTIAL_SOFT options of pcre_exec(), you should set one or both of -the following options in addition to, or instead of, PCRE_STUDY_JIT_COMPILE -when you call pcre_study(): -
      -  PCRE_STUDY_JIT_PARTIAL_HARD_COMPILE
      -  PCRE_STUDY_JIT_PARTIAL_SOFT_COMPILE
      -
      -If using pcre_jit_exec() and supporting a pre-8.32 version of -PCRE, you can insert: -
      -   #if PCRE_MAJOR >= 8 && PCRE_MINOR >= 32
      -   pcre_jit_exec(...);
      -   #else
      -   pcre_exec(...)
      -   #endif
      -
      -but as described in the "JIT FAST PATH API" section below this assumes -version 8.32 and later are compiled with --enable-jit, which may -break. -
      -
      -The JIT compiler generates different optimized code for each of the three -modes (normal, soft partial, hard partial). When pcre_exec() is called, -the appropriate code is run if it is available. Otherwise, the pattern is -matched using interpretive code. -

      -

      -In some circumstances you may need to call additional functions. These are -described in the section entitled -"Controlling the JIT stack" -below. -

      -

      -If JIT support is not available, PCRE_STUDY_JIT_COMPILE etc. are ignored, and -no JIT data is created. Otherwise, the compiled pattern is passed to the JIT -compiler, which turns it into machine code that executes much faster than the -normal interpretive code. When pcre_exec() is passed a pcre_extra -block containing a pointer to JIT code of the appropriate mode (normal or -hard/soft partial), it obeys that code instead of running the interpreter. The -result is identical, but the compiled JIT code runs much faster. -

      -

      -There are some pcre_exec() options that are not supported for JIT -execution. There are also some pattern items that JIT cannot handle. Details -are given below. In both cases, execution automatically falls back to the -interpretive code. If you want to know whether JIT was actually used for a -particular match, you should arrange for a JIT callback function to be set up -as described in the section entitled -"Controlling the JIT stack" -below, even if you do not need to supply a non-default JIT stack. Such a -callback function is called whenever JIT code is about to be obeyed. If the -execution options are not right for JIT execution, the callback function is not -obeyed. -

      -

      -If the JIT compiler finds an unsupported item, no JIT data is generated. You -can find out if JIT execution is available after studying a pattern by calling -pcre_fullinfo() with the PCRE_INFO_JIT option. A result of 1 means that -JIT compilation was successful. A result of 0 means that JIT support is not -available, or the pattern was not studied with PCRE_STUDY_JIT_COMPILE etc., or -the JIT compiler was not able to handle the pattern. -

      -

      -Once a pattern has been studied, with or without JIT, it can be used as many -times as you like for matching different subject strings. -

      -
      UNSUPPORTED OPTIONS AND PATTERN ITEMS
      -

      -The only pcre_exec() options that are supported for JIT execution are -PCRE_NO_UTF8_CHECK, PCRE_NO_UTF16_CHECK, PCRE_NO_UTF32_CHECK, PCRE_NOTBOL, -PCRE_NOTEOL, PCRE_NOTEMPTY, PCRE_NOTEMPTY_ATSTART, PCRE_PARTIAL_HARD, and -PCRE_PARTIAL_SOFT. -

      -

      -The only unsupported pattern items are \C (match a single data unit) when -running in a UTF mode, and a callout immediately before an assertion condition -in a conditional group. -

      -
      RETURN VALUES FROM JIT EXECUTION
      -

      -When a pattern is matched using JIT execution, the return values are the same -as those given by the interpretive pcre_exec() code, with the addition of -one new error code: PCRE_ERROR_JIT_STACKLIMIT. This means that the memory used -for the JIT stack was insufficient. See -"Controlling the JIT stack" -below for a discussion of JIT stack usage. For compatibility with the -interpretive pcre_exec() code, no more than two-thirds of the -ovector argument is used for passing back captured substrings. -

      -

      -The error code PCRE_ERROR_MATCHLIMIT is returned by the JIT code if searching a -very large pattern tree goes on for too long, as it is in the same circumstance -when JIT is not used, but the details of exactly what is counted are not the -same. The PCRE_ERROR_RECURSIONLIMIT error code is never returned by JIT -execution. -

      -
      SAVING AND RESTORING COMPILED PATTERNS
      -

      -The code that is generated by the JIT compiler is architecture-specific, and is -also position dependent. For those reasons it cannot be saved (in a file or -database) and restored later like the bytecode and other data of a compiled -pattern. Saving and restoring compiled patterns is not something many people -do. More detail about this facility is given in the -pcreprecompile -documentation. It should be possible to run pcre_study() on a saved and -restored pattern, and thereby recreate the JIT data, but because JIT -compilation uses significant resources, it is probably not worth doing this; -you might as well recompile the original pattern. -

      -
      CONTROLLING THE JIT STACK
      -

      -When the compiled JIT code runs, it needs a block of memory to use as a stack. -By default, it uses 32K on the machine stack. However, some large or -complicated patterns need more than this. The error PCRE_ERROR_JIT_STACKLIMIT -is given when there is not enough stack. Three functions are provided for -managing blocks of memory for use as JIT stacks. There is further discussion -about the use of JIT stacks in the section entitled -"JIT stack FAQ" -below. -

      -

      -The pcre_jit_stack_alloc() function creates a JIT stack. Its arguments -are a starting size and a maximum size, and it returns a pointer to an opaque -structure of type pcre_jit_stack, or NULL if there is an error. The -pcre_jit_stack_free() function can be used to free a stack that is no -longer needed. (For the technically minded: the address space is allocated by -mmap or VirtualAlloc.) -

      -

      -JIT uses far less memory for recursion than the interpretive code, -and a maximum stack size of 512K to 1M should be more than enough for any -pattern. -

      -

      -The pcre_assign_jit_stack() function specifies which stack JIT code -should use. Its arguments are as follows: -

      -  pcre_extra         *extra
      -  pcre_jit_callback  callback
      -  void               *data
      -
      -The extra argument must be the result of studying a pattern with -PCRE_STUDY_JIT_COMPILE etc. There are three cases for the values of the other -two options: -
      -  (1) If callback is NULL and data is NULL, an internal 32K block
      -      on the machine stack is used.
      -
      -  (2) If callback is NULL and data is not NULL, data must be
      -      a valid JIT stack, the result of calling pcre_jit_stack_alloc().
      -
      -  (3) If callback is not NULL, it must point to a function that is
      -      called with data as an argument at the start of matching, in
      -      order to set up a JIT stack. If the return from the callback
      -      function is NULL, the internal 32K stack is used; otherwise the
      -      return value must be a valid JIT stack, the result of calling
      -      pcre_jit_stack_alloc().
      -
      -A callback function is obeyed whenever JIT code is about to be run; it is not -obeyed when pcre_exec() is called with options that are incompatible for -JIT execution. A callback function can therefore be used to determine whether a -match operation was executed by JIT or by the interpreter. -

      -

      -You may safely use the same JIT stack for more than one pattern (either by -assigning directly or by callback), as long as the patterns are all matched -sequentially in the same thread. In a multithread application, if you do not -specify a JIT stack, or if you assign or pass back NULL from a callback, that -is thread-safe, because each thread has its own machine stack. However, if you -assign or pass back a non-NULL JIT stack, this must be a different stack for -each thread so that the application is thread-safe. -

      -

      -Strictly speaking, even more is allowed. You can assign the same non-NULL stack -to any number of patterns as long as they are not used for matching by multiple -threads at the same time. For example, you can assign the same stack to all -compiled patterns, and use a global mutex in the callback to wait until the -stack is available for use. However, this is an inefficient solution, and not -recommended. -

      -

      -This is a suggestion for how a multithreaded program that needs to set up -non-default JIT stacks might operate: -

      -  During thread initalization
      -    thread_local_var = pcre_jit_stack_alloc(...)
      -
      -  During thread exit
      -    pcre_jit_stack_free(thread_local_var)
      -
      -  Use a one-line callback function
      -    return thread_local_var
      -
      -All the functions described in this section do nothing if JIT is not available, -and pcre_assign_jit_stack() does nothing unless the extra argument -is non-NULL and points to a pcre_extra block that is the result of a -successful study with PCRE_STUDY_JIT_COMPILE etc. -

      -
      JIT STACK FAQ
      -

      -(1) Why do we need JIT stacks? -
      -
      -PCRE (and JIT) is a recursive, depth-first engine, so it needs a stack where -the local data of the current node is pushed before checking its child nodes. -Allocating real machine stack on some platforms is difficult. For example, the -stack chain needs to be updated every time if we extend the stack on PowerPC. -Although it is possible, its updating time overhead decreases performance. So -we do the recursion in memory. -

      -

      -(2) Why don't we simply allocate blocks of memory with malloc()? -
      -
      -Modern operating systems have a nice feature: they can reserve an address space -instead of allocating memory. We can safely allocate memory pages inside this -address space, so the stack could grow without moving memory data (this is -important because of pointers). Thus we can allocate 1M address space, and use -only a single memory page (usually 4K) if that is enough. However, we can still -grow up to 1M anytime if needed. -

      -

      -(3) Who "owns" a JIT stack? -
      -
      -The owner of the stack is the user program, not the JIT studied pattern or -anything else. The user program must ensure that if a stack is used by -pcre_exec(), (that is, it is assigned to the pattern currently running), -that stack must not be used by any other threads (to avoid overwriting the same -memory area). The best practice for multithreaded programs is to allocate a -stack for each thread, and return this stack through the JIT callback function. -

      -

      -(4) When should a JIT stack be freed? -
      -
      -You can free a JIT stack at any time, as long as it will not be used by -pcre_exec() again. When you assign the stack to a pattern, only a pointer -is set. There is no reference counting or any other magic. You can free the -patterns and stacks in any order, anytime. Just do not call -pcre_exec() with a pattern pointing to an already freed stack, as that -will cause SEGFAULT. (Also, do not free a stack currently used by -pcre_exec() in another thread). You can also replace the stack for a -pattern at any time. You can even free the previous stack before assigning a -replacement. -

      -

      -(5) Should I allocate/free a stack every time before/after calling -pcre_exec()? -
      -
      -No, because this is too costly in terms of resources. However, you could -implement some clever idea which release the stack if it is not used in let's -say two minutes. The JIT callback can help to achieve this without keeping a -list of the currently JIT studied patterns. -

      -

      -(6) OK, the stack is for long term memory allocation. But what happens if a -pattern causes stack overflow with a stack of 1M? Is that 1M kept until the -stack is freed? -
      -
      -Especially on embedded sytems, it might be a good idea to release memory -sometimes without freeing the stack. There is no API for this at the moment. -Probably a function call which returns with the currently allocated memory for -any stack and another which allows releasing memory (shrinking the stack) would -be a good idea if someone needs this. -

      -

      -(7) This is too much of a headache. Isn't there any better solution for JIT -stack handling? -
      -
      -No, thanks to Windows. If POSIX threads were used everywhere, we could throw -out this complicated API. -

      -
      EXAMPLE CODE
      -

      -This is a single-threaded example that specifies a JIT stack without using a -callback. -

      -  int rc;
      -  int ovector[30];
      -  pcre *re;
      -  pcre_extra *extra;
      -  pcre_jit_stack *jit_stack;
      -
      -  re = pcre_compile(pattern, 0, &error, &erroffset, NULL);
      -  /* Check for errors */
      -  extra = pcre_study(re, PCRE_STUDY_JIT_COMPILE, &error);
      -  jit_stack = pcre_jit_stack_alloc(32*1024, 512*1024);
      -  /* Check for error (NULL) */
      -  pcre_assign_jit_stack(extra, NULL, jit_stack);
      -  rc = pcre_exec(re, extra, subject, length, 0, 0, ovector, 30);
      -  /* Check results */
      -  pcre_free(re);
      -  pcre_free_study(extra);
      -  pcre_jit_stack_free(jit_stack);
      -
      -
      -

      -
      JIT FAST PATH API
      -

      -Because the API described above falls back to interpreted execution when JIT is -not available, it is convenient for programs that are written for general use -in many environments. However, calling JIT via pcre_exec() does have a -performance impact. Programs that are written for use where JIT is known to be -available, and which need the best possible performance, can instead use a -"fast path" API to call JIT execution directly instead of calling -pcre_exec() (obviously only for patterns that have been successfully -studied by JIT). -

      -

      -The fast path function is called pcre_jit_exec(), and it takes exactly -the same arguments as pcre_exec(), plus one additional argument that -must point to a JIT stack. The JIT stack arrangements described above do not -apply. The return values are the same as for pcre_exec(). -

      -

      -When you call pcre_exec(), as well as testing for invalid options, a -number of other sanity checks are performed on the arguments. For example, if -the subject pointer is NULL, or its length is negative, an immediate error is -given. Also, unless PCRE_NO_UTF[8|16|32] is set, a UTF subject string is tested -for validity. In the interests of speed, these checks do not happen on the JIT -fast path, and if invalid data is passed, the result is undefined. -

      -

      -Bypassing the sanity checks and the pcre_exec() wrapping can give -speedups of more than 10%. -

      -

      -Note that the pcre_jit_exec() function is not available in versions of -PCRE before 8.32 (released in November 2012). If you need to support versions -that old you must either use the slower pcre_exec(), or switch between -the two codepaths by checking the values of PCRE_MAJOR and PCRE_MINOR. -

      -

      -Due to an unfortunate implementation oversight, even in versions 8.32 -and later there will be no pcre_jit_exec() stub function defined -when PCRE is compiled with --disable-jit, which is the default, and -there's no way to detect whether PCRE was compiled with --enable-jit -via a macro. -

      -

      -If you need to support versions older than 8.32, or versions that may -not build with --enable-jit, you must either use the slower -pcre_exec(), or switch between the two codepaths by checking the -values of PCRE_MAJOR and PCRE_MINOR. -

      -

      -Switching between the two by checking the version assumes that all the -versions being targeted are built with --enable-jit. To also support -builds that may use --disable-jit either pcre_exec() must be -used, or a compile-time check for JIT via pcre_config() (which -assumes the runtime environment will be the same), or as the Git -project decided to do, simply assume that pcre_jit_exec() is -present in 8.32 or later unless a compile-time flag is provided, see -the "grep: un-break building with PCRE >= 8.32 without --enable-jit" -commit in git.git for an example of that. -

      -
      SEE ALSO
      -

      -pcreapi(3) -

      -
      AUTHOR
      -

      -Philip Hazel (FAQ by Zoltan Herczeg) -
      -University Computing Service -
      -Cambridge CB2 3QH, England. -
      -

      -
      REVISION
      -

      -Last updated: 05 July 2017 -
      -Copyright © 1997-2017 University of Cambridge. -
      -

      -Return to the PCRE index page. -

      diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcrelimits.html b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcrelimits.html deleted file mode 100644 index ee5ebf03..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcrelimits.html +++ /dev/null @@ -1,90 +0,0 @@ - - -pcrelimits specification - - -

      pcrelimits man page

      -

      -Return to the PCRE index page. -

      -

      -This page is part of the PCRE HTML documentation. It was generated automatically -from the original man page. If there is any nonsense in it, please consult the -man page, in case the conversion went wrong. -
      -
      -SIZE AND OTHER LIMITATIONS -
      -

      -There are some size limitations in PCRE but it is hoped that they will never in -practice be relevant. -

      -

      -The maximum length of a compiled pattern is approximately 64K data units (bytes -for the 8-bit library, 16-bit units for the 16-bit library, and 32-bit units for -the 32-bit library) if PCRE is compiled with the default internal linkage size, -which is 2 bytes for the 8-bit and 16-bit libraries, and 4 bytes for the 32-bit -library. If you want to process regular expressions that are truly enormous, -you can compile PCRE with an internal linkage size of 3 or 4 (when building the -16-bit or 32-bit library, 3 is rounded up to 4). See the README file in -the source distribution and the -pcrebuild -documentation for details. In these cases the limit is substantially larger. -However, the speed of execution is slower. -

      -

      -All values in repeating quantifiers must be less than 65536. -

      -

      -There is no limit to the number of parenthesized subpatterns, but there can be -no more than 65535 capturing subpatterns. There is, however, a limit to the -depth of nesting of parenthesized subpatterns of all kinds. This is imposed in -order to limit the amount of system stack used at compile time. The limit can -be specified when PCRE is built; the default is 250. -

      -

      -There is a limit to the number of forward references to subsequent subpatterns -of around 200,000. Repeated forward references with fixed upper limits, for -example, (?2){0,100} when subpattern number 2 is to the right, are included in -the count. There is no limit to the number of backward references. -

      -

      -The maximum length of name for a named subpattern is 32 characters, and the -maximum number of named subpatterns is 10000. -

      -

      -The maximum length of a name in a (*MARK), (*PRUNE), (*SKIP), or (*THEN) verb -is 255 for the 8-bit library and 65535 for the 16-bit and 32-bit libraries. -

      -

      -The maximum length of a subject string is the largest positive number that an -integer variable can hold. However, when using the traditional matching -function, PCRE uses recursion to handle subpatterns and indefinite repetition. -This means that the available stack space may limit the size of a subject -string that can be processed by certain patterns. For a discussion of stack -issues, see the -pcrestack -documentation. -

      -
      -AUTHOR -
      -

      -Philip Hazel -
      -University Computing Service -
      -Cambridge CB2 3QH, England. -
      -

      -
      -REVISION -
      -

      -Last updated: 05 November 2013 -
      -Copyright © 1997-2013 University of Cambridge. -
      -

      -Return to the PCRE index page. -

      diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcrematching.html b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcrematching.html deleted file mode 100644 index a1af39b6..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcrematching.html +++ /dev/null @@ -1,242 +0,0 @@ - - -pcrematching specification - - -

      pcrematching man page

      -

      -Return to the PCRE index page. -

      -

      -This page is part of the PCRE HTML documentation. It was generated automatically -from the original man page. If there is any nonsense in it, please consult the -man page, in case the conversion went wrong. -
      -

      -
      PCRE MATCHING ALGORITHMS
      -

      -This document describes the two different algorithms that are available in PCRE -for matching a compiled regular expression against a given subject string. The -"standard" algorithm is the one provided by the pcre_exec(), -pcre16_exec() and pcre32_exec() functions. These work in the same -as as Perl's matching function, and provide a Perl-compatible matching operation. -The just-in-time (JIT) optimization that is described in the -pcrejit -documentation is compatible with these functions. -

      -

      -An alternative algorithm is provided by the pcre_dfa_exec(), -pcre16_dfa_exec() and pcre32_dfa_exec() functions; they operate in -a different way, and are not Perl-compatible. This alternative has advantages -and disadvantages compared with the standard algorithm, and these are described -below. -

      -

      -When there is only one possible way in which a given subject string can match a -pattern, the two algorithms give the same answer. A difference arises, however, -when there are multiple possibilities. For example, if the pattern -

      -  ^<.*>
      -
      -is matched against the string -
      -  <something> <something else> <something further>
      -
      -there are three possible answers. The standard algorithm finds only one of -them, whereas the alternative algorithm finds all three. -

      -
      REGULAR EXPRESSIONS AS TREES
      -

      -The set of strings that are matched by a regular expression can be represented -as a tree structure. An unlimited repetition in the pattern makes the tree of -infinite size, but it is still a tree. Matching the pattern to a given subject -string (from a given starting point) can be thought of as a search of the tree. -There are two ways to search a tree: depth-first and breadth-first, and these -correspond to the two matching algorithms provided by PCRE. -

      -
      THE STANDARD MATCHING ALGORITHM
      -

      -In the terminology of Jeffrey Friedl's book "Mastering Regular -Expressions", the standard algorithm is an "NFA algorithm". It conducts a -depth-first search of the pattern tree. That is, it proceeds along a single -path through the tree, checking that the subject matches what is required. When -there is a mismatch, the algorithm tries any alternatives at the current point, -and if they all fail, it backs up to the previous branch point in the tree, and -tries the next alternative branch at that level. This often involves backing up -(moving to the left) in the subject string as well. The order in which -repetition branches are tried is controlled by the greedy or ungreedy nature of -the quantifier. -

      -

      -If a leaf node is reached, a matching string has been found, and at that point -the algorithm stops. Thus, if there is more than one possible match, this -algorithm returns the first one that it finds. Whether this is the shortest, -the longest, or some intermediate length depends on the way the greedy and -ungreedy repetition quantifiers are specified in the pattern. -

      -

      -Because it ends up with a single path through the tree, it is relatively -straightforward for this algorithm to keep track of the substrings that are -matched by portions of the pattern in parentheses. This provides support for -capturing parentheses and back references. -

      -
      THE ALTERNATIVE MATCHING ALGORITHM
      -

      -This algorithm conducts a breadth-first search of the tree. Starting from the -first matching point in the subject, it scans the subject string from left to -right, once, character by character, and as it does this, it remembers all the -paths through the tree that represent valid matches. In Friedl's terminology, -this is a kind of "DFA algorithm", though it is not implemented as a -traditional finite state machine (it keeps multiple states active -simultaneously). -

      -

      -Although the general principle of this matching algorithm is that it scans the -subject string only once, without backtracking, there is one exception: when a -lookaround assertion is encountered, the characters following or preceding the -current point have to be independently inspected. -

      -

      -The scan continues until either the end of the subject is reached, or there are -no more unterminated paths. At this point, terminated paths represent the -different matching possibilities (if there are none, the match has failed). -Thus, if there is more than one possible match, this algorithm finds all of -them, and in particular, it finds the longest. The matches are returned in -decreasing order of length. There is an option to stop the algorithm after the -first match (which is necessarily the shortest) is found. -

      -

      -Note that all the matches that are found start at the same point in the -subject. If the pattern -

      -  cat(er(pillar)?)?
      -
      -is matched against the string "the caterpillar catchment", the result will be -the three strings "caterpillar", "cater", and "cat" that start at the fifth -character of the subject. The algorithm does not automatically move on to find -matches that start at later positions. -

      -

      -PCRE's "auto-possessification" optimization usually applies to character -repeats at the end of a pattern (as well as internally). For example, the -pattern "a\d+" is compiled as if it were "a\d++" because there is no point -even considering the possibility of backtracking into the repeated digits. For -DFA matching, this means that only one possible match is found. If you really -do want multiple matches in such cases, either use an ungreedy repeat -("a\d+?") or set the PCRE_NO_AUTO_POSSESS option when compiling. -

      -

      -There are a number of features of PCRE regular expressions that are not -supported by the alternative matching algorithm. They are as follows: -

      -

      -1. Because the algorithm finds all possible matches, the greedy or ungreedy -nature of repetition quantifiers is not relevant. Greedy and ungreedy -quantifiers are treated in exactly the same way. However, possessive -quantifiers can make a difference when what follows could also match what is -quantified, for example in a pattern like this: -

      -  ^a++\w!
      -
      -This pattern matches "aaab!" but not "aaa!", which would be matched by a -non-possessive quantifier. Similarly, if an atomic group is present, it is -matched as if it were a standalone pattern at the current point, and the -longest match is then "locked in" for the rest of the overall pattern. -

      -

      -2. When dealing with multiple paths through the tree simultaneously, it is not -straightforward to keep track of captured substrings for the different matching -possibilities, and PCRE's implementation of this algorithm does not attempt to -do this. This means that no captured substrings are available. -

      -

      -3. Because no substrings are captured, back references within the pattern are -not supported, and cause errors if encountered. -

      -

      -4. For the same reason, conditional expressions that use a backreference as the -condition or test for a specific group recursion are not supported. -

      -

      -5. Because many paths through the tree may be active, the \K escape sequence, -which resets the start of the match when encountered (but may be on some paths -and not on others), is not supported. It causes an error if encountered. -

      -

      -6. Callouts are supported, but the value of the capture_top field is -always 1, and the value of the capture_last field is always -1. -

      -

      -7. The \C escape sequence, which (in the standard algorithm) always matches a -single data unit, even in UTF-8, UTF-16 or UTF-32 modes, is not supported in -these modes, because the alternative algorithm moves through the subject string -one character (not data unit) at a time, for all active paths through the tree. -

      -

      -8. Except for (*FAIL), the backtracking control verbs such as (*PRUNE) are not -supported. (*FAIL) is supported, and behaves like a failing negative assertion. -

      -
      ADVANTAGES OF THE ALTERNATIVE ALGORITHM
      -

      -Using the alternative matching algorithm provides the following advantages: -

      -

      -1. All possible matches (at a single point in the subject) are automatically -found, and in particular, the longest match is found. To find more than one -match using the standard algorithm, you have to do kludgy things with -callouts. -

      -

      -2. Because the alternative algorithm scans the subject string just once, and -never needs to backtrack (except for lookbehinds), it is possible to pass very -long subject strings to the matching function in several pieces, checking for -partial matching each time. Although it is possible to do multi-segment -matching using the standard algorithm by retaining partially matched -substrings, it is more complicated. The -pcrepartial -documentation gives details of partial matching and discusses multi-segment -matching. -

      -
      DISADVANTAGES OF THE ALTERNATIVE ALGORITHM
      -

      -The alternative algorithm suffers from a number of disadvantages: -

      -

      -1. It is substantially slower than the standard algorithm. This is partly -because it has to search for all possible matches, but is also because it is -less susceptible to optimization. -

      -

      -2. Capturing parentheses and back references are not supported. -

      -

      -3. Although atomic groups are supported, their use does not provide the -performance advantage that it does for the standard algorithm. -

      -
      AUTHOR
      -

      -Philip Hazel -
      -University Computing Service -
      -Cambridge CB2 3QH, England. -
      -

      -
      REVISION
      -

      -Last updated: 12 November 2013 -
      -Copyright © 1997-2012 University of Cambridge. -
      -

      -Return to the PCRE index page. -

      diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcrepartial.html b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcrepartial.html deleted file mode 100644 index 4faeafcb..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcrepartial.html +++ /dev/null @@ -1,509 +0,0 @@ - - -pcrepartial specification - - -

      pcrepartial man page

      -

      -Return to the PCRE index page. -

      -

      -This page is part of the PCRE HTML documentation. It was generated automatically -from the original man page. If there is any nonsense in it, please consult the -man page, in case the conversion went wrong. -
      -

      -
      PARTIAL MATCHING IN PCRE
      -

      -In normal use of PCRE, if the subject string that is passed to a matching -function matches as far as it goes, but is too short to match the entire -pattern, PCRE_ERROR_NOMATCH is returned. There are circumstances where it might -be helpful to distinguish this case from other cases in which there is no -match. -

      -

      -Consider, for example, an application where a human is required to type in data -for a field with specific formatting requirements. An example might be a date -in the form ddmmmyy, defined by this pattern: -

      -  ^\d?\d(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)\d\d$
      -
      -If the application sees the user's keystrokes one by one, and can check that -what has been typed so far is potentially valid, it is able to raise an error -as soon as a mistake is made, by beeping and not reflecting the character that -has been typed, for example. This immediate feedback is likely to be a better -user interface than a check that is delayed until the entire string has been -entered. Partial matching can also be useful when the subject string is very -long and is not all available at once. -

      -

      -PCRE supports partial matching by means of the PCRE_PARTIAL_SOFT and -PCRE_PARTIAL_HARD options, which can be set when calling any of the matching -functions. For backwards compatibility, PCRE_PARTIAL is a synonym for -PCRE_PARTIAL_SOFT. The essential difference between the two options is whether -or not a partial match is preferred to an alternative complete match, though -the details differ between the two types of matching function. If both options -are set, PCRE_PARTIAL_HARD takes precedence. -

      -

      -If you want to use partial matching with just-in-time optimized code, you must -call pcre_study(), pcre16_study() or pcre32_study() with one -or both of these options: -

      -  PCRE_STUDY_JIT_PARTIAL_SOFT_COMPILE
      -  PCRE_STUDY_JIT_PARTIAL_HARD_COMPILE
      -
      -PCRE_STUDY_JIT_COMPILE should also be set if you are going to run non-partial -matches on the same pattern. If the appropriate JIT study mode has not been set -for a match, the interpretive matching code is used. -

      -

      -Setting a partial matching option disables two of PCRE's standard -optimizations. PCRE remembers the last literal data unit in a pattern, and -abandons matching immediately if it is not present in the subject string. This -optimization cannot be used for a subject string that might match only -partially. If the pattern was studied, PCRE knows the minimum length of a -matching string, and does not bother to run the matching function on shorter -strings. This optimization is also disabled for partial matching. -

      -
      PARTIAL MATCHING USING pcre_exec() OR pcre[16|32]_exec()
      -

      -A partial match occurs during a call to pcre_exec() or -pcre[16|32]_exec() when the end of the subject string is reached -successfully, but matching cannot continue because more characters are needed. -However, at least one character in the subject must have been inspected. This -character need not form part of the final matched string; lookbehind assertions -and the \K escape sequence provide ways of inspecting characters before the -start of a matched substring. The requirement for inspecting at least one -character exists because an empty string can always be matched; without such a -restriction there would always be a partial match of an empty string at the end -of the subject. -

      -

      -If there are at least two slots in the offsets vector when a partial match is -returned, the first slot is set to the offset of the earliest character that -was inspected. For convenience, the second offset points to the end of the -subject so that a substring can easily be identified. If there are at least -three slots in the offsets vector, the third slot is set to the offset of the -character where matching started. -

      -

      -For the majority of patterns, the contents of the first and third slots will be -the same. However, for patterns that contain lookbehind assertions, or begin -with \b or \B, characters before the one where matching started may have been -inspected while carrying out the match. For example, consider this pattern: -

      -  /(?<=abc)123/
      -
      -This pattern matches "123", but only if it is preceded by "abc". If the subject -string is "xyzabc12", the first two offsets after a partial match are for the -substring "abc12", because all these characters were inspected. However, the -third offset is set to 6, because that is the offset where matching began. -

      -

      -What happens when a partial match is identified depends on which of the two -partial matching options are set. -

      -
      -PCRE_PARTIAL_SOFT WITH pcre_exec() OR pcre[16|32]_exec() -
      -

      -If PCRE_PARTIAL_SOFT is set when pcre_exec() or pcre[16|32]_exec() -identifies a partial match, the partial match is remembered, but matching -continues as normal, and other alternatives in the pattern are tried. If no -complete match can be found, PCRE_ERROR_PARTIAL is returned instead of -PCRE_ERROR_NOMATCH. -

      -

      -This option is "soft" because it prefers a complete match over a partial match. -All the various matching items in a pattern behave as if the subject string is -potentially complete. For example, \z, \Z, and $ match at the end of the -subject, as normal, and for \b and \B the end of the subject is treated as a -non-alphanumeric. -

      -

      -If there is more than one partial match, the first one that was found provides -the data that is returned. Consider this pattern: -

      -  /123\w+X|dogY/
      -
      -If this is matched against the subject string "abc123dog", both -alternatives fail to match, but the end of the subject is reached during -matching, so PCRE_ERROR_PARTIAL is returned. The offsets are set to 3 and 9, -identifying "123dog" as the first partial match that was found. (In this -example, there are two partial matches, because "dog" on its own partially -matches the second alternative.) -

      -
      -PCRE_PARTIAL_HARD WITH pcre_exec() OR pcre[16|32]_exec() -
      -

      -If PCRE_PARTIAL_HARD is set for pcre_exec() or pcre[16|32]_exec(), -PCRE_ERROR_PARTIAL is returned as soon as a partial match is found, without -continuing to search for possible complete matches. This option is "hard" -because it prefers an earlier partial match over a later complete match. For -this reason, the assumption is made that the end of the supplied subject string -may not be the true end of the available data, and so, if \z, \Z, \b, \B, -or $ are encountered at the end of the subject, the result is -PCRE_ERROR_PARTIAL, provided that at least one character in the subject has -been inspected. -

      -

      -Setting PCRE_PARTIAL_HARD also affects the way UTF-8 and UTF-16 -subject strings are checked for validity. Normally, an invalid sequence -causes the error PCRE_ERROR_BADUTF8 or PCRE_ERROR_BADUTF16. However, in the -special case of a truncated character at the end of the subject, -PCRE_ERROR_SHORTUTF8 or PCRE_ERROR_SHORTUTF16 is returned when -PCRE_PARTIAL_HARD is set. -

      -
      -Comparing hard and soft partial matching -
      -

      -The difference between the two partial matching options can be illustrated by a -pattern such as: -

      -  /dog(sbody)?/
      -
      -This matches either "dog" or "dogsbody", greedily (that is, it prefers the -longer string if possible). If it is matched against the string "dog" with -PCRE_PARTIAL_SOFT, it yields a complete match for "dog". However, if -PCRE_PARTIAL_HARD is set, the result is PCRE_ERROR_PARTIAL. On the other hand, -if the pattern is made ungreedy the result is different: -
      -  /dog(sbody)??/
      -
      -In this case the result is always a complete match because that is found first, -and matching never continues after finding a complete match. It might be easier -to follow this explanation by thinking of the two patterns like this: -
      -  /dog(sbody)?/    is the same as  /dogsbody|dog/
      -  /dog(sbody)??/   is the same as  /dog|dogsbody/
      -
      -The second pattern will never match "dogsbody", because it will always find the -shorter match first. -

      -
      PARTIAL MATCHING USING pcre_dfa_exec() OR pcre[16|32]_dfa_exec()
      -

      -The DFA functions move along the subject string character by character, without -backtracking, searching for all possible matches simultaneously. If the end of -the subject is reached before the end of the pattern, there is the possibility -of a partial match, again provided that at least one character has been -inspected. -

      -

      -When PCRE_PARTIAL_SOFT is set, PCRE_ERROR_PARTIAL is returned only if there -have been no complete matches. Otherwise, the complete matches are returned. -However, if PCRE_PARTIAL_HARD is set, a partial match takes precedence over any -complete matches. The portion of the string that was inspected when the longest -partial match was found is set as the first matching string, provided there are -at least two slots in the offsets vector. -

      -

      -Because the DFA functions always search for all possible matches, and there is -no difference between greedy and ungreedy repetition, their behaviour is -different from the standard functions when PCRE_PARTIAL_HARD is set. Consider -the string "dog" matched against the ungreedy pattern shown above: -

      -  /dog(sbody)??/
      -
      -Whereas the standard functions stop as soon as they find the complete match for -"dog", the DFA functions also find the partial match for "dogsbody", and so -return that when PCRE_PARTIAL_HARD is set. -

      -
      PARTIAL MATCHING AND WORD BOUNDARIES
      -

      -If a pattern ends with one of sequences \b or \B, which test for word -boundaries, partial matching with PCRE_PARTIAL_SOFT can give counter-intuitive -results. Consider this pattern: -

      -  /\bcat\b/
      -
      -This matches "cat", provided there is a word boundary at either end. If the -subject string is "the cat", the comparison of the final "t" with a following -character cannot take place, so a partial match is found. However, normal -matching carries on, and \b matches at the end of the subject when the last -character is a letter, so a complete match is found. The result, therefore, is -not PCRE_ERROR_PARTIAL. Using PCRE_PARTIAL_HARD in this case does yield -PCRE_ERROR_PARTIAL, because then the partial match takes precedence. -

      -
      FORMERLY RESTRICTED PATTERNS
      -

      -For releases of PCRE prior to 8.00, because of the way certain internal -optimizations were implemented in the pcre_exec() function, the -PCRE_PARTIAL option (predecessor of PCRE_PARTIAL_SOFT) could not be used with -all patterns. From release 8.00 onwards, the restrictions no longer apply, and -partial matching with can be requested for any pattern. -

      -

      -Items that were formerly restricted were repeated single characters and -repeated metasequences. If PCRE_PARTIAL was set for a pattern that did not -conform to the restrictions, pcre_exec() returned the error code -PCRE_ERROR_BADPARTIAL (-13). This error code is no longer in use. The -PCRE_INFO_OKPARTIAL call to pcre_fullinfo() to find out if a compiled -pattern can be used for partial matching now always returns 1. -

      -
      EXAMPLE OF PARTIAL MATCHING USING PCRETEST
      -

      -If the escape sequence \P is present in a pcretest data line, the -PCRE_PARTIAL_SOFT option is used for the match. Here is a run of pcretest -that uses the date example quoted above: -

      -    re> /^\d?\d(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)\d\d$/
      -  data> 25jun04\P
      -   0: 25jun04
      -   1: jun
      -  data> 25dec3\P
      -  Partial match: 23dec3
      -  data> 3ju\P
      -  Partial match: 3ju
      -  data> 3juj\P
      -  No match
      -  data> j\P
      -  No match
      -
      -The first data string is matched completely, so pcretest shows the -matched substrings. The remaining four strings do not match the complete -pattern, but the first two are partial matches. Similar output is obtained -if DFA matching is used. -

      -

      -If the escape sequence \P is present more than once in a pcretest data -line, the PCRE_PARTIAL_HARD option is set for the match. -

      -
      MULTI-SEGMENT MATCHING WITH pcre_dfa_exec() OR pcre[16|32]_dfa_exec()
      -

      -When a partial match has been found using a DFA matching function, it is -possible to continue the match by providing additional subject data and calling -the function again with the same compiled regular expression, this time setting -the PCRE_DFA_RESTART option. You must pass the same working space as before, -because this is where details of the previous partial match are stored. Here is -an example using pcretest, using the \R escape sequence to set the -PCRE_DFA_RESTART option (\D specifies the use of the DFA matching function): -

      -    re> /^\d?\d(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)\d\d$/
      -  data> 23ja\P\D
      -  Partial match: 23ja
      -  data> n05\R\D
      -   0: n05
      -
      -The first call has "23ja" as the subject, and requests partial matching; the -second call has "n05" as the subject for the continued (restarted) match. -Notice that when the match is complete, only the last part is shown; PCRE does -not retain the previously partially-matched string. It is up to the calling -program to do that if it needs to. -

      -

      -That means that, for an unanchored pattern, if a continued match fails, it is -not possible to try again at a new starting point. All this facility is capable -of doing is continuing with the previous match attempt. In the previous -example, if the second set of data is "ug23" the result is no match, even -though there would be a match for "aug23" if the entire string were given at -once. Depending on the application, this may or may not be what you want. -The only way to allow for starting again at the next character is to retain the -matched part of the subject and try a new complete match. -

      -

      -You can set the PCRE_PARTIAL_SOFT or PCRE_PARTIAL_HARD options with -PCRE_DFA_RESTART to continue partial matching over multiple segments. This -facility can be used to pass very long subject strings to the DFA matching -functions. -

      -
      MULTI-SEGMENT MATCHING WITH pcre_exec() OR pcre[16|32]_exec()
      -

      -From release 8.00, the standard matching functions can also be used to do -multi-segment matching. Unlike the DFA functions, it is not possible to -restart the previous match with a new segment of data. Instead, new data must -be added to the previous subject string, and the entire match re-run, starting -from the point where the partial match occurred. Earlier data can be discarded. -

      -

      -It is best to use PCRE_PARTIAL_HARD in this situation, because it does not -treat the end of a segment as the end of the subject when matching \z, \Z, -\b, \B, and $. Consider an unanchored pattern that matches dates: -

      -    re> /\d?\d(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)\d\d/
      -  data> The date is 23ja\P\P
      -  Partial match: 23ja
      -
      -At this stage, an application could discard the text preceding "23ja", add on -text from the next segment, and call the matching function again. Unlike the -DFA matching functions, the entire matching string must always be available, -and the complete matching process occurs for each call, so more memory and more -processing time is needed. -

      -

      -Note: If the pattern contains lookbehind assertions, or \K, or starts -with \b or \B, the string that is returned for a partial match includes -characters that precede the start of what would be returned for a complete -match, because it contains all the characters that were inspected during the -partial match. -

      -
      ISSUES WITH MULTI-SEGMENT MATCHING
      -

      -Certain types of pattern may give problems with multi-segment matching, -whichever matching function is used. -

      -

      -1. If the pattern contains a test for the beginning of a line, you need to pass -the PCRE_NOTBOL option when the subject string for any call does start at the -beginning of a line. There is also a PCRE_NOTEOL option, but in practice when -doing multi-segment matching you should be using PCRE_PARTIAL_HARD, which -includes the effect of PCRE_NOTEOL. -

      -

      -2. Lookbehind assertions that have already been obeyed are catered for in the -offsets that are returned for a partial match. However a lookbehind assertion -later in the pattern could require even earlier characters to be inspected. You -can handle this case by using the PCRE_INFO_MAXLOOKBEHIND option of the -pcre_fullinfo() or pcre[16|32]_fullinfo() functions to obtain the -length of the longest lookbehind in the pattern. This length is given in -characters, not bytes. If you always retain at least that many characters -before the partially matched string, all should be well. (Of course, near the -start of the subject, fewer characters may be present; in that case all -characters should be retained.) -

      -

      -From release 8.33, there is a more accurate way of deciding which characters to -retain. Instead of subtracting the length of the longest lookbehind from the -earliest inspected character (offsets[0]), the match start position -(offsets[2]) should be used, and the next match attempt started at the -offsets[2] character by setting the startoffset argument of -pcre_exec() or pcre_dfa_exec(). -

      -

      -For example, if the pattern "(?<=123)abc" is partially -matched against the string "xx123a", the three offset values returned are 2, 6, -and 5. This indicates that the matching process that gave a partial match -started at offset 5, but the characters "123a" were all inspected. The maximum -lookbehind for that pattern is 3, so taking that away from 5 shows that we need -only keep "123a", and the next match attempt can be started at offset 3 (that -is, at "a") when further characters have been added. When the match start is -not the earliest inspected character, pcretest shows it explicitly: -

      -    re> "(?<=123)abc"
      -  data> xx123a\P\P
      -  Partial match at offset 5: 123a
      -
      -

      -

      -3. Because a partial match must always contain at least one character, what -might be considered a partial match of an empty string actually gives a "no -match" result. For example: -

      -    re> /c(?<=abc)x/
      -  data> ab\P
      -  No match
      -
      -If the next segment begins "cx", a match should be found, but this will only -happen if characters from the previous segment are retained. For this reason, a -"no match" result should be interpreted as "partial match of an empty string" -when the pattern contains lookbehinds. -

      -

      -4. Matching a subject string that is split into multiple segments may not -always produce exactly the same result as matching over one single long string, -especially when PCRE_PARTIAL_SOFT is used. The section "Partial Matching and -Word Boundaries" above describes an issue that arises if the pattern ends with -\b or \B. Another kind of difference may occur when there are multiple -matching possibilities, because (for PCRE_PARTIAL_SOFT) a partial match result -is given only when there are no completed matches. This means that as soon as -the shortest match has been found, continuation to a new subject segment is no -longer possible. Consider again this pcretest example: -

      -    re> /dog(sbody)?/
      -  data> dogsb\P
      -   0: dog
      -  data> do\P\D
      -  Partial match: do
      -  data> gsb\R\P\D
      -   0: g
      -  data> dogsbody\D
      -   0: dogsbody
      -   1: dog
      -
      -The first data line passes the string "dogsb" to a standard matching function, -setting the PCRE_PARTIAL_SOFT option. Although the string is a partial match -for "dogsbody", the result is not PCRE_ERROR_PARTIAL, because the shorter -string "dog" is a complete match. Similarly, when the subject is presented to -a DFA matching function in several parts ("do" and "gsb" being the first two) -the match stops when "dog" has been found, and it is not possible to continue. -On the other hand, if "dogsbody" is presented as a single string, a DFA -matching function finds both matches. -

      -

      -Because of these problems, it is best to use PCRE_PARTIAL_HARD when matching -multi-segment data. The example above then behaves differently: -

      -    re> /dog(sbody)?/
      -  data> dogsb\P\P
      -  Partial match: dogsb
      -  data> do\P\D
      -  Partial match: do
      -  data> gsb\R\P\P\D
      -  Partial match: gsb
      -
      -5. Patterns that contain alternatives at the top level which do not all start -with the same pattern item may not work as expected when PCRE_DFA_RESTART is -used. For example, consider this pattern: -
      -  1234|3789
      -
      -If the first part of the subject is "ABC123", a partial match of the first -alternative is found at offset 3. There is no partial match for the second -alternative, because such a match does not start at the same point in the -subject string. Attempting to continue with the string "7890" does not yield a -match because only those alternatives that match at one point in the subject -are remembered. The problem arises because the start of the second alternative -matches within the first alternative. There is no problem with anchored -patterns or patterns such as: -
      -  1234|ABCD
      -
      -where no string can be a partial match for both alternatives. This is not a -problem if a standard matching function is used, because the entire match has -to be rerun each time: -
      -    re> /1234|3789/
      -  data> ABC123\P\P
      -  Partial match: 123
      -  data> 1237890
      -   0: 3789
      -
      -Of course, instead of using PCRE_DFA_RESTART, the same technique of re-running -the entire match can also be used with the DFA matching functions. Another -possibility is to work with two buffers. If a partial match at offset n -in the first buffer is followed by "no match" when PCRE_DFA_RESTART is used on -the second buffer, you can then try a new match starting at offset n+1 in -the first buffer. -

      -
      AUTHOR
      -

      -Philip Hazel -
      -University Computing Service -
      -Cambridge CB2 3QH, England. -
      -

      -
      REVISION
      -

      -Last updated: 02 July 2013 -
      -Copyright © 1997-2013 University of Cambridge. -
      -

      -Return to the PCRE index page. -

      diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcrepattern.html b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcrepattern.html deleted file mode 100644 index 96fc7298..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcrepattern.html +++ /dev/null @@ -1,3276 +0,0 @@ - - -pcrepattern specification - - -

      pcrepattern man page

      -

      -Return to the PCRE index page. -

      -

      -This page is part of the PCRE HTML documentation. It was generated automatically -from the original man page. If there is any nonsense in it, please consult the -man page, in case the conversion went wrong. -
      -

      -
      PCRE REGULAR EXPRESSION DETAILS
      -

      -The syntax and semantics of the regular expressions that are supported by PCRE -are described in detail below. There is a quick-reference syntax summary in the -pcresyntax -page. PCRE tries to match Perl syntax and semantics as closely as it can. PCRE -also supports some alternative regular expression syntax (which does not -conflict with the Perl syntax) in order to provide some compatibility with -regular expressions in Python, .NET, and Oniguruma. -

      -

      -Perl's regular expressions are described in its own documentation, and -regular expressions in general are covered in a number of books, some of which -have copious examples. Jeffrey Friedl's "Mastering Regular Expressions", -published by O'Reilly, covers regular expressions in great detail. This -description of PCRE's regular expressions is intended as reference material. -

      -

      -This document discusses the patterns that are supported by PCRE when one its -main matching functions, pcre_exec() (8-bit) or pcre[16|32]_exec() -(16- or 32-bit), is used. PCRE also has alternative matching functions, -pcre_dfa_exec() and pcre[16|32_dfa_exec(), which match using a -different algorithm that is not Perl-compatible. Some of the features discussed -below are not available when DFA matching is used. The advantages and -disadvantages of the alternative functions, and how they differ from the normal -functions, are discussed in the -pcrematching -page. -

      -
      SPECIAL START-OF-PATTERN ITEMS
      -

      -A number of options that can be passed to pcre_compile() can also be set -by special items at the start of a pattern. These are not Perl-compatible, but -are provided to make these options accessible to pattern writers who are not -able to change the program that processes the pattern. Any number of these -items may appear, but they must all be together right at the start of the -pattern string, and the letters must be in upper case. -

      -
      -UTF support -
      -

      -The original operation of PCRE was on strings of one-byte characters. However, -there is now also support for UTF-8 strings in the original library, an -extra library that supports 16-bit and UTF-16 character strings, and a -third library that supports 32-bit and UTF-32 character strings. To use these -features, PCRE must be built to include appropriate support. When using UTF -strings you must either call the compiling function with the PCRE_UTF8, -PCRE_UTF16, or PCRE_UTF32 option, or the pattern must start with one of -these special sequences: -

      -  (*UTF8)
      -  (*UTF16)
      -  (*UTF32)
      -  (*UTF)
      -
      -(*UTF) is a generic sequence that can be used with any of the libraries. -Starting a pattern with such a sequence is equivalent to setting the relevant -option. How setting a UTF mode affects pattern matching is mentioned in several -places below. There is also a summary of features in the -pcreunicode -page. -

      -

      -Some applications that allow their users to supply patterns may wish to -restrict them to non-UTF data for security reasons. If the PCRE_NEVER_UTF -option is set at compile time, (*UTF) etc. are not allowed, and their -appearance causes an error. -

      -
      -Unicode property support -
      -

      -Another special sequence that may appear at the start of a pattern is (*UCP). -This has the same effect as setting the PCRE_UCP option: it causes sequences -such as \d and \w to use Unicode properties to determine character types, -instead of recognizing only characters with codes less than 128 via a lookup -table. -

      -
      -Disabling auto-possessification -
      -

      -If a pattern starts with (*NO_AUTO_POSSESS), it has the same effect as setting -the PCRE_NO_AUTO_POSSESS option at compile time. This stops PCRE from making -quantifiers possessive when what follows cannot match the repeated item. For -example, by default a+b is treated as a++b. For more details, see the -pcreapi -documentation. -

      -
      -Disabling start-up optimizations -
      -

      -If a pattern starts with (*NO_START_OPT), it has the same effect as setting the -PCRE_NO_START_OPTIMIZE option either at compile or matching time. This disables -several optimizations for quickly reaching "no match" results. For more -details, see the -pcreapi -documentation. -

      -
      -Newline conventions -
      -

      -PCRE supports five different conventions for indicating line breaks in -strings: a single CR (carriage return) character, a single LF (linefeed) -character, the two-character sequence CRLF, any of the three preceding, or any -Unicode newline sequence. The -pcreapi -page has -further discussion -about newlines, and shows how to set the newline convention in the -options arguments for the compiling and matching functions. -

      -

      -It is also possible to specify a newline convention by starting a pattern -string with one of the following five sequences: -

      -  (*CR)        carriage return
      -  (*LF)        linefeed
      -  (*CRLF)      carriage return, followed by linefeed
      -  (*ANYCRLF)   any of the three above
      -  (*ANY)       all Unicode newline sequences
      -
      -These override the default and the options given to the compiling function. For -example, on a Unix system where LF is the default newline sequence, the pattern -
      -  (*CR)a.b
      -
      -changes the convention to CR. That pattern matches "a\nb" because LF is no -longer a newline. If more than one of these settings is present, the last one -is used. -

      -

      -The newline convention affects where the circumflex and dollar assertions are -true. It also affects the interpretation of the dot metacharacter when -PCRE_DOTALL is not set, and the behaviour of \N. However, it does not affect -what the \R escape sequence matches. By default, this is any Unicode newline -sequence, for Perl compatibility. However, this can be changed; see the -description of \R in the section entitled -"Newline sequences" -below. A change of \R setting can be combined with a change of newline -convention. -

      -
      -Setting match and recursion limits -
      -

      -The caller of pcre_exec() can set a limit on the number of times the -internal match() function is called and on the maximum depth of -recursive calls. These facilities are provided to catch runaway matches that -are provoked by patterns with huge matching trees (a typical example is a -pattern with nested unlimited repeats) and to avoid running out of system stack -by too much recursion. When one of these limits is reached, pcre_exec() -gives an error return. The limits can also be set by items at the start of the -pattern of the form -

      -  (*LIMIT_MATCH=d)
      -  (*LIMIT_RECURSION=d)
      -
      -where d is any number of decimal digits. However, the value of the setting must -be less than the value set (or defaulted) by the caller of pcre_exec() -for it to have any effect. In other words, the pattern writer can lower the -limits set by the programmer, but not raise them. If there is more than one -setting of one of these limits, the lower value is used. -

      -
      EBCDIC CHARACTER CODES
      -

      -PCRE can be compiled to run in an environment that uses EBCDIC as its character -code rather than ASCII or Unicode (typically a mainframe system). In the -sections below, character code values are ASCII or Unicode; in an EBCDIC -environment these characters may have different code values, and there are no -code points greater than 255. -

      -
      CHARACTERS AND METACHARACTERS
      -

      -A regular expression is a pattern that is matched against a subject string from -left to right. Most characters stand for themselves in a pattern, and match the -corresponding characters in the subject. As a trivial example, the pattern -

      -  The quick brown fox
      -
      -matches a portion of a subject string that is identical to itself. When -caseless matching is specified (the PCRE_CASELESS option), letters are matched -independently of case. In a UTF mode, PCRE always understands the concept of -case for characters whose values are less than 128, so caseless matching is -always possible. For characters with higher values, the concept of case is -supported if PCRE is compiled with Unicode property support, but not otherwise. -If you want to use caseless matching for characters 128 and above, you must -ensure that PCRE is compiled with Unicode property support as well as with -UTF support. -

      -

      -The power of regular expressions comes from the ability to include alternatives -and repetitions in the pattern. These are encoded in the pattern by the use of -metacharacters, which do not stand for themselves but instead are -interpreted in some special way. -

      -

      -There are two different sets of metacharacters: those that are recognized -anywhere in the pattern except within square brackets, and those that are -recognized within square brackets. Outside square brackets, the metacharacters -are as follows: -

      -  \      general escape character with several uses
      -  ^      assert start of string (or line, in multiline mode)
      -  $      assert end of string (or line, in multiline mode)
      -  .      match any character except newline (by default)
      -  [      start character class definition
      -  |      start of alternative branch
      -  (      start subpattern
      -  )      end subpattern
      -  ?      extends the meaning of (
      -         also 0 or 1 quantifier
      -         also quantifier minimizer
      -  *      0 or more quantifier
      -  +      1 or more quantifier
      -         also "possessive quantifier"
      -  {      start min/max quantifier
      -
      -Part of a pattern that is in square brackets is called a "character class". In -a character class the only metacharacters are: -
      -  \      general escape character
      -  ^      negate the class, but only if the first character
      -  -      indicates character range
      -  [      POSIX character class (only if followed by POSIX syntax)
      -  ]      terminates the character class
      -
      -The following sections describe the use of each of the metacharacters. -

      -
      BACKSLASH
      -

      -The backslash character has several uses. Firstly, if it is followed by a -character that is not a number or a letter, it takes away any special meaning -that character may have. This use of backslash as an escape character applies -both inside and outside character classes. -

      -

      -For example, if you want to match a * character, you write \* in the pattern. -This escaping action applies whether or not the following character would -otherwise be interpreted as a metacharacter, so it is always safe to precede a -non-alphanumeric with backslash to specify that it stands for itself. In -particular, if you want to match a backslash, you write \\. -

      -

      -In a UTF mode, only ASCII numbers and letters have any special meaning after a -backslash. All other characters (in particular, those whose codepoints are -greater than 127) are treated as literals. -

      -

      -If a pattern is compiled with the PCRE_EXTENDED option, most white space in the -pattern (other than in a character class), and characters between a # outside a -character class and the next newline, inclusive, are ignored. An escaping -backslash can be used to include a white space or # character as part of the -pattern. -

      -

      -If you want to remove the special meaning from a sequence of characters, you -can do so by putting them between \Q and \E. This is different from Perl in -that $ and @ are handled as literals in \Q...\E sequences in PCRE, whereas in -Perl, $ and @ cause variable interpolation. Note the following examples: -

      -  Pattern            PCRE matches   Perl matches
      -
      -  \Qabc$xyz\E        abc$xyz        abc followed by the contents of $xyz
      -  \Qabc\$xyz\E       abc\$xyz       abc\$xyz
      -  \Qabc\E\$\Qxyz\E   abc$xyz        abc$xyz
      -
      -The \Q...\E sequence is recognized both inside and outside character classes. -An isolated \E that is not preceded by \Q is ignored. If \Q is not followed -by \E later in the pattern, the literal interpretation continues to the end of -the pattern (that is, \E is assumed at the end). If the isolated \Q is inside -a character class, this causes an error, because the character class is not -terminated. -

      -
      -Non-printing characters -
      -

      -A second use of backslash provides a way of encoding non-printing characters -in patterns in a visible manner. There is no restriction on the appearance of -non-printing characters, apart from the binary zero that terminates a pattern, -but when a pattern is being prepared by text editing, it is often easier to use -one of the following escape sequences than the binary character it represents. -In an ASCII or Unicode environment, these escapes are as follows: -

      -  \a        alarm, that is, the BEL character (hex 07)
      -  \cx       "control-x", where x is any ASCII character
      -  \e        escape (hex 1B)
      -  \f        form feed (hex 0C)
      -  \n        linefeed (hex 0A)
      -  \r        carriage return (hex 0D)
      -  \t        tab (hex 09)
      -  \0dd      character with octal code 0dd
      -  \ddd      character with octal code ddd, or back reference
      -  \o{ddd..} character with octal code ddd..
      -  \xhh      character with hex code hh
      -  \x{hhh..} character with hex code hhh.. (non-JavaScript mode)
      -  \uhhhh    character with hex code hhhh (JavaScript mode only)
      -
      -The precise effect of \cx on ASCII characters is as follows: if x is a lower -case letter, it is converted to upper case. Then bit 6 of the character (hex -40) is inverted. Thus \cA to \cZ become hex 01 to hex 1A (A is 41, Z is 5A), -but \c{ becomes hex 3B ({ is 7B), and \c; becomes hex 7B (; is 3B). If the -data item (byte or 16-bit value) following \c has a value greater than 127, a -compile-time error occurs. This locks out non-ASCII characters in all modes. -

      -

      -When PCRE is compiled in EBCDIC mode, \a, \e, \f, \n, \r, and \t -generate the appropriate EBCDIC code values. The \c escape is processed -as specified for Perl in the perlebcdic document. The only characters -that are allowed after \c are A-Z, a-z, or one of @, [, \, ], ^, _, or ?. Any -other character provokes a compile-time error. The sequence \c@ encodes -character code 0; after \c the letters (in either case) encode characters 1-26 -(hex 01 to hex 1A); [, \, ], ^, and _ encode characters 27-31 (hex 1B to hex -1F), and \c? becomes either 255 (hex FF) or 95 (hex 5F). -

      -

      -Thus, apart from \c?, these escapes generate the same character code values as -they do in an ASCII environment, though the meanings of the values mostly -differ. For example, \cG always generates code value 7, which is BEL in ASCII -but DEL in EBCDIC. -

      -

      -The sequence \c? generates DEL (127, hex 7F) in an ASCII environment, but -because 127 is not a control character in EBCDIC, Perl makes it generate the -APC character. Unfortunately, there are several variants of EBCDIC. In most of -them the APC character has the value 255 (hex FF), but in the one Perl calls -POSIX-BC its value is 95 (hex 5F). If certain other characters have POSIX-BC -values, PCRE makes \c? generate 95; otherwise it generates 255. -

      -

      -After \0 up to two further octal digits are read. If there are fewer than two -digits, just those that are present are used. Thus the sequence \0\x\015 -specifies two binary zeros followed by a CR character (code value 13). Make -sure you supply two digits after the initial zero if the pattern character that -follows is itself an octal digit. -

      -

      -The escape \o must be followed by a sequence of octal digits, enclosed in -braces. An error occurs if this is not the case. This escape is a recent -addition to Perl; it provides way of specifying character code points as octal -numbers greater than 0777, and it also allows octal numbers and back references -to be unambiguously specified. -

      -

      -For greater clarity and unambiguity, it is best to avoid following \ by a -digit greater than zero. Instead, use \o{} or \x{} to specify character -numbers, and \g{} to specify back references. The following paragraphs -describe the old, ambiguous syntax. -

      -

      -The handling of a backslash followed by a digit other than 0 is complicated, -and Perl has changed in recent releases, causing PCRE also to change. Outside a -character class, PCRE reads the digit and any following digits as a decimal -number. If the number is less than 8, or if there have been at least that many -previous capturing left parentheses in the expression, the entire sequence is -taken as a back reference. A description of how this works is given -later, -following the discussion of -parenthesized subpatterns. -

      -

      -Inside a character class, or if the decimal number following \ is greater than -7 and there have not been that many capturing subpatterns, PCRE handles \8 and -\9 as the literal characters "8" and "9", and otherwise re-reads up to three -octal digits following the backslash, using them to generate a data character. -Any subsequent digits stand for themselves. For example: -

      -  \040   is another way of writing an ASCII space
      -  \40    is the same, provided there are fewer than 40 previous capturing subpatterns
      -  \7     is always a back reference
      -  \11    might be a back reference, or another way of writing a tab
      -  \011   is always a tab
      -  \0113  is a tab followed by the character "3"
      -  \113   might be a back reference, otherwise the character with octal code 113
      -  \377   might be a back reference, otherwise the value 255 (decimal)
      -  \81    is either a back reference, or the two characters "8" and "1"
      -
      -Note that octal values of 100 or greater that are specified using this syntax -must not be introduced by a leading zero, because no more than three octal -digits are ever read. -

      -

      -By default, after \x that is not followed by {, from zero to two hexadecimal -digits are read (letters can be in upper or lower case). Any number of -hexadecimal digits may appear between \x{ and }. If a character other than -a hexadecimal digit appears between \x{ and }, or if there is no terminating -}, an error occurs. -

      -

      -If the PCRE_JAVASCRIPT_COMPAT option is set, the interpretation of \x is -as just described only when it is followed by two hexadecimal digits. -Otherwise, it matches a literal "x" character. In JavaScript mode, support for -code points greater than 256 is provided by \u, which must be followed by -four hexadecimal digits; otherwise it matches a literal "u" character. -

      -

      -Characters whose value is less than 256 can be defined by either of the two -syntaxes for \x (or by \u in JavaScript mode). There is no difference in the -way they are handled. For example, \xdc is exactly the same as \x{dc} (or -\u00dc in JavaScript mode). -

      -
      -Constraints on character values -
      -

      -Characters that are specified using octal or hexadecimal numbers are -limited to certain values, as follows: -

      -  8-bit non-UTF mode    less than 0x100
      -  8-bit UTF-8 mode      less than 0x10ffff and a valid codepoint
      -  16-bit non-UTF mode   less than 0x10000
      -  16-bit UTF-16 mode    less than 0x10ffff and a valid codepoint
      -  32-bit non-UTF mode   less than 0x100000000
      -  32-bit UTF-32 mode    less than 0x10ffff and a valid codepoint
      -
      -Invalid Unicode codepoints are the range 0xd800 to 0xdfff (the so-called -"surrogate" codepoints), and 0xffef. -

      -
      -Escape sequences in character classes -
      -

      -All the sequences that define a single character value can be used both inside -and outside character classes. In addition, inside a character class, \b is -interpreted as the backspace character (hex 08). -

      -

      -\N is not allowed in a character class. \B, \R, and \X are not special -inside a character class. Like other unrecognized escape sequences, they are -treated as the literal characters "B", "R", and "X" by default, but cause an -error if the PCRE_EXTRA option is set. Outside a character class, these -sequences have different meanings. -

      -
      -Unsupported escape sequences -
      -

      -In Perl, the sequences \l, \L, \u, and \U are recognized by its string -handler and used to modify the case of following characters. By default, PCRE -does not support these escape sequences. However, if the PCRE_JAVASCRIPT_COMPAT -option is set, \U matches a "U" character, and \u can be used to define a -character by code point, as described in the previous section. -

      -
      -Absolute and relative back references -
      -

      -The sequence \g followed by an unsigned or a negative number, optionally -enclosed in braces, is an absolute or relative back reference. A named back -reference can be coded as \g{name}. Back references are discussed -later, -following the discussion of -parenthesized subpatterns. -

      -
      -Absolute and relative subroutine calls -
      -

      -For compatibility with Oniguruma, the non-Perl syntax \g followed by a name or -a number enclosed either in angle brackets or single quotes, is an alternative -syntax for referencing a subpattern as a "subroutine". Details are discussed -later. -Note that \g{...} (Perl syntax) and \g<...> (Oniguruma syntax) are not -synonymous. The former is a back reference; the latter is a -subroutine -call. -

      -
      -Generic character types -
      -

      -Another use of backslash is for specifying generic character types: -

      -  \d     any decimal digit
      -  \D     any character that is not a decimal digit
      -  \h     any horizontal white space character
      -  \H     any character that is not a horizontal white space character
      -  \s     any white space character
      -  \S     any character that is not a white space character
      -  \v     any vertical white space character
      -  \V     any character that is not a vertical white space character
      -  \w     any "word" character
      -  \W     any "non-word" character
      -
      -There is also the single sequence \N, which matches a non-newline character. -This is the same as -the "." metacharacter -when PCRE_DOTALL is not set. Perl also uses \N to match characters by name; -PCRE does not support this. -

      -

      -Each pair of lower and upper case escape sequences partitions the complete set -of characters into two disjoint sets. Any given character matches one, and only -one, of each pair. The sequences can appear both inside and outside character -classes. They each match one character of the appropriate type. If the current -matching point is at the end of the subject string, all of them fail, because -there is no character to match. -

      -

      -For compatibility with Perl, \s did not used to match the VT character (code -11), which made it different from the the POSIX "space" class. However, Perl -added VT at release 5.18, and PCRE followed suit at release 8.34. The default -\s characters are now HT (9), LF (10), VT (11), FF (12), CR (13), and space -(32), which are defined as white space in the "C" locale. This list may vary if -locale-specific matching is taking place. For example, in some locales the -"non-breaking space" character (\xA0) is recognized as white space, and in -others the VT character is not. -

      -

      -A "word" character is an underscore or any character that is a letter or digit. -By default, the definition of letters and digits is controlled by PCRE's -low-valued character tables, and may vary if locale-specific matching is taking -place (see -"Locale support" -in the -pcreapi -page). For example, in a French locale such as "fr_FR" in Unix-like systems, -or "french" in Windows, some character codes greater than 127 are used for -accented letters, and these are then matched by \w. The use of locales with -Unicode is discouraged. -

      -

      -By default, characters whose code points are greater than 127 never match \d, -\s, or \w, and always match \D, \S, and \W, although this may vary for -characters in the range 128-255 when locale-specific matching is happening. -These escape sequences retain their original meanings from before Unicode -support was available, mainly for efficiency reasons. If PCRE is compiled with -Unicode property support, and the PCRE_UCP option is set, the behaviour is -changed so that Unicode properties are used to determine character types, as -follows: -

      -  \d  any character that matches \p{Nd} (decimal digit)
      -  \s  any character that matches \p{Z} or \h or \v
      -  \w  any character that matches \p{L} or \p{N}, plus underscore
      -
      -The upper case escapes match the inverse sets of characters. Note that \d -matches only decimal digits, whereas \w matches any Unicode digit, as well as -any Unicode letter, and underscore. Note also that PCRE_UCP affects \b, and -\B because they are defined in terms of \w and \W. Matching these sequences -is noticeably slower when PCRE_UCP is set. -

      -

      -The sequences \h, \H, \v, and \V are features that were added to Perl at -release 5.10. In contrast to the other sequences, which match only ASCII -characters by default, these always match certain high-valued code points, -whether or not PCRE_UCP is set. The horizontal space characters are: -

      -  U+0009     Horizontal tab (HT)
      -  U+0020     Space
      -  U+00A0     Non-break space
      -  U+1680     Ogham space mark
      -  U+180E     Mongolian vowel separator
      -  U+2000     En quad
      -  U+2001     Em quad
      -  U+2002     En space
      -  U+2003     Em space
      -  U+2004     Three-per-em space
      -  U+2005     Four-per-em space
      -  U+2006     Six-per-em space
      -  U+2007     Figure space
      -  U+2008     Punctuation space
      -  U+2009     Thin space
      -  U+200A     Hair space
      -  U+202F     Narrow no-break space
      -  U+205F     Medium mathematical space
      -  U+3000     Ideographic space
      -
      -The vertical space characters are: -
      -  U+000A     Linefeed (LF)
      -  U+000B     Vertical tab (VT)
      -  U+000C     Form feed (FF)
      -  U+000D     Carriage return (CR)
      -  U+0085     Next line (NEL)
      -  U+2028     Line separator
      -  U+2029     Paragraph separator
      -
      -In 8-bit, non-UTF-8 mode, only the characters with codepoints less than 256 are -relevant. -

      -
      -Newline sequences -
      -

      -Outside a character class, by default, the escape sequence \R matches any -Unicode newline sequence. In 8-bit non-UTF-8 mode \R is equivalent to the -following: -

      -  (?>\r\n|\n|\x0b|\f|\r|\x85)
      -
      -This is an example of an "atomic group", details of which are given -below. -This particular group matches either the two-character sequence CR followed by -LF, or one of the single characters LF (linefeed, U+000A), VT (vertical tab, -U+000B), FF (form feed, U+000C), CR (carriage return, U+000D), or NEL (next -line, U+0085). The two-character sequence is treated as a single unit that -cannot be split. -

      -

      -In other modes, two additional characters whose codepoints are greater than 255 -are added: LS (line separator, U+2028) and PS (paragraph separator, U+2029). -Unicode character property support is not needed for these characters to be -recognized. -

      -

      -It is possible to restrict \R to match only CR, LF, or CRLF (instead of the -complete set of Unicode line endings) by setting the option PCRE_BSR_ANYCRLF -either at compile time or when the pattern is matched. (BSR is an abbrevation -for "backslash R".) This can be made the default when PCRE is built; if this is -the case, the other behaviour can be requested via the PCRE_BSR_UNICODE option. -It is also possible to specify these settings by starting a pattern string with -one of the following sequences: -

      -  (*BSR_ANYCRLF)   CR, LF, or CRLF only
      -  (*BSR_UNICODE)   any Unicode newline sequence
      -
      -These override the default and the options given to the compiling function, but -they can themselves be overridden by options given to a matching function. Note -that these special settings, which are not Perl-compatible, are recognized only -at the very start of a pattern, and that they must be in upper case. If more -than one of them is present, the last one is used. They can be combined with a -change of newline convention; for example, a pattern can start with: -
      -  (*ANY)(*BSR_ANYCRLF)
      -
      -They can also be combined with the (*UTF8), (*UTF16), (*UTF32), (*UTF) or -(*UCP) special sequences. Inside a character class, \R is treated as an -unrecognized escape sequence, and so matches the letter "R" by default, but -causes an error if PCRE_EXTRA is set. -

      -
      -Unicode character properties -
      -

      -When PCRE is built with Unicode character property support, three additional -escape sequences that match characters with specific properties are available. -When in 8-bit non-UTF-8 mode, these sequences are of course limited to testing -characters whose codepoints are less than 256, but they do work in this mode. -The extra escape sequences are: -

      -  \p{xx}   a character with the xx property
      -  \P{xx}   a character without the xx property
      -  \X       a Unicode extended grapheme cluster
      -
      -The property names represented by xx above are limited to the Unicode -script names, the general category properties, "Any", which matches any -character (including newline), and some special PCRE properties (described -in the -next section). -Other Perl properties such as "InMusicalSymbols" are not currently supported by -PCRE. Note that \P{Any} does not match any characters, so always causes a -match failure. -

      -

      -Sets of Unicode characters are defined as belonging to certain scripts. A -character from one of these sets can be matched using a script name. For -example: -

      -  \p{Greek}
      -  \P{Han}
      -
      -Those that are not part of an identified script are lumped together as -"Common". The current list of scripts is: -

      -

      -Arabic, -Armenian, -Avestan, -Balinese, -Bamum, -Bassa_Vah, -Batak, -Bengali, -Bopomofo, -Brahmi, -Braille, -Buginese, -Buhid, -Canadian_Aboriginal, -Carian, -Caucasian_Albanian, -Chakma, -Cham, -Cherokee, -Common, -Coptic, -Cuneiform, -Cypriot, -Cyrillic, -Deseret, -Devanagari, -Duployan, -Egyptian_Hieroglyphs, -Elbasan, -Ethiopic, -Georgian, -Glagolitic, -Gothic, -Grantha, -Greek, -Gujarati, -Gurmukhi, -Han, -Hangul, -Hanunoo, -Hebrew, -Hiragana, -Imperial_Aramaic, -Inherited, -Inscriptional_Pahlavi, -Inscriptional_Parthian, -Javanese, -Kaithi, -Kannada, -Katakana, -Kayah_Li, -Kharoshthi, -Khmer, -Khojki, -Khudawadi, -Lao, -Latin, -Lepcha, -Limbu, -Linear_A, -Linear_B, -Lisu, -Lycian, -Lydian, -Mahajani, -Malayalam, -Mandaic, -Manichaean, -Meetei_Mayek, -Mende_Kikakui, -Meroitic_Cursive, -Meroitic_Hieroglyphs, -Miao, -Modi, -Mongolian, -Mro, -Myanmar, -Nabataean, -New_Tai_Lue, -Nko, -Ogham, -Ol_Chiki, -Old_Italic, -Old_North_Arabian, -Old_Permic, -Old_Persian, -Old_South_Arabian, -Old_Turkic, -Oriya, -Osmanya, -Pahawh_Hmong, -Palmyrene, -Pau_Cin_Hau, -Phags_Pa, -Phoenician, -Psalter_Pahlavi, -Rejang, -Runic, -Samaritan, -Saurashtra, -Sharada, -Shavian, -Siddham, -Sinhala, -Sora_Sompeng, -Sundanese, -Syloti_Nagri, -Syriac, -Tagalog, -Tagbanwa, -Tai_Le, -Tai_Tham, -Tai_Viet, -Takri, -Tamil, -Telugu, -Thaana, -Thai, -Tibetan, -Tifinagh, -Tirhuta, -Ugaritic, -Vai, -Warang_Citi, -Yi. -

      -

      -Each character has exactly one Unicode general category property, specified by -a two-letter abbreviation. For compatibility with Perl, negation can be -specified by including a circumflex between the opening brace and the property -name. For example, \p{^Lu} is the same as \P{Lu}. -

      -

      -If only one letter is specified with \p or \P, it includes all the general -category properties that start with that letter. In this case, in the absence -of negation, the curly brackets in the escape sequence are optional; these two -examples have the same effect: -

      -  \p{L}
      -  \pL
      -
      -The following general category property codes are supported: -
      -  C     Other
      -  Cc    Control
      -  Cf    Format
      -  Cn    Unassigned
      -  Co    Private use
      -  Cs    Surrogate
      -
      -  L     Letter
      -  Ll    Lower case letter
      -  Lm    Modifier letter
      -  Lo    Other letter
      -  Lt    Title case letter
      -  Lu    Upper case letter
      -
      -  M     Mark
      -  Mc    Spacing mark
      -  Me    Enclosing mark
      -  Mn    Non-spacing mark
      -
      -  N     Number
      -  Nd    Decimal number
      -  Nl    Letter number
      -  No    Other number
      -
      -  P     Punctuation
      -  Pc    Connector punctuation
      -  Pd    Dash punctuation
      -  Pe    Close punctuation
      -  Pf    Final punctuation
      -  Pi    Initial punctuation
      -  Po    Other punctuation
      -  Ps    Open punctuation
      -
      -  S     Symbol
      -  Sc    Currency symbol
      -  Sk    Modifier symbol
      -  Sm    Mathematical symbol
      -  So    Other symbol
      -
      -  Z     Separator
      -  Zl    Line separator
      -  Zp    Paragraph separator
      -  Zs    Space separator
      -
      -The special property L& is also supported: it matches a character that has -the Lu, Ll, or Lt property, in other words, a letter that is not classified as -a modifier or "other". -

      -

      -The Cs (Surrogate) property applies only to characters in the range U+D800 to -U+DFFF. Such characters are not valid in Unicode strings and so -cannot be tested by PCRE, unless UTF validity checking has been turned off -(see the discussion of PCRE_NO_UTF8_CHECK, PCRE_NO_UTF16_CHECK and -PCRE_NO_UTF32_CHECK in the -pcreapi -page). Perl does not support the Cs property. -

      -

      -The long synonyms for property names that Perl supports (such as \p{Letter}) -are not supported by PCRE, nor is it permitted to prefix any of these -properties with "Is". -

      -

      -No character that is in the Unicode table has the Cn (unassigned) property. -Instead, this property is assumed for any code point that is not in the -Unicode table. -

      -

      -Specifying caseless matching does not affect these escape sequences. For -example, \p{Lu} always matches only upper case letters. This is different from -the behaviour of current versions of Perl. -

      -

      -Matching characters by Unicode property is not fast, because PCRE has to do a -multistage table lookup in order to find a character's property. That is why -the traditional escape sequences such as \d and \w do not use Unicode -properties in PCRE by default, though you can make them do so by setting the -PCRE_UCP option or by starting the pattern with (*UCP). -

      -
      -Extended grapheme clusters -
      -

      -The \X escape matches any number of Unicode characters that form an "extended -grapheme cluster", and treats the sequence as an atomic group -(see below). -Up to and including release 8.31, PCRE matched an earlier, simpler definition -that was equivalent to -

      -  (?>\PM\pM*)
      -
      -That is, it matched a character without the "mark" property, followed by zero -or more characters with the "mark" property. Characters with the "mark" -property are typically non-spacing accents that affect the preceding character. -

      -

      -This simple definition was extended in Unicode to include more complicated -kinds of composite character by giving each character a grapheme breaking -property, and creating rules that use these properties to define the boundaries -of extended grapheme clusters. In releases of PCRE later than 8.31, \X matches -one of these clusters. -

      -

      -\X always matches at least one character. Then it decides whether to add -additional characters according to the following rules for ending a cluster: -

      -

      -1. End at the end of the subject string. -

      -

      -2. Do not end between CR and LF; otherwise end after any control character. -

      -

      -3. Do not break Hangul (a Korean script) syllable sequences. Hangul characters -are of five types: L, V, T, LV, and LVT. An L character may be followed by an -L, V, LV, or LVT character; an LV or V character may be followed by a V or T -character; an LVT or T character may be follwed only by a T character. -

      -

      -4. Do not end before extending characters or spacing marks. Characters with -the "mark" property always have the "extend" grapheme breaking property. -

      -

      -5. Do not end after prepend characters. -

      -

      -6. Otherwise, end the cluster. -

      -
      -PCRE's additional properties -
      -

      -As well as the standard Unicode properties described above, PCRE supports four -more that make it possible to convert traditional escape sequences such as \w -and \s to use Unicode properties. PCRE uses these non-standard, non-Perl -properties internally when PCRE_UCP is set. However, they may also be used -explicitly. These properties are: -

      -  Xan   Any alphanumeric character
      -  Xps   Any POSIX space character
      -  Xsp   Any Perl space character
      -  Xwd   Any Perl "word" character
      -
      -Xan matches characters that have either the L (letter) or the N (number) -property. Xps matches the characters tab, linefeed, vertical tab, form feed, or -carriage return, and any other character that has the Z (separator) property. -Xsp is the same as Xps; it used to exclude vertical tab, for Perl -compatibility, but Perl changed, and so PCRE followed at release 8.34. Xwd -matches the same characters as Xan, plus underscore. -

      -

      -There is another non-standard property, Xuc, which matches any character that -can be represented by a Universal Character Name in C++ and other programming -languages. These are the characters $, @, ` (grave accent), and all characters -with Unicode code points greater than or equal to U+00A0, except for the -surrogates U+D800 to U+DFFF. Note that most base (ASCII) characters are -excluded. (Universal Character Names are of the form \uHHHH or \UHHHHHHHH -where H is a hexadecimal digit. Note that the Xuc property does not match these -sequences but the characters that they represent.) -

      -
      -Resetting the match start -
      -

      -The escape sequence \K causes any previously matched characters not to be -included in the final matched sequence. For example, the pattern: -

      -  foo\Kbar
      -
      -matches "foobar", but reports that it has matched "bar". This feature is -similar to a lookbehind assertion -(described below). -However, in this case, the part of the subject before the real match does not -have to be of fixed length, as lookbehind assertions do. The use of \K does -not interfere with the setting of -captured substrings. -For example, when the pattern -
      -  (foo)\Kbar
      -
      -matches "foobar", the first substring is still set to "foo". -

      -

      -Perl documents that the use of \K within assertions is "not well defined". In -PCRE, \K is acted upon when it occurs inside positive assertions, but is -ignored in negative assertions. Note that when a pattern such as (?=ab\K) -matches, the reported start of the match can be greater than the end of the -match. -

      -
      -Simple assertions -
      -

      -The final use of backslash is for certain simple assertions. An assertion -specifies a condition that has to be met at a particular point in a match, -without consuming any characters from the subject string. The use of -subpatterns for more complicated assertions is described -below. -The backslashed assertions are: -

      -  \b     matches at a word boundary
      -  \B     matches when not at a word boundary
      -  \A     matches at the start of the subject
      -  \Z     matches at the end of the subject
      -          also matches before a newline at the end of the subject
      -  \z     matches only at the end of the subject
      -  \G     matches at the first matching position in the subject
      -
      -Inside a character class, \b has a different meaning; it matches the backspace -character. If any other of these assertions appears in a character class, by -default it matches the corresponding literal character (for example, \B -matches the letter B). However, if the PCRE_EXTRA option is set, an "invalid -escape sequence" error is generated instead. -

      -

      -A word boundary is a position in the subject string where the current character -and the previous character do not both match \w or \W (i.e. one matches -\w and the other matches \W), or the start or end of the string if the -first or last character matches \w, respectively. In a UTF mode, the meanings -of \w and \W can be changed by setting the PCRE_UCP option. When this is -done, it also affects \b and \B. Neither PCRE nor Perl has a separate "start -of word" or "end of word" metasequence. However, whatever follows \b normally -determines which it is. For example, the fragment \ba matches "a" at the start -of a word. -

      -

      -The \A, \Z, and \z assertions differ from the traditional circumflex and -dollar (described in the next section) in that they only ever match at the very -start and end of the subject string, whatever options are set. Thus, they are -independent of multiline mode. These three assertions are not affected by the -PCRE_NOTBOL or PCRE_NOTEOL options, which affect only the behaviour of the -circumflex and dollar metacharacters. However, if the startoffset -argument of pcre_exec() is non-zero, indicating that matching is to start -at a point other than the beginning of the subject, \A can never match. The -difference between \Z and \z is that \Z matches before a newline at the end -of the string as well as at the very end, whereas \z matches only at the end. -

      -

      -The \G assertion is true only when the current matching position is at the -start point of the match, as specified by the startoffset argument of -pcre_exec(). It differs from \A when the value of startoffset is -non-zero. By calling pcre_exec() multiple times with appropriate -arguments, you can mimic Perl's /g option, and it is in this kind of -implementation where \G can be useful. -

      -

      -Note, however, that PCRE's interpretation of \G, as the start of the current -match, is subtly different from Perl's, which defines it as the end of the -previous match. In Perl, these can be different when the previously matched -string was empty. Because PCRE does just one match at a time, it cannot -reproduce this behaviour. -

      -

      -If all the alternatives of a pattern begin with \G, the expression is anchored -to the starting match position, and the "anchored" flag is set in the compiled -regular expression. -

      -
      CIRCUMFLEX AND DOLLAR
      -

      -The circumflex and dollar metacharacters are zero-width assertions. That is, -they test for a particular condition being true without consuming any -characters from the subject string. -

      -

      -Outside a character class, in the default matching mode, the circumflex -character is an assertion that is true only if the current matching point is at -the start of the subject string. If the startoffset argument of -pcre_exec() is non-zero, circumflex can never match if the PCRE_MULTILINE -option is unset. Inside a character class, circumflex has an entirely different -meaning -(see below). -

      -

      -Circumflex need not be the first character of the pattern if a number of -alternatives are involved, but it should be the first thing in each alternative -in which it appears if the pattern is ever to match that branch. If all -possible alternatives start with a circumflex, that is, if the pattern is -constrained to match only at the start of the subject, it is said to be an -"anchored" pattern. (There are also other constructs that can cause a pattern -to be anchored.) -

      -

      -The dollar character is an assertion that is true only if the current matching -point is at the end of the subject string, or immediately before a newline at -the end of the string (by default). Note, however, that it does not actually -match the newline. Dollar need not be the last character of the pattern if a -number of alternatives are involved, but it should be the last item in any -branch in which it appears. Dollar has no special meaning in a character class. -

      -

      -The meaning of dollar can be changed so that it matches only at the very end of -the string, by setting the PCRE_DOLLAR_ENDONLY option at compile time. This -does not affect the \Z assertion. -

      -

      -The meanings of the circumflex and dollar characters are changed if the -PCRE_MULTILINE option is set. When this is the case, a circumflex matches -immediately after internal newlines as well as at the start of the subject -string. It does not match after a newline that ends the string. A dollar -matches before any newlines in the string, as well as at the very end, when -PCRE_MULTILINE is set. When newline is specified as the two-character -sequence CRLF, isolated CR and LF characters do not indicate newlines. -

      -

      -For example, the pattern /^abc$/ matches the subject string "def\nabc" (where -\n represents a newline) in multiline mode, but not otherwise. Consequently, -patterns that are anchored in single line mode because all branches start with -^ are not anchored in multiline mode, and a match for circumflex is possible -when the startoffset argument of pcre_exec() is non-zero. The -PCRE_DOLLAR_ENDONLY option is ignored if PCRE_MULTILINE is set. -

      -

      -Note that the sequences \A, \Z, and \z can be used to match the start and -end of the subject in both modes, and if all branches of a pattern start with -\A it is always anchored, whether or not PCRE_MULTILINE is set. -

      -
      FULL STOP (PERIOD, DOT) AND \N
      -

      -Outside a character class, a dot in the pattern matches any one character in -the subject string except (by default) a character that signifies the end of a -line. -

      -

      -When a line ending is defined as a single character, dot never matches that -character; when the two-character sequence CRLF is used, dot does not match CR -if it is immediately followed by LF, but otherwise it matches all characters -(including isolated CRs and LFs). When any Unicode line endings are being -recognized, dot does not match CR or LF or any of the other line ending -characters. -

      -

      -The behaviour of dot with regard to newlines can be changed. If the PCRE_DOTALL -option is set, a dot matches any one character, without exception. If the -two-character sequence CRLF is present in the subject string, it takes two dots -to match it. -

      -

      -The handling of dot is entirely independent of the handling of circumflex and -dollar, the only relationship being that they both involve newlines. Dot has no -special meaning in a character class. -

      -

      -The escape sequence \N behaves like a dot, except that it is not affected by -the PCRE_DOTALL option. In other words, it matches any character except one -that signifies the end of a line. Perl also uses \N to match characters by -name; PCRE does not support this. -

      -
      MATCHING A SINGLE DATA UNIT
      -

      -Outside a character class, the escape sequence \C matches any one data unit, -whether or not a UTF mode is set. In the 8-bit library, one data unit is one -byte; in the 16-bit library it is a 16-bit unit; in the 32-bit library it is -a 32-bit unit. Unlike a dot, \C always -matches line-ending characters. The feature is provided in Perl in order to -match individual bytes in UTF-8 mode, but it is unclear how it can usefully be -used. Because \C breaks up characters into individual data units, matching one -unit with \C in a UTF mode means that the rest of the string may start with a -malformed UTF character. This has undefined results, because PCRE assumes that -it is dealing with valid UTF strings (and by default it checks this at the -start of processing unless the PCRE_NO_UTF8_CHECK, PCRE_NO_UTF16_CHECK or -PCRE_NO_UTF32_CHECK option is used). -

      -

      -PCRE does not allow \C to appear in lookbehind assertions -(described below) -in a UTF mode, because this would make it impossible to calculate the length of -the lookbehind. -

      -

      -In general, the \C escape sequence is best avoided. However, one -way of using it that avoids the problem of malformed UTF characters is to use a -lookahead to check the length of the next character, as in this pattern, which -could be used with a UTF-8 string (ignore white space and line breaks): -

      -  (?| (?=[\x00-\x7f])(\C) |
      -      (?=[\x80-\x{7ff}])(\C)(\C) |
      -      (?=[\x{800}-\x{ffff}])(\C)(\C)(\C) |
      -      (?=[\x{10000}-\x{1fffff}])(\C)(\C)(\C)(\C))
      -
      -A group that starts with (?| resets the capturing parentheses numbers in each -alternative (see -"Duplicate Subpattern Numbers" -below). The assertions at the start of each branch check the next UTF-8 -character for values whose encoding uses 1, 2, 3, or 4 bytes, respectively. The -character's individual bytes are then captured by the appropriate number of -groups. -

      -
      SQUARE BRACKETS AND CHARACTER CLASSES
      -

      -An opening square bracket introduces a character class, terminated by a closing -square bracket. A closing square bracket on its own is not special by default. -However, if the PCRE_JAVASCRIPT_COMPAT option is set, a lone closing square -bracket causes a compile-time error. If a closing square bracket is required as -a member of the class, it should be the first data character in the class -(after an initial circumflex, if present) or escaped with a backslash. -

      -

      -A character class matches a single character in the subject. In a UTF mode, the -character may be more than one data unit long. A matched character must be in -the set of characters defined by the class, unless the first character in the -class definition is a circumflex, in which case the subject character must not -be in the set defined by the class. If a circumflex is actually required as a -member of the class, ensure it is not the first character, or escape it with a -backslash. -

      -

      -For example, the character class [aeiou] matches any lower case vowel, while -[^aeiou] matches any character that is not a lower case vowel. Note that a -circumflex is just a convenient notation for specifying the characters that -are in the class by enumerating those that are not. A class that starts with a -circumflex is not an assertion; it still consumes a character from the subject -string, and therefore it fails if the current pointer is at the end of the -string. -

      -

      -In UTF-8 (UTF-16, UTF-32) mode, characters with values greater than 255 (0xffff) -can be included in a class as a literal string of data units, or by using the -\x{ escaping mechanism. -

      -

      -When caseless matching is set, any letters in a class represent both their -upper case and lower case versions, so for example, a caseless [aeiou] matches -"A" as well as "a", and a caseless [^aeiou] does not match "A", whereas a -caseful version would. In a UTF mode, PCRE always understands the concept of -case for characters whose values are less than 128, so caseless matching is -always possible. For characters with higher values, the concept of case is -supported if PCRE is compiled with Unicode property support, but not otherwise. -If you want to use caseless matching in a UTF mode for characters 128 and -above, you must ensure that PCRE is compiled with Unicode property support as -well as with UTF support. -

      -

      -Characters that might indicate line breaks are never treated in any special way -when matching character classes, whatever line-ending sequence is in use, and -whatever setting of the PCRE_DOTALL and PCRE_MULTILINE options is used. A class -such as [^a] always matches one of these characters. -

      -

      -The minus (hyphen) character can be used to specify a range of characters in a -character class. For example, [d-m] matches any letter between d and m, -inclusive. If a minus character is required in a class, it must be escaped with -a backslash or appear in a position where it cannot be interpreted as -indicating a range, typically as the first or last character in the class, or -immediately after a range. For example, [b-d-z] matches letters in the range b -to d, a hyphen character, or z. -

      -

      -It is not possible to have the literal character "]" as the end character of a -range. A pattern such as [W-]46] is interpreted as a class of two characters -("W" and "-") followed by a literal string "46]", so it would match "W46]" or -"-46]". However, if the "]" is escaped with a backslash it is interpreted as -the end of range, so [W-\]46] is interpreted as a class containing a range -followed by two other characters. The octal or hexadecimal representation of -"]" can also be used to end a range. -

      -

      -An error is generated if a POSIX character class (see below) or an escape -sequence other than one that defines a single character appears at a point -where a range ending character is expected. For example, [z-\xff] is valid, -but [A-\d] and [A-[:digit:]] are not. -

      -

      -Ranges operate in the collating sequence of character values. They can also be -used for characters specified numerically, for example [\000-\037]. Ranges -can include any characters that are valid for the current mode. -

      -

      -If a range that includes letters is used when caseless matching is set, it -matches the letters in either case. For example, [W-c] is equivalent to -[][\\^_`wxyzabc], matched caselessly, and in a non-UTF mode, if character -tables for a French locale are in use, [\xc8-\xcb] matches accented E -characters in both cases. In UTF modes, PCRE supports the concept of case for -characters with values greater than 128 only when it is compiled with Unicode -property support. -

      -

      -The character escape sequences \d, \D, \h, \H, \p, \P, \s, \S, \v, -\V, \w, and \W may appear in a character class, and add the characters that -they match to the class. For example, [\dABCDEF] matches any hexadecimal -digit. In UTF modes, the PCRE_UCP option affects the meanings of \d, \s, \w -and their upper case partners, just as it does when they appear outside a -character class, as described in the section entitled -"Generic character types" -above. The escape sequence \b has a different meaning inside a character -class; it matches the backspace character. The sequences \B, \N, \R, and \X -are not special inside a character class. Like any other unrecognized escape -sequences, they are treated as the literal characters "B", "N", "R", and "X" by -default, but cause an error if the PCRE_EXTRA option is set. -

      -

      -A circumflex can conveniently be used with the upper case character types to -specify a more restricted set of characters than the matching lower case type. -For example, the class [^\W_] matches any letter or digit, but not underscore, -whereas [\w] includes underscore. A positive character class should be read as -"something OR something OR ..." and a negative class as "NOT something AND NOT -something AND NOT ...". -

      -

      -The only metacharacters that are recognized in character classes are backslash, -hyphen (only where it can be interpreted as specifying a range), circumflex -(only at the start), opening square bracket (only when it can be interpreted as -introducing a POSIX class name, or for a special compatibility feature - see -the next two sections), and the terminating closing square bracket. However, -escaping other non-alphanumeric characters does no harm. -

      -
      POSIX CHARACTER CLASSES
      -

      -Perl supports the POSIX notation for character classes. This uses names -enclosed by [: and :] within the enclosing square brackets. PCRE also supports -this notation. For example, -

      -  [01[:alpha:]%]
      -
      -matches "0", "1", any alphabetic character, or "%". The supported class names -are: -
      -  alnum    letters and digits
      -  alpha    letters
      -  ascii    character codes 0 - 127
      -  blank    space or tab only
      -  cntrl    control characters
      -  digit    decimal digits (same as \d)
      -  graph    printing characters, excluding space
      -  lower    lower case letters
      -  print    printing characters, including space
      -  punct    printing characters, excluding letters and digits and space
      -  space    white space (the same as \s from PCRE 8.34)
      -  upper    upper case letters
      -  word     "word" characters (same as \w)
      -  xdigit   hexadecimal digits
      -
      -The default "space" characters are HT (9), LF (10), VT (11), FF (12), CR (13), -and space (32). If locale-specific matching is taking place, the list of space -characters may be different; there may be fewer or more of them. "Space" used -to be different to \s, which did not include VT, for Perl compatibility. -However, Perl changed at release 5.18, and PCRE followed at release 8.34. -"Space" and \s now match the same set of characters. -

      -

      -The name "word" is a Perl extension, and "blank" is a GNU extension from Perl -5.8. Another Perl extension is negation, which is indicated by a ^ character -after the colon. For example, -

      -  [12[:^digit:]]
      -
      -matches "1", "2", or any non-digit. PCRE (and Perl) also recognize the POSIX -syntax [.ch.] and [=ch=] where "ch" is a "collating element", but these are not -supported, and an error is given if they are encountered. -

      -

      -By default, characters with values greater than 128 do not match any of the -POSIX character classes. However, if the PCRE_UCP option is passed to -pcre_compile(), some of the classes are changed so that Unicode character -properties are used. This is achieved by replacing certain POSIX classes by -other sequences, as follows: -

      -  [:alnum:]  becomes  \p{Xan}
      -  [:alpha:]  becomes  \p{L}
      -  [:blank:]  becomes  \h
      -  [:digit:]  becomes  \p{Nd}
      -  [:lower:]  becomes  \p{Ll}
      -  [:space:]  becomes  \p{Xps}
      -  [:upper:]  becomes  \p{Lu}
      -  [:word:]   becomes  \p{Xwd}
      -
      -Negated versions, such as [:^alpha:] use \P instead of \p. Three other POSIX -classes are handled specially in UCP mode: -

      -

      -[:graph:] -This matches characters that have glyphs that mark the page when printed. In -Unicode property terms, it matches all characters with the L, M, N, P, S, or Cf -properties, except for: -

      -  U+061C           Arabic Letter Mark
      -  U+180E           Mongolian Vowel Separator
      -  U+2066 - U+2069  Various "isolate"s
      -
      -
      -

      -

      -[:print:] -This matches the same characters as [:graph:] plus space characters that are -not controls, that is, characters with the Zs property. -

      -

      -[:punct:] -This matches all characters that have the Unicode P (punctuation) property, -plus those characters whose code points are less than 128 that have the S -(Symbol) property. -

      -

      -The other POSIX classes are unchanged, and match only characters with code -points less than 128. -

      -
      COMPATIBILITY FEATURE FOR WORD BOUNDARIES
      -

      -In the POSIX.2 compliant library that was included in 4.4BSD Unix, the ugly -syntax [[:<:]] and [[:>:]] is used for matching "start of word" and "end of -word". PCRE treats these items as follows: -

      -  [[:<:]]  is converted to  \b(?=\w)
      -  [[:>:]]  is converted to  \b(?<=\w)
      -
      -Only these exact character sequences are recognized. A sequence such as -[a[:<:]b] provokes error for an unrecognized POSIX class name. This support is -not compatible with Perl. It is provided to help migrations from other -environments, and is best not used in any new patterns. Note that \b matches -at the start and the end of a word (see -"Simple assertions" -above), and in a Perl-style pattern the preceding or following character -normally shows which is wanted, without the need for the assertions that are -used above in order to give exactly the POSIX behaviour. -

      -
      VERTICAL BAR
      -

      -Vertical bar characters are used to separate alternative patterns. For example, -the pattern -

      -  gilbert|sullivan
      -
      -matches either "gilbert" or "sullivan". Any number of alternatives may appear, -and an empty alternative is permitted (matching the empty string). The matching -process tries each alternative in turn, from left to right, and the first one -that succeeds is used. If the alternatives are within a subpattern -(defined below), -"succeeds" means matching the rest of the main pattern as well as the -alternative in the subpattern. -

      -
      INTERNAL OPTION SETTING
      -

      -The settings of the PCRE_CASELESS, PCRE_MULTILINE, PCRE_DOTALL, and -PCRE_EXTENDED options (which are Perl-compatible) can be changed from within -the pattern by a sequence of Perl option letters enclosed between "(?" and ")". -The option letters are -

      -  i  for PCRE_CASELESS
      -  m  for PCRE_MULTILINE
      -  s  for PCRE_DOTALL
      -  x  for PCRE_EXTENDED
      -
      -For example, (?im) sets caseless, multiline matching. It is also possible to -unset these options by preceding the letter with a hyphen, and a combined -setting and unsetting such as (?im-sx), which sets PCRE_CASELESS and -PCRE_MULTILINE while unsetting PCRE_DOTALL and PCRE_EXTENDED, is also -permitted. If a letter appears both before and after the hyphen, the option is -unset. -

      -

      -The PCRE-specific options PCRE_DUPNAMES, PCRE_UNGREEDY, and PCRE_EXTRA can be -changed in the same way as the Perl-compatible options by using the characters -J, U and X respectively. -

      -

      -When one of these option changes occurs at top level (that is, not inside -subpattern parentheses), the change applies to the remainder of the pattern -that follows. An option change within a subpattern (see below for a description -of subpatterns) affects only that part of the subpattern that follows it, so -

      -  (a(?i)b)c
      -
      -matches abc and aBc and no other strings (assuming PCRE_CASELESS is not used). -By this means, options can be made to have different settings in different -parts of the pattern. Any changes made in one alternative do carry on -into subsequent branches within the same subpattern. For example, -
      -  (a(?i)b|c)
      -
      -matches "ab", "aB", "c", and "C", even though when matching "C" the first -branch is abandoned before the option setting. This is because the effects of -option settings happen at compile time. There would be some very weird -behaviour otherwise. -

      -

      -Note: There are other PCRE-specific options that can be set by the -application when the compiling or matching functions are called. In some cases -the pattern can contain special leading sequences such as (*CRLF) to override -what the application has set or what has been defaulted. Details are given in -the section entitled -"Newline sequences" -above. There are also the (*UTF8), (*UTF16),(*UTF32), and (*UCP) leading -sequences that can be used to set UTF and Unicode property modes; they are -equivalent to setting the PCRE_UTF8, PCRE_UTF16, PCRE_UTF32 and the PCRE_UCP -options, respectively. The (*UTF) sequence is a generic version that can be -used with any of the libraries. However, the application can set the -PCRE_NEVER_UTF option, which locks out the use of the (*UTF) sequences. -

      -
      SUBPATTERNS
      -

      -Subpatterns are delimited by parentheses (round brackets), which can be nested. -Turning part of a pattern into a subpattern does two things: -
      -
      -1. It localizes a set of alternatives. For example, the pattern -

      -  cat(aract|erpillar|)
      -
      -matches "cataract", "caterpillar", or "cat". Without the parentheses, it would -match "cataract", "erpillar" or an empty string. -
      -
      -2. It sets up the subpattern as a capturing subpattern. This means that, when -the whole pattern matches, that portion of the subject string that matched the -subpattern is passed back to the caller via the ovector argument of the -matching function. (This applies only to the traditional matching functions; -the DFA matching functions do not support capturing.) -

      -

      -Opening parentheses are counted from left to right (starting from 1) to obtain -numbers for the capturing subpatterns. For example, if the string "the red -king" is matched against the pattern -

      -  the ((red|white) (king|queen))
      -
      -the captured substrings are "red king", "red", and "king", and are numbered 1, -2, and 3, respectively. -

      -

      -The fact that plain parentheses fulfil two functions is not always helpful. -There are often times when a grouping subpattern is required without a -capturing requirement. If an opening parenthesis is followed by a question mark -and a colon, the subpattern does not do any capturing, and is not counted when -computing the number of any subsequent capturing subpatterns. For example, if -the string "the white queen" is matched against the pattern -

      -  the ((?:red|white) (king|queen))
      -
      -the captured substrings are "white queen" and "queen", and are numbered 1 and -2. The maximum number of capturing subpatterns is 65535. -

      -

      -As a convenient shorthand, if any option settings are required at the start of -a non-capturing subpattern, the option letters may appear between the "?" and -the ":". Thus the two patterns -

      -  (?i:saturday|sunday)
      -  (?:(?i)saturday|sunday)
      -
      -match exactly the same set of strings. Because alternative branches are tried -from left to right, and options are not reset until the end of the subpattern -is reached, an option setting in one branch does affect subsequent branches, so -the above patterns match "SUNDAY" as well as "Saturday". -

      -
      DUPLICATE SUBPATTERN NUMBERS
      -

      -Perl 5.10 introduced a feature whereby each alternative in a subpattern uses -the same numbers for its capturing parentheses. Such a subpattern starts with -(?| and is itself a non-capturing subpattern. For example, consider this -pattern: -

      -  (?|(Sat)ur|(Sun))day
      -
      -Because the two alternatives are inside a (?| group, both sets of capturing -parentheses are numbered one. Thus, when the pattern matches, you can look -at captured substring number one, whichever alternative matched. This construct -is useful when you want to capture part, but not all, of one of a number of -alternatives. Inside a (?| group, parentheses are numbered as usual, but the -number is reset at the start of each branch. The numbers of any capturing -parentheses that follow the subpattern start after the highest number used in -any branch. The following example is taken from the Perl documentation. The -numbers underneath show in which buffer the captured content will be stored. -
      -  # before  ---------------branch-reset----------- after
      -  / ( a )  (?| x ( y ) z | (p (q) r) | (t) u (v) ) ( z ) /x
      -  # 1            2         2  3        2     3     4
      -
      -A back reference to a numbered subpattern uses the most recent value that is -set for that number by any subpattern. The following pattern matches "abcabc" -or "defdef": -
      -  /(?|(abc)|(def))\1/
      -
      -In contrast, a subroutine call to a numbered subpattern always refers to the -first one in the pattern with the given number. The following pattern matches -"abcabc" or "defabc": -
      -  /(?|(abc)|(def))(?1)/
      -
      -If a -condition test -for a subpattern's having matched refers to a non-unique number, the test is -true if any of the subpatterns of that number have matched. -

      -

      -An alternative approach to using this "branch reset" feature is to use -duplicate named subpatterns, as described in the next section. -

      -
      NAMED SUBPATTERNS
      -

      -Identifying capturing parentheses by number is simple, but it can be very hard -to keep track of the numbers in complicated regular expressions. Furthermore, -if an expression is modified, the numbers may change. To help with this -difficulty, PCRE supports the naming of subpatterns. This feature was not -added to Perl until release 5.10. Python had the feature earlier, and PCRE -introduced it at release 4.0, using the Python syntax. PCRE now supports both -the Perl and the Python syntax. Perl allows identically numbered subpatterns to -have different names, but PCRE does not. -

      -

      -In PCRE, a subpattern can be named in one of three ways: (?<name>...) or -(?'name'...) as in Perl, or (?P<name>...) as in Python. References to capturing -parentheses from other parts of the pattern, such as -back references, -recursion, -and -conditions, -can be made by name as well as by number. -

      -

      -Names consist of up to 32 alphanumeric characters and underscores, but must -start with a non-digit. Named capturing parentheses are still allocated numbers -as well as names, exactly as if the names were not present. The PCRE API -provides function calls for extracting the name-to-number translation table -from a compiled pattern. There is also a convenience function for extracting a -captured substring by name. -

      -

      -By default, a name must be unique within a pattern, but it is possible to relax -this constraint by setting the PCRE_DUPNAMES option at compile time. (Duplicate -names are also always permitted for subpatterns with the same number, set up as -described in the previous section.) Duplicate names can be useful for patterns -where only one instance of the named parentheses can match. Suppose you want to -match the name of a weekday, either as a 3-letter abbreviation or as the full -name, and in both cases you want to extract the abbreviation. This pattern -(ignoring the line breaks) does the job: -

      -  (?<DN>Mon|Fri|Sun)(?:day)?|
      -  (?<DN>Tue)(?:sday)?|
      -  (?<DN>Wed)(?:nesday)?|
      -  (?<DN>Thu)(?:rsday)?|
      -  (?<DN>Sat)(?:urday)?
      -
      -There are five capturing substrings, but only one is ever set after a match. -(An alternative way of solving this problem is to use a "branch reset" -subpattern, as described in the previous section.) -

      -

      -The convenience function for extracting the data by name returns the substring -for the first (and in this example, the only) subpattern of that name that -matched. This saves searching to find which numbered subpattern it was. -

      -

      -If you make a back reference to a non-unique named subpattern from elsewhere in -the pattern, the subpatterns to which the name refers are checked in the order -in which they appear in the overall pattern. The first one that is set is used -for the reference. For example, this pattern matches both "foofoo" and -"barbar" but not "foobar" or "barfoo": -

      -  (?:(?<n>foo)|(?<n>bar))\k<n>
      -
      -
      -

      -

      -If you make a subroutine call to a non-unique named subpattern, the one that -corresponds to the first occurrence of the name is used. In the absence of -duplicate numbers (see the previous section) this is the one with the lowest -number. -

      -

      -If you use a named reference in a condition -test (see the -section about conditions -below), either to check whether a subpattern has matched, or to check for -recursion, all subpatterns with the same name are tested. If the condition is -true for any one of them, the overall condition is true. This is the same -behaviour as testing by number. For further details of the interfaces for -handling named subpatterns, see the -pcreapi -documentation. -

      -

      -Warning: You cannot use different names to distinguish between two -subpatterns with the same number because PCRE uses only the numbers when -matching. For this reason, an error is given at compile time if different names -are given to subpatterns with the same number. However, you can always give the -same name to subpatterns with the same number, even when PCRE_DUPNAMES is not -set. -

      -
      REPETITION
      -

      -Repetition is specified by quantifiers, which can follow any of the following -items: -

      -  a literal data character
      -  the dot metacharacter
      -  the \C escape sequence
      -  the \X escape sequence
      -  the \R escape sequence
      -  an escape such as \d or \pL that matches a single character
      -  a character class
      -  a back reference (see next section)
      -  a parenthesized subpattern (including assertions)
      -  a subroutine call to a subpattern (recursive or otherwise)
      -
      -The general repetition quantifier specifies a minimum and maximum number of -permitted matches, by giving the two numbers in curly brackets (braces), -separated by a comma. The numbers must be less than 65536, and the first must -be less than or equal to the second. For example: -
      -  z{2,4}
      -
      -matches "zz", "zzz", or "zzzz". A closing brace on its own is not a special -character. If the second number is omitted, but the comma is present, there is -no upper limit; if the second number and the comma are both omitted, the -quantifier specifies an exact number of required matches. Thus -
      -  [aeiou]{3,}
      -
      -matches at least 3 successive vowels, but may match many more, while -
      -  \d{8}
      -
      -matches exactly 8 digits. An opening curly bracket that appears in a position -where a quantifier is not allowed, or one that does not match the syntax of a -quantifier, is taken as a literal character. For example, {,6} is not a -quantifier, but a literal string of four characters. -

      -

      -In UTF modes, quantifiers apply to characters rather than to individual data -units. Thus, for example, \x{100}{2} matches two characters, each of -which is represented by a two-byte sequence in a UTF-8 string. Similarly, -\X{3} matches three Unicode extended grapheme clusters, each of which may be -several data units long (and they may be of different lengths). -

      -

      -The quantifier {0} is permitted, causing the expression to behave as if the -previous item and the quantifier were not present. This may be useful for -subpatterns that are referenced as -subroutines -from elsewhere in the pattern (but see also the section entitled -"Defining subpatterns for use by reference only" -below). Items other than subpatterns that have a {0} quantifier are omitted -from the compiled pattern. -

      -

      -For convenience, the three most common quantifiers have single-character -abbreviations: -

      -  *    is equivalent to {0,}
      -  +    is equivalent to {1,}
      -  ?    is equivalent to {0,1}
      -
      -It is possible to construct infinite loops by following a subpattern that can -match no characters with a quantifier that has no upper limit, for example: -
      -  (a?)*
      -
      -Earlier versions of Perl and PCRE used to give an error at compile time for -such patterns. However, because there are cases where this can be useful, such -patterns are now accepted, but if any repetition of the subpattern does in fact -match no characters, the loop is forcibly broken. -

      -

      -By default, the quantifiers are "greedy", that is, they match as much as -possible (up to the maximum number of permitted times), without causing the -rest of the pattern to fail. The classic example of where this gives problems -is in trying to match comments in C programs. These appear between /* and */ -and within the comment, individual * and / characters may appear. An attempt to -match C comments by applying the pattern -

      -  /\*.*\*/
      -
      -to the string -
      -  /* first comment */  not comment  /* second comment */
      -
      -fails, because it matches the entire string owing to the greediness of the .* -item. -

      -

      -However, if a quantifier is followed by a question mark, it ceases to be -greedy, and instead matches the minimum number of times possible, so the -pattern -

      -  /\*.*?\*/
      -
      -does the right thing with the C comments. The meaning of the various -quantifiers is not otherwise changed, just the preferred number of matches. -Do not confuse this use of question mark with its use as a quantifier in its -own right. Because it has two uses, it can sometimes appear doubled, as in -
      -  \d??\d
      -
      -which matches one digit by preference, but can match two if that is the only -way the rest of the pattern matches. -

      -

      -If the PCRE_UNGREEDY option is set (an option that is not available in Perl), -the quantifiers are not greedy by default, but individual ones can be made -greedy by following them with a question mark. In other words, it inverts the -default behaviour. -

      -

      -When a parenthesized subpattern is quantified with a minimum repeat count that -is greater than 1 or with a limited maximum, more memory is required for the -compiled pattern, in proportion to the size of the minimum or maximum. -

      -

      -If a pattern starts with .* or .{0,} and the PCRE_DOTALL option (equivalent -to Perl's /s) is set, thus allowing the dot to match newlines, the pattern is -implicitly anchored, because whatever follows will be tried against every -character position in the subject string, so there is no point in retrying the -overall match at any position after the first. PCRE normally treats such a -pattern as though it were preceded by \A. -

      -

      -In cases where it is known that the subject string contains no newlines, it is -worth setting PCRE_DOTALL in order to obtain this optimization, or -alternatively using ^ to indicate anchoring explicitly. -

      -

      -However, there are some cases where the optimization cannot be used. When .* -is inside capturing parentheses that are the subject of a back reference -elsewhere in the pattern, a match at the start may fail where a later one -succeeds. Consider, for example: -

      -  (.*)abc\1
      -
      -If the subject is "xyz123abc123" the match point is the fourth character. For -this reason, such a pattern is not implicitly anchored. -

      -

      -Another case where implicit anchoring is not applied is when the leading .* is -inside an atomic group. Once again, a match at the start may fail where a later -one succeeds. Consider this pattern: -

      -  (?>.*?a)b
      -
      -It matches "ab" in the subject "aab". The use of the backtracking control verbs -(*PRUNE) and (*SKIP) also disable this optimization. -

      -

      -When a capturing subpattern is repeated, the value captured is the substring -that matched the final iteration. For example, after -

      -  (tweedle[dume]{3}\s*)+
      -
      -has matched "tweedledum tweedledee" the value of the captured substring is -"tweedledee". However, if there are nested capturing subpatterns, the -corresponding captured values may have been set in previous iterations. For -example, after -
      -  /(a|(b))+/
      -
      -matches "aba" the value of the second captured substring is "b". -

      -
      ATOMIC GROUPING AND POSSESSIVE QUANTIFIERS
      -

      -With both maximizing ("greedy") and minimizing ("ungreedy" or "lazy") -repetition, failure of what follows normally causes the repeated item to be -re-evaluated to see if a different number of repeats allows the rest of the -pattern to match. Sometimes it is useful to prevent this, either to change the -nature of the match, or to cause it fail earlier than it otherwise might, when -the author of the pattern knows there is no point in carrying on. -

      -

      -Consider, for example, the pattern \d+foo when applied to the subject line -

      -  123456bar
      -
      -After matching all 6 digits and then failing to match "foo", the normal -action of the matcher is to try again with only 5 digits matching the \d+ -item, and then with 4, and so on, before ultimately failing. "Atomic grouping" -(a term taken from Jeffrey Friedl's book) provides the means for specifying -that once a subpattern has matched, it is not to be re-evaluated in this way. -

      -

      -If we use atomic grouping for the previous example, the matcher gives up -immediately on failing to match "foo" the first time. The notation is a kind of -special parenthesis, starting with (?> as in this example: -

      -  (?>\d+)foo
      -
      -This kind of parenthesis "locks up" the part of the pattern it contains once -it has matched, and a failure further into the pattern is prevented from -backtracking into it. Backtracking past it to previous items, however, works as -normal. -

      -

      -An alternative description is that a subpattern of this type matches the string -of characters that an identical standalone pattern would match, if anchored at -the current point in the subject string. -

      -

      -Atomic grouping subpatterns are not capturing subpatterns. Simple cases such as -the above example can be thought of as a maximizing repeat that must swallow -everything it can. So, while both \d+ and \d+? are prepared to adjust the -number of digits they match in order to make the rest of the pattern match, -(?>\d+) can only match an entire sequence of digits. -

      -

      -Atomic groups in general can of course contain arbitrarily complicated -subpatterns, and can be nested. However, when the subpattern for an atomic -group is just a single repeated item, as in the example above, a simpler -notation, called a "possessive quantifier" can be used. This consists of an -additional + character following a quantifier. Using this notation, the -previous example can be rewritten as -

      -  \d++foo
      -
      -Note that a possessive quantifier can be used with an entire group, for -example: -
      -  (abc|xyz){2,3}+
      -
      -Possessive quantifiers are always greedy; the setting of the PCRE_UNGREEDY -option is ignored. They are a convenient notation for the simpler forms of -atomic group. However, there is no difference in the meaning of a possessive -quantifier and the equivalent atomic group, though there may be a performance -difference; possessive quantifiers should be slightly faster. -

      -

      -The possessive quantifier syntax is an extension to the Perl 5.8 syntax. -Jeffrey Friedl originated the idea (and the name) in the first edition of his -book. Mike McCloskey liked it, so implemented it when he built Sun's Java -package, and PCRE copied it from there. It ultimately found its way into Perl -at release 5.10. -

      -

      -PCRE has an optimization that automatically "possessifies" certain simple -pattern constructs. For example, the sequence A+B is treated as A++B because -there is no point in backtracking into a sequence of A's when B must follow. -

      -

      -When a pattern contains an unlimited repeat inside a subpattern that can itself -be repeated an unlimited number of times, the use of an atomic group is the -only way to avoid some failing matches taking a very long time indeed. The -pattern -

      -  (\D+|<\d+>)*[!?]
      -
      -matches an unlimited number of substrings that either consist of non-digits, or -digits enclosed in <>, followed by either ! or ?. When it matches, it runs -quickly. However, if it is applied to -
      -  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
      -
      -it takes a long time before reporting failure. This is because the string can -be divided between the internal \D+ repeat and the external * repeat in a -large number of ways, and all have to be tried. (The example uses [!?] rather -than a single character at the end, because both PCRE and Perl have an -optimization that allows for fast failure when a single character is used. They -remember the last single character that is required for a match, and fail early -if it is not present in the string.) If the pattern is changed so that it uses -an atomic group, like this: -
      -  ((?>\D+)|<\d+>)*[!?]
      -
      -sequences of non-digits cannot be broken, and failure happens quickly. -

      -
      BACK REFERENCES
      -

      -Outside a character class, a backslash followed by a digit greater than 0 (and -possibly further digits) is a back reference to a capturing subpattern earlier -(that is, to its left) in the pattern, provided there have been that many -previous capturing left parentheses. -

      -

      -However, if the decimal number following the backslash is less than 10, it is -always taken as a back reference, and causes an error only if there are not -that many capturing left parentheses in the entire pattern. In other words, the -parentheses that are referenced need not be to the left of the reference for -numbers less than 10. A "forward back reference" of this type can make sense -when a repetition is involved and the subpattern to the right has participated -in an earlier iteration. -

      -

      -It is not possible to have a numerical "forward back reference" to a subpattern -whose number is 10 or more using this syntax because a sequence such as \50 is -interpreted as a character defined in octal. See the subsection entitled -"Non-printing characters" -above -for further details of the handling of digits following a backslash. There is -no such problem when named parentheses are used. A back reference to any -subpattern is possible using named parentheses (see below). -

      -

      -Another way of avoiding the ambiguity inherent in the use of digits following a -backslash is to use the \g escape sequence. This escape must be followed by an -unsigned number or a negative number, optionally enclosed in braces. These -examples are all identical: -

      -  (ring), \1
      -  (ring), \g1
      -  (ring), \g{1}
      -
      -An unsigned number specifies an absolute reference without the ambiguity that -is present in the older syntax. It is also useful when literal digits follow -the reference. A negative number is a relative reference. Consider this -example: -
      -  (abc(def)ghi)\g{-1}
      -
      -The sequence \g{-1} is a reference to the most recently started capturing -subpattern before \g, that is, is it equivalent to \2 in this example. -Similarly, \g{-2} would be equivalent to \1. The use of relative references -can be helpful in long patterns, and also in patterns that are created by -joining together fragments that contain references within themselves. -

      -

      -A back reference matches whatever actually matched the capturing subpattern in -the current subject string, rather than anything matching the subpattern -itself (see -"Subpatterns as subroutines" -below for a way of doing that). So the pattern -

      -  (sens|respons)e and \1ibility
      -
      -matches "sense and sensibility" and "response and responsibility", but not -"sense and responsibility". If caseful matching is in force at the time of the -back reference, the case of letters is relevant. For example, -
      -  ((?i)rah)\s+\1
      -
      -matches "rah rah" and "RAH RAH", but not "RAH rah", even though the original -capturing subpattern is matched caselessly. -

      -

      -There are several different ways of writing back references to named -subpatterns. The .NET syntax \k{name} and the Perl syntax \k<name> or -\k'name' are supported, as is the Python syntax (?P=name). Perl 5.10's unified -back reference syntax, in which \g can be used for both numeric and named -references, is also supported. We could rewrite the above example in any of -the following ways: -

      -  (?<p1>(?i)rah)\s+\k<p1>
      -  (?'p1'(?i)rah)\s+\k{p1}
      -  (?P<p1>(?i)rah)\s+(?P=p1)
      -  (?<p1>(?i)rah)\s+\g{p1}
      -
      -A subpattern that is referenced by name may appear in the pattern before or -after the reference. -

      -

      -There may be more than one back reference to the same subpattern. If a -subpattern has not actually been used in a particular match, any back -references to it always fail by default. For example, the pattern -

      -  (a|(bc))\2
      -
      -always fails if it starts to match "a" rather than "bc". However, if the -PCRE_JAVASCRIPT_COMPAT option is set at compile time, a back reference to an -unset value matches an empty string. -

      -

      -Because there may be many capturing parentheses in a pattern, all digits -following a backslash are taken as part of a potential back reference number. -If the pattern continues with a digit character, some delimiter must be used to -terminate the back reference. If the PCRE_EXTENDED option is set, this can be -white space. Otherwise, the \g{ syntax or an empty comment (see -"Comments" -below) can be used. -

      -
      -Recursive back references -
      -

      -A back reference that occurs inside the parentheses to which it refers fails -when the subpattern is first used, so, for example, (a\1) never matches. -However, such references can be useful inside repeated subpatterns. For -example, the pattern -

      -  (a|b\1)+
      -
      -matches any number of "a"s and also "aba", "ababbaa" etc. At each iteration of -the subpattern, the back reference matches the character string corresponding -to the previous iteration. In order for this to work, the pattern must be such -that the first iteration does not need to match the back reference. This can be -done using alternation, as in the example above, or by a quantifier with a -minimum of zero. -

      -

      -Back references of this type cause the group that they reference to be treated -as an -atomic group. -Once the whole group has been matched, a subsequent matching failure cannot -cause backtracking into the middle of the group. -

      -
      ASSERTIONS
      -

      -An assertion is a test on the characters following or preceding the current -matching point that does not actually consume any characters. The simple -assertions coded as \b, \B, \A, \G, \Z, \z, ^ and $ are described -above. -

      -

      -More complicated assertions are coded as subpatterns. There are two kinds: -those that look ahead of the current position in the subject string, and those -that look behind it. An assertion subpattern is matched in the normal way, -except that it does not cause the current matching position to be changed. -

      -

      -Assertion subpatterns are not capturing subpatterns. If such an assertion -contains capturing subpatterns within it, these are counted for the purposes of -numbering the capturing subpatterns in the whole pattern. However, substring -capturing is carried out only for positive assertions. (Perl sometimes, but not -always, does do capturing in negative assertions.) -

      -

      -WARNING: If a positive assertion containing one or more capturing subpatterns -succeeds, but failure to match later in the pattern causes backtracking over -this assertion, the captures within the assertion are reset only if no higher -numbered captures are already set. This is, unfortunately, a fundamental -limitation of the current implementation, and as PCRE1 is now in -maintenance-only status, it is unlikely ever to change. -

      -

      -For compatibility with Perl, assertion subpatterns may be repeated; though -it makes no sense to assert the same thing several times, the side effect of -capturing parentheses may occasionally be useful. In practice, there only three -cases: -
      -
      -(1) If the quantifier is {0}, the assertion is never obeyed during matching. -However, it may contain internal capturing parenthesized groups that are called -from elsewhere via the -subroutine mechanism. -
      -
      -(2) If quantifier is {0,n} where n is greater than zero, it is treated as if it -were {0,1}. At run time, the rest of the pattern match is tried with and -without the assertion, the order depending on the greediness of the quantifier. -
      -
      -(3) If the minimum repetition is greater than zero, the quantifier is ignored. -The assertion is obeyed just once when encountered during matching. -

      -
      -Lookahead assertions -
      -

      -Lookahead assertions start with (?= for positive assertions and (?! for -negative assertions. For example, -

      -  \w+(?=;)
      -
      -matches a word followed by a semicolon, but does not include the semicolon in -the match, and -
      -  foo(?!bar)
      -
      -matches any occurrence of "foo" that is not followed by "bar". Note that the -apparently similar pattern -
      -  (?!foo)bar
      -
      -does not find an occurrence of "bar" that is preceded by something other than -"foo"; it finds any occurrence of "bar" whatsoever, because the assertion -(?!foo) is always true when the next three characters are "bar". A -lookbehind assertion is needed to achieve the other effect. -

      -

      -If you want to force a matching failure at some point in a pattern, the most -convenient way to do it is with (?!) because an empty string always matches, so -an assertion that requires there not to be an empty string must always fail. -The backtracking control verb (*FAIL) or (*F) is a synonym for (?!). -

      -
      -Lookbehind assertions -
      -

      -Lookbehind assertions start with (?<= for positive assertions and (?<! for -negative assertions. For example, -

      -  (?<!foo)bar
      -
      -does find an occurrence of "bar" that is not preceded by "foo". The contents of -a lookbehind assertion are restricted such that all the strings it matches must -have a fixed length. However, if there are several top-level alternatives, they -do not all have to have the same fixed length. Thus -
      -  (?<=bullock|donkey)
      -
      -is permitted, but -
      -  (?<!dogs?|cats?)
      -
      -causes an error at compile time. Branches that match different length strings -are permitted only at the top level of a lookbehind assertion. This is an -extension compared with Perl, which requires all branches to match the same -length of string. An assertion such as -
      -  (?<=ab(c|de))
      -
      -is not permitted, because its single top-level branch can match two different -lengths, but it is acceptable to PCRE if rewritten to use two top-level -branches: -
      -  (?<=abc|abde)
      -
      -In some cases, the escape sequence \K -(see above) -can be used instead of a lookbehind assertion to get round the fixed-length -restriction. -

      -

      -The implementation of lookbehind assertions is, for each alternative, to -temporarily move the current position back by the fixed length and then try to -match. If there are insufficient characters before the current position, the -assertion fails. -

      -

      -In a UTF mode, PCRE does not allow the \C escape (which matches a single data -unit even in a UTF mode) to appear in lookbehind assertions, because it makes -it impossible to calculate the length of the lookbehind. The \X and \R -escapes, which can match different numbers of data units, are also not -permitted. -

      -

      -"Subroutine" -calls (see below) such as (?2) or (?&X) are permitted in lookbehinds, as long -as the subpattern matches a fixed-length string. -Recursion, -however, is not supported. -

      -

      -Possessive quantifiers can be used in conjunction with lookbehind assertions to -specify efficient matching of fixed-length strings at the end of subject -strings. Consider a simple pattern such as -

      -  abcd$
      -
      -when applied to a long string that does not match. Because matching proceeds -from left to right, PCRE will look for each "a" in the subject and then see if -what follows matches the rest of the pattern. If the pattern is specified as -
      -  ^.*abcd$
      -
      -the initial .* matches the entire string at first, but when this fails (because -there is no following "a"), it backtracks to match all but the last character, -then all but the last two characters, and so on. Once again the search for "a" -covers the entire string, from right to left, so we are no better off. However, -if the pattern is written as -
      -  ^.*+(?<=abcd)
      -
      -there can be no backtracking for the .*+ item; it can match only the entire -string. The subsequent lookbehind assertion does a single test on the last four -characters. If it fails, the match fails immediately. For long strings, this -approach makes a significant difference to the processing time. -

      -
      -Using multiple assertions -
      -

      -Several assertions (of any sort) may occur in succession. For example, -

      -  (?<=\d{3})(?<!999)foo
      -
      -matches "foo" preceded by three digits that are not "999". Notice that each of -the assertions is applied independently at the same point in the subject -string. First there is a check that the previous three characters are all -digits, and then there is a check that the same three characters are not "999". -This pattern does not match "foo" preceded by six characters, the first -of which are digits and the last three of which are not "999". For example, it -doesn't match "123abcfoo". A pattern to do that is -
      -  (?<=\d{3}...)(?<!999)foo
      -
      -This time the first assertion looks at the preceding six characters, checking -that the first three are digits, and then the second assertion checks that the -preceding three characters are not "999". -

      -

      -Assertions can be nested in any combination. For example, -

      -  (?<=(?<!foo)bar)baz
      -
      -matches an occurrence of "baz" that is preceded by "bar" which in turn is not -preceded by "foo", while -
      -  (?<=\d{3}(?!999)...)foo
      -
      -is another pattern that matches "foo" preceded by three digits and any three -characters that are not "999". -

      -
      CONDITIONAL SUBPATTERNS
      -

      -It is possible to cause the matching process to obey a subpattern -conditionally or to choose between two alternative subpatterns, depending on -the result of an assertion, or whether a specific capturing subpattern has -already been matched. The two possible forms of conditional subpattern are: -

      -  (?(condition)yes-pattern)
      -  (?(condition)yes-pattern|no-pattern)
      -
      -If the condition is satisfied, the yes-pattern is used; otherwise the -no-pattern (if present) is used. If there are more than two alternatives in the -subpattern, a compile-time error occurs. Each of the two alternatives may -itself contain nested subpatterns of any form, including conditional -subpatterns; the restriction to two alternatives applies only at the level of -the condition. This pattern fragment is an example where the alternatives are -complex: -
      -  (?(1) (A|B|C) | (D | (?(2)E|F) | E) )
      -
      -
      -

      -

      -There are four kinds of condition: references to subpatterns, references to -recursion, a pseudo-condition called DEFINE, and assertions. -

      -
      -Checking for a used subpattern by number -
      -

      -If the text between the parentheses consists of a sequence of digits, the -condition is true if a capturing subpattern of that number has previously -matched. If there is more than one capturing subpattern with the same number -(see the earlier -section about duplicate subpattern numbers), -the condition is true if any of them have matched. An alternative notation is -to precede the digits with a plus or minus sign. In this case, the subpattern -number is relative rather than absolute. The most recently opened parentheses -can be referenced by (?(-1), the next most recent by (?(-2), and so on. Inside -loops it can also make sense to refer to subsequent groups. The next -parentheses to be opened can be referenced as (?(+1), and so on. (The value -zero in any of these forms is not used; it provokes a compile-time error.) -

      -

      -Consider the following pattern, which contains non-significant white space to -make it more readable (assume the PCRE_EXTENDED option) and to divide it into -three parts for ease of discussion: -

      -  ( \( )?    [^()]+    (?(1) \) )
      -
      -The first part matches an optional opening parenthesis, and if that -character is present, sets it as the first captured substring. The second part -matches one or more characters that are not parentheses. The third part is a -conditional subpattern that tests whether or not the first set of parentheses -matched. If they did, that is, if subject started with an opening parenthesis, -the condition is true, and so the yes-pattern is executed and a closing -parenthesis is required. Otherwise, since no-pattern is not present, the -subpattern matches nothing. In other words, this pattern matches a sequence of -non-parentheses, optionally enclosed in parentheses. -

      -

      -If you were embedding this pattern in a larger one, you could use a relative -reference: -

      -  ...other stuff... ( \( )?    [^()]+    (?(-1) \) ) ...
      -
      -This makes the fragment independent of the parentheses in the larger pattern. -

      -
      -Checking for a used subpattern by name -
      -

      -Perl uses the syntax (?(<name>)...) or (?('name')...) to test for a used -subpattern by name. For compatibility with earlier versions of PCRE, which had -this facility before Perl, the syntax (?(name)...) is also recognized. -

      -

      -Rewriting the above example to use a named subpattern gives this: -

      -  (?<OPEN> \( )?    [^()]+    (?(<OPEN>) \) )
      -
      -If the name used in a condition of this kind is a duplicate, the test is -applied to all subpatterns of the same name, and is true if any one of them has -matched. -

      -
      -Checking for pattern recursion -
      -

      -If the condition is the string (R), and there is no subpattern with the name R, -the condition is true if a recursive call to the whole pattern or any -subpattern has been made. If digits or a name preceded by ampersand follow the -letter R, for example: -

      -  (?(R3)...) or (?(R&name)...)
      -
      -the condition is true if the most recent recursion is into a subpattern whose -number or name is given. This condition does not check the entire recursion -stack. If the name used in a condition of this kind is a duplicate, the test is -applied to all subpatterns of the same name, and is true if any one of them is -the most recent recursion. -

      -

      -At "top level", all these recursion test conditions are false. -The syntax for recursive patterns -is described below. -

      -
      -Defining subpatterns for use by reference only -
      -

      -If the condition is the string (DEFINE), and there is no subpattern with the -name DEFINE, the condition is always false. In this case, there may be only one -alternative in the subpattern. It is always skipped if control reaches this -point in the pattern; the idea of DEFINE is that it can be used to define -subroutines that can be referenced from elsewhere. (The use of -subroutines -is described below.) For example, a pattern to match an IPv4 address such as -"192.168.23.245" could be written like this (ignore white space and line -breaks): -

      -  (?(DEFINE) (?<byte> 2[0-4]\d | 25[0-5] | 1\d\d | [1-9]?\d) )
      -  \b (?&byte) (\.(?&byte)){3} \b
      -
      -The first part of the pattern is a DEFINE group inside which a another group -named "byte" is defined. This matches an individual component of an IPv4 -address (a number less than 256). When matching takes place, this part of the -pattern is skipped because DEFINE acts like a false condition. The rest of the -pattern uses references to the named group to match the four dot-separated -components of an IPv4 address, insisting on a word boundary at each end. -

      -
      -Assertion conditions -
      -

      -If the condition is not in any of the above formats, it must be an assertion. -This may be a positive or negative lookahead or lookbehind assertion. Consider -this pattern, again containing non-significant white space, and with the two -alternatives on the second line: -

      -  (?(?=[^a-z]*[a-z])
      -  \d{2}-[a-z]{3}-\d{2}  |  \d{2}-\d{2}-\d{2} )
      -
      -The condition is a positive lookahead assertion that matches an optional -sequence of non-letters followed by a letter. In other words, it tests for the -presence of at least one letter in the subject. If a letter is found, the -subject is matched against the first alternative; otherwise it is matched -against the second. This pattern matches strings in one of the two forms -dd-aaa-dd or dd-dd-dd, where aaa are letters and dd are digits. -

      -
      COMMENTS
      -

      -There are two ways of including comments in patterns that are processed by -PCRE. In both cases, the start of the comment must not be in a character class, -nor in the middle of any other sequence of related characters such as (?: or a -subpattern name or number. The characters that make up a comment play no part -in the pattern matching. -

      -

      -The sequence (?# marks the start of a comment that continues up to the next -closing parenthesis. Nested parentheses are not permitted. If the PCRE_EXTENDED -option is set, an unescaped # character also introduces a comment, which in -this case continues to immediately after the next newline character or -character sequence in the pattern. Which characters are interpreted as newlines -is controlled by the options passed to a compiling function or by a special -sequence at the start of the pattern, as described in the section entitled -"Newline conventions" -above. Note that the end of this type of comment is a literal newline sequence -in the pattern; escape sequences that happen to represent a newline do not -count. For example, consider this pattern when PCRE_EXTENDED is set, and the -default newline convention is in force: -

      -  abc #comment \n still comment
      -
      -On encountering the # character, pcre_compile() skips along, looking for -a newline in the pattern. The sequence \n is still literal at this stage, so -it does not terminate the comment. Only an actual character with the code value -0x0a (the default newline) does so. -

      -
      RECURSIVE PATTERNS
      -

      -Consider the problem of matching a string in parentheses, allowing for -unlimited nested parentheses. Without the use of recursion, the best that can -be done is to use a pattern that matches up to some fixed depth of nesting. It -is not possible to handle an arbitrary nesting depth. -

      -

      -For some time, Perl has provided a facility that allows regular expressions to -recurse (amongst other things). It does this by interpolating Perl code in the -expression at run time, and the code can refer to the expression itself. A Perl -pattern using code interpolation to solve the parentheses problem can be -created like this: -

      -  $re = qr{\( (?: (?>[^()]+) | (?p{$re}) )* \)}x;
      -
      -The (?p{...}) item interpolates Perl code at run time, and in this case refers -recursively to the pattern in which it appears. -

      -

      -Obviously, PCRE cannot support the interpolation of Perl code. Instead, it -supports special syntax for recursion of the entire pattern, and also for -individual subpattern recursion. After its introduction in PCRE and Python, -this kind of recursion was subsequently introduced into Perl at release 5.10. -

      -

      -A special item that consists of (? followed by a number greater than zero and a -closing parenthesis is a recursive subroutine call of the subpattern of the -given number, provided that it occurs inside that subpattern. (If not, it is a -non-recursive subroutine -call, which is described in the next section.) The special item (?R) or (?0) is -a recursive call of the entire regular expression. -

      -

      -This PCRE pattern solves the nested parentheses problem (assume the -PCRE_EXTENDED option is set so that white space is ignored): -

      -  \( ( [^()]++ | (?R) )* \)
      -
      -First it matches an opening parenthesis. Then it matches any number of -substrings which can either be a sequence of non-parentheses, or a recursive -match of the pattern itself (that is, a correctly parenthesized substring). -Finally there is a closing parenthesis. Note the use of a possessive quantifier -to avoid backtracking into sequences of non-parentheses. -

      -

      -If this were part of a larger pattern, you would not want to recurse the entire -pattern, so instead you could use this: -

      -  ( \( ( [^()]++ | (?1) )* \) )
      -
      -We have put the pattern into parentheses, and caused the recursion to refer to -them instead of the whole pattern. -

      -

      -In a larger pattern, keeping track of parenthesis numbers can be tricky. This -is made easier by the use of relative references. Instead of (?1) in the -pattern above you can write (?-2) to refer to the second most recently opened -parentheses preceding the recursion. In other words, a negative number counts -capturing parentheses leftwards from the point at which it is encountered. -

      -

      -It is also possible to refer to subsequently opened parentheses, by writing -references such as (?+2). However, these cannot be recursive because the -reference is not inside the parentheses that are referenced. They are always -non-recursive subroutine -calls, as described in the next section. -

      -

      -An alternative approach is to use named parentheses instead. The Perl syntax -for this is (?&name); PCRE's earlier syntax (?P>name) is also supported. We -could rewrite the above example as follows: -

      -  (?<pn> \( ( [^()]++ | (?&pn) )* \) )
      -
      -If there is more than one subpattern with the same name, the earliest one is -used. -

      -

      -This particular example pattern that we have been looking at contains nested -unlimited repeats, and so the use of a possessive quantifier for matching -strings of non-parentheses is important when applying the pattern to strings -that do not match. For example, when this pattern is applied to -

      -  (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()
      -
      -it yields "no match" quickly. However, if a possessive quantifier is not used, -the match runs for a very long time indeed because there are so many different -ways the + and * repeats can carve up the subject, and all have to be tested -before failure can be reported. -

      -

      -At the end of a match, the values of capturing parentheses are those from -the outermost level. If you want to obtain intermediate values, a callout -function can be used (see below and the -pcrecallout -documentation). If the pattern above is matched against -

      -  (ab(cd)ef)
      -
      -the value for the inner capturing parentheses (numbered 2) is "ef", which is -the last value taken on at the top level. If a capturing subpattern is not -matched at the top level, its final captured value is unset, even if it was -(temporarily) set at a deeper level during the matching process. -

      -

      -If there are more than 15 capturing parentheses in a pattern, PCRE has to -obtain extra memory to store data during a recursion, which it does by using -pcre_malloc, freeing it via pcre_free afterwards. If no memory can -be obtained, the match fails with the PCRE_ERROR_NOMEMORY error. -

      -

      -Do not confuse the (?R) item with the condition (R), which tests for recursion. -Consider this pattern, which matches text in angle brackets, allowing for -arbitrary nesting. Only digits are allowed in nested brackets (that is, when -recursing), whereas any characters are permitted at the outer level. -

      -  < (?: (?(R) \d++  | [^<>]*+) | (?R)) * >
      -
      -In this pattern, (?(R) is the start of a conditional subpattern, with two -different alternatives for the recursive and non-recursive cases. The (?R) item -is the actual recursive call. -

      -
      -Differences in recursion processing between PCRE and Perl -
      -

      -Recursion processing in PCRE differs from Perl in two important ways. In PCRE -(like Python, but unlike Perl), a recursive subpattern call is always treated -as an atomic group. That is, once it has matched some of the subject string, it -is never re-entered, even if it contains untried alternatives and there is a -subsequent matching failure. This can be illustrated by the following pattern, -which purports to match a palindromic string that contains an odd number of -characters (for example, "a", "aba", "abcba", "abcdcba"): -

      -  ^(.|(.)(?1)\2)$
      -
      -The idea is that it either matches a single character, or two identical -characters surrounding a sub-palindrome. In Perl, this pattern works; in PCRE -it does not if the pattern is longer than three characters. Consider the -subject string "abcba": -

      -

      -At the top level, the first character is matched, but as it is not at the end -of the string, the first alternative fails; the second alternative is taken -and the recursion kicks in. The recursive call to subpattern 1 successfully -matches the next character ("b"). (Note that the beginning and end of line -tests are not part of the recursion). -

      -

      -Back at the top level, the next character ("c") is compared with what -subpattern 2 matched, which was "a". This fails. Because the recursion is -treated as an atomic group, there are now no backtracking points, and so the -entire match fails. (Perl is able, at this point, to re-enter the recursion and -try the second alternative.) However, if the pattern is written with the -alternatives in the other order, things are different: -

      -  ^((.)(?1)\2|.)$
      -
      -This time, the recursing alternative is tried first, and continues to recurse -until it runs out of characters, at which point the recursion fails. But this -time we do have another alternative to try at the higher level. That is the big -difference: in the previous case the remaining alternative is at a deeper -recursion level, which PCRE cannot use. -

      -

      -To change the pattern so that it matches all palindromic strings, not just -those with an odd number of characters, it is tempting to change the pattern to -this: -

      -  ^((.)(?1)\2|.?)$
      -
      -Again, this works in Perl, but not in PCRE, and for the same reason. When a -deeper recursion has matched a single character, it cannot be entered again in -order to match an empty string. The solution is to separate the two cases, and -write out the odd and even cases as alternatives at the higher level: -
      -  ^(?:((.)(?1)\2|)|((.)(?3)\4|.))
      -
      -If you want to match typical palindromic phrases, the pattern has to ignore all -non-word characters, which can be done like this: -
      -  ^\W*+(?:((.)\W*+(?1)\W*+\2|)|((.)\W*+(?3)\W*+\4|\W*+.\W*+))\W*+$
      -
      -If run with the PCRE_CASELESS option, this pattern matches phrases such as "A -man, a plan, a canal: Panama!" and it works well in both PCRE and Perl. Note -the use of the possessive quantifier *+ to avoid backtracking into sequences of -non-word characters. Without this, PCRE takes a great deal longer (ten times or -more) to match typical phrases, and Perl takes so long that you think it has -gone into a loop. -

      -

      -WARNING: The palindrome-matching patterns above work only if the subject -string does not start with a palindrome that is shorter than the entire string. -For example, although "abcba" is correctly matched, if the subject is "ababa", -PCRE finds the palindrome "aba" at the start, then fails at top level because -the end of the string does not follow. Once again, it cannot jump back into the -recursion to try other alternatives, so the entire match fails. -

      -

      -The second way in which PCRE and Perl differ in their recursion processing is -in the handling of captured values. In Perl, when a subpattern is called -recursively or as a subpattern (see the next section), it has no access to any -values that were captured outside the recursion, whereas in PCRE these values -can be referenced. Consider this pattern: -

      -  ^(.)(\1|a(?2))
      -
      -In PCRE, this pattern matches "bab". The first capturing parentheses match "b", -then in the second group, when the back reference \1 fails to match "b", the -second alternative matches "a" and then recurses. In the recursion, \1 does -now match "b" and so the whole match succeeds. In Perl, the pattern fails to -match because inside the recursive call \1 cannot access the externally set -value. -

      -
      SUBPATTERNS AS SUBROUTINES
      -

      -If the syntax for a recursive subpattern call (either by number or by -name) is used outside the parentheses to which it refers, it operates like a -subroutine in a programming language. The called subpattern may be defined -before or after the reference. A numbered reference can be absolute or -relative, as in these examples: -

      -  (...(absolute)...)...(?2)...
      -  (...(relative)...)...(?-1)...
      -  (...(?+1)...(relative)...
      -
      -An earlier example pointed out that the pattern -
      -  (sens|respons)e and \1ibility
      -
      -matches "sense and sensibility" and "response and responsibility", but not -"sense and responsibility". If instead the pattern -
      -  (sens|respons)e and (?1)ibility
      -
      -is used, it does match "sense and responsibility" as well as the other two -strings. Another example is given in the discussion of DEFINE above. -

      -

      -All subroutine calls, whether recursive or not, are always treated as atomic -groups. That is, once a subroutine has matched some of the subject string, it -is never re-entered, even if it contains untried alternatives and there is a -subsequent matching failure. Any capturing parentheses that are set during the -subroutine call revert to their previous values afterwards. -

      -

      -Processing options such as case-independence are fixed when a subpattern is -defined, so if it is used as a subroutine, such options cannot be changed for -different calls. For example, consider this pattern: -

      -  (abc)(?i:(?-1))
      -
      -It matches "abcabc". It does not match "abcABC" because the change of -processing option does not affect the called subpattern. -

      -
      ONIGURUMA SUBROUTINE SYNTAX
      -

      -For compatibility with Oniguruma, the non-Perl syntax \g followed by a name or -a number enclosed either in angle brackets or single quotes, is an alternative -syntax for referencing a subpattern as a subroutine, possibly recursively. Here -are two of the examples used above, rewritten using this syntax: -

      -  (?<pn> \( ( (?>[^()]+) | \g<pn> )* \) )
      -  (sens|respons)e and \g'1'ibility
      -
      -PCRE supports an extension to Oniguruma: if a number is preceded by a -plus or a minus sign it is taken as a relative reference. For example: -
      -  (abc)(?i:\g<-1>)
      -
      -Note that \g{...} (Perl syntax) and \g<...> (Oniguruma syntax) are not -synonymous. The former is a back reference; the latter is a subroutine call. -

      -
      CALLOUTS
      -

      -Perl has a feature whereby using the sequence (?{...}) causes arbitrary Perl -code to be obeyed in the middle of matching a regular expression. This makes it -possible, amongst other things, to extract different substrings that match the -same pair of parentheses when there is a repetition. -

      -

      -PCRE provides a similar feature, but of course it cannot obey arbitrary Perl -code. The feature is called "callout". The caller of PCRE provides an external -function by putting its entry point in the global variable pcre_callout -(8-bit library) or pcre[16|32]_callout (16-bit or 32-bit library). -By default, this variable contains NULL, which disables all calling out. -

      -

      -Within a regular expression, (?C) indicates the points at which the external -function is to be called. If you want to identify different callout points, you -can put a number less than 256 after the letter C. The default value is zero. -For example, this pattern has two callout points: -

      -  (?C1)abc(?C2)def
      -
      -If the PCRE_AUTO_CALLOUT flag is passed to a compiling function, callouts are -automatically installed before each item in the pattern. They are all numbered -255. If there is a conditional group in the pattern whose condition is an -assertion, an additional callout is inserted just before the condition. An -explicit callout may also be set at this position, as in this example: -
      -  (?(?C9)(?=a)abc|def)
      -
      -Note that this applies only to assertion conditions, not to other types of -condition. -

      -

      -During matching, when PCRE reaches a callout point, the external function is -called. It is provided with the number of the callout, the position in the -pattern, and, optionally, one item of data originally supplied by the caller of -the matching function. The callout function may cause matching to proceed, to -backtrack, or to fail altogether. -

      -

      -By default, PCRE implements a number of optimizations at compile time and -matching time, and one side-effect is that sometimes callouts are skipped. If -you need all possible callouts to happen, you need to set options that disable -the relevant optimizations. More details, and a complete description of the -interface to the callout function, are given in the -pcrecallout -documentation. -

      -
      BACKTRACKING CONTROL
      -

      -Perl 5.10 introduced a number of "Special Backtracking Control Verbs", which -are still described in the Perl documentation as "experimental and subject to -change or removal in a future version of Perl". It goes on to say: "Their usage -in production code should be noted to avoid problems during upgrades." The same -remarks apply to the PCRE features described in this section. -

      -

      -The new verbs make use of what was previously invalid syntax: an opening -parenthesis followed by an asterisk. They are generally of the form -(*VERB) or (*VERB:NAME). Some may take either form, possibly behaving -differently depending on whether or not a name is present. A name is any -sequence of characters that does not include a closing parenthesis. The maximum -length of name is 255 in the 8-bit library and 65535 in the 16-bit and 32-bit -libraries. If the name is empty, that is, if the closing parenthesis -immediately follows the colon, the effect is as if the colon were not there. -Any number of these verbs may occur in a pattern. -

      -

      -Since these verbs are specifically related to backtracking, most of them can be -used only when the pattern is to be matched using one of the traditional -matching functions, because these use a backtracking algorithm. With the -exception of (*FAIL), which behaves like a failing negative assertion, the -backtracking control verbs cause an error if encountered by a DFA matching -function. -

      -

      -The behaviour of these verbs in -repeated groups, -assertions, -and in -subpatterns called as subroutines -(whether or not recursively) is documented below. -

      -
      -Optimizations that affect backtracking verbs -
      -

      -PCRE contains some optimizations that are used to speed up matching by running -some checks at the start of each match attempt. For example, it may know the -minimum length of matching subject, or that a particular character must be -present. When one of these optimizations bypasses the running of a match, any -included backtracking verbs will not, of course, be processed. You can suppress -the start-of-match optimizations by setting the PCRE_NO_START_OPTIMIZE option -when calling pcre_compile() or pcre_exec(), or by starting the -pattern with (*NO_START_OPT). There is more discussion of this option in the -section entitled -"Option bits for pcre_exec()" -in the -pcreapi -documentation. -

      -

      -Experiments with Perl suggest that it too has similar optimizations, sometimes -leading to anomalous results. -

      -
      -Verbs that act immediately -
      -

      -The following verbs act as soon as they are encountered. They may not be -followed by a name. -

      -   (*ACCEPT)
      -
      -This verb causes the match to end successfully, skipping the remainder of the -pattern. However, when it is inside a subpattern that is called as a -subroutine, only that subpattern is ended successfully. Matching then continues -at the outer level. If (*ACCEPT) in triggered in a positive assertion, the -assertion succeeds; in a negative assertion, the assertion fails. -

      -

      -If (*ACCEPT) is inside capturing parentheses, the data so far is captured. For -example: -

      -  A((?:A|B(*ACCEPT)|C)D)
      -
      -This matches "AB", "AAD", or "ACD"; when it matches "AB", "B" is captured by -the outer parentheses. -
      -  (*FAIL) or (*F)
      -
      -This verb causes a matching failure, forcing backtracking to occur. It is -equivalent to (?!) but easier to read. The Perl documentation notes that it is -probably useful only when combined with (?{}) or (??{}). Those are, of course, -Perl features that are not present in PCRE. The nearest equivalent is the -callout feature, as for example in this pattern: -
      -  a+(?C)(*FAIL)
      -
      -A match with the string "aaaa" always fails, but the callout is taken before -each backtrack happens (in this example, 10 times). -

      -
      -Recording which path was taken -
      -

      -There is one verb whose main purpose is to track how a match was arrived at, -though it also has a secondary use in conjunction with advancing the match -starting point (see (*SKIP) below). -

      -  (*MARK:NAME) or (*:NAME)
      -
      -A name is always required with this verb. There may be as many instances of -(*MARK) as you like in a pattern, and their names do not have to be unique. -

      -

      -When a match succeeds, the name of the last-encountered (*MARK:NAME), -(*PRUNE:NAME), or (*THEN:NAME) on the matching path is passed back to the -caller as described in the section entitled -"Extra data for pcre_exec()" -in the -pcreapi -documentation. Here is an example of pcretest output, where the /K -modifier requests the retrieval and outputting of (*MARK) data: -

      -    re> /X(*MARK:A)Y|X(*MARK:B)Z/K
      -  data> XY
      -   0: XY
      -  MK: A
      -  XZ
      -   0: XZ
      -  MK: B
      -
      -The (*MARK) name is tagged with "MK:" in this output, and in this example it -indicates which of the two alternatives matched. This is a more efficient way -of obtaining this information than putting each alternative in its own -capturing parentheses. -

      -

      -If a verb with a name is encountered in a positive assertion that is true, the -name is recorded and passed back if it is the last-encountered. This does not -happen for negative assertions or failing positive assertions. -

      -

      -After a partial match or a failed match, the last encountered name in the -entire match process is returned. For example: -

      -    re> /X(*MARK:A)Y|X(*MARK:B)Z/K
      -  data> XP
      -  No match, mark = B
      -
      -Note that in this unanchored example the mark is retained from the match -attempt that started at the letter "X" in the subject. Subsequent match -attempts starting at "P" and then with an empty string do not get as far as the -(*MARK) item, but nevertheless do not reset it. -

      -

      -If you are interested in (*MARK) values after failed matches, you should -probably set the PCRE_NO_START_OPTIMIZE option -(see above) -to ensure that the match is always attempted. -

      -
      -Verbs that act after backtracking -
      -

      -The following verbs do nothing when they are encountered. Matching continues -with what follows, but if there is no subsequent match, causing a backtrack to -the verb, a failure is forced. That is, backtracking cannot pass to the left of -the verb. However, when one of these verbs appears inside an atomic group or an -assertion that is true, its effect is confined to that group, because once the -group has been matched, there is never any backtracking into it. In this -situation, backtracking can "jump back" to the left of the entire atomic group -or assertion. (Remember also, as stated above, that this localization also -applies in subroutine calls.) -

      -

      -These verbs differ in exactly what kind of failure occurs when backtracking -reaches them. The behaviour described below is what happens when the verb is -not in a subroutine or an assertion. Subsequent sections cover these special -cases. -

      -  (*COMMIT)
      -
      -This verb, which may not be followed by a name, causes the whole match to fail -outright if there is a later matching failure that causes backtracking to reach -it. Even if the pattern is unanchored, no further attempts to find a match by -advancing the starting point take place. If (*COMMIT) is the only backtracking -verb that is encountered, once it has been passed pcre_exec() is -committed to finding a match at the current starting point, or not at all. For -example: -
      -  a+(*COMMIT)b
      -
      -This matches "xxaab" but not "aacaab". It can be thought of as a kind of -dynamic anchor, or "I've started, so I must finish." The name of the most -recently passed (*MARK) in the path is passed back when (*COMMIT) forces a -match failure. -

      -

      -If there is more than one backtracking verb in a pattern, a different one that -follows (*COMMIT) may be triggered first, so merely passing (*COMMIT) during a -match does not always guarantee that a match must be at this starting point. -

      -

      -Note that (*COMMIT) at the start of a pattern is not the same as an anchor, -unless PCRE's start-of-match optimizations are turned off, as shown in this -output from pcretest: -

      -    re> /(*COMMIT)abc/
      -  data> xyzabc
      -   0: abc
      -  data> xyzabc\Y
      -  No match
      -
      -For this pattern, PCRE knows that any match must start with "a", so the -optimization skips along the subject to "a" before applying the pattern to the -first set of data. The match attempt then succeeds. In the second set of data, -the escape sequence \Y is interpreted by the pcretest program. It causes -the PCRE_NO_START_OPTIMIZE option to be set when pcre_exec() is called. -This disables the optimization that skips along to the first character. The -pattern is now applied starting at "x", and so the (*COMMIT) causes the match -to fail without trying any other starting points. -
      -  (*PRUNE) or (*PRUNE:NAME)
      -
      -This verb causes the match to fail at the current starting position in the -subject if there is a later matching failure that causes backtracking to reach -it. If the pattern is unanchored, the normal "bumpalong" advance to the next -starting character then happens. Backtracking can occur as usual to the left of -(*PRUNE), before it is reached, or when matching to the right of (*PRUNE), but -if there is no match to the right, backtracking cannot cross (*PRUNE). In -simple cases, the use of (*PRUNE) is just an alternative to an atomic group or -possessive quantifier, but there are some uses of (*PRUNE) that cannot be -expressed in any other way. In an anchored pattern (*PRUNE) has the same effect -as (*COMMIT). -

      -

      -The behaviour of (*PRUNE:NAME) is the not the same as (*MARK:NAME)(*PRUNE). -It is like (*MARK:NAME) in that the name is remembered for passing back to the -caller. However, (*SKIP:NAME) searches only for names set with (*MARK). -

      -  (*SKIP)
      -
      -This verb, when given without a name, is like (*PRUNE), except that if the -pattern is unanchored, the "bumpalong" advance is not to the next character, -but to the position in the subject where (*SKIP) was encountered. (*SKIP) -signifies that whatever text was matched leading up to it cannot be part of a -successful match. Consider: -
      -  a+(*SKIP)b
      -
      -If the subject is "aaaac...", after the first match attempt fails (starting at -the first character in the string), the starting point skips on to start the -next attempt at "c". Note that a possessive quantifer does not have the same -effect as this example; although it would suppress backtracking during the -first match attempt, the second attempt would start at the second character -instead of skipping on to "c". -
      -  (*SKIP:NAME)
      -
      -When (*SKIP) has an associated name, its behaviour is modified. When it is -triggered, the previous path through the pattern is searched for the most -recent (*MARK) that has the same name. If one is found, the "bumpalong" advance -is to the subject position that corresponds to that (*MARK) instead of to where -(*SKIP) was encountered. If no (*MARK) with a matching name is found, the -(*SKIP) is ignored. -

      -

      -Note that (*SKIP:NAME) searches only for names set by (*MARK:NAME). It ignores -names that are set by (*PRUNE:NAME) or (*THEN:NAME). -

      -  (*THEN) or (*THEN:NAME)
      -
      -This verb causes a skip to the next innermost alternative when backtracking -reaches it. That is, it cancels any further backtracking within the current -alternative. Its name comes from the observation that it can be used for a -pattern-based if-then-else block: -
      -  ( COND1 (*THEN) FOO | COND2 (*THEN) BAR | COND3 (*THEN) BAZ ) ...
      -
      -If the COND1 pattern matches, FOO is tried (and possibly further items after -the end of the group if FOO succeeds); on failure, the matcher skips to the -second alternative and tries COND2, without backtracking into COND1. If that -succeeds and BAR fails, COND3 is tried. If subsequently BAZ fails, there are no -more alternatives, so there is a backtrack to whatever came before the entire -group. If (*THEN) is not inside an alternation, it acts like (*PRUNE). -

      -

      -The behaviour of (*THEN:NAME) is the not the same as (*MARK:NAME)(*THEN). -It is like (*MARK:NAME) in that the name is remembered for passing back to the -caller. However, (*SKIP:NAME) searches only for names set with (*MARK). -

      -

      -A subpattern that does not contain a | character is just a part of the -enclosing alternative; it is not a nested alternation with only one -alternative. The effect of (*THEN) extends beyond such a subpattern to the -enclosing alternative. Consider this pattern, where A, B, etc. are complex -pattern fragments that do not contain any | characters at this level: -

      -  A (B(*THEN)C) | D
      -
      -If A and B are matched, but there is a failure in C, matching does not -backtrack into A; instead it moves to the next alternative, that is, D. -However, if the subpattern containing (*THEN) is given an alternative, it -behaves differently: -
      -  A (B(*THEN)C | (*FAIL)) | D
      -
      -The effect of (*THEN) is now confined to the inner subpattern. After a failure -in C, matching moves to (*FAIL), which causes the whole subpattern to fail -because there are no more alternatives to try. In this case, matching does now -backtrack into A. -

      -

      -Note that a conditional subpattern is not considered as having two -alternatives, because only one is ever used. In other words, the | character in -a conditional subpattern has a different meaning. Ignoring white space, -consider: -

      -  ^.*? (?(?=a) a | b(*THEN)c )
      -
      -If the subject is "ba", this pattern does not match. Because .*? is ungreedy, -it initially matches zero characters. The condition (?=a) then fails, the -character "b" is matched, but "c" is not. At this point, matching does not -backtrack to .*? as might perhaps be expected from the presence of the | -character. The conditional subpattern is part of the single alternative that -comprises the whole pattern, and so the match fails. (If there was a backtrack -into .*?, allowing it to match "b", the match would succeed.) -

      -

      -The verbs just described provide four different "strengths" of control when -subsequent matching fails. (*THEN) is the weakest, carrying on the match at the -next alternative. (*PRUNE) comes next, failing the match at the current -starting position, but allowing an advance to the next character (for an -unanchored pattern). (*SKIP) is similar, except that the advance may be more -than one character. (*COMMIT) is the strongest, causing the entire match to -fail. -

      -
      -More than one backtracking verb -
      -

      -If more than one backtracking verb is present in a pattern, the one that is -backtracked onto first acts. For example, consider this pattern, where A, B, -etc. are complex pattern fragments: -

      -  (A(*COMMIT)B(*THEN)C|ABD)
      -
      -If A matches but B fails, the backtrack to (*COMMIT) causes the entire match to -fail. However, if A and B match, but C fails, the backtrack to (*THEN) causes -the next alternative (ABD) to be tried. This behaviour is consistent, but is -not always the same as Perl's. It means that if two or more backtracking verbs -appear in succession, all the the last of them has no effect. Consider this -example: -
      -  ...(*COMMIT)(*PRUNE)...
      -
      -If there is a matching failure to the right, backtracking onto (*PRUNE) causes -it to be triggered, and its action is taken. There can never be a backtrack -onto (*COMMIT). -

      -
      -Backtracking verbs in repeated groups -
      -

      -PCRE differs from Perl in its handling of backtracking verbs in repeated -groups. For example, consider: -

      -  /(a(*COMMIT)b)+ac/
      -
      -If the subject is "abac", Perl matches, but PCRE fails because the (*COMMIT) in -the second repeat of the group acts. -

      -
      -Backtracking verbs in assertions -
      -

      -(*FAIL) in an assertion has its normal effect: it forces an immediate backtrack. -

      -

      -(*ACCEPT) in a positive assertion causes the assertion to succeed without any -further processing. In a negative assertion, (*ACCEPT) causes the assertion to -fail without any further processing. -

      -

      -The other backtracking verbs are not treated specially if they appear in a -positive assertion. In particular, (*THEN) skips to the next alternative in the -innermost enclosing group that has alternations, whether or not this is within -the assertion. -

      -

      -Negative assertions are, however, different, in order to ensure that changing a -positive assertion into a negative assertion changes its result. Backtracking -into (*COMMIT), (*SKIP), or (*PRUNE) causes a negative assertion to be true, -without considering any further alternative branches in the assertion. -Backtracking into (*THEN) causes it to skip to the next enclosing alternative -within the assertion (the normal behaviour), but if the assertion does not have -such an alternative, (*THEN) behaves like (*PRUNE). -

      -
      -Backtracking verbs in subroutines -
      -

      -These behaviours occur whether or not the subpattern is called recursively. -Perl's treatment of subroutines is different in some cases. -

      -

      -(*FAIL) in a subpattern called as a subroutine has its normal effect: it forces -an immediate backtrack. -

      -

      -(*ACCEPT) in a subpattern called as a subroutine causes the subroutine match to -succeed without any further processing. Matching then continues after the -subroutine call. -

      -

      -(*COMMIT), (*SKIP), and (*PRUNE) in a subpattern called as a subroutine cause -the subroutine match to fail. -

      -

      -(*THEN) skips to the next alternative in the innermost enclosing group within -the subpattern that has alternatives. If there is no such group within the -subpattern, (*THEN) causes the subroutine match to fail. -

      -
      SEE ALSO
      -

      -pcreapi(3), pcrecallout(3), pcrematching(3), -pcresyntax(3), pcre(3), pcre16(3), pcre32(3). -

      -
      AUTHOR
      -

      -Philip Hazel -
      -University Computing Service -
      -Cambridge CB2 3QH, England. -
      -

      -
      REVISION
      -

      -Last updated: 23 October 2016 -
      -Copyright © 1997-2016 University of Cambridge. -
      -

      -Return to the PCRE index page. -

      diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcreperform.html b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcreperform.html deleted file mode 100644 index dda207f9..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcreperform.html +++ /dev/null @@ -1,195 +0,0 @@ - - -pcreperform specification - - -

      pcreperform man page

      -

      -Return to the PCRE index page. -

      -

      -This page is part of the PCRE HTML documentation. It was generated automatically -from the original man page. If there is any nonsense in it, please consult the -man page, in case the conversion went wrong. -
      -
      -PCRE PERFORMANCE -
      -

      -Two aspects of performance are discussed below: memory usage and processing -time. The way you express your pattern as a regular expression can affect both -of them. -

      -
      -COMPILED PATTERN MEMORY USAGE -
      -

      -Patterns are compiled by PCRE into a reasonably efficient interpretive code, so -that most simple patterns do not use much memory. However, there is one case -where the memory usage of a compiled pattern can be unexpectedly large. If a -parenthesized subpattern has a quantifier with a minimum greater than 1 and/or -a limited maximum, the whole subpattern is repeated in the compiled code. For -example, the pattern -

      -  (abc|def){2,4}
      -
      -is compiled as if it were -
      -  (abc|def)(abc|def)((abc|def)(abc|def)?)?
      -
      -(Technical aside: It is done this way so that backtrack points within each of -the repetitions can be independently maintained.) -

      -

      -For regular expressions whose quantifiers use only small numbers, this is not -usually a problem. However, if the numbers are large, and particularly if such -repetitions are nested, the memory usage can become an embarrassment. For -example, the very simple pattern -

      -  ((ab){1,1000}c){1,3}
      -
      -uses 51K bytes when compiled using the 8-bit library. When PCRE is compiled -with its default internal pointer size of two bytes, the size limit on a -compiled pattern is 64K data units, and this is reached with the above pattern -if the outer repetition is increased from 3 to 4. PCRE can be compiled to use -larger internal pointers and thus handle larger compiled patterns, but it is -better to try to rewrite your pattern to use less memory if you can. -

      -

      -One way of reducing the memory usage for such patterns is to make use of PCRE's -"subroutine" -facility. Re-writing the above pattern as -

      -  ((ab)(?2){0,999}c)(?1){0,2}
      -
      -reduces the memory requirements to 18K, and indeed it remains under 20K even -with the outer repetition increased to 100. However, this pattern is not -exactly equivalent, because the "subroutine" calls are treated as -atomic groups -into which there can be no backtracking if there is a subsequent matching -failure. Therefore, PCRE cannot do this kind of rewriting automatically. -Furthermore, there is a noticeable loss of speed when executing the modified -pattern. Nevertheless, if the atomic grouping is not a problem and the loss of -speed is acceptable, this kind of rewriting will allow you to process patterns -that PCRE cannot otherwise handle. -

      -
      -STACK USAGE AT RUN TIME -
      -

      -When pcre_exec() or pcre[16|32]_exec() is used for matching, certain -kinds of pattern can cause it to use large amounts of the process stack. In -some environments the default process stack is quite small, and if it runs out -the result is often SIGSEGV. This issue is probably the most frequently raised -problem with PCRE. Rewriting your pattern can often help. The -pcrestack -documentation discusses this issue in detail. -

      -
      -PROCESSING TIME -
      -

      -Certain items in regular expression patterns are processed more efficiently -than others. It is more efficient to use a character class like [aeiou] than a -set of single-character alternatives such as (a|e|i|o|u). In general, the -simplest construction that provides the required behaviour is usually the most -efficient. Jeffrey Friedl's book contains a lot of useful general discussion -about optimizing regular expressions for efficient performance. This document -contains a few observations about PCRE. -

      -

      -Using Unicode character properties (the \p, \P, and \X escapes) is slow, -because PCRE has to use a multi-stage table lookup whenever it needs a -character's property. If you can find an alternative pattern that does not use -character properties, it will probably be faster. -

      -

      -By default, the escape sequences \b, \d, \s, and \w, and the POSIX -character classes such as [:alpha:] do not use Unicode properties, partly for -backwards compatibility, and partly for performance reasons. However, you can -set PCRE_UCP if you want Unicode character properties to be used. This can -double the matching time for items such as \d, when matched with -a traditional matching function; the performance loss is less with -a DFA matching function, and in both cases there is not much difference for -\b. -

      -

      -When a pattern begins with .* not in parentheses, or in parentheses that are -not the subject of a backreference, and the PCRE_DOTALL option is set, the -pattern is implicitly anchored by PCRE, since it can match only at the start of -a subject string. However, if PCRE_DOTALL is not set, PCRE cannot make this -optimization, because the . metacharacter does not then match a newline, and if -the subject string contains newlines, the pattern may match from the character -immediately following one of them instead of from the very start. For example, -the pattern -

      -  .*second
      -
      -matches the subject "first\nand second" (where \n stands for a newline -character), with the match starting at the seventh character. In order to do -this, PCRE has to retry the match starting after every newline in the subject. -

      -

      -If you are using such a pattern with subject strings that do not contain -newlines, the best performance is obtained by setting PCRE_DOTALL, or starting -the pattern with ^.* or ^.*? to indicate explicit anchoring. That saves PCRE -from having to scan along the subject looking for a newline to restart at. -

      -

      -Beware of patterns that contain nested indefinite repeats. These can take a -long time to run when applied to a string that does not match. Consider the -pattern fragment -

      -  ^(a+)*
      -
      -This can match "aaaa" in 16 different ways, and this number increases very -rapidly as the string gets longer. (The * repeat can match 0, 1, 2, 3, or 4 -times, and for each of those cases other than 0 or 4, the + repeats can match -different numbers of times.) When the remainder of the pattern is such that the -entire match is going to fail, PCRE has in principle to try every possible -variation, and this can take an extremely long time, even for relatively short -strings. -

      -

      -An optimization catches some of the more simple cases such as -

      -  (a+)*b
      -
      -where a literal character follows. Before embarking on the standard matching -procedure, PCRE checks that there is a "b" later in the subject string, and if -there is not, it fails the match immediately. However, when there is no -following literal this optimization cannot be used. You can see the difference -by comparing the behaviour of -
      -  (a+)*\d
      -
      -with the pattern above. The former gives a failure almost instantly when -applied to a whole line of "a" characters, whereas the latter takes an -appreciable time with strings longer than about 20 characters. -

      -

      -In many cases, the solution to this kind of performance issue is to use an -atomic group or a possessive quantifier. -

      -
      -AUTHOR -
      -

      -Philip Hazel -
      -University Computing Service -
      -Cambridge CB2 3QH, England. -
      -

      -
      -REVISION -
      -

      -Last updated: 25 August 2012 -
      -Copyright © 1997-2012 University of Cambridge. -
      -

      -Return to the PCRE index page. -

      diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcreposix.html b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcreposix.html deleted file mode 100644 index 18924cf7..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcreposix.html +++ /dev/null @@ -1,290 +0,0 @@ - - -pcreposix specification - - -

      pcreposix man page

      -

      -Return to the PCRE index page. -

      -

      -This page is part of the PCRE HTML documentation. It was generated automatically -from the original man page. If there is any nonsense in it, please consult the -man page, in case the conversion went wrong. -
      -

      -
      SYNOPSIS
      -

      -#include <pcreposix.h> -

      -

      -int regcomp(regex_t *preg, const char *pattern, - int cflags); -
      -
      -int regexec(regex_t *preg, const char *string, - size_t nmatch, regmatch_t pmatch[], int eflags); - size_t regerror(int errcode, const regex_t *preg, - char *errbuf, size_t errbuf_size); -
      -
      -void regfree(regex_t *preg); -

      -
      DESCRIPTION
      -

      -This set of functions provides a POSIX-style API for the PCRE regular -expression 8-bit library. See the -pcreapi -documentation for a description of PCRE's native API, which contains much -additional functionality. There is no POSIX-style wrapper for PCRE's 16-bit -and 32-bit library. -

      -

      -The functions described here are just wrapper functions that ultimately call -the PCRE native API. Their prototypes are defined in the pcreposix.h -header file, and on Unix systems the library itself is called -pcreposix.a, so can be accessed by adding -lpcreposix to the -command for linking an application that uses them. Because the POSIX functions -call the native ones, it is also necessary to add -lpcre. -

      -

      -I have implemented only those POSIX option bits that can be reasonably mapped -to PCRE native options. In addition, the option REG_EXTENDED is defined with -the value zero. This has no effect, but since programs that are written to the -POSIX interface often use it, this makes it easier to slot in PCRE as a -replacement library. Other POSIX options are not even defined. -

      -

      -There are also some other options that are not defined by POSIX. These have -been added at the request of users who want to make use of certain -PCRE-specific features via the POSIX calling interface. -

      -

      -When PCRE is called via these functions, it is only the API that is POSIX-like -in style. The syntax and semantics of the regular expressions themselves are -still those of Perl, subject to the setting of various PCRE options, as -described below. "POSIX-like in style" means that the API approximates to the -POSIX definition; it is not fully POSIX-compatible, and in multi-byte encoding -domains it is probably even less compatible. -

      -

      -The header for these functions is supplied as pcreposix.h to avoid any -potential clash with other POSIX libraries. It can, of course, be renamed or -aliased as regex.h, which is the "correct" name. It provides two -structure types, regex_t for compiled internal forms, and -regmatch_t for returning captured substrings. It also defines some -constants whose names start with "REG_"; these are used for setting options and -identifying error codes. -

      -
      COMPILING A PATTERN
      -

      -The function regcomp() is called to compile a pattern into an -internal form. The pattern is a C string terminated by a binary zero, and -is passed in the argument pattern. The preg argument is a pointer -to a regex_t structure that is used as a base for storing information -about the compiled regular expression. -

      -

      -The argument cflags is either zero, or contains one or more of the bits -defined by the following macros: -

      -  REG_DOTALL
      -
      -The PCRE_DOTALL option is set when the regular expression is passed for -compilation to the native function. Note that REG_DOTALL is not part of the -POSIX standard. -
      -  REG_ICASE
      -
      -The PCRE_CASELESS option is set when the regular expression is passed for -compilation to the native function. -
      -  REG_NEWLINE
      -
      -The PCRE_MULTILINE option is set when the regular expression is passed for -compilation to the native function. Note that this does not mimic the -defined POSIX behaviour for REG_NEWLINE (see the following section). -
      -  REG_NOSUB
      -
      -The PCRE_NO_AUTO_CAPTURE option is set when the regular expression is passed -for compilation to the native function. In addition, when a pattern that is -compiled with this flag is passed to regexec() for matching, the -nmatch and pmatch arguments are ignored, and no captured strings -are returned. -
      -  REG_UCP
      -
      -The PCRE_UCP option is set when the regular expression is passed for -compilation to the native function. This causes PCRE to use Unicode properties -when matchine \d, \w, etc., instead of just recognizing ASCII values. Note -that REG_UTF8 is not part of the POSIX standard. -
      -  REG_UNGREEDY
      -
      -The PCRE_UNGREEDY option is set when the regular expression is passed for -compilation to the native function. Note that REG_UNGREEDY is not part of the -POSIX standard. -
      -  REG_UTF8
      -
      -The PCRE_UTF8 option is set when the regular expression is passed for -compilation to the native function. This causes the pattern itself and all data -strings used for matching it to be treated as UTF-8 strings. Note that REG_UTF8 -is not part of the POSIX standard. -

      -

      -In the absence of these flags, no options are passed to the native function. -This means the the regex is compiled with PCRE default semantics. In -particular, the way it handles newline characters in the subject string is the -Perl way, not the POSIX way. Note that setting PCRE_MULTILINE has only -some of the effects specified for REG_NEWLINE. It does not affect the way -newlines are matched by . (they are not) or by a negative class such as [^a] -(they are). -

      -

      -The yield of regcomp() is zero on success, and non-zero otherwise. The -preg structure is filled in on success, and one member of the structure -is public: re_nsub contains the number of capturing subpatterns in -the regular expression. Various error codes are defined in the header file. -

      -

      -NOTE: If the yield of regcomp() is non-zero, you must not attempt to -use the contents of the preg structure. If, for example, you pass it to -regexec(), the result is undefined and your program is likely to crash. -

      -
      MATCHING NEWLINE CHARACTERS
      -

      -This area is not simple, because POSIX and Perl take different views of things. -It is not possible to get PCRE to obey POSIX semantics, but then PCRE was never -intended to be a POSIX engine. The following table lists the different -possibilities for matching newline characters in PCRE: -

      -                          Default   Change with
      -
      -  . matches newline          no     PCRE_DOTALL
      -  newline matches [^a]       yes    not changeable
      -  $ matches \n at end        yes    PCRE_DOLLARENDONLY
      -  $ matches \n in middle     no     PCRE_MULTILINE
      -  ^ matches \n in middle     no     PCRE_MULTILINE
      -
      -This is the equivalent table for POSIX: -
      -                          Default   Change with
      -
      -  . matches newline          yes    REG_NEWLINE
      -  newline matches [^a]       yes    REG_NEWLINE
      -  $ matches \n at end        no     REG_NEWLINE
      -  $ matches \n in middle     no     REG_NEWLINE
      -  ^ matches \n in middle     no     REG_NEWLINE
      -
      -PCRE's behaviour is the same as Perl's, except that there is no equivalent for -PCRE_DOLLAR_ENDONLY in Perl. In both PCRE and Perl, there is no way to stop -newline from matching [^a]. -

      -

      -The default POSIX newline handling can be obtained by setting PCRE_DOTALL and -PCRE_DOLLAR_ENDONLY, but there is no way to make PCRE behave exactly as for the -REG_NEWLINE action. -

      -
      MATCHING A PATTERN
      -

      -The function regexec() is called to match a compiled pattern preg -against a given string, which is by default terminated by a zero byte -(but see REG_STARTEND below), subject to the options in eflags. These can -be: -

      -  REG_NOTBOL
      -
      -The PCRE_NOTBOL option is set when calling the underlying PCRE matching -function. -
      -  REG_NOTEMPTY
      -
      -The PCRE_NOTEMPTY option is set when calling the underlying PCRE matching -function. Note that REG_NOTEMPTY is not part of the POSIX standard. However, -setting this option can give more POSIX-like behaviour in some situations. -
      -  REG_NOTEOL
      -
      -The PCRE_NOTEOL option is set when calling the underlying PCRE matching -function. -
      -  REG_STARTEND
      -
      -The string is considered to start at string + pmatch[0].rm_so and -to have a terminating NUL located at string + pmatch[0].rm_eo -(there need not actually be a NUL at that location), regardless of the value of -nmatch. This is a BSD extension, compatible with but not specified by -IEEE Standard 1003.2 (POSIX.2), and should be used with caution in software -intended to be portable to other systems. Note that a non-zero rm_so does -not imply REG_NOTBOL; REG_STARTEND affects only the location of the string, not -how it is matched. -

      -

      -If the pattern was compiled with the REG_NOSUB flag, no data about any matched -strings is returned. The nmatch and pmatch arguments of -regexec() are ignored. -

      -

      -If the value of nmatch is zero, or if the value pmatch is NULL, -no data about any matched strings is returned. -

      -

      -Otherwise,the portion of the string that was matched, and also any captured -substrings, are returned via the pmatch argument, which points to an -array of nmatch structures of type regmatch_t, containing the -members rm_so and rm_eo. These contain the offset to the first -character of each substring and the offset to the first character after the end -of each substring, respectively. The 0th element of the vector relates to the -entire portion of string that was matched; subsequent elements relate to -the capturing subpatterns of the regular expression. Unused entries in the -array have both structure members set to -1. -

      -

      -A successful match yields a zero return; various error codes are defined in the -header file, of which REG_NOMATCH is the "expected" failure code. -

      -
      ERROR MESSAGES
      -

      -The regerror() function maps a non-zero errorcode from either -regcomp() or regexec() to a printable message. If preg is not -NULL, the error should have arisen from the use of that structure. A message -terminated by a binary zero is placed in errbuf. The length of the -message, including the zero, is limited to errbuf_size. The yield of the -function is the size of buffer needed to hold the whole message. -

      -
      MEMORY USAGE
      -

      -Compiling a regular expression causes memory to be allocated and associated -with the preg structure. The function regfree() frees all such -memory, after which preg may no longer be used as a compiled expression. -

      -
      AUTHOR
      -

      -Philip Hazel -
      -University Computing Service -
      -Cambridge CB2 3QH, England. -
      -

      -
      REVISION
      -

      -Last updated: 09 January 2012 -
      -Copyright © 1997-2012 University of Cambridge. -
      -

      -Return to the PCRE index page. -

      diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcreprecompile.html b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcreprecompile.html deleted file mode 100644 index decb1d6c..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcreprecompile.html +++ /dev/null @@ -1,163 +0,0 @@ - - -pcreprecompile specification - - -

      pcreprecompile man page

      -

      -Return to the PCRE index page. -

      -

      -This page is part of the PCRE HTML documentation. It was generated automatically -from the original man page. If there is any nonsense in it, please consult the -man page, in case the conversion went wrong. -
      -

      -
      SAVING AND RE-USING PRECOMPILED PCRE PATTERNS
      -

      -If you are running an application that uses a large number of regular -expression patterns, it may be useful to store them in a precompiled form -instead of having to compile them every time the application is run. -If you are not using any private character tables (see the -pcre_maketables() -documentation), this is relatively straightforward. If you are using private -tables, it is a little bit more complicated. However, if you are using the -just-in-time optimization feature, it is not possible to save and reload the -JIT data. -

      -

      -If you save compiled patterns to a file, you can copy them to a different host -and run them there. If the two hosts have different endianness (byte order), -you should run the pcre[16|32]_pattern_to_host_byte_order() function on the -new host before trying to match the pattern. The matching functions return -PCRE_ERROR_BADENDIANNESS if they detect a pattern with the wrong endianness. -

      -

      -Compiling regular expressions with one version of PCRE for use with a different -version is not guaranteed to work and may cause crashes, and saving and -restoring a compiled pattern loses any JIT optimization data. -

      -
      SAVING A COMPILED PATTERN
      -

      -The value returned by pcre[16|32]_compile() points to a single block of -memory that holds the compiled pattern and associated data. You can find the -length of this block in bytes by calling pcre[16|32]_fullinfo() with an -argument of PCRE_INFO_SIZE. You can then save the data in any appropriate -manner. Here is sample code for the 8-bit library that compiles a pattern and -writes it to a file. It assumes that the variable fd refers to a file -that is open for output: -

      -  int erroroffset, rc, size;
      -  char *error;
      -  pcre *re;
      -
      -  re = pcre_compile("my pattern", 0, &error, &erroroffset, NULL);
      -  if (re == NULL) { ... handle errors ... }
      -  rc = pcre_fullinfo(re, NULL, PCRE_INFO_SIZE, &size);
      -  if (rc < 0) { ... handle errors ... }
      -  rc = fwrite(re, 1, size, fd);
      -  if (rc != size) { ... handle errors ... }
      -
      -In this example, the bytes that comprise the compiled pattern are copied -exactly. Note that this is binary data that may contain any of the 256 possible -byte values. On systems that make a distinction between binary and non-binary -data, be sure that the file is opened for binary output. -

      -

      -If you want to write more than one pattern to a file, you will have to devise a -way of separating them. For binary data, preceding each pattern with its length -is probably the most straightforward approach. Another possibility is to write -out the data in hexadecimal instead of binary, one pattern to a line. -

      -

      -Saving compiled patterns in a file is only one possible way of storing them for -later use. They could equally well be saved in a database, or in the memory of -some daemon process that passes them via sockets to the processes that want -them. -

      -

      -If the pattern has been studied, it is also possible to save the normal study -data in a similar way to the compiled pattern itself. However, if the -PCRE_STUDY_JIT_COMPILE was used, the just-in-time data that is created cannot -be saved because it is too dependent on the current environment. When studying -generates additional information, pcre[16|32]_study() returns a pointer to a -pcre[16|32]_extra data block. Its format is defined in the -section on matching a pattern -in the -pcreapi -documentation. The study_data field points to the binary study data, and -this is what you must save (not the pcre[16|32]_extra block itself). The -length of the study data can be obtained by calling pcre[16|32]_fullinfo() -with an argument of PCRE_INFO_STUDYSIZE. Remember to check that -pcre[16|32]_study() did return a non-NULL value before trying to save the -study data. -

      -
      RE-USING A PRECOMPILED PATTERN
      -

      -Re-using a precompiled pattern is straightforward. Having reloaded it into main -memory, called pcre[16|32]_pattern_to_host_byte_order() if necessary, you -pass its pointer to pcre[16|32]_exec() or pcre[16|32]_dfa_exec() in -the usual way. -

      -

      -However, if you passed a pointer to custom character tables when the pattern -was compiled (the tableptr argument of pcre[16|32]_compile()), you -must now pass a similar pointer to pcre[16|32]_exec() or -pcre[16|32]_dfa_exec(), because the value saved with the compiled pattern -will obviously be nonsense. A field in a pcre[16|32]_extra() block is used -to pass this data, as described in the -section on matching a pattern -in the -pcreapi -documentation. -

      -

      -Warning: The tables that pcre_exec() and pcre_dfa_exec() use -must be the same as those that were used when the pattern was compiled. If this -is not the case, the behaviour is undefined. -

      -

      -If you did not provide custom character tables when the pattern was compiled, -the pointer in the compiled pattern is NULL, which causes the matching -functions to use PCRE's internal tables. Thus, you do not need to take any -special action at run time in this case. -

      -

      -If you saved study data with the compiled pattern, you need to create your own -pcre[16|32]_extra data block and set the study_data field to point -to the reloaded study data. You must also set the PCRE_EXTRA_STUDY_DATA bit in -the flags field to indicate that study data is present. Then pass the -pcre[16|32]_extra block to the matching function in the usual way. If the -pattern was studied for just-in-time optimization, that data cannot be saved, -and so is lost by a save/restore cycle. -

      -
      COMPATIBILITY WITH DIFFERENT PCRE RELEASES
      -

      -In general, it is safest to recompile all saved patterns when you update to a -new PCRE release, though not all updates actually require this. -

      -
      AUTHOR
      -

      -Philip Hazel -
      -University Computing Service -
      -Cambridge CB2 3QH, England. -
      -

      -
      REVISION
      -

      -Last updated: 12 November 2013 -
      -Copyright © 1997-2013 University of Cambridge. -
      -

      -Return to the PCRE index page. -

      diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcresample.html b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcresample.html deleted file mode 100644 index aca9184e..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcresample.html +++ /dev/null @@ -1,110 +0,0 @@ - - -pcresample specification - - -

      pcresample man page

      -

      -Return to the PCRE index page. -

      -

      -This page is part of the PCRE HTML documentation. It was generated automatically -from the original man page. If there is any nonsense in it, please consult the -man page, in case the conversion went wrong. -
      -
      -PCRE SAMPLE PROGRAM -
      -

      -A simple, complete demonstration program, to get you started with using PCRE, -is supplied in the file pcredemo.c in the PCRE distribution. A listing of -this program is given in the -pcredemo -documentation. If you do not have a copy of the PCRE distribution, you can save -this listing to re-create pcredemo.c. -

      -

      -The demonstration program, which uses the original PCRE 8-bit library, compiles -the regular expression that is its first argument, and matches it against the -subject string in its second argument. No PCRE options are set, and default -character tables are used. If matching succeeds, the program outputs the -portion of the subject that matched, together with the contents of any captured -substrings. -

      -

      -If the -g option is given on the command line, the program then goes on to -check for further matches of the same regular expression in the same subject -string. The logic is a little bit tricky because of the possibility of matching -an empty string. Comments in the code explain what is going on. -

      -

      -If PCRE is installed in the standard include and library directories for your -operating system, you should be able to compile the demonstration program using -this command: -

      -  gcc -o pcredemo pcredemo.c -lpcre
      -
      -If PCRE is installed elsewhere, you may need to add additional options to the -command line. For example, on a Unix-like system that has PCRE installed in -/usr/local, you can compile the demonstration program using a command -like this: -
      -  gcc -o pcredemo -I/usr/local/include pcredemo.c -L/usr/local/lib -lpcre
      -
      -In a Windows environment, if you want to statically link the program against a -non-dll pcre.a file, you must uncomment the line that defines PCRE_STATIC -before including pcre.h, because otherwise the pcre_malloc() and -pcre_free() exported functions will be declared -__declspec(dllimport), with unwanted results. -

      -

      -Once you have compiled and linked the demonstration program, you can run simple -tests like this: -

      -  ./pcredemo 'cat|dog' 'the cat sat on the mat'
      -  ./pcredemo -g 'cat|dog' 'the dog sat on the cat'
      -
      -Note that there is a much more comprehensive test program, called -pcretest, -which supports many more facilities for testing regular expressions and both -PCRE libraries. The -pcredemo -program is provided as a simple coding example. -

      -

      -If you try to run -pcredemo -when PCRE is not installed in the standard library directory, you may get an -error like this on some operating systems (e.g. Solaris): -

      -  ld.so.1: a.out: fatal: libpcre.so.0: open failed: No such file or directory
      -
      -This is caused by the way shared library support works on those systems. You -need to add -
      -  -R/usr/local/lib
      -
      -(for example) to the compile command to get round this problem. -

      -
      -AUTHOR -
      -

      -Philip Hazel -
      -University Computing Service -
      -Cambridge CB2 3QH, England. -
      -

      -
      -REVISION -
      -

      -Last updated: 10 January 2012 -
      -Copyright © 1997-2012 University of Cambridge. -
      -

      -Return to the PCRE index page. -

      diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcrestack.html b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcrestack.html deleted file mode 100644 index af6406d0..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcrestack.html +++ /dev/null @@ -1,225 +0,0 @@ - - -pcrestack specification - - -

      pcrestack man page

      -

      -Return to the PCRE index page. -

      -

      -This page is part of the PCRE HTML documentation. It was generated automatically -from the original man page. If there is any nonsense in it, please consult the -man page, in case the conversion went wrong. -
      -
      -PCRE DISCUSSION OF STACK USAGE -
      -

      -When you call pcre[16|32]_exec(), it makes use of an internal function -called match(). This calls itself recursively at branch points in the -pattern, in order to remember the state of the match so that it can back up and -try a different alternative if the first one fails. As matching proceeds deeper -and deeper into the tree of possibilities, the recursion depth increases. The -match() function is also called in other circumstances, for example, -whenever a parenthesized sub-pattern is entered, and in certain cases of -repetition. -

      -

      -Not all calls of match() increase the recursion depth; for an item such -as a* it may be called several times at the same level, after matching -different numbers of a's. Furthermore, in a number of cases where the result of -the recursive call would immediately be passed back as the result of the -current call (a "tail recursion"), the function is just restarted instead. -

      -

      -The above comments apply when pcre[16|32]_exec() is run in its normal -interpretive manner. If the pattern was studied with the -PCRE_STUDY_JIT_COMPILE option, and just-in-time compiling was successful, and -the options passed to pcre[16|32]_exec() were not incompatible, the matching -process uses the JIT-compiled code instead of the match() function. In -this case, the memory requirements are handled entirely differently. See the -pcrejit -documentation for details. -

      -

      -The pcre[16|32]_dfa_exec() function operates in an entirely different way, -and uses recursion only when there is a regular expression recursion or -subroutine call in the pattern. This includes the processing of assertion and -"once-only" subpatterns, which are handled like subroutine calls. Normally, -these are never very deep, and the limit on the complexity of -pcre[16|32]_dfa_exec() is controlled by the amount of workspace it is given. -However, it is possible to write patterns with runaway infinite recursions; -such patterns will cause pcre[16|32]_dfa_exec() to run out of stack. At -present, there is no protection against this. -

      -

      -The comments that follow do NOT apply to pcre[16|32]_dfa_exec(); they are -relevant only for pcre[16|32]_exec() without the JIT optimization. -

      -
      -Reducing pcre[16|32]_exec()'s stack usage -
      -

      -Each time that match() is actually called recursively, it uses memory -from the process stack. For certain kinds of pattern and data, very large -amounts of stack may be needed, despite the recognition of "tail recursion". -You can often reduce the amount of recursion, and therefore the amount of stack -used, by modifying the pattern that is being matched. Consider, for example, -this pattern: -

      -  ([^<]|<(?!inet))+
      -
      -It matches from wherever it starts until it encounters "<inet" or the end of -the data, and is the kind of pattern that might be used when processing an XML -file. Each iteration of the outer parentheses matches either one character that -is not "<" or a "<" that is not followed by "inet". However, each time a -parenthesis is processed, a recursion occurs, so this formulation uses a stack -frame for each matched character. For a long string, a lot of stack is -required. Consider now this rewritten pattern, which matches exactly the same -strings: -
      -  ([^<]++|<(?!inet))+
      -
      -This uses very much less stack, because runs of characters that do not contain -"<" are "swallowed" in one item inside the parentheses. Recursion happens only -when a "<" character that is not followed by "inet" is encountered (and we -assume this is relatively rare). A possessive quantifier is used to stop any -backtracking into the runs of non-"<" characters, but that is not related to -stack usage. -

      -

      -This example shows that one way of avoiding stack problems when matching long -subject strings is to write repeated parenthesized subpatterns to match more -than one character whenever possible. -

      -
      -Compiling PCRE to use heap instead of stack for pcre[16|32]_exec() -
      -

      -In environments where stack memory is constrained, you might want to compile -PCRE to use heap memory instead of stack for remembering back-up points when -pcre[16|32]_exec() is running. This makes it run a lot more slowly, however. -Details of how to do this are given in the -pcrebuild -documentation. When built in this way, instead of using the stack, PCRE obtains -and frees memory by calling the functions that are pointed to by the -pcre[16|32]_stack_malloc and pcre[16|32]_stack_free variables. By -default, these point to malloc() and free(), but you can replace -the pointers to cause PCRE to use your own functions. Since the block sizes are -always the same, and are always freed in reverse order, it may be possible to -implement customized memory handlers that are more efficient than the standard -functions. -

      -
      -Limiting pcre[16|32]_exec()'s stack usage -
      -

      -You can set limits on the number of times that match() is called, both in -total and recursively. If a limit is exceeded, pcre[16|32]_exec() returns an -error code. Setting suitable limits should prevent it from running out of -stack. The default values of the limits are very large, and unlikely ever to -operate. They can be changed when PCRE is built, and they can also be set when -pcre[16|32]_exec() is called. For details of these interfaces, see the -pcrebuild -documentation and the -section on extra data for pcre[16|32]_exec() -in the -pcreapi -documentation. -

      -

      -As a very rough rule of thumb, you should reckon on about 500 bytes per -recursion. Thus, if you want to limit your stack usage to 8Mb, you should set -the limit at 16000 recursions. A 64Mb stack, on the other hand, can support -around 128000 recursions. -

      -

      -In Unix-like environments, the pcretest test program has a command line -option (-S) that can be used to increase the size of its stack. As long -as the stack is large enough, another option (-M) can be used to find the -smallest limits that allow a particular pattern to match a given subject -string. This is done by calling pcre[16|32]_exec() repeatedly with different -limits. -

      -
      -Obtaining an estimate of stack usage -
      -

      -The actual amount of stack used per recursion can vary quite a lot, depending -on the compiler that was used to build PCRE and the optimization or debugging -options that were set for it. The rule of thumb value of 500 bytes mentioned -above may be larger or smaller than what is actually needed. A better -approximation can be obtained by running this command: -

      -  pcretest -m -C
      -
      -The -C option causes pcretest to output information about the -options with which PCRE was compiled. When -m is also given (before --C), information about stack use is given in a line like this: -
      -  Match recursion uses stack: approximate frame size = 640 bytes
      -
      -The value is approximate because some recursions need a bit more (up to perhaps -16 more bytes). -

      -

      -If the above command is given when PCRE is compiled to use the heap instead of -the stack for recursion, the value that is output is the size of each block -that is obtained from the heap. -

      -
      -Changing stack size in Unix-like systems -
      -

      -In Unix-like environments, there is not often a problem with the stack unless -very long strings are involved, though the default limit on stack size varies -from system to system. Values from 8Mb to 64Mb are common. You can find your -default limit by running the command: -

      -  ulimit -s
      -
      -Unfortunately, the effect of running out of stack is often SIGSEGV, though -sometimes a more explicit error message is given. You can normally increase the -limit on stack size by code such as this: -
      -  struct rlimit rlim;
      -  getrlimit(RLIMIT_STACK, &rlim);
      -  rlim.rlim_cur = 100*1024*1024;
      -  setrlimit(RLIMIT_STACK, &rlim);
      -
      -This reads the current limits (soft and hard) using getrlimit(), then -attempts to increase the soft limit to 100Mb using setrlimit(). You must -do this before calling pcre[16|32]_exec(). -

      -
      -Changing stack size in Mac OS X -
      -

      -Using setrlimit(), as described above, should also work on Mac OS X. It -is also possible to set a stack size when linking a program. There is a -discussion about stack sizes in Mac OS X at this web site: -http://developer.apple.com/qa/qa2005/qa1419.html. -

      -
      -AUTHOR -
      -

      -Philip Hazel -
      -University Computing Service -
      -Cambridge CB2 3QH, England. -
      -

      -
      -REVISION -
      -

      -Last updated: 24 June 2012 -
      -Copyright © 1997-2012 University of Cambridge. -
      -

      -Return to the PCRE index page. -

      diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcresyntax.html b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcresyntax.html deleted file mode 100644 index 5896b9e0..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcresyntax.html +++ /dev/null @@ -1,561 +0,0 @@ - - -pcresyntax specification - - -

      pcresyntax man page

      -

      -Return to the PCRE index page. -

      -

      -This page is part of the PCRE HTML documentation. It was generated automatically -from the original man page. If there is any nonsense in it, please consult the -man page, in case the conversion went wrong. -
      -

      -
      PCRE REGULAR EXPRESSION SYNTAX SUMMARY
      -

      -The full syntax and semantics of the regular expressions that are supported by -PCRE are described in the -pcrepattern -documentation. This document contains a quick-reference summary of the syntax. -

      -
      QUOTING
      -

      -

      -  \x         where x is non-alphanumeric is a literal x
      -  \Q...\E    treat enclosed characters as literal
      -
      -

      -
      CHARACTERS
      -

      -

      -  \a         alarm, that is, the BEL character (hex 07)
      -  \cx        "control-x", where x is any ASCII character
      -  \e         escape (hex 1B)
      -  \f         form feed (hex 0C)
      -  \n         newline (hex 0A)
      -  \r         carriage return (hex 0D)
      -  \t         tab (hex 09)
      -  \0dd       character with octal code 0dd
      -  \ddd       character with octal code ddd, or backreference
      -  \o{ddd..}  character with octal code ddd..
      -  \xhh       character with hex code hh
      -  \x{hhh..}  character with hex code hhh..
      -
      -Note that \0dd is always an octal code, and that \8 and \9 are the literal -characters "8" and "9". -

      -
      CHARACTER TYPES
      -

      -

      -  .          any character except newline;
      -               in dotall mode, any character whatsoever
      -  \C         one data unit, even in UTF mode (best avoided)
      -  \d         a decimal digit
      -  \D         a character that is not a decimal digit
      -  \h         a horizontal white space character
      -  \H         a character that is not a horizontal white space character
      -  \N         a character that is not a newline
      -  \p{xx}     a character with the xx property
      -  \P{xx}     a character without the xx property
      -  \R         a newline sequence
      -  \s         a white space character
      -  \S         a character that is not a white space character
      -  \v         a vertical white space character
      -  \V         a character that is not a vertical white space character
      -  \w         a "word" character
      -  \W         a "non-word" character
      -  \X         a Unicode extended grapheme cluster
      -
      -By default, \d, \s, and \w match only ASCII characters, even in UTF-8 mode -or in the 16- bit and 32-bit libraries. However, if locale-specific matching is -happening, \s and \w may also match characters with code points in the range -128-255. If the PCRE_UCP option is set, the behaviour of these escape sequences -is changed to use Unicode properties and they match many more characters. -

      -
      GENERAL CATEGORY PROPERTIES FOR \p and \P
      -

      -

      -  C          Other
      -  Cc         Control
      -  Cf         Format
      -  Cn         Unassigned
      -  Co         Private use
      -  Cs         Surrogate
      -
      -  L          Letter
      -  Ll         Lower case letter
      -  Lm         Modifier letter
      -  Lo         Other letter
      -  Lt         Title case letter
      -  Lu         Upper case letter
      -  L&         Ll, Lu, or Lt
      -
      -  M          Mark
      -  Mc         Spacing mark
      -  Me         Enclosing mark
      -  Mn         Non-spacing mark
      -
      -  N          Number
      -  Nd         Decimal number
      -  Nl         Letter number
      -  No         Other number
      -
      -  P          Punctuation
      -  Pc         Connector punctuation
      -  Pd         Dash punctuation
      -  Pe         Close punctuation
      -  Pf         Final punctuation
      -  Pi         Initial punctuation
      -  Po         Other punctuation
      -  Ps         Open punctuation
      -
      -  S          Symbol
      -  Sc         Currency symbol
      -  Sk         Modifier symbol
      -  Sm         Mathematical symbol
      -  So         Other symbol
      -
      -  Z          Separator
      -  Zl         Line separator
      -  Zp         Paragraph separator
      -  Zs         Space separator
      -
      -

      -
      PCRE SPECIAL CATEGORY PROPERTIES FOR \p and \P
      -

      -

      -  Xan        Alphanumeric: union of properties L and N
      -  Xps        POSIX space: property Z or tab, NL, VT, FF, CR
      -  Xsp        Perl space: property Z or tab, NL, VT, FF, CR
      -  Xuc        Univerally-named character: one that can be
      -               represented by a Universal Character Name
      -  Xwd        Perl word: property Xan or underscore
      -
      -Perl and POSIX space are now the same. Perl added VT to its space character set -at release 5.18 and PCRE changed at release 8.34. -

      -
      SCRIPT NAMES FOR \p AND \P
      -

      -Arabic, -Armenian, -Avestan, -Balinese, -Bamum, -Bassa_Vah, -Batak, -Bengali, -Bopomofo, -Brahmi, -Braille, -Buginese, -Buhid, -Canadian_Aboriginal, -Carian, -Caucasian_Albanian, -Chakma, -Cham, -Cherokee, -Common, -Coptic, -Cuneiform, -Cypriot, -Cyrillic, -Deseret, -Devanagari, -Duployan, -Egyptian_Hieroglyphs, -Elbasan, -Ethiopic, -Georgian, -Glagolitic, -Gothic, -Grantha, -Greek, -Gujarati, -Gurmukhi, -Han, -Hangul, -Hanunoo, -Hebrew, -Hiragana, -Imperial_Aramaic, -Inherited, -Inscriptional_Pahlavi, -Inscriptional_Parthian, -Javanese, -Kaithi, -Kannada, -Katakana, -Kayah_Li, -Kharoshthi, -Khmer, -Khojki, -Khudawadi, -Lao, -Latin, -Lepcha, -Limbu, -Linear_A, -Linear_B, -Lisu, -Lycian, -Lydian, -Mahajani, -Malayalam, -Mandaic, -Manichaean, -Meetei_Mayek, -Mende_Kikakui, -Meroitic_Cursive, -Meroitic_Hieroglyphs, -Miao, -Modi, -Mongolian, -Mro, -Myanmar, -Nabataean, -New_Tai_Lue, -Nko, -Ogham, -Ol_Chiki, -Old_Italic, -Old_North_Arabian, -Old_Permic, -Old_Persian, -Old_South_Arabian, -Old_Turkic, -Oriya, -Osmanya, -Pahawh_Hmong, -Palmyrene, -Pau_Cin_Hau, -Phags_Pa, -Phoenician, -Psalter_Pahlavi, -Rejang, -Runic, -Samaritan, -Saurashtra, -Sharada, -Shavian, -Siddham, -Sinhala, -Sora_Sompeng, -Sundanese, -Syloti_Nagri, -Syriac, -Tagalog, -Tagbanwa, -Tai_Le, -Tai_Tham, -Tai_Viet, -Takri, -Tamil, -Telugu, -Thaana, -Thai, -Tibetan, -Tifinagh, -Tirhuta, -Ugaritic, -Vai, -Warang_Citi, -Yi. -

      -
      CHARACTER CLASSES
      -

      -

      -  [...]       positive character class
      -  [^...]      negative character class
      -  [x-y]       range (can be used for hex characters)
      -  [[:xxx:]]   positive POSIX named set
      -  [[:^xxx:]]  negative POSIX named set
      -
      -  alnum       alphanumeric
      -  alpha       alphabetic
      -  ascii       0-127
      -  blank       space or tab
      -  cntrl       control character
      -  digit       decimal digit
      -  graph       printing, excluding space
      -  lower       lower case letter
      -  print       printing, including space
      -  punct       printing, excluding alphanumeric
      -  space       white space
      -  upper       upper case letter
      -  word        same as \w
      -  xdigit      hexadecimal digit
      -
      -In PCRE, POSIX character set names recognize only ASCII characters by default, -but some of them use Unicode properties if PCRE_UCP is set. You can use -\Q...\E inside a character class. -

      -
      QUANTIFIERS
      -

      -

      -  ?           0 or 1, greedy
      -  ?+          0 or 1, possessive
      -  ??          0 or 1, lazy
      -  *           0 or more, greedy
      -  *+          0 or more, possessive
      -  *?          0 or more, lazy
      -  +           1 or more, greedy
      -  ++          1 or more, possessive
      -  +?          1 or more, lazy
      -  {n}         exactly n
      -  {n,m}       at least n, no more than m, greedy
      -  {n,m}+      at least n, no more than m, possessive
      -  {n,m}?      at least n, no more than m, lazy
      -  {n,}        n or more, greedy
      -  {n,}+       n or more, possessive
      -  {n,}?       n or more, lazy
      -
      -

      -
      ANCHORS AND SIMPLE ASSERTIONS
      -

      -

      -  \b          word boundary
      -  \B          not a word boundary
      -  ^           start of subject
      -               also after internal newline in multiline mode
      -  \A          start of subject
      -  $           end of subject
      -               also before newline at end of subject
      -               also before internal newline in multiline mode
      -  \Z          end of subject
      -               also before newline at end of subject
      -  \z          end of subject
      -  \G          first matching position in subject
      -
      -

      -
      MATCH POINT RESET
      -

      -

      -  \K          reset start of match
      -
      -\K is honoured in positive assertions, but ignored in negative ones. -

      -
      ALTERNATION
      -

      -

      -  expr|expr|expr...
      -
      -

      -
      CAPTURING
      -

      -

      -  (...)           capturing group
      -  (?<name>...)    named capturing group (Perl)
      -  (?'name'...)    named capturing group (Perl)
      -  (?P<name>...)   named capturing group (Python)
      -  (?:...)         non-capturing group
      -  (?|...)         non-capturing group; reset group numbers for
      -                   capturing groups in each alternative
      -
      -

      -
      ATOMIC GROUPS
      -

      -

      -  (?>...)         atomic, non-capturing group
      -
      -

      -
      COMMENT
      -

      -

      -  (?#....)        comment (not nestable)
      -
      -

      -
      OPTION SETTING
      -

      -

      -  (?i)            caseless
      -  (?J)            allow duplicate names
      -  (?m)            multiline
      -  (?s)            single line (dotall)
      -  (?U)            default ungreedy (lazy)
      -  (?x)            extended (ignore white space)
      -  (?-...)         unset option(s)
      -
      -The following are recognized only at the very start of a pattern or after one -of the newline or \R options with similar syntax. More than one of them may -appear. -
      -  (*LIMIT_MATCH=d) set the match limit to d (decimal number)
      -  (*LIMIT_RECURSION=d) set the recursion limit to d (decimal number)
      -  (*NO_AUTO_POSSESS) no auto-possessification (PCRE_NO_AUTO_POSSESS)
      -  (*NO_START_OPT) no start-match optimization (PCRE_NO_START_OPTIMIZE)
      -  (*UTF8)         set UTF-8 mode: 8-bit library (PCRE_UTF8)
      -  (*UTF16)        set UTF-16 mode: 16-bit library (PCRE_UTF16)
      -  (*UTF32)        set UTF-32 mode: 32-bit library (PCRE_UTF32)
      -  (*UTF)          set appropriate UTF mode for the library in use
      -  (*UCP)          set PCRE_UCP (use Unicode properties for \d etc)
      -
      -Note that LIMIT_MATCH and LIMIT_RECURSION can only reduce the value of the -limits set by the caller of pcre_exec(), not increase them. -

      -
      NEWLINE CONVENTION
      -

      -These are recognized only at the very start of the pattern or after option -settings with a similar syntax. -

      -  (*CR)           carriage return only
      -  (*LF)           linefeed only
      -  (*CRLF)         carriage return followed by linefeed
      -  (*ANYCRLF)      all three of the above
      -  (*ANY)          any Unicode newline sequence
      -
      -

      -
      WHAT \R MATCHES
      -

      -These are recognized only at the very start of the pattern or after option -setting with a similar syntax. -

      -  (*BSR_ANYCRLF)  CR, LF, or CRLF
      -  (*BSR_UNICODE)  any Unicode newline sequence
      -
      -

      -
      LOOKAHEAD AND LOOKBEHIND ASSERTIONS
      -

      -

      -  (?=...)         positive look ahead
      -  (?!...)         negative look ahead
      -  (?<=...)        positive look behind
      -  (?<!...)        negative look behind
      -
      -Each top-level branch of a look behind must be of a fixed length. -

      -
      BACKREFERENCES
      -

      -

      -  \n              reference by number (can be ambiguous)
      -  \gn             reference by number
      -  \g{n}           reference by number
      -  \g{-n}          relative reference by number
      -  \k<name>        reference by name (Perl)
      -  \k'name'        reference by name (Perl)
      -  \g{name}        reference by name (Perl)
      -  \k{name}        reference by name (.NET)
      -  (?P=name)       reference by name (Python)
      -
      -

      -
      SUBROUTINE REFERENCES (POSSIBLY RECURSIVE)
      -

      -

      -  (?R)            recurse whole pattern
      -  (?n)            call subpattern by absolute number
      -  (?+n)           call subpattern by relative number
      -  (?-n)           call subpattern by relative number
      -  (?&name)        call subpattern by name (Perl)
      -  (?P>name)       call subpattern by name (Python)
      -  \g<name>        call subpattern by name (Oniguruma)
      -  \g'name'        call subpattern by name (Oniguruma)
      -  \g<n>           call subpattern by absolute number (Oniguruma)
      -  \g'n'           call subpattern by absolute number (Oniguruma)
      -  \g<+n>          call subpattern by relative number (PCRE extension)
      -  \g'+n'          call subpattern by relative number (PCRE extension)
      -  \g<-n>          call subpattern by relative number (PCRE extension)
      -  \g'-n'          call subpattern by relative number (PCRE extension)
      -
      -

      -
      CONDITIONAL PATTERNS
      -

      -

      -  (?(condition)yes-pattern)
      -  (?(condition)yes-pattern|no-pattern)
      -
      -  (?(n)...        absolute reference condition
      -  (?(+n)...       relative reference condition
      -  (?(-n)...       relative reference condition
      -  (?(<name>)...   named reference condition (Perl)
      -  (?('name')...   named reference condition (Perl)
      -  (?(name)...     named reference condition (PCRE)
      -  (?(R)...        overall recursion condition
      -  (?(Rn)...       specific group recursion condition
      -  (?(R&name)...   specific recursion condition
      -  (?(DEFINE)...   define subpattern for reference
      -  (?(assert)...   assertion condition
      -
      -

      -
      BACKTRACKING CONTROL
      -

      -The following act immediately they are reached: -

      -  (*ACCEPT)       force successful match
      -  (*FAIL)         force backtrack; synonym (*F)
      -  (*MARK:NAME)    set name to be passed back; synonym (*:NAME)
      -
      -The following act only when a subsequent match failure causes a backtrack to -reach them. They all force a match failure, but they differ in what happens -afterwards. Those that advance the start-of-match point do so only if the -pattern is not anchored. -
      -  (*COMMIT)       overall failure, no advance of starting point
      -  (*PRUNE)        advance to next starting character
      -  (*PRUNE:NAME)   equivalent to (*MARK:NAME)(*PRUNE)
      -  (*SKIP)         advance to current matching position
      -  (*SKIP:NAME)    advance to position corresponding to an earlier
      -                  (*MARK:NAME); if not found, the (*SKIP) is ignored
      -  (*THEN)         local failure, backtrack to next alternation
      -  (*THEN:NAME)    equivalent to (*MARK:NAME)(*THEN)
      -
      -

      -
      CALLOUTS
      -

      -

      -  (?C)      callout
      -  (?Cn)     callout with data n
      -
      -

      -
      SEE ALSO
      -

      -pcrepattern(3), pcreapi(3), pcrecallout(3), -pcrematching(3), pcre(3). -

      -
      AUTHOR
      -

      -Philip Hazel -
      -University Computing Service -
      -Cambridge CB2 3QH, England. -
      -

      -
      REVISION
      -

      -Last updated: 08 January 2014 -
      -Copyright © 1997-2014 University of Cambridge. -
      -

      -Return to the PCRE index page. -

      diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcretest.html b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcretest.html deleted file mode 100644 index ba540d3c..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcretest.html +++ /dev/null @@ -1,1163 +0,0 @@ - - -pcretest specification - - -

      pcretest man page

      -

      -Return to the PCRE index page. -

      -

      -This page is part of the PCRE HTML documentation. It was generated automatically -from the original man page. If there is any nonsense in it, please consult the -man page, in case the conversion went wrong. -
      -

      -
      SYNOPSIS
      -

      -pcretest [options] [input file [output file]] -
      -
      -pcretest was written as a test program for the PCRE regular expression -library itself, but it can also be used for experimenting with regular -expressions. This document describes the features of the test program; for -details of the regular expressions themselves, see the -pcrepattern -documentation. For details of the PCRE library function calls and their -options, see the -pcreapi -, -pcre16 -and -pcre32 -documentation. -

      -

      -The input for pcretest is a sequence of regular expression patterns and -strings to be matched, as described below. The output shows the result of each -match. Options on the command line and the patterns control PCRE options and -exactly what is output. -

      -

      -As PCRE has evolved, it has acquired many different features, and as a result, -pcretest now has rather a lot of obscure options for testing every -possible feature. Some of these options are specifically designed for use in -conjunction with the test script and data files that are distributed as part of -PCRE, and are unlikely to be of use otherwise. They are all documented here, -but without much justification. -

      -
      INPUT DATA FORMAT
      -

      -Input to pcretest is processed line by line, either by calling the C -library's fgets() function, or via the libreadline library (see -below). In Unix-like environments, fgets() treats any bytes other than -newline as data characters. However, in some Windows environments character 26 -(hex 1A) causes an immediate end of file, and no further data is read. For -maximum portability, therefore, it is safest to use only ASCII characters in -pcretest input files. -

      -

      -The input is processed using using C's string functions, so must not -contain binary zeroes, even though in Unix-like environments, fgets() -treats any bytes other than newline as data characters. -

      -
      PCRE's 8-BIT, 16-BIT AND 32-BIT LIBRARIES
      -

      -From release 8.30, two separate PCRE libraries can be built. The original one -supports 8-bit character strings, whereas the newer 16-bit library supports -character strings encoded in 16-bit units. From release 8.32, a third library -can be built, supporting character strings encoded in 32-bit units. The -pcretest program can be used to test all three libraries. However, it is -itself still an 8-bit program, reading 8-bit input and writing 8-bit output. -When testing the 16-bit or 32-bit library, the patterns and data strings are -converted to 16- or 32-bit format before being passed to the PCRE library -functions. Results are converted to 8-bit for output. -

      -

      -References to functions and structures of the form pcre[16|32]_xx below -mean "pcre_xx when using the 8-bit library, pcre16_xx when using -the 16-bit library, or pcre32_xx when using the 32-bit library". -

      -
      COMMAND LINE OPTIONS
      -

      --8 -If both the 8-bit library has been built, this option causes the 8-bit library -to be used (which is the default); if the 8-bit library has not been built, -this option causes an error. -

      -

      --16 -If both the 8-bit or the 32-bit, and the 16-bit libraries have been built, this -option causes the 16-bit library to be used. If only the 16-bit library has been -built, this is the default (so has no effect). If only the 8-bit or the 32-bit -library has been built, this option causes an error. -

      -

      --32 -If both the 8-bit or the 16-bit, and the 32-bit libraries have been built, this -option causes the 32-bit library to be used. If only the 32-bit library has been -built, this is the default (so has no effect). If only the 8-bit or the 16-bit -library has been built, this option causes an error. -

      -

      --b -Behave as if each pattern has the /B (show byte code) modifier; the -internal form is output after compilation. -

      -

      --C -Output the version number of the PCRE library, and all available information -about the optional features that are included, and then exit with zero exit -code. All other options are ignored. -

      -

      --C option -Output information about a specific build-time option, then exit. This -functionality is intended for use in scripts such as RunTest. The -following options output the value and set the exit code as indicated: -

      -  ebcdic-nl  the code for LF (= NL) in an EBCDIC environment:
      -               0x15 or 0x25
      -               0 if used in an ASCII environment
      -               exit code is always 0
      -  linksize   the configured internal link size (2, 3, or 4)
      -               exit code is set to the link size
      -  newline    the default newline setting:
      -               CR, LF, CRLF, ANYCRLF, or ANY
      -               exit code is always 0
      -  bsr        the default setting for what \R matches:
      -               ANYCRLF or ANY
      -               exit code is always 0
      -
      -The following options output 1 for true or 0 for false, and set the exit code -to the same value: -
      -  ebcdic     compiled for an EBCDIC environment
      -  jit        just-in-time support is available
      -  pcre16     the 16-bit library was built
      -  pcre32     the 32-bit library was built
      -  pcre8      the 8-bit library was built
      -  ucp        Unicode property support is available
      -  utf        UTF-8 and/or UTF-16 and/or UTF-32 support
      -               is available
      -
      -If an unknown option is given, an error message is output; the exit code is 0. -

      -

      --d -Behave as if each pattern has the /D (debug) modifier; the internal -form and information about the compiled pattern is output after compilation; --d is equivalent to -b -i. -

      -

      --dfa -Behave as if each data line contains the \D escape sequence; this causes the -alternative matching function, pcre[16|32]_dfa_exec(), to be used instead -of the standard pcre[16|32]_exec() function (more detail is given below). -

      -

      --help -Output a brief summary these options and then exit. -

      -

      --i -Behave as if each pattern has the /I modifier; information about the -compiled pattern is given after compilation. -

      -

      --M -Behave as if each data line contains the \M escape sequence; this causes -PCRE to discover the minimum MATCH_LIMIT and MATCH_LIMIT_RECURSION settings by -calling pcre[16|32]_exec() repeatedly with different limits. -

      -

      --m -Output the size of each compiled pattern after it has been compiled. This is -equivalent to adding /M to each regular expression. The size is given in -bytes for both libraries. -

      -

      --O -Behave as if each pattern has the /O modifier, that is disable -auto-possessification for all patterns. -

      -

      --o osize -Set the number of elements in the output vector that is used when calling -pcre[16|32]_exec() or pcre[16|32]_dfa_exec() to be osize. The -default value is 45, which is enough for 14 capturing subexpressions for -pcre[16|32]_exec() or 22 different matches for -pcre[16|32]_dfa_exec(). -The vector size can be changed for individual matching calls by including \O -in the data line (see below). -

      -

      --p -Behave as if each pattern has the /P modifier; the POSIX wrapper API is -used to call PCRE. None of the other options has any effect when -p is -set. This option can be used only with the 8-bit library. -

      -

      --q -Do not output the version number of pcretest at the start of execution. -

      -

      --S size -On Unix-like systems, set the size of the run-time stack to size -megabytes. -

      -

      --s or -s+ -Behave as if each pattern has the /S modifier; in other words, force each -pattern to be studied. If -s+ is used, all the JIT compile options are -passed to pcre[16|32]_study(), causing just-in-time optimization to be set -up if it is available, for both full and partial matching. Specific JIT compile -options can be selected by following -s+ with a digit in the range 1 to -7, which selects the JIT compile modes as follows: -

      -  1  normal match only
      -  2  soft partial match only
      -  3  normal match and soft partial match
      -  4  hard partial match only
      -  6  soft and hard partial match
      -  7  all three modes (default)
      -
      -If -s++ is used instead of -s+ (with or without a following digit), -the text "(JIT)" is added to the first output line after a match or no match -when JIT-compiled code was actually used. -
      -
      -Note that there are pattern options that can override -s, either -specifying no studying at all, or suppressing JIT compilation. -
      -
      -If the /I or /D option is present on a pattern (requesting output -about the compiled pattern), information about the result of studying is not -included when studying is caused only by -s and neither -i nor --d is present on the command line. This behaviour means that the output -from tests that are run with and without -s should be identical, except -when options that output information about the actual running of a match are -set. -
      -
      -The -M, -t, and -tm options, which give information about -resources used, are likely to produce different output with and without --s. Output may also differ if the /C option is present on an -individual pattern. This uses callouts to trace the the matching process, and -this may be different between studied and non-studied patterns. If the pattern -contains (*MARK) items there may also be differences, for the same reason. The --s command line option can be overridden for specific patterns that -should never be studied (see the /S pattern modifier below). -

      -

      --t -Run each compile, study, and match many times with a timer, and output the -resulting times per compile, study, or match (in milliseconds). Do not set --m with -t, because you will then get the size output a zillion -times, and the timing will be distorted. You can control the number of -iterations that are used for timing by following -t with a number (as a -separate item on the command line). For example, "-t 1000" iterates 1000 times. -The default is to iterate 500000 times. -

      -

      --tm -This is like -t except that it times only the matching phase, not the -compile or study phases. -

      -

      --T -TM -These behave like -t and -tm, but in addition, at the end of a run, -the total times for all compiles, studies, and matches are output. -

      -
      DESCRIPTION
      -

      -If pcretest is given two filename arguments, it reads from the first and -writes to the second. If it is given only one filename argument, it reads from -that file and writes to stdout. Otherwise, it reads from stdin and writes to -stdout, and prompts for each line of input, using "re>" to prompt for regular -expressions, and "data>" to prompt for data lines. -

      -

      -When pcretest is built, a configuration option can specify that it should -be linked with the libreadline library. When this is done, if the input -is from a terminal, it is read using the readline() function. This -provides line-editing and history facilities. The output from the -help -option states whether or not readline() will be used. -

      -

      -The program handles any number of sets of input on a single input file. Each -set starts with a regular expression, and continues with any number of data -lines to be matched against that pattern. -

      -

      -Each data line is matched separately and independently. If you want to do -multi-line matches, you have to use the \n escape sequence (or \r or \r\n, -etc., depending on the newline setting) in a single line of input to encode the -newline sequences. There is no limit on the length of data lines; the input -buffer is automatically extended if it is too small. -

      -

      -An empty line signals the end of the data lines, at which point a new regular -expression is read. The regular expressions are given enclosed in any -non-alphanumeric delimiters other than backslash, for example: -

      -  /(a|bc)x+yz/
      -
      -White space before the initial delimiter is ignored. A regular expression may -be continued over several input lines, in which case the newline characters are -included within it. It is possible to include the delimiter within the pattern -by escaping it, for example -
      -  /abc\/def/
      -
      -If you do so, the escape and the delimiter form part of the pattern, but since -delimiters are always non-alphanumeric, this does not affect its interpretation. -If the terminating delimiter is immediately followed by a backslash, for -example, -
      -  /abc/\
      -
      -then a backslash is added to the end of the pattern. This is done to provide a -way of testing the error condition that arises if a pattern finishes with a -backslash, because -
      -  /abc\/
      -
      -is interpreted as the first line of a pattern that starts with "abc/", causing -pcretest to read the next line as a continuation of the regular expression. -

      -
      PATTERN MODIFIERS
      -

      -A pattern may be followed by any number of modifiers, which are mostly single -characters, though some of these can be qualified by further characters. -Following Perl usage, these are referred to below as, for example, "the -/i modifier", even though the delimiter of the pattern need not always be -a slash, and no slash is used when writing modifiers. White space may appear -between the final pattern delimiter and the first modifier, and between the -modifiers themselves. For reference, here is a complete list of modifiers. They -fall into several groups that are described in detail in the following -sections. -

      -  /8              set UTF mode
      -  /9              set PCRE_NEVER_UTF (locks out UTF mode)
      -  /?              disable UTF validity check
      -  /+              show remainder of subject after match
      -  /=              show all captures (not just those that are set)
      -
      -  /A              set PCRE_ANCHORED
      -  /B              show compiled code
      -  /C              set PCRE_AUTO_CALLOUT
      -  /D              same as /B plus /I
      -  /E              set PCRE_DOLLAR_ENDONLY
      -  /F              flip byte order in compiled pattern
      -  /f              set PCRE_FIRSTLINE
      -  /G              find all matches (shorten string)
      -  /g              find all matches (use startoffset)
      -  /I              show information about pattern
      -  /i              set PCRE_CASELESS
      -  /J              set PCRE_DUPNAMES
      -  /K              show backtracking control names
      -  /L              set locale
      -  /M              show compiled memory size
      -  /m              set PCRE_MULTILINE
      -  /N              set PCRE_NO_AUTO_CAPTURE
      -  /O              set PCRE_NO_AUTO_POSSESS
      -  /P              use the POSIX wrapper
      -  /Q              test external stack check function
      -  /S              study the pattern after compilation
      -  /s              set PCRE_DOTALL
      -  /T              select character tables
      -  /U              set PCRE_UNGREEDY
      -  /W              set PCRE_UCP
      -  /X              set PCRE_EXTRA
      -  /x              set PCRE_EXTENDED
      -  /Y              set PCRE_NO_START_OPTIMIZE
      -  /Z              don't show lengths in /B output
      -
      -  /<any>          set PCRE_NEWLINE_ANY
      -  /<anycrlf>      set PCRE_NEWLINE_ANYCRLF
      -  /<cr>           set PCRE_NEWLINE_CR
      -  /<crlf>         set PCRE_NEWLINE_CRLF
      -  /<lf>           set PCRE_NEWLINE_LF
      -  /<bsr_anycrlf>  set PCRE_BSR_ANYCRLF
      -  /<bsr_unicode>  set PCRE_BSR_UNICODE
      -  /<JS>           set PCRE_JAVASCRIPT_COMPAT
      -
      -
      -

      -
      -Perl-compatible modifiers -
      -

      -The /i, /m, /s, and /x modifiers set the PCRE_CASELESS, -PCRE_MULTILINE, PCRE_DOTALL, or PCRE_EXTENDED options, respectively, when -pcre[16|32]_compile() is called. These four modifier letters have the same -effect as they do in Perl. For example: -

      -  /caseless/i
      -
      -
      -

      -
      -Modifiers for other PCRE options -
      -

      -The following table shows additional modifiers for setting PCRE compile-time -options that do not correspond to anything in Perl: -

      -  /8              PCRE_UTF8           ) when using the 8-bit
      -  /?              PCRE_NO_UTF8_CHECK  )   library
      -
      -  /8              PCRE_UTF16          ) when using the 16-bit
      -  /?              PCRE_NO_UTF16_CHECK )   library
      -
      -  /8              PCRE_UTF32          ) when using the 32-bit
      -  /?              PCRE_NO_UTF32_CHECK )   library
      -
      -  /9              PCRE_NEVER_UTF
      -  /A              PCRE_ANCHORED
      -  /C              PCRE_AUTO_CALLOUT
      -  /E              PCRE_DOLLAR_ENDONLY
      -  /f              PCRE_FIRSTLINE
      -  /J              PCRE_DUPNAMES
      -  /N              PCRE_NO_AUTO_CAPTURE
      -  /O              PCRE_NO_AUTO_POSSESS
      -  /U              PCRE_UNGREEDY
      -  /W              PCRE_UCP
      -  /X              PCRE_EXTRA
      -  /Y              PCRE_NO_START_OPTIMIZE
      -  /<any>          PCRE_NEWLINE_ANY
      -  /<anycrlf>      PCRE_NEWLINE_ANYCRLF
      -  /<cr>           PCRE_NEWLINE_CR
      -  /<crlf>         PCRE_NEWLINE_CRLF
      -  /<lf>           PCRE_NEWLINE_LF
      -  /<bsr_anycrlf>  PCRE_BSR_ANYCRLF
      -  /<bsr_unicode>  PCRE_BSR_UNICODE
      -  /<JS>           PCRE_JAVASCRIPT_COMPAT
      -
      -The modifiers that are enclosed in angle brackets are literal strings as shown, -including the angle brackets, but the letters within can be in either case. -This example sets multiline matching with CRLF as the line ending sequence: -
      -  /^abc/m<CRLF>
      -
      -As well as turning on the PCRE_UTF8/16/32 option, the /8 modifier causes -all non-printing characters in output strings to be printed using the -\x{hh...} notation. Otherwise, those less than 0x100 are output in hex without -the curly brackets. -

      -

      -Full details of the PCRE options are given in the -pcreapi -documentation. -

      -
      -Finding all matches in a string -
      -

      -Searching for all possible matches within each subject string can be requested -by the /g or /G modifier. After finding a match, PCRE is called -again to search the remainder of the subject string. The difference between -/g and /G is that the former uses the startoffset argument to -pcre[16|32]_exec() to start searching at a new point within the entire -string (which is in effect what Perl does), whereas the latter passes over a -shortened substring. This makes a difference to the matching process if the -pattern begins with a lookbehind assertion (including \b or \B). -

      -

      -If any call to pcre[16|32]_exec() in a /g or /G sequence matches -an empty string, the next call is done with the PCRE_NOTEMPTY_ATSTART and -PCRE_ANCHORED flags set in order to search for another, non-empty, match at the -same point. If this second match fails, the start offset is advanced, and the -normal match is retried. This imitates the way Perl handles such cases when -using the /g modifier or the split() function. Normally, the start -offset is advanced by one character, but if the newline convention recognizes -CRLF as a newline, and the current character is CR followed by LF, an advance -of two is used. -

      -
      -Other modifiers -
      -

      -There are yet more modifiers for controlling the way pcretest -operates. -

      -

      -The /+ modifier requests that as well as outputting the substring that -matched the entire pattern, pcretest should in addition output the -remainder of the subject string. This is useful for tests where the subject -contains multiple copies of the same substring. If the + modifier appears -twice, the same action is taken for captured substrings. In each case the -remainder is output on the following line with a plus character following the -capture number. Note that this modifier must not immediately follow the /S -modifier because /S+ and /S++ have other meanings. -

      -

      -The /= modifier requests that the values of all potential captured -parentheses be output after a match. By default, only those up to the highest -one actually used in the match are output (corresponding to the return code -from pcre[16|32]_exec()). Values in the offsets vector corresponding to -higher numbers should be set to -1, and these are output as "<unset>". This -modifier gives a way of checking that this is happening. -

      -

      -The /B modifier is a debugging feature. It requests that pcretest -output a representation of the compiled code after compilation. Normally this -information contains length and offset values; however, if /Z is also -present, this data is replaced by spaces. This is a special feature for use in -the automatic test scripts; it ensures that the same output is generated for -different internal link sizes. -

      -

      -The /D modifier is a PCRE debugging feature, and is equivalent to -/BI, that is, both the /B and the /I modifiers. -

      -

      -The /F modifier causes pcretest to flip the byte order of the -2-byte and 4-byte fields in the compiled pattern. This facility is for testing -the feature in PCRE that allows it to execute patterns that were compiled on a -host with a different endianness. This feature is not available when the POSIX -interface to PCRE is being used, that is, when the /P pattern modifier is -specified. See also the section about saving and reloading compiled patterns -below. -

      -

      -The /I modifier requests that pcretest output information about the -compiled pattern (whether it is anchored, has a fixed first character, and -so on). It does this by calling pcre[16|32]_fullinfo() after compiling a -pattern. If the pattern is studied, the results of that are also output. In -this output, the word "char" means a non-UTF character, that is, the value of a -single data item (8-bit, 16-bit, or 32-bit, depending on the library that is -being tested). -

      -

      -The /K modifier requests pcretest to show names from backtracking -control verbs that are returned from calls to pcre[16|32]_exec(). It causes -pcretest to create a pcre[16|32]_extra block if one has not already -been created by a call to pcre[16|32]_study(), and to set the -PCRE_EXTRA_MARK flag and the mark field within it, every time that -pcre[16|32]_exec() is called. If the variable that the mark field -points to is non-NULL for a match, non-match, or partial match, pcretest -prints the string to which it points. For a match, this is shown on a line by -itself, tagged with "MK:". For a non-match it is added to the message. -

      -

      -The /L modifier must be followed directly by the name of a locale, for -example, -

      -  /pattern/Lfr_FR
      -
      -For this reason, it must be the last modifier. The given locale is set, -pcre[16|32]_maketables() is called to build a set of character tables for -the locale, and this is then passed to pcre[16|32]_compile() when compiling -the regular expression. Without an /L (or /T) modifier, NULL is -passed as the tables pointer; that is, /L applies only to the expression -on which it appears. -

      -

      -The /M modifier causes the size in bytes of the memory block used to hold -the compiled pattern to be output. This does not include the size of the -pcre[16|32] block; it is just the actual compiled data. If the pattern is -successfully studied with the PCRE_STUDY_JIT_COMPILE option, the size of the -JIT compiled code is also output. -

      -

      -The /Q modifier is used to test the use of pcre_stack_guard. It -must be followed by '0' or '1', specifying the return code to be given from an -external function that is passed to PCRE and used for stack checking during -compilation (see the -pcreapi -documentation for details). -

      -

      -The /S modifier causes pcre[16|32]_study() to be called after the -expression has been compiled, and the results used when the expression is -matched. There are a number of qualifying characters that may follow /S. -They may appear in any order. -

      -

      -If /S is followed by an exclamation mark, pcre[16|32]_study() is -called with the PCRE_STUDY_EXTRA_NEEDED option, causing it always to return a -pcre_extra block, even when studying discovers no useful information. -

      -

      -If /S is followed by a second S character, it suppresses studying, even -if it was requested externally by the -s command line option. This makes -it possible to specify that certain patterns are always studied, and others are -never studied, independently of -s. This feature is used in the test -files in a few cases where the output is different when the pattern is studied. -

      -

      -If the /S modifier is followed by a + character, the call to -pcre[16|32]_study() is made with all the JIT study options, requesting -just-in-time optimization support if it is available, for both normal and -partial matching. If you want to restrict the JIT compiling modes, you can -follow /S+ with a digit in the range 1 to 7: -

      -  1  normal match only
      -  2  soft partial match only
      -  3  normal match and soft partial match
      -  4  hard partial match only
      -  6  soft and hard partial match
      -  7  all three modes (default)
      -
      -If /S++ is used instead of /S+ (with or without a following digit), -the text "(JIT)" is added to the first output line after a match or no match -when JIT-compiled code was actually used. -

      -

      -Note that there is also an independent /+ modifier; it must not be given -immediately after /S or /S+ because this will be misinterpreted. -

      -

      -If JIT studying is successful, the compiled JIT code will automatically be used -when pcre[16|32]_exec() is run, except when incompatible run-time options -are specified. For more details, see the -pcrejit -documentation. See also the \J escape sequence below for a way of -setting the size of the JIT stack. -

      -

      -Finally, if /S is followed by a minus character, JIT compilation is -suppressed, even if it was requested externally by the -s command line -option. This makes it possible to specify that JIT is never to be used for -certain patterns. -

      -

      -The /T modifier must be followed by a single digit. It causes a specific -set of built-in character tables to be passed to pcre[16|32]_compile(). It -is used in the standard PCRE tests to check behaviour with different character -tables. The digit specifies the tables as follows: -

      -  0   the default ASCII tables, as distributed in
      -        pcre_chartables.c.dist
      -  1   a set of tables defining ISO 8859 characters
      -
      -In table 1, some characters whose codes are greater than 128 are identified as -letters, digits, spaces, etc. -

      -
      -Using the POSIX wrapper API -
      -

      -The /P modifier causes pcretest to call PCRE via the POSIX wrapper -API rather than its native API. This supports only the 8-bit library. When -/P is set, the following modifiers set options for the regcomp() -function: -

      -  /i    REG_ICASE
      -  /m    REG_NEWLINE
      -  /N    REG_NOSUB
      -  /s    REG_DOTALL     )
      -  /U    REG_UNGREEDY   ) These options are not part of
      -  /W    REG_UCP        )   the POSIX standard
      -  /8    REG_UTF8       )
      -
      -The /+ modifier works as described above. All other modifiers are -ignored. -

      -
      -Locking out certain modifiers -
      -

      -PCRE can be compiled with or without support for certain features such as -UTF-8/16/32 or Unicode properties. Accordingly, the standard tests are split up -into a number of different files that are selected for running depending on -which features are available. When updating the tests, it is all too easy to -put a new test into the wrong file by mistake; for example, to put a test that -requires UTF support into a file that is used when it is not available. To help -detect such mistakes as early as possible, there is a facility for locking out -specific modifiers. If an input line for pcretest starts with the string -"< forbid " the following sequence of characters is taken as a list of -forbidden modifiers. For example, in the test files that must not use UTF or -Unicode property support, this line appears: -

      -  < forbid 8W
      -
      -This locks out the /8 and /W modifiers. An immediate error is given if they are -subsequently encountered. If the character string contains < but not >, all the -multi-character modifiers that begin with < are locked out. Otherwise, such -modifiers must be explicitly listed, for example: -
      -  < forbid <JS><cr>
      -
      -There must be a single space between < and "forbid" for this feature to be -recognised. If there is not, the line is interpreted either as a request to -re-load a pre-compiled pattern (see "SAVING AND RELOADING COMPILED PATTERNS" -below) or, if there is a another < character, as a pattern that uses < as its -delimiter. -

      -
      DATA LINES
      -

      -Before each data line is passed to pcre[16|32]_exec(), leading and trailing -white space is removed, and it is then scanned for \ escapes. Some of these -are pretty esoteric features, intended for checking out some of the more -complicated features of PCRE. If you are just testing "ordinary" regular -expressions, you probably don't need any of these. The following escapes are -recognized: -

      -  \a         alarm (BEL, \x07)
      -  \b         backspace (\x08)
      -  \e         escape (\x27)
      -  \f         form feed (\x0c)
      -  \n         newline (\x0a)
      -  \qdd       set the PCRE_MATCH_LIMIT limit to dd (any number of digits)
      -  \r         carriage return (\x0d)
      -  \t         tab (\x09)
      -  \v         vertical tab (\x0b)
      -  \nnn       octal character (up to 3 octal digits); always
      -               a byte unless > 255 in UTF-8 or 16-bit or 32-bit mode
      -  \o{dd...}  octal character (any number of octal digits}
      -  \xhh       hexadecimal byte (up to 2 hex digits)
      -  \x{hh...}  hexadecimal character (any number of hex digits)
      -  \A         pass the PCRE_ANCHORED option to pcre[16|32]_exec() or pcre[16|32]_dfa_exec()
      -  \B         pass the PCRE_NOTBOL option to pcre[16|32]_exec() or pcre[16|32]_dfa_exec()
      -  \Cdd       call pcre[16|32]_copy_substring() for substring dd after a successful match (number less than 32)
      -  \Cname     call pcre[16|32]_copy_named_substring() for substring "name" after a successful match (name termin-
      -               ated by next non alphanumeric character)
      -  \C+        show the current captured substrings at callout time
      -  \C-        do not supply a callout function
      -  \C!n       return 1 instead of 0 when callout number n is reached
      -  \C!n!m     return 1 instead of 0 when callout number n is reached for the nth time
      -  \C*n       pass the number n (may be negative) as callout data; this is used as the callout return value
      -  \D         use the pcre[16|32]_dfa_exec() match function
      -  \F         only shortest match for pcre[16|32]_dfa_exec()
      -  \Gdd       call pcre[16|32]_get_substring() for substring dd after a successful match (number less than 32)
      -  \Gname     call pcre[16|32]_get_named_substring() for substring "name" after a successful match (name termin-
      -               ated by next non-alphanumeric character)
      -  \Jdd       set up a JIT stack of dd kilobytes maximum (any number of digits)
      -  \L         call pcre[16|32]_get_substringlist() after a successful match
      -  \M         discover the minimum MATCH_LIMIT and MATCH_LIMIT_RECURSION settings
      -  \N         pass the PCRE_NOTEMPTY option to pcre[16|32]_exec() or pcre[16|32]_dfa_exec(); if used twice, pass the
      -               PCRE_NOTEMPTY_ATSTART option
      -  \Odd       set the size of the output vector passed to pcre[16|32]_exec() to dd (any number of digits)
      -  \P         pass the PCRE_PARTIAL_SOFT option to pcre[16|32]_exec() or pcre[16|32]_dfa_exec(); if used twice, pass the
      -               PCRE_PARTIAL_HARD option
      -  \Qdd       set the PCRE_MATCH_LIMIT_RECURSION limit to dd (any number of digits)
      -  \R         pass the PCRE_DFA_RESTART option to pcre[16|32]_dfa_exec()
      -  \S         output details of memory get/free calls during matching
      -  \Y         pass the PCRE_NO_START_OPTIMIZE option to pcre[16|32]_exec() or pcre[16|32]_dfa_exec()
      -  \Z         pass the PCRE_NOTEOL option to pcre[16|32]_exec() or pcre[16|32]_dfa_exec()
      -  \?         pass the PCRE_NO_UTF[8|16|32]_CHECK option to pcre[16|32]_exec() or pcre[16|32]_dfa_exec()
      -  \>dd       start the match at offset dd (optional "-"; then any number of digits); this sets the startoffset
      -               argument for pcre[16|32]_exec() or pcre[16|32]_dfa_exec()
      -  \<cr>      pass the PCRE_NEWLINE_CR option to pcre[16|32]_exec() or pcre[16|32]_dfa_exec()
      -  \<lf>      pass the PCRE_NEWLINE_LF option to pcre[16|32]_exec() or pcre[16|32]_dfa_exec()
      -  \<crlf>    pass the PCRE_NEWLINE_CRLF option to pcre[16|32]_exec() or pcre[16|32]_dfa_exec()
      -  \<anycrlf> pass the PCRE_NEWLINE_ANYCRLF option to pcre[16|32]_exec() or pcre[16|32]_dfa_exec()
      -  \<any>     pass the PCRE_NEWLINE_ANY option to pcre[16|32]_exec() or pcre[16|32]_dfa_exec()
      -
      -The use of \x{hh...} is not dependent on the use of the /8 modifier on -the pattern. It is recognized always. There may be any number of hexadecimal -digits inside the braces; invalid values provoke error messages. -

      -

      -Note that \xhh specifies one byte rather than one character in UTF-8 mode; -this makes it possible to construct invalid UTF-8 sequences for testing -purposes. On the other hand, \x{hh} is interpreted as a UTF-8 character in -UTF-8 mode, generating more than one byte if the value is greater than 127. -When testing the 8-bit library not in UTF-8 mode, \x{hh} generates one byte -for values less than 256, and causes an error for greater values. -

      -

      -In UTF-16 mode, all 4-digit \x{hhhh} values are accepted. This makes it -possible to construct invalid UTF-16 sequences for testing purposes. -

      -

      -In UTF-32 mode, all 4- to 8-digit \x{...} values are accepted. This makes it -possible to construct invalid UTF-32 sequences for testing purposes. -

      -

      -The escapes that specify line ending sequences are literal strings, exactly as -shown. No more than one newline setting should be present in any data line. -

      -

      -A backslash followed by anything else just escapes the anything else. If -the very last character is a backslash, it is ignored. This gives a way of -passing an empty line as data, since a real empty line terminates the data -input. -

      -

      -The \J escape provides a way of setting the maximum stack size that is -used by the just-in-time optimization code. It is ignored if JIT optimization -is not being used. Providing a stack that is larger than the default 32K is -necessary only for very complicated patterns. -

      -

      -If \M is present, pcretest calls pcre[16|32]_exec() several times, -with different values in the match_limit and match_limit_recursion -fields of the pcre[16|32]_extra data structure, until it finds the minimum -numbers for each parameter that allow pcre[16|32]_exec() to complete without -error. Because this is testing a specific feature of the normal interpretive -pcre[16|32]_exec() execution, the use of any JIT optimization that might -have been set up by the /S+ qualifier of -s+ option is disabled. -

      -

      -The match_limit number is a measure of the amount of backtracking -that takes place, and checking it out can be instructive. For most simple -matches, the number is quite small, but for patterns with very large numbers of -matching possibilities, it can become large very quickly with increasing length -of subject string. The match_limit_recursion number is a measure of how -much stack (or, if PCRE is compiled with NO_RECURSE, how much heap) memory is -needed to complete the match attempt. -

      -

      -When \O is used, the value specified may be higher or lower than the size set -by the -O command line option (or defaulted to 45); \O applies only to -the call of pcre[16|32]_exec() for the line in which it appears. -

      -

      -If the /P modifier was present on the pattern, causing the POSIX wrapper -API to be used, the only option-setting sequences that have any effect are \B, -\N, and \Z, causing REG_NOTBOL, REG_NOTEMPTY, and REG_NOTEOL, respectively, -to be passed to regexec(). -

      -
      THE ALTERNATIVE MATCHING FUNCTION
      -

      -By default, pcretest uses the standard PCRE matching function, -pcre[16|32]_exec() to match each data line. PCRE also supports an -alternative matching function, pcre[16|32]_dfa_test(), which operates in a -different way, and has some restrictions. The differences between the two -functions are described in the -pcrematching -documentation. -

      -

      -If a data line contains the \D escape sequence, or if the command line -contains the -dfa option, the alternative matching function is used. -This function finds all possible matches at a given point. If, however, the \F -escape sequence is present in the data line, it stops after the first match is -found. This is always the shortest possible match. -

      -
      DEFAULT OUTPUT FROM PCRETEST
      -

      -This section describes the output when the normal matching function, -pcre[16|32]_exec(), is being used. -

      -

      -When a match succeeds, pcretest outputs the list of captured substrings -that pcre[16|32]_exec() returns, starting with number 0 for the string that -matched the whole pattern. Otherwise, it outputs "No match" when the return is -PCRE_ERROR_NOMATCH, and "Partial match:" followed by the partially matching -substring when pcre[16|32]_exec() returns PCRE_ERROR_PARTIAL. (Note that -this is the entire substring that was inspected during the partial match; it -may include characters before the actual match start if a lookbehind assertion, -\K, \b, or \B was involved.) For any other return, pcretest outputs -the PCRE negative error number and a short descriptive phrase. If the error is -a failed UTF string check, the offset of the start of the failing character and -the reason code are also output, provided that the size of the output vector is -at least two. Here is an example of an interactive pcretest run. -

      -  $ pcretest
      -  PCRE version 8.13 2011-04-30
      -
      -    re> /^abc(\d+)/
      -  data> abc123
      -   0: abc123
      -   1: 123
      -  data> xyz
      -  No match
      -
      -Unset capturing substrings that are not followed by one that is set are not -returned by pcre[16|32]_exec(), and are not shown by pcretest. In the -following example, there are two capturing substrings, but when the first data -line is matched, the second, unset substring is not shown. An "internal" unset -substring is shown as "<unset>", as for the second data line. -
      -    re> /(a)|(b)/
      -  data> a
      -   0: a
      -   1: a
      -  data> b
      -   0: b
      -   1: <unset>
      -   2: b
      -
      -If the strings contain any non-printing characters, they are output as \xhh -escapes if the value is less than 256 and UTF mode is not set. Otherwise they -are output as \x{hh...} escapes. See below for the definition of non-printing -characters. If the pattern has the /+ modifier, the output for substring -0 is followed by the the rest of the subject string, identified by "0+" like -this: -
      -    re> /cat/+
      -  data> cataract
      -   0: cat
      -   0+ aract
      -
      -If the pattern has the /g or /G modifier, the results of successive -matching attempts are output in sequence, like this: -
      -    re> /\Bi(\w\w)/g
      -  data> Mississippi
      -   0: iss
      -   1: ss
      -   0: iss
      -   1: ss
      -   0: ipp
      -   1: pp
      -
      -"No match" is output only if the first match attempt fails. Here is an example -of a failure message (the offset 4 that is specified by \>4 is past the end of -the subject string): -
      -    re> /xyz/
      -  data> xyz\>4
      -  Error -24 (bad offset value)
      -
      -

      -

      -If any of the sequences \C, \G, or \L are present in a -data line that is successfully matched, the substrings extracted by the -convenience functions are output with C, G, or L after the string number -instead of a colon. This is in addition to the normal full list. The string -length (that is, the return from the extraction function) is given in -parentheses after each string for \C and \G. -

      -

      -Note that whereas patterns can be continued over several lines (a plain ">" -prompt is used for continuations), data lines may not. However newlines can be -included in data by means of the \n escape (or \r, \r\n, etc., depending on -the newline sequence setting). -

      -
      OUTPUT FROM THE ALTERNATIVE MATCHING FUNCTION
      -

      -When the alternative matching function, pcre[16|32]_dfa_exec(), is used (by -means of the \D escape sequence or the -dfa command line option), the -output consists of a list of all the matches that start at the first point in -the subject where there is at least one match. For example: -

      -    re> /(tang|tangerine|tan)/
      -  data> yellow tangerine\D
      -   0: tangerine
      -   1: tang
      -   2: tan
      -
      -(Using the normal matching function on this data finds only "tang".) The -longest matching string is always given first (and numbered zero). After a -PCRE_ERROR_PARTIAL return, the output is "Partial match:", followed by the -partially matching substring. (Note that this is the entire substring that was -inspected during the partial match; it may include characters before the actual -match start if a lookbehind assertion, \K, \b, or \B was involved.) -

      -

      -If /g is present on the pattern, the search for further matches resumes -at the end of the longest match. For example: -

      -    re> /(tang|tangerine|tan)/g
      -  data> yellow tangerine and tangy sultana\D
      -   0: tangerine
      -   1: tang
      -   2: tan
      -   0: tang
      -   1: tan
      -   0: tan
      -
      -Since the matching function does not support substring capture, the escape -sequences that are concerned with captured substrings are not relevant. -

      -
      RESTARTING AFTER A PARTIAL MATCH
      -

      -When the alternative matching function has given the PCRE_ERROR_PARTIAL return, -indicating that the subject partially matched the pattern, you can restart the -match with additional subject data by means of the \R escape sequence. For -example: -

      -    re> /^\d?\d(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)\d\d$/
      -  data> 23ja\P\D
      -  Partial match: 23ja
      -  data> n05\R\D
      -   0: n05
      -
      -For further information about partial matching, see the -pcrepartial -documentation. -

      -
      CALLOUTS
      -

      -If the pattern contains any callout requests, pcretest's callout function -is called during matching. This works with both matching functions. By default, -the called function displays the callout number, the start and current -positions in the text at the callout time, and the next pattern item to be -tested. For example: -

      -  --->pqrabcdef
      -    0    ^  ^     \d
      -
      -This output indicates that callout number 0 occurred for a match attempt -starting at the fourth character of the subject string, when the pointer was at -the seventh character of the data, and when the next pattern item was \d. Just -one circumflex is output if the start and current positions are the same. -

      -

      -Callouts numbered 255 are assumed to be automatic callouts, inserted as a -result of the /C pattern modifier. In this case, instead of showing the -callout number, the offset in the pattern, preceded by a plus, is output. For -example: -

      -    re> /\d?[A-E]\*/C
      -  data> E*
      -  --->E*
      -   +0 ^      \d?
      -   +3 ^      [A-E]
      -   +8 ^^     \*
      -  +10 ^ ^
      -   0: E*
      -
      -If a pattern contains (*MARK) items, an additional line is output whenever -a change of latest mark is passed to the callout function. For example: -
      -    re> /a(*MARK:X)bc/C
      -  data> abc
      -  --->abc
      -   +0 ^       a
      -   +1 ^^      (*MARK:X)
      -  +10 ^^      b
      -  Latest Mark: X
      -  +11 ^ ^     c
      -  +12 ^  ^
      -   0: abc
      -
      -The mark changes between matching "a" and "b", but stays the same for the rest -of the match, so nothing more is output. If, as a result of backtracking, the -mark reverts to being unset, the text "<unset>" is output. -

      -

      -The callout function in pcretest returns zero (carry on matching) by -default, but you can use a \C item in a data line (as described above) to -change this and other parameters of the callout. -

      -

      -Inserting callouts can be helpful when using pcretest to check -complicated regular expressions. For further information about callouts, see -the -pcrecallout -documentation. -

      -
      NON-PRINTING CHARACTERS
      -

      -When pcretest is outputting text in the compiled version of a pattern, -bytes other than 32-126 are always treated as non-printing characters are are -therefore shown as hex escapes. -

      -

      -When pcretest is outputting text that is a matched part of a subject -string, it behaves in the same way, unless a different locale has been set for -the pattern (using the /L modifier). In this case, the isprint() -function to distinguish printing and non-printing characters. -

      -
      SAVING AND RELOADING COMPILED PATTERNS
      -

      -The facilities described in this section are not available when the POSIX -interface to PCRE is being used, that is, when the /P pattern modifier is -specified. -

      -

      -When the POSIX interface is not in use, you can cause pcretest to write a -compiled pattern to a file, by following the modifiers with > and a file name. -For example: -

      -  /pattern/im >/some/file
      -
      -See the -pcreprecompile -documentation for a discussion about saving and re-using compiled patterns. -Note that if the pattern was successfully studied with JIT optimization, the -JIT data cannot be saved. -

      -

      -The data that is written is binary. The first eight bytes are the length of the -compiled pattern data followed by the length of the optional study data, each -written as four bytes in big-endian order (most significant byte first). If -there is no study data (either the pattern was not studied, or studying did not -return any data), the second length is zero. The lengths are followed by an -exact copy of the compiled pattern. If there is additional study data, this -(excluding any JIT data) follows immediately after the compiled pattern. After -writing the file, pcretest expects to read a new pattern. -

      -

      -A saved pattern can be reloaded into pcretest by specifying < and a file -name instead of a pattern. There must be no space between < and the file name, -which must not contain a < character, as otherwise pcretest will -interpret the line as a pattern delimited by < characters. For example: -

      -   re> </some/file
      -  Compiled pattern loaded from /some/file
      -  No study data
      -
      -If the pattern was previously studied with the JIT optimization, the JIT -information cannot be saved and restored, and so is lost. When the pattern has -been loaded, pcretest proceeds to read data lines in the usual way. -

      -

      -You can copy a file written by pcretest to a different host and reload it -there, even if the new host has opposite endianness to the one on which the -pattern was compiled. For example, you can compile on an i86 machine and run on -a SPARC machine. When a pattern is reloaded on a host with different -endianness, the confirmation message is changed to: -

      -  Compiled pattern (byte-inverted) loaded from /some/file
      -
      -The test suite contains some saved pre-compiled patterns with different -endianness. These are reloaded using "<!" instead of just "<". This suppresses -the "(byte-inverted)" text so that the output is the same on all hosts. It also -forces debugging output once the pattern has been reloaded. -

      -

      -File names for saving and reloading can be absolute or relative, but note that -the shell facility of expanding a file name that starts with a tilde (~) is not -available. -

      -

      -The ability to save and reload files in pcretest is intended for testing -and experimentation. It is not intended for production use because only a -single pattern can be written to a file. Furthermore, there is no facility for -supplying custom character tables for use with a reloaded pattern. If the -original pattern was compiled with custom tables, an attempt to match a subject -string using a reloaded pattern is likely to cause pcretest to crash. -Finally, if you attempt to load a file that is not in the correct format, the -result is undefined. -

      -
      SEE ALSO
      -

      -pcre(3), pcre16(3), pcre32(3), pcreapi(3), -pcrecallout(3), -pcrejit, pcrematching(3), pcrepartial(d), -pcrepattern(3), pcreprecompile(3). -

      -
      AUTHOR
      -

      -Philip Hazel -
      -University Computing Service -
      -Cambridge CB2 3QH, England. -
      -

      -
      REVISION
      -

      -Last updated: 23 February 2017 -
      -Copyright © 1997-2017 University of Cambridge. -
      -

      -Return to the PCRE index page. -

      diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcreunicode.html b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcreunicode.html deleted file mode 100644 index ab36bc61..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/pcreunicode.html +++ /dev/null @@ -1,262 +0,0 @@ - - -pcreunicode specification - - -

      pcreunicode man page

      -

      -Return to the PCRE index page. -

      -

      -This page is part of the PCRE HTML documentation. It was generated automatically -from the original man page. If there is any nonsense in it, please consult the -man page, in case the conversion went wrong. -
      -
      -UTF-8, UTF-16, UTF-32, AND UNICODE PROPERTY SUPPORT -
      -

      -As well as UTF-8 support, PCRE also supports UTF-16 (from release 8.30) and -UTF-32 (from release 8.32), by means of two additional libraries. They can be -built as well as, or instead of, the 8-bit library. -

      -
      -UTF-8 SUPPORT -
      -

      -In order process UTF-8 strings, you must build PCRE's 8-bit library with UTF -support, and, in addition, you must call -pcre_compile() -with the PCRE_UTF8 option flag, or the pattern must start with the sequence -(*UTF8) or (*UTF). When either of these is the case, both the pattern and any -subject strings that are matched against it are treated as UTF-8 strings -instead of strings of individual 1-byte characters. -

      -
      -UTF-16 AND UTF-32 SUPPORT -
      -

      -In order process UTF-16 or UTF-32 strings, you must build PCRE's 16-bit or -32-bit library with UTF support, and, in addition, you must call -pcre16_compile() -or -pcre32_compile() -with the PCRE_UTF16 or PCRE_UTF32 option flag, as appropriate. Alternatively, -the pattern must start with the sequence (*UTF16), (*UTF32), as appropriate, or -(*UTF), which can be used with either library. When UTF mode is set, both the -pattern and any subject strings that are matched against it are treated as -UTF-16 or UTF-32 strings instead of strings of individual 16-bit or 32-bit -characters. -

      -
      -UTF SUPPORT OVERHEAD -
      -

      -If you compile PCRE with UTF support, but do not use it at run time, the -library will be a bit bigger, but the additional run time overhead is limited -to testing the PCRE_UTF[8|16|32] flag occasionally, so should not be very big. -

      -
      -UNICODE PROPERTY SUPPORT -
      -

      -If PCRE is built with Unicode character property support (which implies UTF -support), the escape sequences \p{..}, \P{..}, and \X can be used. -The available properties that can be tested are limited to the general -category properties such as Lu for an upper case letter or Nd for a decimal -number, the Unicode script names such as Arabic or Han, and the derived -properties Any and L&. Full lists is given in the -pcrepattern -and -pcresyntax -documentation. Only the short names for properties are supported. For example, -\p{L} matches a letter. Its Perl synonym, \p{Letter}, is not supported. -Furthermore, in Perl, many properties may optionally be prefixed by "Is", for -compatibility with Perl 5.6. PCRE does not support this. -

      -
      -Validity of UTF-8 strings -
      -

      -When you set the PCRE_UTF8 flag, the byte strings passed as patterns and -subjects are (by default) checked for validity on entry to the relevant -functions. The entire string is checked before any other processing takes -place. From release 7.3 of PCRE, the check is according the rules of RFC 3629, -which are themselves derived from the Unicode specification. Earlier releases -of PCRE followed the rules of RFC 2279, which allows the full range of 31-bit -values (0 to 0x7FFFFFFF). The current check allows only values in the range U+0 -to U+10FFFF, excluding the surrogate area. (From release 8.33 the so-called -"non-character" code points are no longer excluded because Unicode corrigendum -#9 makes it clear that they should not be.) -

      -

      -Characters in the "Surrogate Area" of Unicode are reserved for use by UTF-16, -where they are used in pairs to encode codepoints with values greater than -0xFFFF. The code points that are encoded by UTF-16 pairs are available -independently in the UTF-8 and UTF-32 encodings. (In other words, the whole -surrogate thing is a fudge for UTF-16 which unfortunately messes up UTF-8 and -UTF-32.) -

      -

      -If an invalid UTF-8 string is passed to PCRE, an error return is given. At -compile time, the only additional information is the offset to the first byte -of the failing character. The run-time functions pcre_exec() and -pcre_dfa_exec() also pass back this information, as well as a more -detailed reason code if the caller has provided memory in which to do this. -

      -

      -In some situations, you may already know that your strings are valid, and -therefore want to skip these checks in order to improve performance, for -example in the case of a long subject string that is being scanned repeatedly. -If you set the PCRE_NO_UTF8_CHECK flag at compile time or at run time, PCRE -assumes that the pattern or subject it is given (respectively) contains only -valid UTF-8 codes. In this case, it does not diagnose an invalid UTF-8 string. -

      -

      -Note that passing PCRE_NO_UTF8_CHECK to pcre_compile() just disables the -check for the pattern; it does not also apply to subject strings. If you want -to disable the check for a subject string you must pass this option to -pcre_exec() or pcre_dfa_exec(). -

      -

      -If you pass an invalid UTF-8 string when PCRE_NO_UTF8_CHECK is set, the result -is undefined and your program may crash. -

      -
      -Validity of UTF-16 strings -
      -

      -When you set the PCRE_UTF16 flag, the strings of 16-bit data units that are -passed as patterns and subjects are (by default) checked for validity on entry -to the relevant functions. Values other than those in the surrogate range -U+D800 to U+DFFF are independent code points. Values in the surrogate range -must be used in pairs in the correct manner. -

      -

      -If an invalid UTF-16 string is passed to PCRE, an error return is given. At -compile time, the only additional information is the offset to the first data -unit of the failing character. The run-time functions pcre16_exec() and -pcre16_dfa_exec() also pass back this information, as well as a more -detailed reason code if the caller has provided memory in which to do this. -

      -

      -In some situations, you may already know that your strings are valid, and -therefore want to skip these checks in order to improve performance. If you set -the PCRE_NO_UTF16_CHECK flag at compile time or at run time, PCRE assumes that -the pattern or subject it is given (respectively) contains only valid UTF-16 -sequences. In this case, it does not diagnose an invalid UTF-16 string. -However, if an invalid string is passed, the result is undefined. -

      -
      -Validity of UTF-32 strings -
      -

      -When you set the PCRE_UTF32 flag, the strings of 32-bit data units that are -passed as patterns and subjects are (by default) checked for validity on entry -to the relevant functions. This check allows only values in the range U+0 -to U+10FFFF, excluding the surrogate area U+D800 to U+DFFF. -

      -

      -If an invalid UTF-32 string is passed to PCRE, an error return is given. At -compile time, the only additional information is the offset to the first data -unit of the failing character. The run-time functions pcre32_exec() and -pcre32_dfa_exec() also pass back this information, as well as a more -detailed reason code if the caller has provided memory in which to do this. -

      -

      -In some situations, you may already know that your strings are valid, and -therefore want to skip these checks in order to improve performance. If you set -the PCRE_NO_UTF32_CHECK flag at compile time or at run time, PCRE assumes that -the pattern or subject it is given (respectively) contains only valid UTF-32 -sequences. In this case, it does not diagnose an invalid UTF-32 string. -However, if an invalid string is passed, the result is undefined. -

      -
      -General comments about UTF modes -
      -

      -1. Codepoints less than 256 can be specified in patterns by either braced or -unbraced hexadecimal escape sequences (for example, \x{b3} or \xb3). Larger -values have to use braced sequences. -

      -

      -2. Octal numbers up to \777 are recognized, and in UTF-8 mode they match -two-byte characters for values greater than \177. -

      -

      -3. Repeat quantifiers apply to complete UTF characters, not to individual -data units, for example: \x{100}{3}. -

      -

      -4. The dot metacharacter matches one UTF character instead of a single data -unit. -

      -

      -5. The escape sequence \C can be used to match a single byte in UTF-8 mode, or -a single 16-bit data unit in UTF-16 mode, or a single 32-bit data unit in -UTF-32 mode, but its use can lead to some strange effects because it breaks up -multi-unit characters (see the description of \C in the -pcrepattern -documentation). The use of \C is not supported in the alternative matching -function pcre[16|32]_dfa_exec(), nor is it supported in UTF mode by the -JIT optimization of pcre[16|32]_exec(). If JIT optimization is requested -for a UTF pattern that contains \C, it will not succeed, and so the matching -will be carried out by the normal interpretive function. -

      -

      -6. The character escapes \b, \B, \d, \D, \s, \S, \w, and \W correctly -test characters of any code value, but, by default, the characters that PCRE -recognizes as digits, spaces, or word characters remain the same set as in -non-UTF mode, all with values less than 256. This remains true even when PCRE -is built to include Unicode property support, because to do otherwise would -slow down PCRE in many common cases. Note in particular that this applies to -\b and \B, because they are defined in terms of \w and \W. If you really -want to test for a wider sense of, say, "digit", you can use explicit Unicode -property tests such as \p{Nd}. Alternatively, if you set the PCRE_UCP option, -the way that the character escapes work is changed so that Unicode properties -are used to determine which characters match. There are more details in the -section on -generic character types -in the -pcrepattern -documentation. -

      -

      -7. Similarly, characters that match the POSIX named character classes are all -low-valued characters, unless the PCRE_UCP option is set. -

      -

      -8. However, the horizontal and vertical white space matching escapes (\h, \H, -\v, and \V) do match all the appropriate Unicode characters, whether or not -PCRE_UCP is set. -

      -

      -9. Case-insensitive matching applies only to characters whose values are less -than 128, unless PCRE is built with Unicode property support. A few Unicode -characters such as Greek sigma have more than two codepoints that are -case-equivalent. Up to and including PCRE release 8.31, only one-to-one case -mappings were supported, but later releases (with Unicode property support) do -treat as case-equivalent all versions of characters such as Greek sigma. -

      -
      -AUTHOR -
      -

      -Philip Hazel -
      -University Computing Service -
      -Cambridge CB2 3QH, England. -
      -

      -
      -REVISION -
      -

      -Last updated: 27 February 2013 -
      -Copyright © 1997-2013 University of Cambridge. -
      -

      -Return to the PCRE index page. -

      diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/pcre-config.txt b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/pcre-config.txt deleted file mode 100644 index 8503ab0e..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/pcre-config.txt +++ /dev/null @@ -1,86 +0,0 @@ -PCRE-CONFIG(1) General Commands Manual PCRE-CONFIG(1) - - - -NAME - pcre-config - program to return PCRE configuration - -SYNOPSIS - - pcre-config [--prefix] [--exec-prefix] [--version] [--libs] - [--libs16] [--libs32] [--libs-cpp] [--libs-posix] - [--cflags] [--cflags-posix] - - -DESCRIPTION - - pcre-config returns the configuration of the installed PCRE libraries - and the options required to compile a program to use them. Some of the - options apply only to the 8-bit, or 16-bit, or 32-bit libraries, - respectively, and are not available if only one of those libraries has - been built. If an unavailable option is encountered, the "usage" infor- - mation is output. - - -OPTIONS - - --prefix Writes the directory prefix used in the PCRE installation for - architecture independent files (/usr on many systems, - /usr/local on some systems) to the standard output. - - --exec-prefix - Writes the directory prefix used in the PCRE installation for - architecture dependent files (normally the same as --prefix) - to the standard output. - - --version Writes the version number of the installed PCRE libraries to - the standard output. - - --libs Writes to the standard output the command line options - required to link with the 8-bit PCRE library (-lpcre on many - systems). - - --libs16 Writes to the standard output the command line options - required to link with the 16-bit PCRE library (-lpcre16 on - many systems). - - --libs32 Writes to the standard output the command line options - required to link with the 32-bit PCRE library (-lpcre32 on - many systems). - - --libs-cpp - Writes to the standard output the command line options - required to link with PCRE's C++ wrapper library (-lpcrecpp - -lpcre on many systems). - - --libs-posix - Writes to the standard output the command line options - required to link with PCRE's POSIX API wrapper library - (-lpcreposix -lpcre on many systems). - - --cflags Writes to the standard output the command line options - required to compile files that use PCRE (this may include - some -I options, but is blank on many systems). - - --cflags-posix - Writes to the standard output the command line options - required to compile files that use PCRE's POSIX API wrapper - library (this may include some -I options, but is blank on - many systems). - - -SEE ALSO - - pcre(3) - - -AUTHOR - - This manual page was originally written by Mark Baker for the Debian - GNU/Linux system. It has been subsequently revised as a generic PCRE - man page. - - -REVISION - - Last updated: 24 June 2012 diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/pcre.txt b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/pcre.txt deleted file mode 100644 index c027538f..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/pcre.txt +++ /dev/null @@ -1,10502 +0,0 @@ ------------------------------------------------------------------------------ -This file contains a concatenation of the PCRE man pages, converted to plain -text format for ease of searching with a text editor, or for use on systems -that do not have a man page processor. The small individual files that give -synopses of each function in the library have not been included. Neither has -the pcredemo program. There are separate text files for the pcregrep and -pcretest commands. ------------------------------------------------------------------------------ - - -PCRE(3) Library Functions Manual PCRE(3) - - - -NAME - PCRE - Perl-compatible regular expressions (original API) - -PLEASE TAKE NOTE - - This document relates to PCRE releases that use the original API, with - library names libpcre, libpcre16, and libpcre32. January 2015 saw the - first release of a new API, known as PCRE2, with release numbers start- - ing at 10.00 and library names libpcre2-8, libpcre2-16, and - libpcre2-32. The old libraries (now called PCRE1) are still being main- - tained for bug fixes, but there will be no new development. New - projects are advised to use the new PCRE2 libraries. - - -INTRODUCTION - - The PCRE library is a set of functions that implement regular expres- - sion pattern matching using the same syntax and semantics as Perl, with - just a few differences. Some features that appeared in Python and PCRE - before they appeared in Perl are also available using the Python syn- - tax, there is some support for one or two .NET and Oniguruma syntax - items, and there is an option for requesting some minor changes that - give better JavaScript compatibility. - - Starting with release 8.30, it is possible to compile two separate PCRE - libraries: the original, which supports 8-bit character strings - (including UTF-8 strings), and a second library that supports 16-bit - character strings (including UTF-16 strings). The build process allows - either one or both to be built. The majority of the work to make this - possible was done by Zoltan Herczeg. - - Starting with release 8.32 it is possible to compile a third separate - PCRE library that supports 32-bit character strings (including UTF-32 - strings). The build process allows any combination of the 8-, 16- and - 32-bit libraries. The work to make this possible was done by Christian - Persch. - - The three libraries contain identical sets of functions, except that - the names in the 16-bit library start with pcre16_ instead of pcre_, - and the names in the 32-bit library start with pcre32_ instead of - pcre_. To avoid over-complication and reduce the documentation mainte- - nance load, most of the documentation describes the 8-bit library, with - the differences for the 16-bit and 32-bit libraries described sepa- - rately in the pcre16 and pcre32 pages. References to functions or - structures of the form pcre[16|32]_xxx should be read as meaning - "pcre_xxx when using the 8-bit library, pcre16_xxx when using the - 16-bit library, or pcre32_xxx when using the 32-bit library". - - The current implementation of PCRE corresponds approximately with Perl - 5.12, including support for UTF-8/16/32 encoded strings and Unicode - general category properties. However, UTF-8/16/32 and Unicode support - has to be explicitly enabled; it is not the default. The Unicode tables - correspond to Unicode release 6.3.0. - - In addition to the Perl-compatible matching function, PCRE contains an - alternative function that matches the same compiled patterns in a dif- - ferent way. In certain circumstances, the alternative function has some - advantages. For a discussion of the two matching algorithms, see the - pcrematching page. - - PCRE is written in C and released as a C library. A number of people - have written wrappers and interfaces of various kinds. In particular, - Google Inc. have provided a comprehensive C++ wrapper for the 8-bit - library. This is now included as part of the PCRE distribution. The - pcrecpp page has details of this interface. Other people's contribu- - tions can be found in the Contrib directory at the primary FTP site, - which is: - - ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre - - Details of exactly which Perl regular expression features are and are - not supported by PCRE are given in separate documents. See the pcrepat- - tern and pcrecompat pages. There is a syntax summary in the pcresyntax - page. - - Some features of PCRE can be included, excluded, or changed when the - library is built. The pcre_config() function makes it possible for a - client to discover which features are available. The features them- - selves are described in the pcrebuild page. Documentation about build- - ing PCRE for various operating systems can be found in the README and - NON-AUTOTOOLS_BUILD files in the source distribution. - - The libraries contains a number of undocumented internal functions and - data tables that are used by more than one of the exported external - functions, but which are not intended for use by external callers. - Their names all begin with "_pcre_" or "_pcre16_" or "_pcre32_", which - hopefully will not provoke any name clashes. In some environments, it - is possible to control which external symbols are exported when a - shared library is built, and in these cases the undocumented symbols - are not exported. - - -SECURITY CONSIDERATIONS - - If you are using PCRE in a non-UTF application that permits users to - supply arbitrary patterns for compilation, you should be aware of a - feature that allows users to turn on UTF support from within a pattern, - provided that PCRE was built with UTF support. For example, an 8-bit - pattern that begins with "(*UTF8)" or "(*UTF)" turns on UTF-8 mode, - which interprets patterns and subjects as strings of UTF-8 characters - instead of individual 8-bit characters. This causes both the pattern - and any data against which it is matched to be checked for UTF-8 valid- - ity. If the data string is very long, such a check might use suffi- - ciently many resources as to cause your application to lose perfor- - mance. - - One way of guarding against this possibility is to use the - pcre_fullinfo() function to check the compiled pattern's options for - UTF. Alternatively, from release 8.33, you can set the PCRE_NEVER_UTF - option at compile time. This causes an compile time error if a pattern - contains a UTF-setting sequence. - - If your application is one that supports UTF, be aware that validity - checking can take time. If the same data string is to be matched many - times, you can use the PCRE_NO_UTF[8|16|32]_CHECK option for the second - and subsequent matches to save redundant checks. - - Another way that performance can be hit is by running a pattern that - has a very large search tree against a string that will never match. - Nested unlimited repeats in a pattern are a common example. PCRE pro- - vides some protection against this: see the PCRE_EXTRA_MATCH_LIMIT fea- - ture in the pcreapi page. - - -USER DOCUMENTATION - - The user documentation for PCRE comprises a number of different sec- - tions. In the "man" format, each of these is a separate "man page". In - the HTML format, each is a separate page, linked from the index page. - In the plain text format, the descriptions of the pcregrep and pcretest - programs are in files called pcregrep.txt and pcretest.txt, respec- - tively. The remaining sections, except for the pcredemo section (which - is a program listing), are concatenated in pcre.txt, for ease of - searching. The sections are as follows: - - pcre this document - pcre-config show PCRE installation configuration information - pcre16 details of the 16-bit library - pcre32 details of the 32-bit library - pcreapi details of PCRE's native C API - pcrebuild building PCRE - pcrecallout details of the callout feature - pcrecompat discussion of Perl compatibility - pcrecpp details of the C++ wrapper for the 8-bit library - pcredemo a demonstration C program that uses PCRE - pcregrep description of the pcregrep command (8-bit only) - pcrejit discussion of the just-in-time optimization support - pcrelimits details of size and other limits - pcrematching discussion of the two matching algorithms - pcrepartial details of the partial matching facility - pcrepattern syntax and semantics of supported - regular expressions - pcreperform discussion of performance issues - pcreposix the POSIX-compatible C API for the 8-bit library - pcreprecompile details of saving and re-using precompiled patterns - pcresample discussion of the pcredemo program - pcrestack discussion of stack usage - pcresyntax quick syntax reference - pcretest description of the pcretest testing command - pcreunicode discussion of Unicode and UTF-8/16/32 support - - In the "man" and HTML formats, there is also a short page for each C - library function, listing its arguments and results. - - -AUTHOR - - Philip Hazel - University Computing Service - Cambridge CB2 3QH, England. - - Putting an actual email address here seems to have been a spam magnet, - so I've taken it away. If you want to email me, use my two initials, - followed by the two digits 10, at the domain cam.ac.uk. - - -REVISION - - Last updated: 10 February 2015 - Copyright (c) 1997-2015 University of Cambridge. ------------------------------------------------------------------------------- - - -PCRE(3) Library Functions Manual PCRE(3) - - - -NAME - PCRE - Perl-compatible regular expressions - - #include - - -PCRE 16-BIT API BASIC FUNCTIONS - - pcre16 *pcre16_compile(PCRE_SPTR16 pattern, int options, - const char **errptr, int *erroffset, - const unsigned char *tableptr); - - pcre16 *pcre16_compile2(PCRE_SPTR16 pattern, int options, - int *errorcodeptr, - const char **errptr, int *erroffset, - const unsigned char *tableptr); - - pcre16_extra *pcre16_study(const pcre16 *code, int options, - const char **errptr); - - void pcre16_free_study(pcre16_extra *extra); - - int pcre16_exec(const pcre16 *code, const pcre16_extra *extra, - PCRE_SPTR16 subject, int length, int startoffset, - int options, int *ovector, int ovecsize); - - int pcre16_dfa_exec(const pcre16 *code, const pcre16_extra *extra, - PCRE_SPTR16 subject, int length, int startoffset, - int options, int *ovector, int ovecsize, - int *workspace, int wscount); - - -PCRE 16-BIT API STRING EXTRACTION FUNCTIONS - - int pcre16_copy_named_substring(const pcre16 *code, - PCRE_SPTR16 subject, int *ovector, - int stringcount, PCRE_SPTR16 stringname, - PCRE_UCHAR16 *buffer, int buffersize); - - int pcre16_copy_substring(PCRE_SPTR16 subject, int *ovector, - int stringcount, int stringnumber, PCRE_UCHAR16 *buffer, - int buffersize); - - int pcre16_get_named_substring(const pcre16 *code, - PCRE_SPTR16 subject, int *ovector, - int stringcount, PCRE_SPTR16 stringname, - PCRE_SPTR16 *stringptr); - - int pcre16_get_stringnumber(const pcre16 *code, - PCRE_SPTR16 name); - - int pcre16_get_stringtable_entries(const pcre16 *code, - PCRE_SPTR16 name, PCRE_UCHAR16 **first, PCRE_UCHAR16 **last); - - int pcre16_get_substring(PCRE_SPTR16 subject, int *ovector, - int stringcount, int stringnumber, - PCRE_SPTR16 *stringptr); - - int pcre16_get_substring_list(PCRE_SPTR16 subject, - int *ovector, int stringcount, PCRE_SPTR16 **listptr); - - void pcre16_free_substring(PCRE_SPTR16 stringptr); - - void pcre16_free_substring_list(PCRE_SPTR16 *stringptr); - - -PCRE 16-BIT API AUXILIARY FUNCTIONS - - pcre16_jit_stack *pcre16_jit_stack_alloc(int startsize, int maxsize); - - void pcre16_jit_stack_free(pcre16_jit_stack *stack); - - void pcre16_assign_jit_stack(pcre16_extra *extra, - pcre16_jit_callback callback, void *data); - - const unsigned char *pcre16_maketables(void); - - int pcre16_fullinfo(const pcre16 *code, const pcre16_extra *extra, - int what, void *where); - - int pcre16_refcount(pcre16 *code, int adjust); - - int pcre16_config(int what, void *where); - - const char *pcre16_version(void); - - int pcre16_pattern_to_host_byte_order(pcre16 *code, - pcre16_extra *extra, const unsigned char *tables); - - -PCRE 16-BIT API INDIRECTED FUNCTIONS - - void *(*pcre16_malloc)(size_t); - - void (*pcre16_free)(void *); - - void *(*pcre16_stack_malloc)(size_t); - - void (*pcre16_stack_free)(void *); - - int (*pcre16_callout)(pcre16_callout_block *); - - -PCRE 16-BIT API 16-BIT-ONLY FUNCTION - - int pcre16_utf16_to_host_byte_order(PCRE_UCHAR16 *output, - PCRE_SPTR16 input, int length, int *byte_order, - int keep_boms); - - -THE PCRE 16-BIT LIBRARY - - Starting with release 8.30, it is possible to compile a PCRE library - that supports 16-bit character strings, including UTF-16 strings, as - well as or instead of the original 8-bit library. The majority of the - work to make this possible was done by Zoltan Herczeg. The two - libraries contain identical sets of functions, used in exactly the same - way. Only the names of the functions and the data types of their argu- - ments and results are different. To avoid over-complication and reduce - the documentation maintenance load, most of the PCRE documentation - describes the 8-bit library, with only occasional references to the - 16-bit library. This page describes what is different when you use the - 16-bit library. - - WARNING: A single application can be linked with both libraries, but - you must take care when processing any particular pattern to use func- - tions from just one library. For example, if you want to study a pat- - tern that was compiled with pcre16_compile(), you must do so with - pcre16_study(), not pcre_study(), and you must free the study data with - pcre16_free_study(). - - -THE HEADER FILE - - There is only one header file, pcre.h. It contains prototypes for all - the functions in all libraries, as well as definitions of flags, struc- - tures, error codes, etc. - - -THE LIBRARY NAME - - In Unix-like systems, the 16-bit library is called libpcre16, and can - normally be accesss by adding -lpcre16 to the command for linking an - application that uses PCRE. - - -STRING TYPES - - In the 8-bit library, strings are passed to PCRE library functions as - vectors of bytes with the C type "char *". In the 16-bit library, - strings are passed as vectors of unsigned 16-bit quantities. The macro - PCRE_UCHAR16 specifies an appropriate data type, and PCRE_SPTR16 is - defined as "const PCRE_UCHAR16 *". In very many environments, "short - int" is a 16-bit data type. When PCRE is built, it defines PCRE_UCHAR16 - as "unsigned short int", but checks that it really is a 16-bit data - type. If it is not, the build fails with an error message telling the - maintainer to modify the definition appropriately. - - -STRUCTURE TYPES - - The types of the opaque structures that are used for compiled 16-bit - patterns and JIT stacks are pcre16 and pcre16_jit_stack respectively. - The type of the user-accessible structure that is returned by - pcre16_study() is pcre16_extra, and the type of the structure that is - used for passing data to a callout function is pcre16_callout_block. - These structures contain the same fields, with the same names, as their - 8-bit counterparts. The only difference is that pointers to character - strings are 16-bit instead of 8-bit types. - - -16-BIT FUNCTIONS - - For every function in the 8-bit library there is a corresponding func- - tion in the 16-bit library with a name that starts with pcre16_ instead - of pcre_. The prototypes are listed above. In addition, there is one - extra function, pcre16_utf16_to_host_byte_order(). This is a utility - function that converts a UTF-16 character string to host byte order if - necessary. The other 16-bit functions expect the strings they are - passed to be in host byte order. - - The input and output arguments of pcre16_utf16_to_host_byte_order() may - point to the same address, that is, conversion in place is supported. - The output buffer must be at least as long as the input. - - The length argument specifies the number of 16-bit data units in the - input string; a negative value specifies a zero-terminated string. - - If byte_order is NULL, it is assumed that the string starts off in host - byte order. This may be changed by byte-order marks (BOMs) anywhere in - the string (commonly as the first character). - - If byte_order is not NULL, a non-zero value of the integer to which it - points means that the input starts off in host byte order, otherwise - the opposite order is assumed. Again, BOMs in the string can change - this. The final byte order is passed back at the end of processing. - - If keep_boms is not zero, byte-order mark characters (0xfeff) are - copied into the output string. Otherwise they are discarded. - - The result of the function is the number of 16-bit units placed into - the output buffer, including the zero terminator if the string was - zero-terminated. - - -SUBJECT STRING OFFSETS - - The lengths and starting offsets of subject strings must be specified - in 16-bit data units, and the offsets within subject strings that are - returned by the matching functions are in also 16-bit units rather than - bytes. - - -NAMED SUBPATTERNS - - The name-to-number translation table that is maintained for named sub- - patterns uses 16-bit characters. The pcre16_get_stringtable_entries() - function returns the length of each entry in the table as the number of - 16-bit data units. - - -OPTION NAMES - - There are two new general option names, PCRE_UTF16 and - PCRE_NO_UTF16_CHECK, which correspond to PCRE_UTF8 and - PCRE_NO_UTF8_CHECK in the 8-bit library. In fact, these new options - define the same bits in the options word. There is a discussion about - the validity of UTF-16 strings in the pcreunicode page. - - For the pcre16_config() function there is an option PCRE_CONFIG_UTF16 - that returns 1 if UTF-16 support is configured, otherwise 0. If this - option is given to pcre_config() or pcre32_config(), or if the - PCRE_CONFIG_UTF8 or PCRE_CONFIG_UTF32 option is given to pcre16_con- - fig(), the result is the PCRE_ERROR_BADOPTION error. - - -CHARACTER CODES - - In 16-bit mode, when PCRE_UTF16 is not set, character values are - treated in the same way as in 8-bit, non UTF-8 mode, except, of course, - that they can range from 0 to 0xffff instead of 0 to 0xff. Character - types for characters less than 0xff can therefore be influenced by the - locale in the same way as before. Characters greater than 0xff have - only one case, and no "type" (such as letter or digit). - - In UTF-16 mode, the character code is Unicode, in the range 0 to - 0x10ffff, with the exception of values in the range 0xd800 to 0xdfff - because those are "surrogate" values that are used in pairs to encode - values greater than 0xffff. - - A UTF-16 string can indicate its endianness by special code knows as a - byte-order mark (BOM). The PCRE functions do not handle this, expecting - strings to be in host byte order. A utility function called - pcre16_utf16_to_host_byte_order() is provided to help with this (see - above). - - -ERROR NAMES - - The errors PCRE_ERROR_BADUTF16_OFFSET and PCRE_ERROR_SHORTUTF16 corre- - spond to their 8-bit counterparts. The error PCRE_ERROR_BADMODE is - given when a compiled pattern is passed to a function that processes - patterns in the other mode, for example, if a pattern compiled with - pcre_compile() is passed to pcre16_exec(). - - There are new error codes whose names begin with PCRE_UTF16_ERR for - invalid UTF-16 strings, corresponding to the PCRE_UTF8_ERR codes for - UTF-8 strings that are described in the section entitled "Reason codes - for invalid UTF-8 strings" in the main pcreapi page. The UTF-16 errors - are: - - PCRE_UTF16_ERR1 Missing low surrogate at end of string - PCRE_UTF16_ERR2 Invalid low surrogate follows high surrogate - PCRE_UTF16_ERR3 Isolated low surrogate - PCRE_UTF16_ERR4 Non-character - - -ERROR TEXTS - - If there is an error while compiling a pattern, the error text that is - passed back by pcre16_compile() or pcre16_compile2() is still an 8-bit - character string, zero-terminated. - - -CALLOUTS - - The subject and mark fields in the callout block that is passed to a - callout function point to 16-bit vectors. - - -TESTING - - The pcretest program continues to operate with 8-bit input and output - files, but it can be used for testing the 16-bit library. If it is run - with the command line option -16, patterns and subject strings are con- - verted from 8-bit to 16-bit before being passed to PCRE, and the 16-bit - library functions are used instead of the 8-bit ones. Returned 16-bit - strings are converted to 8-bit for output. If both the 8-bit and the - 32-bit libraries were not compiled, pcretest defaults to 16-bit and the - -16 option is ignored. - - When PCRE is being built, the RunTest script that is called by "make - check" uses the pcretest -C option to discover which of the 8-bit, - 16-bit and 32-bit libraries has been built, and runs the tests appro- - priately. - - -NOT SUPPORTED IN 16-BIT MODE - - Not all the features of the 8-bit library are available with the 16-bit - library. The C++ and POSIX wrapper functions support only the 8-bit - library, and the pcregrep program is at present 8-bit only. - - -AUTHOR - - Philip Hazel - University Computing Service - Cambridge CB2 3QH, England. - - -REVISION - - Last updated: 12 May 2013 - Copyright (c) 1997-2013 University of Cambridge. ------------------------------------------------------------------------------- - - -PCRE(3) Library Functions Manual PCRE(3) - - - -NAME - PCRE - Perl-compatible regular expressions - - #include - - -PCRE 32-BIT API BASIC FUNCTIONS - - pcre32 *pcre32_compile(PCRE_SPTR32 pattern, int options, - const char **errptr, int *erroffset, - const unsigned char *tableptr); - - pcre32 *pcre32_compile2(PCRE_SPTR32 pattern, int options, - int *errorcodeptr, - const unsigned char *tableptr); - - pcre32_extra *pcre32_study(const pcre32 *code, int options, - const char **errptr); - - void pcre32_free_study(pcre32_extra *extra); - - int pcre32_exec(const pcre32 *code, const pcre32_extra *extra, - PCRE_SPTR32 subject, int length, int startoffset, - int options, int *ovector, int ovecsize); - - int pcre32_dfa_exec(const pcre32 *code, const pcre32_extra *extra, - PCRE_SPTR32 subject, int length, int startoffset, - int options, int *ovector, int ovecsize, - int *workspace, int wscount); - - -PCRE 32-BIT API STRING EXTRACTION FUNCTIONS - - int pcre32_copy_named_substring(const pcre32 *code, - PCRE_SPTR32 subject, int *ovector, - int stringcount, PCRE_SPTR32 stringname, - PCRE_UCHAR32 *buffer, int buffersize); - - int pcre32_copy_substring(PCRE_SPTR32 subject, int *ovector, - int stringcount, int stringnumber, PCRE_UCHAR32 *buffer, - int buffersize); - - int pcre32_get_named_substring(const pcre32 *code, - PCRE_SPTR32 subject, int *ovector, - int stringcount, PCRE_SPTR32 stringname, - PCRE_SPTR32 *stringptr); - - int pcre32_get_stringnumber(const pcre32 *code, - PCRE_SPTR32 name); - - int pcre32_get_stringtable_entries(const pcre32 *code, - PCRE_SPTR32 name, PCRE_UCHAR32 **first, PCRE_UCHAR32 **last); - - int pcre32_get_substring(PCRE_SPTR32 subject, int *ovector, - int stringcount, int stringnumber, - PCRE_SPTR32 *stringptr); - - int pcre32_get_substring_list(PCRE_SPTR32 subject, - int *ovector, int stringcount, PCRE_SPTR32 **listptr); - - void pcre32_free_substring(PCRE_SPTR32 stringptr); - - void pcre32_free_substring_list(PCRE_SPTR32 *stringptr); - - -PCRE 32-BIT API AUXILIARY FUNCTIONS - - pcre32_jit_stack *pcre32_jit_stack_alloc(int startsize, int maxsize); - - void pcre32_jit_stack_free(pcre32_jit_stack *stack); - - void pcre32_assign_jit_stack(pcre32_extra *extra, - pcre32_jit_callback callback, void *data); - - const unsigned char *pcre32_maketables(void); - - int pcre32_fullinfo(const pcre32 *code, const pcre32_extra *extra, - int what, void *where); - - int pcre32_refcount(pcre32 *code, int adjust); - - int pcre32_config(int what, void *where); - - const char *pcre32_version(void); - - int pcre32_pattern_to_host_byte_order(pcre32 *code, - pcre32_extra *extra, const unsigned char *tables); - - -PCRE 32-BIT API INDIRECTED FUNCTIONS - - void *(*pcre32_malloc)(size_t); - - void (*pcre32_free)(void *); - - void *(*pcre32_stack_malloc)(size_t); - - void (*pcre32_stack_free)(void *); - - int (*pcre32_callout)(pcre32_callout_block *); - - -PCRE 32-BIT API 32-BIT-ONLY FUNCTION - - int pcre32_utf32_to_host_byte_order(PCRE_UCHAR32 *output, - PCRE_SPTR32 input, int length, int *byte_order, - int keep_boms); - - -THE PCRE 32-BIT LIBRARY - - Starting with release 8.32, it is possible to compile a PCRE library - that supports 32-bit character strings, including UTF-32 strings, as - well as or instead of the original 8-bit library. This work was done by - Christian Persch, based on the work done by Zoltan Herczeg for the - 16-bit library. All three libraries contain identical sets of func- - tions, used in exactly the same way. Only the names of the functions - and the data types of their arguments and results are different. To - avoid over-complication and reduce the documentation maintenance load, - most of the PCRE documentation describes the 8-bit library, with only - occasional references to the 16-bit and 32-bit libraries. This page - describes what is different when you use the 32-bit library. - - WARNING: A single application can be linked with all or any of the - three libraries, but you must take care when processing any particular - pattern to use functions from just one library. For example, if you - want to study a pattern that was compiled with pcre32_compile(), you - must do so with pcre32_study(), not pcre_study(), and you must free the - study data with pcre32_free_study(). - - -THE HEADER FILE - - There is only one header file, pcre.h. It contains prototypes for all - the functions in all libraries, as well as definitions of flags, struc- - tures, error codes, etc. - - -THE LIBRARY NAME - - In Unix-like systems, the 32-bit library is called libpcre32, and can - normally be accesss by adding -lpcre32 to the command for linking an - application that uses PCRE. - - -STRING TYPES - - In the 8-bit library, strings are passed to PCRE library functions as - vectors of bytes with the C type "char *". In the 32-bit library, - strings are passed as vectors of unsigned 32-bit quantities. The macro - PCRE_UCHAR32 specifies an appropriate data type, and PCRE_SPTR32 is - defined as "const PCRE_UCHAR32 *". In very many environments, "unsigned - int" is a 32-bit data type. When PCRE is built, it defines PCRE_UCHAR32 - as "unsigned int", but checks that it really is a 32-bit data type. If - it is not, the build fails with an error message telling the maintainer - to modify the definition appropriately. - - -STRUCTURE TYPES - - The types of the opaque structures that are used for compiled 32-bit - patterns and JIT stacks are pcre32 and pcre32_jit_stack respectively. - The type of the user-accessible structure that is returned by - pcre32_study() is pcre32_extra, and the type of the structure that is - used for passing data to a callout function is pcre32_callout_block. - These structures contain the same fields, with the same names, as their - 8-bit counterparts. The only difference is that pointers to character - strings are 32-bit instead of 8-bit types. - - -32-BIT FUNCTIONS - - For every function in the 8-bit library there is a corresponding func- - tion in the 32-bit library with a name that starts with pcre32_ instead - of pcre_. The prototypes are listed above. In addition, there is one - extra function, pcre32_utf32_to_host_byte_order(). This is a utility - function that converts a UTF-32 character string to host byte order if - necessary. The other 32-bit functions expect the strings they are - passed to be in host byte order. - - The input and output arguments of pcre32_utf32_to_host_byte_order() may - point to the same address, that is, conversion in place is supported. - The output buffer must be at least as long as the input. - - The length argument specifies the number of 32-bit data units in the - input string; a negative value specifies a zero-terminated string. - - If byte_order is NULL, it is assumed that the string starts off in host - byte order. This may be changed by byte-order marks (BOMs) anywhere in - the string (commonly as the first character). - - If byte_order is not NULL, a non-zero value of the integer to which it - points means that the input starts off in host byte order, otherwise - the opposite order is assumed. Again, BOMs in the string can change - this. The final byte order is passed back at the end of processing. - - If keep_boms is not zero, byte-order mark characters (0xfeff) are - copied into the output string. Otherwise they are discarded. - - The result of the function is the number of 32-bit units placed into - the output buffer, including the zero terminator if the string was - zero-terminated. - - -SUBJECT STRING OFFSETS - - The lengths and starting offsets of subject strings must be specified - in 32-bit data units, and the offsets within subject strings that are - returned by the matching functions are in also 32-bit units rather than - bytes. - - -NAMED SUBPATTERNS - - The name-to-number translation table that is maintained for named sub- - patterns uses 32-bit characters. The pcre32_get_stringtable_entries() - function returns the length of each entry in the table as the number of - 32-bit data units. - - -OPTION NAMES - - There are two new general option names, PCRE_UTF32 and - PCRE_NO_UTF32_CHECK, which correspond to PCRE_UTF8 and - PCRE_NO_UTF8_CHECK in the 8-bit library. In fact, these new options - define the same bits in the options word. There is a discussion about - the validity of UTF-32 strings in the pcreunicode page. - - For the pcre32_config() function there is an option PCRE_CONFIG_UTF32 - that returns 1 if UTF-32 support is configured, otherwise 0. If this - option is given to pcre_config() or pcre16_config(), or if the - PCRE_CONFIG_UTF8 or PCRE_CONFIG_UTF16 option is given to pcre32_con- - fig(), the result is the PCRE_ERROR_BADOPTION error. - - -CHARACTER CODES - - In 32-bit mode, when PCRE_UTF32 is not set, character values are - treated in the same way as in 8-bit, non UTF-8 mode, except, of course, - that they can range from 0 to 0x7fffffff instead of 0 to 0xff. Charac- - ter types for characters less than 0xff can therefore be influenced by - the locale in the same way as before. Characters greater than 0xff - have only one case, and no "type" (such as letter or digit). - - In UTF-32 mode, the character code is Unicode, in the range 0 to - 0x10ffff, with the exception of values in the range 0xd800 to 0xdfff - because those are "surrogate" values that are ill-formed in UTF-32. - - A UTF-32 string can indicate its endianness by special code knows as a - byte-order mark (BOM). The PCRE functions do not handle this, expecting - strings to be in host byte order. A utility function called - pcre32_utf32_to_host_byte_order() is provided to help with this (see - above). - - -ERROR NAMES - - The error PCRE_ERROR_BADUTF32 corresponds to its 8-bit counterpart. - The error PCRE_ERROR_BADMODE is given when a compiled pattern is passed - to a function that processes patterns in the other mode, for example, - if a pattern compiled with pcre_compile() is passed to pcre32_exec(). - - There are new error codes whose names begin with PCRE_UTF32_ERR for - invalid UTF-32 strings, corresponding to the PCRE_UTF8_ERR codes for - UTF-8 strings that are described in the section entitled "Reason codes - for invalid UTF-8 strings" in the main pcreapi page. The UTF-32 errors - are: - - PCRE_UTF32_ERR1 Surrogate character (range from 0xd800 to 0xdfff) - PCRE_UTF32_ERR2 Non-character - PCRE_UTF32_ERR3 Character > 0x10ffff - - -ERROR TEXTS - - If there is an error while compiling a pattern, the error text that is - passed back by pcre32_compile() or pcre32_compile2() is still an 8-bit - character string, zero-terminated. - - -CALLOUTS - - The subject and mark fields in the callout block that is passed to a - callout function point to 32-bit vectors. - - -TESTING - - The pcretest program continues to operate with 8-bit input and output - files, but it can be used for testing the 32-bit library. If it is run - with the command line option -32, patterns and subject strings are con- - verted from 8-bit to 32-bit before being passed to PCRE, and the 32-bit - library functions are used instead of the 8-bit ones. Returned 32-bit - strings are converted to 8-bit for output. If both the 8-bit and the - 16-bit libraries were not compiled, pcretest defaults to 32-bit and the - -32 option is ignored. - - When PCRE is being built, the RunTest script that is called by "make - check" uses the pcretest -C option to discover which of the 8-bit, - 16-bit and 32-bit libraries has been built, and runs the tests appro- - priately. - - -NOT SUPPORTED IN 32-BIT MODE - - Not all the features of the 8-bit library are available with the 32-bit - library. The C++ and POSIX wrapper functions support only the 8-bit - library, and the pcregrep program is at present 8-bit only. - - -AUTHOR - - Philip Hazel - University Computing Service - Cambridge CB2 3QH, England. - - -REVISION - - Last updated: 12 May 2013 - Copyright (c) 1997-2013 University of Cambridge. ------------------------------------------------------------------------------- - - -PCREBUILD(3) Library Functions Manual PCREBUILD(3) - - - -NAME - PCRE - Perl-compatible regular expressions - -BUILDING PCRE - - PCRE is distributed with a configure script that can be used to build - the library in Unix-like environments using the applications known as - Autotools. Also in the distribution are files to support building - using CMake instead of configure. The text file README contains general - information about building with Autotools (some of which is repeated - below), and also has some comments about building on various operating - systems. There is a lot more information about building PCRE without - using Autotools (including information about using CMake and building - "by hand") in the text file called NON-AUTOTOOLS-BUILD. You should - consult this file as well as the README file if you are building in a - non-Unix-like environment. - - -PCRE BUILD-TIME OPTIONS - - The rest of this document describes the optional features of PCRE that - can be selected when the library is compiled. It assumes use of the - configure script, where the optional features are selected or dese- - lected by providing options to configure before running the make com- - mand. However, the same options can be selected in both Unix-like and - non-Unix-like environments using the GUI facility of cmake-gui if you - are using CMake instead of configure to build PCRE. - - If you are not using Autotools or CMake, option selection can be done - by editing the config.h file, or by passing parameter settings to the - compiler, as described in NON-AUTOTOOLS-BUILD. - - The complete list of options for configure (which includes the standard - ones such as the selection of the installation directory) can be - obtained by running - - ./configure --help - - The following sections include descriptions of options whose names - begin with --enable or --disable. These settings specify changes to the - defaults for the configure command. Because of the way that configure - works, --enable and --disable always come in pairs, so the complemen- - tary option always exists as well, but as it specifies the default, it - is not described. - - -BUILDING 8-BIT, 16-BIT AND 32-BIT LIBRARIES - - By default, a library called libpcre is built, containing functions - that take string arguments contained in vectors of bytes, either as - single-byte characters, or interpreted as UTF-8 strings. You can also - build a separate library, called libpcre16, in which strings are con- - tained in vectors of 16-bit data units and interpreted either as sin- - gle-unit characters or UTF-16 strings, by adding - - --enable-pcre16 - - to the configure command. You can also build yet another separate - library, called libpcre32, in which strings are contained in vectors of - 32-bit data units and interpreted either as single-unit characters or - UTF-32 strings, by adding - - --enable-pcre32 - - to the configure command. If you do not want the 8-bit library, add - - --disable-pcre8 - - as well. At least one of the three libraries must be built. Note that - the C++ and POSIX wrappers are for the 8-bit library only, and that - pcregrep is an 8-bit program. None of these are built if you select - only the 16-bit or 32-bit libraries. - - -BUILDING SHARED AND STATIC LIBRARIES - - The Autotools PCRE building process uses libtool to build both shared - and static libraries by default. You can suppress one of these by - adding one of - - --disable-shared - --disable-static - - to the configure command, as required. - - -C++ SUPPORT - - By default, if the 8-bit library is being built, the configure script - will search for a C++ compiler and C++ header files. If it finds them, - it automatically builds the C++ wrapper library (which supports only - 8-bit strings). You can disable this by adding - - --disable-cpp - - to the configure command. - - -UTF-8, UTF-16 AND UTF-32 SUPPORT - - To build PCRE with support for UTF Unicode character strings, add - - --enable-utf - - to the configure command. This setting applies to all three libraries, - adding support for UTF-8 to the 8-bit library, support for UTF-16 to - the 16-bit library, and support for UTF-32 to the to the 32-bit - library. There are no separate options for enabling UTF-8, UTF-16 and - UTF-32 independently because that would allow ridiculous settings such - as requesting UTF-16 support while building only the 8-bit library. It - is not possible to build one library with UTF support and another with- - out in the same configuration. (For backwards compatibility, --enable- - utf8 is a synonym of --enable-utf.) - - Of itself, this setting does not make PCRE treat strings as UTF-8, - UTF-16 or UTF-32. As well as compiling PCRE with this option, you also - have have to set the PCRE_UTF8, PCRE_UTF16 or PCRE_UTF32 option (as - appropriate) when you call one of the pattern compiling functions. - - If you set --enable-utf when compiling in an EBCDIC environment, PCRE - expects its input to be either ASCII or UTF-8 (depending on the run- - time option). It is not possible to support both EBCDIC and UTF-8 codes - in the same version of the library. Consequently, --enable-utf and - --enable-ebcdic are mutually exclusive. - - -UNICODE CHARACTER PROPERTY SUPPORT - - UTF support allows the libraries to process character codepoints up to - 0x10ffff in the strings that they handle. On its own, however, it does - not provide any facilities for accessing the properties of such charac- - ters. If you want to be able to use the pattern escapes \P, \p, and \X, - which refer to Unicode character properties, you must add - - --enable-unicode-properties - - to the configure command. This implies UTF support, even if you have - not explicitly requested it. - - Including Unicode property support adds around 30K of tables to the - PCRE library. Only the general category properties such as Lu and Nd - are supported. Details are given in the pcrepattern documentation. - - -JUST-IN-TIME COMPILER SUPPORT - - Just-in-time compiler support is included in the build by specifying - - --enable-jit - - This support is available only for certain hardware architectures. If - this option is set for an unsupported architecture, a compile time - error occurs. See the pcrejit documentation for a discussion of JIT - usage. When JIT support is enabled, pcregrep automatically makes use of - it, unless you add - - --disable-pcregrep-jit - - to the "configure" command. - - -CODE VALUE OF NEWLINE - - By default, PCRE interprets the linefeed (LF) character as indicating - the end of a line. This is the normal newline character on Unix-like - systems. You can compile PCRE to use carriage return (CR) instead, by - adding - - --enable-newline-is-cr - - to the configure command. There is also a --enable-newline-is-lf - option, which explicitly specifies linefeed as the newline character. - - Alternatively, you can specify that line endings are to be indicated by - the two character sequence CRLF. If you want this, add - - --enable-newline-is-crlf - - to the configure command. There is a fourth option, specified by - - --enable-newline-is-anycrlf - - which causes PCRE to recognize any of the three sequences CR, LF, or - CRLF as indicating a line ending. Finally, a fifth option, specified by - - --enable-newline-is-any - - causes PCRE to recognize any Unicode newline sequence. - - Whatever line ending convention is selected when PCRE is built can be - overridden when the library functions are called. At build time it is - conventional to use the standard for your operating system. - - -WHAT \R MATCHES - - By default, the sequence \R in a pattern matches any Unicode newline - sequence, whatever has been selected as the line ending sequence. If - you specify - - --enable-bsr-anycrlf - - the default is changed so that \R matches only CR, LF, or CRLF. What- - ever is selected when PCRE is built can be overridden when the library - functions are called. - - -POSIX MALLOC USAGE - - When the 8-bit library is called through the POSIX interface (see the - pcreposix documentation), additional working storage is required for - holding the pointers to capturing substrings, because PCRE requires - three integers per substring, whereas the POSIX interface provides only - two. If the number of expected substrings is small, the wrapper func- - tion uses space on the stack, because this is faster than using mal- - loc() for each call. The default threshold above which the stack is no - longer used is 10; it can be changed by adding a setting such as - - --with-posix-malloc-threshold=20 - - to the configure command. - - -HANDLING VERY LARGE PATTERNS - - Within a compiled pattern, offset values are used to point from one - part to another (for example, from an opening parenthesis to an alter- - nation metacharacter). By default, in the 8-bit and 16-bit libraries, - two-byte values are used for these offsets, leading to a maximum size - for a compiled pattern of around 64K. This is sufficient to handle all - but the most gigantic patterns. Nevertheless, some people do want to - process truly enormous patterns, so it is possible to compile PCRE to - use three-byte or four-byte offsets by adding a setting such as - - --with-link-size=3 - - to the configure command. The value given must be 2, 3, or 4. For the - 16-bit library, a value of 3 is rounded up to 4. In these libraries, - using longer offsets slows down the operation of PCRE because it has to - load additional data when handling them. For the 32-bit library the - value is always 4 and cannot be overridden; the value of --with-link- - size is ignored. - - -AVOIDING EXCESSIVE STACK USAGE - - When matching with the pcre_exec() function, PCRE implements backtrack- - ing by making recursive calls to an internal function called match(). - In environments where the size of the stack is limited, this can se- - verely limit PCRE's operation. (The Unix environment does not usually - suffer from this problem, but it may sometimes be necessary to increase - the maximum stack size. There is a discussion in the pcrestack docu- - mentation.) An alternative approach to recursion that uses memory from - the heap to remember data, instead of using recursive function calls, - has been implemented to work round the problem of limited stack size. - If you want to build a version of PCRE that works this way, add - - --disable-stack-for-recursion - - to the configure command. With this configuration, PCRE will use the - pcre_stack_malloc and pcre_stack_free variables to call memory manage- - ment functions. By default these point to malloc() and free(), but you - can replace the pointers so that your own functions are used instead. - - Separate functions are provided rather than using pcre_malloc and - pcre_free because the usage is very predictable: the block sizes - requested are always the same, and the blocks are always freed in - reverse order. A calling program might be able to implement optimized - functions that perform better than malloc() and free(). PCRE runs - noticeably more slowly when built in this way. This option affects only - the pcre_exec() function; it is not relevant for pcre_dfa_exec(). - - -LIMITING PCRE RESOURCE USAGE - - Internally, PCRE has a function called match(), which it calls repeat- - edly (sometimes recursively) when matching a pattern with the - pcre_exec() function. By controlling the maximum number of times this - function may be called during a single matching operation, a limit can - be placed on the resources used by a single call to pcre_exec(). The - limit can be changed at run time, as described in the pcreapi documen- - tation. The default is 10 million, but this can be changed by adding a - setting such as - - --with-match-limit=500000 - - to the configure command. This setting has no effect on the - pcre_dfa_exec() matching function. - - In some environments it is desirable to limit the depth of recursive - calls of match() more strictly than the total number of calls, in order - to restrict the maximum amount of stack (or heap, if --disable-stack- - for-recursion is specified) that is used. A second limit controls this; - it defaults to the value that is set for --with-match-limit, which - imposes no additional constraints. However, you can set a lower limit - by adding, for example, - - --with-match-limit-recursion=10000 - - to the configure command. This value can also be overridden at run - time. - - -CREATING CHARACTER TABLES AT BUILD TIME - - PCRE uses fixed tables for processing characters whose code values are - less than 256. By default, PCRE is built with a set of tables that are - distributed in the file pcre_chartables.c.dist. These tables are for - ASCII codes only. If you add - - --enable-rebuild-chartables - - to the configure command, the distributed tables are no longer used. - Instead, a program called dftables is compiled and run. This outputs - the source for new set of tables, created in the default locale of your - C run-time system. (This method of replacing the tables does not work - if you are cross compiling, because dftables is run on the local host. - If you need to create alternative tables when cross compiling, you will - have to do so "by hand".) - - -USING EBCDIC CODE - - PCRE assumes by default that it will run in an environment where the - character code is ASCII (or Unicode, which is a superset of ASCII). - This is the case for most computer operating systems. PCRE can, how- - ever, be compiled to run in an EBCDIC environment by adding - - --enable-ebcdic - - to the configure command. This setting implies --enable-rebuild-charta- - bles. You should only use it if you know that you are in an EBCDIC - environment (for example, an IBM mainframe operating system). The - --enable-ebcdic option is incompatible with --enable-utf. - - The EBCDIC character that corresponds to an ASCII LF is assumed to have - the value 0x15 by default. However, in some EBCDIC environments, 0x25 - is used. In such an environment you should use - - --enable-ebcdic-nl25 - - as well as, or instead of, --enable-ebcdic. The EBCDIC character for CR - has the same value as in ASCII, namely, 0x0d. Whichever of 0x15 and - 0x25 is not chosen as LF is made to correspond to the Unicode NEL char- - acter (which, in Unicode, is 0x85). - - The options that select newline behaviour, such as --enable-newline-is- - cr, and equivalent run-time options, refer to these character values in - an EBCDIC environment. - - -PCREGREP OPTIONS FOR COMPRESSED FILE SUPPORT - - By default, pcregrep reads all files as plain text. You can build it so - that it recognizes files whose names end in .gz or .bz2, and reads them - with libz or libbz2, respectively, by adding one or both of - - --enable-pcregrep-libz - --enable-pcregrep-libbz2 - - to the configure command. These options naturally require that the rel- - evant libraries are installed on your system. Configuration will fail - if they are not. - - -PCREGREP BUFFER SIZE - - pcregrep uses an internal buffer to hold a "window" on the file it is - scanning, in order to be able to output "before" and "after" lines when - it finds a match. The size of the buffer is controlled by a parameter - whose default value is 20K. The buffer itself is three times this size, - but because of the way it is used for holding "before" lines, the long- - est line that is guaranteed to be processable is the parameter size. - You can change the default parameter value by adding, for example, - - --with-pcregrep-bufsize=50K - - to the configure command. The caller of pcregrep can, however, override - this value by specifying a run-time option. - - -PCRETEST OPTION FOR LIBREADLINE SUPPORT - - If you add - - --enable-pcretest-libreadline - - to the configure command, pcretest is linked with the libreadline - library, and when its input is from a terminal, it reads it using the - readline() function. This provides line-editing and history facilities. - Note that libreadline is GPL-licensed, so if you distribute a binary of - pcretest linked in this way, there may be licensing issues. - - Setting this option causes the -lreadline option to be added to the - pcretest build. In many operating environments with a sytem-installed - libreadline this is sufficient. However, in some environments (e.g. if - an unmodified distribution version of readline is in use), some extra - configuration may be necessary. The INSTALL file for libreadline says - this: - - "Readline uses the termcap functions, but does not link with the - termcap or curses library itself, allowing applications which link - with readline the to choose an appropriate library." - - If your environment has not been set up so that an appropriate library - is automatically included, you may need to add something like - - LIBS="-ncurses" - - immediately before the configure command. - - -DEBUGGING WITH VALGRIND SUPPORT - - By adding the - - --enable-valgrind - - option to to the configure command, PCRE will use valgrind annotations - to mark certain memory regions as unaddressable. This allows it to - detect invalid memory accesses, and is mostly useful for debugging PCRE - itself. - - -CODE COVERAGE REPORTING - - If your C compiler is gcc, you can build a version of PCRE that can - generate a code coverage report for its test suite. To enable this, you - must install lcov version 1.6 or above. Then specify - - --enable-coverage - - to the configure command and build PCRE in the usual way. - - Note that using ccache (a caching C compiler) is incompatible with code - coverage reporting. If you have configured ccache to run automatically - on your system, you must set the environment variable - - CCACHE_DISABLE=1 - - before running make to build PCRE, so that ccache is not used. - - When --enable-coverage is used, the following addition targets are - added to the Makefile: - - make coverage - - This creates a fresh coverage report for the PCRE test suite. It is - equivalent to running "make coverage-reset", "make coverage-baseline", - "make check", and then "make coverage-report". - - make coverage-reset - - This zeroes the coverage counters, but does nothing else. - - make coverage-baseline - - This captures baseline coverage information. - - make coverage-report - - This creates the coverage report. - - make coverage-clean-report - - This removes the generated coverage report without cleaning the cover- - age data itself. - - make coverage-clean-data - - This removes the captured coverage data without removing the coverage - files created at compile time (*.gcno). - - make coverage-clean - - This cleans all coverage data including the generated coverage report. - For more information about code coverage, see the gcov and lcov docu- - mentation. - - -SEE ALSO - - pcreapi(3), pcre16, pcre32, pcre_config(3). - - -AUTHOR - - Philip Hazel - University Computing Service - Cambridge CB2 3QH, England. - - -REVISION - - Last updated: 12 May 2013 - Copyright (c) 1997-2013 University of Cambridge. ------------------------------------------------------------------------------- - - -PCREMATCHING(3) Library Functions Manual PCREMATCHING(3) - - - -NAME - PCRE - Perl-compatible regular expressions - -PCRE MATCHING ALGORITHMS - - This document describes the two different algorithms that are available - in PCRE for matching a compiled regular expression against a given sub- - ject string. The "standard" algorithm is the one provided by the - pcre_exec(), pcre16_exec() and pcre32_exec() functions. These work in - the same as as Perl's matching function, and provide a Perl-compatible - matching operation. The just-in-time (JIT) optimization that is - described in the pcrejit documentation is compatible with these func- - tions. - - An alternative algorithm is provided by the pcre_dfa_exec(), - pcre16_dfa_exec() and pcre32_dfa_exec() functions; they operate in a - different way, and are not Perl-compatible. This alternative has advan- - tages and disadvantages compared with the standard algorithm, and these - are described below. - - When there is only one possible way in which a given subject string can - match a pattern, the two algorithms give the same answer. A difference - arises, however, when there are multiple possibilities. For example, if - the pattern - - ^<.*> - - is matched against the string - - - - there are three possible answers. The standard algorithm finds only one - of them, whereas the alternative algorithm finds all three. - - -REGULAR EXPRESSIONS AS TREES - - The set of strings that are matched by a regular expression can be rep- - resented as a tree structure. An unlimited repetition in the pattern - makes the tree of infinite size, but it is still a tree. Matching the - pattern to a given subject string (from a given starting point) can be - thought of as a search of the tree. There are two ways to search a - tree: depth-first and breadth-first, and these correspond to the two - matching algorithms provided by PCRE. - - -THE STANDARD MATCHING ALGORITHM - - In the terminology of Jeffrey Friedl's book "Mastering Regular Expres- - sions", the standard algorithm is an "NFA algorithm". It conducts a - depth-first search of the pattern tree. That is, it proceeds along a - single path through the tree, checking that the subject matches what is - required. When there is a mismatch, the algorithm tries any alterna- - tives at the current point, and if they all fail, it backs up to the - previous branch point in the tree, and tries the next alternative - branch at that level. This often involves backing up (moving to the - left) in the subject string as well. The order in which repetition - branches are tried is controlled by the greedy or ungreedy nature of - the quantifier. - - If a leaf node is reached, a matching string has been found, and at - that point the algorithm stops. Thus, if there is more than one possi- - ble match, this algorithm returns the first one that it finds. Whether - this is the shortest, the longest, or some intermediate length depends - on the way the greedy and ungreedy repetition quantifiers are specified - in the pattern. - - Because it ends up with a single path through the tree, it is rela- - tively straightforward for this algorithm to keep track of the sub- - strings that are matched by portions of the pattern in parentheses. - This provides support for capturing parentheses and back references. - - -THE ALTERNATIVE MATCHING ALGORITHM - - This algorithm conducts a breadth-first search of the tree. Starting - from the first matching point in the subject, it scans the subject - string from left to right, once, character by character, and as it does - this, it remembers all the paths through the tree that represent valid - matches. In Friedl's terminology, this is a kind of "DFA algorithm", - though it is not implemented as a traditional finite state machine (it - keeps multiple states active simultaneously). - - Although the general principle of this matching algorithm is that it - scans the subject string only once, without backtracking, there is one - exception: when a lookaround assertion is encountered, the characters - following or preceding the current point have to be independently - inspected. - - The scan continues until either the end of the subject is reached, or - there are no more unterminated paths. At this point, terminated paths - represent the different matching possibilities (if there are none, the - match has failed). Thus, if there is more than one possible match, - this algorithm finds all of them, and in particular, it finds the long- - est. The matches are returned in decreasing order of length. There is - an option to stop the algorithm after the first match (which is neces- - sarily the shortest) is found. - - Note that all the matches that are found start at the same point in the - subject. If the pattern - - cat(er(pillar)?)? - - is matched against the string "the caterpillar catchment", the result - will be the three strings "caterpillar", "cater", and "cat" that start - at the fifth character of the subject. The algorithm does not automati- - cally move on to find matches that start at later positions. - - PCRE's "auto-possessification" optimization usually applies to charac- - ter repeats at the end of a pattern (as well as internally). For exam- - ple, the pattern "a\d+" is compiled as if it were "a\d++" because there - is no point even considering the possibility of backtracking into the - repeated digits. For DFA matching, this means that only one possible - match is found. If you really do want multiple matches in such cases, - either use an ungreedy repeat ("a\d+?") or set the PCRE_NO_AUTO_POSSESS - option when compiling. - - There are a number of features of PCRE regular expressions that are not - supported by the alternative matching algorithm. They are as follows: - - 1. Because the algorithm finds all possible matches, the greedy or - ungreedy nature of repetition quantifiers is not relevant. Greedy and - ungreedy quantifiers are treated in exactly the same way. However, pos- - sessive quantifiers can make a difference when what follows could also - match what is quantified, for example in a pattern like this: - - ^a++\w! - - This pattern matches "aaab!" but not "aaa!", which would be matched by - a non-possessive quantifier. Similarly, if an atomic group is present, - it is matched as if it were a standalone pattern at the current point, - and the longest match is then "locked in" for the rest of the overall - pattern. - - 2. When dealing with multiple paths through the tree simultaneously, it - is not straightforward to keep track of captured substrings for the - different matching possibilities, and PCRE's implementation of this - algorithm does not attempt to do this. This means that no captured sub- - strings are available. - - 3. Because no substrings are captured, back references within the pat- - tern are not supported, and cause errors if encountered. - - 4. For the same reason, conditional expressions that use a backrefer- - ence as the condition or test for a specific group recursion are not - supported. - - 5. Because many paths through the tree may be active, the \K escape - sequence, which resets the start of the match when encountered (but may - be on some paths and not on others), is not supported. It causes an - error if encountered. - - 6. Callouts are supported, but the value of the capture_top field is - always 1, and the value of the capture_last field is always -1. - - 7. The \C escape sequence, which (in the standard algorithm) always - matches a single data unit, even in UTF-8, UTF-16 or UTF-32 modes, is - not supported in these modes, because the alternative algorithm moves - through the subject string one character (not data unit) at a time, for - all active paths through the tree. - - 8. Except for (*FAIL), the backtracking control verbs such as (*PRUNE) - are not supported. (*FAIL) is supported, and behaves like a failing - negative assertion. - - -ADVANTAGES OF THE ALTERNATIVE ALGORITHM - - Using the alternative matching algorithm provides the following advan- - tages: - - 1. All possible matches (at a single point in the subject) are automat- - ically found, and in particular, the longest match is found. To find - more than one match using the standard algorithm, you have to do kludgy - things with callouts. - - 2. Because the alternative algorithm scans the subject string just - once, and never needs to backtrack (except for lookbehinds), it is pos- - sible to pass very long subject strings to the matching function in - several pieces, checking for partial matching each time. Although it is - possible to do multi-segment matching using the standard algorithm by - retaining partially matched substrings, it is more complicated. The - pcrepartial documentation gives details of partial matching and dis- - cusses multi-segment matching. - - -DISADVANTAGES OF THE ALTERNATIVE ALGORITHM - - The alternative algorithm suffers from a number of disadvantages: - - 1. It is substantially slower than the standard algorithm. This is - partly because it has to search for all possible matches, but is also - because it is less susceptible to optimization. - - 2. Capturing parentheses and back references are not supported. - - 3. Although atomic groups are supported, their use does not provide the - performance advantage that it does for the standard algorithm. - - -AUTHOR - - Philip Hazel - University Computing Service - Cambridge CB2 3QH, England. - - -REVISION - - Last updated: 12 November 2013 - Copyright (c) 1997-2012 University of Cambridge. ------------------------------------------------------------------------------- - - -PCREAPI(3) Library Functions Manual PCREAPI(3) - - - -NAME - PCRE - Perl-compatible regular expressions - - #include - - -PCRE NATIVE API BASIC FUNCTIONS - - pcre *pcre_compile(const char *pattern, int options, - const char **errptr, int *erroffset, - const unsigned char *tableptr); - - pcre *pcre_compile2(const char *pattern, int options, - int *errorcodeptr, - const char **errptr, int *erroffset, - const unsigned char *tableptr); - - pcre_extra *pcre_study(const pcre *code, int options, - const char **errptr); - - void pcre_free_study(pcre_extra *extra); - - int pcre_exec(const pcre *code, const pcre_extra *extra, - const char *subject, int length, int startoffset, - int options, int *ovector, int ovecsize); - - int pcre_dfa_exec(const pcre *code, const pcre_extra *extra, - const char *subject, int length, int startoffset, - int options, int *ovector, int ovecsize, - int *workspace, int wscount); - - -PCRE NATIVE API STRING EXTRACTION FUNCTIONS - - int pcre_copy_named_substring(const pcre *code, - const char *subject, int *ovector, - int stringcount, const char *stringname, - char *buffer, int buffersize); - - int pcre_copy_substring(const char *subject, int *ovector, - int stringcount, int stringnumber, char *buffer, - int buffersize); - - int pcre_get_named_substring(const pcre *code, - const char *subject, int *ovector, - int stringcount, const char *stringname, - const char **stringptr); - - int pcre_get_stringnumber(const pcre *code, - const char *name); - - int pcre_get_stringtable_entries(const pcre *code, - const char *name, char **first, char **last); - - int pcre_get_substring(const char *subject, int *ovector, - int stringcount, int stringnumber, - const char **stringptr); - - int pcre_get_substring_list(const char *subject, - int *ovector, int stringcount, const char ***listptr); - - void pcre_free_substring(const char *stringptr); - - void pcre_free_substring_list(const char **stringptr); - - -PCRE NATIVE API AUXILIARY FUNCTIONS - - int pcre_jit_exec(const pcre *code, const pcre_extra *extra, - const char *subject, int length, int startoffset, - int options, int *ovector, int ovecsize, - pcre_jit_stack *jstack); - - pcre_jit_stack *pcre_jit_stack_alloc(int startsize, int maxsize); - - void pcre_jit_stack_free(pcre_jit_stack *stack); - - void pcre_assign_jit_stack(pcre_extra *extra, - pcre_jit_callback callback, void *data); - - const unsigned char *pcre_maketables(void); - - int pcre_fullinfo(const pcre *code, const pcre_extra *extra, - int what, void *where); - - int pcre_refcount(pcre *code, int adjust); - - int pcre_config(int what, void *where); - - const char *pcre_version(void); - - int pcre_pattern_to_host_byte_order(pcre *code, - pcre_extra *extra, const unsigned char *tables); - - -PCRE NATIVE API INDIRECTED FUNCTIONS - - void *(*pcre_malloc)(size_t); - - void (*pcre_free)(void *); - - void *(*pcre_stack_malloc)(size_t); - - void (*pcre_stack_free)(void *); - - int (*pcre_callout)(pcre_callout_block *); - - int (*pcre_stack_guard)(void); - - -PCRE 8-BIT, 16-BIT, AND 32-BIT LIBRARIES - - As well as support for 8-bit character strings, PCRE also supports - 16-bit strings (from release 8.30) and 32-bit strings (from release - 8.32), by means of two additional libraries. They can be built as well - as, or instead of, the 8-bit library. To avoid too much complication, - this document describes the 8-bit versions of the functions, with only - occasional references to the 16-bit and 32-bit libraries. - - The 16-bit and 32-bit functions operate in the same way as their 8-bit - counterparts; they just use different data types for their arguments - and results, and their names start with pcre16_ or pcre32_ instead of - pcre_. For every option that has UTF8 in its name (for example, - PCRE_UTF8), there are corresponding 16-bit and 32-bit names with UTF8 - replaced by UTF16 or UTF32, respectively. This facility is in fact just - cosmetic; the 16-bit and 32-bit option names define the same bit val- - ues. - - References to bytes and UTF-8 in this document should be read as refer- - ences to 16-bit data units and UTF-16 when using the 16-bit library, or - 32-bit data units and UTF-32 when using the 32-bit library, unless - specified otherwise. More details of the specific differences for the - 16-bit and 32-bit libraries are given in the pcre16 and pcre32 pages. - - -PCRE API OVERVIEW - - PCRE has its own native API, which is described in this document. There - are also some wrapper functions (for the 8-bit library only) that cor- - respond to the POSIX regular expression API, but they do not give - access to all the functionality. They are described in the pcreposix - documentation. Both of these APIs define a set of C function calls. A - C++ wrapper (again for the 8-bit library only) is also distributed with - PCRE. It is documented in the pcrecpp page. - - The native API C function prototypes are defined in the header file - pcre.h, and on Unix-like systems the (8-bit) library itself is called - libpcre. It can normally be accessed by adding -lpcre to the command - for linking an application that uses PCRE. The header file defines the - macros PCRE_MAJOR and PCRE_MINOR to contain the major and minor release - numbers for the library. Applications can use these to include support - for different releases of PCRE. - - In a Windows environment, if you want to statically link an application - program against a non-dll pcre.a file, you must define PCRE_STATIC - before including pcre.h or pcrecpp.h, because otherwise the pcre_mal- - loc() and pcre_free() exported functions will be declared - __declspec(dllimport), with unwanted results. - - The functions pcre_compile(), pcre_compile2(), pcre_study(), and - pcre_exec() are used for compiling and matching regular expressions in - a Perl-compatible manner. A sample program that demonstrates the sim- - plest way of using them is provided in the file called pcredemo.c in - the PCRE source distribution. A listing of this program is given in the - pcredemo documentation, and the pcresample documentation describes how - to compile and run it. - - Just-in-time compiler support is an optional feature of PCRE that can - be built in appropriate hardware environments. It greatly speeds up the - matching performance of many patterns. Simple programs can easily - request that it be used if available, by setting an option that is - ignored when it is not relevant. More complicated programs might need - to make use of the functions pcre_jit_stack_alloc(), - pcre_jit_stack_free(), and pcre_assign_jit_stack() in order to control - the JIT code's memory usage. - - From release 8.32 there is also a direct interface for JIT execution, - which gives improved performance. The JIT-specific functions are dis- - cussed in the pcrejit documentation. - - A second matching function, pcre_dfa_exec(), which is not Perl-compati- - ble, is also provided. This uses a different algorithm for the match- - ing. The alternative algorithm finds all possible matches (at a given - point in the subject), and scans the subject just once (unless there - are lookbehind assertions). However, this algorithm does not return - captured substrings. A description of the two matching algorithms and - their advantages and disadvantages is given in the pcrematching docu- - mentation. - - In addition to the main compiling and matching functions, there are - convenience functions for extracting captured substrings from a subject - string that is matched by pcre_exec(). They are: - - pcre_copy_substring() - pcre_copy_named_substring() - pcre_get_substring() - pcre_get_named_substring() - pcre_get_substring_list() - pcre_get_stringnumber() - pcre_get_stringtable_entries() - - pcre_free_substring() and pcre_free_substring_list() are also provided, - to free the memory used for extracted strings. - - The function pcre_maketables() is used to build a set of character - tables in the current locale for passing to pcre_compile(), - pcre_exec(), or pcre_dfa_exec(). This is an optional facility that is - provided for specialist use. Most commonly, no special tables are - passed, in which case internal tables that are generated when PCRE is - built are used. - - The function pcre_fullinfo() is used to find out information about a - compiled pattern. The function pcre_version() returns a pointer to a - string containing the version of PCRE and its date of release. - - The function pcre_refcount() maintains a reference count in a data - block containing a compiled pattern. This is provided for the benefit - of object-oriented applications. - - The global variables pcre_malloc and pcre_free initially contain the - entry points of the standard malloc() and free() functions, respec- - tively. PCRE calls the memory management functions via these variables, - so a calling program can replace them if it wishes to intercept the - calls. This should be done before calling any PCRE functions. - - The global variables pcre_stack_malloc and pcre_stack_free are also - indirections to memory management functions. These special functions - are used only when PCRE is compiled to use the heap for remembering - data, instead of recursive function calls, when running the pcre_exec() - function. See the pcrebuild documentation for details of how to do - this. It is a non-standard way of building PCRE, for use in environ- - ments that have limited stacks. Because of the greater use of memory - management, it runs more slowly. Separate functions are provided so - that special-purpose external code can be used for this case. When - used, these functions always allocate memory blocks of the same size. - There is a discussion about PCRE's stack usage in the pcrestack docu- - mentation. - - The global variable pcre_callout initially contains NULL. It can be set - by the caller to a "callout" function, which PCRE will then call at - specified points during a matching operation. Details are given in the - pcrecallout documentation. - - The global variable pcre_stack_guard initially contains NULL. It can be - set by the caller to a function that is called by PCRE whenever it - starts to compile a parenthesized part of a pattern. When parentheses - are nested, PCRE uses recursive function calls, which use up the system - stack. This function is provided so that applications with restricted - stacks can force a compilation error if the stack runs out. The func- - tion should return zero if all is well, or non-zero to force an error. - - -NEWLINES - - PCRE supports five different conventions for indicating line breaks in - strings: a single CR (carriage return) character, a single LF (line- - feed) character, the two-character sequence CRLF, any of the three pre- - ceding, or any Unicode newline sequence. The Unicode newline sequences - are the three just mentioned, plus the single characters VT (vertical - tab, U+000B), FF (form feed, U+000C), NEL (next line, U+0085), LS (line - separator, U+2028), and PS (paragraph separator, U+2029). - - Each of the first three conventions is used by at least one operating - system as its standard newline sequence. When PCRE is built, a default - can be specified. The default default is LF, which is the Unix stan- - dard. When PCRE is run, the default can be overridden, either when a - pattern is compiled, or when it is matched. - - At compile time, the newline convention can be specified by the options - argument of pcre_compile(), or it can be specified by special text at - the start of the pattern itself; this overrides any other settings. See - the pcrepattern page for details of the special character sequences. - - In the PCRE documentation the word "newline" is used to mean "the char- - acter or pair of characters that indicate a line break". The choice of - newline convention affects the handling of the dot, circumflex, and - dollar metacharacters, the handling of #-comments in /x mode, and, when - CRLF is a recognized line ending sequence, the match position advance- - ment for a non-anchored pattern. There is more detail about this in the - section on pcre_exec() options below. - - The choice of newline convention does not affect the interpretation of - the \n or \r escape sequences, nor does it affect what \R matches, - which is controlled in a similar way, but by separate options. - - -MULTITHREADING - - The PCRE functions can be used in multi-threading applications, with - the proviso that the memory management functions pointed to by - pcre_malloc, pcre_free, pcre_stack_malloc, and pcre_stack_free, and the - callout and stack-checking functions pointed to by pcre_callout and - pcre_stack_guard, are shared by all threads. - - The compiled form of a regular expression is not altered during match- - ing, so the same compiled pattern can safely be used by several threads - at once. - - If the just-in-time optimization feature is being used, it needs sepa- - rate memory stack areas for each thread. See the pcrejit documentation - for more details. - - -SAVING PRECOMPILED PATTERNS FOR LATER USE - - The compiled form of a regular expression can be saved and re-used at a - later time, possibly by a different program, and even on a host other - than the one on which it was compiled. Details are given in the - pcreprecompile documentation, which includes a description of the - pcre_pattern_to_host_byte_order() function. However, compiling a regu- - lar expression with one version of PCRE for use with a different ver- - sion is not guaranteed to work and may cause crashes. - - -CHECKING BUILD-TIME OPTIONS - - int pcre_config(int what, void *where); - - The function pcre_config() makes it possible for a PCRE client to dis- - cover which optional features have been compiled into the PCRE library. - The pcrebuild documentation has more details about these optional fea- - tures. - - The first argument for pcre_config() is an integer, specifying which - information is required; the second argument is a pointer to a variable - into which the information is placed. The returned value is zero on - success, or the negative error code PCRE_ERROR_BADOPTION if the value - in the first argument is not recognized. The following information is - available: - - PCRE_CONFIG_UTF8 - - The output is an integer that is set to one if UTF-8 support is avail- - able; otherwise it is set to zero. This value should normally be given - to the 8-bit version of this function, pcre_config(). If it is given to - the 16-bit or 32-bit version of this function, the result is - PCRE_ERROR_BADOPTION. - - PCRE_CONFIG_UTF16 - - The output is an integer that is set to one if UTF-16 support is avail- - able; otherwise it is set to zero. This value should normally be given - to the 16-bit version of this function, pcre16_config(). If it is given - to the 8-bit or 32-bit version of this function, the result is - PCRE_ERROR_BADOPTION. - - PCRE_CONFIG_UTF32 - - The output is an integer that is set to one if UTF-32 support is avail- - able; otherwise it is set to zero. This value should normally be given - to the 32-bit version of this function, pcre32_config(). If it is given - to the 8-bit or 16-bit version of this function, the result is - PCRE_ERROR_BADOPTION. - - PCRE_CONFIG_UNICODE_PROPERTIES - - The output is an integer that is set to one if support for Unicode - character properties is available; otherwise it is set to zero. - - PCRE_CONFIG_JIT - - The output is an integer that is set to one if support for just-in-time - compiling is available; otherwise it is set to zero. - - PCRE_CONFIG_JITTARGET - - The output is a pointer to a zero-terminated "const char *" string. If - JIT support is available, the string contains the name of the architec- - ture for which the JIT compiler is configured, for example "x86 32bit - (little endian + unaligned)". If JIT support is not available, the - result is NULL. - - PCRE_CONFIG_NEWLINE - - The output is an integer whose value specifies the default character - sequence that is recognized as meaning "newline". The values that are - supported in ASCII/Unicode environments are: 10 for LF, 13 for CR, 3338 - for CRLF, -2 for ANYCRLF, and -1 for ANY. In EBCDIC environments, CR, - ANYCRLF, and ANY yield the same values. However, the value for LF is - normally 21, though some EBCDIC environments use 37. The corresponding - values for CRLF are 3349 and 3365. The default should normally corre- - spond to the standard sequence for your operating system. - - PCRE_CONFIG_BSR - - The output is an integer whose value indicates what character sequences - the \R escape sequence matches by default. A value of 0 means that \R - matches any Unicode line ending sequence; a value of 1 means that \R - matches only CR, LF, or CRLF. The default can be overridden when a pat- - tern is compiled or matched. - - PCRE_CONFIG_LINK_SIZE - - The output is an integer that contains the number of bytes used for - internal linkage in compiled regular expressions. For the 8-bit - library, the value can be 2, 3, or 4. For the 16-bit library, the value - is either 2 or 4 and is still a number of bytes. For the 32-bit - library, the value is either 2 or 4 and is still a number of bytes. The - default value of 2 is sufficient for all but the most massive patterns, - since it allows the compiled pattern to be up to 64K in size. Larger - values allow larger regular expressions to be compiled, at the expense - of slower matching. - - PCRE_CONFIG_POSIX_MALLOC_THRESHOLD - - The output is an integer that contains the threshold above which the - POSIX interface uses malloc() for output vectors. Further details are - given in the pcreposix documentation. - - PCRE_CONFIG_PARENS_LIMIT - - The output is a long integer that gives the maximum depth of nesting of - parentheses (of any kind) in a pattern. This limit is imposed to cap - the amount of system stack used when a pattern is compiled. It is spec- - ified when PCRE is built; the default is 250. This limit does not take - into account the stack that may already be used by the calling applica- - tion. For finer control over compilation stack usage, you can set a - pointer to an external checking function in pcre_stack_guard. - - PCRE_CONFIG_MATCH_LIMIT - - The output is a long integer that gives the default limit for the num- - ber of internal matching function calls in a pcre_exec() execution. - Further details are given with pcre_exec() below. - - PCRE_CONFIG_MATCH_LIMIT_RECURSION - - The output is a long integer that gives the default limit for the depth - of recursion when calling the internal matching function in a - pcre_exec() execution. Further details are given with pcre_exec() - below. - - PCRE_CONFIG_STACKRECURSE - - The output is an integer that is set to one if internal recursion when - running pcre_exec() is implemented by recursive function calls that use - the stack to remember their state. This is the usual way that PCRE is - compiled. The output is zero if PCRE was compiled to use blocks of data - on the heap instead of recursive function calls. In this case, - pcre_stack_malloc and pcre_stack_free are called to manage memory - blocks on the heap, thus avoiding the use of the stack. - - -COMPILING A PATTERN - - pcre *pcre_compile(const char *pattern, int options, - const char **errptr, int *erroffset, - const unsigned char *tableptr); - - pcre *pcre_compile2(const char *pattern, int options, - int *errorcodeptr, - const char **errptr, int *erroffset, - const unsigned char *tableptr); - - Either of the functions pcre_compile() or pcre_compile2() can be called - to compile a pattern into an internal form. The only difference between - the two interfaces is that pcre_compile2() has an additional argument, - errorcodeptr, via which a numerical error code can be returned. To - avoid too much repetition, we refer just to pcre_compile() below, but - the information applies equally to pcre_compile2(). - - The pattern is a C string terminated by a binary zero, and is passed in - the pattern argument. A pointer to a single block of memory that is - obtained via pcre_malloc is returned. This contains the compiled code - and related data. The pcre type is defined for the returned block; this - is a typedef for a structure whose contents are not externally defined. - It is up to the caller to free the memory (via pcre_free) when it is no - longer required. - - Although the compiled code of a PCRE regex is relocatable, that is, it - does not depend on memory location, the complete pcre data block is not - fully relocatable, because it may contain a copy of the tableptr argu- - ment, which is an address (see below). - - The options argument contains various bit settings that affect the com- - pilation. It should be zero if no options are required. The available - options are described below. Some of them (in particular, those that - are compatible with Perl, but some others as well) can also be set and - unset from within the pattern (see the detailed description in the - pcrepattern documentation). For those options that can be different in - different parts of the pattern, the contents of the options argument - specifies their settings at the start of compilation and execution. The - PCRE_ANCHORED, PCRE_BSR_xxx, PCRE_NEWLINE_xxx, PCRE_NO_UTF8_CHECK, and - PCRE_NO_START_OPTIMIZE options can be set at the time of matching as - well as at compile time. - - If errptr is NULL, pcre_compile() returns NULL immediately. Otherwise, - if compilation of a pattern fails, pcre_compile() returns NULL, and - sets the variable pointed to by errptr to point to a textual error mes- - sage. This is a static string that is part of the library. You must not - try to free it. Normally, the offset from the start of the pattern to - the data unit that was being processed when the error was discovered is - placed in the variable pointed to by erroffset, which must not be NULL - (if it is, an immediate error is given). However, for an invalid UTF-8 - or UTF-16 string, the offset is that of the first data unit of the - failing character. - - Some errors are not detected until the whole pattern has been scanned; - in these cases, the offset passed back is the length of the pattern. - Note that the offset is in data units, not characters, even in a UTF - mode. It may sometimes point into the middle of a UTF-8 or UTF-16 char- - acter. - - If pcre_compile2() is used instead of pcre_compile(), and the error- - codeptr argument is not NULL, a non-zero error code number is returned - via this argument in the event of an error. This is in addition to the - textual error message. Error codes and messages are listed below. - - If the final argument, tableptr, is NULL, PCRE uses a default set of - character tables that are built when PCRE is compiled, using the - default C locale. Otherwise, tableptr must be an address that is the - result of a call to pcre_maketables(). This value is stored with the - compiled pattern, and used again by pcre_exec() and pcre_dfa_exec() - when the pattern is matched. For more discussion, see the section on - locale support below. - - This code fragment shows a typical straightforward call to pcre_com- - pile(): - - pcre *re; - const char *error; - int erroffset; - re = pcre_compile( - "^A.*Z", /* the pattern */ - 0, /* default options */ - &error, /* for error message */ - &erroffset, /* for error offset */ - NULL); /* use default character tables */ - - The following names for option bits are defined in the pcre.h header - file: - - PCRE_ANCHORED - - If this bit is set, the pattern is forced to be "anchored", that is, it - is constrained to match only at the first matching point in the string - that is being searched (the "subject string"). This effect can also be - achieved by appropriate constructs in the pattern itself, which is the - only way to do it in Perl. - - PCRE_AUTO_CALLOUT - - If this bit is set, pcre_compile() automatically inserts callout items, - all with number 255, before each pattern item. For discussion of the - callout facility, see the pcrecallout documentation. - - PCRE_BSR_ANYCRLF - PCRE_BSR_UNICODE - - These options (which are mutually exclusive) control what the \R escape - sequence matches. The choice is either to match only CR, LF, or CRLF, - or to match any Unicode newline sequence. The default is specified when - PCRE is built. It can be overridden from within the pattern, or by set- - ting an option when a compiled pattern is matched. - - PCRE_CASELESS - - If this bit is set, letters in the pattern match both upper and lower - case letters. It is equivalent to Perl's /i option, and it can be - changed within a pattern by a (?i) option setting. In UTF-8 mode, PCRE - always understands the concept of case for characters whose values are - less than 128, so caseless matching is always possible. For characters - with higher values, the concept of case is supported if PCRE is com- - piled with Unicode property support, but not otherwise. If you want to - use caseless matching for characters 128 and above, you must ensure - that PCRE is compiled with Unicode property support as well as with - UTF-8 support. - - PCRE_DOLLAR_ENDONLY - - If this bit is set, a dollar metacharacter in the pattern matches only - at the end of the subject string. Without this option, a dollar also - matches immediately before a newline at the end of the string (but not - before any other newlines). The PCRE_DOLLAR_ENDONLY option is ignored - if PCRE_MULTILINE is set. There is no equivalent to this option in - Perl, and no way to set it within a pattern. - - PCRE_DOTALL - - If this bit is set, a dot metacharacter in the pattern matches a char- - acter of any value, including one that indicates a newline. However, it - only ever matches one character, even if newlines are coded as CRLF. - Without this option, a dot does not match when the current position is - at a newline. This option is equivalent to Perl's /s option, and it can - be changed within a pattern by a (?s) option setting. A negative class - such as [^a] always matches newline characters, independent of the set- - ting of this option. - - PCRE_DUPNAMES - - If this bit is set, names used to identify capturing subpatterns need - not be unique. This can be helpful for certain types of pattern when it - is known that only one instance of the named subpattern can ever be - matched. There are more details of named subpatterns below; see also - the pcrepattern documentation. - - PCRE_EXTENDED - - If this bit is set, most white space characters in the pattern are - totally ignored except when escaped or inside a character class. How- - ever, white space is not allowed within sequences such as (?> that - introduce various parenthesized subpatterns, nor within a numerical - quantifier such as {1,3}. However, ignorable white space is permitted - between an item and a following quantifier and between a quantifier and - a following + that indicates possessiveness. - - White space did not used to include the VT character (code 11), because - Perl did not treat this character as white space. However, Perl changed - at release 5.18, so PCRE followed at release 8.34, and VT is now - treated as white space. - - PCRE_EXTENDED also causes characters between an unescaped # outside a - character class and the next newline, inclusive, to be ignored. - PCRE_EXTENDED is equivalent to Perl's /x option, and it can be changed - within a pattern by a (?x) option setting. - - Which characters are interpreted as newlines is controlled by the - options passed to pcre_compile() or by a special sequence at the start - of the pattern, as described in the section entitled "Newline conven- - tions" in the pcrepattern documentation. Note that the end of this type - of comment is a literal newline sequence in the pattern; escape - sequences that happen to represent a newline do not count. - - This option makes it possible to include comments inside complicated - patterns. Note, however, that this applies only to data characters. - White space characters may never appear within special character - sequences in a pattern, for example within the sequence (?( that intro- - duces a conditional subpattern. - - PCRE_EXTRA - - This option was invented in order to turn on additional functionality - of PCRE that is incompatible with Perl, but it is currently of very - little use. When set, any backslash in a pattern that is followed by a - letter that has no special meaning causes an error, thus reserving - these combinations for future expansion. By default, as in Perl, a - backslash followed by a letter with no special meaning is treated as a - literal. (Perl can, however, be persuaded to give an error for this, by - running it with the -w option.) There are at present no other features - controlled by this option. It can also be set by a (?X) option setting - within a pattern. - - PCRE_FIRSTLINE - - If this option is set, an unanchored pattern is required to match - before or at the first newline in the subject string, though the - matched text may continue over the newline. - - PCRE_JAVASCRIPT_COMPAT - - If this option is set, PCRE's behaviour is changed in some ways so that - it is compatible with JavaScript rather than Perl. The changes are as - follows: - - (1) A lone closing square bracket in a pattern causes a compile-time - error, because this is illegal in JavaScript (by default it is treated - as a data character). Thus, the pattern AB]CD becomes illegal when this - option is set. - - (2) At run time, a back reference to an unset subpattern group matches - an empty string (by default this causes the current matching alterna- - tive to fail). A pattern such as (\1)(a) succeeds when this option is - set (assuming it can find an "a" in the subject), whereas it fails by - default, for Perl compatibility. - - (3) \U matches an upper case "U" character; by default \U causes a com- - pile time error (Perl uses \U to upper case subsequent characters). - - (4) \u matches a lower case "u" character unless it is followed by four - hexadecimal digits, in which case the hexadecimal number defines the - code point to match. By default, \u causes a compile time error (Perl - uses it to upper case the following character). - - (5) \x matches a lower case "x" character unless it is followed by two - hexadecimal digits, in which case the hexadecimal number defines the - code point to match. By default, as in Perl, a hexadecimal number is - always expected after \x, but it may have zero, one, or two digits (so, - for example, \xz matches a binary zero character followed by z). - - PCRE_MULTILINE - - By default, for the purposes of matching "start of line" and "end of - line", PCRE treats the subject string as consisting of a single line of - characters, even if it actually contains newlines. The "start of line" - metacharacter (^) matches only at the start of the string, and the "end - of line" metacharacter ($) matches only at the end of the string, or - before a terminating newline (except when PCRE_DOLLAR_ENDONLY is set). - Note, however, that unless PCRE_DOTALL is set, the "any character" - metacharacter (.) does not match at a newline. This behaviour (for ^, - $, and dot) is the same as Perl. - - When PCRE_MULTILINE it is set, the "start of line" and "end of line" - constructs match immediately following or immediately before internal - newlines in the subject string, respectively, as well as at the very - start and end. This is equivalent to Perl's /m option, and it can be - changed within a pattern by a (?m) option setting. If there are no new- - lines in a subject string, or no occurrences of ^ or $ in a pattern, - setting PCRE_MULTILINE has no effect. - - PCRE_NEVER_UTF - - This option locks out interpretation of the pattern as UTF-8 (or UTF-16 - or UTF-32 in the 16-bit and 32-bit libraries). In particular, it pre- - vents the creator of the pattern from switching to UTF interpretation - by starting the pattern with (*UTF). This may be useful in applications - that process patterns from external sources. The combination of - PCRE_UTF8 and PCRE_NEVER_UTF also causes an error. - - PCRE_NEWLINE_CR - PCRE_NEWLINE_LF - PCRE_NEWLINE_CRLF - PCRE_NEWLINE_ANYCRLF - PCRE_NEWLINE_ANY - - These options override the default newline definition that was chosen - when PCRE was built. Setting the first or the second specifies that a - newline is indicated by a single character (CR or LF, respectively). - Setting PCRE_NEWLINE_CRLF specifies that a newline is indicated by the - two-character CRLF sequence. Setting PCRE_NEWLINE_ANYCRLF specifies - that any of the three preceding sequences should be recognized. Setting - PCRE_NEWLINE_ANY specifies that any Unicode newline sequence should be - recognized. - - In an ASCII/Unicode environment, the Unicode newline sequences are the - three just mentioned, plus the single characters VT (vertical tab, - U+000B), FF (form feed, U+000C), NEL (next line, U+0085), LS (line sep- - arator, U+2028), and PS (paragraph separator, U+2029). For the 8-bit - library, the last two are recognized only in UTF-8 mode. - - When PCRE is compiled to run in an EBCDIC (mainframe) environment, the - code for CR is 0x0d, the same as ASCII. However, the character code for - LF is normally 0x15, though in some EBCDIC environments 0x25 is used. - Whichever of these is not LF is made to correspond to Unicode's NEL - character. EBCDIC codes are all less than 256. For more details, see - the pcrebuild documentation. - - The newline setting in the options word uses three bits that are - treated as a number, giving eight possibilities. Currently only six are - used (default plus the five values above). This means that if you set - more than one newline option, the combination may or may not be sensi- - ble. For example, PCRE_NEWLINE_CR with PCRE_NEWLINE_LF is equivalent to - PCRE_NEWLINE_CRLF, but other combinations may yield unused numbers and - cause an error. - - The only time that a line break in a pattern is specially recognized - when compiling is when PCRE_EXTENDED is set. CR and LF are white space - characters, and so are ignored in this mode. Also, an unescaped # out- - side a character class indicates a comment that lasts until after the - next line break sequence. In other circumstances, line break sequences - in patterns are treated as literal data. - - The newline option that is set at compile time becomes the default that - is used for pcre_exec() and pcre_dfa_exec(), but it can be overridden. - - PCRE_NO_AUTO_CAPTURE - - If this option is set, it disables the use of numbered capturing paren- - theses in the pattern. Any opening parenthesis that is not followed by - ? behaves as if it were followed by ?: but named parentheses can still - be used for capturing (and they acquire numbers in the usual way). - There is no equivalent of this option in Perl. - - PCRE_NO_AUTO_POSSESS - - If this option is set, it disables "auto-possessification". This is an - optimization that, for example, turns a+b into a++b in order to avoid - backtracks into a+ that can never be successful. However, if callouts - are in use, auto-possessification means that some of them are never - taken. You can set this option if you want the matching functions to do - a full unoptimized search and run all the callouts, but it is mainly - provided for testing purposes. - - PCRE_NO_START_OPTIMIZE - - This is an option that acts at matching time; that is, it is really an - option for pcre_exec() or pcre_dfa_exec(). If it is set at compile - time, it is remembered with the compiled pattern and assumed at match- - ing time. This is necessary if you want to use JIT execution, because - the JIT compiler needs to know whether or not this option is set. For - details see the discussion of PCRE_NO_START_OPTIMIZE below. - - PCRE_UCP - - This option changes the way PCRE processes \B, \b, \D, \d, \S, \s, \W, - \w, and some of the POSIX character classes. By default, only ASCII - characters are recognized, but if PCRE_UCP is set, Unicode properties - are used instead to classify characters. More details are given in the - section on generic character types in the pcrepattern page. If you set - PCRE_UCP, matching one of the items it affects takes much longer. The - option is available only if PCRE has been compiled with Unicode prop- - erty support. - - PCRE_UNGREEDY - - This option inverts the "greediness" of the quantifiers so that they - are not greedy by default, but become greedy if followed by "?". It is - not compatible with Perl. It can also be set by a (?U) option setting - within the pattern. - - PCRE_UTF8 - - This option causes PCRE to regard both the pattern and the subject as - strings of UTF-8 characters instead of single-byte strings. However, it - is available only when PCRE is built to include UTF support. If not, - the use of this option provokes an error. Details of how this option - changes the behaviour of PCRE are given in the pcreunicode page. - - PCRE_NO_UTF8_CHECK - - When PCRE_UTF8 is set, the validity of the pattern as a UTF-8 string is - automatically checked. There is a discussion about the validity of - UTF-8 strings in the pcreunicode page. If an invalid UTF-8 sequence is - found, pcre_compile() returns an error. If you already know that your - pattern is valid, and you want to skip this check for performance rea- - sons, you can set the PCRE_NO_UTF8_CHECK option. When it is set, the - effect of passing an invalid UTF-8 string as a pattern is undefined. It - may cause your program to crash or loop. Note that this option can also - be passed to pcre_exec() and pcre_dfa_exec(), to suppress the validity - checking of subject strings only. If the same string is being matched - many times, the option can be safely set for the second and subsequent - matchings to improve performance. - - -COMPILATION ERROR CODES - - The following table lists the error codes than may be returned by - pcre_compile2(), along with the error messages that may be returned by - both compiling functions. Note that error messages are always 8-bit - ASCII strings, even in 16-bit or 32-bit mode. As PCRE has developed, - some error codes have fallen out of use. To avoid confusion, they have - not been re-used. - - 0 no error - 1 \ at end of pattern - 2 \c at end of pattern - 3 unrecognized character follows \ - 4 numbers out of order in {} quantifier - 5 number too big in {} quantifier - 6 missing terminating ] for character class - 7 invalid escape sequence in character class - 8 range out of order in character class - 9 nothing to repeat - 10 [this code is not in use] - 11 internal error: unexpected repeat - 12 unrecognized character after (? or (?- - 13 POSIX named classes are supported only within a class - 14 missing ) - 15 reference to non-existent subpattern - 16 erroffset passed as NULL - 17 unknown option bit(s) set - 18 missing ) after comment - 19 [this code is not in use] - 20 regular expression is too large - 21 failed to get memory - 22 unmatched parentheses - 23 internal error: code overflow - 24 unrecognized character after (?< - 25 lookbehind assertion is not fixed length - 26 malformed number or name after (?( - 27 conditional group contains more than two branches - 28 assertion expected after (?( - 29 (?R or (?[+-]digits must be followed by ) - 30 unknown POSIX class name - 31 POSIX collating elements are not supported - 32 this version of PCRE is compiled without UTF support - 33 [this code is not in use] - 34 character value in \x{} or \o{} is too large - 35 invalid condition (?(0) - 36 \C not allowed in lookbehind assertion - 37 PCRE does not support \L, \l, \N{name}, \U, or \u - 38 number after (?C is > 255 - 39 closing ) for (?C expected - 40 recursive call could loop indefinitely - 41 unrecognized character after (?P - 42 syntax error in subpattern name (missing terminator) - 43 two named subpatterns have the same name - 44 invalid UTF-8 string (specifically UTF-8) - 45 support for \P, \p, and \X has not been compiled - 46 malformed \P or \p sequence - 47 unknown property name after \P or \p - 48 subpattern name is too long (maximum 32 characters) - 49 too many named subpatterns (maximum 10000) - 50 [this code is not in use] - 51 octal value is greater than \377 in 8-bit non-UTF-8 mode - 52 internal error: overran compiling workspace - 53 internal error: previously-checked referenced subpattern - not found - 54 DEFINE group contains more than one branch - 55 repeating a DEFINE group is not allowed - 56 inconsistent NEWLINE options - 57 \g is not followed by a braced, angle-bracketed, or quoted - name/number or by a plain number - 58 a numbered reference must not be zero - 59 an argument is not allowed for (*ACCEPT), (*FAIL), or (*COMMIT) - 60 (*VERB) not recognized or malformed - 61 number is too big - 62 subpattern name expected - 63 digit expected after (?+ - 64 ] is an invalid data character in JavaScript compatibility mode - 65 different names for subpatterns of the same number are - not allowed - 66 (*MARK) must have an argument - 67 this version of PCRE is not compiled with Unicode property - support - 68 \c must be followed by an ASCII character - 69 \k is not followed by a braced, angle-bracketed, or quoted name - 70 internal error: unknown opcode in find_fixedlength() - 71 \N is not supported in a class - 72 too many forward references - 73 disallowed Unicode code point (>= 0xd800 && <= 0xdfff) - 74 invalid UTF-16 string (specifically UTF-16) - 75 name is too long in (*MARK), (*PRUNE), (*SKIP), or (*THEN) - 76 character value in \u.... sequence is too large - 77 invalid UTF-32 string (specifically UTF-32) - 78 setting UTF is disabled by the application - 79 non-hex character in \x{} (closing brace missing?) - 80 non-octal character in \o{} (closing brace missing?) - 81 missing opening brace after \o - 82 parentheses are too deeply nested - 83 invalid range in character class - 84 group name must start with a non-digit - 85 parentheses are too deeply nested (stack check) - - The numbers 32 and 10000 in errors 48 and 49 are defaults; different - values may be used if the limits were changed when PCRE was built. - - -STUDYING A PATTERN - - pcre_extra *pcre_study(const pcre *code, int options, - const char **errptr); - - If a compiled pattern is going to be used several times, it is worth - spending more time analyzing it in order to speed up the time taken for - matching. The function pcre_study() takes a pointer to a compiled pat- - tern as its first argument. If studying the pattern produces additional - information that will help speed up matching, pcre_study() returns a - pointer to a pcre_extra block, in which the study_data field points to - the results of the study. - - The returned value from pcre_study() can be passed directly to - pcre_exec() or pcre_dfa_exec(). However, a pcre_extra block also con- - tains other fields that can be set by the caller before the block is - passed; these are described below in the section on matching a pattern. - - If studying the pattern does not produce any useful information, - pcre_study() returns NULL by default. In that circumstance, if the - calling program wants to pass any of the other fields to pcre_exec() or - pcre_dfa_exec(), it must set up its own pcre_extra block. However, if - pcre_study() is called with the PCRE_STUDY_EXTRA_NEEDED option, it - returns a pcre_extra block even if studying did not find any additional - information. It may still return NULL, however, if an error occurs in - pcre_study(). - - The second argument of pcre_study() contains option bits. There are - three further options in addition to PCRE_STUDY_EXTRA_NEEDED: - - PCRE_STUDY_JIT_COMPILE - PCRE_STUDY_JIT_PARTIAL_HARD_COMPILE - PCRE_STUDY_JIT_PARTIAL_SOFT_COMPILE - - If any of these are set, and the just-in-time compiler is available, - the pattern is further compiled into machine code that executes much - faster than the pcre_exec() interpretive matching function. If the - just-in-time compiler is not available, these options are ignored. All - undefined bits in the options argument must be zero. - - JIT compilation is a heavyweight optimization. It can take some time - for patterns to be analyzed, and for one-off matches and simple pat- - terns the benefit of faster execution might be offset by a much slower - study time. Not all patterns can be optimized by the JIT compiler. For - those that cannot be handled, matching automatically falls back to the - pcre_exec() interpreter. For more details, see the pcrejit documenta- - tion. - - The third argument for pcre_study() is a pointer for an error message. - If studying succeeds (even if no data is returned), the variable it - points to is set to NULL. Otherwise it is set to point to a textual - error message. This is a static string that is part of the library. You - must not try to free it. You should test the error pointer for NULL - after calling pcre_study(), to be sure that it has run successfully. - - When you are finished with a pattern, you can free the memory used for - the study data by calling pcre_free_study(). This function was added to - the API for release 8.20. For earlier versions, the memory could be - freed with pcre_free(), just like the pattern itself. This will still - work in cases where JIT optimization is not used, but it is advisable - to change to the new function when convenient. - - This is a typical way in which pcre_study() is used (except that in a - real application there should be tests for errors): - - int rc; - pcre *re; - pcre_extra *sd; - re = pcre_compile("pattern", 0, &error, &erroroffset, NULL); - sd = pcre_study( - re, /* result of pcre_compile() */ - 0, /* no options */ - &error); /* set to NULL or points to a message */ - rc = pcre_exec( /* see below for details of pcre_exec() options */ - re, sd, "subject", 7, 0, 0, ovector, 30); - ... - pcre_free_study(sd); - pcre_free(re); - - Studying a pattern does two things: first, a lower bound for the length - of subject string that is needed to match the pattern is computed. This - does not mean that there are any strings of that length that match, but - it does guarantee that no shorter strings match. The value is used to - avoid wasting time by trying to match strings that are shorter than the - lower bound. You can find out the value in a calling program via the - pcre_fullinfo() function. - - Studying a pattern is also useful for non-anchored patterns that do not - have a single fixed starting character. A bitmap of possible starting - bytes is created. This speeds up finding a position in the subject at - which to start matching. (In 16-bit mode, the bitmap is used for 16-bit - values less than 256. In 32-bit mode, the bitmap is used for 32-bit - values less than 256.) - - These two optimizations apply to both pcre_exec() and pcre_dfa_exec(), - and the information is also used by the JIT compiler. The optimiza- - tions can be disabled by setting the PCRE_NO_START_OPTIMIZE option. - You might want to do this if your pattern contains callouts or (*MARK) - and you want to make use of these facilities in cases where matching - fails. - - PCRE_NO_START_OPTIMIZE can be specified at either compile time or exe- - cution time. However, if PCRE_NO_START_OPTIMIZE is passed to - pcre_exec(), (that is, after any JIT compilation has happened) JIT exe- - cution is disabled. For JIT execution to work with PCRE_NO_START_OPTI- - MIZE, the option must be set at compile time. - - There is a longer discussion of PCRE_NO_START_OPTIMIZE below. - - -LOCALE SUPPORT - - PCRE handles caseless matching, and determines whether characters are - letters, digits, or whatever, by reference to a set of tables, indexed - by character code point. When running in UTF-8 mode, or in the 16- or - 32-bit libraries, this applies only to characters with code points less - than 256. By default, higher-valued code points never match escapes - such as \w or \d. However, if PCRE is built with Unicode property sup- - port, all characters can be tested with \p and \P, or, alternatively, - the PCRE_UCP option can be set when a pattern is compiled; this causes - \w and friends to use Unicode property support instead of the built-in - tables. - - The use of locales with Unicode is discouraged. If you are handling - characters with code points greater than 128, you should either use - Unicode support, or use locales, but not try to mix the two. - - PCRE contains an internal set of tables that are used when the final - argument of pcre_compile() is NULL. These are sufficient for many - applications. Normally, the internal tables recognize only ASCII char- - acters. However, when PCRE is built, it is possible to cause the inter- - nal tables to be rebuilt in the default "C" locale of the local system, - which may cause them to be different. - - The internal tables can always be overridden by tables supplied by the - application that calls PCRE. These may be created in a different locale - from the default. As more and more applications change to using Uni- - code, the need for this locale support is expected to die away. - - External tables are built by calling the pcre_maketables() function, - which has no arguments, in the relevant locale. The result can then be - passed to pcre_compile() as often as necessary. For example, to build - and use tables that are appropriate for the French locale (where - accented characters with values greater than 128 are treated as let- - ters), the following code could be used: - - setlocale(LC_CTYPE, "fr_FR"); - tables = pcre_maketables(); - re = pcre_compile(..., tables); - - The locale name "fr_FR" is used on Linux and other Unix-like systems; - if you are using Windows, the name for the French locale is "french". - - When pcre_maketables() runs, the tables are built in memory that is - obtained via pcre_malloc. It is the caller's responsibility to ensure - that the memory containing the tables remains available for as long as - it is needed. - - The pointer that is passed to pcre_compile() is saved with the compiled - pattern, and the same tables are used via this pointer by pcre_study() - and also by pcre_exec() and pcre_dfa_exec(). Thus, for any single pat- - tern, compilation, studying and matching all happen in the same locale, - but different patterns can be processed in different locales. - - It is possible to pass a table pointer or NULL (indicating the use of - the internal tables) to pcre_exec() or pcre_dfa_exec() (see the discus- - sion below in the section on matching a pattern). This facility is pro- - vided for use with pre-compiled patterns that have been saved and - reloaded. Character tables are not saved with patterns, so if a non- - standard table was used at compile time, it must be provided again when - the reloaded pattern is matched. Attempting to use this facility to - match a pattern in a different locale from the one in which it was com- - piled is likely to lead to anomalous (usually incorrect) results. - - -INFORMATION ABOUT A PATTERN - - int pcre_fullinfo(const pcre *code, const pcre_extra *extra, - int what, void *where); - - The pcre_fullinfo() function returns information about a compiled pat- - tern. It replaces the pcre_info() function, which was removed from the - library at version 8.30, after more than 10 years of obsolescence. - - The first argument for pcre_fullinfo() is a pointer to the compiled - pattern. The second argument is the result of pcre_study(), or NULL if - the pattern was not studied. The third argument specifies which piece - of information is required, and the fourth argument is a pointer to a - variable to receive the data. The yield of the function is zero for - success, or one of the following negative numbers: - - PCRE_ERROR_NULL the argument code was NULL - the argument where was NULL - PCRE_ERROR_BADMAGIC the "magic number" was not found - PCRE_ERROR_BADENDIANNESS the pattern was compiled with different - endianness - PCRE_ERROR_BADOPTION the value of what was invalid - PCRE_ERROR_UNSET the requested field is not set - - The "magic number" is placed at the start of each compiled pattern as - an simple check against passing an arbitrary memory pointer. The endi- - anness error can occur if a compiled pattern is saved and reloaded on a - different host. Here is a typical call of pcre_fullinfo(), to obtain - the length of the compiled pattern: - - int rc; - size_t length; - rc = pcre_fullinfo( - re, /* result of pcre_compile() */ - sd, /* result of pcre_study(), or NULL */ - PCRE_INFO_SIZE, /* what is required */ - &length); /* where to put the data */ - - The possible values for the third argument are defined in pcre.h, and - are as follows: - - PCRE_INFO_BACKREFMAX - - Return the number of the highest back reference in the pattern. The - fourth argument should point to an int variable. Zero is returned if - there are no back references. - - PCRE_INFO_CAPTURECOUNT - - Return the number of capturing subpatterns in the pattern. The fourth - argument should point to an int variable. - - PCRE_INFO_DEFAULT_TABLES - - Return a pointer to the internal default character tables within PCRE. - The fourth argument should point to an unsigned char * variable. This - information call is provided for internal use by the pcre_study() func- - tion. External callers can cause PCRE to use its internal tables by - passing a NULL table pointer. - - PCRE_INFO_FIRSTBYTE (deprecated) - - Return information about the first data unit of any matched string, for - a non-anchored pattern. The name of this option refers to the 8-bit - library, where data units are bytes. The fourth argument should point - to an int variable. Negative values are used for special cases. How- - ever, this means that when the 32-bit library is in non-UTF-32 mode, - the full 32-bit range of characters cannot be returned. For this rea- - son, this value is deprecated; use PCRE_INFO_FIRSTCHARACTERFLAGS and - PCRE_INFO_FIRSTCHARACTER instead. - - If there is a fixed first value, for example, the letter "c" from a - pattern such as (cat|cow|coyote), its value is returned. In the 8-bit - library, the value is always less than 256. In the 16-bit library the - value can be up to 0xffff. In the 32-bit library the value can be up to - 0x10ffff. - - If there is no fixed first value, and if either - - (a) the pattern was compiled with the PCRE_MULTILINE option, and every - branch starts with "^", or - - (b) every branch of the pattern starts with ".*" and PCRE_DOTALL is not - set (if it were set, the pattern would be anchored), - - -1 is returned, indicating that the pattern matches only at the start - of a subject string or after any newline within the string. Otherwise - -2 is returned. For anchored patterns, -2 is returned. - - PCRE_INFO_FIRSTCHARACTER - - Return the value of the first data unit (non-UTF character) of any - matched string in the situation where PCRE_INFO_FIRSTCHARACTERFLAGS - returns 1; otherwise return 0. The fourth argument should point to an - uint_t variable. - - In the 8-bit library, the value is always less than 256. In the 16-bit - library the value can be up to 0xffff. In the 32-bit library in UTF-32 - mode the value can be up to 0x10ffff, and up to 0xffffffff when not - using UTF-32 mode. - - PCRE_INFO_FIRSTCHARACTERFLAGS - - Return information about the first data unit of any matched string, for - a non-anchored pattern. The fourth argument should point to an int - variable. - - If there is a fixed first value, for example, the letter "c" from a - pattern such as (cat|cow|coyote), 1 is returned, and the character - value can be retrieved using PCRE_INFO_FIRSTCHARACTER. If there is no - fixed first value, and if either - - (a) the pattern was compiled with the PCRE_MULTILINE option, and every - branch starts with "^", or - - (b) every branch of the pattern starts with ".*" and PCRE_DOTALL is not - set (if it were set, the pattern would be anchored), - - 2 is returned, indicating that the pattern matches only at the start of - a subject string or after any newline within the string. Otherwise 0 is - returned. For anchored patterns, 0 is returned. - - PCRE_INFO_FIRSTTABLE - - If the pattern was studied, and this resulted in the construction of a - 256-bit table indicating a fixed set of values for the first data unit - in any matching string, a pointer to the table is returned. Otherwise - NULL is returned. The fourth argument should point to an unsigned char - * variable. - - PCRE_INFO_HASCRORLF - - Return 1 if the pattern contains any explicit matches for CR or LF - characters, otherwise 0. The fourth argument should point to an int - variable. An explicit match is either a literal CR or LF character, or - \r or \n. - - PCRE_INFO_JCHANGED - - Return 1 if the (?J) or (?-J) option setting is used in the pattern, - otherwise 0. The fourth argument should point to an int variable. (?J) - and (?-J) set and unset the local PCRE_DUPNAMES option, respectively. - - PCRE_INFO_JIT - - Return 1 if the pattern was studied with one of the JIT options, and - just-in-time compiling was successful. The fourth argument should point - to an int variable. A return value of 0 means that JIT support is not - available in this version of PCRE, or that the pattern was not studied - with a JIT option, or that the JIT compiler could not handle this par- - ticular pattern. See the pcrejit documentation for details of what can - and cannot be handled. - - PCRE_INFO_JITSIZE - - If the pattern was successfully studied with a JIT option, return the - size of the JIT compiled code, otherwise return zero. The fourth argu- - ment should point to a size_t variable. - - PCRE_INFO_LASTLITERAL - - Return the value of the rightmost literal data unit that must exist in - any matched string, other than at its start, if such a value has been - recorded. The fourth argument should point to an int variable. If there - is no such value, -1 is returned. For anchored patterns, a last literal - value is recorded only if it follows something of variable length. For - example, for the pattern /^a\d+z\d+/ the returned value is "z", but for - /^a\dz\d/ the returned value is -1. - - Since for the 32-bit library using the non-UTF-32 mode, this function - is unable to return the full 32-bit range of characters, this value is - deprecated; instead the PCRE_INFO_REQUIREDCHARFLAGS and - PCRE_INFO_REQUIREDCHAR values should be used. - - PCRE_INFO_MATCH_EMPTY - - Return 1 if the pattern can match an empty string, otherwise 0. The - fourth argument should point to an int variable. - - PCRE_INFO_MATCHLIMIT - - If the pattern set a match limit by including an item of the form - (*LIMIT_MATCH=nnnn) at the start, the value is returned. The fourth - argument should point to an unsigned 32-bit integer. If no such value - has been set, the call to pcre_fullinfo() returns the error - PCRE_ERROR_UNSET. - - PCRE_INFO_MAXLOOKBEHIND - - Return the number of characters (NB not data units) in the longest - lookbehind assertion in the pattern. This information is useful when - doing multi-segment matching using the partial matching facilities. - Note that the simple assertions \b and \B require a one-character look- - behind. \A also registers a one-character lookbehind, though it does - not actually inspect the previous character. This is to ensure that at - least one character from the old segment is retained when a new segment - is processed. Otherwise, if there are no lookbehinds in the pattern, \A - might match incorrectly at the start of a new segment. - - PCRE_INFO_MINLENGTH - - If the pattern was studied and a minimum length for matching subject - strings was computed, its value is returned. Otherwise the returned - value is -1. The value is a number of characters, which in UTF mode may - be different from the number of data units. The fourth argument should - point to an int variable. A non-negative value is a lower bound to the - length of any matching string. There may not be any strings of that - length that do actually match, but every string that does match is at - least that long. - - PCRE_INFO_NAMECOUNT - PCRE_INFO_NAMEENTRYSIZE - PCRE_INFO_NAMETABLE - - PCRE supports the use of named as well as numbered capturing parenthe- - ses. The names are just an additional way of identifying the parenthe- - ses, which still acquire numbers. Several convenience functions such as - pcre_get_named_substring() are provided for extracting captured sub- - strings by name. It is also possible to extract the data directly, by - first converting the name to a number in order to access the correct - pointers in the output vector (described with pcre_exec() below). To do - the conversion, you need to use the name-to-number map, which is - described by these three values. - - The map consists of a number of fixed-size entries. PCRE_INFO_NAMECOUNT - gives the number of entries, and PCRE_INFO_NAMEENTRYSIZE gives the size - of each entry; both of these return an int value. The entry size - depends on the length of the longest name. PCRE_INFO_NAMETABLE returns - a pointer to the first entry of the table. This is a pointer to char in - the 8-bit library, where the first two bytes of each entry are the num- - ber of the capturing parenthesis, most significant byte first. In the - 16-bit library, the pointer points to 16-bit data units, the first of - which contains the parenthesis number. In the 32-bit library, the - pointer points to 32-bit data units, the first of which contains the - parenthesis number. The rest of the entry is the corresponding name, - zero terminated. - - The names are in alphabetical order. If (?| is used to create multiple - groups with the same number, as described in the section on duplicate - subpattern numbers in the pcrepattern page, the groups may be given the - same name, but there is only one entry in the table. Different names - for groups of the same number are not permitted. Duplicate names for - subpatterns with different numbers are permitted, but only if PCRE_DUP- - NAMES is set. They appear in the table in the order in which they were - found in the pattern. In the absence of (?| this is the order of - increasing number; when (?| is used this is not necessarily the case - because later subpatterns may have lower numbers. - - As a simple example of the name/number table, consider the following - pattern after compilation by the 8-bit library (assume PCRE_EXTENDED is - set, so white space - including newlines - is ignored): - - (? (?(\d\d)?\d\d) - - (?\d\d) - (?\d\d) ) - - There are four named subpatterns, so the table has four entries, and - each entry in the table is eight bytes long. The table is as follows, - with non-printing bytes shows in hexadecimal, and undefined bytes shown - as ??: - - 00 01 d a t e 00 ?? - 00 05 d a y 00 ?? ?? - 00 04 m o n t h 00 - 00 02 y e a r 00 ?? - - When writing code to extract data from named subpatterns using the - name-to-number map, remember that the length of the entries is likely - to be different for each compiled pattern. - - PCRE_INFO_OKPARTIAL - - Return 1 if the pattern can be used for partial matching with - pcre_exec(), otherwise 0. The fourth argument should point to an int - variable. From release 8.00, this always returns 1, because the - restrictions that previously applied to partial matching have been - lifted. The pcrepartial documentation gives details of partial match- - ing. - - PCRE_INFO_OPTIONS - - Return a copy of the options with which the pattern was compiled. The - fourth argument should point to an unsigned long int variable. These - option bits are those specified in the call to pcre_compile(), modified - by any top-level option settings at the start of the pattern itself. In - other words, they are the options that will be in force when matching - starts. For example, if the pattern /(?im)abc(?-i)d/ is compiled with - the PCRE_EXTENDED option, the result is PCRE_CASELESS, PCRE_MULTILINE, - and PCRE_EXTENDED. - - A pattern is automatically anchored by PCRE if all of its top-level - alternatives begin with one of the following: - - ^ unless PCRE_MULTILINE is set - \A always - \G always - .* if PCRE_DOTALL is set and there are no back - references to the subpattern in which .* appears - - For such patterns, the PCRE_ANCHORED bit is set in the options returned - by pcre_fullinfo(). - - PCRE_INFO_RECURSIONLIMIT - - If the pattern set a recursion limit by including an item of the form - (*LIMIT_RECURSION=nnnn) at the start, the value is returned. The fourth - argument should point to an unsigned 32-bit integer. If no such value - has been set, the call to pcre_fullinfo() returns the error - PCRE_ERROR_UNSET. - - PCRE_INFO_SIZE - - Return the size of the compiled pattern in bytes (for all three - libraries). The fourth argument should point to a size_t variable. This - value does not include the size of the pcre structure that is returned - by pcre_compile(). The value that is passed as the argument to - pcre_malloc() when pcre_compile() is getting memory in which to place - the compiled data is the value returned by this option plus the size of - the pcre structure. Studying a compiled pattern, with or without JIT, - does not alter the value returned by this option. - - PCRE_INFO_STUDYSIZE - - Return the size in bytes (for all three libraries) of the data block - pointed to by the study_data field in a pcre_extra block. If pcre_extra - is NULL, or there is no study data, zero is returned. The fourth argu- - ment should point to a size_t variable. The study_data field is set by - pcre_study() to record information that will speed up matching (see the - section entitled "Studying a pattern" above). The format of the - study_data block is private, but its length is made available via this - option so that it can be saved and restored (see the pcreprecompile - documentation for details). - - PCRE_INFO_REQUIREDCHARFLAGS - - Returns 1 if there is a rightmost literal data unit that must exist in - any matched string, other than at its start. The fourth argument should - point to an int variable. If there is no such value, 0 is returned. If - returning 1, the character value itself can be retrieved using - PCRE_INFO_REQUIREDCHAR. - - For anchored patterns, a last literal value is recorded only if it fol- - lows something of variable length. For example, for the pattern - /^a\d+z\d+/ the returned value 1 (with "z" returned from - PCRE_INFO_REQUIREDCHAR), but for /^a\dz\d/ the returned value is 0. - - PCRE_INFO_REQUIREDCHAR - - Return the value of the rightmost literal data unit that must exist in - any matched string, other than at its start, if such a value has been - recorded. The fourth argument should point to an uint32_t variable. If - there is no such value, 0 is returned. - - -REFERENCE COUNTS - - int pcre_refcount(pcre *code, int adjust); - - The pcre_refcount() function is used to maintain a reference count in - the data block that contains a compiled pattern. It is provided for the - benefit of applications that operate in an object-oriented manner, - where different parts of the application may be using the same compiled - pattern, but you want to free the block when they are all done. - - When a pattern is compiled, the reference count field is initialized to - zero. It is changed only by calling this function, whose action is to - add the adjust value (which may be positive or negative) to it. The - yield of the function is the new value. However, the value of the count - is constrained to lie between 0 and 65535, inclusive. If the new value - is outside these limits, it is forced to the appropriate limit value. - - Except when it is zero, the reference count is not correctly preserved - if a pattern is compiled on one host and then transferred to a host - whose byte-order is different. (This seems a highly unlikely scenario.) - - -MATCHING A PATTERN: THE TRADITIONAL FUNCTION - - int pcre_exec(const pcre *code, const pcre_extra *extra, - const char *subject, int length, int startoffset, - int options, int *ovector, int ovecsize); - - The function pcre_exec() is called to match a subject string against a - compiled pattern, which is passed in the code argument. If the pattern - was studied, the result of the study should be passed in the extra - argument. You can call pcre_exec() with the same code and extra argu- - ments as many times as you like, in order to match different subject - strings with the same pattern. - - This function is the main matching facility of the library, and it - operates in a Perl-like manner. For specialist use there is also an - alternative matching function, which is described below in the section - about the pcre_dfa_exec() function. - - In most applications, the pattern will have been compiled (and option- - ally studied) in the same process that calls pcre_exec(). However, it - is possible to save compiled patterns and study data, and then use them - later in different processes, possibly even on different hosts. For a - discussion about this, see the pcreprecompile documentation. - - Here is an example of a simple call to pcre_exec(): - - int rc; - int ovector[30]; - rc = pcre_exec( - re, /* result of pcre_compile() */ - NULL, /* we didn't study the pattern */ - "some string", /* the subject string */ - 11, /* the length of the subject string */ - 0, /* start at offset 0 in the subject */ - 0, /* default options */ - ovector, /* vector of integers for substring information */ - 30); /* number of elements (NOT size in bytes) */ - - Extra data for pcre_exec() - - If the extra argument is not NULL, it must point to a pcre_extra data - block. The pcre_study() function returns such a block (when it doesn't - return NULL), but you can also create one for yourself, and pass addi- - tional information in it. The pcre_extra block contains the following - fields (not necessarily in this order): - - unsigned long int flags; - void *study_data; - void *executable_jit; - unsigned long int match_limit; - unsigned long int match_limit_recursion; - void *callout_data; - const unsigned char *tables; - unsigned char **mark; - - In the 16-bit version of this structure, the mark field has type - "PCRE_UCHAR16 **". - - In the 32-bit version of this structure, the mark field has type - "PCRE_UCHAR32 **". - - The flags field is used to specify which of the other fields are set. - The flag bits are: - - PCRE_EXTRA_CALLOUT_DATA - PCRE_EXTRA_EXECUTABLE_JIT - PCRE_EXTRA_MARK - PCRE_EXTRA_MATCH_LIMIT - PCRE_EXTRA_MATCH_LIMIT_RECURSION - PCRE_EXTRA_STUDY_DATA - PCRE_EXTRA_TABLES - - Other flag bits should be set to zero. The study_data field and some- - times the executable_jit field are set in the pcre_extra block that is - returned by pcre_study(), together with the appropriate flag bits. You - should not set these yourself, but you may add to the block by setting - other fields and their corresponding flag bits. - - The match_limit field provides a means of preventing PCRE from using up - a vast amount of resources when running patterns that are not going to - match, but which have a very large number of possibilities in their - search trees. The classic example is a pattern that uses nested unlim- - ited repeats. - - Internally, pcre_exec() uses a function called match(), which it calls - repeatedly (sometimes recursively). The limit set by match_limit is - imposed on the number of times this function is called during a match, - which has the effect of limiting the amount of backtracking that can - take place. For patterns that are not anchored, the count restarts from - zero for each position in the subject string. - - When pcre_exec() is called with a pattern that was successfully studied - with a JIT option, the way that the matching is executed is entirely - different. However, there is still the possibility of runaway matching - that goes on for a very long time, and so the match_limit value is also - used in this case (but in a different way) to limit how long the match- - ing can continue. - - The default value for the limit can be set when PCRE is built; the - default default is 10 million, which handles all but the most extreme - cases. You can override the default by suppling pcre_exec() with a - pcre_extra block in which match_limit is set, and - PCRE_EXTRA_MATCH_LIMIT is set in the flags field. If the limit is - exceeded, pcre_exec() returns PCRE_ERROR_MATCHLIMIT. - - A value for the match limit may also be supplied by an item at the - start of a pattern of the form - - (*LIMIT_MATCH=d) - - where d is a decimal number. However, such a setting is ignored unless - d is less than the limit set by the caller of pcre_exec() or, if no - such limit is set, less than the default. - - The match_limit_recursion field is similar to match_limit, but instead - of limiting the total number of times that match() is called, it limits - the depth of recursion. The recursion depth is a smaller number than - the total number of calls, because not all calls to match() are recur- - sive. This limit is of use only if it is set smaller than match_limit. - - Limiting the recursion depth limits the amount of machine stack that - can be used, or, when PCRE has been compiled to use memory on the heap - instead of the stack, the amount of heap memory that can be used. This - limit is not relevant, and is ignored, when matching is done using JIT - compiled code. - - The default value for match_limit_recursion can be set when PCRE is - built; the default default is the same value as the default for - match_limit. You can override the default by suppling pcre_exec() with - a pcre_extra block in which match_limit_recursion is set, and - PCRE_EXTRA_MATCH_LIMIT_RECURSION is set in the flags field. If the - limit is exceeded, pcre_exec() returns PCRE_ERROR_RECURSIONLIMIT. - - A value for the recursion limit may also be supplied by an item at the - start of a pattern of the form - - (*LIMIT_RECURSION=d) - - where d is a decimal number. However, such a setting is ignored unless - d is less than the limit set by the caller of pcre_exec() or, if no - such limit is set, less than the default. - - The callout_data field is used in conjunction with the "callout" fea- - ture, and is described in the pcrecallout documentation. - - The tables field is provided for use with patterns that have been pre- - compiled using custom character tables, saved to disc or elsewhere, and - then reloaded, because the tables that were used to compile a pattern - are not saved with it. See the pcreprecompile documentation for a dis- - cussion of saving compiled patterns for later use. If NULL is passed - using this mechanism, it forces PCRE's internal tables to be used. - - Warning: The tables that pcre_exec() uses must be the same as those - that were used when the pattern was compiled. If this is not the case, - the behaviour of pcre_exec() is undefined. Therefore, when a pattern is - compiled and matched in the same process, this field should never be - set. In this (the most common) case, the correct table pointer is auto- - matically passed with the compiled pattern from pcre_compile() to - pcre_exec(). - - If PCRE_EXTRA_MARK is set in the flags field, the mark field must be - set to point to a suitable variable. If the pattern contains any back- - tracking control verbs such as (*MARK:NAME), and the execution ends up - with a name to pass back, a pointer to the name string (zero termi- - nated) is placed in the variable pointed to by the mark field. The - names are within the compiled pattern; if you wish to retain such a - name you must copy it before freeing the memory of a compiled pattern. - If there is no name to pass back, the variable pointed to by the mark - field is set to NULL. For details of the backtracking control verbs, - see the section entitled "Backtracking control" in the pcrepattern doc- - umentation. - - Option bits for pcre_exec() - - The unused bits of the options argument for pcre_exec() must be zero. - The only bits that may be set are PCRE_ANCHORED, PCRE_NEWLINE_xxx, - PCRE_NOTBOL, PCRE_NOTEOL, PCRE_NOTEMPTY, PCRE_NOTEMPTY_ATSTART, - PCRE_NO_START_OPTIMIZE, PCRE_NO_UTF8_CHECK, PCRE_PARTIAL_HARD, and - PCRE_PARTIAL_SOFT. - - If the pattern was successfully studied with one of the just-in-time - (JIT) compile options, the only supported options for JIT execution are - PCRE_NO_UTF8_CHECK, PCRE_NOTBOL, PCRE_NOTEOL, PCRE_NOTEMPTY, - PCRE_NOTEMPTY_ATSTART, PCRE_PARTIAL_HARD, and PCRE_PARTIAL_SOFT. If an - unsupported option is used, JIT execution is disabled and the normal - interpretive code in pcre_exec() is run. - - PCRE_ANCHORED - - The PCRE_ANCHORED option limits pcre_exec() to matching at the first - matching position. If a pattern was compiled with PCRE_ANCHORED, or - turned out to be anchored by virtue of its contents, it cannot be made - unachored at matching time. - - PCRE_BSR_ANYCRLF - PCRE_BSR_UNICODE - - These options (which are mutually exclusive) control what the \R escape - sequence matches. The choice is either to match only CR, LF, or CRLF, - or to match any Unicode newline sequence. These options override the - choice that was made or defaulted when the pattern was compiled. - - PCRE_NEWLINE_CR - PCRE_NEWLINE_LF - PCRE_NEWLINE_CRLF - PCRE_NEWLINE_ANYCRLF - PCRE_NEWLINE_ANY - - These options override the newline definition that was chosen or - defaulted when the pattern was compiled. For details, see the descrip- - tion of pcre_compile() above. During matching, the newline choice - affects the behaviour of the dot, circumflex, and dollar metacharac- - ters. It may also alter the way the match position is advanced after a - match failure for an unanchored pattern. - - When PCRE_NEWLINE_CRLF, PCRE_NEWLINE_ANYCRLF, or PCRE_NEWLINE_ANY is - set, and a match attempt for an unanchored pattern fails when the cur- - rent position is at a CRLF sequence, and the pattern contains no - explicit matches for CR or LF characters, the match position is - advanced by two characters instead of one, in other words, to after the - CRLF. - - The above rule is a compromise that makes the most common cases work as - expected. For example, if the pattern is .+A (and the PCRE_DOTALL - option is not set), it does not match the string "\r\nA" because, after - failing at the start, it skips both the CR and the LF before retrying. - However, the pattern [\r\n]A does match that string, because it con- - tains an explicit CR or LF reference, and so advances only by one char- - acter after the first failure. - - An explicit match for CR of LF is either a literal appearance of one of - those characters, or one of the \r or \n escape sequences. Implicit - matches such as [^X] do not count, nor does \s (which includes CR and - LF in the characters that it matches). - - Notwithstanding the above, anomalous effects may still occur when CRLF - is a valid newline sequence and explicit \r or \n escapes appear in the - pattern. - - PCRE_NOTBOL - - This option specifies that first character of the subject string is not - the beginning of a line, so the circumflex metacharacter should not - match before it. Setting this without PCRE_MULTILINE (at compile time) - causes circumflex never to match. This option affects only the behav- - iour of the circumflex metacharacter. It does not affect \A. - - PCRE_NOTEOL - - This option specifies that the end of the subject string is not the end - of a line, so the dollar metacharacter should not match it nor (except - in multiline mode) a newline immediately before it. Setting this with- - out PCRE_MULTILINE (at compile time) causes dollar never to match. This - option affects only the behaviour of the dollar metacharacter. It does - not affect \Z or \z. - - PCRE_NOTEMPTY - - An empty string is not considered to be a valid match if this option is - set. If there are alternatives in the pattern, they are tried. If all - the alternatives match the empty string, the entire match fails. For - example, if the pattern - - a?b? - - is applied to a string not beginning with "a" or "b", it matches an - empty string at the start of the subject. With PCRE_NOTEMPTY set, this - match is not valid, so PCRE searches further into the string for occur- - rences of "a" or "b". - - PCRE_NOTEMPTY_ATSTART - - This is like PCRE_NOTEMPTY, except that an empty string match that is - not at the start of the subject is permitted. If the pattern is - anchored, such a match can occur only if the pattern contains \K. - - Perl has no direct equivalent of PCRE_NOTEMPTY or - PCRE_NOTEMPTY_ATSTART, but it does make a special case of a pattern - match of the empty string within its split() function, and when using - the /g modifier. It is possible to emulate Perl's behaviour after - matching a null string by first trying the match again at the same off- - set with PCRE_NOTEMPTY_ATSTART and PCRE_ANCHORED, and then if that - fails, by advancing the starting offset (see below) and trying an ordi- - nary match again. There is some code that demonstrates how to do this - in the pcredemo sample program. In the most general case, you have to - check to see if the newline convention recognizes CRLF as a newline, - and if so, and the current character is CR followed by LF, advance the - starting offset by two characters instead of one. - - PCRE_NO_START_OPTIMIZE - - There are a number of optimizations that pcre_exec() uses at the start - of a match, in order to speed up the process. For example, if it is - known that an unanchored match must start with a specific character, it - searches the subject for that character, and fails immediately if it - cannot find it, without actually running the main matching function. - This means that a special item such as (*COMMIT) at the start of a pat- - tern is not considered until after a suitable starting point for the - match has been found. Also, when callouts or (*MARK) items are in use, - these "start-up" optimizations can cause them to be skipped if the pat- - tern is never actually used. The start-up optimizations are in effect a - pre-scan of the subject that takes place before the pattern is run. - - The PCRE_NO_START_OPTIMIZE option disables the start-up optimizations, - possibly causing performance to suffer, but ensuring that in cases - where the result is "no match", the callouts do occur, and that items - such as (*COMMIT) and (*MARK) are considered at every possible starting - position in the subject string. If PCRE_NO_START_OPTIMIZE is set at - compile time, it cannot be unset at matching time. The use of - PCRE_NO_START_OPTIMIZE at matching time (that is, passing it to - pcre_exec()) disables JIT execution; in this situation, matching is - always done using interpretively. - - Setting PCRE_NO_START_OPTIMIZE can change the outcome of a matching - operation. Consider the pattern - - (*COMMIT)ABC - - When this is compiled, PCRE records the fact that a match must start - with the character "A". Suppose the subject string is "DEFABC". The - start-up optimization scans along the subject, finds "A" and runs the - first match attempt from there. The (*COMMIT) item means that the pat- - tern must match the current starting position, which in this case, it - does. However, if the same match is run with PCRE_NO_START_OPTIMIZE - set, the initial scan along the subject string does not happen. The - first match attempt is run starting from "D" and when this fails, - (*COMMIT) prevents any further matches being tried, so the overall - result is "no match". If the pattern is studied, more start-up opti- - mizations may be used. For example, a minimum length for the subject - may be recorded. Consider the pattern - - (*MARK:A)(X|Y) - - The minimum length for a match is one character. If the subject is - "ABC", there will be attempts to match "ABC", "BC", "C", and then - finally an empty string. If the pattern is studied, the final attempt - does not take place, because PCRE knows that the subject is too short, - and so the (*MARK) is never encountered. In this case, studying the - pattern does not affect the overall match result, which is still "no - match", but it does affect the auxiliary information that is returned. - - PCRE_NO_UTF8_CHECK - - When PCRE_UTF8 is set at compile time, the validity of the subject as a - UTF-8 string is automatically checked when pcre_exec() is subsequently - called. The entire string is checked before any other processing takes - place. The value of startoffset is also checked to ensure that it - points to the start of a UTF-8 character. There is a discussion about - the validity of UTF-8 strings in the pcreunicode page. If an invalid - sequence of bytes is found, pcre_exec() returns the error - PCRE_ERROR_BADUTF8 or, if PCRE_PARTIAL_HARD is set and the problem is a - truncated character at the end of the subject, PCRE_ERROR_SHORTUTF8. In - both cases, information about the precise nature of the error may also - be returned (see the descriptions of these errors in the section enti- - tled Error return values from pcre_exec() below). If startoffset con- - tains a value that does not point to the start of a UTF-8 character (or - to the end of the subject), PCRE_ERROR_BADUTF8_OFFSET is returned. - - If you already know that your subject is valid, and you want to skip - these checks for performance reasons, you can set the - PCRE_NO_UTF8_CHECK option when calling pcre_exec(). You might want to - do this for the second and subsequent calls to pcre_exec() if you are - making repeated calls to find all the matches in a single subject - string. However, you should be sure that the value of startoffset - points to the start of a character (or the end of the subject). When - PCRE_NO_UTF8_CHECK is set, the effect of passing an invalid string as a - subject or an invalid value of startoffset is undefined. Your program - may crash or loop. - - PCRE_PARTIAL_HARD - PCRE_PARTIAL_SOFT - - These options turn on the partial matching feature. For backwards com- - patibility, PCRE_PARTIAL is a synonym for PCRE_PARTIAL_SOFT. A partial - match occurs if the end of the subject string is reached successfully, - but there are not enough subject characters to complete the match. If - this happens when PCRE_PARTIAL_SOFT (but not PCRE_PARTIAL_HARD) is set, - matching continues by testing any remaining alternatives. Only if no - complete match can be found is PCRE_ERROR_PARTIAL returned instead of - PCRE_ERROR_NOMATCH. In other words, PCRE_PARTIAL_SOFT says that the - caller is prepared to handle a partial match, but only if no complete - match can be found. - - If PCRE_PARTIAL_HARD is set, it overrides PCRE_PARTIAL_SOFT. In this - case, if a partial match is found, pcre_exec() immediately returns - PCRE_ERROR_PARTIAL, without considering any other alternatives. In - other words, when PCRE_PARTIAL_HARD is set, a partial match is consid- - ered to be more important that an alternative complete match. - - In both cases, the portion of the string that was inspected when the - partial match was found is set as the first matching string. There is a - more detailed discussion of partial and multi-segment matching, with - examples, in the pcrepartial documentation. - - The string to be matched by pcre_exec() - - The subject string is passed to pcre_exec() as a pointer in subject, a - length in length, and a starting offset in startoffset. The units for - length and startoffset are bytes for the 8-bit library, 16-bit data - items for the 16-bit library, and 32-bit data items for the 32-bit - library. - - If startoffset is negative or greater than the length of the subject, - pcre_exec() returns PCRE_ERROR_BADOFFSET. When the starting offset is - zero, the search for a match starts at the beginning of the subject, - and this is by far the most common case. In UTF-8 or UTF-16 mode, the - offset must point to the start of a character, or the end of the sub- - ject (in UTF-32 mode, one data unit equals one character, so all off- - sets are valid). Unlike the pattern string, the subject may contain - binary zeroes. - - A non-zero starting offset is useful when searching for another match - in the same subject by calling pcre_exec() again after a previous suc- - cess. Setting startoffset differs from just passing over a shortened - string and setting PCRE_NOTBOL in the case of a pattern that begins - with any kind of lookbehind. For example, consider the pattern - - \Biss\B - - which finds occurrences of "iss" in the middle of words. (\B matches - only if the current position in the subject is not a word boundary.) - When applied to the string "Mississipi" the first call to pcre_exec() - finds the first occurrence. If pcre_exec() is called again with just - the remainder of the subject, namely "issipi", it does not match, - because \B is always false at the start of the subject, which is deemed - to be a word boundary. However, if pcre_exec() is passed the entire - string again, but with startoffset set to 4, it finds the second occur- - rence of "iss" because it is able to look behind the starting point to - discover that it is preceded by a letter. - - Finding all the matches in a subject is tricky when the pattern can - match an empty string. It is possible to emulate Perl's /g behaviour by - first trying the match again at the same offset, with the - PCRE_NOTEMPTY_ATSTART and PCRE_ANCHORED options, and then if that - fails, advancing the starting offset and trying an ordinary match - again. There is some code that demonstrates how to do this in the pcre- - demo sample program. In the most general case, you have to check to see - if the newline convention recognizes CRLF as a newline, and if so, and - the current character is CR followed by LF, advance the starting offset - by two characters instead of one. - - If a non-zero starting offset is passed when the pattern is anchored, - one attempt to match at the given offset is made. This can only succeed - if the pattern does not require the match to be at the start of the - subject. - - How pcre_exec() returns captured substrings - - In general, a pattern matches a certain portion of the subject, and in - addition, further substrings from the subject may be picked out by - parts of the pattern. Following the usage in Jeffrey Friedl's book, - this is called "capturing" in what follows, and the phrase "capturing - subpattern" is used for a fragment of a pattern that picks out a sub- - string. PCRE supports several other kinds of parenthesized subpattern - that do not cause substrings to be captured. - - Captured substrings are returned to the caller via a vector of integers - whose address is passed in ovector. The number of elements in the vec- - tor is passed in ovecsize, which must be a non-negative number. Note: - this argument is NOT the size of ovector in bytes. - - The first two-thirds of the vector is used to pass back captured sub- - strings, each substring using a pair of integers. The remaining third - of the vector is used as workspace by pcre_exec() while matching cap- - turing subpatterns, and is not available for passing back information. - The number passed in ovecsize should always be a multiple of three. If - it is not, it is rounded down. - - When a match is successful, information about captured substrings is - returned in pairs of integers, starting at the beginning of ovector, - and continuing up to two-thirds of its length at the most. The first - element of each pair is set to the offset of the first character in a - substring, and the second is set to the offset of the first character - after the end of a substring. These values are always data unit off- - sets, even in UTF mode. They are byte offsets in the 8-bit library, - 16-bit data item offsets in the 16-bit library, and 32-bit data item - offsets in the 32-bit library. Note: they are not character counts. - - The first pair of integers, ovector[0] and ovector[1], identify the - portion of the subject string matched by the entire pattern. The next - pair is used for the first capturing subpattern, and so on. The value - returned by pcre_exec() is one more than the highest numbered pair that - has been set. For example, if two substrings have been captured, the - returned value is 3. If there are no capturing subpatterns, the return - value from a successful match is 1, indicating that just the first pair - of offsets has been set. - - If a capturing subpattern is matched repeatedly, it is the last portion - of the string that it matched that is returned. - - If the vector is too small to hold all the captured substring offsets, - it is used as far as possible (up to two-thirds of its length), and the - function returns a value of zero. If neither the actual string matched - nor any captured substrings are of interest, pcre_exec() may be called - with ovector passed as NULL and ovecsize as zero. However, if the pat- - tern contains back references and the ovector is not big enough to - remember the related substrings, PCRE has to get additional memory for - use during matching. Thus it is usually advisable to supply an ovector - of reasonable size. - - There are some cases where zero is returned (indicating vector over- - flow) when in fact the vector is exactly the right size for the final - match. For example, consider the pattern - - (a)(?:(b)c|bd) - - If a vector of 6 elements (allowing for only 1 captured substring) is - given with subject string "abd", pcre_exec() will try to set the second - captured string, thereby recording a vector overflow, before failing to - match "c" and backing up to try the second alternative. The zero - return, however, does correctly indicate that the maximum number of - slots (namely 2) have been filled. In similar cases where there is tem- - porary overflow, but the final number of used slots is actually less - than the maximum, a non-zero value is returned. - - The pcre_fullinfo() function can be used to find out how many capturing - subpatterns there are in a compiled pattern. The smallest size for - ovector that will allow for n captured substrings, in addition to the - offsets of the substring matched by the whole pattern, is (n+1)*3. - - It is possible for capturing subpattern number n+1 to match some part - of the subject when subpattern n has not been used at all. For example, - if the string "abc" is matched against the pattern (a|(z))(bc) the - return from the function is 4, and subpatterns 1 and 3 are matched, but - 2 is not. When this happens, both values in the offset pairs corre- - sponding to unused subpatterns are set to -1. - - Offset values that correspond to unused subpatterns at the end of the - expression are also set to -1. For example, if the string "abc" is - matched against the pattern (abc)(x(yz)?)? subpatterns 2 and 3 are not - matched. The return from the function is 2, because the highest used - capturing subpattern number is 1, and the offsets for for the second - and third capturing subpatterns (assuming the vector is large enough, - of course) are set to -1. - - Note: Elements in the first two-thirds of ovector that do not corre- - spond to capturing parentheses in the pattern are never changed. That - is, if a pattern contains n capturing parentheses, no more than ovec- - tor[0] to ovector[2n+1] are set by pcre_exec(). The other elements (in - the first two-thirds) retain whatever values they previously had. - - Some convenience functions are provided for extracting the captured - substrings as separate strings. These are described below. - - Error return values from pcre_exec() - - If pcre_exec() fails, it returns a negative number. The following are - defined in the header file: - - PCRE_ERROR_NOMATCH (-1) - - The subject string did not match the pattern. - - PCRE_ERROR_NULL (-2) - - Either code or subject was passed as NULL, or ovector was NULL and - ovecsize was not zero. - - PCRE_ERROR_BADOPTION (-3) - - An unrecognized bit was set in the options argument. - - PCRE_ERROR_BADMAGIC (-4) - - PCRE stores a 4-byte "magic number" at the start of the compiled code, - to catch the case when it is passed a junk pointer and to detect when a - pattern that was compiled in an environment of one endianness is run in - an environment with the other endianness. This is the error that PCRE - gives when the magic number is not present. - - PCRE_ERROR_UNKNOWN_OPCODE (-5) - - While running the pattern match, an unknown item was encountered in the - compiled pattern. This error could be caused by a bug in PCRE or by - overwriting of the compiled pattern. - - PCRE_ERROR_NOMEMORY (-6) - - If a pattern contains back references, but the ovector that is passed - to pcre_exec() is not big enough to remember the referenced substrings, - PCRE gets a block of memory at the start of matching to use for this - purpose. If the call via pcre_malloc() fails, this error is given. The - memory is automatically freed at the end of matching. - - This error is also given if pcre_stack_malloc() fails in pcre_exec(). - This can happen only when PCRE has been compiled with --disable-stack- - for-recursion. - - PCRE_ERROR_NOSUBSTRING (-7) - - This error is used by the pcre_copy_substring(), pcre_get_substring(), - and pcre_get_substring_list() functions (see below). It is never - returned by pcre_exec(). - - PCRE_ERROR_MATCHLIMIT (-8) - - The backtracking limit, as specified by the match_limit field in a - pcre_extra structure (or defaulted) was reached. See the description - above. - - PCRE_ERROR_CALLOUT (-9) - - This error is never generated by pcre_exec() itself. It is provided for - use by callout functions that want to yield a distinctive error code. - See the pcrecallout documentation for details. - - PCRE_ERROR_BADUTF8 (-10) - - A string that contains an invalid UTF-8 byte sequence was passed as a - subject, and the PCRE_NO_UTF8_CHECK option was not set. If the size of - the output vector (ovecsize) is at least 2, the byte offset to the - start of the the invalid UTF-8 character is placed in the first ele- - ment, and a reason code is placed in the second element. The reason - codes are listed in the following section. For backward compatibility, - if PCRE_PARTIAL_HARD is set and the problem is a truncated UTF-8 char- - acter at the end of the subject (reason codes 1 to 5), - PCRE_ERROR_SHORTUTF8 is returned instead of PCRE_ERROR_BADUTF8. - - PCRE_ERROR_BADUTF8_OFFSET (-11) - - The UTF-8 byte sequence that was passed as a subject was checked and - found to be valid (the PCRE_NO_UTF8_CHECK option was not set), but the - value of startoffset did not point to the beginning of a UTF-8 charac- - ter or the end of the subject. - - PCRE_ERROR_PARTIAL (-12) - - The subject string did not match, but it did match partially. See the - pcrepartial documentation for details of partial matching. - - PCRE_ERROR_BADPARTIAL (-13) - - This code is no longer in use. It was formerly returned when the - PCRE_PARTIAL option was used with a compiled pattern containing items - that were not supported for partial matching. From release 8.00 - onwards, there are no restrictions on partial matching. - - PCRE_ERROR_INTERNAL (-14) - - An unexpected internal error has occurred. This error could be caused - by a bug in PCRE or by overwriting of the compiled pattern. - - PCRE_ERROR_BADCOUNT (-15) - - This error is given if the value of the ovecsize argument is negative. - - PCRE_ERROR_RECURSIONLIMIT (-21) - - The internal recursion limit, as specified by the match_limit_recursion - field in a pcre_extra structure (or defaulted) was reached. See the - description above. - - PCRE_ERROR_BADNEWLINE (-23) - - An invalid combination of PCRE_NEWLINE_xxx options was given. - - PCRE_ERROR_BADOFFSET (-24) - - The value of startoffset was negative or greater than the length of the - subject, that is, the value in length. - - PCRE_ERROR_SHORTUTF8 (-25) - - This error is returned instead of PCRE_ERROR_BADUTF8 when the subject - string ends with a truncated UTF-8 character and the PCRE_PARTIAL_HARD - option is set. Information about the failure is returned as for - PCRE_ERROR_BADUTF8. It is in fact sufficient to detect this case, but - this special error code for PCRE_PARTIAL_HARD precedes the implementa- - tion of returned information; it is retained for backwards compatibil- - ity. - - PCRE_ERROR_RECURSELOOP (-26) - - This error is returned when pcre_exec() detects a recursion loop within - the pattern. Specifically, it means that either the whole pattern or a - subpattern has been called recursively for the second time at the same - position in the subject string. Some simple patterns that might do this - are detected and faulted at compile time, but more complicated cases, - in particular mutual recursions between two different subpatterns, can- - not be detected until run time. - - PCRE_ERROR_JIT_STACKLIMIT (-27) - - This error is returned when a pattern that was successfully studied - using a JIT compile option is being matched, but the memory available - for the just-in-time processing stack is not large enough. See the - pcrejit documentation for more details. - - PCRE_ERROR_BADMODE (-28) - - This error is given if a pattern that was compiled by the 8-bit library - is passed to a 16-bit or 32-bit library function, or vice versa. - - PCRE_ERROR_BADENDIANNESS (-29) - - This error is given if a pattern that was compiled and saved is - reloaded on a host with different endianness. The utility function - pcre_pattern_to_host_byte_order() can be used to convert such a pattern - so that it runs on the new host. - - PCRE_ERROR_JIT_BADOPTION - - This error is returned when a pattern that was successfully studied - using a JIT compile option is being matched, but the matching mode - (partial or complete match) does not correspond to any JIT compilation - mode. When the JIT fast path function is used, this error may be also - given for invalid options. See the pcrejit documentation for more - details. - - PCRE_ERROR_BADLENGTH (-32) - - This error is given if pcre_exec() is called with a negative value for - the length argument. - - Error numbers -16 to -20, -22, and 30 are not used by pcre_exec(). - - Reason codes for invalid UTF-8 strings - - This section applies only to the 8-bit library. The corresponding - information for the 16-bit and 32-bit libraries is given in the pcre16 - and pcre32 pages. - - When pcre_exec() returns either PCRE_ERROR_BADUTF8 or PCRE_ERROR_SHORT- - UTF8, and the size of the output vector (ovecsize) is at least 2, the - offset of the start of the invalid UTF-8 character is placed in the - first output vector element (ovector[0]) and a reason code is placed in - the second element (ovector[1]). The reason codes are given names in - the pcre.h header file: - - PCRE_UTF8_ERR1 - PCRE_UTF8_ERR2 - PCRE_UTF8_ERR3 - PCRE_UTF8_ERR4 - PCRE_UTF8_ERR5 - - The string ends with a truncated UTF-8 character; the code specifies - how many bytes are missing (1 to 5). Although RFC 3629 restricts UTF-8 - characters to be no longer than 4 bytes, the encoding scheme (origi- - nally defined by RFC 2279) allows for up to 6 bytes, and this is - checked first; hence the possibility of 4 or 5 missing bytes. - - PCRE_UTF8_ERR6 - PCRE_UTF8_ERR7 - PCRE_UTF8_ERR8 - PCRE_UTF8_ERR9 - PCRE_UTF8_ERR10 - - The two most significant bits of the 2nd, 3rd, 4th, 5th, or 6th byte of - the character do not have the binary value 0b10 (that is, either the - most significant bit is 0, or the next bit is 1). - - PCRE_UTF8_ERR11 - PCRE_UTF8_ERR12 - - A character that is valid by the RFC 2279 rules is either 5 or 6 bytes - long; these code points are excluded by RFC 3629. - - PCRE_UTF8_ERR13 - - A 4-byte character has a value greater than 0x10fff; these code points - are excluded by RFC 3629. - - PCRE_UTF8_ERR14 - - A 3-byte character has a value in the range 0xd800 to 0xdfff; this - range of code points are reserved by RFC 3629 for use with UTF-16, and - so are excluded from UTF-8. - - PCRE_UTF8_ERR15 - PCRE_UTF8_ERR16 - PCRE_UTF8_ERR17 - PCRE_UTF8_ERR18 - PCRE_UTF8_ERR19 - - A 2-, 3-, 4-, 5-, or 6-byte character is "overlong", that is, it codes - for a value that can be represented by fewer bytes, which is invalid. - For example, the two bytes 0xc0, 0xae give the value 0x2e, whose cor- - rect coding uses just one byte. - - PCRE_UTF8_ERR20 - - The two most significant bits of the first byte of a character have the - binary value 0b10 (that is, the most significant bit is 1 and the sec- - ond is 0). Such a byte can only validly occur as the second or subse- - quent byte of a multi-byte character. - - PCRE_UTF8_ERR21 - - The first byte of a character has the value 0xfe or 0xff. These values - can never occur in a valid UTF-8 string. - - PCRE_UTF8_ERR22 - - This error code was formerly used when the presence of a so-called - "non-character" caused an error. Unicode corrigendum #9 makes it clear - that such characters should not cause a string to be rejected, and so - this code is no longer in use and is never returned. - - -EXTRACTING CAPTURED SUBSTRINGS BY NUMBER - - int pcre_copy_substring(const char *subject, int *ovector, - int stringcount, int stringnumber, char *buffer, - int buffersize); - - int pcre_get_substring(const char *subject, int *ovector, - int stringcount, int stringnumber, - const char **stringptr); - - int pcre_get_substring_list(const char *subject, - int *ovector, int stringcount, const char ***listptr); - - Captured substrings can be accessed directly by using the offsets - returned by pcre_exec() in ovector. For convenience, the functions - pcre_copy_substring(), pcre_get_substring(), and pcre_get_sub- - string_list() are provided for extracting captured substrings as new, - separate, zero-terminated strings. These functions identify substrings - by number. The next section describes functions for extracting named - substrings. - - A substring that contains a binary zero is correctly extracted and has - a further zero added on the end, but the result is not, of course, a C - string. However, you can process such a string by referring to the - length that is returned by pcre_copy_substring() and pcre_get_sub- - string(). Unfortunately, the interface to pcre_get_substring_list() is - not adequate for handling strings containing binary zeros, because the - end of the final string is not independently indicated. - - The first three arguments are the same for all three of these func- - tions: subject is the subject string that has just been successfully - matched, ovector is a pointer to the vector of integer offsets that was - passed to pcre_exec(), and stringcount is the number of substrings that - were captured by the match, including the substring that matched the - entire regular expression. This is the value returned by pcre_exec() if - it is greater than zero. If pcre_exec() returned zero, indicating that - it ran out of space in ovector, the value passed as stringcount should - be the number of elements in the vector divided by three. - - The functions pcre_copy_substring() and pcre_get_substring() extract a - single substring, whose number is given as stringnumber. A value of - zero extracts the substring that matched the entire pattern, whereas - higher values extract the captured substrings. For pcre_copy_sub- - string(), the string is placed in buffer, whose length is given by - buffersize, while for pcre_get_substring() a new block of memory is - obtained via pcre_malloc, and its address is returned via stringptr. - The yield of the function is the length of the string, not including - the terminating zero, or one of these error codes: - - PCRE_ERROR_NOMEMORY (-6) - - The buffer was too small for pcre_copy_substring(), or the attempt to - get memory failed for pcre_get_substring(). - - PCRE_ERROR_NOSUBSTRING (-7) - - There is no substring whose number is stringnumber. - - The pcre_get_substring_list() function extracts all available sub- - strings and builds a list of pointers to them. All this is done in a - single block of memory that is obtained via pcre_malloc. The address of - the memory block is returned via listptr, which is also the start of - the list of string pointers. The end of the list is marked by a NULL - pointer. The yield of the function is zero if all went well, or the - error code - - PCRE_ERROR_NOMEMORY (-6) - - if the attempt to get the memory block failed. - - When any of these functions encounter a substring that is unset, which - can happen when capturing subpattern number n+1 matches some part of - the subject, but subpattern n has not been used at all, they return an - empty string. This can be distinguished from a genuine zero-length sub- - string by inspecting the appropriate offset in ovector, which is nega- - tive for unset substrings. - - The two convenience functions pcre_free_substring() and pcre_free_sub- - string_list() can be used to free the memory returned by a previous - call of pcre_get_substring() or pcre_get_substring_list(), respec- - tively. They do nothing more than call the function pointed to by - pcre_free, which of course could be called directly from a C program. - However, PCRE is used in some situations where it is linked via a spe- - cial interface to another programming language that cannot use - pcre_free directly; it is for these cases that the functions are pro- - vided. - - -EXTRACTING CAPTURED SUBSTRINGS BY NAME - - int pcre_get_stringnumber(const pcre *code, - const char *name); - - int pcre_copy_named_substring(const pcre *code, - const char *subject, int *ovector, - int stringcount, const char *stringname, - char *buffer, int buffersize); - - int pcre_get_named_substring(const pcre *code, - const char *subject, int *ovector, - int stringcount, const char *stringname, - const char **stringptr); - - To extract a substring by name, you first have to find associated num- - ber. For example, for this pattern - - (a+)b(?\d+)... - - the number of the subpattern called "xxx" is 2. If the name is known to - be unique (PCRE_DUPNAMES was not set), you can find the number from the - name by calling pcre_get_stringnumber(). The first argument is the com- - piled pattern, and the second is the name. The yield of the function is - the subpattern number, or PCRE_ERROR_NOSUBSTRING (-7) if there is no - subpattern of that name. - - Given the number, you can extract the substring directly, or use one of - the functions described in the previous section. For convenience, there - are also two functions that do the whole job. - - Most of the arguments of pcre_copy_named_substring() and - pcre_get_named_substring() are the same as those for the similarly - named functions that extract by number. As these are described in the - previous section, they are not re-described here. There are just two - differences: - - First, instead of a substring number, a substring name is given. Sec- - ond, there is an extra argument, given at the start, which is a pointer - to the compiled pattern. This is needed in order to gain access to the - name-to-number translation table. - - These functions call pcre_get_stringnumber(), and if it succeeds, they - then call pcre_copy_substring() or pcre_get_substring(), as appropri- - ate. NOTE: If PCRE_DUPNAMES is set and there are duplicate names, the - behaviour may not be what you want (see the next section). - - Warning: If the pattern uses the (?| feature to set up multiple subpat- - terns with the same number, as described in the section on duplicate - subpattern numbers in the pcrepattern page, you cannot use names to - distinguish the different subpatterns, because names are not included - in the compiled code. The matching process uses only numbers. For this - reason, the use of different names for subpatterns of the same number - causes an error at compile time. - - -DUPLICATE SUBPATTERN NAMES - - int pcre_get_stringtable_entries(const pcre *code, - const char *name, char **first, char **last); - - When a pattern is compiled with the PCRE_DUPNAMES option, names for - subpatterns are not required to be unique. (Duplicate names are always - allowed for subpatterns with the same number, created by using the (?| - feature. Indeed, if such subpatterns are named, they are required to - use the same names.) - - Normally, patterns with duplicate names are such that in any one match, - only one of the named subpatterns participates. An example is shown in - the pcrepattern documentation. - - When duplicates are present, pcre_copy_named_substring() and - pcre_get_named_substring() return the first substring corresponding to - the given name that is set. If none are set, PCRE_ERROR_NOSUBSTRING - (-7) is returned; no data is returned. The pcre_get_stringnumber() - function returns one of the numbers that are associated with the name, - but it is not defined which it is. - - If you want to get full details of all captured substrings for a given - name, you must use the pcre_get_stringtable_entries() function. The - first argument is the compiled pattern, and the second is the name. The - third and fourth are pointers to variables which are updated by the - function. After it has run, they point to the first and last entries in - the name-to-number table for the given name. The function itself - returns the length of each entry, or PCRE_ERROR_NOSUBSTRING (-7) if - there are none. The format of the table is described above in the sec- - tion entitled Information about a pattern above. Given all the rele- - vant entries for the name, you can extract each of their numbers, and - hence the captured data, if any. - - -FINDING ALL POSSIBLE MATCHES - - The traditional matching function uses a similar algorithm to Perl, - which stops when it finds the first match, starting at a given point in - the subject. If you want to find all possible matches, or the longest - possible match, consider using the alternative matching function (see - below) instead. If you cannot use the alternative function, but still - need to find all possible matches, you can kludge it up by making use - of the callout facility, which is described in the pcrecallout documen- - tation. - - What you have to do is to insert a callout right at the end of the pat- - tern. When your callout function is called, extract and save the cur- - rent matched substring. Then return 1, which forces pcre_exec() to - backtrack and try other alternatives. Ultimately, when it runs out of - matches, pcre_exec() will yield PCRE_ERROR_NOMATCH. - - -OBTAINING AN ESTIMATE OF STACK USAGE - - Matching certain patterns using pcre_exec() can use a lot of process - stack, which in certain environments can be rather limited in size. - Some users find it helpful to have an estimate of the amount of stack - that is used by pcre_exec(), to help them set recursion limits, as - described in the pcrestack documentation. The estimate that is output - by pcretest when called with the -m and -C options is obtained by call- - ing pcre_exec with the values NULL, NULL, NULL, -999, and -999 for its - first five arguments. - - Normally, if its first argument is NULL, pcre_exec() immediately - returns the negative error code PCRE_ERROR_NULL, but with this special - combination of arguments, it returns instead a negative number whose - absolute value is the approximate stack frame size in bytes. (A nega- - tive number is used so that it is clear that no match has happened.) - The value is approximate because in some cases, recursive calls to - pcre_exec() occur when there are one or two additional variables on the - stack. - - If PCRE has been compiled to use the heap instead of the stack for - recursion, the value returned is the size of each block that is - obtained from the heap. - - -MATCHING A PATTERN: THE ALTERNATIVE FUNCTION - - int pcre_dfa_exec(const pcre *code, const pcre_extra *extra, - const char *subject, int length, int startoffset, - int options, int *ovector, int ovecsize, - int *workspace, int wscount); - - The function pcre_dfa_exec() is called to match a subject string - against a compiled pattern, using a matching algorithm that scans the - subject string just once, and does not backtrack. This has different - characteristics to the normal algorithm, and is not compatible with - Perl. Some of the features of PCRE patterns are not supported. Never- - theless, there are times when this kind of matching can be useful. For - a discussion of the two matching algorithms, and a list of features - that pcre_dfa_exec() does not support, see the pcrematching documenta- - tion. - - The arguments for the pcre_dfa_exec() function are the same as for - pcre_exec(), plus two extras. The ovector argument is used in a differ- - ent way, and this is described below. The other common arguments are - used in the same way as for pcre_exec(), so their description is not - repeated here. - - The two additional arguments provide workspace for the function. The - workspace vector should contain at least 20 elements. It is used for - keeping track of multiple paths through the pattern tree. More - workspace will be needed for patterns and subjects where there are a - lot of potential matches. - - Here is an example of a simple call to pcre_dfa_exec(): - - int rc; - int ovector[10]; - int wspace[20]; - rc = pcre_dfa_exec( - re, /* result of pcre_compile() */ - NULL, /* we didn't study the pattern */ - "some string", /* the subject string */ - 11, /* the length of the subject string */ - 0, /* start at offset 0 in the subject */ - 0, /* default options */ - ovector, /* vector of integers for substring information */ - 10, /* number of elements (NOT size in bytes) */ - wspace, /* working space vector */ - 20); /* number of elements (NOT size in bytes) */ - - Option bits for pcre_dfa_exec() - - The unused bits of the options argument for pcre_dfa_exec() must be - zero. The only bits that may be set are PCRE_ANCHORED, PCRE_NEW- - LINE_xxx, PCRE_NOTBOL, PCRE_NOTEOL, PCRE_NOTEMPTY, - PCRE_NOTEMPTY_ATSTART, PCRE_NO_UTF8_CHECK, PCRE_BSR_ANYCRLF, - PCRE_BSR_UNICODE, PCRE_NO_START_OPTIMIZE, PCRE_PARTIAL_HARD, PCRE_PAR- - TIAL_SOFT, PCRE_DFA_SHORTEST, and PCRE_DFA_RESTART. All but the last - four of these are exactly the same as for pcre_exec(), so their - description is not repeated here. - - PCRE_PARTIAL_HARD - PCRE_PARTIAL_SOFT - - These have the same general effect as they do for pcre_exec(), but the - details are slightly different. When PCRE_PARTIAL_HARD is set for - pcre_dfa_exec(), it returns PCRE_ERROR_PARTIAL if the end of the sub- - ject is reached and there is still at least one matching possibility - that requires additional characters. This happens even if some complete - matches have also been found. When PCRE_PARTIAL_SOFT is set, the return - code PCRE_ERROR_NOMATCH is converted into PCRE_ERROR_PARTIAL if the end - of the subject is reached, there have been no complete matches, but - there is still at least one matching possibility. The portion of the - string that was inspected when the longest partial match was found is - set as the first matching string in both cases. There is a more - detailed discussion of partial and multi-segment matching, with exam- - ples, in the pcrepartial documentation. - - PCRE_DFA_SHORTEST - - Setting the PCRE_DFA_SHORTEST option causes the matching algorithm to - stop as soon as it has found one match. Because of the way the alterna- - tive algorithm works, this is necessarily the shortest possible match - at the first possible matching point in the subject string. - - PCRE_DFA_RESTART - - When pcre_dfa_exec() returns a partial match, it is possible to call it - again, with additional subject characters, and have it continue with - the same match. The PCRE_DFA_RESTART option requests this action; when - it is set, the workspace and wscount options must reference the same - vector as before because data about the match so far is left in them - after a partial match. There is more discussion of this facility in the - pcrepartial documentation. - - Successful returns from pcre_dfa_exec() - - When pcre_dfa_exec() succeeds, it may have matched more than one sub- - string in the subject. Note, however, that all the matches from one run - of the function start at the same point in the subject. The shorter - matches are all initial substrings of the longer matches. For example, - if the pattern - - <.*> - - is matched against the string - - This is no more - - the three matched strings are - - - - - - On success, the yield of the function is a number greater than zero, - which is the number of matched substrings. The substrings themselves - are returned in ovector. Each string uses two elements; the first is - the offset to the start, and the second is the offset to the end. In - fact, all the strings have the same start offset. (Space could have - been saved by giving this only once, but it was decided to retain some - compatibility with the way pcre_exec() returns data, even though the - meaning of the strings is different.) - - The strings are returned in reverse order of length; that is, the long- - est matching string is given first. If there were too many matches to - fit into ovector, the yield of the function is zero, and the vector is - filled with the longest matches. Unlike pcre_exec(), pcre_dfa_exec() - can use the entire ovector for returning matched strings. - - NOTE: PCRE's "auto-possessification" optimization usually applies to - character repeats at the end of a pattern (as well as internally). For - example, the pattern "a\d+" is compiled as if it were "a\d++" because - there is no point even considering the possibility of backtracking into - the repeated digits. For DFA matching, this means that only one possi- - ble match is found. If you really do want multiple matches in such - cases, either use an ungreedy repeat ("a\d+?") or set the - PCRE_NO_AUTO_POSSESS option when compiling. - - Error returns from pcre_dfa_exec() - - The pcre_dfa_exec() function returns a negative number when it fails. - Many of the errors are the same as for pcre_exec(), and these are - described above. There are in addition the following errors that are - specific to pcre_dfa_exec(): - - PCRE_ERROR_DFA_UITEM (-16) - - This return is given if pcre_dfa_exec() encounters an item in the pat- - tern that it does not support, for instance, the use of \C or a back - reference. - - PCRE_ERROR_DFA_UCOND (-17) - - This return is given if pcre_dfa_exec() encounters a condition item - that uses a back reference for the condition, or a test for recursion - in a specific group. These are not supported. - - PCRE_ERROR_DFA_UMLIMIT (-18) - - This return is given if pcre_dfa_exec() is called with an extra block - that contains a setting of the match_limit or match_limit_recursion - fields. This is not supported (these fields are meaningless for DFA - matching). - - PCRE_ERROR_DFA_WSSIZE (-19) - - This return is given if pcre_dfa_exec() runs out of space in the - workspace vector. - - PCRE_ERROR_DFA_RECURSE (-20) - - When a recursive subpattern is processed, the matching function calls - itself recursively, using private vectors for ovector and workspace. - This error is given if the output vector is not large enough. This - should be extremely rare, as a vector of size 1000 is used. - - PCRE_ERROR_DFA_BADRESTART (-30) - - When pcre_dfa_exec() is called with the PCRE_DFA_RESTART option, some - plausibility checks are made on the contents of the workspace, which - should contain data about the previous partial match. If any of these - checks fail, this error is given. - - -SEE ALSO - - pcre16(3), pcre32(3), pcrebuild(3), pcrecallout(3), pcrecpp(3)(3), - pcrematching(3), pcrepartial(3), pcreposix(3), pcreprecompile(3), pcre- - sample(3), pcrestack(3). - - -AUTHOR - - Philip Hazel - University Computing Service - Cambridge CB2 3QH, England. - - -REVISION - - Last updated: 18 December 2015 - Copyright (c) 1997-2015 University of Cambridge. ------------------------------------------------------------------------------- - - -PCRECALLOUT(3) Library Functions Manual PCRECALLOUT(3) - - - -NAME - PCRE - Perl-compatible regular expressions - -SYNOPSIS - - #include - - int (*pcre_callout)(pcre_callout_block *); - - int (*pcre16_callout)(pcre16_callout_block *); - - int (*pcre32_callout)(pcre32_callout_block *); - - -DESCRIPTION - - PCRE provides a feature called "callout", which is a means of temporar- - ily passing control to the caller of PCRE in the middle of pattern - matching. The caller of PCRE provides an external function by putting - its entry point in the global variable pcre_callout (pcre16_callout for - the 16-bit library, pcre32_callout for the 32-bit library). By default, - this variable contains NULL, which disables all calling out. - - Within a regular expression, (?C) indicates the points at which the - external function is to be called. Different callout points can be - identified by putting a number less than 256 after the letter C. The - default value is zero. For example, this pattern has two callout - points: - - (?C1)abc(?C2)def - - If the PCRE_AUTO_CALLOUT option bit is set when a pattern is compiled, - PCRE automatically inserts callouts, all with number 255, before each - item in the pattern. For example, if PCRE_AUTO_CALLOUT is used with the - pattern - - A(\d{2}|--) - - it is processed as if it were - - (?C255)A(?C255)((?C255)\d{2}(?C255)|(?C255)-(?C255)-(?C255))(?C255) - - Notice that there is a callout before and after each parenthesis and - alternation bar. If the pattern contains a conditional group whose con- - dition is an assertion, an automatic callout is inserted immediately - before the condition. Such a callout may also be inserted explicitly, - for example: - - (?(?C9)(?=a)ab|de) - - This applies only to assertion conditions (because they are themselves - independent groups). - - Automatic callouts can be used for tracking the progress of pattern - matching. The pcretest program has a pattern qualifier (/C) that sets - automatic callouts; when it is used, the output indicates how the pat- - tern is being matched. This is useful information when you are trying - to optimize the performance of a particular pattern. - - -MISSING CALLOUTS - - You should be aware that, because of optimizations in the way PCRE com- - piles and matches patterns, callouts sometimes do not happen exactly as - you might expect. - - At compile time, PCRE "auto-possessifies" repeated items when it knows - that what follows cannot be part of the repeat. For example, a+[bc] is - compiled as if it were a++[bc]. The pcretest output when this pattern - is anchored and then applied with automatic callouts to the string - "aaaa" is: - - --->aaaa - +0 ^ ^ - +1 ^ a+ - +3 ^ ^ [bc] - No match - - This indicates that when matching [bc] fails, there is no backtracking - into a+ and therefore the callouts that would be taken for the back- - tracks do not occur. You can disable the auto-possessify feature by - passing PCRE_NO_AUTO_POSSESS to pcre_compile(), or starting the pattern - with (*NO_AUTO_POSSESS). If this is done in pcretest (using the /O - qualifier), the output changes to this: - - --->aaaa - +0 ^ ^ - +1 ^ a+ - +3 ^ ^ [bc] - +3 ^ ^ [bc] - +3 ^ ^ [bc] - +3 ^^ [bc] - No match - - This time, when matching [bc] fails, the matcher backtracks into a+ and - tries again, repeatedly, until a+ itself fails. - - Other optimizations that provide fast "no match" results also affect - callouts. For example, if the pattern is - - ab(?C4)cd - - PCRE knows that any matching string must contain the letter "d". If the - subject string is "abyz", the lack of "d" means that matching doesn't - ever start, and the callout is never reached. However, with "abyd", - though the result is still no match, the callout is obeyed. - - If the pattern is studied, PCRE knows the minimum length of a matching - string, and will immediately give a "no match" return without actually - running a match if the subject is not long enough, or, for unanchored - patterns, if it has been scanned far enough. - - You can disable these optimizations by passing the PCRE_NO_START_OPTI- - MIZE option to the matching function, or by starting the pattern with - (*NO_START_OPT). This slows down the matching process, but does ensure - that callouts such as the example above are obeyed. - - -THE CALLOUT INTERFACE - - During matching, when PCRE reaches a callout point, the external func- - tion defined by pcre_callout or pcre[16|32]_callout is called (if it is - set). This applies to both normal and DFA matching. The only argument - to the callout function is a pointer to a pcre_callout or - pcre[16|32]_callout block. These structures contains the following - fields: - - int version; - int callout_number; - int *offset_vector; - const char *subject; (8-bit version) - PCRE_SPTR16 subject; (16-bit version) - PCRE_SPTR32 subject; (32-bit version) - int subject_length; - int start_match; - int current_position; - int capture_top; - int capture_last; - void *callout_data; - int pattern_position; - int next_item_length; - const unsigned char *mark; (8-bit version) - const PCRE_UCHAR16 *mark; (16-bit version) - const PCRE_UCHAR32 *mark; (32-bit version) - - The version field is an integer containing the version number of the - block format. The initial version was 0; the current version is 2. The - version number will change again in future if additional fields are - added, but the intention is never to remove any of the existing fields. - - The callout_number field contains the number of the callout, as com- - piled into the pattern (that is, the number after ?C for manual call- - outs, and 255 for automatically generated callouts). - - The offset_vector field is a pointer to the vector of offsets that was - passed by the caller to the matching function. When pcre_exec() or - pcre[16|32]_exec() is used, the contents can be inspected, in order to - extract substrings that have been matched so far, in the same way as - for extracting substrings after a match has completed. For the DFA - matching functions, this field is not useful. - - The subject and subject_length fields contain copies of the values that - were passed to the matching function. - - The start_match field normally contains the offset within the subject - at which the current match attempt started. However, if the escape - sequence \K has been encountered, this value is changed to reflect the - modified starting point. If the pattern is not anchored, the callout - function may be called several times from the same point in the pattern - for different starting points in the subject. - - The current_position field contains the offset within the subject of - the current match pointer. - - When the pcre_exec() or pcre[16|32]_exec() is used, the capture_top - field contains one more than the number of the highest numbered cap- - tured substring so far. If no substrings have been captured, the value - of capture_top is one. This is always the case when the DFA functions - are used, because they do not support captured substrings. - - The capture_last field contains the number of the most recently cap- - tured substring. However, when a recursion exits, the value reverts to - what it was outside the recursion, as do the values of all captured - substrings. If no substrings have been captured, the value of cap- - ture_last is -1. This is always the case for the DFA matching func- - tions. - - The callout_data field contains a value that is passed to a matching - function specifically so that it can be passed back in callouts. It is - passed in the callout_data field of a pcre_extra or pcre[16|32]_extra - data structure. If no such data was passed, the value of callout_data - in a callout block is NULL. There is a description of the pcre_extra - structure in the pcreapi documentation. - - The pattern_position field is present from version 1 of the callout - structure. It contains the offset to the next item to be matched in the - pattern string. - - The next_item_length field is present from version 1 of the callout - structure. It contains the length of the next item to be matched in the - pattern string. When the callout immediately precedes an alternation - bar, a closing parenthesis, or the end of the pattern, the length is - zero. When the callout precedes an opening parenthesis, the length is - that of the entire subpattern. - - The pattern_position and next_item_length fields are intended to help - in distinguishing between different automatic callouts, which all have - the same callout number. However, they are set for all callouts. - - The mark field is present from version 2 of the callout structure. In - callouts from pcre_exec() or pcre[16|32]_exec() it contains a pointer - to the zero-terminated name of the most recently passed (*MARK), - (*PRUNE), or (*THEN) item in the match, or NULL if no such items have - been passed. Instances of (*PRUNE) or (*THEN) without a name do not - obliterate a previous (*MARK). In callouts from the DFA matching func- - tions this field always contains NULL. - - -RETURN VALUES - - The external callout function returns an integer to PCRE. If the value - is zero, matching proceeds as normal. If the value is greater than - zero, matching fails at the current point, but the testing of other - matching possibilities goes ahead, just as if a lookahead assertion had - failed. If the value is less than zero, the match is abandoned, the - matching function returns the negative value. - - Negative values should normally be chosen from the set of - PCRE_ERROR_xxx values. In particular, PCRE_ERROR_NOMATCH forces a stan- - dard "no match" failure. The error number PCRE_ERROR_CALLOUT is - reserved for use by callout functions; it will never be used by PCRE - itself. - - -AUTHOR - - Philip Hazel - University Computing Service - Cambridge CB2 3QH, England. - - -REVISION - - Last updated: 12 November 2013 - Copyright (c) 1997-2013 University of Cambridge. ------------------------------------------------------------------------------- - - -PCRECOMPAT(3) Library Functions Manual PCRECOMPAT(3) - - - -NAME - PCRE - Perl-compatible regular expressions - -DIFFERENCES BETWEEN PCRE AND PERL - - This document describes the differences in the ways that PCRE and Perl - handle regular expressions. The differences described here are with - respect to Perl versions 5.10 and above. - - 1. PCRE has only a subset of Perl's Unicode support. Details of what it - does have are given in the pcreunicode page. - - 2. PCRE allows repeat quantifiers only on parenthesized assertions, but - they do not mean what you might think. For example, (?!a){3} does not - assert that the next three characters are not "a". It just asserts that - the next character is not "a" three times (in principle: PCRE optimizes - this to run the assertion just once). Perl allows repeat quantifiers on - other assertions such as \b, but these do not seem to have any use. - - 3. Capturing subpatterns that occur inside negative lookahead asser- - tions are counted, but their entries in the offsets vector are never - set. Perl sometimes (but not always) sets its numerical variables from - inside negative assertions. - - 4. Though binary zero characters are supported in the subject string, - they are not allowed in a pattern string because it is passed as a nor- - mal C string, terminated by zero. The escape sequence \0 can be used in - the pattern to represent a binary zero. - - 5. The following Perl escape sequences are not supported: \l, \u, \L, - \U, and \N when followed by a character name or Unicode value. (\N on - its own, matching a non-newline character, is supported.) In fact these - are implemented by Perl's general string-handling and are not part of - its pattern matching engine. If any of these are encountered by PCRE, - an error is generated by default. However, if the PCRE_JAVASCRIPT_COM- - PAT option is set, \U and \u are interpreted as JavaScript interprets - them. - - 6. The Perl escape sequences \p, \P, and \X are supported only if PCRE - is built with Unicode character property support. The properties that - can be tested with \p and \P are limited to the general category prop- - erties such as Lu and Nd, script names such as Greek or Han, and the - derived properties Any and L&. PCRE does support the Cs (surrogate) - property, which Perl does not; the Perl documentation says "Because - Perl hides the need for the user to understand the internal representa- - tion of Unicode characters, there is no need to implement the somewhat - messy concept of surrogates." - - 7. PCRE does support the \Q...\E escape for quoting substrings. Charac- - ters in between are treated as literals. This is slightly different - from Perl in that $ and @ are also handled as literals inside the - quotes. In Perl, they cause variable interpolation (but of course PCRE - does not have variables). Note the following examples: - - Pattern PCRE matches Perl matches - - \Qabc$xyz\E abc$xyz abc followed by the - contents of $xyz - \Qabc\$xyz\E abc\$xyz abc\$xyz - \Qabc\E\$\Qxyz\E abc$xyz abc$xyz - - The \Q...\E sequence is recognized both inside and outside character - classes. - - 8. Fairly obviously, PCRE does not support the (?{code}) and (??{code}) - constructions. However, there is support for recursive patterns. This - is not available in Perl 5.8, but it is in Perl 5.10. Also, the PCRE - "callout" feature allows an external function to be called during pat- - tern matching. See the pcrecallout documentation for details. - - 9. Subpatterns that are called as subroutines (whether or not recur- - sively) are always treated as atomic groups in PCRE. This is like - Python, but unlike Perl. Captured values that are set outside a sub- - routine call can be reference from inside in PCRE, but not in Perl. - There is a discussion that explains these differences in more detail in - the section on recursion differences from Perl in the pcrepattern page. - - 10. If any of the backtracking control verbs are used in a subpattern - that is called as a subroutine (whether or not recursively), their - effect is confined to that subpattern; it does not extend to the sur- - rounding pattern. This is not always the case in Perl. In particular, - if (*THEN) is present in a group that is called as a subroutine, its - action is limited to that group, even if the group does not contain any - | characters. Note that such subpatterns are processed as anchored at - the point where they are tested. - - 11. If a pattern contains more than one backtracking control verb, the - first one that is backtracked onto acts. For example, in the pattern - A(*COMMIT)B(*PRUNE)C a failure in B triggers (*COMMIT), but a failure - in C triggers (*PRUNE). Perl's behaviour is more complex; in many cases - it is the same as PCRE, but there are examples where it differs. - - 12. Most backtracking verbs in assertions have their normal actions. - They are not confined to the assertion. - - 13. There are some differences that are concerned with the settings of - captured strings when part of a pattern is repeated. For example, - matching "aba" against the pattern /^(a(b)?)+$/ in Perl leaves $2 - unset, but in PCRE it is set to "b". - - 14. PCRE's handling of duplicate subpattern numbers and duplicate sub- - pattern names is not as general as Perl's. This is a consequence of the - fact the PCRE works internally just with numbers, using an external ta- - ble to translate between numbers and names. In particular, a pattern - such as (?|(?A)|(?B), where the two capturing parentheses have - the same number but different names, is not supported, and causes an - error at compile time. If it were allowed, it would not be possible to - distinguish which parentheses matched, because both names map to cap- - turing subpattern number 1. To avoid this confusing situation, an error - is given at compile time. - - 15. Perl recognizes comments in some places that PCRE does not, for - example, between the ( and ? at the start of a subpattern. If the /x - modifier is set, Perl allows white space between ( and ? (though cur- - rent Perls warn that this is deprecated) but PCRE never does, even if - the PCRE_EXTENDED option is set. - - 16. Perl, when in warning mode, gives warnings for character classes - such as [A-\d] or [a-[:digit:]]. It then treats the hyphens as liter- - als. PCRE has no warning features, so it gives an error in these cases - because they are almost certainly user mistakes. - - 17. In PCRE, the upper/lower case character properties Lu and Ll are - not affected when case-independent matching is specified. For example, - \p{Lu} always matches an upper case letter. I think Perl has changed in - this respect; in the release at the time of writing (5.16), \p{Lu} and - \p{Ll} match all letters, regardless of case, when case independence is - specified. - - 18. PCRE provides some extensions to the Perl regular expression facil- - ities. Perl 5.10 includes new features that are not in earlier ver- - sions of Perl, some of which (such as named parentheses) have been in - PCRE for some time. This list is with respect to Perl 5.10: - - (a) Although lookbehind assertions in PCRE must match fixed length - strings, each alternative branch of a lookbehind assertion can match a - different length of string. Perl requires them all to have the same - length. - - (b) If PCRE_DOLLAR_ENDONLY is set and PCRE_MULTILINE is not set, the $ - meta-character matches only at the very end of the string. - - (c) If PCRE_EXTRA is set, a backslash followed by a letter with no spe- - cial meaning is faulted. Otherwise, like Perl, the backslash is quietly - ignored. (Perl can be made to issue a warning.) - - (d) If PCRE_UNGREEDY is set, the greediness of the repetition quanti- - fiers is inverted, that is, by default they are not greedy, but if fol- - lowed by a question mark they are. - - (e) PCRE_ANCHORED can be used at matching time to force a pattern to be - tried only at the first matching position in the subject string. - - (f) The PCRE_NOTBOL, PCRE_NOTEOL, PCRE_NOTEMPTY, PCRE_NOTEMPTY_ATSTART, - and PCRE_NO_AUTO_CAPTURE options for pcre_exec() have no Perl equiva- - lents. - - (g) The \R escape sequence can be restricted to match only CR, LF, or - CRLF by the PCRE_BSR_ANYCRLF option. - - (h) The callout facility is PCRE-specific. - - (i) The partial matching facility is PCRE-specific. - - (j) Patterns compiled by PCRE can be saved and re-used at a later time, - even on different hosts that have the other endianness. However, this - does not apply to optimized data created by the just-in-time compiler. - - (k) The alternative matching functions (pcre_dfa_exec(), - pcre16_dfa_exec() and pcre32_dfa_exec(),) match in a different way and - are not Perl-compatible. - - (l) PCRE recognizes some special sequences such as (*CR) at the start - of a pattern that set overall options that cannot be changed within the - pattern. - - -AUTHOR - - Philip Hazel - University Computing Service - Cambridge CB2 3QH, England. - - -REVISION - - Last updated: 10 November 2013 - Copyright (c) 1997-2013 University of Cambridge. ------------------------------------------------------------------------------- - - -PCREPATTERN(3) Library Functions Manual PCREPATTERN(3) - - - -NAME - PCRE - Perl-compatible regular expressions - -PCRE REGULAR EXPRESSION DETAILS - - The syntax and semantics of the regular expressions that are supported - by PCRE are described in detail below. There is a quick-reference syn- - tax summary in the pcresyntax page. PCRE tries to match Perl syntax and - semantics as closely as it can. PCRE also supports some alternative - regular expression syntax (which does not conflict with the Perl syn- - tax) in order to provide some compatibility with regular expressions in - Python, .NET, and Oniguruma. - - Perl's regular expressions are described in its own documentation, and - regular expressions in general are covered in a number of books, some - of which have copious examples. Jeffrey Friedl's "Mastering Regular - Expressions", published by O'Reilly, covers regular expressions in - great detail. This description of PCRE's regular expressions is - intended as reference material. - - This document discusses the patterns that are supported by PCRE when - one its main matching functions, pcre_exec() (8-bit) or - pcre[16|32]_exec() (16- or 32-bit), is used. PCRE also has alternative - matching functions, pcre_dfa_exec() and pcre[16|32_dfa_exec(), which - match using a different algorithm that is not Perl-compatible. Some of - the features discussed below are not available when DFA matching is - used. The advantages and disadvantages of the alternative functions, - and how they differ from the normal functions, are discussed in the - pcrematching page. - - -SPECIAL START-OF-PATTERN ITEMS - - A number of options that can be passed to pcre_compile() can also be - set by special items at the start of a pattern. These are not Perl-com- - patible, but are provided to make these options accessible to pattern - writers who are not able to change the program that processes the pat- - tern. Any number of these items may appear, but they must all be - together right at the start of the pattern string, and the letters must - be in upper case. - - UTF support - - The original operation of PCRE was on strings of one-byte characters. - However, there is now also support for UTF-8 strings in the original - library, an extra library that supports 16-bit and UTF-16 character - strings, and a third library that supports 32-bit and UTF-32 character - strings. To use these features, PCRE must be built to include appropri- - ate support. When using UTF strings you must either call the compiling - function with the PCRE_UTF8, PCRE_UTF16, or PCRE_UTF32 option, or the - pattern must start with one of these special sequences: - - (*UTF8) - (*UTF16) - (*UTF32) - (*UTF) - - (*UTF) is a generic sequence that can be used with any of the - libraries. Starting a pattern with such a sequence is equivalent to - setting the relevant option. How setting a UTF mode affects pattern - matching is mentioned in several places below. There is also a summary - of features in the pcreunicode page. - - Some applications that allow their users to supply patterns may wish to - restrict them to non-UTF data for security reasons. If the - PCRE_NEVER_UTF option is set at compile time, (*UTF) etc. are not - allowed, and their appearance causes an error. - - Unicode property support - - Another special sequence that may appear at the start of a pattern is - (*UCP). This has the same effect as setting the PCRE_UCP option: it - causes sequences such as \d and \w to use Unicode properties to deter- - mine character types, instead of recognizing only characters with codes - less than 128 via a lookup table. - - Disabling auto-possessification - - If a pattern starts with (*NO_AUTO_POSSESS), it has the same effect as - setting the PCRE_NO_AUTO_POSSESS option at compile time. This stops - PCRE from making quantifiers possessive when what follows cannot match - the repeated item. For example, by default a+b is treated as a++b. For - more details, see the pcreapi documentation. - - Disabling start-up optimizations - - If a pattern starts with (*NO_START_OPT), it has the same effect as - setting the PCRE_NO_START_OPTIMIZE option either at compile or matching - time. This disables several optimizations for quickly reaching "no - match" results. For more details, see the pcreapi documentation. - - Newline conventions - - PCRE supports five different conventions for indicating line breaks in - strings: a single CR (carriage return) character, a single LF (line- - feed) character, the two-character sequence CRLF, any of the three pre- - ceding, or any Unicode newline sequence. The pcreapi page has further - discussion about newlines, and shows how to set the newline convention - in the options arguments for the compiling and matching functions. - - It is also possible to specify a newline convention by starting a pat- - tern string with one of the following five sequences: - - (*CR) carriage return - (*LF) linefeed - (*CRLF) carriage return, followed by linefeed - (*ANYCRLF) any of the three above - (*ANY) all Unicode newline sequences - - These override the default and the options given to the compiling func- - tion. For example, on a Unix system where LF is the default newline - sequence, the pattern - - (*CR)a.b - - changes the convention to CR. That pattern matches "a\nb" because LF is - no longer a newline. If more than one of these settings is present, the - last one is used. - - The newline convention affects where the circumflex and dollar asser- - tions are true. It also affects the interpretation of the dot metachar- - acter when PCRE_DOTALL is not set, and the behaviour of \N. However, it - does not affect what the \R escape sequence matches. By default, this - is any Unicode newline sequence, for Perl compatibility. However, this - can be changed; see the description of \R in the section entitled "New- - line sequences" below. A change of \R setting can be combined with a - change of newline convention. - - Setting match and recursion limits - - The caller of pcre_exec() can set a limit on the number of times the - internal match() function is called and on the maximum depth of recur- - sive calls. These facilities are provided to catch runaway matches that - are provoked by patterns with huge matching trees (a typical example is - a pattern with nested unlimited repeats) and to avoid running out of - system stack by too much recursion. When one of these limits is - reached, pcre_exec() gives an error return. The limits can also be set - by items at the start of the pattern of the form - - (*LIMIT_MATCH=d) - (*LIMIT_RECURSION=d) - - where d is any number of decimal digits. However, the value of the set- - ting must be less than the value set (or defaulted) by the caller of - pcre_exec() for it to have any effect. In other words, the pattern - writer can lower the limits set by the programmer, but not raise them. - If there is more than one setting of one of these limits, the lower - value is used. - - -EBCDIC CHARACTER CODES - - PCRE can be compiled to run in an environment that uses EBCDIC as its - character code rather than ASCII or Unicode (typically a mainframe sys- - tem). In the sections below, character code values are ASCII or Uni- - code; in an EBCDIC environment these characters may have different code - values, and there are no code points greater than 255. - - -CHARACTERS AND METACHARACTERS - - A regular expression is a pattern that is matched against a subject - string from left to right. Most characters stand for themselves in a - pattern, and match the corresponding characters in the subject. As a - trivial example, the pattern - - The quick brown fox - - matches a portion of a subject string that is identical to itself. When - caseless matching is specified (the PCRE_CASELESS option), letters are - matched independently of case. In a UTF mode, PCRE always understands - the concept of case for characters whose values are less than 128, so - caseless matching is always possible. For characters with higher val- - ues, the concept of case is supported if PCRE is compiled with Unicode - property support, but not otherwise. If you want to use caseless - matching for characters 128 and above, you must ensure that PCRE is - compiled with Unicode property support as well as with UTF support. - - The power of regular expressions comes from the ability to include - alternatives and repetitions in the pattern. These are encoded in the - pattern by the use of metacharacters, which do not stand for themselves - but instead are interpreted in some special way. - - There are two different sets of metacharacters: those that are recog- - nized anywhere in the pattern except within square brackets, and those - that are recognized within square brackets. Outside square brackets, - the metacharacters are as follows: - - \ general escape character with several uses - ^ assert start of string (or line, in multiline mode) - $ assert end of string (or line, in multiline mode) - . match any character except newline (by default) - [ start character class definition - | start of alternative branch - ( start subpattern - ) end subpattern - ? extends the meaning of ( - also 0 or 1 quantifier - also quantifier minimizer - * 0 or more quantifier - + 1 or more quantifier - also "possessive quantifier" - { start min/max quantifier - - Part of a pattern that is in square brackets is called a "character - class". In a character class the only metacharacters are: - - \ general escape character - ^ negate the class, but only if the first character - - indicates character range - [ POSIX character class (only if followed by POSIX - syntax) - ] terminates the character class - - The following sections describe the use of each of the metacharacters. - - -BACKSLASH - - The backslash character has several uses. Firstly, if it is followed by - a character that is not a number or a letter, it takes away any special - meaning that character may have. This use of backslash as an escape - character applies both inside and outside character classes. - - For example, if you want to match a * character, you write \* in the - pattern. This escaping action applies whether or not the following - character would otherwise be interpreted as a metacharacter, so it is - always safe to precede a non-alphanumeric with backslash to specify - that it stands for itself. In particular, if you want to match a back- - slash, you write \\. - - In a UTF mode, only ASCII numbers and letters have any special meaning - after a backslash. All other characters (in particular, those whose - codepoints are greater than 127) are treated as literals. - - If a pattern is compiled with the PCRE_EXTENDED option, most white - space in the pattern (other than in a character class), and characters - between a # outside a character class and the next newline, inclusive, - are ignored. An escaping backslash can be used to include a white space - or # character as part of the pattern. - - If you want to remove the special meaning from a sequence of charac- - ters, you can do so by putting them between \Q and \E. This is differ- - ent from Perl in that $ and @ are handled as literals in \Q...\E - sequences in PCRE, whereas in Perl, $ and @ cause variable interpola- - tion. Note the following examples: - - Pattern PCRE matches Perl matches - - \Qabc$xyz\E abc$xyz abc followed by the - contents of $xyz - \Qabc\$xyz\E abc\$xyz abc\$xyz - \Qabc\E\$\Qxyz\E abc$xyz abc$xyz - - The \Q...\E sequence is recognized both inside and outside character - classes. An isolated \E that is not preceded by \Q is ignored. If \Q - is not followed by \E later in the pattern, the literal interpretation - continues to the end of the pattern (that is, \E is assumed at the - end). If the isolated \Q is inside a character class, this causes an - error, because the character class is not terminated. - - Non-printing characters - - A second use of backslash provides a way of encoding non-printing char- - acters in patterns in a visible manner. There is no restriction on the - appearance of non-printing characters, apart from the binary zero that - terminates a pattern, but when a pattern is being prepared by text - editing, it is often easier to use one of the following escape - sequences than the binary character it represents. In an ASCII or Uni- - code environment, these escapes are as follows: - - \a alarm, that is, the BEL character (hex 07) - \cx "control-x", where x is any ASCII character - \e escape (hex 1B) - \f form feed (hex 0C) - \n linefeed (hex 0A) - \r carriage return (hex 0D) - \t tab (hex 09) - \0dd character with octal code 0dd - \ddd character with octal code ddd, or back reference - \o{ddd..} character with octal code ddd.. - \xhh character with hex code hh - \x{hhh..} character with hex code hhh.. (non-JavaScript mode) - \uhhhh character with hex code hhhh (JavaScript mode only) - - The precise effect of \cx on ASCII characters is as follows: if x is a - lower case letter, it is converted to upper case. Then bit 6 of the - character (hex 40) is inverted. Thus \cA to \cZ become hex 01 to hex 1A - (A is 41, Z is 5A), but \c{ becomes hex 3B ({ is 7B), and \c; becomes - hex 7B (; is 3B). If the data item (byte or 16-bit value) following \c - has a value greater than 127, a compile-time error occurs. This locks - out non-ASCII characters in all modes. - - When PCRE is compiled in EBCDIC mode, \a, \e, \f, \n, \r, and \t gener- - ate the appropriate EBCDIC code values. The \c escape is processed as - specified for Perl in the perlebcdic document. The only characters that - are allowed after \c are A-Z, a-z, or one of @, [, \, ], ^, _, or ?. - Any other character provokes a compile-time error. The sequence \c@ - encodes character code 0; after \c the letters (in either case) encode - characters 1-26 (hex 01 to hex 1A); [, \, ], ^, and _ encode characters - 27-31 (hex 1B to hex 1F), and \c? becomes either 255 (hex FF) or 95 - (hex 5F). - - Thus, apart from \c?, these escapes generate the same character code - values as they do in an ASCII environment, though the meanings of the - values mostly differ. For example, \cG always generates code value 7, - which is BEL in ASCII but DEL in EBCDIC. - - The sequence \c? generates DEL (127, hex 7F) in an ASCII environment, - but because 127 is not a control character in EBCDIC, Perl makes it - generate the APC character. Unfortunately, there are several variants - of EBCDIC. In most of them the APC character has the value 255 (hex - FF), but in the one Perl calls POSIX-BC its value is 95 (hex 5F). If - certain other characters have POSIX-BC values, PCRE makes \c? generate - 95; otherwise it generates 255. - - After \0 up to two further octal digits are read. If there are fewer - than two digits, just those that are present are used. Thus the - sequence \0\x\015 specifies two binary zeros followed by a CR character - (code value 13). Make sure you supply two digits after the initial zero - if the pattern character that follows is itself an octal digit. - - The escape \o must be followed by a sequence of octal digits, enclosed - in braces. An error occurs if this is not the case. This escape is a - recent addition to Perl; it provides way of specifying character code - points as octal numbers greater than 0777, and it also allows octal - numbers and back references to be unambiguously specified. - - For greater clarity and unambiguity, it is best to avoid following \ by - a digit greater than zero. Instead, use \o{} or \x{} to specify charac- - ter numbers, and \g{} to specify back references. The following para- - graphs describe the old, ambiguous syntax. - - The handling of a backslash followed by a digit other than 0 is compli- - cated, and Perl has changed in recent releases, causing PCRE also to - change. Outside a character class, PCRE reads the digit and any follow- - ing digits as a decimal number. If the number is less than 8, or if - there have been at least that many previous capturing left parentheses - in the expression, the entire sequence is taken as a back reference. A - description of how this works is given later, following the discussion - of parenthesized subpatterns. - - Inside a character class, or if the decimal number following \ is - greater than 7 and there have not been that many capturing subpatterns, - PCRE handles \8 and \9 as the literal characters "8" and "9", and oth- - erwise re-reads up to three octal digits following the backslash, using - them to generate a data character. Any subsequent digits stand for - themselves. For example: - - \040 is another way of writing an ASCII space - \40 is the same, provided there are fewer than 40 - previous capturing subpatterns - \7 is always a back reference - \11 might be a back reference, or another way of - writing a tab - \011 is always a tab - \0113 is a tab followed by the character "3" - \113 might be a back reference, otherwise the - character with octal code 113 - \377 might be a back reference, otherwise - the value 255 (decimal) - \81 is either a back reference, or the two - characters "8" and "1" - - Note that octal values of 100 or greater that are specified using this - syntax must not be introduced by a leading zero, because no more than - three octal digits are ever read. - - By default, after \x that is not followed by {, from zero to two hexa- - decimal digits are read (letters can be in upper or lower case). Any - number of hexadecimal digits may appear between \x{ and }. If a charac- - ter other than a hexadecimal digit appears between \x{ and }, or if - there is no terminating }, an error occurs. - - If the PCRE_JAVASCRIPT_COMPAT option is set, the interpretation of \x - is as just described only when it is followed by two hexadecimal dig- - its. Otherwise, it matches a literal "x" character. In JavaScript - mode, support for code points greater than 256 is provided by \u, which - must be followed by four hexadecimal digits; otherwise it matches a - literal "u" character. - - Characters whose value is less than 256 can be defined by either of the - two syntaxes for \x (or by \u in JavaScript mode). There is no differ- - ence in the way they are handled. For example, \xdc is exactly the same - as \x{dc} (or \u00dc in JavaScript mode). - - Constraints on character values - - Characters that are specified using octal or hexadecimal numbers are - limited to certain values, as follows: - - 8-bit non-UTF mode less than 0x100 - 8-bit UTF-8 mode less than 0x10ffff and a valid codepoint - 16-bit non-UTF mode less than 0x10000 - 16-bit UTF-16 mode less than 0x10ffff and a valid codepoint - 32-bit non-UTF mode less than 0x100000000 - 32-bit UTF-32 mode less than 0x10ffff and a valid codepoint - - Invalid Unicode codepoints are the range 0xd800 to 0xdfff (the so- - called "surrogate" codepoints), and 0xffef. - - Escape sequences in character classes - - All the sequences that define a single character value can be used both - inside and outside character classes. In addition, inside a character - class, \b is interpreted as the backspace character (hex 08). - - \N is not allowed in a character class. \B, \R, and \X are not special - inside a character class. Like other unrecognized escape sequences, - they are treated as the literal characters "B", "R", and "X" by - default, but cause an error if the PCRE_EXTRA option is set. Outside a - character class, these sequences have different meanings. - - Unsupported escape sequences - - In Perl, the sequences \l, \L, \u, and \U are recognized by its string - handler and used to modify the case of following characters. By - default, PCRE does not support these escape sequences. However, if the - PCRE_JAVASCRIPT_COMPAT option is set, \U matches a "U" character, and - \u can be used to define a character by code point, as described in the - previous section. - - Absolute and relative back references - - The sequence \g followed by an unsigned or a negative number, option- - ally enclosed in braces, is an absolute or relative back reference. A - named back reference can be coded as \g{name}. Back references are dis- - cussed later, following the discussion of parenthesized subpatterns. - - Absolute and relative subroutine calls - - For compatibility with Oniguruma, the non-Perl syntax \g followed by a - name or a number enclosed either in angle brackets or single quotes, is - an alternative syntax for referencing a subpattern as a "subroutine". - Details are discussed later. Note that \g{...} (Perl syntax) and - \g<...> (Oniguruma syntax) are not synonymous. The former is a back - reference; the latter is a subroutine call. - - Generic character types - - Another use of backslash is for specifying generic character types: - - \d any decimal digit - \D any character that is not a decimal digit - \h any horizontal white space character - \H any character that is not a horizontal white space character - \s any white space character - \S any character that is not a white space character - \v any vertical white space character - \V any character that is not a vertical white space character - \w any "word" character - \W any "non-word" character - - There is also the single sequence \N, which matches a non-newline char- - acter. This is the same as the "." metacharacter when PCRE_DOTALL is - not set. Perl also uses \N to match characters by name; PCRE does not - support this. - - Each pair of lower and upper case escape sequences partitions the com- - plete set of characters into two disjoint sets. Any given character - matches one, and only one, of each pair. The sequences can appear both - inside and outside character classes. They each match one character of - the appropriate type. If the current matching point is at the end of - the subject string, all of them fail, because there is no character to - match. - - For compatibility with Perl, \s did not used to match the VT character - (code 11), which made it different from the the POSIX "space" class. - However, Perl added VT at release 5.18, and PCRE followed suit at - release 8.34. The default \s characters are now HT (9), LF (10), VT - (11), FF (12), CR (13), and space (32), which are defined as white - space in the "C" locale. This list may vary if locale-specific matching - is taking place. For example, in some locales the "non-breaking space" - character (\xA0) is recognized as white space, and in others the VT - character is not. - - A "word" character is an underscore or any character that is a letter - or digit. By default, the definition of letters and digits is con- - trolled by PCRE's low-valued character tables, and may vary if locale- - specific matching is taking place (see "Locale support" in the pcreapi - page). For example, in a French locale such as "fr_FR" in Unix-like - systems, or "french" in Windows, some character codes greater than 127 - are used for accented letters, and these are then matched by \w. The - use of locales with Unicode is discouraged. - - By default, characters whose code points are greater than 127 never - match \d, \s, or \w, and always match \D, \S, and \W, although this may - vary for characters in the range 128-255 when locale-specific matching - is happening. These escape sequences retain their original meanings - from before Unicode support was available, mainly for efficiency rea- - sons. If PCRE is compiled with Unicode property support, and the - PCRE_UCP option is set, the behaviour is changed so that Unicode prop- - erties are used to determine character types, as follows: - - \d any character that matches \p{Nd} (decimal digit) - \s any character that matches \p{Z} or \h or \v - \w any character that matches \p{L} or \p{N}, plus underscore - - The upper case escapes match the inverse sets of characters. Note that - \d matches only decimal digits, whereas \w matches any Unicode digit, - as well as any Unicode letter, and underscore. Note also that PCRE_UCP - affects \b, and \B because they are defined in terms of \w and \W. - Matching these sequences is noticeably slower when PCRE_UCP is set. - - The sequences \h, \H, \v, and \V are features that were added to Perl - at release 5.10. In contrast to the other sequences, which match only - ASCII characters by default, these always match certain high-valued - code points, whether or not PCRE_UCP is set. The horizontal space char- - acters are: - - U+0009 Horizontal tab (HT) - U+0020 Space - U+00A0 Non-break space - U+1680 Ogham space mark - U+180E Mongolian vowel separator - U+2000 En quad - U+2001 Em quad - U+2002 En space - U+2003 Em space - U+2004 Three-per-em space - U+2005 Four-per-em space - U+2006 Six-per-em space - U+2007 Figure space - U+2008 Punctuation space - U+2009 Thin space - U+200A Hair space - U+202F Narrow no-break space - U+205F Medium mathematical space - U+3000 Ideographic space - - The vertical space characters are: - - U+000A Linefeed (LF) - U+000B Vertical tab (VT) - U+000C Form feed (FF) - U+000D Carriage return (CR) - U+0085 Next line (NEL) - U+2028 Line separator - U+2029 Paragraph separator - - In 8-bit, non-UTF-8 mode, only the characters with codepoints less than - 256 are relevant. - - Newline sequences - - Outside a character class, by default, the escape sequence \R matches - any Unicode newline sequence. In 8-bit non-UTF-8 mode \R is equivalent - to the following: - - (?>\r\n|\n|\x0b|\f|\r|\x85) - - This is an example of an "atomic group", details of which are given - below. This particular group matches either the two-character sequence - CR followed by LF, or one of the single characters LF (linefeed, - U+000A), VT (vertical tab, U+000B), FF (form feed, U+000C), CR (car- - riage return, U+000D), or NEL (next line, U+0085). The two-character - sequence is treated as a single unit that cannot be split. - - In other modes, two additional characters whose codepoints are greater - than 255 are added: LS (line separator, U+2028) and PS (paragraph sepa- - rator, U+2029). Unicode character property support is not needed for - these characters to be recognized. - - It is possible to restrict \R to match only CR, LF, or CRLF (instead of - the complete set of Unicode line endings) by setting the option - PCRE_BSR_ANYCRLF either at compile time or when the pattern is matched. - (BSR is an abbrevation for "backslash R".) This can be made the default - when PCRE is built; if this is the case, the other behaviour can be - requested via the PCRE_BSR_UNICODE option. It is also possible to - specify these settings by starting a pattern string with one of the - following sequences: - - (*BSR_ANYCRLF) CR, LF, or CRLF only - (*BSR_UNICODE) any Unicode newline sequence - - These override the default and the options given to the compiling func- - tion, but they can themselves be overridden by options given to a - matching function. Note that these special settings, which are not - Perl-compatible, are recognized only at the very start of a pattern, - and that they must be in upper case. If more than one of them is - present, the last one is used. They can be combined with a change of - newline convention; for example, a pattern can start with: - - (*ANY)(*BSR_ANYCRLF) - - They can also be combined with the (*UTF8), (*UTF16), (*UTF32), (*UTF) - or (*UCP) special sequences. Inside a character class, \R is treated as - an unrecognized escape sequence, and so matches the letter "R" by - default, but causes an error if PCRE_EXTRA is set. - - Unicode character properties - - When PCRE is built with Unicode character property support, three addi- - tional escape sequences that match characters with specific properties - are available. When in 8-bit non-UTF-8 mode, these sequences are of - course limited to testing characters whose codepoints are less than - 256, but they do work in this mode. The extra escape sequences are: - - \p{xx} a character with the xx property - \P{xx} a character without the xx property - \X a Unicode extended grapheme cluster - - The property names represented by xx above are limited to the Unicode - script names, the general category properties, "Any", which matches any - character (including newline), and some special PCRE properties - (described in the next section). Other Perl properties such as "InMu- - sicalSymbols" are not currently supported by PCRE. Note that \P{Any} - does not match any characters, so always causes a match failure. - - Sets of Unicode characters are defined as belonging to certain scripts. - A character from one of these sets can be matched using a script name. - For example: - - \p{Greek} - \P{Han} - - Those that are not part of an identified script are lumped together as - "Common". The current list of scripts is: - - Arabic, Armenian, Avestan, Balinese, Bamum, Bassa_Vah, Batak, Bengali, - Bopomofo, Brahmi, Braille, Buginese, Buhid, Canadian_Aboriginal, Car- - ian, Caucasian_Albanian, Chakma, Cham, Cherokee, Common, Coptic, Cunei- - form, Cypriot, Cyrillic, Deseret, Devanagari, Duployan, Egyptian_Hiero- - glyphs, Elbasan, Ethiopic, Georgian, Glagolitic, Gothic, Grantha, - Greek, Gujarati, Gurmukhi, Han, Hangul, Hanunoo, Hebrew, Hiragana, - Imperial_Aramaic, Inherited, Inscriptional_Pahlavi, Inscrip- - tional_Parthian, Javanese, Kaithi, Kannada, Katakana, Kayah_Li, - Kharoshthi, Khmer, Khojki, Khudawadi, Lao, Latin, Lepcha, Limbu, Lin- - ear_A, Linear_B, Lisu, Lycian, Lydian, Mahajani, Malayalam, Mandaic, - Manichaean, Meetei_Mayek, Mende_Kikakui, Meroitic_Cursive, - Meroitic_Hieroglyphs, Miao, Modi, Mongolian, Mro, Myanmar, Nabataean, - New_Tai_Lue, Nko, Ogham, Ol_Chiki, Old_Italic, Old_North_Arabian, - Old_Permic, Old_Persian, Old_South_Arabian, Old_Turkic, Oriya, Osmanya, - Pahawh_Hmong, Palmyrene, Pau_Cin_Hau, Phags_Pa, Phoenician, - Psalter_Pahlavi, Rejang, Runic, Samaritan, Saurashtra, Sharada, Sha- - vian, Siddham, Sinhala, Sora_Sompeng, Sundanese, Syloti_Nagri, Syriac, - Tagalog, Tagbanwa, Tai_Le, Tai_Tham, Tai_Viet, Takri, Tamil, Telugu, - Thaana, Thai, Tibetan, Tifinagh, Tirhuta, Ugaritic, Vai, Warang_Citi, - Yi. - - Each character has exactly one Unicode general category property, spec- - ified by a two-letter abbreviation. For compatibility with Perl, nega- - tion can be specified by including a circumflex between the opening - brace and the property name. For example, \p{^Lu} is the same as - \P{Lu}. - - If only one letter is specified with \p or \P, it includes all the gen- - eral category properties that start with that letter. In this case, in - the absence of negation, the curly brackets in the escape sequence are - optional; these two examples have the same effect: - - \p{L} - \pL - - The following general category property codes are supported: - - C Other - Cc Control - Cf Format - Cn Unassigned - Co Private use - Cs Surrogate - - L Letter - Ll Lower case letter - Lm Modifier letter - Lo Other letter - Lt Title case letter - Lu Upper case letter - - M Mark - Mc Spacing mark - Me Enclosing mark - Mn Non-spacing mark - - N Number - Nd Decimal number - Nl Letter number - No Other number - - P Punctuation - Pc Connector punctuation - Pd Dash punctuation - Pe Close punctuation - Pf Final punctuation - Pi Initial punctuation - Po Other punctuation - Ps Open punctuation - - S Symbol - Sc Currency symbol - Sk Modifier symbol - Sm Mathematical symbol - So Other symbol - - Z Separator - Zl Line separator - Zp Paragraph separator - Zs Space separator - - The special property L& is also supported: it matches a character that - has the Lu, Ll, or Lt property, in other words, a letter that is not - classified as a modifier or "other". - - The Cs (Surrogate) property applies only to characters in the range - U+D800 to U+DFFF. Such characters are not valid in Unicode strings and - so cannot be tested by PCRE, unless UTF validity checking has been - turned off (see the discussion of PCRE_NO_UTF8_CHECK, - PCRE_NO_UTF16_CHECK and PCRE_NO_UTF32_CHECK in the pcreapi page). Perl - does not support the Cs property. - - The long synonyms for property names that Perl supports (such as - \p{Letter}) are not supported by PCRE, nor is it permitted to prefix - any of these properties with "Is". - - No character that is in the Unicode table has the Cn (unassigned) prop- - erty. Instead, this property is assumed for any code point that is not - in the Unicode table. - - Specifying caseless matching does not affect these escape sequences. - For example, \p{Lu} always matches only upper case letters. This is - different from the behaviour of current versions of Perl. - - Matching characters by Unicode property is not fast, because PCRE has - to do a multistage table lookup in order to find a character's prop- - erty. That is why the traditional escape sequences such as \d and \w do - not use Unicode properties in PCRE by default, though you can make them - do so by setting the PCRE_UCP option or by starting the pattern with - (*UCP). - - Extended grapheme clusters - - The \X escape matches any number of Unicode characters that form an - "extended grapheme cluster", and treats the sequence as an atomic group - (see below). Up to and including release 8.31, PCRE matched an ear- - lier, simpler definition that was equivalent to - - (?>\PM\pM*) - - That is, it matched a character without the "mark" property, followed - by zero or more characters with the "mark" property. Characters with - the "mark" property are typically non-spacing accents that affect the - preceding character. - - This simple definition was extended in Unicode to include more compli- - cated kinds of composite character by giving each character a grapheme - breaking property, and creating rules that use these properties to - define the boundaries of extended grapheme clusters. In releases of - PCRE later than 8.31, \X matches one of these clusters. - - \X always matches at least one character. Then it decides whether to - add additional characters according to the following rules for ending a - cluster: - - 1. End at the end of the subject string. - - 2. Do not end between CR and LF; otherwise end after any control char- - acter. - - 3. Do not break Hangul (a Korean script) syllable sequences. Hangul - characters are of five types: L, V, T, LV, and LVT. An L character may - be followed by an L, V, LV, or LVT character; an LV or V character may - be followed by a V or T character; an LVT or T character may be follwed - only by a T character. - - 4. Do not end before extending characters or spacing marks. Characters - with the "mark" property always have the "extend" grapheme breaking - property. - - 5. Do not end after prepend characters. - - 6. Otherwise, end the cluster. - - PCRE's additional properties - - As well as the standard Unicode properties described above, PCRE sup- - ports four more that make it possible to convert traditional escape - sequences such as \w and \s to use Unicode properties. PCRE uses these - non-standard, non-Perl properties internally when PCRE_UCP is set. How- - ever, they may also be used explicitly. These properties are: - - Xan Any alphanumeric character - Xps Any POSIX space character - Xsp Any Perl space character - Xwd Any Perl "word" character - - Xan matches characters that have either the L (letter) or the N (num- - ber) property. Xps matches the characters tab, linefeed, vertical tab, - form feed, or carriage return, and any other character that has the Z - (separator) property. Xsp is the same as Xps; it used to exclude ver- - tical tab, for Perl compatibility, but Perl changed, and so PCRE fol- - lowed at release 8.34. Xwd matches the same characters as Xan, plus - underscore. - - There is another non-standard property, Xuc, which matches any charac- - ter that can be represented by a Universal Character Name in C++ and - other programming languages. These are the characters $, @, ` (grave - accent), and all characters with Unicode code points greater than or - equal to U+00A0, except for the surrogates U+D800 to U+DFFF. Note that - most base (ASCII) characters are excluded. (Universal Character Names - are of the form \uHHHH or \UHHHHHHHH where H is a hexadecimal digit. - Note that the Xuc property does not match these sequences but the char- - acters that they represent.) - - Resetting the match start - - The escape sequence \K causes any previously matched characters not to - be included in the final matched sequence. For example, the pattern: - - foo\Kbar - - matches "foobar", but reports that it has matched "bar". This feature - is similar to a lookbehind assertion (described below). However, in - this case, the part of the subject before the real match does not have - to be of fixed length, as lookbehind assertions do. The use of \K does - not interfere with the setting of captured substrings. For example, - when the pattern - - (foo)\Kbar - - matches "foobar", the first substring is still set to "foo". - - Perl documents that the use of \K within assertions is "not well - defined". In PCRE, \K is acted upon when it occurs inside positive - assertions, but is ignored in negative assertions. Note that when a - pattern such as (?=ab\K) matches, the reported start of the match can - be greater than the end of the match. - - Simple assertions - - The final use of backslash is for certain simple assertions. An asser- - tion specifies a condition that has to be met at a particular point in - a match, without consuming any characters from the subject string. The - use of subpatterns for more complicated assertions is described below. - The backslashed assertions are: - - \b matches at a word boundary - \B matches when not at a word boundary - \A matches at the start of the subject - \Z matches at the end of the subject - also matches before a newline at the end of the subject - \z matches only at the end of the subject - \G matches at the first matching position in the subject - - Inside a character class, \b has a different meaning; it matches the - backspace character. If any other of these assertions appears in a - character class, by default it matches the corresponding literal char- - acter (for example, \B matches the letter B). However, if the - PCRE_EXTRA option is set, an "invalid escape sequence" error is gener- - ated instead. - - A word boundary is a position in the subject string where the current - character and the previous character do not both match \w or \W (i.e. - one matches \w and the other matches \W), or the start or end of the - string if the first or last character matches \w, respectively. In a - UTF mode, the meanings of \w and \W can be changed by setting the - PCRE_UCP option. When this is done, it also affects \b and \B. Neither - PCRE nor Perl has a separate "start of word" or "end of word" metase- - quence. However, whatever follows \b normally determines which it is. - For example, the fragment \ba matches "a" at the start of a word. - - The \A, \Z, and \z assertions differ from the traditional circumflex - and dollar (described in the next section) in that they only ever match - at the very start and end of the subject string, whatever options are - set. Thus, they are independent of multiline mode. These three asser- - tions are not affected by the PCRE_NOTBOL or PCRE_NOTEOL options, which - affect only the behaviour of the circumflex and dollar metacharacters. - However, if the startoffset argument of pcre_exec() is non-zero, indi- - cating that matching is to start at a point other than the beginning of - the subject, \A can never match. The difference between \Z and \z is - that \Z matches before a newline at the end of the string as well as at - the very end, whereas \z matches only at the end. - - The \G assertion is true only when the current matching position is at - the start point of the match, as specified by the startoffset argument - of pcre_exec(). It differs from \A when the value of startoffset is - non-zero. By calling pcre_exec() multiple times with appropriate argu- - ments, you can mimic Perl's /g option, and it is in this kind of imple- - mentation where \G can be useful. - - Note, however, that PCRE's interpretation of \G, as the start of the - current match, is subtly different from Perl's, which defines it as the - end of the previous match. In Perl, these can be different when the - previously matched string was empty. Because PCRE does just one match - at a time, it cannot reproduce this behaviour. - - If all the alternatives of a pattern begin with \G, the expression is - anchored to the starting match position, and the "anchored" flag is set - in the compiled regular expression. - - -CIRCUMFLEX AND DOLLAR - - The circumflex and dollar metacharacters are zero-width assertions. - That is, they test for a particular condition being true without con- - suming any characters from the subject string. - - Outside a character class, in the default matching mode, the circumflex - character is an assertion that is true only if the current matching - point is at the start of the subject string. If the startoffset argu- - ment of pcre_exec() is non-zero, circumflex can never match if the - PCRE_MULTILINE option is unset. Inside a character class, circumflex - has an entirely different meaning (see below). - - Circumflex need not be the first character of the pattern if a number - of alternatives are involved, but it should be the first thing in each - alternative in which it appears if the pattern is ever to match that - branch. If all possible alternatives start with a circumflex, that is, - if the pattern is constrained to match only at the start of the sub- - ject, it is said to be an "anchored" pattern. (There are also other - constructs that can cause a pattern to be anchored.) - - The dollar character is an assertion that is true only if the current - matching point is at the end of the subject string, or immediately - before a newline at the end of the string (by default). Note, however, - that it does not actually match the newline. Dollar need not be the - last character of the pattern if a number of alternatives are involved, - but it should be the last item in any branch in which it appears. Dol- - lar has no special meaning in a character class. - - The meaning of dollar can be changed so that it matches only at the - very end of the string, by setting the PCRE_DOLLAR_ENDONLY option at - compile time. This does not affect the \Z assertion. - - The meanings of the circumflex and dollar characters are changed if the - PCRE_MULTILINE option is set. When this is the case, a circumflex - matches immediately after internal newlines as well as at the start of - the subject string. It does not match after a newline that ends the - string. A dollar matches before any newlines in the string, as well as - at the very end, when PCRE_MULTILINE is set. When newline is specified - as the two-character sequence CRLF, isolated CR and LF characters do - not indicate newlines. - - For example, the pattern /^abc$/ matches the subject string "def\nabc" - (where \n represents a newline) in multiline mode, but not otherwise. - Consequently, patterns that are anchored in single line mode because - all branches start with ^ are not anchored in multiline mode, and a - match for circumflex is possible when the startoffset argument of - pcre_exec() is non-zero. The PCRE_DOLLAR_ENDONLY option is ignored if - PCRE_MULTILINE is set. - - Note that the sequences \A, \Z, and \z can be used to match the start - and end of the subject in both modes, and if all branches of a pattern - start with \A it is always anchored, whether or not PCRE_MULTILINE is - set. - - -FULL STOP (PERIOD, DOT) AND \N - - Outside a character class, a dot in the pattern matches any one charac- - ter in the subject string except (by default) a character that signi- - fies the end of a line. - - When a line ending is defined as a single character, dot never matches - that character; when the two-character sequence CRLF is used, dot does - not match CR if it is immediately followed by LF, but otherwise it - matches all characters (including isolated CRs and LFs). When any Uni- - code line endings are being recognized, dot does not match CR or LF or - any of the other line ending characters. - - The behaviour of dot with regard to newlines can be changed. If the - PCRE_DOTALL option is set, a dot matches any one character, without - exception. If the two-character sequence CRLF is present in the subject - string, it takes two dots to match it. - - The handling of dot is entirely independent of the handling of circum- - flex and dollar, the only relationship being that they both involve - newlines. Dot has no special meaning in a character class. - - The escape sequence \N behaves like a dot, except that it is not - affected by the PCRE_DOTALL option. In other words, it matches any - character except one that signifies the end of a line. Perl also uses - \N to match characters by name; PCRE does not support this. - - -MATCHING A SINGLE DATA UNIT - - Outside a character class, the escape sequence \C matches any one data - unit, whether or not a UTF mode is set. In the 8-bit library, one data - unit is one byte; in the 16-bit library it is a 16-bit unit; in the - 32-bit library it is a 32-bit unit. Unlike a dot, \C always matches - line-ending characters. The feature is provided in Perl in order to - match individual bytes in UTF-8 mode, but it is unclear how it can use- - fully be used. Because \C breaks up characters into individual data - units, matching one unit with \C in a UTF mode means that the rest of - the string may start with a malformed UTF character. This has undefined - results, because PCRE assumes that it is dealing with valid UTF strings - (and by default it checks this at the start of processing unless the - PCRE_NO_UTF8_CHECK, PCRE_NO_UTF16_CHECK or PCRE_NO_UTF32_CHECK option - is used). - - PCRE does not allow \C to appear in lookbehind assertions (described - below) in a UTF mode, because this would make it impossible to calcu- - late the length of the lookbehind. - - In general, the \C escape sequence is best avoided. However, one way of - using it that avoids the problem of malformed UTF characters is to use - a lookahead to check the length of the next character, as in this pat- - tern, which could be used with a UTF-8 string (ignore white space and - line breaks): - - (?| (?=[\x00-\x7f])(\C) | - (?=[\x80-\x{7ff}])(\C)(\C) | - (?=[\x{800}-\x{ffff}])(\C)(\C)(\C) | - (?=[\x{10000}-\x{1fffff}])(\C)(\C)(\C)(\C)) - - A group that starts with (?| resets the capturing parentheses numbers - in each alternative (see "Duplicate Subpattern Numbers" below). The - assertions at the start of each branch check the next UTF-8 character - for values whose encoding uses 1, 2, 3, or 4 bytes, respectively. The - character's individual bytes are then captured by the appropriate num- - ber of groups. - - -SQUARE BRACKETS AND CHARACTER CLASSES - - An opening square bracket introduces a character class, terminated by a - closing square bracket. A closing square bracket on its own is not spe- - cial by default. However, if the PCRE_JAVASCRIPT_COMPAT option is set, - a lone closing square bracket causes a compile-time error. If a closing - square bracket is required as a member of the class, it should be the - first data character in the class (after an initial circumflex, if - present) or escaped with a backslash. - - A character class matches a single character in the subject. In a UTF - mode, the character may be more than one data unit long. A matched - character must be in the set of characters defined by the class, unless - the first character in the class definition is a circumflex, in which - case the subject character must not be in the set defined by the class. - If a circumflex is actually required as a member of the class, ensure - it is not the first character, or escape it with a backslash. - - For example, the character class [aeiou] matches any lower case vowel, - while [^aeiou] matches any character that is not a lower case vowel. - Note that a circumflex is just a convenient notation for specifying the - characters that are in the class by enumerating those that are not. A - class that starts with a circumflex is not an assertion; it still con- - sumes a character from the subject string, and therefore it fails if - the current pointer is at the end of the string. - - In UTF-8 (UTF-16, UTF-32) mode, characters with values greater than 255 - (0xffff) can be included in a class as a literal string of data units, - or by using the \x{ escaping mechanism. - - When caseless matching is set, any letters in a class represent both - their upper case and lower case versions, so for example, a caseless - [aeiou] matches "A" as well as "a", and a caseless [^aeiou] does not - match "A", whereas a caseful version would. In a UTF mode, PCRE always - understands the concept of case for characters whose values are less - than 128, so caseless matching is always possible. For characters with - higher values, the concept of case is supported if PCRE is compiled - with Unicode property support, but not otherwise. If you want to use - caseless matching in a UTF mode for characters 128 and above, you must - ensure that PCRE is compiled with Unicode property support as well as - with UTF support. - - Characters that might indicate line breaks are never treated in any - special way when matching character classes, whatever line-ending - sequence is in use, and whatever setting of the PCRE_DOTALL and - PCRE_MULTILINE options is used. A class such as [^a] always matches one - of these characters. - - The minus (hyphen) character can be used to specify a range of charac- - ters in a character class. For example, [d-m] matches any letter - between d and m, inclusive. If a minus character is required in a - class, it must be escaped with a backslash or appear in a position - where it cannot be interpreted as indicating a range, typically as the - first or last character in the class, or immediately after a range. For - example, [b-d-z] matches letters in the range b to d, a hyphen charac- - ter, or z. - - It is not possible to have the literal character "]" as the end charac- - ter of a range. A pattern such as [W-]46] is interpreted as a class of - two characters ("W" and "-") followed by a literal string "46]", so it - would match "W46]" or "-46]". However, if the "]" is escaped with a - backslash it is interpreted as the end of range, so [W-\]46] is inter- - preted as a class containing a range followed by two other characters. - The octal or hexadecimal representation of "]" can also be used to end - a range. - - An error is generated if a POSIX character class (see below) or an - escape sequence other than one that defines a single character appears - at a point where a range ending character is expected. For example, - [z-\xff] is valid, but [A-\d] and [A-[:digit:]] are not. - - Ranges operate in the collating sequence of character values. They can - also be used for characters specified numerically, for example - [\000-\037]. Ranges can include any characters that are valid for the - current mode. - - If a range that includes letters is used when caseless matching is set, - it matches the letters in either case. For example, [W-c] is equivalent - to [][\\^_`wxyzabc], matched caselessly, and in a non-UTF mode, if - character tables for a French locale are in use, [\xc8-\xcb] matches - accented E characters in both cases. In UTF modes, PCRE supports the - concept of case for characters with values greater than 128 only when - it is compiled with Unicode property support. - - The character escape sequences \d, \D, \h, \H, \p, \P, \s, \S, \v, \V, - \w, and \W may appear in a character class, and add the characters that - they match to the class. For example, [\dABCDEF] matches any hexadeci- - mal digit. In UTF modes, the PCRE_UCP option affects the meanings of - \d, \s, \w and their upper case partners, just as it does when they - appear outside a character class, as described in the section entitled - "Generic character types" above. The escape sequence \b has a different - meaning inside a character class; it matches the backspace character. - The sequences \B, \N, \R, and \X are not special inside a character - class. Like any other unrecognized escape sequences, they are treated - as the literal characters "B", "N", "R", and "X" by default, but cause - an error if the PCRE_EXTRA option is set. - - A circumflex can conveniently be used with the upper case character - types to specify a more restricted set of characters than the matching - lower case type. For example, the class [^\W_] matches any letter or - digit, but not underscore, whereas [\w] includes underscore. A positive - character class should be read as "something OR something OR ..." and a - negative class as "NOT something AND NOT something AND NOT ...". - - The only metacharacters that are recognized in character classes are - backslash, hyphen (only where it can be interpreted as specifying a - range), circumflex (only at the start), opening square bracket (only - when it can be interpreted as introducing a POSIX class name, or for a - special compatibility feature - see the next two sections), and the - terminating closing square bracket. However, escaping other non- - alphanumeric characters does no harm. - - -POSIX CHARACTER CLASSES - - Perl supports the POSIX notation for character classes. This uses names - enclosed by [: and :] within the enclosing square brackets. PCRE also - supports this notation. For example, - - [01[:alpha:]%] - - matches "0", "1", any alphabetic character, or "%". The supported class - names are: - - alnum letters and digits - alpha letters - ascii character codes 0 - 127 - blank space or tab only - cntrl control characters - digit decimal digits (same as \d) - graph printing characters, excluding space - lower lower case letters - print printing characters, including space - punct printing characters, excluding letters and digits and space - space white space (the same as \s from PCRE 8.34) - upper upper case letters - word "word" characters (same as \w) - xdigit hexadecimal digits - - The default "space" characters are HT (9), LF (10), VT (11), FF (12), - CR (13), and space (32). If locale-specific matching is taking place, - the list of space characters may be different; there may be fewer or - more of them. "Space" used to be different to \s, which did not include - VT, for Perl compatibility. However, Perl changed at release 5.18, and - PCRE followed at release 8.34. "Space" and \s now match the same set - of characters. - - The name "word" is a Perl extension, and "blank" is a GNU extension - from Perl 5.8. Another Perl extension is negation, which is indicated - by a ^ character after the colon. For example, - - [12[:^digit:]] - - matches "1", "2", or any non-digit. PCRE (and Perl) also recognize the - POSIX syntax [.ch.] and [=ch=] where "ch" is a "collating element", but - these are not supported, and an error is given if they are encountered. - - By default, characters with values greater than 128 do not match any of - the POSIX character classes. However, if the PCRE_UCP option is passed - to pcre_compile(), some of the classes are changed so that Unicode - character properties are used. This is achieved by replacing certain - POSIX classes by other sequences, as follows: - - [:alnum:] becomes \p{Xan} - [:alpha:] becomes \p{L} - [:blank:] becomes \h - [:digit:] becomes \p{Nd} - [:lower:] becomes \p{Ll} - [:space:] becomes \p{Xps} - [:upper:] becomes \p{Lu} - [:word:] becomes \p{Xwd} - - Negated versions, such as [:^alpha:] use \P instead of \p. Three other - POSIX classes are handled specially in UCP mode: - - [:graph:] This matches characters that have glyphs that mark the page - when printed. In Unicode property terms, it matches all char- - acters with the L, M, N, P, S, or Cf properties, except for: - - U+061C Arabic Letter Mark - U+180E Mongolian Vowel Separator - U+2066 - U+2069 Various "isolate"s - - - [:print:] This matches the same characters as [:graph:] plus space - characters that are not controls, that is, characters with - the Zs property. - - [:punct:] This matches all characters that have the Unicode P (punctua- - tion) property, plus those characters whose code points are - less than 128 that have the S (Symbol) property. - - The other POSIX classes are unchanged, and match only characters with - code points less than 128. - - -COMPATIBILITY FEATURE FOR WORD BOUNDARIES - - In the POSIX.2 compliant library that was included in 4.4BSD Unix, the - ugly syntax [[:<:]] and [[:>:]] is used for matching "start of word" - and "end of word". PCRE treats these items as follows: - - [[:<:]] is converted to \b(?=\w) - [[:>:]] is converted to \b(?<=\w) - - Only these exact character sequences are recognized. A sequence such as - [a[:<:]b] provokes error for an unrecognized POSIX class name. This - support is not compatible with Perl. It is provided to help migrations - from other environments, and is best not used in any new patterns. Note - that \b matches at the start and the end of a word (see "Simple asser- - tions" above), and in a Perl-style pattern the preceding or following - character normally shows which is wanted, without the need for the - assertions that are used above in order to give exactly the POSIX be- - haviour. - - -VERTICAL BAR - - Vertical bar characters are used to separate alternative patterns. For - example, the pattern - - gilbert|sullivan - - matches either "gilbert" or "sullivan". Any number of alternatives may - appear, and an empty alternative is permitted (matching the empty - string). The matching process tries each alternative in turn, from left - to right, and the first one that succeeds is used. If the alternatives - are within a subpattern (defined below), "succeeds" means matching the - rest of the main pattern as well as the alternative in the subpattern. - - -INTERNAL OPTION SETTING - - The settings of the PCRE_CASELESS, PCRE_MULTILINE, PCRE_DOTALL, and - PCRE_EXTENDED options (which are Perl-compatible) can be changed from - within the pattern by a sequence of Perl option letters enclosed - between "(?" and ")". The option letters are - - i for PCRE_CASELESS - m for PCRE_MULTILINE - s for PCRE_DOTALL - x for PCRE_EXTENDED - - For example, (?im) sets caseless, multiline matching. It is also possi- - ble to unset these options by preceding the letter with a hyphen, and a - combined setting and unsetting such as (?im-sx), which sets PCRE_CASE- - LESS and PCRE_MULTILINE while unsetting PCRE_DOTALL and PCRE_EXTENDED, - is also permitted. If a letter appears both before and after the - hyphen, the option is unset. - - The PCRE-specific options PCRE_DUPNAMES, PCRE_UNGREEDY, and PCRE_EXTRA - can be changed in the same way as the Perl-compatible options by using - the characters J, U and X respectively. - - When one of these option changes occurs at top level (that is, not - inside subpattern parentheses), the change applies to the remainder of - the pattern that follows. An option change within a subpattern (see - below for a description of subpatterns) affects only that part of the - subpattern that follows it, so - - (a(?i)b)c - - matches abc and aBc and no other strings (assuming PCRE_CASELESS is not - used). By this means, options can be made to have different settings - in different parts of the pattern. Any changes made in one alternative - do carry on into subsequent branches within the same subpattern. For - example, - - (a(?i)b|c) - - matches "ab", "aB", "c", and "C", even though when matching "C" the - first branch is abandoned before the option setting. This is because - the effects of option settings happen at compile time. There would be - some very weird behaviour otherwise. - - Note: There are other PCRE-specific options that can be set by the - application when the compiling or matching functions are called. In - some cases the pattern can contain special leading sequences such as - (*CRLF) to override what the application has set or what has been - defaulted. Details are given in the section entitled "Newline - sequences" above. There are also the (*UTF8), (*UTF16),(*UTF32), and - (*UCP) leading sequences that can be used to set UTF and Unicode prop- - erty modes; they are equivalent to setting the PCRE_UTF8, PCRE_UTF16, - PCRE_UTF32 and the PCRE_UCP options, respectively. The (*UTF) sequence - is a generic version that can be used with any of the libraries. How- - ever, the application can set the PCRE_NEVER_UTF option, which locks - out the use of the (*UTF) sequences. - - -SUBPATTERNS - - Subpatterns are delimited by parentheses (round brackets), which can be - nested. Turning part of a pattern into a subpattern does two things: - - 1. It localizes a set of alternatives. For example, the pattern - - cat(aract|erpillar|) - - matches "cataract", "caterpillar", or "cat". Without the parentheses, - it would match "cataract", "erpillar" or an empty string. - - 2. It sets up the subpattern as a capturing subpattern. This means - that, when the whole pattern matches, that portion of the subject - string that matched the subpattern is passed back to the caller via the - ovector argument of the matching function. (This applies only to the - traditional matching functions; the DFA matching functions do not sup- - port capturing.) - - Opening parentheses are counted from left to right (starting from 1) to - obtain numbers for the capturing subpatterns. For example, if the - string "the red king" is matched against the pattern - - the ((red|white) (king|queen)) - - the captured substrings are "red king", "red", and "king", and are num- - bered 1, 2, and 3, respectively. - - The fact that plain parentheses fulfil two functions is not always - helpful. There are often times when a grouping subpattern is required - without a capturing requirement. If an opening parenthesis is followed - by a question mark and a colon, the subpattern does not do any captur- - ing, and is not counted when computing the number of any subsequent - capturing subpatterns. For example, if the string "the white queen" is - matched against the pattern - - the ((?:red|white) (king|queen)) - - the captured substrings are "white queen" and "queen", and are numbered - 1 and 2. The maximum number of capturing subpatterns is 65535. - - As a convenient shorthand, if any option settings are required at the - start of a non-capturing subpattern, the option letters may appear - between the "?" and the ":". Thus the two patterns - - (?i:saturday|sunday) - (?:(?i)saturday|sunday) - - match exactly the same set of strings. Because alternative branches are - tried from left to right, and options are not reset until the end of - the subpattern is reached, an option setting in one branch does affect - subsequent branches, so the above patterns match "SUNDAY" as well as - "Saturday". - - -DUPLICATE SUBPATTERN NUMBERS - - Perl 5.10 introduced a feature whereby each alternative in a subpattern - uses the same numbers for its capturing parentheses. Such a subpattern - starts with (?| and is itself a non-capturing subpattern. For example, - consider this pattern: - - (?|(Sat)ur|(Sun))day - - Because the two alternatives are inside a (?| group, both sets of cap- - turing parentheses are numbered one. Thus, when the pattern matches, - you can look at captured substring number one, whichever alternative - matched. This construct is useful when you want to capture part, but - not all, of one of a number of alternatives. Inside a (?| group, paren- - theses are numbered as usual, but the number is reset at the start of - each branch. The numbers of any capturing parentheses that follow the - subpattern start after the highest number used in any branch. The fol- - lowing example is taken from the Perl documentation. The numbers under- - neath show in which buffer the captured content will be stored. - - # before ---------------branch-reset----------- after - / ( a ) (?| x ( y ) z | (p (q) r) | (t) u (v) ) ( z ) /x - # 1 2 2 3 2 3 4 - - A back reference to a numbered subpattern uses the most recent value - that is set for that number by any subpattern. The following pattern - matches "abcabc" or "defdef": - - /(?|(abc)|(def))\1/ - - In contrast, a subroutine call to a numbered subpattern always refers - to the first one in the pattern with the given number. The following - pattern matches "abcabc" or "defabc": - - /(?|(abc)|(def))(?1)/ - - If a condition test for a subpattern's having matched refers to a non- - unique number, the test is true if any of the subpatterns of that num- - ber have matched. - - An alternative approach to using this "branch reset" feature is to use - duplicate named subpatterns, as described in the next section. - - -NAMED SUBPATTERNS - - Identifying capturing parentheses by number is simple, but it can be - very hard to keep track of the numbers in complicated regular expres- - sions. Furthermore, if an expression is modified, the numbers may - change. To help with this difficulty, PCRE supports the naming of sub- - patterns. This feature was not added to Perl until release 5.10. Python - had the feature earlier, and PCRE introduced it at release 4.0, using - the Python syntax. PCRE now supports both the Perl and the Python syn- - tax. Perl allows identically numbered subpatterns to have different - names, but PCRE does not. - - In PCRE, a subpattern can be named in one of three ways: (?...) - or (?'name'...) as in Perl, or (?P...) as in Python. References - to capturing parentheses from other parts of the pattern, such as back - references, recursion, and conditions, can be made by name as well as - by number. - - Names consist of up to 32 alphanumeric characters and underscores, but - must start with a non-digit. Named capturing parentheses are still - allocated numbers as well as names, exactly as if the names were not - present. The PCRE API provides function calls for extracting the name- - to-number translation table from a compiled pattern. There is also a - convenience function for extracting a captured substring by name. - - By default, a name must be unique within a pattern, but it is possible - to relax this constraint by setting the PCRE_DUPNAMES option at compile - time. (Duplicate names are also always permitted for subpatterns with - the same number, set up as described in the previous section.) Dupli- - cate names can be useful for patterns where only one instance of the - named parentheses can match. Suppose you want to match the name of a - weekday, either as a 3-letter abbreviation or as the full name, and in - both cases you want to extract the abbreviation. This pattern (ignoring - the line breaks) does the job: - - (?Mon|Fri|Sun)(?:day)?| - (?Tue)(?:sday)?| - (?Wed)(?:nesday)?| - (?Thu)(?:rsday)?| - (?Sat)(?:urday)? - - There are five capturing substrings, but only one is ever set after a - match. (An alternative way of solving this problem is to use a "branch - reset" subpattern, as described in the previous section.) - - The convenience function for extracting the data by name returns the - substring for the first (and in this example, the only) subpattern of - that name that matched. This saves searching to find which numbered - subpattern it was. - - If you make a back reference to a non-unique named subpattern from - elsewhere in the pattern, the subpatterns to which the name refers are - checked in the order in which they appear in the overall pattern. The - first one that is set is used for the reference. For example, this pat- - tern matches both "foofoo" and "barbar" but not "foobar" or "barfoo": - - (?:(?foo)|(?bar))\k - - - If you make a subroutine call to a non-unique named subpattern, the one - that corresponds to the first occurrence of the name is used. In the - absence of duplicate numbers (see the previous section) this is the one - with the lowest number. - - If you use a named reference in a condition test (see the section about - conditions below), either to check whether a subpattern has matched, or - to check for recursion, all subpatterns with the same name are tested. - If the condition is true for any one of them, the overall condition is - true. This is the same behaviour as testing by number. For further - details of the interfaces for handling named subpatterns, see the - pcreapi documentation. - - Warning: You cannot use different names to distinguish between two sub- - patterns with the same number because PCRE uses only the numbers when - matching. For this reason, an error is given at compile time if differ- - ent names are given to subpatterns with the same number. However, you - can always give the same name to subpatterns with the same number, even - when PCRE_DUPNAMES is not set. - - -REPETITION - - Repetition is specified by quantifiers, which can follow any of the - following items: - - a literal data character - the dot metacharacter - the \C escape sequence - the \X escape sequence - the \R escape sequence - an escape such as \d or \pL that matches a single character - a character class - a back reference (see next section) - a parenthesized subpattern (including assertions) - a subroutine call to a subpattern (recursive or otherwise) - - The general repetition quantifier specifies a minimum and maximum num- - ber of permitted matches, by giving the two numbers in curly brackets - (braces), separated by a comma. The numbers must be less than 65536, - and the first must be less than or equal to the second. For example: - - z{2,4} - - matches "zz", "zzz", or "zzzz". A closing brace on its own is not a - special character. If the second number is omitted, but the comma is - present, there is no upper limit; if the second number and the comma - are both omitted, the quantifier specifies an exact number of required - matches. Thus - - [aeiou]{3,} - - matches at least 3 successive vowels, but may match many more, while - - \d{8} - - matches exactly 8 digits. An opening curly bracket that appears in a - position where a quantifier is not allowed, or one that does not match - the syntax of a quantifier, is taken as a literal character. For exam- - ple, {,6} is not a quantifier, but a literal string of four characters. - - In UTF modes, quantifiers apply to characters rather than to individual - data units. Thus, for example, \x{100}{2} matches two characters, each - of which is represented by a two-byte sequence in a UTF-8 string. Simi- - larly, \X{3} matches three Unicode extended grapheme clusters, each of - which may be several data units long (and they may be of different - lengths). - - The quantifier {0} is permitted, causing the expression to behave as if - the previous item and the quantifier were not present. This may be use- - ful for subpatterns that are referenced as subroutines from elsewhere - in the pattern (but see also the section entitled "Defining subpatterns - for use by reference only" below). Items other than subpatterns that - have a {0} quantifier are omitted from the compiled pattern. - - For convenience, the three most common quantifiers have single-charac- - ter abbreviations: - - * is equivalent to {0,} - + is equivalent to {1,} - ? is equivalent to {0,1} - - It is possible to construct infinite loops by following a subpattern - that can match no characters with a quantifier that has no upper limit, - for example: - - (a?)* - - Earlier versions of Perl and PCRE used to give an error at compile time - for such patterns. However, because there are cases where this can be - useful, such patterns are now accepted, but if any repetition of the - subpattern does in fact match no characters, the loop is forcibly bro- - ken. - - By default, the quantifiers are "greedy", that is, they match as much - as possible (up to the maximum number of permitted times), without - causing the rest of the pattern to fail. The classic example of where - this gives problems is in trying to match comments in C programs. These - appear between /* and */ and within the comment, individual * and / - characters may appear. An attempt to match C comments by applying the - pattern - - /\*.*\*/ - - to the string - - /* first comment */ not comment /* second comment */ - - fails, because it matches the entire string owing to the greediness of - the .* item. - - However, if a quantifier is followed by a question mark, it ceases to - be greedy, and instead matches the minimum number of times possible, so - the pattern - - /\*.*?\*/ - - does the right thing with the C comments. The meaning of the various - quantifiers is not otherwise changed, just the preferred number of - matches. Do not confuse this use of question mark with its use as a - quantifier in its own right. Because it has two uses, it can sometimes - appear doubled, as in - - \d??\d - - which matches one digit by preference, but can match two if that is the - only way the rest of the pattern matches. - - If the PCRE_UNGREEDY option is set (an option that is not available in - Perl), the quantifiers are not greedy by default, but individual ones - can be made greedy by following them with a question mark. In other - words, it inverts the default behaviour. - - When a parenthesized subpattern is quantified with a minimum repeat - count that is greater than 1 or with a limited maximum, more memory is - required for the compiled pattern, in proportion to the size of the - minimum or maximum. - - If a pattern starts with .* or .{0,} and the PCRE_DOTALL option (equiv- - alent to Perl's /s) is set, thus allowing the dot to match newlines, - the pattern is implicitly anchored, because whatever follows will be - tried against every character position in the subject string, so there - is no point in retrying the overall match at any position after the - first. PCRE normally treats such a pattern as though it were preceded - by \A. - - In cases where it is known that the subject string contains no new- - lines, it is worth setting PCRE_DOTALL in order to obtain this opti- - mization, or alternatively using ^ to indicate anchoring explicitly. - - However, there are some cases where the optimization cannot be used. - When .* is inside capturing parentheses that are the subject of a back - reference elsewhere in the pattern, a match at the start may fail where - a later one succeeds. Consider, for example: - - (.*)abc\1 - - If the subject is "xyz123abc123" the match point is the fourth charac- - ter. For this reason, such a pattern is not implicitly anchored. - - Another case where implicit anchoring is not applied is when the lead- - ing .* is inside an atomic group. Once again, a match at the start may - fail where a later one succeeds. Consider this pattern: - - (?>.*?a)b - - It matches "ab" in the subject "aab". The use of the backtracking con- - trol verbs (*PRUNE) and (*SKIP) also disable this optimization. - - When a capturing subpattern is repeated, the value captured is the sub- - string that matched the final iteration. For example, after - - (tweedle[dume]{3}\s*)+ - - has matched "tweedledum tweedledee" the value of the captured substring - is "tweedledee". However, if there are nested capturing subpatterns, - the corresponding captured values may have been set in previous itera- - tions. For example, after - - /(a|(b))+/ - - matches "aba" the value of the second captured substring is "b". - - -ATOMIC GROUPING AND POSSESSIVE QUANTIFIERS - - With both maximizing ("greedy") and minimizing ("ungreedy" or "lazy") - repetition, failure of what follows normally causes the repeated item - to be re-evaluated to see if a different number of repeats allows the - rest of the pattern to match. Sometimes it is useful to prevent this, - either to change the nature of the match, or to cause it fail earlier - than it otherwise might, when the author of the pattern knows there is - no point in carrying on. - - Consider, for example, the pattern \d+foo when applied to the subject - line - - 123456bar - - After matching all 6 digits and then failing to match "foo", the normal - action of the matcher is to try again with only 5 digits matching the - \d+ item, and then with 4, and so on, before ultimately failing. - "Atomic grouping" (a term taken from Jeffrey Friedl's book) provides - the means for specifying that once a subpattern has matched, it is not - to be re-evaluated in this way. - - If we use atomic grouping for the previous example, the matcher gives - up immediately on failing to match "foo" the first time. The notation - is a kind of special parenthesis, starting with (?> as in this example: - - (?>\d+)foo - - This kind of parenthesis "locks up" the part of the pattern it con- - tains once it has matched, and a failure further into the pattern is - prevented from backtracking into it. Backtracking past it to previous - items, however, works as normal. - - An alternative description is that a subpattern of this type matches - the string of characters that an identical standalone pattern would - match, if anchored at the current point in the subject string. - - Atomic grouping subpatterns are not capturing subpatterns. Simple cases - such as the above example can be thought of as a maximizing repeat that - must swallow everything it can. So, while both \d+ and \d+? are pre- - pared to adjust the number of digits they match in order to make the - rest of the pattern match, (?>\d+) can only match an entire sequence of - digits. - - Atomic groups in general can of course contain arbitrarily complicated - subpatterns, and can be nested. However, when the subpattern for an - atomic group is just a single repeated item, as in the example above, a - simpler notation, called a "possessive quantifier" can be used. This - consists of an additional + character following a quantifier. Using - this notation, the previous example can be rewritten as - - \d++foo - - Note that a possessive quantifier can be used with an entire group, for - example: - - (abc|xyz){2,3}+ - - Possessive quantifiers are always greedy; the setting of the - PCRE_UNGREEDY option is ignored. They are a convenient notation for the - simpler forms of atomic group. However, there is no difference in the - meaning of a possessive quantifier and the equivalent atomic group, - though there may be a performance difference; possessive quantifiers - should be slightly faster. - - The possessive quantifier syntax is an extension to the Perl 5.8 syn- - tax. Jeffrey Friedl originated the idea (and the name) in the first - edition of his book. Mike McCloskey liked it, so implemented it when he - built Sun's Java package, and PCRE copied it from there. It ultimately - found its way into Perl at release 5.10. - - PCRE has an optimization that automatically "possessifies" certain sim- - ple pattern constructs. For example, the sequence A+B is treated as - A++B because there is no point in backtracking into a sequence of A's - when B must follow. - - When a pattern contains an unlimited repeat inside a subpattern that - can itself be repeated an unlimited number of times, the use of an - atomic group is the only way to avoid some failing matches taking a - very long time indeed. The pattern - - (\D+|<\d+>)*[!?] - - matches an unlimited number of substrings that either consist of non- - digits, or digits enclosed in <>, followed by either ! or ?. When it - matches, it runs quickly. However, if it is applied to - - aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa - - it takes a long time before reporting failure. This is because the - string can be divided between the internal \D+ repeat and the external - * repeat in a large number of ways, and all have to be tried. (The - example uses [!?] rather than a single character at the end, because - both PCRE and Perl have an optimization that allows for fast failure - when a single character is used. They remember the last single charac- - ter that is required for a match, and fail early if it is not present - in the string.) If the pattern is changed so that it uses an atomic - group, like this: - - ((?>\D+)|<\d+>)*[!?] - - sequences of non-digits cannot be broken, and failure happens quickly. - - -BACK REFERENCES - - Outside a character class, a backslash followed by a digit greater than - 0 (and possibly further digits) is a back reference to a capturing sub- - pattern earlier (that is, to its left) in the pattern, provided there - have been that many previous capturing left parentheses. - - However, if the decimal number following the backslash is less than 10, - it is always taken as a back reference, and causes an error only if - there are not that many capturing left parentheses in the entire pat- - tern. In other words, the parentheses that are referenced need not be - to the left of the reference for numbers less than 10. A "forward back - reference" of this type can make sense when a repetition is involved - and the subpattern to the right has participated in an earlier itera- - tion. - - It is not possible to have a numerical "forward back reference" to a - subpattern whose number is 10 or more using this syntax because a - sequence such as \50 is interpreted as a character defined in octal. - See the subsection entitled "Non-printing characters" above for further - details of the handling of digits following a backslash. There is no - such problem when named parentheses are used. A back reference to any - subpattern is possible using named parentheses (see below). - - Another way of avoiding the ambiguity inherent in the use of digits - following a backslash is to use the \g escape sequence. This escape - must be followed by an unsigned number or a negative number, optionally - enclosed in braces. These examples are all identical: - - (ring), \1 - (ring), \g1 - (ring), \g{1} - - An unsigned number specifies an absolute reference without the ambigu- - ity that is present in the older syntax. It is also useful when literal - digits follow the reference. A negative number is a relative reference. - Consider this example: - - (abc(def)ghi)\g{-1} - - The sequence \g{-1} is a reference to the most recently started captur- - ing subpattern before \g, that is, is it equivalent to \2 in this exam- - ple. Similarly, \g{-2} would be equivalent to \1. The use of relative - references can be helpful in long patterns, and also in patterns that - are created by joining together fragments that contain references - within themselves. - - A back reference matches whatever actually matched the capturing sub- - pattern in the current subject string, rather than anything matching - the subpattern itself (see "Subpatterns as subroutines" below for a way - of doing that). So the pattern - - (sens|respons)e and \1ibility - - matches "sense and sensibility" and "response and responsibility", but - not "sense and responsibility". If caseful matching is in force at the - time of the back reference, the case of letters is relevant. For exam- - ple, - - ((?i)rah)\s+\1 - - matches "rah rah" and "RAH RAH", but not "RAH rah", even though the - original capturing subpattern is matched caselessly. - - There are several different ways of writing back references to named - subpatterns. The .NET syntax \k{name} and the Perl syntax \k or - \k'name' are supported, as is the Python syntax (?P=name). Perl 5.10's - unified back reference syntax, in which \g can be used for both numeric - and named references, is also supported. We could rewrite the above - example in any of the following ways: - - (?(?i)rah)\s+\k - (?'p1'(?i)rah)\s+\k{p1} - (?P(?i)rah)\s+(?P=p1) - (?(?i)rah)\s+\g{p1} - - A subpattern that is referenced by name may appear in the pattern - before or after the reference. - - There may be more than one back reference to the same subpattern. If a - subpattern has not actually been used in a particular match, any back - references to it always fail by default. For example, the pattern - - (a|(bc))\2 - - always fails if it starts to match "a" rather than "bc". However, if - the PCRE_JAVASCRIPT_COMPAT option is set at compile time, a back refer- - ence to an unset value matches an empty string. - - Because there may be many capturing parentheses in a pattern, all dig- - its following a backslash are taken as part of a potential back refer- - ence number. If the pattern continues with a digit character, some - delimiter must be used to terminate the back reference. If the - PCRE_EXTENDED option is set, this can be white space. Otherwise, the - \g{ syntax or an empty comment (see "Comments" below) can be used. - - Recursive back references - - A back reference that occurs inside the parentheses to which it refers - fails when the subpattern is first used, so, for example, (a\1) never - matches. However, such references can be useful inside repeated sub- - patterns. For example, the pattern - - (a|b\1)+ - - matches any number of "a"s and also "aba", "ababbaa" etc. At each iter- - ation of the subpattern, the back reference matches the character - string corresponding to the previous iteration. In order for this to - work, the pattern must be such that the first iteration does not need - to match the back reference. This can be done using alternation, as in - the example above, or by a quantifier with a minimum of zero. - - Back references of this type cause the group that they reference to be - treated as an atomic group. Once the whole group has been matched, a - subsequent matching failure cannot cause backtracking into the middle - of the group. - - -ASSERTIONS - - An assertion is a test on the characters following or preceding the - current matching point that does not actually consume any characters. - The simple assertions coded as \b, \B, \A, \G, \Z, \z, ^ and $ are - described above. - - More complicated assertions are coded as subpatterns. There are two - kinds: those that look ahead of the current position in the subject - string, and those that look behind it. An assertion subpattern is - matched in the normal way, except that it does not cause the current - matching position to be changed. - - Assertion subpatterns are not capturing subpatterns. If such an asser- - tion contains capturing subpatterns within it, these are counted for - the purposes of numbering the capturing subpatterns in the whole pat- - tern. However, substring capturing is carried out only for positive - assertions. (Perl sometimes, but not always, does do capturing in nega- - tive assertions.) - - WARNING: If a positive assertion containing one or more capturing sub- - patterns succeeds, but failure to match later in the pattern causes - backtracking over this assertion, the captures within the assertion are - reset only if no higher numbered captures are already set. This is, - unfortunately, a fundamental limitation of the current implementation, - and as PCRE1 is now in maintenance-only status, it is unlikely ever to - change. - - For compatibility with Perl, assertion subpatterns may be repeated; - though it makes no sense to assert the same thing several times, the - side effect of capturing parentheses may occasionally be useful. In - practice, there only three cases: - - (1) If the quantifier is {0}, the assertion is never obeyed during - matching. However, it may contain internal capturing parenthesized - groups that are called from elsewhere via the subroutine mechanism. - - (2) If quantifier is {0,n} where n is greater than zero, it is treated - as if it were {0,1}. At run time, the rest of the pattern match is - tried with and without the assertion, the order depending on the greed- - iness of the quantifier. - - (3) If the minimum repetition is greater than zero, the quantifier is - ignored. The assertion is obeyed just once when encountered during - matching. - - Lookahead assertions - - Lookahead assertions start with (?= for positive assertions and (?! for - negative assertions. For example, - - \w+(?=;) - - matches a word followed by a semicolon, but does not include the semi- - colon in the match, and - - foo(?!bar) - - matches any occurrence of "foo" that is not followed by "bar". Note - that the apparently similar pattern - - (?!foo)bar - - does not find an occurrence of "bar" that is preceded by something - other than "foo"; it finds any occurrence of "bar" whatsoever, because - the assertion (?!foo) is always true when the next three characters are - "bar". A lookbehind assertion is needed to achieve the other effect. - - If you want to force a matching failure at some point in a pattern, the - most convenient way to do it is with (?!) because an empty string - always matches, so an assertion that requires there not to be an empty - string must always fail. The backtracking control verb (*FAIL) or (*F) - is a synonym for (?!). - - Lookbehind assertions - - Lookbehind assertions start with (?<= for positive assertions and (?)...) or (?('name')...) to test for a - used subpattern by name. For compatibility with earlier versions of - PCRE, which had this facility before Perl, the syntax (?(name)...) is - also recognized. - - Rewriting the above example to use a named subpattern gives this: - - (? \( )? [^()]+ (?() \) ) - - If the name used in a condition of this kind is a duplicate, the test - is applied to all subpatterns of the same name, and is true if any one - of them has matched. - - Checking for pattern recursion - - If the condition is the string (R), and there is no subpattern with the - name R, the condition is true if a recursive call to the whole pattern - or any subpattern has been made. If digits or a name preceded by amper- - sand follow the letter R, for example: - - (?(R3)...) or (?(R&name)...) - - the condition is true if the most recent recursion is into a subpattern - whose number or name is given. This condition does not check the entire - recursion stack. If the name used in a condition of this kind is a - duplicate, the test is applied to all subpatterns of the same name, and - is true if any one of them is the most recent recursion. - - At "top level", all these recursion test conditions are false. The - syntax for recursive patterns is described below. - - Defining subpatterns for use by reference only - - If the condition is the string (DEFINE), and there is no subpattern - with the name DEFINE, the condition is always false. In this case, - there may be only one alternative in the subpattern. It is always - skipped if control reaches this point in the pattern; the idea of - DEFINE is that it can be used to define subroutines that can be refer- - enced from elsewhere. (The use of subroutines is described below.) For - example, a pattern to match an IPv4 address such as "192.168.23.245" - could be written like this (ignore white space and line breaks): - - (?(DEFINE) (? 2[0-4]\d | 25[0-5] | 1\d\d | [1-9]?\d) ) - \b (?&byte) (\.(?&byte)){3} \b - - The first part of the pattern is a DEFINE group inside which a another - group named "byte" is defined. This matches an individual component of - an IPv4 address (a number less than 256). When matching takes place, - this part of the pattern is skipped because DEFINE acts like a false - condition. The rest of the pattern uses references to the named group - to match the four dot-separated components of an IPv4 address, insist- - ing on a word boundary at each end. - - Assertion conditions - - If the condition is not in any of the above formats, it must be an - assertion. This may be a positive or negative lookahead or lookbehind - assertion. Consider this pattern, again containing non-significant - white space, and with the two alternatives on the second line: - - (?(?=[^a-z]*[a-z]) - \d{2}-[a-z]{3}-\d{2} | \d{2}-\d{2}-\d{2} ) - - The condition is a positive lookahead assertion that matches an - optional sequence of non-letters followed by a letter. In other words, - it tests for the presence of at least one letter in the subject. If a - letter is found, the subject is matched against the first alternative; - otherwise it is matched against the second. This pattern matches - strings in one of the two forms dd-aaa-dd or dd-dd-dd, where aaa are - letters and dd are digits. - - -COMMENTS - - There are two ways of including comments in patterns that are processed - by PCRE. In both cases, the start of the comment must not be in a char- - acter class, nor in the middle of any other sequence of related charac- - ters such as (?: or a subpattern name or number. The characters that - make up a comment play no part in the pattern matching. - - The sequence (?# marks the start of a comment that continues up to the - next closing parenthesis. Nested parentheses are not permitted. If the - PCRE_EXTENDED option is set, an unescaped # character also introduces a - comment, which in this case continues to immediately after the next - newline character or character sequence in the pattern. Which charac- - ters are interpreted as newlines is controlled by the options passed to - a compiling function or by a special sequence at the start of the pat- - tern, as described in the section entitled "Newline conventions" above. - Note that the end of this type of comment is a literal newline sequence - in the pattern; escape sequences that happen to represent a newline do - not count. For example, consider this pattern when PCRE_EXTENDED is - set, and the default newline convention is in force: - - abc #comment \n still comment - - On encountering the # character, pcre_compile() skips along, looking - for a newline in the pattern. The sequence \n is still literal at this - stage, so it does not terminate the comment. Only an actual character - with the code value 0x0a (the default newline) does so. - - -RECURSIVE PATTERNS - - Consider the problem of matching a string in parentheses, allowing for - unlimited nested parentheses. Without the use of recursion, the best - that can be done is to use a pattern that matches up to some fixed - depth of nesting. It is not possible to handle an arbitrary nesting - depth. - - For some time, Perl has provided a facility that allows regular expres- - sions to recurse (amongst other things). It does this by interpolating - Perl code in the expression at run time, and the code can refer to the - expression itself. A Perl pattern using code interpolation to solve the - parentheses problem can be created like this: - - $re = qr{\( (?: (?>[^()]+) | (?p{$re}) )* \)}x; - - The (?p{...}) item interpolates Perl code at run time, and in this case - refers recursively to the pattern in which it appears. - - Obviously, PCRE cannot support the interpolation of Perl code. Instead, - it supports special syntax for recursion of the entire pattern, and - also for individual subpattern recursion. After its introduction in - PCRE and Python, this kind of recursion was subsequently introduced - into Perl at release 5.10. - - A special item that consists of (? followed by a number greater than - zero and a closing parenthesis is a recursive subroutine call of the - subpattern of the given number, provided that it occurs inside that - subpattern. (If not, it is a non-recursive subroutine call, which is - described in the next section.) The special item (?R) or (?0) is a - recursive call of the entire regular expression. - - This PCRE pattern solves the nested parentheses problem (assume the - PCRE_EXTENDED option is set so that white space is ignored): - - \( ( [^()]++ | (?R) )* \) - - First it matches an opening parenthesis. Then it matches any number of - substrings which can either be a sequence of non-parentheses, or a - recursive match of the pattern itself (that is, a correctly parenthe- - sized substring). Finally there is a closing parenthesis. Note the use - of a possessive quantifier to avoid backtracking into sequences of non- - parentheses. - - If this were part of a larger pattern, you would not want to recurse - the entire pattern, so instead you could use this: - - ( \( ( [^()]++ | (?1) )* \) ) - - We have put the pattern into parentheses, and caused the recursion to - refer to them instead of the whole pattern. - - In a larger pattern, keeping track of parenthesis numbers can be - tricky. This is made easier by the use of relative references. Instead - of (?1) in the pattern above you can write (?-2) to refer to the second - most recently opened parentheses preceding the recursion. In other - words, a negative number counts capturing parentheses leftwards from - the point at which it is encountered. - - It is also possible to refer to subsequently opened parentheses, by - writing references such as (?+2). However, these cannot be recursive - because the reference is not inside the parentheses that are refer- - enced. They are always non-recursive subroutine calls, as described in - the next section. - - An alternative approach is to use named parentheses instead. The Perl - syntax for this is (?&name); PCRE's earlier syntax (?P>name) is also - supported. We could rewrite the above example as follows: - - (? \( ( [^()]++ | (?&pn) )* \) ) - - If there is more than one subpattern with the same name, the earliest - one is used. - - This particular example pattern that we have been looking at contains - nested unlimited repeats, and so the use of a possessive quantifier for - matching strings of non-parentheses is important when applying the pat- - tern to strings that do not match. For example, when this pattern is - applied to - - (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa() - - it yields "no match" quickly. However, if a possessive quantifier is - not used, the match runs for a very long time indeed because there are - so many different ways the + and * repeats can carve up the subject, - and all have to be tested before failure can be reported. - - At the end of a match, the values of capturing parentheses are those - from the outermost level. If you want to obtain intermediate values, a - callout function can be used (see below and the pcrecallout documenta- - tion). If the pattern above is matched against - - (ab(cd)ef) - - the value for the inner capturing parentheses (numbered 2) is "ef", - which is the last value taken on at the top level. If a capturing sub- - pattern is not matched at the top level, its final captured value is - unset, even if it was (temporarily) set at a deeper level during the - matching process. - - If there are more than 15 capturing parentheses in a pattern, PCRE has - to obtain extra memory to store data during a recursion, which it does - by using pcre_malloc, freeing it via pcre_free afterwards. If no memory - can be obtained, the match fails with the PCRE_ERROR_NOMEMORY error. - - Do not confuse the (?R) item with the condition (R), which tests for - recursion. Consider this pattern, which matches text in angle brack- - ets, allowing for arbitrary nesting. Only digits are allowed in nested - brackets (that is, when recursing), whereas any characters are permit- - ted at the outer level. - - < (?: (?(R) \d++ | [^<>]*+) | (?R)) * > - - In this pattern, (?(R) is the start of a conditional subpattern, with - two different alternatives for the recursive and non-recursive cases. - The (?R) item is the actual recursive call. - - Differences in recursion processing between PCRE and Perl - - Recursion processing in PCRE differs from Perl in two important ways. - In PCRE (like Python, but unlike Perl), a recursive subpattern call is - always treated as an atomic group. That is, once it has matched some of - the subject string, it is never re-entered, even if it contains untried - alternatives and there is a subsequent matching failure. This can be - illustrated by the following pattern, which purports to match a palin- - dromic string that contains an odd number of characters (for example, - "a", "aba", "abcba", "abcdcba"): - - ^(.|(.)(?1)\2)$ - - The idea is that it either matches a single character, or two identical - characters surrounding a sub-palindrome. In Perl, this pattern works; - in PCRE it does not if the pattern is longer than three characters. - Consider the subject string "abcba": - - At the top level, the first character is matched, but as it is not at - the end of the string, the first alternative fails; the second alterna- - tive is taken and the recursion kicks in. The recursive call to subpat- - tern 1 successfully matches the next character ("b"). (Note that the - beginning and end of line tests are not part of the recursion). - - Back at the top level, the next character ("c") is compared with what - subpattern 2 matched, which was "a". This fails. Because the recursion - is treated as an atomic group, there are now no backtracking points, - and so the entire match fails. (Perl is able, at this point, to re- - enter the recursion and try the second alternative.) However, if the - pattern is written with the alternatives in the other order, things are - different: - - ^((.)(?1)\2|.)$ - - This time, the recursing alternative is tried first, and continues to - recurse until it runs out of characters, at which point the recursion - fails. But this time we do have another alternative to try at the - higher level. That is the big difference: in the previous case the - remaining alternative is at a deeper recursion level, which PCRE cannot - use. - - To change the pattern so that it matches all palindromic strings, not - just those with an odd number of characters, it is tempting to change - the pattern to this: - - ^((.)(?1)\2|.?)$ - - Again, this works in Perl, but not in PCRE, and for the same reason. - When a deeper recursion has matched a single character, it cannot be - entered again in order to match an empty string. The solution is to - separate the two cases, and write out the odd and even cases as alter- - natives at the higher level: - - ^(?:((.)(?1)\2|)|((.)(?3)\4|.)) - - If you want to match typical palindromic phrases, the pattern has to - ignore all non-word characters, which can be done like this: - - ^\W*+(?:((.)\W*+(?1)\W*+\2|)|((.)\W*+(?3)\W*+\4|\W*+.\W*+))\W*+$ - - If run with the PCRE_CASELESS option, this pattern matches phrases such - as "A man, a plan, a canal: Panama!" and it works well in both PCRE and - Perl. Note the use of the possessive quantifier *+ to avoid backtrack- - ing into sequences of non-word characters. Without this, PCRE takes a - great deal longer (ten times or more) to match typical phrases, and - Perl takes so long that you think it has gone into a loop. - - WARNING: The palindrome-matching patterns above work only if the sub- - ject string does not start with a palindrome that is shorter than the - entire string. For example, although "abcba" is correctly matched, if - the subject is "ababa", PCRE finds the palindrome "aba" at the start, - then fails at top level because the end of the string does not follow. - Once again, it cannot jump back into the recursion to try other alter- - natives, so the entire match fails. - - The second way in which PCRE and Perl differ in their recursion pro- - cessing is in the handling of captured values. In Perl, when a subpat- - tern is called recursively or as a subpattern (see the next section), - it has no access to any values that were captured outside the recur- - sion, whereas in PCRE these values can be referenced. Consider this - pattern: - - ^(.)(\1|a(?2)) - - In PCRE, this pattern matches "bab". The first capturing parentheses - match "b", then in the second group, when the back reference \1 fails - to match "b", the second alternative matches "a" and then recurses. In - the recursion, \1 does now match "b" and so the whole match succeeds. - In Perl, the pattern fails to match because inside the recursive call - \1 cannot access the externally set value. - - -SUBPATTERNS AS SUBROUTINES - - If the syntax for a recursive subpattern call (either by number or by - name) is used outside the parentheses to which it refers, it operates - like a subroutine in a programming language. The called subpattern may - be defined before or after the reference. A numbered reference can be - absolute or relative, as in these examples: - - (...(absolute)...)...(?2)... - (...(relative)...)...(?-1)... - (...(?+1)...(relative)... - - An earlier example pointed out that the pattern - - (sens|respons)e and \1ibility - - matches "sense and sensibility" and "response and responsibility", but - not "sense and responsibility". If instead the pattern - - (sens|respons)e and (?1)ibility - - is used, it does match "sense and responsibility" as well as the other - two strings. Another example is given in the discussion of DEFINE - above. - - All subroutine calls, whether recursive or not, are always treated as - atomic groups. That is, once a subroutine has matched some of the sub- - ject string, it is never re-entered, even if it contains untried alter- - natives and there is a subsequent matching failure. Any capturing - parentheses that are set during the subroutine call revert to their - previous values afterwards. - - Processing options such as case-independence are fixed when a subpat- - tern is defined, so if it is used as a subroutine, such options cannot - be changed for different calls. For example, consider this pattern: - - (abc)(?i:(?-1)) - - It matches "abcabc". It does not match "abcABC" because the change of - processing option does not affect the called subpattern. - - -ONIGURUMA SUBROUTINE SYNTAX - - For compatibility with Oniguruma, the non-Perl syntax \g followed by a - name or a number enclosed either in angle brackets or single quotes, is - an alternative syntax for referencing a subpattern as a subroutine, - possibly recursively. Here are two of the examples used above, rewrit- - ten using this syntax: - - (? \( ( (?>[^()]+) | \g )* \) ) - (sens|respons)e and \g'1'ibility - - PCRE supports an extension to Oniguruma: if a number is preceded by a - plus or a minus sign it is taken as a relative reference. For example: - - (abc)(?i:\g<-1>) - - Note that \g{...} (Perl syntax) and \g<...> (Oniguruma syntax) are not - synonymous. The former is a back reference; the latter is a subroutine - call. - - -CALLOUTS - - Perl has a feature whereby using the sequence (?{...}) causes arbitrary - Perl code to be obeyed in the middle of matching a regular expression. - This makes it possible, amongst other things, to extract different sub- - strings that match the same pair of parentheses when there is a repeti- - tion. - - PCRE provides a similar feature, but of course it cannot obey arbitrary - Perl code. The feature is called "callout". The caller of PCRE provides - an external function by putting its entry point in the global variable - pcre_callout (8-bit library) or pcre[16|32]_callout (16-bit or 32-bit - library). By default, this variable contains NULL, which disables all - calling out. - - Within a regular expression, (?C) indicates the points at which the - external function is to be called. If you want to identify different - callout points, you can put a number less than 256 after the letter C. - The default value is zero. For example, this pattern has two callout - points: - - (?C1)abc(?C2)def - - If the PCRE_AUTO_CALLOUT flag is passed to a compiling function, call- - outs are automatically installed before each item in the pattern. They - are all numbered 255. If there is a conditional group in the pattern - whose condition is an assertion, an additional callout is inserted just - before the condition. An explicit callout may also be set at this posi- - tion, as in this example: - - (?(?C9)(?=a)abc|def) - - Note that this applies only to assertion conditions, not to other types - of condition. - - During matching, when PCRE reaches a callout point, the external func- - tion is called. It is provided with the number of the callout, the - position in the pattern, and, optionally, one item of data originally - supplied by the caller of the matching function. The callout function - may cause matching to proceed, to backtrack, or to fail altogether. - - By default, PCRE implements a number of optimizations at compile time - and matching time, and one side-effect is that sometimes callouts are - skipped. If you need all possible callouts to happen, you need to set - options that disable the relevant optimizations. More details, and a - complete description of the interface to the callout function, are - given in the pcrecallout documentation. - - -BACKTRACKING CONTROL - - Perl 5.10 introduced a number of "Special Backtracking Control Verbs", - which are still described in the Perl documentation as "experimental - and subject to change or removal in a future version of Perl". It goes - on to say: "Their usage in production code should be noted to avoid - problems during upgrades." The same remarks apply to the PCRE features - described in this section. - - The new verbs make use of what was previously invalid syntax: an open- - ing parenthesis followed by an asterisk. They are generally of the form - (*VERB) or (*VERB:NAME). Some may take either form, possibly behaving - differently depending on whether or not a name is present. A name is - any sequence of characters that does not include a closing parenthesis. - The maximum length of name is 255 in the 8-bit library and 65535 in the - 16-bit and 32-bit libraries. If the name is empty, that is, if the - closing parenthesis immediately follows the colon, the effect is as if - the colon were not there. Any number of these verbs may occur in a - pattern. - - Since these verbs are specifically related to backtracking, most of - them can be used only when the pattern is to be matched using one of - the traditional matching functions, because these use a backtracking - algorithm. With the exception of (*FAIL), which behaves like a failing - negative assertion, the backtracking control verbs cause an error if - encountered by a DFA matching function. - - The behaviour of these verbs in repeated groups, assertions, and in - subpatterns called as subroutines (whether or not recursively) is docu- - mented below. - - Optimizations that affect backtracking verbs - - PCRE contains some optimizations that are used to speed up matching by - running some checks at the start of each match attempt. For example, it - may know the minimum length of matching subject, or that a particular - character must be present. When one of these optimizations bypasses the - running of a match, any included backtracking verbs will not, of - course, be processed. You can suppress the start-of-match optimizations - by setting the PCRE_NO_START_OPTIMIZE option when calling pcre_com- - pile() or pcre_exec(), or by starting the pattern with (*NO_START_OPT). - There is more discussion of this option in the section entitled "Option - bits for pcre_exec()" in the pcreapi documentation. - - Experiments with Perl suggest that it too has similar optimizations, - sometimes leading to anomalous results. - - Verbs that act immediately - - The following verbs act as soon as they are encountered. They may not - be followed by a name. - - (*ACCEPT) - - This verb causes the match to end successfully, skipping the remainder - of the pattern. However, when it is inside a subpattern that is called - as a subroutine, only that subpattern is ended successfully. Matching - then continues at the outer level. If (*ACCEPT) in triggered in a posi- - tive assertion, the assertion succeeds; in a negative assertion, the - assertion fails. - - If (*ACCEPT) is inside capturing parentheses, the data so far is cap- - tured. For example: - - A((?:A|B(*ACCEPT)|C)D) - - This matches "AB", "AAD", or "ACD"; when it matches "AB", "B" is cap- - tured by the outer parentheses. - - (*FAIL) or (*F) - - This verb causes a matching failure, forcing backtracking to occur. It - is equivalent to (?!) but easier to read. The Perl documentation notes - that it is probably useful only when combined with (?{}) or (??{}). - Those are, of course, Perl features that are not present in PCRE. The - nearest equivalent is the callout feature, as for example in this pat- - tern: - - a+(?C)(*FAIL) - - A match with the string "aaaa" always fails, but the callout is taken - before each backtrack happens (in this example, 10 times). - - Recording which path was taken - - There is one verb whose main purpose is to track how a match was - arrived at, though it also has a secondary use in conjunction with - advancing the match starting point (see (*SKIP) below). - - (*MARK:NAME) or (*:NAME) - - A name is always required with this verb. There may be as many - instances of (*MARK) as you like in a pattern, and their names do not - have to be unique. - - When a match succeeds, the name of the last-encountered (*MARK:NAME), - (*PRUNE:NAME), or (*THEN:NAME) on the matching path is passed back to - the caller as described in the section entitled "Extra data for - pcre_exec()" in the pcreapi documentation. Here is an example of - pcretest output, where the /K modifier requests the retrieval and out- - putting of (*MARK) data: - - re> /X(*MARK:A)Y|X(*MARK:B)Z/K - data> XY - 0: XY - MK: A - XZ - 0: XZ - MK: B - - The (*MARK) name is tagged with "MK:" in this output, and in this exam- - ple it indicates which of the two alternatives matched. This is a more - efficient way of obtaining this information than putting each alterna- - tive in its own capturing parentheses. - - If a verb with a name is encountered in a positive assertion that is - true, the name is recorded and passed back if it is the last-encoun- - tered. This does not happen for negative assertions or failing positive - assertions. - - After a partial match or a failed match, the last encountered name in - the entire match process is returned. For example: - - re> /X(*MARK:A)Y|X(*MARK:B)Z/K - data> XP - No match, mark = B - - Note that in this unanchored example the mark is retained from the - match attempt that started at the letter "X" in the subject. Subsequent - match attempts starting at "P" and then with an empty string do not get - as far as the (*MARK) item, but nevertheless do not reset it. - - If you are interested in (*MARK) values after failed matches, you - should probably set the PCRE_NO_START_OPTIMIZE option (see above) to - ensure that the match is always attempted. - - Verbs that act after backtracking - - The following verbs do nothing when they are encountered. Matching con- - tinues with what follows, but if there is no subsequent match, causing - a backtrack to the verb, a failure is forced. That is, backtracking - cannot pass to the left of the verb. However, when one of these verbs - appears inside an atomic group or an assertion that is true, its effect - is confined to that group, because once the group has been matched, - there is never any backtracking into it. In this situation, backtrack- - ing can "jump back" to the left of the entire atomic group or asser- - tion. (Remember also, as stated above, that this localization also - applies in subroutine calls.) - - These verbs differ in exactly what kind of failure occurs when back- - tracking reaches them. The behaviour described below is what happens - when the verb is not in a subroutine or an assertion. Subsequent sec- - tions cover these special cases. - - (*COMMIT) - - This verb, which may not be followed by a name, causes the whole match - to fail outright if there is a later matching failure that causes back- - tracking to reach it. Even if the pattern is unanchored, no further - attempts to find a match by advancing the starting point take place. If - (*COMMIT) is the only backtracking verb that is encountered, once it - has been passed pcre_exec() is committed to finding a match at the cur- - rent starting point, or not at all. For example: - - a+(*COMMIT)b - - This matches "xxaab" but not "aacaab". It can be thought of as a kind - of dynamic anchor, or "I've started, so I must finish." The name of the - most recently passed (*MARK) in the path is passed back when (*COMMIT) - forces a match failure. - - If there is more than one backtracking verb in a pattern, a different - one that follows (*COMMIT) may be triggered first, so merely passing - (*COMMIT) during a match does not always guarantee that a match must be - at this starting point. - - Note that (*COMMIT) at the start of a pattern is not the same as an - anchor, unless PCRE's start-of-match optimizations are turned off, as - shown in this output from pcretest: - - re> /(*COMMIT)abc/ - data> xyzabc - 0: abc - data> xyzabc\Y - No match - - For this pattern, PCRE knows that any match must start with "a", so the - optimization skips along the subject to "a" before applying the pattern - to the first set of data. The match attempt then succeeds. In the sec- - ond set of data, the escape sequence \Y is interpreted by the pcretest - program. It causes the PCRE_NO_START_OPTIMIZE option to be set when - pcre_exec() is called. This disables the optimization that skips along - to the first character. The pattern is now applied starting at "x", and - so the (*COMMIT) causes the match to fail without trying any other - starting points. - - (*PRUNE) or (*PRUNE:NAME) - - This verb causes the match to fail at the current starting position in - the subject if there is a later matching failure that causes backtrack- - ing to reach it. If the pattern is unanchored, the normal "bumpalong" - advance to the next starting character then happens. Backtracking can - occur as usual to the left of (*PRUNE), before it is reached, or when - matching to the right of (*PRUNE), but if there is no match to the - right, backtracking cannot cross (*PRUNE). In simple cases, the use of - (*PRUNE) is just an alternative to an atomic group or possessive quan- - tifier, but there are some uses of (*PRUNE) that cannot be expressed in - any other way. In an anchored pattern (*PRUNE) has the same effect as - (*COMMIT). - - The behaviour of (*PRUNE:NAME) is the not the same as - (*MARK:NAME)(*PRUNE). It is like (*MARK:NAME) in that the name is - remembered for passing back to the caller. However, (*SKIP:NAME) - searches only for names set with (*MARK). - - (*SKIP) - - This verb, when given without a name, is like (*PRUNE), except that if - the pattern is unanchored, the "bumpalong" advance is not to the next - character, but to the position in the subject where (*SKIP) was encoun- - tered. (*SKIP) signifies that whatever text was matched leading up to - it cannot be part of a successful match. Consider: - - a+(*SKIP)b - - If the subject is "aaaac...", after the first match attempt fails - (starting at the first character in the string), the starting point - skips on to start the next attempt at "c". Note that a possessive quan- - tifer does not have the same effect as this example; although it would - suppress backtracking during the first match attempt, the second - attempt would start at the second character instead of skipping on to - "c". - - (*SKIP:NAME) - - When (*SKIP) has an associated name, its behaviour is modified. When it - is triggered, the previous path through the pattern is searched for the - most recent (*MARK) that has the same name. If one is found, the - "bumpalong" advance is to the subject position that corresponds to that - (*MARK) instead of to where (*SKIP) was encountered. If no (*MARK) with - a matching name is found, the (*SKIP) is ignored. - - Note that (*SKIP:NAME) searches only for names set by (*MARK:NAME). It - ignores names that are set by (*PRUNE:NAME) or (*THEN:NAME). - - (*THEN) or (*THEN:NAME) - - This verb causes a skip to the next innermost alternative when back- - tracking reaches it. That is, it cancels any further backtracking - within the current alternative. Its name comes from the observation - that it can be used for a pattern-based if-then-else block: - - ( COND1 (*THEN) FOO | COND2 (*THEN) BAR | COND3 (*THEN) BAZ ) ... - - If the COND1 pattern matches, FOO is tried (and possibly further items - after the end of the group if FOO succeeds); on failure, the matcher - skips to the second alternative and tries COND2, without backtracking - into COND1. If that succeeds and BAR fails, COND3 is tried. If subse- - quently BAZ fails, there are no more alternatives, so there is a back- - track to whatever came before the entire group. If (*THEN) is not - inside an alternation, it acts like (*PRUNE). - - The behaviour of (*THEN:NAME) is the not the same as - (*MARK:NAME)(*THEN). It is like (*MARK:NAME) in that the name is - remembered for passing back to the caller. However, (*SKIP:NAME) - searches only for names set with (*MARK). - - A subpattern that does not contain a | character is just a part of the - enclosing alternative; it is not a nested alternation with only one - alternative. The effect of (*THEN) extends beyond such a subpattern to - the enclosing alternative. Consider this pattern, where A, B, etc. are - complex pattern fragments that do not contain any | characters at this - level: - - A (B(*THEN)C) | D - - If A and B are matched, but there is a failure in C, matching does not - backtrack into A; instead it moves to the next alternative, that is, D. - However, if the subpattern containing (*THEN) is given an alternative, - it behaves differently: - - A (B(*THEN)C | (*FAIL)) | D - - The effect of (*THEN) is now confined to the inner subpattern. After a - failure in C, matching moves to (*FAIL), which causes the whole subpat- - tern to fail because there are no more alternatives to try. In this - case, matching does now backtrack into A. - - Note that a conditional subpattern is not considered as having two - alternatives, because only one is ever used. In other words, the | - character in a conditional subpattern has a different meaning. Ignoring - white space, consider: - - ^.*? (?(?=a) a | b(*THEN)c ) - - If the subject is "ba", this pattern does not match. Because .*? is - ungreedy, it initially matches zero characters. The condition (?=a) - then fails, the character "b" is matched, but "c" is not. At this - point, matching does not backtrack to .*? as might perhaps be expected - from the presence of the | character. The conditional subpattern is - part of the single alternative that comprises the whole pattern, and so - the match fails. (If there was a backtrack into .*?, allowing it to - match "b", the match would succeed.) - - The verbs just described provide four different "strengths" of control - when subsequent matching fails. (*THEN) is the weakest, carrying on the - match at the next alternative. (*PRUNE) comes next, failing the match - at the current starting position, but allowing an advance to the next - character (for an unanchored pattern). (*SKIP) is similar, except that - the advance may be more than one character. (*COMMIT) is the strongest, - causing the entire match to fail. - - More than one backtracking verb - - If more than one backtracking verb is present in a pattern, the one - that is backtracked onto first acts. For example, consider this pat- - tern, where A, B, etc. are complex pattern fragments: - - (A(*COMMIT)B(*THEN)C|ABD) - - If A matches but B fails, the backtrack to (*COMMIT) causes the entire - match to fail. However, if A and B match, but C fails, the backtrack to - (*THEN) causes the next alternative (ABD) to be tried. This behaviour - is consistent, but is not always the same as Perl's. It means that if - two or more backtracking verbs appear in succession, all the the last - of them has no effect. Consider this example: - - ...(*COMMIT)(*PRUNE)... - - If there is a matching failure to the right, backtracking onto (*PRUNE) - causes it to be triggered, and its action is taken. There can never be - a backtrack onto (*COMMIT). - - Backtracking verbs in repeated groups - - PCRE differs from Perl in its handling of backtracking verbs in - repeated groups. For example, consider: - - /(a(*COMMIT)b)+ac/ - - If the subject is "abac", Perl matches, but PCRE fails because the - (*COMMIT) in the second repeat of the group acts. - - Backtracking verbs in assertions - - (*FAIL) in an assertion has its normal effect: it forces an immediate - backtrack. - - (*ACCEPT) in a positive assertion causes the assertion to succeed with- - out any further processing. In a negative assertion, (*ACCEPT) causes - the assertion to fail without any further processing. - - The other backtracking verbs are not treated specially if they appear - in a positive assertion. In particular, (*THEN) skips to the next - alternative in the innermost enclosing group that has alternations, - whether or not this is within the assertion. - - Negative assertions are, however, different, in order to ensure that - changing a positive assertion into a negative assertion changes its - result. Backtracking into (*COMMIT), (*SKIP), or (*PRUNE) causes a neg- - ative assertion to be true, without considering any further alternative - branches in the assertion. Backtracking into (*THEN) causes it to skip - to the next enclosing alternative within the assertion (the normal be- - haviour), but if the assertion does not have such an alternative, - (*THEN) behaves like (*PRUNE). - - Backtracking verbs in subroutines - - These behaviours occur whether or not the subpattern is called recur- - sively. Perl's treatment of subroutines is different in some cases. - - (*FAIL) in a subpattern called as a subroutine has its normal effect: - it forces an immediate backtrack. - - (*ACCEPT) in a subpattern called as a subroutine causes the subroutine - match to succeed without any further processing. Matching then contin- - ues after the subroutine call. - - (*COMMIT), (*SKIP), and (*PRUNE) in a subpattern called as a subroutine - cause the subroutine match to fail. - - (*THEN) skips to the next alternative in the innermost enclosing group - within the subpattern that has alternatives. If there is no such group - within the subpattern, (*THEN) causes the subroutine match to fail. - - -SEE ALSO - - pcreapi(3), pcrecallout(3), pcrematching(3), pcresyntax(3), pcre(3), - pcre16(3), pcre32(3). - - -AUTHOR - - Philip Hazel - University Computing Service - Cambridge CB2 3QH, England. - - -REVISION - - Last updated: 23 October 2016 - Copyright (c) 1997-2016 University of Cambridge. ------------------------------------------------------------------------------- - - -PCRESYNTAX(3) Library Functions Manual PCRESYNTAX(3) - - - -NAME - PCRE - Perl-compatible regular expressions - -PCRE REGULAR EXPRESSION SYNTAX SUMMARY - - The full syntax and semantics of the regular expressions that are sup- - ported by PCRE are described in the pcrepattern documentation. This - document contains a quick-reference summary of the syntax. - - -QUOTING - - \x where x is non-alphanumeric is a literal x - \Q...\E treat enclosed characters as literal - - -CHARACTERS - - \a alarm, that is, the BEL character (hex 07) - \cx "control-x", where x is any ASCII character - \e escape (hex 1B) - \f form feed (hex 0C) - \n newline (hex 0A) - \r carriage return (hex 0D) - \t tab (hex 09) - \0dd character with octal code 0dd - \ddd character with octal code ddd, or backreference - \o{ddd..} character with octal code ddd.. - \xhh character with hex code hh - \x{hhh..} character with hex code hhh.. - - Note that \0dd is always an octal code, and that \8 and \9 are the lit- - eral characters "8" and "9". - - -CHARACTER TYPES - - . any character except newline; - in dotall mode, any character whatsoever - \C one data unit, even in UTF mode (best avoided) - \d a decimal digit - \D a character that is not a decimal digit - \h a horizontal white space character - \H a character that is not a horizontal white space character - \N a character that is not a newline - \p{xx} a character with the xx property - \P{xx} a character without the xx property - \R a newline sequence - \s a white space character - \S a character that is not a white space character - \v a vertical white space character - \V a character that is not a vertical white space character - \w a "word" character - \W a "non-word" character - \X a Unicode extended grapheme cluster - - By default, \d, \s, and \w match only ASCII characters, even in UTF-8 - mode or in the 16- bit and 32-bit libraries. However, if locale-spe- - cific matching is happening, \s and \w may also match characters with - code points in the range 128-255. If the PCRE_UCP option is set, the - behaviour of these escape sequences is changed to use Unicode proper- - ties and they match many more characters. - - -GENERAL CATEGORY PROPERTIES FOR \p and \P - - C Other - Cc Control - Cf Format - Cn Unassigned - Co Private use - Cs Surrogate - - L Letter - Ll Lower case letter - Lm Modifier letter - Lo Other letter - Lt Title case letter - Lu Upper case letter - L& Ll, Lu, or Lt - - M Mark - Mc Spacing mark - Me Enclosing mark - Mn Non-spacing mark - - N Number - Nd Decimal number - Nl Letter number - No Other number - - P Punctuation - Pc Connector punctuation - Pd Dash punctuation - Pe Close punctuation - Pf Final punctuation - Pi Initial punctuation - Po Other punctuation - Ps Open punctuation - - S Symbol - Sc Currency symbol - Sk Modifier symbol - Sm Mathematical symbol - So Other symbol - - Z Separator - Zl Line separator - Zp Paragraph separator - Zs Space separator - - -PCRE SPECIAL CATEGORY PROPERTIES FOR \p and \P - - Xan Alphanumeric: union of properties L and N - Xps POSIX space: property Z or tab, NL, VT, FF, CR - Xsp Perl space: property Z or tab, NL, VT, FF, CR - Xuc Univerally-named character: one that can be - represented by a Universal Character Name - Xwd Perl word: property Xan or underscore - - Perl and POSIX space are now the same. Perl added VT to its space char- - acter set at release 5.18 and PCRE changed at release 8.34. - - -SCRIPT NAMES FOR \p AND \P - - Arabic, Armenian, Avestan, Balinese, Bamum, Bassa_Vah, Batak, Bengali, - Bopomofo, Brahmi, Braille, Buginese, Buhid, Canadian_Aboriginal, Car- - ian, Caucasian_Albanian, Chakma, Cham, Cherokee, Common, Coptic, Cunei- - form, Cypriot, Cyrillic, Deseret, Devanagari, Duployan, Egyptian_Hiero- - glyphs, Elbasan, Ethiopic, Georgian, Glagolitic, Gothic, Grantha, - Greek, Gujarati, Gurmukhi, Han, Hangul, Hanunoo, Hebrew, Hiragana, - Imperial_Aramaic, Inherited, Inscriptional_Pahlavi, Inscrip- - tional_Parthian, Javanese, Kaithi, Kannada, Katakana, Kayah_Li, - Kharoshthi, Khmer, Khojki, Khudawadi, Lao, Latin, Lepcha, Limbu, Lin- - ear_A, Linear_B, Lisu, Lycian, Lydian, Mahajani, Malayalam, Mandaic, - Manichaean, Meetei_Mayek, Mende_Kikakui, Meroitic_Cursive, - Meroitic_Hieroglyphs, Miao, Modi, Mongolian, Mro, Myanmar, Nabataean, - New_Tai_Lue, Nko, Ogham, Ol_Chiki, Old_Italic, Old_North_Arabian, - Old_Permic, Old_Persian, Old_South_Arabian, Old_Turkic, Oriya, Osmanya, - Pahawh_Hmong, Palmyrene, Pau_Cin_Hau, Phags_Pa, Phoenician, - Psalter_Pahlavi, Rejang, Runic, Samaritan, Saurashtra, Sharada, Sha- - vian, Siddham, Sinhala, Sora_Sompeng, Sundanese, Syloti_Nagri, Syriac, - Tagalog, Tagbanwa, Tai_Le, Tai_Tham, Tai_Viet, Takri, Tamil, Telugu, - Thaana, Thai, Tibetan, Tifinagh, Tirhuta, Ugaritic, Vai, Warang_Citi, - Yi. - - -CHARACTER CLASSES - - [...] positive character class - [^...] negative character class - [x-y] range (can be used for hex characters) - [[:xxx:]] positive POSIX named set - [[:^xxx:]] negative POSIX named set - - alnum alphanumeric - alpha alphabetic - ascii 0-127 - blank space or tab - cntrl control character - digit decimal digit - graph printing, excluding space - lower lower case letter - print printing, including space - punct printing, excluding alphanumeric - space white space - upper upper case letter - word same as \w - xdigit hexadecimal digit - - In PCRE, POSIX character set names recognize only ASCII characters by - default, but some of them use Unicode properties if PCRE_UCP is set. - You can use \Q...\E inside a character class. - - -QUANTIFIERS - - ? 0 or 1, greedy - ?+ 0 or 1, possessive - ?? 0 or 1, lazy - * 0 or more, greedy - *+ 0 or more, possessive - *? 0 or more, lazy - + 1 or more, greedy - ++ 1 or more, possessive - +? 1 or more, lazy - {n} exactly n - {n,m} at least n, no more than m, greedy - {n,m}+ at least n, no more than m, possessive - {n,m}? at least n, no more than m, lazy - {n,} n or more, greedy - {n,}+ n or more, possessive - {n,}? n or more, lazy - - -ANCHORS AND SIMPLE ASSERTIONS - - \b word boundary - \B not a word boundary - ^ start of subject - also after internal newline in multiline mode - \A start of subject - $ end of subject - also before newline at end of subject - also before internal newline in multiline mode - \Z end of subject - also before newline at end of subject - \z end of subject - \G first matching position in subject - - -MATCH POINT RESET - - \K reset start of match - - \K is honoured in positive assertions, but ignored in negative ones. - - -ALTERNATION - - expr|expr|expr... - - -CAPTURING - - (...) capturing group - (?...) named capturing group (Perl) - (?'name'...) named capturing group (Perl) - (?P...) named capturing group (Python) - (?:...) non-capturing group - (?|...) non-capturing group; reset group numbers for - capturing groups in each alternative - - -ATOMIC GROUPS - - (?>...) atomic, non-capturing group - - -COMMENT - - (?#....) comment (not nestable) - - -OPTION SETTING - - (?i) caseless - (?J) allow duplicate names - (?m) multiline - (?s) single line (dotall) - (?U) default ungreedy (lazy) - (?x) extended (ignore white space) - (?-...) unset option(s) - - The following are recognized only at the very start of a pattern or - after one of the newline or \R options with similar syntax. More than - one of them may appear. - - (*LIMIT_MATCH=d) set the match limit to d (decimal number) - (*LIMIT_RECURSION=d) set the recursion limit to d (decimal number) - (*NO_AUTO_POSSESS) no auto-possessification (PCRE_NO_AUTO_POSSESS) - (*NO_START_OPT) no start-match optimization (PCRE_NO_START_OPTIMIZE) - (*UTF8) set UTF-8 mode: 8-bit library (PCRE_UTF8) - (*UTF16) set UTF-16 mode: 16-bit library (PCRE_UTF16) - (*UTF32) set UTF-32 mode: 32-bit library (PCRE_UTF32) - (*UTF) set appropriate UTF mode for the library in use - (*UCP) set PCRE_UCP (use Unicode properties for \d etc) - - Note that LIMIT_MATCH and LIMIT_RECURSION can only reduce the value of - the limits set by the caller of pcre_exec(), not increase them. - - -NEWLINE CONVENTION - - These are recognized only at the very start of the pattern or after - option settings with a similar syntax. - - (*CR) carriage return only - (*LF) linefeed only - (*CRLF) carriage return followed by linefeed - (*ANYCRLF) all three of the above - (*ANY) any Unicode newline sequence - - -WHAT \R MATCHES - - These are recognized only at the very start of the pattern or after - option setting with a similar syntax. - - (*BSR_ANYCRLF) CR, LF, or CRLF - (*BSR_UNICODE) any Unicode newline sequence - - -LOOKAHEAD AND LOOKBEHIND ASSERTIONS - - (?=...) positive look ahead - (?!...) negative look ahead - (?<=...) positive look behind - (? reference by name (Perl) - \k'name' reference by name (Perl) - \g{name} reference by name (Perl) - \k{name} reference by name (.NET) - (?P=name) reference by name (Python) - - -SUBROUTINE REFERENCES (POSSIBLY RECURSIVE) - - (?R) recurse whole pattern - (?n) call subpattern by absolute number - (?+n) call subpattern by relative number - (?-n) call subpattern by relative number - (?&name) call subpattern by name (Perl) - (?P>name) call subpattern by name (Python) - \g call subpattern by name (Oniguruma) - \g'name' call subpattern by name (Oniguruma) - \g call subpattern by absolute number (Oniguruma) - \g'n' call subpattern by absolute number (Oniguruma) - \g<+n> call subpattern by relative number (PCRE extension) - \g'+n' call subpattern by relative number (PCRE extension) - \g<-n> call subpattern by relative number (PCRE extension) - \g'-n' call subpattern by relative number (PCRE extension) - - -CONDITIONAL PATTERNS - - (?(condition)yes-pattern) - (?(condition)yes-pattern|no-pattern) - - (?(n)... absolute reference condition - (?(+n)... relative reference condition - (?(-n)... relative reference condition - (?()... named reference condition (Perl) - (?('name')... named reference condition (Perl) - (?(name)... named reference condition (PCRE) - (?(R)... overall recursion condition - (?(Rn)... specific group recursion condition - (?(R&name)... specific recursion condition - (?(DEFINE)... define subpattern for reference - (?(assert)... assertion condition - - -BACKTRACKING CONTROL - - The following act immediately they are reached: - - (*ACCEPT) force successful match - (*FAIL) force backtrack; synonym (*F) - (*MARK:NAME) set name to be passed back; synonym (*:NAME) - - The following act only when a subsequent match failure causes a back- - track to reach them. They all force a match failure, but they differ in - what happens afterwards. Those that advance the start-of-match point do - so only if the pattern is not anchored. - - (*COMMIT) overall failure, no advance of starting point - (*PRUNE) advance to next starting character - (*PRUNE:NAME) equivalent to (*MARK:NAME)(*PRUNE) - (*SKIP) advance to current matching position - (*SKIP:NAME) advance to position corresponding to an earlier - (*MARK:NAME); if not found, the (*SKIP) is ignored - (*THEN) local failure, backtrack to next alternation - (*THEN:NAME) equivalent to (*MARK:NAME)(*THEN) - - -CALLOUTS - - (?C) callout - (?Cn) callout with data n - - -SEE ALSO - - pcrepattern(3), pcreapi(3), pcrecallout(3), pcrematching(3), pcre(3). - - -AUTHOR - - Philip Hazel - University Computing Service - Cambridge CB2 3QH, England. - - -REVISION - - Last updated: 08 January 2014 - Copyright (c) 1997-2014 University of Cambridge. ------------------------------------------------------------------------------- - - -PCREUNICODE(3) Library Functions Manual PCREUNICODE(3) - - - -NAME - PCRE - Perl-compatible regular expressions - -UTF-8, UTF-16, UTF-32, AND UNICODE PROPERTY SUPPORT - - As well as UTF-8 support, PCRE also supports UTF-16 (from release 8.30) - and UTF-32 (from release 8.32), by means of two additional libraries. - They can be built as well as, or instead of, the 8-bit library. - - -UTF-8 SUPPORT - - In order process UTF-8 strings, you must build PCRE's 8-bit library - with UTF support, and, in addition, you must call pcre_compile() with - the PCRE_UTF8 option flag, or the pattern must start with the sequence - (*UTF8) or (*UTF). When either of these is the case, both the pattern - and any subject strings that are matched against it are treated as - UTF-8 strings instead of strings of individual 1-byte characters. - - -UTF-16 AND UTF-32 SUPPORT - - In order process UTF-16 or UTF-32 strings, you must build PCRE's 16-bit - or 32-bit library with UTF support, and, in addition, you must call - pcre16_compile() or pcre32_compile() with the PCRE_UTF16 or PCRE_UTF32 - option flag, as appropriate. Alternatively, the pattern must start with - the sequence (*UTF16), (*UTF32), as appropriate, or (*UTF), which can - be used with either library. When UTF mode is set, both the pattern and - any subject strings that are matched against it are treated as UTF-16 - or UTF-32 strings instead of strings of individual 16-bit or 32-bit - characters. - - -UTF SUPPORT OVERHEAD - - If you compile PCRE with UTF support, but do not use it at run time, - the library will be a bit bigger, but the additional run time overhead - is limited to testing the PCRE_UTF[8|16|32] flag occasionally, so - should not be very big. - - -UNICODE PROPERTY SUPPORT - - If PCRE is built with Unicode character property support (which implies - UTF support), the escape sequences \p{..}, \P{..}, and \X can be used. - The available properties that can be tested are limited to the general - category properties such as Lu for an upper case letter or Nd for a - decimal number, the Unicode script names such as Arabic or Han, and the - derived properties Any and L&. Full lists is given in the pcrepattern - and pcresyntax documentation. Only the short names for properties are - supported. For example, \p{L} matches a letter. Its Perl synonym, - \p{Letter}, is not supported. Furthermore, in Perl, many properties - may optionally be prefixed by "Is", for compatibility with Perl 5.6. - PCRE does not support this. - - Validity of UTF-8 strings - - When you set the PCRE_UTF8 flag, the byte strings passed as patterns - and subjects are (by default) checked for validity on entry to the rel- - evant functions. The entire string is checked before any other process- - ing takes place. From release 7.3 of PCRE, the check is according the - rules of RFC 3629, which are themselves derived from the Unicode speci- - fication. Earlier releases of PCRE followed the rules of RFC 2279, - which allows the full range of 31-bit values (0 to 0x7FFFFFFF). The - current check allows only values in the range U+0 to U+10FFFF, exclud- - ing the surrogate area. (From release 8.33 the so-called "non-charac- - ter" code points are no longer excluded because Unicode corrigendum #9 - makes it clear that they should not be.) - - Characters in the "Surrogate Area" of Unicode are reserved for use by - UTF-16, where they are used in pairs to encode codepoints with values - greater than 0xFFFF. The code points that are encoded by UTF-16 pairs - are available independently in the UTF-8 and UTF-32 encodings. (In - other words, the whole surrogate thing is a fudge for UTF-16 which - unfortunately messes up UTF-8 and UTF-32.) - - If an invalid UTF-8 string is passed to PCRE, an error return is given. - At compile time, the only additional information is the offset to the - first byte of the failing character. The run-time functions pcre_exec() - and pcre_dfa_exec() also pass back this information, as well as a more - detailed reason code if the caller has provided memory in which to do - this. - - In some situations, you may already know that your strings are valid, - and therefore want to skip these checks in order to improve perfor- - mance, for example in the case of a long subject string that is being - scanned repeatedly. If you set the PCRE_NO_UTF8_CHECK flag at compile - time or at run time, PCRE assumes that the pattern or subject it is - given (respectively) contains only valid UTF-8 codes. In this case, it - does not diagnose an invalid UTF-8 string. - - Note that passing PCRE_NO_UTF8_CHECK to pcre_compile() just disables - the check for the pattern; it does not also apply to subject strings. - If you want to disable the check for a subject string you must pass - this option to pcre_exec() or pcre_dfa_exec(). - - If you pass an invalid UTF-8 string when PCRE_NO_UTF8_CHECK is set, the - result is undefined and your program may crash. - - Validity of UTF-16 strings - - When you set the PCRE_UTF16 flag, the strings of 16-bit data units that - are passed as patterns and subjects are (by default) checked for valid- - ity on entry to the relevant functions. Values other than those in the - surrogate range U+D800 to U+DFFF are independent code points. Values in - the surrogate range must be used in pairs in the correct manner. - - If an invalid UTF-16 string is passed to PCRE, an error return is - given. At compile time, the only additional information is the offset - to the first data unit of the failing character. The run-time functions - pcre16_exec() and pcre16_dfa_exec() also pass back this information, as - well as a more detailed reason code if the caller has provided memory - in which to do this. - - In some situations, you may already know that your strings are valid, - and therefore want to skip these checks in order to improve perfor- - mance. If you set the PCRE_NO_UTF16_CHECK flag at compile time or at - run time, PCRE assumes that the pattern or subject it is given (respec- - tively) contains only valid UTF-16 sequences. In this case, it does not - diagnose an invalid UTF-16 string. However, if an invalid string is - passed, the result is undefined. - - Validity of UTF-32 strings - - When you set the PCRE_UTF32 flag, the strings of 32-bit data units that - are passed as patterns and subjects are (by default) checked for valid- - ity on entry to the relevant functions. This check allows only values - in the range U+0 to U+10FFFF, excluding the surrogate area U+D800 to - U+DFFF. - - If an invalid UTF-32 string is passed to PCRE, an error return is - given. At compile time, the only additional information is the offset - to the first data unit of the failing character. The run-time functions - pcre32_exec() and pcre32_dfa_exec() also pass back this information, as - well as a more detailed reason code if the caller has provided memory - in which to do this. - - In some situations, you may already know that your strings are valid, - and therefore want to skip these checks in order to improve perfor- - mance. If you set the PCRE_NO_UTF32_CHECK flag at compile time or at - run time, PCRE assumes that the pattern or subject it is given (respec- - tively) contains only valid UTF-32 sequences. In this case, it does not - diagnose an invalid UTF-32 string. However, if an invalid string is - passed, the result is undefined. - - General comments about UTF modes - - 1. Codepoints less than 256 can be specified in patterns by either - braced or unbraced hexadecimal escape sequences (for example, \x{b3} or - \xb3). Larger values have to use braced sequences. - - 2. Octal numbers up to \777 are recognized, and in UTF-8 mode they - match two-byte characters for values greater than \177. - - 3. Repeat quantifiers apply to complete UTF characters, not to individ- - ual data units, for example: \x{100}{3}. - - 4. The dot metacharacter matches one UTF character instead of a single - data unit. - - 5. The escape sequence \C can be used to match a single byte in UTF-8 - mode, or a single 16-bit data unit in UTF-16 mode, or a single 32-bit - data unit in UTF-32 mode, but its use can lead to some strange effects - because it breaks up multi-unit characters (see the description of \C - in the pcrepattern documentation). The use of \C is not supported in - the alternative matching function pcre[16|32]_dfa_exec(), nor is it - supported in UTF mode by the JIT optimization of pcre[16|32]_exec(). If - JIT optimization is requested for a UTF pattern that contains \C, it - will not succeed, and so the matching will be carried out by the normal - interpretive function. - - 6. The character escapes \b, \B, \d, \D, \s, \S, \w, and \W correctly - test characters of any code value, but, by default, the characters that - PCRE recognizes as digits, spaces, or word characters remain the same - set as in non-UTF mode, all with values less than 256. This remains - true even when PCRE is built to include Unicode property support, - because to do otherwise would slow down PCRE in many common cases. Note - in particular that this applies to \b and \B, because they are defined - in terms of \w and \W. If you really want to test for a wider sense of, - say, "digit", you can use explicit Unicode property tests such as - \p{Nd}. Alternatively, if you set the PCRE_UCP option, the way that the - character escapes work is changed so that Unicode properties are used - to determine which characters match. There are more details in the sec- - tion on generic character types in the pcrepattern documentation. - - 7. Similarly, characters that match the POSIX named character classes - are all low-valued characters, unless the PCRE_UCP option is set. - - 8. However, the horizontal and vertical white space matching escapes - (\h, \H, \v, and \V) do match all the appropriate Unicode characters, - whether or not PCRE_UCP is set. - - 9. Case-insensitive matching applies only to characters whose values - are less than 128, unless PCRE is built with Unicode property support. - A few Unicode characters such as Greek sigma have more than two code- - points that are case-equivalent. Up to and including PCRE release 8.31, - only one-to-one case mappings were supported, but later releases (with - Unicode property support) do treat as case-equivalent all versions of - characters such as Greek sigma. - - -AUTHOR - - Philip Hazel - University Computing Service - Cambridge CB2 3QH, England. - - -REVISION - - Last updated: 27 February 2013 - Copyright (c) 1997-2013 University of Cambridge. ------------------------------------------------------------------------------- - - -PCREJIT(3) Library Functions Manual PCREJIT(3) - - - -NAME - PCRE - Perl-compatible regular expressions - -PCRE JUST-IN-TIME COMPILER SUPPORT - - Just-in-time compiling is a heavyweight optimization that can greatly - speed up pattern matching. However, it comes at the cost of extra pro- - cessing before the match is performed. Therefore, it is of most benefit - when the same pattern is going to be matched many times. This does not - necessarily mean many calls of a matching function; if the pattern is - not anchored, matching attempts may take place many times at various - positions in the subject, even for a single call. Therefore, if the - subject string is very long, it may still pay to use JIT for one-off - matches. - - JIT support applies only to the traditional Perl-compatible matching - function. It does not apply when the DFA matching function is being - used. The code for this support was written by Zoltan Herczeg. - - -8-BIT, 16-BIT AND 32-BIT SUPPORT - - JIT support is available for all of the 8-bit, 16-bit and 32-bit PCRE - libraries. To keep this documentation simple, only the 8-bit interface - is described in what follows. If you are using the 16-bit library, sub- - stitute the 16-bit functions and 16-bit structures (for example, - pcre16_jit_stack instead of pcre_jit_stack). If you are using the - 32-bit library, substitute the 32-bit functions and 32-bit structures - (for example, pcre32_jit_stack instead of pcre_jit_stack). - - -AVAILABILITY OF JIT SUPPORT - - JIT support is an optional feature of PCRE. The "configure" option - --enable-jit (or equivalent CMake option) must be set when PCRE is - built if you want to use JIT. The support is limited to the following - hardware platforms: - - ARM v5, v7, and Thumb2 - Intel x86 32-bit and 64-bit - MIPS 32-bit - Power PC 32-bit and 64-bit - SPARC 32-bit (experimental) - - If --enable-jit is set on an unsupported platform, compilation fails. - - A program that is linked with PCRE 8.20 or later can tell if JIT sup- - port is available by calling pcre_config() with the PCRE_CONFIG_JIT - option. The result is 1 when JIT is available, and 0 otherwise. How- - ever, a simple program does not need to check this in order to use JIT. - The normal API is implemented in a way that falls back to the interpre- - tive code if JIT is not available. For programs that need the best pos- - sible performance, there is also a "fast path" API that is JIT-spe- - cific. - - If your program may sometimes be linked with versions of PCRE that are - older than 8.20, but you want to use JIT when it is available, you can - test the values of PCRE_MAJOR and PCRE_MINOR, or the existence of a JIT - macro such as PCRE_CONFIG_JIT, for compile-time control of your code. - Also beware that the pcre_jit_exec() function was not available at all - before 8.32, and may not be available at all if PCRE isn't compiled - with --enable-jit. See the "JIT FAST PATH API" section below for - details. - - -SIMPLE USE OF JIT - - You have to do two things to make use of the JIT support in the sim- - plest way: - - (1) Call pcre_study() with the PCRE_STUDY_JIT_COMPILE option for - each compiled pattern, and pass the resulting pcre_extra block to - pcre_exec(). - - (2) Use pcre_free_study() to free the pcre_extra block when it is - no longer needed, instead of just freeing it yourself. This - ensures that - any JIT data is also freed. - - For a program that may be linked with pre-8.20 versions of PCRE, you - can insert - - #ifndef PCRE_STUDY_JIT_COMPILE - #define PCRE_STUDY_JIT_COMPILE 0 - #endif - - so that no option is passed to pcre_study(), and then use something - like this to free the study data: - - #ifdef PCRE_CONFIG_JIT - pcre_free_study(study_ptr); - #else - pcre_free(study_ptr); - #endif - - PCRE_STUDY_JIT_COMPILE requests the JIT compiler to generate code for - complete matches. If you want to run partial matches using the - PCRE_PARTIAL_HARD or PCRE_PARTIAL_SOFT options of pcre_exec(), you - should set one or both of the following options in addition to, or - instead of, PCRE_STUDY_JIT_COMPILE when you call pcre_study(): - - PCRE_STUDY_JIT_PARTIAL_HARD_COMPILE - PCRE_STUDY_JIT_PARTIAL_SOFT_COMPILE - - If using pcre_jit_exec() and supporting a pre-8.32 version of PCRE, you - can insert: - - #if PCRE_MAJOR >= 8 && PCRE_MINOR >= 32 - pcre_jit_exec(...); - #else - pcre_exec(...) - #endif - - but as described in the "JIT FAST PATH API" section below this assumes - version 8.32 and later are compiled with --enable-jit, which may break. - - The JIT compiler generates different optimized code for each of the - three modes (normal, soft partial, hard partial). When pcre_exec() is - called, the appropriate code is run if it is available. Otherwise, the - pattern is matched using interpretive code. - - In some circumstances you may need to call additional functions. These - are described in the section entitled "Controlling the JIT stack" - below. - - If JIT support is not available, PCRE_STUDY_JIT_COMPILE etc. are - ignored, and no JIT data is created. Otherwise, the compiled pattern is - passed to the JIT compiler, which turns it into machine code that exe- - cutes much faster than the normal interpretive code. When pcre_exec() - is passed a pcre_extra block containing a pointer to JIT code of the - appropriate mode (normal or hard/soft partial), it obeys that code - instead of running the interpreter. The result is identical, but the - compiled JIT code runs much faster. - - There are some pcre_exec() options that are not supported for JIT exe- - cution. There are also some pattern items that JIT cannot handle. - Details are given below. In both cases, execution automatically falls - back to the interpretive code. If you want to know whether JIT was - actually used for a particular match, you should arrange for a JIT - callback function to be set up as described in the section entitled - "Controlling the JIT stack" below, even if you do not need to supply a - non-default JIT stack. Such a callback function is called whenever JIT - code is about to be obeyed. If the execution options are not right for - JIT execution, the callback function is not obeyed. - - If the JIT compiler finds an unsupported item, no JIT data is gener- - ated. You can find out if JIT execution is available after studying a - pattern by calling pcre_fullinfo() with the PCRE_INFO_JIT option. A - result of 1 means that JIT compilation was successful. A result of 0 - means that JIT support is not available, or the pattern was not studied - with PCRE_STUDY_JIT_COMPILE etc., or the JIT compiler was not able to - handle the pattern. - - Once a pattern has been studied, with or without JIT, it can be used as - many times as you like for matching different subject strings. - - -UNSUPPORTED OPTIONS AND PATTERN ITEMS - - The only pcre_exec() options that are supported for JIT execution are - PCRE_NO_UTF8_CHECK, PCRE_NO_UTF16_CHECK, PCRE_NO_UTF32_CHECK, PCRE_NOT- - BOL, PCRE_NOTEOL, PCRE_NOTEMPTY, PCRE_NOTEMPTY_ATSTART, PCRE_PAR- - TIAL_HARD, and PCRE_PARTIAL_SOFT. - - The only unsupported pattern items are \C (match a single data unit) - when running in a UTF mode, and a callout immediately before an asser- - tion condition in a conditional group. - - -RETURN VALUES FROM JIT EXECUTION - - When a pattern is matched using JIT execution, the return values are - the same as those given by the interpretive pcre_exec() code, with the - addition of one new error code: PCRE_ERROR_JIT_STACKLIMIT. This means - that the memory used for the JIT stack was insufficient. See "Control- - ling the JIT stack" below for a discussion of JIT stack usage. For com- - patibility with the interpretive pcre_exec() code, no more than two- - thirds of the ovector argument is used for passing back captured sub- - strings. - - The error code PCRE_ERROR_MATCHLIMIT is returned by the JIT code if - searching a very large pattern tree goes on for too long, as it is in - the same circumstance when JIT is not used, but the details of exactly - what is counted are not the same. The PCRE_ERROR_RECURSIONLIMIT error - code is never returned by JIT execution. - - -SAVING AND RESTORING COMPILED PATTERNS - - The code that is generated by the JIT compiler is architecture-spe- - cific, and is also position dependent. For those reasons it cannot be - saved (in a file or database) and restored later like the bytecode and - other data of a compiled pattern. Saving and restoring compiled pat- - terns is not something many people do. More detail about this facility - is given in the pcreprecompile documentation. It should be possible to - run pcre_study() on a saved and restored pattern, and thereby recreate - the JIT data, but because JIT compilation uses significant resources, - it is probably not worth doing this; you might as well recompile the - original pattern. - - -CONTROLLING THE JIT STACK - - When the compiled JIT code runs, it needs a block of memory to use as a - stack. By default, it uses 32K on the machine stack. However, some - large or complicated patterns need more than this. The error - PCRE_ERROR_JIT_STACKLIMIT is given when there is not enough stack. - Three functions are provided for managing blocks of memory for use as - JIT stacks. There is further discussion about the use of JIT stacks in - the section entitled "JIT stack FAQ" below. - - The pcre_jit_stack_alloc() function creates a JIT stack. Its arguments - are a starting size and a maximum size, and it returns a pointer to an - opaque structure of type pcre_jit_stack, or NULL if there is an error. - The pcre_jit_stack_free() function can be used to free a stack that is - no longer needed. (For the technically minded: the address space is - allocated by mmap or VirtualAlloc.) - - JIT uses far less memory for recursion than the interpretive code, and - a maximum stack size of 512K to 1M should be more than enough for any - pattern. - - The pcre_assign_jit_stack() function specifies which stack JIT code - should use. Its arguments are as follows: - - pcre_extra *extra - pcre_jit_callback callback - void *data - - The extra argument must be the result of studying a pattern with - PCRE_STUDY_JIT_COMPILE etc. There are three cases for the values of the - other two options: - - (1) If callback is NULL and data is NULL, an internal 32K block - on the machine stack is used. - - (2) If callback is NULL and data is not NULL, data must be - a valid JIT stack, the result of calling pcre_jit_stack_alloc(). - - (3) If callback is not NULL, it must point to a function that is - called with data as an argument at the start of matching, in - order to set up a JIT stack. If the return from the callback - function is NULL, the internal 32K stack is used; otherwise the - return value must be a valid JIT stack, the result of calling - pcre_jit_stack_alloc(). - - A callback function is obeyed whenever JIT code is about to be run; it - is not obeyed when pcre_exec() is called with options that are incom- - patible for JIT execution. A callback function can therefore be used to - determine whether a match operation was executed by JIT or by the - interpreter. - - You may safely use the same JIT stack for more than one pattern (either - by assigning directly or by callback), as long as the patterns are all - matched sequentially in the same thread. In a multithread application, - if you do not specify a JIT stack, or if you assign or pass back NULL - from a callback, that is thread-safe, because each thread has its own - machine stack. However, if you assign or pass back a non-NULL JIT - stack, this must be a different stack for each thread so that the - application is thread-safe. - - Strictly speaking, even more is allowed. You can assign the same non- - NULL stack to any number of patterns as long as they are not used for - matching by multiple threads at the same time. For example, you can - assign the same stack to all compiled patterns, and use a global mutex - in the callback to wait until the stack is available for use. However, - this is an inefficient solution, and not recommended. - - This is a suggestion for how a multithreaded program that needs to set - up non-default JIT stacks might operate: - - During thread initalization - thread_local_var = pcre_jit_stack_alloc(...) - - During thread exit - pcre_jit_stack_free(thread_local_var) - - Use a one-line callback function - return thread_local_var - - All the functions described in this section do nothing if JIT is not - available, and pcre_assign_jit_stack() does nothing unless the extra - argument is non-NULL and points to a pcre_extra block that is the - result of a successful study with PCRE_STUDY_JIT_COMPILE etc. - - -JIT STACK FAQ - - (1) Why do we need JIT stacks? - - PCRE (and JIT) is a recursive, depth-first engine, so it needs a stack - where the local data of the current node is pushed before checking its - child nodes. Allocating real machine stack on some platforms is diffi- - cult. For example, the stack chain needs to be updated every time if we - extend the stack on PowerPC. Although it is possible, its updating - time overhead decreases performance. So we do the recursion in memory. - - (2) Why don't we simply allocate blocks of memory with malloc()? - - Modern operating systems have a nice feature: they can reserve an - address space instead of allocating memory. We can safely allocate mem- - ory pages inside this address space, so the stack could grow without - moving memory data (this is important because of pointers). Thus we can - allocate 1M address space, and use only a single memory page (usually - 4K) if that is enough. However, we can still grow up to 1M anytime if - needed. - - (3) Who "owns" a JIT stack? - - The owner of the stack is the user program, not the JIT studied pattern - or anything else. The user program must ensure that if a stack is used - by pcre_exec(), (that is, it is assigned to the pattern currently run- - ning), that stack must not be used by any other threads (to avoid over- - writing the same memory area). The best practice for multithreaded pro- - grams is to allocate a stack for each thread, and return this stack - through the JIT callback function. - - (4) When should a JIT stack be freed? - - You can free a JIT stack at any time, as long as it will not be used by - pcre_exec() again. When you assign the stack to a pattern, only a - pointer is set. There is no reference counting or any other magic. You - can free the patterns and stacks in any order, anytime. Just do not - call pcre_exec() with a pattern pointing to an already freed stack, as - that will cause SEGFAULT. (Also, do not free a stack currently used by - pcre_exec() in another thread). You can also replace the stack for a - pattern at any time. You can even free the previous stack before - assigning a replacement. - - (5) Should I allocate/free a stack every time before/after calling - pcre_exec()? - - No, because this is too costly in terms of resources. However, you - could implement some clever idea which release the stack if it is not - used in let's say two minutes. The JIT callback can help to achieve - this without keeping a list of the currently JIT studied patterns. - - (6) OK, the stack is for long term memory allocation. But what happens - if a pattern causes stack overflow with a stack of 1M? Is that 1M kept - until the stack is freed? - - Especially on embedded sytems, it might be a good idea to release mem- - ory sometimes without freeing the stack. There is no API for this at - the moment. Probably a function call which returns with the currently - allocated memory for any stack and another which allows releasing mem- - ory (shrinking the stack) would be a good idea if someone needs this. - - (7) This is too much of a headache. Isn't there any better solution for - JIT stack handling? - - No, thanks to Windows. If POSIX threads were used everywhere, we could - throw out this complicated API. - - -EXAMPLE CODE - - This is a single-threaded example that specifies a JIT stack without - using a callback. - - int rc; - int ovector[30]; - pcre *re; - pcre_extra *extra; - pcre_jit_stack *jit_stack; - - re = pcre_compile(pattern, 0, &error, &erroffset, NULL); - /* Check for errors */ - extra = pcre_study(re, PCRE_STUDY_JIT_COMPILE, &error); - jit_stack = pcre_jit_stack_alloc(32*1024, 512*1024); - /* Check for error (NULL) */ - pcre_assign_jit_stack(extra, NULL, jit_stack); - rc = pcre_exec(re, extra, subject, length, 0, 0, ovector, 30); - /* Check results */ - pcre_free(re); - pcre_free_study(extra); - pcre_jit_stack_free(jit_stack); - - -JIT FAST PATH API - - Because the API described above falls back to interpreted execution - when JIT is not available, it is convenient for programs that are writ- - ten for general use in many environments. However, calling JIT via - pcre_exec() does have a performance impact. Programs that are written - for use where JIT is known to be available, and which need the best - possible performance, can instead use a "fast path" API to call JIT - execution directly instead of calling pcre_exec() (obviously only for - patterns that have been successfully studied by JIT). - - The fast path function is called pcre_jit_exec(), and it takes exactly - the same arguments as pcre_exec(), plus one additional argument that - must point to a JIT stack. The JIT stack arrangements described above - do not apply. The return values are the same as for pcre_exec(). - - When you call pcre_exec(), as well as testing for invalid options, a - number of other sanity checks are performed on the arguments. For exam- - ple, if the subject pointer is NULL, or its length is negative, an - immediate error is given. Also, unless PCRE_NO_UTF[8|16|32] is set, a - UTF subject string is tested for validity. In the interests of speed, - these checks do not happen on the JIT fast path, and if invalid data is - passed, the result is undefined. - - Bypassing the sanity checks and the pcre_exec() wrapping can give - speedups of more than 10%. - - Note that the pcre_jit_exec() function is not available in versions of - PCRE before 8.32 (released in November 2012). If you need to support - versions that old you must either use the slower pcre_exec(), or switch - between the two codepaths by checking the values of PCRE_MAJOR and - PCRE_MINOR. - - Due to an unfortunate implementation oversight, even in versions 8.32 - and later there will be no pcre_jit_exec() stub function defined when - PCRE is compiled with --disable-jit, which is the default, and there's - no way to detect whether PCRE was compiled with --enable-jit via a - macro. - - If you need to support versions older than 8.32, or versions that may - not build with --enable-jit, you must either use the slower - pcre_exec(), or switch between the two codepaths by checking the values - of PCRE_MAJOR and PCRE_MINOR. - - Switching between the two by checking the version assumes that all the - versions being targeted are built with --enable-jit. To also support - builds that may use --disable-jit either pcre_exec() must be used, or a - compile-time check for JIT via pcre_config() (which assumes the runtime - environment will be the same), or as the Git project decided to do, - simply assume that pcre_jit_exec() is present in 8.32 or later unless a - compile-time flag is provided, see the "grep: un-break building with - PCRE >= 8.32 without --enable-jit" commit in git.git for an example of - that. - - -SEE ALSO - - pcreapi(3) - - -AUTHOR - - Philip Hazel (FAQ by Zoltan Herczeg) - University Computing Service - Cambridge CB2 3QH, England. - - -REVISION - - Last updated: 05 July 2017 - Copyright (c) 1997-2017 University of Cambridge. ------------------------------------------------------------------------------- - - -PCREPARTIAL(3) Library Functions Manual PCREPARTIAL(3) - - - -NAME - PCRE - Perl-compatible regular expressions - -PARTIAL MATCHING IN PCRE - - In normal use of PCRE, if the subject string that is passed to a match- - ing function matches as far as it goes, but is too short to match the - entire pattern, PCRE_ERROR_NOMATCH is returned. There are circumstances - where it might be helpful to distinguish this case from other cases in - which there is no match. - - Consider, for example, an application where a human is required to type - in data for a field with specific formatting requirements. An example - might be a date in the form ddmmmyy, defined by this pattern: - - ^\d?\d(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)\d\d$ - - If the application sees the user's keystrokes one by one, and can check - that what has been typed so far is potentially valid, it is able to - raise an error as soon as a mistake is made, by beeping and not - reflecting the character that has been typed, for example. This immedi- - ate feedback is likely to be a better user interface than a check that - is delayed until the entire string has been entered. Partial matching - can also be useful when the subject string is very long and is not all - available at once. - - PCRE supports partial matching by means of the PCRE_PARTIAL_SOFT and - PCRE_PARTIAL_HARD options, which can be set when calling any of the - matching functions. For backwards compatibility, PCRE_PARTIAL is a syn- - onym for PCRE_PARTIAL_SOFT. The essential difference between the two - options is whether or not a partial match is preferred to an alterna- - tive complete match, though the details differ between the two types of - matching function. If both options are set, PCRE_PARTIAL_HARD takes - precedence. - - If you want to use partial matching with just-in-time optimized code, - you must call pcre_study(), pcre16_study() or pcre32_study() with one - or both of these options: - - PCRE_STUDY_JIT_PARTIAL_SOFT_COMPILE - PCRE_STUDY_JIT_PARTIAL_HARD_COMPILE - - PCRE_STUDY_JIT_COMPILE should also be set if you are going to run non- - partial matches on the same pattern. If the appropriate JIT study mode - has not been set for a match, the interpretive matching code is used. - - Setting a partial matching option disables two of PCRE's standard opti- - mizations. PCRE remembers the last literal data unit in a pattern, and - abandons matching immediately if it is not present in the subject - string. This optimization cannot be used for a subject string that - might match only partially. If the pattern was studied, PCRE knows the - minimum length of a matching string, and does not bother to run the - matching function on shorter strings. This optimization is also dis- - abled for partial matching. - - -PARTIAL MATCHING USING pcre_exec() OR pcre[16|32]_exec() - - A partial match occurs during a call to pcre_exec() or - pcre[16|32]_exec() when the end of the subject string is reached suc- - cessfully, but matching cannot continue because more characters are - needed. However, at least one character in the subject must have been - inspected. This character need not form part of the final matched - string; lookbehind assertions and the \K escape sequence provide ways - of inspecting characters before the start of a matched substring. The - requirement for inspecting at least one character exists because an - empty string can always be matched; without such a restriction there - would always be a partial match of an empty string at the end of the - subject. - - If there are at least two slots in the offsets vector when a partial - match is returned, the first slot is set to the offset of the earliest - character that was inspected. For convenience, the second offset points - to the end of the subject so that a substring can easily be identified. - If there are at least three slots in the offsets vector, the third slot - is set to the offset of the character where matching started. - - For the majority of patterns, the contents of the first and third slots - will be the same. However, for patterns that contain lookbehind asser- - tions, or begin with \b or \B, characters before the one where matching - started may have been inspected while carrying out the match. For exam- - ple, consider this pattern: - - /(?<=abc)123/ - - This pattern matches "123", but only if it is preceded by "abc". If the - subject string is "xyzabc12", the first two offsets after a partial - match are for the substring "abc12", because all these characters were - inspected. However, the third offset is set to 6, because that is the - offset where matching began. - - What happens when a partial match is identified depends on which of the - two partial matching options are set. - - PCRE_PARTIAL_SOFT WITH pcre_exec() OR pcre[16|32]_exec() - - If PCRE_PARTIAL_SOFT is set when pcre_exec() or pcre[16|32]_exec() - identifies a partial match, the partial match is remembered, but match- - ing continues as normal, and other alternatives in the pattern are - tried. If no complete match can be found, PCRE_ERROR_PARTIAL is - returned instead of PCRE_ERROR_NOMATCH. - - This option is "soft" because it prefers a complete match over a par- - tial match. All the various matching items in a pattern behave as if - the subject string is potentially complete. For example, \z, \Z, and $ - match at the end of the subject, as normal, and for \b and \B the end - of the subject is treated as a non-alphanumeric. - - If there is more than one partial match, the first one that was found - provides the data that is returned. Consider this pattern: - - /123\w+X|dogY/ - - If this is matched against the subject string "abc123dog", both alter- - natives fail to match, but the end of the subject is reached during - matching, so PCRE_ERROR_PARTIAL is returned. The offsets are set to 3 - and 9, identifying "123dog" as the first partial match that was found. - (In this example, there are two partial matches, because "dog" on its - own partially matches the second alternative.) - - PCRE_PARTIAL_HARD WITH pcre_exec() OR pcre[16|32]_exec() - - If PCRE_PARTIAL_HARD is set for pcre_exec() or pcre[16|32]_exec(), - PCRE_ERROR_PARTIAL is returned as soon as a partial match is found, - without continuing to search for possible complete matches. This option - is "hard" because it prefers an earlier partial match over a later com- - plete match. For this reason, the assumption is made that the end of - the supplied subject string may not be the true end of the available - data, and so, if \z, \Z, \b, \B, or $ are encountered at the end of the - subject, the result is PCRE_ERROR_PARTIAL, provided that at least one - character in the subject has been inspected. - - Setting PCRE_PARTIAL_HARD also affects the way UTF-8 and UTF-16 subject - strings are checked for validity. Normally, an invalid sequence causes - the error PCRE_ERROR_BADUTF8 or PCRE_ERROR_BADUTF16. However, in the - special case of a truncated character at the end of the subject, - PCRE_ERROR_SHORTUTF8 or PCRE_ERROR_SHORTUTF16 is returned when - PCRE_PARTIAL_HARD is set. - - Comparing hard and soft partial matching - - The difference between the two partial matching options can be illus- - trated by a pattern such as: - - /dog(sbody)?/ - - This matches either "dog" or "dogsbody", greedily (that is, it prefers - the longer string if possible). If it is matched against the string - "dog" with PCRE_PARTIAL_SOFT, it yields a complete match for "dog". - However, if PCRE_PARTIAL_HARD is set, the result is PCRE_ERROR_PARTIAL. - On the other hand, if the pattern is made ungreedy the result is dif- - ferent: - - /dog(sbody)??/ - - In this case the result is always a complete match because that is - found first, and matching never continues after finding a complete - match. It might be easier to follow this explanation by thinking of the - two patterns like this: - - /dog(sbody)?/ is the same as /dogsbody|dog/ - /dog(sbody)??/ is the same as /dog|dogsbody/ - - The second pattern will never match "dogsbody", because it will always - find the shorter match first. - - -PARTIAL MATCHING USING pcre_dfa_exec() OR pcre[16|32]_dfa_exec() - - The DFA functions move along the subject string character by character, - without backtracking, searching for all possible matches simultane- - ously. If the end of the subject is reached before the end of the pat- - tern, there is the possibility of a partial match, again provided that - at least one character has been inspected. - - When PCRE_PARTIAL_SOFT is set, PCRE_ERROR_PARTIAL is returned only if - there have been no complete matches. Otherwise, the complete matches - are returned. However, if PCRE_PARTIAL_HARD is set, a partial match - takes precedence over any complete matches. The portion of the string - that was inspected when the longest partial match was found is set as - the first matching string, provided there are at least two slots in the - offsets vector. - - Because the DFA functions always search for all possible matches, and - there is no difference between greedy and ungreedy repetition, their - behaviour is different from the standard functions when PCRE_PAR- - TIAL_HARD is set. Consider the string "dog" matched against the - ungreedy pattern shown above: - - /dog(sbody)??/ - - Whereas the standard functions stop as soon as they find the complete - match for "dog", the DFA functions also find the partial match for - "dogsbody", and so return that when PCRE_PARTIAL_HARD is set. - - -PARTIAL MATCHING AND WORD BOUNDARIES - - If a pattern ends with one of sequences \b or \B, which test for word - boundaries, partial matching with PCRE_PARTIAL_SOFT can give counter- - intuitive results. Consider this pattern: - - /\bcat\b/ - - This matches "cat", provided there is a word boundary at either end. If - the subject string is "the cat", the comparison of the final "t" with a - following character cannot take place, so a partial match is found. - However, normal matching carries on, and \b matches at the end of the - subject when the last character is a letter, so a complete match is - found. The result, therefore, is not PCRE_ERROR_PARTIAL. Using - PCRE_PARTIAL_HARD in this case does yield PCRE_ERROR_PARTIAL, because - then the partial match takes precedence. - - -FORMERLY RESTRICTED PATTERNS - - For releases of PCRE prior to 8.00, because of the way certain internal - optimizations were implemented in the pcre_exec() function, the - PCRE_PARTIAL option (predecessor of PCRE_PARTIAL_SOFT) could not be - used with all patterns. From release 8.00 onwards, the restrictions no - longer apply, and partial matching with can be requested for any pat- - tern. - - Items that were formerly restricted were repeated single characters and - repeated metasequences. If PCRE_PARTIAL was set for a pattern that did - not conform to the restrictions, pcre_exec() returned the error code - PCRE_ERROR_BADPARTIAL (-13). This error code is no longer in use. The - PCRE_INFO_OKPARTIAL call to pcre_fullinfo() to find out if a compiled - pattern can be used for partial matching now always returns 1. - - -EXAMPLE OF PARTIAL MATCHING USING PCRETEST - - If the escape sequence \P is present in a pcretest data line, the - PCRE_PARTIAL_SOFT option is used for the match. Here is a run of - pcretest that uses the date example quoted above: - - re> /^\d?\d(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)\d\d$/ - data> 25jun04\P - 0: 25jun04 - 1: jun - data> 25dec3\P - Partial match: 23dec3 - data> 3ju\P - Partial match: 3ju - data> 3juj\P - No match - data> j\P - No match - - The first data string is matched completely, so pcretest shows the - matched substrings. The remaining four strings do not match the com- - plete pattern, but the first two are partial matches. Similar output is - obtained if DFA matching is used. - - If the escape sequence \P is present more than once in a pcretest data - line, the PCRE_PARTIAL_HARD option is set for the match. - - -MULTI-SEGMENT MATCHING WITH pcre_dfa_exec() OR pcre[16|32]_dfa_exec() - - When a partial match has been found using a DFA matching function, it - is possible to continue the match by providing additional subject data - and calling the function again with the same compiled regular expres- - sion, this time setting the PCRE_DFA_RESTART option. You must pass the - same working space as before, because this is where details of the pre- - vious partial match are stored. Here is an example using pcretest, - using the \R escape sequence to set the PCRE_DFA_RESTART option (\D - specifies the use of the DFA matching function): - - re> /^\d?\d(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)\d\d$/ - data> 23ja\P\D - Partial match: 23ja - data> n05\R\D - 0: n05 - - The first call has "23ja" as the subject, and requests partial match- - ing; the second call has "n05" as the subject for the continued - (restarted) match. Notice that when the match is complete, only the - last part is shown; PCRE does not retain the previously partially- - matched string. It is up to the calling program to do that if it needs - to. - - That means that, for an unanchored pattern, if a continued match fails, - it is not possible to try again at a new starting point. All this - facility is capable of doing is continuing with the previous match - attempt. In the previous example, if the second set of data is "ug23" - the result is no match, even though there would be a match for "aug23" - if the entire string were given at once. Depending on the application, - this may or may not be what you want. The only way to allow for start- - ing again at the next character is to retain the matched part of the - subject and try a new complete match. - - You can set the PCRE_PARTIAL_SOFT or PCRE_PARTIAL_HARD options with - PCRE_DFA_RESTART to continue partial matching over multiple segments. - This facility can be used to pass very long subject strings to the DFA - matching functions. - - -MULTI-SEGMENT MATCHING WITH pcre_exec() OR pcre[16|32]_exec() - - From release 8.00, the standard matching functions can also be used to - do multi-segment matching. Unlike the DFA functions, it is not possible - to restart the previous match with a new segment of data. Instead, new - data must be added to the previous subject string, and the entire match - re-run, starting from the point where the partial match occurred. Ear- - lier data can be discarded. - - It is best to use PCRE_PARTIAL_HARD in this situation, because it does - not treat the end of a segment as the end of the subject when matching - \z, \Z, \b, \B, and $. Consider an unanchored pattern that matches - dates: - - re> /\d?\d(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)\d\d/ - data> The date is 23ja\P\P - Partial match: 23ja - - At this stage, an application could discard the text preceding "23ja", - add on text from the next segment, and call the matching function - again. Unlike the DFA matching functions, the entire matching string - must always be available, and the complete matching process occurs for - each call, so more memory and more processing time is needed. - - Note: If the pattern contains lookbehind assertions, or \K, or starts - with \b or \B, the string that is returned for a partial match includes - characters that precede the start of what would be returned for a com- - plete match, because it contains all the characters that were inspected - during the partial match. - - -ISSUES WITH MULTI-SEGMENT MATCHING - - Certain types of pattern may give problems with multi-segment matching, - whichever matching function is used. - - 1. If the pattern contains a test for the beginning of a line, you need - to pass the PCRE_NOTBOL option when the subject string for any call - does start at the beginning of a line. There is also a PCRE_NOTEOL - option, but in practice when doing multi-segment matching you should be - using PCRE_PARTIAL_HARD, which includes the effect of PCRE_NOTEOL. - - 2. Lookbehind assertions that have already been obeyed are catered for - in the offsets that are returned for a partial match. However a lookbe- - hind assertion later in the pattern could require even earlier charac- - ters to be inspected. You can handle this case by using the - PCRE_INFO_MAXLOOKBEHIND option of the pcre_fullinfo() or - pcre[16|32]_fullinfo() functions to obtain the length of the longest - lookbehind in the pattern. This length is given in characters, not - bytes. If you always retain at least that many characters before the - partially matched string, all should be well. (Of course, near the - start of the subject, fewer characters may be present; in that case all - characters should be retained.) - - From release 8.33, there is a more accurate way of deciding which char- - acters to retain. Instead of subtracting the length of the longest - lookbehind from the earliest inspected character (offsets[0]), the - match start position (offsets[2]) should be used, and the next match - attempt started at the offsets[2] character by setting the startoffset - argument of pcre_exec() or pcre_dfa_exec(). - - For example, if the pattern "(?<=123)abc" is partially matched against - the string "xx123a", the three offset values returned are 2, 6, and 5. - This indicates that the matching process that gave a partial match - started at offset 5, but the characters "123a" were all inspected. The - maximum lookbehind for that pattern is 3, so taking that away from 5 - shows that we need only keep "123a", and the next match attempt can be - started at offset 3 (that is, at "a") when further characters have been - added. When the match start is not the earliest inspected character, - pcretest shows it explicitly: - - re> "(?<=123)abc" - data> xx123a\P\P - Partial match at offset 5: 123a - - 3. Because a partial match must always contain at least one character, - what might be considered a partial match of an empty string actually - gives a "no match" result. For example: - - re> /c(?<=abc)x/ - data> ab\P - No match - - If the next segment begins "cx", a match should be found, but this will - only happen if characters from the previous segment are retained. For - this reason, a "no match" result should be interpreted as "partial - match of an empty string" when the pattern contains lookbehinds. - - 4. Matching a subject string that is split into multiple segments may - not always produce exactly the same result as matching over one single - long string, especially when PCRE_PARTIAL_SOFT is used. The section - "Partial Matching and Word Boundaries" above describes an issue that - arises if the pattern ends with \b or \B. Another kind of difference - may occur when there are multiple matching possibilities, because (for - PCRE_PARTIAL_SOFT) a partial match result is given only when there are - no completed matches. This means that as soon as the shortest match has - been found, continuation to a new subject segment is no longer possi- - ble. Consider again this pcretest example: - - re> /dog(sbody)?/ - data> dogsb\P - 0: dog - data> do\P\D - Partial match: do - data> gsb\R\P\D - 0: g - data> dogsbody\D - 0: dogsbody - 1: dog - - The first data line passes the string "dogsb" to a standard matching - function, setting the PCRE_PARTIAL_SOFT option. Although the string is - a partial match for "dogsbody", the result is not PCRE_ERROR_PARTIAL, - because the shorter string "dog" is a complete match. Similarly, when - the subject is presented to a DFA matching function in several parts - ("do" and "gsb" being the first two) the match stops when "dog" has - been found, and it is not possible to continue. On the other hand, if - "dogsbody" is presented as a single string, a DFA matching function - finds both matches. - - Because of these problems, it is best to use PCRE_PARTIAL_HARD when - matching multi-segment data. The example above then behaves differ- - ently: - - re> /dog(sbody)?/ - data> dogsb\P\P - Partial match: dogsb - data> do\P\D - Partial match: do - data> gsb\R\P\P\D - Partial match: gsb - - 5. Patterns that contain alternatives at the top level which do not all - start with the same pattern item may not work as expected when - PCRE_DFA_RESTART is used. For example, consider this pattern: - - 1234|3789 - - If the first part of the subject is "ABC123", a partial match of the - first alternative is found at offset 3. There is no partial match for - the second alternative, because such a match does not start at the same - point in the subject string. Attempting to continue with the string - "7890" does not yield a match because only those alternatives that - match at one point in the subject are remembered. The problem arises - because the start of the second alternative matches within the first - alternative. There is no problem with anchored patterns or patterns - such as: - - 1234|ABCD - - where no string can be a partial match for both alternatives. This is - not a problem if a standard matching function is used, because the - entire match has to be rerun each time: - - re> /1234|3789/ - data> ABC123\P\P - Partial match: 123 - data> 1237890 - 0: 3789 - - Of course, instead of using PCRE_DFA_RESTART, the same technique of re- - running the entire match can also be used with the DFA matching func- - tions. Another possibility is to work with two buffers. If a partial - match at offset n in the first buffer is followed by "no match" when - PCRE_DFA_RESTART is used on the second buffer, you can then try a new - match starting at offset n+1 in the first buffer. - - -AUTHOR - - Philip Hazel - University Computing Service - Cambridge CB2 3QH, England. - - -REVISION - - Last updated: 02 July 2013 - Copyright (c) 1997-2013 University of Cambridge. ------------------------------------------------------------------------------- - - -PCREPRECOMPILE(3) Library Functions Manual PCREPRECOMPILE(3) - - - -NAME - PCRE - Perl-compatible regular expressions - -SAVING AND RE-USING PRECOMPILED PCRE PATTERNS - - If you are running an application that uses a large number of regular - expression patterns, it may be useful to store them in a precompiled - form instead of having to compile them every time the application is - run. If you are not using any private character tables (see the - pcre_maketables() documentation), this is relatively straightforward. - If you are using private tables, it is a little bit more complicated. - However, if you are using the just-in-time optimization feature, it is - not possible to save and reload the JIT data. - - If you save compiled patterns to a file, you can copy them to a differ- - ent host and run them there. If the two hosts have different endianness - (byte order), you should run the pcre[16|32]_pat- - tern_to_host_byte_order() function on the new host before trying to - match the pattern. The matching functions return PCRE_ERROR_BADENDIAN- - NESS if they detect a pattern with the wrong endianness. - - Compiling regular expressions with one version of PCRE for use with a - different version is not guaranteed to work and may cause crashes, and - saving and restoring a compiled pattern loses any JIT optimization - data. - - -SAVING A COMPILED PATTERN - - The value returned by pcre[16|32]_compile() points to a single block of - memory that holds the compiled pattern and associated data. You can - find the length of this block in bytes by calling - pcre[16|32]_fullinfo() with an argument of PCRE_INFO_SIZE. You can then - save the data in any appropriate manner. Here is sample code for the - 8-bit library that compiles a pattern and writes it to a file. It - assumes that the variable fd refers to a file that is open for output: - - int erroroffset, rc, size; - char *error; - pcre *re; - - re = pcre_compile("my pattern", 0, &error, &erroroffset, NULL); - if (re == NULL) { ... handle errors ... } - rc = pcre_fullinfo(re, NULL, PCRE_INFO_SIZE, &size); - if (rc < 0) { ... handle errors ... } - rc = fwrite(re, 1, size, fd); - if (rc != size) { ... handle errors ... } - - In this example, the bytes that comprise the compiled pattern are - copied exactly. Note that this is binary data that may contain any of - the 256 possible byte values. On systems that make a distinction - between binary and non-binary data, be sure that the file is opened for - binary output. - - If you want to write more than one pattern to a file, you will have to - devise a way of separating them. For binary data, preceding each pat- - tern with its length is probably the most straightforward approach. - Another possibility is to write out the data in hexadecimal instead of - binary, one pattern to a line. - - Saving compiled patterns in a file is only one possible way of storing - them for later use. They could equally well be saved in a database, or - in the memory of some daemon process that passes them via sockets to - the processes that want them. - - If the pattern has been studied, it is also possible to save the normal - study data in a similar way to the compiled pattern itself. However, if - the PCRE_STUDY_JIT_COMPILE was used, the just-in-time data that is cre- - ated cannot be saved because it is too dependent on the current envi- - ronment. When studying generates additional information, - pcre[16|32]_study() returns a pointer to a pcre[16|32]_extra data - block. Its format is defined in the section on matching a pattern in - the pcreapi documentation. The study_data field points to the binary - study data, and this is what you must save (not the pcre[16|32]_extra - block itself). The length of the study data can be obtained by calling - pcre[16|32]_fullinfo() with an argument of PCRE_INFO_STUDYSIZE. Remem- - ber to check that pcre[16|32]_study() did return a non-NULL value - before trying to save the study data. - - -RE-USING A PRECOMPILED PATTERN - - Re-using a precompiled pattern is straightforward. Having reloaded it - into main memory, called pcre[16|32]_pattern_to_host_byte_order() if - necessary, you pass its pointer to pcre[16|32]_exec() or - pcre[16|32]_dfa_exec() in the usual way. - - However, if you passed a pointer to custom character tables when the - pattern was compiled (the tableptr argument of pcre[16|32]_compile()), - you must now pass a similar pointer to pcre[16|32]_exec() or - pcre[16|32]_dfa_exec(), because the value saved with the compiled pat- - tern will obviously be nonsense. A field in a pcre[16|32]_extra() block - is used to pass this data, as described in the section on matching a - pattern in the pcreapi documentation. - - Warning: The tables that pcre_exec() and pcre_dfa_exec() use must be - the same as those that were used when the pattern was compiled. If this - is not the case, the behaviour is undefined. - - If you did not provide custom character tables when the pattern was - compiled, the pointer in the compiled pattern is NULL, which causes the - matching functions to use PCRE's internal tables. Thus, you do not need - to take any special action at run time in this case. - - If you saved study data with the compiled pattern, you need to create - your own pcre[16|32]_extra data block and set the study_data field to - point to the reloaded study data. You must also set the - PCRE_EXTRA_STUDY_DATA bit in the flags field to indicate that study - data is present. Then pass the pcre[16|32]_extra block to the matching - function in the usual way. If the pattern was studied for just-in-time - optimization, that data cannot be saved, and so is lost by a - save/restore cycle. - - -COMPATIBILITY WITH DIFFERENT PCRE RELEASES - - In general, it is safest to recompile all saved patterns when you - update to a new PCRE release, though not all updates actually require - this. - - -AUTHOR - - Philip Hazel - University Computing Service - Cambridge CB2 3QH, England. - - -REVISION - - Last updated: 12 November 2013 - Copyright (c) 1997-2013 University of Cambridge. ------------------------------------------------------------------------------- - - -PCREPERFORM(3) Library Functions Manual PCREPERFORM(3) - - - -NAME - PCRE - Perl-compatible regular expressions - -PCRE PERFORMANCE - - Two aspects of performance are discussed below: memory usage and pro- - cessing time. The way you express your pattern as a regular expression - can affect both of them. - - -COMPILED PATTERN MEMORY USAGE - - Patterns are compiled by PCRE into a reasonably efficient interpretive - code, so that most simple patterns do not use much memory. However, - there is one case where the memory usage of a compiled pattern can be - unexpectedly large. If a parenthesized subpattern has a quantifier with - a minimum greater than 1 and/or a limited maximum, the whole subpattern - is repeated in the compiled code. For example, the pattern - - (abc|def){2,4} - - is compiled as if it were - - (abc|def)(abc|def)((abc|def)(abc|def)?)? - - (Technical aside: It is done this way so that backtrack points within - each of the repetitions can be independently maintained.) - - For regular expressions whose quantifiers use only small numbers, this - is not usually a problem. However, if the numbers are large, and par- - ticularly if such repetitions are nested, the memory usage can become - an embarrassment. For example, the very simple pattern - - ((ab){1,1000}c){1,3} - - uses 51K bytes when compiled using the 8-bit library. When PCRE is com- - piled with its default internal pointer size of two bytes, the size - limit on a compiled pattern is 64K data units, and this is reached with - the above pattern if the outer repetition is increased from 3 to 4. - PCRE can be compiled to use larger internal pointers and thus handle - larger compiled patterns, but it is better to try to rewrite your pat- - tern to use less memory if you can. - - One way of reducing the memory usage for such patterns is to make use - of PCRE's "subroutine" facility. Re-writing the above pattern as - - ((ab)(?2){0,999}c)(?1){0,2} - - reduces the memory requirements to 18K, and indeed it remains under 20K - even with the outer repetition increased to 100. However, this pattern - is not exactly equivalent, because the "subroutine" calls are treated - as atomic groups into which there can be no backtracking if there is a - subsequent matching failure. Therefore, PCRE cannot do this kind of - rewriting automatically. Furthermore, there is a noticeable loss of - speed when executing the modified pattern. Nevertheless, if the atomic - grouping is not a problem and the loss of speed is acceptable, this - kind of rewriting will allow you to process patterns that PCRE cannot - otherwise handle. - - -STACK USAGE AT RUN TIME - - When pcre_exec() or pcre[16|32]_exec() is used for matching, certain - kinds of pattern can cause it to use large amounts of the process - stack. In some environments the default process stack is quite small, - and if it runs out the result is often SIGSEGV. This issue is probably - the most frequently raised problem with PCRE. Rewriting your pattern - can often help. The pcrestack documentation discusses this issue in - detail. - - -PROCESSING TIME - - Certain items in regular expression patterns are processed more effi- - ciently than others. It is more efficient to use a character class like - [aeiou] than a set of single-character alternatives such as - (a|e|i|o|u). In general, the simplest construction that provides the - required behaviour is usually the most efficient. Jeffrey Friedl's book - contains a lot of useful general discussion about optimizing regular - expressions for efficient performance. This document contains a few - observations about PCRE. - - Using Unicode character properties (the \p, \P, and \X escapes) is - slow, because PCRE has to use a multi-stage table lookup whenever it - needs a character's property. If you can find an alternative pattern - that does not use character properties, it will probably be faster. - - By default, the escape sequences \b, \d, \s, and \w, and the POSIX - character classes such as [:alpha:] do not use Unicode properties, - partly for backwards compatibility, and partly for performance reasons. - However, you can set PCRE_UCP if you want Unicode character properties - to be used. This can double the matching time for items such as \d, - when matched with a traditional matching function; the performance loss - is less with a DFA matching function, and in both cases there is not - much difference for \b. - - When a pattern begins with .* not in parentheses, or in parentheses - that are not the subject of a backreference, and the PCRE_DOTALL option - is set, the pattern is implicitly anchored by PCRE, since it can match - only at the start of a subject string. However, if PCRE_DOTALL is not - set, PCRE cannot make this optimization, because the . metacharacter - does not then match a newline, and if the subject string contains new- - lines, the pattern may match from the character immediately following - one of them instead of from the very start. For example, the pattern - - .*second - - matches the subject "first\nand second" (where \n stands for a newline - character), with the match starting at the seventh character. In order - to do this, PCRE has to retry the match starting after every newline in - the subject. - - If you are using such a pattern with subject strings that do not con- - tain newlines, the best performance is obtained by setting PCRE_DOTALL, - or starting the pattern with ^.* or ^.*? to indicate explicit anchor- - ing. That saves PCRE from having to scan along the subject looking for - a newline to restart at. - - Beware of patterns that contain nested indefinite repeats. These can - take a long time to run when applied to a string that does not match. - Consider the pattern fragment - - ^(a+)* - - This can match "aaaa" in 16 different ways, and this number increases - very rapidly as the string gets longer. (The * repeat can match 0, 1, - 2, 3, or 4 times, and for each of those cases other than 0 or 4, the + - repeats can match different numbers of times.) When the remainder of - the pattern is such that the entire match is going to fail, PCRE has in - principle to try every possible variation, and this can take an - extremely long time, even for relatively short strings. - - An optimization catches some of the more simple cases such as - - (a+)*b - - where a literal character follows. Before embarking on the standard - matching procedure, PCRE checks that there is a "b" later in the sub- - ject string, and if there is not, it fails the match immediately. How- - ever, when there is no following literal this optimization cannot be - used. You can see the difference by comparing the behaviour of - - (a+)*\d - - with the pattern above. The former gives a failure almost instantly - when applied to a whole line of "a" characters, whereas the latter - takes an appreciable time with strings longer than about 20 characters. - - In many cases, the solution to this kind of performance issue is to use - an atomic group or a possessive quantifier. - - -AUTHOR - - Philip Hazel - University Computing Service - Cambridge CB2 3QH, England. - - -REVISION - - Last updated: 25 August 2012 - Copyright (c) 1997-2012 University of Cambridge. ------------------------------------------------------------------------------- - - -PCREPOSIX(3) Library Functions Manual PCREPOSIX(3) - - - -NAME - PCRE - Perl-compatible regular expressions. - -SYNOPSIS - - #include - - int regcomp(regex_t *preg, const char *pattern, - int cflags); - - int regexec(regex_t *preg, const char *string, - size_t nmatch, regmatch_t pmatch[], int eflags); - size_t regerror(int errcode, const regex_t *preg, - char *errbuf, size_t errbuf_size); - - void regfree(regex_t *preg); - - -DESCRIPTION - - This set of functions provides a POSIX-style API for the PCRE regular - expression 8-bit library. See the pcreapi documentation for a descrip- - tion of PCRE's native API, which contains much additional functional- - ity. There is no POSIX-style wrapper for PCRE's 16-bit and 32-bit - library. - - The functions described here are just wrapper functions that ultimately - call the PCRE native API. Their prototypes are defined in the - pcreposix.h header file, and on Unix systems the library itself is - called pcreposix.a, so can be accessed by adding -lpcreposix to the - command for linking an application that uses them. Because the POSIX - functions call the native ones, it is also necessary to add -lpcre. - - I have implemented only those POSIX option bits that can be reasonably - mapped to PCRE native options. In addition, the option REG_EXTENDED is - defined with the value zero. This has no effect, but since programs - that are written to the POSIX interface often use it, this makes it - easier to slot in PCRE as a replacement library. Other POSIX options - are not even defined. - - There are also some other options that are not defined by POSIX. These - have been added at the request of users who want to make use of certain - PCRE-specific features via the POSIX calling interface. - - When PCRE is called via these functions, it is only the API that is - POSIX-like in style. The syntax and semantics of the regular expres- - sions themselves are still those of Perl, subject to the setting of - various PCRE options, as described below. "POSIX-like in style" means - that the API approximates to the POSIX definition; it is not fully - POSIX-compatible, and in multi-byte encoding domains it is probably - even less compatible. - - The header for these functions is supplied as pcreposix.h to avoid any - potential clash with other POSIX libraries. It can, of course, be - renamed or aliased as regex.h, which is the "correct" name. It provides - two structure types, regex_t for compiled internal forms, and reg- - match_t for returning captured substrings. It also defines some con- - stants whose names start with "REG_"; these are used for setting - options and identifying error codes. - - -COMPILING A PATTERN - - The function regcomp() is called to compile a pattern into an internal - form. The pattern is a C string terminated by a binary zero, and is - passed in the argument pattern. The preg argument is a pointer to a - regex_t structure that is used as a base for storing information about - the compiled regular expression. - - The argument cflags is either zero, or contains one or more of the bits - defined by the following macros: - - REG_DOTALL - - The PCRE_DOTALL option is set when the regular expression is passed for - compilation to the native function. Note that REG_DOTALL is not part of - the POSIX standard. - - REG_ICASE - - The PCRE_CASELESS option is set when the regular expression is passed - for compilation to the native function. - - REG_NEWLINE - - The PCRE_MULTILINE option is set when the regular expression is passed - for compilation to the native function. Note that this does not mimic - the defined POSIX behaviour for REG_NEWLINE (see the following sec- - tion). - - REG_NOSUB - - The PCRE_NO_AUTO_CAPTURE option is set when the regular expression is - passed for compilation to the native function. In addition, when a pat- - tern that is compiled with this flag is passed to regexec() for match- - ing, the nmatch and pmatch arguments are ignored, and no captured - strings are returned. - - REG_UCP - - The PCRE_UCP option is set when the regular expression is passed for - compilation to the native function. This causes PCRE to use Unicode - properties when matchine \d, \w, etc., instead of just recognizing - ASCII values. Note that REG_UTF8 is not part of the POSIX standard. - - REG_UNGREEDY - - The PCRE_UNGREEDY option is set when the regular expression is passed - for compilation to the native function. Note that REG_UNGREEDY is not - part of the POSIX standard. - - REG_UTF8 - - The PCRE_UTF8 option is set when the regular expression is passed for - compilation to the native function. This causes the pattern itself and - all data strings used for matching it to be treated as UTF-8 strings. - Note that REG_UTF8 is not part of the POSIX standard. - - In the absence of these flags, no options are passed to the native - function. This means the the regex is compiled with PCRE default - semantics. In particular, the way it handles newline characters in the - subject string is the Perl way, not the POSIX way. Note that setting - PCRE_MULTILINE has only some of the effects specified for REG_NEWLINE. - It does not affect the way newlines are matched by . (they are not) or - by a negative class such as [^a] (they are). - - The yield of regcomp() is zero on success, and non-zero otherwise. The - preg structure is filled in on success, and one member of the structure - is public: re_nsub contains the number of capturing subpatterns in the - regular expression. Various error codes are defined in the header file. - - NOTE: If the yield of regcomp() is non-zero, you must not attempt to - use the contents of the preg structure. If, for example, you pass it to - regexec(), the result is undefined and your program is likely to crash. - - -MATCHING NEWLINE CHARACTERS - - This area is not simple, because POSIX and Perl take different views of - things. It is not possible to get PCRE to obey POSIX semantics, but - then PCRE was never intended to be a POSIX engine. The following table - lists the different possibilities for matching newline characters in - PCRE: - - Default Change with - - . matches newline no PCRE_DOTALL - newline matches [^a] yes not changeable - $ matches \n at end yes PCRE_DOLLARENDONLY - $ matches \n in middle no PCRE_MULTILINE - ^ matches \n in middle no PCRE_MULTILINE - - This is the equivalent table for POSIX: - - Default Change with - - . matches newline yes REG_NEWLINE - newline matches [^a] yes REG_NEWLINE - $ matches \n at end no REG_NEWLINE - $ matches \n in middle no REG_NEWLINE - ^ matches \n in middle no REG_NEWLINE - - PCRE's behaviour is the same as Perl's, except that there is no equiva- - lent for PCRE_DOLLAR_ENDONLY in Perl. In both PCRE and Perl, there is - no way to stop newline from matching [^a]. - - The default POSIX newline handling can be obtained by setting - PCRE_DOTALL and PCRE_DOLLAR_ENDONLY, but there is no way to make PCRE - behave exactly as for the REG_NEWLINE action. - - -MATCHING A PATTERN - - The function regexec() is called to match a compiled pattern preg - against a given string, which is by default terminated by a zero byte - (but see REG_STARTEND below), subject to the options in eflags. These - can be: - - REG_NOTBOL - - The PCRE_NOTBOL option is set when calling the underlying PCRE matching - function. - - REG_NOTEMPTY - - The PCRE_NOTEMPTY option is set when calling the underlying PCRE match- - ing function. Note that REG_NOTEMPTY is not part of the POSIX standard. - However, setting this option can give more POSIX-like behaviour in some - situations. - - REG_NOTEOL - - The PCRE_NOTEOL option is set when calling the underlying PCRE matching - function. - - REG_STARTEND - - The string is considered to start at string + pmatch[0].rm_so and to - have a terminating NUL located at string + pmatch[0].rm_eo (there need - not actually be a NUL at that location), regardless of the value of - nmatch. This is a BSD extension, compatible with but not specified by - IEEE Standard 1003.2 (POSIX.2), and should be used with caution in - software intended to be portable to other systems. Note that a non-zero - rm_so does not imply REG_NOTBOL; REG_STARTEND affects only the location - of the string, not how it is matched. - - If the pattern was compiled with the REG_NOSUB flag, no data about any - matched strings is returned. The nmatch and pmatch arguments of - regexec() are ignored. - - If the value of nmatch is zero, or if the value pmatch is NULL, no data - about any matched strings is returned. - - Otherwise,the portion of the string that was matched, and also any cap- - tured substrings, are returned via the pmatch argument, which points to - an array of nmatch structures of type regmatch_t, containing the mem- - bers rm_so and rm_eo. These contain the offset to the first character - of each substring and the offset to the first character after the end - of each substring, respectively. The 0th element of the vector relates - to the entire portion of string that was matched; subsequent elements - relate to the capturing subpatterns of the regular expression. Unused - entries in the array have both structure members set to -1. - - A successful match yields a zero return; various error codes are - defined in the header file, of which REG_NOMATCH is the "expected" - failure code. - - -ERROR MESSAGES - - The regerror() function maps a non-zero errorcode from either regcomp() - or regexec() to a printable message. If preg is not NULL, the error - should have arisen from the use of that structure. A message terminated - by a binary zero is placed in errbuf. The length of the message, - including the zero, is limited to errbuf_size. The yield of the func- - tion is the size of buffer needed to hold the whole message. - - -MEMORY USAGE - - Compiling a regular expression causes memory to be allocated and asso- - ciated with the preg structure. The function regfree() frees all such - memory, after which preg may no longer be used as a compiled expres- - sion. - - -AUTHOR - - Philip Hazel - University Computing Service - Cambridge CB2 3QH, England. - - -REVISION - - Last updated: 09 January 2012 - Copyright (c) 1997-2012 University of Cambridge. ------------------------------------------------------------------------------- - - -PCRECPP(3) Library Functions Manual PCRECPP(3) - - - -NAME - PCRE - Perl-compatible regular expressions. - -SYNOPSIS OF C++ WRAPPER - - #include - - -DESCRIPTION - - The C++ wrapper for PCRE was provided by Google Inc. Some additional - functionality was added by Giuseppe Maxia. This brief man page was con- - structed from the notes in the pcrecpp.h file, which should be con- - sulted for further details. Note that the C++ wrapper supports only the - original 8-bit PCRE library. There is no 16-bit or 32-bit support at - present. - - -MATCHING INTERFACE - - The "FullMatch" operation checks that supplied text matches a supplied - pattern exactly. If pointer arguments are supplied, it copies matched - sub-strings that match sub-patterns into them. - - Example: successful match - pcrecpp::RE re("h.*o"); - re.FullMatch("hello"); - - Example: unsuccessful match (requires full match): - pcrecpp::RE re("e"); - !re.FullMatch("hello"); - - Example: creating a temporary RE object: - pcrecpp::RE("h.*o").FullMatch("hello"); - - You can pass in a "const char*" or a "string" for "text". The examples - below tend to use a const char*. You can, as in the different examples - above, store the RE object explicitly in a variable or use a temporary - RE object. The examples below use one mode or the other arbitrarily. - Either could correctly be used for any of these examples. - - You must supply extra pointer arguments to extract matched subpieces. - - Example: extracts "ruby" into "s" and 1234 into "i" - int i; - string s; - pcrecpp::RE re("(\\w+):(\\d+)"); - re.FullMatch("ruby:1234", &s, &i); - - Example: does not try to extract any extra sub-patterns - re.FullMatch("ruby:1234", &s); - - Example: does not try to extract into NULL - re.FullMatch("ruby:1234", NULL, &i); - - Example: integer overflow causes failure - !re.FullMatch("ruby:1234567891234", NULL, &i); - - Example: fails because there aren't enough sub-patterns: - !pcrecpp::RE("\\w+:\\d+").FullMatch("ruby:1234", &s); - - Example: fails because string cannot be stored in integer - !pcrecpp::RE("(.*)").FullMatch("ruby", &i); - - The provided pointer arguments can be pointers to any scalar numeric - type, or one of: - - string (matched piece is copied to string) - StringPiece (StringPiece is mutated to point to matched piece) - T (where "bool T::ParseFrom(const char*, int)" exists) - NULL (the corresponding matched sub-pattern is not copied) - - The function returns true iff all of the following conditions are sat- - isfied: - - a. "text" matches "pattern" exactly; - - b. The number of matched sub-patterns is >= number of supplied - pointers; - - c. The "i"th argument has a suitable type for holding the - string captured as the "i"th sub-pattern. If you pass in - void * NULL for the "i"th argument, or a non-void * NULL - of the correct type, or pass fewer arguments than the - number of sub-patterns, "i"th captured sub-pattern is - ignored. - - CAVEAT: An optional sub-pattern that does not exist in the matched - string is assigned the empty string. Therefore, the following will - return false (because the empty string is not a valid number): - - int number; - pcrecpp::RE::FullMatch("abc", "[a-z]+(\\d+)?", &number); - - The matching interface supports at most 16 arguments per call. If you - need more, consider using the more general interface - pcrecpp::RE::DoMatch. See pcrecpp.h for the signature for DoMatch. - - NOTE: Do not use no_arg, which is used internally to mark the end of a - list of optional arguments, as a placeholder for missing arguments, as - this can lead to segfaults. - - -QUOTING METACHARACTERS - - You can use the "QuoteMeta" operation to insert backslashes before all - potentially meaningful characters in a string. The returned string, - used as a regular expression, will exactly match the original string. - - Example: - string quoted = RE::QuoteMeta(unquoted); - - Note that it's legal to escape a character even if it has no special - meaning in a regular expression -- so this function does that. (This - also makes it identical to the perl function of the same name; see - "perldoc -f quotemeta".) For example, "1.5-2.0?" becomes - "1\.5\-2\.0\?". - - -PARTIAL MATCHES - - You can use the "PartialMatch" operation when you want the pattern to - match any substring of the text. - - Example: simple search for a string: - pcrecpp::RE("ell").PartialMatch("hello"); - - Example: find first number in a string: - int number; - pcrecpp::RE re("(\\d+)"); - re.PartialMatch("x*100 + 20", &number); - assert(number == 100); - - -UTF-8 AND THE MATCHING INTERFACE - - By default, pattern and text are plain text, one byte per character. - The UTF8 flag, passed to the constructor, causes both pattern and - string to be treated as UTF-8 text, still a byte stream but potentially - multiple bytes per character. In practice, the text is likelier to be - UTF-8 than the pattern, but the match returned may depend on the UTF8 - flag, so always use it when matching UTF8 text. For example, "." will - match one byte normally but with UTF8 set may match up to three bytes - of a multi-byte character. - - Example: - pcrecpp::RE_Options options; - options.set_utf8(); - pcrecpp::RE re(utf8_pattern, options); - re.FullMatch(utf8_string); - - Example: using the convenience function UTF8(): - pcrecpp::RE re(utf8_pattern, pcrecpp::UTF8()); - re.FullMatch(utf8_string); - - NOTE: The UTF8 flag is ignored if pcre was not configured with the - --enable-utf8 flag. - - -PASSING MODIFIERS TO THE REGULAR EXPRESSION ENGINE - - PCRE defines some modifiers to change the behavior of the regular - expression engine. The C++ wrapper defines an auxiliary class, - RE_Options, as a vehicle to pass such modifiers to a RE class. Cur- - rently, the following modifiers are supported: - - modifier description Perl corresponding - - PCRE_CASELESS case insensitive match /i - PCRE_MULTILINE multiple lines match /m - PCRE_DOTALL dot matches newlines /s - PCRE_DOLLAR_ENDONLY $ matches only at end N/A - PCRE_EXTRA strict escape parsing N/A - PCRE_EXTENDED ignore white spaces /x - PCRE_UTF8 handles UTF8 chars built-in - PCRE_UNGREEDY reverses * and *? N/A - PCRE_NO_AUTO_CAPTURE disables capturing parens N/A (*) - - (*) Both Perl and PCRE allow non capturing parentheses by means of the - "?:" modifier within the pattern itself. e.g. (?:ab|cd) does not cap- - ture, while (ab|cd) does. - - For a full account on how each modifier works, please check the PCRE - API reference page. - - For each modifier, there are two member functions whose name is made - out of the modifier in lowercase, without the "PCRE_" prefix. For - instance, PCRE_CASELESS is handled by - - bool caseless() - - which returns true if the modifier is set, and - - RE_Options & set_caseless(bool) - - which sets or unsets the modifier. Moreover, PCRE_EXTRA_MATCH_LIMIT can - be accessed through the set_match_limit() and match_limit() member - functions. Setting match_limit to a non-zero value will limit the exe- - cution of pcre to keep it from doing bad things like blowing the stack - or taking an eternity to return a result. A value of 5000 is good - enough to stop stack blowup in a 2MB thread stack. Setting match_limit - to zero disables match limiting. Alternatively, you can call - match_limit_recursion() which uses PCRE_EXTRA_MATCH_LIMIT_RECURSION to - limit how much PCRE recurses. match_limit() limits the number of - matches PCRE does; match_limit_recursion() limits the depth of internal - recursion, and therefore the amount of stack that is used. - - Normally, to pass one or more modifiers to a RE class, you declare a - RE_Options object, set the appropriate options, and pass this object to - a RE constructor. Example: - - RE_Options opt; - opt.set_caseless(true); - if (RE("HELLO", opt).PartialMatch("hello world")) ... - - RE_options has two constructors. The default constructor takes no argu- - ments and creates a set of flags that are off by default. The optional - parameter option_flags is to facilitate transfer of legacy code from C - programs. This lets you do - - RE(pattern, - RE_Options(PCRE_CASELESS|PCRE_MULTILINE)).PartialMatch(str); - - However, new code is better off doing - - RE(pattern, - RE_Options().set_caseless(true).set_multiline(true)) - .PartialMatch(str); - - If you are going to pass one of the most used modifiers, there are some - convenience functions that return a RE_Options class with the appropri- - ate modifier already set: CASELESS(), UTF8(), MULTILINE(), DOTALL(), - and EXTENDED(). - - If you need to set several options at once, and you don't want to go - through the pains of declaring a RE_Options object and setting several - options, there is a parallel method that give you such ability on the - fly. You can concatenate several set_xxxxx() member functions, since - each of them returns a reference to its class object. For example, to - pass PCRE_CASELESS, PCRE_EXTENDED, and PCRE_MULTILINE to a RE with one - statement, you may write: - - RE(" ^ xyz \\s+ .* blah$", - RE_Options() - .set_caseless(true) - .set_extended(true) - .set_multiline(true)).PartialMatch(sometext); - - -SCANNING TEXT INCREMENTALLY - - The "Consume" operation may be useful if you want to repeatedly match - regular expressions at the front of a string and skip over them as they - match. This requires use of the "StringPiece" type, which represents a - sub-range of a real string. Like RE, StringPiece is defined in the - pcrecpp namespace. - - Example: read lines of the form "var = value" from a string. - string contents = ...; // Fill string somehow - pcrecpp::StringPiece input(contents); // Wrap in a StringPiece - - string var; - int value; - pcrecpp::RE re("(\\w+) = (\\d+)\n"); - while (re.Consume(&input, &var, &value)) { - ...; - } - - Each successful call to "Consume" will set "var/value", and also - advance "input" so it points past the matched text. - - The "FindAndConsume" operation is similar to "Consume" but does not - anchor your match at the beginning of the string. For example, you - could extract all words from a string by repeatedly calling - - pcrecpp::RE("(\\w+)").FindAndConsume(&input, &word) - - -PARSING HEX/OCTAL/C-RADIX NUMBERS - - By default, if you pass a pointer to a numeric value, the corresponding - text is interpreted as a base-10 number. You can instead wrap the - pointer with a call to one of the operators Hex(), Octal(), or CRadix() - to interpret the text in another base. The CRadix operator interprets - C-style "0" (base-8) and "0x" (base-16) prefixes, but defaults to - base-10. - - Example: - int a, b, c, d; - pcrecpp::RE re("(.*) (.*) (.*) (.*)"); - re.FullMatch("100 40 0100 0x40", - pcrecpp::Octal(&a), pcrecpp::Hex(&b), - pcrecpp::CRadix(&c), pcrecpp::CRadix(&d)); - - will leave 64 in a, b, c, and d. - - -REPLACING PARTS OF STRINGS - - You can replace the first match of "pattern" in "str" with "rewrite". - Within "rewrite", backslash-escaped digits (\1 to \9) can be used to - insert text matching corresponding parenthesized group from the pat- - tern. \0 in "rewrite" refers to the entire matching text. For example: - - string s = "yabba dabba doo"; - pcrecpp::RE("b+").Replace("d", &s); - - will leave "s" containing "yada dabba doo". The result is true if the - pattern matches and a replacement occurs, false otherwise. - - GlobalReplace is like Replace except that it replaces all occurrences - of the pattern in the string with the rewrite. Replacements are not - subject to re-matching. For example: - - string s = "yabba dabba doo"; - pcrecpp::RE("b+").GlobalReplace("d", &s); - - will leave "s" containing "yada dada doo". It returns the number of - replacements made. - - Extract is like Replace, except that if the pattern matches, "rewrite" - is copied into "out" (an additional argument) with substitutions. The - non-matching portions of "text" are ignored. Returns true iff a match - occurred and the extraction happened successfully; if no match occurs, - the string is left unaffected. - - -AUTHOR - - The C++ wrapper was contributed by Google Inc. - Copyright (c) 2007 Google Inc. - - -REVISION - - Last updated: 08 January 2012 ------------------------------------------------------------------------------- - - -PCRESAMPLE(3) Library Functions Manual PCRESAMPLE(3) - - - -NAME - PCRE - Perl-compatible regular expressions - -PCRE SAMPLE PROGRAM - - A simple, complete demonstration program, to get you started with using - PCRE, is supplied in the file pcredemo.c in the PCRE distribution. A - listing of this program is given in the pcredemo documentation. If you - do not have a copy of the PCRE distribution, you can save this listing - to re-create pcredemo.c. - - The demonstration program, which uses the original PCRE 8-bit library, - compiles the regular expression that is its first argument, and matches - it against the subject string in its second argument. No PCRE options - are set, and default character tables are used. If matching succeeds, - the program outputs the portion of the subject that matched, together - with the contents of any captured substrings. - - If the -g option is given on the command line, the program then goes on - to check for further matches of the same regular expression in the same - subject string. The logic is a little bit tricky because of the possi- - bility of matching an empty string. Comments in the code explain what - is going on. - - If PCRE is installed in the standard include and library directories - for your operating system, you should be able to compile the demonstra- - tion program using this command: - - gcc -o pcredemo pcredemo.c -lpcre - - If PCRE is installed elsewhere, you may need to add additional options - to the command line. For example, on a Unix-like system that has PCRE - installed in /usr/local, you can compile the demonstration program - using a command like this: - - gcc -o pcredemo -I/usr/local/include pcredemo.c \ - -L/usr/local/lib -lpcre - - In a Windows environment, if you want to statically link the program - against a non-dll pcre.a file, you must uncomment the line that defines - PCRE_STATIC before including pcre.h, because otherwise the pcre_mal- - loc() and pcre_free() exported functions will be declared - __declspec(dllimport), with unwanted results. - - Once you have compiled and linked the demonstration program, you can - run simple tests like this: - - ./pcredemo 'cat|dog' 'the cat sat on the mat' - ./pcredemo -g 'cat|dog' 'the dog sat on the cat' - - Note that there is a much more comprehensive test program, called - pcretest, which supports many more facilities for testing regular - expressions and both PCRE libraries. The pcredemo program is provided - as a simple coding example. - - If you try to run pcredemo when PCRE is not installed in the standard - library directory, you may get an error like this on some operating - systems (e.g. Solaris): - - ld.so.1: a.out: fatal: libpcre.so.0: open failed: No such file or - directory - - This is caused by the way shared library support works on those sys- - tems. You need to add - - -R/usr/local/lib - - (for example) to the compile command to get round this problem. - - -AUTHOR - - Philip Hazel - University Computing Service - Cambridge CB2 3QH, England. - - -REVISION - - Last updated: 10 January 2012 - Copyright (c) 1997-2012 University of Cambridge. ------------------------------------------------------------------------------- -PCRELIMITS(3) Library Functions Manual PCRELIMITS(3) - - - -NAME - PCRE - Perl-compatible regular expressions - -SIZE AND OTHER LIMITATIONS - - There are some size limitations in PCRE but it is hoped that they will - never in practice be relevant. - - The maximum length of a compiled pattern is approximately 64K data - units (bytes for the 8-bit library, 16-bit units for the 16-bit - library, and 32-bit units for the 32-bit library) if PCRE is compiled - with the default internal linkage size, which is 2 bytes for the 8-bit - and 16-bit libraries, and 4 bytes for the 32-bit library. If you want - to process regular expressions that are truly enormous, you can compile - PCRE with an internal linkage size of 3 or 4 (when building the 16-bit - or 32-bit library, 3 is rounded up to 4). See the README file in the - source distribution and the pcrebuild documentation for details. In - these cases the limit is substantially larger. However, the speed of - execution is slower. - - All values in repeating quantifiers must be less than 65536. - - There is no limit to the number of parenthesized subpatterns, but there - can be no more than 65535 capturing subpatterns. There is, however, a - limit to the depth of nesting of parenthesized subpatterns of all - kinds. This is imposed in order to limit the amount of system stack - used at compile time. The limit can be specified when PCRE is built; - the default is 250. - - There is a limit to the number of forward references to subsequent sub- - patterns of around 200,000. Repeated forward references with fixed - upper limits, for example, (?2){0,100} when subpattern number 2 is to - the right, are included in the count. There is no limit to the number - of backward references. - - The maximum length of name for a named subpattern is 32 characters, and - the maximum number of named subpatterns is 10000. - - The maximum length of a name in a (*MARK), (*PRUNE), (*SKIP), or - (*THEN) verb is 255 for the 8-bit library and 65535 for the 16-bit and - 32-bit libraries. - - The maximum length of a subject string is the largest positive number - that an integer variable can hold. However, when using the traditional - matching function, PCRE uses recursion to handle subpatterns and indef- - inite repetition. This means that the available stack space may limit - the size of a subject string that can be processed by certain patterns. - For a discussion of stack issues, see the pcrestack documentation. - - -AUTHOR - - Philip Hazel - University Computing Service - Cambridge CB2 3QH, England. - - -REVISION - - Last updated: 05 November 2013 - Copyright (c) 1997-2013 University of Cambridge. ------------------------------------------------------------------------------- - - -PCRESTACK(3) Library Functions Manual PCRESTACK(3) - - - -NAME - PCRE - Perl-compatible regular expressions - -PCRE DISCUSSION OF STACK USAGE - - When you call pcre[16|32]_exec(), it makes use of an internal function - called match(). This calls itself recursively at branch points in the - pattern, in order to remember the state of the match so that it can - back up and try a different alternative if the first one fails. As - matching proceeds deeper and deeper into the tree of possibilities, the - recursion depth increases. The match() function is also called in other - circumstances, for example, whenever a parenthesized sub-pattern is - entered, and in certain cases of repetition. - - Not all calls of match() increase the recursion depth; for an item such - as a* it may be called several times at the same level, after matching - different numbers of a's. Furthermore, in a number of cases where the - result of the recursive call would immediately be passed back as the - result of the current call (a "tail recursion"), the function is just - restarted instead. - - The above comments apply when pcre[16|32]_exec() is run in its normal - interpretive manner. If the pattern was studied with the - PCRE_STUDY_JIT_COMPILE option, and just-in-time compiling was success- - ful, and the options passed to pcre[16|32]_exec() were not incompati- - ble, the matching process uses the JIT-compiled code instead of the - match() function. In this case, the memory requirements are handled - entirely differently. See the pcrejit documentation for details. - - The pcre[16|32]_dfa_exec() function operates in an entirely different - way, and uses recursion only when there is a regular expression recur- - sion or subroutine call in the pattern. This includes the processing of - assertion and "once-only" subpatterns, which are handled like subrou- - tine calls. Normally, these are never very deep, and the limit on the - complexity of pcre[16|32]_dfa_exec() is controlled by the amount of - workspace it is given. However, it is possible to write patterns with - runaway infinite recursions; such patterns will cause - pcre[16|32]_dfa_exec() to run out of stack. At present, there is no - protection against this. - - The comments that follow do NOT apply to pcre[16|32]_dfa_exec(); they - are relevant only for pcre[16|32]_exec() without the JIT optimization. - - Reducing pcre[16|32]_exec()'s stack usage - - Each time that match() is actually called recursively, it uses memory - from the process stack. For certain kinds of pattern and data, very - large amounts of stack may be needed, despite the recognition of "tail - recursion". You can often reduce the amount of recursion, and there- - fore the amount of stack used, by modifying the pattern that is being - matched. Consider, for example, this pattern: - - ([^<]|<(?!inet))+ - - It matches from wherever it starts until it encounters ". When there is more than one - pattern (specified by the use of -e and/or -f), each pattern is applied - to each line in the order in which they are defined, except that all - the -e patterns are tried before the -f patterns. - - By default, as soon as one pattern matches a line, no further patterns - are considered. However, if --colour (or --color) is used to colour the - matching substrings, or if --only-matching, --file-offsets, or --line- - offsets is used to output only the part of the line that matched - (either shown literally, or as an offset), scanning resumes immediately - following the match, so that further matches on the same line can be - found. If there are multiple patterns, they are all tried on the - remainder of the line, but patterns that follow the one that matched - are not tried on the earlier part of the line. - - This behaviour means that the order in which multiple patterns are - specified can affect the output when one of the above options is used. - This is no longer the same behaviour as GNU grep, which now manages to - display earlier matches for later patterns (as long as there is no - overlap). - - Patterns that can match an empty string are accepted, but empty string - matches are never recognized. An example is the pattern - "(super)?(man)?", in which all components are optional. This pattern - finds all occurrences of both "super" and "man"; the output differs - from matching with "super|man" when only the matching substrings are - being shown. - - If the LC_ALL or LC_CTYPE environment variable is set, pcregrep uses - the value to set a locale when calling the PCRE library. The --locale - option can be used to override this. - - -SUPPORT FOR COMPRESSED FILES - - It is possible to compile pcregrep so that it uses libz or libbz2 to - read files whose names end in .gz or .bz2, respectively. You can find - out whether your binary has support for one or both of these file types - by running it with the --help option. If the appropriate support is not - present, files are treated as plain text. The standard input is always - so treated. - - -BINARY FILES - - By default, a file that contains a binary zero byte within the first - 1024 bytes is identified as a binary file, and is processed specially. - (GNU grep also identifies binary files in this manner.) See the - --binary-files option for a means of changing the way binary files are - handled. - - -OPTIONS - - The order in which some of the options appear can affect the output. - For example, both the -h and -l options affect the printing of file - names. Whichever comes later in the command line will be the one that - takes effect. Similarly, except where noted below, if an option is - given twice, the later setting is used. Numerical values for options - may be followed by K or M, to signify multiplication by 1024 or - 1024*1024 respectively. - - -- This terminates the list of options. It is useful if the next - item on the command line starts with a hyphen but is not an - option. This allows for the processing of patterns and file- - names that start with hyphens. - - -A number, --after-context=number - Output number lines of context after each matching line. If - filenames and/or line numbers are being output, a hyphen sep- - arator is used instead of a colon for the context lines. A - line containing "--" is output between each group of lines, - unless they are in fact contiguous in the input file. The - value of number is expected to be relatively small. However, - pcregrep guarantees to have up to 8K of following text avail- - able for context output. - - -a, --text - Treat binary files as text. This is equivalent to --binary- - files=text. - - -B number, --before-context=number - Output number lines of context before each matching line. If - filenames and/or line numbers are being output, a hyphen sep- - arator is used instead of a colon for the context lines. A - line containing "--" is output between each group of lines, - unless they are in fact contiguous in the input file. The - value of number is expected to be relatively small. However, - pcregrep guarantees to have up to 8K of preceding text avail- - able for context output. - - --binary-files=word - Specify how binary files are to be processed. If the word is - "binary" (the default), pattern matching is performed on - binary files, but the only output is "Binary file - matches" when a match succeeds. If the word is "text", which - is equivalent to the -a or --text option, binary files are - processed in the same way as any other file. In this case, - when a match succeeds, the output may be binary garbage, - which can have nasty effects if sent to a terminal. If the - word is "without-match", which is equivalent to the -I - option, binary files are not processed at all; they are - assumed not to be of interest. - - --buffer-size=number - Set the parameter that controls how much memory is used for - buffering files that are being scanned. - - -C number, --context=number - Output number lines of context both before and after each - matching line. This is equivalent to setting both -A and -B - to the same value. - - -c, --count - Do not output individual lines from the files that are being - scanned; instead output the number of lines that would other- - wise have been shown. If no lines are selected, the number - zero is output. If several files are are being scanned, a - count is output for each of them. However, if the --files- - with-matches option is also used, only those files whose - counts are greater than zero are listed. When -c is used, the - -A, -B, and -C options are ignored. - - --colour, --color - If this option is given without any data, it is equivalent to - "--colour=auto". If data is required, it must be given in - the same shell item, separated by an equals sign. - - --colour=value, --color=value - This option specifies under what circumstances the parts of a - line that matched a pattern should be coloured in the output. - By default, the output is not coloured. The value (which is - optional, see above) may be "never", "always", or "auto". In - the latter case, colouring happens only if the standard out- - put is connected to a terminal. More resources are used when - colouring is enabled, because pcregrep has to search for all - possible matches in a line, not just one, in order to colour - them all. - - The colour that is used can be specified by setting the envi- - ronment variable PCREGREP_COLOUR or PCREGREP_COLOR. The value - of this variable should be a string of two numbers, separated - by a semicolon. They are copied directly into the control - string for setting colour on a terminal, so it is your - responsibility to ensure that they make sense. If neither of - the environment variables is set, the default is "1;31", - which gives red. - - -D action, --devices=action - If an input path is not a regular file or a directory, - "action" specifies how it is to be processed. Valid values - are "read" (the default) or "skip" (silently skip the path). - - -d action, --directories=action - If an input path is a directory, "action" specifies how it is - to be processed. Valid values are "read" (the default in - non-Windows environments, for compatibility with GNU grep), - "recurse" (equivalent to the -r option), or "skip" (silently - skip the path, the default in Windows environments). In the - "read" case, directories are read as if they were ordinary - files. In some operating systems the effect of reading a - directory like this is an immediate end-of-file; in others it - may provoke an error. - - -e pattern, --regex=pattern, --regexp=pattern - Specify a pattern to be matched. This option can be used mul- - tiple times in order to specify several patterns. It can also - be used as a way of specifying a single pattern that starts - with a hyphen. When -e is used, no argument pattern is taken - from the command line; all arguments are treated as file - names. There is no limit to the number of patterns. They are - applied to each line in the order in which they are defined - until one matches. - - If -f is used with -e, the command line patterns are matched - first, followed by the patterns from the file(s), independent - of the order in which these options are specified. Note that - multiple use of -e is not the same as a single pattern with - alternatives. For example, X|Y finds the first character in a - line that is X or Y, whereas if the two patterns are given - separately, with X first, pcregrep finds X if it is present, - even if it follows Y in the line. It finds Y only if there is - no X in the line. This matters only if you are using -o or - --colo(u)r to show the part(s) of the line that matched. - - --exclude=pattern - Files (but not directories) whose names match the pattern are - skipped without being processed. This applies to all files, - whether listed on the command line, obtained from --file- - list, or by scanning a directory. The pattern is a PCRE regu- - lar expression, and is matched against the final component of - the file name, not the entire path. The -F, -w, and -x - options do not apply to this pattern. The option may be given - any number of times in order to specify multiple patterns. If - a file name matches both an --include and an --exclude pat- - tern, it is excluded. There is no short form for this option. - - --exclude-from=filename - Treat each non-empty line of the file as the data for an - --exclude option. What constitutes a newline when reading the - file is the operating system's default. The --newline option - has no effect on this option. This option may be given more - than once in order to specify a number of files to read. - - --exclude-dir=pattern - Directories whose names match the pattern are skipped without - being processed, whatever the setting of the --recursive - option. This applies to all directories, whether listed on - the command line, obtained from --file-list, or by scanning a - parent directory. The pattern is a PCRE regular expression, - and is matched against the final component of the directory - name, not the entire path. The -F, -w, and -x options do not - apply to this pattern. The option may be given any number of - times in order to specify more than one pattern. If a direc- - tory matches both --include-dir and --exclude-dir, it is - excluded. There is no short form for this option. - - -F, --fixed-strings - Interpret each data-matching pattern as a list of fixed - strings, separated by newlines, instead of as a regular - expression. What constitutes a newline for this purpose is - controlled by the --newline option. The -w (match as a word) - and -x (match whole line) options can be used with -F. They - apply to each of the fixed strings. A line is selected if any - of the fixed strings are found in it (subject to -w or -x, if - present). This option applies only to the patterns that are - matched against the contents of files; it does not apply to - patterns specified by any of the --include or --exclude - options. - - -f filename, --file=filename - Read patterns from the file, one per line, and match them - against each line of input. What constitutes a newline when - reading the file is the operating system's default. The - --newline option has no effect on this option. Trailing white - space is removed from each line, and blank lines are ignored. - An empty file contains no patterns and therefore matches - nothing. See also the comments about multiple patterns versus - a single pattern with alternatives in the description of -e - above. - - If this option is given more than once, all the specified - files are read. A data line is output if any of the patterns - match it. A filename can be given as "-" to refer to the - standard input. When -f is used, patterns specified on the - command line using -e may also be present; they are tested - before the file's patterns. However, no other pattern is - taken from the command line; all arguments are treated as the - names of paths to be searched. - - --file-list=filename - Read a list of files and/or directories that are to be - scanned from the given file, one per line. Trailing white - space is removed from each line, and blank lines are ignored. - These paths are processed before any that are listed on the - command line. The filename can be given as "-" to refer to - the standard input. If --file and --file-list are both spec- - ified as "-", patterns are read first. This is useful only - when the standard input is a terminal, from which further - lines (the list of files) can be read after an end-of-file - indication. If this option is given more than once, all the - specified files are read. - - --file-offsets - Instead of showing lines or parts of lines that match, show - each match as an offset from the start of the file and a - length, separated by a comma. In this mode, no context is - shown. That is, the -A, -B, and -C options are ignored. If - there is more than one match in a line, each of them is shown - separately. This option is mutually exclusive with --line- - offsets and --only-matching. - - -H, --with-filename - Force the inclusion of the filename at the start of output - lines when searching a single file. By default, the filename - is not shown in this case. For matching lines, the filename - is followed by a colon; for context lines, a hyphen separator - is used. If a line number is also being output, it follows - the file name. - - -h, --no-filename - Suppress the output filenames when searching multiple files. - By default, filenames are shown when multiple files are - searched. For matching lines, the filename is followed by a - colon; for context lines, a hyphen separator is used. If a - line number is also being output, it follows the file name. - - --help Output a help message, giving brief details of the command - options and file type support, and then exit. Anything else - on the command line is ignored. - - -I Treat binary files as never matching. This is equivalent to - --binary-files=without-match. - - -i, --ignore-case - Ignore upper/lower case distinctions during comparisons. - - --include=pattern - If any --include patterns are specified, the only files that - are processed are those that match one of the patterns (and - do not match an --exclude pattern). This option does not - affect directories, but it applies to all files, whether - listed on the command line, obtained from --file-list, or by - scanning a directory. The pattern is a PCRE regular expres- - sion, and is matched against the final component of the file - name, not the entire path. The -F, -w, and -x options do not - apply to this pattern. The option may be given any number of - times. If a file name matches both an --include and an - --exclude pattern, it is excluded. There is no short form - for this option. - - --include-from=filename - Treat each non-empty line of the file as the data for an - --include option. What constitutes a newline for this purpose - is the operating system's default. The --newline option has - no effect on this option. This option may be given any number - of times; all the files are read. - - --include-dir=pattern - If any --include-dir patterns are specified, the only direc- - tories that are processed are those that match one of the - patterns (and do not match an --exclude-dir pattern). This - applies to all directories, whether listed on the command - line, obtained from --file-list, or by scanning a parent - directory. The pattern is a PCRE regular expression, and is - matched against the final component of the directory name, - not the entire path. The -F, -w, and -x options do not apply - to this pattern. The option may be given any number of times. - If a directory matches both --include-dir and --exclude-dir, - it is excluded. There is no short form for this option. - - -L, --files-without-match - Instead of outputting lines from the files, just output the - names of the files that do not contain any lines that would - have been output. Each file name is output once, on a sepa- - rate line. - - -l, --files-with-matches - Instead of outputting lines from the files, just output the - names of the files containing lines that would have been out- - put. Each file name is output once, on a separate line. - Searching normally stops as soon as a matching line is found - in a file. However, if the -c (count) option is also used, - matching continues in order to obtain the correct count, and - those files that have at least one match are listed along - with their counts. Using this option with -c is a way of sup- - pressing the listing of files with no matches. - - --label=name - This option supplies a name to be used for the standard input - when file names are being output. If not supplied, "(standard - input)" is used. There is no short form for this option. - - --line-buffered - When this option is given, input is read and processed line - by line, and the output is flushed after each write. By - default, input is read in large chunks, unless pcregrep can - determine that it is reading from a terminal (which is cur- - rently possible only in Unix-like environments). Output to - terminal is normally automatically flushed by the operating - system. This option can be useful when the input or output is - attached to a pipe and you do not want pcregrep to buffer up - large amounts of data. However, its use will affect perfor- - mance, and the -M (multiline) option ceases to work. - - --line-offsets - Instead of showing lines or parts of lines that match, show - each match as a line number, the offset from the start of the - line, and a length. The line number is terminated by a colon - (as usual; see the -n option), and the offset and length are - separated by a comma. In this mode, no context is shown. - That is, the -A, -B, and -C options are ignored. If there is - more than one match in a line, each of them is shown sepa- - rately. This option is mutually exclusive with --file-offsets - and --only-matching. - - --locale=locale-name - This option specifies a locale to be used for pattern match- - ing. It overrides the value in the LC_ALL or LC_CTYPE envi- - ronment variables. If no locale is specified, the PCRE - library's default (usually the "C" locale) is used. There is - no short form for this option. - - --match-limit=number - Processing some regular expression patterns can require a - very large amount of memory, leading in some cases to a pro- - gram crash if not enough is available. Other patterns may - take a very long time to search for all possible matching - strings. The pcre_exec() function that is called by pcregrep - to do the matching has two parameters that can limit the - resources that it uses. - - The --match-limit option provides a means of limiting - resource usage when processing patterns that are not going to - match, but which have a very large number of possibilities in - their search trees. The classic example is a pattern that - uses nested unlimited repeats. Internally, PCRE uses a func- - tion called match() which it calls repeatedly (sometimes - recursively). The limit set by --match-limit is imposed on - the number of times this function is called during a match, - which has the effect of limiting the amount of backtracking - that can take place. - - The --recursion-limit option is similar to --match-limit, but - instead of limiting the total number of times that match() is - called, it limits the depth of recursive calls, which in turn - limits the amount of memory that can be used. The recursion - depth is a smaller number than the total number of calls, - because not all calls to match() are recursive. This limit is - of use only if it is set smaller than --match-limit. - - There are no short forms for these options. The default set- - tings are specified when the PCRE library is compiled, with - the default default being 10 million. - - -M, --multiline - Allow patterns to match more than one line. When this option - is given, patterns may usefully contain literal newline char- - acters and internal occurrences of ^ and $ characters. The - output for a successful match may consist of more than one - line, the last of which is the one in which the match ended. - If the matched string ends with a newline sequence the output - ends at the end of that line. - - When this option is set, the PCRE library is called in "mul- - tiline" mode. There is a limit to the number of lines that - can be matched, imposed by the way that pcregrep buffers the - input file as it scans it. However, pcregrep ensures that at - least 8K characters or the rest of the document (whichever is - the shorter) are available for forward matching, and simi- - larly the previous 8K characters (or all the previous charac- - ters, if fewer than 8K) are guaranteed to be available for - lookbehind assertions. This option does not work when input - is read line by line (see --line-buffered.) - - -N newline-type, --newline=newline-type - The PCRE library supports five different conventions for - indicating the ends of lines. They are the single-character - sequences CR (carriage return) and LF (linefeed), the two- - character sequence CRLF, an "anycrlf" convention, which rec- - ognizes any of the preceding three types, and an "any" con- - vention, in which any Unicode line ending sequence is assumed - to end a line. The Unicode sequences are the three just men- - tioned, plus VT (vertical tab, U+000B), FF (form feed, - U+000C), NEL (next line, U+0085), LS (line separator, - U+2028), and PS (paragraph separator, U+2029). - - When the PCRE library is built, a default line-ending - sequence is specified. This is normally the standard - sequence for the operating system. Unless otherwise specified - by this option, pcregrep uses the library's default. The - possible values for this option are CR, LF, CRLF, ANYCRLF, or - ANY. This makes it possible to use pcregrep to scan files - that have come from other environments without having to mod- - ify their line endings. If the data that is being scanned - does not agree with the convention set by this option, pcre- - grep may behave in strange ways. Note that this option does - not apply to files specified by the -f, --exclude-from, or - --include-from options, which are expected to use the operat- - ing system's standard newline sequence. - - -n, --line-number - Precede each output line by its line number in the file, fol- - lowed by a colon for matching lines or a hyphen for context - lines. If the filename is also being output, it precedes the - line number. This option is forced if --line-offsets is used. - - --no-jit If the PCRE library is built with support for just-in-time - compiling (which speeds up matching), pcregrep automatically - makes use of this, unless it was explicitly disabled at build - time. This option can be used to disable the use of JIT at - run time. It is provided for testing and working round prob- - lems. It should never be needed in normal use. - - -o, --only-matching - Show only the part of the line that matched a pattern instead - of the whole line. In this mode, no context is shown. That - is, the -A, -B, and -C options are ignored. If there is more - than one match in a line, each of them is shown separately. - If -o is combined with -v (invert the sense of the match to - find non-matching lines), no output is generated, but the - return code is set appropriately. If the matched portion of - the line is empty, nothing is output unless the file name or - line number are being printed, in which case they are shown - on an otherwise empty line. This option is mutually exclusive - with --file-offsets and --line-offsets. - - -onumber, --only-matching=number - Show only the part of the line that matched the capturing - parentheses of the given number. Up to 32 capturing parenthe- - ses are supported, and -o0 is equivalent to -o without a num- - ber. Because these options can be given without an argument - (see above), if an argument is present, it must be given in - the same shell item, for example, -o3 or --only-matching=2. - The comments given for the non-argument case above also apply - to this case. If the specified capturing parentheses do not - exist in the pattern, or were not set in the match, nothing - is output unless the file name or line number are being - printed. - - If this option is given multiple times, multiple substrings - are output, in the order the options are given. For example, - -o3 -o1 -o3 causes the substrings matched by capturing paren- - theses 3 and 1 and then 3 again to be output. By default, - there is no separator (but see the next option). - - --om-separator=text - Specify a separating string for multiple occurrences of -o. - The default is an empty string. Separating strings are never - coloured. - - -q, --quiet - Work quietly, that is, display nothing except error messages. - The exit status indicates whether or not any matches were - found. - - -r, --recursive - If any given path is a directory, recursively scan the files - it contains, taking note of any --include and --exclude set- - tings. By default, a directory is read as a normal file; in - some operating systems this gives an immediate end-of-file. - This option is a shorthand for setting the -d option to - "recurse". - - --recursion-limit=number - See --match-limit above. - - -s, --no-messages - Suppress error messages about non-existent or unreadable - files. Such files are quietly skipped. However, the return - code is still 2, even if matches were found in other files. - - -u, --utf-8 - Operate in UTF-8 mode. This option is available only if PCRE - has been compiled with UTF-8 support. All patterns (including - those for any --exclude and --include options) and all sub- - ject lines that are scanned must be valid strings of UTF-8 - characters. - - -V, --version - Write the version numbers of pcregrep and the PCRE library to - the standard output and then exit. Anything else on the com- - mand line is ignored. - - -v, --invert-match - Invert the sense of the match, so that lines which do not - match any of the patterns are the ones that are found. - - -w, --word-regex, --word-regexp - Force the patterns to match only whole words. This is equiva- - lent to having \b at the start and end of the pattern. This - option applies only to the patterns that are matched against - the contents of files; it does not apply to patterns speci- - fied by any of the --include or --exclude options. - - -x, --line-regex, --line-regexp - Force the patterns to be anchored (each must start matching - at the beginning of a line) and in addition, require them to - match entire lines. This is equivalent to having ^ and $ - characters at the start and end of each alternative branch in - every pattern. This option applies only to the patterns that - are matched against the contents of files; it does not apply - to patterns specified by any of the --include or --exclude - options. - - -ENVIRONMENT VARIABLES - - The environment variables LC_ALL and LC_CTYPE are examined, in that - order, for a locale. The first one that is set is used. This can be - overridden by the --locale option. If no locale is set, the PCRE - library's default (usually the "C" locale) is used. - - -NEWLINES - - The -N (--newline) option allows pcregrep to scan files with different - newline conventions from the default. Any parts of the input files that - are written to the standard output are copied identically, with what- - ever newline sequences they have in the input. However, the setting of - this option does not affect the interpretation of files specified by - the -f, --exclude-from, or --include-from options, which are assumed to - use the operating system's standard newline sequence, nor does it - affect the way in which pcregrep writes informational messages to the - standard error and output streams. For these it uses the string "\n" to - indicate newlines, relying on the C I/O library to convert this to an - appropriate sequence. - - -OPTIONS COMPATIBILITY - - Many of the short and long forms of pcregrep's options are the same as - in the GNU grep program. Any long option of the form --xxx-regexp (GNU - terminology) is also available as --xxx-regex (PCRE terminology). How- - ever, the --file-list, --file-offsets, --include-dir, --line-offsets, - --locale, --match-limit, -M, --multiline, -N, --newline, --om-separa- - tor, --recursion-limit, -u, and --utf-8 options are specific to pcre- - grep, as is the use of the --only-matching option with a capturing - parentheses number. - - Although most of the common options work the same way, a few are dif- - ferent in pcregrep. For example, the --include option's argument is a - glob for GNU grep, but a regular expression for pcregrep. If both the - -c and -l options are given, GNU grep lists only file names, without - counts, but pcregrep gives the counts. - - -OPTIONS WITH DATA - - There are four different ways in which an option with data can be spec- - ified. If a short form option is used, the data may follow immedi- - ately, or (with one exception) in the next command line item. For exam- - ple: - - -f/some/file - -f /some/file - - The exception is the -o option, which may appear with or without data. - Because of this, if data is present, it must follow immediately in the - same item, for example -o3. - - If a long form option is used, the data may appear in the same command - line item, separated by an equals character, or (with two exceptions) - it may appear in the next command line item. For example: - - --file=/some/file - --file /some/file - - Note, however, that if you want to supply a file name beginning with ~ - as data in a shell command, and have the shell expand ~ to a home - directory, you must separate the file name from the option, because the - shell does not treat ~ specially unless it is at the start of an item. - - The exceptions to the above are the --colour (or --color) and --only- - matching options, for which the data is optional. If one of these - options does have data, it must be given in the first form, using an - equals character. Otherwise pcregrep will assume that it has no data. - - -MATCHING ERRORS - - It is possible to supply a regular expression that takes a very long - time to fail to match certain lines. Such patterns normally involve - nested indefinite repeats, for example: (a+)*\d when matched against a - line of a's with no final digit. The PCRE matching function has a - resource limit that causes it to abort in these circumstances. If this - happens, pcregrep outputs an error message and the line that caused the - problem to the standard error stream. If there are more than 20 such - errors, pcregrep gives up. - - The --match-limit option of pcregrep can be used to set the overall - resource limit; there is a second option called --recursion-limit that - sets a limit on the amount of memory (usually stack) that is used (see - the discussion of these options above). - - -DIAGNOSTICS - - Exit status is 0 if any matches were found, 1 if no matches were found, - and 2 for syntax errors, overlong lines, non-existent or inaccessible - files (even if matches were found in other files) or too many matching - errors. Using the -s option to suppress error messages about inaccessi- - ble files does not affect the return code. - - -SEE ALSO - - pcrepattern(3), pcresyntax(3), pcretest(1). - - -AUTHOR - - Philip Hazel - University Computing Service - Cambridge CB2 3QH, England. - - -REVISION - - Last updated: 03 April 2014 - Copyright (c) 1997-2014 University of Cambridge. diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/pcretest.txt b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/pcretest.txt deleted file mode 100644 index 6d7305cf..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/pcretest.txt +++ /dev/null @@ -1,1091 +0,0 @@ -PCRETEST(1) General Commands Manual PCRETEST(1) - - - -NAME - pcretest - a program for testing Perl-compatible regular expressions. - -SYNOPSIS - - pcretest [options] [input file [output file]] - - pcretest was written as a test program for the PCRE regular expression - library itself, but it can also be used for experimenting with regular - expressions. This document describes the features of the test program; - for details of the regular expressions themselves, see the pcrepattern - documentation. For details of the PCRE library function calls and their - options, see the pcreapi , pcre16 and pcre32 documentation. - - The input for pcretest is a sequence of regular expression patterns and - strings to be matched, as described below. The output shows the result - of each match. Options on the command line and the patterns control - PCRE options and exactly what is output. - - As PCRE has evolved, it has acquired many different features, and as a - result, pcretest now has rather a lot of obscure options for testing - every possible feature. Some of these options are specifically designed - for use in conjunction with the test script and data files that are - distributed as part of PCRE, and are unlikely to be of use otherwise. - They are all documented here, but without much justification. - - -INPUT DATA FORMAT - - Input to pcretest is processed line by line, either by calling the C - library's fgets() function, or via the libreadline library (see below). - In Unix-like environments, fgets() treats any bytes other than newline - as data characters. However, in some Windows environments character 26 - (hex 1A) causes an immediate end of file, and no further data is read. - For maximum portability, therefore, it is safest to use only ASCII - characters in pcretest input files. - - The input is processed using using C's string functions, so must not - contain binary zeroes, even though in Unix-like environments, fgets() - treats any bytes other than newline as data characters. - - -PCRE's 8-BIT, 16-BIT AND 32-BIT LIBRARIES - - From release 8.30, two separate PCRE libraries can be built. The origi- - nal one supports 8-bit character strings, whereas the newer 16-bit - library supports character strings encoded in 16-bit units. From - release 8.32, a third library can be built, supporting character - strings encoded in 32-bit units. The pcretest program can be used to - test all three libraries. However, it is itself still an 8-bit program, - reading 8-bit input and writing 8-bit output. When testing the 16-bit - or 32-bit library, the patterns and data strings are converted to 16- - or 32-bit format before being passed to the PCRE library functions. - Results are converted to 8-bit for output. - - References to functions and structures of the form pcre[16|32]_xx below - mean "pcre_xx when using the 8-bit library, pcre16_xx when using the - 16-bit library, or pcre32_xx when using the 32-bit library". - - -COMMAND LINE OPTIONS - - -8 If both the 8-bit library has been built, this option causes - the 8-bit library to be used (which is the default); if the - 8-bit library has not been built, this option causes an - error. - - -16 If both the 8-bit or the 32-bit, and the 16-bit libraries - have been built, this option causes the 16-bit library to be - used. If only the 16-bit library has been built, this is the - default (so has no effect). If only the 8-bit or the 32-bit - library has been built, this option causes an error. - - -32 If both the 8-bit or the 16-bit, and the 32-bit libraries - have been built, this option causes the 32-bit library to be - used. If only the 32-bit library has been built, this is the - default (so has no effect). If only the 8-bit or the 16-bit - library has been built, this option causes an error. - - -b Behave as if each pattern has the /B (show byte code) modi- - fier; the internal form is output after compilation. - - -C Output the version number of the PCRE library, and all avail- - able information about the optional features that are - included, and then exit with zero exit code. All other - options are ignored. - - -C option Output information about a specific build-time option, then - exit. This functionality is intended for use in scripts such - as RunTest. The following options output the value and set - the exit code as indicated: - - ebcdic-nl the code for LF (= NL) in an EBCDIC environment: - 0x15 or 0x25 - 0 if used in an ASCII environment - exit code is always 0 - linksize the configured internal link size (2, 3, or 4) - exit code is set to the link size - newline the default newline setting: - CR, LF, CRLF, ANYCRLF, or ANY - exit code is always 0 - bsr the default setting for what \R matches: - ANYCRLF or ANY - exit code is always 0 - - The following options output 1 for true or 0 for false, and - set the exit code to the same value: - - ebcdic compiled for an EBCDIC environment - jit just-in-time support is available - pcre16 the 16-bit library was built - pcre32 the 32-bit library was built - pcre8 the 8-bit library was built - ucp Unicode property support is available - utf UTF-8 and/or UTF-16 and/or UTF-32 support - is available - - If an unknown option is given, an error message is output; - the exit code is 0. - - -d Behave as if each pattern has the /D (debug) modifier; the - internal form and information about the compiled pattern is - output after compilation; -d is equivalent to -b -i. - - -dfa Behave as if each data line contains the \D escape sequence; - this causes the alternative matching function, - pcre[16|32]_dfa_exec(), to be used instead of the standard - pcre[16|32]_exec() function (more detail is given below). - - -help Output a brief summary these options and then exit. - - -i Behave as if each pattern has the /I modifier; information - about the compiled pattern is given after compilation. - - -M Behave as if each data line contains the \M escape sequence; - this causes PCRE to discover the minimum MATCH_LIMIT and - MATCH_LIMIT_RECURSION settings by calling pcre[16|32]_exec() - repeatedly with different limits. - - -m Output the size of each compiled pattern after it has been - compiled. This is equivalent to adding /M to each regular - expression. The size is given in bytes for both libraries. - - -O Behave as if each pattern has the /O modifier, that is dis- - able auto-possessification for all patterns. - - -o osize Set the number of elements in the output vector that is used - when calling pcre[16|32]_exec() or pcre[16|32]_dfa_exec() to - be osize. The default value is 45, which is enough for 14 - capturing subexpressions for pcre[16|32]_exec() or 22 differ- - ent matches for pcre[16|32]_dfa_exec(). The vector size can - be changed for individual matching calls by including \O in - the data line (see below). - - -p Behave as if each pattern has the /P modifier; the POSIX - wrapper API is used to call PCRE. None of the other options - has any effect when -p is set. This option can be used only - with the 8-bit library. - - -q Do not output the version number of pcretest at the start of - execution. - - -S size On Unix-like systems, set the size of the run-time stack to - size megabytes. - - -s or -s+ Behave as if each pattern has the /S modifier; in other - words, force each pattern to be studied. If -s+ is used, all - the JIT compile options are passed to pcre[16|32]_study(), - causing just-in-time optimization to be set up if it is - available, for both full and partial matching. Specific JIT - compile options can be selected by following -s+ with a digit - in the range 1 to 7, which selects the JIT compile modes as - follows: - - 1 normal match only - 2 soft partial match only - 3 normal match and soft partial match - 4 hard partial match only - 6 soft and hard partial match - 7 all three modes (default) - - If -s++ is used instead of -s+ (with or without a following - digit), the text "(JIT)" is added to the first output line - after a match or no match when JIT-compiled code was actually - used. - - Note that there are pattern options that can override -s, - either specifying no studying at all, or suppressing JIT com- - pilation. - - If the /I or /D option is present on a pattern (requesting - output about the compiled pattern), information about the - result of studying is not included when studying is caused - only by -s and neither -i nor -d is present on the command - line. This behaviour means that the output from tests that - are run with and without -s should be identical, except when - options that output information about the actual running of a - match are set. - - The -M, -t, and -tm options, which give information about - resources used, are likely to produce different output with - and without -s. Output may also differ if the /C option is - present on an individual pattern. This uses callouts to trace - the the matching process, and this may be different between - studied and non-studied patterns. If the pattern contains - (*MARK) items there may also be differences, for the same - reason. The -s command line option can be overridden for spe- - cific patterns that should never be studied (see the /S pat- - tern modifier below). - - -t Run each compile, study, and match many times with a timer, - and output the resulting times per compile, study, or match - (in milliseconds). Do not set -m with -t, because you will - then get the size output a zillion times, and the timing will - be distorted. You can control the number of iterations that - are used for timing by following -t with a number (as a sepa- - rate item on the command line). For example, "-t 1000" iter- - ates 1000 times. The default is to iterate 500000 times. - - -tm This is like -t except that it times only the matching phase, - not the compile or study phases. - - -T -TM These behave like -t and -tm, but in addition, at the end of - a run, the total times for all compiles, studies, and matches - are output. - - -DESCRIPTION - - If pcretest is given two filename arguments, it reads from the first - and writes to the second. If it is given only one filename argument, it - reads from that file and writes to stdout. Otherwise, it reads from - stdin and writes to stdout, and prompts for each line of input, using - "re>" to prompt for regular expressions, and "data>" to prompt for data - lines. - - When pcretest is built, a configuration option can specify that it - should be linked with the libreadline library. When this is done, if - the input is from a terminal, it is read using the readline() function. - This provides line-editing and history facilities. The output from the - -help option states whether or not readline() will be used. - - The program handles any number of sets of input on a single input file. - Each set starts with a regular expression, and continues with any num- - ber of data lines to be matched against that pattern. - - Each data line is matched separately and independently. If you want to - do multi-line matches, you have to use the \n escape sequence (or \r or - \r\n, etc., depending on the newline setting) in a single line of input - to encode the newline sequences. There is no limit on the length of - data lines; the input buffer is automatically extended if it is too - small. - - An empty line signals the end of the data lines, at which point a new - regular expression is read. The regular expressions are given enclosed - in any non-alphanumeric delimiters other than backslash, for example: - - /(a|bc)x+yz/ - - White space before the initial delimiter is ignored. A regular expres- - sion may be continued over several input lines, in which case the new- - line characters are included within it. It is possible to include the - delimiter within the pattern by escaping it, for example - - /abc\/def/ - - If you do so, the escape and the delimiter form part of the pattern, - but since delimiters are always non-alphanumeric, this does not affect - its interpretation. If the terminating delimiter is immediately fol- - lowed by a backslash, for example, - - /abc/\ - - then a backslash is added to the end of the pattern. This is done to - provide a way of testing the error condition that arises if a pattern - finishes with a backslash, because - - /abc\/ - - is interpreted as the first line of a pattern that starts with "abc/", - causing pcretest to read the next line as a continuation of the regular - expression. - - -PATTERN MODIFIERS - - A pattern may be followed by any number of modifiers, which are mostly - single characters, though some of these can be qualified by further - characters. Following Perl usage, these are referred to below as, for - example, "the /i modifier", even though the delimiter of the pattern - need not always be a slash, and no slash is used when writing modi- - fiers. White space may appear between the final pattern delimiter and - the first modifier, and between the modifiers themselves. For refer- - ence, here is a complete list of modifiers. They fall into several - groups that are described in detail in the following sections. - - /8 set UTF mode - /9 set PCRE_NEVER_UTF (locks out UTF mode) - /? disable UTF validity check - /+ show remainder of subject after match - /= show all captures (not just those that are set) - - /A set PCRE_ANCHORED - /B show compiled code - /C set PCRE_AUTO_CALLOUT - /D same as /B plus /I - /E set PCRE_DOLLAR_ENDONLY - /F flip byte order in compiled pattern - /f set PCRE_FIRSTLINE - /G find all matches (shorten string) - /g find all matches (use startoffset) - /I show information about pattern - /i set PCRE_CASELESS - /J set PCRE_DUPNAMES - /K show backtracking control names - /L set locale - /M show compiled memory size - /m set PCRE_MULTILINE - /N set PCRE_NO_AUTO_CAPTURE - /O set PCRE_NO_AUTO_POSSESS - /P use the POSIX wrapper - /Q test external stack check function - /S study the pattern after compilation - /s set PCRE_DOTALL - /T select character tables - /U set PCRE_UNGREEDY - /W set PCRE_UCP - /X set PCRE_EXTRA - /x set PCRE_EXTENDED - /Y set PCRE_NO_START_OPTIMIZE - /Z don't show lengths in /B output - - / set PCRE_NEWLINE_ANY - / set PCRE_NEWLINE_ANYCRLF - / set PCRE_NEWLINE_CR - / set PCRE_NEWLINE_CRLF - / set PCRE_NEWLINE_LF - / set PCRE_BSR_ANYCRLF - / set PCRE_BSR_UNICODE - / set PCRE_JAVASCRIPT_COMPAT - - - Perl-compatible modifiers - - The /i, /m, /s, and /x modifiers set the PCRE_CASELESS, PCRE_MULTILINE, - PCRE_DOTALL, or PCRE_EXTENDED options, respectively, when - pcre[16|32]_compile() is called. These four modifier letters have the - same effect as they do in Perl. For example: - - /caseless/i - - - Modifiers for other PCRE options - - The following table shows additional modifiers for setting PCRE com- - pile-time options that do not correspond to anything in Perl: - - /8 PCRE_UTF8 ) when using the 8-bit - /? PCRE_NO_UTF8_CHECK ) library - - /8 PCRE_UTF16 ) when using the 16-bit - /? PCRE_NO_UTF16_CHECK ) library - - /8 PCRE_UTF32 ) when using the 32-bit - /? PCRE_NO_UTF32_CHECK ) library - - /9 PCRE_NEVER_UTF - /A PCRE_ANCHORED - /C PCRE_AUTO_CALLOUT - /E PCRE_DOLLAR_ENDONLY - /f PCRE_FIRSTLINE - /J PCRE_DUPNAMES - /N PCRE_NO_AUTO_CAPTURE - /O PCRE_NO_AUTO_POSSESS - /U PCRE_UNGREEDY - /W PCRE_UCP - /X PCRE_EXTRA - /Y PCRE_NO_START_OPTIMIZE - / PCRE_NEWLINE_ANY - / PCRE_NEWLINE_ANYCRLF - / PCRE_NEWLINE_CR - / PCRE_NEWLINE_CRLF - / PCRE_NEWLINE_LF - / PCRE_BSR_ANYCRLF - / PCRE_BSR_UNICODE - / PCRE_JAVASCRIPT_COMPAT - - The modifiers that are enclosed in angle brackets are literal strings - as shown, including the angle brackets, but the letters within can be - in either case. This example sets multiline matching with CRLF as the - line ending sequence: - - /^abc/m - - As well as turning on the PCRE_UTF8/16/32 option, the /8 modifier - causes all non-printing characters in output strings to be printed - using the \x{hh...} notation. Otherwise, those less than 0x100 are out- - put in hex without the curly brackets. - - Full details of the PCRE options are given in the pcreapi documenta- - tion. - - Finding all matches in a string - - Searching for all possible matches within each subject string can be - requested by the /g or /G modifier. After finding a match, PCRE is - called again to search the remainder of the subject string. The differ- - ence between /g and /G is that the former uses the startoffset argument - to pcre[16|32]_exec() to start searching at a new point within the - entire string (which is in effect what Perl does), whereas the latter - passes over a shortened substring. This makes a difference to the - matching process if the pattern begins with a lookbehind assertion - (including \b or \B). - - If any call to pcre[16|32]_exec() in a /g or /G sequence matches an - empty string, the next call is done with the PCRE_NOTEMPTY_ATSTART and - PCRE_ANCHORED flags set in order to search for another, non-empty, - match at the same point. If this second match fails, the start offset - is advanced, and the normal match is retried. This imitates the way - Perl handles such cases when using the /g modifier or the split() func- - tion. Normally, the start offset is advanced by one character, but if - the newline convention recognizes CRLF as a newline, and the current - character is CR followed by LF, an advance of two is used. - - Other modifiers - - There are yet more modifiers for controlling the way pcretest operates. - - The /+ modifier requests that as well as outputting the substring that - matched the entire pattern, pcretest should in addition output the - remainder of the subject string. This is useful for tests where the - subject contains multiple copies of the same substring. If the + modi- - fier appears twice, the same action is taken for captured substrings. - In each case the remainder is output on the following line with a plus - character following the capture number. Note that this modifier must - not immediately follow the /S modifier because /S+ and /S++ have other - meanings. - - The /= modifier requests that the values of all potential captured - parentheses be output after a match. By default, only those up to the - highest one actually used in the match are output (corresponding to the - return code from pcre[16|32]_exec()). Values in the offsets vector cor- - responding to higher numbers should be set to -1, and these are output - as "". This modifier gives a way of checking that this is hap- - pening. - - The /B modifier is a debugging feature. It requests that pcretest out- - put a representation of the compiled code after compilation. Normally - this information contains length and offset values; however, if /Z is - also present, this data is replaced by spaces. This is a special fea- - ture for use in the automatic test scripts; it ensures that the same - output is generated for different internal link sizes. - - The /D modifier is a PCRE debugging feature, and is equivalent to /BI, - that is, both the /B and the /I modifiers. - - The /F modifier causes pcretest to flip the byte order of the 2-byte - and 4-byte fields in the compiled pattern. This facility is for testing - the feature in PCRE that allows it to execute patterns that were com- - piled on a host with a different endianness. This feature is not avail- - able when the POSIX interface to PCRE is being used, that is, when the - /P pattern modifier is specified. See also the section about saving and - reloading compiled patterns below. - - The /I modifier requests that pcretest output information about the - compiled pattern (whether it is anchored, has a fixed first character, - and so on). It does this by calling pcre[16|32]_fullinfo() after com- - piling a pattern. If the pattern is studied, the results of that are - also output. In this output, the word "char" means a non-UTF character, - that is, the value of a single data item (8-bit, 16-bit, or 32-bit, - depending on the library that is being tested). - - The /K modifier requests pcretest to show names from backtracking con- - trol verbs that are returned from calls to pcre[16|32]_exec(). It - causes pcretest to create a pcre[16|32]_extra block if one has not - already been created by a call to pcre[16|32]_study(), and to set the - PCRE_EXTRA_MARK flag and the mark field within it, every time that - pcre[16|32]_exec() is called. If the variable that the mark field - points to is non-NULL for a match, non-match, or partial match, - pcretest prints the string to which it points. For a match, this is - shown on a line by itself, tagged with "MK:". For a non-match it is - added to the message. - - The /L modifier must be followed directly by the name of a locale, for - example, - - /pattern/Lfr_FR - - For this reason, it must be the last modifier. The given locale is set, - pcre[16|32]_maketables() is called to build a set of character tables - for the locale, and this is then passed to pcre[16|32]_compile() when - compiling the regular expression. Without an /L (or /T) modifier, NULL - is passed as the tables pointer; that is, /L applies only to the - expression on which it appears. - - The /M modifier causes the size in bytes of the memory block used to - hold the compiled pattern to be output. This does not include the size - of the pcre[16|32] block; it is just the actual compiled data. If the - pattern is successfully studied with the PCRE_STUDY_JIT_COMPILE option, - the size of the JIT compiled code is also output. - - The /Q modifier is used to test the use of pcre_stack_guard. It must be - followed by '0' or '1', specifying the return code to be given from an - external function that is passed to PCRE and used for stack checking - during compilation (see the pcreapi documentation for details). - - The /S modifier causes pcre[16|32]_study() to be called after the - expression has been compiled, and the results used when the expression - is matched. There are a number of qualifying characters that may follow - /S. They may appear in any order. - - If /S is followed by an exclamation mark, pcre[16|32]_study() is called - with the PCRE_STUDY_EXTRA_NEEDED option, causing it always to return a - pcre_extra block, even when studying discovers no useful information. - - If /S is followed by a second S character, it suppresses studying, even - if it was requested externally by the -s command line option. This - makes it possible to specify that certain patterns are always studied, - and others are never studied, independently of -s. This feature is used - in the test files in a few cases where the output is different when the - pattern is studied. - - If the /S modifier is followed by a + character, the call to - pcre[16|32]_study() is made with all the JIT study options, requesting - just-in-time optimization support if it is available, for both normal - and partial matching. If you want to restrict the JIT compiling modes, - you can follow /S+ with a digit in the range 1 to 7: - - 1 normal match only - 2 soft partial match only - 3 normal match and soft partial match - 4 hard partial match only - 6 soft and hard partial match - 7 all three modes (default) - - If /S++ is used instead of /S+ (with or without a following digit), the - text "(JIT)" is added to the first output line after a match or no - match when JIT-compiled code was actually used. - - Note that there is also an independent /+ modifier; it must not be - given immediately after /S or /S+ because this will be misinterpreted. - - If JIT studying is successful, the compiled JIT code will automatically - be used when pcre[16|32]_exec() is run, except when incompatible run- - time options are specified. For more details, see the pcrejit documen- - tation. See also the \J escape sequence below for a way of setting the - size of the JIT stack. - - Finally, if /S is followed by a minus character, JIT compilation is - suppressed, even if it was requested externally by the -s command line - option. This makes it possible to specify that JIT is never to be used - for certain patterns. - - The /T modifier must be followed by a single digit. It causes a spe- - cific set of built-in character tables to be passed to pcre[16|32]_com- - pile(). It is used in the standard PCRE tests to check behaviour with - different character tables. The digit specifies the tables as follows: - - 0 the default ASCII tables, as distributed in - pcre_chartables.c.dist - 1 a set of tables defining ISO 8859 characters - - In table 1, some characters whose codes are greater than 128 are iden- - tified as letters, digits, spaces, etc. - - Using the POSIX wrapper API - - The /P modifier causes pcretest to call PCRE via the POSIX wrapper API - rather than its native API. This supports only the 8-bit library. When - /P is set, the following modifiers set options for the regcomp() func- - tion: - - /i REG_ICASE - /m REG_NEWLINE - /N REG_NOSUB - /s REG_DOTALL ) - /U REG_UNGREEDY ) These options are not part of - /W REG_UCP ) the POSIX standard - /8 REG_UTF8 ) - - The /+ modifier works as described above. All other modifiers are - ignored. - - Locking out certain modifiers - - PCRE can be compiled with or without support for certain features such - as UTF-8/16/32 or Unicode properties. Accordingly, the standard tests - are split up into a number of different files that are selected for - running depending on which features are available. When updating the - tests, it is all too easy to put a new test into the wrong file by mis- - take; for example, to put a test that requires UTF support into a file - that is used when it is not available. To help detect such mistakes as - early as possible, there is a facility for locking out specific modi- - fiers. If an input line for pcretest starts with the string "< forbid " - the following sequence of characters is taken as a list of forbidden - modifiers. For example, in the test files that must not use UTF or Uni- - code property support, this line appears: - - < forbid 8W - - This locks out the /8 and /W modifiers. An immediate error is given if - they are subsequently encountered. If the character string contains < - but not >, all the multi-character modifiers that begin with < are - locked out. Otherwise, such modifiers must be explicitly listed, for - example: - - < forbid - - There must be a single space between < and "forbid" for this feature to - be recognised. If there is not, the line is interpreted either as a - request to re-load a pre-compiled pattern (see "SAVING AND RELOADING - COMPILED PATTERNS" below) or, if there is a another < character, as a - pattern that uses < as its delimiter. - - -DATA LINES - - Before each data line is passed to pcre[16|32]_exec(), leading and - trailing white space is removed, and it is then scanned for \ escapes. - Some of these are pretty esoteric features, intended for checking out - some of the more complicated features of PCRE. If you are just testing - "ordinary" regular expressions, you probably don't need any of these. - The following escapes are recognized: - - \a alarm (BEL, \x07) - \b backspace (\x08) - \e escape (\x27) - \f form feed (\x0c) - \n newline (\x0a) - \qdd set the PCRE_MATCH_LIMIT limit to dd - (any number of digits) - \r carriage return (\x0d) - \t tab (\x09) - \v vertical tab (\x0b) - \nnn octal character (up to 3 octal digits); always - a byte unless > 255 in UTF-8 or 16-bit or 32-bit mode - \o{dd...} octal character (any number of octal digits} - \xhh hexadecimal byte (up to 2 hex digits) - \x{hh...} hexadecimal character (any number of hex digits) - \A pass the PCRE_ANCHORED option to pcre[16|32]_exec() - or pcre[16|32]_dfa_exec() - \B pass the PCRE_NOTBOL option to pcre[16|32]_exec() - or pcre[16|32]_dfa_exec() - \Cdd call pcre[16|32]_copy_substring() for substring dd - after a successful match (number less than 32) - \Cname call pcre[16|32]_copy_named_substring() for substring - "name" after a successful match (name termin- - ated by next non alphanumeric character) - \C+ show the current captured substrings at callout - time - \C- do not supply a callout function - \C!n return 1 instead of 0 when callout number n is - reached - \C!n!m return 1 instead of 0 when callout number n is - reached for the nth time - \C*n pass the number n (may be negative) as callout - data; this is used as the callout return value - \D use the pcre[16|32]_dfa_exec() match function - \F only shortest match for pcre[16|32]_dfa_exec() - \Gdd call pcre[16|32]_get_substring() for substring dd - after a successful match (number less than 32) - \Gname call pcre[16|32]_get_named_substring() for substring - "name" after a successful match (name termin- - ated by next non-alphanumeric character) - \Jdd set up a JIT stack of dd kilobytes maximum (any - number of digits) - \L call pcre[16|32]_get_substringlist() after a - successful match - \M discover the minimum MATCH_LIMIT and - MATCH_LIMIT_RECURSION settings - \N pass the PCRE_NOTEMPTY option to pcre[16|32]_exec() - or pcre[16|32]_dfa_exec(); if used twice, pass the - PCRE_NOTEMPTY_ATSTART option - \Odd set the size of the output vector passed to - pcre[16|32]_exec() to dd (any number of digits) - \P pass the PCRE_PARTIAL_SOFT option to pcre[16|32]_exec() - or pcre[16|32]_dfa_exec(); if used twice, pass the - PCRE_PARTIAL_HARD option - \Qdd set the PCRE_MATCH_LIMIT_RECURSION limit to dd - (any number of digits) - \R pass the PCRE_DFA_RESTART option to pcre[16|32]_dfa_exec() - \S output details of memory get/free calls during matching - \Y pass the PCRE_NO_START_OPTIMIZE option to - pcre[16|32]_exec() - or pcre[16|32]_dfa_exec() - \Z pass the PCRE_NOTEOL option to pcre[16|32]_exec() - or pcre[16|32]_dfa_exec() - \? pass the PCRE_NO_UTF[8|16|32]_CHECK option to - pcre[16|32]_exec() or pcre[16|32]_dfa_exec() - \>dd start the match at offset dd (optional "-"; then - any number of digits); this sets the startoffset - argument for pcre[16|32]_exec() or - pcre[16|32]_dfa_exec() - \ pass the PCRE_NEWLINE_CR option to pcre[16|32]_exec() - or pcre[16|32]_dfa_exec() - \ pass the PCRE_NEWLINE_LF option to pcre[16|32]_exec() - or pcre[16|32]_dfa_exec() - \ pass the PCRE_NEWLINE_CRLF option to pcre[16|32]_exec() - or pcre[16|32]_dfa_exec() - \ pass the PCRE_NEWLINE_ANYCRLF option to pcre[16|32]_exec() - or pcre[16|32]_dfa_exec() - \ pass the PCRE_NEWLINE_ANY option to pcre[16|32]_exec() - or pcre[16|32]_dfa_exec() - - The use of \x{hh...} is not dependent on the use of the /8 modifier on - the pattern. It is recognized always. There may be any number of hexa- - decimal digits inside the braces; invalid values provoke error mes- - sages. - - Note that \xhh specifies one byte rather than one character in UTF-8 - mode; this makes it possible to construct invalid UTF-8 sequences for - testing purposes. On the other hand, \x{hh} is interpreted as a UTF-8 - character in UTF-8 mode, generating more than one byte if the value is - greater than 127. When testing the 8-bit library not in UTF-8 mode, - \x{hh} generates one byte for values less than 256, and causes an error - for greater values. - - In UTF-16 mode, all 4-digit \x{hhhh} values are accepted. This makes it - possible to construct invalid UTF-16 sequences for testing purposes. - - In UTF-32 mode, all 4- to 8-digit \x{...} values are accepted. This - makes it possible to construct invalid UTF-32 sequences for testing - purposes. - - The escapes that specify line ending sequences are literal strings, - exactly as shown. No more than one newline setting should be present in - any data line. - - A backslash followed by anything else just escapes the anything else. - If the very last character is a backslash, it is ignored. This gives a - way of passing an empty line as data, since a real empty line termi- - nates the data input. - - The \J escape provides a way of setting the maximum stack size that is - used by the just-in-time optimization code. It is ignored if JIT opti- - mization is not being used. Providing a stack that is larger than the - default 32K is necessary only for very complicated patterns. - - If \M is present, pcretest calls pcre[16|32]_exec() several times, with - different values in the match_limit and match_limit_recursion fields of - the pcre[16|32]_extra data structure, until it finds the minimum num- - bers for each parameter that allow pcre[16|32]_exec() to complete with- - out error. Because this is testing a specific feature of the normal - interpretive pcre[16|32]_exec() execution, the use of any JIT optimiza- - tion that might have been set up by the /S+ qualifier of -s+ option is - disabled. - - The match_limit number is a measure of the amount of backtracking that - takes place, and checking it out can be instructive. For most simple - matches, the number is quite small, but for patterns with very large - numbers of matching possibilities, it can become large very quickly - with increasing length of subject string. The match_limit_recursion - number is a measure of how much stack (or, if PCRE is compiled with - NO_RECURSE, how much heap) memory is needed to complete the match - attempt. - - When \O is used, the value specified may be higher or lower than the - size set by the -O command line option (or defaulted to 45); \O applies - only to the call of pcre[16|32]_exec() for the line in which it - appears. - - If the /P modifier was present on the pattern, causing the POSIX wrap- - per API to be used, the only option-setting sequences that have any - effect are \B, \N, and \Z, causing REG_NOTBOL, REG_NOTEMPTY, and - REG_NOTEOL, respectively, to be passed to regexec(). - - -THE ALTERNATIVE MATCHING FUNCTION - - By default, pcretest uses the standard PCRE matching function, - pcre[16|32]_exec() to match each data line. PCRE also supports an - alternative matching function, pcre[16|32]_dfa_test(), which operates - in a different way, and has some restrictions. The differences between - the two functions are described in the pcrematching documentation. - - If a data line contains the \D escape sequence, or if the command line - contains the -dfa option, the alternative matching function is used. - This function finds all possible matches at a given point. If, however, - the \F escape sequence is present in the data line, it stops after the - first match is found. This is always the shortest possible match. - - -DEFAULT OUTPUT FROM PCRETEST - - This section describes the output when the normal matching function, - pcre[16|32]_exec(), is being used. - - When a match succeeds, pcretest outputs the list of captured substrings - that pcre[16|32]_exec() returns, starting with number 0 for the string - that matched the whole pattern. Otherwise, it outputs "No match" when - the return is PCRE_ERROR_NOMATCH, and "Partial match:" followed by the - partially matching substring when pcre[16|32]_exec() returns - PCRE_ERROR_PARTIAL. (Note that this is the entire substring that was - inspected during the partial match; it may include characters before - the actual match start if a lookbehind assertion, \K, \b, or \B was - involved.) For any other return, pcretest outputs the PCRE negative - error number and a short descriptive phrase. If the error is a failed - UTF string check, the offset of the start of the failing character and - the reason code are also output, provided that the size of the output - vector is at least two. Here is an example of an interactive pcretest - run. - - $ pcretest - PCRE version 8.13 2011-04-30 - - re> /^abc(\d+)/ - data> abc123 - 0: abc123 - 1: 123 - data> xyz - No match - - Unset capturing substrings that are not followed by one that is set are - not returned by pcre[16|32]_exec(), and are not shown by pcretest. In - the following example, there are two capturing substrings, but when the - first data line is matched, the second, unset substring is not shown. - An "internal" unset substring is shown as "", as for the second - data line. - - re> /(a)|(b)/ - data> a - 0: a - 1: a - data> b - 0: b - 1: - 2: b - - If the strings contain any non-printing characters, they are output as - \xhh escapes if the value is less than 256 and UTF mode is not set. - Otherwise they are output as \x{hh...} escapes. See below for the defi- - nition of non-printing characters. If the pattern has the /+ modifier, - the output for substring 0 is followed by the the rest of the subject - string, identified by "0+" like this: - - re> /cat/+ - data> cataract - 0: cat - 0+ aract - - If the pattern has the /g or /G modifier, the results of successive - matching attempts are output in sequence, like this: - - re> /\Bi(\w\w)/g - data> Mississippi - 0: iss - 1: ss - 0: iss - 1: ss - 0: ipp - 1: pp - - "No match" is output only if the first match attempt fails. Here is an - example of a failure message (the offset 4 that is specified by \>4 is - past the end of the subject string): - - re> /xyz/ - data> xyz\>4 - Error -24 (bad offset value) - - If any of the sequences \C, \G, or \L are present in a data line that - is successfully matched, the substrings extracted by the convenience - functions are output with C, G, or L after the string number instead of - a colon. This is in addition to the normal full list. The string length - (that is, the return from the extraction function) is given in paren- - theses after each string for \C and \G. - - Note that whereas patterns can be continued over several lines (a plain - ">" prompt is used for continuations), data lines may not. However new- - lines can be included in data by means of the \n escape (or \r, \r\n, - etc., depending on the newline sequence setting). - - -OUTPUT FROM THE ALTERNATIVE MATCHING FUNCTION - - When the alternative matching function, pcre[16|32]_dfa_exec(), is used - (by means of the \D escape sequence or the -dfa command line option), - the output consists of a list of all the matches that start at the - first point in the subject where there is at least one match. For exam- - ple: - - re> /(tang|tangerine|tan)/ - data> yellow tangerine\D - 0: tangerine - 1: tang - 2: tan - - (Using the normal matching function on this data finds only "tang".) - The longest matching string is always given first (and numbered zero). - After a PCRE_ERROR_PARTIAL return, the output is "Partial match:", fol- - lowed by the partially matching substring. (Note that this is the - entire substring that was inspected during the partial match; it may - include characters before the actual match start if a lookbehind asser- - tion, \K, \b, or \B was involved.) - - If /g is present on the pattern, the search for further matches resumes - at the end of the longest match. For example: - - re> /(tang|tangerine|tan)/g - data> yellow tangerine and tangy sultana\D - 0: tangerine - 1: tang - 2: tan - 0: tang - 1: tan - 0: tan - - Since the matching function does not support substring capture, the - escape sequences that are concerned with captured substrings are not - relevant. - - -RESTARTING AFTER A PARTIAL MATCH - - When the alternative matching function has given the PCRE_ERROR_PARTIAL - return, indicating that the subject partially matched the pattern, you - can restart the match with additional subject data by means of the \R - escape sequence. For example: - - re> /^\d?\d(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)\d\d$/ - data> 23ja\P\D - Partial match: 23ja - data> n05\R\D - 0: n05 - - For further information about partial matching, see the pcrepartial - documentation. - - -CALLOUTS - - If the pattern contains any callout requests, pcretest's callout func- - tion is called during matching. This works with both matching func- - tions. By default, the called function displays the callout number, the - start and current positions in the text at the callout time, and the - next pattern item to be tested. For example: - - --->pqrabcdef - 0 ^ ^ \d - - This output indicates that callout number 0 occurred for a match - attempt starting at the fourth character of the subject string, when - the pointer was at the seventh character of the data, and when the next - pattern item was \d. Just one circumflex is output if the start and - current positions are the same. - - Callouts numbered 255 are assumed to be automatic callouts, inserted as - a result of the /C pattern modifier. In this case, instead of showing - the callout number, the offset in the pattern, preceded by a plus, is - output. For example: - - re> /\d?[A-E]\*/C - data> E* - --->E* - +0 ^ \d? - +3 ^ [A-E] - +8 ^^ \* - +10 ^ ^ - 0: E* - - If a pattern contains (*MARK) items, an additional line is output when- - ever a change of latest mark is passed to the callout function. For - example: - - re> /a(*MARK:X)bc/C - data> abc - --->abc - +0 ^ a - +1 ^^ (*MARK:X) - +10 ^^ b - Latest Mark: X - +11 ^ ^ c - +12 ^ ^ - 0: abc - - The mark changes between matching "a" and "b", but stays the same for - the rest of the match, so nothing more is output. If, as a result of - backtracking, the mark reverts to being unset, the text "" is - output. - - The callout function in pcretest returns zero (carry on matching) by - default, but you can use a \C item in a data line (as described above) - to change this and other parameters of the callout. - - Inserting callouts can be helpful when using pcretest to check compli- - cated regular expressions. For further information about callouts, see - the pcrecallout documentation. - - -NON-PRINTING CHARACTERS - - When pcretest is outputting text in the compiled version of a pattern, - bytes other than 32-126 are always treated as non-printing characters - are are therefore shown as hex escapes. - - When pcretest is outputting text that is a matched part of a subject - string, it behaves in the same way, unless a different locale has been - set for the pattern (using the /L modifier). In this case, the - isprint() function to distinguish printing and non-printing characters. - - -SAVING AND RELOADING COMPILED PATTERNS - - The facilities described in this section are not available when the - POSIX interface to PCRE is being used, that is, when the /P pattern - modifier is specified. - - When the POSIX interface is not in use, you can cause pcretest to write - a compiled pattern to a file, by following the modifiers with > and a - file name. For example: - - /pattern/im >/some/file - - See the pcreprecompile documentation for a discussion about saving and - re-using compiled patterns. Note that if the pattern was successfully - studied with JIT optimization, the JIT data cannot be saved. - - The data that is written is binary. The first eight bytes are the - length of the compiled pattern data followed by the length of the - optional study data, each written as four bytes in big-endian order - (most significant byte first). If there is no study data (either the - pattern was not studied, or studying did not return any data), the sec- - ond length is zero. The lengths are followed by an exact copy of the - compiled pattern. If there is additional study data, this (excluding - any JIT data) follows immediately after the compiled pattern. After - writing the file, pcretest expects to read a new pattern. - - A saved pattern can be reloaded into pcretest by specifying < and a - file name instead of a pattern. There must be no space between < and - the file name, which must not contain a < character, as otherwise - pcretest will interpret the line as a pattern delimited by < charac- - ters. For example: - - re> \fP. When there is more than one pattern -(specified by the use of \fB-e\fP and/or \fB-f\fP), each pattern is applied to -each line in the order in which they are defined, except that all the \fB-e\fP -patterns are tried before the \fB-f\fP patterns. -.P -By default, as soon as one pattern matches a line, no further patterns are -considered. However, if \fB--colour\fP (or \fB--color\fP) is used to colour the -matching substrings, or if \fB--only-matching\fP, \fB--file-offsets\fP, or -\fB--line-offsets\fP is used to output only the part of the line that matched -(either shown literally, or as an offset), scanning resumes immediately -following the match, so that further matches on the same line can be found. If -there are multiple patterns, they are all tried on the remainder of the line, -but patterns that follow the one that matched are not tried on the earlier part -of the line. -.P -This behaviour means that the order in which multiple patterns are specified -can affect the output when one of the above options is used. This is no longer -the same behaviour as GNU grep, which now manages to display earlier matches -for later patterns (as long as there is no overlap). -.P -Patterns that can match an empty string are accepted, but empty string -matches are never recognized. An example is the pattern "(super)?(man)?", in -which all components are optional. This pattern finds all occurrences of both -"super" and "man"; the output differs from matching with "super|man" when only -the matching substrings are being shown. -.P -If the \fBLC_ALL\fP or \fBLC_CTYPE\fP environment variable is set, -\fBpcregrep\fP uses the value to set a locale when calling the PCRE library. -The \fB--locale\fP option can be used to override this. -. -. -.SH "SUPPORT FOR COMPRESSED FILES" -.rs -.sp -It is possible to compile \fBpcregrep\fP so that it uses \fBlibz\fP or -\fBlibbz2\fP to read files whose names end in \fB.gz\fP or \fB.bz2\fP, -respectively. You can find out whether your binary has support for one or both -of these file types by running it with the \fB--help\fP option. If the -appropriate support is not present, files are treated as plain text. The -standard input is always so treated. -. -. -.SH "BINARY FILES" -.rs -.sp -By default, a file that contains a binary zero byte within the first 1024 bytes -is identified as a binary file, and is processed specially. (GNU grep also -identifies binary files in this manner.) See the \fB--binary-files\fP option -for a means of changing the way binary files are handled. -. -. -.SH OPTIONS -.rs -.sp -The order in which some of the options appear can affect the output. For -example, both the \fB-h\fP and \fB-l\fP options affect the printing of file -names. Whichever comes later in the command line will be the one that takes -effect. Similarly, except where noted below, if an option is given twice, the -later setting is used. Numerical values for options may be followed by K or M, -to signify multiplication by 1024 or 1024*1024 respectively. -.TP 10 -\fB--\fP -This terminates the list of options. It is useful if the next item on the -command line starts with a hyphen but is not an option. This allows for the -processing of patterns and filenames that start with hyphens. -.TP -\fB-A\fP \fInumber\fP, \fB--after-context=\fP\fInumber\fP -Output \fInumber\fP lines of context after each matching line. If filenames -and/or line numbers are being output, a hyphen separator is used instead of a -colon for the context lines. A line containing "--" is output between each -group of lines, unless they are in fact contiguous in the input file. The value -of \fInumber\fP is expected to be relatively small. However, \fBpcregrep\fP -guarantees to have up to 8K of following text available for context output. -.TP -\fB-a\fP, \fB--text\fP -Treat binary files as text. This is equivalent to -\fB--binary-files\fP=\fItext\fP. -.TP -\fB-B\fP \fInumber\fP, \fB--before-context=\fP\fInumber\fP -Output \fInumber\fP lines of context before each matching line. If filenames -and/or line numbers are being output, a hyphen separator is used instead of a -colon for the context lines. A line containing "--" is output between each -group of lines, unless they are in fact contiguous in the input file. The value -of \fInumber\fP is expected to be relatively small. However, \fBpcregrep\fP -guarantees to have up to 8K of preceding text available for context output. -.TP -\fB--binary-files=\fP\fIword\fP -Specify how binary files are to be processed. If the word is "binary" (the -default), pattern matching is performed on binary files, but the only output is -"Binary file matches" when a match succeeds. If the word is "text", -which is equivalent to the \fB-a\fP or \fB--text\fP option, binary files are -processed in the same way as any other file. In this case, when a match -succeeds, the output may be binary garbage, which can have nasty effects if -sent to a terminal. If the word is "without-match", which is equivalent to the -\fB-I\fP option, binary files are not processed at all; they are assumed not to -be of interest. -.TP -\fB--buffer-size=\fP\fInumber\fP -Set the parameter that controls how much memory is used for buffering files -that are being scanned. -.TP -\fB-C\fP \fInumber\fP, \fB--context=\fP\fInumber\fP -Output \fInumber\fP lines of context both before and after each matching line. -This is equivalent to setting both \fB-A\fP and \fB-B\fP to the same value. -.TP -\fB-c\fP, \fB--count\fP -Do not output individual lines from the files that are being scanned; instead -output the number of lines that would otherwise have been shown. If no lines -are selected, the number zero is output. If several files are are being -scanned, a count is output for each of them. However, if the -\fB--files-with-matches\fP option is also used, only those files whose counts -are greater than zero are listed. When \fB-c\fP is used, the \fB-A\fP, -\fB-B\fP, and \fB-C\fP options are ignored. -.TP -\fB--colour\fP, \fB--color\fP -If this option is given without any data, it is equivalent to "--colour=auto". -If data is required, it must be given in the same shell item, separated by an -equals sign. -.TP -\fB--colour=\fP\fIvalue\fP, \fB--color=\fP\fIvalue\fP -This option specifies under what circumstances the parts of a line that matched -a pattern should be coloured in the output. By default, the output is not -coloured. The value (which is optional, see above) may be "never", "always", or -"auto". In the latter case, colouring happens only if the standard output is -connected to a terminal. More resources are used when colouring is enabled, -because \fBpcregrep\fP has to search for all possible matches in a line, not -just one, in order to colour them all. -.sp -The colour that is used can be specified by setting the environment variable -PCREGREP_COLOUR or PCREGREP_COLOR. The value of this variable should be a -string of two numbers, separated by a semicolon. They are copied directly into -the control string for setting colour on a terminal, so it is your -responsibility to ensure that they make sense. If neither of the environment -variables is set, the default is "1;31", which gives red. -.TP -\fB-D\fP \fIaction\fP, \fB--devices=\fP\fIaction\fP -If an input path is not a regular file or a directory, "action" specifies how -it is to be processed. Valid values are "read" (the default) or "skip" -(silently skip the path). -.TP -\fB-d\fP \fIaction\fP, \fB--directories=\fP\fIaction\fP -If an input path is a directory, "action" specifies how it is to be processed. -Valid values are "read" (the default in non-Windows environments, for -compatibility with GNU grep), "recurse" (equivalent to the \fB-r\fP option), or -"skip" (silently skip the path, the default in Windows environments). In the -"read" case, directories are read as if they were ordinary files. In some -operating systems the effect of reading a directory like this is an immediate -end-of-file; in others it may provoke an error. -.TP -\fB-e\fP \fIpattern\fP, \fB--regex=\fP\fIpattern\fP, \fB--regexp=\fP\fIpattern\fP -Specify a pattern to be matched. This option can be used multiple times in -order to specify several patterns. It can also be used as a way of specifying a -single pattern that starts with a hyphen. When \fB-e\fP is used, no argument -pattern is taken from the command line; all arguments are treated as file -names. There is no limit to the number of patterns. They are applied to each -line in the order in which they are defined until one matches. -.sp -If \fB-f\fP is used with \fB-e\fP, the command line patterns are matched first, -followed by the patterns from the file(s), independent of the order in which -these options are specified. Note that multiple use of \fB-e\fP is not the same -as a single pattern with alternatives. For example, X|Y finds the first -character in a line that is X or Y, whereas if the two patterns are given -separately, with X first, \fBpcregrep\fP finds X if it is present, even if it -follows Y in the line. It finds Y only if there is no X in the line. This -matters only if you are using \fB-o\fP or \fB--colo(u)r\fP to show the part(s) -of the line that matched. -.TP -\fB--exclude\fP=\fIpattern\fP -Files (but not directories) whose names match the pattern are skipped without -being processed. This applies to all files, whether listed on the command line, -obtained from \fB--file-list\fP, or by scanning a directory. The pattern is a -PCRE regular expression, and is matched against the final component of the file -name, not the entire path. The \fB-F\fP, \fB-w\fP, and \fB-x\fP options do not -apply to this pattern. The option may be given any number of times in order to -specify multiple patterns. If a file name matches both an \fB--include\fP -and an \fB--exclude\fP pattern, it is excluded. There is no short form for this -option. -.TP -\fB--exclude-from=\fP\fIfilename\fP -Treat each non-empty line of the file as the data for an \fB--exclude\fP -option. What constitutes a newline when reading the file is the operating -system's default. The \fB--newline\fP option has no effect on this option. This -option may be given more than once in order to specify a number of files to -read. -.TP -\fB--exclude-dir\fP=\fIpattern\fP -Directories whose names match the pattern are skipped without being processed, -whatever the setting of the \fB--recursive\fP option. This applies to all -directories, whether listed on the command line, obtained from -\fB--file-list\fP, or by scanning a parent directory. The pattern is a PCRE -regular expression, and is matched against the final component of the directory -name, not the entire path. The \fB-F\fP, \fB-w\fP, and \fB-x\fP options do not -apply to this pattern. The option may be given any number of times in order to -specify more than one pattern. If a directory matches both \fB--include-dir\fP -and \fB--exclude-dir\fP, it is excluded. There is no short form for this -option. -.TP -\fB-F\fP, \fB--fixed-strings\fP -Interpret each data-matching pattern as a list of fixed strings, separated by -newlines, instead of as a regular expression. What constitutes a newline for -this purpose is controlled by the \fB--newline\fP option. The \fB-w\fP (match -as a word) and \fB-x\fP (match whole line) options can be used with \fB-F\fP. -They apply to each of the fixed strings. A line is selected if any of the fixed -strings are found in it (subject to \fB-w\fP or \fB-x\fP, if present). This -option applies only to the patterns that are matched against the contents of -files; it does not apply to patterns specified by any of the \fB--include\fP or -\fB--exclude\fP options. -.TP -\fB-f\fP \fIfilename\fP, \fB--file=\fP\fIfilename\fP -Read patterns from the file, one per line, and match them against -each line of input. What constitutes a newline when reading the file is the -operating system's default. The \fB--newline\fP option has no effect on this -option. Trailing white space is removed from each line, and blank lines are -ignored. An empty file contains no patterns and therefore matches nothing. See -also the comments about multiple patterns versus a single pattern with -alternatives in the description of \fB-e\fP above. -.sp -If this option is given more than once, all the specified files are -read. A data line is output if any of the patterns match it. A filename can -be given as "-" to refer to the standard input. When \fB-f\fP is used, patterns -specified on the command line using \fB-e\fP may also be present; they are -tested before the file's patterns. However, no other pattern is taken from the -command line; all arguments are treated as the names of paths to be searched. -.TP -\fB--file-list\fP=\fIfilename\fP -Read a list of files and/or directories that are to be scanned from the given -file, one per line. Trailing white space is removed from each line, and blank -lines are ignored. These paths are processed before any that are listed on the -command line. The filename can be given as "-" to refer to the standard input. -If \fB--file\fP and \fB--file-list\fP are both specified as "-", patterns are -read first. This is useful only when the standard input is a terminal, from -which further lines (the list of files) can be read after an end-of-file -indication. If this option is given more than once, all the specified files are -read. -.TP -\fB--file-offsets\fP -Instead of showing lines or parts of lines that match, show each match as an -offset from the start of the file and a length, separated by a comma. In this -mode, no context is shown. That is, the \fB-A\fP, \fB-B\fP, and \fB-C\fP -options are ignored. If there is more than one match in a line, each of them is -shown separately. This option is mutually exclusive with \fB--line-offsets\fP -and \fB--only-matching\fP. -.TP -\fB-H\fP, \fB--with-filename\fP -Force the inclusion of the filename at the start of output lines when searching -a single file. By default, the filename is not shown in this case. For matching -lines, the filename is followed by a colon; for context lines, a hyphen -separator is used. If a line number is also being output, it follows the file -name. -.TP -\fB-h\fP, \fB--no-filename\fP -Suppress the output filenames when searching multiple files. By default, -filenames are shown when multiple files are searched. For matching lines, the -filename is followed by a colon; for context lines, a hyphen separator is used. -If a line number is also being output, it follows the file name. -.TP -\fB--help\fP -Output a help message, giving brief details of the command options and file -type support, and then exit. Anything else on the command line is -ignored. -.TP -\fB-I\fP -Treat binary files as never matching. This is equivalent to -\fB--binary-files\fP=\fIwithout-match\fP. -.TP -\fB-i\fP, \fB--ignore-case\fP -Ignore upper/lower case distinctions during comparisons. -.TP -\fB--include\fP=\fIpattern\fP -If any \fB--include\fP patterns are specified, the only files that are -processed are those that match one of the patterns (and do not match an -\fB--exclude\fP pattern). This option does not affect directories, but it -applies to all files, whether listed on the command line, obtained from -\fB--file-list\fP, or by scanning a directory. The pattern is a PCRE regular -expression, and is matched against the final component of the file name, not -the entire path. The \fB-F\fP, \fB-w\fP, and \fB-x\fP options do not apply to -this pattern. The option may be given any number of times. If a file name -matches both an \fB--include\fP and an \fB--exclude\fP pattern, it is excluded. -There is no short form for this option. -.TP -\fB--include-from=\fP\fIfilename\fP -Treat each non-empty line of the file as the data for an \fB--include\fP -option. What constitutes a newline for this purpose is the operating system's -default. The \fB--newline\fP option has no effect on this option. This option -may be given any number of times; all the files are read. -.TP -\fB--include-dir\fP=\fIpattern\fP -If any \fB--include-dir\fP patterns are specified, the only directories that -are processed are those that match one of the patterns (and do not match an -\fB--exclude-dir\fP pattern). This applies to all directories, whether listed -on the command line, obtained from \fB--file-list\fP, or by scanning a parent -directory. The pattern is a PCRE regular expression, and is matched against the -final component of the directory name, not the entire path. The \fB-F\fP, -\fB-w\fP, and \fB-x\fP options do not apply to this pattern. The option may be -given any number of times. If a directory matches both \fB--include-dir\fP and -\fB--exclude-dir\fP, it is excluded. There is no short form for this option. -.TP -\fB-L\fP, \fB--files-without-match\fP -Instead of outputting lines from the files, just output the names of the files -that do not contain any lines that would have been output. Each file name is -output once, on a separate line. -.TP -\fB-l\fP, \fB--files-with-matches\fP -Instead of outputting lines from the files, just output the names of the files -containing lines that would have been output. Each file name is output -once, on a separate line. Searching normally stops as soon as a matching line -is found in a file. However, if the \fB-c\fP (count) option is also used, -matching continues in order to obtain the correct count, and those files that -have at least one match are listed along with their counts. Using this option -with \fB-c\fP is a way of suppressing the listing of files with no matches. -.TP -\fB--label\fP=\fIname\fP -This option supplies a name to be used for the standard input when file names -are being output. If not supplied, "(standard input)" is used. There is no -short form for this option. -.TP -\fB--line-buffered\fP -When this option is given, input is read and processed line by line, and the -output is flushed after each write. By default, input is read in large chunks, -unless \fBpcregrep\fP can determine that it is reading from a terminal (which -is currently possible only in Unix-like environments). Output to terminal is -normally automatically flushed by the operating system. This option can be -useful when the input or output is attached to a pipe and you do not want -\fBpcregrep\fP to buffer up large amounts of data. However, its use will affect -performance, and the \fB-M\fP (multiline) option ceases to work. -.TP -\fB--line-offsets\fP -Instead of showing lines or parts of lines that match, show each match as a -line number, the offset from the start of the line, and a length. The line -number is terminated by a colon (as usual; see the \fB-n\fP option), and the -offset and length are separated by a comma. In this mode, no context is shown. -That is, the \fB-A\fP, \fB-B\fP, and \fB-C\fP options are ignored. If there is -more than one match in a line, each of them is shown separately. This option is -mutually exclusive with \fB--file-offsets\fP and \fB--only-matching\fP. -.TP -\fB--locale\fP=\fIlocale-name\fP -This option specifies a locale to be used for pattern matching. It overrides -the value in the \fBLC_ALL\fP or \fBLC_CTYPE\fP environment variables. If no -locale is specified, the PCRE library's default (usually the "C" locale) is -used. There is no short form for this option. -.TP -\fB--match-limit\fP=\fInumber\fP -Processing some regular expression patterns can require a very large amount of -memory, leading in some cases to a program crash if not enough is available. -Other patterns may take a very long time to search for all possible matching -strings. The \fBpcre_exec()\fP function that is called by \fBpcregrep\fP to do -the matching has two parameters that can limit the resources that it uses. -.sp -The \fB--match-limit\fP option provides a means of limiting resource usage -when processing patterns that are not going to match, but which have a very -large number of possibilities in their search trees. The classic example is a -pattern that uses nested unlimited repeats. Internally, PCRE uses a function -called \fBmatch()\fP which it calls repeatedly (sometimes recursively). The -limit set by \fB--match-limit\fP is imposed on the number of times this -function is called during a match, which has the effect of limiting the amount -of backtracking that can take place. -.sp -The \fB--recursion-limit\fP option is similar to \fB--match-limit\fP, but -instead of limiting the total number of times that \fBmatch()\fP is called, it -limits the depth of recursive calls, which in turn limits the amount of memory -that can be used. The recursion depth is a smaller number than the total number -of calls, because not all calls to \fBmatch()\fP are recursive. This limit is -of use only if it is set smaller than \fB--match-limit\fP. -.sp -There are no short forms for these options. The default settings are specified -when the PCRE library is compiled, with the default default being 10 million. -.TP -\fB-M\fP, \fB--multiline\fP -Allow patterns to match more than one line. When this option is given, patterns -may usefully contain literal newline characters and internal occurrences of ^ -and $ characters. The output for a successful match may consist of more than -one line, the last of which is the one in which the match ended. If the matched -string ends with a newline sequence the output ends at the end of that line. -.sp -When this option is set, the PCRE library is called in "multiline" mode. -There is a limit to the number of lines that can be matched, imposed by the way -that \fBpcregrep\fP buffers the input file as it scans it. However, -\fBpcregrep\fP ensures that at least 8K characters or the rest of the document -(whichever is the shorter) are available for forward matching, and similarly -the previous 8K characters (or all the previous characters, if fewer than 8K) -are guaranteed to be available for lookbehind assertions. This option does not -work when input is read line by line (see \fP--line-buffered\fP.) -.TP -\fB-N\fP \fInewline-type\fP, \fB--newline\fP=\fInewline-type\fP -The PCRE library supports five different conventions for indicating -the ends of lines. They are the single-character sequences CR (carriage return) -and LF (linefeed), the two-character sequence CRLF, an "anycrlf" convention, -which recognizes any of the preceding three types, and an "any" convention, in -which any Unicode line ending sequence is assumed to end a line. The Unicode -sequences are the three just mentioned, plus VT (vertical tab, U+000B), FF -(form feed, U+000C), NEL (next line, U+0085), LS (line separator, U+2028), and -PS (paragraph separator, U+2029). -.sp -When the PCRE library is built, a default line-ending sequence is specified. -This is normally the standard sequence for the operating system. Unless -otherwise specified by this option, \fBpcregrep\fP uses the library's default. -The possible values for this option are CR, LF, CRLF, ANYCRLF, or ANY. This -makes it possible to use \fBpcregrep\fP to scan files that have come from other -environments without having to modify their line endings. If the data that is -being scanned does not agree with the convention set by this option, -\fBpcregrep\fP may behave in strange ways. Note that this option does not -apply to files specified by the \fB-f\fP, \fB--exclude-from\fP, or -\fB--include-from\fP options, which are expected to use the operating system's -standard newline sequence. -.TP -\fB-n\fP, \fB--line-number\fP -Precede each output line by its line number in the file, followed by a colon -for matching lines or a hyphen for context lines. If the filename is also being -output, it precedes the line number. This option is forced if -\fB--line-offsets\fP is used. -.TP -\fB--no-jit\fP -If the PCRE library is built with support for just-in-time compiling (which -speeds up matching), \fBpcregrep\fP automatically makes use of this, unless it -was explicitly disabled at build time. This option can be used to disable the -use of JIT at run time. It is provided for testing and working round problems. -It should never be needed in normal use. -.TP -\fB-o\fP, \fB--only-matching\fP -Show only the part of the line that matched a pattern instead of the whole -line. In this mode, no context is shown. That is, the \fB-A\fP, \fB-B\fP, and -\fB-C\fP options are ignored. If there is more than one match in a line, each -of them is shown separately. If \fB-o\fP is combined with \fB-v\fP (invert the -sense of the match to find non-matching lines), no output is generated, but the -return code is set appropriately. If the matched portion of the line is empty, -nothing is output unless the file name or line number are being printed, in -which case they are shown on an otherwise empty line. This option is mutually -exclusive with \fB--file-offsets\fP and \fB--line-offsets\fP. -.TP -\fB-o\fP\fInumber\fP, \fB--only-matching\fP=\fInumber\fP -Show only the part of the line that matched the capturing parentheses of the -given number. Up to 32 capturing parentheses are supported, and -o0 is -equivalent to \fB-o\fP without a number. Because these options can be given -without an argument (see above), if an argument is present, it must be given in -the same shell item, for example, -o3 or --only-matching=2. The comments given -for the non-argument case above also apply to this case. If the specified -capturing parentheses do not exist in the pattern, or were not set in the -match, nothing is output unless the file name or line number are being printed. -.sp -If this option is given multiple times, multiple substrings are output, in the -order the options are given. For example, -o3 -o1 -o3 causes the substrings -matched by capturing parentheses 3 and 1 and then 3 again to be output. By -default, there is no separator (but see the next option). -.TP -\fB--om-separator\fP=\fItext\fP -Specify a separating string for multiple occurrences of \fB-o\fP. The default -is an empty string. Separating strings are never coloured. -.TP -\fB-q\fP, \fB--quiet\fP -Work quietly, that is, display nothing except error messages. The exit -status indicates whether or not any matches were found. -.TP -\fB-r\fP, \fB--recursive\fP -If any given path is a directory, recursively scan the files it contains, -taking note of any \fB--include\fP and \fB--exclude\fP settings. By default, a -directory is read as a normal file; in some operating systems this gives an -immediate end-of-file. This option is a shorthand for setting the \fB-d\fP -option to "recurse". -.TP -\fB--recursion-limit\fP=\fInumber\fP -See \fB--match-limit\fP above. -.TP -\fB-s\fP, \fB--no-messages\fP -Suppress error messages about non-existent or unreadable files. Such files are -quietly skipped. However, the return code is still 2, even if matches were -found in other files. -.TP -\fB-u\fP, \fB--utf-8\fP -Operate in UTF-8 mode. This option is available only if PCRE has been compiled -with UTF-8 support. All patterns (including those for any \fB--exclude\fP and -\fB--include\fP options) and all subject lines that are scanned must be valid -strings of UTF-8 characters. -.TP -\fB-V\fP, \fB--version\fP -Write the version numbers of \fBpcregrep\fP and the PCRE library to the -standard output and then exit. Anything else on the command line is -ignored. -.TP -\fB-v\fP, \fB--invert-match\fP -Invert the sense of the match, so that lines which do \fInot\fP match any of -the patterns are the ones that are found. -.TP -\fB-w\fP, \fB--word-regex\fP, \fB--word-regexp\fP -Force the patterns to match only whole words. This is equivalent to having \eb -at the start and end of the pattern. This option applies only to the patterns -that are matched against the contents of files; it does not apply to patterns -specified by any of the \fB--include\fP or \fB--exclude\fP options. -.TP -\fB-x\fP, \fB--line-regex\fP, \fB--line-regexp\fP -Force the patterns to be anchored (each must start matching at the beginning of -a line) and in addition, require them to match entire lines. This is equivalent -to having ^ and $ characters at the start and end of each alternative branch in -every pattern. This option applies only to the patterns that are matched -against the contents of files; it does not apply to patterns specified by any -of the \fB--include\fP or \fB--exclude\fP options. -. -. -.SH "ENVIRONMENT VARIABLES" -.rs -.sp -The environment variables \fBLC_ALL\fP and \fBLC_CTYPE\fP are examined, in that -order, for a locale. The first one that is set is used. This can be overridden -by the \fB--locale\fP option. If no locale is set, the PCRE library's default -(usually the "C" locale) is used. -. -. -.SH "NEWLINES" -.rs -.sp -The \fB-N\fP (\fB--newline\fP) option allows \fBpcregrep\fP to scan files with -different newline conventions from the default. Any parts of the input files -that are written to the standard output are copied identically, with whatever -newline sequences they have in the input. However, the setting of this option -does not affect the interpretation of files specified by the \fB-f\fP, -\fB--exclude-from\fP, or \fB--include-from\fP options, which are assumed to use -the operating system's standard newline sequence, nor does it affect the way in -which \fBpcregrep\fP writes informational messages to the standard error and -output streams. For these it uses the string "\en" to indicate newlines, -relying on the C I/O library to convert this to an appropriate sequence. -. -. -.SH "OPTIONS COMPATIBILITY" -.rs -.sp -Many of the short and long forms of \fBpcregrep\fP's options are the same -as in the GNU \fBgrep\fP program. Any long option of the form -\fB--xxx-regexp\fP (GNU terminology) is also available as \fB--xxx-regex\fP -(PCRE terminology). However, the \fB--file-list\fP, \fB--file-offsets\fP, -\fB--include-dir\fP, \fB--line-offsets\fP, \fB--locale\fP, \fB--match-limit\fP, -\fB-M\fP, \fB--multiline\fP, \fB-N\fP, \fB--newline\fP, \fB--om-separator\fP, -\fB--recursion-limit\fP, \fB-u\fP, and \fB--utf-8\fP options are specific to -\fBpcregrep\fP, as is the use of the \fB--only-matching\fP option with a -capturing parentheses number. -.P -Although most of the common options work the same way, a few are different in -\fBpcregrep\fP. For example, the \fB--include\fP option's argument is a glob -for GNU \fBgrep\fP, but a regular expression for \fBpcregrep\fP. If both the -\fB-c\fP and \fB-l\fP options are given, GNU grep lists only file names, -without counts, but \fBpcregrep\fP gives the counts. -. -. -.SH "OPTIONS WITH DATA" -.rs -.sp -There are four different ways in which an option with data can be specified. -If a short form option is used, the data may follow immediately, or (with one -exception) in the next command line item. For example: -.sp - -f/some/file - -f /some/file -.sp -The exception is the \fB-o\fP option, which may appear with or without data. -Because of this, if data is present, it must follow immediately in the same -item, for example -o3. -.P -If a long form option is used, the data may appear in the same command line -item, separated by an equals character, or (with two exceptions) it may appear -in the next command line item. For example: -.sp - --file=/some/file - --file /some/file -.sp -Note, however, that if you want to supply a file name beginning with ~ as data -in a shell command, and have the shell expand ~ to a home directory, you must -separate the file name from the option, because the shell does not treat ~ -specially unless it is at the start of an item. -.P -The exceptions to the above are the \fB--colour\fP (or \fB--color\fP) and -\fB--only-matching\fP options, for which the data is optional. If one of these -options does have data, it must be given in the first form, using an equals -character. Otherwise \fBpcregrep\fP will assume that it has no data. -. -. -.SH "MATCHING ERRORS" -.rs -.sp -It is possible to supply a regular expression that takes a very long time to -fail to match certain lines. Such patterns normally involve nested indefinite -repeats, for example: (a+)*\ed when matched against a line of a's with no final -digit. The PCRE matching function has a resource limit that causes it to abort -in these circumstances. If this happens, \fBpcregrep\fP outputs an error -message and the line that caused the problem to the standard error stream. If -there are more than 20 such errors, \fBpcregrep\fP gives up. -.P -The \fB--match-limit\fP option of \fBpcregrep\fP can be used to set the overall -resource limit; there is a second option called \fB--recursion-limit\fP that -sets a limit on the amount of memory (usually stack) that is used (see the -discussion of these options above). -. -. -.SH DIAGNOSTICS -.rs -.sp -Exit status is 0 if any matches were found, 1 if no matches were found, and 2 -for syntax errors, overlong lines, non-existent or inaccessible files (even if -matches were found in other files) or too many matching errors. Using the -\fB-s\fP option to suppress error messages about inaccessible files does not -affect the return code. -. -. -.SH "SEE ALSO" -.rs -.sp -\fBpcrepattern\fP(3), \fBpcresyntax\fP(3), \fBpcretest\fP(1). -. -. -.SH AUTHOR -.rs -.sp -.nf -Philip Hazel -University Computing Service -Cambridge CB2 3QH, England. -.fi -. -. -.SH REVISION -.rs -.sp -.nf -Last updated: 03 April 2014 -Copyright (c) 1997-2014 University of Cambridge. -.fi diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man1/pcretest.1 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man1/pcretest.1 deleted file mode 100644 index ea7457c0..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man1/pcretest.1 +++ /dev/null @@ -1,1160 +0,0 @@ -.TH PCRETEST 1 "23 February 2017" "PCRE 8.41" -.SH NAME -pcretest - a program for testing Perl-compatible regular expressions. -.SH SYNOPSIS -.rs -.sp -.B pcretest "[options] [input file [output file]]" -.sp -\fBpcretest\fP was written as a test program for the PCRE regular expression -library itself, but it can also be used for experimenting with regular -expressions. This document describes the features of the test program; for -details of the regular expressions themselves, see the -.\" HREF -\fBpcrepattern\fP -.\" -documentation. For details of the PCRE library function calls and their -options, see the -.\" HREF -\fBpcreapi\fP -.\" -, -.\" HREF -\fBpcre16\fP -and -.\" HREF -\fBpcre32\fP -.\" -documentation. -.P -The input for \fBpcretest\fP is a sequence of regular expression patterns and -strings to be matched, as described below. The output shows the result of each -match. Options on the command line and the patterns control PCRE options and -exactly what is output. -.P -As PCRE has evolved, it has acquired many different features, and as a result, -\fBpcretest\fP now has rather a lot of obscure options for testing every -possible feature. Some of these options are specifically designed for use in -conjunction with the test script and data files that are distributed as part of -PCRE, and are unlikely to be of use otherwise. They are all documented here, -but without much justification. -. -. -.SH "INPUT DATA FORMAT" -.rs -.sp -Input to \fBpcretest\fP is processed line by line, either by calling the C -library's \fBfgets()\fP function, or via the \fBlibreadline\fP library (see -below). In Unix-like environments, \fBfgets()\fP treats any bytes other than -newline as data characters. However, in some Windows environments character 26 -(hex 1A) causes an immediate end of file, and no further data is read. For -maximum portability, therefore, it is safest to use only ASCII characters in -\fBpcretest\fP input files. -.P -The input is processed using using C's string functions, so must not -contain binary zeroes, even though in Unix-like environments, \fBfgets()\fP -treats any bytes other than newline as data characters. -. -. -.SH "PCRE's 8-BIT, 16-BIT AND 32-BIT LIBRARIES" -.rs -.sp -From release 8.30, two separate PCRE libraries can be built. The original one -supports 8-bit character strings, whereas the newer 16-bit library supports -character strings encoded in 16-bit units. From release 8.32, a third library -can be built, supporting character strings encoded in 32-bit units. The -\fBpcretest\fP program can be used to test all three libraries. However, it is -itself still an 8-bit program, reading 8-bit input and writing 8-bit output. -When testing the 16-bit or 32-bit library, the patterns and data strings are -converted to 16- or 32-bit format before being passed to the PCRE library -functions. Results are converted to 8-bit for output. -.P -References to functions and structures of the form \fBpcre[16|32]_xx\fP below -mean "\fBpcre_xx\fP when using the 8-bit library, \fBpcre16_xx\fP when using -the 16-bit library, or \fBpcre32_xx\fP when using the 32-bit library". -. -. -.SH "COMMAND LINE OPTIONS" -.rs -.TP 10 -\fB-8\fP -If both the 8-bit library has been built, this option causes the 8-bit library -to be used (which is the default); if the 8-bit library has not been built, -this option causes an error. -.TP 10 -\fB-16\fP -If both the 8-bit or the 32-bit, and the 16-bit libraries have been built, this -option causes the 16-bit library to be used. If only the 16-bit library has been -built, this is the default (so has no effect). If only the 8-bit or the 32-bit -library has been built, this option causes an error. -.TP 10 -\fB-32\fP -If both the 8-bit or the 16-bit, and the 32-bit libraries have been built, this -option causes the 32-bit library to be used. If only the 32-bit library has been -built, this is the default (so has no effect). If only the 8-bit or the 16-bit -library has been built, this option causes an error. -.TP 10 -\fB-b\fP -Behave as if each pattern has the \fB/B\fP (show byte code) modifier; the -internal form is output after compilation. -.TP 10 -\fB-C\fP -Output the version number of the PCRE library, and all available information -about the optional features that are included, and then exit with zero exit -code. All other options are ignored. -.TP 10 -\fB-C\fP \fIoption\fP -Output information about a specific build-time option, then exit. This -functionality is intended for use in scripts such as \fBRunTest\fP. The -following options output the value and set the exit code as indicated: -.sp - ebcdic-nl the code for LF (= NL) in an EBCDIC environment: - 0x15 or 0x25 - 0 if used in an ASCII environment - exit code is always 0 - linksize the configured internal link size (2, 3, or 4) - exit code is set to the link size - newline the default newline setting: - CR, LF, CRLF, ANYCRLF, or ANY - exit code is always 0 - bsr the default setting for what \eR matches: - ANYCRLF or ANY - exit code is always 0 -.sp -The following options output 1 for true or 0 for false, and set the exit code -to the same value: -.sp - ebcdic compiled for an EBCDIC environment - jit just-in-time support is available - pcre16 the 16-bit library was built - pcre32 the 32-bit library was built - pcre8 the 8-bit library was built - ucp Unicode property support is available - utf UTF-8 and/or UTF-16 and/or UTF-32 support - is available -.sp -If an unknown option is given, an error message is output; the exit code is 0. -.TP 10 -\fB-d\fP -Behave as if each pattern has the \fB/D\fP (debug) modifier; the internal -form and information about the compiled pattern is output after compilation; -\fB-d\fP is equivalent to \fB-b -i\fP. -.TP 10 -\fB-dfa\fP -Behave as if each data line contains the \eD escape sequence; this causes the -alternative matching function, \fBpcre[16|32]_dfa_exec()\fP, to be used instead -of the standard \fBpcre[16|32]_exec()\fP function (more detail is given below). -.TP 10 -\fB-help\fP -Output a brief summary these options and then exit. -.TP 10 -\fB-i\fP -Behave as if each pattern has the \fB/I\fP modifier; information about the -compiled pattern is given after compilation. -.TP 10 -\fB-M\fP -Behave as if each data line contains the \eM escape sequence; this causes -PCRE to discover the minimum MATCH_LIMIT and MATCH_LIMIT_RECURSION settings by -calling \fBpcre[16|32]_exec()\fP repeatedly with different limits. -.TP 10 -\fB-m\fP -Output the size of each compiled pattern after it has been compiled. This is -equivalent to adding \fB/M\fP to each regular expression. The size is given in -bytes for both libraries. -.TP 10 -\fB-O\fP -Behave as if each pattern has the \fB/O\fP modifier, that is disable -auto-possessification for all patterns. -.TP 10 -\fB-o\fP \fIosize\fP -Set the number of elements in the output vector that is used when calling -\fBpcre[16|32]_exec()\fP or \fBpcre[16|32]_dfa_exec()\fP to be \fIosize\fP. The -default value is 45, which is enough for 14 capturing subexpressions for -\fBpcre[16|32]_exec()\fP or 22 different matches for -\fBpcre[16|32]_dfa_exec()\fP. -The vector size can be changed for individual matching calls by including \eO -in the data line (see below). -.TP 10 -\fB-p\fP -Behave as if each pattern has the \fB/P\fP modifier; the POSIX wrapper API is -used to call PCRE. None of the other options has any effect when \fB-p\fP is -set. This option can be used only with the 8-bit library. -.TP 10 -\fB-q\fP -Do not output the version number of \fBpcretest\fP at the start of execution. -.TP 10 -\fB-S\fP \fIsize\fP -On Unix-like systems, set the size of the run-time stack to \fIsize\fP -megabytes. -.TP 10 -\fB-s\fP or \fB-s+\fP -Behave as if each pattern has the \fB/S\fP modifier; in other words, force each -pattern to be studied. If \fB-s+\fP is used, all the JIT compile options are -passed to \fBpcre[16|32]_study()\fP, causing just-in-time optimization to be set -up if it is available, for both full and partial matching. Specific JIT compile -options can be selected by following \fB-s+\fP with a digit in the range 1 to -7, which selects the JIT compile modes as follows: -.sp - 1 normal match only - 2 soft partial match only - 3 normal match and soft partial match - 4 hard partial match only - 6 soft and hard partial match - 7 all three modes (default) -.sp -If \fB-s++\fP is used instead of \fB-s+\fP (with or without a following digit), -the text "(JIT)" is added to the first output line after a match or no match -when JIT-compiled code was actually used. -.sp -Note that there are pattern options that can override \fB-s\fP, either -specifying no studying at all, or suppressing JIT compilation. -.sp -If the \fB/I\fP or \fB/D\fP option is present on a pattern (requesting output -about the compiled pattern), information about the result of studying is not -included when studying is caused only by \fB-s\fP and neither \fB-i\fP nor -\fB-d\fP is present on the command line. This behaviour means that the output -from tests that are run with and without \fB-s\fP should be identical, except -when options that output information about the actual running of a match are -set. -.sp -The \fB-M\fP, \fB-t\fP, and \fB-tm\fP options, which give information about -resources used, are likely to produce different output with and without -\fB-s\fP. Output may also differ if the \fB/C\fP option is present on an -individual pattern. This uses callouts to trace the the matching process, and -this may be different between studied and non-studied patterns. If the pattern -contains (*MARK) items there may also be differences, for the same reason. The -\fB-s\fP command line option can be overridden for specific patterns that -should never be studied (see the \fB/S\fP pattern modifier below). -.TP 10 -\fB-t\fP -Run each compile, study, and match many times with a timer, and output the -resulting times per compile, study, or match (in milliseconds). Do not set -\fB-m\fP with \fB-t\fP, because you will then get the size output a zillion -times, and the timing will be distorted. You can control the number of -iterations that are used for timing by following \fB-t\fP with a number (as a -separate item on the command line). For example, "-t 1000" iterates 1000 times. -The default is to iterate 500000 times. -.TP 10 -\fB-tm\fP -This is like \fB-t\fP except that it times only the matching phase, not the -compile or study phases. -.TP 10 -\fB-T\fP \fB-TM\fP -These behave like \fB-t\fP and \fB-tm\fP, but in addition, at the end of a run, -the total times for all compiles, studies, and matches are output. -. -. -.SH DESCRIPTION -.rs -.sp -If \fBpcretest\fP is given two filename arguments, it reads from the first and -writes to the second. If it is given only one filename argument, it reads from -that file and writes to stdout. Otherwise, it reads from stdin and writes to -stdout, and prompts for each line of input, using "re>" to prompt for regular -expressions, and "data>" to prompt for data lines. -.P -When \fBpcretest\fP is built, a configuration option can specify that it should -be linked with the \fBlibreadline\fP library. When this is done, if the input -is from a terminal, it is read using the \fBreadline()\fP function. This -provides line-editing and history facilities. The output from the \fB-help\fP -option states whether or not \fBreadline()\fP will be used. -.P -The program handles any number of sets of input on a single input file. Each -set starts with a regular expression, and continues with any number of data -lines to be matched against that pattern. -.P -Each data line is matched separately and independently. If you want to do -multi-line matches, you have to use the \en escape sequence (or \er or \er\en, -etc., depending on the newline setting) in a single line of input to encode the -newline sequences. There is no limit on the length of data lines; the input -buffer is automatically extended if it is too small. -.P -An empty line signals the end of the data lines, at which point a new regular -expression is read. The regular expressions are given enclosed in any -non-alphanumeric delimiters other than backslash, for example: -.sp - /(a|bc)x+yz/ -.sp -White space before the initial delimiter is ignored. A regular expression may -be continued over several input lines, in which case the newline characters are -included within it. It is possible to include the delimiter within the pattern -by escaping it, for example -.sp - /abc\e/def/ -.sp -If you do so, the escape and the delimiter form part of the pattern, but since -delimiters are always non-alphanumeric, this does not affect its interpretation. -If the terminating delimiter is immediately followed by a backslash, for -example, -.sp - /abc/\e -.sp -then a backslash is added to the end of the pattern. This is done to provide a -way of testing the error condition that arises if a pattern finishes with a -backslash, because -.sp - /abc\e/ -.sp -is interpreted as the first line of a pattern that starts with "abc/", causing -pcretest to read the next line as a continuation of the regular expression. -. -. -.SH "PATTERN MODIFIERS" -.rs -.sp -A pattern may be followed by any number of modifiers, which are mostly single -characters, though some of these can be qualified by further characters. -Following Perl usage, these are referred to below as, for example, "the -\fB/i\fP modifier", even though the delimiter of the pattern need not always be -a slash, and no slash is used when writing modifiers. White space may appear -between the final pattern delimiter and the first modifier, and between the -modifiers themselves. For reference, here is a complete list of modifiers. They -fall into several groups that are described in detail in the following -sections. -.sp - \fB/8\fP set UTF mode - \fB/9\fP set PCRE_NEVER_UTF (locks out UTF mode) - \fB/?\fP disable UTF validity check - \fB/+\fP show remainder of subject after match - \fB/=\fP show all captures (not just those that are set) -.sp - \fB/A\fP set PCRE_ANCHORED - \fB/B\fP show compiled code - \fB/C\fP set PCRE_AUTO_CALLOUT - \fB/D\fP same as \fB/B\fP plus \fB/I\fP - \fB/E\fP set PCRE_DOLLAR_ENDONLY - \fB/F\fP flip byte order in compiled pattern - \fB/f\fP set PCRE_FIRSTLINE - \fB/G\fP find all matches (shorten string) - \fB/g\fP find all matches (use startoffset) - \fB/I\fP show information about pattern - \fB/i\fP set PCRE_CASELESS - \fB/J\fP set PCRE_DUPNAMES - \fB/K\fP show backtracking control names - \fB/L\fP set locale - \fB/M\fP show compiled memory size - \fB/m\fP set PCRE_MULTILINE - \fB/N\fP set PCRE_NO_AUTO_CAPTURE - \fB/O\fP set PCRE_NO_AUTO_POSSESS - \fB/P\fP use the POSIX wrapper - \fB/Q\fP test external stack check function - \fB/S\fP study the pattern after compilation - \fB/s\fP set PCRE_DOTALL - \fB/T\fP select character tables - \fB/U\fP set PCRE_UNGREEDY - \fB/W\fP set PCRE_UCP - \fB/X\fP set PCRE_EXTRA - \fB/x\fP set PCRE_EXTENDED - \fB/Y\fP set PCRE_NO_START_OPTIMIZE - \fB/Z\fP don't show lengths in \fB/B\fP output -.sp - \fB/\fP set PCRE_NEWLINE_ANY - \fB/\fP set PCRE_NEWLINE_ANYCRLF - \fB/\fP set PCRE_NEWLINE_CR - \fB/\fP set PCRE_NEWLINE_CRLF - \fB/\fP set PCRE_NEWLINE_LF - \fB/\fP set PCRE_BSR_ANYCRLF - \fB/\fP set PCRE_BSR_UNICODE - \fB/\fP set PCRE_JAVASCRIPT_COMPAT -.sp -. -. -.SS "Perl-compatible modifiers" -.rs -.sp -The \fB/i\fP, \fB/m\fP, \fB/s\fP, and \fB/x\fP modifiers set the PCRE_CASELESS, -PCRE_MULTILINE, PCRE_DOTALL, or PCRE_EXTENDED options, respectively, when -\fBpcre[16|32]_compile()\fP is called. These four modifier letters have the same -effect as they do in Perl. For example: -.sp - /caseless/i -.sp -. -. -.SS "Modifiers for other PCRE options" -.rs -.sp -The following table shows additional modifiers for setting PCRE compile-time -options that do not correspond to anything in Perl: -.sp - \fB/8\fP PCRE_UTF8 ) when using the 8-bit - \fB/?\fP PCRE_NO_UTF8_CHECK ) library -.sp - \fB/8\fP PCRE_UTF16 ) when using the 16-bit - \fB/?\fP PCRE_NO_UTF16_CHECK ) library -.sp - \fB/8\fP PCRE_UTF32 ) when using the 32-bit - \fB/?\fP PCRE_NO_UTF32_CHECK ) library -.sp - \fB/9\fP PCRE_NEVER_UTF - \fB/A\fP PCRE_ANCHORED - \fB/C\fP PCRE_AUTO_CALLOUT - \fB/E\fP PCRE_DOLLAR_ENDONLY - \fB/f\fP PCRE_FIRSTLINE - \fB/J\fP PCRE_DUPNAMES - \fB/N\fP PCRE_NO_AUTO_CAPTURE - \fB/O\fP PCRE_NO_AUTO_POSSESS - \fB/U\fP PCRE_UNGREEDY - \fB/W\fP PCRE_UCP - \fB/X\fP PCRE_EXTRA - \fB/Y\fP PCRE_NO_START_OPTIMIZE - \fB/\fP PCRE_NEWLINE_ANY - \fB/\fP PCRE_NEWLINE_ANYCRLF - \fB/\fP PCRE_NEWLINE_CR - \fB/\fP PCRE_NEWLINE_CRLF - \fB/\fP PCRE_NEWLINE_LF - \fB/\fP PCRE_BSR_ANYCRLF - \fB/\fP PCRE_BSR_UNICODE - \fB/\fP PCRE_JAVASCRIPT_COMPAT -.sp -The modifiers that are enclosed in angle brackets are literal strings as shown, -including the angle brackets, but the letters within can be in either case. -This example sets multiline matching with CRLF as the line ending sequence: -.sp - /^abc/m -.sp -As well as turning on the PCRE_UTF8/16/32 option, the \fB/8\fP modifier causes -all non-printing characters in output strings to be printed using the -\ex{hh...} notation. Otherwise, those less than 0x100 are output in hex without -the curly brackets. -.P -Full details of the PCRE options are given in the -.\" HREF -\fBpcreapi\fP -.\" -documentation. -. -. -.SS "Finding all matches in a string" -.rs -.sp -Searching for all possible matches within each subject string can be requested -by the \fB/g\fP or \fB/G\fP modifier. After finding a match, PCRE is called -again to search the remainder of the subject string. The difference between -\fB/g\fP and \fB/G\fP is that the former uses the \fIstartoffset\fP argument to -\fBpcre[16|32]_exec()\fP to start searching at a new point within the entire -string (which is in effect what Perl does), whereas the latter passes over a -shortened substring. This makes a difference to the matching process if the -pattern begins with a lookbehind assertion (including \eb or \eB). -.P -If any call to \fBpcre[16|32]_exec()\fP in a \fB/g\fP or \fB/G\fP sequence matches -an empty string, the next call is done with the PCRE_NOTEMPTY_ATSTART and -PCRE_ANCHORED flags set in order to search for another, non-empty, match at the -same point. If this second match fails, the start offset is advanced, and the -normal match is retried. This imitates the way Perl handles such cases when -using the \fB/g\fP modifier or the \fBsplit()\fP function. Normally, the start -offset is advanced by one character, but if the newline convention recognizes -CRLF as a newline, and the current character is CR followed by LF, an advance -of two is used. -. -. -.SS "Other modifiers" -.rs -.sp -There are yet more modifiers for controlling the way \fBpcretest\fP -operates. -.P -The \fB/+\fP modifier requests that as well as outputting the substring that -matched the entire pattern, \fBpcretest\fP should in addition output the -remainder of the subject string. This is useful for tests where the subject -contains multiple copies of the same substring. If the \fB+\fP modifier appears -twice, the same action is taken for captured substrings. In each case the -remainder is output on the following line with a plus character following the -capture number. Note that this modifier must not immediately follow the /S -modifier because /S+ and /S++ have other meanings. -.P -The \fB/=\fP modifier requests that the values of all potential captured -parentheses be output after a match. By default, only those up to the highest -one actually used in the match are output (corresponding to the return code -from \fBpcre[16|32]_exec()\fP). Values in the offsets vector corresponding to -higher numbers should be set to -1, and these are output as "". This -modifier gives a way of checking that this is happening. -.P -The \fB/B\fP modifier is a debugging feature. It requests that \fBpcretest\fP -output a representation of the compiled code after compilation. Normally this -information contains length and offset values; however, if \fB/Z\fP is also -present, this data is replaced by spaces. This is a special feature for use in -the automatic test scripts; it ensures that the same output is generated for -different internal link sizes. -.P -The \fB/D\fP modifier is a PCRE debugging feature, and is equivalent to -\fB/BI\fP, that is, both the \fB/B\fP and the \fB/I\fP modifiers. -.P -The \fB/F\fP modifier causes \fBpcretest\fP to flip the byte order of the -2-byte and 4-byte fields in the compiled pattern. This facility is for testing -the feature in PCRE that allows it to execute patterns that were compiled on a -host with a different endianness. This feature is not available when the POSIX -interface to PCRE is being used, that is, when the \fB/P\fP pattern modifier is -specified. See also the section about saving and reloading compiled patterns -below. -.P -The \fB/I\fP modifier requests that \fBpcretest\fP output information about the -compiled pattern (whether it is anchored, has a fixed first character, and -so on). It does this by calling \fBpcre[16|32]_fullinfo()\fP after compiling a -pattern. If the pattern is studied, the results of that are also output. In -this output, the word "char" means a non-UTF character, that is, the value of a -single data item (8-bit, 16-bit, or 32-bit, depending on the library that is -being tested). -.P -The \fB/K\fP modifier requests \fBpcretest\fP to show names from backtracking -control verbs that are returned from calls to \fBpcre[16|32]_exec()\fP. It causes -\fBpcretest\fP to create a \fBpcre[16|32]_extra\fP block if one has not already -been created by a call to \fBpcre[16|32]_study()\fP, and to set the -PCRE_EXTRA_MARK flag and the \fBmark\fP field within it, every time that -\fBpcre[16|32]_exec()\fP is called. If the variable that the \fBmark\fP field -points to is non-NULL for a match, non-match, or partial match, \fBpcretest\fP -prints the string to which it points. For a match, this is shown on a line by -itself, tagged with "MK:". For a non-match it is added to the message. -.P -The \fB/L\fP modifier must be followed directly by the name of a locale, for -example, -.sp - /pattern/Lfr_FR -.sp -For this reason, it must be the last modifier. The given locale is set, -\fBpcre[16|32]_maketables()\fP is called to build a set of character tables for -the locale, and this is then passed to \fBpcre[16|32]_compile()\fP when compiling -the regular expression. Without an \fB/L\fP (or \fB/T\fP) modifier, NULL is -passed as the tables pointer; that is, \fB/L\fP applies only to the expression -on which it appears. -.P -The \fB/M\fP modifier causes the size in bytes of the memory block used to hold -the compiled pattern to be output. This does not include the size of the -\fBpcre[16|32]\fP block; it is just the actual compiled data. If the pattern is -successfully studied with the PCRE_STUDY_JIT_COMPILE option, the size of the -JIT compiled code is also output. -.P -The \fB/Q\fP modifier is used to test the use of \fBpcre_stack_guard\fP. It -must be followed by '0' or '1', specifying the return code to be given from an -external function that is passed to PCRE and used for stack checking during -compilation (see the -.\" HREF -\fBpcreapi\fP -.\" -documentation for details). -.P -The \fB/S\fP modifier causes \fBpcre[16|32]_study()\fP to be called after the -expression has been compiled, and the results used when the expression is -matched. There are a number of qualifying characters that may follow \fB/S\fP. -They may appear in any order. -.P -If \fB/S\fP is followed by an exclamation mark, \fBpcre[16|32]_study()\fP is -called with the PCRE_STUDY_EXTRA_NEEDED option, causing it always to return a -\fBpcre_extra\fP block, even when studying discovers no useful information. -.P -If \fB/S\fP is followed by a second S character, it suppresses studying, even -if it was requested externally by the \fB-s\fP command line option. This makes -it possible to specify that certain patterns are always studied, and others are -never studied, independently of \fB-s\fP. This feature is used in the test -files in a few cases where the output is different when the pattern is studied. -.P -If the \fB/S\fP modifier is followed by a + character, the call to -\fBpcre[16|32]_study()\fP is made with all the JIT study options, requesting -just-in-time optimization support if it is available, for both normal and -partial matching. If you want to restrict the JIT compiling modes, you can -follow \fB/S+\fP with a digit in the range 1 to 7: -.sp - 1 normal match only - 2 soft partial match only - 3 normal match and soft partial match - 4 hard partial match only - 6 soft and hard partial match - 7 all three modes (default) -.sp -If \fB/S++\fP is used instead of \fB/S+\fP (with or without a following digit), -the text "(JIT)" is added to the first output line after a match or no match -when JIT-compiled code was actually used. -.P -Note that there is also an independent \fB/+\fP modifier; it must not be given -immediately after \fB/S\fP or \fB/S+\fP because this will be misinterpreted. -.P -If JIT studying is successful, the compiled JIT code will automatically be used -when \fBpcre[16|32]_exec()\fP is run, except when incompatible run-time options -are specified. For more details, see the -.\" HREF -\fBpcrejit\fP -.\" -documentation. See also the \fB\eJ\fP escape sequence below for a way of -setting the size of the JIT stack. -.P -Finally, if \fB/S\fP is followed by a minus character, JIT compilation is -suppressed, even if it was requested externally by the \fB-s\fP command line -option. This makes it possible to specify that JIT is never to be used for -certain patterns. -.P -The \fB/T\fP modifier must be followed by a single digit. It causes a specific -set of built-in character tables to be passed to \fBpcre[16|32]_compile()\fP. It -is used in the standard PCRE tests to check behaviour with different character -tables. The digit specifies the tables as follows: -.sp - 0 the default ASCII tables, as distributed in - pcre_chartables.c.dist - 1 a set of tables defining ISO 8859 characters -.sp -In table 1, some characters whose codes are greater than 128 are identified as -letters, digits, spaces, etc. -. -. -.SS "Using the POSIX wrapper API" -.rs -.sp -The \fB/P\fP modifier causes \fBpcretest\fP to call PCRE via the POSIX wrapper -API rather than its native API. This supports only the 8-bit library. When -\fB/P\fP is set, the following modifiers set options for the \fBregcomp()\fP -function: -.sp - /i REG_ICASE - /m REG_NEWLINE - /N REG_NOSUB - /s REG_DOTALL ) - /U REG_UNGREEDY ) These options are not part of - /W REG_UCP ) the POSIX standard - /8 REG_UTF8 ) -.sp -The \fB/+\fP modifier works as described above. All other modifiers are -ignored. -. -. -.SS "Locking out certain modifiers" -.rs -.sp -PCRE can be compiled with or without support for certain features such as -UTF-8/16/32 or Unicode properties. Accordingly, the standard tests are split up -into a number of different files that are selected for running depending on -which features are available. When updating the tests, it is all too easy to -put a new test into the wrong file by mistake; for example, to put a test that -requires UTF support into a file that is used when it is not available. To help -detect such mistakes as early as possible, there is a facility for locking out -specific modifiers. If an input line for \fBpcretest\fP starts with the string -"< forbid " the following sequence of characters is taken as a list of -forbidden modifiers. For example, in the test files that must not use UTF or -Unicode property support, this line appears: -.sp - < forbid 8W -.sp -This locks out the /8 and /W modifiers. An immediate error is given if they are -subsequently encountered. If the character string contains < but not >, all the -multi-character modifiers that begin with < are locked out. Otherwise, such -modifiers must be explicitly listed, for example: -.sp - < forbid -.sp -There must be a single space between < and "forbid" for this feature to be -recognised. If there is not, the line is interpreted either as a request to -re-load a pre-compiled pattern (see "SAVING AND RELOADING COMPILED PATTERNS" -below) or, if there is a another < character, as a pattern that uses < as its -delimiter. -. -. -.SH "DATA LINES" -.rs -.sp -Before each data line is passed to \fBpcre[16|32]_exec()\fP, leading and trailing -white space is removed, and it is then scanned for \e escapes. Some of these -are pretty esoteric features, intended for checking out some of the more -complicated features of PCRE. If you are just testing "ordinary" regular -expressions, you probably don't need any of these. The following escapes are -recognized: -.sp - \ea alarm (BEL, \ex07) - \eb backspace (\ex08) - \ee escape (\ex27) - \ef form feed (\ex0c) - \en newline (\ex0a) -.\" JOIN - \eqdd set the PCRE_MATCH_LIMIT limit to dd - (any number of digits) - \er carriage return (\ex0d) - \et tab (\ex09) - \ev vertical tab (\ex0b) - \ennn octal character (up to 3 octal digits); always - a byte unless > 255 in UTF-8 or 16-bit or 32-bit mode - \eo{dd...} octal character (any number of octal digits} - \exhh hexadecimal byte (up to 2 hex digits) - \ex{hh...} hexadecimal character (any number of hex digits) -.\" JOIN - \eA pass the PCRE_ANCHORED option to \fBpcre[16|32]_exec()\fP - or \fBpcre[16|32]_dfa_exec()\fP -.\" JOIN - \eB pass the PCRE_NOTBOL option to \fBpcre[16|32]_exec()\fP - or \fBpcre[16|32]_dfa_exec()\fP -.\" JOIN - \eCdd call pcre[16|32]_copy_substring() for substring dd - after a successful match (number less than 32) -.\" JOIN - \eCname call pcre[16|32]_copy_named_substring() for substring - "name" after a successful match (name termin- - ated by next non alphanumeric character) -.\" JOIN - \eC+ show the current captured substrings at callout - time - \eC- do not supply a callout function -.\" JOIN - \eC!n return 1 instead of 0 when callout number n is - reached -.\" JOIN - \eC!n!m return 1 instead of 0 when callout number n is - reached for the nth time -.\" JOIN - \eC*n pass the number n (may be negative) as callout - data; this is used as the callout return value - \eD use the \fBpcre[16|32]_dfa_exec()\fP match function - \eF only shortest match for \fBpcre[16|32]_dfa_exec()\fP -.\" JOIN - \eGdd call pcre[16|32]_get_substring() for substring dd - after a successful match (number less than 32) -.\" JOIN - \eGname call pcre[16|32]_get_named_substring() for substring - "name" after a successful match (name termin- - ated by next non-alphanumeric character) -.\" JOIN - \eJdd set up a JIT stack of dd kilobytes maximum (any - number of digits) -.\" JOIN - \eL call pcre[16|32]_get_substringlist() after a - successful match -.\" JOIN - \eM discover the minimum MATCH_LIMIT and - MATCH_LIMIT_RECURSION settings -.\" JOIN - \eN pass the PCRE_NOTEMPTY option to \fBpcre[16|32]_exec()\fP - or \fBpcre[16|32]_dfa_exec()\fP; if used twice, pass the - PCRE_NOTEMPTY_ATSTART option -.\" JOIN - \eOdd set the size of the output vector passed to - \fBpcre[16|32]_exec()\fP to dd (any number of digits) -.\" JOIN - \eP pass the PCRE_PARTIAL_SOFT option to \fBpcre[16|32]_exec()\fP - or \fBpcre[16|32]_dfa_exec()\fP; if used twice, pass the - PCRE_PARTIAL_HARD option -.\" JOIN - \eQdd set the PCRE_MATCH_LIMIT_RECURSION limit to dd - (any number of digits) - \eR pass the PCRE_DFA_RESTART option to \fBpcre[16|32]_dfa_exec()\fP - \eS output details of memory get/free calls during matching -.\" JOIN - \eY pass the PCRE_NO_START_OPTIMIZE option to \fBpcre[16|32]_exec()\fP - or \fBpcre[16|32]_dfa_exec()\fP -.\" JOIN - \eZ pass the PCRE_NOTEOL option to \fBpcre[16|32]_exec()\fP - or \fBpcre[16|32]_dfa_exec()\fP -.\" JOIN - \e? pass the PCRE_NO_UTF[8|16|32]_CHECK option to - \fBpcre[16|32]_exec()\fP or \fBpcre[16|32]_dfa_exec()\fP -.\" JOIN - \e>dd start the match at offset dd (optional "-"; then - any number of digits); this sets the \fIstartoffset\fP - argument for \fBpcre[16|32]_exec()\fP or \fBpcre[16|32]_dfa_exec()\fP -.\" JOIN - \e pass the PCRE_NEWLINE_CR option to \fBpcre[16|32]_exec()\fP - or \fBpcre[16|32]_dfa_exec()\fP -.\" JOIN - \e pass the PCRE_NEWLINE_LF option to \fBpcre[16|32]_exec()\fP - or \fBpcre[16|32]_dfa_exec()\fP -.\" JOIN - \e pass the PCRE_NEWLINE_CRLF option to \fBpcre[16|32]_exec()\fP - or \fBpcre[16|32]_dfa_exec()\fP -.\" JOIN - \e pass the PCRE_NEWLINE_ANYCRLF option to \fBpcre[16|32]_exec()\fP - or \fBpcre[16|32]_dfa_exec()\fP -.\" JOIN - \e pass the PCRE_NEWLINE_ANY option to \fBpcre[16|32]_exec()\fP - or \fBpcre[16|32]_dfa_exec()\fP -.sp -The use of \ex{hh...} is not dependent on the use of the \fB/8\fP modifier on -the pattern. It is recognized always. There may be any number of hexadecimal -digits inside the braces; invalid values provoke error messages. -.P -Note that \exhh specifies one byte rather than one character in UTF-8 mode; -this makes it possible to construct invalid UTF-8 sequences for testing -purposes. On the other hand, \ex{hh} is interpreted as a UTF-8 character in -UTF-8 mode, generating more than one byte if the value is greater than 127. -When testing the 8-bit library not in UTF-8 mode, \ex{hh} generates one byte -for values less than 256, and causes an error for greater values. -.P -In UTF-16 mode, all 4-digit \ex{hhhh} values are accepted. This makes it -possible to construct invalid UTF-16 sequences for testing purposes. -.P -In UTF-32 mode, all 4- to 8-digit \ex{...} values are accepted. This makes it -possible to construct invalid UTF-32 sequences for testing purposes. -.P -The escapes that specify line ending sequences are literal strings, exactly as -shown. No more than one newline setting should be present in any data line. -.P -A backslash followed by anything else just escapes the anything else. If -the very last character is a backslash, it is ignored. This gives a way of -passing an empty line as data, since a real empty line terminates the data -input. -.P -The \fB\eJ\fP escape provides a way of setting the maximum stack size that is -used by the just-in-time optimization code. It is ignored if JIT optimization -is not being used. Providing a stack that is larger than the default 32K is -necessary only for very complicated patterns. -.P -If \eM is present, \fBpcretest\fP calls \fBpcre[16|32]_exec()\fP several times, -with different values in the \fImatch_limit\fP and \fImatch_limit_recursion\fP -fields of the \fBpcre[16|32]_extra\fP data structure, until it finds the minimum -numbers for each parameter that allow \fBpcre[16|32]_exec()\fP to complete without -error. Because this is testing a specific feature of the normal interpretive -\fBpcre[16|32]_exec()\fP execution, the use of any JIT optimization that might -have been set up by the \fB/S+\fP qualifier of \fB-s+\fP option is disabled. -.P -The \fImatch_limit\fP number is a measure of the amount of backtracking -that takes place, and checking it out can be instructive. For most simple -matches, the number is quite small, but for patterns with very large numbers of -matching possibilities, it can become large very quickly with increasing length -of subject string. The \fImatch_limit_recursion\fP number is a measure of how -much stack (or, if PCRE is compiled with NO_RECURSE, how much heap) memory is -needed to complete the match attempt. -.P -When \eO is used, the value specified may be higher or lower than the size set -by the \fB-O\fP command line option (or defaulted to 45); \eO applies only to -the call of \fBpcre[16|32]_exec()\fP for the line in which it appears. -.P -If the \fB/P\fP modifier was present on the pattern, causing the POSIX wrapper -API to be used, the only option-setting sequences that have any effect are \eB, -\eN, and \eZ, causing REG_NOTBOL, REG_NOTEMPTY, and REG_NOTEOL, respectively, -to be passed to \fBregexec()\fP. -. -. -.SH "THE ALTERNATIVE MATCHING FUNCTION" -.rs -.sp -By default, \fBpcretest\fP uses the standard PCRE matching function, -\fBpcre[16|32]_exec()\fP to match each data line. PCRE also supports an -alternative matching function, \fBpcre[16|32]_dfa_test()\fP, which operates in a -different way, and has some restrictions. The differences between the two -functions are described in the -.\" HREF -\fBpcrematching\fP -.\" -documentation. -.P -If a data line contains the \eD escape sequence, or if the command line -contains the \fB-dfa\fP option, the alternative matching function is used. -This function finds all possible matches at a given point. If, however, the \eF -escape sequence is present in the data line, it stops after the first match is -found. This is always the shortest possible match. -. -. -.SH "DEFAULT OUTPUT FROM PCRETEST" -.rs -.sp -This section describes the output when the normal matching function, -\fBpcre[16|32]_exec()\fP, is being used. -.P -When a match succeeds, \fBpcretest\fP outputs the list of captured substrings -that \fBpcre[16|32]_exec()\fP returns, starting with number 0 for the string that -matched the whole pattern. Otherwise, it outputs "No match" when the return is -PCRE_ERROR_NOMATCH, and "Partial match:" followed by the partially matching -substring when \fBpcre[16|32]_exec()\fP returns PCRE_ERROR_PARTIAL. (Note that -this is the entire substring that was inspected during the partial match; it -may include characters before the actual match start if a lookbehind assertion, -\eK, \eb, or \eB was involved.) For any other return, \fBpcretest\fP outputs -the PCRE negative error number and a short descriptive phrase. If the error is -a failed UTF string check, the offset of the start of the failing character and -the reason code are also output, provided that the size of the output vector is -at least two. Here is an example of an interactive \fBpcretest\fP run. -.sp - $ pcretest - PCRE version 8.13 2011-04-30 -.sp - re> /^abc(\ed+)/ - data> abc123 - 0: abc123 - 1: 123 - data> xyz - No match -.sp -Unset capturing substrings that are not followed by one that is set are not -returned by \fBpcre[16|32]_exec()\fP, and are not shown by \fBpcretest\fP. In the -following example, there are two capturing substrings, but when the first data -line is matched, the second, unset substring is not shown. An "internal" unset -substring is shown as "", as for the second data line. -.sp - re> /(a)|(b)/ - data> a - 0: a - 1: a - data> b - 0: b - 1: - 2: b -.sp -If the strings contain any non-printing characters, they are output as \exhh -escapes if the value is less than 256 and UTF mode is not set. Otherwise they -are output as \ex{hh...} escapes. See below for the definition of non-printing -characters. If the pattern has the \fB/+\fP modifier, the output for substring -0 is followed by the the rest of the subject string, identified by "0+" like -this: -.sp - re> /cat/+ - data> cataract - 0: cat - 0+ aract -.sp -If the pattern has the \fB/g\fP or \fB/G\fP modifier, the results of successive -matching attempts are output in sequence, like this: -.sp - re> /\eBi(\ew\ew)/g - data> Mississippi - 0: iss - 1: ss - 0: iss - 1: ss - 0: ipp - 1: pp -.sp -"No match" is output only if the first match attempt fails. Here is an example -of a failure message (the offset 4 that is specified by \e>4 is past the end of -the subject string): -.sp - re> /xyz/ - data> xyz\e>4 - Error -24 (bad offset value) -.P -If any of the sequences \fB\eC\fP, \fB\eG\fP, or \fB\eL\fP are present in a -data line that is successfully matched, the substrings extracted by the -convenience functions are output with C, G, or L after the string number -instead of a colon. This is in addition to the normal full list. The string -length (that is, the return from the extraction function) is given in -parentheses after each string for \fB\eC\fP and \fB\eG\fP. -.P -Note that whereas patterns can be continued over several lines (a plain ">" -prompt is used for continuations), data lines may not. However newlines can be -included in data by means of the \en escape (or \er, \er\en, etc., depending on -the newline sequence setting). -. -. -. -.SH "OUTPUT FROM THE ALTERNATIVE MATCHING FUNCTION" -.rs -.sp -When the alternative matching function, \fBpcre[16|32]_dfa_exec()\fP, is used (by -means of the \eD escape sequence or the \fB-dfa\fP command line option), the -output consists of a list of all the matches that start at the first point in -the subject where there is at least one match. For example: -.sp - re> /(tang|tangerine|tan)/ - data> yellow tangerine\eD - 0: tangerine - 1: tang - 2: tan -.sp -(Using the normal matching function on this data finds only "tang".) The -longest matching string is always given first (and numbered zero). After a -PCRE_ERROR_PARTIAL return, the output is "Partial match:", followed by the -partially matching substring. (Note that this is the entire substring that was -inspected during the partial match; it may include characters before the actual -match start if a lookbehind assertion, \eK, \eb, or \eB was involved.) -.P -If \fB/g\fP is present on the pattern, the search for further matches resumes -at the end of the longest match. For example: -.sp - re> /(tang|tangerine|tan)/g - data> yellow tangerine and tangy sultana\eD - 0: tangerine - 1: tang - 2: tan - 0: tang - 1: tan - 0: tan -.sp -Since the matching function does not support substring capture, the escape -sequences that are concerned with captured substrings are not relevant. -. -. -.SH "RESTARTING AFTER A PARTIAL MATCH" -.rs -.sp -When the alternative matching function has given the PCRE_ERROR_PARTIAL return, -indicating that the subject partially matched the pattern, you can restart the -match with additional subject data by means of the \eR escape sequence. For -example: -.sp - re> /^\ed?\ed(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)\ed\ed$/ - data> 23ja\eP\eD - Partial match: 23ja - data> n05\eR\eD - 0: n05 -.sp -For further information about partial matching, see the -.\" HREF -\fBpcrepartial\fP -.\" -documentation. -. -. -.SH CALLOUTS -.rs -.sp -If the pattern contains any callout requests, \fBpcretest\fP's callout function -is called during matching. This works with both matching functions. By default, -the called function displays the callout number, the start and current -positions in the text at the callout time, and the next pattern item to be -tested. For example: -.sp - --->pqrabcdef - 0 ^ ^ \ed -.sp -This output indicates that callout number 0 occurred for a match attempt -starting at the fourth character of the subject string, when the pointer was at -the seventh character of the data, and when the next pattern item was \ed. Just -one circumflex is output if the start and current positions are the same. -.P -Callouts numbered 255 are assumed to be automatic callouts, inserted as a -result of the \fB/C\fP pattern modifier. In this case, instead of showing the -callout number, the offset in the pattern, preceded by a plus, is output. For -example: -.sp - re> /\ed?[A-E]\e*/C - data> E* - --->E* - +0 ^ \ed? - +3 ^ [A-E] - +8 ^^ \e* - +10 ^ ^ - 0: E* -.sp -If a pattern contains (*MARK) items, an additional line is output whenever -a change of latest mark is passed to the callout function. For example: -.sp - re> /a(*MARK:X)bc/C - data> abc - --->abc - +0 ^ a - +1 ^^ (*MARK:X) - +10 ^^ b - Latest Mark: X - +11 ^ ^ c - +12 ^ ^ - 0: abc -.sp -The mark changes between matching "a" and "b", but stays the same for the rest -of the match, so nothing more is output. If, as a result of backtracking, the -mark reverts to being unset, the text "" is output. -.P -The callout function in \fBpcretest\fP returns zero (carry on matching) by -default, but you can use a \eC item in a data line (as described above) to -change this and other parameters of the callout. -.P -Inserting callouts can be helpful when using \fBpcretest\fP to check -complicated regular expressions. For further information about callouts, see -the -.\" HREF -\fBpcrecallout\fP -.\" -documentation. -. -. -. -.SH "NON-PRINTING CHARACTERS" -.rs -.sp -When \fBpcretest\fP is outputting text in the compiled version of a pattern, -bytes other than 32-126 are always treated as non-printing characters are are -therefore shown as hex escapes. -.P -When \fBpcretest\fP is outputting text that is a matched part of a subject -string, it behaves in the same way, unless a different locale has been set for -the pattern (using the \fB/L\fP modifier). In this case, the \fBisprint()\fP -function to distinguish printing and non-printing characters. -. -. -. -.SH "SAVING AND RELOADING COMPILED PATTERNS" -.rs -.sp -The facilities described in this section are not available when the POSIX -interface to PCRE is being used, that is, when the \fB/P\fP pattern modifier is -specified. -.P -When the POSIX interface is not in use, you can cause \fBpcretest\fP to write a -compiled pattern to a file, by following the modifiers with > and a file name. -For example: -.sp - /pattern/im >/some/file -.sp -See the -.\" HREF -\fBpcreprecompile\fP -.\" -documentation for a discussion about saving and re-using compiled patterns. -Note that if the pattern was successfully studied with JIT optimization, the -JIT data cannot be saved. -.P -The data that is written is binary. The first eight bytes are the length of the -compiled pattern data followed by the length of the optional study data, each -written as four bytes in big-endian order (most significant byte first). If -there is no study data (either the pattern was not studied, or studying did not -return any data), the second length is zero. The lengths are followed by an -exact copy of the compiled pattern. If there is additional study data, this -(excluding any JIT data) follows immediately after the compiled pattern. After -writing the file, \fBpcretest\fP expects to read a new pattern. -.P -A saved pattern can be reloaded into \fBpcretest\fP by specifying < and a file -name instead of a pattern. There must be no space between < and the file name, -which must not contain a < character, as otherwise \fBpcretest\fP will -interpret the line as a pattern delimited by < characters. For example: -.sp - re> -.\" -ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre -.\" -.P -Details of exactly which Perl regular expression features are and are not -supported by PCRE are given in separate documents. See the -.\" HREF -\fBpcrepattern\fP -.\" -and -.\" HREF -\fBpcrecompat\fP -.\" -pages. There is a syntax summary in the -.\" HREF -\fBpcresyntax\fP -.\" -page. -.P -Some features of PCRE can be included, excluded, or changed when the library is -built. The -.\" HREF -\fBpcre_config()\fP -.\" -function makes it possible for a client to discover which features are -available. The features themselves are described in the -.\" HREF -\fBpcrebuild\fP -.\" -page. Documentation about building PCRE for various operating systems can be -found in the -.\" HTML -.\" -\fBREADME\fP -.\" -and -.\" HTML -.\" -\fBNON-AUTOTOOLS_BUILD\fP -.\" -files in the source distribution. -.P -The libraries contains a number of undocumented internal functions and data -tables that are used by more than one of the exported external functions, but -which are not intended for use by external callers. Their names all begin with -"_pcre_" or "_pcre16_" or "_pcre32_", which hopefully will not provoke any name -clashes. In some environments, it is possible to control which external symbols -are exported when a shared library is built, and in these cases the -undocumented symbols are not exported. -. -. -.SH "SECURITY CONSIDERATIONS" -.rs -.sp -If you are using PCRE in a non-UTF application that permits users to supply -arbitrary patterns for compilation, you should be aware of a feature that -allows users to turn on UTF support from within a pattern, provided that PCRE -was built with UTF support. For example, an 8-bit pattern that begins with -"(*UTF8)" or "(*UTF)" turns on UTF-8 mode, which interprets patterns and -subjects as strings of UTF-8 characters instead of individual 8-bit characters. -This causes both the pattern and any data against which it is matched to be -checked for UTF-8 validity. If the data string is very long, such a check might -use sufficiently many resources as to cause your application to lose -performance. -.P -One way of guarding against this possibility is to use the -\fBpcre_fullinfo()\fP function to check the compiled pattern's options for UTF. -Alternatively, from release 8.33, you can set the PCRE_NEVER_UTF option at -compile time. This causes an compile time error if a pattern contains a -UTF-setting sequence. -.P -If your application is one that supports UTF, be aware that validity checking -can take time. If the same data string is to be matched many times, you can use -the PCRE_NO_UTF[8|16|32]_CHECK option for the second and subsequent matches to -save redundant checks. -.P -Another way that performance can be hit is by running a pattern that has a very -large search tree against a string that will never match. Nested unlimited -repeats in a pattern are a common example. PCRE provides some protection -against this: see the PCRE_EXTRA_MATCH_LIMIT feature in the -.\" HREF -\fBpcreapi\fP -.\" -page. -. -. -.SH "USER DOCUMENTATION" -.rs -.sp -The user documentation for PCRE comprises a number of different sections. In -the "man" format, each of these is a separate "man page". In the HTML format, -each is a separate page, linked from the index page. In the plain text format, -the descriptions of the \fBpcregrep\fP and \fBpcretest\fP programs are in files -called \fBpcregrep.txt\fP and \fBpcretest.txt\fP, respectively. The remaining -sections, except for the \fBpcredemo\fP section (which is a program listing), -are concatenated in \fBpcre.txt\fP, for ease of searching. The sections are as -follows: -.sp - pcre this document - pcre-config show PCRE installation configuration information - pcre16 details of the 16-bit library - pcre32 details of the 32-bit library - pcreapi details of PCRE's native C API - pcrebuild building PCRE - pcrecallout details of the callout feature - pcrecompat discussion of Perl compatibility - pcrecpp details of the C++ wrapper for the 8-bit library - pcredemo a demonstration C program that uses PCRE - pcregrep description of the \fBpcregrep\fP command (8-bit only) - pcrejit discussion of the just-in-time optimization support - pcrelimits details of size and other limits - pcrematching discussion of the two matching algorithms - pcrepartial details of the partial matching facility -.\" JOIN - pcrepattern syntax and semantics of supported - regular expressions - pcreperform discussion of performance issues - pcreposix the POSIX-compatible C API for the 8-bit library - pcreprecompile details of saving and re-using precompiled patterns - pcresample discussion of the pcredemo program - pcrestack discussion of stack usage - pcresyntax quick syntax reference - pcretest description of the \fBpcretest\fP testing command - pcreunicode discussion of Unicode and UTF-8/16/32 support -.sp -In the "man" and HTML formats, there is also a short page for each C library -function, listing its arguments and results. -. -. -.SH AUTHOR -.rs -.sp -.nf -Philip Hazel -University Computing Service -Cambridge CB2 3QH, England. -.fi -.P -Putting an actual email address here seems to have been a spam magnet, so I've -taken it away. If you want to email me, use my two initials, followed by the -two digits 10, at the domain cam.ac.uk. -. -. -.SH REVISION -.rs -.sp -.nf -Last updated: 10 February 2015 -Copyright (c) 1997-2015 University of Cambridge. -.fi diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre16.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre16.3 deleted file mode 100644 index 85126a67..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre16.3 +++ /dev/null @@ -1,371 +0,0 @@ -.TH PCRE 3 "12 May 2013" "PCRE 8.33" -.SH NAME -PCRE - Perl-compatible regular expressions -.sp -.B #include -. -. -.SH "PCRE 16-BIT API BASIC FUNCTIONS" -.rs -.sp -.nf -.B pcre16 *pcre16_compile(PCRE_SPTR16 \fIpattern\fP, int \fIoptions\fP, -.B " const char **\fIerrptr\fP, int *\fIerroffset\fP," -.B " const unsigned char *\fItableptr\fP);" -.sp -.B pcre16 *pcre16_compile2(PCRE_SPTR16 \fIpattern\fP, int \fIoptions\fP, -.B " int *\fIerrorcodeptr\fP," -.B " const char **\fIerrptr\fP, int *\fIerroffset\fP," -.B " const unsigned char *\fItableptr\fP);" -.sp -.B pcre16_extra *pcre16_study(const pcre16 *\fIcode\fP, int \fIoptions\fP, -.B " const char **\fIerrptr\fP);" -.sp -.B void pcre16_free_study(pcre16_extra *\fIextra\fP); -.sp -.B int pcre16_exec(const pcre16 *\fIcode\fP, "const pcre16_extra *\fIextra\fP," -.B " PCRE_SPTR16 \fIsubject\fP, int \fIlength\fP, int \fIstartoffset\fP," -.B " int \fIoptions\fP, int *\fIovector\fP, int \fIovecsize\fP);" -.sp -.B int pcre16_dfa_exec(const pcre16 *\fIcode\fP, "const pcre16_extra *\fIextra\fP," -.B " PCRE_SPTR16 \fIsubject\fP, int \fIlength\fP, int \fIstartoffset\fP," -.B " int \fIoptions\fP, int *\fIovector\fP, int \fIovecsize\fP," -.B " int *\fIworkspace\fP, int \fIwscount\fP);" -.fi -. -. -.SH "PCRE 16-BIT API STRING EXTRACTION FUNCTIONS" -.rs -.sp -.nf -.B int pcre16_copy_named_substring(const pcre16 *\fIcode\fP, -.B " PCRE_SPTR16 \fIsubject\fP, int *\fIovector\fP," -.B " int \fIstringcount\fP, PCRE_SPTR16 \fIstringname\fP," -.B " PCRE_UCHAR16 *\fIbuffer\fP, int \fIbuffersize\fP);" -.sp -.B int pcre16_copy_substring(PCRE_SPTR16 \fIsubject\fP, int *\fIovector\fP, -.B " int \fIstringcount\fP, int \fIstringnumber\fP, PCRE_UCHAR16 *\fIbuffer\fP," -.B " int \fIbuffersize\fP);" -.sp -.B int pcre16_get_named_substring(const pcre16 *\fIcode\fP, -.B " PCRE_SPTR16 \fIsubject\fP, int *\fIovector\fP," -.B " int \fIstringcount\fP, PCRE_SPTR16 \fIstringname\fP," -.B " PCRE_SPTR16 *\fIstringptr\fP);" -.sp -.B int pcre16_get_stringnumber(const pcre16 *\fIcode\fP, -.B " PCRE_SPTR16 \fIname\fP); -.sp -.B int pcre16_get_stringtable_entries(const pcre16 *\fIcode\fP, -.B " PCRE_SPTR16 \fIname\fP, PCRE_UCHAR16 **\fIfirst\fP, PCRE_UCHAR16 **\fIlast\fP);" -.sp -.B int pcre16_get_substring(PCRE_SPTR16 \fIsubject\fP, int *\fIovector\fP, -.B " int \fIstringcount\fP, int \fIstringnumber\fP," -.B " PCRE_SPTR16 *\fIstringptr\fP);" -.sp -.B int pcre16_get_substring_list(PCRE_SPTR16 \fIsubject\fP, -.B " int *\fIovector\fP, int \fIstringcount\fP, PCRE_SPTR16 **\fIlistptr\fP);" -.sp -.B void pcre16_free_substring(PCRE_SPTR16 \fIstringptr\fP); -.sp -.B void pcre16_free_substring_list(PCRE_SPTR16 *\fIstringptr\fP); -.fi -. -. -.SH "PCRE 16-BIT API AUXILIARY FUNCTIONS" -.rs -.sp -.nf -.B pcre16_jit_stack *pcre16_jit_stack_alloc(int \fIstartsize\fP, int \fImaxsize\fP); -.sp -.B void pcre16_jit_stack_free(pcre16_jit_stack *\fIstack\fP); -.sp -.B void pcre16_assign_jit_stack(pcre16_extra *\fIextra\fP, -.B " pcre16_jit_callback \fIcallback\fP, void *\fIdata\fP);" -.sp -.B const unsigned char *pcre16_maketables(void); -.sp -.B int pcre16_fullinfo(const pcre16 *\fIcode\fP, "const pcre16_extra *\fIextra\fP," -.B " int \fIwhat\fP, void *\fIwhere\fP);" -.sp -.B int pcre16_refcount(pcre16 *\fIcode\fP, int \fIadjust\fP); -.sp -.B int pcre16_config(int \fIwhat\fP, void *\fIwhere\fP); -.sp -.B const char *pcre16_version(void); -.sp -.B int pcre16_pattern_to_host_byte_order(pcre16 *\fIcode\fP, -.B " pcre16_extra *\fIextra\fP, const unsigned char *\fItables\fP);" -.fi -. -. -.SH "PCRE 16-BIT API INDIRECTED FUNCTIONS" -.rs -.sp -.nf -.B void *(*pcre16_malloc)(size_t); -.sp -.B void (*pcre16_free)(void *); -.sp -.B void *(*pcre16_stack_malloc)(size_t); -.sp -.B void (*pcre16_stack_free)(void *); -.sp -.B int (*pcre16_callout)(pcre16_callout_block *); -.fi -. -. -.SH "PCRE 16-BIT API 16-BIT-ONLY FUNCTION" -.rs -.sp -.nf -.B int pcre16_utf16_to_host_byte_order(PCRE_UCHAR16 *\fIoutput\fP, -.B " PCRE_SPTR16 \fIinput\fP, int \fIlength\fP, int *\fIbyte_order\fP," -.B " int \fIkeep_boms\fP);" -.fi -. -. -.SH "THE PCRE 16-BIT LIBRARY" -.rs -.sp -Starting with release 8.30, it is possible to compile a PCRE library that -supports 16-bit character strings, including UTF-16 strings, as well as or -instead of the original 8-bit library. The majority of the work to make this -possible was done by Zoltan Herczeg. The two libraries contain identical sets -of functions, used in exactly the same way. Only the names of the functions and -the data types of their arguments and results are different. To avoid -over-complication and reduce the documentation maintenance load, most of the -PCRE documentation describes the 8-bit library, with only occasional references -to the 16-bit library. This page describes what is different when you use the -16-bit library. -.P -WARNING: A single application can be linked with both libraries, but you must -take care when processing any particular pattern to use functions from just one -library. For example, if you want to study a pattern that was compiled with -\fBpcre16_compile()\fP, you must do so with \fBpcre16_study()\fP, not -\fBpcre_study()\fP, and you must free the study data with -\fBpcre16_free_study()\fP. -. -. -.SH "THE HEADER FILE" -.rs -.sp -There is only one header file, \fBpcre.h\fP. It contains prototypes for all the -functions in all libraries, as well as definitions of flags, structures, error -codes, etc. -. -. -.SH "THE LIBRARY NAME" -.rs -.sp -In Unix-like systems, the 16-bit library is called \fBlibpcre16\fP, and can -normally be accesss by adding \fB-lpcre16\fP to the command for linking an -application that uses PCRE. -. -. -.SH "STRING TYPES" -.rs -.sp -In the 8-bit library, strings are passed to PCRE library functions as vectors -of bytes with the C type "char *". In the 16-bit library, strings are passed as -vectors of unsigned 16-bit quantities. The macro PCRE_UCHAR16 specifies an -appropriate data type, and PCRE_SPTR16 is defined as "const PCRE_UCHAR16 *". In -very many environments, "short int" is a 16-bit data type. When PCRE is built, -it defines PCRE_UCHAR16 as "unsigned short int", but checks that it really is a -16-bit data type. If it is not, the build fails with an error message telling -the maintainer to modify the definition appropriately. -. -. -.SH "STRUCTURE TYPES" -.rs -.sp -The types of the opaque structures that are used for compiled 16-bit patterns -and JIT stacks are \fBpcre16\fP and \fBpcre16_jit_stack\fP respectively. The -type of the user-accessible structure that is returned by \fBpcre16_study()\fP -is \fBpcre16_extra\fP, and the type of the structure that is used for passing -data to a callout function is \fBpcre16_callout_block\fP. These structures -contain the same fields, with the same names, as their 8-bit counterparts. The -only difference is that pointers to character strings are 16-bit instead of -8-bit types. -. -. -.SH "16-BIT FUNCTIONS" -.rs -.sp -For every function in the 8-bit library there is a corresponding function in -the 16-bit library with a name that starts with \fBpcre16_\fP instead of -\fBpcre_\fP. The prototypes are listed above. In addition, there is one extra -function, \fBpcre16_utf16_to_host_byte_order()\fP. This is a utility function -that converts a UTF-16 character string to host byte order if necessary. The -other 16-bit functions expect the strings they are passed to be in host byte -order. -.P -The \fIinput\fP and \fIoutput\fP arguments of -\fBpcre16_utf16_to_host_byte_order()\fP may point to the same address, that is, -conversion in place is supported. The output buffer must be at least as long as -the input. -.P -The \fIlength\fP argument specifies the number of 16-bit data units in the -input string; a negative value specifies a zero-terminated string. -.P -If \fIbyte_order\fP is NULL, it is assumed that the string starts off in host -byte order. This may be changed by byte-order marks (BOMs) anywhere in the -string (commonly as the first character). -.P -If \fIbyte_order\fP is not NULL, a non-zero value of the integer to which it -points means that the input starts off in host byte order, otherwise the -opposite order is assumed. Again, BOMs in the string can change this. The final -byte order is passed back at the end of processing. -.P -If \fIkeep_boms\fP is not zero, byte-order mark characters (0xfeff) are copied -into the output string. Otherwise they are discarded. -.P -The result of the function is the number of 16-bit units placed into the output -buffer, including the zero terminator if the string was zero-terminated. -. -. -.SH "SUBJECT STRING OFFSETS" -.rs -.sp -The lengths and starting offsets of subject strings must be specified in 16-bit -data units, and the offsets within subject strings that are returned by the -matching functions are in also 16-bit units rather than bytes. -. -. -.SH "NAMED SUBPATTERNS" -.rs -.sp -The name-to-number translation table that is maintained for named subpatterns -uses 16-bit characters. The \fBpcre16_get_stringtable_entries()\fP function -returns the length of each entry in the table as the number of 16-bit data -units. -. -. -.SH "OPTION NAMES" -.rs -.sp -There are two new general option names, PCRE_UTF16 and PCRE_NO_UTF16_CHECK, -which correspond to PCRE_UTF8 and PCRE_NO_UTF8_CHECK in the 8-bit library. In -fact, these new options define the same bits in the options word. There is a -discussion about the -.\" HTML -.\" -validity of UTF-16 strings -.\" -in the -.\" HREF -\fBpcreunicode\fP -.\" -page. -.P -For the \fBpcre16_config()\fP function there is an option PCRE_CONFIG_UTF16 -that returns 1 if UTF-16 support is configured, otherwise 0. If this option is -given to \fBpcre_config()\fP or \fBpcre32_config()\fP, or if the -PCRE_CONFIG_UTF8 or PCRE_CONFIG_UTF32 option is given to \fBpcre16_config()\fP, -the result is the PCRE_ERROR_BADOPTION error. -. -. -.SH "CHARACTER CODES" -.rs -.sp -In 16-bit mode, when PCRE_UTF16 is not set, character values are treated in the -same way as in 8-bit, non UTF-8 mode, except, of course, that they can range -from 0 to 0xffff instead of 0 to 0xff. Character types for characters less than -0xff can therefore be influenced by the locale in the same way as before. -Characters greater than 0xff have only one case, and no "type" (such as letter -or digit). -.P -In UTF-16 mode, the character code is Unicode, in the range 0 to 0x10ffff, with -the exception of values in the range 0xd800 to 0xdfff because those are -"surrogate" values that are used in pairs to encode values greater than 0xffff. -.P -A UTF-16 string can indicate its endianness by special code knows as a -byte-order mark (BOM). The PCRE functions do not handle this, expecting strings -to be in host byte order. A utility function called -\fBpcre16_utf16_to_host_byte_order()\fP is provided to help with this (see -above). -. -. -.SH "ERROR NAMES" -.rs -.sp -The errors PCRE_ERROR_BADUTF16_OFFSET and PCRE_ERROR_SHORTUTF16 correspond to -their 8-bit counterparts. The error PCRE_ERROR_BADMODE is given when a compiled -pattern is passed to a function that processes patterns in the other -mode, for example, if a pattern compiled with \fBpcre_compile()\fP is passed to -\fBpcre16_exec()\fP. -.P -There are new error codes whose names begin with PCRE_UTF16_ERR for invalid -UTF-16 strings, corresponding to the PCRE_UTF8_ERR codes for UTF-8 strings that -are described in the section entitled -.\" HTML -.\" -"Reason codes for invalid UTF-8 strings" -.\" -in the main -.\" HREF -\fBpcreapi\fP -.\" -page. The UTF-16 errors are: -.sp - PCRE_UTF16_ERR1 Missing low surrogate at end of string - PCRE_UTF16_ERR2 Invalid low surrogate follows high surrogate - PCRE_UTF16_ERR3 Isolated low surrogate - PCRE_UTF16_ERR4 Non-character -. -. -.SH "ERROR TEXTS" -.rs -.sp -If there is an error while compiling a pattern, the error text that is passed -back by \fBpcre16_compile()\fP or \fBpcre16_compile2()\fP is still an 8-bit -character string, zero-terminated. -. -. -.SH "CALLOUTS" -.rs -.sp -The \fIsubject\fP and \fImark\fP fields in the callout block that is passed to -a callout function point to 16-bit vectors. -. -. -.SH "TESTING" -.rs -.sp -The \fBpcretest\fP program continues to operate with 8-bit input and output -files, but it can be used for testing the 16-bit library. If it is run with the -command line option \fB-16\fP, patterns and subject strings are converted from -8-bit to 16-bit before being passed to PCRE, and the 16-bit library functions -are used instead of the 8-bit ones. Returned 16-bit strings are converted to -8-bit for output. If both the 8-bit and the 32-bit libraries were not compiled, -\fBpcretest\fP defaults to 16-bit and the \fB-16\fP option is ignored. -.P -When PCRE is being built, the \fBRunTest\fP script that is called by "make -check" uses the \fBpcretest\fP \fB-C\fP option to discover which of the 8-bit, -16-bit and 32-bit libraries has been built, and runs the tests appropriately. -. -. -.SH "NOT SUPPORTED IN 16-BIT MODE" -.rs -.sp -Not all the features of the 8-bit library are available with the 16-bit -library. The C++ and POSIX wrapper functions support only the 8-bit library, -and the \fBpcregrep\fP program is at present 8-bit only. -. -. -.SH AUTHOR -.rs -.sp -.nf -Philip Hazel -University Computing Service -Cambridge CB2 3QH, England. -.fi -. -. -.SH REVISION -.rs -.sp -.nf -Last updated: 12 May 2013 -Copyright (c) 1997-2013 University of Cambridge. -.fi diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre16_assign_jit_stack.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre16_assign_jit_stack.3 deleted file mode 120000 index 40c8775a..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre16_assign_jit_stack.3 +++ /dev/null @@ -1 +0,0 @@ -pcre_assign_jit_stack.3 \ No newline at end of file diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre16_compile.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre16_compile.3 deleted file mode 120000 index 9364e751..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre16_compile.3 +++ /dev/null @@ -1 +0,0 @@ -pcre_compile.3 \ No newline at end of file diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre16_compile2.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre16_compile2.3 deleted file mode 120000 index 2d6aff35..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre16_compile2.3 +++ /dev/null @@ -1 +0,0 @@ -pcre_compile2.3 \ No newline at end of file diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre16_config.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre16_config.3 deleted file mode 120000 index db964059..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre16_config.3 +++ /dev/null @@ -1 +0,0 @@ -pcre_config.3 \ No newline at end of file diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre16_copy_named_substring.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre16_copy_named_substring.3 deleted file mode 120000 index c15b9774..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre16_copy_named_substring.3 +++ /dev/null @@ -1 +0,0 @@ -pcre_copy_named_substring.3 \ No newline at end of file diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre16_copy_substring.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre16_copy_substring.3 deleted file mode 120000 index 98d1f84d..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre16_copy_substring.3 +++ /dev/null @@ -1 +0,0 @@ -pcre_copy_substring.3 \ No newline at end of file diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre16_dfa_exec.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre16_dfa_exec.3 deleted file mode 120000 index ed408df0..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre16_dfa_exec.3 +++ /dev/null @@ -1 +0,0 @@ -pcre_dfa_exec.3 \ No newline at end of file diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre16_exec.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre16_exec.3 deleted file mode 120000 index ebaa2527..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre16_exec.3 +++ /dev/null @@ -1 +0,0 @@ -pcre_exec.3 \ No newline at end of file diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre16_free_study.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre16_free_study.3 deleted file mode 120000 index 4c53ea9f..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre16_free_study.3 +++ /dev/null @@ -1 +0,0 @@ -pcre_free_study.3 \ No newline at end of file diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre16_free_substring.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre16_free_substring.3 deleted file mode 120000 index 48567bfb..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre16_free_substring.3 +++ /dev/null @@ -1 +0,0 @@ -pcre_free_substring.3 \ No newline at end of file diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre16_free_substring_list.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre16_free_substring_list.3 deleted file mode 120000 index 84b7b7e5..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre16_free_substring_list.3 +++ /dev/null @@ -1 +0,0 @@ -pcre_free_substring_list.3 \ No newline at end of file diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre16_fullinfo.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre16_fullinfo.3 deleted file mode 120000 index b7386a98..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre16_fullinfo.3 +++ /dev/null @@ -1 +0,0 @@ -pcre_fullinfo.3 \ No newline at end of file diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre16_get_named_substring.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre16_get_named_substring.3 deleted file mode 120000 index c095ca50..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre16_get_named_substring.3 +++ /dev/null @@ -1 +0,0 @@ -pcre_get_named_substring.3 \ No newline at end of file diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre16_get_stringnumber.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre16_get_stringnumber.3 deleted file mode 120000 index f8e81d32..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre16_get_stringnumber.3 +++ /dev/null @@ -1 +0,0 @@ -pcre_get_stringnumber.3 \ No newline at end of file diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre16_get_stringtable_entries.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre16_get_stringtable_entries.3 deleted file mode 120000 index 9f8cc4a7..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre16_get_stringtable_entries.3 +++ /dev/null @@ -1 +0,0 @@ -pcre_get_stringtable_entries.3 \ No newline at end of file diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre16_get_substring.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre16_get_substring.3 deleted file mode 120000 index 26383b5d..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre16_get_substring.3 +++ /dev/null @@ -1 +0,0 @@ -pcre_get_substring.3 \ No newline at end of file diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre16_get_substring_list.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre16_get_substring_list.3 deleted file mode 120000 index 2faa865f..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre16_get_substring_list.3 +++ /dev/null @@ -1 +0,0 @@ -pcre_get_substring_list.3 \ No newline at end of file diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre16_jit_exec.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre16_jit_exec.3 deleted file mode 120000 index 59089ada..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre16_jit_exec.3 +++ /dev/null @@ -1 +0,0 @@ -pcre_jit_exec.3 \ No newline at end of file diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre16_jit_stack_alloc.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre16_jit_stack_alloc.3 deleted file mode 120000 index dab43b82..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre16_jit_stack_alloc.3 +++ /dev/null @@ -1 +0,0 @@ -pcre_jit_stack_alloc.3 \ No newline at end of file diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre16_jit_stack_free.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre16_jit_stack_free.3 deleted file mode 120000 index e92aa310..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre16_jit_stack_free.3 +++ /dev/null @@ -1 +0,0 @@ -pcre_jit_stack_free.3 \ No newline at end of file diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre16_maketables.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre16_maketables.3 deleted file mode 120000 index 3b6308e2..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre16_maketables.3 +++ /dev/null @@ -1 +0,0 @@ -pcre_maketables.3 \ No newline at end of file diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre16_pattern_to_host_byte_order.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre16_pattern_to_host_byte_order.3 deleted file mode 120000 index 6540917e..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre16_pattern_to_host_byte_order.3 +++ /dev/null @@ -1 +0,0 @@ -pcre_pattern_to_host_byte_order.3 \ No newline at end of file diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre16_refcount.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre16_refcount.3 deleted file mode 120000 index 63cece3f..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre16_refcount.3 +++ /dev/null @@ -1 +0,0 @@ -pcre_refcount.3 \ No newline at end of file diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre16_study.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre16_study.3 deleted file mode 120000 index 9871217f..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre16_study.3 +++ /dev/null @@ -1 +0,0 @@ -pcre_study.3 \ No newline at end of file diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre16_utf16_to_host_byte_order.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre16_utf16_to_host_byte_order.3 deleted file mode 120000 index d9233991..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre16_utf16_to_host_byte_order.3 +++ /dev/null @@ -1 +0,0 @@ -pcre_utf16_to_host_byte_order.3 \ No newline at end of file diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre16_version.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre16_version.3 deleted file mode 120000 index c31893c6..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre16_version.3 +++ /dev/null @@ -1 +0,0 @@ -pcre_version.3 \ No newline at end of file diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre32.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre32.3 deleted file mode 100644 index 7cde8c08..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre32.3 +++ /dev/null @@ -1,369 +0,0 @@ -.TH PCRE 3 "12 May 2013" "PCRE 8.33" -.SH NAME -PCRE - Perl-compatible regular expressions -.sp -.B #include -. -. -.SH "PCRE 32-BIT API BASIC FUNCTIONS" -.rs -.sp -.nf -.B pcre32 *pcre32_compile(PCRE_SPTR32 \fIpattern\fP, int \fIoptions\fP, -.B " const char **\fIerrptr\fP, int *\fIerroffset\fP," -.B " const unsigned char *\fItableptr\fP);" -.sp -.B pcre32 *pcre32_compile2(PCRE_SPTR32 \fIpattern\fP, int \fIoptions\fP, -.B " int *\fIerrorcodeptr\fP," -.B " const unsigned char *\fItableptr\fP);" -.sp -.B pcre32_extra *pcre32_study(const pcre32 *\fIcode\fP, int \fIoptions\fP, -.B " const char **\fIerrptr\fP);" -.sp -.B void pcre32_free_study(pcre32_extra *\fIextra\fP); -.sp -.B int pcre32_exec(const pcre32 *\fIcode\fP, "const pcre32_extra *\fIextra\fP," -.B " PCRE_SPTR32 \fIsubject\fP, int \fIlength\fP, int \fIstartoffset\fP," -.B " int \fIoptions\fP, int *\fIovector\fP, int \fIovecsize\fP);" -.sp -.B int pcre32_dfa_exec(const pcre32 *\fIcode\fP, "const pcre32_extra *\fIextra\fP," -.B " PCRE_SPTR32 \fIsubject\fP, int \fIlength\fP, int \fIstartoffset\fP," -.B " int \fIoptions\fP, int *\fIovector\fP, int \fIovecsize\fP," -.B " int *\fIworkspace\fP, int \fIwscount\fP);" -.fi -. -. -.SH "PCRE 32-BIT API STRING EXTRACTION FUNCTIONS" -.rs -.sp -.nf -.B int pcre32_copy_named_substring(const pcre32 *\fIcode\fP, -.B " PCRE_SPTR32 \fIsubject\fP, int *\fIovector\fP," -.B " int \fIstringcount\fP, PCRE_SPTR32 \fIstringname\fP," -.B " PCRE_UCHAR32 *\fIbuffer\fP, int \fIbuffersize\fP);" -.sp -.B int pcre32_copy_substring(PCRE_SPTR32 \fIsubject\fP, int *\fIovector\fP, -.B " int \fIstringcount\fP, int \fIstringnumber\fP, PCRE_UCHAR32 *\fIbuffer\fP," -.B " int \fIbuffersize\fP);" -.sp -.B int pcre32_get_named_substring(const pcre32 *\fIcode\fP, -.B " PCRE_SPTR32 \fIsubject\fP, int *\fIovector\fP," -.B " int \fIstringcount\fP, PCRE_SPTR32 \fIstringname\fP," -.B " PCRE_SPTR32 *\fIstringptr\fP);" -.sp -.B int pcre32_get_stringnumber(const pcre32 *\fIcode\fP, -.B " PCRE_SPTR32 \fIname\fP);" -.sp -.B int pcre32_get_stringtable_entries(const pcre32 *\fIcode\fP, -.B " PCRE_SPTR32 \fIname\fP, PCRE_UCHAR32 **\fIfirst\fP, PCRE_UCHAR32 **\fIlast\fP);" -.sp -.B int pcre32_get_substring(PCRE_SPTR32 \fIsubject\fP, int *\fIovector\fP, -.B " int \fIstringcount\fP, int \fIstringnumber\fP," -.B " PCRE_SPTR32 *\fIstringptr\fP);" -.sp -.B int pcre32_get_substring_list(PCRE_SPTR32 \fIsubject\fP, -.B " int *\fIovector\fP, int \fIstringcount\fP, PCRE_SPTR32 **\fIlistptr\fP);" -.sp -.B void pcre32_free_substring(PCRE_SPTR32 \fIstringptr\fP); -.sp -.B void pcre32_free_substring_list(PCRE_SPTR32 *\fIstringptr\fP); -.fi -. -. -.SH "PCRE 32-BIT API AUXILIARY FUNCTIONS" -.rs -.sp -.nf -.B pcre32_jit_stack *pcre32_jit_stack_alloc(int \fIstartsize\fP, int \fImaxsize\fP); -.sp -.B void pcre32_jit_stack_free(pcre32_jit_stack *\fIstack\fP); -.sp -.B void pcre32_assign_jit_stack(pcre32_extra *\fIextra\fP, -.B " pcre32_jit_callback \fIcallback\fP, void *\fIdata\fP);" -.sp -.B const unsigned char *pcre32_maketables(void); -.sp -.B int pcre32_fullinfo(const pcre32 *\fIcode\fP, "const pcre32_extra *\fIextra\fP," -.B " int \fIwhat\fP, void *\fIwhere\fP);" -.sp -.B int pcre32_refcount(pcre32 *\fIcode\fP, int \fIadjust\fP); -.sp -.B int pcre32_config(int \fIwhat\fP, void *\fIwhere\fP); -.sp -.B const char *pcre32_version(void); -.sp -.B int pcre32_pattern_to_host_byte_order(pcre32 *\fIcode\fP, -.B " pcre32_extra *\fIextra\fP, const unsigned char *\fItables\fP);" -.fi -. -. -.SH "PCRE 32-BIT API INDIRECTED FUNCTIONS" -.rs -.sp -.nf -.B void *(*pcre32_malloc)(size_t); -.sp -.B void (*pcre32_free)(void *); -.sp -.B void *(*pcre32_stack_malloc)(size_t); -.sp -.B void (*pcre32_stack_free)(void *); -.sp -.B int (*pcre32_callout)(pcre32_callout_block *); -.fi -. -. -.SH "PCRE 32-BIT API 32-BIT-ONLY FUNCTION" -.rs -.sp -.nf -.B int pcre32_utf32_to_host_byte_order(PCRE_UCHAR32 *\fIoutput\fP, -.B " PCRE_SPTR32 \fIinput\fP, int \fIlength\fP, int *\fIbyte_order\fP," -.B " int \fIkeep_boms\fP);" -.fi -. -. -.SH "THE PCRE 32-BIT LIBRARY" -.rs -.sp -Starting with release 8.32, it is possible to compile a PCRE library that -supports 32-bit character strings, including UTF-32 strings, as well as or -instead of the original 8-bit library. This work was done by Christian Persch, -based on the work done by Zoltan Herczeg for the 16-bit library. All three -libraries contain identical sets of functions, used in exactly the same way. -Only the names of the functions and the data types of their arguments and -results are different. To avoid over-complication and reduce the documentation -maintenance load, most of the PCRE documentation describes the 8-bit library, -with only occasional references to the 16-bit and 32-bit libraries. This page -describes what is different when you use the 32-bit library. -.P -WARNING: A single application can be linked with all or any of the three -libraries, but you must take care when processing any particular pattern -to use functions from just one library. For example, if you want to study -a pattern that was compiled with \fBpcre32_compile()\fP, you must do so -with \fBpcre32_study()\fP, not \fBpcre_study()\fP, and you must free the -study data with \fBpcre32_free_study()\fP. -. -. -.SH "THE HEADER FILE" -.rs -.sp -There is only one header file, \fBpcre.h\fP. It contains prototypes for all the -functions in all libraries, as well as definitions of flags, structures, error -codes, etc. -. -. -.SH "THE LIBRARY NAME" -.rs -.sp -In Unix-like systems, the 32-bit library is called \fBlibpcre32\fP, and can -normally be accesss by adding \fB-lpcre32\fP to the command for linking an -application that uses PCRE. -. -. -.SH "STRING TYPES" -.rs -.sp -In the 8-bit library, strings are passed to PCRE library functions as vectors -of bytes with the C type "char *". In the 32-bit library, strings are passed as -vectors of unsigned 32-bit quantities. The macro PCRE_UCHAR32 specifies an -appropriate data type, and PCRE_SPTR32 is defined as "const PCRE_UCHAR32 *". In -very many environments, "unsigned int" is a 32-bit data type. When PCRE is -built, it defines PCRE_UCHAR32 as "unsigned int", but checks that it really is -a 32-bit data type. If it is not, the build fails with an error message telling -the maintainer to modify the definition appropriately. -. -. -.SH "STRUCTURE TYPES" -.rs -.sp -The types of the opaque structures that are used for compiled 32-bit patterns -and JIT stacks are \fBpcre32\fP and \fBpcre32_jit_stack\fP respectively. The -type of the user-accessible structure that is returned by \fBpcre32_study()\fP -is \fBpcre32_extra\fP, and the type of the structure that is used for passing -data to a callout function is \fBpcre32_callout_block\fP. These structures -contain the same fields, with the same names, as their 8-bit counterparts. The -only difference is that pointers to character strings are 32-bit instead of -8-bit types. -. -. -.SH "32-BIT FUNCTIONS" -.rs -.sp -For every function in the 8-bit library there is a corresponding function in -the 32-bit library with a name that starts with \fBpcre32_\fP instead of -\fBpcre_\fP. The prototypes are listed above. In addition, there is one extra -function, \fBpcre32_utf32_to_host_byte_order()\fP. This is a utility function -that converts a UTF-32 character string to host byte order if necessary. The -other 32-bit functions expect the strings they are passed to be in host byte -order. -.P -The \fIinput\fP and \fIoutput\fP arguments of -\fBpcre32_utf32_to_host_byte_order()\fP may point to the same address, that is, -conversion in place is supported. The output buffer must be at least as long as -the input. -.P -The \fIlength\fP argument specifies the number of 32-bit data units in the -input string; a negative value specifies a zero-terminated string. -.P -If \fIbyte_order\fP is NULL, it is assumed that the string starts off in host -byte order. This may be changed by byte-order marks (BOMs) anywhere in the -string (commonly as the first character). -.P -If \fIbyte_order\fP is not NULL, a non-zero value of the integer to which it -points means that the input starts off in host byte order, otherwise the -opposite order is assumed. Again, BOMs in the string can change this. The final -byte order is passed back at the end of processing. -.P -If \fIkeep_boms\fP is not zero, byte-order mark characters (0xfeff) are copied -into the output string. Otherwise they are discarded. -.P -The result of the function is the number of 32-bit units placed into the output -buffer, including the zero terminator if the string was zero-terminated. -. -. -.SH "SUBJECT STRING OFFSETS" -.rs -.sp -The lengths and starting offsets of subject strings must be specified in 32-bit -data units, and the offsets within subject strings that are returned by the -matching functions are in also 32-bit units rather than bytes. -. -. -.SH "NAMED SUBPATTERNS" -.rs -.sp -The name-to-number translation table that is maintained for named subpatterns -uses 32-bit characters. The \fBpcre32_get_stringtable_entries()\fP function -returns the length of each entry in the table as the number of 32-bit data -units. -. -. -.SH "OPTION NAMES" -.rs -.sp -There are two new general option names, PCRE_UTF32 and PCRE_NO_UTF32_CHECK, -which correspond to PCRE_UTF8 and PCRE_NO_UTF8_CHECK in the 8-bit library. In -fact, these new options define the same bits in the options word. There is a -discussion about the -.\" HTML -.\" -validity of UTF-32 strings -.\" -in the -.\" HREF -\fBpcreunicode\fP -.\" -page. -.P -For the \fBpcre32_config()\fP function there is an option PCRE_CONFIG_UTF32 -that returns 1 if UTF-32 support is configured, otherwise 0. If this option is -given to \fBpcre_config()\fP or \fBpcre16_config()\fP, or if the -PCRE_CONFIG_UTF8 or PCRE_CONFIG_UTF16 option is given to \fBpcre32_config()\fP, -the result is the PCRE_ERROR_BADOPTION error. -. -. -.SH "CHARACTER CODES" -.rs -.sp -In 32-bit mode, when PCRE_UTF32 is not set, character values are treated in the -same way as in 8-bit, non UTF-8 mode, except, of course, that they can range -from 0 to 0x7fffffff instead of 0 to 0xff. Character types for characters less -than 0xff can therefore be influenced by the locale in the same way as before. -Characters greater than 0xff have only one case, and no "type" (such as letter -or digit). -.P -In UTF-32 mode, the character code is Unicode, in the range 0 to 0x10ffff, with -the exception of values in the range 0xd800 to 0xdfff because those are -"surrogate" values that are ill-formed in UTF-32. -.P -A UTF-32 string can indicate its endianness by special code knows as a -byte-order mark (BOM). The PCRE functions do not handle this, expecting strings -to be in host byte order. A utility function called -\fBpcre32_utf32_to_host_byte_order()\fP is provided to help with this (see -above). -. -. -.SH "ERROR NAMES" -.rs -.sp -The error PCRE_ERROR_BADUTF32 corresponds to its 8-bit counterpart. -The error PCRE_ERROR_BADMODE is given when a compiled -pattern is passed to a function that processes patterns in the other -mode, for example, if a pattern compiled with \fBpcre_compile()\fP is passed to -\fBpcre32_exec()\fP. -.P -There are new error codes whose names begin with PCRE_UTF32_ERR for invalid -UTF-32 strings, corresponding to the PCRE_UTF8_ERR codes for UTF-8 strings that -are described in the section entitled -.\" HTML -.\" -"Reason codes for invalid UTF-8 strings" -.\" -in the main -.\" HREF -\fBpcreapi\fP -.\" -page. The UTF-32 errors are: -.sp - PCRE_UTF32_ERR1 Surrogate character (range from 0xd800 to 0xdfff) - PCRE_UTF32_ERR2 Non-character - PCRE_UTF32_ERR3 Character > 0x10ffff -. -. -.SH "ERROR TEXTS" -.rs -.sp -If there is an error while compiling a pattern, the error text that is passed -back by \fBpcre32_compile()\fP or \fBpcre32_compile2()\fP is still an 8-bit -character string, zero-terminated. -. -. -.SH "CALLOUTS" -.rs -.sp -The \fIsubject\fP and \fImark\fP fields in the callout block that is passed to -a callout function point to 32-bit vectors. -. -. -.SH "TESTING" -.rs -.sp -The \fBpcretest\fP program continues to operate with 8-bit input and output -files, but it can be used for testing the 32-bit library. If it is run with the -command line option \fB-32\fP, patterns and subject strings are converted from -8-bit to 32-bit before being passed to PCRE, and the 32-bit library functions -are used instead of the 8-bit ones. Returned 32-bit strings are converted to -8-bit for output. If both the 8-bit and the 16-bit libraries were not compiled, -\fBpcretest\fP defaults to 32-bit and the \fB-32\fP option is ignored. -.P -When PCRE is being built, the \fBRunTest\fP script that is called by "make -check" uses the \fBpcretest\fP \fB-C\fP option to discover which of the 8-bit, -16-bit and 32-bit libraries has been built, and runs the tests appropriately. -. -. -.SH "NOT SUPPORTED IN 32-BIT MODE" -.rs -.sp -Not all the features of the 8-bit library are available with the 32-bit -library. The C++ and POSIX wrapper functions support only the 8-bit library, -and the \fBpcregrep\fP program is at present 8-bit only. -. -. -.SH AUTHOR -.rs -.sp -.nf -Philip Hazel -University Computing Service -Cambridge CB2 3QH, England. -.fi -. -. -.SH REVISION -.rs -.sp -.nf -Last updated: 12 May 2013 -Copyright (c) 1997-2013 University of Cambridge. -.fi diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre32_assign_jit_stack.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre32_assign_jit_stack.3 deleted file mode 120000 index 40c8775a..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre32_assign_jit_stack.3 +++ /dev/null @@ -1 +0,0 @@ -pcre_assign_jit_stack.3 \ No newline at end of file diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre32_compile.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre32_compile.3 deleted file mode 120000 index 9364e751..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre32_compile.3 +++ /dev/null @@ -1 +0,0 @@ -pcre_compile.3 \ No newline at end of file diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre32_compile2.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre32_compile2.3 deleted file mode 120000 index 2d6aff35..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre32_compile2.3 +++ /dev/null @@ -1 +0,0 @@ -pcre_compile2.3 \ No newline at end of file diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre32_config.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre32_config.3 deleted file mode 120000 index db964059..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre32_config.3 +++ /dev/null @@ -1 +0,0 @@ -pcre_config.3 \ No newline at end of file diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre32_copy_named_substring.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre32_copy_named_substring.3 deleted file mode 120000 index c15b9774..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre32_copy_named_substring.3 +++ /dev/null @@ -1 +0,0 @@ -pcre_copy_named_substring.3 \ No newline at end of file diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre32_copy_substring.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre32_copy_substring.3 deleted file mode 120000 index 98d1f84d..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre32_copy_substring.3 +++ /dev/null @@ -1 +0,0 @@ -pcre_copy_substring.3 \ No newline at end of file diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre32_dfa_exec.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre32_dfa_exec.3 deleted file mode 120000 index ed408df0..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre32_dfa_exec.3 +++ /dev/null @@ -1 +0,0 @@ -pcre_dfa_exec.3 \ No newline at end of file diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre32_exec.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre32_exec.3 deleted file mode 120000 index ebaa2527..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre32_exec.3 +++ /dev/null @@ -1 +0,0 @@ -pcre_exec.3 \ No newline at end of file diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre32_free_study.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre32_free_study.3 deleted file mode 120000 index 4c53ea9f..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre32_free_study.3 +++ /dev/null @@ -1 +0,0 @@ -pcre_free_study.3 \ No newline at end of file diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre32_free_substring.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre32_free_substring.3 deleted file mode 120000 index 48567bfb..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre32_free_substring.3 +++ /dev/null @@ -1 +0,0 @@ -pcre_free_substring.3 \ No newline at end of file diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre32_free_substring_list.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre32_free_substring_list.3 deleted file mode 120000 index 84b7b7e5..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre32_free_substring_list.3 +++ /dev/null @@ -1 +0,0 @@ -pcre_free_substring_list.3 \ No newline at end of file diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre32_fullinfo.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre32_fullinfo.3 deleted file mode 120000 index b7386a98..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre32_fullinfo.3 +++ /dev/null @@ -1 +0,0 @@ -pcre_fullinfo.3 \ No newline at end of file diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre32_get_named_substring.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre32_get_named_substring.3 deleted file mode 120000 index c095ca50..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre32_get_named_substring.3 +++ /dev/null @@ -1 +0,0 @@ -pcre_get_named_substring.3 \ No newline at end of file diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre32_get_stringnumber.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre32_get_stringnumber.3 deleted file mode 120000 index f8e81d32..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre32_get_stringnumber.3 +++ /dev/null @@ -1 +0,0 @@ -pcre_get_stringnumber.3 \ No newline at end of file diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre32_get_stringtable_entries.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre32_get_stringtable_entries.3 deleted file mode 120000 index 9f8cc4a7..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre32_get_stringtable_entries.3 +++ /dev/null @@ -1 +0,0 @@ -pcre_get_stringtable_entries.3 \ No newline at end of file diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre32_get_substring.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre32_get_substring.3 deleted file mode 120000 index 26383b5d..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre32_get_substring.3 +++ /dev/null @@ -1 +0,0 @@ -pcre_get_substring.3 \ No newline at end of file diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre32_get_substring_list.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre32_get_substring_list.3 deleted file mode 120000 index 2faa865f..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre32_get_substring_list.3 +++ /dev/null @@ -1 +0,0 @@ -pcre_get_substring_list.3 \ No newline at end of file diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre32_jit_exec.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre32_jit_exec.3 deleted file mode 120000 index 59089ada..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre32_jit_exec.3 +++ /dev/null @@ -1 +0,0 @@ -pcre_jit_exec.3 \ No newline at end of file diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre32_jit_stack_alloc.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre32_jit_stack_alloc.3 deleted file mode 120000 index dab43b82..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre32_jit_stack_alloc.3 +++ /dev/null @@ -1 +0,0 @@ -pcre_jit_stack_alloc.3 \ No newline at end of file diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre32_jit_stack_free.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre32_jit_stack_free.3 deleted file mode 120000 index e92aa310..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre32_jit_stack_free.3 +++ /dev/null @@ -1 +0,0 @@ -pcre_jit_stack_free.3 \ No newline at end of file diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre32_maketables.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre32_maketables.3 deleted file mode 120000 index 3b6308e2..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre32_maketables.3 +++ /dev/null @@ -1 +0,0 @@ -pcre_maketables.3 \ No newline at end of file diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre32_pattern_to_host_byte_order.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre32_pattern_to_host_byte_order.3 deleted file mode 120000 index 6540917e..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre32_pattern_to_host_byte_order.3 +++ /dev/null @@ -1 +0,0 @@ -pcre_pattern_to_host_byte_order.3 \ No newline at end of file diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre32_refcount.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre32_refcount.3 deleted file mode 120000 index 63cece3f..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre32_refcount.3 +++ /dev/null @@ -1 +0,0 @@ -pcre_refcount.3 \ No newline at end of file diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre32_study.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre32_study.3 deleted file mode 120000 index 9871217f..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre32_study.3 +++ /dev/null @@ -1 +0,0 @@ -pcre_study.3 \ No newline at end of file diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre32_utf32_to_host_byte_order.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre32_utf32_to_host_byte_order.3 deleted file mode 120000 index e9699f5f..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre32_utf32_to_host_byte_order.3 +++ /dev/null @@ -1 +0,0 @@ -pcre_utf32_to_host_byte_order.3 \ No newline at end of file diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre32_version.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre32_version.3 deleted file mode 120000 index c31893c6..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre32_version.3 +++ /dev/null @@ -1 +0,0 @@ -pcre_version.3 \ No newline at end of file diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre_assign_jit_stack.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre_assign_jit_stack.3 deleted file mode 100644 index 0ecf6f2c..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre_assign_jit_stack.3 +++ /dev/null @@ -1,59 +0,0 @@ -.TH PCRE_ASSIGN_JIT_STACK 3 "24 June 2012" "PCRE 8.30" -.SH NAME -PCRE - Perl-compatible regular expressions -.SH SYNOPSIS -.rs -.sp -.B #include -.PP -.nf -.B void pcre_assign_jit_stack(pcre_extra *\fIextra\fP, -.B " pcre_jit_callback \fIcallback\fP, void *\fIdata\fP);" -.sp -.B void pcre16_assign_jit_stack(pcre16_extra *\fIextra\fP, -.B " pcre16_jit_callback \fIcallback\fP, void *\fIdata\fP);" -.sp -.B void pcre32_assign_jit_stack(pcre32_extra *\fIextra\fP, -.B " pcre32_jit_callback \fIcallback\fP, void *\fIdata\fP);" -.fi -. -.SH DESCRIPTION -.rs -.sp -This function provides control over the memory used as a stack at run-time by a -call to \fBpcre[16|32]_exec()\fP with a pattern that has been successfully -compiled with JIT optimization. The arguments are: -.sp - extra the data pointer returned by \fBpcre[16|32]_study()\fP - callback a callback function - data a JIT stack or a value to be passed to the callback - function -.P -If \fIcallback\fP is NULL and \fIdata\fP is NULL, an internal 32K block on -the machine stack is used. -.P -If \fIcallback\fP is NULL and \fIdata\fP is not NULL, \fIdata\fP must -be a valid JIT stack, the result of calling \fBpcre[16|32]_jit_stack_alloc()\fP. -.P -If \fIcallback\fP not NULL, it is called with \fIdata\fP as an argument at -the start of matching, in order to set up a JIT stack. If the result is NULL, -the internal 32K stack is used; otherwise the return value must be a valid JIT -stack, the result of calling \fBpcre[16|32]_jit_stack_alloc()\fP. -.P -You may safely assign the same JIT stack to multiple patterns, as long as they -are all matched in the same thread. In a multithread application, each thread -must use its own JIT stack. For more details, see the -.\" HREF -\fBpcrejit\fP -.\" -page. -.P -There is a complete description of the PCRE native API in the -.\" HREF -\fBpcreapi\fP -.\" -page and a description of the POSIX API in the -.\" HREF -\fBpcreposix\fP -.\" -page. diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre_compile.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre_compile.3 deleted file mode 100644 index 5c16ebe2..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre_compile.3 +++ /dev/null @@ -1,96 +0,0 @@ -.TH PCRE_COMPILE 3 "01 October 2013" "PCRE 8.34" -.SH NAME -PCRE - Perl-compatible regular expressions -.SH SYNOPSIS -.rs -.sp -.B #include -.PP -.nf -.B pcre *pcre_compile(const char *\fIpattern\fP, int \fIoptions\fP, -.B " const char **\fIerrptr\fP, int *\fIerroffset\fP," -.B " const unsigned char *\fItableptr\fP);" -.sp -.B pcre16 *pcre16_compile(PCRE_SPTR16 \fIpattern\fP, int \fIoptions\fP, -.B " const char **\fIerrptr\fP, int *\fIerroffset\fP," -.B " const unsigned char *\fItableptr\fP);" -.sp -.B pcre32 *pcre32_compile(PCRE_SPTR32 \fIpattern\fP, int \fIoptions\fP, -.B " const char **\fIerrptr\fP, int *\fIerroffset\fP," -.B " const unsigned char *\fItableptr\fP);" -.fi -. -.SH DESCRIPTION -.rs -.sp -This function compiles a regular expression into an internal form. It is the -same as \fBpcre[16|32]_compile2()\fP, except for the absence of the -\fIerrorcodeptr\fP argument. Its arguments are: -.sp - \fIpattern\fP A zero-terminated string containing the - regular expression to be compiled - \fIoptions\fP Zero or more option bits - \fIerrptr\fP Where to put an error message - \fIerroffset\fP Offset in pattern where error was found - \fItableptr\fP Pointer to character tables, or NULL to - use the built-in default -.sp -The option bits are: -.sp - PCRE_ANCHORED Force pattern anchoring - PCRE_AUTO_CALLOUT Compile automatic callouts - PCRE_BSR_ANYCRLF \eR matches only CR, LF, or CRLF - PCRE_BSR_UNICODE \eR matches all Unicode line endings - PCRE_CASELESS Do caseless matching - PCRE_DOLLAR_ENDONLY $ not to match newline at end - PCRE_DOTALL . matches anything including NL - PCRE_DUPNAMES Allow duplicate names for subpatterns - PCRE_EXTENDED Ignore white space and # comments - PCRE_EXTRA PCRE extra features - (not much use currently) - PCRE_FIRSTLINE Force matching to be before newline - PCRE_JAVASCRIPT_COMPAT JavaScript compatibility - PCRE_MULTILINE ^ and $ match newlines within data - PCRE_NEVER_UTF Lock out UTF, e.g. via (*UTF) - PCRE_NEWLINE_ANY Recognize any Unicode newline sequence - PCRE_NEWLINE_ANYCRLF Recognize CR, LF, and CRLF as newline - sequences - PCRE_NEWLINE_CR Set CR as the newline sequence - PCRE_NEWLINE_CRLF Set CRLF as the newline sequence - PCRE_NEWLINE_LF Set LF as the newline sequence - PCRE_NO_AUTO_CAPTURE Disable numbered capturing paren- - theses (named ones available) - PCRE_NO_AUTO_POSSESS Disable auto-possessification - PCRE_NO_START_OPTIMIZE Disable match-time start optimizations - PCRE_NO_UTF16_CHECK Do not check the pattern for UTF-16 - validity (only relevant if - PCRE_UTF16 is set) - PCRE_NO_UTF32_CHECK Do not check the pattern for UTF-32 - validity (only relevant if - PCRE_UTF32 is set) - PCRE_NO_UTF8_CHECK Do not check the pattern for UTF-8 - validity (only relevant if - PCRE_UTF8 is set) - PCRE_UCP Use Unicode properties for \ed, \ew, etc. - PCRE_UNGREEDY Invert greediness of quantifiers - PCRE_UTF16 Run in \fBpcre16_compile()\fP UTF-16 mode - PCRE_UTF32 Run in \fBpcre32_compile()\fP UTF-32 mode - PCRE_UTF8 Run in \fBpcre_compile()\fP UTF-8 mode -.sp -PCRE must be built with UTF support in order to use PCRE_UTF8/16/32 and -PCRE_NO_UTF8/16/32_CHECK, and with UCP support if PCRE_UCP is used. -.P -The yield of the function is a pointer to a private data structure that -contains the compiled pattern, or NULL if an error was detected. Note that -compiling regular expressions with one version of PCRE for use with a different -version is not guaranteed to work and may cause crashes. -.P -There is a complete description of the PCRE native API in the -.\" HREF -\fBpcreapi\fP -.\" -page and a description of the POSIX API in the -.\" HREF -\fBpcreposix\fP -.\" -page. diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre_compile2.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre_compile2.3 deleted file mode 100644 index 37742018..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre_compile2.3 +++ /dev/null @@ -1,101 +0,0 @@ -.TH PCRE_COMPILE2 3 "01 October 2013" "PCRE 8.34" -.SH NAME -PCRE - Perl-compatible regular expressions -.SH SYNOPSIS -.rs -.sp -.B #include -.PP -.nf -.B pcre *pcre_compile2(const char *\fIpattern\fP, int \fIoptions\fP, -.B " int *\fIerrorcodeptr\fP," -.B " const char **\fIerrptr\fP, int *\fIerroffset\fP," -.B " const unsigned char *\fItableptr\fP);" -.sp -.B pcre16 *pcre16_compile2(PCRE_SPTR16 \fIpattern\fP, int \fIoptions\fP, -.B " int *\fIerrorcodeptr\fP," -.B " const char **\fIerrptr\fP, int *\fIerroffset\fP," -.B " const unsigned char *\fItableptr\fP);" -.sp -.B pcre32 *pcre32_compile2(PCRE_SPTR32 \fIpattern\fP, int \fIoptions\fP, -.B " int *\fIerrorcodeptr\fP,£ -.B " const char **\fIerrptr\fP, int *\fIerroffset\fP," -.B " const unsigned char *\fItableptr\fP);" -.fi -. -.SH DESCRIPTION -.rs -.sp -This function compiles a regular expression into an internal form. It is the -same as \fBpcre[16|32]_compile()\fP, except for the addition of the -\fIerrorcodeptr\fP argument. The arguments are: -. -.sp - \fIpattern\fP A zero-terminated string containing the - regular expression to be compiled - \fIoptions\fP Zero or more option bits - \fIerrorcodeptr\fP Where to put an error code - \fIerrptr\fP Where to put an error message - \fIerroffset\fP Offset in pattern where error was found - \fItableptr\fP Pointer to character tables, or NULL to - use the built-in default -.sp -The option bits are: -.sp - PCRE_ANCHORED Force pattern anchoring - PCRE_AUTO_CALLOUT Compile automatic callouts - PCRE_BSR_ANYCRLF \eR matches only CR, LF, or CRLF - PCRE_BSR_UNICODE \eR matches all Unicode line endings - PCRE_CASELESS Do caseless matching - PCRE_DOLLAR_ENDONLY $ not to match newline at end - PCRE_DOTALL . matches anything including NL - PCRE_DUPNAMES Allow duplicate names for subpatterns - PCRE_EXTENDED Ignore white space and # comments - PCRE_EXTRA PCRE extra features - (not much use currently) - PCRE_FIRSTLINE Force matching to be before newline - PCRE_JAVASCRIPT_COMPAT JavaScript compatibility - PCRE_MULTILINE ^ and $ match newlines within data - PCRE_NEVER_UTF Lock out UTF, e.g. via (*UTF) - PCRE_NEWLINE_ANY Recognize any Unicode newline sequence - PCRE_NEWLINE_ANYCRLF Recognize CR, LF, and CRLF as newline - sequences - PCRE_NEWLINE_CR Set CR as the newline sequence - PCRE_NEWLINE_CRLF Set CRLF as the newline sequence - PCRE_NEWLINE_LF Set LF as the newline sequence - PCRE_NO_AUTO_CAPTURE Disable numbered capturing paren- - theses (named ones available) - PCRE_NO_AUTO_POSSESS Disable auto-possessification - PCRE_NO_START_OPTIMIZE Disable match-time start optimizations - PCRE_NO_UTF16_CHECK Do not check the pattern for UTF-16 - validity (only relevant if - PCRE_UTF16 is set) - PCRE_NO_UTF32_CHECK Do not check the pattern for UTF-32 - validity (only relevant if - PCRE_UTF32 is set) - PCRE_NO_UTF8_CHECK Do not check the pattern for UTF-8 - validity (only relevant if - PCRE_UTF8 is set) - PCRE_UCP Use Unicode properties for \ed, \ew, etc. - PCRE_UNGREEDY Invert greediness of quantifiers - PCRE_UTF16 Run \fBpcre16_compile()\fP in UTF-16 mode - PCRE_UTF32 Run \fBpcre32_compile()\fP in UTF-32 mode - PCRE_UTF8 Run \fBpcre_compile()\fP in UTF-8 mode -.sp -PCRE must be built with UTF support in order to use PCRE_UTF8/16/32 and -PCRE_NO_UTF8/16/32_CHECK, and with UCP support if PCRE_UCP is used. -.P -The yield of the function is a pointer to a private data structure that -contains the compiled pattern, or NULL if an error was detected. Note that -compiling regular expressions with one version of PCRE for use with a different -version is not guaranteed to work and may cause crashes. -.P -There is a complete description of the PCRE native API in the -.\" HREF -\fBpcreapi\fP -.\" -page and a description of the POSIX API in the -.\" HREF -\fBpcreposix\fP -.\" -page. diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre_config.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre_config.3 deleted file mode 100644 index d14ffdad..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre_config.3 +++ /dev/null @@ -1,79 +0,0 @@ -.TH PCRE_CONFIG 3 "20 April 2014" "PCRE 8.36" -.SH NAME -PCRE - Perl-compatible regular expressions -.SH SYNOPSIS -.rs -.sp -.B #include -.PP -.SM -.B int pcre_config(int \fIwhat\fP, void *\fIwhere\fP); -.PP -.B int pcre16_config(int \fIwhat\fP, void *\fIwhere\fP); -.PP -.B int pcre32_config(int \fIwhat\fP, void *\fIwhere\fP); -. -.SH DESCRIPTION -.rs -.sp -This function makes it possible for a client program to find out which optional -features are available in the version of the PCRE library it is using. The -arguments are as follows: -.sp - \fIwhat\fP A code specifying what information is required - \fIwhere\fP Points to where to put the data -.sp -The \fIwhere\fP argument must point to an integer variable, except for -PCRE_CONFIG_MATCH_LIMIT, PCRE_CONFIG_MATCH_LIMIT_RECURSION, and -PCRE_CONFIG_PARENS_LIMIT, when it must point to an unsigned long integer, -and for PCRE_CONFIG_JITTARGET, when it must point to a const char*. -The available codes are: -.sp - PCRE_CONFIG_JIT Availability of just-in-time compiler - support (1=yes 0=no) - PCRE_CONFIG_JITTARGET String containing information about the - target architecture for the JIT compiler, - or NULL if there is no JIT support - PCRE_CONFIG_LINK_SIZE Internal link size: 2, 3, or 4 - PCRE_CONFIG_PARENS_LIMIT Parentheses nesting limit - PCRE_CONFIG_MATCH_LIMIT Internal resource limit - PCRE_CONFIG_MATCH_LIMIT_RECURSION - Internal recursion depth limit - PCRE_CONFIG_NEWLINE Value of the default newline sequence: - 13 (0x000d) for CR - 10 (0x000a) for LF - 3338 (0x0d0a) for CRLF - -2 for ANYCRLF - -1 for ANY - PCRE_CONFIG_BSR Indicates what \eR matches by default: - 0 all Unicode line endings - 1 CR, LF, or CRLF only - PCRE_CONFIG_POSIX_MALLOC_THRESHOLD - Threshold of return slots, above which - \fBmalloc()\fP is used by the POSIX API - PCRE_CONFIG_STACKRECURSE Recursion implementation (1=stack 0=heap) - PCRE_CONFIG_UTF16 Availability of UTF-16 support (1=yes - 0=no); option for \fBpcre16_config()\fP - PCRE_CONFIG_UTF32 Availability of UTF-32 support (1=yes - 0=no); option for \fBpcre32_config()\fP - PCRE_CONFIG_UTF8 Availability of UTF-8 support (1=yes 0=no); - option for \fBpcre_config()\fP - PCRE_CONFIG_UNICODE_PROPERTIES - Availability of Unicode property support - (1=yes 0=no) -.sp -The function yields 0 on success or PCRE_ERROR_BADOPTION otherwise. That error -is also given if PCRE_CONFIG_UTF16 or PCRE_CONFIG_UTF32 is passed to -\fBpcre_config()\fP, if PCRE_CONFIG_UTF8 or PCRE_CONFIG_UTF32 is passed to -\fBpcre16_config()\fP, or if PCRE_CONFIG_UTF8 or PCRE_CONFIG_UTF16 is passed to -\fBpcre32_config()\fP. -.P -There is a complete description of the PCRE native API in the -.\" HREF -\fBpcreapi\fP -.\" -page and a description of the POSIX API in the -.\" HREF -\fBpcreposix\fP -.\" -page. diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre_copy_named_substring.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre_copy_named_substring.3 deleted file mode 100644 index 52582aec..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre_copy_named_substring.3 +++ /dev/null @@ -1,51 +0,0 @@ -.TH PCRE_COPY_NAMED_SUBSTRING 3 "24 June 2012" "PCRE 8.30" -.SH NAME -PCRE - Perl-compatible regular expressions -.SH SYNOPSIS -.rs -.sp -.B #include -.PP -.nf -.B int pcre_copy_named_substring(const pcre *\fIcode\fP, -.B " const char *\fIsubject\fP, int *\fIovector\fP," -.B " int \fIstringcount\fP, const char *\fIstringname\fP," -.B " char *\fIbuffer\fP, int \fIbuffersize\fP);" -.sp -.B int pcre16_copy_named_substring(const pcre16 *\fIcode\fP, -.B " PCRE_SPTR16 \fIsubject\fP, int *\fIovector\fP," -.B " int \fIstringcount\fP, PCRE_SPTR16 \fIstringname\fP," -.B " PCRE_UCHAR16 *\fIbuffer\fP, int \fIbuffersize\fP);" -.sp -.B int pcre32_copy_named_substring(const pcre32 *\fIcode\fP, -.B " PCRE_SPTR32 \fIsubject\fP, int *\fIovector\fP," -.B " int \fIstringcount\fP, PCRE_SPTR32 \fIstringname\fP," -.B " PCRE_UCHAR32 *\fIbuffer\fP, int \fIbuffersize\fP);" -.fi -. -.SH DESCRIPTION -.rs -.sp -This is a convenience function for extracting a captured substring, identified -by name, into a given buffer. The arguments are: -.sp - \fIcode\fP Pattern that was successfully matched - \fIsubject\fP Subject that has been successfully matched - \fIovector\fP Offset vector that \fBpcre[16|32]_exec()\fP used - \fIstringcount\fP Value returned by \fBpcre[16|32]_exec()\fP - \fIstringname\fP Name of the required substring - \fIbuffer\fP Buffer to receive the string - \fIbuffersize\fP Size of buffer -.sp -The yield is the length of the substring, PCRE_ERROR_NOMEMORY if the buffer was -too small, or PCRE_ERROR_NOSUBSTRING if the string name is invalid. -.P -There is a complete description of the PCRE native API in the -.\" HREF -\fBpcreapi\fP -.\" -page and a description of the POSIX API in the -.\" HREF -\fBpcreposix\fP -.\" -page. diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre_copy_substring.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre_copy_substring.3 deleted file mode 100644 index 83af6e80..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre_copy_substring.3 +++ /dev/null @@ -1,47 +0,0 @@ -.TH PCRE_COPY_SUBSTRING 3 "24 June 2012" "PCRE 8.30" -.SH NAME -PCRE - Perl-compatible regular expressions -.SH SYNOPSIS -.rs -.sp -.B #include -.PP -.nf -.B int pcre_copy_substring(const char *\fIsubject\fP, int *\fIovector\fP, -.B " int \fIstringcount\fP, int \fIstringnumber\fP, char *\fIbuffer\fP," -.B " int \fIbuffersize\fP);" -.sp -.B int pcre16_copy_substring(PCRE_SPTR16 \fIsubject\fP, int *\fIovector\fP, -.B " int \fIstringcount\fP, int \fIstringnumber\fP, PCRE_UCHAR16 *\fIbuffer\fP," -.B " int \fIbuffersize\fP);" -.sp -.B int pcre32_copy_substring(PCRE_SPTR32 \fIsubject\fP, int *\fIovector\fP, -.B " int \fIstringcount\fP, int \fIstringnumber\fP, PCRE_UCHAR32 *\fIbuffer\fP," -.B " int \fIbuffersize\fP);" -.fi -. -.SH DESCRIPTION -.rs -.sp -This is a convenience function for extracting a captured substring into a given -buffer. The arguments are: -.sp - \fIsubject\fP Subject that has been successfully matched - \fIovector\fP Offset vector that \fBpcre[16|32]_exec()\fP used - \fIstringcount\fP Value returned by \fBpcre[16|32]_exec()\fP - \fIstringnumber\fP Number of the required substring - \fIbuffer\fP Buffer to receive the string - \fIbuffersize\fP Size of buffer -.sp -The yield is the length of the string, PCRE_ERROR_NOMEMORY if the buffer was -too small, or PCRE_ERROR_NOSUBSTRING if the string number is invalid. -.P -There is a complete description of the PCRE native API in the -.\" HREF -\fBpcreapi\fP -.\" -page and a description of the POSIX API in the -.\" HREF -\fBpcreposix\fP -.\" -page. diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre_dfa_exec.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre_dfa_exec.3 deleted file mode 100644 index 39c2e836..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre_dfa_exec.3 +++ /dev/null @@ -1,118 +0,0 @@ -.TH PCRE_DFA_EXEC 3 "12 May 2013" "PCRE 8.33" -.SH NAME -PCRE - Perl-compatible regular expressions -.SH SYNOPSIS -.rs -.sp -.B #include -.PP -.nf -.B int pcre_dfa_exec(const pcre *\fIcode\fP, "const pcre_extra *\fIextra\fP," -.B " const char *\fIsubject\fP, int \fIlength\fP, int \fIstartoffset\fP," -.B " int \fIoptions\fP, int *\fIovector\fP, int \fIovecsize\fP," -.B " int *\fIworkspace\fP, int \fIwscount\fP);" -.sp -.B int pcre16_dfa_exec(const pcre16 *\fIcode\fP, "const pcre16_extra *\fIextra\fP," -.B " PCRE_SPTR16 \fIsubject\fP, int \fIlength\fP, int \fIstartoffset\fP," -.B " int \fIoptions\fP, int *\fIovector\fP, int \fIovecsize\fP," -.B " int *\fIworkspace\fP, int \fIwscount\fP);" -.sp -.B int pcre32_dfa_exec(const pcre32 *\fIcode\fP, "const pcre32_extra *\fIextra\fP," -.B " PCRE_SPTR32 \fIsubject\fP, int \fIlength\fP, int \fIstartoffset\fP," -.B " int \fIoptions\fP, int *\fIovector\fP, int \fIovecsize\fP," -.B " int *\fIworkspace\fP, int \fIwscount\fP);" -.fi -. -.SH DESCRIPTION -.rs -.sp -This function matches a compiled regular expression against a given subject -string, using an alternative matching algorithm that scans the subject string -just once (\fInot\fP Perl-compatible). Note that the main, Perl-compatible, -matching function is \fBpcre[16|32]_exec()\fP. The arguments for this function -are: -.sp - \fIcode\fP Points to the compiled pattern - \fIextra\fP Points to an associated \fBpcre[16|32]_extra\fP structure, - or is NULL - \fIsubject\fP Points to the subject string - \fIlength\fP Length of the subject string - \fIstartoffset\fP Offset in the subject at which to start matching - \fIoptions\fP Option bits - \fIovector\fP Points to a vector of ints for result offsets - \fIovecsize\fP Number of elements in the vector - \fIworkspace\fP Points to a vector of ints used as working space - \fIwscount\fP Number of elements in the vector -.sp -The units for \fIlength\fP and \fIstartoffset\fP are bytes for -\fBpcre_exec()\fP, 16-bit data items for \fBpcre16_exec()\fP, and 32-bit items -for \fBpcre32_exec()\fP. The options are: -.sp - PCRE_ANCHORED Match only at the first position - PCRE_BSR_ANYCRLF \eR matches only CR, LF, or CRLF - PCRE_BSR_UNICODE \eR matches all Unicode line endings - PCRE_NEWLINE_ANY Recognize any Unicode newline sequence - PCRE_NEWLINE_ANYCRLF Recognize CR, LF, & CRLF as newline sequences - PCRE_NEWLINE_CR Recognize CR as the only newline sequence - PCRE_NEWLINE_CRLF Recognize CRLF as the only newline sequence - PCRE_NEWLINE_LF Recognize LF as the only newline sequence - PCRE_NOTBOL Subject is not the beginning of a line - PCRE_NOTEOL Subject is not the end of a line - PCRE_NOTEMPTY An empty string is not a valid match - PCRE_NOTEMPTY_ATSTART An empty string at the start of the subject - is not a valid match - PCRE_NO_START_OPTIMIZE Do not do "start-match" optimizations - PCRE_NO_UTF16_CHECK Do not check the subject for UTF-16 - validity (only relevant if PCRE_UTF16 - was set at compile time) - PCRE_NO_UTF32_CHECK Do not check the subject for UTF-32 - validity (only relevant if PCRE_UTF32 - was set at compile time) - PCRE_NO_UTF8_CHECK Do not check the subject for UTF-8 - validity (only relevant if PCRE_UTF8 - was set at compile time) - PCRE_PARTIAL ) Return PCRE_ERROR_PARTIAL for a partial - PCRE_PARTIAL_SOFT ) match if no full matches are found - PCRE_PARTIAL_HARD Return PCRE_ERROR_PARTIAL for a partial match - even if there is a full match as well - PCRE_DFA_SHORTEST Return only the shortest match - PCRE_DFA_RESTART Restart after a partial match -.sp -There are restrictions on what may appear in a pattern when using this matching -function. Details are given in the -.\" HREF -\fBpcrematching\fP -.\" -documentation. For details of partial matching, see the -.\" HREF -\fBpcrepartial\fP -.\" -page. -.P -A \fBpcre[16|32]_extra\fP structure contains the following fields: -.sp - \fIflags\fP Bits indicating which fields are set - \fIstudy_data\fP Opaque data from \fBpcre[16|32]_study()\fP - \fImatch_limit\fP Limit on internal resource use - \fImatch_limit_recursion\fP Limit on internal recursion depth - \fIcallout_data\fP Opaque data passed back to callouts - \fItables\fP Points to character tables or is NULL - \fImark\fP For passing back a *MARK pointer - \fIexecutable_jit\fP Opaque data from JIT compilation -.sp -The flag bits are PCRE_EXTRA_STUDY_DATA, PCRE_EXTRA_MATCH_LIMIT, -PCRE_EXTRA_MATCH_LIMIT_RECURSION, PCRE_EXTRA_CALLOUT_DATA, -PCRE_EXTRA_TABLES, PCRE_EXTRA_MARK and PCRE_EXTRA_EXECUTABLE_JIT. For this -matching function, the \fImatch_limit\fP and \fImatch_limit_recursion\fP fields -are not used, and must not be set. The PCRE_EXTRA_EXECUTABLE_JIT flag and -the corresponding variable are ignored. -.P -There is a complete description of the PCRE native API in the -.\" HREF -\fBpcreapi\fP -.\" -page and a description of the POSIX API in the -.\" HREF -\fBpcreposix\fP -.\" -page. diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre_exec.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre_exec.3 deleted file mode 100644 index 4686bd6d..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre_exec.3 +++ /dev/null @@ -1,99 +0,0 @@ -.TH PCRE_EXEC 3 "12 May 2013" "PCRE 8.33" -.SH NAME -PCRE - Perl-compatible regular expressions -.SH SYNOPSIS -.rs -.sp -.B #include -.PP -.nf -.B int pcre_exec(const pcre *\fIcode\fP, "const pcre_extra *\fIextra\fP," -.B " const char *\fIsubject\fP, int \fIlength\fP, int \fIstartoffset\fP," -.B " int \fIoptions\fP, int *\fIovector\fP, int \fIovecsize\fP);" -.sp -.B int pcre16_exec(const pcre16 *\fIcode\fP, "const pcre16_extra *\fIextra\fP," -.B " PCRE_SPTR16 \fIsubject\fP, int \fIlength\fP, int \fIstartoffset\fP," -.B " int \fIoptions\fP, int *\fIovector\fP, int \fIovecsize\fP);" -.sp -.B int pcre32_exec(const pcre32 *\fIcode\fP, "const pcre32_extra *\fIextra\fP," -.B " PCRE_SPTR32 \fIsubject\fP, int \fIlength\fP, int \fIstartoffset\fP," -.B " int \fIoptions\fP, int *\fIovector\fP, int \fIovecsize\fP);" -.fi -. -.SH DESCRIPTION -.rs -.sp -This function matches a compiled regular expression against a given subject -string, using a matching algorithm that is similar to Perl's. It returns -offsets to captured substrings. Its arguments are: -.sp - \fIcode\fP Points to the compiled pattern - \fIextra\fP Points to an associated \fBpcre[16|32]_extra\fP structure, - or is NULL - \fIsubject\fP Points to the subject string - \fIlength\fP Length of the subject string - \fIstartoffset\fP Offset in the subject at which to start matching - \fIoptions\fP Option bits - \fIovector\fP Points to a vector of ints for result offsets - \fIovecsize\fP Number of elements in the vector (a multiple of 3) -.sp -The units for \fIlength\fP and \fIstartoffset\fP are bytes for -\fBpcre_exec()\fP, 16-bit data items for \fBpcre16_exec()\fP, and 32-bit items -for \fBpcre32_exec()\fP. The options are: -.sp - PCRE_ANCHORED Match only at the first position - PCRE_BSR_ANYCRLF \eR matches only CR, LF, or CRLF - PCRE_BSR_UNICODE \eR matches all Unicode line endings - PCRE_NEWLINE_ANY Recognize any Unicode newline sequence - PCRE_NEWLINE_ANYCRLF Recognize CR, LF, & CRLF as newline sequences - PCRE_NEWLINE_CR Recognize CR as the only newline sequence - PCRE_NEWLINE_CRLF Recognize CRLF as the only newline sequence - PCRE_NEWLINE_LF Recognize LF as the only newline sequence - PCRE_NOTBOL Subject string is not the beginning of a line - PCRE_NOTEOL Subject string is not the end of a line - PCRE_NOTEMPTY An empty string is not a valid match - PCRE_NOTEMPTY_ATSTART An empty string at the start of the subject - is not a valid match - PCRE_NO_START_OPTIMIZE Do not do "start-match" optimizations - PCRE_NO_UTF16_CHECK Do not check the subject for UTF-16 - validity (only relevant if PCRE_UTF16 - was set at compile time) - PCRE_NO_UTF32_CHECK Do not check the subject for UTF-32 - validity (only relevant if PCRE_UTF32 - was set at compile time) - PCRE_NO_UTF8_CHECK Do not check the subject for UTF-8 - validity (only relevant if PCRE_UTF8 - was set at compile time) - PCRE_PARTIAL ) Return PCRE_ERROR_PARTIAL for a partial - PCRE_PARTIAL_SOFT ) match if no full matches are found - PCRE_PARTIAL_HARD Return PCRE_ERROR_PARTIAL for a partial match - if that is found before a full match -.sp -For details of partial matching, see the -.\" HREF -\fBpcrepartial\fP -.\" -page. A \fBpcre_extra\fP structure contains the following fields: -.sp - \fIflags\fP Bits indicating which fields are set - \fIstudy_data\fP Opaque data from \fBpcre[16|32]_study()\fP - \fImatch_limit\fP Limit on internal resource use - \fImatch_limit_recursion\fP Limit on internal recursion depth - \fIcallout_data\fP Opaque data passed back to callouts - \fItables\fP Points to character tables or is NULL - \fImark\fP For passing back a *MARK pointer - \fIexecutable_jit\fP Opaque data from JIT compilation -.sp -The flag bits are PCRE_EXTRA_STUDY_DATA, PCRE_EXTRA_MATCH_LIMIT, -PCRE_EXTRA_MATCH_LIMIT_RECURSION, PCRE_EXTRA_CALLOUT_DATA, -PCRE_EXTRA_TABLES, PCRE_EXTRA_MARK and PCRE_EXTRA_EXECUTABLE_JIT. -.P -There is a complete description of the PCRE native API in the -.\" HREF -\fBpcreapi\fP -.\" -page and a description of the POSIX API in the -.\" HREF -\fBpcreposix\fP -.\" -page. diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre_free_study.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre_free_study.3 deleted file mode 100644 index 8826b735..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre_free_study.3 +++ /dev/null @@ -1,31 +0,0 @@ -.TH PCRE_FREE_STUDY 3 "24 June 2012" "PCRE 8.30" -.SH NAME -PCRE - Perl-compatible regular expressions -.SH SYNOPSIS -.rs -.sp -.B #include -.PP -.SM -.B void pcre_free_study(pcre_extra *\fIextra\fP); -.PP -.B void pcre16_free_study(pcre16_extra *\fIextra\fP); -.PP -.B void pcre32_free_study(pcre32_extra *\fIextra\fP); -. -.SH DESCRIPTION -.rs -.sp -This function is used to free the memory used for the data generated by a call -to \fBpcre[16|32]_study()\fP when it is no longer needed. The argument must be the -result of such a call. -.P -There is a complete description of the PCRE native API in the -.\" HREF -\fBpcreapi\fP -.\" -page and a description of the POSIX API in the -.\" HREF -\fBpcreposix\fP -.\" -page. diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre_free_substring.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre_free_substring.3 deleted file mode 100644 index 88c04019..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre_free_substring.3 +++ /dev/null @@ -1,31 +0,0 @@ -.TH PCRE_FREE_SUBSTRING 3 "24 June 2012" "PCRE 8.30" -.SH NAME -PCRE - Perl-compatible regular expressions -.SH SYNOPSIS -.rs -.sp -.B #include -.PP -.SM -.B void pcre_free_substring(const char *\fIstringptr\fP); -.PP -.B void pcre16_free_substring(PCRE_SPTR16 \fIstringptr\fP); -.PP -.B void pcre32_free_substring(PCRE_SPTR32 \fIstringptr\fP); -. -.SH DESCRIPTION -.rs -.sp -This is a convenience function for freeing the store obtained by a previous -call to \fBpcre[16|32]_get_substring()\fP or \fBpcre[16|32]_get_named_substring()\fP. -Its only argument is a pointer to the string. -.P -There is a complete description of the PCRE native API in the -.\" HREF -\fBpcreapi\fP -.\" -page and a description of the POSIX API in the -.\" HREF -\fBpcreposix\fP -.\" -page. diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre_free_substring_list.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre_free_substring_list.3 deleted file mode 100644 index 248b4bd0..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre_free_substring_list.3 +++ /dev/null @@ -1,31 +0,0 @@ -.TH PCRE_FREE_SUBSTRING_LIST 3 "24 June 2012" "PCRE 8.30" -.SH NAME -PCRE - Perl-compatible regular expressions -.SH SYNOPSIS -.rs -.sp -.B #include -.PP -.SM -.B void pcre_free_substring_list(const char **\fIstringptr\fP); -.PP -.B void pcre16_free_substring_list(PCRE_SPTR16 *\fIstringptr\fP); -.PP -.B void pcre32_free_substring_list(PCRE_SPTR32 *\fIstringptr\fP); -. -.SH DESCRIPTION -.rs -.sp -This is a convenience function for freeing the store obtained by a previous -call to \fBpcre[16|32]_get_substring_list()\fP. Its only argument is a pointer to -the list of string pointers. -.P -There is a complete description of the PCRE native API in the -.\" HREF -\fBpcreapi\fP -.\" -page and a description of the POSIX API in the -.\" HREF -\fBpcreposix\fP -.\" -page. diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre_fullinfo.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre_fullinfo.3 deleted file mode 100644 index c9b2c656..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre_fullinfo.3 +++ /dev/null @@ -1,103 +0,0 @@ -.TH PCRE_FULLINFO 3 "21 April 2014" "PCRE 8.36" -.SH NAME -PCRE - Perl-compatible regular expressions -.SH SYNOPSIS -.rs -.sp -.B #include -.PP -.nf -.B int pcre_fullinfo(const pcre *\fIcode\fP, "const pcre_extra *\fIextra\fP," -.B " int \fIwhat\fP, void *\fIwhere\fP);" -.sp -.B int pcre16_fullinfo(const pcre16 *\fIcode\fP, "const pcre16_extra *\fIextra\fP," -.B " int \fIwhat\fP, void *\fIwhere\fP);" -.sp -.B int pcre32_fullinfo(const pcre32 *\fIcode\fP, "const pcre32_extra *\fIextra\fP," -.B " int \fIwhat\fP, void *\fIwhere\fP);" -.fi -. -.SH DESCRIPTION -.rs -.sp -This function returns information about a compiled pattern. Its arguments are: -.sp - \fIcode\fP Compiled regular expression - \fIextra\fP Result of \fBpcre[16|32]_study()\fP or NULL - \fIwhat\fP What information is required - \fIwhere\fP Where to put the information -.sp -The following information is available: -.sp - PCRE_INFO_BACKREFMAX Number of highest back reference - PCRE_INFO_CAPTURECOUNT Number of capturing subpatterns - PCRE_INFO_DEFAULT_TABLES Pointer to default tables - PCRE_INFO_FIRSTBYTE Fixed first data unit for a match, or - -1 for start of string - or after newline, or - -2 otherwise - PCRE_INFO_FIRSTTABLE Table of first data units (after studying) - PCRE_INFO_HASCRORLF Return 1 if explicit CR or LF matches exist - PCRE_INFO_JCHANGED Return 1 if (?J) or (?-J) was used - PCRE_INFO_JIT Return 1 after successful JIT compilation - PCRE_INFO_JITSIZE Size of JIT compiled code - PCRE_INFO_LASTLITERAL Literal last data unit required - PCRE_INFO_MINLENGTH Lower bound length of matching strings - PCRE_INFO_MATCHEMPTY Return 1 if the pattern can match an empty string, - 0 otherwise - PCRE_INFO_MATCHLIMIT Match limit if set, otherwise PCRE_RROR_UNSET - PCRE_INFO_MAXLOOKBEHIND Length (in characters) of the longest lookbehind assertion - PCRE_INFO_NAMECOUNT Number of named subpatterns - PCRE_INFO_NAMEENTRYSIZE Size of name table entry - PCRE_INFO_NAMETABLE Pointer to name table - PCRE_INFO_OKPARTIAL Return 1 if partial matching can be tried - (always returns 1 after release 8.00) - PCRE_INFO_OPTIONS Option bits used for compilation - PCRE_INFO_SIZE Size of compiled pattern - PCRE_INFO_STUDYSIZE Size of study data - PCRE_INFO_FIRSTCHARACTER Fixed first data unit for a match - PCRE_INFO_FIRSTCHARACTERFLAGS Returns - 1 if there is a first data character set, which can - then be retrieved using PCRE_INFO_FIRSTCHARACTER, - 2 if the first character is at the start of the data - string or after a newline, and - 0 otherwise - PCRE_INFO_RECURSIONLIMIT Recursion limit if set, otherwise PCRE_ERROR_UNSET - PCRE_INFO_REQUIREDCHAR Literal last data unit required - PCRE_INFO_REQUIREDCHARFLAGS Returns 1 if the last data character is set (which can then - be retrieved using PCRE_INFO_REQUIREDCHAR); 0 otherwise -.sp -The \fIwhere\fP argument must point to an integer variable, except for the -following \fIwhat\fP values: -.sp - PCRE_INFO_DEFAULT_TABLES const uint8_t * - PCRE_INFO_FIRSTCHARACTER uint32_t - PCRE_INFO_FIRSTTABLE const uint8_t * - PCRE_INFO_JITSIZE size_t - PCRE_INFO_MATCHLIMIT uint32_t - PCRE_INFO_NAMETABLE PCRE_SPTR16 (16-bit library) - PCRE_INFO_NAMETABLE PCRE_SPTR32 (32-bit library) - PCRE_INFO_NAMETABLE const unsigned char * (8-bit library) - PCRE_INFO_OPTIONS unsigned long int - PCRE_INFO_SIZE size_t - PCRE_INFO_STUDYSIZE size_t - PCRE_INFO_RECURSIONLIMIT uint32_t - PCRE_INFO_REQUIREDCHAR uint32_t -.sp -The yield of the function is zero on success or: -.sp - PCRE_ERROR_NULL the argument \fIcode\fP was NULL - the argument \fIwhere\fP was NULL - PCRE_ERROR_BADMAGIC the "magic number" was not found - PCRE_ERROR_BADOPTION the value of \fIwhat\fP was invalid - PCRE_ERROR_UNSET the option was not set -.P -There is a complete description of the PCRE native API in the -.\" HREF -\fBpcreapi\fP -.\" -page and a description of the POSIX API in the -.\" HREF -\fBpcreposix\fP -.\" -page. diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre_get_named_substring.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre_get_named_substring.3 deleted file mode 100644 index 84d4ee7d..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre_get_named_substring.3 +++ /dev/null @@ -1,54 +0,0 @@ -.TH PCRE_GET_NAMED_SUBSTRING 3 "24 June 2012" "PCRE 8.30" -.SH NAME -PCRE - Perl-compatible regular expressions -.SH SYNOPSIS -.rs -.sp -.B #include -.PP -.nf -.B int pcre_get_named_substring(const pcre *\fIcode\fP, -.B " const char *\fIsubject\fP, int *\fIovector\fP," -.B " int \fIstringcount\fP, const char *\fIstringname\fP," -.B " const char **\fIstringptr\fP);" -.sp -.B int pcre16_get_named_substring(const pcre16 *\fIcode\fP, -.B " PCRE_SPTR16 \fIsubject\fP, int *\fIovector\fP," -.B " int \fIstringcount\fP, PCRE_SPTR16 \fIstringname\fP," -.B " PCRE_SPTR16 *\fIstringptr\fP);" -.sp -.B int pcre32_get_named_substring(const pcre32 *\fIcode\fP, -.B " PCRE_SPTR32 \fIsubject\fP, int *\fIovector\fP," -.B " int \fIstringcount\fP, PCRE_SPTR32 \fIstringname\fP," -.B " PCRE_SPTR32 *\fIstringptr\fP);" -.fi -. -.SH DESCRIPTION -.rs -.sp -This is a convenience function for extracting a captured substring by name. The -arguments are: -.sp - \fIcode\fP Compiled pattern - \fIsubject\fP Subject that has been successfully matched - \fIovector\fP Offset vector that \fBpcre[16|32]_exec()\fP used - \fIstringcount\fP Value returned by \fBpcre[16|32]_exec()\fP - \fIstringname\fP Name of the required substring - \fIstringptr\fP Where to put the string pointer -.sp -The memory in which the substring is placed is obtained by calling -\fBpcre[16|32]_malloc()\fP. The convenience function -\fBpcre[16|32]_free_substring()\fP can be used to free it when it is no longer -needed. The yield of the function is the length of the extracted substring, -PCRE_ERROR_NOMEMORY if sufficient memory could not be obtained, or -PCRE_ERROR_NOSUBSTRING if the string name is invalid. -.P -There is a complete description of the PCRE native API in the -.\" HREF -\fBpcreapi\fP -.\" -page and a description of the POSIX API in the -.\" HREF -\fBpcreposix\fP -.\" -page. diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre_get_stringnumber.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre_get_stringnumber.3 deleted file mode 100644 index 9fc5291d..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre_get_stringnumber.3 +++ /dev/null @@ -1,43 +0,0 @@ -.TH PCRE_GET_STRINGNUMBER 3 "24 June 2012" "PCRE 8.30" -.SH NAME -PCRE - Perl-compatible regular expressions -.SH SYNOPSIS -.rs -.sp -.B #include -.PP -.nf -.B int pcre_get_stringnumber(const pcre *\fIcode\fP, -.B " const char *\fIname\fP);" -.sp -.B int pcre16_get_stringnumber(const pcre16 *\fIcode\fP, -.B " PCRE_SPTR16 \fIname\fP);" -.sp -.B int pcre32_get_stringnumber(const pcre32 *\fIcode\fP, -.B " PCRE_SPTR32 \fIname\fP);" -.fi -. -.SH DESCRIPTION -.rs -.sp -This convenience function finds the number of a named substring capturing -parenthesis in a compiled pattern. Its arguments are: -.sp - \fIcode\fP Compiled regular expression - \fIname\fP Name whose number is required -.sp -The yield of the function is the number of the parenthesis if the name is -found, or PCRE_ERROR_NOSUBSTRING otherwise. When duplicate names are allowed -(PCRE_DUPNAMES is set), it is not defined which of the numbers is returned by -\fBpcre[16|32]_get_stringnumber()\fP. You can obtain the complete list by calling -\fBpcre[16|32]_get_stringtable_entries()\fP. -.P -There is a complete description of the PCRE native API in the -.\" HREF -\fBpcreapi\fP -.\" -page and a description of the POSIX API in the -.\" HREF -\fBpcreposix\fP -.\" -page. diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre_get_stringtable_entries.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre_get_stringtable_entries.3 deleted file mode 100644 index 5c58c90c..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre_get_stringtable_entries.3 +++ /dev/null @@ -1,46 +0,0 @@ -.TH PCRE_GET_STRINGTABLE_ENTRIES 3 "24 June 2012" "PCRE 8.30" -.SH NAME -PCRE - Perl-compatible regular expressions -.SH SYNOPSIS -.rs -.sp -.B #include -.PP -.nf -.B int pcre_get_stringtable_entries(const pcre *\fIcode\fP, -.B " const char *\fIname\fP, char **\fIfirst\fP, char **\fIlast\fP);" -.sp -.B int pcre16_get_stringtable_entries(const pcre16 *\fIcode\fP, -.B " PCRE_SPTR16 \fIname\fP, PCRE_UCHAR16 **\fIfirst\fP, PCRE_UCHAR16 **\fIlast\fP);" -.sp -.B int pcre32_get_stringtable_entries(const pcre32 *\fIcode\fP, -.B " PCRE_SPTR32 \fIname\fP, PCRE_UCHAR32 **\fIfirst\fP, PCRE_UCHAR32 **\fIlast\fP);" -.fi -. -.SH DESCRIPTION -.rs -.sp -This convenience function finds, for a compiled pattern, the first and last -entries for a given name in the table that translates capturing parenthesis -names into numbers. When names are required to be unique (PCRE_DUPNAMES is -\fInot\fP set), it is usually easier to use \fBpcre[16|32]_get_stringnumber()\fP -instead. -.sp - \fIcode\fP Compiled regular expression - \fIname\fP Name whose entries required - \fIfirst\fP Where to return a pointer to the first entry - \fIlast\fP Where to return a pointer to the last entry -.sp -The yield of the function is the length of each entry, or -PCRE_ERROR_NOSUBSTRING if none are found. -.P -There is a complete description of the PCRE native API, including the format of -the table entries, in the -.\" HREF -\fBpcreapi\fP -.\" -page, and a description of the POSIX API in the -.\" HREF -\fBpcreposix\fP -.\" -page. diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre_get_substring.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre_get_substring.3 deleted file mode 100644 index 1e62b2c0..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre_get_substring.3 +++ /dev/null @@ -1,50 +0,0 @@ -.TH PCRE_GET_SUBSTRING 3 "24 June 2012" "PCRE 8.30" -.SH NAME -PCRE - Perl-compatible regular expressions -.SH SYNOPSIS -.rs -.sp -.B #include -.PP -.nf -.B int pcre_get_substring(const char *\fIsubject\fP, int *\fIovector\fP, -.B " int \fIstringcount\fP, int \fIstringnumber\fP," -.B " const char **\fIstringptr\fP);" -.sp -.B int pcre16_get_substring(PCRE_SPTR16 \fIsubject\fP, int *\fIovector\fP, -.B " int \fIstringcount\fP, int \fIstringnumber\fP," -.B " PCRE_SPTR16 *\fIstringptr\fP);" -.sp -.B int pcre32_get_substring(PCRE_SPTR32 \fIsubject\fP, int *\fIovector\fP, -.B " int \fIstringcount\fP, int \fIstringnumber\fP," -.B " PCRE_SPTR32 *\fIstringptr\fP);" -.fi -. -.SH DESCRIPTION -.rs -.sp -This is a convenience function for extracting a captured substring. The -arguments are: -.sp - \fIsubject\fP Subject that has been successfully matched - \fIovector\fP Offset vector that \fBpcre[16|32]_exec()\fP used - \fIstringcount\fP Value returned by \fBpcre[16|32]_exec()\fP - \fIstringnumber\fP Number of the required substring - \fIstringptr\fP Where to put the string pointer -.sp -The memory in which the substring is placed is obtained by calling -\fBpcre[16|32]_malloc()\fP. The convenience function -\fBpcre[16|32]_free_substring()\fP can be used to free it when it is no longer -needed. The yield of the function is the length of the substring, -PCRE_ERROR_NOMEMORY if sufficient memory could not be obtained, or -PCRE_ERROR_NOSUBSTRING if the string number is invalid. -.P -There is a complete description of the PCRE native API in the -.\" HREF -\fBpcreapi\fP -.\" -page and a description of the POSIX API in the -.\" HREF -\fBpcreposix\fP -.\" -page. diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre_get_substring_list.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre_get_substring_list.3 deleted file mode 100644 index 511a4a39..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre_get_substring_list.3 +++ /dev/null @@ -1,47 +0,0 @@ -.TH PCRE_GET_SUBSTRING_LIST 3 "24 June 2012" "PCRE 8.30" -.SH NAME -PCRE - Perl-compatible regular expressions -.SH SYNOPSIS -.rs -.sp -.B #include -.PP -.nf -.B int pcre_get_substring_list(const char *\fIsubject\fP, -.B " int *\fIovector\fP, int \fIstringcount\fP, const char ***\fIlistptr\fP);" -.sp -.B int pcre16_get_substring_list(PCRE_SPTR16 \fIsubject\fP, -.B " int *\fIovector\fP, int \fIstringcount\fP, PCRE_SPTR16 **\fIlistptr\fP);" -.sp -.B int pcre32_get_substring_list(PCRE_SPTR32 \fIsubject\fP, -.B " int *\fIovector\fP, int \fIstringcount\fP, PCRE_SPTR32 **\fIlistptr\fP);" -.fi -. -.SH DESCRIPTION -.rs -.sp -This is a convenience function for extracting a list of all the captured -substrings. The arguments are: -.sp - \fIsubject\fP Subject that has been successfully matched - \fIovector\fP Offset vector that \fBpcre[16|32]_exec\fP used - \fIstringcount\fP Value returned by \fBpcre[16|32]_exec\fP - \fIlistptr\fP Where to put a pointer to the list -.sp -The memory in which the substrings and the list are placed is obtained by -calling \fBpcre[16|32]_malloc()\fP. The convenience function -\fBpcre[16|32]_free_substring_list()\fP can be used to free it when it is no -longer needed. A pointer to a list of pointers is put in the variable whose -address is in \fIlistptr\fP. The list is terminated by a NULL pointer. The -yield of the function is zero on success or PCRE_ERROR_NOMEMORY if sufficient -memory could not be obtained. -.P -There is a complete description of the PCRE native API in the -.\" HREF -\fBpcreapi\fP -.\" -page and a description of the POSIX API in the -.\" HREF -\fBpcreposix\fP -.\" -page. diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre_jit_exec.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre_jit_exec.3 deleted file mode 100644 index ba851681..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre_jit_exec.3 +++ /dev/null @@ -1,96 +0,0 @@ -.TH PCRE_EXEC 3 "31 October 2012" "PCRE 8.30" -.SH NAME -PCRE - Perl-compatible regular expressions -.SH SYNOPSIS -.rs -.sp -.B #include -.PP -.nf -.B int pcre_jit_exec(const pcre *\fIcode\fP, "const pcre_extra *\fIextra\fP," -.B " const char *\fIsubject\fP, int \fIlength\fP, int \fIstartoffset\fP," -.B " int \fIoptions\fP, int *\fIovector\fP, int \fIovecsize\fP," -.B " pcre_jit_stack *\fIjstack\fP);" -.sp -.B int pcre16_jit_exec(const pcre16 *\fIcode\fP, "const pcre16_extra *\fIextra\fP," -.B " PCRE_SPTR16 \fIsubject\fP, int \fIlength\fP, int \fIstartoffset\fP," -.B " int \fIoptions\fP, int *\fIovector\fP, int \fIovecsize\fP," -.B " pcre_jit_stack *\fIjstack\fP);" -.sp -.B int pcre32_jit_exec(const pcre32 *\fIcode\fP, "const pcre32_extra *\fIextra\fP," -.B " PCRE_SPTR32 \fIsubject\fP, int \fIlength\fP, int \fIstartoffset\fP," -.B " int \fIoptions\fP, int *\fIovector\fP, int \fIovecsize\fP," -.B " pcre_jit_stack *\fIjstack\fP);" -.fi -. -.SH DESCRIPTION -.rs -.sp -This function matches a compiled regular expression that has been successfully -studied with one of the JIT options against a given subject string, using a -matching algorithm that is similar to Perl's. It is a "fast path" interface to -JIT, and it bypasses some of the sanity checks that \fBpcre_exec()\fP applies. -It returns offsets to captured substrings. Its arguments are: -.sp - \fIcode\fP Points to the compiled pattern - \fIextra\fP Points to an associated \fBpcre[16|32]_extra\fP structure, - or is NULL - \fIsubject\fP Points to the subject string - \fIlength\fP Length of the subject string, in bytes - \fIstartoffset\fP Offset in bytes in the subject at which to - start matching - \fIoptions\fP Option bits - \fIovector\fP Points to a vector of ints for result offsets - \fIovecsize\fP Number of elements in the vector (a multiple of 3) - \fIjstack\fP Pointer to a JIT stack -.sp -The allowed options are: -.sp - PCRE_NOTBOL Subject string is not the beginning of a line - PCRE_NOTEOL Subject string is not the end of a line - PCRE_NOTEMPTY An empty string is not a valid match - PCRE_NOTEMPTY_ATSTART An empty string at the start of the subject - is not a valid match - PCRE_NO_UTF16_CHECK Do not check the subject for UTF-16 - validity (only relevant if PCRE_UTF16 - was set at compile time) - PCRE_NO_UTF32_CHECK Do not check the subject for UTF-32 - validity (only relevant if PCRE_UTF32 - was set at compile time) - PCRE_NO_UTF8_CHECK Do not check the subject for UTF-8 - validity (only relevant if PCRE_UTF8 - was set at compile time) - PCRE_PARTIAL ) Return PCRE_ERROR_PARTIAL for a partial - PCRE_PARTIAL_SOFT ) match if no full matches are found - PCRE_PARTIAL_HARD Return PCRE_ERROR_PARTIAL for a partial match - if that is found before a full match -.sp -However, the PCRE_NO_UTF[8|16|32]_CHECK options have no effect, as this check -is never applied. For details of partial matching, see the -.\" HREF -\fBpcrepartial\fP -.\" -page. A \fBpcre_extra\fP structure contains the following fields: -.sp - \fIflags\fP Bits indicating which fields are set - \fIstudy_data\fP Opaque data from \fBpcre[16|32]_study()\fP - \fImatch_limit\fP Limit on internal resource use - \fImatch_limit_recursion\fP Limit on internal recursion depth - \fIcallout_data\fP Opaque data passed back to callouts - \fItables\fP Points to character tables or is NULL - \fImark\fP For passing back a *MARK pointer - \fIexecutable_jit\fP Opaque data from JIT compilation -.sp -The flag bits are PCRE_EXTRA_STUDY_DATA, PCRE_EXTRA_MATCH_LIMIT, -PCRE_EXTRA_MATCH_LIMIT_RECURSION, PCRE_EXTRA_CALLOUT_DATA, -PCRE_EXTRA_TABLES, PCRE_EXTRA_MARK and PCRE_EXTRA_EXECUTABLE_JIT. -.P -There is a complete description of the PCRE native API in the -.\" HREF -\fBpcreapi\fP -.\" -page and a description of the JIT API in the -.\" HREF -\fBpcrejit\fP -.\" -page. diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre_jit_stack_alloc.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre_jit_stack_alloc.3 deleted file mode 100644 index 11c97a0f..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre_jit_stack_alloc.3 +++ /dev/null @@ -1,43 +0,0 @@ -.TH PCRE_JIT_STACK_ALLOC 3 "24 June 2012" "PCRE 8.30" -.SH NAME -PCRE - Perl-compatible regular expressions -.SH SYNOPSIS -.rs -.sp -.B #include -.PP -.nf -.B pcre_jit_stack *pcre_jit_stack_alloc(int \fIstartsize\fP, -.B " int \fImaxsize\fP);" -.sp -.B pcre16_jit_stack *pcre16_jit_stack_alloc(int \fIstartsize\fP, -.B " int \fImaxsize\fP);" -.sp -.B pcre32_jit_stack *pcre32_jit_stack_alloc(int \fIstartsize\fP, -.B " int \fImaxsize\fP);" -.fi -. -.SH DESCRIPTION -.rs -.sp -This function is used to create a stack for use by the code compiled by the JIT -optimization of \fBpcre[16|32]_study()\fP. The arguments are a starting size for -the stack, and a maximum size to which it is allowed to grow. The result can be -passed to the JIT run-time code by \fBpcre[16|32]_assign_jit_stack()\fP, or that -function can set up a callback for obtaining a stack. A maximum stack size of -512K to 1M should be more than enough for any pattern. For more details, see -the -.\" HREF -\fBpcrejit\fP -.\" -page. -.P -There is a complete description of the PCRE native API in the -.\" HREF -\fBpcreapi\fP -.\" -page and a description of the POSIX API in the -.\" HREF -\fBpcreposix\fP -.\" -page. diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre_jit_stack_free.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre_jit_stack_free.3 deleted file mode 100644 index 494724e8..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre_jit_stack_free.3 +++ /dev/null @@ -1,35 +0,0 @@ -.TH PCRE_JIT_STACK_FREE 3 "24 June 2012" "PCRE 8.30" -.SH NAME -PCRE - Perl-compatible regular expressions -.SH SYNOPSIS -.rs -.sp -.B #include -.PP -.SM -.B void pcre_jit_stack_free(pcre_jit_stack *\fIstack\fP); -.PP -.B void pcre16_jit_stack_free(pcre16_jit_stack *\fIstack\fP); -.PP -.B void pcre32_jit_stack_free(pcre32_jit_stack *\fIstack\fP); -. -.SH DESCRIPTION -.rs -.sp -This function is used to free a JIT stack that was created by -\fBpcre[16|32]_jit_stack_alloc()\fP when it is no longer needed. For more details, -see the -.\" HREF -\fBpcrejit\fP -.\" -page. -.P -There is a complete description of the PCRE native API in the -.\" HREF -\fBpcreapi\fP -.\" -page and a description of the POSIX API in the -.\" HREF -\fBpcreposix\fP -.\" -page. diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre_maketables.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre_maketables.3 deleted file mode 100644 index b2c3d23a..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre_maketables.3 +++ /dev/null @@ -1,33 +0,0 @@ -.TH PCRE_MAKETABLES 3 "24 June 2012" "PCRE 8.30" -.SH NAME -PCRE - Perl-compatible regular expressions -.SH SYNOPSIS -.rs -.sp -.B #include -.PP -.SM -.B const unsigned char *pcre_maketables(void); -.PP -.B const unsigned char *pcre16_maketables(void); -.PP -.B const unsigned char *pcre32_maketables(void); -. -.SH DESCRIPTION -.rs -.sp -This function builds a set of character tables for character values less than -256. These can be passed to \fBpcre[16|32]_compile()\fP to override PCRE's -internal, built-in tables (which were made by \fBpcre[16|32]_maketables()\fP when -PCRE was compiled). You might want to do this if you are using a non-standard -locale. The function yields a pointer to the tables. -.P -There is a complete description of the PCRE native API in the -.\" HREF -\fBpcreapi\fP -.\" -page and a description of the POSIX API in the -.\" HREF -\fBpcreposix\fP -.\" -page. diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre_pattern_to_host_byte_order.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre_pattern_to_host_byte_order.3 deleted file mode 100644 index b0c41c38..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre_pattern_to_host_byte_order.3 +++ /dev/null @@ -1,44 +0,0 @@ -.TH PCRE_PATTERN_TO_HOST_BYTE_ORDER 3 "24 June 2012" "PCRE 8.30" -.SH NAME -PCRE - Perl-compatible regular expressions -.SH SYNOPSIS -.rs -.sp -.B #include -.PP -.nf -.B int pcre_pattern_to_host_byte_order(pcre *\fIcode\fP, -.B " pcre_extra *\fIextra\fP, const unsigned char *\fItables\fP);" -.sp -.B int pcre16_pattern_to_host_byte_order(pcre16 *\fIcode\fP, -.B " pcre16_extra *\fIextra\fP, const unsigned char *\fItables\fP);" -.sp -.B int pcre32_pattern_to_host_byte_order(pcre32 *\fIcode\fP, -.B " pcre32_extra *\fIextra\fP, const unsigned char *\fItables\fP);" -.fi -. -.SH DESCRIPTION -.rs -.sp -This function ensures that the bytes in 2-byte and 4-byte values in a compiled -pattern are in the correct order for the current host. It is useful when a -pattern that has been compiled on one host is transferred to another that might -have different endianness. The arguments are: -.sp - \fIcode\fP A compiled regular expression - \fIextra\fP Points to an associated \fBpcre[16|32]_extra\fP structure, - or is NULL - \fItables\fP Pointer to character tables, or NULL to - set the built-in default -.sp -The result is 0 for success, a negative PCRE_ERROR_xxx value otherwise. -.P -There is a complete description of the PCRE native API in the -.\" HREF -\fBpcreapi\fP -.\" -page and a description of the POSIX API in the -.\" HREF -\fBpcreposix\fP -.\" -page. diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre_refcount.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre_refcount.3 deleted file mode 100644 index 45a41fef..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre_refcount.3 +++ /dev/null @@ -1,36 +0,0 @@ -.TH PCRE_REFCOUNT 3 "24 June 2012" "PCRE 8.30" -.SH NAME -PCRE - Perl-compatible regular expressions -.SH SYNOPSIS -.rs -.sp -.B #include -.PP -.SM -.B int pcre_refcount(pcre *\fIcode\fP, int \fIadjust\fP); -.PP -.B int pcre16_refcount(pcre16 *\fIcode\fP, int \fIadjust\fP); -.PP -.B int pcre32_refcount(pcre32 *\fIcode\fP, int \fIadjust\fP); -. -.SH DESCRIPTION -.rs -.sp -This function is used to maintain a reference count inside a data block that -contains a compiled pattern. Its arguments are: -.sp - \fIcode\fP Compiled regular expression - \fIadjust\fP Adjustment to reference value -.sp -The yield of the function is the adjusted reference value, which is constrained -to lie between 0 and 65535. -.P -There is a complete description of the PCRE native API in the -.\" HREF -\fBpcreapi\fP -.\" -page and a description of the POSIX API in the -.\" HREF -\fBpcreposix\fP -.\" -page. diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre_study.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre_study.3 deleted file mode 100644 index 1200e0a6..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre_study.3 +++ /dev/null @@ -1,54 +0,0 @@ -.TH PCRE_STUDY 3 " 24 June 2012" "PCRE 8.30" -.SH NAME -PCRE - Perl-compatible regular expressions -.SH SYNOPSIS -.rs -.sp -.B #include -.PP -.nf -.B pcre_extra *pcre_study(const pcre *\fIcode\fP, int \fIoptions\fP, -.B " const char **\fIerrptr\fP);" -.sp -.B pcre16_extra *pcre16_study(const pcre16 *\fIcode\fP, int \fIoptions\fP, -.B " const char **\fIerrptr\fP);" -.sp -.B pcre32_extra *pcre32_study(const pcre32 *\fIcode\fP, int \fIoptions\fP, -.B " const char **\fIerrptr\fP);" -.fi -. -.SH DESCRIPTION -.rs -.sp -This function studies a compiled pattern, to see if additional information can -be extracted that might speed up matching. Its arguments are: -.sp - \fIcode\fP A compiled regular expression - \fIoptions\fP Options for \fBpcre[16|32]_study()\fP - \fIerrptr\fP Where to put an error message -.sp -If the function succeeds, it returns a value that can be passed to -\fBpcre[16|32]_exec()\fP or \fBpcre[16|32]_dfa_exec()\fP via their \fIextra\fP -arguments. -.P -If the function returns NULL, either it could not find any additional -information, or there was an error. You can tell the difference by looking at -the error value. It is NULL in first case. -.P -The only option is PCRE_STUDY_JIT_COMPILE. It requests just-in-time compilation -if possible. If PCRE has been compiled without JIT support, this option is -ignored. See the -.\" HREF -\fBpcrejit\fP -.\" -page for further details. -.P -There is a complete description of the PCRE native API in the -.\" HREF -\fBpcreapi\fP -.\" -page and a description of the POSIX API in the -.\" HREF -\fBpcreposix\fP -.\" -page. diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre_utf16_to_host_byte_order.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre_utf16_to_host_byte_order.3 deleted file mode 100644 index 1851b619..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre_utf16_to_host_byte_order.3 +++ /dev/null @@ -1,45 +0,0 @@ -.TH PCRE_UTF16_TO_HOST_BYTE_ORDER 3 "21 January 2012" "PCRE 8.30" -.SH NAME -PCRE - Perl-compatible regular expressions -.SH SYNOPSIS -.rs -.sp -.B #include -.PP -.nf -.B int pcre16_utf16_to_host_byte_order(PCRE_UCHAR16 *\fIoutput\fP, -.B " PCRE_SPTR16 \fIinput\fP, int \fIlength\fP, int *\fIhost_byte_order\fP," -.B " int \fIkeep_boms\fP);" -.fi -. -. -.SH DESCRIPTION -.rs -.sp -This function, which exists only in the 16-bit library, converts a UTF-16 -string to the correct order for the current host, taking account of any byte -order marks (BOMs) within the string. Its arguments are: -.sp - \fIoutput\fP pointer to output buffer, may be the same as \fIinput\fP - \fIinput\fP pointer to input buffer - \fIlength\fP number of 16-bit units in the input, or negative for - a zero-terminated string - \fIhost_byte_order\fP a NULL value or a non-zero value pointed to means - start in host byte order - \fIkeep_boms\fP if non-zero, BOMs are copied to the output string -.sp -The result of the function is the number of 16-bit units placed into the output -buffer, including the zero terminator if the string was zero-terminated. -.P -If \fIhost_byte_order\fP is not NULL, it is set to indicate the byte order that -is current at the end of the string. -.P -There is a complete description of the PCRE native API in the -.\" HREF -\fBpcreapi\fP -.\" -page and a description of the POSIX API in the -.\" HREF -\fBpcreposix\fP -.\" -page. diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre_utf32_to_host_byte_order.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre_utf32_to_host_byte_order.3 deleted file mode 100644 index a415dcf5..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre_utf32_to_host_byte_order.3 +++ /dev/null @@ -1,45 +0,0 @@ -.TH PCRE_UTF32_TO_HOST_BYTE_ORDER 3 "24 June 2012" "PCRE 8.30" -.SH NAME -PCRE - Perl-compatible regular expressions -.SH SYNOPSIS -.rs -.sp -.B #include -.PP -.nf -.B int pcre32_utf32_to_host_byte_order(PCRE_UCHAR32 *\fIoutput\fP, -.B " PCRE_SPTR32 \fIinput\fP, int \fIlength\fP, int *\fIhost_byte_order\fP," -.B " int \fIkeep_boms\fP);" -.fi -. -. -.SH DESCRIPTION -.rs -.sp -This function, which exists only in the 32-bit library, converts a UTF-32 -string to the correct order for the current host, taking account of any byte -order marks (BOMs) within the string. Its arguments are: -.sp - \fIoutput\fP pointer to output buffer, may be the same as \fIinput\fP - \fIinput\fP pointer to input buffer - \fIlength\fP number of 32-bit units in the input, or negative for - a zero-terminated string - \fIhost_byte_order\fP a NULL value or a non-zero value pointed to means - start in host byte order - \fIkeep_boms\fP if non-zero, BOMs are copied to the output string -.sp -The result of the function is the number of 32-bit units placed into the output -buffer, including the zero terminator if the string was zero-terminated. -.P -If \fIhost_byte_order\fP is not NULL, it is set to indicate the byte order that -is current at the end of the string. -.P -There is a complete description of the PCRE native API in the -.\" HREF -\fBpcreapi\fP -.\" -page and a description of the POSIX API in the -.\" HREF -\fBpcreposix\fP -.\" -page. diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre_version.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre_version.3 deleted file mode 100644 index 0f4973f9..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcre_version.3 +++ /dev/null @@ -1,31 +0,0 @@ -.TH PCRE_VERSION 3 "24 June 2012" "PCRE 8.30" -.SH NAME -PCRE - Perl-compatible regular expressions -.SH SYNOPSIS -.rs -.sp -.B #include -.PP -.SM -.B const char *pcre_version(void); -.PP -.B const char *pcre16_version(void); -.PP -.B const char *pcre32_version(void); -. -.SH DESCRIPTION -.rs -.sp -This function (even in the 16-bit and 32-bit libraries) returns a -zero-terminated, 8-bit character string that gives the version number of the -PCRE library and the date of its release. -.P -There is a complete description of the PCRE native API in the -.\" HREF -\fBpcreapi\fP -.\" -page and a description of the POSIX API in the -.\" HREF -\fBpcreposix\fP -.\" -page. diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcreapi.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcreapi.3 deleted file mode 100644 index 6e7c7c6e..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcreapi.3 +++ /dev/null @@ -1,2918 +0,0 @@ -.TH PCREAPI 3 "18 December 2015" "PCRE 8.39" -.SH NAME -PCRE - Perl-compatible regular expressions -.sp -.B #include -. -. -.SH "PCRE NATIVE API BASIC FUNCTIONS" -.rs -.sp -.nf -.B pcre *pcre_compile(const char *\fIpattern\fP, int \fIoptions\fP, -.B " const char **\fIerrptr\fP, int *\fIerroffset\fP," -.B " const unsigned char *\fItableptr\fP);" -.sp -.B pcre *pcre_compile2(const char *\fIpattern\fP, int \fIoptions\fP, -.B " int *\fIerrorcodeptr\fP," -.B " const char **\fIerrptr\fP, int *\fIerroffset\fP," -.B " const unsigned char *\fItableptr\fP);" -.sp -.B pcre_extra *pcre_study(const pcre *\fIcode\fP, int \fIoptions\fP, -.B " const char **\fIerrptr\fP);" -.sp -.B void pcre_free_study(pcre_extra *\fIextra\fP); -.sp -.B int pcre_exec(const pcre *\fIcode\fP, "const pcre_extra *\fIextra\fP," -.B " const char *\fIsubject\fP, int \fIlength\fP, int \fIstartoffset\fP," -.B " int \fIoptions\fP, int *\fIovector\fP, int \fIovecsize\fP);" -.sp -.B int pcre_dfa_exec(const pcre *\fIcode\fP, "const pcre_extra *\fIextra\fP," -.B " const char *\fIsubject\fP, int \fIlength\fP, int \fIstartoffset\fP," -.B " int \fIoptions\fP, int *\fIovector\fP, int \fIovecsize\fP," -.B " int *\fIworkspace\fP, int \fIwscount\fP);" -.fi -. -. -.SH "PCRE NATIVE API STRING EXTRACTION FUNCTIONS" -.rs -.sp -.nf -.B int pcre_copy_named_substring(const pcre *\fIcode\fP, -.B " const char *\fIsubject\fP, int *\fIovector\fP," -.B " int \fIstringcount\fP, const char *\fIstringname\fP," -.B " char *\fIbuffer\fP, int \fIbuffersize\fP);" -.sp -.B int pcre_copy_substring(const char *\fIsubject\fP, int *\fIovector\fP, -.B " int \fIstringcount\fP, int \fIstringnumber\fP, char *\fIbuffer\fP," -.B " int \fIbuffersize\fP);" -.sp -.B int pcre_get_named_substring(const pcre *\fIcode\fP, -.B " const char *\fIsubject\fP, int *\fIovector\fP," -.B " int \fIstringcount\fP, const char *\fIstringname\fP," -.B " const char **\fIstringptr\fP);" -.sp -.B int pcre_get_stringnumber(const pcre *\fIcode\fP, -.B " const char *\fIname\fP);" -.sp -.B int pcre_get_stringtable_entries(const pcre *\fIcode\fP, -.B " const char *\fIname\fP, char **\fIfirst\fP, char **\fIlast\fP);" -.sp -.B int pcre_get_substring(const char *\fIsubject\fP, int *\fIovector\fP, -.B " int \fIstringcount\fP, int \fIstringnumber\fP," -.B " const char **\fIstringptr\fP);" -.sp -.B int pcre_get_substring_list(const char *\fIsubject\fP, -.B " int *\fIovector\fP, int \fIstringcount\fP, const char ***\fIlistptr\fP);" -.sp -.B void pcre_free_substring(const char *\fIstringptr\fP); -.sp -.B void pcre_free_substring_list(const char **\fIstringptr\fP); -.fi -. -. -.SH "PCRE NATIVE API AUXILIARY FUNCTIONS" -.rs -.sp -.nf -.B int pcre_jit_exec(const pcre *\fIcode\fP, "const pcre_extra *\fIextra\fP," -.B " const char *\fIsubject\fP, int \fIlength\fP, int \fIstartoffset\fP," -.B " int \fIoptions\fP, int *\fIovector\fP, int \fIovecsize\fP," -.B " pcre_jit_stack *\fIjstack\fP);" -.sp -.B pcre_jit_stack *pcre_jit_stack_alloc(int \fIstartsize\fP, int \fImaxsize\fP); -.sp -.B void pcre_jit_stack_free(pcre_jit_stack *\fIstack\fP); -.sp -.B void pcre_assign_jit_stack(pcre_extra *\fIextra\fP, -.B " pcre_jit_callback \fIcallback\fP, void *\fIdata\fP);" -.sp -.B const unsigned char *pcre_maketables(void); -.sp -.B int pcre_fullinfo(const pcre *\fIcode\fP, "const pcre_extra *\fIextra\fP," -.B " int \fIwhat\fP, void *\fIwhere\fP);" -.sp -.B int pcre_refcount(pcre *\fIcode\fP, int \fIadjust\fP); -.sp -.B int pcre_config(int \fIwhat\fP, void *\fIwhere\fP); -.sp -.B const char *pcre_version(void); -.sp -.B int pcre_pattern_to_host_byte_order(pcre *\fIcode\fP, -.B " pcre_extra *\fIextra\fP, const unsigned char *\fItables\fP);" -.fi -. -. -.SH "PCRE NATIVE API INDIRECTED FUNCTIONS" -.rs -.sp -.nf -.B void *(*pcre_malloc)(size_t); -.sp -.B void (*pcre_free)(void *); -.sp -.B void *(*pcre_stack_malloc)(size_t); -.sp -.B void (*pcre_stack_free)(void *); -.sp -.B int (*pcre_callout)(pcre_callout_block *); -.sp -.B int (*pcre_stack_guard)(void); -.fi -. -. -.SH "PCRE 8-BIT, 16-BIT, AND 32-BIT LIBRARIES" -.rs -.sp -As well as support for 8-bit character strings, PCRE also supports 16-bit -strings (from release 8.30) and 32-bit strings (from release 8.32), by means of -two additional libraries. They can be built as well as, or instead of, the -8-bit library. To avoid too much complication, this document describes the -8-bit versions of the functions, with only occasional references to the 16-bit -and 32-bit libraries. -.P -The 16-bit and 32-bit functions operate in the same way as their 8-bit -counterparts; they just use different data types for their arguments and -results, and their names start with \fBpcre16_\fP or \fBpcre32_\fP instead of -\fBpcre_\fP. For every option that has UTF8 in its name (for example, -PCRE_UTF8), there are corresponding 16-bit and 32-bit names with UTF8 replaced -by UTF16 or UTF32, respectively. This facility is in fact just cosmetic; the -16-bit and 32-bit option names define the same bit values. -.P -References to bytes and UTF-8 in this document should be read as references to -16-bit data units and UTF-16 when using the 16-bit library, or 32-bit data -units and UTF-32 when using the 32-bit library, unless specified otherwise. -More details of the specific differences for the 16-bit and 32-bit libraries -are given in the -.\" HREF -\fBpcre16\fP -.\" -and -.\" HREF -\fBpcre32\fP -.\" -pages. -. -. -.SH "PCRE API OVERVIEW" -.rs -.sp -PCRE has its own native API, which is described in this document. There are -also some wrapper functions (for the 8-bit library only) that correspond to the -POSIX regular expression API, but they do not give access to all the -functionality. They are described in the -.\" HREF -\fBpcreposix\fP -.\" -documentation. Both of these APIs define a set of C function calls. A C++ -wrapper (again for the 8-bit library only) is also distributed with PCRE. It is -documented in the -.\" HREF -\fBpcrecpp\fP -.\" -page. -.P -The native API C function prototypes are defined in the header file -\fBpcre.h\fP, and on Unix-like systems the (8-bit) library itself is called -\fBlibpcre\fP. It can normally be accessed by adding \fB-lpcre\fP to the -command for linking an application that uses PCRE. The header file defines the -macros PCRE_MAJOR and PCRE_MINOR to contain the major and minor release numbers -for the library. Applications can use these to include support for different -releases of PCRE. -.P -In a Windows environment, if you want to statically link an application program -against a non-dll \fBpcre.a\fP file, you must define PCRE_STATIC before -including \fBpcre.h\fP or \fBpcrecpp.h\fP, because otherwise the -\fBpcre_malloc()\fP and \fBpcre_free()\fP exported functions will be declared -\fB__declspec(dllimport)\fP, with unwanted results. -.P -The functions \fBpcre_compile()\fP, \fBpcre_compile2()\fP, \fBpcre_study()\fP, -and \fBpcre_exec()\fP are used for compiling and matching regular expressions -in a Perl-compatible manner. A sample program that demonstrates the simplest -way of using them is provided in the file called \fIpcredemo.c\fP in the PCRE -source distribution. A listing of this program is given in the -.\" HREF -\fBpcredemo\fP -.\" -documentation, and the -.\" HREF -\fBpcresample\fP -.\" -documentation describes how to compile and run it. -.P -Just-in-time compiler support is an optional feature of PCRE that can be built -in appropriate hardware environments. It greatly speeds up the matching -performance of many patterns. Simple programs can easily request that it be -used if available, by setting an option that is ignored when it is not -relevant. More complicated programs might need to make use of the functions -\fBpcre_jit_stack_alloc()\fP, \fBpcre_jit_stack_free()\fP, and -\fBpcre_assign_jit_stack()\fP in order to control the JIT code's memory usage. -.P -From release 8.32 there is also a direct interface for JIT execution, which -gives improved performance. The JIT-specific functions are discussed in the -.\" HREF -\fBpcrejit\fP -.\" -documentation. -.P -A second matching function, \fBpcre_dfa_exec()\fP, which is not -Perl-compatible, is also provided. This uses a different algorithm for the -matching. The alternative algorithm finds all possible matches (at a given -point in the subject), and scans the subject just once (unless there are -lookbehind assertions). However, this algorithm does not return captured -substrings. A description of the two matching algorithms and their advantages -and disadvantages is given in the -.\" HREF -\fBpcrematching\fP -.\" -documentation. -.P -In addition to the main compiling and matching functions, there are convenience -functions for extracting captured substrings from a subject string that is -matched by \fBpcre_exec()\fP. They are: -.sp - \fBpcre_copy_substring()\fP - \fBpcre_copy_named_substring()\fP - \fBpcre_get_substring()\fP - \fBpcre_get_named_substring()\fP - \fBpcre_get_substring_list()\fP - \fBpcre_get_stringnumber()\fP - \fBpcre_get_stringtable_entries()\fP -.sp -\fBpcre_free_substring()\fP and \fBpcre_free_substring_list()\fP are also -provided, to free the memory used for extracted strings. -.P -The function \fBpcre_maketables()\fP is used to build a set of character tables -in the current locale for passing to \fBpcre_compile()\fP, \fBpcre_exec()\fP, -or \fBpcre_dfa_exec()\fP. This is an optional facility that is provided for -specialist use. Most commonly, no special tables are passed, in which case -internal tables that are generated when PCRE is built are used. -.P -The function \fBpcre_fullinfo()\fP is used to find out information about a -compiled pattern. The function \fBpcre_version()\fP returns a pointer to a -string containing the version of PCRE and its date of release. -.P -The function \fBpcre_refcount()\fP maintains a reference count in a data block -containing a compiled pattern. This is provided for the benefit of -object-oriented applications. -.P -The global variables \fBpcre_malloc\fP and \fBpcre_free\fP initially contain -the entry points of the standard \fBmalloc()\fP and \fBfree()\fP functions, -respectively. PCRE calls the memory management functions via these variables, -so a calling program can replace them if it wishes to intercept the calls. This -should be done before calling any PCRE functions. -.P -The global variables \fBpcre_stack_malloc\fP and \fBpcre_stack_free\fP are also -indirections to memory management functions. These special functions are used -only when PCRE is compiled to use the heap for remembering data, instead of -recursive function calls, when running the \fBpcre_exec()\fP function. See the -.\" HREF -\fBpcrebuild\fP -.\" -documentation for details of how to do this. It is a non-standard way of -building PCRE, for use in environments that have limited stacks. Because of the -greater use of memory management, it runs more slowly. Separate functions are -provided so that special-purpose external code can be used for this case. When -used, these functions always allocate memory blocks of the same size. There is -a discussion about PCRE's stack usage in the -.\" HREF -\fBpcrestack\fP -.\" -documentation. -.P -The global variable \fBpcre_callout\fP initially contains NULL. It can be set -by the caller to a "callout" function, which PCRE will then call at specified -points during a matching operation. Details are given in the -.\" HREF -\fBpcrecallout\fP -.\" -documentation. -.P -The global variable \fBpcre_stack_guard\fP initially contains NULL. It can be -set by the caller to a function that is called by PCRE whenever it starts -to compile a parenthesized part of a pattern. When parentheses are nested, PCRE -uses recursive function calls, which use up the system stack. This function is -provided so that applications with restricted stacks can force a compilation -error if the stack runs out. The function should return zero if all is well, or -non-zero to force an error. -. -. -.\" HTML -.SH NEWLINES -.rs -.sp -PCRE supports five different conventions for indicating line breaks in -strings: a single CR (carriage return) character, a single LF (linefeed) -character, the two-character sequence CRLF, any of the three preceding, or any -Unicode newline sequence. The Unicode newline sequences are the three just -mentioned, plus the single characters VT (vertical tab, U+000B), FF (form feed, -U+000C), NEL (next line, U+0085), LS (line separator, U+2028), and PS -(paragraph separator, U+2029). -.P -Each of the first three conventions is used by at least one operating system as -its standard newline sequence. When PCRE is built, a default can be specified. -The default default is LF, which is the Unix standard. When PCRE is run, the -default can be overridden, either when a pattern is compiled, or when it is -matched. -.P -At compile time, the newline convention can be specified by the \fIoptions\fP -argument of \fBpcre_compile()\fP, or it can be specified by special text at the -start of the pattern itself; this overrides any other settings. See the -.\" HREF -\fBpcrepattern\fP -.\" -page for details of the special character sequences. -.P -In the PCRE documentation the word "newline" is used to mean "the character or -pair of characters that indicate a line break". The choice of newline -convention affects the handling of the dot, circumflex, and dollar -metacharacters, the handling of #-comments in /x mode, and, when CRLF is a -recognized line ending sequence, the match position advancement for a -non-anchored pattern. There is more detail about this in the -.\" HTML -.\" -section on \fBpcre_exec()\fP options -.\" -below. -.P -The choice of newline convention does not affect the interpretation of -the \en or \er escape sequences, nor does it affect what \eR matches, which is -controlled in a similar way, but by separate options. -. -. -.SH MULTITHREADING -.rs -.sp -The PCRE functions can be used in multi-threading applications, with the -proviso that the memory management functions pointed to by \fBpcre_malloc\fP, -\fBpcre_free\fP, \fBpcre_stack_malloc\fP, and \fBpcre_stack_free\fP, and the -callout and stack-checking functions pointed to by \fBpcre_callout\fP and -\fBpcre_stack_guard\fP, are shared by all threads. -.P -The compiled form of a regular expression is not altered during matching, so -the same compiled pattern can safely be used by several threads at once. -.P -If the just-in-time optimization feature is being used, it needs separate -memory stack areas for each thread. See the -.\" HREF -\fBpcrejit\fP -.\" -documentation for more details. -. -. -.SH "SAVING PRECOMPILED PATTERNS FOR LATER USE" -.rs -.sp -The compiled form of a regular expression can be saved and re-used at a later -time, possibly by a different program, and even on a host other than the one on -which it was compiled. Details are given in the -.\" HREF -\fBpcreprecompile\fP -.\" -documentation, which includes a description of the -\fBpcre_pattern_to_host_byte_order()\fP function. However, compiling a regular -expression with one version of PCRE for use with a different version is not -guaranteed to work and may cause crashes. -. -. -.SH "CHECKING BUILD-TIME OPTIONS" -.rs -.sp -.B int pcre_config(int \fIwhat\fP, void *\fIwhere\fP); -.PP -The function \fBpcre_config()\fP makes it possible for a PCRE client to -discover which optional features have been compiled into the PCRE library. The -.\" HREF -\fBpcrebuild\fP -.\" -documentation has more details about these optional features. -.P -The first argument for \fBpcre_config()\fP is an integer, specifying which -information is required; the second argument is a pointer to a variable into -which the information is placed. The returned value is zero on success, or the -negative error code PCRE_ERROR_BADOPTION if the value in the first argument is -not recognized. The following information is available: -.sp - PCRE_CONFIG_UTF8 -.sp -The output is an integer that is set to one if UTF-8 support is available; -otherwise it is set to zero. This value should normally be given to the 8-bit -version of this function, \fBpcre_config()\fP. If it is given to the 16-bit -or 32-bit version of this function, the result is PCRE_ERROR_BADOPTION. -.sp - PCRE_CONFIG_UTF16 -.sp -The output is an integer that is set to one if UTF-16 support is available; -otherwise it is set to zero. This value should normally be given to the 16-bit -version of this function, \fBpcre16_config()\fP. If it is given to the 8-bit -or 32-bit version of this function, the result is PCRE_ERROR_BADOPTION. -.sp - PCRE_CONFIG_UTF32 -.sp -The output is an integer that is set to one if UTF-32 support is available; -otherwise it is set to zero. This value should normally be given to the 32-bit -version of this function, \fBpcre32_config()\fP. If it is given to the 8-bit -or 16-bit version of this function, the result is PCRE_ERROR_BADOPTION. -.sp - PCRE_CONFIG_UNICODE_PROPERTIES -.sp -The output is an integer that is set to one if support for Unicode character -properties is available; otherwise it is set to zero. -.sp - PCRE_CONFIG_JIT -.sp -The output is an integer that is set to one if support for just-in-time -compiling is available; otherwise it is set to zero. -.sp - PCRE_CONFIG_JITTARGET -.sp -The output is a pointer to a zero-terminated "const char *" string. If JIT -support is available, the string contains the name of the architecture for -which the JIT compiler is configured, for example "x86 32bit (little endian + -unaligned)". If JIT support is not available, the result is NULL. -.sp - PCRE_CONFIG_NEWLINE -.sp -The output is an integer whose value specifies the default character sequence -that is recognized as meaning "newline". The values that are supported in -ASCII/Unicode environments are: 10 for LF, 13 for CR, 3338 for CRLF, -2 for -ANYCRLF, and -1 for ANY. In EBCDIC environments, CR, ANYCRLF, and ANY yield the -same values. However, the value for LF is normally 21, though some EBCDIC -environments use 37. The corresponding values for CRLF are 3349 and 3365. The -default should normally correspond to the standard sequence for your operating -system. -.sp - PCRE_CONFIG_BSR -.sp -The output is an integer whose value indicates what character sequences the \eR -escape sequence matches by default. A value of 0 means that \eR matches any -Unicode line ending sequence; a value of 1 means that \eR matches only CR, LF, -or CRLF. The default can be overridden when a pattern is compiled or matched. -.sp - PCRE_CONFIG_LINK_SIZE -.sp -The output is an integer that contains the number of bytes used for internal -linkage in compiled regular expressions. For the 8-bit library, the value can -be 2, 3, or 4. For the 16-bit library, the value is either 2 or 4 and is still -a number of bytes. For the 32-bit library, the value is either 2 or 4 and is -still a number of bytes. The default value of 2 is sufficient for all but the -most massive patterns, since it allows the compiled pattern to be up to 64K in -size. Larger values allow larger regular expressions to be compiled, at the -expense of slower matching. -.sp - PCRE_CONFIG_POSIX_MALLOC_THRESHOLD -.sp -The output is an integer that contains the threshold above which the POSIX -interface uses \fBmalloc()\fP for output vectors. Further details are given in -the -.\" HREF -\fBpcreposix\fP -.\" -documentation. -.sp - PCRE_CONFIG_PARENS_LIMIT -.sp -The output is a long integer that gives the maximum depth of nesting of -parentheses (of any kind) in a pattern. This limit is imposed to cap the amount -of system stack used when a pattern is compiled. It is specified when PCRE is -built; the default is 250. This limit does not take into account the stack that -may already be used by the calling application. For finer control over -compilation stack usage, you can set a pointer to an external checking function -in \fBpcre_stack_guard\fP. -.sp - PCRE_CONFIG_MATCH_LIMIT -.sp -The output is a long integer that gives the default limit for the number of -internal matching function calls in a \fBpcre_exec()\fP execution. Further -details are given with \fBpcre_exec()\fP below. -.sp - PCRE_CONFIG_MATCH_LIMIT_RECURSION -.sp -The output is a long integer that gives the default limit for the depth of -recursion when calling the internal matching function in a \fBpcre_exec()\fP -execution. Further details are given with \fBpcre_exec()\fP below. -.sp - PCRE_CONFIG_STACKRECURSE -.sp -The output is an integer that is set to one if internal recursion when running -\fBpcre_exec()\fP is implemented by recursive function calls that use the stack -to remember their state. This is the usual way that PCRE is compiled. The -output is zero if PCRE was compiled to use blocks of data on the heap instead -of recursive function calls. In this case, \fBpcre_stack_malloc\fP and -\fBpcre_stack_free\fP are called to manage memory blocks on the heap, thus -avoiding the use of the stack. -. -. -.SH "COMPILING A PATTERN" -.rs -.sp -.nf -.B pcre *pcre_compile(const char *\fIpattern\fP, int \fIoptions\fP, -.B " const char **\fIerrptr\fP, int *\fIerroffset\fP," -.B " const unsigned char *\fItableptr\fP);" -.sp -.B pcre *pcre_compile2(const char *\fIpattern\fP, int \fIoptions\fP, -.B " int *\fIerrorcodeptr\fP," -.B " const char **\fIerrptr\fP, int *\fIerroffset\fP," -.B " const unsigned char *\fItableptr\fP);" -.fi -.P -Either of the functions \fBpcre_compile()\fP or \fBpcre_compile2()\fP can be -called to compile a pattern into an internal form. The only difference between -the two interfaces is that \fBpcre_compile2()\fP has an additional argument, -\fIerrorcodeptr\fP, via which a numerical error code can be returned. To avoid -too much repetition, we refer just to \fBpcre_compile()\fP below, but the -information applies equally to \fBpcre_compile2()\fP. -.P -The pattern is a C string terminated by a binary zero, and is passed in the -\fIpattern\fP argument. A pointer to a single block of memory that is obtained -via \fBpcre_malloc\fP is returned. This contains the compiled code and related -data. The \fBpcre\fP type is defined for the returned block; this is a typedef -for a structure whose contents are not externally defined. It is up to the -caller to free the memory (via \fBpcre_free\fP) when it is no longer required. -.P -Although the compiled code of a PCRE regex is relocatable, that is, it does not -depend on memory location, the complete \fBpcre\fP data block is not -fully relocatable, because it may contain a copy of the \fItableptr\fP -argument, which is an address (see below). -.P -The \fIoptions\fP argument contains various bit settings that affect the -compilation. It should be zero if no options are required. The available -options are described below. Some of them (in particular, those that are -compatible with Perl, but some others as well) can also be set and unset from -within the pattern (see the detailed description in the -.\" HREF -\fBpcrepattern\fP -.\" -documentation). For those options that can be different in different parts of -the pattern, the contents of the \fIoptions\fP argument specifies their -settings at the start of compilation and execution. The PCRE_ANCHORED, -PCRE_BSR_\fIxxx\fP, PCRE_NEWLINE_\fIxxx\fP, PCRE_NO_UTF8_CHECK, and -PCRE_NO_START_OPTIMIZE options can be set at the time of matching as well as at -compile time. -.P -If \fIerrptr\fP is NULL, \fBpcre_compile()\fP returns NULL immediately. -Otherwise, if compilation of a pattern fails, \fBpcre_compile()\fP returns -NULL, and sets the variable pointed to by \fIerrptr\fP to point to a textual -error message. This is a static string that is part of the library. You must -not try to free it. Normally, the offset from the start of the pattern to the -data unit that was being processed when the error was discovered is placed in -the variable pointed to by \fIerroffset\fP, which must not be NULL (if it is, -an immediate error is given). However, for an invalid UTF-8 or UTF-16 string, -the offset is that of the first data unit of the failing character. -.P -Some errors are not detected until the whole pattern has been scanned; in these -cases, the offset passed back is the length of the pattern. Note that the -offset is in data units, not characters, even in a UTF mode. It may sometimes -point into the middle of a UTF-8 or UTF-16 character. -.P -If \fBpcre_compile2()\fP is used instead of \fBpcre_compile()\fP, and the -\fIerrorcodeptr\fP argument is not NULL, a non-zero error code number is -returned via this argument in the event of an error. This is in addition to the -textual error message. Error codes and messages are listed below. -.P -If the final argument, \fItableptr\fP, is NULL, PCRE uses a default set of -character tables that are built when PCRE is compiled, using the default C -locale. Otherwise, \fItableptr\fP must be an address that is the result of a -call to \fBpcre_maketables()\fP. This value is stored with the compiled -pattern, and used again by \fBpcre_exec()\fP and \fBpcre_dfa_exec()\fP when the -pattern is matched. For more discussion, see the section on locale support -below. -.P -This code fragment shows a typical straightforward call to \fBpcre_compile()\fP: -.sp - pcre *re; - const char *error; - int erroffset; - re = pcre_compile( - "^A.*Z", /* the pattern */ - 0, /* default options */ - &error, /* for error message */ - &erroffset, /* for error offset */ - NULL); /* use default character tables */ -.sp -The following names for option bits are defined in the \fBpcre.h\fP header -file: -.sp - PCRE_ANCHORED -.sp -If this bit is set, the pattern is forced to be "anchored", that is, it is -constrained to match only at the first matching point in the string that is -being searched (the "subject string"). This effect can also be achieved by -appropriate constructs in the pattern itself, which is the only way to do it in -Perl. -.sp - PCRE_AUTO_CALLOUT -.sp -If this bit is set, \fBpcre_compile()\fP automatically inserts callout items, -all with number 255, before each pattern item. For discussion of the callout -facility, see the -.\" HREF -\fBpcrecallout\fP -.\" -documentation. -.sp - PCRE_BSR_ANYCRLF - PCRE_BSR_UNICODE -.sp -These options (which are mutually exclusive) control what the \eR escape -sequence matches. The choice is either to match only CR, LF, or CRLF, or to -match any Unicode newline sequence. The default is specified when PCRE is -built. It can be overridden from within the pattern, or by setting an option -when a compiled pattern is matched. -.sp - PCRE_CASELESS -.sp -If this bit is set, letters in the pattern match both upper and lower case -letters. It is equivalent to Perl's /i option, and it can be changed within a -pattern by a (?i) option setting. In UTF-8 mode, PCRE always understands the -concept of case for characters whose values are less than 128, so caseless -matching is always possible. For characters with higher values, the concept of -case is supported if PCRE is compiled with Unicode property support, but not -otherwise. If you want to use caseless matching for characters 128 and above, -you must ensure that PCRE is compiled with Unicode property support as well as -with UTF-8 support. -.sp - PCRE_DOLLAR_ENDONLY -.sp -If this bit is set, a dollar metacharacter in the pattern matches only at the -end of the subject string. Without this option, a dollar also matches -immediately before a newline at the end of the string (but not before any other -newlines). The PCRE_DOLLAR_ENDONLY option is ignored if PCRE_MULTILINE is set. -There is no equivalent to this option in Perl, and no way to set it within a -pattern. -.sp - PCRE_DOTALL -.sp -If this bit is set, a dot metacharacter in the pattern matches a character of -any value, including one that indicates a newline. However, it only ever -matches one character, even if newlines are coded as CRLF. Without this option, -a dot does not match when the current position is at a newline. This option is -equivalent to Perl's /s option, and it can be changed within a pattern by a -(?s) option setting. A negative class such as [^a] always matches newline -characters, independent of the setting of this option. -.sp - PCRE_DUPNAMES -.sp -If this bit is set, names used to identify capturing subpatterns need not be -unique. This can be helpful for certain types of pattern when it is known that -only one instance of the named subpattern can ever be matched. There are more -details of named subpatterns below; see also the -.\" HREF -\fBpcrepattern\fP -.\" -documentation. -.sp - PCRE_EXTENDED -.sp -If this bit is set, most white space characters in the pattern are totally -ignored except when escaped or inside a character class. However, white space -is not allowed within sequences such as (?> that introduce various -parenthesized subpatterns, nor within a numerical quantifier such as {1,3}. -However, ignorable white space is permitted between an item and a following -quantifier and between a quantifier and a following + that indicates -possessiveness. -.P -White space did not used to include the VT character (code 11), because Perl -did not treat this character as white space. However, Perl changed at release -5.18, so PCRE followed at release 8.34, and VT is now treated as white space. -.P -PCRE_EXTENDED also causes characters between an unescaped # outside a character -class and the next newline, inclusive, to be ignored. PCRE_EXTENDED is -equivalent to Perl's /x option, and it can be changed within a pattern by a -(?x) option setting. -.P -Which characters are interpreted as newlines is controlled by the options -passed to \fBpcre_compile()\fP or by a special sequence at the start of the -pattern, as described in the section entitled -.\" HTML -.\" -"Newline conventions" -.\" -in the \fBpcrepattern\fP documentation. Note that the end of this type of -comment is a literal newline sequence in the pattern; escape sequences that -happen to represent a newline do not count. -.P -This option makes it possible to include comments inside complicated patterns. -Note, however, that this applies only to data characters. White space characters -may never appear within special character sequences in a pattern, for example -within the sequence (?( that introduces a conditional subpattern. -.sp - PCRE_EXTRA -.sp -This option was invented in order to turn on additional functionality of PCRE -that is incompatible with Perl, but it is currently of very little use. When -set, any backslash in a pattern that is followed by a letter that has no -special meaning causes an error, thus reserving these combinations for future -expansion. By default, as in Perl, a backslash followed by a letter with no -special meaning is treated as a literal. (Perl can, however, be persuaded to -give an error for this, by running it with the -w option.) There are at present -no other features controlled by this option. It can also be set by a (?X) -option setting within a pattern. -.sp - PCRE_FIRSTLINE -.sp -If this option is set, an unanchored pattern is required to match before or at -the first newline in the subject string, though the matched text may continue -over the newline. -.sp - PCRE_JAVASCRIPT_COMPAT -.sp -If this option is set, PCRE's behaviour is changed in some ways so that it is -compatible with JavaScript rather than Perl. The changes are as follows: -.P -(1) A lone closing square bracket in a pattern causes a compile-time error, -because this is illegal in JavaScript (by default it is treated as a data -character). Thus, the pattern AB]CD becomes illegal when this option is set. -.P -(2) At run time, a back reference to an unset subpattern group matches an empty -string (by default this causes the current matching alternative to fail). A -pattern such as (\e1)(a) succeeds when this option is set (assuming it can find -an "a" in the subject), whereas it fails by default, for Perl compatibility. -.P -(3) \eU matches an upper case "U" character; by default \eU causes a compile -time error (Perl uses \eU to upper case subsequent characters). -.P -(4) \eu matches a lower case "u" character unless it is followed by four -hexadecimal digits, in which case the hexadecimal number defines the code point -to match. By default, \eu causes a compile time error (Perl uses it to upper -case the following character). -.P -(5) \ex matches a lower case "x" character unless it is followed by two -hexadecimal digits, in which case the hexadecimal number defines the code point -to match. By default, as in Perl, a hexadecimal number is always expected after -\ex, but it may have zero, one, or two digits (so, for example, \exz matches a -binary zero character followed by z). -.sp - PCRE_MULTILINE -.sp -By default, for the purposes of matching "start of line" and "end of line", -PCRE treats the subject string as consisting of a single line of characters, -even if it actually contains newlines. The "start of line" metacharacter (^) -matches only at the start of the string, and the "end of line" metacharacter -($) matches only at the end of the string, or before a terminating newline -(except when PCRE_DOLLAR_ENDONLY is set). Note, however, that unless -PCRE_DOTALL is set, the "any character" metacharacter (.) does not match at a -newline. This behaviour (for ^, $, and dot) is the same as Perl. -.P -When PCRE_MULTILINE it is set, the "start of line" and "end of line" constructs -match immediately following or immediately before internal newlines in the -subject string, respectively, as well as at the very start and end. This is -equivalent to Perl's /m option, and it can be changed within a pattern by a -(?m) option setting. If there are no newlines in a subject string, or no -occurrences of ^ or $ in a pattern, setting PCRE_MULTILINE has no effect. -.sp - PCRE_NEVER_UTF -.sp -This option locks out interpretation of the pattern as UTF-8 (or UTF-16 or -UTF-32 in the 16-bit and 32-bit libraries). In particular, it prevents the -creator of the pattern from switching to UTF interpretation by starting the -pattern with (*UTF). This may be useful in applications that process patterns -from external sources. The combination of PCRE_UTF8 and PCRE_NEVER_UTF also -causes an error. -.sp - PCRE_NEWLINE_CR - PCRE_NEWLINE_LF - PCRE_NEWLINE_CRLF - PCRE_NEWLINE_ANYCRLF - PCRE_NEWLINE_ANY -.sp -These options override the default newline definition that was chosen when PCRE -was built. Setting the first or the second specifies that a newline is -indicated by a single character (CR or LF, respectively). Setting -PCRE_NEWLINE_CRLF specifies that a newline is indicated by the two-character -CRLF sequence. Setting PCRE_NEWLINE_ANYCRLF specifies that any of the three -preceding sequences should be recognized. Setting PCRE_NEWLINE_ANY specifies -that any Unicode newline sequence should be recognized. -.P -In an ASCII/Unicode environment, the Unicode newline sequences are the three -just mentioned, plus the single characters VT (vertical tab, U+000B), FF (form -feed, U+000C), NEL (next line, U+0085), LS (line separator, U+2028), and PS -(paragraph separator, U+2029). For the 8-bit library, the last two are -recognized only in UTF-8 mode. -.P -When PCRE is compiled to run in an EBCDIC (mainframe) environment, the code for -CR is 0x0d, the same as ASCII. However, the character code for LF is normally -0x15, though in some EBCDIC environments 0x25 is used. Whichever of these is -not LF is made to correspond to Unicode's NEL character. EBCDIC codes are all -less than 256. For more details, see the -.\" HREF -\fBpcrebuild\fP -.\" -documentation. -.P -The newline setting in the options word uses three bits that are treated -as a number, giving eight possibilities. Currently only six are used (default -plus the five values above). This means that if you set more than one newline -option, the combination may or may not be sensible. For example, -PCRE_NEWLINE_CR with PCRE_NEWLINE_LF is equivalent to PCRE_NEWLINE_CRLF, but -other combinations may yield unused numbers and cause an error. -.P -The only time that a line break in a pattern is specially recognized when -compiling is when PCRE_EXTENDED is set. CR and LF are white space characters, -and so are ignored in this mode. Also, an unescaped # outside a character class -indicates a comment that lasts until after the next line break sequence. In -other circumstances, line break sequences in patterns are treated as literal -data. -.P -The newline option that is set at compile time becomes the default that is used -for \fBpcre_exec()\fP and \fBpcre_dfa_exec()\fP, but it can be overridden. -.sp - PCRE_NO_AUTO_CAPTURE -.sp -If this option is set, it disables the use of numbered capturing parentheses in -the pattern. Any opening parenthesis that is not followed by ? behaves as if it -were followed by ?: but named parentheses can still be used for capturing (and -they acquire numbers in the usual way). There is no equivalent of this option -in Perl. -.sp - PCRE_NO_AUTO_POSSESS -.sp -If this option is set, it disables "auto-possessification". This is an -optimization that, for example, turns a+b into a++b in order to avoid -backtracks into a+ that can never be successful. However, if callouts are in -use, auto-possessification means that some of them are never taken. You can set -this option if you want the matching functions to do a full unoptimized search -and run all the callouts, but it is mainly provided for testing purposes. -.sp - PCRE_NO_START_OPTIMIZE -.sp -This is an option that acts at matching time; that is, it is really an option -for \fBpcre_exec()\fP or \fBpcre_dfa_exec()\fP. If it is set at compile time, -it is remembered with the compiled pattern and assumed at matching time. This -is necessary if you want to use JIT execution, because the JIT compiler needs -to know whether or not this option is set. For details see the discussion of -PCRE_NO_START_OPTIMIZE -.\" HTML -.\" -below. -.\" -.sp - PCRE_UCP -.sp -This option changes the way PCRE processes \eB, \eb, \eD, \ed, \eS, \es, \eW, -\ew, and some of the POSIX character classes. By default, only ASCII characters -are recognized, but if PCRE_UCP is set, Unicode properties are used instead to -classify characters. More details are given in the section on -.\" HTML -.\" -generic character types -.\" -in the -.\" HREF -\fBpcrepattern\fP -.\" -page. If you set PCRE_UCP, matching one of the items it affects takes much -longer. The option is available only if PCRE has been compiled with Unicode -property support. -.sp - PCRE_UNGREEDY -.sp -This option inverts the "greediness" of the quantifiers so that they are not -greedy by default, but become greedy if followed by "?". It is not compatible -with Perl. It can also be set by a (?U) option setting within the pattern. -.sp - PCRE_UTF8 -.sp -This option causes PCRE to regard both the pattern and the subject as strings -of UTF-8 characters instead of single-byte strings. However, it is available -only when PCRE is built to include UTF support. If not, the use of this option -provokes an error. Details of how this option changes the behaviour of PCRE are -given in the -.\" HREF -\fBpcreunicode\fP -.\" -page. -.sp - PCRE_NO_UTF8_CHECK -.sp -When PCRE_UTF8 is set, the validity of the pattern as a UTF-8 string is -automatically checked. There is a discussion about the -.\" HTML -.\" -validity of UTF-8 strings -.\" -in the -.\" HREF -\fBpcreunicode\fP -.\" -page. If an invalid UTF-8 sequence is found, \fBpcre_compile()\fP returns an -error. If you already know that your pattern is valid, and you want to skip -this check for performance reasons, you can set the PCRE_NO_UTF8_CHECK option. -When it is set, the effect of passing an invalid UTF-8 string as a pattern is -undefined. It may cause your program to crash or loop. Note that this option -can also be passed to \fBpcre_exec()\fP and \fBpcre_dfa_exec()\fP, to suppress -the validity checking of subject strings only. If the same string is being -matched many times, the option can be safely set for the second and subsequent -matchings to improve performance. -. -. -.SH "COMPILATION ERROR CODES" -.rs -.sp -The following table lists the error codes than may be returned by -\fBpcre_compile2()\fP, along with the error messages that may be returned by -both compiling functions. Note that error messages are always 8-bit ASCII -strings, even in 16-bit or 32-bit mode. As PCRE has developed, some error codes -have fallen out of use. To avoid confusion, they have not been re-used. -.sp - 0 no error - 1 \e at end of pattern - 2 \ec at end of pattern - 3 unrecognized character follows \e - 4 numbers out of order in {} quantifier - 5 number too big in {} quantifier - 6 missing terminating ] for character class - 7 invalid escape sequence in character class - 8 range out of order in character class - 9 nothing to repeat - 10 [this code is not in use] - 11 internal error: unexpected repeat - 12 unrecognized character after (? or (?- - 13 POSIX named classes are supported only within a class - 14 missing ) - 15 reference to non-existent subpattern - 16 erroffset passed as NULL - 17 unknown option bit(s) set - 18 missing ) after comment - 19 [this code is not in use] - 20 regular expression is too large - 21 failed to get memory - 22 unmatched parentheses - 23 internal error: code overflow - 24 unrecognized character after (?< - 25 lookbehind assertion is not fixed length - 26 malformed number or name after (?( - 27 conditional group contains more than two branches - 28 assertion expected after (?( - 29 (?R or (?[+-]digits must be followed by ) - 30 unknown POSIX class name - 31 POSIX collating elements are not supported - 32 this version of PCRE is compiled without UTF support - 33 [this code is not in use] - 34 character value in \ex{} or \eo{} is too large - 35 invalid condition (?(0) - 36 \eC not allowed in lookbehind assertion - 37 PCRE does not support \eL, \el, \eN{name}, \eU, or \eu - 38 number after (?C is > 255 - 39 closing ) for (?C expected - 40 recursive call could loop indefinitely - 41 unrecognized character after (?P - 42 syntax error in subpattern name (missing terminator) - 43 two named subpatterns have the same name - 44 invalid UTF-8 string (specifically UTF-8) - 45 support for \eP, \ep, and \eX has not been compiled - 46 malformed \eP or \ep sequence - 47 unknown property name after \eP or \ep - 48 subpattern name is too long (maximum 32 characters) - 49 too many named subpatterns (maximum 10000) - 50 [this code is not in use] - 51 octal value is greater than \e377 in 8-bit non-UTF-8 mode - 52 internal error: overran compiling workspace - 53 internal error: previously-checked referenced subpattern - not found - 54 DEFINE group contains more than one branch - 55 repeating a DEFINE group is not allowed - 56 inconsistent NEWLINE options - 57 \eg is not followed by a braced, angle-bracketed, or quoted - name/number or by a plain number - 58 a numbered reference must not be zero - 59 an argument is not allowed for (*ACCEPT), (*FAIL), or (*COMMIT) - 60 (*VERB) not recognized or malformed - 61 number is too big - 62 subpattern name expected - 63 digit expected after (?+ - 64 ] is an invalid data character in JavaScript compatibility mode - 65 different names for subpatterns of the same number are - not allowed - 66 (*MARK) must have an argument - 67 this version of PCRE is not compiled with Unicode property - support - 68 \ec must be followed by an ASCII character - 69 \ek is not followed by a braced, angle-bracketed, or quoted name - 70 internal error: unknown opcode in find_fixedlength() - 71 \eN is not supported in a class - 72 too many forward references - 73 disallowed Unicode code point (>= 0xd800 && <= 0xdfff) - 74 invalid UTF-16 string (specifically UTF-16) - 75 name is too long in (*MARK), (*PRUNE), (*SKIP), or (*THEN) - 76 character value in \eu.... sequence is too large - 77 invalid UTF-32 string (specifically UTF-32) - 78 setting UTF is disabled by the application - 79 non-hex character in \ex{} (closing brace missing?) - 80 non-octal character in \eo{} (closing brace missing?) - 81 missing opening brace after \eo - 82 parentheses are too deeply nested - 83 invalid range in character class - 84 group name must start with a non-digit - 85 parentheses are too deeply nested (stack check) -.sp -The numbers 32 and 10000 in errors 48 and 49 are defaults; different values may -be used if the limits were changed when PCRE was built. -. -. -.\" HTML -.SH "STUDYING A PATTERN" -.rs -.sp -.nf -.B pcre_extra *pcre_study(const pcre *\fIcode\fP, int \fIoptions\fP, -.B " const char **\fIerrptr\fP);" -.fi -.PP -If a compiled pattern is going to be used several times, it is worth spending -more time analyzing it in order to speed up the time taken for matching. The -function \fBpcre_study()\fP takes a pointer to a compiled pattern as its first -argument. If studying the pattern produces additional information that will -help speed up matching, \fBpcre_study()\fP returns a pointer to a -\fBpcre_extra\fP block, in which the \fIstudy_data\fP field points to the -results of the study. -.P -The returned value from \fBpcre_study()\fP can be passed directly to -\fBpcre_exec()\fP or \fBpcre_dfa_exec()\fP. However, a \fBpcre_extra\fP block -also contains other fields that can be set by the caller before the block is -passed; these are described -.\" HTML -.\" -below -.\" -in the section on matching a pattern. -.P -If studying the pattern does not produce any useful information, -\fBpcre_study()\fP returns NULL by default. In that circumstance, if the -calling program wants to pass any of the other fields to \fBpcre_exec()\fP or -\fBpcre_dfa_exec()\fP, it must set up its own \fBpcre_extra\fP block. However, -if \fBpcre_study()\fP is called with the PCRE_STUDY_EXTRA_NEEDED option, it -returns a \fBpcre_extra\fP block even if studying did not find any additional -information. It may still return NULL, however, if an error occurs in -\fBpcre_study()\fP. -.P -The second argument of \fBpcre_study()\fP contains option bits. There are three -further options in addition to PCRE_STUDY_EXTRA_NEEDED: -.sp - PCRE_STUDY_JIT_COMPILE - PCRE_STUDY_JIT_PARTIAL_HARD_COMPILE - PCRE_STUDY_JIT_PARTIAL_SOFT_COMPILE -.sp -If any of these are set, and the just-in-time compiler is available, the -pattern is further compiled into machine code that executes much faster than -the \fBpcre_exec()\fP interpretive matching function. If the just-in-time -compiler is not available, these options are ignored. All undefined bits in the -\fIoptions\fP argument must be zero. -.P -JIT compilation is a heavyweight optimization. It can take some time for -patterns to be analyzed, and for one-off matches and simple patterns the -benefit of faster execution might be offset by a much slower study time. -Not all patterns can be optimized by the JIT compiler. For those that cannot be -handled, matching automatically falls back to the \fBpcre_exec()\fP -interpreter. For more details, see the -.\" HREF -\fBpcrejit\fP -.\" -documentation. -.P -The third argument for \fBpcre_study()\fP is a pointer for an error message. If -studying succeeds (even if no data is returned), the variable it points to is -set to NULL. Otherwise it is set to point to a textual error message. This is a -static string that is part of the library. You must not try to free it. You -should test the error pointer for NULL after calling \fBpcre_study()\fP, to be -sure that it has run successfully. -.P -When you are finished with a pattern, you can free the memory used for the -study data by calling \fBpcre_free_study()\fP. This function was added to the -API for release 8.20. For earlier versions, the memory could be freed with -\fBpcre_free()\fP, just like the pattern itself. This will still work in cases -where JIT optimization is not used, but it is advisable to change to the new -function when convenient. -.P -This is a typical way in which \fBpcre_study\fP() is used (except that in a -real application there should be tests for errors): -.sp - int rc; - pcre *re; - pcre_extra *sd; - re = pcre_compile("pattern", 0, &error, &erroroffset, NULL); - sd = pcre_study( - re, /* result of pcre_compile() */ - 0, /* no options */ - &error); /* set to NULL or points to a message */ - rc = pcre_exec( /* see below for details of pcre_exec() options */ - re, sd, "subject", 7, 0, 0, ovector, 30); - ... - pcre_free_study(sd); - pcre_free(re); -.sp -Studying a pattern does two things: first, a lower bound for the length of -subject string that is needed to match the pattern is computed. This does not -mean that there are any strings of that length that match, but it does -guarantee that no shorter strings match. The value is used to avoid wasting -time by trying to match strings that are shorter than the lower bound. You can -find out the value in a calling program via the \fBpcre_fullinfo()\fP function. -.P -Studying a pattern is also useful for non-anchored patterns that do not have a -single fixed starting character. A bitmap of possible starting bytes is -created. This speeds up finding a position in the subject at which to start -matching. (In 16-bit mode, the bitmap is used for 16-bit values less than 256. -In 32-bit mode, the bitmap is used for 32-bit values less than 256.) -.P -These two optimizations apply to both \fBpcre_exec()\fP and -\fBpcre_dfa_exec()\fP, and the information is also used by the JIT compiler. -The optimizations can be disabled by setting the PCRE_NO_START_OPTIMIZE option. -You might want to do this if your pattern contains callouts or (*MARK) and you -want to make use of these facilities in cases where matching fails. -.P -PCRE_NO_START_OPTIMIZE can be specified at either compile time or execution -time. However, if PCRE_NO_START_OPTIMIZE is passed to \fBpcre_exec()\fP, (that -is, after any JIT compilation has happened) JIT execution is disabled. For JIT -execution to work with PCRE_NO_START_OPTIMIZE, the option must be set at -compile time. -.P -There is a longer discussion of PCRE_NO_START_OPTIMIZE -.\" HTML -.\" -below. -.\" -. -. -.\" HTML -.SH "LOCALE SUPPORT" -.rs -.sp -PCRE handles caseless matching, and determines whether characters are letters, -digits, or whatever, by reference to a set of tables, indexed by character -code point. When running in UTF-8 mode, or in the 16- or 32-bit libraries, this -applies only to characters with code points less than 256. By default, -higher-valued code points never match escapes such as \ew or \ed. However, if -PCRE is built with Unicode property support, all characters can be tested with -\ep and \eP, or, alternatively, the PCRE_UCP option can be set when a pattern -is compiled; this causes \ew and friends to use Unicode property support -instead of the built-in tables. -.P -The use of locales with Unicode is discouraged. If you are handling characters -with code points greater than 128, you should either use Unicode support, or -use locales, but not try to mix the two. -.P -PCRE contains an internal set of tables that are used when the final argument -of \fBpcre_compile()\fP is NULL. These are sufficient for many applications. -Normally, the internal tables recognize only ASCII characters. However, when -PCRE is built, it is possible to cause the internal tables to be rebuilt in the -default "C" locale of the local system, which may cause them to be different. -.P -The internal tables can always be overridden by tables supplied by the -application that calls PCRE. These may be created in a different locale from -the default. As more and more applications change to using Unicode, the need -for this locale support is expected to die away. -.P -External tables are built by calling the \fBpcre_maketables()\fP function, -which has no arguments, in the relevant locale. The result can then be passed -to \fBpcre_compile()\fP as often as necessary. For example, to build and use -tables that are appropriate for the French locale (where accented characters -with values greater than 128 are treated as letters), the following code could -be used: -.sp - setlocale(LC_CTYPE, "fr_FR"); - tables = pcre_maketables(); - re = pcre_compile(..., tables); -.sp -The locale name "fr_FR" is used on Linux and other Unix-like systems; if you -are using Windows, the name for the French locale is "french". -.P -When \fBpcre_maketables()\fP runs, the tables are built in memory that is -obtained via \fBpcre_malloc\fP. It is the caller's responsibility to ensure -that the memory containing the tables remains available for as long as it is -needed. -.P -The pointer that is passed to \fBpcre_compile()\fP is saved with the compiled -pattern, and the same tables are used via this pointer by \fBpcre_study()\fP -and also by \fBpcre_exec()\fP and \fBpcre_dfa_exec()\fP. Thus, for any single -pattern, compilation, studying and matching all happen in the same locale, but -different patterns can be processed in different locales. -.P -It is possible to pass a table pointer or NULL (indicating the use of the -internal tables) to \fBpcre_exec()\fP or \fBpcre_dfa_exec()\fP (see the -discussion below in the section on matching a pattern). This facility is -provided for use with pre-compiled patterns that have been saved and reloaded. -Character tables are not saved with patterns, so if a non-standard table was -used at compile time, it must be provided again when the reloaded pattern is -matched. Attempting to use this facility to match a pattern in a different -locale from the one in which it was compiled is likely to lead to anomalous -(usually incorrect) results. -. -. -.\" HTML -.SH "INFORMATION ABOUT A PATTERN" -.rs -.sp -.nf -.B int pcre_fullinfo(const pcre *\fIcode\fP, "const pcre_extra *\fIextra\fP," -.B " int \fIwhat\fP, void *\fIwhere\fP);" -.fi -.PP -The \fBpcre_fullinfo()\fP function returns information about a compiled -pattern. It replaces the \fBpcre_info()\fP function, which was removed from the -library at version 8.30, after more than 10 years of obsolescence. -.P -The first argument for \fBpcre_fullinfo()\fP is a pointer to the compiled -pattern. The second argument is the result of \fBpcre_study()\fP, or NULL if -the pattern was not studied. The third argument specifies which piece of -information is required, and the fourth argument is a pointer to a variable -to receive the data. The yield of the function is zero for success, or one of -the following negative numbers: -.sp - PCRE_ERROR_NULL the argument \fIcode\fP was NULL - the argument \fIwhere\fP was NULL - PCRE_ERROR_BADMAGIC the "magic number" was not found - PCRE_ERROR_BADENDIANNESS the pattern was compiled with different - endianness - PCRE_ERROR_BADOPTION the value of \fIwhat\fP was invalid - PCRE_ERROR_UNSET the requested field is not set -.sp -The "magic number" is placed at the start of each compiled pattern as an simple -check against passing an arbitrary memory pointer. The endianness error can -occur if a compiled pattern is saved and reloaded on a different host. Here is -a typical call of \fBpcre_fullinfo()\fP, to obtain the length of the compiled -pattern: -.sp - int rc; - size_t length; - rc = pcre_fullinfo( - re, /* result of pcre_compile() */ - sd, /* result of pcre_study(), or NULL */ - PCRE_INFO_SIZE, /* what is required */ - &length); /* where to put the data */ -.sp -The possible values for the third argument are defined in \fBpcre.h\fP, and are -as follows: -.sp - PCRE_INFO_BACKREFMAX -.sp -Return the number of the highest back reference in the pattern. The fourth -argument should point to an \fBint\fP variable. Zero is returned if there are -no back references. -.sp - PCRE_INFO_CAPTURECOUNT -.sp -Return the number of capturing subpatterns in the pattern. The fourth argument -should point to an \fBint\fP variable. -.sp - PCRE_INFO_DEFAULT_TABLES -.sp -Return a pointer to the internal default character tables within PCRE. The -fourth argument should point to an \fBunsigned char *\fP variable. This -information call is provided for internal use by the \fBpcre_study()\fP -function. External callers can cause PCRE to use its internal tables by passing -a NULL table pointer. -.sp - PCRE_INFO_FIRSTBYTE (deprecated) -.sp -Return information about the first data unit of any matched string, for a -non-anchored pattern. The name of this option refers to the 8-bit library, -where data units are bytes. The fourth argument should point to an \fBint\fP -variable. Negative values are used for special cases. However, this means that -when the 32-bit library is in non-UTF-32 mode, the full 32-bit range of -characters cannot be returned. For this reason, this value is deprecated; use -PCRE_INFO_FIRSTCHARACTERFLAGS and PCRE_INFO_FIRSTCHARACTER instead. -.P -If there is a fixed first value, for example, the letter "c" from a pattern -such as (cat|cow|coyote), its value is returned. In the 8-bit library, the -value is always less than 256. In the 16-bit library the value can be up to -0xffff. In the 32-bit library the value can be up to 0x10ffff. -.P -If there is no fixed first value, and if either -.sp -(a) the pattern was compiled with the PCRE_MULTILINE option, and every branch -starts with "^", or -.sp -(b) every branch of the pattern starts with ".*" and PCRE_DOTALL is not set -(if it were set, the pattern would be anchored), -.sp --1 is returned, indicating that the pattern matches only at the start of a -subject string or after any newline within the string. Otherwise -2 is -returned. For anchored patterns, -2 is returned. -.sp - PCRE_INFO_FIRSTCHARACTER -.sp -Return the value of the first data unit (non-UTF character) of any matched -string in the situation where PCRE_INFO_FIRSTCHARACTERFLAGS returns 1; -otherwise return 0. The fourth argument should point to an \fBuint_t\fP -variable. -.P -In the 8-bit library, the value is always less than 256. In the 16-bit library -the value can be up to 0xffff. In the 32-bit library in UTF-32 mode the value -can be up to 0x10ffff, and up to 0xffffffff when not using UTF-32 mode. -.sp - PCRE_INFO_FIRSTCHARACTERFLAGS -.sp -Return information about the first data unit of any matched string, for a -non-anchored pattern. The fourth argument should point to an \fBint\fP -variable. -.P -If there is a fixed first value, for example, the letter "c" from a pattern -such as (cat|cow|coyote), 1 is returned, and the character value can be -retrieved using PCRE_INFO_FIRSTCHARACTER. If there is no fixed first value, and -if either -.sp -(a) the pattern was compiled with the PCRE_MULTILINE option, and every branch -starts with "^", or -.sp -(b) every branch of the pattern starts with ".*" and PCRE_DOTALL is not set -(if it were set, the pattern would be anchored), -.sp -2 is returned, indicating that the pattern matches only at the start of a -subject string or after any newline within the string. Otherwise 0 is -returned. For anchored patterns, 0 is returned. -.sp - PCRE_INFO_FIRSTTABLE -.sp -If the pattern was studied, and this resulted in the construction of a 256-bit -table indicating a fixed set of values for the first data unit in any matching -string, a pointer to the table is returned. Otherwise NULL is returned. The -fourth argument should point to an \fBunsigned char *\fP variable. -.sp - PCRE_INFO_HASCRORLF -.sp -Return 1 if the pattern contains any explicit matches for CR or LF characters, -otherwise 0. The fourth argument should point to an \fBint\fP variable. An -explicit match is either a literal CR or LF character, or \er or \en. -.sp - PCRE_INFO_JCHANGED -.sp -Return 1 if the (?J) or (?-J) option setting is used in the pattern, otherwise -0. The fourth argument should point to an \fBint\fP variable. (?J) and -(?-J) set and unset the local PCRE_DUPNAMES option, respectively. -.sp - PCRE_INFO_JIT -.sp -Return 1 if the pattern was studied with one of the JIT options, and -just-in-time compiling was successful. The fourth argument should point to an -\fBint\fP variable. A return value of 0 means that JIT support is not available -in this version of PCRE, or that the pattern was not studied with a JIT option, -or that the JIT compiler could not handle this particular pattern. See the -.\" HREF -\fBpcrejit\fP -.\" -documentation for details of what can and cannot be handled. -.sp - PCRE_INFO_JITSIZE -.sp -If the pattern was successfully studied with a JIT option, return the size of -the JIT compiled code, otherwise return zero. The fourth argument should point -to a \fBsize_t\fP variable. -.sp - PCRE_INFO_LASTLITERAL -.sp -Return the value of the rightmost literal data unit that must exist in any -matched string, other than at its start, if such a value has been recorded. The -fourth argument should point to an \fBint\fP variable. If there is no such -value, -1 is returned. For anchored patterns, a last literal value is recorded -only if it follows something of variable length. For example, for the pattern -/^a\ed+z\ed+/ the returned value is "z", but for /^a\edz\ed/ the returned value -is -1. -.P -Since for the 32-bit library using the non-UTF-32 mode, this function is unable -to return the full 32-bit range of characters, this value is deprecated; -instead the PCRE_INFO_REQUIREDCHARFLAGS and PCRE_INFO_REQUIREDCHAR values should -be used. -.sp - PCRE_INFO_MATCH_EMPTY -.sp -Return 1 if the pattern can match an empty string, otherwise 0. The fourth -argument should point to an \fBint\fP variable. -.sp - PCRE_INFO_MATCHLIMIT -.sp -If the pattern set a match limit by including an item of the form -(*LIMIT_MATCH=nnnn) at the start, the value is returned. The fourth argument -should point to an unsigned 32-bit integer. If no such value has been set, the -call to \fBpcre_fullinfo()\fP returns the error PCRE_ERROR_UNSET. -.sp - PCRE_INFO_MAXLOOKBEHIND -.sp -Return the number of characters (NB not data units) in the longest lookbehind -assertion in the pattern. This information is useful when doing multi-segment -matching using the partial matching facilities. Note that the simple assertions -\eb and \eB require a one-character lookbehind. \eA also registers a -one-character lookbehind, though it does not actually inspect the previous -character. This is to ensure that at least one character from the old segment -is retained when a new segment is processed. Otherwise, if there are no -lookbehinds in the pattern, \eA might match incorrectly at the start of a new -segment. -.sp - PCRE_INFO_MINLENGTH -.sp -If the pattern was studied and a minimum length for matching subject strings -was computed, its value is returned. Otherwise the returned value is -1. The -value is a number of characters, which in UTF mode may be different from the -number of data units. The fourth argument should point to an \fBint\fP -variable. A non-negative value is a lower bound to the length of any matching -string. There may not be any strings of that length that do actually match, but -every string that does match is at least that long. -.sp - PCRE_INFO_NAMECOUNT - PCRE_INFO_NAMEENTRYSIZE - PCRE_INFO_NAMETABLE -.sp -PCRE supports the use of named as well as numbered capturing parentheses. The -names are just an additional way of identifying the parentheses, which still -acquire numbers. Several convenience functions such as -\fBpcre_get_named_substring()\fP are provided for extracting captured -substrings by name. It is also possible to extract the data directly, by first -converting the name to a number in order to access the correct pointers in the -output vector (described with \fBpcre_exec()\fP below). To do the conversion, -you need to use the name-to-number map, which is described by these three -values. -.P -The map consists of a number of fixed-size entries. PCRE_INFO_NAMECOUNT gives -the number of entries, and PCRE_INFO_NAMEENTRYSIZE gives the size of each -entry; both of these return an \fBint\fP value. The entry size depends on the -length of the longest name. PCRE_INFO_NAMETABLE returns a pointer to the first -entry of the table. This is a pointer to \fBchar\fP in the 8-bit library, where -the first two bytes of each entry are the number of the capturing parenthesis, -most significant byte first. In the 16-bit library, the pointer points to -16-bit data units, the first of which contains the parenthesis number. In the -32-bit library, the pointer points to 32-bit data units, the first of which -contains the parenthesis number. The rest of the entry is the corresponding -name, zero terminated. -.P -The names are in alphabetical order. If (?| is used to create multiple groups -with the same number, as described in the -.\" HTML -.\" -section on duplicate subpattern numbers -.\" -in the -.\" HREF -\fBpcrepattern\fP -.\" -page, the groups may be given the same name, but there is only one entry in the -table. Different names for groups of the same number are not permitted. -Duplicate names for subpatterns with different numbers are permitted, -but only if PCRE_DUPNAMES is set. They appear in the table in the order in -which they were found in the pattern. In the absence of (?| this is the order -of increasing number; when (?| is used this is not necessarily the case because -later subpatterns may have lower numbers. -.P -As a simple example of the name/number table, consider the following pattern -after compilation by the 8-bit library (assume PCRE_EXTENDED is set, so white -space - including newlines - is ignored): -.sp -.\" JOIN - (? (?(\ed\ed)?\ed\ed) - - (?\ed\ed) - (?\ed\ed) ) -.sp -There are four named subpatterns, so the table has four entries, and each entry -in the table is eight bytes long. The table is as follows, with non-printing -bytes shows in hexadecimal, and undefined bytes shown as ??: -.sp - 00 01 d a t e 00 ?? - 00 05 d a y 00 ?? ?? - 00 04 m o n t h 00 - 00 02 y e a r 00 ?? -.sp -When writing code to extract data from named subpatterns using the -name-to-number map, remember that the length of the entries is likely to be -different for each compiled pattern. -.sp - PCRE_INFO_OKPARTIAL -.sp -Return 1 if the pattern can be used for partial matching with -\fBpcre_exec()\fP, otherwise 0. The fourth argument should point to an -\fBint\fP variable. From release 8.00, this always returns 1, because the -restrictions that previously applied to partial matching have been lifted. The -.\" HREF -\fBpcrepartial\fP -.\" -documentation gives details of partial matching. -.sp - PCRE_INFO_OPTIONS -.sp -Return a copy of the options with which the pattern was compiled. The fourth -argument should point to an \fBunsigned long int\fP variable. These option bits -are those specified in the call to \fBpcre_compile()\fP, modified by any -top-level option settings at the start of the pattern itself. In other words, -they are the options that will be in force when matching starts. For example, -if the pattern /(?im)abc(?-i)d/ is compiled with the PCRE_EXTENDED option, the -result is PCRE_CASELESS, PCRE_MULTILINE, and PCRE_EXTENDED. -.P -A pattern is automatically anchored by PCRE if all of its top-level -alternatives begin with one of the following: -.sp - ^ unless PCRE_MULTILINE is set - \eA always - \eG always -.\" JOIN - .* if PCRE_DOTALL is set and there are no back - references to the subpattern in which .* appears -.sp -For such patterns, the PCRE_ANCHORED bit is set in the options returned by -\fBpcre_fullinfo()\fP. -.sp - PCRE_INFO_RECURSIONLIMIT -.sp -If the pattern set a recursion limit by including an item of the form -(*LIMIT_RECURSION=nnnn) at the start, the value is returned. The fourth -argument should point to an unsigned 32-bit integer. If no such value has been -set, the call to \fBpcre_fullinfo()\fP returns the error PCRE_ERROR_UNSET. -.sp - PCRE_INFO_SIZE -.sp -Return the size of the compiled pattern in bytes (for all three libraries). The -fourth argument should point to a \fBsize_t\fP variable. This value does not -include the size of the \fBpcre\fP structure that is returned by -\fBpcre_compile()\fP. The value that is passed as the argument to -\fBpcre_malloc()\fP when \fBpcre_compile()\fP is getting memory in which to -place the compiled data is the value returned by this option plus the size of -the \fBpcre\fP structure. Studying a compiled pattern, with or without JIT, -does not alter the value returned by this option. -.sp - PCRE_INFO_STUDYSIZE -.sp -Return the size in bytes (for all three libraries) of the data block pointed to -by the \fIstudy_data\fP field in a \fBpcre_extra\fP block. If \fBpcre_extra\fP -is NULL, or there is no study data, zero is returned. The fourth argument -should point to a \fBsize_t\fP variable. The \fIstudy_data\fP field is set by -\fBpcre_study()\fP to record information that will speed up matching (see the -section entitled -.\" HTML -.\" -"Studying a pattern" -.\" -above). The format of the \fIstudy_data\fP block is private, but its length -is made available via this option so that it can be saved and restored (see the -.\" HREF -\fBpcreprecompile\fP -.\" -documentation for details). -.sp - PCRE_INFO_REQUIREDCHARFLAGS -.sp -Returns 1 if there is a rightmost literal data unit that must exist in any -matched string, other than at its start. The fourth argument should point to -an \fBint\fP variable. If there is no such value, 0 is returned. If returning -1, the character value itself can be retrieved using PCRE_INFO_REQUIREDCHAR. -.P -For anchored patterns, a last literal value is recorded only if it follows -something of variable length. For example, for the pattern /^a\ed+z\ed+/ the -returned value 1 (with "z" returned from PCRE_INFO_REQUIREDCHAR), but for -/^a\edz\ed/ the returned value is 0. -.sp - PCRE_INFO_REQUIREDCHAR -.sp -Return the value of the rightmost literal data unit that must exist in any -matched string, other than at its start, if such a value has been recorded. The -fourth argument should point to an \fBuint32_t\fP variable. If there is no such -value, 0 is returned. -. -. -.SH "REFERENCE COUNTS" -.rs -.sp -.B int pcre_refcount(pcre *\fIcode\fP, int \fIadjust\fP); -.PP -The \fBpcre_refcount()\fP function is used to maintain a reference count in the -data block that contains a compiled pattern. It is provided for the benefit of -applications that operate in an object-oriented manner, where different parts -of the application may be using the same compiled pattern, but you want to free -the block when they are all done. -.P -When a pattern is compiled, the reference count field is initialized to zero. -It is changed only by calling this function, whose action is to add the -\fIadjust\fP value (which may be positive or negative) to it. The yield of the -function is the new value. However, the value of the count is constrained to -lie between 0 and 65535, inclusive. If the new value is outside these limits, -it is forced to the appropriate limit value. -.P -Except when it is zero, the reference count is not correctly preserved if a -pattern is compiled on one host and then transferred to a host whose byte-order -is different. (This seems a highly unlikely scenario.) -. -. -.SH "MATCHING A PATTERN: THE TRADITIONAL FUNCTION" -.rs -.sp -.nf -.B int pcre_exec(const pcre *\fIcode\fP, "const pcre_extra *\fIextra\fP," -.B " const char *\fIsubject\fP," int \fIlength\fP, int \fIstartoffset\fP, -.B " int \fIoptions\fP, int *\fIovector\fP, int \fIovecsize\fP);" -.fi -.P -The function \fBpcre_exec()\fP is called to match a subject string against a -compiled pattern, which is passed in the \fIcode\fP argument. If the -pattern was studied, the result of the study should be passed in the -\fIextra\fP argument. You can call \fBpcre_exec()\fP with the same \fIcode\fP -and \fIextra\fP arguments as many times as you like, in order to match -different subject strings with the same pattern. -.P -This function is the main matching facility of the library, and it operates in -a Perl-like manner. For specialist use there is also an alternative matching -function, which is described -.\" HTML -.\" -below -.\" -in the section about the \fBpcre_dfa_exec()\fP function. -.P -In most applications, the pattern will have been compiled (and optionally -studied) in the same process that calls \fBpcre_exec()\fP. However, it is -possible to save compiled patterns and study data, and then use them later -in different processes, possibly even on different hosts. For a discussion -about this, see the -.\" HREF -\fBpcreprecompile\fP -.\" -documentation. -.P -Here is an example of a simple call to \fBpcre_exec()\fP: -.sp - int rc; - int ovector[30]; - rc = pcre_exec( - re, /* result of pcre_compile() */ - NULL, /* we didn't study the pattern */ - "some string", /* the subject string */ - 11, /* the length of the subject string */ - 0, /* start at offset 0 in the subject */ - 0, /* default options */ - ovector, /* vector of integers for substring information */ - 30); /* number of elements (NOT size in bytes) */ -. -. -.\" HTML -.SS "Extra data for \fBpcre_exec()\fR" -.rs -.sp -If the \fIextra\fP argument is not NULL, it must point to a \fBpcre_extra\fP -data block. The \fBpcre_study()\fP function returns such a block (when it -doesn't return NULL), but you can also create one for yourself, and pass -additional information in it. The \fBpcre_extra\fP block contains the following -fields (not necessarily in this order): -.sp - unsigned long int \fIflags\fP; - void *\fIstudy_data\fP; - void *\fIexecutable_jit\fP; - unsigned long int \fImatch_limit\fP; - unsigned long int \fImatch_limit_recursion\fP; - void *\fIcallout_data\fP; - const unsigned char *\fItables\fP; - unsigned char **\fImark\fP; -.sp -In the 16-bit version of this structure, the \fImark\fP field has type -"PCRE_UCHAR16 **". -.sp -In the 32-bit version of this structure, the \fImark\fP field has type -"PCRE_UCHAR32 **". -.P -The \fIflags\fP field is used to specify which of the other fields are set. The -flag bits are: -.sp - PCRE_EXTRA_CALLOUT_DATA - PCRE_EXTRA_EXECUTABLE_JIT - PCRE_EXTRA_MARK - PCRE_EXTRA_MATCH_LIMIT - PCRE_EXTRA_MATCH_LIMIT_RECURSION - PCRE_EXTRA_STUDY_DATA - PCRE_EXTRA_TABLES -.sp -Other flag bits should be set to zero. The \fIstudy_data\fP field and sometimes -the \fIexecutable_jit\fP field are set in the \fBpcre_extra\fP block that is -returned by \fBpcre_study()\fP, together with the appropriate flag bits. You -should not set these yourself, but you may add to the block by setting other -fields and their corresponding flag bits. -.P -The \fImatch_limit\fP field provides a means of preventing PCRE from using up a -vast amount of resources when running patterns that are not going to match, -but which have a very large number of possibilities in their search trees. The -classic example is a pattern that uses nested unlimited repeats. -.P -Internally, \fBpcre_exec()\fP uses a function called \fBmatch()\fP, which it -calls repeatedly (sometimes recursively). The limit set by \fImatch_limit\fP is -imposed on the number of times this function is called during a match, which -has the effect of limiting the amount of backtracking that can take place. For -patterns that are not anchored, the count restarts from zero for each position -in the subject string. -.P -When \fBpcre_exec()\fP is called with a pattern that was successfully studied -with a JIT option, the way that the matching is executed is entirely different. -However, there is still the possibility of runaway matching that goes on for a -very long time, and so the \fImatch_limit\fP value is also used in this case -(but in a different way) to limit how long the matching can continue. -.P -The default value for the limit can be set when PCRE is built; the default -default is 10 million, which handles all but the most extreme cases. You can -override the default by suppling \fBpcre_exec()\fP with a \fBpcre_extra\fP -block in which \fImatch_limit\fP is set, and PCRE_EXTRA_MATCH_LIMIT is set in -the \fIflags\fP field. If the limit is exceeded, \fBpcre_exec()\fP returns -PCRE_ERROR_MATCHLIMIT. -.P -A value for the match limit may also be supplied by an item at the start of a -pattern of the form -.sp - (*LIMIT_MATCH=d) -.sp -where d is a decimal number. However, such a setting is ignored unless d is -less than the limit set by the caller of \fBpcre_exec()\fP or, if no such limit -is set, less than the default. -.P -The \fImatch_limit_recursion\fP field is similar to \fImatch_limit\fP, but -instead of limiting the total number of times that \fBmatch()\fP is called, it -limits the depth of recursion. The recursion depth is a smaller number than the -total number of calls, because not all calls to \fBmatch()\fP are recursive. -This limit is of use only if it is set smaller than \fImatch_limit\fP. -.P -Limiting the recursion depth limits the amount of machine stack that can be -used, or, when PCRE has been compiled to use memory on the heap instead of the -stack, the amount of heap memory that can be used. This limit is not relevant, -and is ignored, when matching is done using JIT compiled code. -.P -The default value for \fImatch_limit_recursion\fP can be set when PCRE is -built; the default default is the same value as the default for -\fImatch_limit\fP. You can override the default by suppling \fBpcre_exec()\fP -with a \fBpcre_extra\fP block in which \fImatch_limit_recursion\fP is set, and -PCRE_EXTRA_MATCH_LIMIT_RECURSION is set in the \fIflags\fP field. If the limit -is exceeded, \fBpcre_exec()\fP returns PCRE_ERROR_RECURSIONLIMIT. -.P -A value for the recursion limit may also be supplied by an item at the start of -a pattern of the form -.sp - (*LIMIT_RECURSION=d) -.sp -where d is a decimal number. However, such a setting is ignored unless d is -less than the limit set by the caller of \fBpcre_exec()\fP or, if no such limit -is set, less than the default. -.P -The \fIcallout_data\fP field is used in conjunction with the "callout" feature, -and is described in the -.\" HREF -\fBpcrecallout\fP -.\" -documentation. -.P -The \fItables\fP field is provided for use with patterns that have been -pre-compiled using custom character tables, saved to disc or elsewhere, and -then reloaded, because the tables that were used to compile a pattern are not -saved with it. See the -.\" HREF -\fBpcreprecompile\fP -.\" -documentation for a discussion of saving compiled patterns for later use. If -NULL is passed using this mechanism, it forces PCRE's internal tables to be -used. -.P -\fBWarning:\fP The tables that \fBpcre_exec()\fP uses must be the same as those -that were used when the pattern was compiled. If this is not the case, the -behaviour of \fBpcre_exec()\fP is undefined. Therefore, when a pattern is -compiled and matched in the same process, this field should never be set. In -this (the most common) case, the correct table pointer is automatically passed -with the compiled pattern from \fBpcre_compile()\fP to \fBpcre_exec()\fP. -.P -If PCRE_EXTRA_MARK is set in the \fIflags\fP field, the \fImark\fP field must -be set to point to a suitable variable. If the pattern contains any -backtracking control verbs such as (*MARK:NAME), and the execution ends up with -a name to pass back, a pointer to the name string (zero terminated) is placed -in the variable pointed to by the \fImark\fP field. The names are within the -compiled pattern; if you wish to retain such a name you must copy it before -freeing the memory of a compiled pattern. If there is no name to pass back, the -variable pointed to by the \fImark\fP field is set to NULL. For details of the -backtracking control verbs, see the section entitled -.\" HTML -.\" -"Backtracking control" -.\" -in the -.\" HREF -\fBpcrepattern\fP -.\" -documentation. -. -. -.\" HTML -.SS "Option bits for \fBpcre_exec()\fP" -.rs -.sp -The unused bits of the \fIoptions\fP argument for \fBpcre_exec()\fP must be -zero. The only bits that may be set are PCRE_ANCHORED, PCRE_NEWLINE_\fIxxx\fP, -PCRE_NOTBOL, PCRE_NOTEOL, PCRE_NOTEMPTY, PCRE_NOTEMPTY_ATSTART, -PCRE_NO_START_OPTIMIZE, PCRE_NO_UTF8_CHECK, PCRE_PARTIAL_HARD, and -PCRE_PARTIAL_SOFT. -.P -If the pattern was successfully studied with one of the just-in-time (JIT) -compile options, the only supported options for JIT execution are -PCRE_NO_UTF8_CHECK, PCRE_NOTBOL, PCRE_NOTEOL, PCRE_NOTEMPTY, -PCRE_NOTEMPTY_ATSTART, PCRE_PARTIAL_HARD, and PCRE_PARTIAL_SOFT. If an -unsupported option is used, JIT execution is disabled and the normal -interpretive code in \fBpcre_exec()\fP is run. -.sp - PCRE_ANCHORED -.sp -The PCRE_ANCHORED option limits \fBpcre_exec()\fP to matching at the first -matching position. If a pattern was compiled with PCRE_ANCHORED, or turned out -to be anchored by virtue of its contents, it cannot be made unachored at -matching time. -.sp - PCRE_BSR_ANYCRLF - PCRE_BSR_UNICODE -.sp -These options (which are mutually exclusive) control what the \eR escape -sequence matches. The choice is either to match only CR, LF, or CRLF, or to -match any Unicode newline sequence. These options override the choice that was -made or defaulted when the pattern was compiled. -.sp - PCRE_NEWLINE_CR - PCRE_NEWLINE_LF - PCRE_NEWLINE_CRLF - PCRE_NEWLINE_ANYCRLF - PCRE_NEWLINE_ANY -.sp -These options override the newline definition that was chosen or defaulted when -the pattern was compiled. For details, see the description of -\fBpcre_compile()\fP above. During matching, the newline choice affects the -behaviour of the dot, circumflex, and dollar metacharacters. It may also alter -the way the match position is advanced after a match failure for an unanchored -pattern. -.P -When PCRE_NEWLINE_CRLF, PCRE_NEWLINE_ANYCRLF, or PCRE_NEWLINE_ANY is set, and a -match attempt for an unanchored pattern fails when the current position is at a -CRLF sequence, and the pattern contains no explicit matches for CR or LF -characters, the match position is advanced by two characters instead of one, in -other words, to after the CRLF. -.P -The above rule is a compromise that makes the most common cases work as -expected. For example, if the pattern is .+A (and the PCRE_DOTALL option is not -set), it does not match the string "\er\enA" because, after failing at the -start, it skips both the CR and the LF before retrying. However, the pattern -[\er\en]A does match that string, because it contains an explicit CR or LF -reference, and so advances only by one character after the first failure. -.P -An explicit match for CR of LF is either a literal appearance of one of those -characters, or one of the \er or \en escape sequences. Implicit matches such as -[^X] do not count, nor does \es (which includes CR and LF in the characters -that it matches). -.P -Notwithstanding the above, anomalous effects may still occur when CRLF is a -valid newline sequence and explicit \er or \en escapes appear in the pattern. -.sp - PCRE_NOTBOL -.sp -This option specifies that first character of the subject string is not the -beginning of a line, so the circumflex metacharacter should not match before -it. Setting this without PCRE_MULTILINE (at compile time) causes circumflex -never to match. This option affects only the behaviour of the circumflex -metacharacter. It does not affect \eA. -.sp - PCRE_NOTEOL -.sp -This option specifies that the end of the subject string is not the end of a -line, so the dollar metacharacter should not match it nor (except in multiline -mode) a newline immediately before it. Setting this without PCRE_MULTILINE (at -compile time) causes dollar never to match. This option affects only the -behaviour of the dollar metacharacter. It does not affect \eZ or \ez. -.sp - PCRE_NOTEMPTY -.sp -An empty string is not considered to be a valid match if this option is set. If -there are alternatives in the pattern, they are tried. If all the alternatives -match the empty string, the entire match fails. For example, if the pattern -.sp - a?b? -.sp -is applied to a string not beginning with "a" or "b", it matches an empty -string at the start of the subject. With PCRE_NOTEMPTY set, this match is not -valid, so PCRE searches further into the string for occurrences of "a" or "b". -.sp - PCRE_NOTEMPTY_ATSTART -.sp -This is like PCRE_NOTEMPTY, except that an empty string match that is not at -the start of the subject is permitted. If the pattern is anchored, such a match -can occur only if the pattern contains \eK. -.P -Perl has no direct equivalent of PCRE_NOTEMPTY or PCRE_NOTEMPTY_ATSTART, but it -does make a special case of a pattern match of the empty string within its -\fBsplit()\fP function, and when using the /g modifier. It is possible to -emulate Perl's behaviour after matching a null string by first trying the match -again at the same offset with PCRE_NOTEMPTY_ATSTART and PCRE_ANCHORED, and then -if that fails, by advancing the starting offset (see below) and trying an -ordinary match again. There is some code that demonstrates how to do this in -the -.\" HREF -\fBpcredemo\fP -.\" -sample program. In the most general case, you have to check to see if the -newline convention recognizes CRLF as a newline, and if so, and the current -character is CR followed by LF, advance the starting offset by two characters -instead of one. -.sp - PCRE_NO_START_OPTIMIZE -.sp -There are a number of optimizations that \fBpcre_exec()\fP uses at the start of -a match, in order to speed up the process. For example, if it is known that an -unanchored match must start with a specific character, it searches the subject -for that character, and fails immediately if it cannot find it, without -actually running the main matching function. This means that a special item -such as (*COMMIT) at the start of a pattern is not considered until after a -suitable starting point for the match has been found. Also, when callouts or -(*MARK) items are in use, these "start-up" optimizations can cause them to be -skipped if the pattern is never actually used. The start-up optimizations are -in effect a pre-scan of the subject that takes place before the pattern is run. -.P -The PCRE_NO_START_OPTIMIZE option disables the start-up optimizations, possibly -causing performance to suffer, but ensuring that in cases where the result is -"no match", the callouts do occur, and that items such as (*COMMIT) and (*MARK) -are considered at every possible starting position in the subject string. If -PCRE_NO_START_OPTIMIZE is set at compile time, it cannot be unset at matching -time. The use of PCRE_NO_START_OPTIMIZE at matching time (that is, passing it -to \fBpcre_exec()\fP) disables JIT execution; in this situation, matching is -always done using interpretively. -.P -Setting PCRE_NO_START_OPTIMIZE can change the outcome of a matching operation. -Consider the pattern -.sp - (*COMMIT)ABC -.sp -When this is compiled, PCRE records the fact that a match must start with the -character "A". Suppose the subject string is "DEFABC". The start-up -optimization scans along the subject, finds "A" and runs the first match -attempt from there. The (*COMMIT) item means that the pattern must match the -current starting position, which in this case, it does. However, if the same -match is run with PCRE_NO_START_OPTIMIZE set, the initial scan along the -subject string does not happen. The first match attempt is run starting from -"D" and when this fails, (*COMMIT) prevents any further matches being tried, so -the overall result is "no match". If the pattern is studied, more start-up -optimizations may be used. For example, a minimum length for the subject may be -recorded. Consider the pattern -.sp - (*MARK:A)(X|Y) -.sp -The minimum length for a match is one character. If the subject is "ABC", there -will be attempts to match "ABC", "BC", "C", and then finally an empty string. -If the pattern is studied, the final attempt does not take place, because PCRE -knows that the subject is too short, and so the (*MARK) is never encountered. -In this case, studying the pattern does not affect the overall match result, -which is still "no match", but it does affect the auxiliary information that is -returned. -.sp - PCRE_NO_UTF8_CHECK -.sp -When PCRE_UTF8 is set at compile time, the validity of the subject as a UTF-8 -string is automatically checked when \fBpcre_exec()\fP is subsequently called. -The entire string is checked before any other processing takes place. The value -of \fIstartoffset\fP is also checked to ensure that it points to the start of a -UTF-8 character. There is a discussion about the -.\" HTML -.\" -validity of UTF-8 strings -.\" -in the -.\" HREF -\fBpcreunicode\fP -.\" -page. If an invalid sequence of bytes is found, \fBpcre_exec()\fP returns the -error PCRE_ERROR_BADUTF8 or, if PCRE_PARTIAL_HARD is set and the problem is a -truncated character at the end of the subject, PCRE_ERROR_SHORTUTF8. In both -cases, information about the precise nature of the error may also be returned -(see the descriptions of these errors in the section entitled \fIError return -values from\fP \fBpcre_exec()\fP -.\" HTML -.\" -below). -.\" -If \fIstartoffset\fP contains a value that does not point to the start of a -UTF-8 character (or to the end of the subject), PCRE_ERROR_BADUTF8_OFFSET is -returned. -.P -If you already know that your subject is valid, and you want to skip these -checks for performance reasons, you can set the PCRE_NO_UTF8_CHECK option when -calling \fBpcre_exec()\fP. You might want to do this for the second and -subsequent calls to \fBpcre_exec()\fP if you are making repeated calls to find -all the matches in a single subject string. However, you should be sure that -the value of \fIstartoffset\fP points to the start of a character (or the end -of the subject). When PCRE_NO_UTF8_CHECK is set, the effect of passing an -invalid string as a subject or an invalid value of \fIstartoffset\fP is -undefined. Your program may crash or loop. -.sp - PCRE_PARTIAL_HARD - PCRE_PARTIAL_SOFT -.sp -These options turn on the partial matching feature. For backwards -compatibility, PCRE_PARTIAL is a synonym for PCRE_PARTIAL_SOFT. A partial match -occurs if the end of the subject string is reached successfully, but there are -not enough subject characters to complete the match. If this happens when -PCRE_PARTIAL_SOFT (but not PCRE_PARTIAL_HARD) is set, matching continues by -testing any remaining alternatives. Only if no complete match can be found is -PCRE_ERROR_PARTIAL returned instead of PCRE_ERROR_NOMATCH. In other words, -PCRE_PARTIAL_SOFT says that the caller is prepared to handle a partial match, -but only if no complete match can be found. -.P -If PCRE_PARTIAL_HARD is set, it overrides PCRE_PARTIAL_SOFT. In this case, if a -partial match is found, \fBpcre_exec()\fP immediately returns -PCRE_ERROR_PARTIAL, without considering any other alternatives. In other words, -when PCRE_PARTIAL_HARD is set, a partial match is considered to be more -important that an alternative complete match. -.P -In both cases, the portion of the string that was inspected when the partial -match was found is set as the first matching string. There is a more detailed -discussion of partial and multi-segment matching, with examples, in the -.\" HREF -\fBpcrepartial\fP -.\" -documentation. -. -. -.SS "The string to be matched by \fBpcre_exec()\fP" -.rs -.sp -The subject string is passed to \fBpcre_exec()\fP as a pointer in -\fIsubject\fP, a length in \fIlength\fP, and a starting offset in -\fIstartoffset\fP. The units for \fIlength\fP and \fIstartoffset\fP are bytes -for the 8-bit library, 16-bit data items for the 16-bit library, and 32-bit -data items for the 32-bit library. -.P -If \fIstartoffset\fP is negative or greater than the length of the subject, -\fBpcre_exec()\fP returns PCRE_ERROR_BADOFFSET. When the starting offset is -zero, the search for a match starts at the beginning of the subject, and this -is by far the most common case. In UTF-8 or UTF-16 mode, the offset must point -to the start of a character, or the end of the subject (in UTF-32 mode, one -data unit equals one character, so all offsets are valid). Unlike the pattern -string, the subject may contain binary zeroes. -.P -A non-zero starting offset is useful when searching for another match in the -same subject by calling \fBpcre_exec()\fP again after a previous success. -Setting \fIstartoffset\fP differs from just passing over a shortened string and -setting PCRE_NOTBOL in the case of a pattern that begins with any kind of -lookbehind. For example, consider the pattern -.sp - \eBiss\eB -.sp -which finds occurrences of "iss" in the middle of words. (\eB matches only if -the current position in the subject is not a word boundary.) When applied to -the string "Mississipi" the first call to \fBpcre_exec()\fP finds the first -occurrence. If \fBpcre_exec()\fP is called again with just the remainder of the -subject, namely "issipi", it does not match, because \eB is always false at the -start of the subject, which is deemed to be a word boundary. However, if -\fBpcre_exec()\fP is passed the entire string again, but with \fIstartoffset\fP -set to 4, it finds the second occurrence of "iss" because it is able to look -behind the starting point to discover that it is preceded by a letter. -.P -Finding all the matches in a subject is tricky when the pattern can match an -empty string. It is possible to emulate Perl's /g behaviour by first trying the -match again at the same offset, with the PCRE_NOTEMPTY_ATSTART and -PCRE_ANCHORED options, and then if that fails, advancing the starting offset -and trying an ordinary match again. There is some code that demonstrates how to -do this in the -.\" HREF -\fBpcredemo\fP -.\" -sample program. In the most general case, you have to check to see if the -newline convention recognizes CRLF as a newline, and if so, and the current -character is CR followed by LF, advance the starting offset by two characters -instead of one. -.P -If a non-zero starting offset is passed when the pattern is anchored, one -attempt to match at the given offset is made. This can only succeed if the -pattern does not require the match to be at the start of the subject. -. -. -.SS "How \fBpcre_exec()\fP returns captured substrings" -.rs -.sp -In general, a pattern matches a certain portion of the subject, and in -addition, further substrings from the subject may be picked out by parts of the -pattern. Following the usage in Jeffrey Friedl's book, this is called -"capturing" in what follows, and the phrase "capturing subpattern" is used for -a fragment of a pattern that picks out a substring. PCRE supports several other -kinds of parenthesized subpattern that do not cause substrings to be captured. -.P -Captured substrings are returned to the caller via a vector of integers whose -address is passed in \fIovector\fP. The number of elements in the vector is -passed in \fIovecsize\fP, which must be a non-negative number. \fBNote\fP: this -argument is NOT the size of \fIovector\fP in bytes. -.P -The first two-thirds of the vector is used to pass back captured substrings, -each substring using a pair of integers. The remaining third of the vector is -used as workspace by \fBpcre_exec()\fP while matching capturing subpatterns, -and is not available for passing back information. The number passed in -\fIovecsize\fP should always be a multiple of three. If it is not, it is -rounded down. -.P -When a match is successful, information about captured substrings is returned -in pairs of integers, starting at the beginning of \fIovector\fP, and -continuing up to two-thirds of its length at the most. The first element of -each pair is set to the offset of the first character in a substring, and the -second is set to the offset of the first character after the end of a -substring. These values are always data unit offsets, even in UTF mode. They -are byte offsets in the 8-bit library, 16-bit data item offsets in the 16-bit -library, and 32-bit data item offsets in the 32-bit library. \fBNote\fP: they -are not character counts. -.P -The first pair of integers, \fIovector[0]\fP and \fIovector[1]\fP, identify the -portion of the subject string matched by the entire pattern. The next pair is -used for the first capturing subpattern, and so on. The value returned by -\fBpcre_exec()\fP is one more than the highest numbered pair that has been set. -For example, if two substrings have been captured, the returned value is 3. If -there are no capturing subpatterns, the return value from a successful match is -1, indicating that just the first pair of offsets has been set. -.P -If a capturing subpattern is matched repeatedly, it is the last portion of the -string that it matched that is returned. -.P -If the vector is too small to hold all the captured substring offsets, it is -used as far as possible (up to two-thirds of its length), and the function -returns a value of zero. If neither the actual string matched nor any captured -substrings are of interest, \fBpcre_exec()\fP may be called with \fIovector\fP -passed as NULL and \fIovecsize\fP as zero. However, if the pattern contains -back references and the \fIovector\fP is not big enough to remember the related -substrings, PCRE has to get additional memory for use during matching. Thus it -is usually advisable to supply an \fIovector\fP of reasonable size. -.P -There are some cases where zero is returned (indicating vector overflow) when -in fact the vector is exactly the right size for the final match. For example, -consider the pattern -.sp - (a)(?:(b)c|bd) -.sp -If a vector of 6 elements (allowing for only 1 captured substring) is given -with subject string "abd", \fBpcre_exec()\fP will try to set the second -captured string, thereby recording a vector overflow, before failing to match -"c" and backing up to try the second alternative. The zero return, however, -does correctly indicate that the maximum number of slots (namely 2) have been -filled. In similar cases where there is temporary overflow, but the final -number of used slots is actually less than the maximum, a non-zero value is -returned. -.P -The \fBpcre_fullinfo()\fP function can be used to find out how many capturing -subpatterns there are in a compiled pattern. The smallest size for -\fIovector\fP that will allow for \fIn\fP captured substrings, in addition to -the offsets of the substring matched by the whole pattern, is (\fIn\fP+1)*3. -.P -It is possible for capturing subpattern number \fIn+1\fP to match some part of -the subject when subpattern \fIn\fP has not been used at all. For example, if -the string "abc" is matched against the pattern (a|(z))(bc) the return from the -function is 4, and subpatterns 1 and 3 are matched, but 2 is not. When this -happens, both values in the offset pairs corresponding to unused subpatterns -are set to -1. -.P -Offset values that correspond to unused subpatterns at the end of the -expression are also set to -1. For example, if the string "abc" is matched -against the pattern (abc)(x(yz)?)? subpatterns 2 and 3 are not matched. The -return from the function is 2, because the highest used capturing subpattern -number is 1, and the offsets for for the second and third capturing subpatterns -(assuming the vector is large enough, of course) are set to -1. -.P -\fBNote\fP: Elements in the first two-thirds of \fIovector\fP that do not -correspond to capturing parentheses in the pattern are never changed. That is, -if a pattern contains \fIn\fP capturing parentheses, no more than -\fIovector[0]\fP to \fIovector[2n+1]\fP are set by \fBpcre_exec()\fP. The other -elements (in the first two-thirds) retain whatever values they previously had. -.P -Some convenience functions are provided for extracting the captured substrings -as separate strings. These are described below. -. -. -.\" HTML -.SS "Error return values from \fBpcre_exec()\fP" -.rs -.sp -If \fBpcre_exec()\fP fails, it returns a negative number. The following are -defined in the header file: -.sp - PCRE_ERROR_NOMATCH (-1) -.sp -The subject string did not match the pattern. -.sp - PCRE_ERROR_NULL (-2) -.sp -Either \fIcode\fP or \fIsubject\fP was passed as NULL, or \fIovector\fP was -NULL and \fIovecsize\fP was not zero. -.sp - PCRE_ERROR_BADOPTION (-3) -.sp -An unrecognized bit was set in the \fIoptions\fP argument. -.sp - PCRE_ERROR_BADMAGIC (-4) -.sp -PCRE stores a 4-byte "magic number" at the start of the compiled code, to catch -the case when it is passed a junk pointer and to detect when a pattern that was -compiled in an environment of one endianness is run in an environment with the -other endianness. This is the error that PCRE gives when the magic number is -not present. -.sp - PCRE_ERROR_UNKNOWN_OPCODE (-5) -.sp -While running the pattern match, an unknown item was encountered in the -compiled pattern. This error could be caused by a bug in PCRE or by overwriting -of the compiled pattern. -.sp - PCRE_ERROR_NOMEMORY (-6) -.sp -If a pattern contains back references, but the \fIovector\fP that is passed to -\fBpcre_exec()\fP is not big enough to remember the referenced substrings, PCRE -gets a block of memory at the start of matching to use for this purpose. If the -call via \fBpcre_malloc()\fP fails, this error is given. The memory is -automatically freed at the end of matching. -.P -This error is also given if \fBpcre_stack_malloc()\fP fails in -\fBpcre_exec()\fP. This can happen only when PCRE has been compiled with -\fB--disable-stack-for-recursion\fP. -.sp - PCRE_ERROR_NOSUBSTRING (-7) -.sp -This error is used by the \fBpcre_copy_substring()\fP, -\fBpcre_get_substring()\fP, and \fBpcre_get_substring_list()\fP functions (see -below). It is never returned by \fBpcre_exec()\fP. -.sp - PCRE_ERROR_MATCHLIMIT (-8) -.sp -The backtracking limit, as specified by the \fImatch_limit\fP field in a -\fBpcre_extra\fP structure (or defaulted) was reached. See the description -above. -.sp - PCRE_ERROR_CALLOUT (-9) -.sp -This error is never generated by \fBpcre_exec()\fP itself. It is provided for -use by callout functions that want to yield a distinctive error code. See the -.\" HREF -\fBpcrecallout\fP -.\" -documentation for details. -.sp - PCRE_ERROR_BADUTF8 (-10) -.sp -A string that contains an invalid UTF-8 byte sequence was passed as a subject, -and the PCRE_NO_UTF8_CHECK option was not set. If the size of the output vector -(\fIovecsize\fP) is at least 2, the byte offset to the start of the the invalid -UTF-8 character is placed in the first element, and a reason code is placed in -the second element. The reason codes are listed in the -.\" HTML -.\" -following section. -.\" -For backward compatibility, if PCRE_PARTIAL_HARD is set and the problem is a -truncated UTF-8 character at the end of the subject (reason codes 1 to 5), -PCRE_ERROR_SHORTUTF8 is returned instead of PCRE_ERROR_BADUTF8. -.sp - PCRE_ERROR_BADUTF8_OFFSET (-11) -.sp -The UTF-8 byte sequence that was passed as a subject was checked and found to -be valid (the PCRE_NO_UTF8_CHECK option was not set), but the value of -\fIstartoffset\fP did not point to the beginning of a UTF-8 character or the -end of the subject. -.sp - PCRE_ERROR_PARTIAL (-12) -.sp -The subject string did not match, but it did match partially. See the -.\" HREF -\fBpcrepartial\fP -.\" -documentation for details of partial matching. -.sp - PCRE_ERROR_BADPARTIAL (-13) -.sp -This code is no longer in use. It was formerly returned when the PCRE_PARTIAL -option was used with a compiled pattern containing items that were not -supported for partial matching. From release 8.00 onwards, there are no -restrictions on partial matching. -.sp - PCRE_ERROR_INTERNAL (-14) -.sp -An unexpected internal error has occurred. This error could be caused by a bug -in PCRE or by overwriting of the compiled pattern. -.sp - PCRE_ERROR_BADCOUNT (-15) -.sp -This error is given if the value of the \fIovecsize\fP argument is negative. -.sp - PCRE_ERROR_RECURSIONLIMIT (-21) -.sp -The internal recursion limit, as specified by the \fImatch_limit_recursion\fP -field in a \fBpcre_extra\fP structure (or defaulted) was reached. See the -description above. -.sp - PCRE_ERROR_BADNEWLINE (-23) -.sp -An invalid combination of PCRE_NEWLINE_\fIxxx\fP options was given. -.sp - PCRE_ERROR_BADOFFSET (-24) -.sp -The value of \fIstartoffset\fP was negative or greater than the length of the -subject, that is, the value in \fIlength\fP. -.sp - PCRE_ERROR_SHORTUTF8 (-25) -.sp -This error is returned instead of PCRE_ERROR_BADUTF8 when the subject string -ends with a truncated UTF-8 character and the PCRE_PARTIAL_HARD option is set. -Information about the failure is returned as for PCRE_ERROR_BADUTF8. It is in -fact sufficient to detect this case, but this special error code for -PCRE_PARTIAL_HARD precedes the implementation of returned information; it is -retained for backwards compatibility. -.sp - PCRE_ERROR_RECURSELOOP (-26) -.sp -This error is returned when \fBpcre_exec()\fP detects a recursion loop within -the pattern. Specifically, it means that either the whole pattern or a -subpattern has been called recursively for the second time at the same position -in the subject string. Some simple patterns that might do this are detected and -faulted at compile time, but more complicated cases, in particular mutual -recursions between two different subpatterns, cannot be detected until run -time. -.sp - PCRE_ERROR_JIT_STACKLIMIT (-27) -.sp -This error is returned when a pattern that was successfully studied using a -JIT compile option is being matched, but the memory available for the -just-in-time processing stack is not large enough. See the -.\" HREF -\fBpcrejit\fP -.\" -documentation for more details. -.sp - PCRE_ERROR_BADMODE (-28) -.sp -This error is given if a pattern that was compiled by the 8-bit library is -passed to a 16-bit or 32-bit library function, or vice versa. -.sp - PCRE_ERROR_BADENDIANNESS (-29) -.sp -This error is given if a pattern that was compiled and saved is reloaded on a -host with different endianness. The utility function -\fBpcre_pattern_to_host_byte_order()\fP can be used to convert such a pattern -so that it runs on the new host. -.sp - PCRE_ERROR_JIT_BADOPTION -.sp -This error is returned when a pattern that was successfully studied using a JIT -compile option is being matched, but the matching mode (partial or complete -match) does not correspond to any JIT compilation mode. When the JIT fast path -function is used, this error may be also given for invalid options. See the -.\" HREF -\fBpcrejit\fP -.\" -documentation for more details. -.sp - PCRE_ERROR_BADLENGTH (-32) -.sp -This error is given if \fBpcre_exec()\fP is called with a negative value for -the \fIlength\fP argument. -.P -Error numbers -16 to -20, -22, and 30 are not used by \fBpcre_exec()\fP. -. -. -.\" HTML -.SS "Reason codes for invalid UTF-8 strings" -.rs -.sp -This section applies only to the 8-bit library. The corresponding information -for the 16-bit and 32-bit libraries is given in the -.\" HREF -\fBpcre16\fP -.\" -and -.\" HREF -\fBpcre32\fP -.\" -pages. -.P -When \fBpcre_exec()\fP returns either PCRE_ERROR_BADUTF8 or -PCRE_ERROR_SHORTUTF8, and the size of the output vector (\fIovecsize\fP) is at -least 2, the offset of the start of the invalid UTF-8 character is placed in -the first output vector element (\fIovector[0]\fP) and a reason code is placed -in the second element (\fIovector[1]\fP). The reason codes are given names in -the \fBpcre.h\fP header file: -.sp - PCRE_UTF8_ERR1 - PCRE_UTF8_ERR2 - PCRE_UTF8_ERR3 - PCRE_UTF8_ERR4 - PCRE_UTF8_ERR5 -.sp -The string ends with a truncated UTF-8 character; the code specifies how many -bytes are missing (1 to 5). Although RFC 3629 restricts UTF-8 characters to be -no longer than 4 bytes, the encoding scheme (originally defined by RFC 2279) -allows for up to 6 bytes, and this is checked first; hence the possibility of -4 or 5 missing bytes. -.sp - PCRE_UTF8_ERR6 - PCRE_UTF8_ERR7 - PCRE_UTF8_ERR8 - PCRE_UTF8_ERR9 - PCRE_UTF8_ERR10 -.sp -The two most significant bits of the 2nd, 3rd, 4th, 5th, or 6th byte of the -character do not have the binary value 0b10 (that is, either the most -significant bit is 0, or the next bit is 1). -.sp - PCRE_UTF8_ERR11 - PCRE_UTF8_ERR12 -.sp -A character that is valid by the RFC 2279 rules is either 5 or 6 bytes long; -these code points are excluded by RFC 3629. -.sp - PCRE_UTF8_ERR13 -.sp -A 4-byte character has a value greater than 0x10fff; these code points are -excluded by RFC 3629. -.sp - PCRE_UTF8_ERR14 -.sp -A 3-byte character has a value in the range 0xd800 to 0xdfff; this range of -code points are reserved by RFC 3629 for use with UTF-16, and so are excluded -from UTF-8. -.sp - PCRE_UTF8_ERR15 - PCRE_UTF8_ERR16 - PCRE_UTF8_ERR17 - PCRE_UTF8_ERR18 - PCRE_UTF8_ERR19 -.sp -A 2-, 3-, 4-, 5-, or 6-byte character is "overlong", that is, it codes for a -value that can be represented by fewer bytes, which is invalid. For example, -the two bytes 0xc0, 0xae give the value 0x2e, whose correct coding uses just -one byte. -.sp - PCRE_UTF8_ERR20 -.sp -The two most significant bits of the first byte of a character have the binary -value 0b10 (that is, the most significant bit is 1 and the second is 0). Such a -byte can only validly occur as the second or subsequent byte of a multi-byte -character. -.sp - PCRE_UTF8_ERR21 -.sp -The first byte of a character has the value 0xfe or 0xff. These values can -never occur in a valid UTF-8 string. -.sp - PCRE_UTF8_ERR22 -.sp -This error code was formerly used when the presence of a so-called -"non-character" caused an error. Unicode corrigendum #9 makes it clear that -such characters should not cause a string to be rejected, and so this code is -no longer in use and is never returned. -. -. -.SH "EXTRACTING CAPTURED SUBSTRINGS BY NUMBER" -.rs -.sp -.nf -.B int pcre_copy_substring(const char *\fIsubject\fP, int *\fIovector\fP, -.B " int \fIstringcount\fP, int \fIstringnumber\fP, char *\fIbuffer\fP," -.B " int \fIbuffersize\fP);" -.sp -.B int pcre_get_substring(const char *\fIsubject\fP, int *\fIovector\fP, -.B " int \fIstringcount\fP, int \fIstringnumber\fP," -.B " const char **\fIstringptr\fP);" -.sp -.B int pcre_get_substring_list(const char *\fIsubject\fP, -.B " int *\fIovector\fP, int \fIstringcount\fP, const char ***\fIlistptr\fP);" -.fi -.PP -Captured substrings can be accessed directly by using the offsets returned by -\fBpcre_exec()\fP in \fIovector\fP. For convenience, the functions -\fBpcre_copy_substring()\fP, \fBpcre_get_substring()\fP, and -\fBpcre_get_substring_list()\fP are provided for extracting captured substrings -as new, separate, zero-terminated strings. These functions identify substrings -by number. The next section describes functions for extracting named -substrings. -.P -A substring that contains a binary zero is correctly extracted and has a -further zero added on the end, but the result is not, of course, a C string. -However, you can process such a string by referring to the length that is -returned by \fBpcre_copy_substring()\fP and \fBpcre_get_substring()\fP. -Unfortunately, the interface to \fBpcre_get_substring_list()\fP is not adequate -for handling strings containing binary zeros, because the end of the final -string is not independently indicated. -.P -The first three arguments are the same for all three of these functions: -\fIsubject\fP is the subject string that has just been successfully matched, -\fIovector\fP is a pointer to the vector of integer offsets that was passed to -\fBpcre_exec()\fP, and \fIstringcount\fP is the number of substrings that were -captured by the match, including the substring that matched the entire regular -expression. This is the value returned by \fBpcre_exec()\fP if it is greater -than zero. If \fBpcre_exec()\fP returned zero, indicating that it ran out of -space in \fIovector\fP, the value passed as \fIstringcount\fP should be the -number of elements in the vector divided by three. -.P -The functions \fBpcre_copy_substring()\fP and \fBpcre_get_substring()\fP -extract a single substring, whose number is given as \fIstringnumber\fP. A -value of zero extracts the substring that matched the entire pattern, whereas -higher values extract the captured substrings. For \fBpcre_copy_substring()\fP, -the string is placed in \fIbuffer\fP, whose length is given by -\fIbuffersize\fP, while for \fBpcre_get_substring()\fP a new block of memory is -obtained via \fBpcre_malloc\fP, and its address is returned via -\fIstringptr\fP. The yield of the function is the length of the string, not -including the terminating zero, or one of these error codes: -.sp - PCRE_ERROR_NOMEMORY (-6) -.sp -The buffer was too small for \fBpcre_copy_substring()\fP, or the attempt to get -memory failed for \fBpcre_get_substring()\fP. -.sp - PCRE_ERROR_NOSUBSTRING (-7) -.sp -There is no substring whose number is \fIstringnumber\fP. -.P -The \fBpcre_get_substring_list()\fP function extracts all available substrings -and builds a list of pointers to them. All this is done in a single block of -memory that is obtained via \fBpcre_malloc\fP. The address of the memory block -is returned via \fIlistptr\fP, which is also the start of the list of string -pointers. The end of the list is marked by a NULL pointer. The yield of the -function is zero if all went well, or the error code -.sp - PCRE_ERROR_NOMEMORY (-6) -.sp -if the attempt to get the memory block failed. -.P -When any of these functions encounter a substring that is unset, which can -happen when capturing subpattern number \fIn+1\fP matches some part of the -subject, but subpattern \fIn\fP has not been used at all, they return an empty -string. This can be distinguished from a genuine zero-length substring by -inspecting the appropriate offset in \fIovector\fP, which is negative for unset -substrings. -.P -The two convenience functions \fBpcre_free_substring()\fP and -\fBpcre_free_substring_list()\fP can be used to free the memory returned by -a previous call of \fBpcre_get_substring()\fP or -\fBpcre_get_substring_list()\fP, respectively. They do nothing more than call -the function pointed to by \fBpcre_free\fP, which of course could be called -directly from a C program. However, PCRE is used in some situations where it is -linked via a special interface to another programming language that cannot use -\fBpcre_free\fP directly; it is for these cases that the functions are -provided. -. -. -.SH "EXTRACTING CAPTURED SUBSTRINGS BY NAME" -.rs -.sp -.nf -.B int pcre_get_stringnumber(const pcre *\fIcode\fP, -.B " const char *\fIname\fP);" -.sp -.B int pcre_copy_named_substring(const pcre *\fIcode\fP, -.B " const char *\fIsubject\fP, int *\fIovector\fP," -.B " int \fIstringcount\fP, const char *\fIstringname\fP," -.B " char *\fIbuffer\fP, int \fIbuffersize\fP);" -.sp -.B int pcre_get_named_substring(const pcre *\fIcode\fP, -.B " const char *\fIsubject\fP, int *\fIovector\fP," -.B " int \fIstringcount\fP, const char *\fIstringname\fP," -.B " const char **\fIstringptr\fP);" -.fi -.PP -To extract a substring by name, you first have to find associated number. -For example, for this pattern -.sp - (a+)b(?\ed+)... -.sp -the number of the subpattern called "xxx" is 2. If the name is known to be -unique (PCRE_DUPNAMES was not set), you can find the number from the name by -calling \fBpcre_get_stringnumber()\fP. The first argument is the compiled -pattern, and the second is the name. The yield of the function is the -subpattern number, or PCRE_ERROR_NOSUBSTRING (-7) if there is no subpattern of -that name. -.P -Given the number, you can extract the substring directly, or use one of the -functions described in the previous section. For convenience, there are also -two functions that do the whole job. -.P -Most of the arguments of \fBpcre_copy_named_substring()\fP and -\fBpcre_get_named_substring()\fP are the same as those for the similarly named -functions that extract by number. As these are described in the previous -section, they are not re-described here. There are just two differences: -.P -First, instead of a substring number, a substring name is given. Second, there -is an extra argument, given at the start, which is a pointer to the compiled -pattern. This is needed in order to gain access to the name-to-number -translation table. -.P -These functions call \fBpcre_get_stringnumber()\fP, and if it succeeds, they -then call \fBpcre_copy_substring()\fP or \fBpcre_get_substring()\fP, as -appropriate. \fBNOTE:\fP If PCRE_DUPNAMES is set and there are duplicate names, -the behaviour may not be what you want (see the next section). -.P -\fBWarning:\fP If the pattern uses the (?| feature to set up multiple -subpatterns with the same number, as described in the -.\" HTML -.\" -section on duplicate subpattern numbers -.\" -in the -.\" HREF -\fBpcrepattern\fP -.\" -page, you cannot use names to distinguish the different subpatterns, because -names are not included in the compiled code. The matching process uses only -numbers. For this reason, the use of different names for subpatterns of the -same number causes an error at compile time. -. -. -.SH "DUPLICATE SUBPATTERN NAMES" -.rs -.sp -.nf -.B int pcre_get_stringtable_entries(const pcre *\fIcode\fP, -.B " const char *\fIname\fP, char **\fIfirst\fP, char **\fIlast\fP);" -.fi -.PP -When a pattern is compiled with the PCRE_DUPNAMES option, names for subpatterns -are not required to be unique. (Duplicate names are always allowed for -subpatterns with the same number, created by using the (?| feature. Indeed, if -such subpatterns are named, they are required to use the same names.) -.P -Normally, patterns with duplicate names are such that in any one match, only -one of the named subpatterns participates. An example is shown in the -.\" HREF -\fBpcrepattern\fP -.\" -documentation. -.P -When duplicates are present, \fBpcre_copy_named_substring()\fP and -\fBpcre_get_named_substring()\fP return the first substring corresponding to -the given name that is set. If none are set, PCRE_ERROR_NOSUBSTRING (-7) is -returned; no data is returned. The \fBpcre_get_stringnumber()\fP function -returns one of the numbers that are associated with the name, but it is not -defined which it is. -.P -If you want to get full details of all captured substrings for a given name, -you must use the \fBpcre_get_stringtable_entries()\fP function. The first -argument is the compiled pattern, and the second is the name. The third and -fourth are pointers to variables which are updated by the function. After it -has run, they point to the first and last entries in the name-to-number table -for the given name. The function itself returns the length of each entry, or -PCRE_ERROR_NOSUBSTRING (-7) if there are none. The format of the table is -described above in the section entitled \fIInformation about a pattern\fP -.\" HTML -.\" -above. -.\" -Given all the relevant entries for the name, you can extract each of their -numbers, and hence the captured data, if any. -. -. -.SH "FINDING ALL POSSIBLE MATCHES" -.rs -.sp -The traditional matching function uses a similar algorithm to Perl, which stops -when it finds the first match, starting at a given point in the subject. If you -want to find all possible matches, or the longest possible match, consider -using the alternative matching function (see below) instead. If you cannot use -the alternative function, but still need to find all possible matches, you -can kludge it up by making use of the callout facility, which is described in -the -.\" HREF -\fBpcrecallout\fP -.\" -documentation. -.P -What you have to do is to insert a callout right at the end of the pattern. -When your callout function is called, extract and save the current matched -substring. Then return 1, which forces \fBpcre_exec()\fP to backtrack and try -other alternatives. Ultimately, when it runs out of matches, \fBpcre_exec()\fP -will yield PCRE_ERROR_NOMATCH. -. -. -.SH "OBTAINING AN ESTIMATE OF STACK USAGE" -.rs -.sp -Matching certain patterns using \fBpcre_exec()\fP can use a lot of process -stack, which in certain environments can be rather limited in size. Some users -find it helpful to have an estimate of the amount of stack that is used by -\fBpcre_exec()\fP, to help them set recursion limits, as described in the -.\" HREF -\fBpcrestack\fP -.\" -documentation. The estimate that is output by \fBpcretest\fP when called with -the \fB-m\fP and \fB-C\fP options is obtained by calling \fBpcre_exec\fP with -the values NULL, NULL, NULL, -999, and -999 for its first five arguments. -.P -Normally, if its first argument is NULL, \fBpcre_exec()\fP immediately returns -the negative error code PCRE_ERROR_NULL, but with this special combination of -arguments, it returns instead a negative number whose absolute value is the -approximate stack frame size in bytes. (A negative number is used so that it is -clear that no match has happened.) The value is approximate because in some -cases, recursive calls to \fBpcre_exec()\fP occur when there are one or two -additional variables on the stack. -.P -If PCRE has been compiled to use the heap instead of the stack for recursion, -the value returned is the size of each block that is obtained from the heap. -. -. -.\" HTML -.SH "MATCHING A PATTERN: THE ALTERNATIVE FUNCTION" -.rs -.sp -.nf -.B int pcre_dfa_exec(const pcre *\fIcode\fP, "const pcre_extra *\fIextra\fP," -.B " const char *\fIsubject\fP, int \fIlength\fP, int \fIstartoffset\fP," -.B " int \fIoptions\fP, int *\fIovector\fP, int \fIovecsize\fP," -.B " int *\fIworkspace\fP, int \fIwscount\fP);" -.fi -.P -The function \fBpcre_dfa_exec()\fP is called to match a subject string against -a compiled pattern, using a matching algorithm that scans the subject string -just once, and does not backtrack. This has different characteristics to the -normal algorithm, and is not compatible with Perl. Some of the features of PCRE -patterns are not supported. Nevertheless, there are times when this kind of -matching can be useful. For a discussion of the two matching algorithms, and a -list of features that \fBpcre_dfa_exec()\fP does not support, see the -.\" HREF -\fBpcrematching\fP -.\" -documentation. -.P -The arguments for the \fBpcre_dfa_exec()\fP function are the same as for -\fBpcre_exec()\fP, plus two extras. The \fIovector\fP argument is used in a -different way, and this is described below. The other common arguments are used -in the same way as for \fBpcre_exec()\fP, so their description is not repeated -here. -.P -The two additional arguments provide workspace for the function. The workspace -vector should contain at least 20 elements. It is used for keeping track of -multiple paths through the pattern tree. More workspace will be needed for -patterns and subjects where there are a lot of potential matches. -.P -Here is an example of a simple call to \fBpcre_dfa_exec()\fP: -.sp - int rc; - int ovector[10]; - int wspace[20]; - rc = pcre_dfa_exec( - re, /* result of pcre_compile() */ - NULL, /* we didn't study the pattern */ - "some string", /* the subject string */ - 11, /* the length of the subject string */ - 0, /* start at offset 0 in the subject */ - 0, /* default options */ - ovector, /* vector of integers for substring information */ - 10, /* number of elements (NOT size in bytes) */ - wspace, /* working space vector */ - 20); /* number of elements (NOT size in bytes) */ -. -.SS "Option bits for \fBpcre_dfa_exec()\fP" -.rs -.sp -The unused bits of the \fIoptions\fP argument for \fBpcre_dfa_exec()\fP must be -zero. The only bits that may be set are PCRE_ANCHORED, PCRE_NEWLINE_\fIxxx\fP, -PCRE_NOTBOL, PCRE_NOTEOL, PCRE_NOTEMPTY, PCRE_NOTEMPTY_ATSTART, -PCRE_NO_UTF8_CHECK, PCRE_BSR_ANYCRLF, PCRE_BSR_UNICODE, PCRE_NO_START_OPTIMIZE, -PCRE_PARTIAL_HARD, PCRE_PARTIAL_SOFT, PCRE_DFA_SHORTEST, and PCRE_DFA_RESTART. -All but the last four of these are exactly the same as for \fBpcre_exec()\fP, -so their description is not repeated here. -.sp - PCRE_PARTIAL_HARD - PCRE_PARTIAL_SOFT -.sp -These have the same general effect as they do for \fBpcre_exec()\fP, but the -details are slightly different. When PCRE_PARTIAL_HARD is set for -\fBpcre_dfa_exec()\fP, it returns PCRE_ERROR_PARTIAL if the end of the subject -is reached and there is still at least one matching possibility that requires -additional characters. This happens even if some complete matches have also -been found. When PCRE_PARTIAL_SOFT is set, the return code PCRE_ERROR_NOMATCH -is converted into PCRE_ERROR_PARTIAL if the end of the subject is reached, -there have been no complete matches, but there is still at least one matching -possibility. The portion of the string that was inspected when the longest -partial match was found is set as the first matching string in both cases. -There is a more detailed discussion of partial and multi-segment matching, with -examples, in the -.\" HREF -\fBpcrepartial\fP -.\" -documentation. -.sp - PCRE_DFA_SHORTEST -.sp -Setting the PCRE_DFA_SHORTEST option causes the matching algorithm to stop as -soon as it has found one match. Because of the way the alternative algorithm -works, this is necessarily the shortest possible match at the first possible -matching point in the subject string. -.sp - PCRE_DFA_RESTART -.sp -When \fBpcre_dfa_exec()\fP returns a partial match, it is possible to call it -again, with additional subject characters, and have it continue with the same -match. The PCRE_DFA_RESTART option requests this action; when it is set, the -\fIworkspace\fP and \fIwscount\fP options must reference the same vector as -before because data about the match so far is left in them after a partial -match. There is more discussion of this facility in the -.\" HREF -\fBpcrepartial\fP -.\" -documentation. -. -. -.SS "Successful returns from \fBpcre_dfa_exec()\fP" -.rs -.sp -When \fBpcre_dfa_exec()\fP succeeds, it may have matched more than one -substring in the subject. Note, however, that all the matches from one run of -the function start at the same point in the subject. The shorter matches are -all initial substrings of the longer matches. For example, if the pattern -.sp - <.*> -.sp -is matched against the string -.sp - This is no more -.sp -the three matched strings are -.sp - - - -.sp -On success, the yield of the function is a number greater than zero, which is -the number of matched substrings. The substrings themselves are returned in -\fIovector\fP. Each string uses two elements; the first is the offset to the -start, and the second is the offset to the end. In fact, all the strings have -the same start offset. (Space could have been saved by giving this only once, -but it was decided to retain some compatibility with the way \fBpcre_exec()\fP -returns data, even though the meaning of the strings is different.) -.P -The strings are returned in reverse order of length; that is, the longest -matching string is given first. If there were too many matches to fit into -\fIovector\fP, the yield of the function is zero, and the vector is filled with -the longest matches. Unlike \fBpcre_exec()\fP, \fBpcre_dfa_exec()\fP can use -the entire \fIovector\fP for returning matched strings. -.P -NOTE: PCRE's "auto-possessification" optimization usually applies to character -repeats at the end of a pattern (as well as internally). For example, the -pattern "a\ed+" is compiled as if it were "a\ed++" because there is no point -even considering the possibility of backtracking into the repeated digits. For -DFA matching, this means that only one possible match is found. If you really -do want multiple matches in such cases, either use an ungreedy repeat -("a\ed+?") or set the PCRE_NO_AUTO_POSSESS option when compiling. -. -. -.SS "Error returns from \fBpcre_dfa_exec()\fP" -.rs -.sp -The \fBpcre_dfa_exec()\fP function returns a negative number when it fails. -Many of the errors are the same as for \fBpcre_exec()\fP, and these are -described -.\" HTML -.\" -above. -.\" -There are in addition the following errors that are specific to -\fBpcre_dfa_exec()\fP: -.sp - PCRE_ERROR_DFA_UITEM (-16) -.sp -This return is given if \fBpcre_dfa_exec()\fP encounters an item in the pattern -that it does not support, for instance, the use of \eC or a back reference. -.sp - PCRE_ERROR_DFA_UCOND (-17) -.sp -This return is given if \fBpcre_dfa_exec()\fP encounters a condition item that -uses a back reference for the condition, or a test for recursion in a specific -group. These are not supported. -.sp - PCRE_ERROR_DFA_UMLIMIT (-18) -.sp -This return is given if \fBpcre_dfa_exec()\fP is called with an \fIextra\fP -block that contains a setting of the \fImatch_limit\fP or -\fImatch_limit_recursion\fP fields. This is not supported (these fields are -meaningless for DFA matching). -.sp - PCRE_ERROR_DFA_WSSIZE (-19) -.sp -This return is given if \fBpcre_dfa_exec()\fP runs out of space in the -\fIworkspace\fP vector. -.sp - PCRE_ERROR_DFA_RECURSE (-20) -.sp -When a recursive subpattern is processed, the matching function calls itself -recursively, using private vectors for \fIovector\fP and \fIworkspace\fP. This -error is given if the output vector is not large enough. This should be -extremely rare, as a vector of size 1000 is used. -.sp - PCRE_ERROR_DFA_BADRESTART (-30) -.sp -When \fBpcre_dfa_exec()\fP is called with the \fBPCRE_DFA_RESTART\fP option, -some plausibility checks are made on the contents of the workspace, which -should contain data about the previous partial match. If any of these checks -fail, this error is given. -. -. -.SH "SEE ALSO" -.rs -.sp -\fBpcre16\fP(3), \fBpcre32\fP(3), \fBpcrebuild\fP(3), \fBpcrecallout\fP(3), -\fBpcrecpp(3)\fP(3), \fBpcrematching\fP(3), \fBpcrepartial\fP(3), -\fBpcreposix\fP(3), \fBpcreprecompile\fP(3), \fBpcresample\fP(3), -\fBpcrestack\fP(3). -. -. -.SH AUTHOR -.rs -.sp -.nf -Philip Hazel -University Computing Service -Cambridge CB2 3QH, England. -.fi -. -. -.SH REVISION -.rs -.sp -.nf -Last updated: 18 December 2015 -Copyright (c) 1997-2015 University of Cambridge. -.fi diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcrebuild.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcrebuild.3 deleted file mode 100644 index 403f2ae3..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcrebuild.3 +++ /dev/null @@ -1,550 +0,0 @@ -.TH PCREBUILD 3 "12 May 2013" "PCRE 8.33" -.SH NAME -PCRE - Perl-compatible regular expressions -. -. -.SH "BUILDING PCRE" -.rs -.sp -PCRE is distributed with a \fBconfigure\fP script that can be used to build the -library in Unix-like environments using the applications known as Autotools. -Also in the distribution are files to support building using \fBCMake\fP -instead of \fBconfigure\fP. The text file -.\" HTML -.\" -\fBREADME\fP -.\" -contains general information about building with Autotools (some of which is -repeated below), and also has some comments about building on various operating -systems. There is a lot more information about building PCRE without using -Autotools (including information about using \fBCMake\fP and building "by -hand") in the text file called -.\" HTML -.\" -\fBNON-AUTOTOOLS-BUILD\fP. -.\" -You should consult this file as well as the -.\" HTML -.\" -\fBREADME\fP -.\" -file if you are building in a non-Unix-like environment. -. -. -.SH "PCRE BUILD-TIME OPTIONS" -.rs -.sp -The rest of this document describes the optional features of PCRE that can be -selected when the library is compiled. It assumes use of the \fBconfigure\fP -script, where the optional features are selected or deselected by providing -options to \fBconfigure\fP before running the \fBmake\fP command. However, the -same options can be selected in both Unix-like and non-Unix-like environments -using the GUI facility of \fBcmake-gui\fP if you are using \fBCMake\fP instead -of \fBconfigure\fP to build PCRE. -.P -If you are not using Autotools or \fBCMake\fP, option selection can be done by -editing the \fBconfig.h\fP file, or by passing parameter settings to the -compiler, as described in -.\" HTML -.\" -\fBNON-AUTOTOOLS-BUILD\fP. -.\" -.P -The complete list of options for \fBconfigure\fP (which includes the standard -ones such as the selection of the installation directory) can be obtained by -running -.sp - ./configure --help -.sp -The following sections include descriptions of options whose names begin with ---enable or --disable. These settings specify changes to the defaults for the -\fBconfigure\fP command. Because of the way that \fBconfigure\fP works, ---enable and --disable always come in pairs, so the complementary option always -exists as well, but as it specifies the default, it is not described. -. -. -.SH "BUILDING 8-BIT, 16-BIT AND 32-BIT LIBRARIES" -.rs -.sp -By default, a library called \fBlibpcre\fP is built, containing functions that -take string arguments contained in vectors of bytes, either as single-byte -characters, or interpreted as UTF-8 strings. You can also build a separate -library, called \fBlibpcre16\fP, in which strings are contained in vectors of -16-bit data units and interpreted either as single-unit characters or UTF-16 -strings, by adding -.sp - --enable-pcre16 -.sp -to the \fBconfigure\fP command. You can also build yet another separate -library, called \fBlibpcre32\fP, in which strings are contained in vectors of -32-bit data units and interpreted either as single-unit characters or UTF-32 -strings, by adding -.sp - --enable-pcre32 -.sp -to the \fBconfigure\fP command. If you do not want the 8-bit library, add -.sp - --disable-pcre8 -.sp -as well. At least one of the three libraries must be built. Note that the C++ -and POSIX wrappers are for the 8-bit library only, and that \fBpcregrep\fP is -an 8-bit program. None of these are built if you select only the 16-bit or -32-bit libraries. -. -. -.SH "BUILDING SHARED AND STATIC LIBRARIES" -.rs -.sp -The Autotools PCRE building process uses \fBlibtool\fP to build both shared and -static libraries by default. You can suppress one of these by adding one of -.sp - --disable-shared - --disable-static -.sp -to the \fBconfigure\fP command, as required. -. -. -.SH "C++ SUPPORT" -.rs -.sp -By default, if the 8-bit library is being built, the \fBconfigure\fP script -will search for a C++ compiler and C++ header files. If it finds them, it -automatically builds the C++ wrapper library (which supports only 8-bit -strings). You can disable this by adding -.sp - --disable-cpp -.sp -to the \fBconfigure\fP command. -. -. -.SH "UTF-8, UTF-16 AND UTF-32 SUPPORT" -.rs -.sp -To build PCRE with support for UTF Unicode character strings, add -.sp - --enable-utf -.sp -to the \fBconfigure\fP command. This setting applies to all three libraries, -adding support for UTF-8 to the 8-bit library, support for UTF-16 to the 16-bit -library, and support for UTF-32 to the to the 32-bit library. There are no -separate options for enabling UTF-8, UTF-16 and UTF-32 independently because -that would allow ridiculous settings such as requesting UTF-16 support while -building only the 8-bit library. It is not possible to build one library with -UTF support and another without in the same configuration. (For backwards -compatibility, --enable-utf8 is a synonym of --enable-utf.) -.P -Of itself, this setting does not make PCRE treat strings as UTF-8, UTF-16 or -UTF-32. As well as compiling PCRE with this option, you also have have to set -the PCRE_UTF8, PCRE_UTF16 or PCRE_UTF32 option (as appropriate) when you call -one of the pattern compiling functions. -.P -If you set --enable-utf when compiling in an EBCDIC environment, PCRE expects -its input to be either ASCII or UTF-8 (depending on the run-time option). It is -not possible to support both EBCDIC and UTF-8 codes in the same version of the -library. Consequently, --enable-utf and --enable-ebcdic are mutually -exclusive. -. -. -.SH "UNICODE CHARACTER PROPERTY SUPPORT" -.rs -.sp -UTF support allows the libraries to process character codepoints up to 0x10ffff -in the strings that they handle. On its own, however, it does not provide any -facilities for accessing the properties of such characters. If you want to be -able to use the pattern escapes \eP, \ep, and \eX, which refer to Unicode -character properties, you must add -.sp - --enable-unicode-properties -.sp -to the \fBconfigure\fP command. This implies UTF support, even if you have -not explicitly requested it. -.P -Including Unicode property support adds around 30K of tables to the PCRE -library. Only the general category properties such as \fILu\fP and \fINd\fP are -supported. Details are given in the -.\" HREF -\fBpcrepattern\fP -.\" -documentation. -. -. -.SH "JUST-IN-TIME COMPILER SUPPORT" -.rs -.sp -Just-in-time compiler support is included in the build by specifying -.sp - --enable-jit -.sp -This support is available only for certain hardware architectures. If this -option is set for an unsupported architecture, a compile time error occurs. -See the -.\" HREF -\fBpcrejit\fP -.\" -documentation for a discussion of JIT usage. When JIT support is enabled, -pcregrep automatically makes use of it, unless you add -.sp - --disable-pcregrep-jit -.sp -to the "configure" command. -. -. -.SH "CODE VALUE OF NEWLINE" -.rs -.sp -By default, PCRE interprets the linefeed (LF) character as indicating the end -of a line. This is the normal newline character on Unix-like systems. You can -compile PCRE to use carriage return (CR) instead, by adding -.sp - --enable-newline-is-cr -.sp -to the \fBconfigure\fP command. There is also a --enable-newline-is-lf option, -which explicitly specifies linefeed as the newline character. -.sp -Alternatively, you can specify that line endings are to be indicated by the two -character sequence CRLF. If you want this, add -.sp - --enable-newline-is-crlf -.sp -to the \fBconfigure\fP command. There is a fourth option, specified by -.sp - --enable-newline-is-anycrlf -.sp -which causes PCRE to recognize any of the three sequences CR, LF, or CRLF as -indicating a line ending. Finally, a fifth option, specified by -.sp - --enable-newline-is-any -.sp -causes PCRE to recognize any Unicode newline sequence. -.P -Whatever line ending convention is selected when PCRE is built can be -overridden when the library functions are called. At build time it is -conventional to use the standard for your operating system. -. -. -.SH "WHAT \eR MATCHES" -.rs -.sp -By default, the sequence \eR in a pattern matches any Unicode newline sequence, -whatever has been selected as the line ending sequence. If you specify -.sp - --enable-bsr-anycrlf -.sp -the default is changed so that \eR matches only CR, LF, or CRLF. Whatever is -selected when PCRE is built can be overridden when the library functions are -called. -. -. -.SH "POSIX MALLOC USAGE" -.rs -.sp -When the 8-bit library is called through the POSIX interface (see the -.\" HREF -\fBpcreposix\fP -.\" -documentation), additional working storage is required for holding the pointers -to capturing substrings, because PCRE requires three integers per substring, -whereas the POSIX interface provides only two. If the number of expected -substrings is small, the wrapper function uses space on the stack, because this -is faster than using \fBmalloc()\fP for each call. The default threshold above -which the stack is no longer used is 10; it can be changed by adding a setting -such as -.sp - --with-posix-malloc-threshold=20 -.sp -to the \fBconfigure\fP command. -. -. -.SH "HANDLING VERY LARGE PATTERNS" -.rs -.sp -Within a compiled pattern, offset values are used to point from one part to -another (for example, from an opening parenthesis to an alternation -metacharacter). By default, in the 8-bit and 16-bit libraries, two-byte values -are used for these offsets, leading to a maximum size for a compiled pattern of -around 64K. This is sufficient to handle all but the most gigantic patterns. -Nevertheless, some people do want to process truly enormous patterns, so it is -possible to compile PCRE to use three-byte or four-byte offsets by adding a -setting such as -.sp - --with-link-size=3 -.sp -to the \fBconfigure\fP command. The value given must be 2, 3, or 4. For the -16-bit library, a value of 3 is rounded up to 4. In these libraries, using -longer offsets slows down the operation of PCRE because it has to load -additional data when handling them. For the 32-bit library the value is always -4 and cannot be overridden; the value of --with-link-size is ignored. -. -. -.SH "AVOIDING EXCESSIVE STACK USAGE" -.rs -.sp -When matching with the \fBpcre_exec()\fP function, PCRE implements backtracking -by making recursive calls to an internal function called \fBmatch()\fP. In -environments where the size of the stack is limited, this can severely limit -PCRE's operation. (The Unix environment does not usually suffer from this -problem, but it may sometimes be necessary to increase the maximum stack size. -There is a discussion in the -.\" HREF -\fBpcrestack\fP -.\" -documentation.) An alternative approach to recursion that uses memory from the -heap to remember data, instead of using recursive function calls, has been -implemented to work round the problem of limited stack size. If you want to -build a version of PCRE that works this way, add -.sp - --disable-stack-for-recursion -.sp -to the \fBconfigure\fP command. With this configuration, PCRE will use the -\fBpcre_stack_malloc\fP and \fBpcre_stack_free\fP variables to call memory -management functions. By default these point to \fBmalloc()\fP and -\fBfree()\fP, but you can replace the pointers so that your own functions are -used instead. -.P -Separate functions are provided rather than using \fBpcre_malloc\fP and -\fBpcre_free\fP because the usage is very predictable: the block sizes -requested are always the same, and the blocks are always freed in reverse -order. A calling program might be able to implement optimized functions that -perform better than \fBmalloc()\fP and \fBfree()\fP. PCRE runs noticeably more -slowly when built in this way. This option affects only the \fBpcre_exec()\fP -function; it is not relevant for \fBpcre_dfa_exec()\fP. -. -. -.SH "LIMITING PCRE RESOURCE USAGE" -.rs -.sp -Internally, PCRE has a function called \fBmatch()\fP, which it calls repeatedly -(sometimes recursively) when matching a pattern with the \fBpcre_exec()\fP -function. By controlling the maximum number of times this function may be -called during a single matching operation, a limit can be placed on the -resources used by a single call to \fBpcre_exec()\fP. The limit can be changed -at run time, as described in the -.\" HREF -\fBpcreapi\fP -.\" -documentation. The default is 10 million, but this can be changed by adding a -setting such as -.sp - --with-match-limit=500000 -.sp -to the \fBconfigure\fP command. This setting has no effect on the -\fBpcre_dfa_exec()\fP matching function. -.P -In some environments it is desirable to limit the depth of recursive calls of -\fBmatch()\fP more strictly than the total number of calls, in order to -restrict the maximum amount of stack (or heap, if --disable-stack-for-recursion -is specified) that is used. A second limit controls this; it defaults to the -value that is set for --with-match-limit, which imposes no additional -constraints. However, you can set a lower limit by adding, for example, -.sp - --with-match-limit-recursion=10000 -.sp -to the \fBconfigure\fP command. This value can also be overridden at run time. -. -. -.SH "CREATING CHARACTER TABLES AT BUILD TIME" -.rs -.sp -PCRE uses fixed tables for processing characters whose code values are less -than 256. By default, PCRE is built with a set of tables that are distributed -in the file \fIpcre_chartables.c.dist\fP. These tables are for ASCII codes -only. If you add -.sp - --enable-rebuild-chartables -.sp -to the \fBconfigure\fP command, the distributed tables are no longer used. -Instead, a program called \fBdftables\fP is compiled and run. This outputs the -source for new set of tables, created in the default locale of your C run-time -system. (This method of replacing the tables does not work if you are cross -compiling, because \fBdftables\fP is run on the local host. If you need to -create alternative tables when cross compiling, you will have to do so "by -hand".) -. -. -.SH "USING EBCDIC CODE" -.rs -.sp -PCRE assumes by default that it will run in an environment where the character -code is ASCII (or Unicode, which is a superset of ASCII). This is the case for -most computer operating systems. PCRE can, however, be compiled to run in an -EBCDIC environment by adding -.sp - --enable-ebcdic -.sp -to the \fBconfigure\fP command. This setting implies ---enable-rebuild-chartables. You should only use it if you know that you are in -an EBCDIC environment (for example, an IBM mainframe operating system). The ---enable-ebcdic option is incompatible with --enable-utf. -.P -The EBCDIC character that corresponds to an ASCII LF is assumed to have the -value 0x15 by default. However, in some EBCDIC environments, 0x25 is used. In -such an environment you should use -.sp - --enable-ebcdic-nl25 -.sp -as well as, or instead of, --enable-ebcdic. The EBCDIC character for CR has the -same value as in ASCII, namely, 0x0d. Whichever of 0x15 and 0x25 is \fInot\fP -chosen as LF is made to correspond to the Unicode NEL character (which, in -Unicode, is 0x85). -.P -The options that select newline behaviour, such as --enable-newline-is-cr, -and equivalent run-time options, refer to these character values in an EBCDIC -environment. -. -. -.SH "PCREGREP OPTIONS FOR COMPRESSED FILE SUPPORT" -.rs -.sp -By default, \fBpcregrep\fP reads all files as plain text. You can build it so -that it recognizes files whose names end in \fB.gz\fP or \fB.bz2\fP, and reads -them with \fBlibz\fP or \fBlibbz2\fP, respectively, by adding one or both of -.sp - --enable-pcregrep-libz - --enable-pcregrep-libbz2 -.sp -to the \fBconfigure\fP command. These options naturally require that the -relevant libraries are installed on your system. Configuration will fail if -they are not. -. -. -.SH "PCREGREP BUFFER SIZE" -.rs -.sp -\fBpcregrep\fP uses an internal buffer to hold a "window" on the file it is -scanning, in order to be able to output "before" and "after" lines when it -finds a match. The size of the buffer is controlled by a parameter whose -default value is 20K. The buffer itself is three times this size, but because -of the way it is used for holding "before" lines, the longest line that is -guaranteed to be processable is the parameter size. You can change the default -parameter value by adding, for example, -.sp - --with-pcregrep-bufsize=50K -.sp -to the \fBconfigure\fP command. The caller of \fPpcregrep\fP can, however, -override this value by specifying a run-time option. -. -. -.SH "PCRETEST OPTION FOR LIBREADLINE SUPPORT" -.rs -.sp -If you add -.sp - --enable-pcretest-libreadline -.sp -to the \fBconfigure\fP command, \fBpcretest\fP is linked with the -\fBlibreadline\fP library, and when its input is from a terminal, it reads it -using the \fBreadline()\fP function. This provides line-editing and history -facilities. Note that \fBlibreadline\fP is GPL-licensed, so if you distribute a -binary of \fBpcretest\fP linked in this way, there may be licensing issues. -.P -Setting this option causes the \fB-lreadline\fP option to be added to the -\fBpcretest\fP build. In many operating environments with a sytem-installed -\fBlibreadline\fP this is sufficient. However, in some environments (e.g. -if an unmodified distribution version of readline is in use), some extra -configuration may be necessary. The INSTALL file for \fBlibreadline\fP says -this: -.sp - "Readline uses the termcap functions, but does not link with the - termcap or curses library itself, allowing applications which link - with readline the to choose an appropriate library." -.sp -If your environment has not been set up so that an appropriate library is -automatically included, you may need to add something like -.sp - LIBS="-ncurses" -.sp -immediately before the \fBconfigure\fP command. -. -. -.SH "DEBUGGING WITH VALGRIND SUPPORT" -.rs -.sp -By adding the -.sp - --enable-valgrind -.sp -option to to the \fBconfigure\fP command, PCRE will use valgrind annotations -to mark certain memory regions as unaddressable. This allows it to detect -invalid memory accesses, and is mostly useful for debugging PCRE itself. -. -. -.SH "CODE COVERAGE REPORTING" -.rs -.sp -If your C compiler is gcc, you can build a version of PCRE that can generate a -code coverage report for its test suite. To enable this, you must install -\fBlcov\fP version 1.6 or above. Then specify -.sp - --enable-coverage -.sp -to the \fBconfigure\fP command and build PCRE in the usual way. -.P -Note that using \fBccache\fP (a caching C compiler) is incompatible with code -coverage reporting. If you have configured \fBccache\fP to run automatically -on your system, you must set the environment variable -.sp - CCACHE_DISABLE=1 -.sp -before running \fBmake\fP to build PCRE, so that \fBccache\fP is not used. -.P -When --enable-coverage is used, the following addition targets are added to the -\fIMakefile\fP: -.sp - make coverage -.sp -This creates a fresh coverage report for the PCRE test suite. It is equivalent -to running "make coverage-reset", "make coverage-baseline", "make check", and -then "make coverage-report". -.sp - make coverage-reset -.sp -This zeroes the coverage counters, but does nothing else. -.sp - make coverage-baseline -.sp -This captures baseline coverage information. -.sp - make coverage-report -.sp -This creates the coverage report. -.sp - make coverage-clean-report -.sp -This removes the generated coverage report without cleaning the coverage data -itself. -.sp - make coverage-clean-data -.sp -This removes the captured coverage data without removing the coverage files -created at compile time (*.gcno). -.sp - make coverage-clean -.sp -This cleans all coverage data including the generated coverage report. For more -information about code coverage, see the \fBgcov\fP and \fBlcov\fP -documentation. -. -. -.SH "SEE ALSO" -.rs -.sp -\fBpcreapi\fP(3), \fBpcre16\fP, \fBpcre32\fP, \fBpcre_config\fP(3). -. -. -.SH AUTHOR -.rs -.sp -.nf -Philip Hazel -University Computing Service -Cambridge CB2 3QH, England. -.fi -. -. -.SH REVISION -.rs -.sp -.nf -Last updated: 12 May 2013 -Copyright (c) 1997-2013 University of Cambridge. -.fi diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcrecallout.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcrecallout.3 deleted file mode 100644 index 8ebc9959..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcrecallout.3 +++ /dev/null @@ -1,255 +0,0 @@ -.TH PCRECALLOUT 3 "12 November 2013" "PCRE 8.34" -.SH NAME -PCRE - Perl-compatible regular expressions -.SH SYNOPSIS -.rs -.sp -.B #include -.PP -.SM -.B int (*pcre_callout)(pcre_callout_block *); -.PP -.B int (*pcre16_callout)(pcre16_callout_block *); -.PP -.B int (*pcre32_callout)(pcre32_callout_block *); -. -.SH DESCRIPTION -.rs -.sp -PCRE provides a feature called "callout", which is a means of temporarily -passing control to the caller of PCRE in the middle of pattern matching. The -caller of PCRE provides an external function by putting its entry point in the -global variable \fIpcre_callout\fP (\fIpcre16_callout\fP for the 16-bit -library, \fIpcre32_callout\fP for the 32-bit library). By default, this -variable contains NULL, which disables all calling out. -.P -Within a regular expression, (?C) indicates the points at which the external -function is to be called. Different callout points can be identified by putting -a number less than 256 after the letter C. The default value is zero. -For example, this pattern has two callout points: -.sp - (?C1)abc(?C2)def -.sp -If the PCRE_AUTO_CALLOUT option bit is set when a pattern is compiled, PCRE -automatically inserts callouts, all with number 255, before each item in the -pattern. For example, if PCRE_AUTO_CALLOUT is used with the pattern -.sp - A(\ed{2}|--) -.sp -it is processed as if it were -.sp -(?C255)A(?C255)((?C255)\ed{2}(?C255)|(?C255)-(?C255)-(?C255))(?C255) -.sp -Notice that there is a callout before and after each parenthesis and -alternation bar. If the pattern contains a conditional group whose condition is -an assertion, an automatic callout is inserted immediately before the -condition. Such a callout may also be inserted explicitly, for example: -.sp - (?(?C9)(?=a)ab|de) -.sp -This applies only to assertion conditions (because they are themselves -independent groups). -.P -Automatic callouts can be used for tracking the progress of pattern matching. -The -.\" HREF -\fBpcretest\fP -.\" -program has a pattern qualifier (/C) that sets automatic callouts; when it is -used, the output indicates how the pattern is being matched. This is useful -information when you are trying to optimize the performance of a particular -pattern. -. -. -.SH "MISSING CALLOUTS" -.rs -.sp -You should be aware that, because of optimizations in the way PCRE compiles and -matches patterns, callouts sometimes do not happen exactly as you might expect. -.P -At compile time, PCRE "auto-possessifies" repeated items when it knows that -what follows cannot be part of the repeat. For example, a+[bc] is compiled as -if it were a++[bc]. The \fBpcretest\fP output when this pattern is anchored and -then applied with automatic callouts to the string "aaaa" is: -.sp - --->aaaa - +0 ^ ^ - +1 ^ a+ - +3 ^ ^ [bc] - No match -.sp -This indicates that when matching [bc] fails, there is no backtracking into a+ -and therefore the callouts that would be taken for the backtracks do not occur. -You can disable the auto-possessify feature by passing PCRE_NO_AUTO_POSSESS -to \fBpcre_compile()\fP, or starting the pattern with (*NO_AUTO_POSSESS). If -this is done in \fBpcretest\fP (using the /O qualifier), the output changes to -this: -.sp - --->aaaa - +0 ^ ^ - +1 ^ a+ - +3 ^ ^ [bc] - +3 ^ ^ [bc] - +3 ^ ^ [bc] - +3 ^^ [bc] - No match -.sp -This time, when matching [bc] fails, the matcher backtracks into a+ and tries -again, repeatedly, until a+ itself fails. -.P -Other optimizations that provide fast "no match" results also affect callouts. -For example, if the pattern is -.sp - ab(?C4)cd -.sp -PCRE knows that any matching string must contain the letter "d". If the subject -string is "abyz", the lack of "d" means that matching doesn't ever start, and -the callout is never reached. However, with "abyd", though the result is still -no match, the callout is obeyed. -.P -If the pattern is studied, PCRE knows the minimum length of a matching string, -and will immediately give a "no match" return without actually running a match -if the subject is not long enough, or, for unanchored patterns, if it has -been scanned far enough. -.P -You can disable these optimizations by passing the PCRE_NO_START_OPTIMIZE -option to the matching function, or by starting the pattern with -(*NO_START_OPT). This slows down the matching process, but does ensure that -callouts such as the example above are obeyed. -. -. -.SH "THE CALLOUT INTERFACE" -.rs -.sp -During matching, when PCRE reaches a callout point, the external function -defined by \fIpcre_callout\fP or \fIpcre[16|32]_callout\fP is called (if it is -set). This applies to both normal and DFA matching. The only argument to the -callout function is a pointer to a \fBpcre_callout\fP or -\fBpcre[16|32]_callout\fP block. These structures contains the following -fields: -.sp - int \fIversion\fP; - int \fIcallout_number\fP; - int *\fIoffset_vector\fP; - const char *\fIsubject\fP; (8-bit version) - PCRE_SPTR16 \fIsubject\fP; (16-bit version) - PCRE_SPTR32 \fIsubject\fP; (32-bit version) - int \fIsubject_length\fP; - int \fIstart_match\fP; - int \fIcurrent_position\fP; - int \fIcapture_top\fP; - int \fIcapture_last\fP; - void *\fIcallout_data\fP; - int \fIpattern_position\fP; - int \fInext_item_length\fP; - const unsigned char *\fImark\fP; (8-bit version) - const PCRE_UCHAR16 *\fImark\fP; (16-bit version) - const PCRE_UCHAR32 *\fImark\fP; (32-bit version) -.sp -The \fIversion\fP field is an integer containing the version number of the -block format. The initial version was 0; the current version is 2. The version -number will change again in future if additional fields are added, but the -intention is never to remove any of the existing fields. -.P -The \fIcallout_number\fP field contains the number of the callout, as compiled -into the pattern (that is, the number after ?C for manual callouts, and 255 for -automatically generated callouts). -.P -The \fIoffset_vector\fP field is a pointer to the vector of offsets that was -passed by the caller to the matching function. When \fBpcre_exec()\fP or -\fBpcre[16|32]_exec()\fP is used, the contents can be inspected, in order to -extract substrings that have been matched so far, in the same way as for -extracting substrings after a match has completed. For the DFA matching -functions, this field is not useful. -.P -The \fIsubject\fP and \fIsubject_length\fP fields contain copies of the values -that were passed to the matching function. -.P -The \fIstart_match\fP field normally contains the offset within the subject at -which the current match attempt started. However, if the escape sequence \eK -has been encountered, this value is changed to reflect the modified starting -point. If the pattern is not anchored, the callout function may be called -several times from the same point in the pattern for different starting points -in the subject. -.P -The \fIcurrent_position\fP field contains the offset within the subject of the -current match pointer. -.P -When the \fBpcre_exec()\fP or \fBpcre[16|32]_exec()\fP is used, the -\fIcapture_top\fP field contains one more than the number of the highest -numbered captured substring so far. If no substrings have been captured, the -value of \fIcapture_top\fP is one. This is always the case when the DFA -functions are used, because they do not support captured substrings. -.P -The \fIcapture_last\fP field contains the number of the most recently captured -substring. However, when a recursion exits, the value reverts to what it was -outside the recursion, as do the values of all captured substrings. If no -substrings have been captured, the value of \fIcapture_last\fP is -1. This is -always the case for the DFA matching functions. -.P -The \fIcallout_data\fP field contains a value that is passed to a matching -function specifically so that it can be passed back in callouts. It is passed -in the \fIcallout_data\fP field of a \fBpcre_extra\fP or \fBpcre[16|32]_extra\fP -data structure. If no such data was passed, the value of \fIcallout_data\fP in -a callout block is NULL. There is a description of the \fBpcre_extra\fP -structure in the -.\" HREF -\fBpcreapi\fP -.\" -documentation. -.P -The \fIpattern_position\fP field is present from version 1 of the callout -structure. It contains the offset to the next item to be matched in the pattern -string. -.P -The \fInext_item_length\fP field is present from version 1 of the callout -structure. It contains the length of the next item to be matched in the pattern -string. When the callout immediately precedes an alternation bar, a closing -parenthesis, or the end of the pattern, the length is zero. When the callout -precedes an opening parenthesis, the length is that of the entire subpattern. -.P -The \fIpattern_position\fP and \fInext_item_length\fP fields are intended to -help in distinguishing between different automatic callouts, which all have the -same callout number. However, they are set for all callouts. -.P -The \fImark\fP field is present from version 2 of the callout structure. In -callouts from \fBpcre_exec()\fP or \fBpcre[16|32]_exec()\fP it contains a -pointer to the zero-terminated name of the most recently passed (*MARK), -(*PRUNE), or (*THEN) item in the match, or NULL if no such items have been -passed. Instances of (*PRUNE) or (*THEN) without a name do not obliterate a -previous (*MARK). In callouts from the DFA matching functions this field always -contains NULL. -. -. -.SH "RETURN VALUES" -.rs -.sp -The external callout function returns an integer to PCRE. If the value is zero, -matching proceeds as normal. If the value is greater than zero, matching fails -at the current point, but the testing of other matching possibilities goes -ahead, just as if a lookahead assertion had failed. If the value is less than -zero, the match is abandoned, the matching function returns the negative value. -.P -Negative values should normally be chosen from the set of PCRE_ERROR_xxx -values. In particular, PCRE_ERROR_NOMATCH forces a standard "no match" failure. -The error number PCRE_ERROR_CALLOUT is reserved for use by callout functions; -it will never be used by PCRE itself. -. -. -.SH AUTHOR -.rs -.sp -.nf -Philip Hazel -University Computing Service -Cambridge CB2 3QH, England. -.fi -. -. -.SH REVISION -.rs -.sp -.nf -Last updated: 12 November 2013 -Copyright (c) 1997-2013 University of Cambridge. -.fi diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcrecompat.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcrecompat.3 deleted file mode 100644 index 6156e776..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcrecompat.3 +++ /dev/null @@ -1,200 +0,0 @@ -.TH PCRECOMPAT 3 "10 November 2013" "PCRE 8.34" -.SH NAME -PCRE - Perl-compatible regular expressions -.SH "DIFFERENCES BETWEEN PCRE AND PERL" -.rs -.sp -This document describes the differences in the ways that PCRE and Perl handle -regular expressions. The differences described here are with respect to Perl -versions 5.10 and above. -.P -1. PCRE has only a subset of Perl's Unicode support. Details of what it does -have are given in the -.\" HREF -\fBpcreunicode\fP -.\" -page. -.P -2. PCRE allows repeat quantifiers only on parenthesized assertions, but they do -not mean what you might think. For example, (?!a){3} does not assert that the -next three characters are not "a". It just asserts that the next character is -not "a" three times (in principle: PCRE optimizes this to run the assertion -just once). Perl allows repeat quantifiers on other assertions such as \eb, but -these do not seem to have any use. -.P -3. Capturing subpatterns that occur inside negative lookahead assertions are -counted, but their entries in the offsets vector are never set. Perl sometimes -(but not always) sets its numerical variables from inside negative assertions. -.P -4. Though binary zero characters are supported in the subject string, they are -not allowed in a pattern string because it is passed as a normal C string, -terminated by zero. The escape sequence \e0 can be used in the pattern to -represent a binary zero. -.P -5. The following Perl escape sequences are not supported: \el, \eu, \eL, -\eU, and \eN when followed by a character name or Unicode value. (\eN on its -own, matching a non-newline character, is supported.) In fact these are -implemented by Perl's general string-handling and are not part of its pattern -matching engine. If any of these are encountered by PCRE, an error is -generated by default. However, if the PCRE_JAVASCRIPT_COMPAT option is set, -\eU and \eu are interpreted as JavaScript interprets them. -.P -6. The Perl escape sequences \ep, \eP, and \eX are supported only if PCRE is -built with Unicode character property support. The properties that can be -tested with \ep and \eP are limited to the general category properties such as -Lu and Nd, script names such as Greek or Han, and the derived properties Any -and L&. PCRE does support the Cs (surrogate) property, which Perl does not; the -Perl documentation says "Because Perl hides the need for the user to understand -the internal representation of Unicode characters, there is no need to -implement the somewhat messy concept of surrogates." -.P -7. PCRE does support the \eQ...\eE escape for quoting substrings. Characters in -between are treated as literals. This is slightly different from Perl in that $ -and @ are also handled as literals inside the quotes. In Perl, they cause -variable interpolation (but of course PCRE does not have variables). Note the -following examples: -.sp - Pattern PCRE matches Perl matches -.sp -.\" JOIN - \eQabc$xyz\eE abc$xyz abc followed by the - contents of $xyz - \eQabc\e$xyz\eE abc\e$xyz abc\e$xyz - \eQabc\eE\e$\eQxyz\eE abc$xyz abc$xyz -.sp -The \eQ...\eE sequence is recognized both inside and outside character classes. -.P -8. Fairly obviously, PCRE does not support the (?{code}) and (??{code}) -constructions. However, there is support for recursive patterns. This is not -available in Perl 5.8, but it is in Perl 5.10. Also, the PCRE "callout" -feature allows an external function to be called during pattern matching. See -the -.\" HREF -\fBpcrecallout\fP -.\" -documentation for details. -.P -9. Subpatterns that are called as subroutines (whether or not recursively) are -always treated as atomic groups in PCRE. This is like Python, but unlike Perl. -Captured values that are set outside a subroutine call can be reference from -inside in PCRE, but not in Perl. There is a discussion that explains these -differences in more detail in the -.\" HTML -.\" -section on recursion differences from Perl -.\" -in the -.\" HREF -\fBpcrepattern\fP -.\" -page. -.P -10. If any of the backtracking control verbs are used in a subpattern that is -called as a subroutine (whether or not recursively), their effect is confined -to that subpattern; it does not extend to the surrounding pattern. This is not -always the case in Perl. In particular, if (*THEN) is present in a group that -is called as a subroutine, its action is limited to that group, even if the -group does not contain any | characters. Note that such subpatterns are -processed as anchored at the point where they are tested. -.P -11. If a pattern contains more than one backtracking control verb, the first -one that is backtracked onto acts. For example, in the pattern -A(*COMMIT)B(*PRUNE)C a failure in B triggers (*COMMIT), but a failure in C -triggers (*PRUNE). Perl's behaviour is more complex; in many cases it is the -same as PCRE, but there are examples where it differs. -.P -12. Most backtracking verbs in assertions have their normal actions. They are -not confined to the assertion. -.P -13. There are some differences that are concerned with the settings of captured -strings when part of a pattern is repeated. For example, matching "aba" against -the pattern /^(a(b)?)+$/ in Perl leaves $2 unset, but in PCRE it is set to "b". -.P -14. PCRE's handling of duplicate subpattern numbers and duplicate subpattern -names is not as general as Perl's. This is a consequence of the fact the PCRE -works internally just with numbers, using an external table to translate -between numbers and names. In particular, a pattern such as (?|(?A)|(?B), -where the two capturing parentheses have the same number but different names, -is not supported, and causes an error at compile time. If it were allowed, it -would not be possible to distinguish which parentheses matched, because both -names map to capturing subpattern number 1. To avoid this confusing situation, -an error is given at compile time. -.P -15. Perl recognizes comments in some places that PCRE does not, for example, -between the ( and ? at the start of a subpattern. If the /x modifier is set, -Perl allows white space between ( and ? (though current Perls warn that this is -deprecated) but PCRE never does, even if the PCRE_EXTENDED option is set. -.P -16. Perl, when in warning mode, gives warnings for character classes such as -[A-\ed] or [a-[:digit:]]. It then treats the hyphens as literals. PCRE has no -warning features, so it gives an error in these cases because they are almost -certainly user mistakes. -.P -17. In PCRE, the upper/lower case character properties Lu and Ll are not -affected when case-independent matching is specified. For example, \ep{Lu} -always matches an upper case letter. I think Perl has changed in this respect; -in the release at the time of writing (5.16), \ep{Lu} and \ep{Ll} match all -letters, regardless of case, when case independence is specified. -.P -18. PCRE provides some extensions to the Perl regular expression facilities. -Perl 5.10 includes new features that are not in earlier versions of Perl, some -of which (such as named parentheses) have been in PCRE for some time. This list -is with respect to Perl 5.10: -.sp -(a) Although lookbehind assertions in PCRE must match fixed length strings, -each alternative branch of a lookbehind assertion can match a different length -of string. Perl requires them all to have the same length. -.sp -(b) If PCRE_DOLLAR_ENDONLY is set and PCRE_MULTILINE is not set, the $ -meta-character matches only at the very end of the string. -.sp -(c) If PCRE_EXTRA is set, a backslash followed by a letter with no special -meaning is faulted. Otherwise, like Perl, the backslash is quietly ignored. -(Perl can be made to issue a warning.) -.sp -(d) If PCRE_UNGREEDY is set, the greediness of the repetition quantifiers is -inverted, that is, by default they are not greedy, but if followed by a -question mark they are. -.sp -(e) PCRE_ANCHORED can be used at matching time to force a pattern to be tried -only at the first matching position in the subject string. -.sp -(f) The PCRE_NOTBOL, PCRE_NOTEOL, PCRE_NOTEMPTY, PCRE_NOTEMPTY_ATSTART, and -PCRE_NO_AUTO_CAPTURE options for \fBpcre_exec()\fP have no Perl equivalents. -.sp -(g) The \eR escape sequence can be restricted to match only CR, LF, or CRLF -by the PCRE_BSR_ANYCRLF option. -.sp -(h) The callout facility is PCRE-specific. -.sp -(i) The partial matching facility is PCRE-specific. -.sp -(j) Patterns compiled by PCRE can be saved and re-used at a later time, even on -different hosts that have the other endianness. However, this does not apply to -optimized data created by the just-in-time compiler. -.sp -(k) The alternative matching functions (\fBpcre_dfa_exec()\fP, -\fBpcre16_dfa_exec()\fP and \fBpcre32_dfa_exec()\fP,) match in a different way -and are not Perl-compatible. -.sp -(l) PCRE recognizes some special sequences such as (*CR) at the start of -a pattern that set overall options that cannot be changed within the pattern. -. -. -.SH AUTHOR -.rs -.sp -.nf -Philip Hazel -University Computing Service -Cambridge CB2 3QH, England. -.fi -. -. -.SH REVISION -.rs -.sp -.nf -Last updated: 10 November 2013 -Copyright (c) 1997-2013 University of Cambridge. -.fi diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcrecpp.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcrecpp.3 deleted file mode 100644 index fbddd86a..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcrecpp.3 +++ /dev/null @@ -1,348 +0,0 @@ -.TH PCRECPP 3 "08 January 2012" "PCRE 8.30" -.SH NAME -PCRE - Perl-compatible regular expressions. -.SH "SYNOPSIS OF C++ WRAPPER" -.rs -.sp -.B #include -. -.SH DESCRIPTION -.rs -.sp -The C++ wrapper for PCRE was provided by Google Inc. Some additional -functionality was added by Giuseppe Maxia. This brief man page was constructed -from the notes in the \fIpcrecpp.h\fP file, which should be consulted for -further details. Note that the C++ wrapper supports only the original 8-bit -PCRE library. There is no 16-bit or 32-bit support at present. -. -. -.SH "MATCHING INTERFACE" -.rs -.sp -The "FullMatch" operation checks that supplied text matches a supplied pattern -exactly. If pointer arguments are supplied, it copies matched sub-strings that -match sub-patterns into them. -.sp - Example: successful match - pcrecpp::RE re("h.*o"); - re.FullMatch("hello"); -.sp - Example: unsuccessful match (requires full match): - pcrecpp::RE re("e"); - !re.FullMatch("hello"); -.sp - Example: creating a temporary RE object: - pcrecpp::RE("h.*o").FullMatch("hello"); -.sp -You can pass in a "const char*" or a "string" for "text". The examples below -tend to use a const char*. You can, as in the different examples above, store -the RE object explicitly in a variable or use a temporary RE object. The -examples below use one mode or the other arbitrarily. Either could correctly be -used for any of these examples. -.P -You must supply extra pointer arguments to extract matched subpieces. -.sp - Example: extracts "ruby" into "s" and 1234 into "i" - int i; - string s; - pcrecpp::RE re("(\e\ew+):(\e\ed+)"); - re.FullMatch("ruby:1234", &s, &i); -.sp - Example: does not try to extract any extra sub-patterns - re.FullMatch("ruby:1234", &s); -.sp - Example: does not try to extract into NULL - re.FullMatch("ruby:1234", NULL, &i); -.sp - Example: integer overflow causes failure - !re.FullMatch("ruby:1234567891234", NULL, &i); -.sp - Example: fails because there aren't enough sub-patterns: - !pcrecpp::RE("\e\ew+:\e\ed+").FullMatch("ruby:1234", &s); -.sp - Example: fails because string cannot be stored in integer - !pcrecpp::RE("(.*)").FullMatch("ruby", &i); -.sp -The provided pointer arguments can be pointers to any scalar numeric -type, or one of: -.sp - string (matched piece is copied to string) - StringPiece (StringPiece is mutated to point to matched piece) - T (where "bool T::ParseFrom(const char*, int)" exists) - NULL (the corresponding matched sub-pattern is not copied) -.sp -The function returns true iff all of the following conditions are satisfied: -.sp - a. "text" matches "pattern" exactly; -.sp - b. The number of matched sub-patterns is >= number of supplied - pointers; -.sp - c. The "i"th argument has a suitable type for holding the - string captured as the "i"th sub-pattern. If you pass in - void * NULL for the "i"th argument, or a non-void * NULL - of the correct type, or pass fewer arguments than the - number of sub-patterns, "i"th captured sub-pattern is - ignored. -.sp -CAVEAT: An optional sub-pattern that does not exist in the matched -string is assigned the empty string. Therefore, the following will -return false (because the empty string is not a valid number): -.sp - int number; - pcrecpp::RE::FullMatch("abc", "[a-z]+(\e\ed+)?", &number); -.sp -The matching interface supports at most 16 arguments per call. -If you need more, consider using the more general interface -\fBpcrecpp::RE::DoMatch\fP. See \fBpcrecpp.h\fP for the signature for -\fBDoMatch\fP. -.P -NOTE: Do not use \fBno_arg\fP, which is used internally to mark the end of a -list of optional arguments, as a placeholder for missing arguments, as this can -lead to segfaults. -. -. -.SH "QUOTING METACHARACTERS" -.rs -.sp -You can use the "QuoteMeta" operation to insert backslashes before all -potentially meaningful characters in a string. The returned string, used as a -regular expression, will exactly match the original string. -.sp - Example: - string quoted = RE::QuoteMeta(unquoted); -.sp -Note that it's legal to escape a character even if it has no special meaning in -a regular expression -- so this function does that. (This also makes it -identical to the perl function of the same name; see "perldoc -f quotemeta".) -For example, "1.5-2.0?" becomes "1\e.5\e-2\e.0\e?". -. -.SH "PARTIAL MATCHES" -.rs -.sp -You can use the "PartialMatch" operation when you want the pattern -to match any substring of the text. -.sp - Example: simple search for a string: - pcrecpp::RE("ell").PartialMatch("hello"); -.sp - Example: find first number in a string: - int number; - pcrecpp::RE re("(\e\ed+)"); - re.PartialMatch("x*100 + 20", &number); - assert(number == 100); -. -. -.SH "UTF-8 AND THE MATCHING INTERFACE" -.rs -.sp -By default, pattern and text are plain text, one byte per character. The UTF8 -flag, passed to the constructor, causes both pattern and string to be treated -as UTF-8 text, still a byte stream but potentially multiple bytes per -character. In practice, the text is likelier to be UTF-8 than the pattern, but -the match returned may depend on the UTF8 flag, so always use it when matching -UTF8 text. For example, "." will match one byte normally but with UTF8 set may -match up to three bytes of a multi-byte character. -.sp - Example: - pcrecpp::RE_Options options; - options.set_utf8(); - pcrecpp::RE re(utf8_pattern, options); - re.FullMatch(utf8_string); -.sp - Example: using the convenience function UTF8(): - pcrecpp::RE re(utf8_pattern, pcrecpp::UTF8()); - re.FullMatch(utf8_string); -.sp -NOTE: The UTF8 flag is ignored if pcre was not configured with the - --enable-utf8 flag. -. -. -.SH "PASSING MODIFIERS TO THE REGULAR EXPRESSION ENGINE" -.rs -.sp -PCRE defines some modifiers to change the behavior of the regular expression -engine. The C++ wrapper defines an auxiliary class, RE_Options, as a vehicle to -pass such modifiers to a RE class. Currently, the following modifiers are -supported: -.sp - modifier description Perl corresponding -.sp - PCRE_CASELESS case insensitive match /i - PCRE_MULTILINE multiple lines match /m - PCRE_DOTALL dot matches newlines /s - PCRE_DOLLAR_ENDONLY $ matches only at end N/A - PCRE_EXTRA strict escape parsing N/A - PCRE_EXTENDED ignore white spaces /x - PCRE_UTF8 handles UTF8 chars built-in - PCRE_UNGREEDY reverses * and *? N/A - PCRE_NO_AUTO_CAPTURE disables capturing parens N/A (*) -.sp -(*) Both Perl and PCRE allow non capturing parentheses by means of the -"?:" modifier within the pattern itself. e.g. (?:ab|cd) does not -capture, while (ab|cd) does. -.P -For a full account on how each modifier works, please check the -PCRE API reference page. -.P -For each modifier, there are two member functions whose name is made -out of the modifier in lowercase, without the "PCRE_" prefix. For -instance, PCRE_CASELESS is handled by -.sp - bool caseless() -.sp -which returns true if the modifier is set, and -.sp - RE_Options & set_caseless(bool) -.sp -which sets or unsets the modifier. Moreover, PCRE_EXTRA_MATCH_LIMIT can be -accessed through the \fBset_match_limit()\fP and \fBmatch_limit()\fP member -functions. Setting \fImatch_limit\fP to a non-zero value will limit the -execution of pcre to keep it from doing bad things like blowing the stack or -taking an eternity to return a result. A value of 5000 is good enough to stop -stack blowup in a 2MB thread stack. Setting \fImatch_limit\fP to zero disables -match limiting. Alternatively, you can call \fBmatch_limit_recursion()\fP -which uses PCRE_EXTRA_MATCH_LIMIT_RECURSION to limit how much PCRE -recurses. \fBmatch_limit()\fP limits the number of matches PCRE does; -\fBmatch_limit_recursion()\fP limits the depth of internal recursion, and -therefore the amount of stack that is used. -.P -Normally, to pass one or more modifiers to a RE class, you declare -a \fIRE_Options\fP object, set the appropriate options, and pass this -object to a RE constructor. Example: -.sp - RE_Options opt; - opt.set_caseless(true); - if (RE("HELLO", opt).PartialMatch("hello world")) ... -.sp -RE_options has two constructors. The default constructor takes no arguments and -creates a set of flags that are off by default. The optional parameter -\fIoption_flags\fP is to facilitate transfer of legacy code from C programs. -This lets you do -.sp - RE(pattern, - RE_Options(PCRE_CASELESS|PCRE_MULTILINE)).PartialMatch(str); -.sp -However, new code is better off doing -.sp - RE(pattern, - RE_Options().set_caseless(true).set_multiline(true)) - .PartialMatch(str); -.sp -If you are going to pass one of the most used modifiers, there are some -convenience functions that return a RE_Options class with the -appropriate modifier already set: \fBCASELESS()\fP, \fBUTF8()\fP, -\fBMULTILINE()\fP, \fBDOTALL\fP(), and \fBEXTENDED()\fP. -.P -If you need to set several options at once, and you don't want to go through -the pains of declaring a RE_Options object and setting several options, there -is a parallel method that give you such ability on the fly. You can concatenate -several \fBset_xxxxx()\fP member functions, since each of them returns a -reference to its class object. For example, to pass PCRE_CASELESS, -PCRE_EXTENDED, and PCRE_MULTILINE to a RE with one statement, you may write: -.sp - RE(" ^ xyz \e\es+ .* blah$", - RE_Options() - .set_caseless(true) - .set_extended(true) - .set_multiline(true)).PartialMatch(sometext); -.sp -. -. -.SH "SCANNING TEXT INCREMENTALLY" -.rs -.sp -The "Consume" operation may be useful if you want to repeatedly -match regular expressions at the front of a string and skip over -them as they match. This requires use of the "StringPiece" type, -which represents a sub-range of a real string. Like RE, StringPiece -is defined in the pcrecpp namespace. -.sp - Example: read lines of the form "var = value" from a string. - string contents = ...; // Fill string somehow - pcrecpp::StringPiece input(contents); // Wrap in a StringPiece -.sp - string var; - int value; - pcrecpp::RE re("(\e\ew+) = (\e\ed+)\en"); - while (re.Consume(&input, &var, &value)) { - ...; - } -.sp -Each successful call to "Consume" will set "var/value", and also -advance "input" so it points past the matched text. -.P -The "FindAndConsume" operation is similar to "Consume" but does not -anchor your match at the beginning of the string. For example, you -could extract all words from a string by repeatedly calling -.sp - pcrecpp::RE("(\e\ew+)").FindAndConsume(&input, &word) -. -. -.SH "PARSING HEX/OCTAL/C-RADIX NUMBERS" -.rs -.sp -By default, if you pass a pointer to a numeric value, the -corresponding text is interpreted as a base-10 number. You can -instead wrap the pointer with a call to one of the operators Hex(), -Octal(), or CRadix() to interpret the text in another base. The -CRadix operator interprets C-style "0" (base-8) and "0x" (base-16) -prefixes, but defaults to base-10. -.sp - Example: - int a, b, c, d; - pcrecpp::RE re("(.*) (.*) (.*) (.*)"); - re.FullMatch("100 40 0100 0x40", - pcrecpp::Octal(&a), pcrecpp::Hex(&b), - pcrecpp::CRadix(&c), pcrecpp::CRadix(&d)); -.sp -will leave 64 in a, b, c, and d. -. -. -.SH "REPLACING PARTS OF STRINGS" -.rs -.sp -You can replace the first match of "pattern" in "str" with "rewrite". -Within "rewrite", backslash-escaped digits (\e1 to \e9) can be -used to insert text matching corresponding parenthesized group -from the pattern. \e0 in "rewrite" refers to the entire matching -text. For example: -.sp - string s = "yabba dabba doo"; - pcrecpp::RE("b+").Replace("d", &s); -.sp -will leave "s" containing "yada dabba doo". The result is true if the pattern -matches and a replacement occurs, false otherwise. -.P -\fBGlobalReplace\fP is like \fBReplace\fP except that it replaces all -occurrences of the pattern in the string with the rewrite. Replacements are -not subject to re-matching. For example: -.sp - string s = "yabba dabba doo"; - pcrecpp::RE("b+").GlobalReplace("d", &s); -.sp -will leave "s" containing "yada dada doo". It returns the number of -replacements made. -.P -\fBExtract\fP is like \fBReplace\fP, except that if the pattern matches, -"rewrite" is copied into "out" (an additional argument) with substitutions. -The non-matching portions of "text" are ignored. Returns true iff a match -occurred and the extraction happened successfully; if no match occurs, the -string is left unaffected. -. -. -.SH AUTHOR -.rs -.sp -.nf -The C++ wrapper was contributed by Google Inc. -Copyright (c) 2007 Google Inc. -.fi -. -. -.SH REVISION -.rs -.sp -.nf -Last updated: 08 January 2012 -.fi diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcredemo.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcredemo.3 deleted file mode 100644 index 194629b1..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcredemo.3 +++ /dev/null @@ -1,424 +0,0 @@ -.\" Start example. -.de EX -. nr mE \\n(.f -. nf -. nh -. ft CW -.. -. -. -.\" End example. -.de EE -. ft \\n(mE -. fi -. hy \\n(HY -.. -. -.EX -/************************************************* -* PCRE DEMONSTRATION PROGRAM * -*************************************************/ - -/* This is a demonstration program to illustrate the most straightforward ways -of calling the PCRE regular expression library from a C program. See the -pcresample documentation for a short discussion ("man pcresample" if you have -the PCRE man pages installed). - -In Unix-like environments, if PCRE is installed in your standard system -libraries, you should be able to compile this program using this command: - -gcc -Wall pcredemo.c -lpcre -o pcredemo - -If PCRE is not installed in a standard place, it is likely to be installed with -support for the pkg-config mechanism. If you have pkg-config, you can compile -this program using this command: - -gcc -Wall pcredemo.c `pkg-config --cflags --libs libpcre` -o pcredemo - -If you do not have pkg-config, you may have to use this: - -gcc -Wall pcredemo.c -I/usr/local/include -L/usr/local/lib \e - -R/usr/local/lib -lpcre -o pcredemo - -Replace "/usr/local/include" and "/usr/local/lib" with wherever the include and -library files for PCRE are installed on your system. Only some operating -systems (e.g. Solaris) use the -R option. - -Building under Windows: - -If you want to statically link this program against a non-dll .a file, you must -define PCRE_STATIC before including pcre.h, otherwise the pcre_malloc() and -pcre_free() exported functions will be declared __declspec(dllimport), with -unwanted results. So in this environment, uncomment the following line. */ - -/* #define PCRE_STATIC */ - -#include -#include -#include - -#define OVECCOUNT 30 /* should be a multiple of 3 */ - - -int main(int argc, char **argv) -{ -pcre *re; -const char *error; -char *pattern; -char *subject; -unsigned char *name_table; -unsigned int option_bits; -int erroffset; -int find_all; -int crlf_is_newline; -int namecount; -int name_entry_size; -int ovector[OVECCOUNT]; -int subject_length; -int rc, i; -int utf8; - - -/************************************************************************** -* First, sort out the command line. There is only one possible option at * -* the moment, "-g" to request repeated matching to find all occurrences, * -* like Perl's /g option. We set the variable find_all to a non-zero value * -* if the -g option is present. Apart from that, there must be exactly two * -* arguments. * -**************************************************************************/ - -find_all = 0; -for (i = 1; i < argc; i++) - { - if (strcmp(argv[i], "-g") == 0) find_all = 1; - else break; - } - -/* After the options, we require exactly two arguments, which are the pattern, -and the subject string. */ - -if (argc - i != 2) - { - printf("Two arguments required: a regex and a subject string\en"); - return 1; - } - -pattern = argv[i]; -subject = argv[i+1]; -subject_length = (int)strlen(subject); - - -/************************************************************************* -* Now we are going to compile the regular expression pattern, and handle * -* and errors that are detected. * -*************************************************************************/ - -re = pcre_compile( - pattern, /* the pattern */ - 0, /* default options */ - &error, /* for error message */ - &erroffset, /* for error offset */ - NULL); /* use default character tables */ - -/* Compilation failed: print the error message and exit */ - -if (re == NULL) - { - printf("PCRE compilation failed at offset %d: %s\en", erroffset, error); - return 1; - } - - -/************************************************************************* -* If the compilation succeeded, we call PCRE again, in order to do a * -* pattern match against the subject string. This does just ONE match. If * -* further matching is needed, it will be done below. * -*************************************************************************/ - -rc = pcre_exec( - re, /* the compiled pattern */ - NULL, /* no extra data - we didn't study the pattern */ - subject, /* the subject string */ - subject_length, /* the length of the subject */ - 0, /* start at offset 0 in the subject */ - 0, /* default options */ - ovector, /* output vector for substring information */ - OVECCOUNT); /* number of elements in the output vector */ - -/* Matching failed: handle error cases */ - -if (rc < 0) - { - switch(rc) - { - case PCRE_ERROR_NOMATCH: printf("No match\en"); break; - /* - Handle other special cases if you like - */ - default: printf("Matching error %d\en", rc); break; - } - pcre_free(re); /* Release memory used for the compiled pattern */ - return 1; - } - -/* Match succeded */ - -printf("\enMatch succeeded at offset %d\en", ovector[0]); - - -/************************************************************************* -* We have found the first match within the subject string. If the output * -* vector wasn't big enough, say so. Then output any substrings that were * -* captured. * -*************************************************************************/ - -/* The output vector wasn't big enough */ - -if (rc == 0) - { - rc = OVECCOUNT/3; - printf("ovector only has room for %d captured substrings\en", rc - 1); - } - -/* Show substrings stored in the output vector by number. Obviously, in a real -application you might want to do things other than print them. */ - -for (i = 0; i < rc; i++) - { - char *substring_start = subject + ovector[2*i]; - int substring_length = ovector[2*i+1] - ovector[2*i]; - printf("%2d: %.*s\en", i, substring_length, substring_start); - } - - -/************************************************************************** -* That concludes the basic part of this demonstration program. We have * -* compiled a pattern, and performed a single match. The code that follows * -* shows first how to access named substrings, and then how to code for * -* repeated matches on the same subject. * -**************************************************************************/ - -/* See if there are any named substrings, and if so, show them by name. First -we have to extract the count of named parentheses from the pattern. */ - -(void)pcre_fullinfo( - re, /* the compiled pattern */ - NULL, /* no extra data - we didn't study the pattern */ - PCRE_INFO_NAMECOUNT, /* number of named substrings */ - &namecount); /* where to put the answer */ - -if (namecount <= 0) printf("No named substrings\en"); else - { - unsigned char *tabptr; - printf("Named substrings\en"); - - /* Before we can access the substrings, we must extract the table for - translating names to numbers, and the size of each entry in the table. */ - - (void)pcre_fullinfo( - re, /* the compiled pattern */ - NULL, /* no extra data - we didn't study the pattern */ - PCRE_INFO_NAMETABLE, /* address of the table */ - &name_table); /* where to put the answer */ - - (void)pcre_fullinfo( - re, /* the compiled pattern */ - NULL, /* no extra data - we didn't study the pattern */ - PCRE_INFO_NAMEENTRYSIZE, /* size of each entry in the table */ - &name_entry_size); /* where to put the answer */ - - /* Now we can scan the table and, for each entry, print the number, the name, - and the substring itself. */ - - tabptr = name_table; - for (i = 0; i < namecount; i++) - { - int n = (tabptr[0] << 8) | tabptr[1]; - printf("(%d) %*s: %.*s\en", n, name_entry_size - 3, tabptr + 2, - ovector[2*n+1] - ovector[2*n], subject + ovector[2*n]); - tabptr += name_entry_size; - } - } - - -/************************************************************************* -* If the "-g" option was given on the command line, we want to continue * -* to search for additional matches in the subject string, in a similar * -* way to the /g option in Perl. This turns out to be trickier than you * -* might think because of the possibility of matching an empty string. * -* What happens is as follows: * -* * -* If the previous match was NOT for an empty string, we can just start * -* the next match at the end of the previous one. * -* * -* If the previous match WAS for an empty string, we can't do that, as it * -* would lead to an infinite loop. Instead, a special call of pcre_exec() * -* is made with the PCRE_NOTEMPTY_ATSTART and PCRE_ANCHORED flags set. * -* The first of these tells PCRE that an empty string at the start of the * -* subject is not a valid match; other possibilities must be tried. The * -* second flag restricts PCRE to one match attempt at the initial string * -* position. If this match succeeds, an alternative to the empty string * -* match has been found, and we can print it and proceed round the loop, * -* advancing by the length of whatever was found. If this match does not * -* succeed, we still stay in the loop, advancing by just one character. * -* In UTF-8 mode, which can be set by (*UTF8) in the pattern, this may be * -* more than one byte. * -* * -* However, there is a complication concerned with newlines. When the * -* newline convention is such that CRLF is a valid newline, we must * -* advance by two characters rather than one. The newline convention can * -* be set in the regex by (*CR), etc.; if not, we must find the default. * -*************************************************************************/ - -if (!find_all) /* Check for -g */ - { - pcre_free(re); /* Release the memory used for the compiled pattern */ - return 0; /* Finish unless -g was given */ - } - -/* Before running the loop, check for UTF-8 and whether CRLF is a valid newline -sequence. First, find the options with which the regex was compiled; extract -the UTF-8 state, and mask off all but the newline options. */ - -(void)pcre_fullinfo(re, NULL, PCRE_INFO_OPTIONS, &option_bits); -utf8 = option_bits & PCRE_UTF8; -option_bits &= PCRE_NEWLINE_CR|PCRE_NEWLINE_LF|PCRE_NEWLINE_CRLF| - PCRE_NEWLINE_ANY|PCRE_NEWLINE_ANYCRLF; - -/* If no newline options were set, find the default newline convention from the -build configuration. */ - -if (option_bits == 0) - { - int d; - (void)pcre_config(PCRE_CONFIG_NEWLINE, &d); - /* Note that these values are always the ASCII ones, even in - EBCDIC environments. CR = 13, NL = 10. */ - option_bits = (d == 13)? PCRE_NEWLINE_CR : - (d == 10)? PCRE_NEWLINE_LF : - (d == (13<<8 | 10))? PCRE_NEWLINE_CRLF : - (d == -2)? PCRE_NEWLINE_ANYCRLF : - (d == -1)? PCRE_NEWLINE_ANY : 0; - } - -/* See if CRLF is a valid newline sequence. */ - -crlf_is_newline = - option_bits == PCRE_NEWLINE_ANY || - option_bits == PCRE_NEWLINE_CRLF || - option_bits == PCRE_NEWLINE_ANYCRLF; - -/* Loop for second and subsequent matches */ - -for (;;) - { - int options = 0; /* Normally no options */ - int start_offset = ovector[1]; /* Start at end of previous match */ - - /* If the previous match was for an empty string, we are finished if we are - at the end of the subject. Otherwise, arrange to run another match at the - same point to see if a non-empty match can be found. */ - - if (ovector[0] == ovector[1]) - { - if (ovector[0] == subject_length) break; - options = PCRE_NOTEMPTY_ATSTART | PCRE_ANCHORED; - } - - /* Run the next matching operation */ - - rc = pcre_exec( - re, /* the compiled pattern */ - NULL, /* no extra data - we didn't study the pattern */ - subject, /* the subject string */ - subject_length, /* the length of the subject */ - start_offset, /* starting offset in the subject */ - options, /* options */ - ovector, /* output vector for substring information */ - OVECCOUNT); /* number of elements in the output vector */ - - /* This time, a result of NOMATCH isn't an error. If the value in "options" - is zero, it just means we have found all possible matches, so the loop ends. - Otherwise, it means we have failed to find a non-empty-string match at a - point where there was a previous empty-string match. In this case, we do what - Perl does: advance the matching position by one character, and continue. We - do this by setting the "end of previous match" offset, because that is picked - up at the top of the loop as the point at which to start again. - - There are two complications: (a) When CRLF is a valid newline sequence, and - the current position is just before it, advance by an extra byte. (b) - Otherwise we must ensure that we skip an entire UTF-8 character if we are in - UTF-8 mode. */ - - if (rc == PCRE_ERROR_NOMATCH) - { - if (options == 0) break; /* All matches found */ - ovector[1] = start_offset + 1; /* Advance one byte */ - if (crlf_is_newline && /* If CRLF is newline & */ - start_offset < subject_length - 1 && /* we are at CRLF, */ - subject[start_offset] == '\er' && - subject[start_offset + 1] == '\en') - ovector[1] += 1; /* Advance by one more. */ - else if (utf8) /* Otherwise, ensure we */ - { /* advance a whole UTF-8 */ - while (ovector[1] < subject_length) /* character. */ - { - if ((subject[ovector[1]] & 0xc0) != 0x80) break; - ovector[1] += 1; - } - } - continue; /* Go round the loop again */ - } - - /* Other matching errors are not recoverable. */ - - if (rc < 0) - { - printf("Matching error %d\en", rc); - pcre_free(re); /* Release memory used for the compiled pattern */ - return 1; - } - - /* Match succeded */ - - printf("\enMatch succeeded again at offset %d\en", ovector[0]); - - /* The match succeeded, but the output vector wasn't big enough. */ - - if (rc == 0) - { - rc = OVECCOUNT/3; - printf("ovector only has room for %d captured substrings\en", rc - 1); - } - - /* As before, show substrings stored in the output vector by number, and then - also any named substrings. */ - - for (i = 0; i < rc; i++) - { - char *substring_start = subject + ovector[2*i]; - int substring_length = ovector[2*i+1] - ovector[2*i]; - printf("%2d: %.*s\en", i, substring_length, substring_start); - } - - if (namecount <= 0) printf("No named substrings\en"); else - { - unsigned char *tabptr = name_table; - printf("Named substrings\en"); - for (i = 0; i < namecount; i++) - { - int n = (tabptr[0] << 8) | tabptr[1]; - printf("(%d) %*s: %.*s\en", n, name_entry_size - 3, tabptr + 2, - ovector[2*n+1] - ovector[2*n], subject + ovector[2*n]); - tabptr += name_entry_size; - } - } - } /* End of loop to find second and subsequent matches */ - -printf("\en"); -pcre_free(re); /* Release memory used for the compiled pattern */ -return 0; -} - -/* End of pcredemo.c */ -.EE diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcrejit.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcrejit.3 deleted file mode 100644 index 3b785f0f..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcrejit.3 +++ /dev/null @@ -1,473 +0,0 @@ -.TH PCREJIT 3 "05 July 2017" "PCRE 8.41" -.SH NAME -PCRE - Perl-compatible regular expressions -.SH "PCRE JUST-IN-TIME COMPILER SUPPORT" -.rs -.sp -Just-in-time compiling is a heavyweight optimization that can greatly speed up -pattern matching. However, it comes at the cost of extra processing before the -match is performed. Therefore, it is of most benefit when the same pattern is -going to be matched many times. This does not necessarily mean many calls of a -matching function; if the pattern is not anchored, matching attempts may take -place many times at various positions in the subject, even for a single call. -Therefore, if the subject string is very long, it may still pay to use JIT for -one-off matches. -.P -JIT support applies only to the traditional Perl-compatible matching function. -It does not apply when the DFA matching function is being used. The code for -this support was written by Zoltan Herczeg. -. -. -.SH "8-BIT, 16-BIT AND 32-BIT SUPPORT" -.rs -.sp -JIT support is available for all of the 8-bit, 16-bit and 32-bit PCRE -libraries. To keep this documentation simple, only the 8-bit interface is -described in what follows. If you are using the 16-bit library, substitute the -16-bit functions and 16-bit structures (for example, \fIpcre16_jit_stack\fP -instead of \fIpcre_jit_stack\fP). If you are using the 32-bit library, -substitute the 32-bit functions and 32-bit structures (for example, -\fIpcre32_jit_stack\fP instead of \fIpcre_jit_stack\fP). -. -. -.SH "AVAILABILITY OF JIT SUPPORT" -.rs -.sp -JIT support is an optional feature of PCRE. The "configure" option --enable-jit -(or equivalent CMake option) must be set when PCRE is built if you want to use -JIT. The support is limited to the following hardware platforms: -.sp - ARM v5, v7, and Thumb2 - Intel x86 32-bit and 64-bit - MIPS 32-bit - Power PC 32-bit and 64-bit - SPARC 32-bit (experimental) -.sp -If --enable-jit is set on an unsupported platform, compilation fails. -.P -A program that is linked with PCRE 8.20 or later can tell if JIT support is -available by calling \fBpcre_config()\fP with the PCRE_CONFIG_JIT option. The -result is 1 when JIT is available, and 0 otherwise. However, a simple program -does not need to check this in order to use JIT. The normal API is implemented -in a way that falls back to the interpretive code if JIT is not available. For -programs that need the best possible performance, there is also a "fast path" -API that is JIT-specific. -.P -If your program may sometimes be linked with versions of PCRE that are older -than 8.20, but you want to use JIT when it is available, you can test the -values of PCRE_MAJOR and PCRE_MINOR, or the existence of a JIT macro such as -PCRE_CONFIG_JIT, for compile-time control of your code. Also beware that the -\fBpcre_jit_exec()\fP function was not available at all before 8.32, -and may not be available at all if PCRE isn't compiled with ---enable-jit. See the "JIT FAST PATH API" section below for details. -. -. -.SH "SIMPLE USE OF JIT" -.rs -.sp -You have to do two things to make use of the JIT support in the simplest way: -.sp - (1) Call \fBpcre_study()\fP with the PCRE_STUDY_JIT_COMPILE option for - each compiled pattern, and pass the resulting \fBpcre_extra\fP block to - \fBpcre_exec()\fP. -.sp - (2) Use \fBpcre_free_study()\fP to free the \fBpcre_extra\fP block when it is - no longer needed, instead of just freeing it yourself. This ensures that - any JIT data is also freed. -.sp -For a program that may be linked with pre-8.20 versions of PCRE, you can insert -.sp - #ifndef PCRE_STUDY_JIT_COMPILE - #define PCRE_STUDY_JIT_COMPILE 0 - #endif -.sp -so that no option is passed to \fBpcre_study()\fP, and then use something like -this to free the study data: -.sp - #ifdef PCRE_CONFIG_JIT - pcre_free_study(study_ptr); - #else - pcre_free(study_ptr); - #endif -.sp -PCRE_STUDY_JIT_COMPILE requests the JIT compiler to generate code for complete -matches. If you want to run partial matches using the PCRE_PARTIAL_HARD or -PCRE_PARTIAL_SOFT options of \fBpcre_exec()\fP, you should set one or both of -the following options in addition to, or instead of, PCRE_STUDY_JIT_COMPILE -when you call \fBpcre_study()\fP: -.sp - PCRE_STUDY_JIT_PARTIAL_HARD_COMPILE - PCRE_STUDY_JIT_PARTIAL_SOFT_COMPILE -.sp -If using \fBpcre_jit_exec()\fP and supporting a pre-8.32 version of -PCRE, you can insert: -.sp - #if PCRE_MAJOR >= 8 && PCRE_MINOR >= 32 - pcre_jit_exec(...); - #else - pcre_exec(...) - #endif -.sp -but as described in the "JIT FAST PATH API" section below this assumes -version 8.32 and later are compiled with --enable-jit, which may -break. -.sp -The JIT compiler generates different optimized code for each of the three -modes (normal, soft partial, hard partial). When \fBpcre_exec()\fP is called, -the appropriate code is run if it is available. Otherwise, the pattern is -matched using interpretive code. -.P -In some circumstances you may need to call additional functions. These are -described in the section entitled -.\" HTML -.\" -"Controlling the JIT stack" -.\" -below. -.P -If JIT support is not available, PCRE_STUDY_JIT_COMPILE etc. are ignored, and -no JIT data is created. Otherwise, the compiled pattern is passed to the JIT -compiler, which turns it into machine code that executes much faster than the -normal interpretive code. When \fBpcre_exec()\fP is passed a \fBpcre_extra\fP -block containing a pointer to JIT code of the appropriate mode (normal or -hard/soft partial), it obeys that code instead of running the interpreter. The -result is identical, but the compiled JIT code runs much faster. -.P -There are some \fBpcre_exec()\fP options that are not supported for JIT -execution. There are also some pattern items that JIT cannot handle. Details -are given below. In both cases, execution automatically falls back to the -interpretive code. If you want to know whether JIT was actually used for a -particular match, you should arrange for a JIT callback function to be set up -as described in the section entitled -.\" HTML -.\" -"Controlling the JIT stack" -.\" -below, even if you do not need to supply a non-default JIT stack. Such a -callback function is called whenever JIT code is about to be obeyed. If the -execution options are not right for JIT execution, the callback function is not -obeyed. -.P -If the JIT compiler finds an unsupported item, no JIT data is generated. You -can find out if JIT execution is available after studying a pattern by calling -\fBpcre_fullinfo()\fP with the PCRE_INFO_JIT option. A result of 1 means that -JIT compilation was successful. A result of 0 means that JIT support is not -available, or the pattern was not studied with PCRE_STUDY_JIT_COMPILE etc., or -the JIT compiler was not able to handle the pattern. -.P -Once a pattern has been studied, with or without JIT, it can be used as many -times as you like for matching different subject strings. -. -. -.SH "UNSUPPORTED OPTIONS AND PATTERN ITEMS" -.rs -.sp -The only \fBpcre_exec()\fP options that are supported for JIT execution are -PCRE_NO_UTF8_CHECK, PCRE_NO_UTF16_CHECK, PCRE_NO_UTF32_CHECK, PCRE_NOTBOL, -PCRE_NOTEOL, PCRE_NOTEMPTY, PCRE_NOTEMPTY_ATSTART, PCRE_PARTIAL_HARD, and -PCRE_PARTIAL_SOFT. -.P -The only unsupported pattern items are \eC (match a single data unit) when -running in a UTF mode, and a callout immediately before an assertion condition -in a conditional group. -. -. -.SH "RETURN VALUES FROM JIT EXECUTION" -.rs -.sp -When a pattern is matched using JIT execution, the return values are the same -as those given by the interpretive \fBpcre_exec()\fP code, with the addition of -one new error code: PCRE_ERROR_JIT_STACKLIMIT. This means that the memory used -for the JIT stack was insufficient. See -.\" HTML -.\" -"Controlling the JIT stack" -.\" -below for a discussion of JIT stack usage. For compatibility with the -interpretive \fBpcre_exec()\fP code, no more than two-thirds of the -\fIovector\fP argument is used for passing back captured substrings. -.P -The error code PCRE_ERROR_MATCHLIMIT is returned by the JIT code if searching a -very large pattern tree goes on for too long, as it is in the same circumstance -when JIT is not used, but the details of exactly what is counted are not the -same. The PCRE_ERROR_RECURSIONLIMIT error code is never returned by JIT -execution. -. -. -.SH "SAVING AND RESTORING COMPILED PATTERNS" -.rs -.sp -The code that is generated by the JIT compiler is architecture-specific, and is -also position dependent. For those reasons it cannot be saved (in a file or -database) and restored later like the bytecode and other data of a compiled -pattern. Saving and restoring compiled patterns is not something many people -do. More detail about this facility is given in the -.\" HREF -\fBpcreprecompile\fP -.\" -documentation. It should be possible to run \fBpcre_study()\fP on a saved and -restored pattern, and thereby recreate the JIT data, but because JIT -compilation uses significant resources, it is probably not worth doing this; -you might as well recompile the original pattern. -. -. -.\" HTML -.SH "CONTROLLING THE JIT STACK" -.rs -.sp -When the compiled JIT code runs, it needs a block of memory to use as a stack. -By default, it uses 32K on the machine stack. However, some large or -complicated patterns need more than this. The error PCRE_ERROR_JIT_STACKLIMIT -is given when there is not enough stack. Three functions are provided for -managing blocks of memory for use as JIT stacks. There is further discussion -about the use of JIT stacks in the section entitled -.\" HTML -.\" -"JIT stack FAQ" -.\" -below. -.P -The \fBpcre_jit_stack_alloc()\fP function creates a JIT stack. Its arguments -are a starting size and a maximum size, and it returns a pointer to an opaque -structure of type \fBpcre_jit_stack\fP, or NULL if there is an error. The -\fBpcre_jit_stack_free()\fP function can be used to free a stack that is no -longer needed. (For the technically minded: the address space is allocated by -mmap or VirtualAlloc.) -.P -JIT uses far less memory for recursion than the interpretive code, -and a maximum stack size of 512K to 1M should be more than enough for any -pattern. -.P -The \fBpcre_assign_jit_stack()\fP function specifies which stack JIT code -should use. Its arguments are as follows: -.sp - pcre_extra *extra - pcre_jit_callback callback - void *data -.sp -The \fIextra\fP argument must be the result of studying a pattern with -PCRE_STUDY_JIT_COMPILE etc. There are three cases for the values of the other -two options: -.sp - (1) If \fIcallback\fP is NULL and \fIdata\fP is NULL, an internal 32K block - on the machine stack is used. -.sp - (2) If \fIcallback\fP is NULL and \fIdata\fP is not NULL, \fIdata\fP must be - a valid JIT stack, the result of calling \fBpcre_jit_stack_alloc()\fP. -.sp - (3) If \fIcallback\fP is not NULL, it must point to a function that is - called with \fIdata\fP as an argument at the start of matching, in - order to set up a JIT stack. If the return from the callback - function is NULL, the internal 32K stack is used; otherwise the - return value must be a valid JIT stack, the result of calling - \fBpcre_jit_stack_alloc()\fP. -.sp -A callback function is obeyed whenever JIT code is about to be run; it is not -obeyed when \fBpcre_exec()\fP is called with options that are incompatible for -JIT execution. A callback function can therefore be used to determine whether a -match operation was executed by JIT or by the interpreter. -.P -You may safely use the same JIT stack for more than one pattern (either by -assigning directly or by callback), as long as the patterns are all matched -sequentially in the same thread. In a multithread application, if you do not -specify a JIT stack, or if you assign or pass back NULL from a callback, that -is thread-safe, because each thread has its own machine stack. However, if you -assign or pass back a non-NULL JIT stack, this must be a different stack for -each thread so that the application is thread-safe. -.P -Strictly speaking, even more is allowed. You can assign the same non-NULL stack -to any number of patterns as long as they are not used for matching by multiple -threads at the same time. For example, you can assign the same stack to all -compiled patterns, and use a global mutex in the callback to wait until the -stack is available for use. However, this is an inefficient solution, and not -recommended. -.P -This is a suggestion for how a multithreaded program that needs to set up -non-default JIT stacks might operate: -.sp - During thread initalization - thread_local_var = pcre_jit_stack_alloc(...) -.sp - During thread exit - pcre_jit_stack_free(thread_local_var) -.sp - Use a one-line callback function - return thread_local_var -.sp -All the functions described in this section do nothing if JIT is not available, -and \fBpcre_assign_jit_stack()\fP does nothing unless the \fBextra\fP argument -is non-NULL and points to a \fBpcre_extra\fP block that is the result of a -successful study with PCRE_STUDY_JIT_COMPILE etc. -. -. -.\" HTML -.SH "JIT STACK FAQ" -.rs -.sp -(1) Why do we need JIT stacks? -.sp -PCRE (and JIT) is a recursive, depth-first engine, so it needs a stack where -the local data of the current node is pushed before checking its child nodes. -Allocating real machine stack on some platforms is difficult. For example, the -stack chain needs to be updated every time if we extend the stack on PowerPC. -Although it is possible, its updating time overhead decreases performance. So -we do the recursion in memory. -.P -(2) Why don't we simply allocate blocks of memory with \fBmalloc()\fP? -.sp -Modern operating systems have a nice feature: they can reserve an address space -instead of allocating memory. We can safely allocate memory pages inside this -address space, so the stack could grow without moving memory data (this is -important because of pointers). Thus we can allocate 1M address space, and use -only a single memory page (usually 4K) if that is enough. However, we can still -grow up to 1M anytime if needed. -.P -(3) Who "owns" a JIT stack? -.sp -The owner of the stack is the user program, not the JIT studied pattern or -anything else. The user program must ensure that if a stack is used by -\fBpcre_exec()\fP, (that is, it is assigned to the pattern currently running), -that stack must not be used by any other threads (to avoid overwriting the same -memory area). The best practice for multithreaded programs is to allocate a -stack for each thread, and return this stack through the JIT callback function. -.P -(4) When should a JIT stack be freed? -.sp -You can free a JIT stack at any time, as long as it will not be used by -\fBpcre_exec()\fP again. When you assign the stack to a pattern, only a pointer -is set. There is no reference counting or any other magic. You can free the -patterns and stacks in any order, anytime. Just \fIdo not\fP call -\fBpcre_exec()\fP with a pattern pointing to an already freed stack, as that -will cause SEGFAULT. (Also, do not free a stack currently used by -\fBpcre_exec()\fP in another thread). You can also replace the stack for a -pattern at any time. You can even free the previous stack before assigning a -replacement. -.P -(5) Should I allocate/free a stack every time before/after calling -\fBpcre_exec()\fP? -.sp -No, because this is too costly in terms of resources. However, you could -implement some clever idea which release the stack if it is not used in let's -say two minutes. The JIT callback can help to achieve this without keeping a -list of the currently JIT studied patterns. -.P -(6) OK, the stack is for long term memory allocation. But what happens if a -pattern causes stack overflow with a stack of 1M? Is that 1M kept until the -stack is freed? -.sp -Especially on embedded sytems, it might be a good idea to release memory -sometimes without freeing the stack. There is no API for this at the moment. -Probably a function call which returns with the currently allocated memory for -any stack and another which allows releasing memory (shrinking the stack) would -be a good idea if someone needs this. -.P -(7) This is too much of a headache. Isn't there any better solution for JIT -stack handling? -.sp -No, thanks to Windows. If POSIX threads were used everywhere, we could throw -out this complicated API. -. -. -.SH "EXAMPLE CODE" -.rs -.sp -This is a single-threaded example that specifies a JIT stack without using a -callback. -.sp - int rc; - int ovector[30]; - pcre *re; - pcre_extra *extra; - pcre_jit_stack *jit_stack; -.sp - re = pcre_compile(pattern, 0, &error, &erroffset, NULL); - /* Check for errors */ - extra = pcre_study(re, PCRE_STUDY_JIT_COMPILE, &error); - jit_stack = pcre_jit_stack_alloc(32*1024, 512*1024); - /* Check for error (NULL) */ - pcre_assign_jit_stack(extra, NULL, jit_stack); - rc = pcre_exec(re, extra, subject, length, 0, 0, ovector, 30); - /* Check results */ - pcre_free(re); - pcre_free_study(extra); - pcre_jit_stack_free(jit_stack); -.sp -. -. -.SH "JIT FAST PATH API" -.rs -.sp -Because the API described above falls back to interpreted execution when JIT is -not available, it is convenient for programs that are written for general use -in many environments. However, calling JIT via \fBpcre_exec()\fP does have a -performance impact. Programs that are written for use where JIT is known to be -available, and which need the best possible performance, can instead use a -"fast path" API to call JIT execution directly instead of calling -\fBpcre_exec()\fP (obviously only for patterns that have been successfully -studied by JIT). -.P -The fast path function is called \fBpcre_jit_exec()\fP, and it takes exactly -the same arguments as \fBpcre_exec()\fP, plus one additional argument that -must point to a JIT stack. The JIT stack arrangements described above do not -apply. The return values are the same as for \fBpcre_exec()\fP. -.P -When you call \fBpcre_exec()\fP, as well as testing for invalid options, a -number of other sanity checks are performed on the arguments. For example, if -the subject pointer is NULL, or its length is negative, an immediate error is -given. Also, unless PCRE_NO_UTF[8|16|32] is set, a UTF subject string is tested -for validity. In the interests of speed, these checks do not happen on the JIT -fast path, and if invalid data is passed, the result is undefined. -.P -Bypassing the sanity checks and the \fBpcre_exec()\fP wrapping can give -speedups of more than 10%. -.P -Note that the \fBpcre_jit_exec()\fP function is not available in versions of -PCRE before 8.32 (released in November 2012). If you need to support versions -that old you must either use the slower \fBpcre_exec()\fP, or switch between -the two codepaths by checking the values of PCRE_MAJOR and PCRE_MINOR. -.P -Due to an unfortunate implementation oversight, even in versions 8.32 -and later there will be no \fBpcre_jit_exec()\fP stub function defined -when PCRE is compiled with --disable-jit, which is the default, and -there's no way to detect whether PCRE was compiled with --enable-jit -via a macro. -.P -If you need to support versions older than 8.32, or versions that may -not build with --enable-jit, you must either use the slower -\fBpcre_exec()\fP, or switch between the two codepaths by checking the -values of PCRE_MAJOR and PCRE_MINOR. -.P -Switching between the two by checking the version assumes that all the -versions being targeted are built with --enable-jit. To also support -builds that may use --disable-jit either \fBpcre_exec()\fP must be -used, or a compile-time check for JIT via \fBpcre_config()\fP (which -assumes the runtime environment will be the same), or as the Git -project decided to do, simply assume that \fBpcre_jit_exec()\fP is -present in 8.32 or later unless a compile-time flag is provided, see -the "grep: un-break building with PCRE >= 8.32 without --enable-jit" -commit in git.git for an example of that. -. -. -.SH "SEE ALSO" -.rs -.sp -\fBpcreapi\fP(3) -. -. -.SH AUTHOR -.rs -.sp -.nf -Philip Hazel (FAQ by Zoltan Herczeg) -University Computing Service -Cambridge CB2 3QH, England. -.fi -. -. -.SH REVISION -.rs -.sp -.nf -Last updated: 05 July 2017 -Copyright (c) 1997-2017 University of Cambridge. -.fi diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcrelimits.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcrelimits.3 deleted file mode 100644 index 423d6a27..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcrelimits.3 +++ /dev/null @@ -1,71 +0,0 @@ -.TH PCRELIMITS 3 "05 November 2013" "PCRE 8.34" -.SH NAME -PCRE - Perl-compatible regular expressions -.SH "SIZE AND OTHER LIMITATIONS" -.rs -.sp -There are some size limitations in PCRE but it is hoped that they will never in -practice be relevant. -.P -The maximum length of a compiled pattern is approximately 64K data units (bytes -for the 8-bit library, 16-bit units for the 16-bit library, and 32-bit units for -the 32-bit library) if PCRE is compiled with the default internal linkage size, -which is 2 bytes for the 8-bit and 16-bit libraries, and 4 bytes for the 32-bit -library. If you want to process regular expressions that are truly enormous, -you can compile PCRE with an internal linkage size of 3 or 4 (when building the -16-bit or 32-bit library, 3 is rounded up to 4). See the \fBREADME\fP file in -the source distribution and the -.\" HREF -\fBpcrebuild\fP -.\" -documentation for details. In these cases the limit is substantially larger. -However, the speed of execution is slower. -.P -All values in repeating quantifiers must be less than 65536. -.P -There is no limit to the number of parenthesized subpatterns, but there can be -no more than 65535 capturing subpatterns. There is, however, a limit to the -depth of nesting of parenthesized subpatterns of all kinds. This is imposed in -order to limit the amount of system stack used at compile time. The limit can -be specified when PCRE is built; the default is 250. -.P -There is a limit to the number of forward references to subsequent subpatterns -of around 200,000. Repeated forward references with fixed upper limits, for -example, (?2){0,100} when subpattern number 2 is to the right, are included in -the count. There is no limit to the number of backward references. -.P -The maximum length of name for a named subpattern is 32 characters, and the -maximum number of named subpatterns is 10000. -.P -The maximum length of a name in a (*MARK), (*PRUNE), (*SKIP), or (*THEN) verb -is 255 for the 8-bit library and 65535 for the 16-bit and 32-bit libraries. -.P -The maximum length of a subject string is the largest positive number that an -integer variable can hold. However, when using the traditional matching -function, PCRE uses recursion to handle subpatterns and indefinite repetition. -This means that the available stack space may limit the size of a subject -string that can be processed by certain patterns. For a discussion of stack -issues, see the -.\" HREF -\fBpcrestack\fP -.\" -documentation. -. -. -.SH AUTHOR -.rs -.sp -.nf -Philip Hazel -University Computing Service -Cambridge CB2 3QH, England. -.fi -. -. -.SH REVISION -.rs -.sp -.nf -Last updated: 05 November 2013 -Copyright (c) 1997-2013 University of Cambridge. -.fi diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcrematching.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcrematching.3 deleted file mode 100644 index 268baf9b..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcrematching.3 +++ /dev/null @@ -1,214 +0,0 @@ -.TH PCREMATCHING 3 "12 November 2013" "PCRE 8.34" -.SH NAME -PCRE - Perl-compatible regular expressions -.SH "PCRE MATCHING ALGORITHMS" -.rs -.sp -This document describes the two different algorithms that are available in PCRE -for matching a compiled regular expression against a given subject string. The -"standard" algorithm is the one provided by the \fBpcre_exec()\fP, -\fBpcre16_exec()\fP and \fBpcre32_exec()\fP functions. These work in the same -as as Perl's matching function, and provide a Perl-compatible matching operation. -The just-in-time (JIT) optimization that is described in the -.\" HREF -\fBpcrejit\fP -.\" -documentation is compatible with these functions. -.P -An alternative algorithm is provided by the \fBpcre_dfa_exec()\fP, -\fBpcre16_dfa_exec()\fP and \fBpcre32_dfa_exec()\fP functions; they operate in -a different way, and are not Perl-compatible. This alternative has advantages -and disadvantages compared with the standard algorithm, and these are described -below. -.P -When there is only one possible way in which a given subject string can match a -pattern, the two algorithms give the same answer. A difference arises, however, -when there are multiple possibilities. For example, if the pattern -.sp - ^<.*> -.sp -is matched against the string -.sp - -.sp -there are three possible answers. The standard algorithm finds only one of -them, whereas the alternative algorithm finds all three. -. -. -.SH "REGULAR EXPRESSIONS AS TREES" -.rs -.sp -The set of strings that are matched by a regular expression can be represented -as a tree structure. An unlimited repetition in the pattern makes the tree of -infinite size, but it is still a tree. Matching the pattern to a given subject -string (from a given starting point) can be thought of as a search of the tree. -There are two ways to search a tree: depth-first and breadth-first, and these -correspond to the two matching algorithms provided by PCRE. -. -. -.SH "THE STANDARD MATCHING ALGORITHM" -.rs -.sp -In the terminology of Jeffrey Friedl's book "Mastering Regular -Expressions", the standard algorithm is an "NFA algorithm". It conducts a -depth-first search of the pattern tree. That is, it proceeds along a single -path through the tree, checking that the subject matches what is required. When -there is a mismatch, the algorithm tries any alternatives at the current point, -and if they all fail, it backs up to the previous branch point in the tree, and -tries the next alternative branch at that level. This often involves backing up -(moving to the left) in the subject string as well. The order in which -repetition branches are tried is controlled by the greedy or ungreedy nature of -the quantifier. -.P -If a leaf node is reached, a matching string has been found, and at that point -the algorithm stops. Thus, if there is more than one possible match, this -algorithm returns the first one that it finds. Whether this is the shortest, -the longest, or some intermediate length depends on the way the greedy and -ungreedy repetition quantifiers are specified in the pattern. -.P -Because it ends up with a single path through the tree, it is relatively -straightforward for this algorithm to keep track of the substrings that are -matched by portions of the pattern in parentheses. This provides support for -capturing parentheses and back references. -. -. -.SH "THE ALTERNATIVE MATCHING ALGORITHM" -.rs -.sp -This algorithm conducts a breadth-first search of the tree. Starting from the -first matching point in the subject, it scans the subject string from left to -right, once, character by character, and as it does this, it remembers all the -paths through the tree that represent valid matches. In Friedl's terminology, -this is a kind of "DFA algorithm", though it is not implemented as a -traditional finite state machine (it keeps multiple states active -simultaneously). -.P -Although the general principle of this matching algorithm is that it scans the -subject string only once, without backtracking, there is one exception: when a -lookaround assertion is encountered, the characters following or preceding the -current point have to be independently inspected. -.P -The scan continues until either the end of the subject is reached, or there are -no more unterminated paths. At this point, terminated paths represent the -different matching possibilities (if there are none, the match has failed). -Thus, if there is more than one possible match, this algorithm finds all of -them, and in particular, it finds the longest. The matches are returned in -decreasing order of length. There is an option to stop the algorithm after the -first match (which is necessarily the shortest) is found. -.P -Note that all the matches that are found start at the same point in the -subject. If the pattern -.sp - cat(er(pillar)?)? -.sp -is matched against the string "the caterpillar catchment", the result will be -the three strings "caterpillar", "cater", and "cat" that start at the fifth -character of the subject. The algorithm does not automatically move on to find -matches that start at later positions. -.P -PCRE's "auto-possessification" optimization usually applies to character -repeats at the end of a pattern (as well as internally). For example, the -pattern "a\ed+" is compiled as if it were "a\ed++" because there is no point -even considering the possibility of backtracking into the repeated digits. For -DFA matching, this means that only one possible match is found. If you really -do want multiple matches in such cases, either use an ungreedy repeat -("a\ed+?") or set the PCRE_NO_AUTO_POSSESS option when compiling. -.P -There are a number of features of PCRE regular expressions that are not -supported by the alternative matching algorithm. They are as follows: -.P -1. Because the algorithm finds all possible matches, the greedy or ungreedy -nature of repetition quantifiers is not relevant. Greedy and ungreedy -quantifiers are treated in exactly the same way. However, possessive -quantifiers can make a difference when what follows could also match what is -quantified, for example in a pattern like this: -.sp - ^a++\ew! -.sp -This pattern matches "aaab!" but not "aaa!", which would be matched by a -non-possessive quantifier. Similarly, if an atomic group is present, it is -matched as if it were a standalone pattern at the current point, and the -longest match is then "locked in" for the rest of the overall pattern. -.P -2. When dealing with multiple paths through the tree simultaneously, it is not -straightforward to keep track of captured substrings for the different matching -possibilities, and PCRE's implementation of this algorithm does not attempt to -do this. This means that no captured substrings are available. -.P -3. Because no substrings are captured, back references within the pattern are -not supported, and cause errors if encountered. -.P -4. For the same reason, conditional expressions that use a backreference as the -condition or test for a specific group recursion are not supported. -.P -5. Because many paths through the tree may be active, the \eK escape sequence, -which resets the start of the match when encountered (but may be on some paths -and not on others), is not supported. It causes an error if encountered. -.P -6. Callouts are supported, but the value of the \fIcapture_top\fP field is -always 1, and the value of the \fIcapture_last\fP field is always -1. -.P -7. The \eC escape sequence, which (in the standard algorithm) always matches a -single data unit, even in UTF-8, UTF-16 or UTF-32 modes, is not supported in -these modes, because the alternative algorithm moves through the subject string -one character (not data unit) at a time, for all active paths through the tree. -.P -8. Except for (*FAIL), the backtracking control verbs such as (*PRUNE) are not -supported. (*FAIL) is supported, and behaves like a failing negative assertion. -. -. -.SH "ADVANTAGES OF THE ALTERNATIVE ALGORITHM" -.rs -.sp -Using the alternative matching algorithm provides the following advantages: -.P -1. All possible matches (at a single point in the subject) are automatically -found, and in particular, the longest match is found. To find more than one -match using the standard algorithm, you have to do kludgy things with -callouts. -.P -2. Because the alternative algorithm scans the subject string just once, and -never needs to backtrack (except for lookbehinds), it is possible to pass very -long subject strings to the matching function in several pieces, checking for -partial matching each time. Although it is possible to do multi-segment -matching using the standard algorithm by retaining partially matched -substrings, it is more complicated. The -.\" HREF -\fBpcrepartial\fP -.\" -documentation gives details of partial matching and discusses multi-segment -matching. -. -. -.SH "DISADVANTAGES OF THE ALTERNATIVE ALGORITHM" -.rs -.sp -The alternative algorithm suffers from a number of disadvantages: -.P -1. It is substantially slower than the standard algorithm. This is partly -because it has to search for all possible matches, but is also because it is -less susceptible to optimization. -.P -2. Capturing parentheses and back references are not supported. -.P -3. Although atomic groups are supported, their use does not provide the -performance advantage that it does for the standard algorithm. -. -. -.SH AUTHOR -.rs -.sp -.nf -Philip Hazel -University Computing Service -Cambridge CB2 3QH, England. -.fi -. -. -.SH REVISION -.rs -.sp -.nf -Last updated: 12 November 2013 -Copyright (c) 1997-2012 University of Cambridge. -.fi diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcrepartial.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcrepartial.3 deleted file mode 100644 index 14d0124f..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcrepartial.3 +++ /dev/null @@ -1,476 +0,0 @@ -.TH PCREPARTIAL 3 "02 July 2013" "PCRE 8.34" -.SH NAME -PCRE - Perl-compatible regular expressions -.SH "PARTIAL MATCHING IN PCRE" -.rs -.sp -In normal use of PCRE, if the subject string that is passed to a matching -function matches as far as it goes, but is too short to match the entire -pattern, PCRE_ERROR_NOMATCH is returned. There are circumstances where it might -be helpful to distinguish this case from other cases in which there is no -match. -.P -Consider, for example, an application where a human is required to type in data -for a field with specific formatting requirements. An example might be a date -in the form \fIddmmmyy\fP, defined by this pattern: -.sp - ^\ed?\ed(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)\ed\ed$ -.sp -If the application sees the user's keystrokes one by one, and can check that -what has been typed so far is potentially valid, it is able to raise an error -as soon as a mistake is made, by beeping and not reflecting the character that -has been typed, for example. This immediate feedback is likely to be a better -user interface than a check that is delayed until the entire string has been -entered. Partial matching can also be useful when the subject string is very -long and is not all available at once. -.P -PCRE supports partial matching by means of the PCRE_PARTIAL_SOFT and -PCRE_PARTIAL_HARD options, which can be set when calling any of the matching -functions. For backwards compatibility, PCRE_PARTIAL is a synonym for -PCRE_PARTIAL_SOFT. The essential difference between the two options is whether -or not a partial match is preferred to an alternative complete match, though -the details differ between the two types of matching function. If both options -are set, PCRE_PARTIAL_HARD takes precedence. -.P -If you want to use partial matching with just-in-time optimized code, you must -call \fBpcre_study()\fP, \fBpcre16_study()\fP or \fBpcre32_study()\fP with one -or both of these options: -.sp - PCRE_STUDY_JIT_PARTIAL_SOFT_COMPILE - PCRE_STUDY_JIT_PARTIAL_HARD_COMPILE -.sp -PCRE_STUDY_JIT_COMPILE should also be set if you are going to run non-partial -matches on the same pattern. If the appropriate JIT study mode has not been set -for a match, the interpretive matching code is used. -.P -Setting a partial matching option disables two of PCRE's standard -optimizations. PCRE remembers the last literal data unit in a pattern, and -abandons matching immediately if it is not present in the subject string. This -optimization cannot be used for a subject string that might match only -partially. If the pattern was studied, PCRE knows the minimum length of a -matching string, and does not bother to run the matching function on shorter -strings. This optimization is also disabled for partial matching. -. -. -.SH "PARTIAL MATCHING USING pcre_exec() OR pcre[16|32]_exec()" -.rs -.sp -A partial match occurs during a call to \fBpcre_exec()\fP or -\fBpcre[16|32]_exec()\fP when the end of the subject string is reached -successfully, but matching cannot continue because more characters are needed. -However, at least one character in the subject must have been inspected. This -character need not form part of the final matched string; lookbehind assertions -and the \eK escape sequence provide ways of inspecting characters before the -start of a matched substring. The requirement for inspecting at least one -character exists because an empty string can always be matched; without such a -restriction there would always be a partial match of an empty string at the end -of the subject. -.P -If there are at least two slots in the offsets vector when a partial match is -returned, the first slot is set to the offset of the earliest character that -was inspected. For convenience, the second offset points to the end of the -subject so that a substring can easily be identified. If there are at least -three slots in the offsets vector, the third slot is set to the offset of the -character where matching started. -.P -For the majority of patterns, the contents of the first and third slots will be -the same. However, for patterns that contain lookbehind assertions, or begin -with \eb or \eB, characters before the one where matching started may have been -inspected while carrying out the match. For example, consider this pattern: -.sp - /(?<=abc)123/ -.sp -This pattern matches "123", but only if it is preceded by "abc". If the subject -string is "xyzabc12", the first two offsets after a partial match are for the -substring "abc12", because all these characters were inspected. However, the -third offset is set to 6, because that is the offset where matching began. -.P -What happens when a partial match is identified depends on which of the two -partial matching options are set. -. -. -.SS "PCRE_PARTIAL_SOFT WITH pcre_exec() OR pcre[16|32]_exec()" -.rs -.sp -If PCRE_PARTIAL_SOFT is set when \fBpcre_exec()\fP or \fBpcre[16|32]_exec()\fP -identifies a partial match, the partial match is remembered, but matching -continues as normal, and other alternatives in the pattern are tried. If no -complete match can be found, PCRE_ERROR_PARTIAL is returned instead of -PCRE_ERROR_NOMATCH. -.P -This option is "soft" because it prefers a complete match over a partial match. -All the various matching items in a pattern behave as if the subject string is -potentially complete. For example, \ez, \eZ, and $ match at the end of the -subject, as normal, and for \eb and \eB the end of the subject is treated as a -non-alphanumeric. -.P -If there is more than one partial match, the first one that was found provides -the data that is returned. Consider this pattern: -.sp - /123\ew+X|dogY/ -.sp -If this is matched against the subject string "abc123dog", both -alternatives fail to match, but the end of the subject is reached during -matching, so PCRE_ERROR_PARTIAL is returned. The offsets are set to 3 and 9, -identifying "123dog" as the first partial match that was found. (In this -example, there are two partial matches, because "dog" on its own partially -matches the second alternative.) -. -. -.SS "PCRE_PARTIAL_HARD WITH pcre_exec() OR pcre[16|32]_exec()" -.rs -.sp -If PCRE_PARTIAL_HARD is set for \fBpcre_exec()\fP or \fBpcre[16|32]_exec()\fP, -PCRE_ERROR_PARTIAL is returned as soon as a partial match is found, without -continuing to search for possible complete matches. This option is "hard" -because it prefers an earlier partial match over a later complete match. For -this reason, the assumption is made that the end of the supplied subject string -may not be the true end of the available data, and so, if \ez, \eZ, \eb, \eB, -or $ are encountered at the end of the subject, the result is -PCRE_ERROR_PARTIAL, provided that at least one character in the subject has -been inspected. -.P -Setting PCRE_PARTIAL_HARD also affects the way UTF-8 and UTF-16 -subject strings are checked for validity. Normally, an invalid sequence -causes the error PCRE_ERROR_BADUTF8 or PCRE_ERROR_BADUTF16. However, in the -special case of a truncated character at the end of the subject, -PCRE_ERROR_SHORTUTF8 or PCRE_ERROR_SHORTUTF16 is returned when -PCRE_PARTIAL_HARD is set. -. -. -.SS "Comparing hard and soft partial matching" -.rs -.sp -The difference between the two partial matching options can be illustrated by a -pattern such as: -.sp - /dog(sbody)?/ -.sp -This matches either "dog" or "dogsbody", greedily (that is, it prefers the -longer string if possible). If it is matched against the string "dog" with -PCRE_PARTIAL_SOFT, it yields a complete match for "dog". However, if -PCRE_PARTIAL_HARD is set, the result is PCRE_ERROR_PARTIAL. On the other hand, -if the pattern is made ungreedy the result is different: -.sp - /dog(sbody)??/ -.sp -In this case the result is always a complete match because that is found first, -and matching never continues after finding a complete match. It might be easier -to follow this explanation by thinking of the two patterns like this: -.sp - /dog(sbody)?/ is the same as /dogsbody|dog/ - /dog(sbody)??/ is the same as /dog|dogsbody/ -.sp -The second pattern will never match "dogsbody", because it will always find the -shorter match first. -. -. -.SH "PARTIAL MATCHING USING pcre_dfa_exec() OR pcre[16|32]_dfa_exec()" -.rs -.sp -The DFA functions move along the subject string character by character, without -backtracking, searching for all possible matches simultaneously. If the end of -the subject is reached before the end of the pattern, there is the possibility -of a partial match, again provided that at least one character has been -inspected. -.P -When PCRE_PARTIAL_SOFT is set, PCRE_ERROR_PARTIAL is returned only if there -have been no complete matches. Otherwise, the complete matches are returned. -However, if PCRE_PARTIAL_HARD is set, a partial match takes precedence over any -complete matches. The portion of the string that was inspected when the longest -partial match was found is set as the first matching string, provided there are -at least two slots in the offsets vector. -.P -Because the DFA functions always search for all possible matches, and there is -no difference between greedy and ungreedy repetition, their behaviour is -different from the standard functions when PCRE_PARTIAL_HARD is set. Consider -the string "dog" matched against the ungreedy pattern shown above: -.sp - /dog(sbody)??/ -.sp -Whereas the standard functions stop as soon as they find the complete match for -"dog", the DFA functions also find the partial match for "dogsbody", and so -return that when PCRE_PARTIAL_HARD is set. -. -. -.SH "PARTIAL MATCHING AND WORD BOUNDARIES" -.rs -.sp -If a pattern ends with one of sequences \eb or \eB, which test for word -boundaries, partial matching with PCRE_PARTIAL_SOFT can give counter-intuitive -results. Consider this pattern: -.sp - /\ebcat\eb/ -.sp -This matches "cat", provided there is a word boundary at either end. If the -subject string is "the cat", the comparison of the final "t" with a following -character cannot take place, so a partial match is found. However, normal -matching carries on, and \eb matches at the end of the subject when the last -character is a letter, so a complete match is found. The result, therefore, is -\fInot\fP PCRE_ERROR_PARTIAL. Using PCRE_PARTIAL_HARD in this case does yield -PCRE_ERROR_PARTIAL, because then the partial match takes precedence. -. -. -.SH "FORMERLY RESTRICTED PATTERNS" -.rs -.sp -For releases of PCRE prior to 8.00, because of the way certain internal -optimizations were implemented in the \fBpcre_exec()\fP function, the -PCRE_PARTIAL option (predecessor of PCRE_PARTIAL_SOFT) could not be used with -all patterns. From release 8.00 onwards, the restrictions no longer apply, and -partial matching with can be requested for any pattern. -.P -Items that were formerly restricted were repeated single characters and -repeated metasequences. If PCRE_PARTIAL was set for a pattern that did not -conform to the restrictions, \fBpcre_exec()\fP returned the error code -PCRE_ERROR_BADPARTIAL (-13). This error code is no longer in use. The -PCRE_INFO_OKPARTIAL call to \fBpcre_fullinfo()\fP to find out if a compiled -pattern can be used for partial matching now always returns 1. -. -. -.SH "EXAMPLE OF PARTIAL MATCHING USING PCRETEST" -.rs -.sp -If the escape sequence \eP is present in a \fBpcretest\fP data line, the -PCRE_PARTIAL_SOFT option is used for the match. Here is a run of \fBpcretest\fP -that uses the date example quoted above: -.sp - re> /^\ed?\ed(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)\ed\ed$/ - data> 25jun04\eP - 0: 25jun04 - 1: jun - data> 25dec3\eP - Partial match: 23dec3 - data> 3ju\eP - Partial match: 3ju - data> 3juj\eP - No match - data> j\eP - No match -.sp -The first data string is matched completely, so \fBpcretest\fP shows the -matched substrings. The remaining four strings do not match the complete -pattern, but the first two are partial matches. Similar output is obtained -if DFA matching is used. -.P -If the escape sequence \eP is present more than once in a \fBpcretest\fP data -line, the PCRE_PARTIAL_HARD option is set for the match. -. -. -.SH "MULTI-SEGMENT MATCHING WITH pcre_dfa_exec() OR pcre[16|32]_dfa_exec()" -.rs -.sp -When a partial match has been found using a DFA matching function, it is -possible to continue the match by providing additional subject data and calling -the function again with the same compiled regular expression, this time setting -the PCRE_DFA_RESTART option. You must pass the same working space as before, -because this is where details of the previous partial match are stored. Here is -an example using \fBpcretest\fP, using the \eR escape sequence to set the -PCRE_DFA_RESTART option (\eD specifies the use of the DFA matching function): -.sp - re> /^\ed?\ed(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)\ed\ed$/ - data> 23ja\eP\eD - Partial match: 23ja - data> n05\eR\eD - 0: n05 -.sp -The first call has "23ja" as the subject, and requests partial matching; the -second call has "n05" as the subject for the continued (restarted) match. -Notice that when the match is complete, only the last part is shown; PCRE does -not retain the previously partially-matched string. It is up to the calling -program to do that if it needs to. -.P -That means that, for an unanchored pattern, if a continued match fails, it is -not possible to try again at a new starting point. All this facility is capable -of doing is continuing with the previous match attempt. In the previous -example, if the second set of data is "ug23" the result is no match, even -though there would be a match for "aug23" if the entire string were given at -once. Depending on the application, this may or may not be what you want. -The only way to allow for starting again at the next character is to retain the -matched part of the subject and try a new complete match. -.P -You can set the PCRE_PARTIAL_SOFT or PCRE_PARTIAL_HARD options with -PCRE_DFA_RESTART to continue partial matching over multiple segments. This -facility can be used to pass very long subject strings to the DFA matching -functions. -. -. -.SH "MULTI-SEGMENT MATCHING WITH pcre_exec() OR pcre[16|32]_exec()" -.rs -.sp -From release 8.00, the standard matching functions can also be used to do -multi-segment matching. Unlike the DFA functions, it is not possible to -restart the previous match with a new segment of data. Instead, new data must -be added to the previous subject string, and the entire match re-run, starting -from the point where the partial match occurred. Earlier data can be discarded. -.P -It is best to use PCRE_PARTIAL_HARD in this situation, because it does not -treat the end of a segment as the end of the subject when matching \ez, \eZ, -\eb, \eB, and $. Consider an unanchored pattern that matches dates: -.sp - re> /\ed?\ed(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)\ed\ed/ - data> The date is 23ja\eP\eP - Partial match: 23ja -.sp -At this stage, an application could discard the text preceding "23ja", add on -text from the next segment, and call the matching function again. Unlike the -DFA matching functions, the entire matching string must always be available, -and the complete matching process occurs for each call, so more memory and more -processing time is needed. -.P -\fBNote:\fP If the pattern contains lookbehind assertions, or \eK, or starts -with \eb or \eB, the string that is returned for a partial match includes -characters that precede the start of what would be returned for a complete -match, because it contains all the characters that were inspected during the -partial match. -. -. -.SH "ISSUES WITH MULTI-SEGMENT MATCHING" -.rs -.sp -Certain types of pattern may give problems with multi-segment matching, -whichever matching function is used. -.P -1. If the pattern contains a test for the beginning of a line, you need to pass -the PCRE_NOTBOL option when the subject string for any call does start at the -beginning of a line. There is also a PCRE_NOTEOL option, but in practice when -doing multi-segment matching you should be using PCRE_PARTIAL_HARD, which -includes the effect of PCRE_NOTEOL. -.P -2. Lookbehind assertions that have already been obeyed are catered for in the -offsets that are returned for a partial match. However a lookbehind assertion -later in the pattern could require even earlier characters to be inspected. You -can handle this case by using the PCRE_INFO_MAXLOOKBEHIND option of the -\fBpcre_fullinfo()\fP or \fBpcre[16|32]_fullinfo()\fP functions to obtain the -length of the longest lookbehind in the pattern. This length is given in -characters, not bytes. If you always retain at least that many characters -before the partially matched string, all should be well. (Of course, near the -start of the subject, fewer characters may be present; in that case all -characters should be retained.) -.P -From release 8.33, there is a more accurate way of deciding which characters to -retain. Instead of subtracting the length of the longest lookbehind from the -earliest inspected character (\fIoffsets[0]\fP), the match start position -(\fIoffsets[2]\fP) should be used, and the next match attempt started at the -\fIoffsets[2]\fP character by setting the \fIstartoffset\fP argument of -\fBpcre_exec()\fP or \fBpcre_dfa_exec()\fP. -.P -For example, if the pattern "(?<=123)abc" is partially -matched against the string "xx123a", the three offset values returned are 2, 6, -and 5. This indicates that the matching process that gave a partial match -started at offset 5, but the characters "123a" were all inspected. The maximum -lookbehind for that pattern is 3, so taking that away from 5 shows that we need -only keep "123a", and the next match attempt can be started at offset 3 (that -is, at "a") when further characters have been added. When the match start is -not the earliest inspected character, \fBpcretest\fP shows it explicitly: -.sp - re> "(?<=123)abc" - data> xx123a\eP\eP - Partial match at offset 5: 123a -.P -3. Because a partial match must always contain at least one character, what -might be considered a partial match of an empty string actually gives a "no -match" result. For example: -.sp - re> /c(?<=abc)x/ - data> ab\eP - No match -.sp -If the next segment begins "cx", a match should be found, but this will only -happen if characters from the previous segment are retained. For this reason, a -"no match" result should be interpreted as "partial match of an empty string" -when the pattern contains lookbehinds. -.P -4. Matching a subject string that is split into multiple segments may not -always produce exactly the same result as matching over one single long string, -especially when PCRE_PARTIAL_SOFT is used. The section "Partial Matching and -Word Boundaries" above describes an issue that arises if the pattern ends with -\eb or \eB. Another kind of difference may occur when there are multiple -matching possibilities, because (for PCRE_PARTIAL_SOFT) a partial match result -is given only when there are no completed matches. This means that as soon as -the shortest match has been found, continuation to a new subject segment is no -longer possible. Consider again this \fBpcretest\fP example: -.sp - re> /dog(sbody)?/ - data> dogsb\eP - 0: dog - data> do\eP\eD - Partial match: do - data> gsb\eR\eP\eD - 0: g - data> dogsbody\eD - 0: dogsbody - 1: dog -.sp -The first data line passes the string "dogsb" to a standard matching function, -setting the PCRE_PARTIAL_SOFT option. Although the string is a partial match -for "dogsbody", the result is not PCRE_ERROR_PARTIAL, because the shorter -string "dog" is a complete match. Similarly, when the subject is presented to -a DFA matching function in several parts ("do" and "gsb" being the first two) -the match stops when "dog" has been found, and it is not possible to continue. -On the other hand, if "dogsbody" is presented as a single string, a DFA -matching function finds both matches. -.P -Because of these problems, it is best to use PCRE_PARTIAL_HARD when matching -multi-segment data. The example above then behaves differently: -.sp - re> /dog(sbody)?/ - data> dogsb\eP\eP - Partial match: dogsb - data> do\eP\eD - Partial match: do - data> gsb\eR\eP\eP\eD - Partial match: gsb -.sp -5. Patterns that contain alternatives at the top level which do not all start -with the same pattern item may not work as expected when PCRE_DFA_RESTART is -used. For example, consider this pattern: -.sp - 1234|3789 -.sp -If the first part of the subject is "ABC123", a partial match of the first -alternative is found at offset 3. There is no partial match for the second -alternative, because such a match does not start at the same point in the -subject string. Attempting to continue with the string "7890" does not yield a -match because only those alternatives that match at one point in the subject -are remembered. The problem arises because the start of the second alternative -matches within the first alternative. There is no problem with anchored -patterns or patterns such as: -.sp - 1234|ABCD -.sp -where no string can be a partial match for both alternatives. This is not a -problem if a standard matching function is used, because the entire match has -to be rerun each time: -.sp - re> /1234|3789/ - data> ABC123\eP\eP - Partial match: 123 - data> 1237890 - 0: 3789 -.sp -Of course, instead of using PCRE_DFA_RESTART, the same technique of re-running -the entire match can also be used with the DFA matching functions. Another -possibility is to work with two buffers. If a partial match at offset \fIn\fP -in the first buffer is followed by "no match" when PCRE_DFA_RESTART is used on -the second buffer, you can then try a new match starting at offset \fIn+1\fP in -the first buffer. -. -. -.SH AUTHOR -.rs -.sp -.nf -Philip Hazel -University Computing Service -Cambridge CB2 3QH, England. -.fi -. -. -.SH REVISION -.rs -.sp -.nf -Last updated: 02 July 2013 -Copyright (c) 1997-2013 University of Cambridge. -.fi diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcrepattern.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcrepattern.3 deleted file mode 100644 index 97df217f..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcrepattern.3 +++ /dev/null @@ -1,3304 +0,0 @@ -.TH PCREPATTERN 3 "23 October 2016" "PCRE 8.40" -.SH NAME -PCRE - Perl-compatible regular expressions -.SH "PCRE REGULAR EXPRESSION DETAILS" -.rs -.sp -The syntax and semantics of the regular expressions that are supported by PCRE -are described in detail below. There is a quick-reference syntax summary in the -.\" HREF -\fBpcresyntax\fP -.\" -page. PCRE tries to match Perl syntax and semantics as closely as it can. PCRE -also supports some alternative regular expression syntax (which does not -conflict with the Perl syntax) in order to provide some compatibility with -regular expressions in Python, .NET, and Oniguruma. -.P -Perl's regular expressions are described in its own documentation, and -regular expressions in general are covered in a number of books, some of which -have copious examples. Jeffrey Friedl's "Mastering Regular Expressions", -published by O'Reilly, covers regular expressions in great detail. This -description of PCRE's regular expressions is intended as reference material. -.P -This document discusses the patterns that are supported by PCRE when one its -main matching functions, \fBpcre_exec()\fP (8-bit) or \fBpcre[16|32]_exec()\fP -(16- or 32-bit), is used. PCRE also has alternative matching functions, -\fBpcre_dfa_exec()\fP and \fBpcre[16|32_dfa_exec()\fP, which match using a -different algorithm that is not Perl-compatible. Some of the features discussed -below are not available when DFA matching is used. The advantages and -disadvantages of the alternative functions, and how they differ from the normal -functions, are discussed in the -.\" HREF -\fBpcrematching\fP -.\" -page. -. -. -.SH "SPECIAL START-OF-PATTERN ITEMS" -.rs -.sp -A number of options that can be passed to \fBpcre_compile()\fP can also be set -by special items at the start of a pattern. These are not Perl-compatible, but -are provided to make these options accessible to pattern writers who are not -able to change the program that processes the pattern. Any number of these -items may appear, but they must all be together right at the start of the -pattern string, and the letters must be in upper case. -. -. -.SS "UTF support" -.rs -.sp -The original operation of PCRE was on strings of one-byte characters. However, -there is now also support for UTF-8 strings in the original library, an -extra library that supports 16-bit and UTF-16 character strings, and a -third library that supports 32-bit and UTF-32 character strings. To use these -features, PCRE must be built to include appropriate support. When using UTF -strings you must either call the compiling function with the PCRE_UTF8, -PCRE_UTF16, or PCRE_UTF32 option, or the pattern must start with one of -these special sequences: -.sp - (*UTF8) - (*UTF16) - (*UTF32) - (*UTF) -.sp -(*UTF) is a generic sequence that can be used with any of the libraries. -Starting a pattern with such a sequence is equivalent to setting the relevant -option. How setting a UTF mode affects pattern matching is mentioned in several -places below. There is also a summary of features in the -.\" HREF -\fBpcreunicode\fP -.\" -page. -.P -Some applications that allow their users to supply patterns may wish to -restrict them to non-UTF data for security reasons. If the PCRE_NEVER_UTF -option is set at compile time, (*UTF) etc. are not allowed, and their -appearance causes an error. -. -. -.SS "Unicode property support" -.rs -.sp -Another special sequence that may appear at the start of a pattern is (*UCP). -This has the same effect as setting the PCRE_UCP option: it causes sequences -such as \ed and \ew to use Unicode properties to determine character types, -instead of recognizing only characters with codes less than 128 via a lookup -table. -. -. -.SS "Disabling auto-possessification" -.rs -.sp -If a pattern starts with (*NO_AUTO_POSSESS), it has the same effect as setting -the PCRE_NO_AUTO_POSSESS option at compile time. This stops PCRE from making -quantifiers possessive when what follows cannot match the repeated item. For -example, by default a+b is treated as a++b. For more details, see the -.\" HREF -\fBpcreapi\fP -.\" -documentation. -. -. -.SS "Disabling start-up optimizations" -.rs -.sp -If a pattern starts with (*NO_START_OPT), it has the same effect as setting the -PCRE_NO_START_OPTIMIZE option either at compile or matching time. This disables -several optimizations for quickly reaching "no match" results. For more -details, see the -.\" HREF -\fBpcreapi\fP -.\" -documentation. -. -. -.\" HTML -.SS "Newline conventions" -.rs -.sp -PCRE supports five different conventions for indicating line breaks in -strings: a single CR (carriage return) character, a single LF (linefeed) -character, the two-character sequence CRLF, any of the three preceding, or any -Unicode newline sequence. The -.\" HREF -\fBpcreapi\fP -.\" -page has -.\" HTML -.\" -further discussion -.\" -about newlines, and shows how to set the newline convention in the -\fIoptions\fP arguments for the compiling and matching functions. -.P -It is also possible to specify a newline convention by starting a pattern -string with one of the following five sequences: -.sp - (*CR) carriage return - (*LF) linefeed - (*CRLF) carriage return, followed by linefeed - (*ANYCRLF) any of the three above - (*ANY) all Unicode newline sequences -.sp -These override the default and the options given to the compiling function. For -example, on a Unix system where LF is the default newline sequence, the pattern -.sp - (*CR)a.b -.sp -changes the convention to CR. That pattern matches "a\enb" because LF is no -longer a newline. If more than one of these settings is present, the last one -is used. -.P -The newline convention affects where the circumflex and dollar assertions are -true. It also affects the interpretation of the dot metacharacter when -PCRE_DOTALL is not set, and the behaviour of \eN. However, it does not affect -what the \eR escape sequence matches. By default, this is any Unicode newline -sequence, for Perl compatibility. However, this can be changed; see the -description of \eR in the section entitled -.\" HTML -.\" -"Newline sequences" -.\" -below. A change of \eR setting can be combined with a change of newline -convention. -. -. -.SS "Setting match and recursion limits" -.rs -.sp -The caller of \fBpcre_exec()\fP can set a limit on the number of times the -internal \fBmatch()\fP function is called and on the maximum depth of -recursive calls. These facilities are provided to catch runaway matches that -are provoked by patterns with huge matching trees (a typical example is a -pattern with nested unlimited repeats) and to avoid running out of system stack -by too much recursion. When one of these limits is reached, \fBpcre_exec()\fP -gives an error return. The limits can also be set by items at the start of the -pattern of the form -.sp - (*LIMIT_MATCH=d) - (*LIMIT_RECURSION=d) -.sp -where d is any number of decimal digits. However, the value of the setting must -be less than the value set (or defaulted) by the caller of \fBpcre_exec()\fP -for it to have any effect. In other words, the pattern writer can lower the -limits set by the programmer, but not raise them. If there is more than one -setting of one of these limits, the lower value is used. -. -. -.SH "EBCDIC CHARACTER CODES" -.rs -.sp -PCRE can be compiled to run in an environment that uses EBCDIC as its character -code rather than ASCII or Unicode (typically a mainframe system). In the -sections below, character code values are ASCII or Unicode; in an EBCDIC -environment these characters may have different code values, and there are no -code points greater than 255. -. -. -.SH "CHARACTERS AND METACHARACTERS" -.rs -.sp -A regular expression is a pattern that is matched against a subject string from -left to right. Most characters stand for themselves in a pattern, and match the -corresponding characters in the subject. As a trivial example, the pattern -.sp - The quick brown fox -.sp -matches a portion of a subject string that is identical to itself. When -caseless matching is specified (the PCRE_CASELESS option), letters are matched -independently of case. In a UTF mode, PCRE always understands the concept of -case for characters whose values are less than 128, so caseless matching is -always possible. For characters with higher values, the concept of case is -supported if PCRE is compiled with Unicode property support, but not otherwise. -If you want to use caseless matching for characters 128 and above, you must -ensure that PCRE is compiled with Unicode property support as well as with -UTF support. -.P -The power of regular expressions comes from the ability to include alternatives -and repetitions in the pattern. These are encoded in the pattern by the use of -\fImetacharacters\fP, which do not stand for themselves but instead are -interpreted in some special way. -.P -There are two different sets of metacharacters: those that are recognized -anywhere in the pattern except within square brackets, and those that are -recognized within square brackets. Outside square brackets, the metacharacters -are as follows: -.sp - \e general escape character with several uses - ^ assert start of string (or line, in multiline mode) - $ assert end of string (or line, in multiline mode) - . match any character except newline (by default) - [ start character class definition - | start of alternative branch - ( start subpattern - ) end subpattern - ? extends the meaning of ( - also 0 or 1 quantifier - also quantifier minimizer - * 0 or more quantifier - + 1 or more quantifier - also "possessive quantifier" - { start min/max quantifier -.sp -Part of a pattern that is in square brackets is called a "character class". In -a character class the only metacharacters are: -.sp - \e general escape character - ^ negate the class, but only if the first character - - indicates character range -.\" JOIN - [ POSIX character class (only if followed by POSIX - syntax) - ] terminates the character class -.sp -The following sections describe the use of each of the metacharacters. -. -. -.SH BACKSLASH -.rs -.sp -The backslash character has several uses. Firstly, if it is followed by a -character that is not a number or a letter, it takes away any special meaning -that character may have. This use of backslash as an escape character applies -both inside and outside character classes. -.P -For example, if you want to match a * character, you write \e* in the pattern. -This escaping action applies whether or not the following character would -otherwise be interpreted as a metacharacter, so it is always safe to precede a -non-alphanumeric with backslash to specify that it stands for itself. In -particular, if you want to match a backslash, you write \e\e. -.P -In a UTF mode, only ASCII numbers and letters have any special meaning after a -backslash. All other characters (in particular, those whose codepoints are -greater than 127) are treated as literals. -.P -If a pattern is compiled with the PCRE_EXTENDED option, most white space in the -pattern (other than in a character class), and characters between a # outside a -character class and the next newline, inclusive, are ignored. An escaping -backslash can be used to include a white space or # character as part of the -pattern. -.P -If you want to remove the special meaning from a sequence of characters, you -can do so by putting them between \eQ and \eE. This is different from Perl in -that $ and @ are handled as literals in \eQ...\eE sequences in PCRE, whereas in -Perl, $ and @ cause variable interpolation. Note the following examples: -.sp - Pattern PCRE matches Perl matches -.sp -.\" JOIN - \eQabc$xyz\eE abc$xyz abc followed by the - contents of $xyz - \eQabc\e$xyz\eE abc\e$xyz abc\e$xyz - \eQabc\eE\e$\eQxyz\eE abc$xyz abc$xyz -.sp -The \eQ...\eE sequence is recognized both inside and outside character classes. -An isolated \eE that is not preceded by \eQ is ignored. If \eQ is not followed -by \eE later in the pattern, the literal interpretation continues to the end of -the pattern (that is, \eE is assumed at the end). If the isolated \eQ is inside -a character class, this causes an error, because the character class is not -terminated. -. -. -.\" HTML -.SS "Non-printing characters" -.rs -.sp -A second use of backslash provides a way of encoding non-printing characters -in patterns in a visible manner. There is no restriction on the appearance of -non-printing characters, apart from the binary zero that terminates a pattern, -but when a pattern is being prepared by text editing, it is often easier to use -one of the following escape sequences than the binary character it represents. -In an ASCII or Unicode environment, these escapes are as follows: -.sp - \ea alarm, that is, the BEL character (hex 07) - \ecx "control-x", where x is any ASCII character - \ee escape (hex 1B) - \ef form feed (hex 0C) - \en linefeed (hex 0A) - \er carriage return (hex 0D) - \et tab (hex 09) - \e0dd character with octal code 0dd - \eddd character with octal code ddd, or back reference - \eo{ddd..} character with octal code ddd.. - \exhh character with hex code hh - \ex{hhh..} character with hex code hhh.. (non-JavaScript mode) - \euhhhh character with hex code hhhh (JavaScript mode only) -.sp -The precise effect of \ecx on ASCII characters is as follows: if x is a lower -case letter, it is converted to upper case. Then bit 6 of the character (hex -40) is inverted. Thus \ecA to \ecZ become hex 01 to hex 1A (A is 41, Z is 5A), -but \ec{ becomes hex 3B ({ is 7B), and \ec; becomes hex 7B (; is 3B). If the -data item (byte or 16-bit value) following \ec has a value greater than 127, a -compile-time error occurs. This locks out non-ASCII characters in all modes. -.P -When PCRE is compiled in EBCDIC mode, \ea, \ee, \ef, \en, \er, and \et -generate the appropriate EBCDIC code values. The \ec escape is processed -as specified for Perl in the \fBperlebcdic\fP document. The only characters -that are allowed after \ec are A-Z, a-z, or one of @, [, \e, ], ^, _, or ?. Any -other character provokes a compile-time error. The sequence \ec@ encodes -character code 0; after \ec the letters (in either case) encode characters 1-26 -(hex 01 to hex 1A); [, \e, ], ^, and _ encode characters 27-31 (hex 1B to hex -1F), and \ec? becomes either 255 (hex FF) or 95 (hex 5F). -.P -Thus, apart from \ec?, these escapes generate the same character code values as -they do in an ASCII environment, though the meanings of the values mostly -differ. For example, \ecG always generates code value 7, which is BEL in ASCII -but DEL in EBCDIC. -.P -The sequence \ec? generates DEL (127, hex 7F) in an ASCII environment, but -because 127 is not a control character in EBCDIC, Perl makes it generate the -APC character. Unfortunately, there are several variants of EBCDIC. In most of -them the APC character has the value 255 (hex FF), but in the one Perl calls -POSIX-BC its value is 95 (hex 5F). If certain other characters have POSIX-BC -values, PCRE makes \ec? generate 95; otherwise it generates 255. -.P -After \e0 up to two further octal digits are read. If there are fewer than two -digits, just those that are present are used. Thus the sequence \e0\ex\e015 -specifies two binary zeros followed by a CR character (code value 13). Make -sure you supply two digits after the initial zero if the pattern character that -follows is itself an octal digit. -.P -The escape \eo must be followed by a sequence of octal digits, enclosed in -braces. An error occurs if this is not the case. This escape is a recent -addition to Perl; it provides way of specifying character code points as octal -numbers greater than 0777, and it also allows octal numbers and back references -to be unambiguously specified. -.P -For greater clarity and unambiguity, it is best to avoid following \e by a -digit greater than zero. Instead, use \eo{} or \ex{} to specify character -numbers, and \eg{} to specify back references. The following paragraphs -describe the old, ambiguous syntax. -.P -The handling of a backslash followed by a digit other than 0 is complicated, -and Perl has changed in recent releases, causing PCRE also to change. Outside a -character class, PCRE reads the digit and any following digits as a decimal -number. If the number is less than 8, or if there have been at least that many -previous capturing left parentheses in the expression, the entire sequence is -taken as a \fIback reference\fP. A description of how this works is given -.\" HTML -.\" -later, -.\" -following the discussion of -.\" HTML -.\" -parenthesized subpatterns. -.\" -.P -Inside a character class, or if the decimal number following \e is greater than -7 and there have not been that many capturing subpatterns, PCRE handles \e8 and -\e9 as the literal characters "8" and "9", and otherwise re-reads up to three -octal digits following the backslash, using them to generate a data character. -Any subsequent digits stand for themselves. For example: -.sp - \e040 is another way of writing an ASCII space -.\" JOIN - \e40 is the same, provided there are fewer than 40 - previous capturing subpatterns - \e7 is always a back reference -.\" JOIN - \e11 might be a back reference, or another way of - writing a tab - \e011 is always a tab - \e0113 is a tab followed by the character "3" -.\" JOIN - \e113 might be a back reference, otherwise the - character with octal code 113 -.\" JOIN - \e377 might be a back reference, otherwise - the value 255 (decimal) -.\" JOIN - \e81 is either a back reference, or the two - characters "8" and "1" -.sp -Note that octal values of 100 or greater that are specified using this syntax -must not be introduced by a leading zero, because no more than three octal -digits are ever read. -.P -By default, after \ex that is not followed by {, from zero to two hexadecimal -digits are read (letters can be in upper or lower case). Any number of -hexadecimal digits may appear between \ex{ and }. If a character other than -a hexadecimal digit appears between \ex{ and }, or if there is no terminating -}, an error occurs. -.P -If the PCRE_JAVASCRIPT_COMPAT option is set, the interpretation of \ex is -as just described only when it is followed by two hexadecimal digits. -Otherwise, it matches a literal "x" character. In JavaScript mode, support for -code points greater than 256 is provided by \eu, which must be followed by -four hexadecimal digits; otherwise it matches a literal "u" character. -.P -Characters whose value is less than 256 can be defined by either of the two -syntaxes for \ex (or by \eu in JavaScript mode). There is no difference in the -way they are handled. For example, \exdc is exactly the same as \ex{dc} (or -\eu00dc in JavaScript mode). -. -. -.SS "Constraints on character values" -.rs -.sp -Characters that are specified using octal or hexadecimal numbers are -limited to certain values, as follows: -.sp - 8-bit non-UTF mode less than 0x100 - 8-bit UTF-8 mode less than 0x10ffff and a valid codepoint - 16-bit non-UTF mode less than 0x10000 - 16-bit UTF-16 mode less than 0x10ffff and a valid codepoint - 32-bit non-UTF mode less than 0x100000000 - 32-bit UTF-32 mode less than 0x10ffff and a valid codepoint -.sp -Invalid Unicode codepoints are the range 0xd800 to 0xdfff (the so-called -"surrogate" codepoints), and 0xffef. -. -. -.SS "Escape sequences in character classes" -.rs -.sp -All the sequences that define a single character value can be used both inside -and outside character classes. In addition, inside a character class, \eb is -interpreted as the backspace character (hex 08). -.P -\eN is not allowed in a character class. \eB, \eR, and \eX are not special -inside a character class. Like other unrecognized escape sequences, they are -treated as the literal characters "B", "R", and "X" by default, but cause an -error if the PCRE_EXTRA option is set. Outside a character class, these -sequences have different meanings. -. -. -.SS "Unsupported escape sequences" -.rs -.sp -In Perl, the sequences \el, \eL, \eu, and \eU are recognized by its string -handler and used to modify the case of following characters. By default, PCRE -does not support these escape sequences. However, if the PCRE_JAVASCRIPT_COMPAT -option is set, \eU matches a "U" character, and \eu can be used to define a -character by code point, as described in the previous section. -. -. -.SS "Absolute and relative back references" -.rs -.sp -The sequence \eg followed by an unsigned or a negative number, optionally -enclosed in braces, is an absolute or relative back reference. A named back -reference can be coded as \eg{name}. Back references are discussed -.\" HTML -.\" -later, -.\" -following the discussion of -.\" HTML -.\" -parenthesized subpatterns. -.\" -. -. -.SS "Absolute and relative subroutine calls" -.rs -.sp -For compatibility with Oniguruma, the non-Perl syntax \eg followed by a name or -a number enclosed either in angle brackets or single quotes, is an alternative -syntax for referencing a subpattern as a "subroutine". Details are discussed -.\" HTML -.\" -later. -.\" -Note that \eg{...} (Perl syntax) and \eg<...> (Oniguruma syntax) are \fInot\fP -synonymous. The former is a back reference; the latter is a -.\" HTML -.\" -subroutine -.\" -call. -. -. -.\" HTML -.SS "Generic character types" -.rs -.sp -Another use of backslash is for specifying generic character types: -.sp - \ed any decimal digit - \eD any character that is not a decimal digit - \eh any horizontal white space character - \eH any character that is not a horizontal white space character - \es any white space character - \eS any character that is not a white space character - \ev any vertical white space character - \eV any character that is not a vertical white space character - \ew any "word" character - \eW any "non-word" character -.sp -There is also the single sequence \eN, which matches a non-newline character. -This is the same as -.\" HTML -.\" -the "." metacharacter -.\" -when PCRE_DOTALL is not set. Perl also uses \eN to match characters by name; -PCRE does not support this. -.P -Each pair of lower and upper case escape sequences partitions the complete set -of characters into two disjoint sets. Any given character matches one, and only -one, of each pair. The sequences can appear both inside and outside character -classes. They each match one character of the appropriate type. If the current -matching point is at the end of the subject string, all of them fail, because -there is no character to match. -.P -For compatibility with Perl, \es did not used to match the VT character (code -11), which made it different from the the POSIX "space" class. However, Perl -added VT at release 5.18, and PCRE followed suit at release 8.34. The default -\es characters are now HT (9), LF (10), VT (11), FF (12), CR (13), and space -(32), which are defined as white space in the "C" locale. This list may vary if -locale-specific matching is taking place. For example, in some locales the -"non-breaking space" character (\exA0) is recognized as white space, and in -others the VT character is not. -.P -A "word" character is an underscore or any character that is a letter or digit. -By default, the definition of letters and digits is controlled by PCRE's -low-valued character tables, and may vary if locale-specific matching is taking -place (see -.\" HTML -.\" -"Locale support" -.\" -in the -.\" HREF -\fBpcreapi\fP -.\" -page). For example, in a French locale such as "fr_FR" in Unix-like systems, -or "french" in Windows, some character codes greater than 127 are used for -accented letters, and these are then matched by \ew. The use of locales with -Unicode is discouraged. -.P -By default, characters whose code points are greater than 127 never match \ed, -\es, or \ew, and always match \eD, \eS, and \eW, although this may vary for -characters in the range 128-255 when locale-specific matching is happening. -These escape sequences retain their original meanings from before Unicode -support was available, mainly for efficiency reasons. If PCRE is compiled with -Unicode property support, and the PCRE_UCP option is set, the behaviour is -changed so that Unicode properties are used to determine character types, as -follows: -.sp - \ed any character that matches \ep{Nd} (decimal digit) - \es any character that matches \ep{Z} or \eh or \ev - \ew any character that matches \ep{L} or \ep{N}, plus underscore -.sp -The upper case escapes match the inverse sets of characters. Note that \ed -matches only decimal digits, whereas \ew matches any Unicode digit, as well as -any Unicode letter, and underscore. Note also that PCRE_UCP affects \eb, and -\eB because they are defined in terms of \ew and \eW. Matching these sequences -is noticeably slower when PCRE_UCP is set. -.P -The sequences \eh, \eH, \ev, and \eV are features that were added to Perl at -release 5.10. In contrast to the other sequences, which match only ASCII -characters by default, these always match certain high-valued code points, -whether or not PCRE_UCP is set. The horizontal space characters are: -.sp - U+0009 Horizontal tab (HT) - U+0020 Space - U+00A0 Non-break space - U+1680 Ogham space mark - U+180E Mongolian vowel separator - U+2000 En quad - U+2001 Em quad - U+2002 En space - U+2003 Em space - U+2004 Three-per-em space - U+2005 Four-per-em space - U+2006 Six-per-em space - U+2007 Figure space - U+2008 Punctuation space - U+2009 Thin space - U+200A Hair space - U+202F Narrow no-break space - U+205F Medium mathematical space - U+3000 Ideographic space -.sp -The vertical space characters are: -.sp - U+000A Linefeed (LF) - U+000B Vertical tab (VT) - U+000C Form feed (FF) - U+000D Carriage return (CR) - U+0085 Next line (NEL) - U+2028 Line separator - U+2029 Paragraph separator -.sp -In 8-bit, non-UTF-8 mode, only the characters with codepoints less than 256 are -relevant. -. -. -.\" HTML -.SS "Newline sequences" -.rs -.sp -Outside a character class, by default, the escape sequence \eR matches any -Unicode newline sequence. In 8-bit non-UTF-8 mode \eR is equivalent to the -following: -.sp - (?>\er\en|\en|\ex0b|\ef|\er|\ex85) -.sp -This is an example of an "atomic group", details of which are given -.\" HTML -.\" -below. -.\" -This particular group matches either the two-character sequence CR followed by -LF, or one of the single characters LF (linefeed, U+000A), VT (vertical tab, -U+000B), FF (form feed, U+000C), CR (carriage return, U+000D), or NEL (next -line, U+0085). The two-character sequence is treated as a single unit that -cannot be split. -.P -In other modes, two additional characters whose codepoints are greater than 255 -are added: LS (line separator, U+2028) and PS (paragraph separator, U+2029). -Unicode character property support is not needed for these characters to be -recognized. -.P -It is possible to restrict \eR to match only CR, LF, or CRLF (instead of the -complete set of Unicode line endings) by setting the option PCRE_BSR_ANYCRLF -either at compile time or when the pattern is matched. (BSR is an abbrevation -for "backslash R".) This can be made the default when PCRE is built; if this is -the case, the other behaviour can be requested via the PCRE_BSR_UNICODE option. -It is also possible to specify these settings by starting a pattern string with -one of the following sequences: -.sp - (*BSR_ANYCRLF) CR, LF, or CRLF only - (*BSR_UNICODE) any Unicode newline sequence -.sp -These override the default and the options given to the compiling function, but -they can themselves be overridden by options given to a matching function. Note -that these special settings, which are not Perl-compatible, are recognized only -at the very start of a pattern, and that they must be in upper case. If more -than one of them is present, the last one is used. They can be combined with a -change of newline convention; for example, a pattern can start with: -.sp - (*ANY)(*BSR_ANYCRLF) -.sp -They can also be combined with the (*UTF8), (*UTF16), (*UTF32), (*UTF) or -(*UCP) special sequences. Inside a character class, \eR is treated as an -unrecognized escape sequence, and so matches the letter "R" by default, but -causes an error if PCRE_EXTRA is set. -. -. -.\" HTML -.SS Unicode character properties -.rs -.sp -When PCRE is built with Unicode character property support, three additional -escape sequences that match characters with specific properties are available. -When in 8-bit non-UTF-8 mode, these sequences are of course limited to testing -characters whose codepoints are less than 256, but they do work in this mode. -The extra escape sequences are: -.sp - \ep{\fIxx\fP} a character with the \fIxx\fP property - \eP{\fIxx\fP} a character without the \fIxx\fP property - \eX a Unicode extended grapheme cluster -.sp -The property names represented by \fIxx\fP above are limited to the Unicode -script names, the general category properties, "Any", which matches any -character (including newline), and some special PCRE properties (described -in the -.\" HTML -.\" -next section). -.\" -Other Perl properties such as "InMusicalSymbols" are not currently supported by -PCRE. Note that \eP{Any} does not match any characters, so always causes a -match failure. -.P -Sets of Unicode characters are defined as belonging to certain scripts. A -character from one of these sets can be matched using a script name. For -example: -.sp - \ep{Greek} - \eP{Han} -.sp -Those that are not part of an identified script are lumped together as -"Common". The current list of scripts is: -.P -Arabic, -Armenian, -Avestan, -Balinese, -Bamum, -Bassa_Vah, -Batak, -Bengali, -Bopomofo, -Brahmi, -Braille, -Buginese, -Buhid, -Canadian_Aboriginal, -Carian, -Caucasian_Albanian, -Chakma, -Cham, -Cherokee, -Common, -Coptic, -Cuneiform, -Cypriot, -Cyrillic, -Deseret, -Devanagari, -Duployan, -Egyptian_Hieroglyphs, -Elbasan, -Ethiopic, -Georgian, -Glagolitic, -Gothic, -Grantha, -Greek, -Gujarati, -Gurmukhi, -Han, -Hangul, -Hanunoo, -Hebrew, -Hiragana, -Imperial_Aramaic, -Inherited, -Inscriptional_Pahlavi, -Inscriptional_Parthian, -Javanese, -Kaithi, -Kannada, -Katakana, -Kayah_Li, -Kharoshthi, -Khmer, -Khojki, -Khudawadi, -Lao, -Latin, -Lepcha, -Limbu, -Linear_A, -Linear_B, -Lisu, -Lycian, -Lydian, -Mahajani, -Malayalam, -Mandaic, -Manichaean, -Meetei_Mayek, -Mende_Kikakui, -Meroitic_Cursive, -Meroitic_Hieroglyphs, -Miao, -Modi, -Mongolian, -Mro, -Myanmar, -Nabataean, -New_Tai_Lue, -Nko, -Ogham, -Ol_Chiki, -Old_Italic, -Old_North_Arabian, -Old_Permic, -Old_Persian, -Old_South_Arabian, -Old_Turkic, -Oriya, -Osmanya, -Pahawh_Hmong, -Palmyrene, -Pau_Cin_Hau, -Phags_Pa, -Phoenician, -Psalter_Pahlavi, -Rejang, -Runic, -Samaritan, -Saurashtra, -Sharada, -Shavian, -Siddham, -Sinhala, -Sora_Sompeng, -Sundanese, -Syloti_Nagri, -Syriac, -Tagalog, -Tagbanwa, -Tai_Le, -Tai_Tham, -Tai_Viet, -Takri, -Tamil, -Telugu, -Thaana, -Thai, -Tibetan, -Tifinagh, -Tirhuta, -Ugaritic, -Vai, -Warang_Citi, -Yi. -.P -Each character has exactly one Unicode general category property, specified by -a two-letter abbreviation. For compatibility with Perl, negation can be -specified by including a circumflex between the opening brace and the property -name. For example, \ep{^Lu} is the same as \eP{Lu}. -.P -If only one letter is specified with \ep or \eP, it includes all the general -category properties that start with that letter. In this case, in the absence -of negation, the curly brackets in the escape sequence are optional; these two -examples have the same effect: -.sp - \ep{L} - \epL -.sp -The following general category property codes are supported: -.sp - C Other - Cc Control - Cf Format - Cn Unassigned - Co Private use - Cs Surrogate -.sp - L Letter - Ll Lower case letter - Lm Modifier letter - Lo Other letter - Lt Title case letter - Lu Upper case letter -.sp - M Mark - Mc Spacing mark - Me Enclosing mark - Mn Non-spacing mark -.sp - N Number - Nd Decimal number - Nl Letter number - No Other number -.sp - P Punctuation - Pc Connector punctuation - Pd Dash punctuation - Pe Close punctuation - Pf Final punctuation - Pi Initial punctuation - Po Other punctuation - Ps Open punctuation -.sp - S Symbol - Sc Currency symbol - Sk Modifier symbol - Sm Mathematical symbol - So Other symbol -.sp - Z Separator - Zl Line separator - Zp Paragraph separator - Zs Space separator -.sp -The special property L& is also supported: it matches a character that has -the Lu, Ll, or Lt property, in other words, a letter that is not classified as -a modifier or "other". -.P -The Cs (Surrogate) property applies only to characters in the range U+D800 to -U+DFFF. Such characters are not valid in Unicode strings and so -cannot be tested by PCRE, unless UTF validity checking has been turned off -(see the discussion of PCRE_NO_UTF8_CHECK, PCRE_NO_UTF16_CHECK and -PCRE_NO_UTF32_CHECK in the -.\" HREF -\fBpcreapi\fP -.\" -page). Perl does not support the Cs property. -.P -The long synonyms for property names that Perl supports (such as \ep{Letter}) -are not supported by PCRE, nor is it permitted to prefix any of these -properties with "Is". -.P -No character that is in the Unicode table has the Cn (unassigned) property. -Instead, this property is assumed for any code point that is not in the -Unicode table. -.P -Specifying caseless matching does not affect these escape sequences. For -example, \ep{Lu} always matches only upper case letters. This is different from -the behaviour of current versions of Perl. -.P -Matching characters by Unicode property is not fast, because PCRE has to do a -multistage table lookup in order to find a character's property. That is why -the traditional escape sequences such as \ed and \ew do not use Unicode -properties in PCRE by default, though you can make them do so by setting the -PCRE_UCP option or by starting the pattern with (*UCP). -. -. -.SS Extended grapheme clusters -.rs -.sp -The \eX escape matches any number of Unicode characters that form an "extended -grapheme cluster", and treats the sequence as an atomic group -.\" HTML -.\" -(see below). -.\" -Up to and including release 8.31, PCRE matched an earlier, simpler definition -that was equivalent to -.sp - (?>\ePM\epM*) -.sp -That is, it matched a character without the "mark" property, followed by zero -or more characters with the "mark" property. Characters with the "mark" -property are typically non-spacing accents that affect the preceding character. -.P -This simple definition was extended in Unicode to include more complicated -kinds of composite character by giving each character a grapheme breaking -property, and creating rules that use these properties to define the boundaries -of extended grapheme clusters. In releases of PCRE later than 8.31, \eX matches -one of these clusters. -.P -\eX always matches at least one character. Then it decides whether to add -additional characters according to the following rules for ending a cluster: -.P -1. End at the end of the subject string. -.P -2. Do not end between CR and LF; otherwise end after any control character. -.P -3. Do not break Hangul (a Korean script) syllable sequences. Hangul characters -are of five types: L, V, T, LV, and LVT. An L character may be followed by an -L, V, LV, or LVT character; an LV or V character may be followed by a V or T -character; an LVT or T character may be follwed only by a T character. -.P -4. Do not end before extending characters or spacing marks. Characters with -the "mark" property always have the "extend" grapheme breaking property. -.P -5. Do not end after prepend characters. -.P -6. Otherwise, end the cluster. -. -. -.\" HTML -.SS PCRE's additional properties -.rs -.sp -As well as the standard Unicode properties described above, PCRE supports four -more that make it possible to convert traditional escape sequences such as \ew -and \es to use Unicode properties. PCRE uses these non-standard, non-Perl -properties internally when PCRE_UCP is set. However, they may also be used -explicitly. These properties are: -.sp - Xan Any alphanumeric character - Xps Any POSIX space character - Xsp Any Perl space character - Xwd Any Perl "word" character -.sp -Xan matches characters that have either the L (letter) or the N (number) -property. Xps matches the characters tab, linefeed, vertical tab, form feed, or -carriage return, and any other character that has the Z (separator) property. -Xsp is the same as Xps; it used to exclude vertical tab, for Perl -compatibility, but Perl changed, and so PCRE followed at release 8.34. Xwd -matches the same characters as Xan, plus underscore. -.P -There is another non-standard property, Xuc, which matches any character that -can be represented by a Universal Character Name in C++ and other programming -languages. These are the characters $, @, ` (grave accent), and all characters -with Unicode code points greater than or equal to U+00A0, except for the -surrogates U+D800 to U+DFFF. Note that most base (ASCII) characters are -excluded. (Universal Character Names are of the form \euHHHH or \eUHHHHHHHH -where H is a hexadecimal digit. Note that the Xuc property does not match these -sequences but the characters that they represent.) -. -. -.\" HTML -.SS "Resetting the match start" -.rs -.sp -The escape sequence \eK causes any previously matched characters not to be -included in the final matched sequence. For example, the pattern: -.sp - foo\eKbar -.sp -matches "foobar", but reports that it has matched "bar". This feature is -similar to a lookbehind assertion -.\" HTML -.\" -(described below). -.\" -However, in this case, the part of the subject before the real match does not -have to be of fixed length, as lookbehind assertions do. The use of \eK does -not interfere with the setting of -.\" HTML -.\" -captured substrings. -.\" -For example, when the pattern -.sp - (foo)\eKbar -.sp -matches "foobar", the first substring is still set to "foo". -.P -Perl documents that the use of \eK within assertions is "not well defined". In -PCRE, \eK is acted upon when it occurs inside positive assertions, but is -ignored in negative assertions. Note that when a pattern such as (?=ab\eK) -matches, the reported start of the match can be greater than the end of the -match. -. -. -.\" HTML -.SS "Simple assertions" -.rs -.sp -The final use of backslash is for certain simple assertions. An assertion -specifies a condition that has to be met at a particular point in a match, -without consuming any characters from the subject string. The use of -subpatterns for more complicated assertions is described -.\" HTML -.\" -below. -.\" -The backslashed assertions are: -.sp - \eb matches at a word boundary - \eB matches when not at a word boundary - \eA matches at the start of the subject - \eZ matches at the end of the subject - also matches before a newline at the end of the subject - \ez matches only at the end of the subject - \eG matches at the first matching position in the subject -.sp -Inside a character class, \eb has a different meaning; it matches the backspace -character. If any other of these assertions appears in a character class, by -default it matches the corresponding literal character (for example, \eB -matches the letter B). However, if the PCRE_EXTRA option is set, an "invalid -escape sequence" error is generated instead. -.P -A word boundary is a position in the subject string where the current character -and the previous character do not both match \ew or \eW (i.e. one matches -\ew and the other matches \eW), or the start or end of the string if the -first or last character matches \ew, respectively. In a UTF mode, the meanings -of \ew and \eW can be changed by setting the PCRE_UCP option. When this is -done, it also affects \eb and \eB. Neither PCRE nor Perl has a separate "start -of word" or "end of word" metasequence. However, whatever follows \eb normally -determines which it is. For example, the fragment \eba matches "a" at the start -of a word. -.P -The \eA, \eZ, and \ez assertions differ from the traditional circumflex and -dollar (described in the next section) in that they only ever match at the very -start and end of the subject string, whatever options are set. Thus, they are -independent of multiline mode. These three assertions are not affected by the -PCRE_NOTBOL or PCRE_NOTEOL options, which affect only the behaviour of the -circumflex and dollar metacharacters. However, if the \fIstartoffset\fP -argument of \fBpcre_exec()\fP is non-zero, indicating that matching is to start -at a point other than the beginning of the subject, \eA can never match. The -difference between \eZ and \ez is that \eZ matches before a newline at the end -of the string as well as at the very end, whereas \ez matches only at the end. -.P -The \eG assertion is true only when the current matching position is at the -start point of the match, as specified by the \fIstartoffset\fP argument of -\fBpcre_exec()\fP. It differs from \eA when the value of \fIstartoffset\fP is -non-zero. By calling \fBpcre_exec()\fP multiple times with appropriate -arguments, you can mimic Perl's /g option, and it is in this kind of -implementation where \eG can be useful. -.P -Note, however, that PCRE's interpretation of \eG, as the start of the current -match, is subtly different from Perl's, which defines it as the end of the -previous match. In Perl, these can be different when the previously matched -string was empty. Because PCRE does just one match at a time, it cannot -reproduce this behaviour. -.P -If all the alternatives of a pattern begin with \eG, the expression is anchored -to the starting match position, and the "anchored" flag is set in the compiled -regular expression. -. -. -.SH "CIRCUMFLEX AND DOLLAR" -.rs -.sp -The circumflex and dollar metacharacters are zero-width assertions. That is, -they test for a particular condition being true without consuming any -characters from the subject string. -.P -Outside a character class, in the default matching mode, the circumflex -character is an assertion that is true only if the current matching point is at -the start of the subject string. If the \fIstartoffset\fP argument of -\fBpcre_exec()\fP is non-zero, circumflex can never match if the PCRE_MULTILINE -option is unset. Inside a character class, circumflex has an entirely different -meaning -.\" HTML -.\" -(see below). -.\" -.P -Circumflex need not be the first character of the pattern if a number of -alternatives are involved, but it should be the first thing in each alternative -in which it appears if the pattern is ever to match that branch. If all -possible alternatives start with a circumflex, that is, if the pattern is -constrained to match only at the start of the subject, it is said to be an -"anchored" pattern. (There are also other constructs that can cause a pattern -to be anchored.) -.P -The dollar character is an assertion that is true only if the current matching -point is at the end of the subject string, or immediately before a newline at -the end of the string (by default). Note, however, that it does not actually -match the newline. Dollar need not be the last character of the pattern if a -number of alternatives are involved, but it should be the last item in any -branch in which it appears. Dollar has no special meaning in a character class. -.P -The meaning of dollar can be changed so that it matches only at the very end of -the string, by setting the PCRE_DOLLAR_ENDONLY option at compile time. This -does not affect the \eZ assertion. -.P -The meanings of the circumflex and dollar characters are changed if the -PCRE_MULTILINE option is set. When this is the case, a circumflex matches -immediately after internal newlines as well as at the start of the subject -string. It does not match after a newline that ends the string. A dollar -matches before any newlines in the string, as well as at the very end, when -PCRE_MULTILINE is set. When newline is specified as the two-character -sequence CRLF, isolated CR and LF characters do not indicate newlines. -.P -For example, the pattern /^abc$/ matches the subject string "def\enabc" (where -\en represents a newline) in multiline mode, but not otherwise. Consequently, -patterns that are anchored in single line mode because all branches start with -^ are not anchored in multiline mode, and a match for circumflex is possible -when the \fIstartoffset\fP argument of \fBpcre_exec()\fP is non-zero. The -PCRE_DOLLAR_ENDONLY option is ignored if PCRE_MULTILINE is set. -.P -Note that the sequences \eA, \eZ, and \ez can be used to match the start and -end of the subject in both modes, and if all branches of a pattern start with -\eA it is always anchored, whether or not PCRE_MULTILINE is set. -. -. -.\" HTML -.SH "FULL STOP (PERIOD, DOT) AND \eN" -.rs -.sp -Outside a character class, a dot in the pattern matches any one character in -the subject string except (by default) a character that signifies the end of a -line. -.P -When a line ending is defined as a single character, dot never matches that -character; when the two-character sequence CRLF is used, dot does not match CR -if it is immediately followed by LF, but otherwise it matches all characters -(including isolated CRs and LFs). When any Unicode line endings are being -recognized, dot does not match CR or LF or any of the other line ending -characters. -.P -The behaviour of dot with regard to newlines can be changed. If the PCRE_DOTALL -option is set, a dot matches any one character, without exception. If the -two-character sequence CRLF is present in the subject string, it takes two dots -to match it. -.P -The handling of dot is entirely independent of the handling of circumflex and -dollar, the only relationship being that they both involve newlines. Dot has no -special meaning in a character class. -.P -The escape sequence \eN behaves like a dot, except that it is not affected by -the PCRE_DOTALL option. In other words, it matches any character except one -that signifies the end of a line. Perl also uses \eN to match characters by -name; PCRE does not support this. -. -. -.SH "MATCHING A SINGLE DATA UNIT" -.rs -.sp -Outside a character class, the escape sequence \eC matches any one data unit, -whether or not a UTF mode is set. In the 8-bit library, one data unit is one -byte; in the 16-bit library it is a 16-bit unit; in the 32-bit library it is -a 32-bit unit. Unlike a dot, \eC always -matches line-ending characters. The feature is provided in Perl in order to -match individual bytes in UTF-8 mode, but it is unclear how it can usefully be -used. Because \eC breaks up characters into individual data units, matching one -unit with \eC in a UTF mode means that the rest of the string may start with a -malformed UTF character. This has undefined results, because PCRE assumes that -it is dealing with valid UTF strings (and by default it checks this at the -start of processing unless the PCRE_NO_UTF8_CHECK, PCRE_NO_UTF16_CHECK or -PCRE_NO_UTF32_CHECK option is used). -.P -PCRE does not allow \eC to appear in lookbehind assertions -.\" HTML -.\" -(described below) -.\" -in a UTF mode, because this would make it impossible to calculate the length of -the lookbehind. -.P -In general, the \eC escape sequence is best avoided. However, one -way of using it that avoids the problem of malformed UTF characters is to use a -lookahead to check the length of the next character, as in this pattern, which -could be used with a UTF-8 string (ignore white space and line breaks): -.sp - (?| (?=[\ex00-\ex7f])(\eC) | - (?=[\ex80-\ex{7ff}])(\eC)(\eC) | - (?=[\ex{800}-\ex{ffff}])(\eC)(\eC)(\eC) | - (?=[\ex{10000}-\ex{1fffff}])(\eC)(\eC)(\eC)(\eC)) -.sp -A group that starts with (?| resets the capturing parentheses numbers in each -alternative (see -.\" HTML -.\" -"Duplicate Subpattern Numbers" -.\" -below). The assertions at the start of each branch check the next UTF-8 -character for values whose encoding uses 1, 2, 3, or 4 bytes, respectively. The -character's individual bytes are then captured by the appropriate number of -groups. -. -. -.\" HTML -.SH "SQUARE BRACKETS AND CHARACTER CLASSES" -.rs -.sp -An opening square bracket introduces a character class, terminated by a closing -square bracket. A closing square bracket on its own is not special by default. -However, if the PCRE_JAVASCRIPT_COMPAT option is set, a lone closing square -bracket causes a compile-time error. If a closing square bracket is required as -a member of the class, it should be the first data character in the class -(after an initial circumflex, if present) or escaped with a backslash. -.P -A character class matches a single character in the subject. In a UTF mode, the -character may be more than one data unit long. A matched character must be in -the set of characters defined by the class, unless the first character in the -class definition is a circumflex, in which case the subject character must not -be in the set defined by the class. If a circumflex is actually required as a -member of the class, ensure it is not the first character, or escape it with a -backslash. -.P -For example, the character class [aeiou] matches any lower case vowel, while -[^aeiou] matches any character that is not a lower case vowel. Note that a -circumflex is just a convenient notation for specifying the characters that -are in the class by enumerating those that are not. A class that starts with a -circumflex is not an assertion; it still consumes a character from the subject -string, and therefore it fails if the current pointer is at the end of the -string. -.P -In UTF-8 (UTF-16, UTF-32) mode, characters with values greater than 255 (0xffff) -can be included in a class as a literal string of data units, or by using the -\ex{ escaping mechanism. -.P -When caseless matching is set, any letters in a class represent both their -upper case and lower case versions, so for example, a caseless [aeiou] matches -"A" as well as "a", and a caseless [^aeiou] does not match "A", whereas a -caseful version would. In a UTF mode, PCRE always understands the concept of -case for characters whose values are less than 128, so caseless matching is -always possible. For characters with higher values, the concept of case is -supported if PCRE is compiled with Unicode property support, but not otherwise. -If you want to use caseless matching in a UTF mode for characters 128 and -above, you must ensure that PCRE is compiled with Unicode property support as -well as with UTF support. -.P -Characters that might indicate line breaks are never treated in any special way -when matching character classes, whatever line-ending sequence is in use, and -whatever setting of the PCRE_DOTALL and PCRE_MULTILINE options is used. A class -such as [^a] always matches one of these characters. -.P -The minus (hyphen) character can be used to specify a range of characters in a -character class. For example, [d-m] matches any letter between d and m, -inclusive. If a minus character is required in a class, it must be escaped with -a backslash or appear in a position where it cannot be interpreted as -indicating a range, typically as the first or last character in the class, or -immediately after a range. For example, [b-d-z] matches letters in the range b -to d, a hyphen character, or z. -.P -It is not possible to have the literal character "]" as the end character of a -range. A pattern such as [W-]46] is interpreted as a class of two characters -("W" and "-") followed by a literal string "46]", so it would match "W46]" or -"-46]". However, if the "]" is escaped with a backslash it is interpreted as -the end of range, so [W-\e]46] is interpreted as a class containing a range -followed by two other characters. The octal or hexadecimal representation of -"]" can also be used to end a range. -.P -An error is generated if a POSIX character class (see below) or an escape -sequence other than one that defines a single character appears at a point -where a range ending character is expected. For example, [z-\exff] is valid, -but [A-\ed] and [A-[:digit:]] are not. -.P -Ranges operate in the collating sequence of character values. They can also be -used for characters specified numerically, for example [\e000-\e037]. Ranges -can include any characters that are valid for the current mode. -.P -If a range that includes letters is used when caseless matching is set, it -matches the letters in either case. For example, [W-c] is equivalent to -[][\e\e^_`wxyzabc], matched caselessly, and in a non-UTF mode, if character -tables for a French locale are in use, [\exc8-\excb] matches accented E -characters in both cases. In UTF modes, PCRE supports the concept of case for -characters with values greater than 128 only when it is compiled with Unicode -property support. -.P -The character escape sequences \ed, \eD, \eh, \eH, \ep, \eP, \es, \eS, \ev, -\eV, \ew, and \eW may appear in a character class, and add the characters that -they match to the class. For example, [\edABCDEF] matches any hexadecimal -digit. In UTF modes, the PCRE_UCP option affects the meanings of \ed, \es, \ew -and their upper case partners, just as it does when they appear outside a -character class, as described in the section entitled -.\" HTML -.\" -"Generic character types" -.\" -above. The escape sequence \eb has a different meaning inside a character -class; it matches the backspace character. The sequences \eB, \eN, \eR, and \eX -are not special inside a character class. Like any other unrecognized escape -sequences, they are treated as the literal characters "B", "N", "R", and "X" by -default, but cause an error if the PCRE_EXTRA option is set. -.P -A circumflex can conveniently be used with the upper case character types to -specify a more restricted set of characters than the matching lower case type. -For example, the class [^\eW_] matches any letter or digit, but not underscore, -whereas [\ew] includes underscore. A positive character class should be read as -"something OR something OR ..." and a negative class as "NOT something AND NOT -something AND NOT ...". -.P -The only metacharacters that are recognized in character classes are backslash, -hyphen (only where it can be interpreted as specifying a range), circumflex -(only at the start), opening square bracket (only when it can be interpreted as -introducing a POSIX class name, or for a special compatibility feature - see -the next two sections), and the terminating closing square bracket. However, -escaping other non-alphanumeric characters does no harm. -. -. -.SH "POSIX CHARACTER CLASSES" -.rs -.sp -Perl supports the POSIX notation for character classes. This uses names -enclosed by [: and :] within the enclosing square brackets. PCRE also supports -this notation. For example, -.sp - [01[:alpha:]%] -.sp -matches "0", "1", any alphabetic character, or "%". The supported class names -are: -.sp - alnum letters and digits - alpha letters - ascii character codes 0 - 127 - blank space or tab only - cntrl control characters - digit decimal digits (same as \ed) - graph printing characters, excluding space - lower lower case letters - print printing characters, including space - punct printing characters, excluding letters and digits and space - space white space (the same as \es from PCRE 8.34) - upper upper case letters - word "word" characters (same as \ew) - xdigit hexadecimal digits -.sp -The default "space" characters are HT (9), LF (10), VT (11), FF (12), CR (13), -and space (32). If locale-specific matching is taking place, the list of space -characters may be different; there may be fewer or more of them. "Space" used -to be different to \es, which did not include VT, for Perl compatibility. -However, Perl changed at release 5.18, and PCRE followed at release 8.34. -"Space" and \es now match the same set of characters. -.P -The name "word" is a Perl extension, and "blank" is a GNU extension from Perl -5.8. Another Perl extension is negation, which is indicated by a ^ character -after the colon. For example, -.sp - [12[:^digit:]] -.sp -matches "1", "2", or any non-digit. PCRE (and Perl) also recognize the POSIX -syntax [.ch.] and [=ch=] where "ch" is a "collating element", but these are not -supported, and an error is given if they are encountered. -.P -By default, characters with values greater than 128 do not match any of the -POSIX character classes. However, if the PCRE_UCP option is passed to -\fBpcre_compile()\fP, some of the classes are changed so that Unicode character -properties are used. This is achieved by replacing certain POSIX classes by -other sequences, as follows: -.sp - [:alnum:] becomes \ep{Xan} - [:alpha:] becomes \ep{L} - [:blank:] becomes \eh - [:digit:] becomes \ep{Nd} - [:lower:] becomes \ep{Ll} - [:space:] becomes \ep{Xps} - [:upper:] becomes \ep{Lu} - [:word:] becomes \ep{Xwd} -.sp -Negated versions, such as [:^alpha:] use \eP instead of \ep. Three other POSIX -classes are handled specially in UCP mode: -.TP 10 -[:graph:] -This matches characters that have glyphs that mark the page when printed. In -Unicode property terms, it matches all characters with the L, M, N, P, S, or Cf -properties, except for: -.sp - U+061C Arabic Letter Mark - U+180E Mongolian Vowel Separator - U+2066 - U+2069 Various "isolate"s -.sp -.TP 10 -[:print:] -This matches the same characters as [:graph:] plus space characters that are -not controls, that is, characters with the Zs property. -.TP 10 -[:punct:] -This matches all characters that have the Unicode P (punctuation) property, -plus those characters whose code points are less than 128 that have the S -(Symbol) property. -.P -The other POSIX classes are unchanged, and match only characters with code -points less than 128. -. -. -.SH "COMPATIBILITY FEATURE FOR WORD BOUNDARIES" -.rs -.sp -In the POSIX.2 compliant library that was included in 4.4BSD Unix, the ugly -syntax [[:<:]] and [[:>:]] is used for matching "start of word" and "end of -word". PCRE treats these items as follows: -.sp - [[:<:]] is converted to \eb(?=\ew) - [[:>:]] is converted to \eb(?<=\ew) -.sp -Only these exact character sequences are recognized. A sequence such as -[a[:<:]b] provokes error for an unrecognized POSIX class name. This support is -not compatible with Perl. It is provided to help migrations from other -environments, and is best not used in any new patterns. Note that \eb matches -at the start and the end of a word (see -.\" HTML -.\" -"Simple assertions" -.\" -above), and in a Perl-style pattern the preceding or following character -normally shows which is wanted, without the need for the assertions that are -used above in order to give exactly the POSIX behaviour. -. -. -.SH "VERTICAL BAR" -.rs -.sp -Vertical bar characters are used to separate alternative patterns. For example, -the pattern -.sp - gilbert|sullivan -.sp -matches either "gilbert" or "sullivan". Any number of alternatives may appear, -and an empty alternative is permitted (matching the empty string). The matching -process tries each alternative in turn, from left to right, and the first one -that succeeds is used. If the alternatives are within a subpattern -.\" HTML -.\" -(defined below), -.\" -"succeeds" means matching the rest of the main pattern as well as the -alternative in the subpattern. -. -. -.SH "INTERNAL OPTION SETTING" -.rs -.sp -The settings of the PCRE_CASELESS, PCRE_MULTILINE, PCRE_DOTALL, and -PCRE_EXTENDED options (which are Perl-compatible) can be changed from within -the pattern by a sequence of Perl option letters enclosed between "(?" and ")". -The option letters are -.sp - i for PCRE_CASELESS - m for PCRE_MULTILINE - s for PCRE_DOTALL - x for PCRE_EXTENDED -.sp -For example, (?im) sets caseless, multiline matching. It is also possible to -unset these options by preceding the letter with a hyphen, and a combined -setting and unsetting such as (?im-sx), which sets PCRE_CASELESS and -PCRE_MULTILINE while unsetting PCRE_DOTALL and PCRE_EXTENDED, is also -permitted. If a letter appears both before and after the hyphen, the option is -unset. -.P -The PCRE-specific options PCRE_DUPNAMES, PCRE_UNGREEDY, and PCRE_EXTRA can be -changed in the same way as the Perl-compatible options by using the characters -J, U and X respectively. -.P -When one of these option changes occurs at top level (that is, not inside -subpattern parentheses), the change applies to the remainder of the pattern -that follows. An option change within a subpattern (see below for a description -of subpatterns) affects only that part of the subpattern that follows it, so -.sp - (a(?i)b)c -.sp -matches abc and aBc and no other strings (assuming PCRE_CASELESS is not used). -By this means, options can be made to have different settings in different -parts of the pattern. Any changes made in one alternative do carry on -into subsequent branches within the same subpattern. For example, -.sp - (a(?i)b|c) -.sp -matches "ab", "aB", "c", and "C", even though when matching "C" the first -branch is abandoned before the option setting. This is because the effects of -option settings happen at compile time. There would be some very weird -behaviour otherwise. -.P -\fBNote:\fP There are other PCRE-specific options that can be set by the -application when the compiling or matching functions are called. In some cases -the pattern can contain special leading sequences such as (*CRLF) to override -what the application has set or what has been defaulted. Details are given in -the section entitled -.\" HTML -.\" -"Newline sequences" -.\" -above. There are also the (*UTF8), (*UTF16),(*UTF32), and (*UCP) leading -sequences that can be used to set UTF and Unicode property modes; they are -equivalent to setting the PCRE_UTF8, PCRE_UTF16, PCRE_UTF32 and the PCRE_UCP -options, respectively. The (*UTF) sequence is a generic version that can be -used with any of the libraries. However, the application can set the -PCRE_NEVER_UTF option, which locks out the use of the (*UTF) sequences. -. -. -.\" HTML -.SH SUBPATTERNS -.rs -.sp -Subpatterns are delimited by parentheses (round brackets), which can be nested. -Turning part of a pattern into a subpattern does two things: -.sp -1. It localizes a set of alternatives. For example, the pattern -.sp - cat(aract|erpillar|) -.sp -matches "cataract", "caterpillar", or "cat". Without the parentheses, it would -match "cataract", "erpillar" or an empty string. -.sp -2. It sets up the subpattern as a capturing subpattern. This means that, when -the whole pattern matches, that portion of the subject string that matched the -subpattern is passed back to the caller via the \fIovector\fP argument of the -matching function. (This applies only to the traditional matching functions; -the DFA matching functions do not support capturing.) -.P -Opening parentheses are counted from left to right (starting from 1) to obtain -numbers for the capturing subpatterns. For example, if the string "the red -king" is matched against the pattern -.sp - the ((red|white) (king|queen)) -.sp -the captured substrings are "red king", "red", and "king", and are numbered 1, -2, and 3, respectively. -.P -The fact that plain parentheses fulfil two functions is not always helpful. -There are often times when a grouping subpattern is required without a -capturing requirement. If an opening parenthesis is followed by a question mark -and a colon, the subpattern does not do any capturing, and is not counted when -computing the number of any subsequent capturing subpatterns. For example, if -the string "the white queen" is matched against the pattern -.sp - the ((?:red|white) (king|queen)) -.sp -the captured substrings are "white queen" and "queen", and are numbered 1 and -2. The maximum number of capturing subpatterns is 65535. -.P -As a convenient shorthand, if any option settings are required at the start of -a non-capturing subpattern, the option letters may appear between the "?" and -the ":". Thus the two patterns -.sp - (?i:saturday|sunday) - (?:(?i)saturday|sunday) -.sp -match exactly the same set of strings. Because alternative branches are tried -from left to right, and options are not reset until the end of the subpattern -is reached, an option setting in one branch does affect subsequent branches, so -the above patterns match "SUNDAY" as well as "Saturday". -. -. -.\" HTML -.SH "DUPLICATE SUBPATTERN NUMBERS" -.rs -.sp -Perl 5.10 introduced a feature whereby each alternative in a subpattern uses -the same numbers for its capturing parentheses. Such a subpattern starts with -(?| and is itself a non-capturing subpattern. For example, consider this -pattern: -.sp - (?|(Sat)ur|(Sun))day -.sp -Because the two alternatives are inside a (?| group, both sets of capturing -parentheses are numbered one. Thus, when the pattern matches, you can look -at captured substring number one, whichever alternative matched. This construct -is useful when you want to capture part, but not all, of one of a number of -alternatives. Inside a (?| group, parentheses are numbered as usual, but the -number is reset at the start of each branch. The numbers of any capturing -parentheses that follow the subpattern start after the highest number used in -any branch. The following example is taken from the Perl documentation. The -numbers underneath show in which buffer the captured content will be stored. -.sp - # before ---------------branch-reset----------- after - / ( a ) (?| x ( y ) z | (p (q) r) | (t) u (v) ) ( z ) /x - # 1 2 2 3 2 3 4 -.sp -A back reference to a numbered subpattern uses the most recent value that is -set for that number by any subpattern. The following pattern matches "abcabc" -or "defdef": -.sp - /(?|(abc)|(def))\e1/ -.sp -In contrast, a subroutine call to a numbered subpattern always refers to the -first one in the pattern with the given number. The following pattern matches -"abcabc" or "defabc": -.sp - /(?|(abc)|(def))(?1)/ -.sp -If a -.\" HTML -.\" -condition test -.\" -for a subpattern's having matched refers to a non-unique number, the test is -true if any of the subpatterns of that number have matched. -.P -An alternative approach to using this "branch reset" feature is to use -duplicate named subpatterns, as described in the next section. -. -. -.SH "NAMED SUBPATTERNS" -.rs -.sp -Identifying capturing parentheses by number is simple, but it can be very hard -to keep track of the numbers in complicated regular expressions. Furthermore, -if an expression is modified, the numbers may change. To help with this -difficulty, PCRE supports the naming of subpatterns. This feature was not -added to Perl until release 5.10. Python had the feature earlier, and PCRE -introduced it at release 4.0, using the Python syntax. PCRE now supports both -the Perl and the Python syntax. Perl allows identically numbered subpatterns to -have different names, but PCRE does not. -.P -In PCRE, a subpattern can be named in one of three ways: (?...) or -(?'name'...) as in Perl, or (?P...) as in Python. References to capturing -parentheses from other parts of the pattern, such as -.\" HTML -.\" -back references, -.\" -.\" HTML -.\" -recursion, -.\" -and -.\" HTML -.\" -conditions, -.\" -can be made by name as well as by number. -.P -Names consist of up to 32 alphanumeric characters and underscores, but must -start with a non-digit. Named capturing parentheses are still allocated numbers -as well as names, exactly as if the names were not present. The PCRE API -provides function calls for extracting the name-to-number translation table -from a compiled pattern. There is also a convenience function for extracting a -captured substring by name. -.P -By default, a name must be unique within a pattern, but it is possible to relax -this constraint by setting the PCRE_DUPNAMES option at compile time. (Duplicate -names are also always permitted for subpatterns with the same number, set up as -described in the previous section.) Duplicate names can be useful for patterns -where only one instance of the named parentheses can match. Suppose you want to -match the name of a weekday, either as a 3-letter abbreviation or as the full -name, and in both cases you want to extract the abbreviation. This pattern -(ignoring the line breaks) does the job: -.sp - (?Mon|Fri|Sun)(?:day)?| - (?Tue)(?:sday)?| - (?Wed)(?:nesday)?| - (?Thu)(?:rsday)?| - (?Sat)(?:urday)? -.sp -There are five capturing substrings, but only one is ever set after a match. -(An alternative way of solving this problem is to use a "branch reset" -subpattern, as described in the previous section.) -.P -The convenience function for extracting the data by name returns the substring -for the first (and in this example, the only) subpattern of that name that -matched. This saves searching to find which numbered subpattern it was. -.P -If you make a back reference to a non-unique named subpattern from elsewhere in -the pattern, the subpatterns to which the name refers are checked in the order -in which they appear in the overall pattern. The first one that is set is used -for the reference. For example, this pattern matches both "foofoo" and -"barbar" but not "foobar" or "barfoo": -.sp - (?:(?foo)|(?bar))\ek -.sp -.P -If you make a subroutine call to a non-unique named subpattern, the one that -corresponds to the first occurrence of the name is used. In the absence of -duplicate numbers (see the previous section) this is the one with the lowest -number. -.P -If you use a named reference in a condition -test (see the -.\" -.\" HTML -.\" -section about conditions -.\" -below), either to check whether a subpattern has matched, or to check for -recursion, all subpatterns with the same name are tested. If the condition is -true for any one of them, the overall condition is true. This is the same -behaviour as testing by number. For further details of the interfaces for -handling named subpatterns, see the -.\" HREF -\fBpcreapi\fP -.\" -documentation. -.P -\fBWarning:\fP You cannot use different names to distinguish between two -subpatterns with the same number because PCRE uses only the numbers when -matching. For this reason, an error is given at compile time if different names -are given to subpatterns with the same number. However, you can always give the -same name to subpatterns with the same number, even when PCRE_DUPNAMES is not -set. -. -. -.SH REPETITION -.rs -.sp -Repetition is specified by quantifiers, which can follow any of the following -items: -.sp - a literal data character - the dot metacharacter - the \eC escape sequence - the \eX escape sequence - the \eR escape sequence - an escape such as \ed or \epL that matches a single character - a character class - a back reference (see next section) - a parenthesized subpattern (including assertions) - a subroutine call to a subpattern (recursive or otherwise) -.sp -The general repetition quantifier specifies a minimum and maximum number of -permitted matches, by giving the two numbers in curly brackets (braces), -separated by a comma. The numbers must be less than 65536, and the first must -be less than or equal to the second. For example: -.sp - z{2,4} -.sp -matches "zz", "zzz", or "zzzz". A closing brace on its own is not a special -character. If the second number is omitted, but the comma is present, there is -no upper limit; if the second number and the comma are both omitted, the -quantifier specifies an exact number of required matches. Thus -.sp - [aeiou]{3,} -.sp -matches at least 3 successive vowels, but may match many more, while -.sp - \ed{8} -.sp -matches exactly 8 digits. An opening curly bracket that appears in a position -where a quantifier is not allowed, or one that does not match the syntax of a -quantifier, is taken as a literal character. For example, {,6} is not a -quantifier, but a literal string of four characters. -.P -In UTF modes, quantifiers apply to characters rather than to individual data -units. Thus, for example, \ex{100}{2} matches two characters, each of -which is represented by a two-byte sequence in a UTF-8 string. Similarly, -\eX{3} matches three Unicode extended grapheme clusters, each of which may be -several data units long (and they may be of different lengths). -.P -The quantifier {0} is permitted, causing the expression to behave as if the -previous item and the quantifier were not present. This may be useful for -subpatterns that are referenced as -.\" HTML -.\" -subroutines -.\" -from elsewhere in the pattern (but see also the section entitled -.\" HTML -.\" -"Defining subpatterns for use by reference only" -.\" -below). Items other than subpatterns that have a {0} quantifier are omitted -from the compiled pattern. -.P -For convenience, the three most common quantifiers have single-character -abbreviations: -.sp - * is equivalent to {0,} - + is equivalent to {1,} - ? is equivalent to {0,1} -.sp -It is possible to construct infinite loops by following a subpattern that can -match no characters with a quantifier that has no upper limit, for example: -.sp - (a?)* -.sp -Earlier versions of Perl and PCRE used to give an error at compile time for -such patterns. However, because there are cases where this can be useful, such -patterns are now accepted, but if any repetition of the subpattern does in fact -match no characters, the loop is forcibly broken. -.P -By default, the quantifiers are "greedy", that is, they match as much as -possible (up to the maximum number of permitted times), without causing the -rest of the pattern to fail. The classic example of where this gives problems -is in trying to match comments in C programs. These appear between /* and */ -and within the comment, individual * and / characters may appear. An attempt to -match C comments by applying the pattern -.sp - /\e*.*\e*/ -.sp -to the string -.sp - /* first comment */ not comment /* second comment */ -.sp -fails, because it matches the entire string owing to the greediness of the .* -item. -.P -However, if a quantifier is followed by a question mark, it ceases to be -greedy, and instead matches the minimum number of times possible, so the -pattern -.sp - /\e*.*?\e*/ -.sp -does the right thing with the C comments. The meaning of the various -quantifiers is not otherwise changed, just the preferred number of matches. -Do not confuse this use of question mark with its use as a quantifier in its -own right. Because it has two uses, it can sometimes appear doubled, as in -.sp - \ed??\ed -.sp -which matches one digit by preference, but can match two if that is the only -way the rest of the pattern matches. -.P -If the PCRE_UNGREEDY option is set (an option that is not available in Perl), -the quantifiers are not greedy by default, but individual ones can be made -greedy by following them with a question mark. In other words, it inverts the -default behaviour. -.P -When a parenthesized subpattern is quantified with a minimum repeat count that -is greater than 1 or with a limited maximum, more memory is required for the -compiled pattern, in proportion to the size of the minimum or maximum. -.P -If a pattern starts with .* or .{0,} and the PCRE_DOTALL option (equivalent -to Perl's /s) is set, thus allowing the dot to match newlines, the pattern is -implicitly anchored, because whatever follows will be tried against every -character position in the subject string, so there is no point in retrying the -overall match at any position after the first. PCRE normally treats such a -pattern as though it were preceded by \eA. -.P -In cases where it is known that the subject string contains no newlines, it is -worth setting PCRE_DOTALL in order to obtain this optimization, or -alternatively using ^ to indicate anchoring explicitly. -.P -However, there are some cases where the optimization cannot be used. When .* -is inside capturing parentheses that are the subject of a back reference -elsewhere in the pattern, a match at the start may fail where a later one -succeeds. Consider, for example: -.sp - (.*)abc\e1 -.sp -If the subject is "xyz123abc123" the match point is the fourth character. For -this reason, such a pattern is not implicitly anchored. -.P -Another case where implicit anchoring is not applied is when the leading .* is -inside an atomic group. Once again, a match at the start may fail where a later -one succeeds. Consider this pattern: -.sp - (?>.*?a)b -.sp -It matches "ab" in the subject "aab". The use of the backtracking control verbs -(*PRUNE) and (*SKIP) also disable this optimization. -.P -When a capturing subpattern is repeated, the value captured is the substring -that matched the final iteration. For example, after -.sp - (tweedle[dume]{3}\es*)+ -.sp -has matched "tweedledum tweedledee" the value of the captured substring is -"tweedledee". However, if there are nested capturing subpatterns, the -corresponding captured values may have been set in previous iterations. For -example, after -.sp - /(a|(b))+/ -.sp -matches "aba" the value of the second captured substring is "b". -. -. -.\" HTML -.SH "ATOMIC GROUPING AND POSSESSIVE QUANTIFIERS" -.rs -.sp -With both maximizing ("greedy") and minimizing ("ungreedy" or "lazy") -repetition, failure of what follows normally causes the repeated item to be -re-evaluated to see if a different number of repeats allows the rest of the -pattern to match. Sometimes it is useful to prevent this, either to change the -nature of the match, or to cause it fail earlier than it otherwise might, when -the author of the pattern knows there is no point in carrying on. -.P -Consider, for example, the pattern \ed+foo when applied to the subject line -.sp - 123456bar -.sp -After matching all 6 digits and then failing to match "foo", the normal -action of the matcher is to try again with only 5 digits matching the \ed+ -item, and then with 4, and so on, before ultimately failing. "Atomic grouping" -(a term taken from Jeffrey Friedl's book) provides the means for specifying -that once a subpattern has matched, it is not to be re-evaluated in this way. -.P -If we use atomic grouping for the previous example, the matcher gives up -immediately on failing to match "foo" the first time. The notation is a kind of -special parenthesis, starting with (?> as in this example: -.sp - (?>\ed+)foo -.sp -This kind of parenthesis "locks up" the part of the pattern it contains once -it has matched, and a failure further into the pattern is prevented from -backtracking into it. Backtracking past it to previous items, however, works as -normal. -.P -An alternative description is that a subpattern of this type matches the string -of characters that an identical standalone pattern would match, if anchored at -the current point in the subject string. -.P -Atomic grouping subpatterns are not capturing subpatterns. Simple cases such as -the above example can be thought of as a maximizing repeat that must swallow -everything it can. So, while both \ed+ and \ed+? are prepared to adjust the -number of digits they match in order to make the rest of the pattern match, -(?>\ed+) can only match an entire sequence of digits. -.P -Atomic groups in general can of course contain arbitrarily complicated -subpatterns, and can be nested. However, when the subpattern for an atomic -group is just a single repeated item, as in the example above, a simpler -notation, called a "possessive quantifier" can be used. This consists of an -additional + character following a quantifier. Using this notation, the -previous example can be rewritten as -.sp - \ed++foo -.sp -Note that a possessive quantifier can be used with an entire group, for -example: -.sp - (abc|xyz){2,3}+ -.sp -Possessive quantifiers are always greedy; the setting of the PCRE_UNGREEDY -option is ignored. They are a convenient notation for the simpler forms of -atomic group. However, there is no difference in the meaning of a possessive -quantifier and the equivalent atomic group, though there may be a performance -difference; possessive quantifiers should be slightly faster. -.P -The possessive quantifier syntax is an extension to the Perl 5.8 syntax. -Jeffrey Friedl originated the idea (and the name) in the first edition of his -book. Mike McCloskey liked it, so implemented it when he built Sun's Java -package, and PCRE copied it from there. It ultimately found its way into Perl -at release 5.10. -.P -PCRE has an optimization that automatically "possessifies" certain simple -pattern constructs. For example, the sequence A+B is treated as A++B because -there is no point in backtracking into a sequence of A's when B must follow. -.P -When a pattern contains an unlimited repeat inside a subpattern that can itself -be repeated an unlimited number of times, the use of an atomic group is the -only way to avoid some failing matches taking a very long time indeed. The -pattern -.sp - (\eD+|<\ed+>)*[!?] -.sp -matches an unlimited number of substrings that either consist of non-digits, or -digits enclosed in <>, followed by either ! or ?. When it matches, it runs -quickly. However, if it is applied to -.sp - aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -.sp -it takes a long time before reporting failure. This is because the string can -be divided between the internal \eD+ repeat and the external * repeat in a -large number of ways, and all have to be tried. (The example uses [!?] rather -than a single character at the end, because both PCRE and Perl have an -optimization that allows for fast failure when a single character is used. They -remember the last single character that is required for a match, and fail early -if it is not present in the string.) If the pattern is changed so that it uses -an atomic group, like this: -.sp - ((?>\eD+)|<\ed+>)*[!?] -.sp -sequences of non-digits cannot be broken, and failure happens quickly. -. -. -.\" HTML -.SH "BACK REFERENCES" -.rs -.sp -Outside a character class, a backslash followed by a digit greater than 0 (and -possibly further digits) is a back reference to a capturing subpattern earlier -(that is, to its left) in the pattern, provided there have been that many -previous capturing left parentheses. -.P -However, if the decimal number following the backslash is less than 10, it is -always taken as a back reference, and causes an error only if there are not -that many capturing left parentheses in the entire pattern. In other words, the -parentheses that are referenced need not be to the left of the reference for -numbers less than 10. A "forward back reference" of this type can make sense -when a repetition is involved and the subpattern to the right has participated -in an earlier iteration. -.P -It is not possible to have a numerical "forward back reference" to a subpattern -whose number is 10 or more using this syntax because a sequence such as \e50 is -interpreted as a character defined in octal. See the subsection entitled -"Non-printing characters" -.\" HTML -.\" -above -.\" -for further details of the handling of digits following a backslash. There is -no such problem when named parentheses are used. A back reference to any -subpattern is possible using named parentheses (see below). -.P -Another way of avoiding the ambiguity inherent in the use of digits following a -backslash is to use the \eg escape sequence. This escape must be followed by an -unsigned number or a negative number, optionally enclosed in braces. These -examples are all identical: -.sp - (ring), \e1 - (ring), \eg1 - (ring), \eg{1} -.sp -An unsigned number specifies an absolute reference without the ambiguity that -is present in the older syntax. It is also useful when literal digits follow -the reference. A negative number is a relative reference. Consider this -example: -.sp - (abc(def)ghi)\eg{-1} -.sp -The sequence \eg{-1} is a reference to the most recently started capturing -subpattern before \eg, that is, is it equivalent to \e2 in this example. -Similarly, \eg{-2} would be equivalent to \e1. The use of relative references -can be helpful in long patterns, and also in patterns that are created by -joining together fragments that contain references within themselves. -.P -A back reference matches whatever actually matched the capturing subpattern in -the current subject string, rather than anything matching the subpattern -itself (see -.\" HTML -.\" -"Subpatterns as subroutines" -.\" -below for a way of doing that). So the pattern -.sp - (sens|respons)e and \e1ibility -.sp -matches "sense and sensibility" and "response and responsibility", but not -"sense and responsibility". If caseful matching is in force at the time of the -back reference, the case of letters is relevant. For example, -.sp - ((?i)rah)\es+\e1 -.sp -matches "rah rah" and "RAH RAH", but not "RAH rah", even though the original -capturing subpattern is matched caselessly. -.P -There are several different ways of writing back references to named -subpatterns. The .NET syntax \ek{name} and the Perl syntax \ek or -\ek'name' are supported, as is the Python syntax (?P=name). Perl 5.10's unified -back reference syntax, in which \eg can be used for both numeric and named -references, is also supported. We could rewrite the above example in any of -the following ways: -.sp - (?(?i)rah)\es+\ek - (?'p1'(?i)rah)\es+\ek{p1} - (?P(?i)rah)\es+(?P=p1) - (?(?i)rah)\es+\eg{p1} -.sp -A subpattern that is referenced by name may appear in the pattern before or -after the reference. -.P -There may be more than one back reference to the same subpattern. If a -subpattern has not actually been used in a particular match, any back -references to it always fail by default. For example, the pattern -.sp - (a|(bc))\e2 -.sp -always fails if it starts to match "a" rather than "bc". However, if the -PCRE_JAVASCRIPT_COMPAT option is set at compile time, a back reference to an -unset value matches an empty string. -.P -Because there may be many capturing parentheses in a pattern, all digits -following a backslash are taken as part of a potential back reference number. -If the pattern continues with a digit character, some delimiter must be used to -terminate the back reference. If the PCRE_EXTENDED option is set, this can be -white space. Otherwise, the \eg{ syntax or an empty comment (see -.\" HTML -.\" -"Comments" -.\" -below) can be used. -. -.SS "Recursive back references" -.rs -.sp -A back reference that occurs inside the parentheses to which it refers fails -when the subpattern is first used, so, for example, (a\e1) never matches. -However, such references can be useful inside repeated subpatterns. For -example, the pattern -.sp - (a|b\e1)+ -.sp -matches any number of "a"s and also "aba", "ababbaa" etc. At each iteration of -the subpattern, the back reference matches the character string corresponding -to the previous iteration. In order for this to work, the pattern must be such -that the first iteration does not need to match the back reference. This can be -done using alternation, as in the example above, or by a quantifier with a -minimum of zero. -.P -Back references of this type cause the group that they reference to be treated -as an -.\" HTML -.\" -atomic group. -.\" -Once the whole group has been matched, a subsequent matching failure cannot -cause backtracking into the middle of the group. -. -. -.\" HTML -.SH ASSERTIONS -.rs -.sp -An assertion is a test on the characters following or preceding the current -matching point that does not actually consume any characters. The simple -assertions coded as \eb, \eB, \eA, \eG, \eZ, \ez, ^ and $ are described -.\" HTML -.\" -above. -.\" -.P -More complicated assertions are coded as subpatterns. There are two kinds: -those that look ahead of the current position in the subject string, and those -that look behind it. An assertion subpattern is matched in the normal way, -except that it does not cause the current matching position to be changed. -.P -Assertion subpatterns are not capturing subpatterns. If such an assertion -contains capturing subpatterns within it, these are counted for the purposes of -numbering the capturing subpatterns in the whole pattern. However, substring -capturing is carried out only for positive assertions. (Perl sometimes, but not -always, does do capturing in negative assertions.) -.P -WARNING: If a positive assertion containing one or more capturing subpatterns -succeeds, but failure to match later in the pattern causes backtracking over -this assertion, the captures within the assertion are reset only if no higher -numbered captures are already set. This is, unfortunately, a fundamental -limitation of the current implementation, and as PCRE1 is now in -maintenance-only status, it is unlikely ever to change. -.P -For compatibility with Perl, assertion subpatterns may be repeated; though -it makes no sense to assert the same thing several times, the side effect of -capturing parentheses may occasionally be useful. In practice, there only three -cases: -.sp -(1) If the quantifier is {0}, the assertion is never obeyed during matching. -However, it may contain internal capturing parenthesized groups that are called -from elsewhere via the -.\" HTML -.\" -subroutine mechanism. -.\" -.sp -(2) If quantifier is {0,n} where n is greater than zero, it is treated as if it -were {0,1}. At run time, the rest of the pattern match is tried with and -without the assertion, the order depending on the greediness of the quantifier. -.sp -(3) If the minimum repetition is greater than zero, the quantifier is ignored. -The assertion is obeyed just once when encountered during matching. -. -. -.SS "Lookahead assertions" -.rs -.sp -Lookahead assertions start with (?= for positive assertions and (?! for -negative assertions. For example, -.sp - \ew+(?=;) -.sp -matches a word followed by a semicolon, but does not include the semicolon in -the match, and -.sp - foo(?!bar) -.sp -matches any occurrence of "foo" that is not followed by "bar". Note that the -apparently similar pattern -.sp - (?!foo)bar -.sp -does not find an occurrence of "bar" that is preceded by something other than -"foo"; it finds any occurrence of "bar" whatsoever, because the assertion -(?!foo) is always true when the next three characters are "bar". A -lookbehind assertion is needed to achieve the other effect. -.P -If you want to force a matching failure at some point in a pattern, the most -convenient way to do it is with (?!) because an empty string always matches, so -an assertion that requires there not to be an empty string must always fail. -The backtracking control verb (*FAIL) or (*F) is a synonym for (?!). -. -. -.\" HTML -.SS "Lookbehind assertions" -.rs -.sp -Lookbehind assertions start with (?<= for positive assertions and (? -.\" -(see above) -.\" -can be used instead of a lookbehind assertion to get round the fixed-length -restriction. -.P -The implementation of lookbehind assertions is, for each alternative, to -temporarily move the current position back by the fixed length and then try to -match. If there are insufficient characters before the current position, the -assertion fails. -.P -In a UTF mode, PCRE does not allow the \eC escape (which matches a single data -unit even in a UTF mode) to appear in lookbehind assertions, because it makes -it impossible to calculate the length of the lookbehind. The \eX and \eR -escapes, which can match different numbers of data units, are also not -permitted. -.P -.\" HTML -.\" -"Subroutine" -.\" -calls (see below) such as (?2) or (?&X) are permitted in lookbehinds, as long -as the subpattern matches a fixed-length string. -.\" HTML -.\" -Recursion, -.\" -however, is not supported. -.P -Possessive quantifiers can be used in conjunction with lookbehind assertions to -specify efficient matching of fixed-length strings at the end of subject -strings. Consider a simple pattern such as -.sp - abcd$ -.sp -when applied to a long string that does not match. Because matching proceeds -from left to right, PCRE will look for each "a" in the subject and then see if -what follows matches the rest of the pattern. If the pattern is specified as -.sp - ^.*abcd$ -.sp -the initial .* matches the entire string at first, but when this fails (because -there is no following "a"), it backtracks to match all but the last character, -then all but the last two characters, and so on. Once again the search for "a" -covers the entire string, from right to left, so we are no better off. However, -if the pattern is written as -.sp - ^.*+(?<=abcd) -.sp -there can be no backtracking for the .*+ item; it can match only the entire -string. The subsequent lookbehind assertion does a single test on the last four -characters. If it fails, the match fails immediately. For long strings, this -approach makes a significant difference to the processing time. -. -. -.SS "Using multiple assertions" -.rs -.sp -Several assertions (of any sort) may occur in succession. For example, -.sp - (?<=\ed{3})(? -.SH "CONDITIONAL SUBPATTERNS" -.rs -.sp -It is possible to cause the matching process to obey a subpattern -conditionally or to choose between two alternative subpatterns, depending on -the result of an assertion, or whether a specific capturing subpattern has -already been matched. The two possible forms of conditional subpattern are: -.sp - (?(condition)yes-pattern) - (?(condition)yes-pattern|no-pattern) -.sp -If the condition is satisfied, the yes-pattern is used; otherwise the -no-pattern (if present) is used. If there are more than two alternatives in the -subpattern, a compile-time error occurs. Each of the two alternatives may -itself contain nested subpatterns of any form, including conditional -subpatterns; the restriction to two alternatives applies only at the level of -the condition. This pattern fragment is an example where the alternatives are -complex: -.sp - (?(1) (A|B|C) | (D | (?(2)E|F) | E) ) -.sp -.P -There are four kinds of condition: references to subpatterns, references to -recursion, a pseudo-condition called DEFINE, and assertions. -. -.SS "Checking for a used subpattern by number" -.rs -.sp -If the text between the parentheses consists of a sequence of digits, the -condition is true if a capturing subpattern of that number has previously -matched. If there is more than one capturing subpattern with the same number -(see the earlier -.\" -.\" HTML -.\" -section about duplicate subpattern numbers), -.\" -the condition is true if any of them have matched. An alternative notation is -to precede the digits with a plus or minus sign. In this case, the subpattern -number is relative rather than absolute. The most recently opened parentheses -can be referenced by (?(-1), the next most recent by (?(-2), and so on. Inside -loops it can also make sense to refer to subsequent groups. The next -parentheses to be opened can be referenced as (?(+1), and so on. (The value -zero in any of these forms is not used; it provokes a compile-time error.) -.P -Consider the following pattern, which contains non-significant white space to -make it more readable (assume the PCRE_EXTENDED option) and to divide it into -three parts for ease of discussion: -.sp - ( \e( )? [^()]+ (?(1) \e) ) -.sp -The first part matches an optional opening parenthesis, and if that -character is present, sets it as the first captured substring. The second part -matches one or more characters that are not parentheses. The third part is a -conditional subpattern that tests whether or not the first set of parentheses -matched. If they did, that is, if subject started with an opening parenthesis, -the condition is true, and so the yes-pattern is executed and a closing -parenthesis is required. Otherwise, since no-pattern is not present, the -subpattern matches nothing. In other words, this pattern matches a sequence of -non-parentheses, optionally enclosed in parentheses. -.P -If you were embedding this pattern in a larger one, you could use a relative -reference: -.sp - ...other stuff... ( \e( )? [^()]+ (?(-1) \e) ) ... -.sp -This makes the fragment independent of the parentheses in the larger pattern. -. -.SS "Checking for a used subpattern by name" -.rs -.sp -Perl uses the syntax (?()...) or (?('name')...) to test for a used -subpattern by name. For compatibility with earlier versions of PCRE, which had -this facility before Perl, the syntax (?(name)...) is also recognized. -.P -Rewriting the above example to use a named subpattern gives this: -.sp - (? \e( )? [^()]+ (?() \e) ) -.sp -If the name used in a condition of this kind is a duplicate, the test is -applied to all subpatterns of the same name, and is true if any one of them has -matched. -. -.SS "Checking for pattern recursion" -.rs -.sp -If the condition is the string (R), and there is no subpattern with the name R, -the condition is true if a recursive call to the whole pattern or any -subpattern has been made. If digits or a name preceded by ampersand follow the -letter R, for example: -.sp - (?(R3)...) or (?(R&name)...) -.sp -the condition is true if the most recent recursion is into a subpattern whose -number or name is given. This condition does not check the entire recursion -stack. If the name used in a condition of this kind is a duplicate, the test is -applied to all subpatterns of the same name, and is true if any one of them is -the most recent recursion. -.P -At "top level", all these recursion test conditions are false. -.\" HTML -.\" -The syntax for recursive patterns -.\" -is described below. -. -.\" HTML -.SS "Defining subpatterns for use by reference only" -.rs -.sp -If the condition is the string (DEFINE), and there is no subpattern with the -name DEFINE, the condition is always false. In this case, there may be only one -alternative in the subpattern. It is always skipped if control reaches this -point in the pattern; the idea of DEFINE is that it can be used to define -subroutines that can be referenced from elsewhere. (The use of -.\" HTML -.\" -subroutines -.\" -is described below.) For example, a pattern to match an IPv4 address such as -"192.168.23.245" could be written like this (ignore white space and line -breaks): -.sp - (?(DEFINE) (? 2[0-4]\ed | 25[0-5] | 1\ed\ed | [1-9]?\ed) ) - \eb (?&byte) (\e.(?&byte)){3} \eb -.sp -The first part of the pattern is a DEFINE group inside which a another group -named "byte" is defined. This matches an individual component of an IPv4 -address (a number less than 256). When matching takes place, this part of the -pattern is skipped because DEFINE acts like a false condition. The rest of the -pattern uses references to the named group to match the four dot-separated -components of an IPv4 address, insisting on a word boundary at each end. -. -.SS "Assertion conditions" -.rs -.sp -If the condition is not in any of the above formats, it must be an assertion. -This may be a positive or negative lookahead or lookbehind assertion. Consider -this pattern, again containing non-significant white space, and with the two -alternatives on the second line: -.sp - (?(?=[^a-z]*[a-z]) - \ed{2}-[a-z]{3}-\ed{2} | \ed{2}-\ed{2}-\ed{2} ) -.sp -The condition is a positive lookahead assertion that matches an optional -sequence of non-letters followed by a letter. In other words, it tests for the -presence of at least one letter in the subject. If a letter is found, the -subject is matched against the first alternative; otherwise it is matched -against the second. This pattern matches strings in one of the two forms -dd-aaa-dd or dd-dd-dd, where aaa are letters and dd are digits. -. -. -.\" HTML -.SH COMMENTS -.rs -.sp -There are two ways of including comments in patterns that are processed by -PCRE. In both cases, the start of the comment must not be in a character class, -nor in the middle of any other sequence of related characters such as (?: or a -subpattern name or number. The characters that make up a comment play no part -in the pattern matching. -.P -The sequence (?# marks the start of a comment that continues up to the next -closing parenthesis. Nested parentheses are not permitted. If the PCRE_EXTENDED -option is set, an unescaped # character also introduces a comment, which in -this case continues to immediately after the next newline character or -character sequence in the pattern. Which characters are interpreted as newlines -is controlled by the options passed to a compiling function or by a special -sequence at the start of the pattern, as described in the section entitled -.\" HTML -.\" -"Newline conventions" -.\" -above. Note that the end of this type of comment is a literal newline sequence -in the pattern; escape sequences that happen to represent a newline do not -count. For example, consider this pattern when PCRE_EXTENDED is set, and the -default newline convention is in force: -.sp - abc #comment \en still comment -.sp -On encountering the # character, \fBpcre_compile()\fP skips along, looking for -a newline in the pattern. The sequence \en is still literal at this stage, so -it does not terminate the comment. Only an actual character with the code value -0x0a (the default newline) does so. -. -. -.\" HTML -.SH "RECURSIVE PATTERNS" -.rs -.sp -Consider the problem of matching a string in parentheses, allowing for -unlimited nested parentheses. Without the use of recursion, the best that can -be done is to use a pattern that matches up to some fixed depth of nesting. It -is not possible to handle an arbitrary nesting depth. -.P -For some time, Perl has provided a facility that allows regular expressions to -recurse (amongst other things). It does this by interpolating Perl code in the -expression at run time, and the code can refer to the expression itself. A Perl -pattern using code interpolation to solve the parentheses problem can be -created like this: -.sp - $re = qr{\e( (?: (?>[^()]+) | (?p{$re}) )* \e)}x; -.sp -The (?p{...}) item interpolates Perl code at run time, and in this case refers -recursively to the pattern in which it appears. -.P -Obviously, PCRE cannot support the interpolation of Perl code. Instead, it -supports special syntax for recursion of the entire pattern, and also for -individual subpattern recursion. After its introduction in PCRE and Python, -this kind of recursion was subsequently introduced into Perl at release 5.10. -.P -A special item that consists of (? followed by a number greater than zero and a -closing parenthesis is a recursive subroutine call of the subpattern of the -given number, provided that it occurs inside that subpattern. (If not, it is a -.\" HTML -.\" -non-recursive subroutine -.\" -call, which is described in the next section.) The special item (?R) or (?0) is -a recursive call of the entire regular expression. -.P -This PCRE pattern solves the nested parentheses problem (assume the -PCRE_EXTENDED option is set so that white space is ignored): -.sp - \e( ( [^()]++ | (?R) )* \e) -.sp -First it matches an opening parenthesis. Then it matches any number of -substrings which can either be a sequence of non-parentheses, or a recursive -match of the pattern itself (that is, a correctly parenthesized substring). -Finally there is a closing parenthesis. Note the use of a possessive quantifier -to avoid backtracking into sequences of non-parentheses. -.P -If this were part of a larger pattern, you would not want to recurse the entire -pattern, so instead you could use this: -.sp - ( \e( ( [^()]++ | (?1) )* \e) ) -.sp -We have put the pattern into parentheses, and caused the recursion to refer to -them instead of the whole pattern. -.P -In a larger pattern, keeping track of parenthesis numbers can be tricky. This -is made easier by the use of relative references. Instead of (?1) in the -pattern above you can write (?-2) to refer to the second most recently opened -parentheses preceding the recursion. In other words, a negative number counts -capturing parentheses leftwards from the point at which it is encountered. -.P -It is also possible to refer to subsequently opened parentheses, by writing -references such as (?+2). However, these cannot be recursive because the -reference is not inside the parentheses that are referenced. They are always -.\" HTML -.\" -non-recursive subroutine -.\" -calls, as described in the next section. -.P -An alternative approach is to use named parentheses instead. The Perl syntax -for this is (?&name); PCRE's earlier syntax (?P>name) is also supported. We -could rewrite the above example as follows: -.sp - (? \e( ( [^()]++ | (?&pn) )* \e) ) -.sp -If there is more than one subpattern with the same name, the earliest one is -used. -.P -This particular example pattern that we have been looking at contains nested -unlimited repeats, and so the use of a possessive quantifier for matching -strings of non-parentheses is important when applying the pattern to strings -that do not match. For example, when this pattern is applied to -.sp - (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa() -.sp -it yields "no match" quickly. However, if a possessive quantifier is not used, -the match runs for a very long time indeed because there are so many different -ways the + and * repeats can carve up the subject, and all have to be tested -before failure can be reported. -.P -At the end of a match, the values of capturing parentheses are those from -the outermost level. If you want to obtain intermediate values, a callout -function can be used (see below and the -.\" HREF -\fBpcrecallout\fP -.\" -documentation). If the pattern above is matched against -.sp - (ab(cd)ef) -.sp -the value for the inner capturing parentheses (numbered 2) is "ef", which is -the last value taken on at the top level. If a capturing subpattern is not -matched at the top level, its final captured value is unset, even if it was -(temporarily) set at a deeper level during the matching process. -.P -If there are more than 15 capturing parentheses in a pattern, PCRE has to -obtain extra memory to store data during a recursion, which it does by using -\fBpcre_malloc\fP, freeing it via \fBpcre_free\fP afterwards. If no memory can -be obtained, the match fails with the PCRE_ERROR_NOMEMORY error. -.P -Do not confuse the (?R) item with the condition (R), which tests for recursion. -Consider this pattern, which matches text in angle brackets, allowing for -arbitrary nesting. Only digits are allowed in nested brackets (that is, when -recursing), whereas any characters are permitted at the outer level. -.sp - < (?: (?(R) \ed++ | [^<>]*+) | (?R)) * > -.sp -In this pattern, (?(R) is the start of a conditional subpattern, with two -different alternatives for the recursive and non-recursive cases. The (?R) item -is the actual recursive call. -. -. -.\" HTML -.SS "Differences in recursion processing between PCRE and Perl" -.rs -.sp -Recursion processing in PCRE differs from Perl in two important ways. In PCRE -(like Python, but unlike Perl), a recursive subpattern call is always treated -as an atomic group. That is, once it has matched some of the subject string, it -is never re-entered, even if it contains untried alternatives and there is a -subsequent matching failure. This can be illustrated by the following pattern, -which purports to match a palindromic string that contains an odd number of -characters (for example, "a", "aba", "abcba", "abcdcba"): -.sp - ^(.|(.)(?1)\e2)$ -.sp -The idea is that it either matches a single character, or two identical -characters surrounding a sub-palindrome. In Perl, this pattern works; in PCRE -it does not if the pattern is longer than three characters. Consider the -subject string "abcba": -.P -At the top level, the first character is matched, but as it is not at the end -of the string, the first alternative fails; the second alternative is taken -and the recursion kicks in. The recursive call to subpattern 1 successfully -matches the next character ("b"). (Note that the beginning and end of line -tests are not part of the recursion). -.P -Back at the top level, the next character ("c") is compared with what -subpattern 2 matched, which was "a". This fails. Because the recursion is -treated as an atomic group, there are now no backtracking points, and so the -entire match fails. (Perl is able, at this point, to re-enter the recursion and -try the second alternative.) However, if the pattern is written with the -alternatives in the other order, things are different: -.sp - ^((.)(?1)\e2|.)$ -.sp -This time, the recursing alternative is tried first, and continues to recurse -until it runs out of characters, at which point the recursion fails. But this -time we do have another alternative to try at the higher level. That is the big -difference: in the previous case the remaining alternative is at a deeper -recursion level, which PCRE cannot use. -.P -To change the pattern so that it matches all palindromic strings, not just -those with an odd number of characters, it is tempting to change the pattern to -this: -.sp - ^((.)(?1)\e2|.?)$ -.sp -Again, this works in Perl, but not in PCRE, and for the same reason. When a -deeper recursion has matched a single character, it cannot be entered again in -order to match an empty string. The solution is to separate the two cases, and -write out the odd and even cases as alternatives at the higher level: -.sp - ^(?:((.)(?1)\e2|)|((.)(?3)\e4|.)) -.sp -If you want to match typical palindromic phrases, the pattern has to ignore all -non-word characters, which can be done like this: -.sp - ^\eW*+(?:((.)\eW*+(?1)\eW*+\e2|)|((.)\eW*+(?3)\eW*+\e4|\eW*+.\eW*+))\eW*+$ -.sp -If run with the PCRE_CASELESS option, this pattern matches phrases such as "A -man, a plan, a canal: Panama!" and it works well in both PCRE and Perl. Note -the use of the possessive quantifier *+ to avoid backtracking into sequences of -non-word characters. Without this, PCRE takes a great deal longer (ten times or -more) to match typical phrases, and Perl takes so long that you think it has -gone into a loop. -.P -\fBWARNING\fP: The palindrome-matching patterns above work only if the subject -string does not start with a palindrome that is shorter than the entire string. -For example, although "abcba" is correctly matched, if the subject is "ababa", -PCRE finds the palindrome "aba" at the start, then fails at top level because -the end of the string does not follow. Once again, it cannot jump back into the -recursion to try other alternatives, so the entire match fails. -.P -The second way in which PCRE and Perl differ in their recursion processing is -in the handling of captured values. In Perl, when a subpattern is called -recursively or as a subpattern (see the next section), it has no access to any -values that were captured outside the recursion, whereas in PCRE these values -can be referenced. Consider this pattern: -.sp - ^(.)(\e1|a(?2)) -.sp -In PCRE, this pattern matches "bab". The first capturing parentheses match "b", -then in the second group, when the back reference \e1 fails to match "b", the -second alternative matches "a" and then recurses. In the recursion, \e1 does -now match "b" and so the whole match succeeds. In Perl, the pattern fails to -match because inside the recursive call \e1 cannot access the externally set -value. -. -. -.\" HTML -.SH "SUBPATTERNS AS SUBROUTINES" -.rs -.sp -If the syntax for a recursive subpattern call (either by number or by -name) is used outside the parentheses to which it refers, it operates like a -subroutine in a programming language. The called subpattern may be defined -before or after the reference. A numbered reference can be absolute or -relative, as in these examples: -.sp - (...(absolute)...)...(?2)... - (...(relative)...)...(?-1)... - (...(?+1)...(relative)... -.sp -An earlier example pointed out that the pattern -.sp - (sens|respons)e and \e1ibility -.sp -matches "sense and sensibility" and "response and responsibility", but not -"sense and responsibility". If instead the pattern -.sp - (sens|respons)e and (?1)ibility -.sp -is used, it does match "sense and responsibility" as well as the other two -strings. Another example is given in the discussion of DEFINE above. -.P -All subroutine calls, whether recursive or not, are always treated as atomic -groups. That is, once a subroutine has matched some of the subject string, it -is never re-entered, even if it contains untried alternatives and there is a -subsequent matching failure. Any capturing parentheses that are set during the -subroutine call revert to their previous values afterwards. -.P -Processing options such as case-independence are fixed when a subpattern is -defined, so if it is used as a subroutine, such options cannot be changed for -different calls. For example, consider this pattern: -.sp - (abc)(?i:(?-1)) -.sp -It matches "abcabc". It does not match "abcABC" because the change of -processing option does not affect the called subpattern. -. -. -.\" HTML -.SH "ONIGURUMA SUBROUTINE SYNTAX" -.rs -.sp -For compatibility with Oniguruma, the non-Perl syntax \eg followed by a name or -a number enclosed either in angle brackets or single quotes, is an alternative -syntax for referencing a subpattern as a subroutine, possibly recursively. Here -are two of the examples used above, rewritten using this syntax: -.sp - (? \e( ( (?>[^()]+) | \eg )* \e) ) - (sens|respons)e and \eg'1'ibility -.sp -PCRE supports an extension to Oniguruma: if a number is preceded by a -plus or a minus sign it is taken as a relative reference. For example: -.sp - (abc)(?i:\eg<-1>) -.sp -Note that \eg{...} (Perl syntax) and \eg<...> (Oniguruma syntax) are \fInot\fP -synonymous. The former is a back reference; the latter is a subroutine call. -. -. -.SH CALLOUTS -.rs -.sp -Perl has a feature whereby using the sequence (?{...}) causes arbitrary Perl -code to be obeyed in the middle of matching a regular expression. This makes it -possible, amongst other things, to extract different substrings that match the -same pair of parentheses when there is a repetition. -.P -PCRE provides a similar feature, but of course it cannot obey arbitrary Perl -code. The feature is called "callout". The caller of PCRE provides an external -function by putting its entry point in the global variable \fIpcre_callout\fP -(8-bit library) or \fIpcre[16|32]_callout\fP (16-bit or 32-bit library). -By default, this variable contains NULL, which disables all calling out. -.P -Within a regular expression, (?C) indicates the points at which the external -function is to be called. If you want to identify different callout points, you -can put a number less than 256 after the letter C. The default value is zero. -For example, this pattern has two callout points: -.sp - (?C1)abc(?C2)def -.sp -If the PCRE_AUTO_CALLOUT flag is passed to a compiling function, callouts are -automatically installed before each item in the pattern. They are all numbered -255. If there is a conditional group in the pattern whose condition is an -assertion, an additional callout is inserted just before the condition. An -explicit callout may also be set at this position, as in this example: -.sp - (?(?C9)(?=a)abc|def) -.sp -Note that this applies only to assertion conditions, not to other types of -condition. -.P -During matching, when PCRE reaches a callout point, the external function is -called. It is provided with the number of the callout, the position in the -pattern, and, optionally, one item of data originally supplied by the caller of -the matching function. The callout function may cause matching to proceed, to -backtrack, or to fail altogether. -.P -By default, PCRE implements a number of optimizations at compile time and -matching time, and one side-effect is that sometimes callouts are skipped. If -you need all possible callouts to happen, you need to set options that disable -the relevant optimizations. More details, and a complete description of the -interface to the callout function, are given in the -.\" HREF -\fBpcrecallout\fP -.\" -documentation. -. -. -.\" HTML -.SH "BACKTRACKING CONTROL" -.rs -.sp -Perl 5.10 introduced a number of "Special Backtracking Control Verbs", which -are still described in the Perl documentation as "experimental and subject to -change or removal in a future version of Perl". It goes on to say: "Their usage -in production code should be noted to avoid problems during upgrades." The same -remarks apply to the PCRE features described in this section. -.P -The new verbs make use of what was previously invalid syntax: an opening -parenthesis followed by an asterisk. They are generally of the form -(*VERB) or (*VERB:NAME). Some may take either form, possibly behaving -differently depending on whether or not a name is present. A name is any -sequence of characters that does not include a closing parenthesis. The maximum -length of name is 255 in the 8-bit library and 65535 in the 16-bit and 32-bit -libraries. If the name is empty, that is, if the closing parenthesis -immediately follows the colon, the effect is as if the colon were not there. -Any number of these verbs may occur in a pattern. -.P -Since these verbs are specifically related to backtracking, most of them can be -used only when the pattern is to be matched using one of the traditional -matching functions, because these use a backtracking algorithm. With the -exception of (*FAIL), which behaves like a failing negative assertion, the -backtracking control verbs cause an error if encountered by a DFA matching -function. -.P -The behaviour of these verbs in -.\" HTML -.\" -repeated groups, -.\" -.\" HTML -.\" -assertions, -.\" -and in -.\" HTML -.\" -subpatterns called as subroutines -.\" -(whether or not recursively) is documented below. -. -. -.\" HTML -.SS "Optimizations that affect backtracking verbs" -.rs -.sp -PCRE contains some optimizations that are used to speed up matching by running -some checks at the start of each match attempt. For example, it may know the -minimum length of matching subject, or that a particular character must be -present. When one of these optimizations bypasses the running of a match, any -included backtracking verbs will not, of course, be processed. You can suppress -the start-of-match optimizations by setting the PCRE_NO_START_OPTIMIZE option -when calling \fBpcre_compile()\fP or \fBpcre_exec()\fP, or by starting the -pattern with (*NO_START_OPT). There is more discussion of this option in the -section entitled -.\" HTML -.\" -"Option bits for \fBpcre_exec()\fP" -.\" -in the -.\" HREF -\fBpcreapi\fP -.\" -documentation. -.P -Experiments with Perl suggest that it too has similar optimizations, sometimes -leading to anomalous results. -. -. -.SS "Verbs that act immediately" -.rs -.sp -The following verbs act as soon as they are encountered. They may not be -followed by a name. -.sp - (*ACCEPT) -.sp -This verb causes the match to end successfully, skipping the remainder of the -pattern. However, when it is inside a subpattern that is called as a -subroutine, only that subpattern is ended successfully. Matching then continues -at the outer level. If (*ACCEPT) in triggered in a positive assertion, the -assertion succeeds; in a negative assertion, the assertion fails. -.P -If (*ACCEPT) is inside capturing parentheses, the data so far is captured. For -example: -.sp - A((?:A|B(*ACCEPT)|C)D) -.sp -This matches "AB", "AAD", or "ACD"; when it matches "AB", "B" is captured by -the outer parentheses. -.sp - (*FAIL) or (*F) -.sp -This verb causes a matching failure, forcing backtracking to occur. It is -equivalent to (?!) but easier to read. The Perl documentation notes that it is -probably useful only when combined with (?{}) or (??{}). Those are, of course, -Perl features that are not present in PCRE. The nearest equivalent is the -callout feature, as for example in this pattern: -.sp - a+(?C)(*FAIL) -.sp -A match with the string "aaaa" always fails, but the callout is taken before -each backtrack happens (in this example, 10 times). -. -. -.SS "Recording which path was taken" -.rs -.sp -There is one verb whose main purpose is to track how a match was arrived at, -though it also has a secondary use in conjunction with advancing the match -starting point (see (*SKIP) below). -.sp - (*MARK:NAME) or (*:NAME) -.sp -A name is always required with this verb. There may be as many instances of -(*MARK) as you like in a pattern, and their names do not have to be unique. -.P -When a match succeeds, the name of the last-encountered (*MARK:NAME), -(*PRUNE:NAME), or (*THEN:NAME) on the matching path is passed back to the -caller as described in the section entitled -.\" HTML -.\" -"Extra data for \fBpcre_exec()\fP" -.\" -in the -.\" HREF -\fBpcreapi\fP -.\" -documentation. Here is an example of \fBpcretest\fP output, where the /K -modifier requests the retrieval and outputting of (*MARK) data: -.sp - re> /X(*MARK:A)Y|X(*MARK:B)Z/K - data> XY - 0: XY - MK: A - XZ - 0: XZ - MK: B -.sp -The (*MARK) name is tagged with "MK:" in this output, and in this example it -indicates which of the two alternatives matched. This is a more efficient way -of obtaining this information than putting each alternative in its own -capturing parentheses. -.P -If a verb with a name is encountered in a positive assertion that is true, the -name is recorded and passed back if it is the last-encountered. This does not -happen for negative assertions or failing positive assertions. -.P -After a partial match or a failed match, the last encountered name in the -entire match process is returned. For example: -.sp - re> /X(*MARK:A)Y|X(*MARK:B)Z/K - data> XP - No match, mark = B -.sp -Note that in this unanchored example the mark is retained from the match -attempt that started at the letter "X" in the subject. Subsequent match -attempts starting at "P" and then with an empty string do not get as far as the -(*MARK) item, but nevertheless do not reset it. -.P -If you are interested in (*MARK) values after failed matches, you should -probably set the PCRE_NO_START_OPTIMIZE option -.\" HTML -.\" -(see above) -.\" -to ensure that the match is always attempted. -. -. -.SS "Verbs that act after backtracking" -.rs -.sp -The following verbs do nothing when they are encountered. Matching continues -with what follows, but if there is no subsequent match, causing a backtrack to -the verb, a failure is forced. That is, backtracking cannot pass to the left of -the verb. However, when one of these verbs appears inside an atomic group or an -assertion that is true, its effect is confined to that group, because once the -group has been matched, there is never any backtracking into it. In this -situation, backtracking can "jump back" to the left of the entire atomic group -or assertion. (Remember also, as stated above, that this localization also -applies in subroutine calls.) -.P -These verbs differ in exactly what kind of failure occurs when backtracking -reaches them. The behaviour described below is what happens when the verb is -not in a subroutine or an assertion. Subsequent sections cover these special -cases. -.sp - (*COMMIT) -.sp -This verb, which may not be followed by a name, causes the whole match to fail -outright if there is a later matching failure that causes backtracking to reach -it. Even if the pattern is unanchored, no further attempts to find a match by -advancing the starting point take place. If (*COMMIT) is the only backtracking -verb that is encountered, once it has been passed \fBpcre_exec()\fP is -committed to finding a match at the current starting point, or not at all. For -example: -.sp - a+(*COMMIT)b -.sp -This matches "xxaab" but not "aacaab". It can be thought of as a kind of -dynamic anchor, or "I've started, so I must finish." The name of the most -recently passed (*MARK) in the path is passed back when (*COMMIT) forces a -match failure. -.P -If there is more than one backtracking verb in a pattern, a different one that -follows (*COMMIT) may be triggered first, so merely passing (*COMMIT) during a -match does not always guarantee that a match must be at this starting point. -.P -Note that (*COMMIT) at the start of a pattern is not the same as an anchor, -unless PCRE's start-of-match optimizations are turned off, as shown in this -output from \fBpcretest\fP: -.sp - re> /(*COMMIT)abc/ - data> xyzabc - 0: abc - data> xyzabc\eY - No match -.sp -For this pattern, PCRE knows that any match must start with "a", so the -optimization skips along the subject to "a" before applying the pattern to the -first set of data. The match attempt then succeeds. In the second set of data, -the escape sequence \eY is interpreted by the \fBpcretest\fP program. It causes -the PCRE_NO_START_OPTIMIZE option to be set when \fBpcre_exec()\fP is called. -This disables the optimization that skips along to the first character. The -pattern is now applied starting at "x", and so the (*COMMIT) causes the match -to fail without trying any other starting points. -.sp - (*PRUNE) or (*PRUNE:NAME) -.sp -This verb causes the match to fail at the current starting position in the -subject if there is a later matching failure that causes backtracking to reach -it. If the pattern is unanchored, the normal "bumpalong" advance to the next -starting character then happens. Backtracking can occur as usual to the left of -(*PRUNE), before it is reached, or when matching to the right of (*PRUNE), but -if there is no match to the right, backtracking cannot cross (*PRUNE). In -simple cases, the use of (*PRUNE) is just an alternative to an atomic group or -possessive quantifier, but there are some uses of (*PRUNE) that cannot be -expressed in any other way. In an anchored pattern (*PRUNE) has the same effect -as (*COMMIT). -.P -The behaviour of (*PRUNE:NAME) is the not the same as (*MARK:NAME)(*PRUNE). -It is like (*MARK:NAME) in that the name is remembered for passing back to the -caller. However, (*SKIP:NAME) searches only for names set with (*MARK). -.sp - (*SKIP) -.sp -This verb, when given without a name, is like (*PRUNE), except that if the -pattern is unanchored, the "bumpalong" advance is not to the next character, -but to the position in the subject where (*SKIP) was encountered. (*SKIP) -signifies that whatever text was matched leading up to it cannot be part of a -successful match. Consider: -.sp - a+(*SKIP)b -.sp -If the subject is "aaaac...", after the first match attempt fails (starting at -the first character in the string), the starting point skips on to start the -next attempt at "c". Note that a possessive quantifer does not have the same -effect as this example; although it would suppress backtracking during the -first match attempt, the second attempt would start at the second character -instead of skipping on to "c". -.sp - (*SKIP:NAME) -.sp -When (*SKIP) has an associated name, its behaviour is modified. When it is -triggered, the previous path through the pattern is searched for the most -recent (*MARK) that has the same name. If one is found, the "bumpalong" advance -is to the subject position that corresponds to that (*MARK) instead of to where -(*SKIP) was encountered. If no (*MARK) with a matching name is found, the -(*SKIP) is ignored. -.P -Note that (*SKIP:NAME) searches only for names set by (*MARK:NAME). It ignores -names that are set by (*PRUNE:NAME) or (*THEN:NAME). -.sp - (*THEN) or (*THEN:NAME) -.sp -This verb causes a skip to the next innermost alternative when backtracking -reaches it. That is, it cancels any further backtracking within the current -alternative. Its name comes from the observation that it can be used for a -pattern-based if-then-else block: -.sp - ( COND1 (*THEN) FOO | COND2 (*THEN) BAR | COND3 (*THEN) BAZ ) ... -.sp -If the COND1 pattern matches, FOO is tried (and possibly further items after -the end of the group if FOO succeeds); on failure, the matcher skips to the -second alternative and tries COND2, without backtracking into COND1. If that -succeeds and BAR fails, COND3 is tried. If subsequently BAZ fails, there are no -more alternatives, so there is a backtrack to whatever came before the entire -group. If (*THEN) is not inside an alternation, it acts like (*PRUNE). -.P -The behaviour of (*THEN:NAME) is the not the same as (*MARK:NAME)(*THEN). -It is like (*MARK:NAME) in that the name is remembered for passing back to the -caller. However, (*SKIP:NAME) searches only for names set with (*MARK). -.P -A subpattern that does not contain a | character is just a part of the -enclosing alternative; it is not a nested alternation with only one -alternative. The effect of (*THEN) extends beyond such a subpattern to the -enclosing alternative. Consider this pattern, where A, B, etc. are complex -pattern fragments that do not contain any | characters at this level: -.sp - A (B(*THEN)C) | D -.sp -If A and B are matched, but there is a failure in C, matching does not -backtrack into A; instead it moves to the next alternative, that is, D. -However, if the subpattern containing (*THEN) is given an alternative, it -behaves differently: -.sp - A (B(*THEN)C | (*FAIL)) | D -.sp -The effect of (*THEN) is now confined to the inner subpattern. After a failure -in C, matching moves to (*FAIL), which causes the whole subpattern to fail -because there are no more alternatives to try. In this case, matching does now -backtrack into A. -.P -Note that a conditional subpattern is not considered as having two -alternatives, because only one is ever used. In other words, the | character in -a conditional subpattern has a different meaning. Ignoring white space, -consider: -.sp - ^.*? (?(?=a) a | b(*THEN)c ) -.sp -If the subject is "ba", this pattern does not match. Because .*? is ungreedy, -it initially matches zero characters. The condition (?=a) then fails, the -character "b" is matched, but "c" is not. At this point, matching does not -backtrack to .*? as might perhaps be expected from the presence of the | -character. The conditional subpattern is part of the single alternative that -comprises the whole pattern, and so the match fails. (If there was a backtrack -into .*?, allowing it to match "b", the match would succeed.) -.P -The verbs just described provide four different "strengths" of control when -subsequent matching fails. (*THEN) is the weakest, carrying on the match at the -next alternative. (*PRUNE) comes next, failing the match at the current -starting position, but allowing an advance to the next character (for an -unanchored pattern). (*SKIP) is similar, except that the advance may be more -than one character. (*COMMIT) is the strongest, causing the entire match to -fail. -. -. -.SS "More than one backtracking verb" -.rs -.sp -If more than one backtracking verb is present in a pattern, the one that is -backtracked onto first acts. For example, consider this pattern, where A, B, -etc. are complex pattern fragments: -.sp - (A(*COMMIT)B(*THEN)C|ABD) -.sp -If A matches but B fails, the backtrack to (*COMMIT) causes the entire match to -fail. However, if A and B match, but C fails, the backtrack to (*THEN) causes -the next alternative (ABD) to be tried. This behaviour is consistent, but is -not always the same as Perl's. It means that if two or more backtracking verbs -appear in succession, all the the last of them has no effect. Consider this -example: -.sp - ...(*COMMIT)(*PRUNE)... -.sp -If there is a matching failure to the right, backtracking onto (*PRUNE) causes -it to be triggered, and its action is taken. There can never be a backtrack -onto (*COMMIT). -. -. -.\" HTML -.SS "Backtracking verbs in repeated groups" -.rs -.sp -PCRE differs from Perl in its handling of backtracking verbs in repeated -groups. For example, consider: -.sp - /(a(*COMMIT)b)+ac/ -.sp -If the subject is "abac", Perl matches, but PCRE fails because the (*COMMIT) in -the second repeat of the group acts. -. -. -.\" HTML -.SS "Backtracking verbs in assertions" -.rs -.sp -(*FAIL) in an assertion has its normal effect: it forces an immediate backtrack. -.P -(*ACCEPT) in a positive assertion causes the assertion to succeed without any -further processing. In a negative assertion, (*ACCEPT) causes the assertion to -fail without any further processing. -.P -The other backtracking verbs are not treated specially if they appear in a -positive assertion. In particular, (*THEN) skips to the next alternative in the -innermost enclosing group that has alternations, whether or not this is within -the assertion. -.P -Negative assertions are, however, different, in order to ensure that changing a -positive assertion into a negative assertion changes its result. Backtracking -into (*COMMIT), (*SKIP), or (*PRUNE) causes a negative assertion to be true, -without considering any further alternative branches in the assertion. -Backtracking into (*THEN) causes it to skip to the next enclosing alternative -within the assertion (the normal behaviour), but if the assertion does not have -such an alternative, (*THEN) behaves like (*PRUNE). -. -. -.\" HTML -.SS "Backtracking verbs in subroutines" -.rs -.sp -These behaviours occur whether or not the subpattern is called recursively. -Perl's treatment of subroutines is different in some cases. -.P -(*FAIL) in a subpattern called as a subroutine has its normal effect: it forces -an immediate backtrack. -.P -(*ACCEPT) in a subpattern called as a subroutine causes the subroutine match to -succeed without any further processing. Matching then continues after the -subroutine call. -.P -(*COMMIT), (*SKIP), and (*PRUNE) in a subpattern called as a subroutine cause -the subroutine match to fail. -.P -(*THEN) skips to the next alternative in the innermost enclosing group within -the subpattern that has alternatives. If there is no such group within the -subpattern, (*THEN) causes the subroutine match to fail. -. -. -.SH "SEE ALSO" -.rs -.sp -\fBpcreapi\fP(3), \fBpcrecallout\fP(3), \fBpcrematching\fP(3), -\fBpcresyntax\fP(3), \fBpcre\fP(3), \fBpcre16(3)\fP, \fBpcre32(3)\fP. -. -. -.SH AUTHOR -.rs -.sp -.nf -Philip Hazel -University Computing Service -Cambridge CB2 3QH, England. -.fi -. -. -.SH REVISION -.rs -.sp -.nf -Last updated: 23 October 2016 -Copyright (c) 1997-2016 University of Cambridge. -.fi diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcreperform.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcreperform.3 deleted file mode 100644 index fb2aa959..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcreperform.3 +++ /dev/null @@ -1,177 +0,0 @@ -.TH PCREPERFORM 3 "09 January 2012" "PCRE 8.30" -.SH NAME -PCRE - Perl-compatible regular expressions -.SH "PCRE PERFORMANCE" -.rs -.sp -Two aspects of performance are discussed below: memory usage and processing -time. The way you express your pattern as a regular expression can affect both -of them. -. -.SH "COMPILED PATTERN MEMORY USAGE" -.rs -.sp -Patterns are compiled by PCRE into a reasonably efficient interpretive code, so -that most simple patterns do not use much memory. However, there is one case -where the memory usage of a compiled pattern can be unexpectedly large. If a -parenthesized subpattern has a quantifier with a minimum greater than 1 and/or -a limited maximum, the whole subpattern is repeated in the compiled code. For -example, the pattern -.sp - (abc|def){2,4} -.sp -is compiled as if it were -.sp - (abc|def)(abc|def)((abc|def)(abc|def)?)? -.sp -(Technical aside: It is done this way so that backtrack points within each of -the repetitions can be independently maintained.) -.P -For regular expressions whose quantifiers use only small numbers, this is not -usually a problem. However, if the numbers are large, and particularly if such -repetitions are nested, the memory usage can become an embarrassment. For -example, the very simple pattern -.sp - ((ab){1,1000}c){1,3} -.sp -uses 51K bytes when compiled using the 8-bit library. When PCRE is compiled -with its default internal pointer size of two bytes, the size limit on a -compiled pattern is 64K data units, and this is reached with the above pattern -if the outer repetition is increased from 3 to 4. PCRE can be compiled to use -larger internal pointers and thus handle larger compiled patterns, but it is -better to try to rewrite your pattern to use less memory if you can. -.P -One way of reducing the memory usage for such patterns is to make use of PCRE's -.\" HTML -.\" -"subroutine" -.\" -facility. Re-writing the above pattern as -.sp - ((ab)(?2){0,999}c)(?1){0,2} -.sp -reduces the memory requirements to 18K, and indeed it remains under 20K even -with the outer repetition increased to 100. However, this pattern is not -exactly equivalent, because the "subroutine" calls are treated as -.\" HTML -.\" -atomic groups -.\" -into which there can be no backtracking if there is a subsequent matching -failure. Therefore, PCRE cannot do this kind of rewriting automatically. -Furthermore, there is a noticeable loss of speed when executing the modified -pattern. Nevertheless, if the atomic grouping is not a problem and the loss of -speed is acceptable, this kind of rewriting will allow you to process patterns -that PCRE cannot otherwise handle. -. -. -.SH "STACK USAGE AT RUN TIME" -.rs -.sp -When \fBpcre_exec()\fP or \fBpcre[16|32]_exec()\fP is used for matching, certain -kinds of pattern can cause it to use large amounts of the process stack. In -some environments the default process stack is quite small, and if it runs out -the result is often SIGSEGV. This issue is probably the most frequently raised -problem with PCRE. Rewriting your pattern can often help. The -.\" HREF -\fBpcrestack\fP -.\" -documentation discusses this issue in detail. -. -. -.SH "PROCESSING TIME" -.rs -.sp -Certain items in regular expression patterns are processed more efficiently -than others. It is more efficient to use a character class like [aeiou] than a -set of single-character alternatives such as (a|e|i|o|u). In general, the -simplest construction that provides the required behaviour is usually the most -efficient. Jeffrey Friedl's book contains a lot of useful general discussion -about optimizing regular expressions for efficient performance. This document -contains a few observations about PCRE. -.P -Using Unicode character properties (the \ep, \eP, and \eX escapes) is slow, -because PCRE has to use a multi-stage table lookup whenever it needs a -character's property. If you can find an alternative pattern that does not use -character properties, it will probably be faster. -.P -By default, the escape sequences \eb, \ed, \es, and \ew, and the POSIX -character classes such as [:alpha:] do not use Unicode properties, partly for -backwards compatibility, and partly for performance reasons. However, you can -set PCRE_UCP if you want Unicode character properties to be used. This can -double the matching time for items such as \ed, when matched with -a traditional matching function; the performance loss is less with -a DFA matching function, and in both cases there is not much difference for -\eb. -.P -When a pattern begins with .* not in parentheses, or in parentheses that are -not the subject of a backreference, and the PCRE_DOTALL option is set, the -pattern is implicitly anchored by PCRE, since it can match only at the start of -a subject string. However, if PCRE_DOTALL is not set, PCRE cannot make this -optimization, because the . metacharacter does not then match a newline, and if -the subject string contains newlines, the pattern may match from the character -immediately following one of them instead of from the very start. For example, -the pattern -.sp - .*second -.sp -matches the subject "first\enand second" (where \en stands for a newline -character), with the match starting at the seventh character. In order to do -this, PCRE has to retry the match starting after every newline in the subject. -.P -If you are using such a pattern with subject strings that do not contain -newlines, the best performance is obtained by setting PCRE_DOTALL, or starting -the pattern with ^.* or ^.*? to indicate explicit anchoring. That saves PCRE -from having to scan along the subject looking for a newline to restart at. -.P -Beware of patterns that contain nested indefinite repeats. These can take a -long time to run when applied to a string that does not match. Consider the -pattern fragment -.sp - ^(a+)* -.sp -This can match "aaaa" in 16 different ways, and this number increases very -rapidly as the string gets longer. (The * repeat can match 0, 1, 2, 3, or 4 -times, and for each of those cases other than 0 or 4, the + repeats can match -different numbers of times.) When the remainder of the pattern is such that the -entire match is going to fail, PCRE has in principle to try every possible -variation, and this can take an extremely long time, even for relatively short -strings. -.P -An optimization catches some of the more simple cases such as -.sp - (a+)*b -.sp -where a literal character follows. Before embarking on the standard matching -procedure, PCRE checks that there is a "b" later in the subject string, and if -there is not, it fails the match immediately. However, when there is no -following literal this optimization cannot be used. You can see the difference -by comparing the behaviour of -.sp - (a+)*\ed -.sp -with the pattern above. The former gives a failure almost instantly when -applied to a whole line of "a" characters, whereas the latter takes an -appreciable time with strings longer than about 20 characters. -.P -In many cases, the solution to this kind of performance issue is to use an -atomic group or a possessive quantifier. -. -. -.SH AUTHOR -.rs -.sp -.nf -Philip Hazel -University Computing Service -Cambridge CB2 3QH, England. -.fi -. -. -.SH REVISION -.rs -.sp -.nf -Last updated: 25 August 2012 -Copyright (c) 1997-2012 University of Cambridge. -.fi diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcreposix.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcreposix.3 deleted file mode 100644 index 77890f36..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcreposix.3 +++ /dev/null @@ -1,267 +0,0 @@ -.TH PCREPOSIX 3 "09 January 2012" "PCRE 8.30" -.SH NAME -PCRE - Perl-compatible regular expressions. -.SH "SYNOPSIS" -.rs -.sp -.B #include -.PP -.nf -.B int regcomp(regex_t *\fIpreg\fP, const char *\fIpattern\fP, -.B " int \fIcflags\fP);" -.sp -.B int regexec(regex_t *\fIpreg\fP, const char *\fIstring\fP, -.B " size_t \fInmatch\fP, regmatch_t \fIpmatch\fP[], int \fIeflags\fP);" -.B " size_t regerror(int \fIerrcode\fP, const regex_t *\fIpreg\fP," -.B " char *\fIerrbuf\fP, size_t \fIerrbuf_size\fP);" -.sp -.B void regfree(regex_t *\fIpreg\fP); -.fi -. -.SH DESCRIPTION -.rs -.sp -This set of functions provides a POSIX-style API for the PCRE regular -expression 8-bit library. See the -.\" HREF -\fBpcreapi\fP -.\" -documentation for a description of PCRE's native API, which contains much -additional functionality. There is no POSIX-style wrapper for PCRE's 16-bit -and 32-bit library. -.P -The functions described here are just wrapper functions that ultimately call -the PCRE native API. Their prototypes are defined in the \fBpcreposix.h\fP -header file, and on Unix systems the library itself is called -\fBpcreposix.a\fP, so can be accessed by adding \fB-lpcreposix\fP to the -command for linking an application that uses them. Because the POSIX functions -call the native ones, it is also necessary to add \fB-lpcre\fP. -.P -I have implemented only those POSIX option bits that can be reasonably mapped -to PCRE native options. In addition, the option REG_EXTENDED is defined with -the value zero. This has no effect, but since programs that are written to the -POSIX interface often use it, this makes it easier to slot in PCRE as a -replacement library. Other POSIX options are not even defined. -.P -There are also some other options that are not defined by POSIX. These have -been added at the request of users who want to make use of certain -PCRE-specific features via the POSIX calling interface. -.P -When PCRE is called via these functions, it is only the API that is POSIX-like -in style. The syntax and semantics of the regular expressions themselves are -still those of Perl, subject to the setting of various PCRE options, as -described below. "POSIX-like in style" means that the API approximates to the -POSIX definition; it is not fully POSIX-compatible, and in multi-byte encoding -domains it is probably even less compatible. -.P -The header for these functions is supplied as \fBpcreposix.h\fP to avoid any -potential clash with other POSIX libraries. It can, of course, be renamed or -aliased as \fBregex.h\fP, which is the "correct" name. It provides two -structure types, \fIregex_t\fP for compiled internal forms, and -\fIregmatch_t\fP for returning captured substrings. It also defines some -constants whose names start with "REG_"; these are used for setting options and -identifying error codes. -. -. -.SH "COMPILING A PATTERN" -.rs -.sp -The function \fBregcomp()\fP is called to compile a pattern into an -internal form. The pattern is a C string terminated by a binary zero, and -is passed in the argument \fIpattern\fP. The \fIpreg\fP argument is a pointer -to a \fBregex_t\fP structure that is used as a base for storing information -about the compiled regular expression. -.P -The argument \fIcflags\fP is either zero, or contains one or more of the bits -defined by the following macros: -.sp - REG_DOTALL -.sp -The PCRE_DOTALL option is set when the regular expression is passed for -compilation to the native function. Note that REG_DOTALL is not part of the -POSIX standard. -.sp - REG_ICASE -.sp -The PCRE_CASELESS option is set when the regular expression is passed for -compilation to the native function. -.sp - REG_NEWLINE -.sp -The PCRE_MULTILINE option is set when the regular expression is passed for -compilation to the native function. Note that this does \fInot\fP mimic the -defined POSIX behaviour for REG_NEWLINE (see the following section). -.sp - REG_NOSUB -.sp -The PCRE_NO_AUTO_CAPTURE option is set when the regular expression is passed -for compilation to the native function. In addition, when a pattern that is -compiled with this flag is passed to \fBregexec()\fP for matching, the -\fInmatch\fP and \fIpmatch\fP arguments are ignored, and no captured strings -are returned. -.sp - REG_UCP -.sp -The PCRE_UCP option is set when the regular expression is passed for -compilation to the native function. This causes PCRE to use Unicode properties -when matchine \ed, \ew, etc., instead of just recognizing ASCII values. Note -that REG_UTF8 is not part of the POSIX standard. -.sp - REG_UNGREEDY -.sp -The PCRE_UNGREEDY option is set when the regular expression is passed for -compilation to the native function. Note that REG_UNGREEDY is not part of the -POSIX standard. -.sp - REG_UTF8 -.sp -The PCRE_UTF8 option is set when the regular expression is passed for -compilation to the native function. This causes the pattern itself and all data -strings used for matching it to be treated as UTF-8 strings. Note that REG_UTF8 -is not part of the POSIX standard. -.P -In the absence of these flags, no options are passed to the native function. -This means the the regex is compiled with PCRE default semantics. In -particular, the way it handles newline characters in the subject string is the -Perl way, not the POSIX way. Note that setting PCRE_MULTILINE has only -\fIsome\fP of the effects specified for REG_NEWLINE. It does not affect the way -newlines are matched by . (they are not) or by a negative class such as [^a] -(they are). -.P -The yield of \fBregcomp()\fP is zero on success, and non-zero otherwise. The -\fIpreg\fP structure is filled in on success, and one member of the structure -is public: \fIre_nsub\fP contains the number of capturing subpatterns in -the regular expression. Various error codes are defined in the header file. -.P -NOTE: If the yield of \fBregcomp()\fP is non-zero, you must not attempt to -use the contents of the \fIpreg\fP structure. If, for example, you pass it to -\fBregexec()\fP, the result is undefined and your program is likely to crash. -. -. -.SH "MATCHING NEWLINE CHARACTERS" -.rs -.sp -This area is not simple, because POSIX and Perl take different views of things. -It is not possible to get PCRE to obey POSIX semantics, but then PCRE was never -intended to be a POSIX engine. The following table lists the different -possibilities for matching newline characters in PCRE: -.sp - Default Change with -.sp - . matches newline no PCRE_DOTALL - newline matches [^a] yes not changeable - $ matches \en at end yes PCRE_DOLLARENDONLY - $ matches \en in middle no PCRE_MULTILINE - ^ matches \en in middle no PCRE_MULTILINE -.sp -This is the equivalent table for POSIX: -.sp - Default Change with -.sp - . matches newline yes REG_NEWLINE - newline matches [^a] yes REG_NEWLINE - $ matches \en at end no REG_NEWLINE - $ matches \en in middle no REG_NEWLINE - ^ matches \en in middle no REG_NEWLINE -.sp -PCRE's behaviour is the same as Perl's, except that there is no equivalent for -PCRE_DOLLAR_ENDONLY in Perl. In both PCRE and Perl, there is no way to stop -newline from matching [^a]. -.P -The default POSIX newline handling can be obtained by setting PCRE_DOTALL and -PCRE_DOLLAR_ENDONLY, but there is no way to make PCRE behave exactly as for the -REG_NEWLINE action. -. -. -.SH "MATCHING A PATTERN" -.rs -.sp -The function \fBregexec()\fP is called to match a compiled pattern \fIpreg\fP -against a given \fIstring\fP, which is by default terminated by a zero byte -(but see REG_STARTEND below), subject to the options in \fIeflags\fP. These can -be: -.sp - REG_NOTBOL -.sp -The PCRE_NOTBOL option is set when calling the underlying PCRE matching -function. -.sp - REG_NOTEMPTY -.sp -The PCRE_NOTEMPTY option is set when calling the underlying PCRE matching -function. Note that REG_NOTEMPTY is not part of the POSIX standard. However, -setting this option can give more POSIX-like behaviour in some situations. -.sp - REG_NOTEOL -.sp -The PCRE_NOTEOL option is set when calling the underlying PCRE matching -function. -.sp - REG_STARTEND -.sp -The string is considered to start at \fIstring\fP + \fIpmatch[0].rm_so\fP and -to have a terminating NUL located at \fIstring\fP + \fIpmatch[0].rm_eo\fP -(there need not actually be a NUL at that location), regardless of the value of -\fInmatch\fP. This is a BSD extension, compatible with but not specified by -IEEE Standard 1003.2 (POSIX.2), and should be used with caution in software -intended to be portable to other systems. Note that a non-zero \fIrm_so\fP does -not imply REG_NOTBOL; REG_STARTEND affects only the location of the string, not -how it is matched. -.P -If the pattern was compiled with the REG_NOSUB flag, no data about any matched -strings is returned. The \fInmatch\fP and \fIpmatch\fP arguments of -\fBregexec()\fP are ignored. -.P -If the value of \fInmatch\fP is zero, or if the value \fIpmatch\fP is NULL, -no data about any matched strings is returned. -.P -Otherwise,the portion of the string that was matched, and also any captured -substrings, are returned via the \fIpmatch\fP argument, which points to an -array of \fInmatch\fP structures of type \fIregmatch_t\fP, containing the -members \fIrm_so\fP and \fIrm_eo\fP. These contain the offset to the first -character of each substring and the offset to the first character after the end -of each substring, respectively. The 0th element of the vector relates to the -entire portion of \fIstring\fP that was matched; subsequent elements relate to -the capturing subpatterns of the regular expression. Unused entries in the -array have both structure members set to -1. -.P -A successful match yields a zero return; various error codes are defined in the -header file, of which REG_NOMATCH is the "expected" failure code. -. -. -.SH "ERROR MESSAGES" -.rs -.sp -The \fBregerror()\fP function maps a non-zero errorcode from either -\fBregcomp()\fP or \fBregexec()\fP to a printable message. If \fIpreg\fP is not -NULL, the error should have arisen from the use of that structure. A message -terminated by a binary zero is placed in \fIerrbuf\fP. The length of the -message, including the zero, is limited to \fIerrbuf_size\fP. The yield of the -function is the size of buffer needed to hold the whole message. -. -. -.SH MEMORY USAGE -.rs -.sp -Compiling a regular expression causes memory to be allocated and associated -with the \fIpreg\fP structure. The function \fBregfree()\fP frees all such -memory, after which \fIpreg\fP may no longer be used as a compiled expression. -. -. -.SH AUTHOR -.rs -.sp -.nf -Philip Hazel -University Computing Service -Cambridge CB2 3QH, England. -.fi -. -. -.SH REVISION -.rs -.sp -.nf -Last updated: 09 January 2012 -Copyright (c) 1997-2012 University of Cambridge. -.fi diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcreprecompile.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcreprecompile.3 deleted file mode 100644 index 40f257a9..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcreprecompile.3 +++ /dev/null @@ -1,155 +0,0 @@ -.TH PCREPRECOMPILE 3 "12 November 2013" "PCRE 8.34" -.SH NAME -PCRE - Perl-compatible regular expressions -.SH "SAVING AND RE-USING PRECOMPILED PCRE PATTERNS" -.rs -.sp -If you are running an application that uses a large number of regular -expression patterns, it may be useful to store them in a precompiled form -instead of having to compile them every time the application is run. -If you are not using any private character tables (see the -.\" HREF -\fBpcre_maketables()\fP -.\" -documentation), this is relatively straightforward. If you are using private -tables, it is a little bit more complicated. However, if you are using the -just-in-time optimization feature, it is not possible to save and reload the -JIT data. -.P -If you save compiled patterns to a file, you can copy them to a different host -and run them there. If the two hosts have different endianness (byte order), -you should run the \fBpcre[16|32]_pattern_to_host_byte_order()\fP function on the -new host before trying to match the pattern. The matching functions return -PCRE_ERROR_BADENDIANNESS if they detect a pattern with the wrong endianness. -.P -Compiling regular expressions with one version of PCRE for use with a different -version is not guaranteed to work and may cause crashes, and saving and -restoring a compiled pattern loses any JIT optimization data. -. -. -.SH "SAVING A COMPILED PATTERN" -.rs -.sp -The value returned by \fBpcre[16|32]_compile()\fP points to a single block of -memory that holds the compiled pattern and associated data. You can find the -length of this block in bytes by calling \fBpcre[16|32]_fullinfo()\fP with an -argument of PCRE_INFO_SIZE. You can then save the data in any appropriate -manner. Here is sample code for the 8-bit library that compiles a pattern and -writes it to a file. It assumes that the variable \fIfd\fP refers to a file -that is open for output: -.sp - int erroroffset, rc, size; - char *error; - pcre *re; -.sp - re = pcre_compile("my pattern", 0, &error, &erroroffset, NULL); - if (re == NULL) { ... handle errors ... } - rc = pcre_fullinfo(re, NULL, PCRE_INFO_SIZE, &size); - if (rc < 0) { ... handle errors ... } - rc = fwrite(re, 1, size, fd); - if (rc != size) { ... handle errors ... } -.sp -In this example, the bytes that comprise the compiled pattern are copied -exactly. Note that this is binary data that may contain any of the 256 possible -byte values. On systems that make a distinction between binary and non-binary -data, be sure that the file is opened for binary output. -.P -If you want to write more than one pattern to a file, you will have to devise a -way of separating them. For binary data, preceding each pattern with its length -is probably the most straightforward approach. Another possibility is to write -out the data in hexadecimal instead of binary, one pattern to a line. -.P -Saving compiled patterns in a file is only one possible way of storing them for -later use. They could equally well be saved in a database, or in the memory of -some daemon process that passes them via sockets to the processes that want -them. -.P -If the pattern has been studied, it is also possible to save the normal study -data in a similar way to the compiled pattern itself. However, if the -PCRE_STUDY_JIT_COMPILE was used, the just-in-time data that is created cannot -be saved because it is too dependent on the current environment. When studying -generates additional information, \fBpcre[16|32]_study()\fP returns a pointer to a -\fBpcre[16|32]_extra\fP data block. Its format is defined in the -.\" HTML -.\" -section on matching a pattern -.\" -in the -.\" HREF -\fBpcreapi\fP -.\" -documentation. The \fIstudy_data\fP field points to the binary study data, and -this is what you must save (not the \fBpcre[16|32]_extra\fP block itself). The -length of the study data can be obtained by calling \fBpcre[16|32]_fullinfo()\fP -with an argument of PCRE_INFO_STUDYSIZE. Remember to check that -\fBpcre[16|32]_study()\fP did return a non-NULL value before trying to save the -study data. -. -. -.SH "RE-USING A PRECOMPILED PATTERN" -.rs -.sp -Re-using a precompiled pattern is straightforward. Having reloaded it into main -memory, called \fBpcre[16|32]_pattern_to_host_byte_order()\fP if necessary, you -pass its pointer to \fBpcre[16|32]_exec()\fP or \fBpcre[16|32]_dfa_exec()\fP in -the usual way. -.P -However, if you passed a pointer to custom character tables when the pattern -was compiled (the \fItableptr\fP argument of \fBpcre[16|32]_compile()\fP), you -must now pass a similar pointer to \fBpcre[16|32]_exec()\fP or -\fBpcre[16|32]_dfa_exec()\fP, because the value saved with the compiled pattern -will obviously be nonsense. A field in a \fBpcre[16|32]_extra()\fP block is used -to pass this data, as described in the -.\" HTML -.\" -section on matching a pattern -.\" -in the -.\" HREF -\fBpcreapi\fP -.\" -documentation. -.P -\fBWarning:\fP The tables that \fBpcre_exec()\fP and \fBpcre_dfa_exec()\fP use -must be the same as those that were used when the pattern was compiled. If this -is not the case, the behaviour is undefined. -.P -If you did not provide custom character tables when the pattern was compiled, -the pointer in the compiled pattern is NULL, which causes the matching -functions to use PCRE's internal tables. Thus, you do not need to take any -special action at run time in this case. -.P -If you saved study data with the compiled pattern, you need to create your own -\fBpcre[16|32]_extra\fP data block and set the \fIstudy_data\fP field to point -to the reloaded study data. You must also set the PCRE_EXTRA_STUDY_DATA bit in -the \fIflags\fP field to indicate that study data is present. Then pass the -\fBpcre[16|32]_extra\fP block to the matching function in the usual way. If the -pattern was studied for just-in-time optimization, that data cannot be saved, -and so is lost by a save/restore cycle. -. -. -.SH "COMPATIBILITY WITH DIFFERENT PCRE RELEASES" -.rs -.sp -In general, it is safest to recompile all saved patterns when you update to a -new PCRE release, though not all updates actually require this. -. -. -. -.SH AUTHOR -.rs -.sp -.nf -Philip Hazel -University Computing Service -Cambridge CB2 3QH, England. -.fi -. -. -.SH REVISION -.rs -.sp -.nf -Last updated: 12 November 2013 -Copyright (c) 1997-2013 University of Cambridge. -.fi diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcresample.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcresample.3 deleted file mode 100644 index d7fe7ec5..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcresample.3 +++ /dev/null @@ -1,99 +0,0 @@ -.TH PCRESAMPLE 3 "10 January 2012" "PCRE 8.30" -.SH NAME -PCRE - Perl-compatible regular expressions -.SH "PCRE SAMPLE PROGRAM" -.rs -.sp -A simple, complete demonstration program, to get you started with using PCRE, -is supplied in the file \fIpcredemo.c\fP in the PCRE distribution. A listing of -this program is given in the -.\" HREF -\fBpcredemo\fP -.\" -documentation. If you do not have a copy of the PCRE distribution, you can save -this listing to re-create \fIpcredemo.c\fP. -.P -The demonstration program, which uses the original PCRE 8-bit library, compiles -the regular expression that is its first argument, and matches it against the -subject string in its second argument. No PCRE options are set, and default -character tables are used. If matching succeeds, the program outputs the -portion of the subject that matched, together with the contents of any captured -substrings. -.P -If the -g option is given on the command line, the program then goes on to -check for further matches of the same regular expression in the same subject -string. The logic is a little bit tricky because of the possibility of matching -an empty string. Comments in the code explain what is going on. -.P -If PCRE is installed in the standard include and library directories for your -operating system, you should be able to compile the demonstration program using -this command: -.sp - gcc -o pcredemo pcredemo.c -lpcre -.sp -If PCRE is installed elsewhere, you may need to add additional options to the -command line. For example, on a Unix-like system that has PCRE installed in -\fI/usr/local\fP, you can compile the demonstration program using a command -like this: -.sp -.\" JOINSH - gcc -o pcredemo -I/usr/local/include pcredemo.c \e - -L/usr/local/lib -lpcre -.sp -In a Windows environment, if you want to statically link the program against a -non-dll \fBpcre.a\fP file, you must uncomment the line that defines PCRE_STATIC -before including \fBpcre.h\fP, because otherwise the \fBpcre_malloc()\fP and -\fBpcre_free()\fP exported functions will be declared -\fB__declspec(dllimport)\fP, with unwanted results. -.P -Once you have compiled and linked the demonstration program, you can run simple -tests like this: -.sp - ./pcredemo 'cat|dog' 'the cat sat on the mat' - ./pcredemo -g 'cat|dog' 'the dog sat on the cat' -.sp -Note that there is a much more comprehensive test program, called -.\" HREF -\fBpcretest\fP, -.\" -which supports many more facilities for testing regular expressions and both -PCRE libraries. The -.\" HREF -\fBpcredemo\fP -.\" -program is provided as a simple coding example. -.P -If you try to run -.\" HREF -\fBpcredemo\fP -.\" -when PCRE is not installed in the standard library directory, you may get an -error like this on some operating systems (e.g. Solaris): -.sp - ld.so.1: a.out: fatal: libpcre.so.0: open failed: No such file or directory -.sp -This is caused by the way shared library support works on those systems. You -need to add -.sp - -R/usr/local/lib -.sp -(for example) to the compile command to get round this problem. -. -. -.SH AUTHOR -.rs -.sp -.nf -Philip Hazel -University Computing Service -Cambridge CB2 3QH, England. -.fi -. -. -.SH REVISION -.rs -.sp -.nf -Last updated: 10 January 2012 -Copyright (c) 1997-2012 University of Cambridge. -.fi diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcrestack.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcrestack.3 deleted file mode 100644 index 798f0bca..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcrestack.3 +++ /dev/null @@ -1,215 +0,0 @@ -.TH PCRESTACK 3 "24 June 2012" "PCRE 8.30" -.SH NAME -PCRE - Perl-compatible regular expressions -.SH "PCRE DISCUSSION OF STACK USAGE" -.rs -.sp -When you call \fBpcre[16|32]_exec()\fP, it makes use of an internal function -called \fBmatch()\fP. This calls itself recursively at branch points in the -pattern, in order to remember the state of the match so that it can back up and -try a different alternative if the first one fails. As matching proceeds deeper -and deeper into the tree of possibilities, the recursion depth increases. The -\fBmatch()\fP function is also called in other circumstances, for example, -whenever a parenthesized sub-pattern is entered, and in certain cases of -repetition. -.P -Not all calls of \fBmatch()\fP increase the recursion depth; for an item such -as a* it may be called several times at the same level, after matching -different numbers of a's. Furthermore, in a number of cases where the result of -the recursive call would immediately be passed back as the result of the -current call (a "tail recursion"), the function is just restarted instead. -.P -The above comments apply when \fBpcre[16|32]_exec()\fP is run in its normal -interpretive manner. If the pattern was studied with the -PCRE_STUDY_JIT_COMPILE option, and just-in-time compiling was successful, and -the options passed to \fBpcre[16|32]_exec()\fP were not incompatible, the matching -process uses the JIT-compiled code instead of the \fBmatch()\fP function. In -this case, the memory requirements are handled entirely differently. See the -.\" HREF -\fBpcrejit\fP -.\" -documentation for details. -.P -The \fBpcre[16|32]_dfa_exec()\fP function operates in an entirely different way, -and uses recursion only when there is a regular expression recursion or -subroutine call in the pattern. This includes the processing of assertion and -"once-only" subpatterns, which are handled like subroutine calls. Normally, -these are never very deep, and the limit on the complexity of -\fBpcre[16|32]_dfa_exec()\fP is controlled by the amount of workspace it is given. -However, it is possible to write patterns with runaway infinite recursions; -such patterns will cause \fBpcre[16|32]_dfa_exec()\fP to run out of stack. At -present, there is no protection against this. -.P -The comments that follow do NOT apply to \fBpcre[16|32]_dfa_exec()\fP; they are -relevant only for \fBpcre[16|32]_exec()\fP without the JIT optimization. -. -. -.SS "Reducing \fBpcre[16|32]_exec()\fP's stack usage" -.rs -.sp -Each time that \fBmatch()\fP is actually called recursively, it uses memory -from the process stack. For certain kinds of pattern and data, very large -amounts of stack may be needed, despite the recognition of "tail recursion". -You can often reduce the amount of recursion, and therefore the amount of stack -used, by modifying the pattern that is being matched. Consider, for example, -this pattern: -.sp - ([^<]|<(?!inet))+ -.sp -It matches from wherever it starts until it encounters " -.\" -section on extra data for \fBpcre[16|32]_exec()\fP -.\" -in the -.\" HREF -\fBpcreapi\fP -.\" -documentation. -.P -As a very rough rule of thumb, you should reckon on about 500 bytes per -recursion. Thus, if you want to limit your stack usage to 8Mb, you should set -the limit at 16000 recursions. A 64Mb stack, on the other hand, can support -around 128000 recursions. -.P -In Unix-like environments, the \fBpcretest\fP test program has a command line -option (\fB-S\fP) that can be used to increase the size of its stack. As long -as the stack is large enough, another option (\fB-M\fP) can be used to find the -smallest limits that allow a particular pattern to match a given subject -string. This is done by calling \fBpcre[16|32]_exec()\fP repeatedly with different -limits. -. -. -.SS "Obtaining an estimate of stack usage" -.rs -.sp -The actual amount of stack used per recursion can vary quite a lot, depending -on the compiler that was used to build PCRE and the optimization or debugging -options that were set for it. The rule of thumb value of 500 bytes mentioned -above may be larger or smaller than what is actually needed. A better -approximation can be obtained by running this command: -.sp - pcretest -m -C -.sp -The \fB-C\fP option causes \fBpcretest\fP to output information about the -options with which PCRE was compiled. When \fB-m\fP is also given (before -\fB-C\fP), information about stack use is given in a line like this: -.sp - Match recursion uses stack: approximate frame size = 640 bytes -.sp -The value is approximate because some recursions need a bit more (up to perhaps -16 more bytes). -.P -If the above command is given when PCRE is compiled to use the heap instead of -the stack for recursion, the value that is output is the size of each block -that is obtained from the heap. -. -. -.SS "Changing stack size in Unix-like systems" -.rs -.sp -In Unix-like environments, there is not often a problem with the stack unless -very long strings are involved, though the default limit on stack size varies -from system to system. Values from 8Mb to 64Mb are common. You can find your -default limit by running the command: -.sp - ulimit -s -.sp -Unfortunately, the effect of running out of stack is often SIGSEGV, though -sometimes a more explicit error message is given. You can normally increase the -limit on stack size by code such as this: -.sp - struct rlimit rlim; - getrlimit(RLIMIT_STACK, &rlim); - rlim.rlim_cur = 100*1024*1024; - setrlimit(RLIMIT_STACK, &rlim); -.sp -This reads the current limits (soft and hard) using \fBgetrlimit()\fP, then -attempts to increase the soft limit to 100Mb using \fBsetrlimit()\fP. You must -do this before calling \fBpcre[16|32]_exec()\fP. -. -. -.SS "Changing stack size in Mac OS X" -.rs -.sp -Using \fBsetrlimit()\fP, as described above, should also work on Mac OS X. It -is also possible to set a stack size when linking a program. There is a -discussion about stack sizes in Mac OS X at this web site: -.\" HTML -.\" -http://developer.apple.com/qa/qa2005/qa1419.html. -.\" -. -. -.SH AUTHOR -.rs -.sp -.nf -Philip Hazel -University Computing Service -Cambridge CB2 3QH, England. -.fi -. -. -.SH REVISION -.rs -.sp -.nf -Last updated: 24 June 2012 -Copyright (c) 1997-2012 University of Cambridge. -.fi diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcresyntax.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcresyntax.3 deleted file mode 100644 index 0850369f..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcresyntax.3 +++ /dev/null @@ -1,540 +0,0 @@ -.TH PCRESYNTAX 3 "08 January 2014" "PCRE 8.35" -.SH NAME -PCRE - Perl-compatible regular expressions -.SH "PCRE REGULAR EXPRESSION SYNTAX SUMMARY" -.rs -.sp -The full syntax and semantics of the regular expressions that are supported by -PCRE are described in the -.\" HREF -\fBpcrepattern\fP -.\" -documentation. This document contains a quick-reference summary of the syntax. -. -. -.SH "QUOTING" -.rs -.sp - \ex where x is non-alphanumeric is a literal x - \eQ...\eE treat enclosed characters as literal -. -. -.SH "CHARACTERS" -.rs -.sp - \ea alarm, that is, the BEL character (hex 07) - \ecx "control-x", where x is any ASCII character - \ee escape (hex 1B) - \ef form feed (hex 0C) - \en newline (hex 0A) - \er carriage return (hex 0D) - \et tab (hex 09) - \e0dd character with octal code 0dd - \eddd character with octal code ddd, or backreference - \eo{ddd..} character with octal code ddd.. - \exhh character with hex code hh - \ex{hhh..} character with hex code hhh.. -.sp -Note that \e0dd is always an octal code, and that \e8 and \e9 are the literal -characters "8" and "9". -. -. -.SH "CHARACTER TYPES" -.rs -.sp - . any character except newline; - in dotall mode, any character whatsoever - \eC one data unit, even in UTF mode (best avoided) - \ed a decimal digit - \eD a character that is not a decimal digit - \eh a horizontal white space character - \eH a character that is not a horizontal white space character - \eN a character that is not a newline - \ep{\fIxx\fP} a character with the \fIxx\fP property - \eP{\fIxx\fP} a character without the \fIxx\fP property - \eR a newline sequence - \es a white space character - \eS a character that is not a white space character - \ev a vertical white space character - \eV a character that is not a vertical white space character - \ew a "word" character - \eW a "non-word" character - \eX a Unicode extended grapheme cluster -.sp -By default, \ed, \es, and \ew match only ASCII characters, even in UTF-8 mode -or in the 16- bit and 32-bit libraries. However, if locale-specific matching is -happening, \es and \ew may also match characters with code points in the range -128-255. If the PCRE_UCP option is set, the behaviour of these escape sequences -is changed to use Unicode properties and they match many more characters. -. -. -.SH "GENERAL CATEGORY PROPERTIES FOR \ep and \eP" -.rs -.sp - C Other - Cc Control - Cf Format - Cn Unassigned - Co Private use - Cs Surrogate -.sp - L Letter - Ll Lower case letter - Lm Modifier letter - Lo Other letter - Lt Title case letter - Lu Upper case letter - L& Ll, Lu, or Lt -.sp - M Mark - Mc Spacing mark - Me Enclosing mark - Mn Non-spacing mark -.sp - N Number - Nd Decimal number - Nl Letter number - No Other number -.sp - P Punctuation - Pc Connector punctuation - Pd Dash punctuation - Pe Close punctuation - Pf Final punctuation - Pi Initial punctuation - Po Other punctuation - Ps Open punctuation -.sp - S Symbol - Sc Currency symbol - Sk Modifier symbol - Sm Mathematical symbol - So Other symbol -.sp - Z Separator - Zl Line separator - Zp Paragraph separator - Zs Space separator -. -. -.SH "PCRE SPECIAL CATEGORY PROPERTIES FOR \ep and \eP" -.rs -.sp - Xan Alphanumeric: union of properties L and N - Xps POSIX space: property Z or tab, NL, VT, FF, CR - Xsp Perl space: property Z or tab, NL, VT, FF, CR - Xuc Univerally-named character: one that can be - represented by a Universal Character Name - Xwd Perl word: property Xan or underscore -.sp -Perl and POSIX space are now the same. Perl added VT to its space character set -at release 5.18 and PCRE changed at release 8.34. -. -. -.SH "SCRIPT NAMES FOR \ep AND \eP" -.rs -.sp -Arabic, -Armenian, -Avestan, -Balinese, -Bamum, -Bassa_Vah, -Batak, -Bengali, -Bopomofo, -Brahmi, -Braille, -Buginese, -Buhid, -Canadian_Aboriginal, -Carian, -Caucasian_Albanian, -Chakma, -Cham, -Cherokee, -Common, -Coptic, -Cuneiform, -Cypriot, -Cyrillic, -Deseret, -Devanagari, -Duployan, -Egyptian_Hieroglyphs, -Elbasan, -Ethiopic, -Georgian, -Glagolitic, -Gothic, -Grantha, -Greek, -Gujarati, -Gurmukhi, -Han, -Hangul, -Hanunoo, -Hebrew, -Hiragana, -Imperial_Aramaic, -Inherited, -Inscriptional_Pahlavi, -Inscriptional_Parthian, -Javanese, -Kaithi, -Kannada, -Katakana, -Kayah_Li, -Kharoshthi, -Khmer, -Khojki, -Khudawadi, -Lao, -Latin, -Lepcha, -Limbu, -Linear_A, -Linear_B, -Lisu, -Lycian, -Lydian, -Mahajani, -Malayalam, -Mandaic, -Manichaean, -Meetei_Mayek, -Mende_Kikakui, -Meroitic_Cursive, -Meroitic_Hieroglyphs, -Miao, -Modi, -Mongolian, -Mro, -Myanmar, -Nabataean, -New_Tai_Lue, -Nko, -Ogham, -Ol_Chiki, -Old_Italic, -Old_North_Arabian, -Old_Permic, -Old_Persian, -Old_South_Arabian, -Old_Turkic, -Oriya, -Osmanya, -Pahawh_Hmong, -Palmyrene, -Pau_Cin_Hau, -Phags_Pa, -Phoenician, -Psalter_Pahlavi, -Rejang, -Runic, -Samaritan, -Saurashtra, -Sharada, -Shavian, -Siddham, -Sinhala, -Sora_Sompeng, -Sundanese, -Syloti_Nagri, -Syriac, -Tagalog, -Tagbanwa, -Tai_Le, -Tai_Tham, -Tai_Viet, -Takri, -Tamil, -Telugu, -Thaana, -Thai, -Tibetan, -Tifinagh, -Tirhuta, -Ugaritic, -Vai, -Warang_Citi, -Yi. -. -. -.SH "CHARACTER CLASSES" -.rs -.sp - [...] positive character class - [^...] negative character class - [x-y] range (can be used for hex characters) - [[:xxx:]] positive POSIX named set - [[:^xxx:]] negative POSIX named set -.sp - alnum alphanumeric - alpha alphabetic - ascii 0-127 - blank space or tab - cntrl control character - digit decimal digit - graph printing, excluding space - lower lower case letter - print printing, including space - punct printing, excluding alphanumeric - space white space - upper upper case letter - word same as \ew - xdigit hexadecimal digit -.sp -In PCRE, POSIX character set names recognize only ASCII characters by default, -but some of them use Unicode properties if PCRE_UCP is set. You can use -\eQ...\eE inside a character class. -. -. -.SH "QUANTIFIERS" -.rs -.sp - ? 0 or 1, greedy - ?+ 0 or 1, possessive - ?? 0 or 1, lazy - * 0 or more, greedy - *+ 0 or more, possessive - *? 0 or more, lazy - + 1 or more, greedy - ++ 1 or more, possessive - +? 1 or more, lazy - {n} exactly n - {n,m} at least n, no more than m, greedy - {n,m}+ at least n, no more than m, possessive - {n,m}? at least n, no more than m, lazy - {n,} n or more, greedy - {n,}+ n or more, possessive - {n,}? n or more, lazy -. -. -.SH "ANCHORS AND SIMPLE ASSERTIONS" -.rs -.sp - \eb word boundary - \eB not a word boundary - ^ start of subject - also after internal newline in multiline mode - \eA start of subject - $ end of subject - also before newline at end of subject - also before internal newline in multiline mode - \eZ end of subject - also before newline at end of subject - \ez end of subject - \eG first matching position in subject -. -. -.SH "MATCH POINT RESET" -.rs -.sp - \eK reset start of match -.sp -\eK is honoured in positive assertions, but ignored in negative ones. -. -. -.SH "ALTERNATION" -.rs -.sp - expr|expr|expr... -. -. -.SH "CAPTURING" -.rs -.sp - (...) capturing group - (?...) named capturing group (Perl) - (?'name'...) named capturing group (Perl) - (?P...) named capturing group (Python) - (?:...) non-capturing group - (?|...) non-capturing group; reset group numbers for - capturing groups in each alternative -. -. -.SH "ATOMIC GROUPS" -.rs -.sp - (?>...) atomic, non-capturing group -. -. -. -. -.SH "COMMENT" -.rs -.sp - (?#....) comment (not nestable) -. -. -.SH "OPTION SETTING" -.rs -.sp - (?i) caseless - (?J) allow duplicate names - (?m) multiline - (?s) single line (dotall) - (?U) default ungreedy (lazy) - (?x) extended (ignore white space) - (?-...) unset option(s) -.sp -The following are recognized only at the very start of a pattern or after one -of the newline or \eR options with similar syntax. More than one of them may -appear. -.sp - (*LIMIT_MATCH=d) set the match limit to d (decimal number) - (*LIMIT_RECURSION=d) set the recursion limit to d (decimal number) - (*NO_AUTO_POSSESS) no auto-possessification (PCRE_NO_AUTO_POSSESS) - (*NO_START_OPT) no start-match optimization (PCRE_NO_START_OPTIMIZE) - (*UTF8) set UTF-8 mode: 8-bit library (PCRE_UTF8) - (*UTF16) set UTF-16 mode: 16-bit library (PCRE_UTF16) - (*UTF32) set UTF-32 mode: 32-bit library (PCRE_UTF32) - (*UTF) set appropriate UTF mode for the library in use - (*UCP) set PCRE_UCP (use Unicode properties for \ed etc) -.sp -Note that LIMIT_MATCH and LIMIT_RECURSION can only reduce the value of the -limits set by the caller of pcre_exec(), not increase them. -. -. -.SH "NEWLINE CONVENTION" -.rs -.sp -These are recognized only at the very start of the pattern or after option -settings with a similar syntax. -.sp - (*CR) carriage return only - (*LF) linefeed only - (*CRLF) carriage return followed by linefeed - (*ANYCRLF) all three of the above - (*ANY) any Unicode newline sequence -. -. -.SH "WHAT \eR MATCHES" -.rs -.sp -These are recognized only at the very start of the pattern or after option -setting with a similar syntax. -.sp - (*BSR_ANYCRLF) CR, LF, or CRLF - (*BSR_UNICODE) any Unicode newline sequence -. -. -.SH "LOOKAHEAD AND LOOKBEHIND ASSERTIONS" -.rs -.sp - (?=...) positive look ahead - (?!...) negative look ahead - (?<=...) positive look behind - (? reference by name (Perl) - \ek'name' reference by name (Perl) - \eg{name} reference by name (Perl) - \ek{name} reference by name (.NET) - (?P=name) reference by name (Python) -. -. -.SH "SUBROUTINE REFERENCES (POSSIBLY RECURSIVE)" -.rs -.sp - (?R) recurse whole pattern - (?n) call subpattern by absolute number - (?+n) call subpattern by relative number - (?-n) call subpattern by relative number - (?&name) call subpattern by name (Perl) - (?P>name) call subpattern by name (Python) - \eg call subpattern by name (Oniguruma) - \eg'name' call subpattern by name (Oniguruma) - \eg call subpattern by absolute number (Oniguruma) - \eg'n' call subpattern by absolute number (Oniguruma) - \eg<+n> call subpattern by relative number (PCRE extension) - \eg'+n' call subpattern by relative number (PCRE extension) - \eg<-n> call subpattern by relative number (PCRE extension) - \eg'-n' call subpattern by relative number (PCRE extension) -. -. -.SH "CONDITIONAL PATTERNS" -.rs -.sp - (?(condition)yes-pattern) - (?(condition)yes-pattern|no-pattern) -.sp - (?(n)... absolute reference condition - (?(+n)... relative reference condition - (?(-n)... relative reference condition - (?()... named reference condition (Perl) - (?('name')... named reference condition (Perl) - (?(name)... named reference condition (PCRE) - (?(R)... overall recursion condition - (?(Rn)... specific group recursion condition - (?(R&name)... specific recursion condition - (?(DEFINE)... define subpattern for reference - (?(assert)... assertion condition -. -. -.SH "BACKTRACKING CONTROL" -.rs -.sp -The following act immediately they are reached: -.sp - (*ACCEPT) force successful match - (*FAIL) force backtrack; synonym (*F) - (*MARK:NAME) set name to be passed back; synonym (*:NAME) -.sp -The following act only when a subsequent match failure causes a backtrack to -reach them. They all force a match failure, but they differ in what happens -afterwards. Those that advance the start-of-match point do so only if the -pattern is not anchored. -.sp - (*COMMIT) overall failure, no advance of starting point - (*PRUNE) advance to next starting character - (*PRUNE:NAME) equivalent to (*MARK:NAME)(*PRUNE) - (*SKIP) advance to current matching position - (*SKIP:NAME) advance to position corresponding to an earlier - (*MARK:NAME); if not found, the (*SKIP) is ignored - (*THEN) local failure, backtrack to next alternation - (*THEN:NAME) equivalent to (*MARK:NAME)(*THEN) -. -. -.SH "CALLOUTS" -.rs -.sp - (?C) callout - (?Cn) callout with data n -. -. -.SH "SEE ALSO" -.rs -.sp -\fBpcrepattern\fP(3), \fBpcreapi\fP(3), \fBpcrecallout\fP(3), -\fBpcrematching\fP(3), \fBpcre\fP(3). -. -. -.SH AUTHOR -.rs -.sp -.nf -Philip Hazel -University Computing Service -Cambridge CB2 3QH, England. -.fi -. -. -.SH REVISION -.rs -.sp -.nf -Last updated: 08 January 2014 -Copyright (c) 1997-2014 University of Cambridge. -.fi diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcreunicode.3 b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcreunicode.3 deleted file mode 100644 index cb5e5269..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/man/man3/pcreunicode.3 +++ /dev/null @@ -1,249 +0,0 @@ -.TH PCREUNICODE 3 "27 February 2013" "PCRE 8.33" -.SH NAME -PCRE - Perl-compatible regular expressions -.SH "UTF-8, UTF-16, UTF-32, AND UNICODE PROPERTY SUPPORT" -.rs -.sp -As well as UTF-8 support, PCRE also supports UTF-16 (from release 8.30) and -UTF-32 (from release 8.32), by means of two additional libraries. They can be -built as well as, or instead of, the 8-bit library. -. -. -.SH "UTF-8 SUPPORT" -.rs -.sp -In order process UTF-8 strings, you must build PCRE's 8-bit library with UTF -support, and, in addition, you must call -.\" HREF -\fBpcre_compile()\fP -.\" -with the PCRE_UTF8 option flag, or the pattern must start with the sequence -(*UTF8) or (*UTF). When either of these is the case, both the pattern and any -subject strings that are matched against it are treated as UTF-8 strings -instead of strings of individual 1-byte characters. -. -. -.SH "UTF-16 AND UTF-32 SUPPORT" -.rs -.sp -In order process UTF-16 or UTF-32 strings, you must build PCRE's 16-bit or -32-bit library with UTF support, and, in addition, you must call -.\" HREF -\fBpcre16_compile()\fP -.\" -or -.\" HREF -\fBpcre32_compile()\fP -.\" -with the PCRE_UTF16 or PCRE_UTF32 option flag, as appropriate. Alternatively, -the pattern must start with the sequence (*UTF16), (*UTF32), as appropriate, or -(*UTF), which can be used with either library. When UTF mode is set, both the -pattern and any subject strings that are matched against it are treated as -UTF-16 or UTF-32 strings instead of strings of individual 16-bit or 32-bit -characters. -. -. -.SH "UTF SUPPORT OVERHEAD" -.rs -.sp -If you compile PCRE with UTF support, but do not use it at run time, the -library will be a bit bigger, but the additional run time overhead is limited -to testing the PCRE_UTF[8|16|32] flag occasionally, so should not be very big. -. -. -.SH "UNICODE PROPERTY SUPPORT" -.rs -.sp -If PCRE is built with Unicode character property support (which implies UTF -support), the escape sequences \ep{..}, \eP{..}, and \eX can be used. -The available properties that can be tested are limited to the general -category properties such as Lu for an upper case letter or Nd for a decimal -number, the Unicode script names such as Arabic or Han, and the derived -properties Any and L&. Full lists is given in the -.\" HREF -\fBpcrepattern\fP -.\" -and -.\" HREF -\fBpcresyntax\fP -.\" -documentation. Only the short names for properties are supported. For example, -\ep{L} matches a letter. Its Perl synonym, \ep{Letter}, is not supported. -Furthermore, in Perl, many properties may optionally be prefixed by "Is", for -compatibility with Perl 5.6. PCRE does not support this. -. -. -.\" HTML -.SS "Validity of UTF-8 strings" -.rs -.sp -When you set the PCRE_UTF8 flag, the byte strings passed as patterns and -subjects are (by default) checked for validity on entry to the relevant -functions. The entire string is checked before any other processing takes -place. From release 7.3 of PCRE, the check is according the rules of RFC 3629, -which are themselves derived from the Unicode specification. Earlier releases -of PCRE followed the rules of RFC 2279, which allows the full range of 31-bit -values (0 to 0x7FFFFFFF). The current check allows only values in the range U+0 -to U+10FFFF, excluding the surrogate area. (From release 8.33 the so-called -"non-character" code points are no longer excluded because Unicode corrigendum -#9 makes it clear that they should not be.) -.P -Characters in the "Surrogate Area" of Unicode are reserved for use by UTF-16, -where they are used in pairs to encode codepoints with values greater than -0xFFFF. The code points that are encoded by UTF-16 pairs are available -independently in the UTF-8 and UTF-32 encodings. (In other words, the whole -surrogate thing is a fudge for UTF-16 which unfortunately messes up UTF-8 and -UTF-32.) -.P -If an invalid UTF-8 string is passed to PCRE, an error return is given. At -compile time, the only additional information is the offset to the first byte -of the failing character. The run-time functions \fBpcre_exec()\fP and -\fBpcre_dfa_exec()\fP also pass back this information, as well as a more -detailed reason code if the caller has provided memory in which to do this. -.P -In some situations, you may already know that your strings are valid, and -therefore want to skip these checks in order to improve performance, for -example in the case of a long subject string that is being scanned repeatedly. -If you set the PCRE_NO_UTF8_CHECK flag at compile time or at run time, PCRE -assumes that the pattern or subject it is given (respectively) contains only -valid UTF-8 codes. In this case, it does not diagnose an invalid UTF-8 string. -.P -Note that passing PCRE_NO_UTF8_CHECK to \fBpcre_compile()\fP just disables the -check for the pattern; it does not also apply to subject strings. If you want -to disable the check for a subject string you must pass this option to -\fBpcre_exec()\fP or \fBpcre_dfa_exec()\fP. -.P -If you pass an invalid UTF-8 string when PCRE_NO_UTF8_CHECK is set, the result -is undefined and your program may crash. -. -. -.\" HTML -.SS "Validity of UTF-16 strings" -.rs -.sp -When you set the PCRE_UTF16 flag, the strings of 16-bit data units that are -passed as patterns and subjects are (by default) checked for validity on entry -to the relevant functions. Values other than those in the surrogate range -U+D800 to U+DFFF are independent code points. Values in the surrogate range -must be used in pairs in the correct manner. -.P -If an invalid UTF-16 string is passed to PCRE, an error return is given. At -compile time, the only additional information is the offset to the first data -unit of the failing character. The run-time functions \fBpcre16_exec()\fP and -\fBpcre16_dfa_exec()\fP also pass back this information, as well as a more -detailed reason code if the caller has provided memory in which to do this. -.P -In some situations, you may already know that your strings are valid, and -therefore want to skip these checks in order to improve performance. If you set -the PCRE_NO_UTF16_CHECK flag at compile time or at run time, PCRE assumes that -the pattern or subject it is given (respectively) contains only valid UTF-16 -sequences. In this case, it does not diagnose an invalid UTF-16 string. -However, if an invalid string is passed, the result is undefined. -. -. -.\" HTML -.SS "Validity of UTF-32 strings" -.rs -.sp -When you set the PCRE_UTF32 flag, the strings of 32-bit data units that are -passed as patterns and subjects are (by default) checked for validity on entry -to the relevant functions. This check allows only values in the range U+0 -to U+10FFFF, excluding the surrogate area U+D800 to U+DFFF. -.P -If an invalid UTF-32 string is passed to PCRE, an error return is given. At -compile time, the only additional information is the offset to the first data -unit of the failing character. The run-time functions \fBpcre32_exec()\fP and -\fBpcre32_dfa_exec()\fP also pass back this information, as well as a more -detailed reason code if the caller has provided memory in which to do this. -.P -In some situations, you may already know that your strings are valid, and -therefore want to skip these checks in order to improve performance. If you set -the PCRE_NO_UTF32_CHECK flag at compile time or at run time, PCRE assumes that -the pattern or subject it is given (respectively) contains only valid UTF-32 -sequences. In this case, it does not diagnose an invalid UTF-32 string. -However, if an invalid string is passed, the result is undefined. -. -. -.SS "General comments about UTF modes" -.rs -.sp -1. Codepoints less than 256 can be specified in patterns by either braced or -unbraced hexadecimal escape sequences (for example, \ex{b3} or \exb3). Larger -values have to use braced sequences. -.P -2. Octal numbers up to \e777 are recognized, and in UTF-8 mode they match -two-byte characters for values greater than \e177. -.P -3. Repeat quantifiers apply to complete UTF characters, not to individual -data units, for example: \ex{100}{3}. -.P -4. The dot metacharacter matches one UTF character instead of a single data -unit. -.P -5. The escape sequence \eC can be used to match a single byte in UTF-8 mode, or -a single 16-bit data unit in UTF-16 mode, or a single 32-bit data unit in -UTF-32 mode, but its use can lead to some strange effects because it breaks up -multi-unit characters (see the description of \eC in the -.\" HREF -\fBpcrepattern\fP -.\" -documentation). The use of \eC is not supported in the alternative matching -function \fBpcre[16|32]_dfa_exec()\fP, nor is it supported in UTF mode by the -JIT optimization of \fBpcre[16|32]_exec()\fP. If JIT optimization is requested -for a UTF pattern that contains \eC, it will not succeed, and so the matching -will be carried out by the normal interpretive function. -.P -6. The character escapes \eb, \eB, \ed, \eD, \es, \eS, \ew, and \eW correctly -test characters of any code value, but, by default, the characters that PCRE -recognizes as digits, spaces, or word characters remain the same set as in -non-UTF mode, all with values less than 256. This remains true even when PCRE -is built to include Unicode property support, because to do otherwise would -slow down PCRE in many common cases. Note in particular that this applies to -\eb and \eB, because they are defined in terms of \ew and \eW. If you really -want to test for a wider sense of, say, "digit", you can use explicit Unicode -property tests such as \ep{Nd}. Alternatively, if you set the PCRE_UCP option, -the way that the character escapes work is changed so that Unicode properties -are used to determine which characters match. There are more details in the -section on -.\" HTML -.\" -generic character types -.\" -in the -.\" HREF -\fBpcrepattern\fP -.\" -documentation. -.P -7. Similarly, characters that match the POSIX named character classes are all -low-valued characters, unless the PCRE_UCP option is set. -.P -8. However, the horizontal and vertical white space matching escapes (\eh, \eH, -\ev, and \eV) do match all the appropriate Unicode characters, whether or not -PCRE_UCP is set. -.P -9. Case-insensitive matching applies only to characters whose values are less -than 128, unless PCRE is built with Unicode property support. A few Unicode -characters such as Greek sigma have more than two codepoints that are -case-equivalent. Up to and including PCRE release 8.31, only one-to-one case -mappings were supported, but later releases (with Unicode property support) do -treat as case-equivalent all versions of characters such as Greek sigma. -. -. -.SH AUTHOR -.rs -.sp -.nf -Philip Hazel -University Computing Service -Cambridge CB2 3QH, England. -.fi -. -. -.SH REVISION -.rs -.sp -.nf -Last updated: 27 February 2013 -Copyright (c) 1997-2013 University of Cambridge. -.fi diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/include/pcre.h b/client/3rd/ShadowSocks/ShadowSocks/pcre/include/pcre.h deleted file mode 100644 index 442c6bdb..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/include/pcre.h +++ /dev/null @@ -1,677 +0,0 @@ -/************************************************* -* Perl-Compatible Regular Expressions * -*************************************************/ - -/* This is the public header file for the PCRE library, to be #included by -applications that call the PCRE functions. - - Copyright (c) 1997-2014 University of Cambridge - ------------------------------------------------------------------------------ -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - - * Neither the name of the University of Cambridge nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. ------------------------------------------------------------------------------ -*/ - -#ifndef _PCRE_H -#define _PCRE_H - -/* The current PCRE version information. */ - -#define PCRE_MAJOR 8 -#define PCRE_MINOR 41 -#define PCRE_PRERELEASE -#define PCRE_DATE 2017-07-05 - -/* When an application links to a PCRE DLL in Windows, the symbols that are -imported have to be identified as such. When building PCRE, the appropriate -export setting is defined in pcre_internal.h, which includes this file. So we -don't change existing definitions of PCRE_EXP_DECL and PCRECPP_EXP_DECL. */ - -#if defined(_WIN32) && !defined(PCRE_STATIC) -# ifndef PCRE_EXP_DECL -# define PCRE_EXP_DECL extern __declspec(dllimport) -# endif -# ifdef __cplusplus -# ifndef PCRECPP_EXP_DECL -# define PCRECPP_EXP_DECL extern __declspec(dllimport) -# endif -# ifndef PCRECPP_EXP_DEFN -# define PCRECPP_EXP_DEFN __declspec(dllimport) -# endif -# endif -#endif - -/* By default, we use the standard "extern" declarations. */ - -#ifndef PCRE_EXP_DECL -# ifdef __cplusplus -# define PCRE_EXP_DECL extern "C" -# else -# define PCRE_EXP_DECL extern -# endif -#endif - -#ifdef __cplusplus -# ifndef PCRECPP_EXP_DECL -# define PCRECPP_EXP_DECL extern -# endif -# ifndef PCRECPP_EXP_DEFN -# define PCRECPP_EXP_DEFN -# endif -#endif - -/* Have to include stdlib.h in order to ensure that size_t is defined; -it is needed here for malloc. */ - -#include - -/* Allow for C++ users */ - -#ifdef __cplusplus -extern "C" { -#endif - -/* Public options. Some are compile-time only, some are run-time only, and some -are both. Most of the compile-time options are saved with the compiled regex so -that they can be inspected during studying (and therefore JIT compiling). Note -that pcre_study() has its own set of options. Originally, all the options -defined here used distinct bits. However, almost all the bits in a 32-bit word -are now used, so in order to conserve them, option bits that were previously -only recognized at matching time (i.e. by pcre_exec() or pcre_dfa_exec()) may -also be used for compile-time options that affect only compiling and are not -relevant for studying or JIT compiling. - -Some options for pcre_compile() change its behaviour but do not affect the -behaviour of the execution functions. Other options are passed through to the -execution functions and affect their behaviour, with or without affecting the -behaviour of pcre_compile(). - -Options that can be passed to pcre_compile() are tagged Cx below, with these -variants: - -C1 Affects compile only -C2 Does not affect compile; affects exec, dfa_exec -C3 Affects compile, exec, dfa_exec -C4 Affects compile, exec, dfa_exec, study -C5 Affects compile, exec, study - -Options that can be set for pcre_exec() and/or pcre_dfa_exec() are flagged with -E and D, respectively. They take precedence over C3, C4, and C5 settings passed -from pcre_compile(). Those that are compatible with JIT execution are flagged -with J. */ - -#define PCRE_CASELESS 0x00000001 /* C1 */ -#define PCRE_MULTILINE 0x00000002 /* C1 */ -#define PCRE_DOTALL 0x00000004 /* C1 */ -#define PCRE_EXTENDED 0x00000008 /* C1 */ -#define PCRE_ANCHORED 0x00000010 /* C4 E D */ -#define PCRE_DOLLAR_ENDONLY 0x00000020 /* C2 */ -#define PCRE_EXTRA 0x00000040 /* C1 */ -#define PCRE_NOTBOL 0x00000080 /* E D J */ -#define PCRE_NOTEOL 0x00000100 /* E D J */ -#define PCRE_UNGREEDY 0x00000200 /* C1 */ -#define PCRE_NOTEMPTY 0x00000400 /* E D J */ -#define PCRE_UTF8 0x00000800 /* C4 ) */ -#define PCRE_UTF16 0x00000800 /* C4 ) Synonyms */ -#define PCRE_UTF32 0x00000800 /* C4 ) */ -#define PCRE_NO_AUTO_CAPTURE 0x00001000 /* C1 */ -#define PCRE_NO_UTF8_CHECK 0x00002000 /* C1 E D J ) */ -#define PCRE_NO_UTF16_CHECK 0x00002000 /* C1 E D J ) Synonyms */ -#define PCRE_NO_UTF32_CHECK 0x00002000 /* C1 E D J ) */ -#define PCRE_AUTO_CALLOUT 0x00004000 /* C1 */ -#define PCRE_PARTIAL_SOFT 0x00008000 /* E D J ) Synonyms */ -#define PCRE_PARTIAL 0x00008000 /* E D J ) */ - -/* This pair use the same bit. */ -#define PCRE_NEVER_UTF 0x00010000 /* C1 ) Overlaid */ -#define PCRE_DFA_SHORTEST 0x00010000 /* D ) Overlaid */ - -/* This pair use the same bit. */ -#define PCRE_NO_AUTO_POSSESS 0x00020000 /* C1 ) Overlaid */ -#define PCRE_DFA_RESTART 0x00020000 /* D ) Overlaid */ - -#define PCRE_FIRSTLINE 0x00040000 /* C3 */ -#define PCRE_DUPNAMES 0x00080000 /* C1 */ -#define PCRE_NEWLINE_CR 0x00100000 /* C3 E D */ -#define PCRE_NEWLINE_LF 0x00200000 /* C3 E D */ -#define PCRE_NEWLINE_CRLF 0x00300000 /* C3 E D */ -#define PCRE_NEWLINE_ANY 0x00400000 /* C3 E D */ -#define PCRE_NEWLINE_ANYCRLF 0x00500000 /* C3 E D */ -#define PCRE_BSR_ANYCRLF 0x00800000 /* C3 E D */ -#define PCRE_BSR_UNICODE 0x01000000 /* C3 E D */ -#define PCRE_JAVASCRIPT_COMPAT 0x02000000 /* C5 */ -#define PCRE_NO_START_OPTIMIZE 0x04000000 /* C2 E D ) Synonyms */ -#define PCRE_NO_START_OPTIMISE 0x04000000 /* C2 E D ) */ -#define PCRE_PARTIAL_HARD 0x08000000 /* E D J */ -#define PCRE_NOTEMPTY_ATSTART 0x10000000 /* E D J */ -#define PCRE_UCP 0x20000000 /* C3 */ - -/* Exec-time and get/set-time error codes */ - -#define PCRE_ERROR_NOMATCH (-1) -#define PCRE_ERROR_NULL (-2) -#define PCRE_ERROR_BADOPTION (-3) -#define PCRE_ERROR_BADMAGIC (-4) -#define PCRE_ERROR_UNKNOWN_OPCODE (-5) -#define PCRE_ERROR_UNKNOWN_NODE (-5) /* For backward compatibility */ -#define PCRE_ERROR_NOMEMORY (-6) -#define PCRE_ERROR_NOSUBSTRING (-7) -#define PCRE_ERROR_MATCHLIMIT (-8) -#define PCRE_ERROR_CALLOUT (-9) /* Never used by PCRE itself */ -#define PCRE_ERROR_BADUTF8 (-10) /* Same for 8/16/32 */ -#define PCRE_ERROR_BADUTF16 (-10) /* Same for 8/16/32 */ -#define PCRE_ERROR_BADUTF32 (-10) /* Same for 8/16/32 */ -#define PCRE_ERROR_BADUTF8_OFFSET (-11) /* Same for 8/16 */ -#define PCRE_ERROR_BADUTF16_OFFSET (-11) /* Same for 8/16 */ -#define PCRE_ERROR_PARTIAL (-12) -#define PCRE_ERROR_BADPARTIAL (-13) -#define PCRE_ERROR_INTERNAL (-14) -#define PCRE_ERROR_BADCOUNT (-15) -#define PCRE_ERROR_DFA_UITEM (-16) -#define PCRE_ERROR_DFA_UCOND (-17) -#define PCRE_ERROR_DFA_UMLIMIT (-18) -#define PCRE_ERROR_DFA_WSSIZE (-19) -#define PCRE_ERROR_DFA_RECURSE (-20) -#define PCRE_ERROR_RECURSIONLIMIT (-21) -#define PCRE_ERROR_NULLWSLIMIT (-22) /* No longer actually used */ -#define PCRE_ERROR_BADNEWLINE (-23) -#define PCRE_ERROR_BADOFFSET (-24) -#define PCRE_ERROR_SHORTUTF8 (-25) -#define PCRE_ERROR_SHORTUTF16 (-25) /* Same for 8/16 */ -#define PCRE_ERROR_RECURSELOOP (-26) -#define PCRE_ERROR_JIT_STACKLIMIT (-27) -#define PCRE_ERROR_BADMODE (-28) -#define PCRE_ERROR_BADENDIANNESS (-29) -#define PCRE_ERROR_DFA_BADRESTART (-30) -#define PCRE_ERROR_JIT_BADOPTION (-31) -#define PCRE_ERROR_BADLENGTH (-32) -#define PCRE_ERROR_UNSET (-33) - -/* Specific error codes for UTF-8 validity checks */ - -#define PCRE_UTF8_ERR0 0 -#define PCRE_UTF8_ERR1 1 -#define PCRE_UTF8_ERR2 2 -#define PCRE_UTF8_ERR3 3 -#define PCRE_UTF8_ERR4 4 -#define PCRE_UTF8_ERR5 5 -#define PCRE_UTF8_ERR6 6 -#define PCRE_UTF8_ERR7 7 -#define PCRE_UTF8_ERR8 8 -#define PCRE_UTF8_ERR9 9 -#define PCRE_UTF8_ERR10 10 -#define PCRE_UTF8_ERR11 11 -#define PCRE_UTF8_ERR12 12 -#define PCRE_UTF8_ERR13 13 -#define PCRE_UTF8_ERR14 14 -#define PCRE_UTF8_ERR15 15 -#define PCRE_UTF8_ERR16 16 -#define PCRE_UTF8_ERR17 17 -#define PCRE_UTF8_ERR18 18 -#define PCRE_UTF8_ERR19 19 -#define PCRE_UTF8_ERR20 20 -#define PCRE_UTF8_ERR21 21 -#define PCRE_UTF8_ERR22 22 /* Unused (was non-character) */ - -/* Specific error codes for UTF-16 validity checks */ - -#define PCRE_UTF16_ERR0 0 -#define PCRE_UTF16_ERR1 1 -#define PCRE_UTF16_ERR2 2 -#define PCRE_UTF16_ERR3 3 -#define PCRE_UTF16_ERR4 4 /* Unused (was non-character) */ - -/* Specific error codes for UTF-32 validity checks */ - -#define PCRE_UTF32_ERR0 0 -#define PCRE_UTF32_ERR1 1 -#define PCRE_UTF32_ERR2 2 /* Unused (was non-character) */ -#define PCRE_UTF32_ERR3 3 - -/* Request types for pcre_fullinfo() */ - -#define PCRE_INFO_OPTIONS 0 -#define PCRE_INFO_SIZE 1 -#define PCRE_INFO_CAPTURECOUNT 2 -#define PCRE_INFO_BACKREFMAX 3 -#define PCRE_INFO_FIRSTBYTE 4 -#define PCRE_INFO_FIRSTCHAR 4 /* For backwards compatibility */ -#define PCRE_INFO_FIRSTTABLE 5 -#define PCRE_INFO_LASTLITERAL 6 -#define PCRE_INFO_NAMEENTRYSIZE 7 -#define PCRE_INFO_NAMECOUNT 8 -#define PCRE_INFO_NAMETABLE 9 -#define PCRE_INFO_STUDYSIZE 10 -#define PCRE_INFO_DEFAULT_TABLES 11 -#define PCRE_INFO_OKPARTIAL 12 -#define PCRE_INFO_JCHANGED 13 -#define PCRE_INFO_HASCRORLF 14 -#define PCRE_INFO_MINLENGTH 15 -#define PCRE_INFO_JIT 16 -#define PCRE_INFO_JITSIZE 17 -#define PCRE_INFO_MAXLOOKBEHIND 18 -#define PCRE_INFO_FIRSTCHARACTER 19 -#define PCRE_INFO_FIRSTCHARACTERFLAGS 20 -#define PCRE_INFO_REQUIREDCHAR 21 -#define PCRE_INFO_REQUIREDCHARFLAGS 22 -#define PCRE_INFO_MATCHLIMIT 23 -#define PCRE_INFO_RECURSIONLIMIT 24 -#define PCRE_INFO_MATCH_EMPTY 25 - -/* Request types for pcre_config(). Do not re-arrange, in order to remain -compatible. */ - -#define PCRE_CONFIG_UTF8 0 -#define PCRE_CONFIG_NEWLINE 1 -#define PCRE_CONFIG_LINK_SIZE 2 -#define PCRE_CONFIG_POSIX_MALLOC_THRESHOLD 3 -#define PCRE_CONFIG_MATCH_LIMIT 4 -#define PCRE_CONFIG_STACKRECURSE 5 -#define PCRE_CONFIG_UNICODE_PROPERTIES 6 -#define PCRE_CONFIG_MATCH_LIMIT_RECURSION 7 -#define PCRE_CONFIG_BSR 8 -#define PCRE_CONFIG_JIT 9 -#define PCRE_CONFIG_UTF16 10 -#define PCRE_CONFIG_JITTARGET 11 -#define PCRE_CONFIG_UTF32 12 -#define PCRE_CONFIG_PARENS_LIMIT 13 - -/* Request types for pcre_study(). Do not re-arrange, in order to remain -compatible. */ - -#define PCRE_STUDY_JIT_COMPILE 0x0001 -#define PCRE_STUDY_JIT_PARTIAL_SOFT_COMPILE 0x0002 -#define PCRE_STUDY_JIT_PARTIAL_HARD_COMPILE 0x0004 -#define PCRE_STUDY_EXTRA_NEEDED 0x0008 - -/* Bit flags for the pcre[16|32]_extra structure. Do not re-arrange or redefine -these bits, just add new ones on the end, in order to remain compatible. */ - -#define PCRE_EXTRA_STUDY_DATA 0x0001 -#define PCRE_EXTRA_MATCH_LIMIT 0x0002 -#define PCRE_EXTRA_CALLOUT_DATA 0x0004 -#define PCRE_EXTRA_TABLES 0x0008 -#define PCRE_EXTRA_MATCH_LIMIT_RECURSION 0x0010 -#define PCRE_EXTRA_MARK 0x0020 -#define PCRE_EXTRA_EXECUTABLE_JIT 0x0040 - -/* Types */ - -struct real_pcre; /* declaration; the definition is private */ -typedef struct real_pcre pcre; - -struct real_pcre16; /* declaration; the definition is private */ -typedef struct real_pcre16 pcre16; - -struct real_pcre32; /* declaration; the definition is private */ -typedef struct real_pcre32 pcre32; - -struct real_pcre_jit_stack; /* declaration; the definition is private */ -typedef struct real_pcre_jit_stack pcre_jit_stack; - -struct real_pcre16_jit_stack; /* declaration; the definition is private */ -typedef struct real_pcre16_jit_stack pcre16_jit_stack; - -struct real_pcre32_jit_stack; /* declaration; the definition is private */ -typedef struct real_pcre32_jit_stack pcre32_jit_stack; - -/* If PCRE is compiled with 16 bit character support, PCRE_UCHAR16 must contain -a 16 bit wide signed data type. Otherwise it can be a dummy data type since -pcre16 functions are not implemented. There is a check for this in pcre_internal.h. */ -#ifndef PCRE_UCHAR16 -#define PCRE_UCHAR16 unsigned short -#endif - -#ifndef PCRE_SPTR16 -#define PCRE_SPTR16 const PCRE_UCHAR16 * -#endif - -/* If PCRE is compiled with 32 bit character support, PCRE_UCHAR32 must contain -a 32 bit wide signed data type. Otherwise it can be a dummy data type since -pcre32 functions are not implemented. There is a check for this in pcre_internal.h. */ -#ifndef PCRE_UCHAR32 -#define PCRE_UCHAR32 unsigned int -#endif - -#ifndef PCRE_SPTR32 -#define PCRE_SPTR32 const PCRE_UCHAR32 * -#endif - -/* When PCRE is compiled as a C++ library, the subject pointer type can be -replaced with a custom type. For conventional use, the public interface is a -const char *. */ - -#ifndef PCRE_SPTR -#define PCRE_SPTR const char * -#endif - -/* The structure for passing additional data to pcre_exec(). This is defined in -such as way as to be extensible. Always add new fields at the end, in order to -remain compatible. */ - -typedef struct pcre_extra { - unsigned long int flags; /* Bits for which fields are set */ - void *study_data; /* Opaque data from pcre_study() */ - unsigned long int match_limit; /* Maximum number of calls to match() */ - void *callout_data; /* Data passed back in callouts */ - const unsigned char *tables; /* Pointer to character tables */ - unsigned long int match_limit_recursion; /* Max recursive calls to match() */ - unsigned char **mark; /* For passing back a mark pointer */ - void *executable_jit; /* Contains a pointer to a compiled jit code */ -} pcre_extra; - -/* Same structure as above, but with 16 bit char pointers. */ - -typedef struct pcre16_extra { - unsigned long int flags; /* Bits for which fields are set */ - void *study_data; /* Opaque data from pcre_study() */ - unsigned long int match_limit; /* Maximum number of calls to match() */ - void *callout_data; /* Data passed back in callouts */ - const unsigned char *tables; /* Pointer to character tables */ - unsigned long int match_limit_recursion; /* Max recursive calls to match() */ - PCRE_UCHAR16 **mark; /* For passing back a mark pointer */ - void *executable_jit; /* Contains a pointer to a compiled jit code */ -} pcre16_extra; - -/* Same structure as above, but with 32 bit char pointers. */ - -typedef struct pcre32_extra { - unsigned long int flags; /* Bits for which fields are set */ - void *study_data; /* Opaque data from pcre_study() */ - unsigned long int match_limit; /* Maximum number of calls to match() */ - void *callout_data; /* Data passed back in callouts */ - const unsigned char *tables; /* Pointer to character tables */ - unsigned long int match_limit_recursion; /* Max recursive calls to match() */ - PCRE_UCHAR32 **mark; /* For passing back a mark pointer */ - void *executable_jit; /* Contains a pointer to a compiled jit code */ -} pcre32_extra; - -/* The structure for passing out data via the pcre_callout_function. We use a -structure so that new fields can be added on the end in future versions, -without changing the API of the function, thereby allowing old clients to work -without modification. */ - -typedef struct pcre_callout_block { - int version; /* Identifies version of block */ - /* ------------------------ Version 0 ------------------------------- */ - int callout_number; /* Number compiled into pattern */ - int *offset_vector; /* The offset vector */ - PCRE_SPTR subject; /* The subject being matched */ - int subject_length; /* The length of the subject */ - int start_match; /* Offset to start of this match attempt */ - int current_position; /* Where we currently are in the subject */ - int capture_top; /* Max current capture */ - int capture_last; /* Most recently closed capture */ - void *callout_data; /* Data passed in with the call */ - /* ------------------- Added for Version 1 -------------------------- */ - int pattern_position; /* Offset to next item in the pattern */ - int next_item_length; /* Length of next item in the pattern */ - /* ------------------- Added for Version 2 -------------------------- */ - const unsigned char *mark; /* Pointer to current mark or NULL */ - /* ------------------------------------------------------------------ */ -} pcre_callout_block; - -/* Same structure as above, but with 16 bit char pointers. */ - -typedef struct pcre16_callout_block { - int version; /* Identifies version of block */ - /* ------------------------ Version 0 ------------------------------- */ - int callout_number; /* Number compiled into pattern */ - int *offset_vector; /* The offset vector */ - PCRE_SPTR16 subject; /* The subject being matched */ - int subject_length; /* The length of the subject */ - int start_match; /* Offset to start of this match attempt */ - int current_position; /* Where we currently are in the subject */ - int capture_top; /* Max current capture */ - int capture_last; /* Most recently closed capture */ - void *callout_data; /* Data passed in with the call */ - /* ------------------- Added for Version 1 -------------------------- */ - int pattern_position; /* Offset to next item in the pattern */ - int next_item_length; /* Length of next item in the pattern */ - /* ------------------- Added for Version 2 -------------------------- */ - const PCRE_UCHAR16 *mark; /* Pointer to current mark or NULL */ - /* ------------------------------------------------------------------ */ -} pcre16_callout_block; - -/* Same structure as above, but with 32 bit char pointers. */ - -typedef struct pcre32_callout_block { - int version; /* Identifies version of block */ - /* ------------------------ Version 0 ------------------------------- */ - int callout_number; /* Number compiled into pattern */ - int *offset_vector; /* The offset vector */ - PCRE_SPTR32 subject; /* The subject being matched */ - int subject_length; /* The length of the subject */ - int start_match; /* Offset to start of this match attempt */ - int current_position; /* Where we currently are in the subject */ - int capture_top; /* Max current capture */ - int capture_last; /* Most recently closed capture */ - void *callout_data; /* Data passed in with the call */ - /* ------------------- Added for Version 1 -------------------------- */ - int pattern_position; /* Offset to next item in the pattern */ - int next_item_length; /* Length of next item in the pattern */ - /* ------------------- Added for Version 2 -------------------------- */ - const PCRE_UCHAR32 *mark; /* Pointer to current mark or NULL */ - /* ------------------------------------------------------------------ */ -} pcre32_callout_block; - -/* Indirection for store get and free functions. These can be set to -alternative malloc/free functions if required. Special ones are used in the -non-recursive case for "frames". There is also an optional callout function -that is triggered by the (?) regex item. For Virtual Pascal, these definitions -have to take another form. */ - -#ifndef VPCOMPAT -PCRE_EXP_DECL void *(*pcre_malloc)(size_t); -PCRE_EXP_DECL void (*pcre_free)(void *); -PCRE_EXP_DECL void *(*pcre_stack_malloc)(size_t); -PCRE_EXP_DECL void (*pcre_stack_free)(void *); -PCRE_EXP_DECL int (*pcre_callout)(pcre_callout_block *); -PCRE_EXP_DECL int (*pcre_stack_guard)(void); - -PCRE_EXP_DECL void *(*pcre16_malloc)(size_t); -PCRE_EXP_DECL void (*pcre16_free)(void *); -PCRE_EXP_DECL void *(*pcre16_stack_malloc)(size_t); -PCRE_EXP_DECL void (*pcre16_stack_free)(void *); -PCRE_EXP_DECL int (*pcre16_callout)(pcre16_callout_block *); -PCRE_EXP_DECL int (*pcre16_stack_guard)(void); - -PCRE_EXP_DECL void *(*pcre32_malloc)(size_t); -PCRE_EXP_DECL void (*pcre32_free)(void *); -PCRE_EXP_DECL void *(*pcre32_stack_malloc)(size_t); -PCRE_EXP_DECL void (*pcre32_stack_free)(void *); -PCRE_EXP_DECL int (*pcre32_callout)(pcre32_callout_block *); -PCRE_EXP_DECL int (*pcre32_stack_guard)(void); -#else /* VPCOMPAT */ -PCRE_EXP_DECL void *pcre_malloc(size_t); -PCRE_EXP_DECL void pcre_free(void *); -PCRE_EXP_DECL void *pcre_stack_malloc(size_t); -PCRE_EXP_DECL void pcre_stack_free(void *); -PCRE_EXP_DECL int pcre_callout(pcre_callout_block *); -PCRE_EXP_DECL int pcre_stack_guard(void); - -PCRE_EXP_DECL void *pcre16_malloc(size_t); -PCRE_EXP_DECL void pcre16_free(void *); -PCRE_EXP_DECL void *pcre16_stack_malloc(size_t); -PCRE_EXP_DECL void pcre16_stack_free(void *); -PCRE_EXP_DECL int pcre16_callout(pcre16_callout_block *); -PCRE_EXP_DECL int pcre16_stack_guard(void); - -PCRE_EXP_DECL void *pcre32_malloc(size_t); -PCRE_EXP_DECL void pcre32_free(void *); -PCRE_EXP_DECL void *pcre32_stack_malloc(size_t); -PCRE_EXP_DECL void pcre32_stack_free(void *); -PCRE_EXP_DECL int pcre32_callout(pcre32_callout_block *); -PCRE_EXP_DECL int pcre32_stack_guard(void); -#endif /* VPCOMPAT */ - -/* User defined callback which provides a stack just before the match starts. */ - -typedef pcre_jit_stack *(*pcre_jit_callback)(void *); -typedef pcre16_jit_stack *(*pcre16_jit_callback)(void *); -typedef pcre32_jit_stack *(*pcre32_jit_callback)(void *); - -/* Exported PCRE functions */ - -PCRE_EXP_DECL pcre *pcre_compile(const char *, int, const char **, int *, - const unsigned char *); -PCRE_EXP_DECL pcre16 *pcre16_compile(PCRE_SPTR16, int, const char **, int *, - const unsigned char *); -PCRE_EXP_DECL pcre32 *pcre32_compile(PCRE_SPTR32, int, const char **, int *, - const unsigned char *); -PCRE_EXP_DECL pcre *pcre_compile2(const char *, int, int *, const char **, - int *, const unsigned char *); -PCRE_EXP_DECL pcre16 *pcre16_compile2(PCRE_SPTR16, int, int *, const char **, - int *, const unsigned char *); -PCRE_EXP_DECL pcre32 *pcre32_compile2(PCRE_SPTR32, int, int *, const char **, - int *, const unsigned char *); -PCRE_EXP_DECL int pcre_config(int, void *); -PCRE_EXP_DECL int pcre16_config(int, void *); -PCRE_EXP_DECL int pcre32_config(int, void *); -PCRE_EXP_DECL int pcre_copy_named_substring(const pcre *, const char *, - int *, int, const char *, char *, int); -PCRE_EXP_DECL int pcre16_copy_named_substring(const pcre16 *, PCRE_SPTR16, - int *, int, PCRE_SPTR16, PCRE_UCHAR16 *, int); -PCRE_EXP_DECL int pcre32_copy_named_substring(const pcre32 *, PCRE_SPTR32, - int *, int, PCRE_SPTR32, PCRE_UCHAR32 *, int); -PCRE_EXP_DECL int pcre_copy_substring(const char *, int *, int, int, - char *, int); -PCRE_EXP_DECL int pcre16_copy_substring(PCRE_SPTR16, int *, int, int, - PCRE_UCHAR16 *, int); -PCRE_EXP_DECL int pcre32_copy_substring(PCRE_SPTR32, int *, int, int, - PCRE_UCHAR32 *, int); -PCRE_EXP_DECL int pcre_dfa_exec(const pcre *, const pcre_extra *, - const char *, int, int, int, int *, int , int *, int); -PCRE_EXP_DECL int pcre16_dfa_exec(const pcre16 *, const pcre16_extra *, - PCRE_SPTR16, int, int, int, int *, int , int *, int); -PCRE_EXP_DECL int pcre32_dfa_exec(const pcre32 *, const pcre32_extra *, - PCRE_SPTR32, int, int, int, int *, int , int *, int); -PCRE_EXP_DECL int pcre_exec(const pcre *, const pcre_extra *, PCRE_SPTR, - int, int, int, int *, int); -PCRE_EXP_DECL int pcre16_exec(const pcre16 *, const pcre16_extra *, - PCRE_SPTR16, int, int, int, int *, int); -PCRE_EXP_DECL int pcre32_exec(const pcre32 *, const pcre32_extra *, - PCRE_SPTR32, int, int, int, int *, int); -PCRE_EXP_DECL int pcre_jit_exec(const pcre *, const pcre_extra *, - PCRE_SPTR, int, int, int, int *, int, - pcre_jit_stack *); -PCRE_EXP_DECL int pcre16_jit_exec(const pcre16 *, const pcre16_extra *, - PCRE_SPTR16, int, int, int, int *, int, - pcre16_jit_stack *); -PCRE_EXP_DECL int pcre32_jit_exec(const pcre32 *, const pcre32_extra *, - PCRE_SPTR32, int, int, int, int *, int, - pcre32_jit_stack *); -PCRE_EXP_DECL void pcre_free_substring(const char *); -PCRE_EXP_DECL void pcre16_free_substring(PCRE_SPTR16); -PCRE_EXP_DECL void pcre32_free_substring(PCRE_SPTR32); -PCRE_EXP_DECL void pcre_free_substring_list(const char **); -PCRE_EXP_DECL void pcre16_free_substring_list(PCRE_SPTR16 *); -PCRE_EXP_DECL void pcre32_free_substring_list(PCRE_SPTR32 *); -PCRE_EXP_DECL int pcre_fullinfo(const pcre *, const pcre_extra *, int, - void *); -PCRE_EXP_DECL int pcre16_fullinfo(const pcre16 *, const pcre16_extra *, int, - void *); -PCRE_EXP_DECL int pcre32_fullinfo(const pcre32 *, const pcre32_extra *, int, - void *); -PCRE_EXP_DECL int pcre_get_named_substring(const pcre *, const char *, - int *, int, const char *, const char **); -PCRE_EXP_DECL int pcre16_get_named_substring(const pcre16 *, PCRE_SPTR16, - int *, int, PCRE_SPTR16, PCRE_SPTR16 *); -PCRE_EXP_DECL int pcre32_get_named_substring(const pcre32 *, PCRE_SPTR32, - int *, int, PCRE_SPTR32, PCRE_SPTR32 *); -PCRE_EXP_DECL int pcre_get_stringnumber(const pcre *, const char *); -PCRE_EXP_DECL int pcre16_get_stringnumber(const pcre16 *, PCRE_SPTR16); -PCRE_EXP_DECL int pcre32_get_stringnumber(const pcre32 *, PCRE_SPTR32); -PCRE_EXP_DECL int pcre_get_stringtable_entries(const pcre *, const char *, - char **, char **); -PCRE_EXP_DECL int pcre16_get_stringtable_entries(const pcre16 *, PCRE_SPTR16, - PCRE_UCHAR16 **, PCRE_UCHAR16 **); -PCRE_EXP_DECL int pcre32_get_stringtable_entries(const pcre32 *, PCRE_SPTR32, - PCRE_UCHAR32 **, PCRE_UCHAR32 **); -PCRE_EXP_DECL int pcre_get_substring(const char *, int *, int, int, - const char **); -PCRE_EXP_DECL int pcre16_get_substring(PCRE_SPTR16, int *, int, int, - PCRE_SPTR16 *); -PCRE_EXP_DECL int pcre32_get_substring(PCRE_SPTR32, int *, int, int, - PCRE_SPTR32 *); -PCRE_EXP_DECL int pcre_get_substring_list(const char *, int *, int, - const char ***); -PCRE_EXP_DECL int pcre16_get_substring_list(PCRE_SPTR16, int *, int, - PCRE_SPTR16 **); -PCRE_EXP_DECL int pcre32_get_substring_list(PCRE_SPTR32, int *, int, - PCRE_SPTR32 **); -PCRE_EXP_DECL const unsigned char *pcre_maketables(void); -PCRE_EXP_DECL const unsigned char *pcre16_maketables(void); -PCRE_EXP_DECL const unsigned char *pcre32_maketables(void); -PCRE_EXP_DECL int pcre_refcount(pcre *, int); -PCRE_EXP_DECL int pcre16_refcount(pcre16 *, int); -PCRE_EXP_DECL int pcre32_refcount(pcre32 *, int); -PCRE_EXP_DECL pcre_extra *pcre_study(const pcre *, int, const char **); -PCRE_EXP_DECL pcre16_extra *pcre16_study(const pcre16 *, int, const char **); -PCRE_EXP_DECL pcre32_extra *pcre32_study(const pcre32 *, int, const char **); -PCRE_EXP_DECL void pcre_free_study(pcre_extra *); -PCRE_EXP_DECL void pcre16_free_study(pcre16_extra *); -PCRE_EXP_DECL void pcre32_free_study(pcre32_extra *); -PCRE_EXP_DECL const char *pcre_version(void); -PCRE_EXP_DECL const char *pcre16_version(void); -PCRE_EXP_DECL const char *pcre32_version(void); - -/* Utility functions for byte order swaps. */ -PCRE_EXP_DECL int pcre_pattern_to_host_byte_order(pcre *, pcre_extra *, - const unsigned char *); -PCRE_EXP_DECL int pcre16_pattern_to_host_byte_order(pcre16 *, pcre16_extra *, - const unsigned char *); -PCRE_EXP_DECL int pcre32_pattern_to_host_byte_order(pcre32 *, pcre32_extra *, - const unsigned char *); -PCRE_EXP_DECL int pcre16_utf16_to_host_byte_order(PCRE_UCHAR16 *, - PCRE_SPTR16, int, int *, int); -PCRE_EXP_DECL int pcre32_utf32_to_host_byte_order(PCRE_UCHAR32 *, - PCRE_SPTR32, int, int *, int); - -/* JIT compiler related functions. */ - -PCRE_EXP_DECL pcre_jit_stack *pcre_jit_stack_alloc(int, int); -PCRE_EXP_DECL pcre16_jit_stack *pcre16_jit_stack_alloc(int, int); -PCRE_EXP_DECL pcre32_jit_stack *pcre32_jit_stack_alloc(int, int); -PCRE_EXP_DECL void pcre_jit_stack_free(pcre_jit_stack *); -PCRE_EXP_DECL void pcre16_jit_stack_free(pcre16_jit_stack *); -PCRE_EXP_DECL void pcre32_jit_stack_free(pcre32_jit_stack *); -PCRE_EXP_DECL void pcre_assign_jit_stack(pcre_extra *, - pcre_jit_callback, void *); -PCRE_EXP_DECL void pcre16_assign_jit_stack(pcre16_extra *, - pcre16_jit_callback, void *); -PCRE_EXP_DECL void pcre32_assign_jit_stack(pcre32_extra *, - pcre32_jit_callback, void *); -PCRE_EXP_DECL void pcre_jit_free_unused_memory(void); -PCRE_EXP_DECL void pcre16_jit_free_unused_memory(void); -PCRE_EXP_DECL void pcre32_jit_free_unused_memory(void); - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /* End of pcre.h */ diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/include/pcre_scanner.h b/client/3rd/ShadowSocks/ShadowSocks/pcre/include/pcre_scanner.h deleted file mode 100644 index 5617e451..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/include/pcre_scanner.h +++ /dev/null @@ -1,172 +0,0 @@ -// Copyright (c) 2005, Google Inc. -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -// -// Author: Sanjay Ghemawat -// -// Regular-expression based scanner for parsing an input stream. -// -// Example 1: parse a sequence of "var = number" entries from input: -// -// Scanner scanner(input); -// string var; -// int number; -// scanner.SetSkipExpression("\\s+"); // Skip any white space we encounter -// while (scanner.Consume("(\\w+) = (\\d+)", &var, &number)) { -// ...; -// } - -#ifndef _PCRE_SCANNER_H -#define _PCRE_SCANNER_H - -#include -#include -#include - -#include -#include - -namespace pcrecpp { - -class PCRECPP_EXP_DEFN Scanner { - public: - Scanner(); - explicit Scanner(const std::string& input); - ~Scanner(); - - // Return current line number. The returned line-number is - // one-based. I.e. it returns 1 + the number of consumed newlines. - // - // Note: this method may be slow. It may take time proportional to - // the size of the input. - int LineNumber() const; - - // Return the byte-offset that the scanner is looking in the - // input data; - int Offset() const; - - // Return true iff the start of the remaining input matches "re" - bool LookingAt(const RE& re) const; - - // Return true iff all of the following are true - // a. the start of the remaining input matches "re", - // b. if any arguments are supplied, matched sub-patterns can be - // parsed and stored into the arguments. - // If it returns true, it skips over the matched input and any - // following input that matches the "skip" regular expression. - bool Consume(const RE& re, - const Arg& arg0 = RE::no_arg, - const Arg& arg1 = RE::no_arg, - const Arg& arg2 = RE::no_arg - // TODO: Allow more arguments? - ); - - // Set the "skip" regular expression. If after consuming some data, - // a prefix of the input matches this RE, it is automatically - // skipped. For example, a programming language scanner would use - // a skip RE that matches white space and comments. - // - // scanner.SetSkipExpression("\\s+|//.*|/[*](.|\n)*?[*]/"); - // - // Skipping repeats as long as it succeeds. We used to let people do - // this by writing "(...)*" in the regular expression, but that added - // up to lots of recursive calls within the pcre library, so now we - // control repetition explicitly via the function call API. - // - // You can pass NULL for "re" if you do not want any data to be skipped. - void Skip(const char* re); // DEPRECATED; does *not* repeat - void SetSkipExpression(const char* re); - - // Temporarily pause "skip"ing. This - // Skip("Foo"); code ; DisableSkip(); code; EnableSkip() - // is similar to - // Skip("Foo"); code ; Skip(NULL); code ; Skip("Foo"); - // but avoids creating/deleting new RE objects. - void DisableSkip(); - - // Reenable previously paused skipping. Any prefix of the input - // that matches the skip pattern is immediately dropped. - void EnableSkip(); - - /***** Special wrappers around SetSkip() for some common idioms *****/ - - // Arranges to skip whitespace, C comments, C++ comments. - // The overall RE is a disjunction of the following REs: - // \\s whitespace - // //.*\n C++ comment - // /[*](.|\n)*?[*]/ C comment (x*? means minimal repetitions of x) - // We get repetition via the semantics of SetSkipExpression, not by using * - void SkipCXXComments() { - SetSkipExpression("\\s|//.*\n|/[*](?:\n|.)*?[*]/"); - } - - void set_save_comments(bool comments) { - save_comments_ = comments; - } - - bool save_comments() { - return save_comments_; - } - - // Append to vector ranges the comments found in the - // byte range [start,end] (inclusive) of the input data. - // Only comments that were extracted entirely within that - // range are returned: no range splitting of atomically-extracted - // comments is performed. - void GetComments(int start, int end, std::vector *ranges); - - // Append to vector ranges the comments added - // since the last time this was called. This - // functionality is provided for efficiency when - // interleaving scanning with parsing. - void GetNextComments(std::vector *ranges); - - private: - std::string data_; // All the input data - StringPiece input_; // Unprocessed input - RE* skip_; // If non-NULL, RE for skipping input - bool should_skip_; // If true, use skip_ - bool skip_repeat_; // If true, repeat skip_ as long as it works - bool save_comments_; // If true, aggregate the skip expression - - // the skipped comments - // TODO: later consider requiring that the StringPieces be added - // in order by their start position - std::vector *comments_; - - // the offset into comments_ that has been returned by GetNextComments - int comments_offset_; - - // helper function to consume *skip_ and honour - // save_comments_ - void ConsumeSkip(); -}; - -} // namespace pcrecpp - -#endif /* _PCRE_SCANNER_H */ diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/include/pcre_stringpiece.h b/client/3rd/ShadowSocks/ShadowSocks/pcre/include/pcre_stringpiece.h deleted file mode 100644 index cb94f52a..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/include/pcre_stringpiece.h +++ /dev/null @@ -1,180 +0,0 @@ -// Copyright (c) 2005, Google Inc. -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -// -// Author: Sanjay Ghemawat -// -// A string like object that points into another piece of memory. -// Useful for providing an interface that allows clients to easily -// pass in either a "const char*" or a "string". -// -// Arghh! I wish C++ literals were automatically of type "string". - -#ifndef _PCRE_STRINGPIECE_H -#define _PCRE_STRINGPIECE_H - -#include -#include -#include // for ostream forward-declaration - -#if 0 -#define HAVE_TYPE_TRAITS -#include -#elif 0 -#define HAVE_TYPE_TRAITS -#include -#endif - -#include - -namespace pcrecpp { - -using std::memcmp; -using std::strlen; -using std::string; - -class PCRECPP_EXP_DEFN StringPiece { - private: - const char* ptr_; - int length_; - - public: - // We provide non-explicit singleton constructors so users can pass - // in a "const char*" or a "string" wherever a "StringPiece" is - // expected. - StringPiece() - : ptr_(NULL), length_(0) { } - StringPiece(const char* str) - : ptr_(str), length_(static_cast(strlen(ptr_))) { } - StringPiece(const unsigned char* str) - : ptr_(reinterpret_cast(str)), - length_(static_cast(strlen(ptr_))) { } - StringPiece(const string& str) - : ptr_(str.data()), length_(static_cast(str.size())) { } - StringPiece(const char* offset, int len) - : ptr_(offset), length_(len) { } - - // data() may return a pointer to a buffer with embedded NULs, and the - // returned buffer may or may not be null terminated. Therefore it is - // typically a mistake to pass data() to a routine that expects a NUL - // terminated string. Use "as_string().c_str()" if you really need to do - // this. Or better yet, change your routine so it does not rely on NUL - // termination. - const char* data() const { return ptr_; } - int size() const { return length_; } - bool empty() const { return length_ == 0; } - - void clear() { ptr_ = NULL; length_ = 0; } - void set(const char* buffer, int len) { ptr_ = buffer; length_ = len; } - void set(const char* str) { - ptr_ = str; - length_ = static_cast(strlen(str)); - } - void set(const void* buffer, int len) { - ptr_ = reinterpret_cast(buffer); - length_ = len; - } - - char operator[](int i) const { return ptr_[i]; } - - void remove_prefix(int n) { - ptr_ += n; - length_ -= n; - } - - void remove_suffix(int n) { - length_ -= n; - } - - bool operator==(const StringPiece& x) const { - return ((length_ == x.length_) && - (memcmp(ptr_, x.ptr_, length_) == 0)); - } - bool operator!=(const StringPiece& x) const { - return !(*this == x); - } - -#define STRINGPIECE_BINARY_PREDICATE(cmp,auxcmp) \ - bool operator cmp (const StringPiece& x) const { \ - int r = memcmp(ptr_, x.ptr_, length_ < x.length_ ? length_ : x.length_); \ - return ((r auxcmp 0) || ((r == 0) && (length_ cmp x.length_))); \ - } - STRINGPIECE_BINARY_PREDICATE(<, <); - STRINGPIECE_BINARY_PREDICATE(<=, <); - STRINGPIECE_BINARY_PREDICATE(>=, >); - STRINGPIECE_BINARY_PREDICATE(>, >); -#undef STRINGPIECE_BINARY_PREDICATE - - int compare(const StringPiece& x) const { - int r = memcmp(ptr_, x.ptr_, length_ < x.length_ ? length_ : x.length_); - if (r == 0) { - if (length_ < x.length_) r = -1; - else if (length_ > x.length_) r = +1; - } - return r; - } - - string as_string() const { - return string(data(), size()); - } - - void CopyToString(string* target) const { - target->assign(ptr_, length_); - } - - // Does "this" start with "x" - bool starts_with(const StringPiece& x) const { - return ((length_ >= x.length_) && (memcmp(ptr_, x.ptr_, x.length_) == 0)); - } -}; - -} // namespace pcrecpp - -// ------------------------------------------------------------------ -// Functions used to create STL containers that use StringPiece -// Remember that a StringPiece's lifetime had better be less than -// that of the underlying string or char*. If it is not, then you -// cannot safely store a StringPiece into an STL container -// ------------------------------------------------------------------ - -#ifdef HAVE_TYPE_TRAITS -// This makes vector really fast for some STL implementations -template<> struct __type_traits { - typedef __true_type has_trivial_default_constructor; - typedef __true_type has_trivial_copy_constructor; - typedef __true_type has_trivial_assignment_operator; - typedef __true_type has_trivial_destructor; - typedef __true_type is_POD_type; -}; -#endif - -// allow StringPiece to be logged -PCRECPP_EXP_DECL std::ostream& operator<<(std::ostream& o, - const pcrecpp::StringPiece& piece); - -#endif /* _PCRE_STRINGPIECE_H */ diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/include/pcrecpp.h b/client/3rd/ShadowSocks/ShadowSocks/pcre/include/pcrecpp.h deleted file mode 100644 index 3e594b0d..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/include/pcrecpp.h +++ /dev/null @@ -1,710 +0,0 @@ -// Copyright (c) 2005, Google Inc. -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -// -// Author: Sanjay Ghemawat -// Support for PCRE_XXX modifiers added by Giuseppe Maxia, July 2005 - -#ifndef _PCRECPP_H -#define _PCRECPP_H - -// C++ interface to the pcre regular-expression library. RE supports -// Perl-style regular expressions (with extensions like \d, \w, \s, -// ...). -// -// ----------------------------------------------------------------------- -// REGEXP SYNTAX: -// -// This module is part of the pcre library and hence supports its syntax -// for regular expressions. -// -// The syntax is pretty similar to Perl's. For those not familiar -// with Perl's regular expressions, here are some examples of the most -// commonly used extensions: -// -// "hello (\\w+) world" -- \w matches a "word" character -// "version (\\d+)" -- \d matches a digit -// "hello\\s+world" -- \s matches any whitespace character -// "\\b(\\w+)\\b" -- \b matches empty string at a word boundary -// "(?i)hello" -- (?i) turns on case-insensitive matching -// "/\\*(.*?)\\*/" -- .*? matches . minimum no. of times possible -// -// ----------------------------------------------------------------------- -// MATCHING INTERFACE: -// -// The "FullMatch" operation checks that supplied text matches a -// supplied pattern exactly. -// -// Example: successful match -// pcrecpp::RE re("h.*o"); -// re.FullMatch("hello"); -// -// Example: unsuccessful match (requires full match): -// pcrecpp::RE re("e"); -// !re.FullMatch("hello"); -// -// Example: creating a temporary RE object: -// pcrecpp::RE("h.*o").FullMatch("hello"); -// -// You can pass in a "const char*" or a "string" for "text". The -// examples below tend to use a const char*. -// -// You can, as in the different examples above, store the RE object -// explicitly in a variable or use a temporary RE object. The -// examples below use one mode or the other arbitrarily. Either -// could correctly be used for any of these examples. -// -// ----------------------------------------------------------------------- -// MATCHING WITH SUB-STRING EXTRACTION: -// -// You can supply extra pointer arguments to extract matched subpieces. -// -// Example: extracts "ruby" into "s" and 1234 into "i" -// int i; -// string s; -// pcrecpp::RE re("(\\w+):(\\d+)"); -// re.FullMatch("ruby:1234", &s, &i); -// -// Example: does not try to extract any extra sub-patterns -// re.FullMatch("ruby:1234", &s); -// -// Example: does not try to extract into NULL -// re.FullMatch("ruby:1234", NULL, &i); -// -// Example: integer overflow causes failure -// !re.FullMatch("ruby:1234567891234", NULL, &i); -// -// Example: fails because there aren't enough sub-patterns: -// !pcrecpp::RE("\\w+:\\d+").FullMatch("ruby:1234", &s); -// -// Example: fails because string cannot be stored in integer -// !pcrecpp::RE("(.*)").FullMatch("ruby", &i); -// -// The provided pointer arguments can be pointers to any scalar numeric -// type, or one of -// string (matched piece is copied to string) -// StringPiece (StringPiece is mutated to point to matched piece) -// T (where "bool T::ParseFrom(const char*, int)" exists) -// NULL (the corresponding matched sub-pattern is not copied) -// -// CAVEAT: An optional sub-pattern that does not exist in the matched -// string is assigned the empty string. Therefore, the following will -// return false (because the empty string is not a valid number): -// int number; -// pcrecpp::RE::FullMatch("abc", "[a-z]+(\\d+)?", &number); -// -// ----------------------------------------------------------------------- -// DO_MATCH -// -// The matching interface supports at most 16 arguments per call. -// If you need more, consider using the more general interface -// pcrecpp::RE::DoMatch(). See pcrecpp.h for the signature for DoMatch. -// -// ----------------------------------------------------------------------- -// PARTIAL MATCHES -// -// You can use the "PartialMatch" operation when you want the pattern -// to match any substring of the text. -// -// Example: simple search for a string: -// pcrecpp::RE("ell").PartialMatch("hello"); -// -// Example: find first number in a string: -// int number; -// pcrecpp::RE re("(\\d+)"); -// re.PartialMatch("x*100 + 20", &number); -// assert(number == 100); -// -// ----------------------------------------------------------------------- -// UTF-8 AND THE MATCHING INTERFACE: -// -// By default, pattern and text are plain text, one byte per character. -// The UTF8 flag, passed to the constructor, causes both pattern -// and string to be treated as UTF-8 text, still a byte stream but -// potentially multiple bytes per character. In practice, the text -// is likelier to be UTF-8 than the pattern, but the match returned -// may depend on the UTF8 flag, so always use it when matching -// UTF8 text. E.g., "." will match one byte normally but with UTF8 -// set may match up to three bytes of a multi-byte character. -// -// Example: -// pcrecpp::RE_Options options; -// options.set_utf8(); -// pcrecpp::RE re(utf8_pattern, options); -// re.FullMatch(utf8_string); -// -// Example: using the convenience function UTF8(): -// pcrecpp::RE re(utf8_pattern, pcrecpp::UTF8()); -// re.FullMatch(utf8_string); -// -// NOTE: The UTF8 option is ignored if pcre was not configured with the -// --enable-utf8 flag. -// -// ----------------------------------------------------------------------- -// PASSING MODIFIERS TO THE REGULAR EXPRESSION ENGINE -// -// PCRE defines some modifiers to change the behavior of the regular -// expression engine. -// The C++ wrapper defines an auxiliary class, RE_Options, as a vehicle -// to pass such modifiers to a RE class. -// -// Currently, the following modifiers are supported -// -// modifier description Perl corresponding -// -// PCRE_CASELESS case insensitive match /i -// PCRE_MULTILINE multiple lines match /m -// PCRE_DOTALL dot matches newlines /s -// PCRE_DOLLAR_ENDONLY $ matches only at end N/A -// PCRE_EXTRA strict escape parsing N/A -// PCRE_EXTENDED ignore whitespaces /x -// PCRE_UTF8 handles UTF8 chars built-in -// PCRE_UNGREEDY reverses * and *? N/A -// PCRE_NO_AUTO_CAPTURE disables matching parens N/A (*) -// -// (For a full account on how each modifier works, please check the -// PCRE API reference manual). -// -// (*) Both Perl and PCRE allow non matching parentheses by means of the -// "?:" modifier within the pattern itself. e.g. (?:ab|cd) does not -// capture, while (ab|cd) does. -// -// For each modifier, there are two member functions whose name is made -// out of the modifier in lowercase, without the "PCRE_" prefix. For -// instance, PCRE_CASELESS is handled by -// bool caseless(), -// which returns true if the modifier is set, and -// RE_Options & set_caseless(bool), -// which sets or unsets the modifier. -// -// Moreover, PCRE_EXTRA_MATCH_LIMIT can be accessed through the -// set_match_limit() and match_limit() member functions. -// Setting match_limit to a non-zero value will limit the executation of -// pcre to keep it from doing bad things like blowing the stack or taking -// an eternity to return a result. A value of 5000 is good enough to stop -// stack blowup in a 2MB thread stack. Setting match_limit to zero will -// disable match limiting. Alternately, you can set match_limit_recursion() -// which uses PCRE_EXTRA_MATCH_LIMIT_RECURSION to limit how much pcre -// recurses. match_limit() caps the number of matches pcre does; -// match_limit_recrusion() caps the depth of recursion. -// -// Normally, to pass one or more modifiers to a RE class, you declare -// a RE_Options object, set the appropriate options, and pass this -// object to a RE constructor. Example: -// -// RE_options opt; -// opt.set_caseless(true); -// -// if (RE("HELLO", opt).PartialMatch("hello world")) ... -// -// RE_options has two constructors. The default constructor takes no -// arguments and creates a set of flags that are off by default. -// -// The optional parameter 'option_flags' is to facilitate transfer -// of legacy code from C programs. This lets you do -// RE(pattern, RE_Options(PCRE_CASELESS|PCRE_MULTILINE)).PartialMatch(str); -// -// But new code is better off doing -// RE(pattern, -// RE_Options().set_caseless(true).set_multiline(true)).PartialMatch(str); -// (See below) -// -// If you are going to pass one of the most used modifiers, there are some -// convenience functions that return a RE_Options class with the -// appropriate modifier already set: -// CASELESS(), UTF8(), MULTILINE(), DOTALL(), EXTENDED() -// -// If you need to set several options at once, and you don't want to go -// through the pains of declaring a RE_Options object and setting several -// options, there is a parallel method that give you such ability on the -// fly. You can concatenate several set_xxxxx member functions, since each -// of them returns a reference to its class object. e.g.: to pass -// PCRE_CASELESS, PCRE_EXTENDED, and PCRE_MULTILINE to a RE with one -// statement, you may write -// -// RE(" ^ xyz \\s+ .* blah$", RE_Options() -// .set_caseless(true) -// .set_extended(true) -// .set_multiline(true)).PartialMatch(sometext); -// -// ----------------------------------------------------------------------- -// SCANNING TEXT INCREMENTALLY -// -// The "Consume" operation may be useful if you want to repeatedly -// match regular expressions at the front of a string and skip over -// them as they match. This requires use of the "StringPiece" type, -// which represents a sub-range of a real string. Like RE, StringPiece -// is defined in the pcrecpp namespace. -// -// Example: read lines of the form "var = value" from a string. -// string contents = ...; // Fill string somehow -// pcrecpp::StringPiece input(contents); // Wrap in a StringPiece -// -// string var; -// int value; -// pcrecpp::RE re("(\\w+) = (\\d+)\n"); -// while (re.Consume(&input, &var, &value)) { -// ...; -// } -// -// Each successful call to "Consume" will set "var/value", and also -// advance "input" so it points past the matched text. -// -// The "FindAndConsume" operation is similar to "Consume" but does not -// anchor your match at the beginning of the string. For example, you -// could extract all words from a string by repeatedly calling -// pcrecpp::RE("(\\w+)").FindAndConsume(&input, &word) -// -// ----------------------------------------------------------------------- -// PARSING HEX/OCTAL/C-RADIX NUMBERS -// -// By default, if you pass a pointer to a numeric value, the -// corresponding text is interpreted as a base-10 number. You can -// instead wrap the pointer with a call to one of the operators Hex(), -// Octal(), or CRadix() to interpret the text in another base. The -// CRadix operator interprets C-style "0" (base-8) and "0x" (base-16) -// prefixes, but defaults to base-10. -// -// Example: -// int a, b, c, d; -// pcrecpp::RE re("(.*) (.*) (.*) (.*)"); -// re.FullMatch("100 40 0100 0x40", -// pcrecpp::Octal(&a), pcrecpp::Hex(&b), -// pcrecpp::CRadix(&c), pcrecpp::CRadix(&d)); -// will leave 64 in a, b, c, and d. -// -// ----------------------------------------------------------------------- -// REPLACING PARTS OF STRINGS -// -// You can replace the first match of "pattern" in "str" with -// "rewrite". Within "rewrite", backslash-escaped digits (\1 to \9) -// can be used to insert text matching corresponding parenthesized -// group from the pattern. \0 in "rewrite" refers to the entire -// matching text. E.g., -// -// string s = "yabba dabba doo"; -// pcrecpp::RE("b+").Replace("d", &s); -// -// will leave "s" containing "yada dabba doo". The result is true if -// the pattern matches and a replacement occurs, or false otherwise. -// -// GlobalReplace() is like Replace(), except that it replaces all -// occurrences of the pattern in the string with the rewrite. -// Replacements are not subject to re-matching. E.g., -// -// string s = "yabba dabba doo"; -// pcrecpp::RE("b+").GlobalReplace("d", &s); -// -// will leave "s" containing "yada dada doo". It returns the number -// of replacements made. -// -// Extract() is like Replace(), except that if the pattern matches, -// "rewrite" is copied into "out" (an additional argument) with -// substitutions. The non-matching portions of "text" are ignored. -// Returns true iff a match occurred and the extraction happened -// successfully. If no match occurs, the string is left unaffected. - - -#include -#include -#include // defines the Arg class -// This isn't technically needed here, but we include it -// anyway so folks who include pcrecpp.h don't have to. -#include - -namespace pcrecpp { - -#define PCRE_SET_OR_CLEAR(b, o) \ - if (b) all_options_ |= (o); else all_options_ &= ~(o); \ - return *this - -#define PCRE_IS_SET(o) \ - (all_options_ & o) == o - -/***** Compiling regular expressions: the RE class *****/ - -// RE_Options allow you to set options to be passed along to pcre, -// along with other options we put on top of pcre. -// Only 9 modifiers, plus match_limit and match_limit_recursion, -// are supported now. -class PCRECPP_EXP_DEFN RE_Options { - public: - // constructor - RE_Options() : match_limit_(0), match_limit_recursion_(0), all_options_(0) {} - - // alternative constructor. - // To facilitate transfer of legacy code from C programs - // - // This lets you do - // RE(pattern, RE_Options(PCRE_CASELESS|PCRE_MULTILINE)).PartialMatch(str); - // But new code is better off doing - // RE(pattern, - // RE_Options().set_caseless(true).set_multiline(true)).PartialMatch(str); - RE_Options(int option_flags) : match_limit_(0), match_limit_recursion_(0), - all_options_(option_flags) {} - // we're fine with the default destructor, copy constructor, etc. - - // accessors and mutators - int match_limit() const { return match_limit_; }; - RE_Options &set_match_limit(int limit) { - match_limit_ = limit; - return *this; - } - - int match_limit_recursion() const { return match_limit_recursion_; }; - RE_Options &set_match_limit_recursion(int limit) { - match_limit_recursion_ = limit; - return *this; - } - - bool caseless() const { - return PCRE_IS_SET(PCRE_CASELESS); - } - RE_Options &set_caseless(bool x) { - PCRE_SET_OR_CLEAR(x, PCRE_CASELESS); - } - - bool multiline() const { - return PCRE_IS_SET(PCRE_MULTILINE); - } - RE_Options &set_multiline(bool x) { - PCRE_SET_OR_CLEAR(x, PCRE_MULTILINE); - } - - bool dotall() const { - return PCRE_IS_SET(PCRE_DOTALL); - } - RE_Options &set_dotall(bool x) { - PCRE_SET_OR_CLEAR(x, PCRE_DOTALL); - } - - bool extended() const { - return PCRE_IS_SET(PCRE_EXTENDED); - } - RE_Options &set_extended(bool x) { - PCRE_SET_OR_CLEAR(x, PCRE_EXTENDED); - } - - bool dollar_endonly() const { - return PCRE_IS_SET(PCRE_DOLLAR_ENDONLY); - } - RE_Options &set_dollar_endonly(bool x) { - PCRE_SET_OR_CLEAR(x, PCRE_DOLLAR_ENDONLY); - } - - bool extra() const { - return PCRE_IS_SET(PCRE_EXTRA); - } - RE_Options &set_extra(bool x) { - PCRE_SET_OR_CLEAR(x, PCRE_EXTRA); - } - - bool ungreedy() const { - return PCRE_IS_SET(PCRE_UNGREEDY); - } - RE_Options &set_ungreedy(bool x) { - PCRE_SET_OR_CLEAR(x, PCRE_UNGREEDY); - } - - bool utf8() const { - return PCRE_IS_SET(PCRE_UTF8); - } - RE_Options &set_utf8(bool x) { - PCRE_SET_OR_CLEAR(x, PCRE_UTF8); - } - - bool no_auto_capture() const { - return PCRE_IS_SET(PCRE_NO_AUTO_CAPTURE); - } - RE_Options &set_no_auto_capture(bool x) { - PCRE_SET_OR_CLEAR(x, PCRE_NO_AUTO_CAPTURE); - } - - RE_Options &set_all_options(int opt) { - all_options_ = opt; - return *this; - } - int all_options() const { - return all_options_ ; - } - - // TODO: add other pcre flags - - private: - int match_limit_; - int match_limit_recursion_; - int all_options_; -}; - -// These functions return some common RE_Options -static inline RE_Options UTF8() { - return RE_Options().set_utf8(true); -} - -static inline RE_Options CASELESS() { - return RE_Options().set_caseless(true); -} -static inline RE_Options MULTILINE() { - return RE_Options().set_multiline(true); -} - -static inline RE_Options DOTALL() { - return RE_Options().set_dotall(true); -} - -static inline RE_Options EXTENDED() { - return RE_Options().set_extended(true); -} - -// Interface for regular expression matching. Also corresponds to a -// pre-compiled regular expression. An "RE" object is safe for -// concurrent use by multiple threads. -class PCRECPP_EXP_DEFN RE { - public: - // We provide implicit conversions from strings so that users can - // pass in a string or a "const char*" wherever an "RE" is expected. - RE(const string& pat) { Init(pat, NULL); } - RE(const string& pat, const RE_Options& option) { Init(pat, &option); } - RE(const char* pat) { Init(pat, NULL); } - RE(const char* pat, const RE_Options& option) { Init(pat, &option); } - RE(const unsigned char* pat) { - Init(reinterpret_cast(pat), NULL); - } - RE(const unsigned char* pat, const RE_Options& option) { - Init(reinterpret_cast(pat), &option); - } - - // Copy constructor & assignment - note that these are expensive - // because they recompile the expression. - RE(const RE& re) { Init(re.pattern_, &re.options_); } - const RE& operator=(const RE& re) { - if (this != &re) { - Cleanup(); - - // This is the code that originally came from Google - // Init(re.pattern_.c_str(), &re.options_); - - // This is the replacement from Ari Pollak - Init(re.pattern_, &re.options_); - } - return *this; - } - - - ~RE(); - - // The string specification for this RE. E.g. - // RE re("ab*c?d+"); - // re.pattern(); // "ab*c?d+" - const string& pattern() const { return pattern_; } - - // If RE could not be created properly, returns an error string. - // Else returns the empty string. - const string& error() const { return *error_; } - - /***** The useful part: the matching interface *****/ - - // This is provided so one can do pattern.ReplaceAll() just as - // easily as ReplaceAll(pattern-text, ....) - - bool FullMatch(const StringPiece& text, - const Arg& ptr1 = no_arg, - const Arg& ptr2 = no_arg, - const Arg& ptr3 = no_arg, - const Arg& ptr4 = no_arg, - const Arg& ptr5 = no_arg, - const Arg& ptr6 = no_arg, - const Arg& ptr7 = no_arg, - const Arg& ptr8 = no_arg, - const Arg& ptr9 = no_arg, - const Arg& ptr10 = no_arg, - const Arg& ptr11 = no_arg, - const Arg& ptr12 = no_arg, - const Arg& ptr13 = no_arg, - const Arg& ptr14 = no_arg, - const Arg& ptr15 = no_arg, - const Arg& ptr16 = no_arg) const; - - bool PartialMatch(const StringPiece& text, - const Arg& ptr1 = no_arg, - const Arg& ptr2 = no_arg, - const Arg& ptr3 = no_arg, - const Arg& ptr4 = no_arg, - const Arg& ptr5 = no_arg, - const Arg& ptr6 = no_arg, - const Arg& ptr7 = no_arg, - const Arg& ptr8 = no_arg, - const Arg& ptr9 = no_arg, - const Arg& ptr10 = no_arg, - const Arg& ptr11 = no_arg, - const Arg& ptr12 = no_arg, - const Arg& ptr13 = no_arg, - const Arg& ptr14 = no_arg, - const Arg& ptr15 = no_arg, - const Arg& ptr16 = no_arg) const; - - bool Consume(StringPiece* input, - const Arg& ptr1 = no_arg, - const Arg& ptr2 = no_arg, - const Arg& ptr3 = no_arg, - const Arg& ptr4 = no_arg, - const Arg& ptr5 = no_arg, - const Arg& ptr6 = no_arg, - const Arg& ptr7 = no_arg, - const Arg& ptr8 = no_arg, - const Arg& ptr9 = no_arg, - const Arg& ptr10 = no_arg, - const Arg& ptr11 = no_arg, - const Arg& ptr12 = no_arg, - const Arg& ptr13 = no_arg, - const Arg& ptr14 = no_arg, - const Arg& ptr15 = no_arg, - const Arg& ptr16 = no_arg) const; - - bool FindAndConsume(StringPiece* input, - const Arg& ptr1 = no_arg, - const Arg& ptr2 = no_arg, - const Arg& ptr3 = no_arg, - const Arg& ptr4 = no_arg, - const Arg& ptr5 = no_arg, - const Arg& ptr6 = no_arg, - const Arg& ptr7 = no_arg, - const Arg& ptr8 = no_arg, - const Arg& ptr9 = no_arg, - const Arg& ptr10 = no_arg, - const Arg& ptr11 = no_arg, - const Arg& ptr12 = no_arg, - const Arg& ptr13 = no_arg, - const Arg& ptr14 = no_arg, - const Arg& ptr15 = no_arg, - const Arg& ptr16 = no_arg) const; - - bool Replace(const StringPiece& rewrite, - string *str) const; - - int GlobalReplace(const StringPiece& rewrite, - string *str) const; - - bool Extract(const StringPiece &rewrite, - const StringPiece &text, - string *out) const; - - // Escapes all potentially meaningful regexp characters in - // 'unquoted'. The returned string, used as a regular expression, - // will exactly match the original string. For example, - // 1.5-2.0? - // may become: - // 1\.5\-2\.0\? - // Note QuoteMeta behaves the same as perl's QuoteMeta function, - // *except* that it escapes the NUL character (\0) as backslash + 0, - // rather than backslash + NUL. - static string QuoteMeta(const StringPiece& unquoted); - - - /***** Generic matching interface *****/ - - // Type of match (TODO: Should be restructured as part of RE_Options) - enum Anchor { - UNANCHORED, // No anchoring - ANCHOR_START, // Anchor at start only - ANCHOR_BOTH // Anchor at start and end - }; - - // General matching routine. Stores the length of the match in - // "*consumed" if successful. - bool DoMatch(const StringPiece& text, - Anchor anchor, - int* consumed, - const Arg* const* args, int n) const; - - // Return the number of capturing subpatterns, or -1 if the - // regexp wasn't valid on construction. - int NumberOfCapturingGroups() const; - - // The default value for an argument, to indicate the end of the argument - // list. This must be used only in optional argument defaults. It should NOT - // be passed explicitly. Some people have tried to use it like this: - // - // FullMatch(x, y, &z, no_arg, &w); - // - // This is a mistake, and will not work. - static Arg no_arg; - - private: - - void Init(const string& pattern, const RE_Options* options); - void Cleanup(); - - // Match against "text", filling in "vec" (up to "vecsize" * 2/3) with - // pairs of integers for the beginning and end positions of matched - // text. The first pair corresponds to the entire matched text; - // subsequent pairs correspond, in order, to parentheses-captured - // matches. Returns the number of pairs (one more than the number of - // the last subpattern with a match) if matching was successful - // and zero if the match failed. - // I.e. for RE("(foo)|(bar)|(baz)") it will return 2, 3, and 4 when matching - // against "foo", "bar", and "baz" respectively. - // When matching RE("(foo)|hello") against "hello", it will return 1. - // But the values for all subpattern are filled in into "vec". - int TryMatch(const StringPiece& text, - int startpos, - Anchor anchor, - bool empty_ok, - int *vec, - int vecsize) const; - - // Append the "rewrite" string, with backslash subsitutions from "text" - // and "vec", to string "out". - bool Rewrite(string *out, - const StringPiece& rewrite, - const StringPiece& text, - int *vec, - int veclen) const; - - // internal implementation for DoMatch - bool DoMatchImpl(const StringPiece& text, - Anchor anchor, - int* consumed, - const Arg* const args[], - int n, - int* vec, - int vecsize) const; - - // Compile the regexp for the specified anchoring mode - pcre* Compile(Anchor anchor); - - string pattern_; - RE_Options options_; - pcre* re_full_; // For full matches - pcre* re_partial_; // For partial matches - const string* error_; // Error indicator (or points to empty string) -}; - -} // namespace pcrecpp - -#endif /* _PCRECPP_H */ diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/include/pcrecpparg.h b/client/3rd/ShadowSocks/ShadowSocks/pcre/include/pcrecpparg.h deleted file mode 100644 index b4f9c3f4..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/include/pcrecpparg.h +++ /dev/null @@ -1,174 +0,0 @@ -// Copyright (c) 2005, Google Inc. -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -// -// Author: Sanjay Ghemawat - -#ifndef _PCRECPPARG_H -#define _PCRECPPARG_H - -#include // for NULL -#include - -#include - -namespace pcrecpp { - -class StringPiece; - -// Hex/Octal/Binary? - -// Special class for parsing into objects that define a ParseFrom() method -template -class _RE_MatchObject { - public: - static inline bool Parse(const char* str, int n, void* dest) { - if (dest == NULL) return true; - T* object = reinterpret_cast(dest); - return object->ParseFrom(str, n); - } -}; - -class PCRECPP_EXP_DEFN Arg { - public: - // Empty constructor so we can declare arrays of Arg - Arg(); - - // Constructor specially designed for NULL arguments - Arg(void*); - - typedef bool (*Parser)(const char* str, int n, void* dest); - -// Type-specific parsers -#define PCRE_MAKE_PARSER(type,name) \ - Arg(type* p) : arg_(p), parser_(name) { } \ - Arg(type* p, Parser parser) : arg_(p), parser_(parser) { } - - - PCRE_MAKE_PARSER(char, parse_char); - PCRE_MAKE_PARSER(unsigned char, parse_uchar); - PCRE_MAKE_PARSER(short, parse_short); - PCRE_MAKE_PARSER(unsigned short, parse_ushort); - PCRE_MAKE_PARSER(int, parse_int); - PCRE_MAKE_PARSER(unsigned int, parse_uint); - PCRE_MAKE_PARSER(long, parse_long); - PCRE_MAKE_PARSER(unsigned long, parse_ulong); -#if 1 - PCRE_MAKE_PARSER(long long, parse_longlong); -#endif -#if 1 - PCRE_MAKE_PARSER(unsigned long long, parse_ulonglong); -#endif - PCRE_MAKE_PARSER(float, parse_float); - PCRE_MAKE_PARSER(double, parse_double); - PCRE_MAKE_PARSER(std::string, parse_string); - PCRE_MAKE_PARSER(StringPiece, parse_stringpiece); - -#undef PCRE_MAKE_PARSER - - // Generic constructor - template Arg(T*, Parser parser); - // Generic constructor template - template Arg(T* p) - : arg_(p), parser_(_RE_MatchObject::Parse) { - } - - // Parse the data - bool Parse(const char* str, int n) const; - - private: - void* arg_; - Parser parser_; - - static bool parse_null (const char* str, int n, void* dest); - static bool parse_char (const char* str, int n, void* dest); - static bool parse_uchar (const char* str, int n, void* dest); - static bool parse_float (const char* str, int n, void* dest); - static bool parse_double (const char* str, int n, void* dest); - static bool parse_string (const char* str, int n, void* dest); - static bool parse_stringpiece (const char* str, int n, void* dest); - -#define PCRE_DECLARE_INTEGER_PARSER(name) \ - private: \ - static bool parse_ ## name(const char* str, int n, void* dest); \ - static bool parse_ ## name ## _radix( \ - const char* str, int n, void* dest, int radix); \ - public: \ - static bool parse_ ## name ## _hex(const char* str, int n, void* dest); \ - static bool parse_ ## name ## _octal(const char* str, int n, void* dest); \ - static bool parse_ ## name ## _cradix(const char* str, int n, void* dest) - - PCRE_DECLARE_INTEGER_PARSER(short); - PCRE_DECLARE_INTEGER_PARSER(ushort); - PCRE_DECLARE_INTEGER_PARSER(int); - PCRE_DECLARE_INTEGER_PARSER(uint); - PCRE_DECLARE_INTEGER_PARSER(long); - PCRE_DECLARE_INTEGER_PARSER(ulong); - PCRE_DECLARE_INTEGER_PARSER(longlong); - PCRE_DECLARE_INTEGER_PARSER(ulonglong); - -#undef PCRE_DECLARE_INTEGER_PARSER -}; - -inline Arg::Arg() : arg_(NULL), parser_(parse_null) { } -inline Arg::Arg(void* p) : arg_(p), parser_(parse_null) { } - -inline bool Arg::Parse(const char* str, int n) const { - return (*parser_)(str, n, arg_); -} - -// This part of the parser, appropriate only for ints, deals with bases -#define MAKE_INTEGER_PARSER(type, name) \ - inline Arg Hex(type* ptr) { \ - return Arg(ptr, Arg::parse_ ## name ## _hex); } \ - inline Arg Octal(type* ptr) { \ - return Arg(ptr, Arg::parse_ ## name ## _octal); } \ - inline Arg CRadix(type* ptr) { \ - return Arg(ptr, Arg::parse_ ## name ## _cradix); } - -MAKE_INTEGER_PARSER(short, short) /* */ -MAKE_INTEGER_PARSER(unsigned short, ushort) /* */ -MAKE_INTEGER_PARSER(int, int) /* Don't use semicolons */ -MAKE_INTEGER_PARSER(unsigned int, uint) /* after these statement */ -MAKE_INTEGER_PARSER(long, long) /* because they can cause */ -MAKE_INTEGER_PARSER(unsigned long, ulong) /* compiler warnings if */ -#if 1 /* the checking level is */ -MAKE_INTEGER_PARSER(long long, longlong) /* turned up high enough. */ -#endif /* */ -#if 1 /* */ -MAKE_INTEGER_PARSER(unsigned long long, ulonglong) /* */ -#endif - -#undef PCRE_IS_SET -#undef PCRE_SET_OR_CLEAR -#undef MAKE_INTEGER_PARSER - -} // namespace pcrecpp - - -#endif /* _PCRECPPARG_H */ diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/include/pcreposix.h b/client/3rd/ShadowSocks/ShadowSocks/pcre/include/pcreposix.h deleted file mode 100644 index c77c0b05..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/include/pcreposix.h +++ /dev/null @@ -1,146 +0,0 @@ -/************************************************* -* Perl-Compatible Regular Expressions * -*************************************************/ - -#ifndef _PCREPOSIX_H -#define _PCREPOSIX_H - -/* This is the header for the POSIX wrapper interface to the PCRE Perl- -Compatible Regular Expression library. It defines the things POSIX says should -be there. I hope. - - Copyright (c) 1997-2012 University of Cambridge - ------------------------------------------------------------------------------ -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - - * Neither the name of the University of Cambridge nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. ------------------------------------------------------------------------------ -*/ - -/* Have to include stdlib.h in order to ensure that size_t is defined. */ - -#include - -/* Allow for C++ users */ - -#ifdef __cplusplus -extern "C" { -#endif - -/* Options, mostly defined by POSIX, but with some extras. */ - -#define REG_ICASE 0x0001 /* Maps to PCRE_CASELESS */ -#define REG_NEWLINE 0x0002 /* Maps to PCRE_MULTILINE */ -#define REG_NOTBOL 0x0004 /* Maps to PCRE_NOTBOL */ -#define REG_NOTEOL 0x0008 /* Maps to PCRE_NOTEOL */ -#define REG_DOTALL 0x0010 /* NOT defined by POSIX; maps to PCRE_DOTALL */ -#define REG_NOSUB 0x0020 /* Maps to PCRE_NO_AUTO_CAPTURE */ -#define REG_UTF8 0x0040 /* NOT defined by POSIX; maps to PCRE_UTF8 */ -#define REG_STARTEND 0x0080 /* BSD feature: pass subject string by so,eo */ -#define REG_NOTEMPTY 0x0100 /* NOT defined by POSIX; maps to PCRE_NOTEMPTY */ -#define REG_UNGREEDY 0x0200 /* NOT defined by POSIX; maps to PCRE_UNGREEDY */ -#define REG_UCP 0x0400 /* NOT defined by POSIX; maps to PCRE_UCP */ - -/* This is not used by PCRE, but by defining it we make it easier -to slot PCRE into existing programs that make POSIX calls. */ - -#define REG_EXTENDED 0 - -/* Error values. Not all these are relevant or used by the wrapper. */ - -enum { - REG_ASSERT = 1, /* internal error ? */ - REG_BADBR, /* invalid repeat counts in {} */ - REG_BADPAT, /* pattern error */ - REG_BADRPT, /* ? * + invalid */ - REG_EBRACE, /* unbalanced {} */ - REG_EBRACK, /* unbalanced [] */ - REG_ECOLLATE, /* collation error - not relevant */ - REG_ECTYPE, /* bad class */ - REG_EESCAPE, /* bad escape sequence */ - REG_EMPTY, /* empty expression */ - REG_EPAREN, /* unbalanced () */ - REG_ERANGE, /* bad range inside [] */ - REG_ESIZE, /* expression too big */ - REG_ESPACE, /* failed to get memory */ - REG_ESUBREG, /* bad back reference */ - REG_INVARG, /* bad argument */ - REG_NOMATCH /* match failed */ -}; - - -/* The structure representing a compiled regular expression. */ - -typedef struct { - void *re_pcre; - size_t re_nsub; - size_t re_erroffset; -} regex_t; - -/* The structure in which a captured offset is returned. */ - -typedef int regoff_t; - -typedef struct { - regoff_t rm_so; - regoff_t rm_eo; -} regmatch_t; - -/* When an application links to a PCRE DLL in Windows, the symbols that are -imported have to be identified as such. When building PCRE, the appropriate -export settings are needed, and are set in pcreposix.c before including this -file. */ - -#if defined(_WIN32) && !defined(PCRE_STATIC) && !defined(PCREPOSIX_EXP_DECL) -# define PCREPOSIX_EXP_DECL extern __declspec(dllimport) -# define PCREPOSIX_EXP_DEFN __declspec(dllimport) -#endif - -/* By default, we use the standard "extern" declarations. */ - -#ifndef PCREPOSIX_EXP_DECL -# ifdef __cplusplus -# define PCREPOSIX_EXP_DECL extern "C" -# define PCREPOSIX_EXP_DEFN extern "C" -# else -# define PCREPOSIX_EXP_DECL extern -# define PCREPOSIX_EXP_DEFN extern -# endif -#endif - -/* The functions */ - -PCREPOSIX_EXP_DECL int regcomp(regex_t *, const char *, int); -PCREPOSIX_EXP_DECL int regexec(const regex_t *, const char *, size_t, - regmatch_t *, int); -PCREPOSIX_EXP_DECL size_t regerror(int, const regex_t *, char *, size_t); -PCREPOSIX_EXP_DECL void regfree(regex_t *); - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /* End of pcreposix.h */ diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/lib/libpcre.a b/client/3rd/ShadowSocks/ShadowSocks/pcre/lib/libpcre.a deleted file mode 100644 index 16868e0caeed684836e97a5c9a2e0028dbd771d8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 265400 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

      >4%gOPg|AR4 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

      `{;t^TtBp%TteCunxyAD2x#3Bm4i#6U^ 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�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 z⪻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 LU#XN&#R&O7wuthc diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/lib/libpcre.la b/client/3rd/ShadowSocks/ShadowSocks/pcre/lib/libpcre.la deleted file mode 100755 index bb15aeaa..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/lib/libpcre.la +++ /dev/null @@ -1,41 +0,0 @@ -# libpcre.la - a libtool library file -# Generated by libtool (GNU libtool) 2.4.6 -# -# Please DO NOT delete this file! -# It is necessary for linking the library. - -# The name that we can dlopen(3). -dlname='' - -# Names of this library. -library_names='' - -# The name of the static archive. -old_library='libpcre.a' - -# Linker flags that cannot go in dependency_libs. -inherited_linker_flags=' ' - -# Libraries that this one depends upon. -dependency_libs=' -L/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS15.2.sdk/usr/lib' - -# Names of additional weak libraries provided by this library -weak_library_names='' - -# Version information for libpcre. -current=3 -age=2 -revision=9 - -# Is this an already installed library? -installed=yes - -# Should we warn about portability when linking against -modules? -shouldnotlink=no - -# Files to dlopen/dlpreopen -dlopen='' -dlpreopen='' - -# Directory that this library needs to be installed in: -libdir='/Users/sanchez/work/vied/ios/vpn/playground/ss-libev-build/ShadowSocks-libev-iOS/ShadowSocks-libev-iOS/pcre/pcre/arm64/lib' diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/lib/libpcrecpp.a b/client/3rd/ShadowSocks/ShadowSocks/pcre/lib/libpcrecpp.a deleted file mode 100644 index 5525142547b76a2bf0ba6d2c41dea1f38ad59b99..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 41952 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 X2lvZsyV+585jSWXWo4onYuEn=cL7sc diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/lib/libpcrecpp.la b/client/3rd/ShadowSocks/ShadowSocks/pcre/lib/libpcrecpp.la deleted file mode 100755 index 66dfe461..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/lib/libpcrecpp.la +++ /dev/null @@ -1,41 +0,0 @@ -# libpcrecpp.la - a libtool library file -# Generated by libtool (GNU libtool) 2.4.6 -# -# Please DO NOT delete this file! -# It is necessary for linking the library. - -# The name that we can dlopen(3). -dlname='' - -# Names of this library. -library_names='' - -# The name of the static archive. -old_library='libpcrecpp.a' - -# Linker flags that cannot go in dependency_libs. -inherited_linker_flags=' ' - -# Libraries that this one depends upon. -dependency_libs=' -L/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS15.2.sdk/usr/lib /Users/sanchez/work/vied/ios/vpn/playground/ss-libev-build/ShadowSocks-libev-iOS/ShadowSocks-libev-iOS/pcre/pcre/arm64/lib/libpcre.la' - -# Names of additional weak libraries provided by this library -weak_library_names='' - -# Version information for libpcrecpp. -current=0 -age=0 -revision=1 - -# Is this an already installed library? -installed=yes - -# Should we warn about portability when linking against -modules? -shouldnotlink=no - -# Files to dlopen/dlpreopen -dlopen='' -dlpreopen='' - -# Directory that this library needs to be installed in: -libdir='/Users/sanchez/work/vied/ios/vpn/playground/ss-libev-build/ShadowSocks-libev-iOS/ShadowSocks-libev-iOS/pcre/pcre/arm64/lib' diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/lib/libpcreposix.a b/client/3rd/ShadowSocks/ShadowSocks/pcre/lib/libpcreposix.a deleted file mode 100644 index 8a05c4fc845fa3a7bde0a9684877dcca05e1aad2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4464 zcmd5^6+Z91#4!e(7Gel#M_$&kCIPZIfh0_17zk~EAiBh?bQOAjI4_BZ<7aG# zhJ|+SC=x20gsV{2lF^I=VVGb!}ADjjett zY_-3&wPV8uRRs#;kVn&62A{D*P@b&h&v^N=SRIT#NojJTPMjB8PSeUY@7 z?Aj`Sy!XXdONb;U{8xz@lJTdaqO3yw*wR|`fxk0Vc2k=Bpg5eHxw1blnwB!gQ?_jL z;Ew&ldG1K>E4IY`*k!GUXf-!gP@2Ihnie)=$$5vGw$PvBCn{p^aoPTy{^baN$y6c| z8y1Rkf2|^s?+bqyMc$4dk-kHbZ+Uz@TZ3DRYC4H{xSY0u+}JFfx_dFvGSOBF>~A!# zhf~^E?1e~dP}BOX{pQ%zig?nZ;f(Ni2L3ASwgn-sLE9r%I}GJ&Y7zV$*mps;<{o$p zd_8c|i#?6pLFpM(F5eK9{WqXuAARjIcU-zUqsiI3&nnsJy%pKniOTHkb}93vqU7!< za_+7or<*Xp>d}#R zuor4Vu$`UQj@*!wV&^n>T)BGRbZ74kFG8*!J|5mUN;5ZRkf$+%a=ald?%~eFXifBTTp6q zonLL~xZ|Qr<8q)W|B^g#{mANpHPVV@m6fa7-+j01ltQ(;pR8K7cnW)g=M6_t|3AfE zt0y|VQAyYBQ)W8KxX?n6);H1N5oLa@ zUd1E5HZsz+YtiCU0jd5PVej+WO-iso{=*r2O#_7{%>Ne2eWO99;OxX6tXUt{Za3C& z7uIrT_P*JReXCge)`z_B-K*;Ocy4ax?-S$?&CUhCfULsz4WPY`6d6B=Ozrm`#YxaZH46)wOL&Yjb%?`v4eV4kA;mvwk%=K zAE2-qjq0h0=|r<$jhQKo5H*hIu@oKD2i0&?PbMwNNQU*ep(c&PV+P!jF&a-DRgLj@ z!bm3Jqttg}lhq}m$A%3=l8g)*D#n{PR#T>_9*hjrkRFL5w3Mk1BmGfh)Jz<;`X1E7 zhY-q;k+4SNSoFm3*rxp7eG!PE`|$2!>^=uv2fJP%kGmO&5c z18adJK%8#g5O4)>KhOt!28cEA@;JEXdjmk+-@H5y&TTJ`^9ZmJi1W>>0&$*s;giod zFLZn+dfh;rd3@B72N(h(E>}RHDiC0`SIO&ItK_cDRq_>SQmT^Qk}gUWN?y7t-2ywK zoKq^4o60R^TB(xXcYWXjbKP=HyM79%UR0-W99~SAbH9C_IVRS*pB`m<=(mgeZ%FXH zf+JS)Vq*UU8!jhV5ANK*BV~N6=5{E}`Eq{MQTqoZv3OM+CovF*&|h1fLT8 zHNpQN_#1-%R`A~lepdLqBDg8|-vs}G;QtW3Meu^)KEXZWKF`k`$5Si#b-~vOeogQ# zg1;wtQ1FX_4-0-;_)iI5%^YJp_kBDo#BDq-7d*=rw+R0DIbgl>ypIZ=7X~|lP#4R~ zWqhKHAKd&ItPPDtqmkHh_Iz7_`95@qTugznu>zI!)YoC z{*6u(gw$w!gG2pA2?7-DMMY7907V;e header file. */ -#define HAVE_ARPA_INET_H 1 - -/* Define to 1 if you have the `CCCryptorCreateWithMode' function. */ -/* #undef HAVE_CCCRYPTORCREATEWITHMODE */ - -/* Define to 1 if you have the `clock_gettime' function. */ -/* #undef HAVE_CLOCK_GETTIME */ - -/* Define to 1 to use the syscall interface for clock_gettime */ -/* #undef HAVE_CLOCK_SYSCALL */ - -/* Define to 1 if you have the header file. */ -/* #undef HAVE_COMMONCRYPTO_COMMONCRYPTO_H */ - -/* Define to 1 if you have the declaration of `inet_ntop', and to 0 if you - don't. */ -#define HAVE_DECL_INET_NTOP 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_DLFCN_H 1 - -/* Define to 1 if you have the `epoll_ctl' function. */ -/* #undef HAVE_EPOLL_CTL */ - -/* Define to 1 if you have the `eventfd' function. */ -/* #undef HAVE_EVENTFD */ - -/* Define to 1 if you have the `EVP_EncryptInit_ex' function. */ -#define HAVE_EVP_ENCRYPTINIT_EX 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_FCNTL_H 1 - -/* Define to 1 if the floor function is available */ -#define HAVE_FLOOR 1 - -/* Define to 1 if you have the `fork' function. */ -#define HAVE_FORK 1 - -/* Define to 1 if you have the `getpwnam_r' function. */ -#define HAVE_GETPWNAM_R 1 - -/* Define to 1 if you have the `inet_ntop' function. */ -/* #undef HAVE_INET_NTOP */ - -/* Define to 1 if you have the `inotify_init' function. */ -/* #undef HAVE_INOTIFY_INIT */ - -/* Define to 1 if you have the header file. */ -#define HAVE_INTTYPES_H 1 - -/* Enable IPv6 support in libudns */ -#define HAVE_IPv6 1 - -/* Define to 1 if you have the `kqueue' function. */ -#define HAVE_KQUEUE 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_LANGINFO_H 1 - -/* Define to 1 if you have the `rt' library (-lrt). */ -/* #undef HAVE_LIBRT */ - -/* Define to 1 if you have the `socket' library (-lsocket). */ -/* #undef HAVE_LIBSOCKET */ - -/* Define to 1 if you have the header file. */ -#define HAVE_LIMITS_H 1 - -/* Define to 1 if you have the header file. */ -/* #undef HAVE_LINUX_IF_H */ - -/* Define to 1 if you have the header file. */ -/* #undef HAVE_LINUX_NETFILTER_IPV4_H */ - -/* Define to 1 if you have the header - file. */ -/* #undef HAVE_LINUX_NETFILTER_IPV6_IP6_TABLES_H */ - -/* Define to 1 if you have the header file. */ -#define HAVE_LOCALE_H 1 - -/* Define to 1 if you have the `malloc' function. */ -#define HAVE_MALLOC 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_MEMORY_H 1 - -/* Define to 1 if you have the `memset' function. */ -#define HAVE_MEMSET 1 - -/* Define to 1 if you have the `nanosleep' function. */ -#define HAVE_NANOSLEEP 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_NETDB_H 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_NETINET_IN_H 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_NET_IF_H 1 - -/* Define to 1 if you have the header file. */ -//#define HAVE_OPENSSL_ENGINE_H 1 - -/* Define to 1 if you have the header file. */ -//#define HAVE_OPENSSL_ERR_H 1 - -/* Define to 1 if you have the header file. */ -//#define HAVE_OPENSSL_EVP_H 1 - -/* Define to 1 if you have the header file. */ -//#define HAVE_OPENSSL_PEM_H 1 - -/* Define to 1 if you have the header file. */ -//#define HAVE_OPENSSL_RAND_H 1 - -/* Define to 1 if you have the header file. */ -//#define HAVE_OPENSSL_RSA_H 1 - -/* Define to 1 if you have the header file. */ -//#define HAVE_OPENSSL_SHA_H 1 - -/* Define to 1 if you have the `poll' function. */ -#define HAVE_POLL 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_POLL_H 1 - -/* Define to 1 if you have the `port_create' function. */ -/* #undef HAVE_PORT_CREATE */ - -/* Define to 1 if you have the header file. */ -/* #undef HAVE_PORT_H */ - -/* Have PTHREAD_PRIO_INHERIT. */ -#define HAVE_PTHREAD_PRIO_INHERIT 1 - -/* Define to 1 if you have the `RAND_pseudo_bytes' function. */ -#define HAVE_RAND_PSEUDO_BYTES 1 - -/* Define to 1 if you have the 'select' function. */ -#define HAVE_SELECT 1 - -/* Define to 1 if you have the `setresuid' function. */ -/* #undef HAVE_SETRESUID */ - -/* Define to 1 if you have the `setreuid' function. */ -#define HAVE_SETREUID 1 - -/* Define to 1 if you have the `setrlimit' function. */ -#define HAVE_SETRLIMIT 1 -//#undef HAVE_SETRLIMIT - -/* Define to 1 if you have the `signalfd' function. */ -/* #undef HAVE_SIGNALFD */ - -/* Define to 1 if you have the `socket' function. */ -#define HAVE_SOCKET 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_STDINT_H 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_STDLIB_H 1 - -/* Define to 1 if you have the `strerror' function. */ -#define HAVE_STRERROR 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_STRINGS_H 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_STRING_H 1 - -/* Define to 1 if you have the header file. */ -/* #undef HAVE_SYS_EPOLL_H */ - -/* Define to 1 if you have the header file. */ -/* #undef HAVE_SYS_EVENTFD_H */ - -/* Define to 1 if you have the header file. */ -#define HAVE_SYS_EVENT_H 1 - -/* Define to 1 if you have the header file. */ -/* #undef HAVE_SYS_INOTIFY_H */ - -/* Define to 1 if you have the header file. */ -#define HAVE_SYS_IOCTL_H 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_SYS_SELECT_H 1 - -/* Define to 1 if you have the header file. */ -/* #undef HAVE_SYS_SIGNALFD_H */ - -/* Define to 1 if you have the header file. */ -#define HAVE_SYS_SOCKET_H 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_SYS_STAT_H 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_SYS_TYPES_H 1 - -/* Define to 1 if you have that is POSIX.1 compatible. */ -#define HAVE_SYS_WAIT_H 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_UNISTD_H 1 - -/* Define to 1 if you have the `vfork' function. */ -#define HAVE_VFORK 1 - -/* Define to 1 if you have the header file. */ -/* #undef HAVE_VFORK_H */ - -/* Define to 1 if you have the header file. */ -/* #undef HAVE_WINDOWS_H */ - -/* Define to 1 if you have the header file. */ -/* #undef HAVE_WINSOCK2_H */ - -/* Define to 1 if `fork' works. */ -#define HAVE_WORKING_FORK 1 - -/* Define to 1 if `vfork' works. */ -#define HAVE_WORKING_VFORK 1 - -/* Define to 1 if you have the header file. */ -/* #undef HAVE_WS2TCPIP_H */ - -/* have zlib compression support */ -#define HAVE_ZLIB 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_ZLIB_H 1 - -/* Define to the sub-directory in which libtool stores uninstalled libraries. - */ -#define LT_OBJDIR ".libs/" - -/* Define to 1 if assertions should be disabled. */ -/* #undef NDEBUG */ - -/* Name of package */ -#define PACKAGE "shadowsocks-libev" - -/* Define to the address where bug reports for this package should be sent. */ -#define PACKAGE_BUGREPORT "max.c.lv@gmail.com" - -/* Define to the full name of this package. */ -#define PACKAGE_NAME "shadowsocks-libev" - -/* Define to the full name and version of this package. */ -#define PACKAGE_STRING "shadowsocks-libev 2.4.8" - -/* Define to the one symbol short name of this package. */ -#define PACKAGE_TARNAME "shadowsocks-libev" - -/* Define to the home page for this package. */ -#define PACKAGE_URL "" - -/* Define to the version of this package. */ -#define PACKAGE_VERSION "2.4.8" - -/* Define to necessary symbol if this constant uses a non-standard name on - your system. */ -/* #undef PTHREAD_CREATE_JOINABLE */ - -/* Define as the return type of signal handlers (`int' or `void'). */ -#define RETSIGTYPE void - -/* Define to the type of arg 1 for `select'. */ -#define SELECT_TYPE_ARG1 int - -/* Define to the type of args 2, 3 and 4 for `select'. */ -#define SELECT_TYPE_ARG234 (fd_set *) - -/* Define to the type of arg 5 for `select'. */ -#define SELECT_TYPE_ARG5 (struct timeval *) - -/* Define to 1 if you have the ANSI C header files. */ -#define STDC_HEADERS 1 - -/* Define to 1 if you can safely include both and . */ -#define TIME_WITH_SYS_TIME 1 - -/* If the compiler supports a TLS storage class define it to that here */ -#define TLS __thread - -/* Use Apple CommonCrypto library */ -/* #undef USE_CRYPTO_APPLECC */ - -/* Use mbed TLS library */ -/*#define USE_CRYPTO_MBEDTLS 1*/ - -/* Use OpenSSL library */ -#define USE_CRYPTO_OPENSSL 1 - -/* Use PolarSSL library */ -/* #undef USE_CRYPTO_POLARSSL */ - -/* Enable extensions on AIX 3, Interix. */ -#ifndef _ALL_SOURCE -# define _ALL_SOURCE 1 -#endif -/* Enable GNU extensions on systems that have them. */ -#ifndef _GNU_SOURCE -# define _GNU_SOURCE 1 -#endif -/* Enable threading extensions on Solaris. */ -#ifndef _POSIX_PTHREAD_SEMANTICS -# define _POSIX_PTHREAD_SEMANTICS 1 -#endif -/* Enable extensions on HP NonStop. */ -#ifndef _TANDEM_SOURCE -# define _TANDEM_SOURCE 1 -#endif -/* Enable general extensions on Solaris. */ -#ifndef __EXTENSIONS__ -# define __EXTENSIONS__ 1 -#endif - - -/* Version number of package */ -#define VERSION "2.4.8" - -/* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most - significant byte first (like Motorola and SPARC, unlike Intel). */ -#if defined AC_APPLE_UNIVERSAL_BUILD -# if defined __BIG_ENDIAN__ -# define WORDS_BIGENDIAN 1 -# endif -#else -# ifndef WORDS_BIGENDIAN -/* # undef WORDS_BIGENDIAN */ -# endif -#endif - -/* Define to 1 if on MINIX. */ -/* #undef _MINIX */ - -/* Define to 2 if the system does not provide POSIX.1 features except with - this defined. */ -/* #undef _POSIX_1_SOURCE */ - -/* Define to 1 if you need to in order for `stat' and other things to work. */ -/* #undef _POSIX_SOURCE */ - -/* Define for Solaris 2.5.1 so the uint8_t typedef from , - , or is not used. If the typedef were allowed, the - #define below would cause a syntax error. */ -/* #undef _UINT8_T */ - -/* Define to empty if `const' does not conform to ANSI C. */ -/* #undef const */ - -/* 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 -/* #undef inline */ -#endif - -/* Define to `int' if does not define. */ -/* #undef pid_t */ - -/* Define to the equivalent of the C99 'restrict' keyword, or to - nothing if this is not supported. Do not define if restrict is - supported directly. */ -#define restrict __restrict -/* Work around a bug in Sun C++: it does not support _Restrict or - __restrict__, even though the corresponding Sun C compiler ends up with - "#define restrict _Restrict" or "#define restrict __restrict__" in the - previous line. Perhaps some future version of Sun C++ will work with - restrict; if so, hopefully it defines __RESTRICT like Sun C does. */ -#if defined __SUNPRO_CC && !defined __RESTRICT -# define _Restrict -# define __restrict__ -#endif - -/* Define to `unsigned int' if does not define. */ -/* #undef size_t */ - -/* Define to `int' if does not define. */ -/* #undef ssize_t */ - -/* Define to the type of an unsigned integer type of width exactly 16 bits if - such a type exists and the standard includes do not define it. */ -/* #undef uint16_t */ - -/* Define to the type of an unsigned integer type of width exactly 8 bits if - such a type exists and the standard includes do not define it. */ -/* #undef uint8_t */ - -/* Define as `fork' if `vfork' does not work. */ -/* #undef vfork */ - diff --git a/client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/include/shadowsocks.h b/client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/include/shadowsocks.h deleted file mode 100644 index 6c36611f..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/include/shadowsocks.h +++ /dev/null @@ -1,101 +0,0 @@ -/* - * shadowsocks.h - Header files of library interfaces - * - * Copyright (C) 2013 - 2019, Max Lv - * - * This file is part of the shadowsocks-libev. - * shadowsocks-libev is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 3 of the License, or - * (at your option) any later version. - * - * shadowsocks-libev is distributed in the hope that 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 shadowsocks-libev; see the file COPYING. If not, see - * . - */ - -#ifndef _SHADOWSOCKS_H -#define _SHADOWSOCKS_H - -typedef struct { - /* Required */ - char *remote_host; // hostname or ip of remote server - char *local_addr; // local ip to bind - char *method; // encryption method - char *password; // password of remote server - int remote_port; // port number of remote server - int local_port; // port number of local server - int timeout; // connection timeout - - /* Optional, set NULL if not valid */ - char *acl; // file path to acl - char *log; // file path to log - int fast_open; // enable tcp fast open - int mode; // enable udp relay - int mtu; // MTU of interface - int mptcp; // enable multipath TCP - int verbose; // verbose mode -} profile_t; - -/* An example profile - * - * const profile_t EXAMPLE_PROFILE = { - * .remote_host = "example.com", - * .local_addr = "127.0.0.1", - * .method = "bf-cfb", - * .password = "barfoo!", - * .remote_port = 8338, - * .local_port = 1080, - * .timeout = 600; - * .acl = NULL, - * .log = NULL, - * .fast_open = 0, - * .mode = 0, - * .verbose = 0 - * }; - */ - -#ifdef __cplusplus -extern "C" { -#endif - -typedef void (*ss_local_callback)(int socks_fd, int udp_fd, void *data); - -/* - * Create and start a shadowsocks local server. - * - * Calling this function will block the current thread forever if the server - * starts successfully. - * - * Make sure start the server in a separate process to avoid any potential - * memory and socket leak. - * - * If failed, -1 is returned. Errors will output to the log file. - */ -int start_ss_local_server(profile_t profile); - -/* - * Create and start a shadowsocks local server, specifying a callback. - * - * The callback is invoked when the local server has started successfully. It passes the SOCKS - * server and UDP relay file descriptors, along with any supplied user data. - * - * Returns -1 on failure. - */ -int start_ss_local_server_with_callback(profile_t profile, ss_local_callback callback, void *udata); - -#ifdef __cplusplus -} -#endif - -// To stop the service on posix system, just kill the daemon process -// kill(pid, SIGKILL); -// Otherwise, If you start the service in a thread, you may need to send a signal SIGUSER1 to the thread. -// pthread_kill(pthread_t, SIGUSR1); - -#endif // _SHADOWSOCKS_H diff --git a/client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/lib/libshadowsocks-libev.a b/client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/lib/libshadowsocks-libev.a deleted file mode 100644 index e57cff50ffcc03741ac31a5f5aa4d1d2b6e0a199..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 689576 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

      ;`rU$mOV|Ei3;sm#TY?V> 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 R zadCLj+%L@z*IZmRI~S=K?PXlSh$9c^u0LNzth zI=b50Wq0iq%f!mM@UkL#o+!_gf4T8e)YpI-gE9RwgsO&exzyKsrmyi zU;Dui8o&9>`P)9eJ>xqUKm4QLU$%Zx*KPMqyde$W3KAvwSK@yu{>}KW$A26CJMrga z=K%hP@qY{d6ZprWFq!y|$Dcc)+yT85|1SJF<=TP&qxkQ~{~-QH@aHxicU|#AJ*k6x zqQqa+IOk@>_i0?N69Ch<3J>FTzCxiwZh-+lzzH1YbY=M8u6enuN?C7fUb)Bv%+)K8 zc%%V~cpW%>weVnBnC4p&!+JvFU)4Cv$@uSST+XurPvqhQN4$<-t56}=Q-HaU=fTZg zrvJCZP##XA0dvyLgFDg0TP22d9q5?r3i{}J1C!F@Iv;KylkZi{R|r0ecnxLB1n=ee z@6vg4*PFaw(7fC!Cq7Z*+@vP{3ypJP50V&){Kn|UEa&f_J)`r_)@g3iX-prW93Ihq zfbIIf;o9<%}bl8v1Wulxe3(wTA@$FlQzVOA}R&A!Mb|I$r!e)7)4M|NJ) zx%u#|-2n(lG0D^c>mz=y3kkGU$r)C$K$u=?>G**gHg~C_!r^NcOkxr{}uT2 zp3WBh@5leg`2P}r_8WZbQ+QyrRQ&lU-nsZ+gg<>Ru+MN`8!U1wAG=08xE)Ip7iF5n z1q?}C&x|3D+P)@YYEpxi#hr3Z zl1pW9aqX;g9+5j5 zh(YSUN91P3K=EeFHpE%s9Dd*Fhb z)NJ@+vrob;Hrz{Z^6c}a;L_%|KZfV+WWRm8$1~OP+i$~*c$(k-Djabm?w^PY!Lc=% zfxQU~uIs-JafMK62%ORUH1(vkXTKoxLgzQK19#JsZ(D6Har z-%hCTW$+Y4WnE;++L$8Y}@ zWZ2*dPsKdnh)E72M%;2He}UlGD7J-*33zRC*U!X95$k8gQ}Zz5DFf-1Qc zzPZtuupfuaiGKU%$jW6B_C7`ag-g!z&+%p31#Ej2zFfB9TT$c`IIsskw9*%}FWl!V zf-S#>N-gx;*Mod6vYk?4pIXDdVBcr6wkv$onD{l-JokV$6b%^U6n~{XSc*!shrI90 z+UPqE)EO1NIf$$9-{jv1hw(SD-5@;Xx9^68k$(Fr8#VFF`W_JN{g9S6&zEVBeII%t zek_cJmN5-!N_yB1GSOSWG0Z+7dVJaN7XKO=1bWj}a17n(xBmrIQH|SxhBnZ@y#04j z&_>@vv&=&2Zb!4s^V=T)Wjz=8?bsgQIe;$c@s*;TNojvZhe!{6&mTBqKXgrn{U;Av z3;@`}{ub0Jo$I$>fp)X)Z?f59l*m8_h71TmYa!w6O4zW%{tLKJu7~VEiQoPc3JFaf zLEEP0e}LxN{KGEt+b=`U9KXF2Vk(gG5WDI5K;H+5(gX60w|pa66HlTeV;DlYDtx11 zklYQvF(~P8!H3L#jA6w7)f$)!eG*LRRlf0iVP{ZA+Rv~|Pk}KA5FNrdf=WEa29OC} zShx_)jb(u)vi5KY&HokA|E3LD6slV=q*{EF)6-rXc70rK#6GG;L5R6 zdwkPTitmFDMg9|L*)aZ2pyU1auOWUk{wPeEf4*->HTtkGex7g0lfKMKU-Cw1Ug1ls zK=oD2mX+>5CPR!-85~rgJ?dhgFPS~_#OfZ7&Nsy%31Yx=8C1R(rG+x@fO6JHzO&~+ zaWo@zBL61egn7Qnz=VARm|*!A&`D;2Q0%wIu$TAPx1cB!?PH+NL|qmmE+4&&9P`lG zXaNa=6;yi@xY6eR&Y@pgVjBp!I6Uq}Mf_}C4+qoV68<3uCIARg2?{_;Ks}72xnJ-G z9`TJ*ZD-dyJ-9!J;TIX({vM3zNfMgqZyVe}P_F^Z%4oP&qH-hw2z>+@&bQ{jD76i zgTVd9TI9CVx6f}MLb?Qu#Av*@z(Q^NKcHZea17(O*S-ZsK`RdK1KbVSjCpM}LbR?| zY*=L^;554x#>~P0C)Y8`PL#wW9t0VfI!J7vh5GZ_KVgt&cat%LjP_Tq1?WZNMMS3k zr)$yvGVH}bkku1w-^Yx{zCQ*mgDat5EG#|br*amQ0FWwsas7(5VTvJv@5_k6=+Rz8 zj6lR-gfU=D*x>Wd@x@={OPEg{``4@Y`7le`8-v`&d&VUA0=$qX&u6B45Qk3ucFaCs z3`Ui$K)o2xU?I#KVjys&Kd@SM^)Y^oY#^le*bl9iHS<4u5XeCcNB8m`dpm{)42qAk zf)B1$<@zJ0Sc7BdVZMf;igU6Xeco6;cY2BJak2IX!cx^2uy4KYeM|}c_8h74vjUT! zM0;hA&%(71|F}*LXRkv= zXgCrq0sr;5_JRzn9K%%)vndpR9)^5O5G#Cf+Rlj}X$ysnh4TFv-cDj}I~X%7NW1_^ zaEV5p{#@+y4XTpL#3Ny1r7uOY+I zKB!dJZ*mg3{c+&8JLQekNsLKMBSM1`e!2(gb> zIYx!0i3qVvR2iqj(i7NcK+!6XtFZJaLKLC$hzd(zLy&@=_I+RwBe+R%N*gOP4|zHrgsLRbgoj zLhLI}xEDfMZ`)LO*=mHOkJ0pyre`8#`g9eR#vvr%YAC_&zc8>7NvgiK$k!qPm1Og~12r6Gi8A$_I_FN;G+{Q@d1twdsoo`5IQ zWtgHvzWYh~W*xTcuttacbRXj%L1vV{Q-zmpLrA+^iV#^;E>U6W1K2dcc6a3t6_)bh zY3d!P!cy)=KxE|!wFy?r{aYlh{7{9Z?;>PAZ>jLI{Rknd@(C4|?nDR?l@F+}v=AZt z-*^>XHWu}Uc>hV%8^dRH*sa4!Ivl0Lp*s9K>WTd6I{X6)P5g&Cyi12y>hKaBR_Jh= z4v)epOt(yj3w1b0hv({Whz?(Y@yP$E4)51tmkw9x5I#jD-+UdG>2Q(`b9I=ZL)Jg# zzKqIX_@EAN&|#epXX{XJ#rl03ACF37x=bC$>5%P(^jID8m4JM7`CL^W{$3sK*WnHw zcI$Ad4$E{H(jfvVSKov3d+qUs#c*kE?X+S%PgwhL-t5`pf%|c*8|M$L<5s})mh~>^ zJA4oL;Bwr5*dOrhjCll((>D#-JOob8hwR4rfgwAG1U&Z+*#UTe@^f%nzB_pj9GE|n z{3zh(QxCuqIUSUPKXo_Ul~x8mD|-8(Gc**5&%;c#D` z*_(;9BMyuJJfaup<0DSsyg7SIHge3~iSrZL`*A*){UXjsvXA0?Jo^OBn?qYd;0f)- z`H9eeoDYUx#Q8|*D9*=2Cve^}^3IWP$v$!i&d-f}9_K?N599p6sGXy{_QuhhMsFSs z+L*&*0-nt|TXLX#&h8wVP~PJhf;utB%K(U*{qcJ=ZuY}(Mcfc{Fg_m3<9izC6SzG7 zta0-a);x_*yg$kG?`nR0+g|2p_RDKDZuZyNPx)B!4xOI;ocIa(47m{dDG&H_ zI{q?^Pr^lyM}fxIYy1L@&((OQ#_!hnc8$NKf`)BL5JLzoPLGm<;fEU*m6R zdAuh~`?WFEUv64i4Tk0TQ0)qM0AI`lcv~L8pYi}6 zlZ#vj$fCKTW^Q5F@o!w@K#r$l$>8`eE^;8pld)ttlc!?Ia3)X0V3-t!r(wzHcpQfB zVVDbF#x8P5fOxOq;c#;kJ||tr*p8#k;iBGOYYYCJ*kyygnp3+Z5es+Q8hd#<{Z)bmEnW>JdA#MxdYssRxI)y z4ll!VUhWYsZ<8+X(1?P4MtRTZZ@OITSEjQpgnnl_j6Y`%KRlxS2XE5yMqp9PqrJbp zJ|;BsPUj!`JJXe%*L5MkGDG1J=KJU$y)`!EDvs6lT&ik4Qm+JnOc%K?yjz25+Ef^V9-ZT4$-gK9e_aXK-c(i{* zg;mcv^OipHCL)@1E=e4~KlBo$+mA@blP~=jcp3m<`EM~N_bMH$fb%#<|9L%OH<*n7 ze|wyoX}$2_0{9zQ=Y=n5Yb(Yz*9Y{55y#7HQGDu@c<@vLd@#fRG0)JT344_#g3#qF(rld3ChdN}nS=;9=Yj$VJH3yEO${Sj?jw z=_ng{?WMdj-~-7+-8u3+9wjdXzfMLT1p_ypo=IXad4yGVvNv0td<}kGUcX;#rTqP{0rv8?JO+O(JMnLfp^qB) zd(r+~dV}JV-VKTuFQ zp{@LTh1mN#b%Q-d`ns!^p$%?CUQBZ=8*!b=RaU^8g?4jXk+;2J(AG`lve5wh#GP$k&7XZO}0Wuk#@vYwM|JV_%@ZDtxLTYK+M^ ze*9T$tIXR@+$HP;{D;-3*?yb>f;Y$w)Wz0#;c`lr`K9rKOXIlRZK%VL*~bPR{7~GO%&sKY`0IHCXbH> z$OC2RJN9V#jj%xm{I4n-4uJnUw9v5ry`ueWk4LQQSyd!xxw{cAv(6k@a&m(gaZ7AHg^2zojo`_z1Jg zK4Cs1b$ekv{I+d9T4!y26J5p`)mi$g$1z)BPCVX(K#wE%ie? z`b_;k9H4$bTrqI_iN5ZealwQ;H}v<(`1EK|gFd(QUYBkLo@Z?u zMtg9Ky5{h_M^10N`Hy(eDepOH;Zqme3K&$+MI-%~=E<9%QZ{48Ej z_M~_qltBOWxZ!uQ4?bR;>_y*XfA=I@w9D?kxx~}Gsl@8W7|?wq`u+mYt3baM^v$5( z0{WLr*v+}^pKVe^a20n*PIsT$xtTU_^ zqOboS;M%Y10=7f`M~4bsHxl2Q0{M4h9K9KTygzZ(n2fSdyOrP3-_vHjF&Jk?_g_04 zTZHz3zquB7BmFVxYjkB=(iq~JA^S`x)(Tvg)IOu+^7|*p^t4p{80OFP4U8ir}EKy zJYsHSS?E(*SB}5e#fYo^iFIA$b=E@al4qg6uE}0xVD^t!?R43;cKDB=7s4TOL~1{PmO~QT==Oy`pl+b zfikf-EmOd^FV;RgyblJ^_vN)g_iMI`L710~qfb?qP0Jj%X6$k3mXeOORWHhSa@`!* zayD!_3$~pJ8()BH*^CEab7}u*pP|Nvocpm4W&6Zcc&ARTr_{O(V;p=2V@|gB#V<7; zXPv)l)-sq|%C>{~3a?Rw*-jYl^mOliWo_PZw$nKH6Yb~obb}vlAO-rRLeDhlI~01S zqYY$WF6`e*Kf9*h*$yN71=rl^0^?(XNX||YS7Gm@COaOX7a{Zy1up#bb-*8Cu2c@a zu!lcwQ*zlJgnKttm#s#)=8uTG-Y>S6A^tV=VOy`O9|Qh}IPq8uYL9{*wJY-6flnXY`T7eGtld7HcJze=_9V5i1_M1aj`eSbj7aYXi&rCq5xpbJ{gF z_FH_ z#-r{FCf`Dtm`{zv-xoD1 zef}VE)zheV?DCcN#&nk+ory8Ty7q_g^(*bfwigTAFy7j~zvR_tuP<@=u919fU#4vx zJ*#X@V9@?A1+Gb4L_1(_WD7QWWgB5XH2Y(;H^;xRn5Tq%WxMbY&#urQ%wM2y=)Gr3 zq|VTRHpTVeA=W)%_P58bExW_?|5w4&i)$R)_vWI%qa5*# z9x-j_hRX)rcRRVR0`{GYdcb=7S&wUb+lTRB2T$+EipY`sVyy{06M zc9LuCv&3Gu1J=9hPu^WSJeXJNbvf;dg~FB@n0GM^ubtn-yzBztN08Uw?vTEnWnbZX ze1Du;k8|za2%c=r$++%jnT}#zd=zdf``iKzJ)>D24T zm@fvhaUF+`Y727@>c>9FdE$vVIRg|cs|c_`CV0N;T+{3hqx zs0Ykle~(+Tzh@lApyHjNV}D?)u_5WK^AP6Z-$ESmoxss9*TC=lH1fmc%hsK!gC^Fw zHAr43Smy!E!&&Fge~vo;D9ZM|v>9b%9{$m3>V4I>RNtmfe?waplT`bpo+uaQ58BJ}lY^!bJ8`&AeN7GP|? z=)qIAPmT|=&7X{z)1Rize=tD#u`lMdtt+sGfF5!^L46J>{Qujzcq8Ul&KwCoFNu3fA?y`#-zbDVq!9L!@`TvCwCCB9+Mef1mi7Fsq^{@ZC8NPJ3Ow9rBG1yE zUm*T@#QzfUze4;?i07V^lG%7U+UHnzt@+>1?O|7WA1jG~KCU-_4llvO7ngHKC^VRmGwD&boH#iMyd58J(7KN`FSBDD#)fsq7UI-!g)`_10E=@<%%Q z#>Z_SS;fiE_H^L;J$0+(X?aImOFsbvF@^9+m=*L4FTID456!Px9D?(Ce72~Q-pir= z+CG+u%nsJ5YrrR)LbV~>bVaR2n(UIC&dapf>uT{0uuw}=XD6*b9ko(2;XKFwx`@&2 zjZIwxarddu`i{1CWZu%y*;%^+O{WQt=VgIHO`X!UeIb0vuk4aFpcFSx`-EuWys;tm z4IMU=NJ~c=suN$v>1z9YW{Nb9stc96e>-bx#Rrd?>O+kUwe|4-esxng{}Qdz{BZbSz)hOu#fML-wi|4R%V0$ID{?#|tK#DxDow)!_3EsqRA!hOi@{1$Aq1 zk4sWb_KiVcAem;4&mZ8&!})bf@WZT+k^*vyc)ImArnpN z#VrILM|4Q{8&QW*>rO}0DgzoF;6ucyQ0U06GC8|esM@cydH(d--K(?N;bvz*lO4U< zMky&jCq)`RC&gpn;%?TlZgH2Wcy6pxz&?Faeyq#btK=~;W0pa<%>N$mbxqkyjPP3 zvb%}fp?SO_X^*wtU=gL^!%BUQJvzmHH^VYr_;MW%pypxC-Rq_@V4iEbP@kND)a$rL zSF!;gJwq}xrkD?RLm>n5<6}Gq7ywIj)Ov@d-{`PgM?DfSQtA(Bu-7H=L9H7VU&{2CFmVT|sq~57nXf^{sp=nV2pfHGW zUJp-ZFY5S15o!6dC66*4g6%^&8x!IYy#L3;5{sVGpmF(ZiG>F>>9E7KWV7yY4>)~r z$rBnp;F1n%@Q_PV`M76ONWS^U1Ew;dsaTY8ztbR1JC{V2#67>Og?#7=GvI37ItHxg zEjkkWGV*{D28>Xm*Ud;nd|j1?8GhiYv`hDIqbEp;$3639S9xgT!@C||_T^!mui~0g z(qGbY#pIqVwWJyyLT>}Qb=719@#SD11GL7CTEHe9;$m-YH^_4i@zxX9C=u@Y0Uc@l zNUJNI!HgEL`T;kMhW6{E&+8C+E!B2tbWGE)FCWp|N8MBgG}arijyGzNn_STbJgP|p zrZZh+zti{^MVBO?n|HC(%=>9QRY#S$EC$@9Ndx9?`q!gwy6D{B(oyfaECw_+KcHwc zv>OMt=;#J)*YBU;D!yKW-7YCwflM9s-=#XFTjOE3RT|I;L@&@C(#>*=&MeQ-r)stWrOLw+jr|2Rx*`LRit6{$(seh_3m{e~$8ul9! z`=|P%N#&NSU#-5VYx7-4aFeUPhIEu$IaLNUl{8>|_3OaJTF?$1vTYi8x08Rrbz6;& zax?4Kq&^2rN}?(aKU={ABc%bm98#T%bI<(P1&?}%rQU!h)j+evjhg*ACs~yNck4ZA z%z}?-(D*(EN#*9Aji5Lu)j|ViYLeQO;MYQU)VPcWtnb6vuCZ+{qXCU$9VO9dHzrw0 z#@J@Sdo^j`4H2WWDX}H04H$AVZ7>Qqx+J3-zpTPz0N3*UWiK+aH#&mqjOwmo`&Ddz zK{ZB@c|(#OdxJ`obRBY<5p_JTtJvfvFZ)qE!dUoTN5?7y8l$5#^jpZ9Y_~YsR~c}d zCb0^twi|4Z%V@y2`Y;+SE=8$0z&s{hCn(dQACLGaTEn&*yizCiiw%+-x*CGqMjm+0~usmtDVRYKr2;-De)?O9m|0B({L+?Iy?P9VMy_ z7{}X98F>$}kx+!45DRY$pO_|YI^4uaQs8X|Ua_qvD zxxtKmkaA41Hb|FNi!`H`se00)b7VL-xL9mzE;L{zUoyafdGQhrny&&3FjY2!>K#GV28`68|IVF>HQCu>L)G@^3?)&iQRlrT4piEtu@lN>`MzeelU*E1PZ(BL$_9~~}KG*5DKOZ+SVqDkY^!pu9 zj*_p?II>~Vej`etQ zr2Fw;Jl^P1-pi*V4!vG`7{@MUs>28*&0+MBaVV$g>B{qWhVlbGEC^90sE^^UFOLtNLy8S(< z;8$>!23HO%k>N|A6rg5>FgF9*+#`$$muX&KEKN z1Ur*hR}Qkx=SzGagW&VV{M*De53*-vt8&Hg#_o0|XdPsm?~?=`20_{jP4H2`Nsr@{ z0#18Y@<;@Y_N3r=gkwl57QqgL%+;P;7+eqdT-?yJr%Vk#082^wIb}g^*0TcbspY{R z0uEs()SgxqJb?{BTGT#wNw5qfk>oE~DpGhGy#RmDg;pxVLeC5w5jRJwk`H7^bT?PQpR1yiL8NEHTt-LgTy-rG-V~rO>?VUi= zGxp+~@hne_682L7hb_j*rg}D=b*3)EDbG_Jq1=>6<)&B>%1yB%l$)ZJ%YnH(QzDg{ zVuge~4rHwXHP#xGftoZArwyQauTQ4Er+Tjr@}~JtkiDx#kWQYiLR zc$bMF%_`wKZ;%E{La+AL2ZC!LU z%xFT=c!0FM@8Ix4-($hw0o)3b?L z=s!yj&Ie2#ea~kG`C5?V|8*#MIp9p>@B3|@NV*roUu1sQXENUFTaZQX*dl8%3U6g) zCuZ?mMM+sNoT0vvaZ2-Xx0v#)3ct% zIV0;0oQGxkq5bfzT%0qr=HQ%_wH)UWSvTUGo%J1@Ls?JaJTmJ=oJVE7gY)RD*cf!& zEPit`C+h;7bF(hT`K+w9IOk<;!+C7hZk)$u9l-hQtiR(tKFb5EPsqx`IX|lu=Yp)u za4r1~BIMspZdvq9sq#3|BkTpAr_eQ@A5Y8O#CM6IEgCfVQGLduz z;3q&1Wczp;uMkDNuWA24-A?Vk5drc(Ytc^ zLGP8p5Ws6e@-~ZLKH!@Pw*-P;0DKSO*2Ex3$p>k>wsg0*w}*nOKxcuxSLFrQ1D2ht zqfmBE33s*!uLqr1UG}ucHw(DF8C_oI>N6e2LA>4TEefT2R{LP zAK^Db!B{9n%lh6d3=RV<>2FPyJy+7-DGz3W&QaX=eibeoNa*DVkyH-oYY^qTCsU3+ zzPqv?0(xEc(>ROl7jU+O-3YGqj5Rn*vuoS4W!M`)R8`|f%f@Om=Ky(ROG*^>_rRLO zm+okM@7Sd008RloxHMFaKzIh9n;2{Z^goCgT%uEt zyi7XFrI%8ke-9FLFhRcGqZn*Q__n#O+t3| zCCOz7-nAFH6XR+ToCjJCiexV;3@!&ubK5mb-3jyJ`d}02KOoN+8iSl%=K{CCbX24i zfw%~Wr^-rYSm>D-Q6wx;+zIgf$Rf>;EYf^kq_07kXFleb{1`jO03e~Xut64Bn1tN} z9$i@8Q`d#18mS#%>`r*nO4|THHovEk|CfQt=J!)HzdM1P0B^#6%aisEAOZXno`y0{ z0~ki+87nbjx#AZ|K~NvW-=FUL5dvSpZJ_P&=|pSsx^8pPl=^F&5|gjC(*6v9IwY@# z4zB>A4#{hv!#{xVu59vJ=)f(K`-rTgb%6Ye$a*Uvl5PR?0sg`4q^}`3iN8P9$9t?X zo>Y9$L3ooVSZR3xb|We|ABrUX6i@*uDcQ2|O#|p3>gtP`%m095l+6`g@_fW*ralz> z5<;q)`mhMr0j8#@k66Jrz*IDKmnXOeFoman&l|i6@I?GmzaI$x!qBmAn!FWAV(PZw z-3aH9;XW}sG4<;~eyhKo_}wD-eT4i*f9gFV_&CB%gzrTU4p0SsNei&-5)Oy}vz4${ z*k1>?m)4dh`6IBjZ2Nl%Qug8WSNuJtRw~0h&-93fSQ6O~OClR$Nn}GT(G4*fcketU zkqxoL3JH5C$hz(ECb4dN%y|q7AdgHrR=o|9b(LHPqp=BbJ=Vq=Pgn;0M&g|^KF1`j z2OVqffLx$oE!W&4XA@K7sKnoi{Hk1^i`?QQc(#<$m>OHvR^eIJLTln#R+V*;$gM); z>WIin&^;T#w-9-#w2wqYyJ;t?w9iLGmi0-S$Q!bUbadi1K;F`b$g^RVgg<&Xgh=bS zCowh_ar6d}@JvKJrz{z~0Euy_h#UIXj0-7j+;Ad?6ms@RAl5DNGBCctfhSBOcq_?b z4DHS%fXSEDQp%VgEBikT>JHlb#}-A$$ADArdMKQmAh$Dmk7Z*&KcNiK4-wyM^$`C7 zaPGEP`=q#pFJkoL%`p?d1NiSE@DL{KFB4b%Ip!Js8sv=)m?MJwB-V4*_+khTA@L6s zj_o!K!`!goA?w@W{-xr^r>zwCFD=ErUvsA;O!zf2mKOP!QgjPI!9%(3%%dgLK7mdeR)*{bsdFU{xc{FSrcgoQ#5G)kAn^EQWI($`Dp~(FfNIPAU z=eCf@U4Sje=N#HXYZm38Zbj}jh&kxQRCzX{&GX*aTbd?wFs~dSmC2z@S0#Iz$>CCm z7Lh|Dd;I|&lPmAHXv3Xl)mX(G2j;PpCyu2kcKAg~GqRc*by&f_(3=Ra$_}#!uK`H0 zQ=`P%iQfwK<5r@3Alf|fuLLPeUh0T&%Gv0WoN}&rXw|S6@^I}bZFjGZmui`(_?;q5 zVggpADy#?AmPS78NOdwl>XMwyPdK!JGsh}I9y0SXjhM_miDQs^q^+Io>m61n`*xS) zWWUj&4V=AsSwN2G`yFN$7LAQfA%b=jXm_A4%nK&EE)pLE?TF?RdDR#k(-UMLmE)^A zeS#j6aTD4))_(xK91N2$2Ww&a9l;d{InJivDT3_={;D^)*1%s21aCC(U2(zN0XIWH z`nJU2KEPb(rGGs=_zS?Lae(g*1%C&aBW(IT*xI@pzZ*|2><6 zseoh2bMF@6>qcUqCwU8k#LP>BcOjJJzf1)011!^Aj`{Adp`6-BVNo#u?SrdoAhWQK zF^2Nh;#NX3CMgxfUqEQ)!X&O2ehV<`LOTakSF-9wO49j=8TJmi+-({=0=BS)iJ~O@ zK4Kokgle+%C*+`JL`8Yv8nMWU5@T5lQ$WmqOm$zG-J}vw(&McR_7qWUULjfn#A;bG z7We#C;dy~S|qP4c!R27qxcP%+Zto2?5e&C1H6mglCi$%tZ zlPTb@lSNDT9n2_IyvwGF2?rrRk@D}cxyPB1AAnYbrQH&qfjxPv%3A5= z-KvD^u;s(sRn|jZ&aD$31I}Ak*27*_UIKS<Q#WWyt8 z7Bb~gg+B~;;u<-BJ!s2`)>+_^v$%t{nvvowA@Zo~!+l6`hYj~3#hvegLiMl(j}rV* z#-svk$qQO3$ydBelOre>kG|aZC~hwd zBDwF;+?#Z9`=-7;cxv!a>zM%Ii#sM_hHS^3=Y=}PbpPD0Glk> zQ@UX5p(T&L+|MZPvtc92{fy$yUj{wQD;t}T%KEc61RdKzF0ks?Atsq+%u=0LJ<>xCfB&bu6KHjmeAHoc#697XTycjSVzfB( zwp#9&puTxKjVfczkaO=t2&y^4h}fnljesN*CdN!<}7ELW;LH^W+7%X?q9H14 z^D0$@@wYg+L>Pa!LyR`Q>AteRz3Z@5*@)WE#26`{d#m(A561;f9xK!gUej}%A5IDJGEeFqZ_?*`5t zGDf1C%Xz!7c`tVCE=2tV|Ab$Af{F7Q6ei2rZ~m%~L856pDnVsE*e=2=!DCL4&%gDyOn zYG&dSOf}Y$$)@U<$YkTK!!jA3kwL@wCAo)K+_%knOLISp2=2Yz#keF(&bzR9{s)bb zY|R-DR?bIx&~QedG^J0@dL0*vh#Rgm6**iL@TkO}naDZIbhVXKj~wKMX}a1<%H@Mf znK}U*SQ)p5Za`bB;%4eX&qnkc^3=OLp2U2Y=_13#CTL#ih-iWjIO(vpgUtzEp7uL5 z)dHcTx;mNnK61}Sj-1%@U_b&gzOgw+ybj(K_W1j=u<@cy;6%y*8Qf-m#Y zD)A*4B(7kyRd~V;z~z*@-uE2Xa}EOMQHeiVUy5vfD|~XE`Z(fb>s#TI^VAFf2(uP~ z(YnItoBTdv{|W+jTK|DSjjQH$&WI*;MCSmK+|6f`60*ao%RBcYk+Eu0=AF;n&{*^( zhf7}DCW2J#kQRD2V04`g8jHh&EsuMMY9o_-OXWI7D?jZJDM z>EDs{T0R$5ZJi?*cY4)#j%+V#r8iARh%wzdAMV;(EmyPJT79hGc-}efp!r*U7edAO ztAJk{f$sw@S3vDPwuSh2fy)(8yN@fN_*@KvUnc)bC6At=`G6X5J`)&!J8(V}XyTs- z&Ibd5GrxrY0GF+2jgPG-fp;gqLU}hxc?nklmn*W(KK7}EZvvOA#oK&bEy{%e@8a=5 zCl}VuK3{>=7_kuGqP<*ml#$~$AEx1ratY7Z(YS;cvN{i+^*u`N*CuG%al2ymc zI44&rZj6~+6-SWdqwco|ZL4-}y%sHWxAy-uL?X2YQ`V#(*B1!{4C=Hxb2%HBmJqcMTqO|72 z(wfQ)<}FTb2DadGorq@Orm~uFvISS^nA~Gf=~9;sGYe6)gBq8(;}juL^em_&=d<=B z_Gsh|o*WB{euMZ?H_22pP^Id&mCcJ-@=J(HA2lxc8bUIU8ZUyp$Sp_YsKUVL#8DH1 z{{p^|c)ke6;4=CW;R58A{4Qd=qcVb@BHTvm2r=3_YFO|D@Mnk*7r|42e@i%11Z||g zHU@AOQoB#~ctwEE?8>{S9+4aiuEbFzrPQ~X@+{n^9W_cy9Ww#=XeG6f@E9evgm8`s zrXX!O;oLqs;GVgY1Mb;U2Yt^rz{kXN&PC}+J@O)HD0z}5RhODkh#Go=ce*n;qKj$f zCAalnHjZhCwqEkY{~n=i952a{Cq5rNPww@+nDf%@fI-gguI9P^99{$$r9&B#ZM_$WvxUbEl27f2}a+UpX zSVamf*V*qu4m@Vz?=TNj%-am}FvToaALjKyJp}Ns9jlE8J3rq2k`u4-4$Vyc_k$7B zGP&tSZnzD=IuSMRk>ny)~cp+_boU#MA{?7n7ZBX(pVg}78% z;QGnu#SnLQG3H7Ofy>eM3OU*)d>ObLU7OYD`fuQJ>fGt!E)p+zV&Qn;n|5oSrG0 zmjZK>P&V`SpWdj$ET9WUi7S)l?7LWscwQ_;B+W$P$G|!|TRuJc1VH~X`3%;`b*vXW z_se%ulCA{bIQ0K9if(H!WCn8Y({g z3SNHES@RYQKiQu8gXaAlDf9~hI}}&EtuKX+J&zacNWZQSk=(n z*51%jP}N-9wY;sPrL&-^su3SYUa%-1YD-cC*P>bTT!x~_`4jUy>#r0hg+usXvq)`6 z%ar1R&W<|K8RjRZMO|ZUhq$rmyrcxRW0z#|dS)Fv8Mg>iwXS-#g&!Ov>CG(g^MOm4bPr=!GKZICY~;8;^Zl(i=x1p7tB1Jz|%xg z;Ax_yz&RHnIIYan#!9iLjg^vXs!uC+;3z3`;3x{baOV8e2|P^{1r883bH@DHm6da6 zoUV%8_<`%miKqMls@RE_X6RpIZam}n#cZimR1<{0=5vG(J zku6OU7S&YGp5YEoN-oNU3sQJlQ&)3CtDr-B(X>ikNS8O)uILoYnlWurgk`mz{R&7L z3fS5Pmjhvn-~}0kaJas<1HR{FO5n|Hn3DCmXfazR=&D^I!uwV=Kt_`$0;|Kkt_yNV zm{JUaRI z7xirxvu4k%zPPH!VVixC!r>bs+>R3`D)8drz$;tZJKE~t|DmBChVQC{6t)U?Vd z2TO?BhEBBF6?H9PVru3Ru7wWq7TwyevDK0G9+H0>`37*E4tyhZ9+GgDjM7^p9 zL8D8P6X7;E5N_&fXz4`rZEA*;HqqYIQQx$DxoJk6mo?Ql)Ha9F zj?oWLF4hA&ilVC2O|1<`qO$Eoq=L|iRz^qCsw5ob`)r@Kh&Mcoja~_#zv;Pp7v!GfMW>(Ig zana%`l4dNr_#!EL=Hf*)3+799dcP4X(HK?FcW3d&Y;2)j5s1*UeA(FG>Y_u`GP)hU zc|`4Ufpto_kEO$%U2X6n(;zxKmE}5(ox@>}&}WM3f{#?a12E~S`WYHLEM!DgaSC#@V6$-K6qqb*W{DHJiq z=rAQhi78488NIx@4I}K?6`O8k$Ot6|rcF3r|AXnZC0Q<7K$1UJlQ)RBo+> zIf!6vqNgMbEcAO6)((?&fGZkY2g%c%88vKSvI)RDQMk1Y-K)I`ODn}2#u~1z9fP+L zr`L;GPK2u@!4k>x)i#CI#gTyOO@Np}uGj!$@a<}=YikyOnT*|)@d%~0&Bf6nfe${H zFc|U*tP?Sm{auz8*I|sXEO%E6e&NoBItDFh9|#)TR(43Vz7}I7$Ze9mrU8p+pjT`1 z8XY!u)?;amh!rheZOfMvT8pg%fo9yXTxQ|`E1(4s&1Q-Uhy^;#wQu`|NX0PCiLUfbby+0-7KpfC0gBYEZP{5H&!o zAkYw!U;=?4Ne~1i2DCx3g)6qSr6sMj1qzmHV+F+9w9;N|ZHtv!ZcA%ysf|Lfh_r&D z{GVrL%|0h52eo}~um9isPO{H4Yt77>HJ^L-?7i2XH=prv(uS84zg|R?)y|u*F51f~ z>gpEOfL&2r$57OMCE`?7Ewtt@sjH8yCTK|VZd{flV&gmuGiJlma-+r!@SsJb%4)It ztwo%9wF`AdNRD>LMnD6bfKAPApgv)xcN&xeoJZXjUR-rIR8f;3&yX0mi?9Nzt59=p z886{g_vVjGlnrP+wN~P(naOpx&7*p#=8DA)wU++Xk!u!1Pqi;mQ-^jc*M2tPQXx?ge!2--DB#&sg_fgbv3O$P z%XrpPClb+GZFnGNW!3z0oDB5_h?^2~-4afWDo1#EjxRHtSNc3&rbm-LJ4FRmVkLlv zRNpdkld01%7j=s{M43SacH_!wmdFZ16PE1iSv5;6Jf9>{;48Bl$61Y-M;bAIEF0^F zfPw1|B^0|ei?PJROgy%1UX@xtsrEzXHWR1z%Q@0praSThVp|0M-z8OZeo^Rsr9o6O zU24pe>NH!1^DLT>UrRGese*}us(gzY8YK*=8rXrcKc{9vIZu{js&r343^3;m6^qlL zj$W=#fc(WtsGQ?ZpK;2rufz1ZMAc@5j%8hnTQq%Q5pSmR?mus_@U8h8g$IyJmgzpASAUEOq$L zKl{YOEeG2(zwfcWHm#}roA3U5{Ln977wq%gwCmnIZryZGd&caea z()-x~;O@p_3#9MGok2PpPa`eKE%kB-=*{Y3bIan(DAZ{l9&NbqYIxvIN}8EW2*;

      90%hM22yS2F&qbr#QI?vt6(gSYjBJc-gv=J0Qt1c zCvi-~!Mo@;;$XU)fFT^W;^1Qg9j_*(?|A;n+56{=>G8V}2WG$Zh1TVtD5}2yV0q7} zTeEtvp3^x!ZFS+D_y7En2~Rxyr7^GVS^4XCzqMkf_4u%rOJ4nTzui~7p8fW3?5ZBy zI;N$KY-&j?^4vdlM$4+28LQ_tX7@k!`J$E)uV>E+o}ZcNy`iSF;ms!|H{7xy?Y~OC z*Xw~{v+6e-pMHADsp3;-oH-+Z|Kd|$EiOEre>~-MZqIz{6MvqQnzXFVKHhnweb4K6 zJa^xw&rSaJ@1FYAi(gNDqHJEluu(~^kDNKuzasn5Rq4-v`**9JUis$xS??@->6Lr$ zd0@fgEC2HNf39l%_Rr40kX`ZFuYBn<_20Q?Qp2xL-;tW)PxO9z_z%B--J558pL%ED zz_R+c&&~k7WZpfq%Ep5Qsv&+0ao_Ofgn+IRqaMQqdpYhMG|GDp* ze|WOviZ{kwT=MoatH!+B`@O$>H7@h%5hZBY1vpmY*ob2nj%RQj!GVvZTQs$m>cuTV z95l5x83*5BuEVh&2Q7Pj7sqorj^lU(hX<2jFB~~IK7r#F9OXC~aC{cWmvQXD(T?Lq z9IxUyk0S{kEDOhI95>?N>k$ia+>2uqj_o*}!tqlazsGSJhZ6@w3OI6cOu%s~j(Ip5 zakSw03XaEd{1C@c95lD}4vu7WkzOZA%D?7L&-@4;_U?n?e*x6GULqAdZNn?H@+wb50VO_BqI+ z=?Y=d>=;>m?rR7TZn(^Xw6P(vXw!O#9dNJz^*62g1P zjLgT8M5KD05v(aFvBXkV3c(rzA&AAZlZ4QU2GjHTElE#fjAZd%x2VKN9myJmt|_r- z`-m)7hRC9QCbDR}MPl)VGqU(}yvX9MZnAg>TwAhESj++ zi$(^8#h0eZ;=9zsqA3`%Xdp&dG#*D5t;q?C52KRBXYV9O^+X(4v~DBCrcpb_;sXkj zkOoc3;^|Kkz9ri8@m+~UGc$}un=>Nos8k`%B}y#5$jn%Lt65_GOk~lpj<{;v*o8#mBrQAuaZi)e2Q579YhVi;sK?i&nJAq6sNs@#SN(_)fCO zqFp|+XsAzEw2?;^AGj12txu74eRy=xN)lOo8dAjb8CA0Qz^brl%7-l4`4JXv?U6;} zdm^6ClAx|FTDJm=CZ{Aa?H)2R%^^x;zBWx3-=-E8%_5S;=a8hnY1oJ?8buOWv_D1` zt)odoP~rw41pjF1u8w><8iauz*>2%oUXzXy9{Hwmtn`tu31EWiCZ7X? zbFB1{?+C?8A88vnR{F@NXJe(0eBLWodVcxGYyAdoZQJ&{Daiy@DGvMNdNAdG=}DaY z#`>lC_-=P?V`Wu7o`v~1vaMfHpI^ou%=(Wb_kTR+QtSYzn=A5w)Fi!GHDY;1g9%a9 zipRF{)ze@3`dKhj&mTuAQO6%gw%AnT9@xj2_1KRg?~fr%jNK*Wmi3{}_hCvKF(O|* zP$<9p0XQ=SR4p4(&3W%b1bsjpeOFgYK~{3lIuB0@=JDx9lacWA^{s0iT@OY0ah{bM z_#iN2o7;$>aPmY;_lcrsFod+hGh1W>r4Y<#BJE zPaa5d)ZGQQl4PG5!ciP-ta9b1ob#r~_QfXz{&KUg-&?)`Q{*=}5OjJp`_K5N_~M=T z1HOT4r%dr>Pw_?YEx+^YRn0!z?|jekj0F6ARRDHn{LWKO$k!*qQ;>P~K41I;Pfzh5 zz_%q1t_nfYAq3IyDMhA!=dg3YAM!iNIKG4MY`^ncL`d_8e8c?@_~LJLmNfehgq){V zd5Udc0`fzA#BBDB^gDlaJi~3D4{ zeeqMAZL0$fz9baHIpGO3Fcp%dt@S$_R)w6iP6$-8r>Kvw=M-N?pb?=E(d?{S)$CkQ zfhnHSjL48Cgfw}XY_OBgVvS^qkbmthzWDq7&WV-HzMg)k)!R%}osN|uR@h@+WbOQZ zrDupub@zEgzP<@>`Fv{wg?^})>@V{9u;=5vf7T(Q~aTj z^Sfox!0$W{K?rYy!pPzG2_ZDbHyTyPdN~2LG1mFny@3o4|A0%kTNH`Ufh zmVxp+Z(AYX&}V!}{xi-4YtFE9J#2^2(8%~+Ri)0;@u8?zeRf&1^9=Muq#rFqTR8s_ z-|S2AdkVX>@DC8{hm7Ux>%4l8rxtDTw6B+ENUzCgB!6In|1EUzfqv)PK2$S?NS6edC(ouwV(F&e+JDL@|B2pA%w zq{Y4hPib!zo*nY#vWFqf*|pC4H5fsVjOxKix*z^zzmvks|0@zd!pe7gv*P{EFPC8) z`kg-|AZdaprx$vfA8L4tdtqR{y`q_c+t5FUU~Hj7QXa;@)7s;AzJi_%DJRh+e&^9f zJ=FgWVMz&|!gSw&b-ws#eErw@dO?T5C@nF=zn(>f;CC9LT8VA_NWvM^>FyPf<$F5Z z^#?k?LD~WS1IT}1v2Va+-=JH3z7k*7K_oik8{F)?+@N&Xo`{~~8PeM~0D~uKEkc`} zmk?BdNh0w83epVar}+A-GN@^Sg<9+DyVf@pIY5JZFdQGmK>P8sGroSR96c~@5ti&n z!*N<@x|b7-)9k@CGG*;L-!+&mP`l?>t3LK0U?)4Zm~9aC*Q;4_XOD?GPDlMkIO+hW zq}kV74HV?!T%~5WpRDFU#B{aMquSs!#Ps$%n<&OJB*WLc$(L4)ksm}i8$j)$-gu14 zzW!#k->|j5@%NJl|5Z=>(r!VUVWc~KLsNW7fmi*`4@nDw6)b|(6KZq1~6~pF>tI>A7 z{LbqhOyOTZPN>trs+=BS2y*(J58X4tGY*~XX4S(`=TA6dqt}Ip?6M z-(BIURMXHOeP?iTVRvs@Llt!2Fdg1`#BTOGE%zMo4MTTF<&43hM(W>unNBMEXUI1Q z8lywK<-%8h5T2S2qOqHOS2X)_ z(Oa8+IerJfXbt}ZYgynoFwLX+{w*%B8?D;1CU649K!sbLNnl@CuEz99oL)Gld+RZM z1;@0{`OT`3XLvfskh8<_6xt{V)pa)Lf&4dh4ti*1V1mbs3w$mH_+hmhaQCnPI0+kV zBQ?&+0p1M$UTlqFYqOXyW&wlSfwzOd6*vRPmorBqe6z-23$PCSG&j2$2QjNi4AoDK-GXEh!)}*8!xw;~IlU zfs}U`NO?PetZ#l%6ByhKoDcpwAoE!cyb*MR&`UH1tAUHbp9G{H6M)oX9Pmn{E6^Cs z0aA}lAoa-57)%0E4-P8o(TPT7y`IoG=Qxn#;h4rb?LhWZ-Vy=M*$Cu#s1<&-@Mi!k z!7l_(1oE~$>pw?hZ~$-#_^E>2+`adnUp<^rn)#{q8zJsimL z977|qzK;M|-_HYwP@cx%K_Kg!#!Ok?J2VDcfvoS%z`KC!fUNH(jdSJ#S-woceQ11^ zt4-saO5o*?Hy6nHVFoY+ECzDCO#)5>762JN=@vi&+W20MWBz&{GS3wRJ%f&BMr zoU<3W6g18L0Ozy@%H!q&8F*pN=`U#E$vcJ<( z7%(^zh$$v-2$1!XsWF%eq}~>gdeb5eFv!PosCOrjdh@F-(}8<|c>JSyx5i*Akmr*o zAnS*phoN2#Ks*6cyhLMgHjw!g1DQ{e#$X|k`4j+|PX>_fnW`~(0XI|F-n{Y3^U5(` zDey3GD)1n13UDtFQ&KT4-~fX~zyY8qX$(#PqAL~id!N7{?`YzQo#G)HgQpU7e>?$X zIgSHaj-x=RQhY>X@F0-q)4f2JXA6+!*{m_hZ#S_#O+c2X63FfRsN0Ncjao zs8BpoV{ibF@l%16e-2wblz&!Z@Dz~pJAjnW+lq|Oo3;ypTLo7EIeumf76GpTeIcOx z*Ex-IP6OHhJApR=JAgbt9|vM7ReVfi@CcB49|lry-k|J@@OF*CHX!xg4y3-V8iQMa z)OQ1r`Ys1j&JrNyR0A^+zfxmx0eGl7vqHvR@AYQr-X{mGX$(#P&I6wh z%uvs4AmtCxIH%Lr+0S+WS>H`Sh%R2GG1vfPILfNR`IzBn;2o!N4#vFF3+EQ%9IHU3 z_rG;0D1Jf>nZ31V;-F6igF5H%iMpA^3veGlH#x zj|e^>SSvV9@J7L_1p5ej1>YX2^ZC8tA;GYa0 z)BjoUSAzQlzbUvzaE_sKb-F%+@8xLvHNlqzpA+0GxK(hy;I)G1uGHy&cZJ4-f?pL} zE4WN>j^Jd$v4UxWe;q1v1ivQOEO@(Mu3!(rGedN`{}P-f__x8LpWsgfzbCj&ut~69 zaHilS!BK*j2__1@eYxZ-cu4Rm!LJIo2sR2%7Mvh>xnQ#3JA<^`BZ6NSY!Pe}tQIU4 z{FLCeg4u$Jg6Fce+>?SY2tFnF4Z+U~)(hS)SRi<%V6xyjEb47cy?+)wCiowMI|aWW z*eF;nSSonA;JJZX-cJO#2rd&W75pm}?acQFf|~^I6dWTMC-^=V*^K`v7SqI6uxKRi z6Z|C>Z=|0V{I=jDf)5DJ7n~+|onVGwoZw%uXrsIr1=|IceO~aD#Z2G=;eT3CeY*hs ze4)Acqnx8S5fFC@ZWU}6Tr4l|eL_ykoWxgIk?l+Kr zOt4Y#Q-Y7D>F}!r`Gpt8znH4=kAlw%eoOFv!D_(~g8!DN&j0=|LI~CY{$>ip|9nB7 zx9Qzw>F~8c(({GB4(J7qX-4r2C4RObnT+2d;q8L0f=z;R1q%hU1pzAk2`EQ7UMDpp z)9Z|zP#EV~)nvzcp0|(Sx5GYRd!5tvS^J#r@tp8HC*Wyv);V#Wqs}q> z?soP%0nb)%t2fSb!rO`8L*B#q-R;}!i}P&v?eHPg*NWebzRlpY#BGR+^K1@m3B-A} z#<#|MozD1E@u%Ylg6s z>wmDn*V)~FZ~r#n*8Z*ixA#X~4A?Lr&ePfd6nIAm92;T&Oy!RoXR;3Jeb>_dnh;HIg#6m-($JQ zbCKV$eZx>A!?xhJY52O~DB)EdSAmnaB`?miF0Uoe_FNdg4*m8@N0#BS?E4O+nA^6__cM)e?;iB zLT3s6g3uF%eq87ULg$f&j^_E(`IHad63LI(fsyoL=$?WJW)jXvbmc-93cbweEApoc zos07e-FVgq4)eSzP6t*B=7!_nR>2lOm&kDQyy@E#K6i%>A1U&tiM-dPJl_@iF$q5; z`3I$Z=K0i{g*MNlZkO}{oCoRd6S_p`WRZ8D$p23XKP7aBgnv!)dzbp7Jm%xU(;$;{ zivr!exuNzmvC-Q(((G9^7;yW18E#hQod{nH~pQjBC)@i{_$JV5%uvD z>4@@fCXI7t&KGokuK;?WPK^7R(B^sTxronj^L#YNDQWY(^AMrU^U>D}ZJx(oN;*RS z8pw;t&RP;hk3?W(_%QVUNP1ipof$>H9Yqg~lK*m4ctTWo|0w#aQSmwsA36BIpQsD^(uY&Vi3w; z4{RxnpgjcyMH&&%)(Bj~0kDJ7#UMk3aRzON5sXNa4rS&oab@K}-Wac-fg$9h3?`IC zSTmr}1k$br1xhovB4DQ?!VZDhH8A<>M@eDBB9{AiIk-hp=4(+Lu6q zlywN|NR^eH6V(V|Dr`j|oTWA*!J_aTepN!&i7K_?h*1EV5DFW-5IYtqCoERLyjVr` zLKsqkAti8hS0Rg3JOo39CGRq(pCPo^B z5;GJ+iMr4@%gj57f+wzR|94)JV*$bc09bUp+QE>_&~fdi*tGMvfUfE<1b7$WaIwJ(8iLMvfd? zPylM&=ux9p^tlOqQa)@h7?T@J4wu!I=c&nSM4giV%Xj|zev+I*cpkx0%;G&BD;ozK z?&VoKu%5Y;dw8A>;e8@HLt{zC{R1n7Ot`W#+O^YuO_$y{qclt#-|1}aqdZLgR_C4S z{v$UPnskW%EyG;8xIQeftgNd%BjFIwKXK{_#(mdb5} zJe=BG7hOd#T39u&5#|VC=!dSXY|`x$r`_bnFBExZoxP>Iek{K0jJ)!B80E{l%R6wL zj%v(X^t{ncYCJLJsmU2JqV=0JQ74PTeh}SOQ9W~kdai)1nDUmwUN&C(>LzbWF_YkR zeW|p^rfNFkH>NzE(deS}`$UOO$?IpjM{d&?@f#&iy)9BkYcNo+o4hxrFP;zqlkbR- zq`fia)y-R=8aP_NUyD9NL`>eSk0wv)hf`3ryz^1=rhY_u`W?LP<-P3FTAv&#RpW=s ztEgK9yh5M}Y>*raUT5c)aZ^EX; z7w%u^v!+(tfd@kMOzwhG3KFlKr zX;~kK&s}_yWvWIPvFQB8Cx3}JDnA=Mtv#gXcjQ+I*#V=X;L5iS5la-y2}Hab770p2Zw<^7mhy_MPAVU}?@Z zpP$zGlkY9vHrl%D2A@^>8ru65#_urjUk5*Ld|~b`J0bC~9Z1Z>c>0c=n20enC1fW~ z35}T&3IGFk!j!E@l!XXeIHoA%#u*h6XJSO0UJ-GUBjV&n#0eIKaz|O4HjJ{S zZp*Xo+VSp1K4O$%bfccsccGn;xB=sDTQ1^Y+~QfJjeBfs)8{a)f48P~+%MvLJk)My zy)- zbJ_Ydt4-Aj>*ilnFAGq=tk;>SmvNYP0*QtD11NXE?wioZ(eqp9g6eaaU)ti+3(vpf z#QzLSsf@#zw^}fUd)xgUI*j=-%kI0d9OL(Ji2jU|HvH|E7oL9wb@@k`yXU@tam-5^QQn`u>`6FzA0DO5u>%jmu*!MH3*cPBcxLX6oVS$@2;)3=7;`k^ zy@q-8r%1ODb+-^@S%`VQ#*Tkz80PWkV$9(PQ*(H(n#1ESIfqZC3^j)bPL@MQmOTe^ z>0z16pOd+qe9q<1eZXA)L+CaU=TOe&Er{DL=Q;GR3^T94j52Zl>~Q+1c{TDJ%6XYG z?DsD|snV)*V{a8tpGPNQtloezdp*YP#GUWl`D1n7zWA*D!i72;vcRc5U{~Gva{Qm&s z{xOVuL!0pM80)o*GLkV5>_lJxshyCREb~Av`eQD}e=hpF?)&jmLWANl55!|0z+5mU z6msKW9&qDKjEK`KA`a#OH%@LuoM0#vh?)l$+Pyx~m`{>1pCn^GNydB<#yrP#62?5o zbP~oq$8-|Le8>i3%;z#3V?LMR81uOZ4`9sa+JVHD&lR4_8E>_@<@*=a0s1}aIAO{s zPzM7rPFmbC-#_7t5o7*vfz|e>IIMv%?%$GeAIQRb>1wMj(@uXVa4W}pe>Ls{Q|Rxd z#=SL|eJ|B7Iqu(eGIv$?xc=O-!PW~HBTvTn!I~}KYI{(|f0h#-|1B8*)zkyy zpYa~V7>QoDar_4m#x*Ok6Jx0cX}ZP5*r%TBA%knfVd!Ugm2E24Ob=qNRqHp@{X>R7 z4C^-&m*Jd`;(^!Mz17%{NBQGz$n3Ajx}vd;W4&)0qDsw zqR)+iE@SDcF@?F9lM}yV_f_Y{J$65w8*yH=(UHg8jB${x#{tfbd(eh^5VptdCx|mD zA`Z@tZk%3b93W0|IL?aPgwS_5uI#>3?g`HPkaJ@%oErnXrZ^vMoP5x^aeM{Nc^D_- zZvbMPj2{fdI2rE%KjhpvnezkmHvsOS~hvDIWx39GHv)Zf^ zcumK)_uyi45A%$Fcp}feZk%{;(=?nn_nZE;6Kgp1Hf_h09;?kWTwfL_*XD_`Uo<#i3u zhm1qMEqu}m-<+76sOONhVMBk~Z{dop>AW6XW5+L;?0c|Ze6F>h@v`!){XYd3A#SJ7 z!fOLfv^kf7wbiD{;AP=@@N%3ZC!-D$Q3ts-3(q}=dGQ?9<&)7?O#7OXxa%QY?_Py< z%y8%$V!p_a^B2x12^*#jd+6bZ3->+lv(i3iTl;^GG~dlF-2bxOVNjvF6#2HP1Cz z+q|vTJYBD0%$mlmad@rs!E2rjta*C<|8ULo(XMm;RcoGVta+9qbEc==J@L=)aTDk8ePKz8?L0BKrJK z)Eb}bpz4VA&}7K$CQH^sHOS+mu7^zAuIr&*|Im7<8u{@&5xK7wxgHAd6>vQi-YW>N zhx*8RsPDgYJ#@Fb9_lk?Mez0ySr2iqAh7Ey=cA3G4_XhsJx{NP-o9S1hu*$iuZQ0D zeAM+&AGIEO-Se+o4~>=eP{yqIT()QQddO|#i1m=+ne~vNd*S@T^-vksLwI(i%X-Mf zsqSmmD0;0yzF7~MIPtO`GPGF_89I7BWcXYU89&!Uc>n!>WIbeLMy`hpPx`)E54k*^ zQ`LH?_a)auk>k&-ha!1qJ#-uDG?G6C>!C>cQtP3|aE{%WDLP_ZL^>UPP4Pc)U8MJLsuAC;i`HOVJQcAnQZleEV%ua@|L629k z7iF&JTcBfB&6sgtz+RLJPq5x2kJq%%VohuIc{n$6pNMn#LOU~&d%k(7t39~3)%&`* zmc=!#y0+yt?w~|mui|=^*R|N^apT~c){QeUA`bR>Oq}JorqyvWr-X7daZQ`4u9H__ z&WhgejmNyhy{@^ozQ=`U_cEv_^)L7BJ)#yNI;rW2nS@BC}`!6L75zrcH3ms{r_{S4-H>@9Y3-v#ID^(of*ZM`k* zXJFstn-h0V#y;)(o|Za~b3V_&^)2Jm&+FS^sMl@xdUiIjU&!@s6J)er&b2k}5%Jo# z$=YKjHPN8>M%;IL&+=N>4{4g#yVc%lu31}oJ{TnPv4!hX3)iO>u1_sopIW#+wQzlE z;ri6V^{IvHQw!Ip7Oqb%T%TIFKDBUtYT=v#+x14jF7vVI++{vCJa<06^z~^C;toTZ zd4Dg2Yte1PoSj@taeZXwVqTjvp5gP_G?KpLT%2T;{u*Ox$5>n=;@UJD^p1pxYtu|U zR>}KkuS=hU{2Y|?aMX1v_rS93gp(eQVU&f}r6F9G{#33@hhZLL+Slc}bPBFZi*e3S zV;a|m_^iUz-MB7&c-ruX9>;a5y7t6%X?||_nsfx_K=Mc6Jg_t3nlx8klO{d16W5Yu zsJrz&lO7rl9g1;HN*s=B(g(qR8P}xQpgHdxhA#1JuYd5GbUn^*=9-lEzv3~Ue$aI% z?`y)ILfd-W*UrIp?E>UmW(Q7o#^Zjj+|PIr_a8!t6M65M_cMyHx1siLW262d9UBx&)|J(#YdZ& z`}jCt;htmcdljaAIdZa0&T0pc#S~BGTyLkY{YbRsY2!mdaRM#jDMu?PwhZg*KF#=ApUx@ip6=0>bA-owJ8V#d!0_UTYx z+7terE8dNQXdB~g6&ACcy3J6#!x4|!+J9V7N2K)xI+Lm9YF_x)lprjw%4pjmvC!X) z_ms=3GF~G-Mz8EHC`PJo{jF3=u|v?dW@buJX!wB+EbR&Z)=KOKH`R=Ap!OL}m%CC* zjJLq6qo84ocbv=W)`^Uu1`*`3HWnJcNe*6-@f%T$7p>GPkV$gnvz{1~=7I<26sf#VCYHwaQI3&3MD9D#N*G-v)`j z-Az?#yz1d&#Imi~##C-T&6_-#pJRh1uJ>%e*66X4eFJB`2)Nl(T8e zrmKrqy{mxkInMat95;5$v0HP-$nlN$zW+9h7_*GCV&oW+ptxI(vnKd;8F8VhoJ~_U zU0t*i=nCD-Ix{-w7#+q`?QF@5b2}a$QI1BC=xl2~u3eP7z=ts5z|x-ZFTc7%M-xeO zIHPG#`1hOy(Yg~|j3^@|Xq+3R+q{@5gQn0OJSE249&ZG9>*FR>k(+9&@orBrspcDR zN2+G&GfYyNrZNO$pLa|SrEU(>jQ5m?Ljy$1iqR&nAXl&HrQ$syf;`se1JRPm(|U$~ z#|dX{SX4Mr`%K-HNEG$}6TR9^R$UvVfo)YsD*#rs@O6^^Zb6jRcqh1RHT%O-bsf~* z1^AwtkQp(uyX!ftu$#IM`ImTP)vSt~tQQ5W@7;l935jj;$ z+HkGTGG2bBl@2Q><85{4!aLi=dpykQKBwHNC4_&Yi;c60DXY;F*%_}w<*4jlj&7%)4I-dbkh84um$=36HnvQZ9d7y*=7z|1WoYp*M_Tc7zy zW!|y8o6K(AC5Ft1$)&rVvkJP&oHa!1wZ*OK1-i?Gf1|U(Qlz`=ZUeAD1Ws@TcZKx-OaapsB*QktTf$>IYACVKS!_$Rpb(ZnY zb+w;qy!-m<*jU9K6R(;4Vl3>U%ZT%%DVR|TjcB|^zZhrHgV=PYJ1iKZ>1Su^DE!(1 z9Zm?w8&ba0RT%GZmsMiC zBZb8?U&%H@?ap@79un{AFiVF;{7UBhUI!iaaE;gGj4^1uCJ)3i-U8XQM=awt8t5}} zv=Xt;)21?pxOz-8UXwZISmQOBW5?cjx4L>%8SfCWk;ELQZPVq8_?4Wp-5jSIugM0Z z%6LsSwl&>&$GJJqH{QsSPu~`+POC(l&8}8e#%omJ z?xSQ^|W95c~`G$;~nnyfNrzK zs;Dw|m1$HBD{;pME3wg3j+^5h;cC&o7&%6qX-tkg+?uE{-XynRbBs5`Wz90)u&OmN zRE@}~Ski_oXO{7r2?A#jjoK`G-dWPG# zyR~441ckeQiSdS&?sgeCMC`7O6Xe)3{u9EBp^u4D=tjANmSE}dj<9mr8#mr+mo>|H z!?L?|jM);qHk@jSc*Ch?=}f}E>mwi}nN=@{j*Bq-oU=~mBnnmsfn z-RGn6>Qv#9p#8D&X|6CSwKeO}Cwt#Kdb8KY{%YU$W(-Oim}k zFG=`^fc#`)BD^qAJ2~A+(b4d9qYyqkIO7Tck>CpOQ9$AqDvzWQ(59!qF!P?iTEvxo zC#PT67y95i9DFyfkLFUHl!7i~k3{=6tdCNQthILLYTVFEE3($4)6;VVbb~rR%9_wu zq@^dSoba?jfeucj&|Xpbt2C0Lx0}C@QTw?0D>75WD57tXt@G|T+45xGi`7d15vV-Y zNf#vs_*AJc>t$bw0$L6#Lf_vBs5_EL%7VjxB4mW3E$cc#uq>XNJkB`yygvfF#2)7R z1@JB~?5ix_Z{QzI|L}m1H+fgnpO@-84gcrqACYM}%i!_<3LL*3*8=~`@Or-Le+}Rb z1ik{!Tktv~z463x&XwK-4{r1&lbPeS5?%qpOq^VAAc3aj6fw-3iideD>#vM1D3^4!-{Wwe% zB>VzIA`WMucbw(yg{Z(m{P6y=V|n9=sm^~p30J|Ra(%Q|T1K(aWm?0%f>Q}(nrbtFiE`Sz)c0*HkgGBi)|Fo--IE6anNjxEY6q5Hz(C5jU z&Dv6%UMUTry%+-i*(^UQ)ShvKNS9=8p`TT%jAYW~N|i6dt5jL8ROtYjL?O%B=TnBm zn@X}tk(KZ&&F)c}(f+K`Op!g>nc`32Db3a?&6>#Ti#bbawoYr7_G9E?Zp1^)%_y*P zJtrW*)8E74lvE5!bkBolFPem3|2LG%_|BqM`5Q{*r64&j{NLd4P2K@A14;eg_%++) zzi_Kg>A0OLr<+@o91upfIyQizTJQx`9X|r8s^bM!9Yf-!I$mIPBrgJ4L}gy!G?KCpc8JhAExT>;_v$E37ouN}qaUNl+(vIs&>%mDnJ6Nzk zC~dbR5*@!pk}?3pU1_VrQmQ~IZ8iBiNTsbNH(>i+Y5NDIZ4b^}DZd7jV?j&r(L~-k z@M;y0Q*Fvb3`#!SprfQL2l;>^S%MVqYJbipGiZp{{|A*W0Xx^*-E>e{4VG5X-%2uj z!lzU>_zb&2r|JfINT|9&r|Je3AXPW$RNdehNHr=t)uU7g=Q8gB z>C(_=)TrQxXi}zuryBT-G%!vXR?2^4e@iv+S*2y0Y=50FYrP2Pa0 zN=r@t3fovp%d@(HX;d_&KQ^#b1FJYaTFLt)c&dTVs)qV3NY%iS2}sqzXH^6D!+J_J zup)H>>vSauQ4OrpnFih~`s0%Va*=ZyQ;fZ6F&j9^W()VOM@rSgNj96fH$ShbnmEa3 z8~1L)T1mBWlFdf$eFijFGDtrf;eGDGI%zk%RuB7X(ocX^vw4c5d(1^%eSU;1AXTqf zwr+k=ho|d4vq7ke)q#D!30l>x&?QK$s#fT4;fhbyEi4Y83auVI@$`8ETvfS}#ZkFf z;V|mc6NIYeESuHbrwFvFW)Zmtw5sPUn-$&Xcc4{8YdTX6B}tox<-e+Got6r;Q-K2T z)pRmg$>_0>%-g~AvUUcmg2S5O8dPGb6u+Nc;qlD(iW` zMx?X+_mdIu^Ze@bI&3g!2Y$S4!A!fr_e~(1$sS|*4#UqTvBw5{Tu*Q{VPBJK#dW~* z?_k7d#Zl@$cmp>%r{TS9fXa(MRwCs%>;u*X{=jkCq%#lq9Tl4Af4bppju?(pD&2>r zFTO;2jvl%p(3CDmaEBmEsvK%MmTQ;v(ebk{5q~d63Ef#i^AJy~IdAG<_t!kNWWxDr zH#&YIB9=1`KA49P%zf2^m``Ileu9$D#EZW9szbxS(f6IB<450d4yV*Ub7H$xejk=T z`u0%ty`kv*%q=W)J1IK8*)c!LYqA)w1alIdi5I=Cu0zAW(YFswd^1aiV``r{4@Aqq zRQ%|zoX%`5=d_@v!oSO9?3-Pb4~yR<+YE;U&9=jmOUO5ylqUR;#5;b8_!E~bsjbSc zsD&lXY}gL2uc=#{J?iQaBS(zP&QaXFQCE)y1#7&p9h+*9XO;u%nOyq8-C5L z(=Wk|FeR&Hx=g+99tE?IU8=Uz!)GcnPTHH{dKdEY2 zRc+mps-^iQwdD=->y|F6&#x(|u3KDn>+})OS+OEwO`kL+9AVU$5u-=cS1zKMPm!{>z7to+B!H2xpaj^gX9&}R&}*? zTdB5SUR}Pp5}by4wJxinoN?wg(kOMk%hfcJDm&g*1sb=(YFu1jbLZl!%50dqwyKsd zfv~bgjkOIHEM~)!wUz)&)1%8G8T7;S?V@_Cfo8L-tLv;K4NEI)=Fcx{uxjhj2`R3o zvZ}lmrnAdy7Q^23a@ylwT(?+rb!r&$L=v5CJp#4QqDtirjZ3SnM##B(G=wgp1>40m z2Mqlc0aP?9i;`*0eOb6Ts`_-DifL_4h}CTgsjWgKvvO+|RY?nok!~G9Oq^>189~*W z`UZ(9mfXX}v{k{oR48kq(j>4@2W4#F8d#I1sc;kvCVI=4!ZxZh9S+(A&xb8O0F6&E7^1(=M&5XX97aENxhUC>2as?#3-wanOB~J$%zUNF%M1jxwQZ zlEdafYe{6vmUtG_R@Jb=Dw;mAhzk*(ba~*COF8mv%WtX2mGMI+PyD2DJ&q8pfbaia z$?%_Vyz}JO-miZ3bKhRS=b2Th$(P;Q_^U5|W>o{i*WuWVV>^yE9EWfm#lfW~Ql;@CuaI($|MnjrGa6SQ08O7bIM)jBIL2oYAtXX2$AyjoJNAeLj0u z@O4m!Gf*4+l zmo!6waNLDst@i{U*J|9I!_^cW_f#2qH4b5MkB=;F`$>9kxsug_Ls$XHg}Z*j;=-G; zxC%!ubkvV5ZUhU9t8KE>6%-KeR}yO({344xx{$0kgP|9!k_-1c8JU~1k{*RvUDk}tE*LKMOorZs+wPpS$D+piUt#s-&nsiAFHl>wRp?dOS$}-#TB)U zl~w;pUjGNnB&CC7nO~-jg8%O<(7NP|CDO-H;QAHyrqI?0En2JD?M94XV^uAaU%jd` zRadoago+efN@D|8E)t`m65mLHAH%xLEPX(tr^imL7A7Mqs6y-rjSV%m^;)=YLHIEq zWw`-@r&E0IJD&54a?WVm7oYGqzY_}iQvJ@g2Ym7VW}oHU6!P`&$^Ki{BF?gAzw^yCB%R|{v;RQo%z;1y^st=ml$8u_DA0hv3C*Dp|9zSM zK+u;42?P97D9L}bFZr*2724da!~cxr15k>Dz;%9S9i;d2J56@8&xe?*Z1)zuBzH zw7>*kYC_;Ie&@IMhMaHNAtE)|Wd|nsotN%yhVM*Zf~U4;GpGZkfM*!q;F-~rHT4ox zfZ?gN&m15H|AEMW(3xhmnEz&!p&4})3hYLz7g6GPXOA5M%?f4}n>y~vI!;E(Gf~H^ zfuS0mBln^?pFp+5|JBzs(5T|X`=_q;J3oaule{d^PC~(h!tFmS#qlq)0bj|d#=lY$mBN=Mq&+G<% z=PUOHPWYYI&?ixEL(pG0Bac(4Hz2#iXnkm-Zrw{K%08osOk-IRlR{ipy~-G zpj*8;pM!$b<2)PHSpjW7ydpQCBG0-NDU`DT6?yifRwQCKBet&34Nw$*sZUVQ1az$W zq`H0tqCO9Bj)EA!^RNe9IU%sz@4T@(5o9`&%lH#;Xm4)Hr*@}Qx5q8q2OE~ogC zp7!+xmF6$@rR)9;uHSiO^#Ny_#|$=21x|o{25i$o4zPo;BW$%z-vCSZjS}>YS5}7* z+mrA3l7yCx|p*Uy5bzR2l?^ictDtrvlyZ7ae>QFxU`bazLt~KN z{lo${Z!Qq~gn1=E>?7ul1X9ig5V-uwI}Bug2L)>dmmpD3@Mi!Se*kWf5D(&q*n&h@ zS{AR<7~})+%&!SQh?+MEiE&;mF4P!I#q}2R+l%Wb=C@t2RB#3ssm!ksNcl;)1xSRA zPKC>H&4-h2af8MnH<6him-x)D1ck>bzPMOp@Eoq)n9pg!5p5WI-;kbX>XreIL86Xj(19|Q*qp3>#@W6o6JO9c5*0LFg> zW%1%JgW3DB%3qFnp=vxM#?$mbIn{z<_rP;S!gf~|s0f^!861+xVK zD&1`&7atBzIG%vdQ1?87k2IgnJcmy#w+}fq1Rou~ss$e)J~sCFSdVAN_}$}~(z5;o zM+!1F?gVM*bUIsec0|!^M~1&E;ole9KL{Q;wlBlegnnG;0YZO+G;}rJvwA*?J|yw4 zl=xdoqwkyV`-}k1@1dIO$_AkU%FV|w!{=&JUH*|a*MaCZD%@N*enMz-ojF5jb6q+W zG?N?G3{NDT6GcB1MQ@IxCr8ng6)A616dnHFWc0?NeC*Ht2ITS@Y>Vkg6>2Y12=i%0 zevFWteDm(9T3Tmfew5D$nmtYRX+A9X-4FiBhwSvX>h$O6LZy?(l;Oj3zycz;_@*4F zvGUzHg({Zj7myE{-=(9&_vZK+IoEyY_vS{89jiV-mwoB)%`L8K(AO??Dhu`VfBN0I zzf97yI8V|U8qK-SrM^2i1M331MK~YR?UkEsMK@zxQnO;pyVQ5*emqPk zTB5xk@MPA^qjy50!^|UbWa{zr=UvCS9%N@lhPQt>ZLC{6^`g z$iJ{N1@6 zNuMqC*L0oUMn89pT8C0%l)MlA?pzU1NO0R^+_e@e(ki^wJx_FzHyXiMn(9pWc({5* z9J@&1u?rU=-ChZ2ymO%0CAUn&Q>W0GoBSm>=&+je0S~! zYf}zvyX|;3Yu{t()(fv(+&0Zq*feb&co4Yxy_K-fj_=aZK6}7hI6iBIb=P{>f6TSF zeK`v@O#`sYY1!+)%8?~ z=uew@@2&h4>ft8X{l0N0>P6ePM;Y2thIW*p9cB2@<)~Mb;V9~}9fv8y(Wo*UhAqYa z$ucm%7nDstYjY>+As+2Y`?RfiX6QP!?<>G =u-s1w=+d4-x}zgrQ5n4^~Sa?$M^q= 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�=h+>JVot6;ommA0&-{-j?7yFISeAC=zQ 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 Go&N{#?hY;h diff --git a/client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libbloom/.gitignore b/client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libbloom/.gitignore deleted file mode 100644 index 378eac25..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libbloom/.gitignore +++ /dev/null @@ -1 +0,0 @@ -build diff --git a/client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libbloom/LICENSE b/client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libbloom/LICENSE deleted file mode 100644 index a3b17c14..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libbloom/LICENSE +++ /dev/null @@ -1,26 +0,0 @@ - -Copyright (c) 2012, Jyri J. Virkki -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. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -HOLDER 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. diff --git a/client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libbloom/README b/client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libbloom/README deleted file mode 100644 index 0f33a65d..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libbloom/README +++ /dev/null @@ -1,45 +0,0 @@ - -Introduction ------------- -This is libbloom, a simple and small bloom filter implementation in C. - -If you are reading this you probably already know about bloom filters -and why you might use one. If not, the wikipedia article is a good intro: -http://en.wikipedia.org/wiki/Bloom_filter - - -Building --------- -The Makefile assumes GNU Make, so run 'make' or 'gmake' as appropriate -on your system. - -By default it builds an optimized 64 bit libbloom. See Makefile comments -for other build options. - -The shared library will be in ./build/libbloom.so - - -Sample Usage ------------- - -#include "bloom.h" - -struct bloom bloom; -bloom_init(&bloom, 1000000, 0.01); -bloom_add(&bloom, buffer, buflen); - -if (bloom_check(&bloom, buffer, buflen)) { - printf("It may be there!\n"); -} - - -Documentation -------------- -Read bloom.h for more detailed documentation on the public interfaces. - - -License -------- -This code (except MurmurHash2) is under BSD license. See LICENSE file. - -See murmur2/README for info on MurmurHash2. diff --git a/client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libbloom/bloom.c b/client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libbloom/bloom.c deleted file mode 100644 index 8ae8167b..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libbloom/bloom.c +++ /dev/null @@ -1,167 +0,0 @@ -/* - * Copyright (c) 2012-2016, Jyri J. Virkki - * All rights reserved. - * - * This file is under BSD license. See LICENSE file. - */ - -/* - * Refer to bloom.h for documentation on the public interfaces. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "bloom.h" -#include "murmurhash2.h" - -#define MAKESTRING(n) STRING(n) -#define STRING(n) #n - - -inline static int test_bit_set_bit(unsigned char * buf, - unsigned int x, int set_bit) -{ - unsigned int byte = x >> 3; - unsigned char c = buf[byte]; // expensive memory access - unsigned int mask = 1 << (x % 8); - - if (c & mask) { - return 1; - } else { - if (set_bit) { - buf[byte] = c | mask; - } - return 0; - } -} - - -static int bloom_check_add(struct bloom * bloom, - const void * buffer, int len, int add) -{ - if (bloom->ready == 0) { - printf("bloom at %p not initialized!\n", (void *)bloom); - return -1; - } - - int hits = 0; - register unsigned int a = murmurhash2(buffer, len, 0x9747b28c); - register unsigned int b = murmurhash2(buffer, len, a); - register unsigned int x; - register unsigned int i; - - for (i = 0; i < bloom->hashes; i++) { - x = (a + i*b) % bloom->bits; - if (test_bit_set_bit(bloom->bf, x, add)) { - hits++; - } else if (!add) { - // Don't care about the presence of all the bits. Just our own. - return 0; - } - } - - if (hits == bloom->hashes) { - return 1; // 1 == element already in (or collision) - } - - return 0; -} - - -int bloom_init_size(struct bloom * bloom, int entries, double error, - unsigned int cache_size) -{ - return bloom_init(bloom, entries, error); -} - - -int bloom_init(struct bloom * bloom, int entries, double error) -{ - bloom->ready = 0; - - if (entries < 1 || error == 0) { - return 1; - } - - bloom->entries = entries; - bloom->error = error; - - double num = log(bloom->error); - double denom = 0.480453013918201; // ln(2)^2 - bloom->bpe = -(num / denom); - - double dentries = (double)entries; - bloom->bits = (int)(dentries * bloom->bpe); - - if (bloom->bits % 8) { - bloom->bytes = (bloom->bits / 8) + 1; - } else { - bloom->bytes = bloom->bits / 8; - } - - bloom->hashes = (int)ceil(0.693147180559945 * bloom->bpe); // ln(2) - - bloom->bf = (unsigned char *)calloc(bloom->bytes, sizeof(unsigned char)); - if (bloom->bf == NULL) { - return 1; - } - - bloom->ready = 1; - return 0; -} - - -int bloom_check(struct bloom * bloom, const void * buffer, int len) -{ - return bloom_check_add(bloom, buffer, len, 0); -} - - -int bloom_add(struct bloom * bloom, const void * buffer, int len) -{ - return bloom_check_add(bloom, buffer, len, 1); -} - - -void bloom_print(struct bloom * bloom) -{ - printf("bloom at %p\n", (void *)bloom); - printf(" ->entries = %d\n", bloom->entries); - printf(" ->error = %f\n", bloom->error); - printf(" ->bits = %d\n", bloom->bits); - printf(" ->bits per elem = %f\n", bloom->bpe); - printf(" ->bytes = %d\n", bloom->bytes); - printf(" ->hash functions = %d\n", bloom->hashes); -} - - -void bloom_free(struct bloom * bloom) -{ - if (bloom->ready) { - free(bloom->bf); - } - bloom->ready = 0; -} - - -int bloom_reset(struct bloom * bloom) -{ - if (!bloom->ready) return 1; - memset(bloom->bf, 0, bloom->bytes); - return 0; -} - - -const char * bloom_version() -{ - return MAKESTRING(BLOOM_VERSION); -} diff --git a/client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libbloom/bloom.h b/client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libbloom/bloom.h deleted file mode 100644 index 532e0e34..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libbloom/bloom.h +++ /dev/null @@ -1,172 +0,0 @@ -/* - * Copyright (c) 2012-2016, Jyri J. Virkki - * All rights reserved. - * - * This file is under BSD license. See LICENSE file. - */ - -#ifndef _BLOOM_H -#define _BLOOM_H - -#ifdef __cplusplus -extern "C" { -#endif - - -/** *************************************************************************** - * Structure to keep track of one bloom filter. Caller needs to - * allocate this and pass it to the functions below. First call for - * every struct must be to bloom_init(). - * - */ -struct bloom -{ - // These fields are part of the public interface of this structure. - // Client code may read these values if desired. Client code MUST NOT - // modify any of these. - int entries; - double error; - int bits; - int bytes; - int hashes; - - // Fields below are private to the implementation. These may go away or - // change incompatibly at any moment. Client code MUST NOT access or rely - // on these. - double bpe; - unsigned char * bf; - int ready; -}; - - -/** *************************************************************************** - * Initialize the bloom filter for use. - * - * The filter is initialized with a bit field and number of hash functions - * according to the computations from the wikipedia entry: - * http://en.wikipedia.org/wiki/Bloom_filter - * - * Optimal number of bits is: - * bits = (entries * ln(error)) / ln(2)^2 - * - * Optimal number of hash functions is: - * hashes = bpe * ln(2) - * - * Parameters: - * ----------- - * bloom - Pointer to an allocated struct bloom (see above). - * entries - The expected number of entries which will be inserted. - * error - Probability of collision (as long as entries are not - * exceeded). - * - * Return: - * ------- - * 0 - on success - * 1 - on failure - * - */ -int bloom_init(struct bloom * bloom, int entries, double error); - - -/** *************************************************************************** - * Deprecated, use bloom_init() - * - */ -int bloom_init_size(struct bloom * bloom, int entries, double error, - unsigned int cache_size); - - -/** *************************************************************************** - * Check if the given element is in the bloom filter. Remember this may - * return false positive if a collision occured. - * - * Parameters: - * ----------- - * bloom - Pointer to an allocated struct bloom (see above). - * buffer - Pointer to buffer containing element to check. - * len - Size of 'buffer'. - * - * Return: - * ------- - * 0 - element is not present - * 1 - element is present (or false positive due to collision) - * -1 - bloom not initialized - * - */ -int bloom_check(struct bloom * bloom, const void * buffer, int len); - - -/** *************************************************************************** - * Add the given element to the bloom filter. - * The return code indicates if the element (or a collision) was already in, - * so for the common check+add use case, no need to call check separately. - * - * Parameters: - * ----------- - * bloom - Pointer to an allocated struct bloom (see above). - * buffer - Pointer to buffer containing element to add. - * len - Size of 'buffer'. - * - * Return: - * ------- - * 0 - element was not present and was added - * 1 - element (or a collision) had already been added previously - * -1 - bloom not initialized - * - */ -int bloom_add(struct bloom * bloom, const void * buffer, int len); - - -/** *************************************************************************** - * Print (to stdout) info about this bloom filter. Debugging aid. - * - */ -void bloom_print(struct bloom * bloom); - - -/** *************************************************************************** - * Deallocate internal storage. - * - * Upon return, the bloom struct is no longer usable. You may call bloom_init - * again on the same struct to reinitialize it again. - * - * Parameters: - * ----------- - * bloom - Pointer to an allocated struct bloom (see above). - * - * Return: none - * - */ -void bloom_free(struct bloom * bloom); - -/** *************************************************************************** - * Erase internal storage. - * - * Erases all elements. Upon return, the bloom struct returns to its initial - * (initialized) state. - * - * Parameters: - * ----------- - * bloom - Pointer to an allocated struct bloom (see above). - * - * Return: - * 0 - on success - * 1 - on failure - * - */ -int bloom_reset(struct bloom * bloom); - - -/** *************************************************************************** - * Returns version string compiled into library. - * - * Return: version string - * - */ -const char * bloom_version(); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libbloom/misc/.gitignore b/client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libbloom/misc/.gitignore deleted file mode 100644 index c23ffd2b..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libbloom/misc/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -data -data.cmp diff --git a/client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libbloom/misc/1.0/linux.10000.1 b/client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libbloom/misc/1.0/linux.10000.1 deleted file mode 100644 index b205dd04..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libbloom/misc/1.0/linux.10000.1 +++ /dev/null @@ -1,10 +0,0 @@ -1000, 0 -2000, 0.24 -3000, 1.44 -4000, 5.16 -5000, 15.24 -6000, 34.2 -7000, 63.96 -8000, 113.92 -9000, 175.72 -10000, 269.24 diff --git a/client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libbloom/misc/1.0/linux.100000.1 b/client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libbloom/misc/1.0/linux.100000.1 deleted file mode 100644 index cc58f9bb..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libbloom/misc/1.0/linux.100000.1 +++ /dev/null @@ -1,10 +0,0 @@ -10000, 0.16 -20000, 2.64 -30000, 15.32 -40000, 60.36 -50000, 158.32 -60000, 336.48 -70000, 649.32 -80000, 1109.2 -90000, 1784.48 -100000, 2691.52 diff --git a/client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libbloom/misc/1.0/linux.10000000.001 b/client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libbloom/misc/1.0/linux.10000000.001 deleted file mode 100644 index b8913f62..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libbloom/misc/1.0/linux.10000000.001 +++ /dev/null @@ -1,10 +0,0 @@ -1000000, 0 -2000000, 0 -3000000, 0.04 -4000000, 0.32 -5000000, 2.6 -6000000, 13.96 -7000000, 57 -8000000, 184.36 -9000000, 509.52 -10000000, 1210.56 diff --git a/client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libbloom/misc/1.0/linux.10000000.01 b/client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libbloom/misc/1.0/linux.10000000.01 deleted file mode 100644 index 018af178..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libbloom/misc/1.0/linux.10000000.01 +++ /dev/null @@ -1,10 +0,0 @@ -1000000, 0 -2000000, 0.12 -3000000, 4.8 -4000000, 39.12 -5000000, 180.68 -6000000, 620.88 -7000000, 1749.44 -8000000, 4168.48 -9000000, 8716.72 -10000000, 16666.44 diff --git a/client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libbloom/misc/1.0/linux.10000000.1 b/client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libbloom/misc/1.0/linux.10000000.1 deleted file mode 100644 index 9010abd6..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libbloom/misc/1.0/linux.10000000.1 +++ /dev/null @@ -1,10 +0,0 @@ -1000000, 8.96 -2000000, 240.44 -3000000, 1561.84 -4000000, 5801.16 -5000000, 15577.6 -6000000, 34093.12 -7000000, 64954.48 -8000000, 112030.32 -9000000, 178613.72 -10000000, 268721.6 diff --git a/client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libbloom/misc/1.0/solaris.10000.1 b/client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libbloom/misc/1.0/solaris.10000.1 deleted file mode 100644 index 137a19aa..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libbloom/misc/1.0/solaris.10000.1 +++ /dev/null @@ -1,10 +0,0 @@ -1000, 0 -2000, 0.48 -3000, 1.4 -4000, 5.24 -5000, 15.84 -6000, 33.68 -7000, 68.12 -8000, 110.6 -9000, 178.96 -10000, 268.84 diff --git a/client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libbloom/misc/1.0/solaris.100000.1 b/client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libbloom/misc/1.0/solaris.100000.1 deleted file mode 100644 index ba83665b..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libbloom/misc/1.0/solaris.100000.1 +++ /dev/null @@ -1,10 +0,0 @@ -10000, 0.08 -20000, 2.44 -30000, 18.16 -40000, 59.88 -50000, 151.84 -60000, 342.52 -70000, 656.04 -80000, 1113.56 -90000, 1795.76 -100000, 2690.04 diff --git a/client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libbloom/misc/1.0/solaris.10000000.001 b/client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libbloom/misc/1.0/solaris.10000000.001 deleted file mode 100644 index dc2c61a7..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libbloom/misc/1.0/solaris.10000000.001 +++ /dev/null @@ -1,10 +0,0 @@ -1000000, 0 -2000000, 0 -3000000, 0.04 -4000000, 0.24 -5000000, 3.44 -6000000, 12.84 -7000000, 55.8 -8000000, 183.88 -9000000, 493.92 -10000000, 1224.08 diff --git a/client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libbloom/misc/1.0/solaris.10000000.01 b/client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libbloom/misc/1.0/solaris.10000000.01 deleted file mode 100644 index f73de6f2..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libbloom/misc/1.0/solaris.10000000.01 +++ /dev/null @@ -1,10 +0,0 @@ -1000000, 0 -2000000, 0.36 -3000000, 4.04 -4000000, 38.52 -5000000, 175.08 -6000000, 631.96 -7000000, 1764.8 -8000000, 4164.16 -9000000, 8780.44 -10000000, 16635.36 diff --git a/client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libbloom/misc/1.0/solaris.10000000.1 b/client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libbloom/misc/1.0/solaris.10000000.1 deleted file mode 100644 index 78655992..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libbloom/misc/1.0/solaris.10000000.1 +++ /dev/null @@ -1,10 +0,0 @@ -1000000, 7.44 -2000000, 231.64 -3000000, 1567.76 -4000000, 5794.88 -5000000, 15564.04 -6000000, 34060.92 -7000000, 64926.88 -8000000, 111990.88 -9000000, 178743 -10000000, 268803.76 diff --git a/client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libbloom/misc/1.1/linux.10000.1 b/client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libbloom/misc/1.1/linux.10000.1 deleted file mode 100644 index a9a98364..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libbloom/misc/1.1/linux.10000.1 +++ /dev/null @@ -1,10 +0,0 @@ -1000, 0 -2000, 0 -3000, 0 -4000, 0 -5000, 0.12 -6000, 0 -7000, 0.28 -8000, 0.2 -9000, 0.32 -10000, 1.04 diff --git a/client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libbloom/misc/1.1/linux.100000.1 b/client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libbloom/misc/1.1/linux.100000.1 deleted file mode 100644 index 33d75790..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libbloom/misc/1.1/linux.100000.1 +++ /dev/null @@ -1,10 +0,0 @@ -10000, 0 -20000, 4.48 -30000, 26.96 -40000, 95.52 -50000, 251.96 -60000, 522.12 -70000, 970.16 -80000, 1622.8 -90000, 2529.24 -100000, 3691.6 diff --git a/client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libbloom/misc/1.1/linux.10000000.001 b/client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libbloom/misc/1.1/linux.10000000.001 deleted file mode 100644 index d811f81e..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libbloom/misc/1.1/linux.10000000.001 +++ /dev/null @@ -1,10 +0,0 @@ -1000000, 0.28 -2000000, 1.04 -3000000, 1.16 -4000000, 3.48 -5000000, 6.76 -6000000, 22.6 -7000000, 65.76 -8000000, 197.8 -9000000, 525.12 -10000000, 1234.48 diff --git a/client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libbloom/misc/1.1/linux.10000000.01 b/client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libbloom/misc/1.1/linux.10000000.01 deleted file mode 100644 index 69059b78..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libbloom/misc/1.1/linux.10000000.01 +++ /dev/null @@ -1,10 +0,0 @@ -1000000, 0.52 -2000000, 2.76 -3000000, 42.84 -4000000, 291.12 -5000000, 1222.52 -6000000, 3851.12 -7000000, 9718.96 -8000000, 20957.12 -9000000, 40128.24 -10000000, 70279.2 diff --git a/client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libbloom/misc/1.1/linux.10000000.1 b/client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libbloom/misc/1.1/linux.10000000.1 deleted file mode 100644 index a59aca1d..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libbloom/misc/1.1/linux.10000000.1 +++ /dev/null @@ -1,10 +0,0 @@ -1000000, 8.68 -2000000, 236.6 -3000000, 1581.76 -4000000, 5780.84 -5000000, 15509.6 -6000000, 34036.8 -7000000, 64884.52 -8000000, 111586.72 -9000000, 178323.6 -10000000, 267998 diff --git a/client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libbloom/misc/1.1/solaris.10000.1 b/client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libbloom/misc/1.1/solaris.10000.1 deleted file mode 100644 index 02a34d6d..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libbloom/misc/1.1/solaris.10000.1 +++ /dev/null @@ -1,10 +0,0 @@ -1000, 0 -2000, 0 -3000, 0.48 -4000, 1.88 -5000, 4.68 -6000, 11.12 -7000, 25.12 -8000, 42.32 -9000, 69 -10000, 104.8 diff --git a/client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libbloom/misc/1.1/solaris.100000.1 b/client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libbloom/misc/1.1/solaris.100000.1 deleted file mode 100644 index 5e8fed31..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libbloom/misc/1.1/solaris.100000.1 +++ /dev/null @@ -1,10 +0,0 @@ -10000, 0.88 -20000, 13.64 -30000, 78.84 -40000, 243.12 -50000, 569.36 -60000, 1088.84 -70000, 1844.68 -80000, 2843.56 -90000, 4118.68 -100000, 5672.08 diff --git a/client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libbloom/misc/1.1/solaris.10000000.001 b/client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libbloom/misc/1.1/solaris.10000000.001 deleted file mode 100644 index 32f39846..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libbloom/misc/1.1/solaris.10000000.001 +++ /dev/null @@ -1,10 +0,0 @@ -1000000, 1.24 -2000000, 4.24 -3000000, 10.2 -4000000, 21.04 -5000000, 68.72 -6000000, 216.28 -7000000, 689.24 -8000000, 1878.12 -9000000, 4440.2 -10000000, 9494.76 diff --git a/client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libbloom/misc/1.1/solaris.10000000.01 b/client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libbloom/misc/1.1/solaris.10000000.01 deleted file mode 100644 index cc6c2a48..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libbloom/misc/1.1/solaris.10000000.01 +++ /dev/null @@ -1,10 +0,0 @@ -1000000, 0.76 -2000000, 3.12 -3000000, 12.24 -4000000, 48.44 -5000000, 203.44 -6000000, 662.32 -7000000, 1793.6 -8000000, 4239.4 -9000000, 8839.64 -10000000, 16732.08 diff --git a/client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libbloom/misc/1.1/solaris.10000000.1 b/client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libbloom/misc/1.1/solaris.10000000.1 deleted file mode 100644 index 8692b22b..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libbloom/misc/1.1/solaris.10000000.1 +++ /dev/null @@ -1,10 +0,0 @@ -1000000, 40.68 -2000000, 1007.92 -3000000, 5946.2 -4000000, 19937.72 -5000000, 48851.76 -6000000, 98408.04 -7000000, 173404.48 -8000000, 278122.6 -9000000, 414522.92 -10000000, 585045.72 diff --git a/client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libbloom/misc/colcmp b/client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libbloom/misc/colcmp deleted file mode 100755 index 4aa230e4..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libbloom/misc/colcmp +++ /dev/null @@ -1,99 +0,0 @@ -#!/usr/bin/env perl - -# -# Copyright (c) 2015, Jyri J. Virkki -# All rights reserved. -# -# This file is under BSD license. See LICENSE file. -# - -# -# ./colcmp FILE1 [FILEn*] -# -# Graph one or more collision average runs (generated with colgraph). -# The runs must be for the same SIZE (see colgraph). -# -# Requires ploticus to generate the graph. Note that the lines prefab -# only supports four data sets so in practice that is the limit, -# even though this script will process any number of input file. -# -# (To plot more than four, you could load the generated 'data.cmp' -# file into an alternate graphing tool or spreadsheet instead of -# relying on ploticus.) -# - -$sets = 0; -while (@ARGV) { - $files[$sets] = shift(@ARGV); - if (! -e $files[$sets]) { - die "$files[$sets] does not exist!\n"; - } - $sets++; -} - -if ($sets < 1) { - die "Need at least some data!\n"; -} - -for ($n = 0; $n < $sets; $n++) { - local *FILE; - open(FILE, $files[$n]); - $fh[$n] = *FILE; -} - -open(OUT, ">data.cmp"); - -# Read one line at a time from each input file. -# All files must be comparable, meaning the count column -# for each line must be the same, else give up. - -$points = 0; - -while(readline $fh[0]) { - chomp; - ($count, $avg[0]) = /(\d+), (\S+)/; - - for ($n = 1; $n < $sets; $n++) { - $_ = readline $fh[$n]; chomp; - ($nc, $avg[$n]) = /(\d+), (\S+)/; - if ($nc ne $count) { - die "Mismatch in file $files[$n]: $nc instead of $count\n"; - } - } - - print OUT $count; - for ($n = 0; $n < $sets; $n++) { - print OUT " $avg[$n]"; - } - print OUT "\n"; - - $points++; -} - -# Close all files... -for ($n = 0; $n < $sets; $n++) { - close($fh[$n]); -} -close(OUT); - -if (!$points) { - die "Nothing to show!\n"; -} - -$cmd = "ploticus -prefab lines data=data.cmp " . - " \"xrange=0 $count\" " . - " \"title=size = $count\" " . - "\"ylbl=collisions\" \"xlbl=count\" " . - "x=1 y=2 "; - -for ($n = 1; $n < $sets; $n++) { - $cmd .= " y" . ($n+1) . "=" . ($n+2); -} - -$cmd .= " \"name=$files[0]\" "; -for ($n = 1; $n < $sets; $n++) { - $cmd .= " \"name" . ($n+1) . "=$files[$n]\" "; -} - -print "$cmd\n"; -system($cmd); diff --git a/client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libbloom/misc/colgraph b/client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libbloom/misc/colgraph deleted file mode 100755 index afe97ac0..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libbloom/misc/colgraph +++ /dev/null @@ -1,58 +0,0 @@ -#!/usr/bin/env perl - -# -# Copyright (c) 2015, Jyri J. Virkki -# All rights reserved. -# -# This file is under BSD license. See LICENSE file. -# - -# -# ./colgraph SIZE ERROR -# -# SIZE = size of bloom library to initialize -# ERROR = expected error -# -# This script runs a random collision test (test-libbloom -c) $rounds -# number of times for 10 element counts from SIZE/10 to SIZE. The -# average of each run is saved in the 'data' file in the current -# directory. -# -# If ploticus is available it'll also display a graph. Or you can use -# any other graphing app or tool to process the 'data' file. -# - -$rounds = 25; - -$size = shift(@ARGV); -if (!$size) { - die "provide a size\n"; -} - -$error = shift(@ARGV); -if (!$error) { - die "provide expected error\n"; -} - -open(OUT, ">data"); -for ($tenth = 1; $tenth < 11; $tenth++) { - $count = ($size / 10) * $tenth; - - $avg = 0; - for ($n = 0; $n < $rounds; $n++) { - open(RES, "../build/test-libbloom -c $size $error $count |"); - while() {$got = $_;} - close(RES); - ($added, $coll) = $got =~ /count: (\d+), coll: (\d+)/; - $avg += $coll; - } - $avg /= $rounds; - print "ADDED $added, AVG.COLL $avg\n"; - print OUT "$added, $avg\n"; -} -close(OUT); - -$cmd = "ploticus -prefab lines data=data x=1 y=2 \"xrange=0 $size\" " . - "\"title=size = $size\" \"ylbl=collisions\" \"xlbl=count\" "; -print "$cmd\n"; -system($cmd); diff --git a/client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libbloom/misc/collisions/collision_data_v1.2.gz b/client/3rd/ShadowSocks/ShadowSocks/shadowsocks-libev/libbloom/misc/collisions/collision_data_v1.2.gz deleted file mode 100644 index 96a73f0ec04330e23a159d0bb8c77aacdc2aa86c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 644637 zcmX_oc_5VE_y3GB$S{vhc=bjP>0}OC--gm^YFedb1vaKEy_=$Ds**||L+=g z;;&A&*LJkmbpJ|;_S?TZFTZU$?)LtjU$;0mn_c{i&w@2`|JJja&6XogoK3q^4{OWz zm2s4XzW?koYv8I6BpZC0`v-tzOQrm%kI!dtif!y`yAf@YZdF(vw`)N)vIOu zY6!#Shg5zX~-y0)zrwF_9k8#bcLU{0O{=>~arTYxf9`=!E{<`U?Hf%*7II zpy+7fvmdp1t+^*o%U2Y@QlEBYt|bH{Iv@Z>yU|e}{yLF32Y~&Wxe?Y%fT6Y5zY#D4 zhxg$7c|6)9dU%KF7mynT*ECiP+e{;CYQ=s84TggcAOrJ03w>x{gv?iS$PSwBxt_D(_JZ^&*n~2Yf&U29&u~+l>bGC+HKc5cLKAY#v!J zrx?FmaQnW?ytg7(vpsEAjzixA55!~vYXnf_>dXmXJUE*C>*{ z!aiEJ?p0v?ViCJ!e|H$o^lKZ!TiYxgnDR*dJ7@eJF{;rV3IuM6Wg+GW(h}h5qyt#D zWd8>%0@(jxpRXQU!NLqnk-ccpXzc{3{AjEeV=Y2R!%>@zfAdG)1P}EM(bXWUOdN!D zT^+Lo>uBqsf zTGn3;DvK#qe?`D+0!l(_@FNE)8ajUO;9~b~p{RD94$&V${@bbt;*P_&?yk|p8nuQ^ zZ4iUe`-LEK_l*B-TqO}^7oaNheZJ1-7rUHA-TqEC&Q~$o_LB*6DG$|uw{W^z?9QIg z_M>Z+EKL5b1v9Q`c7M5snA7!N{6dF+Y-@Nrkvelgr}YG=k!QWMy==bTGpD(?jA4i2 z0VV(_sI|GE024G*&Z7GcSd&{3je|!smkt1M?qeMe^~U-0)xSS!hNTmY_K@9@5#$1* zwV+4;x!`zBFwit2L0F1Mv#{x1=57gxnMg|nA)d;M6e0i&gdB(W+ z0!poCEdU05k8I>vu9x?}t_6T!)`8`E{G_;Qizc?C-mxOy=`h2>Q*EFgcRJ>DqEh-q zHxoET3nw`22}8mm`~vn7xt8NVA~6v$?qeXztg+3C(apz_X005^|Ig(ehPTwg)B;Px*AU$kASXin zy^syMWgQOFU$4!@FSzyB@_`LDsyidS_aQNxxabO<@0+&pFypc-F#2XMYkWW!SQ2`c ze!V=)UjdSJdDg@b2Ta}GbMQauAxl9>2rTU-JM|#t^>TYEBN9J<%@V@Cvmn|$^I#sqcy?1`rw-rO<4S@i4Q?a_#*j&Qh@vuc=}XNMA4SFzC|!JN-Na{A@_uf;_VKOrQkyK|_r-|1C&@(f@4_p9Z)< z%TIUta*=EqczPt50MFJgYE&*xn0u&qFO&Hm`7eI{mmt>&9*9$EJPUzh!X-_j#sma* zmb9`hVZkV?G;@1Jiw_b^YkkXmez+7-!GmA~&hl$R8~>RT2b7;RvXJNyMG{-1BUB$q z1_pf)3ty{lqB_LEV)(+Kww}WJJ>dWY=*t{2x5ely?tjKT+nB7 zC{$}6xTss^g`Ehp)<&826>8ZIY=GE%n{%OAXat!pCe|fBSc5x#i7Z?mZbQUt;0aoMeka~;9Spfx31ifm=x|Ww$H9w#i;%30hf0tVvloGVwF`&82T*1p zQ3Su1rm|c>EG{vmf?RrQ5O>yicILkV3=P%ApH!28;$r9xWFB)60Pw7~(FoA$uJr3^ zZXrwCAP1Qn;xb~38>wl6hiZ@={9O}rNeF@zjBk(hc!KOhc<@IgiK`c4f}}fxRcpA?dwW#V1z>aR~pqy7J(IBQmN@o*zYUnTt$xSV(bRGgbf-Zr-v=f%*{=fgU*1`LTnw zMkPQTn6-ukuGU0z(}L?lkPY7{|SdrzyCsg@k(=Q2MLp&8Gg!MzPD!cJA#&dj#%ZT6OaWmU4;y+_4#z2 zoAS=5S4fTHLlm%Jb@6}oU!^O{3iX44<58ZuuKinszK-`aShoi0O9x~7Hu&|29JuV$ zwRM&VALKA(g8+%t(K5LsS}LBqf6id!l516-)t>M`iBs01zRKQFLa|NFbOoPkYEY#Y zccSN(uuTaGF)c)A5a-WqEShusPP%v|L~b^yqElDcT2z2qYySms-tU~^!+4Z<2Prmm z;RR4b-E1pD*r0=^2dUtL>A#$WxY+O?vHAk>FhJ7ZYN*(@G~N7B3)ED$8k+!Tl=z%~ z{gw5G_sDG6(h3ae#8KPuS`5g53L1|HxgvdNK7yk^N*H++e3 zU5Q7k!SBWUc%TyK_k)5-E_vA6?=Mzv&&|KJWF|U*&Vl+r?>5odQf9+XAUi78sXr#D zLDZ>y-!m(#Ksp>uX-6)p6}?;l7$jmFV491p;32^lE>DVG9-c*BX#+a4yPhJ`4o)~Q z0AYn}HKG(w$Acc|Ys^>WS#05Lx=k?$iGp#tQMyY$TDd>*;_hd8nUyomyLVEp75GdwsSMUYpn=>VnI{Fanq z0>m#%7stoAL6N{P$VD{by)CRRM-ajzgUG69M%ZOdl;LLbJFw0BGpI3=4K{z*^&LgQ zpSGA&vyBp?whHF2X5_~SVm^>63J4HW zy>D3-G`}MmUi}c16!5B<3NKbu;cc7#QZ-1GrX728)FR-Mho4>!^0>hb88)TE1KG{r zFCNf@6kdT7-#rjYkCZD}wZl_L_zK_eyo7Afi8#SbB>HN8yFqENmj(7}in|`r3!gFC zJA+A`LkMNbe`Q`^LURU48V+uSZ7-is7BRM_&8M}u!F%#qKGXrD#{7C8EfCG!McxO$ zPGtIVN~6c_oc0_J1Dt)2>C42i$vxK@wWXI!PT=Jx=MV6y)e27o%2oO~mfViy+rJtr z_2;krXhB?0>=&B^Vh&oUqQq^_g&b?egU_)&Gs{mGJ`N}FD4P*4lnQ#eqtV=NGex@PbyUO0q z47AH_z26lD@Si&-tjV(Pz2qPeK3%mf!Cr&1&N+h~bvl2If8q${A(1Ngh2@@l4%AN# zBv4N>Fc1BZIG;PJMbiblucB&2R>flJI9f4zxWzvar8q@*di!58N|A?pSBg43RuzYK z773nUQ}HJO*O5W3a-s6-dlvh*EYELVZ$v32*UJT{I-fWU1{ucyuY{r zzU9g8A5Xb6^S`>YegD!!@8`J!**N30Lp4jNOyV<>_eZb+FT*m4)b#f4F$>I~fqHNf7bYK(nxl6d1xwkc2s2;#`yess4EK`H z%6M2Nq(a`S#3z=-O@c@-!90e z&6PYk5|p#^XszTB?r2-?UO}6u^9g};3$e?^w^ig8;HArxEI}Dy>by>tXk37IeA~fX zU+d!p+efUOj@wQ9G1~^40&5{fAtac6G4>?+-C}jUrsKn+d_FY^FvDVgtyq z1NYuI$l1c9t(Qfk&68kK-9a+RU%T9*!Lra+deMs)wvq9r@nd?yqXTbJ3HfXzY*PgX zfRRfp%lv&r7SZOXz0h$|7E$M#NvJvuTG=%jYadH(M5&D+@D zi-OhPHLbg?LpI5uuZf!1mRN7w?sNa#%g?qA^<8_`H*wU*H}m98cL$mr;{30o?7wGN z*{1?s{^-TSE1+miXcs%7tdpy5=fkz|9DwjllXiL5!5H1-;iKtWbR_tW zpa6v^jpULw; zUa82l!jqx)Jw4NW-;4V1N{@6_oFrH2>)d>qNgpLrBY~M`x0R#>K3x*0(|@q)%_b%& z#6C3?Tl0-%nlE^GREm%3_-2`ii2&35nV6d$9o(HHpbqk5q0xUZv6EV0n{hGgCA-)u z-FugUihDaAEeEKT;X*iXQPSEMjvh{aA zD(z`_V=@zb2IFTV_5Oh`W_}V6DIvqPk8`BH4iC3Ua`nVM9eiEqYu^P653M#PJw@Ji z1kf3f)bHr6K{shnC5J5AsqiQs59pkbudZyh0DyJr<6}_we^ZS-SINtr}}I_^0`&?{^5h9fAZIOJ2yIMO_CEHGHU|4$L5I- zlBh$J#7k`h%m&9dKR4})3bGj-S1*+R^!07@(9z&N^mB0FTbcrcAbMrV{s-;3anSvPY*$0C1_D3y+a97+byju4g+*sjQL+0VbRj1FJ zI{5jXyT6(G;*=@JRO`8BUU&4%LfP1jeZ`!mcb0#949{@EwJ~M99$Vi@6<#t9!kHi6 z%+l2^Fwl1mv`+u?=q>p|zM$5-zy;j}KN$fD#;lmffo2&vCF>X~7TQ_GTj)ZfjzXFS z^DB{^z9KP}D1WKC`%FtIMP`GVrT4vu&$M0q_(z$}GC4#uN`-&&j+dpvpmBNk@>(S4 zI+(19leV#LS@YHk^A3$|a&2-Y)z|_h({4R06%!e#HjvguuY_t>M;o&LRw_Gi23^Atb9~cIFx)Pi+xYz-;iyC0cb7j$hg^9>HqRH7`YgzrbbRv*ulBC) zrTn#1KZ1Gg9S<;>9p=oDp-8RGhcl#+UJ>WnC#*5A3MWqAue%*)+jntLd;SxQS4jme zpkEQG(IvG?RwNk;b!si+Us1d24w51pRCgvnt1NqDm7A_V_4p8? zZ?RT{jLeS*ozT>rE zt}977``mM;OV0{z+OwhDsj}+P|Hi!Un?n^Ov^-vNvA_T}K!k7sPk8yFkH=m{ zW;KuXVrQ(lHp{6S3j)Yu$n-8P4!9%(SdzstvAPLn6cnn((CLm&B+_%D5{UG9DA&DV z>8whWVSb)zPdCrA`A%-yh}KbCjOZ}!`M^|6-A4DmxJ0gAJdgD0gF zmFtVxtL~4aCH*NW-dU5Ve3JNpmV;ywT|2;$>nXj`)kh0RdZp7=P~v77D=3UxE>RYn zR-@F!`=dR%5v?CRr6)>@dE9^bxn8Zj@4}DZ9@%hMKB0tu-_F6tV$BBY47-b2H(ctE z>}Y@XU}2m+lwDfK-gm*i3U1Z#kygY?nSB`M=Ia` zI6fL~A?@P=o%5AIb>onwr%N+iFLeHR-@w&rx-+)saIlMMikc@Bc8&N~Ss7{F!)PB0 z?^M-^cg3-PjiY^-Z2vG>_h^1z%R`38U)WROHq>_xAqiAJmBWKX;r|-Fs_<(>qbChT z8P~)>D47NtNp?_k5`&Onq0xH|4FrSqMCJKPjy>t0E%01w!u3$3~7Kc<$v=j>95~IC>hB` zdoy{3oL%W(-pIgqCM8_P`E>LhSzwyV*+)K_KhOL^_5@rb_G7Y=&0;fAx}wdxqG%_g zQSO4vO6A*;i%g0KNKsy0IF#a<;DhcieM~vYouS*GGI`kS9EzU$+T z8Fw=)BtoDCYW=s+>`8 zEG21or~=r$Y|+qk(IBj?zI2oii`aOkd||>{)Zod^cQ5@U2Nm*1pU_%)%|2(1OjA*zg!w70Y7@R#WP%t;#I57 zPDU&4nNpzB0_0gM>*2_U(eYc?@_cE4DTfY-f(Cxho0PVbqEyfbHyZH}6fAw4E+^Tj zT9OtP0Lir_P8wBZ_=pkYMKGeAh=0XBd2~fP{XF;Vy|)25{p2yRL;;ZEG+jw}8B}Ky zepA}duzZWBHh>1a=h$dkja#@Wcx>jbGN-0!i7E$;-UBhCaEK64M#YedM zqpud3x=}tws$AiY#J|P5=uSx=y}SUYV@`MUkN$6idaH}>NZQq^WQ2HT@892_7k>rm zc&vnjj&2%UuH7M-|DyV&uncmiXQlU_Q?q9YbN!c4o(T9LcL=5r7XefD--$RU!?w{E zrKD>_`b6wQh$s%o58RM(4)*?+XlNduy;(VS2oe3PxZ0HKIkRmzbwAehQXk|68VGnVB%?@k z;OA+{Jk6d_fhg#MD&iY&I%AddUE@eAC4)$;YF?9S9?B7-%Tv0A2MdX4QWi-x4roUr z{SXYl0b{`J)c;Z5>lteaw>TUGUuu90@+oKWD9+PxYBb^He_~#?y8n-N&*i^az|I>` z{Rsux;1xo+_%Ew!USGx0YAmvv_mGw8-NUZkgM9}96bC37c}H4^`rs7v;{04;B;y)8 z06NdbqSGp&d6?7Zu}<(-UVcGTrZ&p zX+;PuelNq39c}~DRyy|YWwMIpJR(&uFi85VyZel&@pub z$uIg6#~i!q4}sh+2pT0iUJl*7{uQPY6v;3?%n%VDrH6%RzY}Toyg9d2TAY`|An)no zxl8LDqVbH7X3ldG^#g1|Z+g@#Iwvq=z9uC&qZ)5&R+AN-KPeu{FnsHKMzfxDy?Z^% z5c{=2{%e6PuTpCx?o?jOsl4#(MEYRdDSf1%+Z&X_B5()I_@;d#ye68)m?Bns~V-`eD{`cj-gV)Xc4wRm{91AQre?+xzQNzOr-xu zs~~E5ZGv0-c@Fc)#W0Ehs!Oqu?3!JKg>W`Pa)d<4Y#`@84x^AjyG#K`irje%j^nUs0`9oOyZ*ihD|@l zdF5$M(P^TF5MQi1>B=<;X|c4_SVj5YiEx{%&DS}D^0Z1^bC}60`4RM(;Uv5Olb^mi zk&et))Y6E9+ZU+q7h1*8h$7A60?kko{v`JQnmFu`ll+iV4qwNx?xHs8y)faI`AB@v zk5TOVFPAl|bwP1?4D>G3bj5Sp^aJ7Hr+my_c`HeVN?oAmtq6CdOnBLvhx5#9PFLm~ zF}y45rbv$O8FOW*{IXXBZ!&J-Mxwk-5A_+oHs-7SNju;qKi~v_owXWG3l?F|^=$7$ zHb}$jH2Q(01Ujw}!@$~za7)@sBqRZ_0+~KwN0%~B)fgWuTad1O^97~yu;z9+KycKW zm&TnKeLvE!v%=I|X8YmZ3WqNZUkoDixiz~mkHnAnDpxa-`8sM}hVhb1FZ_UpgGCOs zCtHx?uT?0sGS)G2om_5Sq<&fsYZ$DL46jd~u>#tXasFFVB(#NdP zXZZKFk9TRj!0UJ*+6i2p*5w;2cFTdiN}8XZ;F>p(eyqm)|HcVFH}I8T{!tC}CdX$r zd^4mUgx!u+eZ(+v6uF1JG~H@|>`-6A{;Y9NT(?hY{BKuGnVd|t+zX7GS0Gn&AX66- zTXnO~Ose0Jl=CqzVW3WHxQ%}cGp_Dt<=`Z^;2KI$fU)YNW;IDUAoiO9_g<;1&Z_mFSZ7q9;?r2js7FslXy@~TkE0nA)W1Y5*gX4RLU$_>*3 zZ?cUpUkx~sQ(mtsfyQmm&YxA;LzAjvR?d&8#g+@#^d=V^-sWAj$AFhiVo9*x z=L_v29UPD-kwT}grTqu1XCB|+0x!zlYsHNkY$1+rdXn6kp79OipzF{LX4{J|WSbjG zx_<~@YN4<|NAXZ~zc!RAj-9hJXG}+={`92dgZZFHQZdA@wPU;h7P=fh(YkePHI${C z3oRcO*J*~ieQsgyM_Q?sBMD;KVgxwa!##-6%?+g~jr5oi?k7#Kw1bvkSQcQ>dqbVr z#*>d&(W?1*;v~D(GG%{5PalFNo^y_XM~D$N;r_VSDy*$B`&&^zk`gvmxLad*T2W(33H`V@D0vig@l%0S_kxD7 zAB71$=&bLZ|N51n$CJ+N1U&wrp{5$W9HJoh^4AQG`al zXdQ0d)>0FXobpoFHwO%<=E4T`V^qIfO(|v4goWrl)#UfNy4{u(9ULLca`ny zk=Gez&9o&@!rrkJ!rmr&3Wyi#dF?GMU5%U)qkhxQCgJHCY3DLl*`x|)k2z_!h+o`Z_e(a1}dA5F;lit;5s^Qb$`{Hx*U*3`w@4X-5Tb)TW< zVW+{32osnTP%Kk9uTTO_dpbRL?+X@LBjlO;(+z)Y>GR+^W;SOp( zOds^sB{`aq`o~VT$pHrGJFq|GjbrugGHMFLKQ@%uzYG+7uPZ<~Tek4>c60_?lLPPK zLIT4NVS+jChy2{h=yXQ7Ed9#>WpXPA$x5jlN7h%*Xp@L(EgYqUg!_Hswa$15D!_NR z7mNIKz}O8F29!*&;_9-fKS=u!;gZ|Vow)o){n3koZP7vkuWRCDSra$5o7sCfqu%z( zv9e5+(s>pZmG0Noyp~AMO#-tXVwxGvU80@O(8?l{G_D0ba|rkOBp`bL4cNJ(`sK%r z32dbfE$Qmw=B;tE-U#+NZ^`QUdEQL6t^AAI*dBQs^H$oK4AH^p)1?V&Kd|)X(O%tj z3++^My{mS8G0d3hj8!$fNtP~wvX(z$l*d-!&{E()<4rV*~}lN`%}iAU`h6< zSZ~@RByVE$9JX~lNQx`1!>-#RD1ln~p z?i?Z?ts4n5ig0}1{4LT^$~r^_mH10g;JEkbgWAvgm$5=DQ)ETf#H$xIt5v`gjF{3NpfcKEIJ7=w%_#Yd4$$=6b&LptmrS%Ix9{lHnAM^u!FVEB2 z3cw%5m|h+%reS(bJufA|*yvonZcY-Q1cn<#)GKTm&F+7essgUS!3rCgI4DysCH=aL+QI#p4=&{KXd`Qw9sYZ>EGnGP<&kxO@sE=65cE0<|hNKVWt=SllMaJT@?-+s__fT{Hry5)CS zsZ52C)XvVnv|qb_Y)d~`dn}$w9W~Fo!ACBwZdf$8HQ#93$sv~=c-BnQ_|f>XjOV8i zW6oU9!fq$tjV(U@uWpGRHm8*QWn`qa9-jHTOV|F9p~^4p>cR3t@~c-g=kDonqz*eXW_U^Wo{M-yB9SNy~nVyxt*KoA{XSYd@R32>a8wTwi%l zeSN0c*hy)AcLFvam)y>ym*vc=4m%GdgQfl6A@zTq{GEU$!SrqpL4wychHr4P3q zk6KTdm@Cg1mo2!Kr62tC*xuy<#0I+`Mw!qsq_M z($lSZ>PGz=3EI&Zb5FOL%JPx^fE#Z0Z?6__Tn?;%yYizy+-2r!Xu0jc<>bbF>;`|= zhu-gFHBkS6+s7^zeACiZ W}1WAbUB|_{ucDbPz#VS(sawZrp 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 diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/include/pcre.h b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/include/pcre.h deleted file mode 100644 index 442c6bdb..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/include/pcre.h +++ /dev/null @@ -1,677 +0,0 @@ -/************************************************* -* Perl-Compatible Regular Expressions * -*************************************************/ - -/* This is the public header file for the PCRE library, to be #included by -applications that call the PCRE functions. - - Copyright (c) 1997-2014 University of Cambridge - ------------------------------------------------------------------------------ -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - - * Neither the name of the University of Cambridge nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. ------------------------------------------------------------------------------ -*/ - -#ifndef _PCRE_H -#define _PCRE_H - -/* The current PCRE version information. */ - -#define PCRE_MAJOR 8 -#define PCRE_MINOR 41 -#define PCRE_PRERELEASE -#define PCRE_DATE 2017-07-05 - -/* When an application links to a PCRE DLL in Windows, the symbols that are -imported have to be identified as such. When building PCRE, the appropriate -export setting is defined in pcre_internal.h, which includes this file. So we -don't change existing definitions of PCRE_EXP_DECL and PCRECPP_EXP_DECL. */ - -#if defined(_WIN32) && !defined(PCRE_STATIC) -# ifndef PCRE_EXP_DECL -# define PCRE_EXP_DECL extern __declspec(dllimport) -# endif -# ifdef __cplusplus -# ifndef PCRECPP_EXP_DECL -# define PCRECPP_EXP_DECL extern __declspec(dllimport) -# endif -# ifndef PCRECPP_EXP_DEFN -# define PCRECPP_EXP_DEFN __declspec(dllimport) -# endif -# endif -#endif - -/* By default, we use the standard "extern" declarations. */ - -#ifndef PCRE_EXP_DECL -# ifdef __cplusplus -# define PCRE_EXP_DECL extern "C" -# else -# define PCRE_EXP_DECL extern -# endif -#endif - -#ifdef __cplusplus -# ifndef PCRECPP_EXP_DECL -# define PCRECPP_EXP_DECL extern -# endif -# ifndef PCRECPP_EXP_DEFN -# define PCRECPP_EXP_DEFN -# endif -#endif - -/* Have to include stdlib.h in order to ensure that size_t is defined; -it is needed here for malloc. */ - -#include - -/* Allow for C++ users */ - -#ifdef __cplusplus -extern "C" { -#endif - -/* Public options. Some are compile-time only, some are run-time only, and some -are both. Most of the compile-time options are saved with the compiled regex so -that they can be inspected during studying (and therefore JIT compiling). Note -that pcre_study() has its own set of options. Originally, all the options -defined here used distinct bits. However, almost all the bits in a 32-bit word -are now used, so in order to conserve them, option bits that were previously -only recognized at matching time (i.e. by pcre_exec() or pcre_dfa_exec()) may -also be used for compile-time options that affect only compiling and are not -relevant for studying or JIT compiling. - -Some options for pcre_compile() change its behaviour but do not affect the -behaviour of the execution functions. Other options are passed through to the -execution functions and affect their behaviour, with or without affecting the -behaviour of pcre_compile(). - -Options that can be passed to pcre_compile() are tagged Cx below, with these -variants: - -C1 Affects compile only -C2 Does not affect compile; affects exec, dfa_exec -C3 Affects compile, exec, dfa_exec -C4 Affects compile, exec, dfa_exec, study -C5 Affects compile, exec, study - -Options that can be set for pcre_exec() and/or pcre_dfa_exec() are flagged with -E and D, respectively. They take precedence over C3, C4, and C5 settings passed -from pcre_compile(). Those that are compatible with JIT execution are flagged -with J. */ - -#define PCRE_CASELESS 0x00000001 /* C1 */ -#define PCRE_MULTILINE 0x00000002 /* C1 */ -#define PCRE_DOTALL 0x00000004 /* C1 */ -#define PCRE_EXTENDED 0x00000008 /* C1 */ -#define PCRE_ANCHORED 0x00000010 /* C4 E D */ -#define PCRE_DOLLAR_ENDONLY 0x00000020 /* C2 */ -#define PCRE_EXTRA 0x00000040 /* C1 */ -#define PCRE_NOTBOL 0x00000080 /* E D J */ -#define PCRE_NOTEOL 0x00000100 /* E D J */ -#define PCRE_UNGREEDY 0x00000200 /* C1 */ -#define PCRE_NOTEMPTY 0x00000400 /* E D J */ -#define PCRE_UTF8 0x00000800 /* C4 ) */ -#define PCRE_UTF16 0x00000800 /* C4 ) Synonyms */ -#define PCRE_UTF32 0x00000800 /* C4 ) */ -#define PCRE_NO_AUTO_CAPTURE 0x00001000 /* C1 */ -#define PCRE_NO_UTF8_CHECK 0x00002000 /* C1 E D J ) */ -#define PCRE_NO_UTF16_CHECK 0x00002000 /* C1 E D J ) Synonyms */ -#define PCRE_NO_UTF32_CHECK 0x00002000 /* C1 E D J ) */ -#define PCRE_AUTO_CALLOUT 0x00004000 /* C1 */ -#define PCRE_PARTIAL_SOFT 0x00008000 /* E D J ) Synonyms */ -#define PCRE_PARTIAL 0x00008000 /* E D J ) */ - -/* This pair use the same bit. */ -#define PCRE_NEVER_UTF 0x00010000 /* C1 ) Overlaid */ -#define PCRE_DFA_SHORTEST 0x00010000 /* D ) Overlaid */ - -/* This pair use the same bit. */ -#define PCRE_NO_AUTO_POSSESS 0x00020000 /* C1 ) Overlaid */ -#define PCRE_DFA_RESTART 0x00020000 /* D ) Overlaid */ - -#define PCRE_FIRSTLINE 0x00040000 /* C3 */ -#define PCRE_DUPNAMES 0x00080000 /* C1 */ -#define PCRE_NEWLINE_CR 0x00100000 /* C3 E D */ -#define PCRE_NEWLINE_LF 0x00200000 /* C3 E D */ -#define PCRE_NEWLINE_CRLF 0x00300000 /* C3 E D */ -#define PCRE_NEWLINE_ANY 0x00400000 /* C3 E D */ -#define PCRE_NEWLINE_ANYCRLF 0x00500000 /* C3 E D */ -#define PCRE_BSR_ANYCRLF 0x00800000 /* C3 E D */ -#define PCRE_BSR_UNICODE 0x01000000 /* C3 E D */ -#define PCRE_JAVASCRIPT_COMPAT 0x02000000 /* C5 */ -#define PCRE_NO_START_OPTIMIZE 0x04000000 /* C2 E D ) Synonyms */ -#define PCRE_NO_START_OPTIMISE 0x04000000 /* C2 E D ) */ -#define PCRE_PARTIAL_HARD 0x08000000 /* E D J */ -#define PCRE_NOTEMPTY_ATSTART 0x10000000 /* E D J */ -#define PCRE_UCP 0x20000000 /* C3 */ - -/* Exec-time and get/set-time error codes */ - -#define PCRE_ERROR_NOMATCH (-1) -#define PCRE_ERROR_NULL (-2) -#define PCRE_ERROR_BADOPTION (-3) -#define PCRE_ERROR_BADMAGIC (-4) -#define PCRE_ERROR_UNKNOWN_OPCODE (-5) -#define PCRE_ERROR_UNKNOWN_NODE (-5) /* For backward compatibility */ -#define PCRE_ERROR_NOMEMORY (-6) -#define PCRE_ERROR_NOSUBSTRING (-7) -#define PCRE_ERROR_MATCHLIMIT (-8) -#define PCRE_ERROR_CALLOUT (-9) /* Never used by PCRE itself */ -#define PCRE_ERROR_BADUTF8 (-10) /* Same for 8/16/32 */ -#define PCRE_ERROR_BADUTF16 (-10) /* Same for 8/16/32 */ -#define PCRE_ERROR_BADUTF32 (-10) /* Same for 8/16/32 */ -#define PCRE_ERROR_BADUTF8_OFFSET (-11) /* Same for 8/16 */ -#define PCRE_ERROR_BADUTF16_OFFSET (-11) /* Same for 8/16 */ -#define PCRE_ERROR_PARTIAL (-12) -#define PCRE_ERROR_BADPARTIAL (-13) -#define PCRE_ERROR_INTERNAL (-14) -#define PCRE_ERROR_BADCOUNT (-15) -#define PCRE_ERROR_DFA_UITEM (-16) -#define PCRE_ERROR_DFA_UCOND (-17) -#define PCRE_ERROR_DFA_UMLIMIT (-18) -#define PCRE_ERROR_DFA_WSSIZE (-19) -#define PCRE_ERROR_DFA_RECURSE (-20) -#define PCRE_ERROR_RECURSIONLIMIT (-21) -#define PCRE_ERROR_NULLWSLIMIT (-22) /* No longer actually used */ -#define PCRE_ERROR_BADNEWLINE (-23) -#define PCRE_ERROR_BADOFFSET (-24) -#define PCRE_ERROR_SHORTUTF8 (-25) -#define PCRE_ERROR_SHORTUTF16 (-25) /* Same for 8/16 */ -#define PCRE_ERROR_RECURSELOOP (-26) -#define PCRE_ERROR_JIT_STACKLIMIT (-27) -#define PCRE_ERROR_BADMODE (-28) -#define PCRE_ERROR_BADENDIANNESS (-29) -#define PCRE_ERROR_DFA_BADRESTART (-30) -#define PCRE_ERROR_JIT_BADOPTION (-31) -#define PCRE_ERROR_BADLENGTH (-32) -#define PCRE_ERROR_UNSET (-33) - -/* Specific error codes for UTF-8 validity checks */ - -#define PCRE_UTF8_ERR0 0 -#define PCRE_UTF8_ERR1 1 -#define PCRE_UTF8_ERR2 2 -#define PCRE_UTF8_ERR3 3 -#define PCRE_UTF8_ERR4 4 -#define PCRE_UTF8_ERR5 5 -#define PCRE_UTF8_ERR6 6 -#define PCRE_UTF8_ERR7 7 -#define PCRE_UTF8_ERR8 8 -#define PCRE_UTF8_ERR9 9 -#define PCRE_UTF8_ERR10 10 -#define PCRE_UTF8_ERR11 11 -#define PCRE_UTF8_ERR12 12 -#define PCRE_UTF8_ERR13 13 -#define PCRE_UTF8_ERR14 14 -#define PCRE_UTF8_ERR15 15 -#define PCRE_UTF8_ERR16 16 -#define PCRE_UTF8_ERR17 17 -#define PCRE_UTF8_ERR18 18 -#define PCRE_UTF8_ERR19 19 -#define PCRE_UTF8_ERR20 20 -#define PCRE_UTF8_ERR21 21 -#define PCRE_UTF8_ERR22 22 /* Unused (was non-character) */ - -/* Specific error codes for UTF-16 validity checks */ - -#define PCRE_UTF16_ERR0 0 -#define PCRE_UTF16_ERR1 1 -#define PCRE_UTF16_ERR2 2 -#define PCRE_UTF16_ERR3 3 -#define PCRE_UTF16_ERR4 4 /* Unused (was non-character) */ - -/* Specific error codes for UTF-32 validity checks */ - -#define PCRE_UTF32_ERR0 0 -#define PCRE_UTF32_ERR1 1 -#define PCRE_UTF32_ERR2 2 /* Unused (was non-character) */ -#define PCRE_UTF32_ERR3 3 - -/* Request types for pcre_fullinfo() */ - -#define PCRE_INFO_OPTIONS 0 -#define PCRE_INFO_SIZE 1 -#define PCRE_INFO_CAPTURECOUNT 2 -#define PCRE_INFO_BACKREFMAX 3 -#define PCRE_INFO_FIRSTBYTE 4 -#define PCRE_INFO_FIRSTCHAR 4 /* For backwards compatibility */ -#define PCRE_INFO_FIRSTTABLE 5 -#define PCRE_INFO_LASTLITERAL 6 -#define PCRE_INFO_NAMEENTRYSIZE 7 -#define PCRE_INFO_NAMECOUNT 8 -#define PCRE_INFO_NAMETABLE 9 -#define PCRE_INFO_STUDYSIZE 10 -#define PCRE_INFO_DEFAULT_TABLES 11 -#define PCRE_INFO_OKPARTIAL 12 -#define PCRE_INFO_JCHANGED 13 -#define PCRE_INFO_HASCRORLF 14 -#define PCRE_INFO_MINLENGTH 15 -#define PCRE_INFO_JIT 16 -#define PCRE_INFO_JITSIZE 17 -#define PCRE_INFO_MAXLOOKBEHIND 18 -#define PCRE_INFO_FIRSTCHARACTER 19 -#define PCRE_INFO_FIRSTCHARACTERFLAGS 20 -#define PCRE_INFO_REQUIREDCHAR 21 -#define PCRE_INFO_REQUIREDCHARFLAGS 22 -#define PCRE_INFO_MATCHLIMIT 23 -#define PCRE_INFO_RECURSIONLIMIT 24 -#define PCRE_INFO_MATCH_EMPTY 25 - -/* Request types for pcre_config(). Do not re-arrange, in order to remain -compatible. */ - -#define PCRE_CONFIG_UTF8 0 -#define PCRE_CONFIG_NEWLINE 1 -#define PCRE_CONFIG_LINK_SIZE 2 -#define PCRE_CONFIG_POSIX_MALLOC_THRESHOLD 3 -#define PCRE_CONFIG_MATCH_LIMIT 4 -#define PCRE_CONFIG_STACKRECURSE 5 -#define PCRE_CONFIG_UNICODE_PROPERTIES 6 -#define PCRE_CONFIG_MATCH_LIMIT_RECURSION 7 -#define PCRE_CONFIG_BSR 8 -#define PCRE_CONFIG_JIT 9 -#define PCRE_CONFIG_UTF16 10 -#define PCRE_CONFIG_JITTARGET 11 -#define PCRE_CONFIG_UTF32 12 -#define PCRE_CONFIG_PARENS_LIMIT 13 - -/* Request types for pcre_study(). Do not re-arrange, in order to remain -compatible. */ - -#define PCRE_STUDY_JIT_COMPILE 0x0001 -#define PCRE_STUDY_JIT_PARTIAL_SOFT_COMPILE 0x0002 -#define PCRE_STUDY_JIT_PARTIAL_HARD_COMPILE 0x0004 -#define PCRE_STUDY_EXTRA_NEEDED 0x0008 - -/* Bit flags for the pcre[16|32]_extra structure. Do not re-arrange or redefine -these bits, just add new ones on the end, in order to remain compatible. */ - -#define PCRE_EXTRA_STUDY_DATA 0x0001 -#define PCRE_EXTRA_MATCH_LIMIT 0x0002 -#define PCRE_EXTRA_CALLOUT_DATA 0x0004 -#define PCRE_EXTRA_TABLES 0x0008 -#define PCRE_EXTRA_MATCH_LIMIT_RECURSION 0x0010 -#define PCRE_EXTRA_MARK 0x0020 -#define PCRE_EXTRA_EXECUTABLE_JIT 0x0040 - -/* Types */ - -struct real_pcre; /* declaration; the definition is private */ -typedef struct real_pcre pcre; - -struct real_pcre16; /* declaration; the definition is private */ -typedef struct real_pcre16 pcre16; - -struct real_pcre32; /* declaration; the definition is private */ -typedef struct real_pcre32 pcre32; - -struct real_pcre_jit_stack; /* declaration; the definition is private */ -typedef struct real_pcre_jit_stack pcre_jit_stack; - -struct real_pcre16_jit_stack; /* declaration; the definition is private */ -typedef struct real_pcre16_jit_stack pcre16_jit_stack; - -struct real_pcre32_jit_stack; /* declaration; the definition is private */ -typedef struct real_pcre32_jit_stack pcre32_jit_stack; - -/* If PCRE is compiled with 16 bit character support, PCRE_UCHAR16 must contain -a 16 bit wide signed data type. Otherwise it can be a dummy data type since -pcre16 functions are not implemented. There is a check for this in pcre_internal.h. */ -#ifndef PCRE_UCHAR16 -#define PCRE_UCHAR16 unsigned short -#endif - -#ifndef PCRE_SPTR16 -#define PCRE_SPTR16 const PCRE_UCHAR16 * -#endif - -/* If PCRE is compiled with 32 bit character support, PCRE_UCHAR32 must contain -a 32 bit wide signed data type. Otherwise it can be a dummy data type since -pcre32 functions are not implemented. There is a check for this in pcre_internal.h. */ -#ifndef PCRE_UCHAR32 -#define PCRE_UCHAR32 unsigned int -#endif - -#ifndef PCRE_SPTR32 -#define PCRE_SPTR32 const PCRE_UCHAR32 * -#endif - -/* When PCRE is compiled as a C++ library, the subject pointer type can be -replaced with a custom type. For conventional use, the public interface is a -const char *. */ - -#ifndef PCRE_SPTR -#define PCRE_SPTR const char * -#endif - -/* The structure for passing additional data to pcre_exec(). This is defined in -such as way as to be extensible. Always add new fields at the end, in order to -remain compatible. */ - -typedef struct pcre_extra { - unsigned long int flags; /* Bits for which fields are set */ - void *study_data; /* Opaque data from pcre_study() */ - unsigned long int match_limit; /* Maximum number of calls to match() */ - void *callout_data; /* Data passed back in callouts */ - const unsigned char *tables; /* Pointer to character tables */ - unsigned long int match_limit_recursion; /* Max recursive calls to match() */ - unsigned char **mark; /* For passing back a mark pointer */ - void *executable_jit; /* Contains a pointer to a compiled jit code */ -} pcre_extra; - -/* Same structure as above, but with 16 bit char pointers. */ - -typedef struct pcre16_extra { - unsigned long int flags; /* Bits for which fields are set */ - void *study_data; /* Opaque data from pcre_study() */ - unsigned long int match_limit; /* Maximum number of calls to match() */ - void *callout_data; /* Data passed back in callouts */ - const unsigned char *tables; /* Pointer to character tables */ - unsigned long int match_limit_recursion; /* Max recursive calls to match() */ - PCRE_UCHAR16 **mark; /* For passing back a mark pointer */ - void *executable_jit; /* Contains a pointer to a compiled jit code */ -} pcre16_extra; - -/* Same structure as above, but with 32 bit char pointers. */ - -typedef struct pcre32_extra { - unsigned long int flags; /* Bits for which fields are set */ - void *study_data; /* Opaque data from pcre_study() */ - unsigned long int match_limit; /* Maximum number of calls to match() */ - void *callout_data; /* Data passed back in callouts */ - const unsigned char *tables; /* Pointer to character tables */ - unsigned long int match_limit_recursion; /* Max recursive calls to match() */ - PCRE_UCHAR32 **mark; /* For passing back a mark pointer */ - void *executable_jit; /* Contains a pointer to a compiled jit code */ -} pcre32_extra; - -/* The structure for passing out data via the pcre_callout_function. We use a -structure so that new fields can be added on the end in future versions, -without changing the API of the function, thereby allowing old clients to work -without modification. */ - -typedef struct pcre_callout_block { - int version; /* Identifies version of block */ - /* ------------------------ Version 0 ------------------------------- */ - int callout_number; /* Number compiled into pattern */ - int *offset_vector; /* The offset vector */ - PCRE_SPTR subject; /* The subject being matched */ - int subject_length; /* The length of the subject */ - int start_match; /* Offset to start of this match attempt */ - int current_position; /* Where we currently are in the subject */ - int capture_top; /* Max current capture */ - int capture_last; /* Most recently closed capture */ - void *callout_data; /* Data passed in with the call */ - /* ------------------- Added for Version 1 -------------------------- */ - int pattern_position; /* Offset to next item in the pattern */ - int next_item_length; /* Length of next item in the pattern */ - /* ------------------- Added for Version 2 -------------------------- */ - const unsigned char *mark; /* Pointer to current mark or NULL */ - /* ------------------------------------------------------------------ */ -} pcre_callout_block; - -/* Same structure as above, but with 16 bit char pointers. */ - -typedef struct pcre16_callout_block { - int version; /* Identifies version of block */ - /* ------------------------ Version 0 ------------------------------- */ - int callout_number; /* Number compiled into pattern */ - int *offset_vector; /* The offset vector */ - PCRE_SPTR16 subject; /* The subject being matched */ - int subject_length; /* The length of the subject */ - int start_match; /* Offset to start of this match attempt */ - int current_position; /* Where we currently are in the subject */ - int capture_top; /* Max current capture */ - int capture_last; /* Most recently closed capture */ - void *callout_data; /* Data passed in with the call */ - /* ------------------- Added for Version 1 -------------------------- */ - int pattern_position; /* Offset to next item in the pattern */ - int next_item_length; /* Length of next item in the pattern */ - /* ------------------- Added for Version 2 -------------------------- */ - const PCRE_UCHAR16 *mark; /* Pointer to current mark or NULL */ - /* ------------------------------------------------------------------ */ -} pcre16_callout_block; - -/* Same structure as above, but with 32 bit char pointers. */ - -typedef struct pcre32_callout_block { - int version; /* Identifies version of block */ - /* ------------------------ Version 0 ------------------------------- */ - int callout_number; /* Number compiled into pattern */ - int *offset_vector; /* The offset vector */ - PCRE_SPTR32 subject; /* The subject being matched */ - int subject_length; /* The length of the subject */ - int start_match; /* Offset to start of this match attempt */ - int current_position; /* Where we currently are in the subject */ - int capture_top; /* Max current capture */ - int capture_last; /* Most recently closed capture */ - void *callout_data; /* Data passed in with the call */ - /* ------------------- Added for Version 1 -------------------------- */ - int pattern_position; /* Offset to next item in the pattern */ - int next_item_length; /* Length of next item in the pattern */ - /* ------------------- Added for Version 2 -------------------------- */ - const PCRE_UCHAR32 *mark; /* Pointer to current mark or NULL */ - /* ------------------------------------------------------------------ */ -} pcre32_callout_block; - -/* Indirection for store get and free functions. These can be set to -alternative malloc/free functions if required. Special ones are used in the -non-recursive case for "frames". There is also an optional callout function -that is triggered by the (?) regex item. For Virtual Pascal, these definitions -have to take another form. */ - -#ifndef VPCOMPAT -PCRE_EXP_DECL void *(*pcre_malloc)(size_t); -PCRE_EXP_DECL void (*pcre_free)(void *); -PCRE_EXP_DECL void *(*pcre_stack_malloc)(size_t); -PCRE_EXP_DECL void (*pcre_stack_free)(void *); -PCRE_EXP_DECL int (*pcre_callout)(pcre_callout_block *); -PCRE_EXP_DECL int (*pcre_stack_guard)(void); - -PCRE_EXP_DECL void *(*pcre16_malloc)(size_t); -PCRE_EXP_DECL void (*pcre16_free)(void *); -PCRE_EXP_DECL void *(*pcre16_stack_malloc)(size_t); -PCRE_EXP_DECL void (*pcre16_stack_free)(void *); -PCRE_EXP_DECL int (*pcre16_callout)(pcre16_callout_block *); -PCRE_EXP_DECL int (*pcre16_stack_guard)(void); - -PCRE_EXP_DECL void *(*pcre32_malloc)(size_t); -PCRE_EXP_DECL void (*pcre32_free)(void *); -PCRE_EXP_DECL void *(*pcre32_stack_malloc)(size_t); -PCRE_EXP_DECL void (*pcre32_stack_free)(void *); -PCRE_EXP_DECL int (*pcre32_callout)(pcre32_callout_block *); -PCRE_EXP_DECL int (*pcre32_stack_guard)(void); -#else /* VPCOMPAT */ -PCRE_EXP_DECL void *pcre_malloc(size_t); -PCRE_EXP_DECL void pcre_free(void *); -PCRE_EXP_DECL void *pcre_stack_malloc(size_t); -PCRE_EXP_DECL void pcre_stack_free(void *); -PCRE_EXP_DECL int pcre_callout(pcre_callout_block *); -PCRE_EXP_DECL int pcre_stack_guard(void); - -PCRE_EXP_DECL void *pcre16_malloc(size_t); -PCRE_EXP_DECL void pcre16_free(void *); -PCRE_EXP_DECL void *pcre16_stack_malloc(size_t); -PCRE_EXP_DECL void pcre16_stack_free(void *); -PCRE_EXP_DECL int pcre16_callout(pcre16_callout_block *); -PCRE_EXP_DECL int pcre16_stack_guard(void); - -PCRE_EXP_DECL void *pcre32_malloc(size_t); -PCRE_EXP_DECL void pcre32_free(void *); -PCRE_EXP_DECL void *pcre32_stack_malloc(size_t); -PCRE_EXP_DECL void pcre32_stack_free(void *); -PCRE_EXP_DECL int pcre32_callout(pcre32_callout_block *); -PCRE_EXP_DECL int pcre32_stack_guard(void); -#endif /* VPCOMPAT */ - -/* User defined callback which provides a stack just before the match starts. */ - -typedef pcre_jit_stack *(*pcre_jit_callback)(void *); -typedef pcre16_jit_stack *(*pcre16_jit_callback)(void *); -typedef pcre32_jit_stack *(*pcre32_jit_callback)(void *); - -/* Exported PCRE functions */ - -PCRE_EXP_DECL pcre *pcre_compile(const char *, int, const char **, int *, - const unsigned char *); -PCRE_EXP_DECL pcre16 *pcre16_compile(PCRE_SPTR16, int, const char **, int *, - const unsigned char *); -PCRE_EXP_DECL pcre32 *pcre32_compile(PCRE_SPTR32, int, const char **, int *, - const unsigned char *); -PCRE_EXP_DECL pcre *pcre_compile2(const char *, int, int *, const char **, - int *, const unsigned char *); -PCRE_EXP_DECL pcre16 *pcre16_compile2(PCRE_SPTR16, int, int *, const char **, - int *, const unsigned char *); -PCRE_EXP_DECL pcre32 *pcre32_compile2(PCRE_SPTR32, int, int *, const char **, - int *, const unsigned char *); -PCRE_EXP_DECL int pcre_config(int, void *); -PCRE_EXP_DECL int pcre16_config(int, void *); -PCRE_EXP_DECL int pcre32_config(int, void *); -PCRE_EXP_DECL int pcre_copy_named_substring(const pcre *, const char *, - int *, int, const char *, char *, int); -PCRE_EXP_DECL int pcre16_copy_named_substring(const pcre16 *, PCRE_SPTR16, - int *, int, PCRE_SPTR16, PCRE_UCHAR16 *, int); -PCRE_EXP_DECL int pcre32_copy_named_substring(const pcre32 *, PCRE_SPTR32, - int *, int, PCRE_SPTR32, PCRE_UCHAR32 *, int); -PCRE_EXP_DECL int pcre_copy_substring(const char *, int *, int, int, - char *, int); -PCRE_EXP_DECL int pcre16_copy_substring(PCRE_SPTR16, int *, int, int, - PCRE_UCHAR16 *, int); -PCRE_EXP_DECL int pcre32_copy_substring(PCRE_SPTR32, int *, int, int, - PCRE_UCHAR32 *, int); -PCRE_EXP_DECL int pcre_dfa_exec(const pcre *, const pcre_extra *, - const char *, int, int, int, int *, int , int *, int); -PCRE_EXP_DECL int pcre16_dfa_exec(const pcre16 *, const pcre16_extra *, - PCRE_SPTR16, int, int, int, int *, int , int *, int); -PCRE_EXP_DECL int pcre32_dfa_exec(const pcre32 *, const pcre32_extra *, - PCRE_SPTR32, int, int, int, int *, int , int *, int); -PCRE_EXP_DECL int pcre_exec(const pcre *, const pcre_extra *, PCRE_SPTR, - int, int, int, int *, int); -PCRE_EXP_DECL int pcre16_exec(const pcre16 *, const pcre16_extra *, - PCRE_SPTR16, int, int, int, int *, int); -PCRE_EXP_DECL int pcre32_exec(const pcre32 *, const pcre32_extra *, - PCRE_SPTR32, int, int, int, int *, int); -PCRE_EXP_DECL int pcre_jit_exec(const pcre *, const pcre_extra *, - PCRE_SPTR, int, int, int, int *, int, - pcre_jit_stack *); -PCRE_EXP_DECL int pcre16_jit_exec(const pcre16 *, const pcre16_extra *, - PCRE_SPTR16, int, int, int, int *, int, - pcre16_jit_stack *); -PCRE_EXP_DECL int pcre32_jit_exec(const pcre32 *, const pcre32_extra *, - PCRE_SPTR32, int, int, int, int *, int, - pcre32_jit_stack *); -PCRE_EXP_DECL void pcre_free_substring(const char *); -PCRE_EXP_DECL void pcre16_free_substring(PCRE_SPTR16); -PCRE_EXP_DECL void pcre32_free_substring(PCRE_SPTR32); -PCRE_EXP_DECL void pcre_free_substring_list(const char **); -PCRE_EXP_DECL void pcre16_free_substring_list(PCRE_SPTR16 *); -PCRE_EXP_DECL void pcre32_free_substring_list(PCRE_SPTR32 *); -PCRE_EXP_DECL int pcre_fullinfo(const pcre *, const pcre_extra *, int, - void *); -PCRE_EXP_DECL int pcre16_fullinfo(const pcre16 *, const pcre16_extra *, int, - void *); -PCRE_EXP_DECL int pcre32_fullinfo(const pcre32 *, const pcre32_extra *, int, - void *); -PCRE_EXP_DECL int pcre_get_named_substring(const pcre *, const char *, - int *, int, const char *, const char **); -PCRE_EXP_DECL int pcre16_get_named_substring(const pcre16 *, PCRE_SPTR16, - int *, int, PCRE_SPTR16, PCRE_SPTR16 *); -PCRE_EXP_DECL int pcre32_get_named_substring(const pcre32 *, PCRE_SPTR32, - int *, int, PCRE_SPTR32, PCRE_SPTR32 *); -PCRE_EXP_DECL int pcre_get_stringnumber(const pcre *, const char *); -PCRE_EXP_DECL int pcre16_get_stringnumber(const pcre16 *, PCRE_SPTR16); -PCRE_EXP_DECL int pcre32_get_stringnumber(const pcre32 *, PCRE_SPTR32); -PCRE_EXP_DECL int pcre_get_stringtable_entries(const pcre *, const char *, - char **, char **); -PCRE_EXP_DECL int pcre16_get_stringtable_entries(const pcre16 *, PCRE_SPTR16, - PCRE_UCHAR16 **, PCRE_UCHAR16 **); -PCRE_EXP_DECL int pcre32_get_stringtable_entries(const pcre32 *, PCRE_SPTR32, - PCRE_UCHAR32 **, PCRE_UCHAR32 **); -PCRE_EXP_DECL int pcre_get_substring(const char *, int *, int, int, - const char **); -PCRE_EXP_DECL int pcre16_get_substring(PCRE_SPTR16, int *, int, int, - PCRE_SPTR16 *); -PCRE_EXP_DECL int pcre32_get_substring(PCRE_SPTR32, int *, int, int, - PCRE_SPTR32 *); -PCRE_EXP_DECL int pcre_get_substring_list(const char *, int *, int, - const char ***); -PCRE_EXP_DECL int pcre16_get_substring_list(PCRE_SPTR16, int *, int, - PCRE_SPTR16 **); -PCRE_EXP_DECL int pcre32_get_substring_list(PCRE_SPTR32, int *, int, - PCRE_SPTR32 **); -PCRE_EXP_DECL const unsigned char *pcre_maketables(void); -PCRE_EXP_DECL const unsigned char *pcre16_maketables(void); -PCRE_EXP_DECL const unsigned char *pcre32_maketables(void); -PCRE_EXP_DECL int pcre_refcount(pcre *, int); -PCRE_EXP_DECL int pcre16_refcount(pcre16 *, int); -PCRE_EXP_DECL int pcre32_refcount(pcre32 *, int); -PCRE_EXP_DECL pcre_extra *pcre_study(const pcre *, int, const char **); -PCRE_EXP_DECL pcre16_extra *pcre16_study(const pcre16 *, int, const char **); -PCRE_EXP_DECL pcre32_extra *pcre32_study(const pcre32 *, int, const char **); -PCRE_EXP_DECL void pcre_free_study(pcre_extra *); -PCRE_EXP_DECL void pcre16_free_study(pcre16_extra *); -PCRE_EXP_DECL void pcre32_free_study(pcre32_extra *); -PCRE_EXP_DECL const char *pcre_version(void); -PCRE_EXP_DECL const char *pcre16_version(void); -PCRE_EXP_DECL const char *pcre32_version(void); - -/* Utility functions for byte order swaps. */ -PCRE_EXP_DECL int pcre_pattern_to_host_byte_order(pcre *, pcre_extra *, - const unsigned char *); -PCRE_EXP_DECL int pcre16_pattern_to_host_byte_order(pcre16 *, pcre16_extra *, - const unsigned char *); -PCRE_EXP_DECL int pcre32_pattern_to_host_byte_order(pcre32 *, pcre32_extra *, - const unsigned char *); -PCRE_EXP_DECL int pcre16_utf16_to_host_byte_order(PCRE_UCHAR16 *, - PCRE_SPTR16, int, int *, int); -PCRE_EXP_DECL int pcre32_utf32_to_host_byte_order(PCRE_UCHAR32 *, - PCRE_SPTR32, int, int *, int); - -/* JIT compiler related functions. */ - -PCRE_EXP_DECL pcre_jit_stack *pcre_jit_stack_alloc(int, int); -PCRE_EXP_DECL pcre16_jit_stack *pcre16_jit_stack_alloc(int, int); -PCRE_EXP_DECL pcre32_jit_stack *pcre32_jit_stack_alloc(int, int); -PCRE_EXP_DECL void pcre_jit_stack_free(pcre_jit_stack *); -PCRE_EXP_DECL void pcre16_jit_stack_free(pcre16_jit_stack *); -PCRE_EXP_DECL void pcre32_jit_stack_free(pcre32_jit_stack *); -PCRE_EXP_DECL void pcre_assign_jit_stack(pcre_extra *, - pcre_jit_callback, void *); -PCRE_EXP_DECL void pcre16_assign_jit_stack(pcre16_extra *, - pcre16_jit_callback, void *); -PCRE_EXP_DECL void pcre32_assign_jit_stack(pcre32_extra *, - pcre32_jit_callback, void *); -PCRE_EXP_DECL void pcre_jit_free_unused_memory(void); -PCRE_EXP_DECL void pcre16_jit_free_unused_memory(void); -PCRE_EXP_DECL void pcre32_jit_free_unused_memory(void); - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /* End of pcre.h */ diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/include/pcre_scanner.h b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/include/pcre_scanner.h deleted file mode 100644 index 5617e451..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/include/pcre_scanner.h +++ /dev/null @@ -1,172 +0,0 @@ -// Copyright (c) 2005, Google Inc. -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -// -// Author: Sanjay Ghemawat -// -// Regular-expression based scanner for parsing an input stream. -// -// Example 1: parse a sequence of "var = number" entries from input: -// -// Scanner scanner(input); -// string var; -// int number; -// scanner.SetSkipExpression("\\s+"); // Skip any white space we encounter -// while (scanner.Consume("(\\w+) = (\\d+)", &var, &number)) { -// ...; -// } - -#ifndef _PCRE_SCANNER_H -#define _PCRE_SCANNER_H - -#include -#include -#include - -#include -#include - -namespace pcrecpp { - -class PCRECPP_EXP_DEFN Scanner { - public: - Scanner(); - explicit Scanner(const std::string& input); - ~Scanner(); - - // Return current line number. The returned line-number is - // one-based. I.e. it returns 1 + the number of consumed newlines. - // - // Note: this method may be slow. It may take time proportional to - // the size of the input. - int LineNumber() const; - - // Return the byte-offset that the scanner is looking in the - // input data; - int Offset() const; - - // Return true iff the start of the remaining input matches "re" - bool LookingAt(const RE& re) const; - - // Return true iff all of the following are true - // a. the start of the remaining input matches "re", - // b. if any arguments are supplied, matched sub-patterns can be - // parsed and stored into the arguments. - // If it returns true, it skips over the matched input and any - // following input that matches the "skip" regular expression. - bool Consume(const RE& re, - const Arg& arg0 = RE::no_arg, - const Arg& arg1 = RE::no_arg, - const Arg& arg2 = RE::no_arg - // TODO: Allow more arguments? - ); - - // Set the "skip" regular expression. If after consuming some data, - // a prefix of the input matches this RE, it is automatically - // skipped. For example, a programming language scanner would use - // a skip RE that matches white space and comments. - // - // scanner.SetSkipExpression("\\s+|//.*|/[*](.|\n)*?[*]/"); - // - // Skipping repeats as long as it succeeds. We used to let people do - // this by writing "(...)*" in the regular expression, but that added - // up to lots of recursive calls within the pcre library, so now we - // control repetition explicitly via the function call API. - // - // You can pass NULL for "re" if you do not want any data to be skipped. - void Skip(const char* re); // DEPRECATED; does *not* repeat - void SetSkipExpression(const char* re); - - // Temporarily pause "skip"ing. This - // Skip("Foo"); code ; DisableSkip(); code; EnableSkip() - // is similar to - // Skip("Foo"); code ; Skip(NULL); code ; Skip("Foo"); - // but avoids creating/deleting new RE objects. - void DisableSkip(); - - // Reenable previously paused skipping. Any prefix of the input - // that matches the skip pattern is immediately dropped. - void EnableSkip(); - - /***** Special wrappers around SetSkip() for some common idioms *****/ - - // Arranges to skip whitespace, C comments, C++ comments. - // The overall RE is a disjunction of the following REs: - // \\s whitespace - // //.*\n C++ comment - // /[*](.|\n)*?[*]/ C comment (x*? means minimal repetitions of x) - // We get repetition via the semantics of SetSkipExpression, not by using * - void SkipCXXComments() { - SetSkipExpression("\\s|//.*\n|/[*](?:\n|.)*?[*]/"); - } - - void set_save_comments(bool comments) { - save_comments_ = comments; - } - - bool save_comments() { - return save_comments_; - } - - // Append to vector ranges the comments found in the - // byte range [start,end] (inclusive) of the input data. - // Only comments that were extracted entirely within that - // range are returned: no range splitting of atomically-extracted - // comments is performed. - void GetComments(int start, int end, std::vector *ranges); - - // Append to vector ranges the comments added - // since the last time this was called. This - // functionality is provided for efficiency when - // interleaving scanning with parsing. - void GetNextComments(std::vector *ranges); - - private: - std::string data_; // All the input data - StringPiece input_; // Unprocessed input - RE* skip_; // If non-NULL, RE for skipping input - bool should_skip_; // If true, use skip_ - bool skip_repeat_; // If true, repeat skip_ as long as it works - bool save_comments_; // If true, aggregate the skip expression - - // the skipped comments - // TODO: later consider requiring that the StringPieces be added - // in order by their start position - std::vector *comments_; - - // the offset into comments_ that has been returned by GetNextComments - int comments_offset_; - - // helper function to consume *skip_ and honour - // save_comments_ - void ConsumeSkip(); -}; - -} // namespace pcrecpp - -#endif /* _PCRE_SCANNER_H */ diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/include/pcre_stringpiece.h b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/include/pcre_stringpiece.h deleted file mode 100644 index cb94f52a..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/include/pcre_stringpiece.h +++ /dev/null @@ -1,180 +0,0 @@ -// Copyright (c) 2005, Google Inc. -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -// -// Author: Sanjay Ghemawat -// -// A string like object that points into another piece of memory. -// Useful for providing an interface that allows clients to easily -// pass in either a "const char*" or a "string". -// -// Arghh! I wish C++ literals were automatically of type "string". - -#ifndef _PCRE_STRINGPIECE_H -#define _PCRE_STRINGPIECE_H - -#include -#include -#include // for ostream forward-declaration - -#if 0 -#define HAVE_TYPE_TRAITS -#include -#elif 0 -#define HAVE_TYPE_TRAITS -#include -#endif - -#include - -namespace pcrecpp { - -using std::memcmp; -using std::strlen; -using std::string; - -class PCRECPP_EXP_DEFN StringPiece { - private: - const char* ptr_; - int length_; - - public: - // We provide non-explicit singleton constructors so users can pass - // in a "const char*" or a "string" wherever a "StringPiece" is - // expected. - StringPiece() - : ptr_(NULL), length_(0) { } - StringPiece(const char* str) - : ptr_(str), length_(static_cast(strlen(ptr_))) { } - StringPiece(const unsigned char* str) - : ptr_(reinterpret_cast(str)), - length_(static_cast(strlen(ptr_))) { } - StringPiece(const string& str) - : ptr_(str.data()), length_(static_cast(str.size())) { } - StringPiece(const char* offset, int len) - : ptr_(offset), length_(len) { } - - // data() may return a pointer to a buffer with embedded NULs, and the - // returned buffer may or may not be null terminated. Therefore it is - // typically a mistake to pass data() to a routine that expects a NUL - // terminated string. Use "as_string().c_str()" if you really need to do - // this. Or better yet, change your routine so it does not rely on NUL - // termination. - const char* data() const { return ptr_; } - int size() const { return length_; } - bool empty() const { return length_ == 0; } - - void clear() { ptr_ = NULL; length_ = 0; } - void set(const char* buffer, int len) { ptr_ = buffer; length_ = len; } - void set(const char* str) { - ptr_ = str; - length_ = static_cast(strlen(str)); - } - void set(const void* buffer, int len) { - ptr_ = reinterpret_cast(buffer); - length_ = len; - } - - char operator[](int i) const { return ptr_[i]; } - - void remove_prefix(int n) { - ptr_ += n; - length_ -= n; - } - - void remove_suffix(int n) { - length_ -= n; - } - - bool operator==(const StringPiece& x) const { - return ((length_ == x.length_) && - (memcmp(ptr_, x.ptr_, length_) == 0)); - } - bool operator!=(const StringPiece& x) const { - return !(*this == x); - } - -#define STRINGPIECE_BINARY_PREDICATE(cmp,auxcmp) \ - bool operator cmp (const StringPiece& x) const { \ - int r = memcmp(ptr_, x.ptr_, length_ < x.length_ ? length_ : x.length_); \ - return ((r auxcmp 0) || ((r == 0) && (length_ cmp x.length_))); \ - } - STRINGPIECE_BINARY_PREDICATE(<, <); - STRINGPIECE_BINARY_PREDICATE(<=, <); - STRINGPIECE_BINARY_PREDICATE(>=, >); - STRINGPIECE_BINARY_PREDICATE(>, >); -#undef STRINGPIECE_BINARY_PREDICATE - - int compare(const StringPiece& x) const { - int r = memcmp(ptr_, x.ptr_, length_ < x.length_ ? length_ : x.length_); - if (r == 0) { - if (length_ < x.length_) r = -1; - else if (length_ > x.length_) r = +1; - } - return r; - } - - string as_string() const { - return string(data(), size()); - } - - void CopyToString(string* target) const { - target->assign(ptr_, length_); - } - - // Does "this" start with "x" - bool starts_with(const StringPiece& x) const { - return ((length_ >= x.length_) && (memcmp(ptr_, x.ptr_, x.length_) == 0)); - } -}; - -} // namespace pcrecpp - -// ------------------------------------------------------------------ -// Functions used to create STL containers that use StringPiece -// Remember that a StringPiece's lifetime had better be less than -// that of the underlying string or char*. If it is not, then you -// cannot safely store a StringPiece into an STL container -// ------------------------------------------------------------------ - -#ifdef HAVE_TYPE_TRAITS -// This makes vector really fast for some STL implementations -template<> struct __type_traits { - typedef __true_type has_trivial_default_constructor; - typedef __true_type has_trivial_copy_constructor; - typedef __true_type has_trivial_assignment_operator; - typedef __true_type has_trivial_destructor; - typedef __true_type is_POD_type; -}; -#endif - -// allow StringPiece to be logged -PCRECPP_EXP_DECL std::ostream& operator<<(std::ostream& o, - const pcrecpp::StringPiece& piece); - -#endif /* _PCRE_STRINGPIECE_H */ diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/include/pcrecpp.h b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/include/pcrecpp.h deleted file mode 100644 index 3e594b0d..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/include/pcrecpp.h +++ /dev/null @@ -1,710 +0,0 @@ -// Copyright (c) 2005, Google Inc. -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -// -// Author: Sanjay Ghemawat -// Support for PCRE_XXX modifiers added by Giuseppe Maxia, July 2005 - -#ifndef _PCRECPP_H -#define _PCRECPP_H - -// C++ interface to the pcre regular-expression library. RE supports -// Perl-style regular expressions (with extensions like \d, \w, \s, -// ...). -// -// ----------------------------------------------------------------------- -// REGEXP SYNTAX: -// -// This module is part of the pcre library and hence supports its syntax -// for regular expressions. -// -// The syntax is pretty similar to Perl's. For those not familiar -// with Perl's regular expressions, here are some examples of the most -// commonly used extensions: -// -// "hello (\\w+) world" -- \w matches a "word" character -// "version (\\d+)" -- \d matches a digit -// "hello\\s+world" -- \s matches any whitespace character -// "\\b(\\w+)\\b" -- \b matches empty string at a word boundary -// "(?i)hello" -- (?i) turns on case-insensitive matching -// "/\\*(.*?)\\*/" -- .*? matches . minimum no. of times possible -// -// ----------------------------------------------------------------------- -// MATCHING INTERFACE: -// -// The "FullMatch" operation checks that supplied text matches a -// supplied pattern exactly. -// -// Example: successful match -// pcrecpp::RE re("h.*o"); -// re.FullMatch("hello"); -// -// Example: unsuccessful match (requires full match): -// pcrecpp::RE re("e"); -// !re.FullMatch("hello"); -// -// Example: creating a temporary RE object: -// pcrecpp::RE("h.*o").FullMatch("hello"); -// -// You can pass in a "const char*" or a "string" for "text". The -// examples below tend to use a const char*. -// -// You can, as in the different examples above, store the RE object -// explicitly in a variable or use a temporary RE object. The -// examples below use one mode or the other arbitrarily. Either -// could correctly be used for any of these examples. -// -// ----------------------------------------------------------------------- -// MATCHING WITH SUB-STRING EXTRACTION: -// -// You can supply extra pointer arguments to extract matched subpieces. -// -// Example: extracts "ruby" into "s" and 1234 into "i" -// int i; -// string s; -// pcrecpp::RE re("(\\w+):(\\d+)"); -// re.FullMatch("ruby:1234", &s, &i); -// -// Example: does not try to extract any extra sub-patterns -// re.FullMatch("ruby:1234", &s); -// -// Example: does not try to extract into NULL -// re.FullMatch("ruby:1234", NULL, &i); -// -// Example: integer overflow causes failure -// !re.FullMatch("ruby:1234567891234", NULL, &i); -// -// Example: fails because there aren't enough sub-patterns: -// !pcrecpp::RE("\\w+:\\d+").FullMatch("ruby:1234", &s); -// -// Example: fails because string cannot be stored in integer -// !pcrecpp::RE("(.*)").FullMatch("ruby", &i); -// -// The provided pointer arguments can be pointers to any scalar numeric -// type, or one of -// string (matched piece is copied to string) -// StringPiece (StringPiece is mutated to point to matched piece) -// T (where "bool T::ParseFrom(const char*, int)" exists) -// NULL (the corresponding matched sub-pattern is not copied) -// -// CAVEAT: An optional sub-pattern that does not exist in the matched -// string is assigned the empty string. Therefore, the following will -// return false (because the empty string is not a valid number): -// int number; -// pcrecpp::RE::FullMatch("abc", "[a-z]+(\\d+)?", &number); -// -// ----------------------------------------------------------------------- -// DO_MATCH -// -// The matching interface supports at most 16 arguments per call. -// If you need more, consider using the more general interface -// pcrecpp::RE::DoMatch(). See pcrecpp.h for the signature for DoMatch. -// -// ----------------------------------------------------------------------- -// PARTIAL MATCHES -// -// You can use the "PartialMatch" operation when you want the pattern -// to match any substring of the text. -// -// Example: simple search for a string: -// pcrecpp::RE("ell").PartialMatch("hello"); -// -// Example: find first number in a string: -// int number; -// pcrecpp::RE re("(\\d+)"); -// re.PartialMatch("x*100 + 20", &number); -// assert(number == 100); -// -// ----------------------------------------------------------------------- -// UTF-8 AND THE MATCHING INTERFACE: -// -// By default, pattern and text are plain text, one byte per character. -// The UTF8 flag, passed to the constructor, causes both pattern -// and string to be treated as UTF-8 text, still a byte stream but -// potentially multiple bytes per character. In practice, the text -// is likelier to be UTF-8 than the pattern, but the match returned -// may depend on the UTF8 flag, so always use it when matching -// UTF8 text. E.g., "." will match one byte normally but with UTF8 -// set may match up to three bytes of a multi-byte character. -// -// Example: -// pcrecpp::RE_Options options; -// options.set_utf8(); -// pcrecpp::RE re(utf8_pattern, options); -// re.FullMatch(utf8_string); -// -// Example: using the convenience function UTF8(): -// pcrecpp::RE re(utf8_pattern, pcrecpp::UTF8()); -// re.FullMatch(utf8_string); -// -// NOTE: The UTF8 option is ignored if pcre was not configured with the -// --enable-utf8 flag. -// -// ----------------------------------------------------------------------- -// PASSING MODIFIERS TO THE REGULAR EXPRESSION ENGINE -// -// PCRE defines some modifiers to change the behavior of the regular -// expression engine. -// The C++ wrapper defines an auxiliary class, RE_Options, as a vehicle -// to pass such modifiers to a RE class. -// -// Currently, the following modifiers are supported -// -// modifier description Perl corresponding -// -// PCRE_CASELESS case insensitive match /i -// PCRE_MULTILINE multiple lines match /m -// PCRE_DOTALL dot matches newlines /s -// PCRE_DOLLAR_ENDONLY $ matches only at end N/A -// PCRE_EXTRA strict escape parsing N/A -// PCRE_EXTENDED ignore whitespaces /x -// PCRE_UTF8 handles UTF8 chars built-in -// PCRE_UNGREEDY reverses * and *? N/A -// PCRE_NO_AUTO_CAPTURE disables matching parens N/A (*) -// -// (For a full account on how each modifier works, please check the -// PCRE API reference manual). -// -// (*) Both Perl and PCRE allow non matching parentheses by means of the -// "?:" modifier within the pattern itself. e.g. (?:ab|cd) does not -// capture, while (ab|cd) does. -// -// For each modifier, there are two member functions whose name is made -// out of the modifier in lowercase, without the "PCRE_" prefix. For -// instance, PCRE_CASELESS is handled by -// bool caseless(), -// which returns true if the modifier is set, and -// RE_Options & set_caseless(bool), -// which sets or unsets the modifier. -// -// Moreover, PCRE_EXTRA_MATCH_LIMIT can be accessed through the -// set_match_limit() and match_limit() member functions. -// Setting match_limit to a non-zero value will limit the executation of -// pcre to keep it from doing bad things like blowing the stack or taking -// an eternity to return a result. A value of 5000 is good enough to stop -// stack blowup in a 2MB thread stack. Setting match_limit to zero will -// disable match limiting. Alternately, you can set match_limit_recursion() -// which uses PCRE_EXTRA_MATCH_LIMIT_RECURSION to limit how much pcre -// recurses. match_limit() caps the number of matches pcre does; -// match_limit_recrusion() caps the depth of recursion. -// -// Normally, to pass one or more modifiers to a RE class, you declare -// a RE_Options object, set the appropriate options, and pass this -// object to a RE constructor. Example: -// -// RE_options opt; -// opt.set_caseless(true); -// -// if (RE("HELLO", opt).PartialMatch("hello world")) ... -// -// RE_options has two constructors. The default constructor takes no -// arguments and creates a set of flags that are off by default. -// -// The optional parameter 'option_flags' is to facilitate transfer -// of legacy code from C programs. This lets you do -// RE(pattern, RE_Options(PCRE_CASELESS|PCRE_MULTILINE)).PartialMatch(str); -// -// But new code is better off doing -// RE(pattern, -// RE_Options().set_caseless(true).set_multiline(true)).PartialMatch(str); -// (See below) -// -// If you are going to pass one of the most used modifiers, there are some -// convenience functions that return a RE_Options class with the -// appropriate modifier already set: -// CASELESS(), UTF8(), MULTILINE(), DOTALL(), EXTENDED() -// -// If you need to set several options at once, and you don't want to go -// through the pains of declaring a RE_Options object and setting several -// options, there is a parallel method that give you such ability on the -// fly. You can concatenate several set_xxxxx member functions, since each -// of them returns a reference to its class object. e.g.: to pass -// PCRE_CASELESS, PCRE_EXTENDED, and PCRE_MULTILINE to a RE with one -// statement, you may write -// -// RE(" ^ xyz \\s+ .* blah$", RE_Options() -// .set_caseless(true) -// .set_extended(true) -// .set_multiline(true)).PartialMatch(sometext); -// -// ----------------------------------------------------------------------- -// SCANNING TEXT INCREMENTALLY -// -// The "Consume" operation may be useful if you want to repeatedly -// match regular expressions at the front of a string and skip over -// them as they match. This requires use of the "StringPiece" type, -// which represents a sub-range of a real string. Like RE, StringPiece -// is defined in the pcrecpp namespace. -// -// Example: read lines of the form "var = value" from a string. -// string contents = ...; // Fill string somehow -// pcrecpp::StringPiece input(contents); // Wrap in a StringPiece -// -// string var; -// int value; -// pcrecpp::RE re("(\\w+) = (\\d+)\n"); -// while (re.Consume(&input, &var, &value)) { -// ...; -// } -// -// Each successful call to "Consume" will set "var/value", and also -// advance "input" so it points past the matched text. -// -// The "FindAndConsume" operation is similar to "Consume" but does not -// anchor your match at the beginning of the string. For example, you -// could extract all words from a string by repeatedly calling -// pcrecpp::RE("(\\w+)").FindAndConsume(&input, &word) -// -// ----------------------------------------------------------------------- -// PARSING HEX/OCTAL/C-RADIX NUMBERS -// -// By default, if you pass a pointer to a numeric value, the -// corresponding text is interpreted as a base-10 number. You can -// instead wrap the pointer with a call to one of the operators Hex(), -// Octal(), or CRadix() to interpret the text in another base. The -// CRadix operator interprets C-style "0" (base-8) and "0x" (base-16) -// prefixes, but defaults to base-10. -// -// Example: -// int a, b, c, d; -// pcrecpp::RE re("(.*) (.*) (.*) (.*)"); -// re.FullMatch("100 40 0100 0x40", -// pcrecpp::Octal(&a), pcrecpp::Hex(&b), -// pcrecpp::CRadix(&c), pcrecpp::CRadix(&d)); -// will leave 64 in a, b, c, and d. -// -// ----------------------------------------------------------------------- -// REPLACING PARTS OF STRINGS -// -// You can replace the first match of "pattern" in "str" with -// "rewrite". Within "rewrite", backslash-escaped digits (\1 to \9) -// can be used to insert text matching corresponding parenthesized -// group from the pattern. \0 in "rewrite" refers to the entire -// matching text. E.g., -// -// string s = "yabba dabba doo"; -// pcrecpp::RE("b+").Replace("d", &s); -// -// will leave "s" containing "yada dabba doo". The result is true if -// the pattern matches and a replacement occurs, or false otherwise. -// -// GlobalReplace() is like Replace(), except that it replaces all -// occurrences of the pattern in the string with the rewrite. -// Replacements are not subject to re-matching. E.g., -// -// string s = "yabba dabba doo"; -// pcrecpp::RE("b+").GlobalReplace("d", &s); -// -// will leave "s" containing "yada dada doo". It returns the number -// of replacements made. -// -// Extract() is like Replace(), except that if the pattern matches, -// "rewrite" is copied into "out" (an additional argument) with -// substitutions. The non-matching portions of "text" are ignored. -// Returns true iff a match occurred and the extraction happened -// successfully. If no match occurs, the string is left unaffected. - - -#include -#include -#include // defines the Arg class -// This isn't technically needed here, but we include it -// anyway so folks who include pcrecpp.h don't have to. -#include - -namespace pcrecpp { - -#define PCRE_SET_OR_CLEAR(b, o) \ - if (b) all_options_ |= (o); else all_options_ &= ~(o); \ - return *this - -#define PCRE_IS_SET(o) \ - (all_options_ & o) == o - -/***** Compiling regular expressions: the RE class *****/ - -// RE_Options allow you to set options to be passed along to pcre, -// along with other options we put on top of pcre. -// Only 9 modifiers, plus match_limit and match_limit_recursion, -// are supported now. -class PCRECPP_EXP_DEFN RE_Options { - public: - // constructor - RE_Options() : match_limit_(0), match_limit_recursion_(0), all_options_(0) {} - - // alternative constructor. - // To facilitate transfer of legacy code from C programs - // - // This lets you do - // RE(pattern, RE_Options(PCRE_CASELESS|PCRE_MULTILINE)).PartialMatch(str); - // But new code is better off doing - // RE(pattern, - // RE_Options().set_caseless(true).set_multiline(true)).PartialMatch(str); - RE_Options(int option_flags) : match_limit_(0), match_limit_recursion_(0), - all_options_(option_flags) {} - // we're fine with the default destructor, copy constructor, etc. - - // accessors and mutators - int match_limit() const { return match_limit_; }; - RE_Options &set_match_limit(int limit) { - match_limit_ = limit; - return *this; - } - - int match_limit_recursion() const { return match_limit_recursion_; }; - RE_Options &set_match_limit_recursion(int limit) { - match_limit_recursion_ = limit; - return *this; - } - - bool caseless() const { - return PCRE_IS_SET(PCRE_CASELESS); - } - RE_Options &set_caseless(bool x) { - PCRE_SET_OR_CLEAR(x, PCRE_CASELESS); - } - - bool multiline() const { - return PCRE_IS_SET(PCRE_MULTILINE); - } - RE_Options &set_multiline(bool x) { - PCRE_SET_OR_CLEAR(x, PCRE_MULTILINE); - } - - bool dotall() const { - return PCRE_IS_SET(PCRE_DOTALL); - } - RE_Options &set_dotall(bool x) { - PCRE_SET_OR_CLEAR(x, PCRE_DOTALL); - } - - bool extended() const { - return PCRE_IS_SET(PCRE_EXTENDED); - } - RE_Options &set_extended(bool x) { - PCRE_SET_OR_CLEAR(x, PCRE_EXTENDED); - } - - bool dollar_endonly() const { - return PCRE_IS_SET(PCRE_DOLLAR_ENDONLY); - } - RE_Options &set_dollar_endonly(bool x) { - PCRE_SET_OR_CLEAR(x, PCRE_DOLLAR_ENDONLY); - } - - bool extra() const { - return PCRE_IS_SET(PCRE_EXTRA); - } - RE_Options &set_extra(bool x) { - PCRE_SET_OR_CLEAR(x, PCRE_EXTRA); - } - - bool ungreedy() const { - return PCRE_IS_SET(PCRE_UNGREEDY); - } - RE_Options &set_ungreedy(bool x) { - PCRE_SET_OR_CLEAR(x, PCRE_UNGREEDY); - } - - bool utf8() const { - return PCRE_IS_SET(PCRE_UTF8); - } - RE_Options &set_utf8(bool x) { - PCRE_SET_OR_CLEAR(x, PCRE_UTF8); - } - - bool no_auto_capture() const { - return PCRE_IS_SET(PCRE_NO_AUTO_CAPTURE); - } - RE_Options &set_no_auto_capture(bool x) { - PCRE_SET_OR_CLEAR(x, PCRE_NO_AUTO_CAPTURE); - } - - RE_Options &set_all_options(int opt) { - all_options_ = opt; - return *this; - } - int all_options() const { - return all_options_ ; - } - - // TODO: add other pcre flags - - private: - int match_limit_; - int match_limit_recursion_; - int all_options_; -}; - -// These functions return some common RE_Options -static inline RE_Options UTF8() { - return RE_Options().set_utf8(true); -} - -static inline RE_Options CASELESS() { - return RE_Options().set_caseless(true); -} -static inline RE_Options MULTILINE() { - return RE_Options().set_multiline(true); -} - -static inline RE_Options DOTALL() { - return RE_Options().set_dotall(true); -} - -static inline RE_Options EXTENDED() { - return RE_Options().set_extended(true); -} - -// Interface for regular expression matching. Also corresponds to a -// pre-compiled regular expression. An "RE" object is safe for -// concurrent use by multiple threads. -class PCRECPP_EXP_DEFN RE { - public: - // We provide implicit conversions from strings so that users can - // pass in a string or a "const char*" wherever an "RE" is expected. - RE(const string& pat) { Init(pat, NULL); } - RE(const string& pat, const RE_Options& option) { Init(pat, &option); } - RE(const char* pat) { Init(pat, NULL); } - RE(const char* pat, const RE_Options& option) { Init(pat, &option); } - RE(const unsigned char* pat) { - Init(reinterpret_cast(pat), NULL); - } - RE(const unsigned char* pat, const RE_Options& option) { - Init(reinterpret_cast(pat), &option); - } - - // Copy constructor & assignment - note that these are expensive - // because they recompile the expression. - RE(const RE& re) { Init(re.pattern_, &re.options_); } - const RE& operator=(const RE& re) { - if (this != &re) { - Cleanup(); - - // This is the code that originally came from Google - // Init(re.pattern_.c_str(), &re.options_); - - // This is the replacement from Ari Pollak - Init(re.pattern_, &re.options_); - } - return *this; - } - - - ~RE(); - - // The string specification for this RE. E.g. - // RE re("ab*c?d+"); - // re.pattern(); // "ab*c?d+" - const string& pattern() const { return pattern_; } - - // If RE could not be created properly, returns an error string. - // Else returns the empty string. - const string& error() const { return *error_; } - - /***** The useful part: the matching interface *****/ - - // This is provided so one can do pattern.ReplaceAll() just as - // easily as ReplaceAll(pattern-text, ....) - - bool FullMatch(const StringPiece& text, - const Arg& ptr1 = no_arg, - const Arg& ptr2 = no_arg, - const Arg& ptr3 = no_arg, - const Arg& ptr4 = no_arg, - const Arg& ptr5 = no_arg, - const Arg& ptr6 = no_arg, - const Arg& ptr7 = no_arg, - const Arg& ptr8 = no_arg, - const Arg& ptr9 = no_arg, - const Arg& ptr10 = no_arg, - const Arg& ptr11 = no_arg, - const Arg& ptr12 = no_arg, - const Arg& ptr13 = no_arg, - const Arg& ptr14 = no_arg, - const Arg& ptr15 = no_arg, - const Arg& ptr16 = no_arg) const; - - bool PartialMatch(const StringPiece& text, - const Arg& ptr1 = no_arg, - const Arg& ptr2 = no_arg, - const Arg& ptr3 = no_arg, - const Arg& ptr4 = no_arg, - const Arg& ptr5 = no_arg, - const Arg& ptr6 = no_arg, - const Arg& ptr7 = no_arg, - const Arg& ptr8 = no_arg, - const Arg& ptr9 = no_arg, - const Arg& ptr10 = no_arg, - const Arg& ptr11 = no_arg, - const Arg& ptr12 = no_arg, - const Arg& ptr13 = no_arg, - const Arg& ptr14 = no_arg, - const Arg& ptr15 = no_arg, - const Arg& ptr16 = no_arg) const; - - bool Consume(StringPiece* input, - const Arg& ptr1 = no_arg, - const Arg& ptr2 = no_arg, - const Arg& ptr3 = no_arg, - const Arg& ptr4 = no_arg, - const Arg& ptr5 = no_arg, - const Arg& ptr6 = no_arg, - const Arg& ptr7 = no_arg, - const Arg& ptr8 = no_arg, - const Arg& ptr9 = no_arg, - const Arg& ptr10 = no_arg, - const Arg& ptr11 = no_arg, - const Arg& ptr12 = no_arg, - const Arg& ptr13 = no_arg, - const Arg& ptr14 = no_arg, - const Arg& ptr15 = no_arg, - const Arg& ptr16 = no_arg) const; - - bool FindAndConsume(StringPiece* input, - const Arg& ptr1 = no_arg, - const Arg& ptr2 = no_arg, - const Arg& ptr3 = no_arg, - const Arg& ptr4 = no_arg, - const Arg& ptr5 = no_arg, - const Arg& ptr6 = no_arg, - const Arg& ptr7 = no_arg, - const Arg& ptr8 = no_arg, - const Arg& ptr9 = no_arg, - const Arg& ptr10 = no_arg, - const Arg& ptr11 = no_arg, - const Arg& ptr12 = no_arg, - const Arg& ptr13 = no_arg, - const Arg& ptr14 = no_arg, - const Arg& ptr15 = no_arg, - const Arg& ptr16 = no_arg) const; - - bool Replace(const StringPiece& rewrite, - string *str) const; - - int GlobalReplace(const StringPiece& rewrite, - string *str) const; - - bool Extract(const StringPiece &rewrite, - const StringPiece &text, - string *out) const; - - // Escapes all potentially meaningful regexp characters in - // 'unquoted'. The returned string, used as a regular expression, - // will exactly match the original string. For example, - // 1.5-2.0? - // may become: - // 1\.5\-2\.0\? - // Note QuoteMeta behaves the same as perl's QuoteMeta function, - // *except* that it escapes the NUL character (\0) as backslash + 0, - // rather than backslash + NUL. - static string QuoteMeta(const StringPiece& unquoted); - - - /***** Generic matching interface *****/ - - // Type of match (TODO: Should be restructured as part of RE_Options) - enum Anchor { - UNANCHORED, // No anchoring - ANCHOR_START, // Anchor at start only - ANCHOR_BOTH // Anchor at start and end - }; - - // General matching routine. Stores the length of the match in - // "*consumed" if successful. - bool DoMatch(const StringPiece& text, - Anchor anchor, - int* consumed, - const Arg* const* args, int n) const; - - // Return the number of capturing subpatterns, or -1 if the - // regexp wasn't valid on construction. - int NumberOfCapturingGroups() const; - - // The default value for an argument, to indicate the end of the argument - // list. This must be used only in optional argument defaults. It should NOT - // be passed explicitly. Some people have tried to use it like this: - // - // FullMatch(x, y, &z, no_arg, &w); - // - // This is a mistake, and will not work. - static Arg no_arg; - - private: - - void Init(const string& pattern, const RE_Options* options); - void Cleanup(); - - // Match against "text", filling in "vec" (up to "vecsize" * 2/3) with - // pairs of integers for the beginning and end positions of matched - // text. The first pair corresponds to the entire matched text; - // subsequent pairs correspond, in order, to parentheses-captured - // matches. Returns the number of pairs (one more than the number of - // the last subpattern with a match) if matching was successful - // and zero if the match failed. - // I.e. for RE("(foo)|(bar)|(baz)") it will return 2, 3, and 4 when matching - // against "foo", "bar", and "baz" respectively. - // When matching RE("(foo)|hello") against "hello", it will return 1. - // But the values for all subpattern are filled in into "vec". - int TryMatch(const StringPiece& text, - int startpos, - Anchor anchor, - bool empty_ok, - int *vec, - int vecsize) const; - - // Append the "rewrite" string, with backslash subsitutions from "text" - // and "vec", to string "out". - bool Rewrite(string *out, - const StringPiece& rewrite, - const StringPiece& text, - int *vec, - int veclen) const; - - // internal implementation for DoMatch - bool DoMatchImpl(const StringPiece& text, - Anchor anchor, - int* consumed, - const Arg* const args[], - int n, - int* vec, - int vecsize) const; - - // Compile the regexp for the specified anchoring mode - pcre* Compile(Anchor anchor); - - string pattern_; - RE_Options options_; - pcre* re_full_; // For full matches - pcre* re_partial_; // For partial matches - const string* error_; // Error indicator (or points to empty string) -}; - -} // namespace pcrecpp - -#endif /* _PCRECPP_H */ diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/include/pcrecpparg.h b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/include/pcrecpparg.h deleted file mode 100644 index b4f9c3f4..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/include/pcrecpparg.h +++ /dev/null @@ -1,174 +0,0 @@ -// Copyright (c) 2005, Google Inc. -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -// -// Author: Sanjay Ghemawat - -#ifndef _PCRECPPARG_H -#define _PCRECPPARG_H - -#include // for NULL -#include - -#include - -namespace pcrecpp { - -class StringPiece; - -// Hex/Octal/Binary? - -// Special class for parsing into objects that define a ParseFrom() method -template -class _RE_MatchObject { - public: - static inline bool Parse(const char* str, int n, void* dest) { - if (dest == NULL) return true; - T* object = reinterpret_cast(dest); - return object->ParseFrom(str, n); - } -}; - -class PCRECPP_EXP_DEFN Arg { - public: - // Empty constructor so we can declare arrays of Arg - Arg(); - - // Constructor specially designed for NULL arguments - Arg(void*); - - typedef bool (*Parser)(const char* str, int n, void* dest); - -// Type-specific parsers -#define PCRE_MAKE_PARSER(type,name) \ - Arg(type* p) : arg_(p), parser_(name) { } \ - Arg(type* p, Parser parser) : arg_(p), parser_(parser) { } - - - PCRE_MAKE_PARSER(char, parse_char); - PCRE_MAKE_PARSER(unsigned char, parse_uchar); - PCRE_MAKE_PARSER(short, parse_short); - PCRE_MAKE_PARSER(unsigned short, parse_ushort); - PCRE_MAKE_PARSER(int, parse_int); - PCRE_MAKE_PARSER(unsigned int, parse_uint); - PCRE_MAKE_PARSER(long, parse_long); - PCRE_MAKE_PARSER(unsigned long, parse_ulong); -#if 1 - PCRE_MAKE_PARSER(long long, parse_longlong); -#endif -#if 1 - PCRE_MAKE_PARSER(unsigned long long, parse_ulonglong); -#endif - PCRE_MAKE_PARSER(float, parse_float); - PCRE_MAKE_PARSER(double, parse_double); - PCRE_MAKE_PARSER(std::string, parse_string); - PCRE_MAKE_PARSER(StringPiece, parse_stringpiece); - -#undef PCRE_MAKE_PARSER - - // Generic constructor - template Arg(T*, Parser parser); - // Generic constructor template - template Arg(T* p) - : arg_(p), parser_(_RE_MatchObject::Parse) { - } - - // Parse the data - bool Parse(const char* str, int n) const; - - private: - void* arg_; - Parser parser_; - - static bool parse_null (const char* str, int n, void* dest); - static bool parse_char (const char* str, int n, void* dest); - static bool parse_uchar (const char* str, int n, void* dest); - static bool parse_float (const char* str, int n, void* dest); - static bool parse_double (const char* str, int n, void* dest); - static bool parse_string (const char* str, int n, void* dest); - static bool parse_stringpiece (const char* str, int n, void* dest); - -#define PCRE_DECLARE_INTEGER_PARSER(name) \ - private: \ - static bool parse_ ## name(const char* str, int n, void* dest); \ - static bool parse_ ## name ## _radix( \ - const char* str, int n, void* dest, int radix); \ - public: \ - static bool parse_ ## name ## _hex(const char* str, int n, void* dest); \ - static bool parse_ ## name ## _octal(const char* str, int n, void* dest); \ - static bool parse_ ## name ## _cradix(const char* str, int n, void* dest) - - PCRE_DECLARE_INTEGER_PARSER(short); - PCRE_DECLARE_INTEGER_PARSER(ushort); - PCRE_DECLARE_INTEGER_PARSER(int); - PCRE_DECLARE_INTEGER_PARSER(uint); - PCRE_DECLARE_INTEGER_PARSER(long); - PCRE_DECLARE_INTEGER_PARSER(ulong); - PCRE_DECLARE_INTEGER_PARSER(longlong); - PCRE_DECLARE_INTEGER_PARSER(ulonglong); - -#undef PCRE_DECLARE_INTEGER_PARSER -}; - -inline Arg::Arg() : arg_(NULL), parser_(parse_null) { } -inline Arg::Arg(void* p) : arg_(p), parser_(parse_null) { } - -inline bool Arg::Parse(const char* str, int n) const { - return (*parser_)(str, n, arg_); -} - -// This part of the parser, appropriate only for ints, deals with bases -#define MAKE_INTEGER_PARSER(type, name) \ - inline Arg Hex(type* ptr) { \ - return Arg(ptr, Arg::parse_ ## name ## _hex); } \ - inline Arg Octal(type* ptr) { \ - return Arg(ptr, Arg::parse_ ## name ## _octal); } \ - inline Arg CRadix(type* ptr) { \ - return Arg(ptr, Arg::parse_ ## name ## _cradix); } - -MAKE_INTEGER_PARSER(short, short) /* */ -MAKE_INTEGER_PARSER(unsigned short, ushort) /* */ -MAKE_INTEGER_PARSER(int, int) /* Don't use semicolons */ -MAKE_INTEGER_PARSER(unsigned int, uint) /* after these statement */ -MAKE_INTEGER_PARSER(long, long) /* because they can cause */ -MAKE_INTEGER_PARSER(unsigned long, ulong) /* compiler warnings if */ -#if 1 /* the checking level is */ -MAKE_INTEGER_PARSER(long long, longlong) /* turned up high enough. */ -#endif /* */ -#if 1 /* */ -MAKE_INTEGER_PARSER(unsigned long long, ulonglong) /* */ -#endif - -#undef PCRE_IS_SET -#undef PCRE_SET_OR_CLEAR -#undef MAKE_INTEGER_PARSER - -} // namespace pcrecpp - - -#endif /* _PCRECPPARG_H */ diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/include/pcreposix.h b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/include/pcreposix.h deleted file mode 100644 index c77c0b05..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/include/pcreposix.h +++ /dev/null @@ -1,146 +0,0 @@ -/************************************************* -* Perl-Compatible Regular Expressions * -*************************************************/ - -#ifndef _PCREPOSIX_H -#define _PCREPOSIX_H - -/* This is the header for the POSIX wrapper interface to the PCRE Perl- -Compatible Regular Expression library. It defines the things POSIX says should -be there. I hope. - - Copyright (c) 1997-2012 University of Cambridge - ------------------------------------------------------------------------------ -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - - * Neither the name of the University of Cambridge nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. ------------------------------------------------------------------------------ -*/ - -/* Have to include stdlib.h in order to ensure that size_t is defined. */ - -#include - -/* Allow for C++ users */ - -#ifdef __cplusplus -extern "C" { -#endif - -/* Options, mostly defined by POSIX, but with some extras. */ - -#define REG_ICASE 0x0001 /* Maps to PCRE_CASELESS */ -#define REG_NEWLINE 0x0002 /* Maps to PCRE_MULTILINE */ -#define REG_NOTBOL 0x0004 /* Maps to PCRE_NOTBOL */ -#define REG_NOTEOL 0x0008 /* Maps to PCRE_NOTEOL */ -#define REG_DOTALL 0x0010 /* NOT defined by POSIX; maps to PCRE_DOTALL */ -#define REG_NOSUB 0x0020 /* Maps to PCRE_NO_AUTO_CAPTURE */ -#define REG_UTF8 0x0040 /* NOT defined by POSIX; maps to PCRE_UTF8 */ -#define REG_STARTEND 0x0080 /* BSD feature: pass subject string by so,eo */ -#define REG_NOTEMPTY 0x0100 /* NOT defined by POSIX; maps to PCRE_NOTEMPTY */ -#define REG_UNGREEDY 0x0200 /* NOT defined by POSIX; maps to PCRE_UNGREEDY */ -#define REG_UCP 0x0400 /* NOT defined by POSIX; maps to PCRE_UCP */ - -/* This is not used by PCRE, but by defining it we make it easier -to slot PCRE into existing programs that make POSIX calls. */ - -#define REG_EXTENDED 0 - -/* Error values. Not all these are relevant or used by the wrapper. */ - -enum { - REG_ASSERT = 1, /* internal error ? */ - REG_BADBR, /* invalid repeat counts in {} */ - REG_BADPAT, /* pattern error */ - REG_BADRPT, /* ? * + invalid */ - REG_EBRACE, /* unbalanced {} */ - REG_EBRACK, /* unbalanced [] */ - REG_ECOLLATE, /* collation error - not relevant */ - REG_ECTYPE, /* bad class */ - REG_EESCAPE, /* bad escape sequence */ - REG_EMPTY, /* empty expression */ - REG_EPAREN, /* unbalanced () */ - REG_ERANGE, /* bad range inside [] */ - REG_ESIZE, /* expression too big */ - REG_ESPACE, /* failed to get memory */ - REG_ESUBREG, /* bad back reference */ - REG_INVARG, /* bad argument */ - REG_NOMATCH /* match failed */ -}; - - -/* The structure representing a compiled regular expression. */ - -typedef struct { - void *re_pcre; - size_t re_nsub; - size_t re_erroffset; -} regex_t; - -/* The structure in which a captured offset is returned. */ - -typedef int regoff_t; - -typedef struct { - regoff_t rm_so; - regoff_t rm_eo; -} regmatch_t; - -/* When an application links to a PCRE DLL in Windows, the symbols that are -imported have to be identified as such. When building PCRE, the appropriate -export settings are needed, and are set in pcreposix.c before including this -file. */ - -#if defined(_WIN32) && !defined(PCRE_STATIC) && !defined(PCREPOSIX_EXP_DECL) -# define PCREPOSIX_EXP_DECL extern __declspec(dllimport) -# define PCREPOSIX_EXP_DEFN __declspec(dllimport) -#endif - -/* By default, we use the standard "extern" declarations. */ - -#ifndef PCREPOSIX_EXP_DECL -# ifdef __cplusplus -# define PCREPOSIX_EXP_DECL extern "C" -# define PCREPOSIX_EXP_DEFN extern "C" -# else -# define PCREPOSIX_EXP_DECL extern -# define PCREPOSIX_EXP_DEFN extern -# endif -#endif - -/* The functions */ - -PCREPOSIX_EXP_DECL int regcomp(regex_t *, const char *, int); -PCREPOSIX_EXP_DECL int regexec(const regex_t *, const char *, size_t, - regmatch_t *, int); -PCREPOSIX_EXP_DECL size_t regerror(int, const regex_t *, char *, size_t); -PCREPOSIX_EXP_DECL void regfree(regex_t *); - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /* End of pcreposix.h */ diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/lib/libpcre.a b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/lib/libpcre.a deleted file mode 100644 index 42892ba54f220e899d20e338f63f8b4edc272785..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 228032 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ⅈ`=F|Pm3aLZxk8!;d%rFNn^4Ng93Fd01a$wTf+ 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%0AK$Ag30~A6X%fnkoqdV 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 diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/lib/libpcre.la b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/lib/libpcre.la deleted file mode 100755 index b86c0d8a..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/lib/libpcre.la +++ /dev/null @@ -1,41 +0,0 @@ -# libpcre.la - a libtool library file -# Generated by libtool (GNU libtool) 2.4.6 -# -# Please DO NOT delete this file! -# It is necessary for linking the library. - -# The name that we can dlopen(3). -dlname='' - -# Names of this library. -library_names='' - -# The name of the static archive. -old_library='libpcre.a' - -# Linker flags that cannot go in dependency_libs. -inherited_linker_flags=' ' - -# Libraries that this one depends upon. -dependency_libs=' -L/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS15.2.sdk/usr/lib' - -# Names of additional weak libraries provided by this library -weak_library_names='' - -# Version information for libpcre. -current=3 -age=2 -revision=9 - -# Is this an already installed library? -installed=yes - -# Should we warn about portability when linking against -modules? -shouldnotlink=no - -# Files to dlopen/dlpreopen -dlopen='' -dlpreopen='' - -# Directory that this library needs to be installed in: -libdir='/Users/sanchez/work/vied/ios/vpn/playground/ss-libev-build/ShadowSocks-libev-iOS/ShadowSocks-libev-iOS/pcre/pcre/armv7s/lib' diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/lib/libpcrecpp.a b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/lib/libpcrecpp.a deleted file mode 100644 index 54f874666995c93348259bcefc94afe9fc8e5558..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34248 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 diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/lib/libpcrecpp.la b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/lib/libpcrecpp.la deleted file mode 100755 index 3cd34fa9..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/lib/libpcrecpp.la +++ /dev/null @@ -1,41 +0,0 @@ -# libpcrecpp.la - a libtool library file -# Generated by libtool (GNU libtool) 2.4.6 -# -# Please DO NOT delete this file! -# It is necessary for linking the library. - -# The name that we can dlopen(3). -dlname='' - -# Names of this library. -library_names='' - -# The name of the static archive. -old_library='libpcrecpp.a' - -# Linker flags that cannot go in dependency_libs. -inherited_linker_flags=' ' - -# Libraries that this one depends upon. -dependency_libs=' -L/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS15.2.sdk/usr/lib /Users/sanchez/work/vied/ios/vpn/playground/ss-libev-build/ShadowSocks-libev-iOS/ShadowSocks-libev-iOS/pcre/pcre/armv7s/lib/libpcre.la' - -# Names of additional weak libraries provided by this library -weak_library_names='' - -# Version information for libpcrecpp. -current=0 -age=0 -revision=1 - -# Is this an already installed library? -installed=yes - -# Should we warn about portability when linking against -modules? -shouldnotlink=no - -# Files to dlopen/dlpreopen -dlopen='' -dlpreopen='' - -# Directory that this library needs to be installed in: -libdir='/Users/sanchez/work/vied/ios/vpn/playground/ss-libev-build/ShadowSocks-libev-iOS/ShadowSocks-libev-iOS/pcre/pcre/armv7s/lib' diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/lib/libpcreposix.a b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/lib/libpcreposix.a deleted file mode 100644 index ed1f00e4b5cd29b88fd9cebee2ca45de35d8422f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3208 zcmbtWe`s6R6~6E3S&?NsvAwipnNzOa+9+|HN^a()#dLBizinBw*omPTUHbGaKUpGr z@2S#r7PoA(%U1G-2Ws{McYlOb*bkV85T&Brx#M!vp*G1@`xI{#Abf z6P4+J-#@T-FXzyXbJ(jWdyanRP-s}@M-Lwv8xAoDrw8Ob(CFwdIl9BqK4>MSO-4*T zX&YK9Wu_|DDJ^0f(UhjajiJ7W25RN;YJL0eQeXeW`<(*A-b8#n8A)kLGaWyrB-Fl} zWRFRyZTahsFE*NCH30(90BjZU;1xbcgLjZW!qE>u(wi_(pjZ+`v9wcG#jfzN;bUVp zPSzWUrFdHEa|G|EL5a%Vi{TE`f2gi*(joE*1>J2{MmlAhMb&4iM)aL~8a z@ftSH1J6&f5B2pUoDQ;mq9exRvVkvGL@VWC2Z+o%F;B>Ad015dJXv-)! zo%`M7Q(EQ@lZDq^zwNuqT4tB-lQVL&+~#Zed$2UW>&+7L-UzvK!BQ>&TbK@wuJdyv za(V5uvfzI_`>WV!NA|{S@tcjmE0+7Wt+aIsIo2g~-m~rAR}U9h)9VNDWT#gIK9U!h z=RNDbpgbyfA^uNg&$_g@T+fDr@)3BwTK37p(#0#RrEoD= z@{Crz8e@$y7V~_as(yZHPIk*!rEzuLlaV@w{24(kaF46Uw98Rk3}c-imi=Mr#cVj3W!>T;>lC}nYg1)$J{fMxx#pkn zZMqaJ_0)D?gyme_KH0rgxX4zjd-w9vJ=nQm>8YVwmEAA6W7(K+edfsFLOC!S7CLEH zj%SZ%p}hx}y?w0o^o-EiQta?9%0iAtKUnw7D0xqK)BEl-t5>A}M|}^LS+_gKdXK%g zdbOc_M@;(Zv6!dOEF8W*GcM*&iwE*UZR1~l>?=*zzQtUb)vLmG##zQMv(EBbTUnBs z&$IGfneFa*-#y>@2kGow)?1WVU`LlcvMvqwhKBHT#ddU(@E?rU$e#cPuAE-NGJXB&+Ba#fE{HUusen*{I9Js*B@MJTx4J38>^cDwso zE8m(s_^(&^o4}6`w0!73GcPw>8)h@Cy!O_HFZ&#-T$CS^-M^f@yqR~u7%X-4V+X}& zLhZ5k*ywg~rN{XNl-CwFwiY`C&q^!LUvA@9E>9UJ4D)*iw_7cbm=hY~s>RJ{G_6^j zb*J&yH!#6i+_1Eip(ZMxpeNNte1fBmYVePkQ-+o1af3hmeU?-$@^w7F#&_{v%-H^H z${1G@su9s9$g_?;d7MSeL_)RVX0@6=ZkQHUNN6Wj!(!v=1dk-tblSGGbVN;RJgq%F zr6C>D^rSV-wNuHImQEu_eQw`QJ0ztVlNu^X$0sz7^=i)CGEF`npJY)robnJvOmMv zoX9Q^hb$033E=(pN1?GtI(?_{Ing^D{xLQcXQH2lM!ovCg-X7sB$hpbv4cV_AMqZ{ z(|585>+J&X!aQ+Wk9a$P^U^mkfHTz3Gq(H&eG?m4_BR-NiLndBAq&KR0pQ&AIr#kr zHSH5wHiNO#@FNacApRWYKL9_3`RBoZfO+DO1>#Ad4SD>~t5O+e&pg`G|)AP$}r>K}YX*^j=5PdgQm;(UhAw*0(ixH07jm`mU44 zdbUQbwr+N`$I(`T&3-Tb`-2tvdTBbvD&o^}kSOpRKd$Mq2ght+S8U*^kuOabc)(?(R)xyz) was incorrectly compiled such that - the conditional was interpreted as a reference to capturing group 1 instead - of a test for recursion. Any group whose name began with R was - misinterpreted in this way. (The reference interpretation should only - happen if the group's name is precisely "R".) - -9. A number of bugs have been mended relating to match start-up optimizations - when the first thing in a pattern is a positive lookahead. These all - applied only when PCRE_NO_START_OPTIMIZE was *not* set: - - (a) A pattern such as (?=.*X)X$ was incorrectly optimized as if it needed - both an initial 'X' and a following 'X'. - (b) Some patterns starting with an assertion that started with .* were - incorrectly optimized as having to match at the start of the subject or - after a newline. There are cases where this is not true, for example, - (?=.*[A-Z])(?=.{8,16})(?!.*[\s]) matches after the start in lines that - start with spaces. Starting .* in an assertion is no longer taken as an - indication of matching at the start (or after a newline). - - -Version 8.39 14-June-2016 -------------------------- - -1. If PCRE_AUTO_CALLOUT was set on a pattern that had a (?# comment between - an item and its qualifier (for example, A(?#comment)?B) pcre_compile() - misbehaved. This bug was found by the LLVM fuzzer. - -2. Similar to the above, if an isolated \E was present between an item and its - qualifier when PCRE_AUTO_CALLOUT was set, pcre_compile() misbehaved. This - bug was found by the LLVM fuzzer. - -3. Further to 8.38/46, negated classes such as [^[:^ascii:]\d] were also not - working correctly in UCP mode. - -4. The POSIX wrapper function regexec() crashed if the option REG_STARTEND - was set when the pmatch argument was NULL. It now returns REG_INVARG. - -5. Allow for up to 32-bit numbers in the ordin() function in pcregrep. - -6. An empty \Q\E sequence between an item and its qualifier caused - pcre_compile() to misbehave when auto callouts were enabled. This bug was - found by the LLVM fuzzer. - -7. If a pattern that was compiled with PCRE_EXTENDED started with white - space or a #-type comment that was followed by (?-x), which turns off - PCRE_EXTENDED, and there was no subsequent (?x) to turn it on again, - pcre_compile() assumed that (?-x) applied to the whole pattern and - consequently mis-compiled it. This bug was found by the LLVM fuzzer. - -8. A call of pcre_copy_named_substring() for a named substring whose number - was greater than the space in the ovector could cause a crash. - -9. Yet another buffer overflow bug involved duplicate named groups with a - group that reset capture numbers (compare 8.38/7 below). Once again, I have - just allowed for more memory, even if not needed. (A proper fix is - implemented in PCRE2, but it involves a lot of refactoring.) - -10. pcre_get_substring_list() crashed if the use of \K in a match caused the - start of the match to be earlier than the end. - -11. Migrating appropriate PCRE2 JIT improvements to PCRE. - -12. A pattern such as /(?<=((?C)0))/, which has a callout inside a lookbehind - assertion, caused pcretest to generate incorrect output, and also to read - uninitialized memory (detected by ASAN or valgrind). - -13. A pattern that included (*ACCEPT) in the middle of a sufficiently deeply - nested set of parentheses of sufficient size caused an overflow of the - compiling workspace (which was diagnosed, but of course is not desirable). - -14. And yet another buffer overflow bug involving duplicate named groups, this - time nested, with a nested back reference. Yet again, I have just allowed - for more memory, because anything more needs all the refactoring that has - been done for PCRE2. An example pattern that provoked this bug is: - /((?J)(?'R'(?'R'(?'R'(?'R'(?'R'(?|(\k'R'))))))))/ and the bug was - registered as CVE-2016-1283. - -15. pcretest went into a loop if global matching was requested with an ovector - size less than 2. It now gives an error message. This bug was found by - afl-fuzz. - -16. An invalid pattern fragment such as (?(?C)0 was not diagnosing an error - ("assertion expected") when (?(?C) was not followed by an opening - parenthesis. - -17. Fixed typo ("&&" for "&") in pcre_study(). Fortunately, this could not - actually affect anything, by sheer luck. - -18. Applied Chris Wilson's patch (Bugzilla #1681) to CMakeLists.txt for MSVC - static compilation. - -19. Modified the RunTest script to incorporate a valgrind suppressions file so - that certain errors, provoked by the SSE2 instruction set when JIT is used, - are ignored. - -20. A racing condition is fixed in JIT reported by Mozilla. - -21. Minor code refactor to avoid "array subscript is below array bounds" - compiler warning. - -22. Minor code refactor to avoid "left shift of negative number" warning. - -23. Fix typo causing compile error when 16- or 32-bit JIT is compiled without - UCP support. - -24. Refactor to avoid compiler warnings in pcrecpp.cc. - -25. Refactor to fix a typo in pcre_jit_test.c - -26. Patch to support compiling pcrecpp.cc with Intel compiler. - - -Version 8.38 23-November-2015 ------------------------------ - -1. If a group that contained a recursive back reference also contained a - forward reference subroutine call followed by a non-forward-reference - subroutine call, for example /.((?2)(?R)\1)()/, pcre_compile() failed to - compile correct code, leading to undefined behaviour or an internally - detected error. This bug was discovered by the LLVM fuzzer. - -2. Quantification of certain items (e.g. atomic back references) could cause - incorrect code to be compiled when recursive forward references were - involved. For example, in this pattern: /(?1)()((((((\1++))\x85)+)|))/. - This bug was discovered by the LLVM fuzzer. - -3. A repeated conditional group whose condition was a reference by name caused - a buffer overflow if there was more than one group with the given name. - This bug was discovered by the LLVM fuzzer. - -4. A recursive back reference by name within a group that had the same name as - another group caused a buffer overflow. For example: - /(?J)(?'d'(?'d'\g{d}))/. This bug was discovered by the LLVM fuzzer. - -5. A forward reference by name to a group whose number is the same as the - current group, for example in this pattern: /(?|(\k'Pm')|(?'Pm'))/, caused - a buffer overflow at compile time. This bug was discovered by the LLVM - fuzzer. - -6. A lookbehind assertion within a set of mutually recursive subpatterns could - provoke a buffer overflow. This bug was discovered by the LLVM fuzzer. - -7. Another buffer overflow bug involved duplicate named groups with a - reference between their definition, with a group that reset capture - numbers, for example: /(?J:(?|(?'R')(\k'R')|((?'R'))))/. This has been - fixed by always allowing for more memory, even if not needed. (A proper fix - is implemented in PCRE2, but it involves more refactoring.) - -8. There was no check for integer overflow in subroutine calls such as (?123). - -9. The table entry for \l in EBCDIC environments was incorrect, leading to its - being treated as a literal 'l' instead of causing an error. - -10. There was a buffer overflow if pcre_exec() was called with an ovector of - size 1. This bug was found by american fuzzy lop. - -11. If a non-capturing group containing a conditional group that could match - an empty string was repeated, it was not identified as matching an empty - string itself. For example: /^(?:(?(1)x|)+)+$()/. - -12. In an EBCDIC environment, pcretest was mishandling the escape sequences - \a and \e in test subject lines. - -13. In an EBCDIC environment, \a in a pattern was converted to the ASCII - instead of the EBCDIC value. - -14. The handling of \c in an EBCDIC environment has been revised so that it is - now compatible with the specification in Perl's perlebcdic page. - -15. The EBCDIC character 0x41 is a non-breaking space, equivalent to 0xa0 in - ASCII/Unicode. This has now been added to the list of characters that are - recognized as white space in EBCDIC. - -16. When PCRE was compiled without UCP support, the use of \p and \P gave an - error (correctly) when used outside a class, but did not give an error - within a class. - -17. \h within a class was incorrectly compiled in EBCDIC environments. - -18. A pattern with an unmatched closing parenthesis that contained a backward - assertion which itself contained a forward reference caused buffer - overflow. And example pattern is: /(?=di(?<=(?1))|(?=(.))))/. - -19. JIT should return with error when the compiled pattern requires more stack - space than the maximum. - -20. A possessively repeated conditional group that could match an empty string, - for example, /(?(R))*+/, was incorrectly compiled. - -21. Fix infinite recursion in the JIT compiler when certain patterns such as - /(?:|a|){100}x/ are analysed. - -22. Some patterns with character classes involving [: and \\ were incorrectly - compiled and could cause reading from uninitialized memory or an incorrect - error diagnosis. - -23. Pathological patterns containing many nested occurrences of [: caused - pcre_compile() to run for a very long time. - -24. A conditional group with only one branch has an implicit empty alternative - branch and must therefore be treated as potentially matching an empty - string. - -25. If (?R was followed by - or + incorrect behaviour happened instead of a - diagnostic. - -26. Arrange to give up on finding the minimum matching length for overly - complex patterns. - -27. Similar to (4) above: in a pattern with duplicated named groups and an - occurrence of (?| it is possible for an apparently non-recursive back - reference to become recursive if a later named group with the relevant - number is encountered. This could lead to a buffer overflow. Wen Guanxing - from Venustech ADLAB discovered this bug. - -28. If pcregrep was given the -q option with -c or -l, or when handling a - binary file, it incorrectly wrote output to stdout. - -29. The JIT compiler did not restore the control verb head in case of *THEN - control verbs. This issue was found by Karl Skomski with a custom LLVM - fuzzer. - -30. Error messages for syntax errors following \g and \k were giving inaccurate - offsets in the pattern. - -31. Added a check for integer overflow in conditions (?() and - (?(R). This omission was discovered by Karl Skomski with the LLVM - fuzzer. - -32. Handling recursive references such as (?2) when the reference is to a group - later in the pattern uses code that is very hacked about and error-prone. - It has been re-written for PCRE2. Here in PCRE1, a check has been added to - give an internal error if it is obvious that compiling has gone wrong. - -33. The JIT compiler should not check repeats after a {0,1} repeat byte code. - This issue was found by Karl Skomski with a custom LLVM fuzzer. - -34. The JIT compiler should restore the control chain for empty possessive - repeats. This issue was found by Karl Skomski with a custom LLVM fuzzer. - -35. Match limit check added to JIT recursion. This issue was found by Karl - Skomski with a custom LLVM fuzzer. - -36. Yet another case similar to 27 above has been circumvented by an - unconditional allocation of extra memory. This issue is fixed "properly" in - PCRE2 by refactoring the way references are handled. Wen Guanxing - from Venustech ADLAB discovered this bug. - -37. Fix two assertion fails in JIT. These issues were found by Karl Skomski - with a custom LLVM fuzzer. - -38. Fixed a corner case of range optimization in JIT. - -39. An incorrect error "overran compiling workspace" was given if there were - exactly enough group forward references such that the last one extended - into the workspace safety margin. The next one would have expanded the - workspace. The test for overflow was not including the safety margin. - -40. A match limit issue is fixed in JIT which was found by Karl Skomski - with a custom LLVM fuzzer. - -41. Remove the use of /dev/null in testdata/testinput2, because it doesn't - work under Windows. (Why has it taken so long for anyone to notice?) - -42. In a character class such as [\W\p{Any}] where both a negative-type escape - ("not a word character") and a property escape were present, the property - escape was being ignored. - -43. Fix crash caused by very long (*MARK) or (*THEN) names. - -44. A sequence such as [[:punct:]b] that is, a POSIX character class followed - by a single ASCII character in a class item, was incorrectly compiled in - UCP mode. The POSIX class got lost, but only if the single character - followed it. - -45. [:punct:] in UCP mode was matching some characters in the range 128-255 - that should not have been matched. - -46. If [:^ascii:] or [:^xdigit:] or [:^cntrl:] are present in a non-negated - class, all characters with code points greater than 255 are in the class. - When a Unicode property was also in the class (if PCRE_UCP is set, escapes - such as \w are turned into Unicode properties), wide characters were not - correctly handled, and could fail to match. - - -Version 8.37 28-April-2015 --------------------------- - -1. When an (*ACCEPT) is triggered inside capturing parentheses, it arranges - for those parentheses to be closed with whatever has been captured so far. - However, it was failing to mark any other groups between the hightest - capture so far and the currrent group as "unset". Thus, the ovector for - those groups contained whatever was previously there. An example is the - pattern /(x)|((*ACCEPT))/ when matched against "abcd". - -2. If an assertion condition was quantified with a minimum of zero (an odd - thing to do, but it happened), SIGSEGV or other misbehaviour could occur. - -3. If a pattern in pcretest input had the P (POSIX) modifier followed by an - unrecognized modifier, a crash could occur. - -4. An attempt to do global matching in pcretest with a zero-length ovector - caused a crash. - -5. Fixed a memory leak during matching that could occur for a subpattern - subroutine call (recursive or otherwise) if the number of captured groups - that had to be saved was greater than ten. - -6. Catch a bad opcode during auto-possessification after compiling a bad UTF - string with NO_UTF_CHECK. This is a tidyup, not a bug fix, as passing bad - UTF with NO_UTF_CHECK is documented as having an undefined outcome. - -7. A UTF pattern containing a "not" match of a non-ASCII character and a - subroutine reference could loop at compile time. Example: /[^\xff]((?1))/. - -8. When a pattern is compiled, it remembers the highest back reference so that - when matching, if the ovector is too small, extra memory can be obtained to - use instead. A conditional subpattern whose condition is a check on a - capture having happened, such as, for example in the pattern - /^(?:(a)|b)(?(1)A|B)/, is another kind of back reference, but it was not - setting the highest backreference number. This mattered only if pcre_exec() - was called with an ovector that was too small to hold the capture, and there - was no other kind of back reference (a situation which is probably quite - rare). The effect of the bug was that the condition was always treated as - FALSE when the capture could not be consulted, leading to a incorrect - behaviour by pcre_exec(). This bug has been fixed. - -9. A reference to a duplicated named group (either a back reference or a test - for being set in a conditional) that occurred in a part of the pattern where - PCRE_DUPNAMES was not set caused the amount of memory needed for the pattern - to be incorrectly calculated, leading to overwriting. - -10. A mutually recursive set of back references such as (\2)(\1) caused a - segfault at study time (while trying to find the minimum matching length). - The infinite loop is now broken (with the minimum length unset, that is, - zero). - -11. If an assertion that was used as a condition was quantified with a minimum - of zero, matching went wrong. In particular, if the whole group had - unlimited repetition and could match an empty string, a segfault was - likely. The pattern (?(?=0)?)+ is an example that caused this. Perl allows - assertions to be quantified, but not if they are being used as conditions, - so the above pattern is faulted by Perl. PCRE has now been changed so that - it also rejects such patterns. - -12. A possessive capturing group such as (a)*+ with a minimum repeat of zero - failed to allow the zero-repeat case if pcre2_exec() was called with an - ovector too small to capture the group. - -13. Fixed two bugs in pcretest that were discovered by fuzzing and reported by - Red Hat Product Security: - - (a) A crash if /K and /F were both set with the option to save the compiled - pattern. - - (b) Another crash if the option to print captured substrings in a callout - was combined with setting a null ovector, for example \O\C+ as a subject - string. - -14. A pattern such as "((?2){0,1999}())?", which has a group containing a - forward reference repeated a large (but limited) number of times within a - repeated outer group that has a zero minimum quantifier, caused incorrect - code to be compiled, leading to the error "internal error: - previously-checked referenced subpattern not found" when an incorrect - memory address was read. This bug was reported as "heap overflow", - discovered by Kai Lu of Fortinet's FortiGuard Labs and given the CVE number - CVE-2015-2325. - -23. A pattern such as "((?+1)(\1))/" containing a forward reference subroutine - call within a group that also contained a recursive back reference caused - incorrect code to be compiled. This bug was reported as "heap overflow", - discovered by Kai Lu of Fortinet's FortiGuard Labs, and given the CVE - number CVE-2015-2326. - -24. Computing the size of the JIT read-only data in advance has been a source - of various issues, and new ones are still appear unfortunately. To fix - existing and future issues, size computation is eliminated from the code, - and replaced by on-demand memory allocation. - -25. A pattern such as /(?i)[A-`]/, where characters in the other case are - adjacent to the end of the range, and the range contained characters with - more than one other case, caused incorrect behaviour when compiled in UTF - mode. In that example, the range a-j was left out of the class. - -26. Fix JIT compilation of conditional blocks, which assertion - is converted to (*FAIL). E.g: /(?(?!))/. - -27. The pattern /(?(?!)^)/ caused references to random memory. This bug was - discovered by the LLVM fuzzer. - -28. The assertion (?!) is optimized to (*FAIL). This was not handled correctly - when this assertion was used as a condition, for example (?(?!)a|b). In - pcre2_match() it worked by luck; in pcre2_dfa_match() it gave an incorrect - error about an unsupported item. - -29. For some types of pattern, for example /Z*(|d*){216}/, the auto- - possessification code could take exponential time to complete. A recursion - depth limit of 1000 has been imposed to limit the resources used by this - optimization. - -30. A pattern such as /(*UTF)[\S\V\H]/, which contains a negated special class - such as \S in non-UCP mode, explicit wide characters (> 255) can be ignored - because \S ensures they are all in the class. The code for doing this was - interacting badly with the code for computing the amount of space needed to - compile the pattern, leading to a buffer overflow. This bug was discovered - by the LLVM fuzzer. - -31. A pattern such as /((?2)+)((?1))/ which has mutual recursion nested inside - other kinds of group caused stack overflow at compile time. This bug was - discovered by the LLVM fuzzer. - -32. A pattern such as /(?1)(?#?'){8}(a)/ which had a parenthesized comment - between a subroutine call and its quantifier was incorrectly compiled, - leading to buffer overflow or other errors. This bug was discovered by the - LLVM fuzzer. - -33. The illegal pattern /(?(?.*!.*)?)/ was not being diagnosed as missing an - assertion after (?(. The code was failing to check the character after - (?(?< for the ! or = that would indicate a lookbehind assertion. This bug - was discovered by the LLVM fuzzer. - -34. A pattern such as /X((?2)()*+){2}+/ which has a possessive quantifier with - a fixed maximum following a group that contains a subroutine reference was - incorrectly compiled and could trigger buffer overflow. This bug was - discovered by the LLVM fuzzer. - -35. A mutual recursion within a lookbehind assertion such as (?<=((?2))((?1))) - caused a stack overflow instead of the diagnosis of a non-fixed length - lookbehind assertion. This bug was discovered by the LLVM fuzzer. - -36. The use of \K in a positive lookbehind assertion in a non-anchored pattern - (e.g. /(?<=\Ka)/) could make pcregrep loop. - -37. There was a similar problem to 36 in pcretest for global matches. - -38. If a greedy quantified \X was preceded by \C in UTF mode (e.g. \C\X*), - and a subsequent item in the pattern caused a non-match, backtracking over - the repeated \X did not stop, but carried on past the start of the subject, - causing reference to random memory and/or a segfault. There were also some - other cases where backtracking after \C could crash. This set of bugs was - discovered by the LLVM fuzzer. - -39. The function for finding the minimum length of a matching string could take - a very long time if mutual recursion was present many times in a pattern, - for example, /((?2){73}(?2))((?1))/. A better mutual recursion detection - method has been implemented. This infelicity was discovered by the LLVM - fuzzer. - -40. Static linking against the PCRE library using the pkg-config module was - failing on missing pthread symbols. - - -Version 8.36 26-September-2014 ------------------------------- - -1. Got rid of some compiler warnings in the C++ modules that were shown up by - -Wmissing-field-initializers and -Wunused-parameter. - -2. The tests for quantifiers being too big (greater than 65535) were being - applied after reading the number, and stupidly assuming that integer - overflow would give a negative number. The tests are now applied as the - numbers are read. - -3. Tidy code in pcre_exec.c where two branches that used to be different are - now the same. - -4. The JIT compiler did not generate match limit checks for certain - bracketed expressions with quantifiers. This may lead to exponential - backtracking, instead of returning with PCRE_ERROR_MATCHLIMIT. This - issue should be resolved now. - -5. Fixed an issue, which occures when nested alternatives are optimized - with table jumps. - -6. Inserted two casts and changed some ints to size_t in the light of some - reported 64-bit compiler warnings (Bugzilla 1477). - -7. Fixed a bug concerned with zero-minimum possessive groups that could match - an empty string, which sometimes were behaving incorrectly in the - interpreter (though correctly in the JIT matcher). This pcretest input is - an example: - - '\A(?:[^"]++|"(?:[^"]*+|"")*+")++' - NON QUOTED "QUOT""ED" AFTER "NOT MATCHED - - the interpreter was reporting a match of 'NON QUOTED ' only, whereas the - JIT matcher and Perl both matched 'NON QUOTED "QUOT""ED" AFTER '. The test - for an empty string was breaking the inner loop and carrying on at a lower - level, when possessive repeated groups should always return to a higher - level as they have no backtrack points in them. The empty string test now - occurs at the outer level. - -8. Fixed a bug that was incorrectly auto-possessifying \w+ in the pattern - ^\w+(?>\s*)(?<=\w) which caused it not to match "test test". - -9. Give a compile-time error for \o{} (as Perl does) and for \x{} (which Perl - doesn't). - -10. Change 8.34/15 introduced a bug that caused the amount of memory needed - to hold a pattern to be incorrectly computed (too small) when there were - named back references to duplicated names. This could cause "internal - error: code overflow" or "double free or corruption" or other memory - handling errors. - -11. When named subpatterns had the same prefixes, back references could be - confused. For example, in this pattern: - - /(?Pa)?(?Pb)?(?()c|d)*l/ - - the reference to 'Name' was incorrectly treated as a reference to a - duplicate name. - -12. A pattern such as /^s?c/mi8 where the optional character has more than - one "other case" was incorrectly compiled such that it would only try to - match starting at "c". - -13. When a pattern starting with \s was studied, VT was not included in the - list of possible starting characters; this should have been part of the - 8.34/18 patch. - -14. If a character class started [\Qx]... where x is any character, the class - was incorrectly terminated at the ]. - -15. If a pattern that started with a caseless match for a character with more - than one "other case" was studied, PCRE did not set up the starting code - unit bit map for the list of possible characters. Now it does. This is an - optimization improvement, not a bug fix. - -16. The Unicode data tables have been updated to Unicode 7.0.0. - -17. Fixed a number of memory leaks in pcregrep. - -18. Avoid a compiler warning (from some compilers) for a function call with - a cast that removes "const" from an lvalue by using an intermediate - variable (to which the compiler does not object). - -19. Incorrect code was compiled if a group that contained an internal recursive - back reference was optional (had quantifier with a minimum of zero). This - example compiled incorrect code: /(((a\2)|(a*)\g<-1>))*/ and other examples - caused segmentation faults because of stack overflows at compile time. - -20. A pattern such as /((?(R)a|(?1)))+/, which contains a recursion within a - group that is quantified with an indefinite repeat, caused a compile-time - loop which used up all the system stack and provoked a segmentation fault. - This was not the same bug as 19 above. - -21. Add PCRECPP_EXP_DECL declaration to operator<< in pcre_stringpiece.h. - Patch by Mike Frysinger. - - -Version 8.35 04-April-2014 --------------------------- - -1. A new flag is set, when property checks are present in an XCLASS. - When this flag is not set, PCRE can perform certain optimizations - such as studying these XCLASS-es. - -2. The auto-possessification of character sets were improved: a normal - and an extended character set can be compared now. Furthermore - the JIT compiler optimizes more character set checks. - -3. Got rid of some compiler warnings for potentially uninitialized variables - that show up only when compiled with -O2. - -4. A pattern such as (?=ab\K) that uses \K in an assertion can set the start - of a match later then the end of the match. The pcretest program was not - handling the case sensibly - it was outputting from the start to the next - binary zero. It now reports this situation in a message, and outputs the - text from the end to the start. - -5. Fast forward search is improved in JIT. Instead of the first three - characters, any three characters with fixed position can be searched. - Search order: first, last, middle. - -6. Improve character range checks in JIT. Characters are read by an inprecise - function now, which returns with an unknown value if the character code is - above a certain threshold (e.g: 256). The only limitation is that the value - must be bigger than the threshold as well. This function is useful when - the characters above the threshold are handled in the same way. - -7. The macros whose names start with RAWUCHAR are placeholders for a future - mode in which only the bottom 21 bits of 32-bit data items are used. To - make this more memorable for those maintaining the code, the names have - been changed to start with UCHAR21, and an extensive comment has been added - to their definition. - -8. Add missing (new) files sljitNativeTILEGX.c and sljitNativeTILEGX-encoder.c - to the export list in Makefile.am (they were accidentally omitted from the - 8.34 tarball). - -9. The informational output from pcretest used the phrase "starting byte set" - which is inappropriate for the 16-bit and 32-bit libraries. As the output - for "first char" and "need char" really means "non-UTF-char", I've changed - "byte" to "char", and slightly reworded the output. The documentation about - these values has also been (I hope) clarified. - -10. Another JIT related optimization: use table jumps for selecting the correct - backtracking path, when more than four alternatives are present inside a - bracket. - -11. Empty match is not possible, when the minimum length is greater than zero, - and there is no \K in the pattern. JIT should avoid empty match checks in - such cases. - -12. In a caseless character class with UCP support, when a character with more - than one alternative case was not the first character of a range, not all - the alternative cases were added to the class. For example, s and \x{17f} - are both alternative cases for S: the class [RST] was handled correctly, - but [R-T] was not. - -13. The configure.ac file always checked for pthread support when JIT was - enabled. This is not used in Windows, so I have put this test inside a - check for the presence of windows.h (which was already tested for). - -14. Improve pattern prefix search by a simplified Boyer-Moore algorithm in JIT. - The algorithm provides a way to skip certain starting offsets, and usually - faster than linear prefix searches. - -15. Change 13 for 8.20 updated RunTest to check for the 'fr' locale as well - as for 'fr_FR' and 'french'. For some reason, however, it then used the - Windows-specific input and output files, which have 'french' screwed in. - So this could never have worked. One of the problems with locales is that - they aren't always the same. I have now updated RunTest so that it checks - the output of the locale test (test 3) against three different output - files, and it allows the test to pass if any one of them matches. With luck - this should make the test pass on some versions of Solaris where it was - failing. Because of the uncertainty, the script did not used to stop if - test 3 failed; it now does. If further versions of a French locale ever - come to light, they can now easily be added. - -16. If --with-pcregrep-bufsize was given a non-integer value such as "50K", - there was a message during ./configure, but it did not stop. This now - provokes an error. The invalid example in README has been corrected. - If a value less than the minimum is given, the minimum value has always - been used, but now a warning is given. - -17. If --enable-bsr-anycrlf was set, the special 16/32-bit test failed. This - was a bug in the test system, which is now fixed. Also, the list of various - configurations that are tested for each release did not have one with both - 16/32 bits and --enable-bar-anycrlf. It now does. - -18. pcretest was missing "-C bsr" for displaying the \R default setting. - -19. Little endian PowerPC systems are supported now by the JIT compiler. - -20. The fast forward newline mechanism could enter to an infinite loop on - certain invalid UTF-8 input. Although we don't support these cases - this issue can be fixed by a performance optimization. - -21. Change 33 of 8.34 is not sufficient to ensure stack safety because it does - not take account if existing stack usage. There is now a new global - variable called pcre_stack_guard that can be set to point to an external - function to check stack availability. It is called at the start of - processing every parenthesized group. - -22. A typo in the code meant that in ungreedy mode the max/min qualifier - behaved like a min-possessive qualifier, and, for example, /a{1,3}b/U did - not match "ab". - -23. When UTF was disabled, the JIT program reported some incorrect compile - errors. These messages are silenced now. - -24. Experimental support for ARM-64 and MIPS-64 has been added to the JIT - compiler. - -25. Change all the temporary files used in RunGrepTest to be different to those - used by RunTest so that the tests can be run simultaneously, for example by - "make -j check". - - -Version 8.34 15-December-2013 ------------------------------ - -1. Add pcre[16|32]_jit_free_unused_memory to forcibly free unused JIT - executable memory. Patch inspired by Carsten Klein. - -2. ./configure --enable-coverage defined SUPPORT_GCOV in config.h, although - this macro is never tested and has no effect, because the work to support - coverage involves only compiling and linking options and special targets in - the Makefile. The comment in config.h implied that defining the macro would - enable coverage support, which is totally false. There was also support for - setting this macro in the CMake files (my fault, I just copied it from - configure). SUPPORT_GCOV has now been removed. - -3. Make a small performance improvement in strlen16() and strlen32() in - pcretest. - -4. Change 36 for 8.33 left some unreachable statements in pcre_exec.c, - detected by the Solaris compiler (gcc doesn't seem to be able to diagnose - these cases). There was also one in pcretest.c. - -5. Cleaned up a "may be uninitialized" compiler warning in pcre_exec.c. - -6. In UTF mode, the code for checking whether a group could match an empty - string (which is used for indefinitely repeated groups to allow for - breaking an infinite loop) was broken when the group contained a repeated - negated single-character class with a character that occupied more than one - data item and had a minimum repetition of zero (for example, [^\x{100}]* in - UTF-8 mode). The effect was undefined: the group might or might not be - deemed as matching an empty string, or the program might have crashed. - -7. The code for checking whether a group could match an empty string was not - recognizing that \h, \H, \v, \V, and \R must match a character. - -8. Implemented PCRE_INFO_MATCH_EMPTY, which yields 1 if the pattern can match - an empty string. If it can, pcretest shows this in its information output. - -9. Fixed two related bugs that applied to Unicode extended grapheme clusters - that were repeated with a maximizing qualifier (e.g. \X* or \X{2,5}) when - matched by pcre_exec() without using JIT: - - (a) If the rest of the pattern did not match after a maximal run of - grapheme clusters, the code for backing up to try with fewer of them - did not always back up over a full grapheme when characters that do not - have the modifier quality were involved, e.g. Hangul syllables. - - (b) If the match point in a subject started with modifier character, and - there was no match, the code could incorrectly back up beyond the match - point, and potentially beyond the first character in the subject, - leading to a segfault or an incorrect match result. - -10. A conditional group with an assertion condition could lead to PCRE - recording an incorrect first data item for a match if no other first data - item was recorded. For example, the pattern (?(?=ab)ab) recorded "a" as a - first data item, and therefore matched "ca" after "c" instead of at the - start. - -11. Change 40 for 8.33 (allowing pcregrep to find empty strings) showed up a - bug that caused the command "echo a | ./pcregrep -M '|a'" to loop. - -12. The source of pcregrep now includes z/OS-specific code so that it can be - compiled for z/OS as part of the special z/OS distribution. - -13. Added the -T and -TM options to pcretest. - -14. The code in pcre_compile.c for creating the table of named capturing groups - has been refactored. Instead of creating the table dynamically during the - actual compiling pass, the information is remembered during the pre-compile - pass (on the stack unless there are more than 20 named groups, in which - case malloc() is used) and the whole table is created before the actual - compile happens. This has simplified the code (it is now nearly 150 lines - shorter) and prepared the way for better handling of references to groups - with duplicate names. - -15. A back reference to a named subpattern when there is more than one of the - same name now checks them in the order in which they appear in the pattern. - The first one that is set is used for the reference. Previously only the - first one was inspected. This change makes PCRE more compatible with Perl. - -16. Unicode character properties were updated from Unicode 6.3.0. - -17. The compile-time code for auto-possessification has been refactored, based - on a patch by Zoltan Herczeg. It now happens after instead of during - compilation. The code is cleaner, and more cases are handled. The option - PCRE_NO_AUTO_POSSESS is added for testing purposes, and the -O and /O - options in pcretest are provided to set it. It can also be set by - (*NO_AUTO_POSSESS) at the start of a pattern. - -18. The character VT has been added to the default ("C" locale) set of - characters that match \s and are generally treated as white space, - following this same change in Perl 5.18. There is now no difference between - "Perl space" and "POSIX space". Whether VT is treated as white space in - other locales depends on the locale. - -19. The code for checking named groups as conditions, either for being set or - for being recursed, has been refactored (this is related to 14 and 15 - above). Processing unduplicated named groups should now be as fast at - numerical groups, and processing duplicated groups should be faster than - before. - -20. Two patches to the CMake build system, by Alexander Barkov: - - (1) Replace the "source" command by "." in CMakeLists.txt because - "source" is a bash-ism. - - (2) Add missing HAVE_STDINT_H and HAVE_INTTYPES_H to config-cmake.h.in; - without these the CMake build does not work on Solaris. - -21. Perl has changed its handling of \8 and \9. If there is no previously - encountered capturing group of those numbers, they are treated as the - literal characters 8 and 9 instead of a binary zero followed by the - literals. PCRE now does the same. - -22. Following Perl, added \o{} to specify codepoints in octal, making it - possible to specify values greater than 0777 and also making them - unambiguous. - -23. Perl now gives an error for missing closing braces after \x{... instead of - treating the string as literal. PCRE now does the same. - -24. RunTest used to grumble if an inappropriate test was selected explicitly, - but just skip it when running all tests. This make it awkward to run ranges - of tests when one of them was inappropriate. Now it just skips any - inappropriate tests, as it always did when running all tests. - -25. If PCRE_AUTO_CALLOUT and PCRE_UCP were set for a pattern that contained - character types such as \d or \w, too many callouts were inserted, and the - data that they returned was rubbish. - -26. In UCP mode, \s was not matching two of the characters that Perl matches, - namely NEL (U+0085) and MONGOLIAN VOWEL SEPARATOR (U+180E), though they - were matched by \h. The code has now been refactored so that the lists of - the horizontal and vertical whitespace characters used for \h and \v (which - are defined only in one place) are now also used for \s. - -27. Add JIT support for the 64 bit TileGX architecture. - Patch by Jiong Wang (Tilera Corporation). - -28. Possessive quantifiers for classes (both explicit and automatically - generated) now use special opcodes instead of wrapping in ONCE brackets. - -29. Whereas an item such as A{4}+ ignored the possessivenes of the quantifier - (because it's meaningless), this was not happening when PCRE_CASELESS was - set. Not wrong, but inefficient. - -30. Updated perltest.pl to add /u (force Unicode mode) when /W (use Unicode - properties for \w, \d, etc) is present in a test regex. Otherwise if the - test contains no characters greater than 255, Perl doesn't realise it - should be using Unicode semantics. - -31. Upgraded the handling of the POSIX classes [:graph:], [:print:], and - [:punct:] when PCRE_UCP is set so as to include the same characters as Perl - does in Unicode mode. - -32. Added the "forbid" facility to pcretest so that putting tests into the - wrong test files can sometimes be quickly detected. - -33. There is now a limit (default 250) on the depth of nesting of parentheses. - This limit is imposed to control the amount of system stack used at compile - time. It can be changed at build time by --with-parens-nest-limit=xxx or - the equivalent in CMake. - -34. Character classes such as [A-\d] or [a-[:digit:]] now cause compile-time - errors. Perl warns for these when in warning mode, but PCRE has no facility - for giving warnings. - -35. Change 34 for 8.13 allowed quantifiers on assertions, because Perl does. - However, this was not working for (?!) because it is optimized to (*FAIL), - for which PCRE does not allow quantifiers. The optimization is now disabled - when a quantifier follows (?!). I can't see any use for this, but it makes - things uniform. - -36. Perl no longer allows group names to start with digits, so I have made this - change also in PCRE. It simplifies the code a bit. - -37. In extended mode, Perl ignores spaces before a + that indicates a - possessive quantifier. PCRE allowed a space before the quantifier, but not - before the possessive +. It now does. - -38. The use of \K (reset reported match start) within a repeated possessive - group such as (a\Kb)*+ was not working. - -40. Document that the same character tables must be used at compile time and - run time, and that the facility to pass tables to pcre_exec() and - pcre_dfa_exec() is for use only with saved/restored patterns. - -41. Applied Jeff Trawick's patch CMakeLists.txt, which "provides two new - features for Builds with MSVC: - - 1. Support pcre.rc and/or pcreposix.rc (as is already done for MinGW - builds). The .rc files can be used to set FileDescription and many other - attributes. - - 2. Add an option (-DINSTALL_MSVC_PDB) to enable installation of .pdb files. - This allows higher-level build scripts which want .pdb files to avoid - hard-coding the exact files needed." - -42. Added support for [[:<:]] and [[:>:]] as used in the BSD POSIX library to - mean "start of word" and "end of word", respectively, as a transition aid. - -43. A minimizing repeat of a class containing codepoints greater than 255 in - non-UTF 16-bit or 32-bit modes caused an internal error when PCRE was - compiled to use the heap for recursion. - -44. Got rid of some compiler warnings for unused variables when UTF but not UCP - is configured. - - -Version 8.33 28-May-2013 ------------------------- - -1. Added 'U' to some constants that are compared to unsigned integers, to - avoid compiler signed/unsigned warnings. Added (int) casts to unsigned - variables that are added to signed variables, to ensure the result is - signed and can be negated. - -2. Applied patch by Daniel Richard G for quashing MSVC warnings to the - CMake config files. - -3. Revise the creation of config.h.generic so that all boolean macros are - #undefined, whereas non-boolean macros are #ifndef/#endif-ed. This makes - overriding via -D on the command line possible. - -4. Changing the definition of the variable "op" in pcre_exec.c from pcre_uchar - to unsigned int is reported to make a quite noticeable speed difference in - a specific Windows environment. Testing on Linux did also appear to show - some benefit (and it is clearly not harmful). Also fixed the definition of - Xop which should be unsigned. - -5. Related to (4), changing the definition of the intermediate variable cc - in repeated character loops from pcre_uchar to pcre_uint32 also gave speed - improvements. - -6. Fix forward search in JIT when link size is 3 or greater. Also removed some - unnecessary spaces. - -7. Adjust autogen.sh and configure.ac to lose warnings given by automake 1.12 - and later. - -8. Fix two buffer over read issues in 16 and 32 bit modes. Affects JIT only. - -9. Optimizing fast_forward_start_bits in JIT. - -10. Adding support for callouts in JIT, and fixing some issues revealed - during this work. Namely: - - (a) Unoptimized capturing brackets incorrectly reset on backtrack. - - (b) Minimum length was not checked before the matching is started. - -11. The value of capture_last that is passed to callouts was incorrect in some - cases when there was a capture on one path that was subsequently abandoned - after a backtrack. Also, the capture_last value is now reset after a - recursion, since all captures are also reset in this case. - -12. The interpreter no longer returns the "too many substrings" error in the - case when an overflowing capture is in a branch that is subsequently - abandoned after a backtrack. - -13. In the pathological case when an offset vector of size 2 is used, pcretest - now prints out the matched string after a yield of 0 or 1. - -14. Inlining subpatterns in recursions, when certain conditions are fulfilled. - Only supported by the JIT compiler at the moment. - -15. JIT compiler now supports 32 bit Macs thanks to Lawrence Velazquez. - -16. Partial matches now set offsets[2] to the "bumpalong" value, that is, the - offset of the starting point of the matching process, provided the offsets - vector is large enough. - -17. The \A escape now records a lookbehind value of 1, though its execution - does not actually inspect the previous character. This is to ensure that, - in partial multi-segment matching, at least one character from the old - segment is retained when a new segment is processed. Otherwise, if there - are no lookbehinds in the pattern, \A might match incorrectly at the start - of a new segment. - -18. Added some #ifdef __VMS code into pcretest.c to help VMS implementations. - -19. Redefined some pcre_uchar variables in pcre_exec.c as pcre_uint32; this - gives some modest performance improvement in 8-bit mode. - -20. Added the PCRE-specific property \p{Xuc} for matching characters that can - be expressed in certain programming languages using Universal Character - Names. - -21. Unicode validation has been updated in the light of Unicode Corrigendum #9, - which points out that "non characters" are not "characters that may not - appear in Unicode strings" but rather "characters that are reserved for - internal use and have only local meaning". - -22. When a pattern was compiled with automatic callouts (PCRE_AUTO_CALLOUT) and - there was a conditional group that depended on an assertion, if the - assertion was false, the callout that immediately followed the alternation - in the condition was skipped when pcre_exec() was used for matching. - -23. Allow an explicit callout to be inserted before an assertion that is the - condition for a conditional group, for compatibility with automatic - callouts, which always insert a callout at this point. - -24. In 8.31, (*COMMIT) was confined to within a recursive subpattern. Perl also - confines (*SKIP) and (*PRUNE) in the same way, and this has now been done. - -25. (*PRUNE) is now supported by the JIT compiler. - -26. Fix infinite loop when /(?<=(*SKIP)ac)a/ is matched against aa. - -27. Fix the case where there are two or more SKIPs with arguments that may be - ignored. - -28. (*SKIP) is now supported by the JIT compiler. - -29. (*THEN) is now supported by the JIT compiler. - -30. Update RunTest with additional test selector options. - -31. The way PCRE handles backtracking verbs has been changed in two ways. - - (1) Previously, in something like (*COMMIT)(*SKIP), COMMIT would override - SKIP. Now, PCRE acts on whichever backtracking verb is reached first by - backtracking. In some cases this makes it more Perl-compatible, but Perl's - rather obscure rules do not always do the same thing. - - (2) Previously, backtracking verbs were confined within assertions. This is - no longer the case for positive assertions, except for (*ACCEPT). Again, - this sometimes improves Perl compatibility, and sometimes does not. - -32. A number of tests that were in test 2 because Perl did things differently - have been moved to test 1, because either Perl or PCRE has changed, and - these tests are now compatible. - -32. Backtracking control verbs are now handled in the same way in JIT and - interpreter. - -33. An opening parenthesis in a MARK/PRUNE/SKIP/THEN name in a pattern that - contained a forward subroutine reference caused a compile error. - -34. Auto-detect and optimize limited repetitions in JIT. - -35. Implement PCRE_NEVER_UTF to lock out the use of UTF, in particular, - blocking (*UTF) etc. - -36. In the interpreter, maximizing pattern repetitions for characters and - character types now use tail recursion, which reduces stack usage. - -37. The value of the max lookbehind was not correctly preserved if a compiled - and saved regex was reloaded on a host of different endianness. - -38. Implemented (*LIMIT_MATCH) and (*LIMIT_RECURSION). As part of the extension - of the compiled pattern block, expand the flags field from 16 to 32 bits - because it was almost full. - -39. Try madvise first before posix_madvise. - -40. Change 7 for PCRE 7.9 made it impossible for pcregrep to find empty lines - with a pattern such as ^$. It has taken 4 years for anybody to notice! The - original change locked out all matches of empty strings. This has been - changed so that one match of an empty string per line is recognized. - Subsequent searches on the same line (for colouring or for --only-matching, - for example) do not recognize empty strings. - -41. Applied a user patch to fix a number of spelling mistakes in comments. - -42. Data lines longer than 65536 caused pcretest to crash. - -43. Clarified the data type for length and startoffset arguments for pcre_exec - and pcre_dfa_exec in the function-specific man pages, where they were - explicitly stated to be in bytes, never having been updated. I also added - some clarification to the pcreapi man page. - -44. A call to pcre_dfa_exec() with an output vector size less than 2 caused - a segmentation fault. - - -Version 8.32 30-November-2012 ------------------------------ - -1. Improved JIT compiler optimizations for first character search and single - character iterators. - -2. Supporting IBM XL C compilers for PPC architectures in the JIT compiler. - Patch by Daniel Richard G. - -3. Single character iterator optimizations in the JIT compiler. - -4. Improved JIT compiler optimizations for character ranges. - -5. Rename the "leave" variable names to "quit" to improve WinCE compatibility. - Reported by Giuseppe D'Angelo. - -6. The PCRE_STARTLINE bit, indicating that a match can occur only at the start - of a line, was being set incorrectly in cases where .* appeared inside - atomic brackets at the start of a pattern, or where there was a subsequent - *PRUNE or *SKIP. - -7. Improved instruction cache flush for POWER/PowerPC. - Patch by Daniel Richard G. - -8. Fixed a number of issues in pcregrep, making it more compatible with GNU - grep: - - (a) There is now no limit to the number of patterns to be matched. - - (b) An error is given if a pattern is too long. - - (c) Multiple uses of --exclude, --exclude-dir, --include, and --include-dir - are now supported. - - (d) --exclude-from and --include-from (multiple use) have been added. - - (e) Exclusions and inclusions now apply to all files and directories, not - just to those obtained from scanning a directory recursively. - - (f) Multiple uses of -f and --file-list are now supported. - - (g) In a Windows environment, the default for -d has been changed from - "read" (the GNU grep default) to "skip", because otherwise the presence - of a directory in the file list provokes an error. - - (h) The documentation has been revised and clarified in places. - -9. Improve the matching speed of capturing brackets. - -10. Changed the meaning of \X so that it now matches a Unicode extended - grapheme cluster. - -11. Patch by Daniel Richard G to the autoconf files to add a macro for sorting - out POSIX threads when JIT support is configured. - -12. Added support for PCRE_STUDY_EXTRA_NEEDED. - -13. In the POSIX wrapper regcomp() function, setting re_nsub field in the preg - structure could go wrong in environments where size_t is not the same size - as int. - -14. Applied user-supplied patch to pcrecpp.cc to allow PCRE_NO_UTF8_CHECK to be - set. - -15. The EBCDIC support had decayed; later updates to the code had included - explicit references to (e.g.) \x0a instead of CHAR_LF. There has been a - general tidy up of EBCDIC-related issues, and the documentation was also - not quite right. There is now a test that can be run on ASCII systems to - check some of the EBCDIC-related things (but is it not a full test). - -16. The new PCRE_STUDY_EXTRA_NEEDED option is now used by pcregrep, resulting - in a small tidy to the code. - -17. Fix JIT tests when UTF is disabled and both 8 and 16 bit mode are enabled. - -18. If the --only-matching (-o) option in pcregrep is specified multiple - times, each one causes appropriate output. For example, -o1 -o2 outputs the - substrings matched by the 1st and 2nd capturing parentheses. A separating - string can be specified by --om-separator (default empty). - -19. Improving the first n character searches. - -20. Turn case lists for horizontal and vertical white space into macros so that - they are defined only once. - -21. This set of changes together give more compatible Unicode case-folding - behaviour for characters that have more than one other case when UCP - support is available. - - (a) The Unicode property table now has offsets into a new table of sets of - three or more characters that are case-equivalent. The MultiStage2.py - script that generates these tables (the pcre_ucd.c file) now scans - CaseFolding.txt instead of UnicodeData.txt for character case - information. - - (b) The code for adding characters or ranges of characters to a character - class has been abstracted into a generalized function that also handles - case-independence. In UTF-mode with UCP support, this uses the new data - to handle characters with more than one other case. - - (c) A bug that is fixed as a result of (b) is that codepoints less than 256 - whose other case is greater than 256 are now correctly matched - caselessly. Previously, the high codepoint matched the low one, but not - vice versa. - - (d) The processing of \h, \H, \v, and \ in character classes now makes use - of the new class addition function, using character lists defined as - macros alongside the case definitions of 20 above. - - (e) Caseless back references now work with characters that have more than - one other case. - - (f) General caseless matching of characters with more than one other case - is supported. - -22. Unicode character properties were updated from Unicode 6.2.0 - -23. Improved CMake support under Windows. Patch by Daniel Richard G. - -24. Add support for 32-bit character strings, and UTF-32 - -25. Major JIT compiler update (code refactoring and bugfixing). - Experimental Sparc 32 support is added. - -26. Applied a modified version of Daniel Richard G's patch to create - pcre.h.generic and config.h.generic by "make" instead of in the - PrepareRelease script. - -27. Added a definition for CHAR_NULL (helpful for the z/OS port), and use it in - pcre_compile.c when checking for a zero character. - -28. Introducing a native interface for JIT. Through this interface, the compiled - machine code can be directly executed. The purpose of this interface is to - provide fast pattern matching, so several sanity checks are not performed. - However, feature tests are still performed. The new interface provides - 1.4x speedup compared to the old one. - -29. If pcre_exec() or pcre_dfa_exec() was called with a negative value for - the subject string length, the error given was PCRE_ERROR_BADOFFSET, which - was confusing. There is now a new error PCRE_ERROR_BADLENGTH for this case. - -30. In 8-bit UTF-8 mode, pcretest failed to give an error for data codepoints - greater than 0x7fffffff (which cannot be represented in UTF-8, even under - the "old" RFC 2279). Instead, it ended up passing a negative length to - pcre_exec(). - -31. Add support for GCC's visibility feature to hide internal functions. - -32. Running "pcretest -C pcre8" or "pcretest -C pcre16" gave a spurious error - "unknown -C option" after outputting 0 or 1. - -33. There is now support for generating a code coverage report for the test - suite in environments where gcc is the compiler and lcov is installed. This - is mainly for the benefit of the developers. - -34. If PCRE is built with --enable-valgrind, certain memory regions are marked - unaddressable using valgrind annotations, allowing valgrind to detect - invalid memory accesses. This is mainly for the benefit of the developers. - -25. (*UTF) can now be used to start a pattern in any of the three libraries. - -26. Give configure error if --enable-cpp but no C++ compiler found. - - -Version 8.31 06-July-2012 -------------------------- - -1. Fixing a wrong JIT test case and some compiler warnings. - -2. Removed a bashism from the RunTest script. - -3. Add a cast to pcre_exec.c to fix the warning "unary minus operator applied - to unsigned type, result still unsigned" that was given by an MS compiler - on encountering the code "-sizeof(xxx)". - -4. Partial matching support is added to the JIT compiler. - -5. Fixed several bugs concerned with partial matching of items that consist - of more than one character: - - (a) /^(..)\1/ did not partially match "aba" because checking references was - done on an "all or nothing" basis. This also applied to repeated - references. - - (b) \R did not give a hard partial match if \r was found at the end of the - subject. - - (c) \X did not give a hard partial match after matching one or more - characters at the end of the subject. - - (d) When newline was set to CRLF, a pattern such as /a$/ did not recognize - a partial match for the string "\r". - - (e) When newline was set to CRLF, the metacharacter "." did not recognize - a partial match for a CR character at the end of the subject string. - -6. If JIT is requested using /S++ or -s++ (instead of just /S+ or -s+) when - running pcretest, the text "(JIT)" added to the output whenever JIT is - actually used to run the match. - -7. Individual JIT compile options can be set in pcretest by following -s+[+] - or /S+[+] with a digit between 1 and 7. - -8. OP_NOT now supports any UTF character not just single-byte ones. - -9. (*MARK) control verb is now supported by the JIT compiler. - -10. The command "./RunTest list" lists the available tests without actually - running any of them. (Because I keep forgetting what they all are.) - -11. Add PCRE_INFO_MAXLOOKBEHIND. - -12. Applied a (slightly modified) user-supplied patch that improves performance - when the heap is used for recursion (compiled with --disable-stack-for- - recursion). Instead of malloc and free for each heap frame each time a - logical recursion happens, frames are retained on a chain and re-used where - possible. This sometimes gives as much as 30% improvement. - -13. As documented, (*COMMIT) is now confined to within a recursive subpattern - call. - -14. As documented, (*COMMIT) is now confined to within a positive assertion. - -15. It is now possible to link pcretest with libedit as an alternative to - libreadline. - -16. (*COMMIT) control verb is now supported by the JIT compiler. - -17. The Unicode data tables have been updated to Unicode 6.1.0. - -18. Added --file-list option to pcregrep. - -19. Added binary file support to pcregrep, including the -a, --binary-files, - -I, and --text options. - -20. The madvise function is renamed for posix_madvise for QNX compatibility - reasons. Fixed by Giuseppe D'Angelo. - -21. Fixed a bug for backward assertions with REVERSE 0 in the JIT compiler. - -22. Changed the option for creating symbolic links for 16-bit man pages from - -s to -sf so that re-installing does not cause issues. - -23. Support PCRE_NO_START_OPTIMIZE in JIT as (*MARK) support requires it. - -24. Fixed a very old bug in pcretest that caused errors with restarted DFA - matches in certain environments (the workspace was not being correctly - retained). Also added to pcre_dfa_exec() a simple plausibility check on - some of the workspace data at the beginning of a restart. - -25. \s*\R was auto-possessifying the \s* when it should not, whereas \S*\R - was not doing so when it should - probably a typo introduced by SVN 528 - (change 8.10/14). - -26. When PCRE_UCP was not set, \w+\x{c4} was incorrectly auto-possessifying the - \w+ when the character tables indicated that \x{c4} was a word character. - There were several related cases, all because the tests for doing a table - lookup were testing for characters less than 127 instead of 255. - -27. If a pattern contains capturing parentheses that are not used in a match, - their slots in the ovector are set to -1. For those that are higher than - any matched groups, this happens at the end of processing. In the case when - there were back references that the ovector was too small to contain - (causing temporary malloc'd memory to be used during matching), and the - highest capturing number was not used, memory off the end of the ovector - was incorrectly being set to -1. (It was using the size of the temporary - memory instead of the true size.) - -28. To catch bugs like 27 using valgrind, when pcretest is asked to specify an - ovector size, it uses memory at the end of the block that it has got. - -29. Check for an overlong MARK name and give an error at compile time. The - limit is 255 for the 8-bit library and 65535 for the 16-bit library. - -30. JIT compiler update. - -31. JIT is now supported on jailbroken iOS devices. Thanks for Ruiger - Rill for the patch. - -32. Put spaces around SLJIT_PRINT_D in the JIT compiler. Required by CXX11. - -33. Variable renamings in the PCRE-JIT compiler. No functionality change. - -34. Fixed typos in pcregrep: in two places there was SUPPORT_LIBZ2 instead of - SUPPORT_LIBBZ2. This caused a build problem when bzip2 but not gzip (zlib) - was enabled. - -35. Improve JIT code generation for greedy plus quantifier. - -36. When /((?:a?)*)*c/ or /((?>a?)*)*c/ was matched against "aac", it set group - 1 to "aa" instead of to an empty string. The bug affected repeated groups - that could potentially match an empty string. - -37. Optimizing single character iterators in JIT. - -38. Wide characters specified with \uxxxx in JavaScript mode are now subject to - the same checks as \x{...} characters in non-JavaScript mode. Specifically, - codepoints that are too big for the mode are faulted, and in a UTF mode, - disallowed codepoints are also faulted. - -39. If PCRE was compiled with UTF support, in three places in the DFA - matcher there was code that should only have been obeyed in UTF mode, but - was being obeyed unconditionally. In 8-bit mode this could cause incorrect - processing when bytes with values greater than 127 were present. In 16-bit - mode the bug would be provoked by values in the range 0xfc00 to 0xdc00. In - both cases the values are those that cannot be the first data item in a UTF - character. The three items that might have provoked this were recursions, - possessively repeated groups, and atomic groups. - -40. Ensure that libpcre is explicitly listed in the link commands for pcretest - and pcregrep, because some OS require shared objects to be explicitly - passed to ld, causing the link step to fail if they are not. - -41. There were two incorrect #ifdefs in pcre_study.c, meaning that, in 16-bit - mode, patterns that started with \h* or \R* might be incorrectly matched. - - -Version 8.30 04-February-2012 ------------------------------ - -1. Renamed "isnumber" as "is_a_number" because in some Mac environments this - name is defined in ctype.h. - -2. Fixed a bug in fixed-length calculation for lookbehinds that would show up - only in quite long subpatterns. - -3. Removed the function pcre_info(), which has been obsolete and deprecated - since it was replaced by pcre_fullinfo() in February 2000. - -4. For a non-anchored pattern, if (*SKIP) was given with a name that did not - match a (*MARK), and the match failed at the start of the subject, a - reference to memory before the start of the subject could occur. This bug - was introduced by fix 17 of release 8.21. - -5. A reference to an unset group with zero minimum repetition was giving - totally wrong answers (in non-JavaScript-compatibility mode). For example, - /(another)?(\1?)test/ matched against "hello world test". This bug was - introduced in release 8.13. - -6. Add support for 16-bit character strings (a large amount of work involving - many changes and refactorings). - -7. RunGrepTest failed on msys because \r\n was replaced by whitespace when the - command "pattern=`printf 'xxx\r\njkl'`" was run. The pattern is now taken - from a file. - -8. Ovector size of 2 is also supported by JIT based pcre_exec (the ovector size - rounding is not applied in this particular case). - -9. The invalid Unicode surrogate codepoints U+D800 to U+DFFF are now rejected - if they appear, or are escaped, in patterns. - -10. Get rid of a number of -Wunused-but-set-variable warnings. - -11. The pattern /(?=(*:x))(q|)/ matches an empty string, and returns the mark - "x". The similar pattern /(?=(*:x))((*:y)q|)/ did not return a mark at all. - Oddly, Perl behaves the same way. PCRE has been fixed so that this pattern - also returns the mark "x". This bug applied to capturing parentheses, - non-capturing parentheses, and atomic parentheses. It also applied to some - assertions. - -12. Stephen Kelly's patch to CMakeLists.txt allows it to parse the version - information out of configure.ac instead of relying on pcre.h.generic, which - is not stored in the repository. - -13. Applied Dmitry V. Levin's patch for a more portable method for linking with - -lreadline. - -14. ZH added PCRE_CONFIG_JITTARGET; added its output to pcretest -C. - -15. Applied Graycode's patch to put the top-level frame on the stack rather - than the heap when not using the stack for recursion. This gives a - performance improvement in many cases when recursion is not deep. - -16. Experimental code added to "pcretest -C" to output the stack frame size. - - -Version 8.21 12-Dec-2011 ------------------------- - -1. Updating the JIT compiler. - -2. JIT compiler now supports OP_NCREF, OP_RREF and OP_NRREF. New test cases - are added as well. - -3. Fix cache-flush issue on PowerPC (It is still an experimental JIT port). - PCRE_EXTRA_TABLES is not suported by JIT, and should be checked before - calling _pcre_jit_exec. Some extra comments are added. - -4. (*MARK) settings inside atomic groups that do not contain any capturing - parentheses, for example, (?>a(*:m)), were not being passed out. This bug - was introduced by change 18 for 8.20. - -5. Supporting of \x, \U and \u in JavaScript compatibility mode based on the - ECMA-262 standard. - -6. Lookbehinds such as (?<=a{2}b) that contained a fixed repetition were - erroneously being rejected as "not fixed length" if PCRE_CASELESS was set. - This bug was probably introduced by change 9 of 8.13. - -7. While fixing 6 above, I noticed that a number of other items were being - incorrectly rejected as "not fixed length". This arose partly because newer - opcodes had not been added to the fixed-length checking code. I have (a) - corrected the bug and added tests for these items, and (b) arranged for an - error to occur if an unknown opcode is encountered while checking for fixed - length instead of just assuming "not fixed length". The items that were - rejected were: (*ACCEPT), (*COMMIT), (*FAIL), (*MARK), (*PRUNE), (*SKIP), - (*THEN), \h, \H, \v, \V, and single character negative classes with fixed - repetitions, e.g. [^a]{3}, with and without PCRE_CASELESS. - -8. A possessively repeated conditional subpattern such as (?(?=c)c|d)++ was - being incorrectly compiled and would have given unpredicatble results. - -9. A possessively repeated subpattern with minimum repeat count greater than - one behaved incorrectly. For example, (A){2,}+ behaved as if it was - (A)(A)++ which meant that, after a subsequent mismatch, backtracking into - the first (A) could occur when it should not. - -10. Add a cast and remove a redundant test from the code. - -11. JIT should use pcre_malloc/pcre_free for allocation. - -12. Updated pcre-config so that it no longer shows -L/usr/lib, which seems - best practice nowadays, and helps with cross-compiling. (If the exec_prefix - is anything other than /usr, -L is still shown). - -13. In non-UTF-8 mode, \C is now supported in lookbehinds and DFA matching. - -14. Perl does not support \N without a following name in a [] class; PCRE now - also gives an error. - -15. If a forward reference was repeated with an upper limit of around 2000, - it caused the error "internal error: overran compiling workspace". The - maximum number of forward references (including repeats) was limited by the - internal workspace, and dependent on the LINK_SIZE. The code has been - rewritten so that the workspace expands (via pcre_malloc) if necessary, and - the default depends on LINK_SIZE. There is a new upper limit (for safety) - of around 200,000 forward references. While doing this, I also speeded up - the filling in of repeated forward references. - -16. A repeated forward reference in a pattern such as (a)(?2){2}(.) was - incorrectly expecting the subject to contain another "a" after the start. - -17. When (*SKIP:name) is activated without a corresponding (*MARK:name) earlier - in the match, the SKIP should be ignored. This was not happening; instead - the SKIP was being treated as NOMATCH. For patterns such as - /A(*MARK:A)A+(*SKIP:B)Z|AAC/ this meant that the AAC branch was never - tested. - -18. The behaviour of (*MARK), (*PRUNE), and (*THEN) has been reworked and is - now much more compatible with Perl, in particular in cases where the result - is a non-match for a non-anchored pattern. For example, if - /b(*:m)f|a(*:n)w/ is matched against "abc", the non-match returns the name - "m", where previously it did not return a name. A side effect of this - change is that for partial matches, the last encountered mark name is - returned, as for non matches. A number of tests that were previously not - Perl-compatible have been moved into the Perl-compatible test files. The - refactoring has had the pleasing side effect of removing one argument from - the match() function, thus reducing its stack requirements. - -19. If the /S+ option was used in pcretest to study a pattern using JIT, - subsequent uses of /S (without +) incorrectly behaved like /S+. - -21. Retrieve executable code size support for the JIT compiler and fixing - some warnings. - -22. A caseless match of a UTF-8 character whose other case uses fewer bytes did - not work when the shorter character appeared right at the end of the - subject string. - -23. Added some (int) casts to non-JIT modules to reduce warnings on 64-bit - systems. - -24. Added PCRE_INFO_JITSIZE to pass on the value from (21) above, and also - output it when the /M option is used in pcretest. - -25. The CheckMan script was not being included in the distribution. Also, added - an explicit "perl" to run Perl scripts from the PrepareRelease script - because this is reportedly needed in Windows. - -26. If study data was being save in a file and studying had not found a set of - "starts with" bytes for the pattern, the data written to the file (though - never used) was taken from uninitialized memory and so caused valgrind to - complain. - -27. Updated RunTest.bat as provided by Sheri Pierce. - -28. Fixed a possible uninitialized memory bug in pcre_jit_compile.c. - -29. Computation of memory usage for the table of capturing group names was - giving an unnecessarily large value. - - -Version 8.20 21-Oct-2011 ------------------------- - -1. Change 37 of 8.13 broke patterns like [:a]...[b:] because it thought it had - a POSIX class. After further experiments with Perl, which convinced me that - Perl has bugs and confusions, a closing square bracket is no longer allowed - in a POSIX name. This bug also affected patterns with classes that started - with full stops. - -2. If a pattern such as /(a)b|ac/ is matched against "ac", there is no - captured substring, but while checking the failing first alternative, - substring 1 is temporarily captured. If the output vector supplied to - pcre_exec() was not big enough for this capture, the yield of the function - was still zero ("insufficient space for captured substrings"). This cannot - be totally fixed without adding another stack variable, which seems a lot - of expense for a edge case. However, I have improved the situation in cases - such as /(a)(b)x|abc/ matched against "abc", where the return code - indicates that fewer than the maximum number of slots in the ovector have - been set. - -3. Related to (2) above: when there are more back references in a pattern than - slots in the output vector, pcre_exec() uses temporary memory during - matching, and copies in the captures as far as possible afterwards. It was - using the entire output vector, but this conflicts with the specification - that only 2/3 is used for passing back captured substrings. Now it uses - only the first 2/3, for compatibility. This is, of course, another edge - case. - -4. Zoltan Herczeg's just-in-time compiler support has been integrated into the - main code base, and can be used by building with --enable-jit. When this is - done, pcregrep automatically uses it unless --disable-pcregrep-jit or the - runtime --no-jit option is given. - -5. When the number of matches in a pcre_dfa_exec() run exactly filled the - ovector, the return from the function was zero, implying that there were - other matches that did not fit. The correct "exactly full" value is now - returned. - -6. If a subpattern that was called recursively or as a subroutine contained - (*PRUNE) or any other control that caused it to give a non-standard return, - invalid errors such as "Error -26 (nested recursion at the same subject - position)" or even infinite loops could occur. - -7. If a pattern such as /a(*SKIP)c|b(*ACCEPT)|/ was studied, it stopped - computing the minimum length on reaching *ACCEPT, and so ended up with the - wrong value of 1 rather than 0. Further investigation indicates that - computing a minimum subject length in the presence of *ACCEPT is difficult - (think back references, subroutine calls), and so I have changed the code - so that no minimum is registered for a pattern that contains *ACCEPT. - -8. If (*THEN) was present in the first (true) branch of a conditional group, - it was not handled as intended. [But see 16 below.] - -9. Replaced RunTest.bat and CMakeLists.txt with improved versions provided by - Sheri Pierce. - -10. A pathological pattern such as /(*ACCEPT)a/ was miscompiled, thinking that - the first byte in a match must be "a". - -11. Change 17 for 8.13 increased the recursion depth for patterns like - /a(?:.)*?a/ drastically. I've improved things by remembering whether a - pattern contains any instances of (*THEN). If it does not, the old - optimizations are restored. It would be nice to do this on a per-group - basis, but at the moment that is not feasible. - -12. In some environments, the output of pcretest -C is CRLF terminated. This - broke RunTest's code that checks for the link size. A single white space - character after the value is now allowed for. - -13. RunTest now checks for the "fr" locale as well as for "fr_FR" and "french". - For "fr", it uses the Windows-specific input and output files. - -14. If (*THEN) appeared in a group that was called recursively or as a - subroutine, it did not work as intended. [But see next item.] - -15. Consider the pattern /A (B(*THEN)C) | D/ where A, B, C, and D are complex - pattern fragments (but not containing any | characters). If A and B are - matched, but there is a failure in C so that it backtracks to (*THEN), PCRE - was behaving differently to Perl. PCRE backtracked into A, but Perl goes to - D. In other words, Perl considers parentheses that do not contain any | - characters to be part of a surrounding alternative, whereas PCRE was - treading (B(*THEN)C) the same as (B(*THEN)C|(*FAIL)) -- which Perl handles - differently. PCRE now behaves in the same way as Perl, except in the case - of subroutine/recursion calls such as (?1) which have in any case always - been different (but PCRE had them first :-). - -16. Related to 15 above: Perl does not treat the | in a conditional group as - creating alternatives. Such a group is treated in the same way as an - ordinary group without any | characters when processing (*THEN). PCRE has - been changed to match Perl's behaviour. - -17. If a user had set PCREGREP_COLO(U)R to something other than 1:31, the - RunGrepTest script failed. - -18. Change 22 for version 13 caused atomic groups to use more stack. This is - inevitable for groups that contain captures, but it can lead to a lot of - stack use in large patterns. The old behaviour has been restored for atomic - groups that do not contain any capturing parentheses. - -19. If the PCRE_NO_START_OPTIMIZE option was set for pcre_compile(), it did not - suppress the check for a minimum subject length at run time. (If it was - given to pcre_exec() or pcre_dfa_exec() it did work.) - -20. Fixed an ASCII-dependent infelicity in pcretest that would have made it - fail to work when decoding hex characters in data strings in EBCDIC - environments. - -21. It appears that in at least one Mac OS environment, the isxdigit() function - is implemented as a macro that evaluates to its argument more than once, - contravening the C 90 Standard (I haven't checked a later standard). There - was an instance in pcretest which caused it to go wrong when processing - \x{...} escapes in subject strings. The has been rewritten to avoid using - things like p++ in the argument of isxdigit(). - - -Version 8.13 16-Aug-2011 ------------------------- - -1. The Unicode data tables have been updated to Unicode 6.0.0. - -2. Two minor typos in pcre_internal.h have been fixed. - -3. Added #include to pcre_scanner_unittest.cc, pcrecpp.cc, and - pcrecpp_unittest.cc. They are needed for strcmp(), memset(), and strchr() - in some environments (e.g. Solaris 10/SPARC using Sun Studio 12U2). - -4. There were a number of related bugs in the code for matching backrefences - caselessly in UTF-8 mode when codes for the characters concerned were - different numbers of bytes. For example, U+023A and U+2C65 are an upper - and lower case pair, using 2 and 3 bytes, respectively. The main bugs were: - (a) A reference to 3 copies of a 2-byte code matched only 2 of a 3-byte - code. (b) A reference to 2 copies of a 3-byte code would not match 2 of a - 2-byte code at the end of the subject (it thought there wasn't enough data - left). - -5. Comprehensive information about what went wrong is now returned by - pcre_exec() and pcre_dfa_exec() when the UTF-8 string check fails, as long - as the output vector has at least 2 elements. The offset of the start of - the failing character and a reason code are placed in the vector. - -6. When the UTF-8 string check fails for pcre_compile(), the offset that is - now returned is for the first byte of the failing character, instead of the - last byte inspected. This is an incompatible change, but I hope it is small - enough not to be a problem. It makes the returned offset consistent with - pcre_exec() and pcre_dfa_exec(). - -7. pcretest now gives a text phrase as well as the error number when - pcre_exec() or pcre_dfa_exec() fails; if the error is a UTF-8 check - failure, the offset and reason code are output. - -8. When \R was used with a maximizing quantifier it failed to skip backwards - over a \r\n pair if the subsequent match failed. Instead, it just skipped - back over a single character (\n). This seems wrong (because it treated the - two characters as a single entity when going forwards), conflicts with the - documentation that \R is equivalent to (?>\r\n|\n|...etc), and makes the - behaviour of \R* different to (\R)*, which also seems wrong. The behaviour - has been changed. - -9. Some internal refactoring has changed the processing so that the handling - of the PCRE_CASELESS and PCRE_MULTILINE options is done entirely at compile - time (the PCRE_DOTALL option was changed this way some time ago: version - 7.7 change 16). This has made it possible to abolish the OP_OPT op code, - which was always a bit of a fudge. It also means that there is one less - argument for the match() function, which reduces its stack requirements - slightly. This change also fixes an incompatibility with Perl: the pattern - (?i:([^b]))(?1) should not match "ab", but previously PCRE gave a match. - -10. More internal refactoring has drastically reduced the number of recursive - calls to match() for possessively repeated groups such as (abc)++ when - using pcre_exec(). - -11. While implementing 10, a number of bugs in the handling of groups were - discovered and fixed: - - (?<=(a)+) was not diagnosed as invalid (non-fixed-length lookbehind). - (a|)*(?1) gave a compile-time internal error. - ((a|)+)+ did not notice that the outer group could match an empty string. - (^a|^)+ was not marked as anchored. - (.*a|.*)+ was not marked as matching at start or after a newline. - -12. Yet more internal refactoring has removed another argument from the match() - function. Special calls to this function are now indicated by setting a - value in a variable in the "match data" data block. - -13. Be more explicit in pcre_study() instead of relying on "default" for - opcodes that mean there is no starting character; this means that when new - ones are added and accidentally left out of pcre_study(), testing should - pick them up. - -14. The -s option of pcretest has been documented for ages as being an old - synonym of -m (show memory usage). I have changed it to mean "force study - for every regex", that is, assume /S for every regex. This is similar to -i - and -d etc. It's slightly incompatible, but I'm hoping nobody is still - using it. It makes it easier to run collections of tests with and without - study enabled, and thereby test pcre_study() more easily. All the standard - tests are now run with and without -s (but some patterns can be marked as - "never study" - see 20 below). - -15. When (*ACCEPT) was used in a subpattern that was called recursively, the - restoration of the capturing data to the outer values was not happening - correctly. - -16. If a recursively called subpattern ended with (*ACCEPT) and matched an - empty string, and PCRE_NOTEMPTY was set, pcre_exec() thought the whole - pattern had matched an empty string, and so incorrectly returned a no - match. - -17. There was optimizing code for the last branch of non-capturing parentheses, - and also for the obeyed branch of a conditional subexpression, which used - tail recursion to cut down on stack usage. Unfortunately, now that there is - the possibility of (*THEN) occurring in these branches, tail recursion is - no longer possible because the return has to be checked for (*THEN). These - two optimizations have therefore been removed. [But see 8.20/11 above.] - -18. If a pattern containing \R was studied, it was assumed that \R always - matched two bytes, thus causing the minimum subject length to be - incorrectly computed because \R can also match just one byte. - -19. If a pattern containing (*ACCEPT) was studied, the minimum subject length - was incorrectly computed. - -20. If /S is present twice on a test pattern in pcretest input, it now - *disables* studying, thereby overriding the use of -s on the command line - (see 14 above). This is necessary for one or two tests to keep the output - identical in both cases. - -21. When (*ACCEPT) was used in an assertion that matched an empty string and - PCRE_NOTEMPTY was set, PCRE applied the non-empty test to the assertion. - -22. When an atomic group that contained a capturing parenthesis was - successfully matched, but the branch in which it appeared failed, the - capturing was not being forgotten if a higher numbered group was later - captured. For example, /(?>(a))b|(a)c/ when matching "ac" set capturing - group 1 to "a", when in fact it should be unset. This applied to multi- - branched capturing and non-capturing groups, repeated or not, and also to - positive assertions (capturing in negative assertions does not happen - in PCRE) and also to nested atomic groups. - -23. Add the ++ qualifier feature to pcretest, to show the remainder of the - subject after a captured substring, to make it easier to tell which of a - number of identical substrings has been captured. - -24. The way atomic groups are processed by pcre_exec() has been changed so that - if they are repeated, backtracking one repetition now resets captured - values correctly. For example, if ((?>(a+)b)+aabab) is matched against - "aaaabaaabaabab" the value of captured group 2 is now correctly recorded as - "aaa". Previously, it would have been "a". As part of this code - refactoring, the way recursive calls are handled has also been changed. - -25. If an assertion condition captured any substrings, they were not passed - back unless some other capturing happened later. For example, if - (?(?=(a))a) was matched against "a", no capturing was returned. - -26. When studying a pattern that contained subroutine calls or assertions, - the code for finding the minimum length of a possible match was handling - direct recursions such as (xxx(?1)|yyy) but not mutual recursions (where - group 1 called group 2 while simultaneously a separate group 2 called group - 1). A stack overflow occurred in this case. I have fixed this by limiting - the recursion depth to 10. - -27. Updated RunTest.bat in the distribution to the version supplied by Tom - Fortmann. This supports explicit test numbers on the command line, and has - argument validation and error reporting. - -28. An instance of \X with an unlimited repeat could fail if at any point the - first character it looked at was a mark character. - -29. Some minor code refactoring concerning Unicode properties and scripts - should reduce the stack requirement of match() slightly. - -30. Added the '=' option to pcretest to check the setting of unused capturing - slots at the end of the pattern, which are documented as being -1, but are - not included in the return count. - -31. If \k was not followed by a braced, angle-bracketed, or quoted name, PCRE - compiled something random. Now it gives a compile-time error (as does - Perl). - -32. A *MARK encountered during the processing of a positive assertion is now - recorded and passed back (compatible with Perl). - -33. If --only-matching or --colour was set on a pcregrep call whose pattern - had alternative anchored branches, the search for a second match in a line - was done as if at the line start. Thus, for example, /^01|^02/ incorrectly - matched the line "0102" twice. The same bug affected patterns that started - with a backwards assertion. For example /\b01|\b02/ also matched "0102" - twice. - -34. Previously, PCRE did not allow quantification of assertions. However, Perl - does, and because of capturing effects, quantifying parenthesized - assertions may at times be useful. Quantifiers are now allowed for - parenthesized assertions. - -35. A minor code tidy in pcre_compile() when checking options for \R usage. - -36. \g was being checked for fancy things in a character class, when it should - just be a literal "g". - -37. PCRE was rejecting [:a[:digit:]] whereas Perl was not. It seems that the - appearance of a nested POSIX class supersedes an apparent external class. - For example, [:a[:digit:]b:] matches "a", "b", ":", or a digit. Also, - unescaped square brackets may also appear as part of class names. For - example, [:a[:abc]b:] gives unknown class "[:abc]b:]". PCRE now behaves - more like Perl. (But see 8.20/1 above.) - -38. PCRE was giving an error for \N with a braced quantifier such as {1,} (this - was because it thought it was \N{name}, which is not supported). - -39. Add minix to OS list not supporting the -S option in pcretest. - -40. PCRE tries to detect cases of infinite recursion at compile time, but it - cannot analyze patterns in sufficient detail to catch mutual recursions - such as ((?1))((?2)). There is now a runtime test that gives an error if a - subgroup is called recursively as a subpattern for a second time at the - same position in the subject string. In previous releases this might have - been caught by the recursion limit, or it might have run out of stack. - -41. A pattern such as /(?(R)a+|(?R)b)/ is quite safe, as the recursion can - happen only once. PCRE was, however incorrectly giving a compile time error - "recursive call could loop indefinitely" because it cannot analyze the - pattern in sufficient detail. The compile time test no longer happens when - PCRE is compiling a conditional subpattern, but actual runaway loops are - now caught at runtime (see 40 above). - -42. It seems that Perl allows any characters other than a closing parenthesis - to be part of the NAME in (*MARK:NAME) and other backtracking verbs. PCRE - has been changed to be the same. - -43. Updated configure.ac to put in more quoting round AC_LANG_PROGRAM etc. so - as not to get warnings when autogen.sh is called. Also changed - AC_PROG_LIBTOOL (deprecated) to LT_INIT (the current macro). - -44. To help people who use pcregrep to scan files containing exceedingly long - lines, the following changes have been made: - - (a) The default value of the buffer size parameter has been increased from - 8K to 20K. (The actual buffer used is three times this size.) - - (b) The default can be changed by ./configure --with-pcregrep-bufsize when - PCRE is built. - - (c) A --buffer-size=n option has been added to pcregrep, to allow the size - to be set at run time. - - (d) Numerical values in pcregrep options can be followed by K or M, for - example --buffer-size=50K. - - (e) If a line being scanned overflows pcregrep's buffer, an error is now - given and the return code is set to 2. - -45. Add a pointer to the latest mark to the callout data block. - -46. The pattern /.(*F)/, when applied to "abc" with PCRE_PARTIAL_HARD, gave a - partial match of an empty string instead of no match. This was specific to - the use of ".". - -47. The pattern /f.*/8s, when applied to "for" with PCRE_PARTIAL_HARD, gave a - complete match instead of a partial match. This bug was dependent on both - the PCRE_UTF8 and PCRE_DOTALL options being set. - -48. For a pattern such as /\babc|\bdef/ pcre_study() was failing to set up the - starting byte set, because \b was not being ignored. - - -Version 8.12 15-Jan-2011 ------------------------- - -1. Fixed some typos in the markup of the man pages, and wrote a script that - checks for such things as part of the documentation building process. - -2. On a big-endian 64-bit system, pcregrep did not correctly process the - --match-limit and --recursion-limit options (added for 8.11). In - particular, this made one of the standard tests fail. (The integer value - went into the wrong half of a long int.) - -3. If the --colour option was given to pcregrep with -v (invert match), it - did strange things, either producing crazy output, or crashing. It should, - of course, ignore a request for colour when reporting lines that do not - match. - -4. Another pcregrep bug caused similar problems if --colour was specified with - -M (multiline) and the pattern match finished with a line ending. - -5. In pcregrep, when a pattern that ended with a literal newline sequence was - matched in multiline mode, the following line was shown as part of the - match. This seems wrong, so I have changed it. - -6. Another pcregrep bug in multiline mode, when --colour was specified, caused - the check for further matches in the same line (so they could be coloured) - to overrun the end of the current line. If another match was found, it was - incorrectly shown (and then shown again when found in the next line). - -7. If pcregrep was compiled under Windows, there was a reference to the - function pcregrep_exit() before it was defined. I am assuming this was - the cause of the "error C2371: 'pcregrep_exit' : redefinition;" that was - reported by a user. I've moved the definition above the reference. - - -Version 8.11 10-Dec-2010 ------------------------- - -1. (*THEN) was not working properly if there were untried alternatives prior - to it in the current branch. For example, in ((a|b)(*THEN)(*F)|c..) it - backtracked to try for "b" instead of moving to the next alternative branch - at the same level (in this case, to look for "c"). The Perl documentation - is clear that when (*THEN) is backtracked onto, it goes to the "next - alternative in the innermost enclosing group". - -2. (*COMMIT) was not overriding (*THEN), as it does in Perl. In a pattern - such as (A(*COMMIT)B(*THEN)C|D) any failure after matching A should - result in overall failure. Similarly, (*COMMIT) now overrides (*PRUNE) and - (*SKIP), (*SKIP) overrides (*PRUNE) and (*THEN), and (*PRUNE) overrides - (*THEN). - -3. If \s appeared in a character class, it removed the VT character from - the class, even if it had been included by some previous item, for example - in [\x00-\xff\s]. (This was a bug related to the fact that VT is not part - of \s, but is part of the POSIX "space" class.) - -4. A partial match never returns an empty string (because you can always - match an empty string at the end of the subject); however the checking for - an empty string was starting at the "start of match" point. This has been - changed to the "earliest inspected character" point, because the returned - data for a partial match starts at this character. This means that, for - example, /(?<=abc)def/ gives a partial match for the subject "abc" - (previously it gave "no match"). - -5. Changes have been made to the way PCRE_PARTIAL_HARD affects the matching - of $, \z, \Z, \b, and \B. If the match point is at the end of the string, - previously a full match would be given. However, setting PCRE_PARTIAL_HARD - has an implication that the given string is incomplete (because a partial - match is preferred over a full match). For this reason, these items now - give a partial match in this situation. [Aside: previously, the one case - /t\b/ matched against "cat" with PCRE_PARTIAL_HARD set did return a partial - match rather than a full match, which was wrong by the old rules, but is - now correct.] - -6. There was a bug in the handling of #-introduced comments, recognized when - PCRE_EXTENDED is set, when PCRE_NEWLINE_ANY and PCRE_UTF8 were also set. - If a UTF-8 multi-byte character included the byte 0x85 (e.g. +U0445, whose - UTF-8 encoding is 0xd1,0x85), this was misinterpreted as a newline when - scanning for the end of the comment. (*Character* 0x85 is an "any" newline, - but *byte* 0x85 is not, in UTF-8 mode). This bug was present in several - places in pcre_compile(). - -7. Related to (6) above, when pcre_compile() was skipping #-introduced - comments when looking ahead for named forward references to subpatterns, - the only newline sequence it recognized was NL. It now handles newlines - according to the set newline convention. - -8. SunOS4 doesn't have strerror() or strtoul(); pcregrep dealt with the - former, but used strtoul(), whereas pcretest avoided strtoul() but did not - cater for a lack of strerror(). These oversights have been fixed. - -9. Added --match-limit and --recursion-limit to pcregrep. - -10. Added two casts needed to build with Visual Studio when NO_RECURSE is set. - -11. When the -o option was used, pcregrep was setting a return code of 1, even - when matches were found, and --line-buffered was not being honoured. - -12. Added an optional parentheses number to the -o and --only-matching options - of pcregrep. - -13. Imitating Perl's /g action for multiple matches is tricky when the pattern - can match an empty string. The code to do it in pcretest and pcredemo - needed fixing: - - (a) When the newline convention was "crlf", pcretest got it wrong, skipping - only one byte after an empty string match just before CRLF (this case - just got forgotten; "any" and "anycrlf" were OK). - - (b) The pcretest code also had a bug, causing it to loop forever in UTF-8 - mode when an empty string match preceded an ASCII character followed by - a non-ASCII character. (The code for advancing by one character rather - than one byte was nonsense.) - - (c) The pcredemo.c sample program did not have any code at all to handle - the cases when CRLF is a valid newline sequence. - -14. Neither pcre_exec() nor pcre_dfa_exec() was checking that the value given - as a starting offset was within the subject string. There is now a new - error, PCRE_ERROR_BADOFFSET, which is returned if the starting offset is - negative or greater than the length of the string. In order to test this, - pcretest is extended to allow the setting of negative starting offsets. - -15. In both pcre_exec() and pcre_dfa_exec() the code for checking that the - starting offset points to the beginning of a UTF-8 character was - unnecessarily clumsy. I tidied it up. - -16. Added PCRE_ERROR_SHORTUTF8 to make it possible to distinguish between a - bad UTF-8 sequence and one that is incomplete when using PCRE_PARTIAL_HARD. - -17. Nobody had reported that the --include_dir option, which was added in - release 7.7 should have been called --include-dir (hyphen, not underscore) - for compatibility with GNU grep. I have changed it to --include-dir, but - left --include_dir as an undocumented synonym, and the same for - --exclude-dir, though that is not available in GNU grep, at least as of - release 2.5.4. - -18. At a user's suggestion, the macros GETCHAR and friends (which pick up UTF-8 - characters from a string of bytes) have been redefined so as not to use - loops, in order to improve performance in some environments. At the same - time, I abstracted some of the common code into auxiliary macros to save - repetition (this should not affect the compiled code). - -19. If \c was followed by a multibyte UTF-8 character, bad things happened. A - compile-time error is now given if \c is not followed by an ASCII - character, that is, a byte less than 128. (In EBCDIC mode, the code is - different, and any byte value is allowed.) - -20. Recognize (*NO_START_OPT) at the start of a pattern to set the PCRE_NO_ - START_OPTIMIZE option, which is now allowed at compile time - but just - passed through to pcre_exec() or pcre_dfa_exec(). This makes it available - to pcregrep and other applications that have no direct access to PCRE - options. The new /Y option in pcretest sets this option when calling - pcre_compile(). - -21. Change 18 of release 8.01 broke the use of named subpatterns for recursive - back references. Groups containing recursive back references were forced to - be atomic by that change, but in the case of named groups, the amount of - memory required was incorrectly computed, leading to "Failed: internal - error: code overflow". This has been fixed. - -22. Some patches to pcre_stringpiece.h, pcre_stringpiece_unittest.cc, and - pcretest.c, to avoid build problems in some Borland environments. - - -Version 8.10 25-Jun-2010 ------------------------- - -1. Added support for (*MARK:ARG) and for ARG additions to PRUNE, SKIP, and - THEN. - -2. (*ACCEPT) was not working when inside an atomic group. - -3. Inside a character class, \B is treated as a literal by default, but - faulted if PCRE_EXTRA is set. This mimics Perl's behaviour (the -w option - causes the error). The code is unchanged, but I tidied the documentation. - -4. Inside a character class, PCRE always treated \R and \X as literals, - whereas Perl faults them if its -w option is set. I have changed PCRE so - that it faults them when PCRE_EXTRA is set. - -5. Added support for \N, which always matches any character other than - newline. (It is the same as "." when PCRE_DOTALL is not set.) - -6. When compiling pcregrep with newer versions of gcc which may have - FORTIFY_SOURCE set, several warnings "ignoring return value of 'fwrite', - declared with attribute warn_unused_result" were given. Just casting the - result to (void) does not stop the warnings; a more elaborate fudge is - needed. I've used a macro to implement this. - -7. Minor change to pcretest.c to avoid a compiler warning. - -8. Added four artifical Unicode properties to help with an option to make - \s etc use properties (see next item). The new properties are: Xan - (alphanumeric), Xsp (Perl space), Xps (POSIX space), and Xwd (word). - -9. Added PCRE_UCP to make \b, \d, \s, \w, and certain POSIX character classes - use Unicode properties. (*UCP) at the start of a pattern can be used to set - this option. Modified pcretest to add /W to test this facility. Added - REG_UCP to make it available via the POSIX interface. - -10. Added --line-buffered to pcregrep. - -11. In UTF-8 mode, if a pattern that was compiled with PCRE_CASELESS was - studied, and the match started with a letter with a code point greater than - 127 whose first byte was different to the first byte of the other case of - the letter, the other case of this starting letter was not recognized - (#976). - -12. If a pattern that was studied started with a repeated Unicode property - test, for example, \p{Nd}+, there was the theoretical possibility of - setting up an incorrect bitmap of starting bytes, but fortunately it could - not have actually happened in practice until change 8 above was made (it - added property types that matched character-matching opcodes). - -13. pcre_study() now recognizes \h, \v, and \R when constructing a bit map of - possible starting bytes for non-anchored patterns. - -14. Extended the "auto-possessify" feature of pcre_compile(). It now recognizes - \R, and also a number of cases that involve Unicode properties, both - explicit and implicit when PCRE_UCP is set. - -15. If a repeated Unicode property match (e.g. \p{Lu}*) was used with non-UTF-8 - input, it could crash or give wrong results if characters with values - greater than 0xc0 were present in the subject string. (Detail: it assumed - UTF-8 input when processing these items.) - -16. Added a lot of (int) casts to avoid compiler warnings in systems where - size_t is 64-bit (#991). - -17. Added a check for running out of memory when PCRE is compiled with - --disable-stack-for-recursion (#990). - -18. If the last data line in a file for pcretest does not have a newline on - the end, a newline was missing in the output. - -19. The default pcre_chartables.c file recognizes only ASCII characters (values - less than 128) in its various bitmaps. However, there is a facility for - generating tables according to the current locale when PCRE is compiled. It - turns out that in some environments, 0x85 and 0xa0, which are Unicode space - characters, are recognized by isspace() and therefore were getting set in - these tables, and indeed these tables seem to approximate to ISO 8859. This - caused a problem in UTF-8 mode when pcre_study() was used to create a list - of bytes that can start a match. For \s, it was including 0x85 and 0xa0, - which of course cannot start UTF-8 characters. I have changed the code so - that only real ASCII characters (less than 128) and the correct starting - bytes for UTF-8 encodings are set for characters greater than 127 when in - UTF-8 mode. (When PCRE_UCP is set - see 9 above - the code is different - altogether.) - -20. Added the /T option to pcretest so as to be able to run tests with non- - standard character tables, thus making it possible to include the tests - used for 19 above in the standard set of tests. - -21. A pattern such as (?&t)(?#()(?(DEFINE)(?a)) which has a forward - reference to a subpattern the other side of a comment that contains an - opening parenthesis caused either an internal compiling error, or a - reference to the wrong subpattern. - - -Version 8.02 19-Mar-2010 ------------------------- - -1. The Unicode data tables have been updated to Unicode 5.2.0. - -2. Added the option --libs-cpp to pcre-config, but only when C++ support is - configured. - -3. Updated the licensing terms in the pcregexp.pas file, as agreed with the - original author of that file, following a query about its status. - -4. On systems that do not have stdint.h (e.g. Solaris), check for and include - inttypes.h instead. This fixes a bug that was introduced by change 8.01/8. - -5. A pattern such as (?&t)*+(?(DEFINE)(?.)) which has a possessive - quantifier applied to a forward-referencing subroutine call, could compile - incorrect code or give the error "internal error: previously-checked - referenced subpattern not found". - -6. Both MS Visual Studio and Symbian OS have problems with initializing - variables to point to external functions. For these systems, therefore, - pcre_malloc etc. are now initialized to local functions that call the - relevant global functions. - -7. There were two entries missing in the vectors called coptable and poptable - in pcre_dfa_exec.c. This could lead to memory accesses outsize the vectors. - I've fixed the data, and added a kludgy way of testing at compile time that - the lengths are correct (equal to the number of opcodes). - -8. Following on from 7, I added a similar kludge to check the length of the - eint vector in pcreposix.c. - -9. Error texts for pcre_compile() are held as one long string to avoid too - much relocation at load time. To find a text, the string is searched, - counting zeros. There was no check for running off the end of the string, - which could happen if a new error number was added without updating the - string. - -10. \K gave a compile-time error if it appeared in a lookbehind assersion. - -11. \K was not working if it appeared in an atomic group or in a group that - was called as a "subroutine", or in an assertion. Perl 5.11 documents that - \K is "not well defined" if used in an assertion. PCRE now accepts it if - the assertion is positive, but not if it is negative. - -12. Change 11 fortuitously reduced the size of the stack frame used in the - "match()" function of pcre_exec.c by one pointer. Forthcoming - implementation of support for (*MARK) will need an extra pointer on the - stack; I have reserved it now, so that the stack frame size does not - decrease. - -13. A pattern such as (?P(?P0)|(?P>L2)(?P>L1)) in which the only other - item in branch that calls a recursion is a subroutine call - as in the - second branch in the above example - was incorrectly given the compile- - time error "recursive call could loop indefinitely" because pcre_compile() - was not correctly checking the subroutine for matching a non-empty string. - -14. The checks for overrunning compiling workspace could trigger after an - overrun had occurred. This is a "should never occur" error, but it can be - triggered by pathological patterns such as hundreds of nested parentheses. - The checks now trigger 100 bytes before the end of the workspace. - -15. Fix typo in configure.ac: "srtoq" should be "strtoq". - - -Version 8.01 19-Jan-2010 ------------------------- - -1. If a pattern contained a conditional subpattern with only one branch (in - particular, this includes all (*DEFINE) patterns), a call to pcre_study() - computed the wrong minimum data length (which is of course zero for such - subpatterns). This could cause incorrect "no match" results. - -2. For patterns such as (?i)a(?-i)b|c where an option setting at the start of - the pattern is reset in the first branch, pcre_compile() failed with - "internal error: code overflow at offset...". This happened only when - the reset was to the original external option setting. (An optimization - abstracts leading options settings into an external setting, which was the - cause of this.) - -3. A pattern such as ^(?!a(*SKIP)b) where a negative assertion contained one - of the verbs SKIP, PRUNE, or COMMIT, did not work correctly. When the - assertion pattern did not match (meaning that the assertion was true), it - was incorrectly treated as false if the SKIP had been reached during the - matching. This also applied to assertions used as conditions. - -4. If an item that is not supported by pcre_dfa_exec() was encountered in an - assertion subpattern, including such a pattern used as a condition, - unpredictable results occurred, instead of the error return - PCRE_ERROR_DFA_UITEM. - -5. The C++ GlobalReplace function was not working like Perl for the special - situation when an empty string is matched. It now does the fancy magic - stuff that is necessary. - -6. In pcre_internal.h, obsolete includes to setjmp.h and stdarg.h have been - removed. (These were left over from very, very early versions of PCRE.) - -7. Some cosmetic changes to the code to make life easier when compiling it - as part of something else: - - (a) Change DEBUG to PCRE_DEBUG. - - (b) In pcre_compile(), rename the member of the "branch_chain" structure - called "current" as "current_branch", to prevent a collision with the - Linux macro when compiled as a kernel module. - - (c) In pcre_study(), rename the function set_bit() as set_table_bit(), to - prevent a collision with the Linux macro when compiled as a kernel - module. - -8. In pcre_compile() there are some checks for integer overflows that used to - cast potentially large values to (double). This has been changed to that - when building, a check for int64_t is made, and if it is found, it is used - instead, thus avoiding the use of floating point arithmetic. (There is no - other use of FP in PCRE.) If int64_t is not found, the fallback is to - double. - -9. Added two casts to avoid signed/unsigned warnings from VS Studio Express - 2005 (difference between two addresses compared to an unsigned value). - -10. Change the standard AC_CHECK_LIB test for libbz2 in configure.ac to a - custom one, because of the following reported problem in Windows: - - - libbz2 uses the Pascal calling convention (WINAPI) for the functions - under Win32. - - The standard autoconf AC_CHECK_LIB fails to include "bzlib.h", - therefore missing the function definition. - - The compiler thus generates a "C" signature for the test function. - - The linker fails to find the "C" function. - - PCRE fails to configure if asked to do so against libbz2. - -11. When running libtoolize from libtool-2.2.6b as part of autogen.sh, these - messages were output: - - Consider adding `AC_CONFIG_MACRO_DIR([m4])' to configure.ac and - rerunning libtoolize, to keep the correct libtool macros in-tree. - Consider adding `-I m4' to ACLOCAL_AMFLAGS in Makefile.am. - - I have done both of these things. - -12. Although pcre_dfa_exec() does not use nearly as much stack as pcre_exec() - most of the time, it *can* run out if it is given a pattern that contains a - runaway infinite recursion. I updated the discussion in the pcrestack man - page. - -13. Now that we have gone to the x.xx style of version numbers, the minor - version may start with zero. Using 08 or 09 is a bad idea because users - might check the value of PCRE_MINOR in their code, and 08 or 09 may be - interpreted as invalid octal numbers. I've updated the previous comment in - configure.ac, and also added a check that gives an error if 08 or 09 are - used. - -14. Change 8.00/11 was not quite complete: code had been accidentally omitted, - causing partial matching to fail when the end of the subject matched \W - in a UTF-8 pattern where \W was quantified with a minimum of 3. - -15. There were some discrepancies between the declarations in pcre_internal.h - of _pcre_is_newline(), _pcre_was_newline(), and _pcre_valid_utf8() and - their definitions. The declarations used "const uschar *" and the - definitions used USPTR. Even though USPTR is normally defined as "const - unsigned char *" (and uschar is typedeffed as "unsigned char"), it was - reported that: "This difference in casting confuses some C++ compilers, for - example, SunCC recognizes above declarations as different functions and - generates broken code for hbpcre." I have changed the declarations to use - USPTR. - -16. GNU libtool is named differently on some systems. The autogen.sh script now - tries several variants such as glibtoolize (MacOSX) and libtoolize1x - (FreeBSD). - -17. Applied Craig's patch that fixes an HP aCC compile error in pcre 8.00 - (strtoXX undefined when compiling pcrecpp.cc). The patch contains this - comment: "Figure out how to create a longlong from a string: strtoll and - equivalent. It's not enough to call AC_CHECK_FUNCS: hpux has a strtoll, for - instance, but it only takes 2 args instead of 3!" - -18. A subtle bug concerned with back references has been fixed by a change of - specification, with a corresponding code fix. A pattern such as - ^(xa|=?\1a)+$ which contains a back reference inside the group to which it - refers, was giving matches when it shouldn't. For example, xa=xaaa would - match that pattern. Interestingly, Perl (at least up to 5.11.3) has the - same bug. Such groups have to be quantified to be useful, or contained - inside another quantified group. (If there's no repetition, the reference - can never match.) The problem arises because, having left the group and - moved on to the rest of the pattern, a later failure that backtracks into - the group uses the captured value from the final iteration of the group - rather than the correct earlier one. I have fixed this in PCRE by forcing - any group that contains a reference to itself to be an atomic group; that - is, there cannot be any backtracking into it once it has completed. This is - similar to recursive and subroutine calls. - - -Version 8.00 19-Oct-09 ----------------------- - -1. The table for translating pcre_compile() error codes into POSIX error codes - was out-of-date, and there was no check on the pcre_compile() error code - being within the table. This could lead to an OK return being given in - error. - -2. Changed the call to open a subject file in pcregrep from fopen(pathname, - "r") to fopen(pathname, "rb"), which fixed a problem with some of the tests - in a Windows environment. - -3. The pcregrep --count option prints the count for each file even when it is - zero, as does GNU grep. However, pcregrep was also printing all files when - --files-with-matches was added. Now, when both options are given, it prints - counts only for those files that have at least one match. (GNU grep just - prints the file name in this circumstance, but including the count seems - more useful - otherwise, why use --count?) Also ensured that the - combination -clh just lists non-zero counts, with no names. - -4. The long form of the pcregrep -F option was incorrectly implemented as - --fixed_strings instead of --fixed-strings. This is an incompatible change, - but it seems right to fix it, and I didn't think it was worth preserving - the old behaviour. - -5. The command line items --regex=pattern and --regexp=pattern were not - recognized by pcregrep, which required --regex pattern or --regexp pattern - (with a space rather than an '='). The man page documented the '=' forms, - which are compatible with GNU grep; these now work. - -6. No libpcreposix.pc file was created for pkg-config; there was just - libpcre.pc and libpcrecpp.pc. The omission has been rectified. - -7. Added #ifndef SUPPORT_UCP into the pcre_ucd.c module, to reduce its size - when UCP support is not needed, by modifying the Python script that - generates it from Unicode data files. This should not matter if the module - is correctly used as a library, but I received one complaint about 50K of - unwanted data. My guess is that the person linked everything into his - program rather than using a library. Anyway, it does no harm. - -8. A pattern such as /\x{123}{2,2}+/8 was incorrectly compiled; the trigger - was a minimum greater than 1 for a wide character in a possessive - repetition. The same bug could also affect patterns like /(\x{ff}{0,2})*/8 - which had an unlimited repeat of a nested, fixed maximum repeat of a wide - character. Chaos in the form of incorrect output or a compiling loop could - result. - -9. The restrictions on what a pattern can contain when partial matching is - requested for pcre_exec() have been removed. All patterns can now be - partially matched by this function. In addition, if there are at least two - slots in the offset vector, the offset of the earliest inspected character - for the match and the offset of the end of the subject are set in them when - PCRE_ERROR_PARTIAL is returned. - -10. Partial matching has been split into two forms: PCRE_PARTIAL_SOFT, which is - synonymous with PCRE_PARTIAL, for backwards compatibility, and - PCRE_PARTIAL_HARD, which causes a partial match to supersede a full match, - and may be more useful for multi-segment matching. - -11. Partial matching with pcre_exec() is now more intuitive. A partial match - used to be given if ever the end of the subject was reached; now it is - given only if matching could not proceed because another character was - needed. This makes a difference in some odd cases such as Z(*FAIL) with the - string "Z", which now yields "no match" instead of "partial match". In the - case of pcre_dfa_exec(), "no match" is given if every matching path for the - final character ended with (*FAIL). - -12. Restarting a match using pcre_dfa_exec() after a partial match did not work - if the pattern had a "must contain" character that was already found in the - earlier partial match, unless partial matching was again requested. For - example, with the pattern /dog.(body)?/, the "must contain" character is - "g". If the first part-match was for the string "dog", restarting with - "sbody" failed. This bug has been fixed. - -13. The string returned by pcre_dfa_exec() after a partial match has been - changed so that it starts at the first inspected character rather than the - first character of the match. This makes a difference only if the pattern - starts with a lookbehind assertion or \b or \B (\K is not supported by - pcre_dfa_exec()). It's an incompatible change, but it makes the two - matching functions compatible, and I think it's the right thing to do. - -14. Added a pcredemo man page, created automatically from the pcredemo.c file, - so that the demonstration program is easily available in environments where - PCRE has not been installed from source. - -15. Arranged to add -DPCRE_STATIC to cflags in libpcre.pc, libpcreposix.cp, - libpcrecpp.pc and pcre-config when PCRE is not compiled as a shared - library. - -16. Added REG_UNGREEDY to the pcreposix interface, at the request of a user. - It maps to PCRE_UNGREEDY. It is not, of course, POSIX-compatible, but it - is not the first non-POSIX option to be added. Clearly some people find - these options useful. - -17. If a caller to the POSIX matching function regexec() passes a non-zero - value for nmatch with a NULL value for pmatch, the value of - nmatch is forced to zero. - -18. RunGrepTest did not have a test for the availability of the -u option of - the diff command, as RunTest does. It now checks in the same way as - RunTest, and also checks for the -b option. - -19. If an odd number of negated classes containing just a single character - interposed, within parentheses, between a forward reference to a named - subpattern and the definition of the subpattern, compilation crashed with - an internal error, complaining that it could not find the referenced - subpattern. An example of a crashing pattern is /(?&A)(([^m])(?))/. - [The bug was that it was starting one character too far in when skipping - over the character class, thus treating the ] as data rather than - terminating the class. This meant it could skip too much.] - -20. Added PCRE_NOTEMPTY_ATSTART in order to be able to correctly implement the - /g option in pcretest when the pattern contains \K, which makes it possible - to have an empty string match not at the start, even when the pattern is - anchored. Updated pcretest and pcredemo to use this option. - -21. If the maximum number of capturing subpatterns in a recursion was greater - than the maximum at the outer level, the higher number was returned, but - with unset values at the outer level. The correct (outer level) value is - now given. - -22. If (*ACCEPT) appeared inside capturing parentheses, previous releases of - PCRE did not set those parentheses (unlike Perl). I have now found a way to - make it do so. The string so far is captured, making this feature - compatible with Perl. - -23. The tests have been re-organized, adding tests 11 and 12, to make it - possible to check the Perl 5.10 features against Perl 5.10. - -24. Perl 5.10 allows subroutine calls in lookbehinds, as long as the subroutine - pattern matches a fixed length string. PCRE did not allow this; now it - does. Neither allows recursion. - -25. I finally figured out how to implement a request to provide the minimum - length of subject string that was needed in order to match a given pattern. - (It was back references and recursion that I had previously got hung up - on.) This code has now been added to pcre_study(); it finds a lower bound - to the length of subject needed. It is not necessarily the greatest lower - bound, but using it to avoid searching strings that are too short does give - some useful speed-ups. The value is available to calling programs via - pcre_fullinfo(). - -26. While implementing 25, I discovered to my embarrassment that pcretest had - not been passing the result of pcre_study() to pcre_dfa_exec(), so the - study optimizations had never been tested with that matching function. - Oops. What is worse, even when it was passed study data, there was a bug in - pcre_dfa_exec() that meant it never actually used it. Double oops. There - were also very few tests of studied patterns with pcre_dfa_exec(). - -27. If (?| is used to create subpatterns with duplicate numbers, they are now - allowed to have the same name, even if PCRE_DUPNAMES is not set. However, - on the other side of the coin, they are no longer allowed to have different - names, because these cannot be distinguished in PCRE, and this has caused - confusion. (This is a difference from Perl.) - -28. When duplicate subpattern names are present (necessarily with different - numbers, as required by 27 above), and a test is made by name in a - conditional pattern, either for a subpattern having been matched, or for - recursion in such a pattern, all the associated numbered subpatterns are - tested, and the overall condition is true if the condition is true for any - one of them. This is the way Perl works, and is also more like the way - testing by number works. - - -Version 7.9 11-Apr-09 ---------------------- - -1. When building with support for bzlib/zlib (pcregrep) and/or readline - (pcretest), all targets were linked against these libraries. This included - libpcre, libpcreposix, and libpcrecpp, even though they do not use these - libraries. This caused unwanted dependencies to be created. This problem - has been fixed, and now only pcregrep is linked with bzlib/zlib and only - pcretest is linked with readline. - -2. The "typedef int BOOL" in pcre_internal.h that was included inside the - "#ifndef FALSE" condition by an earlier change (probably 7.8/18) has been - moved outside it again, because FALSE and TRUE are already defined in AIX, - but BOOL is not. - -3. The pcre_config() function was treating the PCRE_MATCH_LIMIT and - PCRE_MATCH_LIMIT_RECURSION values as ints, when they should be long ints. - -4. The pcregrep documentation said spaces were inserted as well as colons (or - hyphens) following file names and line numbers when outputting matching - lines. This is not true; no spaces are inserted. I have also clarified the - wording for the --colour (or --color) option. - -5. In pcregrep, when --colour was used with -o, the list of matching strings - was not coloured; this is different to GNU grep, so I have changed it to be - the same. - -6. When --colo(u)r was used in pcregrep, only the first matching substring in - each matching line was coloured. Now it goes on to look for further matches - of any of the test patterns, which is the same behaviour as GNU grep. - -7. A pattern that could match an empty string could cause pcregrep to loop; it - doesn't make sense to accept an empty string match in pcregrep, so I have - locked it out (using PCRE's PCRE_NOTEMPTY option). By experiment, this - seems to be how GNU grep behaves. [But see later change 40 for release - 8.33.] - -8. The pattern (?(?=.*b)b|^) was incorrectly compiled as "match must be at - start or after a newline", because the conditional assertion was not being - correctly handled. The rule now is that both the assertion and what follows - in the first alternative must satisfy the test. - -9. If auto-callout was enabled in a pattern with a conditional group whose - condition was an assertion, PCRE could crash during matching, both with - pcre_exec() and pcre_dfa_exec(). - -10. The PCRE_DOLLAR_ENDONLY option was not working when pcre_dfa_exec() was - used for matching. - -11. Unicode property support in character classes was not working for - characters (bytes) greater than 127 when not in UTF-8 mode. - -12. Added the -M command line option to pcretest. - -14. Added the non-standard REG_NOTEMPTY option to the POSIX interface. - -15. Added the PCRE_NO_START_OPTIMIZE match-time option. - -16. Added comments and documentation about mis-use of no_arg in the C++ - wrapper. - -17. Implemented support for UTF-8 encoding in EBCDIC environments, a patch - from Martin Jerabek that uses macro names for all relevant character and - string constants. - -18. Added to pcre_internal.h two configuration checks: (a) If both EBCDIC and - SUPPORT_UTF8 are set, give an error; (b) If SUPPORT_UCP is set without - SUPPORT_UTF8, define SUPPORT_UTF8. The "configure" script handles both of - these, but not everybody uses configure. - -19. A conditional group that had only one branch was not being correctly - recognized as an item that could match an empty string. This meant that an - enclosing group might also not be so recognized, causing infinite looping - (and probably a segfault) for patterns such as ^"((?(?=[a])[^"])|b)*"$ - with the subject "ab", where knowledge that the repeated group can match - nothing is needed in order to break the loop. - -20. If a pattern that was compiled with callouts was matched using pcre_dfa_ - exec(), but without supplying a callout function, matching went wrong. - -21. If PCRE_ERROR_MATCHLIMIT occurred during a recursion, there was a memory - leak if the size of the offset vector was greater than 30. When the vector - is smaller, the saved offsets during recursion go onto a local stack - vector, but for larger vectors malloc() is used. It was failing to free - when the recursion yielded PCRE_ERROR_MATCH_LIMIT (or any other "abnormal" - error, in fact). - -22. There was a missing #ifdef SUPPORT_UTF8 round one of the variables in the - heapframe that is used only when UTF-8 support is enabled. This caused no - problem, but was untidy. - -23. Steven Van Ingelgem's patch to CMakeLists.txt to change the name - CMAKE_BINARY_DIR to PROJECT_BINARY_DIR so that it works when PCRE is - included within another project. - -24. Steven Van Ingelgem's patches to add more options to the CMake support, - slightly modified by me: - - (a) PCRE_BUILD_TESTS can be set OFF not to build the tests, including - not building pcregrep. - - (b) PCRE_BUILD_PCREGREP can be see OFF not to build pcregrep, but only - if PCRE_BUILD_TESTS is also set OFF, because the tests use pcregrep. - -25. Forward references, both numeric and by name, in patterns that made use of - duplicate group numbers, could behave incorrectly or give incorrect errors, - because when scanning forward to find the reference group, PCRE was not - taking into account the duplicate group numbers. A pattern such as - ^X(?3)(a)(?|(b)|(q))(Y) is an example. - -26. Changed a few more instances of "const unsigned char *" to USPTR, making - the feature of a custom pointer more persuasive (as requested by a user). - -27. Wrapped the definitions of fileno and isatty for Windows, which appear in - pcretest.c, inside #ifndefs, because it seems they are sometimes already - pre-defined. - -28. Added support for (*UTF8) at the start of a pattern. - -29. Arrange for flags added by the "release type" setting in CMake to be shown - in the configuration summary. - - -Version 7.8 05-Sep-08 ---------------------- - -1. Replaced UCP searching code with optimized version as implemented for Ad - Muncher (http://www.admuncher.com/) by Peter Kankowski. This uses a two- - stage table and inline lookup instead of a function, giving speed ups of 2 - to 5 times on some simple patterns that I tested. Permission was given to - distribute the MultiStage2.py script that generates the tables (it's not in - the tarball, but is in the Subversion repository). - -2. Updated the Unicode datatables to Unicode 5.1.0. This adds yet more - scripts. - -3. Change 12 for 7.7 introduced a bug in pcre_study() when a pattern contained - a group with a zero qualifier. The result of the study could be incorrect, - or the function might crash, depending on the pattern. - -4. Caseless matching was not working for non-ASCII characters in back - references. For example, /(\x{de})\1/8i was not matching \x{de}\x{fe}. - It now works when Unicode Property Support is available. - -5. In pcretest, an escape such as \x{de} in the data was always generating - a UTF-8 string, even in non-UTF-8 mode. Now it generates a single byte in - non-UTF-8 mode. If the value is greater than 255, it gives a warning about - truncation. - -6. Minor bugfix in pcrecpp.cc (change "" == ... to NULL == ...). - -7. Added two (int) casts to pcregrep when printing the difference of two - pointers, in case they are 64-bit values. - -8. Added comments about Mac OS X stack usage to the pcrestack man page and to - test 2 if it fails. - -9. Added PCRE_CALL_CONVENTION just before the names of all exported functions, - and a #define of that name to empty if it is not externally set. This is to - allow users of MSVC to set it if necessary. - -10. The PCRE_EXP_DEFN macro which precedes exported functions was missing from - the convenience functions in the pcre_get.c source file. - -11. An option change at the start of a pattern that had top-level alternatives - could cause overwriting and/or a crash. This command provoked a crash in - some environments: - - printf "/(?i)[\xc3\xa9\xc3\xbd]|[\xc3\xa9\xc3\xbdA]/8\n" | pcretest - - This potential security problem was recorded as CVE-2008-2371. - -12. For a pattern where the match had to start at the beginning or immediately - after a newline (e.g /.*anything/ without the DOTALL flag), pcre_exec() and - pcre_dfa_exec() could read past the end of the passed subject if there was - no match. To help with detecting such bugs (e.g. with valgrind), I modified - pcretest so that it places the subject at the end of its malloc-ed buffer. - -13. The change to pcretest in 12 above threw up a couple more cases when pcre_ - exec() might read past the end of the data buffer in UTF-8 mode. - -14. A similar bug to 7.3/2 existed when the PCRE_FIRSTLINE option was set and - the data contained the byte 0x85 as part of a UTF-8 character within its - first line. This applied both to normal and DFA matching. - -15. Lazy qualifiers were not working in some cases in UTF-8 mode. For example, - /^[^d]*?$/8 failed to match "abc". - -16. Added a missing copyright notice to pcrecpp_internal.h. - -17. Make it more clear in the documentation that values returned from - pcre_exec() in ovector are byte offsets, not character counts. - -18. Tidied a few places to stop certain compilers from issuing warnings. - -19. Updated the Virtual Pascal + BCC files to compile the latest v7.7, as - supplied by Stefan Weber. I made a further small update for 7.8 because - there is a change of source arrangements: the pcre_searchfuncs.c module is - replaced by pcre_ucd.c. - - -Version 7.7 07-May-08 ---------------------- - -1. Applied Craig's patch to sort out a long long problem: "If we can't convert - a string to a long long, pretend we don't even have a long long." This is - done by checking for the strtoq, strtoll, and _strtoi64 functions. - -2. Applied Craig's patch to pcrecpp.cc to restore ABI compatibility with - pre-7.6 versions, which defined a global no_arg variable instead of putting - it in the RE class. (See also #8 below.) - -3. Remove a line of dead code, identified by coverity and reported by Nuno - Lopes. - -4. Fixed two related pcregrep bugs involving -r with --include or --exclude: - - (1) The include/exclude patterns were being applied to the whole pathnames - of files, instead of just to the final components. - - (2) If there was more than one level of directory, the subdirectories were - skipped unless they satisfied the include/exclude conditions. This is - inconsistent with GNU grep (and could even be seen as contrary to the - pcregrep specification - which I improved to make it absolutely clear). - The action now is always to scan all levels of directory, and just - apply the include/exclude patterns to regular files. - -5. Added the --include_dir and --exclude_dir patterns to pcregrep, and used - --exclude_dir in the tests to avoid scanning .svn directories. - -6. Applied Craig's patch to the QuoteMeta function so that it escapes the - NUL character as backslash + 0 rather than backslash + NUL, because PCRE - doesn't support NULs in patterns. - -7. Added some missing "const"s to declarations of static tables in - pcre_compile.c and pcre_dfa_exec.c. - -8. Applied Craig's patch to pcrecpp.cc to fix a problem in OS X that was - caused by fix #2 above. (Subsequently also a second patch to fix the - first patch. And a third patch - this was a messy problem.) - -9. Applied Craig's patch to remove the use of push_back(). - -10. Applied Alan Lehotsky's patch to add REG_STARTEND support to the POSIX - matching function regexec(). - -11. Added support for the Oniguruma syntax \g, \g, \g'name', \g'n', - which, however, unlike Perl's \g{...}, are subroutine calls, not back - references. PCRE supports relative numbers with this syntax (I don't think - Oniguruma does). - -12. Previously, a group with a zero repeat such as (...){0} was completely - omitted from the compiled regex. However, this means that if the group - was called as a subroutine from elsewhere in the pattern, things went wrong - (an internal error was given). Such groups are now left in the compiled - pattern, with a new opcode that causes them to be skipped at execution - time. - -13. Added the PCRE_JAVASCRIPT_COMPAT option. This makes the following changes - to the way PCRE behaves: - - (a) A lone ] character is dis-allowed (Perl treats it as data). - - (b) A back reference to an unmatched subpattern matches an empty string - (Perl fails the current match path). - - (c) A data ] in a character class must be notated as \] because if the - first data character in a class is ], it defines an empty class. (In - Perl it is not possible to have an empty class.) The empty class [] - never matches; it forces failure and is equivalent to (*FAIL) or (?!). - The negative empty class [^] matches any one character, independently - of the DOTALL setting. - -14. A pattern such as /(?2)[]a()b](abc)/ which had a forward reference to a - non-existent subpattern following a character class starting with ']' and - containing () gave an internal compiling error instead of "reference to - non-existent subpattern". Fortunately, when the pattern did exist, the - compiled code was correct. (When scanning forwards to check for the - existence of the subpattern, it was treating the data ']' as terminating - the class, so got the count wrong. When actually compiling, the reference - was subsequently set up correctly.) - -15. The "always fail" assertion (?!) is optimzed to (*FAIL) by pcre_compile; - it was being rejected as not supported by pcre_dfa_exec(), even though - other assertions are supported. I have made pcre_dfa_exec() support - (*FAIL). - -16. The implementation of 13c above involved the invention of a new opcode, - OP_ALLANY, which is like OP_ANY but doesn't check the /s flag. Since /s - cannot be changed at match time, I realized I could make a small - improvement to matching performance by compiling OP_ALLANY instead of - OP_ANY for "." when DOTALL was set, and then removing the runtime tests - on the OP_ANY path. - -17. Compiling pcretest on Windows with readline support failed without the - following two fixes: (1) Make the unistd.h include conditional on - HAVE_UNISTD_H; (2) #define isatty and fileno as _isatty and _fileno. - -18. Changed CMakeLists.txt and cmake/FindReadline.cmake to arrange for the - ncurses library to be included for pcretest when ReadLine support is - requested, but also to allow for it to be overridden. This patch came from - Daniel Bergström. - -19. There was a typo in the file ucpinternal.h where f0_rangeflag was defined - as 0x00f00000 instead of 0x00800000. Luckily, this would not have caused - any errors with the current Unicode tables. Thanks to Peter Kankowski for - spotting this. - - -Version 7.6 28-Jan-08 ---------------------- - -1. A character class containing a very large number of characters with - codepoints greater than 255 (in UTF-8 mode, of course) caused a buffer - overflow. - -2. Patch to cut out the "long long" test in pcrecpp_unittest when - HAVE_LONG_LONG is not defined. - -3. Applied Christian Ehrlicher's patch to update the CMake build files to - bring them up to date and include new features. This patch includes: - - - Fixed PH's badly added libz and libbz2 support. - - Fixed a problem with static linking. - - Added pcredemo. [But later removed - see 7 below.] - - Fixed dftables problem and added an option. - - Added a number of HAVE_XXX tests, including HAVE_WINDOWS_H and - HAVE_LONG_LONG. - - Added readline support for pcretest. - - Added an listing of the option settings after cmake has run. - -4. A user submitted a patch to Makefile that makes it easy to create - "pcre.dll" under mingw when using Configure/Make. I added stuff to - Makefile.am that cause it to include this special target, without - affecting anything else. Note that the same mingw target plus all - the other distribution libraries and programs are now supported - when configuring with CMake (see 6 below) instead of with - Configure/Make. - -5. Applied Craig's patch that moves no_arg into the RE class in the C++ code. - This is an attempt to solve the reported problem "pcrecpp::no_arg is not - exported in the Windows port". It has not yet been confirmed that the patch - solves the problem, but it does no harm. - -6. Applied Sheri's patch to CMakeLists.txt to add NON_STANDARD_LIB_PREFIX and - NON_STANDARD_LIB_SUFFIX for dll names built with mingw when configured - with CMake, and also correct the comment about stack recursion. - -7. Remove the automatic building of pcredemo from the ./configure system and - from CMakeLists.txt. The whole idea of pcredemo.c is that it is an example - of a program that users should build themselves after PCRE is installed, so - building it automatically is not really right. What is more, it gave - trouble in some build environments. - -8. Further tidies to CMakeLists.txt from Sheri and Christian. - - -Version 7.5 10-Jan-08 ---------------------- - -1. Applied a patch from Craig: "This patch makes it possible to 'ignore' - values in parens when parsing an RE using the C++ wrapper." - -2. Negative specials like \S did not work in character classes in UTF-8 mode. - Characters greater than 255 were excluded from the class instead of being - included. - -3. The same bug as (2) above applied to negated POSIX classes such as - [:^space:]. - -4. PCRECPP_STATIC was referenced in pcrecpp_internal.h, but nowhere was it - defined or documented. It seems to have been a typo for PCRE_STATIC, so - I have changed it. - -5. The construct (?&) was not diagnosed as a syntax error (it referenced the - first named subpattern) and a construct such as (?&a) would reference the - first named subpattern whose name started with "a" (in other words, the - length check was missing). Both these problems are fixed. "Subpattern name - expected" is now given for (?&) (a zero-length name), and this patch also - makes it give the same error for \k'' (previously it complained that that - was a reference to a non-existent subpattern). - -6. The erroneous patterns (?+-a) and (?-+a) give different error messages; - this is right because (?- can be followed by option settings as well as by - digits. I have, however, made the messages clearer. - -7. Patterns such as (?(1)a|b) (a pattern that contains fewer subpatterns - than the number used in the conditional) now cause a compile-time error. - This is actually not compatible with Perl, which accepts such patterns, but - treats the conditional as always being FALSE (as PCRE used to), but it - seems to me that giving a diagnostic is better. - -8. Change "alphameric" to the more common word "alphanumeric" in comments - and messages. - -9. Fix two occurrences of "backslash" in comments that should have been - "backspace". - -10. Remove two redundant lines of code that can never be obeyed (their function - was moved elsewhere). - -11. The program that makes PCRE's Unicode character property table had a bug - which caused it to generate incorrect table entries for sequences of - characters that have the same character type, but are in different scripts. - It amalgamated them into a single range, with the script of the first of - them. In other words, some characters were in the wrong script. There were - thirteen such cases, affecting characters in the following ranges: - - U+002b0 - U+002c1 - U+0060c - U+0060d - U+0061e - U+00612 - U+0064b - U+0065e - U+0074d - U+0076d - U+01800 - U+01805 - U+01d00 - U+01d77 - U+01d9b - U+01dbf - U+0200b - U+0200f - U+030fc - U+030fe - U+03260 - U+0327f - U+0fb46 - U+0fbb1 - U+10450 - U+1049d - -12. The -o option (show only the matching part of a line) for pcregrep was not - compatible with GNU grep in that, if there was more than one match in a - line, it showed only the first of them. It now behaves in the same way as - GNU grep. - -13. If the -o and -v options were combined for pcregrep, it printed a blank - line for every non-matching line. GNU grep prints nothing, and pcregrep now - does the same. The return code can be used to tell if there were any - non-matching lines. - -14. Added --file-offsets and --line-offsets to pcregrep. - -15. The pattern (?=something)(?R) was not being diagnosed as a potentially - infinitely looping recursion. The bug was that positive lookaheads were not - being skipped when checking for a possible empty match (negative lookaheads - and both kinds of lookbehind were skipped). - -16. Fixed two typos in the Windows-only code in pcregrep.c, and moved the - inclusion of to before rather than after the definition of - INVALID_FILE_ATTRIBUTES (patch from David Byron). - -17. Specifying a possessive quantifier with a specific limit for a Unicode - character property caused pcre_compile() to compile bad code, which led at - runtime to PCRE_ERROR_INTERNAL (-14). Examples of patterns that caused this - are: /\p{Zl}{2,3}+/8 and /\p{Cc}{2}+/8. It was the possessive "+" that - caused the error; without that there was no problem. - -18. Added --enable-pcregrep-libz and --enable-pcregrep-libbz2. - -19. Added --enable-pcretest-libreadline. - -20. In pcrecpp.cc, the variable 'count' was incremented twice in - RE::GlobalReplace(). As a result, the number of replacements returned was - double what it should be. I removed one of the increments, but Craig sent a - later patch that removed the other one (the right fix) and added unit tests - that check the return values (which was not done before). - -21. Several CMake things: - - (1) Arranged that, when cmake is used on Unix, the libraries end up with - the names libpcre and libpcreposix, not just pcre and pcreposix. - - (2) The above change means that pcretest and pcregrep are now correctly - linked with the newly-built libraries, not previously installed ones. - - (3) Added PCRE_SUPPORT_LIBREADLINE, PCRE_SUPPORT_LIBZ, PCRE_SUPPORT_LIBBZ2. - -22. In UTF-8 mode, with newline set to "any", a pattern such as .*a.*=.b.* - crashed when matching a string such as a\x{2029}b (note that \x{2029} is a - UTF-8 newline character). The key issue is that the pattern starts .*; - this means that the match must be either at the beginning, or after a - newline. The bug was in the code for advancing after a failed match and - checking that the new position followed a newline. It was not taking - account of UTF-8 characters correctly. - -23. PCRE was behaving differently from Perl in the way it recognized POSIX - character classes. PCRE was not treating the sequence [:...:] as a - character class unless the ... were all letters. Perl, however, seems to - allow any characters between [: and :], though of course it rejects as - unknown any "names" that contain non-letters, because all the known class - names consist only of letters. Thus, Perl gives an error for [[:1234:]], - for example, whereas PCRE did not - it did not recognize a POSIX character - class. This seemed a bit dangerous, so the code has been changed to be - closer to Perl. The behaviour is not identical to Perl, because PCRE will - diagnose an unknown class for, for example, [[:l\ower:]] where Perl will - treat it as [[:lower:]]. However, PCRE does now give "unknown" errors where - Perl does, and where it didn't before. - -24. Rewrite so as to remove the single use of %n from pcregrep because in some - Windows environments %n is disabled by default. - - -Version 7.4 21-Sep-07 ---------------------- - -1. Change 7.3/28 was implemented for classes by looking at the bitmap. This - means that a class such as [\s] counted as "explicit reference to CR or - LF". That isn't really right - the whole point of the change was to try to - help when there was an actual mention of one of the two characters. So now - the change happens only if \r or \n (or a literal CR or LF) character is - encountered. - -2. The 32-bit options word was also used for 6 internal flags, but the numbers - of both had grown to the point where there were only 3 bits left. - Fortunately, there was spare space in the data structure, and so I have - moved the internal flags into a new 16-bit field to free up more option - bits. - -3. The appearance of (?J) at the start of a pattern set the DUPNAMES option, - but did not set the internal JCHANGED flag - either of these is enough to - control the way the "get" function works - but the PCRE_INFO_JCHANGED - facility is supposed to tell if (?J) was ever used, so now (?J) at the - start sets both bits. - -4. Added options (at build time, compile time, exec time) to change \R from - matching any Unicode line ending sequence to just matching CR, LF, or CRLF. - -5. doc/pcresyntax.html was missing from the distribution. - -6. Put back the definition of PCRE_ERROR_NULLWSLIMIT, for backward - compatibility, even though it is no longer used. - -7. Added macro for snprintf to pcrecpp_unittest.cc and also for strtoll and - strtoull to pcrecpp.cc to select the available functions in WIN32 when the - windows.h file is present (where different names are used). [This was - reversed later after testing - see 16 below.] - -8. Changed all #include to #include "config.h". There were also - some further cases that I changed to "pcre.h". - -9. When pcregrep was used with the --colour option, it missed the line ending - sequence off the lines that it output. - -10. It was pointed out to me that arrays of string pointers cause lots of - relocations when a shared library is dynamically loaded. A technique of - using a single long string with a table of offsets can drastically reduce - these. I have refactored PCRE in four places to do this. The result is - dramatic: - - Originally: 290 - After changing UCP table: 187 - After changing error message table: 43 - After changing table of "verbs" 36 - After changing table of Posix names 22 - - Thanks to the folks working on Gregex for glib for this insight. - -11. --disable-stack-for-recursion caused compiling to fail unless -enable- - unicode-properties was also set. - -12. Updated the tests so that they work when \R is defaulted to ANYCRLF. - -13. Added checks for ANY and ANYCRLF to pcrecpp.cc where it previously - checked only for CRLF. - -14. Added casts to pcretest.c to avoid compiler warnings. - -15. Added Craig's patch to various pcrecpp modules to avoid compiler warnings. - -16. Added Craig's patch to remove the WINDOWS_H tests, that were not working, - and instead check for _strtoi64 explicitly, and avoid the use of snprintf() - entirely. This removes changes made in 7 above. - -17. The CMake files have been updated, and there is now more information about - building with CMake in the NON-UNIX-USE document. - - -Version 7.3 28-Aug-07 ---------------------- - - 1. In the rejigging of the build system that eventually resulted in 7.1, the - line "#include " was included in pcre_internal.h. The use of angle - brackets there is not right, since it causes compilers to look for an - installed pcre.h, not the version that is in the source that is being - compiled (which of course may be different). I have changed it back to: - - #include "pcre.h" - - I have a vague recollection that the change was concerned with compiling in - different directories, but in the new build system, that is taken care of - by the VPATH setting the Makefile. - - 2. The pattern .*$ when run in not-DOTALL UTF-8 mode with newline=any failed - when the subject happened to end in the byte 0x85 (e.g. if the last - character was \x{1ec5}). *Character* 0x85 is one of the "any" newline - characters but of course it shouldn't be taken as a newline when it is part - of another character. The bug was that, for an unlimited repeat of . in - not-DOTALL UTF-8 mode, PCRE was advancing by bytes rather than by - characters when looking for a newline. - - 3. A small performance improvement in the DOTALL UTF-8 mode .* case. - - 4. Debugging: adjusted the names of opcodes for different kinds of parentheses - in debug output. - - 5. Arrange to use "%I64d" instead of "%lld" and "%I64u" instead of "%llu" for - long printing in the pcrecpp unittest when running under MinGW. - - 6. ESC_K was left out of the EBCDIC table. - - 7. Change 7.0/38 introduced a new limit on the number of nested non-capturing - parentheses; I made it 1000, which seemed large enough. Unfortunately, the - limit also applies to "virtual nesting" when a pattern is recursive, and in - this case 1000 isn't so big. I have been able to remove this limit at the - expense of backing off one optimization in certain circumstances. Normally, - when pcre_exec() would call its internal match() function recursively and - immediately return the result unconditionally, it uses a "tail recursion" - feature to save stack. However, when a subpattern that can match an empty - string has an unlimited repetition quantifier, it no longer makes this - optimization. That gives it a stack frame in which to save the data for - checking that an empty string has been matched. Previously this was taken - from the 1000-entry workspace that had been reserved. So now there is no - explicit limit, but more stack is used. - - 8. Applied Daniel's patches to solve problems with the import/export magic - syntax that is required for Windows, and which was going wrong for the - pcreposix and pcrecpp parts of the library. These were overlooked when this - problem was solved for the main library. - - 9. There were some crude static tests to avoid integer overflow when computing - the size of patterns that contain repeated groups with explicit upper - limits. As the maximum quantifier is 65535, the maximum group length was - set at 30,000 so that the product of these two numbers did not overflow a - 32-bit integer. However, it turns out that people want to use groups that - are longer than 30,000 bytes (though not repeat them that many times). - Change 7.0/17 (the refactoring of the way the pattern size is computed) has - made it possible to implement the integer overflow checks in a much more - dynamic way, which I have now done. The artificial limitation on group - length has been removed - we now have only the limit on the total length of - the compiled pattern, which depends on the LINK_SIZE setting. - -10. Fixed a bug in the documentation for get/copy named substring when - duplicate names are permitted. If none of the named substrings are set, the - functions return PCRE_ERROR_NOSUBSTRING (7); the doc said they returned an - empty string. - -11. Because Perl interprets \Q...\E at a high level, and ignores orphan \E - instances, patterns such as [\Q\E] or [\E] or even [^\E] cause an error, - because the ] is interpreted as the first data character and the - terminating ] is not found. PCRE has been made compatible with Perl in this - regard. Previously, it interpreted [\Q\E] as an empty class, and [\E] could - cause memory overwriting. - -10. Like Perl, PCRE automatically breaks an unlimited repeat after an empty - string has been matched (to stop an infinite loop). It was not recognizing - a conditional subpattern that could match an empty string if that - subpattern was within another subpattern. For example, it looped when - trying to match (((?(1)X|))*) but it was OK with ((?(1)X|)*) where the - condition was not nested. This bug has been fixed. - -12. A pattern like \X?\d or \P{L}?\d in non-UTF-8 mode could cause a backtrack - past the start of the subject in the presence of bytes with the top bit - set, for example "\x8aBCD". - -13. Added Perl 5.10 experimental backtracking controls (*FAIL), (*F), (*PRUNE), - (*SKIP), (*THEN), (*COMMIT), and (*ACCEPT). - -14. Optimized (?!) to (*FAIL). - -15. Updated the test for a valid UTF-8 string to conform to the later RFC 3629. - This restricts code points to be within the range 0 to 0x10FFFF, excluding - the "low surrogate" sequence 0xD800 to 0xDFFF. Previously, PCRE allowed the - full range 0 to 0x7FFFFFFF, as defined by RFC 2279. Internally, it still - does: it's just the validity check that is more restrictive. - -16. Inserted checks for integer overflows during escape sequence (backslash) - processing, and also fixed erroneous offset values for syntax errors during - backslash processing. - -17. Fixed another case of looking too far back in non-UTF-8 mode (cf 12 above) - for patterns like [\PPP\x8a]{1,}\x80 with the subject "A\x80". - -18. An unterminated class in a pattern like (?1)\c[ with a "forward reference" - caused an overrun. - -19. A pattern like (?:[\PPa*]*){8,} which had an "extended class" (one with - something other than just ASCII characters) inside a group that had an - unlimited repeat caused a loop at compile time (while checking to see - whether the group could match an empty string). - -20. Debugging a pattern containing \p or \P could cause a crash. For example, - [\P{Any}] did so. (Error in the code for printing property names.) - -21. An orphan \E inside a character class could cause a crash. - -22. A repeated capturing bracket such as (A)? could cause a wild memory - reference during compilation. - -23. There are several functions in pcre_compile() that scan along a compiled - expression for various reasons (e.g. to see if it's fixed length for look - behind). There were bugs in these functions when a repeated \p or \P was - present in the pattern. These operators have additional parameters compared - with \d, etc, and these were not being taken into account when moving along - the compiled data. Specifically: - - (a) A item such as \p{Yi}{3} in a lookbehind was not treated as fixed - length. - - (b) An item such as \pL+ within a repeated group could cause crashes or - loops. - - (c) A pattern such as \p{Yi}+(\P{Yi}+)(?1) could give an incorrect - "reference to non-existent subpattern" error. - - (d) A pattern like (\P{Yi}{2}\277)? could loop at compile time. - -24. A repeated \S or \W in UTF-8 mode could give wrong answers when multibyte - characters were involved (for example /\S{2}/8g with "A\x{a3}BC"). - -25. Using pcregrep in multiline, inverted mode (-Mv) caused it to loop. - -26. Patterns such as [\P{Yi}A] which include \p or \P and just one other - character were causing crashes (broken optimization). - -27. Patterns such as (\P{Yi}*\277)* (group with possible zero repeat containing - \p or \P) caused a compile-time loop. - -28. More problems have arisen in unanchored patterns when CRLF is a valid line - break. For example, the unstudied pattern [\r\n]A does not match the string - "\r\nA" because change 7.0/46 below moves the current point on by two - characters after failing to match at the start. However, the pattern \nA - *does* match, because it doesn't start till \n, and if [\r\n]A is studied, - the same is true. There doesn't seem any very clean way out of this, but - what I have chosen to do makes the common cases work: PCRE now takes note - of whether there can be an explicit match for \r or \n anywhere in the - pattern, and if so, 7.0/46 no longer applies. As part of this change, - there's a new PCRE_INFO_HASCRORLF option for finding out whether a compiled - pattern has explicit CR or LF references. - -29. Added (*CR) etc for changing newline setting at start of pattern. - - -Version 7.2 19-Jun-07 ---------------------- - - 1. If the fr_FR locale cannot be found for test 3, try the "french" locale, - which is apparently normally available under Windows. - - 2. Re-jig the pcregrep tests with different newline settings in an attempt - to make them independent of the local environment's newline setting. - - 3. Add code to configure.ac to remove -g from the CFLAGS default settings. - - 4. Some of the "internals" tests were previously cut out when the link size - was not 2, because the output contained actual offsets. The recent new - "Z" feature of pcretest means that these can be cut out, making the tests - usable with all link sizes. - - 5. Implemented Stan Switzer's goto replacement for longjmp() when not using - stack recursion. This gives a massive performance boost under BSD, but just - a small improvement under Linux. However, it saves one field in the frame - in all cases. - - 6. Added more features from the forthcoming Perl 5.10: - - (a) (?-n) (where n is a string of digits) is a relative subroutine or - recursion call. It refers to the nth most recently opened parentheses. - - (b) (?+n) is also a relative subroutine call; it refers to the nth next - to be opened parentheses. - - (c) Conditions that refer to capturing parentheses can be specified - relatively, for example, (?(-2)... or (?(+3)... - - (d) \K resets the start of the current match so that everything before - is not part of it. - - (e) \k{name} is synonymous with \k and \k'name' (.NET compatible). - - (f) \g{name} is another synonym - part of Perl 5.10's unification of - reference syntax. - - (g) (?| introduces a group in which the numbering of parentheses in each - alternative starts with the same number. - - (h) \h, \H, \v, and \V match horizontal and vertical whitespace. - - 7. Added two new calls to pcre_fullinfo(): PCRE_INFO_OKPARTIAL and - PCRE_INFO_JCHANGED. - - 8. A pattern such as (.*(.)?)* caused pcre_exec() to fail by either not - terminating or by crashing. Diagnosed by Viktor Griph; it was in the code - for detecting groups that can match an empty string. - - 9. A pattern with a very large number of alternatives (more than several - hundred) was running out of internal workspace during the pre-compile - phase, where pcre_compile() figures out how much memory will be needed. A - bit of new cunning has reduced the workspace needed for groups with - alternatives. The 1000-alternative test pattern now uses 12 bytes of - workspace instead of running out of the 4096 that are available. - -10. Inserted some missing (unsigned int) casts to get rid of compiler warnings. - -11. Applied patch from Google to remove an optimization that didn't quite work. - The report of the bug said: - - pcrecpp::RE("a*").FullMatch("aaa") matches, while - pcrecpp::RE("a*?").FullMatch("aaa") does not, and - pcrecpp::RE("a*?\\z").FullMatch("aaa") does again. - -12. If \p or \P was used in non-UTF-8 mode on a character greater than 127 - it matched the wrong number of bytes. - - -Version 7.1 24-Apr-07 ---------------------- - - 1. Applied Bob Rossi and Daniel G's patches to convert the build system to one - that is more "standard", making use of automake and other Autotools. There - is some re-arrangement of the files and adjustment of comments consequent - on this. - - 2. Part of the patch fixed a problem with the pcregrep tests. The test of -r - for recursive directory scanning broke on some systems because the files - are not scanned in any specific order and on different systems the order - was different. A call to "sort" has been inserted into RunGrepTest for the - approprate test as a short-term fix. In the longer term there may be an - alternative. - - 3. I had an email from Eric Raymond about problems translating some of PCRE's - man pages to HTML (despite the fact that I distribute HTML pages, some - people do their own conversions for various reasons). The problems - concerned the use of low-level troff macros .br and .in. I have therefore - removed all such uses from the man pages (some were redundant, some could - be replaced by .nf/.fi pairs). The 132html script that I use to generate - HTML has been updated to handle .nf/.fi and to complain if it encounters - .br or .in. - - 4. Updated comments in configure.ac that get placed in config.h.in and also - arranged for config.h to be included in the distribution, with the name - config.h.generic, for the benefit of those who have to compile without - Autotools (compare pcre.h, which is now distributed as pcre.h.generic). - - 5. Updated the support (such as it is) for Virtual Pascal, thanks to Stefan - Weber: (1) pcre_internal.h was missing some function renames; (2) updated - makevp.bat for the current PCRE, using the additional files - makevp_c.txt, makevp_l.txt, and pcregexp.pas. - - 6. A Windows user reported a minor discrepancy with test 2, which turned out - to be caused by a trailing space on an input line that had got lost in his - copy. The trailing space was an accident, so I've just removed it. - - 7. Add -Wl,-R... flags in pcre-config.in for *BSD* systems, as I'm told - that is needed. - - 8. Mark ucp_table (in ucptable.h) and ucp_gentype (in pcre_ucp_searchfuncs.c) - as "const" (a) because they are and (b) because it helps the PHP - maintainers who have recently made a script to detect big data structures - in the php code that should be moved to the .rodata section. I remembered - to update Builducptable as well, so it won't revert if ucptable.h is ever - re-created. - - 9. Added some extra #ifdef SUPPORT_UTF8 conditionals into pcretest.c, - pcre_printint.src, pcre_compile.c, pcre_study.c, and pcre_tables.c, in - order to be able to cut out the UTF-8 tables in the latter when UTF-8 - support is not required. This saves 1.5-2K of code, which is important in - some applications. - - Later: more #ifdefs are needed in pcre_ord2utf8.c and pcre_valid_utf8.c - so as not to refer to the tables, even though these functions will never be - called when UTF-8 support is disabled. Otherwise there are problems with a - shared library. - -10. Fixed two bugs in the emulated memmove() function in pcre_internal.h: - - (a) It was defining its arguments as char * instead of void *. - - (b) It was assuming that all moves were upwards in memory; this was true - a long time ago when I wrote it, but is no longer the case. - - The emulated memove() is provided for those environments that have neither - memmove() nor bcopy(). I didn't think anyone used it these days, but that - is clearly not the case, as these two bugs were recently reported. - -11. The script PrepareRelease is now distributed: it calls 132html, CleanTxt, - and Detrail to create the HTML documentation, the .txt form of the man - pages, and it removes trailing spaces from listed files. It also creates - pcre.h.generic and config.h.generic from pcre.h and config.h. In the latter - case, it wraps all the #defines with #ifndefs. This script should be run - before "make dist". - -12. Fixed two fairly obscure bugs concerned with quantified caseless matching - with Unicode property support. - - (a) For a maximizing quantifier, if the two different cases of the - character were of different lengths in their UTF-8 codings (there are - some cases like this - I found 11), and the matching function had to - back up over a mixture of the two cases, it incorrectly assumed they - were both the same length. - - (b) When PCRE was configured to use the heap rather than the stack for - recursion during matching, it was not correctly preserving the data for - the other case of a UTF-8 character when checking ahead for a match - while processing a minimizing repeat. If the check also involved - matching a wide character, but failed, corruption could cause an - erroneous result when trying to check for a repeat of the original - character. - -13. Some tidying changes to the testing mechanism: - - (a) The RunTest script now detects the internal link size and whether there - is UTF-8 and UCP support by running ./pcretest -C instead of relying on - values substituted by "configure". (The RunGrepTest script already did - this for UTF-8.) The configure.ac script no longer substitutes the - relevant variables. - - (b) The debugging options /B and /D in pcretest show the compiled bytecode - with length and offset values. This means that the output is different - for different internal link sizes. Test 2 is skipped for link sizes - other than 2 because of this, bypassing the problem. Unfortunately, - there was also a test in test 3 (the locale tests) that used /B and - failed for link sizes other than 2. Rather than cut the whole test out, - I have added a new /Z option to pcretest that replaces the length and - offset values with spaces. This is now used to make test 3 independent - of link size. (Test 2 will be tidied up later.) - -14. If erroroffset was passed as NULL to pcre_compile, it provoked a - segmentation fault instead of returning the appropriate error message. - -15. In multiline mode when the newline sequence was set to "any", the pattern - ^$ would give a match between the \r and \n of a subject such as "A\r\nB". - This doesn't seem right; it now treats the CRLF combination as the line - ending, and so does not match in that case. It's only a pattern such as ^$ - that would hit this one: something like ^ABC$ would have failed after \r - and then tried again after \r\n. - -16. Changed the comparison command for RunGrepTest from "diff -u" to "diff -ub" - in an attempt to make files that differ only in their line terminators - compare equal. This works on Linux. - -17. Under certain error circumstances pcregrep might try to free random memory - as it exited. This is now fixed, thanks to valgrind. - -19. In pcretest, if the pattern /(?m)^$/g was matched against the string - "abc\r\n\r\n", it found an unwanted second match after the second \r. This - was because its rules for how to advance for /g after matching an empty - string at the end of a line did not allow for this case. They now check for - it specially. - -20. pcretest is supposed to handle patterns and data of any length, by - extending its buffers when necessary. It was getting this wrong when the - buffer for a data line had to be extended. - -21. Added PCRE_NEWLINE_ANYCRLF which is like ANY, but matches only CR, LF, or - CRLF as a newline sequence. - -22. Code for handling Unicode properties in pcre_dfa_exec() wasn't being cut - out by #ifdef SUPPORT_UCP. This did no harm, as it could never be used, but - I have nevertheless tidied it up. - -23. Added some casts to kill warnings from HP-UX ia64 compiler. - -24. Added a man page for pcre-config. - - -Version 7.0 19-Dec-06 ---------------------- - - 1. Fixed a signed/unsigned compiler warning in pcre_compile.c, shown up by - moving to gcc 4.1.1. - - 2. The -S option for pcretest uses setrlimit(); I had omitted to #include - sys/time.h, which is documented as needed for this function. It doesn't - seem to matter on Linux, but it showed up on some releases of OS X. - - 3. It seems that there are systems where bytes whose values are greater than - 127 match isprint() in the "C" locale. The "C" locale should be the - default when a C program starts up. In most systems, only ASCII printing - characters match isprint(). This difference caused the output from pcretest - to vary, making some of the tests fail. I have changed pcretest so that: - - (a) When it is outputting text in the compiled version of a pattern, bytes - other than 32-126 are always shown as hex escapes. - - (b) When it is outputting text that is a matched part of a subject string, - it does the same, unless a different locale has been set for the match - (using the /L modifier). In this case, it uses isprint() to decide. - - 4. Fixed a major bug that caused incorrect computation of the amount of memory - required for a compiled pattern when options that changed within the - pattern affected the logic of the preliminary scan that determines the - length. The relevant options are -x, and -i in UTF-8 mode. The result was - that the computed length was too small. The symptoms of this bug were - either the PCRE error "internal error: code overflow" from pcre_compile(), - or a glibc crash with a message such as "pcretest: free(): invalid next - size (fast)". Examples of patterns that provoked this bug (shown in - pcretest format) are: - - /(?-x: )/x - /(?x)(?-x: \s*#\s*)/ - /((?i)[\x{c0}])/8 - /(?i:[\x{c0}])/8 - - HOWEVER: Change 17 below makes this fix obsolete as the memory computation - is now done differently. - - 5. Applied patches from Google to: (a) add a QuoteMeta function to the C++ - wrapper classes; (b) implement a new function in the C++ scanner that is - more efficient than the old way of doing things because it avoids levels of - recursion in the regex matching; (c) add a paragraph to the documentation - for the FullMatch() function. - - 6. The escape sequence \n was being treated as whatever was defined as - "newline". Not only was this contrary to the documentation, which states - that \n is character 10 (hex 0A), but it also went horribly wrong when - "newline" was defined as CRLF. This has been fixed. - - 7. In pcre_dfa_exec.c the value of an unsigned integer (the variable called c) - was being set to -1 for the "end of line" case (supposedly a value that no - character can have). Though this value is never used (the check for end of - line is "zero bytes in current character"), it caused compiler complaints. - I've changed it to 0xffffffff. - - 8. In pcre_version.c, the version string was being built by a sequence of - C macros that, in the event of PCRE_PRERELEASE being defined as an empty - string (as it is for production releases) called a macro with an empty - argument. The C standard says the result of this is undefined. The gcc - compiler treats it as an empty string (which was what was wanted) but it is - reported that Visual C gives an error. The source has been hacked around to - avoid this problem. - - 9. On the advice of a Windows user, included and in Windows - builds of pcretest, and changed the call to _setmode() to use _O_BINARY - instead of 0x8000. Made all the #ifdefs test both _WIN32 and WIN32 (not all - of them did). - -10. Originally, pcretest opened its input and output without "b"; then I was - told that "b" was needed in some environments, so it was added for release - 5.0 to both the input and output. (It makes no difference on Unix-like - systems.) Later I was told that it is wrong for the input on Windows. I've - now abstracted the modes into two macros, to make it easier to fiddle with - them, and removed "b" from the input mode under Windows. - -11. Added pkgconfig support for the C++ wrapper library, libpcrecpp. - -12. Added -help and --help to pcretest as an official way of being reminded - of the options. - -13. Removed some redundant semicolons after macro calls in pcrecpparg.h.in - and pcrecpp.cc because they annoy compilers at high warning levels. - -14. A bit of tidying/refactoring in pcre_exec.c in the main bumpalong loop. - -15. Fixed an occurrence of == in configure.ac that should have been = (shell - scripts are not C programs :-) and which was not noticed because it works - on Linux. - -16. pcretest is supposed to handle any length of pattern and data line (as one - line or as a continued sequence of lines) by extending its input buffer if - necessary. This feature was broken for very long pattern lines, leading to - a string of junk being passed to pcre_compile() if the pattern was longer - than about 50K. - -17. I have done a major re-factoring of the way pcre_compile() computes the - amount of memory needed for a compiled pattern. Previously, there was code - that made a preliminary scan of the pattern in order to do this. That was - OK when PCRE was new, but as the facilities have expanded, it has become - harder and harder to keep it in step with the real compile phase, and there - have been a number of bugs (see for example, 4 above). I have now found a - cunning way of running the real compile function in a "fake" mode that - enables it to compute how much memory it would need, while actually only - ever using a few hundred bytes of working memory and without too many - tests of the mode. This should make future maintenance and development - easier. A side effect of this work is that the limit of 200 on the nesting - depth of parentheses has been removed (though this was never a serious - limitation, I suspect). However, there is a downside: pcre_compile() now - runs more slowly than before (30% or more, depending on the pattern). I - hope this isn't a big issue. There is no effect on runtime performance. - -18. Fixed a minor bug in pcretest: if a pattern line was not terminated by a - newline (only possible for the last line of a file) and it was a - pattern that set a locale (followed by /Lsomething), pcretest crashed. - -19. Added additional timing features to pcretest. (1) The -tm option now times - matching only, not compiling. (2) Both -t and -tm can be followed, as a - separate command line item, by a number that specifies the number of - repeats to use when timing. The default is 50000; this gives better - precision, but takes uncomfortably long for very large patterns. - -20. Extended pcre_study() to be more clever in cases where a branch of a - subpattern has no definite first character. For example, (a*|b*)[cd] would - previously give no result from pcre_study(). Now it recognizes that the - first character must be a, b, c, or d. - -21. There was an incorrect error "recursive call could loop indefinitely" if - a subpattern (or the entire pattern) that was being tested for matching an - empty string contained only one non-empty item after a nested subpattern. - For example, the pattern (?>\x{100}*)\d(?R) provoked this error - incorrectly, because the \d was being skipped in the check. - -22. The pcretest program now has a new pattern option /B and a command line - option -b, which is equivalent to adding /B to every pattern. This causes - it to show the compiled bytecode, without the additional information that - -d shows. The effect of -d is now the same as -b with -i (and similarly, /D - is the same as /B/I). - -23. A new optimization is now able automatically to treat some sequences such - as a*b as a*+b. More specifically, if something simple (such as a character - or a simple class like \d) has an unlimited quantifier, and is followed by - something that cannot possibly match the quantified thing, the quantifier - is automatically "possessified". - -24. A recursive reference to a subpattern whose number was greater than 39 - went wrong under certain circumstances in UTF-8 mode. This bug could also - have affected the operation of pcre_study(). - -25. Realized that a little bit of performance could be had by replacing - (c & 0xc0) == 0xc0 with c >= 0xc0 when processing UTF-8 characters. - -26. Timing data from pcretest is now shown to 4 decimal places instead of 3. - -27. Possessive quantifiers such as a++ were previously implemented by turning - them into atomic groups such as ($>a+). Now they have their own opcodes, - which improves performance. This includes the automatically created ones - from 23 above. - -28. A pattern such as (?=(\w+))\1: which simulates an atomic group using a - lookahead was broken if it was not anchored. PCRE was mistakenly expecting - the first matched character to be a colon. This applied both to named and - numbered groups. - -29. The ucpinternal.h header file was missing its idempotency #ifdef. - -30. I was sent a "project" file called libpcre.a.dev which I understand makes - building PCRE on Windows easier, so I have included it in the distribution. - -31. There is now a check in pcretest against a ridiculously large number being - returned by pcre_exec() or pcre_dfa_exec(). If this happens in a /g or /G - loop, the loop is abandoned. - -32. Forward references to subpatterns in conditions such as (?(2)...) where - subpattern 2 is defined later cause pcre_compile() to search forwards in - the pattern for the relevant set of parentheses. This search went wrong - when there were unescaped parentheses in a character class, parentheses - escaped with \Q...\E, or parentheses in a #-comment in /x mode. - -33. "Subroutine" calls and backreferences were previously restricted to - referencing subpatterns earlier in the regex. This restriction has now - been removed. - -34. Added a number of extra features that are going to be in Perl 5.10. On the - whole, these are just syntactic alternatives for features that PCRE had - previously implemented using the Python syntax or my own invention. The - other formats are all retained for compatibility. - - (a) Named groups can now be defined as (?...) or (?'name'...) as well - as (?P...). The new forms, as well as being in Perl 5.10, are - also .NET compatible. - - (b) A recursion or subroutine call to a named group can now be defined as - (?&name) as well as (?P>name). - - (c) A backreference to a named group can now be defined as \k or - \k'name' as well as (?P=name). The new forms, as well as being in Perl - 5.10, are also .NET compatible. - - (d) A conditional reference to a named group can now use the syntax - (?() or (?('name') as well as (?(name). - - (e) A "conditional group" of the form (?(DEFINE)...) can be used to define - groups (named and numbered) that are never evaluated inline, but can be - called as "subroutines" from elsewhere. In effect, the DEFINE condition - is always false. There may be only one alternative in such a group. - - (f) A test for recursion can be given as (?(R1).. or (?(R&name)... as well - as the simple (?(R). The condition is true only if the most recent - recursion is that of the given number or name. It does not search out - through the entire recursion stack. - - (g) The escape \gN or \g{N} has been added, where N is a positive or - negative number, specifying an absolute or relative reference. - -35. Tidied to get rid of some further signed/unsigned compiler warnings and - some "unreachable code" warnings. - -36. Updated the Unicode property tables to Unicode version 5.0.0. Amongst other - things, this adds five new scripts. - -37. Perl ignores orphaned \E escapes completely. PCRE now does the same. - There were also incompatibilities regarding the handling of \Q..\E inside - character classes, for example with patterns like [\Qa\E-\Qz\E] where the - hyphen was adjacent to \Q or \E. I hope I've cleared all this up now. - -38. Like Perl, PCRE detects when an indefinitely repeated parenthesized group - matches an empty string, and forcibly breaks the loop. There were bugs in - this code in non-simple cases. For a pattern such as ^(a()*)* matched - against aaaa the result was just "a" rather than "aaaa", for example. Two - separate and independent bugs (that affected different cases) have been - fixed. - -39. Refactored the code to abolish the use of different opcodes for small - capturing bracket numbers. This is a tidy that I avoided doing when I - removed the limit on the number of capturing brackets for 3.5 back in 2001. - The new approach is not only tidier, it makes it possible to reduce the - memory needed to fix the previous bug (38). - -40. Implemented PCRE_NEWLINE_ANY to recognize any of the Unicode newline - sequences (http://unicode.org/unicode/reports/tr18/) as "newline" when - processing dot, circumflex, or dollar metacharacters, or #-comments in /x - mode. - -41. Add \R to match any Unicode newline sequence, as suggested in the Unicode - report. - -42. Applied patch, originally from Ari Pollak, modified by Google, to allow - copy construction and assignment in the C++ wrapper. - -43. Updated pcregrep to support "--newline=any". In the process, I fixed a - couple of bugs that could have given wrong results in the "--newline=crlf" - case. - -44. Added a number of casts and did some reorganization of signed/unsigned int - variables following suggestions from Dair Grant. Also renamed the variable - "this" as "item" because it is a C++ keyword. - -45. Arranged for dftables to add - - #include "pcre_internal.h" - - to pcre_chartables.c because without it, gcc 4.x may remove the array - definition from the final binary if PCRE is built into a static library and - dead code stripping is activated. - -46. For an unanchored pattern, if a match attempt fails at the start of a - newline sequence, and the newline setting is CRLF or ANY, and the next two - characters are CRLF, advance by two characters instead of one. - - -Version 6.7 04-Jul-06 ---------------------- - - 1. In order to handle tests when input lines are enormously long, pcretest has - been re-factored so that it automatically extends its buffers when - necessary. The code is crude, but this _is_ just a test program. The - default size has been increased from 32K to 50K. - - 2. The code in pcre_study() was using the value of the re argument before - testing it for NULL. (Of course, in any sensible call of the function, it - won't be NULL.) - - 3. The memmove() emulation function in pcre_internal.h, which is used on - systems that lack both memmove() and bcopy() - that is, hardly ever - - was missing a "static" storage class specifier. - - 4. When UTF-8 mode was not set, PCRE looped when compiling certain patterns - containing an extended class (one that cannot be represented by a bitmap - because it contains high-valued characters or Unicode property items, e.g. - [\pZ]). Almost always one would set UTF-8 mode when processing such a - pattern, but PCRE should not loop if you do not (it no longer does). - [Detail: two cases were found: (a) a repeated subpattern containing an - extended class; (b) a recursive reference to a subpattern that followed a - previous extended class. It wasn't skipping over the extended class - correctly when UTF-8 mode was not set.] - - 5. A negated single-character class was not being recognized as fixed-length - in lookbehind assertions such as (?<=[^f]), leading to an incorrect - compile error "lookbehind assertion is not fixed length". - - 6. The RunPerlTest auxiliary script was showing an unexpected difference - between PCRE and Perl for UTF-8 tests. It turns out that it is hard to - write a Perl script that can interpret lines of an input file either as - byte characters or as UTF-8, which is what "perltest" was being required to - do for the non-UTF-8 and UTF-8 tests, respectively. Essentially what you - can't do is switch easily at run time between having the "use utf8;" pragma - or not. In the end, I fudged it by using the RunPerlTest script to insert - "use utf8;" explicitly for the UTF-8 tests. - - 7. In multiline (/m) mode, PCRE was matching ^ after a terminating newline at - the end of the subject string, contrary to the documentation and to what - Perl does. This was true of both matching functions. Now it matches only at - the start of the subject and immediately after *internal* newlines. - - 8. A call of pcre_fullinfo() from pcretest to get the option bits was passing - a pointer to an int instead of a pointer to an unsigned long int. This - caused problems on 64-bit systems. - - 9. Applied a patch from the folks at Google to pcrecpp.cc, to fix "another - instance of the 'standard' template library not being so standard". - -10. There was no check on the number of named subpatterns nor the maximum - length of a subpattern name. The product of these values is used to compute - the size of the memory block for a compiled pattern. By supplying a very - long subpattern name and a large number of named subpatterns, the size - computation could be caused to overflow. This is now prevented by limiting - the length of names to 32 characters, and the number of named subpatterns - to 10,000. - -11. Subpatterns that are repeated with specific counts have to be replicated in - the compiled pattern. The size of memory for this was computed from the - length of the subpattern and the repeat count. The latter is limited to - 65535, but there was no limit on the former, meaning that integer overflow - could in principle occur. The compiled length of a repeated subpattern is - now limited to 30,000 bytes in order to prevent this. - -12. Added the optional facility to have named substrings with the same name. - -13. Added the ability to use a named substring as a condition, using the - Python syntax: (?(name)yes|no). This overloads (?(R)... and names that - are numbers (not recommended). Forward references are permitted. - -14. Added forward references in named backreferences (if you see what I mean). - -15. In UTF-8 mode, with the PCRE_DOTALL option set, a quantified dot in the - pattern could run off the end of the subject. For example, the pattern - "(?s)(.{1,5})"8 did this with the subject "ab". - -16. If PCRE_DOTALL or PCRE_MULTILINE were set, pcre_dfa_exec() behaved as if - PCRE_CASELESS was set when matching characters that were quantified with ? - or *. - -17. A character class other than a single negated character that had a minimum - but no maximum quantifier - for example [ab]{6,} - was not handled - correctly by pce_dfa_exec(). It would match only one character. - -18. A valid (though odd) pattern that looked like a POSIX character - class but used an invalid character after [ (for example [[,abc,]]) caused - pcre_compile() to give the error "Failed: internal error: code overflow" or - in some cases to crash with a glibc free() error. This could even happen if - the pattern terminated after [[ but there just happened to be a sequence of - letters, a binary zero, and a closing ] in the memory that followed. - -19. Perl's treatment of octal escapes in the range \400 to \777 has changed - over the years. Originally (before any Unicode support), just the bottom 8 - bits were taken. Thus, for example, \500 really meant \100. Nowadays the - output from "man perlunicode" includes this: - - The regular expression compiler produces polymorphic opcodes. That - is, the pattern adapts to the data and automatically switches to - the Unicode character scheme when presented with Unicode data--or - instead uses a traditional byte scheme when presented with byte - data. - - Sadly, a wide octal escape does not cause a switch, and in a string with - no other multibyte characters, these octal escapes are treated as before. - Thus, in Perl, the pattern /\500/ actually matches \100 but the pattern - /\500|\x{1ff}/ matches \500 or \777 because the whole thing is treated as a - Unicode string. - - I have not perpetrated such confusion in PCRE. Up till now, it took just - the bottom 8 bits, as in old Perl. I have now made octal escapes with - values greater than \377 illegal in non-UTF-8 mode. In UTF-8 mode they - translate to the appropriate multibyte character. - -29. Applied some refactoring to reduce the number of warnings from Microsoft - and Borland compilers. This has included removing the fudge introduced - seven years ago for the OS/2 compiler (see 2.02/2 below) because it caused - a warning about an unused variable. - -21. PCRE has not included VT (character 0x0b) in the set of whitespace - characters since release 4.0, because Perl (from release 5.004) does not. - [Or at least, is documented not to: some releases seem to be in conflict - with the documentation.] However, when a pattern was studied with - pcre_study() and all its branches started with \s, PCRE still included VT - as a possible starting character. Of course, this did no harm; it just - caused an unnecessary match attempt. - -22. Removed a now-redundant internal flag bit that recorded the fact that case - dependency changed within the pattern. This was once needed for "required - byte" processing, but is no longer used. This recovers a now-scarce options - bit. Also moved the least significant internal flag bit to the most- - significant bit of the word, which was not previously used (hangover from - the days when it was an int rather than a uint) to free up another bit for - the future. - -23. Added support for CRLF line endings as well as CR and LF. As well as the - default being selectable at build time, it can now be changed at runtime - via the PCRE_NEWLINE_xxx flags. There are now options for pcregrep to - specify that it is scanning data with non-default line endings. - -24. Changed the definition of CXXLINK to make it agree with the definition of - LINK in the Makefile, by replacing LDFLAGS to CXXFLAGS. - -25. Applied Ian Taylor's patches to avoid using another stack frame for tail - recursions. This makes a big different to stack usage for some patterns. - -26. If a subpattern containing a named recursion or subroutine reference such - as (?P>B) was quantified, for example (xxx(?P>B)){3}, the calculation of - the space required for the compiled pattern went wrong and gave too small a - value. Depending on the environment, this could lead to "Failed: internal - error: code overflow at offset 49" or "glibc detected double free or - corruption" errors. - -27. Applied patches from Google (a) to support the new newline modes and (b) to - advance over multibyte UTF-8 characters in GlobalReplace. - -28. Change free() to pcre_free() in pcredemo.c. Apparently this makes a - difference for some implementation of PCRE in some Windows version. - -29. Added some extra testing facilities to pcretest: - - \q in a data line sets the "match limit" value - \Q in a data line sets the "match recursion limt" value - -S sets the stack size, where is in megabytes - - The -S option isn't available for Windows. - - -Version 6.6 06-Feb-06 ---------------------- - - 1. Change 16(a) for 6.5 broke things, because PCRE_DATA_SCOPE was not defined - in pcreposix.h. I have copied the definition from pcre.h. - - 2. Change 25 for 6.5 broke compilation in a build directory out-of-tree - because pcre.h is no longer a built file. - - 3. Added Jeff Friedl's additional debugging patches to pcregrep. These are - not normally included in the compiled code. - - -Version 6.5 01-Feb-06 ---------------------- - - 1. When using the partial match feature with pcre_dfa_exec(), it was not - anchoring the second and subsequent partial matches at the new starting - point. This could lead to incorrect results. For example, with the pattern - /1234/, partially matching against "123" and then "a4" gave a match. - - 2. Changes to pcregrep: - - (a) All non-match returns from pcre_exec() were being treated as failures - to match the line. Now, unless the error is PCRE_ERROR_NOMATCH, an - error message is output. Some extra information is given for the - PCRE_ERROR_MATCHLIMIT and PCRE_ERROR_RECURSIONLIMIT errors, which are - probably the only errors that are likely to be caused by users (by - specifying a regex that has nested indefinite repeats, for instance). - If there are more than 20 of these errors, pcregrep is abandoned. - - (b) A binary zero was treated as data while matching, but terminated the - output line if it was written out. This has been fixed: binary zeroes - are now no different to any other data bytes. - - (c) Whichever of the LC_ALL or LC_CTYPE environment variables is set is - used to set a locale for matching. The --locale=xxxx long option has - been added (no short equivalent) to specify a locale explicitly on the - pcregrep command, overriding the environment variables. - - (d) When -B was used with -n, some line numbers in the output were one less - than they should have been. - - (e) Added the -o (--only-matching) option. - - (f) If -A or -C was used with -c (count only), some lines of context were - accidentally printed for the final match. - - (g) Added the -H (--with-filename) option. - - (h) The combination of options -rh failed to suppress file names for files - that were found from directory arguments. - - (i) Added the -D (--devices) and -d (--directories) options. - - (j) Added the -F (--fixed-strings) option. - - (k) Allow "-" to be used as a file name for -f as well as for a data file. - - (l) Added the --colo(u)r option. - - (m) Added Jeffrey Friedl's -S testing option, but within #ifdefs so that it - is not present by default. - - 3. A nasty bug was discovered in the handling of recursive patterns, that is, - items such as (?R) or (?1), when the recursion could match a number of - alternatives. If it matched one of the alternatives, but subsequently, - outside the recursion, there was a failure, the code tried to back up into - the recursion. However, because of the way PCRE is implemented, this is not - possible, and the result was an incorrect result from the match. - - In order to prevent this happening, the specification of recursion has - been changed so that all such subpatterns are automatically treated as - atomic groups. Thus, for example, (?R) is treated as if it were (?>(?R)). - - 4. I had overlooked the fact that, in some locales, there are characters for - which isalpha() is true but neither isupper() nor islower() are true. In - the fr_FR locale, for instance, the \xAA and \xBA characters (ordmasculine - and ordfeminine) are like this. This affected the treatment of \w and \W - when they appeared in character classes, but not when they appeared outside - a character class. The bit map for "word" characters is now created - separately from the results of isalnum() instead of just taking it from the - upper, lower, and digit maps. (Plus the underscore character, of course.) - - 5. The above bug also affected the handling of POSIX character classes such as - [[:alpha:]] and [[:alnum:]]. These do not have their own bit maps in PCRE's - permanent tables. Instead, the bit maps for such a class were previously - created as the appropriate unions of the upper, lower, and digit bitmaps. - Now they are created by subtraction from the [[:word:]] class, which has - its own bitmap. - - 6. The [[:blank:]] character class matches horizontal, but not vertical space. - It is created by subtracting the vertical space characters (\x09, \x0a, - \x0b, \x0c) from the [[:space:]] bitmap. Previously, however, the - subtraction was done in the overall bitmap for a character class, meaning - that a class such as [\x0c[:blank:]] was incorrect because \x0c would not - be recognized. This bug has been fixed. - - 7. Patches from the folks at Google: - - (a) pcrecpp.cc: "to handle a corner case that may or may not happen in - real life, but is still worth protecting against". - - (b) pcrecpp.cc: "corrects a bug when negative radixes are used with - regular expressions". - - (c) pcre_scanner.cc: avoid use of std::count() because not all systems - have it. - - (d) Split off pcrecpparg.h from pcrecpp.h and had the former built by - "configure" and the latter not, in order to fix a problem somebody had - with compiling the Arg class on HP-UX. - - (e) Improve the error-handling of the C++ wrapper a little bit. - - (f) New tests for checking recursion limiting. - - 8. The pcre_memmove() function, which is used only if the environment does not - have a standard memmove() function (and is therefore rarely compiled), - contained two bugs: (a) use of int instead of size_t, and (b) it was not - returning a result (though PCRE never actually uses the result). - - 9. In the POSIX regexec() interface, if nmatch is specified as a ridiculously - large number - greater than INT_MAX/(3*sizeof(int)) - REG_ESPACE is - returned instead of calling malloc() with an overflowing number that would - most likely cause subsequent chaos. - -10. The debugging option of pcretest was not showing the NO_AUTO_CAPTURE flag. - -11. The POSIX flag REG_NOSUB is now supported. When a pattern that was compiled - with this option is matched, the nmatch and pmatch options of regexec() are - ignored. - -12. Added REG_UTF8 to the POSIX interface. This is not defined by POSIX, but is - provided in case anyone wants to the the POSIX interface with UTF-8 - strings. - -13. Added CXXLDFLAGS to the Makefile parameters to provide settings only on the - C++ linking (needed for some HP-UX environments). - -14. Avoid compiler warnings in get_ucpname() when compiled without UCP support - (unused parameter) and in the pcre_printint() function (omitted "default" - switch label when the default is to do nothing). - -15. Added some code to make it possible, when PCRE is compiled as a C++ - library, to replace subject pointers for pcre_exec() with a smart pointer - class, thus making it possible to process discontinuous strings. - -16. The two macros PCRE_EXPORT and PCRE_DATA_SCOPE are confusing, and perform - much the same function. They were added by different people who were trying - to make PCRE easy to compile on non-Unix systems. It has been suggested - that PCRE_EXPORT be abolished now that there is more automatic apparatus - for compiling on Windows systems. I have therefore replaced it with - PCRE_DATA_SCOPE. This is set automatically for Windows; if not set it - defaults to "extern" for C or "extern C" for C++, which works fine on - Unix-like systems. It is now possible to override the value of PCRE_DATA_ - SCOPE with something explicit in config.h. In addition: - - (a) pcreposix.h still had just "extern" instead of either of these macros; - I have replaced it with PCRE_DATA_SCOPE. - - (b) Functions such as _pcre_xclass(), which are internal to the library, - but external in the C sense, all had PCRE_EXPORT in their definitions. - This is apparently wrong for the Windows case, so I have removed it. - (It makes no difference on Unix-like systems.) - -17. Added a new limit, MATCH_LIMIT_RECURSION, which limits the depth of nesting - of recursive calls to match(). This is different to MATCH_LIMIT because - that limits the total number of calls to match(), not all of which increase - the depth of recursion. Limiting the recursion depth limits the amount of - stack (or heap if NO_RECURSE is set) that is used. The default can be set - when PCRE is compiled, and changed at run time. A patch from Google adds - this functionality to the C++ interface. - -18. Changes to the handling of Unicode character properties: - - (a) Updated the table to Unicode 4.1.0. - - (b) Recognize characters that are not in the table as "Cn" (undefined). - - (c) I revised the way the table is implemented to a much improved format - which includes recognition of ranges. It now supports the ranges that - are defined in UnicodeData.txt, and it also amalgamates other - characters into ranges. This has reduced the number of entries in the - table from around 16,000 to around 3,000, thus reducing its size - considerably. I realized I did not need to use a tree structure after - all - a binary chop search is just as efficient. Having reduced the - number of entries, I extended their size from 6 bytes to 8 bytes to - allow for more data. - - (d) Added support for Unicode script names via properties such as \p{Han}. - -19. In UTF-8 mode, a backslash followed by a non-Ascii character was not - matching that character. - -20. When matching a repeated Unicode property with a minimum greater than zero, - (for example \pL{2,}), PCRE could look past the end of the subject if it - reached it while seeking the minimum number of characters. This could - happen only if some of the characters were more than one byte long, because - there is a check for at least the minimum number of bytes. - -21. Refactored the implementation of \p and \P so as to be more general, to - allow for more different types of property in future. This has changed the - compiled form incompatibly. Anybody with saved compiled patterns that use - \p or \P will have to recompile them. - -22. Added "Any" and "L&" to the supported property types. - -23. Recognize \x{...} as a code point specifier, even when not in UTF-8 mode, - but give a compile time error if the value is greater than 0xff. - -24. The man pages for pcrepartial, pcreprecompile, and pcre_compile2 were - accidentally not being installed or uninstalled. - -25. The pcre.h file was built from pcre.h.in, but the only changes that were - made were to insert the current release number. This seemed silly, because - it made things harder for people building PCRE on systems that don't run - "configure". I have turned pcre.h into a distributed file, no longer built - by "configure", with the version identification directly included. There is - no longer a pcre.h.in file. - - However, this change necessitated a change to the pcre-config script as - well. It is built from pcre-config.in, and one of the substitutions was the - release number. I have updated configure.ac so that ./configure now finds - the release number by grepping pcre.h. - -26. Added the ability to run the tests under valgrind. - - -Version 6.4 05-Sep-05 ---------------------- - - 1. Change 6.0/10/(l) to pcregrep introduced a bug that caused separator lines - "--" to be printed when multiple files were scanned, even when none of the - -A, -B, or -C options were used. This is not compatible with Gnu grep, so I - consider it to be a bug, and have restored the previous behaviour. - - 2. A couple of code tidies to get rid of compiler warnings. - - 3. The pcretest program used to cheat by referring to symbols in the library - whose names begin with _pcre_. These are internal symbols that are not - really supposed to be visible externally, and in some environments it is - possible to suppress them. The cheating is now confined to including - certain files from the library's source, which is a bit cleaner. - - 4. Renamed pcre.in as pcre.h.in to go with pcrecpp.h.in; it also makes the - file's purpose clearer. - - 5. Reorganized pcre_ucp_findchar(). - - -Version 6.3 15-Aug-05 ---------------------- - - 1. The file libpcre.pc.in did not have general read permission in the tarball. - - 2. There were some problems when building without C++ support: - - (a) If C++ support was not built, "make install" and "make test" still - tried to test it. - - (b) There were problems when the value of CXX was explicitly set. Some - changes have been made to try to fix these, and ... - - (c) --disable-cpp can now be used to explicitly disable C++ support. - - (d) The use of @CPP_OBJ@ directly caused a blank line preceded by a - backslash in a target when C++ was disabled. This confuses some - versions of "make", apparently. Using an intermediate variable solves - this. (Same for CPP_LOBJ.) - - 3. $(LINK_FOR_BUILD) now includes $(CFLAGS_FOR_BUILD) and $(LINK) - (non-Windows) now includes $(CFLAGS) because these flags are sometimes - necessary on certain architectures. - - 4. Added a setting of -export-symbols-regex to the link command to remove - those symbols that are exported in the C sense, but actually are local - within the library, and not documented. Their names all begin with - "_pcre_". This is not a perfect job, because (a) we have to except some - symbols that pcretest ("illegally") uses, and (b) the facility isn't always - available (and never for static libraries). I have made a note to try to - find a way round (a) in the future. - - -Version 6.2 01-Aug-05 ---------------------- - - 1. There was no test for integer overflow of quantifier values. A construction - such as {1111111111111111} would give undefined results. What is worse, if - a minimum quantifier for a parenthesized subpattern overflowed and became - negative, the calculation of the memory size went wrong. This could have - led to memory overwriting. - - 2. Building PCRE using VPATH was broken. Hopefully it is now fixed. - - 3. Added "b" to the 2nd argument of fopen() in dftables.c, for non-Unix-like - operating environments where this matters. - - 4. Applied Giuseppe Maxia's patch to add additional features for controlling - PCRE options from within the C++ wrapper. - - 5. Named capturing subpatterns were not being correctly counted when a pattern - was compiled. This caused two problems: (a) If there were more than 100 - such subpatterns, the calculation of the memory needed for the whole - compiled pattern went wrong, leading to an overflow error. (b) Numerical - back references of the form \12, where the number was greater than 9, were - not recognized as back references, even though there were sufficient - previous subpatterns. - - 6. Two minor patches to pcrecpp.cc in order to allow it to compile on older - versions of gcc, e.g. 2.95.4. - - -Version 6.1 21-Jun-05 ---------------------- - - 1. There was one reference to the variable "posix" in pcretest.c that was not - surrounded by "#if !defined NOPOSIX". - - 2. Make it possible to compile pcretest without DFA support, UTF8 support, or - the cross-check on the old pcre_info() function, for the benefit of the - cut-down version of PCRE that is currently imported into Exim. - - 3. A (silly) pattern starting with (?i)(?-i) caused an internal space - allocation error. I've done the easy fix, which wastes 2 bytes for sensible - patterns that start (?i) but I don't think that matters. The use of (?i) is - just an example; this all applies to the other options as well. - - 4. Since libtool seems to echo the compile commands it is issuing, the output - from "make" can be reduced a bit by putting "@" in front of each libtool - compile command. - - 5. Patch from the folks at Google for configure.in to be a bit more thorough - in checking for a suitable C++ installation before trying to compile the - C++ stuff. This should fix a reported problem when a compiler was present, - but no suitable headers. - - 6. The man pages all had just "PCRE" as their title. I have changed them to - be the relevant file name. I have also arranged that these names are - retained in the file doc/pcre.txt, which is a concatenation in text format - of all the man pages except the little individual ones for each function. - - 7. The NON-UNIX-USE file had not been updated for the different set of source - files that come with release 6. I also added a few comments about the C++ - wrapper. - - -Version 6.0 07-Jun-05 ---------------------- - - 1. Some minor internal re-organization to help with my DFA experiments. - - 2. Some missing #ifdef SUPPORT_UCP conditionals in pcretest and printint that - didn't matter for the library itself when fully configured, but did matter - when compiling without UCP support, or within Exim, where the ucp files are - not imported. - - 3. Refactoring of the library code to split up the various functions into - different source modules. The addition of the new DFA matching code (see - below) to a single monolithic source would have made it really too - unwieldy, quite apart from causing all the code to be include in a - statically linked application, when only some functions are used. This is - relevant even without the DFA addition now that patterns can be compiled in - one application and matched in another. - - The downside of splitting up is that there have to be some external - functions and data tables that are used internally in different modules of - the library but which are not part of the API. These have all had their - names changed to start with "_pcre_" so that they are unlikely to clash - with other external names. - - 4. Added an alternate matching function, pcre_dfa_exec(), which matches using - a different (DFA) algorithm. Although it is slower than the original - function, it does have some advantages for certain types of matching - problem. - - 5. Upgrades to pcretest in order to test the features of pcre_dfa_exec(), - including restarting after a partial match. - - 6. A patch for pcregrep that defines INVALID_FILE_ATTRIBUTES if it is not - defined when compiling for Windows was sent to me. I have put it into the - code, though I have no means of testing or verifying it. - - 7. Added the pcre_refcount() auxiliary function. - - 8. Added the PCRE_FIRSTLINE option. This constrains an unanchored pattern to - match before or at the first newline in the subject string. In pcretest, - the /f option on a pattern can be used to set this. - - 9. A repeated \w when used in UTF-8 mode with characters greater than 256 - would behave wrongly. This has been present in PCRE since release 4.0. - -10. A number of changes to the pcregrep command: - - (a) Refactored how -x works; insert ^(...)$ instead of setting - PCRE_ANCHORED and checking the length, in preparation for adding - something similar for -w. - - (b) Added the -w (match as a word) option. - - (c) Refactored the way lines are read and buffered so as to have more - than one at a time available. - - (d) Implemented a pcregrep test script. - - (e) Added the -M (multiline match) option. This allows patterns to match - over several lines of the subject. The buffering ensures that at least - 8K, or the rest of the document (whichever is the shorter) is available - for matching (and similarly the previous 8K for lookbehind assertions). - - (f) Changed the --help output so that it now says - - -w, --word-regex(p) - - instead of two lines, one with "regex" and the other with "regexp" - because that confused at least one person since the short forms are the - same. (This required a bit of code, as the output is generated - automatically from a table. It wasn't just a text change.) - - (g) -- can be used to terminate pcregrep options if the next thing isn't an - option but starts with a hyphen. Could be a pattern or a path name - starting with a hyphen, for instance. - - (h) "-" can be given as a file name to represent stdin. - - (i) When file names are being printed, "(standard input)" is used for - the standard input, for compatibility with GNU grep. Previously - "" was used. - - (j) The option --label=xxx can be used to supply a name to be used for - stdin when file names are being printed. There is no short form. - - (k) Re-factored the options decoding logic because we are going to add - two more options that take data. Such options can now be given in four - different ways, e.g. "-fname", "-f name", "--file=name", "--file name". - - (l) Added the -A, -B, and -C options for requesting that lines of context - around matches be printed. - - (m) Added the -L option to print the names of files that do not contain - any matching lines, that is, the complement of -l. - - (n) The return code is 2 if any file cannot be opened, but pcregrep does - continue to scan other files. - - (o) The -s option was incorrectly implemented. For compatibility with other - greps, it now suppresses the error message for a non-existent or non- - accessible file (but not the return code). There is a new option called - -q that suppresses the output of matching lines, which was what -s was - previously doing. - - (p) Added --include and --exclude options to specify files for inclusion - and exclusion when recursing. - -11. The Makefile was not using the Autoconf-supported LDFLAGS macro properly. - Hopefully, it now does. - -12. Missing cast in pcre_study(). - -13. Added an "uninstall" target to the makefile. - -14. Replaced "extern" in the function prototypes in Makefile.in with - "PCRE_DATA_SCOPE", which defaults to 'extern' or 'extern "C"' in the Unix - world, but is set differently for Windows. - -15. Added a second compiling function called pcre_compile2(). The only - difference is that it has an extra argument, which is a pointer to an - integer error code. When there is a compile-time failure, this is set - non-zero, in addition to the error test pointer being set to point to an - error message. The new argument may be NULL if no error number is required - (but then you may as well call pcre_compile(), which is now just a - wrapper). This facility is provided because some applications need a - numeric error indication, but it has also enabled me to tidy up the way - compile-time errors are handled in the POSIX wrapper. - -16. Added VPATH=.libs to the makefile; this should help when building with one - prefix path and installing with another. (Or so I'm told by someone who - knows more about this stuff than I do.) - -17. Added a new option, REG_DOTALL, to the POSIX function regcomp(). This - passes PCRE_DOTALL to the pcre_compile() function, making the "." character - match everything, including newlines. This is not POSIX-compatible, but - somebody wanted the feature. From pcretest it can be activated by using - both the P and the s flags. - -18. AC_PROG_LIBTOOL appeared twice in Makefile.in. Removed one. - -19. libpcre.pc was being incorrectly installed as executable. - -20. A couple of places in pcretest check for end-of-line by looking for '\n'; - it now also looks for '\r' so that it will work unmodified on Windows. - -21. Added Google's contributed C++ wrapper to the distribution. - -22. Added some untidy missing memory free() calls in pcretest, to keep - Electric Fence happy when testing. - - - -Version 5.0 13-Sep-04 ---------------------- - - 1. Internal change: literal characters are no longer packed up into items - containing multiple characters in a single byte-string. Each character - is now matched using a separate opcode. However, there may be more than one - byte in the character in UTF-8 mode. - - 2. The pcre_callout_block structure has two new fields: pattern_position and - next_item_length. These contain the offset in the pattern to the next match - item, and its length, respectively. - - 3. The PCRE_AUTO_CALLOUT option for pcre_compile() requests the automatic - insertion of callouts before each pattern item. Added the /C option to - pcretest to make use of this. - - 4. On the advice of a Windows user, the lines - - #if defined(_WIN32) || defined(WIN32) - _setmode( _fileno( stdout ), 0x8000 ); - #endif /* defined(_WIN32) || defined(WIN32) */ - - have been added to the source of pcretest. This apparently does useful - magic in relation to line terminators. - - 5. Changed "r" and "w" in the calls to fopen() in pcretest to "rb" and "wb" - for the benefit of those environments where the "b" makes a difference. - - 6. The icc compiler has the same options as gcc, but "configure" doesn't seem - to know about it. I have put a hack into configure.in that adds in code - to set GCC=yes if CC=icc. This seems to end up at a point in the - generated configure script that is early enough to affect the setting of - compiler options, which is what is needed, but I have no means of testing - whether it really works. (The user who reported this had patched the - generated configure script, which of course I cannot do.) - - LATER: After change 22 below (new libtool files), the configure script - seems to know about icc (and also ecc). Therefore, I have commented out - this hack in configure.in. - - 7. Added support for pkg-config (2 patches were sent in). - - 8. Negated POSIX character classes that used a combination of internal tables - were completely broken. These were [[:^alpha:]], [[:^alnum:]], and - [[:^ascii]]. Typically, they would match almost any characters. The other - POSIX classes were not broken in this way. - - 9. Matching the pattern "\b.*?" against "ab cd", starting at offset 1, failed - to find the match, as PCRE was deluded into thinking that the match had to - start at the start point or following a newline. The same bug applied to - patterns with negative forward assertions or any backward assertions - preceding ".*" at the start, unless the pattern required a fixed first - character. This was a failing pattern: "(?!.bcd).*". The bug is now fixed. - -10. In UTF-8 mode, when moving forwards in the subject after a failed match - starting at the last subject character, bytes beyond the end of the subject - string were read. - -11. Renamed the variable "class" as "classbits" to make life easier for C++ - users. (Previously there was a macro definition, but it apparently wasn't - enough.) - -12. Added the new field "tables" to the extra data so that tables can be passed - in at exec time, or the internal tables can be re-selected. This allows - a compiled regex to be saved and re-used at a later time by a different - program that might have everything at different addresses. - -13. Modified the pcre-config script so that, when run on Solaris, it shows a - -R library as well as a -L library. - -14. The debugging options of pcretest (-d on the command line or D on a - pattern) showed incorrect output for anything following an extended class - that contained multibyte characters and which was followed by a quantifier. - -15. Added optional support for general category Unicode character properties - via the \p, \P, and \X escapes. Unicode property support implies UTF-8 - support. It adds about 90K to the size of the library. The meanings of the - inbuilt class escapes such as \d and \s have NOT been changed. - -16. Updated pcredemo.c to include calls to free() to release the memory for the - compiled pattern. - -17. The generated file chartables.c was being created in the source directory - instead of in the building directory. This caused the build to fail if the - source directory was different from the building directory, and was - read-only. - -18. Added some sample Win commands from Mark Tetrode into the NON-UNIX-USE - file. No doubt somebody will tell me if they don't make sense... Also added - Dan Mooney's comments about building on OpenVMS. - -19. Added support for partial matching via the PCRE_PARTIAL option for - pcre_exec() and the \P data escape in pcretest. - -20. Extended pcretest with 3 new pattern features: - - (i) A pattern option of the form ">rest-of-line" causes pcretest to - write the compiled pattern to the file whose name is "rest-of-line". - This is a straight binary dump of the data, with the saved pointer to - the character tables forced to be NULL. The study data, if any, is - written too. After writing, pcretest reads a new pattern. - - (ii) If, instead of a pattern, ": new target - : new target - : use native compiler - : use native linker - : handle Windows platform correctly - : ditto - : ditto - copy DLL to top builddir before testing - - As part of these changes, -no-undefined was removed again. This was reported - to give trouble on HP-UX 11.0, so getting rid of it seems like a good idea - in any case. - -3. Some tidies to get rid of compiler warnings: - - . In the match_data structure, match_limit was an unsigned long int, whereas - match_call_count was an int. I've made them both unsigned long ints. - - . In pcretest the fact that a const uschar * doesn't automatically cast to - a void * provoked a warning. - - . Turning on some more compiler warnings threw up some "shadow" variables - and a few more missing casts. - -4. If PCRE was complied with UTF-8 support, but called without the PCRE_UTF8 - option, a class that contained a single character with a value between 128 - and 255 (e.g. /[\xFF]/) caused PCRE to crash. - -5. If PCRE was compiled with UTF-8 support, but called without the PCRE_UTF8 - option, a class that contained several characters, but with at least one - whose value was between 128 and 255 caused PCRE to crash. - - -Version 4.1 12-Mar-03 ---------------------- - -1. Compiling with gcc -pedantic found a couple of places where casts were -needed, and a string in dftables.c that was longer than standard compilers are -required to support. - -2. Compiling with Sun's compiler found a few more places where the code could -be tidied up in order to avoid warnings. - -3. The variables for cross-compiling were called HOST_CC and HOST_CFLAGS; the -first of these names is deprecated in the latest Autoconf in favour of the name -CC_FOR_BUILD, because "host" is typically used to mean the system on which the -compiled code will be run. I can't find a reference for HOST_CFLAGS, but by -analogy I have changed it to CFLAGS_FOR_BUILD. - -4. Added -no-undefined to the linking command in the Makefile, because this is -apparently helpful for Windows. To make it work, also added "-L. -lpcre" to the -linking step for the pcreposix library. - -5. PCRE was failing to diagnose the case of two named groups with the same -name. - -6. A problem with one of PCRE's optimizations was discovered. PCRE remembers a -literal character that is needed in the subject for a match, and scans along to -ensure that it is present before embarking on the full matching process. This -saves time in cases of nested unlimited repeats that are never going to match. -Problem: the scan can take a lot of time if the subject is very long (e.g. -megabytes), thus penalizing straightforward matches. It is now done only if the -amount of subject to be scanned is less than 1000 bytes. - -7. A lesser problem with the same optimization is that it was recording the -first character of an anchored pattern as "needed", thus provoking a search -right along the subject, even when the first match of the pattern was going to -fail. The "needed" character is now not set for anchored patterns, unless it -follows something in the pattern that is of non-fixed length. Thus, it still -fulfils its original purpose of finding quick non-matches in cases of nested -unlimited repeats, but isn't used for simple anchored patterns such as /^abc/. - - -Version 4.0 17-Feb-03 ---------------------- - -1. If a comment in an extended regex that started immediately after a meta-item -extended to the end of string, PCRE compiled incorrect data. This could lead to -all kinds of weird effects. Example: /#/ was bad; /()#/ was bad; /a#/ was not. - -2. Moved to autoconf 2.53 and libtool 1.4.2. - -3. Perl 5.8 no longer needs "use utf8" for doing UTF-8 things. Consequently, -the special perltest8 script is no longer needed - all the tests can be run -from a single perltest script. - -4. From 5.004, Perl has not included the VT character (0x0b) in the set defined -by \s. It has now been removed in PCRE. This means it isn't recognized as -whitespace in /x regexes too, which is the same as Perl. Note that the POSIX -class [:space:] *does* include VT, thereby creating a mess. - -5. Added the class [:blank:] (a GNU extension from Perl 5.8) to match only -space and tab. - -6. Perl 5.005 was a long time ago. It's time to amalgamate the tests that use -its new features into the main test script, reducing the number of scripts. - -7. Perl 5.8 has changed the meaning of patterns like /a(?i)b/. Earlier versions -were backward compatible, and made the (?i) apply to the whole pattern, as if -/i were given. Now it behaves more logically, and applies the option setting -only to what follows. PCRE has been changed to follow suit. However, if it -finds options settings right at the start of the pattern, it extracts them into -the global options, as before. Thus, they show up in the info data. - -8. Added support for the \Q...\E escape sequence. Characters in between are -treated as literals. This is slightly different from Perl in that $ and @ are -also handled as literals inside the quotes. In Perl, they will cause variable -interpolation. Note the following examples: - - Pattern PCRE matches Perl matches - - \Qabc$xyz\E abc$xyz abc followed by the contents of $xyz - \Qabc\$xyz\E abc\$xyz abc\$xyz - \Qabc\E\$\Qxyz\E abc$xyz abc$xyz - -For compatibility with Perl, \Q...\E sequences are recognized inside character -classes as well as outside them. - -9. Re-organized 3 code statements in pcretest to avoid "overflow in -floating-point constant arithmetic" warnings from a Microsoft compiler. Added a -(size_t) cast to one statement in pcretest and one in pcreposix to avoid -signed/unsigned warnings. - -10. SunOS4 doesn't have strtoul(). This was used only for unpicking the -o -option for pcretest, so I've replaced it by a simple function that does just -that job. - -11. pcregrep was ending with code 0 instead of 2 for the commands "pcregrep" or -"pcregrep -". - -12. Added "possessive quantifiers" ?+, *+, ++, and {,}+ which come from Sun's -Java package. This provides some syntactic sugar for simple cases of what my -documentation calls "once-only subpatterns". A pattern such as x*+ is the same -as (?>x*). In other words, if what is inside (?>...) is just a single repeated -item, you can use this simplified notation. Note that only makes sense with -greedy quantifiers. Consequently, the use of the possessive quantifier forces -greediness, whatever the setting of the PCRE_UNGREEDY option. - -13. A change of greediness default within a pattern was not taking effect at -the current level for patterns like /(b+(?U)a+)/. It did apply to parenthesized -subpatterns that followed. Patterns like /b+(?U)a+/ worked because the option -was abstracted outside. - -14. PCRE now supports the \G assertion. It is true when the current matching -position is at the start point of the match. This differs from \A when the -starting offset is non-zero. Used with the /g option of pcretest (or similar -code), it works in the same way as it does for Perl's /g option. If all -alternatives of a regex begin with \G, the expression is anchored to the start -match position, and the "anchored" flag is set in the compiled expression. - -15. Some bugs concerning the handling of certain option changes within patterns -have been fixed. These applied to options other than (?ims). For example, -"a(?x: b c )d" did not match "XabcdY" but did match "Xa b c dY". It should have -been the other way round. Some of this was related to change 7 above. - -16. PCRE now gives errors for /[.x.]/ and /[=x=]/ as unsupported POSIX -features, as Perl does. Previously, PCRE gave the warnings only for /[[.x.]]/ -and /[[=x=]]/. PCRE now also gives an error for /[:name:]/ because it supports -POSIX classes only within a class (e.g. /[[:alpha:]]/). - -17. Added support for Perl's \C escape. This matches one byte, even in UTF8 -mode. Unlike ".", it always matches newline, whatever the setting of -PCRE_DOTALL. However, PCRE does not permit \C to appear in lookbehind -assertions. Perl allows it, but it doesn't (in general) work because it can't -calculate the length of the lookbehind. At least, that's the case for Perl -5.8.0 - I've been told they are going to document that it doesn't work in -future. - -18. Added an error diagnosis for escapes that PCRE does not support: these are -\L, \l, \N, \P, \p, \U, \u, and \X. - -19. Although correctly diagnosing a missing ']' in a character class, PCRE was -reading past the end of the pattern in cases such as /[abcd/. - -20. PCRE was getting more memory than necessary for patterns with classes that -contained both POSIX named classes and other characters, e.g. /[[:space:]abc/. - -21. Added some code, conditional on #ifdef VPCOMPAT, to make life easier for -compiling PCRE for use with Virtual Pascal. - -22. Small fix to the Makefile to make it work properly if the build is done -outside the source tree. - -23. Added a new extension: a condition to go with recursion. If a conditional -subpattern starts with (?(R) the "true" branch is used if recursion has -happened, whereas the "false" branch is used only at the top level. - -24. When there was a very long string of literal characters (over 255 bytes -without UTF support, over 250 bytes with UTF support), the computation of how -much memory was required could be incorrect, leading to segfaults or other -strange effects. - -25. PCRE was incorrectly assuming anchoring (either to start of subject or to -start of line for a non-DOTALL pattern) when a pattern started with (.*) and -there was a subsequent back reference to those brackets. This meant that, for -example, /(.*)\d+\1/ failed to match "abc123bc". Unfortunately, it isn't -possible to check for precisely this case. All we can do is abandon the -optimization if .* occurs inside capturing brackets when there are any back -references whatsoever. (See below for a better fix that came later.) - -26. The handling of the optimization for finding the first character of a -non-anchored pattern, and for finding a character that is required later in the -match were failing in some cases. This didn't break the matching; it just -failed to optimize when it could. The way this is done has been re-implemented. - -27. Fixed typo in error message for invalid (?R item (it said "(?p"). - -28. Added a new feature that provides some of the functionality that Perl -provides with (?{...}). The facility is termed a "callout". The way it is done -in PCRE is for the caller to provide an optional function, by setting -pcre_callout to its entry point. Like pcre_malloc and pcre_free, this is a -global variable. By default it is unset, which disables all calling out. To get -the function called, the regex must include (?C) at appropriate points. This -is, in fact, equivalent to (?C0), and any number <= 255 may be given with (?C). -This provides a means of identifying different callout points. When PCRE -reaches such a point in the regex, if pcre_callout has been set, the external -function is called. It is provided with data in a structure called -pcre_callout_block, which is defined in pcre.h. If the function returns 0, -matching continues; if it returns a non-zero value, the match at the current -point fails. However, backtracking will occur if possible. [This was changed -later and other features added - see item 49 below.] - -29. pcretest is upgraded to test the callout functionality. It provides a -callout function that displays information. By default, it shows the start of -the match and the current position in the text. There are some new data escapes -to vary what happens: - - \C+ in addition, show current contents of captured substrings - \C- do not supply a callout function - \C!n return 1 when callout number n is reached - \C!n!m return 1 when callout number n is reached for the mth time - -30. If pcregrep was called with the -l option and just a single file name, it -output "" if a match was found, instead of the file name. - -31. Improve the efficiency of the POSIX API to PCRE. If the number of capturing -slots is less than POSIX_MALLOC_THRESHOLD, use a block on the stack to pass to -pcre_exec(). This saves a malloc/free per call. The default value of -POSIX_MALLOC_THRESHOLD is 10; it can be changed by --with-posix-malloc-threshold -when configuring. - -32. The default maximum size of a compiled pattern is 64K. There have been a -few cases of people hitting this limit. The code now uses macros to handle the -storing of links as offsets within the compiled pattern. It defaults to 2-byte -links, but this can be changed to 3 or 4 bytes by --with-link-size when -configuring. Tests 2 and 5 work only with 2-byte links because they output -debugging information about compiled patterns. - -33. Internal code re-arrangements: - -(a) Moved the debugging function for printing out a compiled regex into - its own source file (printint.c) and used #include to pull it into - pcretest.c and, when DEBUG is defined, into pcre.c, instead of having two - separate copies. - -(b) Defined the list of op-code names for debugging as a macro in - internal.h so that it is next to the definition of the opcodes. - -(c) Defined a table of op-code lengths for simpler skipping along compiled - code. This is again a macro in internal.h so that it is next to the - definition of the opcodes. - -34. Added support for recursive calls to individual subpatterns, along the -lines of Robin Houston's patch (but implemented somewhat differently). - -35. Further mods to the Makefile to help Win32. Also, added code to pcregrep to -allow it to read and process whole directories in Win32. This code was -contributed by Lionel Fourquaux; it has not been tested by me. - -36. Added support for named subpatterns. The Python syntax (?P...) is -used to name a group. Names consist of alphanumerics and underscores, and must -be unique. Back references use the syntax (?P=name) and recursive calls use -(?P>name) which is a PCRE extension to the Python extension. Groups still have -numbers. The function pcre_fullinfo() can be used after compilation to extract -a name/number map. There are three relevant calls: - - PCRE_INFO_NAMEENTRYSIZE yields the size of each entry in the map - PCRE_INFO_NAMECOUNT yields the number of entries - PCRE_INFO_NAMETABLE yields a pointer to the map. - -The map is a vector of fixed-size entries. The size of each entry depends on -the length of the longest name used. The first two bytes of each entry are the -group number, most significant byte first. There follows the corresponding -name, zero terminated. The names are in alphabetical order. - -37. Make the maximum literal string in the compiled code 250 for the non-UTF-8 -case instead of 255. Making it the same both with and without UTF-8 support -means that the same test output works with both. - -38. There was a case of malloc(0) in the POSIX testing code in pcretest. Avoid -calling malloc() with a zero argument. - -39. Change 25 above had to resort to a heavy-handed test for the .* anchoring -optimization. I've improved things by keeping a bitmap of backreferences with -numbers 1-31 so that if .* occurs inside capturing brackets that are not in -fact referenced, the optimization can be applied. It is unlikely that a -relevant occurrence of .* (i.e. one which might indicate anchoring or forcing -the match to follow \n) will appear inside brackets with a number greater than -31, but if it does, any back reference > 31 suppresses the optimization. - -40. Added a new compile-time option PCRE_NO_AUTO_CAPTURE. This has the effect -of disabling numbered capturing parentheses. Any opening parenthesis that is -not followed by ? behaves as if it were followed by ?: but named parentheses -can still be used for capturing (and they will acquire numbers in the usual -way). - -41. Redesigned the return codes from the match() function into yes/no/error so -that errors can be passed back from deep inside the nested calls. A malloc -failure while inside a recursive subpattern call now causes the -PCRE_ERROR_NOMEMORY return instead of quietly going wrong. - -42. It is now possible to set a limit on the number of times the match() -function is called in a call to pcre_exec(). This facility makes it possible to -limit the amount of recursion and backtracking, though not in a directly -obvious way, because the match() function is used in a number of different -circumstances. The count starts from zero for each position in the subject -string (for non-anchored patterns). The default limit is, for compatibility, a -large number, namely 10 000 000. You can change this in two ways: - -(a) When configuring PCRE before making, you can use --with-match-limit=n - to set a default value for the compiled library. - -(b) For each call to pcre_exec(), you can pass a pcre_extra block in which - a different value is set. See 45 below. - -If the limit is exceeded, pcre_exec() returns PCRE_ERROR_MATCHLIMIT. - -43. Added a new function pcre_config(int, void *) to enable run-time extraction -of things that can be changed at compile time. The first argument specifies -what is wanted and the second points to where the information is to be placed. -The current list of available information is: - - PCRE_CONFIG_UTF8 - -The output is an integer that is set to one if UTF-8 support is available; -otherwise it is set to zero. - - PCRE_CONFIG_NEWLINE - -The output is an integer that it set to the value of the code that is used for -newline. It is either LF (10) or CR (13). - - PCRE_CONFIG_LINK_SIZE - -The output is an integer that contains the number of bytes used for internal -linkage in compiled expressions. The value is 2, 3, or 4. See item 32 above. - - PCRE_CONFIG_POSIX_MALLOC_THRESHOLD - -The output is an integer that contains the threshold above which the POSIX -interface uses malloc() for output vectors. See item 31 above. - - PCRE_CONFIG_MATCH_LIMIT - -The output is an unsigned integer that contains the default limit of the number -of match() calls in a pcre_exec() execution. See 42 above. - -44. pcretest has been upgraded by the addition of the -C option. This causes it -to extract all the available output from the new pcre_config() function, and to -output it. The program then exits immediately. - -45. A need has arisen to pass over additional data with calls to pcre_exec() in -order to support additional features. One way would have been to define -pcre_exec2() (for example) with extra arguments, but this would not have been -extensible, and would also have required all calls to the original function to -be mapped to the new one. Instead, I have chosen to extend the mechanism that -is used for passing in "extra" data from pcre_study(). - -The pcre_extra structure is now exposed and defined in pcre.h. It currently -contains the following fields: - - flags a bitmap indicating which of the following fields are set - study_data opaque data from pcre_study() - match_limit a way of specifying a limit on match() calls for a specific - call to pcre_exec() - callout_data data for callouts (see 49 below) - -The flag bits are also defined in pcre.h, and are - - PCRE_EXTRA_STUDY_DATA - PCRE_EXTRA_MATCH_LIMIT - PCRE_EXTRA_CALLOUT_DATA - -The pcre_study() function now returns one of these new pcre_extra blocks, with -the actual study data pointed to by the study_data field, and the -PCRE_EXTRA_STUDY_DATA flag set. This can be passed directly to pcre_exec() as -before. That is, this change is entirely upwards-compatible and requires no -change to existing code. - -If you want to pass in additional data to pcre_exec(), you can either place it -in a pcre_extra block provided by pcre_study(), or create your own pcre_extra -block. - -46. pcretest has been extended to test the PCRE_EXTRA_MATCH_LIMIT feature. If a -data string contains the escape sequence \M, pcretest calls pcre_exec() several -times with different match limits, until it finds the minimum value needed for -pcre_exec() to complete. The value is then output. This can be instructive; for -most simple matches the number is quite small, but for pathological cases it -gets very large very quickly. - -47. There's a new option for pcre_fullinfo() called PCRE_INFO_STUDYSIZE. It -returns the size of the data block pointed to by the study_data field in a -pcre_extra block, that is, the value that was passed as the argument to -pcre_malloc() when PCRE was getting memory in which to place the information -created by pcre_study(). The fourth argument should point to a size_t variable. -pcretest has been extended so that this information is shown after a successful -pcre_study() call when information about the compiled regex is being displayed. - -48. Cosmetic change to Makefile: there's no need to have / after $(DESTDIR) -because what follows is always an absolute path. (Later: it turns out that this -is more than cosmetic for MinGW, because it doesn't like empty path -components.) - -49. Some changes have been made to the callout feature (see 28 above): - -(i) A callout function now has three choices for what it returns: - - 0 => success, carry on matching - > 0 => failure at this point, but backtrack if possible - < 0 => serious error, return this value from pcre_exec() - - Negative values should normally be chosen from the set of PCRE_ERROR_xxx - values. In particular, returning PCRE_ERROR_NOMATCH forces a standard - "match failed" error. The error number PCRE_ERROR_CALLOUT is reserved for - use by callout functions. It will never be used by PCRE itself. - -(ii) The pcre_extra structure (see 45 above) has a void * field called - callout_data, with corresponding flag bit PCRE_EXTRA_CALLOUT_DATA. The - pcre_callout_block structure has a field of the same name. The contents of - the field passed in the pcre_extra structure are passed to the callout - function in the corresponding field in the callout block. This makes it - easier to use the same callout-containing regex from multiple threads. For - testing, the pcretest program has a new data escape - - \C*n pass the number n (may be negative) as callout_data - - If the callout function in pcretest receives a non-zero value as - callout_data, it returns that value. - -50. Makefile wasn't handling CFLAGS properly when compiling dftables. Also, -there were some redundant $(CFLAGS) in commands that are now specified as -$(LINK), which already includes $(CFLAGS). - -51. Extensions to UTF-8 support are listed below. These all apply when (a) PCRE -has been compiled with UTF-8 support *and* pcre_compile() has been compiled -with the PCRE_UTF8 flag. Patterns that are compiled without that flag assume -one-byte characters throughout. Note that case-insensitive matching applies -only to characters whose values are less than 256. PCRE doesn't support the -notion of cases for higher-valued characters. - -(i) A character class whose characters are all within 0-255 is handled as - a bit map, and the map is inverted for negative classes. Previously, a - character > 255 always failed to match such a class; however it should - match if the class was a negative one (e.g. [^ab]). This has been fixed. - -(ii) A negated character class with a single character < 255 is coded as - "not this character" (OP_NOT). This wasn't working properly when the test - character was multibyte, either singly or repeated. - -(iii) Repeats of multibyte characters are now handled correctly in UTF-8 - mode, for example: \x{100}{2,3}. - -(iv) The character escapes \b, \B, \d, \D, \s, \S, \w, and \W (either - singly or repeated) now correctly test multibyte characters. However, - PCRE doesn't recognize any characters with values greater than 255 as - digits, spaces, or word characters. Such characters always match \D, \S, - and \W, and never match \d, \s, or \w. - -(v) Classes may now contain characters and character ranges with values - greater than 255. For example: [ab\x{100}-\x{400}]. - -(vi) pcregrep now has a --utf-8 option (synonym -u) which makes it call - PCRE in UTF-8 mode. - -52. The info request value PCRE_INFO_FIRSTCHAR has been renamed -PCRE_INFO_FIRSTBYTE because it is a byte value. However, the old name is -retained for backwards compatibility. (Note that LASTLITERAL is also a byte -value.) - -53. The single man page has become too large. I have therefore split it up into -a number of separate man pages. These also give rise to individual HTML pages; -these are now put in a separate directory, and there is an index.html page that -lists them all. Some hyperlinking between the pages has been installed. - -54. Added convenience functions for handling named capturing parentheses. - -55. Unknown escapes inside character classes (e.g. [\M]) and escapes that -aren't interpreted therein (e.g. [\C]) are literals in Perl. This is now also -true in PCRE, except when the PCRE_EXTENDED option is set, in which case they -are faulted. - -56. Introduced HOST_CC and HOST_CFLAGS which can be set in the environment when -calling configure. These values are used when compiling the dftables.c program -which is run to generate the source of the default character tables. They -default to the values of CC and CFLAGS. If you are cross-compiling PCRE, -you will need to set these values. - -57. Updated the building process for Windows DLL, as provided by Fred Cox. - - -Version 3.9 02-Jan-02 ---------------------- - -1. A bit of extraneous text had somehow crept into the pcregrep documentation. - -2. If --disable-static was given, the building process failed when trying to -build pcretest and pcregrep. (For some reason it was using libtool to compile -them, which is not right, as they aren't part of the library.) - - -Version 3.8 18-Dec-01 ---------------------- - -1. The experimental UTF-8 code was completely screwed up. It was packing the -bytes in the wrong order. How dumb can you get? - - -Version 3.7 29-Oct-01 ---------------------- - -1. In updating pcretest to check change 1 of version 3.6, I screwed up. -This caused pcretest, when used on the test data, to segfault. Unfortunately, -this didn't happen under Solaris 8, where I normally test things. - -2. The Makefile had to be changed to make it work on BSD systems, where 'make' -doesn't seem to recognize that ./xxx and xxx are the same file. (This entry -isn't in ChangeLog distributed with 3.7 because I forgot when I hastily made -this fix an hour or so after the initial 3.7 release.) - - -Version 3.6 23-Oct-01 ---------------------- - -1. Crashed with /(sens|respons)e and \1ibility/ and "sense and sensibility" if -offsets passed as NULL with zero offset count. - -2. The config.guess and config.sub files had not been updated when I moved to -the latest autoconf. - - -Version 3.5 15-Aug-01 ---------------------- - -1. Added some missing #if !defined NOPOSIX conditionals in pcretest.c that -had been forgotten. - -2. By using declared but undefined structures, we can avoid using "void" -definitions in pcre.h while keeping the internal definitions of the structures -private. - -3. The distribution is now built using autoconf 2.50 and libtool 1.4. From a -user point of view, this means that both static and shared libraries are built -by default, but this can be individually controlled. More of the work of -handling this static/shared cases is now inside libtool instead of PCRE's make -file. - -4. The pcretest utility is now installed along with pcregrep because it is -useful for users (to test regexs) and by doing this, it automatically gets -relinked by libtool. The documentation has been turned into a man page, so -there are now .1, .txt, and .html versions in /doc. - -5. Upgrades to pcregrep: - (i) Added long-form option names like gnu grep. - (ii) Added --help to list all options with an explanatory phrase. - (iii) Added -r, --recursive to recurse into sub-directories. - (iv) Added -f, --file to read patterns from a file. - -6. pcre_exec() was referring to its "code" argument before testing that -argument for NULL (and giving an error if it was NULL). - -7. Upgraded Makefile.in to allow for compiling in a different directory from -the source directory. - -8. Tiny buglet in pcretest: when pcre_fullinfo() was called to retrieve the -options bits, the pointer it was passed was to an int instead of to an unsigned -long int. This mattered only on 64-bit systems. - -9. Fixed typo (3.4/1) in pcre.h again. Sigh. I had changed pcre.h (which is -generated) instead of pcre.in, which it its source. Also made the same change -in several of the .c files. - -10. A new release of gcc defines printf() as a macro, which broke pcretest -because it had an ifdef in the middle of a string argument for printf(). Fixed -by using separate calls to printf(). - -11. Added --enable-newline-is-cr and --enable-newline-is-lf to the configure -script, to force use of CR or LF instead of \n in the source. On non-Unix -systems, the value can be set in config.h. - -12. The limit of 200 on non-capturing parentheses is a _nesting_ limit, not an -absolute limit. Changed the text of the error message to make this clear, and -likewise updated the man page. - -13. The limit of 99 on the number of capturing subpatterns has been removed. -The new limit is 65535, which I hope will not be a "real" limit. - - -Version 3.4 22-Aug-00 ---------------------- - -1. Fixed typo in pcre.h: unsigned const char * changed to const unsigned char *. - -2. Diagnose condition (?(0) as an error instead of crashing on matching. - - -Version 3.3 01-Aug-00 ---------------------- - -1. If an octal character was given, but the value was greater than \377, it -was not getting masked to the least significant bits, as documented. This could -lead to crashes in some systems. - -2. Perl 5.6 (if not earlier versions) accepts classes like [a-\d] and treats -the hyphen as a literal. PCRE used to give an error; it now behaves like Perl. - -3. Added the functions pcre_free_substring() and pcre_free_substring_list(). -These just pass their arguments on to (pcre_free)(), but they are provided -because some uses of PCRE bind it to non-C systems that can call its functions, -but cannot call free() or pcre_free() directly. - -4. Add "make test" as a synonym for "make check". Corrected some comments in -the Makefile. - -5. Add $(DESTDIR)/ in front of all the paths in the "install" target in the -Makefile. - -6. Changed the name of pgrep to pcregrep, because Solaris has introduced a -command called pgrep for grepping around the active processes. - -7. Added the beginnings of support for UTF-8 character strings. - -8. Arranged for the Makefile to pass over the settings of CC, CFLAGS, and -RANLIB to ./ltconfig so that they are used by libtool. I think these are all -the relevant ones. (AR is not passed because ./ltconfig does its own figuring -out for the ar command.) - - -Version 3.2 12-May-00 ---------------------- - -This is purely a bug fixing release. - -1. If the pattern /((Z)+|A)*/ was matched agained ZABCDEFG it matched Z instead -of ZA. This was just one example of several cases that could provoke this bug, -which was introduced by change 9 of version 2.00. The code for breaking -infinite loops after an iteration that matches an empty string was't working -correctly. - -2. The pcretest program was not imitating Perl correctly for the pattern /a*/g -when matched against abbab (for example). After matching an empty string, it -wasn't forcing anchoring when setting PCRE_NOTEMPTY for the next attempt; this -caused it to match further down the string than it should. - -3. The code contained an inclusion of sys/types.h. It isn't clear why this -was there because it doesn't seem to be needed, and it causes trouble on some -systems, as it is not a Standard C header. It has been removed. - -4. Made 4 silly changes to the source to avoid stupid compiler warnings that -were reported on the Macintosh. The changes were from - - while ((c = *(++ptr)) != 0 && c != '\n'); -to - while ((c = *(++ptr)) != 0 && c != '\n') ; - -Totally extraordinary, but if that's what it takes... - -5. PCRE is being used in one environment where neither memmove() nor bcopy() is -available. Added HAVE_BCOPY and an autoconf test for it; if neither -HAVE_MEMMOVE nor HAVE_BCOPY is set, use a built-in emulation function which -assumes the way PCRE uses memmove() (always moving upwards). - -6. PCRE is being used in one environment where strchr() is not available. There -was only one use in pcre.c, and writing it out to avoid strchr() probably gives -faster code anyway. - - -Version 3.1 09-Feb-00 ---------------------- - -The only change in this release is the fixing of some bugs in Makefile.in for -the "install" target: - -(1) It was failing to install pcreposix.h. - -(2) It was overwriting the pcre.3 man page with the pcreposix.3 man page. - - -Version 3.0 01-Feb-00 ---------------------- - -1. Add support for the /+ modifier to perltest (to output $` like it does in -pcretest). - -2. Add support for the /g modifier to perltest. - -3. Fix pcretest so that it behaves even more like Perl for /g when the pattern -matches null strings. - -4. Fix perltest so that it doesn't do unwanted things when fed an empty -pattern. Perl treats empty patterns specially - it reuses the most recent -pattern, which is not what we want. Replace // by /(?#)/ in order to avoid this -effect. - -5. The POSIX interface was broken in that it was just handing over the POSIX -captured string vector to pcre_exec(), but (since release 2.00) PCRE has -required a bigger vector, with some working space on the end. This means that -the POSIX wrapper now has to get and free some memory, and copy the results. - -6. Added some simple autoconf support, placing the test data and the -documentation in separate directories, re-organizing some of the -information files, and making it build pcre-config (a GNU standard). Also added -libtool support for building PCRE as a shared library, which is now the -default. - -7. Got rid of the leading zero in the definition of PCRE_MINOR because 08 and -09 are not valid octal constants. Single digits will be used for minor values -less than 10. - -8. Defined REG_EXTENDED and REG_NOSUB as zero in the POSIX header, so that -existing programs that set these in the POSIX interface can use PCRE without -modification. - -9. Added a new function, pcre_fullinfo() with an extensible interface. It can -return all that pcre_info() returns, plus additional data. The pcre_info() -function is retained for compatibility, but is considered to be obsolete. - -10. Added experimental recursion feature (?R) to handle one common case that -Perl 5.6 will be able to do with (?p{...}). - -11. Added support for POSIX character classes like [:alpha:], which Perl is -adopting. - - -Version 2.08 31-Aug-99 ----------------------- - -1. When startoffset was not zero and the pattern began with ".*", PCRE was not -trying to match at the startoffset position, but instead was moving forward to -the next newline as if a previous match had failed. - -2. pcretest was not making use of PCRE_NOTEMPTY when repeating for /g and /G, -and could get into a loop if a null string was matched other than at the start -of the subject. - -3. Added definitions of PCRE_MAJOR and PCRE_MINOR to pcre.h so the version can -be distinguished at compile time, and for completeness also added PCRE_DATE. - -5. Added Paul Sokolovsky's minor changes to make it easy to compile a Win32 DLL -in GnuWin32 environments. - - -Version 2.07 29-Jul-99 ----------------------- - -1. The documentation is now supplied in plain text form and HTML as well as in -the form of man page sources. - -2. C++ compilers don't like assigning (void *) values to other pointer types. -In particular this affects malloc(). Although there is no problem in Standard -C, I've put in casts to keep C++ compilers happy. - -3. Typo on pcretest.c; a cast of (unsigned char *) in the POSIX regexec() call -should be (const char *). - -4. If NOPOSIX is defined, pcretest.c compiles without POSIX support. This may -be useful for non-Unix systems who don't want to bother with the POSIX stuff. -However, I haven't made this a standard facility. The documentation doesn't -mention it, and the Makefile doesn't support it. - -5. The Makefile now contains an "install" target, with editable destinations at -the top of the file. The pcretest program is not installed. - -6. pgrep -V now gives the PCRE version number and date. - -7. Fixed bug: a zero repetition after a literal string (e.g. /abcde{0}/) was -causing the entire string to be ignored, instead of just the last character. - -8. If a pattern like /"([^\\"]+|\\.)*"/ is applied in the normal way to a -non-matching string, it can take a very, very long time, even for strings of -quite modest length, because of the nested recursion. PCRE now does better in -some of these cases. It does this by remembering the last required literal -character in the pattern, and pre-searching the subject to ensure it is present -before running the real match. In other words, it applies a heuristic to detect -some types of certain failure quickly, and in the above example, if presented -with a string that has no trailing " it gives "no match" very quickly. - -9. A new runtime option PCRE_NOTEMPTY causes null string matches to be ignored; -other alternatives are tried instead. - - -Version 2.06 09-Jun-99 ----------------------- - -1. Change pcretest's output for amount of store used to show just the code -space, because the remainder (the data block) varies in size between 32-bit and -64-bit systems. - -2. Added an extra argument to pcre_exec() to supply an offset in the subject to -start matching at. This allows lookbehinds to work when searching for multiple -occurrences in a string. - -3. Added additional options to pcretest for testing multiple occurrences: - - /+ outputs the rest of the string that follows a match - /g loops for multiple occurrences, using the new startoffset argument - /G loops for multiple occurrences by passing an incremented pointer - -4. PCRE wasn't doing the "first character" optimization for patterns starting -with \b or \B, though it was doing it for other lookbehind assertions. That is, -it wasn't noticing that a match for a pattern such as /\bxyz/ has to start with -the letter 'x'. On long subject strings, this gives a significant speed-up. - - -Version 2.05 21-Apr-99 ----------------------- - -1. Changed the type of magic_number from int to long int so that it works -properly on 16-bit systems. - -2. Fixed a bug which caused patterns starting with .* not to work correctly -when the subject string contained newline characters. PCRE was assuming -anchoring for such patterns in all cases, which is not correct because .* will -not pass a newline unless PCRE_DOTALL is set. It now assumes anchoring only if -DOTALL is set at top level; otherwise it knows that patterns starting with .* -must be retried after every newline in the subject. - - -Version 2.04 18-Feb-99 ----------------------- - -1. For parenthesized subpatterns with repeats whose minimum was zero, the -computation of the store needed to hold the pattern was incorrect (too large). -If such patterns were nested a few deep, this could multiply and become a real -problem. - -2. Added /M option to pcretest to show the memory requirement of a specific -pattern. Made -m a synonym of -s (which does this globally) for compatibility. - -3. Subpatterns of the form (regex){n,m} (i.e. limited maximum) were being -compiled in such a way that the backtracking after subsequent failure was -pessimal. Something like (a){0,3} was compiled as (a)?(a)?(a)? instead of -((a)((a)(a)?)?)? with disastrous performance if the maximum was of any size. - - -Version 2.03 02-Feb-99 ----------------------- - -1. Fixed typo and small mistake in man page. - -2. Added 4th condition (GPL supersedes if conflict) and created separate -LICENCE file containing the conditions. - -3. Updated pcretest so that patterns such as /abc\/def/ work like they do in -Perl, that is the internal \ allows the delimiter to be included in the -pattern. Locked out the use of \ as a delimiter. If \ immediately follows -the final delimiter, add \ to the end of the pattern (to test the error). - -4. Added the convenience functions for extracting substrings after a successful -match. Updated pcretest to make it able to test these functions. - - -Version 2.02 14-Jan-99 ----------------------- - -1. Initialized the working variables associated with each extraction so that -their saving and restoring doesn't refer to uninitialized store. - -2. Put dummy code into study.c in order to trick the optimizer of the IBM C -compiler for OS/2 into generating correct code. Apparently IBM isn't going to -fix the problem. - -3. Pcretest: the timing code wasn't using LOOPREPEAT for timing execution -calls, and wasn't printing the correct value for compiling calls. Increased the -default value of LOOPREPEAT, and the number of significant figures in the -times. - -4. Changed "/bin/rm" in the Makefile to "-rm" so it works on Windows NT. - -5. Renamed "deftables" as "dftables" to get it down to 8 characters, to avoid -a building problem on Windows NT with a FAT file system. - - -Version 2.01 21-Oct-98 ----------------------- - -1. Changed the API for pcre_compile() to allow for the provision of a pointer -to character tables built by pcre_maketables() in the current locale. If NULL -is passed, the default tables are used. - - -Version 2.00 24-Sep-98 ----------------------- - -1. Since the (>?) facility is in Perl 5.005, don't require PCRE_EXTRA to enable -it any more. - -2. Allow quantification of (?>) groups, and make it work correctly. - -3. The first character computation wasn't working for (?>) groups. - -4. Correct the implementation of \Z (it is permitted to match on the \n at the -end of the subject) and add 5.005's \z, which really does match only at the -very end of the subject. - -5. Remove the \X "cut" facility; Perl doesn't have it, and (?> is neater. - -6. Remove the ability to specify CASELESS, MULTILINE, DOTALL, and -DOLLAR_END_ONLY at runtime, to make it possible to implement the Perl 5.005 -localized options. All options to pcre_study() were also removed. - -7. Add other new features from 5.005: - - $(?<= positive lookbehind - $(?a*))*/ (a PCRE_EXTRA facility). - - -Version 1.00 18-Nov-97 ----------------------- - -1. Added compile-time macros to support systems such as SunOS4 which don't have -memmove() or strerror() but have other things that can be used instead. - -2. Arranged that "make clean" removes the executables. - - -Version 0.99 27-Oct-97 ----------------------- - -1. Fixed bug in code for optimizing classes with only one character. It was -initializing a 32-byte map regardless, which could cause it to run off the end -of the memory it had got. - -2. Added, conditional on PCRE_EXTRA, the proposed (?>REGEX) construction. - - -Version 0.98 22-Oct-97 ----------------------- - -1. Fixed bug in code for handling temporary memory usage when there are more -back references than supplied space in the ovector. This could cause segfaults. - - -Version 0.97 21-Oct-97 ----------------------- - -1. Added the \X "cut" facility, conditional on PCRE_EXTRA. - -2. Optimized negated single characters not to use a bit map. - -3. Brought error texts together as macro definitions; clarified some of them; -fixed one that was wrong - it said "range out of order" when it meant "invalid -escape sequence". - -4. Changed some char * arguments to const char *. - -5. Added PCRE_NOTBOL and PCRE_NOTEOL (from POSIX). - -6. Added the POSIX-style API wrapper in pcreposix.a and testing facilities in -pcretest. - - -Version 0.96 16-Oct-97 ----------------------- - -1. Added a simple "pgrep" utility to the distribution. - -2. Fixed an incompatibility with Perl: "{" is now treated as a normal character -unless it appears in one of the precise forms "{ddd}", "{ddd,}", or "{ddd,ddd}" -where "ddd" means "one or more decimal digits". - -3. Fixed serious bug. If a pattern had a back reference, but the call to -pcre_exec() didn't supply a large enough ovector to record the related -identifying subpattern, the match always failed. PCRE now remembers the number -of the largest back reference, and gets some temporary memory in which to save -the offsets during matching if necessary, in order to ensure that -backreferences always work. - -4. Increased the compatibility with Perl in a number of ways: - - (a) . no longer matches \n by default; an option PCRE_DOTALL is provided - to request this handling. The option can be set at compile or exec time. - - (b) $ matches before a terminating newline by default; an option - PCRE_DOLLAR_ENDONLY is provided to override this (but not in multiline - mode). The option can be set at compile or exec time. - - (c) The handling of \ followed by a digit other than 0 is now supposed to be - the same as Perl's. If the decimal number it represents is less than 10 - or there aren't that many previous left capturing parentheses, an octal - escape is read. Inside a character class, it's always an octal escape, - even if it is a single digit. - - (d) An escaped but undefined alphabetic character is taken as a literal, - unless PCRE_EXTRA is set. Currently this just reserves the remaining - escapes. - - (e) {0} is now permitted. (The previous item is removed from the compiled - pattern). - -5. Changed all the names of code files so that the basic parts are no longer -than 10 characters, and abolished the teeny "globals.c" file. - -6. Changed the handling of character classes; they are now done with a 32-byte -bit map always. - -7. Added the -d and /D options to pcretest to make it possible to look at the -internals of compilation without having to recompile pcre. - - -Version 0.95 23-Sep-97 ----------------------- - -1. Fixed bug in pre-pass concerning escaped "normal" characters such as \x5c or -\x20 at the start of a run of normal characters. These were being treated as -real characters, instead of the source characters being re-checked. - - -Version 0.94 18-Sep-97 ----------------------- - -1. The functions are now thread-safe, with the caveat that the global variables -containing pointers to malloc() and free() or alternative functions are the -same for all threads. - -2. Get pcre_study() to generate a bitmap of initial characters for non- -anchored patterns when this is possible, and use it if passed to pcre_exec(). - - -Version 0.93 15-Sep-97 ----------------------- - -1. /(b)|(:+)/ was computing an incorrect first character. - -2. Add pcre_study() to the API and the passing of pcre_extra to pcre_exec(), -but not actually doing anything yet. - -3. Treat "-" characters in classes that cannot be part of ranges as literals, -as Perl does (e.g. [-az] or [az-]). - -4. Set the anchored flag if a branch starts with .* or .*? because that tests -all possible positions. - -5. Split up into different modules to avoid including unneeded functions in a -compiled binary. However, compile and exec are still in one module. The "study" -function is split off. - -6. The character tables are now in a separate module whose source is generated -by an auxiliary program - but can then be edited by hand if required. There are -now no calls to isalnum(), isspace(), isdigit(), isxdigit(), tolower() or -toupper() in the code. - -7. Turn the malloc/free funtions variables into pcre_malloc and pcre_free and -make them global. Abolish the function for setting them, as the caller can now -set them directly. - - -Version 0.92 11-Sep-97 ----------------------- - -1. A repeat with a fixed maximum and a minimum of 1 for an ordinary character -(e.g. /a{1,3}/) was broken (I mis-optimized it). - -2. Caseless matching was not working in character classes if the characters in -the pattern were in upper case. - -3. Make ranges like [W-c] work in the same way as Perl for caseless matching. - -4. Make PCRE_ANCHORED public and accept as a compile option. - -5. Add an options word to pcre_exec() and accept PCRE_ANCHORED and -PCRE_CASELESS at run time. Add escapes \A and \I to pcretest to cause it to -pass them. - -6. Give an error if bad option bits passed at compile or run time. - -7. Add PCRE_MULTILINE at compile and exec time, and (?m) as well. Add \M to -pcretest to cause it to pass that flag. - -8. Add pcre_info(), to get the number of identifying subpatterns, the stored -options, and the first character, if set. - -9. Recognize C+ or C{n,m} where n >= 1 as providing a fixed starting character. - - -Version 0.91 10-Sep-97 ----------------------- - -1. PCRE was failing to diagnose unlimited repeats of subpatterns that could -match the empty string as in /(a*)*/. It was looping and ultimately crashing. - -2. PCRE was looping on encountering an indefinitely repeated back reference to -a subpattern that had matched an empty string, e.g. /(a|)\1*/. It now does what -Perl does - treats the match as successful. - -**** diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/LICENCE b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/LICENCE deleted file mode 100644 index dd9071a8..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/LICENCE +++ /dev/null @@ -1,93 +0,0 @@ -PCRE LICENCE ------------- - -PCRE is a library of functions to support regular expressions whose syntax -and semantics are as close as possible to those of the Perl 5 language. - -Release 8 of PCRE is distributed under the terms of the "BSD" licence, as -specified below. The documentation for PCRE, supplied in the "doc" -directory, is distributed under the same terms as the software itself. The data -in the testdata directory is not copyrighted and is in the public domain. - -The basic library functions are written in C and are freestanding. Also -included in the distribution is a set of C++ wrapper functions, and a -just-in-time compiler that can be used to optimize pattern matching. These -are both optional features that can be omitted when the library is built. - - -THE BASIC LIBRARY FUNCTIONS ---------------------------- - -Written by: Philip Hazel -Email local part: ph10 -Email domain: cam.ac.uk - -University of Cambridge Computing Service, -Cambridge, England. - -Copyright (c) 1997-2017 University of Cambridge -All rights reserved. - - -PCRE JUST-IN-TIME COMPILATION SUPPORT -------------------------------------- - -Written by: Zoltan Herczeg -Email local part: hzmester -Emain domain: freemail.hu - -Copyright(c) 2010-2017 Zoltan Herczeg -All rights reserved. - - -STACK-LESS JUST-IN-TIME COMPILER --------------------------------- - -Written by: Zoltan Herczeg -Email local part: hzmester -Emain domain: freemail.hu - -Copyright(c) 2009-2017 Zoltan Herczeg -All rights reserved. - - -THE C++ WRAPPER FUNCTIONS -------------------------- - -Contributed by: Google Inc. - -Copyright (c) 2007-2012, Google Inc. -All rights reserved. - - -THE "BSD" LICENCE ------------------ - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - - * Neither the name of the University of Cambridge nor the name of Google - Inc. nor the names of their contributors may be used to endorse or - promote products derived from this software without specific prior - written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. - -End diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/NEWS b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/NEWS deleted file mode 100644 index 36be07cb..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/NEWS +++ /dev/null @@ -1,737 +0,0 @@ -News about PCRE releases ------------------------- - -Release 8.41 13-June-2017 -------------------------- - -This is a bug-fix release. - - -Release 8.40 11-January-2017 ----------------------------- - -This is a bug-fix release. - - -Release 8.39 14-June-2016 -------------------------- - -Some appropriate PCRE2 JIT improvements have been retro-fitted to PCRE1. Apart -from that, this is another bug-fix release. Note that this library (now called -PCRE1) is now being maintained for bug fixes only. New projects are advised to -use the new PCRE2 libraries. - - -Release 8.38 23-November-2015 ------------------------------ - -This is bug-fix release. Note that this library (now called PCRE1) is now being -maintained for bug fixes only. New projects are advised to use the new PCRE2 -libraries. - - -Release 8.37 28-April-2015 --------------------------- - -This is bug-fix release. Note that this library (now called PCRE1) is now being -maintained for bug fixes only. New projects are advised to use the new PCRE2 -libraries. - - -Release 8.36 26-September-2014 ------------------------------- - -This is primarily a bug-fix release. However, in addition, the Unicode data -tables have been updated to Unicode 7.0.0. - - -Release 8.35 04-April-2014 --------------------------- - -There have been performance improvements for classes containing non-ASCII -characters and the "auto-possessification" feature has been extended. Other -minor improvements have been implemented and bugs fixed. There is a new callout -feature to enable applications to do detailed stack checks at compile time, to -avoid running out of stack for deeply nested parentheses. The JIT compiler has -been extended with experimental support for ARM-64, MIPS-64, and PPC-LE. - - -Release 8.34 15-December-2013 ------------------------------ - -As well as fixing the inevitable bugs, performance has been improved by -refactoring and extending the amount of "auto-possessification" that PCRE does. -Other notable changes: - -. Implemented PCRE_INFO_MATCH_EMPTY, which yields 1 if the pattern can match - an empty string. If it can, pcretest shows this in its information output. - -. A back reference to a named subpattern when there is more than one of the - same name now checks them in the order in which they appear in the pattern. - The first one that is set is used for the reference. Previously only the - first one was inspected. This change makes PCRE more compatible with Perl. - -. Unicode character properties were updated from Unicode 6.3.0. - -. The character VT has been added to the set of characters that match \s and - are generally treated as white space, following this same change in Perl - 5.18. There is now no difference between "Perl space" and "POSIX space". - -. Perl has changed its handling of \8 and \9. If there is no previously - encountered capturing group of those numbers, they are treated as the - literal characters 8 and 9 instead of a binary zero followed by the - literals. PCRE now does the same. - -. Following Perl, added \o{} to specify codepoints in octal, making it - possible to specify values greater than 0777 and also making them - unambiguous. - -. In UCP mode, \s was not matching two of the characters that Perl matches, - namely NEL (U+0085) and MONGOLIAN VOWEL SEPARATOR (U+180E), though they - were matched by \h. - -. Add JIT support for the 64 bit TileGX architecture. - -. Upgraded the handling of the POSIX classes [:graph:], [:print:], and - [:punct:] when PCRE_UCP is set so as to include the same characters as Perl - does in Unicode mode. - -. Perl no longer allows group names to start with digits, so I have made this - change also in PCRE. - -. Added support for [[:<:]] and [[:>:]] as used in the BSD POSIX library to - mean "start of word" and "end of word", respectively, as a transition aid. - - -Release 8.33 28-May-2013 --------------------------- - -A number of bugs are fixed, and some performance improvements have been made. -There are also some new features, of which these are the most important: - -. The behaviour of the backtracking verbs has been rationalized and - documented in more detail. - -. JIT now supports callouts and all of the backtracking verbs. - -. Unicode validation has been updated in the light of Unicode Corrigendum #9, - which points out that "non characters" are not "characters that may not - appear in Unicode strings" but rather "characters that are reserved for - internal use and have only local meaning". - -. (*LIMIT_MATCH=d) and (*LIMIT_RECURSION=d) have been added so that the - creator of a pattern can specify lower (but not higher) limits for the - matching process. - -. The PCRE_NEVER_UTF option is available to prevent pattern-writers from using - the (*UTF) feature, as this could be a security issue. - - -Release 8.32 30-November-2012 ------------------------------ - -This release fixes a number of bugs, but also has some new features. These are -the highlights: - -. There is now support for 32-bit character strings and UTF-32. Like the - 16-bit support, this is done by compiling a separate 32-bit library. - -. \X now matches a Unicode extended grapheme cluster. - -. Case-independent matching of Unicode characters that have more than one - "other case" now makes all three (or more) characters equivalent. This - applies, for example, to Greek Sigma, which has two lowercase versions. - -. Unicode character properties are updated to Unicode 6.2.0. - -. The EBCDIC support, which had decayed, has had a spring clean. - -. A number of JIT optimizations have been added, which give faster JIT - execution speed. In addition, a new direct interface to JIT execution is - available. This bypasses some of the sanity checks of pcre_exec() to give a - noticeable speed-up. - -. A number of issues in pcregrep have been fixed, making it more compatible - with GNU grep. In particular, --exclude and --include (and variants) apply - to all files now, not just those obtained from scanning a directory - recursively. In Windows environments, the default action for directories is - now "skip" instead of "read" (which provokes an error). - -. If the --only-matching (-o) option in pcregrep is specified multiple - times, each one causes appropriate output. For example, -o1 -o2 outputs the - substrings matched by the 1st and 2nd capturing parentheses. A separating - string can be specified by --om-separator (default empty). - -. When PCRE is built via Autotools using a version of gcc that has the - "visibility" feature, it is used to hide internal library functions that are - not part of the public API. - - -Release 8.31 06-July-2012 -------------------------- - -This is mainly a bug-fixing release, with a small number of developments: - -. The JIT compiler now supports partial matching and the (*MARK) and - (*COMMIT) verbs. - -. PCRE_INFO_MAXLOOKBEHIND can be used to find the longest lookbehind in a - pattern. - -. There should be a performance improvement when using the heap instead of the - stack for recursion. - -. pcregrep can now be linked with libedit as an alternative to libreadline. - -. pcregrep now has a --file-list option where the list of files to scan is - given as a file. - -. pcregrep now recognizes binary files and there are related options. - -. The Unicode tables have been updated to 6.1.0. - -As always, the full list of changes is in the ChangeLog file. - - -Release 8.30 04-February-2012 ------------------------------ - -Release 8.30 introduces a major new feature: support for 16-bit character -strings, compiled as a separate library. There are a few changes to the -8-bit library, in addition to some bug fixes. - -. The pcre_info() function, which has been obsolete for over 10 years, has - been removed. - -. When a compiled pattern was saved to a file and later reloaded on a host - with different endianness, PCRE used automatically to swap the bytes in some - of the data fields. With the advent of the 16-bit library, where more of this - swapping is needed, it is no longer done automatically. Instead, the bad - endianness is detected and a specific error is given. The user can then call - a new function called pcre_pattern_to_host_byte_order() (or an equivalent - 16-bit function) to do the swap. - -. In UTF-8 mode, the values 0xd800 to 0xdfff are not legal Unicode - code points and are now faulted. (They are the so-called "surrogates" - that are reserved for coding high values in UTF-16.) - - -Release 8.21 12-Dec-2011 ------------------------- - -This is almost entirely a bug-fix release. The only new feature is the ability -to obtain the size of the memory used by the JIT compiler. - - -Release 8.20 21-Oct-2011 ------------------------- - -The main change in this release is the inclusion of Zoltan Herczeg's -just-in-time compiler support, which can be accessed by building PCRE with ---enable-jit. Large performance benefits can be had in many situations. 8.20 -also fixes an unfortunate bug that was introduced in 8.13 as well as tidying up -a number of infelicities and differences from Perl. - - -Release 8.13 16-Aug-2011 ------------------------- - -This is mainly a bug-fix release. There has been a lot of internal refactoring. -The Unicode tables have been updated. The only new feature in the library is -the passing of *MARK information to callouts. Some additions have been made to -pcretest to make testing easier and more comprehensive. There is a new option -for pcregrep to adjust its internal buffer size. - - -Release 8.12 15-Jan-2011 ------------------------- - -This release fixes some bugs in pcregrep, one of which caused the tests to fail -on 64-bit big-endian systems. There are no changes to the code of the library. - - -Release 8.11 10-Dec-2010 ------------------------- - -A number of bugs in the library and in pcregrep have been fixed. As always, see -ChangeLog for details. The following are the non-bug-fix changes: - -. Added --match-limit and --recursion-limit to pcregrep. - -. Added an optional parentheses number to the -o and --only-matching options - of pcregrep. - -. Changed the way PCRE_PARTIAL_HARD affects the matching of $, \z, \Z, \b, and - \B. - -. Added PCRE_ERROR_SHORTUTF8 to make it possible to distinguish between a - bad UTF-8 sequence and one that is incomplete when using PCRE_PARTIAL_HARD. - -. Recognize (*NO_START_OPT) at the start of a pattern to set the PCRE_NO_ - START_OPTIMIZE option, which is now allowed at compile time - - -Release 8.10 25-Jun-2010 ------------------------- - -There are two major additions: support for (*MARK) and friends, and the option -PCRE_UCP, which changes the behaviour of \b, \d, \s, and \w (and their -opposites) so that they make use of Unicode properties. There are also a number -of lesser new features, and several bugs have been fixed. A new option, ---line-buffered, has been added to pcregrep, for use when it is connected to -pipes. - - -Release 8.02 19-Mar-2010 ------------------------- - -Another bug-fix release. - - -Release 8.01 19-Jan-2010 ------------------------- - -This is a bug-fix release. Several bugs in the code itself and some bugs and -infelicities in the build system have been fixed. - - -Release 8.00 19-Oct-09 ----------------------- - -Bugs have been fixed in the library and in pcregrep. There are also some -enhancements. Restrictions on patterns used for partial matching have been -removed, extra information is given for partial matches, the partial matching -process has been improved, and an option to make a partial match override a -full match is available. The "study" process has been enhanced by finding a -lower bound matching length. Groups with duplicate numbers may now have -duplicated names without the use of PCRE_DUPNAMES. However, they may not have -different names. The documentation has been revised to reflect these changes. -The version number has been expanded to 3 digits as it is clear that the rate -of change is not slowing down. - - -Release 7.9 11-Apr-09 ---------------------- - -Mostly bugfixes and tidies with just a couple of minor functional additions. - - -Release 7.8 05-Sep-08 ---------------------- - -More bug fixes, plus a performance improvement in Unicode character property -lookup. - - -Release 7.7 07-May-08 ---------------------- - -This is once again mainly a bug-fix release, but there are a couple of new -features. - - -Release 7.6 28-Jan-08 ---------------------- - -The main reason for having this release so soon after 7.5 is because it fixes a -potential buffer overflow problem in pcre_compile() when run in UTF-8 mode. In -addition, the CMake configuration files have been brought up to date. - - -Release 7.5 10-Jan-08 ---------------------- - -This is mainly a bug-fix release. However the ability to link pcregrep with -libz or libbz2 and the ability to link pcretest with libreadline have been -added. Also the --line-offsets and --file-offsets options were added to -pcregrep. - - -Release 7.4 21-Sep-07 ---------------------- - -The only change of specification is the addition of options to control whether -\R matches any Unicode line ending (the default) or just CR, LF, and CRLF. -Otherwise, the changes are bug fixes and a refactoring to reduce the number of -relocations needed in a shared library. There have also been some documentation -updates, in particular, some more information about using CMake to build PCRE -has been added to the NON-UNIX-USE file. - - -Release 7.3 28-Aug-07 ---------------------- - -Most changes are bug fixes. Some that are not: - -1. There is some support for Perl 5.10's experimental "backtracking control - verbs" such as (*PRUNE). - -2. UTF-8 checking is now as per RFC 3629 instead of RFC 2279; this is more - restrictive in the strings it accepts. - -3. Checking for potential integer overflow has been made more dynamic, and as a - consequence there is no longer a hard limit on the size of a subpattern that - has a limited repeat count. - -4. When CRLF is a valid line-ending sequence, pcre_exec() and pcre_dfa_exec() - no longer advance by two characters instead of one when an unanchored match - fails at CRLF if there are explicit CR or LF matches within the pattern. - This gets rid of some anomalous effects that previously occurred. - -5. Some PCRE-specific settings for varying the newline options at the start of - a pattern have been added. - - -Release 7.2 19-Jun-07 ---------------------- - -WARNING: saved patterns that were compiled by earlier versions of PCRE must be -recompiled for use with 7.2 (necessitated by the addition of \K, \h, \H, \v, -and \V). - -Correction to the notes for 7.1: the note about shared libraries for Windows is -wrong. Previously, three libraries were built, but each could function -independently. For example, the pcreposix library also included all the -functions from the basic pcre library. The change is that the three libraries -are no longer independent. They are like the Unix libraries. To use the -pcreposix functions, for example, you need to link with both the pcreposix and -the basic pcre library. - -Some more features from Perl 5.10 have been added: - - (?-n) and (?+n) relative references for recursion and subroutines. - - (?(-n) and (?(+n) relative references as conditions. - - \k{name} and \g{name} are synonyms for \k. - - \K to reset the start of the matched string; for example, (foo)\Kbar - matches bar preceded by foo, but only sets bar as the matched string. - - (?| introduces a group where the capturing parentheses in each alternative - start from the same number; for example, (?|(abc)|(xyz)) sets capturing - parentheses number 1 in both cases. - - \h, \H, \v, \V match horizontal and vertical whitespace, respectively. - - -Release 7.1 24-Apr-07 ---------------------- - -There is only one new feature in this release: a linebreak setting of -PCRE_NEWLINE_ANYCRLF. It is a cut-down version of PCRE_NEWLINE_ANY, which -recognizes only CRLF, CR, and LF as linebreaks. - -A few bugs are fixed (see ChangeLog for details), but the major change is a -complete re-implementation of the build system. This now has full Autotools -support and so is now "standard" in some sense. It should help with compiling -PCRE in a wide variety of environments. - -NOTE: when building shared libraries for Windows, three dlls are now built, -called libpcre, libpcreposix, and libpcrecpp. Previously, everything was -included in a single dll. - -Another important change is that the dftables auxiliary program is no longer -compiled and run at "make" time by default. Instead, a default set of character -tables (assuming ASCII coding) is used. If you want to use dftables to generate -the character tables as previously, add --enable-rebuild-chartables to the -"configure" command. You must do this if you are compiling PCRE to run on a -system that uses EBCDIC code. - -There is a discussion about character tables in the README file. The default is -not to use dftables so that that there is no problem when cross-compiling. - - -Release 7.0 19-Dec-06 ---------------------- - -This release has a new major number because there have been some internal -upheavals to facilitate the addition of new optimizations and other facilities, -and to make subsequent maintenance and extension easier. Compilation is likely -to be a bit slower, but there should be no major effect on runtime performance. -Previously compiled patterns are NOT upwards compatible with this release. If -you have saved compiled patterns from a previous release, you will have to -re-compile them. Important changes that are visible to users are: - -1. The Unicode property tables have been updated to Unicode 5.0.0, which adds - some more scripts. - -2. The option PCRE_NEWLINE_ANY causes PCRE to recognize any Unicode newline - sequence as a newline. - -3. The \R escape matches a single Unicode newline sequence as a single unit. - -4. New features that will appear in Perl 5.10 are now in PCRE. These include - alternative Perl syntax for named parentheses, and Perl syntax for - recursion. - -5. The C++ wrapper interface has been extended by the addition of a - QuoteMeta function and the ability to allow copy construction and - assignment. - -For a complete list of changes, see the ChangeLog file. - - -Release 6.7 04-Jul-06 ---------------------- - -The main additions to this release are the ability to use the same name for -multiple sets of parentheses, and support for CRLF line endings in both the -library and pcregrep (and in pcretest for testing). - -Thanks to Ian Taylor, the stack usage for many kinds of pattern has been -significantly reduced for certain subject strings. - - -Release 6.5 01-Feb-06 ---------------------- - -Important changes in this release: - -1. A number of new features have been added to pcregrep. - -2. The Unicode property tables have been updated to Unicode 4.1.0, and the - supported properties have been extended with script names such as "Arabic", - and the derived properties "Any" and "L&". This has necessitated a change to - the interal format of compiled patterns. Any saved compiled patterns that - use \p or \P must be recompiled. - -3. The specification of recursion in patterns has been changed so that all - recursive subpatterns are automatically treated as atomic groups. Thus, for - example, (?R) is treated as if it were (?>(?R)). This is necessary because - otherwise there are situations where recursion does not work. - -See the ChangeLog for a complete list of changes, which include a number of bug -fixes and tidies. - - -Release 6.0 07-Jun-05 ---------------------- - -The release number has been increased to 6.0 because of the addition of several -major new pieces of functionality. - -A new function, pcre_dfa_exec(), which implements pattern matching using a DFA -algorithm, has been added. This has a number of advantages for certain cases, -though it does run more slowly, and lacks the ability to capture substrings. On -the other hand, it does find all matches, not just the first, and it works -better for partial matching. The pcrematching man page discusses the -differences. - -The pcretest program has been enhanced so that it can make use of the new -pcre_dfa_exec() matching function and the extra features it provides. - -The distribution now includes a C++ wrapper library. This is built -automatically if a C++ compiler is found. The pcrecpp man page discusses this -interface. - -The code itself has been re-organized into many more files, one for each -function, so it no longer requires everything to be linked in when static -linkage is used. As a consequence, some internal functions have had to have -their names exposed. These functions all have names starting with _pcre_. They -are undocumented, and are not intended for use by outside callers. - -The pcregrep program has been enhanced with new functionality such as -multiline-matching and options for output more matching context. See the -ChangeLog for a complete list of changes to the library and the utility -programs. - - -Release 5.0 13-Sep-04 ---------------------- - -The licence under which PCRE is released has been changed to the more -conventional "BSD" licence. - -In the code, some bugs have been fixed, and there are also some major changes -in this release (which is why I've increased the number to 5.0). Some changes -are internal rearrangements, and some provide a number of new facilities. The -new features are: - -1. There's an "automatic callout" feature that inserts callouts before every - item in the regex, and there's a new callout field that gives the position - in the pattern - useful for debugging and tracing. - -2. The extra_data structure can now be used to pass in a set of character - tables at exec time. This is useful if compiled regex are saved and re-used - at a later time when the tables may not be at the same address. If the - default internal tables are used, the pointer saved with the compiled - pattern is now set to NULL, which means that you don't need to do anything - special unless you are using custom tables. - -3. It is possible, with some restrictions on the content of the regex, to - request "partial" matching. A special return code is given if all of the - subject string matched part of the regex. This could be useful for testing - an input field as it is being typed. - -4. There is now some optional support for Unicode character properties, which - means that the patterns items such as \p{Lu} and \X can now be used. Only - the general category properties are supported. If PCRE is compiled with this - support, an additional 90K data structure is include, which increases the - size of the library dramatically. - -5. There is support for saving compiled patterns and re-using them later. - -6. There is support for running regular expressions that were compiled on a - different host with the opposite endianness. - -7. The pcretest program has been extended to accommodate the new features. - -The main internal rearrangement is that sequences of literal characters are no -longer handled as strings. Instead, each character is handled on its own. This -makes some UTF-8 handling easier, and makes the support of partial matching -possible. Compiled patterns containing long literal strings will be larger as a -result of this change; I hope that performance will not be much affected. - - -Release 4.5 01-Dec-03 ---------------------- - -Again mainly a bug-fix and tidying release, with only a couple of new features: - -1. It's possible now to compile PCRE so that it does not use recursive -function calls when matching. Instead it gets memory from the heap. This slows -things down, but may be necessary on systems with limited stacks. - -2. UTF-8 string checking has been tightened to reject overlong sequences and to -check that a starting offset points to the start of a character. Failure of the -latter returns a new error code: PCRE_ERROR_BADUTF8_OFFSET. - -3. PCRE can now be compiled for systems that use EBCDIC code. - - -Release 4.4 21-Aug-03 ---------------------- - -This is mainly a bug-fix and tidying release. The only new feature is that PCRE -checks UTF-8 strings for validity by default. There is an option to suppress -this, just in case anybody wants that teeny extra bit of performance. - - -Releases 4.1 - 4.3 ------------------- - -Sorry, I forgot about updating the NEWS file for these releases. Please take a -look at ChangeLog. - - -Release 4.0 17-Feb-03 ---------------------- - -There have been a lot of changes for the 4.0 release, adding additional -functionality and mending bugs. Below is a list of the highlights of the new -functionality. For full details of these features, please consult the -documentation. For a complete list of changes, see the ChangeLog file. - -1. Support for Perl's \Q...\E escapes. - -2. "Possessive quantifiers" ?+, *+, ++, and {,}+ which come from Sun's Java -package. They provide some syntactic sugar for simple cases of "atomic -grouping". - -3. Support for the \G assertion. It is true when the current matching position -is at the start point of the match. - -4. A new feature that provides some of the functionality that Perl provides -with (?{...}). The facility is termed a "callout". The way it is done in PCRE -is for the caller to provide an optional function, by setting pcre_callout to -its entry point. To get the function called, the regex must include (?C) at -appropriate points. - -5. Support for recursive calls to individual subpatterns. This makes it really -easy to get totally confused. - -6. Support for named subpatterns. The Python syntax (?P...) is used to -name a group. - -7. Several extensions to UTF-8 support; it is now fairly complete. There is an -option for pcregrep to make it operate in UTF-8 mode. - -8. The single man page has been split into a number of separate man pages. -These also give rise to individual HTML pages which are put in a separate -directory. There is an index.html page that lists them all. Some hyperlinking -between the pages has been installed. - - -Release 3.5 15-Aug-01 ---------------------- - -1. The configuring system has been upgraded to use later versions of autoconf -and libtool. By default it builds both a shared and a static library if the OS -supports it. You can use --disable-shared or --disable-static on the configure -command if you want only one of them. - -2. The pcretest utility is now installed along with pcregrep because it is -useful for users (to test regexs) and by doing this, it automatically gets -relinked by libtool. The documentation has been turned into a man page, so -there are now .1, .txt, and .html versions in /doc. - -3. Upgrades to pcregrep: - (i) Added long-form option names like gnu grep. - (ii) Added --help to list all options with an explanatory phrase. - (iii) Added -r, --recursive to recurse into sub-directories. - (iv) Added -f, --file to read patterns from a file. - -4. Added --enable-newline-is-cr and --enable-newline-is-lf to the configure -script, to force use of CR or LF instead of \n in the source. On non-Unix -systems, the value can be set in config.h. - -5. The limit of 200 on non-capturing parentheses is a _nesting_ limit, not an -absolute limit. Changed the text of the error message to make this clear, and -likewise updated the man page. - -6. The limit of 99 on the number of capturing subpatterns has been removed. -The new limit is 65535, which I hope will not be a "real" limit. - - -Release 3.3 01-Aug-00 ---------------------- - -There is some support for UTF-8 character strings. This is incomplete and -experimental. The documentation describes what is and what is not implemented. -Otherwise, this is just a bug-fixing release. - - -Release 3.0 01-Feb-00 ---------------------- - -1. A "configure" script is now used to configure PCRE for Unix systems. It -builds a Makefile, a config.h file, and the pcre-config script. - -2. PCRE is built as a shared library by default. - -3. There is support for POSIX classes such as [:alpha:]. - -5. There is an experimental recursion feature. - ----------------------------------------------------------------------------- - IMPORTANT FOR THOSE UPGRADING FROM VERSIONS BEFORE 2.00 - -Please note that there has been a change in the API such that a larger -ovector is required at matching time, to provide some additional workspace. -The new man page has details. This change was necessary in order to support -some of the new functionality in Perl 5.005. - - IMPORTANT FOR THOSE UPGRADING FROM VERSION 2.00 - -Another (I hope this is the last!) change has been made to the API for the -pcre_compile() function. An additional argument has been added to make it -possible to pass over a pointer to character tables built in the current -locale by pcre_maketables(). To use the default tables, this new argument -should be passed as NULL. - - IMPORTANT FOR THOSE UPGRADING FROM VERSION 2.05 - -Yet another (and again I hope this really is the last) change has been made -to the API for the pcre_exec() function. An additional argument has been -added to make it possible to start the match other than at the start of the -subject string. This is important if there are lookbehinds. The new man -page has the details, but you just want to convert existing programs, all -you need to do is to stick in a new fifth argument to pcre_exec(), with a -value of zero. For example, change - - pcre_exec(pattern, extra, subject, length, options, ovec, ovecsize) -to - pcre_exec(pattern, extra, subject, length, 0, options, ovec, ovecsize) - -**** diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/README b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/README deleted file mode 100644 index 4887ebf3..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/README +++ /dev/null @@ -1,1002 +0,0 @@ -README file for PCRE (Perl-compatible regular expression library) ------------------------------------------------------------------ - -NOTE: This set of files relates to PCRE releases that use the original API, -with library names libpcre, libpcre16, and libpcre32. January 2015 saw the -first release of a new API, known as PCRE2, with release numbers starting at -10.00 and library names libpcre2-8, libpcre2-16, and libpcre2-32. The old -libraries (now called PCRE1) are still being maintained for bug fixes, but -there will be no new development. New projects are advised to use the new PCRE2 -libraries. - - -The latest release of PCRE1 is always available in three alternative formats -from: - - ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-xxx.tar.gz - ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-xxx.tar.bz2 - ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-xxx.zip - -There is a mailing list for discussion about the development of PCRE at -pcre-dev@exim.org. You can access the archives and subscribe or manage your -subscription here: - - https://lists.exim.org/mailman/listinfo/pcre-dev - -Please read the NEWS file if you are upgrading from a previous release. -The contents of this README file are: - - The PCRE APIs - Documentation for PCRE - Contributions by users of PCRE - Building PCRE on non-Unix-like systems - Building PCRE without using autotools - Building PCRE using autotools - Retrieving configuration information - Shared libraries - Cross-compiling using autotools - Using HP's ANSI C++ compiler (aCC) - Compiling in Tru64 using native compilers - Using Sun's compilers for Solaris - Using PCRE from MySQL - Making new tarballs - Testing PCRE - Character tables - File manifest - - -The PCRE APIs -------------- - -PCRE is written in C, and it has its own API. There are three sets of -functions, one for the 8-bit library, which processes strings of bytes, one for -the 16-bit library, which processes strings of 16-bit values, and one for the -32-bit library, which processes strings of 32-bit values. The distribution also -includes a set of C++ wrapper functions (see the pcrecpp man page for details), -courtesy of Google Inc., which can be used to call the 8-bit PCRE library from -C++. Other C++ wrappers have been created from time to time. See, for example: -https://github.com/YasserAsmi/regexp, which aims to be simple and similar in -style to the C API. - -The distribution also contains a set of C wrapper functions (again, just for -the 8-bit library) that are based on the POSIX regular expression API (see the -pcreposix man page). These end up in the library called libpcreposix. Note that -this just provides a POSIX calling interface to PCRE; the regular expressions -themselves still follow Perl syntax and semantics. The POSIX API is restricted, -and does not give full access to all of PCRE's facilities. - -The header file for the POSIX-style functions is called pcreposix.h. The -official POSIX name is regex.h, but I did not want to risk possible problems -with existing files of that name by distributing it that way. To use PCRE with -an existing program that uses the POSIX API, pcreposix.h will have to be -renamed or pointed at by a link. - -If you are using the POSIX interface to PCRE and there is already a POSIX regex -library installed on your system, as well as worrying about the regex.h header -file (as mentioned above), you must also take care when linking programs to -ensure that they link with PCRE's libpcreposix library. Otherwise they may pick -up the POSIX functions of the same name from the other library. - -One way of avoiding this confusion is to compile PCRE with the addition of --Dregcomp=PCREregcomp (and similarly for the other POSIX functions) to the -compiler flags (CFLAGS if you are using "configure" -- see below). This has the -effect of renaming the functions so that the names no longer clash. Of course, -you have to do the same thing for your applications, or write them using the -new names. - - -Documentation for PCRE ----------------------- - -If you install PCRE in the normal way on a Unix-like system, you will end up -with a set of man pages whose names all start with "pcre". The one that is just -called "pcre" lists all the others. In addition to these man pages, the PCRE -documentation is supplied in two other forms: - - 1. There are files called doc/pcre.txt, doc/pcregrep.txt, and - doc/pcretest.txt in the source distribution. The first of these is a - concatenation of the text forms of all the section 3 man pages except - the listing of pcredemo.c and those that summarize individual functions. - The other two are the text forms of the section 1 man pages for the - pcregrep and pcretest commands. These text forms are provided for ease of - scanning with text editors or similar tools. They are installed in - /share/doc/pcre, where is the installation prefix - (defaulting to /usr/local). - - 2. A set of files containing all the documentation in HTML form, hyperlinked - in various ways, and rooted in a file called index.html, is distributed in - doc/html and installed in /share/doc/pcre/html. - -Users of PCRE have contributed files containing the documentation for various -releases in CHM format. These can be found in the Contrib directory of the FTP -site (see next section). - - -Contributions by users of PCRE ------------------------------- - -You can find contributions from PCRE users in the directory - - ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/Contrib - -There is a README file giving brief descriptions of what they are. Some are -complete in themselves; others are pointers to URLs containing relevant files. -Some of this material is likely to be well out-of-date. Several of the earlier -contributions provided support for compiling PCRE on various flavours of -Windows (I myself do not use Windows). Nowadays there is more Windows support -in the standard distribution, so these contibutions have been archived. - -A PCRE user maintains downloadable Windows binaries of the pcregrep and -pcretest programs here: - - http://www.rexegg.com/pcregrep-pcretest.html - - -Building PCRE on non-Unix-like systems --------------------------------------- - -For a non-Unix-like system, please read the comments in the file -NON-AUTOTOOLS-BUILD, though if your system supports the use of "configure" and -"make" you may be able to build PCRE using autotools in the same way as for -many Unix-like systems. - -PCRE can also be configured using the GUI facility provided by CMake's -cmake-gui command. This creates Makefiles, solution files, etc. The file -NON-AUTOTOOLS-BUILD has information about CMake. - -PCRE has been compiled on many different operating systems. It should be -straightforward to build PCRE on any system that has a Standard C compiler and -library, because it uses only Standard C functions. - - -Building PCRE without using autotools -------------------------------------- - -The use of autotools (in particular, libtool) is problematic in some -environments, even some that are Unix or Unix-like. See the NON-AUTOTOOLS-BUILD -file for ways of building PCRE without using autotools. - - -Building PCRE using autotools ------------------------------ - -If you are using HP's ANSI C++ compiler (aCC), please see the special note -in the section entitled "Using HP's ANSI C++ compiler (aCC)" below. - -The following instructions assume the use of the widely used "configure; make; -make install" (autotools) process. - -To build PCRE on system that supports autotools, first run the "configure" -command from the PCRE distribution directory, with your current directory set -to the directory where you want the files to be created. This command is a -standard GNU "autoconf" configuration script, for which generic instructions -are supplied in the file INSTALL. - -Most commonly, people build PCRE within its own distribution directory, and in -this case, on many systems, just running "./configure" is sufficient. However, -the usual methods of changing standard defaults are available. For example: - -CFLAGS='-O2 -Wall' ./configure --prefix=/opt/local - -This command specifies that the C compiler should be run with the flags '-O2 --Wall' instead of the default, and that "make install" should install PCRE -under /opt/local instead of the default /usr/local. - -If you want to build in a different directory, just run "configure" with that -directory as current. For example, suppose you have unpacked the PCRE source -into /source/pcre/pcre-xxx, but you want to build it in /build/pcre/pcre-xxx: - -cd /build/pcre/pcre-xxx -/source/pcre/pcre-xxx/configure - -PCRE is written in C and is normally compiled as a C library. However, it is -possible to build it as a C++ library, though the provided building apparatus -does not have any features to support this. - -There are some optional features that can be included or omitted from the PCRE -library. They are also documented in the pcrebuild man page. - -. By default, both shared and static libraries are built. You can change this - by adding one of these options to the "configure" command: - - --disable-shared - --disable-static - - (See also "Shared libraries on Unix-like systems" below.) - -. By default, only the 8-bit library is built. If you add --enable-pcre16 to - the "configure" command, the 16-bit library is also built. If you add - --enable-pcre32 to the "configure" command, the 32-bit library is also built. - If you want only the 16-bit or 32-bit library, use --disable-pcre8 to disable - building the 8-bit library. - -. If you are building the 8-bit library and want to suppress the building of - the C++ wrapper library, you can add --disable-cpp to the "configure" - command. Otherwise, when "configure" is run without --disable-pcre8, it will - try to find a C++ compiler and C++ header files, and if it succeeds, it will - try to build the C++ wrapper. - -. If you want to include support for just-in-time compiling, which can give - large performance improvements on certain platforms, add --enable-jit to the - "configure" command. This support is available only for certain hardware - architectures. If you try to enable it on an unsupported architecture, there - will be a compile time error. - -. When JIT support is enabled, pcregrep automatically makes use of it, unless - you add --disable-pcregrep-jit to the "configure" command. - -. If you want to make use of the support for UTF-8 Unicode character strings in - the 8-bit library, or UTF-16 Unicode character strings in the 16-bit library, - or UTF-32 Unicode character strings in the 32-bit library, you must add - --enable-utf to the "configure" command. Without it, the code for handling - UTF-8, UTF-16 and UTF-8 is not included in the relevant library. Even - when --enable-utf is included, the use of a UTF encoding still has to be - enabled by an option at run time. When PCRE is compiled with this option, its - input can only either be ASCII or UTF-8/16/32, even when running on EBCDIC - platforms. It is not possible to use both --enable-utf and --enable-ebcdic at - the same time. - -. There are no separate options for enabling UTF-8, UTF-16 and UTF-32 - independently because that would allow ridiculous settings such as requesting - UTF-16 support while building only the 8-bit library. However, the option - --enable-utf8 is retained for backwards compatibility with earlier releases - that did not support 16-bit or 32-bit character strings. It is synonymous with - --enable-utf. It is not possible to configure one library with UTF support - and the other without in the same configuration. - -. If, in addition to support for UTF-8/16/32 character strings, you want to - include support for the \P, \p, and \X sequences that recognize Unicode - character properties, you must add --enable-unicode-properties to the - "configure" command. This adds about 30K to the size of the library (in the - form of a property table); only the basic two-letter properties such as Lu - are supported. - -. You can build PCRE to recognize either CR or LF or the sequence CRLF or any - of the preceding, or any of the Unicode newline sequences as indicating the - end of a line. Whatever you specify at build time is the default; the caller - of PCRE can change the selection at run time. The default newline indicator - is a single LF character (the Unix standard). You can specify the default - newline indicator by adding --enable-newline-is-cr or --enable-newline-is-lf - or --enable-newline-is-crlf or --enable-newline-is-anycrlf or - --enable-newline-is-any to the "configure" command, respectively. - - If you specify --enable-newline-is-cr or --enable-newline-is-crlf, some of - the standard tests will fail, because the lines in the test files end with - LF. Even if the files are edited to change the line endings, there are likely - to be some failures. With --enable-newline-is-anycrlf or - --enable-newline-is-any, many tests should succeed, but there may be some - failures. - -. By default, the sequence \R in a pattern matches any Unicode line ending - sequence. This is independent of the option specifying what PCRE considers to - be the end of a line (see above). However, the caller of PCRE can restrict \R - to match only CR, LF, or CRLF. You can make this the default by adding - --enable-bsr-anycrlf to the "configure" command (bsr = "backslash R"). - -. When called via the POSIX interface, PCRE uses malloc() to get additional - storage for processing capturing parentheses if there are more than 10 of - them in a pattern. You can increase this threshold by setting, for example, - - --with-posix-malloc-threshold=20 - - on the "configure" command. - -. PCRE has a counter that limits the depth of nesting of parentheses in a - pattern. This limits the amount of system stack that a pattern uses when it - is compiled. The default is 250, but you can change it by setting, for - example, - - --with-parens-nest-limit=500 - -. PCRE has a counter that can be set to limit the amount of resources it uses - when matching a pattern. If the limit is exceeded during a match, the match - fails. The default is ten million. You can change the default by setting, for - example, - - --with-match-limit=500000 - - on the "configure" command. This is just the default; individual calls to - pcre_exec() can supply their own value. There is more discussion on the - pcreapi man page. - -. There is a separate counter that limits the depth of recursive function calls - during a matching process. This also has a default of ten million, which is - essentially "unlimited". You can change the default by setting, for example, - - --with-match-limit-recursion=500000 - - Recursive function calls use up the runtime stack; running out of stack can - cause programs to crash in strange ways. There is a discussion about stack - sizes in the pcrestack man page. - -. The default maximum compiled pattern size is around 64K. You can increase - this by adding --with-link-size=3 to the "configure" command. In the 8-bit - library, PCRE then uses three bytes instead of two for offsets to different - parts of the compiled pattern. In the 16-bit library, --with-link-size=3 is - the same as --with-link-size=4, which (in both libraries) uses four-byte - offsets. Increasing the internal link size reduces performance. In the 32-bit - library, the only supported link size is 4. - -. You can build PCRE so that its internal match() function that is called from - pcre_exec() does not call itself recursively. Instead, it uses memory blocks - obtained from the heap via the special functions pcre_stack_malloc() and - pcre_stack_free() to save data that would otherwise be saved on the stack. To - build PCRE like this, use - - --disable-stack-for-recursion - - on the "configure" command. PCRE runs more slowly in this mode, but it may be - necessary in environments with limited stack sizes. This applies only to the - normal execution of the pcre_exec() function; if JIT support is being - successfully used, it is not relevant. Equally, it does not apply to - pcre_dfa_exec(), which does not use deeply nested recursion. There is a - discussion about stack sizes in the pcrestack man page. - -. For speed, PCRE uses four tables for manipulating and identifying characters - whose code point values are less than 256. By default, it uses a set of - tables for ASCII encoding that is part of the distribution. If you specify - - --enable-rebuild-chartables - - a program called dftables is compiled and run in the default C locale when - you obey "make". It builds a source file called pcre_chartables.c. If you do - not specify this option, pcre_chartables.c is created as a copy of - pcre_chartables.c.dist. See "Character tables" below for further information. - -. It is possible to compile PCRE for use on systems that use EBCDIC as their - character code (as opposed to ASCII/Unicode) by specifying - - --enable-ebcdic - - This automatically implies --enable-rebuild-chartables (see above). However, - when PCRE is built this way, it always operates in EBCDIC. It cannot support - both EBCDIC and UTF-8/16/32. There is a second option, --enable-ebcdic-nl25, - which specifies that the code value for the EBCDIC NL character is 0x25 - instead of the default 0x15. - -. In environments where valgrind is installed, if you specify - - --enable-valgrind - - PCRE will use valgrind annotations to mark certain memory regions as - unaddressable. This allows it to detect invalid memory accesses, and is - mostly useful for debugging PCRE itself. - -. In environments where the gcc compiler is used and lcov version 1.6 or above - is installed, if you specify - - --enable-coverage - - the build process implements a code coverage report for the test suite. The - report is generated by running "make coverage". If ccache is installed on - your system, it must be disabled when building PCRE for coverage reporting. - You can do this by setting the environment variable CCACHE_DISABLE=1 before - running "make" to build PCRE. There is more information about coverage - reporting in the "pcrebuild" documentation. - -. The pcregrep program currently supports only 8-bit data files, and so - requires the 8-bit PCRE library. It is possible to compile pcregrep to use - libz and/or libbz2, in order to read .gz and .bz2 files (respectively), by - specifying one or both of - - --enable-pcregrep-libz - --enable-pcregrep-libbz2 - - Of course, the relevant libraries must be installed on your system. - -. The default size (in bytes) of the internal buffer used by pcregrep can be - set by, for example: - - --with-pcregrep-bufsize=51200 - - The value must be a plain integer. The default is 20480. - -. It is possible to compile pcretest so that it links with the libreadline - or libedit libraries, by specifying, respectively, - - --enable-pcretest-libreadline or --enable-pcretest-libedit - - If this is done, when pcretest's input is from a terminal, it reads it using - the readline() function. This provides line-editing and history facilities. - Note that libreadline is GPL-licenced, so if you distribute a binary of - pcretest linked in this way, there may be licensing issues. These can be - avoided by linking with libedit (which has a BSD licence) instead. - - Enabling libreadline causes the -lreadline option to be added to the pcretest - build. In many operating environments with a sytem-installed readline - library this is sufficient. However, in some environments (e.g. if an - unmodified distribution version of readline is in use), it may be necessary - to specify something like LIBS="-lncurses" as well. This is because, to quote - the readline INSTALL, "Readline uses the termcap functions, but does not link - with the termcap or curses library itself, allowing applications which link - with readline the to choose an appropriate library." If you get error - messages about missing functions tgetstr, tgetent, tputs, tgetflag, or tgoto, - this is the problem, and linking with the ncurses library should fix it. - -The "configure" script builds the following files for the basic C library: - -. Makefile the makefile that builds the library -. config.h build-time configuration options for the library -. pcre.h the public PCRE header file -. pcre-config script that shows the building settings such as CFLAGS - that were set for "configure" -. libpcre.pc ) data for the pkg-config command -. libpcre16.pc ) -. libpcre32.pc ) -. libpcreposix.pc ) -. libtool script that builds shared and/or static libraries - -Versions of config.h and pcre.h are distributed in the PCRE tarballs under the -names config.h.generic and pcre.h.generic. These are provided for those who -have to built PCRE without using "configure" or CMake. If you use "configure" -or CMake, the .generic versions are not used. - -When building the 8-bit library, if a C++ compiler is found, the following -files are also built: - -. libpcrecpp.pc data for the pkg-config command -. pcrecpparg.h header file for calling PCRE via the C++ wrapper -. pcre_stringpiece.h header for the C++ "stringpiece" functions - -The "configure" script also creates config.status, which is an executable -script that can be run to recreate the configuration, and config.log, which -contains compiler output from tests that "configure" runs. - -Once "configure" has run, you can run "make". This builds the the libraries -libpcre, libpcre16 and/or libpcre32, and a test program called pcretest. If you -enabled JIT support with --enable-jit, a test program called pcre_jit_test is -built as well. - -If the 8-bit library is built, libpcreposix and the pcregrep command are also -built, and if a C++ compiler was found on your system, and you did not disable -it with --disable-cpp, "make" builds the C++ wrapper library, which is called -libpcrecpp, as well as some test programs called pcrecpp_unittest, -pcre_scanner_unittest, and pcre_stringpiece_unittest. - -The command "make check" runs all the appropriate tests. Details of the PCRE -tests are given below in a separate section of this document. - -You can use "make install" to install PCRE into live directories on your -system. The following are installed (file names are all relative to the - that is set when "configure" is run): - - Commands (bin): - pcretest - pcregrep (if 8-bit support is enabled) - pcre-config - - Libraries (lib): - libpcre16 (if 16-bit support is enabled) - libpcre32 (if 32-bit support is enabled) - libpcre (if 8-bit support is enabled) - libpcreposix (if 8-bit support is enabled) - libpcrecpp (if 8-bit and C++ support is enabled) - - Configuration information (lib/pkgconfig): - libpcre16.pc - libpcre32.pc - libpcre.pc - libpcreposix.pc - libpcrecpp.pc (if C++ support is enabled) - - Header files (include): - pcre.h - pcreposix.h - pcre_scanner.h ) - pcre_stringpiece.h ) if C++ support is enabled - pcrecpp.h ) - pcrecpparg.h ) - - Man pages (share/man/man{1,3}): - pcregrep.1 - pcretest.1 - pcre-config.1 - pcre.3 - pcre*.3 (lots more pages, all starting "pcre") - - HTML documentation (share/doc/pcre/html): - index.html - *.html (lots more pages, hyperlinked from index.html) - - Text file documentation (share/doc/pcre): - AUTHORS - COPYING - ChangeLog - LICENCE - NEWS - README - pcre.txt (a concatenation of the man(3) pages) - pcretest.txt the pcretest man page - pcregrep.txt the pcregrep man page - pcre-config.txt the pcre-config man page - -If you want to remove PCRE from your system, you can run "make uninstall". -This removes all the files that "make install" installed. However, it does not -remove any directories, because these are often shared with other programs. - - -Retrieving configuration information ------------------------------------- - -Running "make install" installs the command pcre-config, which can be used to -recall information about the PCRE configuration and installation. For example: - - pcre-config --version - -prints the version number, and - - pcre-config --libs - -outputs information about where the library is installed. This command can be -included in makefiles for programs that use PCRE, saving the programmer from -having to remember too many details. - -The pkg-config command is another system for saving and retrieving information -about installed libraries. Instead of separate commands for each library, a -single command is used. For example: - - pkg-config --cflags pcre - -The data is held in *.pc files that are installed in a directory called -/lib/pkgconfig. - - -Shared libraries ----------------- - -The default distribution builds PCRE as shared libraries and static libraries, -as long as the operating system supports shared libraries. Shared library -support relies on the "libtool" script which is built as part of the -"configure" process. - -The libtool script is used to compile and link both shared and static -libraries. They are placed in a subdirectory called .libs when they are newly -built. The programs pcretest and pcregrep are built to use these uninstalled -libraries (by means of wrapper scripts in the case of shared libraries). When -you use "make install" to install shared libraries, pcregrep and pcretest are -automatically re-built to use the newly installed shared libraries before being -installed themselves. However, the versions left in the build directory still -use the uninstalled libraries. - -To build PCRE using static libraries only you must use --disable-shared when -configuring it. For example: - -./configure --prefix=/usr/gnu --disable-shared - -Then run "make" in the usual way. Similarly, you can use --disable-static to -build only shared libraries. - - -Cross-compiling using autotools -------------------------------- - -You can specify CC and CFLAGS in the normal way to the "configure" command, in -order to cross-compile PCRE for some other host. However, you should NOT -specify --enable-rebuild-chartables, because if you do, the dftables.c source -file is compiled and run on the local host, in order to generate the inbuilt -character tables (the pcre_chartables.c file). This will probably not work, -because dftables.c needs to be compiled with the local compiler, not the cross -compiler. - -When --enable-rebuild-chartables is not specified, pcre_chartables.c is created -by making a copy of pcre_chartables.c.dist, which is a default set of tables -that assumes ASCII code. Cross-compiling with the default tables should not be -a problem. - -If you need to modify the character tables when cross-compiling, you should -move pcre_chartables.c.dist out of the way, then compile dftables.c by hand and -run it on the local host to make a new version of pcre_chartables.c.dist. -Then when you cross-compile PCRE this new version of the tables will be used. - - -Using HP's ANSI C++ compiler (aCC) ----------------------------------- - -Unless C++ support is disabled by specifying the "--disable-cpp" option of the -"configure" script, you must include the "-AA" option in the CXXFLAGS -environment variable in order for the C++ components to compile correctly. - -Also, note that the aCC compiler on PA-RISC platforms may have a defect whereby -needed libraries fail to get included when specifying the "-AA" compiler -option. If you experience unresolved symbols when linking the C++ programs, -use the workaround of specifying the following environment variable prior to -running the "configure" script: - - CXXLDFLAGS="-lstd_v2 -lCsup_v2" - - -Compiling in Tru64 using native compilers ------------------------------------------ - -The following error may occur when compiling with native compilers in the Tru64 -operating system: - - CXX libpcrecpp_la-pcrecpp.lo -cxx: Error: /usr/lib/cmplrs/cxx/V7.1-006/include/cxx/iosfwd, line 58: #error - directive: "cannot include iosfwd -- define __USE_STD_IOSTREAM to - override default - see section 7.1.2 of the C++ Using Guide" -#error "cannot include iosfwd -- define __USE_STD_IOSTREAM to override default -- see section 7.1.2 of the C++ Using Guide" - -This may be followed by other errors, complaining that 'namespace "std" has no -member'. The solution to this is to add the line - -#define __USE_STD_IOSTREAM 1 - -to the config.h file. - - -Using Sun's compilers for Solaris ---------------------------------- - -A user reports that the following configurations work on Solaris 9 sparcv9 and -Solaris 9 x86 (32-bit): - - Solaris 9 sparcv9: ./configure --disable-cpp CC=/bin/cc CFLAGS="-m64 -g" - Solaris 9 x86: ./configure --disable-cpp CC=/bin/cc CFLAGS="-g" - - -Using PCRE from MySQL ---------------------- - -On systems where both PCRE and MySQL are installed, it is possible to make use -of PCRE from within MySQL, as an alternative to the built-in pattern matching. -There is a web page that tells you how to do this: - - http://www.mysqludf.org/lib_mysqludf_preg/index.php - - -Making new tarballs -------------------- - -The command "make dist" creates three PCRE tarballs, in tar.gz, tar.bz2, and -zip formats. The command "make distcheck" does the same, but then does a trial -build of the new distribution to ensure that it works. - -If you have modified any of the man page sources in the doc directory, you -should first run the PrepareRelease script before making a distribution. This -script creates the .txt and HTML forms of the documentation from the man pages. - - -Testing PCRE ------------- - -To test the basic PCRE library on a Unix-like system, run the RunTest script. -There is another script called RunGrepTest that tests the options of the -pcregrep command. If the C++ wrapper library is built, three test programs -called pcrecpp_unittest, pcre_scanner_unittest, and pcre_stringpiece_unittest -are also built. When JIT support is enabled, another test program called -pcre_jit_test is built. - -Both the scripts and all the program tests are run if you obey "make check" or -"make test". For other environments, see the instructions in -NON-AUTOTOOLS-BUILD. - -The RunTest script runs the pcretest test program (which is documented in its -own man page) on each of the relevant testinput files in the testdata -directory, and compares the output with the contents of the corresponding -testoutput files. RunTest uses a file called testtry to hold the main output -from pcretest. Other files whose names begin with "test" are used as working -files in some tests. - -Some tests are relevant only when certain build-time options were selected. For -example, the tests for UTF-8/16/32 support are run only if --enable-utf was -used. RunTest outputs a comment when it skips a test. - -Many of the tests that are not skipped are run up to three times. The second -run forces pcre_study() to be called for all patterns except for a few in some -tests that are marked "never study" (see the pcretest program for how this is -done). If JIT support is available, the non-DFA tests are run a third time, -this time with a forced pcre_study() with the PCRE_STUDY_JIT_COMPILE option. -This testing can be suppressed by putting "nojit" on the RunTest command line. - -The entire set of tests is run once for each of the 8-bit, 16-bit and 32-bit -libraries that are enabled. If you want to run just one set of tests, call -RunTest with either the -8, -16 or -32 option. - -If valgrind is installed, you can run the tests under it by putting "valgrind" -on the RunTest command line. To run pcretest on just one or more specific test -files, give their numbers as arguments to RunTest, for example: - - RunTest 2 7 11 - -You can also specify ranges of tests such as 3-6 or 3- (meaning 3 to the -end), or a number preceded by ~ to exclude a test. For example: - - Runtest 3-15 ~10 - -This runs tests 3 to 15, excluding test 10, and just ~13 runs all the tests -except test 13. Whatever order the arguments are in, the tests are always run -in numerical order. - -You can also call RunTest with the single argument "list" to cause it to output -a list of tests. - -The first test file can be fed directly into the perltest.pl script to check -that Perl gives the same results. The only difference you should see is in the -first few lines, where the Perl version is given instead of the PCRE version. - -The second set of tests check pcre_fullinfo(), pcre_study(), -pcre_copy_substring(), pcre_get_substring(), pcre_get_substring_list(), error -detection, and run-time flags that are specific to PCRE, as well as the POSIX -wrapper API. It also uses the debugging flags to check some of the internals of -pcre_compile(). - -If you build PCRE with a locale setting that is not the standard C locale, the -character tables may be different (see next paragraph). In some cases, this may -cause failures in the second set of tests. For example, in a locale where the -isprint() function yields TRUE for characters in the range 128-255, the use of -[:isascii:] inside a character class defines a different set of characters, and -this shows up in this test as a difference in the compiled code, which is being -listed for checking. Where the comparison test output contains [\x00-\x7f] the -test will contain [\x00-\xff], and similarly in some other cases. This is not a -bug in PCRE. - -The third set of tests checks pcre_maketables(), the facility for building a -set of character tables for a specific locale and using them instead of the -default tables. The tests make use of the "fr_FR" (French) locale. Before -running the test, the script checks for the presence of this locale by running -the "locale" command. If that command fails, or if it doesn't include "fr_FR" -in the list of available locales, the third test cannot be run, and a comment -is output to say why. If running this test produces instances of the error - - ** Failed to set locale "fr_FR" - -in the comparison output, it means that locale is not available on your system, -despite being listed by "locale". This does not mean that PCRE is broken. - -[If you are trying to run this test on Windows, you may be able to get it to -work by changing "fr_FR" to "french" everywhere it occurs. Alternatively, use -RunTest.bat. The version of RunTest.bat included with PCRE 7.4 and above uses -Windows versions of test 2. More info on using RunTest.bat is included in the -document entitled NON-UNIX-USE.] - -The fourth and fifth tests check the UTF-8/16/32 support and error handling and -internal UTF features of PCRE that are not relevant to Perl, respectively. The -sixth and seventh tests do the same for Unicode character properties support. - -The eighth, ninth, and tenth tests check the pcre_dfa_exec() alternative -matching function, in non-UTF-8/16/32 mode, UTF-8/16/32 mode, and UTF-8/16/32 -mode with Unicode property support, respectively. - -The eleventh test checks some internal offsets and code size features; it is -run only when the default "link size" of 2 is set (in other cases the sizes -change) and when Unicode property support is enabled. - -The twelfth test is run only when JIT support is available, and the thirteenth -test is run only when JIT support is not available. They test some JIT-specific -features such as information output from pcretest about JIT compilation. - -The fourteenth, fifteenth, and sixteenth tests are run only in 8-bit mode, and -the seventeenth, eighteenth, and nineteenth tests are run only in 16/32-bit -mode. These are tests that generate different output in the two modes. They are -for general cases, UTF-8/16/32 support, and Unicode property support, -respectively. - -The twentieth test is run only in 16/32-bit mode. It tests some specific -16/32-bit features of the DFA matching engine. - -The twenty-first and twenty-second tests are run only in 16/32-bit mode, when -the link size is set to 2 for the 16-bit library. They test reloading -pre-compiled patterns. - -The twenty-third and twenty-fourth tests are run only in 16-bit mode. They are -for general cases, and UTF-16 support, respectively. - -The twenty-fifth and twenty-sixth tests are run only in 32-bit mode. They are -for general cases, and UTF-32 support, respectively. - - -Character tables ----------------- - -For speed, PCRE uses four tables for manipulating and identifying characters -whose code point values are less than 256. The final argument of the -pcre_compile() function is a pointer to a block of memory containing the -concatenated tables. A call to pcre_maketables() can be used to generate a set -of tables in the current locale. If the final argument for pcre_compile() is -passed as NULL, a set of default tables that is built into the binary is used. - -The source file called pcre_chartables.c contains the default set of tables. By -default, this is created as a copy of pcre_chartables.c.dist, which contains -tables for ASCII coding. However, if --enable-rebuild-chartables is specified -for ./configure, a different version of pcre_chartables.c is built by the -program dftables (compiled from dftables.c), which uses the ANSI C character -handling functions such as isalnum(), isalpha(), isupper(), islower(), etc. to -build the table sources. This means that the default C locale which is set for -your system will control the contents of these default tables. You can change -the default tables by editing pcre_chartables.c and then re-building PCRE. If -you do this, you should take care to ensure that the file does not get -automatically re-generated. The best way to do this is to move -pcre_chartables.c.dist out of the way and replace it with your customized -tables. - -When the dftables program is run as a result of --enable-rebuild-chartables, -it uses the default C locale that is set on your system. It does not pay -attention to the LC_xxx environment variables. In other words, it uses the -system's default locale rather than whatever the compiling user happens to have -set. If you really do want to build a source set of character tables in a -locale that is specified by the LC_xxx variables, you can run the dftables -program by hand with the -L option. For example: - - ./dftables -L pcre_chartables.c.special - -The first two 256-byte tables provide lower casing and case flipping functions, -respectively. The next table consists of three 32-byte bit maps which identify -digits, "word" characters, and white space, respectively. These are used when -building 32-byte bit maps that represent character classes for code points less -than 256. - -The final 256-byte table has bits indicating various character types, as -follows: - - 1 white space character - 2 letter - 4 decimal digit - 8 hexadecimal digit - 16 alphanumeric or '_' - 128 regular expression metacharacter or binary zero - -You should not alter the set of characters that contain the 128 bit, as that -will cause PCRE to malfunction. - - -File manifest -------------- - -The distribution should contain the files listed below. Where a file name is -given as pcre[16|32]_xxx it means that there are three files, one with the name -pcre_xxx, one with the name pcre16_xx, and a third with the name pcre32_xxx. - -(A) Source files of the PCRE library functions and their headers: - - dftables.c auxiliary program for building pcre_chartables.c - when --enable-rebuild-chartables is specified - - pcre_chartables.c.dist a default set of character tables that assume ASCII - coding; used, unless --enable-rebuild-chartables is - specified, by copying to pcre[16]_chartables.c - - pcreposix.c ) - pcre[16|32]_byte_order.c ) - pcre[16|32]_compile.c ) - pcre[16|32]_config.c ) - pcre[16|32]_dfa_exec.c ) - pcre[16|32]_exec.c ) - pcre[16|32]_fullinfo.c ) - pcre[16|32]_get.c ) sources for the functions in the library, - pcre[16|32]_globals.c ) and some internal functions that they use - pcre[16|32]_jit_compile.c ) - pcre[16|32]_maketables.c ) - pcre[16|32]_newline.c ) - pcre[16|32]_refcount.c ) - pcre[16|32]_string_utils.c ) - pcre[16|32]_study.c ) - pcre[16|32]_tables.c ) - pcre[16|32]_ucd.c ) - pcre[16|32]_version.c ) - pcre[16|32]_xclass.c ) - pcre_ord2utf8.c ) - pcre_valid_utf8.c ) - pcre16_ord2utf16.c ) - pcre16_utf16_utils.c ) - pcre16_valid_utf16.c ) - pcre32_utf32_utils.c ) - pcre32_valid_utf32.c ) - - pcre[16|32]_printint.c ) debugging function that is used by pcretest, - ) and can also be #included in pcre_compile() - - pcre.h.in template for pcre.h when built by "configure" - pcreposix.h header for the external POSIX wrapper API - pcre_internal.h header for internal use - sljit/* 16 files that make up the JIT compiler - ucp.h header for Unicode property handling - - config.h.in template for config.h, which is built by "configure" - - pcrecpp.h public header file for the C++ wrapper - pcrecpparg.h.in template for another C++ header file - pcre_scanner.h public header file for C++ scanner functions - pcrecpp.cc ) - pcre_scanner.cc ) source for the C++ wrapper library - - pcre_stringpiece.h.in template for pcre_stringpiece.h, the header for the - C++ stringpiece functions - pcre_stringpiece.cc source for the C++ stringpiece functions - -(B) Source files for programs that use PCRE: - - pcredemo.c simple demonstration of coding calls to PCRE - pcregrep.c source of a grep utility that uses PCRE - pcretest.c comprehensive test program - -(C) Auxiliary files: - - 132html script to turn "man" pages into HTML - AUTHORS information about the author of PCRE - ChangeLog log of changes to the code - CleanTxt script to clean nroff output for txt man pages - Detrail script to remove trailing spaces - HACKING some notes about the internals of PCRE - INSTALL generic installation instructions - LICENCE conditions for the use of PCRE - COPYING the same, using GNU's standard name - Makefile.in ) template for Unix Makefile, which is built by - ) "configure" - Makefile.am ) the automake input that was used to create - ) Makefile.in - NEWS important changes in this release - NON-UNIX-USE the previous name for NON-AUTOTOOLS-BUILD - NON-AUTOTOOLS-BUILD notes on building PCRE without using autotools - PrepareRelease script to make preparations for "make dist" - README this file - RunTest a Unix shell script for running tests - RunGrepTest a Unix shell script for pcregrep tests - aclocal.m4 m4 macros (generated by "aclocal") - config.guess ) files used by libtool, - config.sub ) used only when building a shared library - configure a configuring shell script (built by autoconf) - configure.ac ) the autoconf input that was used to build - ) "configure" and config.h - depcomp ) script to find program dependencies, generated by - ) automake - doc/*.3 man page sources for PCRE - doc/*.1 man page sources for pcregrep and pcretest - doc/index.html.src the base HTML page - doc/html/* HTML documentation - doc/pcre.txt plain text version of the man pages - doc/pcretest.txt plain text documentation of test program - doc/perltest.txt plain text documentation of Perl test program - install-sh a shell script for installing files - libpcre16.pc.in template for libpcre16.pc for pkg-config - libpcre32.pc.in template for libpcre32.pc for pkg-config - libpcre.pc.in template for libpcre.pc for pkg-config - libpcreposix.pc.in template for libpcreposix.pc for pkg-config - libpcrecpp.pc.in template for libpcrecpp.pc for pkg-config - ltmain.sh file used to build a libtool script - missing ) common stub for a few missing GNU programs while - ) installing, generated by automake - mkinstalldirs script for making install directories - perltest.pl Perl test program - pcre-config.in source of script which retains PCRE information - pcre_jit_test.c test program for the JIT compiler - pcrecpp_unittest.cc ) - pcre_scanner_unittest.cc ) test programs for the C++ wrapper - pcre_stringpiece_unittest.cc ) - testdata/testinput* test data for main library tests - testdata/testoutput* expected test results - testdata/grep* input and output for pcregrep tests - testdata/* other supporting test files - -(D) Auxiliary files for cmake support - - cmake/COPYING-CMAKE-SCRIPTS - cmake/FindPackageHandleStandardArgs.cmake - cmake/FindEditline.cmake - cmake/FindReadline.cmake - CMakeLists.txt - config-cmake.h.in - -(E) Auxiliary files for VPASCAL - - makevp.bat - makevp_c.txt - makevp_l.txt - pcregexp.pas - -(F) Auxiliary files for building PCRE "by hand" - - pcre.h.generic ) a version of the public PCRE header file - ) for use in non-"configure" environments - config.h.generic ) a version of config.h for use in non-"configure" - ) environments - -(F) Miscellaneous - - RunTest.bat a script for running tests under Windows - -Philip Hazel -Email local part: ph10 -Email domain: cam.ac.uk -Last updated: 10 February 2015 diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/NON-AUTOTOOLS-BUILD.txt b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/NON-AUTOTOOLS-BUILD.txt deleted file mode 100644 index 39100591..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/NON-AUTOTOOLS-BUILD.txt +++ /dev/null @@ -1,772 +0,0 @@ -Building PCRE without using autotools -------------------------------------- - -NOTE: This document relates to PCRE releases that use the original API, with -library names libpcre, libpcre16, and libpcre32. January 2015 saw the first -release of a new API, known as PCRE2, with release numbers starting at 10.00 -and library names libpcre2-8, libpcre2-16, and libpcre2-32. The old libraries -(now called PCRE1) are still being maintained for bug fixes, but there will be -no new development. New projects are advised to use the new PCRE2 libraries. - - -This document contains the following sections: - - General - Generic instructions for the PCRE C library - The C++ wrapper functions - Building for virtual Pascal - Stack size in Windows environments - Linking programs in Windows environments - Calling conventions in Windows environments - Comments about Win32 builds - Building PCRE on Windows with CMake - Use of relative paths with CMake on Windows - Testing with RunTest.bat - Building under Windows CE with Visual Studio 200x - Building under Windows with BCC5.5 - Building using Borland C++ Builder 2007 (CB2007) and higher - Building PCRE on OpenVMS - Building PCRE on Stratus OpenVOS - Building PCRE on native z/OS and z/VM - - -GENERAL - -I (Philip Hazel) have no experience of Windows or VMS sytems and how their -libraries work. The items in the PCRE distribution and Makefile that relate to -anything other than Linux systems are untested by me. - -There are some other comments and files (including some documentation in CHM -format) in the Contrib directory on the FTP site: - - ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/Contrib - -The basic PCRE library consists entirely of code written in Standard C, and so -should compile successfully on any system that has a Standard C compiler and -library. The C++ wrapper functions are a separate issue (see below). - -The PCRE distribution includes a "configure" file for use by the configure/make -(autotools) build system, as found in many Unix-like environments. The README -file contains information about the options for "configure". - -There is also support for CMake, which some users prefer, especially in Windows -environments, though it can also be run in Unix-like environments. See the -section entitled "Building PCRE on Windows with CMake" below. - -Versions of config.h and pcre.h are distributed in the PCRE tarballs under the -names config.h.generic and pcre.h.generic. These are provided for those who -build PCRE without using "configure" or CMake. If you use "configure" or CMake, -the .generic versions are not used. - - -GENERIC INSTRUCTIONS FOR THE PCRE C LIBRARY - -The following are generic instructions for building the PCRE C library "by -hand". If you are going to use CMake, this section does not apply to you; you -can skip ahead to the CMake section. - - (1) Copy or rename the file config.h.generic as config.h, and edit the macro - settings that it contains to whatever is appropriate for your environment. - - In particular, you can alter the definition of the NEWLINE macro to - specify what character(s) you want to be interpreted as line terminators. - In an EBCDIC environment, you MUST change NEWLINE, because its default - value is 10, an ASCII LF. The usual EBCDIC newline character is 21 (0x15, - NL), though in some cases it may be 37 (0x25). - - When you compile any of the PCRE modules, you must specify -DHAVE_CONFIG_H - to your compiler so that config.h is included in the sources. - - An alternative approach is not to edit config.h, but to use -D on the - compiler command line to make any changes that you need to the - configuration options. In this case -DHAVE_CONFIG_H must not be set. - - NOTE: There have been occasions when the way in which certain parameters - in config.h are used has changed between releases. (In the configure/make - world, this is handled automatically.) When upgrading to a new release, - you are strongly advised to review config.h.generic before re-using what - you had previously. - - (2) Copy or rename the file pcre.h.generic as pcre.h. - - (3) EITHER: - Copy or rename file pcre_chartables.c.dist as pcre_chartables.c. - - OR: - Compile dftables.c as a stand-alone program (using -DHAVE_CONFIG_H if - you have set up config.h), and then run it with the single argument - "pcre_chartables.c". This generates a set of standard character tables - and writes them to that file. The tables are generated using the default - C locale for your system. If you want to use a locale that is specified - by LC_xxx environment variables, add the -L option to the dftables - command. You must use this method if you are building on a system that - uses EBCDIC code. - - The tables in pcre_chartables.c are defaults. The caller of PCRE can - specify alternative tables at run time. - - (4) Ensure that you have the following header files: - - pcre_internal.h - ucp.h - - (5) For an 8-bit library, compile the following source files, setting - -DHAVE_CONFIG_H as a compiler option if you have set up config.h with your - configuration, or else use other -D settings to change the configuration - as required. - - pcre_byte_order.c - pcre_chartables.c - pcre_compile.c - pcre_config.c - pcre_dfa_exec.c - pcre_exec.c - pcre_fullinfo.c - pcre_get.c - pcre_globals.c - pcre_jit_compile.c - pcre_maketables.c - pcre_newline.c - pcre_ord2utf8.c - pcre_refcount.c - pcre_string_utils.c - pcre_study.c - pcre_tables.c - pcre_ucd.c - pcre_valid_utf8.c - pcre_version.c - pcre_xclass.c - - Make sure that you include -I. in the compiler command (or equivalent for - an unusual compiler) so that all included PCRE header files are first - sought in the current directory. Otherwise you run the risk of picking up - a previously-installed file from somewhere else. - - Note that you must still compile pcre_jit_compile.c, even if you have not - defined SUPPORT_JIT in config.h, because when JIT support is not - configured, dummy functions are compiled. When JIT support IS configured, - pcre_jit_compile.c #includes sources from the sljit subdirectory, where - there should be 16 files, all of whose names begin with "sljit". - - (6) Now link all the compiled code into an object library in whichever form - your system keeps such libraries. This is the basic PCRE C 8-bit library. - If your system has static and shared libraries, you may have to do this - once for each type. - - (7) If you want to build a 16-bit library (as well as, or instead of the 8-bit - or 32-bit libraries) repeat steps 5-6 with the following files: - - pcre16_byte_order.c - pcre16_chartables.c - pcre16_compile.c - pcre16_config.c - pcre16_dfa_exec.c - pcre16_exec.c - pcre16_fullinfo.c - pcre16_get.c - pcre16_globals.c - pcre16_jit_compile.c - pcre16_maketables.c - pcre16_newline.c - pcre16_ord2utf16.c - pcre16_refcount.c - pcre16_string_utils.c - pcre16_study.c - pcre16_tables.c - pcre16_ucd.c - pcre16_utf16_utils.c - pcre16_valid_utf16.c - pcre16_version.c - pcre16_xclass.c - - (8) If you want to build a 32-bit library (as well as, or instead of the 8-bit - or 16-bit libraries) repeat steps 5-6 with the following files: - - pcre32_byte_order.c - pcre32_chartables.c - pcre32_compile.c - pcre32_config.c - pcre32_dfa_exec.c - pcre32_exec.c - pcre32_fullinfo.c - pcre32_get.c - pcre32_globals.c - pcre32_jit_compile.c - pcre32_maketables.c - pcre32_newline.c - pcre32_ord2utf32.c - pcre32_refcount.c - pcre32_string_utils.c - pcre32_study.c - pcre32_tables.c - pcre32_ucd.c - pcre32_utf32_utils.c - pcre32_valid_utf32.c - pcre32_version.c - pcre32_xclass.c - - (9) If you want to build the POSIX wrapper functions (which apply only to the - 8-bit library), ensure that you have the pcreposix.h file and then compile - pcreposix.c (remembering -DHAVE_CONFIG_H if necessary). Link the result - (on its own) as the pcreposix library. - -(10) The pcretest program can be linked with any combination of the 8-bit, - 16-bit and 32-bit libraries (depending on what you selected in config.h). - Compile pcretest.c and pcre_printint.c (again, don't forget - -DHAVE_CONFIG_H) and link them together with the appropriate library/ies. - If you compiled an 8-bit library, pcretest also needs the pcreposix - wrapper library unless you compiled it with -DNOPOSIX. - -(11) Run pcretest on the testinput files in the testdata directory, and check - that the output matches the corresponding testoutput files. There are - comments about what each test does in the section entitled "Testing PCRE" - in the README file. If you compiled more than one of the 8-bit, 16-bit and - 32-bit libraries, you need to run pcretest with the -16 option to do - 16-bit tests and with the -32 option to do 32-bit tests. - - Some tests are relevant only when certain build-time options are selected. - For example, test 4 is for UTF-8/UTF-16/UTF-32 support, and will not run - if you have built PCRE without it. See the comments at the start of each - testinput file. If you have a suitable Unix-like shell, the RunTest script - will run the appropriate tests for you. The command "RunTest list" will - output a list of all the tests. - - Note that the supplied files are in Unix format, with just LF characters - as line terminators. You may need to edit them to change this if your - system uses a different convention. If you are using Windows, you probably - should use the wintestinput3 file instead of testinput3 (and the - corresponding output file). This is a locale test; wintestinput3 sets the - locale to "french" rather than "fr_FR", and there some minor output - differences. - -(12) If you have built PCRE with SUPPORT_JIT, the JIT features will be tested - by the testdata files. However, you might also like to build and run - the freestanding JIT test program, pcre_jit_test.c. - -(13) If you want to use the pcregrep command, compile and link pcregrep.c; it - uses only the basic 8-bit PCRE library (it does not need the pcreposix - library). - - -THE C++ WRAPPER FUNCTIONS - -The PCRE distribution also contains some C++ wrapper functions and tests, -applicable to the 8-bit library, which were contributed by Google Inc. On a -system that can use "configure" and "make", the functions are automatically -built into a library called pcrecpp. It should be straightforward to compile -the .cc files manually on other systems. The files called xxx_unittest.cc are -test programs for each of the corresponding xxx.cc files. - - -BUILDING FOR VIRTUAL PASCAL - -A script for building PCRE using Borland's C++ compiler for use with VPASCAL -was contributed by Alexander Tokarev. Stefan Weber updated the script and added -additional files. The following files in the distribution are for building PCRE -for use with VP/Borland: makevp_c.txt, makevp_l.txt, makevp.bat, pcregexp.pas. - - -STACK SIZE IN WINDOWS ENVIRONMENTS - -The default processor stack size of 1Mb in some Windows environments is too -small for matching patterns that need much recursion. In particular, test 2 may -fail because of this. Normally, running out of stack causes a crash, but there -have been cases where the test program has just died silently. See your linker -documentation for how to increase stack size if you experience problems. The -Linux default of 8Mb is a reasonable choice for the stack, though even that can -be too small for some pattern/subject combinations. - -PCRE has a compile configuration option to disable the use of stack for -recursion so that heap is used instead. However, pattern matching is -significantly slower when this is done. There is more about stack usage in the -"pcrestack" documentation. - - -LINKING PROGRAMS IN WINDOWS ENVIRONMENTS - -If you want to statically link a program against a PCRE library in the form of -a non-dll .a file, you must define PCRE_STATIC before including pcre.h or -pcrecpp.h, otherwise the pcre_malloc() and pcre_free() exported functions will -be declared __declspec(dllimport), with unwanted results. - - -CALLING CONVENTIONS IN WINDOWS ENVIRONMENTS - -It is possible to compile programs to use different calling conventions using -MSVC. Search the web for "calling conventions" for more information. To make it -easier to change the calling convention for the exported functions in the -PCRE library, the macro PCRE_CALL_CONVENTION is present in all the external -definitions. It can be set externally when compiling (e.g. in CFLAGS). If it is -not set, it defaults to empty; the default calling convention is then used -(which is what is wanted most of the time). - - -COMMENTS ABOUT WIN32 BUILDS (see also "BUILDING PCRE ON WINDOWS WITH CMAKE") - -There are two ways of building PCRE using the "configure, make, make install" -paradigm on Windows systems: using MinGW or using Cygwin. These are not at all -the same thing; they are completely different from each other. There is also -support for building using CMake, which some users find a more straightforward -way of building PCRE under Windows. - -The MinGW home page (http://www.mingw.org/) says this: - - MinGW: A collection of freely available and freely distributable Windows - specific header files and import libraries combined with GNU toolsets that - allow one to produce native Windows programs that do not rely on any - 3rd-party C runtime DLLs. - -The Cygwin home page (http://www.cygwin.com/) says this: - - Cygwin is a Linux-like environment for Windows. It consists of two parts: - - . A DLL (cygwin1.dll) which acts as a Linux API emulation layer providing - substantial Linux API functionality - - . A collection of tools which provide Linux look and feel. - - The Cygwin DLL currently works with all recent, commercially released x86 32 - bit and 64 bit versions of Windows, with the exception of Windows CE. - -On both MinGW and Cygwin, PCRE should build correctly using: - - ./configure && make && make install - -This should create two libraries called libpcre and libpcreposix, and, if you -have enabled building the C++ wrapper, a third one called libpcrecpp. These are -independent libraries: when you link with libpcreposix or libpcrecpp you must -also link with libpcre, which contains the basic functions. (Some earlier -releases of PCRE included the basic libpcre functions in libpcreposix. This no -longer happens.) - -A user submitted a special-purpose patch that makes it easy to create -"pcre.dll" under mingw32 using the "msys" environment. It provides "pcre.dll" -as a special target. If you use this target, no other files are built, and in -particular, the pcretest and pcregrep programs are not built. An example of how -this might be used is: - - ./configure --enable-utf --disable-cpp CFLAGS="-03 -s"; make pcre.dll - -Using Cygwin's compiler generates libraries and executables that depend on -cygwin1.dll. If a library that is generated this way is distributed, -cygwin1.dll has to be distributed as well. Since cygwin1.dll is under the GPL -licence, this forces not only PCRE to be under the GPL, but also the entire -application. A distributor who wants to keep their own code proprietary must -purchase an appropriate Cygwin licence. - -MinGW has no such restrictions. The MinGW compiler generates a library or -executable that can run standalone on Windows without any third party dll or -licensing issues. - -But there is more complication: - -If a Cygwin user uses the -mno-cygwin Cygwin gcc flag, what that really does is -to tell Cygwin's gcc to use the MinGW gcc. Cygwin's gcc is only acting as a -front end to MinGW's gcc (if you install Cygwin's gcc, you get both Cygwin's -gcc and MinGW's gcc). So, a user can: - -. Build native binaries by using MinGW or by getting Cygwin and using - -mno-cygwin. - -. Build binaries that depend on cygwin1.dll by using Cygwin with the normal - compiler flags. - -The test files that are supplied with PCRE are in UNIX format, with LF -characters as line terminators. Unless your PCRE library uses a default newline -option that includes LF as a valid newline, it may be necessary to change the -line terminators in the test files to get some of the tests to work. - - -BUILDING PCRE ON WINDOWS WITH CMAKE - -CMake is an alternative configuration facility that can be used instead of -"configure". CMake creates project files (make files, solution files, etc.) -tailored to numerous development environments, including Visual Studio, -Borland, Msys, MinGW, NMake, and Unix. If possible, use short paths with no -spaces in the names for your CMake installation and your PCRE source and build -directories. - -The following instructions were contributed by a PCRE user. If they are not -followed exactly, errors may occur. In the event that errors do occur, it is -recommended that you delete the CMake cache before attempting to repeat the -CMake build process. In the CMake GUI, the cache can be deleted by selecting -"File > Delete Cache". - -1. Install the latest CMake version available from http://www.cmake.org/, and - ensure that cmake\bin is on your path. - -2. Unzip (retaining folder structure) the PCRE source tree into a source - directory such as C:\pcre. You should ensure your local date and time - is not earlier than the file dates in your source dir if the release is - very new. - -3. Create a new, empty build directory, preferably a subdirectory of the - source dir. For example, C:\pcre\pcre-xx\build. - -4. Run cmake-gui from the Shell envirornment of your build tool, for example, - Msys for Msys/MinGW or Visual Studio Command Prompt for VC/VC++. Do not try - to start Cmake from the Windows Start menu, as this can lead to errors. - -5. Enter C:\pcre\pcre-xx and C:\pcre\pcre-xx\build for the source and build - directories, respectively. - -6. Hit the "Configure" button. - -7. Select the particular IDE / build tool that you are using (Visual - Studio, MSYS makefiles, MinGW makefiles, etc.) - -8. The GUI will then list several configuration options. This is where - you can enable UTF-8 support or other PCRE optional features. - -9. Hit "Configure" again. The adjacent "Generate" button should now be - active. - -10. Hit "Generate". - -11. The build directory should now contain a usable build system, be it a - solution file for Visual Studio, makefiles for MinGW, etc. Exit from - cmake-gui and use the generated build system with your compiler or IDE. - E.g., for MinGW you can run "make", or for Visual Studio, open the PCRE - solution, select the desired configuration (Debug, or Release, etc.) and - build the ALL_BUILD project. - -12. If during configuration with cmake-gui you've elected to build the test - programs, you can execute them by building the test project. E.g., for - MinGW: "make test"; for Visual Studio build the RUN_TESTS project. The - most recent build configuration is targeted by the tests. A summary of - test results is presented. Complete test output is subsequently - available for review in Testing\Temporary under your build dir. - - -USE OF RELATIVE PATHS WITH CMAKE ON WINDOWS - -A PCRE user comments as follows: I thought that others may want to know the -current state of CMAKE_USE_RELATIVE_PATHS support on Windows. Here it is: - --- AdditionalIncludeDirectories is only partially modified (only the - first path - see below) --- Only some of the contained file paths are modified - shown below for - pcre.vcproj --- It properly modifies - -I am sure CMake people can fix that if they want to. Until then one will -need to replace existing absolute paths in project files with relative -paths manually (e.g. from VS) - relative to project file location. I did -just that before being told to try CMAKE_USE_RELATIVE_PATHS. Not a big -deal. - -AdditionalIncludeDirectories="E:\builds\pcre\build;E:\builds\pcre\pcre-7.5;" -AdditionalIncludeDirectories=".;E:\builds\pcre\pcre-7.5;" - -RelativePath="pcre.h" -RelativePath="pcre_chartables.c" -RelativePath="pcre_chartables.c.rule" - - -TESTING WITH RUNTEST.BAT - -If configured with CMake, building the test project ("make test" or building -ALL_TESTS in Visual Studio) creates (and runs) pcre_test.bat (and depending -on your configuration options, possibly other test programs) in the build -directory. Pcre_test.bat runs RunTest.Bat with correct source and exe paths. - -For manual testing with RunTest.bat, provided the build dir is a subdirectory -of the source directory: Open command shell window. Chdir to the location -of your pcretest.exe and pcregrep.exe programs. Call RunTest.bat with -"..\RunTest.Bat" or "..\..\RunTest.bat" as appropriate. - -To run only a particular test with RunTest.Bat provide a test number argument. - -Otherwise: - -1. Copy RunTest.bat into the directory where pcretest.exe and pcregrep.exe - have been created. - -2. Edit RunTest.bat to indentify the full or relative location of - the pcre source (wherein which the testdata folder resides), e.g.: - - set srcdir=C:\pcre\pcre-8.20 - -3. In a Windows command environment, chdir to the location of your bat and - exe programs. - -4. Run RunTest.bat. Test outputs will automatically be compared to expected - results, and discrepancies will be identified in the console output. - -To independently test the just-in-time compiler, run pcre_jit_test.exe. -To test pcrecpp, run pcrecpp_unittest.exe, pcre_stringpiece_unittest.exe and -pcre_scanner_unittest.exe. - - -BUILDING UNDER WINDOWS CE WITH VISUAL STUDIO 200x - -Vincent Richomme sent a zip archive of files to help with this process. They -can be found in the file "pcre-vsbuild.zip" in the Contrib directory of the FTP -site. - - -BUILDING UNDER WINDOWS WITH BCC5.5 - -Michael Roy sent these comments about building PCRE under Windows with BCC5.5: - -Some of the core BCC libraries have a version of PCRE from 1998 built in, which -can lead to pcre_exec() giving an erroneous PCRE_ERROR_NULL from a version -mismatch. I'm including an easy workaround below, if you'd like to include it -in the non-unix instructions: - -When linking a project with BCC5.5, pcre.lib must be included before any of the -libraries cw32.lib, cw32i.lib, cw32mt.lib, and cw32mti.lib on the command line. - - -BUILDING USING BORLAND C++ BUILDER 2007 (CB2007) AND HIGHER - -A PCRE user sent these comments about this environment (see also the comment -from another user that follows them): - -The XE versions of C++ Builder come with a RegularExpressionsCore class which -contain a version of TPerlRegEx. However, direct use of the C PCRE library may -be desirable. - -The default makevp.bat, however, supplied with PCRE builds a version of PCRE -that is not usable with any version of C++ Builder because the compiler ships -with an embedded version of PCRE, version 2.01 from 1998! [See also the note -about BCC5.5 above.] If you want to use PCRE you'll need to rename the -functions (pcre_compile to pcre_compile_bcc, etc) or do as I have done and just -use the 16 bit versions. I'm using std::wstring everywhere anyway. Since the -embedded version of PCRE does not have the 16 bit function names, there is no -conflict. - -Building PCRE using a C++ Builder static library project file (recommended): - -1. Rename or remove pcre.h, pcreposi.h, and pcreposix.h from your C++ Builder -original include path. - -2. Download PCRE from pcre.org and extract to a directory. - -3. Rename pcre_chartables.c.dist to pcre_chartables.c, pcre.h.generic to -pcre.h, and config.h.generic to config.h. - -4. Edit pcre.h and pcre_config.c so that they include config.h. - -5. Edit config.h like so: - -Comment out the following lines: -#define PACKAGE "pcre" -#define PACKAGE_BUGREPORT "" -#define PACKAGE_NAME "PCRE" -#define PACKAGE_STRING "PCRE 8.32" -#define PACKAGE_TARNAME "pcre" -#define PACKAGE_URL "" -#define PACKAGE_VERSION "8.32" - -Add the following lines: -#ifndef SUPPORT_UTF -#define SUPPORT_UTF 100 // any value is fine -#endif - -#ifndef SUPPORT_UCP -#define SUPPORT_UCP 101 // any value is fine -#endif - -#ifndef SUPPORT_UCP -#define SUPPORT_PCRE16 102 // any value is fine -#endif - -#ifndef SUPPORT_UTF8 -#define SUPPORT_UTF8 103 // any value is fine -#endif - -6. Build a C++ Builder project using the IDE. Go to File / New / Other and -choose Static Library. You can name it pcre.cbproj or whatever. Now set your -paths by going to Project / Options. Set the Include path. Do this from the -"Base" option to apply to both Release and Debug builds. Now add the following -files to the project: - -pcre.h -pcre16_byte_order.c -pcre16_chartables.c -pcre16_compile.c -pcre16_config.c -pcre16_dfa_exec.c -pcre16_exec.c -pcre16_fullinfo.c -pcre16_get.c -pcre16_globals.c -pcre16_maketables.c -pcre16_newline.c -pcre16_ord2utf16.c -pcre16_printint.c -pcre16_refcount.c -pcre16_string_utils.c -pcre16_study.c -pcre16_tables.c -pcre16_ucd.c -pcre16_utf16_utils.c -pcre16_valid_utf16.c -pcre16_version.c -pcre16_xclass.c - -//Optional -pcre_version.c - -7. After compiling the .lib file, copy the .lib and header files to a project -you want to use PCRE with. Enjoy. - -Optional ... Building PCRE using the makevp.bat file: - -1. Edit makevp_c.txt and makevp_l.txt and change all the names to the 16 bit -versions. - -2. Edit makevp.bat and set the path to C++ Builder. Run makevp.bat. - -Another PCRE user added this comment: - -Another approach I successfully used for some years with BCB 5 and 6 was to -make sure that include and library paths of PCRE are configured before the -default paths of the IDE in the dialogs where one can manage those paths. -Afterwards one can open the project files using a text editor and manually add -the self created library for pcre itself, pcrecpp doesn't ship with the IDE, in -the library nodes where the IDE manages its own libraries to link against in -front of the IDE-own libraries. This way one can use the default PCRE function -names without getting access violations on runtime. - - - - -BUILDING PCRE ON OPENVMS - -Stephen Hoffman sent the following, in December 2012: - -"Here is a very short write-up on the -OpenVMS port and here - - - -is a zip with the OpenVMS files, and with one modified testing-related PCRE -file." This is a port of PCRE 8.32. - -Earlier, Dan Mooney sent the following comments about building PCRE on OpenVMS. -They relate to an older version of PCRE that used fewer source files, so the -exact commands will need changing. See the current list of source files above. - -"It was quite easy to compile and link the library. I don't have a formal -make file but the attached file [reproduced below] contains the OpenVMS DCL -commands I used to build the library. I had to add #define -POSIX_MALLOC_THRESHOLD 10 to pcre.h since it was not defined anywhere. - -The library was built on: -O/S: HP OpenVMS v7.3-1 -Compiler: Compaq C v6.5-001-48BCD -Linker: vA13-01 - -The test results did not match 100% due to the issues you mention in your -documentation regarding isprint(), iscntrl(), isgraph() and ispunct(). I -modified some of the character tables temporarily and was able to get the -results to match. Tests using the fr locale did not match since I don't have -that locale loaded. The study size was always reported to be 3 less than the -value in the standard test output files." - -========================= -$! This DCL procedure builds PCRE on OpenVMS -$! -$! I followed the instructions in the non-unix-use file in the distribution. -$! -$ COMPILE == "CC/LIST/NOMEMBER_ALIGNMENT/PREFIX_LIBRARY_ENTRIES=ALL_ENTRIES -$ COMPILE DFTABLES.C -$ LINK/EXE=DFTABLES.EXE DFTABLES.OBJ -$ RUN DFTABLES.EXE/OUTPUT=CHARTABLES.C -$ COMPILE MAKETABLES.C -$ COMPILE GET.C -$ COMPILE STUDY.C -$! I had to set POSIX_MALLOC_THRESHOLD to 10 in PCRE.H since the symbol -$! did not seem to be defined anywhere. -$! I edited pcre.h and added #DEFINE SUPPORT_UTF8 to enable UTF8 support. -$ COMPILE PCRE.C -$ LIB/CREATE PCRE MAKETABLES.OBJ, GET.OBJ, STUDY.OBJ, PCRE.OBJ -$! I had to set POSIX_MALLOC_THRESHOLD to 10 in PCRE.H since the symbol -$! did not seem to be defined anywhere. -$ COMPILE PCREPOSIX.C -$ LIB/CREATE PCREPOSIX PCREPOSIX.OBJ -$ COMPILE PCRETEST.C -$ LINK/EXE=PCRETEST.EXE PCRETEST.OBJ, PCRE/LIB, PCREPOSIX/LIB -$! C programs that want access to command line arguments must be -$! defined as a symbol -$ PCRETEST :== "$ SYS$ROADSUSERS:[DMOONEY.REGEXP]PCRETEST.EXE" -$! Arguments must be enclosed in quotes. -$ PCRETEST "-C" -$! Test results: -$! -$! The test results did not match 100%. The functions isprint(), iscntrl(), -$! isgraph() and ispunct() on OpenVMS must not produce the same results -$! as the system that built the test output files provided with the -$! distribution. -$! -$! The study size did not match and was always 3 less on OpenVMS. -$! -$! Locale could not be set to fr -$! -========================= - - -BUILDING PCRE ON STRATUS OPENVOS - -These notes on the port of PCRE to VOS (lightly edited) were supplied by -Ashutosh Warikoo, whose email address has the local part awarikoo and the -domain nse.co.in. The port was for version 7.9 in August 2009. - -1. Building PCRE - -I built pcre on OpenVOS Release 17.0.1at using GNU Tools 3.4a without any -problems. I used the following packages to build PCRE: - - ftp://ftp.stratus.com/pub/vos/posix/ga/posix.save.evf.gz - -Please read and follow the instructions that come with these packages. To start -the build of pcre, from the root of the package type: - - ./build.sh - -2. Installing PCRE - -Once you have successfully built PCRE, login to the SysAdmin group, switch to -the root user, and type - - [ !create_dir (master_disk)>usr --if needed ] - [ !create_dir (master_disk)>usr>local --if needed ] - !gmake install - -This installs PCRE and its man pages into /usr/local. You can add -(master_disk)>usr>local>bin to your command search paths, or if you are in -BASH, add /usr/local/bin to the PATH environment variable. - -4. Restrictions - -This port requires readline library optionally. However during the build I -faced some yet unexplored errors while linking with readline. As it was an -optional component I chose to disable it. - -5. Known Problems - -I ran the test suite, but you will have to be your own judge of whether this -command, and this port, suits your purposes. If you find any problems that -appear to be related to the port itself, please let me know. Please see the -build.log file in the root of the package also. - - -BUILDING PCRE ON NATIVE Z/OS AND Z/VM - -z/OS and z/VM are operating systems for mainframe computers, produced by IBM. -The character code used is EBCDIC, not ASCII or Unicode. In z/OS, UNIX APIs and -applications can be supported through UNIX System Services, and in such an -environment PCRE can be built in the same way as in other systems. However, in -native z/OS (without UNIX System Services) and in z/VM, special ports are -required. For details, please see this web site: - - http://www.zaconsultants.net - -You may download PCRE from WWW.CBTTAPE.ORG, file 882.  Everything, source and -executable, is in EBCDIC and native z/OS file formats and this is the -recommended download site. - -========================== -Last Updated: 25 June 2015 diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/README.txt b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/README.txt deleted file mode 100644 index 4887ebf3..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/README.txt +++ /dev/null @@ -1,1002 +0,0 @@ -README file for PCRE (Perl-compatible regular expression library) ------------------------------------------------------------------ - -NOTE: This set of files relates to PCRE releases that use the original API, -with library names libpcre, libpcre16, and libpcre32. January 2015 saw the -first release of a new API, known as PCRE2, with release numbers starting at -10.00 and library names libpcre2-8, libpcre2-16, and libpcre2-32. The old -libraries (now called PCRE1) are still being maintained for bug fixes, but -there will be no new development. New projects are advised to use the new PCRE2 -libraries. - - -The latest release of PCRE1 is always available in three alternative formats -from: - - ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-xxx.tar.gz - ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-xxx.tar.bz2 - ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-xxx.zip - -There is a mailing list for discussion about the development of PCRE at -pcre-dev@exim.org. You can access the archives and subscribe or manage your -subscription here: - - https://lists.exim.org/mailman/listinfo/pcre-dev - -Please read the NEWS file if you are upgrading from a previous release. -The contents of this README file are: - - The PCRE APIs - Documentation for PCRE - Contributions by users of PCRE - Building PCRE on non-Unix-like systems - Building PCRE without using autotools - Building PCRE using autotools - Retrieving configuration information - Shared libraries - Cross-compiling using autotools - Using HP's ANSI C++ compiler (aCC) - Compiling in Tru64 using native compilers - Using Sun's compilers for Solaris - Using PCRE from MySQL - Making new tarballs - Testing PCRE - Character tables - File manifest - - -The PCRE APIs -------------- - -PCRE is written in C, and it has its own API. There are three sets of -functions, one for the 8-bit library, which processes strings of bytes, one for -the 16-bit library, which processes strings of 16-bit values, and one for the -32-bit library, which processes strings of 32-bit values. The distribution also -includes a set of C++ wrapper functions (see the pcrecpp man page for details), -courtesy of Google Inc., which can be used to call the 8-bit PCRE library from -C++. Other C++ wrappers have been created from time to time. See, for example: -https://github.com/YasserAsmi/regexp, which aims to be simple and similar in -style to the C API. - -The distribution also contains a set of C wrapper functions (again, just for -the 8-bit library) that are based on the POSIX regular expression API (see the -pcreposix man page). These end up in the library called libpcreposix. Note that -this just provides a POSIX calling interface to PCRE; the regular expressions -themselves still follow Perl syntax and semantics. The POSIX API is restricted, -and does not give full access to all of PCRE's facilities. - -The header file for the POSIX-style functions is called pcreposix.h. The -official POSIX name is regex.h, but I did not want to risk possible problems -with existing files of that name by distributing it that way. To use PCRE with -an existing program that uses the POSIX API, pcreposix.h will have to be -renamed or pointed at by a link. - -If you are using the POSIX interface to PCRE and there is already a POSIX regex -library installed on your system, as well as worrying about the regex.h header -file (as mentioned above), you must also take care when linking programs to -ensure that they link with PCRE's libpcreposix library. Otherwise they may pick -up the POSIX functions of the same name from the other library. - -One way of avoiding this confusion is to compile PCRE with the addition of --Dregcomp=PCREregcomp (and similarly for the other POSIX functions) to the -compiler flags (CFLAGS if you are using "configure" -- see below). This has the -effect of renaming the functions so that the names no longer clash. Of course, -you have to do the same thing for your applications, or write them using the -new names. - - -Documentation for PCRE ----------------------- - -If you install PCRE in the normal way on a Unix-like system, you will end up -with a set of man pages whose names all start with "pcre". The one that is just -called "pcre" lists all the others. In addition to these man pages, the PCRE -documentation is supplied in two other forms: - - 1. There are files called doc/pcre.txt, doc/pcregrep.txt, and - doc/pcretest.txt in the source distribution. The first of these is a - concatenation of the text forms of all the section 3 man pages except - the listing of pcredemo.c and those that summarize individual functions. - The other two are the text forms of the section 1 man pages for the - pcregrep and pcretest commands. These text forms are provided for ease of - scanning with text editors or similar tools. They are installed in - /share/doc/pcre, where is the installation prefix - (defaulting to /usr/local). - - 2. A set of files containing all the documentation in HTML form, hyperlinked - in various ways, and rooted in a file called index.html, is distributed in - doc/html and installed in /share/doc/pcre/html. - -Users of PCRE have contributed files containing the documentation for various -releases in CHM format. These can be found in the Contrib directory of the FTP -site (see next section). - - -Contributions by users of PCRE ------------------------------- - -You can find contributions from PCRE users in the directory - - ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/Contrib - -There is a README file giving brief descriptions of what they are. Some are -complete in themselves; others are pointers to URLs containing relevant files. -Some of this material is likely to be well out-of-date. Several of the earlier -contributions provided support for compiling PCRE on various flavours of -Windows (I myself do not use Windows). Nowadays there is more Windows support -in the standard distribution, so these contibutions have been archived. - -A PCRE user maintains downloadable Windows binaries of the pcregrep and -pcretest programs here: - - http://www.rexegg.com/pcregrep-pcretest.html - - -Building PCRE on non-Unix-like systems --------------------------------------- - -For a non-Unix-like system, please read the comments in the file -NON-AUTOTOOLS-BUILD, though if your system supports the use of "configure" and -"make" you may be able to build PCRE using autotools in the same way as for -many Unix-like systems. - -PCRE can also be configured using the GUI facility provided by CMake's -cmake-gui command. This creates Makefiles, solution files, etc. The file -NON-AUTOTOOLS-BUILD has information about CMake. - -PCRE has been compiled on many different operating systems. It should be -straightforward to build PCRE on any system that has a Standard C compiler and -library, because it uses only Standard C functions. - - -Building PCRE without using autotools -------------------------------------- - -The use of autotools (in particular, libtool) is problematic in some -environments, even some that are Unix or Unix-like. See the NON-AUTOTOOLS-BUILD -file for ways of building PCRE without using autotools. - - -Building PCRE using autotools ------------------------------ - -If you are using HP's ANSI C++ compiler (aCC), please see the special note -in the section entitled "Using HP's ANSI C++ compiler (aCC)" below. - -The following instructions assume the use of the widely used "configure; make; -make install" (autotools) process. - -To build PCRE on system that supports autotools, first run the "configure" -command from the PCRE distribution directory, with your current directory set -to the directory where you want the files to be created. This command is a -standard GNU "autoconf" configuration script, for which generic instructions -are supplied in the file INSTALL. - -Most commonly, people build PCRE within its own distribution directory, and in -this case, on many systems, just running "./configure" is sufficient. However, -the usual methods of changing standard defaults are available. For example: - -CFLAGS='-O2 -Wall' ./configure --prefix=/opt/local - -This command specifies that the C compiler should be run with the flags '-O2 --Wall' instead of the default, and that "make install" should install PCRE -under /opt/local instead of the default /usr/local. - -If you want to build in a different directory, just run "configure" with that -directory as current. For example, suppose you have unpacked the PCRE source -into /source/pcre/pcre-xxx, but you want to build it in /build/pcre/pcre-xxx: - -cd /build/pcre/pcre-xxx -/source/pcre/pcre-xxx/configure - -PCRE is written in C and is normally compiled as a C library. However, it is -possible to build it as a C++ library, though the provided building apparatus -does not have any features to support this. - -There are some optional features that can be included or omitted from the PCRE -library. They are also documented in the pcrebuild man page. - -. By default, both shared and static libraries are built. You can change this - by adding one of these options to the "configure" command: - - --disable-shared - --disable-static - - (See also "Shared libraries on Unix-like systems" below.) - -. By default, only the 8-bit library is built. If you add --enable-pcre16 to - the "configure" command, the 16-bit library is also built. If you add - --enable-pcre32 to the "configure" command, the 32-bit library is also built. - If you want only the 16-bit or 32-bit library, use --disable-pcre8 to disable - building the 8-bit library. - -. If you are building the 8-bit library and want to suppress the building of - the C++ wrapper library, you can add --disable-cpp to the "configure" - command. Otherwise, when "configure" is run without --disable-pcre8, it will - try to find a C++ compiler and C++ header files, and if it succeeds, it will - try to build the C++ wrapper. - -. If you want to include support for just-in-time compiling, which can give - large performance improvements on certain platforms, add --enable-jit to the - "configure" command. This support is available only for certain hardware - architectures. If you try to enable it on an unsupported architecture, there - will be a compile time error. - -. When JIT support is enabled, pcregrep automatically makes use of it, unless - you add --disable-pcregrep-jit to the "configure" command. - -. If you want to make use of the support for UTF-8 Unicode character strings in - the 8-bit library, or UTF-16 Unicode character strings in the 16-bit library, - or UTF-32 Unicode character strings in the 32-bit library, you must add - --enable-utf to the "configure" command. Without it, the code for handling - UTF-8, UTF-16 and UTF-8 is not included in the relevant library. Even - when --enable-utf is included, the use of a UTF encoding still has to be - enabled by an option at run time. When PCRE is compiled with this option, its - input can only either be ASCII or UTF-8/16/32, even when running on EBCDIC - platforms. It is not possible to use both --enable-utf and --enable-ebcdic at - the same time. - -. There are no separate options for enabling UTF-8, UTF-16 and UTF-32 - independently because that would allow ridiculous settings such as requesting - UTF-16 support while building only the 8-bit library. However, the option - --enable-utf8 is retained for backwards compatibility with earlier releases - that did not support 16-bit or 32-bit character strings. It is synonymous with - --enable-utf. It is not possible to configure one library with UTF support - and the other without in the same configuration. - -. If, in addition to support for UTF-8/16/32 character strings, you want to - include support for the \P, \p, and \X sequences that recognize Unicode - character properties, you must add --enable-unicode-properties to the - "configure" command. This adds about 30K to the size of the library (in the - form of a property table); only the basic two-letter properties such as Lu - are supported. - -. You can build PCRE to recognize either CR or LF or the sequence CRLF or any - of the preceding, or any of the Unicode newline sequences as indicating the - end of a line. Whatever you specify at build time is the default; the caller - of PCRE can change the selection at run time. The default newline indicator - is a single LF character (the Unix standard). You can specify the default - newline indicator by adding --enable-newline-is-cr or --enable-newline-is-lf - or --enable-newline-is-crlf or --enable-newline-is-anycrlf or - --enable-newline-is-any to the "configure" command, respectively. - - If you specify --enable-newline-is-cr or --enable-newline-is-crlf, some of - the standard tests will fail, because the lines in the test files end with - LF. Even if the files are edited to change the line endings, there are likely - to be some failures. With --enable-newline-is-anycrlf or - --enable-newline-is-any, many tests should succeed, but there may be some - failures. - -. By default, the sequence \R in a pattern matches any Unicode line ending - sequence. This is independent of the option specifying what PCRE considers to - be the end of a line (see above). However, the caller of PCRE can restrict \R - to match only CR, LF, or CRLF. You can make this the default by adding - --enable-bsr-anycrlf to the "configure" command (bsr = "backslash R"). - -. When called via the POSIX interface, PCRE uses malloc() to get additional - storage for processing capturing parentheses if there are more than 10 of - them in a pattern. You can increase this threshold by setting, for example, - - --with-posix-malloc-threshold=20 - - on the "configure" command. - -. PCRE has a counter that limits the depth of nesting of parentheses in a - pattern. This limits the amount of system stack that a pattern uses when it - is compiled. The default is 250, but you can change it by setting, for - example, - - --with-parens-nest-limit=500 - -. PCRE has a counter that can be set to limit the amount of resources it uses - when matching a pattern. If the limit is exceeded during a match, the match - fails. The default is ten million. You can change the default by setting, for - example, - - --with-match-limit=500000 - - on the "configure" command. This is just the default; individual calls to - pcre_exec() can supply their own value. There is more discussion on the - pcreapi man page. - -. There is a separate counter that limits the depth of recursive function calls - during a matching process. This also has a default of ten million, which is - essentially "unlimited". You can change the default by setting, for example, - - --with-match-limit-recursion=500000 - - Recursive function calls use up the runtime stack; running out of stack can - cause programs to crash in strange ways. There is a discussion about stack - sizes in the pcrestack man page. - -. The default maximum compiled pattern size is around 64K. You can increase - this by adding --with-link-size=3 to the "configure" command. In the 8-bit - library, PCRE then uses three bytes instead of two for offsets to different - parts of the compiled pattern. In the 16-bit library, --with-link-size=3 is - the same as --with-link-size=4, which (in both libraries) uses four-byte - offsets. Increasing the internal link size reduces performance. In the 32-bit - library, the only supported link size is 4. - -. You can build PCRE so that its internal match() function that is called from - pcre_exec() does not call itself recursively. Instead, it uses memory blocks - obtained from the heap via the special functions pcre_stack_malloc() and - pcre_stack_free() to save data that would otherwise be saved on the stack. To - build PCRE like this, use - - --disable-stack-for-recursion - - on the "configure" command. PCRE runs more slowly in this mode, but it may be - necessary in environments with limited stack sizes. This applies only to the - normal execution of the pcre_exec() function; if JIT support is being - successfully used, it is not relevant. Equally, it does not apply to - pcre_dfa_exec(), which does not use deeply nested recursion. There is a - discussion about stack sizes in the pcrestack man page. - -. For speed, PCRE uses four tables for manipulating and identifying characters - whose code point values are less than 256. By default, it uses a set of - tables for ASCII encoding that is part of the distribution. If you specify - - --enable-rebuild-chartables - - a program called dftables is compiled and run in the default C locale when - you obey "make". It builds a source file called pcre_chartables.c. If you do - not specify this option, pcre_chartables.c is created as a copy of - pcre_chartables.c.dist. See "Character tables" below for further information. - -. It is possible to compile PCRE for use on systems that use EBCDIC as their - character code (as opposed to ASCII/Unicode) by specifying - - --enable-ebcdic - - This automatically implies --enable-rebuild-chartables (see above). However, - when PCRE is built this way, it always operates in EBCDIC. It cannot support - both EBCDIC and UTF-8/16/32. There is a second option, --enable-ebcdic-nl25, - which specifies that the code value for the EBCDIC NL character is 0x25 - instead of the default 0x15. - -. In environments where valgrind is installed, if you specify - - --enable-valgrind - - PCRE will use valgrind annotations to mark certain memory regions as - unaddressable. This allows it to detect invalid memory accesses, and is - mostly useful for debugging PCRE itself. - -. In environments where the gcc compiler is used and lcov version 1.6 or above - is installed, if you specify - - --enable-coverage - - the build process implements a code coverage report for the test suite. The - report is generated by running "make coverage". If ccache is installed on - your system, it must be disabled when building PCRE for coverage reporting. - You can do this by setting the environment variable CCACHE_DISABLE=1 before - running "make" to build PCRE. There is more information about coverage - reporting in the "pcrebuild" documentation. - -. The pcregrep program currently supports only 8-bit data files, and so - requires the 8-bit PCRE library. It is possible to compile pcregrep to use - libz and/or libbz2, in order to read .gz and .bz2 files (respectively), by - specifying one or both of - - --enable-pcregrep-libz - --enable-pcregrep-libbz2 - - Of course, the relevant libraries must be installed on your system. - -. The default size (in bytes) of the internal buffer used by pcregrep can be - set by, for example: - - --with-pcregrep-bufsize=51200 - - The value must be a plain integer. The default is 20480. - -. It is possible to compile pcretest so that it links with the libreadline - or libedit libraries, by specifying, respectively, - - --enable-pcretest-libreadline or --enable-pcretest-libedit - - If this is done, when pcretest's input is from a terminal, it reads it using - the readline() function. This provides line-editing and history facilities. - Note that libreadline is GPL-licenced, so if you distribute a binary of - pcretest linked in this way, there may be licensing issues. These can be - avoided by linking with libedit (which has a BSD licence) instead. - - Enabling libreadline causes the -lreadline option to be added to the pcretest - build. In many operating environments with a sytem-installed readline - library this is sufficient. However, in some environments (e.g. if an - unmodified distribution version of readline is in use), it may be necessary - to specify something like LIBS="-lncurses" as well. This is because, to quote - the readline INSTALL, "Readline uses the termcap functions, but does not link - with the termcap or curses library itself, allowing applications which link - with readline the to choose an appropriate library." If you get error - messages about missing functions tgetstr, tgetent, tputs, tgetflag, or tgoto, - this is the problem, and linking with the ncurses library should fix it. - -The "configure" script builds the following files for the basic C library: - -. Makefile the makefile that builds the library -. config.h build-time configuration options for the library -. pcre.h the public PCRE header file -. pcre-config script that shows the building settings such as CFLAGS - that were set for "configure" -. libpcre.pc ) data for the pkg-config command -. libpcre16.pc ) -. libpcre32.pc ) -. libpcreposix.pc ) -. libtool script that builds shared and/or static libraries - -Versions of config.h and pcre.h are distributed in the PCRE tarballs under the -names config.h.generic and pcre.h.generic. These are provided for those who -have to built PCRE without using "configure" or CMake. If you use "configure" -or CMake, the .generic versions are not used. - -When building the 8-bit library, if a C++ compiler is found, the following -files are also built: - -. libpcrecpp.pc data for the pkg-config command -. pcrecpparg.h header file for calling PCRE via the C++ wrapper -. pcre_stringpiece.h header for the C++ "stringpiece" functions - -The "configure" script also creates config.status, which is an executable -script that can be run to recreate the configuration, and config.log, which -contains compiler output from tests that "configure" runs. - -Once "configure" has run, you can run "make". This builds the the libraries -libpcre, libpcre16 and/or libpcre32, and a test program called pcretest. If you -enabled JIT support with --enable-jit, a test program called pcre_jit_test is -built as well. - -If the 8-bit library is built, libpcreposix and the pcregrep command are also -built, and if a C++ compiler was found on your system, and you did not disable -it with --disable-cpp, "make" builds the C++ wrapper library, which is called -libpcrecpp, as well as some test programs called pcrecpp_unittest, -pcre_scanner_unittest, and pcre_stringpiece_unittest. - -The command "make check" runs all the appropriate tests. Details of the PCRE -tests are given below in a separate section of this document. - -You can use "make install" to install PCRE into live directories on your -system. The following are installed (file names are all relative to the - that is set when "configure" is run): - - Commands (bin): - pcretest - pcregrep (if 8-bit support is enabled) - pcre-config - - Libraries (lib): - libpcre16 (if 16-bit support is enabled) - libpcre32 (if 32-bit support is enabled) - libpcre (if 8-bit support is enabled) - libpcreposix (if 8-bit support is enabled) - libpcrecpp (if 8-bit and C++ support is enabled) - - Configuration information (lib/pkgconfig): - libpcre16.pc - libpcre32.pc - libpcre.pc - libpcreposix.pc - libpcrecpp.pc (if C++ support is enabled) - - Header files (include): - pcre.h - pcreposix.h - pcre_scanner.h ) - pcre_stringpiece.h ) if C++ support is enabled - pcrecpp.h ) - pcrecpparg.h ) - - Man pages (share/man/man{1,3}): - pcregrep.1 - pcretest.1 - pcre-config.1 - pcre.3 - pcre*.3 (lots more pages, all starting "pcre") - - HTML documentation (share/doc/pcre/html): - index.html - *.html (lots more pages, hyperlinked from index.html) - - Text file documentation (share/doc/pcre): - AUTHORS - COPYING - ChangeLog - LICENCE - NEWS - README - pcre.txt (a concatenation of the man(3) pages) - pcretest.txt the pcretest man page - pcregrep.txt the pcregrep man page - pcre-config.txt the pcre-config man page - -If you want to remove PCRE from your system, you can run "make uninstall". -This removes all the files that "make install" installed. However, it does not -remove any directories, because these are often shared with other programs. - - -Retrieving configuration information ------------------------------------- - -Running "make install" installs the command pcre-config, which can be used to -recall information about the PCRE configuration and installation. For example: - - pcre-config --version - -prints the version number, and - - pcre-config --libs - -outputs information about where the library is installed. This command can be -included in makefiles for programs that use PCRE, saving the programmer from -having to remember too many details. - -The pkg-config command is another system for saving and retrieving information -about installed libraries. Instead of separate commands for each library, a -single command is used. For example: - - pkg-config --cflags pcre - -The data is held in *.pc files that are installed in a directory called -/lib/pkgconfig. - - -Shared libraries ----------------- - -The default distribution builds PCRE as shared libraries and static libraries, -as long as the operating system supports shared libraries. Shared library -support relies on the "libtool" script which is built as part of the -"configure" process. - -The libtool script is used to compile and link both shared and static -libraries. They are placed in a subdirectory called .libs when they are newly -built. The programs pcretest and pcregrep are built to use these uninstalled -libraries (by means of wrapper scripts in the case of shared libraries). When -you use "make install" to install shared libraries, pcregrep and pcretest are -automatically re-built to use the newly installed shared libraries before being -installed themselves. However, the versions left in the build directory still -use the uninstalled libraries. - -To build PCRE using static libraries only you must use --disable-shared when -configuring it. For example: - -./configure --prefix=/usr/gnu --disable-shared - -Then run "make" in the usual way. Similarly, you can use --disable-static to -build only shared libraries. - - -Cross-compiling using autotools -------------------------------- - -You can specify CC and CFLAGS in the normal way to the "configure" command, in -order to cross-compile PCRE for some other host. However, you should NOT -specify --enable-rebuild-chartables, because if you do, the dftables.c source -file is compiled and run on the local host, in order to generate the inbuilt -character tables (the pcre_chartables.c file). This will probably not work, -because dftables.c needs to be compiled with the local compiler, not the cross -compiler. - -When --enable-rebuild-chartables is not specified, pcre_chartables.c is created -by making a copy of pcre_chartables.c.dist, which is a default set of tables -that assumes ASCII code. Cross-compiling with the default tables should not be -a problem. - -If you need to modify the character tables when cross-compiling, you should -move pcre_chartables.c.dist out of the way, then compile dftables.c by hand and -run it on the local host to make a new version of pcre_chartables.c.dist. -Then when you cross-compile PCRE this new version of the tables will be used. - - -Using HP's ANSI C++ compiler (aCC) ----------------------------------- - -Unless C++ support is disabled by specifying the "--disable-cpp" option of the -"configure" script, you must include the "-AA" option in the CXXFLAGS -environment variable in order for the C++ components to compile correctly. - -Also, note that the aCC compiler on PA-RISC platforms may have a defect whereby -needed libraries fail to get included when specifying the "-AA" compiler -option. If you experience unresolved symbols when linking the C++ programs, -use the workaround of specifying the following environment variable prior to -running the "configure" script: - - CXXLDFLAGS="-lstd_v2 -lCsup_v2" - - -Compiling in Tru64 using native compilers ------------------------------------------ - -The following error may occur when compiling with native compilers in the Tru64 -operating system: - - CXX libpcrecpp_la-pcrecpp.lo -cxx: Error: /usr/lib/cmplrs/cxx/V7.1-006/include/cxx/iosfwd, line 58: #error - directive: "cannot include iosfwd -- define __USE_STD_IOSTREAM to - override default - see section 7.1.2 of the C++ Using Guide" -#error "cannot include iosfwd -- define __USE_STD_IOSTREAM to override default -- see section 7.1.2 of the C++ Using Guide" - -This may be followed by other errors, complaining that 'namespace "std" has no -member'. The solution to this is to add the line - -#define __USE_STD_IOSTREAM 1 - -to the config.h file. - - -Using Sun's compilers for Solaris ---------------------------------- - -A user reports that the following configurations work on Solaris 9 sparcv9 and -Solaris 9 x86 (32-bit): - - Solaris 9 sparcv9: ./configure --disable-cpp CC=/bin/cc CFLAGS="-m64 -g" - Solaris 9 x86: ./configure --disable-cpp CC=/bin/cc CFLAGS="-g" - - -Using PCRE from MySQL ---------------------- - -On systems where both PCRE and MySQL are installed, it is possible to make use -of PCRE from within MySQL, as an alternative to the built-in pattern matching. -There is a web page that tells you how to do this: - - http://www.mysqludf.org/lib_mysqludf_preg/index.php - - -Making new tarballs -------------------- - -The command "make dist" creates three PCRE tarballs, in tar.gz, tar.bz2, and -zip formats. The command "make distcheck" does the same, but then does a trial -build of the new distribution to ensure that it works. - -If you have modified any of the man page sources in the doc directory, you -should first run the PrepareRelease script before making a distribution. This -script creates the .txt and HTML forms of the documentation from the man pages. - - -Testing PCRE ------------- - -To test the basic PCRE library on a Unix-like system, run the RunTest script. -There is another script called RunGrepTest that tests the options of the -pcregrep command. If the C++ wrapper library is built, three test programs -called pcrecpp_unittest, pcre_scanner_unittest, and pcre_stringpiece_unittest -are also built. When JIT support is enabled, another test program called -pcre_jit_test is built. - -Both the scripts and all the program tests are run if you obey "make check" or -"make test". For other environments, see the instructions in -NON-AUTOTOOLS-BUILD. - -The RunTest script runs the pcretest test program (which is documented in its -own man page) on each of the relevant testinput files in the testdata -directory, and compares the output with the contents of the corresponding -testoutput files. RunTest uses a file called testtry to hold the main output -from pcretest. Other files whose names begin with "test" are used as working -files in some tests. - -Some tests are relevant only when certain build-time options were selected. For -example, the tests for UTF-8/16/32 support are run only if --enable-utf was -used. RunTest outputs a comment when it skips a test. - -Many of the tests that are not skipped are run up to three times. The second -run forces pcre_study() to be called for all patterns except for a few in some -tests that are marked "never study" (see the pcretest program for how this is -done). If JIT support is available, the non-DFA tests are run a third time, -this time with a forced pcre_study() with the PCRE_STUDY_JIT_COMPILE option. -This testing can be suppressed by putting "nojit" on the RunTest command line. - -The entire set of tests is run once for each of the 8-bit, 16-bit and 32-bit -libraries that are enabled. If you want to run just one set of tests, call -RunTest with either the -8, -16 or -32 option. - -If valgrind is installed, you can run the tests under it by putting "valgrind" -on the RunTest command line. To run pcretest on just one or more specific test -files, give their numbers as arguments to RunTest, for example: - - RunTest 2 7 11 - -You can also specify ranges of tests such as 3-6 or 3- (meaning 3 to the -end), or a number preceded by ~ to exclude a test. For example: - - Runtest 3-15 ~10 - -This runs tests 3 to 15, excluding test 10, and just ~13 runs all the tests -except test 13. Whatever order the arguments are in, the tests are always run -in numerical order. - -You can also call RunTest with the single argument "list" to cause it to output -a list of tests. - -The first test file can be fed directly into the perltest.pl script to check -that Perl gives the same results. The only difference you should see is in the -first few lines, where the Perl version is given instead of the PCRE version. - -The second set of tests check pcre_fullinfo(), pcre_study(), -pcre_copy_substring(), pcre_get_substring(), pcre_get_substring_list(), error -detection, and run-time flags that are specific to PCRE, as well as the POSIX -wrapper API. It also uses the debugging flags to check some of the internals of -pcre_compile(). - -If you build PCRE with a locale setting that is not the standard C locale, the -character tables may be different (see next paragraph). In some cases, this may -cause failures in the second set of tests. For example, in a locale where the -isprint() function yields TRUE for characters in the range 128-255, the use of -[:isascii:] inside a character class defines a different set of characters, and -this shows up in this test as a difference in the compiled code, which is being -listed for checking. Where the comparison test output contains [\x00-\x7f] the -test will contain [\x00-\xff], and similarly in some other cases. This is not a -bug in PCRE. - -The third set of tests checks pcre_maketables(), the facility for building a -set of character tables for a specific locale and using them instead of the -default tables. The tests make use of the "fr_FR" (French) locale. Before -running the test, the script checks for the presence of this locale by running -the "locale" command. If that command fails, or if it doesn't include "fr_FR" -in the list of available locales, the third test cannot be run, and a comment -is output to say why. If running this test produces instances of the error - - ** Failed to set locale "fr_FR" - -in the comparison output, it means that locale is not available on your system, -despite being listed by "locale". This does not mean that PCRE is broken. - -[If you are trying to run this test on Windows, you may be able to get it to -work by changing "fr_FR" to "french" everywhere it occurs. Alternatively, use -RunTest.bat. The version of RunTest.bat included with PCRE 7.4 and above uses -Windows versions of test 2. More info on using RunTest.bat is included in the -document entitled NON-UNIX-USE.] - -The fourth and fifth tests check the UTF-8/16/32 support and error handling and -internal UTF features of PCRE that are not relevant to Perl, respectively. The -sixth and seventh tests do the same for Unicode character properties support. - -The eighth, ninth, and tenth tests check the pcre_dfa_exec() alternative -matching function, in non-UTF-8/16/32 mode, UTF-8/16/32 mode, and UTF-8/16/32 -mode with Unicode property support, respectively. - -The eleventh test checks some internal offsets and code size features; it is -run only when the default "link size" of 2 is set (in other cases the sizes -change) and when Unicode property support is enabled. - -The twelfth test is run only when JIT support is available, and the thirteenth -test is run only when JIT support is not available. They test some JIT-specific -features such as information output from pcretest about JIT compilation. - -The fourteenth, fifteenth, and sixteenth tests are run only in 8-bit mode, and -the seventeenth, eighteenth, and nineteenth tests are run only in 16/32-bit -mode. These are tests that generate different output in the two modes. They are -for general cases, UTF-8/16/32 support, and Unicode property support, -respectively. - -The twentieth test is run only in 16/32-bit mode. It tests some specific -16/32-bit features of the DFA matching engine. - -The twenty-first and twenty-second tests are run only in 16/32-bit mode, when -the link size is set to 2 for the 16-bit library. They test reloading -pre-compiled patterns. - -The twenty-third and twenty-fourth tests are run only in 16-bit mode. They are -for general cases, and UTF-16 support, respectively. - -The twenty-fifth and twenty-sixth tests are run only in 32-bit mode. They are -for general cases, and UTF-32 support, respectively. - - -Character tables ----------------- - -For speed, PCRE uses four tables for manipulating and identifying characters -whose code point values are less than 256. The final argument of the -pcre_compile() function is a pointer to a block of memory containing the -concatenated tables. A call to pcre_maketables() can be used to generate a set -of tables in the current locale. If the final argument for pcre_compile() is -passed as NULL, a set of default tables that is built into the binary is used. - -The source file called pcre_chartables.c contains the default set of tables. By -default, this is created as a copy of pcre_chartables.c.dist, which contains -tables for ASCII coding. However, if --enable-rebuild-chartables is specified -for ./configure, a different version of pcre_chartables.c is built by the -program dftables (compiled from dftables.c), which uses the ANSI C character -handling functions such as isalnum(), isalpha(), isupper(), islower(), etc. to -build the table sources. This means that the default C locale which is set for -your system will control the contents of these default tables. You can change -the default tables by editing pcre_chartables.c and then re-building PCRE. If -you do this, you should take care to ensure that the file does not get -automatically re-generated. The best way to do this is to move -pcre_chartables.c.dist out of the way and replace it with your customized -tables. - -When the dftables program is run as a result of --enable-rebuild-chartables, -it uses the default C locale that is set on your system. It does not pay -attention to the LC_xxx environment variables. In other words, it uses the -system's default locale rather than whatever the compiling user happens to have -set. If you really do want to build a source set of character tables in a -locale that is specified by the LC_xxx variables, you can run the dftables -program by hand with the -L option. For example: - - ./dftables -L pcre_chartables.c.special - -The first two 256-byte tables provide lower casing and case flipping functions, -respectively. The next table consists of three 32-byte bit maps which identify -digits, "word" characters, and white space, respectively. These are used when -building 32-byte bit maps that represent character classes for code points less -than 256. - -The final 256-byte table has bits indicating various character types, as -follows: - - 1 white space character - 2 letter - 4 decimal digit - 8 hexadecimal digit - 16 alphanumeric or '_' - 128 regular expression metacharacter or binary zero - -You should not alter the set of characters that contain the 128 bit, as that -will cause PCRE to malfunction. - - -File manifest -------------- - -The distribution should contain the files listed below. Where a file name is -given as pcre[16|32]_xxx it means that there are three files, one with the name -pcre_xxx, one with the name pcre16_xx, and a third with the name pcre32_xxx. - -(A) Source files of the PCRE library functions and their headers: - - dftables.c auxiliary program for building pcre_chartables.c - when --enable-rebuild-chartables is specified - - pcre_chartables.c.dist a default set of character tables that assume ASCII - coding; used, unless --enable-rebuild-chartables is - specified, by copying to pcre[16]_chartables.c - - pcreposix.c ) - pcre[16|32]_byte_order.c ) - pcre[16|32]_compile.c ) - pcre[16|32]_config.c ) - pcre[16|32]_dfa_exec.c ) - pcre[16|32]_exec.c ) - pcre[16|32]_fullinfo.c ) - pcre[16|32]_get.c ) sources for the functions in the library, - pcre[16|32]_globals.c ) and some internal functions that they use - pcre[16|32]_jit_compile.c ) - pcre[16|32]_maketables.c ) - pcre[16|32]_newline.c ) - pcre[16|32]_refcount.c ) - pcre[16|32]_string_utils.c ) - pcre[16|32]_study.c ) - pcre[16|32]_tables.c ) - pcre[16|32]_ucd.c ) - pcre[16|32]_version.c ) - pcre[16|32]_xclass.c ) - pcre_ord2utf8.c ) - pcre_valid_utf8.c ) - pcre16_ord2utf16.c ) - pcre16_utf16_utils.c ) - pcre16_valid_utf16.c ) - pcre32_utf32_utils.c ) - pcre32_valid_utf32.c ) - - pcre[16|32]_printint.c ) debugging function that is used by pcretest, - ) and can also be #included in pcre_compile() - - pcre.h.in template for pcre.h when built by "configure" - pcreposix.h header for the external POSIX wrapper API - pcre_internal.h header for internal use - sljit/* 16 files that make up the JIT compiler - ucp.h header for Unicode property handling - - config.h.in template for config.h, which is built by "configure" - - pcrecpp.h public header file for the C++ wrapper - pcrecpparg.h.in template for another C++ header file - pcre_scanner.h public header file for C++ scanner functions - pcrecpp.cc ) - pcre_scanner.cc ) source for the C++ wrapper library - - pcre_stringpiece.h.in template for pcre_stringpiece.h, the header for the - C++ stringpiece functions - pcre_stringpiece.cc source for the C++ stringpiece functions - -(B) Source files for programs that use PCRE: - - pcredemo.c simple demonstration of coding calls to PCRE - pcregrep.c source of a grep utility that uses PCRE - pcretest.c comprehensive test program - -(C) Auxiliary files: - - 132html script to turn "man" pages into HTML - AUTHORS information about the author of PCRE - ChangeLog log of changes to the code - CleanTxt script to clean nroff output for txt man pages - Detrail script to remove trailing spaces - HACKING some notes about the internals of PCRE - INSTALL generic installation instructions - LICENCE conditions for the use of PCRE - COPYING the same, using GNU's standard name - Makefile.in ) template for Unix Makefile, which is built by - ) "configure" - Makefile.am ) the automake input that was used to create - ) Makefile.in - NEWS important changes in this release - NON-UNIX-USE the previous name for NON-AUTOTOOLS-BUILD - NON-AUTOTOOLS-BUILD notes on building PCRE without using autotools - PrepareRelease script to make preparations for "make dist" - README this file - RunTest a Unix shell script for running tests - RunGrepTest a Unix shell script for pcregrep tests - aclocal.m4 m4 macros (generated by "aclocal") - config.guess ) files used by libtool, - config.sub ) used only when building a shared library - configure a configuring shell script (built by autoconf) - configure.ac ) the autoconf input that was used to build - ) "configure" and config.h - depcomp ) script to find program dependencies, generated by - ) automake - doc/*.3 man page sources for PCRE - doc/*.1 man page sources for pcregrep and pcretest - doc/index.html.src the base HTML page - doc/html/* HTML documentation - doc/pcre.txt plain text version of the man pages - doc/pcretest.txt plain text documentation of test program - doc/perltest.txt plain text documentation of Perl test program - install-sh a shell script for installing files - libpcre16.pc.in template for libpcre16.pc for pkg-config - libpcre32.pc.in template for libpcre32.pc for pkg-config - libpcre.pc.in template for libpcre.pc for pkg-config - libpcreposix.pc.in template for libpcreposix.pc for pkg-config - libpcrecpp.pc.in template for libpcrecpp.pc for pkg-config - ltmain.sh file used to build a libtool script - missing ) common stub for a few missing GNU programs while - ) installing, generated by automake - mkinstalldirs script for making install directories - perltest.pl Perl test program - pcre-config.in source of script which retains PCRE information - pcre_jit_test.c test program for the JIT compiler - pcrecpp_unittest.cc ) - pcre_scanner_unittest.cc ) test programs for the C++ wrapper - pcre_stringpiece_unittest.cc ) - testdata/testinput* test data for main library tests - testdata/testoutput* expected test results - testdata/grep* input and output for pcregrep tests - testdata/* other supporting test files - -(D) Auxiliary files for cmake support - - cmake/COPYING-CMAKE-SCRIPTS - cmake/FindPackageHandleStandardArgs.cmake - cmake/FindEditline.cmake - cmake/FindReadline.cmake - CMakeLists.txt - config-cmake.h.in - -(E) Auxiliary files for VPASCAL - - makevp.bat - makevp_c.txt - makevp_l.txt - pcregexp.pas - -(F) Auxiliary files for building PCRE "by hand" - - pcre.h.generic ) a version of the public PCRE header file - ) for use in non-"configure" environments - config.h.generic ) a version of config.h for use in non-"configure" - ) environments - -(F) Miscellaneous - - RunTest.bat a script for running tests under Windows - -Philip Hazel -Email local part: ph10 -Email domain: cam.ac.uk -Last updated: 10 February 2015 diff --git a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/index.html b/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/index.html deleted file mode 100644 index 352c55df..00000000 --- a/client/3rd/ShadowSocks/ShadowSocks/pcre/armv7s/share/doc/pcre/html/index.html +++ /dev/null @@ -1,185 +0,0 @@ - - - -PCRE specification - - -

    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

    FlZgMg4D z*ld!3w(W^v?9^0|OH7V<3KBrenJHjs&(iR04ogw-@4rf#e_S!b#Zg?yGLwl6F~Z44 z8S%N=t2E4lJ`J#BPg;orpMB%CMO=A5jWkzW4N zFoZFiCowzW2gU4=A09JPTkZH@H|;I*-?@}3A;tQEH#)Vtvd`p} z64TrhxUk&Q*T2D}K8I0seBJ(TXMGOG8S2w7QI2hz;~OWpm+RBtbDzgzT z_O>t$ggGN8^4I=xeWyuDPx@he=NyyiG@A-cOii~W<8SwwVf_Fk+Hdg>h2mFkqH%zE zI|i6sxONec^pD>faFZ6g^Cd{=RncyopwqMI)uXQlm!{{ z+MOs{s2V%~7|rgn?}uQN(@0>d+x;}&`3@H7I4;q=nN>W5H7}l*b=Dj#^yJrvvh9fviXdZZ)5P1+UX^2lD9ow#y5c?#Cct2xr zveh~K1AUp!aww*3rU%2m9`MC)Upb$uSBmQY*xW;TF{fX$jlj$P*p@!by`)jUBg*0id!%8?MFiTBRq`>D((OKg*3KAn3l~&3)c3v7=Cbk z^71x-&z;H&qf!-${ivfaIu;a)yn~(QiZzdgf{%zyD)O?AJu4JgYrva6j-!dIR$_e$ zwc$ox7u#yndy3cM|S*gkT*9}QvKeNtu{y_tM-fMxc0wv)K4S)MfCW$cxG|8`Q@ zNRv?(?QOsvv9uhydf9CAlAdMvA}+h#yyBSm9TuV59uxDRPDoX;IfZQ61mrozvJj%agnft@^q$lh_R{`kpel;@);9IV7hF=!cv^ z@tldD=4RP-?C|&)wh*c#8~9(x%MFGU&AvJIys1xaW@BBm33tMn6479;r)EY#x7^ZU zej*rL(P7@;I=PKu_%G^UNE$@l7!xh?Ue}z+KQbGH!1uV&2W#O?>Cc+DkJ`MCAvqqm z!DBXf;yqe<&NFACDR}AEqxJ-Za-tN)$gWK1MRZPno{UJg{Z=x7`%^vn$(5_;pv0U= zM?9zH<#ev%5l6JV7u& zV+|1Q%)S}wQO$3T>RWZ4dL943Hj}2U+SmVsiV6vSQGQ{ZV#|?Qw4|u)Bx8Ak@`}px>hgl}k|1JO zRa{;+A$al7!U;nQFNIYVCHX6g3WH+a$Y5b{RY87bVR6|KYjHt&Sv8_pl^C#-Lax;b zLAyMTd8uNSTUE52_6LU*)m9W0RKu#Fg~J0=OzP$^af6F1^OuyunEYzQB3M>l9jvOU zs3@-lZ=87}ZA>k-ysTt}<*f=LZ-P~&`6VUD@M>5XEG;f8F0CoG$r7Aoe_45xwoi{jH`WUvYuNTZ7VmK2niFDotz2+*$L#l-~@fyMd7CA8dd#CuibS5>9( zs#;cDQIQbgg5rv$$laRa>Y|e3s%oF%1?8m`m11F>Pq3&KnM=c~0*lLQ$_j(?Og)&D zUs~k)saIuDS<#a6>S8h8kyPKR;w5GI)isqxx%nka$}5YjmzGu~sBp3?i2N+Bs4gxD z7Sy2P?T)jeyco4>ad~BFesv;WX@0F!EP^OwORAS9gj!u$Q-&l*fm&LcUy$HkR8~;A zqM{l_p$J7G83Plk5aOlzRn=@HiV7-=suT3sB7j&eOX8hhQc>oSsVQ4lR(_?2f+!*b zqy``@k%VPShO-tH6<>j{&z?ME##xi6OwXM+W#0K{jq*{eD=Lv0MZv`=%8T*~mbuLH zXUxmZo;hd!g}HOHXJwx=d;YY^^QX<8l{;;uv%gvoxQ{9_Lelo~yW!jfF>HuwZF^ zF)D_K6!84^BmrzSoqP&!^w`ou4ri=buP~HxJBZ{u<9mQO&FtBcQj3c!kx&zYNU+c; z!7I_FkQzec794fbDM1-*cq*uyRLNq7@!FN>mWoia%}`IqYjGo%D^0>x2lH)tWv9W4 zo^hkLR61OC2OK2J(Cp%3(%IJyh!}1z55mt>3 zcmu^{7{*p%T*TDY@m7KMni%=y3JEPU%7-0~v15r#OXHg>BW1Tx>@Ij6HcDUTZ6PsG zbgM^vs$)QtYsa~{2?LsV-uyz2)PpI|9xDd4i<3{b}&0v>f*?6rKcyLcZ|qDRJm*5Ul*f&-7U)!K&b;ZEpKB~QQ(zxH zZ!-FDw^Fzn?HNs&S^Em7B~kkl8BDGvke&RlC_0(T-~(X<+jH{$wlSk+}Sh_ z5~3q%y$Z{Vs>)8NmIlR)+x#`zH8rJ`P7Nq4x)M#DjIwno?JdeW8kbJdsT)azxJ2jq zJS)Gk8X5m-SLYPL1b;r1EBc%f{&+2|EyZ^&q&ce&ACSWk4q8$AfX3(T{Sn*t2U!o#=!n*O^E9d z(6Jpd5WXA_QSj0BI}n(>U&al+r|gTzMCL=jsrU}&xo&)>2stSqvpP%pv^`JCcL(+H zB`^4ByPlM9J@~?WB7~2&?@9T#gKrle8S|sVxvvA$;1eBn@{G_`=Gk{Yz55Lh$X{1HPNVSMj2RtNl$< zeZK}@{ma6q{Z3N8ZQ#r76h7^LlJfQK3;SLXK5dSY@{I)FoL7ZU`=g|M^TAiEe7g(x z8t`SkF8Z{8N~-T+@U2lk?WdCRZ2@1C@@apSlzrDl&cc(bt|9tXG!(l0lr=Dh(7JtlJczwU-P@)AMSSWjeAe{w4Y0=Zy+1> z_k~aUyQF+$z&H4}!l(USQoc*T*QI>g|0U&H4ZdMpMW6PAN%w>qi(Dz8UO9**Qx&xK=Qw(*b1Br`Y(Xge;sf* z@Je;h0@A)OuM7k*^ayPSjsboEq@Fhwe*_!?`gd1IIJ z_zA{~r2i2}`rC>@r5~#9eHAam_>=q>0LedHaW%%Rq^|^$zFcuEa5U(L11|;6!T6Va z(}3hVU9k#-Dbh=Tq~|Fbw8IXMUD2`S7N$NgUu|JUM+gsgV6pP&Z zKotE@6gUPLR(iGKXdvZIQuncn_biq0e*|RsHz+OuQcsS$Cn*jCvc7zac?a$O5=gmE z6{iA+k-j((7z_L-kp6#GtOZhTxw?xK4_Epib*CwQRul-F0RD|Y%54Br-&2ZffR})N zmHJmH9c##jZx)c{=nNq38L#w^;+KV@cPEf~w=2G)^cU6rtl~@{Obd-H5V@g1${ng0 z03Hwjzbq2}ZXo^NRa^kfg?|>1@fol5km4u#fdHngp)Mf(Ujg=p{07B|N*|-{VTwER zgg*u({~r|Fl>W53A5pv!Xv!}TRWbBe7-AzPT4y=ZM5I7EasM7aUTsKerp90eVF(Bpd zSF8gL0euH59sNH6(*Jjg*8;0RUj`fxT&(nq6#spm$o(BixsMdDSNhfJE>|3_^pWZg zDqcEA^qdc*o^usX1~S|c>OM;G+u727o&co(u|Ucltk^J1^sNSxUaL4Ccry4ifte^@ zhXEPy1J%F3;*Oc3_b))of1vn05Lp>o0i;}|(iba!K11j`fRyW2d_?I#Rrl?Rif&<(*uE0_&)<=`M3*6du|0X+=${7rB70Krs9@!MgJ|p0gzh( zH1PpaezD@gK&J2h>fTH7lWBoKIp~i8DfbYNa(63cDt)-R`8o*tf0QHX{ydO!zXp=N zRxu1@cvq{tTyZuKO<(8;Amt8H`T)h)IU=_mNPSxsTY<-czfS$bO0QO&4=jWKRN$$= zGnGDCu@{i`d~>$w-Kp3G%mV#EApL)$^xG7d1CIs$EcHKK>7x|)2Qu7$XG?tk4y4^5 zDYgNr_t)xPt5^>_2J{m3U!wGj6(<52?m+eLuk^2{ivACP47VLf{m(1?mx{LnnO?6;B6J|9^GTgAbs}<)1sW%hIaqo#rKU(o` zXNg=7us70ao8o%l>EJI1GXE}D`elkEfeh~ibsw(yH5zf|-@QPFcNefX^xmX+F_3cS ztNUEV5x@zczYAf;?{y&MIuzFcDR;ZNZ&X|YJO=bhK+26(`f$ZB&J_A*Ko|J>U~}DX(07Iq3#D1R{^g9y%tylJRC^9 zgVaAwaVrv?^tXW2`?BKGK+2~B#{l~&{Xdg5d|(KFR{|+tq4YwONcX3lQ0!zYS!2{tS?OPvRft9#p&*2$9eVb(bnm1zrRCRulr-`zDZbFDXt0 zQtniBk5KFdMAsZ@L7@u*R{(2)%hi1}5UN9ifz&rp@w2hQ|1pr^{T@jFHxwTNqKOUN z3q(^L$_7%;8R~zE;$c8EsiFOVXaYmuLfLHKcEt|hEVv&A(*B53y!sF1~>6M)orxZ=N068cUc>Dv{5qx3d) zKcRS|(yv$d6^dV>642g%0jZ})@de;S&~F5u2h0JIZ;JY#rnnz)4(RWX6uckE_}vYp zz6QmIP89lmK+>BOR|1a)f2R5mSNf5Pza1fRT|mlhRGbAw5}kgm`X8?Jbj5FmOMNN< z(jM$SHu4uLjt3qE`XJzuz|V%6=OUq3frrEWGvHysFz`^|#lXS9Q-Oy7j|5Wh!9d!z zx8mPV5c*$$q<^5e8CV4VdFnqy=~;@Iio+H61)}JO`l@@^@uF`Vkm0_kZr;$$a2^06 zD?+@OnE8~g^zn*^0`ow>b!Z@ftPhO^hJm|=h`xUSspk{LLLkGxK;6?7M*|toOUH@a zdLZRm6f=R;dxH8Osr3C7w;wC(0Jj4fkDGy%4=bJzJQ(zuK>DAp^a+Y1lzyDL4^eyv zof`SK0DD7UyJA%7*Q@&q#l^to;2#4l27ZRdlkz=4%5PJA23QUH6gKL40LXBD3}iUG1&26A>66r*srWt$C;8t5lJ6zOTBR>ncah?& zM@TpwK+3HHQtnB`CZ$K!y;AWb6#6QL1Ekz$Am!F8-m3I^bzh^nkJ9_9dlxDV7P`m&*2=s~SKSt@p6u(AgI}rXK0x7>0NPSxre+oPR^oaUjqx1^JDZu^Ve}ei4 zl|D%EFN5*y3I4AEsedDo`dbwnfa#!@1IGcED*Y10lY#qz{tX%d`u`h9`IzE*;J%rU@=nK{VJf&wVo{hprxif*3 z8?E>v5`7HlZ9vkWP+SZof3CXcDQ-t5kp2fC`QK8U4;%yfbakJpcp#Ac1J%t;q};>E zEb`wAr2AII0wDP>QTH6hjmSLGHvq~1l;WLAzeU~GE6!8;40UHI9-;Ju)IC5kip-}y zVIcKaE9L+h?qqe3ReXnq0e_DI*>2VXDPInxe1YObAmzuXdzj*E=4Na+`=d$!_8ApSyMr%C+(38cP1E8YggU+8@N8xK5B>Dh`yfd!x+0K{MDpZ&$I zPl43)q2iUmMev`l{!^9C8-vJqG%z3j2LnU+`=Fob;WH`vZ&sYA^cm{TQaldGeEj!b z8a~j3ulO6KKd0_rC|<7g0(D=Yc$(5P)jdRUAduyxkGj9?E8+YB$oT&h$aMO#(r-~L z12UcF0-0~qm42pTb04AK1Ek%JioD%%3HUEi|2ayZsyGsOHT?Nb%d3EU1DS-|p`--( z4saRpMIe$W^b`=Lhnj(x18)VwgwVA>h=xjm_zUq)%N4-sz+OP!4USK!3yw-4U#wOL ztO7DVB|xwol&5$*nejIdI0~2zJOvm=;9%*Orf^J74sCc6oZNZ z#co8#$SX2^=?*LADP}1K6$6Uh67PQPip`2)#XQ9<#h_w9u^WMz@D-aC!-{!|S&Bi$ zfMPe&3qSj{D>f^J74sCc6oZNYkwZLYATb_6dhQ2B_IWPr0o`_gXJ51@bld%$KZpHv zvk>#sjK+a(yI=DYb=&=!+2EnS-H-VK!lm2pzg&YtN4MQ?8CJL5U)c^n`rG}K?^}CW zaPav6U;5kqlIxJabld%rr>NWRhy01vccBpv>{7Sg?|7=l&+czLO#SVC#=A5;yMJ+- z`rG}Aov2*Ko;=ad{StKB{eG7!zun)*>ko~+sEqvlUfp*8-oYww_v?KJp8rGJ+rYhzel1gg=Y$qT}5OlMW(YkWMFf6h79Nz8zcu({yj@TCGPFlR&lM6) zS<(3Q`n}5V)2@$OY3iekfbjbij2!cq%{SMn@Y}AZESmUc7%l!DF!(l^?@LVm+x2z7 z0lpOSk4S3RB;ez>U5|7i+DU%f-%;Sd_gVLv#P|Jx@5k?ieEZ)Af*$|-+llzKkZ(W! zbd<;ceir5Rzl)&P|2{WCT--Len=`T-wUk85p@h2zfi5?P`hJzbcWQ#ZuP5+zC*=D*iSN4;_48Z;9`8B#>Axir|J?+A$0XqKT6aG`k6`h? zk4@0~LV|xkN$~6V1itkNc+Vx$FHd}*o}h1IBL4-6^sh?ro6eX|{|gEFKaeQzj}q{2 zOTgbhQJxPZ_5w+xw$QnCF=op#fT+p6b6u(i!>i1A@WJ9J#E1;H&! zIF*4LW)-b&`ZT*_I?a|C>}K?dnkm-gwMUf1w>Wktf!M8g-uW3(8U-c0D6!eN^U}+s zC}m8|D9y#qlF8)pFijUbUm(h$ku|oZMoE-}eMq8v?mmKjmQiMf@Aj~E@{EosRzc4c zt9i{nvQ8c{fbEf0xogM!RlfF;^_Q>fylnjyJgUb@4~4-$!$)LDQOeFU$Y>@E+f$k1N=TusZC?4Zto! za`;<=J);xRVb4A2)RS)_gd`f<)Yo>(0aCgp-7B<|sn&K&hu>}fbs@~-PG*sVN3bKgD zP_Y@^i0G7x>%NlE%olcl>z6GEi57v(&6 z?UD(J6Zx^3RcVzS=%NgM0cBTw1U*K{h704ba0;3nlG&!mf@Q3PtJ9~DvNYdCZk$L7Ih zy41_fq{+IZJ5a-XkiBk;z1N5s9Pwyh+O>Ab1?Uh?qKRlHc45K=IQs1hD32VvmyDMU z(J0?VUQU!c830{~B~eX?2e~RUr-nFHA|?J&0WrJq!Sy(TFHV)5bCn1aRhQH8I8WQ3wme`hL0#N_)&b60Z{K0k5LL4P`369C|@Hn>a zIf)9d+KOa$mE7vM#6cK5^Wc)p*3^)e=;#E;eThOR8;$w*7%%VhqPNzn6;ex02ct%Huz zy2vj{Ukmc{H*I-=a@(>o9NpS=eA*w!O`7mW9@Nd|WFG$bia&;TgAPoc*R^7PbtM9k zpX*@cXL*ONFXwve42v~#AOE-KnJ#(Oo@lyt0$CFW)8kar)UjEDH0jewjXQ5}Ulh(y z4>}%MA=ef0uxK3n92CX~!d}7>6vpw%8-x%U6z<_i?<13V@F3+e9Nj)v7u_FqBTkil zkWskw88>e1m+Hriz5QxP^|PQnsF~?*F)@8T4HU}MwSMFc5-F$e;|S^XdgWNq_OP6) zd|VWXGv`ZH3Hr(BuqIR6&Bf<5*yehWg$GDq-BX-tftmsONJR@%R@!}7B`6Z|<{ zm|F7l;6F1Vs+uJ}47|lL(;c{L`^Vr0F30Tnac0fEnGfIFm6~8D38? zf+O(_@9{cJzN6@aoGjpJ#%)7#@V1t12shbP`kA7*e!OElyHD~(@( zsBV-5y+cywpzR*12r6!+N3(*wj-k};!3e^Vn zBM;se@%9Pa#o9+ushkxHd{ma>KSD~~UKqja5M-gw+_5%QkRaL}O)ZFFq^r@BB~+HZ z_G(-NjR_j|oFKZQr7E|fwZB=gvAnEIlGxn{br?w~)(AuxFvvY~Uw~XJHUSAr8h2?Q zYuh71qIV?I4najx6>5hD@lG2`JG2?^n~fcUZDQkSjSuWfE#q@DYYi6*A0M%jtz%Iu zGuH6+iwg4+dtz}nQsB+qQ8Iv-O(^gHXxWH&*an(P4Mvs2_!~s z8*-s$ac@>$<^16+t{boXRT+&KX=_p5jv?s(Cg?wGz^YBav$3}RuPV%}{L+^9)Aj7@ zeYox`yw+UR;$dEoUb$9~!tgA^N%@XyT7yfJoJloBs|rS|6rQl?9HemSjxuFIA^zau zESr_O;S~y50~W!`b&MJ9HZF*kS|A~*@g#gZ6T1(^_)%!hxDcK^X}UI+`3+5mT8MA+P<>5!%aX{>KBU7>$c!C&3=ZBNXZRcL#nvI&+H znmNrt6o+?h+WX?-_Cjq18wGn2I3yo}pvu3jZ9ML2aqWwmsr3`JtcJ~~S6WU$w(C(P z2_Pq_O!6Md(Q+dSjkmLBjXv5iZ_Iqm#@j|z1-?NGfym`;;yuFqXOX5drSv)$ud-bO zCLqXT)yPH>%Zu*owzt5imfGi~iv$p4*2z5)OPSD|DPMTM)=RrjnKv?_5nG04uAjXdxiA9Xv#gDH9)WcgX*h(X zb!aKHT|WPAMtQ%5`p&wG{aVe}TQsIB-uCZ!_6~kk@gwYT;m1A}epT^})Mfm(>7y!s z+{7C^Rq-oXarjZ*@T-c?&XaJik>sx`o{Mq$Gv~Eb#gEge$L~%0sETi-B;$9MKC0ro zO#Jd0;^%AljORQJ{Xx&cF!fXOyo?oqF=Eo0da9Z35~Q2_qrx-wRWsd9r0E$=XX>qH zx;v4qaS+Hok%xg(wTa!nU3c?HBBo#Q=c`{k@n`lXgX7`HPi8&ryi4TPv`OU z6Q11Zy?eK*=bG?%&eKwp&eV6!bPpq4mr1vryyP!&p3xl01w?l7vyd;yz~cWk&&%b3Fy~vnz`sk;N~=6aN6 zgsnNF7f;fE3I4;<^~Jp19K~MD>y!v@1D;Hm!4tp5Y=-z`9b>8d;-~Pz=T&&3U%nXI zEM(n%7vk}6zqENan&?E4IDT6@_Na-s zcK7op-rCW%_{Kl?yCU&@ZsL21){9HOBJsT_@!f@#KK!>NzK>3%FD39Xub=;~iSJ#B z^u3Ar|44j4o=6`J?3$?$46M8LA7;ge-i8n@3o*eT#DW7!YUdve1RfyYY37xyz)NJ+ z%ze+Pt*3E*KQRFx4e*)>FFO0*mJj!Mo6Vy3(N0-PIf zmJ(+_0-J@8>{F{_Sajx{+Z zsN?ek7S0b~-1#fUv|Pv4HAesM?7RfW^MCAuOI~lkb5&0G@>%rHbD6I)7o{mC-o!mjyhugLSK~o>liP31RaW z{q{D0Q8-D<*UIiAeqA_dj_~Xc&H6g~&gbj!$F_xa?$2M)59Hv_0GyU)M&Xa?2Jt-` zD8_G^RksvE26%2h<4nBs?_&IY8-MS`-;4d3@t0QM%S5Bea$n=N?iX;E%ItYvRTFl`DQ;5m(vFMCJ7Npaw9J;5q&cxclcQp2^WB#fp>RbvB_Q+ z-6)=4%Ivvqd|-ftZB`}}U?4`3)vX9KjdV_UKj}_%jE0|A(0{suE_z z;8%Y^<(#6G(*j2&E(RRWIutH!1sT2n48wCn+(`!!_?l>hz-%yFc z%7p=pcNVt^WB{IUV!iRVo?zb8o*>m zTi8$i8N^6hS&jBL)ZxF#-0MUsMrWnI53T6jOv6UpN;VZ63oJGO7Om0W>)@A}P$qBkMCM(rS z);qY}!G;74qIMuUTHjU{q~*w!mc}`|ot2HcPl51=r*uYMgaqt-799AZa$p0vQO(mP zh`m*iAm5<$k)p7tL5mu0W9Zqzs1^1b36w`8gRNHssAa1*M4sf@4FALoU(pONLk24x z7JfJ2M<#_#-;Qc!;TJIHS2gDeCTBH2wbD(NKl~rE&{l!E-N;U4sTmp-KBn1M)Rv>OGi}e|ZL6y;HgR18`XI#7xNpAQ?oF5{bm@0tdt`)h&3X zSmlOD1WY~}9FIROY-5l_Y9Za^=OnKf45p*mrB`mDh8aQ?HjphRNF!pfaQFdOTB?#O zhUNrI&)kP}VH)T*Nd9*<2ftkM^UQP4W)?o^k$_jqvR<8Sn~|mtY0Rv?CJfU}CK$zMEWXkL$f{Z^R84Ryr#KxwYX|RlCAiZiKx(sCOCj7O+w0E(*NVc&ePiDA-)b_C!C;;| zlFTD3lq6yIJ}{5$uFf$t^J=KZZ=Z&!o}{9B(o`+gI1-jwR0DLA?b`9_ zvPDSX5tD2waScHNha{?HV7~Hu6!aV|=p^2&3;H0ekKv+iY&Hu`TWBu@aMUX8p`AH} zn0Q?QOw09PspO2cGam$|s32_FQQ8-Wju-7| zePOFGyA3U?gQH_g4Vd1`1Y7Flv0)nY!4gm5(H`U{OKf;Q2)k>#n|r_f|EUnY0gtYJEt)qsmzG?z;kLmO@p zs>2OJwNFsEg`@*MNsr|zZfPVPeqvXo1Uy$#lcjglRt`=omEjg)hbhl!c@CT42$FIk zHv(@$UMs&9LL5ksdCHmXJ_AVNb`O`UD_iFrB*5we)His$r}|DyeY^Zx*TVE*%eb&; z8^5e9E`!7lkE$#_fL^q9qFljzzS*ko?#lG-;NWjn`9q0XEm5%&O99`2LTqhy94&4m zN4LK}9_o;+Mh_T+5U2z%OH?yaV5kL)NVZJh3n(kz9{dQ@)~I@-KqCo8;=2unQcw>_ zOyah-xbhk}xgCvhY4jMCq_`Ti60PBT038!tsrMw>P~-sJU&dMw`@|<84rLXGhfKeB zK~#X4=+rUoqndUEY4a9i42JkF(kK*4|GKj zBO=S#^h)Tb#B2Gj9-Q(x3R91yu*tWvz>_|$r(%)T*Uy$^wpVDj7LzS9A;oP}xiC-ep#PI89^Aw<#koiDkyEN){v8f%DXUi^kArtyam z=L*GHiRM~7*CL_ZRNflOojP`f*^kq=t6TKDhJQkFhkvqE9vfQaQEb5j{z4I#vC46=b7H}zd>sk~s%fP8 zishD#shs#RHGyNhkOI%$#fCJh{oAm%4x_eCHSo@a&)P#=%u?|c=6qovx~8kgJ~+{XiB>oU*%Aroxa z#99%7kgy;x0f?q-^L_6E@jgvlEdr_A=RgKT8dA64a4<`@WUO!(09U82EiRv}7MJ-T zNW^7BLR`Q{YRmR4$Wa?s+(wj9+hB|+;zKbGLH^5x5p^?dTR__rYGmI%H1{=I1l|AB zx2ufQ9uV!nh%pX~$=t>->$iRK5j06t>V%#X^`)bZiQfPktFE1tWdB8Q%+P-^*4nkI z=DXUZCJ?yPt)!5a7*k3A^*^BSuS#JSg9!14I*gU(yG;AMro9wt_w0qvA7)Rbv6chUZa@YOoHHx-e~@c-CV1bKCfcJZo(m#j}=pOx$@j^k4stGQCHg zh8@rBtxN`4%^s%Wsold=ob3tE`h4PEtGNGw34^3(O^BEsP2=Hv)~{x^4{NrcnQT;O zqX^Om4fEuade(DMtW0t4A$+K3Emq%&i|G(1#idwm1Y#(#VPF?l6qspx?Fa@#wWM4;& zlSts!ckyfUKtj7(p*{Y`s5YzB-t_M%Z;>#bWTnyV_ee{7YWHmft0u7lwu}w1*aXWR zYwM@6KLz7P9h2?YbcT&r6WDZx@V3SubKw@t&&eMhpTu6$k^^4>(g2U3qP zbj|p(Wo3-DEyqrvtjD9>M4#|Tw6j(lt;H2d9jSxrUuA?8Z}_no26^dY=`CWwqK%L_oy@-`iH1oq4BV1;IP1e-m>DLw~e+V z{Sks2S8%_XQkJHjAQxqbFwC<&s<$0XQ=I!AK2&eVSstI>q6~>bM@^wT9hI`l@`(-1 zhUzWzu||e2mk+Tn+k+iWLkYm7frgTuRub;`1;~Cx$?km`v_u-}$!2jIErIC16;^_@ zto#^(Jf=W80K|&OjEc#McVdw`Hrjtn|MsQmBbHC>gFX%*RkD5W%|aP_P?>193#M?r zSzEG=52IuUtMFg-zh23>tx+W8hlupDR)YfH3EndNEJ9>o28#W=oyZH-YX)6asE=Vn zZrDJ=Um>AoYDDHtO2=Y)++E@NyW=&=zil7ke&cLM+3? zBhoh$Pkod4h&lmm`MB~S6z20PA(wluQkYi&wOAi*_7%5u zfjadGRm~oUCj&Kmnh#a8G>hTLEEbsqI%W#u>6ny9b&PpXk90zzV`PtM2U&AY%Lu}x zf|f}tCDJl0bj58XWIF*`6(c;$z!V|erVyUQ9FCQS8C8sR?Sw$= zt<|f))BeOvZdVs~C&0X4axlj#X6Zk?i3f0Rt(cO-Ff$ zfRBf?3Yy$Vt7Jbzv+tM6|DP*m4|kb1!tE$y@?o|)UjpwqTLWiIC=1)eGy#!!?O_Hp z6dm!iF%#knJC^hLAkD_LN#NHJ_%{^zJ=MTRY5!DEbsZB%aAgq~mNNYURjXvna=_?- z3Y2STBXHL!OB2z3U(sDrjqY6*U2X^~W@$A4i2s#V!aMR zzEa!Hx{VOjV*$i4-7zK1ZX)D`qeCjB81dKUHP_S7nCd@*kwziI>^Pb^oUY{^CxgXx zbiENsj-iow*qW&C-3v5_84qXQz1o%Y&{G_(ZPzO|)TSp2L(rNgb>p2LEX5Z-(z9+mtF9GkX74N(R z-js)z+nFl>s{iH4_u_&0G$ih%K(6W7DMF$8U-_m8sZ)8D2+>aaRul75#e4`9Ag+BV zpjs)O`;>c+%DbxMB2h_|Zog_&3{*k-6&afav;+Oi?Wg!iwCD)|MNs{1N+HkgVv2cT zK!s4L)oP~|;-crh0nj|axhLzhdI!qC(v<(+MEOMno$N1W(sydo+W$L&J(rN&|jLze;^qb;2q{MgYlEdJfi2byZW#$9HDSaX@llnOi6% zhwGmi{r&84)iW64)Kgxn#}AtwKf-jE+FK)5%lf#}H+7A%T2h>U5djohirWW3Lr_?a%3!k8 z?bxt@prD`)67zF6gCR61*g`P~9uh0j*3RO)z@XEVK}W$BaAbqxW6JNEmtD!`WtVMU zo*D&&GZeyeP%X&`F=F%b2|%jc2U|eQ((dKwOR<$Su_vDX)a8cS!3;DwpLb*#DK{#$QIV{&%Gk*P? zLm`ZF4mC&3>EVGGxl_Jh-}ak1y9;fN+qPS$)9bn(OxQRBk56`I{DtqebZd5y-XLq49I|UPDH@WprTJ!n)J5k&x zwYV2YJ!P{&E=sq9>3*;2I4%=4VTwoF3%+-uO(HHKA;^$~vLUAnHs3{sS=K+=6Nn15 zgY*t*2w!Dndm3P5dtvRhfI?hY zC=y=Z)s1aUXmHH?qBC{RAAkhX*i=jp5lIVaq1r`xytk8h`w^x11foT$0~7wB*t=4j zM55p*O;!|Hco<3IyMF|hU#HE(XJ9TOmLms@JbO5vu$`y{rCZ;Havx(q;|_+pdAwkZ zm~%sHaM8S{O#nz?<0?%&fOtbjfLWzlw_$K?n3w57wVubjXLYGsM?lnp1tXD@b1+WW zC(rxIVUDd zYKVmUSl#QnBp5%&Cmj)~AD<}~d7KTigOE{-fkx-QMuh-MW~PtJRJD@Kbx8_Lf`RZr zUMjD2NQ7HE(sNAl%;#J=C7j@GdH3T6GFTXI=eeM_@$=&Rm^DN4Sp6?>R8Xz6(^8@I zYuL-XO*jj#?jEloo!36rs2}H^sC2UZw?+5e-%Cum3g&#f<<*nab0oz+xOMY~Ae;}V zaCX9aiMkoL?o$wVp*hz(3Auj32v3-$IyjMI3oO$bQ#k8{)P~*0DXj|!MEjncmBU_C zVRJ#+YgC|B>#`df2d}bAEv&KwFF~RO)LGi9tM|2ROYcD0c$^IsZv)JPU$#xAFhCkv z6$r8&sNWkk&fCx-Y0rZRw83|dZI(q|k-EJ>Ibc6m8;;oTl~iVn)tv&2fPfs(!+>pb z)OkA!c8C`2epr+hIGcL~&*qNp76vpo875fpIT1MnI8&OdPDD!U`^W^l+Mtf$4^{BD z0DLr|XnRa>jb`j9+_eR{kI>u!a{F9=t*JWePkn)DU#@9C9yg6hshvi+5z*=LsbkZ& z|JVqBcp5yzAJuM%Jv_n1aX1rN$}*HcFG%`xUQk%zmNlCIBOCJ7J8eaDIyW?dG+TIz#8N|v zl{q%s$Wtk?8zL>J&!7Zr-DBDE>9Xc}Lnc>NTj0{ZTsO2U=Hf4ZTKytxpu!F(sRc;=)wmJ_mRxPq3{xOm09N8eUxuj zv^Z$daIeaHmr z9{jf>%n>5zoS=kZcQ+irl^Q-^{PK-^dbY%S^cF+9UDTaJ+kV9hL2h1%hbI%juh7AJx^}$~Di0`Y38t(<~gva?ozNzBpb+9!C0?EpJNY4}pS)s&8gr$tOEaZ{;AW#putb{zA);OuaO$Qb!ohe4_e}D&@*RGMMInJp z^9Ug!WKn4Xy#vX^qW71K>3|zLT!tTba0wcVgrNwTW5(-8*+iRQ=y~|gCJs**a=isO zCoFQitydM2Mx69$hHb)&<9P8MF8h|inGer?9Cv)TscX_r7S9{t16s-CzAO$}$f;#Nl zAK~7W@G>9~1PdvloK`E*&Tk_BgPQ+jz)C358w5m~R%`K%u3E)mK?PDGP#=9eHZzLH zKp2K)$S`kID%U##_w6j$Z?WU1F<(pUzgO&Mg8CTSye8|HrW)y7tqmL21|7e?K0UjD zeI~^Y8z9r#K1jzOjVBED_ENSF$j&)ti^kxA}>Y#h+`-Jp*Aq#Kw8M3)L7u5zI!0D>$d zGmB�v*NPayk`Tjqndq$_5ePj_)yy<%xPbD+Xf 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 RdK;zWwZ(b?wMXBY{yzqPZ&?5U diff --git a/client/3rd/ShadowSocks/ShadowSocks/mbedtls/bin/libmbedx509-arm64.a b/client/3rd/ShadowSocks/ShadowSocks/mbedtls/bin/libmbedx509-arm64.a deleted file mode 100644 index d3c4817a4476f3f9a1521873891bc68d88df95f4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 105240 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

  • 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